Llamar a rutinas de programación en la estructura adecuada…

programación


Tengo una pregunta que puede resultarle agobiante, pero también puede que a mí me avergüence al mismo tiempo, pero ahí va.

Tengamos algunos ejemplos de programación con los que trabajar primero:

Declaración de una rutina “C”
int RetIntDayNum(char * datetrg, int * intdaynum, int * iostat);

Declarando la rutina “C” simple real.
int RetIntDayNum(char * datetrg, int * intdaynum, int * iostat) {
////



retorno(1);
}

Declarar una llamada “C”: Rutina 1.
iretv = RetIntDayNum(cdatestring, &idaynum, &iostat);

Declarar una llamada “C”: Rutina 2.
iretv = RetIntDayNum(cdatestring, &idaynum);

Bueno, aquí está la pregunta…
Al llamar a una rutina “C”, debe utilizar la “Rutina 1”. Pero al armar mi proyecto de programación, más tarde descubrí y
Me di cuenta de que he estado usando el enfoque de “Rutina 2” y cada vez que compilé este programa;
Compiló bien y funcionó bien.

Actualmente, estoy usando el entorno Enterprise MSVC 2019, en una plataforma Windows 10.

Sé que usar la “Rutina 1” es la forma correcta de hacer las cosas, pero ¿por qué el uso de la “Rutina 2” no hace que el programa funcione correctamente?
¿explotar?. Por qué. ¿O es una explosión esperada y lista para ocurrir?
Actualmente, tengo que volver a este gran programa y corregir todos los errores de mi programa. pero molesta
¿Por qué el enfoque de “Rutina 2” no hace que el programa explote (o finalice anormalmente) ahora?

¿O sucederá esta esperada explosión, una vez que esto?
¿El programa se ejecuta en una plataforma Windows completamente diferente?

Mi mente curiosa quiere saber…
Y de nuevo, ¡Gracias!

Lo que he probado:

lo que se muestra en el área de preguntas y en mi proyecto de programación.

Solución 1

Depende del compilador: la mayoría le dará un error “muy pocos argumentos para funcionar” cuando intente llamarlo con dos parámetros.

Aparte de eso, probablemente explotará cuando intentes usar iostat dentro de la función, ya que su valor no estará definido y podrías estar leyendo o escribiendo en cualquier parte de la memoria.

Verificaría lo que estás usando: MSVC era MicroSoft Visual C y era un producto independiente que pasó a formar parte de Visual Studio hace unos 20 años y que nunca tuvo una versión 2019.
Y estoy bastante seguro de que VS 2019 arrojaría un error con muy pocos parámetros para un programa en C (es posible definir funciones en C que tengan un número variable de argumentos, llamado función variada, pero eso requiere una sintaxis especial y cómo los usas es diferente).

Solución 2

En primer lugar hay que distinguir entre la declaración en la implementación y la llamada de una función. La siguiente línea no es una declaración sino una asignación:

C
iretv = RetIntDayNum(cdatestring, &idaynum, &iostat);

VS2019 generalmente siempre genera un error si no puede encontrar una implementación adecuada para la llamada.

la llamada de

C
iretv = RetIntDayNum(cdatestring, &idaynum);

provoca el error C2198: “RetIntDayNum”: no hay suficientes argumentos para la llamada.
o error C2660: “RetIntDayNum”: La función no acepta 2 argumentos

Como VS2019 es un compilador de C++, pueden surgir varias preguntas.
¿El código está compilado como código C o C++ y con qué versión del compilador? VS2019 básicamente puede compilar con los siguientes estándares: C++14, C++17, C++20, Legacy MSVC, std:c11, std:c17.

La única explicación que se me ocurre para el comportamiento descrito es que en algún lugar hay otra función con el mismo nombre y sólo 2 parámetros.
La pregunta de si el programa puede “explotar” después de una compilación (sin errores) debido a la falta de un parámetro no puede responderse, ya que no se sabe qué hacen realmente las funciones.
En cualquier caso, sólo se puede acceder a variables que también sean visibles para el compilador. Si hay variables globales con el mismo nombre, esto podría resultar desagradable.

Solución 3

No podía creer eso. Así que probé el siguiente código

C
#include <stdio.h>
  

int RetIntDayNum(char * datestrg, int * intdaynum, int * iostat);

int main()
{

  char foo[] = "foo";
  int daynum = 42;
  int iostat = 10;

  RetIntDayNum(foo, &daynum, &iostat);
  RetIntDayNum(foo, &daynum);

  return 0;
}


int RetIntDayNum(char * datestrg, int * intdaynum, int * iostat)
{
  printf("datestrg %s, intdaynum %d, iostat  %d\n");
  return 0;
}

en dos plataformas diferentes:

  • Caja Linux, gcc 9.4
  • Ventanas 10, VS2022, CL 19.34

Ambos compiladores dieron una error:

  • error: muy pocos argumentos para funcionar ‘RetIntDayNum’ (gcc)
  • error C2198: ‘RetIntDayNum’: muy pocos argumentos para la llamada (CL)

コメント

タイトルとURLをコピーしました