mehrdimensionales array verwenden/indizieren



  • hallo,
    ich brache ein mehrdimensionales feld in einer funktion.

    wenn ich es so mache

    int main(){
    
    int feld [SIZE][SIZE][SIZE];
    
    funktion(feld);
    
    }
    

    sagt er mir:
    Warnung: passing arg 2 of `platziere_pferd' from incompatible pointer type

    wenn ich es so mache:

    int main(){
    
    int feld [SIZE*SIZE*SIZE];
    
    funktion(feld);
    
    }
    

    kann ich ja in der funktion nicht so: feld [x][y][z] darauf zugreifen.
    wie kann ich es realisieren, daß ich in der funktion auf die jeweilige dimension zugreife.

    danke



  • #include <stdio.h>
    
    void fnFunktion (int iBekommen[10][10][10]) ;
    
    int main (void){
    	int iZahlen[10][10][10] ;
    	fnFunktion (iZahlen) ;
    	printf ("%d", iZahlen[1][2][3]) ;
    	return 0 ;
    }
    
    void fnFunktion (int iBekommen[10][10][10]){
    	iBekommen[1][2][3] = 1975 ;
    }
    

    so musste es funzen



  • Bei der Deklaration und beim Funktionskopf kann man sogar die erste Grenze weglassen. Also:

    void fnFunktion (int iBekommen[][10][10]);
    


  • @toom das funktioniert soweit ganz gut.

    wieso kann ich jetzt aber nicht trotzdem einfach sequentiell durch das array laufen. etwa so:

    for(c=0;c<SIZE*SIZE*SIZE;c++)
        printf("%d\n", ***(feld+c));
    

    das verstehe ich noch nicht so ganz...



  • int* soso = feld;
    for(c=0;c<SIZE*SIZE*SIZE;c++) 
        printf("%d\n", *(soso+c));
    

    sollte gehen. Beachte: es sind keine ***, sondern nur ein Stern!



  • hallo,
    hier:

    int* soso = feld;

    bekomme ich dann aber wieder die warnung:
    Warnung: initialization from incompatible pointer type

    es funktioniert zwar, aber was heißt das?



  • mezzo mix schrieb:

    hallo,
    hier:

    int* soso = feld;

    bekomme ich dann aber wieder die warnung:
    Warnung: initialization from incompatible pointer type

    es funktioniert zwar, aber was heißt das?

    Das heißt, besorge die ganz dringend Literatur zu C, oder lerne logisch denken.

    void benutze_feld(int ***feld)
    {
        feld[1][2][3] = 1;
    }
    
    int main(void)
    {
        int f[5][5][5];
        benutze_feld(f);
    
        return 0;
    }
    


  • dein progrämmchen wird jedoch auch von einer compilerwarnung begleitet:
    test.c: In function main': test.c:9: Warnung: passing arg 1 ofbenutze_feld' from incompatible pointer type



  • Und jetzt sage mir mal, wie inkompatibel die Pointer denn sind!

    Gruß Tobias



  • Sicherlich erhältst Du in meiner Version ein Pointertype-Warning, denn es findet ein implizites Pointercasting statt. Es liegt an dem Warning-Service eines Compilers, ob er sogar bei explizitem casting int* soso = (int*)feld noch warnt. Pointercastings sind eine niemals zu unterschätzende Gefahr, deshalb wird da kräftig gewarnt. (Letztlich ist der 'grenzenlose' Zugriff, wie Du ihn willst schlampig - jedoch nicht unbedingt langsamer als drei Loops ;))
    Man muss sich auch von dem Gedanken trennen, ein Programm unbedingt warnfrei entwickeln zu wollen - ein Kommentar, weshalb eine Warnung getrost ignoriert werden kann, tut es in den meisten Fällen.
    Jedenfalls handhabe ich das so.


Anmelden zum Antworten