Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Ich will nen Double in nein charArry speichern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
02.03.2007, 14:17 Uhr
vorgon



Hallo ich hab ein Problem.

Ich muss ein float in seine 4 Byte aufspalten und jedes Byte in ein char Arry packen.

meine Idee war:

C++:
void splitdouble(double* src, char* dest)
{
    char* doublePtr = src;

    *dest++ = *doublePtr++;
    *dest++ = *doublePtr++;
    *dest++ = *doublePtr++;
    *dest = *doublePtr;
}





warum ich das machen möchte? Ich möchte nen float über die RS232 schicken,die kann aber nur Byteweise senden und daran kann ich nichts ändern.

Bin echt am verzweilfen. Bekomme den Compilerfehler Can't convert Doube* to char*,
Muss aber auch gestehen das ich bis jetzt mehr mit ANSI C zutuhen hatte. und da klappts
Ist das nen C != C++ Problem ? Oder könnte das auch ein meinen Compilerflags liegen ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.03.2007, 14:27 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
sowas erzeugt immer ne Warnung/Fehler - implizit kann er da nix casten.

Was du machen willst ist folgendes: Du willst den Speicherbereich (die 4 Bytes) vom float in ein Socket schieben:


C++:
float a = 4.4323f;
send(sock, (char*)&a, sizeof(float), 0);



fertig, da musste nicht erst rumkopieren. Was im Speicher an irgendeiner Stelle steht interessiert ja nicht - du kopierst so sozusagen 4 Bytes irgendwo aus dem Speicher (wo eben dein float steht). Was da dahintersteht interessiert dem Compiler nicht. Man muss ihm halt nur sagen "betrachte die Werte hinter der Adresse als char" - mit dem expliziten Cast.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.03.2007, 16:55 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


wenn du es trotzdem vorher zum testen in ein char-array packen willst hilft dir sscanf
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.03.2007, 17:00 Uhr
vorgon



Danke für die schnelle Aantwort,

Hab mal auf die schnelle was über sockets gelesen und was ich mitbekommen habe, taugt das nicht für mein Porblem . Ich muss expilizit die 4 float Bytes in ein Char Array kopieren. Eigentlich
Sende ich ein Packet von 20 Bytes über die RS232. Dazu baue ich mir ein 20 Byte CharArray
kopiere dort meine Steuerbefehle und 4 float Byte rein ,das schicke ich dann an die RS232.


Vielleicht sollte ich mal kurz erzählen was ich bauen möchte. Damit man mein Problem besser versteht. Also Ich hab hier nen Microcontroller und ich möchte eine GUI haben mit der ich
dem Microcontroller Werte übermitteln und vom Microcontroller Werte abfragen kann.
Auf der Controllerseite bin ich ziehmlich eingeschrängt z.B kann er nur Byteweise auf der RS232
senden und empfangen. Deswegen muss ich alles in Bytes zerlegen rübersenden und auf der anderen Seite wieder zusammen bauen.
Den Controller programmier ich in C. und für den hab ich auch schon alles fertig.
Nächste Frage die man sich stellen könnte warum Der Kram in C++ auf der PC Seite?
Weil ich die GUI in QT4 baue.


So jetzt noch kurz zu Fehlermeldung. Der GCC für den Microcontroller spuckt mir nur ein Warning
aus. Aber der MinGW meint das es ein ERROR sei wenn ich ein doublezeiger auf nen charzeiger
setze.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.03.2007, 17:22 Uhr
Kest
saint


Hi!


vielleicht irgendwie so:


C++:
union{
          float flt;
          char chr[sizeof(float)];
}buffer;

char array[...];
size_t i;

for(i=0; i<sizeof(float); i++)
            array[i]=buffer.chr[i];

--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.03.2007, 17:31 Uhr
Blubber2063



Was traugt denn da nicht ? Du kriegst doch über den Cast alles hin, nimm dir die Adresse von der Floatvariable und caste sie in einen Char*. Danach schiebst du die passende Anzahl von Bytes über die Schnittstelle und setzt sie auf der anderen Seite wieder zusammen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
02.03.2007, 18:11 Uhr
vorgon



habs mit cast versucht ging nicht
Compiler war zwar glücklich aber die werte waren falsch
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
02.03.2007, 18:23 Uhr
Blubber2063



Kann es sein das dein Microcontroller ne andere ByteOrder hat als dein PC ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
03.03.2007, 10:12 Uhr
xXx
Devil


Willst das eigentlich für C++ haben? Werd aus deinem 1. Satz net ganz schlau ... dann würde es nämlich mit std::stringstream gehen ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
03.03.2007, 13:04 Uhr
mike
Pinguinhüpfer
(Operator)


char ist ein integraler Typ - das geht net so ohne weiteres nach double
Suchst du vl. den Shift Operator? Den hab ich bei unserem I/O immer verwendet um Werte die größer als die Bandbreite sind asynchron zu senden.
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: