Dim a(2) As String
Этот раздел не предназначен для того, чтобы вы адресовали свою проблему профессионалам.
0xy писал(а):Меня же интересует, возможно ли научить VB понимать этот тип данных, в частности, поднимать из файла такие массивы (без ручной обработки)?
Меня же интересует, возможно ли научить VB понимать этот тип данных
0xy писал(а):в частности, поднимать из файла такие массивы (без ручной обработки)?
0xy писал(а):разделительные нули уже есть в файле.
0xy писал(а):Разобрать такой файл вручную несложно. Но прежде, чем извращаться, я решил узнать о возможностях языка в этом плане...
Sub ReadSTR(ArrSTR$(), FileName$)
Dim fBuffer() As Byte, fHandle&, i&, j&, k&
fHandle = FreeFile
Open FileName For Binary Access Read Shared As fHandle
ReDim fBuffer(1 To LOF(fHandle))
Get fHandle, , fBuffer
Close fHandle
ReDim ArrSTR(0 To 0)
k = 1
For i = 1 To UBound(fBuffer)
If fBuffer(i) = 0 Then
ReDim Preserve ArrSTR(0 To UBound(ArrSTR) + 1)
For j = k To i
ArrSTR(UBound(ArrSTR)) = ArrSTR(UBound(ArrSTR)) & Chr(fBuffer(j))
Next j
k = i + 1
End If
Next
End Sub
ReDim ArrSTR(1 To 1)
k = 1
For i = 1 To UBound(fBuffer)
ArrSTR(k) = ArrSTR(k) & Chr(fBuffer(i))
If fBuffer(i) = 0 Then
ReDim Preserve ArrSTR(0 To k + 1)
k = k + 1
End If
Next
0xy писал(а):Ну а автоматически--что-то вроде:
Dim fBuffer() as NullTerminatedString '
Get fHandle,,fBuffer
Но, как я понял, такого не бывает?
Viper писал(а):А что, функцию Split не судьба поиспользовать?
0xy писал(а): Viper писал(а):А что, функцию Split не судьба поиспользовать?
Можно по подробнее, что за зверь? (Access 97 не знает такой буквы, а справки по VB6 (MSDN) у меня нет )
MSDN писал(а):Returns a zero-based, one-dimensional array containing a specified number of substrings.
Syntax
Split(expression[, delimiter[, limit[, compare]]])
0xy писал(а):Можете привести пример со структурой?
type t
s() as string
end type
...
dim tt as t, i as long
redim tt.s(0 to 30)
for i = 0 to 30
tt.s(i) = "любая строка"
next i
...
dim frf as integer
frf=freefile
open "имя файла" for binary as #frf
put #frf,,tt
close #frf
...
...
dim tt as t,frf as integer
frf=freefile
open "имя файла" for binary as #frf
get #frf,,tt
close #frf
...
Dim sStr As String, sDl As String
Dim sRs() As String
sDl = Chr$(0)
sStr = "first string" & sDl & "second string" & sDl & "third string"
sRs = Split(sStr, sDl)
sRs(0) = "first string"
sRs(1) = "second string"
sRs(2) = "third string"
Может перенести в VBA?0xy писал(а):Походу, в Access97 точно не работает.
Имеется ввиду подфорум VBA.0xy писал(а):Viper
?? Откуда перенести? А "в Access97"--это, по-вашему, где?
А что есть то? Массив байт чем не строка?0xy писал(а):Только в данной задаче исходному String неоткуда взяться, так что таки не судьба.
Накатал пример, который доказывает, что можно использовать String как null-terminated.String--эт конечно круто! ))) Только с чего вы взяли, что он Null Terminated?
Хотелось бы создать массив из онных
Dim Ar() As NullTerminatedString
Debugger писал(а):2 burik: Разве?
Проверял компилированный файл или в среде запускал?burik писал(а):Debugger писал(а):2 burik: Разве?
Извиняюсь. Проверил - Split намного быстрее. Я почему-то думал, что будет наоборот..
Viper писал(а):А что есть то? Массив байт чем не строка?
CallWindowProc(pCode,pByteArrey,pString)
{Code == Mov pString, pByteArrey}
Viper писал(а):Проверял компилированный файл или в среде запускал?
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
(ByVal pBinaryCode As Long, _
ByVal Variable As Long, _
Optional ByVal lMSG As Long, _
Optional ByVal lp3 As Long, _
Optional ByVal lp4 As Long) As Long
Dim a() As Byte
ReDim a(4)
a(1) = &H30
a(2) = &H32
a(3) = 0
a(4) = &H33
Arrey2String = ByteArr2String(a)
Stop
Function ByteArr2String$(ByteArr() As Byte)
Const Asm$ = "55 8B EC 60 8B 4D 10 8B 7D 0C 8B 75 08 89 4F FC F3 A4 61 5D C2 10 00 "
Dim BinaryCode() As Byte, i&
ReDim BinaryCode(1 To Len(Asm) / 3)
For i = 1 To Len(Asm) / 3 ' заполняем массив ASM-кода
BinaryCode(i) = Val("&h" & (Mid(Asm, (i - 1) * 3 + 1, 2)))
Next
CallWindowProc VarPtr(BinaryCode(1)), VarPtr(ByteArr(1)), VarPtr(ByteArr2String), UBound(ByteArr)
' 55 PUSH EBP
' 8BEC MOV EBP,ESP
' 60 PUSHAD
' 8B4D 10 MOV ECX,DWORD PTR SS:[EBP+10]
' 8B7D 0C MOV EDI,DWORD PTR SS:[EBP+C]
' 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8]
' 894F FC MOV DWORD PTR DS:[EDI-4],ECX
' F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
' 61 POPAD
' 5D POP EBP
' C2 1000 RET 10
End Function
0xy писал(а):Верно?
Сейчас этот форум просматривают: Yandex-бот и гости: 11