asdf8 сказал(а):
судя по скудному набору функций для работы с массивами и практически все эти функции корректно работают только с одномерными массивами.
Почему вы так решили?
Размер массива можно узнать с помощью функции
ArraySize и эта функция работает с многомерными массивами!
Dim MyArray(10, 20, 30, 40)
Debug ArraySize(MyArray(),1)
Debug ArraySize(MyArray(),2)
Debug ArraySize(MyArray(),3)
Debug ArraySize(MyArray(),4)
Вот передача массива в процедуру.
Обратите внимание что массив многомерный и явно не передается его размер.
Procedure fill(Array A.l(2)) ; the 1 stays for the number of dimensions in the array
x1=ArraySize(A(),1)
x2=ArraySize(A(),2)
y=0
For i = 0 To x1
For z = 0 To x2
A(i, z) = y
y + 1
Next z
Next i
EndProcedure
Dim A.l(10, 20)
fill(A()) ; the array A() will be passed as parameter here
Debug A(5, 1)
Debug A(10, 2)
Yashied сказал(а):
Я, после того, как написал
Copy UDF, забил на этот PureBasic.
Посмотрел исходник...
И честно не мог понять зачем WinAPI функции непосредственно вызывать из системных DLL?
Ведь это:
CallFunction(Kernel, "CopyFileExW", *Param\Source, *Param\Destination, *Param\Proc, *Param\Ptr, *Param\Cancel, *Param\Flags)
Можно было бы записать так:
CopyFileEx_(*Param\Source, *Param\Destination, *Param\Proc, *Param\Ptr, *Param\Cancel, *Param\Flags)
Зачем было самостоятельно выделять память под структуру
*Param.Parameters = AllocateMemory(SizeOf(Parameters))
если можно было бы без этого обойтись?
Еще там есть такие строки:
SourceLen.l = 2 * (CallFunction(Kernel, "lstrlenW", *Source) + 1)
DestinationLen.l = 2 * (CallFunction(Kernel, "lstrlenW", *Destination) + 1)
Почему бы не сделать так?
SourceLen = MemoryStringLength(*Source, #PB_Unicode)
DestinationLen = MemoryStringLength(*Destination, #PB_Unicode)
В общем, не были использованы все возможности PureBasic и многое сделано через :-[
Возможно поэтому показалось что все так сложно!
Yashied сказал(а):
Постоянная каша с определением типов через "." просто убивает...
Переменные по умолчанию имеют тип Integer (4 байта для x86 и 8 байт для x64, знаковые положительные и отрицательные числа).
Тип переменной нужно указать только один раз при ее первом использовании.
Yashied сказал(а):
А о "гаджетах" я вообще лучше промолчу. А еще там очень бестолковая справка. Вроде, на первй взгляд, все, что необходимо, написано, красиво оформлена, а на деле от нее очень мало толку.
А что с гаджетами не так?
Они используются при создании оконного интерфейса в программах (в некоторых других средах из называют контролами).
По моему, справка оформлена нормально, все отсортировано по разделам, есть перекрестные ссылки при описании взаимосвязанных функций.
Yashied сказал(а):
Например, попробуйте написать на C# или том же PB функцию WinWait()...
Если сделать так чтобы лишь работало, то код будет таким:
Procedure WinWait(Title.s, Timeout)
Delay(Timeout)
ProcedureReturn FindWindow_(0, Title)
EndProcedure
Debug WinWait("Диспетчер задач Windows", 100)
А вот так по правилам, с точной выдержкой таймаута:
Procedure WinWait(Title.s, Timeout)
result=0
TimeStart = ElapsedMilliseconds()
Repeat
HWND=FindWindow_(0, Title)
If HWND
result=HWND : Break
Else : Delay(2)
EndIf
Until ElapsedMilliseconds()-TimeStart > Timeout
ProcedureReturn result
EndProcedure
Debug WinWait("Диспетчер задач Windows", 100)