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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.01.2009, 02:21
Haki Haki вне форума
Прохожий
 
Регистрация: 14.01.2009
Сообщения: 2
Репутация: 10
Восклицание Обнуление первого формального параметра в функции

Собтвенно есть данный код:
Код:
function fint (x , y: array of real; x0:real; kol:integer ):real;
  var
    i:integer;
    begin
	    for i:= 1 to (kol - 1) do
        begin
		      if ( x0 >= x[i]) and (x0<=x[i+1] ) then
            begin
			        fint:=  y[i] + ( x0 - x[i] ) * ( y[i+1] - y[i] ) /
                                                      ( x [ i + 1 ] - x [ i ] );
			      exit;
            end;

	      end; //of for

	    if ( x0>x[kol] ) then fint:= y[kol]
	    else fint:= y[1]
	    end;

Вся проблемма заключается в том, что при переходе к
Код:
 for i:= 1 to (kol - 1) do
входной параметр х просто берет и обнуляется.
Проводил отладку по шагам, после begin'a массив из 10 непустых значений превращается в массив из одного элемета со значение 0.. .

С чем это может быть связано?
Ответить с цитированием
  #2  
Старый 14.01.2009, 03:44
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,048
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Не могёт такого быть. Смотри внимательно что передаётся в функцию (в месте вызова).
Да, возможно придется описать параметры-массивы как Array Of Const.
Ответить с цитированием
  #3  
Старый 14.01.2009, 03:56
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Хотел написать сам, но заглянул в справку и понял что лаконичней у меня не получится. Читай и думай:
Цитата:
Within the body of a routine, open array parameters are governed by the following rules.

They are always zero-based. The first element is 0, the second element is 1, and so forth. The standard Low and High functions return 0 and Length - 1, respectively. The SizeOf function returns the size of the actual array passed to the routine.
They can be accessed by element only. Assignments to an entire open array parameter are not allowed.
They can be passed to other procedures and functions only as open array parameters or untyped var parameters. They cannot be passed to SetLength.

Instead of an array, you can pass a variable of the open array parameter's base type. It will be treated as an array of length 1.

When you pass an array as an open array value parameter, the compiler creates a local copy of the array within the routine's stack frame. Be careful not to overflow the stack by passing large arrays.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #4  
Старый 14.01.2009, 04:12
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,048
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Мда, я в справку не глядел.
С другой стороны почему обнуляется все равно не понятно. То, что там может возникнуть выход за границу массива - это да (надо пользоваться функциями Low() & High()). А вот обнуления быть все-равно не должно.

Т.е. в приведенном коде нарушено только одно правило (считает, что массив начинается с 1, а не с 0, т.е. возможен выход за границу массива), но все должно работать. Все-таки, наверное, что-то не то передается в функцию.
Ответить с цитированием
  #5  
Старый 14.01.2009, 11:55
Ama Ama вне форума
Активный
 
Регистрация: 15.07.2008
Сообщения: 260
Репутация: 23
По умолчанию

Я думаю, что тебе в параметрах функции вместо x , y: array of real; надо объявлять x , y: Tarray_of_real где Tarray_of_real это новый тип: Tarray_of_real = array of real.
Ответить с цитированием
  #6  
Старый 14.01.2009, 13:28
Haki Haki вне форума
Прохожий
 
Регистрация: 14.01.2009
Сообщения: 2
Репутация: 10
По умолчанию

В функциию все передавалось как надо, глюки начались после перехода интерпретатора за строчку с begin

Почитал кусок хелпа.
Проблемма решилась тем что все массивы в програме объеявленны как
начинающиеся с 1 позиции. [1...n] в этом собственно и крылась проблема.

Всем спасибо за советы!
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter