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++Builder Discussion :

limitation fonction memmove


Sujet :

C++Builder

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 39
    Par défaut limitation fonction memmove
    Bonjour,

    je rencontre un petit souci avec la fonction memmove.
    j'ai créé deux structures de type:
    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
     
    typedef struct {
           double date;
           float IBrut;
           float IFiltre;
           float ICapt;
           float TBrut;
        //   float TMicro;
     
    }TAB_VAL_VRAI;
     
     
    typedef struct {
           TAB_VAL_VRAI acquisitionMicro[nbrevaleurtabenregistreaqui];
           TAB_VAL_SIMUL simulation[nbrevaleurtabenregistreaqui];
     
    }ENREGISTREMENT;
    Mon but est de faire une LIFO donc j'utilise la fonction memmove :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     memmove(&enregistrement.acquisitionMicro[0],&enregistrement.acquisitionMicro[1],sizeof (enregistrement.acquisitionMicro)-sizeof(enregistrement.acquisitionMicro[0]));//shifftage du tableau I
    Mon probleme est que le code tel qu'il est au dessus marche sans souci le shiftage est bon
    mais si je rajoute une variable dans la declaration de ma structure TAB_VAL_VRAI (exemple celle en commentaire)
    la fonction ne marche plus.
    la valeur enregistremet.acquisitionMicro[nbrevaleurtabenregistreaqui-1] est juste et toutes les autres passent à zéro pendant le memmove.

    Pourquoi????? limitation de la fonction????

    Merci d'avance

  2. #2
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Salut, pour travailler avec des tableaux de structure ou de classe j'utilise la librairie STL, c'est déjà installer avec BCB, pas besoin de rien télécharger. Si tu veux en savoir plus tu peux consulter le site suivant: http://www.msoe.edu/eecs/ce/courseinfo/stl

    PS: désolé de ne pas avoir répondu à ta question

  3. #3
    Membre éprouvé
    Inscrit en
    Mars 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 105
    Par défaut
    Bonjour,

    si j'ai bien compris, le but est de décaler les derniers éléments au début du tableau. Je propose cela :
    memmove(&enregistrement.acquisitionMicro[0],&enregistrement.acquisitionMicro[1],(nbrevaleurtabenregistreaqui-1)*sizeof(TAB_VAL_VRAI));
    On décale (n-1) éléments de taille (taille d'un élément du tableau).

    Désolé, je n'ai pas pu le tester, mais l'idée est là...

    Nicolas

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    D'une manière radicalement plus simple, en utilisant un index circulaire, dans le genre :

    Nombre d'objets dans le tableau
    Index d'un objet quelconque dans le tableau
    Décalage sur le suivant avec rotation (dernier+1 -> premier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Index = (Index+1) % NbElements;
    Ca évite toute recopie de blocs de mémoire (ce que tu fais) et tout rajout de classe pour superviser des objets chaînés (sans doute d'une manière circulaire)

    Si on utilise un nombre d'éléments 2^^, il suffit de remplacer le modulo par un masque :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int NbElements = 8; // 2^^3
    int Mask = 8-1; //pour montrer le calcul du masque
    Index = (Index+1) & Mask; //plus rapide sans doute que modulo
    Vérifier quand même si cette solution est applicable dans ton cas !

    A plus !

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 39
    Par défaut
    bonjour,

    le prob n'est pas
    il se situe a la declaration des variables dans la structure
    si j'en ai cinq memmove marche
    si j'en rajoute un sixieme memmove ne marche plus
    moi pas comprendre pourquoi

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Si tu as envie de copier des blocs mémoire, chez moi ça fonctionne très bien avec MoveMemory (plus ou moins rapide que memmove ? mais sans renvoyer dest qui de toute façon est connu... [0]) mais pour le calcul du nombre de bytes je fais :

    taille d'un objet * nombre d'objets à déplacer donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sizeof(TAB_VAL_VRAI) * (nbrevaleurtabenregistreaqui-1)
    Reste à savoir ce que signifie "rajouter un sixième"...

    A plus !

Discussions similaires

  1. [XL-2010] Limite fonction SI
    Par DYV007 dans le forum Excel
    Réponses: 3
    Dernier message: 16/03/2015, 11h34
  2. Limitation Fonction Rename()
    Par gelwc dans le forum Langage
    Réponses: 2
    Dernier message: 15/10/2010, 08h51
  3. Ma fonction memmove
    Par black_hole dans le forum Débuter
    Réponses: 18
    Dernier message: 01/06/2008, 17h15
  4. Limiter fonctions system et exec
    Par Toufinet dans le forum Apache
    Réponses: 2
    Dernier message: 18/07/2006, 19h41
  5. fonction sql "LIMIT" en interbase?
    Par GMI dans le forum InterBase
    Réponses: 6
    Dernier message: 20/09/2004, 14h04

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