- 主题:一个函数返回多个值的问题(附程序请教)
用的是C,不是C++,最近在编大小不定的矩阵乘法的子函数,希望子函数返回乘后的新“矩阵”和矩阵的“行数”、“列数”,打算用一个数组返回指针的地址、行数和列数。下面是我自己在练习时遇到的问题,程序虽然能输出正确的值,但是有警告,分别出在“ARR[0]=p”和“p1=ARR[0]”,请问这个问题怎么解决?需要我的子函数返回结构体嘛?结构体的第一个存指针,后两个存整数?求问应该怎么解决这两个警告:
In function 'A':
[Warning] assignment makes integer from pointer without a cast
In function 'main':
[Warning] assignment makes pointer from integer without a cast
#include <stdlib.h>
#include <stdio.h>
int m=5;//行数
int n=3;//列数
void Print_mat(int **A,int Row_A,int Line_A)
//子函数:打印数组
{
int i,j;
for(i=0;i<Row_A;i++)//
{
for(j=0;j<Line_A;j++)
{
printf("%4d",A[i][j]);
if ((j!=0)&(j%(Line_A-1)==0) )
printf("\n");
}
}
}
int *A(int **p,int m,int n)
//子函数A,更改数组内部的值
{
int * ARR;
ARR=(int*)calloc(3,sizeof(int));
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
p[i][j]=p[i][j]-1;
}
}
printf("函数内部新指针p的地址是:%d\n",p);
ARR[0]=p;ARR[1]=m;ARR[2]=n;
return ARR;
}
int main()
{
int *ARR,**p,**p1,i;
p=(int**)calloc(m,sizeof(int*));//创建二级指针,是整个数组的首地址
for(i=0;i<m;i++)
{
p[i]=(int*)calloc(n,sizeof(int));//创建一级指针,是每一行的首地址
}
printf("原始数组如下:\n");
Print_mat(p,m,n);
ARR=A(p,m,n);//调用函数
p1=ARR[0];
printf("新数组如下:\n");
Print_mat(p1,m,n);
}
--
FROM 111.193.229.*
用返回结构体的方式创建函数没有再报警了
【 在 sqsl 的大作中提到: 】
: 用的是C,不是C++,最近在编大小不定的矩阵乘法的子函数,希望子函数返回乘后的新“矩阵”和矩阵的“行数”、“列数”,打算用一个数组返回指针的地址、行数和列数。下面是我自己在练习时遇到的问题,程序虽然能输出正确的值,但是有警告,分别出在“ARR[0]=p”和“p1=ARR[0]
: ”,请问这个问题怎么解决?需要我的子函数返回结构体嘛?结构体的第一个存指针,后两个存整数?求问应该怎么解决这两个警告:
: In function 'A':
: ...................
--
FROM 111.193.229.*
地址值一般是long型,你用int型保存会有警告
--
FROM 223.104.228.*
试了一下问题依旧啊
#include <stdlib.h>
#include <stdio.h>
int m=5;//行数
int n=3;//列数
void Print_mat(int **A,int Row_A,int Line_A)
//子函数:打印数组
{
int i,j;
for(i=0;i<Row_A;i++)//
{
for(j=0;j<Line_A;j++)
{
printf("%4d",A[i][j]);
if ((j!=0)&(j%(Line_A-1)==0) )
printf("\n");
}
}
}
long int *A(int **p,int m,int n)
//子函数A,更改数组内部的值
{
long int * ARR;
ARR=(long int*)calloc(3,sizeof(long int));
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
p[i][j]=p[i][j]-1;
}
}
printf("函数内部新指针p的地址是:%d\n",p);
ARR[0]=p;ARR[1]=m;ARR[2]=n;
return ARR;
}
int main()
{
int **p,**p1,i;
long int *ARR;
p=(int**)calloc(m,sizeof(int*));//创建二级指针,是整个数组的首地址
for(i=0;i<m;i++)
{
p[i]=(int*)calloc(n,sizeof(int));//创建一级指针,是每一行的首地址
}
printf("原始数组如下:\n");
Print_mat(p,m,n);
ARR=A(p,m,n);//调用函数
p1=ARR[0];
printf("新数组如下:\n");
Print_mat(p1,m,n);
}
【 在 haiyy 的大作中提到: 】
: 地址值一般是long型,你用int型保存会有警告
--
FROM 111.193.233.*
ARR是指针,ARR[0]就是值,p是指针,当然会报错。
再说了,你在A()已经直接更改的是p的内存,而不是Copy矩阵数据到ARR
ARR只是存了地址而已
何必多此一举用ARR返回? 直接用p不就行了吗
没看懂
【 在 sqsl 的大作中提到: 】
: 用的是C,不是C++,最近在编大小不定的矩阵乘法的子函数,希望子函数返回乘后的新“矩阵”和矩阵的“行数”、“列数”,打算用一个数组返回指针的地址、行数和列数。下面是我自己在练习时遇到的问题,程序虽然能输出正确的值,但是有警告,分别出在“ARR[0]=p”和“p1=ARR[0]”,请问这个问题怎么解决?需要我的子函数返回结构体嘛?结构体的第一个存指针,后两个存整数?求问应该怎么解决这两个警告:
: In function 'A':
: [Warning] assignment makes integer from pointer without a cast
: ...................
--
FROM 124.77.253.*
我就是测试这个功能,所以功能实现有点多此一举的意思
ARR[0]的值就是指针啊
【 在 freynew123 的大作中提到: 】
: ARR是指针,ARR[0]就是值,p是指针,当然会报错。
: 再说了,你在A()已经直接更改的是p的内存,而不是Copy矩阵数据到ARR
: ARR只是存了地址而已
: ...................
--
FROM 111.193.233.*
??????????????
ARR是一级指针,ARR[0]: 是取值还是指针?
编译器认类型,又不解析内在含义
里面的值是地址值,就是一个值
【 在 sqsl 的大作中提到: 】
: 我就是测试这个功能,所以功能实现有点多此一举的意思
: ARR[0]的值就是指针啊
:
--
FROM 124.77.253.*
指针值虽然跟long型长度一样,但毕竟是不同的数据类型,不想出现警告的话可以加个类型转换比如 (long)p 这种。
【 在 sqsl 的大作中提到: 】
: 试了一下问题依旧啊
: #include <stdlib.h>
: #include <stdio.h>
: ...................
--
FROM 223.104.228.*
看起来你要返回的是三个东西(二维数组指针,行数、列数),那就返回一个struct好了
struct DynamicArray {
int **data;
int row;
int col;
}
而且这就是C里面造轮子:动态二维数组
--
修改:z16166 FROM 221.218.160.*
FROM 221.218.160.*
是的,我后面用这种方法搞成的
【 在 z16166 的大作中提到: 】
: 看起来你要返回的是三个东西(二维数组指针,行数、列数),那就返回一个struct好了
: struct DynamicArray {
: int **data;
: ...................
--
FROM 111.193.233.*