Прошу помощи [warning 213: tag mismatch]

Puwok

Участник
Сообщения
37
Реакции
4
Приветствую, помогите разобраться с функцией.

При компиляции выдаёт

Ошибка:
plugin.sp(300) : warning 213: tag mismatch

Ругается именно на это
Code:
(g_iGame / 1000 * 15)

300 строка это где return ...
Код:
float GetScore(int iClient) {
    int g_iGame = GetTime() - g_iConnect[iClient];
    return (g_iKnifeKills[iClient] * 10 - g_iKnifeDeaths[iClient] * 10 + g_iKiils[iClient] * 3 - g_iDeaths[iClient] * 3 + g_iHeadshots[iClient] * 6 + g_iAssist[iClient] * 2 - g_iRoindLoss[iClient] * 6 + g_iRoundWin[iClient] * 4) + (g_iGame / 1000 * 15);
}
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #2
C-подобный:
float GetScore(int iClient) {
    int g_iGame = GetTime() - g_iConnect[iClient];
    return (g_iKnifeKills[iClient] * 10 - g_iKnifeDeaths[iClient] * 10 + g_iKiils[iClient] * 3 - g_iDeaths[iClient] * 3 + g_iHeadshots[iClient] * 6 + g_iAssist[iClient] * 2 - g_iRoindLoss[iClient] * 6 + g_iRoundWin[iClient] * 4) + float(g_iGame / 1000 * 15);
}
 

Puwok

Участник
Сообщения
37
Реакции
4
C-подобный:
float GetScore(int iClient) {
    int g_iGame = GetTime() - g_iConnect[iClient];
    return (g_iKnifeKills[iClient] * 10 - g_iKnifeDeaths[iClient] * 10 + g_iKiils[iClient] * 3 - g_iDeaths[iClient] * 3 + g_iHeadshots[iClient] * 6 + g_iAssist[iClient] * 2 - g_iRoindLoss[iClient] * 6 + g_iRoundWin[iClient] * 4) + float(g_iGame / 1000 * 15);
}

Комплится без ошибок, но:
C-подобный:
float(g_iGame / 1000 * 15)

Показывает 0, хотя должно за 1 минуту уже быть 0,9.

Пробовал даже просто (60 / 1000 * 15), всё равно пишет 0; для показа использовал (%.2f)
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
Комплится без ошибок, но:
C-подобный:
float(g_iGame / 1000 * 15)

Показывает 0, хотя должно за 1 минуту уже быть 0,9.

Пробовал даже просто (60 / 1000 * 15), всё равно пишет 0; для показа использовал (%.2f)
60/1000 уже не целочисленное, а там умножение ещё. Вот и тупит
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #5
Причину выше написали уже.
Как вариант, в этой формуле приводить всё к флоату.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
а почему не вот так?
C-подобный:
float GetScore(int client)
{
    return g_iKnifeKills[client] * 10 - g_iKnifeDeaths[client] * 10 + g_iKiils[client] * 3 - g_iDeaths[client] * 3 + g_iHeadshots[client] * 6 + g_iAssist[client] * 2 - g_iRoindLoss[client] * 6 + g_iRoundWin[client] * 4 + float(GetTime() - g_iConnect[client]) / 200 * 3);
}
 

Puwok

Участник
Сообщения
37
Реакции
4
а почему не вот так?
C-подобный:
float GetScore(int client)
{
    return g_iKnifeKills[client] * 10 - g_iKnifeDeaths[client] * 10 + g_iKiils[client] * 3 - g_iDeaths[client] * 3 + g_iHeadshots[client] * 6 + g_iAssist[client] * 2 - g_iRoindLoss[client] * 6 + g_iRoundWin[client] * 4 + float(GetTime() - g_iConnect[client]) / 200 * 3);
}

Всем спасибо за помощь, Grey83 попробовал твой код, всё работает.
 

Вложения

  • 333.png
    333.png
    19.2 КБ · Просмотры: 51

Kailo

Участник
Сообщения
194
Реакции
896
Извините, но я чего-то тут с вас в шоке, вроде не 1й день в SP.
Как работает неявное преобразование типов в SP между int и float:
Если это два int в операции, то результат int!
Если int и float, то int неявно преобразуется к float и суммируются два float.
Операция деления для int НЕ операция деления! Она не превратит их во float.
int / int это операция получения целого от деления: 10 / 3 = 3
int % int это операция получения остатка от деления 10 / 3 = 1

Ошибка "tag mismatch". tag в данном случае считайте синонимом слова type, т.е. type mismatch - несовпадение типов.
Функция GetScore ожидает, что возвращаемое значение будет float типа, но результат всех операций получается int типа, т.к. все числам там int!
Вот он и сигнализирует, что ждал float, а получил int.

А теперь разбираем почему мы получили тут 0:
float(g_iGame / 1000 * 15)
Операции получения целого от деления, получения остатка от деления и умножения имеют равнозначный приоритет и выполняются в порядке слева на право.
60 / 1000 * 15 = (60 / 1000) * 15 = 0 * 15 = 0
Ну и конечно же float(0) = 0.0
В принципе достаточно было преобразовать первое число в последовательности операций во float, чтобы остальные неявно преобразовались уже.
float(g_iGame) / 1000 * 15
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #10
Первоначальная цель была "исправить варнинг". Вникать в код было неохота. Но такая себе отговорочка, да.
 
Сверху Снизу