Для моего программирования класса 102 нас попросят предоставить код C, который компилируется и запускается под Linux. Мне не хватает свободного места на жестком диске для установки Linux вместе с Windows, поэтому я использую cygwin для компиляции моих программ.
Самая последняя программа, которую я должен был компилировать и запускать под Cygwin. Он отлично компилируется под Linux, но на полпути через выполнение возникает ошибка сегментации. Я объяснил это студенту-градиенту, который дает нам класс, и он сказал, что версия cygwin GCC позволяет скомпилировать и выполнить код sloppier.
Несколько ссылок, которые я нашел через google, не были окончательными. Один поток, который я нашел, сказал, что причиной сбоя seg в Linux является утечка памяти. Почему это не повлияет на версию cygwin?
Я бы использовал компьютеры университета, но я не могу использовать Subversion для них, что значительно помешало бы моим усилиям. (Я новичок в кодировании и часто должен иметь возможность вернуться к изменениям X назад).
Является ли версия GCC cygwin более "слабой" с кодом, который он компилирует? Если да, есть ли очевидные проблемы, которые нужно учитывать при кодировании? Существуют ли альтернативы для написания кода, который будет работать под Linux?
Edit
Спасибо за ответы. Я не был достаточно явным в своем оригинальном посте: что ошибка в моем коде была для меня значительной для меня (я совершенно новый для программирования и действительно зеленый, когда дело доходит до C). Мой TA подразумевал, что cygwin GCC является менее надежным компилятором, позволяющим работать с большим количеством sloppier-кода, чем тот, который найден в GNU/Linux. Я нашел это странным и так сделал поиск в Интернете, но не мог найти никаких ссылок на этот факт.
Больше, чем обвинять компилятор в сравнении с моим кодом, мне было интересно, что может быть причиной для запуска программы под Windows и сбоя в Linux. В этом отношении иллюстрируются ответы re: разные менеджеры памяти и компоновка кучи/стека под Windows/Linux.
Будет ли заключение, что cygwin GCC так же "хорош", как GNU/Linux ", и что основные операционные системы/просто удача в том, что моя багги-программа работает под одной, а не с другой, будет довольно правильной?
Что касается публикации исходного кода, это домашнее задание, поэтому я бы предпочел самому найти проблему, если это вообще возможно:)
Изменить 2
Я принял jalf-ответ, так как он говорит о том, что заставляет программу работать под Windows, а не под Linux, чего я действительно хотел узнать. Спасибо всем, кто внес свой вклад, они были очень интересными и информативными ответами.
Когда я нашел проблему и исправил ее, я загружу 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;
}