Je suis passé de C à Fortran avec une solide base en C. Tout est assez simple, sauf les mécanismes réels de fonctionnement des blocs communs me laissent perplexe, et je ne trouve aucun endroit qui les décrit en détail.
Disons que j'ai le bloc commun suivant :
COMMON/MYBLOCK/ A,B,C
D'après ce que je comprends, cela va mettre de côté un morceau de mémoire qui contient trois...choses, qui ne sont pas vraiment associées aux noms dans le bloc, et en fait si j'ai le code suivant plus tard dans ma source :
SUBROUTINE MYSUB(...)
...
COMMON/MYBLOCK/ X,Y,Z
...
END
Alors maintenant X est associé à ce qui était autrefois A, et pareillement Y à B et Z à C.
Donc cela signifie que COMMON/MYBLOCK/
est... un tableau de pointeurs nuls lorsqu'il est déclaré ? Il n'y a pas de type associé à aucun de ces pointeurs, donc... la mémoire est allouée lorsqu'une valeur est assignée ? Que se passe-t-il si je dis A='A'
dans mon thread principal, puis dans MYSUB
je dis A=3.141592
? Si j'ai une subroutine que je veux retourner une valeur dans A
par référence (car elle fait partie d'une bibliothèque externe), puis-je simplement dire CALL MYSUB2(A)
et compter sur le compilateur pour s'en charger ? Ou dois-je appeler MYSUB2
sur une variable locale d'abord, puis l'assigner à A
?
C'est bizarre, Fortran est un langage si fortement typé partout ailleurs, mais les blocs communs sont juste comme "fais ce que tu veux, mec, nous ne faisons pas de types ici"...
0 votes
Pourquoi voulez-vous utiliser common? Ils ne devraient pas avoir été utilisés dans un nouveau code depuis 3 décennies. Utilisez des modules si vous devez vraiment avoir un état global et oubliez que vous avez déjà vu common - vous dormirez mieux pour cela. Ou regardez-vous un vieux code?
0 votes
Vous voulez dire qu'il y a des programmeurs en C qui travaillent sur du FORTRAN pour autre chose que du code hérité vieux de 30 ans ? Plus sérieusement, j'ai un vieux code hérité avec du
COMMON
partout, et j'essaie de comprendre ce qu'il fait en interne.0 votes
Obtenez une copie de l'avant-projet du standard Fortran 2018 (recherchez N2146.pdf). Lisez la section 8.10 sur l'association de l'espace de stockage. Si vous avez un ancien code qui contient beaucoup de blocs
COMMON
, il utilise probablement des instructionsEQUIVALENCE
. Quoi qu'il en soit, la section 8.10.2.1 commence par La déclaration COMMON spécifie des blocs de stockage physique, appelés blocs communs, qui peuvent être accessibles par l'une des unités de portée dans un programme. Ainsi, la déclaration COMMON fournit un dispositif de données global basé sur l'association de l'espace de stockage (19.5.3).0 votes
Si je comprends ce qui se passe, je pense que tous les blocs
COMMON
dans le code que je regarde sont utilisés pour stocker soit desREAL
soit des tableaux contenant desREAL
, donc le typage implicite suffit ? La recherche du fichier .f ne donne aucun énoncéEQUIVALENCE
. ÉDIT : Peu importe, il y a aussi desI
là-dedans, donc des entiers et des réels tous les deux. Néanmoins, tout est typé implicitement.0 votes
La typage implicite est mauvaise car elle peut entraîner des erreurs. Vous pouvez penser à un bloc
COMMON
comme à une structure statique globale en C où les noms des composants sont déterminés par la déclaration du blocCOMMON
et sa position dans le blocCOMMON
.0 votes
@evets Oui, et je jure que CHAQUE EXEMPLE que j'ai essayé de chercher pour comprendre les blocs
COMMON
l'utilisait, comme si le typage implicite était juste une bonne pratique de codage standard en Fortran au lieu d'un (j'espère) horrible artefact obsolète de la norme Fortran maintenu uniquement pour la compatibilité descendante.1 votes
Cela est simplement parce que les codes modernes avec de bonnes pratiques n'utilisent pas de blocs communs. Donc ceux qui le font restent... Ils sont généralement anciens.