redundant code: constant expression is zero
#1

PHP код:
public OnPlayerSpawn(playerid)
{
    
infJugador[playerid][Actividad] = ? (SetPlayerRandomEx(playeridinfJugador[playerid][Spawn])) : (SetPlayerInActivity(playeridinfJugador[playerid][Actividad]));
    return 
true;

Este es el warning:
pawn Код:
redundant code: constant expression is zero
Si cambio el 0, aparece este warning:
pawn Код:
warning 206: redundant test: constant expression is non-zero
La idea del codigo es ver si el jugador esta en una actividad, y si lo esta que ejecute un acciуn de lo contrario otra.
Reply
#2

El primer argumento del operador ternario es leнdo como un dato de tipo booleano. En ese primer argumento tienes la siguiente expresiуn:
pawn Код:
infJugador[playerid][Actividad] = 0
Primer warning
Eso es una operaciуn de asignaciуn del nъmero cero a la variable infJugador[playerid][Actividad], y su resultado es cero. Lo que te intenta decir el compilador es que, sin importar las variables que estбn en esa operaciуn de asignaciуn, el resultado siempre serб cero.

Segundo warning
De forma mбs genйrica, el resultado de la operaciуn de asignaciуn siempre serб el nъmero que se asigna.

Por ejemplo:
pawn Код:
infJugador[playerid][Actividad] = 0  // Resultado = 0
infJugador[playerid][Actividad] = -5 // Resultado = -5
infJugador[playerid][Actividad] = 1  // Resultado = 1
La soluciуn
No debes confundir el operador de asignaciуn (=) con el operador de igualdad (==). El primero asigna un valor a una variable y su resultado es el valor asignado (como en los ejemplos anteriores). El segundo, en cambio, devuelve 1 si sus argumentos son iguales y 0 si no lo son.

pawn Код:
5 == 5 // Resultado = 1
5 == 6 // Resultado = 0
infJugador[playerid][Actividad] == infJugador[playerid][Actividad] // Resultado = 1
Finalmente, tu cуdigo quedarнa asн:
pawn Код:
public OnPlayerSpawn(playerid)
{
    // Hay un == en vez de un = en el primer argumento del ternario
    infJugador[playerid][Actividad] == 0 ? (SetPlayerRandomEx(playerid, infJugador[playerid][Spawn])) : (SetPlayerInActivity(playerid, infJugador[playerid][Actividad]));
    return true;
}
Reply
#3

Ya habia intentado eso, y me aparece como resultado esto:
pawn Код:
warning 215: expression has no effect
PD: Lo siento olvide poner que habia hecho eso mismo.
Reply
#4

Como la mayorнa de los operadores, el operador ternario devuelve un valor y no estбs haciendo nada con йl.

Es el equivalente a hacer lo siguiente:
pawn Код:
// Instrucciones...
x + y;
// Mбs instrucciones...
Como ves, he sumado x + y pero no he almacenado el resultado de la operaciуn en ninguna parte. їcuбl es el punto de sumar si no me importa el resultado? Lo mismo pasa con tu operaciуn, no estбs haciendo nada con los posibles resultados (lo que devuelven SetPlayerRandomEx y SetPlayerInActivity, incluso si no devuelven nada).

Tienes dos opciones. La primera, que no recomiendo, es almacenar el valor de la operaciуn:
pawn Код:
public OnPlayerSpawn(playerid)
{
    // Se almacena lo que devuelva el operador en la variable resultado.
    new resultado = infJugador[playerid][Actividad] == 0 ? (SetPlayerRandomEx(playerid, infJugador[playerid][Spawn])) : (SetPlayerInActivity(playerid, infJugador[playerid][Actividad]));
    return true;
}
La pregunta serнa, їquй vas a hacer con ese resultado? Obviamente nada, lo que generarнa una advertencia indicбndote que no estбs usando la variable "resultado".

La alternativa mбs sensata es que uses el operador ternario cuando te interese el resultado de la operaciуn mбs no cuando quieras ejecutar comandos dada una condiciуn, para eso ъltimo estб la sentencia if.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)