Показать сообщение отдельно
Старый 13.08.2012, 08:47   #7
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Возвращение нескольких результатов из функции + Разбиение строки по символу

Метод №2: использование связных списков

Здесь пример использования подобия связного списка для возвращения неограниченного числа параметров из функции.

;создание списка с параметрами - головной узел
Function fnRetValCreate.TRetVal(s$="", i%=0, f#=0)
	Local rv.TRetVal = New TRetVal
	rv\root = rv
	rv\sVal = s
	rv\iVal = i
	rv\fVal = f
	Return rv
End Function

;добавление нового результата
Function fnRetValAdd.TRetVal(retval.TRetVal, s$="", i%=0, f#=0)
	;если ещё не создан, то создаём новый
	If(retval = Null) Then Return fnRetValCreate(s, i, f)
	retval\nxt = New TRetVal
	retval\nxt\root = retval\root
	retval\nxt\sVal = s
	retval\nxt\iVal = i
	retval\nxt\fVal = f
	Return retval\nxt
End Function

;удаление всех результатов
Function fnRetValDelete(retval.TRetVal)
	Local node.TRetVal = retval\root
	While(node <> Null)
		retval = node
		node = node\nxt
		Delete(retval)
	Wend
End Function

;тип для хранения результатов (строки, целые и дробные)
Type TRetVal
	Field sVal$, iVal%, fVal# ;сами данные
	Field nxt.TRetVal ;указатель на следующего
	Field root.TRetVal ;указатель на головной узел
End Type
Для примера использования этого метода ниже представлена функция выценления параметров командной строки - с учётом того, что часть параметров может быть заключена в кавычки, а часть просто через пробел.

Local cl$ = CommandLine()
If(cl = "") Then End
DebugLog(cl)

Local rv.TRetVal = fnParseCommandLine(cl)
Local node.TRetVal = rv
Local file% = WriteFile("files.txt")
;пробегаем по всем результатам
While(node <> Null)
	WriteLine(file, node\sVal)
	node = node\nxt
Wend
CloseFile(file)
;удаляем список с результатами
fnRetValDelete(rv)

End

;в командной строке параметры, содержащие пробелы, обрамляются кавычками
;остальные - нет
Function fnParseCommandLine.TRetVal(cl$)
	Local size% = Len(cl)
	Local k%, cnt%, s$="", char$, q$ = Chr(34) ;кавычка
	Local retval.TRetVal
	For k% = 1 To size ;проходим по всем буквам
		char = Mid(cl, k, 1)
		If(char = q) ;встретилась кавычка
			cnt = cnt+1
			DebugLog("1")
			If(cnt = 2) ;закрылась кавычка
				retval = fnRetValAdd(retval, s)
				s = ""
				k = k+1 ;пропускаем пробел
				cnt = 0
			EndIf
		Else If(char = " " And cnt = 0) ;если пробел не внутри кавычек, то он отделяет параметры
			retval = fnRetValAdd(retval, s)
			s = ""
			DebugLog("2")
		Else
			s = s + char
			If(k = size) ;если достигли конца строки, то последний параметр забираем тоже
				DebugLog("3")
				retval = fnRetValAdd(retval, s)
			EndIf
		EndIf
	Next
	Return retval\root ;возвращаем указатель на корень списка
End Function
ПС. Если кто-то знает как в блитц максе выцепить из командной строки русские символы, то подскажите - нужно такое: кидаем файл, содержащий в пути или названии кириллицу, на ехе-шник, и нужно достать/преобразовать путь так, чтоб можно было сделать с ним LoadImage() и прочее.
(Offline)
 
Ответить с цитированием