Go Down

Topic: Wieso: ...has no member named 'setChannels'? (Read 674 times) previous topic - next topic

Tomybyte

Ich steh mal wieder voll auf der Leitung und blicks gar nicht!
Der Code des Sketch-Files sieht so aus:

Code: [Select]

#include <Tlc5940.h>
#include <tlcRGBLED.h>

RGBLED LED[] = {
 RGBLED(0,1,2),
 RGBLED(3,4,5),
 RGBLED(6,7,8),
 RGBLED(9,10,11),
 RGBLED(12,13,14)
};

 uint8_t i;

void setup()
{
 uint8_t c1;
 uint8_t c2;
 uint8_t c3;

 for(i=0; i<=4; i++){
   //Initialisiere LED
   c1=i*3;
   c2=i*3+1;
   c3=i*3+2;
   LED[i].setChannels(c1,c2,c3); /* Das ist die Problem-Zeile! */
 }
 Tlc.init();
}

void loop()
{
 for(i=0; i<=4; i++){
   LED[i].setTLC(4095,0,0);
 }
 Tlc.update();
}


Lass ich die Problemzeile weg, dann funktioniert alles (die for-Schleife kann ich dann natürlich komplett weglassen!)

In tlcRGBLED.h ist die Klasse definiert:

Code: [Select]

class RGBLED {
 uint8_t TLC_Channel_Red, TLC_Channel_Green, TLC_Channel_Blue;
 uint16_t Red, Green, Blue;
 public:      
     RGBLED(uint8_t,uint8_t,uint8_t);      
     void setChannels(uint8_t,uint8_t,uint8_t);
       void setTLC(uint16_t,uint16_t,uint16_t);
};


und in tlcRGBLED.cpp ist u.a. die Klassen-Methode definiert:

Code: [Select]

void RGBLED::setChannels(uint8_t cr, uint8_t cg, uint8_t cb){
 TLC_Channel_Red = cr;
 TLC_Channel_Green = cg;  
 TLC_Channel_Blue = cb;
}


Der Compiler behauptet nun:
RGBLED_Test.cpp: In function 'void setup()':
RGBLED_Test:24: error: 'class RGBLED' has no member named 'setChannels'

Sorry, aber das versteh ich nicht, ich habe die Funktion 'setChannels' in der Klasse RGBLED deklariert. >:(
Kann mich jemand aufklären!

Radar

Hmmm... ich kenne C++ ned wirklich, aber muss man in der Header-Datei im Prototypen keine Variablennamen angeben?

Tomybyte

#2
Dec 09, 2010, 09:24 am Last Edit: Dec 09, 2010, 12:05 pm by tomybyte Reason: 1
Quote
@Radar: '...im Prototypen keine Variablennamen angeben? '

Ich weis nicht genau, was Du meinst. In der Klassendeklaration sind die Klassen-Variablen als privat deklariert:
Code: [Select]
class RGBLED {
 uint8_t TLC_Channel_Red, TLC_Channel_Green, TLC_Channel_Blue;
 uint16_t Red, Green, Blue;

Außerdem habe ich die Methode RGBLED::setTLC in gleicher Weise implementiert wie RGBLED::setChannels und setTLC funktioniert einwandfrei.

Hier noch die Implementierung der setTLC-Methode:
Code: [Select]
void RGBLED::setTLC(uint16_t r, uint16_t g, uint16_t b){
     Red = r;
     Green = g;
     Blue = b;

 Tlc.set(TLC_Channel_Red, Red );
 Tlc.set(TLC_Channel_Green, Green );
 Tlc.set(TLC_Channel_Blue, Blue );
}

Tomybyte

Hallo! Gibts hier keinen im deutschen Forum, der sich mit Arduino C soweit auskennt, um sagen zu können, welchen Fehler ich hier mache, denn etwas muss ja falsch sein, sonst würde es ja funktionieren!

Danke und Gruß Tom

Radar

Ich meinte den Funktions-Prototypen. Die deklarierung der Funktion vor der eigentlichen implementierung.
----
void setChannels(uint8_t, uint8_t, uint8_t);

zu

void setChannels(uint8_t cr ,uint8_t cg ,uint8_t cb);

Tomybyte

Quote
@Radar: void setChannels(uint8_t cr ,uint8_t cg ,uint8_t cb);

Das verändert nichts. Die Funktion setTLC ist ja auch ohne die Variablen-Deklaration in der Klasse implementiert und funktioniert.

Jetzt habe ich entdeckt, dass außer der Konstruktor-Funktion nur setTLC als Klassen-Methode funktioniert, wenn ich andere Methoden implementiere, egal welcher Typ, dann kommt immer die Meldung, wenn ich diese im Setup oder auch Loop aufrufen will, der Compiler error "...has no member named '[Methodenname]'".
Das seltsame ist, ich kann dabei keinerlei Systematik erkennen. setTLC(...) wird akzeptiert egal, wo deklariert, alle anderen Methoden nicht.
Ich bin mit meinem Programmierer-Latein komplett am Ende.

Benötige dringend Hilfe!

Go Up