Aktuelle Zeit: 17.04.2021, 02:27

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
BeitragVerfasst: 06.10.2009, 19:38 
Offline

Registriert: 15.10.2007, 20:08
Beiträge: 31
Lange her dass ich mich hier hab blicken lassen. Und ich hab auch ein ziemlich seltsames Problem. Ein Beispielcode:
Code:
   // Load data.xml
   IXMLReader* xml = m_fileSystem->createXMLReader("data.xml");
   
   while(xml && xml->read())
   {
      switch(xml->getNodeType())
      {
      case EXN_ELEMENT:
         if(stringw("model") == xml->getNodeName())
         {
            printf("[Load] Mesh is: %c \n", xml->getAttributeValueSafe(L"mesh"));
         }
      }
   }
   delete xml;


Das entsprechende XML Element sieht so aus:
Code:
<model id="1" mesh="models/ship.3ds" texture="checker.png" radius="10">


Das doofe is aber, ausgegeben wird:
Code:
[Load] Mesh is: Ç


Was läuft da schief? Das ist bei IrrXMLReader und IXMLReader so.

Edit:
Dasselbe ist bei Kombinationen wie:
Code:
printf("[Load] Mesh is: %s \n", stringw(xml->getAttributeValueSafe(L"mesh")));
printf("[Load] Mesh is: %s \n", xml->getAttributeValueSafe(L"mesh"));


Allerdings ergibt:
Code:
printf("[Load] Mesh is: %s \n", stringw(xml->getAttributeValueSafe(L"mesh")));

Code:
[Load] Mesh is: É?B


Kurz: Ich hab alles probiert, und überall lieferts mir nur datenmüll.

xml->getAttributeValue() oder xml->getAttributeValueSafe() macht auch keinen Unterschied.

Integer und Floats funktionieren aber einwandfrei.


Nach oben
 Profil  
 
BeitragVerfasst: 06.10.2009, 19:58 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Könnte einfach daran liegen, dass printf nicht mit wchar_t klarkommt.

Probier mal mit stringc oder einen Debugger, ob wirklich mist drinsteht, oder nur mist angezeigt wird.
Aber wenn zahlen funktionieren, würde ich eher darauf tippen, dass der Fehler nur bei der Anzeige liegt.

Edit:
ich seh grad, dass du es direkt mit stringw versuchst. Das kann natürlich nicht funktionieren, da printf gar nicht wissen kann, worum es sich bei stringw handelt.
Aber damit zeigst du gerade einen der Gründe, warum printf böse ist ;)
Benutzt die entsprechende c++ funktionen. Die sind dann auch typsicher. Zb. wcout und wstringstream

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
BeitragVerfasst: 07.10.2009, 08:13 
Offline

Registriert: 15.10.2007, 20:08
Beiträge: 31
Also wenn ich das in ein const wchar_t* speichere und mir dann im Debugger angucke funktionierts.

Zum besseren verständnis, das komplette Element sieht so aus:
Code:
<model id="1" mesh="models/ship.3ds" texture="checker.png" radius="10">
  <engine x="0" y="0" z="0" size="1" />
  <engine x="0" y="0" z="0" size="1" />
</model>

Es handelt sich hierbei um Raumschiffe mit mehreren Triebwerken an unterschiedlichen stellen.

Zuerst erstelle ich ein objekt in dem ich die Attribute vom Model ablege. Das gleiche mache ich mit den Engines und trage sie alle in eine liste (std::list) ein. Dann speichere ich die Engine-Liste in das Model-Objekt und trage das gesamte Model-Objekt am Ende in eine globale Liste ein.

Eigentlich verläuft das so ganz gut, nur sobald ich die Engine-Liste in das Model-Objekt speichere, sind die namen für Mesh und Textur nicht mehr "leserlich".

Leider habe ich gerade keinen Code hier, den werde ich heute nachmittag noch reineditieren.

~ Fell


Nach oben
 Profil  
 
BeitragVerfasst: 07.10.2009, 08:32 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Du musst beachten, dass std::list (bzw. alle Container die ich kenne) jeweils Kopien der übergebenen Objekte speichern.

Das wäre soweit kein Problem, jedoch werden bei Zeigern nur die Adressen kopiert.

Zum besseren Verständnigs
Code:
struct test
{
   int SomeInteger;
   char* SomeCharPointer;
}

...

std::list<test> myList;

void function()
{
   string str("Hello World");

   test myStruct;
   myStruct.SomeInteger = 42;
   myStruct.SomeCharPointer = str.c_str();

   // myStruct ist jetzt {42, 0xXYZABC123 }
   // und 0xXYZABC123 zeigt auf den string

   myList.push_back( myStruct ); // Kopie von myStruct erzeugen und in liste packen

   // stack leeren. str wird gelöscht
}

void andereFunktion()
{
   test myNewStruct = list[0];

   // myNewStruct ist {42, 0xXYZABC123 }
   // 0xXYZABC123 zeigt jetzt dahin wo vorher der String war und jetzt nichts steht
}


Deshalb solltest du Zeiger in deinen Container objekten soweit es geht vermeiden. Wenn sie sich nicht vermeiden lassen, dann musst du darauf achten, dass der Speicher nicht zu früh freigegeben wird.

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
BeitragVerfasst: 07.10.2009, 17:40 
Offline

Registriert: 15.10.2007, 20:08
Beiträge: 31
Ich hab jetzt mal bisschen mit Zeiger usw. rumgespielt und habs letztendlich geschafft indem ich in meinem struct für die pfade irr::io::path benutzt habe anstatt const wchar_t*.

Ist ja auch logisch, da es ja jetzt keine Zeiger mehr sind. Warum const wchar_t (ohne sternchen) nicht geht ist mir aber ein Rätsel.

Naja, vielen Dank! :D


Nach oben
 Profil  
 
BeitragVerfasst: 07.10.2009, 18:06 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Fell hat geschrieben:
Warum const wchar_t (ohne sternchen) nicht geht ist mir aber ein Rätsel.


Weil das nur Platz für einen Buchstaben bietet !?

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de