Си.Почему не записывается в память размерность матрицы из текстового файла?И как это осуществить?
В той программе, где я не использовал функцию, а писал всё в теле программы, проблем не было.Всё считало верно.И промежуточный вывод 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 шт):
На скорую руку, примерно так. Я код не проверял пока, чтобы быстрее.
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;
}