Kleines Programm zu Arrays, erste "Gehversuche", bitte einmal drübergucken



  • Hallo,

    ich habe mich jetzt mal an Arrays rangetraut und folgendes kleines Prog. zusammengebastelt:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
      int i=0;
      int arrayGroesse=0;
      int testfeld[arrayGroesse];
    
      printf("Spielereien mit Pointern und Arrays V.0.1\n");
      printf("\tHeute: 1D-Felder\n\n");
    
      printf("Feldgroesse eingeben: ");
      scanf("%d",&arrayGroesse);
      getchar();
    
      printf("\n\nFeld der Groesse %d wird angelegt...\n\n",arrayGroesse);
    
      for(i=0;i < arrayGroesse; i++)
      {
         printf("i = %d \n",i);
         printf("bitte %d .Feldwert eingeben: ",(i+1));
         scanf("%d", &testfeld[i]);
      }
    
      printf("\nFeldwerte gesetzt...\n");
    
      for(i=0;i < arrayGroesse; i++)
      {
         printf("Der %d. Feldwert ist: %d\n",(i+1),testfeld[i]);
      }
    
      system("PAUSE");	
      return 0;
    }
    

    Jetzt ein paar Fragen dazu:

    1. Kann ich das Array so ohne Probleme mit der Variablen definieren, um die Größe über eine Eingabe zu regeln?

    2. Für den Kurzen Code kompiliert mein Rechner vergleichsweise ewig, woran kann das liegen? Ich habe wirklich keine schlechte Kiste hier stehen (QuadCore 6600, 4Gb RAM etc...)

    3. Alles, aber wirklich alles was sch***, falsch oder so kritisieren 😉 Falls jemand eine alternative Lösung hat, immer her damit, freu mich riesig über andere Möglichkeiten!

    Vielen Dank im Voraus an euch alle! 🙂

    Grüße
    chmbw

    PS: Falls da etwas gut gelöst sein sollte darf das natürlich auch sehr gerne erwähnt werden 😉 🙂



  • also ansich sieht das schon ganz nett aus, ich verwende für statische arrays deren größe im source code vorgegeben ist eigentlich immer ein #define da ich dann nicht zufällig die größe ändern kann und schreibs dann groß damits mir gleich ins auge springt... also

    #define ARRAY_GROESSE 10
    ....
    int testfeld[ARRAY_GROESSE];
    

    statt

    int arrayGroesse=0;
    int testfeld[arrayGroesse];
    

    was du wolltest ist eher ein dynamisches array da du zur laufzeit mit
    scanf("%d",&arrayGroesse); den user die größe eingeben lassen willst.
    in diesem fall sollte das ungefähr so aus schauen

    int arrayGroesse;
    int *testfeld;
    
    printf("Feldgroesse eingeben: ");
    scanf("%d",&arrayGroesse);
    getchar();
    //man sollte ja immer davon ausgehen das was ein user falsch eingeben kann auch
    //falsch eingegeben wird also evtl. arrayGroesse noch testen, fehlt hier noch...
    testFeld = malloc(arrayGroesse * sizeof(int));
    if(testFeld == NULL){
        printf("hab kein speicher");
        exit(1);
    }
    

    wenn du dir den wert ausgeben lässt mach lieber

    printf("Der %d. Feldwert ist: %d\n",i,testfeld[i]);
    

    statt

    printf("Der %d. Feldwert ist: %d\n",(i+1),testfeld[i]);
    

    sonst ist dein index immer um eins höher als das wo die daten am ende drin stehen und das kann dich doch dann schon ganz schön verwirren

    lg lolo



  • Ich würde dir eher ein const int arrayGroesse empfehlen. Das const verhindert dass du es versehentlich überschreibst und im Gegensatz zu #defines hat weiß der Compiler davon.

    Welchen Compiler nimmst du denn? Der gcc zum Beispiel kann das Programm so schnell wie möglich bauen, ohne zu optimieren oder auch auf Laufzeitgeschwindigkeit optimieren was dann länger dauert oder auf Größe optimieren was auch länger dauert. Vielleicht liegt es daran. Aber einige Sekunde braucht er schon, Kompilieren ist nicht so einfach.

    Dein i solltest du nicht global definieren. Also Zeile 6 weg und stattdessen for (int i = 0; i<arrayGroesse; i++). Damit ist i nur innerhalb der for-Schleife sichtbar und du kannst später i anders definieren wenn du zum Beispiel mal ein unsigned long int i brauchst oder so.

    Das i+1 ist schon in Ordnung wenn du dem Nutzer nicht zumuten willst bei 0 anzufangen zu zählen, aber die Klammern sollten weg.

    Und das mit den dynamischen Arrays wie noobLolo schon geschrieben hat.



  • erstmal herzlichen Dank für eure Antworten! 🙂
    Was mir aber noch nicht 100% klar ist, was ist genau das Problem mit meiner Lösung das Array mit einer Variable als Feldgröße zu definieren?



  • also du kannst mir ja nicht erzählen das das bei dir ohne fehler gelaufen ist, außer du hast mächtig glück gehabt.

    nwp2 schrieb:

    Das i+1 ist schon in Ordnung wenn du dem Nutzer nicht zumuten willst bei 0 anzufangen zu zählen, aber die Klammern sollten weg.

    wenn er schreibt erste "Gehversuche" dann ist das für ihn und er sollte sich doch schon mal an die 0 gewöhnen...

    [quote="nwp2"]Dein i solltest du nicht global definieren.[quote]
    das sehe ich anders functions "global" gefällt mir das schon.

    [quote="chmbw"]Was mir aber noch nicht 100% klar ist, was ist genau das Problem mit meiner Lösung das Array mit einer Variable als Feldgröße zu definieren?
    [quote]

    du legst ein array an mit größe 0 und zwar hier

    int arrayGroesse=0;
    int testfeld[arrayGroesse];
    

    da geht jetzt erstmal nix rein da es ja statisch ist und länge 0 hat!!!
    und auch wenn du arrayGroesse später änderst was du exact hier machst

    scanf("%d",&arrayGroesse);
    

    ändert das nix daran das testfeld[] immer noch die länge 0 hat.
    und dann geht der spaß los denn du schreibst fröhlich in testfeld[0],testfeld[1] usw. die es garnicht gibt.



  • ah, okay...der Witz ist, ich hatte wirklich keine Fehlermeldungen und es wurde alles wieder so ausgegeben, wie ich wollte, also anscheinend totaler Zufall?!

    Und ich habe das richtig verstanden, jedes Feld was ich so anlege:

    int feld1[10];
    

    ist immer statisch? Also kann ich das nicht von der Größe her fröhlich verändern, außer ich programmiers wie in deinem Beispiel?

    Herzlichen Dank, wieder was gelernt 😉 🙂



  • chmbw schrieb:

    Und ich habe das richtig verstanden, jedes Feld was ich so anlege:

    int feld1[10];
    

    ist immer statisch? Also kann ich das nicht von der Größe her fröhlich verändern, außer ich programmiers wie in deinem Beispiel?

    bingo, du kannst natürlich da c die größe nicht testet hinschreiben wo du willst aber da bekommst fürher oder später ne fehler meldung also bitte darauf achten 🙂



  • chmbw schrieb:

    int feld1[10];
    

    ist immer statisch? Also kann ich das nicht von der Größe her fröhlich verändern...

    ja, es werden 10 ints dafür reserviert. jeder zugriff ausserhalb von feld[9] zielt irgendwo anders hin und es kracht (oder auch nicht). brauchste das feld dynamisch, nimm malloc (free nicht vergessen), alloca(), oder C99 VLAs.
    🙂



  • alles klar, danke euch! Dann mach ich mich jetzt mal an die dynamische Version 😃


Anmelden zum Antworten