Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.03 c
15-1147166720
Der Nechk@ssoff
2006-05-09 13:25
2006.06.11
Засиделся...


5-1133363632
tyo
2005-11-30 18:13
2006.06.11
компиляция *.dpk с командной строки


2-1148564074
AversFm
2006-05-25 17:34
2006.06.11
Ув. мастера. Помогите разобраться с группировкой


8-1136978358
DVM
2006-01-11 14:19
2006.06.11
Загрузка JPEG из памяти в TBitmap. Как?


2-1148204287
Delphin06
2006-05-21 13:38
2006.06.11
Как сделать окно одинаковое на всех мониторах