В моем классе «Программирование 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
Я принял ответ 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;
}