Toon posts:

[C++] double = 4 bytes?

Pagina: 1
Acties:

Verwijderd

Topicstarter
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
  template <typename T>
  bool SchrijfNummerNaarFile( FILE* fp, T     nummer )
  {
    long len( sizeof(T) );

    if ( fwrite( &len, sizeof(long), 1, fp ) != 1 )
      return false;

    if ( fwrite( &nummer, len, 1, fp ) != 1 )
      return false;

    return true;
  }


Zoals je hier kan zien schrijf ik eerst de grootte van het getal weg, en daarna het getal zelf. Maar op 1 of andere manier schijnt een double maar 4 bytes te zijn, terwijl als ik daarna in de file zelf ga kijken, dat ik zie dat er 4 bytes header zijn geschreven. En 8 bytes data??? Terwijl ik door mijn 2e statement toch maar normaal de eerste 4 bytes van nummer wegschrijf?

Voor int, long enzo maakt dat niet echt veel uit, maar voor doubles wel. Dus dat is iets wat ik niet goed snap. Waarom doet ie dat zo?

Ik heb in debugmode gegaan en die len IS 4 bij een double! Is de sizeof() functie dan verkeerd?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Misschien zou je niet voor elk wissewasje een nieuw topic willen openen terwijl je vorige topic nog hoog in de topiclijst staat? Dank u.

Welnu, double is idd 8 bytes, maar zonder te laten zien hoe je de functie aanroept kunnen wij natuurlijk ook weinig

.edit: Geef je niet per ongeluk een pointer naar double mee?

[ Voor 12% gewijzigd door .oisyn op 07-11-2003 22:39 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
C++:
1
        SchrijfNummerNaarFile(fp, static_cast<double>(m_flGewicht))


Zoals je ziet doe ik hier een explicite cast naar double, waarbij m_flGewicht ook double is!


En btw... Kan ik er iets aan doen dat ik tegen zoveel inconsistentie aanloop :p

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ah, ik snap het al. Je geeft een double variabele mee, dat wordt een double &. En een reference naar double is 4 bytes. Het is beter om sizeof (nummer) te gebruiken, of nog beter, verander T nummer in const T & nummer. Dat voorkomt ook onnodige copies
En btw... Kan ik er iets aan doen dat ik tegen zoveel inconsistentie aanloop
Ten eerste is dit geen inconsistentie maar puur onoplettendheid (en onwetendheid in jouw geval denk ik ;)), maar dan nog kan het in je andere topic

[ Voor 37% gewijzigd door .oisyn op 07-11-2003 22:45 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Aw ok :) kzaller aan peinzen voor volgende keer in een eerder topic te plaatsen.

Ik dacht gewoon aan andere mensen die misschien tegen hetzelfde probleem stuiten & dan de search-functie gebruiken. Dan kunnen ze snel door de titels van de topics browsen en zo de goede uitpikken.

Doch ik snap nog niet goed waarom hij een referentie geeft... Ik zal dat eens nachecken op paar C++ sites. (wat ik begrijp met een header van "T nummer" is dat hij een kopie maakt van een (double) nummer. Dus: )

functie aanroep (double1)
in de functie (double2 <-- kopie van double1)

maar dan is double1 toch identiek gelijk aan double2? Enkel niet dezelfde geheugenruimte... ? Of geeft die static_cast een reference terug? Dan snap ik het wel natuurlijk.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Die static_cast zou geen reference terug moeten geven nee. Maar door const T & te gebruiken voorkom je dus altijd dat T een reference wordt (kan niet, want dan heb je een reference naar een reference, dus T wordt dan altijd het kale type)

Wat gebeurt er als je dit in je template functie zet in je oude code?
C++:
1
    std::cout << typeid (T).name () << std::endl;

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Hmmm, ik denk dat ik al iets anders veranderd heb onderwijl... want dit gebeurd er nu:

C++:
1
    const char* naam = typeid (T).name();

naam = "double"... en len = 8... Ik ga eens nachecken waar ik nog iets gewijzigd heb :S

Verwijderd

Topicstarter
*grrrr* mijn IP kan niet gelinkt worden :S Dus sorry voor niet te editten...

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  template <typename T>
  bool SchrijfNummerNaarFile( FILE* fp, T     nummer )
  {
    long len( sizeof(T) );

    const char * naam = typeid(T).name();

    if ( fwrite( &len, sizeof(long), 1, fp ) != 1 )
      return false;

    if ( fwrite( &nummer, len, 1, fp ) != 1 )
      return false;

    return true;
  }


len = 4 ...
naam = ... *roffel* ... "double"

Kan het nog freakier? Daarna even geprobeerd met sizeof(nummer)... Dit geeft ook 4 ... Daarna met sizeof(double), en dat schijnt dus ook 4 te zijn?!? Nu ben ik helemaal niet meer mee :S

code:
1
2
3
/nologo /Zp2 /MTd /W3 /Gm /GX /ZI /Od
/D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_USRDLL" /D "_UNICODE"
/FR"DebugU/" /Fo"DebugU/" /Fd"DebugU/" /FD /GZ /c


Dus /Zp2 = optimizen tot op 2 bytes als ik me niet vergis?
Dan verder ... Nu werkt het wel, en ik heb niets aan de settings van mijn project veranderd, noch iets gedaan met #pragma?

*insert X-Files tune*

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 17:14
.oisyn schreef op 07 november 2003 @ 22:42:
Ah, ik snap het al. Je geeft een double variabele mee, dat wordt een double &. En een reference naar double is 4 bytes
Nee. Een reference is geen object, en je kunt er geen sizeof van nemen. Je kunt ook het adres er niet van nemen. Beiden werken op het onderliggend object.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 17:14
Ik denk dat dit weer een VC6 issue is. Waarschijnlijk wordt de verkeerde functie gebruikt, dur bv met T==int ook als je een double gebruikt.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

MSalters schreef op 08 november 2003 @ 00:24:
[...]

Nee. Een reference is geen object, en je kunt er geen sizeof van nemen. Je kunt ook het adres er niet van nemen. Beiden werken op het onderliggend object.
ja dat vond ik dus ook raar, maar commeau reportte anders fijn sizeof (double &) == 4 :?

.edit: aargh, ik had waarschijnlijk een typfout gemaakt, want nu doet ie het wel goed 8)7

[ Voor 17% gewijzigd door .oisyn op 08-11-2003 00:37 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1