c++, progmem, pass by reference

Gast #1787254
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
Gast #1787317
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
#1787326
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren