Funktion mit Zeiger
-
_matze schrieb:
Abgesehen davon solltest du eher einen Zeiger auf die Struktur (nicht die einzelnen Elemente) an deine Funktion übergeben.
Hm wie meinst du das? Kann ich durch einen Zeiger über t.winkel direkt die Struktur ansprechen?
Also mit dem scanf hast du Recht. Wurde dann vorhin mit dem Befehl:
scanf("%d",&winkel);
Gar nichts zugewießen oder wurde der Eingegebene wert als Adresse für den Zeiger gespeichert?
-
Nein, aber so geht es:
void EingabeTrager (Trager *pt) { printf("Position:"); scanf("%d",&pt->position); printf("\nWinkel:"); scanf("%d",&pt->winkel); printf("\nLange:"); scanf("%d",&pt->lange); }
Ein Zeiger auf die Struktur...
-
_matze schrieb:
Nein, aber so geht es:
void EingabeTrager (Trager *pt) { printf("Position:"); scanf("%d",&pt->position); printf("\nWinkel:"); scanf("%d",&pt->winkel); printf("\nLange:"); scanf("%d",&pt->lange); }
Ein Zeiger auf die Struktur...
Dankeschön
Und im Main kann ich dann über printf(,t.position) auf diese Variablen zurückgreifen?
Was ist dann im Aufgabentext mit der Passage "... die muss eine Variable des Typs "Träger" bekommen welche über einen Zeiger übermittelt wird." gemeint, das was du mir hier gschreiben hast?
Zitat von oben was ich noch fragen wollte:
Also mit dem scanf hast du Recht. Wurde dann vorhin mit dem Befehl:
scanf("%d",&winkel);
Gar nichts zugewießen oder wurde der Eingegebene wert als Adresse für den Zeiger gespeichert?
-
blacklights schrieb:
Und im Main kann ich dann über printf(,t.position) auf diese Variablen zurückgreifen?
Klar, solange du auch noch einen Formatstring angibst...
In der main ändert sich ja nix, sondern nur in der Funktion (und beim Aufruf, da musst du halt die Adresse der Struktur übergeben).
blacklights schrieb:
Was ist dann im Aufgabentext mit der Passage "... die muss eine Variable des Typs "Träger" bekommen welche über einen Zeiger übermittelt wird." gemeint, das was du mir hier gschreiben hast?
Ja, würde ich sagen. Ist aber schon dämlich formuliert...
blacklights schrieb:
Also mit dem scanf hast du Recht. Wurde dann vorhin mit dem Befehl:
scanf("%d",&winkel);
Gar nichts zugewießen oder wurde der Eingegebene wert als Adresse für den Zeiger gespeichert?
Da wirst du wohl an die Stelle im Speicher geschrieben haben, an der die Adresse vom Zeiger auf winkel steht...
-
_matze schrieb:
blacklights schrieb:
Und im Main kann ich dann über printf(,t.position) auf diese Variablen zurückgreifen?
Klar, solange du auch noch einen Formatstring angibst...
In der main ändert sich ja nix, sondern nur in der Funktion (und beim Aufruf, da musst du halt die Adresse der Struktur übergeben).
Alles klar
blacklights schrieb:
Was ist dann im Aufgabentext mit der Passage "... die muss eine Variable des Typs "Träger" bekommen welche über einen Zeiger übermittelt wird." gemeint, das was du mir hier gschreiben hast?
Ja, würde ich sagen. Ist aber schon dämlich formuliert...
Das liegt wahrscheinlich daran, dass ich das ganze aus dem Ital. übersetzt habe, aber keine Angst, da hat es gleich dämlich gkelungen...
_matze schrieb:
blacklights schrieb:
Also mit dem scanf hast du Recht. Wurde dann vorhin mit dem Befehl:
scanf("%d",&winkel);
Gar nichts zugewießen oder wurde der Eingegebene wert als Adresse für den Zeiger gespeichert?
Da wirst du wohl an die Stelle im Speicher geschrieben haben, an der die Adresse vom Zeiger auf winkel steht...
Hm deshalb auch diese spektakulären Zahlen beim Ergebnis
Eine Frage stellt sich mir noch, kann man diesen Part hier auch anders umschreiben:
void EingabeTrager (Trager *pt) { printf("Position:"); scanf("%d",&pt->position); printf("\nWinkel:"); scanf("%d",&pt->winkel); printf("\nLange:"); scanf("%d",&pt->lange); }
Denn so eine Schreibweise habe ich ehrlich gesagt noch nie gesehen.
Ums mal für mich zu erklären:
void EingabeTrager (Trager *pt) = void FUNKTIONSNAME (variable?) in diesem Fall wird Trager als eine Struktur verwendet und nach dem "Trager" ein Pointer *pt eingeführt, oder? Dieser Pointer kann darch durch die Sturktur von "Trager" auf die verschiedenen variablen hingewiesen werden durch &pt->lange?! ist das soweit richtig?
-
Genau wie du selbst schon Adressen von int-Variablen an die Funktion übergeben hast, übergibst du jetzt halt einfach die Adresse des structs. Ist erstmal kein Unterschied. Da du dann in der Funktion keine Kopie der Struktur, sondern einen Zeiger hast, musst du diesen erst dereferenzieren (also auf die Adresse zeigen), um darauf (und damit auf die Member) zugreifen zu können. Das ginge normalerweise so:
//statt pt.winkel bei einem Zeiger: (*pt).winkel //und wenn du einen Zeiger auf winkel brauchst (wie bei scanf): &((*pt).winkel)
Und um diese umständliche Syntax zu umgehen, gibt es den Operator ->, mit dem du direkt dereferenzieren und auf Member zeigen kannst:
pt->winkel //und wenn du einen Zeiger auf winkel brauchst (Klammern sind in diesem Fall nicht notwendig aufgrund der Operatorenrangfolge): &pt->winkel
-
Ich habs jetzt nochmal versucht, nur der Compiler meldet mir irgendwie einen Fehler:
#include <stdio.h> #include <stdlib.h> typedef struct { int last; int lange; } Trager; void EingabeTrager (Trager *pt) { } int main(int argc, char *argv[]) { int *pt; 18 => EingabeTrager (Trager *pt); printf("\n"); 22 => printf("Last: %d",pt->last); system("PAUSE"); return 0; } void EingabeTrager (Trager *pt) { printf("Last:"); scanf("%d",&pt->last); printf("\nLange:"); scanf("%d",&pt->lange); }
Fehler:
18 main.c syntax error before "Trager"
22 main.c request for member `last' in something not a structure or unionIch bin mir mit der Zeile 18 eben nicht sicher, im Main muss die Funktion ja aufgerufen werden, oder?
Funktionsname(?) - was schreibe ich denn dort in Klammern? Genau das Selbe wie neben dem "void" steht - also: EingabeTrager (Trager *pt) ?lg und danke dir matze
-
fast! so musst du es machen:
#include <stdio.h> #include <stdlib.h> typedef struct { int last; int lange; } Trager; #define OMG(x) ((int)&(((Trager*)0)->x)) void EingabeTrager (int pt, int p); int main(int argc, char *argv[]) { Trager pt; EingabeTrager ((int)&pt, OMG(last)); printf("Last: %d",pt.last); system("PAUSE"); return 0; } void EingabeTrager (int pt, int p) { printf("Last:"); scanf("%d",((int*)(pt + p))); }
-
#include <stdio.h> #include <stdlib.h> typedef struct { int last; int lange; } Trager; void EingabeTrager (Trager *pt) //was ist das hier? Du hast 2 Implementationen dieser Funktion! Statt der geschweiften Klammern schließe den Prototypen lieber ab mit einem Semikolon... { } int main(int argc, char *argv[]) { int *pt; //du willst doch keinen int-Pointer, sondern ein Objekt vom Typ Trager. Lass es einfach so, wie es vorher war... 18 => EingabeTrager (Trager *pt); //du musst hier die Adresse von deiner Trager-Variable übergeben (Adress-Operator: "&"). printf("\n"); 22 => printf("Last: %d",pt->last); //nimm, wie gesagt, deine bisherige Trager-Variable und mache es ganz normal mit dem Punkt... system("PAUSE"); return 0; } void EingabeTrager (Trager *pt) { printf("Last:"); scanf("%d",&pt->last); printf("\nLange:"); scanf("%d",&pt->lange); }
-
Soo jetzt hab ichs, danke:
#include <stdio.h> #include <stdlib.h> typedef struct { int last; int lange; } Trager; void EingabeTrager (Trager *pt); int main(int argc, char *argv[]) { Trager t; EingabeTrager (&t); printf("\n"); printf("Carico: %d",t.last); system("PAUSE"); return 0; } void EingabeTrager (Trager *pt) { printf("Last:"); scanf("%d",&pt->last); printf("\nLange:"); scanf("%d",&pt->lange); }
Wenn ich nicht lästig werde würde ich noch gerne fragen, was eigentlich falsch läuft, wenn ich das Objekt "t" im main nicht durch Trager t; inizialisiere, sondern direkt mit der Sturktur Trager arbeite, also ich meine so:
#include <stdio.h> #include <stdlib.h> typedef struct { int last; int lange; } Trager; void EingabeTrager (Trager *pt); int main(int argc, char *argv[]) { EingabeTrager (&Trager); printf("\n"); printf("Carico: %d",Trager.last); system("PAUSE"); return 0; } void EingabeTrager (Trager *pt) { printf("Last:"); scanf("%d",&pt->last); printf("\nLange:"); scanf("%d",&pt->lange); }
Ich nehme mal an das funktioniert nicht, da "Trager" nur eine Sturktur ist und ich einem Objekt zuerst die Sturktur zuweisen muss, bevor ich mit der Sturktur arbeiten kann, oder?