C++: Verschiedene Werte beim Output?


28.06.2022, 23:26

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

Vom Fragesteller als hilfreich ausgezeichnet

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.


redsky 
Fragesteller
 28.06.2022, 23:37

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?

0
PeterKremsner  28.06.2022, 23:40
@redsky

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.

0
redsky 
Fragesteller
 28.06.2022, 23:45
@PeterKremsner

Hmm ok, dann wohl irgendwas in meiner main() Funktion. Danke schonmal für die Hilfe. Ich prüfe dann morgen den Rest meines Codes.

0
redsky 
Fragesteller
 29.06.2022, 19:52
@PeterKremsner

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.

0
PeterKremsner  29.06.2022, 19:58
@redsky

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.

0

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.