Confundida sobre la llamada de función en la syntax de C ANS

Estoy tratando con alguna syntax C pre-ANSI. Ver tengo la siguiente función de llamada en un condicional

BPNN *net; // Some more code double val; // Some more code, and then, if (evaluate_performance(net, &val, 0)) { 

Pero entonces la función evaluate_performance se definió de la siguiente manera ( debajo de la función que tiene el condicional mencionado anteriormente):

 evaluate_performance(net, err) BPNN *net; double *err; { 

¿Cómo se definió evalu_performance con dos parámetros pero se llamó con tres argumentos? ¿Qué significa el ‘0’?

Y, por cierto, estoy bastante seguro de que no se está llamando a algún otro evaluate_performance rendimiento definido en otra parte; He grep todos los archivos involucrados y estoy bastante seguro de que se supone que estamos hablando del mismo evaluate_performance aquí.

¡Gracias!

Si llama a una función que no tiene un prototipo declarado (como es el caso aquí), el comstackdor asume que toma un número y tipos de argumentos arbitrarios y devuelve un int . Además, short argumentos de tipo char y short se promueven a int s, y los de float se promueven a s double (estos se denominan promociones de argumentos predeterminados ).

Esto se considera una mala práctica en el nuevo código C, por razones obvias: si la función no devuelve int , la maldad podría asegurar que impida que el comstackdor compruebe que está pasando la cantidad y los tipos de parámetros correctos, y que los argumentos podrían ser promovido incorrectamente

C99, la última edición del estándar C, elimina esta característica del lenguaje, pero en la práctica, muchos comstackdores aún los permiten, incluso cuando operan en modo C99, por compatibilidad heredada.

En cuanto a los parámetros adicionales, son comportamientos técnicamente indefinidos según el estándar C89. Pero en la práctica, normalmente el tiempo de ejecución simplemente los ignorará.

El código es incorrecto, pero de una manera que no es necesario diagnosticar un comstackdor. (Un comstackdor C99 se quejaría de ello).

Las definiciones de funciones de estilo antiguo no especifican el número de argumentos que espera una función. Se supone que una llamada a una función sin un prototipo visible devuelve int y tiene el número y tipo de argumentos que implican las llamadas (con tipos enteros estrechos promovidos a int o unsigned int , y float promovido a double ) . (C99 eliminó esto; su código no es válido según el estándar C99).

Esto se aplica incluso si la definición precede a la llamada (una definición de estilo antiguo no proporciona un prototipo).

Si dicha función se llama incorrectamente, el comportamiento no está definido. En otras palabras, es responsabilidad del progtwigdor resolver correctamente los argumentos; El comstackdor no diagnosticará errores.

Esto obviamente no es una situación ideal; puede llevar a muchos errores no detectados.

Que es exactamente la razón por la cual ANSI agregó prototipos al lenguaje.

¿Por qué sigues tratando con definiciones de funciones antiguas? ¿Se puede actualizar el código para usar prototipos?

Incluso los comstackdores de C estándar son algo permisivos cuando se trata de esto. Intenta ejecutar lo siguiente:

 int foo() { printf("here"); } int main() { foo(3,4); return 0; } 

Será, para sorpresa de algunos, salida "here" . Los argumentos adicionales son simplemente ignorados. Por supuesto, depende del comstackdor.

La sobrecarga no existe en C, por lo que tener 2 declaraciones no funcionaría en el mismo texto.

¡Ese debe ser un comstackdor bastante viejo para no errar en este o no encontró la statement de la función todavía!

Algunos comstackdores no advertirían / ​​errarían al llamar a una función no definida. Eso es probablemente lo que estás encontrando. Le sugiero que mire los indicadores de la línea de comandos del comstackdor para ver si hay un indicador que pueda usar para obtener estas advertencias porque en realidad puede encontrar algunos errores similares (es probable que demasiados parámetros funcionen bien, pero también pocos harán uso de valores “indefinidos” …)

Tenga en cuenta que es posible hacer eso (agregar parámetros adicionales) al usar los puntos suspensivos como en printf ():

 printf(const char *format, ...); 

Me imagino que la función tenía 3 parámetros en algún momento y el último se eliminó porque no estaba en uso y algunas partes del código no se corrigieron como debería. Quitaría ese tercer parámetro, en caso de que la stack salga en el orden incorrecto y, por lo tanto, no envíe los parámetros correctos a la función.