Что нового

В массив не добавляется элемент (инициализация массива)

Suppir

Продвинутый
Сообщения
967
Репутация
62
Как правильно инициализировать массив OUT, чтобы заработало?

Код:
#Include <File.au3>
#Include <Array.au3>

Global $Text, $FileList, $OUT

$FileList = _FileListToArray(@scriptdir, "*.txt")

if @error = 4 Then
	MsgBox(16, "Ошибка", "В директории нет TXT-файлов")
	Exit
EndIf

For $x = 1 to UBound($FileList) - 1
	_FileReadToArray($FileList[$x], $Text)
Next

For $x = 1 to Ubound($Text) - 1
	$Text[$x] = _StringOEM2ANSI($Text[$x])
	if StringRegExp($Text[$x], "^!", 0) Then _ArrayAdd($OUT, $Text[$x])
		if @error <> 0 Then
			MsgBox(0, "", @error)

# вот здесь выдает ошибку "1", то есть, $OUT не является массивом

			Exit
		EndIf
Next

_ArrayDisplay($OUT)



Func _StringOEM2ANSI($strText)
	Local $sBuffer = DllStructCreate("char[" & StringLen($strText)+1 & "]")
	Local $aRet = DllCall("User32.dll", "int", "OemToChar", "str", $strText, "ptr", DllStructGetPtr($sBuffer))
	
	If Not IsArray($aRet) Then Return SetError(1, 0, '') ; ошибка DLL
	If $aRet[0] = 0 Then Return SetError(2, $aRet[0], '') ; ошибка функции
	
	Return DllStructGetData($sBuffer, 1)
EndFunc





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

я пробовал и так

Global $OUT[100]

и так

Dim $OUT

но что-то не работает
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Спасибо. Интересно, зачем разработчики так усложнили. Ясно же, что в переменную $OUT добавляют элемент с помощью функций для работы с массивами, то она должна автоматически превращаться в массив.

Например:

Global $OUT = 1
_ArrayAdd($OUT, "2")

Должен получиться массив: 1, 2.
 

oneDmitry

Новичок
Сообщения
55
Репутация
3
нет не должна, возми тот же паскаль, что бы сделать массив, тебе надо его сначала описать
описываем
Код:
Dim $aOUT[10]; 10-число записей в массиве, можно число просто вписать Dim $aOUT, и ещё почитай http://autoit-script.ru/index.php?topic=158.0, а точнее там написано

Код:
В Autoit существует только один тип данных - Variant , поэтому для удобства написания скриптов рекомендуется использовать следующие имена переменных:

Первый набор символов после знака доллара ($) должен определять тип данных. Следующий список определяет префиксы и типы данных используемы с ними:

    * $a<символ> - (Array) Массив данных -  последующий символ взятый из списка ниже, определяет тип данных в массиве
    * $b - (Binary data) Двоичные данные
    * $h - (File or window handle) Дескриптор файла, окна, и т.д.
    * $i - (Integer) Целое число
    * $f - (Boolean) Логический тип, может принимать значения True или False
    * $n - (Floating point number) Число с плавающей точкой
    * $s - (String) Строка
    * $v - (Variant) Вариант, неопределенный тип данных, базовый тип для Autoit
    * $t - (Struct) Структура в стиле C/C++, для использования в DllCall, в сообщениях WM_*, при обработке данных и т.п.
    * $p - (Pointer) Указатель на структуру или на её элемент

Остальное имя переменной следует начинать с заглавной буквы, и оно должно отражать функциональность (свойства) переменной. Имена вроде “$iC” не приемлемы.
"$aiWeekDayNames" или "$iCounter" намного предпочтительнее.

Код:
то есть название переменной массива должно начинаться на $a[имя массива]





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

так же хочу добавить, делай проверку на каждом шаге твоего сценария, а точнее выводи свои массивы на экран
Код:
Отобразить одномерный массив в окне сообщений.
#include <Array.au3>
_ArrayDisplay ( $avArray, $sTitle )

$avArray - Массив. 
$sTitle - Заголовок окна сообщений. 

Возвращаемое значение

Успешное выполнение: Значение равное 1. 
Ошибка: Значение равное 0. 
@Error: 0 - успешное выполнение. 
 1 = $avArray не является массивом

пример
Код:
; Ex. #1:

#include <Array.au3>

$asControls = StringSplit( WinGetClassList( "", "" ), @LF )
_ArrayDisplay( $asControls, "Class List of Active Window" )
Exit


; Ex. #2:

#include <Array.au3>

Dim $avArray[8]
$avArray[0] = 7
$avArray[1] = "Brian"
$avArray[2] = "Jon"
$avArray[3] = "Larry"
$avArray[4] = "Christa"
$avArray[5] = "Rick"
$avArray[6] = "Jack"
$avArray[7] = "Gregory"

_ArrayDisplay( $avArray, "_ArrayDisplay() Test" )
Exit
 

Latoid

Знающий
Сообщения
95
Репутация
11
Suppir сказал(а):
Например:

Global $OUT = 1
_ArrayAdd($OUT, "2")

Должен получиться массив: 1, 2.

Вот:
Код:
#include <Array.au3>
Dim $OUT = "smth"

_ArrayAdd2 ($OUT, "new value1")
_ArrayDisplay ($OUT)

_ArrayAdd2 ($OUT, "new value2")
_ArrayDisplay ($OUT)

Dim $OUT2[1] = ["smth2"]
_ArrayAdd2 ($OUT2, "new value3")
_ArrayDisplay ($OUT2)

_ArrayAdd2 ($OUT2, "new value4")
_ArrayDisplay ($OUT2)


Func _ArrayAdd2(ByRef $avArray, $vValue)
	If Not IsArray($avArray) Then
		If $avArray = "" Then 
			Dim $avArray[1] = [$vValue]
			Return 0
		Else
			Local $ZeroItem = $avArray
			Dim $avArray[2] = [$ZeroItem, $vValue]
			Return 1
		EndIf
	EndIf
	Local $iUBound = UBound($avArray)
	ReDim $avArray[$iUBound + 1]
	$avArray[$iUBound] = $vValue
	Return $iUBound
EndFunc   ;==>_ArrayAdd
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Ясно, спасибо за ответы!
 
Верх