www.mikrocontroller.net

Forum: Compiler & IDEs c++, progmem, pass by reference


Autor: Kai (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe folgendes Problem: Ich habe ein Projekt in c++ und möchte 
sinus-Werte aus einer Lookup-Table rausziehen. Diese habe ich in der 
main.cpp nach folgendem Muster eingebunden:
const uint16_t myasind[3] PROGMEM = {0,115,229};

So weit, so gut. Nun will ich diese Lookup-Table an ein Objekt 
übergeben, welches die Table für Berechnungen benötigt. Dazu habe ich 
folgendes versucht:
class rechner {
private:
    const uint16_t* myasind;
public:
    rechner(const uint16_t* c){
         myasind = c;
    }
    uint16_t berechne(uint8_t index){
         return pgm_read_word(myasind[index]);
    }
    ~rechner(){};
};
Der Aufruf des Konstruktors sieht so aus:
rechner r(&myasind);
Das soll hier nur zur Veranschaulichung dienen, der komplette Code ist 
wesentlich umfangreicher, aber das Problem liegt bei diesen Aufrufen.
Denn wenn ich das so ausführe, compiliert es zwar, die Daten, die er 
ausliest, sind aber nicht die in meinem Array. Er scheint also einfach 
an der falschen Stelle zu lesen. Wie kann ich das richtig machen?

Danke schonmal
Kai

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

Bewertung
0 lesenswert
nicht lesenswert
Kai schrieb:

>          return pgm_read_word(myasind[index]);

pgm_read_word will eine Adresse, von der es lesen soll

entwder
        return pgm_read_word( &myasind[index] );
oder
        return pgm_read_word( myasind + index );

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kai schrieb:
> Er scheint also einfach
> an der falschen Stelle zu lesen. Wie kann ich das richtig machen?

Du musst auch an der richtigen Stelle auslesen, also explizit aus dem 
Flash. Automatisch kennt das der Compiler nicht.

Oliver

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kai schrieb:
> pgm_read_word(myasind[index]);

pgm_read_word erwartet einen Pointer auf das zu lesende Wort. 
myasind[index] ist aber nicht die Adresse des Wertes.

Also
pgm_read_word(&mysind[index]);
  oder
pgm_read_word(mysind + index);

Autor: Kai (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich muss mich korrigieren: Der Aufruf lautet
rechner r(&myasind[0]);

die beiden vorher genannten Vorschläge funktionieren beide nicht, wobei
pgm_read_word(&mysind[index])

ja dann auf die Adresse des Pointers schauen würde, also nicht 
funktionieren kann.
pgm_read_word(mysind + index);

hat leider auch nicht funktioniert. Ist die Übergabe der Adresse des 
ersten Wertes evtl die falsche Herangehensweise?

Gruß
Kai

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

Bewertung
0 lesenswert
nicht lesenswert
Kai schrieb:
> Ich muss mich korrigieren: Der Aufruf lautet
>
>
> rechner r(&myasind[0]);
> 

Ist egal.

An dieser Stelle ist myasind und &myasind[0] gleichwertig. Beides 
liefert die Adresse des ersten Arrayelements

> die beiden vorher genannten Vorschläge funktionieren beide nicht, wobei

doch.

>
> pgm_read_word(&mysind[index])
> 
>
> ja dann auf die Adresse des Pointers schauen würde

Äh, nein.

C Basis

msinyd[index] ist gleichwertig zu   *(mysind + index)
Ein & davor und du hast  &*(mysind + index)

Der & und der * heben sich auf und übrig bleibt die Adresse, die man 
erhält, wenn man zum Pointer mysind noch den Offset index dazuzählt. 
Vulgo: die Adresse, an der das index-te Element des Arrays mysind 
abgespeichert ist.

Und genau die will pgm_read_word haben.

Das was du gedanklich unterstellst, wäre

    &mysind + index

und das wäre in der Tat etwas anderes.

Du musst also noch einen anderen Fehler im Programm haben.

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.