Florent C. a écrit 505 commentaires

  • [^] # Re: cadre.c

    Posté par  . En réponse au message Caractères imprimables qui passent pas. Évalué à 2.

    Je te pertinente, mais j'ai quand même quelques petits problèmes avec ton programme.

    Tout d'abord, les deux bonnes manières de déclarer la fonction main sont :
    int main(int argc, char** argv)
    ou
    int main(void)
    Mais sûrement aps void main() ni main(int argc, char** argv) ...

    De plus, il manque un 'return 0;' à la fin de la fonction.

    Mais bon, je pinaille ...
  • # ncurses ??

    Posté par  . En réponse au message Caractères imprimables qui passent pas. Évalué à 3.

    Les caractères que tu souhaites utiliser ne sont pas forcément disponibles dans l'encodage que tu utilises.

    Peut-être ferais-tu mieux d'utiliser la bibliothèque ncurses ?
  • [^] # Re: Fin de chaine

    Posté par  . En réponse au message pb de sortie standard. Évalué à 2.

    Attention, si tu veux dire au système que tout s'est bien passé, retourne 0, mais surtout pas 1 !!
  • [^] # Re: fopen()

    Posté par  . En réponse au message libc et retour chariot. Évalué à 2.

    Alors c'est ton prof qui devrait réviser :

    http://www.isty-info.uvsq.fr/~rumeau/fclc/fclc008.html#q_5(...)

    En C, sizeof(un_type) == sizeof(unsigned un_type) quel que soit le type utilisé.

    En effet, unsigned ne fait que dire qu'on utilise des valeurs non signées, allant de 0 à [valeur maximale possible sur ce nombre de bytes]. Tandis qu'en signed (par défaut, donc), on a un type signé, le type est obtenu grâce au complément à deux...

    Soit ton prof ne connaît pas ce qu'il enseigne, soit c'est toi qui a mal compris.

    Il t'a probablement dit que sous MS-DOS, un caractère n'était représentable que par la norme ASCII non étendue, qui encode les caractères sur 7 bits. Il reste donc un bit inutilisé pour contenir des caractères imprimables. La norme ASCII étendue va quant à elle jusqu'au 8e bit. Toujours est-il que les char sont sur un byte, quelle que soit la taille du byte sur cette architecture. C'est la définition du char qui veut cela, et c'est la base du langage C.
  • [^] # Re: fopen()

    Posté par  . En réponse au message libc et retour chariot. Évalué à 2.

    N'importe quoi, mais alors n'importe quoi de n'importe quoi !

    Un unsigned char fait un byte, tout comme un char.

    C'est dans la norme du C.

    Maintenant, pour la taille du byte, c'est vrai que ça dépend de l'architecture, ça peut être 7, 8, 9, 16 bits, voire n'importe quoi d'autre.

    Rappelons que byte en anglais veut dire "multiplet", qu'un octet est un multiplet de 8 bits, et que octet en anglais se dit "octet" ...

    Et avant de dire des énormités pareilles, on révise la norme du C, merci.
  • [^] # Re: générer le core dump

    Posté par  . En réponse au message comment trouver l'origine d'un segmentation fault ?. Évalué à 1.

    Ce n'est pas typiquement le genre de trucs qu'on devrait pouvoir retrouver avec gdb ?

    Avec gdb je ne sais pas, mais avec valgrind, oui :)
  • # Gdb et printf ...

    Posté par  . En réponse au message comment trouver l'origine d'un segmentation fault ?. Évalué à 3.

    Avec gdb, tu lances ton programme, il fait son segfault, et tu tapes 'bt' ... Tu auras toutes les infos nécessaires ...

    Il y a aussi la solution de poser des printf de partout dans ton code pour "tracer" le déroulement de ton code, et quand ça s'arrête, tu sais où ...

    Voilà, c'est le système D ...

    Sinon pense à utiliser un outil du genre de Valgrind pour débusquer tous tes problèmes d'allocation/déallocation/écriture/lecture en mémoire, car les segfault sont souvent dûs à des défauts de programmation à ces niveaux-là ...
  • # L'OS ne fait pas tout ...

    Posté par  . En réponse au message free() or not free() ?. Évalué à 1.

    Et même s'il le fait, le programmeur n'a pas à le savoir. Il ne faut pas se reposer sur son OS, donc, il faut bien libérer la mémoire que l'on a allouée. C'est ce qu'on appelle une bonne pratique dont il faut prendre l'habitude.

    Ou alors, il faut changer de langage de programmation et en utiliser un qui fournit des smart pointers ou un garbage collector ...
  • [^] # Re: Alors...

    Posté par  . En réponse au message scanf et itération. Évalué à -1.

    Tiens, salut Krap, comment va ? (on continue sur la messagerie perso si tu veux :)

    Sinon, j'allais réagir sur les mauvaises pratiques à éviter en langage C, mais je suis bien heureux que ce soit quelqu'un que je connais (et toi en particulier) qui m'ait devancé :)

    flure (au cas où tu m'aurais oublié)
  • [^] # Re: re

    Posté par  . En réponse au message Lecture d'un fichier texte par colonne (débutant). Évalué à 1.

    mince, y'a encore un bug à la fin de get_nb_lines : il faut se repositionner au début du fichier, sinon la suite ne fonctionnera pas. Cherche donc du côté de la fonction fseek ...
  • [^] # Re: re

    Posté par  . En réponse au message Lecture d'un fichier texte par colonne (débutant). Évalué à 2.

    Zut, il y a un GROS LEAK (voire même un segfault) dans la fonction get_nb_lines, mais bon, je te le laisse comme exercice :)
  • [^] # Re: re

    Posté par  . En réponse au message Lecture d'un fichier texte par colonne (débutant). Évalué à 3.

    Tout à fait, mais pour cela il faut en apprendre un peu sur les pointeurs. Bon, voilà ce que je te propose :
    #include <stdio.h>
    
    /* retourne le nombre de lignes d'un fichier texte deja ouvert */
    int get_nb_lines(FILE* fp)
    {
      unsigned int nb = 0;
      
      while (fgets(fp) != NULL) {
        nb++;
      }
    
      return nb;
    }
    
    /* recupere les valeurs dans v1 et v2 (passage par reference) */
    void get_values(char* ligne, float *v1, float *v2)
    {
       char* tmp:
       char* result;
        /* strtok modifie son premier argument, 
            on travaille donc sur une variable temporaire */
       strcpy(tmp, ligne);
    
       result = strtok(tmp, "\t, ");
       if(result != NULL) {
         sscanf(result, "%f", v1);
         
         result = strtok(NULL, "\t ");
         if(result != NULL) {
            sscanf(result, "%f", v2);
         }
       }  
    }
    
    
    int main(int argc, char* argv[])
    {
      FILE* fp = NULL;
      unsigned int nb_lines = 0;
      float *value1 = NULL,
              *value2 = NULL;
      int i = 0;
      char line[256] = "";
      
      
      fp = fopen("test.dat", "r");
      if (fp == NULL) return -1;
    
      nb_lines = get_nb_lines(fp);
    
      value1 = malloc(nb_lines * sizeof *value1);
      value2 = malloc(nb_lines * sizeof *value2);
    
      while((fgets(ligne, 256, fp) != NULL) 
              && (i<nb_lines)) {
        get_values(ligne, &(value1[i]), &(value2[i]));
        i++;
      }  
    
      /* et bien sur on libere la memoire */
      free(value1);
      value1 = NULL;
      free(value2);
      value2 = NULL;
      fclose(fp);
      fp = NULL;
    
      return  0;
    }
    
    Je ne l'ai pas testé ni même compilé, j'espère que ça marchera, en tout cas l'idée y est ...
  • [^] # Re: re

    Posté par  . En réponse au message Lecture d'un fichier texte par colonne (débutant). Évalué à 3.

    Ton programme risque fort de planter si le fichier contient plus de 200 lignes (buffer overflow justement), et tu utilises la fonction open avec les paramètres de fopen, ce qui risque fort de ne pas marcher (dans le meilleur des cas, ça ne compilera pas). De plus, open() n'est pas dans stdio.h.

    Bon, ok, à partir de maintenant je suppose que tu pensais plutôt à fopen(), qui prend bien ce genre de paramètres, et est bien déclarée dans stdio.h.

    Sans parler de l'utilisation de fscanf sans aucune précaution. fscanf retourne le nombre de valeurs assignées. Tu devrais vérifier cette valeur de retour en plus de EOF. Et, comme dit dans mon autre message, fscanf ne devrait être utilisé que pour lire des données formattées par les fonctions de la série des *printf ...

    Bref, beaucoup de choses à revoir :)
  • [^] # Re: re

    Posté par  . En réponse au message Lecture d'un fichier texte par colonne (débutant). Évalué à 3.

    Pour utiliser les fonctions *scanf, il faut être certain du format de données entrantes, s'il y a la moindre erreur de saisie, ça fait boum!

    Donc, on ne doit utiliser les fonctions *scanf que pour interpréter des données écrites par les fonctions *printf !

    Autrement, on utilise fgets, puis, au choix, strtok (si l'on est sûr est certain de ne pas avoir besoin de réentrance), ou strtok_r, ou alencore on interprète "à la main" ...
  • [^] # Re: Mouais...

    Posté par  . En réponse au message Question existentiel sur le coding style de GNOME. Évalué à 1.

    Ahhhhhh Enfin quelqu'un qui pense comme moi !!!!
  • [^] # Re: en passant

    Posté par  . En réponse au message free() or not free() ?. Évalué à 2.

    Oui surtout que free(unpointeurpasnulmaisdejalibere) provoquera un segfault ...
  • [^] # Re: Microbes

    Posté par  . En réponse au journal Tests unitaires et faineantise. Évalué à 3.

    Tout à fait, c'est la raison pour laquelle on (ma copine de geek et moi) enlève systématiquement les emballages avant de mettre au frigo ...

    Sinon pour la fainéantise et les tests unitaires, je comprends bien, et j'aimerai bien me lancer là dedans, mais quand un employeur veut voir quelque chose d'utilisable tout de suite il est souvent difficile de lui expliquer qu'on a rien de montrable pour le moment parce qu'on a passé la journée à coder des tests unitaires qui feront gagner beaucoup de temps plus tard ...
  • [^] # Re: Il y a des fonctions toutes faites pour cela ...

    Posté par  . En réponse au message Copie rapide de tableau. Évalué à 2.

    Mince je n'avais pas lu la dernière phrase. Mais tu veux vraiment te passer de toute bibliothèque, mais de la libc ????
    C'est un sacré boulot que tu fais là, et dans ce cas-là tu devrais faire ta routine directement en assembleur, mais la tu perds complètement la portabilité...
  • # Il y a des fonctions toutes faites pour cela ...

    Posté par  . En réponse au message Copie rapide de tableau. Évalué à 3.

    As-tu essayé memcpy au lieu de partir du principe que ton programme ne tournera que sur ta machine ???
    Il faut savoir que memcpy est optimisé exactement pour cela, qu'elle peut tirer profit d'un DMA s'il est disponible, et que sinon on n'utiliserait que des boucles pour copier des tableaux, et que cette fonction n'existerait pas.
    Moralité : utilise memcpy, memset etc (dans string.h).
  • # Best viewed with ...

    Posté par  . En réponse au journal Dire poliment que MSIE ça pue ?. Évalué à 3.

    Tu utilises la vieille technique pro-IE en la détournant pour firefox :)

    Tu mets "Best viewed with a W3C-compliant browser such as [un lien vers firefox]", et aussi tu mets tous les boutons possibles :
    celui de firefox
    celui qui dit que ton site est valide xhtml
    celui qui dit que ta css est valide
    celui de php si ton site est en php

    Bref, tu fais de la pub quoi ...
  • [^] # Re: Mouais...

    Posté par  . En réponse au message Question existentiel sur le coding style de GNOME. Évalué à 1.

    Ça ne serait pas le style K&R ça par hasard ? :)
  • [^] # Re: pas besoin de réinstaller

    Posté par  . En réponse au journal Réinstaller gnome.... Évalué à 1.

    Oui, Ctrl+Alt+Backspace aurait suffit ...
  • [^] # Re: reinstaller tout le système ...

    Posté par  . En réponse au journal Réinstaller gnome.... Évalué à 1.

    Il faut savoir utiliser son desktop aussi ...

    Clic droit sur la barre du haut>nouveau panel
    ça donne rien ???
  • # Je vois pas ...

    Posté par  . En réponse au message Linux et écran plasma .... Évalué à 2.

    Où serait le problème ???
  • [^] # Re: C'est un probleme notoire

    Posté par  . En réponse au message Un double, sec, svp.. Évalué à 2.

    Le langage C a ete developpe pour developper le premier unix.

    Le langage C a été développé pour ne pas avoir à réécrire UNIX en assembleur pour toutes les machines sur lesquelles UNIX devait tourner. Donc, sa première raison d'être, c'est bien la portabilité.