Передача 2D-массива в функцию

#c #arrays

#c #массивы

Вопрос:

у меня проблема. Я создаю матричный калькулятор. Чего я хочу, так это выбрать размер матрицы. У меня есть два 2D-массива (a) и (b).Я заполняю массивы целыми числами. Проблема в том, что целые числа (мои константы, которые я сохраняю в массивах) не выводятся, только позиции, в которых они находятся. Просто указатели, похоже, не разыменовываются. Не знаю, что не так.

 void rotater(int* a,int* b,int select)
{        
    int* matrix;

    if(select == 1)
    {
        for(int d = 0; d < i; d  )
        {
            for(int c = 0; c < j; c  )
            {
                cout << *(a c) << *(a d) << " "; 
                //if i choose the size as 2x2 this comes out as a 
                //matrix {11,12;21,22} just as positions not my 
                //numbers that i choose
            }
            cout << endl;
        }
    }
    else  if(select == 2)
    {
        for(int d = 0; d < y; d  )
        {
            for(int c = 0; c < x; c  )
            {
                cout << *(b d) <<*(b c) <<" ";
            }
            cout << endl;
        }
    }   
}

int a[i][j];
int b[x][y];
int *matrix1 = amp;a[0][0];    
int *matrix2 = amp;b[0][0];

cout << endl;
cout << "Choose_matrix: " << "(1,2,both)" << endl;
cin >> matrix;

f = matrix //I have function that changes char matrix to int f

cout << endl;
cout << "Choose_operand: " << "(rotr,rotl, ,-,*,/,diag)" << endl;
cin >> operand;

e = operand // I have function that changes char operand to int e

switch(e)
{
case 1:
    rotater(matrix1, matrix2, f); // calling function with 3 parameters 
    break;

default:
    return 0;
}
  

Комментарии:

1. Не могли бы вы добавить main в свой пример? Таким образом, его можно скомпилировать, а также показать результаты, отличные от ожидаемых.

2. Ваши индексы рассчитаны неправильно. Например, используйте b[c d * x]

Ответ №1:

Код в стиле C

Во-первых, вы используете C , поэтому вам следует избегать использования массивов в стиле C и необработанных указателей, где это возможно. Я бы рекомендовал либо использовать std::vector<int> , либо, поскольку вам нужен постоянный размер, std::array<int> .

Избыточный код

Я не понимаю, почему вы включаете два массива в свою rotater функцию. У вас одинаковая логика для каждого параметра, но там много избыточного кода.

Тип параметра

Ваши параметры в rotater запрашивают int* значение an, но при вызове функции вы присваиваете ей значение int[][] , которое представляет собой другой тип данных.

Рабочий пример

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

 #include <iostream>

void matrix_display(int *mat, const int x_size, const int y_size)
{
    for ( int x = 0; x < x_size; x   )
    {
        for ( int y = 0; y < y_size; y   )
        {
            std::cout << *(mat   x) << *(mat   y) << " ";
        }
    }

    std::cout << std::endl;
}

int main()
{
    const int X_SIZE = 2;
    const int Y_SIZE = 2;
    int matrix[X_SIZE*Y_SIZE] = {4, 7, 3, 7};

    matrix_display(matrix, X_SIZE, Y_SIZE);

    return 0;
}
  

опять же, на моем месте я бы использовал std::array<std::array<int, 2>, 2> , а не an int*

Комментарии:

1. Ну, я новичок в C , у меня есть немного знаний из C, но я попробую то, что вы предлагаете, и опубликую результат, спасибо.

2. Вы уверены, что ` std::cout << *(mat x) << *(mat y) << » «;` правильно?