Что нового

[Массивы] Как записать массив область памяти и потом извлечь?

The Dream

Новичок
Сообщения
393
Репутация
3
Подскажите пожалуйста, как возможно записать массив в область памяти и потом его благополучно извлечь. :whistle:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
The Dream,
Какой массив (пример)? В чью память (чужого приложения или своего)? И, вообще, желательно конкретизировать задачу.
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
madmasles
Вот что я набросал пока - но увы, как хотелось бы - не работает.

Код:
#include <WinAPIEx.au3>

Global Const $sParam = "char Array"
Dim $aArray[5]

$aArray[1]=111
$aArray[2]=222

$pParam = _WinAPI_CreateBuffer(32)
$tParam = DllStructCreate($sParam, $pParam)
DllStructSetData($tParam, "Array", $aArray)

$sResult = DllStructGetData($tParam,'Array',1)

_WinAPI_FreeMemory($pParam)

MsgBox(16,'',$sResult)


То есть как бы то все просто, но на деле..
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
а походу никак. только передать его как строку, в которой каждый индекс массива разделен знаком. получающая сторона используя StringSplit из строки делает массив
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Запихнуть массив в память можно только лишь поэлементно.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
По элементно, например массив целых чисел
Код:
#include <WinAPISys.au3>

;массив целых чисел
Local $tST = DllStructCreate('int blbala[2];')
;Записываем данные, по элементно
DllStructSetData($tST,'blbala',100,1)
DllStructSetData($tST,'blbala',101,2)

;Выделяем блок памяти с этими данными
$pBuff = _WinAPI_CreateBufferFromStruct($tST,DllStructGetPtr($tST))

;Получаем данные обратно
$tOut = DllStructCreate('int blbala[2];',$pBuff)
ConsoleWrite(DllStructGetData($tOut,'blbala',1) & @LF)
ConsoleWrite(DllStructGetData($tOut,'blbala',2) & @LF)

_WinAPI_FreeMemory ( $pBuff )
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
inververs
Зачем лишние библиотеки?
Код:
Dim $aArray[5]

$aArray[0] = 111
$aArray[1] = 222
$aArray[2] = 333
$aArray[3] = 444
$aArray[4] = 555

; Добавляем

$tBuff1 = DllStructCreate('int['& UBound($aArray) &']')

For $i = 1 To UBound($aArray)
	DllStructSetData($tBuff1, 1, $aArray[$i-1], $i)
Next

MsgBox(64,'Array - > Struct', DllStructGetPtr($tBuff1))

; Извлекаем

$tBuff2 = DllStructCreate('int[5]', DllStructGetPtr($tBuff1))
For $i = 1 To 5
	MsgBox(64, 'Struct - > Array', DllStructGetData($tBuff2, 1, $i))
Next
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
The Dream,
Еще пример.
Код:
#include <WinAPIEx.au3>
#include <Array.au3>


Local $aTest[Random(20, 40, 1)][Random(3, 6, 1)], $iCount

For $i = 0 To UBound($aTest) - 1
	For $j = 0 To UBound($aTest, 2) - 1
		$iCount += 1
		$aTest[$i][$j] = $iCount
	Next
Next
$iCount = 0
_ArrayDisplay($aTest, 'To buffer')
;~ --------------------------------------
;~ создали рандомный массив
;~ --------------------------------------
Local $iStep, $iNum, $pBuff

$iStep = UBound($aTest, 2)

$tStr = DllStructCreate('byte[' & $iStep * UBound($aTest) & ']')
For $i = 0 To UBound($aTest) - 1
	For $j = 0 To $iStep - 1
		$iNum += 1
		DllStructSetData($tStr, 1, $aTest[$i][$j], $iNum)
	Next
Next
$pBuff = _WinAPI_CreateBufferFromStruct($tStr)
$tStr = 0
$aTest = 0
;~ --------------------------------------
;~ поместили его в буфер
;~ --------------------------------------
Local $tStruct, $iTmp = 0, $aNew[1], $iSize

$iSize = _WinAPI_GetMemorySize($pBuff)
$tStruct = DllStructCreate('byte[' & $iSize & ']', $pBuff)
ReDim $aNew[$iSize / $iStep][$iStep]
For $i = 1 To DllStructGetSize($tStruct) - ($iStep - 1) Step $iStep
	For $j = 0 To $iStep - 1
		$aNew[$iTmp][$j] = DllStructGetData($tStruct, 1, $i + $j)
	Next
	$iTmp += 1
Next

_ArrayDisplay($aNew, 'From buffer')
;~ --------------------------------------
;~ из буфера поместили данные в массив
;~ --------------------------------------
_WinAPI_FreeMemory($pBuff)
 
Верх