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