Ziffer aus Variablenname extrahieren?



  • Hallo,

    ich versuche seit einiger Zeit, eine Zahl aus einem Variablennamen zu extrahieren. Es funktioniert ohne Weiteres, wenn ich eine bestimmte Variable innerhalb des Hauptprogramms behandele:

    Array erstellen (Könnte auch jede andere Art Variable sein):

    Mat_IO_DP array_temp_20; (Ich benutze numerical recipes)
    --> Aus dem Variablennamen "array_temp_20" versuche ich z.B., die "20" zu extrahieren.

    #define STRING(s) #s
    ........................................

    string matrix_string = STRING(array_temp_20);

    string numbers ="0123456789";

    int pos1 = matrix_string.find_last_of(numbers);

    double last = double((int(matrix_string[pos1]) - 48)); --> gibt mir die "0"

    int pos2 = matrix_string.find_last_of(numbers, pos1 - 1);

    double penultimate = double((int(matrix_string[pos2]) - 48));
    --> gibt mir die "2" usw.

    Das funktioniert Alles, problematisch wird es, wenn ich versuche, das Ganze in eine Funktion zu verpacken. Ich würde es dann gern so aus dem Hauptprogramm aufrufen:

    double temp = get_temp_from_name(array_temp_20);

    mit einem Funktionsprototypen:

    double get_temp_from_name(Mat_IO_DP array_name)

    Das funktioniert nicht, weil die Funktion dann mit dem Namen "array_name" arbeitet und nicht mit dem Namen "array_temp_20", was ich eigentlich versuche. Und in "array_name" ist ja keine Zahl, so bekomme ich auch nichts zurück. Habt Ihr eine Idee? Herzlichen Dank,

    Holger



  • Das geht nicht. Dein Makro zur Wandlung des Variablennamens in einen String wird zur Compilierzeit (sogar noch davor) ausgeführt und kann daher keine Variablennamen zur Laufzeit ermitteln. Also alles was dein Marko macht, ist dir Schreibarbeit abzunehmen. Flexibler als alles von Hand einzutragen ist es nicht wirklich.

    Aber wozu brauchst du das? Klingt nach mangelnder Erfahrung mit Arrays. 😉



  • Ich übergebe das Array an eine Funktion, die in Abhängigkeit von einer Temperatur (die eben im Namen steht) etwas mit dem Array macht. Ich könnte natürlich umständlich eine Funktion double mach_was(Mat_IO_DP array, double temp) definieren und dann in Abhängigkeit von der Variablen "temp" operieren, eleganter wäre es aber, eine Funktion double mach_was(Mat_IO_DP array) zu haben, die sich dann aus dem Variablennamen "array", also z.B. "array_temp_20" mittels einer Unterfunktion (z.B. double get_temp(array_temp_20)) die Temperatur selbst ermittelt. Verständlich? Grüße,

    Holger



  • Verständlich ja, aber unsinnig. Denn das ausführbare Programm arbeitet ohne Variablennamen. Das kennt diese gar nicht.



  • 😕 Weißt du, was ein Array ist? Und wie man auf einzelne Array-Elemente zugreifen kann? Dazu übergibt man keine Variablen(namen*), sondern Indizes.

    (* die Namen der Variablen sind nach dem Compilieren sowieso nicht mehr existent - nur noch der Speicher, der von ihnen reserviert wurde)



  • @ Fellhuhn:
    Unsinnig ist es nicht, den Sinn habe ich ja beschrieben. Trotzdem leider wohl doch unmöglich. Das heißt, ich übergebe dann also die Temperatur jedesmal mit. Viele Grüße und danke für die Hilfe,

    Holger



  • Zeig doch mal etwas (Pseudo)Code, damit wird uns den Sinn deines Programms vorstellen können.



  • @CStoll

    Eigentlich wie oben beschrieben:

    Array erstellen (Könnte auch jede andere Art Variable sein):

    Mat_IO_DP array_temp_20;
    In dieses Array lese ich z.B. Werte aus einer Datei ein, es ist aber unwesentlich, was da drin steht. Alles, was in der Datei und dann in meinem Array steht, sind Messwerte z.B. be 20°C, das steht aber nicht in der Datei, sondern das symbolisiert mir der Name des Arrays. Ich rufe dann eine Funktion auf, die mit den Messwerten etwas in Abhängigkeit von der Temperatur macht. Bis jetzt übergebe ich an diese Funktion sowohl das Array als auch den Temperaturwert. Idee war jetzt, eben nur das Array zu übergeben und die Finktion soll sich die Temperatur selbst ermitteln. Das geht z.B. so (wenn der Name des Arrays "array_temp_20" ist):

    #define STRING(s) #s
    ........................................

    string matrix_string = STRING(array_temp_20);

    string numbers ="0123456789";

    int pos1 = matrix_string.find_last_of(numbers);

    double last = double((int(matrix_string[pos1]) - 48)); --> gibt mir die "0"

    int pos2 = matrix_string.find_last_of(numbers, pos1 - 1);

    double penultimate = double((int(matrix_string[pos2]) - 48));
    --> gibt mir die "2" usw.

    Das funktioniert Alles, problematisch wird es, wenn ich versuche, das Ganze in eine Funktion zu verpacken. Ich würde es dann gern so aufrufen:

    double temp = get_temp_from_name(array_temp_20);

    mit einem Funktionsprototypen:

    double get_temp_from_name(Mat_IO_DP array_name)

    Verständlich?



  • Vielleicht wäre es etwas eleganter, wenn du die Temperatur einfach mit übergibst?
    Also so:

    void Bla( Mat_IO_DP arr, int temperatur )
    {
        // ...
    }
    
    ...
    Mat_IO_DP array_temp_20;
    // Werte aus Datei einlesen
    Bla( array_temp_20, 20 );
    


  • extract_numb_from_var_1 schrieb:

    Eigentlich wie oben beschrieben:

    Das von dir gewünschte ist weder sinnvoll noch mit C++ zur Laufzeit machbar (wie schon von mehreren erwähnt). Variablennamen sind nach compilieren nur noch Schall und Rauch, sie existieren einfach nicht mehr. Davon abgesehen finde ich kriptische Benennungen von Variablen und eine Programmsteuerung über eben diese einen schlechten Stil.

    Grundsätzlich ist auch ganz stark von Makros abzuraten. Es gibt nur wenige Einsatzgebiete wo Makros sinnvoll sind (u.a. als Includeguards).

    cu André



  • Nochmal langsam - "array_temp_20" IST das Array. Und du willst in einer Funktion immer das Element 20 davon verwenden. Liege ich soweit richtig? Wenn ja, wozu brauchst du überhaupt ein Array?

    Ansonsten: Wenn die Funktion alle Array-Elemente braucht, übergibst du das komplette Array, wenn sie nur einen Wert braucht, übergibst du nur diesen Wert:

    int function(int i);
    
    ...
    int array[20];
    cout<<function(array[15]);
    


  • @CStoll

    Auch nochmal langsam: Nein, ich brauche nicht nur das 20-te Element des Arrays, ich brauche in der Funktion das gesamte Array. Aber: Was mit all diesen Werten des Arrays in der Funktion passieren soll, hängt von einer Temperatur ab und diese ist in diesem Fall eben gerade "20" und wird durch den Namen des Arrays symbolisiert. Das heißt, ich will aus dem Namen z.B. die "20" extrahieren und dann z.B. alle Elemente des Arrays mit 20 multiplizieren oder jedes 20-te verwenden oder zu jedem 20 addiereen oder was auch immer. Besser verständlich?



  • @Badestrand

    Ja, das geht natürlich, aber eleganter wäre es natürlich, wenn ich nur das Array und nicht die Temperatur mit übergebe, weil diese Information ja im Arraynamen vorhanden ist. Ich mache es bis jetzt tatsächlich so, wie von Dir vorgeschlagen, muss aber eben für jedes Array die entsprechende Temperatur von Hand eintragen. Danke



  • Das heißt, zu einem gegebenen Array gehört genau ein fester Wert? Dann wäre es eventuell eine Möglichkeit, beides zu einem struct zusammenzufassen.



  • ... oder in eine std::map zu schreiben, die einen std::vector statt einem Array beinhaltet. Und dann mit .first den gesuchten Wert und mit .second den Array zu bekommen.



  • @CStoll

    Jawohl, so ist es, zu einem gegebenen Array gehört genau ein fester Wert. Man kann das natürlich zu einem struct zusammenfassen und das funktioniert ganz sicher. Ich hatte eben nur versucht, die Aufgabe ohne Einführung einer weiteren Variable, die ich (jeweils, es gibt einige dieser Arrays) von Hand eingebe, zu lösen. Weil ja diese Information im Arraynamen steckt, glaubte ich, das so auch lösen zu können, was nun aber wohl nicht möglich ist. Herzlichen Dank trotzdem für die Hilfe.


Log in to reply