ISO C ++禁止可变大小数组(编译错误)

通常我总是这样编译我的C代码:g ++ program.c -o program.exe

但我的大学教授要求我使用以下方法编译:g ++ -o -Wall -Wextra -Werror -pedantic -std = c ++ 0x program.exe program.c

(这对我来说是新的)。

所以……我运行命令并得到以下错误:

eda.c: In function 'int main()': eda.c:200: error: ISO C++ forbids variable-size array 'v' eda.c:207: error: ISO C++ forbids variable-size array 'nfloat' cc1plus: warnings being treated as errors eda.c:215: warning: suggest a space before ';' or explicit braces around empty body in 'while' statement 

这是我的程序的代码:

 #include  #include  #include  #include  typedef struct { float* data; int size; } vector; /* Metodos Básicos */ vector *create_vector(int n, float* comps){ vector *newvect = (vector*)malloc(sizeof(*newvect)); newvect->data = (float*)malloc(n*sizeof(float)); memcpy(newvect->data, comps, sizeof(float) * n); newvect->size = n; return newvect; } void destroy_vector(vector* v){ free(v->data); free(v); } void print(vector* v){ int size = v->size, i; for (i = 0; i data[i]); else if(i == (size-1)) printf("%.1f]\n", v->data[i]); else printf("%.1f,", v->data[i]); } } /* Metodos Intermedios */ float dotDiferentSizes(vector* v1, vector* v2, int smax, int smin){ double product; int i; for(i = 0; i data[i])*(v2->data[i]); // += means add to product } for(i = smin; i data[i])*0; // += means add to product } return product; } float dot(vector* v1, vector* v2){ int smax = (v1->size), smin; int v1size = smax; int v2size = (v2->size); float product = 0.0; if (v2->size > smax) { smax = v2->size; //max_size checking smin = v1->size; //min_size checking } else if (v2->size size; } else smin = smax; // compute if(smax == smin){ int i; for(i = 0; i data[i])*(v2->data[i]); // += means add to product } } else{ if(v1size == smax){ product = dotDiferentSizes(v1,v2,smax,smin); //v1>v2 } if(v2size == smax){ product = dotDiferentSizes(v2,v1,smax,smin); } } return product; } float norm(vector* v){ int size = v->size, i; float norm = 0.0; for(i= 0; i data[i])*(v->data[i]); } norm = sqrt( norm ); return norm; } void normalize(vector* v){ int size = v->size, i; float norma = 0.0; norma = norm(v); for(i= 0; idata[i] = v->data[i] / norma; } for (i = 0; i data[i]); else if(i == (size-1)) printf("%.2f]\n", v->data[i]); else printf("%.2f,", v->data[i]); } } /* Metodos Avanzados */ vector* add(vector* v1, vector* v2){ vector *vadd; int v1size, v2size, i; v1size = v1->size; int size = v1size; v2size = v2->size; if(v2size > v1size) { size = v2size; vadd = create_vector(size, v2->data); for(i = 0; i data[i] += v1->data[i]; } } else { vadd = create_vector(size, v1->data); for(i = 0; i data[i] += v2->data[i]; } } return(vadd); } vector* sub(vector* v1, vector* v2){ vector *vsub; int v1size, v2size, i; v1size = v1->size; int size = v1size; v2size = v2->size; if(v2size > v1size) { size = v2size; vsub = create_vector(size, v2->data); for(i = 0; i data[i] = v1->data[i] - vsub->data[i]; /* restamos siempre v1 - v2*/ } /* en el bucle forzamos a restar v1 - v2, evitando el caso v2 - v1*/ for(i = v1size; i data[i] = (v2->data[i])*(-1); } } else { /* v1size >= v2size */ vsub = create_vector(size, v1->data); for(i = 0; i data[i] -= v2->data[i]; } } return(vsub); } void incr(vector* source, vector* other){ int smax, i, ssize = source->size, osize = other->size; vector *vincr; if(ssize > osize) smax = ssize; else { if(ssize  osize){ for(i = 0; i data[i] = vincr->data[i]; } } else{ source->data = (float*)realloc(source->data, sizeof(float) * smax); source->size = smax; for(i = 0; i data[i] = vincr->data[i]; } } print(source); free(vincr); } //NumsVector, funcion que nos devuelve el numero de "numeros" que hay en cada vector del .txt, //es decir, los n floats por cada vector int NumsVector(char *linea, ssize_t size){ int numsvector = 1; //Inicializamos a 1 ya que no podemos suponer valor maximo segun enunciado, pero si minimo >= 1 int n; for(n = 2; n<= size; n++){ //como ya suponemos que el primer valor despues del corchete es un numero y ya lo hemos contado, empezamos en 2 if (linea[n] != '[' && linea[n] != ']'){ if(linea[n] == 44){ numsvector = numsvector + 1; } } } return numsvector; } int main(){ int n, i; scanf("%d\n", &n); vector *v[n]; for(i = 0; i<n; ++i) { char *line = NULL; //ponemos *line y len a valores 0 y null para que automaticamente getline nos haga el malloc y nos asigne el tamanyo size_t len = 0; ssize_t read; //en la variable read guardamos el valor de getline, contiene el numero de caracteres que tiene el string read = getline(&line,&len,stdin); int numsvector = NumsVector(line, read); float nfloat[numsvector]; //sabemos el tamanyo del vector que hemos leido, creamos array de floats y lo llenamos de los floats //empieza el proceso para obtener los floats a partir de string de chars int j = 0; line[strlen(line) - 1] = ','; /* Replaces the end ] with a , */ char *p = line + 1; /* creates a new pointer, pointing after the first [ in the original string */ do { sscanf(p, "%f,", &nfloat[j]); /* grabs up to the next comma as a float */ while (*(p++) != ',') ; /* moves pointer forward to next comma */ } while (++j < numsvector); /* stops when you've got the expected number */ v[i] = create_vector(numsvector, nfloat);//conseguimos almacenar el contenido del string en un vector del tipo float (nfloat) int aux; for(aux = 0; auxdata[%d] = : %.1f\n", i, aux, v[i]->data[aux]); //test de que la memoria se almacena bien, luego se borra } free(line); } } 

这些是给出错误的行:

 200: vector *v[n]; 207: float nfloat[numsvector]; 215: while (*(p++) != ',') ; //Now I think works fine with the extra space.. 

请有人帮我编译文件吗?

200:vector * v [n]; 可以通过初始化向量来修复:

 vector* v = new vector[n]; 

207:float nfloat [numsvector]; 可以通过动态分配数组来修复:

 float* nfloat = new float[numsvector] 

我相信这些是相应的C内存分配:

 vector* v = malloc(n * sizeof(vector)); float* nfloat = malloc(numsvector * sizeof(float)); 

问题是你正在使用的function( 可变长度数组或VLA )是C99function,不是C ++标准的一部分,但gcc支持它作为扩展 , -pedantic将强制gcc在你使用扩展时警告你-Werror将发出警告错误,这将有效地阻止您使用扩展。

如果你能够使用C ++,一个选择是使用std :: vector 。 另一个选择是通过newmalloc使用动态分配,具体取决于您可以使用哪个。

有点奇怪,似乎你必须用C编程但是使用C ++编译器,我希望至少你可以使用-xc使g++充当C编译器。 这篇文章涵盖了C和C ++的兼容性 ,你也应该阅读Keith的评论。

通常我总是这样编译我的C代码:g ++ program.c -o program.exe

那是不对的。 g++是C ++编译器,而不是C编译器。 (我知道,您可以指定-xc来强制使用该语言,但是为什么在使用C编译器时也会这样做?)

C代码应该用C编译器编译。 C ++代码应该用C ++编译器编译。 任何其他组合都是错误的。

如果您需要编写C ++代码,那么编写C ++代码。 在C ++中,您不能拥有C99样式的可变长度数组。 您将需要使用std::vector 。 像这样:

 std::vector theVector(initial_size);