Что нового

Крах скрипта связанный с присвоением данных массиву через функцию

  • Автор темы VitAl2013
  • Дата начала
V

VitAl2013

Гость
Выполнение данной функции:
Код:
#include <GUIListView.au3>
Dim $result[3][3]
$result[2][2] = _normalize_double("2F4000")

_ArrayDisplay($result)

Func _normalize_double($hex)
	$f_00 = False
	$fhex = ""
	$plus = stringleft ($hex, 2)
	
	if $plus <= "23" then
		$cplus = "3E"
	ElseIf $plus >= "28" and $plus <= "2C" then 
		$cplus = "3F"
	ElseIf $plus >= "2D" and $plus <= "3F" then
		$cplus = "40"
		if $plus = "2F" then
			$f_00 = True
		EndIf
	ElseIf $plus >= "4A" and $plus <= "4C" then
		$cplus = BinaryToString(Hex(Dec($cplus)+101, 2))&"3F"
	ElseIf $plus = "4D" then
		$cplus = BinaryToString(Hex(Dec($cplus)+104, 2))&"3F"
	ElseIf $plus >= "4E" and $plus <= "53" then
		$cplus = BinaryToString(Hex(Dec($cplus)+114, 2))&"3F"
	ElseIf $plus >= "54" and $plus <= "57" then
		$cplus = BinaryToString(Hex(Dec($cplus)+115, 2))&"3F"
	ElseIf $plus >= "58" and $plus <= "59" then
		$cplus = BinaryToString(Hex(Dec($cplus)+116, 2))&"3F"
	ElseIf $plus >= "5A" and $plus <= "8A" then
		$cplus = BinaryToString(Hex(Dec($cplus)+117, 2))&"3F"
	ElseIf $plus >= "8B" and $plus <= "9F" then
		$cplus = BinaryToString(Hex(Dec($cplus)-139, 2))&"40"
	ElseIf $plus = "A0" then
		$cplus = "1540"
	ElseIf $plus = "A1" then
		$cplus = "1640"
	ElseIf $plus = "A2" then
		$cplus = "1740"
	ElseIf $plus >= "A3" and $plus <= "AF" then
		$cplus = "1840"
	EndIf
	ConsoleWrite("1) "&$cplus&@CRLF)
		
	if StringLen($hex)>14 then 
		ConsoleWrite("2) "&$hex&@CRLF)
		$hex = StringRight($hex, 14)
		ConsoleWrite("3) "&$hex&@CRLF)
	EndIf
	
	For $i = StringLen($hex) - 1 To 3 Step -2
		$fhex &= StringMid($hex, $i, 2)
	Next
	ConsoleWrite("4) "&$fhex&@CRLF)

	$fhex &= $cplus
	ConsoleWrite("5) "&$fhex&@CRLF)
	
	if StringLen($fhex)<=16 then
		if $f_00 then
			for $a = 16-StringLen($fhex) to 2 step -2
				$fhex = Stringleft($fhex, 2)&$fhex
				ConsoleWrite("5.1) "&$fhex &" Length:"&stringlen($fhex)& @CR); проверить тут
			next
			
		else
			for $a = 16-StringLen($fhex) to 1 step -1
				$fhex = "0"&$fhex
			next
		EndIf
		$fhex = "0x"&$fhex
	else
		ConsoleWrite("It's bigger than 16 digits" & @CR)
		$fhex = ""
	endif
	ConsoleWrite("6) "&$fhex&@CRLF)
	
	$result = _Decode($fhex)
	ConsoleWrite("7) "&$result&@CRLF)
	
	if $hex = "07" then
		$result = 0.001
	ElseIf $hex = "09" then
		$result = 0.005
	ElseIf $hex = "0A" then
		$result = 0.01
	ElseIf $hex = "0D" then
		$result = 0.25
	ElseIf $hex = "0E" then
		$result = 0.5
	ElseIf $hex = "0F" then
		$result = 1
	ElseIf $hex = "18" then
		$result = "0"
	ElseIf $hex = "000C9A" then
		$result = "0,1"
	EndIf
	return $result
EndFunc

Func _Decode($bValue)
	$bValue = Binary($bValue)
    Local $tStruct1, $tStruct2

	ConsoleWrite("8) "&$bValue&@CRLF)
    $tStruct1 = DllStructCreate('uint64')
	ConsoleWrite("9) "&$tStruct1&@CRLF)
    DllStructSetData($tStruct1, 1, $bValue)
    $tStruct2 = DllStructCreate('double', DllStructGetPtr($tStruct1))
	ConsoleWrite("10) "&$tStruct2&@CRLF)
    Return DllStructGetData($tStruct2, 1)
EndFunc

прерывается закрытием процесса auto3.exe
с криком таким:
Код:
AppName: autoit3.exe	 AppVer: 3.3.6.0	 ModName: autoit3.exe
ModVer: 3.3.6.0	 Offset: 00008a0a
Полный лог привести не могу так как сообщение получится длинее 25000 символов.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: Баг 3.3.6.0 (с вылетом)

Это потому, что у тебя переменная $result является глобальной. Ты создал массив, после чего в ячейку массива помещаешь результат работы функции _normalize_double() (совершенно не понимаю, что она вообще делает), которая, в свою очередь, "убивает" этот самый массив. Таким образом ты вводишь AutoIt в большой ступор. Просто добавь следующее в начало функции _normalize_double():

Код:
Global $result
...
Func _normalize_double($hex)
    Local $result
    ...
EndFunc


Это не баг.
 

kaster

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

Yashied [?]
в таком случае тему надо бы перенести в раздел для новичков :smile:
и добавил в правила этого раздела пунктик о том, чтобы сначала каждый якобы баг сначала размещать в раздел для новичков, и только если баг подтвердится, перенести ее сюда
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: Баг 3.3.6.0 (с вылетом)

Kaster [?]
добавил в правила этого раздела пунктик о том, чтобы сначала каждый якобы баг сначала размещать в раздел для новичков
Плохая идея. Мы не занимаемся исправлением этих багов, для того и был создан раздел чтобы обсуждать потенциальные баги. Если баг подтверждается, мы его репортим на оф. трекер, иначе тема остаётся как [Не баг].

А вот название данной темы поменять не мешало бы...


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

Kaster [?]
добавил в правила этого раздела пунктик
Стоп, а где эти правила? :blink:
 

kaster

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

CreatoR
ну так если это не баг, а просто невнимательность или неправильное использование инструментария, то зачем этой теме быть в разделе, которая зовется "Баг-репорты..."? ;D
а вообще, это так, на правах предложения.
CreatoR [?]
Стоп, а где эти правила?
очепятался ;D
имел в виду надо бы добавить :whistle:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: Баг 3.3.6.0 (с вылетом)

Kaster [?]
если это не баг, а просто невнимательность или неправильное использование инструментария, то зачем этой теме быть в разделе, которая зовется "Баг-репорты..."?
Тогда это исключение, наподобии этого, и тогда нужно переносить. Но таких исключений немного, поэтому мы не можем это принимать как правило (постить в разделе для новичков по умолчанию).

имел в виду надо бы добавить
Есть желание написать общие положения для раздела? :whistle:
 
Автор
V

VitAl2013

Гость
Re: Баг 3.3.6.0 (с вылетом)

Хорошо, переносите куда хотите. Но почему Autoit не находит этот баг и стопорит (стандартный путь), а просто слетает, без здрасте-досвидания?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: Баг 3.3.6.0 (с вылетом)

В принципе согласен. По идее Autoit должен выдавать ошибку "Subscript used with non-Array variable.". Создал билет на баг треккере, а там посмотрим.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: Баг 3.3.6.0 (с вылетом)

Мда...

Код:
Dim $Arr[1]
$Arr[0] = _Test('')

Func _Test($vVar)
	$Arr = $vVar
	Return $Arr
EndFunc


и это как то связанно с передавемым параметром, т.к без него (или если передавть не строку, а числовой тип данных) скрипт не вылетает.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: Баг 3.3.6.0 (с вылетом)

Да, я уже поигрался с этим.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: Баг 3.3.6.0 (с вылетом)

И вот так ещё вылетает:

Код:
Dim $Arr[1]
$Arr[0] = _Test()

Func _Test($vVar='')
    $Arr = $vVar
EndFunc


и так:

Код:
Dim $Arr[1]
$Arr[0] = _Test()

Func _Test()
	$Arr = ''
EndFunc



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

и ещё:

Код:
Dim $Arr[1]
$Arr[0] = _Test()

Func _Test()
	$Arr = String(0) ;0 ;не вылетает
EndFunc



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

Провёл тесты на разных версиях:

Код:
; Не вылетает на: 3.2.8.1 / 3.2.10.0 / 3.2.12.0
; Вылетает на: 3.3.0.0 / 3.3.2.0 / 3.3.4.0 / 3.3.6.0
Dim $Arr[1]
$Arr[0] = _Test()

Func _Test()
	$Arr = ''
EndFunc

; Вылетает на: 3.2.8.1 /  3.2.10.0 / 3.3.0.0 / 3.3.2.0 / 3.3.4.0 / 3.3.6.0
; Не вылетает на: 3.2.12.0
Dim $Arr[1]
$Arr[0] = _Test('Test')

Func _Test($vVar)
	$Arr = $vVar
	Return $Arr
EndFunc



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

Yashied [?]
Создал билет на баг треккере
Обычно принято оставлять тут ссылку на созданный/найдены тикет ;), чтобы потом можно было легче отслеживать тикет.

http://www.autoitscript.com/trac/autoit/ticket/1551
 

SyDr

Сидра
Сообщения
651
Репутация
158
Код:
Dim $Arr[1]
$Arr[0] = Assign("Arr", "")


Дело не функции и не в передаваемых параметрах, а в том, что к тому времени, как элементу массива присваевается значение, переменная уже не является массивом.
В любом случае, это критическая ошибка для скрипта, поэтому будет вылет. Другое дело, что будет что-то типа "Subscript used with non-Array variable.", а не такой жестокий вылет...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Согласен с SyDr.
В примере идет переопределение переменной.
CreatoR сказал(а):
И вот так ещё вылетает:

Код:
Dim $Arr[1]
$Arr[0] = _Test()

Func _Test($vVar='')
    $Arr = $vVar
EndFunc
Вот так, всё нормально работает:
Код:
Dim $Arr[1]
$Arr[0] = _Test()

Func _Test($vVar='')
   Local $Arr = $vVar
EndFunc

Так или иначе, но Autoit не должен вылетать, а должен писать "Subscript used with non-Array variable"
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
SyDr [?]
Дело не функции и не в передаваемых параметрах, а в том, что к тому времени, как элементу массива присваевается значение, переменная уже не является массивом.

Я это уже сказал в самом начале. Но "жесткого" вылета быть не должно...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Yashied [?]
Ты создал массив, после чего в ячейку массива помещаешь результат работы функции _normalize_double() (совершенно не понимаю, что она вообще делает), которая, в свою очередь, "убивает" этот самый массив.
---
По идее Autoit должен выдавать ошибку "Subscript used with non-Array variable."

Пробежался бегло по ветке! А ведь на самом деле, всё уже сказано выше :smile:
 

SyDr

Сидра
Сообщения
651
Репутация
158
Yashied [?]
Я это уже сказал в самом начале. Но "жесткого" вылета быть не должно...
Понимаю. Просто все прицепились именно к функциям и передаваемым параметрам.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
SyDr [?]
все прицепились именно к функциям и передаваемым параметрам
Потому что в некоторых случаях переменная уже не массив, а скрипт не вылетает при этом...

Код:
Dim $Arr[1]
$Arr[0] = _Test(0) ;Стоит только здесь убрать 0, и скрипт снова вылетает. Как это объяснить?

Func _Test($sVar='')
    $Arr = ''
EndFunc



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

SyDr
Кстати, если в твоём примере заменить в Assign пустую строку ("") на 0, то также скрипт перестанет вылетать.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Это потому, что строка передается как указатель, в нашем случае непонятно на что.
 

SyDr

Сидра
Сообщения
651
Репутация
158
CreatoR [?]
Потому что в некоторых случаях переменная уже не массив, а скрипт не вылетает при этом...
Код: AutoIt [Выделить]
Dim $Arr[1]
$Arr[0] = _Test(0) ;Стоит только здесь убрать 0, и скрипт снова вылетает. Как это объяснить?
Func _Test($sVar='')
$Arr = ''
EndFunc
Этот вариант у меня всё равно вылетает.

Кстати, если в твоём примере заменить в Assign пустую строку ("") на 0, то также скрипт перестанет вылетать.
Однако продолжит вылетать, например, при использовании MsgBox (причём с любыми параметрами). В любом случае, после такого издевательства, скрипт явно начинает работать нестабильно.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Верх