yann сказал(а):всем привет,
нужен срочный хелп. собственно, сабж: из переменной типа string необходимо получить все символы в array. К сожалению, в хелпе ничего не нашел...
ЗЫ. в паскале это выглядит так: string, в корелскрипт эта структура не работает...
Sub stringToArray(s As String, ByRef a() As Byte)
Dim fNum As Byte
Dim f As String
Set fs = CreateObject("Scripting.FileSystemObject")
ReDim a(Len(s))
f = fs.GetSpecialFolder(2) + "\" + fs.GetTempName
fNum = FreeFile()
Open f For Output As #fNum
Print #fNum, s
Close #fNum
Open f For Binary As #fNum Len = Len(s)
Get #fNum, , a
Close #fNum
fs.DeleteFile (f)
End Sub
Arkady сказал(а):Можно так (один из способов без использования Win32 API):
Код:Sub stringToArray(s As String, ByRef a() As Byte) Dim fNum As Byte Dim f As String Set fs = CreateObject("Scripting.FileSystemObject") ReDim a(Len(s)) f = fs.GetSpecialFolder(2) + "\" + fs.GetTempName fNum = FreeFile() Open f For Output As #fNum Print #fNum, s Close #fNum Open f For Binary As #fNum Len = Len(s) Get #fNum, , a Close #fNum fs.DeleteFile (f) End Sub
'numb$ - переменная, которую требуется загнать в массив
DIM _label (len(numb$))
tmp$=numb$
for i% = 1 to len(numb$)
_label(i%) = ASC(tmp$)
MID(tmp$,1,1)=chr(32)
tmp$ = LTRIM(tmp$)
next
Очень «долгоиграющий» кодyann сказал(а):Нормальные герои всегда идут в обход...
…1) функция ASC …
2) функция MID…
3) функция LTRIM…
Таким образом, циклом, длина которого равна… bla-bla-bla… для этого понадобилось использовать временную переменную tmp$).
Sub String2Vector(ByVal sSRC As String, _
ByRef s() As String * 1)
Dim L As Integer
L = Len(sSRC) - 1
ReDim s(L)
For i% = 0 To L
s(i%) = Mid$(sSRC, i% + 1, 1)
Next
End Sub
REM =================================================
REM Описание интерфейса с Win32 API
REM Желательно вынести в отдельный модуль, заменив Private на Public
REM =================================================
Private Declare Function str2bytes& Lib "kernel32" Alias "lstrcpyA" _
(ByRef bFirst As Byte, _
ByVal lpString2 As String)
Private Declare Function lstrlen& Lib "kernel32" Alias "lstrlenA" _
(ByVal lpString As String)
REM ===============================================
REM Далее собственно сама «чудо»-процедура
REM Предполагается, что передаваемая строка всегда непустая,
REM т.е. содержит минимум один символ, отличный от нуля.
REM ===============================================
Sub String2Vector(ByVal sSRC As String, _
ByRef b() As Byte)
ReDim b(lstrlen&(sSRC) - 1)
lResult& = str2bytes&(b(0), sSRC) ' /* Вот, собственно, и всё :p */
End Sub
Не стОит ёрничать, Аркадий. Программирование - не самая сильная моя сторона, единственно, почему этим занимаюсь - производственная необходимость. Тем не менее благодарю за подробный и развернутый ответ.Arkady сказал(а):на уровне урока информатики 5-го класса Верхнемухосранской церковноприходской школы.
Hippo сказал(а):А почему не на ассемблере?
Странно, Аркадий, что использование/знание функций Виндоус Вы приравниваете к умению строить хорошие алгоритмы...
Я с ваших слов прямо смеюся… Какой-то прямо пораженческий подход к делу. А вдруг это преобразование запускается 10.000.000 раз c рекурсивным вызовом самое себя (кстати, еще один вариант преобразования — особо нешустрый)?Наверняка этот кусок стоит внури какой-нибудь процедуры, которая или читает с диска файлег метров в 100, или его записывает, или делает в Кореле две-три тысячи объектов...
Поэтому никакого прироста заметно не будет...