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

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

3
「マスクされた」ビットセットのインクリメント
私は現在、次の問題に遭遇したツリー列挙子を作成しているところです。 私はつまり、マスクされたビットセット、セットビットは、マスクのサブセットであり、すなわちビットセット、で探してい0000101たマスクで1010101。私が達成したいのはビットセットをインクリメントすることですが、マスクされたビットに関してのみです。この例では、結果はになります0010000。少し明確にするために、マスクされたビットのみを抽出します。つまり0011、それらをインクリメントして0100マスクビットに再度分配し、を与え0010000ます。 ビットスキャンとプレフィックスマスクの組み合わせを使用して手動で操作を実装する以外に、これを行う効率的な方法を誰かが見ていますか?

3
コードが末尾呼び出しの最適化を積極的に防止しようとするのはなぜですか?
質問のタイトルは少し奇妙かもしれませんが、私が知る限り、末尾呼び出しの最適化に反対するものは何もありません。しかし、オープンソースプロジェクトを閲覧しているときに、コンパイラが末尾呼び出しの最適化を実行するのを積極的に阻止しようとするいくつかの関数にすでに遭遇しました。たとえば、そのようなハックでいっぱいのCFRunLoopRefの実装です。例えば: static void __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__() __attribute__((noinline)); static void __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__(CFRunLoopObserverCallBack func, CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info) { if (func) { func(observer, activity, info); } getpid(); // thwart tail-call optimization } なぜこれがそれほど重要に見えるのか知りたいのですが、通常の開発者として私もこれを念頭に置いておく必要がある場合はありますか?例えば。末尾呼び出しの最適化に関する一般的な落とし穴はありますか?

12
単一の文字のみを読み取るためにgetchar()でEnterキーを押さないようにするにはどうすればよいですか?
次のコードでは: #include <stdio.h> int main(void) { int c; while ((c=getchar())!= EOF) putchar(c); return 0; } Enter入力したすべての文字を印刷するにはを押すgetchar必要がありますが、これはやりたくありません。文字を押して、を押さずに、紹介した文字をすぐに繰り返し表示しEnterます。たとえば、文字「a」を押すと、その横に別の「a」が表示されます。 aabbccddeeff..... しかし、「a」を押しても何も起こらず、他の文字を書くことができ、コピーは私が押したときにのみ表示されますEnter: abcdef abcdef これどうやってするの? cc -o example example.cコンパイルにはUbuntuでコマンドを使用しています。

10
Cでの文字列パディング
StringPadRight( "Hello"、10、 "0")-> "Hello00000"を実行することになっているこの関数を作成しました。 char *StringPadRight(char *string, int padded_len, char *pad) { int len = (int) strlen(string); if (len >= padded_len) { return string; } int i; for (i = 0; i < padded_len - len; i++) { strcat(string, pad); } return string; } それは機能しますが、いくつかの奇妙な副作用があります...他の変数のいくつかが変更されます。どうすればこれを修正できますか?
80 c  string  padding 


6
Cでの最良のタイミング方法は?
高解像度と移植性を備えたコードセクションの時間を計る最良の方法は何ですか? /* Time from here */ ProcessIntenseFunction(); /* to here. */ printf("Time taken %d seconds %d milliseconds", sec, msec); クロスプラットフォームソリューションを持つ標準ライブラリはありますか?
80 c  performance  timer  timing 


1
Python:*と**が/とsqrt()よりも速いのはなぜですか?
コードを最適化しているときに、次のことに気づきました。 >>> from timeit import Timer as T >>> T(lambda : 1234567890 / 4.0).repeat() [0.22256922721862793, 0.20560789108276367, 0.20530295372009277] >>> from __future__ import division >>> T(lambda : 1234567890 / 4).repeat() [0.14969301223754883, 0.14155197143554688, 0.14141488075256348] >>> T(lambda : 1234567890 * 0.25).repeat() [0.13619112968444824, 0.1281130313873291, 0.12830305099487305] そしてまた: >>> from math import sqrt >>> T(lambda : sqrt(1234567890)).repeat() …

6
このバージョンのCの論理ANDが短絡動作を示さないのはなぜですか?
はい、これは宿題の質問ですが、私はこのトピックについて調査とかなりの深い考えを行ったので、これを理解することはできません。この質問は、このコードが短絡動作を示さないことを示し、その理由を尋ねます。しかし、私には短絡動作を示しているように見えますが、なぜそうでないのか誰かが説明できますか? Cの場合: int sc_and(int a, int b) { return a ? b : 0; } それaが間違っている場合、プログラムはまったく評価しようとしないように見えbますが、私は間違っているに違いありません。bこの場合、プログラムが触れる必要がないのに、なぜプログラムが触れるのでしょうか。


16
ヘッダーファイルとライブラリの違いは何ですか?
私が理解するのに苦労していることの1つは、コンパイラーがどのように機能するかです。私はそれで多くの問題を抱えていますが、特に私はヘッダーとライブラリを混同し続けています。誰かが少し物事を片付けることができれば、それは素晴らしいことです。
80 c++  c 

4
memcpy(0,0,0)を実行しても安全であることが保証されていますか?
私はC標準にあまり精通していないので、ご容赦ください。 規格で保証されているかどうか知りたいのですが memcpy(0,0,0)安全が。 私が見つけた唯一の制限は、メモリ領域が重複している場合、動作が定義されていないことです... しかし、ここでメモリ領域が重複していると見なすことができますか?

9
+演算子はCでどのように実装されていますか?
どのように原始的な事業者などの理解場合は+、-、*および/Cで実装されている、私はから次のスニペットを見つけた面白い答え。 // replaces the + operator int add(int x, int y) { while(x) { int t = (x & y) <<1; y ^= x; x = t; } return y; } この関数+は、バックグラウンドで実際にどのように機能するかを示しているようです。しかし、それを理解するには混乱しすぎます。このような操作は、コンパイラによって生成されたアセンブリディレクティブを使用して長い間行われていると思いました。 +オペレーターは、MOST実装に投稿されたコードとして実装されていますか?これは、2の補数または他の実装に依存する機能を利用していますか?

8
64ビット整数のパックされた8ビット整数を並列に1で減算、ハードウェアSIMDなしのSWAR
私が64ビット整数を持っている場合、それを8要素のパックされた8ビット整数の配列として解釈しています。1ある要素の結果が別の要素の結果に影響を与えることなくオーバーフローを処理しながら、各パック整数から定数を減算する必要があります。 私は現在このコードを使用していますが、機能しますが、パックされた各8ビット整数の減算を並列に実行し、メモリアクセスを行わないソリューションが必要です。x86では、psubbパックされた8ビット整数を減算するようなSIMD命令を並列で使用できますが、コーディング対象のプラットフォームはSIMD命令をサポートしていません。(この場合はRISC-V)。 したがって、SWAR(レジスタ内のSIMD)を実行して、のバイト間のキャリー伝播を手動でキャンセルしようとしています。uint64_tこれと同等の処理を実行します。 uint64_t sub(uint64_t arg) { uint8_t* packed = (uint8_t*) &arg; for (size_t i = 0; i < sizeof(uint64_t); ++i) { packed[i] -= 1; } return arg; } これはビット演算子で実行できると思いますが、よくわかりません。SIMD命令を使用しないソリューションを探しています。独自のソリューションを実装できるように、非常に移植性のあるCまたはC ++のソリューション、またはその背後にある理論だけを探しています。
77 c++  c  bit-manipulation  simd  swar 

7
値0の代わりにNULLを使用できますか?
NULLの値の代わりにポインタを使用でき0ますか? それとも、そのことについて何か問題がありますか? たとえば、 int i = NULL; の代わりとして: int i = 0; 実験として、次のコードをコンパイルしました。 #include <stdio.h> int main(void) { int i = NULL; printf("%d",i); return 0; } 出力: 0 確かにそれは私にこの警告を与えます、それ自体は完全に正しいです: warning: initialization makes integer from pointer without a cast [-Wint-conversion] しかし、結果は同じです。 これで「未定義の動作」にぶつかりますか? NULLこのように利用することは許されますか? NULL算術式の数値として使用することに問題はありますか? そして、この場合のC ++の結果と動作は何ですか? 私はの答え読み持っている「\ 0」、NULLの違いは何をして0との違いは何かについてNULL、\0そして0それが正しい使用にも非常に許容され、場合、ですが、私はそこからの簡潔な情報を取得していないNULLとして、代入やその他の算術演算で操作する値。

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