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

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

7
アセンブリーよりもCを使用することの利点/欠点は何ですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 現在、電気通信および電子工学の工学を勉強しており、マイクロプロセッサプログラミングでアセンブラからCに移行しました。これが良い考えだとは思わない。アセンブリと比較したCの長所と短所は何ですか? 私が見る利点/欠点は次のとおりです。 利点: C構文は、アセンブラー構文よりもはるかに簡単に学ぶことができます。 Cはより複雑なプログラムを作成するのに使いやすいです。 Cを学習することは、アセンブラーを学習することよりも生産性が高いため、アセンブラーよりもCの周辺に開発物が多くあります。 短所: アセンブラはCよりも低レベルのプログラミング言語であるため、ハードウェアへの直接プログラミングに適しています。 メモリ、割り込み、マイクロレジスタなどを操作することを示唆しているはるかに柔軟です。
15 c  low-level  assembly 

5
マイクロコントローラー用の効率的なCコードの作成に関するリソース [閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 5年前に閉鎖されました。 ここでは深刻な助けが必要です。プログラミングが大好きです。最近、C言語の本(K&Rなど)や記事/フォーラムをオンラインでたくさん読んでいます。Linuxコードを調べてみました(どこから始めたらいいのか迷っていましたが、小さなライブラリを覗いてみると助けになりましたか?)。 私はJavaプログラマーとしてスタートしましたが、Javaでの作業はかなり乾燥しています。プログラムが大きくなりすぎた場合は、クラスでスライスし、さらに関数に分割します。ガイドラインは、コードを読みやすくし、コメントを追加します。情報の隠蔽とOOPテクニックを使用します。そのうちのいくつかはまだCに適用されます。 私は今Cでコーディングしており、これまでのところ、プログラムを何らかの方法で動作させています。多くの人がパフォーマンス/効率、アルゴリズム/設計、最適化、保守性について話します。一部の人々はもう一方を強調しますが、プロではないソフトウェアエンジニアにとっては、次のようなことをよく耳にします。 私の質問は次のとおりです。リソースを無駄にせずに 8ビットマイクロコントローラー用のコードを書く予定です。私はJavaのバックグラウンドから来ているので、物事はもう同じではないことを知っています...リソース/ブック/リンク/ヒントは大歓迎です。パフォーマンスとサイズが重要になりました。8ビットマイクロコントローラー向けの効率的な(ベストプラクティス内)Cコードのリソース/コツですか? また、inline assemblyマイクロコントローラーの標準に近いだけでなく、重要な役割を果たします。しかし、すべてに適用される効率の一般的な経験則はありますか? たとえば、: register unsigned int variable_name;はcharいつでも好まれます。または、 uint8_t 大きな数字が必要ない場合に使用します。 編集:すべての答えと提案をありがとうございました。知識を共有するための皆の努力に感謝します。
15 c  performance  speed 

5
Cでインターフェイス分離の原則を適用する方法は?
「M」と言うモジュールがあり、「C1」、「C2」、「C3」と言うクライアントがいくつかあります。モジュールMの名前空間、つまり、それが公開するAPIとデータの宣言を、次のような方法でヘッダーファイルに割り当てます。 どのクライアントでも、必要なデータとAPIのみが表示されます。モジュールの残りの名前空間はクライアントから隠されています。つまり、インターフェース分離の原則に準拠しています。 宣言は複数のヘッダーファイルで繰り返されません。つまり、DRYに違反しません。 モジュールMは、クライアントに依存しません。 クライアントは、モジュールMで使用されていない部分で行われた変更の影響を受けません。 既存のクライアントは、追加のクライアント(または削除)の影響を受けません。 現在、クライアントの要件に応じてモジュールの名前空間を分割することでこれに対処しています。たとえば、下の画像では、3つのクライアントに必要なモジュールの名前空間のさまざまな部分が示されています。クライアントの要件は重複しています。モジュールの名前空間は、「a」、「1」、「2」、「3」の 4つの独立したヘッダーファイルに分割されます。 ただし、これは前述の要件の一部、つまりR3およびR5に違反します。このパーティション化はクライアントの性質に依存するため、要件3に違反しています。また、新規クライアントの追加のモジュールの名前空間は、現在7つのヘッダファイルに分割して、新しいクライアントの追加と同様に、上記の画像の右側に見ることができ、このパーティションの変更および要件5.に違反し、 - 「 '、' b '、' c '、' 1 '、' 2 * '、' 3 * 'および' 4 '。ヘッダーファイルは2つの古いクライアントの変更を意味し、それにより再構築がトリガーされます。 Cのインターフェイス分離を非自発的な方法で実現する方法はありますか? はいの場合、上記の例をどのように扱いますか? 私が想像する非現実的な仮想ソリューションは次のようになります- モジュールには、名前空間全体をカバーする1つの太いヘッダーファイルがあります。このヘッダーファイルは、ウィキペディアページのようなアドレス可能なセクションとサブセクションに分かれています。各クライアントには、特定のヘッダーファイルが用意されています。クライアント固有のヘッダーファイルは、ファットヘッダーファイルのセクション/サブセクションへのハイパーリンクの単なるリストです。また、ビルドシステムは、モジュールのヘッダーでポイントするセクションのいずれかが変更された場合、クライアント固有のヘッダーファイルを「変更された」ものとして認識する必要があります。
15 c  interfaces  solid 

10
「i ++ == ++ i」の場合、C開発者はどうしてそんなに興味を持ちますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 6年前に閉鎖されました。 単なるランダムな観察ですが、StackOverflow.comでは、「++ i == i ++」であるかどうかに関する質問があるようです。しかし、この質問は常に聞かれます。過去2か月間に約6〜7回質問されたのを見たと思います。 なぜC開発者がそれに興味を持っているのだろうか?C#およびJava開発者にも同じ概念/質問が存在しますが、C#に関連する質問は1つしか見なかったと思います。 多くの例で++ iを使用しているからですか?人気のある本やチュートリアルがあるからでしょうか?それは、C開発者が「効率」/「パフォーマンス」のために可能な限り1行に詰め込んで、++演算子を使用する「奇妙な」コンストラクトに頻繁に遭遇するためです。

4
実際にどのように機能するのかわからないときに、どのようにコーディングしますか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新することがありますので、上のトピックソフトウェア工学スタックExchange用。 2年前に閉店。 私は最近Cを学び、知識を固めるプロジェクトを始めたいと思っています。vimのような非常にシンプルなテキストエディタを作成することに決めました。私が直面している問題は、テキストエディタがどのように機能するのか、まったくわからないことであり、それについて学ぶために何をグーグルで検索するべきかわからないことです。 それについてグーグルで調べた結果、vimのGitHubリポジトリが作成されました。これは、コードベースが巨大であり、コードが私を混乱させるため、役に立たないものです。また、C言語でvimのような機能を持つテキストエディタを作成するためのチュートリアルも見つけました。 チュートリアルに従うことを考えましたが、不正行為のように感じます。vim開発者は、特定のチュートリアルなしでvimをコーディングする方法をどのように見つけましたか?それとも、よりシンプルなテキストエディターから始めましたか?彼らは言語とそのドキュメントの知識からそれをどうやって理解したのですか? チュートリアルを直接実行せずにこのテキストエディタの作成を開始するために必要なものは何ですか?私が考えたい別の例は次のとおりです。デニス・リッチーとケン・トンプソンはどのようにUnixをコーディングしましたか?OSがどのように機能するかはわかりますが、それをコードに組み込む方法はわかりません。私が見逃しているのは何ですか?この言語の知識を実際の実用に移すにはどうすればよいですか?
14 c  languages 

3
古いOSの開発をサポート
私は、Cで書かれたレガシーコードの大部分を維持しています。このコードは当初、Windows 3 for Workgroupsに対してコンパイルするために書かれ、後にNT用のバージョンが作成されました。このレガシーアプリケーションは現在も使用されており、90年代前半から3.11およびNTワークステーションで快適に実行されています。正常に機能し、本来の動作を行います。また、彼らがまだ生きている理由は、ソリューションに属するカスタムハードウェアの一部のドライバーが後のWindowsと互換性がないためです。 同じ理由でWin2kでのみ動作する別のアプリケーションもあります。 ただし、状況が進むにつれて、これらのレガシー環境を実行することがますます難しくなっています。現在、開発用ソフトウェアがインストールされた物理マシンを保持しているため、ネイティブハードウェアで作業できます。しかし、これらはいつでも死ぬかもしれません(結局25歳です)。 それで、私の質問は、2016年を見て、この古風な環境をより安定した方法で維持するための私のオプションは何ですか?3.11をクラウドホスティングに移行できますか? 仮想化を試しましたが、セットアップの特殊な性質のため、デバイスドライバーで動作させることができなかったため、OSの完全なイメージをそのまま作成してから、 VMはソフトウェアを開発しますか?Win3やNTと同じくらい古いバージョンのゲストOSでは、このようなことは可能ですか? これらのような古いプラットフォームを開発のために生かしながら、より現代的で安全な方法で、私が引き出すことができる経験はありますか? 私の目標は、古い物理マシンを取り除き、仮想化に移行することです。
14 c  windows  legacy 

5
オブジェクト指向Cを書くのは悪いですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 3年前に閉店しました。 私は常にオブジェクト指向であるCでコードを書くように見えるので、ソースファイルまたは構造体を作成し、この構造体が所有する関数(メソッド)にこの構造体へのポインターを渡すものがあるとしましょう: struct foo { int x; }; struct foo* createFoo(); // mallocs foo void destroyFoo(struct foo* foo); // frees foo and its things これは悪い習慣ですか?「適切な方法」でCを書く方法を学ぶにはどうすればよいですか。
14 c 

5
Javaの未定義の動作
私は、SOでこの質問を読んでいて、C ++の一般的な未定義の動作について説明していましたが、Javaにも未定義の動作がありますか? その場合、Javaの未定義の動作の一般的な原因は何ですか? そうでない場合、Javaのどの機能がそのような動作から解放されますか?これらのプロパティでCおよびC ++の最新バージョンが実装されていないのはなぜですか?


4
Cポインターの優先順位はどのように決定されますか?
私は理解に苦労している2つのポインタ宣言に遭遇しました。優先ルールの私の理解は次のようになります。 Operator Precedence Associativity (), [ ] 1 Left to Right *, identifier 2 Right to Left Data type 3 しかし、これを与えられても、次の例を正しく評価する方法を理解することはできないようです。 最初の例 float * (* (*ptr)(int))(double **,char c) 私の評価: *(ptr) (int) *(*ptr)(int) *(*(*ptr)(int)) 次に、 double ** char c 2番目の例 unsigned **( * (*ptr) [5] ) (char const *,int *) *(ptr) …
14 c  pointers 

3
なぜcファミリーは、LISPファミリーではなく、数学/ CSプログラムの標準CS研究連隊なのですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 私は自己改善のためにLISPに慣れてきました。私が気づいたことの1つは、LISPはCと言うよりも数学のパラダイム内にあるということです。構文と設計構造は、アルゴリズムの実際の数学的モデルを直接反映しているようです。優れた数学ベースのCSプログラムでさえ、LISPではなくCを学習する理由は、私には意味がありません。LISPはCよりも高い数学概念をより直接的に採用していると思います。Cで数学構造をモデル化できないと言っているのではありません。LISPが数学者にハードワイヤーされているように見えることに気付いています。 私は、JAVA学校でのジョエル・スポルスキーの暴言の多くを読みましたが、彼の評価に同意しますが、私の学校はその理由でJavaを教えませんでした。彼らは、ポインター、アルゴリズム設計、再帰、さらにはアセンブリ命令などの基本概念を教えるのに厳格でした。ただし、これらはすべてCおよびc ++で行いました。誰もこれおよび/またはその歴史の理由を知っていますか?

3
C ++またはMATLABでのテクニカルペーパーアルゴリズムの実装
私は電気工学の学部生です。信号および画像処理アルゴリズム(再構成、セグメンテーション、フィルタリングなど)に関する多くの技術論文を読んでいます。これらの論文に示されているアルゴリズムのほとんどは、連続時間と連続周波数にわたって定義されており、多くの場合、複雑な方程式の観点から解を提供します。上記の論文で得られた結果を複製するために、C ++またはMATLABでゼロから技術論文をどのように実装しますか? より具体的には、Wang et al(IEEE Trans Med Imaging。1993; 12(3):486-96)の論文「A general cone-beam rebuild algorithm」を見て、どうすれば始めることができるのか疑問に思っていました。アルゴリズムを実装していますか?式10は、再構築された画像の式を示します。どのようにコーディングしますか?各ボクセルを通過し、対応する式を計算するforループがありますか?その式で関数の関数をどのようにコーディングしますか?任意のポイントで関数をどのように評価しますか? ゴンザレスとウッズの本「デジタル画像処理」を読みましたが、まだ迷っています。また、数値レシピの本シリーズについても読んでいます。それは正しい方法でしょうか? 研究論文からアルゴリズムをプログラミングした経験は何ですか?ヒントや提案はありますか?
14 c  algorithms  matlab 

8
組み込みソフトウェア市場でCが優位を占めるのはなぜですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 5年前に閉鎖されました。 ほとんどすべての人が祝福を言うでしょう。 パフォーマンス! さて、Cはアスレチックコードを書くことができます。しかし、そうすることができる他の言語があります、結局のところ!そして、最新のコンパイラの最適化能力は素晴らしいです。DOES Cは、他の言語が持っていないことをいくつかの利点がありますか?または、ドメイン内でより柔軟な機器を使用する必要はありませんか?

4
Apache HTTPサーバーはなぜそんなに複雑なのですか?
ApacheのHTTPサーバは言う、より大きなかなり大規模なプロジェクトに多くの、であるlighthttpか、nginxまたは確かにあなたがC / C ++のチュートリアルで漂っ見る「シンプルなHTTPサーバ」。 追加のコードは何ですか?それはセキュリティ/安定性を追加しますか(もしそうなら、どのように?)、またはApache confファイルを解析する/ .htaccess物事をタイプするようなことをするためだけですか(そして、私は推測するVirtualHostsなど)。 Apacheを批判しないようにお願いしますが、ある種のWebサーバーを書くことに興味があり、明らかではないかもしれませんが、安全で安定した高速なWebサーバーのために覚えておくことが重要なことを知りたいのです。
14 c  apache  http 

4
お気に入りのビット単位のテクニックは何ですか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 7年前に閉鎖されました。 ロックされています。この質問とその回答はロックされています。なぜなら、質問はトピックから外れていますが、歴史的に重要だからです。現在、新しい回答やインタラクションを受け入れていません。 数日前、StackExchangeのメンバーであるAntoは、ビット単位の演算子の有効な使用方法について問い合わせました。私は、整数を2のべき乗で乗算および除算するよりも高速であると述べました。StackExchangeメンバーのDaeminは、右シフトが負の数の問題を引き起こしたと述べて反論しました。 その時点で、符号付き整数でシフト演算子を使用することを考えたことはありませんでした。私は主に低レベルのソフトウェア開発でこの手法を使用しました。したがって、常に符号なし整数を使用しました。Cは、符号なし整数で論理シフトを実行します。論理右シフトを実行する場合、符号ビットには注意が払われません。空白ビットはゼロで埋められます。ただし、Cは符号付き整数を右にシフトするときに算術シフト演算を実行します。空白ビットは符号ビットで埋められます。この違いにより、負の値はゼロに切り捨てられるのではなく、無限に丸められます。これは、符号付き整数除算とは異なる動作です。 数分考えた結果、一次解決策が生まれました。このソリューションは、シフトする前に条件付きで負の値を正の値に変換します。値は、シフト操作が実行された後、条件付きで負の形式に変換されます。 int a = -5; int n = 1; int negative = q < 0; a = negative ? -a : a; a >>= n; a = negative ? -a : a; このソリューションの問題は、通常、条件付き割り当てステートメントが少なくとも1つのジャンプ命令に変換されることであり、ジャンプ命令は、両方の命令パスをデコードしないプロセッサーでは高価になる可能性があります。命令パイプラインを2回再プラ​​イミングしなければならないことは、除算をオーバーシフトすることで得られるパフォーマンスの向上に良い影響を与えます。 上記で述べたように、私は土曜日に条件付き割り当ての問題に対する答えで目が覚めました。算術シフト演算を実行するときに発生する丸めの問題は、2の補数表現を操作する場合にのみ発生します。補数表現では発生しません。この問題を解決するには、シフト操作を実行する前に2の補数値を1の補数値に変換します。次に、1の補数値を2の補数値に変換する必要があります。驚くべきことに、シフト操作を実行する前に負の値を条件付きで変換することなく、この一連の操作を実行できます。 int a = -5; int n = 1; register int sign …

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