Reputation: 4962
How can I avoid passing a "config" variable in every function which uses this configuration. what is the most accurate way to make such a behavior.
This is my code: main.c
/* Complex Numbers Linking to proper variable */
typedef struct tagConfigNames {
char name;
complex *cnum;
} config_names;
/* Set command to function */
struct {
char *name;
void (*func)(config_names[]);
} cmd[] = {{"read_comp", read_comp}, {"print_comp", print_comp}, {"halt", halt},{"not_valid", NULL} };
int main()
{
complex a,b,c,d,e,f;
config_names cnumbers []= {{'a', &a}, {'b', &b}, {'c', &c}, {'d', &d}, {'e', &e}, {'f', &f},
{'A', &a}, {'B', &b}, {'C', &c}, {'D', &d}, {'E', &e}, {'F', &f},
{'#', NULL}};
char command[30];
int i;
/* Run Forever */
while(1)
{
if (scanf("%s", command) == 1) {
for (i = 0; cmd[i].func != NULL; ++i) {
if (strcmp(command, cmd[i].name) == 0)
break;
}
if (cmd[i].func == NULL) {
printf("Error: no such command!\n");
} else {
(*(cmd[i].func))(cnumbers);
}
}
}
return 0;
}
complex.c
complex* find_complex_number(config_names cnames[], char ch)
{
int i;
for (i = 0; cnames[i].cnum != NULL; i++) {
if (cnames[i].name == ch)
break;
}
return cnames[i].cnum;
}
void read_comp(complex_names cnames[])
{
//....
if ((complex_num = find_complex_number(cnames, ch)) == NULL) {
printf("Error: No such complex number\n");
return;
}
//....
}
What I am actully trying to avoid is the config_names cnumbers
which is passed in every function.
is there a smarter way to approach such a behavior?
EDIT:
I need to declare the complex a,b,c,d,e,f; only on the main.c file. thats why i'm avoiding global variables
Upvotes: 2
Views: 171
Reputation: 11791
To expand on the above, you might want to gather all functions depending on this in a file, and make the global (or thread local) variable static
there, so as keeping polution to a minimum.
Upvotes: 1
Reputation: 70931
If the "configuration" is constant for each thread of the application you might consider defining it globally.
Upvotes: 3
Reputation: 2762
If the config is constant for every thread, or you're not using threads, you may use a global variable. Otherwise you can use Thread Local Storage, it will be like a global variable but specific to each thread.
Upvotes: 2