Pages: [1]   Go Down
Author Topic: Sketch C: Funktionen überladen? wie?  (Read 182 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
God Member
*****
Karma: 14
Posts: 675
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Gruß,
Helmut
NXC Chess Schachroboter mit Fischertechnik + Lego:  https://www.youtube.com/watch?v=Cv-yzuebC7E

Offline Offline
Faraday Member
**
Karma: 132
Posts: 4244
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
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] << " ";
« Last Edit: July 26, 2014, 09:14:02 am by Serenifly » Logged

Offline Offline
God Member
*****
Karma: 14
Posts: 675
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

das ist ja super!
danke, echt gut! smiley
Logged

Gruß,
Helmut
NXC Chess Schachroboter mit Fischertechnik + Lego:  https://www.youtube.com/watch?v=Cv-yzuebC7E

Offline Offline
Faraday Member
**
Karma: 132
Posts: 4244
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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. smiley-sad

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

* Bubblesort.h (0.35 KB - downloaded 3 times.)
Logged

Offline Offline
God Member
*****
Karma: 14
Posts: 675
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

danke für den Nachschlag, da hast du mir eine Menge Grübelei erspart  smiley-cool
Logged

Gruß,
Helmut
NXC Chess Schachroboter mit Fischertechnik + Lego:  https://www.youtube.com/watch?v=Cv-yzuebC7E

Pages: [1]   Go Up
Jump to: