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

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

6
純粋関数の利点
今日、私は純粋関数について読んでいて、その使用法に混乱しました: 関数が同じ入力セットに対して同じ値セットを返し、観察可能な副作用がない場合、関数は純粋であると言われます。 たとえば、strlen()は純粋関数rand()ですが、は不純な関数です。 __attribute__ ((pure)) int fun(int i) { return i*i; } int main() { int i=10; printf("%d",fun(i));//outputs 100 return 0; } http://ideone.com/33XJU 上記のプログラムは、pure宣言がない場合と同じように動作します。 関数をpure[出力に変更がない場合]として宣言する利点は何ですか?
81 c  pure-virtual 

5
「int * nums = {5、2、1、4}」はセグメンテーション違反を引き起こします
int *nums = {5, 2, 1, 4}; printf("%d\n", nums[0]); セグメンテーション違反を引き起こしますが、 int nums[] = {5, 2, 1, 4}; printf("%d\n", nums[0]); そうではありません。今: int *nums = {5, 2, 1, 4}; printf("%d\n", nums); 5を印刷します。 これに基づいて、配列初期化表記{}は、このデータを左側の変数に盲目的にロードすると推測しました。int []の場合、配列は必要に応じていっぱいになります。int *の場合、ポインタは5でいっぱいになり、ポインタが格納された後のメモリ位置は2、1、4でいっぱいになります。したがって、nums [0]は5をデリファレンスしようとし、セグメンテーション違反を引き起こします。 私が間違っている場合は、私を訂正してください。そして、私が正しければ、配列初期化子がなぜそのように機能するのか理解できないので、詳しく説明してください。
81 c  arrays  pointers 

6
CとC ++で異なる動作をする列挙型定数
なぜこれを行うのですか? #include <stdio.h> #include <limits.h> #include <inttypes.h> int main() { enum en_e { en_e_foo, en_e_bar = UINT64_MAX, }; enum en_e e = en_e_foo; printf("%zu\n", sizeof en_e_foo); printf("%zu\n", sizeof en_e_bar); printf("%zu\n", sizeof e); } 4 8 8Cおよび8 8 8C ++(4バイトintのプラットフォーム上)で印刷しますか? このUINT64_MAX割り当てにより、すべての列挙定数が少なくとも64ビットに強制されますがen_e_foo、プレーンCでは32のままであるという印象を受けました。 不一致の理由は何ですか?
81 c++  c 

4
構造体の何が特別なのですか?
Cでは、関数から配列を返すことはできませんが、配列へのポインターを返すことができます。しかしstructs、配列が含まれている場合でも、関数によって返されるようにする特別な点は何ですか。 structラッピングによって次のプログラムが有効になるのはなぜですか? #include <stdio.h> struct data { char buf[256]; }; struct data Foo(const char *buf); int main(void) { struct data obj; obj = Foo("This is a sentence."); printf("%s\n", obj.buf); return 0; } struct data Foo(const char *buf) { struct data X; strcpy(X.buf, buf); return X; }

4
POSIXスレッドとシグナル
私は、POSIXスレッドとPOSIXシグナルがどのように相互作用するかについての複雑さを理解しようとしてきました。特に、私は興味があります: シグナルが配信されるスレッドを制御するための最良の方法は何ですか(そもそも致命的ではないと仮定して)? シグナルが到着したことを別のスレッド(実際にはビジーである可能性があります)に伝える最良の方法は何ですか?(シグナルハンドラーからpthread条件変数を使用するのは悪い考えであることはすでに知っています。) シグナルが発生したという情報を他のスレッドに渡すことを安全に処理するにはどうすればよいですか?これはシグナルハンドラーで発生する必要がありますか?(私は一般的に他のスレッドを殺したくありません;私ははるかに微妙なアプローチが必要です。) これが必要な理由については、TclXパッケージを変換してスレッドをサポートする方法、または分割して少なくともいくつかの便利なパーツでスレッドをサポートする方法を研究しています。信号は、特に興味深い部分の1つです。
81 c  pthreads  signals 

5
最高の(ポータブルな)クロスプラットフォームの任意精度の数学ライブラリは何ですか?[閉まっている]
閉まっている。この質問は、StackOverflowのガイドラインを満たしていません。現在、回答を受け付けていません。 この質問を改善したいですか?質問を更新して、StackOverflowのトピックになります。 5年前に閉鎖されました。 この質問を改善する CまたはC ++で適切な任意精度の数学ライブラリを探しています。アドバイスや提案をお願いします。 主な要件: これは、必要があります任意の大きな整数を、私の扱う主要な関心は整数です。任意に大きいという言葉が何を意味するのかわからない場合は、100000のようなものを想像してください!(100000の階乗)。 ライブラリの初期化またはオブジェクトの作成中に精度を指定する必要はありません。精度は、システムの利用可能なリソースによってのみ制約される必要があります。 それはすべきプラットフォームのフルパワーを利用し、ネイティブで「小さな」の数字を処理する必要があります。つまり、64ビットプラットフォームでは、(2 ^ 33 + 2 ^ 32)の計算には使用可能な64ビットCPU命令を使用する必要があります。ライブラリは、同じプラットフォームで(2 ^ 66 + 2 ^ 65)を使用する場合と同じ方法でこれを計算するべきではありません。 それは必要があり、効率的付加をハンドル(+)、減算(-)、乗算(*)、整数除算(/)、残り(%)、電源(**)、インクリメント(++)、デクリメント(--)、GCD、階乗、及び他の一般的な算術計算整数。整数の結果を生成しない平方根や対数などの関数を処理する機能はプラスです。記号計算を処理する機能はさらに優れています。 これが私がこれまでに見つけたものです: JavaのBigIntegerクラスとBigDecimalクラス:私はこれまでこれらを使用してきました。ソースコードを読みましたが、その下の計算がわかりません。それは私が学んだことのない理論やアルゴリズムに基づいているのかもしれません。 組み込みの整数型またはbc、Python、Ruby、Haskell、Lisp、Erlang、OCaml、PHP、その他の言語のコアライブラリ:これらのいくつかを使用しましたが、どのライブラリを使用しているかわかりません。彼らが使用している実装の種類。 私がすでに知っていること: 使用するchar小数点以下の桁用とchar*進文字列のため、および使用して数字上の計算を行うfor-loopを。 int(または、、long intまたはlong long)を基本的な「単位」として使用し、そのタイプの配列を任意の長整数として使用し、for-loopを使用して要素の計算を行います。 整数型を使用して、10進数(または数桁)をBCD(2進化10進数)として格納します。 ブースの乗算アルゴリズム。 私が知らないこと: 単純な方法を使用せずに、上記のバイナリ配列を10進数で出力します。単純な方法の例:(1)ビットを最低から最高に追加します:char*1、2、4、8、16、32 、…(2)上記の-文字列を使用して中間の小数の結果を格納します)。 私が感謝すること: GMP、MPFR、decNumber(またはあなたの意見で良い他のライブラリ)の良い比較。 私が読むべき本や記事に関する良い提案。たとえば、ナイーブでない2進化10進変換アルゴリズムがどのように機能するかを示す図があればよいでしょう。ダグラス・W・ジョーンズによる「限られた精度での2進化から10進への変換」という記事は良い記事の例です。 一般的なヘルプ。 (または、、または)を使用するとこの問題を簡単に解決できると思われる場合は、この質問に答えないでください。そう思うと、問題の問題を理解できません。doublelong doublelong long double
81 c++  c  biginteger  bigdecimal  gmp 

2
Android AudioRecordは、MICオーディオソースに別のストリームを強制します
更新3:私は別の開発者と提携しましたが、多額のお金でこれを実行できる人を見つけたようです。彼らは私たちにテストapkを送ってくれました、そしてそれはうまくいくようです。先に進んでソースを購入します。詐欺に遭わないことを願っています。わかったら更新します アップデート2:まだ作業中です。もっと辛い日々を過ごした後、私は今、何も派手なことは起こっていないと思いますが、彼らは単にネイティブ側でAudioFlinger(リンクを参照)を使用してAudioFlinger :: setParametersを呼び出しています 私は今、audio_io_handle_t ioHandle、const String8&keyValuePairsを使用してAudioFlinger :: setParametersを呼び出す簡単なJNIを作成する方法を探しています。 keyValuePairsが何であるかは知っていますが、audio_io_handle_tについての手がかりはありません 更新:他のアプリがCAFでQCOMオーディオを使用している可能性があると思います。同じものについては、リンクのaudio_extn_utils_send_audio_calibrationを参照してください と同じリンクのvoice_get_incall_rec_snd_device 私はC / ++の知識がありません。これらのメソッドをネイティブ側から呼び出すことができるかどうかを確認するにはどうすればよいですか?他のアプリでもできるので、方法が必要です。 私はこれに40日以上、少なくとも1日5〜6時間苦労してきました。SOで許可されているかどうかはわかりませんが、正解も喜んで寄付させていただきます。 VOICE_CALLオーディオソースを使用する通話録音アプリがあります。ASOPはそれを実装/義務付けていませんが、ほとんどのメーカーはVOICE_CALLを実装しており、VOICE_CALLオーディオソースを使用するアプリは多くのデバイスで正常に機能しました。それはAndroid6までです。 GoogleはAndroid6でこの動作を変更しました。VOICE_CALLオーディオソースを開くには、システムアプリケーションにのみ付与されるandroid.permission.CAPTURE_AUDIO_OUTPUTが必要になりました。 これは基本的に通話の録音を停止します。まあ、それはこの制限を回避する方法を見つけた3人を除いて私のものと200以上の他の通話録音アプリのためにあります。 私はAndroid6を搭載したさまざまな携帯電話でこれらのアプリを試してきましたが、記録方法に特定の特徴があることがわかりました。 それらはすべてAndroidAudioRecordクラスを使用し、MICオーディオソースを開きます。私も; しかし、私のアプリでは、MICからのみ音声を取得し、相手からは取得しません。私が見つけたのは、彼らが録音を開始した直後または開始する前に、ある種のシステムコールを発行しているということです。 MICを使用して録音しているにもかかわらず、VOICE_CALLを正常に録音したアプリの1つから、次のログを確認してください。アプリは、VOICE_CALLオーディオソースをMICにミックス/ルーティング/ストリーム/マージする方法のようです。 - D/audio_hw_primary: in_set_parameters: enter: kvpairs=input_source=1;routing=-2147483644 - D/PermissionCache: checking android.permission.MODIFY_AUDIO_SETTINGS for uid=10286 => granted (432 us) - D/audio_hw_primary: in_set_parameters: enter: kvpairs=input_source=4;routing=-2147483584;format=1 - D/audio_hw_primary: select_devices: out_snd_device(0: ) in_snd_device(283: voice-dmic-ef) …

3
GCCパッドがNOPで機能するのはなぜですか?
私はしばらくの間Cを使用してきましたが、ごく最近、ASMを使い始めました。プログラムをコンパイルするとき: int main(void) { int a = 0; a += 1; return 0; } objdump逆アセンブリにはコードがありますが、retの後にnopsします。 ... 08048394 <main>: 8048394: 55 push %ebp 8048395: 89 e5 mov %esp,%ebp 8048397: 83 ec 10 sub $0x10,%esp 804839a: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) 80483a1: 83 45 fc 01 addl $0x1,-0x4(%ebp) …
81 c  gcc  assembly 

8
ldをゴールドに置き換える-経験はありますか?
誰かがgold代わりに使用しようとしましたldか? gold よりもはるかに高速であることが約束されているldため、大規模なC ++アプリケーションのテストサイクルを高速化するのに役立つ可能性がありますが、ldのドロップイン代替として使用できますか? することができますgcc/g++直接呼び出しますかgold。? 既知のバグや問題はありますか? が、goldしばらく以来、GNU binutilsのの一部であり、私は、Webでの「サクセスストーリー」、あるいは「ハウツー」はほとんど認められません。 (更新:ゴールドへのリンクとそれを説明するブログエントリを追加しました)

9
実行されないコードは未定義の動作を呼び出すことができますか?
未定義の動作(この例ではゼロ除算)を呼び出すコードは実行されませんが、プログラムはまだ未定義の動作ですか? int main(void) { int i; if(0) { i = 1/0; } return 0; } それはまだ未定義の振る舞いだと思いますが、私を支持または否定するための証拠を標準で見つけることができません。 それで、何かアイデアはありますか?

1
モジュラスを使用したC加算
印刷する興味深いCコードに出くわしましたが、A + B理解するのに苦労しています。 入力フォーマット: A B どこA、B間の整数である0と10単一のスペースで区切られています。 コード: main( n ) { gets( &n ); printf("%d", n % 85 - 43); } これは短いコーディングを目的としていました。警告を気にしないでください。 私がこれまでに理解していること: gets( &n )A、スペース、およびBのASCII値をの下位3バイトに格納しますn。たとえば、A = 3とB = 8はを生成しn = 0x00382033ます。与えられた条件nはオーバーフローを防ぎます。しかし、私はどのようにn % 85 - 43収穫するのか理解していませんA + B。 これらの数字はどのようにして思いついたのですか?
81 c  addition  mod 

9
strcpyとmemcpy
違いは何であるmemcpy()とはstrcpy()?私はプログラムの助けを借りてそれを見つけようとしましたが、両方とも同じ出力を与えています。 int main() { char s[5]={'s','a','\0','c','h'}; char p[5]; char t[5]; strcpy(p,s); memcpy(t,s,5); printf("sachin p is [%s], t is [%s]",p,t); return 0; } 出力 sachin p is [sa], t is [sa]
81 c  memcpy  strcpy 

6
#pragmaが一度自動的に想定されないのはなぜですか?
ファイルを1回だけ含めるようにコンパイラーに指示する意味は何ですか?デフォルトでは意味がありませんか?1つのファイルを複数回含める理由はありますか?なぜそれを仮定しないのですか?それは特定のハードウェアと関係がありますか?
81 c++  c  pragma 

6
オブジェクト指向C ++コード用のCラッパーAPIの開発
私は、既存のC ++ APIをラップアラウンドしてコアロジック(オブジェクト指向C ++で記述)にアクセスする一連のCAPIを開発しようとしています。これは基本的に、C ++ロジックを他の言語で使用できるようにする接着剤APIになります。オブジェクト指向C ++の周りにCをラップすることに関連する概念を紹介するいくつかの良いチュートリアル、本、またはベストプラクティスは何ですか?
81 c++  c  wrapper 

9
ターミナルを使用してMacOS XでCプログラムを実行するにはどうすればよいですか?
私はCを初めて使用します。これが私の「Hello、world!」です。プログラム。 #include <stdio.h> int main(void) { printf("Hello, world!\n"); return 0; } ターミナルを使用して実行しようとすると、次のように表示されます。 MacBook-Pro-MacBook:~ macbook$ /Users/macbook/Desktop/peng/Untitled1 -bash: /Users/macbook/Desktop/peng/Untitled1: Permission denied MacBook-Pro-MacBook:~ macbook$ どうして?
81 c  macos  bash 

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