Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 05.01.2011
Сообщений: 25
1

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

22.11.2012, 17:24. Показов 855. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В программе выполняю транспонирование матрицы,через функцию,но возникли проблеммы с передачей аргументов.
Описание функции транспонирование
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)'
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.11.2012, 17:24
Ответы с готовыми решениями:

Ошибка в вызове функции
вопрос, в чем ошибка? объявлял так int pArray и int q

Ошибка в вызове функции
Здравствуйте, помогите исправить ошибку в вызове функции. Привожу часть кода: int main(int argc,...

Ошибка в вызове функции
Учителя толком не могут обьяснить в чем ошибка, объясните pls =( #include &lt;iostream.h&gt; void...

Ошибка в вызове функции
Добрый день, написал маленькую программку, которая записывает в файл данные работников. Вызываю 3...

13
753 / 552 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
22.11.2012, 17:52 2
а если отправить явно адрес первого элемента матрицы?
0
0 / 0 / 0
Регистрация: 05.01.2011
Сообщений: 25
22.11.2012, 21:23  [ТС] 3
Цитата Сообщение от gitarillo Посмотреть сообщение
а если отправить явно адрес первого элемента матрицы?
Не понимаю,а что это изменит?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.11.2012, 21:38 4
Цитата Сообщение от Вебер Посмотреть сообщение
Тело программы
Это что? Функция? Компилятор такое пропускает?
C++
1
double array[strok][stolb];
при том, что strok и stolb не константы.
0
0 / 0 / 0
Регистрация: 05.01.2011
Сообщений: 25
22.11.2012, 21:55  [ТС] 5
Да пропускает,и если не выносить "транспонирование матрицы" в отдельную функцию,а выполнять в теле программы так вобще всё работает.
Но хочется в отдельную функцию,а вот с передачей двумерного статического массива в функцию что то я запутался.
0
5498 / 4893 / 831
Регистрация: 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 / 0
Регистрация: 05.01.2011
Сообщений: 25
22.11.2012, 22:00  [ТС] 7
а как будет выглядеть вызов этого прототипа?
0
5498 / 4893 / 831
Регистрация: 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 в С++ ругают, а иногда и бьют.
1
753 / 552 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
22.11.2012, 22:20 9
Цитата Сообщение от alsav22 Посмотреть сообщение
void Traspon(double array[][N], int n, int m);
Цитата Сообщение от alsav22 Посмотреть сообщение
За goto в С++ ругают, а иногда и бьют

Не по теме:

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

0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.11.2012, 22:55 10
Цитата Сообщение от gitarillo Посмотреть сообщение
Так же, как за копирование массива при передаче в метод
Где это вы увидели копирование массива?
C++
1
Traspon(array,strok,stolb);
Написать, что массивы не передаются в функции по значению?
0
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.
0
5498 / 4893 / 831
Регистрация: 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;
0
753 / 552 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
23.11.2012, 08:53 13
alsav22, поправьте меня если я не прав, но разве при такой записи:
C++
1
void Traspon(double array[][N], int n, int m);
при вызове в стек будет положен адрес массива?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.11.2012, 12:44 14
Да. Массивы всегда передаются в функцию как указатели на начало массива. По значению не передаются.
1
23.11.2012, 12:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.11.2012, 12:44
Помогаю со студенческими работами здесь

Ошибка в вызове функции
Помогите пожалуйста в с++ только начинаю разбираться. Времени читать книги нет, надо завтра сдавать...

Ошибка при вызове функции
Ошибка в строке 90, при пошаговом выполнении она появляется при вызове функции, до захода в нее,...

Ошибка при вызове функции
Добрый день! Есть функция по расчету детерминанта int _det(int size,double **arr,double &amp;det) {...

Ошибка при вызове функции
В функции NewWords вызывается функция correct,при отладке я не могу войти в эту функцию,к тому же...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru