web-dev-qa-db-fra.com

L'étiquette ne peut être utilisée que dans le cadre d'une instruction. Erreur

J'ai parcouru les forums mais je n'ai pas trouvé de réponse à cette question qui s'applique à ma situation. J'essaie de lancer un appel système pour utiliser 'sort' (unix). Toutefois, une erreur s'affiche: "une étiquette ne peut faire partie que d'une déclaration et une déclaration n'est pas une déclaration". Voici le code à l'origine de l'erreur.

int processid;  
switch(processid = fork()){                 //establishing switch statement for forking of processes.
case -1:
    perror("fork()");
    exit(EXIT_FAILURE);
    break;
case 0:
    char *const parmList[] = {"usr/bin/sort","output.txt","-o","output.txt",NULL};  //execv call to sort file for names.
    break;
default:
    sleep(1);
    printf("\nChild process has finished.");
}

Dans l'appel système, j'essaie de trier un fichier par ordre alphabétique pour simplement rassembler les termes semblables par leur nom.

Je suis tellement abasourdi que l'erreur se produit à un caractère * const contenant les commandes pour mon appel système execv. Cette instructionEXACTswitch fonctionne sur un fichier de programme différent. Quelqu'un peut-il repérer ce que je manque? Merci

7
BologneseBandit

En C (opposé à C++), les déclarations ne sont pas des instructions. Les étiquettes ne peuvent précéder que les déclarations. Vous pouvez écrire par exemple en insérant une instruction null après le libellé

case 0:
    ;
    char *const parmList[] = {"usr/bin/sort","output.txt","-o","output.txt",NULL};  //execv call to sort file for names.
    break;

Ou vous pouvez inclure le code entre accolades

case 0:
    {
    char *const parmList[] = {"usr/bin/sort","output.txt","-o","output.txt",NULL};  //execv call to sort file for names.
    break;
    }

Tenez compte du fait que dans le premier cas, la portée de la variable est l'instruction switch, tandis que dans le second cas, elle est le bloc de code interne situé sous l'étiquette. La variable a une durée de stockage automatique. Donc, il ne sera plus en vie après avoir quitté les blocs de code correspondants.

14
Vlad from Moscow

Lorsque vous définissez une variable sous une étiquette, vous devez indiquer la portée de la variable (en utilisant l'accolade).

int processid;
switch(processid = fork())
{                 //establishing switch statement for forking of processes.
    case -1:
        perror("fork()");
        exit(0);
        break;
    case 0:
    {
        char *const parmList[] = {"usr/bin/sort","output.txt","-o","output.txt",NULL};  //execv call to sort file for names.
        break;
    }
    default:
        sleep(1);
        printf("\nChild process has finished.");
}
0
Wayne Chen