[gelöst]Erlärung/Kommentierung eines kleinen Programms
-
die Funktion main hat per Definition immer einen Rückgabewert. Wenn du einen vernünftigen Compiler hast, dann brauchst du diesen aber nicht angeben. Aber du musst sie zumindest als int main(...) deklarieren!
Und was soll das?
int Zeilennummerierung (int argc, char *argv[])Das gehört so nicht in die main Funktion.
-
Das war copy&paste...
Aber, ich hab gedacht dass die void main Funktion keinen Rückgabeparameter hat. Dementsprechend kann ich das ja als main nehmen.
Desweiteren geht's ja um den Teil, der einen Rückgabeparameter braucht:int Zeilennummerierung(int argc, char *argv[]) { ifstream is("in.txt"); // Fileinputstream vector<string> v; // Container string tmp; while (getline(is, tmp)) v.push_back(tmp); // zeilenweise einlesen int n = digits(v.size()+1); // Anzahl Ziffern für Nummerierung for (int i=0; i<v.size(); ++i) cout << setw(n) << i << ' ' << v[i] << endl; return ???? }
-
Irgendwie verwirrst du mich gerade. Was soll das mit dieser komischen Funktion? Poste doch mal irgendetwas, was kompiliert. (Und warum sollte die Funktion etwas zurückgeben?)
Und nein, es gibt keine void main()-Funktion. main() muss int zurückgeben, ob du das willst oder nicht. Das ist vom Standard so festgelegt, nur weil dein Compiler es frisst, ist es nicht gleich gültiges C++.
-
int Zeilennummerierung(int argc, char *argv[])ersetzt NICHT die main funktion.
du MUSST eine main funktion im programm haben, da das dein "einstiegspunkt" ist, wenn das programm startet.
-
Sry, für die Verwirrung. Das will starten lassen:
Mein Compiler spuckt aber: 'Funktion_Zeilennnummer': Muss einen Wert zurückgebe#include "stdafx.h" #include <iostream> #include <conio.h> #include <stdio.h> #include <cmath> #include <string> #include <fstream> #include <ctype.h> #include <wchar.h> #include <iomanip> #include <time.h> #include <cstdlib> #include <sstream> #include <vector> using namespace std; int digits(int n) { int r=1; while (n/=10) ++r; return r; } int Funktion_Zeilennnummer(int argc, char *argv[]) { ifstream is("C:\\Datenreihe.txt"); // Fileinputstream ofstream of("C:\\Datenreihe_modi.txt"); vector<string> v; // Container string tmp; while (getline(is, tmp)) v.push_back(tmp); // zeilenweise einlesen int n = digits(v.size()+1); // Anzahl Ziffern für Nummerierung for (int i=0; i<v.size(); ++i) {cout << setw(n) << i << ' ' << v[i] << endl; of<< setw(n) << i << ' ' << v[i] << endl;} } int main (int argc, char *argv[]) { int Funktion_Zeilennnummer(); }Und das mit der void main()-Funktion haben wir in der Vorlesung gelernt...
-
#include "stdafx.h" #include <iostream> #include <fstream> #include <vector> using namespace std; int digits(int n) { int r=1; while (n/=10) ++r; return r; } int main (int argc, char *argv[]) { ifstream is("C:\\Datenreihe.txt"); // Fileinputstream ofstream of("C:\\Datenreihe_modi.txt"); vector<string> v; // Container string tmp; while (getline(is, tmp)) v.push_back(tmp); // zeilenweise einlesen int n = digits(v.size()+1); // Anzahl Ziffern für Nummerierung for (int i=0; i<v.size(); ++i) {cout << setw(n) << i << ' ' << v[i] << endl; of<< setw(n) << i << ' ' << v[i] << endl;} return 0; }so sollte es wohl gehen...
bei den includes kann ich mich irren, aber auf die schnelle scheint das so richtig zu sein. du brauchst auf jeden fall nicht diese extreme liste von includes, wie du sie verwendest^^
-
Du hast mich nicht verstanden glaub ich.
Dass das so geht, ist mir klar, ist ja nichts anderes als das im 1. Post.
Den Rückgabewert mit return 0 brauch ich dabei sogar gar nicht.
Der Grund, warum ich das so mit einer eigenen main-fkt. machen will, liegt ja daran, dass ich mehrere kleine funktionen noch habe, die ich dort aufrufe.
Ich hoffe die Problematik ist verständlich geworden. Besser:void main(void) { Funktion_Header(); Funktion_Zeilennummer(); Funktion_Einlesen(); Funktion_Mittelwert(); Funktion_Maximalwert(); Funktion_Minimalwert(); Funktion_Ausgabe(); getch(); }So soll das dann aussehen.
-
google mal nach "vorwärts deklination c++" oder sowas.
sollte dir bei deinem problem helfen.btw hab ich mitlerweile schon wieder vergessen was auf seit 1 stand, deswegen bezog ich mich lediglich auf deinen letzten post.
-
Dann mach doch aus
int Zeilennummerierung (int argc, char *argv[])das:
void Zeilennummerierung()Argv und argc brauchst du ja auch nicht
Und return 0 in main() ist Pflicht! Sonst ist das ungültiges C++. Und main muss int zurückgeben.
-
pyhax schrieb:
Dann mach doch aus
int Zeilennummerierung (int argc, char *argv[])das:
void Zeilennummerierung()Argv und argc brauchst du ja auch nicht
Also das geht auch nicht. Zumindest bekomme ich keine Fehlermeldung, aber das Fenster blinkt einmall auf und das wars dann.
Und vorwärtsdeklaration hab ich kurz gegoogelt. Das ist ja nichts anderes als die fkt. am anfang schon zu erwähnen, damit der compiler den schon kennen lernt.
Geholfen hat es mir nicht.
-
pyhax schrieb:
Dann mach doch aus
int Zeilennummerierung (int argc, char *argv[])das:
void Zeilennummerierung()Argv und argc brauchst du ja auch nicht
Ich glaube, darum geht es ihm nicht. Er will einfach eine "eigene main-Funktion" haben, die er in der main aufruft; daher wohl auch sein "void main".
void main2(int argc, char *argv[]) { Funktion_Header(); Funktion_Zeilennummer(); Funktion_Einlesen(); Funktion_Mittelwert(); Funktion_Maximalwert(); Funktion_Minimalwert(); Funktion_Ausgabe(); getch(); } int main(int argc, char *argv[]) { main2(argc,argv); }pyhax schrieb:
Und return 0 in main() ist Pflicht! Sonst ist das ungültiges C++. Und main muss int zurückgeben.
Da liegst du nur fast richtig :p. Es ist immer Pflicht, außer in der main, dort wird automatisch 0 zurückgegeben, wenn man nichts angibt.
-
Wenn du eine Funktion aufrufst schreibst du doch nicht den Typ vorneweg?
int digits(int n) { int r=1; while (n/=10) ++r; return r; } void Funktion_Zeilennnummer() { ifstream is("C:\\Datenreihe.txt"); // Fileinputstream ofstream of("C:\\Datenreihe_modi.txt"); vector<string> v; // Container string tmp; while (getline(is, tmp)) v.push_back(tmp); // zeilenweise einlesen int n = digits(v.size()+1); // Anzahl Ziffern für Nummerierung for (int i=0; i<v.size(); ++i) { // Rücke doch bitte ordentlich ein cout << setw(n) << i << ' ' << v[i] << endl; of<< setw(n) << i << ' ' << v[i] << endl; } } int main() { Funktion_Zeilennnummer(); }So. Und void main() habt ihr in euer Vorlesung gelernt? Ernsthaft?

Edit:
Das Konsolenfenster blinkt übrigens nur kurz auf, weil dein Programm schneller läuft als du gucken kannst. Mach eine Eingabe ans Ende, dann geht es. getchar() liest übrigens das verbleibende '\n' ein, wenn du vorher mit operator >> gelesen hast. Daher zwei mal getchar(), oder gleich wieder etwas mit >> einlesen, oder dein Programm aus der Konsole starten.
-
probier mal:
#include <iostream> //Falls du das noch nicht hast // ... int main(int argc, char** argv) { // ... std::cout<<"Drücke Enter zum Beenden"<<std::endl; std::cin.get(); return 0; }
-
Ich hab ja auch gedacht, dass das Prog zu schnell arbeitet. Aber das kann nciht sein, denn
1.) Ich lese eine Datenreihe mit 2000 Daten ein
2.) Die modifizierte Datei muss im C-Lw sein. Ist es aber nicht.
Daraus folgt mich, dass die fkt. nicht aufgerufen wird, so wie ich das da stehen hab (post von cooky ist mein prog, nochmal zur erinnerung)
-
Hast du zufällig Windows 7 und gibst dem Programm keine Schreibrechte für C? Vielleicht solltest du mal auf is.is_open() und of.is_open() testen. (Bzw. .good())
-
Ich hab Win7, aber schreibrechte sind ohne Ende vorhanden.
Nochmal: Wenn ich das ohne diesen Teil mache:int main() { Funktion_Zeilennnummer(); }also meine Fkt "Zeilennummer" als main-fkt aufrufe, dann läuft ja alles (Was aber für mich, unbedeutend ist).
Deshalb gehe ich ja davon aus, dass die fkt. so gar nicht aufgerufen wird, warum auch immer.
-
Das Programm von cooky enthält keine Funktionen zum Aufhalten des Fensters.
Probiers mal so:
#include <iostream> #include <iomanip> #include <fstream> #include <vector> #include <string> #include <cstdlib> using namespace std; int digits(int n) { int r=1; while (n/=10) ++r; return r; } void Funktion_Zeilennnummer() { ifstream is("C:\\Datenreihe.txt"); // Fileinputstream ofstream of("C:\\Datenreihe_modi.txt"); vector<string> v; // Container if (!is.good()) { std::cerr << "Fehler beim Oeffnen: is\n"; return; } if (!of.good()) { std::cerr << "Fehler beim Oeffnen: of\n"; return; } string tmp; while (getline(is, tmp)) v.push_back(tmp); // zeilenweise einlesen int n = digits(v.size()+1); // Anzahl Ziffern für Nummerierung for (std::size_t i=0; i<v.size(); ++i) { // Rücke doch bitte ordentlich ein cout << setw(n) << i << ' ' << v[i] << endl; of<< setw(n) << i << ' ' << v[i] << endl; } } int main() { Funktion_Zeilennnummer(); std::cout<<"Drücke Enter zum Beenden"<<std::endl; std::cin.get(); return 0; }
-
@sdsfd: Ich hab "dein" Prog einfach mal rüber kopiert und es funzt...
Ich gucke mal, aber ich habe es genau so
Sry für die Verwirrung an alle.Neeeeeeeeeeeeeiiiin. Asche auf mein Haupt. Das kann ja nciht funktionieren:
int main () { void Funktion_Zeilennnummer(); cout<<"Drücke Enter zum Beenden"<<endl; cin.get(); return 0; }Tut mir echt leid!!!
-
Ich glaube, so langsam herrscht hier Verwirrung. Vielleicht machst du nochmal in einem kurzen Beitrag klar, WAS du genau erreichen willst.
-
Ich wollte das Programm:
int digits(int n) { int r=1; while (n/=10) ++r; return r; } int main(int argc, char *argv[]) { ifstream is("in.txt"); // Fileinputstream vector<string> v; // Container string tmp; while (getline(is, tmp)) v.push_back(tmp); // zeilenweise einlesen int n = digits(v.size()+1); // Anzahl Ziffern für Nummerierung for (int i=0; i<v.size(); ++i) cout << setw(n) << i << ' ' << v[i] << endl; }für meine Wünsche umändern. Dazu gehörte: Eine zusätzliche Ausgabe in eine modifizierte Datei und diese main-Funktion (die später den fkt-Namen Zeilennummer kriegt) VON einer main-fkt starten lassen.
Das, ist das Ergebniss:#include <iostream> #include <iomanip> #include <fstream> #include <vector> #include <string> #include <cstdlib> using namespace std; int digits(int n) { int r=1; while (n/=10) ++r; return r; } void Funktion_Zeilennnummer() { ifstream is("C:\\Datenreihe.txt"); // Fileinputstream ofstream of("C:\\Datenreihe_modi.txt"); vector<string> v; // Container if (!is.good()) { std::cerr << "Fehler beim Oeffnen: is\n"; return; } if (!of.good()) { std::cerr << "Fehler beim Oeffnen: of\n"; return; } string tmp; while (getline(is, tmp)) v.push_back(tmp); // zeilenweise einlesen int n = digits(v.size()+1); // Anzahl Ziffern für Nummerierung for (std::size_t i=0; i<v.size(); ++i) { cout << setw(n) << i << ' ' << v[i] << endl; of<< setw(n) << i << ' ' << v[i] << endl; } } int main() { Funktion_Header(); Funktion_Zeilennnummer(); Funktion_Einlesen(); Funktion_Mittelwert(); Funktion_Maximalwert(); Funktion_Minimalwert(); Funktion_Ausgabe(); return 0; }Mit
int main () { void Funktion_Zeilennnummer(); return 0; }dem void vor dem Funktionsaufruf, konnte das ja nichts werden...Was leider mein Fehler war, welches ich nicht bemerkt hab.
In diesem Zusammenhang nochmal zwei Fragen:
1.) Muss ich nciht theoretisch gesehen nich mit "is.close()" und "of.close(), die Dateien schließen?
2.) Das Programm wird weitergeschrieben. Für weitere Fragen, sollte ich ein anderes Thema eröffnen?