1
votes

Le paramètre de modèle C ++ sizeof renvoie un résultat incorrect

De cette façon, je peux trouver le nombre d'éléments dans un tableau. Cependant, lorsque je mets ce tableau int comme modèle en tant que paramètre, le résultat n'est pas calculé correctement

class TradeList
{
    public:
            int      PosTicket  ;
            strinh   Pairs      ;
            double   OpenPrice  ;
            double   StopLoss   ;
            double   TakeProfit ;
}

J'ajoute un tableau INT à la liste en tant que paramètre avec le modèle de type.

 list<TradeList> 

Et l'autre modèle et méthode créé pour imprimer ce contenu de liste

int main() 
{
    int mlArray[] = { 1,2,3,4,5};
    
    list<int>   MasterListe ;
    MasterListe = addList(MasterListe, mlArray);
    cout << "MasterListe SizeOf :    " << MasterListe.size() << endl;
    print(MasterListe, "MasterList      : ");
    return 0;
}

template    <typename T>
void print(T& t, string name)
{
    typename T::iterator i = t.begin();
    cout << name << "\tMembers  ==>>>   ";
    while (i != t.end())
    {
        if (i == t.begin())
        {
            cout << *i++;
        }
        else
        {
            cout << " - " << *i++;
        }
    }
    cout << endl;
}

Nombre total d'octets: 8 BytePerUnit: 4 arrSize: 2

MasterListe SizeOf: 2
MasterList: Membres == >>> 1 - 2

Le tableau est rempli de nombres 1, 2, 3, 4, 5, bien que 5 unités soient passées, la valeur de retour est 1 et 2.

Je peux également créer la liste que j'utilise actuellement dans le type INT à partir de la classe ci-dessous.

template <typename listType, typename arrayX>
 listType  addList(listType e , arrayX array)
{
     int        sizeOf = sizeof(array);
     int        sizeOfperOne = sizeof(array[0]);
     int        arrSize =  sizeOf   /   sizeOfperOne        ;
     cout << "Total Byte :  " << sizeOf << "     BytePerUnit : " << sizeOfperOne << " arrSize : " << arrSize<< endl;
     for (int i = 0; i <  arrSize; i++)
    {
        e.push_back(array[i]);
    }
    return e;
}

int arr[] = {1,2,3,4,5};
int size_arr  =  sizeof(arr) / sizeof(arr[0]);

Croyez-moi, je n'ai pas trouvé de solution à cela grâce à mes recherches.

Je vous remercie beaucoup pour votre aide.


13 commentaires

Les tableaux se désintègrent en pointeurs lorsqu'ils sont passés comme ça. Tout ce que vous avez là dans addList est un int * , pas un tableau d' int .


@TedLyngmo Le code affiché semble en fait assez reproductible.


@PaulMcKenzie Est-il possible d'écrire un échantillon? Je ne veux pas me tromper à cause de la traduction anglaise.


@ cigien C'est bien. Je ne l'ai pas vu.


int mlArray [] = {1,2,3,4,5}; int * ptrArray = mlArray; list <int> MasterListe; MasterListe = addList (MasterListe, ptrArray);


C'est comme ça que je l'ai fait, mais cela ne s'est pas reproduit. listType addList (listType e, const arrayX * tableau)


Il n'est pas étrange de poser à nouveau une question.


Pourquoi avez-vous besoin d'une addList lorsqu'il existe un moyen générique d'ajouter des éléments à un conteneur? std::copy(ptrArray, ptrArray + sizeof(ptrArray) / sizeof(ptrArray[0]), std::inserter(MasterListe, MasterListe.end())); .


@PaulMcKenzie L'échantillon que vous avez écrit a eu le même résultat. Je ne reçois que 1 et 2 sorties. Pourquoi ai-je besoin de ça? J'ai besoin de mettre à jour une liste de transactions Forex en 5 minutes. Je n'ai pas pensé à une solution différente.


Cela devrait être: std::copy_n(mlArray, std::size(mlArray), std::inserter(MasterListe, MasterListe.end())); - Il n'y a pas besoin d'une fonction étrangère telle que addList ou un pointeur ptrArray .


Ce code que vous avez écrit fonctionne. Pouvez-vous l'utiliser comme List <TradeList>? Merci beaucoup pour votre réponse.


Mettez à jour votre message d'origine afin que nous TradeList ce qu'est TradeList . De plus, C ++ est sensible à la casse - voulez-vous vraiment dire std::list<TradeList> ?


@PaulMcKenzie ok, mis à jour maintenant.


3 Réponses :


0
votes

Je ne pense pas que ce soit une perte de temps. Gérez les opérations supplémentaires dans la méthode Main.

int main() 
{
    int mlArray[] = { 1,2,3,4,5,6,7,8,9};

    list<int> SecondList;
 
    ThirdList=  InsertList(SecondList, mlArray, size(mlArray));
    print(SecondList, "SecondList : ");

    return 0;
}

Méthode principale

 template <typename listType, typename arrayX>
 listType  InsertList(listType e, arrayX array, int size)
 {

     for (int i = 0; i < size; i++)
     {
         e.push_back(array[i]);
     }
     return e;
 }


0 commentaires

2
votes

Le tableau se désintègre en pointeurs, si vous avez besoin de la taille du tableau dans la fonction de modèle, vous pouvez changer votre fonction ci-dessous.

template <typename listType, std::size_t N, typename arrayX>
listType  addList(listType e , arrayX (&array)[N] )
{
     int        sizeOf = sizeof(array);
     int        sizeOfperOne = sizeof(array[0]);
     int        arrSize =  N;
     cout << "Total Byte : " << sizeOf
          << "     BytePerUnit : " << sizeOfperOne
          << " arrSize : " << arrSize
          << endl;
     for (int i = 0; i <  N; i++)
    {
        e.push_back(array[i]);
    }
    return e;
}


0 commentaires

2
votes

Le principal problème est que les tableaux se désintègrent en pointeurs, donc les valeurs de sizeof() dans votre fonction de modèle addList tente en fait d'obtenir sizeof(int *) .

Si tout ce que addList fait est d'ajouter des éléments à la std::list , il existe des moyens génériques de le faire sans avoir besoin de créer une autre fonction.

Une façon est d'utiliser std :: copy_n :

5

Production:

#include <iostream>
#include <list>
#include <algorithm>
#include <iterator>
#include <string>

class TradeList
{
    public:
        int      PosTicket  ;
        std::string   Pairs      ;
        double   OpenPrice  ;
        double   StopLoss   ;
        double   TakeProfit ;
};

int main()
{
    TradeList mlArray[5];
    std::list<TradeList>   MasterListe;
    std::copy_n(mlArray, std::size(mlArray), std::inserter(MasterListe, MasterListe.end()));
    std::cout << MasterListe.size();
}


1 commentaires

Selon vous, qu'est-ce qui a le plus de sens en termes de performances?