Софтуерно Инженерство
Loading...
+ Нов въпрос
Pavletka avatar Pavletka 0 Точки

Arrays in VC

Аз пиша код във Visual Studio. Там, като задавам масив, чийто размер се определя от потребителя, ми дава грешка при компилацията. Знаете ли как мога да го оправя този проблем?

Тагове:
0
C++ Programming
emo.999 avatar emo.999 196 Точки

Ако може да покажеш код за да ти помогнем. Така не става достатъчно ясно.

-1
Pavletka avatar Pavletka 0 Точки

#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]; и ми казва, че трябва да задам броя елементи задължително като константа, тоест не мога да направя така че потребителят да ми въвежда броя елементи на масива.

 

0
emo.999 avatar emo.999 196 Точки

Така.. Проблема е, че в c++ не се приемат така наречените variable-sized масиви т.е. такъв масив, чийто size е променлива.

Трябва да бъде константа, точно както ти е посочило идето.

Може да се използва vector (Това би трябвало да работи.):

vector<int> arr(length);

Друг метод е този (с динамично зададена памет), като трябва да го изтриеш накрая:

cin >> length; 

int* array = new int[length];

.......

delete [] array;

Надявам се да съм помогнал.

0
20/11/2018 09:28:44
The_assassin avatar The_assassin 138 Точки

Малко допълнителна информация, относно този код: 
На „истинска“ ;-) компилираща програма, кодът се компилира без никакви предупреждения, и след това работи без проблем.

0
kolioi avatar kolioi 429 Точки

Проблема не е във вижуъл студио и майкрософтския компилатор. Размера на статичните масиви трябва да е известен по време на компилация, за да се задели необходимото количество памет. Това са ви го казали по време на лекции, цитирам (с правописните грешки):

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 )
  {
    ....
  }

 

1
georgi.stef.georgiev avatar georgi.stef.georgiev 917 Точки

Тук е добре да се добави, че ползвайки 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.: мисля, че последните няколко такива по-кратки теми във форума не са от участници в курса, предвид задачите, за които питат, и предвид стила на въпросите (този е поне по-смислен, но повечето са "решете ми тази задача").

1
kolioi avatar kolioi 429 Точки

Ами погледнах презентацията към курса, който тече в момента (C++ Fundamentals - ноември 2018) и точно там, на 28 страница има пример за създаване на масив, размера на който се въвежда от потребителя. Това работи за някои компилатори, но е extension и не всички компилатори го поддържат (защото не е задължително). Много добре разбирам, че това е лесен начин да се преподава материала за масиви, само че това е по-скоро изключение, отколкото правило. Ама това никъде не е казано - нито в презентацията, нито на лекцията. И хората като се сблъскат с този проблем и се чудят какво да правят. А дежурния отговор от преподавателите в този случай е - ами инсталирай си код блокс (или някое друго IDE) и работи с него.

Колкото до хората с домашните от училище - ами по-добре да питат тук, може пък някой да им отговори, отколкото някой изтрещялко да оспами форума (като предишните няколко дни).

1
georgi.stef.georgiev avatar georgi.stef.georgiev 917 Точки

Оуу, това е грешно, да. Интересно, материалите приличат на тези от курса, който аз водих, но са без обновленията от май месец тази година, които обясняват това за C99 VLA extension-а.

Можете ли да им report-нете проблема през системата, за да го коригират колегите, които водят курса сега?

0