Partage
  • Partager sur Facebook
  • Partager sur Twitter

outb en C++ = Erreur de segmentation

Sujet résolu
    4 avril 2008 à 16:33:38

    Bonjour,
    J'ai un script en C++ qui utilise la fonction outb. Lors de la compilation tout fonctionne bien. Mais lors de l'execution, une erreur apparait : Erreur de segmentation. Je suis sous linux et j'exécute le script en root.
    Voici le code :
    1. #include <iostream>
    2. #include <sys/io.h>
    3. #include <math.h>
    4. #include <unistd.h>
    5. using namespace std;
    6. int h_puissance_jet;
    7. bool h_alt_jet = true;
    8. void baignoire(int puissance_jet, bool alt_jet, int puissance_bulles, bool alt_bulles, int time)
    9. {
    10.         //variable
    11.                 int varinb;
    12.         //--------
    13.         //- Jets -
    14.         //--------
    15.                 // on/off
    16.                 if(h_puissance_jet == 0 && puissance_jet > 0 || puissance_jet == 0 && h_puissance_jet > 0)
    17.                 {
    18.                         varinb = inb(0x378);
    19.                         outb(varinb + 16, 0x378);
    20.                         usleep(500);
    21.                         outb(varinb,0x378);
    22.                 }
    23.                 // +/-
    24.                 if(puissance_jet > h_puissance_jet)
    25.                 {
    26.                         outb(32, 0x378);
    27.                 }
    28.                 if(puissance_jet < h_puissance_jet)
    29.                 {
    30.                         outb(64, 0x378);
    31.                 }
    32.                 // alt
    33.                 if(alt_jet != h_alt_jet)
    34.                 {
    35.                         varinb = inb(0x378);
    36.                         outb(varinb + 128, 0x378);
    37.                         usleep(500);
    38.                         outb(varinb,0x378);
    39.                 }
    40.         //----------
    41.         //- Bulles -
    42.         //----------
    43.                 int conversion_bulles[10];
    44.                 conversion_bulles[0] = 15;
    45.                 conversion_bulles[1] = 1;
    46.                 conversion_bulles[2] = 14;
    47.                 conversion_bulles[3] = 6;
    48.                 conversion_bulles[4] = 10;
    49.                 conversion_bulles[5] = 2;
    50.                 conversion_bulles[6] = 12;
    51.                 conversion_bulles[7] = 4;
    52.                 conversion_bulles[8] = 8;
    53.                 conversion_bulles[9] = 0;
    54.                 if(alt_bulles)
    55.                 {
    56.                         int time_in_boucle = 0;
    57.                         while(time_in_boucle <= time)
    58.                         {
    59.                                 double var1 = round(7*fabs(sin(2*M_PI/5*time_in_boucle)))+2;
    60.                                 int var2 = var1;
    61.                                 outb(conversion_bulles[var2], 0x378);
    62.                                 sleep(9);
    63.                                 time_in_boucle + 9;
    64.                         }
    65.                 }
    66.                 else
    67.                 {
    68.                         if(puissance_bulles == 1)
    69.                         {
    70.                                 outb(6, 0x378);
    71.                                 sleep(2);
    72.                                 outb(1, 0x378);
    73.                         }
    74.                         else
    75.                         {
    76.                                 outb(conversion_bulles[puissance_bulles], 0x378);
    77.                         }
    78.                         sleep(time);
    79.                 }
    80. }
    81. int main()
    82. {
    83.         baignoire(1, 1, 1, 1, 5);
    84.         return 0;
    85. }

    Je sais que c'est outb qui provoque l'erreur (le débugger me la dit mais je ne sais plus quelle est la fonction pour débugger, si quelqu'un peut me la rappeler)
    Merci d'avance
    Tuxben
    • Partager sur Facebook
    • Partager sur Twitter
      4 avril 2008 à 16:37:47

      elle sert à quoi, la ligne 66. Et c'est quoi "outb"?

      Edit: Chez moi, c'est plutôt "inb" qui provoque un segfault. Ligne 21
      Edit II: D'après ce que j'ai pu voir en 30s sur le net, c'est très vivement déconseillé d'utiliser inb/outb/ioperm, à moins d'avoir de solides connaissances en asm. Si c'est pour écrire sur le port parallèle, c'est mieux et plus simple d'utiliser parport
      Edit III: Il vient d'ou, le "0x378"? Il faut récupérer un port, (ie, ouvrir) pour pouvoir lire/écrire dessus, quand même. T'es un sauvage ^^
      • Partager sur Facebook
      • Partager sur Twitter
        4 avril 2008 à 17:43:40

        Bon j'ai trouvé l'erreur : j'ai oublié d'ajouter ceci au début du main :
        1. if(ioperm(0x378, 1, 1))
        2.         {
        3.                 perror("ioperm");
        4.                 exit(1);
        5.         }

        Je vais quand même me renseigner sur parport.
        Si j'ai un problème je reposte ici ;)
        Merci gravstein
        Tuxben
        • Partager sur Facebook
        • Partager sur Twitter

        outb en C++ = Erreur de segmentation

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown