C言語なら俺に聞け 143
■ このスレッドは過去ログ倉庫に格納されています
>>68 ストリームを作ってるのがカーネルだからだろ。 >>68 CランタイムならLLVMのlibc++か、GNUのlibstdc++を読めばいい。 カーネル見ずに読めればね。 >>60 0b...で2進数のリテラル表現ってできるんだっけ? >>64 エンディアネスに対する配慮が…。 8進 16進はあるけど 0b... な2進リテラルは余所の言語じゃね? int bigendian(void) { union { int i; char c[sizeof(int)]; } u; u.i = 1; return !u.c[0]; } この関数でエンディアンをチェックすれば? XScreenSaverから拾ったものだけど。 union endian_checker_union { int i; char c[sizeof(int)]; } endian_checker = { 1 }; #define IS_BIG_ENDIAN() (!endian_checker.c[0]) >>70 なんでC言語の話でlibstdc++が出てくるの? fopenやらのストリームなんて、setvbufの説明読めばバッファリングしてるだけって理解できるだろ カーネルやらlibcのソースなんて読む必要性なんてねーよ ストリームなんて、なんでもかんでも先頭から順番に処理するってだけの概念だけどな。 ランダムアクセスメモリーも読み飛ばしと巻き戻し駆使してアクセスするのさ。 >>75 こんなのどう? #define IS_BIG_ENDIAN (htons(1) == 1) >>64 そういえばそれ、それでいいの?2回目以降は n >>= 8 では? >>79 それって、htons()のあるライブラリ間違えたら全く意味が無いマクロだよね? >>72 接頭辞0bは今どきのgccで普通に使えちゃうんだなこれが なので、質問者も回答者も 「ほんとはダメだけどgccならこうよ」 みたいな但し書きを一筆しとくべきだね >>82 ライブラリというか、ヘッダだな。#include <arpa/inet.h> とか。 コンパイラにもよるだろうけどだいたいはヘッダの中だけで #define されているか ビルトインの関数に置き換えられるかインラインアセンブラになるか、適当に うまいことやってくれると思う。(CPUが Big endian なら #define htons(x) (x) に なってて何もしないだけになるかも知れない)。 それと一応 POSIX.1‐2008 のようなので使えるコンパイラは多いんじゃないかな。 今ってC言語でwin32とかで作るアプリに基本構造とかなしで作る感じなの? イベントを拾って条件分岐みたいな部分は全部関数内に隠蔽された。 今は決まった名前のコールバック関数を埋めるだけのお仕事。 実行時に必要なメモリーサイズが決まるようなプログラムだと必要。 最初から大きなメモリーを確保しても無駄になるかもしれないし、 当初想定したサイズでは足りなくなるかもしれない。 そういうときに使う。 組み込みでは1度大きく確保したら後は自前で中身やり繰りするから、あんまり使わない。 VS2017でやってるんだがファイル分割ってどうやるんだ Visual Studio 2017 Part4 https://mevius.5ch.net/test/read.cgi/tech/1509244956/ 左のファイルのツリーで 項目の追加 で 新しく .c のソースファイル名指示すれば 勝手にコンパイルとリンクのターゲットにしてくれる (予定 >>94 組み込みって言ってもこの頃は最初から Linux 動いてるようなのもあるからな。 今は昔と違ってかなり自由度が高いのもあるんじゃないかな。 Linuxだからって、メモリーリークが無くなるワケじゃ無いからなぁ〜。 >>94 組み込みではどの処理にどれだけメモリを使うかは、 設計で決まるだろ。 組み込みって言ってもピンキリだからなぁ 車のエンジン制御とかなら>>100 が言うような感じだけど>>97 が言うようなLinuxが載ってる機器のGUI回りとかだとその辺かなりアバウト テレビみたいにインターネットブラウザとか載せてるとそもそも必要量を見積もれないし https://ideone.com/lGSKsq 漸化式を使って組合せnCmの値を表示するプログラムです 数字を大きくすると正しい結果が出ないので困っています(例えば45C11 修正箇所教えてほしいです >>104 入力はそこまで大きい値を入れるつもりはないのでintにしました >>103 C言語の場合は、整数同士の割り算は整数の除算になる。例)3/2 == 1. 整数をfloatやdoubleにキャストしても情報落ちのため、浮動小数点数では正確な除算は計算できない。 https://ideone.com/aDJXNO >>106 gはnとmの最大公約数 あとnCmは必ず整数になるのでn-1Cm-1/Bの部分も小数にならず割り切れて整数になると思うんです n=Ag m=Bg (A.Bは互いに素)として n/m*n-1Cm-1 =A/B*n-1Cm-1 (※A/Bは小数になる) = A*(n-1Cm-1/B) =(n/g)*(n-1Cm-1/(m/g)) として計算すればうまく小数になるのを避けられるのではないかと考えました すみませんC言語というより数学的な話で >>107 おそらくn/gは整数である。m/gも整数である。 では、(n-1)C(m-1)/(m/g)が整数であることの説明は? >>108 nCm (※整数) =n/m*n-1Cm-1 = (A/B)*(n-1Cm-1) = A*(n-1Cm-1/B) ・左辺が整数なので右辺も整数です ・A/BはAとBが互いに素(※最大公約数が1)なのでこれ以上約分できない分数です ということは右辺が整数になるときn-1Cm-1/Bが整数です B=m/gなのでつまり(n-1)C(m-1)/(m/g)は整数ではないでしょうか nCmが整数なので、A*((n-1)C(m-1)/B)も整数であろう。 しかし、((n-1)C(m-1)/B)が整数と判断するのは論理の飛躍だ。 n=2, m=2, g=1と仮定すると、A=n/g=2/1=1, B=m/g=2/1=2. すると、((n-1)C(m-1)/B)=(1C1)/2となって整数ではない。 >>110 この漸化式は0<m<nという条件のもとなのでn=mの可能性はないです >>110 nCm が整数かどうかは別の漸化式 (n+1)C(k+1) = nC(k+1) + nCk を使って帰納的に証明する >>111 ならば、大きな整数で桁あふれ(overflow)が起きているのかもしれない。 long longを使うか、多倍長整数を使うとよい。 >>113 うーんやっぱりそうですか ありがとうございます (n*n-1Cm-1)/m と計算せず (n/g)*(n-1Cm-1/(m/g)) と遠回りして計算したのは掛け算より前に割り算をして桁あふれを防止するためだったのですが、これだけではまだ読みが甘いみたいですね k>nのときnCkはゼロになるはずだ。間違えている。 >>115 100!が何桁になるかわかっているか? 組み込みの整数使うより 多倍長整数使うような話だな 配列の四則計算かw とりま、1桁辺り1バイトからやって行くと良い。 アルゴリズムは手計算方式で。 cでutf-8文字列の扱い方がよくわからないのですがどうすればいいのでしょう >>125 ソース中にリテラルで書く書式? それともテキストファイルを読み込んでの文字列操作かな。 もしかしてWindowsでの扱い等の環境依存の話だろうか。 そーゆーのって、C言語じゃなくて、ライブラリの仕様なんで、環境わからないと誰も答えられないよな。 プログラム中で扱う時はiconv()で変換しちゃうと楽だな。Windowsは知らんがOSが変換やってくれなかったっけ?忘れた。 #include <stdio.h> int main(void) { int x, y, z; scanf("%d", &x); y = x; for (x = x - 1;x > 1;x--) { z = y % x; if (z = 0) { x = 0; } } if (x = 0) { printf("入力値は素数ではありません\n"); } else { printf("入力値は素数です\n"); } fflush(stdin); getchar(); return 0; } 素数判定用のやつ作ったんだが動かない 問題点教えてください fflush(stdin)は無意味 あとイコールが足りない 等しいかを比較するのは == if () の中であっても = は代入操作 × if (z = 0) ○ if (z == 0) × if (x = 0) ○ if (x == 0) すいませんマジで==忘れてましたw あとはif文でxの値に代入する数字を1にしたら直りました やっぱ自分だけで考えてると基本なことにも忘れてしまいますねw おまえらバカにすることしか頭に無いのか 初心者ならこういうこともあるだろうに 古代においては、(1 == y)としておけば、間違って(1 = y)とした時にコンパイルエラーで発覚する、という言い伝えが有った。 > >#include <stdio.h> > >int main(void) { > int x, y; > scanf("%d", &x); > y = x; > while (x % (y -= 1)) > ; > if (1 == y) { > printf("入力値は素数です¥n"); > } else { > printf("入力値は素数ではありません¥n"); > } > > return 0; >} > >>140 あーそうだな。今でもたまにそう書いてあるソースを見かける。 いつも自分ではやってないので違和感があるw まあでもCみたいな言語だと本当はそう書いておいた方が良いんだろうけどね。 そう言えばこの頃のコンパイラはifで代入だけしてるようなのは見つけて警告出してくれるな。 >>140 の書き方はしないでしょ。 間違って(y=1)とすることが有り得ないから。 などと偉そうに言えるようなレベルじゃないけど、そう思う。 printfの、パラメータに置換される文字列の呼び名は何ですか? %dや%cの総称です 英語だとformat specifier 日本語だと書式指定子とかそんな感じ リテラルには代入できないから、リテラルを左側へ書いておく 今は、MISRA-C で、100項目をチェックする事が義務化されているから、 違反は必ず報告される でも、トヨタのように、5/100 しか取れない企業もある。 95も違反してるw >>140 の話は >>1 の参考サイトにも出てる話だね。 C FAQ 日本語訳 ttp://www.kouno.jp/home/c_faq/ 17.4 に載ってる。 定数と変数の比較なら役に立つけど、変数同士の比較に使えないから 特に良くも悪くもない、という評価。 コンパイラがオプションを備えてるなら警告を出させるのが良いわな。 >>147 トヨタの例を見て分かるようにMISRA-Cは役に立たないという話か 全員が同じレベルで言語の仕様や処理系の実装を理解しているわけじゃないからなあ。 最底辺のレベルを合わせる為にMISRAのような約束事が有用であろう事は想像できるんだが… 俺、車業界のソフト屋じゃなくて良かったと思うわ。 いや、むしろ、いっその事、強制された方が楽か? 初心者です。 C言語には標準出力関数がいくつかあって気になったのですが、 puts("文字列"); puts("文字列"); puts("文字列"); などと書くのと、 printf( "文字列\n" "文字列\n" "文字列\n ); のように書くので結果は同じようになると思うのですが、速度やリソースの消費に違いはあるのでしょうか? どちらが速いとかメモリ消費が少ないとかあれば教えていただきたいです。 >>155 printf() は重い。puts() の方が軽いしコード量も少ない >>157 stdoutがline bufferedなら、どっちもwriteが3回呼ばれる 言語規格的には解析処理のあるprintfのほうが遅そうだけど これぐらい単純なprintfだと、gcc/clang辺りでコンパイルするとputsに最適化される 副作用諸々でputs自体の呼び出し回数を減らすことはないから、puts1回の呼び出しで済むprintfのほうが早い >>160 それはさすがになさそうだ… printf()/vfprint() のCのコードを#include しているわけではなく、単にリンカがランタイムのコードをリンクしているだけなのでは? いいかえると、printf() がCで書かれており、printf() もコンパイルするのなら最適化がかかるだろうが、さすがにそうじゃないだろう? >>162 はい、時代遅れ発見。LLVMとGCCはお互いに競争する形で最適化の技術を進化させているんだよ。 gccはビルトイン関数のprintfを持ってるのに、ライブラリをリンクとか何言ってんだコイツ ランタイムのコードをリンクか、どっちにしろアホ晒してるのは変わらんか ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.0 2024/04/24 Walang Kapalit ★ | Donguri System Team 5ちゃんねる