2
votes

Qu'est-ce que: 'iunit' est utilisé non initialisé dans cette fonction [-Wuninitialized]

J'utilise:

Warning: 'iunit' is used uninitialized in this function [-Wuninitialized]

dans Geany, mais obtenez cette erreur:

  open(iunit,file=dexfile,status='old',iostat=status)
   if(status /= 0)then
     write(*,*) 'Unable to open dex file'
   endif


4 commentaires

Pouvez-vous partager la définition des variables?


iunit doit être un entier et avoir une valeur avant open instruction open . Peut-être même être un parameter


Vous devriez vraiment montrer plus de code. Voir Comment demander et un exemple reproductible minimal . Le code que vous affichez est insuffisant pour reproduire l'erreur. Toutes les variables doivent être déclarées et implicit none doit être utilisée.


Bien que le fragment de code soit incomplet, nous pouvons toujours expliquer ce que signifie le message d'erreur. Nous ne pouvons pas répondre quelle devrait être la correction ou si le compilateur est correct dans son évaluation, mais c'est toujours une question valide.


3 Réponses :


1
votes

Déclarez iunit quelque chose comme ceci:

integer, parameter      :: iunit = 11

Il n'est pas nécessaire que ce soit avec le parameter mais je le fais normalement car il ne doit pas changer pendant l'exécution et si j'ai plusieurs fichiers ouverts, il est moins sujet aux erreurs car il ne peut pas être modifié.


2 commentaires

Il n'est pas nécessaire que la valeur soit une constante. Sa valeur doit simplement être définie.


Ne définissez pas une unité avec des valeurs inférieures à 10, car elles peuvent / sont utilisées par le système pour, par exemple, stdout / stderr, etc.



2
votes

Si votre compilateur a cette option, vous pouvez utiliser la commande newunit dans function open pour renvoyer un drapeau à un ID d'unité disponible lors de l'ouverture:

open(newunit=iunit,file=dexfile,status='old',iostat=status)

Dans ce cas, la commande open renverra une valeur de iunit comme sortie de cet appel, au lieu de l' entrée .

Sinon, vous pouvez préparer un extrait qui le fait pour vous, par exemple:

   iunit = first_available_unit()
   open(unit=iunit,file=dexfile,status='old',iostat=status)

puis exécutez:

! Find a logical unit which is not currently in use
integer function first_available_unit() result(iunit)
   logical :: is_open
   
   do iunit=10,999 ! Skip units 1-10 as they're sometimes system reserved
      inquire(unit=iunit,opened=is_open)
      if (.not.is_open) return
   end do
end function first_available_unit


0 commentaires

1
votes

Il y a des moments dans la vie d'un programme Fortran où la valeur d'une variable doit être référencée / connue: la variable doit être définie. Le message d'avertissement que vous recevez du compilateur indique qu'il est iunit que vous n'avez pas donné de valeur à iunit . En général, ce n'est pas le travail du compilateur de vérifier que vous avez défini toutes les variables avant de les référencer, mais lorsque le compilateur peut vérifier, il peut le signaler.

iunit dans ce cas doit être défini car sa valeur est utilisée comme unité pour une connexion de fichier. Une fois que nous savons ce que signifie l'avertissement, nous avons deux réponses qui suggèrent des approches pour corriger le problème identifié:

  • assurez-vous de vérifier que vous avez donné une valeur (et vérifiez les fautes de frappe dans les noms de variables, par exemple en utilisant implicit none )

  • utilisez newunit=iunit au lieu de [unit=]iunit : ici, vous n'avez pas besoin de spécifier une valeur, car le compilateur choisit une valeur appropriée pour vous.


0 commentaires