Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehlermeldung mit template
hallo,
ich musste jetzt einen älteren Code ausgraben, der früher mal funktioniert hat (eventuelle c+p Fehler nicht gefunden).
Der Compiler meckert über :
void bubblesort(VTYPE *array, int length) {
^
sketch_mar08a:7: error: 'VTYPE' was not declared in this scope
sketch_mar08a:7: error: 'array' was not declared in this scope
void bubblesort(VTYPE *array, int length) {
^
sketch_mar08a:7: error: expected primary-expression before 'int'
void bubblesort(VTYPE *array, int length) {
^
exit status 1
variable or field 'bubblesort' declared void
was ist falsch?
dies ist der Code:
//---------------------------------------------------------
// Bubble Sort
//---------------------------------------------------------
template <typename VTYPE>
void bubblesort(VTYPE *array, int length) {
VTYPE tmp;
for (int i=0; i<length-1; i++) {
for (int j=0; j<length-i-1; j++) {
if (array[j] > array[j+1]) {
tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
}
}
}
}
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
VTYPE scheint ein macro zu sein, dem du noch einen sinvollen datentyp zuweisen musst
also entweder als
#define VTYPE wasauchimmer_t oder als
typedef VTYPE wasauchimmer_t
EDIT: *Facepalm ist ja ein template XD sorry, da muss wohl irgendwo dennoch ein input für das template gemacht werden, damit er weis was der VTYPE sein soll
den Datentyp (int- oder float array) wollte ich doch undefiniert lassen, daher das template.
Später beim Aufruf in main/loop wird es erst definiert:
int intarray[200];
bubblesort(intarray, 200);
float floatarray[100];
bubblesort(floatarray, 100);
wie geht es richtig?
(editiert)
- - - Aktualisiert - - -
PS, VTYPE ist kein Makro, sondern ein beliebiger Bezeichner als Platzhalter, man könnte auch einfach T oder V nehmen
- - - Aktualisiert - - -
gelöst: man muss das Template und die Funktion in 1 Zeile schreiben, sonst hatte die Arduino -IDE (1.8.5) Mist daraus gemacht!
ist aber inzwischen in 1.8.8 behoben, wie ich gerade erfuhr ;)
Ansonsten musst du beim Aufruf eigentlich auch den Templateparameter angeben also:
int array[200];
bubblesort<int>(array,200);
Es kann sein, dass der Compiler eine autodetection davon machen kann, in der Regel ist aber nicht davon auszugehen.
PS. ich würde T nehmen für den template Typ, das ist man meiner Ansicht nach eher gewohnt. Sonst denkt man wie es hier geschehen ist dass es ein define ist.
Btw. außerdem. Du könntest schauen wie viel overhead std::arrray hat. Das hätte an dieser Stelle den Vorteil, dass man sich den length Parameter spart und man dadurch ein bisschen mehr Fehlersicherheit bezüglich des Aufrufs hat.
danke!
Es funktioniert allerdings bei Arduino offenbar auch ohne <int>, aber ich werde es mir merken, ggf für den Raspi!
//---------------------------------------------------------
// Bubble Sort
//---------------------------------------------------------
template <typename VTYPE> void bubblesort(VTYPE *array, int length) {
VTYPE tmp;
for (int i=0; i<length-1; i++) {
for (int j=0; j<length-i-1; j++) {
if (array[j] > array[j+1]) {
tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
}
}
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("\nSerial started...\n");
int intarray[3]={3,5,1};
bubblesort(intarray, 3);
for(int i=0; i<3; i++) Serial.println(intarray[i]);
float floatarray[3]={5.0,1.0,3.0};
bubblesort(floatarray, 3);
for(int i=0; i<3; i++) Serial.println(floatarray[i]);
}
void loop() {
// put your main code here, to run repeatedly:
}
Ausgabe:
Serial started...
1
3
5
1.00
3.00
5.00
Ich habs grade extra nachgeschaut. Das hat nichts mit Arduino und co zu tun sondern, dass bei Function Templates eine Auto Type Detection durchgeführt werden kann.
durchgeführt werden kann
oder
durchgeführt wird
:?:
falls optional: dann gäbe es ja sicher makefile-Einstellungen per Compilerflags, die Arduino u.U. fest voreingestellt hat, denn es geht ja offenbar "ohne"...?
- - - Aktualisiert - - -
PS,
meine Variable heißt auch nur "zufällig" array, es ist NICHT ein std::array!
1. Man kann bestimmt Fälle konstruieren in denen das nicht geht. Z.B.wenn man Polymorphie verwendet.
2. Das sollte auch ein Hinweis sein, dass std::array Vorteil an der Stelle bieten könnte.
1. Man kann bestimmt Fälle konstruieren in denen das nicht geht. Z.B.wenn man Polymorphie verwendet.
2. Das sollte auch ein Hinweis sein, dass std::array Vorteil an der Stelle bieten könnte.
mit std::array hatte ich bislang noch keine Berührung... wie sähe mein bubblesort denn damit alternativ aus?
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.