Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив через указатель, ECB 2010 
V
    Опции темы
Kirgston
Дата 26.9.2009, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: 2
Всего: 2



Всем доброго времени суток! Возник такой вот вопросик... собственно как я могу получить доступ через указатель? На Вижуале писал так например:
*(dictonary+tmp)
в итоге получал какбы dictonary[tmp]. Ну то есть доступ =)

А в РАДе когда пишу нечто подобное...

Код

UnicodeString dictonary,*dic;
dic=&dictonary;
*dic="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюяіїє1234567890!@#$%^&*()-_=+\|/?.,<>':{}[];~` ";

UnicodeString enc = Encode->Text;
UnicodeString dec;
int zsyv = StrToInt(Key->Text);
int tmp = 0;
for (int i = 1; i <= enc.Length(); i++) {
    tmp = dic->Pos(enc[i])-zsyv;
    while (tmp < 1)
        tmp += dic->Length();
    dec+=*(dic+tmp);
}

во время трассировки я вижу что в указателе (ну точнее в переменной на которую указывает указатель) dic есть текст. Что ,
tmp = dic->Pos(enc[i])-zsyv;
while (tmp < 1)
    tmp += dic->Length();

прекрасно работают. Но когда я пытаюсь добавить к dec добавить буквочку из dic то почему то 0 реакции... уже пробовал и через dec.Insert() - абсолютно 0 реакции. То есть какбы... dec попросту пуст... и никакие данные в него не попадали оО

Спасибо!

PM MAIL   Вверх
Anikmar
Дата 26.9.2009, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(Kirgston @  26.9.2009,  17:50 Найти цитируемый пост)
dec+=*(dic+tmp);

Но когда я пытаюсь добавить к dec добавить буквочку из dic 


Итак: 
dec - это объект UnicodeString
dic - это указатель на объект UnicodeString;
tmp - это некое число

Вы прибавляете к объекту dec некий объект по адресу dic+tmp. Не букву!

Надо тогда уж так:
dec += (*dic)[Tmp];

Круглые скобки может и не нужны, к стыду своему постоянно забываю приритеты операций индексирования и разыменования указателя.

Добавлено через 2 минуты и 7 секунд
Кстати, если вы объявите локальные переменные в таком порядке, то скорее всего получите AV
Код

UnicodeString enc = Encode->Text;
UnicodeString dec;
UnicodeString dictonary,*dic;

dic=&dictonary;
*dic="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюяіїє1234567890!@#$%^&*()-_=+\|/?.,<>':{}[];~` ";


PM MAIL ICQ   Вверх
Kirgston
Дата 26.9.2009, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: 2
Всего: 2



Цитата(Anikmar @  26.9.2009,  18:37 Найти цитируемый пост)
AV

Простите а что это?  smile 


Цитата(Anikmar @  26.9.2009,  18:37 Найти цитируемый пост)
Итак: dec - это объект UnicodeStringdic - это указатель на объект UnicodeString;tmp - это некое числоВы прибавляете к объекту dec некий объект по адресу dic+tmp. Не букву!Надо тогда уж так:dec += (*dic)[Tmp];

Да так и есть... только интересно то что в Вижуале оно то всё нормально оО . То есть да там была переменная типа char... но вроде принцип тот же... хотя думаю щас что такое сработает только с чаром =)

Просто в книге читал что именно *(dic+tmp) надо делать... ааа ну да... если не ошибаюсь то 1 переменная типа чар = 1 байт. И скажем dic+tmp указывает на начало масива со сдвигом в тмп байт а какраз и выходит какбудто это размерность =) а потом мы это всё разыменовываем и получаем прямой доступ =). А если делать это с Unicode\Ansi String то это уже не катит ибо там уже по другому идет размерность. 

Я правильно всё понял? 
Цитата(Anikmar @  26.9.2009,  18:37 Найти цитируемый пост)
Надо тогда уж так:dec += (*dic)[Tmp];Круглые скобки может и не нужны, к стыду своему постоянно забываю приритеты операций индексирования и разыменования указателя.

Какраз таки и нужны =) 

[BCC32 Error] Unit1.cpp(62): E2093 'operator*' not implemented in type 'UnicodeString' for arguments of the same type
  Full parser context
    Unit1.cpp(47): parsing: void _fastcall TForm1::Button2Click(TObject *)

Вот что мне иначе начинает орать =)

А в вашем примере 

dec += (*dic)[Tmp];

Выходит какбудто... мы разыменовываем указатель аля  (*dic) аналогично dictonary (указатель указывает на ету переменную) и тогда уже указываем по индексу тмп. Я всё правильно понял? 

Спасибо!
PM MAIL   Вверх
Anikmar
Дата 27.9.2009, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(Kirgston @  26.9.2009,  22:05 Найти цитируемый пост)
Простите а что это?   

Сокращение от Access violation - нарушение доступа к памяти

Цитата(Kirgston @  26.9.2009,  22:05 Найти цитируемый пост)
А если делать это с Unicode\Ansi String то это уже не катит ибо там уже по другому идет размерность. 

Не в размерности дело, а в типе переменных.

Если переменная - адрес, например:
char *Str;

то синтаксис Str[6] аналогичен *(Str + 6)

В Вашем случае:
UnicodeString dictonary,*dic

dic указывает на единственный объект. Нет там никакого массива и при попытке прибавить к указателю число - он смещается на tmp объектов, которых реально нет - т.е. указывает на случайный адрес.

В общем почитайте про математические операции с указателями, массивы и т.п.
PM MAIL ICQ   Вверх
Kirgston
Дата 27.9.2009, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: 2
Всего: 2



Цитата(Anikmar @  27.9.2009,  00:16 Найти цитируемый пост)
Сокращение от Access violation - нарушение доступа к памяти

Аааа спасибки =) просто в етих сокращениях ещё не сильно разбераюсь  smile 
Цитата(Anikmar @  27.9.2009,  00:16 Найти цитируемый пост)
dic указывает на единственный объект. Нет там никакого массива и при попытке прибавить к указателю число - он смещается на tmp объектов, которых реально нет - т.е. указывает на случайный адрес.В общем почитайте про математические операции с указателями, массивы и т.п.

Да вот какраз и читал))))) только там дальше типа char не заходило... потому... какбы они написали так что якобы это и ко всем остальным типам относится. 


Спасибо большое! 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0898 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.