Динамическое выделение матрицы из ввода - C - PullRequest
1 голос
/ 26 октября 2011

Я пробовал этот код, и он работает не очень хорошо.

void *matrix_allocate_variable (int size)
{
void *p1;
if ((p1=(int*)malloc(size))==NULL){
    printf("out of memory.\n");
    exit(1);
    }
return p1;
}

Здесь я создал функцию, которая вызывает malloc и закрывается при ошибке, чтобы я мог использовать ее в своей следующей функции:

void matrix_new(int **matrices, int *row_counts, int *column_counts, char specifier)
{

int index, i;
index= (int)(specifier-'A');


    scanf("%d",&row_counts[index]);
    scanf("%d",&column_counts[index]);

    matrices[index]= (int*)matrix__allocate_variable(sizeof(int)*                                (row_counts[index]*column_counts[index]);

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

PS. Для более подробной информации, я создаю функции в functions.c, это то, что я до сих пор. У меня есть main.c, который вызывает эти функции, чтобы позже я мог добавлять, вычитать и транспонировать, но сейчас я пытаюсь ввести данные, с которыми у меня много проблем. Вот мой main.c, где я вызываю функции.

/* Pointer to the set of matrix registers. */
int **matrices = NULL;
/* row_counts[i] stores the number of rows in matrix i */
int *row_counts = NULL;
/* column_counts[i] stores the number of columns in matrix i */
int *column_counts = NULL;

/**********************************************************************
Skeleton code part B: suggested form for selected variable initializations
**********************************************************************/
/* Initialize the matrix set. */
matrices = (int**) matrix_allocate_variable(...);
column_counts = (int *)matrix_allocate_variable(...);
row_counts = (int *)matrix_allocate_variable(...);
char call[2];
int error = 2;



         do {
            printf ( "> ");
            if (scanf ("%1s", call) !=1) {
                    fprintf (stderr, "Command not found. \n");
                    exit (1);
            }


switch (call [0]) {

                    case 'A':       matrix_new(matrices,row_counts,column_counts,'A');
                                            break;
                    case 'B':       matrix_new(matrices,row_counts,column_counts,'B');
                                            break;
                    case 'C':       matrix_new(matrices,row_counts,column_counts,'C');
                                            break;
                    case 'D':       matrix_new(matrices,row_counts,column_counts,'D');
                                            break;
                    case '+':       matrix_add(matrices,row_counts,column_counts);
                                            break;
                    case '^':       matrix_tranpose(matrices,row_counts,column_counts);
                                            break;
                    case '*':       matrix_multiply(matrices,row_counts,column_counts);
                                            break;
                    case '$':       exit (1);

                    default :       fprintf (stderr, "Command not found. \n");

            }
    } while (error != 1);
    return 0;
    }

Любая помощь будет хорошей, и любые указатели на то, что я должен делать дальше, также хороши. Огромное спасибо всем.

Ответы [ 2 ]

3 голосов
/ 26 октября 2011

Привет, это пример кода для создания одной матрицы с использованием malloc.
(Это должно дать вам некоторое представление о том, как создать массив матриц. Если это не так, дайте мне знать.)

#include <stdio.h>
#include <stdlib.h>

// Creates a matrix given the size of the matrix (rows * cols)
int **CreateMatrix(int rows, int cols) {
  int **matrix = malloc(sizeof(int*) * rows);
  int row;
  for (row = 0; row < rows; row++) {
    matrix[row] = malloc(sizeof(int) * cols);
  }
  return matrix;
}

// Take input for the matrix.
void MatrixInput(int **matrix, int rows, int cols) {
  int row, col;
  for (row = 0; row < rows; row++) {
    for (col = 0; col < cols; col++) {
      scanf("%d", &matrix[row][col]);
    }
  }
}

void PrintMatrix(int **matrix, int rows, int cols) {
  int row, col;
  for (row = 0; row< rows; row++) {
    for (col = 0; col < cols; col++) {
      printf("%d ", matrix[row][col]);
    }
    printf("\n");
  }
}

int main() {
  int **matrix;
  int rows = 5;
  int cols = 4;
  matrix = CreateMatrix(rows, cols);
  MatrixInput(matrix, rows, cols);
  PrintMatrix(matrix, rows, cols);
}
0 голосов
/ 20 ноября 2013

Вот пример создания и освобождения памяти для двухмерного массива ...
(легко модифицируется для других типов)

int ** Create2D(int **arr, int cols, int rows)
{   
    int space = cols*rows; 
    int    y;

    arr   = calloc(space, sizeof(int));
    for(y=0;y<cols;y++)
    {
        arr[y] = calloc(rows, sizeof(int)); 
    }
    return arr;
}

void free2DInt(int **arr, int cols)
{
    int i;
    for(i=0;i<cols; i++)
        if(arr[i]) free(arr[i]);
    free(arr);  
}

Используйте это так:

#include <ansi_c.h>
int main(void)
{
    int **array=0, i, j;
    array = Create2D(array, 5, 4);//get the actual row/column values from reading the file once.
    for(i=0;i<5;i++)
        for(j=0;j<4;j++)
            array[i][j]=i*j; //example values for illustration
    free2DInt(array, 5);

    return 0;

}
...