Anzeige:
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 15 von 34

Thema: Array durchlaufen C

  1. #1
    Registrierter Benutzer
    Registriert seit
    28.07.2003
    Beiträge
    27

    Array durchlaufen C

    Hi

    Ein eindimensionales Array kann man ja bequem so mit Zufallszahlen füllen.

    Code:
    int field [5];
    
    for (i = 1; i <= 5; i ++) { 
         
          *(field+i) = (rand() %6);
    }
    aber wie kann man ein mehrdimensionales Array sagen wir

    Code:
    int field [7][10];
    bequem mit Zufallszahlen auffüllen.

    Mir fällt irgendwie keine effizente Lösung ein da ich noch nicht so mit Programmieren vertraut bin.

    Ich dachte ich frage weil es in C sicher eine elegante Lösung gibt und ich sie gerne sehen möchte.

    mfg peecee
    Geändert von peecee (28-07-2003 um 19:58 Uhr)

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486

    Re: Array durchlaufen C

    Original geschrieben von peecee
    [B]
    Code:
    int field [5];
    
    for (i = 1; i <= 5; i ++) { 
         
          *(field+i) = (rand() %6);
    }
    Array-Indices in C beginnen bei 0,und gehen bis n -1.
    Also ist deine Variante falsch.
    Außerdem ist der Code leichter lesbar,wenn du auf das Array so zugreifst
    Code:
    for(i = 0;i < 5;i++)
        field[i] = ...
    aber wie kann man ein mehrdimensionales Array sagen wir
    int field [7][10];
    bequem mit Zufallszahlen auffüllen.
    Entweder mit zwei verschachtelten for-Schleifen,oder du holst dir einen Zeiger auf das 1.Element,und läufst mit einer for-Schleife von 0 bis 7*10-1.

  3. #3
    Registrierter Benutzer
    Registriert seit
    28.07.2003
    Beiträge
    27
    Mich interesiert die Zeiger Variante mehr.

    ein Zeiger auf das Erste Element meines Arrays wäre ja "*field"

    warum geht das nicht ?

    Code:
    for(i=0 ; i<=68 ; i++) {
    			
    	*(field+i) = (rand() %6);
    		
             printf("%d\n", *(field+i));
    }
    dann kommt eie Meldung in der Art "Operands auf = have illegal types

    Ich denke mal der Zeiger auf das Erste Element ist nicht richtig .

    Kannst du mir die Lösung verraten.

    mfg
    Geändert von peecee (29-07-2003 um 10:56 Uhr)

  4. #4
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    1D-Array
    Code:
    int field[10];
    int *pInt = &field[0];
    
    for(;pInt != field + 10;++pInt)
        *pInt = rand();
    2D-Array
    Code:
    int field2D[3][7];
    int *pInt = &field2D[0][0];
    
    for(;pInt != &field2D[0][0] + 3 * 7;++pInt)
        *pInt = rand();

  5. #5
    Registrierter Benutzer
    Registriert seit
    28.07.2003
    Beiträge
    27
    Danke für die Lösung !!!

  6. #6
    Registrierter Benutzer
    Registriert seit
    19.04.2001
    Beiträge
    159
    Original geschrieben von wraith
    2D-Array
    Code:
    int field2D[3][7];
    int *pInt = &field2D[0][0];
    
    for(;pInt != &field2D[0][0] + 3 * 7;++pInt)
        *pInt = rand();
    imho ein schönes Beispiel warum man in C nicht alles machen sollte, was möglich ist.
    Das versteht doch nacher niemand mehr!

    Ich würde da eher die "klasische" Methode empfehlen:

    Code:
    int felt[3][7]
    int i,j;
    
    for (i=0; i <= 3; i++)
      for(j=0; j<= 7;j++)
        feld[i][j] = rand();

  7. #7
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Original geschrieben von cybercrow

    Ich würde da eher die "klasische" Methode empfehlen:

    Code:
    int felt[3][7]
    int i,j;
    
    for (i=0; i <= 3; i++)
      for(j=0; j<= 7;j++)
        feld[i][j] = rand();
    Herrlich,und schon zwei Fehler drin .

    Btw. der OP wollte die Pointer-Variante.

  8. #8
    Registrierter Benutzer
    Registriert seit
    19.04.2001
    Beiträge
    159
    Original geschrieben von wraith
    Herrlich,und schon zwei Fehler drin .
    ok, die Grenzen sind falsch, habe halt schon eine weile nichts mehr in C gemacht:

    Code:
    int feld[3][7]
    int i,j;
    
    for (i=0; i <= 2; i++)
      for(j=0; j<= 6;j++)
        feld[i][j] = rand();
    das ändert aber nichts an meiner Grundaussage.

    Btw. der OP wollte die Pointer-Variante.
    ja, trotzdem würde ich sowas nie verwenden...

  9. #9
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Original geschrieben von cybercrow

    das ändert aber nichts an meiner Grundaussage.
    Die ich aber schon in meinem ersten Post aufgegriffen hatte
    >>Außerdem ist der Code leichter lesbar,wenn du auf das Array so zugreifst

    Aber der OP wollte ebend lernen .

  10. #10
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Original geschrieben von wraith
    Original geschrieben von cybercrow
    Code:
    int felt[3][7]
    int i,j;
    
    for (i=0; i <= 3; i++)
      for(j=0; j<= 7;j++)
        feld[i][j] = rand();
    Herrlich,und schon zwei Fehler drin
    mir fällt gerade auf, dass es sogar drei Fehler sind :P

    Code:
    int felt[3][7]; //hier
    int i,j;
    
    for (i=0; i <= 2; i++) //hier
            {
            for(j=0; j<= 7;j++) //und hier
                    {
                    feld[i][j] = rand();
                    }
            }
    BTW: Die gescheiften Klammern sollte man auch setzen, wenn man nur einen Befehl hat und ein Block somit unnötig ist - ist einfach besserer Programmierstil weil übersichtlicher, konsequenter und fehlerunanfälliger (wenn man z.B. mal einen 2. Befehl einfügen will).

  11. #11
    Registrierter Benutzer
    Registriert seit
    19.04.2001
    Beiträge
    159
    Original geschrieben von BLUESCREEN3D

    BTW: Die gescheiften Klammern sollte man auch setzen, wenn man nur einen Befehl hat und ein Block somit unnötig ist - ist einfach besserer Programmierstil weil übersichtlicher, konsequenter und fehlerunanfälliger (wenn man z.B. mal einen 2. Befehl einfügen will).
    Wenn wir jetzt schon mit dem Erbsenzählen anfangen, dann richtig

    Code:
    int feld[3][7];
    int i,j;
    
    for (i=0; i <= 2; i++) {
            for(j=0; j <= 7; j++) {
                    feld[i][j] = rand();
            }
    }
    Für öffnende Klammer fängt man normal keine neue Zeile an (ausnahme Funktionen)!

  12. #12
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Original geschrieben von cybercrow

    Für öffnende Klammer fängt man normal keine neue Zeile an (ausnahme Funktionen)!
    Dir ist klar,daß es darum schon blutige Flamewars gegeben hat .
    Was ich damit sagen,es ist eine Stilfrage,und in C/C++ setze ich die öffnende Klammer immer auf eine neue Zeile (bei Java komischerweise nicht).

    Aber wenn ich nach den Gurus gehe,dann preferrieren die doch auch meine Variante.

  13. #13
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    Original geschrieben von cybercrow
    Wenn wir jetzt schon mit dem Erbsenzählen anfangen, dann richtig
    Für öffnende Klammer fängt man normal keine neue Zeile an (ausnahme Funktionen)!
    dass is nur eine sache der betrachtung!

    ich mache auch lieber
    for...
    {
    ...
    }

    weil ich somit die blöcke in meiner betrachtung primär im blickfeld habe

    im gegensatz zu
    for... {
    ...
    }

    da hat man dann den befehl im blickfeld nicht aber den block...

    ist 1. geschmacksache, und 2. gewohnheit...

    also bitte keinen flame jetzt wegen sowas

    mfg

  14. #14
    Registrierter Benutzer
    Registriert seit
    19.04.2001
    Beiträge
    159
    Original geschrieben von wraith
    Was ich damit sagen,es ist eine Stilfrage,und in C/C++ setze ich die öffnende Klammer immer auf eine neue Zeile (bei Java komischerweise nicht).

    Aber wenn ich nach den Gurus gehe,dann preferrieren die doch auch meine Variante.
    Wer sind die "Gurus"?
    Also der Linux coding-style hält sich stark an K&R und da wird keine neue Zeile angefangen und um mal den linux-coding-style zu zitieren:
    " but all right-thinking people know that (a) K&R are right and (b) K&R are right."

    Bei gnu-coding-style wird eine neue Zeile angefangen, dafür wird aber bei einer einzigen Zeile nicht geklammert. Beispiel:
    Code:
    if (x < foo (y, z))
      haha = bar[4] + 5;
    else
      {
        while (z)
          {
            haha += foo (z, z);
            z--;
          }
        return ++x + bar ();
      }
    Ich würde sagen dadurch gleicht sich der "Platzverbrauch" einigermaßen aus. Immer klammern und dann auch noch jedesmal eine neue Zeile halte ich aber für etwas übertrieben...

    Die beiden styles würde ich mal als die zwei "Haupt-styles" bezeichnen.
    BLUESCREEN3Ds code passt aber auf keiner der beiden styles


    PS: Ich bevorzuge eigentlich zu einem großen Teil den gnu-style, deswegen habe ich in meinem ersten Beispiel auch die Klammern weg gelassen.
    Geändert von cybercrow (30-07-2003 um 15:21 Uhr)

  15. #15
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Original geschrieben von cybercrow
    Wer sind die "Gurus"?
    Chris Torek,Richard Heathfield,Sutters,Alexandrescu...
    Also der Linux coding-style hält sich stark an K&R und da wird keine neue Zeile angefangen und um mal den linux-coding-style zu zitieren:
    Ich liebe den L.T Kernel Style Guide,den ziehe ich mir immer an regnerischen Tagen rein.Was hab' ich gelacht
    Tabs are 8 characters, and thus indentations are also 8 characters.
    There are heretic movements that try to make indentations 4 (or even 2!)
    characters deep, and that is akin to trying to define the value of PI to
    be 3.
    Der Mann hätte Komiker werden können.

    " but all right-thinking people know that (a) K&R are right and (b) K&R are right."
    Woher hat er das?
    Zitat: The Practice of Programming (B.W Kernighan)
    Use a consistent indentation style and brace style.[...]Programmers have always argued about the layout of programs,but the specific style is much less important than its consistent application.Pick one style,use it consistently and don't waste time arguing.
    Wenn er es aus den Quelltexten der Bücher abgeschaut hat,dort verwendent Sie Tabs mit 4 Leerzeichen ,und ich dachte K&R hätten immer Recht .


    Bei gnu-coding-style wird eine neue Zeile angefangen, dafür wird aber bei einer einzigen Zeile nicht geklammert.
    Ja,das deckt sich mit meinem Stil.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •