[表示 : 全て 最新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++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

2 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 23:46:49 ]
998で質問する度胸

3 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 23:50:38 ]
#define HOGE 0x3FFFC020
だと、コンパイラ君に怒られることがあるかも?

4 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 23:51:16 ]
ふう

5 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 23:55:35 ]
volatile が重要で、ここは最適化するなということをコンパイラに知らせる。
メモリマップドIOや、別スレッドとの共有メモリなど。

6 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 23:57:20 ]

>>前スレの998
#define HOGE ((volatile unsigned int *)(0x3FFFC020))

この文の意味がわかりません。
#define HOGE 0x3FFFC020
ではだめなのでしょうか?

7 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 00:06:26 ]
あ、 #define HOGE 0x3FFFC020 じゃ、それ以前に駄目だな。
>>5 は、 #define HOGE ((unsigned int *)(0x3FFFC020)) じゃダメな理由ね。

8 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 00:10:29 ]
>998 >6

それはこのマクロをどう使うかによる。
キャストしているところを見ると、メモリ領域を示しているのだろうから、
ポインタとして使うだろう。

全スレでも話題になったが、int とvolatile unsigned int *では型が違うからね。

単に0x3FFFC020なら、intとして扱われる。


9 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 00:53:47 ]
int* a;
があったとき
a=(int*)calloc(100,sizeof(int));
*a=(int*)calloc(100,sizeof(int));
a=(int)calloc(100,sizeof(int));
*a=(int)calloc(100,sizeof(int));
a=(int*)calloc(100,sizeof(int*));
*a=(int*)calloc(100,sizeof(int*));
a=(int)calloc(100,sizeof(int*));
*a=(int)calloc(100,sizeof(int*));

どれが正しいか分からない


10 名前:デフォルトの名無しさん [2009/12/16(水) 00:56:00 ]
>>9
たかが8通り
全部コンパイルして試せばいいよ
正常に処理されたものだけ正しい
どれも正常に処理されなければ、おまでの常識は崩れ去る



11 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:06:51 ]
キャストすんなうぜえ

12 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:10:24 ]
>10

コンパイルできるから正しい訳じゃないぞ。
*a=(int)calloc(100,sizeof(int));
*a=(int)calloc(100,sizeof(int*));
はコンパイルは正常に完了するが、その後
正しくコーディングできるとは思えない。

13 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:11:49 ]
バグなんてコンパイルを通ったからこそあるものだろうから

14 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:12:38 ]
>>9
int*a=calloc(100,sizeof(int));

15 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:14:00 ]
結論:キャストなどいらぬ

16 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:15:03 ]
シンタックス上はどれも正しい
セマンティクス上では全ては正しくない

17 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:18:38 ]
セマンティクス - 意味・説明・解説 : ASCII.jpデジタル用語辞典
ttp://yougo.ascii.jp/caltar/セマンティクス


18 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:20:17 ]
>>11
a=calloc(100,sizeof(int));
*a=calloc(100,sizeof(int));
a=calloc(100,sizeof(int*));
*a=calloc(100,sizeof(int*));
どれが正しいの?

19 名前:12 mailto:sage [2009/12/16(水) 01:21:35 ]
>10
追記

a=(int*)calloc(100,sizeof(int*));
もコンパイルは通るけど、間違いだろうな。

この後メモリリークや、領域破壊しないでコードが書けるなら、
そもそもこんな書き方はしない。

正しい書き方といえるのは
a=(int*)calloc(100,sizeof(int));

だけかな。>11のいうようにCではキャスト不要なのだから
キャストしないほうがよいスタイルだと思う。


20 名前:デフォルトの名無しさん [2009/12/16(水) 01:22:09 ]
>>18
たかが4通り、全て試してみればよい



21 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:23:38 ]
過去にC言語の入門書2〜3冊ほど読んだがどれもキャストしてた。

22 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:24:18 ]
>18

左辺と右辺の型を考えようね。
a=calloc(100,sizeof(int));
a=calloc(100,sizeof(int*));
は文法上はどちらも正しい。
しかし
a=calloc(100,sizeof(int*));は普通は誤り。

23 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:25:17 ]
>>14でFA

24 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:30:13 ]
CとC++共通に使えるライブラリにしたいならmallocの戻り値キャストは必要。
(その場合はextern "C"も必要だが。)

Cだけで使うならキャストは不要。

25 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:30:51 ]
>>11
アフォ
calloc は、void* を返す。コンパイル通るからいいなんて言うなよ!

26 名前:22 mailto:sage [2009/12/16(水) 01:31:25 ]
なぜa=calloc(100,sizeof(int*));が誤りかというと
int *a;である場合、aが指す領域はaが指している型のサイズの整数倍の
領域が確保されなければならないから。

ポインタは指している型のサイズ分、アドレスが進むし、参照したときには
型サイズ分の領域を読むことになるから、実用上は

型Tと正の整数Nがあったときに
T *a = malloc(sizeof(T) * N);
となっていないと間違いと思ってよい。


27 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:32:20 ]
>>9,11

まとめ

Cだけで使うなら
a=calloc(100,sizeof(int));
が正しい(Cはキャストいらない)

C++でも使いたいなら
a=(int*)calloc(100,sizeof(int));
が正しい

C#では使えない

28 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:33:10 ]
>>27
× >>9,11
>>9,18

29 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:34:05 ]
>25

Cでは
void*は関数ポインタ型以外のポインタ型の値を、キャスト無しで格納できるし、
元の型に戻したときに同じになることが保証されている。

C++ではmallocなんて使わずにnew使え。



30 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:34:37 ]
>>14でFA



31 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:35:58 ]
ファー!ファー!

32 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:36:21 ]
FAR

33 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:37:52 ]
ポインタは入門者には難しいから覚えなくていいよ

34 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:40:21 ]
入門者が覚えることはたくさんある。ポインタなんて一番最後にちょろっとやればいい

35 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:41:14 ]
実際の現場でポインタなんて滅多に使わないのに入門書にはさも重要かのように扱われているのが残念でならない。

36 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:42:51 ]
ポインタはプロ中のプロと呼べるレベルのプログラマーだけに扱える分野。
入門者はまず制御文や条件文を目を閉じてでも書けるように上達するのが先

37 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:47:15 ]
プログラマー ・・・ グラマラスな女性モデルのうちプロフェッショナルのことの略

38 名前:デフォルトの名無しさん [2009/12/16(水) 01:49:44 ]
質問あるならじゃんじゃん書いちゃって!分かる人が答えてくれるから!

39 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:50:16 ]
>>29
君が言ってることは正しいが、
>>9 は、void* を int* あるいは int にキャストしようとしているので、
その例には当てはまらない。int* → void* ならC++でもキャストいらない。

40 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:54:38 ]
キャストしない場合a=calloc(100,sizeof(int));

キャストした場合a=(int*)calloc(100,sizeof(int));

何か内部的なことに違いがあるの?
「キャストしなくていい」の?
「キャストしないほうがいい」の?
「キャストしてはいけない」の?




41 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:57:42 ]
人に訊けば何でもすぐ分かると思って自分で調べようともしない
自分で調べてみて分からなかった時だけ質問しやがれ

42 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:00:29 ]
国会図書館に保管してある文献を一通り読んでみたけど分かりませんでした

43 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:01:45 ]
海外の文献もちゃんと調べたのか?

44 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:03:05 ]
はい

45 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:03:36 ]
とりあえず、コンパイルしたものを逆アセンブルしてくらべてミソ。

46 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:03:59 ]
逆アセンブルは違法です

47 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:04:50 ]
>>44
世界中の文献を調べて分からないようなことを知る人物などおりゃせん

48 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:05:29 ]
スレの存在意義が消滅しました

49 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:06:05 ]
法律で決まっているわけでもなんでもないでしょ、そんなもの。
それはそれとして、君は日本国憲法を読んでいるか。
逆アセンブルは何て書いてある。それはどういう風に書いてある、憲法に。

50 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:07:23 ]
逆アセンブルは著作権法違反



51 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:08:10 ]
特許侵害

52 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:09:36 ]
逆アセンブル・逆コンパイラ・絶対ダメ

53 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:10:10 ]
醍醐味だと思うけど

54 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:11:07 ]
>>47
地球外知的生命体なら・・

55 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:13:33 ]
>>49
何故に憲法w
「憲法」の定義から始めようかw

56 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:15:24 ]
最近ずっと話題になってる小沢の暴論のコピペだよ。天皇の部分を変えただけ

57 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:16:16 ]
>>55は世間知らず

58 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:20:02 ]
コピペの誤用のほうを詰るべきだろ

59 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:23:35 ]
>>40
そろそろ本題へ。
できるコードには基本的には違いありません。
基本はキャストするです。
キャストしないとコンパイラの警告レベルを上げるとwarning が出ますが、しなくてもコンパイルはできます。
昔は今の void* の代わりにintが使われていましたが、その頃はキャストしないのが普通だったようです。

60 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:24:01 ]
>>40

「キャストしなくていい」 ・・・ 個人の趣味レベルのプログラム

「キャストしないほうがいい」 ・・・ 学校の授業レベルのプログラム

「キャストしてはいけない」 ・・・ プログラマー




61 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:26:05 ]
C関連のスレではキャストの話でいつも盛り上がるね

62 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:26:52 ]
見た目が面白いよね、うん。

63 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:28:55 ]
>>40
キャストすべき

64 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:29:08 ]
安全だろうが安全でなかろうが男ならどんな言語でも明示キャスト

65 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:29:40 ]
>59
最後の文は正しいのか

66 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:31:22 ]
可読性を重視したコーディングを心がけなさい>入門者たちよ

67 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:32:55 ]
何が真実なのかさっぱりわからねえ

68 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:32:56 ]
>>66
自己レス乙

69 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:34:22 ]
>>67
自分で調べずに人に訊くからこうなる。まず自分で調べなさい

70 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:37:48 ]
クライアントから要求された以上のプログラムを実現する必要性は無い。余計なことは技術の無駄遣いだ。



71 名前:デフォルトの名無しさん [2009/12/16(水) 02:55:34 ]
何の話かわからないけど
キャストは別にしなくていいんじゃないかな?
必要ないんならしないほうがすっきりして読みやすいよ

72 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:55:49 ]
配列の全要素を同じ値にする関数があったと思うんですが名前を失念しました
なんという名前でしたっけ?
関数名(配列,値)
ってかんじだったはず

73 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:59:34 ]
>>72
memset
fill

74 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 03:05:29 ]
ありがとう!

75 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 04:44:57 ]
関数内に宣言されるauto変数について教えてください。
staticを付けないと関数から抜けたときメモリが開放されますが以下の書き方だと
開放されないようです。なぜ開放されないのかが理解できません。
*sには見えないstaticが付いているのでしょうか?

char *func(void)
{
 char *s=malloc(20);
  (省略)
 return s;
}


76 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 04:58:37 ]
解放されるのは変数sに割り当てられてるメモリであって、
変数sに入ってる値じゃないから。

77 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 05:17:07 ]
char *s=alloca(20);
にすれば期待した動作に成るよ

78 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 05:56:30 ]
ビットフィールドなるものがあるのを先日知りお試しPGを作成したのですが、ちょっとわからない箇所が。

struct tag1{
 unsigned int a  :1;
 unsigned int    :2;
 unsigned int b  :4;
 short id;
};

struct tag2{
 unsigned int b  :4;
 short id;
};
構造体tag1、tag2ともsizeofでサイズを見てみると6でした。
なぜ6となったのでしょうか?
------------------------------------------------------------------
int型のサイズは4バイト、short型のサイズは2バイトのOS(WinXP)で実行。
VCの設定項目である構造体メンバのアライメントは1バイトに設定しています。
------------------------------------------------------------------


79 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 05:58:36 ]
ビットフィールドは悪魔だ
できるなら使わない方がいい
速度も大幅に低下するし

80 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 06:27:51 ]
その通りだ
よくぞ言った



81 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 06:49:51 ]
>>78
ビットフィールドを理解していれば何の疑問もない筈だが?
いくつになるべきだと思うんだ?

82 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 06:52:34 ]
3になるとか思ったんじゃね?

83 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 07:37:34 ]
78です。
ビットフィールドを知ったのが最近なので理解不足であります。
知っているのは、コロンの後ろの数値が :4 なら0x0〜0xFまでが格納出来るエリアが確保されるくらいでしょうか。

このビットエリアが明らかにtag1、tag2違うのに同じサイズになるのが理解できません(´д`)



84 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 08:08:21 ]
使ってるビットだけのエリアが確保されるんじゃなくて、
unsigned intのエリアを確保してそこから、そのビットの分を使用してるだけ。

85 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 08:21:30 ]
それはない

86 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 09:18:50 ]
あるってw

87 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 11:37:39 ]
ビットフィールドはできるだけ局在化したほうがいいとは思うが、必要なら積極的に使えばいいと思う。
一々シフトしてアンドマスクかけて取り出すなんて面倒だし間違いやすい。
# 勿論、環境依存になるのでその旨ドキュメントに明記するのは当然として。

88 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 12:18:39 ]
test

89 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 13:07:26 ]
>>84 が正解。
だが、マスク・アンマスク方が、結局わかりやすい。
(値の取り出し用、設定用のマクロも作る)


90 名前:デフォルトの名無しさん [2009/12/16(水) 18:55:11 ]
あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ
ぬああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ


PowerPCいい!!!!!!!!!!!!

割り込み処理ラク!!!!!!!!!!!
ベクタとかいらねえ、まんま関数を置けばいいんじゃん!!!!!!!!!!!!!!!!!!!!!!!!!


でも俺の中ではSH >>>> PowerPC
だけどな!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!



91 名前:デフォルトの名無しさん [2009/12/16(水) 19:15:14 ]
やっぱ割り込みコントローラを自分で持ってる奴はいいなあ!!!!!

チョー気持ちいい
x86みたいにメンドクセーことしないで済む

ええなあ
ええ
ええぞ

92 名前:デフォルトの名無しさん [2009/12/16(水) 19:49:49 ]
ああもう素晴らしい
カウンタもついてる
SHみたいにナノセカンド単位でのカウンティングができる!!!!!!!!!
すばらしい!!!!!!!!!

OSのミリセカンドオーダーのスリープなんぞに頼らなくてもよい!!!!!!!!!!!!
蕎麦らしい!!!!!!!!!!

93 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 19:54:06 ]
すーぱーひたちとかネーミングがダサすぎて話しにならん

94 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 19:57:46 ]
はなしし?

95 名前:デフォルトの名無しさん [2009/12/16(水) 21:03:00 ]
ハードわからん奴カワイソス

96 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 21:04:07 ]
91 :デフォルトの名無しさん [] :2009/12/16(水) 19:15:14

なんか91というラベルがあって
デフォルトの名無しさんという配列があるように見える俺の専用ブラウザ。

97 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:01:48 ]
ncursesを使ってプログラム作ってます。(debian&gcc)
画面(端末)の背景全体を、特定の色にしようと思ったら
init_pairで指定した上でスペースで埋めないといかんのでしょうか?

98 名前:デフォルトの名無しさん [2009/12/16(水) 22:02:07 ]
*(unsigned int *)(0xAAAA)


というのが示すのは

int型のポインタが示す実体ですか?

99 名前: ◆QZaw55cn4c mailto:sage [2009/12/16(水) 22:10:43 ]
>>98
アラインメントを考えないことにすれば、そのとおりでしょうね。
ハードウェアよりな言い方をすれば、アドレス 0xaaaa から始まる int 型の変数の値ですね。

100 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:15:07 ]
謎のトリさん現る



101 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:15:43 ]
>98

「int型のポインタ」という言葉使いからして型がわかってないぞ。

*(unsigned int *)(0xAAAA)
の意味は
0xAAAAからsizeof(unsigned)分をunsignedとみたてて
アクセスしている。


102 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:20:35 ]
>>97
画面クリアの類でいいんじゃね?

103 名前:デフォルトの名無しさん [2009/12/16(水) 22:24:14 ]
>>99
ありがとうございます。


>>101

ではどのようにいったらよいのですか?


unsigned int型のポインタ??

104 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:34:35 ]
unsigned int*型の変数

まぁ別に難でもい伊田ろ。いい太古とはわ軽んだから

105 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:37:56 ]
そうそう、ポインタっつってもメモリのどっかに記憶されてる変数だから

106 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:49:22 ]
>>102
具体的には?
例えば、文字色を白、文字背景を青にして
なんも手を加えてない状態の端末背景が黒だと
文字のある所だけ背景が青になるんで、文字のないとこも
青色にしたいんですが。

107 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:54:55 ]
バカの言うことに惑わされんなよ
ポインタは通常の変数として規定されていない。

108 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:56:25 ]
バカがバカと罵るスレ

109 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:56:49 ]
>103

型名は宣言から識別子を抜いたもの。
よって
int *a;
の型名は「int *」日本語なら「intを指すポインタ型」だろうな。

よく「int型のポインタ」という人がいるが
int *a[10];
とかよめないだろ。

この場合の型名は「int *[10]」で日本語なら「intを指すポインタの配列[要素数10]」型。

int (*a)[10];
だったら
型名は「int (*)[10]」で日本語なら「intの配[要素数10]を指すポインタ」型


110 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:58:20 ]
C言語のプログラムをVisualC++で書いていて、そっちでは普通に動いていたのですが、
メモ帳にこぴぺしてCygWinで実行したら、

parse error before~

だとか

braces around scalar initializer

というようなエラーが出ます。
主に配列の宣言・初期化のあたりで発言するのですが。
何が原因なのでしょうか



111 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:58:41 ]
データの「型」を指すってのは有り得ない事だよな。
型は変数でもメモリのアドレスでもない。

112 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:00:14 ]
>>111
え?

113 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:13:06 ]
int *p=(int*)214F23BC;
pは214F23BCを指しているがintは指していない。

114 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:15:43 ]
int *p[10]は「int型の変数のアドレスを指すポインタ変数の配列[要素数10]」型
決して「intを指すポインタの配列[要素数10]」型ではないので間違えないように。

115 名前:デフォルトの名無しさん [2009/12/16(水) 23:18:25 ]
unsigned char TITLE[]="HOGE"

これはどういうこと?

116 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:19:58 ]
??

117 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:23:01 ]
>>115
HOGEという文字列の先頭へのchar型の変数を指すポインタ変数

118 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:25:51 ]
おいおい……

119 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:26:56 ]
>>177
char *x="abcde"
char x[]="abcde"
の区別ができてないバカ発見

120 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:27:09 ]
配列の初期化



121 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:27:39 ]
入門以前のやつは来るなよww
来ても良いけど回答者の側には来るなw

122 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:28:49 ]
アウトプットは学習効率を良くするからなあ

123 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:32:44 ]
>>119
117と177の区別ができてない馬鹿発見

124 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:32:54 ]
>>115
わざわざunsingedがついているところで、深読みをしてしまう。
昔は、char が unsigned のコンパイラも多かったなあ。

125 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:34:23 ]
>>115
書く場所によって意味が変わる。
関数の外なら
unsigned char TITLE[5]={'H','O','G','E','\0'};

の糖衣構文。

また、関数の中なら
auto unsigned char TITLE[5];
TITLE[0]="HOGE"[0];TITLE[1]="HOGE"[1];
TITLE[2]="HOGE"[2];TITLE[3]="HOGE"[3];
TITLE[4]="HOGE"[4];

の糖衣構文になる。


126 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:36:26 ]
補足すると、代入を strcpy に置き換えるコンパイラもある。

127 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:40:52 ]
>125

関数の外も中も同じ意味だぞ。

>126 (== 125?)

代入とstrcpyは別だろ。

unsigned char TITLE[]="HOGE"
は初期化であって代入ではない。

なんか昨日からポインタの知識が怪しい奴が回答側にいるな。

初級者は注意すること。
中級者は間違い探しをするとイイかも。

128 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:41:22 ]
入門者が入門者に適当を答えるスレです。
上級者様は上級者様専用のむずかしーいスレにいって戻ってくるなよ

129 名前:127 mailto:sage [2009/12/16(水) 23:43:58 ]
言い忘れたけど
unsigned char TITLE[]="HOGE"

のunsignedはない方がよいかも。

文字列リテラルの型はconst charの配列だから。


130 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:45:40 ]
125は、初心者が陥りやすい大きな間違いをしている。



131 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:46:07 ]
>>127 は、もはや荒らしの一種だな。

132 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:47:31 ]
>>128
荒らすな。

133 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:50:25 ]
>114

またわけのわからない読み方をするね。

宣言
int *p[10];
があるとき、pの型はint *[10]
ここまでは確定。

日本語にどう変換するかは規定されていないけどね。
あなたの日本語はよくわからない。

ポインタはポインタであって、アドレスではない。

アドレスを指すポインタ変数?


134 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:51:33 ]
127にとっては
int x=100;
これは初期化であって代入ではないらしい

135 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:51:51 ]
データ型ってのはサイズを示す指針だから、指しようがねえよw

136 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:54:08 ]
マイナスの値を取らない、取り得ないものだったら
明示的にunsignedを付けたほうがいい。
他人に読ますときは特に

137 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:55:49 ]
>113

>int *p=(int*)214F23BC;
>pは214F23BCを指しているがintは指していない。

pは214F23BCを指しているわけではない。
pの値が214F23BCであると言うだけ。

pは自分がどんな型を指しているか知っているので
*が適用されたときにどうやって値を取り出せばよいかわかる。

pが指しているのがintか、charか、struct{char x; short y; long z}なのかで
値の取り出し方が変わる。


138 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:58:05 ]
>134

>int x=100;
>これは初期化であって代入ではないらしい

その通りですがなにか?


139 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:58:15 ]
int *p[10];

これは普通に使うけど、

int (*p)[10];

これって使い道ある?
使ったことないぞ。


140 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:01:22 ]
上級者さまうぜぇ
関係ない話するなや
こんなところで「入門者バーカ」って言って悦にいってないでさっさと首つって市ね。



141 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:03:43 ]
>139

2次元配列を引数にとる変数の型。

void func(int p[10][10]);
のpの型がint (*p)[10]

後は組み込みでVRAMの先頭が与えられたときに
2次元配列として扱いたいときに、この型で領域の先頭を
指したりする。

142 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:04:20 ]
質問に答えず、質問とは無関係などうでもいい話には必死。
自分で回答する気はぜんぜんないくせに、間違った解答を見つけたとたん待ってましたとばかりにたたきにくる。
マジうぜぇわ。

143 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:05:01 ]
すくなくとも、このスレになってからは上級じゃなきゃできないような回答はひとつもないように見える。

144 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:05:14 ]
>>139
typedef int (*p)[10]
なら、稀によく使う

145 名前:厨房 ◆hfigpiEhOM [2009/12/17(木) 00:05:38 ]
ゲームの改造とかやりたいんですけど、C言語でできるようになりますか?

146 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:06:26 ]
プロアクションリプレイかコードフリークでも使ってろ

147 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:07:07 ]
このスレのローカルルール
上級者は荒らし

148 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:07:21 ]
ハッカーになりたいならCだけじゃ無理

149 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:07:46 ]
>110

問題の出るコードを貼ってみたら。
だけど環境依存の問題だろうから、
こっちがイイかも

【初心者歓迎】C/C++室 Ver.70【環境依存OK】
pc12.2ch.net/test/read.cgi/tech/1258873470/

150 名前:厨房 ◆hfigpiEhOM [2009/12/17(木) 00:10:45 ]
>>147>>148
ポインターがどうのとか言っていたので改造コードにはC言語の知識が必要なのかと思いました。
以前





151 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:15:50 ]
>>138
そうなんだけどさ、セクション配置かスタックに積むかで
バイナリレベルじゃ変わってくるじゃん?てことを言いたいんじゃないかとおも

152 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:33:52 ]
>>145
とりあえず、アセンブラだけでなく機械語も覚えろ。
改造だけなら、言語としてはこれだけの知識しか使用しない。

153 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:35:25 ]
実は、この5つすべて(Python, Java, C/C++, Perl, LISP)を勉強しておくのがいちばんいいのです。

これらはもっとも重要なハッキング用言語だというだけでなく、

それぞれプログラミングに対してまったく違ったアプローチをしているので、どれも非常に有益な勉強となるでしょう。

154 名前:厨房 ◆hfigpiEhOM [2009/12/17(木) 00:43:26 ]
>>152
アセンブリとか難しそうですね。
せめて自分でチートコード作れるくらいになりたいです。
まったくの初心者ですか今後ともよろしくお願いします。
ちなみに以前C言語も学習していましたが、ポインタで投げました。
また1からやり直したいと思います。


155 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:45:31 ]
これ試してみろ。違いが解るから。

#include <stdio.h>

char glob[]="HOGE";

void func(int n){
static char sta[]="HOGE";
char aut[]="HOGE";

printf("d%回目\n", n);
printf("global: %s\n", glob);
printf("static: %s\n", sta);
printf("auto: %s\n", aut);

glob[1] = 'A';
sta[1] = 'A';
aut[1] = 'A';
}

int main(){
func(1);
func(2);
return 0;
}


156 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:49:25 ]
>>153
C++ は要らねえな。

157 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 01:01:57 ]
Cに固執するアンチC++の哀れなこと

158 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 01:08:00 ]
条件によって変数の型を変えるプログラムって無理?
例えば
int a;
scanf("%d", &a);
switch (a)
{
  case 1:
    int b;
    break;

  case 2:
    double b;
    break;

  case 3:
    char b;
    break;
}

こんな感じで。


159 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 01:11:23 ]
C++のポジションはすでにレガシーとなっているよ。
普及してるが、FORTRAN、COBOLと同じ道を歩み始めている。

160 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 01:14:26 ]
int a;
scanf("%d", &a);
viod b;
switch (a)
{
  case 1:
    int c=(int)b;
    break;

  case 2:
    double c=(double)b;
    break;

  case 3:
    char c=(char)b;
    break;
}



161 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 01:29:59 ]
>>158
通常は、必要に応じてキャストすればいい。
つか、どうしたいんだ?


162 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 01:49:45 ]
>>158
無理。
たとえば、Windows の COM なら VARIANT型を使えば、なんとなくそれっぽいことができるが、入門レベルではない。

163 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 01:57:19 ]
目的にもよるんだが、「共用体」を調べてみるといい。
つか、その質問だけでは何がしたいのかが伝わってこないから答えられん。


164 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 02:23:46 ]
ユーザ関数に引数を渡す際に型を指定せずに処理がしたいんです。具体的には

ここをintでもcharでもいけるにしたい
        ↓
void function(double *v1)
{
  int i;
  for(i=0;i<10;i++)
  {
    //型の関係のない数値計算
    P[i]=〜
  }
}
ていうことです。

165 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 02:24:31 ]
んでいろいろ考えた結果
ユーザ関数ではとりあえずvoid*型でポインタを引数を受け取って、引数の中に型のタイプの情報(上のscanfのa)
を入れて、それに応じてキャストすればいけるかなと思ったわけです。

void function(void *v1,char a)
{
  int i;
  switch(a)
  {
  case 1:
    int *P;
    P=(int*)v1;
    break;

  case 2:
    double *P;
    P=(double*)v1;
    break;

  case 3:
    char *P;
    P=(char*)v1;
    break;
  }
  
  for(i=0;i<10;i++)
  {
    //型の関係のない数値計算
    P[i]=〜
  }
}


166 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 02:38:04 ]
ありえないな。
設計からやり直した方がいいよ。


167 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 03:00:09 ]
struct DATA
{
  int iheight;
  int iweight;
}

この様に定義された構造体データ(idataNum件)を
身長順にダブルポインタを使ってソートをかけたいのですが、
そのダブルポインタのスワップ処理が分からず困っています・・・。

void swap( DATA** stData_ptr, int idataNum)
{
  DATA* stSwap;
  for( int i = 0; i < idataNum-1; i++ )
  {
    for( int n = i + 1; n < idataNum; n++ )
    {
      if( (*stData_ptr + i )->iheight > (*stData_ptr + n )->iheight )
      {
        stSwap = ( *stData_ptr + i );
        ( *stData_ptr + i ) = ( *stData_ptr + n ) ;
        ( *stData_ptr + n ) = stSwap ;
      }
    }
  }
}

てな感じで自分なりに試行錯誤してみたのですが、どうしてもスワップ部でエラーが出てしまいます。
どうか、お力をお貸しして頂けないでしょうか?

168 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 03:02:53 ]
*(ポインタ+i)

169 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 03:16:59 ]
p[i]って書けばいいものをわざわざ足し算したりするからわけわからなくなってるっつーねん。
なんで変な書き方したがるかなぁ?

170 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 03:19:54 ]
え?



171 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 03:28:48 ]
>>168
ありがとうございます。

stSwap = *(stMyData+i);
*(stMyData+i) = *(stMyData+n);
*(stMyData+n) = stSwap;

このようにやってみたところ、一応コンパイルは通るのですが、
実行させてみるとメモリー違反っとなってしまいます・・・。

>>168
ごめんなさい。その書き方もあまり分からないので・・・・

172 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 04:59:27 ]
ありとあらゆるものをキャストする
この世の事実はすべてint型。
つまりint*型とint[]型とint型さえ使うことができればあらゆるプログラムの困難は解決する。

173 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 05:01:07 ]
>>164
マクロで無理矢理やるというおよそ非実用的な手段がある。
#define DEFINE_FUNCTION(type) \
void function_ ## type(type *v1) \
{ \
  int i; \
  for(i=0;i<10;i++) \
  { \
    P[i]=〜 \
  } \
}
そして、こんな風に引数として使いたい型だけマクロを並べる。
DEFINE_FUNCTION(int)
DEFINE_FUNCTION(dobule)
すると、それぞれ型に応じたfunction_int、funciton_doubleって関数が出来上がる。

こんなことするくらいだったら、C++のテンプレートを使ったほうがましなんだけど、ここはCのスレだし。

174 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 05:02:23 ]
テンプレートとかただのアヒルタイプだし。マジうける。
そんなものもint*型の前にはひれふすことになる。

175 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 07:32:49 ]
>>165
そういうときは、union使うといい

struct hoge {
 int data_type;  // 0:int 1:char 2:double ...
  union {
       char  c;
       int    i;
       double d;
    ...
  } u;
};


176 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 07:39:33 ]
>>175
いやその解は有りえんから

177 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 11:26:16 ]
void function(void *v1,char a)
{
  int i;
  for(i=0;i<10;i++)
  {
    //型に応じた数値計算
    switch(a)
    {
    case 1:
      //((int*)v1)[i];
      break;
    case 2:
      //((double*)v1)[i];
      break;
    case 3:
      //((char*)v1)[i];
      break;
    }
  }
}

こうはできないものかと妄想したが

178 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 12:59:18 ]
目的がわからんのだよ。
そんなのが必要になる状況なんてありえないだろ。

179 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 13:20:43 ]
型を別の引数で指定するくらいなら関数を分けるのが最善手。
そうでなけりゃ C++ で template 使え。

180 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 14:05:17 ]
template利用する場合でも数値を扱うなら実数と整数では別けて特殊化するがね



181 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 14:48:26 ]
漢字やひらがなでソートしたいのですが可能なのでしょうか
もしできるのなら詳しくソースコードを教えてください

182 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 14:49:25 ]
文字コードそのままでソートしてるんじゃねえの

183 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 14:50:07 ]
辞書データと比較してだな

184 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 15:04:33 ]
並べたい順に並べるだけだな。


185 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 15:11:03 ]
kwsk

186 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 15:14:02 ]
住所録ソフトとか見たことないの?
漢字使ってる場合とかは読みを別に入力して、その読みの順でソートするんだよ?
読みはローマ字表記のものもあればかな表記のものあるけど
どちらにせよその後は普通のソートだよ


187 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 15:53:48 ]
漢字に順番なんてものは無いんだから、
比較して自分が並べたい順に並べるしかないだろ。
「太郎」と「次郎」はどっちが先だ?


188 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 15:57:48 ]
あいうえお順なら、次郎が先、逆順なら太郎
文字コード順なら太郎が咲き


189 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 16:02:37 ]
DQNネームが流行ってる今、あいうえお順なんてふりがながふってないとムリ

190 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 16:07:14 ]
太郎と書いて「ジャスティス」と読ませたり
次郎と書いて「つぐろう」と読ませたり
出生届けの読みが自由ってどうなんだろうな



191 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 16:14:43 ]
>>190
読み仮名を登録しないだけかんだから「読ませ方」も自由なら「読み方」も自由
自分の好きな読み方で処理すれば良い

192 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 16:15:29 ]
>>190
読みは登録しないだろ

193 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 16:16:26 ]
それでも客は無茶を言う

194 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 16:18:22 ]
OPをEDより先にしたいとか、前編より後編を先にしたい場合に
読み以外の何で整列させればいいんだろ


195 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 16:19:39 ]
× 前編より後編を先にしたい場合に
○ 前編を後編より先にしたい場合に

196 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 16:21:05 ]
>>194
正規表現
ハードコーディングで頑張れ

197 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 16:24:26 ]
>>196
正規表現はCで使えたっけ?

198 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 16:29:36 ]
>>193
「この顧客リストを強い順にソートしてくれ」

199 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 16:39:49 ]
「グー・チョキ・パーを強い順番にソートしてくれ」

200 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 18:12:33 ]
テキストファイルの中身を文字コードで出力する方法ないでしょうか?



201 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 18:14:30 ]
16進ダンプ?

202 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 18:17:05 ]
>>201
ん〜000000とかの付属情報なしに純粋に文字コードだけ抜き出したいです。

203 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 18:19:31 ]
文字コードって言ってることがわからないんだけど

204 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 18:25:04 ]
テキストファイルの中身がunicodeで”あいうえお”と書かれていたら
”3042304430463048304a”と書き出されるイメージです。

205 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 18:31:57 ]


意外と難しいのがセンタリング
フィールドの大きさをまず測る

一文字だけなら、その中心部分、半分に割った位置にフォントの中心部分を置けばいいが
文字数が増えたときのオフセットの取り方が意外とパッと出てこないもの。

普通にやると
「堀 川 掘 ら れ た 町」
にならず、
「堀川掘      られた町」

みたいになってしまう

206 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 18:33:34 ]
16進ダンプを基本にして目的のものを書けばいいだけじゃ

207 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 18:34:50 ]
         ,. ‐''三ヾ´彡シ,=`丶、ヾ´彡シ,=`丶、シ,=`丶、,=`丶、丶、
      /'".:=≡ミ_≧_尨彡三:ヽ、≧_尨彡三:ヽ、彡三:ヽ、三:ヽ、:ヽ、
     //.:;:彡:f'"´‐------ ``'r=:l------ ``'r=:l-- ``'r=:l ``'r=:l 'r=:l
     /〃彡_彡′,.=、 ̄ ̄ ,.=、 |ミ:〉 ̄ ̄,.=、 |ミ:〉,.=、 |ミ:〉、 |ミ:〉|ミ:〉
    'y=、、:f´===tr==、.___,. ==、._ゞ{=、.___,. ==、._ゞ{,. ==、._ゞ{==、._ゞ{._ゞ{
    {´yヘl'′   |   /⌒l′  |`Y} /⌒l′  |`Y}′  |`Y}  |`Y}|`Y}   ああきあきらあきらめあきらめた
    ゙、ゝ)       `''''ツ_  _;`ー‐'゙:::::l{ノ_ _;`ー‐'゙:::::l{_;`ー‐'゙:::::l{‐'゙:::::l{゙:::::l{     そそこそこでそこで試そこで試合
.    ヽ.__     ,ィnmmm、   .:::|!mmm、   .::|!m、   .::|!   .::|! .::|!
   ,.ィ'´ト.´     ´`"`"`゙″ .::::;'`"`"`゙″ .:::;'`゙″ .:::;'″ .:::;' .:::;'
イ´::ノ|::::l \         "'   :::/   "'   :::/'    :::/   :::/ :::/
::::::::::::|:::::l   ヽ、      ..::  .:::/.、   ..:: .:::/.、 ..:: .:::/.、: .:::/.、::/.、
:::::: ::: |:::::ヽ    ヽ、.......::::/..:::/!\\:/..:::/!\\::/!\\ !\\ \
::::::::::: |::::::::ヽ    ``''‐--ァt''′ |!:::ヽ:::\t''′ |!:::ヽ:::\|!:::ヽ:::\:::ヽ:::\:\
:::::::::::::|::::::::::::ヽ、       /i|iト、  |l:::::::ヽ:::::\  |l:::::::ヽ:::::\::::ヽ:::::\:ヽ:::::\:\
:::::::::::::|::::::::::::::/:ヽ、   ∧|i|i|i|〉. ||::::::::::ヽ:::::::\||::::::::::ヽ:::::::\:::ヽ:::::::\ヽ::::::\:\

208 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 18:47:02 ]
改行はどうするんだろ。


209 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 18:47:23 ]
>>206
16進ダンプのことあまり理解してなかったみたいなので出直してきます

210 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 19:38:54 ]
それでいい



211 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 19:40:49 ]
>>199
      パ
     / | \
   チ  |  グ
  /    チ    \
グ     |     チ
| \    |    / |
|  チ  グ  グ  |
パ    \  /    グ
|  パ  パ  チ  |
| /    |    \ |
チ     |     パ
  \    チ    /
   パ  |  チ
     \ | /
      グ

212 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 19:56:20 ]
これはひどい

213 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 21:01:16 ]
>>211
天才現る!
と思ったら、ソートできてねぇ!w

214 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 21:21:28 ]
あらら

215 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 23:56:41 ]
>>211
まず配置のルールがわからない
発想はともかくもっと根本的な部分を調整しろよ

216 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 00:08:46 ]
>>211
ふっ

217 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 00:39:29 ]
ポインタって、バグがあるのに正常にうごくことがあるから厄介なのかね。

int *p;
{
int x;
p=&x;
}

p[1]=500;
こんなのでも正常にうごいてる(ようにみえる)かもしれないし。

218 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 00:46:00 ]
>176

>175の方法は普通によくやる。
ていうか>165を見てはじめに思いつくのはこれ。

>178
共用体は、引数に汎用性を持たせたいフレームワーク、メッセージインターフェイス
とかでよく利用する。

後はジャンプテーブルを使うために、関数のプロトタイプ宣言をそろえたいけど、
引数はいろいろあり得るような場合は、引数をvoid*にしたり共用体で渡したりする。

>179
関数のプロトタイプ宣言をそろえるのがミソなので、templateは使えない。


219 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 00:48:53 ]
>217

そうだね。不具合が発生するのが、全然別の場所、タイミングだったりするのが
やっかいだよね。

220 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 06:06:03 ]
>>219
たしかにやっかいだよね。



221 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 09:22:03 ]
>>218
これだけ勘違いカキコする奴もメヅラシイな
普段何やってんだろ??

222 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 09:25:04 ]
>>218 は別におかしくないぞ

223 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 09:31:21 ]
俺も>>218はフツーのことを言ってるだけに見える。
別におかしくは無い。

224 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 10:05:26 ]
>>218
おかしくないと思う

225 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 10:40:09 ]
>>222-224
最後の行は何か勘違いしているように思えてならないが、
まあスレ違いだしどうでもいいや。

226 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 10:50:42 ]
可変で関数ってのがあったはず、、、と思って調べてみたら見つかった
va_start
自分は使ったことないけど、これじゃダメなの?
ttp://wisdom.sakura.ne.jp/programming/c/c62.html
>printf()関数などは、フォーマット指定子によって引数リストの個数と型をチェックしていますね
と同じように型チェックしてから、、とか


227 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 11:42:01 ]
ようは、VBでいうVariant型を作りたいのか?

228 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 11:42:44 ]
かなりダメな気がしてきた、、、

229 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 11:44:38 ]
C++ならboost::anyが使えるんだけどな

230 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 11:49:19 ]
>>226
結局、何らかの形で型を示す引数を一緒に渡すわけで
>>165 から何も変わっていない。



231 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 11:53:27 ]
変わっていないな。

232 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 12:51:39 ]
なんだよこのグダグダ

233 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 12:54:29 ]
え?ディグダグ?

234 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 17:06:34 ]
判ってない奴が頑張りカキコ
判ってる奴は奴では一行レスのチャチャ入れるだけだからグダグダになるのは仕方がない

235 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 17:37:08 ]
それじゃできない。だけど、なにがしたいか分からんので、茶々入れるしかない。

236 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 19:25:04 ]
>>235
> なにがしたいか分からんので、茶々入れるしかない。
もう一度 冷静に自分の言っていることを検証したまえ。

237 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 19:43:03 ]
お、おれは分かってるよ。

キャッチコピーは「戦略的穴掘りゲーム」だろ?

238 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 19:50:19 ]
ほとんど全てのレスに対して間違い探しゲームが成立してしまうのがこのスレッドの凄いところ

239 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 20:02:52 ]
ライアーゲームは情報弱者には辛かろうな

240 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 22:49:36 ]
::

よくバイソンとかシーインクリメントとかで見るんだけど
なんこれ。



241 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 23:27:25 ]
>>237
戦略的穴掘りゲームおもしろそう

242 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 23:29:49 ]
アッー

243 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 00:05:15 ]
int main(void)
{
int num = 567;

num = num / 10;
num = num % 10;
printf( "%d\n", num );

return 0;
}


これを剰余演算を使わずに書きたいんですが、できますか?

244 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 00:10:37 ]
dividend = quotient * divisor + remainder
remainder = dividend - quotient * divisor


245 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 00:13:09 ]
num % 10

num - (num / 10) * 10
にする。

246 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 00:19:58 ]
>>243
int num = 6:

247 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 00:20:34 ]
以上です。

248 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 00:24:55 ]
>>247
itoaを使う方法考えてたのに〜

249 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 00:26:13 ]
That's all.

250 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 00:30:20 ]
>>248
すまんな…



251 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 07:11:41 ]
>240

シーインクリメントとは斬新な呼び方だね。
けどなぜCスレで聞く?

もしかしてスルーが正解だったか?戦略的穴掘りに落ちちゃった?


252 名前:デフォルトの名無しさん [2009/12/19(土) 08:42:08 ]
fread()とfwrite()の意味を教えてください!

253 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 09:00:32 ]
#include<stdio.h>

int main(void)
{
int data1 , data2, total, average;


printf("データ1? ");
  scanf("%d",&data1);
printf("データ2? ");
scanf("%d",&data2);

total = data1 + data2;
average = total / 2;


printf("合計 :  %d\n",total);
printf("平均  :  %d\n",average);


return 0 ;

}

何が間違っているか教えてくれないでしょうか?

254 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 09:11:20 ]
最初のscanfの前の全角スペース?

255 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 09:12:04 ]
>>253
何を聞きたいのか書いてないから
質問の仕方が間違ってるんじゃないの?

256 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 09:29:38 ]
ディグダグ?

257 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 09:54:57 ]
double average;
average=total/2.0;

もしかしてこれがしたいのでは無かろうか

258 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 10:00:03 ]
>>257
言っておくがそれも間違いだからな
average = (double)total / 2.0;
じゃなきゃおかしなことになる

259 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 10:03:06 ]
お前は何を言っているんだ

260 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 10:11:30 ]
>>258
つられクマー。



261 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 10:59:48 ]
また、scanfを連続させるときは

scanfが取ったバッファをクリアしてからでないとうまく取れない。

stdinから取ったら、stdinバッファをカラにしてから別のを取らないといけない

scanfは対象の変数のアドレスに値を入れるのではなく
stdinから取得バッファに入れてそこからアドレスに入れるのだ

262 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 11:10:03 ]
>>258
何のための2.0だよ

263 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 11:26:31 ]
malloc→freeと処理すると使っていたポインタはNULLポインタを指しますか?
それともmallocで確保したときのアドレスを保持したままですか?
まったく別でしょうか?

264 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 11:30:03 ]
mallocで確保したときのアドレスを保持したままです
NULLを指すようにしたければ自分でNULLを代入してください

265 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 11:31:34 ]
ありがとうございます

266 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 11:32:12 ]
いえいえ

267 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 11:37:44 ]
なんかいでもfreeしてやる

268 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 11:52:06 ]
ポインタをfreeとかで開放するのって
メモリが有限だから?
仮にメモリ領域が無限だったらfreeしなくていいの?

269 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 11:54:24 ]
駄目に決まってんだろカス

270 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 11:55:57 ]
メモリが有限だからです
無限だったらしなくていいかもね



271 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 12:06:10 ]
無限のメモリ領域なんて実現不可能なんだからその仮定は無意味

272 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 12:09:36 ]
アドレスが足りなくなるからアウトだろ雑魚が

273 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 12:10:25 ]
仮想メモリか。

274 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 12:50:23 ]
俺が気に入らないもの
シミカァロン(英語は発音大事)抜き

ThisIsAPointerForMalloc = Mr_malloc(FUCKINGTOSHINGBUFFERSIZETHATFUCKINGOSINGXING)

if(ThisIsAPointerForMalloc == NULL)
  Fucking


なんかムカつく

普通は

if( (ThisIsAPointerForMalloc = Mr_malloc(FUCKINGTOSHINGBUFFERSIZETHATFUCKINGOSINGXING)) == NULL)


だろ


275 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 12:52:19 ]
一生懸命長い綴り打ち込んでるのかと思うと目頭が熱くなる

276 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 12:53:28 ]
また、defineは大文字で
っていう縛りもムカつく

ネイティブから見ると、大文字ってのは大声で叫んでるようにしか見えない。

つまり
FUCKINGOSINGXING
ってのは

FuckingOSingXing!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


って怒りながら叫んでいるように見えるのだ。


それと自分で書いておいてなんだが
is の i だけ大文字にするとすげえ不自然きわまる。


277 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 13:00:31 ]
そうだねピカチュウだね

278 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 13:04:00 ]
カビゴン♀って何かムラムラくるよね

279 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 13:42:47 ]
例えばこんなものがあるとしよう

free(void*)

char *Memory_of_Love;

Memory_of_Love = (char *)malloc(MemorySize512);


ここで
free((void *)Memory_of_Love)


これも何だかなあと思う
void * は別の型にキャストできても
他の型からvoid* にはできないはずである。

またvoid*は「何の型でもいい」から、そのまま渡せば何が来てもウェルカムだから
キャストしても意味あらへん

280 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 13:45:21 ]
誰も聞いてないから、チラシの裏にでも書いといてくれる?



281 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 14:19:13 ]
ヤキソバうまかったわ
満足です

282 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 14:24:02 ]
妄想上の相手とシャドーボクシングを始めたら、
林先生の出番だろw

283 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 14:26:50 ]
亀田が勝ってしまったねえ

284 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 15:51:01 ]
>>240
シーインクリメントインクリメントのことなら、
俺はシーイクイクって略してる

285 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:26:15 ]
ちょっと心温まる豆知識
インクリメント・デクリメント・サクラメント・ハラスメント



Cだと++って書けば自動的に値が1増えるし
--って書けば自動的に値が1減るが

CPUの機能として、そのようなものを持っていないものが多い。
特にRISC。
これらのCPUではアセンブラになると逆にそういうことができない。
1命令で値を増減させることが出来ないだけで、ADDなどで増やしてやればいいだけだが。



残るサクラメントとハラスメントだが、CPUには何の関係もない。
単なる語呂合わせに過ぎん。

286 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:29:33 ]
CISC はアセンブラで書くために命令が高級なんだよな。
今はもうアセンブラで書くやつはいないから CISC はレガシーだな。

287 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:31:20 ]
>>285
いかにもわかったような口ぶりでウソ書いてるやつってちょくちょく
見るけど、どういうつもりなのかマジで疑問。

288 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:35:40 ]
>>286
SSE3だのSSE4だのコンパイラが上手く扱えない妙な命令が次々に増えていく現状をどう見るかね

289 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:36:38 ]
俺の大好きなSHや、PowerPC、ARMはアセンブリ命令としてインクリメント・デクリメント命令がある。
が、いろんなところでよく使われるMIPSはそんな便利な命令はない。

むしろ、インクリメントなどの命令があるSHとかがRISC陣営では異端中の異端


290 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:39:46 ]
>>286
それ、認識が十数年くらい遅れてる。



291 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:40:54 ]
SPARCのinc %regは add %reg, 1, %reg のマクロだけど
結局1命令なので実質あるのと同じ

292 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 17:05:40 ]
また湧いてきたか

293 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 17:20:40 ]
インクリメントするやつはちゃんとCPUさんありがとうコンパイラさんありがとうって
感謝しながら使えよ

あと風呂でションベンするときはお風呂の神様ごめんなさい


294 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 17:56:28 ]
>>279
> void * は別の型にキャストできても
> 他の型からvoid* にはできないはずである。
逆だ。

295 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 18:48:15 ]
>>294
いやあってる。
char *p;
if ((p = malloc(sizeof(struct hoge))) == NULL)
とかけるのは >>279 があっている証拠

296 名前:デフォルトの名無しさん [2009/12/19(土) 19:14:04 ]
できる/できない、で言えば間違いだろ

297 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 19:39:58 ]
>>294-296
279は暗黙のキャストも知らないような
自称上級者なんだから触れんな。

298 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 20:11:55 ]
>>297
あえて明示的にキャストすることでソースの可読性がうんたらかんたら



とかゴチャゴチャ言い出すぞきっと

299 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 20:23:48 ]
>>279
>void * は別の型にキャストできても
>他の型からvoid* にはできないはずである。

>他の型からvoid* にはできないはずである。
が、まさしく「自分は初心者です」ってアピールしてるんだよな。

300 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 20:33:43 ]
自分は初心者なはずである。



301 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 20:37:53 ]
ポインタ変数なんてどんなものだろうが実態はただのINT型の整数なんだからキャストできないわけないじゃん。

12345678って書くか[12345678]って書くかの違いだけで。

302 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 20:49:04 ]
>>301
ポインタが int という仮定は例外が多い。

303 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 20:54:54 ]
>>301
ポインタは「整数型」への変換は保証されているが
「int」への変換は保証されていない。
(逆変換で戻したときに情報が失われる可能性がある)

304 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:17:28 ]
倍数判定機を作ろうと思ったのですが、エラーが出てうまくコンパイルできません
どこが間違っているのでしょうか

#include<stdio.h>
void baisuu(int y)
{
int b;
for(b=2;b<=20;b++)
{
if(y%b)
printf("%dの倍数です",b);
}
int main(void)
{
int x;
printf("整数を入力してください\n小数点以下は切り捨てます\n");
scanf("%d",&x);
baisuu(x);
return 0;
}

305 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:24:07 ]
>>304
!

306 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:30:07 ]
(無保証な)ヒント:
論理式に単項式だけを書くやり方
そう if( y % 3)とかwhile( !p )とか
はかっこいい
ように見えて実は
古くダサい
し、下らないミスの温床

if( (y % 3) != 0)とか
while( p != 0 )とか
書く癖のほうが類似書式のプログラミング言語(Javaとか)
も使うようになった時を考えるといい

307 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:31:00 ]
>>304
void baisuu(int y)にも}が足らん

308 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:37:54 ]
とりあえず>>306 >>307の指摘部分を直したのですが
今度は「左辺値が必要」というエラーが出て
うまく倍数判定もできません

void baisuu(int y)
{
int b;
for(b=1;b<=20;b++)
{
if((y%b)=0)
printf("%dの倍数です\n",b);
}
}

309 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:42:51 ]
int a,shidt;
ととして
((a-shift)?(a-shift):2)
の演算でおかしな挙動するので調べてみたら
a-shiftがマイナスでも真と判定されてた
(((a-shift)>0)?(a-shift):2)
としたらちゃんと動いた
真と偽の動作を勘違いしてました


310 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:43:31 ]
>>308
それは代入だろ。

y % b == 0



311 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:45:36 ]
>>310
おお、ちゃんと動きました
=と==の違いを忘れてました

312 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:54:24 ]
意外と中級車も=と==を間違えるんだよなぁ
さすがに上級者はそんな間違いをする人はいなくなるが。

313 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 22:01:51 ]
代入演算子 = が悪い。
どうしてこうなったのか。

おかげで等価演算子は == という悲しさ。。

314 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 22:07:20 ]
比較式より代入式の方がソースコード中の出現確率が多いを思ったから代入を=にして比較を==にしたんだろ
面倒なことはできるだけしない、可能な限りシンプルにしたい、そう考えると納得がいく

315 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 22:22:54 ]
五目並べの盤面評価関数ってどんなふうに作ったらいいと思う?

316 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 22:49:47 ]
>>314
pascal のように代入を := にし、比較は == にすれば公平でいいかも。

317 名前:デフォルトの名無しさん [2009/12/19(土) 23:02:43 ]
pascal が嫌いな人が作った言語でか

318 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:08:46 ]
=と==を間違えるなんて都市伝説だろ?
おれはめっちゃ初心者のときしか間違えてないよ。

319 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:19:27 ]
確かに、ほとんど間違えないんだが、コーディング規則がちゃんとしていないと、いったん間違えると発見困難になることがある。
20年前は、
char *p, *q;
...
if (p = q) {...}
で、この = は間違ってないというような書き方が普通に行われていた。

320 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:29:35 ]
ソースは可能な限り短いほうがいい。

…みたいな考え方のアフォとは一緒に仕事したくないな。



321 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:33:07 ]
>>319
それは、今は警告でるし。

>>320
そういうのは状況によるとしかいいようがない。
「冗長に書けば書くほどわかりやすい」とか思ってるやつも勘弁して欲しいし。

322 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:35:15 ]
変数は可能な限り少ない方が良い。
繰返し回数は可能な限り少ない方が良い。

323 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:40:12 ]
>>319
30年前の間違いだろ。
20年前は既に警告出すコンパイラが主流だし
わかりやすさを優先することが当然になっていたよ。

まあ類は友を呼ぶというから
そういう人達の間ではそれが普通だったのかもしれんがね。

324 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:42:29 ]
>>320そういうひとって
printfもpfとかに名前をかえて

int a;
void f(){
pf("asdf");
}

こんなことしたがるような人?

325 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:43:27 ]
いや、それは論外すぎるだろ…

326 名前:デフォルトの名無しさん [2009/12/19(土) 23:48:26 ]
>>253です。
質問内容はコンパイルの出来ない理由を御聞きしました。
どうやら原因は全角スペースに問題があったみたいです。
回答してくれた方ありがとうございます。

327 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:49:58 ]
>>322
そういう考えでできたのが構造体やクラスや配列なんだろうな

int Taro_age;
int Taro_ID;
char* Taro_Name;
char* Taro_EmailAddress;

int Hanako_age;
int Hanako_ID;




みたいに一個一個作ってたら大変だし。

328 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:13:15 ]
int x;
int* p;
p=&x;
printf("%d",p);

この結果が毎回違うのはなぜ?
アドレス固定することはできないの?

329 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:17:15 ]
>>328
pに格納しているxのアドレスを表示している

330 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:20:13 ]
変数xが格納されているメモリの位置はOSが管理している



331 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:21:19 ]
int x;
int* p;
p=&x;
printf("%d",p);

int x;
int* p;
p=&x;
printf("%d",&x);

int x;
int* p;
p=&x;
printf("%d",*p);

int x;
int* p;
p=&x;
printf("%d",x);

332 名前:319 mailto:sage [2009/12/20(日) 00:28:57 ]
>>323
少々遅レスで悪いが、30年前だと、K&Rの出版年になっちゃいますね。
20年じゃなくてもう2,3年前かも知らんけど、warningがたくさん出るようになったのは ANSI-C普及と同時期だったような気がする。
前のは例が悪かったけど、少なくとも当時は、
while (!(p = p->next)) { ... }
といった書き方はごく普通だったと思うし、悪いともされてなかったと思う。

このスレでもキャストうざい派がいるように、いまだに警告無視する人はいるみたいですよ。

333 名前:デフォルトの名無しさん [2009/12/20(日) 00:32:26 ]
>>318
俺もそう思ってたが
先週 != を ! = と書いて
すっげー落ち込んだ

334 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:34:54 ]
警告ってなんなん?問題があるならエラーにしろや

335 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:35:38 ]
>>332
確かに、警告を出すのは比較的あたらしいコンパイラって印象がある。

そもそもこの警告って、C言語の文法に違反してるとかじゃなくて
よくある間違いだから、って理由だしね



336 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:37:21 ]
int main()は値を返すべき

337 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:40:36 ]
>>330
プゲラ
トーシロは黙ってろよwww

338 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:41:56 ]
仮想メモリ。。

339 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 01:30:05 ]
>309

それは可読性を考えたらこっちがよくないか?


(( a > shift) ? (a-shift) : 2)

340 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 01:34:36 ]
>328

そのコードで&xの値が毎回同じになることを期待してはいけない。

自分でメモリ管理するのでなければ、変数やmallocの具体的な
値については、知らなくてイイし、依存するようなコードを書くべきではない。




341 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 01:45:17 ]
関数外でxを宣言してみたら

342 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 01:53:36 ]
せっかくCをやるんだからメモリのことは熟知したい

343 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 02:37:24 ]
初心者です。文字列のコピーについてです。

char a[10];
strcpy_s(a, "こんにちわ"); ・・・・・・・ これは正常に動きます。
a = "こんにちわ" ・・・・・・・ これはエラーになります。なぜでしょう。

a は配列の先頭アドレスです。"こんにちわ"も配列の先頭アドレスです。
a = "こんにちわ"は、アドレスをコピーするだけなので正常に動く気がしてしまうのです。

エラーメッセージは、「const char [11]' から 'char [20]' に変換できません。」です。
変換?「=」は代入を行っているわけではないのでしょうか?

344 名前:343 mailto:sage [2009/12/20(日) 02:38:14 ]
char a[10]; は char a[20]; にしてください。

345 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 02:45:40 ]
配列の場合、変数なのは中身であって、配列を示す a 自体は変えられない。


346 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 02:49:45 ]
"こんにちは"

347 名前:343 mailto:sage [2009/12/20(日) 02:58:26 ]
>>345
ありがとうございます。ですが難しく、頭の中で理解ができていません。
もう少し優しく教えていただけると助かるのですが・・・。

348 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 03:04:01 ]
char *a;
a = "こんにちわ";

349 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 03:17:27 ]
エラーメッセージをよく読みませう

350 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 03:19:20 ]
>>343
これを試してみ

char a[11];
a = "こんにちわ";

VBとかJavaに慣れてると、Cの配列や文字列は扱いづらいよね
最初のうちは参考書をちゃんと見た方がいいよ



351 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 03:26:34 ]
a[10]が '\0' ってこと?

352 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 03:42:52 ]
>>347
配列と文字列リテラルは一緒じゃないよ。

文字列リテラル"こんにちは"は、その時点でメモリのどこかに確保されてるわけじゃない。
確保されてない領域のアドレスを代入しても意味が無い。
配列がポインタに成り下がるのは"右辺"のみ。配列の内容はあくまで[20]の部分。
アドレスじゃなくて配列の内容を書き換えたいのだから、単純な代入ではできない。

353 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 04:06:47 ]
char a[20] = "こんにちわ";

char *p = "こんにちわ";
は全くの別物。

354 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 04:12:26 ]
将来的に
char a[20]="因習文法";
は禁止される予定

SJISとして
char a[20]={ 0["一貫文法"],1["一貫文法"],2["一貫文法"],3["一貫文法"],
4["一貫文法"],5["一貫文法"],};
てな感じしか許されなくなる可能性も示唆

355 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 04:13:32 ]
>>350
バカ?

356 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 05:08:58 ]
>>350>>355の1.1倍バカだね

357 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 06:20:56 ]
>>343
配列とポインタ、アドレスの理解がごちゃごちゃになってるからそうなる。

358 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 06:40:45 ]
だそうです!

359 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 07:41:09 ]
モンスターが勝手に穴掘って落石連鎖に巻き込まれてる雰囲気
もちろん特点加算無し

360 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 07:59:15 ]
残機も無し



361 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 08:02:19 ]
あと数十年後
メモリが100GB、CPUの処理速度も今の数百倍とかになったら
C言語も変わるかなぁ

362 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 08:57:45 ]
>>350の言うようにしても>>343と同じ結果になるだけ。
>>350は文字列と配列をなんにも分かってない。

363 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 09:29:34 ]
>>361
そりゃスタイルは多少変化するだろうけど
コンピュータの仕様が根本的に変わらない限りCに望まれる働きも変わらないはず
新しい環境に合わせたプログラミングモデルを作るのはむしろ派生言語の役目だと思う

364 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 09:45:20 ]
>>363
お前には言ってないからw

365 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 09:46:16 ]
>343

とりあえず、「配列には代入できないから」と思ってください。

正確には、配列は式の中では、「その先頭要素を指すポインタ」
として評価されるが、それは「代入できない左辺値」であるから。

ついでに(初期化付き)宣言と式では文法が別物になっている。

char a[20] = "hello";
はOK

char a[20];
a = "hello";
はNG


366 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 09:52:41 ]
>343

疑問の主旨とは変わるけど
strcpy_sだったら、そのコードコンパイル通らないんじゃないの?

CRT-Cだと思うから、こんなコードじゃね?
strcpy_s(a, sizeof(a), "hello");


367 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 09:55:14 ]
初期化付き宣言でややこしくなってるのだなぁ
と思う

368 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 10:02:38 ]
まあちょっと、誰もが一度は通る道だよな。
そして、だれもが曖昧な理解だけで通り過ぎていく箇所だわな。

369 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 10:05:55 ]
>352

ちょっと説明が怪しいぞ。
Cの文法のイヤらしいところでわかりにくいのだけれどさ。

文字列リテラルの型はconst char[文字列長]で、普通は
書込不能な静的メモリ領域に置かれる。これは>343
でエラーになることとは直接関係ない。

「配列がポインタに成り下がるのは"右辺"のみ。」
はそんな感覚でよいと思うけど、正確には
「配列を評価すると代入できない左辺値となる」

char a[10];
a[0] = 1;

は左辺だけど、ポインタとして評価されている。

370 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 11:19:19 ]
メモリ管理は、いっぺん自分でやってみたほうがいい。
最近は大学でさえ教えないからな
俺のときはやったのに





371 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 11:29:46 ]
メモリ管理って?
Z80を使ったアセンブラ演習はした。
テンキーでマシン語入力して実行させるんだよな。
ステップ実行でメモリを観察しながら。

372 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 11:31:34 ]
言ってみれば、自分でOSを構築するってことだな

メモリ管理に留まらず、スレッディングやマネジメントも含まれる。

聞いたら、そういうの今の大学じゃやってねえっちゅう話じゃねえか


なもんで、リバースエンジニアリングすらも満足に出来ないと。
それできないとウィルスのリバースエンジニアリングも出来ない=検知できない
だからセキュリティ業界は人材の確保が大変だとよ

373 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 11:39:35 ]
アセンブラのみでBIOSを構築したり、OS作ったり
とにかくありとあらゆる既存のライブラリやミドルウェアなどを使わずに
自分で何もかも構成した。売り物には、かなわないにしろな
HDDの制御やファイルシステムなども自分で考えて構成したりした。

普通大学つったらそういうことやるだろ
が、今は何かねむたいことを言ってやらないと。

374 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 11:53:00 ]
だから独り言なら他所でやれよ

375 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 12:20:43 ]
やだやだー

376 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 12:31:25 ]
char a[10]; の a の部分はラベルだとでも考えたら良い。


377 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 15:50:09 ]
ツェーの仕様上、アドレスの受け渡しは

明白に誰が何に使っているか分かってないものは渡せません!

っていうお約束がある。


「こんにち波」っていうのは、あくまでも「まだどこにも属しておらず、アドレスともデータとも認められていない」
状態である。そのソースを呼んだ感じで言えば。


「文字列は連続したアドレスに入れられるよ」って言うのは人間だから分かっているだけで、
コンピュータ内部では「まだどこにもンなもんあらへんやん」という未知の物体なのである。


それと、アドレスだけでは「どこからどこまでか」が分からないので
これも単純にやりとりするわけには行かんのである。
配列は長さが明白に分かってるポインタのようなものだから、
それが分からないポインタには単純に代入できない。

378 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 15:52:46 ]
          ___
         ξ _ ヽ
           ̄ ├-┤
    / ̄ ̄ ̄\)〆 |
    |       \ |
    ‐∩∩―┐   ||
     |・ ・   |   |│  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ┗ ^ ┛ |    | | <  ツェー!!!
    /777^l |    ||   \
    ) ̄ ̄_ノ__|   lヽl|     ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ,―  ̄ ̄_η_|/V^  |
  l   ̄ ̄|_Ξ)/   |
  `‐―┬┘\/   |
      |        | 
      |  〇     | 
      |        |
      |__∧___|
      |   |   |    ∩ 
      |   |__|_ __ ∫ )
      |       \ ̄ ノ 
      `―┬‐―┬‐┘ ̄  
        /  /
      /  /
     /  /
,〜^⌒\__/

379 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 16:47:46 ]
byte* p=malloc(10000);
free(p);

これを行うと何がおこる?
mallocで確保した10000個の領域が全部開放されるの?

380 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 16:54:26 ]
連続したbyte10000個分の領域1つが解放される



381 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 16:59:09 ]
だよね。
じゃあbyte* p=malloc(10000);
ってのは悪いやりかた?

382 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 17:11:59 ]
何でそう思うの?
byteのサイズがいくつになるかわからんから、 sizeof (byte) * 10000 で

383 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 17:12:43 ]
つ「メモリリーク」
一般的なOS上で動く寿命の短いソフトなら起こっても大した問題は起きない
デーモンとかサービスみたいな起動しっぱなしのソフトや低レベルなソフトとかだと死亡

384 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 17:12:46 ]
って可変にしたけりゃrealloc使えばいい

385 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 17:15:48 ]
>>379-384
これこそ、なにがしたいのかわからん質問。

386 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 17:51:20 ]
>>371
Z80 にステップ実行させる機能(内部割込み)はない。それはZ80 ではないのでは?

387 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 17:57:18 ]
>>384
過去にmalloc()/realloc() したときに取得したサイズを、現在 get できればいいのですが。
やっぱりどこかに覚えとくしかないか。

388 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 17:57:58 ]
Z80 のエミュレータかもしれない

389 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 18:01:12 ]
疑問の全てに実用性を求めることの意味を問いたい

390 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 18:10:15 ]
>>389
答えられない質問には、その質問自体が無意味であることを主張した方が
自分の優位性を保てるから



391 名前:デフォルトの名無しさん [2009/12/20(日) 18:25:15 ]
すいません。流れをぶった切って質問します。

今、10日くらいでhelloから始まり今if文とかの入門書に書いてある
関数の基礎を一回ずつコンパイルしました。
それから配列についてちょこっとやってます。
それで今 実行の引数やポインタに進んでいます。

そこで、勉強法としてそのまま先に進めていっていいのでしょうか?
それとも変数や配列を極めたほうがいいでしょうか?

ちなみに自分はあんまり関係ない機械関係の運用の仕事をしていてすぐに実務に使用するわけではありません。
目的は、プログラミングの勉強をしてゲームプログラムを自分で作れるようになりたいです。

392 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 18:27:43 ]
>>387
内部的には持ってるだろうけど、通常の方法では無いね。
まあ最後のメンバーが可変長の構造体作って管理する手もある。

393 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 18:28:19 ]
>>391
訳分からなくてもとりあえず最後までやる
同じ本を何度かやってりゃ分かるようになる

クズ本じゃなければの話だけど

394 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 18:29:52 ]
まあ先に進んでも、いずれどこが理解してないのかが分かってくるんじゃね?
途中の部分を極めるって考えはどうなのかね

395 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 18:37:39 ]
いいんじゃないかな。どうでも

396 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 18:38:16 ]
一回だけしかコンパイルしないんじゃ、理解しないまま先に進んでないか?

397 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 20:09:23 ]
>>386
ICEとかエミュとか上位互換のカスタムチップとかクロックそのものを止めるとか、
いくらでもステップ実行させる方法はある。
今は学習用だとWin上でエミュが主流だから、テンキー入力するのはちょっと前の世代か
ハンダ付けの実習も兼ねてるか。

398 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 20:14:16 ]
じゃあここをこう変えたらどうなるんだ?という疑問が沸く。
  ↓ ↑
コンパイル&検証orエラー

このプロセスを経ずして理解できたなどと、おこがましいとは思わんかね?

399 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 20:34:15 ]
⊂⌒~⊃。Д。)⊃ ピクピク

400 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 20:39:28 ]
>380
まちがい。なぜわざわざ嘘を教えるの?それともマジ?
C++のnew、deleteと勘違いしていないか?

>379, >381

>380は間違い。

>379自体は問題ない。
ただし1000がsizeof(byte)の倍数になっていないと、
pを使うときに問題が起こるかも。>382はそのことを言っている。







401 名前:デフォルトの名無しさん [2009/12/20(日) 20:43:49 ]
setupファイルが簡単に作れるC++の統合開発環境を教えてください.net以外で

402 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 20:47:26 ]
教えてくれるといいですね

403 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:02:37 ]
質問です。コマンドラインで-Dと指定したときに条件付けしようとしています。
次のように書くと動作するのですが
while(--argc > 0 && (*++argv)[0] == '-')
if((*argv)[1] == 'D') debug = 1;

while(--argc > 0 && (*++argv)[0] == '-' && (*argv)[1] == 'D')
と書くと動作しません。
2個目の条件(*++argv)[0]でargvが1進み、3個目の条件では+1されたargvが参照されると期待しているのですが、
こうはいかないのでしょうか。
ちなみに、
while(--argc > 0 && (*++argv)[0] == '-' && (*++argv)[1] == 'D')
とした場合segmentation errorとなります。
また3番目の条件をargv[0][1]=='D'などと指定してもうまくいきません。
whileの条件中だけで全て条件付けることはできないのでしょうか。

404 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:05:18 ]
>>403
目的を達するために getopt を使うとか strcmp で比較するのはどう?

405 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:06:48 ]
3つ並べた時の短絡評価って保障されてんの?

406 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:10:58 ]
>377
ネタにマジレスするのは、どうかと思うが、つっこんでみる。
怪しい知識をたとえ話にするから、よくわからんぞ。
知らない人は理解できないだろうから、誤解しようも無いが・・・・・・。

>明白に誰が何に使っているか分かってないものは渡せません!っていうお約束がある。
そんな約束はない。Cのポリシーは、明示的にせよ、暗黙にせよソースにかかれたものは
その通り実行する、である。だからポインタにどんな値がセットされていようが、その通り動作しようとする。

>「こんにち波」っていうのは、あくまでも「まだどこにも属しておらず、アドレスともデータとも認められていない」
状態である。
リテラルはコードの中に埋め込まれている。メモリ上に置かれているからポインタも取れる。

>配列は長さが明白に分かってるポインタのようなものだから
配列とポインタは別物。




407 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:12:54 ]
クラックするのにC言語使ってる人っているの?

408 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:13:57 ]
>>403
debug=1 はどこにあるの?

409 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:15:57 ]
>>403
最初の引数が -D じゃなかったらwhileループから抜けてしまって2個め以降の引数を見ないのでは?

410 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:28:53 ]
>403

とりあえず
while(--argc > 0 && (*++argv)[0] == '-' && (*argv)[1] == 'D')
でも問題なさそうだけど。どういう動作を期待しているの?

ちなみに次のように、[]演算子を使って書く方がわかりやすいと思う。
while(--argc > 0 && argv[argc][0] == '-' && argv[argc][1] == 'D')



411 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:33:09 ]
値が0のint型変数2つどうしで引算をすると
すごくでかいint型限界値の値が出ますけど
これって値が0同士の変数で計算はするなということでしょうか?

int table[UCHAR_MAX+1];
char *text = "nanntokakanntoka";
int shift;
int i;

問題の演算: (BMWCT[(UINT)text[i]]-shift)
演算時のそれぞれの値
BMWCT[(UINT)text[i]] ==0;
shift==0;
iは任意

412 名前:403 mailto:sage [2009/12/20(日) 21:35:01 ]
>>404
getopt調べてみました。かなり便利そうですね。ありがとうございます。

>>409
それでした。この行以前に違うコマンドで認識させている部分があって、-Dは2番目の引数になっていたためでした。
こんな1種類の引数を検出する方法はそもそも汎用性がなさそうですね。
実際に使う時はcaseで場合分けなどしようと思います。
ただ条件文の評価の仕方は疑問が取れてすっきりしました。ありがとうございました。

413 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:35:21 ]
自分で0を代入してないなら、その変数は0じゃないぞ

414 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:35:44 ]
>>411
意味が分からないので動作するソースを貼ってちょ

415 名前:403 mailto:sage [2009/12/20(日) 21:39:06 ]
>>410
その方がシンプルですね。参考にします。

416 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:39:14 ]
bool型を返す関数foo(), bar()があるとき、

foo()&&bar()

foo()&&bar()
の違いを教えてください。


417 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:42:24 ]
>>416
同じじゃね?

bool の表現が 0 1 だけじゃないかもしれないし

418 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:44:15 ]
foo() && bar()

bar() && foo()

は違うけどな。

419 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:46:56 ]
>>416
てか、上と下が同じに見えるんだけど。

420 名前:416 mailto:sage [2009/12/20(日) 21:52:18 ]
申し訳ございません。
foo()&&bar()

foo()&bar()
の違いでございました。。。



421 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:56:37 ]
>>415
ごめん解決したわ
unsigned int とint で演算やってたんだがintのみでやったら変な値でなくなった

422 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:57:21 ]
>>414
>>415 ×
ごめんなさい間違えました

423 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 22:09:51 ]
>>421
え。それじゃ、 (unsigned int)0 - 0 が、0 にならなかったってこと?

424 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 23:12:09 ]
配列はポインタじゃねえ!というのに
なんで **argv と *argv[]は
同じに見てくれるのですか。コンパイラは。(倒置法)

425 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 23:16:08 ]
因襲というもんです
立ち入らないで下さい。

426 名前:421,411 mailto:sage [2009/12/20(日) 23:19:54 ]

UINT shift
shift==0
(UINT)text[i]==110  正常
BMWCT[(UINT)text[i]]==0 正常
(BMWCT[(UINT)text[i]]-shift)==4294967289 異常

>>423
こんな感じ
BMWCTとshiftとかをUINTにしたりintにしたりと変えてみた結果int同士だとうまくいった
UINT同士だとだめだった

427 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 23:22:08 ]
>>424
配列もポインタも、アドレスを表現しているという意味で同じだから。

428 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 23:29:32 ]
配列ってポインタよりも高級な構造という扱いなんでしょ?

429 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 23:29:54 ]
否、シンタックスシュガーという名の因襲と
理解するのが一番。深入りしない。苦労して
覚えない。その為にコンパイラにシンタックスチェッカーが
付いているんだからさw
エラーを指摘せず勝手に内部でコード作って実行しちゃう
JavaScriptとかと違ってCは良心的。但し生産性が高い
言語では無くなってるけどね。

430 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 23:43:19 ]
もともと場当たり的に作られた言語だし



431 名前:デフォルトの名無しさん [2009/12/20(日) 23:45:31 ]
>>427
という説明が char argv[][] という有名な落とし穴へ子羊を蹴落とす

432 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 00:02:58 ]
*(hoge + i) と hoge[i] は等価。つまり配列とはアドレス演算である。
なお、後者は前者のシンタックスシュガー、C言語規格によるただの"親切"である。
i はインデックスではなく、hoge が示すアドレスからのオフセットである。

これでいいですか?

433 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 00:06:59 ]
>424

「関数のプロトタイプ宣言の中では」配列とポインタは同じ。

Cでは関数に配列を渡すことはできない。
しかし使う場合は実引数として配列名を書くことが多く、それは配列の
先頭を指すポインタとして評価され、ポインタを渡していることになる。

以下の3つは全て同じ意味。
void func(int *a);
void func(int a[]);
void func(int a[N]);


434 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 00:07:55 ]
>>397
上位互換チップはありだと思いますが、一般にICE ではどうやって実行を一命令ごとに停止させるのでしょうか?
やっぱりCPU のステップ実行割り込みを利用してそうなんですが。

435 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 00:12:37 ]
色々あるけど、ROMやRAMを乗っ取って1命令後に停止させる命令を埋め込むのは、力技だなと感心したことがある

436 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 00:14:28 ]
>>419
ショートカットの有無かな?&& で前の式が偽だったら、後の式は評価すらされない、という。

437 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 00:15:35 ]
>427

君大間違い。配列とポインタは全く別物。

>432
「つまり配列とはアドレス演算である。」
この一文が致命的な誤り。その他の部分はあっている。

1番目のポイント 宣言と式では文法が別物になっている

2番目のポイント &, *のオペランドになったとき以外は配列名のみを書くと、
配列の先頭要素を指すポインタとして評価される。

二項演算子[]はポインタと整数型をオペランドとし以下のように定義する。

*(p + i) ≡ p[i]

438 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 00:25:17 ]
>>437
オメー 何書いてあるかわかんねネーンダy

439 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 00:57:14 ]
ポインタはアドレスを指している場合が多いが、アドレスはポインタではない

440 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 00:59:34 ]
>>438
*(hoge + i) と hoge[i]以外で、配列とポインタで異なる事例はいくらでもあるから、
配列 == ポインタという図式は成り立たないということ。

>>437
&, *ではなくて&, sizeofだよね。



441 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 01:01:54 ]
Cには実はアドレスという概念すらないぞ
&変数はあくまでも整数定数値。&を省略出来るケースも
多い。それを適切なポインタにキャストするだけ
そのポインタが&を指定した変数を指してくれてるかどうかは
コンパイラの気分次第。あんまし曖昧だととんでもないところ
を指すかも知れない。

442 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 01:03:40 ]
>Cには実はアドレスという概念すらないぞ

( ゚Д゚)ハァ?

443 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 01:06:31 ]
1行目を読んで、メモリアドレスを抽象化した存在だからという説明に向かうのかと思ったが、
2行目以降が残念な文章だった。

444 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 01:09:11 ]
>>434
Z80のデバッガだと、止めたいアドレスをRST命令に書き換えて、デバッガを実現していた。

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