Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: tremolero en 2 Abril 2015, 19:45 pm



Título: Duda con variable
Publicado por: tremolero en 2 Abril 2015, 19:45 pm
Hola, a ver quien me puede explicar porque y como solucionar el siguiente error que me da.

Estaba mirando el tema de arrays y matrices., asi que tenia abierto el codeblocks y despues de escribir un hello world!, y de probar un rato declarar variables y darles valor, se me habia pasado la idea de crear un array muy grande y meterle valores random.

Quiero saber porque me da error al declarar un array muy grande y como puedo hacer para declararlo.

Despues de ver que me daba error, probando he visto que si declaro un array de mas de 51000 me da error. la cosa es que compila pero cuando ejecuto me salta un error de windows que dejo de funcionar al instante de ejecutarlo.

Que conste que la primera vez le habia dado un tamaño de 20000000.

Código:
#include <iostream>

using namespace std;

int main()
{

    int variable[520000];

    cout << "Hello world!" << endl;

}

Un saludo y gracias.


Título: Re: Duda con variable
Publicado por: engel lex en 2 Abril 2015, 20:05 pm
No hay realmente un maximo standard para los array, sin embargo hasta donde se, el sistema operativo tiene limites de memoria asignables, así que no puede escoger así como así un espacio de 51000 elementos (51kb... :s no se por qué) para mi (en linux) me permite mover hasta 2.090.000 elementos como asignación inicial (no una cantidad exacta sino arbitraria, pueden ser cientos más o  menos) antes de declararme una violacion de segmento... sin embargo con malloc o new, puedes asignar más espacios (en mi caso he llegado a una variable creo que de 100mb) aún así estás limitado por el espacio continuo libre en la ram

realmente desconozco la diferencia entre la declaración directa de la variable y malloc pero claramente hace la diferencia


Título: Re: Duda con variable
Publicado por: tremolero en 2 Abril 2015, 23:28 pm
Muchas gracias por la respuesta engel lex.

Imagine que seria por el tema de la memoria ram y algun tipo de bloqueo de seguridad.

Ahora mi duda es como hago el array de dos dimensiones, que queria de 20 millones xD

porque claro int v[20000000][20], da error :S

Aunque se me ocurren varias formas, una dividirlo en partes(cosa que no creo que sea bueno) y otra opcion que es la que mas me interesa seria almacenarlo en archivos.

Asi que si no os importa, que seria mejor almacenarlo en un archivo plano ej .txt o conectar con alguna base de datos y guardarlo ahi?


Título: Re:
Publicado por: ivancea96 en 3 Abril 2015, 13:22 pm
¿Probaste con punteros a memoria dinámica?
int **v = new int*[2000000];
for(int i=0; i<2000000; i++)
    v[ i ] = new int[20];


Título: Re: Duda con variable
Publicado por: rir3760 en 3 Abril 2015, 16:48 pm
Quiero saber porque me da error al declarar un array muy grande y como puedo hacer para declararlo.

Despues de ver que me daba error, probando he visto que si declaro un array de mas de 51000 me da error. la cosa es que compila pero cuando ejecuto me salta un error de windows que dejo de funcionar al instante de ejecutarlo.
Ello se debe a los limites que cada compilador decide para el tamaño máximo de un objeto.

Una discusión sobre los limites en el lenguaje C es Array size limits (http://bytes.com/topic/c/answers/218557-array-size-limits).

En cuanto al ultimo borrador del estándar de C++ el tema se trata en el anexo B:
Citar
Annex B    (informative)
Implementation quantities [implimits]
1    Because computers are finite, C ++ implementations are inevitably limited in the size of the programs they
can successfully process. Every implementation shall document those limitations where known. This documentation may cite fixed limits where they exist, say how to compute variable limits as a function of available
resources, or say that fixed limits do not exist or are unknown.
2    The limits may constrain quantities that include those described below or others.  The bracketed number
following each quantity is recommended as the minimum for that quantity.  However, these quantities are
only guidelines and do not determine compliance.
—  Nesting levels of compound statements, iteration control structures, and selection control structures
[256].
—  Nesting levels of conditional inclusion [256].
—  Pointer, array, and function declarators (in any combination) modifying a class, arithmetic, or incom-
plete type in a declaration [256].
—  Nesting levels of parenthesized expressions within a full-expression [256].
—  Number of characters in an internal identifier or macro name [1 024].
—  Number of characters in an external identifier [1 024].
—  External identifiers in one translation unit [65 536].
—  Identifiers with block scope declared in one block [1 024].
—  Macro identifiers simultaneously defined in one translation unit [65 536].
—  Parameters in one function definition [256].
—  Arguments in one function call [256].
—  Parameters in one macro definition [256].
—  Arguments in one macro invocation [256].
—  Characters in one logical source line [65 536].
—  Characters in a string literal (after concatenation) [65 536].
—  Size of an object [262 144].

En buen cristiano: para conocer los limites de un compilador en particular habrá que revisar su documentación.

Un saludo


Título: Re: Duda con variable
Publicado por: tremolero en 4 Abril 2015, 18:29 pm
Gracias a todos por las respuestas.

¿Probaste con punteros a memoria dinámica?
int **v = new int*[2000000];
for(int i=0; i<2000000; i++)
    v = new int[20];

Me salta error en " v = new int[20];" dice: error:cannot convert 'int*' to 'int**' in assignment.

Respecto a rir3760, sino me equivoque en los calculos creo que tampoco ocupaba tanta memoria ram.



Asi que explico un poco por encima mi idea principal, trataba de primero crear una cantidad limitada de posibles para luego pasarle filtros y ver que resultados me daba.

Claro esta que luego mas adelante imagino que me interesaria guardarlos, pero claro no he continuado porque cuando trataba de crear una gran cantidad me he topado con este error.

Un saludo y gracias.


Título: Re: Duda con variable
Publicado por: user-marcos en 4 Abril 2015, 20:22 pm
Otra forma de usar memoria dinámica es usando vectores
#include <vector>
vector<int> entero;


Título: Re: Duda con variable
Publicado por: ivancea96 en 5 Abril 2015, 00:55 am
Me salta error en " v[ i ] = new int[20];" dice: error:cannot convert 'int*' to 'int**' in assignment

Ya está corregido, el '[ i ]' lo interpreta el foro como letra cursiva.


Título: Re: Duda con variable
Publicado por: engel lex en 5 Abril 2015, 01:03 am
Ya está corregido, el '[ i ]' lo interpreta el foro como letra cursiva.

y para eso existen las etiquetas GeSHi y de codigo cuyo uso es obligatorio!  :¬¬


Título: Re: Duda con variable
Publicado por: ivancea96 en 5 Abril 2015, 01:53 am
y para eso existen las etiquetas GeSHi y de codigo cuyo uso es obligatorio!  :¬¬

Es tedioso hacerlo desde Tapatalk ¬¬


Título: Re: Duda con variable
Publicado por: engel lex en 5 Abril 2015, 02:02 am
XD te entiendo, pero no seas flojo! jejeje no es complicado


Título: Re: Duda con variable
Publicado por: tremolero en 7 Abril 2015, 01:26 am
Hola, gracias por vuestra ayuda.

Queria decir que usando memoria dinamica como ivancea96 me aconsejo, funciona sin ningun problema, eso si, al ejecutarlo ocupa 1.200 mb de ram xD

Ahora despues de lograrlo, me surgen mas dudas, ya que pruebo cosas que tal vez sean incoherentes... pero bueno, os pregunto, despues de lograrlo que ocupe esa cantidad de ram y genere todas las posibilidades, se me ocurrio que mostrara uno por uno mediante un cout.

Mi duda es la siguiente, si yo no pongo el cout, los 20millones se generan en 4segundos, si por el contrario pongo el cout despues de generarlos para mostrarlos,  en unos 4 minutos no ha mostrado ni un millon, y mirando en el administrador de tareas veo que la aplicacion solo usa un 5%.

Mi duda es, como puedo hacer que se muestre mas rapido? osea, no va mas rapido porque ese es el limite del cout, o de alguna manera permitiendo que la aplicacion ocupe mas cpu mostraria mas rapido?

esta claro que mostrarlo es poco logico, ya que mi siguiente paso, es guardar lo que se ha generado para no tener que generarlos cada vez, aunque 4s no es mucho xD y despues tratarlos.

Aun me quedan muchas cosas por mirar, el como y/o donde guardarlo, para despues tratar todas esas posibilidades.

Un saludo y gracias.


Título: Re: Duda con variable
Publicado por: engel lex en 7 Abril 2015, 06:47 am
no depende del cout la velocidad... cada vez que imprime a consola tu aplicación se detiene para mandar los datos a la consola y esperar que ella responda de vuelta

si guardas en un archivo tardaría tanto como tarde escribir esos 1,2gb en el disco


Título: Re: Duda con variable
Publicado por: tremolero en 7 Abril 2015, 14:34 pm
Ya imaginaba que guardar en el disco, si que puede tardar mas, por la velocidad del hdd, pero al mostrar en pantalla, esperaba que fuese mas rapido.

No hay forma de hacer que el cout muestre sin esperar nada?