Указатели и возвратность — я пытаюсь сохранить память

Я пытаюсь написать программу, которая создает 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]

0

Решение

Вот:

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!
}
}

Вот вы можете увидеть, как ваша измененная программа компилируется и запускается

2

Другие решения

Вы пытаетесь использовать целое число без знака (приходящий из std::string::length) в качестве указателя в:

pole(wall,code.length());

Измените ваши объявления полюса:

int pole(int a, int l);

Экономия памяти на int это просто ерунда там. Указатели иногда даже дороже памяти, чем простые целые числа.

Вы должны научиться экономить память с огромными объектами.

0

int pole(int &a,const int* l){
if (a*a > l) return a;
else {
a+=1;
pole(a,l);
}
}

во-первых, вы не можете инициализировать int* l с size_t аргумент.
Также вы делаете позднее сравнение между адресом, а не значением, указанным тоже.
Это то, что вы хотели?

0
По вопросам рекламы [email protected]