как вернуть матрицу в C (включить код) - PullRequest
0 голосов
/ 04 июля 2018

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

#include<stdio.h>
#include<conio.h>
#include<time.h>

void main() {
    int m,n;
    printf("type 2 numbers:");
    scanf("%i %i",&m,&n);
    declaration(m,n);\\HERE IS THE PROBLEM
    printing(matrix,m,n);
    getch();
}

void declaration(int a,int b) {
    srand(time(NULL));
    int i,j,matrix[a][b];
    for(i=0;i<a;i++){
        for(j=0;j<b;j++){
            matrix[i][j]=1+rand()%7;
        }
    }
}

void printing(int c[100][100],int a,int b) {
    int i,j;
    for(i=0;i<a;i++){
        for(j=0;j<b;j++){
            printf("%i\t",c[i][j]);
        }
        printf("\n");
    }
}

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

У вас есть несколько моментов, которые требуют немного больше внимания;

1) читать предупреждения и сообщения об ошибках, выданные вашим компилятором

2) еще раз, прочитайте предупреждающие сообщения от вашего компилятора

3) используйте отступы, чтобы сделать ваш код более читабельным.

4) Всегда возвращайтесь с main(), это хорошая практика

Код ниже делает то, что вы хотите достичь; взгляните на это и продолжайте читать ...

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

// You either have to declare your functions 
// or implement them before main()
void declaration(int a,int b, int m[a][b]);
void printing(int a,int b,  int m[a][b]);

int main(){ // always return from main()
  int m,n;
  printf("type 2 numbers:");
  scanf("%i %i",&m,&n);
  int matrix[m][n];

  declaration(m, n, matrix);
  printing(m, n, matrix);

  return 0;
}

void declaration(int a,int b, int m[a][b]){
  srand(time(NULL));
  int i,j;

  for(i=0;i<a;i++){
    for(j=0;j<b;j++){
        m[i][j]=1+rand()%7;
    }
  }
}

void printing(int a,int b, int m[a][b]){
  int i,j;
  for(i=0;i<a;i++){
    for(j=0;j<b;j++){
        printf("%i\t",m[i][j]);
    }
    printf("\n");
  }
} 

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

declaration(m,n);
printing(matrix,m,n); /* where does matrix[][] come from? */

запомните, C - это строго типизированный язык, что означает, что вы должны объявлять свои переменные перед их использованием. Это относится и к вашим функциям. Вы должны либо дать объявления своей функции до main() (или, точнее, перед их использованием), либо реализовать их.

Просмотрите ваши заголовочные файлы (т.е. файлы .h), и вы увидите множество объявлений функций.

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

Некоторые дополнения;

Обычно C передает аргументы по значению, и вам нужно использовать указатель, если вы хотите, чтобы значение вашей переменной было изменено внутри функции. Если вы внимательно посмотрите на фрагмент кода, который я дал, я просто использовал int m[a][b]. В C имя массива является указателем на его первый элемент, поэтому вы можете изменить значение элементов массива, когда собственно имя массива передается вашей функции в качестве аргумента.

Для дальнейшего чтения вы можете посмотреть

  • переменная область действия
  • глобальные переменные (вы можете определить матрицу [] [] как глобальную переменную и изменить значение матричных элементов)
  • декларация против определения в C
0 голосов
/ 04 июля 2018

Другой простой способ сделать это - использовать двойной указатель для создания 2-мерного массива. Сохраняй это простым.

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

int** create_matrix(int rows, int cols) {
    int **matrix = malloc(rows*(sizeof(int *)));
    for(int i = 0; i < rows; i++) {
        matrix[i] = malloc(cols*sizeof(int));
    }
    for(int i = 0; i < rows; i++) {
        for(int j = 0; j < cols; j++) {
            matrix[i][j] = 1 + rand()%7;
        }
    }
    return matrix;
}

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

int main(void) {
    int rows, cols;
    rows = 3, cols = 3;
    int** matrix = create_matrix(rows, cols);
    printing(matrix, rows, cols);
    free(matrix);
    return 0;
}
0 голосов
/ 04 июля 2018

Определите это как:

typedef struct {
    int rows;
    int cols;
    int *data;
} int_matrix_entity, *int_matrix;

int_matrix int_matrix_create(int rows, int cols, bool rand)
{
    int_matrix mt;
    int i;
    if ((mt = malloc(sizeof(int_matrix_entity))) == NULL)
    {
        return NULL;
    }

    if ((mt->data = malloc(sizeof(int) * cols * rows)) == NULL)
    {
        free(mt);
        return NULL;
    }

    if (rand)
    {
        srand(time(NULL));
        for (i = 0; i < cols * rows; i++)
        {
            mt->data[i] = 1 + rand() % 7;
        }   
    }
    else
    {
        memset(mt->data, 0, sizeof(int) * cols * rows);
    }

    return mt;
}

void int_matrix_printf(int_matrix mt)
{
    int i;
    int j;
    for (i = 0; i < mt->rows; i++)
    {
        for (j = 0; j < mt->cols; j++)
        {
            printf("%5d ", mt[i * cols + j]);
        }
        printf("\n");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...