Zeiger eines Arrays



  • Hallo,

    Ich habe ein Array mit vielen Stellen und übergebe einer Funktion ein Zeiger auf diesen, also Funktionsaufruf

    function(&array)
    

    und Funktionsdefiniton

    void function(const unsigned char *array){..}
    

    Jetzt möchte ich in dieser Funktion einzelne Werte aus dem Array auslzulesen und in eine andere Variable schreiben. Nur bin ich da jetzt gerade unsicher, wie das geht. Kann mir jemand helfen?



  • Hallo,

    der Aufruf sollte sein:

    function(array);
    

    In der Funktion wie gewohnt:

    unsigned char first = array[0];
    

    MfG,

    Probe-Nutzer



  • Mittlerweile habe ich, bei ähnlicher Syntax, ein zweidimensionales Array.

    Mein Funktionsaufruf ist, wie mir empfohlen, so:

    function(array);
    

    Nach etwas Recherche habe ich dann meine Funktion so definiert:

    void function(const unsigned char **array){..}
    

    In der Funktion function(..) rufe ich wiederum eine weitere Funktion auf, die ebenfalls einen Zeiger auf ein Array benötigt.

    Diesen Aufruf habe ich jetzt so gestaltet:

    function_read(&pCharacter[1][flag])
    

    flag ist eine Art Schleifenvariable, die nach jedem Aufruf erhöht wird.

    Jedoch scheinen immer falsche Werte ausgelesen zu werden.

    Bin noch nicht so ganz fit mit Zeigern, wo liegt mein Fehler?



  • Ein echtes 2D-Array ergibt keinen Doppelzeiger.

    Bei einem Doppelzeiger hast du einen Zeiger auf ein Array mit Zeigern. (so wie bei argv von main)
    Du kannst zwar beides über die [][] ansprechen, trotzdem ist es unterschiedlich.

    Bevor wir hier jetzt weiter rumraten, wäre es besser du zeigst mal tatsächlichen Code.



  • void lcd_write_character(uint8_t pX, uint8_t pY, uint8_t pWidth, float pHeight, unsigned char **pCharacter){
    	pHeight/=8;
    	uint16_t flag=0;												//Local Variable for array-approaching
    	for(int i=0; i<pHeight && i+pY<8; i++){							//for every page
    		for(int j=0; j<pWidth; j++){								//for every column
    			Content[pX+j][pY+i]=pgm_read_byte(&pCharacter[1][flag]);//write byte to content
    			flag++;													//increment flag
    		}
    	}
    	lcd_writing_operation();										//write content to display
    }
    

    Das ist die Funktion, der der Zeiger in erster Instanz übermittelt wird. pgm_read_byte ist die Funktion, die eben auch den Zeiger benötigt.

    Der Aufruf sieht so aus:

    lcd_write_character(5,1,4,6,font);
    


  • So kann das nichts werden, wenn man irgendwoher einen Funktionscode übernimmt. 🤡

    Du musst dir notwendig einige Grundlagen in C aneignen: über Arrays, Zeiger und Zugriffe auf die einzelnen Elemente eines Arrays.
    Bedenke: jeder Array - egal ob eindimensional oder mehrdimensional - ist eine Folge von Werten. Die Zeiger zeigen
    auf einen Speicherplatz, wo sich was befindet.

    Ich fürchte, wir können dir wenig helfen.



  • berniebutt schrieb:

    So kann das nichts werden, wenn man irgendwoher einen Funktionscode übernimmt. 🤡

    Du musst dir notwendig einige Grundlagen in C aneignen: über Arrays, Zeiger und Zugriffe auf die einzelnen Elemente eines Arrays.
    Bedenke: jeder Array - egal ob eindimensional oder mehrdimensional - ist eine Folge von Werten. Die Zeiger zeigen
    auf einen Speicherplatz, wo sich was befindet.

    Ich fürchte, wir können dir wenig helfen.

    Das ist mein selbst geschriebener Code, ich kommentiere nunmal gerne auf Englisch, falls das komisch wirkt. Ich habe bisher nur noch nicht mit Zeigern auf zweidimensionale Arrays gearbeitet, weswegen ich da eben unerfahren bin.



  • Wie ist denn font überhaupt definiert?
    Ist da auch von dir?

    Darauf willst du doch zugreifen, und ohne die Defnition kann man nicht sagen, wie das geht.



  • Zu deiner Info:

    unsigned char pCharacter[][4]
    

    ist etwas anderes als

    unsigned char *pCharacter[4]
    

    Das erste ist ein echtes 2D-Array mit 4 Spalten und unbestimmter Zeilenanzahl
    Das zweite ist ein Array aus 4 Zeigern auf unsigned char.

    Du hast wohl den ersten Fall.

    [http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=1030203](http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=1030203)



  • font ist ein 2 dimensionales Array:

    const unsigned char font[256][4]
    

    Wie ich sehe hast du meinen Thread bei Avrfreaks gefunden, da wurde mir ja auch schon einiges zu dem Thema erklärt. Werd mir das wohl trotzdem nochmal genauer ansehen müssen mit den Zeigern und Arrays etc.



  • Kalkihe schrieb:

    font ist ein 2 dimensionales Array:

    const unsigned char font[256][4]
    

    Dann ist pCharacter kein Doppelzeiger.

    Ein unsigned char pCharacter[][4] wäre da richtig.

    Obwohl ein unsigned char *pCharacter mit

    pgm_read_byte(pCharacter[1*4+flag]);
    

    auch gehen sollte.

    (wäre und sollte, weil ich das verhalten von pgm_read_byte nicht kenne)

    Du sollltest nochmal schauen, wie das mit den Indizes bei deinem pgm_read_byte(&pCharacter[1][flag] hinhaut. Sind die vertauscht?

    Kalkihe schrieb:

    Wie ich sehe hast du meinen Thread bei Avrfreaks gefunden, da wurde mir ja auch schon einiges zu dem Thema erklärt. Werd mir das wohl trotzdem nochmal genauer ansehen müssen mit den Zeigern und Arrays etc.

    Das war der einzige Treffer bei "lcd_write_character lcd_write_character" 😃


Anmelden zum Antworten