Salut,
J ai un probleme de compilation:
j ai ecrit un program en F77, et ca marche, mais sur un compilateur F90 sur mon pc ca donne erreur, alors qu est ce qu il faut rectifier?
merci
Salut,
J ai un probleme de compilation:
j ai ecrit un program en F77, et ca marche, mais sur un compilateur F90 sur mon pc ca donne erreur, alors qu est ce qu il faut rectifier?
merci
error 112,reference to undefined variable , array element or function result
Bonjour,
D'après le message d'erreur, tu utilises une variable/un élément de tableau/ une fonction non définie...
Visiblement ton compilateur 77 tolérait celà, mais pas ton compilateur 90 (ce qui est à mon gout plus sain).
As-tu pensé à utiliser un "implicit none" dans ton programme et à compiler avec un maximum d'options de diagnostiques d'erreurs?
Tu as raison, j oublies tjs le implicit none, j esseyerai et je te dirai si le probleme existe ou pas
Malheuresement le message existe toujours,
en effet il compile sans erreurs, mais dans apres, dans l affichage, ca me donne ce message
Salut !
Une méthode rustique mais souvent efficace, c'est la dichotomie (le nom est affreux, mais la méthode est toute simple):
Tu ajoutes, à peu près au milieu de ton programme, une instruction Print ou Write pour afficher une ou plusieurs variables qui te semblent être intéressantes, puis tu exécutes. Selon qu'une valeur est affichée ou non, tu sais si l'erreur est dans la première moitié ou dans la seconde.
Puis tu ajoutes un Print ou un Write au milieu la moitié qui contient l'erreur, et ainsi de suite, jusqu'à ce que tu saches dans quelle instruction se produit l'erreur. Tu affiches alors successivement toutes les variables utilisées dans cette instruction.
Cette méthode est utilisée surtout pour déverminer de très gros programmes, et, dans ton cas, c'est peut-être utiliser un marteau-pilon pour écraser une mouche, mais ça marche.
Bonne chance
Jean-Marc Blanc
Calcul numérique de processus industriels
Formation, conseil, développement
Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)
Slalut ,
Jean Marc, le compilateur F90 me donne l erreur dans un sous program, sans preciser,
malgre que le program marche tres bien en F77
Salut!
De deux choses l'une: ou bien tu as le fichier source de ton sous-programme, ou bien tu ne l'as pas.
Dans le premier cas, c'est très simple: tu appliques la méthode de la dichotomie à l'intérieur de ton sous-programme. Tu peux aussi vérifier (à l'intérieur du sous-programme), si tous les paramètres ont des valeurs correctes.
Dans le second cas, c'est un peu moins simple: tu vérifies les valeurs de tous les paramètres juste avant l'instruction d'appel de ton sous-programme. Maintenant, le plus ennuyeux pour toi serait qu'il y ait une erreur dans un sous-programme qui n'est pas de toi.
Bonne chance
Jean-Marc Blanc
Calcul numérique de processus industriels
Formation, conseil, développement
Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)
Je pense que j ai trouver le truc
Le compilateur F77 est sur lunix, tant que le compilateur F90 est sur windows.
Alors est ce que c est le vrai probleme?
si oui comment regler ce cas?
merci
C'est probablement un appel à une fonction ou routine propriétaire du compilateur F77 et elle n'existe pas dans ton compilateur F95. Normalement, le message d'erreur doit être accompagné du nom de la fonction ou de la routine problématique.
Tu as raison,
J ai fait appelle a une subroutine, et elle me donne erreur ( c est moi qui a construit cette subroutine)
Est-ce une erreur de compilation ou de link ?
Je ne vois pas le lien entre le fait que ce soit une de tes routines et le fait que ce soit sensible à la plateforme / compilateur.
Peux-tu nous fournir une copie de l'affichage au moment où l'erreur se produit ? Avec quelques lignes avant le message ?
Voila exactemenr ce que j obtient apres compilation (pas d erreurs dans la compilation)
Run-time Error
*** Error 112, Reference to undefined variable, array element or function result (/UNDEF)
MATMULL - in file gggggggg.f95 at line 88 [+01ce]
main - in file gggggggg.f95 at line 41 [+0909]
Dans mon manuel Compaq, on dit qu'une variable est defined when you give it a value.
Donc, l'erreur est que tu n'as pas assigné de valeur à la variable MALMULL (?) à la ligne 88 (?)
Si j ai donne' une valeur a la subroutine Matmull, et cela ce voit clairement avec les resultats de F77.
Pour voir plus le probleme acceptez vous que je vous donne le programme?
C'est de loin la chose à faire; sinon on peut supputer à volonté (et pendant longtemps)...
Montre donc la source, ou si il y en a des tonnes, au moins les parties concernées (c.-à-d. les blocs de code aux alentours des lignes 41 et 88).
Voila le code,
en fait Si tu a une matrice A et tu la decompose par A=C_1+C_2 (C1 et C2 sont des matrices superieures et nferieures)
ce program resoud le systeme lineaire AX=b par une methode iterative C1X^n+1+C2 X^n=b
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111 program ligne real A(3,3),B(3),C1(3,3),C2(3,3),X(3),Xold(3),M2(3) & , normee, norme & , verif, sm(3) integer i,j, num_iter read*,((A(i,j),j=1,3),i=1,3) print 10,((A(i,j),j=1,3),i=1,3) 10 format('A=',3(/,1X,3(F4.1,1X))) read*,(B(i),i=1,3) print 20,(B(i),i=1,3) 20 format('B=',5(F4.1,1X)) do i=1,3 do j=1,3 if(i.LE.j) then C1(i,j)=A(i,j) else C1(i,j)=0.0 endif enddo enddo print 30,((C1(i,j),j=1,3),i=1,3) 30 format('C1=',3(/,1X,3(F4.1,1X))) do i=1,3 do j=1,3 if(i.GT.j) then C2(i,j)=A(i,j) else C2(i,j)=0.0 endif enddo enddo do i =1,3 X(i)=2. end do print 40,((C2(i,j),j=1,3),i=1,3) 40 format('C2=',3(/,1X,3(F4.1,1X))) norme = 1. num_iter = 0 do while(norme.GT.0.01) num_iter = num_iter + 1 Call matmull(C2,Xold,M2) do i = 1, 3 sm(i)=B(i)-M2(i) end do Call triangle(C1,sm,X) norme = normee(X,Xold) print *, norme do j=1,3 Xold(j) = X(j) enddo print *, num_iter do i = 1, 3 print *, 'X',i,' = ',X(i) end do if (num_iter.gt.10) stop enddo do i = 1, 3 print *, 'X',i,' = ',X(i) end do c c *** verification de la solution c do i = 1, 3 verif = -B(i) do j = 1, 3 verif = verif + A(i,j)*X(j) end do print *, '*** verification ligne ',i, verif end do end subroutine triangle(C,D,Y) real C(3,3),D(3),Y(3),S integer n,i Y(3)=D(3)/C(3,3) do i=2,1,-1 S = 0. do n=i+1,3 S=S+C(i,n)*Y(n) enddo Y(i)=(D(i)-S)/C(i,i) enddo return end subroutine matmull(R,S,T) real R(3,3),S(3),T(3) do i=1,3 T(i)=0.0 do j=1,3 T(i)=T(i)+R(i,j)*S(j) enddo enddo return end function normee(G,H) implicit none integer i real G(3),H(3),normee normee = 0.0 do i=1,3 normee = normee+(G(i)-H(i))**2 enddo normee = sqrt(normee) return end
Bonjour,
Je pense entrevoir le problème: Lors du tout premier appel à ta routine 'matmull', le vecteur 'Xold', utilisé par cette même routine pour calculer 'M2' n'est pas initialisé (les valeurs des éléments de 'Xold' sont donc indéterminés/dépendants d'éventuels comportement par défaut sur l'initialisation des variables propre à chaque compilateur).
Il faut initialiser proprement 'Xold' avant la boucle 'do while'.
Merci Ehouarn ca marche tres bien
c est toujours comme ca , si j oubli une petite chose dans le program, il y aura d erreurs
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager