Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » YIP revisited...

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 ]
010
22.08.2006, 10:33 Uhr
~Blubber2063
Gast


Du musst halt mal deine Abbruchbedingung checken und sichergehen, das du immer nur die richtige Datenmenge pro iteration liest.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
22.08.2006, 12:04 Uhr
Yadgar



High!


Zitat von ~Blubber2063:
Du musst halt mal deine Abbruchbedingung checken und sichergehen, das du immer nur die richtige Datenmenge pro iteration liest.


Die Abbruchbedingung lautet

while (input.get(ch))

nur... wann wird der Wert von input.get(ch) (also nicht nur ch) 0? Absurderweise habe ich das Problem des vorzeitigen Abbruchs nur bei TGAs, die aus PNGs konvertiert wurden, nicht jedoch bei neu erstellten TGAs!

Pro Iteration werden jeweils drei Bytes (char) gelesen, nach dem dritten Byte wird der Pixelzähler um eins erhöht... aber der Fehler scheint ja schon bei input.get(ch) zu liegen!

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
22.08.2006, 12:45 Uhr
~Blubber2063
Gast


Aber die Abbruchbedinung ist falsch, jeder Wert <= 0 ist da false, du musst testen ob der Stream leer ist also while(!input.eof()) wenn ich das jetzt richtig in erinnerung habe.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
22.08.2006, 13:40 Uhr
ao

(Operator)



Zitat von Yadgar:
wann wird der Wert von input.get(ch) (also nicht nur ch) 0?

Wenn ein Null-Byte (0x00) gelesen wurde.

Zitat:
Absurderweise habe ich das Problem des vorzeitigen Abbruchs nur bei TGAs, die aus PNGs konvertiert wurden, nicht jedoch bei neu erstellten TGAs!

Jetzt versteigst du dich in Erklärungsversuche, die wirklich absurd sind. Du solltest aufhören herumzurätseln und lernen, deinen Debugger zu benutzen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
22.08.2006, 14:45 Uhr
Yadgar



High!


Zitat von ~Blubber2063:
Aber die Abbruchbedinung ist falsch, jeder Wert <= 0 ist da false, du musst testen ob der Stream leer ist also while(!input.eof()) wenn ich das jetzt richtig in erinnerung habe.


Das habe ich auch schon versucht - das Programm stürzt dann einfach ab und reißt die ganze DEV-C++-Entwicklungsumgebung mit in den Abgrund!

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
22.08.2006, 14:49 Uhr
Yadgar



Yadgar


Zitat von ao:
[quote Yadgar]wann wird der Wert von input.get(ch) (also nicht nur ch) 0?

Wenn ein Null-Byte (0x00) gelesen wurde.
[/quote]

Dann sollte der Einlesevorgang aber schon beim ersten Pixel abbrechen - das Pixel hat den Farbwert <0, 0, 0>! Genau das passiert aber nicht... und, wie gesagt, bei neu erstellten TGAs habe ich das Problem nicht!

Mit dem Debugger werde ich mich heute Abend mal beschäftigen...

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
22.08.2006, 15:21 Uhr
~Blubber2063
Gast


Vermutlich wirst du hier doch noch Code veröffentlichen müssen damit man den Fehler sehen kann, input.get(ch) dürfte nie null werden, weil diese überladene Methode die Referenz auf den Stream zurückgibt. Und ein Absturz weil du auf input.eof testest kann ich mir nicht erklären, kann mir nicht vorstellen das die bei der Implementierung mist gebaut haben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
22.08.2006, 15:37 Uhr
ao

(Operator)



Zitat von Yadgar:
Das habe ich auch schon versucht - das Programm stürzt dann einfach ab und reißt die ganze DEV-C++-Entwicklungsumgebung mit in den Abgrund!

Das liegt mit größter Wahrscheinlichkeit nicht am while (!input.eof()), sondern an irgendwas anderem. Also debuggen, Problem eingrenzen und ggfs. hier Code posten.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
22.08.2006, 15:37 Uhr
ao

(Operator)



Zitat von ~Blubber2063:
input.get(ch) dürfte nie null werden, weil diese überladene Methode die Referenz auf den Stream zurückgibt.

Stimmt, hab nicht aufgepasst.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
23.08.2006, 13:30 Uhr
Yadgar



High!


Zitat von ~Blubber2063:
Vermutlich wirst du hier doch noch Code veröffentlichen müssen damit man den Fehler sehen kann


Voilà:


C++:
      while (!input.eof())
      {
         if (i >= 17)
         {
            n=i-17; // Gelesene Bytes ab Beginn des Datenteils
            pn = xsize*y+x; // Nummer des aktuellen Pixels
            if (n>0 && !(n%p_byte)) x++;
            if (n>0 && !(n%(xsize*p_byte)))
            {
              x=0;
              y++;
            }
            switch(n%p_byte)
            {
               case 0: b=ch;
                       break;
               case 1: g=ch;
                       break;
               case 2: r=ch;
                       picture.setPixel(x, y, b, g, r);
                       #ifdef TEST
                       p++;
                       if (flag && pn<=xsize*ysize)
                       {
                         cout << pn << "\t\t\t<" << (unsigned short)r <<", " << (unsigned short)g
                                << ", " << (unsigned short)b << ">\n";
                         if (pn>0 && !(pn%20))
                           flag=weiter();
                       }
                       #endif
                       break;
               case 3: ; // vorerst leer, wird bei späterer Implementierung einer Klasse für
                            // 32bit-Pixel berücksichtigt!
                                                  
                       break;        
            }
         }
         // if (!i) cout << "Beginn des Datenteils!" << endl;
         i++;
      }
      #ifdef TEST  
      cout << p << " Pixel eingelesen!" << endl;
      cout << "Daten im Objekt \"Image\": " << endl;
      picture.pDisplay();
      #endif



Zur Erklärung:

ch: aus dem TGA-File eingelesenes Roh-Datum, vom Typ signed char
p_byte: Anzahl der Bytes pro Pixel, entspricht dem Wert in Byte 16 des TGA-Files (Bits pro Pixel) geteilt durch 8
x_size, y_size: Breite und Höhe der Bilddatei in Pixeln, wird aus Bytes 12 bis 15 des TGA-Files ausgelesen
x, y: Indexwerte für das in der Klasse "Image" enthaltene Feld aus "Pixel"-Objekten
picture: Objekt der Klasse "Image", repräsentiert das gesamte Bild und besteht gegenwärtig hauptsächlich aus einem zweidimensionalen Feld von Objekten der Klasse Pixel
p: Zähler für eingelesene Pixel (überflüssig, da pn den gleichen Zweck erfüllt)
b, g, r: Farbwerte für blau, grün und rot (die in TGA übliche Reihenfolge)
flag: bool-Variable, gibt an, ob die Abfrage in der Hilfsfunktion weiter() zur Unterbrechung der Pixelwert-Ausgabe nach jeweils 20 Zeilen mit ja (true) oder nein (false) beantwortet wurde
pDisplay: Methode von Image, die die eingelesenen und als Pixel-Feld organisierten Rohdaten ausgibt

Falls dieses Codeteil nicht ausreicht, um den Fehler zu finden, mailt mich doch privat an (yazdegird@gmx.de), ich schicke euch dann den vollständigen Code (und das als PNG komprimierte TGA zum Testen!)...

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog

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