Что нового

Как добавлять элементы в многомерный массив (синтаксис)?

shm_alex

Новичок
Сообщения
34
Репутация
4
Не пойму как это сделать .
Мне понадобилось хранить гистограмму цветов
(Ну типа какой цвет в картинке сколько раз встретился)
ну как Record в языке сделать я не понял

, решил всё хранить в массиве - картинки у меня большие да и цветов там немного , поэтому на первом этапе решил сделать всё максимально просто и не заморачиваться с накладными расходами на добавление элемента(и использовать стандартную функцию _ArrayAdd) вот застопорился не могу добавить в массив [[int,string,int],[int,string,int]....[int,string,int]] элемент [int,string,int]
Код:
<...skipped...>
Global $iColorGisto[1][3]=[[0xFFFFFF,"0xFFFFFF",1]]
;Global $iColorGisto[5][2]=[[0xFFFFFF,"0xFFFFFF",1],[0xFFFFFA,"0xFFFFFA",2],[0xFFFFFB,"0xFFFFFB",3],[0xFFFFFC,"0xFFFFFC",4],[0xFFFFFD,"0xFFFFFD",5]]
 for $i=0 TO $iX-1 
	for $j=0 TO $iY-1
			$PixelColor=_GDIPlus_BitmapGetPixel($hImage,$i,$j)
		If ($PixelColor <> 0xFFFFFF)Then
			$color_index=FindColorIndex($PixelColor)
			if ($color_index<UBound($iColorGisto,1)) Then
				$iColorGisto[$color_index][2]=$iColorGisto[$color_index][2]+1
			Else
				;вот здесь не пойму что писать 
				; все равно надо выделить память 
				;под элемент 
				;$val_to_add[3] = [ $PixelColor,"0x" & Hex($PixelColor,6),1]
				;чтобы  он не умер как локальная память по завершению процедуры
				;как обойтись без оператора new не понимаю.
				$color_index=_ArrayAdd($iColorGisto,"")				;это не работает
				$iColorGisto[$color_index][0]=$PixelColor			; =(
				$iColorGisto[$color_index][1]=hex($PixelColor,6)		; =(
				$iColorGisto[$color_index][2]=1					; =(
;$color_index=_ArrayAdd($iColorGisto,[ $PixelColor,"0x" & Hex($PixelColor,6),1])	;это тоже не работает				
				
			EndIf ;if ($color_index<UBound($iColorGisto,1)) Then
		EndIf;	If ($PixelColor <> 0xFFFFFF)Then
	Next 
Next 

_ArrayDisplay($iColorGisto)

_GDIPlus_ShutDown ()

func FindColorIndex($color)
	local $i=0
	for $i=0 to UBound($iColorGisto,1)-1
	 if($color == $iColorGisto[$i][0])Then
		 Return $i
		 EndIf
	 Next
Return $i
EndFunc
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
_ArrayAdd работает с одномерными массивами.

Код:
#include <Array.au3>

Dim $aTest[1][3] = [['0-0', '0-1', '0-2']]
_ArrayDisplay($aTest)

ReDim $aTest[2][3]
$aTest[1][0] = '1-0'
$aTest[1][1] = '1-1'
$aTest[1][2] = '1-2'
_ArrayDisplay($aTest)

ReDim $aTest[2][4]
$aTest[0][3] = '0-3'
$aTest[1][3] = '1-3'
_ArrayDisplay($aTest)

ReDim $aTest[1][3]
_ArrayDisplay($aTest)
 
Автор
S

shm_alex

Новичок
Сообщения
34
Репутация
4
Спасибо .
ReDim работает )
Если кто то найдет эту тему поиском добавлю свой кусок кода )
Код:
for $i=0 TO $iX-1 
	for $j=0 TO $iY-1
			$PixelColor=_GDIPlus_BitmapGetPixel($hImage,$i,$j)
		If ($PixelColor <> 4294967295)Then;4294967295==0xFFFFFF;белый цвет я не анализирую

			$color_index=FindColorIndex($PixelColor)
			if ($color_index<UBound($iColorGisto,1)) Then
				$iColorGisto[$color_index][2]=$iColorGisto[$color_index][2]+1
			Else
				if ($color_index<>UBound($iColorGisto,1))then  Exit EndIf;Что то неправильно совсем после функции FindColorIndex($color) $color_index должен встать либо на найденный элемент либо вконец массива :)
				ReDim $iColorGisto[$color_index+1][3]				
				$iColorGisto[$color_index][0]=$PixelColor
				$iColorGisto[$color_index][1]="0x"&hex($PixelColor,6)
				$iColorGisto[$color_index][2]=1
				
				
			EndIf ;if ($color_index<UBound($iColorGisto,1)) Then
		EndIf;	If ($PixelColor <> 0xFFFFFF)Then
	Next 
Next
 
Верх