Prototypen



  • Irgendwie habe ich das Gefühl, dein Buch erklärt nicht wirklich viel. Was liest du denn da?



  • Das Buch heisst "C++ für Dummies" 🙂

    Es erklärt schon viel aber für mich ist es ein bisschen kompliziert.

    Also zu meiner Frage:

    Verstehe ich das richtig, dass man eine Funktion vor der main() Klammer definieren muss, aber den Funktionsrumpf kann man auch erst in der main () Klammer schreiben?



  • Wenn du eine Funktion aus der main() aufrufen möchtest, musst du sie vor der main() deklarieren, damit der Compiler die Signatur der Funktion kennt.

    Den Funktionsrumpf kannst du nachher irgendwo nach dem Prototypen schreiben, aber NICHT im Rumpf der Main-Methode.

    Z.B. so:

    // Hier ist der Prototyp, damit der Compiler die Signatur der Funktion kennt
    int add( int a, int b );
    
    int main()
    {
    	cout << add(1, 2) << endl;
    }
    
    // Der Rumpf wird implementiert
    int add( int a, int b )
    {
    	return a + b;
    }
    

    Oder du kannst es auch direkt machen:

    // Die Funktion wird vor der Main bereits mit Rumpf definiert
    int add( int a, int b )
    {
    	return a + b;
    }
    
    int main()
    {
    	cout << add(1, 2) << endl;
    }
    

    Interessant wird dies dann vor allem auch wenn du mit Header-files beginnst zu arbeiten. Du kannst dann in den Headerfiles die Prototypen hinschreiben und diese in einem anderen file (z.B. .cpp file) implementieren.



  • Aha

    Danke
    Oke jetzt kapier ichs

    Aber wenn ich den Funktionsrumpf erst nach der main() Klammer aufschreibe, fehlt dem Compiler dann nicht während er die main- Funktion ausführt die Daten der deklarierten Funktionen?



  • Der Compiler braucht nur die Signatur zu kennen. Das heisst er muss wissen wie viele Argumente eine Funktion hat und welchen Rückgabetypen. Der Rest übernimmt dann der Linker.



  • Oke

    Danke

    Hattet ihr als ihr C++ gelernt habt auch so Probleme mit Arrays?



  • Nein, überhaupt keine. Aber als ich Java lernte (war meine erste Programmiersprache) hatte ich zu Beginn Probleme Arrays genau zu verstehen. Aber das wird schon 😉

    Kannst ja sonst im Forum auch einen Fred aufmachen um Fragen zu stellen, falls etwas ganz unklar ist.



  • Also im Moment verstehe ich überhaupt nichts mehr 😕

    Das Buch ist wahrscheinlich nicht für 16jährige geschrieben oder ich bin nicht begabt 🙂



  • Ach was 😉 Ich versuche es mal zu erklären.

    Angenommen du möchtest in deinem Programm 10 int Werte haben. Du könntest nun natürlich die Variablen int x1, int x2, ..., int x10 deklarieren. Spätestens wenn du aber mal 1000 int Werte brauchst ist das nicht mehr so schön. Dafür sind Arrays da.
    Du kannst dir ein Array wie eine Reihe von Fächern vorstellen und in jedes Fach kannst du einen int Wert reinlegen. Die Fächer werden nummeriert von 0 bis 9, da die Nummerierung immer bei 0 beginnt.

    Du möchtest also nun die Zahlen von 1-3 in deinem Array haben. Du kannst das z.B. so machen:

    int x_werte[3]; // Hier deklarierst du einen Array, in den 3 Werte reinpassen
    	x_werte[0] = 1; // Du initialisierst den ersten Array-Wert mit 1 (anschaulich: du tust 1 in das erste Fach)
    	x_werte[1] = 2; // 2 tust du ins 2te Fach
    	x_werte[3] = 3;
    

    Über x_werte[i] bekommst du also den Wert, der an der i-ten Stelle liegt. Diesen kannst du dann brauchen wie eine normale int Variable.

    Wenn du nun die Werte ausgeben möchtest kannst du folgendes machen:

    // Hier werden die Werte der Reihe nach ausgegeben
    	cout << x_werte[0] << endl;
    	cout << x_werte[1] << endl;
    	cout << x_werte[2] << endl;
    

    Wenn du nun die Werte von 1-100 haben möchtest, kannst du ein int-Array der Länge 100 machen und dann über eine for-Schleife die Werte initialisieren. Dann kannst du diese auch wieder über eine for-Schleife ausgeben, z.B. so:

    int x_werte[100];
    
    	// Weise allen 100 Fächern den Wert von i+1 zu
    	for( int i = 0; i < 100; i++ )
    	{
    		x_werte[i] = i+1;
    	}
    
    	// Gebe alle 100 Werte im Array aus
    	for( int i = 0; i < 100; i++ )
    	{
    		cout << x_werte[i] << endl; // Gibt den Wert an i-ter Stelle aus.
    	}
    

    Ich hoffe, dass dir das etwas Hilft. Man kann sich Arrays wirklich sehr gut als eine Reihe von Fächern vorstellen, in den man Werte eines gewissen Typs (z.B. int, double oder float) reintun kann.

    Das Problem ist jetzt halt, dass es in C++ sehr viele verschiedene Arten gibt Arrays zu initialiseren und deklarieren. Am besten spielst du einfach mal ein bisschen mit Arrays herum. Wenn dann etwas konkretes nicht klappt, dann fragst du hier im Forum.



  • Cool genau nach sowas hab ich gesucht
    Danke

    Spätestens wenn du aber mal 1000 int Werte brauchst ist das nicht mehr so schön.

    In dem Buch steht aber, dass man pro Array nur 128 Werte speichern kann.
    Wie geht dann das?

    Und kannst du mir vl mal eine Aufgabe stellen, die ich dann lösen könnte?

    Gruss Truggi und Danke nochmal



  • In dem Buch steht aber, dass man pro Array nur 128 Werte speichern kann.

    Das steht da sicherlich nicht. So etwas würde nicht mal Jürgen Wolf behaupten. Wahrscheinlich legst du 128-elementige Arrays an, in die dann natürlich nur 128 Werte passen. Du kannst aber genauso gut Arrays mit 1000 Werten anlegen.
    Wie das geht hat dir der übermütige Engel schon gesagt.



  • Ups

    Sorry, alles klar.

    Wer genau lesen kann ist im Vorteil. 😃



  • Hmm, Aufgaben auszudenken ist immer etwas schwer aber ich versuchs mal (teilweise habe ich ähnliche Aufgaben in Programmierbüchern gefunden):

    Änder den Code von mir mal so ab, dass du 1000 Werte speichern kannst und schau, ob es funktioniert. Bei mir funktioniert es einwandfrei 🙂

    Deklariere ein Array der Länge 10 und speichere darin die ersten 10 ungeraden Zahlen (also 1, 3, 5, ...), am besten mit einer for-Schleife.

    Deklariere ein Array

    int x[] = {9,4,3,5};
    

    Dies ist ein Array der Länge 4. x[0] = 9, x[1] = 4 usw.
    Gibt mit einer for-Schleife die Summe der Werte aus, die im Array gespeichert sind.

    Deklariere zwei float Arrays x und y der Länge 3, und fülle beide mit beliebigen Werten. Anschliessend gibst du mit einer for-Schleife x[0]+y[0] und [x1]+y[1] und x[1]+x[2] aus.

    Ich hoffe, dass diese Aufgaben nicht allzu schwer sind.



  • 1. Geschafft

    Bei 2.,3. und 4. weis ich nicht, wie ich die for-Schleifen deklarieren soll.
    Wie geht das? Kannst du mir das bitte erklären?



  • Also du möchtest ja durch alle Werte des Arrays iterieren (iterieren bedeutet der Reihe nach alle Werte durchmachen).

    Du beginnst also am Anfang des Arrays bis zu einem bestimmten Index. In diesem Fall vom Anfang bis zum Schluss.

    Wenn du nun ein Array mit 10 Elementen hast weisst du, dass diese Elemente von 0 bis 9 durchnummieriert sind.

    Die for-Schleife sieht dann so aus:
    for( int i = 0; i < 10; i++ )
    Du beginnst also bei 0 und erhöhst i bei jedem Schritt um 1. Dies machst du aber nur solange i < 10 ist, da das Array ja nur Elemente von 1-9 hat.

    Den Rest siehst du in meinem Beispiel oben.



  • Aber es sollen ja die ungeraden Werte angezeigt werden



  • Eine for-Schleife ist sehr einfach. Zunächst einmal ein Überblick in Pseudocode:

    for(Initialisierung; Bedingung; Fortsetzung) {
        Anweisungen
    }
    

    Du hast die Möglichkeit eine Initialisierung durchzuführen, in der du für die Schleife eine Zählvariable definierst, mit der du den Programmfluss kontrollieren kannst. Solange die angegebene Bedingung wahr ist (meistens bezogen auf die Zählvariable), dann wird jeweils einmal alles zwischen den geschweiften Klammern ausgeführt (=Anweisungen). Zum Schluss wird in der Fortsetzung meistens die Variable inkrementiert (um 1 erhöht), damit die Schleife auch mal aufhört.

    for(int i = 0; i < 9; i++)
        std::cout << i << std::endl;
    

    Hier wird eine Variable i definiert und festgelegt, dass die Schleife solange ausgeführt werden soll, wie auch i < 9 . Am Ende eines Durchlaufs wird i dann inkrementiert.
    Ansonsten werden nur die Zahlen von 0 bis 8 ausgegeben.

    Hoffe das erklärt es irgendwie 😃

    // EDIT: Das war allgemein.
    Wenn du überprüfen willst, ob eine Zahl (un)gerade ist, dann kannst du den Modulo-Operator % nutzen.



  • Kannst du mir mit dem Modulo ein Beispiel machen?



  • Der Modulo-Operator liefert immer den Rest einer Division:

    7 / 3 = 2 Rest 1
    7 % 3 = 1
    

    Müsste einfach und selbsterklärend sein.



  • Oder gleich so für die ungeraden Zahlen:

    for( int i = 0; i < 10; i++ )
    	{
    		cout << 2*i + 1 << endl;
    	}
    

    Falls du dann mal durch gerade Zahlen möchtest einfach das +1 weglassen.


Anmelden zum Antworten