mikrocontroller.net

Forum: Compiler & IDEs Array-Adresse an Funktion übergeben


Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin mehr oder weniger neu in der Programmiersprache C(habe vorher 
schon flüchtig damit programmiert) und hab jetzt folgendes Problem, was 
ich einfach nicht gelöst bekomme, egal wie ich dran rumdrehe:

void lcd_write_array(uint16_t p_source,uint16_t p_blocks)
{
  uint16_t l_counter = 0;
  while(l_counter < p_blocks)
  {
    lcd_write_byte( pgm_read_byte( p_source + l_counter ) );
    l_counter++;
  }
}

//...

lcd_write_array( &clkcharset_digital[(l_number01+1) * 144 + l_pagecounter ] , 24 );


Das Problem ist jetzt die Übergabe der Adresse, dort meckert der mir 
jedesmal rum - egal ob ich jetzt in der Funktion einen Pointer oder 
nicht erwarte, ob der Adressoperator im Funktionsaufruf gesetzt ist oder 
was auch immer... Das kann doch nicht so schwer sein?

Dank im Voraus!

Grüße,
Christian

Autor: Melanie G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void lcd_write_array(uint8_t* p_source,uint16_t p_blocks)

Autor: Melanie G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bzw.:

void lcd_write_array(uint8_t p_source[],uint16_t p_blocks)

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die erste Variante habe ich schon ausprobiert, hat aber ne Warnung 
ausgegeben:

"../clock01.c:298: warning: passing argument 1 of 'lcd_write_array' 
discards qualifiers from pointer target type
"

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian schrieb:
> Die erste Variante habe ich schon ausprobiert, hat aber ne Warnung
> ausgegeben:
>
> "../clock01.c:298: warning: passing argument 1 of 'lcd_write_array'
> discards qualifiers from pointer target type
> "

Wie ist clkcharset_digital definiert?
Das ist offenbar kein normales uint16_t Array, sondern eines mit einem 
zusätzlichen Qualifier. const oder volatile?

Dann muss es auch zb
void lcd_write_array( const uint8_t* p_source, uint16_t p_blocks )
heissen.

Und wenn du das gleich gesagt hättest, anstelle von "da meckert mir der 
Compiler rum", dann hätte man dir das auch gleich zielgerichtet 
mitteilen können.

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Array ist const uint8_t clkcharset_digital[] PROGMEM.
Der Compiler hört jetzt zwar auf zu meckern, allerdings passiert hier 
etwas was ich überhaupt nicht nachvollziehen kann:

void lcd_draw_clock(uint8_t p_hour, uint8_t p_minute)
{
  uint8_t l_number01 = p_hour%10;
  uint8_t l_number02 = p_hour - l_number01*10;
  uint8_t l_number03 = p_minute%10;
  uint8_t l_number04 = p_minute - l_number03*10;
  uint8_t l_pagecounter = 0;

  //lcd_write_array( 168,24 );

  while(1);
    {
    lcd_write_array( &clkcharset_digital[ l_pagecounter ],24 );
    l_pagecounter++;
    _delay_ms(50);
    }

}


Der Code ist natürlich nur testweise so geschrieben, jedoch wird die 
while Schleife nicht ausgeführt! Und wenn ich while(0) schreibe wird die 
EINMAL ausgeführt. Auf dem Display ist also entweder garnichts zu 
sehen(bei while(1)) oder 24 Bytes (bei while(0)). Der Debugger bringt 
auch nicht viel, bei C Code bleibt der leider sehr oft hängen...

Die Funktion lcd_write_array sieht jetzt übrigens so aus:
void lcd_write_array(const uint8_t* p_source,uint16_t p_blocks)
{
  uint16_t l_counter = 0;
  while(l_counter < p_blocks)
  {
    lcd_write_byte( pgm_read_byte( p_source + l_counter ) );
    l_counter++;
  }
}

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na toll, wie das so ist sieht man den Fehler 0,2 Sekunden NACH dem 
abschicken ...

Das Semikolon hab ich doch glatt übersehen.
Ok damit hat sich das Problem dann wohl erledigt und die Funktion geht 
nun auch wie gewollt, vielen Dank!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.