2012-01-22 2 views
1

Это мой код - я инициализирую свои собственные значения (1 или 0) в определенную матрицу. вместо того, чтобы всегда устанавливать жестко закодированную матрицу, я хочу, чтобы пользователь установил значения и размеры матрицы scanf ("% d% d", & height, & width); и после построения матрицы, чтобы ввести значение scanf ("% d", & vall);Динамические матрицы и динамические значения в матрице

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

printf("How many Row : "); 
scanf("%d", &nrow); 

rowptr = malloc(sizeof(int) * nrow); 

printf("How many Column : "); 
scanf("%d", &ncol); 

спасибо

#include <stdio.h> 
#define WIDTH 50 
#define HEIGHT 20 

void init(int board[][WIDTH], int rows) { 
    int x, y; 
    for (y = 0; y < rows; y++) 
     for (x = 0; x < WIDTH; x++) 
      board[y][x] = 0; 
    /* Scatter some live cells: */ 
    board[10][25] = 1; 
    board[10][26] = 1; 
    board[10][27] = 1; 
    board[11][25] = 1; 
    board[12][26] = 1; 
} 
+1

В чем конкретно вопрос? –

+0

Я попросил показать, как сделать матрицу dyanmix, потому что я знаю, только строю THOS-матрицу с определением их размеров в начале – Blondy21

ответ

0

Чтобы иметь решение с полными динамическими массивами массивов (2D-матрица с количеством строк и столбцов неизвестных во время компиляции), вы должны использовать int ** типа для представляют вашу матрицу.

int **board = malloc(height * sizeof *board); 
for (i = 0; i < height; i++) 
    board[i] = malloc(width * sizeof **board); 

затем прототипы ваших функций с int ** для параметра платы и получить доступ к матрице, как обычно:

int x = board[i][j]; // store in x the element of row i and column j 
+0

, можете ли вы объяснить больше - я написал код для сканирования матричных шрифтов и добавил к вопросу - после того, значения, как я могу заменить мои определенные значения? – Blondy21

+0

Вы имеете в виду функцию init? – Blondy21

+0

@ Blondy21 вы использовали константы 'HEIGHT' и' WIDTH' для строк и столбцов, поэтому я использовал 'height' и' width', чтобы выразить, что они больше не являются константами C. В своем новом редактировании вопроса считайте, что мой 'height' будет вашим' nrow' и моей 'width' для вашего' ncol'. – ouah

2

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

int **board; 
scanf("%d %d", &height, &width); 

// first allocate memory for pointer to each row 
board = (int**) malloc(height * sizeof(int*)); 

// then allocate memory for each row 
for(i = 0; i < height; i++) 
    board[i] = (int*) malloc(width * sizeof(int)); 

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

// first free up each row 
for(i = 0; i < height; i++) 
    free(board[i]); 

// then free up the pointers to the rows 
free(board); 

Edit:

Для вашего кода, выполните следующие действия:

printf("How many Row : "); 
scanf("%d", &nrow); 

rowptr = (int**) malloc(sizeof(int) * nrow); 

printf("How many Column : "); 
scanf("%d", &ncol); 

for(i = 0; i < nrow; i++) 
    rowptr[i] = (int*) malloc(ncol * sizeof(int)); 
+0

Я не могу понять, как использовать это: можете ли вы показать мне имплантацию с помощью моего кода? – Blondy21

+0

, но ваше решение для массива? Мне нужна 2-я матрица ... можете ли вы показать, как это делается? – Blondy21

+0

В чем разница между двумерным массивом и матрицей? Прочтите код внимательно и прочитайте комментарии первого кода. – 0605002

1

Вы должны использовать функцию malloc() для назначения памяти динамически. Он возвращает указатель на блок памяти запрашиваемого размера. Вот пример:

int size; 
int *foo; 

printf("How many elements? "); 
scanf("%d", &size); 

foo = malloc(size * sizeof(int)); 

// always check if the call succeeded 
if(foo == NULL) { 
    printf("can't allocate memory!"); 
    return; 
} 

int i; 
for(i = 0; i < size; i++) { 
    printf("enter value for element #%d: ", i + 1); 
    scanf("%d", &foo[i]); 
} 

// ... 

free(foo); // to avoid memory leaks 

free() говорит ОС, что блок вы передаете больше не используется, так что для будущего.

Теперь, так как вы хотите матрицу, вам нужен двойной указатель, и вы должны вызвать таНос для каждой «строки» (проверка ошибок удалена для ясности):

int **matrix = malloc(rows * columns * sizeof(int)); 

int i; 
for(i = 0; i < rows; i++) 
    matrix[i] = malloc(columns * sizeof(int)); 
+0

возможно ли это сделать только внутри функции init? – Blondy21

+0

ваш код хорош для массива, но мне нужна 2d матрица - можете ли вы показать, как это будет выглядеть? – Blondy21

0

Если у вас есть современный C, скажем, C99, возможно инициализация размера матрицы с переменным содержимым. Он называется массив переменной длины, VLA. Что касается вашего кода, вы почти там.Просто измените свои прототипы на что-то вроде следующего

void init(size_t cols, size_t rows, int board[rows][cols]) 

таким образом, что границы приходят первые и известны, когда вы приходите к объявлению матрицы.

Вы могли бы выделить в основном такие матрицы в стеке

int board[rows][cols]; 

(без инициализаторе) будет делать, но если ваш размер получить большой вы рискуете переполнения стека. Чтобы объявить матрицу в куче, вы могли бы сделать что-то вроде

int (*board)[cols] = malloc(int[rows][cols]); 

не забудьте присвоить начальные значения отдельных записей board[i][j] и освободить всю матрицу в конце его использования.

Редактировать: посмотреть все эти ответы, которые пытаются продать вам моделирование 2D-массивов с помощью указателей на указатели. Не делайте таких сложных вещей, просто делайте то, что язык предоставляет вам напрямую, VLA.

Смежные вопросы