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.
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.
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à ...
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 ...
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é :)
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 ...
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 ...
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" ...
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 ...
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é...
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).
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
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é.
[^] # Re: cadre.c
Posté par Florent C. . En réponse au message Caractères imprimables qui passent pas. Évalué à 2.
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 Florent C. . En réponse au message Caractères imprimables qui passent pas. Évalué à 3.
Peut-être ferais-tu mieux d'utiliser la bibliothèque ncurses ?
[^] # Re: Fin de chaine
Posté par Florent C. . En réponse au message pb de sortie standard. Évalué à 2.
[^] # Re: fopen()
Posté par Florent C. . En réponse au message libc et retour chariot. Évalué à 2.
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 Florent C. . En réponse au message libc et retour chariot. Évalué à 2.
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 Florent C. . En réponse au message comment trouver l'origine d'un segmentation fault ?. Évalué à 1.
Avec gdb je ne sais pas, mais avec valgrind, oui :)
# Gdb et printf ...
Posté par Florent C. . En réponse au message comment trouver l'origine d'un segmentation fault ?. Évalué à 3.
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 Florent C. . En réponse au message free() or not free() ?. Évalué à 1.
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 Florent C. . En réponse au message scanf et itération. Évalué à -1.
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 Florent C. . En réponse au message Lecture d'un fichier texte par colonne (débutant). Évalué à 1.
[^] # Re: re
Posté par Florent C. . En réponse au message Lecture d'un fichier texte par colonne (débutant). Évalué à 2.
[^] # Re: re
Posté par Florent C. . En réponse au message Lecture d'un fichier texte par colonne (débutant). Évalué à 3.
[^] # Re: re
Posté par Florent C. . En réponse au message Lecture d'un fichier texte par colonne (débutant). Évalué à 3.
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 Florent C. . En réponse au message Lecture d'un fichier texte par colonne (débutant). Évalué à 3.
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 Florent C. . En réponse au message Question existentiel sur le coding style de GNOME. Évalué à 1.
[^] # Re: en passant
Posté par Florent C. . En réponse au message free() or not free() ?. Évalué à 2.
[^] # Re: Microbes
Posté par Florent C. . En réponse au journal Tests unitaires et faineantise. Évalué à 3.
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 Florent C. . En réponse au message Copie rapide de tableau. Évalué à 2.
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 Florent C. . En réponse au message Copie rapide de tableau. Évalué à 3.
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 Florent C. . En réponse au journal Dire poliment que MSIE ça pue ?. Évalué à 3.
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 Florent C. . En réponse au message Question existentiel sur le coding style de GNOME. Évalué à 1.
[^] # Re: pas besoin de réinstaller
Posté par Florent C. . En réponse au journal Réinstaller gnome.... Évalué à 1.
[^] # Re: reinstaller tout le système ...
Posté par Florent C. . En réponse au journal Réinstaller gnome.... Évalué à 1.
Clic droit sur la barre du haut>nouveau panel
ça donne rien ???
# Je vois pas ...
Posté par Florent C. . En réponse au message Linux et écran plasma .... Évalué à 2.
[^] # Re: C'est un probleme notoire
Posté par Florent C. . En réponse au message Un double, sec, svp.. Évalué à 2.
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é.