Генерация матрицы на языке C

Я не могу решить простую задачу по созданию матрицы заданного размера. Я получаю слишком много ошибок, которые не понимают, например: C2087, C2131 или C2447 (Microsoft Visual Studio) Пожалуйста, помогите мне, если вы можете

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iomanip>
int max = 100;



void random(int & size, int M[][])
{   for (int i = 0; i < size; i++)
    {   for (int j = 0; j < size; j++)
        {
            M[i][j] = rand() % 9;
        }
    }
}

void display(int size, int M[][])
{   for (int i = 0; i < size; i++)
    {   for (int j = 0; j < size; j++)
        {
            printf("%d", &M[i][j]);
        }
    }
}

int main()
{
    printf("give me matrix size\n");
    int size;
    scanf_s("%d", &size);
    //int* M = new int[size][size];
    int M[max][max];

    random(size, M);
    display(size, M);

    return 0;
}

Эти номера ошибок имеют смысл только в контексте конкретного компилятора.

Eugene Sh. 09.05.2022 23:17

@Agnieszka Osińska В C нет заголовка <iomanip>.

Vlad from Moscow 09.05.2022 23:22

Покажите свои сообщения об ошибках точный и полный.

abelenky 10.05.2022 00:08
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
3
39
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Существует проблема с тем, как вы обрабатываете массивы в c. Массивы на самом деле передаются не как массивы, а как указатели.

Рассмотрим этот пример

void print_arr (int array[], int length);
void print_arr (int * array, int length);
void print_arr (int array[10], int length);
void print_arr (int array[11], int length);

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

int function (int array[]) {
   return array[3]; 
}

C возьмет адрес массива, добавит (3 * sizeof(int)) и вернет это значение. Он может это сделать, потому что знает, что каждый элемент массива имеет размер int.

Проблема в том, что вы не можете передавать двумерные массивы в c. Когда вы пишете

void function (int array[][]) {
    array[2][3];
}

C сначала вычислит первый индекс. Проблема в том, что он не знает размер смещения массива. Что делать, если ваш массив 4 на 4? а если 7 на 9? Для каждого возможного размера потребуется разное смещение, и c не знает, какое.

Есть несколько вариантов. Либо напишите размер заранее, например:

int function (int array[10][10]) {
    return array[2][3];
}

Это сообщает c размер массива и позволяет правильно вычислить смещения.

Или, если вы не знаете размер заранее, вручную передайте информацию, например:

int function (int * array, int width) {
    int index = (2 * width) + 3;
    return array[index];
}

В этом примере вы в основном вручную выполняете математические операции, которые c обычно делает за вас.

В основном хорошо, если вы ограничены C90 или старше, но C90 уже более 30 лет, и есть несколько новых стандартов, которые предоставляют больше и лучшие возможности.

Jonathan Leffler 10.05.2022 04:39

Спасибо, Карсон. Поэтому я попытался сделать матрицу, сделав длинный массив. Тем не менее у меня есть проблема с указателями, я думаю.

Мои ошибки: Ошибка C2540 непостоянное выражение в виде строки привязки массива 30

Ошибка C2440 «инициализация»: невозможно преобразовать из «int (*) [1]» в «int *», строка 30

Ошибка C2664 «void random (int, int *)»: невозможно преобразовать аргумент 2 из «int» в «int *», строка 32.

Ошибка C2664 «void wypisz (int, int *)»: невозможно преобразовать аргумент 2 из «int» в «int *», строка 33.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void random(int size, int * M)
{

    for (int i = 0; i < size^2; i++)
    {
            int x = rand() % 9;
            M[i] = x;
    }
}

void display(int size, int *M)
{
    for (int i = 0; i < size^2; i++)
    {
        printf("%d ", &M[i]);
        if (size%i==0)
        printf("\n");
    }
}

int main()
{
    printf("Gimme size: \n");
    int size;
    scanf_s("%d", &size);
    int* M = new int[size][size];

    random(size, *M);
    display(size, *M);

    return 0;
}

Здравствуйте, я создал чат, так что, надеюсь, я смогу поговорить с вами о ваших проблемах chat.stackoverflow.com/rooms/244645/c-массив-чат

Carson 10.05.2022 19:30

Другие вопросы по теме