• Domingo 22 de Diciembre de 2024, 14:46

Autor Tema:  Memoria Dinamica  (Leído 6543 veces)

jodijo5

  • Miembro HIPER activo
  • ****
  • Mensajes: 518
  • Nacionalidad: pe
    • Ver Perfil
    • http://www.bluetecnologia.com
Memoria Dinamica
« en: Martes 2 de Noviembre de 2004, 23:51 »
0
hola amigos, queria preguntar  como se hace para asignar memoria dinamica a un array multidimensional por ejemplo
a un
int n;
que le puedo poner un n[8][10] por ejemplo
a tambien a un objeto "n" que le puedo pooner un n[20];
=============================
Daniel Pomalaza Mendoza
visita el Dinosaurio Azul :-D
http://bluetecnologia.com

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Memoria Dinamica
« Respuesta #1 en: Miércoles 3 de Noviembre de 2004, 15:17 »
0
Hola

creo q seria algo asi:

int(*matriz)[8]=new int [8][10]; // 8 vectores de 10 componentes

Un saludo :hola:

patitofeo

  • Miembro MUY activo
  • ***
  • Mensajes: 145
    • Ver Perfil
Re: Memoria Dinamica
« Respuesta #2 en: Jueves 4 de Noviembre de 2004, 12:51 »
0
No es asi exactamente.

Para utilizar memoria dinamica debes utilizar alguna funcion que la reserve como malloc o alloc.

La solución que te da diodo no es de todo correcta. Diodo esta creando un vector dinamico de vectores estaticos y personalmente no se para que puede servir eso. Me parece un poco ridiculo.

tu deberias hacer una declaración del tipo

int **n;

y luego malloc para hacer la reserva de memoria dinámica.

Todo esto está esplicado ya en el foro a si que te dejo que lo consultes por que yo no soy muy buen esplicador.


Saluditos :hola:

jodijo5

  • Miembro HIPER activo
  • ****
  • Mensajes: 518
  • Nacionalidad: pe
    • Ver Perfil
    • http://www.bluetecnologia.com
Re: Memoria Dinamica
« Respuesta #3 en: Jueves 4 de Noviembre de 2004, 18:27 »
0
no problem amigos gracias diodo , gracias patitio feo
aver voy a buscar esea discucion, si no la encuentro agradeceria que si pueden me den un ejemplo para enteder bien eso.
=============================
Daniel Pomalaza Mendoza
visita el Dinosaurio Azul :-D
http://bluetecnologia.com

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Memoria Dinamica
« Respuesta #4 en: Jueves 4 de Noviembre de 2004, 22:22 »
0
Hola , como el sr pato  :lightsabre:  me ha hecho dudar de si estaba bien o mal he ido a ver los apuntes de mi escuela y esto es lo que pone:

2.9.1 El operador new.

El operador new es semejante a la función malloc aunque como se verá a lo largo del
curso no se limita exclusivamente a realizar la reserva de memoria. Por ahora se considerará
que permite asignar memoria perteneciente al área de almacenamiento libre para un objeto o
para una matriz de objetos –de momento entiéndase por objeto una variable.
Cuando se reserva memoria para un solo objeto, el tamaño de memoria necesario para
realizar dicho almacenamiento se determina directamente en función del tipo de dicho objeto.
Por este motivo, la sintaxis es la siguiente:

Código: Text
  1. int *a,*b;
  2. a=new int;
  3. b=new (int);
  4.  

El ejemplo muestra dos posibles sintaxis para la misma operación. Ambas son
equivalentes. Es posible, como se ha visto, realizar la declaración de un puntero y la reserva de
memoria en la misma sentencia:
int *a = new int;
La llamada al operador new devuelve un puntero al espacio de memoria reservado,
siendo el puntero del tipo especificado. Por este motivo, a diferencia de la función malloc no es
necesario realizar el cast (conversión forzada) al puntero retornado. Si no hubiera espacio para
la reserva de memoria, el operador devuelve un puntero NULL si no se utilizan las excepciones
(se verá más adelante).
Cuando el operador new reserva memoria para una matriz, el tipo de datos que
devuelve es del tipo de la dirección al primer elemento de la matriz. Se suele considerar por
este motivo como un operador distinto, aunque en el fondo es el mismo modo de
funcionamiento que en la instrucción malloc de C.
Así, los siguientes ejemplos muestran como crear vectores y matrices dinámicamente
con el operador new:

Código: Text
  1.  
  2.  
  3. 1 int num=6,i;
  4. 2 int *a = new int;
  5. 3 int *b = new int[num];
  6. 4 int (*c)[3] = new int[8][3];
  7. 5 int *d[3];
  8. 6 for(i=0;i<3;i++)d[i]=new int[8];
  9.  
  10.  
  11.  

En este ejemplo se ha establecido la comparación entre la reserva de memoria para un
solo objeto o variable (linea 2), y la reserva de memoria de vectores. En el caso de los vectores
el modo de proceder es exactamente igual que en C. Un vector al final es un puntero que
apunta a una zona de memoria en donde comienzan a situarse los elementos del vector de
forma ordenada. De tal forma, que la dirección corresponde con la del primer elemento y tiene
por tanto este tipo. Recordemos, que la razón principal para proceder así, esta en la aritmética
de punteros y en los sistemas de indireccióin, logrando de esta forma que uno de los
mecanismos básicos del lenguaje tenga correspondencia directa con el modo de
funcionamiento de un microprocesador.
Obsérvese a su vez como al igual que en C internamente no existen matrices de
elementos de más de una dimensión, sino que todo se considera como vector. En el caso de una
matriz de dos dimensiones en C y C++ se consideran como un vector de vectores. Esto es lo
que aparece reflejado en la línea 4. Aunque a la derecha la petición aparece con el aspecto de
una matriz de 8 por 3, lo que entiende C (y eso es lo que se refleja a la izquierda) es que se está
solicitando un vector de vectores de tres enteros, por lo que la dirección de retorno es la de
vector de tres enteros. Este modo de lectura, ampliamente recomendado, se logra si se siguen
las reglas de asociatividad de los corchetes. El operador new, considera sólo los primeros
corchetes, lo demás corresponde al tipo básico del vector.
Puesto que los corchetes tienen preferencia sobre el operador *, es necesario poner los
paréntesis, para que el compilador entienda que c –linea 4- es un puntero (primero se lee lo que
hay entre paréntesis) a vectores de tres enteros.
Por el contrario, en la línea 5, el compilador entiende que d es un vector –tienen
preferencia los corchetes frente al asterisco- de tres punteros a entero. Que evidentemente es
distinto al caso anterior.
Para finalizar este operador al que más adelante se irá haciendo referencia, se
comentarán para darle una forma más completa, los aspectos que lo hacen diferente y mejor a
la función estándar malloc de C. Las dos últimas características, corresponden a aspectos más
relacionados con la POO:
-El operador new no necesita de la conversión forzada.
- En la generación de un objeto, se realiza una llamada al constructor, e incluso se
permite la inicialización.
- La gestión de errores es mucho mejor, puesto que lanza una excepción (bad_alloc)
cuando hay error, o incluso permite la gestión de los errores de reserva de memoria por medio
de la función set_new_handle.


Esto es todo espero que te sirva de ayuda, y al señor pato :lightsabre:  que se informe mejor antes de hablar, y actualizarse un poco nunca viene mal

Un saludo  :hola:

patitofeo

  • Miembro MUY activo
  • ***
  • Mensajes: 145
    • Ver Perfil
Re: Memoria Dinamica
« Respuesta #5 en: Viernes 5 de Noviembre de 2004, 11:17 »
0
:hola:

Hola diodo, solo quisiera darte las gracias por esa magistral leccion que me diste hoy.

Solo decir, que yo estube enterado en todo momento sobre lo que escribí. Cosa que no se puede decir de tí en el primer post porque:

    :lol: "La cagaste hasta el fondo. Estaba todo mal" :lol:

Después decir de tu segundo post que me parece genial que hayas redactado un buen parrafo de tus apuntes con una opinión muy subjetiva sobre algo que no conoces.

Yo que tu tendria más cuidado con ir aleccionando a gente con conceptos que no dominas porque algún día podrias meter la pata.

Por último espero que jodijo5 utilice C++ poque como trabaje en C no creo que tu ayuda sea todo lo util de que presumes, pero claro, eso tp lo preguntaste.

 :comp:

patitofeo

  • Miembro MUY activo
  • ***
  • Mensajes: 145
    • Ver Perfil
Re: Memoria Dinamica
« Respuesta #6 en: Viernes 5 de Noviembre de 2004, 11:42 »
0
el 27 de mayo se publico un post que esplica todo esto

se llamaba "matriz dinamica, eso"

y fue respondido perfectamente por "BGirl"

ahi esplica como hacerlo con las funciones alloc, malloc, free...

Si programas para C++ puedes usar new como explica diodo.

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Memoria Dinamica
« Respuesta #7 en: Viernes 5 de Noviembre de 2004, 12:59 »
0
Hola de nuevo

Primeramente decir que no estoy intentando aleccionar a nadie, si no que mi intencion es ayudar con lo poco que se.Los apuntes no son mios si no de un Dr ingeniero industrial de la escuela, asi que si ves algo mas te doy su correo y le explicas a el.
Sobre c, o c++, yo no se que esta utilizando jodijo solamente le oriente un poco hacia la reserva de memoria con new que ademas de ser mas simple de usar, es mejor, por muchos motivos.Ademas pienso que aunque este programando en c seguramente lo este haciendo con un compilador que permita c++ que basicamente ahora son todos

Por ultimo decir que te guste o no patito esta linea es de reserva dinamica de memoria para una matriz:

int(*matriz)[8]=new int [8][10];

y no esta mal ¡¡ quizas no sea lo que busque jolijo , pero ese ya no es mi problema.Y mi ayuda creo yo es mas util que la tuya que es basicamente enseñarle a usar el buscador, cosa uqe supongo habra hecho antes de escribir el post.

jolijo Si quieres usar malloc te sirve este codigo que son de 2 tipos diferentes de matrices dinamicas

En las matrices dinámicas, a diferencia de las estáticas, no todos los elementos están guardados en posiciones consecutivas de memoria. La matriz dinámica se define como un vector de punteros a vectores de datos (ej: 5x3):


Código: Text
  1.  
  2.  
  3. // asignación:
  4. int *matriz[5];
  5. for( i=0; i<5; i++ )              
  6.    matriz[i] = (int *) calloc( 3, sizeof(int));
  7.  
  8. // liberación:
  9. for( i=0; i<5; i++ )
  10.    free(matriz[i]);
  11.  
  12.  
  13. También puede crearse definiendo el vector de punteros dinámicamente
  14.  
  15. // asignación:
  16. int **matriz;
  17. matriz = (int **) calloc(5,sizeof(int *));
  18. for( i=0; i<5; i++ )
  19.    matriz[i] = (int *) calloc( 3, sizeof(int));
  20.  
  21. // liberación:
  22. for( i=0; i<5; i++ )
  23.    free(matriz[i]);
  24. free(matriz);
  25.  
  26.  
  27.  



Asi el sr pato :lightsabre:  estara contento endever ¡¡¡  :devil:

Hasta otra  :kicking:

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Memoria Dinamica
« Respuesta #8 en: Viernes 5 de Noviembre de 2004, 13:15 »
0
Se me olvidaba aqui te dejo unos apuntes con muchos casos de reserva de memoria, incluido la reserva de memoria de matrices 2x2

Espero que te sirva de ayuda  :hola:


PD( Lo siento patito son ejemplos con new  :lol: )
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

patitofeo

  • Miembro MUY activo
  • ***
  • Mensajes: 145
    • Ver Perfil
Re: Memoria Dinamica
« Respuesta #9 en: Lunes 8 de Noviembre de 2004, 12:24 »
0


Citar
int(*matriz)[8]=new int [8][10];

es una reserva dinamica de vectores estaticos, no una matriz dinamica bidimensional. Pero, aunque yo nunca usaria esto, puede valer.

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Memoria Dinamica
« Respuesta #10 en: Lunes 8 de Noviembre de 2004, 17:13 »
0
Cita de: "patitofeo"


Citar
int(*matriz)[8]=new int [8][10];

es una reserva dinamica de vectores estaticos, no una matriz dinamica bidimensional. Pero, aunque yo nunca usaria esto, puede valer.
 :lol:
No hay que ser tan "fundamentalistas" con la reserva de memoria, casi dirían que es una herejía hacer reservas dinámicas de vectores estáticos...  :blink:

Por ejemplo, para ajustar el gamma de una imagen (8 bits por canal) se puede usar un arreglo pequeño de 256 enteros de 1 byte. Siempre tendrá 256 enteros, ni uno menos ni uno más. Otro ejemplo, si tienes dos parámetros tienes un arreglo de 2 dimensiones 256x256 enteros de 1 byte. Claro que en este caso puedes definirlo como un arreglo de 1 dimensión de 2^16 enteros de 1 byte por que se puede usar desplazamientos << para acceder a la posición requerida. También en este caso las dimensiones del arreglo nunca serán ni más ni menos de 2^16 enteros de 1 byte.

En estos casos donde las dimensiones del arreglo NO CAMBIARAN por X o Z razón, pues no tiene sentido buscar 3 pies al gato. ;)

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Memoria Dinamica
« Respuesta #11 en: Martes 9 de Noviembre de 2004, 03:41 »
0
Beno este es mi aporte, amilus ya lo conoce...
esto crea una matriz dinamica, e decir un vector de dos dimenciones en lenguaje c.

se peude decir que es como usar el new, ya que lo puedes hacer en el momento que quieras sin tener que estimar valores esticos en cuanto a la dimenciones del vector(como es habitual en lenguaje c) y aunqeu s crea con apuintadores el resultado es facilmente accesible con la notacion de arrays.

Bueno es un extracto de una publicación que hice en el foro de teleportmedia:

Citar
Asi se redimenciona una matriz en c:

Primero hay que crear un apuntador de apuntadores,

char **matriz;

una vez hecho esto hay que asignar la cantidad de posiciones que deseamos en x, para esto s necesario reservar memoria del tamaño igual a tantas posiciones en x querramos.

como lo que se pretende es 'colgar' en cada posicion x un array del tamaño de y entonces reservamos la memoria para almacenar char *, es decir para almacenar el array.
Código: Text
  1.  
  2. matriz = (char **) malloc( sizeof(char *)*xpos);
  3. //siempre conviene inicializar.
  4. memset(matriz, '&#092;0', sizeof(char *)*xpos);
  5.  
  6.  

ahora ya tenemos listo el eje de las x y procedemos a 'colgarle' a cada apuntador del array otro array , es decir a cada matriz[xpos] le dejamos apuntando aun arreglo del tamaño de ypos asi:
Código: Text
  1.  
  2. for(x=0, x&#60;xpos;x++)
  3. {
  4.   matriz[x] = (char *) malloc( sizeof(char) * ypos);
  5.   memset(matriz[x], '&#092;0', sizeof(char) * ypos);
  6. }
  7.  
  8.  

Ahora se puede accesar a la variable de esta manera:
Código: Text
  1.  
  2. for(y=0;y&#60;ypos;y++)
  3. {
  4.   for(x=0;x&#60;xpos;x++)
  5.   {
  6.      matriz[x][y]='&#092;0';
  7.   }
  8. }
  9.  
  10.  

Con esto es suficiente,  es bueno tener en cuenta que hacer este tipo de cosas baja el renfimeinto de la aplicacion, ya que declarar un array de esta forma:

char mt[20][30];

deja la variable alojada en los registros del procesador es decir en el stack lo cual hace que su acceso sea muy rapido , mientras que al construir espacios de memorioa con malloc lo que se hace es resevar una porcion del heap para la informacion, de esta manera el programa hace doble trabajo ya que cada vez que desee operar sobre estos datos, llevara porciones de infromacion desde el heap hata los registros del procesador.

Sin embargo es algo muy util ya que realmente durante años crei que era imposible de hacer (eso me habian dicho mis profesores) y hoy en dia despues de muchos intentos fallidos y de muchos intentos desistidos en años atras... lo he logrado y quiero compartirlo con ustedes y con todas las personas que lo puedan necesitar.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

patitofeo

  • Miembro MUY activo
  • ***
  • Mensajes: 145
    • Ver Perfil
Re: Memoria Dinamica
« Respuesta #12 en: Martes 9 de Noviembre de 2004, 11:20 »
0
Cita de: "JuanK"
Citar
Con esto es suficiente,  es bueno tener en cuenta que hacer este tipo de cosas baja el renfimeinto de la aplicacion, ya que declarar un array de esta forma:

char mt[20][30];

deja la variable alojada en los registros del procesador es decir en el stack lo cual hace que su acceso sea muy rapido , mientras que al construir espacios de memorioa con malloc lo que se hace es resevar una porcion del heap para la informacion, de esta manera el programa hace doble trabajo ya que cada vez que desee operar sobre estos datos, llevara porciones de infromacion desde el heap hata los registros del procesador.

 :hola:

Bueno, yo también crei que la memoria estatica era más rápida. Eso dice la teoria. Pero yo he trabajado con un compilador (una versión de hace unos años del GCC de GNU) para una máquina pequeñita, que cuando la matriz tenia un indice mayor que [no me acuerdo] utilizaba multiplicaciones para el acceso a las celdas mientras que al trabajar con punteros en la memoria dinámica, solo se utilizan sumas.

El caso es que el resultado es que para las imagenes de (char) 62*82*3 que utilizaba, el acceso a un byte concreto era sobre 7 veces mas rapido con memoria dinamica que sobre estatica. En aquel entonces puse un Post y Ruben3D (seguro queos suena) me contesto en el foro de videojuegos proponiendome lo de utilizar punteros.

Solo es por si os encontrais en el caso, que sepais que la memoria estática en ciertas ocasiones no es más rápida.

jodijo5

  • Miembro HIPER activo
  • ****
  • Mensajes: 518
  • Nacionalidad: pe
    • Ver Perfil
    • http://www.bluetecnologia.com
Re: Memoria Dinamica
« Respuesta #13 en: Martes 9 de Noviembre de 2004, 21:47 »
0
oigan, nunca crei que esta discucion dyrara tanto, despues de la clase magistral de diodo, pos se lució, pero para otra vez seria mejor que no la cague mucho(sin ofender). bueno, gracias amigos,  creo que el tema quedó muy claro despues toda lo expuesto. gracias una vez mas amigos
ahi nos vemos
=============================
Daniel Pomalaza Mendoza
visita el Dinosaurio Azul :-D
http://bluetecnologia.com

piyey

  • Miembro MUY activo
  • ***
  • Mensajes: 101
  • Nacionalidad: ni
    • Ver Perfil
    • Piyeycorp® - La imaginación es el límite
Re: Memoria Dinamica
« Respuesta #14 en: Viernes 12 de Noviembre de 2004, 22:26 »
0
Disculpen mi intromición, pero, esto pareciera que no tratan de ayudar al pobre jodijo5, sino una competencia de conocimiento, no competencia mejor dicho guerra, si hubiera un programa para enviar golpes por la PC ya lo hubieran conseguido para darse de golpes, creo que deberian enfocarse en ayudar si se puede no en tratar de demostrar que uno sabe y que el otro no, o que el otro está equivocado...

Think about it!

See you!!!

Piyey
Si no vives para servir...
no sirves para vivir.


No soy el dueño del mundo...
pero si el hijo del dueño.


Entre la linea que divide la realidad de la ilusión...
se encuentra la imaginación

IlusionLand - Piyey

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Memoria Dinamica
« Respuesta #15 en: Viernes 12 de Noviembre de 2004, 22:43 »
0
Hola  :hola:

Te equivocas, yo por mi parte no intento discutir con nadie y no considero que haya sido una pelea, guerra o como lo quieras llamar, simplemente es una discusion sobre un tema en concreto, ademas de donde mas se aprende es de los pensamientos enfrentados, ¿que pasaria si todos pensaramos igual? asi que te agradezco tu reflexion pero no estoy de acuerdo con ella.

chao  :kicking:

piyey

  • Miembro MUY activo
  • ***
  • Mensajes: 101
  • Nacionalidad: ni
    • Ver Perfil
    • Piyeycorp® - La imaginación es el límite
Re: Memoria Dinamica
« Respuesta #16 en: Viernes 12 de Noviembre de 2004, 22:55 »
0
Se discute a las ideas y pensamientos, no a las personas...

El sabio conoce las cosas, el tonto a las personas!!!
[/size]
Si no vives para servir...
no sirves para vivir.


No soy el dueño del mundo...
pero si el hijo del dueño.


Entre la linea que divide la realidad de la ilusión...
se encuentra la imaginación

IlusionLand - Piyey

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Memoria Dinamica
« Respuesta #17 en: Viernes 12 de Noviembre de 2004, 23:05 »
0
Vaya te has esforzado mucho en buscar 2 frases hechas, que has ido a proverbia.net?  :D Solo que no tienen nada que ver con el tema a tratar, mas suerte la proxima vez, y un consejillo, aprende a pensar por ti mismo ( no te lo tomes a mal pero no aguanto a los que sueltan frases hechas a las primeras de cambio  &lt;_&lt; )

PD: Yo crei que este post habia terminado ya, ...... , por mi parte esta terminado y por la de jolijo quedo claro q tambien, asi que  :hola:  post

buenas noches  :kicking:

piyey

  • Miembro MUY activo
  • ***
  • Mensajes: 101
  • Nacionalidad: ni
    • Ver Perfil
    • Piyeycorp® - La imaginación es el límite
Re: Memoria Dinamica
« Respuesta #18 en: Viernes 12 de Noviembre de 2004, 23:18 »
0
Lamentable... parece que tu resuelves tus cosas solamente insultando a las personas o buscando como hacerlas ver en ridiculo, si esa es tu forma de ser no se te puede criticar, asi eres y asi permaneceras hasta que tu quieras. Conmigo no hay ningun problema!!!, creo que no soy el unico que busca informacion en internet, de hecho esas fraces no las he buscado en prov... no se que, son simples proverbios que uno aprende en su vida cuando se encuentra algun ignorante...

y estoy de acuerdo con que termine aqui esta discusion ya que yo no pertenezco a ella.

 :hola: Buenas tardes (aqui todavía es de tarde 04:20:56 p.m.)  :whistling:

See you!!!
Piyey
Si no vives para servir...
no sirves para vivir.


No soy el dueño del mundo...
pero si el hijo del dueño.


Entre la linea que divide la realidad de la ilusión...
se encuentra la imaginación

IlusionLand - Piyey

patitofeo

  • Miembro MUY activo
  • ***
  • Mensajes: 145
    • Ver Perfil
Re: Memoria Dinamica
« Respuesta #19 en: Martes 16 de Noviembre de 2004, 12:30 »
0
Piyev, colega, creo que el que menos esta ayudando a jodijo eres tu. que nisiquiera vienes hablando de programacion

jodijo5

  • Miembro HIPER activo
  • ****
  • Mensajes: 518
  • Nacionalidad: pe
    • Ver Perfil
    • http://www.bluetecnologia.com
Re: Memoria Dinamica
« Respuesta #20 en: Sábado 4 de Diciembre de 2004, 01:36 »
0
tranquilos amigos, pienso que cada esta aportando su grano, no creo que deban pelearse
por otro lado creo tambien hay que respetar las opiniones de los demas, no digo que esten faltandose unos a otros, sino que talvez este foro no se trata de decir quien aporta menos y quien mas, de todas formas les agradesco su cooperacion
=============================
Daniel Pomalaza Mendoza
visita el Dinosaurio Azul :-D
http://bluetecnologia.com