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 :

Question sur fwrite


Sujet :

C

  1. #1
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 384
    Par défaut Question sur fwrite
    Bonjour,
    Je suis occupé de travailler sur des fichiers et en essayant de faire une écriture fichier j'ai découvert un bugg (probablement de mauvaise compréhension de ma part).

    voici ce que j'ai essayé de faire cela n'a pas fonctionné
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite(&Worker, sizeof(Worker), MaxToSave, fichier);

    voila la "même" méthode (qui fonctionne) mais avec une boucle
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(cpt = 0; cpt < MaxToSave; cpt++)
    	fwrite(&Worker, sizeof(Worker), 1, fichier);

    Mon but était de copier une structure Worker du nombre de fois de MaxToSave
    Je ne comprends pas pourquoi la 1re méthode ne fonctionne pas
    Merci d'avance

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    fwrite (clic !) attend en premier paramètre l'adresse d'une zone mémoire d'une taille au moins égale à size * count. Si ce n'est pas le cas, le déréférencement du contenu du buffer au-delà de ses limites va produire un comportement indéterminé.

    Nous ne savons pas comment est déclarée ta variable Worker, mais son adresse doit donc correspondre au début d'une zone d'au moins sizeof(Worker) * MaxToSave octets.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Dit autrement, dans ton second cas tu écris "maxToSave" fois une zone "worker" d'une taille de "t" octets, Alors que dans ton premier cas tu tentes d'écrire une fois une zone "worker" sensée être d'une taille "t * maxToSave" octets.
    Si "worker" est la même dans les deux cas, alors le premier ne peut pas fonctionner...

    Voici comment tu aurais pu faire pour le premier cas
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct {
        ...
        ...
        ...
    } t_worker;
     
    t_worker Worker[10];
    ... (remplissage Worker[0], Worker[1] ... Worker[9])...
    fwrite(Worker, sizeof(t_worker), 10, fichier)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 384
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Dit autrement, dans ton second cas tu écris "maxToSave" fois une zone "worker" d'une taille de "t" octets, Alors que dans ton premier cas tu tentes d'écrire une fois une zone "worker" sensée être d'une taille "t * maxToSave" octets.
    Si "worker" est la même dans les deux cas, alors le premier ne peut pas fonctionner...

    Voici comment tu aurais pu faire pour le premier cas
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct {
        ...
        ...
        ...
    } t_worker;
     
    t_worker Worker[10];
    ... (remplissage Worker[0], Worker[1] ... Worker[9])...
    fwrite(Worker, sizeof(t_worker), 10, fichier)
    Cv merci donc si je comprend bien les 2 méthodes sont
    1re méthode
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(cpt = 0; cpt < MaxToSave; cpt++){
    	strcpy(Worker[cpt].NumRegistre, "-1");
    	strcpy(Worker[cpt].nom, "-1");
    }
    fwrite(&Worker, sizeof(Worker), MaxToSave, fichier);
    2e méthode
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    strcpy(Worker.NumRegistre, "-1");
    strcpy(Worker.nom, "-1");
    for(cpt = 0; cpt < MaxToSave; cpt++){
    	fwrite(&Worker, sizeof(Worker), 1, fichier);
    est-ce bien ça?


    Citation Envoyé par Matt_Houston Voir le message
    fwrite (clic !) attend en premier paramètre l'adresse d'une zone mémoire d'une taille au moins égale à size * count. Si ce n'est pas le cas, le déréférencement du contenu du buffer au-delà de ses limites va produire un comportement indéterminé.

    Nous ne savons pas comment est déclarée ta variable Worker, mais son adresse doit donc correspondre au début d'une zone d'au moins sizeof(Worker) * MaxToSave octets.
    Matt_Houston je ne suis pas sur d'avoir compris ce que tu disais
    Mais J'avais utilisé ce site

    qui me retournais ceci pour la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
    j'avais du coup compris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite(le pointeur de l'élément à copier, la taille de l'élément, le nombre de fois que l'on veut recopier cet élément, le pointeur du fichier)
    mais visiblement c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite(pElem, TailleElem, pElem + TailleElem * nbr de fois à répéter le déplacement ds la mémoire, le pointeur du fichier)
    Merci à vous deux pour l'aide

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Sparky95 Voir le message
    Cv merci donc si je comprend bien les 2 méthodes sont
    1re méthode
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(cpt = 0; cpt < MaxToSave; cpt++){
    	strcpy(Worker[cpt].NumRegistre, "-1");
    	strcpy(Worker[cpt].nom, "-1");
    }
    fwrite(&Worker, sizeof(Worker), MaxToSave, fichier);
    2e méthode
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    strcpy(Worker.NumRegistre, "-1");
    strcpy(Worker.nom, "-1");
    for(cpt = 0; cpt < MaxToSave; cpt++){
    	fwrite(&Worker, sizeof(Worker), 1, fichier);
    est-ce bien ça?
    A priori oui. Avec toutefois trois bémols
    1. NumRegistre porte un nom généralement attribués à des entiers mais tu l'utilises comme si c'était une chaine (mais ça on ne peut pas dire si c'est bon ou pas vu qu'on ne voit pas le détail de ta structure)
    2. Dans le premier cas, Worker étant un tableau, son nom est déjà une adresse => pas de "&" quand tu le passes à fwrite.
    3. toujours dans le premier cas, le second paramètre est la taille d'un élément. Or sizeof(worker) pourrait être vu comme la taille de tout le tableau (ce qui ne convient pas) mais correspond en réalité à la taille de l'adresse de son premier élément (ce qui ne convient pas non plus). C'est pas pour rien si j'ai défini un type dans mon exemple => pour pouvoir récupérer sa taille


    Citation Envoyé par Sparky95 Voir le message
    j'avais du coup compris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite(le pointeur de l'élément à copier, la taille de l'élément, le nombre de fois que l'on veut recopier cet élément, le pointeur du fichier)
    Oui, on avait bien compris que tu le voyais comme ça. Mais une telle implémentation limiterait un peu l'utilité de fwrite non ? Qui a besoin d'écrire n fois la même chose dans un fichier ??? Et si ça arrive (sait-on jamais) ben il reste toujours la boucle...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    Pourquoi écrire X fois le même élément et non pas le nombre d'éléments (X), suivi de l'élément lui-même ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Couche de redondance anti-corruption..

    Citation Envoyé par Sparky95 Voir le message
    Matt_Houston je ne suis pas sur d'avoir compris ce que tu disais .
    S'il s'agit de termes comme « déréférencement » ou « comportement indéterminé », tu en trouveras la définition à la suite d'une rapide recherche. Sinon je peux aussi éclaircir tout ou partie de mon propos, si Svear n'a pas déjà répondu à tes questionnements.

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    Couche de redondance anti-corruption..
    Mouais. Mais en cas de différence, à quel item donner la préférence ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 384
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    A priori oui. Avec toutefois trois bémols
    1. NumRegistre porte un nom généralement attribués à des entiers mais tu l'utilises comme si c'était une chaine (mais ça on ne peut pas dire si c'est bon ou pas vu qu'on ne voit pas le détail de ta structure)
    2. Dans le premier cas, Worker étant un tableau, son nom est déjà une adresse => pas de "&" quand tu le passes à fwrite.
    3. toujours dans le premier cas, le second paramètre est la taille d'un élément. Or sizeof(worker) pourrait être vu comme la taille de tout le tableau (ce qui ne convient pas) mais correspond en réalité à la taille de l'adresse de son premier élément (ce qui ne convient pas non plus). C'est pas pour rien si j'ai défini un type dans mon exemple => pour pouvoir récupérer sa taille



    Oui, on avait bien compris que tu le voyais comme ça. Mais une telle implémentation limiterait un peu l'utilité de fwrite non ? Qui a besoin d'écrire n fois la même chose dans un fichier ??? Et si ça arrive (sait-on jamais) ben il reste toujours la boucle...
    Oui effectivement j'ai été un peu rapide
    en fait j'ai un struct ouvrier Workers[MAXSIZE] dans mon main qui me sert d'index.
    Et dans une fonction je fais un bidonnage d'un fichier ou j’insère une structure ouvrier et je l'écris MAXSIZE fois dans le fichier.
    Voila la confusion du à mon manque d'explications et mes question peut détaillés XD


    ici lors du bidonnage du fichier je crée une struct ouvrier worker pour pouvoir bidonner le fichier donc ici il ne s'agit pas d'un tableau
    la première méthode était juste un exemple pour comprendre ici pourquoi les paramètres que j'avais rentrés dans mon fwrite étaient incorrectes

    Concernant le NumRegistre je l'ai transformé en tableau car il fallait 12 chiffres pour former le NumRegistre il aurait fallut un long long mais le compilateur codeblocks n'admets pas les longlong de base :/
    il faut changer certains paramètres pour faire valider cela.
    Vu que le code est ensuit executé sur un ordinateur de l'école j'avais pas le courage de m'amuser en live à paramettrer cela en sachant que je n'aurais évidemment pas acces à la machine avant la présentantion du dossier

    Je sais qu'il n'est pas très bon de mettre worker[cpt] (dans la fonction) mais je trouve cela plus lisible que *(worker + cpt)

    Petite question en voyant ton point 3 comment puis-je faire un sizeof(struct abcd.def)?
    Car dans ma fonction cela ne va pas je dois faire ceci pour que ca fonctionnes
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct abcd a
    sizeof(a.def);
    et la il n'y à plus de probleme

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Sparky95 Voir le message
    en fait j'ai un struct ouvrier Workers[MAXSIZE] dans mon main qui me sert d'index.
    Dans ce cas, sizeof(struct ouvrier) te donnera la taille d'une structure et write(Worker, sizeof(struct ouvrier), n, fichier) écrira n "struct ouvrier" dans le fichier à partir de worker.

    Citation Envoyé par Sparky95 Voir le message
    ici lors du bidonnage du fichier je crée une struct ouvrier worker pour pouvoir bidonner le fichier donc ici il ne s'agit pas d'un tableau
    Alors si tu veux l'écrire "n" fois, te faut réellement l'écrire n fois (boucle) car fwrite ne le fera pas à ta place.

    Citation Envoyé par Sparky95 Voir le message
    Je sais qu'il n'est pas très bon de mettre worker[cpt] (dans la fonction) mais je trouve cela plus lisible que *(worker + cpt)
    Où as tu révé que c'est pas très bon ??? Non seulement c'est plus lisible mais en plus c'est (au niveau compilation) exactement pareil.

    Je pense que tu fais une petite confusion avec ceci
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int tab[10];
    int i;
    for (i=0; i < 10; i++) tab[i]=0;
    qu'il sera préférable d'écrire ainsi
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int tab[10];
    int i;
    int *pt
    for (i=0, pt=tab; i < 10; i++, pt++) *pt=0;
    Dans la première écriture, tab[i] provoque une indirection (partir de "tab" et se décaler de "i" entiers) qui n'existe pas dans la seconde écriture ("pt" étant toujours à la bonne position). Mais remplacer worker[cpt] (qui provoquera une indirection) par *(worker + cpt) (où c'est toi qui calcule l'indirection) ben c'est pareil...

    Citation Envoyé par Sparky95 Voir le message
    Petite question en voyant ton point 3 comment puis-je faire un sizeof(struct abcd.def)?
    Car dans ma fonction cela ne va pas je dois faire ceci pour que ca fonctionnes
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct abcd a
    sizeof(a.def);
    et la il n'y à plus de probleme
    Si "def" est un tableau, alors pas de souci, tu obtiens bien la taille mémoire utilisée par le tableau. Mais si c'est un pointeur, alors tu n'obtiens que la taille du pointeur et là c'est moins bon.
    Mais dans les deux cas, tu dois avoir quelque part la longueur donnée à "def". Soit via un #define, soit via un calcul (si tu l'as alloué manuellement). Tu peux donc toujours récupérer la taille en demandant un n * sizeof(type de def).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Je pense que tu fais une petite confusion avec ceci
    qu'il sera préférable d'écrire ainsi
    Je ne te suis plus là, les deux écritures sont parfaitement équivalentes. J'utilise en général la seconde lorsque le nombre d'itérations n'est pas déterminé au moment où l'on entre dans la boucle (traitement de chaînes, par exemple).

  12. #12
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 384
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Où as tu révé que c'est pas très bon ??? Non seulement c'est plus lisible mais en plus c'est (au niveau compilation) exactement pareil.c].
    Scolairement on nous interdis d'utiliser la méthode '[ ]' car cela "pourrait" porter à confusion avec les tableaux

    Citation Envoyé par Sve@r Voir le message
    Si "def" est un tableau, alors pas de souci, tu obtiens bien la taille mémoire utilisée par le tableau. Mais si c'est un pointeur, alors tu n'obtiens que la taille du pointeur et là c'est moins bon.
    Mais dans les deux cas, tu dois avoir quelque part la longueur donnée à "def". Soit via un #define, soit via un calcul (si tu l'as alloué manuellement). Tu peux donc toujours récupérer la taille en demandant un n * sizeof(type de def).
    def représente une bete variable
    ex.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fonct(){
    ...
    fread((Index + cpt)->NumRegistre, sizeof(struct ouvrier.NumRegistre), 1, fichier);//méthode ne fonctionnant pas
    //fread((Index + cpt)->NumRegistre, sizeof(Index->NumRegistre), 1, fichier);//méthode fonctionelle
    ...
    }
    les 2 lignes sont identiques la différence est que lorce que j'essaye de récupérer la taille directement depuis la structure cela ne fonctionne pas
    Je peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fread((Index + cpt)->NumRegistre, sizeof(struct ouvrier), 1, fichier);
    il me retournes bien la taille mais pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fread((Index + cpt)->NumRegistre, sizeof(struct ouvrier.NumRegistre), 1, fichier);
    ou même struct ouvrier.codePostal// ne fonctionnes pas
    (NumRegistre est un tableau CodePostal un int)

    voici l'erreur qu'il me retournes
    main.c|244|error: expected ')' before '.' token|

    autre méthode pour que cela fonctionnes
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    struct ouvrier abcd;
    fread((Index + cpt)->NumRegistre, sizeof(abcd.NumRegistre), 1, fichier);

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Sparky95 Voir le message
    Scolairement on nous interdis d'utiliser la méthode '[ ]' car cela "pourrait" porter à confusion avec les tableaux
    Parce que Workers[MAXSIZE] n'est pas un tableau ..?


    @Matt_Houston> Je suppose qu'il s'agit d'une micro-optimisation. Avec l'opérateur [] ou le déréférencement depuis le premier élément (*(start + i)), tu as un décallage de pointeur, qui se fera à chaque itération. Alors qu'en déplaçant toi-même le pointeur dans la boucle, tu n'a qu'un déréférencement immédiat, et non un décallage, donc théoriquement c'est plus rapide (d'un petit nombre de cycles processeur).
    Dans les faits, aucune idée si le compilateur est capable ou non d'optimiser ça ni de quelle manière il le fait, ni de l'impact réel (qui pourrait varier selon la taille du tableau).
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  14. #14
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    On cause bien d'une addition supplémentaire dans le corps de la boucle là ?

    Bousk.. Toi qui est adepte du C++, un langage qui repose sur la compilation optimisée (je veux dire que la raison d'être du truc s'écroule sans ça), je m'étonne du peu de foi que tu accordes à ton outil principal. Si ton compilo est postérieur à 1983, qu'il ne produit pas le même code machine dans un cas et dans l'autre et que tu as moyen de prouver qu'il en résulte un impact négatif sur les performances, tu es en droit de mettre un bourre-pif à l'auteur.

    On n'est plus au temps des Duff's device et des modulo avec &. Écrivez le code le plus clair pour le contexte donné, ou alors faites de l'assembleur !

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    - ça n'est pas moins lisible ni moins clair
    - le compilo est un outil et il ne faut pas lui faire confiance aveuglément; comme tout outil il est perfectible et peut être défaillant
    - le code produit peut être différent entre une version debug ou release, et masquer/entraîner un problème dans un cas et non l'autre
    - si tu peux écrire un truc optimisé en debug et release, qui n'est pas moins clair (cf point 1), sans compter sur le compilateur qui le fera à ta place qu'en release, pourquoi s'en prier ? et toute l'équipe qui utilise l'exe debug te remerciera
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  16. #16
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Mm'okay..



    Je pourrais encore dire que j'étais là inb4 la séance de trolling du forum C , pardon : « assembleur de haut niveau ». Moi j'ai à faire mais je vous laisse disserter (sambia devrait pas tarder !).

  17. #17
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 384
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Parce que Workers[MAXSIZE] n'est pas un tableau ..?


    @Matt_Houston> Je suppose qu'il s'agit d'une micro-optimisation. Avec l'opérateur [] ou le déréférencement depuis le premier élément (*(start + i)), tu as un décallage de pointeur, qui se fera à chaque itération. Alors qu'en déplaçant toi-même le pointeur dans la boucle, tu n'a qu'un déréférencement immédiat, et non un décallage, donc théoriquement c'est plus rapide (d'un petit nombre de cycles processeur).
    Dans les faits, aucune idée si le compilateur est capable ou non d'optimiser ça ni de quelle manière il le fait, ni de l'impact réel (qui pourrait varier selon la taille du tableau).
    Slt
    Sisi mais dans le cas dont je parlais avec les &
    Citation Envoyé par Sparky95 Voir le message
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(cpt = 0; cpt < MaxToSave; cpt++){
    	strcpy(Worker[cpt].NumRegistre, "-1");
    	strcpy(Worker[cpt].nom, "-1");
    }
    fwrite(&Worker, sizeof(Worker), MaxToSave, fichier);
    etant donnée que j'aurais utilisé cela dans une fonction cela représentais le pointeur du tableau.
    C'étais une idée d'exemple rapide et du coup mal détaillé :/

  18. #18
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 384
    Par défaut
    Citation Envoyé par Sparky95 Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fonct(){
    ...
    fread((Index + cpt)->NumRegistre, sizeof(struct ouvrier.NumRegistre), 1, fichier);//méthode ne fonctionnant pas
    //fread((Index + cpt)->NumRegistre, sizeof(Index->NumRegistre), 1, fichier);//méthode fonctionelle
    ...
    }
    une idée au fait de pourquoi je ne peux pas faire de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sizeof(stuct ouvrier.NumRegistre)

    je viens de test en faisant un printf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%d", sizeof(struct ouvrier.NumRegistre));
    main.c|245|error: expected ')' before '.' token|
    Même erreur

  19. #19
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Tu ne peux pas référencer le membre simplement avec le nom du type.

    Si tu ne veux pas créer d'instance pour y accéder (struct ouvrier dummy; ... sizeof dummy.NumRegistre ...), tu peux cast une adresse nulle puis la « déréférencer » en paramètre de sizeof (le déréférencement n'est en réalité jamais réalisé) : sizeof ((struct ouvrier *)NULL)->NumRegistre .

    Ou encore sous forme de macro :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #define sizeof_memb_(type, memb) (sizeof ((type *)NULL)->memb)
    #define sizeof_memb(type, memb) sizeof_memb_(type, memb)
     
    ...
     
    printf("ouvrier.NumRegistre occupies %zu bytes\n", sizeof_memb(struct ouvrier, NumRegistre));

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

Discussions similaires

  1. Questions sur fwrite
    Par Freakazoid dans le forum C++
    Réponses: 6
    Dernier message: 16/08/2004, 20h21
  2. Quelques questions sur le TWebBrowser...
    Par CorO dans le forum Web & réseau
    Réponses: 3
    Dernier message: 17/01/2003, 21h23
  3. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  4. Réponses: 2
    Dernier message: 11/08/2002, 21h27
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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