質問
関数の引数の1つが整数である関数があります。関数の呼び出し中に、列挙データ型をこの関数に渡します。 gccを使用してビルドした後、関数内のINTEGER変数にアクセスすると、セグメンテーションエラーが発生します。
サンプルコード:
void somefun (unsigned int nState)
{
switch (nState) // <-- Crashes on this line
{
//
// functionality here ...
//
}
}
enum {
UNDEFINED = -1,
STATE_NICE,
STATE_GREEDY
} E_STATE;
int main (int argc, char *argv [])
{
somefun (STATE_NICE);
}
解決 5
すべての回答から、コードは論理的に正しいようです。クラッシュの本当の理由を調査する必要があります。調査し、すぐに投稿します。
他のヒント
まず、enumはmain()で定義され、somefun()には存在しません。 mainの外でenumを定義する必要がありますが、これがクラッシュをどのように引き起こしているかはわかりません。
メインの外でenumを定義した後、somefunをsomefun(E_STATE nState)に定義し、再度テストする必要があります。
gccバージョン4.2.4を使用して、エラーやセグメンテーションフォールトなしで、コンピューター上でそのコードをコンパイルして実行しました(<!> amp;貼り付け)。問題はどこか他の場所にある可能性があります。
実際に実行されます:
bash $ cat bar.c
#include <stdio.h>
void somefun (unsigned int nState)
{
switch (nState) // <-- Crashes on this line
{
//
// functionality here ...
//
default:
printf("Hello?\n");
}
}
int main (int argc, char *argv [])
{
enum {
UNDEFINED = -1,
STATE_NICE,
STATE_GREEDY
} E_STATE;
somefun (STATE_NICE);
return 0;
}
bash $ gcc -Wall bar.c -o bar
bar.c: In function 'main':
bar.c:22: warning: unused variable 'E_STATE'
bash $ ./bar
Hello?
bash $
いくつかの変更を行いましたが、変更なしで実行されました。 (1)スイッチにタグを追加して、何かがあるようにしました。 (2)#include <stdio.h>
とprintf
を追加したので、実行されたことがわかります。 (3)return 0;
を追加して、意味のない警告を削除しました。
変更なしで正常に実行されましたが、表示されるものは何もありませんでした。
では、OS、ハードウェアアーキテクチャは何ですか?
更新
コードを試している間に変更されたため、更新されたバージョンのテストを次に示します。
bash $ cat bar-prime.c
#include <stdio.h>
void somefun (unsigned int nState)
{
switch (nState) // <-- Crashes on this line
{
//
// functionality here ...
//
default:
printf("Hello?\n");
}
}
enum {
UNDEFINED = -1,
STATE_NICE,
STATE_GREEDY
} E_STATE;
int main (int argc, char *argv [])
{
somefun (STATE_NICE);
return 0;
}
bash $ gcc -Wall bar-prime.c -o bar-prime && ./bar-prime
Hello?
bash $
まだ動作します。お使いのバージョンでコアファイルを取得していますか?スタックトレースを取得しようとしましたか?
あなたの状況は、sun sparcハードウェアに特有のもの、またはそれに類するものです。 uname -aとdmesgの出力を投稿してください