Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Ziffer aus Variablenname

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
22.01.2008, 09:44 Uhr
~ziffer_aus_variablenname
Gast


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
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.01.2008, 10:47 Uhr
0xdeadbeef
Gott
(Operator)


Das geht nicht so, wie du dir das vorstellst. C++ ist keine Skriptsprache, das bedeutet, die Symbolnamen sind zur Laufzeit gar nicht mehr vorhanden, und selbst in den meisten (allen?) Skriptsprachen kommst du nach der Indirektion durch einen Funktionsaufruf nicht mehr an den Namen des Symbols außerhalb der Funktion ran. Wenn die Variable durch mehrere Funktionsaufrufe durchgeschleift wurde, hat das Programm ja keine Chance zu wissen, welchen Namen du jetzt meinst.

Man könnte wohl etwas bauen wie

C++:
double get_temp_from_name_impl(std::string const &s) {
  ...
}

#define get_temp_from_name(x) get_temp_from_name_impl(STRING(x))


...aber ich gehe davon aus, dass das 1. nicht macht, was du willst und 2. warum schreibst du in dem Fall nicht einfach

C++:
int x = 20;


statt

C++:
int x = get_temp_from_name(foo_bar_20);


?

Was du da vorhast, sieht mir nach denkbar schlechtem Stil aus. Willst du möglicherweise eigentlich ein Array benutzen?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.01.2008, 11:15 Uhr
~extract_numb_from_var
Gast


@0xdeadbeef:

int x = get_temp_from_name(foo_bar_20);

anstatt

int x = 20;

könnte ich natürlich schreiben, aber stell Dir vor, es gibt arrays, die heißen
foo_bar_20, foo_bar_300, foo_bar_452, foo_bar_805 usw.

Ich muss dann ja jedesmal den integer umschreiben, was natürlich geht. Komfortabler wäre es aber eben, wenn man das per Funktion machen könnte, also z.B.

int x = get_temp_from_name(foo_bar_452); --> in x steht 452
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.01.2008, 11:19 Uhr
0xdeadbeef
Gott
(Operator)


Na, die Zahl musst du eh in beiden Fällen von Hand hinschreiben. Zur Laufzeit ist der Variablenname, wie gesagt, nicht mehr vorhanden.

Aber wenn du Arrays hast, warum benutzt du dann nicht Arrays?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.01.2008, 11:31 Uhr
~extract_numb_from_var
Gast


@0xdeadbeef:

Ich benutze Arrays, aber das löst hier nicht mein Problem. Ich vergebe jeweils einen Namen für ein Messwertarray, der die Temperatur symbolisiert (Die Temperatur selbst steht dabei nicht im Array). In diesem Sinne gebe ich die Zahl tatsächlich einmal von Hand ein. Nun will ich etwas mit dem Array in Abhängigkeit von dieser Temperatur machen und wollte deswegen diesen Wert wieder aus dem Namen extrahieren und nicht nochmal von Hand eingeben, was ich als Vorteil anerkennen würde. Aber ich verstehe, dass das wohl nicht möglich ist.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.01.2008, 11:34 Uhr
0xdeadbeef
Gott
(Operator)


Also willst du eigentlich ein zweidimensionales Array?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
22.01.2008, 11:53 Uhr
~extract_numb_from_var
Gast


@0xdeadbeef

Ich hoffe, Ihr wollt mich nicht fertigmachen:

Nein, ich habe ein zweidimensionales Array und das übergebe ich an eine Funktion. Diese Funktion soll dann in Abhängigkeit einer Temperatur, die durch den Arraynamen symbolisiert wird (Die Temperatur selbst steht dabei nicht im Array), etwas mit den Arraywerten machen, also z.B. (bei temp=20 z.B.) alle Arraywerte mit 20 multiplizieren oder 20 addieren oder jedes 20-te nehmen oder Ähnliches. Um zu wissen, was zu tun ist, muss das Array diese Temperatur kennen und die hoffte ich eben aus dem Namen zu extrahieren und so nicht mit übergeben zu müssen. Comprendes?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
22.01.2008, 12:08 Uhr
0xdeadbeef
Gott
(Operator)


Ich hab kein Interesse daran, irgendjemanden fertig zu machen, ich versuche nur, dein Problem zu verstehen.

Aaalso: Du hast ein Array von Werten, und eine Temperatur. Eine Funktion soll mit dem Array abhängig von der Temperatur etwas machen. Was ich jetzt nicht verstehe ist, warum die Temperatur in den Variablennamen muss. Du könntest sie doch einfach als gesonderten Parameter an die Funktion übergeben, oder? Also

C++:
void tu_etwas_mit_dem_array(double das_array[], int temperatur) {
  ...
}

// Und dann später
// statt tu_etwas_mit_dem_array(foo_bar_20);
tu_etwas_mit_dem_array(foo_bar, 20);
// ...wobei foo_bar das Array ist.


...oder, wenn du das fest zusammenketten willst, etwas in der Art:

C++:
struct temperiertes_array {
  double array[LAENGE];
  int temperatur;
};


...und dann halt das struct als Referenz rumreichen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 22.01.2008 um 12:09 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
22.01.2008, 12:15 Uhr
~extract_numb_from_var
Gast


@0xdeadbeef


Das siehst Du absolut richtig. Man kann das natürlich zu einem struct zusammenfassen oder man kann die Temperatur auch als gesonderten Parameter übergeben 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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: