[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 05/09 23:32 / Filesize : 137 KB / Number-of Response : 653
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門編)Part 58



1 名前:デフォルトの名無しさん [2009/12/15(火) 23:42:55 ]
C言語の*入門者*向け解説スレッドです。
★前スレ
C言語なら俺に聞け(入門編)Part 57
pc12.2ch.net/test/read.cgi/tech/1260020924/
★過去スレ
makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★初心者、初級者の方は他の質問スレのほうが良いかもしれません。
例えば
【初心者歓迎】C/C++室 Ver.70【環境依存OK】
pc12.2ch.net/test/read.cgi/tech/1258873470/
とか
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 133代目
pc12.2ch.net/test/read.cgi/tech/1260532772/
★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

445 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 01:12:05 ]
int a[10];
&a[2]は「アドレス」としてコンパイル時に定められる
翻って
int a[10],i;
&a[i]は文法上はアドレスとしては定義不能。
あくまでもコンパイラに恣意的な解釈裁量権がある。

従って「アドレス」という概念は定まっているとは言い切れないんだ
な。これがw。

446 名前:437 mailto:sage [2009/12/21(月) 01:13:37 ]
>440

そう、*じゃなくてsizeofでした。

実はもう一つ文字列リテラルを配列の初期化子として与えたとき
というものがあるのだが、これは宣言の中だからね。


447 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 01:13:43 ]
慣習的解釈がされている部分もあるということですね

448 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 01:13:46 ]
>>445
お前>>441?何の本の受け売りか知らんが、ちゃんと理解してから書き込めよ

449 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 01:18:42 ]
>>440
もとの質問 >>424 は、ポインタと配列とではどこが同じなのか(意訳)ということを聞いてるんだよ。

450 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 01:22:24 ]
>445
根比べになっているけどさ、「アドレス」が無いってのは正しい。

ポインタの内部表現がどうなるべきかは定められていない。
その割には単項&がアドレス演算子だったりするのだけれど。

型T,識別子xにたいして
T x;
という宣言があったとき、&xがxを指すポインタを生成し、
*(&x)の評価結果がxでアリさえすればよい。

>&a[i]は文法上はアドレスとしては定義不能。
この文章の意味不明。
&a[i]は文法上何の問題もなくコンパイラも実行もできる。
ただし実行結果が保証されるのは0〜9だけ。

451 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 01:26:33 ]
>445
>&a[i]は文法上はアドレスとしては定義不能。

iがゴミの値だからどこにアクセスするかわからないのだけれど、そういう意味なの?

&a[i]→&(*(a + i))でiの値は不定。


452 名前:451 mailto:sage [2009/12/21(月) 01:28:43 ]
ごめん、舌足らずだった。
&a[i]→&(*(a + i))→a + i
でiの値は不定なので、ポインタの値も不定。

453 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 01:58:56 ]
*(&x)って表現は許されていいでしょうか?



454 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 02:33:07 ]
はい、もちろん

455 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 02:35:01 ]
>>450
&a[2]がコンパイル時定数になると書かれているように見える点については突っ込まなくていいのか?

456 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 08:10:58 ]
>>427をみて
>>437が出てくる意味がわからん。

intとdoubleはどちらも数値と言う意味で一緒

intは整数でdoubleは実数だからまったく別物!int==doubleはまったく違う!
つってるやつと同じ感じだな。

457 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 09:27:28 ]
>>386
失礼、68000じゃった…。68000シリーズのどれかの石じゃった。

458 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 10:19:39 ]
>>457
おじいちゃーん、免許更新の際にはに認知症のテストを受けてね

459 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 12:07:05 ]
うちは8085だったなぁ

460 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 16:57:28 ]
>>426
んなバカな。

461 名前:デフォルトの名無しさん [2009/12/21(月) 18:42:26 ]
>>426
んなアホな。

462 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 19:16:39 ]
>>459
Z80 の人気はどうしてなのか?と今でも首を傾げています。

463 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 19:18:39 ]
>>462
命令がシンプルだからじゃね?



464 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 19:19:41 ]
nop

465 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 19:59:56 ]
>>462
8080との互換性

466 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 20:23:59 ]
>>465
そんな答えじゃったら、なんで8080互換は人気なの?

467 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 20:27:11 ]
>>466
自分で考えてくれ

468 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 21:37:34 ]
>>462
たまたま、パソコンがたくさん売れ始めた時代にZ80を採用した機種が多数派で
みんながそれで育ったから。

パソコンに限った話じゃないれけど、世の中性能とか関係なく「売れたもん勝ち」なんだよ。

469 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 21:40:22 ]
>>466

8086 vs. Z80 vs. 6809 vs. 6502 その4
gimpo.2ch.net/test/read.cgi/i4004/1252639237/

ここのレスのジジイどもに一言ガツンと言ってやってください

470 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 21:40:49 ]
>>467
TK-80?

471 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 21:41:04 ]
×>>466
>>468

とにかく勘違い頑固ジジイどもばかりで困ります

472 名前:デフォルトの名無しさん [2009/12/21(月) 22:06:12 ]
構造体のメンバにポインタ配列を持つ場合どのようにメモリ確保すればいいのですか?

typedef struct{
char id[ID_LEN + 1];
int *num;
} HOGE;

int main(void)
{
HOGE *hoge;

if((hoge = malloc(sizeof(HOGE))= NULL){
fprintf(stderr, "Out of memory!\n");
exit(1);
}

if((hoge->num = malloc(sizeof(int) * 10)) == NULL){
fprintf(stderr, "Out of memory!\n");
exit(1);
}

......


とやってるのですが,hoge->numの領域を確保するところで落ちます.

よろしくお願いします.

473 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 22:27:02 ]
>>472
if((hoge = malloc(sizeof(HOGE))= NULL){

if ((hoge = (HOGE *)malloc(sizeof(HOGE))) == NULL){
にしてみてくれ。



474 名前:466 mailto:sage [2009/12/21(月) 22:29:43 ]
>>468 スレ違いですが、
一番大きい理由は、ザイログ社がセカンドソースのライセンスを
ヒモなしでどこの企業にも売ったからでしょう。

475 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 23:21:27 ]
8080は6800や6502といい勝負で、ぶっちぎりだったわけではない

だが68系の後継の6809は6800と互換がなかったため、
68系はソフト資産が分散・死亡してしまった

476 名前:デフォルトの名無しさん [2009/12/22(火) 00:13:42 ]
>>475
leave
ret

477 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 00:30:12 ]
いいじゃんx86の機械語体系が滅茶苦茶でも
速くて正確に動けばそれでいい

478 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 00:33:33 ]
出て行けw

479 名前:デフォルトの名無しさん [2009/12/22(火) 01:00:31 ]
68系の衰退は80系との勝負じゃなくRISCの台頭によることだろ

480 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 01:04:20 ]
68を知るようなジジイが珍答披露してるのか・・・
どんな人生送ってきたんだ

481 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 01:11:48 ]
4桁の68系はOSに恵まれなかった・・・

482 名前:デフォルトの名無しさん [2009/12/22(火) 01:15:25 ]
あんなもんにOSなんか求めてなかったし、あるのを知っててスルーが当時の答えだった

# ジジィ発言は気持ちわかる
# 当時の俺も同じ心境だったから

483 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 01:20:16 ]
灰列便利だな
配列があれば複雑な数値計算もできそう



484 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 01:21:13 ]
スレタイ読め
ふざけんな!

485 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 01:39:24 ]
多次元配列って結局人間がわかりやすいってだけで
一次元配列とかわらん?
a[100]ってやるのもa[10][10]ってやるのも確保されるメモリは一緒でしょ?

486 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 01:43:36 ]
多次元配列の学習をする時、例題とかやらなかったのか

487 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 01:45:46 ]
型が違う

488 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 01:48:48 ]
というか、ベクトルとスカラーほど違う

489 名前:デフォルトの名無しさん [2009/12/22(火) 01:49:13 ]
4桁68に対してはOSどころかBIOSにさえ抵抗があったが
BIOSの考え方自体は後のマシンとの付き合い方にSVCとはまた違った方向性を示してくれたことには違いない
当時はアセンブラ主体だったが、そこでのノウハウが後にCを始めてから**や(*)への一挙跳躍をもたらしてくれた

490 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 02:24:24 ]
しつこいなあ

491 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 03:54:39 ]
>>489
お前いい加減にしろよ
みんなうんざりしてんだよ

492 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 04:33:05 ]
当事者ならこんなとこで想い出語らないよ
最近調べたんでしょ

493 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 09:52:24 ]
入門スレでの知ったかはよくあること。上級者スレに行くほどのまともな知識は無い
ただのガス抜き



494 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 11:48:06 ]
せめてアセンブラスレに行けよなあ
スレ違いもいい所だ

495 名前:466 mailto:sage [2009/12/22(火) 11:58:54 ]
C使いと8ビットCPU経験者は、かなり重なるから食い付きがいいんだろ。

496 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 12:11:05 ]
クズが開き直ってんじゃねえよw

497 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 03:35:38 ]
今までPerl、Javaとやってきたんだけどもうランタイムが必要な実行ファイルにはうんざり。
ネイティブの何も必要としない純粋ピュアな.exeを作りたいと思って
手頃な入門サイトでCを押さえて今Win32APIをやってるんだけど、これが中々おもしろい。
なんの仲介もなく直にWindowsとふれあってる感じがする。
今までダブルクリックで起動するjar(関連付けによっては動かなかったりする)を使ったり
それをexewrapでexe化したりなんだかなぁという事ばっかりやってたのでCで普通のexeが作れて感動。
Cはポインタが難しいとよく言うけど実際やってみるとこれPerlのリファレンスじゃんって感じで飲み込めた。
他にもPerlやJavaの仕様の前身となったようなものが見受けられてあぁ、これが元ネタなんだなと思うこと多数。
なんの質問でもないけど、C言語っておもしろいですね。

498 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 03:49:10 ]
そのうちmsvcrt.dllに憤ったりするのだろうか
それにしてもサクサク動くから楽しいかな
Perlと比べると文字列の処理が貧弱すぎてびっくりするかも知れんけどがんばってー

499 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 07:13:10 ]
単なる時代錯誤だな

500 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 09:54:16 ]
>>497
Win32API やってるなら
windows.h を少しずつでも見たほうが良いよ。

501 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 10:53:19 ]
>>497
アセンブラおすすめ。
APIの呼び方さえ覚えておけば実行ファイルがあまりにも小さくなって感動する。
今までのWindowsアプリはなんだったんだって思う。

502 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 10:54:59 ]
APIの呼び方を覚えるのが手軽なら誰もC言語なんてやらないわ。

503 名前:466 mailto:sage [2009/12/23(水) 11:03:44 ]
>>502
APIの呼び方は、アセンブラでも手軽だぞ。
それ以外が大変だけど。



504 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 11:05:19 ]
呼び方を覚えるくらいなら手軽だぞ
アセンブラはコードがいちいち長くなって書くのも読むのも非常に面倒なだけ

505 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 11:46:17 ]
今どきは構造体だのローカル変数だのも使えるアセンブラもあるからな。

506 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 12:00:30 ]
アセンブラでもwindowsのバージョンごとに
どのDLLがあるとか無いとかから開放されないようが気がする。

507 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 14:41:12 ]
またか・・・・・・・・w

508 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 22:56:41 ]
Cで書くかアセンブラで書くか・・・
pc12.2ch.net/test/read.cgi/tech/1096478651/
アセンブリ言語最強伝説
pc12.2ch.net/test/read.cgi/tech/1199952217/
Windowsってアセンブリで作られてる?
pc12.2ch.net/test/read.cgi/tech/1248434163/

509 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 22:57:03 ]
機械語なら俺に質問しろ!
pc12.2ch.net/test/read.cgi/tech/1035288252/

510 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 22:59:21 ]
堕落したCプログラマのレベル -10
レベル-10: むしろnasmとかみたいなちゃんとしたアセンブラを使ったほうが楽だったことに気付く。

d.hatena.ne.jp/w_o/20060808#p3

511 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 01:48:43 ]
ソートのプログラムを組んだのですが、コンパイルしようとすると
report5.c : 7 : error : syntax error before numeric constant
というエラーが出ます
どう修正したらいいのでしょう?

ソースは以下です
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10302.c


512 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 01:57:49 ]
>>511

> #define N 50
>
> void sort(int x[], int N)

#defineでシンボルNを定義しているので、2行後が

void sort(int x[], int 50)

と置換される。

513 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 02:27:34 ]
>>512
深夜にありがとうございます!
仮引数になっていないのが原因だったってことでしょうか?

Nを小文字のnに変えてもみたのですが、今度は
report5.c : In function `sort':
report5.c : 9 : error : 'x' redeclared as different kind of symbol
report5.c : 7 : error : previous definition of 'x' was here
と出てしまいました…

ググってみるとxが衝突してるとのことですが、関数部とデータ入出力部の両方でxを使用しても問題ないはずですよね?



514 名前:511 mailto:sage [2009/12/24(木) 02:39:11 ]
連投すみません!
自己解決しました

どうやら7行目と9行目の両方で変数xを定義していたのが問題だったようで…
>>512様ありがとうございました

515 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 12:57:05 ]
食ったー
満足じゃー

516 名前:デフォルトの名無しさん [2009/12/25(金) 10:34:07 ]
問題文: kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10305.txt
linuxで、g++でemacsで書いて、k-termでコンパイル。


すみません。今日締切の問題で、スレ違いかもしれないんですが、どうかスレ主さま、作ってください。

お願いします。

517 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 10:38:26 ]
宿題スレがあるのにスレ違いと分かっててなんで質問するんだ?あほ?
このスレの方が勢いがあるから?当然のようにageてるし

518 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 10:46:10 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/442

酷いマルチ>>516のほうが後ってのが特に

519 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 10:54:38 ]
大抵宿題スレも見てるから、ここにマルチすると逆効果なんだけどね

520 名前:デフォルトの名無しさん [2009/12/25(金) 13:46:35 ]
>>517,518,519
すみません。すれ違いでした。でも本当に急いでいて・・

みなさん、無駄にスレ使ってしまってすみませんでした。

521 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 13:50:14 ]
>>520
逆効果なんだけど特別に許してあげるよ
感謝すればね

522 名前:デフォルトの名無しさん [2009/12/25(金) 14:11:41 ]
>>521
はい。

523 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 14:16:28 ]
書き込めば書き込むほど、答えが返ってくる確率が下がるんだがw



524 名前:デフォルトの名無しさん [2009/12/25(金) 17:01:15 ]
sprintfのところでエラーもでず勝手にPGが終了されるんだがなんだこれ?

525 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 17:03:53 ]
ソース見せてみ

526 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 17:07:18 ]
すみませんうつし先のバッファサイズが足りてなかったみたいデス
しかし何も出ず終了とは

527 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 17:07:36 ]
バッファ足りてないとか

528 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 17:08:36 ]
バッファ足りてないとか

529 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 17:08:37 ]
おぉリロード…

530 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 17:33:21 ]
>>528-529

この間1秒

531 名前:デフォルトの名無しさん [2009/12/25(金) 18:31:07 ]
PGが終了って、マ板ネタか?

532 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 18:32:10 ]
マは常に終了してるからな^^

533 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 18:42:41 ]
SEは終了してないとか



534 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 21:26:12 ]
defineってどういうときにつかうん?

535 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 21:29:04 ]
気持ちよくなりたいときに使う

536 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 21:58:05 ]
>>534
そりゃあプログラムを変更したい時に一か所一か所変更するのは面倒でしょ

537 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 22:06:15 ]
defineに限らず構造体の定義などもまとめてヘッダファイルに記述する。
あとで変更したくなったときに、ロジック側を弄らなくて済むようにしておく。
あとはデバッグスイッチとかの条件コンパイル用かな。

538 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 22:32:54 ]
多用するとタコ殴り

539 名前:466 mailto:sage [2009/12/25(金) 22:38:24 ]
MFCは、すごいマクロ使ってるね。あれはあれでありだとは思うが。

540 名前:デフォルトの名無しさん [2009/12/25(金) 23:19:37 ]
>>539
頼むから冗談はよしてくれ

541 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 00:08:47 ]
クリスマスにKFCでも食って気が上機嫌なんだろ

542 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 00:16:14 ]
気が上機嫌って何かおかしい気がしたけどよく考えたらそうでもない気がしないでもなかった

543 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 00:23:06 ]
いや、おかしい。気が狂ってると書こうとして
それはあんまりだと思って、上機嫌に変えた、つもりだったのです。



544 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 00:45:24 ]
>>537
defineも構造体定義も、ヘッダファイルに書く場合は複数のソースファイルに公開する必要がある場合。
ひとつのソースファイルだけで使用するなら、そのソースファイルで定義するのが基本。

545 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 01:37:05 ]
>>530
あたまわるいなぁ、とか言われなかったんだな

546 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 01:57:05 ]
>>539
MFCのマクロは、Cプリプロセッサの究極をいってるな。
いっちゃってるけど。

547 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 08:11:39 ]
誰かMFCのマクロを見せてくれ

548 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 17:30:50 ]
>>546
いやいや、究極と言えば、Boost.Preprocessorとかメタプログラミングの類。
こんな調子で、演算とかさせるんだぜ。頭がおかしいとしか思えない。
ttp://d.hatena.ne.jp/qnighy/20091107/1257587259

MFCなんてかわいいもんだ。

549 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 18:14:49 ]
Boost.Preprocessor はもう天才的。
プリプロセッサメタプログラミングだぜ?
本当にやりやがった・・・的な衝撃が走る。


550 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 18:32:21 ]
×天才的
○病的

551 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 18:34:03 ]
メタプロ見てるとなんかもう新しい使いやすい言語でもつくりゃいいのにって思う

552 名前:デフォルトの名無しさん [2009/12/26(土) 19:00:45 ]
思うね

553 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 19:11:58 ]
すいません。
feofというのは一体何の略なんでしょうか?



554 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 19:21:16 ]
File EOF だと思うよ
EOF は End Of File
細かいことはキニシナイ

555 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 19:21:43 ]
>>553
eof = End Of File
FILE *fp を取り扱う関数は、一般に fopen(), fclose(), fseek() のように頭に f がつくので、
f + End Of File = feof()
本当のところは知らないのですけど。

556 名前:553 mailto:sage [2009/12/26(土) 19:26:58 ]
feof end of file 略 でググってみましたらそれっぽいものが見つかりました。
ファイルポインタがEOFに達しているかどうかを調べるんだそうです
ttp://www.phpbook.jp/func/file/index3.html
ありがとうございました

557 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 19:36:57 ]
略称の語源じゃなくて用途を調べてたのかよw

558 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 22:59:09 ]
whileとSleepを使わずに
変数の値が変更されたときに自動で関数に飛ぶことって出来ないんですか?
atexit()みたいな感じに

559 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:00:00 ]
>>558
環境依存なのでOS等の情報が必要です

560 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:02:39 ]
atexitは自動じゃないよ

561 名前:デフォルトの名無しさん [2009/12/26(土) 23:09:56 ]
if ((flag & BIT1) && (flag & BIT2)) {
これをもう少しスマートにやる方法ないですか?

562 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:16:03 ]
コンパイラに最適化してもらいたい気分だ

563 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:22:17 ]
すいません。
codepad.org/3p4Q55et
本に書いてある内容を要約するとこんな感じになるんですが、

( !feof( stdin) )
というのは一体何を表しているのでしょうか。

stdinの中身がEOFにならなかったら〜という風に読めるのですが、
stdinとはcfPtrを指しているのでしょうか?
stdinでググると標準入力だというようなことが出てくるのですが、
標準にそのままキーボードから打たれたものがEOFになったら〜という意味でいいのでしょうか?



564 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:28:05 ]
>>563
戻り値

feof は,指定したストリーム上の最後の入力操作でファイル終了標識が
検出されると 0 以外の値を返し,ファイル終了標識に達しなければ 0 を返します。

とあるから、標準入力からWindowsならCTRL+Z、Unix系ならCtrl+Dが押される
と !演算子によって条件が反転し真になる

565 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:28:18 ]
>>561
ビットフィールドを使う

566 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:29:12 ]
>>563
そうだよ。
ソースに書いてある通り、ctrl-zでEOFが入力される。

567 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:29:46 ]
>>561
それぞれ1bitなら
if ((flag & (BIT1|BIT2)) == (BIT1|BIT2))

568 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:34:42 ]
>>564>>566
標準にキーボードから入力していてEOFが検出されなかった場合〜という意味ですね。
ありがとうございました。

569 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:37:40 ]
キーボードとはかぎらないしCtrl-Zともかぎらないがな

570 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:42:21 ]
>>569
すいませんどういう意味でしょうか?

571 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:46:41 ]
>>570
ファイルからリダイレクトとか。

572 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:46:47 ]
>>570
パイプやリダイレクトとか

573 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:47:47 ]
>>570
C言語にはストリームという概念がある。
ここに結び付けられるものは何でも良い。ファイルでも入出力デバイスでもC言語から見れば一緒。
ただ、一般的なPCではディスプレイ、キーボードが付いてるので"デフォルト(標準)"をそこにしてあるだけ。
標準入力がシリアル通信ポートだったり、標準出力がファイルだったりする環境もあるってこと。



574 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:53:40 ]
>>558
あきらめてアクセサメソッドを介して変数を参照するようにしてはいかがでしょうか。

575 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:54:09 ]
DOSやWindowsならCtrl+ZだがUNIX系ならCtrl+Dだったかな

576 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:58:10 ]
>>571->>573>>575
入力できればなんでもいいってことですか、ありがとうございました。

577 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 00:00:00 ]
何でもいいわけじゃない
何が割り当てられてるかだ

578 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 15:46:46 ]
>>567
その前提条件って必要なの?

579 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 16:11:57 ]
>>567
&&がなくなるから、速くはなりそうな気もするけど、
最適化でチャラになるかもしれないし、読みやすさなら
元のコードのほうがいいと思う。

580 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 21:48:47 ]
main(){
char hello[] = {'h', 'e','l','l','o'};
puts(hello);
}

結果がおかしくなります

581 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 21:50:48 ]
char hello[] = {'h', 'e','l','l','o'};
じゃなくて
char hello[] = {'h', 'e','l','l','o','\0'};

582 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 21:58:22 ]
>>581
ありがとう、期待する動作になりました。

583 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 21:58:27 ]
もしくは
char hello[] = "hello";



584 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 00:10:13 ]
>>578
例えばBIT1が ((1<<0)|(1<<1)) だった場合
flagの下位2bitがそれぞれ 01,10,11 のどれであっても
(flag & BIT1) は非0になるが
(flag & BIT1) == BIT1 となるのは、11の場合のみ。

>>579
普通は"(BIT1|BIT2)"をそのまま使うなんてやり方しないよ。
const mask = BIT1 | BIT2; // constじゃなくてdefineだろうがenumだろうが構わんが。
if ((flag & mask) == mask)
これを可読性が悪いとか言うならどうかしてる。
元の
>if ((flag & BIT1) && (flag & BIT2)) {
よりわかりやすいだろうに。

585 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 01:03:34 ]
どっちも特に難解な記述だとは思わないけどさ

(1) if ((flag & mask) == mask) 
(2) if ((flag & BIT1) && (flag & BIT2)) 

どうみても(2)の方が分かりやすい

586 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 03:31:36 ]
うーん、どうだろう
個人的には識別子が1個少ない分、(1)の方が読みやすい

587 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 03:40:46 ]
ビット演算には三項演算子を使うべきだと思う

588 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 04:30:39 ]
>>585
どうみても(2)の方が分かりやすいよね!

(1) auto hoge_mask=BIT1|BIT2|BIT3|BIT4|BIT5|BIT6|BIT7|BIT8|BIT9;
if((flag&hoge_mask)==hoge_mask)
(2) if((flag&BIT1) && (flag&BIT2) && (flag&BIT3) && (flag&BIT4) && (flag&BIT5) && (flag&BIT6) && (flag&BIT7) && (flag&BIT8) && (flag&BIT9))



589 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 05:52:52 ]
mask)==mask 部分が冗長に見えるから違和感感じるんDA

!^(flag|^mask) // こうだな

590 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 06:29:05 ]
>>589
ドモルガン使ってこう書いた方が見た目は奇麗。
!(~flag&mask)

まぁ~maskは定数になるだろうから>>589と計算量は殆ど同じだろうけど

591 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 10:39:41 ]
ビットビットうるせーよ

592 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 10:54:10 ]
>>591
禿同
可読性云々以前にコメントつければすむ問題

593 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 11:02:08 ]
今の時代、ビットフラグなんて使わないでフラグごとに変数使うんじゃねーの?



594 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 11:38:36 ]
>>593
時代は関係ないし、それいうならC使う事自体がどうなんだって話に。

移植性考えないならビットフィールドでもいいかも知れん。

595 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 12:14:55 ]
>>594
ただのフラグならビットフィールドでも移植性は関係無いだろ。


596 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 12:51:33 ]
移植性考えるなら、ビットフィールドのほうがいい。

597 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 12:58:56 ]
やりたいことが
フラグAが立つ、かつ、フラグBが立つ
なのか
ビットAとビットBの両方がセットされてる
なのかで使いわけろよ

フラグの実装がビットだからビット演算使うのは短絡的

598 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 13:00:28 ]
移植性考えるならドトネトのほうがいい

599 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 13:56:28 ]
上位ビット/下位ビットのどっちから割り振られるかが処理系次第な
ビットフィールド使うくらいなら、_Bool 使えばいいのに。

600 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 14:07:42 ]
ビットフィールド云々は置いといて、
ビット演算についてだけ言えば

if (value & 0x0001)

奇数かどうか、を見るこれだけでも
ビット演算はコメントを必ず入れるべきと思う。

601 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 14:11:17 ]
>>599
> 上位ビット/下位ビットのどっちから割り振られるかが処理系次第な
どんなもん、どっちでもいいだろ。

602 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 14:11:21 ]
思わない

603 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 14:11:28 ]
ビットビットうるせーよ



604 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 14:12:30 ]
思う気がする

605 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 14:22:14 ]
コメントよりマクロの方がいいだろ
if(IS_ODD(value))

606 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 14:23:20 ]
♪ひ〜とびと〜のビットビット〜

607 名前:デフォルトの名無しさん [2009/12/28(月) 14:40:05 ]
ビット命

608 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 15:02:13 ]
>>602
どっちでもいいだろ。
問題になるのはハードにマップされてるとかそういう時だけで、フラグで使ってるだけならメモリの配置は関係ない。

609 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 16:40:37 ]
どっちでもいいね

610 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 18:06:00 ]
いいんじゃないかな。どっちでも

611 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 18:20:29 ]
1bit毎のビットフィールドならエンディアンの影響は受けないでしょ。

612 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 18:30:26 ]
ビットビットうるせーよ

613 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 19:37:07 ]
Cのスレだから仕方ないだろjk



614 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 19:57:03 ]
ある整数の最上位の1であるビットが何桁目かを計算したいんだけど一発で計算剃る方法ってある?
ビット数分だけ判定繰り返すしかないかな

615 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 20:15:24 ]
あっぱれビット天国〜

616 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:05:18 ]
>>614
どんな方法があるのか教えてくれたら教えるお(´・ω・`)クフゥ

617 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:10:45 ]
一発じゃないけど
最上位ビットの位置が記された256個のテーブルを使う

618 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:13:18 ]
log をとるとかw

619 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:27:10 ]
人間の性能を表現するには何ビットあればいいですか?

620 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:33:57 ]
冬休みか

621 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:52:03 ]
どうしたの?君たち
警戒心起たせちゃって

622 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 23:00:34 ]
>>614
他人に作らせるのがもっとも賢い方法

623 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 23:13:11 ]
>>614
32bit なら 5回

下の関数みたいなのをマクロで作ればおk
int leftbit(unsigned long x)
{
int bit=0;

if(x&0xffff0000) bit+=16,x>>=16;
if(x&0xff00) bit+=8,x>>=8;
if(x&0xf0) bit+=4,x>>=4;
if(x&0xc) bit+=2,x>>=2;
if(x&0x2) bit+=1,x>>=1;

return bit;
}



624 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 23:27:01 ]
みんなレスd

>>623
それいただきます!

625 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 23:11:44 ]
みんなが笑ってる
お日様も笑ってる
るーるるるるっるー
今日もいいテンキー


だからどうしたというのですか。
っていうか何故テンキーが重要なのですか。

626 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 23:15:03 ]
ループしたらええやん

for(bit=0; result != 1; bit << 1){
 result = (BITCHECK & bit);
}

627 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 23:16:01 ]
最上位か
ほな逆にMSBから

628 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 23:32:48 ]
>>626
え?

629 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 23:36:01 ]
result = (int)ceil(log((double)x) / log(2.0));

実数演算だけど、logで計算したほうが、条件分岐が入るより速いんじゃないか?


630 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 00:15:06 ]
こういうときに、キャリーフラグの便利さを思い出す。

631 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 00:17:50 ]
実数は誤差が入るからダメ

632 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 00:18:35 ]
誰か超高速なreplace関数作ってけろ

633 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 00:33:09 ]
>>631
>>629は誤差とは関係ないだろ。



634 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 00:46:19 ]
>>633
すまん。俺が間違ってたorz

635 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 02:28:38 ]
>>633
なんで誤差とは関係ないの?

浮動小数点演算である以上、誤差はあるはず
誤差が1未満だから ceil()で消えるってこと?

>>629
ceil じゃなくて floor じゃないの?

636 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 03:11:06 ]
>>635
そう。
整数部にまで及ぶような誤差がでないと結果に誤差が反映しない。
はるか下のほうの桁にしか、誤差はでないと思われ。

よくみたら、切り上げだと桁が繰り上がるところで正しい結果がでないね。
+1してfloor()だ。


637 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 08:37:44 ]
#define mx(a,x,m,b) ((x)&m>(x)~m?(x)&=m,(a)|b:(x)&=~m,(a))
mx(mx(mx(mx(mx(a,x,0xaaaaaaaa,1),x,0xcccccccc,2),x,0xf0f0f0f0,4),x,0xff00ff00,8),x,0xffff0000,16);

638 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 08:40:37 ]
>>637
あ、だめだx変わんね!

639 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 08:49:40 ]
>629
浮動小数点数使うんなら frexp(x, &result) でいいじゃん。

640 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 10:21:01 ]
>>623 >>629 >>639 で簡単にベンチとってみた。
ビットが立っていない場合が 0 になるように一部変更してる。
codepad.org/VT7XBJAP

Core2Duo T7600(2.33GHz) / RAM 3GB
gcc version 4.3.4 20090804 (release) 1 (GCC)
最適化オプション指定なしで 50,000,000 要素に対して 10 回実行した平均値だと

>>623 1.4564秒
>>629 6.2842秒
>>639 1.5501秒

-O2 指定で
>>623 0.6673秒
>>629 6.0827秒
>>639 1.2921秒

641 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 10:57:31 ]
logって中の人がフーリエ展開とかしてるからおそいのかね?

642 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:09:46 ]
>>637 を推考し直してみました
#define mx(b,m,x,a) (x&m>x&~m)?(a)|b,(a))
=mx(1,0x55555555,x,mx(2,0xaaaaaaaa,x,mx(4,0xf0f0f0f0,x,mx(8,0xff00ff00,x,mx(16,0xffff0000,x,0)))));

643 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:15:41 ]
expは兎も角logは余り使われないから金がかかっておらず相対的に
「計算」が早くは無い。CPUレベルのサポートで
並列化を促進すれば何倍も速くなる筈だが、コストパフォーマンス
が低くやる価値が少ないと判断されてるだけ。



644 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:35:42 ]
さすがに6秒も差が出来ると主任も「ウーム」と改善を要求してくるレベル

645 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:39:10 ]
>>644
「試行回数を減らせば早くなりますよ!」

646 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:40:56 ]
>>644
回数が少なければ「わかりやすい」コードがお勧め

647 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:45:41 ]
え?一番早い方法を模索してるんじゃないの?

648 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:49:19 ]
ウチの上司は元組み込み屋なので
「呼んだ関数が処理してる時間は極力短く」
「呼んだ関数だけじゃなく処理時間そのものも極力短く」
「デッドラインを設ける」
とまあ常に組み込み状態

すべての処理コードが割り込みの考え方で動いてる
(他の誰も入って来れない時間を短く=CPU占有の時間を短く)

649 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:51:04 ]
>>641
底の変換してからFYL2X使ってるみたい
二回計算しないといけないから遅いのかもね

650 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:52:53 ]
つーかあれか
logは底がネイピア数だからそのままFYL2Xでいいのか
その周囲の面倒臭いコードはDOMAIN ERRORとかチェックしてるだけか
そうなるとlog10ならもっと遅いだろうね

651 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 12:00:37 ]
>>648
昔組み込みやってた
小さいものはパズルみたいで楽しかったけど
大きなものだと死にそうになるんだよな・・・・

652 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 13:09:09 ]
>>651
なるね






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<137KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef