J'ai un code qui les reçoit tableau binaire des valeurs 32 bits à partir d'un appareil et imprime avec vsprintf, comme ceci:Comment passer une liste variable de paramètres à vprintf de manière portable?
void print_stuff(int32_t *p, const char *format)
{
vprintf(format, (va_list)p);
}
(ceci est simplifié, il est assuré que les valeurs correspondent au format, etc. Fondamentalement, cela repose sur le fait que dans la norme x86 va_list est juste un pointeur (ou un tableau). Cela compile sans avertissements.
Maintenant, j'ai besoin de porter cela à ARM (arm-linux-gnueabihf) et x64, et il ne compile même pas. GCC 4-something pour ARM dit "erreur: conversion en type non-scalaire demandé"
Comment faire un va_list à partir d'un tableau binaire de façon portable? Ou au moins pour les archs 32 bits et 64 bits séparément - est possible sans aucune bibliothèque "interface d'appel native"? Si cela est impossible, existe-t-il une autre fonction de bibliothèque standard ou GNU adaptée à cette tâche?
Exemple de code qui appelle ceci:
#include <stdio.h>
#include <stdarg.h>
#include <stdint.h>
#ifndef __GNUC__
#error Only Linux, other platforms/compilers not needed
#endif
int main() {
uint32_t data[10];
int i;
const char *fmt = "%x %x %x %x\n";
// Simulation of reading the data
for(i = 0; i < 10, i++) data[i] = 0x100 + i;
print_stuff(data, fmt);
return 0;
}
Pourquoi voudriez-vous faire encore quelque chose que vous ne sont manifestement pas censé faire? Qui a écrit ce code à l'origine? Cette personne mérite des mots très durs! –
Parce que, chère Some Dude, dans la vraie vie il y a des choses comme les délais et ainsi de suite. Et je demande exactement comment coder cela correctement. – ddbug
Délais? Je pense que vous avez mal orthographié l'incompétence. C'est amusant de faire des choses comme ça quand on est adolescent quand on se croit si intelligent et qu'on a tout compris. Ensuite, vous rencontrez le premier problème de portabilité et arrêtez d'être intelligent. – Art