Главная страница
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.042 c
1-1146809331
Handle
2006-05-05 10:08
2006.06.11
EOutOfResources


2-1148571386
AlexanderMS
2006-05-25 19:36
2006.06.11
Проблема с отображением символа Unicode.


15-1147702628
Pazitron_Brain
2006-05-15 18:17
2006.06.11
Видео с фотоаппарата Nikon.


15-1147971720
срочно
2006-05-18 21:02
2006.06.11
Базы данных


11-1128106300
Sniper17
2005-09-30 22:51
2006.06.11
Владимир, выложите на вашем сайте 2.13 которую потом