Geschwindigekits-Vorteil Pointer



  • unskilled schrieb:

    seit wann kann man in C++ arrays per value übergeben ohne hilfsklassen zu nutzen?
    zu dem:
    so müsste es heißen:
    int *arraypointer = &array[0];
    oder gleich so:
    int *arraypointer = array;
    und dann sieht man auch schon, dass das array eh nur ein pointer ist und nicht ohne weiteres kopiert werden kann...

    bb

    "Achtung Pseudocode!"



  • Artchi schrieb:

    Es gibt in C++ eigentlich keine Spracheigenschaften, die explizit für "damit es extra schneller geht" gemacht sind.

    Das Schlüsselwort register
    Das Schlüsselwort inline
    Die Array-Übergabe per Zeiger



  • Ok, da habe ich mich was die Verwendung von Zeigern angeht wohl deutlich geirrt, in der Zwischenzeit ist noch etwas aufgetaucht und zwar möchte ich einmal folgenden Code-Ausschnitt zeigen wo das Hauptaugenmerk bitte auf default: zu legen ist:

    #include <iostream>
    using namespace std;
    int choice;
    
    void menu()
    {
        switch (choice)
        {
    
        case 1:
            cout << "TestA gewealt!";
            break;
    
        case 2:
            cout << "TestB gewealt!";
            break;
    
        case 3:
            cout << "TestC gewealt!";
            break;
    
        default:
            system("cls");
            cout << "Falscher Wert wurde eingegeben! \n";
            menu();
            break;
        }
    
    }
    
    int main ()
    {
        cout << "[Test-Application - Bitte waehlen:]" << endl;
        cout << endl;
        cout << "[1] TestA" << endl;
        cout << "[2] TestB" << endl;
        cout << "[3] TestC" << endl;
        cin >> choice;
        menu();
        return 0;
    }
    

    Auszug:

    default:
            system("cls");
            cout << "Falscher Wert wurde eingegeben! \n";
            menu();
            break;
        }
    

    Mein Gedanke dahinter war recht einfach: Sobald eine Fehleingabe gemacht wird soll zur Auswahl zurückgekehrt werden, leichter gesagt als getan ^^
    Wenn ich einfach die menu(); wieder aufrufe bleibt er dabei hängen, also wo ist der Fehler?
    (Ich wollte jetzt nicht noch einmal extra einen neuen Thread eröffnen)



  • life schrieb:

    "Achtung Pseudocode!"

    Danke auf das wollte ich auch grade aufmeksam machen. Das nächste mal mache ich es fett und färbe es rot ein 😃



  • So,
    bin in meinem kleinen Menü-Problem von oben schon etwas weiter gekommen das ist der Aktuelle Stand:

    #include <iostream>
    #include <conio.h>
    using namespace std;
    int choice;
    int error_count;        // Counter für Fehl-Eingaben
    
    void usr_in()
    {
        system ("cls");
        cout << "[Test-Application - Bitte waehlen:]" << "   Fehler: " << error_count << endl;
        cout << endl;
        cout << "[1] TestA" << endl;
        cout << "[2] TestB" << endl;
        cout << "[3] TestC" << endl;
        cin >> choice;
        cout << "\n";
    }
    
    void check_error()
    {
        if (error_count == 1)
        {
            choice = 4;
            error_count = 0;
            usr_in();
        }
    }
    
    void menu()
    {
    
        switch (choice)
        {
    
        case 1:
            cout << "TestA gewealt!";
            break;
    
        case 2:
            cout << "TestB gewealt!";
            break;
    
        case 3:
            cout << "TestC gewealt!";
            break;
    
        default:
    
            if (error_count < 1)
            {
                error_count ++;             // Eine Fehl-Eingabe hinzuzählen
            }
            check_error();
            system("cls");
            cout << "Falscher Wert wurde eingegeben! \n";
            getch();
            usr_in();
            menu();
            break;
        }
    }
    
    int main ()
    {
        usr_in();
        menu();
        return 0;
    }
    

    Problem derzeit:
    Sobald ein Buchstabe eingegeben wird endet das ganze in einer Endlos-Schleife - Dafür hatte ich einen Fehler-Counter eingebaut nur leider funktioniert dieser nicht so wie er ist. Mein Gedanke dabei:
    Sobald eine Fehl-Eingabe getätigt wird ist "default:" zuständig, also erhöhe ich einfach den Wert des Error-Zählers um 1eins, stößt er nun ein zweites mal auf diese Ebene und der Error Zähler ist schon 1 wird der Eingegebenen-Variable einfach wieder eine Zahl zugewiesen so das der Buchstabe nicht mehr vorkommen kann, dann wird wieder alles "resetet" und das ganze sollte wieder gehen - leider fehlanzeige!?



  • Tätest Du das alles in die main() hauen, wär's aber hübscher und die Probleme wären auch weg. Oder in eine Funktion namens menu.
    Die klassische Menuschleife geht übrigens so:

    "Achtung Pseudocode"
    
    bool willnochmal
    do
      eingabe
      switch
        case
          tuwas
        case
          tuwasandres
        default
          beschimpfe benutze
    while willnochmal
    


  • volkard schrieb:

    Artchi schrieb:

    Es gibt in C++ eigentlich keine Spracheigenschaften, die explizit für "damit es extra schneller geht" gemacht sind.

    [...]
    Die Array-Übergabe per Zeiger

    Damit kommen wir wieder ganz an den Anfang zurück. Zeiger sind nicht nur dafür da, dass es schneller geht.

    Es war wohl eher sowas gemeint:

    int add(int a, int b)
    {
    	int result;
    
    	fast
    	{
    		result = a + b;
    	}
    
    	very fast
    	{
    		return result;
    	}
    }
    


  • orlor schrieb:

    life schrieb:

    "Achtung Pseudocode!"

    Danke auf das wollte ich auch grade aufmeksam machen. Das nächste mal mache ich es fett und färbe es rot ein 😃

    deshalb war das &arr[0] auch nur so am rande - aber die übergabe eines arrays als bsp zu nutzen ist einfach falsch...



  • orlor schrieb:

    Hier würden bei funktion1 die ganzen 20MB im Speicher kopiert und die Kopie an Funktion1 übergeben. Bei funktion2 wird hingegen nur der Pointer (32Bit = 4byte) übergeben was soch um einiges schneller ist (zusätzlich spart es speicher 😉 ).

    Falsch. Ein Pointer hat prinzipiell keine Größe von 32Bit. Ein Pointer ist immer so groß wie das Maschinenwort!



  • XaTrIxX schrieb:

    Ein Pointer ist immer so groß wie das Maschinenwort!

    Nö.


Anmelden zum Antworten