10
votes

Déclaration variable après la liste des arguments de la fonction

Je suis tombé sur un code C, où les variables semblent être déclarées après la liste des arguments d'une fonction. Je ne savais pas que c'était possible.

dans le code, int r code> et int * a code> est déclaré juste après la liste des arguments de arrated code>. Comment cela affecte-t-il les variables locales A code> et r code> de arra2int code>? P>

La raison même pour laquelle je veux comprendre le code est parce que si je le laissais exécuter sur mon fichier Linux x86 a [1] = 1 code> au // marqueur Code> Lorsque arra2int code> est appelé l'heure du poing. p>

mais si je le laisse exécuter OMAP4 Dev Board A [1] = 0 code> et je ne sais pas pourquoi il y a une différence. P>

Quelqu'un pourrait-il commenter cela s'il vous plaît? p>

void generateEncodingTable(){
    register int i,j;
    long temp;
    int seed = 133757;

    printf("\n[I] - Generating Encoding Table\n");
    for (pattern = 0; pattern < 4096; pattern++) {
        temp = pattern << 11;          /* multiply information by X^{11} */
        encoding_table[pattern] = temp + get_syndrome(temp);/* add redundancy */
    }

    decoding_table[0] = 0;
    decoding_table[1] = 1;
    temp = 1; 
    for (i=2; i<= 23; i++) {
        temp *= 2;
        decoding_table[get_syndrome(temp)] = temp;
    }

    a[1] = 1; a[2] = 2;

    temp = arr2int(a,2);
    decoding_table[get_syndrome(temp)] = temp;
    for (i=1; i<253; i++) {
        nextcomb(23,2,a);
        temp = arr2int(a,2);
    decoding_table[get_syndrome(temp)] = temp;
    }

    a[1] = 1; a[2] = 2; a[3] = 3;
    temp = arr2int(a,3);
    decoding_table[get_syndrome(temp)] = temp;
    for (i=1; i<1771; i++) {
        nextcomb(23,3,a);
        temp = arr2int(a,3);
        decoding_table[get_syndrome(temp)] = temp;
    }
}


4 commentaires

Quelle est la déclaration de A tel qu'utilisé dans generateencodingtable () ?


A est déclaré globalement juste après #include des déclarations comme: int A [4];


Peut-être que la commande compte?


Eh bien, j'utilise exactement le même code (1: 1) pour être exécuté sur X86 et sur la plate-forme de bras et donne des résultats différents.


5 Réponses :


2
votes

Ceci est une ancienne syntaxe C. Si votre compilateur peut l'avaler, il devrait fonctionner comme si vous avez déclaré les fonctions la voie normale, ANSI.


0 commentaires


6
votes

C'est une vieille notation connue sous le nom de K & R (Kernighan & Ritchie, après la notation Brian Kernighan et Dennis Ritchie) pour déclarer les fonctions. Si votre compilateur prend en charge, vous pouvez l'utiliser et il est identique à la déclaration de la fonction avec la notation ANSI.


4 commentaires

Alors quelle est la transaction avec int r; int * a; ? Où dois-je les mettre pour former une version syntaxique «plus récente» du code? OK j'ai compris.


int r; INT * A; signifie simplement que le paramètre r est de type int et paramètre a est de type int * < / code> (pointeur sur un entier).


Il est encore une syntaxe valide à partir de la norme 2011; Je ne veux pas briser arbitrairement tout ce code de la fin de la fin des années 70 / tôt-80S qui est toujours actif là-bas.


S'il n'est pas trop tard, pour répondre à @Richardlaurant, il suffit de réécrire Long Arr2int (A, R) Int R; INT * A; (K & R) à Long Arr2int (int * a, int R) (ANSI)



5
votes

Comme mention par d'autres, il s'agit d'un style précoce de codage de la fonction.

Suivant est un piège de ce style. Sachez qu'il n'y a pas de type Vérification des paramètres transcédés. strong> il peut em> expliquer vos différences de temps d'exécution. P>

Dites que vous avez déclarer em> fonction p>

int d,e,f;
d = foo(1,2L,3);
e = foo((short)1,2L,3);
f = foo(1,2,3);


0 commentaires

0
votes

C'est juste un moyen de déclarer des types de paramètres de fonction: xxx

est égal à xxx


1 commentaires

Pas vraiment égal comme mentionné dans d'autres réponses.