[gelöst] Pointer oder rohes Fleisch?
-
Hi,
ich bin noch C Anfänger habe aber etwas mit Java programmiert. Daher bin ich es natürlich gewöhnt so gut wie immer einen Pointer (also eine Referenz, die per value übergeben wird) vor mir zu haben
Nun frage ich mich bei C oft: Stellst du ein neues Strukt mit Methoden zur Speicherallokation a là "newPoint", die Pointer auf die Struktur zurückgeben, und mit "delete" Methoden zur Speicherfreigabe zur Verfügung. Oder schreibe ich einfach nur eine Struktur "Point" und gut ist. Hier mal das Beispiel:
typedef struct {
int x;
int y;
} Point;Sollte man nun also mit einem Pointer auf einen solchen Point arbeiten (und damit ja quasi mit einer Art Objekt wie in Java) oder arbeite ich mit dem rohen Strukt und schmeise es auch als Argument weg usw., weil es ja eh nur so klein ist?
Eure Meinung würde mich interessieren!
-
Bit2_Gosu schrieb:
Sollte man nun also mit einem Pointer auf einen solchen Point arbeiten (und damit ja quasi mit einer Art Objekt wie in Java) oder arbeite ich mit dem rohen Strukt
Das "rohe" Ding muss es ja irgendwo geben, damit man einen sinnvollen Zeiger darauf anlegen kann. Bleibt die Frage, was du vorhast.
Bit2_Gosu schrieb:
schmeise es auch als Argument weg usw., weil es ja eh nur so klein ist?
Funktionsargumente. Einen so kleinen Typ wie deine Struktur aus zwei int's per value zu übergeben, wird wohl nicht viel ausmachen. Ein Zeiger ist wahrscheinlich trotzdem kleiner. Was ist "usw"?
Bit2_Gosu schrieb:
Stellst du ein neues Strukt mit Methoden zur Speicherallokation a là "newPoint", die Pointer auf die Struktur zurückgeben, und mit "delete" Methoden zur Speicherfreigabe zur Verfügung. Oder schreibe ich einfach nur eine Struktur "Point" und gut ist.
So wie ich die Frage verstehe, geht's da weniger um Zeiger, sondern um Vor- und Nachteile objektorierter Ansätze, und ob man die in C einsetzen sollte. Darüber kann man trefflich streiten. Wenn du was konkreteres lieferst, wird das sicher nicht zu verhindern sein.
-
da gibt es keine global gültige lösung, das ist wie fast immer in c alles hängt davon ab was du machen willst. nehmen wir mal als beispiel eine c function dieser function willst jetzt eine structur als parameter übergeben also einmal so
void func(Point xy){} oder void func(Point *xy){}
das ist natürlich auch wieder von der plattform (anzahl an register usw.) abhängig aber grundsätzlich sollte man so kleine structuren nicht als pointer übergeben, anders wäre es wenn deine structur 1mb hat und du willst nur auf 3 kleine werte zugreigen na dann übergeb ich doch natürlich den zeiger und greif dann darauf zu statt das mb da mit zu schleppen
-
µngbd schrieb:
So wie ich die Frage verstehe, geht's da weniger um Zeiger, sondern um Vor- und Nachteile objektorierter Ansätze, und ob man die in C einsetzen sollte.
also ein constructor und destructor macht doch keine oop aus ich denke da eher an polymorphismus und vererbbarkeit das ist für mich oop
-
noobLolo schrieb:
also ein constructor und destructor macht doch keine oop aus ich denke da eher an polymorphismus und vererbbarkeit das ist für mich oop
Es geht schon los.
noobLolo schrieb:
grundsätzlich sollte man so kleine structuren nicht als pointer übergeben
Den Fall, dass wir eine Struktur des Aufrufers verändern wollen, haben wir ja ausgeklammert. Trotzdem bin ich nicht sicher, ob man das so allgemein sagen kann. Einem Zeiger nachlaufen kostet was, aber das Kopieren einer Struktur kostet auch was. Ich fürchte, man muss sich das im Einzelfall überlegen.
-
Bit2_Gosu schrieb:
Nun frage ich mich bei C oft: Stellst du ein neues Strukt mit Methoden zur Speicherallokation a là "newPoint", die Pointer auf die Struktur zurückgeben, und mit "delete" Methoden zur Speicherfreigabe zur Verfügung. Oder schreibe ich einfach nur eine Struktur "Point" und gut ist.
Sowas wie newPoint und deletePoint kannst du bauen wenn du es unbedingt brauchst, aber das ist nur sinnvoll wenn es auch irgendwas tiefsinniges tut.
Im Allgemeinen reicht sowas hier:Point p = {5, 7};
Fertig ist der Punkt.
Oder auch sowas:Point *p = malloc(*p); p->x = 5; p->y = 7; ... free(p);
"Methoden" die Strukturen bauen und löschen sind nur sinnvoll, wenn sie was tiefsinniges tun. Zum Beispiel eine Struktur die ein Fenster beschreibt. newFenster wird dann nicht nur Speicher besorgen, sondern auch einen Haufen Kram machen der dafür sorgt dass auch ein Fenster zu sehen ist, während deleteFenster nicht nur den Speicher der Struktur freigibt, sondern auch das Fenster zumacht und eventuell alle Objekte die da so dranhängen (Menüs, Felder, Unterfenster usw.) mit verschwinden lässt.
Aber meistens reicht es einfach die Struktur zu deklarieren ohne Konstruktoren und Destruktoren.Bit2_Gosu schrieb:
Sollte man nun also mit einem Pointer auf einen solchen Point arbeiten (und damit ja quasi mit einer Art Objekt wie in Java) oder arbeite ich mit dem rohen Strukt und schmeise es auch als Argument weg usw., weil es ja eh nur so klein ist?
Im Allgemeinen solltest du Pointer nehmen, weil du immer nur Parameterkopien kriegst.
Zum Beispiel sowas hier:void reverse1(Point p){ int temp = p.x; p.x = p.y; p.y = temp; } void reverse2(Point *p){ int temp = p->x; p->x = p->y; p->y = temp; } int main(){ Point p = {5, 7}; printf("Punkt: (%d, %d)\n", p.x, p.y); reverse1(p); printf("Punkt: (%d, %d)\n", p.x, p.y); reverse2(&p); printf("Punkt: (%d, %d)\n", p.x, p.y); }
reverse1 tut effektiv nichts weil der übergebene Parameter eine Kopie ist die bearbeitet wird, aber der originale Punkt p in main verändert sich nicht. reverse2 funktioniert wie erwartet. Deshalb benutze ich eigentlich immer Pointer.
Die paar Mikrosekunden mehr oder weniger merkt eh keiner, und wenn sie doch wichtig werden kannst du sowas hinterher immernoch optimieren.
-
nwp2 schrieb:
reverse1 tut effektiv nichts weil der übergebene Parameter eine Kopie ist die bearbeitet wird...
du könntest p wieder zurückgeben, dann sollte es funzen.