zweidimensionale Array



  • Abend,
    folgender Code:

    int i = 0;   
    char temp[4][80];
    temp[i] = "irgendwas";
    

    Wird auf Spalte oder auf Zeile 0 zugegriefen?



  • Damit schreibst du in temp[0][0] bis temp[0][9]. Warum probierst du es nicht einfach aus?



  • _matze schrieb:

    Damit schreibst du in temp[0][0] bis temp[0][9].

    nö, es wird nur ein pointer zugewiesen. das ist ja kein 'strcpy' oder sowas.
    🙂



  • ~fricky schrieb:

    _matze schrieb:

    Damit schreibst du in temp[0][0] bis temp[0][9].

    nö, es wird nur ein pointer zugewiesen. das ist ja kein 'strcpy' oder sowas.
    🙂

    Oh je, oh je, klar... 🤡 🤡 Ist es denn schon so spät? Hmpf...



  • ich hab' auch gepennt. der code sollte nicht compilen. einem 2d-array kann man nichts zuweisen, wenn nur eine dimension angegeben wird. ein char[][] ist ja kein char[]* und auch kein char**. trotz der ganzen array-threads in letzter zeit, haben wir beide das wohl noch immer nicht gecheckt.
    🙂



  • Damit schreibst du in temp[0][0] bis temp[0][9]. Warum probierst du es nicht einfach aus?

    Habe es getestet und du hast recht.
    😉

    der code sollte nicht compilen.

    Der Code lässt sich ohnen einen kleinen Fehler compilen.



  • Der Code lässt sich ohnen einen kleinen Fehler compilen.

    Seltsam.
    Mein gcc sagt:

    main.c: In function `main':
    main.c:11: error: incompatible types in assignment
    


  • Dimension schrieb:

    Der Code lässt sich ohnen einen kleinen Fehler compilen.

    also bei mir sagt der GCC

    x.c: In function `main':
    x.c:5: error: incompatible types in assignment
    

    EDIT: too late...



  • Ums komplett zu machen: 😉

    Der MS-Compiler sagt:

    error C2440: '=': 'const char [10]' kann nicht in 'char [80]' konvertiert werden

    Er sagte ja auch "Der Code lässt sich ohnen einen kleinen Fehler compilen". Und einen kleinen Fehler würde ich das nicht nennen. Insofern haben alle Recht! 😉



  • /* form.c */
    #include <stdio.h>
    #include <stdlib.h>
    #define NUMITEMS 4
    char *namen[4] = {
       "Jürgen", "Fatma", "Gismo", "Jonathan"
    };
    int main(void) {
       int schleife;
       char temp[4][80];
       char name[20];
       int alter;
       long lohn;
       /* Wir erstellen Namen, Alter und Gehalt. Alter und Gehalt
        * werden durch Zufallszahlen erzeugt. Mit sprintf schreiben
        * wir die Daten formatiert int temp */
       for (schleife = 0; schleife < NUMITEMS; ++schleife)
          sprintf(temp[schleife], "%s %d %ld"
             ,namen[schleife], rand()%20+18, rand()+27500L);
       /* Wir erstellen eine Kopfzeile */
       printf("%4s | %-20s | %5s | %9s\n",
           "#","Name","Alter","Gehalt");
       printf(" ----------------------------------------"
              "----------\n");
       /* Mit sscanf lesen wir die Daten formatiert aus temp aus,
        * dort wo wir zuvor mit sprintf die Daten formatiert
        * geschrieben haben */
       for (schleife=0; schleife < NUMITEMS; ++schleife) {
          sscanf(temp[schleife],"%s %d %ld",&name,&alter,&lohn);
          printf("%4d | %-20s | %5d | %9ld\n",
             schleife+1,name,alter,lohn);
       }
       PAUSE
       return EXIT_SUCCESS;
    }
    

    Des ist der komplette code und da gibts kein Fehler beim gcc.



  • Da machst du's ja auch mit sprintf, du Witzbold.



  • Ich sagte ja ich bin Anfänger.
    😉
    Was ist da der der Unterschied?



  • Du kannst char* nicht einfach so zuweisen und erwarten, dass dann der Inhalt des rechten Strings (in dem Fall dein Literal) in den linken kopiert wird. Das geht in anderen Sprachen oder in C++ mit std::string, aber eben nicht mit char*. Dafür gibts strcpy/strncpy.

    In Zukunft solltest du Code-Beispiele auch in der Form posten, wie du sie tatsächlich anwendest. Auf das Wesentliche reduzieren ist gut, aber Sachen verändern, vor allem so gravierend, ist natürlich unvorteilhaft...


Anmelden zum Antworten