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 compilation - warning C4047 & C4133


Sujet :

C

  1. #1
    Membre du Club Avatar de Redgard
    Homme Profil pro
    x
    Inscrit en
    Décembre 2014
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : x

    Informations forums :
    Inscription : Décembre 2014
    Messages : 90
    Points : 60
    Points
    60
    Par défaut Erreur compilation - warning C4047 & C4133
    Bonjour,

    J'ai plusieurs erreur de compilation.

    warning C4047: '!=' : les niveaux d'indirection de 'int' et de 'void *' sont différents

    Donc j'avais la fonction:
    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
    int CountLines(const char *fileName) {
    	FILE* fileBuffer;
    	int numbLines = 0;
    
    	if ((fileBuffer = fopen(fileName, "r")) == NULL) {
    		printf("! Erreur -  Echec de l'ouverture du fichier %s !\n", fileName);
    		// sentry value
    		return -1;
    	}
    
    	int number;
    	while ((fscanf(fileBuffer, "%d\n", &number)) != NULL) 
    		++numbLines;
    
    	fclose(fileBuffer);
    
    	return numbLines;
    }
    J'ai pigé que c'était la macro NULL, parce que NULL est une macro de type void, ce qui donne

    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
    int CountLines(const char *fileName) {
    	FILE* fileBuffer;
    	int numbLines = 0;
    
    	if ((fileBuffer = fopen(fileName, "r")) == NULL) {
    		printf("! Erreur -  Echec de l'ouverture du fichier %s !\n", fileName);
    		// sentry value
    		return -1;
    	}
    
    	int number;
    	while ((fscanf(fileBuffer, "%d\n", &number)) != 0) 
    		++numbLines;
    
    	fclose(fileBuffer);
    
    	return numbLines;
    }
    Je pense avoir plus où moins compris qu'en fait elle est traité comme un pointeur de type void, et non pas comme une variable 0 de type "int". maintenant je suis pas contre qu'on me le confirme.
    (je l'aurais pas pigé sans la partie sur les macros du cours de C)

    Entry.c(67): warning C4133: 'fonction'*: types incompatibles - de 'FILE *' à 'const char *const '

    Parcontre pour celle là je présume que c'est de nouveau un problème de macro, mais j'ai pas compris... donc si quelqu'un sait m'expliquer, je suis preneur.

    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
    int GetTabNumbTxt(int *tab, char *fileName) {
    	FILE *fileBuffer;
    
    	if ((fileBuffer = fopen(fileName, "r")) == NULL) {
    		printf("! Erreur -  Echec de l'ouverture du fichier %s !\n", fileName);
    		// sentry value
    		return 1;
    	}
    
    	while((sscanf(fileBuffer, "%d\n", tab)) != EOF) 
    		tab++;
    
    	fclose(fileBuffer);
    
    	return 0;
    }
    En réfléchissant en tapant ce message, je pense avoir trouvé. dites moi si c'est juste.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    do
    {
    	sscanf(fileBuffer, "%d\n", tab);
    	tab++;
    } while (tab != EOF);
    Merci d'avance,
    Red'

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    NULL est utilisé comme valeur associée à un pointeur nul. La valeur retournée par fscanf() est un entier représentant le nombre de paramètres correctement convertis ou EOF si le flux s'est mis en erreur. Ici on s'attend à un paramètre donc le mieux serait : if ( fscanf( fileBuffer, "%d\n", &tab ) < 1 ) break;.

    Pour la seconde erreur, tu as vraisemblablement confondu sscanf() et fscanf(). Il faudrait écrire while ( fscanf( fileBuffer, "%d\n", tab ) < 1 ).
    Et ta variable fileBuffer est très mal nommée, il s'agit ici d'un file handle pas d'un buffer (et là, la fonction sscanf() serait à utiliser). Erreur de copier/coller?

  3. #3
    Membre du Club Avatar de Redgard
    Homme Profil pro
    x
    Inscrit en
    Décembre 2014
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : x

    Informations forums :
    Inscription : Décembre 2014
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    La première fonction (CountLines) a pour utilité de compter les lignes du fichier et de retoourner un entier qui serait utiliser pour faire l'attribution dynamique du tableau. Donc je comprends pas trop l'utilité du if ( fscanf( fileBuffer, "%d\n", &tab ) < 1 ) break;. Est-ce que la fonction détecte les saut de lignes (\n)? Donc l'idée est d'avoir une boucle qui va jusqu'à la fin du fichier.

    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
    // count & return the number of lines for a file
    int CountLines(const char *fileName) {
    	FILE* fileHandle;
    	int numbLines = 0;
     
    	if ((fileHandle = fopen(fileName, "r")) == NULL) {
    		printf("! Erreur -  Echec de l'ouverture du fichier %s !\n", fileName);
    		// sentry value
    		return -1;
    	}
     
    	int number = 0;
    	while (fgets(fileHandle, 100, &number) != 0)
    	{
    		++numbLines;
    	}
     
     
    	fclose(fileHandle);
     
    	return numbLines;
    }
    La deuxième fonction a pour utilité de copier le contenu du fichier dont on a compté les lignes, dans le tableau dont on a fait l'allocation dynamique sur base du nombre de ligne dénombré. Donc là, il y a deux possibilités, soit une boucle allant jusqu'à la fin du fichier, soit un boucle prenant un entier (nbrEntier) passé en paramètre. La deuxième possiblité permet d'éviter un débordement de la mémoire.

    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
    //copy-paste the numb from a file to a tab
    int GetTabNumbTxt(int *tab, char *fileName, const int numbLines) {
    	FILE *fileHandle;
     
    	if ((fileHandle = fopen(fileName, "r")) == NULL) {
    		printf("! Erreur -  Echec de l'ouverture du fichier %s !\n", fileName);
    		// sentry value
    		return 1;
    	}
     
    	for (int i = 0; i < numbLines; i++) 
    	{
    		fscanf(fileHandle, "%d\n", tab);
    		tab++;
    	}
     
    	fclose(fileHandle);
     
    	return 0;
    }

  4. #4
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,
    si le but est de charger en mémoire le contenu du fichier/connaître le nombre de caractères nécessaires pour allouer de la mémoire afin de load toutes les data en mémoire pourquoi ne pas utiliser une approche ou implémentation avec des fonctions disponibles telles que fseek et ftell qui vous permettent de travailler sur le flux en vous positionnant là où vous le souhaitez et de l'autre, obtenir la taille nécessaire pour allouer dynamiquement un tableau (vous référer à leur manuel pour plus de détails). Exemple :

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
     
    /*
    *   Attention le code source ci-dessous 
    *   est susceptible de contenir des erreurs
    */
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main( void ){
     
        /*
        *   Définition des variables
        */
        size_t i = 0;
        FILE *p = NULL;
        extern int errno;
        char c_str = '\0';
        size_t sZFile = 0;
        char *ptr_buff = NULL;
     
        errno = 0;
        if( NULL == (p = fopen("main.c", "r") ) ){
            (void)fprintf(stderr,
                          "Erreur fopen (%d)\t:%s\n", errno,
                          strerror(errno) );
            return EXIT_FAILURE;
        }
     
        /*
        *   Positionnement en fin de fichier
        */
        if( 0 != fseek(p, 0L, SEEK_END) ){
            (void)fclose(p);
            p = NULL;
            (void)fprintf(stderr,
                          " Erreur fseek (%d)\t:%s\n", errno,
                          strerror(errno) );
            return EXIT_FAILURE;
        }
     
        /*
        *   Acquisition de la position courante 
        *   dans le fichier en nombre d'octets.
        */
        if( -1 == (sZFile = ftell(p) ) ){
            (void)fclose(p);
            p = NULL;
            (void)fprintf(stderr,
                          "Erreur ftell (%d)\t:%s\n", errno,
                          strerror(errno) );
            return EXIT_FAILURE;
        }
     
        /*
        *   Positionnement en début de fichier
        */
        if( 0 != fseek(p, 0L, SEEK_SET) ){
            (void)fclose(p);
            p = NULL;
            (void)fprintf(stderr,
                          "Erreur fseek (%d)\t:%s\n", errno,
                          strerror(errno) );
            return EXIT_FAILURE;
        }
     
        /*
        *   Allocation dynamique de la mémoire
        */
        if( NULL ==
            ( ptr_buff = malloc( sZFile * sizeof *ptr_buff) ) ){
     
            (void)fclose(p);
            p = NULL;
            (void)fprintf(stderr,
                          "Erreur Allocation (%d)\t:%s\n",
                          errno, strerror(errno) );
            return EXIT_FAILURE;
        }
     
        (void)memset( ptr_buff, 0, sZFile );
        for( ; EOF != (c_str = fgetc(p) );
            *(ptr_buff+(i++)) = c_str )
            ;
     
        /*
        *   close du fichier
        */
        (void)fclose( p );
        p = NULL;
     
        /*
        *   Affichage du contenu
        */
        (void)fprintf(stderr, "%s\n", ptr_buff );
     
        /*
        *   Free du pointeur
        */
        free( ptr_buff );
        ptr_buff = NULL;
     
        return EXIT_SUCCESS;
    }
    à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  5. #5
    Membre du Club Avatar de Redgard
    Homme Profil pro
    x
    Inscrit en
    Décembre 2014
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : x

    Informations forums :
    Inscription : Décembre 2014
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    Parce que je ne m'étais pas trop intéressé à ces fonctions, mais l'idée est bonne.

Discussions similaires

  1. RXControl RxRichEdit ERREUR Compilation
    Par loleske dans le forum C++Builder
    Réponses: 2
    Dernier message: 25/02/2005, 18h12
  2. [FreePascal] Erreur compilation ou défaut Dev-Pascal ?
    Par molesqualeux dans le forum Free Pascal
    Réponses: 5
    Dernier message: 27/12/2004, 10h00
  3. [Débutant]Erreur compilation !
    Par gandalf_le_blanc dans le forum AWT/Swing
    Réponses: 23
    Dernier message: 30/08/2004, 14h23
  4. Trop de message d'erreurs: compilation KO
    Par jeannot27 dans le forum C++Builder
    Réponses: 6
    Dernier message: 21/01/2004, 16h45
  5. Erreur compilation DX8.1 VC++ 6
    Par d.vidal dans le forum DirectX
    Réponses: 1
    Dernier message: 10/09/2003, 09h04

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