List-Frage
-
Wenn ich die List-Deklaration in Zeile 18 wegkommentiere rechn3t er richtig, wenn ich sie stehen lasse, hat er offensichtlich zwei Kontainer selbigen Namens. Warum?
#include <iostream> #include <vector> #include<list> using namespace std; int t=1; int n=0; int quot; void wennganzzahligerteiler(); void wennbruch(); void wennnichprim(); list<int>teiler; int main(int argc, const char * argv[]) { list<int>teiler; for (n = 1; n <=7; n=n+1) //Grundzahlproduzent { cout<<"\nzu "<<n<<"\n"; teiler.clear(); for (t = 1; t<=n; t=t+1) // Teilerhersteller { cout<<n<<"=n "<<t<<"=t \n"; if (n%t==0) // dann Modulo = 0 dh.(ganzzahliges Ergebnis) nur, wenn ganzzahliger Teiler { wennganzzahligerteiler(); teiler.push_back(t); } else //wennbruch { wennbruch(); } cout<<n<<" hat "<<teiler.size()<<" Teiler, näml."; for(auto it=teiler.begin();it !=teiler.end();it++) { cout<<*it<<"; ";} cout<<"\n"; } } return 0; } void wennganzzahligerteiler() { quot=n/t; cout<<n<<"/"<<t<<"="<<n/t<<" \n"; cout<<t<<" ist Teiler von "<<n<<"\n"; } void wennbruch() { cout<<n<<" hat "<<teiler.size()<<" Teiler, nämlich "; for(auto it=teiler.begin();it !=teiler.end();it++) { cout<<*it<<" ";} //cout<<"\n"; }
-
Der Grund liegt an der Verwendung globaler Variablen.
Verwende keine globalen Variablen, erst recht nicht für for-Schleifen!
Definiere Variablen erst so spät wie möglich und nutze Argumente und Rückgabewerte für Funktionen.
-
Danke, habe jetzt mal so gemacht:
Mir ist nicht klar, warum ich vor die Funktion noch void (leer) schreibe, obwohl ich doch Parameter übergebe. Es läuft übrigens nicht.
#include <iostream> #include <vector> #include<list> using namespace std; int quot; void wennganzzahligerteiler(); void wennbruch(); void wennnichprim(); list<int>teiler; int main(int argc, const char * argv[]) { list<int>teiler; for (int n = 1; n <=7; n=n+1) //Grundzahlproduzent { cout<<"\nzu "<<n<<"\n"; teiler.clear(); for (int t = 1; t<=n; t=t+1) // Teilerhersteller { cout<<n<<"=n "<<t<<"=t \n"; if (n%t==0) // dann Modulo = 0 dh.(ganzzahliges Ergebnis) nur, wenn ganzzahliger Teiler { wennganzzahligerteiler(); teiler.push_back(t); } else //wennbruch { wennbruch(); } cout<<n<<" hat "<<teiler.size()<<" Teiler, näml."; for(auto it=teiler.begin();it !=teiler.end();it++) { cout<<*it<<"; ";} cout<<"\n"; } } return 0; } void wennganzzahligerteiler(int t, int n) { quot=n/t; cout<<n<<"/"<<t<<"="<<n/t<<" \n"; cout<<t<<" ist Teiler von "<<n<<"\n"; } void wennbruch(int n) { cout<<n<<" hat "<<teiler.size()<<" Teiler, nämlich "; for(auto it=teiler.begin();it !=teiler.end();it++) { cout<<*it<<" ";} //cout<<"\n"; }
-
Du hast ja auch immer noch zwei globale Variablen.
-
wieso 2, ich seh nur quot? ... ich will bloß nicht alles mit einemmal kaputtmachen .... brauch es übrigens gar nicht mehr, habe es gelöscht, läuft trotzdem nicht ...
#include <iostream> #include <vector> #include<list> using namespace std; void wennganzzahligerteiler(); void wennbruch(); void wennnichprim(); list<int>teiler; int main(int argc, const char * argv[]) { list<int>teiler; for (int n = 1; n <=7; n=n+1) //Grundzahlproduzent { cout<<"\nzu "<<n<<"\n"; teiler.clear(); for (int t = 1; t<=n; t=t+1) // Teilerhersteller { cout<<n<<"=n "<<t<<"=t \n"; if (n%t==0) // dann Modulo = 0 dh.(ganzzahliges Ergebnis) nur, wenn ganzzahliger Teiler { wennganzzahligerteiler(); teiler.push_back(t); } else //wennbruch { wennbruch(); } cout<<n<<" hat "<<teiler.size()<<" Teiler, näml."; for(auto it=teiler.begin();it !=teiler.end();it++) { cout<<*it<<"; ";} cout<<"\n"; } } return 0; } void wennganzzahligerteiler(int t, int n) { cout<<n<<"/"<<t<<"="<<n/t<<" \n"; cout<<t<<" ist Teiler von "<<n<<"\n"; } void wennbruch(int n) { cout<<n<<" hat "<<teiler.size()<<" Teiler, nämlich "; for(auto it=teiler.begin();it !=teiler.end();it++) { cout<<*it<<" ";} //cout<<"\n"; }
-
brak schrieb:
wieso 2, ich seh nur quot? ... ich will bloß nicht alles mit einemmal kaputtmachen .... brauch es übrigens gar nicht mehr, habe es gelöscht, läuft trotzdem nicht ...
Du hast immer noch eine, unter der Deklaration von wennnichprim().
-
Wenn ich also "int Teiler" in die Deklaration als Argument schreibe, dann sagt er: member reference base type int is not a structure or union
Was meint das?
void wennbruch(int n, int teiler) { cout<<n<<" hat "<<teiler.size()<<" Teiler, nämlich "; for(auto it=teiler.begin();it !=teiler.end();it++) { cout<<*it<<" ";} //cout<<"\n";
-
brak schrieb:
Wenn ich also "int Teiler" in die Deklaration als Argument schreibe, dann sagt er: member reference base type int is not a structure or union
Was meint das?
for(auto it=teiler.begin();it !=teiler.end();it++)Das meint, dass ein int keine Methoden namens begin() bzw. end() hat.
-
Das heisst, dass Du auf ints nicht .begin() aufrufen kannst.
<edit>2 doofe, ein Gedanke...</edit>
-
Au, da weiss ich jetzt nicht weiter, kann mal jemand die Zeile gut schreiben...?
-
brak schrieb:
Au, da weiss ich jetzt nicht weiter, kann mal jemand die Zeile gut schreiben...?
Du willst keinen teiler haben, der ein int ist; du willst eine Liste von Teilern. Also gib auch eine Liste von Teilern!
-
void wennbruch(int n, list.teiler)das scheint falsch zu sein....
-
Sag mal ehrlich, der Code ist doch von irgendwo herkopiert und bisschen modifiziert oder?
Mir ist nicht klar, warum ich vor die Funktion noch void (leer) schreibe, obwohl ich doch Parameter übergebe.
-
Angemeldet 2008. Das ist doch ein Witz, oder?
-
Hab gerade Zeit, mich mit dem von vor 2 Jahren erworbenen Buch zu beschäftigen; Dirk louis C++, bin ja bloß gelegentlicher Hobbyprogrammierer... und bin am lernen Funktion ..
-
Ich würde empfehlen das Buch nochmals von ANFANG an durchzuarbeiten.
-
Bashar schrieb:
Angemeldet 2008. Das ist doch ein Witz, oder?

-
brak schrieb:
Hab gerade Zeit, mich mit dem von vor 2 Jahren erworbenen Buch zu beschäftigen; Dirk louis C++, bin ja bloß gelegentlicher Hobbyprogrammierer... und bin am lernen Funktion ..
Ich bin mir 100%ig sicher das auch Dirk Louis bei Funktionen eindeutig beschreibt was ein Rückgabeparameter ist, was void an dieser Stelle bedeutet, und das Übergabeparameter wieder etwas ganz anderes sind. Das Problem ist schlicht das du nicht liest, und wir sind auch nicht unbedingt bereit jeden Kleinstfehler häppchenweise zu korrigieren. Das bringt beiden Seiten nichts.
Daher lies das Buch von vorne durch, versuch das geschriebene auch wirklich zu verstehen, und stelle DANN konkrete Fragen wenn du etwas nicht verstehst. Ich habe den Verdacht das du das Buch nur überfliegst, oder Unklarheiten so lange aufschiebst das diese sich zu einem großen Fehlerberg aufsummieren.