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
3 Réponses :
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é.
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.
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
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.
Pouvez-vous partager la définition des variables?
iunitdoit être un entier et avoir une valeur avantopeninstructionopen. Peut-être même être unparameterVous 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 nonedoit ê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.