C++ 发现资源不足
我有一个包含以下类型变量的结构向量:C++ 发现资源不足,c++,C++,我有一个包含以下类型变量的结构向量: Date Time Low 11/1/17 929 74.25 11/1/17 930 73 11/1/17 931 75 11/1/17 932 70 等等 现在我想在向量中添加另一个结构,称为“LowRun”,其中LowRun是迭代中每个点的最小low,如下所示: Date Time Low LowRun 11/1/17 929 74.25 74.25 11/1/1
Date Time Low
11/1/17 929 74.25
11/1/17 930 73
11/1/17 931 75
11/1/17 932 70
等等
现在我想在向量中添加另一个结构,称为“LowRun”,其中LowRun是迭代中每个点的最小low,如下所示:
Date Time Low LowRun
11/1/17 929 74.25 74.25
11/1/17 930 73 73
11/1/17 931 75 73
11/1/17 932 70 70
这是我到目前为止尝试过的,但没有给出正确的输出:
edited:
int CalcLow_SoFar(std::vector<PriceInfo>& p)
double running_low = p[0].Low;
for (size_t i = 1; i < p.size(); ++i)
{
if (p[i].Time > 929
&& p[i].Time < 1601
&& p[i].Date == p[i - 1].Date)
{
if (p[i].Low < running_low)
{
running_low = p[i].Low;
p[i].LowRun = running_low;
}
}
}
return 0;
}
编辑:
内部CalcLow_SoFar(标准::矢量和p)
双运行_low=p[0]。低;
对于(大小i=1;i929
&&p[i].时间<1601
&&p[i].Date==p[i-1].Date)
{
if(p[i].低<低运行)
{
运行_low=p[i]。低;
p[i].低运行=低运行;
}
}
}
返回0;
}
你能帮我解开吗,谢谢 您的代码中有几个奇怪的逻辑问题,所以我将在这里列出它们
- 这个if语句毫无意义:
。只要当前值小于上一个值,就将if(p[i].Low
分配给当前值。但是,该值完全有可能在不低于运行下限的情况下降低。例如,如果您有序列running_low
,则索引2处的1,3,2
值将被分配给2,因为2小于3,即使运行下限应为1LowRun
- 如果您出于某种原因没有将1添加到
,那么在我所讨论的语句之后的if语句(I
)会很好。从1到if(p[I+1].Low
-1,您现在从2到p.size()
,因此您可以访问向量末尾的一个元素,这是未定义的行为p.size()
- 只有当
值更改时,您才分配了低运行
值。这意味着,如果某个值没有更改运行下限,则它的低运行
值未初始化,这就是垃圾值的来源LowRun
- 您没有初始化
到第一个元素运行\u low
- 我不知道你在做什么的细节,但是检查时间和日期的条件看起来可疑,所以我现在已经删除了它。如果是当天的第一个条目,它基本上会忽略它。如果这是您想要做的,那么不要将
初始化为第一个元素的值,而是将其初始化为类似running\u low
的值,这样可以保证在第一个有效条目上更新它,并将循环更改为从0开始std::numeric\u limits::max()
main()
不同,您定义的其他函数不必返回int或任何值。如果不需要函数返回任何内容,请使用void
最后,你应该养成使用良好格式的习惯,包括适当的缩进,这样你就不会混淆自己
固定代码:
void CalcLow_SoFar(std::vector<PriceInfo>& p)
{
double running_low = p[0].Low;
p[0].LowRun = p[0].Low;
for (size_t i = 1; i < p.size(); ++i)
{
if (p[i].Low < running_low)
{
running_low = p[i].Low;
}
p[i].LowRun = running_low;
}
}
与此答案中的第二个版本类似,
LowRun
值可能是std::numeric\u limits::max()
,如果在该天的时间限制内还没有遇到值。您是否尝试过初始化变量,double running\u low=p[0]。low代码>?如果打开编译器的警告,编译器可能会对此发出警告。堆栈溢出不是免费的调试服务,您应该显示您尝试使用调试器或其他更简单的方法(如调试打印语句)调试代码的情况。您还可以分别测试代码的每一部分,以准确地找出导致问题的代码的哪一部分,并做出正确的判断。这并不是你唯一一次在代码中遇到bug,学习调试程序比让别人帮你找到bug更有帮助。谢谢你,埃尔杰。我试过了,但没什么不同。我假设正确的方法是在for循环之外初始化它?您可能想试试。你有很多奇怪的逻辑问题。嗨,菲,我已经和鸭子谈了几天了。但我显然没有你那么有才华……谢谢你,费,注意到你的解释,我非常感激。输出结果更接近我需要的结果,但不完全如此:重新检查可疑的时间和日期,我正试图用它来限制会话的查找,将其限制在每天。因此,在迭代的任何时候,只有在930到1600的时间范围内,并且在该日期的范围内,才能找到正在运行的低点。输入文件包含一年的数据,因此大约有250天,每天从午夜到1800点。这样做有意义吗?@Eksanastatis所以你只希望运行低点包含同一天的值?这样做,我们就可以在遇到新的一天时,简单地重置正在运行的\u low
。我还是不知道你说的关于时间的部分是什么意思。是否要忽略不在特定时间段内的条目?另外,还有=
和是来回答您上面的第一个问题。是的,是的,我想忽略930到1600窗口之外的所有内容。非常感谢Fei,虽然第二个到最后一个解决方案不起作用,但最后一个解决方案(包含930和1600)起作用了!我将研究你的代码,以确保我理解它。
void CalcLow_SoFar(std::vector<PriceInfo>& p)
{
double running_low = std::numeric_limits<double>::max();
for (size_t i = 0; i < p.size(); ++i)
{
if (p[i].Time > 929
&& p[i].Time < 1601
&& i != 0
&& p[i].Date == p[i - 1].Date
&& p[i].Low < running_low)
{
running_low = p[i].Low;
}
p[i].LowRun = running_low;
}
}
void CalcLow_SoFar(std::vector<PriceInfo>& p)
{
double running_low;
for (size_t i = 0; i < p.size(); ++i)
{
if (i == 0 || p[i].Date != p[i - 1].Date)
{
running_low = std::numeric_limits<double>::max();
}
if (p[i].Time >= 930
&& p[i].Time <= 1600
&& p[i].Low < running_low)
{
running_low = p[i].Low;
}
p[i].LowRun = running_low;
}
}