[C++] error C2466


(Kalin 93) #1

Witam.

Mam problem z błędem C2466 w VC++. Szukałem w MSDN i znalazłem odpowiedź że chodzi o tworzenie tablicy z 0 -wym rozmiarem.

Na poniższym kodzie widać że tablica nie jest zerowa. Przekonajcie się sami...

#include 

#include 

#include 


using namespace std;


int main ()

{

	string sText;

	cin >> sText;

	__int64 nDlugosc = 0;

	while (sText [nDlugosc] != 0)

	{

		nDlugosc++;

	}

	char cText [nDlugosc];

	for (int i = 0;i <= nDlugosc;i++)cText [i] = 0;

	for (int i = 0; i <= nDlugosc;i++) sText [i] = cText [i]+3;

	cout << cText;

	getch ();

}

(Fiołek) #2

Statyczne definiowanie tablic w C++ jest możliwe tylko wtedy, gdy rozmiar tablicy jest znany w trakcie kompilacji. Jeśli nie znamy rozmiaru w trakcie kompilacji, musimy użyć dynamicznego przydzielania pamięci. nDlugosc nie jest zdefiniowana jako stała, więc kompilator nie ma prawa(wg standardu) tego przepuścić.

Takie coś jest możliwe tylko i wyłącznie w G++, Visual tego nie strawi.

Tak btw. nDlugosc nie musi być zadeklarowana jako __int64, wystarczy zwykły __int32 :wink:


(Marduk666pl) #3

W przypadku kiedy stosujesz tablice musisz podać ich rozmiar na samym początku i dla kompilatora to jest właśnie ta linijka:

__int64 nDlugosc = 0;

a więc ma ona długość równa zero co stanowi błąd. Rozwiązaniem są tablice dynamiczne tworzone za pomocą operatora "new":

char* tablica = new char[rozmiar_tablicy];

Twój program powinien wyglądać tak:

#include 

#include 

#include 


using namespace std;


int main ()

{

   string sText;

   cin >> sText;

   __int64 nDlugosc = 0;

   while (sText [nDlugosc] != 0)

   {

      nDlugosc++;

   }


   char* cText = new char[nDlugosc]; //TUTAJ STOSUJEMY TABLICE DYNAMICZNA


   for (int i = 0;i <= nDlugosc;i++)

        cText [i] = 0;

   for (int i = 0; i <= nDlugosc;i++) 

        sText [i] = cText [i]+3;


   cout << cText;

   getch ();

}

(Fiołek) #4

@ marduk666 : a usunąć cText? Zapomniało się :wink:

Przed getch() trzeba dodać "delete[] cText;".


(Marduk666pl) #5

Fakt moja wina zapomniało mi się :oops: , chociaż w tak prostym programie nie ma to znaczenia, każdy nowszy system operacyjny i tak zwolni całą pamięć jaką zaalokował program :stuck_out_tongue:


(Kalin 93) #6

Pomogło :wink: A tak w ogole, to jakim typem jest komórka przechowana w stringu ?


(Marduk666pl) #7

Tzn co masz na myśli? W "stringu" zawarte są normalne znaki typu char jeżeli o to ci chodzi. Jeżeli chcesz uzyskać to co jest w stringu jako typ char to wywołujesz metode c_str().

Np.

string string1 = "jakis tekst w stringu";


char * jakiwskaznik = string1.c_str();

(Fiołek) #8

@ marduk666 : nie skompiluje się. Zakazana jest niejawna konwersja z const char* na char*.

PS. Wiem, czepiam się :wink:


(Kalin 93) #9

No właśnie :wink: Zna ktoś jakiś sposób na konwersje const char* na char* ? :wink: