该程序的某些部分用西班牙语编写,所以我将解释:这是一个动态2D数组,向用户显示一条消息,要求输入行数和列数。然后,数组使用函数aloc获得分配的空间,其中calloc用于分配,第二个指针接收行数,然后使用for()循环为列分配空间。问题出现在函数imp()上,该函数应该打印出结果矩阵,我相信这是由于指针算法引起的,但是我不确定。程序崩溃了,但是在编译过程中没有问题,据我所知,所有操作都是有效的。
我尝试使用经典的2D数组形式,但是它仍然会因( [a + i)+ j)插入的[a] [i] [j]而崩溃。我尝试在没有printf的情况下运行该程序,并且在到达suma()时会崩溃,应该将这两个矩阵相加,我相信在达到指针算法时也会崩溃。当这些被忽略时,程序运行顺利。
#include<stdio.h>
#include<stdlib.h>
#define p printf
#define s scanf
float** aloc(float **m,int r,int c);
void asig(float **a,int r,int c);
void imp(float **a,int r,int c);
float** suma(float **a,float **b,float **c,int r,int x);
int main(int argc,char*argv[])
{
float **ma=NULL,**mb=NULL,**mc=NULL;
int r=0,c=0,i=0,j=0;
p("\n\tEste programa suma 2 matrices cuyas dimensiones son dadas por el usuario\n\n\t%cCu%cntos renglones tienen las matrices?",168,160);
s("%d",&r);
p("\n\t%cCu%cntas columnas tienen las matrices?",168,160);
s("%d",&c);
ma=aloc(ma,r,c);
mb=aloc(mb,r,c);
mc=aloc(mc,r,c);
p("\n\n\t\tMATRIZ 1");
asig(ma,r,c);
imp(ma,r,c);
p("--------------------------\n\n\t\tMATRIZ 2");
asig(mb,r,c);
imp(mb,r,c);
p("--------------------------");
mc=suma(ma,mb,mc,r,c);
p("\n\tLa matriz resultante es:\n");
imp(mc,r,c);
fflush(stdin);
getchar();
return 0;
}
float** aloc(float **m,int r,int c)
{
int i=0;
if((m=(float**)calloc(r,sizeof(float*)))==NULL)
{
p("Error al asignar espacio");
exit(0);
}
for(i=0;i<r;i++)
if((m[i]=(float*)calloc(c,sizeof(float)))==NULL)
{
p("Error al asignar espacio");
exit(0);
}
return m;
}
void asig(float **a,int r,int c)
{
int i=0,j=0;
for(i=0;i<r;i++)
for(j=0;j<c;j++)
{
p("\n\t%cCu%cl es el elemento [%d][%d] de la matriz?",168,160,i+1,j+1);
s("%f",((a+i)+j));
}
}
void imp(float **a,int r,int c)
{
int i=0,j=0;
p("\n\tLa matriz queda:\n");
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
p("%f ",*(*(a+i)+j));
}
p("\n");
}
}
float** suma(float **a,float **b,float **c,int r,int x)
{
int i=0,j=0;
for(i=0;i<r;i++)
for(j=0;j<x;j++)
*(*(c+i)+j)=*(*(a+i)+j)+*(*(b+i)+j);
return c;
}de here
这是问题所在
s("%f", ((a + i) + j));
这
scanf("%f", &a[i][j]);
始终使用正确的函数名称,这(*(a + i) + j)
也是可以的,但是如您所见,这令人困惑。
使用数组索引表示法可以避免出现问题。
如果您想知道我是如何在发布的烂摊子中找到它的,则使用了编译器警告。他们是你的朋友。
顺便说一句:scanf()
有一个返回值,请检查它,如果您不小心给程序提供了一些无效的输入,那么将会发生意外的问题,对于每个malloc()
您都需要afree()
并且不要使用它,calloc()
除非您打算稍后将这些值初始化为零。将初始化每个值的使用malloc()
。
这是程序的更正版本
#include <stdio.h>
#include <stdlib.h>
float** aloc(float **m,int r,int c);
void asig(float **a,int r,int c);
void imp(float **a,int r,int c);
float** suma(float **a,float **b,float **c,int r,int x);
int main()
{
float **ma = NULL,**mb = NULL,**mc = NULL;
int r = 0, c = 0;
printf("\n\tEste programa suma 2 matrices cuyas dimensiones son dadas por el usuario\n\n\t%cCu%cntos renglones tienen las matrices?",168,160);
if (scanf("%d", &r) != 1)
return -1;
printf("\n\t%cCu%cntas columnas tienen las matrices?", 168, 160);
if (scanf("%d", &c) != 1)
return -1;
ma = aloc(ma, r, c);
if (ma == NULL)
goto failed;
mb = aloc(mb, r, c);
if (mb == NULL)
goto failed;
mc = aloc(mc, r, c);
if (mc == NULL)
goto failed;
printf("\n\n\t\tMATRIZ 1");
asig(ma, r, c);
imp(ma, r, c);
printf("--------------------------\n\n\t\tMATRIZ 2");
asig(mb, r, c);
imp(mb, r, c);
printf("--------------------------");
mc = suma(ma, mb, mc, r, c);
printf("\n\tLa matriz resultante es:\n");
imp(mc, r, c);
getchar();
free(ma);
free(mb);
free(mc);
return 0;
failed:
free(ma);
free(mb);
free(mc);
return -1;
}
float** aloc(float **m,int r,int c)
{
int i = 0;
if ((m = calloc(r, sizeof(float*))) == NULL)
{
printf("Error al asignar espacio");
return NULL;
}
for (i = 0 ; i < r ; i++)
{
if ((m[i] = calloc(c, sizeof(float))) == NULL)
{
int j;
for (j = i ; j >= 0 ; j--)
free(m[j]);
free(m);
return NULL;
}
}
return m;
}
void asig(float **a,int r,int c)
{
int i = 0, j = 0;
for(i = 0 ; i < r ; i++)
{
for(j = 0 ; j < c ; j++)
{
printf("\n\t%cCu%cl es el elemento [%d][%d] de la matriz?", 168, 160, i + 1, j + 1);
scanf("%f", &a[i][j]);
}
}
}
void imp(float **a,int r,int c)
{
int i = 0,j = 0;
printf("\n\tLa matriz queda:\n");
for(i = 0 ; i < r ; i++)
{
for(j = 0 ; j < c ; j++)
{
printf("%10f", a[i][j]);
}
printf("\n");
}
}
float** suma(float **a,float **b,float **c,int r,int x)
{
int i = 0,j = 0;
for(i = 0 ; i < r ; i++)
{
for(j = 0 ; j < x ; j++)
{
c[i][j] = a[i][j] + b[i][j];
}
}
return c;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句