CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++] Segfault sur crible d'E.

Caletlog
Caletlog
Niveau 10
20 mars 2014 à 09:35:01

Hey!

J'ai testé hier l'implémentation simpliste du crible d'Eratosthène en C++.
Tout fonctionne... jusqu'à une limite d'un peu plus de 8 000 000 (dans les 8 5XX 999 de mémoire, j'avais testé). À partir de cette valeur, le programme fait une segfault dès son début.
J'ai tenté de changer tous les entiers utilisés en long et unsigned long, et même problème.

Pour info, le programme segfault vraiment dès son début; à partir de cette valeur, je n'ai le temps de rien lancer (pas même un cout << "foobar";) il segfault direct!

Quelqu'un a une idée?
C'est pas important du tout mais ça me tracasse, parce que le même code fonctionne sans problèmes en ruby et php avec ces valeurs :(

Merci!

(Le programme: https://gist.github.com/loganbraga/9659458 )

Ace_Attorney
Ace_Attorney
Niveau 10
20 mars 2014 à 10:29:03

Tu fais un stack overflow, ta pile ne peut pas contenir 8000000 octets d'un coup (ton tableau).

Si tu veux résoudre ton problème en gardant ton code tel quel, tu n'as pas le choix d'utiliser une allocation dynamique.

Et si ça fonctionne en Ruby et en PHP, c'est qu'ils font une abstraction de la mémoire, ce n'est donc pas à toi de la gérer mais à ton interpréteur, donc il doit sans doute lui aussi allouer de la mémoire dynamiquement pour chaque variable.

Caletlog
Caletlog
Niveau 10
20 mars 2014 à 13:40:12

Ah effectivement, merci bien :)

Ça marche comme ça: https://gist.github.com/loganbraga/9662888
(je sais pas si c'est la bonne méthode pour allouer dynamiquement, j'ai pas encore vu ce chapitre en détail)

Pseudo supprimé
Pseudo supprimé 22 mars 2014 à 09:26:39

300 millions de booléens, rien que ça :hap:

Ton code m'a l'air d'être bon.
Juste, tu peux initialiser tes bool à false normalement en faisant new bool[LIMIT]={false};
Ça t'épargne une boucle for...

Caletlog
Caletlog
Niveau 10
22 mars 2014 à 12:00:12

Ah, je savais pas ça.
Effectivement avec new bool[LIMIT]{false} (je peux pas faire comme tu précisais, étant donné que j'ai déjà une lvalue dans la même assignation) ça initialise tout à false, merci :)

Et ça m'a l'air un brin plus rapide selon time.

Cyclonique
Cyclonique
Niveau 6
22 mars 2014 à 14:28:01

Si je dis pas de connerie un booléen prend un bit donc avec un peu de fonctions logiques tu pourrais économiser des variables non :( ?

(Sur un octet tu peux mettre 32 booléens ... )

LEpigeon-888
LEpigeon-888
Niveau 12
22 mars 2014 à 15:13:56

"(Sur un octet tu peux mettre 32 booléens ... )"

Comment ça ? :(

godrik
godrik
Niveau 30
22 mars 2014 à 15:19:35

Sur un octet, tu peux mettre 8 booleen, pas 32!

Cyclonique
Cyclonique
Niveau 6
22 mars 2014 à 15:21:26

8 pardon, je pensais en meme temps à un int de 4 octets :noel:

ben

n = 10101111 je peux stocker par exemple 8 booléens sur un octet

n & (1 << i) = 0 ou 1, n |= (1 <<i) et je le mets à 1 (true), n &= ~(1 << i) et je le mets à 0 (false)

LEpigeon-888
LEpigeon-888
Niveau 12
22 mars 2014 à 15:22:46

Oui, 8 je suis plus d'accord :hap:

Et après, pas besoin d'utiliser des trucs compliqué, j'imagine que c'est possible d'utiliser les champs de bit d'un seul bit pour un booléen nan ? :(

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment