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());

2番目の変数として、関数が。へのポインタを受け入れるlength()タイプのの結果を渡します。これらの2つのタイプは互換性がありません。std::string::size_typepoleint

if2番目の問題は、内部のステートメントの1つのブランチにステートメント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 に答える