2010-05-10 11 views
6

Soy nuevo en la programación C. Estoy tratando de establecer el tamaño de la matriz utilizando una variable, pero me aparece un error: El tamaño de almacenamiento de 'array' no es constante !!c matrices: ¿tamaño de configuración de forma dinámica?

01 int bound = bound*4; 

02 static GLubyte vertsArray[bound]; 

he notado que cuando sustituyo límites (dentro de los corchetes en la línea 02) con el número decir '20', el programa se ejecuta sin problemas. Pero estoy tratando de establecer el tamaño de la matriz de forma dinámica ...

¿Alguna idea de por qué me sale este error? gracias mucho,

Respuesta

5

para crear una matriz de un tamaño no constante (es decir, conocido en tiempo de compilación), es necesario asignar dinámicamente espacio para ello usando malloc() (y correspondientemente desasignar usando free() cuando ya no es necesario) .

Como han notado otros, la capacidad de declarar matrices dinámicas está disponible en compiladores compatibles con C99.

11

Obtiene este error porque, como le dijo el compilador, el tamaño de su matriz no es constante. En la versión C89/90 del lenguaje C, el tamaño de la matriz debe ser una constante. No puede "establecer el tamaño de la matriz de forma dinámica". Si necesita una matriz de tamaño de tiempo de ejecución, debe asignarla manualmente con malloc o utilizar un enfoque no estándar específico del compilador (como la función alloca).

En la versión C99 del lenguaje C se agregó el soporte para las llamadas matrices de longitud variable (VLA). Un compilador C99 aceptará una declaración de matriz de tamaño en tiempo de ejecución para una matriz automática . Sin embargo, incluso en C99 no puede declarar una matriz estática de tamaño de tiempo de ejecución, como lo está intentando.

3

Lo que usted quiere es posible en C99; sin embargo, con las versiones anteriores de C, está atascado al llamar funciones para asignar dinámicamente memoria, p. alloca(3) o malloc(3).

-3

utilizar cualquiera de estos

GLubyte* vertsArray = (GLubyte*) malloc(sizeof(GLubyte) * bound); 

GLubyte* vertsArray = new GLubyte[bound]; 

recordar para liberar la memoria cuando no se necesita el objeto más

delete [] vertsArray; 

free((void*)vertsArray; 

A pesar de lo que dicen en los comentarios sigo diciendo que se debe preferir nuevo en lugar de malloc si no está 100% obligado a usar C. Consulte esto link for more information

+2

Lenguaje incorrecto: esta es una pregunta en C. :) – Arafangion

+0

Pensé que el malloc y el enfoque libre eran para C, y por esa razón dije preferir el uso de nuevo/eliminar solo si es compatible ... –

+6

Si tu compilador admite 'new' /' delete', es un C++ compilador, no un compilador de C. Y realmente no debería usar un compilador de C++ para compilar código C por varias razones. No debe alentar a alguien que usa C a usar C++ "si su compilador lo admite". –

Cuestiones relacionadas