purebasic.info
http://purebasic.info/phpBB3ex/

Структуры
http://purebasic.info/phpBB3ex/viewtopic.php?f=1&t=4815
Страница 1 из 1

Автор:  2kpb [ Пт дек 29, 2017 6:40 am ]
Заголовок сообщения:  Структуры

Еще интересный вопрос.
Например есть две структуры:

Код:
1
2
3
4
5
6
7
Structure a
Val.l
EndStructure
 
Structure b
Val.q
EndStructure



И в зависимости от условия нужно присвоить указатель на одну из этих структур

Код:
1
2
3
4
5
6
7
8
9
Protected *Any1.a
Protected *Any2.a
Protected *Any
 
if x > y
*Any = *Any1
else
*Any = *Any2
endif



Вопрос как после такого использовать *Any\Val ведь указатель не имеет своей структуры.
Может конечно можно как-то налету назначить структуру (было бы здорово, но компилятор не дает - говорит уже объявлено с другим типом).

Как будет правильно?
Директивы компилятора тут не спасают, условие не подпадает под них.

Автор:  Kuzmat [ Пт дек 29, 2017 11:21 am ]
Заголовок сообщения:  Re: Структуры

Невозможно присвоить указатель на структуру - структура это шаблон для переменных, ее физически нет.
Вам видимо подойдет объединение (обращение к одной области памяти как к разным типам)
Код:
1
2
3
4
5
6
7
8
9
10
11
12
Structure ab
  StructureUnion
    l.l
    q.q
  EndStructureUnion
EndStructure
 
ab.ab
 
ab\l = 1
Debug ab\q
 



зызы. можно еще так:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Structure aa
  Val.l
EndStructure
 
Structure bb
  Val.q
EndStructure
 
Define a.aa, b.bb, *Any.aa
 
 
*Any = @a
*Any\Val = 1
Debug *Any\Val
 
*Any = @b
Debug *Any\Val
 


Автор:  Сергейчик [ Пт дек 29, 2017 11:47 am ]
Заголовок сообщения:  Re: Структуры

Да вопрос не корректен так как неясно сколько будет полей в структуре(рах)
Ведь получив указатель, в дальнейшем можно его использовать с смещением для другого поля или сразу получить указатель на другое поле в структуре.
А как он хочет писать *val1\val для этого нужно сначала выделять память. :roll:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
Structure aa
Val.l
EndStructure
 
Structure bb
Val.q
EndStructure
 
Global Any1.aa
Global Any2.bb
Global *Any
 
 
If x > y
*Any = @Any1\Val
Else
*Any = @Any2\Val
EndIf
 
 


Автор:  2kpb [ Пт дек 29, 2017 12:33 pm ]
Заголовок сообщения:  Re: Структуры

Структура приблизительно такого вида
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Structure Memory Align #PB_Structure_AlignC
  Vala.u
  Valb.a
  Data1Ptr.l
  Data2Ptr.l
  Val1.l
  Val2.l     ; <-- может быть Quad
  Val3.l     ; <-- может быть Quad
  Val4.l     ; <-- может быть Quad
  Val5.l
  Val6.l
  Flags.u
  Size2.l
  Another.Struct[10]
  Val7.l
  Val8.l
  Val9.l
  Valb.l
  Valc.l
  Vald.l
  Vale.u
  Valf.l
EndStructure



Читается из общей памяти (т.е. она уже существует изначально, поэтому указатели) и в зависимости от обстоятельств Val2-Val4 могут оказаться как LONG так и QUAD типом.
В процессе память может переписаться и типы снова могут измениться. Все что я могу - отследить момент изменения, чтобы обращаться через "правильную" структуру.
Если бы существовал какой-нибудь ReDefine, чтобы можно было просто поменять тип, проблемы бы не было, делаю 2 структуры на каждый случай (как в моем первом примере) и "структурирую" одну переменную в зависимости от условий.
Но поскольку язык не позволяет такие фокусы, пытаюсь придумать обходной путь...
Если бы значений было поменьше, проще было бы читать напрямую без структуры, здесь же удобнее с ней (+вызывается из разных участков кода)
Решение конечно есть, оно подразумевает удвоить все процедуры работающие с этой памятью и обращаться к разным цепочкам в зависимости от условий и это потребует написать много дублирующегося кода, чего очень не хочется.
Может с таким более полным описанием задачи вы сможете подсказать точнее.

Автор:  Kuzmat [ Пт дек 29, 2017 4:14 pm ]
Заголовок сообщения:  Re: Структуры

2kpb писал(а):
... и в зависимости от обстоятельств Val2-Val4 могут оказаться как LONG так и QUAD типом...

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

имхо правильно именно так.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/