Forum: Mikrocontroller und Digitale Elektronik Pointer auf Struktur


von leo (Gast)


Lesenswert?

Hallo, ich möchte auf diese Struktur in einer anderen C Datei zugreifen 
können. Quasi soll die MAC-Adresse verändert werden. Mit einer extern 
Anweisung könnte ich dann auf diese Struktur zugreifen. Wie könnte man 
sowas realisieren?
1
struct netif xnetif = 
2
{
3
  /* set MAC hardware address length */
4
  .hwaddr_len = (u8_t)ETHARP_HWADDR_LEN,
5
6
  /* set MAC hardware address */
7
  .hwaddr =  {(u8_t)MAC_ADDR0, (u8_t)MAC_ADDR1,
8
              (u8_t)MAC_ADDR2, (u8_t)MAC_ADDR3,
9
              (u8_t)MAC_ADDR4, (u8_t)MAC_ADDR5},
10
11
  /* maximum transfer unit */
12
  .mtu = 1500U,
13
14
  .name = {IFNAME0, IFNAME1},
15
};

von Dirk B. (dirkb2)


Lesenswert?

Wenn die struct global ist, dann extern deklarieren, dann brauchst du 
auch keinen Pointer.

Wenn sie static ist (Modul-global), kannst du einen globalen Pointer 
nehmen und darüber zugreifen.

Oder du schreibst eine Setter-Funktion, die das macht.

von Nop (Gast)


Lesenswert?

leo schrieb:
> Quasi soll die MAC-Adresse verändert werden. Mit einer extern
> Anweisung könnte ich dann auf diese Struktur zugreifen. Wie könnte man
> sowas realisieren?

Ich würde die Struktur mit nem typedef als Typ definieren (z.B. 
"T_NETIF")  und die Definition in ein gemeinsames Headerfile eintragen. 
Dann kannste in der anderen C-Datei mit "extern T_NETIF xnetif" darauf 
zugreifen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nop schrieb:
> Ich würde die Struktur mit nem typedef als Typ definieren (z.B.
> "T_NETIF")  und die Definition in ein gemeinsames Headerfile eintragen.
> Dann kannste in der anderen C-Datei mit "extern T_NETIF xnetif" darauf
> zugreifen.

Es geht auch ohne typedef, ein
1
extern struct netif xnetif;

genügt, sofern die Deklaration der Struktur selbst auch zugänglich 
ist, d.h. welche Elemente sie hat und welche Typen diese haben.

von leo (Gast)


Lesenswert?

Ok vielen Dank. Hab das mit extern gelöst.

Auf folgende Struktur müsste ich ebenfalls von außen zugreifen. Wie wird 
sowas dann realisiert?
1
static XMC_ETH_MAC_t eth_mac =
2
{
3
  .regs = ETH0,
4
  .address = MAC_ADDR,
5
  .rx_desc = ETH_LWIP_0_rx_desc,
6
  .tx_desc = ETH_LWIP_0_tx_desc,
7
  .rx_buf = &ETH_LWIP_0_rx_buf[0][0],
8
  .tx_buf = &ETH_LWIP_0_tx_buf[0][0],
9
  .num_rx_buf = ETH_LWIP_0_NUM_RX_BUF,
10
  .num_tx_buf = ETH_LWIP_0_NUM_TX_BUF
11
};

von Dirk B. (dirkb2)


Lesenswert?

leo schrieb:
> Auf folgende Struktur müsste ich ebenfalls von außen zugreifen. Wie wird
> sowas dann realisiert?

Was ist da jetzt anders als bei deinem ersten Beispiel?

von leo (Gast)


Lesenswert?

extern static XMC_ETH_MAC_t eth_mac;

--> error: multiple storage classes in declaration specifiers

von xxx (Gast)


Lesenswert?

leo schrieb:
> static XMC_ETH_MAC_t eth_mac =

static weglassen, dann funktioniert auch extern

> Wenn sie static ist (Modul-global), kannst du einen globalen Pointer
> nehmen und darüber zugreifen.
So wie Dirk.B. schreibt ist das Modul-global (mit static)

von Daniel A. (daniel-a)


Lesenswert?

static = nur in diesem .c file zugreifbar
extern = von anderen .c dateien zugreifbar
extern static = von anderen .c dateien zugreifbar und nur in diesem .c 
file zugreifbar => ergibt keinen sinn

von Nop (Gast)


Lesenswert?

leo schrieb:
> extern static XMC_ETH_MAC_t eth_mac;
>
> --> error: multiple storage classes in declaration specifiers

Klar. Wenn Du etwas mit static im File-Scope deklarierst, kannst Du 
darauf in einem anderen File nicht mit extern zugreifen. Das ist der 
Sinn von file-static.

von Nop (Gast)


Lesenswert?

Konkret: "extern" und "static" schließt einander aus, das sagt der 
Compiler Dir.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

leo schrieb:
> Auf folgende Struktur ...

Vom bereits beschriebenen static -Problem abgesehen zeigst Du auch 
hier nur die Initialisierung einer Variablen vom Typ der Struktur, nicht 
aber deren Deklaration selbst.

von Dirk B. (dirkb2)


Lesenswert?

Dirk B. schrieb:
> Wenn sie static ist (Modul-global), kannst du einen globalen Pointer
> nehmen und darüber zugreifen.
>
> Oder du schreibst eine Setter-Funktion, die das macht.

Ich würde letzteres bevorzugen.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Daniel A. schrieb:
> static = nur in diesem .c file zugreifbar

Wenn man die Adresse des Objekts hat, dann ist es auch von einem anderen 
Modul aus zugraifbar.

> extern static = von anderen .c dateien zugreifbar und nur in diesem .c

"extern static" ist in C nicht möglich.  Und
1
static int x;
2
extern int x;
Ist zwar möglich in C, bedeutet aber etwas anderes.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Wenn man die Adresse des Objekts hat, dann ist es auch von einem anderen
> Modul aus zugraifbar.

Sicher, aber das kann nicht der Linker erledigen.

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.