![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Массив в структуре [D7]
Цукор5 © (2006-05-05 00:21:00)Так работает :
type
TStudent = record
FIO : String[20];
Bal : Array [1..20] of Integer;
end;
TAllStudent = array [1..40] of TStudent;
PAllStudent = ^TAllStudent;
...
var Q:Pointer;
I,II:Byte;
KolStudent,KolSubject : Byte;
begin
KolStudent := 5;
KolSubject := 5;
GetMem(Q,SizeOf(TAllStudent));
for I:=1 to KolStudent do
begin
PAllStudent(Q)[I].FIO := 'Student'+IntToStr(I);
for II:=1 to KolSubject do
PAllStudent(Q)[I].Bal[II]:=Random(3)+2;
end;
FreeMem(Q);
а так нет :
type
TStudent = record
FIO : String[20];
Bal : Array of Integer;
end;
TAllStudent = array [1..40] of TStudent;
PAllStudent = ^TAllStudent;
...
var Q:Pointer;
I,II:Byte;
KolStudent,KolSubject : Byte;
begin
KolStudent := 5;
KolSubject := 5;
GetMem(Q,SizeOf(TAllStudent));
for I:=1 to KolStudent do
begin
PAllStudent(Q)[I].FIO := 'Student'+IntToStr(I);
SetLength(PAllStudent(Q)[I].Bal,KolSubject);
for II:=1 to KolSubject do
PAllStudent(Q)[I].Bal[II]:=Random(3)+2;
end;
FreeMem(Q);
В чем,собственно,ошибка ???
begin...end (2006-05-05 10:04:00) [1]> Цукор5
На одну ошибку (выход за границы массива Q[I].Bal) уже указали (см. [3]).
Но есть и ещё одна: после вызова GetMem в данном случае нужно добавить FillChar(Q^, sizeof(TAllStudent), 0).
evvcom (2006-05-05 10:02:00) [2]
> Так как у тебя массив bal - динамический, то программа не
> знает сколько памяти выделять.
Почему не знает? 4 байта для указателя, не больше, не меньше.
> также
> SetLength(PAllStudent(Q)^[I].Bal,KolSubject);
> у тебя же вроде указатель
С массивами и без крышки прокатывает, но я ее обычно все же ставлю, так как отладчик в хинте не покажет весь массив без крышки. А компилятору пофиг (говорю о D7).
tesseract (2006-05-05 09:50:00) [3]
> SetLength(PAllStudent(Q)[I].Bal,KolSubject);
отладчиком поработай.
также
SetLength(PAllStudent(Q)^[I].Bal,KolSubject);
у тебя же вроде указатель
Tager (2006-05-05 09:32:00) [4]
> type
> TStudent = record
> FIO : String[20];
> Bal : Array of Integer;
> end;
> TAllStudent = array [1..40] of TStudent;
> PAllStudent = ^TAllStudent;
> GetMem(Q,SizeOf(TAllStudent));
Мне кажется, что у тебя ошибка главным образом в выделении памяти. Так как у тебя массив bal - динамический, то программа не знает сколько памяти выделять. Могу предположить, что у тебя возникает ошибка, когда ты обращаешся к не выделеной памяти. Попробуй в цикле для каждого нового элемента выделять дополнительно память.
GanibalLector (2006-05-05 02:18:00) [5]
var Q:TAllStudent;
I,II:Byte;
KolStudent,KolSubject : Byte;
begin
KolStudent := 5;
KolSubject := 5;
for I:=1 to KolStudent do
begin
Q[I].FIO := 'Student'+IntToStr(I);
SetLength(Q[I].Bal,KolSubject);
for II:=0 to KolSubject-1 do
Q[I].Bal[II]:=Random(3)+2;
end;
Цукор5 (2006-05-05 00:58:00) [6]Блин...не снят. Поработало и перестало :( Чудеса какие-то!!!
Цукор5 (2006-05-05 00:33:00) [7]Вопрос снят : for II:=0 to KolSubject-1 do