Я изучаю C и пытаюсь убедиться, что мой код переносим. Для этого я использую Mac (ARM, PPC, Intel), Linux (ARM, PPC, PA-RISC) и HP-UX (PA-RISC). Чтобы убедиться, что у меня есть простой способ вывода простой графики, я использую GLUT.
У меня есть следующий код и функции:
GLfloat white[3] = { 1.0, 1.0, 1.0 };
GLfloat red[3] = { 1.0, 0.0, 0.0 };
GLfloat green[3] = { 0.0, 1.0, 0.0 };
void printText(char *text, const GLfloat colour[3], float posX, float posY) {
glColor3fv (colour);
glRasterPos2f(posX, posY); //define position on the screen
while(*text){
glutBitmapCharacter(GLUT_BITMAP_8_BY_13, *text++);
}
}
void GLprintTextAndInteger (char *text, int value, float colour[3], float posX, float posY) {
int length = snprintf(NULL, 0, "%s %i", text, value);
char *stringToPrint = malloc(length + 1);
snprintf(stringToPrint, length + 1, "%s %i",text,value);
printText(stringToPrint,colour,posX,posY);
free(stringToPrint);
}
void GLprintTextAndLong (char *text, long value, float colour[3], float posX, float posY) {
int length = snprintf(NULL, 0, "%s %ld", text, value);
char *stringToPrint = malloc(length + 1);
snprintf(stringToPrint, length + 1, "%s %ld", text, value);
printText(stringToPrint,colour,posX,posY);
free(stringToPrint);
}
Который я вызываю следующим образом, например:
GLprintTextAndInteger("sample text", int whatever, white, -0.98f, 0.1f);
GLprintTextAndLong("sample text", long whatever, white, -0.98f, 0.0f);
printText("some text",white,-0.98f,-0.1f);
Когда я строю на HP-UX, используя как компилятор HP, так и GCC, когда я запускаю программу, работает только printText. GLprintTextAndInteger и GLprintTextAndLong ничего не делают (или, может быть, они работают, но они черные, и тогда я не вижу вывода). Код собирается без каких-либо предупреждений на всех платформах. Он отлично работает на Linux и Mac на всех архитектурах.
Какие-либо предложения?
Редактировать:
При устранении неполадок я обнаружил, что если я заменю:
int length = snprintf(NULL, 0, "%s %i", text, value);
с
int length = 40;
это работает нормально. Почему snprintf не работает?