error: variable-sized object ‘b’ may not be initialized

0

witam mam taki problem kiedyś podobnie pisałem i było dobrze:

 #include<iostream>
#include<string>
using namespace std;

int main(){
string a;cin>>a;
char b[8+a.length()]={"asdfghjk"};
for(short i=0;i<8;i++)
cout<<b;cout<<endl;


return 0;}

dlaczego mogę mieć taki błąd
variable-sized object ‘b’ may not be initialized

0

test.cpp33: error: variable-sized object ‘b’ may not be initialized
char b[8+a.length()]={"asdfghjk"};
^
takie coś dokładnie ;( coś mogę mieć z kompilatorem w Ubuntu? używam normalnie g++ w terminalu.

2

W C++ nie ma VLA, czyli jak definiujesz tablicę, to jej rozmiar musi być znany podczas kompilacji.
8+a.length() na pewno nie jest znane podczas kompilacji.

W Twoim konkretnym przypadku polecam std::string.

0
Adam Szczepański napisał(a):

kiedyś podobnie pisałem i było dobrze

Nie było. Inizjalicja tablicy rozmiarem podawanym w trakcie wykonania było dodawane do niekórych kompilatorów jako rozszerzenie, bo było obecne w jakimś standardzie C (ale nie pamiętam dokładnie). Działało (zazwyczaj), ale było uznawane za złą praktykę bo było niezgodne ze standardem. W c++11 i 14 prawdłowa deklaracja tablicy to

D1 [ constant-expressionopt] attribute-specifier-seqopt

Twoja zmienna nie jest const. Powinieneś użyć tablic inicjalizowanych na stercie.

0

kurcze to bardzo dziwne bo przed formatem Ubuntu program działał a teraz mam to samo Ubuntu 16.04 i to tylko wycinek tego programu więc dalej właśnie nie może być string bo to idzie do funkcji system() i w nawiasach musi być char :(

0

tablic inicjalizowanych? ok poczytam o tym

0
Adam Szczepański napisał(a):

kurcze to bardzo dziwne bo przed formatem Ubuntu program działał a teraz mam to samo Ubuntu 16.04 i to tylko wycinek tego programu więc dalej właśnie nie może być string bo to idzie do funkcji system() i w nawiasach musi być char :(

A nie słyszałeś o funkcji c_str() od string?

2

VLA jest w gcc jako niestandardowe rozszerzenie. Po kolejnej wersji pewnie ktoś poszedł przez rozum do głowy i zaczął to traktować jako błąd.
string::c_str() da Ci c-string do użycia. Tylko nie przypisuj tego do wskaźnika tylko po prostu użyj jak jest.

0

z C nie miałem doczynienia tylko odrazuz C++

0

znalazłem o tym c_str to powinno pomóc:
http://cpp0x.pl/dokumentacja/standard-C++/string/c_str/66

szczerze nie lubią mieszać c z c++ ale ważne żeby zadziałało :D

0

tak też coś nie idzie zrobiłem ten string ch w system(ch.s_str())
test.cpp11: error: request for member ‘c_str’ in ‘ch’, which is of non-class type ‘std::string [(((sizetype)<anonymous>) + 1)] {aka std::basic_string<char> [(((sizetype)<anonymous>) + 1)]}’
system(ch.c_str());
^

0

a dzięki no tak fakt już działa :D

0

chce się komuś wnikać... program działa robi swoje segreguje nawiasy klamrowe podanego pliku *.cpp ale wywala jakiś błąd:
./a.out
tekst.cpp
*** Error in `./a.out': free(): invalid next size (fast): 0x00000000018e5c50 ***
Przerwane (zrzut pamięci)

 #include<iostream>
#include<fstream>
#include<string>
#include<cstdlib>
//#include <cstdio>
using namespace std;

int main()
{/*1a*/
string a;cin>>a;string ch="chmod 777 ";ch[10]=' ';
short pn=0,ln=0,i,licl=0,licp=0;
char *b = new char [a.length()+2];char *c = new char [a.length()];char d;


char wej[9],wej2[10],wej3[11],wyj[9],poz[8],wyj2[10],wyj3[11];
wej[0]='\n';wej[1]='{';wej[2]='/';wej[3]='*';wej[4]='1';wej[5]='a';wej[6]='*';wej[7]='/';wej[8]='\n';
wej2[0]='\n';wej2[1]='{';wej2[2]='/';wej2[3]='*';wej2[4]='0';wej2[5]='1';wej2[6]='a';wej2[7]='*';wej2[8]='/';wej2[9]='\n';
wej3[0]='\n';wej3[1]='{';wej3[2]='/';wej3[3]='*';wej3[4]='0';wej3[5]='0';wej3[6]='1';wej3[7]='a';wej3[8]='*';wej3[9]='/';wej3[10]='\n';

wyj[0]='\n';wyj[1]='/';wyj[2]='*';wyj[3]='1';wyj[4]='b';wyj[5]='*';wyj[6]='/';wyj[7]='}';wyj[8]='\n';
poz[0]='\n';poz[1]='/';poz[2]='*';poz[3]='b';poz[4]='*';poz[5]='/';poz[6]='}';poz[7]='\n';
wyj2[0]='\n';wyj2[1]='/';wyj2[2]='*';wyj2[3]='0';wyj2[4]='1';wyj2[5]='b';wyj2[6]='*';wyj2[7]='/';wyj2[8]='}';wyj2[9]='\n';
wyj3[0]='\n';wyj3[1]='/';wyj3[2]='*';wyj3[3]='0';wyj3[4]='0';wyj3[5]='1';wyj3[6]='b';wyj3[7]='*';wyj3[8]='/';wyj3[9]='}';wyj3[10]='\n';


for(i=0;i<a.length()+2;i++)
	{/*2a*/
if(a[i]!='.')
	{/*3a*/
b[i]=a[i];
	/*3b*/}
else
	{/*4a*/
b[i]='_';b[i+1]='2';b[i+2]='.';b[i+3]='c';b[i+4]='p';b[i+5]='p';break;
	/*4b*/}
	/*2b*/}
for(i=0;i<a.length();i++)c[i]=a[i];
for(i=0;i<a.length()+2;i++)ch[i+11]=b[i];
ifstream plik(c);ofstream plik2(b);
system(ch.c_str());
while(!plik.eof())
	{/*5a*/
plik.get(d);if(d=='{')ln++;else if(d=='}')pn++;
	/*5b*/}
plik.close();plik.open(c);
bool bl[ln],bl100=1,bl1000=1,bre=0,bwy=1;for(i=0;i<ln;i++)bl[i]=0;

while(!plik.eof())
	{/*6a*/
plik.get(d);
if(d=='{')
	{/*7a*/
if(licl<10){wej[4]=licl+48;for(i=0;i<9;i++)plik2<<wej[i];licl++;bwy=0;}
else if(licl<100)
	{/*8a*/
wej2[5]=(licl%10)+48;wej2[4]=((licl-(licl%10))/10)+48;for(i=0;i<10;i++)plik2<<wej2[i];licl++;bwy=0;
	/*8b*/}
else if(licl<1000)
	{/*10a*/
if(licl%100<10)
	{/*12a*/
wej3[6]=(licl%100)+48;wej3[5]=48;wej3[4]=((licl-(licl%100))/100)+48;for(i=0;i<11;i++)plik2<<wej3[i];licl++;bwy=0;
	/*12b*/}
else
	{/*13a*/
wej3[6]=((licl%100)%10)+48;wej3[5]=(((licl%100)-((licl%100)%10))/10)+48;wej3[4]=((licl-(licl%100))/100)+48;for(i=0;i<11;i++)plik2<<wej3[i];licl++;bwy=0;
	/*13b*/}

	/*10b*/}
//for(i=0;i<11;i++)plik2<<wej[i];licl++;
	/*7b*/}
else if(d=='}')
	{/*14a*/
licp=licl-1;//cout<<licp<<endl;for(i=0;i<ln;i++)cout<<bl[i];cout<<endl;
while(bl[licp])
	{/*15a*/
if(licp)licp--;else 
	{/*16a*/
for(i=0;i<8;i++)plik2<<poz[i];bre=1;bwy=0;break;
	/*16b*/}
	/*15b*/}
if(!bre)
	{/*17a*/

	
if(licp<10)
	{/*18afor(i=0;i<ln;i++)cout<<bl[i];cout<<"   "<<licp<<endl;*/
wyj[3]=licp+48;for(i=0;i<9;i++)plik2<<wyj[i];bl[licp]=1;bwy=0;
	/*18b*/}
else if(licp<100)
	{/*19a*/
wyj2[4]=(licp%10)+48;wyj2[3]=((licp-(licp%10))/10)+48;for(i=0;i<10;i++)plik2<<wyj2[i];bl[licp]=1;bwy=0;
	/*19b*/}
else if(licp<1000)
	{/*20a*/
if(licp%100<10)
	{/*21a*/
wyj3[5]=(licp%100)+48;wyj3[4]=48;wyj3[3]=((licp-(licp%100))/100)+48;for(i=0;i<11;i++)plik2<<wyj2[i];bl[licp]=1;bwy=0;
	/*21b*/}
else
	{/*22a*/
wej[5]=((licp%100)%10)+48;wej[4]=(((licp%100)-((licp%100)%10))/10)+48;wej[3]=((licp-(licp%100))/100)+48;for(i=0;i<11;i++)plik2<<wyj2[i];bl[licp]=1;bwy=0;
	/*22b*/}
	/*20b*/}
	/*14b*/}
        /*17b*/}bre=0;
	

	
if(bwy)plik2<<d;bwy=1;
	/*6b*/}
return 0;
	/*1b*/}

ten chmod 777 ... po to bo utworzony nowy plik z posegregowanymi nawiasami robił się z uprawnieniami takimi że nie mogłem go edytować

0

nie uwzględniłem nawiasów klamrowych w komentarzach i nawiasach cudzysłowy nie może ich być w podanym pliku *.cpp. i też nie może być więcej nawiasów klamrowych niż 1000

1 użytkowników online, w tym zalogowanych: 0, gości: 1