Forum: PC-Programmierung Speicherreserierung in Unterfunktion, wie bewerkstelligen?


von hexdumpq (Gast)


Lesenswert?

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.

von Tom (Gast)


Lesenswert?

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.

von georg (Gast)


Lesenswert?

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

von Tom (Gast)


Lesenswert?

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.

von Eric B. (beric)


Lesenswert?

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
}

von Der Andere (Gast)


Lesenswert?

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.

von Vlad T. (vlad_tepesch)


Lesenswert?

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
Noch kein Account? Hier anmelden.