1 Востаннє редагувалося dialectstat (27.04.2015 16:02:56)

Тема: Масив як вхідний параметр функції

Є функція з шапкою:

void jacobi ( const unsigned int n, double * const * a, double * d, double * const * v ) {
}

n - вхідна int константа,
a - вхідна матриця nxn,
d - вихідний вектор,
v - вихідна матриця.

В основному тілі програми описав їх як

const int n=3;
double a[2][2];
double v[2][2];
double d[2];

Задав матрицю a.
викликаю функцію

jacobi(n,a,d,v);

при компіляції виникає помилка у виклику функції
error: cannot convert ‘double (*)[2]’ to ‘double* const*’ for argument ‘2’ to ‘void jacobi(unsigned int, double* const*, double*, double* const*)’

double (*)[2] відноситься до матриці а.
в чому може бути річ?

2 Востаннє редагувалося vitia444 (27.04.2015 16:14:57)

Re: Масив як вхідний параметр функції

dialectstat написав:

Є функція з шапкою:

void jacobi ( const unsigned int n, double * const * a, double * d, double * const * v ) {
}

при компіляції виникає помилка у виклику функції
error: cannot convert ‘double (*)[2]’ to ‘double* const*’ for argument ‘2’ to ‘void jacobi(unsigned int, double* const*, double*, double* const*)’

double (*)[2] відноситься до матриці а.
в чому може бути річ?

Власне, компілятор Вам вже все сказав - що означає тип double*const*, коли на вхід Ви подаєте масив double*?
Погугліть, як правильно оголошувати масиви, або розкажіть, що це у Вас за новітня шапка)

3 Востаннє редагувалося dialectstat (27.04.2015 16:15:50)

Re: Масив як вхідний параметр функції

Функція звідси http://prografix.narod.ru/rus_jacobi.html
Якраз не можу знайти, що означає конструкція double*const*a ?

4

Re: Масив як вхідний параметр функції

dialectstat написав:

Функція звідси http://prografix.narod.ru/rus_jacobi.html
Якраз не можу знайти, що означає конструкція double*const*a ?

Не знаю, що вони хотіли цим сказати (можливо це просто уловка), тому просто залиште double*

5

Re: Масив як вхідний параметр функції

vitia444 написав:
dialectstat написав:

Функція звідси http://prografix.narod.ru/rus_jacobi.html
Якраз не можу знайти, що означає конструкція double*const*a ?

Не знаю, що вони хотіли цим сказати (можливо це просто уловка), тому просто залиште double*

Тепер помилки в тілі функції
za.new_our_jacob_elipticity_SDSS.cpp: In function ‘void jacobi(unsigned int, double*, double*, double*)’:
za.new_our_jacob_elipticity_SDSS.cpp:28:29: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:31:19: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:42:36: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:51:54: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:52:79: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:54:35: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:56:72: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:62:48: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:67:27: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:70:48: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:71:48: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:72:31: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:73:31: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:77:48: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:78:48: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:79:31: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:80:31: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:84:48: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:85:48: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:86:31: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:87:31: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:91:48: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:92:48: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:93:31: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp:94:31: error: invalid types ‘double[unsigned int]’ for array subscript
za.new_our_jacob_elipticity_SDSS.cpp: In function ‘int main()’:
za.new_our_jacob_elipticity_SDSS.cpp:346:17: error: cannot convert ‘double (*)[42]’ to ‘double*’ for argument ‘2’ to ‘void jacobi(unsigned int, double*, double*, double*)’

6

Re: Масив як вхідний параметр функції

Поставте звичайний int замість unsigned int

7

Re: Масив як вхідний параметр функції

І ще певно там замість double*const* поставити double**, оскільки на вхід Ви подаєте масив масивів double

8

Re: Масив як вхідний параметр функції

vitia444 написав:

І ще певно там замість double*const* поставити double**, оскільки на вхід Ви подаєте масив масивів double

Все одно
za.new_our_jacob_elipticity_SDSS.cpp: In function ‘int main()’:
za.new_our_jacob_elipticity_SDSS.cpp:346:17: error: cannot convert ‘double (*)[2]’ to ‘double**’ for argument ‘2’ to ‘void jacobi(int, double**, double*, double**)’

9

Re: Масив як вхідний параметр функції

Тоді я безсилий... Можливо хтось інший допоможе на форумі

10

Re: Масив як вхідний параметр функції

double*const*

Здається що це константий вказівник на вказівник на змінну типу double.

11

Re: Масив як вхідний параметр функції

Arete написав:

double*const*

Здається що це константий вказівник на вказівник на змінну типу double.

Як тоді вирулити з цієї ситуація, як використати функцію?

12 Востаннє редагувалося Ярослав (27.04.2015 22:11:41)

Re: Масив як вхідний параметр функції

Досі не зустрічався із типом даних, що вказаний у Вас в коді, але знайшов ось такий код на сайті http://algorithm.narod.ru:
http://algorithm.narod.ru/ln/eigen/Jacobi.html

13

Re: Масив як вхідний параметр функції

Гляньте на книжку Дьюхерста "C++ Cвященные знания" там в шостій темі детально описано як передавати масиви в функції.
Наприклад тут http://сайт-злодій/doc-73701965_323564975.

Подякували: dialectstat1

14

Re: Масив як вхідний параметр функції

Трохи теорії. В C/C++ ім'я масиву в більшості випадків означає вказівник на його початковий елемент:

a == &a[0]
&a[i] == a + i
a[i] == *(a + i)

Якщо масив розташований за адресою 0x100, то вийде, що f(a) виконає, фактично, f(0x100); а &a[1] буде дорівнювати 0x100+sizeof(a[0]) - скажімо, 0x108.
А от з масивами масивів все складніше.

double b[2][2];

масив масивів - це шматок пам'яті з 4 елементів, по рядках. В пам'яті він виглядає так само, як і масив a[4]; а в функцію буде передане посилання на його початок, і головне питання - як воно буде розглядатися в функції.
Найпростіший варіант - записати всі (крім першого) розміри:
f(double b[][2]) буде працювати, як треба, бо компілятор знає, як обчислити адресу &b[1][1] = b + sizeof(b[0]).
Можна записати це також як
f(double (*b)[2]) - вказівник на масив з 2-х елементів. Адреса обчислюється так само, і, фактично, жодної різниці з попереднім варіантом нема.
А от f(double **c) - щось зовсім відмінне. Тут у нас вказівник не на елемент масиву, а на інший вказівник. Тобто нам треба створити додатковий масив вказівників double *c[2] і кожному з вказівників надати якесь значення, наприклад

double b[2][2]; //наприклад 0x100
double *c[2];//наприклад 0x200
c[0]=&b[0];// за адресою 0x200 знаходиться 0x100
c[1]=&b[1];// за адресою 0x204 знаходиться 0x110
f(c);//f(0x200)

Потрібні такі збочення, насправді, для роботи з динамічною пам'яттю, коли у нас не масив, а вказівник, а сам масив створюється динамічно в купі. У вашому випадку, я так розумію, цілком достатньо прописати всюди розміри масивів і не ламати собі голову.

Подякували: Arete, dialectstat3

15

Re: Масив як вхідний параметр функції

koala, дуже дякую, я розібрався з вашою допомогою.