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

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

2
C 2011で可変長配列がオプションになったのはなぜですか?
VLAがC 1999で導入されたとき、私はそれが言語の大きな革新だと思っていました。しかし、C 2011でオプションになったことを知ったので、ステータスの変化につながったのはなぜか、そしてそれが機能が実際に陳腐化に向かう​​ことを意味するのかどうか疑問に思っています。もしそうなら、それを置き換えると考えられている動的にサイズ変更されたデータの自動管理の同等の概念がありますか? C 2011の理論的文書を見つけようとしましたが、まだ公開されていないようです。

3
[]演算子の代わりにポインター演算を介して配列要素にアクセスすることは悪いことですか?
私はCでプログラミングすることを学び始めたばかりで、ポインターと配列の理解を深めるために、ポインターをまったく作成せずに配列の要素を参照しようとしました: for(k1 = 0; k1 < ROW; k1++){ for(k2 = 0; k2 < COLUMN; k2++){ array[k1][k2] = k1*COLUMN + k2 + 1; printf("[%d][%d] = %d\n", k1, k2, *(array[k1] + k2)); } } コード全体がコンパイルされ、問題なく実行されます。 大きなソースコード内のすべての単一配列に対してポインターを作成する必要があることは、非常に非効率的であると思われます。 したがって、ポインタを使用して配列のアドレスを保存および取得するのではなく、上記のように、配列のアドレスを直接使用するのは悪いプログラミング習慣ですか?

2
なぜCはまだ高レベル言語のカテゴリーにあるのですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 5年前に閉鎖されました。 Cプログラミング言語の教科書の多くは、Cが高レベルのプログラミング言語であると言っていますが、オンラインのチューターの多くは、Cは中レベルのプログラミング言語でもあると言っています。なぜそうなのですか?

1
注目すべきC拡張には、動作がマシンのワードサイズに依存しない整数型が含まれますか
他のいくつかの言語と比較したCの興味深い特徴は、そのデータ型の多くが、絶対条件で指定されるのではなく、ターゲットアーキテクチャのワードサイズに基づいていることです。これにより、特定のタイプでは困難なマシンでコードを記述するために言語を使用できますが、異なるアーキテクチャで一貫して実行されるコードを設計することは非常に難しくなります。コードを考慮してください: uint16_t ffff16 = 0xFFFF; int64_t who_knows = ffff16 * ffff16; int16ビットのアーキテクチャでは(多くの小さなマイクロコントローラーに当てはまります)、このコードは明確に定義された動作を使用して値1を割り当てます。int64ビットのマシンでは、明確に定義された動作を使用して、値4294836225を割り当てます。int32ビットのマシンでは、-131071の値を割り当てる可能性があります(それが実装定義の動作か未定義の動作かはわかりません)。コードは名目上「固定サイズ」タイプであると想定されるもの以外は何も使用しませんが、標準では、現在使用されている2種類のコンパイラーが2つの異なる結果を生成し、今日の多くの一般的なコンパイラーが3番目を生成する必要があります。 この特定の例は、実際のコードでは2つの16ビット値の積を直接64ビット値に割り当てるとは思わないという点で、多少不自然ですが、3つの方法の整数を示す簡単な例として選ばれました。プロモーションは、固定サイズと思われるサイズの符号なしタイプと対話する場合があります。符号なしの型の数学を数学的な整数演算のルールに従って実行する必要がある現実の状況、モジュラー演算のルールに従って実行する必要のある状況、実際にそうでない状況があります問題ない。チェックサムなどの実世界のコードの多くは、算術に依存しており、少なくとも、未定義の動作をトリガーするのではなく、正確なmod 65536として定義されている結果を取得します。uint32_t算術ラッピングmod2³²におり、任意のを実行できます。uint16_t この状況は明らかに望ましくないと思われますが(多くの目的で64ビット処理が標準になると、より多くなります)、私が観察したC標準委員会は、いくつかの顕著な生産ですでに使用されている言語機能を導入することを好みます環境を「ゼロから」作成するのではなく、C言語には、型を格納する方法だけでなく、可能なプロモーションを含むシナリオでの型の動作をコードで指定できる顕著な拡張機能がありますか?コンパイラー拡張機能がそのような問題を解決する可能性がある少なくとも3つの方法を見ることができます。 特定の「基本的な」整数型を特定のサイズに強制するようにコンパイラーに指示するディレクティブを追加します。 ターゲットアーキテクチャ上の型の実際のサイズに関係なく、マシンの型が特定のサイズを持っているかのように、さまざまなプロモーションシナリオを評価するようコンパイラーに指示するディレクティブを追加します。 添加;(特定の特性を有するタイプに関係なく、基礎となるワードサイズの、MOD-65536ラッピング代数環として振る舞うべきであり、他のタイプに暗黙的に変換すべきではないこと、例えば宣言をタイプを宣言する手段を可能にすることによってwrap32には、int得られるはずが16ビットより大きいwrap32かどうかに関係なく、型の結果。ただしint、にwrap32直接aを追加するwrap16ことは不正です(どちらも他方に変換できないため)。 私自身の好みは3番目の選択肢です。なぜなら、異常なワードサイズのマシンでさえ、変数が2のべき乗サイズの場合と同じように「ラップ」する多くのコードで動作できるからです。コンパイラは、型を適切に動作させるためにビットマスキング命令を追加する必要がありますが、コードがmod 65536をラップする型を必要とする場合、ソースコードを乱雑にするよりも、それを必要とするマシンでコンパイラにそのようなマスキングを生成させる方が良いですまたは、そのようなマスキングが必要なマシンで使用できないため、単純にそのようなコードを持っています。しかし、上記の手段のいずれかを介して、または私が考えていない手段を介してポータブルな動作を実現する一般的な拡張機能があるかどうか、私は興味があります。 私が探しているものを明確にするために、いくつかのことがあります。最も顕著な: 望ましいセマンティクスを確保するためにコードを記述する方法は多数ありますが(たとえば、特定のサイズの符号なしオペランドで数学を実行して、明示的にラップするかしないかの結果を得るために実行するマクロを定義する)、または少なくとも望ましくないセマンティクス(たとえば、a が昇格しないコンパイラーで条件付きで型wrap32_tを定義し、その型が昇格するマシンでコンパイルに失敗する必要があるコードの方が、実行して偽の動作をもたらすよりも優れていると考える)将来の言語拡張機能で最も有利に動作するコードを記述する方法がある場合、それを使用することは、独自のアプローチを考案するよりも優れているでしょう。uint32_tuint32_twrap32_t 多くの整数サイズの問題を解決するために言語をどのように拡張できるかについて、かなり堅実なアイデアがあり、コードが異なるワードサイズのマシンで同一のセマンティクスをもたらすことを可能にしますが、それらを書くのにかなりの時間を費やす前にその方向でどのような努力が既に行われたかを知るため。 私は、C標準委員会または彼らが作成した作業を軽disするような見方を決して望みません。ただし、「自然な」プロモーションタイプが32ビットであるマシンと64ビットであるマシンで、数年以内にコードを正しく動作させることが必要になると思います。言語の控えめな拡張(C99 nnd C14間の他の多くの変更よりも控えめ)を使用すると、64ビットアーキテクチャを効率的に使用するクリーンな方法を提供できるだけでなく、バ​​ーゲンでも標準が歴史的に後方に曲げてサポートするために「異常なワードサイズ」のマシン(例えば、12ビットのマシンを可能にするchar、uint32_tmod2³²をラップする]。将来の拡張機能の方向に応じて、デフォルトの整数型が「期待される」ように動作する今日のコンパイラで使用できるマクロを定義できるようになると期待していますが、整数の将来のコンパイラでも使用できますタイプのデフォルトの動作は異なりますが、必要な動作を提供できる場所です。

2
Cで配列を関数の引数として渡すことができないのはなぜですか?
このコメントに続いて、私はグーグルでグーグルを試みましたが、グーグルフーは失敗しました。 リンクからのコメント: [...]しかし、重要なことは、Cでは配列とポインターが異なることです。 コンパイラの拡張機能を使用していないと仮定すると、通常、配列自体を関数に渡すことはできませんが、ポインタを渡し、ポインタを配列であるかのようにインデックス付けすることはできます。 ポインターには長さが付加されていないという事実に不満があります。配列を関数の引数として渡すことができないこと、または配列が暗黙的にポインターに低下することを不平を言うべきです。
12 c  history 

3
負の符号付き値はどのように保存されますか?
符号付き整数の最大値と最小値についてこのビデオを見ていました。 正の符号付きの値の例を挙げます-0000 0001最初のビットは数値が正であることを示し、最後の7ビットは数値そのものです。したがって、+ 1と簡単に解釈されます。 次に、負の符号付き値の例を取り上げます。10000000は-8になります。さて、コンピューターは最初のビットのために負の値であることを理解できますが、000 0000が-8を意味することを地獄はどのように理解していますか? 一般的に、負の符号付きの値はコンピューターでどのように保存/解釈されますか

3
CおよびC ++プログラムで型をマークするにはどうすればよいですか?
では私のこの答え、私が使用し_t最高の状態で、物議を終了タイプ、の終わりに。これが現在のプロジェクトで使用しているプラ​​クティスです。 typedef struct { int x; int y; } point_t; これはstddef.h、size_tまたはのようなCタイプと一致するように意図されていましたptrdiff_t。しかし、私の質問の特定のコメントによると、_tpostfixはPOSIXのために予約されているようです。代わりに何を使うべき_tですか?または、_tとにかく使用し続ける必要がありますか? この質問は、CとC ++の両方を対象としています。これらの言語の表記規則が異なる場合は、お気軽にお答えください。
12 c++  c  naming 

3
より高いレベルの言語を読みやすいC ++にコンパイルすることは可能ですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 6年前に閉鎖されました。 C ++は多くの点で優れた言語ですが、特にいくつかのことはIDEなしで書くのが面倒です。VIMユーザーとして、S-Expressionsおよび場合によってはLispのようなマクロを使用してC ++を記述できるようにする高レベル言語にアクセスできれば、非常に興味深いでしょう。何回も。 freenodeで尋ねて、ECLやBiglooなどのコンパイラでLisp-> Cをコンパイルするなど、いくつかのアイデアをテストしましたが、特にきれいなCコードは生成されませんでした。 この問題に関する作業はありますか?

6
Cの変数と関数に使用される命名規則[非公開]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 4年前に閉鎖されました。 CIで大規模プロジェクトをコーディングする際に問題が発生しました。さらにコードを書き続けると、コードを整理するのが難しくなることがあります。プログラムのさまざまな部分の関数と変数の命名が混同されているように見えるかもしれません。 それで、Cの変数と関数に使用できる便利な命名規則があるかどうかを考えていましたか? ほとんどの言語は命名規則を提案しています。しかし、Cについては、これまで読んだ唯一のことは、コードの読みやすさを説明する名前でなければならないということです。 編集: 推奨される命名規則のいくつかの例の例: PythonのPEP 8 Javaチュートリアル Javaの命名規則をどこかで読みましたが、どこにあるのか覚えていません。
12 c  naming 

4
LinuxでIntel C / C ++コンパイラを使用して、Windowsでリンクされるオブジェクトファイルを作成することは可能ですか?
どうして? ソースにもよりますが、Intelコンパイラは、x86アーキテクチャ用の最速の実行可能ファイルを生成するコンパイラである可能性が最も高いです(5〜100%の実行時間の改善)。 IntelはLinux向けのコンパイラを非商用ライセンスで無料で提供しています(Intel-Non-Commercial Software Developmentのページのどこかで無料だと思います)。学生向けの無料の非商用ライセンスもありますが、3つの主要なオペレーティングシステムすべてにツールが提供されていますが、このライセンスは適用されません(評判の制限によりリンクが削除されました)。 ゴール 私(非学生として)は、非商用ライセンスの下でインテルコンパイラを使用して実行速度を向上させ、Windows(および場合によってはOSバツ) 詳細: このドキュメントから推測したことは、Intelコンパイラはプラットフォームの主要なコンパイラと互換性のあるオブジェクトファイルを作成するということです。 サブ質問: WindowsおよびLinux(現在のバージョン)のgcc、g ++、cl、mingw32、icc、icpc、iclのオブジェクトファイル形式は何ですか? mingw32クロスコンパイラツールチェーンの一部を使用して目標を達成できますか? 生成されたオブジェクトファイルのメタデータが主な問題だと思いますか? ad 2: mingw32-objcopyは、Linux(おそらくELF)上のIntelコンパイラ出力をMicrosoft互換のCOFFに変換できるようです(ただし、再配置可能なオブジェクトファイルの例外があります)。誰かがこれが実際に機能することを確認できますか(重要でないアプリケーションの場合)、お願いします。

5
Gitバージョンをビルド番号として統合するかどうか
同僚と私は、現在のgitリポジトリから派生したバージョンをビルドするたびにコードに統合することの問題/メリットを交互に議論/議論しています。 メリットは次のとおりです。 バージョン番号を更新する際に人的エラーを心配する必要はありません デバイスで見つかったものと、そのソースコードのソースコードとの間のトレーサビリティ (私たちにとって)発生した問題は次のとおりです。 IDE派生ビルドシステム(MPLABXなど)は、これらの種類のフックをどこに配置するのかを把握するのを難しくする可能性があります(最終的にはかなり安っぽくなります) これをビルドスクリプト/メイクファイルに実際に統合するためのさらなる作業 特定のビルドアプローチ(たとえば、1人がXCodeと他のMPLABXを使用してビルドした場合)へのカップリングは、ダウンストリームのサプライズを作成する可能性があります だから私たちは他の人がこの議論に上陸した場所に興味があります。議論が逸話になるのは本当に簡単です。エンドツーエンドの自動化に固執し、先行作業とそれが生み出すカップリングの量を掛ける人が大勢います。そして、議論の反対側には多くの人がいます。彼らは、最も簡単なことをして、リスクを抱えて生きています。 どの側に着陸するのが最適であるかについて、合理的な答えはありますか?
12 c  git  builds  build-system 

2
「可能性が高い」および「可能性が低い」マクロの使用量は多すぎますか?
よく知られlikelyているunlikelyマクロとマクロは、コンパイラifが通常入力されるかスキップされるかを知るのに役立ちます。これを使用すると、パフォーマンスが多少(わずかに)向上します。 私は最近それらを使い始めましたが、そのようなヒントをどのくらいの頻度で使用すべきかわかりません。現在、エラーチェックで使用します。if通常はとしてマークされunlikelyます。例えば: mem = malloc(size); if (unlikely(mem == NULL)) goto exit_no_mem; それは問題ないように見えますが、エラーチェックはif非常に頻繁に発生し、その結果、上記のマクロが使用されます。 私の質問は、すべてのエラーチェックでマクロlikelyとunlikelyマクロを持っているのは多すぎるのifですか? 我々がそれに取り組んでいる間、彼らは他のどのような場所でよく使われますか? 私の現在の使用法では、リアルタイムサブシステムから抽象化するライブラリにあるため、プログラムはRTAI、QNXなどの間で移植可能になります。ただし、ほとんどの関数はかなり小さく、1つまたは2つの他の関数を直接呼び出します。多くはstatic inline機能です。 だから、まず第一に、それは私がプロファイルできるアプリケーションではありません。スタンドアロンアプリケーションではなくライブラリであるため、「ボトルネックを特定する」ことは意味がありません。 第二に、「これはありそうもないことを知っているので、コンパイラに伝えることもできます」というようなものです。私は積極的に最適化しようとしませんif。

9
配列またはMalloc?
アプリケーションで次のコードを使用していますが、正常に機能しています。しかし、mallocで作成するのが良いのか、それともそのままにしておくのが良いのだろうか? function (int len) { char result [len] = some chars; send result over network }
12 c 

9
Greenspunの第10規則、すべての大規模プロジェクトにはLispインタープリターが含まれていますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 5年前に閉鎖されました。 Greenspunの10番目のルール(実際には唯一のルール)は次のように述べています: Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp. 私の記憶は、おそらくBorlandのQuattro(スプレッドシート)プロジェクトとおそらく他のもののために、トピックに関するいくつかの論文があるということです。Googleは役に立たず、適切な検索用語が思い浮かばないかもしれません。この主張を支持する論文または記事を探しています。


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