Если вы хотите поменять число в каждой (отдельной) строке, вам не следует поменять местами указатели. Каждый указатель будет находиться в начале каждой строки, и вы можете получить доступ к n-му элементу m-й строки в виде простого double
значения, arr[m][n]
.
Далее, обратите внимание на последний элемент массива с n
элементами имеет индекс n-1
, , а не n
, поэтому вы должны инициализировать end
как n-1
, или arr[end]
будет вне -предельные значения при первом запуске через обмен l oop (что является причиной исключения SegFault
).
Затем вам необходимо сбросить start
и end
в начале каждый обмен строк - то есть внутри внешний for
l oop.
Итак, учитывая вышесказанное, ваш код обращения должен выглядеть (примерно) так:
for (int i = 0; i < m; i++) {
int start = 0; end = n - 1; // These need to be reset for EACH LINE.
while (start < end)
{
double temp = arr[m][start];
arr[m][start] = arr[m][end];
arr[m][end] = temp;
start++; end--;
}
}
Кроме того, вам также необходимо освободить память, выделенную вашим операторам new
, когда вы закончите работу с данными. Итак, в (или около) конце вашего main
, вы должны иметь такой код:
//...
for (int i = 0; i < m; i++)
delete[] arr[i]; // Delete this 'line'
delete[] arr; // And the delete the array of line pointers
return 0; // Good practice to explicitly return 0 (success code) from main!
}
И, наконец, вы будете далеко лучше использовать std::vector
контейнер, а не динамически создаваемые массивы. Вот как вы могли бы сделать это с std::vector
:
#include <iostream>
#include <vector>
#include <algorithm> // For std::reverse
int main()
{
size_t m = 4, n = 4;
// Create/populate vectors:
std::vector< std::vector<double> > arr(m);
for (size_t i = 0; i < m; i++) {
for (size_t j = 0; j < n; j++) {
arr[i].push_back(double(i + j));
}
}
// Reverse each line:
for (size_t i = 0; i < m; i++) {
std::reverse(arr[i].begin(), arr[i].end());
}
// Display results:
for (auto a: arr) {
for (auto d : a) {
std::cout << d << " ";
}
std::cout << std::endl;
}
return 0;
}