Что нового

[Массивы] Изменить значение ячейки многомерного массива

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Вопрос в названии темы.
Не нашел на форуме.
пример
Код:
Local $avArray[8][7] = [[7],['',1],['',2],['',3],['',4],['',5],['',6],['',7]]
Local $checkbox[8]
$Form1 = GUICreate("", 207, 210, -1, -1)
$Checkbox[1] = GUICtrlCreateCheckbox("1", 16, 8, 113, 17)
$Checkbox[2] = GUICtrlCreateCheckbox("2", 16, 32, 177, 17)
$Checkbox[3] = GUICtrlCreateCheckbox("3", 16, 56, 153, 17)
$Checkbox[4] = GUICtrlCreateCheckbox("4", 16, 80, 153, 17)
$Checkbox[5] = GUICtrlCreateCheckbox("5", 16, 104, 65, 17)
$Checkbox[6] = GUICtrlCreateCheckbox("6", 16, 128, 97, 17)
$Checkbox[7] = GUICtrlCreateCheckbox("7", 16, 152, 185, 17)
$Button1 = GUICtrlCreateButton("....", 64, 176, 75, 25)
GUISetState()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case -3
            Exit
        Case $Button1
    EndSwitch
WEnd
важно чтобы не изменялись индексы других ячеек.
к примеру, по выделению чекбокса 3 мне нужно обнулить или изменить содержимое третьей ячейки двухмерного массива. остальные должны остаться на своих местах.
я понимаю, что истина где то рядом, но сегодня мы с ней не дружим :smile:
 

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
Re: [Массивы] Изменить значение ячейки двухмерного массива

joiner [?]
изменить содержимое третьей ячейки
Мало информации, у тебя же двухмерный массив, нужен индекс еще одной меры

Посмотри, может сам сообразишь:
Код:
$avArray[3][2]='Value'
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Re: [Массивы] Изменить значение ячейки двухмерного массива

BIOS имел введу про это:
Код:
#include <Array.au3>

Local $avArray[8][7] = [[7],['',1],['',2],['',3],['',4],['',5],['',6],['',7]]
Local $checkbox[8]
$Form1 = GUICreate("", 207, 210, -1, -1)
$Checkbox[1] = GUICtrlCreateCheckbox("1", 16, 8, 113, 17)
$Checkbox[2] = GUICtrlCreateCheckbox("2", 16, 32, 177, 17)
$Checkbox[3] = GUICtrlCreateCheckbox("3", 16, 56, 153, 17)
$Checkbox[4] = GUICtrlCreateCheckbox("4", 16, 80, 153, 17)
$Checkbox[5] = GUICtrlCreateCheckbox("5", 16, 104, 65, 17)
$Checkbox[6] = GUICtrlCreateCheckbox("6", 16, 128, 97, 17)
$Checkbox[7] = GUICtrlCreateCheckbox("7", 16, 152, 185, 17)
$Button1 = GUICtrlCreateButton("....", 64, 176, 75, 25)
GUISetState()

_ArrayDisplay($avArray)
$avArray[5][1] = "joiner"
_ArrayDisplay($avArray)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case -3
            Exit
        Case $Button1
    EndSwitch
WEnd


Кстати у тебя 7 мерный массив !
Вот так будет 2-х мерный:
Код:
Local $avArray[8][2] = [[7],['',1],['',2],['',3],['',4],['',5],['',6],['',7]]
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
это я уже заморочился. переделывать чужие коды еще та возня. плюс невнимательность
вобщем все и правда оказалось просто :smile:
Код:
#include <array.au3>
#include <GUIConstantsEx.au3>
Local $avArray[8][7] = [[7],['', 1],['', 2],['', 3],['', 4],['', 5],['', 6],['', 7]]
Local $checkbox[8]
$Form1 = GUICreate("", 207, 210, -1, -1)
$checkbox[1] = GUICtrlCreateCheckbox("1", 16, 8, 113, 17)
$checkbox[2] = GUICtrlCreateCheckbox("2", 16, 32, 177, 17)
$checkbox[3] = GUICtrlCreateCheckbox("3", 16, 56, 153, 17)
$checkbox[4] = GUICtrlCreateCheckbox("4", 16, 80, 153, 17)
$checkbox[5] = GUICtrlCreateCheckbox("5", 16, 104, 65, 17)
$checkbox[6] = GUICtrlCreateCheckbox("6", 16, 128, 97, 17)
$checkbox[7] = GUICtrlCreateCheckbox("7", 16, 152, 185, 17)
$Button1 = GUICtrlCreateButton("....", 64, 176, 75, 25)
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case -3
			Exit
		Case $Button1
			For $i = 1 To UBound($checkbox) - 1
				If GUICtrlRead($checkbox[$i]) = $GUI_UNCHECKED Then
					$avArray[$i][1] = ''
				EndIf
			Next
			_ArrayDisplay($avArray)
	EndSwitch
WEnd
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
joiner
без цикла должно быть

Код:
Local $avArray[8][7] = [[7],[1],[2],[3],[4],[5],[6],[7]]
Local $checkbox[8] = [7]
$Form1 = GUICreate("", 207, 210, -1, -1)
$Checkbox[1] = GUICtrlCreateCheckbox("1", 16, 8, 113, 17)
$Checkbox[2] = GUICtrlCreateCheckbox("2", 16, 32, 177, 17)
$Checkbox[3] = GUICtrlCreateCheckbox("3", 16, 56, 153, 17)
$Checkbox[4] = GUICtrlCreateCheckbox("4", 16, 80, 153, 17)
$Checkbox[5] = GUICtrlCreateCheckbox("5", 16, 104, 65, 17)
$Checkbox[6] = GUICtrlCreateCheckbox("6", 16, 128, 97, 17)
$Checkbox[7] = GUICtrlCreateCheckbox("7", 16, 152, 185, 17)
$Button1 = GUICtrlCreateButton("....", 64, 176, 75, 25)
GUISetState()

#include <Array.au3>
_ArrayDisplay($avArray, 'Array')

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $Checkbox[1] To $Checkbox[$Checkbox[0]]
			$j = $nMsg - $Checkbox[1] + 1
			MsgBox(0, 'Check', $j, 0, $Form1)
			For $l = 0 To UBound($avArray, 2)-1
				$avArray[$j][$l] = 0
			Next
_ArrayDisplay($avArray, 'Array')
		Case -3
			Exit
	EndSwitch
WEnd
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
AZJIO, спасибо за вариант, но
о каком цикле речь? об этом?
Код:
For ...To...Next

в твоем примере он есть

к тому же в обоих вариантах нужно добавить обновление в массиве (если я правильно понимаю ) для случая, когда нужно добавить отметку в чекбокс.
объявлять многомерный массив при нажатии кнопки
Код:
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case -3
			Exit
		Case $Button1
			Local $avArray[8][7] = [[7],['', 1],['', 2],['', 3],['', 4],['', 5],['', 6],['', 7]]
			For $i = 1 To UBound($checkbox) - 1
				If GUICtrlRead($checkbox[$i]) = $GUI_UNCHECKED Then
					$avArray[$i][1] = ''
				EndIf
			Next
			_ArrayDisplay($avArray)
	EndSwitch
WEnd
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
joiner
Честно говоря не понял вопроса. Если просто изменить значение массива, то я так понимаю у автора антивируса не должно быть такого простого вопроса.
Может клик по чекбоксу вызывает кэширование последнего индекса, который используется в дальнейшем по кнопке.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Zaramot [?]
Кстати у тебя 7 мерный массив !
мда... массив все же двухмерный. даже у тебя. мера или измерение - это количество индексов.
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
AZJIO [?]
то я так понимаю у автора антивируса не должно быть такого простого вопроса.
а он и не спрашивает, спросил я . :smile:
AZJIO, я себя считаю новичком в языке. те зеленые гранаты под аватаром не я вешал :smile:
я не знаю многих базовых вещей.
"Не стыдно чего-нибудь не знать, но стыдно не хотеть учиться."
Сократ
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Kaster [?]
мера или измерение - это количество индексов
Разве?
Я привык что многомерный означает что там более одного столбца, а не индексов.
 

kaster

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

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Изначально закладывается ошибка понимания двумерного массива. Двумерный и двустолбцовый это разные понятия.

Код:
; Одномерный массив
$array[3] ; 3 строки (3 индекса)

; Двумерные массивы
$array[3][2] ; 3 строки (3 индекса),  2 столбца (2 индекса по горизонтали)
$array[1][7] ; 1 строка (1 индекс),  7 столбцов (7 индексов по горизонтали)
$array[5][22] ; 5 строк (5 индексов),  22 столбца (22 индекса по горизонтали)

; Многомерные массивы
$array[5][7][2] ; трехмерный, аналогично кубу в котором ячейки кирпичиками, и аналогично трёхмерной системе координат, где ячейка имеет координаты (x, y, z)
$array[5][7][1][9] ; четырёхмерный, это визуально представить невозможно.


В 99,999% мы используем одномерные и двумерные массивы.
 
Верх