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

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

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)
чему он равен, как думаешь?
и зачем его указывать вообще?


Наверх

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