• 0
dim

Странное поведение переменной integer

Вопросы

блин, что делаю не так (под андроид)

var iio:integer;
begin
    rz:=High(CartList);// возвращает 0 хотя есть 1 запись в массиве
    for iio := 0 to rz do begin

      // цикл не выполняется так как iio=1 в отладчике

    end;
уже всю голову сломал подскажите что не так

Изменено пользователем dim

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 ответов на этот вопрос

  • 0

Что такое CartList? Зачем High использовать (от слова вообще)? Что такое rz? Если for 0 to 0, то 1 раз цикл выполнится.

P.S. Почему бы на форумах не перестать считать всех телепатами?
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • -1

High(CartList) - CartList это или Enumeration type - перечисление или массив.

В Enumeration значения идут от нуля. Т.е. TMyType = (Val1, Val2, Val3) - это по факту Byte со значениями 0, 1, 2.

High - вернет максимальный индекс из этого перечисления или массива. High(TMyType ) = 2 . Low соответсвенно вернет первый индекс - 0 или тот который идет первым (ведь массив может и не от нуля начинатся, если это указать в коде)
rz - обычная переменная integer

 

Если 0 to 0 - цикл не выполнится.

 

Изменено пользователем ENERGY

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
7 часов назад, Akad сказал:

Что такое CartList? Зачем High использовать (от слова вообще)? Что такое rz? Если for 0 to 0, то 1 раз цикл выполнится.

P.S. Почему бы на форумах не перестать считать всех телепатами?
 

потому что это не важно, проблема в том, что for iio := 0 to rz do begin назначает iio=1 и цикл не выполняет (rz=0 это написано)

причем если делаешь for iio := 1 to rz+1 do begin, в просмотре показывает iio=2 и цикл опять не выполняется

такое ощущение что firemonkey сошла сума

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

я тут соглашусь со Станиславским. не верю )

дайте код 

High - это ИНДЕКС последнего элемента массива

если в массиве 1 элемент, то индекс его равен 0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
TCartList  = array of TRec;
...
var lb:TListBoxItem;
rz:integer;
iio:integer;
CartList:TCartList;
Rec:TRec;
begin
  if CartList<>nil then begin
    rz:=Length(CartList);
    for iio := 0 to rz-1 do begin
      Rec:=CartList[iio];
    end;
  end;
end;

все банально

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

ну дык CartList - локальная переменная. не инициализирована.

её б сначала SetLength, а потом уже делать что-либо

 SetLength(CartList,1);
  if CartList<>nil then begin
    rz:=Length(CartList);
    for iio := 0 to rz-1 do begin
      Rec:=CartList[iio];
    end;
  end;

rz=1; цикл проходит 1 раз

все штатно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

ну дык CartList - локальная переменная. не инициализирована.

ну я же отделил ... это значит она объявлена где то еще и там все с ней сделано

по ней как раз проблем нет, проблема в цикле.

я пока другим циклом сделал while , а там "шамана надо вызывать" хотя в других процедурах for работает штатно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
8 минут назад, dim сказал:

ну дык CartList - локальная переменная. не инициализирована.

ну я же отделил ... это значит она объявлена где то еще и там все с ней сделано

по ней как раз проблем нет, проблема в цикле.

я пока другим циклом сделал while , а там "шамана надо вызывать" хотя в других процедурах for работает штатно

где может быть в другом месте инициализирована CartList  если в конкретном примере она объявлена в процедуре

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

блииииин, еще раз говорю CartList  не имеет отношения к вопросу, вопрос касается цикла

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

ну так и приведите пример то. циклы не могут быть сломаны. это привело бы к полному коллапсу 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
24 минуты назад, krapotkin сказал:

ну так и приведите пример то. циклы не могут быть сломаны. это привело бы к полному коллапсу 

какой еще пример привести?

я и так привел пример кода всей процедуры, написал какие значения получает переменная

rz:=Length(CartList); возвращает 1

соответственно  for iio := 0 to rz-1 do begin должен быть цикл от 0 до 0 (1-1=0) но он делает цикл от 1 до 0

если я делаю for iio := 1 to rz do begin то он делает от 2 до 1

значения iio я смотрю в отладчике

я уже не знаю как описать ситуацию более понятно для Вас и отстаньте от CartList она вообще тут не причем, я так же делал и rz:=1;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
11 часов назад, dim сказал:

по ней как раз проблем нет, проблема в цикле.

С циклом все в норме! Не надо "Ля-ля"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
20 часов назад, ENERGY сказал:

Если 0 to 0 - цикл не выполнится.

Мммм... Поспорим?

14 часов назад, dim сказал:

причем если делаешь for iio := 1 to rz+1 do begin, в просмотре показывает iio=2 и цикл опять не выполняется

Значит цикл выполняется. Просто у Rad Studio не все "ходы на мобильных платформах записаны". По крайней мере на 10.2 встречал, что крусор отладчика или прыгает взад-вперед, или пропускает небольшие блоки.

12 часов назад, dim сказал:

блииииин, еще раз говорю CartList  не имеет отношения к вопросу, вопрос касается цикла

Он есть в коде, рядом с циклом. Его длинна - это параметр цикла. Как может не иметь к нему отношения - для меня загадка.

12 часов назад, dim сказал:

если я делаю for iio := 1 to rz do begin то он делает от 2 до 1

Это реально или ваша фантазия?

12 часов назад, dim сказал:

значения iio я смотрю в отладчике

Стоит это значение смотреть в какой-то отдельной переменной. Цикловые переменные шанс корректно увидеть - это 1/2 или 2/3. 
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу