2016-06-10 4 views
0

Я пытаюсь реализовать простой кольцевой буфер с помощью структуры. Я никогда не использовал структуры раньше и только начал пытаться их понять. Компилятор выходит с этой ошибкой:Простая структура C не компилируется

expected '=', ',', ';', 'asm' or '__attribute__' before '.' token 

Ошибка относится к последним двум строкам.

#define MAX_PROCESSES 16 

struct ring_buffer{ 
    uint8_t data[MAX_PROCESSES]; 
    uint8_t size; 
    uint8_t count; 
    uint8_t write_pos; 
    uint8_t read_pos; 
}; 

struct ring_buffer ring_buffer_processes; 
ring_buffer_processes.size = MAX_PROCESSES; 
ring_buffer_processes->size = MAX_PROCESSES; 

Я использовал операторы только для тестовых целей, чтобы увидеть их, если это работает. Разумеется, это должно быть только одна строка.

Я также пробовал использовать «typedef», но это тоже не помогает. Что здесь не так?

Благодаря

+0

Удалить последнюю строку, вы получите элемент структуры через '.' оператор –

+0

@Peder. Он компилируется отлично: https://godbolt.org/g/j3NO3P – Midas

+4

, если это весь ваш код, вы должны обернуть последние две строки в main() – Gar

ответ

1

Чтобы получить доступ к любому члену структуры, используется оператор доступа к члену (.), Но

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

Изменить код ..

#define MAX_PROCESSES 16 

struct ring_buffer{ 
    uint8_t data[MAX_PROCESSES]; 
    uint8_t size; 
    uint8_t count; 
    uint8_t write_pos; 
    uint8_t read_pos; 
}; 

struct ring_buffer ring_buffer_processes; 

void main(){ 
    ring_buffer_processes.size = MAX_PROCESSES; 
    //ring_buffer_processes->size = MAX_PROCESSES; Not required you can access struct variable with . operator. 
} 
3

Ваш код имеет две ошибки:

  1. он отсутствует точка входа исполнения, т.е. основной()
  2. Он пытается получить доступ к члену используя '->', который используется при доступе к элементу через указатель.

Так исправляя эти точки дает нам:

#include <stdint.h> 

#define MAX_PROCESSES 16 

struct ring_buffer{ 
    uint8_t data[MAX_PROCESSES]; 
    uint8_t size; 
    uint8_t count; 
    uint8_t write_pos; 
    uint8_t read_pos; 
}; 

int main(void) 
{ 
    struct ring_buffer ring_buffer_processes; 
    struct ring_buffer * p_ring_buffer_processes; 

    p_ring_buffer_processes = &ring_buffer_processes; 
    ring_buffer_processes.size = MAX_PROCESSES; 
    p_ring_buffer_processes->size = MAX_PROCESSES; 

    return 0; 
} 
0

В C Язык, объект, не указатель обращались с помощью . Оператор и объект-указатель Доступ для объекта: -> Оператор.

 #define MAX_PROCESSES 16 

    struct ring_buffer{ 
     uint8_t data[MAX_PROCESSES]; 
     uint8_t size; 
     uint8_t count; 
     uint8_t write_pos; 
     uint8_t read_pos; 
    }; 

    struct ring_buffer ring_buffer_processes; 
ring_buffer_processes. size = MAX_PROCESSES; 

    struct ring_buffer *ptr_ring_buffer_processes; 
*ptr_ring_buffer_processes-> size =& MAX_PROCESSES;