Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Массив через указатель


Автор: Kirgston 26.9.2009, 17:50
Всем доброго времени суток! Возник такой вот вопросик... собственно как я могу получить доступ через указатель? На Вижуале писал так например:
*(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 попросту пуст... и никакие данные в него не попадали оО

Спасибо!

Автор: Anikmar 26.9.2009, 18:37
Цитата(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!@#$%^&*()-_=+\|/?.,<>':{}[];~` ";


Автор: Kirgston 26.9.2009, 22:05
Цитата(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 (указатель указывает на ету переменную) и тогда уже указываем по индексу тмп. Я всё правильно понял? 

Спасибо!

Автор: Anikmar 27.9.2009, 00:16
Цитата(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 объектов, которых реально нет - т.е. указывает на случайный адрес.

В общем почитайте про математические операции с указателями, массивы и т.п.

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

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

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


Спасибо большое! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)