Array 16*16*16



  • Ich würde mir gern einen Würfel mit einer Kantenlänge von 16 Elementen anlegen. Ich habe gerade ein Loch im Kopf und versuche herauszufinden, wie ich vorgehen muss wenn ich den Würfel zum Beispiel so bearbeiten möchte:

    MeinWuerfel[Ebene++][Reihe][Spalte--];

    Die Elemente liegen im Speicher ja hintereinander, und wenn ich jetzt die Ebene Wechseln möchte muss ich den Zeiger ja um 256 Elemnte verschieben, richtig? Wie bekommt man es hin, dass die Ebene (oder Reihe [+16] bzw. Spalte [+1]) jeweils einfach mit den Operatoren ++ respektive -- verschieben kann?



  • timmix schrieb:

    MeinWuerfel[Ebene++][Reihe][Spalte--];

    Die Elemente liegen im Speicher ja hintereinander, und wenn ich jetzt die Ebene Wechseln möchte muss ich den Zeiger ja um 256 Elemnte verschieben, richtig?

    Welchen Zeiger?

    timmix schrieb:

    Wie bekommt man es hin, dass die Ebene (oder Reihe [+16] bzw. Spalte [+1]) jeweils einfach mit den Operatoren ++ respektive -- verschieben kann?

    Vielleicht verstehe ich dein Problem nicht ganz, aber eigentlich geht das ganz normal mit einfach Indexvariablen.



  • also ich verwende grundsätzlich nur 1 dimensionale Felder.

    bei mir würde das also so aussehen:

    int max = 256 * 16; // zu faul das auszurechnen ;
    int* wuerfel = (int*) malloc(max * sizeof(int));
    

    die funktion für den zugriff würde dann so aussehen:

    int umrechnung(int x, int y, int z)
    {
      return x + 16 * y + 256 * z;
    }
    
    // zugriff
    int x,y,z;
    .
    .
    .
    wurfel[umrechnung(x,y,z)] = ...
    

    der Code ist jetzt zwar laufzeittechnisch absolut ineffizient, aber man hat nie probleme und brauch sich auch keine komplexen mehrdimensionalen dinge vorstellen, sondern gibt nur noch blind seine koordinaten ein und alles geht automatisch 😉 geht natürlich dann entsprechend auch mit mehr als 3 dimensionen.

    wobei ich zugeben muss, wenn die laufzeit wichtig ist (Bsp. training neuronaler netze) dann verwende ich diese variante nicht 🙂



  • It0101 schrieb:

    also ich verwende grundsätzlich nur 1 dimensionale Felder.

    Du weißt aber schon, dass ein

    int x[2][3];
    

    im Speicher dann zu

    int x[6];
    

    wird, d.h. die gesamte Matrix als eindimensionales Array da drin liegt?!



  • wie ich bereits erwähnte ist der quelltext ineffizient 😉 macht aber meines erachtens sinn, wenn man funktionen hat, die nur EINEN wert zurückliefern, der eine bestimmmte position innerhalb eines mehrdimensionalen feldes bezeichnet. Wenn man von anfang an ein 1d feld verwendet hat man dann keine probleme.

    oder meintest du das man auf ein feld

    int feld[n][m]
    

    auch mit

    feld[o]
    

    zugreifen kann.
    Falls ja, hab ich auch heute wieder was dazu gelernt 😉



  • Ja, in C kannst du durch ein

    int x[2][3];
    

    auch per:

    int i=0;
    for ( ; i<6; ++i)
      x[i] = -587;
    

    durchlaufen. C führt kein run-time range checking durch, im Gegensatz zu C++.



  • GPC schrieb:

    C führt kein run-time range checking durch, im Gegensatz zu C++.

    tztz... versucht da wieder einer mit aller gewalt c++ zu promoten? 🙄
    runtime checks machen beide nicht, und ein c-compiler frisst auch kein

    int x[2][3];
    x[...] = ...;
    

    höchstens so:
    x[0][...] = ...;



  • net schrieb:

    GPC schrieb:

    C führt kein run-time range checking durch, im Gegensatz zu C++.

    tztz... versucht da wieder einer mit aller gewalt c++ zu promoten? 🙄

    tztz... versucht da wieder einer mit aller gewalt c zu promoten 🙄 😉

    Ne, im Ernst. Ich mach das eh nicht, weil's halt auch ziemlicher murks ist, daher juckt mich's nicht, ob das er Compiler erlaubt, oder nicht.

    runtime checks machen beide nicht,

    Du hast doch sicherlich auch nen Link, der das untermauert. Mir war so, dass C++ Compiler das machen. Kann mich in dem Punkt aber auch täuschen, da ich grad nichts finde, was meine Behauptung stützen würde.

    und ein c-compiler frisst auch kein

    int x[2][3];
    x[...] = ...;
    

    höchstens so:
    x[0][...] = ...;

    hm, ne, der gcc hat's bisher immer gefressen. Ob's der 4er auch noch tut, weiß ich nicht, ich hab noch den 3.3.x drauf, aber schon lange nicht mehr probiert, ob's geht.



  • GPC schrieb:

    Du hast doch sicherlich auch nen Link, der das untermauert. Mir war so, dass C++ Compiler das machen. Kann mich in dem Punkt aber auch täuschen, da ich grad nichts finde, was meine Behauptung stützen würde.

    links hab' ich auch nicht, aber aus'm gedächtnis: manche compiler machen solche checks im debugmodus, aber zur definition der sprachen gehört's nicht.



  • eingigen wir uns auf unentschieden und "compilerspezifisches Verhalten" 😃



  • GPC schrieb:

    und ein c-compiler frisst auch kein

    int x[2][3];
    x[...] = ...;
    

    höchstens so:
    x[0][...] = ...;

    hm, ne, der gcc hat's bisher immer gefressen. Ob's der 4er auch noch tut, weiß ich nicht, ich hab noch den 3.3.x drauf, aber schon lange nicht mehr probiert, ob's geht.

    Also das sollte nicht gehen.



  • GPC schrieb:

    eingigen wir uns auf unentschieden und "compilerspezifisches Verhalten" 😃

    nur wenn du versprichst hier nie wieder was über c++ zu schreiben 😉



  • TactX schrieb:

    Also das sollte nicht gehen.

    bei welchem?

    net schrieb:

    GPC schrieb:

    eingigen wir uns auf unentschieden und "compilerspezifisches Verhalten" 😃

    nur wenn du versprichst hier nie wieder was über c++ zu schreiben 😉

    hehe, ich hab ja eh keine Ahnung von C++, also halt ich einfach die Klappe :p



  • GPC schrieb:

    TactX schrieb:

    Also das sollte nicht gehen.

    bei welchem?

    Eigentlich bei allen 😉



  • TactX schrieb:

    GPC schrieb:

    TactX schrieb:

    Also das sollte nicht gehen.

    bei welchem?

    Eigentlich bei allen 😉

    hm, scheint so. Aber ich bin mir sicher, dass derartiger Code schon kompilierte, ich weiß nur nicht mehr, bei welchem Compiler. Verflucht. Ich werd bald mal meine alten Dinosaurier rausziehen und schauen, wo's noch durchgeht. Irgend so'n K&R Compiler wird's schon fressen 😃



  • omg was hab ich angerichtet, ich schreib nie mehr was 😉


Log in to reply