Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > BlitzMax > FAQ и уроки

Ответ
 
Опции темы
Старый 26.10.2009, 07:32   #1
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Чтение данных из потоков и передача их в функцию

Экономия на объявлении переменных может привести к нежелательным последствиям.
В частности, так происходит при передаче в качестве параметров функции нескольких читаемых из потока данных.

Пусть мы хотим загрузить данные из файла и передать их в функцию.
При этом мы можем написать так:

myFunc(ReadInt(file),ReadFloat(file),ReadFloat(file))
Тем самым, мы передаём в нашу функцию нужные параметры, и вроде как экономим на создании 3х переменных.

НО!

Параметры в функции подставляются справа-налево! Вот здесь и выходит боком экономия.

Ниже приведён небольшой пример, подтверждающий возникновение нежелательного результата.

Strict

'имитируем загрузку из файла:
' сами предварительно записываем данные в поток
' а затем считываем эти данные

'открываем поток с привязкой к банку памяти
Local stream:TStream = OpenStream(New TBank)

'записываем данные
WriteLine(stream, "param 1")
WriteLine(stream, "param 2")
WriteLine(stream, "param 3")

'ставим позицию в начало, т.к. будем читать данные из потока
SeekStream(stream, 0)

'читаем и печатаем данные
fnPrintParams(ReadLine(stream), ReadLine(stream), ReadLine(stream))

'закрываем поток
CloseStream(stream)

'говорим что тут конец программы
End


'функция для печати полученных параметров
Function fnPrintParams(param1:String, param2:String, param3:String)
	Print param1
	Print param2
	Print param3
End Function
Выполнив его, мы видим, что напечатались данные в обратном порядке:
param 3
param 2
param 1


Для предотвращения подобных неувязок можно:
1. ввести дополнительные переменные, читать данные в них, а потом передавать в функцию:

Local p1 = ReadInt(file)
Local p2# = ReadFloat(file)
Local p3# = ReadFloat(file)
myFunc(p1,p2,p3)
2. параметры функции записать в обратном порядке без изменения тела функции:

function myFunc(p3#,p2#,p1)
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Жека за это полезное сообщение:
BlackOut (28.12.2009), Nex (26.10.2009)
Старый 26.10.2009, 10:50   #2
jimon
 
Сообщений: n/a
Ответ: Чтение данных из потоков и передача их в функцию

Жека
не обязательно справа-налево, вообще порядок вычисления аргументов никак не гарантируется, хотя тут порядок справа-налево можно объяснить тем что аргументы передаются через стек
в прочем раньше и прерывания вычисления выражения типа AAA and BBB and CCC не было, вычислялось полностью даже если одна из переменных была false

а вот :
параметры функции записать в обратном порядке без изменения тела функции:
прям в книжку вредные советы надо записать, а что если в другой системе или при другом вызове функции порядок поменяется ?
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо за это полезное сообщение:
BlackOut (28.12.2009), impersonalis (26.10.2009)
Старый 26.10.2009, 11:10   #3
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Чтение данных из потоков и передача их в функцию

про безопасность и удобность (с точки зрения понимания логики) использования предложенных вариантов, точнее - второго, я умолчал
не знаю на счёт изменений порядка в другой системе, но мне кажется, что он останется прежним
(Offline)
 
Ответить с цитированием
Старый 26.10.2009, 12:05   #4
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Смущение Ответ: Чтение данных из потоков и передача их в функцию

[:]|||||[:]

www.boolean.name > Программирование игр для компьютеров > Blitz3D > FAQ
LOAD-SAVE

И ещё: чтобы не запутаться в порядке загрузки и передачи загруженного в функции, лучше конструкции типа:

CreateSphere2D(ReadInt(file),ReadInt(file))
заменять на:

a=ReadInt(file)
b=ReadInt(file)
CreateSphere2D(a,b)
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
LLI.T.A.L.K.E.R. (02.06.2014)
Старый 26.10.2009, 15:03   #5
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Чтение данных из потоков и передача их в функцию

Угу. спасибо!
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
передача данных через GPRS Mirik1 MidletPascal 22 01.02.2010 21:17
CSD передача данных на комьютер Mirik1 MidletPascal 8 07.11.2009 14:35
Передача данных м/у телефонами Krechet Основной форум 6 06.07.2009 19:22
Как вызвать API функцию MessageBox()? ArtemkA 3D-программирование 5 20.06.2009 18:21
Написал функцию гравитации X Y Z TEHb08 Blitz3D 0 05.01.2009 04:06


Часовой пояс GMT +4, время: 03:06.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com