![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Кто внятно пояснит в чём проблема ?
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 выскакивает