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

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


13
Cのサイズは「int」が2バイトですか、4バイトですか?
Cの整数変数は2バイトまたは4バイトを占めますか?それが依存する要因は何ですか? ほとんどの教科書では、整数変数は2バイトを占めると述べています。しかし、整数の配列の連続したアドレスを出力するプログラムを実行すると、4の違いが表示されます。
169 c  int  byte 


6
Cで、ポインターを解放する前にキャストする人がいるのはなぜですか?
私は古いコードベースで作業しており、free()のほとんどすべての呼び出しはその引数にキャストを使用します。例えば、 free((float *)velocity); free((float *)acceleration); free((char *)label); ここで、各ポインターは対応する(および一致する)タイプです。私はこれをする意味が全くないと思います。これは非常に古いコードなので、K&Rなのかどうか疑問に思います。もしそうなら、私は実際にこれを必要としたかもしれない古いコンパイラをサポートしたいので、それらを削除したくありません。 これらのキャストを使用する技術的な理由はありますか?私はそれらを使用する実用的な理由の多くを見さえしません。解放する直前にデータ型を思い出すポイントは何ですか? 編集:この質問は他の質問の重複ではありません。もう1つの質問は、この質問の特別なケースです。近い投票者がすべての回答を読んでいれば明らかです。 Colophon:「const答え」にチェックマークを付けています。これは、これを行う必要があるのは本当の理由です。ただし、それがANSI Cより前のカスタムであることについての回答(少なくとも一部のプログラマの間で)が、私の場合に使用された理由のようです。ここには多くの人々による良い点がたくさんあります。あなたの貢献に感謝します。
167 c  pointers  casting 

9
マルチスレッドのCまたはC ++プログラミングでvolatileが役に立たないと見なされるのはなぜですか?
私が最近投稿したこの回答で示されているように、私はvolatileマルチスレッドプログラミングコンテキストでのユーティリティ(またはその欠如)について混乱しているようです。 私の理解はこれです。変数にアクセスするコードの制御の流れの外で変数が変更される可能性がある場合は常に、その変数をとして宣言する必要がありますvolatile。シグナルハンドラー、I / Oレジスター、および別のスレッドによって変更された変数はすべて、このような状況を構成します。 したがって、グローバルintがありfoo、foo1つのスレッドによって読み取られ、別のスレッドによって(おそらく適切なマシン命令を使用して)アトミックに設定されている場合、読み取りスレッドは、シグナルハンドラーによって微調整された変数を見るのと同じようにこの状況を認識します。外部ハードウェア条件によって変更されるため、foo宣言する必要がありますvolatile(または、マルチスレッドの状況では、メモリフェンスの負荷でアクセスします。これはおそらくより良い解決策です)。 どのように、どこで私は間違っていますか?

9
Windows(Visual C)のunistd.hに代わるものはありますか?
Unix用に書かれた比較的単純なコンソールプログラムをWindowsプラットフォーム(Visual C ++ 8.0)に移植しています。すべてのソースファイルには、存在しない "unistd.h"が含まれています。それを削除すると、「ランダム」、「ランダム」、および「getopt」のプロトタイプが欠落しているという不満が出ます。私はランダム関数を置き換えることができることを知っています、そして私はgetopt実装を見つけたりハックアップしたりできると確信しています。 しかし、他の人も同じ課題に直面していると思います。私の質問は、「unistd.h」のWindowsへの移植はありますか?少なくとも1つは、ネイティブWindows実装を備えた関数を含みます-パイプやフォークは必要ありません。 編集: 私が必要とするものの置き換えを含む、非常に独自の "unistd.h"を作成できることを知っています。これは、限定セットであるため、特にこの場合です。しかし、それは一般的な問題のように思われるので、誰かが機能のより大きなサブセットのためにすでに作業を行っているのではないかと思っていました。 職場では別のコンパイラや環境に切り替えることはできません-Visual Studioに行き詰まっています。
165 c++  c  windows  portability  unistd.h 

18
最速の部分文字列検索アルゴリズムは何ですか?
わかりました、それで私は馬鹿のように聞こえません私は問題/要件をより明確に述べるつもりです: Needle(パターン)とhaystack(検索するテキスト)はどちらもCスタイルのヌル終了文字列です。長さ情報は提供されません。必要に応じて、計算する必要があります。 関数は、最初の一致へのポインタを返すNULLか、一致が見つからない場合に返す必要があります。 失敗した場合は許可されません。これは、非定数(または大きな定数)のストレージ要件を持つアルゴリズムでは、割り当ての失敗に対するフォールバックケースが必要になることを意味します(フォールバックケアのパフォーマンスは、最悪の場合のパフォーマンスに影響します)。 実装はCで行う必要がありますが、コードなしでアルゴリズム(またはそのようなものへのリンク)を適切に記述してもかまいません。 ...そして「最速」とはどういう意味か: 決定論的なO(n)場所n=干し草の長さ。(しかしO(nm)、より堅牢なアルゴリズムと組み合わせて確定的なO(n)結果を得る場合、通常はローリングハッシュなどのアルゴリズムからのアイデアを使用することが可能です)。 if (!needle[1])特に最も一般的なケースである可能性が高い非常に短い針では、素朴なブルートフォースアルゴリズムよりもパフォーマンスが低下する(ある程度測定できる;数クロックなどで問題ない)。(無条件に重い前処理のオーバーヘッドは悪く、針の可能性を犠牲にして病理学的針の線形係数を改善しようとしています。) 任意の針と干し草を考えると、他の広く実装されているアルゴリズムと比較して、同等またはそれ以上のパフォーマンス(検索時間が50%以上長くなります)。 これらの条件は別として、私は「最速」の定義をオープンエンドのままにしておきます。良い答えは、「最速」を提案しているアプローチを検討する理由を説明する必要があります。 私の現在の実装は、glibcのTwo-Wayの実装よりも(入力に応じて)約10%遅く、8倍速く実行されます。 更新:現在の最適なアルゴリズムは次のとおりです。 長さが1の針には、を使用しますstrchr。 長さが2〜4の針の場合、マシンワードを使用して、次のように2〜4バイトを一度に比較します。16ビットまたは32ビットの整数に針をビットシフトでプリロードし、各反復で干し草の山から古いバイトアウト/新しいバイトを循環させます。 。干し草の各バイトは1回だけ読み取られ、0(文字列の終わり)に対するチェックと1つの16ビットまたは32ビットの比較が行われます。 長さが4より大きい針の場合は、ウィンドウの最後のバイトにのみ適用される不良なシフトテーブル(Boyer-Mooreなど)を使用した双方向アルゴリズムを使用します。1 kbテーブルを初期化するオーバーヘッド(多くの中程度の長さの針の正味の損失になる)を回避するために、シフトテーブルのどのエントリが初期化されるかを示すビット配列(32バイト)を保持します。未設定のビットは、針に表示されることのないバイト値に対応します。針の全長シフトが可能です。 私の頭に残っている大きな質問は次のとおりです。 悪いシフトテーブルをより有効に活用する方法はありますか?Boyer-Mooreは、逆方向(右から左)にスキャンすることでそれを最大限に活用しますが、双方向には左から右へのスキャンが必要です。 一般的なケース(メモリ不足や2次のパフォーマンス条件はない)で見つかった実行可能な候補アルゴリズムは、順序付きアルファベットでの双方向および文字列マッチングの2つだけです。しかし、異なるアルゴリズムが最適である、簡単に検出できるケースはありますか?確かに、O(m)(m針の長さである)空間アルゴリズムの多くは、m<100そのために使用できます。線形時間のみを必要とする可能性がある針の簡単なテストがある場合は、最悪の2次アルゴリズムであるアルゴリズムを使用することもできます。 ボーナスポイント: 針と干し草の両方が整形式のUTF-8であると想定して、パフォーマンスを向上させることができますか?(バイト長が異なる文字では、整形式であることにより、needleとhaystackの間に文字列の整列要件が課せられ、不一致のヘッドバイトが検出されたときに自動的に2-4バイトのシフトが可能になります。最大の接尾辞の計算、適切な接尾辞のシフトなどにより、すでにさまざまなアルゴリズムが提供されていますか?) 注:私はそこにあるほとんどのアルゴリズムをよく知っていますが、実際のパフォーマンスはそうではありません。ここに良い参照がありますので、人々は私にコメント/回答としてアルゴリズムに関する参照を与え続けません:http : //www-igm.univ-mlv.fr/~lecroq/string/index.html
165 c  algorithm  string  substring 

4
なぜi ++があるのか​​。私 - ; お互いの直後?
1997年にリリースされたnmapのソースコードを見ていたところ、コードのこのセクションが少し奇妙に見えました。 int i=0, j=0,start,end; char *expr = strdup(origexpr); ports = safe_malloc(65536 * sizeof(short)); i++; /* <<<<<< */ i--; /* <<<<<< */ for(;j < exlen; j++) if (expr[j] != ' ') expr[i++] = expr[j]; expr[i] = '\0'; なぜあなたは持っているでしょうi++;し、次にi--;右のお互いの後に?iされ0、その後、i++ターンiします1。その後、i--ターンiへ0。 元のソースコードへのリンク。検索する: i++; i--; 誰がこれが何のためにあるのか説明できますか?
164 c  nmap 

20
「for(;;)」は「while(TRUE)」よりも高速ですか?そうでない場合、なぜ人々はそれを使うのですか?
for (;;) { //Something to be done repeatedly } こういうのがよく使われているのを見てきましたが、なかなかおかしいと思いますが…とか、そういうふうに言った方がわかりやすいと思いませんwhile(true)か? 私は(プログラマーの多くが暗号コードに頼る理由と同じように)これがわずかなマージンであると思っていますか? なぜ、そしてそれは本当に価値があるのでしょうか?もしそうなら、なぜそれをこのように定義しないのですか: #define while(true) for(;;) 参照:どちらが速いか:while(1)またはwhile(2)?

4
警告:組み込み関数 'xyz'の互換性のない暗黙の宣言
いくつかのバイナリをコンパイルすると、次のような警告が表示されます。 warning: incompatible implicit declaration of built-in function ‘strcpy’ warning: incompatible implicit declaration of built-in function ‘strlen’ warning: incompatible implicit declaration of built-in function ‘exit’ これを解決するために、私は追加しました #include <stdlib.h> この警告に関連付けられているCファイルの上部、および次のフラグを使用してコンパイルします。 CFLAGS = -fno-builtin-exit -fno-builtin-strcat -fno-builtin-strncat -fno-builtin-strcpy -fno-builtin-strlen -fno-builtin-calloc 私はGCC 4.1.2を使用しています: $ gcc --version gcc (GCC) 4.1.2 20080704 これらの警告を解決するにはどうすればよいですか?
164 c  gcc  gcc-warning 



5
gccの__attribute __((packed))/ #pragma packは安全ではありませんか?
Cでは、コンパイラーは構造体のメンバーを宣言された順序でレイアウトし、メンバー間に、または最後のメンバーの後に挿入される可能性のある埋め込みバイトを使用して、各メンバーが適切に配置されるようにします。 gccは言語拡張を提供します__attribute__((packed))。これは、パディングを挿入しないようにコンパイラーに指示し、構造体メンバーを誤って調整できるようにします。たとえば、システムが通常すべてのintオブジェクトに4バイトアラインメントを必要とする場合、構造体メンバーが奇数のオフセットに割り当てられる__attribute__((packed))可能性がありintます。 gccドキュメントの引用: 「packed」属性は、「aligned」属性でより大きな値を指定しない限り、変数または構造体フィールドが可能な限り最小のアライメントを持つことを指定します。変数には1バイト、フィールドには1ビットです。 コンパイラーは(一部のプラットフォームでは)一度に1バイトずつ誤って配置されたメンバーにアクセスする必要があるため、この拡張機能を使用すると、データ要件は小さくなりますが、コードは遅くなります。 しかし、これが安全でないケースはありますか?コンパイラーは常に、パックされた構造体の誤って配置されたメンバーにアクセスするための正しい(低速ですが)コードを生成しますか?すべての場合にそれを行うことは可能ですか?
164 c  gcc  pragma-pack 

13
DはJavaとC ++の信頼できる代替品ですか?[閉まっている]
現在のところ、この質問は、Q&A形式には適していません。事実、参考文献、専門知識によって回答が裏付けられることを期待していますが、この質問は、討論、議論、投票、または拡張ディスカッションを求める可能性があります。この質問が改善され、場合によっては再開できると思われる場合は、ヘルプセンターにアクセスしてください。 7年前休業。 あるD言語は JavaやC ++に信頼できる代替?信頼できる代替品になるには何が必要ですか?わざわざ学習する必要がありますか?それは伝道に値しますか? 私が尋ねる主な理由は、新しいC ++標準(c ++ 0x)がほぼここにあるため、言語が理解できなくなったという点で、言語が戻ってこないという点をはるかに超えていることは明らかです。C / C ++が死ぬことはないことは知っていますが、ある時点で先に進む必要があります。COBOLでさえその日があり、Javaは多くの点でC ++を元に戻しました。次は何ですか?Dは請求書を満たしますか?
163 java  c++  c  d 


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