Считывание элемента матрицы и соответствующих индексов строк и столбцов из текстового файла из текстового файла на C

#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. Это решило мою проблему. Большое вам спасибо!