![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FreeMem [D6]
lead-in © (2008-10-16 15:38:00)Здравствуйте, вот пишу следущее:
var map: array of char;
begin
str := 'test';
GetMem(Pointer(map), 10);
showmessage(StrPas(StrPCopy(@map, str)));
FreeMem(Pointer(map), sizeof(map))
end
вылетает AV на FreeMem, пробовал вместо GetMem и FreeMem SetLength и map := nil, всё одно, подскажите что не так делаю, если делаю через статический массив, то всё в порядке...
Palladin (2008-10-16 20:20:00) [1]ты такие книжки больше не читай или читай внимательней
han_malign (2008-10-16 17:17:00) [2]
> согласно одной книжке (С. Бобровский) и так указывает на первый элемент массива
- только в случае статического массива map: array [0..9]of char
но в этом случае прокатит и Showmessage(StrPas(StrPCopy( map, str)))
DevilDevil (2008-10-16 16:41:00) [3]можно pchar(map)
clickmaker (2008-10-16 16:31:00) [4]> [14] lead-in (16.10.08 16:13)
map - это уже указатель, но как бы для внутреннего использования. Поэтому запись @map - бессмысленна.
а вот @map[0] - это уже указатель на данные, на начало массива
lead-in (2008-10-16 16:13:00) [5]вот это отлично работает:
Showmessage(StrPas(StrPCopy(@map[0], str)))
только вот чего не пойму, эта запись:
@map
согласно одной книжке (С. Бобровский) и так указывает на первый элемент массива, то есть в данном случае как раз на 0-й байт, is not it?
Palladin (2008-10-16 16:04:00) [6]и, кстати говоря, @map это не указатель на char, это указатель на сам идентификатор map, который в свою очередь сам указатель
Showmessage(StrPas(StrPCopy(@map [0], str)))
вот так должно отработать
Сергей М. (2008-10-16 16:03:00) [7]
> после строки со showmsg в str почему-то заполнен всякой
> абракадаброй
Ну так ты сам и завалил мусором переменную map)
> Palladin © (16.10.08 15:45) [5]
Угу, это я проглючил) ..компайлер умный, он поймет чего в этом случае от него хотят)
Palladin (2008-10-16 16:02:00) [8]а кто сказал что array of char это PChar? работа с PChar идет чуть ли на уровне compiler magic, и такой ерундой, как подстановка идентификатора дин.массива замест PChar, страдать не стоит
lead-in (2008-10-16 15:59:00) [9]
> Palladin © (16.10.08 15:52) [9]
Так всё норм, а не объясниле ли почему эта строка:
showmessage(StrPas(StrPCopy(@map, str)))
к такому результату приводила?
Palladin (2008-10-16 15:52:00) [10]а, ну move(str[1],map[0],Length(str));
map[Length(str)]:=#0;
workbench (2008-10-16 15:51:00) [11]пропалился, извините, стыдно просто за вопрос(((
Palladin (2008-10-16 15:51:00) [12]showmessage(PChar(@map[0]));
и всего делов, учти, что последний элемент массива обязанбыть #0
иначе увидишь такое, что и во сне не приснится...
workbench (2008-10-16 15:49:00) [13]
> Palladin
нигде, можно сказать щас этим и занимаюсь)
> clickmaker
> Сергей М.
вот так переписал:
str := 'test';
SetLength(map, 10);
showmessage(StrPas(StrPCopy(@map, str)));
SetLength(map, 0)
всё равно AV, после строки со showmsg в str почему-то заполнен всякой абракадаброй...
Palladin (2008-10-16 15:45:00) [14]
> map := nil
верно :)
clickmaker (2008-10-16 15:45:00) [15]> array of char;
кстати, да. Тут SetLength(10) нужен
GetMem - это, если бы был map: PChar
Сергей М. (2008-10-16 15:44:00) [16]GetMem тут ни в какую дырку не годится, равно как и FreeMem
> пробовал вместо GetMem ..SetLength
А вот это как раз верно.
> вместо FreeMem .. map := nil
А это, напротив, неверно.
Либо SetLength(map, 0) либо вообще ничего, в первую очередь если map явл-ся локальной переменной подпрограммы.
Palladin (2008-10-16 15:43:00) [17]где же ты, горемычный, вычитал про подобную работу с дин.массивом то?
clickmaker (2008-10-16 15:43:00) [18]проблема в sizeof(map)
чему он равен, как думаешь?
и зачем его указывать вообще?