Top.Mail.Ru
Ответы

Как в функции распечатать двумерный динамический массив в Си

Всем привет, разбираюсь с функциями в Си. Я хочу создать двумерный массив в Си и с помощью отдельных функций его создать и вывести на экран.

В своем коде я собственно задаю функции int** matrix_initialization(int n, int m) , у которой кстати тип указателя на указатель (**) (это вообще правильно? я так поставил потому что были ошибки какие-то у компилятора), параметры как длина строки и длина столбцов, в функции этой же выделяю память под нее и потом с помощью циклов задаю случайные значения.
В следующей функции int print_matrix(int n1, int n2, int** a) (насчет которой я вообще не уверен), я задаю параметры как длина строки, длина столбцов, и некоторый указатель на указатель

1
 ** int a; 



И я вот не понимаю, я правильно вообще поставил эти параметры? У меня ошибка есть, что функция print_matrix должна возвращать какое-то значение, а какое значение должна она возвращать? Это же по идее функция, которая должна просто печатать матрицу, или я чето не понимаю?

Как в двух отдельных функциях инициализировать матрицу и потом распечатать её ??????

У меня получился такой код:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
 #include <stdio.h> 
#include <locale.h> 
#include <stdlib.h> 
#include <time.h>  
 
int** matrix_initialization(int n, int m) 
{ 
	// Выделение памяти 
	int** matrix = NULL; 
	matrix = (int**)malloc(n * sizeof(n)); 
	// Проверки 
	if (matrix != NULL) 
	{ 
		if (matrix != NULL) 
		{ 
			// Выделение памяти 
			for (int i = 0; i < m; i++) 
			{ 
				*(matrix + i) = (int*)malloc(m * sizeof(m)); 
			} 
 
			for (int i = 0; i < n; i++) 
			{ 
				for (int j = 0; j < m; j++) 
				{ 
					matrix[i][j] = rand() % 20 - 5; 
				} 
			} 
		} 
	} 
	return matrix; 
} 
 
int print_matrix(int n1, int n2, int** a) 
{ 
	for (int i = 0; i < n1; i++) 
	{ 
		for (int j = 0; j < n2; j++) 
		{ 
			printf("%d\t", a[i][j]); 
		} 
		printf("\n"); 
	} 
} 
 
int main() 
{ 
	setlocale(LC_ALL, "Russian"); 
	srand(time(NULL));  

        int N, M, **b; 
	printf("Введите размеры матрицы: "); 
	scanf_s("%d %d", &N, &M); 
 
	b = matrix_initialization(N, M); 
	print_matrix(N, M, **b);  

} 
По дате
По рейтингу
Аватар пользователя
Новичок

У тебя функция int print_matrix() следовательно она должна возвращать значение типа int.
Обычно так делается для вывода отладочных данных. (вернул 0 значит все ок, вернул число - значит произошла ошибка во время "печати")
Если функция не должна возвращать значений, указывай тип void.

Аватар пользователя
Гений
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
 #include <stdio.h>  
#include <locale.h>  
#include <stdlib.h>  
#include <time.h>   
 
int** matrix_initialization(int n, int m) 
{ 
	// Выделение памяти  
	//int** matrix = NULL;	//не обязательное действие 
	int** matrix = (int**)malloc(n * sizeof(int*)); //основной массив состоит из n указателей, поэтому sizeof(int*) 
	//а sizeof(n) - тоже самое что sizeof(int) 
	// Проверки  
	//if (matrix != NULL)  //два одинаковых if - один лишний 
	//{ 
		if (matrix != NULL) 
		{ 
			// Выделение памяти  
			for (int i = 0; i < n; i++) //у вас i<m что не верно. Мы инициализируем строки - поэтому нужно количество строк 
			{ 
				*(matrix + i) = (int*)malloc(m * sizeof(int)); //если в пером случае была проверка, то здесь ущимили в правах? 
				//if(!matrix[i]) exit(-1); //если память не выделилась завершить программу 
			} 
 
			for (int i = 0; i < n; i++) 
			{ 
				for (int j = 0; j < m; j++) 
				{ 
					matrix[i][j] = rand() % 20 - 5; 
				} 
			} 
		} 
		// else exit (-1); //если память не выделилась - завершить программу. 
	//} 
	return matrix; 
} 
 
void print_matrix(int n1, int n2, int** a) //тип функции - void так как ничего возвращать не планируем 
{ 
	for (int i = 0; i < n1; i++) 
	{ 
		for (int j = 0; j < n2; j++) 
		{ 
			printf("%d\t", a[i][j]); 
		} 
		printf("\n"); 
	} 
} 
 
int main() 
{ 
	setlocale(LC_ALL, "Russian"); 
	srand(time(NULL)); 
 
	int N, M, ** b; 
	printf("Введите размеры матрицы: "); 
	scanf_s("%d %d", &N, &M); 
 
	b = matrix_initialization(N, M); 
	print_matrix(N, M, b); //передаем указатель b как есть. **b - это уже двойное разыменовывание и возврат первого элемента массива 
 
	//забыли вернуть память с указателей b[0]....b[n-1] и b системе (хотя если программа завершается - система сама заберет). 
} 
Аватар пользователя
Мастер
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
 #include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
 
struct matrix 
{ 
    size_t cols, rows; 
    int **ptr; 
}; 
 
static struct matrix *matrix_init(size_t rows, size_t cols)  
{ 
    int i, j; 
    struct matrix *mat = malloc(sizeof *mat); 
 
    mat->ptr = calloc(rows, sizeof *(mat->ptr)); 
    mat->rows = rows; 
    mat->cols = cols; 
 
    if (mat) { 
        for (i = 0; i < rows; i++) { 
            mat->ptr[i] = calloc(cols, sizeof(int)); 
 
            for (j = 0; j < cols; j++) { 
                mat->ptr[i][j] = rand() % 20 - 5; 
            } 
        } 
    } 
 
    return mat;  
} 
 
static void matrix_destroy(struct matrix *mat) 
{ 
    int i; 
 
    if (mat) { 
        for (i = 0; i < mat->rows; i++) { 
            free(mat->ptr[i]); 
        } 
 
        free(mat->ptr); 
        free(mat); 
    } 
} 
  
static void matrix_print(const struct matrix *mat)  
{ 
    int i, j; 
 
    for (i = 0; i < mat->rows; i++) {  
        for (j = 0; j < mat->cols; j++) {  
            printf("%d\t", mat->ptr[i][j]); 
        } 
 
        printf("\n");  
    }  
}  
 
int main(void) 
{ 
    struct matrix *mat; 
    size_t N, M; 
 
    srand(time(NULL)); 
 
    printf("Введите размеры матрицы: ");  
    scanf("%zx %zx", &N, &M); 
 
    mat = matrix_init(N, M); 
    matrix_print(mat); 
    matrix_destroy(mat); 
    return 0; 
} 
Аватар пользователя
Мудрец
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
 #include <stdio.h>  
#include <locale.h>  
#include <stdlib.h>  
#include <time.h>   
  
int** matrix_initialization(int n, int m)  
{  
	// Выделение памяти  
	int** matrix = NULL;  
	matrix = (int**)malloc(n * sizeof(int*));  
	// Проверки  
	if (matrix != NULL)  
	{  
		if (matrix != NULL)  
		{  
			// Выделение памяти  
			for (int i = 0; i < n; i++)  
			{  
				*(matrix + i) = (int*)malloc(m * sizeof(int));  
				for (int j = 0; j < m; j++)  
				{  
					matrix[i][j] = rand() % 20 - 5;  
				}  
			}  
		}  
	}  
	return matrix;  
}  
  
int print_matrix(int n1, int n2, int** a)  
{  
	for (int i = 0; i < n1; i++)  
	{  
		for (int j = 0; j < n2; j++)  
		{  
			printf("%d\t", a[i][j]);  
		}  
		printf("\n");  
	}  
}  
  
int main()  
{  
	setlocale(LC_ALL, "Russian");  
	srand(time(NULL));   
 
        int N, M, **b;  
	printf("Введите размеры матрицы: "); // у меня нет _s 
	scanf_s("%d %d", &N, &M);  
//	scanf("%d %d", &N, &M);  
  
	b = matrix_initialization(N, M);  
	print_matrix(N, M, b);   
 
 if(b == (int**) NULL) exit(1); 
 for(int q = 0; q < N; q++) 
 { 
  if(b[q] == (int*) NULL) exit(1); 
  free(b[q]); 
  b[q] = (int*) NULL; 
 } 
 free(b); 
 b = (int**) NULL; 
 
  return 0; 
} 
Аватар пользователя
Просветленный

динамический массив через структуру делается а не через инт
//строка
struct foo1
{
int value;
foo1* next ;
};
//матрица
struct foo2
{
foo1* first;
foo2* next ;
};

дальше создаешь указатели только на первую строку матрицы и ходишь по ней двумя вайлами

int main()
{
setlocale(LC_ALL, "Russian");
srand(time(NULL));

int N, M, **b;
printf("Введите размеры матрицы: ");
scanf_s("%d %d", &N, &M);

foo2* matrix=(foo2*)malloc(sizeof(foo2));
foo2* cur2;
foo1* cur1;

cur2=matrix;
//вот так выделяешь не сразу все а построчно поэементно
for(че там у тебя на входе)
{
for(че там у тебя на входе)
{
cur1.next =(foo1*)malloc(sizeof(foo1));
cur1=cur1.next;
}
//создаем следущую строку и переходим на нее
cur2.next=(foo2*)malloc(sizeof(foo2));
cur2=cur2.next;
cur2.first=(foo1*)malloc(sizeof(foo1));
cur1=cur2.first;
//кстати создадим лишнюю строку потомучто изначально одну уже создали
//и лишний элемент
}

cur2=matrix;
cur1=cur2.first;
а ходить по ней двойным вайлом
while (cur2!=null)
{
while(cur1!=null)
{
print(cur1->value);
cur1=cur1.next;
}
cur2=cur2.next;
}

}