Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.10.2011, 13:09
badtrips badtrips вне форума
Прохожий
 
Регистрация: 06.06.2011
Сообщения: 29
Репутация: 10
По умолчанию Непонятно окуда берущееся значение

В одной из процедур идёт вызов процедуры указанной ниже,и,хотя i в неё не передаётся,writeln(i) выдаёт значение 45588 и массив получается такого де размера+1.Откуда оно там может браться?
Код:
procedure Add_to_Array(var Massiv:Mass;Zap:Sportsmen);
var
i:word;
begin
writeln(i);
readln;
i:=high(Massiv);
setlength(Massiv,i+1);
Massiv[i]:=Zap;
end;
Ответить с цитированием
  #2  
Старый 04.10.2011, 14:37
badtrips badtrips вне форума
Прохожий
 
Регистрация: 06.06.2011
Сообщения: 29
Репутация: 10
По умолчанию

Вставил всю программу,у кого есть время,посмотрите пожалуйста.Много ляпов но главный вопрос-отчего такой размер массива
Код:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  converter in 'converter.pas';

type

Sportsmen = record
  Surname:String;//
  Name:String;   //Имя
  Date_of_birth:String;//
  Weight:Integer;       //
  Height:Integer;       //
  Sex:String;           //
end;

Mass = array of Sportsmen;

//
procedure Input_Record(var Zap:Sportsmen;var p:Boolean);
begin
writeln(RUS(''));readln(Zap.Surname);
writeln(RUS(''));readln(Zap.Name);
writeln(RUS(''));readln(Zap.Date_of_birth);
writeln(RUS('()'));readln(Zap.Weight);
writeln(RUS('()'));readln(Zap.Height);
writeln(RUS(''));readln(Zap.Sex);
if (Zap.Surname='0') or (Zap.Name='0') or (Zap.Date_of_birth='0') or (Zap.Weight=0) or (Zap.Height=0) or (Zap.Sex='0') then p:=false
end;

//
procedure Out_Record(var Zap:Sportsmen);
begin
writeln(RUS(':'));
writeln(RUS(':'),Zap.Surname);
writeln(RUS(':'),Zap.Name);
writeln(RUS(':'),Zap.Date_of_birth);
writeln(RUS(':'),Zap.Weight);
writeln(RUS(':'),Zap.Height);
writeln(RUS(':'),Zap.Sex);
end;

//
procedure Add_to_Array(var Massiv:Mass;Zap:Sportsmen);
var
i:word;
begin
writeln(i);
readln;
i:=high(Massiv);
setlength(Massiv,i+1);
Massiv[i]:=Zap;
end;

//
procedure Input_Array(var Massiv:Mass;var p:boolean);
var
otvet:char;
Zap:Sportsmen;
begin
writeln(RUS(''));
repeat
Input_Record(Zap,p); p:=true;
Add_to_Array(Massiv,Zap);
writeln(RUS('? (Y/N)'));
readln(otvet);
until (otvet='N') or (otvet='n');
end;

//
procedure Out_Array(Massiv:Mass);
var
i:integer;
begin
for i:=0 to high(Massiv) do
begin
with Massiv[i] do
writeln(Surname,' ',Name,' ',Date_of_birth,' ',Weight,' ',Height,' ',Sex);
end;
end;

//
procedure Puzyrek(var Massiv:Mass);
begin
end;

//
var
Massiv:Mass;
Num:Integer;//
Zap:Sportsmen;
p:Boolean;//
begin
while true do
begin
writeln(RUS('Набор операций:'));
writeln(RUS('1.Заполнение отдельной записи'));
writeln(RUS('2.Вывод записи'));
writeln(RUS('3.Добавление записи в массив'));
writeln(RUS('4.Создание массива записей'));
writeln(RUS('5.Вывод массива записей'));
writeln(RUS('6.Сортировка "пузырьком""'));
writeln(RUS('0.Выход'));
writeln(RUS('Введите номер операции:'));
Readln(Num);
case num of
1:
begin
Input_Record(Zap,p);
end;
2:
begin
Out_Record(Zap);
end;
3:
begin
Add_to_Array(Massiv,Zap);
end;
4:
begin
Input_Array(Massiv,p);
end;
5:
begin
Out_Array(Massiv);
end;
6:
begin
Puzyrek(Massiv);
end;
0:
begin
halt(0);
end;
end
end;

readln;
end.

Последний раз редактировалось badtrips, 04.10.2011 в 14:41.
Ответить с цитированием
  #3  
Старый 04.10.2011, 15:10
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Дак ты же объявил i и не указал чему оно ровняться то должно

Код:
Sportsmen = record
  Surname:String;//
  Name:String;   //Имя
  Date_of_birth:String;//
  Weight:Integer;       //
  Height:Integer;       //
  Sex:String;           //
какие интересные спортсмены
Ответить с цитированием
  #4  
Старый 04.10.2011, 15:19
badtrips badtrips вне форума
Прохожий
 
Регистрация: 06.06.2011
Сообщения: 29
Репутация: 10
По умолчанию

возможно я не понимаю,но если я заместо этого
Код:
procedure Add_to_Array(var Massiv:Mass;Zap:Sportsmen);
var
i:word;
begin
writeln(i);
readln;
i:=high(Massiv);
setlength(Massiv,i+1);
Massiv[i]:=Zap;
end;
i=45588
сделаю это
Код:
procedure Add_to_Array(var Massiv:Mass;Zap:Sportsmen);
var
i:word;
begin
i:=high(Massiv);
writeln(i);
readln;
setlength(Massiv,i+1);
Massiv[i]:=Zap;
end;
то i = 65535

и я наверное коряво написал что именно делаю.запускаю программу,выбираю пункт 4.запускаю процедуру Input_Array,она запускает Input_Record,и потом иду в процедуру Add_to_Array и в ней то вся эта непонятная штука происходит

Последний раз редактировалось badtrips, 04.10.2011 в 15:22.
Ответить с цитированием
  #5  
Старый 04.10.2011, 15:29
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

high(Massiv)=65535

что тебе не нравится то?
Ответить с цитированием
  #6  
Старый 04.10.2011, 15:46
badtrips badtrips вне форума
Прохожий
 
Регистрация: 06.06.2011
Сообщения: 29
Репутация: 10
По умолчанию

почему он такой?он же пустой?..
Ответить с цитированием
  #7  
Старый 04.10.2011, 15:40
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Цитата:
Сообщение от badtrips
возможно я не понимаю,но непонятная штука происходит

Код:
procedure Add_to_Array(var Massiv:Mass;Zap:Sportsmen);
var
  i:word;
begin
  i:=high(Massiv); (* если массив пустой, то high = -1, а при переводе в word получается 65535*)
  writeln(i); 
readln;
setlength(Massiv,i+1); // а вот тут получается чёрти что
Massiv[i]:=Zap;
end;
Используй не i:word, а i:integer.
Ответить с цитированием
  #8  
Старый 04.10.2011, 15:47
badtrips badtrips вне форума
Прохожий
 
Регистрация: 06.06.2011
Сообщения: 29
Репутация: 10
По умолчанию

Цитата:
Сообщение от icWasya
Код:
procedure Add_to_Array(var Massiv:Mass;Zap:Sportsmen);
var
  i:word;
begin
  i:=high(Massiv); (* если массив пустой, то high = -1, а при переводе в word получается 65535*)
  writeln(i); 
readln;
setlength(Massiv,i+1); // а вот тут получается чёрти что
Massiv[i]:=Zap;
end;
Используй не i:word, а i:integer.

программа почему то вылетает при i:integer.

уже не вылетает но i=4239892
где ж я накосячил то...

icWasya-спасибо!не увидел вставку в коде.

Последний раз редактировалось badtrips, 04.10.2011 в 19:27.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:20.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025