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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.10.2012, 12:52
o919322 o919322 вне форума
Прохожий
 
Регистрация: 02.10.2012
Сообщения: 2
Репутация: 10
Злость Непонятная работа с массивами

Здравствуйте.
Есть тривиальный кусок кода:
Код:
var
  i: integer;
  mas_p:array[0..100] of integer;
begin
  for i:=0 to 80 do
    mas_p[i]:=i;
  ShowMessage(IntToStr(low(mas_p))); // выдает 0
  ShowMessage(IntToStr(high(mas_p))); // выдает 100
  ShowMessage(IntToStr(length(mas_p))); // выдает 101
  ShowMessage(IntToStr(SizeOf(mas_p))); // выдает 404
end;

Почему delphi7 выдает high = 100? Когда у меня введено в массив только 81 значение
И как правильно получить количество значений в массиве (в данном примере 81)?
Ответить с цитированием
  #2  
Старый 02.10.2012, 13:05
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Функция Low возвращает минимальный индекс массива, функция high - максимальный индекс массива. Тоесть, если ты массив обьявишь так:
Код:
mas_p:array[-14..87] of integer;
то они тебе возвратят -14 и 87 соответственно.
Функция length возвращает длину массива, SizeOf - размер (в байтах) переменной=длина массива*SizeOf(элемент массива)=101*4 (4 - размер типа Integer).
Чтобы найти минимальное и максимальное значения, нужно осуществлять перебор по элементам массива и выбырать меньшее/большее.
Ответить с цитированием
  #3  
Старый 02.10.2012, 13:15
Аватар для Lost_Fish
Lost_Fish Lost_Fish вне форума
Начинающий
 
Регистрация: 21.07.2011
Адрес: Новосибирск
Сообщения: 103
Версия Delphi: Delphi 7,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от o919322
Здравствуйте.
Есть тривиальный кусок кода:
Код:
var
  i: integer;
  mas_p:array[0..100] of integer;
begin
  for i:=0 to 80 do
    mas_p[i]:=i;
  ShowMessage(IntToStr(low(mas_p))); // выдает 0
  ShowMessage(IntToStr(high(mas_p))); // выдает 100
  ShowMessage(IntToStr(length(mas_p))); // выдает 101
  ShowMessage(IntToStr(SizeOf(mas_p))); // выдает 404
end;

Почему delphi7 выдает high = 100? Когда у меня введено в массив только 81 значение
И как правильно получить количество значений в массиве (в данном примере 81)?

у тебя массив длинной 101 элемент mas_p:array[0..100] of integer;
заполняешь его значениями ты только до mas_p[80] --> for i:=0 to 80 do остальное за тебя кто-то другой заполняет.
Решение при заполнении использовать конструкцию
Код:
for i:=Low(mas_p) to High(mas_p) do
и прочитай про динамические массивы
__________________
Код сырец
Ответить с цитированием
  #4  
Старый 02.10.2012, 13:16
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

-даже если ты ничего "не введешь" 100 будет
-никак, либо считать самому
-используй списки (TList), динамические массивы
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
o919322 (03.10.2012)
  #5  
Старый 03.10.2012, 06:17
o919322 o919322 вне форума
Прохожий
 
Регистрация: 02.10.2012
Сообщения: 2
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
-даже если ты ничего "не введешь" 100 будет
-никак, либо считать самому
-используй списки (TList), динамические массивы
Т.е. я правильно понял, что нет функции, которая бы выводила количество заполненных значений массива? И чтобы найти количество заполненных значений надо устраивать перебор всего массива?
По-умолчанию при инициализации массива значения массива чем заполнены? Как определить что значение не заполнено?
Можно простой пример?
Ответить с цитированием
  #6  
Старый 03.10.2012, 06:37
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Массив - это участок памяти. Каждый условный участок - это большое количество бит. У бита есть 2 состояния - единица или ноль, у него нет "пустого" состояния. Чем заполнен массив после объявления? Как повезёт. Иногда - нулями, иногда - мусором, оставшимся после того, как этот же блок освободил кто-то другой.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #7  
Старый 03.10.2012, 06:38
Аватар для Lost_Fish
Lost_Fish Lost_Fish вне форума
Начинающий
 
Регистрация: 21.07.2011
Адрес: Новосибирск
Сообщения: 103
Версия Delphi: Delphi 7,XE2
Репутация: выкл
По умолчанию

Есть такое понятие как динамический массив
Код:
var
    Ar:array of Integer
изначально его длинна не задана

Код:
SetLength(Ar,0)
устанавливает размер массива в данном случае - 0

Код:
SetLength(Ar,Length(Ar)+1)
добавляет один элемент в конец массива

работа с массивом также
Код:
Ar[i]:=i;

когда ты создаёшь массив Delphi только выделяет память из имеющейся свободной и ни кто не знает что было в этой памяти до того как она стала свободной, там могу быть нули а может быть и шлак всякий

Код:
SetLength(Ar,Length(Ar)-1)
это удалить последний элемент

функция
Код:
Length(Ar)
показывает длину массива

P.S. нумерация элементов динамического массива начинается с 0
__________________
Код сырец
Ответить с цитированием
Этот пользователь сказал Спасибо Lost_Fish за это полезное сообщение:
Евгений79 (05.10.2012)
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter