Форматирование строки через vsprintf_s

Эм… Ну что сказать… Опять глюк нашёл :man_shrugging:
Есть функция

void glTextOut(float xPos, float yPos, char* sText, ...)
{
	//glDisable(GL_LIGHTING);
	glDisable(GL_DEPTH_TEST);
	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE);
	glEnable(GL_TEXTURE_2D);

	glBindTexture(GL_TEXTURE_2D, textureIdFont);

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	glOrtho(0.0, static_cast<double>(viewportWidth), 0.0, static_cast<double>(viewportHeight), -1.0, 1.0);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	glTranslatef(xPos, static_cast<float>(viewportHeight) - yPos - fontSize - 4.0f, 0.0f);
	glListBase(glyphListsId - 32);

	char text[256];
	va_list vl;
	va_start(vl, sText);
	vsprintf_s(text, sText, vl);
	va_end(vl);

	glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);

	glDisable(GL_TEXTURE_2D);
	glDisable(GL_BLEND);
	glEnable(GL_DEPTH_TEST);
	//glEnable(GL_LIGHTING);
}

Вызываю так:

void DrawHudText()
{
    glColor3f(1.0f, 1.0f, 1.0f);
    glTextOut(0.0f, 0.0f, (char*)"Position: %.2f %.2f %.2f", camera->GetPositionX(), camera->GetPositionY(), camera->GetPositionZ());

    glColor3f(0.0f, 1.0f, 0.0f);
    glTextOut(0.0f, fontSize, (char*)"Rotation: %.2f %.2f", camera->GetRotationYaw(), camera->GetRotationPitch());
}

Работает правильно.
Но если поменять прототип на такой:

void glTextOut(char* sText, float xPos, float yPos, ...);

И , соответственно, поменять вызов, то уже не работает. Первый переданный аргумент встаёт на второе место, второй на третье и т.д. А вместо первого получается либо 0, либо какая-то хрень (всегда одна и та же).
То есть, если вызвать

glTextOut((char*)"%.2f %.2f %.2f", 0.0f, 0.0f, 2.0f, -6.0f, 7.0f);

то получится 25463333333.33, 2.00 -6.00.
В принципе, не критично. Если вынести форматирование в отдельную функцию, то работает. Но почему так? :thinking:
Кстати, так только в вижуалке. В MinGW такого нет. Но там vsprintf, а не vsprintf_s.

Попробуйте еще сделать:
va_start(vl, yPos);

Интересно :thinking: А так работает и там и там

Параметр last является именем последнего параметра перед переменным списком аргументов

Так что лучше в каждом случае указывать верный параметр.