Что нового

[Данные, строки] _ArrayDisplay не могу понять принцип работы.

komorov74

Новичок
Сообщения
81
Репутация
0
Код:
$vibordata = _EzMySql_GetTable2d("SELECT god FROM datafilms ")
  ConsoleWrite($vibordata & @LF)

$error = @error
If Not IsArray($vibordata) Then MsgBox(0, $sMySqlStatement & " error", $error)
_ArrayDisplay($vibordata, "Фильмы заданного года")

 $iRetCode = _ArrayToClip( $vibordata, 1 )
MsgBox( 4096, "_ArrayToClip() Test", ClipGet() )
Exit


Ребят , не судите меня строго. Руки золотые но растут явно не из плеч.

Суть трабла. Есть база mysql клиент превосходно к ней конопатиться .
В итоге получаем таблицу _ArrayDisplay($vibordata, "Фильмы заданного года")

Вот дальше хоть убейте не могу допереть.
я не могу ,уже шестой час прочитать данные из _ArrayDisplay($vibordata, "Фильмы заданного года")
Таблица имеет вид:
[0]|god
[1]|2011
[2]|2012
[3]|2008
[4]|1945

я как понимаю сама $vibordata -какая то пустышка.
Пробывал

Код:
$iRetCode = _ArrayToClip( $vibordata, 1 )
MsgBox( 4096, "_ArrayToClip() Test", ClipGet() )
Exit


Выдаёт $vibordata

пробывал;

Код:
#include <Array.au3>
;
$avArray = StringSplit("4,2,06,8,12,5",",")
;
MsgBox(0,'Max Index String value',_ArrayMaxIndex( $avArray, 0, 1))
MsgBox(0,'Max Index Numeric value',_ArrayMaxIndex( $avArray, 1, 1))
;
MsgBox(0,'Max String value',_ArrayMax( $avArray, 0, 1))
MsgBox(0,'Max Numeric value',_ArrayMax( $avArray, 1, 1))
;
MsgBox(0,'Min Index String value',_ArrayMinIndex( $avArray , 0, 1))
MsgBox(0,'Min Index Numeric value',_ArrayMinIndex( $avArray, 1, 1))
;
MsgBox(0,'Min String value',_ArrayMin( $avArray, 0, 1))
MsgBox(0,'Min Numeric value',_ArrayMin( $avArray, 1, 0))

Exit


Из справки к программе - работает. Вставляю $vibordata - не работает.

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

Помогите пожалуйста всю эту $vibordata - запихнуть в текстовую переменную.
 

focus

Осваивающий
Сообщения
69
Репутация
20
Предложите копию оригинала, что читать надо.
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Если Вам показывает
Код:
_ArrayDisplay($vibordata, "Фильмы заданного года")

нормальный массив - значит $vibordata - есть массив.
Для обращения к каждому элементу Можно использовать:
Код:
For $i = 0 to Ubound($vibordata) - 1
    ConsoleWrite($vibordata[$i] & @CRLF)
Next


P.S. _ArrayDisplay по сути существует для дебага программы, что бы чисто посмотреть какие значения имеет массив.
 
Автор
K

komorov74

Новичок
Сообщения
81
Репутация
0
Код:
For $i = 0 to Ubound($vibordata) - 1
    ConsoleWrite($vibordata[$i] & @CRLF)
Next


Вот так вот работает


Код:
$vibordata = _EzMySql_GetTable2d("SELECT god FROM datafilms ")
  ConsoleWrite($vibordata & @LF)
For $i = 0 to Ubound($vibordata) - 1
    ConsoleWrite($vibordata[$i] & @CRLF)
Next



А вот так уже нет :(


Код:
$vibordata = _EzMySql_GetTable2d("SELECT god FROM datafilms ")
  ConsoleWrite($vibordata & @LF)
$error = @error
If Not IsArray($vibordata) Then MsgBox(0, $sMySqlStatement & " error", $error)
_ArrayDisplay($vibordata, "Фильмы заданного года")
For $i = 0 to Ubound($vibordata) - 1
    ConsoleWrite($vibordata[$i] & @CRLF)
Next



В чем траблы ?



и куда вставить Dim $sArrayString = _ArrayToString($vibordata), 1, 5, "/" ) что бы заработало

Код:
$vibordata = _EzMySql_GetTable2d("SELECT god FROM datafilms ")
  ConsoleWrite($vibordata & @LF)

For $i = 0 to Ubound($vibordata) - 1
   ; ConsoleWrite($vibordata[$i][0] & @CRLF)
 
 
 
Dim $sArrayString = _ArrayToString($vibordata), 1, 5, "/" )
;next
ConsoleWrite($sArrayString & @CRLF)

Next


так не работает , за next тоже вставлял.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
У меня всё работает...
И вот это работает
Код:
$vibordata = _EzMySql_GetTable2d("SELECT god FROM datafilms ")
  ConsoleWrite($vibordata & @LF)
$error = @error
If Not IsArray($vibordata) Then MsgBox(0, $sMySqlStatement & " error", $error)
_ArrayDisplay($vibordata, "Фильмы заданного года")
For $i = 0 to Ubound($vibordata) - 1
    ConsoleWrite($vibordata[$i] & @CRLF)
Next


Единственное что вижу проблемное в твоём коде - вот это
Код:
For $i = 0 to Ubound($vibordata) - 1
   ; ConsoleWrite($vibordata[$i][0] & @CRLF)

^^
 

joiner

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

Код:
#include <File.au3>
#include <Array.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Dim $vibordata
_FileReadToArray("test.txt", $vibordata); как пример взято чтение файла.
$sArrayString=_ArrayToString($vibordata, "|",1,5)
$Form1 = GUICreate("Form1", 262, 94, 192, 124)
$Combo1 = GUICtrlCreateCombo("Combo1", 64, 40, 145, 25)
GUICtrlSetData($Combo1,$sArrayString)
GUISetState(@SW_SHOW)


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
А твой test.txt небольшой?
Сюда скопировать его содержимое можешь?

А ничего что синтаксис нарушен?
Код:
Dim $sArrayString = _ArrayToString($vibordata), 1, 5, "/" )
ConsoleWrite($sArrayString & @CRLF)


Должно быть вроде бы
Код:
Dim $sArrayString = _ArrayToString($vibordata, "/", 1, 5 )
ConsoleWrite($sArrayString & @CRLF)
 
Автор
K

komorov74

Новичок
Сообщения
81
Репутация
0
Код:
Dim $vibordata
_FileReadToArray("test.txt", $vibordata); как пример взято чтение файла.


извиняюсь за противность,
а в переменную нельзя запихнуть , а то как то на диск писать не очень.
И ещё а как правильно записать на диск "test.txt"
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
komorov74 [?]
И ещё а как правильно записать на диск "test.txt"
Предупреждение За нарушение общих правил (пункт В.4):
Не лепите несколько вопросов разной тематики в один пост. По типу "Ребят, а ещё такой вопрос...". Каждый вопрос в свою тему.


С уважением, ваш Модератор.
 

joiner

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


komorov74 [?]
И ещё а как правильно записать на диск "test.txt"
посмотри в примере на который я указал в предыдущем посте
 
Автор
K

komorov74

Новичок
Сообщения
81
Репутация
0
_ArrayDisplay ( $vibordata )

получаем ,смотрим вложение

далее
Код:
For $i = 0 to Ubound($vibordata) - 1
   $asd=($vibordata[$i][0])
 ConsoleWrite( $asd & @LF)
Next

В консоль выдаются значения-все гуд

Далее _FileWriteFromArray("c:\text1.txt", $vibordata, 1)
ОШИБКА C:\Program Files (x86)\AutoIt3\Include\file.au3 (256) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
If FileWrite($hFile, $a_Array[$x] & @CRLF) = 0 Then
If FileWrite($hFile, ^ ERROR
я как понял жалуется на функцию.

НО
Код:
#include<File.au3>

$avCommon = _FileListToArray(@CommonFilesDir)
$avUser = _FileListToArray(@UserProfileDir)
$sFile = @ScriptDir & "\Test.txt"

; Write first array to file by string file name
_FileWriteFromArray($sFile, $avCommon, 1)

; Open file and append second array
$hFile = FileOpen($sFile, 1) ; 1 = append
_FileWriteFromArray($hFile, $avUser, 1)
FileClose($hFile)

; Display results
Run("notepad.exe " & $sFile)


Выдранный из справки работает.

Теперь внимание!!! $asd=($vibordata[$i][0] -работает
$asd=($vibordata[$i] не работает
( кто то сделал замечание).

Ребят я не дебил. Может дело в том как я создаю масив ?
Код:
$vibordata = _EzMySql_GetTable2d("SELECT god FROM datafilms ")


Я если честно не селен в английском , а описании функции _EzMySql_GetTable2d не нашел.



полное описание http://www.autoitscript.com/forum/topic/116072-ezmysql-udf-use-mysql-databases-with-autoit/

Но после неё все таки нормально обрабатывается _ArrayDisplay ( $avArray, $sTitle )
А во всех почти примерах все танцы на ней и заканчиваются.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Смотри.
_EzMySql_GetTable2d возвращает двумерный массив.
В твоём случае массив размера [5][1].
_ArrayDisplay его честно отображает, но в его отображении он выглядит так же как одномерный.
А вот _FileWriteFromArray работает уже только с одномерным массивом, потому у тебя и лезут ошибки.
И твой эксперимент это подтверждает.
Теперь внимание!!! $asd=($vibordata[$i][0] -работает
$asd=($vibordata[$i] не работает

Попробуй
Код:
For $i = 0 to Ubound($vibordata) - 1
   $vibordata1[$i]=$vibordata[$i][0]
Next
_FileWriteFromArray("text1.txt", $vibordata1, 1)
 
Автор
K

komorov74

Новичок
Сообщения
81
Репутация
0
К сожалению я уже это побывал. :(
Код:
For $i = 0 to Ubound($vibordata) - 1
   $vibordata1[$i]=$vibordata[$i][0]
Next
_FileWriteFromArray("text1.txt", $vibordata1, 1)


Остановился на варианте
Код:
$vibordata = _EzMySql_GetTable2d("SELECT god,tip FROM datafilms ")
$error = @error
If Not IsArray($vibordata) Then MsgBox(0, $sMySqlStatement & " error", $error)
  ConsoleWrite($vibordata & @LF)
 ConsoleWrite($error & @CRLF)
 
 _ArrayDisplay ( $vibordata )
 $godtxt=FileOpen ( "c:\text1.txt", 2 )
For $i = 1 to Ubound($vibordata) - 1
   $asd=($vibordata[$i][0])
  
FileWriteLine ( "c:\text1.txt", $asd ) 
Next

FileClose($godtxt)


Кстати
Код:
ConsoleWrite($error & @CRLF)
уверенно выдаёт всегда 0 :mad:
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Ну он и должен в консоль 0 выдавать.
Нескромный вопрос: ты файл text1.txt ищешь в корне диска C: ?
 
Автор
K

komorov74

Новичок
Сообщения
81
Репутация
0
да , и он там есть:smile:
в функции написано что 0 это ошибка.



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

Ребят , большое спасибо , кто мне помогает. :shok:
У меня складывается такое впечатление , что у меня на компе чего то не так работает.

Код:
#include <File.au3>
#include <Array.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Dim $vibordata
_FileReadToArray("c:\test1.txt", $vibordata); как пример взято чтение файла.
$sArrayString=_ArrayToString($vibordata, "|",1,5)
$Form1 = GUICreate("Form1", 262, 94, 192, 124)
$Combo1 = GUICtrlCreateCombo("Combo1", 64, 40, 145, 25)
GUICtrlSetData($Combo1,$sArrayString)
GUISetState(@SW_SHOW)


While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit

    EndSwitch
WEnd


Файл точно есть c:\text1.txt

с данными
100
200
300

но скрипт не работает

Выдает пустое окно $Combo1 = GUICtrlCreateCombo("Combo1", 64, 40, 145, 25)
$sArrayString - в консоле тоже пустое

Что делать ?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
имена файлов не совпадают :smile:
text1 или test1 ?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
в функции написано что 0 это ошибка.
Нее, в функции написано что она сама возвращает 0, если ошибка, и при этом устанавливает ненулевые значения @error в зависимости от того какая ошибка.
То есть при успешном выполнении запроса в консоль у тебя и должен писаться 0.

Пример с Combo тоже работает после исправления имени файла.

Я что-то потерял суть обсуждения... А что не работает то?
С _ArrayDisplay разобрались - _EzMySql_GetTable2d возвращает двумерный массив размерности [$n][1], который в _ArrayDisplay выглядит точно так же как одномерный массив [$n]. Поэтому твой массив $vibordata в _ArrayDisplay скармливается нормально, а _FileWriteFromArray и _ArrayToString на $vibordata загибаются, потому что им нужен одномерный массив.
Путаницу с именами файлов тоже выявили.
Где ещё ошибки проявляются?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
C2H5OH [?]
Путаницу с именами файлов тоже выявили.Где ещё ошибки проявляются?
вот ты неугомонный. человек спать ушел...
не все же ягуаром бодрятся для решения задач ;D
 
Верх