我正在尝试使用C ++列表库制作一个简单的seq程序
当我使用第一级时,我的程序运行正常,但是,由于某种原因,它在所有其他级别之后崩溃。
我使用visual studio作为编译器。我尝试了调试器模式以及资源。 程序在资源模式下不会崩溃,但它不会给我偶数级别的输出。另外,由于某种原因,它给出了一半的赔率水平。
我想解决这个问题,我希望它也能在dubgger模式下工作。
有什么建议吗?
这是我到目前为止所做的事情
class RULLZ: public list<Fraction>
{
private:
list<Fraction>::iterator head,tail,buf,buf1;
public :
Farey2()
{
this->push_front( Fraction(1,1));
this->push_front( Fraction(0,1));
}
void Add(int level)
{
Fraction *tmp,*tmp2;
buf=this->first();
for(int i=0;i<level-1;i++)
{
head=this->first();
tail=this->last();
while(head!=tail)
{
tmp=new Fraction(head->num,head->den);
head++;
if(tmp->den+head->den<=level)
{
tmp2=new Fraction(tmp->num+head->num,tmp->den+head->den);
this->insert(head,*tmp2);
head--;
}
}
this->pop_back();
}
}
friend ostream& operator<<(ostream& out, RULLZ& f)
{
for(list<Fraction>::iterator it=f.first();it !=f.last();it++)
out <<*it;
return out;
}
};
答案 0 :(得分:0)
class RULLZ: public list<Fraction>
在查看您的问题之前,上面的代码是个问题。 C ++标准容器故意不设计为基类(它们都没有虚拟析构函数),因此这会导致问题。由于您不应公开从标准容器派生的原因,请参阅以下内容:
您似乎希望Add
函数将下一个X
个分数添加到一起(如果我理解您的意图正确)。更好的方法是使用std::stack
:
std::stack<Fraction, std::list<Fraction>> expression;
// add fractions to your stack here
Fraction Add(unsigned int count)
{
// assume count is greater than 1 (as adding 0 fractions makes no sense, and adding 1 is trivial)
Fraction result(0, 1);
for (int i = 0; i < count; ++i)
{
Fraction a = expression.top();
expression.pop();
Fraction b = expression.top();
expression.pop();
result += a + b; // assume operators + and += have been implemented for Fraction
}
expression.push(result);
return result;
}
您似乎遇到的另一个问题是逻辑问题(假设我正确理解您的意图):
for(int i=0;i<level-1;i++)
如果level
是您要添加的分数数,并且您传入2
,则此循环将仅包含第一个分数。也就是说,它不会添加分数0和1,而只是抓住分数0并返回它。我认为你的意思是
for(int i=0; i < level; i++)
这将抓住两个分数0和1加起来。
我不确定在哪里,但是您生成该系列的逻辑似乎已关闭。可以找到一种更简单的方法here:
#include <algorithm>
#include <cstdint>
#include <iterator>
#include <iostream>
#include <vector>
struct Fraction
{
std::uint32_t Numerator;
std::uint32_t Denominator;
Fraction(std::uint32_t n, std::uint32_t d) : Numerator(n), Denominator(d) { }
};
std::ostream& operator<<(std::ostream& os, const Fraction& f)
{
os << "(" << f.Numerator << " / " << f.Denominator << ")";
return os;
}
typedef std::vector<Fraction> FareySeries;
FareySeries generate_series(std::uint32_t depth)
{
std::uint32_t a = 0;
std::uint32_t b = 1;
std::uint32_t c = 1;
std::uint32_t d = depth;
FareySeries results;
results.emplace_back(a, b);
while (c <= depth)
{
std::uint32_t k = (depth + b) / d;
std::uint32_t nc = (k * c) - a;
std::uint32_t nd = (k * d) - b;
a = c;
b = d;
c = nc;
d = nd;
results.emplace_back(a, b);
}
return results;
}
int main()
{
const std::uint32_t DEPTH = 4;
FareySeries series = generate_series(DEPTH);
std::copy(series.begin(), series.end(), std::ostream_iterator<Fraction>(std::cout, "\n"));
return 0;
}