- LiTime Speicher und Akkus         
Ergebnis 1 bis 9 von 9

Thema: Fehlermeldung mit template

  1. #1
    HaWe
    Gast

    Fehlermeldung mit template

    Anzeige

    Praxistest und DIY Projekte
    hallo,
    ich musste jetzt einen älteren Code ausgraben, der früher mal funktioniert hat (eventuelle c+p Fehler nicht gefunden).
    Der Compiler meckert über :

    Code:
     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:

    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:
    
    }

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    VTYPE scheint ein macro zu sein, dem du noch einen sinvollen datentyp zuweisen musst

    also entweder als
    Code:
    #define VTYPE wasauchimmer_t
    oder als
    Code:
    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
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  3. #3
    HaWe
    Gast
    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
    Geändert von HaWe (08.03.2019 um 20:14 Uhr)

  4. #4
    shedepe
    Gast
    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.

  5. #5
    HaWe
    Gast
    danke!
    Es funktioniert allerdings bei Arduino offenbar auch ohne <int>, aber ich werde es mir merken, ggf für den Raspi!
    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:
      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:
    Code:
    Serial started...
    
    1
    3
    5
    1.00
    3.00
    5.00

  6. #6
    shedepe
    Gast
    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.

  7. #7
    HaWe
    Gast
    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!

  8. #8
    shedepe
    Gast
    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.

  9. #9
    HaWe
    Gast
    Zitat Zitat von shedepe Beitrag anzeigen
    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?

Ähnliche Themen

  1. Fehlermeldung bei Dev-C++
    Von Zylbath im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 12.10.2009, 16:21
  2. seltsame Fehlermeldung
    Von eis im Forum Assembler-Programmierung
    Antworten: 2
    Letzter Beitrag: 30.10.2007, 19:10
  3. fehlermeldung in asm-routine
    Von robby-fant im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 22.08.2006, 18:47
  4. Fehlermeldung
    Von Proworx im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 12.04.2006, 09:49
  5. Fehlermeldung!?!?!?
    Von ricoderrichter im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 11.08.2005, 18:57

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus