www.mikrocontroller.net

Forum: GCC Speicherbereich für Zeiger


Autor: Mike (Gast)
Datum:

Hey!

ich bin gerade dabei meine erstelltes (funktionsfähiges) Programm
modular zu gestellten und will somit Zeiger an Funktionen Übergeben, um
dort den Wert zu ändern.
Nur komme ich gerade mit dem initialisieren der Zeiger nicht klar. In
anderem Kontext benutze ich immer:
int *px = new int;
*px = 99;

Im Compiler vom AVR Studio von ist "new" jedoch nicht implementiert.

Muss ich dem Zeiger bewusst einen Speicherbereich aus dem Flash
zuweisen?
Wenn ja, wie finde ich heraus welche Adressen ich nehmen kann?

Mir wäre es am liebsten wenn der Compiler das zuweisen des Speichers
übernehmen könnte!

Das Folgende geht ja auch nicht, weil dann ja der Speicherbereich
garnicht klar ist...
int main(void)
{
  uint8_t *pstate, *pswReadSave;
  *pstate = 0;
  *pswReadSave = 0;    //beide mit Startwert 0 initialisieren
[...]
        
  while(1)
  {    
    
    while (menu == 1)
    {
      sw_read (pstate, pswReadSave);   //Zeiger an Funktionen übergeben
      main_menu(pstate);
    }
  } 
}

Gruß
Mike
Autor: Mike (Gast)
Datum:

Edit: Ich benutze Atmega88
Autor: Referenz (Gast)
Datum:

new geht nicht, da kein Heap vorhanden ist.

Das untere sollte so gehen. Die Variablen liegen in Registern, auf dem
Stack oder im RAM.
Autor: Björn Cassens (bjoernc) Benutzerseite
Datum:

Ich möchte zwar nur ungern widersprechen, aber heap hat man auch auf
einem ATMega. Das Problem ist nur, das new ein Konstrukt von C++ ist und
NICHT von C. Bei C müsste man dies mittels malloc realisieren.
Autor: Peter II (Gast)
Datum:

Mike schrieb:
> int *px = new int;
> *px = 99;


was macht das überhaupt für einen sinn? einen zeiger kann man auch ohne
zeiger variable zuweisen.

int x = 1;
int* px = &x;

*px = 2
Autor: (Ein) (Gast)
Datum:

int main(void)
{
  uint8_t pstate, pswReadSave;
  pstate = 0;
  pswReadSave = 0;    //beide mit Startwert 0 initialisieren
[...]
        
  while(1)
  {    
    
    while (menu == 1)
    {
      sw_read (&pstate, &pswReadSave);   //Zeiger an Funktionen übergeben
      main_menu(&pstate);
    }
  } 
}

Das könnte gehen, hab's aber nicht getestet...
Autor: Oliver (Gast)
Datum:

Vielleicht wäre auch hier ein C-Buch ganz angebracht...

[c]

int main(void)
{
  uint8_t pstate, pswReadSave;
  pstate = 0;
  pswReadSave = 0;    //beide mit Startwert 0 initialisieren
[...]

  while(1)
  {

    while (menu == 1)
    {
      sw_read (&pstate, &pswReadSave);   //Zeiger an Funktionen
übergeben
      main_menu(&pstate);
    }
  }
}

Oliver
Autor: Mike (Gast)
Datum:

ja das untere geht sicher und ist als Lösung in meinem Hinterkopf :D!

hätte nur gern im main auch mit den Zeiger hantiert!

wenn ich
int x = 1;
int* px = &x;
mache, dann hab ich ja zwei Variablen im main die eigentlich die selbe
sind, nur einmal als Pointer und ein mal nicht.
Das ist doch etwas unschön?!

die malloc funktion werde ich gleich mal ausprobieren
Autor: Referenz (Gast)
Datum:

Björn Cassens schrieb:
> Ich möchte zwar nur ungern widersprechen, aber heap hat man auch auf
> einem ATMega. Das Problem ist nur, das new ein Konstrukt von C++ ist und
> NICHT von C.

Das ist doch kein Widerspruch, sondern nur eine detaillierte Erklärung.
Ich bin auch von C auf einem kleinen Controller ausgegangen.
Autor: Oliver (Gast)
Datum:

Mike schrieb:
> die malloc funktion werde ich gleich mal ausprobieren

Warum? Das ist nicht sinnvoll, und bringt nichts.

int einInt; // das ist eine Integervariable
foo(&einInt); // so wird ein Zeiger darauf an eine Funktion übergeben


Solange du den Zeiger auf deinen int nicht einzeln benötigst, brauchst
du auch keinen zu definieren.

Oliver
Autor: Samuel K. (sam1994)
Datum:

Mike schrieb:
> die malloc funktion werde ich gleich mal ausprobieren

malloc sollte man auf avrs lieber meiden:
http://www.mikrocontroller.net/articles/Heap-Fragmentierung
Autor: Rolf Magnus (rmagnus)
Datum:

Mike schrieb:
> ja das untere geht sicher und ist als Lösung in meinem Hinterkopf :D!
>
> hätte nur gern im main auch mit den Zeiger hantiert!

Warum? Über einen Zeiger ist der Zugriff doch umständlicher als direkt.

> wenn ichint x = 1;
> int* px = &x;
> mache, dann hab ich ja zwei Variablen im main die eigentlich die selbe
> sind, nur einmal als Pointer und ein mal nicht.

Willst du jetzt den Zeiger oder nicht?

> die malloc funktion werde ich gleich mal ausprobieren

Welchen Vorteil versprichst du dir davon, außer daß du dir damit die
Möglichkeit nimmst, direkt, also ohne den Zeiger zugreifen zu können?
Dynamischer Speicher ist ressourcenintensiv und an dieser Stelle absolut
unnötig.

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




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net