aaray größe durch benutzer angeben



  • nabend,

    also ich möchte die größe eines 2 Dimensionalen Arrays durch eine Benutzereingabe festlegen können. DEmnach kommt er ein bischen printf und scanf welches die beiden werte einließt und danach int array[?][?]macht.

    Hat jemand eine Idee wie ich das realisieren kann ?



  • Ist eines der standard Probleme.
    Ich gehe mal davon aus das du eine 2dim Integer array anlegen willst.

    besorg dir ein gutes Buch oder eines der Tutorials aus dem Forum und les dich noch deutlich tiefer
    in C ein

    Für deine Lösung braucht du:
    Die Funktionen:
    printf, fgets, sscanf, calloc, free, return

    Sprachelemente
    for Schleife
    if
    Variablen deklaration
    Pointer
    Parameterpassing by Value und bei reference

    Der Code Ausriss hier sollte eigentlich das tun was du willst und soll die beim Einstieg helfen

    #include <stdlib.h> 
    #define STRINGLEN 256
    
    int main()
    {
    int **array;  //hiermit definierts du einen Pointer der auf Pointer zeigt
    int dim_x;    // Dimension X
    int dim_y;    // Dimension Y
    int error;    // Fehlerspeicher
    int i;        // Laufindex
    
    char Buffer[STRINGLEN+1];// das +1 ist eine Marotte
                             // von mir um den üblichen Fehler zu vermeiden das für
                             // die schließende Null kein Platz mehr da ist.
    
    printf("Bitte geben sid die beiden Dimensionen mit Komma getrennt an > "); // erzeugt eine Ausgabe 
                                                                               //im Konsolefenster
    fgets(Buffer,STRINGLEN,stdin); // liest von stdin = Konsole einen String ein
    error=sscanf(Buffer,"%i,%i",&dim_x,&dim_y);  // konvertiert den String in 2 Integer Zahlen
                                                 // die & Zeichen vor dim_y,dim_y sind wichtig
    if (2!=error) 
    {                               // Falls keine zwei Zahlen konvertiert wurden steht in error keine 2
     printf("Fehler in Eingabe");
    return -1;
    }
    
    if (NULL== (array=(int**)calloc(dim_x,sizeof(int))))  // Wenn calloc fehlschlägt ist der returnwert NULL
    // Bei calloc,alloc muß immer der Returnwert geprüft werden ohne Ausnahme
    {
     printf("Fehler in calloc");
    return -2;
    }
    
    for(i=0;i<dim_x;i++)
    {
      if (NULL== (array[i]=(int*)calloc(dim_y,sizeof(int))))  // Wenn calloc fehlschlägt ist der returnwert NULL
    // Bei calloc,alloc muß immer der Returnwert geprüft werden ohne Ausnahme
      {
       printf("Fehler in calloc");
       return -3;
      }
    }
    //.....
    
    //.... Das freigeben vor Ende nicht vergessen
    return 0;
    }
    


  • Dazu hätte ich noch eine andere Frage ich bräuchte ein zweidimensoinalen Array wo die Spalten Anzahl des Array konstant ist.
    Aber die Zeilen Anzahl des Arrays unbekannt ist das heisst es müsste sogesagt immer ein neuer Array Satz angefügt werden.
    Hier mal mein pseudo Code:

    char **action;
    char *daten1, *daten2, *daten3, *daten4;
    
    daten1 = "TEST1";
    daten2 = "TEST2";
    daten3 = "TEST3";
    daten4 = "TEST4";
    
    action = (char **)malloc(UNBEKANNT*sizeof(char));
    for(int n = 0;n <= UNBEKANNT; n++)
    {
    action[n] = (char*) malloc(4*sizeof(char));
    
    action[n][0] = daten1;
    action[n][1] = daten2;
    action[n][2] = daten3;
    action[n][3] = daten4;
    }
    

    Wie wäre sowas möglich ?

    Gruss
    franzis



  • äh was willst du jetzt genau machen?
    brauchst du nur ein 1d-array von strings(die ja wiederum selber 1d-char-arrays sind und deswegen dann insgesammt ein 2d array rauskommt)
    oder willst du ein 2d-array von strings anlegen(wofür du dann ein 3d-array bräuchtest...



  • ich bräuchte eins damit ich auf die Daten mittels action[1][4] zugreifen kann.<- Also 1 Zeile Spalte 4.
    usw. Wobei bei mir die Spalten fest sind (nämlich 4 gross) aber eben die Zeilen unbekannt sind.

    Gruss
    franzis



  • in action[1][4] soll dann "TEST1" stehen

    - Sind alle deine Strings gleich lang oder kannst du zumindest eine maximallänge angeben.
    - Weist du zu dem Zeitpunkt an dem du die Daten einträgst wieviele Zeilen du hast?

    Falls du diesen Frage mit ja beantwortest kann man es damit lösen

    char ***array;
    
    if (NULL== (array=(char***)calloc(UNBEKANNT,sizeof(char*)))) // UNBEKANNT ist dir zu diesem Zeitpunkt bekannt
    {
     printf("Fehler in calloc");
    return -2;
    }
    
    for(i=0;i<UNBEKANNT;i++)
    {
      if (NULL== (array[i]=(char**)calloc(4,sizeof(char*))))
      {
       printf("Fehler in calloc");
       return -3;
      }
      for(j=0;j<4;j++)
      {
         if (NULL== (array[i][j]=(char**)calloc(MAXSTRLEN,sizeof(char*))))
         {
         printf("Fehler in calloc");
         return -4;
         }
      }
    }
    

    Falls du die Fragen nicht alle mit ja beantworten kannst, erzähl mal was du an dieser Stelle vorhast vielleicht findern sich dann auch noch andere Lösungen

    🙂 Viel Spaß



  • Sind alle deine Strings gleich lang oder kannst du zumindest eine maximallänge angeben.

    Nein kann ich nicht da die Strings alle unterschiedlich sein können.

    Weist du zu dem Zeitpunkt an dem du die Daten einträgst wieviele Zeilen du hast?

    Ne Zeilen nicht aber Spalten 😉

    Also dann erzähle ich mal was ich konkrett vorhabe:
    Ich habe eine xml Datei davon lese ich jetzt einige elemente heraus. Im jedem element sind attribute vorhanden.
    Aufbau der xml Datei ist hier zu sehen:

    <element value="Hello" value1="World" value2="!" value3=":)"/>
    <element value="Das" value1="ist" value2="ein" value3="Test!"/>
    usw.
    

    Jetzt müssen alle Werte irgendwie abgespeichert werden (dafür dachte ich ein mehrdimensionales Array) damit die Werte in einer Endlosschleife ausgegeben werden können. Damit die Endlosschleife mein Hauptprogramm nicht behindern mach ich die in ein eigenen Threads.
    Das einzige Problem ist das die Werte von der xml Datei irgendwie intern abgespeichert werden müssen weil sonst müsste ich ja die werte jedes mal neu aus der xml Datei einlesen und das ist Unschön.
    Tja und dafür wäre ein mehrdimensonales Array eigentlich Ideal nur weiss ich nicht wieviele Elemente hineinkommen ich könnte zwar zuerst alles zählen und dann neu das Array anlegen aber das ist irgendwie wieder unschön da ich die xml Datei zwei mal einlesen muss.

    MFG
    franzis



  • Hast du dir schon mal überlegt diese Daten in eine Baum/verkettete/lineare Liste einzulesen?
    Das sind jetzt ein paar methoden um dies zu tun. prüf mal ob eine solche dynamische Methode passt.
    Wenn du fragen dazu hast oder diese Methoden nicht kennst frag. 😃



  • Hast du dir schon mal überlegt diese Daten in eine Baum/verkettete/lineare Liste einzulesen?
    Das sind jetzt ein paar methoden um dies zu tun. prüf mal ob eine solche dynamische Methode passt.
    Wenn du fragen dazu hast oder diese Methoden nicht kennst frag.

    Hmm kannten tue ich die noch nicht wirklich nur so am Rande mal gehört.
    Habe mich aber mal eingelesen in den Thema und anscheinend wäre das wirklich was für mich. Ich werde mal versuchen eine lineare Liste für mein Problem zu erstellen.
    Werd mich dann nochmal melden wenn es geklappt bzw. nicht geklappt hat 😉

    Gruss
    franzis



  • Habe jetzt eine lineare Liste erstellt und siehe da bei meiner Testfunktion hat es auf Anhieb funktioniert.
    Morgen schaue ich mal ob es keine Probleme gibt wenn ich das ganze auf ein Thread auslagere.

    gn8
    franzis



  • ich nochmal 🙂

    erst mal danke pad für den code.

    eigentlich wollte ich ein 4 gewinnt spiel machen wo der user die spielfeld größe bestimmt. dieses wollte ich mit einem dynamischen array lösen. dummerweise kenne ich mich bis jetzt nur in dynmaschen listen aus.
    gibt es eine möglichkeit das spiel mit structs zu verwirklichen ? (hänge grad ein bischen aufm schlauch und wüßte nicht wie 😕 )


Anmelden zum Antworten