Что нового

Помогите разобраться с функцией Assign()

mef-t

Осваивающий
Сообщения
306
Репутация
30
Добрый день.

Имеется следующий код
Код:
Local $section_arr = IniReadSectionNames($sIni)
	For $i=0 To UBound($section_arr)-1
		Assign($section_arr[$i], IniReadSection($sIni, $section_arr[$i]))
	Next
	_ArrayDisplay($Info)

Данный код возвращает "$Info: possibly used before declaration."
Функция "IsDeclared ($Info)" возвращает "-1", что говорит о существовании переменной.
Так же если перед отображением вставить "$Info= $Info", то данные отобразятся, хотя и выйдет ошибка, та же, но уже после выполнения программы.

Как с этим бороться? Нет желания заранее объявлять переменную, т.к. в ее существовании может не оказаться надобности.
Функция "Assign()" создает переменную, но при этом при выполнении скрипта система ругается.

Просьба подсказать, в чем я не прав, что я упускаю, где ошибка.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
mef-t,
У меня так работает.
Код:
#include <Array.au3>

$sIni = @ScriptDir & '\My.ini'

$aSection_arr = IniReadSectionNames($sIni)
For $i = 1 To $aSection_arr[0]
	Assign($aSection_arr[$i], IniReadSection($sIni, $aSection_arr[$i]))
Next

For $i = 1 To $aSection_arr[0]
	$aTmp = Eval($aSection_arr[$i])
	_ArrayDisplay($aTmp, $aSection_arr[$i])
Next
И так тоже. :scratch:
Код:
#include <Array.au3>

$sIni = @ScriptDir & '\My.ini'

$aSection_arr = IniReadSectionNames($sIni)
For $i = 1 To $aSection_arr[0]
	Assign($aSection_arr[$i], IniReadSection($sIni, $aSection_arr[$i]))
Next

For $i = 1 To $aSection_arr[0]
	$aTmp = Execute('$' & $aSection_arr[$i])
	_ArrayDisplay($aTmp, $aSection_arr[$i])
Next
Без проверок на ошибки.
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
Флаг бесполезен, т.к. переменная в моем случае создается.
Функция "IsDeclared ($Info)" возвращает "-1"
ini любой, например:
[Section]
Caption = название
Version = версия

Имя переменной не является элементом массива, переменная хранит в себе весь массив, а не один элемент. Это разное.
К тому же Assign() как раз отработал верно. Проблема в том, что система считает переменную, созданную через Assign() не определенной.

А предложенный вариант я намеренно не хотел использовать, какой смысл? создавать новую переменную, присваивать ей массив предыдущей переменной, если текущая переменная содержит желаемый массив.


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

Упрощенный вариант кода:

Код:
Assign('Info', 'тест', 1)
ConsoleWrite($Info)

Эффект тот же.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
mef-t [?]
Упрощенный вариант
Только так, ИМХО:
Код:
Assign('Info', 'тест', 1)
ConsoleWrite(Eval('Info') & @LF)
ConsoleWrite(Execute('$Info') & @LF)

Получить в консоли копию ini-файла:
Код:
#include <Array.au3>

$sIni = @ScriptDir & '\My.ini'

$aSection_arr = IniReadSectionNames($sIni)
For $i = 1 To $aSection_arr[0]
	Assign($aSection_arr[$i], IniReadSection($sIni, $aSection_arr[$i]))
Next

For $i = 1 To $aSection_arr[0]
	ConsoleWrite('[' & $aSection_arr[$i] & ']' & @LF)
	For $j = 1 To Execute('$' & $aSection_arr[$i] & '[0][0]')
		ConsoleWrite(Execute('$' & $aSection_arr[$i] & '[' & $j & '][0]') & ' = ' & Execute('$' & $aSection_arr[$i] & '[' & $j & '][1]') & @LF)
	Next
Next
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
Execute() понравился.

Просьба подсказать, чтобы быстрее отработается через Execute() или создание еще одной переменной?
Я понимаю, что время предельно малое, но все же.

Или подскажите, где можно прочитать и времени создания переменных, обращения к переменных, а так же о времени выполнения прочих операций
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
mef-t
Я пока не понял вопроса, но вот ссылки по теме с Assign
http://autoit-script.ru/index.php?topic=2930.msg21226#msg21226
http://autoit-script.ru/index.php?topic=4861.new#new

Нельзя было пример как то так выложить? Всё работает если написано верно.
Код:
#include <Array.au3>
$sIni = @ScriptDir & '\Section.ini'
$section_arr = IniReadSectionNames($sIni)
_ArrayDisplay($section_arr)
For $i = 1 To $section_arr[0]
	Assign($section_arr[$i], IniReadSection($sIni, $section_arr[$i]))
Next
_ArrayDisplay($Section)
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
AZJIO, результат Вашего кода ниже. Я про это и писал.

"(8,23) : WARNING: $Section: possibly used before declaration."

З.Ы. это если допустить, что секция с названием "Section" в ini-файле есть.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
mef-t [?]
"(8,23) : WARNING: $Section: possibly used before declaration."
З.Ы. это если допустить, что секция с названием "Section" в ini-файле есть.
Делается так:

Код:
$aSection = Eval('Section')
_ArrayDisplay($aSection)
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
madmasles [?]
Только как узнать, что должен использоваться именно массив $Section?
Автор должен знать, я то не знаю что ему требуется.


mef-t [?]
AZJIO, результат Вашего кода ниже. Я про это и писал."(8,23) : WARNING: $Section: possibly used before declaration."З.Ы. это если допустить, что секция с названием "Section" в ini-файле есть.
Я использовал ini-файл, тот что во втором посте. так и нужно говорить типа избавится от случая, что секции нет в ini и чтобы не вылетел с ошибкой.

Код:
#include <Array.au3>
$sIni = @ScriptDir & '\Section.ini'
$section_arr = IniReadSectionNames($sIni)
_ArrayDisplay($section_arr)
For $i = 1 To $section_arr[0]
	Assign($section_arr[$i], IniReadSection($sIni, $section_arr[$i]))
Next
If IsDeclared('Section') Then
	_ArrayDisplay($Section)
Else
	MsgBox(0, 'Сообщение', 'аяяй, поломатый ini')
EndIf
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
AZJIO, подскажите, Вы запускали написанный скрипт?
Я не хочу обидеть, просто если запускали и он отработал без ошибок, то подскажите, в чем Вы работаете?

В самом первом посте я указал, что
Код:
Assign($section_arr[$i], IniReadSection($sIni, $section_arr[$i]))
создает переменную.

Так же указал, что
Код:
IsDeclared('Section')
вернет положительный результат. Т.е. подтвердит наличие переменной.

И при этом
Код:
_ArrayDisplay($Section)

вернет ошибку "(9,27) : WARNING: $Section: possibly used before declaration."


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

CreatoR

Получается, что мы переприсваиваем переменную.
У меня их может быть до 11 штук (в моем конкретном случае).
В дальнейшем я буду их еще использовать.
А в случае переприсвения, вместо 11 переменных, у меня будет уже 22. Считаю это тратой ресурсов.

Более того функция "Execute()" способна прочитать данную переменную.

Может проблема не в самом "autoit", а "SciTE", которым я пользуюсь?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
mef-t
Пример у вас не полный. Есть функция _ArrayDisplay, но нет объявления
Код:
#include <Array.au3>


---Zak--- [?]
ЗЫ: напиши структуру ini файла, а то вслепую не очень...
Опять люде же не зря отписывают. У меня тоже особо времени нет разгадывать загадки.

Должен быть полный пример и даже с автосозданием ini-файла, и комментарий чего вы ожидаете от функции и этого не происходит. Если вы выкладываете не рабочий код, то что я должен в нём угадать, если уже изначально он и не должен работать.

На счёт SciTE, файл то можно и без него запускать, я вот лично в Notepad++ работаю и частенько не брезгую запускать скрипты из проводника, потому что у Notepad++ рабочий каталог там где он сам, а не место запуска скрипта.

mef-t [?]
Я не хочу обидеть
Меня трудно обидеть, обычно это могут только друзья с которыми уже сложились отношения.
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
AZJIO
Полный пример (кстати, взял именно Ваш код для удобства объяснения):
Код:
#include <Array.au3>
$sIni = @ScriptDir & '\Section.ini'
$section_arr = IniReadSectionNames($sIni)
_ArrayDisplay($section_arr)
For $i = 1 To $section_arr[0]
    Assign($section_arr[$i], IniReadSection($sIni, $section_arr[$i]))
Next
If IsDeclared('Section') Then
    _ArrayDisplay($Section)
Else
    MsgBox(0, 'Сообщение', 'аяяй, поломатый ini')
EndIf

Ini-файл с названием "Section.ini"
Код:
[Section]
var = 3

В "SciTE" ошибка "(9,27) : WARNING: $Section: possibly used before declaration.".

И да, спасибо. Через Notepad++ запустился без ошибок.

Где в "SciTE" это можно поправить?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Тема была про новый AutoIt3Wrapper, он автоматически проверяет с Au3Check.exe. Вернуться на старую версию AutoIt3Wrapper, хотя я сейчас попробовал в AutoIt3Wrapper.ini в параметре "Run_AU3Check=n" установил n (нет) предупреждения не стало.
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
Спасибо, попробую.
 
Верх