Как заменить на динамический массив
задание состояло в том, чтобы заменить первую строку на первый столбец в матрице, если их суммы равно, данное задание нужно было сделать используя С++ и Ассемблер. Сделала данное задание, но преподаватель сказал исправить, чтобы размер массива вводился с клавиатуры и потом динамически выделялась память, а как это исправить не знаю. Спасибо всем кто откликнется.
Код с++:
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <iomanip>
#include <conio.h>
extern "C" void asm_proc(int *a, int); // описание прототипа ASM-подпрограммы
using namespace std;
void Input(int arr[3][3]);
void Output(int arr[3][3]);
int main()
{
setlocale(LC_ALL, "russian");
int a[3][3] = { 0 };
cout << "Задание: Если сумма элементов первой строки = сумме элементов первого столбца, " << endl << "обмнять элементы первой строки с элементами первого столбца " << endl << endl;
cout << "Исходный массив: " << endl;
Input(a);
Output(a);
asm_proc(&a[0][0], 3);
cout << "Массив после оброботки: " << endl;
Output(a);
system("pause");
return 0;
}
void Input(int arr[3][3])//функция заполнения массива с входными параметрами: массив и ограничение
{
srand(time(NULL)); // "инициализация" генератора случайных чисел
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
arr[i][j] = rand() % 10;
}
}
void Output(int arr[3][3])//функция вывода массива в консоль
{
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
cout << setw( 5) << arr[i][j];
cout << endl;//переход на следующую строку
}
}
Код асм:
.386
.model flat, c
public asm_proc
.data
summ dd 0
.code
asm_proc proc
push ebp
mov ebp, esp
mov esi, [ebp + 8]
mov ecx, [ebp + 12]
@add_summ:
lodsd
add [summ], eax
loop @add_summ
mov esi, [ebp + 8]
mov ecx, [ebp + 12]
mov ebx, ecx
shl ebx, 2
@sub_summ:
mov eax, [esi]
sub [summ], eax
add esi, ebx
loop @sub_summ
; проверка равенства строк через разность суммы
cmp summ, 0
jne @exit
mov esi, [ebp + 8]
mov edi, [ebp + 8]
mov ecx, [ebp + 12]
;делаем обмен
@swap:
push [edi]
push [esi]
pop [edi]
pop [esi]
add esi, 4
add edi, ebx
loop @swap
@exit:
leave
retn
asm_proc endp
end
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Заменяем ваше
int a[3][3] = { 0 };
на что-то типа
int **a = new int*[n];
for(int i = 0; i < n; ++i)
a[i] = new int[n];
и работаем с a почти так же, как с двумерным массивом - передавая его в функции как int**a, и обращаясь к элементам, как и ранее - a[i][j].