Forum: Mikrocontroller und Digitale Elektronik Initialisierung: pointer array


von struct (Gast)


Lesenswert?

Hallo ich habe probleme eine Struct als pointer array zu initialisieren, 
kann man sowas in C überhaupt machen?
1
#include <stdio.h>
2
3
typedef struct {
4
  int const len;
5
  unsigned char * buffer;
6
} mem_t;
7
8
mem_t *data[3] = {
9
    {.buffer = (unsigned char*)"abcde", .len = 4},
10
    {.buffer = (unsigned char*)"abcdef", .len = 5},
11
    {.buffer = (unsigned char*)"abcdefz", .len = 6},
12
}
13
14
int main()
15
{
16
    printf("Hello World");
17
18
    return 0;
19
}
1
main.c:17:5: warning: braces around scalar initializer
2
     {.buffer = (unsigned char*)"abcde", .len = 4},
3
     ^
4
main.c:17:5: note: (near initialization for ‘data[0]’)
5
main.c:17:6: error: field name not in record or union initializer
6
     {.buffer = (unsigned char*)"abcde", .len = 4},
7
      ^
8
main.c:17:6: note: (near initialization for ‘data[0]’)
9
main.c:17:16: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
10
     {.buffer = (unsigned char*)"abcde", .len = 4},
11
                ^
12
main.c:17:16: note: (near initialization for ‘data[0]’)
13
main.c:17:41: error: field name not in record or union initializer
14
     {.buffer = (unsigned char*)"abcde", .len = 4},
15
                                         ^
16
main.c:17:41: note: (near initialization for ‘data[0]’)
17
main.c:17:48: warning: excess elements in scalar initializer
18
     {.buffer = (unsigned char*)"abcde", .len = 4},
19
                                                ^

von blablub (Gast)


Lesenswert?

struct schrieb:
> mem_t *data[3]

ist ein array von pointern, die nur mit Speicheradressen initialisiert 
werden können.

Versuchs mal mit
1
mem_t data[3]

von Thomas Z. (usbman)


Lesenswert?

Da fehlt die Länge des Buffers z.B. unsigned char Buffer[10] sonst wird 
nur ein Zeiger auf ein char definiert.
initialisiert wird dann mit { (4,"abcd"),(5,"abcde")....}
Das letzte Komma ist bei dir zu viel da du nur 3 Elemente hast.

von struct (Gast)


Lesenswert?

>> ist ein array von pointern, die nur mit Speicheradressen initialisiert
werden können.
Stimmt ich brauche garkein Pointerarray :D

Gibt es in c irgendwie ein macro bei dem gleich die länge automatisch 
ermittelt wird, ohne das ich immer nachzählen muss? :D

z.b. sowas:
{.buffer = (unsigned char*)"abcdefz", .len = sizeof(.buffer)}

von Corona V. (Gast)


Lesenswert?

struct schrieb:
> Gibt es in c irgendwie ein macro bei dem gleich die länge automatisch
> ermittelt wird, ohne das ich immer nachzählen muss? :D

In C++ wäre es

constexpr int bla = strlen(string);

von blablub (Gast)


Lesenswert?

Corona V. schrieb:
> In C++ wäre es

Ich glaube eher er meinte sowas:
1
 char msg[] = "Ich hab keine Lust...";

sizeof(msg) würde in diesem Fall 22 ergeben.

von Nop (Gast)


Lesenswert?

struct schrieb:

> z.b. sowas:
> {.buffer = (unsigned char*)"abcdefz", .len = sizeof(.buffer)}

Das sizeof bezöge sich hier die Größe des Zeigers auf den Buffer, also 
z.B. 4 Bytes auf einer Plattform mit 32 Bit, oder 8 Bytes auf 64 Bit - 
und nicht auf die Größe des Buffers selber.

von struct (Gast)


Lesenswert?

Das müsste irgendein Preprocessor macro machen

von W.S. (Gast)


Lesenswert?

struct schrieb:
> Gibt es in c irgendwie ein macro bei dem gleich die länge automatisch
> ermittelt wird, ohne das ich immer nachzählen muss?

Die Länge steht doch fest: nämlich soviel, wie ein Zeiger Platz braucht. 
Um das, worauf der Zeiger zeigen soll, mußt du dich separat kümmern.

W.S.

von Achim M. (minifloat)


Lesenswert?

struct schrieb:
> Das müsste irgendein Preprocessor macro machen

memcpy() ist dein Freund...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.