mikrocontroller.net

Forum: Compiler & IDEs wieder mal global variablen


Autor: Sigi__ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich checks einfach nciht mehr. Ich versuche ein Struct global zu machen, 
aber meine enthaltenn Pointer änderen sich in Unterfunktionen.
Hier mal ein Auszug:
//send_string.h
typedef struct {
    char       *msg;
    int32_t  characters;
    char       *dataptr;
    } eth_msg;
        
extern eth_msg message;
//-----------------------------------------


//send_string.c
void test(void)
{
  rs232_puti(message.dataptr);
  //liefert 11128
}
....
//-----------------------------------------

//main.c
include "eth_string.h"
eth_msg  message;

main()
{ 
  message.dataptr = malloc(500);
  rs232_puti(message.dataptr);
  //liefert 4640
  test();
}
//-----------------------------------------

Ich verstehs nicht. Für mich ist die Variable global. Was mache ich da 
falsch?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
//send_string.h
typedef struct {
...
...
//main.c
include "eth_string.h"

Hast du in eth_string.h und send_string.h vielleicht unterschiedliche 
Struct-Deklarationen drin?

Autor: Sigi__ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups. War ein Tippfehler. Da kam wohl ein anderer Thread in meinem Kopf 
mit dem Tippo-Thread durcheinander. :)

Das soll natürlich include "include "send_string.h" heißen!

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>malloc(500);

Auf welcher Hardware läuft das Programm?

Oliver

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sigi__ wrote:
> Ups. War ein Tippfehler. Da kam wohl ein anderer Thread in meinem Kopf
> mit dem Tippo-Thread durcheinander. :)

Da muss wohl mal wieder ein Standardspruch her:
Es ist meist keine gute Idee, Code "einzutippen".
Bitte immer Originalcode posten, also am besten per Cut&Paste 
einfügen. Und etwas mehr Kontext wäre auch nicht schlecht, also am 
besten den kompletten Code posten.

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was macht
:
rs232_puti()
:
Wenn diese Routine Zeichen über RS232 verschickt (put integer??),
dann sollte niemals nicht mehr als 500 rauskommen, oder?

Es gehört zum guten Stil, den Rückgabewert von malloc auf NULL zu 
testen. NULL wird dann von malloc zurückgegeben, wenn kein Speicher 
entsprechender Größe allokiert werden konnte.
malloc() reserviert nur Speicher, der muss danach noch initialisert 
werden.
:
  if(NULL==(message.dataptr = malloc(500)))  exit(1); // Fehler, Schluss
  memset(message.dataptr,0,500);
  rs232_puti(message.dataptr);
:
Sonst gibts amoklaufende Pointer.

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.