Как перенести массивы во внешние функции? - PullRequest
0 голосов
/ 01 ноября 2019

Я пишу программу на C, которая должна сделать некоторые матричные вычисления. Однако у меня возникла проблема с переносом двух массивов (моих матриц) во внешнюю функцию, которая их добавит.

Вот мой метод создания динамической матрицы:


        int w1, k1;//lines and columns for matrix1
    int* m1;//a pointer for matrix1
    int w2, k2;//lines and columns for matrix2
    int* m2;//a pointer for matrix2

    printf("type the number of lines and columns for matrix1: ");
    scanf("%d %d", &w1, &k1);
    m1 = (int*)malloc(w1 * k1 * sizeof(int));

    printf("type the number of lines and columns for matrix1: ");
    scanf("%d %d", &w2, &k2);
    m2 = (int*)malloc(w2 * k2 * sizeof(int));

    //fulfillement of both arrays

    //matrix1
    int i, j;//for matrix1
    for (i = 0; i < w1; i++)
    {
        for (j = 0; j < k1; j++)
        {
            printf("type the values for cell ( %d,%d ): ", i,j);
            scanf("%d", &m1[i*w1 + j]);
        }
    }

    //matrix2
    int m, n;//for matrix2
    for (m = 0; m < w2; m++)
    {
        for (n = 0; n < k2; n++)
        {
            printf("type the values for cell ( %d,%d ): ", m, n);
            scanf("%d", &m2[m * w2 + n]);
        }
    }

    sum(&m1, &m2);


Прямо сейчасЯ пытаюсь перенести оба выполненных массива во внешнюю функцию, которая добавит их. Эта "сумма (& m1, & m2);" ... Я просто не знаю, как передать эти массивы во внешнюю функцию и создать внутри этой функции массив того же размера, который задан пользователем, чтобы я мог добавить.

1 Ответ

2 голосов
/ 02 ноября 2019

Чтобы знать, как передать требуемые аргументы в функцию, вам нужно знать, что такое прототип функции.

Прототип функции - это что-то вроде этого «возвращаемого типа», «имени функции», «аргументов функции».

Функция принимает аргументы и может возвращать значение (если требуется).

Например:

int sum_two_ints(int num1, int num2) - это прототип функции, которая принимает 2 целых числа (num1)и num2).

, а также возвращает целое число, которое является суммой num1 и num2 (отсюда и «int» перед именем функции). Чтобы написать функцию, вам нужно знать, какова функция вашей функции и какие данные нужны для ее работы. В вашем случае вам нужна функция, которая возьмет две матрицы и создаст матрицу, которая является суммой двух матриц, которые вы дали.

Теперь, что нужно вашей функции "сумма"? Для этого нужны две матрицы (m1 и m2), которые имеют тип «int *». Также необходимы размеры этих двух матриц (добавление двух матриц-заполнителей, чтобы они имели одинаковые размеры). Что возвращает ваша функция? Он вернет новую матрицу, которая будет суммой двух предоставленных вами матриц.

С учетом этой информации ваша функция будет иметь следующий прототип: int *sum(int *m1, int *m2, int w, int k) Следующим шагом будет написание тела функции(как он будет выполнять свою работу) в псевдокоде

create a new matrix of the dimensions w * k. (let's call it res)
iterate through all rows and columns of the res matrix and assign its value to be the following:
res[row][col] = m1[row][col] + m2[row][col].
return the resulting matrix as the function's return value.

Последний шаг, как вызвать сумму функций из основной функции, это самая простая часть. Он принимает два аргумента типа "int *", это ваши m1 и m2. Он также принимает ширину и высоту этих матриц (w1 и k1 или w2 и k2). В результате он возвращает другую переменную "int *", поэтому вам нужно ее где-то хранить. Я добавил код, который реализует эту информацию с некоторыми комментариями. Пожалуйста, прочитайте больше о том, как работают указатели и функции. Последнее замечание: любой вызов malloc должен отвечать вызовом free в нужном месте, в противном случае ваша программа утечет память.

Cheers

int *sum(int *m1, int *m2, int w, int k)
{
int *res;

// resulting matrix will have the same dimensions as m1 and m2.
res = malloc(w * k * sizeof(int));
for (int i = 0 ; i < w; i++)
{
    // Iterate throught the elements of res,
    // the same way you iterated through m1 and m2 to assign their values.
    // Only res[i][j] = m1[i][j] + m2[i][j].
    for(int j = 0 ; j < k ; j++)
    {
        res[i * w + j] = m1[i * w + j] + m2[i * w + j];
    }
}
return (res);
}

int main()
{

int w1, k1;
int* m1;
int w2, k2;
int* m2;

printf("type the number of lines and columns for matrix1: ");
scanf("%d %d", &w1, &k1);
m1 = (int*)malloc(w1 * k1 * sizeof(int));

printf("type the number of lines and columns for matrix1: ");
scanf("%d %d", &w2, &k2);
m2 = (int*)malloc(w2 * k2 * sizeof(int));

// You might want to check that the given arrays have the same dimensions before
// continuing, as adding 2 matrices requiere both matrices to have the same dimensions.
if (w1 != w2 || k1 != k2)
{
    printf("Error, the two matrices don't have the same dimensions\n");
    free(m1);
    free(m2);
    return (0);
}

int i, j;
for (i = 0; i < w1; i++)
{
    for (j = 0; j < k1; j++)
    {
        printf("type the values for cell ( %d,%d ): ", i,j);
        scanf("%d", &m1[i*w1 + j]);
    }
}

int m, n;
for (m = 0; m < w2; m++)
{
    for (n = 0; n < k2; n++)
    {
        printf("type the values for cell ( %d,%d ): ", m, n);
        scanf("%d", &m2[m * w2 + n]);
    }
}
// This will hold the matrix returned as a result of the function sum
int *res;

res = sum(m1, m2, w1, k1);
for (i = 0; i < w1; i++)
{
    for (j = 0; j < k1; j++)
    {
        printf("%d ", res[i * w1 + j]);
    }
    printf("\n");
}
// don't forget to free the space you allocated when you are done with it.
free(m1);
free(m2);
free(res);
return (0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...