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 :

Vérifier le code d'un Mickey Mouse de quelques lignes et une boucle


Sujet :

C

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 719
    Points : 15 104
    Points
    15 104
    Par défaut Vérifier le code d'un Mickey Mouse de quelques lignes et une boucle
    Bonjour,

    N'étant pas spécialiste du C, je viens vers vous pour vérifier si je ne me suis pas gourré quelque part lors de la réalisation de ce tout petit programme, qui simule la sortie de l'outil vdfuse lorsque celui-ci travaille avec un fichier contenant plusieurs partitions.
    (vdfuse est un outil pour "monter" dans le système de fichiers un fichier de disque virtuel).

    Je pose cette question car j'ai besoin d'être sûr que la sortie de mon prog est correcte, le but final étant de récupérer cette sortie dans une IHM écrite en Lazarus et c'est là que ça coince...
    Je vous laisse juger sur l'image ci-dessous où l'on voit à gauche la sortie dans une console de mon programme, et à droite la sortie récupérée par les composants Lazarus lorsque mon programme est lancé depuis l'IHM : on voit bien qu'il en manque un bout (les lignes "-- Executing" et "Terminé" font partie de l'IHM)...

    Nom : 2partmissing.png
Affichages : 122
Taille : 51,9 Ko

    Vous allez sans doute me demander pourquoi je mets toutes les lignes générées dans une seule grande ligne : c'est pour voir comment le bazar se comporte car, si je ne fais pas ça et que je demande à Lazarus de récupérer ligne à ligne, c'est à ce niveau qu'il en manque.
    Je pensais qu'en mettant tout dans une "grande ligne" je m'affranchirais du souci, mais que nenni...

    Bref, assez parlé, voilà le 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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(int argc, char **argv)
    {
    	char partname[12];
    	char alineofdatas[20];
    	char cumulatedatas[200];
    	int type;
    	int i;
     
    	// init
    	for (i = 0; i < 12; i++)  {partname[i] = '\0';}
    	for (i = 0; i < 20; i++)  {alineofdatas[i] = '\0';}
    	for (i = 0; i < 200; i++) {cumulatedatas[i] = '\0';}
     
    	type = 129;
     
    	// job
    	for (i = 1; i < 9; i++)
    	{
    		sprintf(partname, "Partition%d", i); //génère un nom de partoche
    		sprintf(alineofdatas, "%s 0x%02x \n", partname, type+i); //génère la ligne
    		printf("%s", alineofdatas); // contrôle
    		strcat(cumulatedatas, alineofdatas); // sauve la ligne
    	}
    	// result
    	puts("dessus = ligne à ligne dans la boucle, dessous = une seule ligne après la boucle");
    	fprintf(stdout, "%s", cumulatedatas);
    	fflush(NULL);
     
    	return 0;
    }
    Merci de vos retours et commentaires,

    PS : pour la compilation, j'ai fait au plus simple : écrit avec Geany, je me suis contenté de faire F9,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Bonjour,
    À première vue, ça a l'air correct même s'il y a probablement moyen d'optimiser tout cela. En tout cas, surtout si tu obtiens le bon résultat dans une console.

    Première question : le bug est-il permanent ou intermittent ?

    Ça ressemble à un défaut de synchronisation entre les deux parties (lecture en mode non bloquant qui se déroule comme il ne faudrait pas).

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Donc en gros, ce serait plutôt un problème au niveau de la gestion par lazarus du tube connecté à la sortie standard de ton programme?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Hmmf. En mettant mes lentilles, ça va beaucoup mieux.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
        char cumulatedatas[200];

    Code Shell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ ./programme | wc -c
    355

    Ton buffer est deux fois trop petit pour ce que tu veux en faire. Étends-le à 512 dans un premier temps, puis utilise strncat() plutôt que strcat() pour éviter ces désagréments.

    Bon courage.

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Tu oublies que le programme ne remplit le buffer qu'une fois, mais afficher les données deux fois (une fois lors du remplissage, une fois en affichant le buffer lui-même).
    Normalement, il n'y a pas de débordement (et strncat() est traitreusement difficile à bien utiliser).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 620
    Points
    23 620
    Par défaut
    En effet, j'ai encore posté trop vite.
    À voir du côté de l'autre processus, donc.

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 719
    Points : 15 104
    Points
    15 104
    Par défaut
    Merci pour vos retours

    Citation Envoyé par Obsidian Voir le message
    À première vue, ça a l'air correct même s'il y a probablement moyen d'optimiser tout cela.
    Je n'en doute pas, mais ce n'était pas le but de la manip, au contraire : je voulais un truc hyper simple à lire et à comprendre, pour bien capter la mécanique.


    Citation Envoyé par Obsidian Voir le message
    En tout cas, surtout si tu obtiens le bon résultat dans une console.
    Toujours toujours toujours.


    Citation Envoyé par Obsidian Voir le message
    Première question : le bug est-il permanent ou intermittent ?
    Hélas, 1000 fois hélas, c'est intermittent et aléatoire, dans le sens où des fois ça s'exécute bien, des fois c'est comme vous l'avez vu sur le screenshot, des fois il y a encore moins de lignes capturées, et des fois c'est juste la toute dernière ligne ("Terminé", envoyé par l'IHM) qui est absente.


    Citation Envoyé par Obsidian Voir le message
    Ça ressemble à un défaut de synchronisation entre les deux parties (lecture en mode non bloquant qui se déroule comme il ne faudrait pas).
    Citation Envoyé par Médinoc Voir le message
    Donc en gros, ce serait plutôt un problème au niveau de la gestion par lazarus du tube connecté à la sortie standard de ton programme?
    Citation Envoyé par Obsidian Voir le message
    À voir du côté de l'autre processus, donc.
    C'est bien ce qu'il me semblait, et c'est pour ça que je voulais une confirmation.

    Merci pour le coup de main, m'en vais creuser de l'autre côté, donc...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

Discussions similaires

  1. Comment vérifier un code PHP avec beaucoup de conditions ?
    Par Gunner4902 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 03/07/2008, 14h53
  2. [MySQL] Besoin d'un œil externe pour vérifier mon code (envoi données vers mysql)
    Par cuisto44000 dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 13/12/2007, 14h48
  3. Vérifier un code postal
    Par weldoo dans le forum Langage
    Réponses: 1
    Dernier message: 03/11/2007, 16h40
  4. [JavaScript] Vérifier son code
    Par Aspic dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/07/2007, 22h12
  5. vérifier du code dans une page html
    Par robert_trudel dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 16/06/2006, 01h17

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