Ответ 1
Посмотрите на "Экскурсии: многомерные массивы", в которых описывается, как передавать многомерные массивы в функции в качестве аргументов. В основном вы хотите изменить свой код на это:
// same as void f(double (*a)[2]) {
void f(double a[][2]) {
}
int main() {
// note. this is not a pointer to a pointer,
// but an array of arrays (4 arrays of type double[2])
double var[4][2];
// trying to pass it by value will pass a pointer to its
// first element
f(var);
}
Все вызываемые функции должны быть известны всем, кроме последних. В противном случае, индексируя массив, компилятор не сможет вычислить правильное расстояние до значений в вашем массиве (a [1] находится в sizeof(double[2])
байтах от [0]).
Кажется, вы хотите принять массив без знания размера размеров. Вы можете использовать шаблоны для этого:
template<std::size_t N>
void f(double a[][N]) {
// N == 2 for us
}
int main() {
double var[4][2];
f(var);
}
Компилятор сделает копию (экземпляр) этого шаблона для каждого значения N, используемого с функцией, автоматически выведя правильный N.