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

Cは、システムプログラミング(OSおよび組み込み)、ライブラリ、ゲーム、クロスプラットフォームに使用される汎用プログラミング言語です。このタグは、ISO 9899標準で定義されているC言語に関する一般的な質問で使用する必要があります(特に指定のない限り、最新バージョン9899:2018。バージョン固有のリクエストには、c89、c99、c11などのタグも付けます)。CはC ++とは異なり、合理的な理由がない限り、C ++タグと組み合わせるべきではありません。

9
自己参照構造体定義?
私は長い間Cを書いていないので、このような種類の再帰的な処理をどのように行えばよいのかわかりません...各セルに別のセルを含めたいのですが、エラーが発生します「フィールド「子」の型が不完全です」の行。調子はどう? typedef struct Cell { int isParent; Cell child; } Cell;
134 c  recursion  struct  typedef 

3
関数から構造体を返すときのGCCバグの可能性
O'NeillのPCG PRNGの実装中にGCCのバグを見つけたと思います。(Godboltのコンパイラエクスプローラの初期コード) 、(rdiに格納された結果)を乗算oldstateした後MULTIPLIER、GCCはその結果をINCREMENTに追加せず、INCREMENT代わりにrdxに移動し、rand32_ret.state の戻り値として使用されます。 最小限の再現可能な例(コンパイラエクスプローラ): #include <stdint.h> struct retstruct { uint32_t a; uint64_t b; }; struct retstruct fn(uint64_t input) { struct retstruct ret; ret.a = 0; ret.b = input * 11111111111 + 111111111111; return ret; } 生成されたアセンブリ(GCC 9.2、x86_64、-O3): fn: movabs rdx, 11111111111 # multiplier constant (doesn't fit in imm32) xor …
133 c  gcc  assembly  x86-64  compiler-bug 

7
「sizeof(a?true:false)」が4バイトの出力を提供するのはなぜですか?
sizeof三項演算子を使用した演算子に関する小さなコードがあります。 #include <stdio.h> #include <stdbool.h> int main() { bool a = true; printf("%zu\n", sizeof(bool)); // Ok printf("%zu\n", sizeof(a)); // Ok printf("%zu\n", sizeof(a ? true : false)); // Why 4? return 0; } 出力(GCC): 1 1 4 // Why 4? しかし、ここで、 printf("%zu\n", sizeof(a ? true : false)); // Why 4? 三項演算子はbooleanタイプを返し、sizeof …

18
いつユニオンを使うのですか?Cのみの時代の名残ですか?
私は学びましたが、実際には組合を取得しません。私が通過するすべてのCまたはC ++テキストはそれらを紹介します(時々)が、それらを使用する理由または場所の実用的な例はほとんどありません。現代の(またはレガシーの)場合に組合はいつ役立つでしょうか?使用するスペースが非常に限られている場合、またはAPI(または同様の何か)を開発していて、エンドユーザーに複数のオブジェクト/タイプのインスタンスを1つだけに強制したい場合、私の2つの推測はマイクロプロセッサのプログラミングです。一度。これらの2つの推測は右に近いですか?
133 c++  c  unions 

3
uint64_tを印刷するには?失敗:「形式内の誤った末尾の '%'」
printf uint64_tの非常にシンプルなテストコードを作成しました。 #include <inttypes.h> #include <stdio.h> int main() { uint64_t ui64 = 90; printf("test uint64_t : %" PRIu64 "\n", ui64); return 0; } ubuntu 11.10(64ビット)とgccバージョン4.6.1を使用してコンパイルしましたが、失敗しました。 main.cpp: In function ‘int main()’: main.cpp:9:30: error: expected ‘)’ before ‘PRIu64’ main.cpp:9:47: warning: spurious trailing ‘%’ in format [-Wformat]
133 c++  c 

16
Windowsスレッディング:_beginthreadと_beginthreadexとCreateThread C ++
スレッドを開始するためのより良い方法は何ですか_beginthread、_beginthreadxまたはCreateThread? 私はの長所/短所が何であるかを判断しようとしている_beginthread、_beginthreadexとCreateThread。これらのすべての関数は、新しく作成されたスレッドにスレッドハンドルを返します。エラーが発生すると、CreateThreadが少し追加の情報を提供することをすでに知っています(を呼び出すことで確認できますGetLastError)... mこれらの関数を使用していますか? 私はWindowsアプリケーションを使用しているので、クロスプラットフォームの互換性はすでに問題外です。 私はmsdnのドキュメントを読みましたが、たとえば、なぜCreateThreadではなく_beginthreadを使用するのか、またはその逆を行うのかを理解できません。 乾杯! 更新:わかりました。すべての情報に感謝します。WaitForSingleObject()を使用_beginthread()した場合は呼び出すことができない場所もいくつか読んだことがあります_endthread()が、スレッドで呼び出す場合は機能しませんか?そこでの契約は何ですか?
133 c++  c  multithreading  winapi 

7
コンパイラが予測可能な加算ループを乗算に最適化できない(またはできない)のはなぜですか?
これは、質問に対するMysticialの素晴らしい答えを読んでいるときに思い浮かんだ質問です。なぜ、ソートされていない配列よりもソートされた配列を処理する方が速いのですか? 関連するタイプのコンテキスト: const unsigned arraySize = 32768; int data[arraySize]; long long sum = 0; 彼の答えで彼はIntel Compiler(ICC)がこれを最適化すると説明しています: for (int i = 0; i < 100000; ++i) for (int c = 0; c < arraySize; ++c) if (data[c] >= 128) sum += data[c]; ...これと同等のものに: for (int c = 0; c < arraySize; …

6
Cからミリ秒までの代替スリープ関数はありますか?
Windowsでコンパイルされたいくつかのソースコードがあります。Red Hat Linuxで実行できるように変換しています。 ソースコードには<windows.h>ヘッダーファイルが含まれており、プログラマーはSleep()関数を、ミリ秒の時間待機しました。これはLinuxでは機能しません。 ただし、sleep(seconds)関数は使用できますが、秒単位の整数を使用します。ミリ秒を秒に変換したくありません。Linuxでのgccコンパイルで使用できる代替スリープ機能はありますか?
133 c  linux  sleep 

3
OS XでのLLVMとclang
OS Xのllvm、clang、gccについて質問があります。 llvm-gcc 4.2、llvm 2.0、clangの違いは何ですか?私はそれらすべてがllvmに基づいていることを知っていますが、それらはどのように違うのですか? 高速なコンパイルに加えて、gccに対するllvmの利点は何ですか?
133 c++  c  gcc  llvm  clang 



25
なぜ誰かがC ++ではなくCを使用するのですか?[閉まっている]
現在のところ、この質問は、Q&A形式には適していません。事実、参考文献、専門知識によって回答が裏付けられることを期待していますが、この質問は、討論、議論、投票、または拡張ディスカッションを求める可能性があります。この質問が改善され、場合によっては再開できると思われる場合は、ヘルプセンターにアクセスしてください。 8年前に閉鎖。 人々はC ++について文句を言うのが好きなようですが、なぜC ++ではなくCを選択するのかについて、多くの証拠を見つけることができませんでした。Cはほぼ同じように不安定にならず、C ++にこれらすべての問題がある場合、なぜCサブセットに制限できないのでしょうか。あなたの考え/経験は何ですか?
132 c++  c 

10
Cで辞書を実装する簡単な方法
Cでプログラムを書いているときに私が見落としているものの1つは、辞書データ構造です。Cで実装する最も便利な方法は何ですか?私はパフォーマンスを求めていませんが、ゼロからコーディングするのは簡単です。汎用的なものにもしたくありません-string-> intのようなもので十分です。ただし、任意の数のアイテムを格納できるようにしたいのですが。 これは演習として意図されています。使用できるサードパーティのライブラリがあることは知っています。しかし、少しの間、それらが存在しないことを考慮してください。このような状況で、上記の要件を満たす辞書を実装する最も速い方法は何ですか。

13
最適化されない無限の空のループを作成するにはどうすればよいですか?
C11標準は、定数制御式を含む反復ステートメントを最適化してはならないことを示唆しているようです。私はこの回答から私のアドバイスを取り入れています。これは、ドラフト標準のセクション6.8.5を具体的に引用しています。 制御式が定数式ではない反復文...は、実装によって終了するものと想定されます。 その答えでは、ループのようなループwhile(1) ;は最適化の対象とすべきではないと述べています。 では、なぜClang / LLVMは(でコンパイルされたcc -O2 -std=c11 test.c -o test)以下のループを最適化するのですか? #include <stdio.h> static void die() { while(1) ; } int main() { printf("begin\n"); die(); printf("unreachable\n"); } 私のマシンでは、これはを出力しbegin、次に不正な命令(のud2後にトラップが配置されたdie())でクラッシュします。godboltでは、の呼び出し後に何も生成されないことがわかりputsます。 Clangに無限ループを出力させるのは意外と難しい作業でし-O2たが、volatile変数を繰り返しテストすることはできましたが、これには不要なメモリ読み取りが含まれています。そして、私がこのようなことをした場合: #include <stdio.h> static void die() { while(1) ; } int main() { printf("begin\n"); volatile int x = 1; if(x) die(); …

19
カウントアップよりカウントダウンの方が速いですか?
私たちのコンピューターサイエンスの教師はかつて、何らかの理由で、カウントアップよりカウントダウンの方が効率的であると言っていました。たとえば、FORループを使用する必要があり、ループインデックスがどこかで使用されていない場合(N *の行を画面に出力するなど)、次のようなコードを意味します。 for (i = N; i >= 0; i--) putchar('*'); よりも良い: for (i = 0; i < N; i++) putchar('*'); 本当ですか?もしそうなら、なぜ誰かが知っていますか?
131 c  performance  loops 

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