C++: Verschiedene Werte beim Output?
Hallo, ich wohl leider ein ähnliches Problem wie letztes Mal. Ggf. ist es der Uhrzeit geschuldet und morgen komme drauf, aber im Moment verstehe ich es nicht. Ich habe folgenden Code:
//Global deklariert
uint32 width;
void GetTiffTags(TIFF* tif)
{
TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width);
}
std::cout << width << std::endl;
Ich möchte gerne jedes Mal den Wert 10980 bekommen. Leider bekomme ich bei jedem Run andere Werte zwischen 400 und 700.
Ich öffne immer die gleiche TIFF Datei, wieso kommen da andere Werte heraus beim Output? Und wieso immer ein falscher.
Laut Dokumentation ist uint32 doch auch der richtige Datentyp.
Ich habe den Code ergänzt
//Global deklariert
uint32 width;
void GetTiffTags(TIFF* tif)
{
if(TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width) == 1);
std::cout << width << std::endl;
}
std::cout << width << std::endl;
Nun bekomme ich als ersten Output die 10980 die ich gerne hätte und als zweiten Output etwas zwischen 400 und 700.
2 Antworten
Zunächst mal solltest du bei diesen Funktionen den Return Value prüfen. Wenn da nicht success zurück gegeben wird stimmen die Werte in der Variable width nicht und der Wert welcher da drinnen steht ist nicht definiert.
Zudem solltest du bei pointern in C und C++ immer aufpassen, dass diese auf gültige Objekte zeigen und nicht einfach nur irgendwo in den Speicher rein. In C++ wäre es daher sauberer hier eine Referenz anstatt eines Pointers zu verwenden sofern das möglich ist. Wenn nicht solltest du immer vorher prüfen ob der Pointer bzw das Objekt hinter dem Pointer gültig ist, ansonsten kann es sehr schnell zu nicht definiertem Verhalten kommen.
Richtig. Wenn die Variable in der Funktion stimmt nur außerhalb nicht dann wird aus irgendeinem Grund der Speicherbereich in welchem diese Variable steht ungültig. Der Grund dafür ist aber vermutlich außerhalb des Code Snippets welches du hier veröffentlicht hast.
Was du natürlich machen kannst wäre, dass du keine globale Variable verwendest sondern eine lokale welche du per return zurück gibst.
Im Endeffekt ist die Variable aber ab dem Zeitpunkt gültig in welchem die Funktion TIFFGetField success zurück gibt davor ist sie nicht gültig und auch wenn die Funktion irgendwann 0 zurück gibt ist sie nicht mehr gültig.
Multithreading Probleme habe ich hier bewusst ausgelassen ansonsten gäbe es noch viel mehr Umstände in denen die Variable ungültig ist.
Hmm ok, dann wohl irgendwas in meiner main() Funktion. Danke schonmal für die Hilfe. Ich prüfe dann morgen den Rest meines Codes.
Ok, also ich habe eigentlich in der GetTifTags() weitere Aufrufe von TIFFGetField(). z.B.
TIFFGetField(tif, TIFFTAG_STRIPBYTECOUNTS, &stripbytecount);
Wenn ich diese Funktion auskommentiere, bekomme ich ein reguläres Ergebnis für width, auch wenn ich es global deklariere. Woran kann das den liegen?
In der Doku steht, dass TIFFTAG_STRIPBYTECOUNTS vom Typ uint32** ist. Bedeutet das, dass ich bei den Übergabeparametern meines Funktionsaufrufes etwas ändern muss? &&stripbytecount funktioniert schonmal nicht :D.
Dann machst du da vermutlich irgendwas falsch. Es muss aber nicht zwingend dieser Teil des Codes falsch sein. Eventuell wärs mal ratsam da mit dem Debugger im SingleStep drüber zu gehn.
Der Typ uint32_t** bedeutet, dass dir so ein Pointer geliefert wird. Also stripbytecount müsste vom Typ uint32_t* sein. Da ich die Library nicht kenne kann ich aber nicht sagen, wie du den Wert anschließend verwenden kannst.
Sieht soweit ansich okay aus, lasse Dir doch bitte auch mal den Rückgabewert von TIFFGetField ausgeben. Im Fehlerfall wird der Wert von width nicht zu gebrauchen sein.
TIFFGetField gibt success zurück. Wenn ich die Variable innerhalb meiner GetTiffTags ausgebe, bekomme ich das richtige Ergebnis. Außerhalb der GetTiffTags (z.B. in der Main) bekomme ich weiterhin etwas zwischen 400 und 700. Wie Prüfe ich die Variable width gültig ist? Die Variable ist das Objekt hinter dem Pointer oder?