elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Asesoria Memoria Dinamica
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Asesoria Memoria Dinamica  (Leído 1,915 veces)
Omar_2013

Desconectado Desconectado

Mensajes: 26


Ver Perfil
Asesoria Memoria Dinamica
« en: 11 Marzo 2014, 21:59 pm »

Hola, estoy haciendo un programa para contar el numero de palabras que tenga una frase, el problema es que por supuesto siempre el numero de palabras varia, por lo que segun pienso yo, hay que usar memoria dinamica

Código
  1. int main(int argc, char *argv[])
  2. {
  3.    char Lectura[200], *PTok, **Palabras=NULL;
  4.    int i=0, j=0, ContPal=1;
  5.  
  6.    cin.getline(Lectura, sizeof(Lectura));
  7.  
  8.    PTok=strtok(Lectura," ");
  9.  
  10.    while ( PTok!= NULL )
  11.    {
  12.          AgrEspacio(Palabras, ContPal);//AgrEspacio Agrega Una Fila De Mas A Palabras
  13.          strcpy( Palabras[i], PTok );
  14.          PTok=strtok(NULL," ");
  15.          i+=1;
  16.          ContPal+=1;
  17.    }
  18.  
  19.    for ( j=0; j<i; j++ )
  20.        cout<<Palabras[j]<<endl;
  21.  
  22.    system("PAUSE");
  23.    return EXIT_SUCCESS;
  24. }


El problema como tal es esa funcion para agregar una fila a la matriz, ya que si compila, pero estoy violando el acceso a la memoria en una parte del codigo de esa funcion

Código
  1. void AgrEspacio ( char **Palabras, int NumPal)
  2. {
  3.     char **TemFilas=new char*[NumPal];
  4.  
  5.     for ( int i=0; i<NumPal; i++ )
  6.     {
  7.         TemFilas[i]=new char[200];  
  8.         TemFilas[i]=Palabras[i];
  9.     }
  10.  
  11.     Palabras=TemFilas;  
  12. }
La verdad este tema de memoria dinamica se me hace un poco dificil de entender, ya que no se bien cuando es correcto usarla, por ejemplo en este ejercicio podria haber creado una matriz estatica como
Código
  1. char Palabras[100][200];
en vez de pensar en memoria dinamica, pero la ventaja es que con esta voy agregando filas a mi matriz cuando lo voy necesitando en vez de declarar una estatica y ocupar memoria que tal vez no usare

Gracias por su tiempo.


En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Asesoria Memoria Dinamica
« Respuesta #1 en: 11 Marzo 2014, 22:20 pm »

no es mas facil un
(usando string.h)
Código
  1. char lectura[200];
  2. int i = 0;
  3. int j = 0;
  4. cin >> lectura;
  5. for(i=0;i<strlen(lectura);i++){
  6.  if(lectura[i]==' ')
  7.    j++;
  8. }
  9. cout >> "hay " >> j >> " palabras";
  10.  

creo que necesita un par de retoques, pero deberia funcionar


En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
Omar_2013

Desconectado Desconectado

Mensajes: 26


Ver Perfil
Re: Asesoria Memoria Dinamica
« Respuesta #2 en: 11 Marzo 2014, 22:25 pm »

Esque la salida del programa deve de ser asi:

Entrada: "Anita Lava La Tina"
Salida: Anita --> 1 vez
           Lava -->  1 vez
           La    -->   1 Vez
           Tina -->  1 Vez
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Asesoria Memoria Dinamica
« Respuesta #3 en: 11 Marzo 2014, 22:33 pm »

Código
  1. void AgrEspacio ( char **Palabras, int NumPal)
  2. {
  3.        char **TemFilas=new char*[NumPal];
  4.  
  5.        for ( int i=0; i<NumPal; i++ )
  6.        {
  7.            TemFilas[i]=new char[200];  
  8.            TemFilas[i]=Palabras[i];
  9.        }
  10.  
  11.        Palabras=TemFilas;  
  12. }

1º Palabras debe pasarse por referencia (&).
2º La igualación TermFilas = Palabras no tiene ningún sentido. Te estas cargando lo que acababas de reservar con new.

Saludos.
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
Omar_2013

Desconectado Desconectado

Mensajes: 26


Ver Perfil
Re: Asesoria Memoria Dinamica
« Respuesta #4 en: 11 Marzo 2014, 22:38 pm »

Lo que queria hacer al igualar
Código:
TemFilas[i]=Palabras[i];
era copiar el contenido ya que
Código:
TemFilas[i]
tiene un espacio de mas y esa es la que quiero usar[/size]
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Asesoria Memoria Dinamica
« Respuesta #5 en: 11 Marzo 2014, 22:54 pm »

No, no haces eso. La función te irá perfectamente así:

Código
  1. void AgrEspacio ( char **&Palabras, int NumPal)
  2. {
  3.    char **TemFilas=new char*[NumPal];
  4.  
  5.    for ( int i=0; i<NumPal; i++ )
  6.    {
  7.        TemFilas[i]=new char[200];  
  8.    }
  9.  
  10.    Palabras=TemFilas;  
  11. }

Aunque yo eliminaria la variable auxiliar:

Código
  1. void AgrEspacio ( char **&Palabras, int NumPal)
  2. {
  3.    Palabras =new char*[NumPal];
  4.  
  5.    for ( int i=0; i<NumPal; i++ )
  6.    {
  7.        TemFilas[i]=new char[200];  
  8.    }
  9. }
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Asesoria Memoria Dinamica
« Respuesta #6 en: 11 Marzo 2014, 22:56 pm »

No es necesario usar memoria dinámica... al menos no es necesario que tú te encargues de ello.

Sería más sencillo usando un vector:

Código
  1. int main(int argc, char *argv[])
  2. {
  3.  char Lectura[200], *PTok;
  4.  vector< string > Palabras;
  5.  int i=0, j=0, ContPal=1;
  6.  
  7.  cin.getline( Lectura, sizeof( Lectura ) );
  8.  
  9.  PTok = strtok(Lectura," " );
  10.  
  11.  while ( PTok != NULL )
  12.  {
  13.     Palabras.push_back( PTok );
  14.     PTok = strtok( NULL, " " );  
  15.  }
  16.  
  17.  for ( int i=0; i < Palabras.size( ); i++ )
  18.    cout<<Palabras[ i ] << endl;
  19.  
  20.  system("PAUSE");
  21.  return EXIT_SUCCESS;
  22. }

Está muy bien que aprendas a usar memoria dinámica es un recurso muy potente... pero si la usas acuérdate de liberarla después.

Lo que queria hacer al igualar
Código:
TemFilas[i]=Palabras[i];
era copiar el contenido ya que
Código:
TemFilas[i]
tiene un espacio de mas y esa es la que quiero usar[/size]

Si tu haces TemFilas = Palabras... teniendo en cuenta que ambas variables son punteros... estás haciendo que el puntero TemFilas apunte a Palabras, en otras palabras:

* situación inicial:
    TemFilas = 0xF093 <-- Basura
    Palabras = 0x1234 <-- Dirección apuntada por el puntero
* Con TemFilas = new char[200]; tenemos
    TemFilas = 0x8000 <-- Posición de inicio del array recién reservado
    Palabras = 0x1234 <-- Dirección apuntada por el puntero
* Con TemFilas=Palabras
    TemFilas = 0x1234 <-- Perdiste toda referencia a la posicion 8000 que es donde está el array recién creado
    Palabras = 0x1234 <-- Dirección apuntada por el puntero

¿Qué quiere decir esto? Lo siguiente. Una vez haces TemFilas = Palabras sucede lo siguiente:

Código
  1. strcpy( Palabras[i], "prueba" );
  2. cout << Palabras[i] << "-" << TemFilas[i] << endl; // Imprime: prueba-prueba
  3. TemFilas[i][2] = '#';
  4. cout << Palabras[i] << "-" << TemFilas[i] << endl; // Imprime: pr#eba-pr#eba

Esto es así porque los dos punteros apuntan a la misma cadena y cualquier cambio en la cadena se ve reflejado en los dos punteros.

« Última modificación: 11 Marzo 2014, 23:13 pm por eferion » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Asesoria Memoria Dinamica
« Respuesta #7 en: 12 Marzo 2014, 04:02 am »

Como ya te comento eferion deberías utilizar la biblioteca estándar de C++. Puedes utilizar las clases vector y string para que ellas se encarguen del manejo de memoria y la clase istringstream para obtener las palabras de la linea. Por ejemplo:
Código
  1. #include <iostream>
  2. using std::cin;
  3. using std::cout;
  4. using std::endl;
  5.  
  6. #include <string>
  7. using std::string;
  8. using std::getline;
  9.  
  10. #include <vector>
  11. using std::vector;
  12.  
  13. #include <sstream>
  14. using std::istringstream;
  15.  
  16. int main()
  17. {
  18.   cout << "Introduce la linea: ";
  19.   string linea;
  20.   getline(cin, linea);
  21.  
  22.   istringstream is(linea);
  23.   vector<string> palabra;
  24.   string aux;
  25.   while (is >> aux)
  26.      palabra.push_back(aux);
  27.  
  28.   // En C++11 se puede utilizar "auto" para abreviar la declaracion
  29.   for (vector<string>::size_type i = 0; i != palabra.size(); ++i)
  30.      cout << i << ": " << palabra[i] << endl;
  31.  
  32.   return 0;
  33. }

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Asignacion Dinamica Memoria
Programación C/C++
charmedever 5 3,457 Último mensaje 21 Octubre 2011, 05:25 am
por charmedever
Memoria dinámica
Programación C/C++
eleon 6 4,834 Último mensaje 24 Enero 2012, 22:17 pm
por Eternal Idol
Memoria dinamica matriz
Programación C/C++
programacion_c 1 2,839 Último mensaje 25 Abril 2012, 00:23 am
por david_BS
[DUDA] Memoria Dinámica en C++
Programación C/C++
Zodiak98 3 2,406 Último mensaje 5 Junio 2013, 18:48 pm
por Zodiak98
Duda Memoria Dinamica
Programación C/C++
Pepe2009 6 2,939 Último mensaje 13 Agosto 2013, 17:59 pm
por Pepe2009
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines