5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:2009/12/15(火) 23:42:55
C言語の*入門者*向け解説スレッドです。
★前スレ
C言語なら俺に聞け(入門編)Part 57
http://pc12.2ch.net/test/read.cgi/tech/1260020924/
★過去スレ
http://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】
http://pc12.2ch.net/test/read.cgi/tech/1258873470/
とか
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 133代目
http://pc12.2ch.net/test/read.cgi/tech/1260532772/
★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

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

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

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

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

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

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

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

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

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

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

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

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


9 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/16(水) 01:06:51
キャストすんなうぜえ

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

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

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

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

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

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

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


18 :デフォルトの名無しさん: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: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 :デフォルトの名無しさん:2009/12/16(水) 01:23:38
過去にC言語の入門書2〜3冊ほど読んだがどれもキャストしてた。

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

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

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

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

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

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

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

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

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


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

まとめ

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

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

C#では使えない

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

78 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/16(水) 05:58:36
ビットフィールドは悪魔だ
できるなら使わない方がいい
速度も大幅に低下するし

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

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

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

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

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



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

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

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

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

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

89 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/16(水) 19:54:06
すーぱーひたちとかネーミングがダサすぎて話しにならん

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

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

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

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

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

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


というのが示すのは

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

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

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

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

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

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


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

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


>>101

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


unsigned int型のポインタ??

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

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

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

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

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

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

109 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/16(水) 22:58:20
C言語のプログラムをVisualC++で書いていて、そっちでは普通に動いていたのですが、
メモ帳にこぴぺしてCygWinで実行したら、

parse error before~

だとか

braces around scalar initializer

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

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

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

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

114 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/16(水) 23:19:58
??

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

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

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

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

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

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

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

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

125 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/16(水) 23:36:26
補足すると、代入を strcpy に置き換えるコンパイラもある。

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

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

>126 (== 125?)

代入とstrcpyは別だろ。

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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


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

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

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

137 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/16(水) 23:58:05
>134

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

その通りですがなにか?


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

これは普通に使うけど、

int (*p)[10];

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

153 :デフォルトの名無しさん: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 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/17(木) 00:49:25
>>153
C++ は要らねえな。

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

158 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/17(木) 01:11:23
C++のポジションはすでにレガシーとなっているよ。
普及してるが、FORTRAN、COBOLと同じ道を歩み始めている。

160 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/17(木) 01:29:59
>>158
通常は、必要に応じてキャストすればいい。
つか、どうしたいんだ?


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

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


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

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

165 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/17(木) 02:38:04
ありえないな。
設計からやり直した方がいいよ。


167 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/17(木) 03:02:53
*(ポインタ+i)

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

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

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

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

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

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

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

173 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/17(木) 05:02:23
テンプレートとかただのアヒルタイプだし。マジうける。
そんなものもint*型の前にはひれふすことになる。

175 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/17(木) 07:39:33
>>175
いやその解は有りえんから

177 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/17(木) 12:59:18
目的がわからんのだよ。
そんなのが必要になる状況なんてありえないだろ。

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

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

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

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

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

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


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

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


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


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


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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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


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

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

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

みたいになってしまう

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

207 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/17(木) 18:47:02
改行はどうするんだろ。


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

243 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/19(土) 00:10:37
dividend = quotient * divisor + remainder
remainder = dividend - quotient * divisor


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

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

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

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

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

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

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

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

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

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


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

253 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/19(土) 09:11:20
最初のscanfの前の全角スペース?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ThisIsAPointerForMalloc = Mr_malloc(FUCKINGTOSHINGBUFFERSIZETHATFUCKINGOSINGXING)

if(ThisIsAPointerForMalloc == NULL)
  Fucking


なんかムカつく

普通は

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


だろ


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

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

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

つまり
FUCKINGOSINGXING
ってのは

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


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


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


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

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

279 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/19(土) 13:45:21
誰も聞いてないから、チラシの裏にでも書いといてくれる?

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

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

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

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

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



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

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



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

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

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

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

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

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


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

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

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

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

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


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

295 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/19(土) 19:39:58
>>294-296
279は暗黙のキャストも知らないような
自称上級者なんだから触れんな。

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



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

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

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

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

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

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

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

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

304 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/19(土) 21:24:07
>>304
!

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

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

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

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


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

y % b == 0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

327 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/20(日) 00:13:15
int x;
int* p;
p=&x;
printf("%d",p);

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

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

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

331 :デフォルトの名無しさん: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: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 :デフォルトの名無しさん:2009/12/20(日) 00:34:54
警告ってなんなん?問題があるならエラーにしろや

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

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



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

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

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

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

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


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

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

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

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


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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

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

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

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

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

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

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

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

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



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

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

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

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


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

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

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

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

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

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


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

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

っていうお約束がある。


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


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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

400 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/20(日) 20:47:26
教えてくれるといいですね

403 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/20(日) 21:05:18
>>403
目的を達するために getopt を使うとか strcmp で比較するのはどう?

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

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

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

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

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




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

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

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

410 :デフォルトの名無しさん: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 :デフォルトの名無しさん: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:2009/12/20(日) 21:35:01
>>404
getopt調べてみました。かなり便利そうですね。ありがとうございます。

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

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

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

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

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

foo()&&bar()

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


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

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

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

bar() && foo()

は違うけどな。

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

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

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

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

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

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

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

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

426 :421,411: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 :デフォルトの名無しさん:2009/12/20(日) 23:22:08
>>424
配列もポインタも、アドレスを表現しているという意味で同じだから。

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

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

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

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

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

これでいいですか?

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

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

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

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


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

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

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

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

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

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

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

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

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

*(p + i) ≡ p[i]

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

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

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

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

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

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

( ゚Д゚)ハァ?

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

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

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

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

446 :437:2009/12/21(月) 01:13:37
>440

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

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


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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

471 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/21(月) 22:27:02
>>472
if((hoge = malloc(sizeof(HOGE))= NULL){

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


512 :デフォルトの名無しさん: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 :デフォルトの名無しさん: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:2009/12/24(木) 02:39:11
連投すみません!
自己解決しました

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

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

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


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

お願いします。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

この間1秒

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

結果がおかしくなります

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

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

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

584 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/28(月) 01:03:34
どっちも特に難解な記述だとは思わないけどさ

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

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

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

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

588 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/28(月) 05:52:52
mask)==mask 部分が冗長に見えるから違和感感じるんDA

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

if (value & 0x0001)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

623 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/28(月) 23:27:01
みんなレスd

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

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


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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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


637 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2009/12/30(水) 08:40:37
>>637
あ、だめだx変わんね!

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

640 :デフォルトの名無しさん:2009/12/30(水) 10:21:01
>>623 >>629 >>639 で簡単にベンチとってみた。
ビットが立っていない場合が 0 になるように一部変更してる。
http://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 :デフォルトの名無しさん:2009/12/30(水) 10:57:31
logって中の人がフーリエ展開とかしてるからおそいのかね?

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

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

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

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

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

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

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

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

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

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

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

653 :デフォルトの名無しさん:2009/12/30(水) 23:12:36
n分置きに何かを処理する
ってのはどうすればいいの?
Sleepだと遅れることあるんでしょ?

654 :デフォルトの名無しさん:2009/12/30(水) 23:15:09
>>653
ズレが積算しなければ多少ズレてもいいの?

655 :デフォルトの名無しさん:2009/12/30(水) 23:18:59
真っ当なやり方、ぜひやるべき方法としては
CPUのクロックパルスをカウントする方法がある。

OSのタスクスリープ類は、オーダーが不足する。いいとこミリセカンド単位だろ

これは十分ではない!(直訳した英文ふうに)
CPUのクロックパルスならナノセカンド単位で管理できる。

656 :デフォルトの名無しさん:2009/12/30(水) 23:22:28
こういうとき、SHシリーズとかPowerPCのようにタイマユニットを持ってるCPUはラクできるんだ

分周率決めて初期値入れてカウントダウンして
それがアンダーフローしたと同時に割り込みを入れてくれる。

割り込みが来たらベクタを参照して然るべき関数を呼び出すだけ。
PowerPCならベクタもいらねえ
まんま関数を置くだけ

このカウントはタスク外、OSの関知外、CPUの処理外だから
実行速度に何の影響も及ぼさずいくらでもタイマー処理ができる。
これを一回味わうとOSのタスクスリープに頼りたくなくなる。
んでx86系統で苦労する。

657 :デフォルトの名無しさん:2009/12/30(水) 23:23:47
>>653
遅れることが本当に許されないなら、リアルタイムOSを使うしかない。
自分は、経験ない。

658 :デフォルトの名無しさん:2009/12/30(水) 23:25:54
その手のタイマは、カーネルとかドライバが使うもので、
アプリが使うものじゃない。
複数のプロセスから同時に使えないだろう?

659 :デフォルトの名無しさん:2009/12/30(水) 23:27:13
OSや言語命令に丸投げするのが一番ラクだが、「実行環境の気分次第」を受け入れなければならない。

本当にシビアにデッドラインが決まっているならハードウェアをお友達にならなければならない。

いくつも同時にカウントできるのはSHでさえ3つまでだが

本当に遅れが許されないものに絞って使えばよい

660 :デフォルトの名無しさん:2009/12/30(水) 23:48:31
>>653
許される誤差の範囲は具体的にどのくらい?

661 :デフォルトの名無しさん:2009/12/31(木) 00:18:41
nanosleep使えるんだっけか?

662 :デフォルトの名無しさん:2009/12/31(木) 00:35:01
>>661
さあ

663 :デフォルトの名無しさん:2009/12/31(木) 10:00:31
sleep()なんて秒単位でしか指定できないんだから、
0.5秒でも後れたら大問題とか、そういうところでは
そもそも使われないだろ。


664 :デフォルトの名無しさん:2009/12/31(木) 10:47:42
POSIXで使えそうなものはclock_nanosleepとかだけど
本当に使用できるのかどうか誰も知らない。
ドライバ書いたこともないしマルチタスクを意識したアプリも書いた事がないから。

665 :デフォルトの名無しさん:2009/12/31(木) 11:22:50
普通の Unix、Windows なら何使っても遅れる可能性を0にはできない。

666 :デフォルトの名無しさん:2009/12/31(木) 12:26:29
てなると、設計の問題になる。
格闘ゲームのように「1ピコセカンドだって遅れたら勝てねえ!」ちゅう
ウメハラのようなもんをメインターゲットに据えている格闘ゲームなら
本格的にCPUた、割り込みコントローラと付き合わないといかぬわい

667 :デフォルトの名無しさん:2009/12/31(木) 12:34:38
36協定みたいに、
「一時トリプルボギーでも後でアルバトロス出せば差し引きチャラHEAD-CHARAであって胸がパチパチするほど騒ぐ元気玉」
みたいなシステムなら、スリープ時間を動的に増減したらいい。


「1フェムトセカンドでも遅れたら死!後からのリカバリは認めない」
ってシステムなら、ハードウェアとフレンドになる。


特段遅れてもどーってことないシステムでもハードウェアと友達になっておいて損はないのだが。

668 :デフォルトの名無しさん:2009/12/31(木) 12:45:11
フェムト秒ってペタヘルツの世界だぞ?
具体的にどんな「ハードウエア」君と友達になれって?

669 :デフォルトの名無しさん:2009/12/31(木) 12:46:27
>>668
分子加速器みたいなのじゃね?

670 :デフォルトの名無しさん:2009/12/31(木) 13:08:25
相対論とも友達にならないとな

671 :デフォルトの名無しさん:2009/12/31(木) 13:18:24
ですね

672 :デフォルトの名無しさん:2009/12/31(木) 21:19:45
そういやニュースサイトで

現金を盗んだ



元気を盗んだ

になってたときがあった

673 :デフォルトの名無しさん:2009/12/31(木) 21:27:19
ボケが進行してますね

674 :デフォルトの名無しさん:2010/01/01(金) 01:26:47
演算子とは何か

3+4の+が演算子
10==5+5の==も演算子

int* p=&x;
*p=7;
の*も演算子

なんかよくわからんけど特殊な意味をもった記号を演算子っていうのか?

675 :デフォルトの名無しさん:2010/01/01(金) 01:32:16
何かに作用するもの

676 :デフォルトの名無しさん:2010/01/01(金) 19:08:21
複数の項を入力として新しい結果を作り出す記号

677 :デフォルトの名無しさん:2010/01/01(金) 22:16:39
1〜10文字の間で書き込まれた文字を8けたの数字にする方法おしえて

678 :デフォルトの名無しさん:2010/01/01(金) 22:20:05
1〜10文字の間で書き込まれた文字を8けたの数字にすればいいよ

679 :デフォルトの名無しさん:2010/01/01(金) 22:29:59
>>677
それは10進数で入力された文字列を数値に変換するってこと?
10桁入力されたときは、どうすればいいんだろう。

680 :677:2010/01/01(金) 22:39:47
>>679
半角英数で適当に打ち込まれた1〜10文字を手っ取り早く8ケタの数字にしたいんだ

681 :デフォルトの名無しさん:2010/01/01(金) 22:44:59
>>680
「1234567890」って10桁打ち込まれたら、8桁の数字にならないんだけど
どうすんの?

682 :677:2010/01/01(金) 22:47:43
>>681
そういうことでしたか・・・
8ケタじゃなくて10ケタでおねがいします!

683 :デフォルトの名無しさん:2010/01/01(金) 22:48:26
atoi() じゃダメなの貝?

684 :デフォルトの名無しさん:2010/01/01(金) 22:49:14
ひょっとして「0〜9の文字を入力されたら」という意味かと思ったが、
それだと「10文字」ってのがナゾになるな



だれかキバヤシ呼んできてくれ

685 :デフォルトの名無しさん:2010/01/01(金) 22:49:18
>>677
crypt とか md5 計算して頭のほうだけ使えばいいんじゃね?

686 :デフォルトの名無しさん:2010/01/01(金) 22:51:55
>>682
少しわかってきたが、わざわざ「英数」とか「文字」って言ってるのだから、
「0〜9」以外の文字も入力される可能性があるって意味だよな?

687 :デフォルトの名無しさん:2010/01/01(金) 22:52:47
>>682
#include <stdio.h>

int main()
{
char s[20];
int n;

fgets(s, 10, stdin);
n = atoi(s);

printf("%d\n", n);

return 0;
}


688 :677:2010/01/01(金) 22:58:47
>>686
そうです!

689 :デフォルトの名無しさん:2010/01/01(金) 22:59:58
ほらできた
#include<stdio.h>

unsigned long str2num(const unsigned char *str)
{
unsigned long value=0x22360679;

for(;*str;str++) value=value*(9012583+*str)+3003779;
return value%100000000;
}


int main(void)
{
printf("%08lu\n", str2num("hello"));
printf("%08lu\n", str2num("hello!"));
printf("%08lu\n", str2num("Hello"));

return 0;
}

690 :デフォルトの名無しさん:2010/01/01(金) 23:19:40
restrict 修飾子とやらの存在を知りました。
みなさんrestrict は現実のプログラムで使っていますか?

691 : 【大吉】 【428円】 :2010/01/01(金) 23:54:18
>>690
付け忘れて困ったためしがないからなあ。

692 :デフォルトの名無しさん:2010/01/02(土) 00:03:25
>>691
ですよねぇ。
ありがとうございます。

693 :デフォルトの名無しさん:2010/01/02(土) 00:11:10
fopenを読み書き両方で使って
fprintf使うと上書きじゃなくて追加書き込みになるけど
上書きで使うにはどうすれば良いの?

694 :デフォルトの名無しさん:2010/01/02(土) 00:13:34
>>693
"r+b" で開いて fseek で移動

695 :デフォルトの名無しさん:2010/01/02(土) 03:09:21
ありがとう

696 :デフォルトの名無しさん:2010/01/02(土) 13:01:43
実行したときにコマンドプロンプト上でなくて普通のウィンドウに表示させるにはどうしたら良いんですか

697 :デフォルトの名無しさん:2010/01/02(土) 14:45:16
>>696
Windows の話なんだろうけど、ウィンドウベースのプログラムは
コンソールベースのプログラムに比べて40倍 (当社比) くらい面倒。
↓こういう感じで。
ttp://www.geocities.jp/ky_webid/win32c/002.html

698 :デフォルトの名無しさん:2010/01/02(土) 14:55:47
printf("printf");

699 :デフォルトの名無しさん:2010/01/02(土) 15:04:52
winで一番使えるコンパイラはMinGWってやつなの?

700 :デフォルトの名無しさん:2010/01/02(土) 18:15:45
atoi
atol
頼むから「アトイ」だの「アトル」だの言うな!


どこのラノベ主人公やねん

701 :デフォルトの名無しさん:2010/01/02(土) 18:17:12
>>698 >>700
流れが見えないカキコが続いてるけど、誤爆かなにか?


702 :デフォルトの名無しさん:2010/01/02(土) 18:19:15
プログラムってのはだ
常にストールなく流れているもんちゃうで

たまにはキャッシュミスしたり分岐予測が外れてしまうことも
あるんやで

703 :デフォルトの名無しさん:2010/01/02(土) 18:24:50
>>699
CUIなら

704 :デフォルトの名無しさん:2010/01/02(土) 19:11:16
>>696
リンクするときに link /subsystem:windows を指定する
http://msdn.microsoft.com/ja-jp/library/fcc1zstk%28VS.80%29.aspx

※ これは C の話ではなく Windows の、もっと言うなら .exe ファイルの話なので
 そっち系のスレで聞いた方がいい

>>699
「使える」の意味による
機能だけでなくライセンスも通常は選択理由の1つとなる

705 :デフォルトの名無しさん:2010/01/02(土) 19:33:43
ミンジーダボユーは
ライセンスとか特に気をつけないと
民事ー訴訟沙汰になる

706 :デフォルトの名無しさん:2010/01/02(土) 19:49:34
>>705
MinGW?
Cygwinよりもってこと?


707 :デフォルトの名無しさん:2010/01/02(土) 20:34:28
ライブラリの一部がGPLだったと思う。

708 :デフォルトの名無しさん:2010/01/02(土) 20:57:34
民事ーW

709 :デフォルトの名無しさん:2010/01/03(日) 01:50:50
>>703
GUIアプリが作れないのか?
それともVCとか方が作りやすいって意味?

710 :デフォルトの名無しさん:2010/01/03(日) 02:22:28
GUIってのはコンパイラあんまり関係ない。

「windows.hがあって」
「Windowsのプログラミング作法を知っていれば」

できるものだから、特にコンパイラを問うものでない。
コンパイラよりも「何をどうすればWindows上やLinux上でGUIが出るのか」
を、プログラマ自身が知らないと話にならんのだ

711 :デフォルトの名無しさん:2010/01/03(日) 02:33:58
ウィンドウを出すだけならそこらのサイトに載ってるようなコードを書くだけだが
プログラミング作法をしらないと

「ウィンドウの中身が更新されない」
「消えない」
「メッセージが送られない」

とか、まるでGUIの意味がないことになるから
まず作法を知るほうが早い。

712 :デフォルトの名無しさん:2010/01/03(日) 05:02:01
みなさんが、Cの仕様を把握して後、初めて作った本格的なプログラムって何でしたか?
参考にしたいので、教えてください><

713 :デフォルトの名無しさん:2010/01/03(日) 08:22:19
まず君の言う「本格的」の定義をしてくれ。

714 :696:2010/01/03(日) 08:30:38
>>697,704,711
有り難うございます

715 :デフォルトの名無しさん:2010/01/03(日) 09:50:12
>>713
そうですねー、確かに「本格的」って何だかよく分りませんね
無理して定義すれば、ゲームであればオセロとか、仕事なら初めて1から書き上げたルーチンとか、
自分のPCを便利にする為にユーティリティ作ったとかとか、
頭の中の知識、実際にプログラミングで使った機会と、いったイメージです
あるいは、このオープンソースのコードをみっちり読んだ、とかでも結構です

716 :706:2010/01/03(日) 09:57:36
>>707
そうなの?
それはしらんかったが、

本の虫: libstdc++を使って作られたプログラムはGPLか
http://cpplover.blogspot.com/2008/01/libstdcgpl.html

これのことじゃなくて??



717 :デフォルトの名無しさん:2010/01/03(日) 10:08:24
>706
Cygwin はランタイムである cygwin1.dll 自体が(オープンソースなものに対する例外条項付き)GPLだから、
Cygwin 使う時点でバイナリ配布するなら(GPLである必要性はないが)オープンソースライセンスにせざるを得ない。
MinGW はランタイムそのものは Public Domain なんで問題ないけどライブラリを使う場合はそれぞれの
ライセンスに従う必要がある(これは Cygwin でも同じ)。

718 :デフォルトの名無しさん:2010/01/03(日) 10:26:34
int foo(); って関数の中で int a; が変更されるとき
if( foo() && a ){ ... } って書くのアリなの?
普通書かないだろうけど、言語的にどうなのよ

719 :デフォルトの名無しさん:2010/01/03(日) 10:50:41
>>718
論理演算氏は左から評価されるから、大丈夫なんじゃね?

720 :デフォルトの名無しさん:2010/01/03(日) 10:56:31
http://www.nicovideo.jp/watch/sm8517855


721 :デフォルトの名無しさん:2010/01/03(日) 13:07:05
インタプリタとコンパイルは違う!って言いますが
Cでもコードの位置を変えると動作が変わるということは
インタプリタと同じじゃないんですか。

722 :デフォルトの名無しさん:2010/01/03(日) 13:12:11
別にインタプリタとコンパイルが同じと考えようが違うと考えようがどっちでもいいよ。
ただインタプリタは一行一行機械語に翻訳していくのに対しコンパイラはビルドしてexeにして
一気にやっちゃうだけの違いでしかない。

そんなもん知らなくても何の支障もでない。

723 :デフォルトの名無しさん:2010/01/03(日) 13:26:36
最近はjitだしね

724 :デフォルトの名無しさん:2010/01/03(日) 13:26:38
>>721 のコンパイラとインタプリタの基準が知りたい。


725 :デフォルトの名無しさん:2010/01/03(日) 13:39:33
>>718
int a はどこで宣言されていますか? int a がfoo() のなかだと意味がない。

726 :デフォルトの名無しさん:2010/01/03(日) 13:40:38
>>721
インタープリタは単独で実行可能なファイル(実行ファイル)を出力しない。

727 :デフォルトの名無しさん:2010/01/03(日) 15:12:32
strcpyみたいな文字列関連の関数は
コピー先を参照渡しじゃなくて戻り値として取得することは出来ないの?

728 :デフォルトの名無しさん:2010/01/03(日) 16:14:02
>>724
グローバルです。
正確には、関数ポインタなんですが
 
int f1() { return 0; }
int f2() { return 1; }
 
int (*a)() = f1;
int f() { a = f2; return 1; }
 
int main() {
 if( f() && a() ) { // ← これ
  ....
 }
}
 
&& や || が左からってのは知ってて a() が後から実行されるのは
わかるんですが a の値そのものも後から評価されるのかなぁと
不安になりました

729 :デフォルトの名無しさん:2010/01/03(日) 16:33:47
>>697にあった http://www.geocities.jp/ky_webid/win32c/002.html
のプログラムをそのまま試しにコンパイル&実行しようとしても
「コンパイルに失敗しました
 ファイル "  〜  .exe" は存在しません」と出て実行できません
エディタ、コンパイラは CPad for LSI C-86 、 LSI C86 v3.30試食版 です
どうすれば良いんですか

730 :デフォルトの名無しさん:2010/01/03(日) 16:40:03
LSI C-86 は16bitのコンパイラじゃないか
別のにしなさい

731 :デフォルトの名無しさん:2010/01/03(日) 16:41:38
Windows.hがそもそも含まれてないはず。
別のコンパイラを使いましょう。

732 :デフォルトの名無しさん:2010/01/03(日) 16:43:06
有り難うございます

733 :デフォルトの名無しさん:2010/01/03(日) 17:51:08
>>727
char *strcpy(s, ct) の戻り値は s だが、それでは不満?
とすれば、C 言語には文字列型はないので、それは不可能。
というか、C 言語の malloc()/free() について経験と考察が必要と思われます。
strcpy が文字列を戻り値として返してきたとして、それを解放するのは誰?

734 :デフォルトの名無しさん:2010/01/03(日) 17:54:31
>>728
この例では f() は 0 を返すので、 a() 、正確には (*a)() は実行されません。

735 :デフォルトの名無しさん:2010/01/03(日) 17:56:05
>>734
失礼、f() は1を返すんですね。とすれば a() は実行されますね。

736 :デフォルトの名無しさん:2010/01/03(日) 17:59:46
>>734
f() は return 1; だぜよ。手持ちの VC6 では if の中実行される。
ところで話違うけど a() って (*a)() って書くのが正しいの?

737 :デフォルトの名無しさん:2010/01/03(日) 18:03:24
>>736
ご指摘ありがとうございます。
で、a は関数のポインタだから、(*a) と書いて呼び出しますね。a だけでもいいんですけれども。

738 :706:2010/01/03(日) 18:12:14
>>717
なるほど。丁寧にどうもありがとう。
それをヒントに探してみたら、
 MinGW について頻繁に尋ねられる質問と回答(MinGW FAQ)
 ttp://www.sixnine.net/cygwin/translation/mingw-doc/mingwfaq.html
> MinGW とは何ですか?
>    (中略)
> MinGW は Windows オペレーティングシステムと共に配布されている
> Microsoft のランタイムライブラリを利用します。
> Windows に対して移植された他の GCC とは異なり、
> このランタイムライブラリは
> GNU 一般公有使用許諾契約書の元では配布されていません。
> 従って、あなたのプログラムと共にあなたのソースコードも配布する必要はありません。
> 勿論、あなたのプログラムが GPL のライブラリを利用していない限りですが…
こんなんが見つかった。
ってことは、

色々聞いて申し訳ないんですけれども、
 MinGW上で
  PublicDomainのライブラリX
  標準Cライブラリ
  標準C++ライブラリ
 を使って全部staticリンクしてクローズドソースな実行ファイル.exeを一般に配布する
ということは可能だと解釈してよろしいです?


739 :デフォルトの名無しさん:2010/01/03(日) 18:18:03
>>727
環境によっちゃstrdupがあったりするけど、コピー先決められないのって不便じゃね?

740 :デフォルトの名無しさん:2010/01/03(日) 18:24:03
今だと、ローカルルールでstr系の関数を使用禁止にしてたりしない?

741 :デフォルトの名無しさん:2010/01/03(日) 18:27:59
>>740
そんなところあるの?

742 :デフォルトの名無しさん:2010/01/03(日) 19:40:34
>>740
なぜに、というか strncpy() 推奨ってことかも。

743 :デフォルトの名無しさん:2010/01/03(日) 20:10:56
>>742
しかしstrncpyもstr系には入らないのか?


744 :デフォルトの名無しさん:2010/01/03(日) 21:01:24
>>739
strdup() にしても使用後にはちゃんと解放しなければならないし。

745 :デフォルトの名無しさん:2010/01/03(日) 21:02:09
>>743
んー、入るでしょうかね、んー。

746 :デフォルトの名無しさん:2010/01/03(日) 21:41:27
strncpyって罠が多すぎるうえに非効率極まりないゴミという印象しかない

747 :デフォルトの名無しさん:2010/01/03(日) 21:46:45
>>746
場合によっては '\0' をつけないときがあるのがややこしいですね。

748 :デフォルトの名無しさん:2010/01/03(日) 21:47:47
もっとゴミなのは、strcpy_s とか独自の関数を作って
しかもそれを推奨するコンパイラ

749 :デフォルトの名無しさん:2010/01/03(日) 21:51:16
>>748
おっとVCの悪口はそこまでだ

750 :デフォルトの名無しさん:2010/01/03(日) 21:52:00
strnlcpyってのもあるが

GCCなどワガママが作ってるコンパイラには入ってない

お前ンとこのポリシーがどうかじゃなく
安全かどうかだっつうに

751 :デフォルトの名無しさん:2010/01/03(日) 21:54:01
>>727,742-751
bccでlstrcatでも使ってろ

752 :デフォルトの名無しさん:2010/01/03(日) 22:00:21
>>750
> 安全かどうかだっつうに
それこそお前だけのポリシーじゃねぇか
お前本当に職業プログラマかよw
移植性とか標準規格とか考えたこともないの?哀れな。

753 :デフォルトの名無しさん:2010/01/03(日) 22:02:30
何の手も加えずにどこでも動くもんなんか存在しねえよ
 

754 :デフォルトの名無しさん:2010/01/03(日) 22:30:09
職業プログラマ(笑)は黙ってろよ

755 :デフォルトの名無しさん:2010/01/03(日) 22:42:23
>>754
ん?オープンソースで活躍している人も
ほとんどが(元)職業プログラマですけど。。。

756 :デフォルトの名無しさん:2010/01/03(日) 23:18:27
ここは入門スレだから元だろうが現だろうがプロ(笑)はいらねーんだよ

757 :デフォルトの名無しさん:2010/01/03(日) 23:30:48
>>756
そんな自分に言い聞かせなくてもw

758 :デフォルトの名無しさん:2010/01/03(日) 23:30:59
正規表現を扱おうとすると
鬼車以外に無い?
regex.h はGPLなので除外。

759 :デフォルトの名無しさん:2010/01/03(日) 23:37:04
>>740
隣の席の人のやってるプロジェクトが、str系使わないで、
memcpy()とかmemcmp()を使って、文字列のサイズをことごとく、
直接書いてるのな。
memcpy(a, b, 10); みたいに。

str系はセキュアじゃないみたいなのが、間違って伝わってるんだろうなって
推測してる。

760 :デフォルトの名無しさん:2010/01/03(日) 23:38:35
車輪の再発明は危険だよ

761 :デフォルトの名無しさん:2010/01/03(日) 23:40:02
>>760
企業の経営的な意味で。


762 :デフォルトの名無しさん:2010/01/03(日) 23:41:25
>>748
独自って言っても、そのうち標準になるんでしょ?

763 :デフォルトの名無しさん:2010/01/03(日) 23:52:05
>>762
そんなんいつの話さ。


764 :デフォルトの名無しさん:2010/01/03(日) 23:58:17
Cで

char *head;

if( (head = (char *)malloc(SIZE1024)) == NULL){
 fprintf(DISPLAY, "Process couldn't get Memory space\r\n");
 return -1;
}

 ・・・
 ・・・
 ・・・

 free(head);     /* free */
 head = NULL;   /* headは他からもfreeされる恐れあり */


ってやると「やり直せ!」と言われるんだけどなして?


765 :デフォルトの名無しさん:2010/01/04(月) 00:04:32
>>764
SIZE1024って意味なくね?

766 :デフォルトの名無しさん:2010/01/04(月) 00:06:04
>>764
SIZE1024の意味は?

767 :デフォルトの名無しさん:2010/01/04(月) 00:07:52
SIZE1024の意味

768 :デフォルトの名無しさん:2010/01/04(月) 00:08:09
最大255文字を取る文字列の操作のために1024バイトを確保

769 :デフォルトの名無しさん:2010/01/04(月) 00:09:40
mallocと言えば、キャストするしないでえらい怒られたなあ。
俺は単純に見た目分かりやすいのを好むのと、
C++ではvoid*は明示的にキャストしないといけないからやっていただけだっつうのに。
なんぞ悪いんかい。って思った。

770 :デフォルトの名無しさん:2010/01/04(月) 00:12:46
(char *)malloc(SIZE1024 * sizeof(char)) かなぁ
名前の付け方とか

771 :デフォルトの名無しさん:2010/01/04(月) 00:18:28
>sizeof(char)
何ひとつ解っていない、と思われても仕方ないレベル

772 :デフォルトの名無しさん:2010/01/04(月) 00:32:22
>>769
不必要にキャストするのはバグの元だし、C++ならCのキャストは使わない方がいいし
どっちにしろ怒られるのは仕方がないことかと

773 :デフォルトの名無しさん:2010/01/04(月) 01:03:39
void* の関数なんか実際のソースだといろいろあるわけじゃん。
特にリエントラントとか言い出すと


それすら「やんな」ちゅうんだぜ


774 :デフォルトの名無しさん:2010/01/04(月) 01:27:58
test

775 :デフォルトの名無しさん:2010/01/04(月) 02:04:16
>>771
こーゆー奴に限ってmainの特別視とか何とも思わねーのな
「規格で決められた」範囲でしか思考できておらず
本質的に何かという観点が完全に欠如している
救いようもなく終わってる奴ね

776 :デフォルトの名無しさん:2010/01/04(月) 02:16:47
どうでもいいよ

777 :デフォルトの名無しさん:2010/01/04(月) 03:20:57
>>775
済まんが、誰に何を言っているのか解らない。

778 :デフォルトの名無しさん:2010/01/04(月) 10:02:05
>head = NULL;   /* headは他からもfreeされる恐れあり */

ローカル変数のheadが他からもfreeされる恐れってなんぞ

779 :デフォルトの名無しさん:2010/01/04(月) 10:41:50
makeしたら負けだと思う.

780 :デフォルトの名無しさん:2010/01/04(月) 10:49:54
>>759
str系はセキュアじゃないだろ。

781 :デフォルトの名無しさん:2010/01/04(月) 11:04:46
if((sizeof(CopySource) + sizeof(CopyDestination)) < String)
{
 strncpy()

else{
 printf("you are fucked\n");

782 :デフォルトの名無しさん:2010/01/04(月) 11:07:13
逆やん

783 :デフォルトの名無しさん:2010/01/04(月) 12:35:22
すんません
教えてくだしあ
Linux/GCC ver4.1.2
普段はシェルスクリプトで書いているんだけど
hoge.shを
Cで実行したらどうなるのか試してみたいんです

--huga.sh--
#!/bin/sh
/bin/hoge.sh
/bin/hoge2.sh

これをCで書くにはどうすりゃいいの?
CとシェルとUnixのエロい人おしえてぇ〜



784 :デフォルトの名無しさん:2010/01/04(月) 12:41:21
質問の意図がよくわからんが、こんな感じ?
#include <stdlib.h>

int main()
{
system("/bin/hoge.sh ");
system("/bin/hoge2.sh ");
return 0;
}

785 :729:2010/01/04(月) 14:46:27
何度もすいません
コンパイラを Borland C++Compiler に変えてみたのですができませんでした
助けて下さい

786 :デフォルトの名無しさん:2010/01/04(月) 14:56:40
ベーツェーツェーでWindowsアプリを作るときは -W スイッチが必要だぞ

まずコンパイラの使用を熟知したほうがいい

787 :デフォルトの名無しさん:2010/01/04(月) 15:00:03
>>785
コンパイルできてないんじゃね?

788 :デフォルトの名無しさん:2010/01/04(月) 15:02:09
みんな集まれペンギン村に(つまりLinuxやれと、いうこと。)
どんなことが起こるかな
それゆけベーツェーツェーツェー
甲斐性なし(ってけてっ)



789 :デフォルトの名無しさん:2010/01/04(月) 15:08:37
>>785
何をしてどうなった?
できないと判断したのはどういう状況で?

790 :デフォルトの名無しさん:2010/01/04(月) 15:15:44
>>786
有り難うございます

791 :デフォルトの名無しさん:2010/01/04(月) 15:17:02
>>787,789
>>729と同じ状況です


792 :デフォルトの名無しさん:2010/01/04(月) 15:38:30
そうじゃないだろ
まずインストールしたのか、コンソールのHalloWorldくらいはコンパイルできたのか
ヘッダーのインクルードに失敗してないか、リンクするライブラリはちゃんと指定してるか
いろいろ確認することあるだろ

793 :デフォルトの名無しさん:2010/01/04(月) 15:42:52
a[5]と5[a]が同じ意味になると知ったのですが、
後者のやり方を使う意義ってなんでしょうか?

794 :デフォルトの名無しさん:2010/01/04(月) 15:47:02
bcc32 -W *.c

795 :デフォルトの名無しさん:2010/01/04(月) 15:47:35
>>793
a[b] は、*(a + b) の略記というだけ。

796 :デフォルトの名無しさん:2010/01/04(月) 15:47:36
BCCでコンパイル出きないとか言ってる奴ら
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1218285417

797 :デフォルトの名無しさん:2010/01/04(月) 15:48:00
stdio.hの意味をくわしい人に聞いたら、
正常位中出しエッチと教えてくれました。
信じていいのでしょうか?

798 :デフォルトの名無しさん:2010/01/04(月) 15:48:18
>>795
質問の意味を理解して下さい

799 :デフォルトの名無しさん:2010/01/04(月) 15:50:04
>>798
略記だから、人間がどう捉えるかの問題。

800 :デフォルトの名無しさん:2010/01/04(月) 16:25:47
>>780
使い方による。

801 :デフォルトの名無しさん:2010/01/04(月) 16:26:03
>>793
コンパイラの都合。使う意義はない。
コンパイラ作ってみればわかる。
a[5]は許可して5[a]を禁止するのってめんどくさいから、両方許可してるだけ。

802 :デフォルトの名無しさん:2010/01/04(月) 16:37:14
めんどくさいってほどめんどくさいわけでもないと思うけど、
わざわざ禁止する理由もないしな

803 :デフォルトの名無しさん:2010/01/04(月) 16:40:34
なんでどっちもいいの?
*(a+5)だから?

804 :デフォルトの名無しさん:2010/01/04(月) 16:41:45
そう
*(5+a)でも一緒だろ?

805 :デフォルトの名無しさん:2010/01/04(月) 16:41:51
A+BとB+Aが何で同じなのって言ってるような気がするが…
アドレスにオフセットを足すか、オフセットにアドレスを足すか、っていう違いじゃないのかな

806 :デフォルトの名無しさん:2010/01/04(月) 16:44:00
aを、0x12345678 とかアドレスに置き換えてみれば

807 :デフォルトの名無しさん:2010/01/04(月) 16:55:48
なんだかCをマスターした気がする

808 :デフォルトの名無しさん:2010/01/04(月) 16:57:56
>>802
禁止する理由、というか禁止「すべき」理由はあるでしょ。
だからこの文法に関して「意義」とか言ってもただの愚問だね。
本来あるべき理想からいったら、正しくないわけだから。

そもそも「Cの精神」とやらが矛盾だらけの分裂症患者の妄言みたいなものだからさw
一方で「自分の足だって撃てる自由」を望んでおいて(だからこんなありえない文法を
あえて許容したんだろうたぶん)、他方で型安全なフールプルールを主張してるわけで。

809 :デフォルトの名無しさん:2010/01/04(月) 17:09:54
[]を演算子とするか、略記とするかの違い。
C#は前者、Cは後者。
もともとのCには void 型もなかったぐらい古い言語なので、
今日的な視点だけでこうあるべきだから禁止すべきというのはナンセンス。

810 :デフォルトの名無しさん:2010/01/04(月) 17:14:52
>>808
よく判ってないなら恥かくだけだから黙ってたほうがいいぞ

811 :デフォルトの名無しさん:2010/01/04(月) 17:35:41
>>809
>今日的な視点だけでこうあるべきだから禁止すべきというのはナンセンス。
それこそナンセンスな意見だ。
今日だろうと当時だろうと、プログラムを書くのは同じ人間なんだけど、
それを理解してるのかな。

もちろん「当時は技術的に困難だった」事柄や「当時には一般的じゃなかった知見」
についてはこの限りではない。

だが、30年前だって5[a]を禁止することが技術的に困難だったとも思えないし、
こんなものを許すより許さない方が好ましいことが理解されないほど
低レベルな世界じゃなかったと思うけど。

812 :デフォルトの名無しさん:2010/01/04(月) 17:37:29
>>784 dクスー!!まさにそれそれそれですよ
エスパーのエロい人ありがd!

813 :デフォルトの名無しさん:2010/01/04(月) 19:19:32
>>811
>30年前だって5[a]を禁止することが技術的に困難だったとも思えないし
困難だったんだよ。
CPUは8MHz、RAMは256KB、フロッピーディスクでコンパイルしてたような時代を憶測で語ろうとする無謀さに気づけ。

814 :デフォルトの名無しさん:2010/01/04(月) 19:45:32
それが仮に困難なら、交換法則が成立しない演算子を実装することも
同じように困難なはずだと思うけどねw

815 :デフォルトの名無しさん:2010/01/04(月) 19:46:04
offset[base] はアセンブラではごく普通
抽象アセンブラを目指した言語にあるのは何の不思議もない

816 :デフォルトの名無しさん:2010/01/04(月) 20:02:06
今のPCで、高級言語しか触ったことないんじゃないのか
オペランドの1つ目と2つ目を交換できない機械語なんか普通に存在するのだけど

817 :デフォルトの名無しさん:2010/01/04(月) 20:27:54
CFAQ、じゃねーな
どこかに書いてあったんだが忘れた。
>>815と似たようなこと(思想的な部分)が回答として書かれていたはず。

818 :デフォルトの名無しさん:2010/01/04(月) 20:30:50
>>814
まったく意味が違う。
ポインタ[オフセット] は古いCでは 整数A[整数B] と展開されるから、整数Aと整数Bを区別できなかっただけ。
今時のC99とかC++とかの型付けの感覚で語るなと何度言えば。いや何度言ってもムダか・・・

819 :デフォルトの名無しさん:2010/01/04(月) 20:58:14
>整数A[整数B] と展開されるから
「その」展開そのものにはアンタッチャブルで文句言わないお約束なの?w
よくわからん思考をするお方。

820 :デフォルトの名無しさん:2010/01/04(月) 21:05:36
アセンブリ言語も勉強しないといけないなー
ちょっとAVRやってくる

821 :738:2010/01/04(月) 21:18:19
スレチなんで他スレ行ってきます。

822 :デフォルトの名無しさん:2010/01/04(月) 21:28:18
もうC99とかC++とかやるまえにJavaに行った方が良いな…

823 :デフォルトの名無しさん:2010/01/04(月) 21:29:07
Java++的なScalaに行くべきよ

824 :デフォルトの名無しさん:2010/01/04(月) 21:42:30
なんだっけ
ブール代数か何かで

等価交換の法則だか半島の法則だか何だか忘れたが

A+B は B+Aと等しい(キリッ

ちゅう法則があったような気もするが

825 :デフォルトの名無しさん:2010/01/04(月) 21:43:23
構造体で生徒の番号 身長 体重をセットして、
キーボ入力で身長の下限および体重の下限を入力し,
その範囲の学生の学籍番号とその身長および体重を表示するには
どうすればよいですか?


826 :デフォルトの名無しさん:2010/01/04(月) 21:43:49
>>824
> ブール代数か何かで
もっとレベルを落として小学生ないし中学生まで戻っても
 交換法則
って用語があるだろ?
それのことじゃないのかい?


827 :デフォルトの名無しさん:2010/01/04(月) 21:45:01
Rationale for American National Standard for Information Systems
Programming Language C 3.3.2.1 には、

The Committee found no reason to disallow the symmetry that permits a[i]
to be written as i[a].

と書いてある。ANSI の委員会の考え方は、このとおり。


828 :デフォルトの名無しさん:2010/01/04(月) 21:52:12
配列はポインタじゃないというのに、ポインタとして操作できるのもおかしな話だ。

829 :デフォルトの名無しさん:2010/01/04(月) 21:54:33
>>828
cwsk

830 :デフォルトの名無しさん:2010/01/04(月) 22:07:21
>>784 師匠!もう1つおながいします

10:00:00になったら 
/bin/hoge.sh を起動したいのですが
その場合時間をどこで見るようにしたらいいのでしょうか?
バックグラウンドプロセスとして動かせるように出来ると
涙チョチョ切れものです szo

cronに書いとけヴォケってのは許してww


831 :デフォルトの名無しさん:2010/01/05(火) 00:39:29
enumってのは型の保証が無いんですか?

832 :デフォルトの名無しさん:2010/01/05(火) 00:52:18
数値をn個入力したいときに、n回forで回すのではなくて、
1 2 3 4 …n な感じで数値の間に半角スペースを入れて入力したいのですが、
どうすればいいですか?

833 :デフォルトの名無しさん:2010/01/05(火) 01:07:50
>>832

char s[0x100];

fgets(s, 0x100, stdin);
nptr = strtok(s, " ");
while (nptr) {
atoi(nptr); /* 返り値が数値。エラー処理を厳しくしたいなら strtol(...) */
nptr = strtok(NULL, " ");
}

テストしてないし適当ですまん。こんなんで理解してくれればうれしい


834 :デフォルトの名無しさん:2010/01/05(火) 03:49:12
>>830
crontabに書けない理由は述べないのか
10:00:00になるまでsleepすればいいよ

835 :デフォルトの名無しさん:2010/01/05(火) 07:25:44
>>834
あ、どもsleepは気が付きませんでしたw
cronを使えないというのは
cronで実行すると約1秒ほど時間が掛かるので
んじゃ、Cならどうかな〜?と
軽く考えてみただけっすw
ちょっとC本漁ってきます


836 :デフォルトの名無しさん:2010/01/05(火) 10:33:31
1秒の遅れが問題になるのならSleepも短い時間でやるしかないような

837 :デフォルトの名無しさん:2010/01/05(火) 10:37:10
一秒を争うってことは特価品の注文スクリプトか何かかな

838 :デフォルトの名無しさん:2010/01/05(火) 10:40:46
だとしたら勝手に密かにやって欲しいな

839 :デフォルトの名無しさん:2010/01/05(火) 10:45:58
ろだのDL競争かもしれん

840 :デフォルトの名無しさん:2010/01/05(火) 20:17:46
ちょww、平リーマンの趣味レベルっす
注文受けるほど何かできるわけなすなす

って>>784師匠のおかげでだいぶ早くなったので
もうどうでもいいやとか思いつつもBashって限界あるのな〜とか思った

玄箱でWebカメラと音声を連続で取り込んで
コマコマムービー作ろうと思ったんだけど
1秒ズレるんでCならば・・・と思っただけです

ではではおせわさまですたたたた〜

841 :デフォルトの名無しさん:2010/01/05(火) 20:33:06
でも、結局 system() でシェルに投げるんじゃ一緒じゃねーの? w

842 :デフォルトの名無しさん:2010/01/05(火) 21:14:24
なんで速くなったのか謎だ

843 :デフォルトの名無しさん:2010/01/05(火) 21:55:42
プラシーボ効果

844 :デフォルトの名無しさん:2010/01/05(火) 23:42:25
system() 呼ぶ毎に sh の起動と終了が入るから
むしろ遅くなって然るべきだな。

845 :デフォルトの名無しさん:2010/01/05(火) 23:43:23
char *p;
p="foo";
p="bar";

これって同じ領域に代入されてるの?
それとも別の場所?


846 :デフォルトの名無しさん:2010/01/05(火) 23:46:06
>>845
p という領域にリテラルのアドレスを代入してる

847 :デフォルトの名無しさん:2010/01/05(火) 23:50:36
本人もよく分かってない場合の答えっぽくて

848 :デフォルトの名無しさん:2010/01/05(火) 23:53:40
p という同じ領域に代入してるけれど、代入しているのはリテラルを指すアドレス

849 :デフォルトの名無しさん:2010/01/05(火) 23:55:54
そのリテラルのアドレスはそれぞれ違う、ってこと?

850 :デフォルトの名無しさん:2010/01/05(火) 23:57:12
質問者が領域っていってる時点で...

851 :デフォルトの名無しさん:2010/01/05(火) 23:57:36
>>849
その通りです!

852 :デフォルトの名無しさん:2010/01/06(水) 00:01:14
char *p;
p="foo";
printf("%d %d\n",&p,p);
p="bar";
printf("%d %d\n",&p,p);
とかで確認してみるといいかもね

853 :デフォルトの名無しさん:2010/01/06(水) 00:05:55
なるほど
サンクス

854 :デフォルトの名無しさん:2010/01/06(水) 00:36:48
浮動小数点ってfloatとdoubleがありますよね
何やら10バイト浮動小数点という型も世の中にはあるようで、調べてみたんですが
FPUって10バイトのスタックに積んで計算をしているという記事をどこかで見ました

どうせ10バイトのスタックにつまれるなら同じものになるはずですよね
なのにfloatとdoubleで速度が違うという話を聞く(doubleの方が速い?)のですが、
速度の差ってどこから来るんでしょうか

855 :デフォルトの名無しさん:2010/01/06(水) 00:41:01
それはC言語とは関係ありません
適切なスレへ行ってください

856 :デフォルトの名無しさん:2010/01/06(水) 01:35:17
>>854
math.hの数学関数が軒並みdoubleを引数に取るので、
floatで計算する場合、それらの関数を使うといちいちdoubleとの変換が必要で遅くなるというC固有の事情もある。
C95/C99でfloat版関数も揃えられたからこの問題は解消されたと言えるけど。

857 :デフォルトの名無しさん:2010/01/06(水) 02:33:52
結局はi8087がデファクトスタンダードになってIEEEに採用されたとか、そういう歴史的な事情が

858 :デフォルトの名無しさん:2010/01/06(水) 10:08:29
むしろ、8087をスタンダードにするべくieee754が出来た、というかんじ

859 :デフォルトの名無しさん:2010/01/07(木) 02:30:58
たくさんの関数が入った自前のライブラリを作成する際に、
1つのCファイルにすべての関数を入れてライブラリにするより、
関数ごとにCファイルを作ってライブラリにした方が、
そのライブラリを使って動くCプログラムのバイナリサイズが
小さくなるのではと思い比較してみたのですが、
結果的には後者のライブラリを用いた方がバイナリサイズが大きくなってしまいました。

なぜこのようなことが起きるのか、お分かりになる方、ご教授ください。

860 :デフォルトの名無しさん:2010/01/07(木) 02:47:26
>>859
逆アセンブルしてみたら?

861 :デフォルトの名無しさん:2010/01/07(木) 03:07:57
なぜ細かくわければサイズが小さくなると思ったのかわからん。

862 :デフォルトの名無しさん:2010/01/07(木) 04:01:57
ソースの冒頭に

/* Author : Nanashi-San
* 01/07/2010 Last Update
*
*/

863 :862:2010/01/07(木) 04:04:20
途中で投稿してすみませんorz

ソースの冒頭に、このソースの大まかな説明、作者、バージョンなどがコメントされていますが、
皆さんはどういうスタイルで記述されていますか?
あるいは、参考になるような神プログラマのソースがあったら、お教えくだちい><


864 :デフォルトの名無しさん:2010/01/07(木) 04:20:47
>>862-863

/*
* cdjpeg.c
*
* Copyright (C) 1991-1997, Thomas G. Lane.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
* This file contains common support routines used by the IJG application
* programs (cjpeg, djpeg, jpegtran).
*/

大切なことは読んだ人がわかることだと。
ルールがあればそれに従う。

865 :デフォルトの名無しさん:2010/01/07(木) 04:38:30
>>864
レス感謝です

>大切なことは読んだ人がわかることだと。
なるほど!分りにくいところを簡素に説明、ってのがコメントの基本ですよね
初めてこのソースを読む人の気持ちを忘れないようにします

>ルールがあればそれに従う。
チームを組んで、大きなプログラムを作ってゆく時は大切そうですね・・・覚えておきます。
ありがとうございました!

866 :デフォルトの名無しさん:2010/01/07(木) 04:53:03
>>859
コンパイル単位に.oやら.objが作成される。
.obj .oは純粋にコードだけで出来ているのでは
なく、いくらか不純物を含む。(コンパイラやリンカ
が使用する情報)この不純物の量は.obj .oのサイズに
関わらずほぼ一定。つまり一つの.oや.objにコード
を詰め込んだほうが概して「純度」があがる。
リンクした際にも、この「不純物」はいくらか混入
する。よってリンクする.o .objが増えたらサイズが
それなりにでかくなってもおかしくはない。

867 :デフォルトの名無しさん:2010/01/07(木) 04:56:28
>>859
MAPファイル出力するようにしてそれを見てみたら

868 :デフォルトの名無しさん:2010/01/07(木) 14:39:23
http://codepad.org/hpmEDghf
内積をだすプログラムを作ろうとしましたが型をうまく使えません。
この場合エラーをどうすれば消せるのでしょうか?
又、&変数と変数[]は同じだというのを見たのですが、
visualc++でデバッグすると書き換えるとエラーの文章が変わる時があります。どう使い分ければいいのでしょうか


869 :デフォルトの名無しさん:2010/01/07(木) 14:57:14
ttp://codepad.org/YFXaXPYI
よくみてないけど、こうしたいのか?

870 :デフォルトの名無しさん:2010/01/07(木) 17:03:12
初心者のギモン

例えば配列で
int a[5];
の値が全部1だったら〜ってのを
if(a[0]==1 && a[1]==1 && a[2]==1 && a[3]==1 && a[4]==1)
なんてやんないでスマートにやるにはどうすればいいんだい

871 :デフォルトの名無しさん:2010/01/07(木) 17:07:34
for(i=0;i<5;i++)

872 :デフォルトの名無しさん:2010/01/07(木) 17:08:27
ループか、ビット演算でもできるかも
if (1 == (a[0] & a[1] & a[2] & a[3] & a[4]))

873 :デフォルトの名無しさん:2010/01/07(木) 17:09:06
>>872
a[0]==3

874 :デフォルトの名無しさん:2010/01/07(木) 17:10:30
アホだ普通にできないし

875 :デフォルトの名無しさん:2010/01/07(木) 17:10:37
a[0]==7

876 :デフォルトの名無しさん:2010/01/07(木) 17:12:58
やはり汎用性に定評のあるfor様の出番なのか。サンクス

877 :デフォルトの名無しさん:2010/01/07(木) 17:13:20
if (a[0..4].sum() == 5) {
}

878 :デフォルトの名無しさん:2010/01/07(木) 17:15:35
>>877
C言語でおk
ついでに 0 と 1 以外の値でアボン

879 :デフォルトの名無しさん:2010/01/07(木) 17:32:52
C言語はint x[5]ってやっても
x[10]=20;
みたいにできる、配列の最大要素数が無い欠陥言語だから
870のようにやるにはちょっと面倒なことしなきゃならん。

880 :デフォルトの名無しさん:2010/01/07(木) 17:43:41
書き方わからないと欠陥言語になるのかも

881 :デフォルトの名無しさん:2010/01/07(木) 17:45:41
包丁に安全装置がついてないって怒ってる人だね

882 :デフォルトの名無しさん:2010/01/07(木) 17:48:52
てかC言語に配列ってないし。

883 :デフォルトの名無しさん:2010/01/07(木) 17:50:01
このように配列と区別のついてない人もいるけど
入門スレだからしょうがないね

884 :デフォルトの名無しさん:2010/01/07(木) 18:00:52
回答者が入門レベルという意味だったのか

885 :デフォルトの名無しさん:2010/01/07(木) 18:10:48
何を今さら

886 :デフォルトの名無しさん:2010/01/07(木) 18:28:50
ほんとうにわかってる奴なんてあんまりいないよ

887 :デフォルトの名無しさん:2010/01/07(木) 18:34:18
まじめな話です。「本当にわかる」ってどのくらいの認識でいいのでしょうか。
C と付き合い始めて25年、いろいろやったけれども、まだわからないことが多いです。

888 :デフォルトの名無しさん:2010/01/07(木) 18:35:53
> まだわからないことが多いです。
たとえば?

889 :デフォルトの名無しさん:2010/01/07(木) 18:38:17
ポインタが分かればおk

890 :デフォルトの名無しさん:2010/01/07(木) 18:56:01
言語仕様を覚えただけじゃただの役立たず
資料とにらめっこばかりで全然コーディングしないここの回答者連中のこと

891 :デフォルトの名無しさん:2010/01/07(木) 19:18:15
25年もやってまだわからないことが多いなら才能なし

892 :デフォルトの名無しさん:2010/01/07(木) 19:27:13
Cとつきあって十数年になるが、他の言語も平行してるからその都度ちょびっとづつわすれちゃう
コボラーなら一つの言語だけで食っていけるのだろうか

893 :デフォルトの名無しさん:2010/01/07(木) 19:36:46
困ったときに何調べたらいいのか分かれば十分だろ

894 :デフォルトの名無しさん:2010/01/07(木) 19:43:14
25年やってわからないことって何だろう?

895 :デフォルトの名無しさん:2010/01/07(木) 19:45:20
言語仕様を覚えただけて・・・
とりあえずルールだけ覚えた将棋みたいなものか

896 :デフォルトの名無しさん:2010/01/07(木) 19:49:48
言語仕様を覚えただけ、とは言うが、
規格を(右辺がどの左辺がどうのなども)丸暗記してる奴がいたら、
あいまいな理解であいまいな表現をしてあいまいなコード書く奴よりはいい。

897 :デフォルトの名無しさん:2010/01/07(木) 19:51:17
丸暗記の方があいまいなことやりそうな

898 :デフォルトの名無しさん:2010/01/07(木) 20:02:11
書き方うんぬんより、デバッグ能力のある人の方が...

899 :デフォルトの名無しさん:2010/01/07(木) 20:06:05
mem c cpyとか
mem p cpyのcやpが何なのかわからん

900 :デフォルトの名無しさん:2010/01/07(木) 20:25:56
>>888
エラー処理をどうすればいいか、とか。
http://pc12.2ch.net/test/read.cgi/tech/1260532772/203

901 :デフォルトの名無しさん:2010/01/07(木) 20:32:04
>>898
こりはいよいよデバッガの参上か、と毎回おもいつつ、printf() とひらめきだけでなんとかおさまっていますう。

902 :デフォルトの名無しさん:2010/01/07(木) 21:10:28
int(*)[10]さまのお通りだ!

903 :デフォルトの名無しさん:2010/01/07(木) 21:15:00
>>902
使い道がわからない。あと引数があるときはどう指定するの?

904 :デフォルトの名無しさん:2010/01/08(金) 00:48:18
>>894
例えばgoto文やグローバル変数を否定する理由を明確に答えられる奴はその歳でも少ないよ

905 :デフォルトの名無しさん:2010/01/08(金) 00:52:40
>>904
ちなみにお前は答えられるのか?

906 :デフォルトの名無しさん:2010/01/08(金) 00:59:17
明確というか、条件無しに唯一無二の答えがあるのなら長年の論議にはなってないんだよ

907 :デフォルトの名無しさん:2010/01/08(金) 01:06:27
>>905
うん、答えられるよ
おまえには教えないけどね

908 :デフォルトの名無しさん:2010/01/08(金) 01:07:39
XPユーザーならやってみる価値あり

1.適当なフォルダにあるEXEファイルを右クリック→[スタート]メニューにアイコンを追加を選択
2.先ほどのEXEファイルがあるフォルダ自身の名前を変更する
3.スタートメニューを開いて上記の手順で追加したリンクを右クリック→プロパティを選択
4.無効なリンクになっているので、[変更]ボタンを押す
5.該当ファイルの変更後の正しい場所を指定する
6.・・・なにぃ!!

 感想きぼんぬ

   ※ 一人でニヤニヤした後は設定を元に戻しておきましょう

909 :デフォルトの名無しさん:2010/01/08(金) 01:13:50
>>905
goto 文は、今は否定されていだいだろ。

910 :デフォルトの名無しさん:2010/01/08(金) 01:14:11
古いコピペだな
今頃ひっかかってよっぽどくやしかったのかな

911 :デフォルトの名無しさん:2010/01/08(金) 01:15:09
>>909
部分的に認められているけど、「やっちゃいけないパターン」は今でも健在

912 :デフォルトの名無しさん:2010/01/08(金) 01:15:37
>>909
あなたの言葉が理解できない

913 :デフォルトの名無しさん:2010/01/08(金) 01:15:54
>>908
へぇどうなんの?
vistaだから分からないや

914 :デフォルトの名無しさん:2010/01/08(金) 01:16:37
>>913
これやるとexeをどのクリックしても、5で選んだアプリが起動するようになる
つうか、何が起こってるか最初わからず、泣きそうになったw

915 :デフォルトの名無しさん:2010/01/08(金) 01:17:50
C言語の前に日本語でおk

916 :デフォルトの名無しさん:2010/01/08(金) 01:18:37
ググればすぐ解決するようなオリジナリティもユーモアセンスも全くないコピペを
ム板に貼ってなんか意味あんのかなあ

917 :デフォルトの名無しさん:2010/01/08(金) 01:19:36
>>909
goto禁止厨がいるかぎりgotoをしようすべきではない

918 :デフォルトの名無しさん:2010/01/08(金) 01:20:35
触らぬ神に祟りなし

919 :デフォルトの名無しさん:2010/01/08(金) 01:20:41
ごとーに関してはC言語を始めたばかりの人でもわかるからだろう。
「gotoはいついかなる状況でも絶対つかっちゃいけません。」
ならgotoキーワード廃止しろよと思うが。
浦島太郎さんこの箱をあげましょう、でも絶対にあけないでくだしあ。
玉手箱ですかw

920 :デフォルトの名無しさん:2010/01/08(金) 01:22:00
getsよりは使い所あるだろ
脱出とか

921 :デフォルトの名無しさん:2010/01/08(金) 01:45:17
gotoもswitchもラベルを使うがラベルの乱用はコード
を極度に読みにくく出来るので、乱用を恐れて
禁止するケースが多い。例:http://codepad.org/UFWzPjxr
業務PGでは変数名、関数名、ファイル名など管理しなければ
ならないものが多いので、ラベルまで管理対象に入れたくないが
使われると入れざるを得ないという理由で禁止されるケース
が多いが、これも一見まっとうに見えて実は何かが間違っている

922 :デフォルトの名無しさん:2010/01/08(金) 01:46:07
Document generator は Doxygen 以外に良いものありますか?

923 :デフォルトの名無しさん:2010/01/08(金) 01:50:30
>>919
goto文を「使うべき」ケースが藤原さんのページでごく軽く示されているが
泣き所が関数をまたげないことで、この点はK&Rの説明でさえダメだからな・・・

924 :デフォルトの名無しさん:2010/01/08(金) 02:10:54
>>921
キミの会社ではローカル変数まで部署管理なのかw?
ウチでは関数までは部署管理で追加する場合や新規に
呼び出す場合や呼び出しを廃止する場合とかはイチイチ
報告書書かなければならないけど。さすがにローカルauto変数
の追加、廃止、使用方法変更で報告書までは書かされないよ。
名称はコーディング規約で厳格に規制されてるけど。
ラベルはどうかは知らない。switchラベルレベルだと自由に
使えるみたいだが関数内ラベルだと恐らく自由だとは思うが
変数名制約に抵触する場合を考えると完全に自由というわけでも
なさそう。

925 :デフォルトの名無しさん:2010/01/08(金) 03:50:57
>>924
コーディング規約で改行の入れ方も規定したほうがいい

926 :デフォルトの名無しさん:2010/01/08(金) 04:08:02
>>908
このバグまだ直ってなかったのか。

拡張子の.exe が別のアプリに関連づけられてシェルからプログラムが
起動できなくなるからやらんほうがいいよ。

修正はここに .exeが登録されてるから削除すればいい。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\


927 :デフォルトの名無しさん:2010/01/08(金) 05:00:58
未だに縦読みを気にする人が居るとは....

928 :859:2010/01/08(金) 09:21:10
>>860 >>866 >>867
ありがとうございます、その線で調べてみます。

929 :デフォルトの名無しさん:2010/01/08(金) 10:07:57
プログラミングの問題なんですが、if文と繰り返し(for,whileのいずれか)を利用して次の問題を作成します。

米ドル紙幣としては次のような紙幣とコインがある。
100ドル、50ドル、20ドル、10ドル、5ドル、2ドル、1ドル
50セント、25セント、10セント、5セント、1セント

問題は、キーボードから日本円を入力し、まずドルに変換した後ドルを紙幣とコインに振り分けるプログラムを作成しなさい。但し1ドルを92.69円として換算しなさい。そして、日本円が0円の時にプログラムを終了する。


¥195,865
2,112,89$

100$…21枚
50$
20$
10$…1枚
5$
2$…1枚
1$
50¢…1枚
25¢…1枚
10¢…1枚

1¢…4枚

このような問題なんですがプログラムとして最適なものが分かる方は是非教えてください。

* グレード



930 :デフォルトの名無しさん:2010/01/08(金) 10:11:19
宿題は宿題スレへ

931 :デフォルトの名無しさん:2010/01/08(金) 11:01:36
#include <stdio.h>

#define RATE 92.69

int main(int argc, char *argv[])
{
  int  i;
  float  yen = 0.0;;
  long  dollar = 0;
  long  exchange;
  long  k[] = {10000, 5000, 2000, 1000, 500, 200, 100, 50, 25, 10, 5, 1, 0};
  char  *str[] = {"100$", "50$", "20$", "10$", "5$", "2$", "1$", "50k", "25k","10k","5k","1k", ""};

  scanf("%f", ¥);
  if(yen == 0.0) return 0;

  /* ドル円変換式、例題のような変換値にならなかったので固定 */
  /*dollar = (long)((yen / RATE) * 100000);*/
  dollar = 211289;

  for(i=0; k[i] != 0; i++)
  {
    exchange = dollar / k[i];
    printf("%s... %d枚\n", str[i], exchange);
    dollar = dollar - (exchange * k[i]);
  }

  return 0;
}



932 :デフォルトの名無しさん:2010/01/08(金) 11:03:42
&がバグって表示されているが、訂正はしない

933 :デフォルトの名無しさん:2010/01/08(金) 12:34:11
>>923
setjmp

934 :デフォルトの名無しさん:2010/01/08(金) 15:28:59
16進法の文字列の各桁をint型の配列に格納するにはどうすればいいのでしょうか?
例えば"5b7c"だと以下のように格納します。

int digits[];

digits[0] = 0xc
digits[1] = 7
digits[2] = 0xb
digits[3] = 5

935 :デフォルトの名無しさん:2010/01/08(金) 15:37:26
>>934
10進数だったらわかる?


936 :デフォルトの名無しさん:2010/01/08(金) 15:48:42
>>935
すみません、10進法でもわかりませんorz

937 :デフォルトの名無しさん:2010/01/08(金) 16:01:08
sscanf("5b7c", "%1x%1x%1x%1x", digits+3, digits+2, digits+1, digits+0);
とか


938 :デフォルトの名無しさん:2010/01/08(金) 16:46:52
>>936
たとえば10進数の 7654 の4桁の場合、
digits[0]: 10 で割った余り(を 1 で割った答え)
digits[1]: 100 で割った余りを 10 で割った答え
digits[2]: 1000 で割った余りを 100 で割った答え
digits[3]: (10000 で割った余りを) 1000 で割った答え


939 :デフォルトの名無しさん:2010/01/08(金) 16:50:10
int ctoi16(char c) {
c = tolower(c);
return 'a' <= c && c <= 'f' ? 10 + c - 'a' : c - '0';
}
int main() {
char *cs = "5b7c", *p;
int digits[4], i;
for (i = 0; i < strlen(cs); i++) digits[i] = ctoi16(cs[i]);
for (i = 0; i < 4; i++) printf("digits[%d] = %x\n", i, digits[i]);
return 0;
}

みたいな。けど、>>937みたいにするのがスマートだと思う。

940 :デフォルトの名無しさん:2010/01/08(金) 16:53:42
ありゃ。ctoi16(cs[strlen(cs) - 1 - i]); という動きだな>>934は。

941 :もっとスマートなやり方はきっと存在するはず:2010/01/08(金) 16:55:46
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define SA ('a' - 10)

int main(int argc, char *argv[])
{
  char  *str = "5b7c";  /*大文字アルファベットが混じると落ちる*/
  int  *digits;
  int  i, len;
  char  work[2];

  len = strlen(str);
  digits = (int *)malloc(sizeof(int) * len);
  memset(digits, 0, sizeof(int) * len);
  memset(work, 0, sizeof(work));

  for(i=(len - 1); 0<=i; i--)
  {
    work[0] = *(str + i);
    if(isdigit( *(str + i) ))
    {
      *(digits + i) = atoi(work);
    }
    else {
      *(digits + i) = work[0] - SA;
    }
  }
  free(digits);
  return 0;
}

942 :デフォルトの名無しさん:2010/01/08(金) 17:18:12
>>937-941
ありがとうございます。
みなさんのを参考に何とかできました。


943 :デフォルトの名無しさん:2010/01/08(金) 19:50:44
>>907
いや別に知りたくねぇよ。
低能の戯れ言を信じるやつはいねぇ

944 :デフォルトの名無しさん:2010/01/08(金) 20:03:34
ストップウォッチ書いてお〜
100分の1秒も表示したいお
AAがで表示したいw


945 :デフォルトの名無しさん:2010/01/08(金) 20:28:42
ストップウォッチできたよ

#include <time.h>
int main(void)
{
  time_t  t = time(0); srand(t);
  getchar();
  printf("stop: %d.%02d\n", time(0) - t, rand() % 100);
}


946 :デフォルトの名無しさん:2010/01/08(金) 20:37:17
>>945
小数点以下ひでぇwww

947 :デフォルトの名無しさん:2010/01/08(金) 20:41:43
だがたいがい間に合う

948 :デフォルトの名無しさん:2010/01/08(金) 21:40:32
平均以上の数値を表示する問題です



#include <stdio.h>
main() {
int a1, a2, a3, a4;
int a[]={ 35, 40, 45, 50};
int i, c;
double ave;
for (i=0; i<4; i++) {
c += a[i];
ave = c/4.0;
if ( a[i] >= ave ); }
printf("平均以上=\n", a[i]);
return 0;
}

平均値を超えている数値の数なら出せるのですが、数値そのものを出せ、という問題が出来ません。

どこが間違ってるか教えてください。


949 :デフォルトの名無しさん:2010/01/08(金) 21:42:38
>>948
こういうのってCの問題でも何でもないよな

950 :デフォルトの名無しさん:2010/01/08(金) 21:49:20
int a1, a2, a3, a4が一度も使われておりません
とかって警告でるんじゃねえの

951 :デフォルトの名無しさん:2010/01/08(金) 21:52:21
間違い多すぎて笑えるw

952 :デフォルトの名無しさん:2010/01/08(金) 21:53:24
>>950
VC#ならでる

953 :デフォルトの名無しさん:2010/01/08(金) 21:55:03
>>948
・cが初期化されてないのに+=で代入している
・if ( a[i] >= ave );という意味のなさない文がある
・バグの原因ではないがaveに4回も代入する必要はない
・偶然にも2になったとしても表示してるのは平均以上の数ではない
・曲がりなりにもコンパイルと実行できるのが奇跡に思える
・っていうか釣りじゃないよね?

954 :デフォルトの名無しさん:2010/01/08(金) 22:03:24
#include <stdio.h>
main() {
int a1, a2, a3, a4;
int a[] = {35, 40, 45, 50};
int i, c;
double ave;
for(i=c=0; i<4; i++) c += a[i];
ave = c / 4.0;
for(i=0; i<4; i++) {
if(a[i] >= ave) printf("平均以上=%d\n", a[i]);
}
return 0;
}

こういうことがやりたいのかなあ?

955 :デフォルトの名無しさん:2010/01/08(金) 22:12:35
相変わらず入門者を笑ったり釣り扱いする人がいるな。
入門者なんてとんでもない勘違いをしてることが多いのにいちいちワライにきてるのかね。

956 :デフォルトの名無しさん:2010/01/08(金) 22:14:45
笑って何が悪い?悪くないよね。

957 :デフォルトの名無しさん:2010/01/08(金) 22:16:25
性格が悪い

958 :デフォルトの名無しさん:2010/01/08(金) 22:28:57
それがなにか?

959 :デフォルトの名無しさん:2010/01/08(金) 22:32:11
>>955は何しに来てんの?

960 :デフォルトの名無しさん:2010/01/08(金) 22:36:28
>>945
ちょww なんかrandって気になるんですけどwww
気にしたら負けなんですか?

961 :デフォルトの名無しさん:2010/01/08(金) 22:43:36
>>960
些細なことよりも全体を見るべき
意味がわかればそれでいい

962 :デフォルトの名無しさん:2010/01/08(金) 23:25:07
なんか悟りの境地だな
木を見て森はどうでもイイw

963 :デフォルトの名無しさん:2010/01/08(金) 23:35:51
>>949
頭の問題だよな

964 :デフォルトの名無しさん:2010/01/09(土) 00:22:49
#include <stdio.h>
main() {
int a[] = {35, 40, 45, 50};
int i, c;
c=0;
for(i=0; i<4; i++) {
c += a[i];
}
for(i=0; i<4; i++) {
if(a[i] >= c/4.0);
}
printf("平均以上=\n", a[i]);
return 0;
}


直しました。皆さんすみません。釣りじゃないです。
>>953
今回は2を出したいわけじゃありません。45、50という数値を出したいです。
コンパイルすると確かに,if文に警告が出ます。printの文がググっても分かりません。
正しい書き方を教えてください。

965 :デフォルトの名無しさん:2010/01/09(土) 00:28:43
どうしてせっかく出た見本を無視する
おまえは人の親切心をブチ壊すのが趣味か
最低だな

966 :デフォルトの名無しさん:2010/01/09(土) 00:29:01
もっというとi<4とかc/4.0の4っていう数字は配列の要素数から出すべきだと思う

967 :デフォルトの名無しさん:2010/01/09(土) 01:01:02
Cは難解すぎるからもっと入門にはライトな言語が良いと言う人もいれば
入門用に最適。シンプルでわかりやすいから初心者に勧める

という2人がいますが、どっちが正しいんでしょうか

968 :デフォルトの名無しさん:2010/01/09(土) 01:01:21
>>965
懐が浅いよ、おまえ

969 :デフォルトの名無しさん:2010/01/09(土) 01:01:35
どっちも正しい

970 :デフォルトの名無しさん:2010/01/09(土) 01:05:34
>>967
「入門」がどういうレベルかによるが、
ローティーンにはインタープリタ方式の方が頭の柔らかさを活かせると思う
それで育った幅広い発想力を土台に、専門分野へチャレンジするときがCの出番だと思う

971 :デフォルトの名無しさん:2010/01/09(土) 01:06:51
Cから入って、さっさと卒業した方が良い

972 :デフォルトの名無しさん:2010/01/09(土) 01:46:47
>>967
前者が正しい。
Cがシンプルでわかりやすい?初心者に勧める?とんでもない大ウソだ。
シンプルでわかりやすく、初心者でも扱えるような言語で、UNIXが記述できるはずがない。

こだわる人のために補足すれば、Cは「難解」ではなく、「危険」だ。ちょっとしたミスが大怪我を引き起こす。
それだけ細かいことが出来るからこそ、OS記述言語として使われている。

973 :デフォルトの名無しさん:2010/01/09(土) 01:49:22
>>967
最初かと言われると微妙だけど、フォンノイマン型コンピュータを扱う上でいつかはCに触れて欲しい。


974 :デフォルトの名無しさん:2010/01/09(土) 01:51:22
アセンブリよりシンプルで分かりやすいよ

975 :デフォルトの名無しさん:2010/01/09(土) 01:52:48
>>967
アセンブラと比べると難解すぎるし、
C++と比べればシンプルでわかりやすい。

976 :デフォルトの名無しさん:2010/01/09(土) 01:55:07
馬鹿らしい。目的と手段が逆転してる

977 :デフォルトの名無しさん:2010/01/09(土) 02:20:56
質問です。
できますか?

978 :デフォルトの名無しさん:2010/01/09(土) 02:22:55
できますん

979 :デフォルトの名無しさん:2010/01/09(土) 09:48:52
俺は>>971の意見に賛成。


> 入門にはライトな言語が良い
これは、勉強する人がくじけそうな性格ならそうだろう。
しかしC言語が書けないプログラマはもはやプログラマではない
と言って差し支えないほどC言語は普及しているので、
どうせやるなら最初はC言語がいいんではないかと。

980 :デフォルトの名無しさん:2010/01/09(土) 09:59:21
Cができれば他の言語は全部できたも同じ

981 :デフォルトの名無しさん:2010/01/09(土) 10:02:29
>>980
同感

982 :デフォルトの名無しさん:2010/01/09(土) 10:37:17
>>967
 ・ネットで読めるサンプルの数
 ・質問のできる場、対する回答者の数
 ・入門者向けのために「正確さ」を端折った解説の量

C言語はこれらが圧倒的に多いため入門用に最適。
ただ、コードの読み書きだけで見れば、他のLL言語が良い。

どちらにしても初心者ってのは、何がわからないのかがわからない。
調べる方法と聞ける相手と場を与えることが大切で、それさえ教えてしまえば
もう初心者ではなく、どんな言語でもあとは
読んで触って試して改造してテストしまくってもらえば身につく。

本当にどんな言語のコードでも読んだことも見たことも無い人向けならば
俺なら構造と階層の意味と、プログラムにおける当たり前の
開いたら閉じる書式を知ってもらうために、まずはXHTML薦めるわ。
IEバグに関連付けてソフトウェアのバージョン違いを意識してもらうことと
更新の大切さも教えられるから。

C言語でもLL言語でも入るのはそれからだな。

983 :デフォルトの名無しさん:2010/01/09(土) 10:40:20
Cからjavaに来てあいかわらずCライクな
書き方しかできないおっさんとかゴロゴ
ロいるからCができれば他もできるって
のは賛成できない。

984 :デフォルトの名無しさん:2010/01/09(土) 10:43:30
>>983
あるあるw

Cやった上で、JavaなどのOOPL行くのが最良と思う。
Cで溜まったある種のフラストレーションを、
OOPでの抽象化によって開放させてみてほしいと思う。

985 :デフォルトの名無しさん:2010/01/09(土) 10:49:07
N88Basicから入ってアセンブラ→Cと
きたオッサンとしては、今の時代、
LLから入門してもいいじゃないかって
気もする。

986 :デフォルトの名無しさん:2010/01/09(土) 10:51:51
BASIC、PASCAL、C、Prolog、Java、Perl、PHP、C++、Ruby、C#の順で学んだ。
Javaが教えてくれたものがやっぱり大きいと思う。

987 :デフォルトの名無しさん:2010/01/09(土) 10:59:46
>>982
LL言語ってなに?HTML言語みたいにLと言語って重ねるもんなの?

988 :sage:2010/01/09(土) 11:31:29
>>987
うわ、釣れた釣れた w

989 :デフォルトの名無しさん:2010/01/09(土) 11:46:52
釣る場合は先に釣りと書かないとルール違反だよ

990 :デフォルトの名無しさん:2010/01/09(土) 12:10:11
>>987
書いてて今気付いたわすまん、LLにすべきで
LL言語だと頭痛が痛いと同じだな……

991 :デフォルトの名無しさん:2010/01/09(土) 12:14:42
「LLな言語」と書ける日本語は素晴らしいよね

992 :デフォルトの名無しさん:2010/01/09(土) 13:09:10
Mr.社長さん

993 :デフォルトの名無しさん:2010/01/09(土) 13:23:29
>>987
TCPプロトコルなんかと同じで、LLだけだと短くて居心地が悪い人が多いんだろう

994 :デフォルトの名無しさん:2010/01/09(土) 13:32:26
またパーサの話か・・・

995 :sage:2010/01/09(土) 13:35:47

C言語なんかと同じで、Cだけだと短くて居心地が悪い。

996 :デフォルトの名無しさん:2010/01/09(土) 14:21:59
>>995
sageは間違えてるの?わざとなの?


C言語なら俺に聞け(入門編)Part 59
http://pc12.2ch.net/test/read.cgi/tech/1263014439/

997 :デフォルトの名無しさん:2010/01/09(土) 14:40:04
>>996


998 :デフォルトの名無しさん:2010/01/09(土) 14:42:41
埋め

999 :デフォルトの名無しさん:2010/01/09(土) 14:43:50
埋め

1000 :デフォルトの名無しさん:2010/01/09(土) 14:44:37
C言語なら俺に聞け(入門編)Part 59
http://pc12.2ch.net/test/read.cgi/tech/1263014439/

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

211 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)