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 :

[Portabilité] Programme qui fonctionne sous Linux mais pas sous Windows/


Sujet :

C

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Par défaut [Portabilité] Programme qui fonctionne sous Linux mais pas sous Windows/
    Bonjour. J'ai un programme qui fonctionne très bien sous linux, compilé avec GCC. Avec Cygwin, rien ne va plus.

    Je voudrai savoir si ça peut être du à des caracteres interprétés différemment sous windows et linux, tels que '\r', par exemple...

    Vraiment je suis perdu.

    Voilà les différents fichiers concernés en pièce jointe.

    Quelques remarques sur le problème :
    • Je fait souvent des conversions char->unsigned char pour indexer mon tableau qui regroupe les occurences de chaque caractere. Ainsi chaque case est indexée par le code octal du caractere en question.
    • Le code binaire que j'écris est codé unsigned char par unsigned char et ensuite écrit dans le fichier de codage avec fputc(char_to_write, fp_encoded) ;.
    • En fait, je vois que le fichier binaire d'encodage est d'ors et déjà différent que le fichier encodé sous Linux. Le fichier sous linux fait 515 octets, et 511 octets avec Cygwin. Donc le résultat final ne peut pas être le même. Le problème si situe peut être dans l'encodage du fichier.
    • La table des occurences est différente sous Linux et Windows :
      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
       
      $ diff -u baudelaire.txt.htab bin/Debug/baudelaire.txt.htab
      --- baudelaire.txt.htab 2009-04-07 13:11:59.257534500 +0200
      +++ bin/Debug/baudelaire.txt.htab       2009-04-07 12:45:29.080934500 +0200
      @@ -4,6 +4,8 @@
        44  16
        45  2
        46  6
      + 59  1
      + 65  1
        67  2
        68  3
        69  11
      @@ -38,4 +40,5 @@
       121  1
       160  2
       169  10
      +174  1
       195  13
      On a trois caracteres en plus qui sont lus sous Linux, et pas sous Windows. Quésaquo ? Le morceau de code concerné par le comptage des caracteres :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
       
      unsigned char index ;
      char * istring ;
      huffman_tree leaves_tab[256] ;
      for ( i = 0 ; i < len_istring ; i++ )
      {
            index = istring[i] ; /* on incremente le compteur de 1 a chaque 
            occurence */
            leaves_tab[index].count = leaves_tab[index].count + 1 ;
      }
    • Je poste ici la fonction principale responsable, n'hésitez pas à me demander si vous voulez que je poste plus de code.

    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
     
    #ifndef HUFFMAN_HEADER_H_INCLUDED
        #include "huffman_header.h"
    #endif
     
    void encode_string( const char * istring, huffman_tree * huffman_index, const char * filename )
    {
        /* cette procedure prend une chaine istring en entree, l'encode a partir de l'index
        donne en argument, et ecrit le resultat de l'encodage dans le fichier filename*/
     
        FILE * fp ;
        fp = fopen(filename, "w") ;
        #ifdef DEBUG
        puts("on entre dans encode_string") ;
        #endif
        if( fp != NULL )
        {
            /* variables sur le mot binaire a encoder */
            unsigned char index ;
            unsigned char pos_bit ;
            unsigned char pos_char ;
            unsigned int j ;
     
            /* variable sur la chaine d'entree */
            unsigned int i ;
     
            /* variables sur la chaines de sortie (chaine encodee)*/
            unsigned long int size_ofile ; /* ne depasse pas la taille du fichier
            de sortie en char*/
            unsigned char obit_pos ; /* ne depasse pas 7 */
            unsigned char char_to_write ; /* octet a ecrire dans le fichier */
            unsigned char bit ;
     
            i=0 ;
            obit_pos = 0 ;
            size_ofile = 0 ;
            char_to_write = 0 ;
            while( istring[i]!='\0' )
            {
                index = istring[i] ; /* index dans la table d'encodage du caractere istring[i] */
                for ( j = 0 ; j<huffman_index[index].bit_size ; j++ )
                {
                    pos_bit = (j%CHAR_BIT) ; /* position du bit a ecrire */
                    pos_char = (j/CHAR_BIT) ; /* position de l'octet a ecrire */
                    bit = read_bit( pos_bit, huffman_index[index].bin_word[pos_char] ) ;
                    char_to_write = write_bit(bit, obit_pos , char_to_write ) ;
                    obit_pos = (obit_pos+1)%8 ;
                    if( obit_pos == 0 )
                    {
                        /* si cette valeur est un multiple de 8, on inscrit ce caractere
                                                         et on passe au suivant */
                        putc(char_to_write,fp);
                        char_to_write = 0 ;
                        size_ofile ++ ;
                    }
                }
                i = i + 1 ;
            }
            putc(char_to_write,fp) ;
     
            fclose(fp) ;
            fp=NULL ;
            #ifdef DEBUG
            puts("dans encode_string() :") ;
            printf( "la taille de la chaine initiale est de %u caracteres\n" , i ) ;
            printf( "la taille de la chaine finale est de %lu caracteres\n\n" , size_ofile+1 ) ;
            #endif
        }
        else
        {
            puts("impossible d'ouvrir le fichier dans encode_string") ;
        }
        #ifdef DEBUG
        puts("on sort de encode_string") ;
        #endif
    }
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [LibreOffice][Tableur] Une macro qui fonctionne sous Linux mais pas sous windows
    Par ludox62 dans le forum OpenOffice & LibreOffice
    Réponses: 3
    Dernier message: 07/01/2014, 21h26
  2. Bad_alloc sous Linux mais pas sous mac
    Par betaplus dans le forum C++
    Réponses: 4
    Dernier message: 11/03/2013, 14h03
  3. JCheckbox icones persos - Bug sous linux mais pas sous Windows
    Par Hemophilius dans le forum AWT/Swing
    Réponses: 16
    Dernier message: 04/11/2011, 15h34
  4. Script qui marche sous Linux mais pas sous Windows et vice versa
    Par tu-phat dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 26/11/2009, 02h39
  5. [JMF] Code fonctionnant sous Linux mais pas sous XP
    Par Monsieur_Max dans le forum Multimédia
    Réponses: 4
    Dernier message: 25/05/2006, 18h57

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