• Domingo 19 de Mayo de 2024, 08:41

Autor Tema:  Utilizar extern con una matriz dinamica de texto  (Leído 2182 veces)

kaito

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Utilizar extern con una matriz dinamica de texto
« en: Viernes 20 de Marzo de 2009, 22:55 »
0
Saludos.

El siguiente código:

Código: C++
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. extern char *cadena;
  7.  
  8. void funcion() {
  9.    char (*cadena)[10]=new char [2][10];
  10.    strcpy (cadena[0],"Uno");
  11.    strcpy (cadena[1],"Dos");
  12. }
  13.  
  14. void main () {
  15.    funcion();
  16.    cout << cadena[0] << endl;
  17.    cout << cadena[1] << endl;
  18. }
  19.  

Genera el siguiente error de compilación: error LNK2001: símbolo externo "char * cadena" (?cadena@@3PADA) sin resolver.
                                                              fatal error LNK1120: 1 externos sin resolver

En el código que estoy desarrollando, la función se encargaria de leer las cadenas de texto de un archivo. El primer dato del archivo es un valor entero que indica el número de cadenas en el archivo y será utilizado para declarar la dimensión de la matriz de memoria dinámica.

He buscado en varios libros y sitios webs pero no he visto ningun ejemplo parecido. Gracias de antemano.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Utilizar extern con una matriz dinamica de texto
« Respuesta #1 en: Viernes 20 de Marzo de 2009, 23:12 »
0
¿Tenes otro modulo de codigo (.c/.cpp)? La declaracion con extern hace que el enlazador busque ese simbolo en otro modulo sino era esa la intencion sacalo, extern se suele usar en las cabeceras (.h) para compartir un simbolo entre modulos, el modulo que lo define no lo debe llevar.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

kaito

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Utilizar extern con una matriz dinamica de texto
« Respuesta #2 en: Sábado 21 de Marzo de 2009, 10:00 »
0
Cita de: "Eternal Idol"
extern se suele usar en las cabeceras (.h) para compartir un simbolo entre modulos

Gracias por contestar.

Mi intención es poder utilizar la matriz de memoria dinámica local de la función en el bloque principal main, si es posible.

Efectivamente, he visto la utilización de la sentencia extern en un archivo de cabecera. Entendí en la ayuda de VC++ y por el ejemplo, que se utilizaba para hacer global una variable local o declarada en otro lugar del código o  función.

No sé si se puede convertir una variable de memoria dinámica (matriz) local en global.

En los código que he encontrado, se ha utilizado variables o incluso estructuras de memoria estática , declaradas al inicio del código y posteriormente utilizadas en una función encargada de realizar algún proceso del programa.

Pero con matrices de memoria dinámica, no.


Saludos.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Utilizar extern con una matriz dinamica de texto
« Respuesta #3 en: Sábado 21 de Marzo de 2009, 10:09 »
0
El extern ahi no te sirve de nada, sacandolo tendras un puntero a char y su ambito sera todo el modulo.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

kaito

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Utilizar extern con una matriz dinamica de texto
« Respuesta #4 en: Sábado 21 de Marzo de 2009, 12:11 »
0
Cita de: "Eternal Idol"
El extern ahi no te sirve de nada, sacandolo tendras un puntero a char y su ambito sera todo el modulo.

He compilado el código:

Código: C++
  1.  
  2. #include <iostream>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. char *cadena;
  8.  
  9. void funcion() {
  10.    int VariableIndice=2;
  11.    char (*cadena)[10]=new char [VariableIndice][10];
  12.    strcpy (cadena[0],"Uno");
  13.    strcpy (cadena[1],"Dos");
  14. }
  15.  
  16. void main () {
  17.    funcion();
  18.    cout << cadena[0] << endl;
  19.    cout << cadena[1] << endl;
  20. }
  21.  
  22.  

Y produce error de ejecución: Excepción no controlada en 0x0......:Infracción de acceso al leer la ubicación 0x000000000.

Intento mostrar el texto asignado a cadena en la funcion, desde la funcion principal main como si fuera una variable global.

Entiendo, que la matriz dinámica deja de ser visible al finalizar funcion();, como debería declarar la matriz dinámica para que fuera visible desde main.

Saludos.


PD.: Por favor, eliminen los dos mensajes anteriores, he pulsado el botón citar, en lugar de editar. :comp:

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Utilizar extern con una matriz dinamica de texto
« Respuesta #5 en: Sábado 21 de Marzo de 2009, 14:04 »
0
Como veo que usas C++, te aconsejo que uses la clase string (#include <strings>) en vez de char *. Mucho más fácil de usar y es estándar.

Esto está mal:

Código: C
  1. char *cadena;
  2.  
porque tú lo que quieres es un puntero a un array de punteros, esto es:

Código: C
  1. char *cadena[];
  2. //O también:
  3. char **cadena;
  4.  
Salud

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Utilizar extern con una matriz dinamica de texto
« Respuesta #6 en: Sábado 21 de Marzo de 2009, 15:33 »
0
Siendo char **cadena;
Código: C++
  1. cadena = new char*[VariableIndice];
  2. for (int i = 0; i < VariableIndice; i++)
  3. {
  4.   cadena[i] = new char[10];
  5. }
  6.  

Primero reservas memoria para los punteros (cada uno es un char **) y despues para cada cadena que corresponde a cada elemento (char *) de la variable cadena.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

kaito

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Utilizar extern con una matriz dinamica de texto
« Respuesta #7 en: Sábado 21 de Marzo de 2009, 15:48 »
0
Cita de: "m0skit0"
Esto está mal:

Código: C
  1. char *cadena;
  2.  
porque tú lo que quieres es un puntero a un array de punteros, esto es:

Código: C
  1. char *cadena[];
  2. //O también:
  3. char **cadena;
  4.  

Al utilizar char *cadena[]; ha producido el error C2440: '=' : no se puede realizar la conversión de 'char (*)[10]' a 'char *[]'

Después, modifique la declaración por char (*cadena)[10];

Utilizando esta forma en la declaración de la variable, he desarrollado dos opciones:

A) Declarar una variable global al incio del codigo/Asignar con una igualdad los valores de la matriz local.

Código: C++
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. char (*cadena)[10];
  6.  
  7. void funcion(){
  8.     int VariableIndice=2;
  9.     char (*Cadena)[10]=new char [VariableIndice][10];
  10.     strcpy(Cadena[0],"Uno");
  11.     strcpy(Cadena[1],"Dos");
  12.     cadena=Cadena;
  13. }
  14.  
  15. void main() {   
  16.     funcion();
  17.     cout << cadena[0] << endl;
  18.     cout << cadena[1] << endl;
  19. }
  20.  



b) Utilizar una variable global al inicio del código/Dentro de la funcion eliminar con delete y redimensionar:

Código: C++
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. char (*cadena)[10]=new char [1][10];
  6.  
  7. void funcion(){
  8.     int VariableIndice=2;
  9.     delete [] cadena;
  10.     char (*cadena)[10]=new char [VariableIndice][10];
  11.     strcpy(cadena[0],"Uno");
  12.     strcpy(cadena[1],"Dos");
  13. }
  14.  
  15. void main() {   
  16.     funcion();
  17.     cout << cadena[0] << endl;
  18.     cout << cadena[1] << endl;
  19. }
  20.  


Las dos formas funcionan correctamente. Pero :brickwall: en la opción A asigno las direcciones a memoria de una variable local, que no es visible o desaparece al salir de la función. ¿Podría ocurrir que durante la ejecución de otros procesos del programa se modificasen los valores de esas direcciones a memoria?.