hilfe bei funktion



  • Hi, habe folgenes Problem, ich möchte ein kleines textbasiertes Spiel schreiben,und dabei auch Funktionen nutzen. Wenn ich nun etwas in der Funktion deklariere, wie kann ich in der Main auf dieser Deklaration zugreifen gibt es da irgend eine möglichkeit ? Hier mein Code, ich weiss das es so nicht funktionieren kann, möchte hiermit nur aufzeigen was ich meine. 😃

    #include <stdio.h>
    #include <stdlib.h>
    
    void name(void)
    {
    char nam[256];
    system("cls");
    printf("Willkommen bei *** bitte gib deinen Namen ein: ");
    scanf("%s",nam);
    return;
    }
    
    int main()
    {
    name();
    system("cls");
    printf("***********************************");
    printf("Name: %s",nam);
    printf("***********************************");
    return 0;
    }
    


  • Gar nicht. Die Variable nam existiert nur innerhalb des Blocks, in dem sie deklariert wurde. Generell ist der Geltungsbereich von Variablen darauf beschränkt:

    int main() { /* main muss übrigens int zurückgeben */
      {
        int x;
      } /* x hört hier auf, zu existieren */
    
      return 0;
    }
    

    Es gibt mehrere Möglichkeiten, damit umzugehen. Am einfachsten wäre in deinem Fall vermutlich, eine Variable per Referenz aus main zu übergeben:

    #include <stddef.h>
    #include <stdio.h>
    
    void lese_name(char *buffer, size_t bufsize) {
      printf("Willkommen bei *** bitte gib deinen Namen ein: ");
      fgets(buffer, bufsize, stdin);
      /* Caveat: fgets behält den Zeilenumbruch. Ggf. muss der von Hand entfernt 
       * werden, etwa
       * 
       * buffer[strlen(buffer) - 1] = '\0';
       */
    }  /* Der Zeiger buffer hört hier auf zu existieren, nicht aber der Speicher,
        * auf den er zeigt (d.h. in diesem Fall die Variable name aus main). */
    
    int main() {
      char name[256];
    
      lese_name(name, 256);
      printf("***********************************\n"
             "Name: %s" /* Der Zeilenumbruch ist hier schon in name enthalten */
             "***********************************\n", name);
    
      return 0;
    }
    

    Alternativ kannst du mit dynamischem Speicher arbeiten, der über das Ende des Blocks, in dem er angefordert wird, bestehen bleibt. Du musst dich um die Freigabe dann selbst kümmern:

    #include <stddef.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    char *lese_name() {
      char *buffer = malloc(256); /* 256 Byte anfordern */;
    
      if(buffer != NULL) { /* Wenn buffer NULL ist, schlug die Speicheranforderung fehl */
        printf("Willkommen bei *** bitte gib deinen Namen ein: ");
        fgets(buffer, 256, stdin);
      }
    
      return buffer;
    }
    
    int main() {
      char *name = lese_name();
    
      if(name == NULL) {
        return -1; /* Fehler */
      }
    
      printf("***********************************\n"
             "Name: %s"
             "***********************************\n", name);
      free(name); /* Speicher freigeben */
    
      return 0;
    }
    


  • Was du machen willst, ist einen String zu übergeben, da die Varuable nam in einer seperaten Funktion steckt, stirbt sie nach der Funktion.
    Du kannst aber bei einer Funktion auch etwas zurückliefern:

    #include <stdio.h>
    #include <stdlib.h>
    
    char *name(void)//Funktion hat den Typ * damit kann man Pointer zurückgeben
    {
        static char nam[256];
        printf("Willkommen bei *** bitte gib deinen Namen ein: ");
        scanf("%s",nam);
        return nam;//Da du einen String brauchst, übergibt du eine Adresse zurück
    }
    
    int main(void)
    {
        char *pPointer=NULL;
        pPointer=name();//Die Adresse von pPointer zeigt jetzt auf die variable nam 
        printf("%s\n",pPointer);//Achtung!: Die adresse muss geprinted werden.
        return 0;
    }
    

    Aufgrund des Stackframes, der nach der Funktion wieder weg ist, musst du die Variable nam als

    static
    

    angeben, damit stirbt sie nicht und du kannst die variable problemolos zurückliefern.

    Wenn du kein static hast, oder sie nicht als Global deklarierst hast, schreit der Compiler!

    Hoffe das hat geholfen.



  • Oh danke für die raschen Antworten, werde mich damit nun erstmal auseinander setzen um es für mich auch zu verstehen was befehle genau machen. Danke euch. 😃


Anmelden zum Antworten