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

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

1
組み込みシステムプロジェクトにSEアジア文字セットを含めるための絶対的な最小要件は何ですか?
私は、組み込みコンピュータシステムを製造する製品に統合し始めた会社で働いています。当社には非常に幅広い製品があり、それらは世界中に配布されています。さらに、システムにフラッシュされたファームウェアに応じて複数の目的に使用できる統合ボードをいくつか設計しました。このように、さまざまな製品のコンピューターハードウェアを再設計する必要はありません。特定の製品のニーズに合わせてファームウェアレイヤーを書き直すだけです。 これらのハードウェアの制限のため、ハードウェアの変更は議会の行為を取りますが、新しいソフトウェアの作成ははるかに簡単です。 当社の製品の1つには、以前に実装する必要がなかった新しい要件があります。これは、ユーザー入力テキストの必要性です。 現在、国際的なテキストをリソースに保存することができ、必要なフォント文字のみがビットマップ画像にコンパイルされています。これは、言語セット全体のごく一部しか使用していないため、中国語や日本語などの表意文字の言語を最小限のスペースに保存できることを意味します。 この新製品ではユーザーがテキストを入力する必要があるため、広範な文字セットを実装する必要があります。主にPC開発者として、私はASCII、Unicode、UTF-8などにかなり精通していますが、ボード上にFRAMが限られているため、これらの言語の完全な文字セットを実装することはできません。フォントデータを保存します。 私の経営陣は、表意文字の多い言語に使用できる最小限の文字セットがあることを望んでいます。日本語の発音記号(ひらがな?)があると思います。中国語、韓国語、ベトナム語などの言語にも同様の発音記号がありますか?その質問に対する答えは「絶対に、いいえ」であると確信していますが、質問する価値のある質問です。 経営陣は、一般的に使用されているすべての主要言語をカバーする約8,000文字の限られた文字セットのみを使用できるという「ソフト」要件を設定しています。これが不可能な場合は、限られたハードウェアリソースに基づいてニーズを満たすために、何らかの形の代替方法を探す必要があります。 この問題は以前に解決されていなければならないと確信しています。広範なフォントおよび文字エンコードシステムを必要とする一方で、このような制約内で作業した経験はありますか?もしそうなら、あなたはどんな知恵のナゲットを提供できますか?

3
条件付きコンパイルのショートカットとしてC / C ++マクロを使用するのは良い習慣ですか?
コードにいくつかのタイプの出力メッセージが必要だとしましょう。それらの1つはDEBUG、コードがデバッグモードでコンパイルされたときにのみ出力されます。 通常私は #ifdef DEBUG std::cout << "Debug message" << std::endl; #endif これはかなり面倒で、多くの場所で使用するのは面倒です。 コードスニペットのマクロを定義することをお勧めします。このように使用しますか? MSG_DEBUG("Debug message") または、マクロなしでそれを処理する他のよりエレガントな方法はありますか?異なるプロジェクトで両方の言語を使用しているため、CとC ++の両方で可能なソリューションに興味があります。
13 c++  c  macros 

4
現代のCの書き方について、一般に受け入れられているガイドラインはありますか?
私はJava / Groovyの強力なバックグラウンドを持ち、管理ソフトウェア用の非常に大きなCコードベースを維持するチームに割り当てられました。 データベース内のblobの処理やPDFおよびExcelでのレポートの生成など、いくつかの問題点はJava Webサービスに外部化されています。 ただし、Java開発者として、コードのいくつかの側面に少し混乱しています。 それは冗長です(特に「例外」を扱う場合) 巨大なメソッドがたくさんあります(2000行以上のメソッド) 高度なデータ構造はありません(リスト、セット、およびマップをたくさん見逃しています) 懸念事項の分離なし(SQLはコード全体でうれしそうに混合されています) その結果、ビジネスは大量の技術コードに隠されており、Object Orientedと関数型プログラミングのピンチで形作られた私の脳は楽ではないと感じています。 プロジェクトの良い面は、コードが単純であることです。フレームワーク、実行時のバイトコード操作、AOPはありません。また、サーバーは、Javaが「hello world」を吐き出すのに必要なメモリよりも少ないメモリを使用することにより、1台のマシンで10000人以上のユーザーに同時に応答できます。 私は、一般に受け入れられている現代の原則に従ってCコードを書く方法を学びたいです。現代のCをどのように記述し構造化するかについて、一般に受け入れられている原則はありますか? 「Effective Java」本に相当するものに少し似ていますが、C用です。 回答とコメントに照らして編集: 私は自分の考え方をCコードに適合させ、OOPにミラーリングしようとはしません。 コメントから推奨されるコーディングスタイルガイド(The GNU Coding StandardsおよびThe Linux Kernel Coding Style)をスキャンして読み始めました。 次に、このコードスタイルを同僚に提案しようとします。最も難しいのは、同僚に、巨大なメソッドを小さなパーツに分割し、同じ4行のエラー処理コードを繰り返すことをメソッドの助けによって回避できることを納得させることです。
13 c  maintenance 

4
C構造体は、関数を持っているように動作できますか?
struct構造体がメンバーを持つことはできますが、関数を持つことはできないCとs を使用します。簡単にするために、名前を付けた文字列の構造体を作成し、文字列のインデックスと位置の文字を置き換える文字をどこでstrできるようにするかを想定します。構造体は関数を持たないか、この動作を実装し、構造体が実際に構造体だけが新しい構造体にコピーして更新する(単純な)関数を持つことができることを模倣する方法がまだあるので、これは決して不可能でしょうか?それができるフィールド?str.replace(int i, char c)ici したがってreplace、アクセスされたときなどに更新される新しい構造体を指す構造体の3番目のメンバーである可能性があります。できますか?それとも、私の意図を妨げる組み込みのものや、何らかの理論やパラダイムがありますか? 背景は、私がCコードを書いていることであり、OOP言語のライブラリビルトインであることがわかっている関数を再発明し、OOPは文字列とコマンドを操作する良い方法だと思います。

4
cに構造体をパックする標準的な方法または標準的な代替手段はありますか?
CIでのプログラミングでは、GCC __attribute__((__packed__))属性を使用して構造体をパックすることが非常に重要であることがわかったので、揮発性メモリの構造化されたチャンクをバイトの配列に簡単に変換して、バスを介して送信したり、ストレージに保存したり、レジスタのブロックに適用したりできます。パックされた構造体は、バイトの配列として扱われる場合、パディングを含まないことを保証します。これは無駄であり、セキュリティリスクの可能性があり、ハードウェアとのインターフェースの場合に互換性がありません。 すべてのCコンパイラで動作する構造体をパックするための標準はありませんか?そうでない場合、私はこれがシステムプログラミングにとって重要な機能であると考える際に外れ値ですか?C言語の初期のユーザーは、構造体をパックする必要性を見つけられなかったか、何らかの代替手段がありましたか?

6
C配列の長さが0にできないのはなぜですか?
C11標準では、サイズと可変長の両方の配列は「ゼロより大きい値を持つ必要がある」としています。長さ0を許可しない理由は何ですか? 特に可変長配列の場合、時々ゼロのサイズを設定することは完全に理にかなっています。また、静的配列のサイズがマクロまたはビルド構成オプションからのものである場合にも役立ちます。 興味深いことに、GCC(およびclang)は、長さゼロの配列を許可する拡張機能を提供します。Javaでは、長さゼロの配列も使用できます。
13 c  array 

4
CPUキャッシュ(C)を最適化する際に重要なことは何ですか?
これら 2つの質問を読んで、メモリ内の大量のデータを扱う場合、CPUキャッシュの動作を理解することが重要になることがわかります。最適化ツールボックスに別のツールを追加するためのキャッシュの仕組みを理解したいと思います。 CPUキャッシュがうまく機能するように、キャッシュを賢明に使用するコードを書くことができる中核となる点は何ですか?これに関連して、コードのプロファイルを作成して、キャッシュの使用が悪いために速度が低下していないかどうかを確認する方法はありますか?

5
エラーのチェックと処理を改善するにはどうすればよいですか?
最近、私は適切なチェック量と適切な方法とは何かを理解するのに苦労しています。 これに関していくつか質問があります。 エラー(不正な入力、不正な状態など)をチェックする適切な方法は何ですか?エラーを明示的にチェックするか、最終コードから最適化できるアサートなどの関数を使用する方が良いでしょうか?とにかくほとんどの状況で実行されるべきではない多くの余分なコードでプログラムを乱雑に明示的にチェックしたい気がします-そして、ほとんどのエラーは言うまでもなく打ち切り/終了の失敗に終わります。中止するために、明示的なチェックで関数を混乱させるのはなぜですか?私はアサートとエラーの明示的なチェックを探しましたが、どちらを行うべきかを本当に説明するものはほとんど見つかりませんでした。 ほとんどの人は、「アサートを使用して論理エラーをチェックし、明示的なチェックを使用して他の障害をチェックします」と言います。しかし、これは私たちをそれほど遠くに連れて行っていないようです。これが実現可能であると言えますか: Malloc returning null, check explictly API user inserting odd input for functions, use asserts これにより、エラーチェックが改善されますか?他に何ができますか?私は本当に、より良い「プロフェッショナルな」コードを改善し、書きたいと思っています。
13 c  testing  assertions 

2
glibcがGCCとは別に維持されるのはなぜですか?
GCCはCコンパイラです。GlibcはCライブラリです。しかし、コンパイラーとC実装として一緒にバンドルされた標準ライブラリーは絶対に必要ではないでしょうか? 例えば、CライブラリのようなABIおよびコンパイラの特定のものが含まれ<limits.h>、<stdint.h>、、などをどのコンパイラとAPIの間で異なります。また、「メイン関数を呼び出す方法」などの詳細もコンパイラに依存しますが、実際にはそれらの詳細はlibc.soLinuxシステムで提供されます。たとえば、int8バイトを使用するなど、別のABIで動作するようにコンパイラを変更すると、Cライブラリは機能しなくなり<limits.h>ます。
13 c  gcc 

6
「Cでアセンブラーを記述します。」なぜ低レベル言語の機械語翻訳機を高レベル言語で書くのですか?
私のマイクロプロセッサクラスのインストラクターが私たちに課題を与えて言った: 「Cでアセンブラーを作成します。」-私の最愛の教授 だから、私には少し非論理的に思えた。 私が間違っていなければ、アセンブリ言語は、機械語コードから高レベル言語の旅への最初のステップです。つまり、Cはアセンブリよりも高レベルの言語です。では、Cでアセンブラーを書く意味は何ですか?C言語がないのに、彼らは過去何をしていたのですか?彼らはマシンコードでアセンブラーを書いていましたか? 低レベル言語用の機械語翻訳を高レベル言語で書くのは意味がありません。 たとえば、そのアーキテクチャ用のCコンパイラさえない、まったく新しいマイクロプロセッサアーキテクチャを作成したとします。Cで記述されたアセンブラは、新しいアーキテクチャをシミュレートできますか?私はそれが役に立たないかどうかを意味しますか? ところで、GNU AssemblerとNetwide AssemblerはCで書かれていることを知っています。また、なぜそれらがCで書かれているのだろうかと思っています。 最後に、これは私たちの教授が私たちに与えた単純なアセンブラのソースコードの例です。 // to compile, gcc assembler.c -o assembler // No error check is provided. // Variable names cannot start with 0-9. // hexadecimals are twos complement. // first address of the code section is zero, data section follows the code section. …

4
命名の競合を回避するCプロジェクト
中規模のCライブラリプロジェクトの関数命名規則に関する実用的なアドバイスを見つけるのに苦労しています。私のライブラリプロジェクトは、独自のヘッダーを持ついくつかのモジュールとサブモジュールに分割され、大まかにOOスタイルに従います(すべての関数は、グローバルなどではなく、最初の引数として特定の構造体を取ります)。次のように配置します。 MyLib - Foo - foo.h - foo_internal.h - some_foo_action.c - another_foo_action.c - Baz - baz.h - some_baz_action.c - Bar - bar.h - bar_internal.h - some_bar_action.c 一般的に、関数は大きすぎて(たとえば)固執some_foo_actionしanother_foo_action、1つのfoo.c実装ファイルに入れて、ほとんどの関数を静的にして、1日で呼び出します。 ユーザーのクライアントプログラムとの競合を避けるために、ライブラリを構築するときに内部(「モジュールプライベート」)シンボルを削除することもできますが、問題はライブラリ内のシンボルの名前の付け方ですか?これまで私はやってきた: struct MyLibFoo; void MyLibFooSomeAction(MyLibFoo *foo, ...); struct MyLibBar; void MyLibBarAnAction(MyLibBar *bar, ...); // Submodule struct MyLibFooBaz; void MyLibFooBazAnotherAction(MyLibFooBaz *baz, ...); しかし、私は(例よりはるかに長い)クレイジーな長いシンボル名になってしまいました。名前の前に「偽の名前空間」を付けない場合、モジュールの内部シンボル名はすべて衝突します。 注:キャメルケース/パスカルのケースなどは気にせず、名前だけを気にします。

8
C文字列は常にヌルで終了しますか、それともプラットフォームに依存しますか?
現在、私は組み込みシステムで作業しており、オペレーティングシステムなしでマイクロプロセッサに文字列を実装する方法を考えています。これまでのところ、私がやっていることは、NULLで終了する文字ポインタを持つという考えを使用し、NULLが終了を示す文字列として扱うことです。私はこれがかなり一般的であることを知っていますが、これが当てはまることを常に期待できますか? 私が尋ねる理由は、ある時点でリアルタイムオペレーティングシステムを使用することを考えていたため、現在のコードを可能な限り再利用したいからです。そこにあるさまざまな選択肢について、文字列が同じように機能することをほとんど期待できますか? 私の場合はもっと具体的にしましょう。私は、シリアルポート経由でコマンドを受け取って処理するシステムを実装しています。コマンド処理コードを同じにして、RTOS(コマンドを含む)で作成された文字列オブジェクトがすべてNULLで終了することを期待できますか?または、OSに基づいて異なりますか? 更新 この質問を見るようにアドバイスされた後、私はそれが私が尋ねていることを正確に答えていないことを決定しました。質問自体は、文字列の長さを常に渡す必要があるかどうかを尋ねています。これは私が尋ねているものとはまったく異なり、答えの一部には有用な情報が含まれていましたが、私が探しているものではありません。なぜか理由を与えるためにそこに見えた答えではないヌル文字で文字列を終了させます。私が尋ねているものとの違いは、異なるプラットフォームの生まれた文字列がnullで独自の文字列を終了することを多かれ少なかれ期待できるかどうか、それが理にかなっている場合は、すべてのプラットフォームを試してみる必要はありません。

4
すべてのCプログラマーが認識しなければならないセキュリティリスク/脆弱性は何ですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 4年前に閉鎖されました。 高度なプログラミング言語の十分にテストされ、実証されたAPIを使用するのではなく、ハードウェアに密接に接触することから生じる多くのセキュリティリスクがあります。Javaなどの言語よりもCでバッファオーバーフローを引き起こす方がはるかに簡単です。 すべてのCプログラマが知っておくべきリスクまたは脆弱性(バッファオーバーフローなど)とは何ですか(Cプログラマに関連するIEの脆弱性)。これらはどのような問題につながる可能性がありますか?それらを回避する方法、およびプログラムでこれらを発生させる一般的な間違いは何ですか?

3
新しいCプロジェクトは、非常に古いC標準(20年以上前、つまりC89)をターゲットにする必要がありますか?
ときどき、非常に古いC標準(通常はC89)をターゲットとする、比較的新しく、オープンソースの主要なCプロジェクトを目にします。例はsystemdです。これらのプロジェクトには実力のある優秀な人材がいるので、おそらく私には分からないこの決定の背後にある合理的な根拠があるでしょう。疑いの利点は別として、論理的結論はFORTRANがCよりも優れており、COBOLはFORTRANよりも優れているという論理的な結論になるため、理論的根拠は「より古く標準化されたものは常により移植性が高く、より優れている」ように思われます。 新しいCプロジェクトが非常に古いC標準を対象とすることはいつ、そしてなぜ正当化されますか? ユーザーのシステムが絶対にCコンパイラーを更新してはならないが、そうでなければ新しいソフトウェアを自由にインストールできるシナリオを想像することはできません。たとえば、DebianのLTSバージョンには、C99およびC11の一部をサポートするgcc 4.6パッケージがあります。しかし、奇妙なシナリオが存在しなければならず、systemdのようなプログラムがそれらのユーザーをターゲットにしていると思います。 私が想像できる最も合理的なユースケースは、ユーザーがC89コンパイラーのみが利用できるエキゾチックなアーキテクチャーを持っていると予想されるが、彼らは完全に新しいソフトウェアをインストールすることをいとわない場合です。命令セットアーキテクチャの多様性の低下を考えると、それは過度に仮説的なシナリオのように思えますが、私にはわかりません。
12 c  standards 

5
組み込みシステムの単一アレイに膨大な量のスタックを割り当てることには欠点がありますか?
通常、一部のデータをグローバルにするか、静的にするか、スタック上に置くかを決定するのに問題はありません(ここでは動的な割り当てがないため、ヒープを使用しません)。このようないくつかのQ / Aも読んだことがありますが、システムメモリに比べて膨大な量のデータが含まれるため、私の質問はより具体的です。 改善しようとしている既存のコード(設計、考えられる問題、パフォーマンスなど)を扱っています。このコードは、RAMが4KBのみの古い8ビットMCUで実行されます。このコードでは、ほぼ1KBのアレイの使用に直面しています(はい、4KB RAMシステムでは1KB)。この配列の各バイトが使用されますが、それは問題ではありません。問題は、この配列は宣言されているファイル内の静的配列であるため、そのライフサイクルはプログラムの配列と同じである(つまり、無限と見なすことができる)ということです。 ただし、コードを読んだ後、この配列には無限のライフサイクルが必要ないことがわかりました。完全に手続き的な方法で構築および処理されるため、使用する関数でのみ宣言できるはずです。この方法ではスタック上にあるため、この1KBのRAMを節約します。 質問:これは良いアイデアでしょうか?設計の観点から、無限/グローバルライフサイクルを必要としない場合、スタックに属します。しかし、これは4KBのうち1KBですが、このようにRAMの25%を割り当てるという欠点はありませんか?(スタックの50%以上になる可能性があります) 誰かがこの種の状況の経験を共有できますか、または誰かがこの配列をスタックに入れない正当な理由について考えますか?技術的な欠点と設計に関するコメントを探しています。 私が意識している唯一のことは、この関数に入るときに実際に1KBのスタックが空いていることを確認する必要があるということです。多分それは私が世話をしなければならないことすべてであり、多分そうではない。

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