Я не могу решить простую задачу по созданию матрицы заданного размера. Я получаю слишком много ошибок, которые не понимают, например: 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;
}
@Agnieszka Osińska В C нет заголовка <iomanip>.
Покажите свои сообщения об ошибках точный и полный.



Существует проблема с тем, как вы обрабатываете массивы в 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 лет, и есть несколько новых стандартов, которые предоставляют больше и лучшие возможности.
Спасибо, Карсон. Поэтому я попытался сделать матрицу, сделав длинный массив. Тем не менее у меня есть проблема с указателями, я думаю.
Мои ошибки: Ошибка 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-массив-чат
Эти номера ошибок имеют смысл только в контексте конкретного компилятора.