注册 登录
编程论坛 C++教室

函数想返回一个二维数组怎么做

y605302737 发布于 2013-03-01 21:35, 6143 次点击
大家好,请问下我想将一个二维数组作为函数的返回要怎么做?另外把二维数组作为函数参数有没有不给第二个长度,即Bin值的办法,因为函数Convolution中我想给arr的值和Bin一样,这样函数的参数要怎么写更好一些,我是新手,请大家指点下,谢谢!
程序代码:
#include <iostream>
#include <fstream>
using namespace std;

const int Run = 2;
const int Bin = 2;

int** Convolution(int arr,const int h[],int g[][Bin]);

int main()
{
    ifstream inFile;
    inFile.open("time.txt");
    if(!inFile)
    {
        cerr<<"read time.txt fail"<<endl;
        return 1;
    }
    int Pulse[Run][Bin];
    int value;
    inFile>>value;
    for(int i=0;i!=Run;i++)
    {
        for(int j=0;j!=Bin && inFile.good() ;j++)
        {
                Pulse[i][j]=value;
                inFile>>value;
        }
    }

    if(inFile.eof())
        cout<<"End of the file"<<endl;
   
    inFile.close();

    //convolution
    const int signal[Bin]={2,3};

    int** conv=Convolution(Bin,signal,Pulse);

    cout<<*(*(conv+1)+1)<<endl;

    return 0;   
}


int** Convolution(int arr,const int h[],int g[][Bin])
{
    int s[Run][2*Bin];     //这里我想定义一个二维数组,长度都是已知的,这样写可以吗
    for(int i=0;i!=Run;i++)
    {
        for(int t=0;t!=2*arr;t++)
        {
            for(int n=0;n<=t;n++)
                s[i][t]+=g[i][n]*h[t-n];
        }
    }
    return s;  //请问下这个地方应该怎么写才能返回上面的二维数组

}

 
10 回复
#2
rjsp2013-03-02 09:25
完全看不懂你的Convolution想干什么,又是不赋初值就使用,又是数组越界的,所以我把Convolution留白,你自己想好了再添加,添加到 Convolution 函数中去
程序代码:
void Convolution_( size_t row, size_t col, const int* h, const int* g, int* s );

template<size_t ROW, size_t COL>
static inline void Convolution( const int (&h)[COL], const int (&g)[ROW][COL], int (&s)[ROW][2*COL] )
{
    Convolution_( ROW, COL, h, &g[0][0], &s[0][0] );
}

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ifstream inFile( "time.txt" );
    if( !inFile )
    {
        cerr << "read time.txt fail\n";
        return 1;
    }

    const size_t Run = 2;
    const size_t Bin = 2;
    int Pulse[Run][Bin];
    for( size_t i=0; i!=Run*Bin; ++i )
    {
        inFile >> Pulse[i/Bin][i%Bin];
        if( !inFile )
            break;
    }
    if( inFile.eof() )
        cout<<"End of the file"<<endl;
    inFile.close();

    //convolution
    const int signal[Bin]={2,3};
    int conv[Run][2*Bin];
    Convolution( signal, Pulse, conv );

    cout<< conv[1][1] <<endl;

    return 0;  

}


void Convolution_( size_t row, size_t col, const int* h, const int* g, int* s )
{
    // g[r][c] 写成 g[r*col+c]
   
// s[r][c] 写成 s[r*col*2+c]
   
// 其它就没什么了
}

#3
rjsp2013-03-02 09:26
添加到 Convolution_ 函数中去
#4
y6053027372013-03-02 09:28
回复 2楼 rjsp
你好,我的Convolution函数想做一个离散信号的卷积,从time.txt读取一个二维数组,即多组离散信号pulse,与signal信号作卷积,不知道这样写对吧,哪位高手知道的也可以给指点下,谢谢!

[ 本帖最后由 y605302737 于 2013-3-2 09:44 编辑 ]
#5
zjl120062013-03-02 21:08
弱弱的说一句,你在你的Convolution函数中,在堆中开辟一块内存空间,让后,让你的Convolution函数返回一个引用,是否可行?

本人也是菜鸟,只是觉得这样可行。。。不行的话,勿怪啊。。。
#6
y6053027372013-03-03 08:57
回复 5楼 zjl12006
谢谢你的问答,你的意思是用new来建一个动态的二维数组,然后返回这个动态二维数组的指针??
#7
wp2319572013-03-03 09:13
什么几维数组也好  其数据都是内存中的一片数据  所以你只要返回该片数据的首地址即可
#8
y6053027372013-03-03 16:23
谢谢大家的回答,那有没有谁有做一维卷积的c++程序,可以可以告诉我,

[ 本帖最后由 y605302737 于 2013-3-3 16:25 编辑 ]
#9
锋了2013-03-03 19:56
7楼跟我想的一样,简单
#10
额外覆盖2013-03-03 23:08
利用指针函数,返回地址就行了
#11
邓士林2013-03-03 23:44
首先你定义数组时要明确数组的大小,这是数组的定义的规则:类型标识符  数组名[常量表达式][常量表达式];例如:float a[3][4]。第二:你返回一个数组s时,不能写成s,对于数组而言,数组名代表数组中第一个元素的地址,即你所返回的return s;中的s是个地址,如果你想返回最后的和s,可以从新定义个变量,然后把s赋值给它,返回此变量即可。还有你提到的用二维数组作参数然后不用写大小,那你只能用指针,但是在定义的时候数组的大小是肯定的。
1