Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Speicher lesen + korrekt ausgeben

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 < [ 3 ] [ 4 ]
010
14.10.2004, 22:05 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


bah... funktioniert ja nur mit doubles...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
14.10.2004, 22:14 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

für was ist da das Template? ^^


das template ist deshalb damit das mit int ,double,float, char, objekt von ner klasse, was weiss ich alles funktioniert.. du hattest dich ja nicht auf einen datentyp beschränkt
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
14.10.2004, 22:47 Uhr
Hans
Library Walker
(Operator)



Zitat von windalf:
bah... funktioniert ja nur mit doubles...

Es standen ja auch nirgendwo weiter gehende Forderungen.

Zitat von windalf:
das template ist deshalb damit das mit int ,double,float, char, objekt von ner klasse, was weiss ich alles funktioniert.. du hattest dich ja nicht auf einen datentyp beschränkt

Ah ja. Gut okay. Hab den Vorschlag von Dir mal ausprobiert. Das kann meiner natürlich nicht, aber ich hab zum einen ja auch kaum Ahnung von C++, zum anderen war ja eher C gefragt.
Obwohl... in C sollte es auch gehen, man muss in der union lediglich die anderen Datentypen noch definieren, die man haben will, und das char-array an den grössten Typ anpassen. Dann bei der Ausgabe entsprechend aufpassen, bzw. auf den Typ zugeschnittenen Ausgaben bauen... - okay. Das ist wahrscheinlich einer der Gründe, die zu dem Template-konzept geführt haben, weil es einem die typengebundene Ausgabe abnimmt, und somit die Fehlerquellen minimiert. Oder? - Was sagen die Experten (virtual, beefy, etc.) dazu?

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
15.10.2004, 09:23 Uhr
rejo



Was macht da der Bitoperator?
das ist auch die letzte frage ^^
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
15.10.2004, 09:32 Uhr
ao

(Operator)



Zitat von Hans:
Dann bei der Ausgabe entsprechend aufpassen, bzw. auf den Typ zugeschnittenen Ausgaben bauen... - okay. Das ist wahrscheinlich einer der Gründe, die zu dem Template-konzept geführt haben, weil es einem die typengebundene Ausgabe abnimmt, und somit die Fehlerquellen minimiert.


"Typgebunden" ist ja hier nur die Größe des Datentyps, d.h. die Anzahl der darzustellenden Bits. Also wenn man eine Hilfsfunktion wie diese baut:


C++:
void memorydump (const void * pMem, size_t nSize); /* Angabe von nSize in Bytes */


dann muss man nur noch die Größe bestimmen. Bei der union-Lösung würde man das in einem switch-Statement machen, bei dem Template einfach sizeof (T) verwenden.

Der Template-Code ist etwas kürzer, der union-Code funktioniert dafür auch in C.

Plattformabhängig sind sie aber beide, und hier liegt m.E. die größte Fehlerquelle: zu vergessen, dass das Ergebnis auf nem Mac (Motorola-Byteorder) anders aussehen wird als auf nem PC (Intel-Byteorder)

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
15.10.2004, 09:49 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von Windalf:
auf die schnelle würd ich sagen so

C++:
#include <iostream>

template <class T>
void binaer_ausgeben(T zahl){
    void *x=&zahl;
    for(int i=sizeof(T);--i+1;std::cout<<' ')
        for(int j=8;--j+1;)
            std::cout<<(int)(( *( ((unsigned char*)x)+i )>>j)&1);
    std::cout<<std::endl;
}

int main(){
float x=4515.863;
double y=4711.0815;

binaer_ausgeben(x);
binaer_ausgeben(y);

}



Wenns portabel wäre, dann wäre es sogar noch schlecht, so ists einfach nur schei...e

Bevor Missverständnisse entstehen: an der Stelle ist das gut so, weil der Kunde ja bestimmt nicht wollte, daß ihm seine Hausaufgaben gemacht werden

Nicht portabel ist übrigens nur ein Zeichen: Die 8. Die könnte auch eine 10, 16, 1456 oder ähnliches sein.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
15.10.2004, 09:57 Uhr
rejo



Der Kunde hat so was nicht gewollt
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
15.10.2004, 09:58 Uhr
ao

(Operator)



Zitat von virtual:
Nicht portabel ist übrigens nur ein Zeichen: Die 8.

Die ganze Idee, in den Speicher reinzugreifen und Bitmuster auszulesen und anzuzeigen ist unportabel, weil die Darstellung der Datentypen im Speicher nicht standardisiert ist.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
15.10.2004, 11:35 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@virtual
Ich wusste doch das ich dir ne Freude mache
Aber im ernst... ich würde mal gerne eine sophisticated version von dir dazu sehen falls denn nicht zuviel aufwand macht
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
15.10.2004, 13:13 Uhr
virtual
Sexiest Bit alive
(Operator)


@Windalf

Vielleicht enttäusche ich Dich jetzt ein wenig:

Kleine Vorbemerkungen

Um erstmal dahin zukommen, daß man über die gleiche Anordnung von bits im Speicher redet, würde ich den BigEndian als darstellung wählen; zum einen, weil er der Network Byteorder entspricht und damit für BSD 4.3 kompatibeln Platformen und Windows entsprechende Konvertierungsroutinen (ntohs, ntohl, htons, htonl) bereitstehen, um 16 und 32 Bitwerte entsprechend zu handeln. Zum anderen, weil es für den Menschen am einfachsten interpretierbar ist.

Wenn man sich also schon auf die Darstellung geeinigt hat, dann benötigt man als nächstes genauer angaben über die Größe der Typen. Hier istr man mit C99 besser bedient als mit C++, weil es hier mit dem Header <stdint.h> einen Header gibt, der Typen entsprechend ihrer Bitanzahl definiert: uint8_t, ..., uint128_t usw. Denn Der Standard gibt nur ungefähr vor, wie groß die sachen zu sein haben:

C++:
1 <= sizeof(char) <= siizeof(short) << sizeof(int) << sizeof(long)


Ein solcher Header fehlt in C++, deshalb müsste man hier entweder umständlich eigene Typdefinitionen machen, die von der Platform abhängen würde, oder aber auf C99 Features zurückgreifen, die eben nicht Bestandteil der ISO Norm für C++ sind.

Wie es genau in C99 ist, weiß ich aus dem Kopf jetzt nicht, aber zumindestens in C++ ist der mehr oder weniger exotische Fall denkbar, daß die kleinste adressierbare Einheit (das ist ein char) mehr als 8 Bit enthält. (der oben erwähnte, in C99 eingeführte Header stdint.h stellt mit uint_8 zwar in der Regel einen Typen für 8 Bit bereit, was darauf schliessen läßt, daß hier prinzipiell gilt, daß ein char 8 Bit hat, aber ich weiß nicht, ob das Vorhandensein des Typen int8_t zwingend ist oder nicht). In der Vergangenheit hat es solche Exoten jedenfalls gegegen:
http://minnie.tuhs.org/pipermail/tuhs/2004-September/001070.html
Darüberhinaus habe ich noch im Ohr, daß es mal eine Honeywell mit 9 Bit gab...

Fazit
Letztlich muß man doch einige Einschränkungen in Kauf nehmen, so daß sich der Aufwand einer nur so begrenzt portablen Routine nicht lohnt. Ich würde Deine Routine halt dahingehend verbessern, daß sie noch in Networkbyteorder umwandelt und dem Benutzer ein Schönes Wochenende wünscht, wenn 8 != größe eines chars ist.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 15.10.2004 um 13:16 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ]     [ 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: