Текущий архив: 2006.06.11;
Скачать: CL | DM;
Вниз
Массив в структуре Найти похожие ветки
← →
Цукор5 (2006-05-05 00:21) [0]Так работает :
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);
В чем,собственно,ошибка ???
← →
Цукор5 (2006-05-05 00:33) [1]Вопрос снят : for II:=0 to KolSubject-1 do
← →
Цукор5 (2006-05-05 00:58) [2]Блин...не снят. Поработало и перестало :( Чудеса какие-то!!!
← →
GanibalLector © (2006-05-05 02:18) [3]
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;
← →
Tager (2006-05-05 09:32) [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 - динамический, то программа не знает сколько памяти выделять. Могу предположить, что у тебя возникает ошибка, когда ты обращаешся к не выделеной памяти. Попробуй в цикле для каждого нового элемента выделять дополнительно память.
← →
tesseract © (2006-05-05 09:50) [5]
> SetLength(PAllStudent(Q)[I].Bal,KolSubject);
отладчиком поработай.
также
SetLength(PAllStudent(Q)^[I].Bal,KolSubject);
у тебя же вроде указатель
← →
evvcom © (2006-05-05 10:02) [6]
> Так как у тебя массив bal - динамический, то программа не
> знает сколько памяти выделять.
Почему не знает? 4 байта для указателя, не больше, не меньше.
> также
> SetLength(PAllStudent(Q)^[I].Bal,KolSubject);
> у тебя же вроде указатель
С массивами и без крышки прокатывает, но я ее обычно все же ставлю, так как отладчик в хинте не покажет весь массив без крышки. А компилятору пофиг (говорю о D7).
← →
begin...end © (2006-05-05 10:04) [7]> Цукор5
На одну ошибку (выход за границы массива Q[I].Bal) уже указали (см. [3]).
Но есть и ещё одна: после вызова GetMem в данном случае нужно добавить FillChar(Q^, sizeof(TAllStudent), 0).
Страницы: 1 вся ветка
Текущий архив: 2006.06.11;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.042 c