指针的指针作为函数返回值的问题

lcaamtb 2003-10-20 11:27:17
有一个tc程序,求助!
输入一个n×(p+1)矩阵,要求输出其转置矩阵,并且转置用函数实现!

#include "stbio.h"
//矩阵转置函数
double **zhuanzhi(int **x,int n,int m)
int **y,i,j;
{
//为y分配m×n的内存空间;

//转置
for(i=0;i<m;i++)
for(j=0;j<n;j++)
y[i][j]=x[j][i];
return(y);
free(y);
}
void main()
int **x,**x_zhuanzhi;
int n,p;
{
//输入n,p
scanf("%d%d",&n,&p);

//为x,x_zhuanzhi分配内存空间
x=(double**)malloc(sizeof(double*)*n);
for (i=0;i<n;i++)
{
x[i]=(double *)malloc(sizeof(double)*(p+1));
}
x_zhuanzhi=(double**)malloc(sizeof(double*)*(p+1));
for(i=0;i<=p;i++)
x_zhuanzhi[i]=(double*)malloc(sizeof(double)*n);

//输入矩阵x;
for(i=0;i<n;i++)
for(j=0;j<=p;j++)
scanf("%d",&x[i][j]);

//求矩阵x的转置矩阵;
x_zhuanzhi=zhuanzhi(x,n,(p+1));//编译时显示这边出错,但不知道错在哪里

//输出转置矩阵
free(x);
free(x_zhuanzhi);
}

请告诉我错在哪里,并且输入矩阵x时候,如果输入矩阵元素不是int型,而是double型,程序就会出错.有哪位可以指点一下的。或者给我留言:QQ:25389192

...全文
122 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lcaamtb 2003-10-21
  • 打赏
  • 举报
回复
不行啊,采用你的两种方法都不行,kissme1943(jjj) ,老是出错!x_zhuanzhi=zhuanzhi(x,n,(p+1));//编译时显示这边出错,但不知道错在哪里non-probable pointer assignment.有没有人知道怎么回事的啊!而且也不能输入double型的矩阵元素,要不然也出错
langzi8818 2003-10-21
  • 打赏
  • 举报
回复
UP
lcaamtb 2003-10-21
  • 打赏
  • 举报
回复
多谢了,我试验一下
tibetan 2003-10-21
  • 打赏
  • 举报
回复
i am late,sorry .
kissme1943 2003-10-21
  • 打赏
  • 举报
回复
在矩阵转置函数
double **zhuanzhi(int **x,int n,int m)中声明的int **y, 并返回return(y);y是一个函数体内的局部变量,退出函数后就释放了,怎么还能用指针去取值呢??!!

解决方法1:把int **y,改成 static int **y, 然后返回return y;因为static 在函数退出后不释放。这样就可以在函数体外用指针了。

解决方法2:把double **zhuanzhi(int **x,int n,int m)改成
void zhuanzhi(int **x,int n,int m,int **result)
int **result 是存放转置后的矩阵的,但它是主函数传入的,所以不是局部变量,在外面就可以使用了,多传一个参数就可以解决问题了,用一个参数来代替返回值
TianGuangZao 2003-10-21
  • 打赏
  • 举报
回复
我按你的要求写的,动态分配内存算法和你不同。
本来想用数组指针的,那样看上去要简洁一些,可惜没法给函数传递数组指针,因为我没法预先知道列号。
如果是固定列号,最好采用数组指针,形式如下:
double (*xptr)[COLS];
我已经黔驴技穷了,请大伙推荐其它更高明的方法。

说明:长度关系,程序未对输入部分做检查,不够健壮,还有很多地方有漏洞,也请大伙来完善了。

/*
** 程序名:matrix_transpose.c
**
** 版本:0.1
**
** 用途:求 MElemType 型矩阵的转置矩阵
**
*/

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

/* 矩阵元素类型声明 */

typedef double MElemType;

/* 函数原型 */

MElemType ** mat_transpose( MElemType **mat, int nrows, int ncols );
MElemType ** mat_alloc( int nrows, int ncols );
void max_print( const MElemType **mat, int nrows, int ncols );

int main()
{
/* 输入行数,列数 */

int rows, cols;
printf( "Input matrix's nrows,ncols : ");
scanf( "%d,%d", &rows, &cols);

/* 矩阵初始化 */

MElemType **matrix = mat_alloc( rows, cols );

int i, j;
for ( i = 0; i < rows; ++i)
for ( j = 0; j < cols; ++j)
scanf( "%lf", &matrix[i][j]);

/* 求转置矩阵 */

MElemType **matrix2 = mat_transpose( matrix, rows, cols );

/* 打印转置矩阵,注意行列数前后次序 */

max_print( matrix2, cols, rows );

/* 释放内存 */

free( matrix );
free( matrix2 );

return 0;
}


/* 矩阵转置函数 */

MElemType ** mat_transpose( MElemType **mat, int nrows, int ncols )
{
/* 注意转置矩阵行列数刚好和原矩阵相反 */

MElemType **ret = mat_alloc( ncols, nrows );

int i, j;
for ( i = 0; i < ncols; i++)
for ( j = 0; j < nrows; j++)
ret[i][j] = mat[j][i];

return ret;
}

/* 分配矩阵空间函数 */

MElemType ** mat_alloc( int nrows, int ncols )
{
int i;
MElemType **rptr;
MElemType *mptr;

/* 首先,为矩阵分配内存,一次性给足 */

mptr = malloc( nrows * ncols * sizeof(MElemType));
if (mptr == NULL)
{
puts("\nFailure to allocate room for the matrix");
exit(0);
}

/* 然后,给指向矩阵行的指针分配空间 */

rptr = malloc( nrows * sizeof(MElemType *));
if (rptr == NULL)
{
puts("\nFailure to allocate room for pointers");
exit(0);
}

/* 最后,让这些指针指向对应行 */

for (i = 0; i < nrows; ++i)
{
rptr[i] = mptr + (i * ncols);
}

return rptr;
}

/* 打印转置矩阵函数 */

void max_print( const MElemType **mat, int nrows, int ncols )
{
int i, j;
for ( i = 0; i < nrows; ++i) /* 打印行 */
{
for ( j = 0; j < ncols; ++j) /* 打印列 */
printf( "%lf ", mat[i][j]);

printf("\n");
}
}


oyd 2003-10-21
  • 打赏
  • 举报
回复
编译x_zhuanzhi=zhuanzhi(x,n,(p+1));时出错是因为double ** 不能隐式转化为int ** ,把x_zhuanzhi声明为double **类型看看。
你的scanf("%d%d",&n,&p);的格式串中用的是%d,改用%f看看,注意n和p也要相应的改为float型。

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧