1 Востаннє редагувалося Ярослав (11.11.2012 21:03:48)

Тема: Як використати в функції двовимірний масив

Є масив

float matrix[row][col];

Необхідно використати його в функції display
Сама функція

void display(char*title,float **a,int rows,int cols) {
        putchar('\n');
    }
}

Виклик

display("Matrix is:",matrix,row,col);

2

Re: Як використати в функції двовимірний масив

Взагалі-то в прототипі повинно бути не float a[row][col], а float **a.
Дивно виглядає a[j*cols+i] як для матриці.

3

Re: Як використати в функції двовимірний масив

Якщо використовувати цей цикл в функції main, то він працює.

   
for(i = 0; i < r; i++){
        for(j = 0; j < c; j++)
            printf("%.3f ", matrix[i][j]);
        putchar('\n');
    }

Але наступний код чомусь не працює. Програма компілюється і запускається, але сама функція display не працює.

#include <stdio.h>
#include <math.h>

void display(char*title,float **matrix, int r, int c){
    int i, j;
    for(i = 0; i < r; i++){
        for(j = 0; j < c; j++)
            printf("%.3f ", matrix[i][j]);
        putchar('\n');
    }
}

main(){

int col;
int row;
int i, j;
col = row = 0;

        printf("\nInput number of Coloumns:\n");
        scanf("%i", &col);
        printf("\nInput number of Rows:\n");
        scanf("%i", &row);

    float matrix[row][col];

    printf("\nInput matrix elements:\n");
    for(i = 0; i < row; i++)
        for(j = 0; j < col; j++)
            scanf("%4f", &matrix[i][j]);
    display("Matrix is:",(float **) matrix, row, col);

    return 0;
}

Які ідеї?

4

Re: Як використати в функції двовимірний масив

мені здається, що проблема в тому що ви задаєте тип void

5 Востаннє редагувалося Ярослав (12.11.2012 23:20:03)

Re: Як використати в функції двовимірний масив

Kato написав:

мені здається, що проблема в тому що ви задаєте тип void

Ні. Ця функція нічого не має повертати. Мені потрібно що вона тільки виводила значення елементів масиву.
Проблема скоріше за все в імпорті двовимірного масиву. Це не робиться так просто, як із одновимірним, тому виникають проблеми..

void display(float (* arr)[3], int count){
    int i, j;
    for(i = 0; i < 3; i++){
        for(j = 0; j < 3; j++)
            printf("%.3f ", arr[i][j]);
        putchar('\n');
    }
}

main{

    printf("\nInput number of Coloumns:\n");
    scanf("%i", &col);
    printf("\nInput number of Rows:\n");
    scanf("%i", &row);

    float matrix[row][col];

    display(matrix, sizeof(matrix)/sizeof(* matrix));
}

Ось так тільки виходить, тепер потрібно якось вирішити проблему із [3], оскільки матриця універсальна, то масив буває різної величини.
row - це змінна, яка визначає кількість рядків
col - це змінна, яка визначає кількість стовпчиків

Якщо я вводжу зовнішню змінну, то отримую fatal error

6

Re: Як використати в функції двовимірний масив

#include <stdio.h>
#include <math.h>

void display(float **arr, int rows, int cols){
    int i, j;
    for(i = 0; i < rows; i++){
        for(j = 0; j < cols; j++)
            printf("%.3f ", arr[i][j]);
        putchar('\n');
    }
}

/*handle*/

main()
{

int col;
int row;

    int i, j;
    col = row = 0;

    printf("Gauss Elimination Method to Solve Linear Equations\n");
        printf("   01   02   03   .. =  C\n");
        printf("01 aa + ab + ac + .. = b1\n");
        printf("02 ba + bb + bc + .. = b2\n");
        printf("03 ca + cb + cc + .. = b3\n");
        printf("   .. + .. + .. + .. = ..\n");
        printf(" R tR + tR + tR + .. = tC\n\n");
        printf("\nInput number of Coloumns:\n");
        scanf("%i", &col);
        printf("\nInput number of Rows:\n");
        scanf("%i", &row);

    float matrix[row][col];
    float *matrixPtr[row];
    
    for (i = 0; i < col; i++) {
        matrixPtr[i] = matrix[i];
    }

    printf("\nInput matrix elements:\n");
    for(i = 0; i < row; i++)
        for(j = 0; j < col; j++)
            scanf("%4f", &matrix[i][j]);
    display(matrixPtr, row, col);

    return 0;
}

7

Re: Як використати в функції двовимірний масив

Більш красивий варіант:

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

float** matrix_alloc(int n, int m);
void matrix_input(float **matrix, int n, int m);
void matrix_free(float **matrix, int n);
void matrix_print(float **matrix, int n, int m);

main() {
    int n, m;
    float **matrix;
    
    printf("Input n:\n");
    scanf("%d", &n);
    printf("Input m:\n");
    scanf("%d", &m);
    
    matrix = matrix_alloc(n, m); // get memory for matrix    
    matrix_input(matrix, n, m); // some input
    matrix_print(matrix, n, m); // print
    matrix_free(matrix, n); // free memory
    
    return 0;
}

float** matrix_alloc(int n, int m) {
    int i, j;
    float** matrix;
    
    matrix = (float **) malloc(sizeof(float *) * n);
    for (i = 0; i < n; i++) {
        matrix[i] = (float *) malloc(sizeof(float) * m);
    }
    
    return matrix;
}

void matrix_input(float **matrix, int n, int m) {
    int i, j;
    
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            matrix[i][j] = i + j;
        }
    }
}

void matrix_free(float **matrix, int n) {
    int i;
    
    for (i = 0; i < n; i++) {
        free(matrix[i]);
    }
    free(matrix);
}

void matrix_print(float **matrix, int n, int m){
    int i, j;
    
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            printf("%0.2f\t", matrix[i][j]);
        }
        printf("\n");
    }
}