Почему этот вызов sprintf_s () работает, и как я могу заставить это работать на моем компьютере? - PullRequest
0 голосов
/ 20 апреля 2020

Я неопытный студент, и это было частью опубликованного решения нашего задания по программированию на C ++. Но он не компилируется на моем компьютере, и мне нужна помощь, чтобы понять, почему. Первое сообщение об ошибке, с которым я столкнулся, было в sprintf_s (), в котором говорилось, что «идентификатор« sprintf_s »не объявлен», что, как мне кажется, связано с тем, что я запускаю linux, а sprintf_s () не является стандартным lib fun c. Таким образом, я попытался заменить его на snprintf (), и исходное сообщение об ошибке исчезло (но, пожалуйста, дайте мне знать, если это не так, мое изменение закомментировано выше исходной строки).

После изменения я получил сообщение об ошибке «аргумент типа« const char * »несовместим с параметром типа« size_t »», а «float» несовместим с параметром типа «const char *» ». Я понимаю, что параметры для sprintf_s () и snprintf () равны (char *str, size_t size, const char *format, ...), поэтому я думаю, что ошибка имеет смысл, поскольку в передаваемых аргументах отсутствует размер. Но если должен быть аргумент для размера, то будет ли правильно установить его как 128? И почему это работает без аргумента на Windows машине моего учителя для sprintf_s (), а не на Linux для snprintf ()? Кроме того, он использует Visual Studio, я использую код Visual Studio.

Вся функция показана ниже. Если вам известна другая причина, по которой у меня могут возникнуть проблемы с компиляцией того, что должно быть рабочим решением, пожалуйста, дайте мне знать!

bool myNode::isAccessible()
{
    return isAccessible(x, y);
}
myNode::myNode(const float location[3])
{
    x = (location[0] > 0.0) ? (int)floor(location[0] / SCALE + 0.5f) : (int)ceil(location[0] / SCALE - 0.5f);
    y = (location[1] > 0.0) ? (int)floor(location[1] / SCALE + 0.5f) : (int)ceil(location[1] / SCALE - 0.5f);
    if (isAccessible(x, y)) return;
    int originalX = x, originalY = y;
    for (int a = -1; a <= 1; a++)
        for (int b = -1; b <= 1; b++) {
            if (a == 0 && b == 0) continue;
            x = originalX + a;
            y = originalY + b;
            if (isAccessible(x, y)) return;
        }
    char buffer[128];
    //snprintf(buffer, "***AStarNode: could not find any isAccessible node for (%f, %f, %f)***", location[0], location[1], location[2]);
    sprintf_s(buffer, "***AStarNode: could not find any isAccessible node for (%f, %f, %f)***", location[0], location[1], location[2]);
    controlPanel->addMessage(buffer);
}

1 Ответ

2 голосов
/ 20 апреля 2020

Ошибка "argument of type 'const char *' is incompatible with parameter of type 'size_t'" и следующие ошибки происходят из-за отсутствия аргумента размера буфера для snprintf.

Правильный вызов snprintf:

snprintf(buffer, sizeof buffer, "***AStarNode: could not find any isAccessible node for (%f, %f, %f)***", location[0], location[1], location[2]);
...