funktion klappt nicht.



  • Hallo.
    Ich bastel hier gerade ne Funktion umbennnen aber irgendwie klappt die nicht ganz. Es kommt der Fehler:
    Error 1 error C2664: 'umbenennen' : cannot convert parameter 1 from 'char (*)[21]' to 'char *[]'

    #include "stdafx.h"
    #include <iostream>
    #include <conio.h>
    
    using namespace std;
    
    void umbenennen(char *mynameis[21])
    {
    
    	cout <<"Gib dein neuen Namen ein: \n";
    	cin >> *mynameis;
    	cout <<"hallo "<<mynameis;
    
    }
    
    int main()
    {
    
    	char mynameis[21];
    	int jaodernein;
    
    	cout <<"Hallo, wie ist dein Name?\n";
    	cin >> mynameis;
    	cout <<"Dein Name ist "<<mynameis<<"!";
    
    	cout << "\nWillst du deinen Name umbennen?\n";
    	cout << "\n 1= Ja | 2= Nein\n";
    	cin >> jaodernein;
    
    	if (jaodernein==1)
    	{
    		umbenennen(&mynameis);
    	}
    	else 
    	{
    		cout << "Ok, du bist weiterhin "<<mynameis;
    	}
    
    	cout <<"Dein neuer Name ist "<<mynameis<<"!";
    
        getch();
        return 0;
    }
    


  • void umbenennen(char mynameis[21])
    


  • _matze schrieb:

    void umbenennen(char mynameis[21])
    

    jaaa???



  • hellooworldy schrieb:

    _matze schrieb:

    void umbenennen(char mynameis[21])
    

    jaaa???

    Sieh dir den Unterschied zu deinem Code mal an. Du hast da ein '*' zuviel. 🙂



  • Ahh das Sternchen ist weg. Jetzt erst gesehen.

    Aber es kommt immer noch der Fehler:

    Error 1 error C2664: 'umbenennen' : cannot convert parameter 1 from 'char (*)[21]' to 'char []'



  • hellooworldy schrieb:

    Ahh das Sternchen ist weg. Jetzt erst gesehen.

    Aber es kommt immer noch der Fehler:

    Error 1 error C2664: 'umbenennen' : cannot convert parameter 1 from 'char (*)[21]' to 'char []'

    Diesmal hast du beim Aufruf ein '&' zuviel. 😃



  • hellooworldy schrieb:

    void umbenennen(char *mynameis[21])
    {
    	cout <<"Gib dein neuen Namen ein: \n";
    	cin >> *mynameis;
    	cout <<"hallo "<<mynameis;
    }
    

    Da hat Dir die Präzedenz von Operatoren einen Streich gespielt. Die Regel ist aber einfach: Alle Postfix-Operatoren binden stärker als Präfix-Operatoren. mynameis ist (eigentlich) ein Array von Zeigern auf char. Top-Level-Arrays bei Funktionsparametern gibt es aber nicht wirklich. Hier wird eine Transformation durchgeführt, die aus dem Array ein Zeiger macht. mynameis ist also ein char**.

    Du wolltest aber wahrscheinlich " char (*mynameis)[21] " schreiben. Das ist dann ein Zeiger auf ein 21-Elementiges Array von char.

    Der Vorschlag von _matze sollte aber auch kompilieren, wenn du umbenennen(&mynameis); durch umbenennen(mynameis); ersetzt (Ich habe den Addressoperator entfernt.

    Noch besser wär sicherlich die Verwendung von std::string. Dann brauchst Du Dir auch keine Sorgen mehr über Pufferüberläufe machen; denn so, wie Du Dir das überlegt hast, ist das Verhalten undefiniert, wenn der Benutzer einen Namen eingibt, der aus mehr als 20 Zeichen besteht.

    Gruß,
    SP



  • Sebastian Pizer schrieb:

    [cpp]
    [...]
    Noch besser wär sicherlich die Verwendung von std::string. Dann brauchst Du Dir auch keine Sorgen mehr über Pufferüberläufe machen; denn so, wie Du Dir das überlegt hast, ist das Verhalten undefiniert, wenn der Benutzer einen Namen eingibt, der aus mehr als 20 Zeichen besteht.

    Gruß,
    SP

    Kann man in dem Fall nicht eine Exception einfügen?



  • skullyan schrieb:

    Kann man in dem Fall nicht eine Exception einfügen?

    Natürlich. Man könnte auch eine Dialogbox mit Fehlermeldung usw. einfügen. Nur wozu den User in seinen Möglichkeiten (und Namen) beschneiden?


Anmelden zum Antworten