【问题标题】:recursive polynomial multiplication [closed]递归多项式乘法
【发布时间】:2012-04-30 20:17:24
【问题描述】:

我写了以下递归多项式乘法,但它给了我错误,代码在这里

#include<iostream>
#include<vector>
using namespace std;
#define N 4
float *mult(float p[],float q[],int n)
{
    float pl[N/2],ql[N/2],ph[N/2],qh[N/2];
    float t1[N/2],t2[N/2];
    float r[2*N-2],rl[N],rm[N],rh[N];
    int i,N2;
    if(N==1)
    {
        r[0]=p[0]*q[0]; return (float *)r;
            }
    for(i=0;i<N/2;i++)
    {
        pl[i]=p[i];
        ql[i]=q[i];
    }
    for(i=N/2;i<N;i++)
    {
        ph[i-N/2]=p[i];
        qh[i-N/2]=q[i];

    }
    for(i=0;i<N/2;i++) t1[i]=pl[i]*ph[i];
    for(i=0;i<N/2;i++) t2[i]=ql[i]*qh[i];
    rm=mult(t1,t2,N/2);
    rl=mult(pl,ql,N/2);
    rh=mult(ph,qh,N/2);
    for(i=0;i<N-1;i++) r[i]=rl[i];
    r[N-1]=0;
    for(i=0;i<N-1;i++) r[N+i]=rh[i];
    for(i=0;i<N-1;i++)
        r[N/2+i]+=rm[i]-(rl[i]+rh[i]);
    return (float *)r;
}

错误是这些

(13): warning C4172: returning address of local variable or temporary
(28): error C2440: '=' : cannot convert from 'float *' to 'float [4]' There are no conversions to array types, although there are conversions to references or pointers to arrays
(29): error C2440: '=' : cannot convert from 'float *' to 'float [4]' There are no conversions to array types, although there are conversions to references or pointers to arrays
(30): error C2440: '=' : cannot convert from 'float *' to 'float [4]' There are no conversions to array types, although there are conversions to references or pointers to arrays
(36): warning C4172: returning address of local variable or temporary

我不明白是什么原因?请帮帮我

【问题讨论】:

  • 拜托,如果您通过反复试验将代码从 Java 转换为 C++,您需要停止在 SO 上发布大块代码,并在 C++ 上获得decent introductory book,以了解语言的基础知识。您的所有问题都会一口气得到解答。这大约是您在过去 2 天内采用这种格式的第 10 个问题。
  • 不,我不同意你,我没有从 java 翻译成 c++,所以在有人投反对票之前,问我 dato 是不是从 java 翻译成 c++?这很粗鲁
  • 对不起,这是根据您在上一个问题中所说的假设。无论如何,要点是一样的;你需要正确地学习语言; SO 不是这样做的地方。
  • 我不是通过这段代码学习 c++,它是执行某些任务的示例代码,我已经厌倦了投票,如果有人认为它有助于我学习一些东西,我会开始普遍投票会告诉任何问我为什么这样做的人,这是学习的方法
  • @dato:你不是在帮助自己。您需要停止一遍又一遍地发布此类问题,并花一些时间来学习 C++ 的基础知识。然后你会发现很容易回答你自己的问题。

标签: c++ recursion polynomial-math


【解决方案1】:

警告 C4172:返回局部变量或临时地址

这意味着您正在调用未定义的行为,因为您正在返回一个变量的地址,该地址将在退出某个范围时不再存在。我可以看到这样的一个实例:

float *mult(float p[],float q[],int n)

创建本地数组r 并返回它的地址。和往常一样,还有很多其他错误,但我会停止这个。

你可以通过返回一个向量来避免这个问题:

std::vector<float> mult( .... ) { fill vector with values you would put in array and return it }

这只是一种可能的解决方案。这里的好处是您不必担心内存管理。

【讨论】:

  • @dato 有很多方法。我建议返回一个对象,该对象按值包含您想要在指针中返回的所有信息。
  • 对不起@juanchopanza 我不是在说你,你是想帮助我的人,其他人只是想说智慧,在这种情况下如何返回我不明白,你能更具体一点?
  • @dato 例如,如果您知道要返回的数组有多大,则只需创建一个 std::vector,将元素放入,然后按值返回即可。它会在内存管理方面为您省去很多麻烦。
【解决方案2】:

你有几个不同的问题,但它们是相互关联的。

您收到的第一个和最后一个警告是因为r 是您的函数中的一个局部变量,它会在函数返回时消失——这意味着像您一样返回它的地址是自找麻烦。调用者将获得一个不再指向任何有意义的指针。 (很可能,很多时候代码仍然可以工作,但这只是因为你很幸运。)

其他错误是因为您有一个返回指向数组的指针的函数,并且您试图将该返回值分配给数组变量。我不确定您是否希望 (1) 数据的内容将被复制到数组中,或者 (2) 数组变量将开始引用函数返回的数据,但实际上两者都不会发生.

这两个问题的解决方案是相同的:更清楚、更小心地注意数组和指针之间的区别,以及你正在操作的数据实际存在的位置。您可以采取三种主要方法来完成这项工作。

首先,您可以将数据放入 C++ vector&lt;float&gt; 之类的东西中,而不是 C 样式的数组中。这些可以按值传递,与您尝试做的方式大致相同,它会正常工作。但是,它可能涉及大量数据复制,这可能会使您的代码比您希望的要慢。

其次,您可以继续使用 C 风格的原始内存块,但始终使用指针而不是数组,并使用 newdeletemallocfree 显式分配它们,以及请注意,所有内容都只被释放一次。

第三,你可以继续使用 C 风格的数组,但是——而不是试图从你的函数返回数组——将一个指向数组开头的指针传递给函数,并填充它的新内容。这样,内存管理是您的 mult 函数的调用者的责任,如果您做对了,您可能会避免在 mult 本身中需要任何类型的内存分配。 (你可能会发现调用者需要传入一个指向某个临时空间的指针;如果你组织得当,递归调用将能够使用相同的临时空间。)

第一种方法是最简单的。最后一个可能是表现最好的。我真的不推荐中间那个。

【讨论】:

    【解决方案3】:

    最好让数组r, rl, rm, rh 动态化,这样可以同时消除警告和错误。

    #include <iostream>
    #include <vector>
    using namespace std;
    #define N 4
    float* mult(float p[],float q[],int n)
    {
        float pl[N/2],ql[N/2],ph[N/2],qh[N/2];
        float t1[N/2],t2[N/2];
        float* r = new float[2*N-2]; // Create it dynamically so it can be safely returned
        float *rl, *rm, *rh; // They don't need to be allocated because they will be assigned later down there.
        int i,N2;
        if(N==1)
        {
            r[0]=p[0]*q[0];
            return r;
        }
        for(i=0;i<N/2;i++)
        {
            pl[i]=p[i];
            ql[i]=q[i];
        }
        for(i=N/2;i<N;i++)
        {
            ph[i-N/2]=p[i];
            qh[i-N/2]=q[i];
    
        }
        for(i=0;i<N/2;i++) t1[i]=pl[i]*ph[i];
        for(i=0;i<N/2;i++) t2[i]=ql[i]*qh[i];
        rm=mult(t1,t2,N/2);
        rl=mult(pl,ql,N/2);
        rh=mult(ph,qh,N/2);
        for(i=0;i<N-1;i++) r[i]=rl[i];
        r[N-1]=0;
        for(i=0;i<N-1;i++) r[N+i]=rh[i];
        for(i=0;i<N-1;i++)
            r[N/2+i]+=rm[i]-(rl[i]+rh[i]);
        return r;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多