Что нового

Массив из 1d в 2d со сдвигом в значениях

Unnamed_Wolf

Новичок
Сообщения
7
Репутация
0
Здравствуйте!
Есть массив простой(1d) с наполнение.
[list type=decimal]
[*]значен1
[*]значен2
[*]значен1
[/list]
нужно создать массив двумерный со сдвигом в значениях, логичным.
значен1|значен2
значен1|значен2
Т.Е. мы оставляем первую колонку первой строки не тронутой, а вот дальше сдвигаем на строку, получается...
попытался реализовать данный алгоритм но столкнулся с такой проблемой что оказывается переменная внутри for счетчика не меняется.
Код:
Func _1Dto2DArray(ByRef $aArray, Const $iAdditionalColumns = 1)
    Local Const $iSize = UBound($aArray, 1)
    Local $aReturn[$iSize][$iAdditionalColumns + 1]
    For $A = 0 To $iSize - 1
		For $I = 0 To $iAdditionalColumns
			if $A == 0 AND $I == 0 Then
			   $var1 = 0
			ElseIf $A == 0 AND $I > 0 Then
			   $var1 = $A+$I
			ElseIf $A <> 0 Then
			   $var1 = $A+1
			EndIf
			$aReturn[$A][$I] = $aArray[($var1 < $iSize ? $var1 : $iSize - 1)]
		Next
    Next
    $aArray = $aReturn
    Return $aReturn
EndFunc

у меня так вот получилось... :(
P.S. ну и каптча у вас.. :Censored:
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Дайте массив исходный более чем с двумя значениями и результат , а то
значен1|значен2
значен1|значен2
ни о чём, или эти две строки чем-то отличаются ?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
#include <Array.au3>
Local $ar[6] = [1, 2, 1, 2, 1, 2]; четное колличество строк
;Local $ar[7] = [1, 2, 1, 2, 1, 2, 1]; нечетное колличество строк
Local $ca = UBound($ar)
Local $sc = $ca / 2
If StringInStr($sc, '.') Then $sc = Ceiling($sc) ; если массив $ar имеет нечетное колличество строк, то увеличиваем $sc
Local $res[$sc][2]
Local $d = 0
For $i = 0 To $ca - 1
	If StringInStr(($i / 2), '.') Then
		$res[$d][1] = $ar[$i]
		$d += 1
	Else
		$res[$d][0] = $ar[$i]
	EndIf
Next
_ArrayDisplay($res)

как вариант
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Если я правильно понял
Код:
#include <Array.au3>

Global $a[] = [1,2,3,4,5,6,7,8,9,0]

_ArrayDisplay(_1Dto2DArray($a))
_ArrayDisplay(_1Dto2DArray($a, 3))
_ArrayDisplay(_1Dto2DArray($a, 4))

Func _1Dto2DArray(Const ByRef $a1D, $iCol = 2)
  If Not IsArray($a1D) Or UBound($a1D, 0) <> 1 Then Return SetError(1, 0, 0)
  If $iCol < 2 Then Return SetError(2, 0, 0)
  Local $a2D[Ceiling(UBound($a1D) / $iCol)][$iCol], $Line, $j
  For $i = 0 To UBound($a1D) - 1
    $a2D[$Line][$j] = $a1D[$i]
    If $j = $iCol - 1 Then
      $Line += 1
      $j = 0
    Else
      $j += 1
    EndIf
  Next
  Return $a2D
EndFunc
 
Автор
U

Unnamed_Wolf

Новичок
Сообщения
7
Репутация
0
InnI, joiner Большое спасибо!
Работают оба варианта, но за универсальность, краткость взял вариант от InnI. :beer:
Отлов ошибок тоже очень, кстати! :ok:
Решено!
P.S. ra4o можно было запустить функцию и посмотреть вывод, там сразу понятно о чем речь. под массив подходили любые одномеры. Да, и другие без запуска смекнули уже... :whistle:
 

Vanches

Новичок
Сообщения
12
Репутация
0
Доброго времени суток, помогите пожалуйста. Использую функцию из поста InnI.
Программа работает, но при попытке скомпилировать .exe, компилятор ругается на
ERROR: Syntax error. If $iLen = 1 Then Return [ ------------------------------------------------------------------------------------------------------ - Compilation failed.
Autoit версии 3.3.14.5
----------------------------------------------------------
Если я правильно понял
Код:
#include <Array.au3>

Global $a[] = [1,2,3,4,5,6,7,8,9,0]

_ArrayDisplay(_1Dto2DArray($a))
_ArrayDisplay(_1Dto2DArray($a, 3))
_ArrayDisplay(_1Dto2DArray($a, 4))

Func _1Dto2DArray(Const ByRef $a1D, $iCol = 2)
  If Not IsArray($a1D) Or UBound($a1D, 0) <> 1 Then Return SetError(1, 0, 0)
  If $iCol < 2 Then Return SetError(2, 0, 0)
  Local $a2D[Ceiling(UBound($a1D) / $iCol)][$iCol], $Line, $j
  For $i = 0 To UBound($a1D) - 1
    $a2D[$Line][$j] = $a1D[$i]
    If $j = $iCol - 1 Then
      $Line += 1
      $j = 0
    Else
      $j += 1
    EndIf
  Next
  Return $a2D
EndFunc
 
Последнее редактирование:
Верх