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
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.
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.
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
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...
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
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
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.
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
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
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.