V
wastl schrieb:
Ja. So etwa könnte das aussehen:
void fuellen_1(array& a, const int n,const double alpha)
{
double x=anfang;
for(int i=0;i<n;i++)
{
a[i] = tolle_math_funktion_99(i,x,alpha);
x += 1;
}
}
void fuellen_2(array& a, const int n, const double alpha, const double beta)
{
double x=anfang;
for(int i=0;i<n;i++)
{
a[i] = tolle_math_funktion_79(i,x,alpha,beta);
x += 1;
}
}
Nicht besonders spannend. Was tolle_math_funktion_99 usw. darstellt, ist für die Problemstellung unerheblich. Ich möchte Ähnliches unter einen Hut bringen, so wenig wie möglich wiederholen (und später vielleicht ändern müssen). Leider ist schon die Signatur der Funktionen von drei verschiedenen Arten.
Bisher habe ich die Schleife 3x programmiert, innen wird dann ein Funktionspointer aufgerufen.
Weder array noch anfang waren spezifiziert. Hab da improvisiert.
Erstmal zur Unterhaltung ein wenig 80-er-Jahre-Code:
double soeinfenster(int i,double x,double,double)
{
return x;
}
double anderesfenster(int i,double x,double alpha,double beta)
{
return x+alpha+beta;
}
void fuellen(double* a,int n,double(*func)(int,double,double,double),double alpha=0,double beta=0)
{
double x=0;
for(int i=0; i<n; i++)
{
a[i] = func(i,x,alpha,beta);
x += 1;
}
}
int main()
{
double arr[10];
fuellen(arr,10,soeinfenster);
fuellen(arr,10,anderesfenster,2.71,3.14);
fuellen(arr,10,anderesfenster,2.71);//kein compilerfehler!
// fuellen(arr,10,[](int i,double x,double,double){return 1;});//nö
}
Kannst die Lamdas schon mißbrauchen, um "Parameter" nach unten durchzureichen:
template<typename FUNC>
void fuellen(double* a,int n,FUNC func)
{
double x=0;
for(int i=0; i<n; i++)
{
a[i] = func(i,x);
x += 1;
}
}
int main()
{
double arr[10];
fuellen(arr,10,
[](int i,double x)
{//soeinfenster
return x;
});
double alpha=2,beta=3;
fuellen(arr,10,
[alpha,beta](int i,double x)
{//anderesfenster
return x+alpha+beta;
});
}
Aber der Code macht mich ein Bißchen traurig. Irgendwie drückt er Deine Füll-Funktionen nicht aus. Generatoren würden es eigentlich ausdrücken, aber die sind so unlogisch zu implementieren irgendwie, man muss tricksen, um Schleifen hinzubekommen, die man viel leichter direkt schreiben könnte. Und bind fällt bei mir gleich aus jeder Betrachtung. Bleiben also nur noch gute alte Makros übrig, um die drei Funktionen zu vereinheitlichen. Hihi, wem ist gerade vor Schreck die Kaffetasse aus der Hand gerutscht?
double soeinfenster(int i,double x)
{
return x;
}
double anderesfenster(int i,double x,double alpha,double beta)
{
return x+alpha+beta;
}
template<typename FUNC,typename... ARGS>
void fuellen(double* a,int n,FUNC func,ARGS... args)
{
double x=0;
for(int i=0; i<n; i++)
{
a[i] = func(i,x,args...);
x += 1;
}
}
int main()
{
double arr[10];
fuellen(arr,10,soeinfenster);
fuellen(arr,10,anderesfenster,2.71,3.14);
// fuellen(arr,10,anderesfenster,2.71);//compilerfehler
fuellen(arr,10,[](int i,double x){return 1;});//naja, wer's mag...
}