Como hacer esto? Array...
#1

Hola, hace mucho rato no toco ningъn lenguaje de programaciуn orientado a objetos, con lo cual he olvidado muchas cosas y este es uno de ellos...

Resulta que hice una array larga con categorias para muebles en un sistema de furniture que estoy haciendo, lo que hago es extraer de esa array todas las categorias y luego con dos loops saltarme las categorias repetidas, para asн en un dialogo mostrar todas las categorias (Sin repetirse ninguna), el problema yace en que es en dialogo, y por obvias razones al presionar clic en algъn listitem del dialogo me trae el listitem 0 , 1 ,2 ,3 y asн... El problema es que estoy haciendo esto:
pawn Код:
Datamuebles[listitem][dmCategoria]
para ver a que categoria le di clic, me trae la categoria que no es al presionar clic, pues con estos loops lo que hice fue hacer "continue;" para saltarme las arrays repetidas, con lo cual: La categoria Cuadros la categoria de este es la id 46 en la array, entonces... Al dar clic en algun item del listado de este dialogo me estarнa trayendo la categorнa digamos 0,1,2,3 pero no me trae la categoria correcta, pues haciendo esto estarнa trayendo asн:
pawn Код:
Datamuebles[0]["Cuadros"]
Y para que esto funcionara con el continu que hice, serнa algo como:
pawn Код:
Datamuebles[46]["Cuadros]
intentй hacer esto para asignar digamos 0,1,2,3 al listitem y luego al dar listitem simplemente me traerнa el que es, pero esto no funciona por obvias razones
pawn Код:
new bool:detectarcrepetida = true;
    for (new x = 0; x < sizeof(Datamuebles); x++)
    {
        for (new xx = 0; xx < x; xx++)
        {
            if (strfind(Datamuebles[x][dmCategoria], Datamuebles[xx][dmCategoria]) == 0)
            {
                detectarcrepetida = false;
                break;
            }
        }
        if (detectarcrepetida == false)
        {
            detectarcrepetida = true;
            continue;
        }
        for(new i=0; i < 11; i++) Mobiliario_listitems[i] = x;
    }
La manera en la que muestro las categorias es esta:
pawn Код:
new string[800], fullstr[800];
        format(string,sizeof(string), "{FFFFFF}Categoria\n");
            strcat(fullstr, string);
                new bool:detectarcrepetida = true;
        for (new x = 0; x < sizeof(Datamuebles); x++)
        {
            for (new xx = 0; xx < x; xx++)
            {
                if (strfind(Datamuebles[x][dmCategoria], Datamuebles[xx][dmCategoria]) == 0)
                {
                    detectarcrepetida = false;
                    break;
                }
            }
            if (detectarcrepetida == false)
            {
                detectarcrepetida = true;
                continue;
            }
            format(string, sizeof(string), "%s:%d\n",Datamuebles[x][dmCategoria],x);
            strcat(fullstr, string);
        }
        ShowPlayerDialog(playerid, DIALOGO_MOBILIARIO_CATEGORIA, DIALOG_STYLE_TABLIST_HEADERS, "{979A38}Categorias - Mobiliario", fullstr, "Seleccionar", "Cancelar");
    }
Lo habнa sacado de ejemplo de un cуdigo de C , aunque tiempo despuйs alguien me respondiу con cуdigo similar en una publicaciуn que hice para lograr esto...
Bueno , la pregunta es:

- como puedo arreglar esto para que me asigne del 0 al 11 las categorias traнdas con el primer cуdigo que pase?
pues al intentarlo me sucede esto:


y es obvio el por quй, y se debe a que se traen 10 categorias, y al haber ese for antes se muestra 10 veces las ids de las categorias que estan en la array, lo que yo quiero es irme del 0 al 11 , asignandole a cada uno la variable correspondiente, quisiera algo asн:



Muchas gracias si alguien me puede ayudar y si me entienden!
Reply
#2

Una manera es utilizando una pvar, otra forma seria utilizando inputtext en ondialogresponse ya que inputtext en un dialogo tipo LIST devuelve el texto seleccionado

PHP код:
new ids[256]; //Creamos un array para almacenar las ids
new string[800], fullstr[800];
format(string,sizeof(string), "{FFFFFF}Categoria\n");
strcat(fullstrstring);
new 
bool:detectarcrepetida true;
for (new 
0sizeof(Datamuebles); x++)
{
    for (new 
xx 0xx xxx++)
    {
        if (
strfind(Datamuebles[x][dmCategoria], Datamuebles[xx][dmCategoria]) == 0)
        {
            
detectarcrepetida false;
            break;
        }
    }
    if (
detectarcrepetida == false)
    {
        
detectarcrepetida true;
        continue;
    }
    
format(ids,sizeof(ids),"%s%d ",ids,x); //Almacenamos las ids
    
format(stringsizeof(string), "%s:%d\n",Datamuebles[x][dmCategoria],x);
    
strcat(fullstrstring);
}
SetPVarString(playerid,"CATEGORIA_IDS",ids); //Las guardamos en una Pvar
ShowPlayerDialog(playeridDIALOGO_MOBILIARIO_CATEGORIADIALOG_STYLE_TABLIST_HEADERS"{979A38}Categorias - Mobiliario"fullstr"Seleccionar""Cancelar");
//Donde cargas los datos
new ids_string[256],ids[100];
GetPVarString(playerid,"CATEGORIA_IDS",ids_string,sizeof ids_string); //Recuperamos los datos de la pvar
sscanf(ids_string,"a<i>[100]",ids); //con sscanf recuperamos los datos en un array
printf("Categoria seleccionada: %d",ids[listitem]); 
Reply
#3

Quote:
Originally Posted by Daniel-92
Посмотреть сообщение
Una manera es utilizando una pvar, otra forma seria utilizando inputtext en ondialogresponse ya que inputtext en un dialogo tipo LIST devuelve el texto seleccionado

PHP код:
new ids[256]; //Creamos un array para almacenar las ids
new string[800], fullstr[800];
format(string,sizeof(string), "{FFFFFF}Categoria\n");
strcat(fullstrstring);
new 
bool:detectarcrepetida true;
for (new 
0sizeof(Datamuebles); x++)
{
    for (new 
xx 0xx xxx++)
    {
        if (
strfind(Datamuebles[x][dmCategoria], Datamuebles[xx][dmCategoria]) == 0)
        {
            
detectarcrepetida false;
            break;
        }
    }
    if (
detectarcrepetida == false)
    {
        
detectarcrepetida true;
        continue;
    }
    
format(ids,sizeof(ids),"%s%d ",ids,x); //Almacenamos las ids
    
format(stringsizeof(string), "%s:%d\n",Datamuebles[x][dmCategoria],x);
    
strcat(fullstrstring);
}
SetPVarString(playerid,"CATEGORIA_IDS",ids); //Las guardamos en una Pvar
ShowPlayerDialog(playeridDIALOGO_MOBILIARIO_CATEGORIADIALOG_STYLE_TABLIST_HEADERS"{979A38}Categorias - Mobiliario"fullstr"Seleccionar""Cancelar");
//Donde cargas los datos
new ids_string[256],ids[100];
GetPVarString(playerid,"CATEGORIA_IDS",ids_string,sizeof ids_string); //Recuperamos los datos de la pvar
sscanf(ids_string,"a<i>[100]",ids); //con sscanf recuperamos los datos en un array
printf("Categoria seleccionada: %d",ids[listitem]); 
Muchнsimas gracias! probarй y analizarй bien el cуdigo para un futuro necesitar algo parecido, excelente.
Reply
#4

Quote:
Originally Posted by Juand
Посмотреть сообщение
Muchнsimas gracias! probarй y analizarй bien el cуdigo para un futuro necesitar algo parecido, excelente.
Dale espero te sirva.
Reply
#5

Quote:
Originally Posted by Daniel-92
Посмотреть сообщение
Dale espero te sirva.
Muchas gracias, si me funcionу... Querнa saber algo ademбs, si podrнas responderme:
Hay alguna manera de obtener de que tamaсo es ese setpvar? digamos... El setpvar de categoria "otros" tiene 7 items, el de "Cuadros" tiene 10, como podrнa saber cuanto tiene cada uno?, o sea, cuantos datos... porque digamos al pasarme con el ids[id] en "otros" a mas de 7 me trae el valor de la array de la primera.


EDIT: ya lo resolvн a mi modo , muchas gracias
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)