Я пытаюсь написать программу, которая создает squere для строки. Squere должен быть больше, чем string.length (). Если есть слово «C ++», мне нужен массив 2х2, чтобы заполнить его внутри.
Итак, я написал код
#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]
Вот:
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!
}
}
Вот вы можете увидеть, как ваша измененная программа компилируется и запускается
Вы пытаетесь использовать целое число без знака (приходящий из std::string::length
) в качестве указателя в:
pole(wall,code.length());
Измените ваши объявления полюса:
int pole(int a, int l);
Экономия памяти на int
это просто ерунда там. Указатели иногда даже дороже памяти, чем простые целые числа.
Вы должны научиться экономить память с огромными объектами.
int pole(int &a,const int* l){
if (a*a > l) return a;
else {
a+=1;
pole(a,l);
}
}
во-первых, вы не можете инициализировать int* l
с size_t
аргумент.
Также вы делаете позднее сравнение между адресом, а не значением, указанным тоже.
Это то, что вы хотели?