Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Массив в структуре [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо