Мультиплатформенная сборка - snprintf не работает в C

Я изучаю 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 не работает?


person Shiunbird    schedule 01.05.2021    source источник
comment
Надеюсь, вы используете freeglut, а не перенасыщение opengl. stackoverflow.com/q/15613978/1216776   -  person stark    schedule 02.05.2021
comment
Спасибо @старк. Хотя я не понимаю, насколько это актуально. На самом деле моя цель — использовать официально поддерживаемые библиотеки, поставляемые с системой. Я думаю, что проблема, с которой я сталкиваюсь, больше связана с C, чем с GLUT.   -  person Shiunbird    schedule 02.05.2021
comment
Вы уверены, что у вас есть И используется среда библиотеки C, совместимая с POSIX.1-2001 или C99, в HP-UX? Цитата из справочной страницы: Что касается возвращаемого значения snprintf(), SUSv2 и C99 противоречат друг другу: когда snprintf() вызывается с размером = 0, тогда SUSv2 предусматривает неуказанное возвращаемое значение меньше 1, в то время как C99 позволяет str быть NULL в этом случае и возвращает возвращаемое значение (как всегда) в виде количества символов, которое было бы записано, если бы выходная строка была достаточно большой. POSIX.1-2001 и более поздние версии согласовывают свою спецификацию snprintf() с C99.   -  person derhass    schedule 02.05.2021
comment
@derhass Ты что-то здесь задумал. Я поместил printf() для печати длины int после запуска snprintf(NULL, 0, %s %i, text, value); и я получаю 0 под HP-UX и реальную длину строки везде. Я все еще очень новичок, поэтому я даже не знаю, где именно искать, но я покопаюсь в документации.   -  person Shiunbird    schedule 03.05.2021
comment
Ну, поведение, которое вы описываете, соответствует Единой спецификации Unix v2. Это просто не соответствует C99 или POSIX.1-2001. В конце концов, именно поэтому существуют такие вещи, как автоинструменты GNU, которые позволяют вам писать тесты для всевозможных различий между разновидностями Unix и при необходимости использовать отдельную реализацию. См., например, jhweiss.de/software/snprintf.html для реализации snprintf, совместимой с C99. которые вы можете просто добавить в свой проект.   -  person derhass    schedule 03.05.2021