SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Español/Spanish

 
 
Thread Tools Display Modes
Old 04/11/2016, 07:49 AM   #1
mcreed
Huge Clucker
 
Join Date: Nov 2011
Location: La Lima, Honduras.
Posts: 211
Reputation: 2
Post redundant code: constant expression is zero

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

Este es el warning:
Code:
redundant code: constant expression is zero
Si cambio el 0, aparece este warning:
Code:
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.
mcreed is offline  
Old 05/11/2016, 06:51 AM   #2
Miguel
High-roller
 
Miguel's Avatar
 
Join Date: Dec 2009
Posts: 1,574
Reputation: 50
Default Re: redundant code: constant expression is zero

El primer argumento del operador ternario es leído como un dato de tipo booleano. En ese primer argumento tienes la siguiente expresión:
Code:
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:
Code:
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.

Code:
5 == 5 // Resultado = 1
5 == 6 // Resultado = 0
infJugador[playerid][Actividad] == infJugador[playerid][Actividad] // Resultado = 1

Finalmente, tu código quedaría así:
Code:
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;
}
Miguel is offline  
Old 06/11/2016, 03:11 AM   #3
mcreed
Huge Clucker
 
Join Date: Nov 2011
Location: La Lima, Honduras.
Posts: 211
Reputation: 2
Default Respuesta: redundant code: constant expression is zero

Ya habia intentado eso, y me aparece como resultado esto:
Code:
warning 215: expression has no effect

PD: Lo siento olvide poner que habia hecho eso mismo.
mcreed is offline  
Old 06/11/2016, 07:14 PM   #4
Miguel
High-roller
 
Miguel's Avatar
 
Join Date: Dec 2009
Posts: 1,574
Reputation: 50
Default Re: redundant code: constant expression is zero

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:
Code:
// 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:
Code:
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.
Miguel is offline  
 

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
redundant code: constant expression is zero RaeF Scripting Help 1 05/04/2015 09:23 AM
redundant code: constant expression is zero vardanega Scripting Help 2 14/04/2014 08:15 AM
[Ajuda] redundant test: constant expression is non-zero Falcon. Português/Portuguese 1 28/01/2013 05:51 PM
Redundant code: constant expression is zero Zerovda Scripting Help 2 06/11/2012 05:10 PM
[Ajuda] redundant code: constant expression is zero StrondaXxT Português/Portuguese 2 15/08/2012 08:36 PM


All times are GMT. The time now is 05:32 AM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.