Hallo, ich habe ein Problem bei der Übergabe einer Struktur in C.
beim Aufruf der Funktion
1 | unsigned char uc_fifo_push(struct uc_fifo *buffer, unsigned char sign)
|
wird nicht die gewünschte Struktur übergeben, sondern es wird eine neue
Struktur erzeugt, die nicht initalisiert ist.
Die Variable
aus der main-Funktion wird in
korrekt initialisiert (size=5, write=read=0). In der Funktion
sind size, read und write nicht mehr initialisiert.
Für die dynamische Initialisierung habe ich mich an diesem Beispiel
orientiert:
http://stackoverflow.com/questions/1558025/c-initialize-array-within-structure/1558037#1558037
Alle Beispiele, die ich im Netz finde kommen ohne dyn Initialisierung
aus, oder haben einen komplett anderen Aufbau der Struktur. Ich möchte
aber nicht alles umstricken. Nur das nötigste...
Ich hoffe jemand kann mir sagen, welchem dusseligen Fehler ich mal
wieder aufgesessen bin.
Das Minimalbeispiel sollte ohne Probleme kompilieren.
Danke im voraus!
Jan
1 | #include <stdio.h>
|
2 | #include <stdlib.h>
|
3 |
|
4 | typedef struct uc_fifo
|
5 | {
|
6 | unsigned char size;
|
7 | volatile unsigned char write;
|
8 | volatile unsigned char read;
|
9 | unsigned char data[];
|
10 | }*uc_fifo;
|
11 |
|
12 | uc_fifo uc_fifo_init(unsigned char size)
|
13 | {
|
14 | uc_fifo fifo;
|
15 | // size of data[] + size of size, write and read;
|
16 | size_t memory=size*sizeof(unsigned char)+3*sizeof(unsigned char);
|
17 | if((fifo=malloc(memory))==NULL)
|
18 | return NULL;
|
19 | else
|
20 | {
|
21 | fifo->size=size;
|
22 | fifo->write=0;
|
23 | fifo->read=0;
|
24 | return fifo;
|
25 | }
|
26 | }
|
27 |
|
28 | unsigned char uc_fifo_push(struct uc_fifo *buffer, unsigned char sign)
|
29 | {
|
30 | if((buffer->write == buffer->size-1 && buffer->read == 0) || (buffer->write+1 == buffer->read))
|
31 | return 0; // return false (buffer is full)
|
32 | else
|
33 | {
|
34 | buffer->data[buffer->write]=sign;
|
35 | if(buffer->write == buffer->size-1)
|
36 | buffer->write = 0;
|
37 | else
|
38 | buffer->write++;
|
39 | return 1; // return success
|
40 | }
|
41 | }
|
42 |
|
43 | int main(void) {
|
44 | uc_fifo fifo=uc_fifo_init(5);
|
45 | unsigned char i=0;
|
46 | i=uc_fifo_push(&fifo, 0); //0 im Fifo speichern, Rückgabe=1=success
|
47 | return 1;
|
48 | }
|