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

Метод №1: использование глобальных массивов.

У этого метода есть ограничение, о котором ниже, но для простых каких-то задач сгодится.
Как альтернатива - свои списки (упрощённые) использовать (может допишу с ними пример сделал, ниже по теме "метод №2").

Была задачка разбить строку на подстроки по знаку-разделителю. Я захотел вернуть массив строк.
Просто через "Return mas" блитц не умеет. Поэтому я сделал глобальный массив для хранения результатов работы функции.

;инфа для возврата значений из функций
Dim RETVAL_STR$(0)
Global RETVAL_COUNT%

;smb - 1 символ типа запятой
Function fnSplitString(s$,smb$=",")
	Local size% = Len(s)
	Local cnt% = 0, k%
	;сначала находим количество символов-разделителей
	For k% = 1 To size
		If(Mid(s,k,1) = smb) Then cnt = cnt + 1
	Next
	RETVAL_COUNT = cnt+1 ;запоминаем размер
	Dim RETVAL_STR(cnt) ;расширяем до нужного размера
	If(cnt = 0)
		RETVAL_STR(0) = s
		Return
	EndIf
	;теперь снова проходим, заполняя глобальный массив
	Local val$ = "", char$, ind% = 0
	For k% = 1 To size
		char = Mid(s,k,1)
		If(char = smb)
			RETVAL_STR(ind) = val
			val = ""
			ind = ind+1
		Else
			val = val + char
			If(k = size) Then RETVAL_STR(ind) = val ;последнюю подстроку тоже
		EndIf		
	Next
End Function
На оптимальность работы функции я не претендую, мне нужно от неё парсить параметры в строчках типа
130,30,30
в момент загрузки уровня.

Пример использования:
fnSplitString("100,exit,-7")
For k% = 0 To RETVAL_COUNT-1
	DebugLog("RETVAL_STR("+k+") = "+RETVAL_STR(k))
Next
Теперь о грустном. Вот это работать будет криво или загнётся:
Local s1$ = "0,0;1,0;1,1;0,1", s2$
fnSplitString(s1, ";") ;сначала разбиваем по точке-с-запятой
For k% = 0 To RETVAL_COUNT-1
	DebugLog("RETVAL_STR("+k+") = "+RETVAL_STR(k))
	fnSplitString(RETVAL_STR(k),",") ;теперь по запятой
	For i% = 0 To RETVAL_COUNT-1
		DebugLog("RETVAL_STR_2("+i+") = "+RETVAL_STR(i))
	Next
Next
Очередной вызов функции затрёт массив, который используется в другом месте.

Последний раз редактировалось Жека, 13.08.2012 в 08:23. Причина: Поправил мелочи, назвал это метод №1
(Offline)
 
Ответить с цитированием