問題タブ [c89]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 組み込み開発に C++ の代わりに C を使用する理由はありますか?
質問
私のハードウェアには、C++ と C89 の 2 つのコンパイラがあります。
クラスで C++ を使用することを考えていますが、ポリモーフィズムは使用しません (vtable を避けるため)。C++ を使用したい主な理由は次のとおりです。
- 私は、マクロ定義の代わりに「インライン」関数を使用することを好みます。
- 接頭辞がコードを乱雑にするので、名前空間を使用したいと思います。
- 主にテンプレートと冗長なキャストのおかげで、C++ の方が少しタイプセーフだと思います。
- オーバーロードされた関数とコンストラクター (自動キャストに使用) が本当に好きです。
非常に限られたハードウェア (4kb の RAM) 向けに開発する場合、C89 を使い続ける理由はありますか?
結論
あなたの答えをありがとう、彼らは本当に役に立ちました!
主な理由は次のとおりです。
- C で実際のコードを予測する方が簡単です。RAM が 4kb しかない場合、これは非常に重要です。
- 私のチームは主に C 開発者で構成されているため、高度な C++ 機能はあまり使用されません。
- C コンパイラ (C89) で関数をインライン化する方法を見つけました。
非常に多くの良い回答を提供してくれたので、1 つの回答を受け入れるのは難しいです。残念ながらウィキを作成して承認することはできないので、最も考えさせられた回答を 1 つ選択します。
c - 組み込みデバイスの C89 でバイト ストリームをパケット ストリームに変換する方法
RS232(USB経由のRS232)を使用してPCに接続されている組み込みデバイスで作業しています。
私は自分のプロトコルを開発することを考えています:
<MAGIC><LENGTH><BINARY DATA><CRC>
しかし、車輪の再発明はしたくありません。
注意してください: 私は非常に制限されたデバイスについて考えています: 4kb の RAM、カーネルなし、または標準の C ライブラリ。
これを行うための標準的な方法 (オープン ソース ライブラリなど) を考えてもらえますか?
独自のソリューションをコーディングする場合、ベスト プラクティスはありますか?
- パッケージの最後にもMAGICバイトを使っていますか?
- 区切り文字の代わりにタイムギャップを使用する方がよいでしょうか?
- ストリーム バイナリ データでパッケージの先頭を見つけるにはどうすればよいですか?
- テキストプロトコルを使用した方が良いのでしょうか?
更新: 質問を読み直してください。ライブラリを求めるのではなく、優れた実践を求めるべきです。
c - MinGW 3.4.5 で -ansi スイッチを使用する際の問題
gccで使用されるフラグについて読んでいて、使用することをお勧めしますgcc -ansi -pedantic -Wall file1 [file2 [file3...]] -o output
. 私のコードの品質のために、それを標準に保ち、それに関するすべての警告を受け取ります。
-ansi を使用したコンパイルについて... を含める<stdlib.h>
と、gcc で次のエラーが表示されます。
In file included from ansi.c:2:
C:/c/bin/../lib/gcc/mingw32/3.4.5/../../../../include/stdlib.h:317: error: syntax error before "double"
その行は次のとおりです。
inline
Cには存在しない?「標準」ヘッダーは標準 ansi であるべきではありませんか? インラインを削除するか、stdlib.h でのコンパイルを避けるべきですか (現在 stdlib の内容を思い出せません)。
アップデート
Adam が投稿したリンクを読んだところ、「インライン」は C89 のキーワードではなく、C89 は -ansi スイッチで強制されるものであることがわかりました。__inline__
おそらく、MinGW マクロに変更する必要がありました。
助けてくれてありがとう。
c - 関数によるデータの割り当て (ANSI C)
関数を介してデータを割り当てる方法を知りたいのですが、関数が返された後もデータはまだ割り当てられています。これは、基本型 (int、char**) とユーザー定義型の両方に当てはまります。以下は、コードの 2 つのスニップセットです。どちらも関数内に割り当てがありますが、戻り後に割り当てが行われます。
ユーザー定義型の場合でも、以前と同じ動作:
何か案は?ポインターを参照として渡す必要があると思いますが、どうすればよいですか?
事前にありがとう、日焼け止め
c - ラッピングを有効にしてターミナルカーソルを行頭に戻す
発生したばかりの行を「上書き」する必要があるフィルター(端末出力用のパイプ内)を作成しています。これは、aに到達するまでstdinをstdoutに文字ごとに渡し\n
、次に特別な動作を呼び出すことによって機能します。私の問題は、行の先頭に戻る方法に関するものです。
私が最初に考えたのは、\r
またはANSIシーケンスを使用することでした\033[1G
。ただし、行が端末で折り返されるのに十分な長さである場合(したがって、行がスクロールする原因となった場合)、これらはカーソルを現在の物理行に戻すだけです。
私の2番目のアイデアは、行の長さ(前から渡された文字数)を追跡し、それを何度も\n
エコーすることでした。\b
ただし、行に制御文字またはエスケープシーケンス(および場合によってはUnicode?)が含まれている場合は、問題が発生します。
すべての特別なシーケンスを検索し、これを使用して文字数を調整する以外に、これを実現する簡単な方法はありますか?
c - 構造体サイズの半分で構造体ポインタを増やします
対処すべき興味深い問題が発生しましたが、それをうまく解決する方法がわかりません。
複雑なグラフを表す 2 つの基本データ構造があり、次のように宣言されています。
実際のノードはヘッダーの直後に配置されるため、通常、「graph_t」は次のように作成されます
ノードの「生の」配列には、次のようにアクセスします
現在、ノード数を削減するバッファ上で動作するサポート関数があります。次のようになります。
さて、これは長い間美しく機能しています。上記のエラーは、私が記憶から書いているという事実から来ています。アイデアを説明しようとしているだけです。
今私を困惑させているのは、新しいモジュールからリダクション関数を使用すると、入力が「適切に」調整されないことです。アドレスを調べると、次のプロパティに注意してください。
もちろん、「オフセット」値が正しくなくなるため、少し問題が発生しますが、データ構造の他のすべての使用が機能するため、それほど明白ではありません (「実際の」アライメントの問題はありません)。
私の質問に要約すると、オフセットを要素の整数として表現できない場合に、ポインターをインクリメントするきちんとした方法がわかりますか?
過度のキャストに頼らない方法を見つけるためのボーナスポイント:)
c - C (C++ ではない) でオブジェクトを構築するために人々はどのような手法/戦略を使用していますか?
Python などのインタープリター言語のコアを形成するオブジェクトの実装とは対照的に、C 内から使用されることを意図したオブジェクトに特に興味があります。
c - strcpy の代わりに strncpy を使用する必要があるのはなぜですか?
編集:例のソースを追加しました。
私はこの例に出くわしました:
この出力を生成したもの:
これは、なぜ誰もがこの効果を望んでいるのか疑問に思います. 混乱しそうです。このプログラムは、Tom Bro763 で誰かの名前 (Tom Brokaw など) を基本的にコピーできると思います。
strncpy()
over を使用する利点は何strcpy()
ですか?
c - ANSI C のバッファなし I/O
教育とプログラミングの実践のために、生のキーボード入力を処理し、「リアルタイム」で端末に出力できる単純なライブラリを作成したいと思います。
私は可能な限り ansi C を使い続けたいと思っています。私はいくつかの Google 検索を行いましたが、結果の 99% はライブラリを使用しているか、C++ 用です。
Windows で動作するようにしてから、時間があれば OSX に移植したいと思っています。
c - スタックでの動的メモリ割り当て
私は最近、この実験を試しました。この実験では、サイズが不明なメモリ要件に対して動的メモリ割り当てを行う代わりに、静的割り当てを行いました。私が配列a[i]
を宣言したとき、私はi
(配列のサイズ)変数を保持し、ユーザーの入力に依存していました。
私の質問は次のとおりです。
- そのような操作は合法ですか?
- いいえの場合、コンパイラが警告やエラーを発行しないのはなぜですか?
- このメモリはどこに割り当てられますか:スタックまたはヒープ?
- なぜANSIC/ GCCがこれを許可するのですか?