IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Erreur BITS_PER_LONG à lever


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut Erreur BITS_PER_LONG à lever
    Bonsoir les noctambules, j'ai une erreur que je n'arrive pas à lever. Mon code ouvre un fichier sur une clé USB, et permet un tranfert de données dans celui-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    #include <stdio.h>
     
    #include <stdlib.h>
     
    #include <linux/usbdevice_fs.h>
    #include <fcntl.h>
     
    #include <linux/usb.h>
    #include <sys/ioctl.h>
     
    int main(void){
    int fd;
     
    fd = open("/proc/bus/usb/004/004/test.txt", O_RDWR);
     
    if(fd != -1) {
       int ret;
       struct usbdevfs_bulktransfer bulk;
     
     
       bulk.ep = USB_DIR_IN | 1;
       bulk.len = 1024;
       bulk.timeout = 1000;
       bulk.data = malloc(1024);
     
       ret = ioctl(fd, USBDEVFS_BULK, &bulk);
     
       if (ret < 0){
          printf("Error in bulk transfer");}
       else {
          /* les données sont disponibles dans bulk.data */
       }
       close(fd);
    }
    }
    Le problème, c'est qu'au moment de la compilation, apparait cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    In file included from /usr/include/linux/usb.h:4,
                     from ./pip.c:5:
    /usr/include/linux/mod_devicetable.h:289: error: ‘BITS_PER_LONG’ undeclared here (not in a function)
    Quelqu'un peut il m'aiguiller sur la raison de cette erreur?

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonsoir,

    Il suffit de chercher dans les fichiers d'en tête :
    Code linux/types.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [...]
    #ifdef  __KERNEL__
     
    #define BITS_TO_LONGS(bits) \
            (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG)
    [...]

    Il faut donc ajouter -D__KERNEL__ aux options de gcc

  3. #3
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Dans la mesur eou je suis novice en C, peux tu m'expliquer ce qui génère l'erreur??
    (histoire de pas coriger juste pour corriger)...

  4. #4
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Voilà j'ai tapé ca dans une console:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcc -D__KERNEL -o executable ./pip.c
    après avoir corrigé ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    #include <stdio.h>
     
    #include <stdlib.h>
    #include <linux/usbdevice_fs.h>
    #include <fcntl.h>
     
    #include <linux/usb.h>
    #include <sys/ioctl.h>
     
    #ifdef  __KERNEL__
    #define BITS_TO_LONGS(bits) \
            (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG)
    #endif
     
     
    int main(void){
    Mais j'ai toujours la même erreur......

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par Flophx
    peux tu m'expliquer ce qui génère l'erreur??
    (histoire de pas coriger juste pour corriger)...
    Je me suis trompé ce n'est pas BITS_TO_LONGS mais BITS_PER_LONG

    Mais le problème doit être le même : cette constante est déclarée dans un fichier d'en tête du noyau à la condition que la constante __KERNEL__ soit aussi déclarée.

    Soit tu fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #define __KERNEL__
     
    #include <stdio.h>
     
    #include <stdlib.h>
    #include <linux/usbdevice_fs.h>
    #include <fcntl.h>
     
    #include <linux/usb.h>
    #include <sys/ioctl.h>
    Ou plus simplement avec l'option -D de gcc (qui fait exactement la même chose).

    Citation Envoyé par Flophx
    Dans la mesur eou je suis novice en C,
    Et tu développe déjà pour le noyau Linux Pour commencer il vaut mieux faire simple : http://c.developpez.com/cours/#cours-c

  6. #6
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    oui, alors, le problème est un peu différent:
    grosso modo, je dois écrire sur une clé USB deux fichiers: un text (issus de capteurs) et un video (issu d'une webcam).
    Ce n'est pas que j'ai pas envie de faire simple, mais il s'agit d'un projet ou le thème était "simple": instrumentation d'un avion de voltige. Le problème c'est qu'on a un budget limité, ce qui implique d'utilisé de l'embarqué "simple"... Qui tourne avec un processeur adapté linux, avec 100 Mhz de fréquence; Et comme il faut bien gérer le tout, pas le choix, c'est du C...
    Il me reste un peu moins de trois mois pour y arriver!
    Donc bien obligé de commencer....
    Vous allez me voir souvent :d

  7. #7
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par Flophx
    oui, alors, le problème est un peu différent:
    grosso modo, je dois écrire sur une clé USB deux fichiers: un text (issus de capteurs) et un video (issu d'une webcam).
    Ce n'est pas que j'ai pas envie de faire simple, mais il s'agit d'un projet ou le thème était "simple": instrumentation d'un avion de voltige. Le problème c'est qu'on a un budget limité, ce qui implique d'utilisé de l'embarqué "simple"... Qui tourne avec un processeur adapté linux, avec 100 Mhz de fréquence; Et comme il faut bien gérer le tout, pas le choix, c'est du C...
    Il me reste un peu moins de trois mois pour y arriver!
    Donc bien obligé de commencer....
    Vous allez me voir souvent :d
    Ok, mais les en tête du noyau (ceux du répertoire Linux) sont fait pour écrire des modules ! Dans ton cas, Linux possède déjà ce genre de chose, tu as juste à utiliser les fonctions C standard, par exemple : Copier un fichier

Discussions similaires

  1. SqlAlchemy : lever une exception sur erreur d'encodage
    Par Sekigo dans le forum Général Python
    Réponses: 8
    Dernier message: 31/03/2013, 16h29
  2. [1.x] Lever erreur sur setPostValidator
    Par dorian53 dans le forum Symfony
    Réponses: 2
    Dernier message: 31/05/2012, 19h59
  3. Lever une erreur
    Par malick021988 dans le forum Django
    Réponses: 4
    Dernier message: 16/12/2009, 14h10
  4. Lever les erreurs sur le socket
    Par electro38 dans le forum Réseau/Web
    Réponses: 3
    Dernier message: 21/08/2009, 08h10
  5. [XL-2007] Comment lever une erreur?
    Par SpyKe974 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/07/2009, 18h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo