Что нового

структура и её указатели

AmsTaFF

Новичок
Сообщения
15
Репутация
0
задача - создать связный список (своебразный). Я увидел ф-ции по созданию структур в авто ит, но не знаю как сделать так, чтобы структура оставалась в памяти
на С++ я бы сделал так:
struct some * p
p = new some;
p->a=2
p->b=3
p=0

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
В AutoIt хранение данных в структурах крайне не рекомендуется. Для этого нужно использовать массивы. Структуры предназначены только для доступа к функциям WinAPI посредством DllCall(). Даже название DllStrict... говорит само за себя. Структура в памяти существует до тех пор, пока переменной не присвоен 0.

Код:
$tStruct = DllStructCreate('wchar[260]')
...
$tStruct = 0


Лучше всего создавать структуры непосредственно перед вызовом DllCall(), но использовать их как хранилище данных не нужно. Хотя...

Для твоего случая можно написать так:

Код:
$tStruct = DllStructCreate('dword A;dword B')
DllStructSetData($tStruct, 'A', 2)
DllStructSetData($tStruct, 'B', 3)
...
ConsoleWrite(DllStructGetData($tStruct, 'A') & @CR)
ConsoleWrite(DllStructGetData($tStruct, 'B') & @CR)
...
$tStruct = 0
 
Автор
A

AmsTaFF

Новичок
Сообщения
15
Репутация
0
тогда как мне сделать связный список, он мне нужен для дерева, как его осуществить тогда? (массивом никак, использовать замысловатые строки я не хочу, уж очень не красиво и примитивно)
 
Автор
A

AmsTaFF

Новичок
Сообщения
15
Репутация
0
и насчет твоего и моего примера

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
AmsTaFF сказал(а):
тогда как мне сделать связный список, он мне нужен для дерева, как его осуществить тогда? (массивом никак, использовать замысловатые строки я не хочу, уж очень не красиво и примитивно)

Почему массивом никак? Сделай массив из массивов + ReDim.
 
Автор
A

AmsTaFF

Новичок
Сообщения
15
Репутация
0
а что такое Redim
и есть возможность сделать динамический массив?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
ReDim - изменяет длину массива без потери содержимого самого массива. Если ты имеешь в виду динамический по длине(ам) иассив, то да, это оно и есть. Доступа непосредственно к памяти массива, да и к памяти любых других переменных в AutoIt, нет. Только DllStruct...
 

killbond

Осваивающий
Сообщения
96
Репутация
32
AmsTaFF сказал(а):

Переопределение размерности массива, только при этом, в отличии от Dim, элементы не потеряют своих значений.

и есть возможность сделать динамический массив?

Есть, конечно, вот яркий тому пример:

Код:
#include <Array.au3>

Dim $aArray [ Round ( Random (10, 20) ) ]
For $iCounter = 0 to UBound ( $aArray ) - 1  
	$aArray [ $iCounter ] = Round ( Random ( 0, 100 ) )
Next

_ArrayDisplay ( $aArray )

$iValue = UBound ( $aArray )

ReDim $aArray [ $iValue + Round ( Random (10, 20) ) ]

For $iCounter = $iValue to UBound ( $aArray ) - 1  
	$aArray [ $iCounter ] = Round ( Random ( 0, 100 ) )
Next

_ArrayDisplay ( $aArray )
 
Автор
A

AmsTaFF

Новичок
Сообщения
15
Репутация
0
отлично, спасибо...
но вот вопрос - есть ли возможность создать структуру потипа дерева и ... как бы так назвать структуру похожее на дерево, но где эдемент может иметь более одного родителя?
 

Yashied

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

Массив из массивов из массивов ... см. здесь, второй пример.
 
Автор
A

AmsTaFF

Новичок
Сообщения
15
Репутация
0
думал найти более простые способы реализации )) спасибо
 
Верх