Форум программистов, компьютерный форум CyberForum.ru

Ошибка в вызове функции - C++

Восстановить пароль Регистрация
 
Вебер
0 / 0 / 0
Регистрация: 05.01.2011
Сообщений: 25
22.11.2012, 17:24     Ошибка в вызове функции #1
В программе выполняю транспонирование матрицы,через функцию,но возникли проблеммы с передачей аргументов.
Описание функции транспонирование
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void Traspon(double** array, int n, int m)
{
    if(n==m)
    {
    for(int i=0;i<n;i++)
    {
    for(int j=i;j<m;j++)
    {
            double temp=array[i][j];
            array[i][j]=array[j][i];
            array[j][i]=temp;
    }}
    printf("Транспонирование:\n");
        for (int i=0; i<m; i++) 
            { 
            for (int j=0; j<n; j++) printf ("%9.3lf   ", array[i][j]); 
            printf("\n"); 
            }
    }
Тело программы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
int first(int abc)
{
   int strok,stolb;
a:printf("Введите количество строк и стобцов:\nСтроки= ");    
scanf("%d",&strok);
printf("\nСтолбцы= ");   
scanf("%d",&stolb);  
if((strok*stolb)<4 || (strok*stolb)>15)
{
printf("Размер массива должен быть не менее 4 и не более 15\n");
goto a;
}
double array[strok][stolb];
for (int i=0; i<strok; i++) 
{   
  for (int j=0; j<stolb; j++) 
  { 
    if(i<j)
    {
        array[i][j]=(double)1/(i+j-1);
    }
    else if (i>j)
    {
      array[i][j]=(double)1/(i+j-1); //заполнение матрицы
    }
    else
    {
      array[i][j]=0;
    }  
  } 
} 
for (int i=0; i<strok; i++) 
{ 
  for (int j=0; j<stolb; j++) printf ("%9.3lf   ", array[i][j]); //вывод исходной матрицы на экран
printf("\n"); 
}
Traspon(array,strok,stolb); // вызов функции транспонирования
getch();
}
п.с. компилятор ругается на строку вызова функции
first.cpp cannot convert `double (*)[((unsigned int)((int)stolb))]' to `double**' for argument `1' to `void Traspon(double**, int, int)'
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gitarillo
 Аватар для gitarillo
712 / 512 / 24
Регистрация: 17.06.2010
Сообщений: 1,012
Записей в блоге: 1
22.11.2012, 17:52     Ошибка в вызове функции #2
а если отправить явно адрес первого элемента матрицы?
Вебер
0 / 0 / 0
Регистрация: 05.01.2011
Сообщений: 25
22.11.2012, 21:23  [ТС]     Ошибка в вызове функции #3
Цитата Сообщение от gitarillo Посмотреть сообщение
а если отправить явно адрес первого элемента матрицы?
Не понимаю,а что это изменит?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.11.2012, 21:38     Ошибка в вызове функции #4
Цитата Сообщение от Вебер Посмотреть сообщение
Тело программы
Это что? Функция? Компилятор такое пропускает?
C++
1
double array[strok][stolb];
при том, что strok и stolb не константы.
Вебер
0 / 0 / 0
Регистрация: 05.01.2011
Сообщений: 25
22.11.2012, 21:55  [ТС]     Ошибка в вызове функции #5
Да пропускает,и если не выносить "транспонирование матрицы" в отдельную функцию,а выполнять в теле программы так вобще всё работает.
Но хочется в отдельную функцию,а вот с передачей двумерного статического массива в функцию что то я запутался.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.11.2012, 21:58     Ошибка в вызове функции #6
Прототип функции, которая принимает двумерный статический массив:
C++
1
2
const int N = 6;
void Traspon(double array[][N], int n, int m);
Добавлено через 1 минуту
Цитата Сообщение от Вебер Посмотреть сообщение
Да пропускает,и если не выносить "транспонирование матрицы" в отдельную функцию,а выполнять в теле программы так вобще всё работает.
Если работает, это не значит, что правильно сделано. В какой среде делаете? Как у вас в коде, статические массивы не создаются. Или создавайте динамический массив.
Вебер
0 / 0 / 0
Регистрация: 05.01.2011
Сообщений: 25
22.11.2012, 22:00  [ТС]     Ошибка в вызове функции #7
а как будет выглядеть вызов этого прототипа?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.11.2012, 22:15     Ошибка в вызове функции #8
Цитата Сообщение от Вебер Посмотреть сообщение
а как будет выглядеть вызов этого прототипа?
Как у вас в коде. Но правильно будет создать динамический массив:
C++
1
2
3
double **array = new double*[strok];
for (int i = 0; i < strok; i++)
      array[i] = new double[stolb];
Добавлено через 3 минуты
И лучше не используйте для имён переменных слово array. В каких-то компиляторах оно используется как ключевое.

Добавлено через 3 минуты
За goto в С++ ругают, а иногда и бьют.
gitarillo
 Аватар для gitarillo
712 / 512 / 24
Регистрация: 17.06.2010
Сообщений: 1,012
Записей в блоге: 1
22.11.2012, 22:20     Ошибка в вызове функции #9
Цитата Сообщение от alsav22 Посмотреть сообщение
void Traspon(double array[][N], int n, int m);
Цитата Сообщение от alsav22 Посмотреть сообщение
За goto в С++ ругают, а иногда и бьют

Не по теме:

Так же, как за копирование массива при передаче в метод

alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.11.2012, 22:55     Ошибка в вызове функции #10
Цитата Сообщение от gitarillo Посмотреть сообщение
Так же, как за копирование массива при передаче в метод
Где это вы увидели копирование массива?
C++
1
Traspon(array,strok,stolb);
Написать, что массивы не передаются в функции по значению?
Вебер
0 / 0 / 0
Регистрация: 05.01.2011
Сообщений: 25
22.11.2012, 23:25  [ТС]     Ошибка в вызове функции #11
Спасибо alsav22, за то что помог.
В теле программы использовал динамический массив.
Прототип функции-
C++
1
void Traspon(double** array, int n, int m)
Всё работает как надо
п.с. насчет goto всё верно,дурная привычка(быдлокодер пока что я),среда кстати dev cpp.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.11.2012, 23:49     Ошибка в вызове функции #12
Не забудьте только память под массивом освободить в нужное время.
C++
1
2
3
4
for (int i = 0; i < strok; i++)
     delete [] array[i];
 
delete [] array;
gitarillo
 Аватар для gitarillo
712 / 512 / 24
Регистрация: 17.06.2010
Сообщений: 1,012
Записей в блоге: 1
23.11.2012, 08:53     Ошибка в вызове функции #13
alsav22, поправьте меня если я не прав, но разве при такой записи:
C++
1
void Traspon(double array[][N], int n, int m);
при вызове в стек будет положен адрес массива?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2012, 12:44     Ошибка в вызове функции
Еще ссылки по теме:

GCC ошибка при вызове функции C++
Ошибка в вызове функции C++
C++ Ошибка в вызове функции

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.11.2012, 12:44     Ошибка в вызове функции #14
Да. Массивы всегда передаются в функцию как указатели на начало массива. По значению не передаются.
Yandex
Объявления
23.11.2012, 12:44     Ошибка в вызове функции
Ответ Создать тему
Опции темы

Текущее время: 16:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru