Stringinhalt als Variablenname
-
Guten Abend.
Ich habe ein zwei Strings mit einem variablen und einem festen Wert. Ich häng den variablen an den festen Wert dran. Nun brauch ich den Wert des String, um einen Datentyp int zu deklarieren.
Wie könnte ich das machen? Das Problem ist, der Name ist ja variabel, da auch der eine Wert variabel ist, somit kenne ich den Namen ja nicht.Habt ihr eine Idee?
Mit freundlichen Grüßen
Moadeh
-
1. Ich glaube nicht, dass das mögliche wäre.
2. Du kannst ja nichtmehr auf die Variable zugreifen und von ihr einen Nutzen erlangen weil der Wert wie deiner Meinung nach erst zur Laufzeit bestimmt wird. Wie willst du denn dann mit dieser Variable arbeiten.3. Es wäre nett wenn du uns schreiben würdest wie und warum du das so machen möchtest.
Hier mal ein Link zu google.
www.google.de (Ist ne´ Suchmanschine).P.S.: Auch ich wollte mal sowas machen aber dann ist mir aufgefallen ,dass das wenig Sinn macht. Kopf hoch :p
-
ev. kannst du dein problem mit arrays lösen.
-
simon.gysi schrieb:
ev. kannst du dein problem mit arrays lösen.
Was ähnliches habe ich im Chipforum gefunden.
Habe ich aber noch nicht ausgecheckt:
http://forum.chip.de/c-c/inhalt-strings-variablenname-schwer-beschreibendes-problem-955249.htmlVielleicht hilft das dir ja weiter.
-
In C bräuchte ich das gelöst. Aber trotzdem danke für den Link.
Anstatt jetzt hier groß zu erklären, stell ich mal einen Beispielcode rein.
int speicherzaehler; char A[2] = {'Z'}; char B[1]; for(speicherzaehler=1;speicherzaehler<=3;speicherzaehler++) { sprintf(B, "%i", speicherzaehler); lstrcat(A, B); }Der letztliche Name ist also nicht abhängig von irgenteiner Eingabe des Users, sonder nur von der Schleife. Im richtigen Code wären es mehr als 3 (Z1, Z2, Z3) Namen, daher möchte ich das so machen. Ich schätze die Anzahl mal auf 200 Namen, die ich so generieren möchte/muss. Das müsste doch eigendlich gehen, weil beim compilieren die Namen ja festgesetzt werden.
Ich denke mal es trägt nicht unbedingt zu Übersichtlichkeit bei da 200 int zu deklarieren und dann mit denen noch über GetDlgItemInt Werte einzulese ohne jegliche Schleife. Ich denke zum Code muss ich ja sonst nichts sagen. Sollte leicht zu verstehen sein.Und naja wie man sieht benutze ich ja schon Arrays. Nur kann mir das ja auch nicht helfen.
Hat jemand eine Idee?
Mit freundlichen Grüßen
Moadeh
-
Also erstmal generell vorweg: Wenn Du das vor hast, was der Titel dieses Threads impliziert, dann geht das nicht: Der Inhalt von Variablen steht erst zur Laufzeit (mal abgesehen von Konstanten) fest. Der Compiler muss aber vor der Compilierung wissen, wie seine Variablen heißen (statisch). Des weiteren: wie willst Du auf die Variablen zugreifen? Davon abgesehen, ist eigentlich noch nicht nötig. Wozu brauchst Du sowas denn? *Was* hast Du vor?
Moadeh schrieb:
int speicherzaehler; char A[2] = {'Z'}; char B[1]; for(speicherzaehler=1;speicherzaehler<=3;speicherzaehler++) { sprintf(B, "%i", speicherzaehler); lstrcat(A, B); }Ich denke zum Code muss ich ja sonst nichts sagen. Sollte leicht zu verstehen sein.
Ähm, dass der Code einen Überlauf erzeugt, ist Dir aber klar, oder?
Du kopierst in B den 'Inhalt' von speicherzaehler, wobei anschließend noch die Null-Terminierung angehängt wird - schlecht. Das Gleiche gilt für Dein lstrcat:A ist so definiert: [0][1] Z 0 Wenn Du dort noch was anhänst, ist das n bissl eng^^.
-
Hmm..
Das ist doch A[2]. Das heißt ich habe zwei Felder plus die nullterminierung zur Verfügung. Da B[1] ist, ist genug Platz für eine Zahl. B[1] wird ja wieder nullterminiert.
D.h. B[0] beansprucht bei lstrcat hinterher nur A[1]. In A[0] steht Z und für die nullterminierung ist dann noch Platz in A[2].
Aber diesen Codeabschnitt habe ich schon getestet. Es kommt das gewünschte Ergebniss raus (unter der Bedingung das die deklaration in der Schleife stattfindet, sonst wird wirklich nichts am richtigen Ort angehängt.)Nochmal berichtigt.
int speicherzaehler; char B[1]; for(speicherzaehler=1;speicherzaehler<=3;speicherzaehler++) { char A[2] = {'Z'}; sprintf(B, "%i", speicherzaehler); lstrcat(&A[1], B); }Was ich machen möchte:
Ich habe einige Editboxen. Über GetDlgItemInt() möchte ich die Werte auslesen, mittels der IP, die durch die For-Schleife hochgezählt wird. Die Werte müssen, nach einigen anderen Aktionen wieder in die jeweiligen Editboxen eingesetzt werden. Um letztlich die einzelnen Werte anwählen zu können brauche ich anständige Name. Daher hänge ich dann die ID (also speicherzaehler) an die Bezeichnung, wo die Editfenster vorkommen. Den Versuch diese Namen zu erstellen seht ihr oben. Mir fehlt jetzt nur noch die Idee, wie ich A[0] als Variablenname nehmen kann.Mit freundlichen Grüßen
Moadeh
-
Moadeh schrieb:
Das ist doch A[2]. Das heißt ich habe zwei Felder plus die nullterminierung zur Verfügung. Da B[1] ist, ist genug Platz für eine Zahl. B[1] wird ja wieder nullterminiert.
"char A[2]" hat Platz für genau 2 Zeichen - und dabei mußt du das '\0' als Endemarke mitzählen (bleibt also nur noch 1 Byte "Nutzlast"), B ist mit dem Null-Terminator schon vollends ausgelastet.
Aber diesen Codeabschnitt habe ich schon getestet. Es kommt das gewünschte Ergebniss raus (unter der Bedingung das die deklaration in der Schleife stattfindet, sonst wird wirklich nichts am richtigen Ort angehängt.)
Wenn da wirklich etwas vernünftiges rauskommt, hast du sehr viel Glück gehabt - du schreibst in Speicher, der dir nicht gehört, da kann dir niemand garantieren, wem du irgendwelche wichtigen Daten pulverisierst.
(hier hast du offenbar nur Datenmüll ge"troffen", aber du könntest genausogut andere Variablen oder gar die Rücksprungadresse deiner Funktion bei dem Versuch überschreiben)Was ich machen möchte:
Ich habe einige Editboxen. Über GetDlgItemInt() möchte ich die Werte auslesen, mittels der IP, die durch die For-Schleife hochgezählt wird. Die Werte müssen, nach einigen anderen Aktionen wieder in die jeweiligen Editboxen eingesetzt werden. Um letztlich die einzelnen Werte anwählen zu können brauche ich anständige Name. Daher hänge ich dann die ID (also speicherzaehler) an die Bezeichnung, wo die Editfenster vorkommen. Den Versuch diese Namen zu erstellen seht ihr oben. Mir fehlt jetzt nur noch die Idee, wie ich A[0] als Variablenname nehmen kann.Dann nimm doch ein Array der passenden Größe:
int Z[MAX_SIZE]; for(int i=0;i<MAX_SIZE;++i) { Z[i] = GetDlgItemInt(ID_START+i); ... }
-
Okay. Danke schön. An diese Möglichkeit habe ich noch leider nicht gedacht. Jetzt funktioniert es.
Und zu Arrays: Ich dachte immer ein Array A[2] hätte folgende Felder:
A[0], A[1], A[2]
In A[2] kommt selbstverständlich die NULL-Terminierung. Aber Ich hab dann noch zwei Felder unbesetzt. Der Computer fängt doch bei 0 anzuzählen. Wieso hätte ich dann nur 1 Feld zur Verfügung? Oder sieht die NULL-Terminierung so aus?:
A[1]= '\';
A[2]= '0';Mit freundlichen Grüßen
Moadeh
-
Ja, der Computer beginnt bei 0 mit der Zählung, aber beim Anlegen des Arrays gibst du nicht den maximalen Index an, sondern die Elementanzahl - "char A[2];" besteht aus den beiden Elementen A[0] und A[1]. A[2] gehört nicht mehr zum Array, welchen Wert du dort überschreibst, ist Glückssache.
-
Okay, da hatte ich dann wohl irgendwann mal etwas falsch verstanden.
Danke CStoll. Genauso für die Lösung der eigendlichen Frage.Mit freundlichen Grüßen
Moadeh