Arrays in VC
Аз пиша код във Visual Studio. Там, като задавам масив, чийто размер се определя от потребителя, ми дава грешка при компилацията. Знаете ли как мога да го оправя този проблем?
Аз пиша код във Visual Studio. Там, като задавам масив, чийто размер се определя от потребителя, ми дава грешка при компилацията. Знаете ли как мога да го оправя този проблем?
Ако може да покажеш код за да ти помогнем. Така не става достатъчно ясно.
Проблема не е във вижуъл студио и майкрософтския компилатор. Размера на статичните масиви трябва да е известен по време на компилация, за да се задели необходимото количество памет. Това са ви го казали по време на лекции, цитирам (с правописните грешки):
C++ Array size must be an integer, known compile-time
На 21 стр. от презентацията. Проблема е, че ви учат на неща, които са специфични за даден компилатор. Кода не е portable и не може да се компилира с друг компилатор. Има няколко начина да го оправиш. Най-простия (и най-неефективен) е да декларираш масива с по-голям размер отколкото ще ти трябва, например така
int arr[100];
Друг начин е да заделяш динамично памет с new и да я освобождаваш с delete. Аз ти препоръчвам обаче да използваш vector<int>. Удобството е, че не е необходимо да знаеш предварително колко числа трябва да прочетеш. Също така, оператора == е предефиниран за вектори и за да сравниш 2 вектора просто трябва да напишеш
vector<int> v1;
vector<int> v2;
.....
if ( v1 == v2 )
{
....
}
Тук е добре да се добави, че ползвайки vector, първо трябва да бъдат добавени елементите, преди да се достъпват, тоест
for (int i = 0; i < 10; i++) {
int inputNumber;
cin >> inputNumber;
v1.push_back(inputNumber);
}
е правилният начин да се прочетат 10 елемента и да се добавят във вектор - казвам го, защото начинаещите често си мислят, че векторът винаги се държи като масив и директно може да му се каже cin >> v1[i]; (разбира се след достатъчно на брой push_back операции това би било валидно, но не и първия път).
Относно правописните грешки, кое имаш предвид, аз не намирам грешки, освен може би главната буква на Array?
Защо казваш, че ги учим на специфични за един компилатор неща? Имаше недоглеждане в лекцията, за която говориш, и наистина се ползваше масив с размер зададен с променлива, но това беше коригирано доколкото си спомням на следващата итерация (може би нямаш новите материали всъщност, но кажи ако имаш нещо друго предвид).
P.S.: мисля, че последните няколко такива по-кратки теми във форума не са от участници в курса, предвид задачите, за които питат, и предвид стила на въпросите (този е поне по-смислен, но повечето са "решете ми тази задача").
Ами погледнах презентацията към курса, който тече в момента (C++ Fundamentals - ноември 2018) и точно там, на 28 страница има пример за създаване на масив, размера на който се въвежда от потребителя. Това работи за някои компилатори, но е extension и не всички компилатори го поддържат (защото не е задължително). Много добре разбирам, че това е лесен начин да се преподава материала за масиви, само че това е по-скоро изключение, отколкото правило. Ама това никъде не е казано - нито в презентацията, нито на лекцията. И хората като се сблъскат с този проблем и се чудят какво да правят. А дежурния отговор от преподавателите в този случай е - ами инсталирай си код блокс (или някое друго IDE) и работи с него.
Колкото до хората с домашните от училище - ами по-добре да питат тук, може пък някой да им отговори, отколкото някой изтрещялко да оспами форума (като предишните няколко дни).
Оуу, това е грешно, да. Интересно, материалите приличат на тези от курса, който аз водих, но са без обновленията от май месец тази година, които обясняват това за C99 VLA extension-а.
Можете ли да им report-нете проблема през системата, за да го коригират колегите, които водят курса сега?
#include <iostream>
using namespace std;
int main()
{
int lenght = 0;
cin >> lenght;
int arr[lenght];
for (int i = 0; i < lenght; i++)
{
cin >> arr[i];
}
return 0;
}
Във Visual Studio ми подчертава int arr[lenght]; и ми казва, че трябва да задам броя елементи задължително като константа, тоест не мога да направя така че потребителят да ми въвежда броя елементи на масива.
Така.. Проблема е, че в c++ не се приемат така наречените variable-sized масиви т.е. такъв масив, чийто size е променлива.
Трябва да бъде константа, точно както ти е посочило идето.
Може да се използва vector (Това би трябвало да работи.):
vector<int> arr(length);
Друг метод е този (с динамично зададена памет), като трябва да го изтриеш накрая:
cin >> length;
int* array = new int[length];
.......
delete [] array;
Надявам се да съм помогнал.
Малко допълнителна информация, относно този код:
На „истинска“ ;-) компилираща програма, кодът се компилира без никакви предупреждения, и след това работи без проблем.