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

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


12
Cの `free`が解放されるバイト数を受け取らないのはなぜですか?
明確にするために:私はそれを知ってmallocおりfree、Cライブラリに実装されています。Cライブラリは通常、OSからメモリのチャンクを割り当て、独自の管理を行ってアプリケーションに少量のメモリを分割し、割り当てられたバイト数を追跡​​します。この質問は、無料がどれだけ解放するかをどのように知るかではありません。 むしろ、freeそもそもなぜこのように作られたのか知りたい。低水準言語であるため、Cプログラマーに、割り当てられたメモリだけでなく、どのくらいの量も追跡するように依頼するのは完全に合理的だと思います(実際、私は通常、バイト数を追跡​​することになります。とにかくmalloced)。また、バイト数を明示的に指定freeすると、パフォーマンスの最適化が可能になる場合があります。たとえば、割り当てサイズが異なる個別のプールを持つアロケータは、入力引数を確認するだけで、解放するプールを決定できます。全体的にスペースのオーバーヘッドが少なくなります。 だから、要するに、なぜし、mallocそしてfreeそれらは内部的に割り当てられたバイト数を追跡するために必要としているように作成?それは単なる歴史的な事故ですか? ちょっとした編集:「割り当てた金額とは異なる金額を解放したらどうなるか」などのポイントを提供している人もいます。私が想像したAPIは、割り当てられたバイト数を正確に解放するために1つを必要とするだけです。多かれ少なかれ解放することは、単にUBまたは実装定義である可能性があります。しかし、他の可能性についての議論を思いとどまらせたくはありません。

7
CからC ++関数を呼び出す方法は?
私はこれを知っている。 C ++からC関数を呼び出す: アプリケーションがC ++であり、Cで記述されたライブラリから関数を呼び出さなければならなかった場合、 //main.cpp extern "C" void C_library_function(int x, int y);//prototype C_library_function(2,4);// directly using it. これは名前C_library_functionを壊さず、リンカーは入力* .libファイルで同じ名前を見つけ、問題は解決されます。 CからC ++関数を呼び出す??? しかし、ここではCで書かれた大きなアプリケーションを拡張しているので、C ++で書かれたライブラリを使用する必要があります。ここでは、C ++の名前マングリングが問題を引き起こしています。リンカーは、未解決のシンボルについて不平を言っています。CプロジェクトでC ++コンパイラを使用することはできません。これは、他の多くのものを壊してしまうためです。抜け道は何ですか? ちなみに私はMSVCを使用しています
84 c++  c  visual-c++  extern-c 

10
超高性能C / C ++ハッシュマップ(表、辞書)[クローズ]
閉まっている。この質問は、StackOverflowのガイドラインを満たしていません。現在、回答を受け付けていません。 この質問を改善したいですか?質問を更新して、StackOverflowのトピックになります。 5年前に閉鎖されました。 この質問を改善する 高性能ハッシュマップデータ構造で値を構造化するには、プリミティブキー(int、おそらくlong)をマップする必要があります。 私のプログラムにはこれらのマップが数百あり、各マップには通常最大で数千のエントリがあります。ただし、マップは常に「更新」または「チャーン」されます。何百万もの処理を想像addし、delete第二のメッセージ。 CまたはC ++のどのライブラリが、このユースケースに適合するデータ構造を持っていますか?または、独自に構築することをどのように推奨しますか?ありがとう!

15
`switch`ステートメントを使用してCの文字列を比較するにはどうすればよいですか?
Cにはswitch、テスト整数値に基づいてコードのさまざまな条件分岐を実行できるようにする構造があります。 int a; /* Read the value of "a" from some source, e.g. user input */ switch (a) { case 100: // Code break; case 200: // Code break; default: // Code break; } 文字列値、つまり?に対して同じ動作を取得する(つまり、いわゆる「if-elseラダー」を回避する)にはどうすればよいchar *ですか?

12
Cで入力バッファをクリアする方法は?
私は次のプログラムを持っています: int main(int argc, char *argv[]) { char ch1, ch2; printf("Input the first character:"); // Line 1 scanf("%c", &ch1); printf("Input the second character:"); // Line 2 ch2 = getchar(); printf("ch1=%c, ASCII code = %d\n", ch1, ch1); printf("ch2=%c, ASCII code = %d\n", ch2, ch2); system("PAUSE"); return 0; } 上記のコードの作者のように説明している:ユーザーがEnterキーを押すライン1、で、それは2文字バッファ入力に残すため、プログラムが正しく動作しません:Enter key (ASCII …
84 c  buffer 

2
正確には、二重文字列化のトリックはどのように機能しますか?
少なくとも一部のCプリプロセッサでは、マクロを文字列化する関数のようなマクロから別のマクロに渡すことで、マクロの名前ではなく値を文字列化できます。 #define STR1(x) #x #define STR2(x) STR1(x) #define THE_ANSWER 42 #define THE_ANSWER_STR STR2(THE_ANSWER) /* "42" */ ここでの使用例の例。 これは、少なくともGCCとClang(両方とも-std=c99)では機能しますが、C標準の用語でどのように機能するかはわかりません。 この動作はC99によって保証されていますか? もしそうなら、C99はどのようにそれを保証しますか? そうでない場合、動作はどの時点でC定義からGCC定義に移行しますか?

8
なぜGDBは行間を予期せずジャンプし、変数を「<valueoptimizedout>」として出力するのですか?
誰かがgdbのこの動作を説明できますか? 900 memset(&amp;new_ckpt_info,'\0',sizeof(CKPT_INFO)); (gdb) **903 prev_offset = cp_node-&gt;offset;** (gdb) **905 m_CPND_CKPTINFO_READ(ckpt_info,(char *)cb-&gt;shm_addr.ckpt_addr+sizeof(CKPT_** HDR),i_offset); (gdb) **903 prev_offset = cp_node-&gt;offset;** (gdb) **905 m_CPND_CKPTINFO_READ(ckpt_info,(char *)cb-&gt;shm_addr.ckpt_addr+sizeof(CKPT_ HDR),i_offset);** (gdb) **908 bitmap_offset = client_hdl/32;** (gdb) **910 bitmap_value = cpnd_client_bitmap_set(client_hdl%32);** (gdb) **908 bitmap_offset = client_hdl/32;** (gdb) **910 bitmap_value = cpnd_client_bitmap_set(client_hdl%32);** (gdb) **908 bitmap_offset = client_hdl/32;** (gdb) **910 …

4
Photoshopは2つの画像をどのようにブレンドしますか?[閉まっている]
閉まっている。この質問は、StackOverflowのガイドラインを満たしていません。現在、回答を受け付けていません。 この質問を改善したいですか?質問を更新して、StackOverflowのトピックになります。 昨年休業。 この質問を改善する アプリケーションで同じ効果を再現できるように、Photoshopが2つの画像をブレンドする方法を誰かに説明してもらえますか。

9
Cでの文字列リテラルの「ライフタイム」
次の関数によって返されるポインタにアクセスできませんか? char *foo(int rc) { switch (rc) { case 1: return("one"); case 2: return("two"); default: return("whatever"); } } つまり、C / C ++のローカル変数の存続期間は、実際には関数内だけですよね?つまり、char* foo(int)終了した後、それが返すポインタはもはや何も意味しませんよね? ローカル変数の存続期間について少し混乱しています。良い説明は何ですか?

12
CコードでGitバージョンのハッシュを自動的に出力するにはどうすればよいですか?
GitバージョンのハッシュにアクセスできるCコードを書く簡単な方法はありますか? 私は実験室の設定で科学的データを収集するためにCでソフトウェアを書きました。私のコードは、収集したデータを後で分析するために.yamlファイルに記録します。私の実験は日々変化し、コードを変更しなければならないことがよくあります。リビジョンを追跡するために、私はgitリポジトリを使用します。 .yamlデータファイルにコメントとしてGitリビジョンハッシュを含めることができるようにしたいと思います。そうすれば、.yamlファイルを見て、そのファイルに表示されるデータを生成するために使用されたコードを正確に知ることができます。これを自動的に行う簡単な方法はありますか?

5
ソケットプログラミングのためのINADDR_ANYの理解
私はいくつかのソケットをプログラムしようとしているので、サーバー側ではを使用しますhtonl(INADDR_ANY)。私が理解している限りでは、この関数はランダムなIPを生成しているように見えます(私は正しいですか?)。実際、ソケットをにバインドしたいと思いlocalhostます。しかし、これを実行すると printf("%d",htonl(INADDR_ANY)); 戻り値として0を取得します。誰かが説明を持ってくることができますか?
84 c  sockets 

10
整数の1ビットが連続した領域にあるかどうかをテストするためのエレガントで高速な方法はありますか?
ビット値1の位置(32ビット整数の場合は0から31)が連続領域を形成するかどうかをテストする必要があります。例えば: 00111111000000000000000000000000 is contiguous 00111111000000000000000011000000 is not contiguous このテスト、つまりいくつかの関数has_contiguous_one_bits(int)を移植可能にしたいと思います。 明らかな方法の1つは、位置をループして最初のセットビットを見つけ、次に最初の非セットビットを見つけて、それ以上セットビットがないかどうかを確認することです。 もっと速い方法があるのだろうか?最高と最低のセットビットを見つけるための高速な方法がある場合(しかし、この質問から、ポータブルなものはないようです)、可能な実装は次のとおりです。 bool has_contiguous_one_bits(int val) { auto h = highest_set_bit(val); auto l = lowest_set_bit(val); return val == (((1 &lt;&lt; (h-l+1))-1)&lt;&lt;l); } 楽しみのために、ここに連続したビットを持つ最初の100個の整数があります: 0 1 2 3 4 6 7 8 12 14 15 16 24 28 30 31 32 48 56 …

7
Cに「デザインパターン」はありますか?[閉まっている]
現在のところ、この質問は私たちのQ&A形式には適していません。回答は事実、参考資料、または専門知識によって裏付けられることを期待していますが、この質問は、討論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターにアクセスしてガイダンスを入手してください。 8年前に閉鎖されました。 デザインパターンは一般的にオブジェクト指向プログラミングに関連するものであることを私は知っていますが、Cをプログラミングするときによく使用するパターンはありますか? 私は古典的なOOパターンの単純な翻訳には興味がなく、Duffのデバイスについては言及しないでください。;-)

7
Linuxカーネルのcontainer_ofマクロを理解する
Linuxカーネルを閲覧しているときにcontainer_of、次のように定義されているマクロを見つけました。 #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)-&gt;member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) container_ofの機能は理解できますが、理解できないのは最後の文です。 (type *)( (char *)__mptr - offsetof(type,member) );}) 次のようにマクロを使用する場合: container_of(dev, struct wifi_device, dev); 最後の文の対応する部分は次のようになります。 (struct wifi_device *)( (char *)__mptr - offset(struct wifi_device, dev); 何もしていないように見えます。誰かがここの隙間を埋めてくれませんか?

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