Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Кто внятно пояснит в чём проблема ?


Страницы:   1 2 3

Kozhanov ©   (2002-05-31 14:01:00) 

type
PString = ^String;

procedure TForm1.Button1Click(Sender: TObject);
var
A : array[1..8] of Byte;
begin
FillChar(A, SizeOf(A), 0);
PString(@A[1])^ := "hello, buddy !";
PString(@A[5])^ := "good-bye, buddy !"; //здесь происходит
//крушение если заремить первую строчку ?!!!!!!!!
ShowMessage(PString(@A[1])^);
ShowMessage(PString(@A[5])^);
end;


Kozhanov   (2002-05-31 16:54:00) [1]

> MBo
Согласен (полностью).


MBo   (2002-05-31 16:51:00) [2]

Трудно советовать в видимо непростом вопросе, не осознав всей задачи ;(


Kozhanov   (2002-05-31 16:47:00) [3]

> MBo
1. Я согласен, что проблемка не совсем тривиальная
2. pbytearray - это и есть указатель на массив байт
3. Про строки я понял... Хотя и не до конца.
4. Советовать не будите ???


MBo   (2002-05-31 16:41:00) [4]

Я пока не очень понял, но часто в таких случаях удобно использовать pbytearray. Кстати, строки, как видишь, трудно отнести к простым структурам ;)


Kozhanov   (2002-05-31 16:37:00) [5]

> MBo
Попробую...
В общем нужно придумать алгоритм и структуру данных для того,
чтобы отражать простые и сложные структуры на последовательность
байт.

простые структуры :
Integer, String, Byte и т.д.

сложные структуры :
записи и массивы (или и то и другое вместе)

Вот я тут пробую... пока ничего эффективного и красивого придумать немогу :(

Может есть мыслишки ?
Мне думается что это можно сделать через массив (динам-кий видимо) и через структуру, через которую можно будет узнать по какому смещению что лежит...

Если что можешь присоветовать (или на мысль натолкнуть)
буду очень признателен.


MBo   (2002-05-31 16:28:00) [6]

>Kozhanov
Не разъяснишь, какая конечная цель, что именно хочется сделать?


Kozhanov   (2002-05-31 16:23:00) [7]

> Игорь Шевченко
В твоей структуре - PString.
А как же использовать всё это для отражения массива, записи или
ещё круче...массива элемент, которого - запись ?


Kozhanov   (2002-05-31 16:05:00) [8]

> Внук
Мда уж :)
А вообще я думаю это можно взять на вооружение.
Мне это нравиться, ничего не делаешь, а память всё равно
выделяется,хотя наверное стоит ещё поиграться с этим делом...


Внук   (2002-05-31 15:59:00) [9]

>>Kozhanov © (31.05.02 15:56)
Согласен. "...только приходится обнулять массив...FillChar(A, SizeOf(A), 0)...", чтобы она это начала делать с начала и правильно :)


Kozhanov   (2002-05-31 15:56:00) [10]

>Внук
Видимо,хотя явно и нет переменной String, но Делфи всё равно
запускает свой механизм выделения памяти под String, но только
приходится обнулять массив...FillChar(A, SizeOf(A), 0)

В общем наверное, где-то так всё и работат...shit...


Внук   (2002-05-31 15:54:00) [11]

>>Kozhanov © (31.05.02 15:48)
Да, я именно так и сделал.
Кстати, явно выделить память через SetLength опять же не получится по той же причине (если предварительно не занулить строку, но в этом случае память выделять уже не нужно - диалектика, однако ).


Игорь Шевченко   (2002-05-31 15:52:00) [12]

Integer работает без проблем. PShortString работает без проблем

Все равно, это неправильный способ. Правильный - описывать структуру данных (см. мои предложения)


Внук   (2002-05-31 15:51:00) [13]

>>Игорь Шевченко © (31.05.02 15:29)
Действительно, автоматическое управление памятью под строки срабатывает (будь оно неладно), отсюда глюк.
Автору вопроса спасибо за науку :)


Kozhanov   (2002-05-31 15:48:00) [14]

Господа, я пришёл к выводу, что под строку надо явно выделять
память, но всё же интересно как ведёт себя Делфи, в смысле
почему работает...а кстати, если PString заменить на
PInteger = ^Integer и написать

PInteger(@A[1])^ := 100;
PInteger(@A[5])^ := -100;

то всё работает без проблем.


MBo   (2002-05-31 15:35:00) [15]

>Игорь Шевченко
Да,я пробежался отладчиком, исключение возникает после вызова NewAnsiString внутри LStrAsg


erik   (2002-05-31 15:32:00) [16]

Блин зачем спорить, что сложно посмотреть куда физически поподает строка!!! А она поподает в произвольную область и если эта область кемто используется тогда AV. Если неверишь, что нельзя писать куда непоподя то читай Help.


SPeller   (2002-05-31 15:30:00) [17]

А хотя выполнится..... :) Вот если до одного уменьшить, то ексепшн вылезет.


Игорь Шевченко   (2002-05-31 15:29:00) [18]

MBo © (31.05.02 15:27)

Именно так оно и происходит. Так работает процедура _LStrAsg, которая вызывается этим оператором.

С уважением,


SPeller   (2002-05-31 15:28:00) [19]

Или попробуйте уменьшить размерность массива до трёх. тогда вообще ничего не выполнится.


MBo   (2002-05-31 15:27:00) [20]

посмотри в watch содержимое A
PString(@A[1])^ := "hello, buddy !";
Полагаю, если заполнено нулями, Delphi видит по этому адресу nil, считает, что это новая строка, в меру сил распределяет под нее память, записывая в А адрес. Если же там не nil, происходит обращение к этому мусорному адресу, вот и AV выскакивает


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо