Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблема с GetMem
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Unconnected
Привет всем.

Такой код:

interface
type TSost = (stRoad,stZnak);

TOpis = record
width,height:byte;
typ:TSost;
end;

TInfo = record
typ:TSost;
nomt:byte;
sv:string;
x,y,widthmt,heightmt,widthpt,heightpt:integer;
end;

Implementation

var cr:array of TOpis;
info:array of TInfo;

TLine_road.create;
begin
getmem(cr,sizeof(TOpis));
getmem(info,sizeof(TInfo));
end.


Выдаёт ошибку incompatible types, указывая на cr в первом GetMem. Самое удивительное, что этот код компилируется у друга, даже работает (там дальше ещё realloc, но туда просто не доходит), но у него компилятор D7, а у меня 2007. Я пробовал немного изменить код (т.к. несовместимые типы) так:

interface
type TSost = (stRoad,stZnak);

TOpis = record
width,height:byte;
typ:TSost;
end;

TInfo = record
typ:TSost;
nomt:byte;
sv:string;
x,y,widthmt,heightmt,widthpt,heightpt:integer;
end;

Implementation

var cr:array of ^TOpis; //<--
info:array of ^TInfo; //<--

TLine_road.create;
begin
getmem(cr[0],sizeof(TOpis)); //<--
getmem(info[0],sizeof(TInfo));//<--
end.

(различия под стрелочками)

но в этом случае вылетает AV, указывая на первый GetMem. Они, GetMem'ы находятся в конструкторе класса моего, а типы и массивы объявлены вне, может, в этом дело?
volvo
Самое удивительное - не то, что код компилируется, а то, что это на фиг не нужно: динамические массивы предполагают использование SetLength (в твоем случае
var
cr:array of TOpis;
info:array of TInfo;
//
SetLength(cr, 1);
SetLength(info, 1);
), а не ручное выделение памяти. В чем смысл твоего кода? Ну, выделил ты память под первый элемент. Дальше что делать будешь?
Unconnected
Про SetLength я знаю, но мне нужная длина не даётся сразу, нужно выделять по одному элементу, допустим в цикле. Или так с помощью SetLength тоже можно?
Rian
ну например

setlength(mas,length(mas)+1);
а изменять...
mas[high(mas)].value;

или вести индекс....
volvo
Unconnected, можно вопрос? Эти два типа, TOpis и TInfo; как-то связаны между собой?

Кстати, к вопросу о том, что
Цитата
но в этом случае вылетает AV, указывая на первый GetMem
. Знаешь, почему вылетает? Потому что ты описал динамический массив из указателей на структуры, и пытаешься в нулевой элемент этого массива записать адрес выделенной области памяти. Но ведь размер массива равен нулю, то есть, записывать пока некуда. Обращение к нулевому элементу mas до SetLength(mas, ...) невозможно.
Unconnected
Цитата
Эти два типа, TOpis и TInfo; как-то связаны между собой?


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

rian, volvo, спасибо, с SetLength работает.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.