Forum: Compiler & IDEs Speicherbereich für Zeiger


von Mike (Gast)


Lesenswert?

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:
1
int *px = new int;
2
*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...
1
int main(void)
2
{
3
  uint8_t *pstate, *pswReadSave;
4
  *pstate = 0;
5
  *pswReadSave = 0;    //beide mit Startwert 0 initialisieren
6
[...]
7
        
8
  while(1)
9
  {    
10
    
11
    while (menu == 1)
12
    {
13
      sw_read (pstate, pswReadSave);   //Zeiger an Funktionen übergeben
14
      main_menu(pstate);
15
    }
16
  } 
17
}

Gruß
Mike

von Mike (Gast)


Lesenswert?

Edit: Ich benutze Atmega88

von Referenz (Gast)


Lesenswert?

new geht nicht, da kein Heap vorhanden ist.

Das untere sollte so gehen. Die Variablen liegen in Registern, auf dem 
Stack oder im RAM.

von Björn C. (bjoernc) Benutzerseite


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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

von (Ein) (Gast)


Lesenswert?

1
int main(void)
2
{
3
  uint8_t pstate, pswReadSave;
4
  pstate = 0;
5
  pswReadSave = 0;    //beide mit Startwert 0 initialisieren
6
[...]
7
        
8
  while(1)
9
  {    
10
    
11
    while (menu == 1)
12
    {
13
      sw_read (&pstate, &pswReadSave);   //Zeiger an Funktionen übergeben
14
      main_menu(&pstate);
15
    }
16
  } 
17
}

Das könnte gehen, hab's aber nicht getestet...

von Oliver (Gast)


Lesenswert?

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

von Mike (Gast)


Lesenswert?

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
1
int x = 1;
2
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

von Referenz (Gast)


Lesenswert?

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.

von Oliver (Gast)


Lesenswert?

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

Warum? Das ist nicht sinnvoll, und bringt nichts.
1
int einInt; // das ist eine Integervariable
2
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

von Sam .. (sam1994)


Lesenswert?

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

malloc sollte man auf avrs lieber meiden:
http://www.mikrocontroller.net/articles/Heap-Fragmentierung

von Rolf M. (rmagnus)


Lesenswert?

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.

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.