ollowain86
Anmeldungsdatum: 2. Mai 2014
Beiträge: 46
|
Hallo, ich schreibe ein Programm in dem sich 3 Punkte in einem 3d-Koordinatensystem befinden. Was ich ausrechnen will ist der Abstand zum Koordinatenursprung. Ich fasse die Werte x-Werte, y-Werte, z-Werte in Arrays zusammen.
| double x[3]={1,2,3};
double y[3]={1,2,3};
double z[3]={1,2,3};
|
Ich will den Abstand zum Koordinatenursprung in einer Funktion ausrechnen, also: | for(int i=0; i<3; i++)
{
abstand(3,x[i],y[i],z[i]);
}
|
Und rechne es in meiner Funktion aus:
| double abstand(int anzahl, double &x, double &y, double &z)
{
double d;
d = sqrt(pow(x,2)+pow(y,2)+pow(z,2));
cout << d << endl;
return d;
}
|
Es kommen die richtigen Ergebnisse raus. Aber wie übergebe ich die richtig an die Main-Funktion? Wenn ich es folgendermaßen übergebe, funktioniert es nicht: | for(int i=0; i<3; i++)
{
d[i] = abstand(int anzahl, double &x, double &y, double &z);
}
|
Habt ihr eine Idee? lg Ollowain
|
sebix
Moderator, Webteam
Anmeldungsdatum: 14. April 2009
Beiträge: 5323
|
Warum willst du hier ueberhaupt Referenzen statt Werte uebergeben, es handelt sich doch um einfache doubles, keine Arrays? Wenn du alle 3 Werte gleichzeitig uebergeben moechtest macht es Sinn. Hier eine funktionierende Version: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 | #include <iostream>
#include <math.h>
using namespace std;
double abstand(double x, double y, double z)
{
double d;
d = sqrt(pow(x,2)+pow(y,2)+pow(z,2));
cout << d << endl;
return d;
}
int main()
{
double x[3]={1,2,3};
double y[3]={1,2,3};
double z[3]={1,2,3};
double d[3] = {0, 0, 0};
for(int i=0; i<3; i++)
{
d[i] = abstand(x[i], y[i], z[i]);
}
return 0;
}
|
Wenn du Referenzen uebergibst, sieht das das bspw. so aus: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 | #include <iostream>
#include <math.h>
using namespace std;
double abstand(double *x, double *y, double *z)
{
double d;
d = sqrt(pow(*x,2)+pow(*y,2)+pow(*z,2));
cout << d << endl;
return d;
}
int main()
{
double x[3]={1,2,3};
double y[3]={1,2,3};
double z[3]={1,2,3};
double d[3] = {0, 0, 0};
for(int i=0; i<3; i++)
{
d[i] = abstand(&x[i], &y[i], &z[i]);
}
return 0;
}
|
Also die Referenz mit &variable erzeugen und mit typ *variable wieder aufloesen.
|
ollowain86
(Themenstarter)
Anmeldungsdatum: 2. Mai 2014
Beiträge: 46
|
Hi sebix, ich hab das ja schon hingekriegt, dass ich die Werte an eine Funktion übergeben habe.
Die rechnet mir dann den Abstand aus, das passt auch alles. Aber ich will die Werte an meine Main an ein array übergeben. Der erste Punkt ist bei {1,1,1}, das bed. der Abstand zum Ursprung ist d=sqrt(3). Das wird an die Main returned.
Beim zweiten kommt d=sqrt(12) raus.
Beim dritten kommt d=sqrt(27) raus. Diese drei Werte sollen an ein array übergeben werden. Meine Idee war: | for(int i=0; i<3; i++)
{
d[i] = abstand(...);
}
|
Aber das funktioniert nicht. lg Ollowain
|
sebix
Moderator, Webteam
Anmeldungsdatum: 14. April 2009
Beiträge: 5323
|
ollowain86 schrieb: ich hab das ja schon hingekriegt, dass ich die Werte an eine Funktion übergeben habe.
Die rechnet mir dann den Abstand aus, das passt auch alles. Aber ich will die Werte an meine Main an ein array übergeben.
Genau das macht der zweite von mir gepostete Code.
Aber das funktioniert nicht.
Mehr Details, sowie der gesamte von dir verwendete Code waeren hilfreich.
|
ollowain86
(Themenstarter)
Anmeldungsdatum: 2. Mai 2014
Beiträge: 46
|
Jo hier der Code: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 | #include <iostream>
#include <cmath>
using namespace std;
double Abstand(int anzahl, double &x, double &y, double &z)
{
double d;
d = sqrt(pow(x,2)+pow(y,2)+pow(z,2));
cout << d << endl;
return d; //das geht nun zurück an die Main
}
int main()
{
double x[3]={1,2,3};
double y[3]={1,2,3};
double z[3]={1,2,3};
for(int i=0; i<3; i++)
{
Abstand(3,x[i],y[i],z[i]);
}
//es kommen drei Werte aus der Zeile 11, die sollen an ein array mit drei Elementen übergeben werden
//meine Idee wär das unten Folgende
for(int i=0; i<3; i++)
{
double r[i] = Abstand(3,x[i],y[i],z[i]);
cout << r[i] << endl;
}
}
|
lg Ollowain
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
ollowain86 schrieb: | 11, die sollen an ein array mit drei Elementen übergeben werden
//meine Idee wär das unten Folgende
for(int i=0; i<3; i++)
{
double r[i] = Abstand(3,x[i],y[i],z[i]);
cout << r[i] << endl;
}
}
|
In der For-Schleife deklarierst Du erst 'double r[i]', und zwar zuerst mit i=0 - was mag das wohl geben? - dann mit r[1] und schließlich 2. So wird dem Bezeichner 3x etwas ähnliches, aber jeweils neues zugewiesen, das vorherige r ist dabei futsch. Meine C++-Zeiten liegen etwas zurück, aber ich meine so müsste es gehen:
| double r[3];
for(int i=0; i<3; i++)
{
r[i] = Abstand(3, x[i], y[i], z[i]);
cout << r[i] << endl;
}
}
|
Meine Geometriezeiten sind auch nicht mehr die frischsten - genügt bei 3 Koordinaten wirklich eine Wurzel?
|
Dee
Anmeldungsdatum: 9. Februar 2006
Beiträge: 20087
Wohnort: Schwabenländle
|
@sebix:
Also die Referenz mit &variable erzeugen und mit typ *variable wieder aufloesen.
Warum übergibst Du double-Werte denn als Pointer? Normalerweise nutzt man ja eher Call by Value oder Call by Reference. Bei Pointern müsstest Du vor der Dereferenzierung noch prüfen, ob es sich nicht um Null-Pointer handelt. Und auf der Nutzerseite muss auch etwas unintuitiv mit & arbeiten. Ich bevorzuge daher Call by Reference. Dann natürlich als const, damit man nicht aus versehen die Daten überschreibt: double abstand(const double& x, const doubl& y, const double& z) Ist aber nur ein Vorschlag. Und wie Du sagst, bei double-Werten macht es keinen Unterschied, ob man da jetzt Referenzen/Pointer oder die Werte übergibt. @user unknown:
genügt bei 3 Koordinaten wirklich eine Wurzel?
Die Euklidische Norm wird so berechnet. Passt also. @ollowain:
Abstand(3,x[i],y[i],z[i]);
Wozu dient eigentlich das erste Argument in Deiner Berechnung (also die 3)? Sie findet in Deiner abstand-Funktion keine verwendung. user unknown hat die Lösung ja gepostet. Meine (nicht bös gemeinte) Frage: Wie lange programmierst Du schon C? Man merkt etwas, dass die Grundlagen noch nicht fest sitzen, was zum Beispiel den Lebensbereich von Variablen angeht. Hier solltest Du Dich noch einmal einlesen, z.B. hier: http://www.cplusplus.com/doc/tutorial/namespaces/ (nur der Bereich Scopes). Gruß Dee
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
ollowain86 schrieb:
ich schreibe ein Programm in dem sich 3 Punkte in einem 3d-Koordinatensystem befinden. Was ich ausrechnen will ist der Abstand zum Koordinatenursprung. Ich fasse die Werte x-Werte, y-Werte, z-Werte in Arrays zusammen.
| double x[3]={1,2,3};
double y[3]={1,2,3};
double z[3]={1,2,3};
|
Ich würde dafür mindestens eine struct vermutlich sogar eher eine class definieren. Das ist m.E. viel sinnvoller, als mit Arrays zu operieren, weil Du dann auch Typsicherheit bekommst. Abgesehen davon, verhinderst Du dann bestimmte Dinge (z.B. ein Array der Länge 2 zu verwenden).
|
snafu1
Anmeldungsdatum: 5. September 2007
Beiträge: 2123
Wohnort: Gelsenkirchen
|
sebix schrieb: Warum willst du hier ueberhaupt Referenzen statt Werte uebergeben, es handelt sich doch um einfache doubles, keine Arrays?
Falls es noch nicht klar geworden ist: Für die Variablen werden keine einfachen Doubles, sondern Werte aus einem 3-dimensionalen Koordinatensystem verwendet. Diese Werte werden (derzeit) mittels Arrays repräsentiert. Daher sollte man die Parameter schon als Referenz übergeben, weil man ja keinen primitiven Datentypen mehr hat, sondern eine zusammengesetzte Struktur. Ich würde hier auch eher ein typedef struct mit entsprechender Definition empfehlen und dann als Typ für die Parameter diesen struct -Typ festlegen. Damit nimmt der Compiler einem schonmal etwas Arbeit bei der Validierung der Parameter ab. Beispiel für die Definition des struct s (ungetestet mangels Compiler):
| typedef struct coord {
double x;
double y;
double z;
} coord_t;
typedef struct coord_matrix {
coord_t& operator[](int i) { return coords[i]; }
coord_t coords[3];
} coord_matrix_t;
|
Und ich hoffe, das ist jetzt kein totaler Murks. 😬
|
sebix
Moderator, Webteam
Anmeldungsdatum: 14. April 2009
Beiträge: 5323
|
Dee schrieb: @sebix: Also die Referenz mit &variable erzeugen und mit typ *variable wieder aufloesen.
Warum übergibst Du double-Werte denn als Pointer? Normalerweise nutzt man ja eher Call by Value oder Call by Reference. Bei Pointern müsstest Du vor der Dereferenzierung noch prüfen, ob es sich nicht um Null-Pointer handelt. Und auf der Nutzerseite muss auch etwas unintuitiv mit & arbeiten. Ich bevorzuge daher Call by Reference. Dann natürlich als const, damit man nicht aus versehen die Daten überschreibt:
snafu1 schrieb: sebix schrieb: Warum willst du hier ueberhaupt Referenzen statt Werte uebergeben, es handelt sich doch um einfache doubles, keine Arrays?
Falls es noch nicht klar geworden ist: Für die Variablen werden keine einfachen Doubles, sondern Werte aus einem 3-dimensionalen Koordinatensystem verwendet. Diese Werte werden (derzeit) mittels Arrays repräsentiert. Daher sollte man die Parameter schon als Referenz übergeben, weil man ja keinen primitiven Datentypen mehr hat, sondern eine zusammengesetzte Struktur.
ollowain86 uebergibt aber die drei Werte einzeln und eben als Referenz. Ich habe seine Version von Fehlern bereinigt und eben gesagt, dass Referenzen in dem Fall wie es angewendet wird, ueberfluessig sind.
|