Pages : 1
#1 Le 01/12/2022, à 01:40
- dva2tlse
[RÉSOLU] SEGFAULT trop précoce
Bonsoir et salut les (X)Ubunteros,
je suis en train de faire des essais avec un programme en fortran que j'ai écrit; il me plante une SEGFAULT après N'avoir lu QUE 10700 entiers(codés sur huit octets, il est vrai) alors que je suis parti pour bien plus.
J'ai essayé "ulimit -s unlimited", mais ça change rien,
Alors que faire ?
David
Dernière modification par dva2tlse (Le 05/12/2022, à 14: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 01/12/2022, à 08:46
- pingouinux
Re : [RÉSOLU] SEGFAULT trop précoce
Bonjour,
Peux-tu élaguer le programme en ne gardant que le minimum pour produire l'erreur, et nous le montrer ainsi que la commande de compilation ?
Hors ligne
#3 Le 01/12/2022, à 19:08
- dva2tlse
Re : [RÉSOLU] SEGFAULT trop précoce
Bonjour pingouinux, (ici chez ubuntu)
je suis super-content d'avoir vos réponses ce midi (deux gars chez développez.com; https://www.developpez.net/forums/d2142 … t11898700); l'heure à laquelle vous les avez postées me rappelle l'époque où je bossais et où j'allais voir sur les forums pendant que le café coulait, vers cette heure là aussi, ou même encore plus tôt parfois.
Bon alors maintenant, des réponses :
-1°) la compil' : j'utilise un scriptPourBuildersqBI (sqBI est le nom du programme).
sPBsqqBI:
#!/bin/sh
# scriptPourBuildersqBI=sPBsqBI dans $HOME/FORTRAN/FPRM
rm *.o commod.mod
gfortran -c commod.f
gfortran -c sqBI.f
gfortran sqBI.o commod.o -fbounds-check -fdefault-integer-8 -std=f2018 -fno-backtrace -fcheck=all -o sqBI
./sqBI
Vous voyez qu'il y a bien toutes les options qui permettent de corriger une SEGFAULT "facile", mais celle-là a l'air "costaude".
-2°) OS: Xubuntu 22.04 dans un PC assemblé. compilo' : gfortran comme vu plus haut
-4°) But du prgm : Euler project #3, stocker des drapeaux disant si un nombre, jusqu'à entre 7 et 8 milliards, est premier ou pas.
c BI=600851475143
c
c six cents milliards, huit cent cinquante et un millions,
c quatre cent soixante quinze mille, cent quarante trois.
-5°) Structure du prgm : Au tout début du crinle d'Érastothènes, que j'applique pour avoir chaque nouveau nombre premier, je dois stocker des drapeaux disant si un nombre est premier ou pas.
Voici l'instruction fautive :
sqBI.f: print*, 'i=', i, ', is_p(i) =', is_p(i)
.
..
...
i= 15067 , is_p(i) = 0
i= 15068 , is_p(i) = 0
i= 15069 , is_p(i) = 0
i= 15070 , is_p(i) = 0
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
-6°)
[url]https://fortran-lang.discourse.group[/url]...nlimit-s/2970/
:
Trop compliqué pour moi.
-7°) Élaguer : pas eu le temps. P'têt demain.
Merci et bye,
DAVID
Dernière modification par dva2tlse (Le 01/12/2022, à 20:32)
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 01/12/2022, à 19:09
- xubu1957
Re : [RÉSOLU] SEGFAULT trop précoce
Bonjour,
Lecture conseillée > memento des balises code.
Dernière modification par xubu1957 (Le 02/12/2022, à 17:48)
Conseils pour les nouveaux demandeurs et pas qu'eux
Important : Pensez à passer vos sujets en [Réso|u] lorsque ceux-ci le sont, au début du titre en cliquant sur Modifier sous le premier message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci. Membre de Linux-Azur
En ligne
#5 Le 02/12/2022, à 17:45
- dva2tlse
Re : [RÉSOLU] SEGFAULT trop précoce
c /HOME/DAVID/HHH/FORTRAN/FPRM/elag.f
c ce prgm doit réutiliser le module et faire le crible,
c avec, soit ./elag (sans lien de elag avec le module),
c soit ./sPBelag (script faisant le lien de elag avec le module).
c
c BI=BigInteger=600851475143 =
c S71 × 839 × 1471 × 6857
c
c23456
c !
c six cents milliards, huit cent cinquante et un millions,
c quatre cent soixante quinze mille, cent quarante trois.
c !
program elag ! fichier elag.f scripté pour buildaison par sPBelag
use commod
implicit none
c !
print*
print*
print*, 'Crible d''Ératosthènes : (sq=avec "q"rible)'
c !
print*
print*,
+'---------------------------------------------------------------b'
print*, ' État initial :'
print*, 'lbound(is_p, 1)=', lbound(is_p, 1) ! =0
print*, 'ubound(is_p, 1)=', ubound(is_p, 1) ! =0
c !
print*
print*,
+'---------------------------------------------------------------d'
print*, ' Initialisation :'
print*, 'is_p=(/ 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1 /)'
print*, ' 1 2 3 4 5 6 7 8 9 10 11'
c ! J'assigne les is_p, et ça donne ça :
is_p=(/0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1/) ! NE PAS faire is_p[1:11]
print*, 'lbound(is_p, 1)=', lbound(is_p, 1) ! =1
print*, 'ubound(is_p, 1)=', ubound(is_p, 1) ! =11
c !
NN=BI
IsqBI=INT(SQRT(REAL(BI)))
print*, 'IsqBI=', IsqBI
do i=1, IsqBI
print*, 'i=', i, ', is_p(i) =', is_p(i) ! =0 GAML si is_p[1:11]=constructor 5/qq L.+Ht
enddo
c !
print*
print*,
+'---------------------------------------------------------------u'
print*, ' Fin.'
print*
stop
end program elag
c !
c gfortran elag.f -fbounds-check -fdefault-integer-8 -std=f2018 -fno-backtrace -o elag
c ./elag
c ./sPBelag
Dernière modification par dva2tlse (Le 02/12/2022, à 18:06)
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
#6 Le 02/12/2022, à 19:58
- pingouinux
Re : [RÉSOLU] SEGFAULT trop précoce
@dva2tise #5 :
Impossible de tester ton programme, il ne compile même pas.
Hors ligne
#7 Le 03/12/2022, à 19:34
- dva2tlse
Re : [RÉSOLU] SEGFAULT trop précoce
il faut faire le lien avec le module commod.
#!/bin/sh
# scriptPourBuilderElag=sPBelag dans $HOME/FORTRAN/FPRM
rm *.o commod.mod
gfortran -c commod.f
gfortran -c elag.f
gfortran elag.o commod.o -fbounds-check -fdefault-integer-8 -std=legacy -fno-backtrace -pedantic -fcheck=all -o elag
./elag
c /HOME/DAVID/HHH/FORTRAN/FPRM/commod.f à utiliser avec elag.f
c23456
c
c34256
module commod
use iso_fortran_env, only: int64
integer :: M=11
integer :: N=5
integer :: NN
integer(kind=int64), allocatable, dimension(:) :: p(:) ! array that will hold the primes
integer(kind=int64), allocatable, dimension(:) :: is_p(:) !** is_p mainly holds an array
integer(kind=int64), allocatable, dimension(:) :: tmp(:) ! of integer intrinsic type
c !
integer(kind=int64) :: i=1_int64, j=1_int64, k=1_int64, IsqBI
integer(kind=int64) :: l=1_int64, sq=0_int64
c integer(kind=int64) :: BI=2310_int64 ! cas des cinq/six premiers premiers
integer(kind=int64) :: BI=600851475143_int64 ! cas où le plus grand facteur premier est 6857.
end module commod
c23456
c
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
#8 Le 03/12/2022, à 20:06
- pingouinux
Re : [RÉSOLU] SEGFAULT trop précoce
Bon, j'ai réussi à reproduire l'erreur, et je vais regarder plus tard.
................................................
i= 15070 , is_p(i) = 0
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
................................................
Segmentation fault (core dumped)
Hors ligne
#9 Le 03/12/2022, à 20:47
- dva2tlse
Re : [RÉSOLU] SEGFAULT trop précoce
ouais ! SUPER !
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
#10 Le 03/12/2022, à 21:00
- pingouinux
Re : [RÉSOLU] SEGFAULT trop précoce
J'ai un peu oublié la syntaxe du fortran, mais il me semble que ton tableau is_p n'est pas alloué, sauf peut-être les 11 premières valeurs.
Hors ligne
#11 Le 04/12/2022, à 19:21
- dva2tlse
Re : [RÉSOLU] SEGFAULT trop précoce
Oui, c'est vaseux et je ne connais pas bien les "allocate", mais lui a trouvé. #10 de BRAVO !
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