Передача двумерного массива в качестве параметра функции
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 07.11.17 09:51
Оценка:
Существует некоторый двумерный массив типа long double:

long double  myarray[2][10];


Как правильно передать его в качестве параметра в функцию:

void  myfunc(long double** myarray);


?

Правилен ли следующий код:

void  myfunc(long double** myarray)
{
    int  i, j;
    long double  val;
    for (i=0; i<2; i++)
    {
        val = myarray[i][j];
        // обработка переменной val;
    }
}

//...

long double  myarray[2][10];
long double* p &myarray[0][0];
myfunc(&p);


?
1613 г. = 2024 г.
Re: Передача двумерного массива в качестве параметра функции
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 07.11.17 09:53
Оценка:
Прошу прощения, вместо

long double* p &myarray[0][0];


следует читать:

long double* p = &myarray[0][0];
1613 г. = 2024 г.
Re: Передача двумерного массива в качестве параметра функции
От: Михaил  
Дата: 07.11.17 10:00
Оценка:
Здравствуйте, RussianFellow, Вы писали:

F>//...


RF>long double myarray[2][10];

RF>long double* p &myarray[0][0];
RF>myfunc(&p);
RF>[/ccode]

RF>?


См https://rsdn.org/forum/cpp/1229017.all
Автор: __kain
Дата: 18.06.05
Re: Передача двумерного массива в качестве параметра функции
От: kov_serg Россия  
Дата: 07.11.17 10:02
Оценка:
Здравствуйте, RussianFellow, Вы писали:

Уже скрылись от преследователей?

Если очень хочется по double**
void  myfunc(double** myarray);
double  m[2][10];
double* m2d[]={m[0],m[1]}; 
myfunc(m2d);
Re: Передача двумерного массива в качестве параметра функции
От: T4r4sB Россия  
Дата: 07.11.17 10:30
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Правилен ли следующий код:


RF>
RF>void  myfunc(long double** myarray)
RF>long double  myarray[2][10];
RF>long double* p &myarray[0][0];
RF>myfunc(&p);
RF>


Ужас какой.
Сюда передаётся указатель на p. Внутри функции при попытке взять myarray[1] она попытается разыменовать адрес, соседний с p. Скрашится сразу.
Функция внутри ничего не знает о размерности массива, а без неё двойной индекс не взять.

Хотя бы так сделай:
long double* p[2] = (&myarray[0][0],&myarray[1][0]);
myfunc(p);
Отредактировано 07.11.2017 10:50 T4r4sB . Предыдущая версия .
Re: Передача двумерного массива в качестве параметра функции
От: Анатолий Широков СССР  
Дата: 07.11.17 11:31
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Существует некоторый двумерный массив типа long double:


void foo(double (&r)[2][10]) {
 ...
}


p.s. Ты только начал изучать С++?
Отредактировано 07.11.2017 11:33 Анатолий Широков . Предыдущая версия . Еще …
Отредактировано 07.11.2017 11:32 Анатолий Широков . Предыдущая версия .
Re: Передача двумерного массива в качестве параметра функции
От: Serg27  
Дата: 07.11.17 11:34
Оценка: 1 (1) +6
Здравствуйте, RussianFellow, Вы писали:

RF>Существует некоторый двумерный массив типа long double:

RF>
RF>long double  myarray[2][10];
RF>

RF>Как правильно передать его в качестве параметра в функцию:
RF>
RF>void  myfunc(long double** myarray);
RF>


Сейчас на дворе 2017 год. 2-х мерные массивы в C-стиле из 70-х годов сейчас использовать тяжело и небезопасно.
Наверное именно в этом случае лучше так (при отладке быстро выловите все ошибки индексации по крайней мере):
#include <iostream>
#include <array>
using namespace std;

typedef std::array<std::array<long double, 10>, 2> my_arr_t;
void  myfunc(my_arr_t & myarray)
{
    myarray[1][5] = 1;
}

int main() {
    my_arr_t arr;
    arr[1][5] = -1;
    myfunc(arr);
    cout << arr[1][5] << endl;
    return 0;
}
Re[2]: Передача двумерного массива в качестве параметра функции
От: Desmodus Новороссия  
Дата: 09.11.17 11:53
Оценка:
Здравствуйте, Serg27, Вы писали:

S>Сейчас на дворе 2017 год. 2-х мерные массивы в C-стиле из 70-х годов сейчас использовать тяжело и небезопасно.


Здравствуйте КОпетан! Наверное неспроста эти массивы именно в С стиле. Например, там банально не плюсов. Микроконтроллер какой нибудь.
Re[2]: Передача двумерного массива в качестве параметра функции
От: Аноним Россия  
Дата: 09.11.17 12:54
Оценка:
Здравствуйте, Serg27, Вы писали:

S>Сейчас на дворе 2017 год. 2-х мерные массивы в C-стиле из 70-х годов сейчас использовать тяжело и небезопасно.


Можно и из 98 года. Чем мешает valarray?

А std::array в данном случае вещь безобразная. Как это всё будет выглядеть в таком виде?
typedef std::array<std::array<long double, 10>, 100000> my_arr_t;


За стек не боишься?
Re: Передача двумерного массива в качестве параметра функции
От: Аноним Россия  
Дата: 09.11.17 13:20
Оценка:
Здравствуйте, RussianFellow, Вы писали:

На тесты отвечаешь?

RF>Существует некоторый двумерный массив типа long double:


RF>

RF>long double myarray[2][10];
RF>


RF>Как правильно передать его в качестве параметра в функцию:


RF>

RF>void myfunc(long double** myarray);
RF>


RF>?


Выглядит безобразно, но можно, если ничего не боишься, то нужно хотя бы указать размерность массивов. Если размерность всегда постоянная и эта постоянность гарантирована, то проще передавать матрицу как одномерный массив, а обращение к элементам вести через как-нибудь get(i,j)

RF>Правилен ли следующий код:


RF>

RF>void myfunc(long double** myarray)
RF>{
RF> int i, j;
RF> long double val;
RF> for (i=0; i<2; i++)
RF> {
RF> val = myarray[i][j];
RF> // обработка переменной val;
RF> }
RF>}
RF>


Нет, упадет сразу, но это и к лучшему.
Чему равен j? Возвращаясь назад, из чего следует, что количество строк больше или равно 2?

RF>


RF>long double myarray[2][10];

RF>long double* p &myarray[0][0];
RF>


хотя бы так, чтобы не ругался компилятор 
long double* p = (long double*)&myarray[0][0];
можно и так:
long double** p = (long double**)myarray;


RF>

RF>myfunc(&p);
RF>


RF>?
Re[2]: Передача двумерного массива в качестве параметра функции
От: Анатолий Широков СССР  
Дата: 09.11.17 13:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>можно и так:
А>long double** p = (long double**)myarray;
А>


Вот так как раз нельзя, поскольку двухмерный массив не является массивом указателей, а представляет собой линейную развертку в памяти.
Re: Передача двумерного массива в качестве параметра функции
От: MasterZiv СССР  
Дата: 09.11.17 15:21
Оценка: +1
Здравствуйте, RussianFellow, Вы писали:

RF>Существует некоторый двумерный массив типа long double:


RF>
RF>long double  myarray[2][10];
RF>


RF>Как правильно передать его в качестве параметра в функцию:


RF>
RF>void  myfunc(long double** myarray);
RF>


RF>?


Неправильно уже.

Надо

void myfunc(long double* myarray, size_t n_rows, size_t n_cols);
Re: Передача двумерного массива в качестве параметра функции
От: Кодт Россия  
Дата: 13.11.17 12:18
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Существует некоторый двумерный массив типа long double:

RF>Как правильно передать его в качестве параметра в функцию:

Есть несколько подходов.

1. Шаблон функции, принимающий любые типы с двойным оператором взятия элемента (subscript).
template<class M> void foo(const M& m) {
  auto m12 = m[1][2];
}
double literally_matrix[10][20];
foo(literally_matrix);

double* (jagged_array[10]);
jagged_array[1] = matrix[1];
foo(jagged_array);

typedef double row[20];
double (*allocated_matrix)[20] = new row[10];
foo(allocated_matrix);

std::vector<std::vector<double>> jagged_vector(10, std::vector<double>(20));
foo(jagged_vector);


2. Функция, принимающая полиморфный адаптер; передавать адаптер конкретного объекта
double matrix[10][20];

struct IMatrix {
  virtual double at(int x, int y) const = 0;
};
void foo(const IMatrix& m);

struct TheMatrix_10x20 : IMatrix {
  double (&m)[10][20];
  double at(int x, int y) const override { return m[x][y]; }
};
foo(TheMatrix_10x20{matrix});

using subscript2 = std::function<double(int,int)>;
void foo(subscript2&& m);
foo([&matrix](int x, int y) { return matrix[x][y]; });


3. Передавать одномерный массив
void foo(double* rowbased_matrix, int rowsize) {
  double m12 = rowbased_matrix[1*rowsize+2];
}

double matrix[10][20];
foo(&matrix[0], 10);

std::vector<double> memory(10*20);
foo(memory.data(), 10);
Перекуём баги на фичи!
Re: Передача двумерного массива в качестве параметра функции
От: rg45 СССР  
Дата: 13.11.17 15:42
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>
RF>long double  myarray[2][10];
RF>

RF>Как правильно передать его в качестве параметра в функцию:
RF>
RF>void  myfunc(long double** myarray);
RF>


В C/C++ любые массивы передаются в функцию как указатели на начальный элемент. Элементом двумерного массива является одномерный массив. А значит, в фунцию может передаваться как указатель на одномерный массив соответствующей размерности:

void  myfunc(long double (*arr)[10]);


Это объявление полностью эквивалентно следующему

void  myfunc(long double arr[][10]);


Распространенным заблужением является использование реальной величины второй размерности в квадратных скобках ([2] в данном случае). На самом деле, вместо двойки здесь можно указать любое потолочное значение, так как компилятор все равно его проигнорирует. Повторюсь, оба объявления, показанные выше, эквивалентны.

В С++ существует возможность передать двумерный массив по ссылке, с сохранением обеих размерностей, как советовал Анатолий Широков:

void  myfunc(long double (&arr)[2][10]);
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 13.11.2017 15:52 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.