Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос про указатели на структуру
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
kada
Уважаемы господа!
Буду очень признателен если поможете решить следующий вопрос.

В программе описан следующий тип:
Код
#define EVENTS_BUFFER_SIZE  8
typedef struct _Events_Buffer_Struct {
        unsigned char Size;
        unsigned char Write_Index;
        unsigned char Read_Index;
        unsigned char Event[EVENTS_BUFFER_SIZE];
} Events_Buffer_Struct;


Дело в том, что мне нужно создать функцию, ктороя умела бы работать с несколькими экземплярами типа Events_Buffer_Struct, которые определены как глобальные. Т.е. в качестве входного параметра функции нужно взять указатель на структуру описанную типом Events_Buffer_Struct, чтобы функция умела работать с каждым конкретным глобальным экземпляром Events_Buffer_Struct.
Как это лучше реализовать?
jorikdima
Цитата(kada @ Jul 10 2007, 18:22) *
Уважаемы господа!
Буду очень признателен если поможете решить следующий вопрос.

В программе описан следующий тип:
Код
#define EVENTS_BUFFER_SIZE  8
typedef struct _Events_Buffer_Struct{
        unsigned char Size;
        unsigned char Write_Index;
        unsigned char Read_Index;
        unsigned char Event[EVENTS_BUFFER_SIZE];
} Events_Buffer_Struct;


Дело в том, что мне нужно создать функцию, ктороя умела бы работать с несколькими экземплярами типа Events_Buffer_Struct, которые определены как глобальные. Т.е. в качестве входного параметра функции нужно взять указатель на структуру описанную типом Events_Buffer_Struct, чтобы функция умела работать с каждым конкретным глобальным экземпляром Events_Buffer_Struct.
Как это лучше реализовать?



void myFunc(Events_Buffer_Struct * inputData)
{
imputData->YESSSSSSSSS!!!++;
}



_Events_Buffer_Struct можно убрать
kada
Цитата(jorikdima @ Jul 10 2007, 19:24) *
void myFunc(Events_Buffer_Struct * inputData)
{
imputData->YESSSSSSSSS!!!++;
}
_Events_Buffer_Struct можно убрать

А как же приведение типов? Ведь компилятор не знает как брать указатель от структуры.
WEST128
Это почему не знает ? Еще как знает, это в стандарте на С прописано.
defunct
Код
typedef struct _Events_Buffer_Struct {
        unsigned char Size;
        unsigned char Write_Index;
        unsigned char Read_Index;
        unsigned char Event[EVENTS_BUFFER_SIZE];
} Events_Buffer_Struct, *PEVENTS_BUFFER_STRUCT;


Events_Buffer_Struct  GlobalBuffers[ 10 ];



void f( PEVENTS_BUFFER_STRUCT pEventBuf)
{
   pEventBuf->Size = ...
   ...
}


f( &GlobalBuffers[ x ] );
kada
Цитата(defunct @ Jul 10 2007, 19:45) *
Код
typedef struct _Events_Buffer_Struct {
        unsigned char Size;
        unsigned char Write_Index;
        unsigned char Read_Index;
        unsigned char Event[EVENTS_BUFFER_SIZE];
} Events_Buffer_Struct, *PEVENTS_BUFFER_STRUCT;
Events_Buffer_Struct  GlobalBuffers[ 10 ];
void f( PEVENTS_BUFFER_STRUCT pEventBuf)
{
   pEventBuf->Size = ...     // Ошибка
   ...
}
f( &GlobalBuffers[ x ] );

IAR выдает ошибку "Expression must have struct or union type"
sergeeff
Ну напиши тогда:

f( (PEVENTS_BUFFER_STRUCT )&GlobalBuffers[ x ] );

Ругаться не должен.
kada
Цитата(sergeeff @ Jul 10 2007, 20:42) *
Ну напиши тогда:

f( (PEVENTS_BUFFER_STRUCT )&GlobalBuffers[ x ] );

Ругаться не должен.

Ошибка возникает внутри функции, а не при ее вызове
defunct
Цитата(kada @ Jul 10 2007, 17:51) *
IAR выдает ошибку "Expression must have struct or union type"

Я надеюсь вы троеточия поубирали перед компиляцией? (может быть у вас есть локальная переменная с таким же именем?). Код ошибки желательно приводить к конкретному коду. А то так на троеточия гадать...


еще раз повторю пример (на этот раз предварительно проверенный в IAR):


Код
typedef struct _Events_Buffer_Struct {
        unsigned char Size;
        unsigned char Write_Index;
        unsigned char Read_Index;
        unsigned char Event[128];
} Events_Buffer_Struct, *PEVENTS_BUFFER_STRUCT;


Events_Buffer_Struct  GlobalBuffers[ 10 ];



void f( PEVENTS_BUFFER_STRUCT pEventBuf)
{
   pEventBuf->Size = 33;
}



int main( void )
{
  f( &GlobalBuffers[ 6 ] );
  return 0;
}
kada
Цитата(defunct @ Jul 10 2007, 21:32) *
Я надеюсь вы троеточия поубирали перед компиляцией? (может быть у вас есть локальная переменная с таким же именем?). Код ошибки желательно приводить к конкретному коду. А то так на троеточия гадать...
еще раз повторю пример (на этот раз предварительно проверенный в IAR):
Код
typedef struct _Events_Buffer_Struct {
        unsigned char Size;
        unsigned char Write_Index;
        unsigned char Read_Index;
        unsigned char Event[128];
} Events_Buffer_Struct, *PEVENTS_BUFFER_STRUCT;
Events_Buffer_Struct  GlobalBuffers[ 10 ];
void f( PEVENTS_BUFFER_STRUCT pEventBuf)
{
   pEventBuf->Size = 33;
}
int main( void )
{
  f( &GlobalBuffers[ 6 ] );
  return 0;
}

lol.gif Естественно без троеточий
Разобрался, всем спасибо!
Вместо "->" я в этой функции ставил "."
Хотя и с точками в остальных кусках кода все отлично работает
defunct
Цитата(kada @ Jul 10 2007, 20:04) *
lol.gif Естественно без троеточий
Разобрался, всем спасибо!
Вместо "->" я в этой функции ставил "."
Хотя и с точками в остальных кусках кода все отлично работает

"->" применяется для доступа к полям структуры через указатель
"." - для доступа к полям непосредственно объявленных структур.

Возвращаясь к примеру:

Events_Buffer_Struct A;
PEVENTS_BUFFER_STRUCT P;

P = &A;

A.Size = 10; // обращаемся к полю Size непосредственно структуры А
P->Size = 10; // обращаемся к полю Size структуры A, через указатель P.
kada
Цитата(defunct @ Jul 10 2007, 22:21) *
"->" применяется для доступа к полям структуры через указатель
"." - для доступа к полям непосредственно объявленных структур.

Возвращаясь к примеру:

Events_Buffer_Struct A;
PEVENTS_BUFFER_STRUCT P;

P = &A;

A.Size = 10; // обращаемся к полю Size непосредственно структуры А
P->Size = 10; // обращаемся к полю Size структуры A, через указатель P.

Спасибо за подробный ответ! Теперь буду знать.
pokos
У меня вот такое, к примеру, работает:
Код
//IIR second order filter data
static struct IIR_filter{
int fNY1, fNY2; //filter nodes, stores y(n-k)
signed char fCB0; //filter feedforward coefficients
unsigned char fCA1, fCA2; //filter feedback coefficients
} LPF = {0,0, 1, 238, 111}; //Init  LPF

//IIR procedure - second order
signed char IIR2L(struct IIR_filter *myF, signed char nSam )
  {
    signed int tmp;
    signed long tmp1,tmp2;
    int fNY0;
    tmp1=(long)(myF->fCA1)*(myF->fNY1);
    tmp2=(long)(myF->fCA2)*(myF->fNY2);
    fNY0=nSam-((tmp2-tmp1)>>7);
    tmp1=((fNY0+(myF->fNY2))>>1)+(myF->fNY1);
    tmp=tmp1>>6;//8
    (myF->fNY2)=(myF->fNY1);
    (myF->fNY1)=fNY0;
    if (tmp<0) {tmp=-tmp;};
    return tmp;
  };
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.