|
|
  |
Вопрос про указатели на структуру |
|
|
|
Jul 10 2007, 14:22
|

Частый гость
 
Группа: Свой
Сообщений: 106
Регистрация: 23-05-05
Из: Ташкент
Пользователь №: 5 324

|
Уважаемы господа! Буду очень признателен если поможете решить следующий вопрос. В программе описан следующий тип: Код #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. Как это лучше реализовать?
|
|
|
|
|
Jul 10 2007, 14:24
|

тут может быть ваша реклама
    
Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280

|
Цитата(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 можно убрать
|
|
|
|
|
Jul 10 2007, 14:35
|

Частый гость
 
Группа: Свой
Сообщений: 106
Регистрация: 23-05-05
Из: Ташкент
Пользователь №: 5 324

|
Цитата(jorikdima @ Jul 10 2007, 19:24)  void myFunc(Events_Buffer_Struct * inputData) { imputData->YESSSSSSSSS!!!++; } _Events_Buffer_Struct можно убрать А как же приведение типов? Ведь компилятор не знает как брать указатель от структуры.
|
|
|
|
|
Jul 10 2007, 14:51
|

Частый гость
 
Группа: Свой
Сообщений: 106
Регистрация: 23-05-05
Из: Ташкент
Пользователь №: 5 324

|
Цитата(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"
|
|
|
|
|
Jul 10 2007, 16:01
|

Частый гость
 
Группа: Свой
Сообщений: 106
Регистрация: 23-05-05
Из: Ташкент
Пользователь №: 5 324

|
Цитата(sergeeff @ Jul 10 2007, 20:42)  Ну напиши тогда:
f( (PEVENTS_BUFFER_STRUCT )&GlobalBuffers[ x ] );
Ругаться не должен. Ошибка возникает внутри функции, а не при ее вызове
|
|
|
|
|
Jul 10 2007, 16:32
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(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; }
|
|
|
|
|
Jul 10 2007, 17:04
|

Частый гость
 
Группа: Свой
Сообщений: 106
Регистрация: 23-05-05
Из: Ташкент
Пользователь №: 5 324

|
Цитата(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; }  Естественно без троеточий Разобрался, всем спасибо! Вместо "->" я в этой функции ставил "." Хотя и с точками в остальных кусках кода все отлично работает
Сообщение отредактировал kada - Jul 10 2007, 17:06
|
|
|
|
|
Jul 10 2007, 17:21
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(kada @ Jul 10 2007, 20:04)   Естественно без троеточий Разобрался, всем спасибо! Вместо "->" я в этой функции ставил "." Хотя и с точками в остальных кусках кода все отлично работает "->" применяется для доступа к полям структуры через указатель "." - для доступа к полям непосредственно объявленных структур. Возвращаясь к примеру: Events_Buffer_Struct A; PEVENTS_BUFFER_STRUCT P; P = &A; A.Size = 10; // обращаемся к полю Size непосредственно структуры А P->Size = 10; // обращаемся к полю Size структуры A, через указатель P.
|
|
|
|
|
Jul 10 2007, 18:38
|

Частый гость
 
Группа: Свой
Сообщений: 106
Регистрация: 23-05-05
Из: Ташкент
Пользователь №: 5 324

|
Цитата(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. Спасибо за подробный ответ! Теперь буду знать.
|
|
|
|
|
Jul 11 2007, 06:40
|
Местный
  
Группа: Участник
Сообщений: 270
Регистрация: 29-06-06
Пользователь №: 18 445

|
У меня вот такое, к примеру, работает: Код //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; };
Сообщение отредактировал pokos - Jul 11 2007, 06:40
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|