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

Cは、システムプログラミング(OSおよび組み込み)、ライブラリ、ゲーム、クロスプラットフォームに使用される汎用プログラミング言語です。このタグは、ISO 9899標準で定義されているC言語に関する一般的な質問で使用する必要があります(特に指定のない限り、最新バージョン9899:2018。バージョン固有のリクエストには、c89、c99、c11などのタグも付けます)。CはC ++とは異なり、合理的な理由がない限り、C ++タグと組み合わせるべきではありません。

3
文字列定数から 'char *'への変換がCでは有効であるがC ++では無効である理由
C ++ 11標準(ISO / IEC 14882:2011)は次のように述べてい§ C.1.1ます。 char* p = "abc"; // valid in C, invalid in C++ C ++の場合、文字列リテラルへのポインタは有害であり、変更しようとするとクラッシュするため、問題ありません。しかし、なぜCでは有効なのでしょうか。 C ++ 11はまた言います: char* p = (char*)"abc"; // OK: cast added つまり、最初のステートメントにキャストが追加された場合、それは有効になります。 キャストによって2番目のステートメントがC ++で有効になるのはなぜですか?それは最初のステートメントとどう違うのですか?まだ有害ではないですか?もしそうなら、なぜ規格はそれが大丈夫だと言ったのですか?
163 c++  c  string  c++11  char 

6
Cプログラムで現在のディレクトリを取得する方法は?
プログラムを開始するディレクトリを取得する必要があるCプログラムを作成しています。このプログラムはUNIXコンピュータ用に書かれています。私はopendir()and を見てきましたがtelldir()、をtelldir()返すoff_t (long int)ので、それは本当に私を助けません。 文字列(char配列)の現在のパスを取得するにはどうすればよいですか?

1
gccコマンドラインを使用して.cファイルから.soファイルをビルドする
Linuxダイナミックライブラリ(.soファイル)のHello Worldプロジェクトを作成しようとしています。だから私はファイルhello.cを持っています: #include <stdio.h> void hello() { printf("Hello world!\n"); } hello()コマンドラインからgccを使用して、エクスポートする.soファイルを作成するにはどうすればよいですか?
162 c  linux  gcc  shared-libraries 

15
exprでオーバーフローを回避する方法。あいうえお
:私はのように見える表現を計算する必要があり A*B - C*D、その種類は次のとおりです。signed long long int A, B, C, D; それぞれの数字は(その型をオーバーフローしない)本当に大きなことができます。一方でA*B、オーバーフローを引き起こす可能性があり、同時に式はA*B - C*D本当に小さくすることができます。どうすれば正しく計算できますか? 例:MAX * MAX - (MAX - 1) * (MAX + 1) == 1、ここでMAX = LLONG_MAX - n、n-ある自然数。
161 c++  c  integer-overflow 

2
このCコードでアルファベットが複数の範囲に分割されるのはなぜですか?
カスタムライブラリで実装を見ました: inline int is_upper_alpha(char chValue) { if (((chValue >= 'A') && (chValue <= 'I')) || ((chValue >= 'J') && (chValue <= 'R')) || ((chValue >= 'S') && (chValue <= 'Z'))) return 1; return 0; } それはイースターエッグですか、それとも標準のC / C ++メソッドと比較した場合の利点は何ですか? inline int is_upper_alpha(char chValue) { return ((chValue >= 'A') && (chValue …
161 c++  c  character  toupper 

8
文字列リテラル:どこに行くのですか?
文字列リテラルが割り当てられる/格納される場所に興味があります。 ここで興味深い答えが1つ見つかりました。 インラインで文字列を定義すると、実際にはプログラム自体にデータが埋め込まれ、変更できません(一部のコンパイラではこれをスマートトリックで許可しているので、気にしないでください)。 しかし、それはC ++に関係していることは言うまでもありません。 気になります。= D だから私の質問は私の文字列リテラルがどこにどのように保持されるのですか?それを変更しようとしないのはなぜですか?実装はプラットフォームによって異なりますか?「スマートトリック」について詳しく説明する人はいますか?



14
Windowsでの画面キャプチャの最速の方法
Windowsプラットフォーム用のスクリーンキャストプログラムを作成したいのですが、画面をキャプチャする方法がわかりません。私が知っている唯一の方法はGDIを使用することですが、これに対処する方法が他にあるかどうか知りたいです。速度が優先されます。 スクリーンキャスティングプログラムはゲーム映像を記録するためのものですが、これによりオプションが絞り込まれた場合でも、この範囲外のその他の提案があれば、私はまだ開いています。結局のところ、知識は悪くありません。 編集:私はこの記事に出くわしました:画面をキャプチャするためのさまざまな方法。Windows Media APIの方法とDirectXの方法を紹介しました。結論では、ハードウェアアクセラレーションを無効にすると、キャプチャアプリケーションのパフォーマンスが大幅に向上する可能性があると述べています。これがなぜなのか、私は興味があります。誰かが私のために欠けている空白を埋めることができますか? 編集:Camtasiaなどのスクリーンキャストプログラムは独自のキャプチャドライバーを使用することを読みました。誰かがそれがどのように機能するのか、なぜそれがより速いのかについて私に詳細な説明をくれますか?そのようなものを実装するためのガイダンスも必要かもしれませんが、とにかく既存のドキュメントがあるはずです。 また、FRAPSが画面を記録する方法もわかりました。それは、バックバッファーから読み取るために、基になるグラフィックAPIをフックします。私が理解しているところでは、ビデオRAMではなくシステムRAMから読み取るため、これはフロントバッファーから読み取るよりも高速です。こちらの記事をご覧ください。
159 c++  c  windows 

13
「コンパイル時に割り当てられるメモリ」とはどういう意味ですか?
CやC ++などのプログラミング言語では、多くの場合、静的および動的なメモリ割り当てを参照します。概念は理解していますが、「コンパイル時にすべてのメモリが割り当てられた(予約された)」というフレーズは常に混乱します。 コンパイルは、私が理解しているように、高レベルのC / C ++コードを機械語に変換し、実行可能ファイルを出力します。コンパイルされたファイルでメモリはどのように「割り当て」られますか?メモリは常にすべての仮想メモリ管理機能を備えたRAMに割り当てられているのではないですか? 定義によるメモリ割り当ては、ランタイムコンセプトではありませんか? C / C ++コードで1KBの静的に割り当てられた変数を作成すると、実行可能ファイルのサイズが同じだけ増加しますか? これは、「静的割り当て」という見出しの下でフレーズが使用されているページの1つです。 基本に戻る:メモリー割り当て、歴史の歩み

14
Mojaveへのアップグレード後、MacでCプログラムをコンパイルできません
端末でgccコマンドを使用してCプログラムをコンパイルしましたが、突然、Mac OS(macOS 10.14 Mojave、およびXCode 10.0)にアップデートした後、次のメッセージの受信を開始しました。 test.c:8:10: fatal error: stdio.h: No such file or directory #include <stdio.h> ^~~~~~~~~ compilation terminated. 私はそれを見つけることができるのですでにgccをインストールしていて/usr/local/bin、そこには本当にgccがあります。他のiMacでも同じファイルを実行してみましたが、問題なく動作しました。 実行xcode-select --installしてみましたが、すでにインストールされていたため、現在の問題は解決しませんでした。gccこの問題を解決するために他のリソースからいくつかのコマンドをコピーして貼り付け始めた後、パスが見つからないように見えるため、パスがめちゃくちゃになっていると思います。 これについていくつかの助けが欲しいのですが。
159 c  macos  gcc  terminal 

1
「Cプログラミング言語」の本でmallocをキャストする必要があると書かれているのはなぜですか?
今日、私は、ページに達する167の言語(第二版ブライアンW.カーニハン&デニスM. Ritchie氏を)プログラミングCをし、著者は、私はキャストしなければならないと言うことがわかりましたmalloc。これは本の一部です: 7.8.5ストレージ管理 関数mallocおよびcallocは、メモリのブロックを動的に取得します。 void *malloc(size_t n) 初期化されていないストレージのnバイトへのポインタを返します。要求が満たされない場合はNULLを返します。 void *calloc(size_t n, size_t size) 指定されたサイズのn個のオブジェクトの配列に十分な空き領域へのポインタを返します。要求が満たされない場合はNULLを返します。ストレージはゼロに初期化されます。mallocまたはcallocによって返されたポインターは、問題のオブジェクトに対して適切な配置になっていますが、次のように適切な型にキャストする必要があります int *ip; ip = (int *) calloc(n, sizeof(int)); 私はすでにそれを知っているmalloc(とその家族)戻り型void *型を、そしてなぜキャストへの良好な説明がありますmalloc。 しかし、私の質問は次のとおりです。なぜこの本は私がそれをキャストするべきだと言っているのですか?

3
関数宣言はプロトタイプではありません
私が作成したライブラリがあります。 mylib.c: #include <mylib.h> int testlib() { printf("Hello world\n"); return (0); } mylib.h: #include <stdio.h> extern int testlib(); 私のプログラムでは、このライブラリ関数を呼び出そうとしました: myprogram.c: #include <mylib.h> int main (int argc, char *argv[]) { testlib(); return (0); } このプログラムをコンパイルしようとすると、次のエラーが発生します。 myprogram.c:1からインクルードされたファイル mylib.h:2警告:関数宣言はプロトタイプではありません 私が使用しています: gcc (GCC) 3.4.5 20051201 (Red Hat 3.4.5-2) 私の質問は、関数プロトタイプを宣言する適切な方法は何ですか?
158 c  gcc 


9
値を返さずに非void関数の最後をオフにしても、コンパイラエラーが発生しないのはなぜですか?
私が何年も前に気付いて以来、これはデフォルトではエラーを生成しない(少なくともGCCでは)ことを知っているので、私はいつもその理由を疑問に思っていましたか? コンパイラフラグを発行して警告を生成できることを理解しましたが、常にエラーである必要はありませんか?非void関数が値を返さないのが有効であることはなぜ意味があるのですか? コメントでリクエストされた例: #include <stdio.h> int stringSize() { } int main() { char cstring[5]; printf( "the last char is: %c\n", cstring[stringSize()-1] ); return 0; } ...コンパイルします。
158 c++  c  gcc  g++ 

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