Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.024 c
2-1148136188
Mr tray
2006-05-20 18:43
2006.06.11
waitmessage только с определенным сообщением


2-1148210007
Мурзилка
2006-05-21 15:13
2006.06.11
размеры формы


15-1147629954
Imbac
2006-05-14 22:05
2006.06.11
Определить что на фотографии человек или машина


15-1147334882
TohaNik
2006-05-11 12:08
2006.06.11
ЧМ по хоккею.


2-1148305253
Std
2006-05-22 17:40
2006.06.11
установка компонент в delphi 2006




   Наверх