Bestimmter Speicheradresse einen Wert zuweisen

Gast #1931244
Lesenswert?

Hallo zusammen,

ich sitze gerade an einem Projekt für den ATmega644 und möchte wie 
erwähnt an eine Speicheradresse einen Wert schreiben. Dabei ist die 
Speicheradresse als int gegeben. fptr ist ein vorher definierter 
Funktionspointer-Typ.

1
fptr tmp;
2
tmp=(fptr)Speicherdresse;
3
*tmp=Wert;

Dabei erhalte ich folgende Fehlermeldung für die 3. Zeile:
error: lvalue required as left operand of assignment

Könnt ihr mir sagen wo da mein Fehler liegt? Lässt sich das gar nicht so 
einfach realisieren?

Gruß
Alex
Gast #1931261
Lesenswert?

Wenn fptr tatsächlich ein Funktionspointer ist, also z.B.
1
typedef void fptr(int);
dann ist klar, dass das nicht geht, wie willst du an eine Funktion einen 
Wert zuweisen?

Wenn du die Funktion mit dem Wert als Übergabeparameter aufrufen willst, 
geht das mit
1
fptr(Wert);

Also: was hast du vor?
Gast #1931320
Lesenswert?

Ich bin mir nicht sicher was du vor hast aber eine bestimmten Speicher 
Adresse  einen wert zu weisen, macht man so
1
 
2
 char *ptr;
3

4
 ptr = ( char *) 0xDEADBEEF; // Setze Address auf 0xDEADBEEF;
5
 *ptr = WERT;  // schreibe WERT nach 0xDEADBEF;
#1931328
Lesenswert?

Das würde ein Byte zuweisen.

Er redet aber davon, eine int übertragen zu wollen.
Das ginge analog mit:
1
  int wert = ...; // was auch immer
2
  / an die Adresse 0xDEADBEEF die int WERT schreiben:
3
  *(int*)0xDEADBEEF = wert;

Aber was er wirklich will, ist mir auch nicht so recht klar.
DSas obige setzt ja eine Speichrstelle im RAM.
Ein Funktionszeiger würde aber gar nicht eine RAM-Adresse
beinhalten beim AVR.
Gast #1931385
Lesenswert?

Klaus Wachtler schrieb:
> DSas obige setzt ja eine Speichrstelle im RAM.

Nö. Das weisst lediglich dem Pointer einen Wert zu. Der würde bei Aufruf 
der Funktion über den Pointer als Adresse im Flash interpretiert.

Alex schrieb:
> *tmp=Wert;
>
> Dabei erhalte ich folgende Fehlermeldung für die 3. Zeile:
> error: lvalue required as left operand of assignment

Nun ja, ein Funktionspointer ist ein Funktionspointer ist ein 
Funktionspointer. Das, worauf der zeigt (*tmp), ist eine Funktion, die 
kann man nur aufrufen, aber der kann man keinen Wert zuweisen.

Daher solltest du erst einmal beschreiben, was du eigentlich erreichen 
willst.

Oliver
Gast #1931607
Lesenswert?

Vielen Dank für die vielen Antworten!

Ich war gestern Nacht wohl schon übermüdet und es hat am elementaren 
Verständnis für Pointer gefehlt.

Mithilfe von Imons Beitrag konnte ich mein Problem schon lösen.
Mein Problem dabei war das mein WERT die Adresse einer Funktion ist. 
(WERT ist also ebenfalls vom Typ fptr)
Ich wollte aber keine Funktion speichern sondern eben nur einen int-Wert 
der die Adresse einer Funktion beschreibt.

Der von mir gesuchte Code sieht also so aus:
1
unsigned int* tmp;
2
tmp=(unsigned int*)Speicherdresse;
3
*tmp=(unsigned int)WERT;

Das müsste eigentlich das tun was ich wollte.

Gruß
Alex
#1931626
Lesenswert?

In ein char passt nur ein Byte.
Es gibt nicht viele Systeme, bei denen die Adresse einer
Funktion mit einem Byte auskommt.

int bzw. uint muß auch nicht passen, geht aber oft (zufällig).

Ich weiß immer noch nicht, was du wirklich willst.
Aber es kommt mir falsch vor.
#1931669
Lesenswert?

Alex schrieb:
> Edit:
>
> Wahrscheinlich wäre unsigned char, sinniger als unsigned int wenn ich
> die Adresse einer Funktion speichern möchte, oder?


Am sinnigsten wäre es, ganz einfach den dafür vorgesehenen Datentyp, 
nämlich einen Funktionspointer, zu benutzen.

Speziell bei Pointer gilt nämlich oft die Daumenregel: Wenn man da wie 
wild rumcasten muss, dann stimmt etwas nicht.
Moderator Persönliche Seite #1931698
Lesenswert?

Karl heinz Buchegger schrieb:
> Speziell bei Pointer gilt nämlich oft die Daumenregel: Wenn man da wie
> wild rumcasten muss, dann stimmt etwas nicht.

Außerdem dürfen Funktionszeiger ohnehin nur in (bzw. von) anderen
Funktionszeigern gecastet werden, eine Vermischung mit Objektzeigern
ist unzulässig und führt zu undefiniertem (meiner Erinnerung nach)
Verhalten.  Auch ein Cast von/nach "void *" ist damit unzulässig.
Wenn man einen "generischen" Funktionszeiger braucht (um einen Zeiger
auf eine Funktion beliebigen Typs speichern zu können, bei dem Typ
und Anzahl der Argumente erst zur Laufzeit feststehen), kann man
sich mit sowas helfen:
1
typedef void (*generic_func_ptr)(void);

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren