IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
Работа с функциями, Странности работы DBPro
Agny
сообщение 2.3.2013, 7:15
Сообщение #1


Активный участник
***

Группа: Пользователи
Сообщений: 267
Регистрация: 10.1.2013
Из: Kazahstan,Pavlodar
Пользователь №: 65718



Часто в разных исходниках выложенных в интернет встречается вот такая функция:

Код
Function Free_Object()
    repeat
        inc a
    until object exist(a)=0
endfunction a


Всё прекрасно работает . Решил я использовать её и в своих проектах. Всё тоже у меня работало.
Но в один прекрасный день я начал новый проект . И скопировал эту функцию в него.
И программа стала выдавать ошибку. Всё написано правильно , но не работает.
Оказалось что когда программа обращается к функции. Переменной "а" может быть присвоено случайное значение.
И получается ошибка.

После того как я исправил код , всё заработало. Он стал выглядеть так :

Код
Function Free_Object()
   a = 0
    repeat
        inc a
    until object exist(a)=0
endfunction a


Но больше всего поразило меня то что одна и та же функция , на одном и том же компьютере с одной и той же системой с одной и той же версией DBPro может в одном проекте работать , а в другом нет( или работать подругому).
Непонятно почему так.
Перейти в начало страницы
 
+Цитировать сообщение
Kolyanoid
сообщение 9.3.2013, 20:20
Сообщение #2


. . .-= SPK Games =-. . . Модератор v3.2 alpha . . Linuxoid v0.5
***

Группа: Администраторы
Сообщений: 3521
Регистрация: 1.9.2004
Из: Москва
Пользователь №: 15



А переменная "а" не задана как глобальная?
Если нет, то это баг в чистом виде.


--------------------
Мои координаты:
  • Jabber: kolyanoid@jabber.ru
  • Почта: kolyanoid [at] mail333.com
  • Вконтакте: id64896
«Есть только две бесконечные вещи: Вселенная и глупость. Хотя насчет Вселенной я не уверен». (Альберт Эйнштейн)
Перейти в начало страницы
 
+Цитировать сообщение
Agny
сообщение 11.3.2013, 15:49
Сообщение #3


Активный участник
***

Группа: Пользователи
Сообщений: 267
Регистрация: 10.1.2013
Из: Kazahstan,Pavlodar
Пользователь №: 65718



Нет, переменную "а" я как глобальную не устанавливал.

Я , вообще , до этого предполагал , что возможно что переменной "а" может быть присвоено случайное значение.
Но не ожидал, что будет в разных проектах так работать. Причем как это можно объяснить? Непонятно ...
Может так просто совпало. Но я несколько раз попробовал запустить программу, неработала...

Сейчас я во всех функциях локальные переменные , которые могут также вызвать ошибку, в начале кода обнуляю.
Перейти в начало страницы
 
+Цитировать сообщение
Kolyanoid
сообщение 12.3.2013, 4:11
Сообщение #4


. . .-= SPK Games =-. . . Модератор v3.2 alpha . . Linuxoid v0.5
***

Группа: Администраторы
Сообщений: 3521
Регистрация: 1.9.2004
Из: Москва
Пользователь №: 15



Вообще в С/С++ при объявлении переменной у нее значение случайное и не обязательно =0 (вернее, оно равно содержимому блока памяти, который она занимает) изначально и ее нужно обнулять отдельно при необходимости.
Так что там это нормально.

Но в Бейсик-подобных языках такого быть не должно - это баг.


--------------------
Мои координаты:
  • Jabber: kolyanoid@jabber.ru
  • Почта: kolyanoid [at] mail333.com
  • Вконтакте: id64896
«Есть только две бесконечные вещи: Вселенная и глупость. Хотя насчет Вселенной я не уверен». (Альберт Эйнштейн)
Перейти в начало страницы
 
+Цитировать сообщение
3DSchumacher
сообщение 10.10.2013, 14:23
Сообщение #5


Активный участник
***

Группа: Пользователи
Сообщений: 771
Регистрация: 3.6.2005
Из: Украина, г. Житомир
Пользователь №: 308



Не уверен насколько этот вопрос еще актуален, но это определенно не баг. Скорее фича. При вызове следующей функции из текущей функции, все переменные текущей функции становятся глобальными для следующих функций аж до самого конца итераций, хоть там их 250 штук одна из другой вызываются. Такие дела.

з.ы. вот не люблю когда тёмного Васю обижают, потому и написал smile.gif


--------------------
...между айсбергом и небом гордо реет Cacodemon...
Перейти в начало страницы
 
+Цитировать сообщение
Agny
сообщение 10.10.2013, 16:12
Сообщение #6


Активный участник
***

Группа: Пользователи
Сообщений: 267
Регистрация: 10.1.2013
Из: Kazahstan,Pavlodar
Пользователь №: 65718



3DSchumacher, а где ты видел здесь вызов следующей функции из текущей функции?

Вообще не понял тебя. unsure.gif
Перейти в начало страницы
 
+Цитировать сообщение
KiD
сообщение 10.10.2013, 16:48
Сообщение #7


Не очень активный участник
***

Группа: Администраторы
Сообщений: 1255
Регистрация: 2.6.2006
Из: Kazakhstan, Almaty
Пользователь №: 65536



Да ладно вам...

Код
To re-enforce the variable is global, you can declare it as follows:

GLOBAL myglobal AS INTEGER
For local variables, you can re-enforce the declaration as follows

FUNCTION myfunction()
LOCAL mylocal as INTEGER
ENDFUNCTION


--------------------
GlaZ жив!
Перейти в начало страницы
 
+Цитировать сообщение
Agny
сообщение 10.10.2013, 17:21
Сообщение #8


Активный участник
***

Группа: Пользователи
Сообщений: 267
Регистрация: 10.1.2013
Из: Kazahstan,Pavlodar
Пользователь №: 65718



Т.е хотите сказать что переменная "а" используется где то ещё в коде, не только в функции.

Обычно я такое не использую, потому что знаю что от Дарка можно ожидать сюрпризов.

Но проверить была ли переменная использована ещё где то уже не смогу, поскольку давно это было и код тот у меня не сохранился.
Перейти в начало страницы
 
+Цитировать сообщение
KiD
сообщение 10.10.2013, 17:30
Сообщение #9


Не очень активный участник
***

Группа: Администраторы
Сообщений: 1255
Регистрация: 2.6.2006
Из: Kazakhstan, Almaty
Пользователь №: 65536



хочу сказать что для предотвращения таких "непоняток" лучше руками указывать какая переменная будет глобальной, а какая локальной и т.д.... тогда и ругательств в сторону дарка и его создателя будет чуточку меньше wink.gif


--------------------
GlaZ жив!
Перейти в начало страницы
 
+Цитировать сообщение
3DSchumacher
сообщение 11.10.2013, 12:50
Сообщение #10


Активный участник
***

Группа: Пользователи
Сообщений: 771
Регистрация: 3.6.2005
Из: Украина, г. Житомир
Пользователь №: 308



Цитата(Agny @ 10.10.2013, 17:21) *
Т.е хотите сказать что переменная "а" используется где то ещё в коде, не только в функции.

Да. Ибо в процессе компиляции код, лежащий внутри функции, всего лишь подсовывается в то место исходника, откуда она вызывается. Отсюда кстати и лимит на максимальное число итераций. Иначе компилятор просто не сможет собрать исходник, в котором функции вызывают одна-другую рекурсивно. Такие дела. Так что да, Кид прав на все 100%, только ручное обьявление глобальных переменных с их адекватным обзыванием. Лично у меня все глобальные переменные начинаются на "g_". Ну и стараться не вызывать подфункции из функций в произвольных местах, где приспичит. Код любит порядок wink.gif


--------------------
...между айсбергом и небом гордо реет Cacodemon...
Перейти в начало страницы
 
+Цитировать сообщение
Agny
сообщение 11.10.2013, 14:30
Сообщение #11


Активный участник
***

Группа: Пользователи
Сообщений: 267
Регистрация: 10.1.2013
Из: Kazahstan,Pavlodar
Пользователь №: 65718



Хотя, собственно, решение уже давно найдено, без всяких объявлений глобальных и локальных переменных - просто обнулить переменную в начале функции и всё... wink.gif
Перейти в начало страницы
 
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 26.9.2017, 10:29
 X 
Ссылки на работы форумчан:
1. Cайт по использованию 3D технологий
в образовании

2. 15 Defense. Underwater Battle

3. GlaZ в Steam Greenlight