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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Se puede hacer esto ?? .. porque?
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Se puede hacer esto ?? .. porque?  (Leído 5,904 veces)
ThePinkPanther

Desconectado Desconectado

Mensajes: 82



Ver Perfil
Se puede hacer esto ?? .. porque?
« en: 11 Mayo 2013, 00:36 am »

Código:
#include <iostream>

using namespace std;

int main()
{
  int var;
    cin>>var;
    int x[var];
for(int i=0;i<var;i++)
{
  cout<<"Elemento " << i + 1 << " : " ; cin>>x[i];
  cout<<endl;
}

for(int i=0;i<var;i++)cout<<x[i]<<endl;

}


No era que para dimensionar un vector en tiempo de ejecución , se necesitaba reservar memoria dinamica ?? , como puede ser que dimensione un vector con una variable.


En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Se puede hacer esto ?? .. porque?
« Respuesta #1 en: 11 Mayo 2013, 00:46 am »

Se puede, pero debería darte un warning.


En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
ThePinkPanther

Desconectado Desconectado

Mensajes: 82



Ver Perfil
Re: Se puede hacer esto ?? .. porque?
« Respuesta #2 en: 11 Mayo 2013, 00:52 am »

Se puede, pero debería darte un warning.

no tira nada de warning, yo que usaba new para cuando el usuario ingresaba la cantidad de elementos que el arreglo iva a dimensionar como es que se puede, en el libro que estuve leyendo dice , que para declara un arreglo hay que hacerlo con una constante numerica , q puede ser un numero ej vector[30] , o un #define elementos 255 , y despues vector[elementos]; ... ?
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Se puede hacer esto ?? .. porque?
« Respuesta #3 en: 11 Mayo 2013, 01:31 am »

En C++ se puede. En C también a partir del estándar C98.

Es un array de tamaño variable. Antiguamente las variables se creaban al principio de cada llave. Por lo que se necesitaba su tamaño antes de entrar.

Ahora cada variable puede crearse en cualquier línea de código y en cualquier momento.

PD: No da warning, a no ser que tengas un compilador obsoleto o tengas activado warnings de C estricto.
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
ThePinkPanther

Desconectado Desconectado

Mensajes: 82



Ver Perfil
Re: Se puede hacer esto ?? .. porque?
« Respuesta #4 en: 11 Mayo 2013, 01:37 am »

En C++ se puede. En C también a partir del estándar C98.

Es un array de tamaño variable. Antiguamente las variables se creaban al principio de cada llave. Por lo que se necesitaba su tamaño antes de entrar.

Ahora cada variable puede crearse en cualquier línea de código y en cualquier momento.

PD: No da warning, a no ser que tengas un compilador obsoleto o tengas activado warnings de C estricto.

entonces, que sentido tiene new , si se puede declarar dinamicamente un arreglo en cualquier parte del programa utilizando este metodo.
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Se puede hacer esto ?? .. porque?
« Respuesta #5 en: 11 Mayo 2013, 01:57 am »

entonces, que sentido tiene new , si se puede declarar dinamicamente un arreglo en cualquier parte del programa utilizando este metodo.
No aver, puedes declararlo así. Pero una vez creado no puedes redimensionarlo (con new sí, pero acuerdate antes de borrar los datos anteriores).

Además los array cogen memoria de la pila mientras que new coge memoria de la ram.

Para hacernos una idea, al ejecutar el programa. El SO le asigna un espacio de memoria al programa que se le dedomina "pila", puede ser alrededor de 2-10 mb. Esta memoria se va llenando de forma consecutiva, por lo que se puede crear elementos y borrar elementos de una forma rápida y sencilla. Todos los elementos básicos que crees (hasta los objetos) se meten en la pila.

Evidentemente, es muy probable que con 2 mb te quedes corto. Por lo que puedes pedirle al sistema operativo que te reserve memoria adicional (usando new). El sistema operativo "buscará" celdas sueltas en la memoria y te asignará lo que vayas necesitando. Evidentemente, tendremos que guardar la dirreción de la celda asignada, de ahí que haya que usar punteros.

Para hacernos una idea, prueba la siguiente sentencia:

Código
  1. int Cosita[1000000];

Esta sentencia probablemente fallará (aunque tengamos 4 gb de ram). En cambio si usamos new:

Código
  1. int* Cosita = new int[1000000];

Debería funcionar sin problemas.
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
ThePinkPanther

Desconectado Desconectado

Mensajes: 82



Ver Perfil
Re: Se puede hacer esto ?? .. porque?
« Respuesta #6 en: 11 Mayo 2013, 02:04 am »

No aver, puedes declararlo así. Pero una vez creado no puedes redimensionarlo (con new sí, pero acuerdate antes de borrar los datos anteriores).

Además los array cogen memoria de la pila mientras que new coge memoria de la ram.

Para hacernos una idea, al ejecutar el programa. El SO le asigna un espacio de memoria al programa que se le dedomina "pila", puede ser alrededor de 2-10 mb. Esta memoria se va llenando de forma consecutiva, por lo que se puede crear elementos y borrar elementos de una forma rápida y sencilla. Todos los elementos básicos que crees (hasta los objetos) se meten en la pila.

Evidentemente, es muy probable que con 2 mb te quedes corto. Por lo que puedes pedirle al sistema operativo que te reserve memoria adicional (usando new). El sistema operativo "buscará" celdas sueltas en la memoria y te asignará lo que vayas necesitando. Evidentemente, tendremos que guardar la dirreción de la celda asignada, de ahí que haya que usar punteros.

Para hacernos una idea, prueba la siguiente sentencia:

Código
  1. int Cosita[1000000];

Esta sentencia probablemente fallará (aunque tengamos 4 gb de ram). En cambio si usamos new:

Código
  1. int* Cosita = new int[1000000];

Debería funcionar sin problemas.


Muchas gracias, eres un genio , entonces la diferencia es que todas las estructuras de datos ,que no sean declaradas con una función de asignación de memoria dinamica , o un operador que sirva para eso,se guardan en la pila?
y tambien que puedo reasignar el espacio cuando utilizo estas funciones/operadores y en caso contrario no?
« Última modificación: 11 Mayo 2013, 02:12 am por ThePinkPanther » En línea

Luchoz95

Desconectado Desconectado

Mensajes: 58


Ver Perfil
Re: Se puede hacer esto ?? .. porque?
« Respuesta #7 en: 11 Mayo 2013, 02:15 am »

y ademas creo que para asignar la dimension de una variable en tiempo de ejecucion se usa size_t y no int ! S2!
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Se puede hacer esto ?? .. porque?
« Respuesta #8 en: 11 Mayo 2013, 02:51 am »


Muchas gracias, eres un genio , entonces la diferencia es que todas las estructuras de datos ,que no sean declaradas con una función de asignación de memoria dinamica , o un operador que sirva para eso,se guardan en la pila?
y tambien que puedo reasignar el espacio cuando utilizo estas funciones/operadores y en caso contrario no?
Exacto, la principal diferencia es la localización en memoria. Además tu decides voluntariamente cuando borrarla, lo que es un poder importante (aunque también peligroso porque se te puede olvidar).

Lo de reasignar el vector en realidad es una verdad a medias, lo que en realidad haces es pedirle al sistema operativo que cree otro vector (ojo, como se te olvide borrar el antiguo tendrás dos vectores en memoria).

y ademas creo que para asignar la dimension de una variable en tiempo de ejecucion se usa size_t y no int ! S2!
Cualquier variable vale puesto que se hace una conversión implicita a size_t.
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
ThePinkPanther

Desconectado Desconectado

Mensajes: 82



Ver Perfil
Re: Se puede hacer esto ?? .. porque?
« Respuesta #9 en: 11 Mayo 2013, 03:13 am »

Muchas gracias a los dos, me aclararón mis dudas ,me estaba volviendo un poco loco .  ;-) Saludos , un moderador puede cerrar este tema.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Alguien me puede decir porque pasa esto????
Juegos y Consolas
ciceron 5 2,337 Último mensaje 3 Abril 2005, 16:31 pm
por ciceron
alguien puede tener idea de porque falla esto?(socket)
Programación Visual Basic
n3ts4mura1 4 2,016 Último mensaje 19 Agosto 2006, 06:38 am
por n3ts4mura1
Pregunta simple : Porque no puedo hacer esto?
Programación Visual Basic
CAR3S? 2 3,196 Último mensaje 9 Octubre 2011, 17:08 pm
por CAR3S?
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines