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


von Kai (Gast)


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:
1
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:
1
class rechner {
2
private:
3
    const uint16_t* myasind;
4
public:
5
    rechner(const uint16_t* c){
6
         myasind = c;
7
    }
8
    uint16_t berechne(uint8_t index){
9
         return pgm_read_word(myasind[index]);
10
    }
11
    ~rechner(){};
12
};
Der Aufruf des Konstruktors sieht so aus:
1
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

von Karl H. (kbuchegg)


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 );

von Oliver (Gast)


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

von Klaus (Gast)


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
1
pgm_read_word(&mysind[index]);
  oder
1
pgm_read_word(mysind + index);

von Kai (Gast)


Lesenswert?

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

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

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

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

Gruß
Kai

von Karl H. (kbuchegg)


Lesenswert?

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

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.

>
1
> pgm_read_word(&mysind[index])
2
>
>
> 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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.