Dans le premier code de tenn004, ces paramètres étaient immuables et donc il n'etait pas nécessaire de les passer par référence. C'est toi qui a introduit ce nouveau problème. Et tu as choisis une mauvaise solution (mélange de references et pointeurs) pour résoudre ce problème. Rien de correct là dedans.
problème
0test sur n : 0
Lecture de A quand on est dans la fonction lectura
jacobi
Lecture de A quand on est dans la fonction jacobi
x0=
on commence la boucle sur l
x=
AddressSanitizer:DEADLYSIGNAL
=================================================================
==15215==ERROR: AddressSanitizer: SEGV on unknown address 0x55da8a8b1360 (pc 0x55da8a7697d5 bp 0x55da8a8b6860 sp 0x7ffdc366bf40 T0)
==15215==The signal is caused by a WRITE memory access.
#0 0x55da8a7697d4 in __asan::Allocator::Deallocate(void*, unsigned long, unsigned long, __sanitizer::BufferedStackTrace*, __asan::AllocType) (/home/jonathan/rawdisk2/a.out+0x2b7d4)
#1 0x55da8a871876 in operator delete[](void*) (/home/jonathan/rawdisk2/a.out+0x133876)
#2 0x55da8a8748fe in main /home/jonathan/rawdisk2/test.cpp:36:5
#3 0x7f7016e57222 in __libc_start_main (/usr/lib/libc.so.6+0x24222)
#4 0x55da8a76022d in _start (/home/jonathan/rawdisk2/a.out+0x2222d)
AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV (/home/jonathan/rawdisk2/a.out+0x2b7d4) in __asan::Allocator::Deallocate(void*, unsigned long, unsigned long, __sanitizer::BufferedStackTrace*, __asan::AllocType)
==15215==ABORTING
S'il te plaît, arrête de prétendre faire un code qui fonctionne.
EDIT: je le refais avec le fichier jacobi.txt. Quelle idée de faire continuer le programme lorsque le fichier n'est pas lu...
AddressSanitizer:DEADLYSIGNAL
=================================================================
==15366==ERROR: AddressSanitizer: SEGV on unknown address 0x55cd5c2e3370 (pc 0x55cd5c2a78f8 bp 0x7ffd00d00990 sp 0x7ffd00cffde0 T0)
==15366==The signal is caused by a WRITE memory access.
#0 0x55cd5c2a78f7 in lectura(double**&, double*&, double*&, int*&) /home/jonathan/rawdisk2/test.cpp:60:13
#1 0x55cd5c2a5eb0 in main /home/jonathan/rawdisk2/test.cpp:26:5
#2 0x7ffb730f1222 in __libc_start_main (/usr/lib/libc.so.6+0x24222)
#3 0x55cd5c19222d in _start (/home/jonathan/rawdisk2/a.out+0x2222d)
AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV /home/jonathan/rawdisk2/test.cpp:60:13 in lectura(double**&, double*&, double*&, int*&)
==15366==ABORTING
- Edité par jo_link_noir 13 février 2019 à 23:45:39
Ca devient grave, là... Franchement, si c'est pour proposer du code comme ça, je pense qu'il vaut mieux t'abstenir "d'aider" les autres.
A et n non initialisés, et t'es pas choqué ? Tu prétends utiliser "le concept plus avancé de référence sur des pointeurs pour le passage dans la fonction", mais tu ne comprends même pas que tu dois initialiser tes pointeurs.
Tu n'as pas les bases, n'essaie pas d'expliquer aux autres des concepts que tu ne comprends pas. N'essaie pas non plus de contredire des personnes comme gbdivers qui sont autrement plus compétentes que toi. Tu n'as pas la rigueur nécessaire pour faire du "C++ scientifique" (pour reprendre tes termes, même si ça ne veut rien dire...)
Si vous ne trouvez plus rien, cherchez autre chose.
Après ma capture d'ecran qui montre que ce n'est pas valide et le copié-collé de jo_link_noir sur les messages d'asan, tu oses encore prétendre que ton code "marche" ?
"Ca marche chez moi" n'est pas une preuve de fonctionnement.
Comme te l'a montré jo_link_noir, ton code est pétri d'UB, donc ne viens pas dire qu'il fonctionne, je n'ai même pas besoin de le lancer pour le voir. A et n ne sont pas initialisés avant leur première utilisation -> UB. Il n'y a rien à redire là-dessus, il n'y a pas d'argumentation possible. Maintenant, il vaut mieux que tu arrêtes de t'enfoncer.
Pour reprendre ta formulation : Ton code est inadapté pour un forum C++.
- Edité par dragonjoker 14 février 2019 à 0:39:27
Si vous ne trouvez plus rien, cherchez autre chose.
Ok suivant ta théorie, imaginons que ces quelques personnes soient dans le faux.
Comment explique tu que ton code, passé dans un sanitizer retourne des erreur, donc preuve de mauvais fonctionnement ? (CF message de jo_link_noir ) Il a très certainement utilisé valgrin ou drmemory, qui sont des outils très largement rependu, utilisé et testé par la communauté toute entière du C++. Comment est il possible qu'un programme qui fonctionne parfaitement, ne passe pas les tests sur ces outils ? Tu ne trouve pas qu'il y a un probleme quelque part ?
"Tout devrait être rendu aussi simple que possible, mais pas plus." A.Einstein
Ton code, il ne marche pas, pourquoi tu ne l'acceptes pas ?
C'est si difficile de se remettre en question ?
C'est pas compliqué pourtant : tu utilises un pointeur avant même de l'avoir alloué, donc bon, c'est d'une logique implacable, indiscutable même, il y a un ***GROS*** problème !
Ce n'est pas notre comportement qui va y changer quelque chose, ni le fait que tu édites tes messages pour mettre en emphase ton point de vue, ton code est faux, c'est tout, accepte le, pleure un bon coup, sèche tes larmes et avance !
EDIT: (c'est comme ça qu'on fait)
Le code de ton edit est toujours aussi faux...
- Edité par dragonjoker 14 février 2019 à 1:04:31
Si vous ne trouvez plus rien, cherchez autre chose.
En particulier, les UB (comportement indéfinis) font n'importe quoi (comme le nom l'indique). Donc ca peut crasher, ca peut retourner une valeur fausse. Parfois, ca peut même fonctionner correctement chez quelqu'un et faire n'importe quoi chez une autre personne.
Dis autrement, "ça marche chez moi" n'a aucune valeur pour savoir si un code est valide. Pour écrire un code valide, on va donc se baser sur des "bonnes" pratiques (un exemple : http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines ), sur des diagnostiques du compilateurs, sur des outils externes, sur des tests et des preuves, etc. On a pleins d'outils, il faut les utiliser.
Ce que tu fais, c'est conduire sur l'autoroute en disant "vous voyez qu'on peut conduire sans les mains, a contresens, les yeux fermés, sans avoir d'accident" et ne pas comprendre quel est le problème quand on le met en prison.
Le sanitizer (ici ASan) est intégré dans les compilateurs et s'active avec l'option -fsanitize=address. Je crois que ça ne fonctionne pas sur Windows, mais msvc possède une option de protection de la mémoire qui pourrait faire pareil: /sdl ou /guard ou des options de débug spécifique. Je ne bosse pas avec cette plateforme alors je dis peut-être n'importe quoi :).
Sinon, Valgrind aussi lève des erreurs. Je ne doute pas un instant que Dr. Memory fasse de même.
@Yes, man: reposter le même code que la page précédente donnera toujours la même chose: le code est faux. Quand vas-tu comprendre qu'une UB peut avoir comme résultat un programme qui peut fonctionner, comme un programme qui ne va pas fonctionner ? Cela fonctionne sur ta machine, mais pas sûr que ce soit encore le cas demain, ni dans 1h: une variable non-initialisée est dépendante du contenu de la mémoire dans le contexte d’exécution courant. Ainsi que plein d'autre facteur au bon vouloir du compilateur.
Mais va-y, continue d'écrire n'importe quoi et de dénigrer les membres du forum.
L'histoire du 20ème siècle, a montré que les groupes sont souvent dans le faux, et sont souvent animés par les idées les plus extrémistes et dangereuses. Donc je n'ai aucune confiance en vous, avec votre manière autoritariste de vous exprimer.
Je crois qu'on a assez perdu de temps à essayer d'expliquer pourquoi utiliser un pointeur non initialisé est incorrect. Ca n'a juste aucun sens de discuter de ca.
Désolé pour tenn004, qui a vu sa discussion partir dans tous les sens. Je remets ici la dernière réponse utile, pour qu'on puisse avancer.
gbdivers a écrit:
Ok, même en utilisant les pointeurs, on peut faire les choses un peu mieux.
Pour commencer, une evidence : si on a des etapes A, B, C, etc, on ne commence pas par corriger l'etape K. On fait dans l'ordre : on verifie etape par etape que les choses se passent correctement.
Et pour simplifier les vérifications, on sépare le code en partie plus simple a verifier. Avec des classes ou des fonctions, peut importe. Mais on découpe le code dans tous les cas.
Dans ton code, on a un ensemble fonctionnel très clair : ce tableau 2D. Sans classe, il faut quand même séparer les manipulations de ce tableau dans des fonctions. Donc la première chose a faire :
- écrire les fonctions pour allouer, initialiser, libérer et accéder a ce tableau 2D
- écrire les tests pour vérifier que les fonctions sont correctes
Ecrire ces fonctions est un exercice très classique en C. C'est la première etape.
Juste pour expliquer à tenn004, YES man est une personne ayant posé énormément de questions sur le forum ces derniers mois, dont la progression est douteuse et dont les sujets font débat car il n'écoute pas les conseils qui lui sont donnés. Voilà pourquoi tout le monde lui a sauté dessus et ton sujet s'est enflammé. Et ici tu as eu droit à sa première intervention sur le sujet de quelqu'un d'autre.
Ça paraissait ptet évident mais pour un nouveau venu sur le forum, ça peut faire bizarre.
Je suis passé sur Microsoft Visual 2017, et là, cela est devenu dysfonctionnel alors que tout se passait bien sur gcc avec codeblocks.
Avec l'option suggérée par joe_link_noir dans le compilateur
-fsanitize=address
effectivement, le résultat devient problématique.
Je ne connaissais pas cette option fort intéressante pour détecter les fuites de mémoire. Merci Joe_link_noir.
EDIT : apparemment, ça ne fonctionne pas avec codeblocks et gcc
La lecture du fichier jacobi.txt ne se fait pas correctement avec la ligne de code de Tenn004 :
ifstream datos("jacobi.txt");
if (!datos) {
cout << "problème";
}
alors que tout se passait bien sous gcc avec codeblocks
Savez-vous pourquoi la lecture du fichier jacob.txt ne se fait pas avec cette ligne de code alors que le fichier jacobi.txt est bien placé dans le projet de MSCV 2017 ?
Je suis passé sur Microsoft Visual 2017, et là, cela est devenu dysfonctionnel alors que tout se passait bien sur gcc avec codeblocks.
Avec l'option suggérée par joe_link_noir dans le compilateur
-fsanitize=address
Il y a une autre option qui va de pair, c'est la sanitization undefined. Et il faut coupler le tout avec des warnings max. Plus une autre option pour avoir une bonne pile, ce qui donne:
-Wall -Wextra -Werror -g -fno-omit-frame-pointer -fsanitize=address,undefined (et bientôt on aura le -Wlifetime, et ça ça va déchirer!)
Ces options je les utilise régulièrement avec clang++ sous linux -- je pratique peu l'écosystème Windows (je m'en sers uniquement comme terminal X...), du coup il peut y avoir des petites différences.
Pourquoi c'est important? Le C et le C++ font le choix de la vitesse avant tout et qui si on écrit du code dont le comportement n'est pas officiellement défini par la norme alors les compilateurs ont le droit d'en faire ce qu'il en veulent (envoyer des chats en orbite, renvoyer 42, bref rien d'utile). C'est un peu comme si à la boulangerie on demande une baguette et que l'on paie avec des billets de monopoly, c'est hors contrat, on va repartir avec deux torgnoles, une autre forme de pain, mais certainement pas celle demandée.
Ces comportements non définis et autres mauvaises manipulations de la mémoire sont critiques. Ils sont la source de nombreux plantages, et surtout de nombreuses failles de sécurité quand on les laisse dans notre code. Les laisser ou les introduire sur des systèmes critiques, c'est un mélange d'incompétence et de criminalité, de la pure faute professionnelle. Pragmatiquement ils sont la conséquence de mauvaises pratiques qui perdurent: que cela soit dans les habitudes de développement comme d'enseignement.
C'est pour cela que mes petits camarades insistent sur l'importance d'écrire du code correct. Certes leurs mots sont ce qu'ils sont et à force le débat tourne en rond, mais il est important de comprendre le message sous-jacent: il est inacceptable d'écrire et de promouvoir du code incorrect quand il est facile d'en écrire du correct. Ici nous avons un problème fort trop récurrent de professeur qui ne veut pas sortir de sa zone de confort et qui n'a probablement pas conscience des soucis induits par son approche pédagogique. J'ai vu passer la recommandation d'écrire une classe Matrice pour centraliser/encapsuler les gestions d'invariants. Si ce n'est toujours pas acceptable... tant pis. Il y a d'autres soucis qui avaient été trouvés visiblement.
J'ai voulu essayer de limiter les changements à apporter à ce code, mais finalement c'est vrai que c'est pas du tout clair, d'avoir des pointeurs non initialisés à passer en arguments de fonction.
Là, sur MSVC 2017 je me retrouve avec des exceptions à tout bout de champ sur le code de Tenn004 que j'essaie de modifier sans trop toucher à sa structure initiale parce que effectivement, je n'ai pas voulu sortir de cette zone de confort.
EDIT : sauriez-vous pourquoi sous MSVC la lecture du fichier ne se fait même pas avant que les problèmes d'allocation mémoire ne se présentent comme je l'avais demandé avant ?
Merci
- Edité par pseudo-simple 14 février 2019 à 14:49:19
@tenn04 : désolé pour la tournure qu'a pris ton sujet, je vais donc le clore et t'encourage à recréer un sujet tout neuf pour y poster ton code repris selon les conseils valables qui t'ont été donné au début de ce sujet.
@YES, man : merci de ne pas venir polluer une discussion lorsque tu n'en maîtrises clairement pas les tenants et aboutissants, et surtout merci de reconnaître lorsque tu as tort et que tu as atteint le point Godwin très rapidement ...
@YES, man : Pour la deuxième fois, merci de ne pas créer d'autres comptes, c'est contraire aux règles de ce forum, et tu me donnes déjà assez de boulot avec un seul compte ...
EDIT Benzouye : Pas de multi-compte, mais plutôt un bon/mauvais farceur, le compte a été supprimé depuis ...
Maluna34 a écrit:
Depuis quand on peut éditer des messages modérés ?
Il y a un bug actuellement sur les outils de modération du forum donc ... c'est un peu aléatoire ...
Discord NaN. Mon site.
Si vous ne trouvez plus rien, cherchez autre chose.
Discord NaN. Mon site.
Si vous ne trouvez plus rien, cherchez autre chose.
Si vous ne trouvez plus rien, cherchez autre chose.
Discord NaN. Mon site.
Si vous ne trouvez plus rien, cherchez autre chose.
Si vous ne trouvez plus rien, cherchez autre chose.
Discord NaN. Mon site.
Si vous ne trouvez plus rien, cherchez autre chose.
Eug
Discord NaN. Mon site.