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

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

7
標準化委員会が注目するエキゾチックなアーキテクチャ
CおよびC ++標準では、言語の実装の多くの側面が定義されたままであることを知っています。それは、他の特性を持つアーキテクチャがある場合、その標準に準拠するコンパイラを作成することが非常に困難または不可能だからです。 40年前は、どのコンピュータにも独自の仕様があったことを知っています。ただし、今日使用されているアーキテクチャについては知りません。 CHAR_BIT != 8 signed は2の補数ではありません(Javaでこれに問題があったと聞きました)。 浮動小数点はIEEE 754に準拠していません(編集:「IEEE 754バイナリエンコーディングではない」という意味です)。 私が尋ねている理由は、C ++が固定サイズの型などの他の低レベルの側面を義務付けないのは良いことだと人々によく説明するためです†。「他の言語」とは異なり、正しく使用するとコードが移植可能になるので良いです(編集:符号+大きさのアーキテクチャでの2の補数演算など、マシンの低レベルの側面のエミュレーションを必要とせずに、より多くのアーキテクチャに移植できるため) 。しかし、私は自分が特定のアーキテクチャを指すことができないのは残念です。 だから問題は:どのアーキテクチャが上記の特性を示すのか? † uint*_tはオプションです。
154 c++  c  architecture 

5
Valgrindによって検出されたまだ到達可能なリーク
このブロックで言及されている関数はすべてライブラリ関数です。このメモリリークを修正するにはどうすればよいですか? 「まだ到達可能」カテゴリの下にリストされています。(さらに4つあります。非常によく似ていますが、サイズはさまざまです) 630 bytes in 1 blocks are still reachable in loss record 5 of 5 at 0x4004F1B: calloc (vg_replace_malloc.c:418) by 0x931CD2: _dl_new_object (dl-object.c:52) by 0x92DD36: _dl_map_object_from_fd (dl-load.c:972) by 0x92EFB6: _dl_map_object (dl-load.c:2251) by 0x939F1B: dl_open_worker (dl-open.c:255) by 0x935965: _dl_catch_error (dl-error.c:178) by 0x9399C5: _dl_open (dl-open.c:584) by 0xA64E31: do_dlopen (dl-libc.c:86) by 0x935965: …
154 c  pthreads  valgrind 


6
iPhoneのObjective-Cでメソッド名をNSLogする
現在、クラス名とログのソース行番号を出力する拡張ログメカニズムを定義しています。 #define NCLog(s, ...) NSLog(@"<%@:%d> %@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], \ __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__]) たとえば、NCLog(@ "Hello world");を呼び出すと、出力は次のようになります。 <ApplicationDelegate:10>Hello world 次のように、メソッド名もログアウトしたいと思います。 <ApplicationDelegate:applicationDidFinishLaunching:10>Hello world したがって、どのメソッドが呼び出されているかを知ることができれば、デバッグが容易になります。Xcodeデバッガーもあることは知っていますが、ログアウトしてデバッグしたい場合もあります。

11
〜x +〜y ==〜(x + y)は常にfalseですか?
このコードは常にfalseと評価されますか?どちらの変数も2の補数の符号付き整数です。 ~x + ~y == ~(x + y) 条件を満たす数はあるはずだと思います。私は間の数字をテストしようとした-5000と5000が、平等を達成したことがありません。条件の解を見つけるための方程式を設定する方法はありますか? 片方をもう片方に交換すると、プログラムに潜むバグが発生しますか?

9
Cでは、ブレースはスタックフレームとして機能しますか?
中括弧の新しいセット内に変数を作成した場合、その変数は閉じ中括弧のスタックからポップされますか、それとも関数の最後までハングしますか?例えば: void foo() { int c[100]; { int d[200]; } //code that takes a while return; } ウィルd中にメモリを占有するcode that takes a whileセクション?
153 c  memory  stack 

9
Cの「コールバック」とは何ですか、またどのように実装されますか?
私が行った読書から、Core Audioはコールバックに大きく依存しています(そしてC ++ですが、それは別の話です)。 タスクを実行するために別の関数から繰り返し呼び出される関数を設定する概念(一種)を理解しています。それらがどのように設定され、実際にどのように機能するのか理解できません。任意の例をいただければ幸いです。
153 c  callback 

14
C / C ++でのNULLポインターのチェック[終了]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 5年前休業。 この質問を改善する 最近のコードレビューでは、寄稿者がNULLポインターのすべてのチェックが次の方法で実行されるように強制しようとしています: int * some_ptr; // ... if (some_ptr == NULL) { // Handle null-pointer error } else { // Proceed } の代わりに int * some_ptr; // ... if (some_ptr) { // Proceed } else { // Handle null-pointer error } 「このポインターがNULLではないことを確認してください」と明示的に言っているという意味で彼のやり方はもう少し明確であることに同意しますが、このコードに取り組んでいる誰もがポインター変数をifステートメントは暗黙的にをチェックしていNULLます。また、2番目の方法では、ilkのバグが発生する可能性が低くなります。 if (some_ptr = NULL) これは、見つけてデバッグするための絶対的な苦痛です。 …

13
Cの関数型プログラミングにはどのようなツールがありますか?
最近、C(C ++ではなく)で関数型プログラミングを行う方法について多くのことを考えています。明らかに、Cは手続き型言語であり、実際には関数型プログラミングをネイティブでサポートしていません。 言語に関数型プログラミング構造を追加するコンパイラ/言語拡張機能はありますか?GCCは、言語拡張としてネストされた関数を提供します。ネストされた関数は親スタックフレームから変数にアクセスできますが、これはまだ成熟したクロージャーから遠く離れています。 たとえば、Cで本当に役立つと思うのは、関数ポインターが必要な場所ならどこでも、ラムダ式を渡して、関数ポインターに減衰するクロージャーを作成できることです。C ++ 0xにはラムダ式が含まれます(これは素晴らしいと思います)。しかし、私はストレートCに適用できるツールを探しています。 [編集]明確にするために、私は関数型プログラミングにより適したCの特定の問題を解決しようとしているのではありません。私がやりたいのなら、私はそこにどんなツールがあるのか​​知りたいだけです。

13
num ++は 'int num'に対してアトミックですか?
一般ためにint num、num++(又は++num)、リード・モディファイ・ライト動作として、ある原子ではありません。しかし、GCCなどのコンパイラが次のコードを生成することがよくあります(ここで試してください)。 に対応する5行目num++は1つの命令なので、この場合num++ はアトミックであると結論付けることができますか? もしそうなら、それは、そのように生成num++されたデータレースの危険なしに同時(マルチスレッド)シナリオで使用できることを意味します(つまり、たとえば、それを作成する必要がなくstd::atomic<int>、関連するコストを課します。とにかくアトミック)? 更新 この質問はインクリメントがアトミックであるかどうかではないことに注意してください(そうではなく、それが問題の最初の行でした)。それはかどうかだことができ、特定の場合で1命令自然の缶はのオーバーヘッドを回避するために悪用されるかどうか、すなわち、特定のシナリオでも接頭辞を。そして、受け入れられた回答がユニプロセッサマシンに関するセクションで言及しているように、この回答と同様に、そのコメントでの会話や他の人が説明しているように、それは可能です(ただし、CまたはC ++ではできません)。lock

2
Cプリプロセッサで2回連結し、「arg ## _ ## MACRO」のようにマクロを展開する方法は?
一部の関数の名前が特定のマクロ変数の値に依存しているプログラムを、次のようなマクロで記述しようとしています。 #define VARIABLE 3 #define NAME(fun) fun ## _ ## VARIABLE int NAME(some_function)(int a); 残念ながら、マクロNAME()はそれを int some_function_VARIABLE(int a); のではなく int some_function_3(int a); ですから、これは明らかに間違った方法です。幸い、VARIABLEの可能な値の数は少ないので、単純にを実行し#if VARIABLE == nてすべてのケースを個別にリストできますが、それを行うための巧妙な方法があるかどうか疑問に思いました。

4
「#define _GNU_SOURCE」は何を意味しますか?
今日、私はbasename()関数を使わなければなりませんでした、そしてman 3 basename(ここ)は私にいくつかの奇妙なメッセージを与えました: ノート basename()には2つの異なるバージョンがあります。上記のPOSIXバージョンと、GNUバージョンです。 #define _GNU_SOURCE #include <string.h> 私はこれが何を#define _GNU_SOURCE意味するのか疑問に思っています:私が書いたコードがGNU関連のライセンスで汚染されているのでしょうか?それとも単に、コンパイラに「そうですね、この関数のセットはPOSIXではないため、移植性はありませんが、とりあえず使用したいのです」と言っているだけなのでしょうか。 もしそうなら、いくつかのあいまいなマクロを定義して、1つの関数の実装または他の関数の実装を取得する代わりに、人々に異なるヘッダーを与えてみませんか? 何かが私を悩ませます:コンパイラーはどのように実行可能ファイルとリンクする関数の実装を知るのですか?これ#defineも使用しますか? 誰かが私に与えるいくつかの指針がありますか?
152 c  posix  gnu 

22
Cコードでのエラー処理
Cライブラリで一貫した方法でエラーを処理することに関して、「ベストプラクティス」をどのように考えますか。 私が考えてきた2つの方法があります。 常にエラーコードを返します。典型的な関数は次のようになります。 MYAPI_ERROR getObjectSize(MYAPIHandle h, int* returnedSize); は常にエラーポインタアプローチを提供します。 int getObjectSize(MYAPIHandle h, MYAPI_ERROR* returnedError); 最初のアプローチを使用する場合、エラー処理チェックが関数呼び出しに直接配置される次のようなコードを書くことが可能です。 int size; if(getObjectSize(h, &size) != MYAPI_SUCCESS) { // Error handling } ここのエラー処理コードよりもよく見えます。 MYAPIError error; int size; size = getObjectSize(h, &error); if(error != MYAPI_SUCCESS) { // Error handling } ただし、データを返すために戻り値を使用すると、コードが読みやすくなると思います。2番目の例では、サイズ変数に何かが書き込まれたことは明らかです。 なぜ私がこれらのアプローチを好むのか、あるいはそれらを混合するのか、または何か他のものを使用するのかについて何か考えはありますか?ライブラリのマルチスレッド使用をより苦痛にする傾向があるため、私はグローバルエラー状態のファンではありません。 編集:これについてのC ++固有のアイデアは、それが現時点では私にとってオプションではないため、例外が含まれていない限り、聞いてみるのも興味深いでしょう...
152 c  error-handling 


8
Cを使用して配列を返す
私はCに比較的慣れていないので、配列を処理するメソッドについてサポートが必要です。Javaプログラミングから来て、私はint [] method()配列を返すために言うことができることに慣れています。ただし、Cでは、配列を返すときに配列のポインタを使用する必要があることがわかりました。私は新しいプログラマーであり、私がこれまで調べてきた多くのフォーラムがあっても、これをまったく理解していません。 基本的に、Cでchar配列を返すメソッドを記述しようとしています。メソッドにreturnArrayという名前の配列を提供します。前の配列から新しい配列を作成し、その配列へのポインターを返します。これを開始する方法と、配列から送信されたポインターを読み取る方法について、いくつかの助けが必要です。これを説明する助けがありがたいです。 配列を返す関数のコード形式の提案 char *returnArray(char array []){ char returned [10]; //methods to pull values from array, interpret them, and then create new array return &(returned[0]); //is this correct? } 関数の呼び出し元 int main(){ int i=0; char array []={1,0,0,0,0,1,1}; char arrayCount=0; char* returnedArray = returnArray(&arrayCount); ///is this correct? for (i=0; …
152 c  arrays  pointers  char 

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