evading
evading

Reputation: 3090

c - error: ecpected ')' before numeric constant

I have the following code in a header file:

#ifndef BUFFER_H
#define BUFFER_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct c_buff
{
    void *buffer;     // data buffer
    void *buffer_end; // end of data buffer
    size_t capacity;  // maximum number of items in the buffer
    size_t count;     // number of items in the buffer
    size_t sz;        // size of each item in the buffer
    void *head;       // pointer to head
    void *tail;       // pointer to tail
};

void cb_init(c_buff *cb, size_t capacity, size_t sz)
{
    cb->buffer = malloc(capacity * sz);
    if(cb->buffer == NULL) {
        // handle error
    }
    cb->buffer_end = (char *)cb->buffer + capacity * sz;
    cb->capacity = capacity;
    cb->count = 0;
    cb->sz = sz;
    cb->head = cb->buffer;
    cb->tail = cb->buffer;
}
#endif

And the following c file

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <common.h>
#include <usart.h>
#include <buffer.h>

struct c_buff usart_buffer;
struct c_buff *usart_buffer_ptr;

cb_init(usart_buffer_ptr, USART_BUFFER_SIZE, sizeof(char));

void initUSART(void) {
    SETBIT(UCSR0A, UDRE0);
    //SETBIT(UCSR0A, U2X0);
    SETBIT(UCSR0C, UCSZ01);
    SETBIT(UCSR0C, UCSZ00);

    UBRR0 = 25;

    SETBIT(UCSR0B, RXCIE0);
    SETBIT(UCSR0B, TXCIE0);
    SETBIT(UCSR0B, RXEN0);
    SETBIT(UCSR0B, TXEN0);
}

ISR(USART_RX_vect) {
    char data;
    data = UDR0;
    UDR0 = data;
}

ISR(USART_TX_vect) {

}

When I try to compile this I get an error that points to this line:

cb_init(usart_buffer_ptr, USART_BUFFER_SIZE, sizeof(char));

And it just says "error: expected ')' before numeric constant".

Google tells me it's some kind of preprocessor error. But I don't see how that could be the case.

I'm new to C so I apologize if it is something totally obvious.

Upvotes: 1

Views: 1349

Answers (3)

JaredPar
JaredPar

Reputation: 755041

The problem is that you're attempting to execute a method at the file level.

cb_init(usart_buffer_ptr, USART_BUFFER_SIZE, sizeof(char));

The C language only allows declarations / definitions at this level not actual executed statements. This call needs to be moved into a function definition.

Upvotes: 2

KrHubert
KrHubert

Reputation: 1030

You can't run function in global scope. It has to be done in main:

int main(int argc, char *argv[] {
cb_init(usart_buffer_ptr, USART_BUFFER_SIZE, sizeof(char));
}

Upvotes: 3

Daniel Fischer
Daniel Fischer

Reputation: 183948

You can't have a naked function call at the top level.

cb_init(usart_buffer_ptr, USART_BUFFER_SIZE, sizeof(char));

is a naked function call. Move that inside main().

Upvotes: 4

Related Questions