Can this be done? If so how?

Jan 16, 2018 at 4:01pm
Don't get hung up on why or what is global. This is the simplest example of the problem I am trying to solve.

Can I programmatically set aaa = 5 using the setvar() function?
-----------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

double aaa = 1.0;

void setvar(const char* var, double val)
{
printf("function that Sets %s = %lf\n",var,val);
// What can I do here that sets a real variable
// from a string with that variables name?
}

int main(int argc, char **argv)
{
setvar("aaa",5.0);
// I want aaa = 5.0
printf("aaa = %lf\n",aaa);
}
Jan 16, 2018 at 4:06pm
Can I programmatically set aaa = 5 using the setvar() function?
Yes, that's the point of a global variable. You can change it from anywhere (where it is known).
Jan 16, 2018 at 4:23pm
Of course but that is not what I am asking? I am asking if setvar("aaa",5.0) can me made self aware of the char* "aaa", map that string to the real variable name aaa, and set it to 5.0?

Imagine a command line arg that contains a variable name and a value. Can you generically map the command line variable name to a real variable and set it's value?
Jan 16, 2018 at 4:27pm
Also note I don't want a solution like:

if (!strcmp(var,"aaa"))
aaa = val;

Is there a general solution to mapping a string to a variable name? If so how?
Jan 16, 2018 at 4:40pm
Maybe like this:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* TO DO find a better name */
struct Mapping 
{
   char name[25];
   double value;
};

Mapping mapping; // maybe can be array

void setvar(const char* var, double val)
{
   printf("function that Sets %s = %lf\n",var,val);
   // What can I do here that sets a real variable
   // from a string with that variables name?
  strcpy(mapping.name, var);
  mapping.value = val
}
Jan 16, 2018 at 4:53pm
I could do something like that if I was creating the code from scratch. The problem is that code/data structures that I am working with already exist. I would like to find a solution to this generically. I am guessing it can't be done.
Jan 16, 2018 at 5:00pm
goes211 wrote:
Imagine a command line arg that contains a variable name and a value. Can you generically map the command line variable name to a real variable and set it's value?

No. Names of variables (as well as names of most other source code entities) are not accessible to the program; they do not survive compilation. Eventually, standard C++ will get static reflection (making the program structure accessible at compile time), but for what you're describing, instead of a variable, you will need a data structure that associates a constant string with a mutable value.
Jan 16, 2018 at 5:03pm
No, in the general case this can't be done, because C++ doesn't have reflection.
https://en.wikipedia.org/wiki/Reflection_(computer_programming)

The best that can be done is have an std::map<std::string, T *> that you use to obtain a pointer to the thing you want to set/get. The problem with this is that you have to explicitly add values to the map, and if you don't, you won't be able to set those values, even if they do exist in the program.
Jan 16, 2018 at 5:21pm
I had a feeling I was screwed. I was not thinking about what survives compilation but that makes sense.

Thx for the help.
Jan 16, 2018 at 8:00pm
This is a problem with enums as well. You can't print the value of the enum's textual value, its 'lost' the same way. You can make a convoluted object that does all that, but its a memory hog, inefficient, and generally ugly -- lots of static strings wasting space (text is one of the most inefficient things in programs in terms of size to value).

and forget it if pointers or any complexity enter into it.
Last edited on Jan 16, 2018 at 8:01pm
Jan 16, 2018 at 8:22pm
It's not really all that inefficient. If the enum is continuous the size of the lookup structure can be as small as (sum_of_all_strings + sizeof(void *) * enum_values_count).
And the strings are not wasting space. If you added reflection to that enum presumably its because you needed that feature for something.
Jan 17, 2018 at 2:26pm
In my experience, what I've seen is separate helper programs (such as a Windows Form) that then generate the mappings of class/variable name to the string it represents. The source code has a note that it was automatically generated by ____. Sort of similar to how a lot of GUI-creator programs will generate the underlying code for you.
Topic archived. No new replies allowed.