• Domingo 15 de Diciembre de 2024, 00:29

Autor Tema:  Malloc A Variable Global Desde Funcion? Como?  (Leído 1428 veces)

Penny

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Malloc A Variable Global Desde Funcion? Como?
« en: Martes 20 de Enero de 2004, 18:01 »
0
Hola,

tengo una variable global, un puntero a caracter char *vector, y necesito una función que, pasándole 2 números enteros n1 y n2, me reserve memoria dinámica para un vector de n1xn2 caracteres en la variable *vector.

Cómo lo hago?? Sólo he conseguido errores de acceso a memoria ...

Gracias por adelantado.

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Malloc A Variable Global Desde Funcion? Como?
« Respuesta #1 en: Martes 20 de Enero de 2004, 18:43 »
0
Hola

Para reservar memoria para una matriz y asignarla a una variable de tipo char* (en vez de char** que sería lo de esperar) has de hacerlo así:
Código: Text
  1.  
  2. vector = (char*) malloc(n1*n2*sizeof(char));
  3.  
  4.  
Una vez reservada la memoria, el acceso a una posición x,y de la matriz sería:
Código: Text
  1.  
  2. valor = vector[y*n1+x];
  3.  
  4.  

Funcionará siempre y cuando n1 sea la anchura, n2 la altura, x se refiera a posición horizontal e y a la posición vertical. El rango para x será [0,n1-1] y el rango de y [0,n2-1].

Espero que te sirva de ayuda.

Un saludo.

Ruben3d

Penny

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Malloc A Variable Global Desde Funcion? Como?
« Respuesta #2 en: Martes 20 de Enero de 2004, 19:06 »
0
ante todo, gracias por contestar.

Realmente, mi problema no es cómo asignar la memoria dinámica, sino cómo crear una función que lo haga. Sólo supongo que debo pasarle como argumento *vector, n1, n2.... pero no sé si debe ser del tipo void, o debe retornar algo...

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Malloc A Variable Global Desde Funcion? Como?
« Respuesta #3 en: Martes 20 de Enero de 2004, 19:19 »
0
Si dices que vector es una variable global no hace falta pasarla como parámetro. La función podría ser así:
Código: Text
  1.  
  2. void ReservarMemoriaGlobal(int n1, int n2)
  3. {
  4.     vector = (char*) malloc(n1*n2*sizeof(char));
  5. }
  6.  
  7.  

En caso de que no quisieras la variable global, sino local, habrías de hacerlo así:
Código: Text
  1.  
  2. void ReservarMemoriaLocal(char **vector, int n1, int n2)
  3. {
  4.     *vector = (char*) malloc(n1*n2*sizeof(char));
  5. }
  6.  
  7.  

y se llamaría a la función así:
Código: Text
  1.  
  2. ReservarMemoriaLocal(&vector, n1, n2);
  3.  
  4.  

Espero que te sirva.

Un saludo.

Ruben3d

Penny

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Malloc A Variable Global Desde Funcion? Como?
« Respuesta #4 en: Martes 20 de Enero de 2004, 19:46 »
0
como tu dices:
Código: Text
  1. void ReservarMemoriaGlobal(int , int );
  2.  
  3. void ReservarMemoriaGlobal(int n1, int n2)
  4. {
  5.    vector = (char*) malloc(n1*n2*sizeof(char));
  6. }
  7.  
  8. void main()
  9. {
  10. char *vector;
  11. int x=4,y=4;
  12.  
  13. printf("\n\nStart\n");
  14. ReservarMemoriaGlobal(x,y);
  15. printf("\n\nEnd");
  16. }
  17.  


estos son los resultados:

error: 'vector' undeclared identifier
error: '=' cannot convert from 'char *' to 'int' This Conversion requires a reinterpret_cast, a C-style cast or a function-style cast


que hay mal??

QliX=D!

  • Miembro MUY activo
  • ***
  • Mensajes: 214
    • Ver Perfil
Re: Malloc A Variable Global Desde Funcion? Como?
« Respuesta #5 en: Martes 20 de Enero de 2004, 21:31 »
0
Pero estas compilando en C++
Usa new y delete.
Si no, cambiale el nombre a .c y no a .cpp al archivo, o revisa de usar el compilador de C y no el de C++ para procesar los archivos.
(gcc = C, g++ = C++)
QliX=D! - From the top of Tsunami

Penny

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Malloc A Variable Global Desde Funcion? Como?
« Respuesta #6 en: Martes 20 de Enero de 2004, 21:32 »
0
de acuerdo, problema solucionado.

Miles de gracias por tu interés   :)