forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ и уроки (http://forum.boolean.name/forumdisplay.php?f=110)
-   -   Чтение данных из потоков и передача их в функцию (http://forum.boolean.name/showthread.php?t=9645)

Жека 26.10.2009 07:32

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

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

Код:

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)

jimon 26.10.2009 10:50

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

а вот :
Цитата:

параметры функции записать в обратном порядке без изменения тела функции:
прям в книжку вредные советы надо записать, а что если в другой системе или при другом вызове функции порядок поменяется ? ;)

Жека 26.10.2009 11:10

Ответ: Чтение данных из потоков и передача их в функцию
 
про безопасность и удобность (с точки зрения понимания логики) использования предложенных вариантов, точнее - второго, я умолчал :)
не знаю на счёт изменений порядка в другой системе, но мне кажется, что он останется прежним

impersonalis 26.10.2009 12:05

Ответ: Чтение данных из потоков и передача их в функцию
 
:@ [:]|||||[:]

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

Цитата:

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

Код:

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

Код:

a=ReadInt(file)
b=ReadInt(file)
CreateSphere2D(a,b)



Жека 26.10.2009 15:03

Ответ: Чтение данных из потоков и передача их в функцию
 
Угу. спасибо!


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot