Hallo,
ist es mit C möglich einen Integerwert im Flash abzulegen, ohne dafür
einen Variablennamen zu definieren und nur die Adresse dieses Wertes im
Speicher zu bekommen? Also sowas wie:
1
int*MyPtr=&(constint)1234;
Bei Strings verhält es sich ja im Prinzip ähnlich. Dort liegt der String
auch irgendwo im Flash und ich bekomme einen Zeiger darauf:
1
char*MyPtr="HelloWorld";
Eine Alternative wäre ja z.B. meine Zahl 1234 (Hex: 0x04D2) als String
abzulegen, allerdings mit dem Nachteil, dass ich beim Zugriff die Daten
unter Umständen wieder in der korrekten Reihenfolge zusammenbauen
müsste:
Thomas F. schrieb:> Hallo,>> ist es mit C möglich einen Integerwert im Flash abzulegen, ohne dafür> einen Variablennamen zu definieren und nur die Adresse dieses Wertes im> Speicher zu bekommen? Also sowas wie:>>
Torsten R. schrieb:> Thomas F. schrieb:>> Hallo,>>>> ist es mit C möglich einen Integerwert im Flash abzulegen, ohne dafür>> einen Variablennamen zu definieren und nur die Adresse dieses Wertes im>> Speicher zu bekommen? Also sowas wie:>>>>
1
>>int*MyPtr=&(constint)1234;
2
>>
>>
1
>int*MyPtr=(int*)1234;
2
>
Hier typecaste ich die 1234 ja nur in einen Pointer und verwende die
1234 somit als Adresse für meinen MyPtr.
GCC schrieb:> Das geht etwa so:>>
1
*((uint32_t*)1234)=0xDEADBEEF;
>> Vorrausgesetzt, mein C-Fu ist noch nicht so eingerostet bzw. es ist> Semantisch erlaubt
Hier typecaste ich die 1234 ja auch in einen Pointer, dereferenziere
diesen dann und weise der Speicherstelle 0xDEADBEEF zu.
Was ich aber möchte ist, dass der Wert (nicht Adresse) 1234 im Flash
abgelegt wird und ich die Adresse auf diesen Speicherplatz bekomme,
sodass ich mit folgender Zeile auf mein 1234 zugreifen könnte:
Thomas F. schrieb:> Hallo,>> ist es mit C möglich einen Integerwert im Flash abzulegen,
Der C-Standard kennt kein Konzept namens "Flash".
Unabhängig davon gibt es keine Möglichkeit, die Adresse auf eine Zahl zu
bekommen wenn z.B. eine Funktion einen int* erwartet:
Anonyme Variablen kann man mit Compound-Literals erzeugen:
1
constint*MyPtr=&(constint){1234};
Manche Compiler platzieren const-Objekte automatisch im Flash, bei
anderen muss man etwas nachhelfen. So muss man bspw. beim AVR-GCC das
Schlüsselwort __flash verwenden:
Yalu X. schrieb:> Anonyme Variablen kann man mit Compound-Literals erzeugen:>>>
1
>constint*MyPtr=&(constint){1234};
2
>
Genial, sowas habe ich gesucht :-)
Eine Frage allerdings noch.
Wenn ich deine oben zitierte Variante nehme, meldet mir der Compiler:
"taking address of temporary".
Bei der folgenden Variante compiliert es ohne Errors und Warnings.
1
constint*MyPtr=(constint[]){1234};
Wieso behandelt der Compiler hier die "Adresse von einem Integer" nicht
gleich wie ein Array (ein Verweis auf das Array selbst ist doch auch nur
ein Zeiger).
Thomas F. schrieb:> Wieso behandelt der Compiler hier die "Adresse von einem Integer" nicht> gleich wie ein Array (ein Verweis auf das Array selbst ist doch auch nur> ein Zeiger).
Keine Ahnung. Was ist das für ein Compiler?
Man muss halt beachten, dass ein Compound-Literal, das innerhalb einer
Funktion steht, nur so lange lebt, wie der umschließende Block aktiv
ist. Ist die Zeigervariable, die auf das Literal zeigt, länger existent,
wird ihr Inhalt ungültig. Das ist dann so ein ähnlicher Effekt wie wenn
eine Funktion einen Zeiger auf eine nicht-statische lokale Variable als
Return-Wert zurückgibt. Beide Problem bestehen aber bei einem durch
einen Zeiger repräsentierten Array genauso, weshalb auch mir ganz klar
ist, warum der Compiler in einem Fall warnt und im anderen nicht.
Compound-Literals außehalb von Funktionen sind übrigens immer statisch,
leben also so lange, wie das Programm läuft.
Thomas F. schrieb:> Wieso behandelt der Compiler hier die "Adresse von einem Integer" nicht> gleich wie ein Array (ein Verweis auf das Array selbst ist doch auch nur> ein Zeiger).
Weil ein Array kein Zeiger ist und ein Zeiger kein Array.
1) sizeof verhält sich anders.
2) Einem Zeiger kann ein Wert zugewiesen werden, einem Array nicht
(damit ist nicht ein Element des Arrays gemeint).
Ich wiederhole nochmal die Fragen der Fragen:
> Um welchen Mikrocontroller geht es?> Warum willst du keine Variable deklarieren?> Und wozu genau ist das ganze gut?
Wer Hilfe erwartet, sollte Rückfragen beantworten.
@Thomas:
Mir scheint, du kompilierst den Code als C++-Programmm.
In C++ gibt es offiziell keine Compound-Literals, allerdings bietet sie
der GCC als Erweiterung an. Dummerweise verhalten sich die Compound-
Literals im erweiterten C++ anders als in C:
https://gcc.gnu.org/onlinedocs/gcc/Compound-Literals.html
Wenn du den verlinkten Text gelesen hast, verstehst du die Fehlermeldung
und auch, warum bei Verwendung eines Arrays mit const-Elementen keine
Fehlermeldung ausgegeben wird.
In C sind beide Schreibweisen gleichbedeutend und korrekt, weswegen der
Compiler dort nicht meckert.
Eine eigene Frage?
Dieser Thread ist über 10 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.