#c #matrix #simulation #dynamic-memory-allocation
#c #матрица #Симуляция #динамическое выделение памяти
Вопрос:
Я пытаюсь сделать симуляцию хищника-жертвы на C, но я совсем новичок в программировании на C. Кажется, я не могу заполнить доску, как ожидалось.
Мне нужно прочитать входные параметры для моделирования из текстового файла, предоставленного в качестве стандартного ввода в программу. Входной файл содержит следующие данные:
2 4 3 6 5 5 9
РОК 0 0
КРОЛИК 0 2
FOX 0 4
FOX 1 0
FOX 1 4
РОК 2 4
КРОЛИК 3 0
КРОЛИК 4 0
FOX 4 4
Сначала я читаю первую строку, которая содержит набор параметров, необходимых для моделирования. Я могу просто прочитать их и использовать значения впоследствии.
Затем мне нужно прочитать следующие 9 строк, в которых указаны объекты и соответствующие позиции x и y в матрице, представляющей мою доску. Я должен был получить что-то вроде этого в качестве начального состояния:
введите описание изображения здесь
где * представляет камни, R — кроликов и F — лис. Вот что я делал до сих пор:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
// Declare functions
void *fillMatrix(int nobj, int r, int c);
void printMatrix(char *_matrix, int r, int col);
int main(int argc, char *argv[]) {
int GEN_PROC_RABBITS, // number of generations until a rabbit can procreate
GEN_PROC_FOXES, // number of generations until a fox can procreate
GEN_FOOD_FOXES, // number of generations for a fox to die of starvation
N_GEN, // total number of generations for the simulation
ROWS,
COLS,
N; // inicial number of objects in the ecosystem
if (!scanf("%d %d %d %d %d %d %d", amp;GEN_PROC_RABBITS, amp;GEN_PROC_FOXES, amp;GEN_FOOD_FOXES, amp;N_GEN, amp;ROWS, amp;COLS, amp;N)) {
fprintf(stderr, "Error while reading input.nAborting...n");
exit(-1);
}
char *matrix;
matrix=fillMatrix(N,ROWS,COLS);
printMatrix(matrix, ROWS, COLS);
void *fillMatrix(int nobj, int r, int c){
char (*matrix)[c] = (char (*)[c]) malloc(r * c * sizeof(char));
char *character[6];
int m;
for (m=0; m < nobj; m ) {
scanf("%s %d %d", amp;character, amp;r, amp;c);
printf("%s %d %dn", character, r, c);
matrix[r][c] = character[0];
}
return (char *) matrix;
}
void printMatrix(char *_matrix, int r, int c){
char (*matrix)[c] = (char (*)[c]) _matrix;
int i, j;
printf("Gen 0n");
printf ("--------n");
for(i=0; i < r; i ) {
for (j=0; j < c-1; j ) {
printf("%c ", matrix[i][j]);
}
printf("%cn", matrix[i][j]);
}
printf ("--------n");
fflush(stdout);
}
Я получаю что-то вроде этого:
введите описание изображения здесь
Кроме того, мне все еще нужно заменить R из ROCKS на «*», и когда я попытался это сделать, все стало еще более запутанным. Кажется, что-то не так с распределением памяти или, может быть, я что-то упускаю.
Может кто-нибудь помочь в том, что я здесь делаю неправильно? Большое спасибо. Кроме того, любые предложения о лучших способах сделать это очень приветствуются.
Ответ №1:
Вместо этого вы могли бы попробовать объявить свою матрицу следующим образом :
void *fillMatrix(int nobj, int r, int c)
{
char (*matrix)[r][c] = malloc(sizeof(*matrix));
// Fill the whole matrix with empty space characters
// When declared this way, 'matrix' must be dereferenced each time it's used
memset(*matrix, ' ', sizeof(*matrix));
char *character[6];
int m;
for (m=0; m < nobj; m ) {
scanf("%s %d %d", amp;character, amp;r, amp;c);
printf("%s %d %dn", character, r, c);
(*matrix)[r][c] = character[0]; //<== (*matrix)
}
return (char *) matrix;
}
void printMatrix(char *_matrix, int r, int c)
{
// Idem here
char (*matrix)[r][c] = (char (*)[r][c]) _matrix;
int i, j;
printf("Gen 0n");
printf ("--------n");
for(i=0; i < r; i ) {
for (j=0; j < c-1; j ) {
printf("%c ", (*matrix)[i][j]); //<== (*matrix)
}
printf("%cn", (*matrix)[i][j]); //<== (*matrix)
}
printf ("--------n");
fflush(stdout);
}
printf ("--------n");
fflush(stdout);
}
Комментарии:
1. Это решило мою проблему. Большое вам спасибо!