C++
- 27 ответов
- 0 вопросов
27
Вклад в тег
new char
выделит память только для одного символа, а у вас их много. То есть уже в следующей строке (cin >> array)
проезд по памяти. Если пишете в целях обучения и нельзя брать std::string
, то выделяйте с запасом, например new char[256];
Освобождать при этом память надо будет при помощи delete[] array
;cin >> array
делает это сам (пишет в конец array нулевой символ), а вы в своей функции нулевой символ не выставляете. Сделать это можно так:str[length_str] = '\0';
length_str
.delete []
#include <vector>
std::string gen(std::vector<char> alphabet, std::size_t idx, std::size_t digits)
{
std::string ret(digits, alphabet[0]);
std::size_t alphas = alphabet.size();
while (digits--)
{
ret[digits] = alphabet[idx % alphas];
idx /= alphas;
}
return ret;
}
void gen_and_out(std::size_t n, std::vector<char> alphabet)
{
std::size_t numbers = 1;
std::size_t alphas = alphabet.size();
for (std::size_t i = 0; i < n; ++i)
{
numbers *= alphas; // на каждом шаге чисел в alphas раз больше
for (std::size_t cur = 0; cur < numbers; ++cur)
{
std::cout << gen(alphabet, cur, i + 1) << std::endl;
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
gen_and_out(3, std::vector<char>({ 'a', 'b', 'c'}));
}
#include <vector>
std::string gen(std::vector<char> alphabet, std::size_t idx)
{
std::vector<char> ret;
std::size_t alphas = alphabet.size();
while (idx)
{
std::size_t cur = idx % alphas;
if (!cur) // нет нуля
cur = alphas;
ret.push_back(alphabet[cur - 1]);
idx = (idx - cur) / alphas;
}
return std::string(ret.rbegin(), ret.rend());
}
void gen_and_out(std::size_t n, std::vector<char> alphabet)
{
std::size_t numbers = 1;
std::size_t alphas = alphabet.size();
for (std::size_t i = 0; i < n; ++i)
{
numbers *= alphas;
numbers += 1;
}
for (std::size_t i = 1; i < numbers; ++i)
std::cout << gen(alphabet, i) << std::endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
gen_and_out(3, std::vector<char>({ 'a', 'b', 'c' }));
}
gen alphas n = concatMap (`replicateM` alphas) [1..n]
main = mapM_ putStrLn $ gen "abc" 3
execute f n = foldr1 (.) (replicate (succ n) f) (fromIntegral n)
execute f n = foldr ($) (fromIntegral n) (replicate (succ n) f)
Ret (Class::*)(Args...) [const]
. Сам указатель получать &Class::Fun
, а вызывать операторами .*
или ->*
std::function
(boost::function
), std::bind
(boost::bind
) или std::mem_fun, std::mem_fn
для более унифицированного подхода:struct some
{
some() : value(0) {}
int inc() { return ++value; }
int dec() { return --value; }
int get() const { return value; }
int value;
};
int main()
{
some s;
int (some::*inc_f)() = &some::inc; // inc_f - указатель на функцию
std::cout << "(s.*inc_f)() = " << (s.*inc_f)() << std::endl; // оператор .* - оператор вызова по указателю на функцию
int (some::*val_ptr) = &some::value; // val_ptr - указатель на член
s.*val_ptr = 10;
std::cout << "s.*val_ptr = " << s.*val_ptr << std::endl;
int (some::*const_f)() const = &some::get; // const-функция
std::cout << "s.*const_f() = " << (s.*const_f)() << std::endl;
using namespace std::placeholders;
std::function<int (some&)> mem_f;
mem_f = std::bind(&some::inc, _1); // биндим на функцию-член, _1 - placeholder для объекта
std::cout << "mem_f(s) = " << mem_f(s) << std::endl; // s.inc();
mem_f = std::mem_fn(&some::dec); // другой способ через mem_fn
std::cout << "mem_f(s) = " << mem_f(s) << std::endl; // s.dec();
std::function<int()> mem_f_ = std::bind(&some::inc, &s); // биндим на функцию член и сразу указываем объект, получаем функцию без аргументов
std::cout << "mem_f_() = " << mem_f_() << std::endl; /// s.inc();
std::function<int(some const &)> const_fn = std::mem_fn(&some::get); // some const &
std::cout << "const_fn(s) = " << const_fn(s) << std::endl;
return 0;
}