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

Cは、オペレーティングシステム、ゲーム、その他の高性能作業に使用される汎用のコンピュータープログラミング言語です。

2
構造体にtypedefを使用する理由
C(ANSI、C99など)では、構造体は独自の名前空間に存在します。リンクリストの構造体は、次のようになります。 struct my_buffer_type { struct my_buffer_type * next; struct my_buffer_type * prev; void * data; }; しかし、ほとんどのCプログラマーが次のような構造体を自動的にtypdefすることは非常に自然に思えます typedef struct tag_buffer_type { struct tag_buffer_type * next; struct tag_buffer_type * prev; void * data; } my_buffer_type; そして、通常の型のように構造体を参照しget_next_element(my_buffer_type * ptr)ます。 今、私の質問は次のとおりです。これには特定の理由がありますか? ウィキペディアによると、http://en.wikipedia.org/wiki/Typedef#Usage_concerns 一部の人々は、typedefの広範な使用に反対しています。ほとんどの引数は、typedefが変数の実際のデータ型を単純に隠すという考えに基づいています。たとえば、LinuxカーネルハッカーでありドキュメンタリーであるGreg Kroah-Hartmanは、関数プロトタイプ宣言以外の目的での使用を推奨していません。彼は、この慣行はコードを不必要に難読化するだけでなく、プログラマーが単純に大きなタイプの構造であると誤って誤用する可能性もあると主張します。[4] typedefを使用すると、コードの保守が簡単になると主張する人もいます。K&Rは、typedefを使用する2つの理由があると述べています。まず、プログラムの移植性を高める手段を提供します。プログラムのソースファイル全体に現れるすべてのタイプを変更する代わりに、変更する必要があるtypedefステートメントは1つだけです。第二に、typedefは複雑な宣言を理解しやすくします。 場合によってはstructtypedefされた構造体を使用しない別の名前空間を使用することで十分なメリットがないのか、他にもCプログラミング文化がいくつかあるので(Windows CプログラミングにはLinux Cプログラミングとは異なる伝統があります)私が知らない伝統。 それから私は歴史的な考察に興味があります(前任者、Cの最初のバージョン)。


3
OO Cのパブリック関数とプライベート関数の一般的な命名規則は何ですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 短い質問 OO Cプロジェクトの「パブリック」メンバーと「プライベート」メンバーに名前を付ける一般的な方法はありますか? 背景 私は、パブリックおよびプライベートメンバーがC言語に実際に存在しないことを完全に理解しています。ただし、ほとんどのCプログラマーと同様に、OO設計を維持するためにメンバーをパブリックまたはプライベートとして扱います。典型的なオブジェクト指向の方法に加えて、私は私がされている方法を区別することが容易になり、パターン(以下の例を参照)、以下の私の自己を発見したもので、より少ないチェックを有することができるプライベートメンバー対外の世界のために/より効率的などです...そのようなことに対して標準またはベストプラクティスが存在するか、またはこれにアプローチするための良い方法は私の例ですか? ヘッダーの例 #ifndef _MODULE_X_H_ #define _MODULE_X_H_ bool MOD_X_get_variable_x(void); void MOD_X_set_variable_x(bool); #endif /* _MODULE_X_H_ */ サンプルソース // Module Identifier: MOD_X #include "module_x.h" // Private prototypes static void mod_x_do_something_cool(void); static void mod_x_do_something_else_cool(void); // Private Variables static bool var_x; // Public Functions - Note the upper …

2
従来のプレーンなCプロジェクトへの単体テストの追加
タイトルはそれをすべて言います。私の会社は、完全にプレーンCで記述されたマイクロコントローラーデバイス用のレガシーファームウェアプロジェクトを再利用しています。 明らかに間違っており、変更が必要な部分があります。C#/ TDDのバックグラウンドから来たので、機能を変更しないことを保証するためのテストなしでランダムにリファクタリングするというアイデアは好きではありません。また、バグを見つけるのが難しいことは、わずかな変更(多くの場合、回帰テストを使用した場合に修正されると思います)によって導入されたことがわかりました。これらの間違いを避けるために、多くの注意を払う必要があります。コードの周りの多くのグローバルを追跡するのは難しいです。 要約する: リファクタリングする前に、既存の密結合コードに単体テストをどのように追加しますか? どのツールをお勧めしますか?(それほど重要ではありませんが、知っておくといいです) 私はこのコードの作成には直接関与していません(私の責任はさまざまな方法でデバイスと対話するアプリです)が、使用できる可能性がある場合、良いプログラミングの原則が残されていると悪いでしょう。

7
Cからは、より高いレベルの言語では学べない原則は何ですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 3年前に閉店しました。 Cはプログラミングの背後にある原則を学ぶのに適した言語だと思います。Rubyのような高レベルな言語から「魔法のように」なっている低レベルの言語で何を学べると思いますか?
11 c  low-level 

5
3つの数値を比較する簡単でわかりやすい方法
if動作するsのシーケンスを含むコードをいくつか持っていますが、面倒です。基本的に、3つの整数のうち最大のものを選択し、選択されたことを示すステータスフラグを設定します。私の現在のコードは次のようになります。 a = countAs(); b = countBs(); c = countCs(); if (a > b && a > c) status = MOSTLY_A; else if (b > a && b > c) status = MOSTLY_B; else if (c > a && c > b) status = MOSTLY_C; else status = DONT_KNOW; このパターンは数回発生し、長い変数名では、それぞれifが正しいことを視覚的に確認するのが少し難しくなります。これを行うためのより良い、より明確な方法があるかもしれないと感じています。誰でも何か提案できますか? …
11 algorithms  c 

2
MCUプログラミングにおけるRTOSとベアメタルの利点は?
注:この質問では、2つのRTOSについて具体的に言及していますが、より一般的であり、以前に組み込みRTOSのCコードを記述し、MCUでソフトウェアを直接実行したことがある人なら誰でも回答できます。 組み込みRTOSの詳細を学び、そのためのアプリケーションを作成することに興味があります。現在、EmboxとRIOTを検討しています。それらはオープンソースで、モダンで、アクティブで、優れたドキュメントがあるようです。私の目標は2つのフェーズです。フェーズ1は、これらのOSをコンパイルしてMCU(おそらくAVRまたはARM)にフラッシュする方法を見つけ出すことです。フェーズ2では、単純なCプログラム(基本的にはヘッドレスデーモン)を作成します。これは、「趣味アプリ」として時間とともに進化します。次に、このプログラムを同じMCUにフラッシュ/展開することで、Embox / RIOTとその上にあるアプリで構成されるアプリスタックを正常に展開します。 最終的に行き止まりに至る道を進む前に、C /アセンブラーで書かれMCUにフラッシュされたリアルタイムアプリがRTOSを実際に必要としない理由を説明するのに非常に役立つこの記事を偶然見つけました。 。 だから今、私は本当に混乱していて、コンピューティング理論の私の基本的な理解に疑問を抱いています。私は、最初にEmbox / RIOTを使用するかどうかの決定をしようとしていると思います。 コースを継続し、両方のOS +アプリのMCUで「アプリスタック」を使用します。または 記事の警告に注意し、MCUでアプリ「ベアメタル」を実行してください 明らかに、前者はより多くの作業であるため、そのルートに進むのに十分な理由/報酬が必要です。だから私は尋ねる:これらの(および同様の)組み込みRTOSがMCU / Cアプリ開発者に提供する本当の利点は何ですか?RTOSを使用することで、Cアプリはどのような特定の機能の恩恵を受けることができますか(おそらく、車輪を再発明しないことによって?)RTOSを捨ててベアメタルに移行すると何が失われますか? ここでは具体的な例を求めています。RTOSのウィキペディアエントリにアクセスしたときに得られるメディアの誇大広告ではありません;-)

5
Cの静的ライブラリは眉をひそめていますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 5年前に閉鎖されました。 共有ライブラリを持つための2つの引数があります。 ディスク容量を削減するのに役立ちます。 共有ライブラリが更新されると、それに依存するすべてのバイナリが更新を取得します。 共有ライブラリには主に1つの欠点があります。 彼らは依存性地獄を導入することができます。 デスクトップコンピューターでは、第1の利点はもはや成り立ちません。最近では、ディスク容量の無駄遣いはあまり問題になりません。 静的バイナリを使用すると、パッケージマネージャーの質が向上します。つまり、依存関係の地獄は過去のものになります。プログラムを追加すると、単にバイナリが追加されます。最終的には、ファイルを処理するためのフォルダー。プログラムを削除すると、単にこのファイルが削除されます。依存関係?消えた。 2番目の利点はまだありますが、デスクトップコンピューター上の静的バイナリの利点はそれよりも重要だと思います。つまり、Goのような新しい言語でさえ、共有ライブラリの利点にもかかわらず、すべてのバイナリをコンパイルします。これは利便性のためです。 共有ライブラリの主な利点の1つはもはや大したことではないので、Cの静的ライブラリはまだ嫌われていますか?もしそうなら、なぜですか?
11 c  compiler 

4
ポインターのインデックス付け
現在、「Numerical Recipes in C」というタイトルの本を読んでいます。この本では、著者は、1で始まるインデックスがある場合に特定のアルゴリズムが本質的にどのように機能するかを詳しく説明しています(私は彼の議論に完全には従わず、この投稿のポイントではありません)が、Cは常に0で始まる配列にインデックスを付けますこれを回避するために、彼は単に割り当て後にポインタをデクリメントすることを提案します、例えば: float *a = malloc(size); a--; これは、1で始まるインデックスを持つポインターを効果的に提供し、その後で解放されると彼は言います: free(a + 1); ただし、私が知る限り、これはC標準による未定義の動作です。これは明らかにHPCコミュニティ内で非常に評判の良い本なので、彼の言っていることを単に無視したくはありませんが、割り当てられた範囲外のポインターを単にデクリメントすることは私には非常に大雑把です。これはCの「許可された」動作ですか?私はgccとiccの両方を使用してテストしましたが、これらの結果はどちらも私が何も心配していないことを示しているように見えますが、絶対にポジティブになりたいです。
11 c  pointers 

2
(C)異なるコンパイラで作成されたオブジェクトファイルはバイナリ互換ですか?
C ++コンパイラは互いに互換性がないことを理解しています。ただし、特にCについては、このトピックに関する情報を見つけることができませんでした。私は、C標準にはコンパイラが適切に実装できる余地を残していることを知っています。たとえば、ほとんどの(すべて?)データ型のサイズとアライメントは、最小限の保証のために実装定義で保存されます。したがって、2つのコンパイラー(または同じコンパイラーの2つのバージョン)は、多くの詳細について意見が一致しません。 異なるコンパイラでコンパイルされた2つのオブジェクトファイルが実際に適切にリンクされるという保証はないという考え方で正しいですか?たとえば、ポインタのサイズは、一方のオブジェクトファイルでは32ビット、もう一方のファイルでは64ビットになります。しかし、そうだとすると、なぜCライブラリはプリコンパイルされた形で配布されるのでしょうか?私が使用したのと同じコンパイラー(例えばgcc)を使用する、またはバイナリー互換性を確保するために使用されている事実上の標準を使用するという期待はありますか?そして、C言語オブジェクトファイルとリンクするときに、外国語インターフェイスを備えた他の言語は、物事が適切に整列することをどのように保証しますか?
11 c  compiler 

1
EOF(ファイルの終わり)文字をchar型に格納する
EOF値を保持できるようにEOF値を十分に大きくするために、EOFを保持する変数に使用する必要があるデニスリッチーのThe C Programming Language本を読みました。ただし、次のコードは正常に機能します。intchar #include<stdio.h> main() { char c; c=getchar(); while(c!=EOF) { putchar(c); c=getchar(); } } 入力がなくなると、getcharEOFを返します。また、上記のプログラムではc、char型の変数が正常に保持できます。 なぜこれが機能するのですか?上記の本の説明によると、コードは機能しません。
11 c 

1
CでのPIDループのプログラミング
私は電気のエンジニアであり、デジタルの世界に突入し、私が学んでいる間に学びました。次の図に示すように、PID(比例-積分-微分)ループを実行するTIプロセッサをプログラミングしています。 それについても説明します。 非反転端子が接地された負帰還オペアンプ。マイナス端子から入力します。フィードバックループは、抵抗器と並列のRE直列回路と、コンデンサと並列のRE直列回路です。 この回路をCコードに変換する方法はありますか?私はこれに関する私の要素から少し外れているので、ヘルプを使用できます。
11 c 

3
低遅延Unix / Linux
ほとんどの低レイテンシ/高頻度のプログラミングジョブ(ジョブの仕様に基づく)は、UNIXプラットフォームに実装されているようです。多くの仕様で、彼らは「低遅延linux」タイプの経験を持つ人々に特別な要求をしています。 これがリアルタイムのLinux OSを意味しないと仮定すると、人々はこれが何を指しているのか私に助けを与えることができますか?CPUアフィニティをスレッドに設定できることは知っていますが、それ以上のことを要求していると思います。 カーネルのチューニング?(とにかく、ソーラーフレアのようなメーカーはカーネルバイパスネットワークカードを製造していると聞きましたが)? DMAまたはプロセス間の共有メモリはどうですか?人々が私に簡単なアイデアを与えてくれれば、Googleで調査をすることができます。 (この質問には、おそらく高頻度取引に精通した人が必要です)
11 c++  c  performance  linux  latency 

3
scanfがscanfと呼ばれるのはなぜですか?(printfと同じ。)
Cプログラミング言語で、フォーマットされた入力を読み取る関数が「readf」ではなく「scanf」と呼ばれたのはなぜなのでしょうか。私はそれが以前の言語から派生したと思うので、その場合、なぜ以前の言語でそのように命名されたのですか?(再帰) また、なぜ「writef」ではなく「printf」なのでしょうか?C以外の言語で、「表示」ではなく「印刷」または「書き込み」を行う理由

7
Cプログラマは何を知っているべきですか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 6年前に閉鎖されました。 すべてのまともなCプログラマーが知っておくべき/知っておくべき概念/技術/言語機能は何ですか(一般的なソフトウェアエンジニアリングなどを除き、C固有のもののみに焦点を合わせます)。私のC知識の可能性のあるギャップを埋めることができるように知りたいです。

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