Folgendes Problem: Ich möchte in C eine TIFF-Datei auslesen und die Bilddaten als zwei- oder dreidimensionales Array innerhalb des Hauptprogrammes zur Verfügung haben. Dazu habe ich mir eine Bibliothek erstellt die bereits alles soweit ausliest das ich genau weiß wo die Datenschnippsel liegen. Die letzte Funktion soll nun das Einlesen der Daten, die strukturierung in ein 2D oder 3D-Array beinhalten und dieses dann an das Hauptprogramm übergeben. Mein Hauptproblem besteht nun an der Stelle der Speicherreserierung des Arrays. Um die Funktion selbst elegant zu gestellten muss ich in der Funktion selbst erstmal den Speicherbedarf ermitteln. Wie kann ich das am besten bewerkstelligen? Meine im Moment beste Überlegung wäre die folgende: 1. Ein Array global definieren 2. Zeiger auf Arrayanfang setzen 3. Zeiger der Funktion übergeben 4. Funktion ändert die Größe des Arrays mittels malloc/calloc Geht das so überhaupt? Was ist üblich? Danke schon Mal für die Hilfe. Und ich weiß es gibt Bibs dafür es geht um die Übung. Der Weg ist das Ziel.
Ich würde in der Funktion Speicher für das Array allozieren, einen Pointer auf den Arrayanfang als Rückgabewert zurückgeben und deutlichst in die Doku schreiben (und im Funktionsnamen vermitteln: MyImg* ReadAndAllocImg(const char* filename) o.ä.), dass der Aufrufer der Funktion für die Freigabe verantwortlich ist. Der letzte Punkt ist zwar etwas hässlich, aber so ist es für meinen Geschmack deutlich übersichtlicher.
hexdumpq schrieb: > 3. Zeiger der Funktion übergeben Eigentlich brauchst du nur die Zeiger-Verwaltung und musst logisch mit der Tatsache fertigwerden, dass du den Speicher in der Funktion reservierst und später woanders freigibst. Kein problem, du darfst es nur nicht vergessen. Ein anderes Problem: du musst ja die Grösse des Arrays kennen, um zuzugreifen, also musst du nicht nur den Zeiger, sondern auch die maximalen Koordinaten an das Hauptprogamm übermitteln - das ist bei deiner Überlegung noch nicht vorgesehen. Georg
georg schrieb: > nicht nur den Zeiger, > sondern auch die maximalen Koordinaten Man könnte das als Bild-Objekt zusammen kapseln in einem struct mit Datenpointer und Dimensionen.
Oder du packst alle Funktionen die irgendwas mit dem Bild tun in deiner Library, dann braucht das Hauptprogramm auch keine Zeiger, sondern ruft nur Funktionen deiner Library auf. z.B:
1 | int main() |
2 | {
|
3 | tiff_read_file("meinbild.tiff"); |
4 | int w = tiff_image_width(); |
5 | int nblack = tiff_count_pixels_rgb(0, 0, 0); // R, G, B |
6 | tiff_close(); // gibt speicher frei |
7 | printf("Das Bild ist %d Pixel breit und hat %d schwarze Pixel\n", |
8 | w, nblack); |
9 | |
10 | return 0; |
11 | }
|
Eric B. schrieb: > tiff_close(); Das ist der springende Punkt. Man benutzt eine Schnittstelle die eine Funktion hat die das Objekt bereitstellt und eine Funktion um das Objekt wieder freizugeben. Analog zu einem Datenbank oder file open/close.
Du solltest ein Objekt anlegen, was die load-Funktion erzeugt (Return oder Output-Parameter) und mit dem andere Funktionen (zb Bildzugriff) arbeiten und was am Ende eine free-Funktion sauber abräumt Designe deine Lib so, dass du auch mehrere Bilder öffnen kannst, also auf Sauereien wie static verzichten.
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.