Старый код: доступ к аргументам функции, переданным в качестве аргумента другой функции?

#c #ellipsis

#c #многоточие

Вопрос:

Я должен поддерживать старый фрагмент кода, который больше не работает корректно при компиляции на 64k машинах.

У меня есть функция «solve», вызывающая другую функцию «funct», переданную в качестве указателя:

int solve(double*x,double xA,double xB,double zeps,double funct(double x,double*),...)

Следовательно, «решить» можно использовать с различными возможными функциями, например :

double isDgood(double D,double*Y);

Из функции «solve» можно было вызвать функцию «funct» и получить доступ к ее аргументам с помощью:

fA=funct(xA,(double*)(amp;funct 1));"

Хотя я не знаком с этим синтаксисом, я предполагаю, что разработчик предполагал, что неуказанные аргументы были просто помещены в стек. Однако этот код больше не работает на платформах 64k. Как я могу исправить этот код? Должен ли я конкретно использовать Va_list?

Большое вам спасибо за вашу помощь.

Комментарии:

1. Да, для этого вам нужно было бы использовать механику VA. Как бы то ни было, это вызывает неопределенное поведение . (Который в течение многих лет выполнял то, что было целью кода.) Однако, разве это не было бы отличной возможностью модернизировать код? Используйте вместо этого объекты функции — вызывающий объект предоставляет аргументы конструктору объекта функции, а ваша solve функция вызывает только его. Вы даже можете создать их на лету с помощью std/boost::bind() .

2. большое вам спасибо за вашу помощь. Я попытаюсь использовать va_list. Еще раз спасибо!

Ответ №1:

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