Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 15/05/2014, à 17:28

dva2tlse

[RÉSOLU] Segfault étrange

Bonjour le forum,
en fortran, j'ai une "segmentation fault" que je n'arrive pas à comprendre :
Celà se passe lors d'un opération de lecture, dans une ligne qui contient du texte ascii (provenant d'un fichier d'entrée) :

Voici l'instruction qui plante :

      read(line, *, err=804, end=805)
     +EIDrpt(IDrpt), SClu, Srpt(DIR, IDrpt, K, Z)

Quand je remplace la variable qui fait planter la lecture, Srpt(... ), par un réel temporaire que j'appelle Stmp, ça marche, et cette variable est correctement remplie :

      read(line, *, err=804, end=805)
     +EIDrpt(IDrpt), SClu, Stmp

Par contre quand j'essaye d'affecter cette valeur, qui a été correctement lue et placée dans le réel temporaire, vers la variable dans laquelle j'aurais voulu l'affecter dès la première opération, hébin ça plante à nouveau :

      Srpt(DIR, IDrpt, K, Z)=Stmp (BOUM !)

Ce qui me fait penser que ce sont les indices de ce tableau qui ne sont pas bons.
Donc évidemment j'ai vérifié la dimension du tableau que j'essaye de remplir :

      real Srpt(0:3, MAXelt, 6, 2) ! S(DIR, IDrpt, K, Z)

-avec une définition préalable :

      PARAMETER (MAXelt=11000)


Et j'ai vérifié aussi les valeurs des indices au moment de la tentative de lecture :
-DIR vaut 1, (EDIT: à mon premier post j'avais écrit SDIR, mais paposs', voir plus bas)
-IDrpt vaut 1,
-K vaut 1,
-Z vaut 1.
Ils sont tous à 1 puisque c'est la première tentative d'écriture dans ce tableau.

Que cela vous inspire t'il; pouvez vous m'aider ?
  David

Dernière modification par dva2tlse (Le 22/05/2014, à 18:21)


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#2 Le 15/05/2014, à 17:47

pingouinux

Re : [RÉSOLU] Segfault étrange

Bonjour,
Voici quelques remarques :

      read(line, *, err=804, end=805)
     +EIDrpt(IDrpt), SClu, Srpt(DIR, IDrpt, K, Z)

Et j'ai vérifié aussi les valeurs des idicess au moment de la tentative d'écriture : plutôt lecture ?
-SDIR vaut 1, Oui, mais le premier indice est DIR
-IDrpt vaut 1,
-K vaut 1,
-Z vaut 1.

Hors ligne

#3 Le 15/05/2014, à 17:56

dva2tlse

Re : [RÉSOLU] Segfault étrange

Oui merci; je crois que ce n'est qu'une faute de frappe, puisque je n'ai aucune variable nommée SDIR et qu'il y a du

implicit none

partout, donc ça n'aurait même pas compilé et je m'en serais aperçu tout de suite.
M'enfin je vérifierai demain au boulot, mais ce serait trop bête.


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#4 Le 21/05/2014, à 17:57

dva2tlse

Re : [RÉSOLU] Segfault étrange

Bonjour le forum,
voici quelques nouvelles de mon problème qui a pas mal avancé.
  Dans un premier temps, j'ai essayé d'isoler le segment de programme qui posait problème; donc j'ai commencé par évacuer tous les sous-programmes où le programme principal n'était pas encore passé lors de sa gamelle, puis ceux qui s'étaient déroulés correctement sans avoir de résultats utilisés au moment de l'arrêt; cela ne me laissait qu'un programme principal avec deux sous-programmes, dont l'un appelait l'autre presque immédiatement; et le deuxième amenait la gamelle après un travail de simple lecture des dernièrs fichiers d'entrée, qui se trouvent former un groupe de trois fichiers de même structure.
L'instruction qui causait la gamelle était :
     

 read(line, *, err=804, end=805)
     +EIDrpt(IDrpt), SClu, Srpt(DIR, IDrpt, K, Z)

et quand je la remplace par
     

 read(line, *, err=804, end=805)
     +EIDrpt(IDrpt), SClu, Stmp

ça rmarche, mais il se pose un autre problème plus loin lorsque l'on essaye d'utiliser IDrpt comme indice d'un autre tableau, puisque cet entier est beaucoup trop grand.
Je ne sais pas encore pourquoi, mais j'espère en trouver la cause demain et marquer ce post comme [résolu].
À demain donc probablement.
David


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#5 Le 21/05/2014, à 18:33

pingouinux

Re : [RÉSOLU] Segfault étrange

As-tu vérifié que EIDrpt est dimensionné correctement ?

Hors ligne

#6 Le 21/05/2014, à 18:49

dva2tlse

Re : [RÉSOLU] Segfault étrange

Je ne l'ai pas sous les yeux parce que c'est au boulot, mais c'est un tableau à une seule dimension, qui doit être MAXelt qui vaut 11000; ça doit être mentionné dans un des post's précédents [.../...] oui dès le début, au  #1.
Et par contre, j'avais écrit aussi à ce post #1 : "IDrpt vaut 1", alors que j'ai écrit ci dessus au #4 que cet entier était "beaucoup trop grand", d'après ce que j'ai constaté au boulot cet après midi.
Donc il y a une incohérence, que je vais pouvoir investiguer demain.
À+,
David


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#7 Le 21/05/2014, à 18:54

pingouinux

Re : [RÉSOLU] Segfault étrange

mais c'est un tableau à une seule dimension, qui doit être MAXelt qui vaut 11000; ça doit être mentionné dans un des post's précédents [.../...] oui dès le début, au  #1.

Ce n'est pas précisé pour EIDrpt.

Ajouté :
D'après les symptômes que tut indiques, il semblerait que la lecture de EIDrpt modifie IDrpt, ou peut-être un autre des indices.
Tu devrais imprimer DIR, IDrpt, K, Z avant et après la ligne suivante

 read(line, *, err=804, end=805)
     +EIDrpt(IDrpt), SClu, Stmp

Si EIDrpt est passé en argument, une explication serait qu'il ne soit pas déclaré comme un tableau dans le programme appelant, et que IDrpt soit déclaré juste après.
On peut soupçonner aussi une interversion d'arguments dans les programmes appelant et appelé.

Dernière modification par pingouinux (Le 22/05/2014, à 05:13)

Hors ligne

#8 Le 22/05/2014, à 18:21

dva2tlse

Re : [RÉSOLU] Segfault étrange

Bonjour,
je suis désolé parce que je ne vais pas pouvoir faire beaucoup avancer le schmilblick. En effet, j'ai trituré et re-trituré mon code pour essayer de le rendre un peu plus clair et mieux structuré, et il s'est remis à marcher jusqu'au bout tout d'un coup, au premier essai; donc je n'ai aucune idée de laquelle des assez nombreuses modifications que j'ai faites a été décisive.
Donc je passe en [RÉSOLU] et puis basta, parce que c'est un projet sur lequel je bosse depuis l'été dernier (tout seul avec mon chef qui parle un peu fortran) et il se produira sans avoir aucunement à forcer d'autres occasions semblables.
À+,
David (et merci de m'avoir lu et un peu aidé, puisque je suis sûr que ça m'a parfois éclairci les idées d'en parler)


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne