Показать сообщение отдельно
Старый 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)