Что нового

Вернуть значение из функции массивом в массиве =) (это вообще законно ? )

FlatX007

Tattoo!
Сообщения
197
Репутация
35
На работе делать нечего было, решил вспомнить массивы ... вообщем навоял беспредел =) похоже на задание в учебнике программирования ...
Код работает, компилятор не ругается.

Код:
#include <File.au3>

Dim $array[1], $array2[1]
$PATCH = "c:\Program Files"

Global $a[2] = [_one($PATCH)[0], _one($PATCH)[1]] ; строка "вне закона" 
_ArrayDisplay($a[0])
_ArrayDisplay($a[1])

Func _one($sPatch)

    Local $aFl = _FileListToArray($sPatch, "*", 2)
    ReDim $array[$aFl[0]]
    ReDim $array2[$aFl[0]]

    For $i = 1 To $aFl[0] - 1
        $array[$i] = $aFl[$i]
        $array2[$aFl[0] - $i] = $aFl[$i]
    Next

    Local $arr[2] = [$array, $array2]
    Return $arr

EndFunc   ;==>_one
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
в чем вопрос?
 
Автор
F

FlatX007

Tattoo!
Сообщения
197
Репутация
35
почему работает запись типа
Код:
_one($PATCH)[0]
?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
так задумано
Код:
MsgBox(0, '', (DirGetSize(@ScriptDir & '\Test', 1))[1])

только это опасный вариант. нужно быть уверенным, что индекс массива существует. иначе крах кода.
а если уверен, то позволяет сократить размер кода. разве плохо?
:cool:
я иногда использую этот прием, чтобы не создавать лишних переменных и опрашивать индекс напрямую
в общем, для любителей минимализма))

что то похожее есть и в работе со структурами
Код:
Local $tData = DllStructCreate('wchar test[1024]')
$tData.test = 'привет';добавляем данные в структуру
ConsoleWrite($tData.test & @LF); получаем данные из структуры
 
Последнее редактирование:
Автор
F

FlatX007

Tattoo!
Сообщения
197
Репутация
35
кстати случайно нашел уже давно, просто сейчас вспомнил...
в справке вроде нигде про это не написано ?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
считай это недокументированными возможностями )))
 
Автор
F

FlatX007

Tattoo!
Сообщения
197
Репутация
35
так задумано
Код:
MsgBox(0, '', (DirGetSize(@ScriptDir & '\Test', 1))[1])

только это опасный вариант. нужно быть уверенным, что индекс массива существует. иначе крах кода.

Если полазить по всяким Стандартным UDF из недр Autoit можно найти полно недокументированных читов приемов прямиком растущие из "C++" надо бы собраться задукоментировать, думаю много чего интересного найдется
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
считай это недокументированными возможностями
Это "задокументировано" в истории изменений:
3.3.10.0 (23rd December, 2013) (Release)
AutoIt:

...
Added: Array access on expression: StringSplit("a,b", ",")[1].
...

Оригинал:

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

Кстати, в справке к функции StringSplit() третий пример содержит подобную конструкцию и соответствующий комментарий
Код:
MsgBox($MB_SYSTEMMODAL, "", StringSplit($sText, '\n', $STR_ENTIRESPLIT)[2]) ; Directly access the array index by using array access on expression.
 
Последнее редактирование:
Верх