Другие языки программирования и технологии

C++ Как объявить и вывести из функции статический двумерный массив?

Никак.
Для начала, в C++ нет стандартных двумерных массивов - есть массивы массивов, массивы указателей на массивы, массивы векторов, векторы векторов, векторы указателей... и это я еще до std::valarray не добрался.
Затем - при передаче и возврате из функции компилятору необходимо знать размер того, что передается. Ты ничего не написал про то, что размер фиксирован; но даже если так, значительно лучше передавать не сам массив, а указатель на него, и обычно именно так и происходит.
Rustam Murzagaliyev
Rustam Murzagaliyev
78 885
Лучший ответ
Сергей Статник Я понимаю, что нужно использовать указатель на массив, я это уже слышал.
Вопрос: как сделать это со статическим и двумерным?
Дан массив a(n,m), n, m - какие-то числа.
Нужно написать функцию для ввода этого массива и отдельно функцию для вывода.
Я этого совершенно не понимаю. На лекции нам дали в примере одномерный массив, который просто передается тремя способами (указатель, адрес и константу) в функцию и там обрабатывается. Что вообще такое адреса и указатели и чем они вообще отличаются нам еще не объясняли. Делайте, как хотите.
Сергей Статник Не нравится мне ваш C++, слишком муторный. Только деваться некуда.
Сагындык Жанболатов > в C++ нет стандартных двумерных массивов

http://eel.is/c++draft/dcl.array#:declarator,multidimensional_array
#include <iostream>
using namespace std;
template<typename T, const size_t rows, const size_t cols>
class Matrix {
public:
Matrix() {
for (size_t row = 0; row < rows; ++row) {
for (size_t col = 0; col < cols; ++col) {
matrix[row][col] = 0;
}
}
}
void ouput()const {
for (size_t row = 0; row < rows; ++row) {
for (size_t col = 0; col < cols; ++col) {
cout << ' ' << matrix[row][col];
}
cout << endl;
}
}
void fill() {
for (size_t row = 0; row < rows; ++row) {
for (size_t col = 0; col < cols; ++col) {
cout << "Element[" << row << "][" << col << "]: ";
cin >> matrix[row][col];
}
}
}
private:
T matrix[rows][cols];
};
int main() {
Matrix<int, 2, 3> matrix;
matrix.ouput();
cout << endl;
matrix.fill();
cout << endl;
matrix.ouput();
cin.ignore();
cin.get();
}
АГ
Ахма Газиев
94 398
Сергей Статник А без классов-то никак?
Спасибо, конечно, на заметку возьму.
Незачем швыряться большими объемами данных в стэке, так как это слишком затратно.
return array_name;
Сергей Статник А именно? Мне нужна функция и как ее вызвать. Я не понимаю, как использовать указатели.
как я уже однажды отвечал, лучше засунуть массивы в структуры или классы, и уже объекты возвращать передавать и т. д.
Вова Мясоед
Вова Мясоед
30 074
Сергей Статник Я думаю, я бы знал, как выводить массивы из функции, если бы знал, что такое структуры и классы. Так что это мне не поможет.
const int**
Сергей Статник Статический?
http://coliru.stacked-crooked.com/a/9cdd673267dff18f

template< typename T, size_t W, size_t H >
std::ostream & operator << (std::ostream & os, T(&array2d)[W][H])
{
for (auto && row : array2d)
{
for (auto && i : row)
os << i << " ";
os << "\n";
}
return os;
}

template< typename T, size_t W, size_t H >
uint8_t (&length(T(&array2d)[W][H]))[W*H];

int main()
{
constexpr size_t w = 9;
constexpr size_t h = 7;
int array2d[w][h]{};
// empty
std::cout << array2d << "\n";
// fill
std::generate_n((int*)array2d, sizeof length(array2d), std::bind(std::uniform_int_distribution<>{0, 9}, std::mt19937{ std::random_device{}() }));
// show
std::cout << array2d << "\n";
}
Вова Яковлев
Вова Яковлев
14 578