purebasic.info

PureBasic forum
Текущее время: Сб янв 20, 2018 6:05 am

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




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Структуры
СообщениеДобавлено: Пт дек 29, 2017 6:40 am 
Не в сети
студент

Зарегистрирован: Сб дек 09, 2017 4:53 am
Сообщений: 9
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Еще интересный вопрос.
Например есть две структуры:

Код:
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 ведь указатель не имеет своей структуры.
Может конечно можно как-то налету назначить структуру (было бы здорово, но компилятор не дает - говорит уже объявлено с другим типом).

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Структуры
СообщениеДобавлено: Пт дек 29, 2017 11:21 am 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 216
Благодарил (а): 30 раз.
Поблагодарили: 21 раз.
Пункты репутации: 0
Невозможно присвоить указатель на структуру - структура это шаблон для переменных, ее физически нет.
Вам видимо подойдет объединение (обращение к одной области памяти как к разным типам)
Код:
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
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Структуры
СообщениеДобавлено: Пт дек 29, 2017 11:47 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 552
Благодарил (а): 2 раз.
Поблагодарили: 30 раз.
Пункты репутации: 9
Да вопрос не корректен так как неясно сколько будет полей в структуре(рах)
Ведь получив указатель, в дальнейшем можно его использовать с смещением для другого поля или сразу получить указатель на другое поле в структуре.
А как он хочет писать *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
 
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Структуры
СообщениеДобавлено: Пт дек 29, 2017 12:33 pm 
Не в сети
студент

Зарегистрирован: Сб дек 09, 2017 4:53 am
Сообщений: 9
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Структура приблизительно такого вида
Код:
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 структуры на каждый случай (как в моем первом примере) и "структурирую" одну переменную в зависимости от условий.
Но поскольку язык не позволяет такие фокусы, пытаюсь придумать обходной путь...
Если бы значений было поменьше, проще было бы читать напрямую без структуры, здесь же удобнее с ней (+вызывается из разных участков кода)
Решение конечно есть, оно подразумевает удвоить все процедуры работающие с этой памятью и обращаться к разным цепочкам в зависимости от условий и это потребует написать много дублирующегося кода, чего очень не хочется.
Может с таким более полным описанием задачи вы сможете подсказать точнее.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Структуры
СообщениеДобавлено: Пт дек 29, 2017 4:14 pm 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 216
Благодарил (а): 30 раз.
Поблагодарили: 21 раз.
Пункты репутации: 0
2kpb писал(а):
... и в зависимости от обстоятельств Val2-Val4 могут оказаться как LONG так и QUAD типом...

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

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


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

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


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

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


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

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