2010-01-20 2 views
1

У меня есть функция, void funct (struct *B). Он будет вызываться некоторыми примерами struct A. Он принимает только указатель на strut B и модифицирует экземпляр struct B. Если struct A имеет char *name. Мой вопрос: могу ли я получить доступ к A_instance->name? в funct? Если да, то как? СпасибоКак я могу получить информацию о вызывающем абоненте функции в C?

+7

Структуры не могут ничего назвать. Пожалуйста, разместите код, который иллюстрирует то, о чем вы просите. – 2010-01-20 21:40:53

+0

Что это значит, что это «вызвано некоторыми примерами»? –

+0

Функция будет вызываться в других функциях – derrdji

ответ

3

Вы говорите, что это C, который выходит из функции-члены (C не имеет функции-члены, классы и т.д.). Это означает, что funct - это просто функция (не член чего-то), и поэтому у вас есть только информация, которая передается, и глобальные переменные. Поскольку ни одна из этих вещей не содержит то, что вы хотите, вы не можете ее получить.

Однако вы также говорите, что funct вызывается «некоторыми экземплярами структуры A». Это не имеет никакого смысла, потому что в структурах C нет функций-членов, и поэтому они не могут совершать вызовы. Либо вы имеете в виду, что операции над некоторыми экземплярами структуры A вызывают функцию (в этом случае применяется мой первый ответ), либо вы действительно работаете с C++, и у вас есть функции-члены в структуре A.

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

Чтобы исправить это, вам понадобится функция funct, чтобы быть функцией-членом struct A (тем самым перейдя на C++), или вам понадобится передать соответствующую информацию в функцию.

0

Это звучит, как вы пытаетесь написать функцию, которая должна обработать значение name которое присутствует в 2-х разных структур: struct A и struct A. Если это так, то почему бы не взять char* непосредственно в функции и позвонить ли вызывающим абонентам соответствующее поле name?

funct(char * name) { 
    .. 
} 

funct(aInstance->name); 
funct(bInstance->name); 
+2

Почему вы и другие считают необходимым перескакивать с предположениями, когда кто-то может немного подгонять вопросника, чтобы сформулировать его вопрос более точно, на благо всех? – 2010-01-20 21:44:32

+0

интерфейс функции исправлен. он принимает только структуру B * – derrdji

+0

@Neil, habbit.Я нахожу, что неправильный ответ скорее подскажет разъяснение вопроса, чем комментирует исходный вопрос. Возьмем этот пример, О.П. прокомментировал разъяснение ~ 3 минуты после моего ответа. – JaredPar

0

Я боюсь, что C не позволяет вам получить доступ к данным вызывающих функций. Проще всего было бы просто передать указатель на «А структура», по крайней мере, тогда вы всегда будете иметь доступ к А.

void func(struct B* b_ptr, struct A* a_ptr) 
{ 
    /* ... */ 
    /* do whatever you like with a_ptr->name */ 

} 
0

Если у вас есть программа, как что:

struct B { 
    int dummy; 
} 

struct A { 
    char *name; 
    struct B* b; 
} 

void funcA (struct A* a) { 
    funcB (a->b); 
} 

void funcB (struct B* b) { 
    /* do something */ 
} 

и вы хотите узнать что-то о a в funcB, нет правильного способа сделать это. То, что вы может попытаться сделать, используя указатели арифметические или отрицательные индексы массива, до угадать местоположение a в стеке, что может даже работать с данным компилятором на данной платформе. Если вы сделаете так, пожалуйста, не забудьте опубликовать решение по адресу The Daily WTF.

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