Appeler des routines de programmation dans une structure appropriée…

la programmation


J’ai une question qui pourrait vous embarrasser, mais qui pourrait aussi m’embarrasser en même temps, mais voilà.

Voyons quelques exemples de programmation avec lesquels travailler en premier :

Déclaration d’une routine “C”
int RetIntDayNum(char * datestrg, int * intdaynum, int * iostat);

Déclarer la routine “C” simple et réelle.
int RetIntDayNum(char * datestrg, int * intdaynum, int * iostat) {
////



retourner(1);
}

Déclarer un appel “C”: Routine 1.
iretv = RetIntDayNum(cdatestring, &idaynum, &iostat);

Déclarer un appel “C”: Routine 2.
iretv = RetIntDayNum(cdatestring, &idaynum);

Ok, voici la question…
En appelant une routine « C », vous devez utiliser « Routine 1 ». Mais en élaborant mon projet de programmation, j’ai découvert plus tard et
réalisé que j’utilisais l’approche “Routine 2”, et à chaque fois que je compilais ce programme ;
Il a compilé correctement et s’est exécuté correctement.

Actuellement, j’utilise l’environnement Enterprise MSVC 2019, sur une plate-forme Windows 10.

Je sais qu’utiliser la « Routine 1 » est la bonne façon de faire les choses, mais pourquoi l’utilisation de la « Routine 2 » ne rend-elle pas le programme
exploser?. Pourquoi. Ou s’agit-il d’une explosion en attente, prête à se produire ?
Actuellement, je dois retourner dans ce gros programme et corriger toutes mes erreurs de programme. Mais ça dérange
moi, pourquoi l’approche “Routine 2” ne fait-elle pas exploser le programme (ou s’arrêter anormalement) maintenant.

Ou cette explosion attendue se produira-t-elle, une fois que
le programme fonctionne sur une plate-forme Windows complètement différente ??

Mon esprit curieux veut savoir…
Et encore, Merci !

Ce que j’ai essayé :

ce qui est affiché dans la zone de questions et dans mon projet de programmation.

Solution 1

Cela dépend du compilateur : la plupart vous donneront une erreur “trop ​​peu d’arguments pour fonctionner” lorsque vous essayez de l’appeler avec deux paramètres.

En dehors de cela, cela explosera probablement lorsque vous essaierez d’utiliser iostat dans la fonction car sa valeur ne sera pas définie et vous pourriez lire ou écrire dans n’importe quelle partie de la mémoire.

Je vérifierais ce que vous utilisez – MSVC était MicroSoft Visual C et c’était un produit autonome qui est devenu une partie de Visual Studio il y a environ 20 ans et qui n’a jamais eu de version 2019.
Et je suis presque sûr que VS 2019 générerait une erreur sur trop peu de paramètres pour un programme C (il est possible de définir des fonctions en C qui ont un nombre variable d’arguments – appelée fonction variadique – mais cela prend une syntaxe spéciale et la façon dont vous les utilisez est différente).

Solution 2

Tout d’abord, il faut faire une distinction entre la déclaration dans l’implémentation et l’appel d’une fonction. La ligne suivante n’est pas une déclaration mais une affectation :

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

VS2019 génère généralement toujours une erreur s’il ne trouve pas d’implémentation appropriée pour l’appel.

L’appel de

C
iretv = RetIntDayNum(cdatestring, &idaynum);

provoque l’erreur C2198 : « RetIntDayNum » : Pas assez d’arguments pour l’appel.
ou erreur C2660 : “RetIntDayNum” : la fonction n’accepte pas 2 arguments

VS2019 étant un compilateur C++, plusieurs questions peuvent se poser.
Le code est-il compilé en code C ou C++ et avec quelle version du compilateur ? VS2019 peut essentiellement compiler avec les normes suivantes : C++14, C++17, C++20, Legacy MSVC, std:c11, std:c17.

La seule explication à laquelle je puisse penser pour le comportement décrit est qu’il existe quelque part une autre fonction portant le même nom et seulement 2 paramètres.
La question de savoir si le programme peut “exploser” après une compilation (sans erreur) en raison du paramètre manquant ne peut pas être résolue, car on ne sait pas ce que font réellement les fonctions.
Dans tous les cas, vous ne pouvez accéder qu’aux variables également visibles par le compilateur. S’il existe des variables globales portant le même nom, cela pourrait être désagréable.

Solution 3

Je ne pouvais pas y croire. J’ai donc essayé le morceau de code suivant

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;
}

sur deux plateformes différentes :

  • Boîte Linux, gcc 9.4
  • Windows 10, VS2022, CL 19.34

Les deux compilateurs ont donné un erreur:

  • erreur : trop peu d’arguments pour fonctionner ‘RetIntDayNum’ (gcc)
  • erreur C2198 : ‘RetIntDayNum’ : trop peu d’arguments pour l’appel (CL)

コメント

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