Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

31.03.2004, 21:15

float in 2 Stücke hacken

Hallo. Ich hab mal wieder ein Problem(ach?):

Also stellt euch vor es gibt ein Schiff, da kann man nur unsigned chars reinstecken. Aber der Mann in Australien möchte gerne floats < 160 mit diesem Schiff verschicken, und von seiner Frau, die in Deutschland wohnt, auspacken lassen. Was muss dieser Mann tun? Was seine Frau um die Floats wieder auseinander zu klamüsern? Anzahl Nachkommastellen reichen den beiden eine.

Floats sind bei mir 16 bit gross, ints auch
Meine Sprache ist übrigens C ohne postinkrement.

also:

float-> beliebeige Anzahl unsigned chars ->|||||||||||->beliebige unsigned chars -> float

Meine Idee war:
f-wert *10
nach Int casten
llinke hälfte in den einen unsigned char, recht hälfte in den anderen (& mit Maske)

aufs Schiff.
int aufmachen
linke hälfte rein, 8 bit nach links schieben
rechte hälfte dazuodern( |)
nach float casten


Aber das klappt zur Hölle überhaupt nicht! Jemand ne (elegante/funktionierende/kostengünstige/herausragende) Idee?

Und da fällt mir noch was ein. Einen Pointer zu cast dauert 0 Takte richtig? Der cast findet doch gar nicht statt weil ob jetzt bei 0x1101 ein char oder ein short int liegt, ist meinem Rechner doch sicherlich schnuppe.

Danke

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

31.03.2004, 21:21

Seit wann sind floats nur 16 Bits groß?
Einfach binär in zwei Byte-Werte packen, das war's.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
// packen
float wert = 12831.0231f;
unsigned char byte1 = *(((unsigned char*)(&wert))[0]);
unsigned char byte2 = *(((unsigned char*)(&wert))[1]);
unsigned char byte3 = *(((unsigned char*)(&wert))[2]);
unsigned char byte4 = *(((unsigned char*)(&wert))[3]);

// entpacken
*(((unsigned char*)(&wert))[0]) = byte1;
*(((unsigned char*)(&wert))[1]) = byte2;
*(((unsigned char*)(&wert))[2]) = byte3;
*(((unsigned char*)(&wert))[3]) = byte4;


Oder noch viel einfacher:

Quellcode

1
2
3
4
5
6
7
// packen
float wert = 12831.0231f;
unsigned char bytes[4];
memcpy(bytes, &wert, 4);

// entpacken
memcpy(&wert, bytes, 4);

3

31.03.2004, 21:47

Auf meinem Microcontroller sind sie eben nur 16 bit gross.
Das einzige was garantiert ist bei floating point vars ist ja, dass

sizeof(float) <= sizeof(double) <= sizeof(wiehiessernoch..extended???)



unsigned char byte1 = *((unsigned char*)((&wert)[0]));

Mag das vielleicht jemand in Worte fassen?

Warum weiss der Compiler schon vor dem cast, dass die Schrittweite in [] sizeof (unsigned char) ist??? Ich find das komisch...

Sollte man nicht die Adresse von Wert nach unsigned char* casten und dann die [] bringen?? Also etwa so:

( ( ((unsigned char*)(&wert))[0] ) )

Oder nicht??? Bin mir nicht sicher... Sag`s mir! BITTE,bitte[size=7]bitte[/size]

Danke.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

31.03.2004, 21:59

Hast recht, habe mich mit den Klammern vertan.
Habe es oben geändert!

5

31.03.2004, 23:22

Alles klar kann ja mal vorkommen im Klammerwust. Trotzdem ein Punkt für dich, ist so doch deutlich hübscher als mein zurechtgeschnipsele.

6

01.04.2004, 12:28

Ach ja der * Dereferenzierungsoperator muss auch weg, denn [] beinhaltet ja schon die Dereferenzierung...

Samuel G.

Treue Seele

Beiträge: 110

Wohnort: Stuttgart

Beruf: Schüler

  • Private Nachricht senden

7

25.04.2004, 18:16

Interesse

Zitat

Auf meinem Microcontroller sind sie eben nur 16 bit gross.
Ist ja interessant. Für welchen Microcontroller programmierste denn, und was? (und: auf was für nem Board sitzt der?)


Wir programmieren in der Schule (Informatik AG bei nem Klasse Lehrer) für nen Controller von Atmel nen Wecker (mit nem Quarz als Zeitgeber). Is echt mal interessant nur in asm zu proggen (zwar gibts nen C Compiler für unseren Prozessor, wir begeben uns aber trotzdem in die Tiefen der Maschinensprache)!

Mich würde ein Feedback (engl: Fuß zurück) freuen.


Samuel G. (the progging devil) }>
Quak

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

25.04.2004, 18:27

Re: Interesse

Zitat von »"Samuel G."«

Feedback (engl: Fuß zurück)

Nicht ganz ;)
Fuß = foot
Füße = feet
füttern = feed

9

25.04.2004, 20:38

Äh ja, also mein Float ist doch 32 bit gross... ansonsten:

Ich programmiere einen (bzw. mehrere) ATMega 162. Es handelt sich um ein "verteiltes System zur Erfassung von Umgebungsparametern". Das heisst die einzelnen Controller erfassen (bisher) Temperatur, Luftfeuchte und Luftdruck und geben die gesammelten Daten auf einen CAN-Bus. Bisher habe ich das "Activity board for CANDIP/M162" verwendet, jetzt verwende ich ein von uns selbst entworfenes Board, über das ich leider nichts verraten darf, ausser dass es noch arg fehlerbehaftet ist :angel: , und einen anderen MuC von ATMEL vorsieht.

Samuel G.

Treue Seele

Beiträge: 110

Wohnort: Stuttgart

Beruf: Schüler

  • Private Nachricht senden

10

25.04.2004, 20:56

Ähh...

Heißt das, die Maschine hat einige Sensoren, mit welchen der Proz dann Daten aus der Umgebung misst und per Bus einem anderen Gerät ausgibt?

Zitat

Das heisst die einzelnen Controller erfassen (bisher) Temperatur, Luftfeuchte und Luftdruck

Das heißt die Controller selbst messen die Umgebungsdaten? Wie soll das gehen??
??? ??? ???

Zu David:

Zitat

Nicht ganz
Fuß = foot
Füße = feet
füttern = feed


wollen wir uns hier wie Beamte benehmen, oder uns auf lockerer Ebene unterhalten?
Nur zur Info: das war der Versuch eines Scherzes. ("Sie hin es ist mein Geist und Unsinn!" (Zitat aus dem Lied "Ich steh an deiner Kippen-Gier"))


Samuel G.
Quak

Werbeanzeige