タグ付けされた質問 「c++」

C ++は汎用プログラミング言語です。もともとCの拡張として設計され、構文は似ていますが、現在は完全に異なる言語になっています。このタグは、C ++コンパイラでコンパイルされる(される)コードに関する質問に使用します。特定の標準リビジョン[C ++ 11]、[C ++ 14]、[C ++ 17]または[C ++ 20]などに関連する質問には、バージョン固有のタグを使用します。

12
可変長配列がC ++標準に含まれていないのはなぜですか?
ここ数年はCをあまり使っていません。今日この質問を読んだとき、私は知らないC構文に出くわしました。 どうやらC99では次の構文が有効です。 void foo(int n) { int values[n]; //Declare a variable length array } これはかなり便利な機能のようです。これをC ++標準に追加することについての議論はありましたか?その場合、なぜそれが省略されたのですか? いくつかの潜在的な理由: コンパイラベンダーが実装するのは難しい 標準の他の一部と互換性がない 機能は他のC ++構造でエミュレートできます C ++標準では、配列サイズは定数式である必要があると規定されています(8.3.4.1)。 はい、もちろん私はおもちゃの例ではを使用できることを理解してstd::vector<int> values(m);いますが、これはスタックではなくヒープからメモリを割り当てます。そして、私が次のような多次元配列が必要な場合: void foo(int x, int y, int z) { int values[x][y][z]; // Declare a variable length array } vectorバージョンはかなり不器用次のようになります。 void foo(int x, int y, int z) …

15
2D配列をC ++関数に渡す
可変サイズの2D配列をパラメーターとして取りたい関数があります。 これまでのところ私はこれを持っています: void myFunction(double** myArray){ myArray[x][y] = 5; etc... } そして、私は私のコードの他の場所で配列を宣言しました: double anArray[10][10]; ただし、電話myFunction(anArray)をかけるとエラーが発生します。 渡すときに配列をコピーしたくありません。変更を加えるとmyFunction、の状態が変わるはずですanArray。私が正しく理解していれば、2D配列へのポインタを引数として渡したいだけです。関数は、異なるサイズの配列も受け入れる必要があります。たとえば、[10][10]そして[5][5]。これどうやってするの?

30
ループや条件なしで1から1000を印刷する
ロックされています。質問はトピックから外れていますが、歴史的に重要であるため、この質問とその回答はロックされています。現在、新しい回答や相互作用を受け入れていません。 タスク:ループや条件ステートメントを使用せずに、1から1000までの数値を出力します。printf()or coutステートメントを1000回だけ書くのではありません。 CまたはC ++を使用してそれをどのように行いますか?
323 c++  c  printf 

4
Intel SandybridgeファミリCPUのパイプライン用のプログラムの最適化解除
私はこの割り当てを完了するために一週間頭を悩ませてきました、そして私はここの誰かが正しい道に向かって私を導くことを望んでいます。インストラクターの指示から始めましょう: あなたの割り当ては、素数プログラムを最適化することでした最初のラボの割り当ての逆です。この割り当ての目的は、プログラムを悲観的にすること、つまりプログラムの実行を遅くすることです。これらは両方ともCPUを集中的に使用するプログラムです。ラボPCでの実行には数秒かかります。アルゴリズムを変更することはできません。 プログラムを最適化解除するには、Intel i7パイプラインの動作方法に関する知識を活用してください。WAR、RAW、およびその他の危険性を導入するために命令パスを並べ替える方法を想像してみてください。キャッシュの効果を最小限に抑える方法を考えてください。悪魔のような能力がない。 この割り当てでは、砥石またはモンテカルロのプログラムを選択できました。キャッシュ効果のコメントは、ほとんどがWhetstoneにのみ適用されますが、私はモンテカルロシミュレーションプログラムを選択しました。 // Un-modified baseline for pessimization, as given in the assignment #include <algorithm> // Needed for the "max" function #include <cmath> #include <iostream> // A simple implementation of the Box-Muller algorithm, used to generate // gaussian random numbers - necessary for the Monte Carlo method below …

23
単一行のifまたはループに中括弧(つまり{})を使用する目的は何ですか?
私は私のC ++講師の講義ノートをいくつか読んでいます、そして彼は以下を書きました: インデントを使用// OK 演算子の優先順位に依存しない-常に括弧を使用する// OK 常に{}ブロックを使用します-1 行の場合でも// OKではありません。なぜですか??? 比較の左側にあるConstオブジェクト// OK > = 0の変数には符号なしを使用します//素敵なトリック 削除後にポインターをNULLに設定-二重削除保護//悪くない 3番目の手法は私にははっきりしていません。1つの行を{ ... }? たとえば、次の奇妙なコードを見てください。 int j = 0; for (int i = 0 ; i < 100 ; ++i) { if (i % 2 == 0) { j++; } } そしてそれを次のものに置き換えます: int j = 0; …

8
C ++ 11逆範囲ベースのforループ
イテレーターの方向を逆にするコンテナーアダプターがあるので、範囲ベースのforループでコンテナーを逆方向に反復できますか? 明示的なイテレータでこれを変換します: for (auto i = c.begin(); i != c.end(); ++i) { ... これに: for (auto i = c.rbegin(); i != c.rend(); ++i) { ... これを変換したい: for (auto& i: c) { ... これに: for (auto& i: std::magic_reverse_adapter(c)) { ... そのようなことはありますか、それとも自分で書く必要がありますか?
321 c++  c++11  ranged-loops 

4
C ++とCを組み合わせる-#ifdef __cplusplusはどのように機能しますか?
私は、多くのレガシーCコードを含むプロジェクトに取り組んでいます。最終的にレガシーコードを変換することも目的として、C ++での記述を開始しました。CとC ++の相互作用について少し混乱しています。C ++コンパイラでCコードをラップしてもextern "C"、Cコードの名前が壊れないことは理解していますが、これを実装する方法は完全にはわかりません。 したがって、各Cヘッダーファイルの先頭(インクルードガードの後)には、 #ifdef __cplusplus extern "C" { #endif 下部には、 #ifdef __cplusplus } #endif 2つの間に、すべてのinclude、typedef、および関数プロトタイプがあります。これを正しく理解しているかどうかを確認するために、いくつか質問があります。 CヘッダーファイルBhを含み、別のCヘッダーファイルCh を含むC ++ファイルA.hhがある場合、これはどのように機能しますか?コンパイラーがBhにステップイン__cplusplusすると、コードがラップされるextern "C" (__cplusplusこのブロック内で定義されない)と定義されていると思います 。したがって、Chにステップ __cplusplusインすると、は定義されず、コードはでラップされません extern "C"。これは正しいです? コードの一部をラップすることに問題はあり extern "C" { extern "C" { .. } }ますか?2番目extern "C" は何をしますか? このラッパーは.cファイルではなく、.hファイルのみに配置します。では、関数にプロトタイプがない場合はどうなりますか?コンパイラーはそれをC ++関数であると考えていますか? また、Cで記述されたサードパーティのコードも使用しており、この種のラッパーはありません。そのライブラリのヘッダーを含めるときはいつでもextern "C"、#includeを配置しています。これはそれに対処する正しい方法ですか? 最後に、これは良いアイデアですか?他にすべきことはありますか?近い将来、CとC ++を混合する予定です。すべてのベースをカバーできるようにしたいと思います。

30
C ++プログラムをクラッシュさせる最も簡単な方法は何ですか?
別のクラッシュしたプロセスとインターフェースするPythonプログラムを作成しようとしています(手に負えない)。残念ながら、私が接続しているプログラムは確実にクラッシュすることすらありません!だから私は意図的にクラッシュする簡単なC ++プログラムを作りたいのですが、実際にはそれを行うための最善かつ最短の方法がわかりません。 int main() { crashyCodeGoesHere(); } C ++プログラムを確実にクラッシュさせる
318 c++  crash 

13
(本当に)例外安全なコードを書いていますか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。私たちは回答が事実、参考文献、または専門知識によってサポートされることを期待しますが、この質問はおそらく議論、議論、投票、または拡張された議論を誘います。この質問を改善でき、再開できると思われる場合は、ヘルプセンターにアクセスしてください。 7年前休業。 例外処理(EH)は現在の標準のようで、Webを検索しても、それを改善または置換しようとする新しいアイデアや方法は見つかりません(まあ、いくつかのバリエーションは存在しますが、新しいものはありません)。 ほとんどの人はそれを無視するか受け入れるだけのようですが、EHにはいくつかの大きな欠点があります。例外はコードからは見えず、非常に多くの可能な出口点を作成します。ソフトウェアのジョエルはそれについての記事を書いた。goto完璧に合うと比較すると、EHについてもう一度考えさせられました。 私はEHを避けて、戻り値、コールバック、または目的に合ったものを使用します。しかし、信頼性の高いコードを記述する必要がある場合、EHを無視することはできません。これは、new(昔のように)単に0を返すのではなく、例外をスローするで始まります。これにより、C ++コードのすべての行が例外に対して脆弱になります。そして、C ++基本コードのより多くの場所が例外をスローします... std libはそれを行います、など。 これは不安定な場所を歩いているような気がします。だから、今、私たちは例外に注意することを余儀なくされています! しかし、それは難しい、本当に難しい。あなたは例外安全なコードを書くことを学ぶ必要があり、それである程度の経験があっても、安全であるためにはコードの1行を再確認する必要があります!または、try / catchブロックをいたるところに配置し始め、コードが読みにくくなるまでコードが乱雑になります。 EHは、ごく少数の、しかし理解しやすく、簡単に解決できる欠点があった古いクリーンな確定的アプローチ(戻り値..)を、コードに多くの可能な出口点を作成するアプローチに置き換え、例外をキャッチするコード(ある時点で実行することを余儀なくされます)、その後、コードを介して多数のパスを作成します(catchブロックのコード、std :: cerr以外のロギング機能が必要なサーバープログラムについて考えてください。)。EHには利点がありますが、それが目的ではありません。 私の実際の質問: あなたは本当に例外安全なコードを書いていますか? あなたの最後の「プロダクションレディ」コードは例外的に安全ですか? あなたはそれがそうであると確信することさえできますか? 機能する代替案を知っているか、実際に使用していますか?


14
#pragmaは安全なインクルードガードですか?
使用時にコンパイラの最適化があることを読みました #pragma onceが行われ、コンパイルが高速を確認しました。これは非標準であり、クロスプラットフォームの互換性の問題を引き起こす可能性があることを認識しています。 これは、非Windowsプラットフォーム(gcc)上の最新のコンパイラーでサポートされているものですか? プラットフォームのコンパイルの問題を避けたいだけでなく、フォールバックガードの余分な作業も避けたいです。 #pragma once #ifndef HEADER_H #define HEADER_H ... #endif // HEADER_H 心配する必要がありますか?これにさらに精神的なエネルギーを費やす必要がありますか?

11
ベクトルを降順に並べ替える
使うべきか std::sort(numbers.begin(), numbers.end(), std::greater<int>()); または std::sort(numbers.rbegin(), numbers.rend()); // note: reverse iterators ベクトルを降順に並べ替えるには?どちらのアプローチにもメリットやデメリットはありますか?
310 c++  sorting  stl  vector  iterator 

8
STLスタイルのイテレーターを実装し、一般的な落とし穴を回避する方法は?
STLスタイルのランダムアクセスイテレータを提供するコレクションを作成しました。イテレータの実装例を探していましたが、見つかりませんでした。[]and *演算子のconstオーバーロードの必要性について知っています。イテレータが「STLスタイル」であるための要件は何ですか?また、(もしあれば)回避すべきその他の落とし穴は何ですか? 追加のコンテキスト:これはライブラリ用であり、本当に必要でない限り、ライブラリへの依存関係を導入したくありません。同じコンパイラでC ++ 03とC ++ 11のバイナリ互換性を提供できるように、独自のコレクションを作成します(したがって、おそらく壊れるSTLはありません)。

7
安全で効率的な方法でファイルをコピーする
ファイル(バイナリまたはテキスト)をコピーするための適切な方法を検索します。私はいくつかのサンプルを書きましたが、誰もが機能します。でもベテランプログラマの意見を聞きたいです。 良い例がないので、C ++で動作する方法を検索します。 ANSI-C-WAY #include <iostream> #include <cstdio> // fopen, fclose, fread, fwrite, BUFSIZ #include <ctime> using namespace std; int main() { clock_t start, end; start = clock(); // BUFSIZE default is 8192 bytes // BUFSIZE of 1 means one chareter at time // good values should fit to blocksize, …
305 c++  file-io 


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.