Problema con un cуdigo
#1

Hola a todos.

Hoy me puse a realizar un sistema pequeсito para mi GM. Le cree un enum con variables y todo eso para tenerlo bien ordenado. Pero la cosa es que una de esas variables el valor se le cambia a 97 y a la variable siguiente se le cambia a 100.

pawn Код:
for(new x = 0; x < MAX_EMISORAS; x++)   {
                    if(EMI[x][EmisoraActiva] != 1)  {
                        EMI[x][EmisoraActiva] = 1;
                        EMI[x][Emisor] = playerid;
                        EMI[x][TipoEmisora] = 0;
                        EMI[x][TextoVoz] = 0;
                        EnEmisora[playerid][0] = 1; // Lider
                        EnEmisora[playerid][1] = x;
                        format(EMI[x][NombreEmisora], 24, "%s", inputtext);
                        printf("%s creo el programa %s - %d", NombreJugador(playerid), EMI[x][NombreEmisora], EMI[x][EmisoraActiva]);
                        count++;
                        break;
                    }
                }
EMI[x][EmisoraActiva] -> Esta es la variable que cambia.

Segъn el cуdigo de arriba al hacer el loop en x = 0 me ejecuta el cуdigo y me cambia todos los valores adecuadamente.
Код:
Nicolas Castillo creo el programa Hola Mundo - 1
Pero al ver los valores de la variable EMI[x][EmisoraActiva] me da unos valores que nunca le seteo.

pawn Код:
printf("%d", EMI[x][EmisoraActiva]);
Код:
Con x=0: 1
Con x=1: 97
Con x=2: 100
Con x=3: 0;
Con x=3: 0;
La cosa es que no entiendo por que pasa eso y no puedo encontrar nada que haga cambiar esa variable.

Otros datos:
pawn Код:
enum EmisoraTextual
{
    EmisoraActiva,  // 0-No esta Activa | 1-Esta Activa
    Emisor,         // El Playerid
    NombreEmisora,  // Nombre del programa que transmitira
    TipoEmisora,    // 0-En el HQ | 1-En la Van News | 2-Con equipo Portatil
    TextoVoz,       // 0-Texto | 1- Voz
};
new EMI[MAX_EMISORAS][EmisoraTextual];
Espero su ayuda. Gracias.
Reply
#2

Lo que le pasa a tu sistemita se le llama Buffer overflow y eso pasa cuando se le intenta meter mas datos a una variable de lo que realmente soporta entonces al no alcazar toda esa informaciуn las variables que estбn adelante se sobre escriben, a como veo le intentas meter 24 caracteres a la variable NombreEmisora pero esta variable apenas acepta 1 solo caracter la solucion es simple solo definela de esta manera NombreEmisora[24]
Reply
#3

Claramente, estбs mandando NombreEmisora como un entero y no le has creado celdas para que almacene strings. De todos modos podes hacer eso mбs optimizado colocando un iterator y usando binarios.


pawn Код:
#define MAX_EMISORAS (0b110010) // 50 emisoras mбximo
pawn Код:
new Iterator:Emisoras<MAX_EMISORAS>;
pawn Код:
enum EmisoraTextual
{
    EmisoraActiva,
    Emisor,
    NombreEmisora[24],
    TipoEmisora,    
    TextoVoz,      
};
static EMI[MAX_EMISORAS char][EmisoraTextual];

pawn Код:
foreach(New x: Emisoras)   {
                    if(EMI[x][EmisoraActiva] != 1)  {
                        EMI[x][EmisoraActiva] = 1;
                        EMI[x][Emisor] = playerid;
                        EMI[x][TipoEmisora] = 0;
                        EMI[x][TextoVoz] = 0;
                        EnEmisora[playerid][0] = 1; // Lider
                        EnEmisora[playerid][1] = x;
                        format(EMI[x][NombreEmisora], 24, "%s", inputtext);
                        printf("%s creo el programa %s - %d", NombreJugador(playerid), EMI[x][NombreEmisora], EMI[x][EmisoraActiva]);
                        count++;
                        break;
                    }
                }
Reply
#4

Quote:
Originally Posted by Juance
Посмотреть сообщение
Claramente, estбs mandando NombreEmisora como un entero y no le has creado celdas para que almacene strings. De todos modos podes hacer eso mбs optimizado colocando un iterator y usando binarios.


pawn Код:
#define MAX_EMISORAS (0b110010) // 50 emisoras mбximo
pawn Код:
new Iterator:Emisoras<MAX_EMISORAS>;
pawn Код:
enum EmisoraTextual
{
    EmisoraActiva,
    Emisor,
    NombreEmisora[24],
    TipoEmisora,    
    TextoVoz,      
};
static EMI[MAX_EMISORAS char][EmisoraTextual];

pawn Код:
foreach(New x: Emisoras)   {
                    if(EMI[x][EmisoraActiva] != 1)  {
                        EMI[x][EmisoraActiva] = 1;
                        EMI[x][Emisor] = playerid;
                        EMI[x][TipoEmisora] = 0;
                        EMI[x][TextoVoz] = 0;
                        EnEmisora[playerid][0] = 1; // Lider
                        EnEmisora[playerid][1] = x;
                        format(EMI[x][NombreEmisora], 24, "%s", inputtext);
                        printf("%s creo el programa %s - %d", NombreJugador(playerid), EMI[x][NombreEmisora], EMI[x][EmisoraActiva]);
                        count++;
                        break;
                    }
                }
Ese cуdigo le dara error, si no me equivoco se deberнa usar {} en lugar de [].
Reply
#5

Quote:
Originally Posted by Juance
Посмотреть сообщение
pawn Код:
static EMI[MAX_EMISORAS char][EmisoraTextual];
Disculpa, si puedes explicarme lo mas claramente posible porque usas static y char te lo agradecerнa mucho saludos.

y no, no estoy intentando trollear realmente quiero saber.
Reply
#6

EDIT.
Reply
#7

Te equivocas Julian, no se usan llaves, se usan corchetes, el ъnico error que le darб es porque use "New" en vez de "new".

Quote:
Originally Posted by Parka
Посмотреть сообщение
Disculpa, si puedes explicarme lo mas claramente posible porque usas static y char te lo agradecerнa mucho saludos.

y no, no estoy intentando trollear realmente quiero saber.
No tendrнa una explicaciуn justificativa. Sй que una variable estбtica guarda los valores de una funciуn en esa variable, realmente cuando aprendн pawn leн el tuto de Chaoz, y ademбs en el transcurso de mis dнas con pawn me dijeron que usar una variable estбtica es mбs optimizaciуn para el gamemode.

Char lo uso para liberar bytes. Por ejemplo si una variable para cada jugador utiliza 600 bytes , con char bajarнas a una cantidad de 300 y pico si no me equivoco.

Quote:
Originally Posted by EnzoMetlc
Посмотреть сообщение
EDIT.
Larga lo que habнas dicho, gil , ah
Reply
#8

Quote:
Originally Posted by Juance
Посмотреть сообщение
Te equivocas Julian, no se usan llaves, se usan corchetes, el ъnico error que le darб es porque use "New" en vez de "new".
Se refiere a que si usas char debes usar laves envйs de corchetes (en los нndices), creo.

pawn Код:
EMI{x}[Emisor] ...
Reply
#9

No es asн Enzo, de hecho lo probй y tira error en la funciуn, la toma como invбlida. Use corchetes y me funcionу bien.
Reply
#10

Quote:
Originally Posted by Juance
Посмотреть сообщение
Te equivocas Julian, no se usan llaves, se usan corchetes.
Los 2 nos equivocamos. No se usa llaves o corchetes. Ambos funcionan.

pawn Код:
new var[5 char];

main()
{
    var{0} = 1;
    var[1] = 2;
    printf("1. %i - %i", var{0}, var[1]);
    printf("2. %i - %i", var[0], var{1});
}
No darб error. En el segundo print no tomarб el valor de la variable (lo probй para ver que pasaba, solamente).

[00:00:11] 1. 1 - 2
[00:00:11] 2. 16777216 - 0

En termino de "velocidad"

[00:01:01] {} - 600ms
[00:01:01] [] - 593ms

En un bucle de 100000. Asн que... parece ser lo mismo xD

EDIT:

Lo que decнa que quizбs le daba error usar [] es porque recuerdo haberlo leнdo alguna vez, pero no se puede confiar en todo lo que se lee xD

EDIT 2:

Lo que no entiendo es lo siguiente:

pawn Код:
new a[MAX_PLAYERS char];
new b[MAX_PLAYERS];
printf("a: %i - b: %i", sizeof(a), sizeof(b));
[00:11:22] a: 125 - b: 500

їSupuestamente "char" no harнa que entren mбs datos? Quizбs me estoy perdiendo algo. Por que si la ventaja es que "ocupe menos", pero tambiйn te da menos espacio... їno serнa lo mismo?

Tйcnicamente el cуdigo que le dieron antes apartir del jugador ID126 no serнa funcional, їno?

EDIT 3:

Al usar [] en la variable a luego del index 124 da error que superamos el index posible.

error 032: array index out of bounds (variable "a")

Asн que... tйcnicamente se deberнa usar {}.

Prueben:

pawn Код:
new a[MAX_PLAYERS char];
new b[MAX_PLAYERS];
printf("a: %i - b: %i", sizeof(a), sizeof(b));
   
a{499} = 1;
printf("%i", a{499});
a[125] = 1;
printf("%i", a[125]);
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)