Професионална програма
Loading...
Pavletka avatar Pavletka 0 Точки

Arrays in VC

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

Тагове:
0
C++ Programming
kolioi avatar kolioi 621 Точки

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

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 921 Точки

Тук е добре да се добави, че ползвайки 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 621 Точки

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

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

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

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

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

0
kolioi avatar kolioi 621 Точки

Май е станало някакво недоразумение, защото и двата ми коментара в тази тема се отнасят за сегашния курс, а не за предишни издания. Както и да е, надявам се някой от преподавателите да прочете темата.

Иначе реших някоя и друга задача от C++ Advance и малко съжалявам, че не се записах за този курс (най-вече поради липса на време и немалка доза мързел :) ). Ще има ли нещо като продължение, малко по-адванс? Интересуват ме някои теми (макар че не се занимавам професионално с програмиране) като multithreading (всичко, може и POSIX), създаване и работа с DLL, design patterns, някои библиотеки (Boost, Qt) и поне още няколко.

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

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

Към момента не знам за официален план за по-advanced курс, но се говори за нещо свързано с графика и разработка на по-големи проекти, евентуално след следващото издание на C++ Advanced (което ще започне януари, тук има линкове към отделните курсове от текущата последователност https://softuni.bg/modules/49/cplusplus-development-septemvri-2018). Но не мога да обещая нищо, аз по всяка вероятност няма вече да участвам в C++ курсовете, трябва да питате колегите от СофтУни

0