purebasic.info

PureBasic forum
Текущее время: Сб дек 16, 2017 12:41 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 419 ]  На страницу Пред.  1 ... 24, 25, 26, 27, 28  След.
Автор Сообщение
 Заголовок сообщения: Re: Моя копилка. Переводы
СообщениеДобавлено: Вс июл 02, 2017 5:47 am 
Не в сети
док
Аватар пользователя

Зарегистрирован: Вт янв 26, 2016 4:44 pm
Сообщений: 133
Благодарил (а): 41 раз.
Поблагодарили: 17 раз.
Пункты репутации: 0
Здравствуйте.
Уткнулся в перевод AllocateStructure().
По хелпам не могу понять, как ТОЧНО ПО СМЫСЛУ перевести : "что эта функция делает"
Гугловский перевод английского хелпа даёт: "Выделяет новый элемент динамической структуры. Этот элемент динамической структуры правильно инициализирован и готов к использованию, без необходимости вызова InitializeStructure (). Чтобы получить доступ к данным структуры, необходимо использовать указатель, связанный с указанным «StructureName».

Французский вариант : "Распределяет новый объект типа динамической структуры.
Эта динамическая структура правильно инициализирована и готова к использованию без необходимости вызывать InitializeStructure (). Чтобы получить доступ к данным структуры, следует использовать указатель, связанный с «Структура» указан."

PS
Кажется смысл дошёл. 2 дня потратил...

AllocateStructure() - это типа макрокоманда заменяющая последовательность:

*Student.People = AllocateMemory(SizeOf(People))
InitializeStructure(*Student, People)
в коде:
Код:
1
2
3
4
5
6
7
8
9
10
 
Structure People
    Name$
    Age.l
    List Friends.s()
  EndStructure
 
  *Student.People = AllocateMemory(SizeOf(People))
  InitializeStructure(*Student, People)
 


то есть можно написать:
Код:
1
2
3
4
5
6
7
8
9
 
Structure People
  Name$
  Age.l
  List Friends.s()
EndStructure
 
*Student.People = AllocateStructure(People)
 


И всего делов то, сочиню как ни-будь.


Последний раз редактировалось sergey2400 Вс июл 02, 2017 10:01 am, всего редактировалось 3 раз(а).

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Моя копилка. Переводы
СообщениеДобавлено: Вс июл 02, 2017 9:57 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 283
Благодарил (а): 1 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
Для понимания написанного важно вспомнить, о необходимости new для list и map использование которых допускается в пуриковских структурах. Т.е. помимо действий связанных с аналогом sizeof и alloc требуются действия инициализации для некоторых элементов структуры. Для структур состоящих из элементов вычислимых(для строк хранится указатель если это не строка фиксированной длины .s{длина}) размеров достаточного просто выделить память в других случаях требуется то, о чём идёт речь в вопросе.

p.s. как по русски писать об этом для людей не прошедших последовательно путь "в кодах", на асме, на Си, и уже потом на других языках, не знаю.


Последний раз редактировалось jobless Вс июл 02, 2017 7:25 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Моя копилка. Переводы
СообщениеДобавлено: Вс июл 02, 2017 10:05 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11070
Благодарил (а): 4 раз.
Поблагодарили: 381 раз.
sergey2400 писал(а):
"Выделяет новый элемент динамической структуры. Этот элемент динамической структуры правильно инициализирован и готов к использованию, без необходимости вызова InitializeStructure (). Чтобы получить доступ к данным структуры, необходимо использовать указатель, связанный с указанным «StructureName»
Наверное правильнее будет
Цитата:
Динамически создает новый экземпляр структуры, который проинициализирован и готов к использованию, без необходимости вызова InitializeStructure(). Для работы с экземпляром структуры необходимо использовать указатель с указанным «StructureName»

sergey2400 писал(а):
Чем динамическая структура отличается от просто структуры?
Код с использованием динамически создаваемых экземпляров структур.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
PurifierGranularity(1, 1, 1, 1)
 
Structure Test
  s.s
  x.i
EndStructure
 
Procedure CreateObject(x)
 
  *Res.Test = AllocateStructure(Test)
  *Res\s = Str(x)
  *Res\x = x
 
  ProcedureReturn *Res
EndProcedure
 
*x1.Test = CreateObject(1)
*x2.Test = CreateObject(2)
*x3.Test = CreateObject(3)
*x4.Test = CreateObject(4)
 
Debug *x1\s
Debug *x1\x
Debug *x2\s
Debug *x2\x
Debug *x3\s
Debug *x3\x
Debug *x4\s
Debug *x4\x
 
FreeStructure(*x1)
FreeStructure(*x2)
FreeStructure(*x3)
FreeStructure(*x4)

Тоже самое но без динамического создания экземпляров структур
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
PurifierGranularity(1, 1, 1, 1)
 
Structure Test
  s.s
  x.i
EndStructure
 
Procedure CreateObject(x)
 
  Res.Test
  Res\s = Str(x)
  Res\x = x
 
  ProcedureReturn @Res
EndProcedure
 
*x1.Test = CreateObject(1)
*x2.Test = CreateObject(2)
*x3.Test = CreateObject(3)
*x4.Test = CreateObject(4)
 
Debug *x1\s
Debug *x1\x
Debug *x2\s
Debug *x2\x
Debug *x3\s
Debug *x3\x
Debug *x4\s
Debug *x4\x
 
ClearStructure(*x1, Test)
ClearStructure(*x2, Test)
ClearStructure(*x3, Test)
ClearStructure(*x4, Test)


Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
PurifierGranularity(1, 1, 1, 1)
 
Structure Test
  s.s
  x.i
EndStructure
 
Procedure CreateObject(x)
 
  Static Res.Test
  Res\s = Str(x)
  Res\x = x
 
  ProcedureReturn @Res
EndProcedure
 
*x1.Test = CreateObject(1)
*x2.Test = CreateObject(2)
*x3.Test = CreateObject(3)
*x4.Test = CreateObject(4)
 
Debug *x1\s
Debug *x1\x
Debug *x2\s
Debug *x2\x
Debug *x3\s
Debug *x3\x
Debug *x4\s
Debug *x4\x
 
ClearStructure(*x1, Test)
ClearStructure(*x2, Test)
ClearStructure(*x3, Test)
ClearStructure(*x4, Test)

Разница в работе заметна?

sergey2400 писал(а):
Судя по этому, AllocateStructure(aaa) = AllocateMemory(SizeOf(aaa)), это значит просто выделяется нужное для конкретной структуры количество памяти.
Сравни работу кода с AllocateMemory и с AllocateStructure.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
PurifierGranularity(1, 1, 1, 1)
 
Structure Test
  s.s
  x.i
  List xx.i()
EndStructure
 
Procedure CreateObject(x)
 
  *Res.Test = AllocateMemory(SizeOf(Test))
  ;*Res.Test = AllocateStructure(Test)
  *Res\s = Str(x)
  *Res\x = x
 
  For i=0 To 10*x
    If AddElement(*Res\xx())
      *Res\xx() = i*x
    EndIf
  Next
 
  ProcedureReturn *Res
EndProcedure
 
*x1.Test = CreateObject(1)
*x2.Test = CreateObject(2)
*x3.Test = CreateObject(3)
*x4.Test = CreateObject(4)
 
Debug *x1\s
Debug *x1\x
Debug *x2\s
Debug *x2\x
Debug *x3\s
Debug *x3\x
Debug *x4\s
Debug *x4\x
 
FreeStructure(*x1)
FreeStructure(*x2)
FreeStructure(*x3)
FreeStructure(*x4)


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Моя копилка. Переводы
СообщениеДобавлено: Пн июл 03, 2017 12:40 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Вт янв 26, 2016 4:44 pm
Сообщений: 133
Благодарил (а): 41 раз.
Поблагодарили: 17 раз.
Пункты репутации: 0
Здравствуй Пётр и спасибо за ответы!

У меня Только сейчас появилось время поразбираться...

Получается для каждого вызова AllocateStructure(Test) в памяти создаётся один новый экземпляр структуры с уникальным адресом и все созданные (даже в процедуре) структуры остаются жить, и доступны через указатели с любого места кода. В то время как, код без AllocateStructure(Test) создаёт только одну структуру и та умирает при каждом выходе из процедуры. По крайней мере, возвращаемое значение из процедуры одно и то же.

В таком случае зачем этот код:
Код:
1
2
3
4
5
6
 
ClearStructure(*x1, Test)
ClearStructure(*x2, Test)
ClearStructure(*x3, Test)
ClearStructure(*x4, Test)
 


если структуры всё равно умирают при выходе из процедуры...
И главное, что этот код знает, что эти структуры есть....

А этот код , без AllocateStructure() ещё требует инициализации, вроде правильно запустил.
Но всё как-то зыбко, методом тыка, блин.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
PurifierGranularity(1, 1, 1, 1)
 
Structure Test
  s.s
  x.i
  List xx.i()
EndStructure
 
Procedure CreateObject(x)
 
  *Res.Test = AllocateMemory(SizeOf(Test))
  InitializeStructure(*Res.Test, Test)
  ;*Res.Test = AllocateStructure(Test)
  *Res\s = Str(x)
  *Res\x = x
 
  For i=0 To 10*x
    If AddElement(*Res\xx())
      *Res\xx() = i*x
    EndIf
  Next
 
  ProcedureReturn *Res
EndProcedure
 
*x1.Test = CreateObject(1)
*x2.Test = CreateObject(2)
*x3.Test = CreateObject(3)
*x4.Test = CreateObject(4)
 
Debug *x1\s
Debug *x1\x
Debug *x2\s
Debug *x2\x
Debug *x3\s
Debug *x3\x
Debug *x4\s
Debug *x4\x
 
ClearStructure(*x1, Test)
ClearStructure(*x2, Test)
ClearStructure(*x3, Test)
ClearStructure(*x4, Test)
 
;FreeStructure(*x1)
;FreeStructure(*x2)
;FreeStructure(*x3)
;FreeStructure(*x4)
 


Всё очень зыбко, если бы словами какую нибудь информацию подкинул, было бы легче.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Моя копилка. Переводы
СообщениеДобавлено: Пн июл 03, 2017 1:01 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11070
Благодарил (а): 4 раз.
Поблагодарили: 381 раз.
sergey2400 писал(а):
В таком случае зачем этот код
Четыре вызова ClearStructure точно не нужно (остались от первого примера). Хватило бы и одного, поскольку в памяти только один экземпляр структуры. Если это была локальный экземпляр структуры в процедуре, то как видно из работы кода, программа вообще падает, ведь при выходе из процедуры все локальные объекты освобождаются.

sergey2400 писал(а):
ещё требует инициализации
И освобождения памяти.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
PurifierGranularity(1, 1, 1, 1)
 
Structure Test
  s.s
  x.i
  List xx.i()
EndStructure
 
Procedure CreateObject(x)
 
  *Res.Test = AllocateMemory(SizeOf(Test))
  InitializeStructure(*Res.Test, Test)
  ;*Res.Test = AllocateStructure(Test)
  *Res\s = Str(x)
  *Res\x = x
 
  For i=0 To 10*x
    If AddElement(*Res\xx())
      *Res\xx() = i*x
    EndIf
  Next
 
  ProcedureReturn *Res
EndProcedure
 
*x1.Test = CreateObject(1)
*x2.Test = CreateObject(2)
*x3.Test = CreateObject(3)
*x4.Test = CreateObject(4)
 
Debug *x1\s
Debug *x1\x
Debug *x2\s
Debug *x2\x
Debug *x3\s
Debug *x3\x
Debug *x4\s
Debug *x4\x
 
ClearStructure(*x1, Test)
ClearStructure(*x2, Test)
ClearStructure(*x3, Test)
ClearStructure(*x4, Test)
 
FreeMemory(*x1)
FreeMemory(*x2)
FreeMemory(*x3)
FreeMemory(*x4)



sergey2400 писал(а):
если бы словами какую нибудь информацию подкинул, было бы легче
В случае AllocateStructure нужно вызвать функцию с именем структуры, проверить указатель и если не 0 (проверять необходимо всегда, в примерах для упрощения этой проверки нет), то можно работать с экземпляром структуры. Когда экземпляр структуры больше не нужен, его следует освободить вызовом функции FreeStructure.

В случае AllocateMemory все тоже самое, но после проверки указателя, следует проинициализировать экземпляр структуры функцией InitializeStructure. Удаление экземпляра структуры выполняется вызовом ClearStructure и FreeMemory.

Т. е. AllocateStructure совмещает в себе AllocateMemory и InitializeStructure, а FreeStructure соответственно ClearStructure и FreeMemory. Но это не значит что можно создать экземпляр структуры с помощью AllocateMemory и InitializeStructure, а осовбодить функцией FreeStructure.
Это приведет к ошибкам, т. к. функции несовместимы.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Structure Test
  s.s
  x.i
  List xx.i()
EndStructure
 
*Res.Test = AllocateMemory(SizeOf(Test))
InitializeStructure(*Res.Test, Test)
*Res\s = Str(x)
*Res\x = x
 
For i=0 To 10*x
  If AddElement(*Res\xx())
    *Res\xx() = i*x
  EndIf
Next
 
FreeStructure(*Res)


Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Structure Test
  s.s
  x.i
  List xx.i()
EndStructure
 
*Res.Test = AllocateStructure(Test)
*Res\s = Str(x)
*Res\x = x
 
For i=0 To 10*x
  If AddElement(*Res\xx())
    *Res\xx() = i*x
  EndIf
Next
 
ClearStructure(*Res, Test)
FreeMemory(*Res)


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Моя копилка. Переводы
СообщениеДобавлено: Ср июл 19, 2017 8:04 am 
Не в сети
док
Аватар пользователя

Зарегистрирован: Вт янв 26, 2016 4:44 pm
Сообщений: 133
Благодарил (а): 41 раз.
Поблагодарили: 17 раз.
Пункты репутации: 0
Всем привет.
Вопросик есть... чтоб не было потом вопросов.

В общем, накатал статейку про "Структуры", на замену штатной статьи справки, которая на главной странице справки обозначена, как Structure : EndStructure.
См. во вложении.

Собрал материал, примерно с 30 статей по структурам на разных языках, все что там написано - всё верно и всё работает (консультировался с Петром). НО. Статья получилась великовата и не в полной мере соответствует терминологии справки Пурика. Например не структурированный массив, а массив экземпляров структур. Судя по разным учебникам и книгам - правильно именно: массив структур или массив экземпляров структур. В связи с этим вижу два путя:

1) Дополнить статью по максимуму (там кое где просто ссылки на другие статьи в справке пурика) и оформить её как отдельную страничку в справке, а ссылку можно положить в родную статью Structure : EndStructure.
2) Заменить родную статью и привести к общему знаменателю терминологию в других страничках справки (там не очень много). Но привычка дело такое, что кого то замена напрягать будет. Но с другой стороны общая терминология с другими книгами, учебниками, статьями, по языку СИ и другим языкам - сильно облегчает понимание некоторых вещей типа API и прочего. К тому же различие не так велико.

Мысленно я за второй вариант и согласен для этого поработать. Что Вы думаете по этому поводу?
Если лень/некогда писать можно просто лайкнуть - буду считать за второй вариант.


Вложения:
structures.rar [9.87 KiB]
Скачиваний: 31
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Моя копилка. Переводы
СообщениеДобавлено: Ср июл 19, 2017 5:24 pm 
Не в сети
док

Зарегистрирован: Ср апр 16, 2014 5:56 pm
Сообщений: 113
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 5
ВСЮ статью ещё не прочёл. Но на первый взгляд - прекрасная затея. Потому что 99% на форуме добывали знания громадным трудом. Зато потом сами объяснить ленятся, пишут что-то: "флаг #EBP_SPECIALGROUPEXPAND тебе в руки". Если новичок знает API и этот флаг, с чего ему вообще спрашивать?
Нет, я сам лично обеими руками за второй вариант. Справка с человеческим лицом, много комментариев, работа огромная!
sergey2400 писал(а):
НО. Статья получилась великовата и не в полной мере соответствует терминологии справки Пурика. Например не структурированный массив, а массив экземпляров структур. Судя по разным учебникам и книгам - правильно именно: массив структур или массив экземпляров структур.

Ну, конечно, имелось в виду "массив указателей на структуры"! Массив структур - несбыточная мечта. Я подразумеваю такой массив, который содержит собственно сами структуры. Лично я не щепетилен и благодарен за такую Справку!
Не обращайте внимания на недовольных. Никто не заставляет ставить себе эту или другую. Пётр вообще цитирует аглицкую.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Моя копилка. Переводы
СообщениеДобавлено: Ср июл 19, 2017 6:28 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11070
Благодарил (а): 4 раз.
Поблагодарили: 381 раз.
6519And писал(а):
Массив структур - несбыточная мечта.
Ну вот, несбыточная мечта сбылась. :)
Код:
1
2
3
4
5
6
7
8
9
Dim x.POINT(10)
 
x(0)\x = $10
x(0)\y = $20
 
x(10)\x = $50
x(10)\y = $80
 
ShowMemoryViewer(@x(), (ArraySize(x())+1) * SizeOf(POINT))


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Моя копилка. Переводы
СообщениеДобавлено: Ср июл 19, 2017 10:36 pm 
Не в сети
док

Зарегистрирован: Ср апр 16, 2014 5:56 pm
Сообщений: 113
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 5
Пётр писал(а):
Ну вот, несбыточная мечта сбылась. :)
Код:
1
2
3
4
5
6
7
8
9
Dim x.POINT(10)
 
x(0)\x = $10
x(0)\y = $20
 
x(10)\x = $50
x(10)\y = $80
 
ShowMemoryViewer(@x(), (ArraySize(x())+1) * SizeOf(POINT))


Мне кажется, это и есть структурированный массив указателей (т.е. адресов) на поля структуры POINT.
Мне нравится, что Пётр показал просмотрщик памяти (буду использовать). Коллеги, речь была о мелкой неточности: не массив структуР, а массив структуРЫ. Но вместо оффтопа насчёт неструктурированного мультиструктурного массива (выговорил-таки!) лучше скажу вам "спасибо", у меня настроение хорошее...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Моя копилка. Переводы
СообщениеДобавлено: Ср июл 19, 2017 11:35 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11070
Благодарил (а): 4 раз.
Поблагодарили: 381 раз.
6519And писал(а):
Мне кажется, это и есть структурированный массив указателей (т.е. адресов) на поля структуры POINT.
Где в MemoryViewer находятся адреса указателей на экземпляры структур? Там кроме данных записанных в поля структуры больше ничего нет.

6519And писал(а):
не массив структуР, а массив структуРЫ
Во множественном числе будет структуР. В массиве как правило больше одного экземпляра структуры.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Моя копилка. Переводы
СообщениеДобавлено: Ср июл 19, 2017 11:43 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Вт янв 26, 2016 4:44 pm
Сообщений: 133
Благодарил (а): 41 раз.
Поблагодарили: 17 раз.
Пункты репутации: 0
6519And писал(а):
Мне кажется, это и есть структурированный массив указателей (т.е. адресов) на поля структуры POINT.
Мне нравится, что Пётр показал просмотрщик памяти (буду использовать). Коллеги, речь была о мелкой неточности: не массив структуР, а массив структуРЫ. Но вместо оффтопа насчёт неструктурированного мультиструктурного массива (выговорил-таки!) лучше скажу вам "спасибо", у меня настроение хорошее...


6519And
На счёт просмотрщика памяти: В справке описание всех инструментов переведено ( в разделе "Среда разработки PureBasic (IDE)" -> все подразделы). Вы удивитесь СКОЛЬКО там инструментов ещё кроме просмотрщика... посмотрите не пожалеете.
Я имею ввиду, хотя бы вот эту справку: https://yadi.sk/d/iyRBZLMs3KNz69

По поводу массива экземпляров структур...
Structure : EndStructure - во всех языках считается, что это создание шаблона для будущих объектов (экземпляров) структур, по другому создание типа для последующего объявления например переменной, внутренняя структура которой будет как указано в этом шаблоне. Так вот эта объявленная переменная с типом созданным в Structure : EndStructure и есть первый реально существующий объект, под который реально выделена память и с которым можно работать.
А то, что даёт создание Structure : EndStructure - это всего лишь шаблон, под него нет выделенной памяти.
И например, объявление массива Dim x.POINT(10) - даёт 11 элементов и внутреннее устройство каждого элемента соответствует шаблону заданному в Structure : EndStructure, и под каждый элемент выделяется память в соответствии с требованиями шаблона структуры. Другими словами массив с типом POINT - есть массив экземпляров (объектов в памяти) структуры POINT. Противоречит (в плане терминологии), только справка пурика.
Структурированный массив - вероятно не правильно перевели, должно быть массив структур, тогда вообще всё сходится. Иногда при сомнении можно заглянуть во французскую справку - бывают неожиданные открытия: они и на английский не правильно перевели....


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Моя копилка. Переводы
СообщениеДобавлено: Чт июл 20, 2017 5:17 pm 
Не в сети
док

Зарегистрирован: Ср апр 16, 2014 5:56 pm
Сообщений: 113
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 5
Насчёт "массива структур": что находится в ЯЧЕЙКАХ массива? Экземпляры структур?
Здесь я разъяснял, что, в отличие от просто массива, структурированный массив может содержать лишь адреса на поля структуры (или структур). Словосочетание "массив чего-то" в русском языке подразумевает "массу однородных объектов", для неструктурированного Array() это переменные одного типа, для структурированного - также однородные (по типу) адреса. Так что "массив структур" невозможен: если неструктурированный - в него нельзя запихнуть "экземпляры структур" символьные и бинарные, а структурированный не может указывать на поля ОДНОВРЕМЕННО нескольких структур (я, правда, не уверен насчёт Union: может, удастся извратиться). Было бы классно переключать массив на желаемую структуру, но это решается проще через вложения структур. Нет смысла в создании "универсального многоструктурного массива", поскольку и массив, и структура суть разновидность памяти.
Проще говоря: берём структуру POINT и структуру COLORADJUSTMENT. Ну и как сделать "массив двух структур"? Размерность массива будет по максимальной, да? Или массив многомерный? Для 32 осей это будет гигабайт...
sergey2400, повторяю: спасибо за нужное начинание! Ваша статья мне понравилась очень, особенно желанием разъяснить простыми словами.
Если Вы возмущены - я всё понимаю. Но, если я заблуждаюсь в массивах, то пусть меня научат, а то всё сам, да сам...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Моя копилка. Переводы
СообщениеДобавлено: Чт июл 20, 2017 7:23 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11070
Благодарил (а): 4 раз.
Поблагодарили: 381 раз.
6519And писал(а):
Насчёт "массива структур": что находится в ЯЧЕЙКАХ массива? Экземпляры структур?
Да.

6519And писал(а):
Словосочетание "массив чего-то" в русском языке подразумевает "массу однородных объектов"
Чем масса одинаковых структур этому противоречит?

6519And писал(а):
в него нельзя запихнуть "экземпляры структур"
Что этому мешает? Выше приводил пример. viewtopic.php?p=87578#p87578

6519And писал(а):
а структурированный не может указывать на поля ОДНОВРЕМЕННО нескольких структур
Это и не нужно. У массива есть индексы. По каждому индексу свой экземпляр структуры.

6519And писал(а):
Проще говоря: берём структуру POINT и структуру COLORADJUSTMENT. Ну и как сделать "массив двух структур"?
Разве в описании где-то сказано что структуры могут быть разными. Они должны быть однотипными.
"массив структур" означает не то что в нем разные структуры, а то что массив содержит экземпляры структур.
Введите запрос массив структур в поисковике и посмотрите что он выдаст.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Моя копилка. Переводы
СообщениеДобавлено: Чт июл 20, 2017 10:45 pm 
Не в сети
док

Зарегистрирован: Ср апр 16, 2014 5:56 pm
Сообщений: 113
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 5
Пётр, надеюсь, заблуждаться искренне не есть преступление. У меня и Вас разные представления о содержимом массива. Ну пусть там хранятся "экземпляры структур" - тогда что есть оные?
Код:
1
2
3
4
5
6
7
8
9
Structure stuctI
  a.s
  b.l
EndStructure
 
Dim MyArray(2)
 
MyArray(0)=@stuctI
MyArray(1)=@p.POINT


Вот здесь MyArray() вроде бы содержит структуры. Но на самом деле - лишь их адреса, это же косвенная адресация. Чтобы записать что-то в поле p\y, можно указать это явно, а можно через смещение. Но ведь сами члены p\y и p\x не находятся в массиве, а остались на своих местах в POINT, просто компилятор PureBasic избавляет нас от необходимости непосредственно задавать их адреса! Что действительно лежит в ячейках MyArray() - так это числа: адреса определённых полей обеих структур. Причём одно поле stuctI символьное, а другое цифровое. Разве можно было б такое записать непосредственно в массив?
Вы же знаете, что вместо самой информации часто можно использовать указатель на неё в памяти.
Например, в процедуру передаётся не содержимое массива, а указатель на него.
А когда мы говорим "массив переменных", то имеем в виду массив с переменными в его ячейках.
Я думаю, что "экземпляры структур" - крайне неудачное название, допускающее разные толкования и ему не место в Справке. Кто-то может понять, что это собственно структуры (у меня здесь stuctI и POINT), а кому-то покажется, что их составные части (a.s и b.l, x и y). Лучше уж говорить "множество структур [разных]", "поля структуры [такой-то]", "массив, структурированный [такой-то структурой]"


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Моя копилка. Переводы
СообщениеДобавлено: Пт июл 21, 2017 8:56 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11070
Благодарил (а): 4 раз.
Поблагодарили: 381 раз.
Вы создали обычный массив (по видимому типа Integer) записали туда указатели на переменную и экземпляр структуры и что этим пытаетесь доказать? Вы явно записали указатели, значит в массиве будут указатели.
Сравните содержимое памяти массива в вашем случае
Код:
1
2
3
4
5
6
7
8
9
10
11
Structure stuctI
  a.s
  b.l
EndStructure
 
Dim MyArray(2)
 
MyArray(0)=@stuctI
MyArray(1)=@p.POINT
 
ShowMemoryViewer(@MyArray(), ArraySize(MyArray()) * SizeOf(Integer))

И в случае массива структур
Код:
1
2
3
4
5
6
7
8
9
Dim x.POINT(2)
 
x(0)\x = $10
x(0)\y = $20
 
x(1)\x = $50
x(1)\y = $80
 
ShowMemoryViewer(@x(), ArraySize(x()) * SizeOf(POINT))

Видна разница? Судя по памяти что содержится в массиве структур? Указатели на экземпляры структур или что-то другое?

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 419 ]  На страницу Пред.  1 ... 24, 25, 26, 27, 28  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB