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

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

28.04.2015, 21:05. Показов 996. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.04.2015, 21:05
Ответы с готовыми решениями:

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

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

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

10
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
28.04.2015, 22:07
Цитата Сообщение от Tima1996 Посмотреть сообщение
не могу вызвать функцию mul()
У вас в коде нет ее вызова.
0
0 / 0 / 1
Регистрация: 03.10.2014
Сообщений: 111
28.04.2015, 22:22  [ТС]
на 99-строке я якобы ввел команду вызова, правда я не очень хорошо знаю функции в С++, как правильно вызвать не подскажите?
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,859
28.04.2015, 22:25
Цитата Сообщение от 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
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
28.04.2015, 22:29
Если параметры указаны верно, то, примерно, так:
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  [ТС]
нет, так не работает, я тоже так пробовал, после этого выдает "Run-Time Check Failure #3 - The variable 'matrix_result' is being used without being initialized"
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
28.04.2015, 23:10
Цитата Сообщение от 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  [ТС]
Цитата Сообщение от 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
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
29.04.2015, 06:00
Цитата Сообщение от Tima1996 Посмотреть сообщение
да матрицу
Легче верблюду пройти сквозь игольное ушко... ©

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

Добавлено через 14 минут
C++ - Matrix Multiplication
0
0 / 0 / 1
Регистрация: 03.10.2014
Сообщений: 111
29.04.2015, 07:49  [ТС]
что вы понимаете под словом "таскать матрицу через регистр"? если вы имели ввиду вызов перемножение матриц из макроассемблера, то это обязательная внешняя функция, задание таково, написать матрицу с помощью классов усложнит мне задачу, мне всего лишь необходимо чтобы программа была написано через функции(внутри этих функций находятся подфункции или процедуры из ассемблера), покажите мне пожалуйста, всего лишь правильный вызов функции в котором аргументами являются указатели
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
29.04.2015, 08:34
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.04.2015, 08:34
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru