Anfängerfrage: Funktionsaufruf



  • Hallo zusammen,

    da ich coronabedingt gerade etwas mehr Zeit habe, lerne ich gerade Programmieren. Das klappt mal mehr, mal weniger gut. ich bin halt Anfänger 🙂

    Ich habe hier auch ein C++ Buch, indem an jedem Kapitelende Aufgaben zum Üben sind. Nun habe ich ein Problem mit einem Funktionsaufruf. Zunächst einmal die Aufgabe:

    Entwickeln Sie eine Funktion 
    
    int IstPalindrom( int i, int j, char W[N] ) { ... }
    
    die in der Buchstabenfolge W bestimmt, ob die Teilfolge 
    
    W[i], W[i+1], ... , W[j]
    
    ein Palindrom ist. Im positiven Fall soll eine 1 zurückgegeben werden und sonst eine 0. 
    Dabei können Sie 0 <= i <= j > N voraussetzen.
    

    Die Aufgabe bekomme ich als Programm gelöst. Wenn ich nun den Quellcode allerdings in eine Funktion packen und diese aufrufen möchte, bekomme ich eine Fehlermeldung.

    Hier mal wie mein komplettes Programm aussieht:

    #include <iostream>
    using namespace std;
    
    const int N = 4;
    char W[N], V[N];
    
    int IstPalindrom( int i, int j, char W[N] ) // Quellcode tut wohl, aber wie ruft man die Funktion korrekt auf?
    {
    	int x = 0;
    	for ( int k = 0; k < j - i + 1; k++ )
    	{
    		if ( W[i + k] == W[j - k] )
    		{
    			x = x + 1;
    		}
    	}
    	
    	if ( x == j - i + 1 )
    	{
    		return 1;
    	}
    	else
    	{
    		return 0;
    	}
    }
    
    int main()
    {
    	int i, j;
    	char V[N] = {'o', 't', 't', 'o'};
    	
    	cout << "Startchar? "; cin >> i;
    	cout << "Endchar? "; cin >> j;
    	IstPalindrom( i, j, V[N] );
    	
    	system("PAUSE");
    }
    

    Erfahrene Programmierer bekommen die Aufgabe bestimmt eleganter gelöst, mir geht es jetzt primär um den Funktionsaufruf bzw. weshalb es da eine Fehlermeldung gibt.

    Die Fehlermeldung, die ich bekomme sieht folgendermaßen aus:

    Aufgabe 6_2.cpp: In function 'int main()':
    Aufgabe 6_2.cpp:35:25: error: invalid conversion from 'char' to 'char*' [-fpermissive]
       35 |  IstPalindrom( i, j, V[N] );
          |                      ~~~^
          |                         |
          |                         char
    Aufgabe 6_2.cpp:7:38: note:   initializing argument 3 of 'int IstPalindrom(int, int, char*)'
        7 | int IstPalindrom( int i, int j, char W[N] ) // Quellcode tut wohl, aber wie ruft man die Funktion korrekt auf?
          |                                 ~~~~~^~~~
    

    Wie ihr seht habe ich die Arraylänge mal fix auf N=4 gesetzt. Ich bekomme auch Fehler, wenn ich die Funktion folgendermaßen aufrufe:

    IstPalindrom( i, j, {'o', 't', 't', 'o'} );
    

    Kann mir bitte jemand helfen, wie ich die Funktion korrekt aufrufe bzw. wo das Problem liegt?

    Grüße
    Planloser


  • Gesperrt

    Dieser Beitrag wurde gelöscht!


  • @Planloser sagte in Anfängerfrage: Funktionsaufruf:

    IstPalindrom( i, j, V[N] );

    einfach IstPalindrom( i, j, V ); - das N in der Deklararion wird nämlich ignoriert. Da könnte auch
    int IstPalindrom( int i, int j, char W[] ) oder int IstPalindrom( int i, int j, char *W ) stehen.

    Viel allgemeiner aber: dieses Herumhantieren mit char-Arrays würde ich schnellstmöglich sein lassen. Stattdessen nimmst du besser einen std::string, wenn du eine Zeichenkette hast!

    Gib deinen Variablen außerdem bessere Namen. Was ist "V"?

    Statt: char V[N] = {'o', 't', 't', 'o'};
    Kannst du schreiben: char V[] = "otto"; (gut, dann bekommst du hinten noch ein \0 dran).
    Oder noch besser: std::string V = "otto"; (bzw für V noch einen besseren Namen finden, bitte nicht nur einbuchstabige Variablen verwenden!)

    Außerdem hast du globale Variablen char W[N], V[N];. Vermeide globale Variablen wie die Pest. Du brauchst sie hier auch nicht, du hast ja auch noch ein lokales V, das dein globales V verdeckt. Entferne die globalen W und V also komplett.

    Auch wenn die Aufgabe was anderes sagt, solltest du trotzdem auch checken, dass die beiden eingegebenen Zahlen im erlaubten Bereich liegen!



  • @Planloser sagte in Anfängerfrage: Funktionsaufruf:

    int IstPalindrom( int i, int j, char W[N]

    Das steht so im Buch? Mit char W[N]?



  • Vielen Dank für die Antwort. Jetzt funktioniert die Funktion und macht auch das was sie soll.

    Dass Zeichenketten strings genannt werden, habe ich bereits gesehen, in dem Buch wurde das aber bisher nicht behandelt. Ich vermute das kommt irgendwann noch.

    Auch die Anmerkung bzgl. der globalen Variablen werde ich beherzigen. Im Buch wurden sie bereits behandelt, so wirklich klar, wann man was verwenden sollte, war mir aber nicht. Ich wusste lediglich, dass man mit ::b doch auf die globale Variable b zugreifen kann, wenn es auch eine lokale Variable b gibt.

    Ich habe nochmal nachgeschaut, ob ich mich möglich verschaut habe, aber im Buch steht char W[N].

    Nochmals vielen Dank für die Antworten. Wenn ich wieder irgendwo hänge, werde ich mich wieder melden. Vielleicht kann ich dann irgendwann auch mal jemandem helfen.



  • @Planloser sagte in Anfängerfrage: Funktionsaufruf:

    Ich habe nochmal nachgeschaut, ob ich mich möglich verschaut habe, aber im Buch steht char W[N].

    Welches Buch ist das?