![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Непонятки с выводом записи [D6, XP]
Archvile © (2010-10-15 00:42:00)Нужно вывести инфу из записи о самом молодом игроке. Вроде все просто, НО при выводе в Мемо1 ничего не пишет. Как только убираю цикл и на прямую забиваю(допустим m:=6) то все ОК-вывод есть. Включаю через цикл определение m. Ничего не выводит.
Так вроде и в цикле ошибки нету =(
procedure TForm1.Button4Click(Sender: TObject);
var
i,m:integer;
begin
Memo1.Clear;
m:=0; i:=0;
while i<=6 do
begin
if sport[i].age < sport[m].age then m:=i;
inc(i);
end;
Memo1.Lines.Add('Самый молодой игрок:');
Memo1.Lines.Add(sport[m].country+' ~ '+sport[m].team+' ~ '+sport[m].FIO+' ~ '+
IntToStr(sport[m].number)+' ~ '+IntToStr(sport[m].age)+' ~ '+
IntToStr(sport[m].height)+' ~ '+IntToStr(sport[m].weight));
end;
Archvile (2010-10-15 21:15:00) [1]Все, теперь понял) n указывало на "пустой" эл. массива т.к. в одном месте я его увеличил на 1.
Anatoly Podgoretsky (2010-10-15 21:10:00) [2]> Archvile (15.10.2010 20:31:15) [15]
Все зависит от значения N, оно вообще может быть неинициализировано.
Archvile (2010-10-15 21:09:00) [3]Это если бы я задавал массив так
sport:array[1..10] of TSport;
Но я задал вот так
sport:array[0..10] of TSport;
Amoeba_ (2010-10-15 20:39:00) [4]
> Archvile (15.10.10 20:31) [15]
>
> Все разобрался. Но так и не понял почему был выход за массив
> =\
> Вроде же n последний элемент массива.
>
А чего тут не понять? Матчасть учи!
Индекс последнего элемента динамического массива всегда n-1 (где n длина массива), а индекс первого всегда 0.
Archvile (2010-10-15 20:31:00) [5]Все разобрался. Но так и не понял почему был выход за массив =\
Вроде же n последний элемент массива.
Memo1.Clear;
m:=0;
for i:=0 to n-1 do
if sport[i].age < sport[m].age then m:=i;
Германн (2010-10-15 20:12:00) [6]
> Archvile (15.10.10 20:09) [13]
Давай тогда цельный кусок кода, который можно проверить.
Archvile (2010-10-15 20:09:00) [7]Попробывал еще так. Безрезультатно.
begin
Memo1.Clear;
m:=0;
for i:=0 to n do
if sport[i].age < sport[m].age then m:=i;
Archvile (2010-10-15 19:56:00) [8]Спрашивали как объявлен массив.
Anatoly Podgoretsky (2010-10-15 19:35:00) [9]А что с этим кодом делать?
Archvile (2010-10-15 19:26:00) [10]Ан,нет. Ошибся =)
Вот объявление записи. Я добавил шесть записей в массив.
Type
TSport=record
country:string[20];
team:string[20];
FIO:string[40];
number:integer;
age:integer;
height:integer;
weight:integer;
end;
var
Form1: TForm1;
f:TextFile;
sport:array[0..10] of TSport;
n,m:integer;
fname:string[15];
Archvile (2010-10-15 19:22:00) [11]Спасибо! Действительно, выход за диапазон.
Юрий Зотов (2010-10-15 14:38:00) [12]> han_malign (15.10.10 09:24) [6]
m := Low(sport);
for i := Low(sport) + 1to High(sport) do ...
MonoLife (2010-10-15 14:12:00) [13]
> MBo © (15.10.10 08:25) [5]
>
> >тогда нужен брейк..
> не нужен.
блин, не внимательный я!
han_malign (2010-10-15 09:24:00) [14]
> Нет ли тут выхода за диапазон?
+1
m:= Low(sport);
for i:= Low(sport) to High(sport) do ...
и заметь, при масштабировании решения - достаточно просто изменить размер массива и, как минимум эта часть, будет продолжать работать без внесения каких либо изменений...
MBo (2010-10-15 08:25:00) [15]>тогда нужен брейк..
не нужен.
MonoLife (2010-10-15 07:13:00) [16]
> while i<=6 do
> begin
> if sport[i].age < sport[m].age then m:=i;
> inc(i);
> end;
...
Memo1.Lines.Add(sport[m]....
а смысл? m будет равняться либо 0, либо одному из значений i.
имхо, после if sport[i].age < sport[m].age then m:=i; тогда нужен брейк..
Anatoly Podgoretsky (2010-10-15 04:20:00) [17]Удалено модератором
Anatoly Podgoretsky (2010-10-15 04:20:00) [18]Отладку сделай.
Юрий Зотов (2010-10-15 01:25:00) [19]Как объявлен массив Sport? Нет ли тут выхода за диапазон?