Недавно столкнулся с проблемой необходимости компилировать мои работы под Линукс. Сам я пользуюсь маздаем, поэтому для компиляции взял среду разработки Code::Blocks (со встроенными компиляторами MinGW). С исходником программы все в порядке, но вот заголовочный файл из универсальной SDK Jedi Academy вызывает у компилятора сомнения. А именно, этот отрывок: Код (Text): static ID_INLINE void SnapVector( float *v ) { static int i; static float f; f = *v; __asm fld f; __asm fistp i; *v = i; v++; f = *v; __asm fld f; __asm fistp i; *v = i; v++; f = *v; __asm fld f; __asm fistp i; *v = i; } Лог компиляции: C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h||In function `void SnapVector(float*)':| C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1412|error: expected `(' before "fld"| C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1412|error: expected asm body before "fld"| C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1412|error: `fld' was not declared in this scope| C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1412|error: expected `;' before "f"| C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1413|error: expected `(' before "fistp"| C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1413|error: expected asm body before "fistp"| C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1413|error: `fistp' was not declared in this scope| C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1413|error: expected `;' before "i"| C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1417|error: expected `(' before "fld"| C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1417|error: expected asm body before "fld"| C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1417|error: expected `;' before "f"| C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1418|error: expected `(' before "fistp"| C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1418|error: expected asm body before "fistp"| C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1418|error: expected `;' before "i"| C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1422|error: expected `(' before "fld"| C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1422|error: expected asm body before "fld"| C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1422|error: expected `;' before "f"| C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1423|error: expected `(' before "fistp"| C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1423|error: expected asm body before "fistp"| C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1423|error: expected `;' before "i"| E:\Date-in-logs\main.cpp|154|warning: no newline at end of file| ||=== Build finished: 20 errors, 1 warnings ===| Подскажите пожалуйста, что мне делать с этим?
Переделал код, теперь он выглядит так: Код (Text): asm ("$f %fldl"); asm ("$i %fistpl"); *v = i; v++; f = *v; asm ("$f %fldl"); asm ("$i %fistpl"); *v = i; v++; f = *v; asm ("$f %fldl"); asm ("$i %fistpl"); Компилятор не жалуется, но вот в правильности этого кода я не уверен
Может я неправ, но приведённый в первом посте код крив по определению. Первый вопрос, который смущает мой мозг: зачем static перед явно выраженными локальными переменными? Единственное объяснение которое я вижу этому static'у -- это сделать код не-thread-safe. Второй вопрос: зачем это писать на асме, если есть C? Можно ведь сделать так: Код (Text): static inline void SnapVector (float *v) { v = (float[4]){(int)v[0], (int)v[1], (int)v[2], (int)v[3]}; } Я бы вообще написал бы так: Код (Text): static inline void SnapVector (float *v) { int i; for (i = 0; i < 4; i ++) v[i] = (int)v[i]; } И добавил бы -funroll-loops к опциям оптимизации. Может быть ещё стоит добавить -ftracer. Ну собственно у gcc довольно подробная документация, чтобы разобраться самостоятельно со всеми этими опциями. Как бы я не уважал ЯП ассемблера, но если проект уже пишется на C, то зачем без острой необходимости переключаться на асм? Чтобы привязать проект к платформе x86?
r90 И правда логичней было бы написать так (хотя я бы использовал ++i). А вообще странно - в описании ясно сказано, что код универсален и расчитан под линукс. Кроме асма, он еще отказывался компилироваться из-за отсутствия описания одной из переменных, но это я исправил уже давно.