Struct in Funktion übergeben < Algorithmen < Schule < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 18:59 Fr 12.03.2010 | Autor: | qsxqsx |
Hi,
Ich mächte gerne den abstand mit einer Funktion distance berechnen, die zwei Punkte in Form eines structs erhält. Ich hab natürlich danach gegoogelt, trotzdem geht das Programm hier nicht:
#include <iostream>
#include <math.h>
using namespace std;
int main(){
struct Point{
double x;
double y;
} r,t;
r.x = 5;
r.y = 5;
t.x = 0;
t.y = 0;
double l = double distance(& r, & t);
cout << l;
system("PAUSE");
return 0;
}
double distance(const r * w,const t * q){
double xx = w.x - q.x;
double yy = w.y - q.y;
return sqrt( (double) xx*xx + yy*yy);
}
Es wäre sehr nett wenn jemand schnell drübergukt. Es heisst unter anderem w und q seien nicht deklarierte bezeichner. Aber wie deklarier ich die denn? Die sind doch vom Typ r bzw. t?
Gruss
|
|
|
|
> Hi,
>
> Ich mächte gerne den abstand mit einer Funktion distance
> berechnen, die zwei Punkte in Form eines structs erhält.
> Ich hab natürlich danach gegoogelt, trotzdem geht das
> Programm hier nicht:
>
>
> #include <iostream>
> #include <math.h>
>
> using namespace std;
>
> int main(){
>
> struct Point{
> double x;
> double y;
> } r,t;
>
> r.x = 5;
> r.y = 5;
>
> t.x = 0;
> t.y = 0;
>
>
>
> double l = double distance(& r, & t);
>
> cout << l;
>
> system("PAUSE");
>
> return 0;
> }
>
> double distance(const r * w,const t * q){
>
> double xx = w.x - q.x;
> double yy = w.y - q.y;
>
> return sqrt( (double) xx*xx + yy*yy);
> }
hmm, also erstens würde ich ja float distance nehmen, denn die Wurzel aus [...] wird in den seltensten Fällen ganzzahlig sein oder? Zweitens übergibst du der Funktion 'distance' keine Daten vom Typ 'Point' sondern...? Der Compiler weiss nun nicht was w.x und w.y bzw. q.x und q.y sein sollen (übergeben wurde der Typ const)
>
> Es wäre sehr nett wenn jemand schnell drübergukt. Es
> heisst unter anderem w und q seien nicht deklarierte
> bezeichner. Aber wie deklarier ich die denn? Die sind doch
> vom Typ r bzw. t?
>
> Gruss
>
Gruss zurück
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 21:35 Fr 12.03.2010 | Autor: | qsxqsx |
Thx!
Also mir selber ist mal aufgefallen, dass ich die Funktion vorher noch hätte deklarieren sollen:
double double distance(const double * w,const double *p);
Ob float oder double ist doch egal, nich???
Ja also ich habs jetzt (wie man in der obigen Funktionsdeklaration sieht) mit dem Typ double deklariert.
Ja wieso weiss das denn der Compiler nicht was da übergeben wurde?
Sorry für die Fragen ich hab eben keine Lösung zu der Aufgabe weil ich sie mir selbst ausgedacht habe (struct an Funktion weitergeben). Ich hab auch schon im Internet ein Beispiel gesehen da wurde der Funktion 'distance' der Typ Point übergeben! Trotzdem, es gelingt mir nicht
das von dem Beispiel im Internet abzuleiten.
Ich hab jetzt noch eine Art von Compilierfehler:
"Links von ".x" muss sich eine Klasse/Struktur/Union befinden."
- Ich lese und verstehe das wie Hyroglyphen.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:19 Sa 13.03.2010 | Autor: | qsxqsx |
Also vielleicht ist das blöd wennich da meine Compilierfehler aufliste...vergesst das Beispiel.
Aber allgemein, wie geb ich ein struct als Parameter in eine Funktion weiter?
Ich hab soviele kombinatorische Möglichkeiten(& , *, double, ...) probiert aber scheitere...
Gruss
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 20:58 Sa 13.03.2010 | Autor: | rainerS |
Hallo!
> Also vielleicht ist das blöd wennich da meine
> Compilierfehler aufliste...vergesst das Beispiel.
>
> Aber allgemein, wie geb ich ein struct als Parameter in
> eine Funktion weiter?
> Ich hab soviele kombinatorische Möglichkeiten(& , *,
> double, ...) probiert aber scheitere...
In keinem dieser Fälle übergibst du eine Klasse als Parameter.
So etwa muss das aussehen (distance umbenannt, um Durcheinander mit der Funktion aus der STDLIB zu vermeiden):
1: | #include <iostream>
| 2: | #include <math.h>
| 3: |
| 4: | using namespace std;
| 5: |
| 6: | //Deklariere Point außerhalb von main, damit die Deklaration für distance sichtbar ist
| 7: | struct Point{
| 8: | double x;
| 9: | double y;
| 10: | } r,t;
| 11: |
| 12: | // Deklaration von distnce VOR Benutzung
| 13: | double distnce(Point& w, Point& q);
| 14: |
| 15: | int main(){
| 16: |
| 17: |
| 18: | r.x = 5;
| 19: | r.y = 5;
| 20: |
| 21: | t.x = 0;
| 22: | t.y = 0;
| 23: |
| 24: |
| 25: |
| 26: | double l = distnce( r, t);
| 27: |
| 28: | cout << l;
| 29: |
| 30: | system("PAUSE");
| 31: |
| 32: | return 0;
| 33: | }
| 34: |
| 35: | double distnce(Point& w, Point& q){
| 36: |
| 37: | double xx = w.x - q.x;
| 38: | double yy = w.y - q.y;
| 39: |
| 40: | return sqrt( xx*xx + yy*yy);
| 41: | } |
Viele Grüße
Rainer
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 23:42 Sa 13.03.2010 | Autor: | qsxqsx |
Hi Rainer!
Danke für die Mühe!
Also dein Programm Funktioniert jedenfalls. Doch habe ich noch eine ungewissheit. In deiner Mitteilung hast du mir diese Funktion empfohlen:
double distance(const struct Point * w,const struct Point *p);
In deinem kompletten Programm hast du eine andere Art von Funktion. Ist die in der ersten Mitteilung von dir versehentlich jetzt falsch? Weil wenn ich es mit der obigen Art mache geht es nicht.
Übrigens: Unter meinen "Kombinatorischen Versuchen" hab ich es auch mit "->" versucht und auch mit "const Point w" "const struct Point w" "struct *w"...usw. ich habe wirklich alles versucht, doch hat sich jedes mal die Anzahl der Compilierfehler relativ constant gehalten...wie auch immer...danke und ein schönes Wochenede noch.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 08:27 So 14.03.2010 | Autor: | rainerS |
Hallo!
> Hi Rainer!
>
> Danke für die Mühe!
>
> Also dein Programm Funktioniert jedenfalls. Doch habe ich
> noch eine ungewissheit. In deiner Mitteilung hast du mir
> diese Funktion empfohlen:
>
> double distance(const struct Point * w,const struct Point *p);
>
> In deinem kompletten Programm hast du eine andere Art von
> Funktion. Ist die in der ersten Mitteilung von dir
> versehentlich jetzt falsch? Weil wenn ich es mit der obigen
> Art mache geht es nicht.
Das geht ganz genauso. Nur übergibst du dann Zeiger auf die Objekte, also muss in deinem Aufruf
double l = distnce( &r, &t);
stehen und die Funktion
1: | double distnce(const struct Point *w, const struct Point *q){
| 2: |
| 3: | double xx = w->x - q->x;
| 4: | double yy = w->y - q->y;
| 5: |
| 6: | return sqrt( xx*xx + yy*yy);
| 7: | } |
lauten. Denn w und q sind jetzt Zeiger, also vom Typ Point*, das heisst *w und *q sind vom Typ Point.
Viele Grüße
Rainer
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 20:35 Sa 13.03.2010 | Autor: | rainerS |
Hallo!
> Thx!
>
> Also mir selber ist mal aufgefallen, dass ich die Funktion
> vorher noch hätte deklarieren sollen:
>
> double double distance(const double * w,const double *p);
>
> Ob float oder double ist doch egal, nich???
"double" hat höhere Genauigkeit.
>
> Ja also ich habs jetzt (wie man in der obigen
> Funktionsdeklaration sieht) mit dem Typ double deklariert.
>
> Ja wieso weiss das denn der Compiler nicht was da
> übergeben wurde?
Der Compiler weiss gar nichts, was du ihm nicht ordentlich deklarierst.
Das kann ja nun überhaupt nicht funktionieren, denn
1. Was soll denn der Rückgabetyp "double double" sein, und
2. Deine Punkte sind vom Typ "struct Point", nicht "double".
Also:
double distance(const struct Point * w,const struct Point *p);
>
>
>
> Sorry für die Fragen ich hab eben keine Lösung zu der
> Aufgabe weil ich sie mir selbst ausgedacht habe (struct an
> Funktion weitergeben). Ich hab auch schon im Internet ein
> Beispiel gesehen da wurde der Funktion 'distance' der Typ
> Point übergeben! Trotzdem, es gelingt mir nicht
> das von dem Beispiel im Internet abzuleiten.
>
> Ich hab jetzt noch eine Art von Compilierfehler:
> "Links von ".x" muss sich eine Klasse/Struktur/Union
> befinden."
double ist keine Struct, daher bemängelt der Compiler die Anwendung des Operators ".". Den kannst du sowieso nicht nehmen, weil du keine struct Point übergibst, sondern einen Zeiger darauf. Da musst du "->" verwenden.
Viele Grüße
Rainer
|
|
|
|