Си.Почему не записывается в память размерность матрицы из текстового файла?И как это осуществить?

В той программе, где я не использовал функцию, а писал всё в теле программы, проблем не было.Всё считало верно.И промежуточный вывод printf("%d",c1); printf("%d",r2); выводил верные значения.Матрицы считываются с файла отлично и выводятся на экран тоже, но я их не могу перемножить, потому что c1 и r2(число строк в первой матрице и число столбцов во второй) нет в памяти программы, т.к. выводятся нули.Как их "оставить" в памяти ?!Помогите пожалуйста :(

UPD: Сейчас вообще выводит с1, что это 1, а r2 это -1 (хотя это не так!) Ничего не понимаю..

void openprint (int **x, int n, int m){
        int j , i,k;
    FILE *f;
    char name [25];
    printf ("enter the name of the file");
    scanf ("%s", name);
    if((f=fopen(name,"r"))==NULL){
        printf ("file not found");
        system ("PAUSE");
        
        }
    
    fscanf (f,"%d%d",&n,&m) ;
    
    x=(int**)malloc(sizeof(int*)*n);
    for(i=0;i<n;i++)
    x[i]=(int*)malloc(sizeof(int)*m);
    for(i=0;i<n;i++)
     for(j=0;j<m;j++)
     fscanf(f,"%d", &x[i][j]);
    fclose(f);
    printf(" matrix:\n") ;
    for(i=0;i<n;i++){
        for(j=0;j<m;j++)
         printf ("%3d", x[i][j]);
        printf("\n");
    }
}

int main(int argc, char *argv[]) {
    int **A, r1,c1; 
    int **B, r2,c2; 
    int **C;
    int i , j,k;
    openprint( A,r1,c1);
    openprint( B,r2,c2);
printf("%d",c1);    
printf("%d",r2) ;
if (c1 != r2) {
printf("Error! cannot be multiplyed.\n");
}

else{
    C=(int**)malloc(sizeof(int*)*r1);
for(i=0;i<r1;i++){
C[i]=(int*)malloc(sizeof(int)*c2);} 
   for ( i = 0; i < r1; ++i) {
      for (j = 0; j < c2; ++j) {
        C[i][j] = 0;
         for ( k = 0; k < c1; ++k) {
            C[i][j] += A[i][k] * B[k][j];
            
         }
      }
   }

printf("\n the result of multiplying\n");
for (i = 0; i < r1; i++)
{
for (j = 0; j < c2; j++)
printf("%3d ", C[i][j]);
printf("\n");
}

    return 0;
}

Ответы (1 шт):

Автор решения: Vladimir

На скорую руку, примерно так. Я код не проверял пока, чтобы быстрее.

void openprint (int **x, int *n, int *m){
int j , i,k;
FILE *f;
char name [25];
printf ("enter the name of the file");
scanf ("%s", name);
if((f=fopen(name,"r"))==NULL){
    printf ("file not found");
    system ("PAUSE");
    
    }

fscanf (f,"%d%d", n, m) ;

x=(int**)malloc(sizeof(int*)*   *n);
for(i=0;i< *n;i++)
x[i]=(int*)malloc(sizeof(int)*  *m);
for(i=0;i< *n;i++)
 for(j=0;j< *m;j++)
 fscanf(f,"%d", &x[i][j]);
fclose(f);
printf(" matrix:\n") ;
for(i=0;i< *n;i++){
    for(j=0;j< *m;j++)
     printf ("%3d", x[i][j]);
    printf("\n");
}
}

И потом вызов этой функции соответственно должен быть такой:

openprint( A, &r1, &c1);

UPD: В дополнение к моим комментариям, вот исправленный вариант, который я предлагаю (т.е. чтобы матрицу возвращали из функции, а не передавали её как параметр). При этом. я здесь не исправил утечку памяти - с этим Вы сами справитесь или тоже надо показать?

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

int ** openprint (int *n, int *m)
    {
        int j , i;
        FILE *f;
        char name [25];
        printf ("enter the name of the file");
        scanf ("%s", name);
        if((f = fopen(name, "r")) == NULL)
        {
            printf ("file not found");
            system ("PAUSE");

        }

        fscanf (f, "%d%d", n, m) ;

        int **x = (int **)malloc(sizeof(int *) *   *n);
        for(i = 0; i < *n; i++)
            x[i] = (int *)malloc(sizeof(int) *  *m);
        for(i = 0; i < *n; i++)
            for(j = 0; j < *m; j++)
                fscanf(f, "%d", &x[i][j]);
        fclose(f);
        printf(" matrix:\n") ;
        for(i = 0; i < *n; i++)
        {
            for(j = 0; j < *m; j++)
                printf ("%3d", x[i][j]);
            printf("\n");
        }
        
        return x;
    }


int main(int argc, char *argv[])
{
    int **A, r1, c1;
    int **B, r2, c2;
    int **C;
    int i , j, k;
//  openprint( A, &r1, &c1);
    A = openprint(&r1, &c1);
//  openprint( B, &r2, &c2);
    B = openprint(&r2, &c2);
    printf("%d", c1);
    printf("%d", r2) ;
    if (c1 != r2)
    {
        printf("Error! cannot be multiplyed.\n");
    }

    else
    {
        C = (int **)malloc(sizeof(int *)*r1);
        for(i = 0; i < r1; i++)
        {
            C[i] = (int *)malloc(sizeof(int) * c2);
        }
        for ( i = 0; i < r1; ++i)
        {
            for (j = 0; j < c2; ++j)
            {
                C[i][j] = 0;
                for ( k = 0; k < c1; ++k)
                {
                    C[i][j] += A[i][k] * B[k][j];

                }
            }
        }

        printf("\n the result of multiplying\n");
        for (i = 0; i < r1; i++)
        {
            for (j = 0; j < c2; j++)
                printf("%3d ", C[i][j]);
            printf("\n");
        }
    }

    return 0;
}
→ Ссылка