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

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

22
設定されている最下位ビットの位置
整数に設定されている最下位ビットの位置を決定する効率的な方法を探しています。たとえば、0x0FF0の場合は4になります。 簡単な実装は次のとおりです。 unsigned GetLowestBitPos(unsigned value) { assert(value != 0); // handled separately unsigned pos = 0; while (!(value & 1)) { value >>= 1; ++pos; } return pos; } それからいくつかのサイクルを絞る方法はありますか? (注:この質問は、そのようなことを楽しむ人のためのものであり、xyzoptimizationは悪だと言われるためのものではありません。) [編集] アイデアをありがとう!他にもいくつかのことを学びました。涼しい!


27
Cで整数の最上位セットビット(msb)を見つけるための最速/最も効率的な方法は何ですか?
整数nがあり、最上位ビットの位置を知りたい場合(つまり、最下位ビットが右側にある場合、1である左端のビットの位置を知りたい)、見つけるための最も速く/最も効率的な方法は何ですか? 私はPOSIX ffs()が最初のセットビットを見つけるためにstrings.hのメソッドをサポートしていることを知っていますが、対応するものがないようですfls()メソッド。 これを行うための本当に明らかな方法はありますか? 移植性のためにPOSIX関数を使用できない場合はどうですか? 編集:32ビットと64ビットの両方のアーキテクチャで機能するソリューションについてはどうですか(多くのコードリストは32ビットの整数でしか機能しないように見えます)。


2
Linuxでの複数のスレッドによる信号処理
Linuxでは、プログラム(複数のスレッドがある可能性がある)がSIGTERMやSIGHUPなどのシグナルを受信するとどうなりますか? どのスレッドがシグナルをインターセプトしますか?複数のスレッドが同じシグナルを取得できますか?シグナルの処理専用の特別なスレッドはありますか?そうでない場合、シグナルを処理するスレッド内で何が起こりますか?シグナルハンドラルーチンが終了した後、実行はどのように再開されますか?
119 c  linux  multithreading  signals  ipc 

5
FFmpeg C APIドキュメント/チュートリアル[終了]
閉まっている。この質問はスタックオーバーフローのガイドラインを満たしていません。現在、回答を受け付けていません。 この質問を改善してみませんか?Stack Overflowのトピックとなるように質問を更新します。 12か月前に閉鎖。 この質問を改善する FFmpeg C APIを使用するためのドキュメントを見つけようとしています。コマンドラインのドキュメントしか利用できないようです。 優れたドキュメント/チュートリアル/リンクはありますか?
119 c  api  documentation  ffmpeg 

13
Cの関数内の静的変数
何が印刷されますか?6 6または6 7?なぜ? void foo() { static int x = 5; x++; printf("%d", x); } int main() { foo(); foo(); return 0; }
119 c  static 

10
2次元配列へのポインターを作成する
静的な2次元配列へのポインターが必要です。これはどのように行われますか? static uint8_t l_matrix[10][20]; void test(){ uint8_t **matrix_ptr = l_matrix; //wrong idea } 次のようなさまざまなエラーが発生します。 警告:互換性のないポインタ型からの割り当て 下付きの値は配列でもポインタでもありません エラー:フレキシブル配列メンバーの無効な使用
119 c  arrays  pointers 

9
Cポインター:固定サイズの配列を指す
この質問は、そこにいるCの教祖に向けられます。 Cでは、次のようにポインターを宣言することができます。 char (* p)[10]; ..これは基本的に、このポインターが10文字の配列を指すことを示しています。このようにポインターを宣言することの優れた点は、異なるサイズの配列のポインターをpに割り当てようとすると、コンパイル時エラーが発生することです。単純なcharポインタの値をpに割り当てようとすると、コンパイル時エラーも発生します。これをgccで試しましたが、ANSI、C89、およびC99で動作するようです。 このようにポインタを宣言することは、特にポインタを関数に渡す場合に非常に便利です。通常、このような関数のプロトタイプは次のように記述します。 void foo(char * p, int plen); 特定のサイズのバッファが必要な場合は、単純にplenの値をテストします。ただし、pを渡した人が実際にそのバッファ内の有効なメモリ位置をplenに与えることは保証できません。この関数を呼び出した人が正しいことをしていることを信頼する必要があります。一方: void foo(char (*p)[10]); ..呼び出し側に指定されたサイズのバッファを強制的に与えます。 これは非常に便利なようですが、これまでに出くわしたコードでこのように宣言されたポインターを見たことはありません。 私の質問は次のとおりです。人々がこのようなポインタを宣言しない理由はありますか?明らかな落とし穴は見られませんか?
119 c  pointers  size 

6
Cでstderrに出力するにはどうすればよいですか?
Cでは、printffromを使用して、標準出力への印刷は簡単stdio.hです。 しかし、どのようにstderrに出力できますか?fprintf明らかにそれを達成するために使用できますが、その構文は奇妙に見えます。多分私達はprintfstderrへの印刷に使用できますか?
119 c  printf  stderr 

1
CMAKEで-fPICコンパイラオプションを追加する慣用的な方法は何ですか?
私はこれを行うために少なくとも3つの方法に出くわしており、どちらが慣用的な方法であるか疑問に思っています。これは、静的ライブラリに対してほぼ普遍的に行う必要があります。CMakeのMakefileジェネレーターがこれを静的ライブラリーに自動的に追加しないことに驚いています。(私が何かを逃していない限り?) target_compile_options(myLib PRIVATE -fPIC) add_compile_options(-fPIC) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpic") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic") 他にもバリエーションがあると思います。(もし見つけたら私の質問を編集してください) この質問への答えを知っている場合、CMakeLists.txtファイルを変更せずに、サードパーティのCMakeプロジェクトをこのフラグでコンパイルする方法があるかどうかもわかりますか?そのフラグがない静的ライブラリに出くわしました。静的ライブラリを動的ライブラリにコンパイルするときに問題が発生します。 あなたが得る: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
119 c++  c  cmake 

6
stdinがターミナルかパイプかを検出しますか?
python引数なしでターミナルから" " を実行すると、Pythonインタラクティブシェルが表示されます。 cat | python端末から" " を実行すると、インタラクティブモードが起動しません。どういうわけか、何も入力せずに、パイプに接続されていることを検出しました。 CまたはC ++またはQtで同様の検出を行うにはどうすればよいですか?
118 c++  c  qt  pipe  stdin 

9
メモリリークはどこまで行くことができますか?
メモリリークに何度も遭遇しました。通常、私はmalloc明日がないようなとき、またはFILE *汚れた洗濯物のようにぶら下がっているとき。私は通常、少なくともプログラムが終了したときにすべてのメモリがクリーンアップされると想定しています(読む:必死に願っています)。プログラムの終了時やクラッシュ時に、リークされたメモリが収集されない状況はありますか? 答えが言語によって大きく異なる場合は、C(++)に焦点を当てましょう。 「明日がないような」、「汚れた洗濯物のようにぶら下がっている」などの語句の双曲線の使用に注意してください。安全ではない* malloc*あなたが愛する人を傷つける可能性があります。また、汚れた洗濯にはご注意ください。
118 c++  c  memory  memory-leaks 

3
makeのDESTDIRおよびPREFIX
ソフトウェアを特定のディレクトリにインストールしようとしています。私はいくつかの方法を見つけましたが、それらの違いは何かわかりません。 ./configure --prefix=*** make install DESTDIR=*** make install prefix=*** 私はこれら3つの機能について混乱しています。彼らは同じ目標を達成していますか?
118 c  linux  bash  makefile  configure 

7
NULLの再定義
アドレス0x0000が有効で、ポートI / Oを含むシステム用のCコードを書いています。したがって、NULLポインタにアクセスする可能性のあるバグは検出されないままであり、同時に危険な動作を引き起こします。 このため、NULLを別のアドレス、たとえば無効なアドレスに再定義したいと思います。誤ってそのようなアドレスにアクセスすると、エラーを処理できるハードウェア割り込みが発生します。このコンパイラのstddef.hにアクセスしたため、実際に標準ヘッダーを変更してNULLを再定義できます。 私の質問は、これはC標準と競合しますか?標準の7.17からわかる限り、マクロは実装定義です。NULL が0でなければならないことを述べている標準の他の場所はありますか? もう1つの問題は、多くのコンパイラーが、データ型に関係なく、すべてをゼロに設定して静的初期化を実行することです。標準では、コンパイラーは整数をゼロに、ポインターをNULLに設定する必要があるとしていますが。コンパイラーに対してNULLを再定義すると、このような静的な初期化が失敗することがわかります。手動でコンパイラヘッダーを大胆に変更した場合でも、コンパイラの動作が間違っていると見なすことはできますか?なぜなら、この特定のコンパイラーは、静的な初期化を行うときにNULLマクロにアクセスしないことは確かです。
118 c  null 

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