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