Variable Datentypen vor Übersetzungszeit

geistgesicht

Mitglied
Hallo,

ich habe ein Problem und würde mich über jede Hinweis von euch freuen. Ich möchte eine Funktion schreiben, die einen Pointer auf einen Wert bekommt und dann diesen Wert mit den Werten eines Arrays vergleicht. Die Elemente des Arrays sollen wiederum Strukturen sein, die ein Float-Element haben und ein Integer-Element:
PHP:
typedef struct  {
  int aa;
  float bb;
} myStruct;

Das Problem ist nun, dass ich der Funktion gerne Pointer auf unterschiedliche Datentypen übergeben würde (entweder Float oder Integer) und je nach Datentyp des Pointers entweder den Integer-Teil der Strukur verwende oder den Float-Teil:
PHP:
myQuery(int/float * pointer)

// wenn pointer-Typ int
if(myStruct[0].aa > *pointer) .. do something with myStruct[0].aa

// bzw wenn pointer-Typ float
if(myStruct[0].bb > *pointer) .. do something myStruct[0].bb

Der Datentyp des pointers soll zur Laufzeit allerdings feststehen, also nur vor dem Kompilieren variabel sein (vielleicht kann man ja den Präprozessor verwenden?)! Des weiteren sollte das, wenn möglich in reinem C geschrieben werden und nicht C++.

Vielen Dank für jeden Hinweis!!
 
Hi
bin mir zwar jetzt nicht ganz sicher, ob das wirklich C ohne ++ ist, aber:

void funktion(myStruct *array,int wert)
{
/*Hier für int rein*/
}

/und danach einfach noch:

void funktion(myStruct *array,float wert)
{
/*Hier für float rein*/
}

einfach zwei varianten, einmal mit int und einmal mit float zum übergeben, und jeweils denn passwenden code rein

Gruß
 
Hallo, du könntest einen void-Pointer verwenden und immer entsprechend casten:
C++:
void myQuery(void* pointer)
{
#ifdef USEFLOAT
    float *fValue = (float *)pointer;

    /* Do something */

#else
    int *nValue = (int *)pointer;

    /* Do something */

#endif
}
C++:
/* Verwendung */
int nValue = 123;
myQuery((void *)&nValue);
Gruß
MCoder
 
Halo und Danke für die Antworten.
@MCoder
ich wollte das ohne defines lösen, da ich beide Versionen im Code brauche

@sheel
Das bedeutet ja, dass ich zwei Funktionen schreiben muss, ich hätte aber gerne nur eine, da beide prinzipiell das gleiche machen. Nach einiger Recherche denke ich, dass das in C leider nicht möglich ist.

Grüße
 
Hallo geistgesicht,

du hattest den Präprozessor erwähnt und dass du beide Varianten nicht gleichzeitig während der Laufzeit benötigst. Da bietet sich eigentlich eine #ifdef-Konstruktion an.

Gruß
MCoder
 
In C++ kannst du templates benutzen

C++:
template<class T>
T square(T val){
  return val * val; }

Nachteil ist allerdings, dass dann für beide Datentypen _exakt_ denselben Funktionscode hast. Du kannst also nicht auf die unterschiedlichen Struct-Member zugreifen, je nachdem, mit welchem Datentypen du gerade arbeitest.
Höchstens, du arbeitest:
- entweder mit template-Spezialisierung, dann musst du jedoch wiederum mindestens eine kleine Funktion 2 mal schreiben
- oder mit überladenen getter, setter methoden, was aber nicht ubd zu schön wäre..


C++:
structs myStruct{
  int aa;
  float bb;

  void getval(int& a) { a = aa; }
  void getval(float& b) { b = bb; }
  void setval(int a) { aa = a; }
  void setval(float b) { bb = b; }
};


template<class T>
T myfunction(T param, mystruct& s){
  T val;
  s.getval(val)
  val += param;
  s.setval(val);
  return val;
}

...


int i;
float fl;

myfunction(fl, s); // ruft myfunction<float> auf
myfunction(i, s);  // ruft myfunction<int> auf
 
Hallo und Danke für die Antworten. Ich war bisher nicht so sicher aber jetzt kann ich auf gar keinen Fall C++ verwenden (evtl. könnte man hier noch einen Operator casten, aber da kenne ich micht nicht so gut aus).

Die ganze Funktion wird sehr komplex, daher will ich den Code nur einmal schreiben, aber ich will eben beide Versionen gleichzeitig verwenden (entschuldigt, wenn das nicht so klar war), daher kommt eine #ifdef Struktur nicht in Frage. Allerdings soll bei jedem Funktionsaufruf der Typ des Übergabeparameters feststehen.

Grüße
 
Er will aber kein C++ verwenden

Ich wollte es ja nur vorschlagen.

Hier die C-Alternative (falls es dir wirklich so wichtig ist, den Quellcode nicht 2 mal zu schreiben..)


C++:
 // mystruct.h

struct mystruct{
  float aa;
  int bb;
};


  // myfunc.h

#include "mystruct.h"

void myfunc(mystruct&s , MYPARAMTYPE param)
{

  s.MYPARAMNAME = param;
}



 // main.cpp

#define MYPARAMTYPE float
#define MYPARAMNAME aa
#include "myfunc.h"


#define MYPARAMTYPE int
#define MYPARAMNAME bb
#include "myfunc.h"


Ich nenne es das "C-Template". Hab ich mir gerade ausgedacht :)

Wichtig ist, dass die Datei "myfunc.h" nicht multiple-inclusions geschützt ist...

Aber vielleicht ist es doch kein guter Programmierstil :)
 
Zurück