klasse wird nicht als typ erkannt - warum?
-
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.
-
Och.. viel fehlt da nicht mehr.

int number = 2; std::string text = "hmm"; std::ofstream out ("file.txt"); out << number << "\n"; out << text;Aber das steht auch in den genannten Links.

Das mit dem plotten verstehe ich nicht ganz. Du hast die Daten ja intern, dann kannst du das doch auch plotten. (oder machst du das mit einem anderen Programm?)
-
aber was bedeutet das konkret für mein programm?
wo muss ich das hinschreiben? in die funktion?
in die rekursionsschleife?
und was wäre "number" in meinem fall?ich weiss es wirklich nicht^^
ja ich soll das als dokument ausgeben damit es mit gnuplot geplottet werden kann.
-
Das sollest doch du wissen?!

Was willst du in dem File haben? Und wo wird das in deinem Programm berechnet? Jetzt kannst du mal raten, wo du etwas ins File ausgeben kannst.. Frühestesn dort, wo dus berechnet hast.. Vielleicht aber erst später, wenn du z.B die Daten noch sortieren musst oder was auch immer.
Da solltest du einfach mal ein wenig drüber nachdenken..
-
ich denke schon die ganze verdammte woche..und freitag muss das fertig sein. viel zeit habe ich also nicht mehr. und wie du schon gemerkt hast bin ich totaler anfänger. ich habe noch NIE vorher programmiert das is mein erstes programm. woher soll ich das denn alles wissen wenn ich es nicht erfrage?

es ist ja nicht so als ob ich nicht rumprobieren würde aber es klappt eben nicht.
-
Klar. Ich kann verstehen, dass es schwer für dich ist, aber grundsätzlich kannst du dich ja wirklich fragen, wo die Daten berechnet werden und dann da eine Ausgabe machen.
(ggf. Das file vorher öffnen und nicht jedes mal öffnen und schreiben)
-
http://img248.imageshack.us/img248/3579/bild1xy.jpg
http://img228.imageshack.us/img228/1651/bild2z.jpgso jetzt weisst du genau was das programm machen soll und so sieht es zur zeit aus:
#include <iostream> #include <cmath> #include <fstream> #include <vector> using namespace std; ofstream out(".../test.txt"); class pcoord { public: double x; double y; }; pcoord * flocke(std::vector<pcoord>&, int, double); int main() { int rek; int anz; double p; 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); 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; for(int i=0; i<anz; i++) { A[0].x = A[i].x; A[0].y = A[i].y; A[1].x = A[i+1].x; A[1].y = A[i+1].y; flocke(A, rek, p); } } 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); 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; } out << punkte << "\n"; }aber die rekursion ist nicht richtig weil ich nichts mit dem rückgabewert mache. und das mit dem "out.." funktioniert sowieso nicht. ich weiss nicht weiter
-
mapfoO schrieb:
es ist ja nicht so als ob ich nicht rumprobieren würde aber es klappt eben nicht.
Das ist (wie ich schon oben gesagt habe) genau das Problem. Einfach mal rumprobieren bis etwas compiliert funktioniert nicht. Da kommt IMMER Mist bei raus. Du musst mal gründlich darüber nachdenken wie dein Programm ablaufen soll, dann klappt das auch mit der Umsetzung.
Da wir aber natürlich nicht genau wissen, wie dein Programm ablaufen soll, können wir nur rein technische Hilfestellungen geben.
edit: Ich sehe, dass du inzwischen die genauen Spezifikationen deines Programms genannt hast.
Deine Flocke Funktion ist ziemlich unübersichtlich, aber wenn ich mir das richtig zusammenreime, ist deine Funktion ziemlich falsch, da die berechneten Daten einfach im Nichts verschwinden. Du solltest dir mal Gedanken darüber machen, was dein A machen soll und was es tatsächlich macht. Wenn du sprechendere Variablennamen als 'A' verwenden würdest, hätte sich dieses Problem vermutlich gar nicht erst ergeben.
edit2: Es ist übrigens sehr gut möglich, dass sich die Übungsgruppenleiter zu einer solchen Übung in diesem Forum herumtreiben.
-
so jetzt weisst du genau was das programm machen soll und so sieht es zur zeit aus:
Öhmm. Nein weiss ich nicht. Ich sehe nur ein Haufen Code, der nirgends erklärt wird. Aber ich muss den Code ja nicht verstehen, um dir zu helfen.

Wo ist denn jetzt noch genau dein Problem? Ich sehe, dass du ofstream eingebaut hast und ich denke, dass das schon korrekt sein kann. Kommt halt drauf an, was du willst.
Das Problem im Moment ist bestimmt, dass du keinen std::vector einfach so ausgeben kannst, ohne zu sagen, wie das geschen soll. Also diese Zeile hier wird einen Compile Fehler erzeugen:
out << punkte << "\n";Sprich du solltest wohl besser eine Funktion schreiben, die das ausgeben eines vectors übernimmt. Dann gibst du da einfach jeden einzelnen Wert aus, wie du möchtest.