Forum: Mikrocontroller und Digitale Elektronik integer ausgabe


von Gert (Gast)


Lesenswert?

1
#define def  (*((uint*)(0x0043)))
2
printf( "Inhalt des defines: %i  \n", def );
3
printf( "Inhalt des defines: %i  \n", *(uint*)def );


Hallo Leute,

ich habe wohl eine einfache Frage, trotzdem finde ich keine Lösung.
Ich versuche nur den Wert von def auszugeben. Leider kommt immer i als 
Ausgabe und ich verstehe nicht warum.
Könnt ihr mir Helfen.

Gruß

Gert
P.S.: das define so Sinn macht oder nicht, sei mal dahingestellt, ist 
eine Kundenvorgabe :-(

von Peter II (Gast)


Lesenswert?

vermutlich kennt dein compiler kein %i versuchts mal mit %d

von UR-Schmitt (Gast)


Lesenswert?

Wenn mich meine angerosteten Kenntnisse nicht schwer täuschen, gibt es 
keinen %i statt dessen solltest du %d verwenden.

von Peter II (Gast)


Lesenswert?

UR-Schmitt schrieb:
> Wenn mich meine angerosteten Kenntnisse nicht schwer täuschen, gibt es
> keinen %i statt dessen solltest du %d verwenden.

scheinbar gibt es das doch:
http://www.cplusplus.com/reference/clibrary/cstdio/printf/

von Gert (Gast)


Lesenswert?

mit d werden zahlen ausgegeben. aber leider unterschiedliche. Welche ist 
der richtige?

von Peter II (Gast)


Lesenswert?

Gert schrieb:
> mit d werden zahlen ausgegeben. aber leider unterschiedliche.

was meinst du mit unterschiedliche?

%d steht für int - hast du verschiende ints?

von UR-Schmitt (Gast)


Lesenswert?

Peter II schrieb:
> scheinbar gibt es das doch:

Ich sagte ja angerostet, weisst du acuh seit wann es das gibt?

von Gert (Gast)


Lesenswert?

1
#define def  (*((uint*)(0x0043)))
2
printf( "Inhalt des defines: %d  \n", def );
3
printf( "Inhalt des defines: %d  \n", *(uint*)def );

diese beiden ausgaben sind unterschiedlich

von Peter II (Gast)


Lesenswert?

Gert schrieb:
> diese beiden ausgaben sind unterschiedlich

klar einmal dereferenzierst du ja auch den wert. Was soll das überhaupt 
sein. soll das (0x0043) eine Adresse oder ein Wert sein?

von Karl H. (kbuchegg)


Lesenswert?

Gert schrieb:
>
1
> #define def  (*((uint*)(0x0043)))
2
> printf( "Inhalt des defines: %d  \n", def );
3
> printf( "Inhalt des defines: %d  \n", *(uint*)def );
4
>
>
> diese beiden ausgaben sind unterschiedlich

Was heißt 'unterschiedlich'


Gert. bitte bedenke bei all deinen Antworten: Wir können nicht über 
deine Schulter sehen. Wir sehen und müssen aus dem unsere Schlüsse 
ziehen, was du uns schreibst. Alles was du nicht schreibst, kann auf 
dieser Seite des Monitors keiner wissen! Daher: Wenn du ein Posting 
fertig hast, dann stell dich dumm, lies es noch mal und frag dich: hab 
ich alle Informationen gegeben, gibt es etwas, das zwei- oder mehrdeutig 
ist? Kann man das was ich geschrieben habe auch anders auffassen?

: Wiederhergestellt durch User
von Gert (Gast)


Lesenswert?

eine adresse.

ob ich dereferenziere oder nicht ist doch egal, ich verändere den wert 
doch nicht, oder?

von Peter II (Gast)


Lesenswert?

Gert schrieb:
> ob ich dereferenziere oder nicht ist doch egal, ich verändere den wert
> doch nicht, oder?

klar einmal gibt du die adresse aus einmal den wert.

von Karl H. (kbuchegg)


Lesenswert?

Gert schrieb:
> eine adresse.
>
> ob ich dereferenziere oder nicht ist doch egal,

Ist nicht egal.
Ohne Dereferenzierung gibst du den Wert aus, mit Dereferenzierung wird 
der Wert selbst wieder als Adresse aufgefasst und dort im Speicher 
nachgesehen.

von Gert (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Was heißt 'unterschiedlich'

die ausgabe sieht so aus:

Inhalt des defines: 2342
Inhalt des defines: 235423

von UR-Schmitt (Gast)


Lesenswert?

Gert schrieb:
> ob ich dereferenziere oder nicht ist doch egal, ich verändere den wert
> doch nicht, oder?

Du brauchst DRINGEND ein C Buch und solltest es lesen!

von Gert (Gast)


Lesenswert?

Peter II schrieb:
> klar einmal gibt du die adresse aus einmal den wert.

danke. das wollte ich hören. und welcher ist der wert?

von Matthias L. (Gast)


Lesenswert?

>danke. das wollte ich hören. und welcher ist der wert?

Der, wo du die Adresse dereferenzierst, also auf die Adresse zugreifst.

von Gert (Gast)


Lesenswert?

danke

von Walter S. (avatar)


Lesenswert?

Gert schrieb:
> danke. das wollte ich hören. und welcher ist der wert?

per trial und error programmieren ist zeitaufwendig, schneller gehts mit

UR-Schmitt schrieb:
> Du brauchst DRINGEND ein C Buch und solltest es lesen!

übrigens dereferenziert du beim ersten Mal 1x,
beim 2. Mal 2x

von Karl H. (kbuchegg)


Lesenswert?

Eine Analogie.
Das Setup ist -
  da gibt es eine Reihe von Briefkästen. Jeder trägt eine Nummer.
  In den Briefkästen liegt jeweils ein Zettel und auf diesem Zettel
  steht seinerseits wieder eine Nummer

Nummer des BK      0   1   2   3   4   5   6
                 +---+---+---+---+---+---+---+
                 | 5 | 3 | 1 | 6 | 0 | 2 | 4 |
                 +---+---+---+---+---+---+---+

Jetzt hast du die Nummer eines Briefkastens. Sagen wir 4

Diese Nummer kannst du ausgeben. Auf der Ausgabe steht daher: 4

Du kannst dir aber auch den Zettel im Briefkasten ansehen. Auf dem steht 
ja ebenfalls eine Nummer. Du dereferenzierst die 'Adresse': *4
Und als Ergebnis erhältst du: 0
gibst du also *4 aus, so lautet die Ausgabe: 0

Du kannst auch noch weiter gehen. Du kannst diese 0, die du durch *4 
erhalten hast, seinerseits wieder als die Nummer eines Briefkastens 
auffassen lassen, und dir den Zettel ansehen der dort (im Kasten 0) 
liegt. Du dereferenzierst also 2 mal **4. Lässt du dir das Ergebnis 
davon ausgeben, dann steht auf der Ausgabe: 5

Natürlich kann man dieses Spielchen jetzt weiter treiben. Auch die 5 
(die man durch **4 erhalten hat) kann man wieder als die Nummer eines 
Briefkastens auffassen lassen und nachsehen, was auf dem Zettel dort 
drinnen steht. Also kommt noch ein * davor: ***4
Lässt man sich ***4 ausgeben, dann lautet die Ausgabe: 2

****4     wird dann zu 1
*****4    erzeugt die Ausgabe 3
******4   zaubert auf die Ausgabe eine 6
.....

mit jedem * mehr, wird die Kette des 'Nachsehens was auf dem Zettel im 
Briefkasten mit der Nummer n steht' um 1 länger.

von Mark B. (markbrandis)


Lesenswert?

Karl Heinz Buchegger, gib's doch zu, Du hast diese sehr guten Beiträge 
schon fertig verfasst auf Deiner Festplatte liegen! :-)))

von Matthias L. (Gast)


Lesenswert?

>Karl Heinz Buchegger, gib's doch zu, Du hast diese sehr guten Beiträge
>schon fertig verfasst auf Deiner Festplatte liegen! :-)))

.. zusammen mit einem Script, welches automatisch hier postet ;-)

von Karl H. (kbuchegg)


Lesenswert?

:-)

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.