Autor Tema: ayuda en manejo de arreglos dinamicos(resuelto)  (Leído 4727 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado rolansel

  • PIC10
  • *
  • Mensajes: 25
ayuda en manejo de arreglos dinamicos(resuelto)
« en: 21 de Noviembre de 2011, 23:14:10 »
hola estoy tratando de entender el menjo de arreglos dinamicos hice este codigo pero me arroja una excepcion que estoy haciendo mal?
estoy usando devC++

int main(int argc, char *argv[])
{
    int* cadena=NULL;
    int i;
    for(i=0;i<9;i++){
    cadena=new int;
    cadena=i;
    cout<<cadena;}
    delete[]cadena;
    
    
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
« Última modificación: 27 de Noviembre de 2011, 18:29:13 por rolansel »

Desconectado rolansel

  • PIC10
  • *
  • Mensajes: 25
Re: ayuda en manejo de arreglos dinamicos
« Respuesta #1 en: 21 de Noviembre de 2011, 23:52:52 »
bueno al parecer ya le encontre pues estaba  comenzando desde la locacion 0 cuando se supone que esa ya la habia inicializado asi que le puse un mas uno en la asignacion quedo asi:

int main(int argc, char *argv[])
{
    int* cadena=NULL;
    int i;
    for(i=0;i<9;i++){
    cadena=new int;
    cadena=i;
    cout<<cadena;}
    delete[]cadena;
   
   
   
    system("PAUSE");
    return EXIT_SUCCESS;
}


pero resulta que cuando trato de imprimir esos valores me da algo desconocido
ejemplo:

int main(int argc, char *argv[])
{
    int* cadena=NULL;
    int i;
    for(i=0;i<9;i++){
    cadena=new int[i+1];
    cadena=i;
    }
    cout<<cadena[5];
    cout<<" ";
    cout<<cadena[6];
   
    system("PAUSE");
    delete[]cadena;
    return EXIT_SUCCESS;
}
la salida me da

1896619491 -1679848303
realmente muy misterioso ya que me debia imprimir 6 7

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: ayuda en manejo de arreglos dinamicos
« Respuesta #2 en: 22 de Noviembre de 2011, 00:17:57 »
Esto esta mal, no podes igualar un entero a un puntero a entero, son distintos tipos
Código: [Seleccionar]
cadena=i;
probablemente hayas querido poner
cadena=i;
o
*(cadena+i)=i;

Ademas en cada ciclo del for, estas apuntando a un nuevo arreglo, y perdes referencia del anterior.
Saludos!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: ayuda en manejo de arreglos dinamicos
« Respuesta #3 en: 22 de Noviembre de 2011, 00:33:10 »
Ya te contesto gera, solo aporto un comentario a tu codigo...

Código: C
  1. int main(int argc, char *argv[])
  2. {
  3.     // cadena apunta a un entero
  4.     // haciendo cadena++ apuntara al proximo como si fuera un vector
  5.     int *cadena;
  6.     int i;
  7.    
  8.     // new int[10] reserva memoria para 10 enteros consecutivos y
  9.     // nos retorna la direccion del primero de ellos, por eso podemos
  10.     // asignar ese valor a cadena (puntero a int)
  11.     cadena = new int[10];
  12.    
  13.     // podemos tratar a cadena como un vector (un array), no por la
  14.     // asignacion que hicimos previamente, sino porque fue declarado
  15.     // como tal (puedes ver K&R, Cap 5)
  16.    
  17.     for(i=0; i<9; i++){
  18.             cadena[i] = i;
  19.             cout << cadena[i] << " ";
  20.             // si hago 'cout << cadena;' estoy mostrando una dirección de memoria,
  21.             // y no el valor almacenado en ella, ya que cadena es eso, una dirección.
  22.     }
  23.    
  24.     delete cadena;
  25.     cout << endl;
  26.    
  27.     //system("PAUSE");
  28.     return 0;
  29. }
@fabianjsm is on twitter

Desconectado rolansel

  • PIC10
  • *
  • Mensajes: 25
Re: ayuda en manejo de arreglos dinamicos
« Respuesta #4 en: 22 de Noviembre de 2011, 04:05:34 »
la verdad les agradesco mucho que me esten orientando y tambien pido disculpa por que tras releer el post me di cuenta de que no mencione lo que pretendo hacer.

necesito recibir una serie de datos,  no tengo forma de conocer la longitud del arreglo hasta haber recibido los datos en la ejecucion, lei que por eso necesito usar la instruccion new hasta ahora he estado ensayando codigo y lo mas cerca es  esto,

 #include <cstdlib>
#include <iostream>
#include<memory>
#include<new>
int *cadena=NULL;
int i=0;
int a=0;
int b=27;
using namespace std;
int main(int argc, char *argv[])
{
     while(a!=b){
    cout<<"introdusca el dato";
    cin>>a;
    i++;
    cadena=new int;
    cadena=a;
    }
    
    cout<<cadena[6];
    system("PAUSE");
    delete[]cadena;
    return EXIT_SUCCESS;
}
pero no me guarda los datos que deseo y se traba

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: ayuda en manejo de arreglos dinamicos
« Respuesta #5 en: 22 de Noviembre de 2011, 11:48:06 »
Cuando no sabes que longitud va a tener la estructura, y necesitas que crezca conforme van llegando los datos, se utilizan estructuras dinamicas (colas, pilas, listas, arboles, etc...). Como no podes asegurar un espacio de memoria vacio donde puedas seguir agregando cosas, utilizas el espacio que hay, luego buscas otro "hueco" en la memoria, y para mantener registro de esos lugares de memoria utilizas punteros.
Pegale una leida a esto, explica de principio a fin como se hace. http://c.conclase.net/edd/
Saludos!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado rolansel

  • PIC10
  • *
  • Mensajes: 25
Re: ayuda en manejo de arreglos dinamicos
« Respuesta #6 en: 27 de Noviembre de 2011, 18:24:32 »
Gracias por ponerme en el camino, finalmente mi codigo quedo asi, aunque hubiera sido un plus poner que terminara con la tecla Esc


#include <cstdlib>
#include <iostream>
#include<vector>

int i=0;
int a=0;
int b=999;
using namespace std;
vector<int> cadena;

int main(int argc, char *argv[])
{
   cout<<"Programa que captura datos en un Vector\n\nescribe 999 para terminar\n\n\n";
     while(a!=b){
    cout<<"introdusca el dato: ";
    cin>>a;
    cadena.push_back(a);
    }
    cadena.pop_back();
    int m=cadena.size();
    for (int i=0;i<m;i++)
    {cout<<cadena[ i ];cout<<" ";}
    system("PAUSE");
   
   
    return EXIT_SUCCESS;
}


 :-/
« Última modificación: 27 de Noviembre de 2011, 18:28:03 por rolansel »