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

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

1
CHAR_MAXに設定されたchar値は、CHAR_MINにラップアラウンドすることが保証されていますか?
私のコード: #include <stdio.h> #include <limits.h> int main() { char c = CHAR_MAX; c += 1; printf("CHAR_MIN=%d CHAR_MAX=%d c=%d (%c)\n", CHAR_MIN, CHAR_MAX, c, c); } 出力: CHAR_MIN=-128 CHAR_MAX=127 c=-128 () char変数セットをにインクリメントするとCHAR_MAX、に戻りCHAR_MINます。この動作は保証されていますか?それとも、未定義の動作または実装固有の動作になりますか?C99標準はこれについて何と言っていますか? [注:charまたはCにCHAR_MAX(127)より大きい値を指定するとどうなりますか。charc = 129が-127に変換されるのはなぜですか?彼らは範囲外の値に値を増分するのではなく範囲外の値を割り当てることについて話しているので、この質問には触れません。]

3
異なるコンパイラでのC ++とCの間の符号なしビットフィールド整数式の一貫性のない切り捨て
編集2: 以前にC ++ソースファイルに存在していた関数がそのままCファイルに移動され、誤った結果が返され始めたときに、奇妙なテストエラーをデバッグしていました。以下のMVEにより、GCCでの問題を再現できます。しかし、気まぐれでClangを使用して(そして後でVSを使用して)例をコンパイルすると、異なる結果が得られました!これをコンパイラの1つのバグとして扱うのか、CまたはC ++標準で許可されている未定義の結果の明示として扱うのか、私にはわかりません。奇妙なことに、どのコンパイラーも式に関する警告を出しませんでした。 犯人はこの表現です: ctl.b.p52 << 12; ここでp52は、と入力されuint64_tます。組合の一部でもありcontrol_tます(下記参照)。結果は64ビットに収まるため、シフト操作はデータを失わない。ただし、Cコンパイラを使用している場合、GCCは結果を52ビットに切り捨てることを決定します。C ++コンパイラでは、結果の64ビットがすべて保持されます。 これを説明するために、以下のサンプルプログラムは、同一の本体を持つ2つの関数をコンパイルし、それらの結果を比較します。c_behavior()Cソースファイルとcpp_behavior()C ++ファイルに配置されmain()、比較を行います。 サンプルコードを含むリポジトリ:https : //github.com/grigory-rechistov/c-cpp-bitfields ヘッダーcommon.hは、64ビット幅のビットフィールドと整数の和集合を定義し、2つの関数を宣言します。 #ifndef COMMON_H #define COMMON_H #include <stdint.h> typedef union control { uint64_t q; struct { uint64_t a: 1; uint64_t b: 1; uint64_t c: 1; uint64_t d: 1; uint64_t e: 1; uint64_t f: 1; uint64_t g: …


1
C11 Atomic Acquire / Releaseおよびx86_64ロード/ストアの一貫性の欠如?
C11標準のセクション5.1.2.4、特にリリース/取得のセマンティクスに苦労しています。私は、https://preshing.com/20120913/acquire-and-release-semantics/(他のものの中でも)が次のように述べていることに注意します。 ...リリースセマンティクスは、プログラムの順序でそれに先行する読み取りまたは書き込み操作による書き込みリリースのメモリの並べ替えを防ぎます。 したがって、次の場合: typedef struct test_struct { _Atomic(bool) ready ; int v1 ; int v2 ; } test_struct_t ; extern void test_init(test_struct_t* ts, int v1, int v2) { ts->v1 = v1 ; ts->v2 = v2 ; atomic_store_explicit(&ts->ready, false, memory_order_release) ; } extern int test_thread_1(test_struct_t* ts, int v2) { int v1 …

2
L2 HWプリフェッチャーは本当に役に立ちますか?
私はWhisky Lake i7-8565Uで、512 KiBのデータ(L2キャッシュサイズの2倍)をコピーするためのパフォーマンスカウンターと時間を分析しており、L2 HWプリフェッチャーの作業に関して誤解に直面しています。 でインテル・マニュアル第4巻MSR MSRがある0x1A4ビット0(無効にする1)L2 HWプリフェッチャをcontrolloingするためのものであるの。 次のベンチマークを検討してください。 memcopy.h: void *avx_memcpy_forward_lsls(void *restrict, const void *restrict, size_t); memcopy.S: avx_memcpy_forward_lsls: shr rdx, 0x3 xor rcx, rcx avx_memcpy_forward_loop_lsls: vmovdqa ymm0, [rsi + 8*rcx] vmovdqa [rdi + rcx*8], ymm0 vmovdqa ymm1, [rsi + 8*rcx + 0x20] vmovdqa [rdi + rcx*8 + 0x20], ymm1 …

4
main()からNULLを返す理由
CやC ++プログラムでのNULL戻り値として使用するコーダーが時々見られます。main()たとえば、次のようなものです。 #include <stdio.h> int main() { printf("HelloWorld!"); return NULL; } このコードをgccでコンパイルすると、次の警告が表示されます。 警告:キャストなしでポインタから整数を返す[-Wint-conversion] これは、マクロNULLが展開され(void*) 0、mainの戻り値がtypeであるため、妥当intです。 私が短いC ++プログラムを作るとき: #include <iostream> using namespace std; int main() { cout << "HelloWorld!"; return NULL; } そして、それをg ++でコンパイルすると、同等の警告が表示されます。 警告:NULLから非ポインター型 'int'に変換しています[-Wconversion-null] しかし、なぜ警告をスローするときのNULL戻り値として使用するのmain()でしょうか。それは単に悪いコーディングスタイルですか? 警告にもかかわらず、の戻り値としてのNULL代わりに使用する理由は何ですか?0main() これが適切であるかどうかは実装定義であり、適切である場合、なぜ実装はポインタ値を取り戻したいのでしょうか?
10 c++  c  null  return  return-value 

1
macOS Mojaveにアップグレードした後、MATLABがMEXファイルをアンロードしない
MATLABでは、clear mexすべてのMEXファイルをメモリからアンロードします(ロックされている場合を除く)。以前のバージョンのmacOSでは、clear mexコマンドを発行するだけで、MATLABを再起動せずにMEXファイルを再コンパイルして変更したバージョンを実行できました。これは、モハベではもはや不可能です。 たとえば、次の簡単なMEXファイル(get_data_pointer.c)を取り上げます。 #include "mex.h" void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { plhs[0] = mxCreateNumericMatrix(1, 1, mxUINT64_CLASS, mxREAL); *(uint64_t*)mxGetData(plhs[0]) = (uint64_t)mxGetData(prhs[0]); } MEXファイルを作成してメモリに読み込むことができます mex get_data_pointer.c get_data_pointer(0) それをクリアするには、 clear mex [~,mexfiles] = inmem version -modules inmem実際、MEXファイルがメモリにロードされていないことを示す空のセル配列を返しますが、version -modules(ドキュメントに記載されていないため、この回答から)/Users/cris/matlab/get_data_pointer.mexmaci64出力には引き続き表示されます。そして、MEXファイルのソースコードを変更して再コンパイルすると、実際にはMEXファイルが再ロードされることはなく、MATLABを終了するまで古いバージョンが引き続き実行されます。 macOS Mojave上のMATLAB R2017aでこれを確認しています。これは、High Sierraで同じバージョンのMATLABで問題になることはありませんでした。 再起動せずにMATLABにMEXファイルを強制的にアンロードさせるにはどうすればよいですか?

5
動的リンク-Linux対。ウィンドウズ
Windowsでは、MSVCのDLLプロジェクトでC / C ++コードをコンパイルすると、2つのファイルが取得されます。 MyDll.dll MyDll.lib 私が理解しMyDll.libている限り、DLL内の関数の場所を示すポインタテーブルの種類が含まれています。このdllを使用すると、たとえばexeファイルで、MyDll.libリンケージ時にexeファイルに埋め込まれるため、実行時に関数がどこにあるかを「認識」し、関数MyDll.dllを使用できます。 しかし、Linuxで同じコードをコンパイルすると、1つのファイル(Linuxのファイルに相当)MySo.soなし で1つしか得られないので、リンク時に何も埋め込まれていない場合、Linuxの実行可能ファイルは関数の場所をどのようにして知るのでしょうか。MySo.alibMySo.so

4
文字配列を文字列として使用するにはどうすればよいですか?
Cの文字列は単なる文字配列であることを理解しています。そこで、次のコードを試しましたが、ガベージ出力やプログラムのクラッシュなど、奇妙な結果が得られました。 #include <stdio.h> int main (void) { char str [5] = "hello"; puts(str); } なぜこれが機能しないのですか? できれいにコンパイルされますgcc -std=c17 -pedantic-errors -Wall -Wextra。 注:この投稿は、文字列を宣言するときにNULターミネーター用のスペースを割り当てられなかったことから生じる問題の標準的なFAQとして使用することを目的としています。

2
voidポインター(void *)が2つのデータ型の1つであるかどうかを確認するにはどうすればよいですか?
2 type秒のパラメーターを受け入れたい関数を書いています。 A string(char *) A structureにはn個の要素があります。 そして、これを達成するためにvoid *、パラメーターとして単純なタイプを使用することを考えています。しかし、私はパラメータがどちらかのタイプであるかどうかを安全に確認する方法がわかりません。
10 c  gcc  types  clang 

2
未定義のC ++の動作がCの定義された動作と一致するとどうなりますか?
*.cpp(Cコンパイラではなく)C ++でコンパイルするファイルがあります。含まれている関数は、Cで定義されているように見えるキャスト(最後の行を参照)に依存していますが(間違っている場合は修正してください!)、この特別な型のC ++ではありません。 [...] C++ code [...] struct sockaddr_in sa = {0}; int sockfd = ...; sa.sin_family = AF_INET; sa.sin_port = htons(port); bind(sockfd, (struct sockaddr *)&sa, sizeof sa); [...] C++ code [...] これをC ++ファイルでコンパイルしたので、これは現在定義済みまたは未定義の動作ですか?または*.c、これをファイルに移動して、動作を定義する必要がありますか?

3
Cでの文字列の定義の詳細は何ですか?
私はクラスの1つに対する宿題の質問に回答することになっています。具体的には、Cの特定の配列が文字列と見なされるかどうかを言うことになっています。この記事(https://www.geeksforgeeks.org/strings-in-c-2/)に基づいて、文字列は末尾にヌルターミネータが付いた文字の配列であることを知っています。 私の主なハングアップは、次のような配列について尋ねる質問の一部です。 char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' }; これは明らかに、末尾にヌル終了文字がある文字の配列です。ただし、途中にnullの終了文字があるため、文字列と見なされますか?それは文字列にどのように影響しますか? 編集:コメントに基づいて、私は質問の実際の表現を提供しました: 「次の配列のうち、strcpy()、strncpy()、strcmp()、strncmp()、および同様の文字列関数(すべての適用を示す)への引数として使用するために、「文字列」と見なすことができるのはどれですか? " 編集:質問が曖昧に書かれているようだったので(数人が指摘したように)、それについて教授にメールを送りました。誰かが気になるなら、彼は私に「はい、それは文字列です。重要なのはnull文字があることです。しかし、もちろんそれはすべての文字列操作に影響します。文字列はnull文字で終わります。」

4
Cでのネストされたルートの計算
再帰のみを使用して、次のネストされたルート式を計算するように求められました。 機能する以下のコードを作成しnましたが、目的に応じて1 つの関数と1 つの入力しか使用できず、以前のように2 つ使用することはできませんでした。誰かがこのコードを式を計算する1つの関数に変換するのを手伝ってくれませんか?の関数以外のライブラリは使用できません<math.h>。 n = 10の出力: 1.757932 double rec_sqrt_series(int n, int m) { if (n <= 0) return 0; if (m > n) return 0; return sqrt(m + rec_sqrt_series(n, m + 1)); } double helper(int n) { return rec_sqrt_series(n, 1); }
9 c  recursion  sqrt 

1
Cメインパラメータ
メインパラメータを表示するコードを記述しましたが、コンパイルして「*」プログラムに入力すると、ファイル構造が表示されます。cmdのコマンドは次のようになります。program.exe 1 2 3 * #include <stdio.h> #include <stdlib.h> int main(int argc, char const* argv[]) { for (int i=0; i<argc; i++) printf("%s\n", argv[i]); return 0; } 結果は次のとおりです。 program 1 2 3 program.c program.exe 10-03-20 11-02-20 そして私の質問:プログラムがファイルをリストする代わりに「*」を印刷するように強制することは可能ですか?アドバイスありがとう

2
Cのconst修飾子とC ++のconst修飾子の違いは何ですか?
I'veが見つかりました。コメント、ユーザのRを...: CとC ++は同じ言語ではありません。特に、C constはC ++とは何の関係もありませんconst。 constCのconst修飾子とC ++ の修飾子の違いの1つは、そのデフォルトのリンケージです。 constC ++では、修飾子を使用して名前空間スコープで宣言されたオブジェクトは内部リンケージを持ちますが、Cではconst、グローバルスコープで宣言された修飾子を持つオブジェクト(static前に修飾子を持たないconst)は外部リンケージを持ちます。 しかし、CとC ++の言語間で他にどのように異なるのですか?両方の言語で、どちらも同じ種類の概念と目的を持っていると思いました。 私の質問: Cのconst修飾子とC ++のconst修飾子の違いは何ですか? 回答「ポーラ」はどのようにCとC ++で異なりますか?正確な差異指していない間の文脈におけるCおよびC ++の言語const修飾子を。特定の言語で実行できない、または実行できることのみ。

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