Hallo zusammen,
ich versuche gerade erfolglos den Inhalt eines Speicherbereichs (siehe
Anhang) in einem String abzuspeichern. Der String sollte eigentlich so
aussehen ("0,225 0,475 0,000 ....... "). Leider bekomme ich lediglich
die erste Kommazahl.
1
chartemp_string[];
2
inti;
3
4
addr=(char*)0x00010000;
5
6
for(i=0;i<256;i++)
7
{
8
temp_string[i]=*(addr+i);
9
}
Sprich, nach diesem Code habe ich nur "0,225" im temp_string.
>addr = (char *) 0x00010000;>for(i=0; i<256 ; i++)>{> temp_string[i] = *(addr+i);>}
Abgesehen davon, dass man diese Schleife besser anders gestaltet, hast
du hier folgendes Problem:
mit *(addr+i) holst du eine (hex)Zahl zwischen 0..255.
Das was du willst,:
>"0,225 0,475 0,000 ....... "
ist aber ein String. Also musst du die Zahl, die du gerade geholt hast
(0..255) in einen String '0'..'255' wandeln.
Dazu brauchst du, mit dem Komma, den vierfachen Platz.
itoa (oder sowas) ist dein Freund
, falls du es, wie im Bildanhang, als Hex haben willst, wirds relativ
einfach
Hallo Matthias,
ich glaube du hast mich nicht richtig verstanden:
Ich will gar keine hexadezimale Ausgabe! Ich will einfach nur diesen
Speicherbereich als String interpretiert ausgeben.
Es funktioniert ja auch (so ein bisschen)
Die erste Zahl (0,225) wird richtig ausgegeben. Danach reist der String
ab und ich habe keine Ahnung warum! Eigentlich sollte die for-Schleife
den String-Array weiter mit Werten füllen.
Timmo hat mich wohl verstanden.
>als String interpretiert ausgeben
Das ist ja was ganz anderes und hat absolut nichts mit deinem Anhang
zutun. Das ist dann nämlich irreführend.
>Danach reist der String ab und ich habe keine Ahnung warum!
Aber ich: Wenn du einen beliebigen Speicherbereich als String
interpretierst , dann endet der, sobald ein 0x00 "gefunden" wird, egal
wielang dein Speicherbereich ist!
>Die erste Zahl (0,225) wird richtig ausgegeben. Danach reist der String>ab und ich habe keine Ahnung warum!
Weil im Speicher Nullen vorkommen. Bei der ersten
Null ist der String beendet.
Hallo Matthias,
aber ich hatte doch geschrieben:
den Inhalt eines Speicherbereichs (siehe
Anhang)
Das Bild spiegelt also den Speicherbereich in meinem Chip wieder. Es
soll nicht die erwünschte Ausgabe sein. Sorry wenn das missverständlich
war.
Hallo Holger,
kann ich ein weiteres Füllen des temp_string Arrays irgendwie erzwingen?
>Hallo Holger,>>kann ich ein weiteres Füllen des temp_string Arrays irgendwie erzwingen?
Du füllst den String schon korrekt. Dort wo eine 0x00 auftaucht
musst du durch 0x20 oder ' ' ersetzten.
>kann ich ein weiteres Füllen des temp_string Arrays irgendwie erzwingen?
Nicht nötig, da du ja alle 256Speicherzellen kopiert hast, aber der
String ist nunmal zuende!
Du könntest höchstens per if einen Punkt oä ablegen, falls das Zeichen
nicht druckbar ist.
>Du füllst den String schon korrekt. Dort wo eine 0x00 auftaucht>musst du durch 0x20 oder ' ' ersetzten.
Soll natürlich ersetzen heissen :(
Hatte ich noch vergessen:
Am Ende des Strings MUSS eine Null stehen.
Also Array z.B. auf 513 Elemente und das letzte
per Hand auf 0 setzen. temp_string[512] = 0;
>erzeugt in der Ausgabe 0,225>und nicht wie ich es eigentlich will 0,225 0,475 0,000....
Wenn das im Speicher steht: (in hex)
30 2C 32 32 35 00 ...
Dann ist die Ausgabe aber korrekt, wovon ich ausgehe.
>char temp_string[512] = "0,225 0,475 0,000";
Erzeugt im SPeicher:
30 2C 32 32 35 20 30 2C 34 37 35 20 30 2C 30 30 30 00 ...
die ... bedeuten, dass der folgende Inhalt belanglos ist!
Vergleiche mit ner ASCII Tabelle!
> meinen temp_string auf diese Weise fülle, bekomme ich in der Ausgabe> 0,225 0,475 0,000 (das, was ich will)
Ja, aber hier hast Du nach dem "225" ein Blank, ASCII 0x20.
In Deinem Buffer steht aber danach (also an Adresse 0x10005) ein 0x00,
also eben ein String-Terminator.
Den musst Du durch ein 0x20 ersetzen, z.B. so:
(*(addr+i))== 0x00 ? 0x20 : *(addr+i)