Свежие обсуждения
Микроконтроллеры

AVR начинающим - вопросы и ответы

1 40 68

Можно.
Например так:

int x = 2;

((scnew *)&чего-нибудь)->bit.bitnum[x];

 

Все моск перегрелся
Запутался в этих закорючках.
ПоможИте.
union u_sc {
unsigned char m_scale [5];
struct sc scale[5] ;
};

struct disp{
union dsp {
unsigned char screen[15];
struct all {
struct Mod mode ;
unsigned char Number[8] ;
struct Bat batery ;
union u_sc u_scale ;
}struc_dsp;
};
}display;

struct display *ptrMax;

Пытаюсь запомнить адрес :
ptrMax = &display.struc_dsp.u_scale.m_scale[4-NumByte];
ИАР Ругается : " a value of type "unsigned char *" cannot be assigned to an entity of type "display *""

Хочу потом сделать ИЛИ с нужными мне битами.

2GM Разве обязательно засовывать объединение bit в структуру scnew , а так не получится :
sc.sc2
bit.bitnum[1]

 

Так не пробовали?

ptrMax = (display *)&display.struc_dsp.u_scale.m_scale[4-NumByte];

 

Теперь так ругается:
Error[Pe029]: expected an expression ..
Все целиком:
if (PressRes>MaxPress){
ptrMax =(display *)&display.struc_dsp.u_scale.m_scale[4-NumByte];
MaxUrov= 0x03;
}
else{
*ptrMax |= MaxUrov; // и тут ругается Error[Pe349]: no operator "|=" matches these operands

break;
}

 

Alexey: 2GM Разве обязательно засовывать объединение bit в структуру scnew , а так не получится :
sc.sc2
bit.bitnum[1]

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

Выше я вам привел пример, как сделать обращение к элементу структуры как по имени, так и по адресу в массиве. Привел так, как я понял ваш вопрос, если у вас нет нужды обращаться по имени, то юнион можно опустить.

 

Alexey: Теперь так ругается:
Error[Pe029]: expected an expression ..
Все целиком:
if (PressRes>MaxPress)
{
ptrMax =(display *)&display.struc_dsp.u_scale.m_scale[4-NumByte];
MaxUrov= 0x03;
}
else
{
*ptrMax |= MaxUrov; // и тут ругается Error[Pe349]: no operator "|=" matches these operands
break;
}

Ну правильно ругается, попробуйте так


if (PressRes>MaxPress)
{
ptrMax =display - > struc_dsp.u_scale.m_scale[4-NumByte];
MaxUrov= 0x03;
}

Ну, возможно надо будет изменить определение указателя на char *ptrMax, зависит от компилятора.
А здесь

else
{
*ptrMax |= MaxUrov; // и тут ругается Error[Pe349]: no operator "|=" matches these operands
break;
}

вы пытаетесь взять структуру, на которую указывает ptrMax, сделать ИЛИ с переменной MaxUrov и сохранить структуру на том же месте. Но структура содержит много элементов, с каким именно вы бы хотели сделать ИЛИ? Чтобы так делать, надо определить свой собственный класс, и перегрузить функцию ИЛИ для этого класса. Боюсь, это можно сделать только в С++.

 

GM: Но структура содержит много элементов, с каким именно вы бы хотели сделать ИЛИ?
А разве это:
ptrMax =display - > struc_dsp.u_scale.m_scale[4-NumByte];
ptrMax не будет указывать на конкретный элемент структуры, с коим я и хочу сделать ИЛИ.

GM: попробуйте так

GM: изменить определение указателя
Ругается.

 

Какая-то мешанина, приведите весь фрагмент целиком. И скажите словами, что вы хотите сделать.

Да, и сделайте теги каждой структуры прописными буквами, сами же скоро будете путаться, если уже не.

 

GM: И скажите словами, что вы хотите сделать
Словами:
Хочу запомнить адрес байта -элемента структуры , а затем (в дальнейшем ) сделать ИЛИ с его содержимым и переменной MaxUrov, и сохранить результат в том же байте.

 

Ну вот вам пример, проверил на CCS3.1


struct SCREEN
{
int byte[15];
int xpos,ypos;
} screen;
int *pscreen; //определяет указатель на переменные целого типа
int i=14;
screen.byte[i] = 0x30;
pscreen = &screen.byte[i]; // размещает адрес byte[14] в переменной pscreen
* pscreen | = 7; // делает ИЛИ переменной byte[14] с числом 7 и сохраняет там же