Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Pasar un array bidimensional de funcion en funcion.

Iniciado por Antares, 16 de Junio de 2003, 01:41:06 AM

« anterior - próximo »

Antares

                                he intentado pasar un array bidimensional pero no lo consigo pues me llegan los valores alterados.





//Declaro un tipo



typedef char (* PTR)[20][5];



//Escribo la funcion en la que se carga el array



PTR CargarConfu(CString sArchConf)

{

static char ArrayConfu[20][5];

               //Cargo el array



               //Lo devuelvo

return(&ArrayConfu);

}



long BuscaTexto(char *pTexto,CString Cad,long PosBus,bool bMays,CString ArchConf)

{

PTR pArCo;

               //Llamo a la funcion y recojo el array

pArCo=CargarConfu("Confundir.dts");



               //Pero no sale

char car;

car=*pArCo[0][0];

car=*pArCo[0][1];

car=*pArCo[0][2];

car=*pArCo[0][3];

car=*pArCo[0][4];

car=*pArCo[0][5];

}





¿Que hago mal? gracias

Antares                                

samsaga2

                                ¿Ya es posible retornar un puntero a una variable estatica guardada en una funcion? Supongo que depende del compilador que se use.

No se para que servira la funcion CargarConfu (cargar configuracion?) pero lo mejor es que le pases a la funcion el buffer a rellenar en lugar de retornar un puntero a una variable estatica:





void CargarConfu(CString sArchConf, char* buffer)

{

   ····

}



Y de esto



typedef char (* PTR)[20][5];



no estoy muy seguro... no estaras haciendo un array de 20x5 de punteros a char en lugar de un puntero a un array de 20x5 chars?                                

MChiz

                                Hola:

Siempre que quieras leer el puntero de un array, NO has de poner el & delante:



PTR CargarConfu(CString sArchConf)

{

  static char ArrayConfu[20][5];

               //Cargo el array



               //Lo devuelvo

  return ArrayConfu;

}



Prueba a ver si era eso lo que te fallaba.                                

Antares

                                samsaga2: Se me olvido citar que uso Visual c++ 6.0.  Y parece que si q es posible pues el codigo es parte de los consejos que me dieron aqui hace unos 6 meses. desde entonces llevo sin programar por motivos que no vienen al caso. pero he vuelto ;)

Como se hace eso de retornar valores declarando las variables a la derecha del nombre de la funcion?

Gracias por las respuestas. Espero algun dia pasarme por aki solo para leer mensajes y dar respuestas. Algun dia :/

En cuanto al consejo de Mchiz voy a probar y luego lo cuento.

Antares                                

deadLock++

                                De última puedes hacer lo siguiente:



struct Loquesea

{

char MiArray[20][5];

};



Loquesea& Foo()

{

static Loquesea lqs;



// cargo el array lqs.MiArray



// Retorno referencia a estructura con array de dos dimensiones

return lqs;

}



Es decir, creas una estructura que contenga tu array y luego retornas una referencia a una variable estática (para no crear una copia temporal del objeto).                                

Antares

                                Cagonla. Ahora no lo puedo probar pq no me carga el archivo en el array. y el otro dia lo cargaba.                                

fiero

                                Hola, primero comentarte 2 errores:

typedef char (* PTR)[20][5];

Con esto creo declaras 100 punteros a char, como ya han dicho

car=*pArCo[0][5];

el cararter
  • [5] no existe, al poner eso en realidad estás apuntando al [1][0].

    CitarComo se hace eso de retornar valores declarando las variables a la derecha del nombre de la funcion?

    Pues utilizando punteros, o sea, en vez de pasar variables a la función, pasas direcciones a variables. No sé si es eso lo que preguntas, pero si quieres rellenar una variable char de 2 dimensiones dentro de una función, solo tienes que pasarsela sin más. Ejemplo:

    void main(void)
    {
       char texto[20][5];

       rellenatexto(texto);

       //Aquí texto[0][3] es igual a 'A'
    }

    void rellenatexto(char textoarellenar[][5])
    {
       //Aquí puedes acceder a toda la matriz 'textoarellenar' que es de 20*5
       //Aunque el nombre de la varieble es diferente, la zona de memoria a
       //la que accede 'textoarellenar' es la misma que 'texto' del main

       textoarellenar[0][3]='A';
    }

    Al declarar la funcion, la primera dimensión del char no se escribe, no hace falta.

    igual me he liado yo y no es eso lo que preguntabas  :-?, ya dirás...

    un saludo                                
www.videopanoramas.com Videopanoramas 3D player

Antares

                                ¿Como se declara un puntero a un array?

Entendido lo del *caracter[0][5]. Supongo que es pq es un puntero Ya que si pones caracter[0][5] devuelve cero ¿no?

Para no liaros dejaremos para mas adelante lo de...

Como se hace eso de retornar valores declarando las variables a la derecha del nombre de la funcion?

Lo que quiero hacer es:
-He echo una funcion para buscar texto ajena al programa(quiero q sea portable)

-Para no distinguir los caracteres con tilde he hecho otra funcion portable que lee los caracteres a confundir de un archivo y devuelve el puntero o el array rellenado.



void main ()

{

   BuscaTexto();

}



void BuscaTexto ()

{

   char Array[20][5];

   Array=CargarConfu();

}



???? CargarConfu()

{

   char ArrayConf[20][5];

   //lo rellenamos con el archivo

   //y lo devolvemos

   return ArrayConf;

}


Esto es basicamente lo que quiero hacer.

Antares                                

samsaga2

                                Realmente necesitas un array bidimensional? Que es exactamente los valores que quieres cargar, el fichero entero de texto o solo valores sueltos?

Por otro lado para retornar parametros a la derecha de la funcion necesitas pasarlos por referencia, es decir, un puntero:



void sumaUno(int* contador) {

   (*contador)++;

}



void main() {

   int contador = 0;



   // Aqui contador es igual a 0

   sumaUno(&contador);

   // Aqui contador es igual a 1

}



Se usa sobretodo para cuando una funcion necesita retornar mas de un valor ya que el metodo return de una funcion solo te deja retornar. Tambien se usa mucho cuando lo que le pasas a la funcion es un puntero a alguna variable ya que retornar de nuevo la variable seria un poco idiota (porque seria retornar el mismo puntero que te pasaron).

Para los que no se haya enterado ^_^' retornar - verbo = return

PD: alguien me confirma que existe el verbo retornar? XD                                

Antares

                                Muy bien explicado lo de retornar sin return ;)

Si no existia el verbo ahora ya existe.

El programa que escribo lo que hace es remplazar texto en multiples archivos. Despues de conseguirlo he hecho yo el motor de busqueda perscindiendo del de windows. Asi puedo meter por ejemplo; en caracteres entre palabras el guion bajo como espacio. Para que reconozca que es una palabra completa Ej: Carpeta_almacen_discos

Una vez conseguido ahora quiero que confunda los caracteres que el usuario le ponga en cierto archivo. por ej las tildes.




uúü

Y asi es el archivo que cargo en el array.

Si lo que hago es cargar el array directamente lo cargara a cada paso de la busqueda, ralentizandola. Y por ahora es tan rapida como la de microsoft.

Las funciones de busqueda y carga de caracteres a confundir quiero que sean portables. Para que lo pueda usar en otros programas. E incluso cuando sepa mas hacer una clase con mi motor de busqueda.

Gracias

Antares                                

Mars Attacks

                                De www.rae.es

retornar.
 
1. tr. devolver (ǁ restituir).
2. tr. Volver a torcer algo.
3. tr. Hacer que algo retroceda o vuelva atrás.
4. intr. Volver al lugar o a la situación en que se estuvo. U. t. c. prnl.
5. intr. ant. volver en sí. Retornar EN sí.

Además, ¿no recordáis aquello de "envase no retornable"? O "El retorno del Jedi" :P                                

Antares

                                Al final he pasado del p return y lo he echo como decia fiero. El modo de mars lo tengo que probar.

Gracias a todos

Saludos                                






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.