Anzahl von Arrays durch for-Schleife erstellen.



  • Hallo Community,
    ist es möglich mittels einer for-Schleife eine bestimmte Anzahl von Arrays zu deklarieren?
    Pseudocode:

    for (int k=0; k<5; i++) int array[k];
    

    Mir ist klar, dass wenn ich array[k] schreibe, ein Array mit 5 Elementen erhalte. Eigentlich möchte ich aber fünf leere arrays erstellen. Kann mir bitte jemand erklären wie ich das realisieren kann? Ich hoffe mein Pseudocode ist nicht zu verwirrend.
    Viele Grüße,
    Saul

    edit: ups ... ähm, wollte das Thema eigentlich in der Rubrik C (C89 und C99) erstellen ... sorry



  • also wenn ich das richtig versteh möchtest du ein 2 dimensionales array
    das funktioniert so:

    int ** arr[] = new int*[5];
    for(int i=0; i<5; i++){
      arr[i] = new int[3];
      arr[i][0] = 1;
      arr[i][1] = 2;
      arr[i][2] = 3;
    }
    

    so kannst du ein 2d feld basteln in dem steht dann drin:

    i=0 : 1 2 3
    i=1 : 1 2 3
    i=2 : 1 2 3
    i=3 : 1 2 3
    i=4 : 1 2 3

    cu LT



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum WinAPI in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • LordTerra schrieb:

    also wenn ich das richtig versteh möchtest du ein 2 dimensionales array
    das funktioniert so:

    int ** arr[] = new int*[5];
    for(int i=0; i<5; i++){
      arr[i] = new int[3];
      arr[i][0] = 1;
      arr[i][1] = 2;
      arr[i][2] = 3;
    }
    

    cu LT

    Hey Lord,
    ja genau sowas meinte ich. Habs jetzt noch ein wenig erweitert, um die fünf Arrays dynamisch zu halten. Dummerweise bekomme ich das nich recht zum laufen.

    int anzahl[5];
    int wert; // wird bei jedem Schleifendurchlauf neu bestimmt
    int **array = new int*[5];
    
    for(int k = 0; k < 5; k++)
    {
        wert = setWert();
        anzahl[k] = wert;
        array[k] = (int *)malloc(anzahl[k] * sizeof(int));
        ...
    }
    

    Den ersten Array legt er noch an, aber wenn k = 1 bricht er ab und spukt mir nur folgende Fehlermeldung aus:

    Windows hat einen Haltepunkt in test.exe ausgelöst.

    Dies kann auf eine Beschädigung des Heaps zurückzuführen sein, die auf ein Problem in test.exe oder in einer der geladenen DLLs hinweist.

    Dies kann auch darauf zurückzuführen sein, dass der Benutzer F12 drückt, während test.exe den Fokus hat.

    Weitere Analyseinformationen finden Sie möglicherweise im Ausgabefenster.

    Liegt das am fehlenden "new" in der Zeile "array[k] = (int *)malloc(anzahl[k] * sizeof(int));" ?



  • Mit new wird das jetzt aber wieder C++

    int anzahl[5];
    int wert; // wird bei jedem Schleifendurchlauf neu bestimmt
    int *array[5];  // Ein Feld mit 5 Zeigern auf int
    
    for(int k = 0; k < 5; k++)
    {
        wert = setWert();
        anzahl[k] = wert;
        array[k] = (int *)malloc(anzahl[k] * sizeof(int));
        ...
    }
    

    Du kannst auch

    int **array;
    ....
        array = (int **)malloc(5 * sizeof(int*)); // Die 5 ist aus deinem Beispiel
    


  • Ein 2d-Array mit 5x5 kannst du so deklarieren:

    int array[5][5];
    

    Hier ein 2d-Array mit verschieden langen Zeilen bzw. Spalten mit malloc und for

    int anzahlArr = 5;
    
    int **array = malloc(anzahlArr * sizeof(int*));
    for( int i = 0; i < anzahlArr; i++) {
       array[i] = malloc( (i+1) * sizeof(int));
    }// nun hast du 5 verschieden lange arrays
    

    Edit: kleine Verbesserung:

    int **array = malloc(anzahlArr * sizeof(array));
    for( int i = 0; i < anzahlArr; i++) {
       array[i] = malloc( (i+1) * sizeof(**array));
    }// nun hast du 5 verschieden lange arrays
    

    denk an free()



  • Also laut galileocomputing muss ich die arrays so deklarieren, wie gary1195 es gemacht hat.

    int ** array;
    array = malloc(5 * sizeof(int *));
    for(i = 0; i < 5; i++) 
    {
         matrix[i] = malloc(dynamischerWert * sizeof(int));
         ...
    

    aber wenn ich das übersetzen möchte bekomme ich einen Fehler, das in der zeile

    array = malloc(5 * sizeof(int *));
    

    'void *' nicht in 'int **' konvertiert werden kann.

    langsam bin ich echt ratlos



  • Du benutzt anscheinend einen c++ Compiler nimm einen C-Compiler


  • Mod

    Saul schrieb:

    Also laut galileocomputing muss ich die arrays so deklarieren, wie gary1195 es gemacht hat.

    Galileocomputing und Bücher von diesem Verlag sind keine guten Quellen und sollten nicht benutzt werden, um Programmieren zu lernen. Insbesondere das Buch, welches du verlinkt hast ist bekannt fehlerhaft.



  • Ich stimme SeppJ zu

    aber hier liegt es nicht an dem Buch sondern daran das du keinen C-Compiler sondern einen C++-Compiler benutzt



  • Hmpf 😞

    Ist zwar nicht wirklich regelkonform, aber vielleicht wäre es einfach am unproblematischsten wenn ich die arrays in c++ notation deklariere.

    int ** array;
    array = new int*[5];
    for(i = 0; i < 5; i++)
    {
         matrix[i] = new malloc(dynamischerWert * sizeof(int));
    

    So ist es dann aber sicher auch nicht korrekt, oder?

    Ich würde es ja auch gerne mal mit einen C-Compilers testen, aber ich habe keine Ahnung wie ich diese Option bei Visual Studio in einem bestehenden Projekt abändern kann.



  • Entweder du machst C, aber dann richtig, oder du machst C++, aber dann richtig. Mit so einem Mischmasch stehst du dir nur selbst im Weg.

    Iirc muss man in MSVS einfach nur die Endungen der Sourcen abändern, also nicht *.cpp sondern *.c um den Compiler in den C-Mode zu jagen. Ansonsten lies es im MSDN einfach nach.



  • Tim schrieb:

    Entweder du machst C, aber dann richtig, oder du machst C++, aber dann richtig. Mit so einem Mischmasch stehst du dir nur selbst im Weg.

    ...

    Hab mir schon gedacht, das jemand dieses Thema ansprechen wird :p Aber leider ist es nicht so einfach möglich das bestehende Prog abzuändern. Daher wäre es sicher am simpelsten die arrays in C++ notation zu definieren. Dass das nicht der standard ist bzw sein sollte, ist mit sehr wohl bewusst 😞



  • Du handelst Dir später nur noch mehr Probleme ein, wenn Du dein C-Programm weiterhin mit einem C++-Compiler übersetzt. C und C++ sind unterschiedliche Sprachen, da ist es mit "die Arrays halt in C++-Notation definieren" längst nicht getan. Ich schließe mich Tims Rat an, mach C oder mach C++.

    Außerdem, wenn Du das Programm dahingehend abändern kannst, new zu verwenden, wieso kannst Du dann die Dateiendung nicht von .cpp auf .c ändern?

    Du kannst den Compilermodus aber auch irgendwo in den Dateioptionen einstellen.



  • gary1195 schrieb:

    aber hier liegt es nicht an dem Buch sondern daran das du keinen C-Compiler sondern einen C++-Compiler benutzt

    Das Problem mit solchen Quellen ist aber, dass du vielleicht weißt, dass dort Müll steht, weil du die Sachfrage aus eigener Erfahrung kennst, andere aber und gerade hier anfragende Neulinge eben nicht, und deshalb sollte man solche Quellen nie zitieren oder den dortigen Müll verharmlosen mit "aber hier macht er mal was richtig...".



  • OK Leute ...
    in den letzten Tagen habe ich mein Programm umstrukturiert und den zweidimensionalen dynamischen Array endlich zum laufen bekommen 🙂
    Danke für die Info 😉



  • Wutz schrieb:

    gary1195 schrieb:

    aber hier liegt es nicht an dem Buch sondern daran das du keinen C-Compiler sondern einen C++-Compiler benutzt

    Das Problem mit solchen Quellen ist aber, dass du vielleicht weißt, dass dort Müll steht, weil du die Sachfrage aus eigener Erfahrung kennst, andere aber und gerade hier anfragende Neulinge eben nicht, und deshalb sollte man solche Quellen nie zitieren oder den dortigen Müll verharmlosen mit "aber hier macht er mal was richtig...".

    Ich hab mich nicht auf das Buch bezogen sondern auf den Compiler Fehler

    einfach nur zu Schreiben das Buch ist schlecht ohne auf den Fehler hinzuweisen ist aus meiner Sicht unangebracht und falsch



  • Dann liegt es aber an dir, nicht richtig gesucht zu haben.
    Gerade Pfuscher JW ist hier oft genug thematisiert worden, und nicht für jeden Frager hier (gehe davon aus, dass du nicht der Erste bist, der hier mit dem JW Pfusch aufschlägt und sich "beklagt", dass er davon nichts wusste und man JW doch nicht schlechtreden soll, ohne Konkretes zu nennen) kramt man den konkreten Pfusch wieder hervor, also hier nochmal ein repräsentativer Thread:
    http://www.c-plusplus.net/forum/272350
    und noch ein Link daraus:
    http://www.amazon.de/product-reviews/3836214113/ref=cm_cr_pr_viewpnt_sr_1?ie=UTF8&showViewpoints=0&filterBy=addOneStar



  • Es war nicht meine Absicht das Buch zu verharmlosen (ich kenne es) ich wollte nur Saul helfen.

    Ich möchte mich hier entschuldigen das ich Saul geholfen habe ihm als Leser von JW darf ja eigentlich nicht geholfen werden. Ich habe vergessen das ich eigentlich nur schreiben durfte "besorg dir ein besseres Buch vorher helf ich dir nicht"


Anmelden zum Antworten