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 :

Ajout de tableau à la fin d'un tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 87
    Par défaut Ajout de tableau à la fin d'un tableau
    Bonjour j'utilise memcpy() pour copier un tableau dans un autre, no probleme.

    Mais là j'ai un tableau A d'une taille égale à disons 10 fois un tableau B.
    Je veux copier 10 fois le tableau B dans A car B change de valeur. Je ne souhaite pas parcourir 10 fois mon tableau B mais faire 10 copie succesive de B vers A et au bon endroit dans A (bout à bout avec décalage de la taille de B).

    Comment dois-je procéder si cela est possible?

    Merci

  2. #2
    Membre expérimenté Avatar de Kujara
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 262
    Par défaut
    Une petite copie de B sur A, puis 9 memcpy de A[ debut + i*taille de B] vers A[ debut + (i+1) * taille de B ]

    Ca me parait jouable.

    Tiens, encore mieux, mais a tester parceque je sais pas si ça marche :

    Copie de B sur A, puis un seul memcpy de A vers A + taille de B, sur 9 * taille de B octets.

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par TobyKaos Voir le message
    Mais là j'ai un tableau A d'une taille égale à disons 10 fois un tableau B.
    Je veux copier 10 fois le tableau B dans A car B change de valeur. Je ne souhaite pas parcourir 10 fois mon tableau B mais faire 10 copie succesive de B vers A et au bon endroit dans A (bout à bout avec décalage de la taille de B).

    Comment dois-je procéder si cela est possible?
    memcpy() avec les bons offsets... Evidemment, le tableau de destination doit être suffisamment grand...

  4. #4
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Juste une question de calcul, avec quoi mettre dans memcpy.
    Bon algo.

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 87
    Par défaut
    J'ai essayé en modifiant mon l'offset du tableau de destination mais j'obtiens n'importe quoi:

    Voici mon pseudo code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Entrée: uint8* allData
    offset = 0;
    dataSize
     
     Pour toutes lignes
        Pour toutes colonnes
     
            memcpy(allData+(dataSize*offset), (uint8*)(getData(row, col)), sizeof(uint8)*dataSize);
            offset++
        Fin Pour
     Fin Pour
    getData me renvoie les données en uint8*

    J'ai essayé avec memmove et j'obtiens aussi n'importe quoi.

    Je ne renvoie pas mon allData car il est passé en parametre et donc modifier dans la fonction.

    Petite précision cela marche si je fais cela:

    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
     
     
    Entrée: 
    uint8* allData
    Struct pixel
    {
      int x,y;
      uint8[3] pixelValue;
    }
    n=0;
     
    Pour chaque Lignes
       Pour chaque colonnes
           getPixelValue(pixel)
     
          Pour chaque valeur RGB i
            allData[n] = pixel.pixelValue[i];
            n++;
         Fin pour
       Fin Pour
    Fin pour
    Cela marche bien mais est très lent car le getPixelValue fait pas mal de calculs.


    Et si je fais un mix des deux soutions en faisant un memcpy dans un tableau temporaire puis que je le parcours pour recopier chaque valeurs j'obtiens n'importe quoi.

    Il y a quelque chose qui m'échappe. Je ne vois pas quoi.

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Euh !!!

    Faudrait d'abord voir à utiliser les bons termes..

    Tu dis :

    Entrée: uint8* allData
    mais c'est dedans que tu écris.... C'est pas plutôt une sortie, ça ????

    Ensuite, quel est le format de ton fichier ?? ça ressemble un peu à du Gif, ou ppm..

    Es-tu sûr que ta fonction GetData(row,col) fais le travail ??? Je ne vois pas en quoi (vu que tu passes un pixel : row,col, et non une ligne) elle devrait être différente de GetPixel...

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 87
    Par défaut
    Merci pour ton intérêt à ma question.

    Non je ne me trompe pas de terme, je passe en entrée de ma fonction mon pointeur uint8* allData et ma fonction renvoie void car elle affecte directement mon allData. C'est comme cela que je fais avec la solution qui marche bien mais qui est lente.

    Mon format est du tif tuilé. Pour faire simple je stocke une partie de mon image dans un contener vector de vector de tuile. jai donc chargé mes tuiles disons x=10 a 20 et y= 20 a 30. dans mon contener[10][10] du coup.

    le getPixelValue va donc pour un pixel donné (x=1000, y=10000) calculer a quel tuile on doit demander la valeur RGB du pixel.
    Ceci est long en calcul.

    Donc au lieu de parcourir tous les pixels je parcours seulement les tuiles et getData me renvoie tout le buffer d'une tuile que je copie dans mon allData et au bon endroit.

    Je ne voulais pas en arriver à rentrer dans les détails mon bon.

    Si cela peut aider sur ma réflexion, merci.

Discussions similaires

  1. ajouter à la fin d'un tableau de cellules
    Par syki.mail dans le forum MATLAB
    Réponses: 3
    Dernier message: 26/01/2014, 10h15
  2. ajouter un élément à la fin d'un tableau [[],[],[]]
    Par wise_mind dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/06/2009, 16h01
  3. Réponses: 13
    Dernier message: 01/02/2006, 12h00
  4. Réponses: 4
    Dernier message: 27/10/2005, 10h09
  5. Ajout de ligne à la volée dans un tableau
    Par Folken Laëneck dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/08/2005, 11h41

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