Visual Studio i c++ error kompilacji

0

Cześć, mam bardzo prosty kod, który działa i kompiluje się w Code Blocksie natomiast w Visual Studio nie.
Mój kod:

#include <iostream>
#include <cmath>
#include <string>

using namespace std;

int main() {
	int ile, liczba;
	string licz;
	cin >> ile;
	int a[ile], b[ile];
	for (int i = 0; i < ile; i++) {
		cin >> a[i] >> b[i];
	}
	for (int i = 0; i < ile; i++) {
		liczba = pow(a[i], b[i]);
		int LiczbaCyfr = floor( log10(liczba)+1);
		licz = to_string(liczba);
		cout<<licz[LiczbaCyfr - 1]<<endl;
	}
}

dostaję nastepujący błąd:
Błąd C2131 wyrażenie nie zostało obliczone do stałej
Błąd dotyczy tego fragmentu kodu:

int a[ile], b[ile];

Dopiero zacząłem swoją przygodę z Visual Studio. Dlaczego wyskakuje ten błąd?

0
int a[ile], b[ile];

Jeżeli ile nie jest stałą, to nie możesz tak zrobić. Użyj new lub vector.

0

https://stackoverflow.com/questions/14075194/variable-length-arrays-vla-in-c-and-c

Ale dlaczego w Code Block to działa a tu nie?<

Bo to jest pozostałość po C, którą zostawiono jako niestandardowe rozszerzenie (niezgodne ze standardem C++).

0

Musisz puścić sobie odcinek o wskaźnikach.

W skrócie będzie tak:
int *a = new int[ile];
int *b = new int[ile];

I dalej w kodzie musisz zmienić "a" na "*a".
Samo "a" zawiera tutaj adres komórki w pamięci.

2

Nie lepiej std::vector?

1
  • W C++ nie ma obsługi VLA https://en.wikipedia.org/wiki/Variable-length_array;
  • Nie stosuj gołego new oraz delete, bo to proszenie się o kłopoty, no chyba, że jest się na studiach i tego wymagają;
  • Użyj jakiegoś kontenera np. tak jak Ci radzą przedmówcy czyli wektora.
1

Zawsze jak jest temat o VLA to muszę obalać mity ;-)

  1. VLA to nie jest „pozostałość po C”
  2. VLA jest w standardzie C, nie ma w standardzie C++

ale standardy standardami, a rzeczywistość jest taka, że

  1. GCC (kompilator używany w Code Blocks) obsługuje VLA zarówno pod C jak i pod C++
  2. MSVC (kompilator używany w Visual Studio) nie obsługuje VLA ani w C ani w C++.
0

Dziękuję bardzo za wszystkie odpowiedzi.

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