klasse wird nicht als typ erkannt - warum?
-
int pcoord flocke(pcoord, int, double)*;pcoord flocke**;(int double,,,()))((flocke???

HÄ?
-
sry falscher text das "int" hat da eig nichts zu suchen..
hatte das irgendwann mal testweise davor geschrieben aber vergessen es wieder weg zu nehmen denk es dir einfach weg die fehlermeldung bleibt die gleiche
-
Athar schrieb:
Hinter die Klassendefinition gehört noch ein Semikolon.
ohh man ja klar sicher! danke :)hab ich irgendwie total übersehen -.-
-
so ich hab jetz eigentlich alle fehler eliminiert aber einen versteh ich immer noch nicht:
#include <iostream> #include <cmath> #include <fstream> using namespace std; class pcoord { public: double x; double y; }; pcoord * flocke(pcoord, int, double); int main() { int rek; int anz; double p; double BetrS; double BetrH; pcoord * A = new pcoord[anz]; cout<< "Geben Sie eine Anzahl von Punkten ein:" <<endl; while(1) { cout<< "Sie müssen mindestens zwei Punkte angeben!" <<endl; cout<< "Geben Sie eine Anzahl von Punkten ein: " <<endl; cin>>anz; if (anz<2) ; else break; } for(int i=0; i=anz; i++) { cout<< "Geben Sie die Koordinaten des " << i+1 << ". Punktes an:" <<endl; cout<< "X-Koordinate: " <<endl; cin >> A[i].x; cout<< "Y-Koordinate: " <<endl; cin >> A[i].y; } cout<< "Geben Sie den Streckfaktor an: " <<endl; cin >> p; cout<< "Geben Sie die Rekursionstiefe an: " <<endl; cin >> rek; pcoord * flocke(pcoord A, int rek, double p); } pcoord * flocke(pcoord A, int rek, double p) { double BetrS = sqrt(A[1].x*A[1].x - 2*A[0].x*A[1].x + A[0].x*A[0].x + A[1].y*A[1].y - 2*A[0].y*A[1].y + A[0].y*A[0].y); double BetrH = sqrt(A[1].y*A[1].y - 2*A[0].y*A[1].y + A[0].y*A[0].y + A[0].x*A[0].x - 2*A[0].x*A[1].x + A[1].x*A[1].x); pcoord * punkte = new pcoord[5]; punkte[0].x = A[0].x; punkte[0].y = A[0].y; punkte[1].x = (A[1].x-A[0].x)/3+A[0].x; punkte[1].y = (A[1].y-A[0].y)/3+A[0].x; punkte[2].x = (A[1].x-A[0].x)/2+(A[1].y-A[0].y)*p*BetrS/BetrH*sqrt((p*p+1)/2)*sin(60)+A[0].x; punkte[2].y = (A[1].y-A[0].y)/2+(A[0].x-A[1].x)*p*BetrS/BetrH*sqrt((p*p+1)/2)*sin(60)+A[0].y; punkte[3].x = (A[1].x-A[0].x)*2/3+A[0].x; punkte[3].y = (A[1].y-A[0].y)*2/3+A[0].y; punkte[4].x = A[1].x; punkte[4].y = A[1].y; for(int i=0; i<4; i++) { A[0].x = punkte[i].x; A[0].y = punkte[i].y; A[1].x = punkte[i+1].x; A[1].y = punkte[i+1].y; flocke(A, rek-1, p); if(rek==0) break; } }54 no match for 'operator[]' in 'A[1]'
54 no match for 'operator[]' in 'A[1]'
54 no match for 'operator[]' in 'A[0]'
54 no match for 'operator[]' in 'A[0]'
...etc etc..woran liegt das?
ich habe A doch definiert..
-
mapfoO schrieb:
54 no match for 'operator[]' in 'A[1]'
54 no match for 'operator[]' in 'A[1]'
54 no match for 'operator[]' in 'A[0]'
54 no match for 'operator[]' in 'A[0]'
...etc etc..woran liegt das?
ich habe A doch definiert..Und A ist laut deiner Definition ein pcoord, welches keinen Operator [] kennt. Willst du vielleicht, dass A ein Zeiger auf pcoord sein soll?
-
Du initialisierst A[i] nie, du erstellst nur ein Array. du musst jedem Feld im Array ein pcoord erstellen. also bevor A[i].x; musst du A[i] = new pcoord();
-
naja pcoord soll einfach nur ein punkt sein mit den argumenten der x und y koordinate.
alles was in der main passieren soll is dass man punkte und deren koordinaten angeben kann worauf dann die funktion flocke zurückgreift.flocke soll nebenbei gesagt eine art schneeflocke erstellen (wenn man die punkte dan plottet).die berechnungen der einzelnen punkte müsste soweit stimmen. n rechenfehler auszugleichen is ja auch erstmal nich so das ding es soll nur erstmal prinzipiell funktionieren. ich weiss sowieso noch nicht ob das mit rekursion so geht wie ich es aufgeschrieben habe nur bin ich leider nicht mal soweit das zu testen.
die x und y koordinaten der neuen punkte sollen dann auch in ein textdokument geschrieben werden damit man sie dann mit gnuplot plotten kann auch da hab ich keine idee wie das gehen soll.
und wenn das dann geschafft ist muss ich es noch hinbekommen dass flocke sich nicht nur auf eine sondern auf alle strecken zwischen den angegebenen punkten ausführt....ich brauche echt hilfe^^
-
achja noch ne kleine frage^^
wie schreibe ich "anz<2 oder anz ist keine ganze positive zahl" ?
-
Für Arrays würd ich einen std::vector nehmen. Dafür musst du dann den vector-Header inkludieren. Du solltest das Array auch erst erstellen, nachdem eine größe eingegeben wurde. Ich hab den Code mal angepasst, so dass er kompiliert und ausführbar ist. An den Kommentaren siehst du was ich geändert habe:
#include <iostream> #include <cmath> #include <fstream> #include <vector> // Für std::vector using namespace std; class pcoord { public: double x; double y; }; pcoord * flocke(std::vector<pcoord>&, int, double); // Array als Parameter. int main() { int rek; int anz; double p; double BetrS; double BetrH; // Erst die Zahl eingeben, dann arrray erstellen cout<< "Geben Sie eine Anzahl von Punkten ein:" <<endl; while(1) { cout<< "Sie müssen mindestens zwei Punkte angeben!" <<endl; cout<< "Geben Sie eine Anzahl von Punkten ein: " <<endl; cin>>anz; if (anz<2) ; else break; } std::vector<pcoord> A(anz); // vector statt new for(int i=0; i<anz; i++) // hier war die bedingung falsch { cout<< "Geben Sie die Koordinaten des " << i+1 << ". Punktes an:" <<endl; cout<< "X-Koordinate: " <<endl; cin >> A[i].x; cout<< "Y-Koordinate: " <<endl; cin >> A[i].y; } cout<< "Geben Sie den Streckfaktor an: " <<endl; cin >> p; cout<< "Geben Sie die Rekursionstiefe an: " <<endl; cin >> rek; pcoord * flocke(pcoord A, int rek, double p); // das ist kein funktionsaufruf!! } // warum hat die funktion als rückgabewert pcoord*? pcoord * flocke(std::vector<pcoord>& A, int rek, double p) { double BetrS = sqrt(A[1].x*A[1].x - 2*A[0].x*A[1].x + A[0].x*A[0].x + A[1].y*A[1].y - 2*A[0].y*A[1].y + A[0].y*A[0].y); double BetrH = sqrt(A[1].y*A[1].y - 2*A[0].y*A[1].y + A[0].y*A[0].y + A[0].x*A[0].x - 2*A[0].x*A[1].x + A[1].x*A[1].x); std::vector<pcoord> punkte(5); // Hier auch vector benutzen punkte[0].x = A[0].x; punkte[0].y = A[0].y; punkte[1].x = (A[1].x-A[0].x)/3+A[0].x; punkte[1].y = (A[1].y-A[0].y)/3+A[0].x; punkte[2].x = (A[1].x-A[0].x)/2+(A[1].y-A[0].y)*p*BetrS/BetrH*sqrt((p*p+1)/2)*sin(60)+A[0].x; punkte[2].y = (A[1].y-A[0].y)/2+(A[0].x-A[1].x)*p*BetrS/BetrH*sqrt((p*p+1)/2)*sin(60)+A[0].y; punkte[3].x = (A[1].x-A[0].x)*2/3+A[0].x; punkte[3].y = (A[1].y-A[0].y)*2/3+A[0].y; punkte[4].x = A[1].x; punkte[4].y = A[1].y; for(int i=0; i<4; i++) { A[0].x = punkte[i].x; A[0].y = punkte[i].y; A[1].x = punkte[i+1].x; A[1].y = punkte[i+1].y; flocke(A, rek-1, p); if(rek==0) break; } }
-
mapfoO schrieb:
wie schreibe ich "anz<2 oder anz ist keine ganze positive zahl" ?
anz <= 0
-
Wohl eher anz<2. Wie kann eigentlich eine Ganzzahl (int) nicht ganzzahlig sein?
-
Athar schrieb:
Wohl eher anz<2.
Ja, natürlich. Ich habe mit logischem UND statt ODER gedacht.
Wie kann eigentlich eine Ganzzahl (int) nicht ganzzahlig sein?
Vermutlich weil der Fragesteller nur wirres Zeug geschrieben hat, was er gar nicht so meinte.
-
joomoo schrieb:
... pcoord * flocke(pcoord A, int rek, double p); // das ist kein funktionsaufruf!! } // warum hat die funktion als rückgabewert pcoord*? ...ja das stand da auch eigentlich ganz anders nur hat er gemeckert beim kompilieren also habe ich es so weit verändert bis es ging :>
aber danke auf jeden fall

ich habe mit vektoren allerdings noch nie gearbeitet..würde das so wie ich es gemacht habe gar nicht gehen? oder gibt es da auch eine möglichkeit es anders zu schreiben?@rest: lol jo seppj hat wohl etwas recht

also klar ist anz ein int. aber ich kann ja trotzdem 2.3 eingeben. und 2.3 punkte geht ja schlecht. oder rundet der automatisch auf?
-
mapfoO schrieb:
ja das stand da auch eigentlich ganz anders nur hat er gemeckert beim kompilieren also habe ich es so weit verändert bis es ging :>
Gaaaanz schlechte Vorgehensweise. Gewöhn dir das unbedingt ab.
aber danke auf jeden fall

ich habe mit vektoren allerdings noch nie gearbeitet..würde das so wie ich es gemacht habe gar nicht gehen? oder gibt es da auch eine möglichkeit es anders zu schreiben?Klar, mit dynamischen Arrays, so wie du das vorher versucht hast. Nur haatest du offensichtlich die nötige Syntax nicht drauf. Da ist der vector doch die bessere Wahl, da er eine sehr ähnliche Funktionalität bietet, dabei aber genauso zu benutzen ist, wie andere Objekte auch, während dynamische Arrays für Anfänger eher unintuitiv funktionieren.
@rest: lol jo seppj hat wohl etwas recht

also klar ist anz ein int. aber ich kann ja trotzdem 2.3 eingeben. und 2.3 punkte geht ja schlecht. oder rundet der automatisch auf?Probiers doch mal aus.
-
wie hast du bloß gemerkt dass ich ein anfänger bin xD
jo nur wollte ich die aufgabe möglichst nur mit dingen lösen die ich auch kenne. aber so wie sich das anhört kenne ich dynamische arrays wohl weniger als vectoren was? :x
ok aber wie speichere ich jetzt die berechneten punkte in einem dokument ab?
irgendwie ja wohl mit return ..aber wo und was?
-
mapfoO schrieb:
ok aber wie speichere ich jetzt die berechneten punkte in einem dokument ab?
irgendwie ja wohl mit return ..aber wo und was?Nein, mit std::ofstream. Gibt's viele tutorials zu, z.b. http://www.cpp-home.com/archives/67.htm
-
jo ok aber ich mein ich muss ja jetzt erstmal sagen was die funktion ausgeben soll oder nich?
ich weiss ja nicht mal ob die rekursion so funktioniert wie sie da steht.
-
kann mir das nich bitte mal jemand erklären?
-
Öhmm.. ich weiss nicht so recht, wo du jetzt noch Probleme hast..
Ich meine du stellst sehr viele Fragen. Wo genau hast du Probleme?
- Dein Code? Also was die Funktion macht und ob das korrekt ist?
- Das bentzen von std::vector?
- Das ausgeben von Daten in ein File?
Das sind alles recht andere Probleme und wenn du dich ein wenig mit den hier genannten Links beschäftigst, dann kannst du zumindest die letzten 2 eigentlich selber herausfinden. Ausser du has dort noch speziell eine Frage..
Und was deinen Code angeht. Das ist schwer zu sagen, ob der korrekt funktioniert. Kommt halt drauf an, was er machen soll.

Tut er denn nicht, was du willst?
-
noch macht er ja gar nichts

von daher ja er macht nicht was ich will.ich will die punkte plotten und das geht nicht wenn ich ihre koordinaten nicht irgendwie abspeichere. ich weiss aber nicht wie das geht.
ich mein klar:
ofstream ausgabe("..../daten.txt"); zb oder so
aber das reicht ja noch nicht es wird ja noch gar nicht gesagt WAS in die datei geschrieben werden soll. und das ist auch meine frage.