Pointer als Rückgabewert einer Funktion
-
Haloelite2 schrieb:
Klar, das Feld brauche ich gar nicht, da in main() eines angelegt ist.
Nein. Das Feld brauchst Du gar nicht, weil Du es einfach nicht brauchst ...
Wo ist denn in main eines angelegt?Edit:
Ach ja, natürlich solltest Du - wie in der Aufgabe verlangt - die Feldelemente in Deiner Funktion auch (mit 0) initialisieren!
-
In Ordnung, dann mal vielen Dank, an alle die geholfen haben.
ich denke, ich habe es wenigstens vom Prinzip her verstanden.
-
for ( i=0; i < 10; i++) printf("(%f,%f)\n", q[i].x, q[i].y);
Stimmt, mit q[i].x, bzw. q[i].y sind ja Speicherstellen (soweit ich weiß) gemeint.
Schon peinlich.
-
coder777 schrieb:
return (coordinate_t*)calloc(sizeof(coordinate_t) * n); // Wichtig: * n und (coordinate_t*)
Das ist falsch!#
calloc erwartet zwei Paramter
malloc erwartet einen Paramterhttp://www.cplusplus.com/reference/cstdlib/calloc/
http://www.cplusplus.com/reference/cstdlib/malloc/
-
Schreib Dir eine Funktion für das "initialisieren" solcher Felder und eine für die Ausgabe.
// Weist den ersten n coordinate_t Objekten im Array base die Werte x und y zu void coordinate_init(coordinate_t *base, int n, float x, float y); // Gibt die ersten n coordinate_t Objekte im Array base nach stdout aus. void coordinate_print(const coordinate *base, int n);
Vergiss nicht den Rückgabewert von
getCoordinateArray()
inmain()
zu testen. Eventuell konnte nicht genügend Speicher alloziert werden undmalloc()
gibtNULL
zurück.
Überleg Dir auch, zu überprüfen ob der Parameter n in irgendeiner der Funktionen negativ ist - das wäre wohl ein Fehler vom Aufrufer.
-
Also in meinem Fall malloc benutzen?
-
Haloelite2 schrieb:
Also in meinem Fall malloc benutzen?
Ich habe nur an den Lerneffekt gedacht.
Die
calloc()
Lösung funktioniert übrigens nur, wenn die 0 alsfloat
wirklich kein Bit gesetzt hat. Das ist wohl bei so ziemlich jedem System der Fall - aber 100% ist es nicht.
Du kannst das natürlich testen...blabla... Aber warum?! Nimmmalloc()
und initialisier selber.#if __STDC_IEC_559__==1 #define getCoordinateArray(x) calloc((x),sizeof(coordinate_t)) #else coordinate_t *getCoordinateArray(int n) { coordinate_t *result = malloc(n*sizeof(coordinate_t)); if(result) coordinate_init(result, n, 0.f, 0.f); return result; } #endif
-
Okay, diese Zeile verstehe ich nicht:
f(result) coordinate_init(result, n, 0.f, 0.f);
-
Haloelite2 schrieb:
Okay, diese Zeile verstehe ich nicht:
if(result) coordinate_init(result, n, 0.f, 0.f);
Na: das ist halt ein Aufruf von der Funktion, die ich Dir vorschlug, dass Du Sie noch implementierst.
Und ich prüfe
result
vor dem Aufruf aufNULL
- fallsmalloc()
wirklich keinen Speicher klarmachen konnte.
-
Ich soll lediglich (Aufgabenstellung) die gegebene Funktion vervollständigen.
Außerdem verstehe ich auch noch nicht, wie ich die Werte des array (Es ist doch keines deklariert) auf 0 setzen soll.
Außerdem bekomme ich als Ausgabe ohnehin nur Nullen angezeigt, von daher sollte es schon mit 0 belegt sein, oder?
-
coordinate_t * getCoordinateArray (int n) { coordinate_t* p = malloc( n * sizeof(*p) ); if( p!=NULL ) while( n-- ) p[n].x = p[n].y = 0; return p; }
Und was war jetzt so schlimm daran?
Du hast im Unterricht nicht aufgepasst (als malloc dran war) und auch sonst nicht.
-
Haloelite2 schrieb:
Außerdem verstehe ich auch noch nicht, wie ich die Werte des array (Es ist doch keines deklariert) auf 0 setzen soll.
Du bekommst von
malloc
eine Adresse auf einen Speicherbereich geliefert.
Diesen Speicher kannst du wie ein Array benutzen.Da du die Größe während der Laufzeit des Programms festlegen kannst, läuft das unter dem Begriff Dynamischer Speicher.
Haloelite2 schrieb:
Außerdem bekomme ich als Ausgabe ohnehin nur Nullen angezeigt, von daher sollte es schon mit 0 belegt sein, oder?
Nein. Das ist Zufall.
-
Haloelite2 schrieb:
Ich soll lediglich (Aufgabenstellung) die gegebene Funktion vervollständigen.
Dann wäre es natürlich schädlich noch ein oder zwei weitere Funktionen zu schreiben!
Aber im Ernst: war nur zur Übung gedacht. Bekanntlich führen 1000 Wege nach Rom.
-
Das Problem ist nicht, dass ich nicht aufgepasst habe, sondern, dass wir erst eine Vorlesung hatten, in der malloc angeschnitte wurde.
Aber danke für die Vorschläge und Beispiele.
-
haloelite2 schrieb:
Aber danke für die Vorschläge und Beispiele.
Jo! Gerne!
Dies war - glaube ich - ein recht erquicklicher thread.
-
Da glaubst du richtig.