c++ Fehlermeldung beim Versuch Werte in einen string zu schreiben und zu lesen?
Hallo,
ich schreibe an einem c++ Programm und verwende die Library libgeotiff. Ich versuche mit Hilfe der Library einen Wert aus einer bestehenden geotiff Datei zu extrahieren und in eine Variable zu speichern. Anbei der Code:
int main()
{
TIFF* tif = XTIFFOpen("C:\\Projekte\\Geotiffs\\Farbe1.tif", "r");
GTIF* gtif = NULL;
gtif = GTIFNew(tif);
std::string Citationkey;
GTIFKeyGet(gtif, GTCitationGeoKey, &Citationkey, 0, 1);
std::cout << Citationkey << std::endl;
XTIFFClose(tif);
}
Laut libgeotiff Dokumentation sind die Werte vom "Citation" Geokeys vom Typ String, daher das std::string Citationkey;
Leider springt Visual Studio beim ausführen in eine neue Datei und gibt folgende Fehlermeldung aus:
// proxy allocated, drain it
for (auto& _Pnext = _Myproxy->_Myfirstiter; _Pnext; _Pnext = _Pnext->_Mynextiter) { // TRANSITION, VSO-1269037
_Pnext->_Myproxy = nullptr;
}
0xC0000005: Access violation for reading at position 0xFFFFFFFFFFFFFFFF.
Kann mir jemand erklären was da schief gelaufen ist. Es hat wahrscheinlich etwas mit dem Datentyp String zu tun und der Art und Weise wie ich ihn deklariere in ihn hinein schreibe oder ihn ausgeben möchte. Ich verstehe allerdings nicht was ich falsch gemacht habe und würde mich über Tipps und bestenfalls Erklärungen freuen.
Viele Grüße
2 Antworten
Der Typ 'string' meint hier einen C-String, also ein mit \0 terminiertes char Array.
D.h. So klappt das nicht.
int main()
{
char buf[4096];
TIFF* tif = XTIFFOpen("C:\\Projekte\\Geotiffs\\Farbe1.tif", "r");
GTIF* gtif = NULL;
gtif = GTIFNew(tif);
GTIFKeyGet(gtif, GTCitationGeoKey, buf, 0, sizeof(buf));
/* std::string Citationkey(buf); - cout sollte auch mit dem char buffer zurecht komme */
std::cout << buf << std::endl;
XTIFFClose(tif);
}
Wenn Du das c++-fien willst, kannst Du ja alternativ ein std::array nutzen, oder einen std::vector, preallokieren und in dessen Datenbereich schreiben lassen.
Du kannst zwar bei std::string eine Preallokation durchführen, aber der Zugriff auf das interne Datenfeld ist lediglich lesend "gestattet".
Ich revidiere das, es müßte sich auch mit std::string machen lassen. Wenn der const overload genuitzt wird, darf nicht verändert werden.
Solltest du die Muse haben, kannst Du es ja mal versuchen ...
wenn ich ein bisschen Zeit hab die Tage mache ich das bestimmt mal. Das sind wahrscheinlich die Feinheiten die mich irgendwann zu einem guten Programmierer machen. Danke für die Hilfe und Tipps :)
Kein Plan ich hab lange nicht mehr mit c++ gearbeitet aber es sieht aus als ob er keinen Zugriff auf den code hat warum auch immer. Ich habe mich auch in einem ganz anderen Bereich bewegt als du hier daher verstehe ich kaum was von deinem code aber vielleicht als public int schreiben? Falls das bei int und in c++ überhauot existiert, vielleicht bringe ich das mit c# durcheinander oder public/private gibt es nur in Zusammenhang mit unity?
Das hat funktioniert. Ich war zwischendurch sogar auf der richtigen Schiene mit dem char buf[], habe aber bei der Function schlichtweg 1 geschrieben anstelle von sizeof(buf). In der Doku steht halt 1 (außer wenn der Text ein string ist). Dann hatte ich zwar keine Fehlermeldung mehr, aber hatte auch kein Ergebnis.
Aber jetzt habe ich verstanden woran es liegt. Danke dir :)