реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Вопрос про указатели на структуру
kada
сообщение Jul 10 2007, 14:22
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 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.
Как это лучше реализовать?
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Jul 10 2007, 14:24
Сообщение #2


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 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 можно убрать
Go to the top of the page
 
+Quote Post
kada
сообщение Jul 10 2007, 14:35
Сообщение #3


Частый гость
**

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



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

А как же приведение типов? Ведь компилятор не знает как брать указатель от структуры.
Go to the top of the page
 
+Quote Post
WEST128
сообщение Jul 10 2007, 14:41
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 468
Регистрация: 13-10-06
Из: Россия, Томск
Пользователь №: 21 291



Это почему не знает ? Еще как знает, это в стандарте на С прописано.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 10 2007, 14:45
Сообщение #5


кекс
******

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



Код
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 ] );
Go to the top of the page
 
+Quote Post
kada
сообщение Jul 10 2007, 14:51
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 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"
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 10 2007, 15:42
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Ну напиши тогда:

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

Ругаться не должен.
Go to the top of the page
 
+Quote Post
kada
сообщение Jul 10 2007, 16:01
Сообщение #8


Частый гость
**

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



Цитата(sergeeff @ Jul 10 2007, 20:42) *
Ну напиши тогда:

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

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

Ошибка возникает внутри функции, а не при ее вызове
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 10 2007, 16:32
Сообщение #9


кекс
******

Группа: Свой
Сообщений: 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;
}
Go to the top of the page
 
+Quote Post
kada
сообщение Jul 10 2007, 17:04
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 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;
}

lol.gif Естественно без троеточий
Разобрался, всем спасибо!
Вместо "->" я в этой функции ставил "."
Хотя и с точками в остальных кусках кода все отлично работает

Сообщение отредактировал kada - Jul 10 2007, 17:06
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 10 2007, 17:21
Сообщение #11


кекс
******

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



Цитата(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.
Go to the top of the page
 
+Quote Post
kada
сообщение Jul 10 2007, 18:38
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 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.

Спасибо за подробный ответ! Теперь буду знать.
Go to the top of the page
 
+Quote Post
pokos
сообщение Jul 11 2007, 06:40
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th July 2025 - 18:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01501 секунд с 7
ELECTRONIX ©2004-2016