voidOnTimer()
{
int total = list_new_bar.Total();
for(int i = 0; i < total; i++)
{
CNewBar* nb = list_new_bar.At(i);
if(nb == NULL)
continue;
if(nb.IsNewBar())
{// и дальше………
そして、ここでも追加に成功したかどうかのチェックが必要です。
for(int i = 0; i < ArraySize(Rates); i++)
{
CNewBar* nb = new CNewBar(Rates[i].m_Symbols, timefram);
if(nb != NULL)
{
list_new_bar.Add(nb);
Print(nb.IsNewBar(), " ***** ", Rates[i].m_Symbols, " ***** ", nb.Time());
}
}
返信ありがとうございます、あなたは全く邪悪ではありません)
これで全て納得です)
UPD
この構築も有効です。
At()メソッドが何を返すのかに注目してください。NULLを返した場合、クリティカルエラーで クラッシュします。オブジェクトへのポインタにアクセスする前に、それがNULLでないことを確認する。
すでに気づいている)
つまり、解決策はグローバルに空のオブジェクトを宣言すること...。
また、その人数が事前にわからない場合は?ただ、"with reserve" と宣言するだけでいいのですか? :)
追伸:このようなオブジェクトの宣言の仕方は、組み込みのヘルプにはありませんでした。
昔々、Artyomがこんな授業を書いてくれた。その仕組みを詳しく説明することはできませんが。でも、アルテムは覚えているだろうし、説明もできるだろう。以下は、クラスそのものです。
そして、OnInit()内でポインタを作成するループは以下の通りです。
で、OnTimer()で
ArraySize(Rates)は、処理する文字が列挙された構造体の配列の大きさ である。
アルチョムは以前、私にこんな授業を書いてくれた。その仕組みを詳しく説明することはできません。でも、アルチョムは覚えているだろうし、説明もできるだろう。さて、クラスそのものは以下の通りです。
そして、OnInit()内でポインタを作成するループは以下の通りです。
で、OnTimer()で
ArraySize(Rates)は、処理する文字が列挙された構造体の配列の大きさ である。
これです。
Rates 配列から文字を読み込んで、新しい bar クラスのインスタンスを作成し、リストに追加しているという理由からです。
追加に失敗した場合、新しいバークラスのインスタンスへのポインタのリストのサイズは、Rates配列のサイズと一致しません。
一般的には、このようなものであることが必要です。
そして、ここでも追加に成功したかどうかのチェックが必要です。
というようなものです。
新しいオブジェクトへのポインタが誤ってリストに追加された場合のメモリリークを回避するためこれです。
Ratesの配列から文字を読み込んで、新しいbarクラスのインスタンスを作成し、リストに追加するためです。
追加に失敗した場合、新しいバークラスのインスタンスへのポインタのリストのサイズは、Rates配列のサイズと一致しません。
一般的には、このようなものであることが必要です。
そして、ここでも追加に成功したかどうかのチェックが必要です。
というようなものです。
新しいオブジェクトへのポインタが誤ってリストに追加された場合のメモリリークを回避するためありがとうございます。了解です、こちらに訂正 させていただきます:)))
私はcontinue;オペレータが 嫌いで、使わないようにしています。絶望的なケースに限る。
とはどう違うのか
もうひとつは、エラー時に失敗したポインタが削除される場合です...しかし、ここでも、嫌われた継続をせずに、単にPrint()を削除すればよいのです。デバッグ中、何が起こっているのか理解するために必要なもので、作業中に何かエラーが起こっても、何が悪いのかどうせ理解できない...ログを理解するよりOSを再インストールする方が簡単だ。せっかくなので、ポインタとクラス変数の違い、どちらが望ましいか、細かいことは抜きにして教えてください。インターネットでは、わかりにくい内容でも読むことができますね。いわば、表面的な理解で十分なのです...。
At()メソッドが何を返すのかに注目してください。NULLを返した場合、クリティカルエラーで クラッシュします。オブジェクトへのポインタにアクセスする前に、それがNULLでないことを確認する。
Artemさん、貴重なコメントありがとうございます)
ありがとうございます。なるほど、こういう風に修正 するのか... :)))
私はcontinue演算 子が嫌いで、なるべく使わないようにしています。絶望的なケースに限る。
との違いについて
ループの反復は終了せず、新しいループが始まるわけでもなく、次の反復に移ります。論理が変わる。
アルチョムは以前、私にこんな授業を書いてくれた。その仕組みを詳しく説明することはできません。でも、アルチョムは覚えているだろうし、説明もできるだろう。とにかく、このクラスそのものを紹介します。
Alexeyさん、こんなに詳しいお返事をありがとうございます。
引用したコード片の変数retの目的が不明です...。
どのような場合にarray[0]を返すのか、何のために計算するのか?
P.S.
そして、なぜこれをクラスメソッドで 使用するのか?私たちは、この特別なクラスのメンバーと一緒に...
ありがとうございます。なるほど、こういう風に修正 するのか... :)))
私はcontinue演算 子が嫌いで、なるべく使わないようにしています。絶望的なケースに限る。
とはどう違うのか
もうひとつは、エラーが発生したときに、失敗したポインタを削除してしまう場合です...しかし、ここでも、嫌われるcontinueをせずに、Print()を削除すればいいのです。デバッグ中、何が起こっているのか理解するために必要なもので、作業中に何かエラーが起こっても、どうせ何が悪いのか理解できない...ログを理解するくらいなら、OSを再インストールした方がいい。。
せっかくなので、ポインタとクラス変数の違い、どちらが望ましいか、細かいことは抜きにして教えてください。インターネットでは、わかりにくい内容でも読むことができますね。表面的な理解で十分なのです、いわば。
その繰り返しは終わることなく、新たなサイクルが始まるわけでもなく、次のIfへと進んでいくのです。論理が変わる。
Alexeyさん、こんなに詳しく答えてくれてありがとうございます。
このコードでは、ret変数の用途がよくわかりません。
メソッドがとにかくarray[0]を返す場合、なぜ計算されるのですか?