3 votes

Les éléments suivants peuvent-ils être simplifiés ou rendus plus efficaces ?

J'essaie de convertir du code d'un langage à typage dynamique en C. Veuillez m'aider. Je vous prie d'être indulgent avec moi car je n'ai pas encore d'expérience pratique du C.

J'ai une fonction de distribution qui décide de la manière de convertir son entrée en fonction des critères suivants la valeur de l'argument drapeau.

void output_dispatcher(char *str, int strlen, int flag) {
    char output[501];
    char *result;

    switch (flag) {
        /* No conversion */
        case 0:
            result = str;
            break;
        case 1:
            result = convert_type1(output, str, strlen);
            len = strlen(result);
            break;
        /* ... */
    }
    /* do something with result */
}

J'ai actuellement 5 convertisseurs de sortie différents et ils sont tous (même ceux à venir) garantis de ne produire que 300-500 caractères. les futurs) sont garantis pour ne produire que 300-500 caractères. D'après mes lectures, il préférable d'utiliser une variable de tas plutôt que d'allouer dynamiquement de l'espace sur le pile, si possible. La déclaration de la fonction ressemble à ceci

static char * convert_type1(char *out, const char *in, int inlen);

Je veux éviter le strlen dans le dispatcher, puisqu'il n'est pas nécessaire pour recalculer la taille de la sortie car les convertisseurs de sortie la connaissent lorsqu'ils construisent la sortie. De plus, puisque je passe dans un pointeur à la variable de sortie je ne devrais pas avoir besoin de renvoyer le pointeur de résultat, n'est-ce pas ? Je modifie donc comme suit, mais j'obtiens une erreur de compilation "type incompatible".

void output_dispatcher(char *str, int strlen, int flag) {
    char output[501];

    switch (flag) {
        /* No conversion */
        case 0:
            output = str;  /* ERROR: incompatible type */
            break;
        case 1:
            strlen = convert_type1(output, str, strlen);
            break;
        /* ... */
    }
    /* do something with result */
}

Cette approche peut-elle fonctionner, ou existe-t-il une meilleure méthode ?

1voto

Alnitak Points 143355

Pour éviter le recalcul, vos convertisseurs de sortie devraient avoir un prototype comme celui-ci :

static char * convert_type1(char *out, const char *in, int *len);

appelé ainsi :

result = convert_type1(output, str, &strlen);

En interne, le convertisseur de sortie devra lire le contenu du fichier pointeur contenant maintenant la longueur de la chaîne, et écraser le contenu de ce pointeur avant de retourner.

Pour ce qui est de la différence entre le tas et la pile, vous devez effectivement utiliser le tas car les variables allouées sur la pile disparaissent dès que la fonction se termine.

0voto

Will Hartung Points 57465

La ligne :

output = str;

vous pose des problèmes car, si les tableaux et les pointeurs sont similaires, ils ne sont pas identiques.

"sortie" est un tableau, pas un pointeur.

str = output;

fonctionnera, car un char ptr ressemble beaucoup à une variable de tableau.

Mais l'inverse n'est pas vrai car la variable "output" n'est pas seulement le pointeur vers le tableau, mais le tableau lui-même.

Par exemple, si vous aviez :

char output[501];
char output1[501];

et vous l'avez fait :

output1 = output;

Cela serait correct, et C copierait le contenu du tableau output dans le tableau output1.

Donc, vous êtes juste un peu confus à propos des tableaux et des ptrs.

0voto

Huang F. Lei Points 1017

Char output[501] ; output = str ; /* ERREUR : type incompatible */

\=>

strncpy(sortie, str, sizeof(sortie)) ;

Notez que vous devez vérifier si 'output' est assez grand pour contenir 'str'.

0voto

darren Points 8541

L'erreur dans ce cas est logique. output est un tampon qui contiendra les données des caractères à venir, tandis que str est un pointeur vers une autre zone de la mémoire. Vous ne voulez pas assigner l'adresse de ce que str pointe vers output, n'est-ce pas ? Si vous voulez suivre cette approche, je pense que vous devriez simplement copier les données pointées par str dans output. Mieux encore, utilisez simplement str si aucune conversion n'est nécessaire.

0voto

caf Points 114951

Le langage C ne permet pas de modifier les tableaux par affectation directe - vous devez modifier individuellement les membres du tableau. Ainsi, si vous voulez copier la chaîne de caractères pointée par str dans le tableau output vous devez utiliser :

strcpy(output, str);

ou peut-être

memcpy(output, str, strlen + 1);

(Dans les deux cas, après avoir vérifié que strlen < sizeof output ).

Notez que le fait de nommer une variable locale strlen ce qui fait de l'ombre à la fonction standard du même nom, va être plus que déroutant pour quelqu'un qui regardera votre code plus tard. Je choisirais un autre nom.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X