2012-06-19 4 views
0

можно ли получить доступ значения переменного через другие переменный, как показано нижекосвенные переменный доступ в С не C++

char var[30]; 
char buffer[30]; 

strcpy(buffer, "ABC"); 

/*variable var is holding the "buffer" variable name as string*/ 
strcpy(var,"buffer") 

есть способ, чтобы получить доступ к переменному значению буфера «ABC», через переменный вар. ?

ответ

0

Вы можете попробовать с помощью union

Например:

union example { 
    char var[40]; 
    char buffer[40]; 
} e1; 

strcpy(e1.var, "ABC"); 

printf("%s is same as %s", e1.var, e1.buffer); 
+0

Мне нужно иметь динамические отладочные сообщения в моей программе на C. У меня есть файл, который содержит каждую переменную функции, которую я хочу напечатать. Я читаю этот файл и сохраняю имя переменных в переменной, называемой, например, L_sVarName, поэтому L_sVarName имеет имя переменной, которую я хочу напечатать. Вот почему я отправляю мой вопрос L_sVarName =»L_sName»/* переменная в файле, который я хочу, чтобы напечатать */ L_sName =»ABC» Так мне нужно найти способ, чтобы напечатать переменную L_sName значение «ABC» от ​​L_sVarName –

3

Ни в практическом плане в C, и вы действительно не хотите, чтобы в любом случае. Связывание вашей логики программы с именами ваших переменных - ужасная идея. Обычно я вижу, что люди пытаются это сделать, когда то, что им действительно нужно, - это своего рода тип коллекции (и массив, карта, что угодно).

Как насчет того, чтобы заполнить нас вопросом о том, что вы пытаетесь решить с этим?

За ваш комментарий:

мне нужно иметь динамические отладочные сообщения, у меня есть файл, который содержит каждую функцию переменный, которые я хочу напечатать.

Использование stringification в макросе:

#define str(s) #s 

int main() { 
    int bar; 
    str(bar) /* replaced by "bar" */ 
} 
+0

Мне нужно иметь динамические сообщения отладки, у меня есть файл, который содержит каждую переменную функции, которую я хочу распечатать. –

+0

Я в замешательстве, вы хотите получить доступ к таблице символов? Скаляры называются, но они содержат значения. В C исполняемый файл не содержит имен символов. Для этого вам нужно посмотреть таблицу символов, которая выводится из компилятора. – starbolin

+0

@TarekAbulNaga: Я отредактировал свой ответ за ваш комментарий. –

1

Не без существенного кода котла пластины. Имена переменных исключаются во время компиляции.

В теории вы можете can хранить карту от имен переменных до указателя на переменную.

1

Нет, вы не можете. Если вы хотите получить косвенный доступ, тогда объявите указатель и назначьте ему var.

char *forVar = var; 

// Now you can access/modify via [] operator. 
0

Таким образом, в основном вы хотите записывать некоторые переменные, когда они записываются в/считывают/передают функции и т. Д.?

Выполнение этого с помощью скомпилированного С затруднено, как уже упоминалось, особенно если вы оптимизируете свой исполняемый файл (-0n в инструкции компиляции), и в этом случае некоторые из переменных могут полностью исчезнуть или повторно использоваться другими переменными ,

Использование GDB

Сказав это, я знаю, GDB может войти доступ к переменным и такого рода вещи. Если вы должны написать скрипт python (см. http://sourceware.org/gdb/onlinedocs/gdb/Python.html), вы должны будете написать сценарий для записи содержимого переменной.

Смотрите этот вопрос еще: Do specific action when certain breakpoint hits in gdb

По требованию только с использованием сценариев предварительной компиляции

В качестве альтернативы, если вы просто хотели сделать это по требованию, вы бы лучше с помощью предварительной обработки сценария для добавления в пользовательские макросы или подобное, используя CSV-файл в качестве входных данных:

for each line in CSV: 
    read variable_name, file_name, variable_type 
    find all occurrences of variable_name in file_name 
    for each occurrence 
    insert printf(....) 

только по требованию, с помощью макросов

Удачи. Это не очень хороший способ сделать это, потому что вам обычно нужен какой-то поиск, и вам нужен способ выборочного вывода переменных в вашу функцию печати. В некоторых случаях вы могли бы сделать что-то вроде:

static char _LOGGED_VAR_001 = 'z'; 
static char _LOGGED_VAR_002 = 'z'; 

#define cMyVar   _LOGGED_VAR_001 
#define LOG_ALL_VARS() printf("Vals: %c, %c", _LOGGED_VAR_001, _LOGGED_VAR_002) 


void myFunc() 
{ 
    char cMyVar; // Gets macro'd to _LOGGED_VAR_001 with LOCAL scope 
    cMyVar = 'a'; // LOCAL scope _LOGGED_VAR_001 becomes 'a' 
    LOG_ALL_VARS(); // At this point you print out the LOCAL _LOGGED_VAR_001 
        // and the global _LOGGED_VAR_002 
} 

Вы получили бы Vals: a, z

Это очень некрасиво, будет работать только для переменных с локальной областью, портит круглый с потреблением памяти, может быть подвержен ошибкам и обычно Плохая идея.

По требованию, куча/дамп стека

Если у вас есть достаточно места, вы можете сбросить всю память по требованию в файл. Вероятно, это было бы не очень портативно, в зависимости от того, как это было сделано. Я не уверен, как это сделать, но надежным образом.

Рекомендация

Использование GDB для диагностики во время разработки. Это то, для чего он предназначен:

Для (например) анализа выпущенного кода (автоматические отчеты об ошибках) может потребоваться полная дампа, а затем анализ по желанию.

Смежные вопросы