Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 03.10.2014
Сообщений: 111
1

Использование указателей в качестве аргументов функций

28.04.2015, 21:05. Показов 665. Ответов 10
Метки нет (Все метки)

Здравствуйте, дорогие форумчане! Проблема возникла с функциями, не могу его правильно вызвать, программа по своей природе выполняет умножение матриц, а само умножение написано на ассемблере и оно прекрасно работает, не могу вызвать функцию mul(), в чем проблема подскажите пожалуйста?
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <iostream>
#include <stdlib.h>
#include <conio.h> 
#include <locale.h>
 
 
extern "C" int _cdecl multiplication (
            const int *matrix_1,    // Первая матрица
            const int N1,       // Число строк первой матрицы
            const int M1,       // Число столбцов второй матрицы
            const int *matrix_2,    // Вторая матрица
            const int N2,       // Число строк второй матрицы
            const int M2,       // Число столбцов второй матрицы
            int *matrix_result);    // Матрица-результат
 
 
int mul(int *matrix_1, int *matrix_2, int N1, int M1, int N2, int M2, int *matrix_result) 
{ 
 
    // Перемножение матриц
    matrix_result= (int*)malloc(N1*M2*sizeof(int)); // Выделение динамической памяти под матрицу-результат
    // Вызов функции multiplication
    if ( multiplication (matrix_1, N1, M1, matrix_2, N2, M2, matrix_result) ) 
// Если перемножение прошло успешно
    {   
        
        //Вывод матрицы-результата
        printf ("Результат перемножения данных матриц:\n");
        for (int i=0; i<N1; i++)
        {
            for (int j=0; j<M2; j++)
            {
                printf ("%d\t", matrix_result[i*M2+j]);
            }
            printf ("\n");
        }
    }
    else    // Иначе перемножение невозможно
    {
        // Вывод сообщения о невозмножности перемножения
        printf ("Невозможно перемножить данные матрицы!!!");
    }
    
    return *matrix_result;
}
 
int main(int argc, char* argv[])
{
    setlocale(LC_ALL,".1251");      // Подключение русской кодировки
    /*int a;
    printf("Здравствуйте, выберите пожалуйста действие над матрицами");
    printf("Сложение=1    Вычитание=2    Умножение=3");
    scanf("%d", &a);
    system("cls");*/
    
    int *matrix_1;              // Первая матрица
    int *matrix_2;              // Вторая матрица
    int N1,                 // Число строк первой матрицы
        M1;                 // Число столбцов первой матрицы
    int N2,                 // Число строк второй матрицы
        M2;                 // Число столбцов второй матрицы
    int *matrix_result;         // Матрица-результат// Ввод первой матрицы
    
    
    printf ("Введите число строк первой матрицы: N1= ");
    scanf ("%d", &N1);
    printf ("Введите число столбцов первой матрицы: M1= ");
    scanf ("%d", &M1);
    matrix_1= (int*)malloc(N1*M1*sizeof(int));  // Выделение динамической памяти под первую матрицу
    printf ("Ввод элементов первой матрицы: \n");
    for (int i=0; i<N1; i++)
    {
        for (int j=0; j<M1; j++)
        {
            printf ("[%d][%d]= ", i+1, j+1);
            scanf ("%d", &matrix_1[i*M1+j]);
        }
    }
    printf ("\n");
 
    
    // Ввод второй матрицы
    printf ("Введите число строк второй матрицы: N2= ");
    scanf ("%d", &N2);
    printf ("Введите число столбцов второй матрицы: M2= ");
    scanf ("%d", &M2);
    matrix_2= (int*)malloc(N2*M2*sizeof(int));  // Выделение динамической памяти под вторую матрицу
    printf ("Ввод элементов второй матрицы: \n");
    for (int i=0; i<N2; i++)
    {
        for (int j=0; j<M2; j++)
        {
            printf ("[%d][%d]= ", i+1, j+1);
            scanf ("%d", &matrix_2[i*M2+j]);
        }
    }
    printf ("\n");
    
    int mul( int *matrix_1, int *matrix_2, int N1, int M1, int N2, int M2, int *matrix_result); 
    
    // Освобождение динамической памяти
    free (matrix_1);
    free (matrix_2);
    free (matrix_result);
    matrix_1= NULL;
    matrix_2= NULL;
    matrix_result= NULL; 
    getch();
 
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.04.2015, 21:05
Ответы с готовыми решениями:

Использование указателей в программах
Прошу составить программу на с++ 1)Составить программу для подсчёта количества положительных...

Использование указателей типа far, near, huge в Visual Studio 2008
Набираю код в Visual Studio 2008 - пример программы с использованием указателей типа far. Программа...

Указатели и динамические массивы. Использование указателей в качестве аргументов функций
Задан массив X(N) целых чисел. Поменять местами в массиве последнее простое число и первое...

С++ Тема «Указатели и динамические массивы. Использование указателей в качестве аргументов функций»
В целочисленном массиве Х(N) удалить все элементы, расположенные между макси-мальным и минимальным...

10
3171 / 1930 / 313
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
28.04.2015, 22:07 2
Цитата Сообщение от Tima1996 Посмотреть сообщение
не могу вызвать функцию mul()
У вас в коде нет ее вызова.
0
0 / 0 / 1
Регистрация: 03.10.2014
Сообщений: 111
28.04.2015, 22:22  [ТС] 3
на 99-строке я якобы ввел команду вызова, правда я не очень хорошо знаю функции в С++, как правильно вызвать не подскажите?
0
Модератор
Эксперт по электронике
8514 / 6329 / 857
Регистрация: 14.02.2011
Сообщений: 21,984
28.04.2015, 22:25 4
Цитата Сообщение от Tima1996 Посмотреть сообщение
на 99-строке я якобы ввел команду вызова,
Цитата Сообщение от Tima1996 Посмотреть сообщение
int mul( int *matrix_1, int *matrix_2, int N1, int M1, int N2, int M2, int *matrix_result);
это описание функции
Цитата Сообщение от Tima1996 Посмотреть сообщение
я не очень хорошо знаю функции в С++,
изучи
у тебя в программе куча вызовов функций, сравни с 99 строкой
0
3171 / 1930 / 313
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
28.04.2015, 22:29 5
Если параметры указаны верно, то, примерно, так:
C++
1
int Result = mul(matrix_1,matrix_2,N1,M1,N2,M2,matrix_result);
0
0 / 0 / 1
Регистрация: 03.10.2014
Сообщений: 111
28.04.2015, 22:36  [ТС] 6
нет, так не работает, я тоже так пробовал, после этого выдает "Run-Time Check Failure #3 - The variable 'matrix_result' is being used without being initialized"
0
3171 / 1930 / 313
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
28.04.2015, 23:10 7
Цитата Сообщение от Tima1996 Посмотреть сообщение
matrix_result' is being used without being initialized
Ну, так у вас в mul() какая-то хрень написана. matrix_result - это параметр? И что вы пытаетесь вернуть через регистр процессора - матрицу?
0
0 / 0 / 1
Регистрация: 03.10.2014
Сообщений: 111
29.04.2015, 05:34  [ТС] 8
Цитата Сообщение от gazlan Посмотреть сообщение
И что вы пытаетесь вернуть через регистр процессора - матрицу?
да матрицу

Добавлено через 5 минут
без функций программа работает прекрасно, но мне необходимы функции которые будут умножать матрицы, слагать и вычитать, и ввод должен происходить в основной функции, в самом начале программа должна спросить пользователя какую именно операцию он хочет выполнить с матрицей, после выбора программа запускает одно из функции, после выводит результирующую матрицу на экран
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <iostream>
#include <stdlib.h>
#include <conio.h> 
#include <locale.h>
 
 
extern "C" int _cdecl multiplication (
            const int *matrix_1,    // Первая матрица
            const int N1,       // Число строк первой матрицы
            const int M1,       // Число столбцов второй матрицы
            const int *matrix_2,    // Вторая матрица
            const int N2,       // Число строк второй матрицы
            const int M2,       // Число столбцов второй матрицы
            int *matrix_result);    // Матрица-результат
 
 
 
int main(int argc, char* argv[])
{
    setlocale(LC_ALL,".1251");      // Подключение русской кодировки
    /*int a;
    printf("Здравствуйте, выберите пожалуйста действие над матрицами");
    printf("Сложение=1    Вычитание=2    Умножение=3");
    scanf("%d", &a);
    system("cls");*/
    
    int *matrix_1;              // Первая матрица
    int *matrix_2;              // Вторая матрица
    int N1,                 // Число строк первой матрицы
        M1;                 // Число столбцов первой матрицы
    int N2,                 // Число строк второй матрицы
        M2;                 // Число столбцов второй матрицы
    int *matrix_result;         // Матрица-результат// Ввод первой матрицы
    
    
    printf ("Введите число строк первой матрицы: N1= ");
    scanf ("%d", &N1);
    printf ("Введите число столбцов первой матрицы: M1= ");
    scanf ("%d", &M1);
    matrix_1= (int*)malloc(N1*M1*sizeof(int));  // Выделение динамической памяти под первую матрицу
    printf ("Ввод элементов первой матрицы: \n");
    for (int i=0; i<N1; i++)
    {
        for (int j=0; j<M1; j++)
        {
            printf ("[%d][%d]= ", i+1, j+1);
            scanf ("%d", &matrix_1[i*M1+j]);
        }
    }
    printf ("\n");
 
    
    // Ввод второй матрицы
    printf ("Введите число строк второй матрицы: N2= ");
    scanf ("%d", &N2);
    printf ("Введите число столбцов второй матрицы: M2= ");
    scanf ("%d", &M2);
    matrix_2= (int*)malloc(N2*M2*sizeof(int));  // Выделение динамической памяти под вторую матрицу
    printf ("Ввод элементов второй матрицы: \n");
    for (int i=0; i<N2; i++)
    {
        for (int j=0; j<M2; j++)
        {
            printf ("[%d][%d]= ", i+1, j+1);
            scanf ("%d", &matrix_2[i*M2+j]);
        }
    }
    printf ("\n");
    
    // Перемножение матриц
    matrix_result= (int*)malloc(N1*M2*sizeof(int)); // Выделение динамической памяти под матрицу-результат
    // Вызов функции multiplication
    if ( multiplication (matrix_1, N1, M1, matrix_2, N2, M2, matrix_result) ) 
// Если перемножение прошло успешно
    {   
        
        //Вывод матрицы-результата
        printf ("Результат перемножения данных матриц:\n");
        for (int i=0; i<N1; i++)
        {
            for (int j=0; j<M2; j++)
            {
                printf ("%d\t", matrix_result[i*M2+j]);
            }
            printf ("\n");
        }
    }
    else    // Иначе перемножение невозможно
    {
        // Вывод сообщения о невозмножности перемножения
        printf ("Невозможно перемножить данные матрицы!!!");
    } 
    
    // Освобождение динамической памяти
    free (matrix_1);
    free (matrix_2);
    free (matrix_result);
    matrix_1= NULL;
    matrix_2= NULL;
    matrix_result= NULL; 
    getch();
 
    return 0;
}
0
3171 / 1930 / 313
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
29.04.2015, 06:00 9
Цитата Сообщение от Tima1996 Посмотреть сообщение
да матрицу
Легче верблюду пройти сквозь игольное ушко... ©

Я так понимаю, вам это хочется на C++, раз вы в этом разделе? Вот и напишите методы класса Matrix для сложения и всего проч. И вызывайте их из меню. И не тащите верблюда матрицу через игольное ушко регистр.

Добавлено через 14 минут
C++ - Matrix Multiplication
0
0 / 0 / 1
Регистрация: 03.10.2014
Сообщений: 111
29.04.2015, 07:49  [ТС] 10
что вы понимаете под словом "таскать матрицу через регистр"? если вы имели ввиду вызов перемножение матриц из макроассемблера, то это обязательная внешняя функция, задание таково, написать матрицу с помощью классов усложнит мне задачу, мне всего лишь необходимо чтобы программа была написано через функции(внутри этих функций находятся подфункции или процедуры из ассемблера), покажите мне пожалуйста, всего лишь правильный вызов функции в котором аргументами являются указатели
0
3171 / 1930 / 313
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
29.04.2015, 08:34 11
Цитата Сообщение от Tima1996 Посмотреть сообщение
"таскать матрицу через регистр"
  • У процессора есть регистры общего назначения. 32 или 64 bits. Вы пытаетесь через такой регистр (EAX/RAX) вернуть матрицу.
  • Если классы вам не нужны, то логичнее было бы создавать тему в разделе С.
  • В любом случае, начните с псевдокода, а не с вызова функций. Когда напишите словами правильный алгоритм действий, остальное будет чисто технической работой.
К примеру
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
40
41
42
43
44
45
46
47
48
switch (cCommand)
{
   case '1':
   {
      // Define 1st matrix
      break;
   }
   case '2':
   {
      // Define 2nd matrix
      break;
   }
   case 'a':
   case 'A':
   {
      // Append
      break;
   }
   case 's':
   case 'S':
   {
      // Substruct
      break;
   }
   case 'm':
   case 'M':
   {
      // Multiple
      break;
   }
   case 'p':
   case 'P':
   {
      // Print result
      break;
   }
   case 'e':
   case 'E':
   {
      // Exit
      break;
   }
   default:
   {
      // Error !
      break;
   }
}

И проследите еще, чтобы выделение/освобождение памяти у вас находилось на одном уровне (в вызывающей функции).
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.04.2015, 08:34

Использование указателей в качесве аргументов функций
Из целочисленного массива Х(N) все четные элементы записать в массив Y(k). Удалить в массивах...

Константные указатели в качестве аргументов функций
Вскрылся вот такой пробел в знаниях/понимании. Итак, есть предположим однонаправленный список (в...

Использование массивов в качестве аргументов функции
Написала программу, работает правильно, только не совсем по условию задачи. Помоги пожалуйста...

Работа с двумерными числовыми массивами. Использование указателей. Использование функций пользователя.
Помогите пожалуйста!!!!!!! Сделать три варианта: первый вариант – передача данных между...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.