Что нового

Прошу помощи в освоении простых массивов

The Dream

Новичок
Сообщения
393
Репутация
3
Дорогие ребята, так получилось что я всегда массивы обходил стороной.
Но теперь уже без них я не справлюсь. К сожалению сам я так и не смог полностью разобраться с ними, кому не сложно - поправьте меня. Мне кажется, что все очень просто :-[

Код:
Dim $aArray[1] ; сроздаем массив
$aArray[0]=0 ; присваиваем размер массива в нулевой индекс, чтобы по нему знать сколько индексов всего

$aArray[0]=$aArray[0]+1 ; увеличаем размер массива
ReDim $aArray[$aArray[0]] ; применяем новый размер
$aArray[1]='test value' ; присваиваем новой ячейке значение

MsgBox(16,'',$aArray[1]) ; выводим содержимое новой ячейки

ReDim $aArray[1] ; удаляем массив


Но так как в комментариях - к сожалению не работает :(

Спасибо.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Код:
$aArray[0]=1 ; присваиваем размер массива в нулевой индекс, чтобы по нему знать сколько индексов всего
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Код:
Dim $aArray[1] ; сроздаем массив
MsgBox(0,"Размер массива",UBound($aArray))
$aArray[0]=0 ; присваиваем размер массива в нулевой индекс, чтобы по нему знать сколько индексов всего

$aArray[0]=$aArray[0]+1 ; увеличаем размер массива
ReDim $aArray[UBound($aArray)+1] ; применяем новый размер
MsgBox(0,"Увеличиваем размер текущего массива на 1",UBound($aArray))
$aArray[1]='test value' ; присваиваем новой ячейке значение

MsgBox(16,'',$aArray[1]) ; выводим содержимое новой ячейки

ReDim $aArray[1] ; удаляем массив



Добавлено:
Сообщение автоматически объединено:

Проблема в том что изначально создается массив размерность которого [1]
Далее с помощью ReDim ты пытаешься расширить массив, размерность которого = 1. Всё правильно, за исключением того что чтобы расширить массив, ты должен указать значение отличное чем его текущее, иначе не наступит никакого эффекта, а в переменной $aArray[0], на момент расширения, хранится значение = 1.
По сути твоя строка с Redim, человечачим языком звучит как "Изменить размер массива aArray, текущий размер которого = 1, на новый размер, равный 1."
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Подскажите пожалуйста, а правильно ли удаление массива?
Код:
ReDim $aArray[1] ; удаляем массив
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Пример 1:

Код:
Global $aArray[1] ; сроздаем массив
MsgBox(0, 'Размер массива', UBound($aArray))

$aArray[0] += 1 ; увеличаем размер массива
ReDim $aArray[$aArray[0] + 1]
MsgBox(0, 'Увеличиваем размер текущего массива на 1', UBound($aArray))
$aArray[$aArray[0]] = 'test value'

MsgBox(0, '', $aArray[$aArray[0]]) ; выводим содержимое новой ячейки


Пример 2:

Код:
#include <Array.au3>

Global $aArray[1]

For $i = 1 To 100
    $aArray[0] += 1
    ReDim $aArray[$aArray[0] + 1]
    $aArray[$aArray[0]] = ($i * 2)
Next

_ArrayDisplay($aArray)


Пример 3:

Код:
#include <Array.au3>

Global $aArray[1][2]

For $i = 1 To 100
    $aArray[0][0] += 1
    ReDim $aArray[$aArray[0][0] + 1][2]
    $aArray[$aArray[0][0]][0] = $i
	$aArray[$aArray[0][0]][1] = ($i * 2)
Next

_ArrayDisplay($aArray)


The Dream [?]
Подскажите пожалуйста, а правильно ли удаление массива?

Да
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Если под удалением имеется в виду очищение памяти, то достаточно просто
Код:
$aArray = 0
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Думал создать новую тему, но решил продолжить в этой, так как тоже имеет отношение к массивам мой вопрос.

Так вот, сам вопрос. Есть код, но я к сожалению не понимаю как мне динамически расширять массив. Вот пример кода в котором я не могу решить проблему:

Код:
#Include <GUIConstantsEx.au3>
#Include <GUIListView.au3>
#Include <WindowsConstants.au3>

Dim $ColorData[5][2][2] ; если размер заранее не известен?
For $i = 0 To UBound($ColorData) - 1
    For $j = 0 To UBound($ColorData, 2) - 1
        $ColorData[$i][$j][0] = 0
        $ColorData[$i][$j][1] = 0xFFFFFF
    Next
Next


$hGUI = GUICreate('Test', 300, 200)
$hListView = _GUICtrlListView_Create($hGUI, 'Items|SubItems', 10, 10, 280, 180, $LVS_REPORT, $WS_EX_CLIENTEDGE)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $WS_EX_CLIENTEDGE))

_GUICtrlListView_AddItem($hListView, 'Item')
_GUICtrlListView_SetItemColors($hListView, 0, 0, 0)
_GUICtrlListView_AddSubItem($hListView, 0, 'Error', 1)
_GUICtrlListView_SetItemColors($hListView, 0, 1, 0, 0x0000FF)
_GUICtrlListView_AddItem($hListView, 'Error2')
_GUICtrlListView_SetItemColors($hListView, 1, 0, 0, 0x0000FF)
_GUICtrlListView_AddItem($hListView, 'Item')
_GUICtrlListView_SetItemColors($hListView, 2, 0, 0, 0xFFFFFF)
_GUICtrlListView_AddItem($hListView, 'Item')
_GUICtrlListView_SetItemColors($hListView, 3, 0, 0, 0xFFFFFF)
_GUICtrlListView_AddItem($hListView, 'Item666')
_GUICtrlListView_SetItemColors($hListView, 4, 0, 0, 0x0000FF)

GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func _GUICtrlListView_SetItemColors($hWnd, $iItem, $iSubItem, $iColor, $iBkColor = 0xFFFFFF, $fRedraw = False)
    If ($iItem < 0) Or ($iItem > UBound($ColorData) - 1) Then
        Return 0
    EndIf
    If ($iSubItem < 0) Or ($iSubItem > UBound($ColorData, 2) - 1) Then
        Return 0
    EndIf
    $ColorData[$iItem][$iSubItem][0] = $iColor
    $ColorData[$iItem][$iSubItem][1] = $iBkColor
    If $fRedraw Then
        _GUICtrlListView_RedrawItems($hWnd, $iItem, $iItem)
    EndIf
    Return 1
EndFunc   ;==>_GUICtrlListView_SetItemColors

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)

    Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    Local $hWndFrom = DllStructGetData($tNMHDR, 'hWndFrom')
    Local $iCode = DllStructGetData($tNMHDR, 'Code')

    Switch $hWndFrom
        Case $hListView
            Switch $iCode
                Case $NM_CUSTOMDRAW

                    Local $tNMLVCD = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)
                    Local $iDrawStage = DllStructGetData($tNMLVCD, 'dwDrawStage')
                    Local $iItem = DllStructGetData($tNMLVCD, 'dwItemSpec')
                    Local $iSubItem = DllStructGetData($tNMLVCD, 'iSubItem')

                    Switch $iDrawStage
                        Case $CDDS_PREPAINT
                            Return $CDRF_NOTIFYITEMDRAW
                        Case $CDDS_ITEMPREPAINT
                            Return $CDRF_NOTIFYSUBITEMDRAW
                        Case BitOR($CDDS_ITEMPREPAINT, $CDDS_SUBITEM)
                            DllStructSetData($tNMLVCD, 'clrTextBk', $ColorData[$iItem][$iSubItem][1])
                            DllStructSetData($tNMLVCD, 'clrText', $ColorData[$iItem][$iSubItem][0])
                            Return $CDRF_NEWFONT
                    EndSwitch
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY


Меня интересует как сделать так, чтобы массив динамически рос по мере роста строчек. Или это не важно?

Пробовал с ReDim - не получилось, может быть не так пробовал.
Конечно если поставить размер сразу большой - то проблем не будет, но не хотелось бы так.

Спасибо.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
The Dream [?]
Пробовал с ReDim - не получилось
Простой пример динамического увеличения массива.
Код:
#include <Array.au3>

Global $aArray

If Random(0, 1, 1) Then
	Dim $aArray[Random(10, 20, 1)]
	For $i = 0 To UBound($aArray, 1) - 1
		$aArray[$i] = $i
	Next
Else
	Dim $aArray[Random(10, 20, 1)][Random(2, 5, 1)]
	For $i = 0 To UBound($aArray, 1) - 1
		For $j = 0 To UBound($aArray, 2) - 1
			$aArray[$i][$j] = $i & 'x' & $j
		Next
	Next
EndIf
_ArrayDisplay($aArray)
HotKeySet('!1', '_MyRedim');Alt + 1
HotKeySet('!{Esc}', '_Exit');Alt + Esc

While 1
	Sleep(100)
WEnd

Func _MyRedim()
	HotKeySet('!1');Alt + 1
	Local $i_UbAll = UBound($aArray, 0)
	Switch $i_UbAll
		Case 1
			Local $i_Ub1 = UBound($aArray, 1)
			ReDim $aArray[$i_Ub1 + 1]
			$aArray[$i_Ub1] = $i_Ub1
		Case 2
			Local $i_Ub1 = UBound($aArray, 1)
			Local $i_Ub2 = UBound($aArray, 2)
			ReDim $aArray[$i_Ub1 + 1][$i_Ub2]
			For $i = 0 To $i_Ub2 - 1
				$aArray[$i_Ub1][$i] = $i_Ub1 & 'x' & $i
			Next
		Case Else
			ConsoleWrite('ERROR' & @LF)
			Exit 13
	EndSwitch
	_ArrayDisplay($aArray)
	HotKeySet('!1', '_MyRedim');Alt + 1
EndFunc   ;==>_MyRedim

Func _Exit()
	Exit
EndFunc   ;==>_Exit
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Все равно не получается, думаю что если еще учитывать то что если я строчку удалю - то должно удалится и значение в массиве, а вернее - сместится. То попробую создать тему в "Стол Заказов" - может быть кто-то поможет.. :-\
 
Верх