
Ubuntu日本語フォーラム

ログインしていません。
現在,学校ではubuntuのバージョン9.10 ,10.04を用いて
geditで作成したc言語のプログラムを用いて計算をしているのですが,
自宅でubuntuの11.10をダウンロードして
プログラムを動かすと,学校と全く同じ作業をしているのにも関わらず
segmentation faultになってしまいます.
プログラムはとても長いので載せませんが
特に変わったことはしていないはずです.
しいて言うなら
計算結果をデータファイルにして出力(この際,ファイルもすでに作成してあります)
する命令が入っています.
なにかubuntuをダウンロードする以外に
ダウンロードする必要があるのでしょうか?
よろしくおねがいします
オフライン
最低限、エラーメッセージの詳細はないと状況を推測できる人が現れないのではないかと思います。
ほぼ、情報が何も無い状態ですが、とりあえず考えられることとしては、
1. ライブラリなどの環境の変化で、プログラムの修正が必要な状況になっている。以下も参考にどうぞ。
https://wiki.ubuntu.com/OneiricOcelot/ReleaseNotes/ja#GCC_4.6_Toolchain
https://wiki.ubuntu.com/Security/Features
2. データファイルの内容が変わっている(テキストファイルなら改行コードの変化も可能性として含まれます)ためプログラムの実行がおかしくなった
3. そもそもリビルドしていなくてSharedObjectなどが合わなくなっている
あたりを疑ってみてはいかがでしょうか。
また、デバッガで追いかけると、どこでおかしくなっているか見付けられないでしょうか。
オフライン
11.10環境下においてコンパイルしたものを、11.10において実行するとどうなりますか。
そのソースコードが、移植性の高いものであるならば、
どのバージョンでもコンパイル可能であり、どのバージョンでも実行可能なはずです。
ただ、移植性の高いものを書くのは、非常に難しいことであるのも事実です。
プログラマが暗黙のうちに(無意識のうちに)前提としてる関連ファイルの権限、環境変数、などは、
実際に異なる環境下において、それぞれのユーザーからのエラー(バグ)の報告がなければ、気づかないことが多いです。
その報告があって初めて、「いや、そこまでは考えてなかった・・・」なんてことは、よくあります。
同じソースコードでも、別の環境でコンパイルしたとき、gcc がエラーや警告を吐いてくれるときがあります。(もちろん、すんなり通ることもあります。)
Segmentation Fault は、基本的には、実行中に、参照してはいけないメモリ領域にアクセスした場合に返ってくるメッセージなので、
実行は可能で、途中に問題があるということです。
ログなどを確認しながら(printf ( "OK\n" );でもいいと思います) 、どこまでが実行可能で、どこから下ののコードが実行されずにSegmentation Fault になっているのか確認されるのが一番早いと思います。
オフライン
丁寧な回答をありがとうございました。
どうやらプログラム内で作成したファイルに
データを出力することが出来ないようです。
例をあげてみますと
main関数内で
FILE *data[10]; のように宣言して
fprintf(data[j],"test\n");
が実行されません
ファイルのアクセス権などが関与しているのでしょうか?
それともファイルポインタなどに問題があるのでしょうか?
よろしければおこたえいただけますでしょうか?
オフライン
よくありそうな原因としては、3つあります。ソースを拝見してないので、思いつく一般的な原因のみです。
第1は、単純に j の値が0未満10以上である場合です。
fprintf (); の直前に
if ( j < 0 || j > 9 ) { fprintf ( stderr, "error : j = %d\n", j ); exit (1); }
と入れてコンパイル・実行してみてください。
j の値が0未満10以上で "error : j = %d\n" が出力されるはずです。
j の値は0未満10以上であってはいけません。
第2は、 ( FILE * ) が NULL の場合です。
FILE * p = fopen ();
if ( p == NULL ) { fprintf ( stderr, "error : p == NULL\n" ); exit (1); }
と入れてコンパイル・実行してみてください。
p == NULL であってはいけません。
第3は、( FILE * ) が別に存在する場合です。
例えば、
FILE * p0 = fopen ();
FILE * p1 = fopen ();
FILE * data [2];
data [0] = p0;
data [1] = p1;
です。
この書き方は、ソースコード上に、同じ ファイルをさす( FILE * ) が2つ存在させることになり、頻繁にオープンクローズする場合や、マルチスレッドの場合などは、バグの温床になります。
例えば、すぐにリオープンするつもりで、
fclose ( p0 );
した直後に、
fprintf ( data [0], "test\n" );
とした場合などです。
ファイルの実体と ( FILE * ) は1対1の関係を維持した方がいいでしょう。
>>ファイルのアクセス権などが関与しているのでしょうか?
いまところなんとも。
>>それともファイルポインタなどに問題があるのでしょうか?
これは第2、3の候補に相当するかと思いますが、ソースそのものを見てないのでなんとも言えません。なので、よくありそうな(自分が体験したり、見たり聞いたりした)コードミスを挙げるより他ありません。
なんだかC言語質問掲示板になってしまいましたが、今のところ、
>>しいて言うなら
>>計算結果をデータファイルにして出力(この際,ファイルもすでに作成してあります)
>>する命令
を入れて Segmentation fault なら、あなたが書いた fprintf(data[j],"test\n"); に原因があるように思われます。そんなに特殊な関数を使用していない限り(標準的な関数の使用のみである限り)、Ubuntu のバージョンが異なるだけで Segmentation fault はありえません。
オフライン