PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehlermeldung mit template



HaWe
08.03.2019, 17:21
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:

}

Ceos
08.03.2019, 17:56
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

HaWe
08.03.2019, 18:55
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 ;)

shedepe
09.03.2019, 08:53
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.

HaWe
09.03.2019, 09:32
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

shedepe
09.03.2019, 09:33
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.

HaWe
09.03.2019, 09:40
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!

shedepe
09.03.2019, 10:00
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.

HaWe
09.03.2019, 11:35
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?