Go Down

Topic: Sketch C: Funktionen überladen? wie? (Read 229 times) previous topic - next topic

HaWe

hi,
ist es möglich mit Sketch C Funktionen zu überladen? ggf. wie?

Beispiel:
der folgende Code sortiert arrays of long.
ich möchte ihn so überladen dass er auch float oder byte im array akzeptiert:

Code: [Select]

void bubblesort(long *array, int length)
   {
      int i, j;

      for (i = 0; i < length -1; ++i)   {
        for (j = 0; j < length - i - 1; ++j) {
           if (array[j] > array[j + 1])  {
             long tmp = array[j];
             array[j] = array[j + 1];
             array[j + 1] = tmp;
          }
        }
      }
   }
Gruß,
Helmut

Serenifly

#1
Jul 26, 2014, 02:58 pm Last Edit: Jul 26, 2014, 04:14 pm by Serenifly Reason: 1
In C geht es genaugenommen nicht. Aber dies ist C++. Und da geht es wie in anderen Sprachen auch. Einfach eine Funktion erstellen, die eine andere Signatur aber den gleichen Namen hat:
http://www.willemer.de/informatik/cpp/overload.htm

Allerdings hier sind auch templates eine sehr schöne Option. Damit muss man nur eine Funktion erstellen. Den Rest erledigt der Compiler:
Code: [Select]

template<typename T>
void bubblesort(T* array, int length)
{
  int i, j;

  for (i = 0; i < length -1; ++i)   {
     for (j = 0; j < length - i - 1; ++j) {
        if (array[j] > array[j + 1])  {
           T tmp = array[j];
   array[j] = array[j + 1];
           array[j + 1] = tmp;
        }
     }
  }
}


Test Code in Visual C++:
Code: [Select]

long test1[] = { 1000, 100, 1, 5 };
byte test2[] = { 3, 255, 6, 81, 45, 72 };
double test3[] = { 2.5, 1.96, 1.23, 45.45, 17.8 };

const int size1 = sizeof(test1) / sizeof(long);
const int size2 = sizeof(test2) / sizeof(byte);
const int size3 = sizeof(test3) / sizeof(double);

bubblesort(test1, size1);
bubblesort(test2, size2);
bubblesort(test3, size3);

for(int i = 0; i < size1; i++)
cout << test1[i] << " ";
cout << endl;
for(int i = 0; i < size2; i++)
cout << (int)test2[i] << " ";
cout << endl;
for(int i = 0; i < size3; i++)
cout << test3[i] << " ";

HaWe

Gruß,
Helmut

Serenifly

Wegen dem template. Ich habe gerade mal versucht damit rumzuspielen und gemerkt, dass ich es doch mal in der Arduino IDE statt nur in Visual C++ hätte testen sollen. :(

Wenn du das in eine .h Datei schreibst und diese inkludierst funktioniert das. Aber wenn du es so in den Arduino Sketch schreibst, legt dich leider die Arduino IDE rein. Die will das nämlich in die .cpp Datei schreiben und das geht nicht. Templates gehören in einen Header. Grrrrrr!!  :smiley-yell:  :smiley-yell: :smiley-yell:


Habe mal eine Header Datei angehängt. Wenn du Sketch -> Add File damit machst, dann geht das so:

Code: [Select]

#include "Bubblesort.h"

void setup()
{
 Serial.begin(9600);
}

void loop()
{
 long test1[] = { 1000, 100, 1, 5   };
 byte test2[] = { 3, 255, 6, 81, 45, 72   };
 double test3[] = { 2.5, 1.96, 1.23, 45.45, 17.8   };

 const int size1 = sizeof(test1) / sizeof(long);
 const int size2 = sizeof(test2) / sizeof(byte);
 const int size3 = sizeof(test3) / sizeof(double);

 bubblesort(test1, size1);
 bubblesort(test2, size2);
 bubblesort(test3, size3);

 for(int i = 0; i < size1; i++)
 {
   Serial.print(test1[i]);
   Serial.print(" ");
 }
 Serial.println();
 for(int i = 0; i < size2; i++)
 {
   Serial.print(test2[i]);
   Serial.print(" ");
 }
 Serial.println();
 for(int i = 0; i < size3; i++)
 {
   Serial.print(test3[i]);
   Serial.print(" ");
 }
 Serial.println();
 Serial.println();
 
 delay(10000);
}


Was man schön sieht ist das templates Code Generatoren sind. Mit jeder zusätzlichen Verwendung von bubblesort() mit anderen Datentyp steigt die Sketch-Größe

HaWe

danke für den Nachschlag, da hast du mir eine Menge Grübelei erspart  8)
Gruß,
Helmut

Go Up