私のProgramming102クラスでは、Linuxでコンパイルおよび実行されるCコードを提供するように求められます。ハードドライブにWindowsと一緒にLinuxをインストールするのに十分な空き容量がないため、cygwinを使用してプログラムをコンパイルします。
私がコンパイルで提供しなければならなかった最新のプログラムは、cygwinの下で正常に実行されます。Linuxでは正常にコンパイルされますが、実行の途中でセグメンテーション違反が発生します。私はこれをクラスを提供する大学院生に説明しました、そして彼はcygwinのバージョンのGCCはより滑らかなコードをコンパイルして実行することを可能にする、と言いました。
私がグーグルで見つけたいくつかの参考文献は決定的なものではありませんでした。私が見つけたあるスレッドは、Linuxでのセグメンテーション違反の原因はメモリリークであると述べました。なぜこれがcygwinバージョンに影響を与えないのでしょうか?
私は大学のコンピューターを使用しますが、Subversionを使用できないため、作業が大幅に妨げられます。(私はコーディングに不慣れで、多くの場合、以前にXリビジョンに戻せるようにする必要があります)。
cygwinのバージョンのGCCは、コンパイルするコードで本当に「緩い」のでしょうか?もしそうなら、コーディング時に注意すべき明らかな問題はありますか?Linuxで実行されるコードを記述できるようにするための代替手段はありますか?
編集
返信ありがとうございます。私は元の投稿で十分に明確ではありませんでした:私のコードにバグがあることは私にはほとんど与えられていました(私はプログラミングにまったく慣れておらず、結局のところ、Cに関しては本当に環境に優しいです)。私のTAは、cygwinのGCCは信頼性の低いコンパイラであり、GNU/Linuxで見られるものよりもはるかにスロープなコードを実行できます。私はこれが奇妙だと思ったのでインターネットで検索しましたが、その事実への言及は実際には見つかりませんでした。
コンパイラと私のコードを非難するだけでなく、プログラムがWindowsで実行され、Linuxでクラッシュする理由は何でしょうか。返信は次のとおりです。Windows/Linuxでのさまざまなメモリマネージャーとヒープ/スタックレイアウトがその点を示していました。
cygwinのGCCはGNU/Linuxと同じくらい「良い」であり、私のバグのあるプログラムが一方の下で実行され、もう一方の下で実行されないのは、基盤となるオペレーティングシステム/幸運であるという結論はほとんど正しいでしょうか?
ソースコードの投稿に関しては、宿題なので、できれば自分で問題を見つけたいと思います:)
編集2
LinuxではなくWindowsでプログラムを実行する理由について説明しているjalfの回答を受け入れました。これは、私が本当に知りたかったことです。貢献してくれた他のみんなのおかげで、彼らは皆とても興味深くそして有益な返事でした。
問題を見つけて修正したら、この機能していないバージョンのすべてのソースコードを含むzipファイルをアップロードします。誰かが私が何をしたのか知りたがっている場合に備えて:)
編集3
コードを見ることに興味がある人のために、私は問題を見つけました、そしてそれは確かにポインターによるものでした。関数からポインタを返そうとしていました。私が返そうとしていたポインタは関数内で宣言されていたため、関数が実行されると破棄されていました。問題のあるコードは22〜24行目にコメントアウトされています。
私のコードを自由に嘲笑してください。
/**
* Returns array of valid searches based on current coordinate
*/
void determine_searches(int row, int col, int last_row, int last_col, int *active_search){
// define coordinate categories and related valid search directions
int Library0[] = {2, 3, 4, -1};
int Library1[] = {4, 5, 6, -1};
int Library2[] = {2, 3, 4, 5, 6, -1};
int Library3[] = {0, 1, 2, 3, 4, 5, 6, 7, -1};
int Library4[] = {0, 1, 2, -1};
int Library5[] = {0, 6, 7, -1};
int Library6[] = {0, 1, 2, 6, 7, -1};
int Library7[] = {0, 1, 2, 3, 4, -1};
int Library8[] = {0, 4, 5, 6, 7, -1};
int * Library[] = {
Library0, Library1, Library2,
Library3, Library4, Library5,
Library6, Library7, Library8,
};
// declare (and assign memory to) the array of valid search directions that will be returned
//int *active_search;
//active_search = (int *) malloc(SEARCH_DIRECTIONS * sizeof(int));
// determine which is the correct array of search directions based on the current coordinate
// top left corner
int i = 0;
if(row == 0 && col == 0){
while(Library[0][i] != -1){
active_search[i] = Library[0][i];
i++;
}
}
// top right corner
else if(row == 0 && col == last_col){
while(Library[1][i] != -1){
active_search[i] = Library[1][i];
i++;
}
}
// non-edge columns of first row
else if(row == 0 && (col != 0 || col != last_col)){
while(Library[2][i] != -1){
active_search[i] = Library[2][i];
i++;
}
}
// non-edge coordinates (no edge columns nor rows)
else if(row != 0 && row != last_row && col != 0 && col != last_col){
while(Library[3][i] != -1){
active_search[i] = Library[3][i];
i++;
}
}
// bottom left corner
else if(row == last_row && col == 0){
while(Library[4][i] != -1){
active_search[i] = Library[4][i];
i++;
}
}
// bottom right corner
else if(row == last_row && col == last_col){
while(Library[5][i] != -1){
active_search[i] = Library[5][i];
i++;
}
}
// non-edge columns of last row
else if(row == last_row && (col != 0 || col != last_col)){
while(Library[6][i] != -1){
active_search[i] = Library[6][i];
i++;
}
}
// non-edge rows of first column
else if((row != 0 || row != last_row) && col == 0){
while(Library[7][i] != -1){
active_search[i] = Library[7][i];
i++;
}
}
// non-edge rows of last column
else if((row != 0 || row != last_row) && col == last_col){
while(Library[8][i] != -1){
active_search[i] = Library[8][i];
i++;
}
}
active_search[i] = -1;
}