Duda con variable

Iniciado por tremolero, 2 Abril 2015, 19:45 PM

0 Miembros y 2 Visitantes están viendo este tema.

tremolero

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.

#include <iostream>

using namespace std;

int main()
{

    int variable[520000];

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

}


Un saludo y gracias.

engel lex

#1
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
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.

tremolero

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?

ivancea96

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

rir3760

Cita de: tremolero en  2 Abril 2015, 19:45 PMQuiero 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.

En cuanto al ultimo borrador del estándar de C++ el tema se trata en el anexo B:
CitarAnnex 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
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

tremolero

Gracias a todos por las respuestas.

Cita de: 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 = 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.

user-marcos

Otra forma de usar memoria dinámica es usando vectores
#include <vector>
vector<int> entero;

ivancea96

Cita de: tremolero en  4 Abril 2015, 18:29 PM
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.

engel lex

Cita de: ivancea96 en  5 Abril 2015, 00:55 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!  :¬¬
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.

ivancea96

Cita de: engel lex en  5 Abril 2015, 01:03 AM
y para eso existen las etiquetas GeSHi y de codigo cuyo uso es obligatorio!  :¬¬

Es tedioso hacerlo desde Tapatalk ¬¬