2017-09-21 12 views
3

私はフォーラムを見てきましたが、私の状況に当てはまるこの質問に対する回答は見つかりませんでした。私はシステムコールを 'sort'(unix)を使って呼び出そうとしていますが、 "ラベルはステートメントの一部だけで宣言はステートメントではありません"というエラーが表示されます。エラーを引き起こすコードは次のとおりです。ラベルはステートメントの一部としてのみ使用できますエラー

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."); 
} 

システムコールでは、単純に用語を名前で集めるために、アルファベット順にファイルをソートしようとしています。

これは私のexecvシステムコール用のコマンドが含まれているchar * constで発生するため、私は間違いがあります。このEXACT switch文は別のプログラムファイルで動作します。誰かが私が逃しているものを見つけることができる? ありがとう

+2

'sort'はシステムコールではなく、通常のプログラムです。そして宣言はブロックを持たない 'switch'ステートメントであり、とにかく非常に悪い考えです。良いC本は明らかにすることができます**なぜ**。 Sidenote:あなたが配列 'const'を作る理由は何ですか?文字列リテラルは変更しないでください。そして、あなたはそのプログラムをどこで実行しますか? [mcve]を提供してください。 – Olaf

+0

Unix特有の問題はどれですか?もしそうでなければ、無関係なタグでスパムしないでください。 – Gerhardh

+0

エラーメッセージについてあなたを引き上げるのは何ですか?それはかなり明確に書かれています。 –

答えて

5

C(C++の反対)宣言はnotステートメントです。ラベルは文の前に置くことができます。あなたはラベル

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

後にヌル文を挿入する例のために書くこともできますし、最初のケースでは、変数のスコープは、スイッチがあることを考慮してください

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

中括弧内のコードを囲むことができます一方、第2のケースでは、変数のスコープはラベルの下の内側のコードブロックです。変数には自動保存期間があります。したがって、対応するコードブロックを終了した後は生きていません。

+0

それで、ケースコロンの後ろに別のセミコロンを追加するだけのケースでした。なぜこれがVladだと私に説明できますか? – BologneseBandit

+0

@BologneseBanditセミコロンでヌルステートメントが導入されました。 –

+0

私は間違っていた、これは正しいです。毎日何か新しいことを学ぶ。 upvoteを持ってください! – Bathsheba

0

ラベルの下の変数を定義するときは、変数の範囲を指示する必要があります(中括弧を使用)。

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."); 
} 
関連する問題