2017-07-19 1 views
0

La pièce suivante de code fonctionne en C++ lors de l'exécution sous Windows:C++ passage nombre variable d'emplacements d'un tableau donné à une fonction

void* paramsList[MAX_PARAMS_NUM] = { 0 }; 

...some code to populate paramsList (p.s MAX_PARAMS_NUM is a constant) 

vsnprintf((char*)pStr, MAXLEN, (char*)pTempFormat, (va_list)paramsList); 

Ce code fonctionne très bien sur Windows, mais je suis en train de le faire fonctionne sous Linux et le programme est écrasé car cette conversion de paramsList en va_list ne fonctionne pas.

Maintenant, le scénario de ce scénario est que j'obtiens une chaîne de format d'un serveur que je ne contrôle pas. La chaîne de format ('pTempFormat') est comme celle utilisée dans printf du nombre inconnu de% (maximum: MAX_PARAMS_NUM) et je remplis le paramsList en conséquence, puis j'utilise vsnprintf pour créer une chaîne à partir de la chaîne de format que j'ai et les valeurs renseignées dans paramsList (ces valeurs peuvent être des entiers, des hexadécimaux à char * (chaines de caractères) et n'importe quelle combinaison d'entre elles, selon la chaîne de format reçue du serveur).

Je ne sais pas combien d'emplacements paramsList passer à vsnprintf jusqu'à ce que je finis de le remplir en fonction de la chaîne de format reçue du serveur. Donc, je dois en quelque sorte soit passer un nombre variable d'emplacements de paramsList à vsnprintf ou de convertir ces emplacements en va_list (que je ne pouvais pas comprendre comment faire à partir de ce que je lis en ligne). J'ai également envisagé d'utiliser une combinaison de modèles variadiques et va_list - pour passer en quelque sorte un nombre variable d'emplacements de paramsList à une fonction variadique et de les transmettre à vsnprintf. Mais je ne pouvais pas non plus comprendre comment passer certains emplacements d'un tableau donné à une fonction variadique non plus.

Mise à jour:

J'utilise Visual Studio 2015 pour compiler sous Windows et GCC 4.9 sur Ubuntu.

L'erreur que je reçois lorsque vous essayez de compiler ce code sous Linux est: error: ISO C++ forbids casting to an array type 'va_list {aka __va_list_tag [1]}'

+0

Pouvez-vous inclure le message d'erreur réel que vous obtenez? Il sera également très difficile de vous aider avec le petit code que nous pouvons voir. – Eddge

+1

* Ce code fonctionne bien sous Windows * - Il peut fonctionner "bien" sur un certain compilateur qui crée des programmes Windows. Cela peut ne pas fonctionner si vous utilisez un autre compilateur ou une autre version du même compilateur. – PaulMcKenzie

+0

Juste pour faire suite à ce que PaulMcKenzie a dit, pouvez-vous également inclure les compilateurs que vous utilisez? Donc, sur Windows et Linux, qu'est-ce que vous utilisez pour compiler votre code? – Eddge

Répondre

1

va_list est un type non spécifié . Cela signifie que ce peut être un void* [] ou quelque chose d'autre entièrement. Cela a fonctionné par hasard dans certains cas, c'est que va_list est compatible avec void* [] sur une plate-forme particulière pour un compilateur, ce n'est en aucun cas une indication que cela soit légal. La façon correcte de gérer cela est malheureusement d'arrêter d'utiliser la famille printf et d'analyser la chaîne de formatage vous-même, il n'y a pas de fonctionnalité standard pour atteindre et récupérer la chaîne de format analysée à utiliser pour vous-même.