mikrocontroller.net

Forum: Compiler & IDEs Externe Variable (Struct Array)


Autor: Sepp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

zu dem Thema extern gibt es ja schon massig Einträge, aber leider bin 
ich immer noch am Rätselraten ud hab noch keine gültige Kombination 
"herausgefunden" :)
Hier mein Problem:

Ich habe eine Headerdatei in der ich ein Struct definiere:
//structdef.h
#ifndef _bla
#define _bla
typedef struct{
  uint16_t     tagnummer;                             
  uint16_t     a; 
  uint8_t      v;                                 
  BYTE         c;                           
  BYTE         d;
  BYTE         e;                            
  BYTE         *f;       
};

Dieses Struct will ich in einer Funktion anlegen und zwar so, dass ich 
nach Beendigen der Funktion wieder darauf zugreifen kann. Diese Funktion 
liegt zum Beispiel in Funktion.c

Im HauptProg mache ich einen include auf Funktion.h welche die Funktion 
(Createstruct()) beinhaltet und bereits die structdef.h includiert hat.

Ich führe als erstes Createstruct() aus und danch will ich auf die Var 
zugreiffen können.
Das Problem ist noch, dass es sich dabei um ein Struct-Array handelt 
dessen Größe erst in dieser Createstruct() ermittelt wird.

Wie (static, extern .... ??) muss ich die Var definieren und wo?
Hab echt den Überblick verloren.

Autor: OliverSo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem ist noch, dass es sich dabei um ein Struct-Array handelt
dessen Größe erst in dieser Createstruct() ermittelt wird.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sepp wrote:
> Hallo zusammen,
>
> zu dem Thema extern gibt es ja schon massig Einträge, aber leider bin
> ich immer noch am Rätselraten ud hab noch keine gültige Kombination
> "herausgefunden" :)
> Hier mein Problem:
>
> Ich habe eine Headerdatei in der ich ein Struct definiere:
>
> //structdef.h
> #ifndef _bla
> #define _bla
> typedef struct{
>   uint16_t     tagnummer;
>   uint16_t     a;
>   uint8_t      v;
>   BYTE         c;
>   BYTE         d;
>   BYTE         e;
>   BYTE         *f;
> };
>
> Dieses Struct will ich in einer Funktion anlegen und zwar so, dass ich
> nach Beendigen der Funktion wieder darauf zugreifen kann. Diese Funktion
> liegt zum Beispiel in Funktion.c

Dann gib der struct als erstes mal einen Namen, damit man sich
auch darauf beziehen kann.
Immer diese anonymen structs. Ich verstehe gar nicht, was daran so
schön sein soll.

Beachte auch:
Bis jetzt hast du nur die Dekleration einer Struct. Also den
Bauplan wie eine struct Variable aussehen wird. Du hast
noch keine Variable.

>
> Im HauptProg mache ich einen include auf Funktion.h welche die Funktion
> (Createstruct()) beinhaltet und bereits die structdef.h includiert hat.
>
> Ich führe als erstes Createstruct() aus und danch will ich auf die Var
> zugreiffen können.
> Das Problem ist noch, dass es sich dabei um ein Struct-Array handelt
> dessen Größe erst in dieser Createstruct() ermittelt wird.
>
> Wie (static, extern .... ??) muss ich die Var definieren und wo?
> Hab echt den Überblick verloren.

Ob Array oder nicht macht nur insofern einen Unterschied, als
die globale Variable dann ein Pointer sein muss

structdef.h
***********
typedef struct _myStruct
{
  ...
} myStruct;

function.h
**********
#include "structdef.h"

void CreateStruct( int Size );

extern myStruct* theArray;

function.c
**********
#include "function.h"

myStruct* theArray;

void CreateStruct( int Size )
{
  theArray = malloc( Size * sizeof( myStruct ) );
}

main.c
******
#include "function.h"

int main()
{
   CreateStruct( 5 );

   for( i = 0; i < 5; ++i )
     theArray[i].xxxyyy = ....
}

Autor: Sepp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann gib der struct als erstes mal einen Namen, damit man sich
auch darauf beziehen kann.
Immer diese anonymen structs. Ich verstehe gar nicht, was daran so
schön sein soll.

Sry. Hab ich vergessen. Mach ich natürlich normalerweise schon schöner 
:-)


@ Karl heinz Buchegger
Danke. Genau so funktionierts anscheinend tadellos. Danke!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.