0

我正在尝试编写为字符串创建 squere 的程序。Squere 必须大于 string.length()。如果有单词“C++”,我需要 2x2 数组来填充它。所以我写了代码

 #include <cmath>
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
int pole(int &a,const int* l);
int main(){
    string code;
    cin >> code;
    int wall=1;
    pole(wall,code.length());
    cout << wall;
    system("PAUSE");
    return 0;
}
int pole(int &a,const int* l){
    if (a*a > l) return a;
    else {
    a+=1;
    pole(a,l);
    }
}

我敢打赌,使用具有重复性的指针可以节省大量内存,但我无法编译它。我正在尝试理解编译器错误,但对我来说很难 2 ;/

这是编译器错误列表

> in main() 
11 25 Error] invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int (*)(int&, const int*)' 
 6 5> [Error] in passing argument 1 of 'int pole(int&, const int*)' 
 in pole() 17 12 
>[Error] ISO C++ forbids comparison between pointer and
> integer [-fpermissive]
4

3 回答 3

2

这里:

pole(pole, code.length());

您将 的结果作为第二个变量传递length(),它的类型为std::string::size_type,函数pole接受指向 的指针int。这两种类型是不兼容的。

第二个问题是你的if语句里面的一个分支pole不包含一个return语句,从而给你的程序未定义的行为。

您可能希望以pole这种方式更改您的功能:

int pole(int &a, std::string::size_type l) {
//               ^^^^^^^^^^^^^^^^^^^^^^
//               Also, passing by reference is unnecessary here

    if (a*a > static_cast<int>(l)) return a;
//            ^^^^^^^^^^^^^^^^
//            Just to communicate that you are aware of the
//            signed-to-unsigned comparison here
    else {
    a+=1;
    return pole(a,l);
//  ^^^^^^
//  Do not forget this, or your program will have Undefined Behavior!
    }
}

在这里您可以看到您修改后的程序编译并运行。

于 2013-03-16T19:24:55.230 回答
0

您正在尝试使用无符号整数(来自std::string::length)作为指针:

pole(wall,code.length());

将您的极点声明更改为:

int pole(int a, int l);

在那里节省内存int只是无稽之谈。指针有时甚至比简单整数更昂贵。

你应该学会用大对象来节省内存。

于 2013-03-16T19:24:37.117 回答
0
int pole(int &a,const int* l){
    if (a*a > l) return a;
    else {
    a+=1;
    pole(a,l);
    }
}

首先,您不能int* l使用size_t参数进行初始化。您也可以稍后在地址之间进行比较,而不是指向值。这是你想要的吗?

于 2013-03-16T19:30:15.210 回答