Variablen in Funktionsprototypen --> Fehlermeldung
-
Hallo!
Ich bin grade dabei, mein erstes größeres eigenes Programm zu schreiben, nämlich einen Codec für eine Abwandlung des Caesar-Codes, bei dem die Schüssel während der Verschlüsselung verändert werden. Da das (zumindest für mich als totalen Neuling) eine nicht ganz einfache Aufgabe ist, ist der Code erstmal extrem unübersichtich geworden (1000 Codezeilen in 3 Funktionen unterteilt....) Nun habe ich das in 16 Funktionen unterteilt und damit die von main() aus aufgerufen werden können, ganz am Anfang des Codes die Funktionsprototypen hingeschrieben, wie ich das in einem Buch über C++ gelesen hatte. Der Compiler beschwert sich jetzt jedoch, dass die Variablen, die als Inputs in den Funktionsprototypen stehen, nicht deklariert sind. Laut dem Buch das ich hier habe, müssen die Inputs der Funktionen auch in den Prototypen stehen aber dann müsste ich ja jede Variable, die irgendeine Funktion als Input hat, als global deklariert werden und das kanns ja wohl auch nicht sein.... Was mache ich da falsch und wo liegt mein Denkfehler?

Danke, Tetrapak
-
eventuell postest du etwas code, dann kann man sehen, was du meinst..
Deine Beschreibung ist doch eher unverständlich...
-
Hm, ja das hatte ich befürchtet. Also, der Anfang meines Codes sieht so aus:
#include<cstdio> #include<cstdlib> #include<iostream> #include<string> //Funktionsprototypen void decoder(); void coder(); string eingabeKlartext(); string eingabeVerschluesselterText(); int TextLaenge(text); int compilerBuchstabeZahl(text, textLaenge); string compilerZahlBuchstabe(zahlenText); int eingabeZahlDerVerschluesselungen(); int eingabeGrenzwert(i); int eingabeSchrittweite(i); bool eingabePhasenverschiebung(i); int codierungsAlgorithmus(grenzwert, schrittweite, phasenverschiebung, zahlenText); int decodierungsAlgorithmus(grenzwert, schrittweite, phasenverschiebung, zahlenText);[cpp] void compAusgabe(text); void decompAusgabe(text);Und nun meldet der Compiler, dass beispielsweise die Variable "text" nicht deklariert ist. Wenn ich sie aber schon vor den Funktionsprotoypen deklarieren wollte, dann müsste sie ja global sein und das will ich nicht. Wo ist da der Fehler?
-
Wie wärs wenn Du dem Variablennamen noch den gewünschten Typ voranstellst, oder soll der Compiler raten?
int compilerBuchstabeZahl(string text, int textLaenge);
-
Ja, das war es! Danke für die schnelle Hilfe!!!!
Allerdings meldet der Compiler immer noch um die 100 Fehler ächz. Da werd ich mich mal an die Arbeit machen....
-
So, soweit wäre ich jetzt. ´Schon wieder gibt es neue Probleme:
1. Ist es möglich, dass ich die Länge eines int-Arrays irgendwie über eine Konstante bestimme, etwa so:
cin >> string text const int textLaenge = text.length(); int zahlenArray[textLaenge]Ich möchte halt ein int-Array haben, das genausolang ist, wie ein nullterminierter String, der vom Benutzer eingegeben wird.
2. Meine Verschlüsselung stürzt jedesmal ab wenn man einen Text mit einem Leerzeichen eingibt und zwar noch bevor mit dem Text irgendwas gemacht wird. Nach der Eingabe des Textes kommt erstmal die Eingabe des Codes und schon bevor diese erscheint, schmiert das Programm ab. Kann es irgnedwelche Probleme geben wenn man in einen String einen Text mit Leerzeichen eingibt?
Falls jemand nach dem Code fragen sollte, es ist ein ziemlich unübersichtliches Monstrum mit 2000 Codezeilen geworden und ich glaube nicht, dass sich einer von auch das antun möchte... Ich habe versucht, das ganze etwas übersichtlicher zu machen durch den Einsatz von mehr Funktionen aber danach hat mir der Compiler ca. 100 Fehlermeldungen geliefert und ich war nicht in der Lage, die Fehler alle zu feinden, daher arbeite ich jetzt wieder mit der unübersichtlichen Version.
-
dafür gibts pointer bzw zeiger. damit kannst du zur laufzeit dynamisch speicher resierevieren:
cin >> string text const int textLaenge = text.length(); int *zahlenArray = new int[textLaenge];das erste element des arrays sprichst du dann aber nicht mehr mit zahlenArray[0] an, sondern mit (*zahlenArray)[0];
allerdings würde ich dir von der stl std::vector vorschlagen.
-
Ok, danke! Mit Zeigern hab ich noch nie gearbeitet, aber das krieg ich schon hin.
Noch dringender wäre allerdings mein zweites Problem. Hat irgendjemand eine Erklärkung dafür dass mein Prog abstürzt sobald man in einen nullterminierten String ein Leerzeichen eingibt?
-
Wenn Du einen string mit
std::string text; cin >> texteinliest, wird immer nur bis zum nächsten Trennzeichen gelesen. Dazu gehört außer Zeilenvorschub (Return) auch das Leerzeichen. Der Rest bleibt für die nächste Eingabefunktion übrig. Evtl. kommt Dein Problem daher. Eine ganze Zeile einlesesn kannst Du mit getline.
DJohn
-
Ja, ich hschätze, daher wird es wohl kommen. Ich möchte aber nicht nur eine Zeile einlesen. Es soll ja ein Verschlüsselungsalgorithmus sein, in den man längere Texte eingeben kann und die dann codiert werden. Gibt es da eine Möglichkeit?
-
Ok, in einem einfachen Caesar-Algorithmus hat es mit cin.getline funktioniert.
In meinem neuen Algorithmus passiert dagegen garnichts.
Der Code sieht so aus:cout << "Geben Sie den Klartext ein.\n"; char klartext[2000]; cin.getline(klartext,2000); cout << "Geben Sie die Anzahl der Verschl"<<Umlaut::ue<<"sselungen ein.\n"; int zahlDerVerschluesselungen = 1; cin >> zahlDerVerschluesselungen;Statt dass man aber nach "Geben Sie den Klartext ein" einen Text eingaben kann, springt das Programm direkt weiter und gibt "Geben Sie die Zahl der Verschlüsselungen ein." aus. Was ist da los?
-
Da ist wohl noch ein eoln im Tastaturpuffer. Mach mal ein
cin.ignore(1);vor dein getline.
Warum nimmst du überhaupt char[] statt string?