Хорошо, я собираюсь обойти проблему с использованием массива переменной длины (VLA) в C++
(на данный момент - VLA не разрешено в Стандарт C++
) и, во-первых, опубликуйте решение вашей проблемы. Это (как вы правильно «догадались» в ваших комментариях) в этом l oop:
//i think this part has something messed up
for(int i=lb;i<=ub;i=i+1){
arr[i]= newarr[i];
}
Здесь, хотя индекс i
(который начинается с заданной нижней границы, lb
) правильно для массива arr
, не правильно для массива newarr
! Он создается локально, с размером ub - lb + 1
(правильный), но индексы начинаются с нуля - поэтому вам необходимо удалить смещение lb
для newarr
:
for (i = lb; i <= ub; i++) { // NOTE: You've already declared "int i" - a new one will give a 'hides previous declaration' warning
arr[i] = newarr[i - lb]; // *** You need to remove the lower-bound offset!
}
По вопросу VLA в C++
: я считаю, GCC/g++
поддерживает их, но, если вы хотите соответствовать Стандарту C++
, вы должны использовать std :: vector. Таким образом, вместо:
int newarr[ub - lb + 1];
используйте:
std::vector<int> newarr(size_t(ub - lb + 1));
и аналогично используйте std::vector<int> arr(n);
в вашей функции main
. Для минимальных изменений в вашем коде вы все равно можете сохранить свою void MergeElements(int arr[], int lb, int ub)
подпись, но, чтобы вызвать ее с помощью std::vector
, вам нужно указать адрес первого элемента. Так, в main
используйте это:
MergeElements(&arr[0], 0, n - 1);
Не стесняйтесь просить дальнейших разъяснений и / или объяснений.