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

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

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

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


2 :デフォルトの名無しさん:2009/12/05(土) 23:03:01
>>http://pc12.2ch.net/test/read.cgi/tech/1258623854/998
SDLはcharで統一、wchar_tが出てきても即効でcharに変換しているようです

3 :デフォルトの名無しさん:2009/12/05(土) 23:07:20
そしたらアクセス不可能な物が出てくるじゃん。utf8に変換なら良いけど。
utf8にしたら大工事が必要なのが難点。

4 :デフォルトの名無しさん:2009/12/05(土) 23:09:37
windowsにはutf8の関数がないからね。全ての関数のラッパーを作らないといけない。
渡すときだけ、utf8toutf16という関数挟めば良いだけか。

5 :デフォルトの名無しさん:2009/12/05(土) 23:14:25
クロスプラットフォームなものなら、内部UTF-16に統一しているのが多
い印象だなあ。Windowsはwchar_t=WCHAR=UTF-16だけど、それ以外では
wchar_tのサイズや中身はマチマチだからけっきょくwchar_tも使われな
い。


6 :デフォルトの名無しさん:2009/12/05(土) 23:23:42
>>5
同印象。
バイト数と文字数が(概ね)比例する方が、中身は作り易いからかなぁ。


7 :デフォルトの名無しさん:2009/12/06(日) 00:17:06
そもそも Win だと大文字小文字の区別がないんだから
a.txt と A.txt があったらどうなるんだ?

8 :デフォルトの名無しさん:2009/12/06(日) 00:37:46
同じ型なのに、
Surface*  ABC;
Surface   *BCD;

ってするのは何か意味があるのですか。

9 :デフォルトの名無しさん:2009/12/06(日) 00:41:13
前者は馬鹿がよく使う表記。
普通は後者を使う。

10 :デフォルトの名無しさん:2009/12/06(日) 00:44:42
型としてchar*とcharは別で、char*自体は存在するからな。

11 :デフォルトの名無しさん:2009/12/06(日) 00:49:32
Type* foo,bar;
と宣言したら
sizeof(foo)とsizeof(bar)が一致しました。
このコンパイラは馬鹿ですか?

12 :デフォルトの名無しさん:2009/12/06(日) 01:13:32
括弧つけんなボケ

13 :デフォルトの名無しさん:2009/12/06(日) 01:30:11
見た目が違うだけです

14 :デフォルトの名無しさん:2009/12/06(日) 01:55:15
>>9
バカってゆーな!!
1行に複数の変数宣言すんの嫌いだから上で書いてるんだい

15 :デフォルトの名無しさん:2009/12/06(日) 02:21:26
>>11
それだけでは。

16 :デフォルトの名無しさん:2009/12/06(日) 02:26:37
sizeof(Type)とsizeof(Type*)が同じになっちゃいけないってきまりはないしな。

17 :デフォルトの名無しさん:2009/12/06(日) 05:45:38
Surface*  ABC;//センスある人が使う
Surface   *BCD;//頭すっからかんが使う


18 :デフォルトの名無しさん:2009/12/06(日) 07:25:34
Surface* ABC, BCD;
自分がセンスあると勘違いして間違える。

19 :デフォルトの名無しさん:2009/12/06(日) 07:27:58
Surface*  ABC; // C以外もよく使う人が使う
Surface   *BCD; // 年配の人がよく使う

20 :デフォルトの名無しさん:2009/12/06(日) 07:46:16
間を取ってSurface*ABC; か Surface * BCD; でいいだろ、もう。


21 :デフォルトの名無しさん:2009/12/06(日) 08:48:24
Surface*  ABC; // これはねーよww


22 :デフォルトの名無しさん:2009/12/06(日) 09:48:22
>>18
センスのある人は変数ごとに個別に宣言するから

23 :デフォルトの名無しさん:2009/12/06(日) 10:14:05
>>22
それはありそうもない。まとめて宣言するのは普通のこと。

24 :デフォルトの名無しさん:2009/12/06(日) 10:16:44
typedef Surface* LPSurface ;

25 :デフォルトの名無しさん:2009/12/06(日) 10:26:12
>>24
そのハンガリアンはマイクロソフトの悪習

26 :デフォルトの名無しさん:2009/12/06(日) 10:29:52
>>6
まじめに作るなら、UTF16もマルチバイト文字と同じ手間が必要。
このまえ有料の2chブラウザがそれで失敗して祭られてた。

27 :デフォルトの名無しさん:2009/12/06(日) 11:34:05
うてふはち(いやマジでこういう奴がおんねんて)
以上は、「何故こういうセットなのか」を深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く
理解していないと、いわゆるセキュリチーホールを作ってしまう。

どこからどこまでのバイトが無効なのか知らないと、そのままメモリに乗っけるアホなプログラムソースになる。

28 :デフォルトの名無しさん:2009/12/06(日) 11:40:33
うてふはち?

29 :デフォルトの名無しさん:2009/12/06(日) 11:48:52
うてふじゅーろく
うてふさんじゅーに
うてふろくじゅーよん

30 :デフォルトの名無しさん:2009/12/06(日) 11:51:56
うにこーど?

31 :デフォルトの名無しさん:2009/12/06(日) 12:04:30
//と/**/どっちが良いんでしょうか

32 :デフォルトの名無しさん:2009/12/06(日) 12:05:49
良いとか悪いとかいうことは無いので、好みで

33 :デフォルトの名無しさん:2009/12/06(日) 12:10:11
そうですか、ありがとうございます

34 :デフォルトの名無しさん:2009/12/06(日) 12:11:25
一行コメントの場合は//の方が便利だし、
範囲をコメントアウトする場合は/**/の方が便利。

35 :デフォルトの名無しさん:2009/12/06(日) 12:15:08
#if !defined
#if defined
#ifndef
#ifdef

これを使い出すようになると、なにやら俺もマルチプラットフォーマーになった気分さえ味わえる、で、あ
ろう・・・

36 :デフォルトの名無しさん:2009/12/06(日) 12:19:55
#ifdef の嵐...

37 :デフォルトの名無しさん:2009/12/06(日) 14:13:28
>>23
汚いコード書く人ほどそうするよね
普通は初期化もするから複数宣言したら見辛いだけ

38 :デフォルトの名無しさん:2009/12/06(日) 14:19:40
int i, j;

for (i = 0; ...

39 :デフォルトの名無しさん:2009/12/06(日) 14:19:41
>>26
サロゲートペアか

40 :デフォルトの名無しさん:2009/12/06(日) 14:22:30
>>39
結合文字も。

41 :デフォルトの名無しさん:2009/12/06(日) 14:22:44
カウンタは例外だな・・・
ポインタじゃないからどうでもいいけど

42 :デフォルトの名無しさん:2009/12/06(日) 14:24:14
>>40
有料でやっちゃったら叩かれるよなあ
てか有料の専ブラとかあんのか

43 :デフォルトの名無しさん:2009/12/06(日) 15:34:36
>>38
for(int i = 0; ...

44 :デフォルトの名無しさん:2009/12/06(日) 15:37:59
c99はまだ前提にして話出来るほど流行ってないと思う

45 :デフォルトの名無しさん:2009/12/06(日) 15:49:35
最近は C のコンパイラって無いよね。
大抵は C/C++ コンパイラだったりするし。
純粋な C コンパイラ欲しいな。

46 :デフォルトの名無しさん:2009/12/06(日) 15:50:14
gccでいいじゃん。

47 :デフォルトの名無しさん:2009/12/06(日) 15:58:48
>>43
読みにくい気がするのだが、、、

俺だけか。

48 :デフォルトの名無しさん:2009/12/06(日) 16:01:17
>>43
それ { } の外なのに中の扱いになって違和感あるから好きじゃないな。


49 :デフォルトの名無しさん:2009/12/06(日) 16:01:53
>>43 の書き方は、i のスコープが分かりづらい

50 :デフォルトの名無しさん:2009/12/06(日) 16:06:32
>>48
俺も最初違和感あったけど、便利すぎてやめられんw

51 :デフォルトの名無しさん:2009/12/06(日) 16:11:04
C99, C++, Java, C# あたりで >>43 の書き方してないやつはダメだろ。

52 :デフォルトの名無しさん:2009/12/06(日) 16:12:43
なんか不思議なレッテル貼りが始まった

53 :デフォルトの名無しさん:2009/12/06(日) 16:23:19
ふつー以上のレベルだと、>>43 の書き方だよ。

54 :デフォルトの名無しさん:2009/12/06(日) 16:25:25
違和感あるとか、スコープがわからないとか、ありえない。

55 :デフォルトの名無しさん:2009/12/06(日) 16:26:26
ループ終了時のiの値が必要になる場合は結局外で宣言しなきゃいけないし、
最初っから頭で宣言しといたほうが楽。

56 :デフォルトの名無しさん:2009/12/06(日) 16:29:39
>>55
だよね。使い分けも出来ずにこれが最高、これ以外ありえないって言ってる感じが

57 :デフォルトの名無しさん:2009/12/06(日) 16:30:20
C++なら当然かも知れないけど、ここCのスレだし

58 :デフォルトの名無しさん:2009/12/06(日) 16:30:48
そらスコープのforの外で見る必要があるとか、そういうことがるのは知ってるよ。
あと「おれはC#で、そもそもループなんてめったに書かないよww」みたいな
的外れな反論もいいからね。

59 :デフォルトの名無しさん:2009/12/06(日) 16:32:58
>>57
for (int i ・・・
みたいな書き方ができたらって前提で話が始まってるじゃん。
C89なら使えるし。

60 :デフォルトの名無しさん:2009/12/06(日) 16:37:08
C99からだぞ

61 :デフォルトの名無しさん:2009/12/06(日) 16:37:08
使えませんw

62 :デフォルトの名無しさん:2009/12/06(日) 16:38:08
>>60-61
結婚か

63 :デフォルトの名無しさん:2009/12/06(日) 16:49:47
>>60 間違えたスマソ。

>>56
でも、違和感があるとか、スコープがわからないとか言ってる連中は
状況によって、スコープがわかりやすくなったりしないだろうから、
状況によらずに、使わないってことだろ?



64 :デフォルトの名無しさん:2009/12/06(日) 16:51:36
forのカッコ内で宣言してたり、してなかったりで統一されてないのは気持ち悪いから、
最初から全部外だな。

65 :デフォルトの名無しさん:2009/12/06(日) 16:52:28
>>63
それ言ったの俺じゃないから知らないが
この使い方出来なきゃダメ、これが上級者のやり方
とか言ってる奴も同じだろ

66 :デフォルトの名無しさん:2009/12/06(日) 17:04:16
>>63
君はこれが使えるようになってからプログラム始めた口だね?
そうでなきゃ、教わったことをそのまま使って応用の利かないタイプかな。
使えないころからプログラミングやってきて、自分で考えるような人は
最初は違和感感じるもんだよ。

67 :デフォルトの名無しさん:2009/12/06(日) 17:07:03
for (int i = 0;...) ...

{int i; for (i = 0;...) ...}
と同義だしな。

68 :デフォルトの名無しさん:2009/12/06(日) 17:09:37
>>65
でも、実際ある程度以上(っていうか普通以上)のレベルの人は
for()の中で宣言するスタイルだし。

69 :デフォルトの名無しさん:2009/12/06(日) 17:10:13
流れ読めない子?

70 :デフォルトの名無しさん:2009/12/06(日) 17:10:58
>>66
べつに「最初は違和感あったけど今は便利に使ってる」みたいな人は問題にしてないよ。
ずっと違和感あって、使ってないって人はアレだけど。

71 :デフォルトの名無しさん:2009/12/06(日) 17:13:00
>>55 >>64
その理屈だと、ローカル変数使わないで最初から全部グローバルに
しとけばいいってことになるね。


72 :デフォルトの名無しさん:2009/12/06(日) 17:14:59
別に便利でもねえだろ。


73 :デフォルトの名無しさん:2009/12/06(日) 17:19:01
>>72 は >>70 宛て。

>>71
アホか。全然違うだろ。

74 :デフォルトの名無しさん:2009/12/06(日) 17:28:09
>>71
( ´゚д゚`)エー

75 :デフォルトの名無しさん:2009/12/06(日) 17:28:37
宗教論争だなw
それぞれ長所と短所が分類されて久しい罠

76 :デフォルトの名無しさん:2009/12/06(日) 17:29:32
>>71こそまさにスコープがなんなのか理解できてないアホw

77 :デフォルトの名無しさん:2009/12/06(日) 17:33:17
>>71
ワロタ。

ちなみに、スコープをループの中だけに限定すれば
難しいこと考えなくていい。
for (int i; ...; ...;)
 for (int j; ...; ...;)
   if (i の条件式)
     if (jの条件式)
       ... 処理 ...

78 :デフォルトの名無しさん:2009/12/06(日) 17:35:46
>>77
それ見るとイラッとする。
どんだけネストするんだよ、と。

79 :デフォルトの名無しさん:2009/12/06(日) 17:37:28
77がちっとも便利に見えない

80 :デフォルトの名無しさん:2009/12/06(日) 17:38:19
>>67
違うだろ。それなら誰もスコープについて文句言わない

81 :デフォルトの名無しさん:2009/12/06(日) 17:38:56
kwsk

82 :デフォルトの名無しさん:2009/12/06(日) 17:42:56
違わないと思うが。

83 :デフォルトの名無しさん:2009/12/06(日) 17:47:48
>>75
こういう議論になると、宗教論争(どっちでもいい、俺の言い分にも理がある)
とか言い出すやつがいるなぁ。

for(int i … を使わないやつなんて、ヘタクソだけじゃん。
まったく理はないよ。


84 :デフォルトの名無しさん:2009/12/06(日) 17:49:27
C++じゃなくてCを使い続ける意味が分からない
C++を使わない奴なんて、ヘタクソだけじゃん。
まったく理はないよ。

85 :デフォルトの名無しさん:2009/12/06(日) 17:51:22
>>73
おなじだ。
「広いスコープが必要になる場合があるから、デフォで広いスコープにスコープに
変数を置く」って理屈だろ。
>>55 は。
ローカル変数の意義をぜんぜん理解してない。

86 :デフォルトの名無しさん:2009/12/06(日) 17:52:55
>>84
もう一回言うけどC89は問題にしてない。

87 :デフォルトの名無しさん:2009/12/06(日) 17:54:07
結論
・同じ行で異なるものを複数宣言しない
・宣言と同時に初期化
・スコープは狭く

88 :デフォルトの名無しさん:2009/12/06(日) 17:54:53
C++じゃなくてCを使い続ける意味が分からない
C++を使わない奴なんて、ヘタクソだけじゃん。
まったく理はないよ。

89 :デフォルトの名無しさん:2009/12/06(日) 17:55:27
C++はどこで変数宣言しても良いってことがCとの違いの一つってなってるからね
上級者はC++だよ

90 :デフォルトの名無しさん:2009/12/06(日) 17:56:57
cell *p;
for (p = 先頭セル; *p; p = p->next)
  if (p->id == ID)
    break;

/* Not found... */
if (!p)
  return NULL;

... p に対する処理 ...

91 :デフォルトの名無しさん:2009/12/06(日) 17:57:19
逆に言えば、C++使えば上級者

92 :デフォルトの名無しさん:2009/12/06(日) 17:57:58
Linus君が、C++とそのプログラマはクソだと言ってたよ。

93 :デフォルトの名無しさん:2009/12/06(日) 17:58:59
自分が便利だと思うところだけ使ったらええねん

94 :デフォルトの名無しさん:2009/12/06(日) 18:00:20
C++しか使えない上級者ですが何か?

95 :デフォルトの名無しさん:2009/12/06(日) 18:00:38
>>90
for (p = 先頭セル; p; p = p->next) ?

96 :デフォルトの名無しさん:2009/12/06(日) 18:01:13
>>95
すまんミスった。

97 :デフォルトの名無しさん:2009/12/06(日) 18:07:16
C++ より C♯ のほうが上級だろ。
C++ なんか使ってる奴は下級者だよ。


98 :デフォルトの名無しさん:2009/12/06(日) 18:09:24
C#プログラマはうんこだとESR君が言ってたよ。

99 :デフォルトの名無しさん:2009/12/06(日) 18:10:22
C#は糞だと俺が常々言ってるだろ

100 :デフォルトの名無しさん:2009/12/06(日) 18:22:31
>>90
for (cell *p = 先頭セル; p; p = p->next) {
 if (p->id == ID)
  :
  ... p に対する処理 ...
  :
  :
 return p;
}
/* Not found... */
return NULL;

101 :デフォルトの名無しさん:2009/12/06(日) 18:26:23
ネスト深くするな

102 :デフォルトの名無しさん:2009/12/06(日) 18:40:46
C99でも変数はどこで宣言しても良かったはずだが

103 :デフォルトの名無しさん:2009/12/06(日) 18:42:35
この話題は深めるべきじゃない

104 :デフォルトの名無しさん:2009/12/06(日) 18:44:40
じゃあ終わり

105 :デフォルトの名無しさん:2009/12/06(日) 19:08:46
>>66
今頃「最初」はないだろ。。
どんだけプログラミングから離れてたんだよっていう。

106 :デフォルトの名無しさん:2009/12/06(日) 19:09:57
このスレがC99に限定するんじゃないなら全部無駄な話だろ
それが当たり前に使える言語のスレで議論すればいいじゃん

107 :デフォルトの名無しさん:2009/12/06(日) 19:10:42
K&R準拠にする?

108 :デフォルトの名無しさん:2009/12/06(日) 19:32:30
C++厨は専スレ立ててそっち行け。ここではお前らは「用無し」だ。

109 :デフォルトの名無しさん:2009/12/06(日) 19:38:46
>>108ってなんか上手い事言ってる?

110 :デフォルトの名無しさん:2009/12/06(日) 19:43:12
for (int i = 0; … への反論が「C89じゃ使えないだろ」
だったらそれで終わってたけど、「違和感がある」とか「スコープが分かりにくい」
だから、そこはツッコまざるをえない。

111 :デフォルトの名無しさん:2009/12/06(日) 19:45:08
流れ読めない子?

112 :デフォルトの名無しさん:2009/12/06(日) 19:45:49
上級者云々五月蠅かったらツッコまざるをえない

113 :デフォルトの名無しさん:2009/12/06(日) 19:46:55
上級者っていうか、普通以上なら、ループのカウンタは
for()の中に入れるわな。

114 :デフォルトの名無しさん:2009/12/06(日) 19:47:30
>>110
そのツッコみってなんか意味ある、内容のある意見なわけ?
ただの罵倒なら終わらないんだけど

115 :デフォルトの名無しさん:2009/12/06(日) 19:49:53
>>113
Cに限っていえば例え対応してても中に入れない人の方が多いと思うけど

116 :デフォルトの名無しさん:2009/12/06(日) 19:50:12
なんだよ、上級者とか普通以上とか。さっさとC卒業しろよw

117 :デフォルトの名無しさん:2009/12/06(日) 19:50:22
んで、結局 >>90 みたいにループで回して、ループの外でも
変数を使う、という話はどうなったんだ?

論点はそこじゃないのか。

118 :デフォルトの名無しさん:2009/12/06(日) 19:51:34
ループの中に入れるのが上級者なら
C99まではどうやってたんだよw


全員が初級かw



119 :デフォルトの名無しさん:2009/12/06(日) 19:52:19
C++ はひどい言語だ。これは、多くの平均以下のプログラマーが
使ってるためにさらに輪をかけてゲロゲロになっていて、どうし
ようもないゴミが簡単に生産されるようになってる。正直いって、
C を選ぶ理由が C++ プログラマーを追っぱらうため *だけ* だっ
たとしても、それ自体、C を使う強力な理由になりうる。

Linus Torvalds

120 :デフォルトの名無しさん:2009/12/06(日) 19:53:10
>>114
罵倒なんかしてないよ。
「お前の態度は気に食わない」レベルの書き込みって、
俺以外のやつがしてる。
おれはそれに対して、反論してるだけ。

121 :デフォルトの名無しさん:2009/12/06(日) 19:54:31
OOPが理解出来ない奴の泣き言は聞き飽きた

122 :デフォルトの名無しさん:2009/12/06(日) 19:54:43
>>117
それの話をしてる人はそれが論点なんだろうね。

おれは教条主義みたいに、ぜったいすべきって話はしてないし。

123 :デフォルトの名無しさん:2009/12/06(日) 19:55:34
いや、終わった話をツッコまざるを得ないとか言って続けてる奴はなんだよw

124 :デフォルトの名無しさん:2009/12/06(日) 19:56:29
>>121
OOPはいいけど、C++は良い言語とは言えない。

125 :デフォルトの名無しさん:2009/12/06(日) 19:56:45
>>118
C89は除外してるって言ってるじゃん。
議論してるとき相手に原理主義者ってラベルはって、攻撃するやつ多すぎ。

126 :デフォルトの名無しさん:2009/12/06(日) 19:59:05
>>124
じゃあ何なら言い訳?あ、これにレスしなくていいから。↓行ってね
最も美しいプログラミング言語は? Part4
http://pc12.2ch.net/test/read.cgi/tech/1259336620/

127 :デフォルトの名無しさん:2009/12/06(日) 19:59:07
>>123
いや終わってないだろ?


128 :デフォルトの名無しさん:2009/12/06(日) 19:59:46
Cでは関数直下の{} グローバル領域以外の場所での
変数や型の定義は「禁止」されている。
グローバル領域以外の場所での関数の定義も「禁止」されている
(これはC系言語では共通)
制限が緩い言語はそれなりの利点もあるが、リスクもまた持つ。
なんで、あんまし制約の緩さとか厳しさを言語の優劣にすり替
えない方がいいと思うね。自慢しているのは単なるアホなファン
に過ぎないんだけど数は多くて五月蝿くてさ

129 :デフォルトの名無しさん:2009/12/06(日) 19:59:56
>>127
うん。口喧嘩は終わってないみたいだねw

130 :デフォルトの名無しさん:2009/12/06(日) 20:00:01
>>126
隔離スレに誘導すんなカス

131 :デフォルトの名無しさん:2009/12/06(日) 20:01:19
>>130
完全にスレチだもん

132 :デフォルトの名無しさん:2009/12/06(日) 20:02:42
○×刑務所のほうが△○刑務所より規則緩くていいよ〜
なんて自慢しているような話だなw

133 :デフォルトの名無しさん:2009/12/06(日) 20:03:12
じゃあC89こそ至高ってことかね

134 :デフォルトの名無しさん:2009/12/06(日) 20:06:42
>>128
> Cでは関数直下の{} グローバル領域以外の場所での
> 変数や型の定義は「禁止」されている。

これは間違ってるけど、まあいいや。

関数やメソッドのはじめ以外で変数宣言しないのって、
メリットははいよ。

COBOLからCに入ってきて、変数をファイルの最初のほうで
全部グローバル変数で宣言して「こっちのほうがわかりやすい」とか
CからJavaに入ってきて、変数をメソッドの先頭で全部宣言して、
「これのほうがきれいだ」とか、言ってるPGは何度となくみてるけど、
勉強不足すぎ。



135 :デフォルトの名無しさん:2009/12/06(日) 20:06:47
C89以前ならこう、
C99以降ならこうする、

みたいな形で場合わけすればいいと思うよ。


136 :デフォルトの名無しさん:2009/12/06(日) 20:09:28
どの参考書はそんな風に場合分けしてるんだ

137 :デフォルトの名無しさん:2009/12/06(日) 20:10:44
全部グローバル変数で宣言するようなプログラマーはいないと思うけど

138 :デフォルトの名無しさん:2009/12/06(日) 20:11:46
>>135
どちらでも、C89のスタイルがいいって考えの人がいるっぽい。

基本C99のスタイルで、C89のときはしかたなくC89のスタイルだよな。

139 :デフォルトの名無しさん:2009/12/06(日) 20:13:19
C89以前なら 
int i;
for(i = 0; ...) { }

C99以降なら
for(int i= 0; ...) { }

140 :デフォルトの名無しさん:2009/12/06(日) 20:13:29
>>121
どこでそんな話が出てきたんだ?

141 :デフォルトの名無しさん:2009/12/06(日) 20:15:30
自分以外の人が読むことを想定していないからこんなバカがいるんだろうな。
関数のどこかに宣言されている変数を「探させる」なんて、もっとも邪悪な作法だ。

142 :デフォルトの名無しさん:2009/12/06(日) 20:15:48
>>139
だからさー、使い分けじゃないのか?
forループの外で、その変数iを参照したくなったときどうするにだ。

143 :デフォルトの名無しさん:2009/12/06(日) 20:17:00
>>140
C++批判の99%はそうだからw

144 :デフォルトの名無しさん:2009/12/06(日) 20:17:25
>>140
Linus氏の発言じゃないの?

145 :デフォルトの名無しさん:2009/12/06(日) 20:17:35
>>134
禁止されていないのはCじゃない別言語とすら言えるかも
(C言語規格団体がいくら違うと言っても、コアな部分は
動かしようが無い)
文法上の規制が最も厳しい言語の一つであるが故に高い
信頼性があり使われてきた。

146 :デフォルトの名無しさん:2009/12/06(日) 20:18:45
>>141
天才現る。

ここ10年、20年のプログラミング言語の進展にまっこうから反対する意見。

147 :デフォルトの名無しさん:2009/12/06(日) 20:19:10
>>141
貧弱な開発環境でつね。

148 :デフォルトの名無しさん:2009/12/06(日) 20:19:35
>>142
そのfor文の部分を関数にして、
その参照したいカウンタ変数iを戻り値にした方が
余計な変数を増やさないという点でスマートに書けると思う。

149 :デフォルトの名無しさん:2009/12/06(日) 20:21:43
>>145
変数の宣言位置が関数の先頭にまとめられてるから信頼性が高いって
意見ってだれか言ってた?

150 :デフォルトの名無しさん:2009/12/06(日) 20:24:30
>>142
その場合は、iを外にだすなり、フラグを作るなり好きにすれば?

「常にループカウンタをfor()の外に出す」って意見に反論してるのに、
「常にfor()の中に入れるべき」って発言してるかのようにすりかえられて困る。


151 :デフォルトの名無しさん:2009/12/06(日) 20:24:54
だからCっつったらC89もあるんだから
あっちこっちで宣言したい奴はどっか行けって。うん、Javaでいいんじゃない?

152 :デフォルトの名無しさん:2009/12/06(日) 20:26:57
どう見ても味方同士で誤解してつぶしあってる図

153 :デフォルトの名無しさん:2009/12/06(日) 20:27:33
gcc だと -std=c98 になってる?
さっき試したらエラーで怒られた。

-std=c99 にしたら通ったけど。

154 :デフォルトの名無しさん:2009/12/06(日) 20:29:44
c89の間違い

155 :デフォルトの名無しさん:2009/12/06(日) 20:30:27
>>142
func(n){
int e;

for (int i=0;i<n;i++){ 処理
……
e = i;
}

// ループ外で e が有効
}

156 :デフォルトの名無しさん:2009/12/06(日) 20:31:41
>>155
それ無駄じゃね

157 :デフォルトの名無しさん:2009/12/06(日) 20:32:30
>>151
> だからCっつったらC89もあるんだから

そんなこと最初から繰り返し言及されてるだろ。
「for (int i = 0; …はつねにダメ」って言ってるやつはヘボいねって
議論なんだから、それに対しての反論がなくなったってことは、そうだって
ことでいいんだな。


158 :デフォルトの名無しさん:2009/12/06(日) 20:35:27
>>157
常に駄目じゃないけどダメな場合は非常に多い

159 :デフォルトの名無しさん:2009/12/06(日) 20:36:40
>>158
ループを途中で抜けて、iの値を見たいときくらいでしょ。

160 :デフォルトの名無しさん:2009/12/06(日) 20:37:03
当然、他の変数でも使う段階になって宣言してるんだろうな?
ループカウンタだけが例外なんて無様なことしてないよな?


161 :デフォルトの名無しさん:2009/12/06(日) 20:37:14
第一に、C89の時だよ

162 :デフォルトの名無しさん:2009/12/06(日) 20:39:24
二つのforで1つのiを使いまわし

int i;

for(i = 0; i < 32; i++){
何らかの処理
}
for(i = 0; i < 64; i++){
何らかの処理
}
return 0;
}

163 :デフォルトの名無しさん:2009/12/06(日) 20:40:43
>>160
あたりまえだろ。
使う直前で宣言&初期化。
言語の制約とか、処理の流れでそうならないときもあるけど基本は。

164 :デフォルトの名無しさん:2009/12/06(日) 20:40:51
括弧無し for の場合は有効範囲どうなるんだ?

for (int i=0; i<8; i++) ...;



165 :デフォルトの名無しさん:2009/12/06(日) 20:43:13
>>162
ははは、i とか j ってもうカウンタ用の変数っていう暗黙の了解があるから
俺もそんな感じで使っているよ。。

166 :デフォルトの名無しさん:2009/12/06(日) 20:43:36
>>162
それ、いい例? 悪い例?


167 :デフォルトの名無しさん:2009/12/06(日) 20:49:18
変数/型は別に関数定義ブロックと関数定義ブロックの間でも
定義できるんだけどそれを先頭に持っていかないとコンパイラ
が怒ると言う人が居て笑える。
太古のCだと、特にプロトタイプ宣言をしなくとも複数の
関数の相互呼び出しも可能だったが、コンパイラの処理速度が
著しく遅くなる原因として嫌われ、プロトタイプ宣言をしないと
文句を言ってコンパイルを中止するような標準が作られた。
現在のコンパイラはそれに準拠しているものが殆ど。
プログラムを何百のモジュールに分けて分割コンパイルする
開発方法が一般的になった時代と重なってる。
(Cのコンパイルはヘッダファイルを多重に大量に読み込むことが
多いので概して遅い)

168 :デフォルトの名無しさん:2009/12/06(日) 20:49:36
>>162
これって>>159への反論?
タイプ量がちょっと減る以外にメリットが見出せない。

169 :デフォルトの名無しさん:2009/12/06(日) 20:51:26
>>167
少しは要約しろよ

170 :デフォルトの名無しさん:2009/12/06(日) 21:00:33
C89どっぷりのバカは
変数のスコープはなるべく小さくした方がいいとか
考えた事もないんだろうな

171 :デフォルトの名無しさん:2009/12/06(日) 21:02:36
そんなことないよ。C89の主張は全部グローバル変数にすれば良いと言ってるのと同じって主張の方が明らかに狂ってる

172 :デフォルトの名無しさん:2009/12/06(日) 21:03:00
この議論はスコープ問題とは別だ。
変数を「その変数を最初に使う部分」で宣言するかどうかの問題だ。


173 :デフォルトの名無しさん:2009/12/06(日) 21:04:19
そもそも、議論をC89vsC99にするメリットはC99側にはないと思うけど
>>170とか完全にC89バカとか言ってるし、もうねw

174 :デフォルトの名無しさん:2009/12/06(日) 21:06:51
>>173
C89のスタイルがいいと思って、そうでない環境でも
そのスタイルを持ち込んだり、宣伝するやつってすごいデメリット。

175 :デフォルトの名無しさん:2009/12/06(日) 21:08:01
じゃあ市販のCの本の多くはデメリットの塊だな

176 :デフォルトの名無しさん:2009/12/06(日) 21:15:39
そのソースを見た人がどっちだとしても使えるという最大のメリットがあるわな

177 :デフォルトの名無しさん:2009/12/06(日) 21:17:00
>>175
C89前提なら別にいいよ。
無条件にそれが(ほかの環境でも)いいってことになると迷惑。



178 :デフォルトの名無しさん:2009/12/06(日) 21:17:48
>>172
そんなの厳密にやってる奴はいないよ。
ループカウンタのスマート(笑)な使い方を覚えてトクイになってるだけだろ。


179 :デフォルトの名無しさん:2009/12/06(日) 21:19:38
>>177
Cの場合、迷惑だってことはつまりそれはC99前提だってことだろ?
それとも上の方でJavaがどうとか言ってたやつ?

180 :デフォルトの名無しさん:2009/12/06(日) 21:23:43
常識中の常識を知らないやつがいるんで、それを指摘したけど、
トクイになってるようにみえるのか。

まあ、相手が明らかに間違ってる、自分が正しいって議論だから
あいてがムキなってがんばってるのは面白いけどな。

181 :デフォルトの名無しさん:2009/12/06(日) 21:25:12
>>180
最後の二行に必死さを感じるのは俺だけだろうか

182 :デフォルトの名無しさん:2009/12/06(日) 21:26:26
別のやり方を提示しただけで、間違いを指摘したわけではないだろ
なんでトクイになってんのか

183 :デフォルトの名無しさん:2009/12/06(日) 21:28:27
C89の推敲されてないコードのデバッグでは未使用なローカル
変数とか、使用目的が曖昧な変数があると酷く苦痛なことは
事実。その変数がいつ「使用済み」になったのかがわかりにくい
から。

184 :デフォルトの名無しさん:2009/12/06(日) 21:31:19
だからこれはスコープの話じゃないっつってるだろ。
変数を宣言する場所の議論だろ。


185 :デフォルトの名無しさん:2009/12/06(日) 21:32:13
>>179
C99でもC89の書き方がをすべしって書いてる本があったら迷惑だわな。
そんな本あるの?

186 :デフォルトの名無しさん:2009/12/06(日) 21:33:30
Cでは、ブロックの初めだよ

>>185
もとよりC89のスタイルで書いてあるのばっかりだけど?

187 :デフォルトの名無しさん:2009/12/06(日) 21:35:20
>>117
あれはどこに書くかとかそういう問題以前にバグがあるし。


188 :デフォルトの名無しさん:2009/12/06(日) 21:36:47
>>183
書いた本人が推敲すれば良い。逆に言えばそういう状態のコード
のデバッグを引き受けるのが悪い。C89でも推敲すれば
そういう曖昧な変数があっても自然にそうわかるように出来る。

189 :デフォルトの名無しさん:2009/12/06(日) 21:37:56
>>186
それがなにか問題でも?
C89の本なら、C89の書き方になるのは当たり前でしょ?
C99の本でそうなら勘弁してほしいね。


190 :デフォルトの名無しさん:2009/12/06(日) 21:40:13
>>184
ちげーよ

C89, C99どちらのスタイルがいいかっていう議論です。

191 :デフォルトの名無しさん:2009/12/06(日) 21:40:43
C89のスタイルでもC99のコンパイルは通るが逆は出来ない。圧倒的だろ

192 :デフォルトの名無しさん:2009/12/06(日) 21:42:31
C89にこだわってる人って、当然コメントも
// こういうインラインコメント
使ってないよね?


193 :デフォルトの名無しさん:2009/12/06(日) 21:45:18
C99を使ったオープンソース開発
あなたのCコードは標準に合っていますか?

オープンソースのオペレーティング・システムと一緒に配布されている
gccのバージョンにはC99の新しい機能の全てがサポートされているわけではありません。
しかし大部分の機能は既に広く使われるようになっているので、特に効率や
明快さが求められる所では、新しい開発にC99の機能の採用を真剣に考えて
良いのではないかと思います。
http://www.ibm.com/developerworks/jp/linux/library/l-c99/

194 :デフォルトの名無しさん:2009/12/06(日) 21:45:47
>>190 に補足しておくと、C89でC99のスタイルを採用しろって
言ってるわけじゃないからね。
自明のことだと思うけど「C89でどうすんの?」ってカキコが多い。

195 :デフォルトの名無しさん:2009/12/06(日) 21:45:57
>>188
C99とかC++とかの「洗練された」言語では推敲が
怠られることがあるね。スマートに書きやすいと
動作確認した後の手入れとか仕上げみたいな
ソースレベルでの再確認作業が甘くなり
それが禍根を残しやすいというのはあると思う。
野暮ったい書き方しか出来ない(許可されない)
言語の場合は別の理由からかも知れないが
結果的に推敲がなされて信頼性が向上するっての
もあると思う

196 :デフォルトの名無しさん:2009/12/06(日) 21:48:05
enumの定義が最後カンマで終わるのを許してくれなかったりとか、C89は微妙なところで不便なんだよな。

197 :デフォルトの名無しさん:2009/12/06(日) 21:48:48
>>194
完全に普及すれば、C99でもいいんじゃない?

198 :デフォルトの名無しさん:2009/12/06(日) 21:51:19
>>197
そんなこと言うと、C89とかまだ完全に普及してないんでK&Rスタイルでいくしかない。

199 :デフォルトの名無しさん:2009/12/06(日) 21:53:47
よっしゃ、おっちゃんまとめちゃうぞ。

C89スタイルのメリット
・必然的に変数一覧が作成されるため、命名ルールによっては処理内容まで把握できる。
・先頭と決まっているため、保守時に探す必要がない。
・採用例(開発現場、書籍等)が圧倒的に多い。

C99スタイルのメリット
・スコープが宣言時からブロック終了まで、またはループブロック内に制限されるため、未初期化変数の使用を抑止できる。
・使う直前に宣言するため、変数の使用範囲がわかりやすい。
・メモリ節約。

200 :デフォルトの名無しさん:2009/12/06(日) 21:55:41
C99の大きなデメリット

・x86プラットフォームに限って言えば、完全準拠コンパイラは
Intel C++ Compilerしかない
gccですら部分準拠に過ぎない

201 :デフォルトの名無しさん:2009/12/06(日) 22:11:55
>>199
>・必然的に変数一覧が作成されるため、命名ルールによっては処理内容まで把握できる。
>・先頭と決まっているため、保守時に探す必要がない。

これをメリットと考える人はほとんどいないだろう。

>・メモリ節約。

メモリの節約にはなってないと思われ。


202 :デフォルトの名無しさん:2009/12/06(日) 22:13:01
不毛地帯

203 :デフォルトの名無しさん:2009/12/06(日) 22:13:58
僕ちん、もう寝るから
あまり加速しないでね ★

204 :デフォルトの名無しさん:2009/12/06(日) 22:17:09
無毛痴態

205 :デフォルトの名無しさん:2009/12/06(日) 22:18:11
C99やC++やJava使いは、Cの単に推敲が良くされてない
段階のコードを見て(自分の言語で)気に入る形に書き直
すのは勝手だが、わざわざその欠点をあげつらうのは見苦
しいだけ。洗練された言語には無い強さがあるんでCを敢
えて使う人も多い。

206 :デフォルトの名無しさん:2009/12/06(日) 22:22:10
サブルーチンやプログラムの先頭でしか変数を宣言できない言語って、
60年代70年代の言語で、新しい言語(メジャーなやつ)はまったく採用
されてない。
まともな人は、ほとんどメリットを見出してないだろうね。

大昔、BASICのソースがPC雑誌に掲載されていた時代に変数表
って載ってたけど、C89で「変数一覧」とか「探さないでいい」とか思う人は
そのころの発想から進歩してない。


207 :デフォルトの名無しさん:2009/12/06(日) 22:26:24
常に使う直前に確保・初期化したら実行時のペナルティ大きそうだなあ

208 :デフォルトの名無しさん:2009/12/06(日) 22:27:51
じゃなくてC++とかJavaを使えよw

209 :デフォルトの名無しさん:2009/12/06(日) 22:28:27
>>208
C++厨はカエレ

210 :デフォルトの名無しさん:2009/12/06(日) 22:28:40
>>207
関係ないと思うけど、たとえばどういう場合?

211 :デフォルトの名無しさん:2009/12/06(日) 22:28:57
CスレでありながらのC批判って意味不明
C99は免罪符にはならないよ。Cであることに変わりはない
C99も十分時代遅れだ

212 :デフォルトの名無しさん:2009/12/06(日) 22:29:24
あ、それは関係ないよ。
どこに書いてもコンパイル結果は同じになるから。


213 :デフォルトの名無しさん:2009/12/06(日) 22:30:34
>>212 は >>207 宛て。すまんの。

214 :デフォルトの名無しさん:2009/12/06(日) 22:30:36
>>195
そういうことは、リファレクタリングと称して新しい言語のほうがさかんに行われている気がする。
「新しい」はC99とかC++なんかではないよ。少なくともJava以降。

215 :デフォルトの名無しさん:2009/12/06(日) 22:30:52
少なくとも、プリコンパイル時点で確保するのに対し
1サイクルは無駄にする。少なくとも。
変数の確保がメモリ管理と等価であるCでは1サイクルでは終わらないがな

216 :デフォルトの名無しさん:2009/12/06(日) 22:31:09
>>207
シビアな条件の組み込み機器とかにも使われてる理由がわかってないんだよな
自称進化したニュータイプな人はw

217 :デフォルトの名無しさん:2009/12/06(日) 22:32:09
「使う前に」なんぞというから、動的にやってるんだろ?

そうでなきゃ仕様的に許されるどこに書いたって同じなんだから議論の余地はない。

218 :210:2009/12/06(日) 22:32:49
ああ、ループ内で、リソースの確保、開放を繰り返す場合とかあるか。
まあ、原理主義者じゃないからそういう場合は臨機応変に対応すればいい。
実行時のパフォーマンスと、読みやすさを天秤にかけて。

219 :210:2009/12/06(日) 22:34:23
>>217
動的にってわけじゃないよ。
よく言われる「使う直前に宣言&初期化」ってのはソース上のこと。

220 :デフォルトの名無しさん:2009/12/06(日) 22:36:32
C89なら自分こう書いちゃうぞ。
int i;
for (i = 0; i < M; i++)
{
int j;
for (j = 0; j < N; j++)
{
/* …… */

221 :デフォルトの名無しさん:2009/12/06(日) 22:38:51
>>37
むしろ、宣言と同時に値を代入するよりも、コード中の関係ある部分の近くで初期値を代入するのが普通でしょうね。
だいたい、auto 変数の宣言と同時に値を代入することを「初期化」というのでしょうか。

222 :デフォルトの名無しさん:2009/12/06(日) 22:43:09
>>87
>宣言と同時に「初期化」
には反対ですね。使う直前で値を代入すればいいだけで。
そもそもauto変数を「初期化」するという用語はあるのですか?

223 :デフォルトの名無しさん:2009/12/06(日) 22:43:39
コードの中での役割が似てる者は一緒に宣言するよね?
それも個別に宣言するもの?

224 :デフォルトの名無しさん:2009/12/06(日) 22:53:55
>>223
そうですね。一緒に宣言しますね。

そもそもこの話は
int* a;
と書くやからがいること
そして、往々にして
int *a, *b;

int* a, b;
と間違えて書いてしまうことから発したものですが、
C++御大禿げのいうことには、ときどき変なのがありますね。

225 :デフォルトの名無しさん:2009/12/06(日) 22:55:25
>>221-222
auto変数だろうとその他の変数だろうと、規格ではint i = 0;などのように宣言と同時に値を与えるのは初期化ということになっている。
つまり、auto変数を初期化するということも当然存在する。

もちろん、その使用の是非は別として。

226 :デフォルトの名無しさん:2009/12/06(日) 22:56:57
>>225
ふーん、そうなんですね。
初期化と代入の区別はあいまいになってきているんですね。
昔は auto 変数は「初期化」できなかったんですけどね。

227 :デフォルトの名無しさん:2009/12/06(日) 23:02:15
int n = 0; が言語の定義上で初期化と呼ぶか代入と呼ぶかって、
議論の筋と関係ないしな。

228 :デフォルトの名無しさん:2009/12/06(日) 23:12:07
>>206
60-70 年代の言語で新しい言語ってのがよくわからんが
DATA DIVISION. で変数宣言し終えてから PROCEDURE DIVISION. で手続きを書き始める言語は一時期メジャーだったよね

BASIC の掲載記事は大部分が結果オーライで変数表はあまりついておらず、
ただ編集部よりの偉い(偉そうな)人が変数表を作るようアドバイスはしていたようだが
検索が早い貴重な1文字変数を使い回しなんて常套手段だったりしたよね

だったらマシン語使えやと言ってもグローバル癖はもはやパラダイムですらあり渋々変数表作ってた
という立場からは >>207 の言わんとするところが、わからんでもない
いちいち SP 相対で即値を書き込みとかイラついてたし

そんな状況下で K&R C を使ってありがたみを痛感したのがローカル変数の存在なんだが・・・C89?

>>211
C スレだからこそ C に対する批判ができる場だろjk
ここは信者スレではないぞ

229 :デフォルトの名無しさん:2009/12/06(日) 23:13:53
>>228
ここは入門スレなので、哲学問題はよそでやってくれ。

230 :デフォルトの名無しさん:2009/12/06(日) 23:14:16
auto var の場合は初期値入れるのも代入のルーチンだもんな。


231 :デフォルトの名無しさん:2009/12/06(日) 23:14:59
>>227
そうそう、もともとは
int *a;

int* a;
かの話だったんですよね。で、
int* a;
をセンスのある書き方、と主張する輩が沸いてできたのが、笑止というか。

232 :デフォルトの名無しさん:2009/12/06(日) 23:16:15
>>230
そうそう、初期化と代入の差は希薄になってきたんですね、K&R1 の時代からすれば。

233 :デフォルトの名無しさん:2009/12/06(日) 23:18:17
>>228
>60-70 年代の言語で新しい言語ってのがよくわからんが

「新しい言語」はそこにはかかってないよ。


234 :デフォルトの名無しさん:2009/12/06(日) 23:48:18
>>229
じゃあ、じゃあああああ、どこでやれっっちゅううねえんん!!! 鬼気迫る勢いで

235 :デフォルトの名無しさん:2009/12/06(日) 23:49:51
C99の信者スレじゃんw

236 :デフォルトの名無しさん:2009/12/06(日) 23:56:33
だからそういうスレ立てろっての。OOP厨もろともな。

237 :デフォルトの名無しさん:2009/12/06(日) 23:57:41
>>235
うそでしょ?どちらかというと C89信者の方が多いのではありませんか?

238 :デフォルトの名無しさん:2009/12/06(日) 23:59:13
>>237
ビンゴ

239 :デフォルトの名無しさん:2009/12/07(月) 00:02:06
>>207
むしろ、条件によっては使わないかもしれない変数を確保して初期化するコストを考えるべきでは?

240 :デフォルトの名無しさん:2009/12/07(月) 00:11:21
>>229
C の持つ独特の「哲学」を学ぶことは、十分に「入門」の領域に含まれると思うぞ

char a[10];
a = "foo";

241 :デフォルトの名無しさん:2009/12/07(月) 00:13:57
明らかな間違いを見せて、どうしようってんだ?

242 :デフォルトの名無しさん:2009/12/07(月) 00:15:13
初期化と代入の違いを見せようとしてるんだろう

243 :デフォルトの名無しさん:2009/12/07(月) 00:19:39
別にC89でも{}で囲んでブロック作ればいいだけで、
割と好きなところで変数宣言できたけどなぁ
ちょっとしたテストでmainだけで済ますときとかやってたよ

int main(arg[]){
//処理1
{int i;
 ・・・
 }
//処理2
{int i;
・・・
 }
}//end of main

とか

244 :デフォルトの名無しさん:2009/12/07(月) 00:29:04
>>243
そうですよね。
その気になれば、使う直前で宣言するように書くことだって可能だし、宣言しておいて直前に「初期化」すれば済む話だし。
そもそも、>>22 が int* a; まんせー、int *a; はセンスがない、ってほざいたのが、話の発端だったのです。

245 :デフォルトの名無しさん:2009/12/07(月) 00:31:23
*を型にくっつける派が変数の宣言は一行に一つとか言い出したからだな。

246 :デフォルトの名無しさん:2009/12/07(月) 00:33:47
いや、可能であることと、そのスタイルで書くことは違うだろ。

247 :デフォルトの名無しさん:2009/12/07(月) 00:36:56
>>245
そうそう、彼らは、宣言と一緒いちいち初期かも行うそうで。そんなことは、そうそう、あることじゃないし、使う直前に代入すればすむこと。
そもそも彼らは初期化と代入の区別もつかない、いや、これは、最近は区別が希薄になっていることは認めます。

248 :デフォルトの名無しさん:2009/12/07(月) 00:39:17
>>22,37に対する反論として>>38がループを持ち出したのが発端


249 :デフォルトの名無しさん:2009/12/07(月) 00:43:29
>>248
いや、for(int i = 0; ... ) の話ではなかったか。
まあ >>22 int* マンセー派にセンスがないことはよくわかりました。禿げのいうことを妄信してはいけないですね。

250 :デフォルトの名無しさん:2009/12/07(月) 00:49:23
もうまとめか

251 :デフォルトの名無しさん:2009/12/07(月) 00:51:46
>>249
そのセンスのないint* マンセー派がfor(int i=0;が絶対だって主張したってことなんだが。

252 :デフォルトの名無しさん:2009/12/07(月) 00:52:58
典型的な自称上級者だったってことか

253 :デフォルトの名無しさん:2009/12/07(月) 01:11:41
どうせ未初期化の変数の値を読み出そうとしたら警告になるから、
必ず初期化することにこだわる必要はないよね。

254 :デフォルトの名無しさん:2009/12/07(月) 01:23:25
>>253
いやいや >>22 int* マンセーは、宣言と同時に「初期化」するのが普通、って主張していたんですよ、確か。
まとめて、int a, b, c, d, x, y, z; と書くのはセンスがないそうで。
だいたい彼らは初期化と代入の区別もついていないようですね。


255 :デフォルトの名無しさん:2009/12/07(月) 01:26:35
>>231
逆だ逆

256 :デフォルトの名無しさん:2009/12/07(月) 01:30:23
>>254
話を理解してない馬鹿

257 :デフォルトの名無しさん:2009/12/07(月) 01:42:04
>>255
え? int* a; のほうがセンスがあるのですか?信じられないなあ。

>>256
ご説明いただきましょうか。

258 :デフォルトの名無しさん:2009/12/07(月) 01:47:44
>>257
話を理解してない馬鹿

259 :デフォルトの名無しさん:2009/12/07(月) 01:49:31
馬鹿を理解してない話

260 :デフォルトの名無しさん:2009/12/07(月) 02:08:42
>>258
説明できないダボ

261 :デフォルトの名無しさん:2009/12/07(月) 02:16:53
なんでint* aだめなん

262 :デフォルトの名無しさん:2009/12/07(月) 02:17:44
センスないから

263 :デフォルトの名無しさん:2009/12/07(月) 02:21:49
実用上デメリットは無いの?
個人的に気に入らないってだけ?

264 :デフォルトの名無しさん:2009/12/07(月) 02:27:58
>>261
別にダメってわけじゃない。許されてるんだから使いたければ使うよろし。
ただし、厳密には「iniへのポインタ型」ではなく「int型へのポインタ」である。

型 変数名

という宣言の文法に倣えばint* aはおかしいってのを理解できてれば。

265 :デフォルトの名無しさん:2009/12/07(月) 02:33:11
>>263
int *a, *b;
という意味を表現したいにもかかわらず、
int* a, b;
とかいてしまった、
ということがなければ、べつにどっちでもいいんです。わかっておれば。

ただし、>>22, >>37 のような言い分はかなりおかしい。

266 :デフォルトの名無しさん:2009/12/07(月) 02:37:56
そんなことよりdim[i] と i[dim]はどっちがクールか決めようぜ

267 :デフォルトの名無しさん:2009/12/07(月) 02:42:46
先頭に*がついた変数名は*を取るとポインタとして機能する
みたいな中途半端な仕様はどうも好きになれない。

268 :デフォルトの名無しさん:2009/12/07(月) 02:52:18
>>266
甘いお菓子しか食べられないお子様は黙ってろw

269 :デフォルトの名無しさん:2009/12/07(月) 03:05:07
Cの仕様はそこかしこで洗練されてないからしょうがない


270 :デフォルトの名無しさん:2009/12/07(月) 03:12:57
int* func(void);
int *func(void);

271 :デフォルトの名無しさん:2009/12/07(月) 04:51:56
int * const a;

272 :デフォルトの名無しさん:2009/12/07(月) 05:32:20
コーディング規約なんてソース中統一しててくれればなんでもいい
その上でみんなはどう?って質問なのに

あれはカスこれはハイセンスとか言って煽っちゃう低脳


273 :デフォルトの名無しさん:2009/12/07(月) 07:39:45
既約も糞もあるかよ。コーディング既約なんてのはCにあるという
考え方自体がおかしいんだよC的には。
文法がコーディング既約でそれ以上の既約は無い。
要するに、意味深な記号が多用されるから、括弧を付けて、
どれがどれにかかってるのかわかるように書いたほうがいいぞ
という話だろ

int* func(void)
という目糞な書き方よりか
int *func(void)のほうが鼻糞だが
int (*func)(void)のほうが「正しい」
え?コンパイル通らないって?
それはそのコンパイラ制作者がタコなんだよ

274 :デフォルトの名無しさん:2009/12/07(月) 07:39:52
>>272
自己紹介乙

275 :デフォルトの名無しさん:2009/12/07(月) 07:44:06
関数ポインタという海坊主が出てきた

276 :デフォルトの名無しさん:2009/12/07(月) 09:05:58
ボケなのかバカなのか微妙なのが多いな。>>273とか

277 :デフォルトの名無しさん:2009/12/07(月) 09:11:57
前スレでも似たようなこと書いてたから、本人としては面白いとでも思ってんじゃねーの

278 :デフォルトの名無しさん:2009/12/07(月) 09:14:25
んなまさか

279 :デフォルトの名無しさん:2009/12/07(月) 09:19:24
微妙なのが多いと言うか、微妙じゃない奴が一人でもいるようには思えないが

280 :デフォルトの名無しさん:2009/12/07(月) 10:52:30
>>267
俺は逆に
「*をつけた変数の値をアドレスとしてメモリを参照する」と解釈してから
割とスムーズ。

281 : [―{}@{}@{}-] デフォルトの名無しさん:2009/12/07(月) 11:15:22
質問抜粋
・自分の解答を、どのように修正すればよいか?
・部品ごと? に分けて作るやり方でよいか?
・↑の考え方はオブジェクト指向?

<以下本文>
 今、苦Cとcodepadにて勉強中のものでポインタの所で四苦八苦して飽き始めたため、
他サイトにて練習問題で遊んでいます。

今、挑戦中のは
http://www.geocities.jp/rabenschwarz_ritter/Creidai/reidai2.html
で、自分が作った解答は次に書き込みます。
解答を見た瞬間、あまりの簡素さと自分の解答のごちゃごちゃっぷりに笑ってしまいました。
自分が作った解答をいろいろ修正しましたが、コンパイルできずに困っています。
どのように修正すれば、うまくコンパイルできるでしょうか?
また、自分は一つの中にごちゃごちゃとまとまっていると、頭の中が混乱してしまうので、
グローバル関数かstatic関数を使って機能ごとに分けて作ろうと考えたのですが、この作り方を
いい傾向でしょうか? それとも悪い傾向でしょうか?
またにわか知識で、この考え方がオブジェクト指向? と思ったのですがこれは正しいでしょうか?

282 : [―{}@{}@{}-] デフォルトの名無しさん:2009/12/07(月) 11:20:56
#include<stdio.h>

int x,y,z;
int nyu(void);
int tas(int,int);

int main()
{
nyu(void);
hikaku(x,y);
printf("数値X=%dから数値Y=%dまで足した数値は、%dです。",x,y,z);
return 0;
}

283 : [―{}@{}@{}-] デフォルトの名無しさん:2009/12/07(月) 11:21:46

int nyu(void)
{
do{
printf("XからYまでの整数を足した数字を表示します。\nX > Yの時は再入力します。\n開始値Xを入力してください\nX = ");
x = 10;//scanf代用
printf("%d\n",x);//scanf代用
printf("終了値Yを入力してください。\nY = ");
y = 10;//scanf代用
printf("%d\n",x);//scanf代用
} while (x < y);
tas(x,y);
return z;
}

int tas(int x,int y)
{
for (;x <= y;x++)
{
z = z + x;
}
return z;
}

284 : [―{}@{}@{}-] デフォルトの名無しさん:2009/12/07(月) 11:23:14
アドレスおよびエラーメッセージです。
http://codepad.org/A2GOlpsq

1 In function 'main':
2 Line 9: error: expected expression before 'void'
3 Line 9: error: too many arguments to function 'nyu'


285 :デフォルトの名無しさん:2009/12/07(月) 11:43:15
>>281
1.エラーメッセージに9行目がおかしいって出てるよ。英語がわからないなら辞書を引くといいよ。
2.オブジェクト指向ではないね。「構造化プログラミング」でググるといいよ。

286 : [―{}@{}@{}-] デフォルトの名無しさん:2009/12/07(月) 11:43:53
すいません。>282にあるhikakuの一行は削除でお願いします。
最初は、入力→比較→結果と作ろうとしていた名残です。
また、現在入力部をmainの中に入れることでコンパイルはできるようになりました。
一部修正したところ、何とか希望通りの結果を得ることができました。

http://codepad.org/6a4jrjyK

そのため>281の質問一番目は、どうすればコンパイルできるか? を、なぜ失敗したか?
に変更します。連レス失礼しました。

287 :デフォルトの名無しさん:2009/12/07(月) 11:46:05
>>273
型定義と初期化を同時に行うことが出来るというシンタックスシュガー
が無ければ、コンテクストで十分に区別出来る。
逆に言えば、型定義と初期化を同時に行うことが許可される
コンパイラの文法レベル(非常時用簡潔表現の許容)では、
禁止されるべきかもしれない。

288 : [―{}@{}@{}-] デフォルトの名無しさん:2009/12/07(月) 11:49:42
>>285
ありがとうございます。
自分も9行目のエラーから、voidを削ってみたり(x,y)に変えたりと、にらめっこしながら
いろいろ修正してたのですが、どこが原因でエラーが起きているのかわかりませんでした。

構造化プログラミングですね。早速ググって、色々と読んでみます。

289 :デフォルトの名無しさん:2009/12/07(月) 11:52:19
>>287
int hoge(int x);
int (*func)(int)=hoge;
のように型定義と変数宣言と初期化を同時に行うことが出来る
文法は非常時用文法ということ?

290 :デフォルトの名無しさん:2009/12/07(月) 11:55:36
このスレ的に苦Cってどうなの?

291 :デフォルトの名無しさん:2009/12/07(月) 12:52:24
>>290
今ちょっとだけ見てきたけど、悪くないね。
最初に HelloWorld から始めないのも好感触。


292 :デフォルトの名無しさん:2009/12/07(月) 13:47:46
このスレ的にマナやさCはどうなの?

293 :デフォルトの名無しさん:2009/12/07(月) 13:58:48
>>292
3回抜いた

294 :デフォルトの名無しさん:2009/12/07(月) 14:00:11
>>290
可もなく不可もなくだな
俺のほうがもっと良い物作れる自信はある。

295 :デフォルトの名無しさん:2009/12/07(月) 14:01:13
>>294がもっといいものを作ってくれるようです

296 :デフォルトの名無しさん:2009/12/07(月) 14:19:29
>>290
若干ツンデレっぽいところが好感触
しかし偏屈そうな管理人だなw

297 :デフォルトの名無しさん:2009/12/07(月) 14:36:57
>>294逃げるなよな

298 :デフォルトの名無しさん:2009/12/07(月) 15:44:45
このコードをもっと効率良くというか、スマートになりませんか?

// deg を -180 以上 180 未満の範囲に正規化する
float deg_normalize(float deg)
{
 while (deg < -180.0f) deg += 360.0f;
 while (deg >= 180.0f) deg -= 360.0f;
 return deg;
}


299 :デフォルトの名無しさん:2009/12/07(月) 15:55:17
deg→rad かけて atan2(sin(rad),cos(rad)) を deg に戻すのも値域があわないか…

300 :デフォルトの名無しさん:2009/12/07(月) 16:26:23
>>298
fmod を使うと少しマシになる

301 :デフォルトの名無しさん:2009/12/07(月) 16:27:33
floor関数と dn(t)とdn(-t)の間の関係を使う。
ただしdegの絶対値が大きい時の精度保証無し

302 :デフォルトの名無しさん:2009/12/07(月) 16:36:27
float deg_norm(float deg)
{
if(deg>0){
if(deg>180){
deg-=360;
if(deg>0) deg = deg_norm(deg);
}
}else{
deg*=-1;
deg = deg_norm(deg);
deg*=-1;
}
return deg;
}

なんという変態^p^
あれほど意味の無い再帰はやめろと

303 :デフォルトの名無しさん:2009/12/07(月) 20:09:19
配列から同一要素を取り除く関数を書いたところ以下のようになりました
内側のループがトリッキーに感じるのでなおしたいのですがもう少し単純明快な書き方はありませんか?
int unique(T array[], int size) {
for ( i=0; i<size; i++ )
for ( j=i; j<size; )
if ( array[j] == array[i] ) {
delete_and_shift(array, j);
size--;
} else {
j++;
}
return size;
}


304 :デフォルトの名無しさん:2009/12/07(月) 20:20:42
vector unique
つかえよ

305 :デフォルトの名無しさん:2009/12/07(月) 20:21:18
えっ?

306 :デフォルトの名無しさん:2009/12/07(月) 20:23:53
>304
逝ってよし

307 :303:2009/12/07(月) 21:19:04
>>304
visual studioのuniqueは下のようになっていて余計にややこしいです
というか連続しない同一要素は取り除いてくれないようなので参考になりませんでした
勉強にはなりましたが・・・

int f = 0, b;
int l = size+1;
while ( ( b = f ) != l && ++f != l )
if ( array[b] == array[f] )
{
while ( ++f != l )
if ( !( array[b] == array[f] ) )
array[++b] = array[f];
return ++b;
}
return l;

308 :デフォルトの名無しさん:2009/12/07(月) 21:22:19
>>307
順序を保持しなくていいなら先にソートしておくとか

309 :デフォルトの名無しさん:2009/12/07(月) 21:26:03
STL使えんなら該当スレに行けば

310 :303:2009/12/07(月) 21:39:33
>>307
そうですね
良くありそうな関数だと思ったので何か見落としているんじゃないかという
気がしていたのですがソートしておくのが分かりやすい気がしてきました
>>308
使えるなら質問する必要も無かったんですが・・・
失礼しました



311 :デフォルトの名無しさん:2009/12/07(月) 21:41:26
宿題でないなら、STLつかえよ。
順番記録しておいてソートしてユニークして、元の順番でソートすればいい。
5行でかけるだろ。
しかも安全。

312 :デフォルトの名無しさん:2009/12/07(月) 21:49:33
Cpp厨がまだいる。。

313 :デフォルトの名無しさん:2009/12/07(月) 22:10:18
スレ違かもしれませんが。
iPoneの加速とか傾きのステータスをOSSを使って自分の作ったプログラム(Cで作成)に送りたいのですが可能ですか?
ライブラリと参考サイトを教えていただきたいです。

314 :デフォルトの名無しさん:2009/12/07(月) 22:27:21
>>313
その辺の話題は答えられる知識を持った人がこのスレにいないので無駄です。
一応C入門スレですので^^

315 :デフォルトの名無しさん:2009/12/07(月) 22:28:28
気象観測のシステムなら経験あるけど。

316 :デフォルトの名無しさん:2009/12/07(月) 22:29:42
何なの、アイポンって。
俺プログラミングには超詳しいけど、SONY製品しか買わないから知らないぞ

317 :デフォルトの名無しさん:2009/12/07(月) 22:31:46
俺のログにはあいぽんは無いな

318 :デフォルトの名無しさん:2009/12/07(月) 22:36:42
C++ ソースファイルの拡張子は
hoge.C
だろ。

319 :デフォルトの名無しさん:2009/12/07(月) 22:37:53
空気読めよクソ野郎

320 :デフォルトの名無しさん:2009/12/07(月) 22:37:56
ごめ、誤爆

321 :313:2009/12/07(月) 22:39:43
返信ありがとうございます。
他のスレ探したほうがいいみたいですね。
C関連のスレ探してみます。

322 :デフォルトの名無しさん:2009/12/07(月) 22:39:52
許さんよ
絶対に

323 :デフォルトの名無しさん:2009/12/07(月) 22:44:34
なんでもそうなのだが、傾き検知の場合センサーがある

そのセンサーがコントローラに繋がっている場合(それ以外ないのだが)
結果をコントローラ上のレジスタアドレスに格納する
それを参照すればよい。

この考えは、すべてにおいて同じ。


あるデバイスがある
デバイスがマイクロコントローラ制御なら、その結果を格納する場所が必ずある
それを参照する

マイコン制御じゃなかった時代は、電気的に判断していたから
回路が分からないとどうしようもなかったものだが
マイコン制御ならプログラムはどうしても必要になるので
プログラムが分かれば誰でもわかるようになっている。
ただ、どこのレジスタなのか どこに何のアドレスがアサインされているか
は、別途調べなければならない。

324 :デフォルトの名無しさん:2009/12/07(月) 22:50:08
傾きセンサー、加速度センサーのアドレスが、例えば

0xEFFFF800
0xEFFFFA00

こう割り振られていると分かったら、そこにアクセスすれば値が手に入るだけだ。
簡単だろう

傾きは、キャリブレーション位置からの傾きが値として入ることが多いので簡単だが
加速度の場合、キャリブレーション位置とかは関係がない。ある方向に動きさえすれば
元々どちら側に向いていようとも加速度が得られるからだ。

こういうのは、ちゃんとプログラマーが考慮して処理を書かないと加速度の値を得たことにならない。
単にその時間で何かの値が得られただけに過ぎなくなるので「加速」ではなくなる。

325 :デフォルトの名無しさん:2009/12/07(月) 22:53:39
具体的にどうするんですか?
そんなくだらない話なんていらないんです。

326 :デフォルトの名無しさん:2009/12/07(月) 22:55:42
つまりAPIリファレンス嫁ってこと

327 :デフォルトの名無しさん:2009/12/07(月) 23:00:29
わからないのにダラダラ講釈たれてたんですか?

328 :デフォルトの名無しさん:2009/12/07(月) 23:01:29
それは俺じゃないが

329 :デフォルトの名無しさん:2009/12/07(月) 23:03:41
質問者に成りすましている暇人がいるから気をつけろ

330 :デフォルトの名無しさん:2009/12/07(月) 23:05:15
気をつけるのは知ったかぶる側だよね。

331 :デフォルトの名無しさん:2009/12/07(月) 23:07:37
right、その通り。よく気がついたね

332 :デフォルトの名無しさん:2009/12/07(月) 23:10:49
分からないと言いがかりをつけるチョンっているよな

そりゃお前の頭が悪いだけだ
っていうw

333 :デフォルトの名無しさん:2009/12/07(月) 23:12:49
質問に答えられないのに威張る奴ってなんなの?

334 :デフォルトの名無しさん:2009/12/07(月) 23:13:27
まずiPhone上で動くプログラムを作るのに使える言語は基本的にObjective-Cだけだから、そこはこのスレの対象外。
iPhone内のプログラムと他のコンピュータとの通信はインターネットを介すだけ。
まあ「だけ」という一言で言えるほど単純ではないけど。

335 :デフォルトの名無しさん:2009/12/07(月) 23:14:09
普段ならスルーされる話題なのに>>314の書き込み見て本気出してるお前らカッコヨスw

336 :デフォルトの名無しさん:2009/12/07(月) 23:15:52
質問者に成り済ましてんのいつものC++厨だろ。まじうぜぇ…

337 :デフォルトの名無しさん:2009/12/07(月) 23:16:08
>>333
それが俺が俺である証

338 :デフォルトの名無しさん:2009/12/07(月) 23:17:54
くたばれよ

339 :デフォルトの名無しさん:2009/12/07(月) 23:24:18
またCしかできないやつが見えない敵と戦ってるよ。
雰囲気悪くなるから、脳内でやればいいのに。

340 :デフォルトの名無しさん:2009/12/07(月) 23:25:36
>>339
うるさい!黙れCPP厨!ファビョーン

341 :デフォルトの名無しさん:2009/12/07(月) 23:29:02
Smalltalkくずれw

342 :デフォルトの名無しさん:2009/12/07(月) 23:29:29
某OOP言語開発者が
C++批判していたから、その酷さについては間違いないんだろうな。

343 :デフォルトの名無しさん:2009/12/07(月) 23:33:14
実は、この5つすべて(Python, Java, C/C++, Perl, LISP)を勉強しておくのがいちばんいいのです。
これらはもっとも重要なハッキング用言語だというだけでなく、
それぞれプログラミングに対してまったく違ったアプローチをしているので、どれも非常に有益な勉強となるでしょう。

344 :デフォルトの名無しさん:2009/12/07(月) 23:34:47
メモリmapped IO じゃなかったら違うんじゃねーの?

345 :デフォルトの名無しさん:2009/12/07(月) 23:35:02
>>339
おい!おまえの脳内止まってるぞ!

346 :デフォルトの名無しさん:2009/12/07(月) 23:37:39
某: プログラミング言語は、それを使う人が何を考えることができるのかを決めてしまう

>5つすべて

すべて・・・ね

347 :デフォルトの名無しさん:2009/12/07(月) 23:38:27
>>339
>>304
>>318

348 :デフォルトの名無しさん:2009/12/07(月) 23:41:48
つーかさ、質問者がCの質問しているのにC++に話を持って行くヤツが一番困ると思うのだが。

349 :デフォルトの名無しさん:2009/12/07(月) 23:43:49
>>343
Python, Java, C, Perl, LISP

5つ全ておkです(^^

350 :デフォルトの名無しさん:2009/12/07(月) 23:49:19
質問者が最初っからCpp臭かった件

351 :デフォルトの名無しさん:2009/12/07(月) 23:53:32
>>350
やっぱり妄想癖があるんだね、cpp厨は...

352 :デフォルトの名無しさん:2009/12/07(月) 23:55:29
cpp厨は想像力豊かだな!プログラマにぴったりだ!

353 :デフォルトの名無しさん:2009/12/07(月) 23:57:32
でも頭は硬いようだぞ

354 :デフォルトの名無しさん:2009/12/08(火) 00:00:57
僕は自分で言うくらいのC厨だけど
"Cpp厨"見るとCプリプロセッサ厨に見えるから
Cxx厨かC++厨にしてくれない

ほんとこのスレは言語以外の話が多いな

355 :デフォルトの名無しさん:2009/12/08(火) 00:03:45
宿題は宿題スレがあるから

356 :デフォルトの名無しさん:2009/12/08(火) 00:14:23
初心者、初級者もよそへ逝けと >>1 で言ってるしな
与太話くらいしかすることねーべ

357 :デフォルトの名無しさん:2009/12/08(火) 00:16:01
だからここは入門者の戯言スレなんだよ

358 :デフォルトの名無しさん:2009/12/08(火) 00:17:55
自称上級者様は速やかにご退場願います

359 :デフォルトの名無しさん:2009/12/08(火) 00:26:05
では、入門者の戯言を聞かせてもらおうか
以下の二つの変数fooとbarについて、それぞれの型をスカラ(intなどの基本型)と型修飾子およびポインタ宣言子を用いた表現に直してみてください

typedef int *ip_t;
typedef int const *icp_t;

const ip_t foo;
icp_t bar;

360 :デフォルトの名無しさん:2009/12/08(火) 00:28:26
クイズスレじゃねえよw

361 :デフォルトの名無しさん:2009/12/08(火) 00:34:05
マホステ *const foo;
マホステ const* bar;

362 :デフォルトの名無しさん:2009/12/08(火) 00:58:33
>>350
cppっぽくてもCで答えるくらいの力量はないのか?

363 :デフォルトの名無しさん:2009/12/08(火) 07:46:09
あるだろjk

364 :デフォルトの名無しさん:2009/12/08(火) 09:46:45
>>303
ループ対象の変数をいじるのは何かとバグになりやすい
空の配列を作って、重複しないものをそれに追加するアルゴリズムの方がいいと思う

365 :デフォルトの名無しさん:2009/12/08(火) 11:47:22
>>303
単純かどうかわからないが、こういう書き方はどうよ?
int unique(T array[], int size) {
int i, j, k;

for(i=j=1; i<size; i++) {
for(k=0; k<j; k++) if(array[j]==array[k]) break;
if(k==j) array[j++] = array[i];
}

return j;
}

366 :デフォルトの名無しさん:2009/12/08(火) 11:50:13
>for(k=0; k<j; k++) if(array[j]==array[k]) break;
じゃなくて
for(k=0; k<j; k++) if(array[i]==array[k]) break;
だった

367 :デフォルトの名無しさん:2009/12/08(火) 13:20:28
[課題]
年(西暦)と月を入力すると
その月のカレンダーを出力するプログラムを作成せよ.

<出力例>
年(西暦)を入力してください : 2010[Enter]
月を入力してください : 1[Enter]
2010年 1月
日 月 火 水 木 金 土
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31


どうやったらいいーか分かる人いますか?

368 :デフォルトの名無しさん:2009/12/08(火) 13:27:15
>>367
ちょっと待っててくれ。>>365が答えるからさ。

369 :デフォルトの名無しさん:2009/12/08(火) 13:27:49
system("cal");

370 :デフォルトの名無しさん:2009/12/08(火) 13:46:49
わかる人はいる

371 :デフォルトの名無しさん:2009/12/08(火) 14:35:48
#include <stdio.h>
main() {
int year, month;
printf("年(西暦)を入力してください : ");
scanf("%d", &year);
printf("月を入力してください : ");
scanf("%d", &month);
printf("2010年 1月");
printf("日 月 火 水 木 金 土");
printf("1 2");
printf("3 4 5 6 7 8 9");
printf("10 11 12 13 14 15 16");
printf("17 18 19 20 21 22 23");
printf("24 25 26 27 28 29 30");
printf("31");
}

372 :通りすがりの草:2009/12/08(火) 14:47:05
#include<stdio.h>
int main(int argc,char *argv[])
{
float year, month, day = 1, buf1, buf2;
int weekf, month2, year2, key = 0, buf3, daymax;
if(argc != 3){
printf("Usage: cal yyyy mm\n");
return(0);
}
year = atoi(argv[1]);
month = atoi(argv[2]);
if(month < 4){
year2 = year--;
month = month + 13;
month2 = month - 13;
}else{
month2 = month++;
year2 = year;
}

373 :通りすがりの草:2009/12/08(火) 14:47:49
buf1 = ((year * 365.25)+(month * 30.6)+(year / 400)-(year / 100)+1-429);
buf2 = (((int)buf1 / 7) * 7);
weekf = buf1 - buf2 + 1;
printf("西暦%d年%d月\n月 火 水 木 金 土 日\n",year2,month2);
for(key = 1; key < weekf; ++key){
printf(" ");
}
if(month2 == 1 || month2 == 3 || month2 == 5 || month2 == 7 || month2 == 8 || month2 == 10 || month2 == 12){
daymax = 31;
}else if(month2 == 4 || month2 == 6 || month2 == 9 || month2 == 11){
daymax = 30;
}else{
daymax = 28;
}

374 :通りすがりの草:2009/12/08(火) 14:49:17
for(buf3 =1; buf3 <= daymax; ++buf3,++weekf){
printf("%2d ",buf3);
if(0 == weekf % 7){
printf("\n");
}
}
if(month2 == 2 && (((0 == year2 % 4)&& (0 != year2 % 100)) || (0 == year2 % 400))){
printf("29 ");
}
return(1);
}

375 :通りすがりの草:2009/12/08(火) 14:50:30
今の会社に入社した当時、Cを覚え始めてから3日目で書いたソースです。
テラナツカシス。

376 :デフォルトの名無しさん:2009/12/08(火) 15:14:00
float...?

377 :デフォルトの名無しさん:2009/12/08(火) 15:18:35
>>375
すげー
三日目でそこまで書けるようになるのか

自分だったら

一日目 hello world
二日目 変数
三日目 scanf

くらいまでだわ

378 :通りすがりの草:2009/12/08(火) 15:23:51
>>377
ベンチャーという名のブラック会社なもので…。
クビがかかると人間強いな。
カーニハン参考にして勉強したんだが、訳がゴミ過ぎて
訳者に切れそうになった覚えがある。

>>376
intを無理やりfloatにキャストして小数点以下切捨てしているのです。
ttp://www.h2.dion.ne.jp/~p_soul/jchieyoubi.htm
これ分かりやすいよ。



379 :デフォルトの名無しさん:2009/12/08(火) 15:26:53
カーニハンとかマジウンコだし
バイブルとかバカじゃねーのwwww信者きめぇ

380 :通りすがりの草:2009/12/08(火) 15:34:11
カーニハンの言ってること正しいんだけど、石田晴久が分かりにくくしてる。
もったいないなぁ。

381 :通りすがりの草:2009/12/08(火) 15:35:05
カーニハンのいってることは正しいんだが、
石田晴久が分かりにくくしてるんだよな…。
もったいない。

382 :通りすがりの草:2009/12/08(火) 15:36:10
すまん、更新できてないかと思った。

383 :デフォルトの名無しさん:2009/12/08(火) 15:45:39
曜日計算なんていう正確な答えの必要な処理に誤差入りの浮動小数点数を使うなんて怖くてできないチキンな俺様
month * 30.6 なんてそんな恐ろしい・・・

384 :デフォルトの名無しさん:2009/12/08(火) 16:12:02
閏年がらみの挿入を分岐して判断するか 浮動小数点で演算するか

閏秒の積み上げとか考えると頭いたいのう

385 :通りすがりの草:2009/12/08(火) 16:39:00
まぁ、課題ならこれでいいんじゃない?

386 :デフォルトの名無しさん:2009/12/08(火) 17:48:32
>>383
答えはわかってんだから、結果が正しいかどうか確認してから組み込めばいいんじゃね?
え?400年後に誤差が出た?そんなんサポート外に決まってんだろ。

>>384
閏秒はいつ入るか予測できないので事前に対応するのは不可能。

387 :デフォルトの名無しさん:2009/12/08(火) 17:52:44
どうせパソコンの時計なんて誤差ありまくるんだから、タイムサーバであわせればOK

388 :デフォルトの名無しさん:2009/12/08(火) 18:05:00
>>387
おぬしの発想は単純だのう

389 :デフォルトの名無しさん:2009/12/08(火) 18:07:21
出来損ないOS、ファッキントッシュがまさにそれ

あれ、NTPしかねえもん
リアルタイムクロックを見ていない。

390 :デフォルトの名無しさん:2009/12/08(火) 18:15:00
指定バイト数画面に出力って関数ないんですか

391 :デフォルトの名無しさん:2009/12/08(火) 18:16:05
Cというより西暦とか閏の知識を問う問題なキガス

392 :デフォルトの名無しさん:2009/12/08(火) 18:16:05
>>390
意味がよく分からないけど printf

393 :デフォルトの名無しさん:2009/12/08(火) 18:19:29
printfはeofまでジャン

394 :デフォルトの名無しさん:2009/12/08(火) 18:26:25
Cの知識でやるなら、
time.hをインクルードしてasctimeに丸投げ

395 :デフォルトの名無しさん:2009/12/08(火) 18:28:41
>>390
fwrite

396 :デフォルトの名無しさん:2009/12/08(火) 18:43:26
>>393
そんな不思議な printf は知らんぞ

397 :デフォルトの名無しさん:2009/12/08(火) 18:48:38
世の中には僕らの知らない不思議なことがまだまだある

398 :デフォルトの名無しさん:2009/12/08(火) 18:50:32
構造体を使ってファイル内容を読み取ることはできないの?

399 :デフォルトの名無しさん:2009/12/08(火) 18:52:29
できる

400 :デフォルトの名無しさん:2009/12/08(火) 18:53:05
できる、しかし、やらない方が良い

401 :デフォルトの名無しさん:2009/12/08(火) 18:56:06
やらない方が良いのはなぜ?

402 :デフォルトの名無しさん:2009/12/08(火) 19:00:08
構造体の大きさやメンバの配置、エンディアンなどが処理系によって異なるため移植性に乏しい

403 :デフォルトの名無しさん:2009/12/08(火) 19:06:53
>>398
FILE は構造体だろ。


404 :デフォルトの名無しさん:2009/12/08(火) 19:10:11

そういうことじゃない。

405 :デフォルトの名無しさん:2009/12/08(火) 19:14:52
いろいろな例があるサイトないですか?

406 :デフォルトの名無しさん:2009/12/08(火) 19:16:03
Cは動的型判定機構に乏しいからシリアライズめんどいよな

407 :デフォルトの名無しさん:2009/12/08(火) 19:20:41
printf("%s","\0xA082"); //Shift-JIS
のようなイメージで2バイト文字を文字コードから表示させたいのですがどうしたらよいでしょうか?

あとWindows標準でついている文字コード表でみると"あ"は82A0とかかれてるのですがどっちが正しいのでしょうか?


408 :デフォルトの名無しさん:2009/12/08(火) 19:21:53
恒三体って役に立つのですか。

食うメモリの量ばっかり増えて
やれることは独立して宣言した変数と同じなのではないですか。

409 :デフォルトの名無しさん:2009/12/08(火) 20:01:21
#include <ncurses.h>
#include <locale.h>
int main(void){
setlocale(LC_ALL,"");
int c;
initscr();
noecho();
raw();
keypad(stdscr,TRUE);
while((c=getch())!='\x18'){
switch (c){
case KEY_UP:
addstr("[↑]");
break;
case KEY_ENTER:
addstr("Enter");
break;
case KEY_DC:
addstr("DEL");
break;

}
refresh();
}
endwin();
return 0;
}
Ubuntuのgccで、こういうものを作って入力されたキーを取得しようとしてるのですが
Enterだけ反応しません。DELとカーソルの上とか、ここでは省きましたが他のファンクションは
うまくキャッチできるのですが。
どうやったらEnterを取得できるんでしょうか?

410 :デフォルトの名無しさん:2009/12/08(火) 20:02:11
>>379
理解できなかったのですね。よくわかります。

411 :デフォルトの名無しさん:2009/12/08(火) 20:08:21
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
static struct termios t_orig;
char Get_Key(){
char c;

begin_getch();
c = getch();
return(c);
}
int begin_getch() {
struct termios t;
tcgetattr( 0, &t );
t_orig = t;
t.c_lflag &= ~(ICANON|ECHO);
t.c_cc[VMIN] = 1;
tcsetattr( 0, TCSADRAIN, &t );
}
int getch() {
char c;
int status = read( 0, &c, sizeof(char) );
return status ? c : (char)status;
}
getchの返り値をunsigned charにキャストして、
printfかなんかで16進数に印字して一文字づつ見てみるといいかも
Ubuntuでできるかは知らないけど。

412 :デフォルトの名無しさん:2009/12/08(火) 20:09:39
>>408
データ構造を意識するようになれば、おのずと構造体の意義もわかるようになるでしょう。

413 :デフォルトの名無しさん:2009/12/08(火) 20:23:38
>>407
こんなんでどう?
char s[] = {'\x82', '\xa0', '\0'};
printf("%s", s);

414 :デフォルトの名無しさん:2009/12/08(火) 20:39:44
>>411
とりあえず、'\0x0a'で捕まえることができました。
keypadを使ったKEY_ENTERは、諦めます。
ありがとう。

415 :デフォルトの名無しさん:2009/12/08(火) 21:00:40
>>413
お、できますね。
なぜそのやりかたで文字コードとして認識されるんでしょうか?

416 :デフォルトの名無しさん:2009/12/08(火) 21:14:17
>>415
charはintとかと同じ数値型。その値として文字コードを格納することで文字や文字列として振る舞う。
だから、直接ああいう風に文字コードを数値としてcharへ与えることも可能。

417 :デフォルトの名無しさん:2009/12/08(火) 21:16:16
float型の数字ABについて、A÷(B^2)という計算をするにはどうすればいいですか?

C=A/(B*B);

だと、なんか変なんですが。

418 :デフォルトの名無しさん:2009/12/08(火) 21:17:30
>>417
どう変なのでしょうか?

419 :デフォルトの名無しさん:2009/12/08(火) 21:17:54
floatの精度を考えれ。

420 :417:2009/12/08(火) 21:20:30
#include<stdio.h>
main()
{
float tall,weight,standard,bmi;
printf("身長(m)と体重(Kg)の入力:");
scanf("%f %f",&tall,&weight);

standard=tall*tall*22;
bmi=weight/(B*B);

printf("身長%.1fメートル、体重%.1fの時\n",tall,weight);
printf("標準体重は%4.1fキログラム、BMI指数は%4.1fです。\n",standard,bmi);

if(bmi>=25)
printf("太り過ぎ\n");

else if(25>bmi>=18.5)
printf("標準体重\n");

else if(bmi<18.5)
printf("低体重\n");

}


全ての値に対して、0が帰ってきますw

421 :417:2009/12/08(火) 21:22:37
B*Bじゃなくてtall*tallでした。

422 :デフォルトの名無しさん:2009/12/08(火) 21:26:22
double使えよ

423 :デフォルトの名無しさん:2009/12/08(火) 21:30:09
22とか25は、22.みたいに小数を明示する方がいいはず

424 :デフォルトの名無しさん:2009/12/08(火) 21:30:26
いや、動いとるよ。たぶんちゃんと動いてるよ。
で、>>417はこれ、誰かのソースをコピーしたのかな?
動作について理解してる?

425 :デフォルトの名無しさん:2009/12/08(火) 21:36:57
>>414
Enter と Return は別なんじゃねーの?

426 :417:2009/12/08(火) 21:37:31
いや、自分で書きました。
コンパイルしなおしたら動きました。

何でだろう・・・?

427 :デフォルトの名無しさん:2009/12/08(火) 21:38:18
動けばいいんだw それでおkw

428 :デフォルトの名無しさん:2009/12/08(火) 21:52:31
floatとdoubleってどっちが良いの?
まあDirectXはfloat使うみたいだけど・・・

429 :デフォルトの名無しさん:2009/12/08(火) 21:55:05
floatなんて存在価値なし
ゴミ。

430 :デフォルトの名無しさん:2009/12/08(火) 21:58:02
特に理由がなければdouble。

精度を犠牲にしてでもよほど大量かつ高速に処理しなければならないときにfloat。
SIMD命令やGPUで一気に処理できるし、必要なメモリ量が減ることも高速化に繋がることがある。

431 :デフォルトの名無しさん:2009/12/08(火) 22:11:07
「玄人志向」に対抗して、単精度に頼子だ割った「float志向」ちゅうブランド立ち上げたいんだっぺ・・・

432 :デフォルトの名無しさん:2009/12/08(火) 22:18:38
昨日、人のjavaのソースを見てたら、
DBからひっぱってきたBigDecimalを文字列に変換して、さらにfloatに
変換して比較とかしててフいた。

433 :デフォルトの名無しさん:2009/12/08(火) 22:46:27
そろそろwindowsアプリに挑戦したいと思っているのですが
VC++とBCCではどちらの方がとっつきやすいですか?


434 :デフォルトの名無しさん:2009/12/08(火) 22:50:24
おなじだよ。


435 :デフォルトの名無しさん:2009/12/08(火) 22:50:55
VC++はごちゃごちゃしててとっつきにくいってのはあるけど
どちらにしろVC++をやる羽目になるからなあ

436 :デフォルトの名無しさん:2009/12/08(火) 22:56:57
mallocがヒープにメモリを確保するように自動変数もスタックにメモリを確保するんですよね?
ということは
while(1){
int var[1024];
・・・
}
と書いた場合
while(1){
スタックにint[1024]を確保
・・・
開放
}
ということになって確保開放のコストが結構かさむと思うんですが、どうなんでしょうか?


437 :デフォルトの名無しさん:2009/12/08(火) 23:00:04
スタックの確保と解放はヒープよりずっと速いよ

438 :デフォルトの名無しさん:2009/12/08(火) 23:00:05
>>436
スタック領域の確保解放はレジスタを一つ書き換えるだけだから初期化がなければ超高速

439 :デフォルトの名無しさん:2009/12/08(火) 23:02:53
>>436
ブロックの中で宣言してても、たいていの処理系は
関数に入ったタイミングで確保してるから、あんまり関係ない。


440 :デフォルトの名無しさん:2009/12/08(火) 23:04:14
C言語がプールしている領域がスタック。
毎回、OSに問い合わせるのがヒープ。
ヒープでやっても自分で管理すれば、スタックと同速程度。
解放をしないってこと。

441 :デフォルトの名無しさん:2009/12/08(火) 23:06:44
自動変数の確保の速度はそれほど気にしなくて良い。
1M-5Mくらいの確保したら落ちたり、失敗する。
多くはとれないから、時間も掛からない。

442 :デフォルトの名無しさん:2009/12/08(火) 23:12:29
>>436
コンパイラの環境依存としかいいようがないが、関数に入ると同時に
そのブロックのスコープ内の領域までついでに確保してしまう処理系もある
その場合はコストゼロ

443 :デフォルトの名無しさん:2009/12/08(火) 23:16:01
つか、whileでループするたびに、スタックフレームを
伸ばしたり縮めたりする処理系なんて無いのでは?
そんなこと調べたことないけど。

444 :デフォルトの名無しさん:2009/12/08(火) 23:23:37
だよなあ。
関数内ブロックの自動変数は単にスコープの違いだけで、
変数の寿命は関数の先頭に書いたのと変わらないだろ。
わざわざ途中でスタックポインタいじったりしないだろ。
レジスタに割り当てるにしても、最適化で同じになるだろ。

445 :デフォルトの名無しさん:2009/12/08(火) 23:24:59
何でもかんでもOS任せにしていると忘れがちな豆知識

メモリ管理には、「その確保したメモリはどこにあるのか」ということがまず絶対に必要になる。

つまりMr.mallocはポインタに入れなければならないということ。
ハンドパワーで何とかなるもんじゃない。
うっうっうっううー。




446 :デフォルトの名無しさん:2009/12/08(火) 23:29:38
アセンブラでやると簡単。
メモリを確保したものをセクションとして保存
セクションはあらかじめ大きさを決めておく

スタックポインタを進める
内容保存
スタックポインタを進める
内容保存




これやってりゃいいだけだし
取り出すときは目的位置から減らしてMOVEしていけばいいだけ
まったく分かりやすい。
この点、逆にCのほうが分かりにくい。

447 :デフォルトの名無しさん:2009/12/09(水) 00:57:09
角度aを入力して、sin(a)の値を表示するプログラムを作りたいのですが、
πはどの様に定義したらよいのでしょうか?

double a,π=3.14159;

これで動くことは確認したのですが、わざわざ数値を与えてやらなくても、
「π」として定義して処理する方法があるような気がします。

448 :デフォルトの名無しさん:2009/12/09(水) 01:00:53
M_PIがあるなら使えば

449 :デフォルトの名無しさん:2009/12/09(水) 01:02:56
#define PI 3.14159

450 :デフォルトの名無しさん:2009/12/09(水) 01:04:36
math.h を見てみれば?

451 :デフォルトの名無しさん:2009/12/09(水) 01:04:41
出せやピッピッ
いっぱい出しゃいいって

452 :デフォルトの名無しさん:2009/12/09(水) 01:05:22
const double PI = atan(1) * 4.0;


453 :デフォルトの名無しさん:2009/12/09(水) 01:11:51
マシン依存ならアークタンジェントで計算
気にしないのならググって分かる限りの桁を

454 :デフォルトの名無しさん:2009/12/09(水) 01:12:17
M_PI がありました。

455 :デフォルトの名無しさん:2009/12/09(水) 01:23:00
一次元配列に、多次元配列風にアクセスする方法はありますか?

456 :デフォルトの名無しさん:2009/12/09(水) 01:27:31
あります

457 :デフォルトの名無しさん:2009/12/09(水) 01:35:27
そうでしたか。幸せですか?

458 :デフォルトの名無しさん:2009/12/09(水) 01:36:30
//10x10
int data[100];
int matrix(int x, int y) {
return data[x+y*10];
}

459 :デフォルトの名無しさん:2009/12/09(水) 01:43:14
Mat[size]のような配列に、Mat[i][j]のようにしてアクセスできるのでしょうか?

どのように書けばいいのでしょう

460 :デフォルトの名無しさん:2009/12/09(水) 01:43:39
PCのメモリも、ある意味一次元配列

461 :デフォルトの名無しさん:2009/12/09(水) 01:45:23
>>459
dekiruyo

462 :デフォルトの名無しさん:2009/12/09(水) 01:46:01
M_PIのMって何の略ですか
出展付きでお願いします

463 :デフォルトの名無しさん:2009/12/09(水) 01:47:49
マスマティック

464 :デフォルトの名無しさん:2009/12/09(水) 01:48:14
まさにパイ

465 :デフォルトの名無しさん:2009/12/09(水) 01:48:57
メーカーに訊け

466 :デフォルトの名無しさん:2009/12/09(水) 01:49:40
Mathライブラリ開発者がドMだったから

467 :デフォルトの名無しさん:2009/12/09(水) 01:51:53
ドMで何が悪い

468 :デフォルトの名無しさん:2009/12/09(水) 01:52:54
>>461
このままでは当然エラーだよねって答えが返ってくると思ってました。
それと
>>458
はリロードし忘れで見てませんでした。失礼しました。

469 :デフォルトの名無しさん:2009/12/09(水) 01:55:44
出展付きでお願いします
~~~~~~~~~~~~~~~~~~~~~~~

470 :デフォルトの名無しさん:2009/12/09(水) 01:56:11
>458は
#define mat(a,b) data[a+b*10]
に直しておけ

471 :デフォルトの名無しさん:2009/12/09(水) 01:57:45
k = mat(i, i + j);


472 :デフォルトの名無しさん:2009/12/09(水) 02:06:27
あっさり突っ込まれちゃって>>470はかっこがつかないなw

473 :デフォルトの名無しさん:2009/12/09(水) 02:09:10
汎用性が無いし五十歩百歩だと思うが

474 :デフォルトの名無しさん:2009/12/09(水) 02:16:23
汎用性がないのは>>470も同じだろ。
使い方によっては誤った結果になるものを五十歩百歩とかw

475 :デフォルトの名無しさん:2009/12/09(水) 02:18:42
君は日本語がわからないのかね

476 :デフォルトの名無しさん:2009/12/09(水) 02:19:45
//10x10
int data[100];

((int [][10])&data)[x][y];



477 :デフォルトの名無しさん:2009/12/09(水) 02:20:39
#define mat(a,b) data[a+(b)*10]
こうすりゃあええんだろ

478 :デフォルトの名無しさん:2009/12/09(水) 02:23:28
>476 が何をしたいのか理解できないのだけど

479 :デフォルトの名無しさん:2009/12/09(水) 02:25:32
int *data=(int *)calloc(100,sizeof(int));で宣言すればdata[20]でもdata[2][0]でも参照できるって姉貴が言ってた


480 :デフォルトの名無しさん:2009/12/09(水) 02:26:25
キャスト

481 :デフォルトの名無しさん:2009/12/09(水) 02:27:08
>>479
コンパイラは何をお使いですか?

482 :デフォルトの名無しさん:2009/12/09(水) 02:28:13
warota

483 :デフォルトの名無しさん:2009/12/09(水) 02:30:16
おまえら真面目に答えて差し上げろよw
嘘情報を初心者に与えるんじゃないよw

484 :デフォルトの名無しさん:2009/12/09(水) 02:33:28
>>476 でいいだろ。

485 :デフォルトの名無しさん:2009/12/09(水) 02:37:25
うん

486 :デフォルトの名無しさん:2009/12/09(水) 02:38:17


487 :デフォルトの名無しさん:2009/12/09(水) 09:15:26
じゃあy幅が可変のときに>>476みたいにしたいときはどうするの?


488 :デフォルトの名無しさん:2009/12/09(水) 09:42:25
そんな時はふつうのやり方すればいい
というか何も考えずに質問するな

489 :デフォルトの名無しさん:2009/12/09(水) 10:56:04
>476 は、コンパイル通るのか
ぱっと見では、配列(非スカラな複合型)にキャストしているから無理そうなんだけど
ああ、C99では、なんかあった気もするなぁ、いや、配列はさすがに無理だろ

490 :デフォルトの名無しさん:2009/12/09(水) 11:07:19
なんかC言語をGoogleが改造した奴があるって聞いたけどあれはどうなの?

491 :デフォルトの名無しさん:2009/12/09(水) 11:11:03
((int (*)[10])&data)[y][x]

492 :デフォルトの名無しさん:2009/12/09(水) 11:47:48
>>490
君と同じ

493 :デフォルトの名無しさん:2009/12/09(水) 11:56:34
>>489
2次元配列を関数に渡すときに使わないか?

494 :デフォルトの名無しさん:2009/12/09(水) 12:19:39
>493
使わんなぁ

2次元配列って何、おいしいの
配列の配列でいいよね

関数の仮引数で使われるもっとも内側のブラケット(例えば、foo_t bar(baz_t [][n_1][n_2][n_3]...[n_15], ...)では、[]のこと)は、ポインタ宣言子と等価である
このことは、配列がポインタに成り下がることから容易に想像できる

基本的にキャストのオペランドはスカラでないといけないので、オペレータが非スカラな複合型へのキャストであってはならない

495 :デフォルトの名無しさん:2009/12/09(水) 12:25:24
>>477 晒あげ

496 :デフォルトの名無しさん:2009/12/09(水) 12:34:06
int a[3][5];
(int*)a[1]という表現は正しい?

497 :デフォルトの名無しさん:2009/12/09(水) 15:11:16
C言語初心者なんですがソフトってどれがオススメですか?

498 :デフォルトの名無しさん:2009/12/09(水) 15:13:14
visual c++ 2008 ee

499 :デフォルトの名無しさん:2009/12/09(水) 15:26:26
自分で問題を設定してオリジナルのプログラムを作れという課題が出たんですが、〇×ゲームって作れますかね?

500 :デフォルトの名無しさん:2009/12/09(水) 15:29:19
>>499
C言語に不可能は無い

501 :デフォルトの名無しさん:2009/12/09(水) 15:29:42
そんなん
「入力された2つの数値の和を計算して表示する」
的な簡単な課題にしときゃあええんや

502 :デフォルトの名無しさん:2009/12/09(水) 15:33:11
>>500
作り方教えてください!

>>501
そんなんじゃ提出点すらもらえないです(汗)

503 :デフォルトの名無しさん:2009/12/09(水) 15:36:45
んんじゃ2次方程式の解を求めるとかでええんとちゃう?

504 :デフォルトの名無しさん:2009/12/09(水) 15:36:55
>>502
プレイヤーからどこに○、×を書くのか入力してもらって、
それから○のところに○を表示して、×のところに×を表示すればいいと思います。

505 :デフォルトの名無しさん:2009/12/09(水) 15:38:12
提出点くれないとかケチな先生やなぁ

506 :デフォルトの名無しさん:2009/12/09(水) 15:39:44
学校で学んだ範囲で出来ることじゃなくて平気なの?

507 :デフォルトの名無しさん:2009/12/09(水) 15:54:09
教えてやれよ・・・

508 :デフォルトの名無しさん:2009/12/09(水) 15:55:07
>>504
0からつくれるほど才能ないので問題形式で教えてください
>>505
まぁ予想ですが…
どうせならいいものを作りたいですし
>>506
去年は〇×ゲームを作った人がいたらしいです

509 :デフォルトの名無しさん:2009/12/09(水) 15:58:59
>>503
ゲームを作りたいんです!

510 :デフォルトの名無しさん:2009/12/09(水) 15:59:00
配列を使う
[0][0]〜[2][2]
whileで無限ループで全部埋まるか勝負かつくまで繰り返す
おわり

511 :デフォルトの名無しさん:2009/12/09(水) 16:02:10
>問題形式で


問題「○×ゲームを作りなさい」

512 :デフォルトの名無しさん:2009/12/09(水) 16:05:55
>>499はC言語でどんなことが出来るレベルなの?

513 :デフォルトの名無しさん:2009/12/09(水) 16:15:01
「作れますかね?」って他人に訊くくらいだから
そりゃ作れないだろう、としか答えられん。

514 :デフォルトの名無しさん:2009/12/09(水) 16:15:26
>>512
スレタイ

515 :デフォルトの名無しさん:2009/12/09(水) 16:28:05
どうせならいいものって…
自分の立場わきまえろよ無能

516 :デフォルトの名無しさん:2009/12/09(水) 16:33:16
○×ゲームの仕様はこんな感じでおk?

ゲームの操作は全てPCに繋いだゲームパッドから行う
○は赤、×は青でえんぴつで描いたようなアニメーションで表現する
勝利するとファンファーレが鳴るようにする
プレイごとに先手後手がいれかわる
勝敗記録を保存しておく
対戦するコンピュータの強さは10段階

517 :デフォルトの名無しさん:2009/12/09(水) 16:33:16
どうしてプログラミング始めたヤツってゲーム作りたがるの?
ゲームって面白いの。
ポケモンしかやったことねー

518 :デフォルトの名無しさん:2009/12/09(水) 16:35:42
学生の名前と番号と成績を保存しておいて並び替えとかできるプログラム
とか作ってもつまらないからじゃね。

519 :デフォルトの名無しさん:2009/12/09(水) 16:37:03
人に全部訊くくらいならググってコピペすりゃあいいと思うんだが、違うか?

520 :デフォルトの名無しさん:2009/12/09(水) 16:49:39
テーマが自由なら、ネットワーク関連のプロトコル勉強してサーバでも作ればいいやん。
HTTPサーバとか、多分マルバツゲームよりは面白いぞ。

521 :デフォルトの名無しさん:2009/12/09(水) 17:08:22
どうしてって、理由なんかなかったな

それまでできなかったことが、できるようになる
能力の開花そのものを楽しんでいた

偶然にも俺の世代では当時のトレンドにプログラミングがあったというだけ
周りの大人にできないことをやるオリジナリティを今求めると別なものかも知れない

522 :506:2009/12/09(水) 17:17:07
>>508
あなたが学校でどんなレベルのことを学んだのか分からないとアドバイスのしようもありません
学校で学んだ範囲外のことをプログラムするとなると
あなたがプログラムの成績が非常に優れているでもない限り
必ず先生から疑われてしまいますよ
その○×ゲームを作った方はきっとプログラムに精通している方だったのでしょう
提出点を気にするあなたが無理をする意味は無いと私は思いますよ
ちなみに私が以前作った○×ゲームは約13000行になるくらい大きなものになりました
課題にゲームは不向きだと思います




523 :デフォルトの名無しさん:2009/12/09(水) 17:20:07
ナンプレで良いじゃん

524 :デフォルトの名無しさん:2009/12/09(水) 17:20:49
8クイーンでいいじゃん

525 :デフォルトの名無しさん:2009/12/09(水) 17:39:26
因数分解とか素数でいいじゃん

526 :デフォルトの名無しさん:2009/12/09(水) 18:02:07
足し算で

527 :デフォルトの名無しさん:2009/12/09(水) 18:05:33
>>522
CUIなら100行いないだろ。

528 :デフォルトの名無しさん:2009/12/09(水) 18:08:02
>>526
逆ポーランド記法で電卓ってのも面白そうだな。

529 :499:2009/12/09(水) 18:22:01
いろんな人の意見を聞くかぎりでは今まで習った事じゃ〇×ゲームは出来そうにないな。
じゃあ何すりゃいいんだ?orz

530 :デフォルトの名無しさん:2009/12/09(水) 18:25:25
・2次方程式の解を求める
・因数分解
・素因数分解
・超ひも理論

531 :デフォルトの名無しさん:2009/12/09(水) 18:25:36
何を習ったんだよ

532 :デフォルトの名無しさん:2009/12/09(水) 18:27:56
>>529
PCが最低引き分けに持ち込むというならそれなりに難しいが、
あいてる所に適当に打つというなら入門レベルでOK。
たぶん、UIを作るところが一番大変。

533 :デフォルトの名無しさん:2009/12/09(水) 18:28:38
>>516の簡単なレベルの○×ゲームなら作れるんじゃね?

534 :デフォルトの名無しさん:2009/12/09(水) 18:37:46
ジャンケンでいーじゃん

535 :デフォルトの名無しさん:2009/12/09(水) 18:38:53
13000行て
不敗のcpu作っても絶対そんなにいかないわ

536 :デフォルトの名無しさん:2009/12/09(水) 18:46:55
インベーダー作れ
んで敵を倒すとマイドキュメントのファイルが消える仕様

537 :デフォルトの名無しさん:2009/12/09(水) 18:53:55
あのウイルスか
残念なことにあれってMac専用なんだよな

538 :デフォルトの名無しさん:2009/12/09(水) 18:54:46
移植しろってことだろ

539 :デフォルトの名無しさん:2009/12/09(水) 18:56:11
unsigned int uint_hensu;
unsigned char uc_hensu;

memcpy(&uint_hensu,&kouzoutai.uc_hensu,sizeof(uint_hensu));

memcpyをしようとしコンパイルしたところ、エラーがでてしまいました。
原因は何でしょうか?

uc.hensu自体は構造体できっております。
unsigned int と unsigned charでmemcpyしようとするとエラーがでてしまいます。
unsigned char 同士でするとエラーがでません。

何か変数はこのままのサイズでうまく解決できないでしょうか?

540 :デフォルトの名無しさん:2009/12/09(水) 18:58:54
作った
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define UNKO(_arg) ((_arg==0) ? " " : (_arg==1) ? "@" : "X")
int unko[3][3]={0}; int gyou, retu;
void print(void) {
  printf("%s|%s|%s\n", UNKO(unko[0][0]), UNKO(unko[0][1]), UNKO(unko[0][2])); printf("-+-+-\n");
  printf("%s|%s|%s\n", UNKO(unko[1][0]), UNKO(unko[1][1]), UNKO(unko[1][2])); printf("-+-+-\n");
  printf("%s|%s|%s\n", UNKO(unko[2][0]), UNKO(unko[2][1]), UNKO(unko[2][2])); }
void select(void) {
  do{ puts("select gyou"); gyou = getch(); }while((gyou < '0') || ('2' < gyou));
  do{ puts("select retu"); retu = getch(); }while((retu < '0') || ('2' < retu)); }
void select_enemy(void) { for(int i=0; i<3; i++){ for(int j=0; j<3; j++){ if(unko[i][j] == 0){ unko[i][j] = 2; return; } } } }
bool judge(int flag) {
  if(unko[0][0]*unko[0][1]*unko[0][2] == flag){ return true; }
  if(unko[1][0]*unko[1][1]*unko[1][2] == flag){ return true; }
  if(unko[2][0]*unko[2][1]*unko[2][2] == flag){ return true; }
  if(unko[0][0]*unko[1][0]*unko[2][0] == flag){ return true; }
  if(unko[0][1]*unko[1][1]*unko[2][1] == flag){ return true; }
  if(unko[0][2]*unko[1][2]*unko[2][2] == flag){ return true; }
  if(unko[0][0]*unko[1][1]*unko[2][2] == flag){ return true; }
  if(unko[0][2]*unko[1][1]*unko[2][0] == flag){ return true; }
  return false; }
void redraw(void) { system("cls"); print(); }
int main(void) {
  while(1){
    do{ redraw(); select(); }while(unko[gyou-'0'][retu-'0']!=0);
    unko[gyou-'0'][retu-'0'] = 1; if(judge(1)){ redraw(); puts("kati"); return 0; }
    select_enemy(); if(judge(8)){ redraw(); puts("make"); return 0; } }
}

541 :デフォルトの名無しさん:2009/12/09(水) 19:02:03
テンキーの1〜9を各マスに対応させる。
curses.hまたはconio.hを使って何かキーが押されるたびにダイレクトに全描画する。

あとはまかせた。

542 :デフォルトの名無しさん:2009/12/09(水) 19:02:31
>>539
kouzoutai、uc、hensuがなにかの記載がない。
どのようなエラーがでたかも書くように。

543 :デフォルトの名無しさん:2009/12/09(水) 19:03:08
conioの読み方は「コニオ」で合ってますか?

544 :デフォルトの名無しさん:2009/12/09(水) 19:05:25
くにお

545 :デフォルトの名無しさん:2009/12/09(水) 19:06:40
好きなように読むか
メーカに問い合わせればいい
わかったら、>>543はもう来ないでね

546 :デフォルトの名無しさん:2009/12/09(水) 19:08:22
getsをゲッツと読んでました…

547 :デフォルトの名無しさん:2009/12/09(水) 19:21:07
sprintf()はスプリントエフだよ

548 :デフォルトの名無しさん:2009/12/09(水) 19:24:50
スーパープリントファンクション

549 :デフォルトの名無しさん:2009/12/09(水) 19:26:18
このスレの入門者はC言語で何を作っていますか

550 :デフォルトの名無しさん:2009/12/09(水) 19:29:01
セキュアプリントフォーマットじゃね?w

551 :デフォルトの名無しさん:2009/12/09(水) 20:24:50
>> 549
カレンダー⇒ワードソート⇒ラインエディタ⇒オセロの順で
俺は作ったぞ。

552 :デフォルトの名無しさん:2009/12/09(水) 20:38:08
>549
こんにちは、世界。

553 :デフォルトの名無しさん:2009/12/09(水) 20:54:28
>>496
http://codepad.org/oHhfTrZ2

554 :デフォルトの名無しさん:2009/12/09(水) 21:30:21
>>549
てけすとえでた。

555 :539:2009/12/09(水) 21:32:16
>>542
すいません、エラーは今すぐ思い出せないのですが
たしかu int u charのコピーの際のエラーがでてました。
正確にはコンパイルはできるけど、警告という意味でエラーがでてました。

uintもucharの変数の中は数字です。kouzoutaiの中も、uchar hensu といった
似たようなのが入ってます。

556 :デフォルトの名無しさん:2009/12/09(水) 21:37:57
いいから正確なエラー書け
書けないならもうやめろ

557 :デフォルトの名無しさん:2009/12/09(水) 22:03:48
やめます

558 :デフォルトの名無しさん:2009/12/09(水) 22:08:12
unsigned int uint_hensu;
unsigned char uc_hensu;

memcpy(&uint_hensu,&kouzoutai.uc_hensu,sizeof(uint_hensu));

memcpyをしようとしコンパイルしたところ、エラーがでてしまいました。
原因は何でしょうか?

uc.hensu自体は構造体できっております。
unsigned int と unsigned charでmemcpyしようとするとエラーがでてしまいます。
unsigned char 同士でするとエラーがでません。

何か変数はこのままのサイズでうまく解決できないでしょうか?

559 :デフォルトの名無しさん:2009/12/09(水) 22:11:07
だから出力されたエラーをそのまま書けと何度(ry

560 :デフォルトの名無しさん:2009/12/09(水) 22:11:59
どうしてエラーメッセージをそのまま書けない?質問する気があるのか?単に面白がってるわけ?
やめてしまえよ!

561 :デフォルトの名無しさん:2009/12/09(水) 22:13:22
>>558
うざいよ
さっさとタヒねよ

562 :デフォルトの名無しさん:2009/12/09(水) 22:13:22
539と558は、別人じゃないか?

563 :デフォルトの名無しさん:2009/12/09(水) 22:14:02


564 :デフォルトの名無しさん:2009/12/09(水) 22:14:20
別人だろ
だから消えてもらいたい
ほんとタヒねよ

565 :デフォルトの名無しさん:2009/12/09(水) 22:17:36
暇人やってる成りすまし君がまだいる...

566 :デフォルトの名無しさん:2009/12/09(水) 22:48:05
>>558
<string.h>インクルードした?

567 :デフォルトの名無しさん:2009/12/09(水) 22:50:16
>>556
インクルードはしております
memcpy自体は成功しています

568 :デフォルトの名無しさん:2009/12/09(水) 23:44:06
やはりうまく行かないソースをさらしていただかないと。
こちらにどうぞ。http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

569 :デフォルトの名無しさん:2009/12/09(水) 23:58:10
memcpy で、 intとcharと別々でも普通はいけますよね?

570 :デフォルトの名無しさん:2009/12/10(木) 00:08:37
>569

確保されていない領域にアクセスするのだから、何が起こってもおかしくない。

>558
エスパーして、kouzoutai.uc_hensuがunsigned charだとすれば、
memcpy(&uint_hensu,&kouzoutai.uc_hensu,sizeof(uint_hensu));
1バイト分しか確保してないのに、unsigned分(4バイトかな?)
読んでコピー仕様とするので、警告が出るだろうね。
ランタイムエラーで落ちたりするかも。


571 :デフォルトの名無しさん:2009/12/10(木) 00:21:35
hensu は4倍と uc_hensuは1バイト


これって普通では

572 :デフォルトの名無しさん:2009/12/10(木) 00:59:04
釣りなのかマジなのかわからんが。

本当に教えて欲しいなら汚いままのソースとエラーメッセージをそのまま晒せ。
他人に聞かなきゃわからんようなレベルの人間が綺麗なコード書くなんて誰も思ってないから恥とか思うな。
プログラマが伸び悩む一番の要因がコレだ。どんどん他人に見せてバカにしてもらえ。絶対伸びるから。

573 :デフォルトの名無しさん:2009/12/10(木) 02:00:41
以下のA*B掛け算プログラムで、なぜかAの値を入力した瞬間強制終了されてしまいます。
原因の解明、お願いいたします。

#include <stdio.h>

int main(void)
{
int a = 0;
int b = 0;

for (;;){
printf("掛け算 A * B\n\nA = ");
scanf("%d", a);

printf("\nB = ");
scanf("%d", b);

printf("\n%d * %d の結果は %d です\n", a, b, a * b);
}
return 0;
}

574 :デフォルトの名無しさん:2009/12/10(木) 02:04:57
scanf("%d", &a);

575 :デフォルトの名無しさん:2009/12/10(木) 02:42:41
>>574 早速ありがとうございます。お陰さまで解決できました。


それともう一つお尋ねしたいのですが、
149 * x でxに最大16777216(2^24)が入れるようにしなければならないのですが、
xが14000000を超えたあたりから答えが異常値になりました。
(149 * 15000000 では -2059967296  149 * 15000001 では -2059967147)
これをなおすには、どうしたらいいでしょうか。

576 :デフォルトの名無しさん:2009/12/10(木) 02:58:44
int -> unsigned long
%d -> %lu

577 :デフォルトの名無しさん:2009/12/10(木) 08:23:37
>571
intのサイズがいくつになるかは環境依存。

もっとも今のPC環境ならまず4になる。intのサイズが1なら問題ないと言えるかも。

それでも、ポータビリティを考えれば好くない。

578 :デフォルトの名無しさん:2009/12/10(木) 08:54:14
どこだよsizeof(int)が1の環境って

579 :デフォルトの名無しさん:2009/12/10(木) 09:37:55
文字列からスペースもしくは終端値があるバイト数を
出すにはどうすればいいの?

試してみたができない
while((*p==32)||(*p==0)){++p;++i;}

580 :デフォルトの名無しさん:2009/12/10(木) 09:41:05
文字列における終端値の数は一つに決まってる気がするが。

581 :デフォルトの名無しさん:2009/12/10(木) 09:42:56
while(*p) if(*p++ == 32) i++;

582 :デフォルトの名無しさん:2009/12/10(木) 10:22:48
正規分布表をC言語で作りたいんやけど
だれか作ってくれ

583 :デフォルトの名無しさん:2009/12/10(木) 10:24:19
作りたいんなら、自分で作れw

584 :デフォルトの名無しさん:2009/12/10(木) 10:37:29
>>582
>>574が作ってくれるよ。

585 :デフォルトの名無しさん:2009/12/10(木) 10:39:12
つExcel

586 :デフォルトの名無しさん:2009/12/10(木) 11:16:58
ttp://www.dotup.org/uploda/www.dotup.org441433.c
これをコンパイルしたいんだけどどうしたらいいのか
strcasestrはcygwinでは扱えないみたいだしunistd.hはVSでは無いし・・・

587 :デフォルトの名無しさん:2009/12/10(木) 11:24:26
strcasestrくらい自分で作れ

588 :デフォルトの名無しさん:2009/12/10(木) 11:38:53
はい

589 :デフォルトの名無しさん:2009/12/10(木) 13:22:59
stristrだろJKとか思ったけどPHPだた。。。

590 :デフォルトの名無しさん:2009/12/10(木) 15:07:15
>>529
2次関数と直線の交点が2つあるとき
その交点2つでの2次関数の接線2本の交点を求めるプログラム作れ
簡単だぞ?

591 :デフォルトの名無しさん:2009/12/10(木) 17:43:14
atio関数のっ逆バージョンないの?
数値から文字列にするみたいな

592 :デフォルトの名無しさん:2009/12/10(木) 17:44:35
sprintfでいいだろうitoaは非推奨だし

593 :デフォルトの名無しさん:2009/12/10(木) 17:53:37
いい加減scanf関係覚えろ

変数に入れるんじゃない
アドレスに入れると覚えろ

だから、
内部ではアドレス操作である配列やポインタ変数に入れるときは&つけてはならない
アドレス操作でない普通の変数の場合は&をつける



594 :デフォルトの名無しさん:2009/12/10(木) 18:07:20
まずおまえが覚えろよwww

595 :デフォルトの名無しさん:2009/12/10(木) 18:11:59
そもそも単に値一つ入力するだけに scanf を使うなよ。
scanf はそういう関数じゃないから。


596 :デフォルトの名無しさん:2009/12/10(木) 18:19:26
アドレスに入れるとかワロス
使ってるのはアドレスだがアドレスに入れてるわけじゃないしw

597 :デフォルトの名無しさん:2009/12/10(木) 18:21:33
確かにscanfの無駄使い
scanfも仕事選べ

598 :デフォルトの名無しさん:2009/12/10(木) 18:29:05
アドレスに入れなきゃ変数は存在できねえぞ
すべてのデータはメモリのアドレスに入る。
アドレスに入るからメモリコントローラはタグだのCASだのRASだの使ってアドレスを参照する。

599 :デフォルトの名無しさん:2009/12/10(木) 18:33:37
>>598
>アドレスに入れなきゃ
そもそもアドレスって何だか解っていないやも知れず。
>すべてのデータはメモリのアドレスに入る。
ダウト。
>アドレスに入るからメモリコントローラはタグだのCASだのRASだの使ってアドレスを参照する。
知ってる単語を精一杯並べると後が苦しいぞ。

600 :デフォルトの名無しさん:2009/12/10(木) 18:33:42
え?

601 :デフォルトの名無しさん:2009/12/10(木) 18:42:13
メモリコントローラは最終的にアドレス目指して配置してるからなw
メモリそのものにもアドレスを判別できるようにチップが搭載されている
メモリセルだけ繋いでも動作せんのぜ

602 :デフォルトの名無しさん:2009/12/10(木) 18:54:15
>>601
スレ違い。語りたいならマ板に逝け。

603 :デフォルトの名無しさん:2009/12/10(木) 18:58:25
C言語の入門にお薦めのソフトって何ですか?

604 :デフォルトの名無しさん:2009/12/10(木) 19:16:16
Internet Explorer

605 :デフォルトの名無しさん:2009/12/10(木) 19:20:58
LSI C-86 試食版

606 :デフォルトの名無しさん:2009/12/10(木) 19:21:07
> すべてのデータはメモリのアドレスに入る。
C言語使ってると、そういう錯覚に陥りそうになるが、実際はそうではない。

607 :デフォルトの名無しさん:2009/12/10(木) 19:29:40
レジスタやスタック・貧富だってアドレス管理だぜ

608 :デフォルトの名無しさん:2009/12/10(木) 19:41:35
#define PI 3.141592

// -PI<=rad<PIになるよう正規化する
double GetNormalizedRadian1(double rad) {
 while (rad<=-PI) rad+=PI*2;
 while (rad> PI) rad-=PI*2;
 return rad;
}

double GetNormalizedRadian2(double rad) {
 static const double PI2 = PI * 2;
 double i=ceil(rad/PI2);
 return fmod(rad+i*PI2, PI2);
}

上と下では結果が違うんです
GetNormalizedRadian1(-3*PI) ----> -3.141592
GetNormalizedRadian2(-3*PI) ----> 3.141592
上の関数だとループがなんかイヤだったので下の関数にしましたが、
下手に小細工するよりかは上の関数の書き方の方が良いでしょうか


609 :デフォルトの名無しさん:2009/12/10(木) 20:00:30
>>608
丸め誤差があるので、その辺りを考慮して書き直すべき。ループするのは論外。
そもそも、%fを使うよりも%gを使おう。ついでに言えば、精度を考慮して%.20gとでもすれば様子が掴み易い。

610 :デフォルトの名無しさん:2009/12/10(木) 20:20:40
某商用ソースで

if(FuxkOSX)
{
 FuckingToshing += FuxkJobs;
 FuckingToshing += FuxkJobs;
 FuckingToshing += FuxkJobs;
 FuckingToshing += FuxkJobs;
 FuckingToshing += FuxkJobs;
}


っての見たんだけど
これとforなどのループを介してやるのとでは
どっちが速いの。

611 :デフォルトの名無しさん:2009/12/10(木) 20:22:03
大して変わらん
ものによる
実測知る

612 :デフォルトの名無しさん:2009/12/10(木) 20:28:51
アメリカ大陸横断するのに250CCバイクで行くのが早いか
750CCバイクで行くのが早いか議論するようなもの

613 :デフォルトの名無しさん:2009/12/10(木) 20:52:58
アドレスは場所じゃなくて場所を示す指標だろ。
アドレスには何も入らないだろ、アドレスが示す場所に入るんだよ。

614 :デフォルトの名無しさん:2009/12/10(木) 21:05:21
アメリカ横断ウルトラハイパークイズ

罰ゲーム
 でででーでででー(ずどぅどぅどぅん)


東京直行

615 :デフォルトの名無しさん:2009/12/10(木) 21:20:48
>>610
基本的には、ループは展開した方が速い。
ループにすると、ループ回る度に終了するかどうかを判定する必要があるからね。

616 :デフォルトの名無しさん:2009/12/10(木) 21:21:46
>>613
そういう言葉遊びの問題じゃ無いだろ

データを入れる場所を確保してそこにアドレスという情報を与えるわけで
例えるなら
C地区の4丁目4番4号の家に手紙を届けるということは、厳密には北緯30度、東経150度の地点に手紙を届けるということで、
「C地区の4丁目4番4号」という住所は手紙を配達する人間が便宜的につけたものでしかなく、
同じ地点でも何かのきっかけで住所が指し示す場所が変わってしまうこともありえる
みたいなことを言いたいんだろ

617 :デフォルトの名無しさん:2009/12/10(木) 21:24:17
市町村合併とか?

618 :デフォルトの名無しさん:2009/12/10(木) 21:25:06
我ながら例えがおかしいな
つまり「アドレスが指し示す場所」と「メモリ上の場所」は別概念の物だってことね

619 :デフォルトの名無しさん:2009/12/10(木) 21:27:36
配られた世界の上でアロケーションするしかないのさ。

620 :デフォルトの名無しさん:2009/12/10(木) 21:29:26
>>617
イメージ的に「他国の侵略」が一番しっくりくる気がする

621 :デフォルトの名無しさん:2009/12/10(木) 21:51:59
ハードディスクもメモリの一種なんだぜ?

622 :デフォルトの名無しさん:2009/12/10(木) 22:05:42
「物理アドレス」は変わりようねえだろ
アドレスって言うと論理アドレスしか思い浮かばんのか
そして論理アドレスだって物理への橋渡し役でしかないから
アドレスであることには変わりない

623 :デフォルトの名無しさん:2009/12/10(木) 22:22:55
C言語にゃ関係ねぇよ。
Cのコード上で存在するデータ(変数やら関数やら)なんて
最適化で消えることすらあるのに、メモリが何だとか
いつまでもグダグダとウザい

ヨソでやれ

624 :デフォルトの名無しさん:2009/12/10(木) 22:25:05
ここ以外のヨソがあるだろうか。ここがこの板全体のヨソなのに

625 :デフォルトの名無しさん:2009/12/10(木) 22:27:38
ソースコード上とバイナリコード上ではまた違うだろ
バイナリコードでどういう風に動作してるのかをイメージするのは大事だよ

626 :質問厨:2009/12/10(木) 22:29:02
メモリのことを主記憶装置というのは知っていますが、ハードディスクなどの事はなんというのですか?

627 :デフォルトの名無しさん:2009/12/10(木) 22:30:46
外部記憶装置、だっけ?

628 :デフォルトの名無しさん:2009/12/10(木) 22:32:29
>>626
外部記憶装置または固定記憶装置
Cから見れば>>623の言うとおり何だろうと関係ない。
アドレッシングはOSの仕事だから。ただしまともなOSがない組み込みは除く。

629 :質問厨:2009/12/10(木) 22:35:45
>>627
ありがとうございます。
主記憶装置って情弱はハードディスクと勘違いしてるやつ多くて困りますよね。

630 :デフォルトの名無しさん:2009/12/10(木) 22:36:21
アセンブラはメモリ操作が主
で、その後継であるCは「メモリ操作ができる高級言語」である必要があったから
異例とも言えるほど強力なメモリ操作(ポインタ)機能を備えている。

だからCをやる限り「メモリなんか関係ない」などと寝ボケたことはいえない。
そういうやつがオーバーフローを引き起こしてセキュリティホールを作る。

631 :デフォルトの名無しさん:2009/12/10(木) 22:40:27
>>630
なんかwikipediaの内容をそのまま書いただけのような書き込みですね。

632 :デフォルトの名無しさん:2009/12/10(木) 22:41:36
>>630
論理アドレスは必須だけど物理アドレスは全くもって不要です。

633 :カーネルハッカー:2009/12/10(木) 22:43:01
>>632
そうだね(笑)

634 :デフォルトの名無しさん:2009/12/10(木) 22:50:13
>>630
処理系の話と言語の話の切り分けも出来ん奴は
処理系依存スレにでも引き込もっとれ

635 :デフォルトの名無しさん:2009/12/10(木) 22:55:40
「Cをやる限りメモリなんて関係ない」
「Cをやる」ってなんだ?w

636 :デフォルトの名無しさん:2009/12/10(木) 22:55:54
物理アドレスがなかったら論理アドレスがマッピングできずにメモリに乗せられないじゃんw


仕組みも分かってないのかw

637 :デフォルトの名無しさん:2009/12/10(木) 22:56:38
>>635
身も蓋もない言い方をすれば、犯すってこと

638 :デフォルトの名無しさん:2009/12/10(木) 22:58:14
>>636
意識する必要はないってことじゃないの?

639 :デフォルトの名無しさん:2009/12/10(木) 22:58:49
論理アドレスってのはテーブルのようなもので

毎回同じメモリが空いてるとは限らないから
空いてるところに番号振ってどこが空いていても問題なく動くようにしよう

と、物理アドレスを変換するためだけのもの。
ハードディスクドライブに対しても同じようにどこのシリンダーやクラスタが空いてるか固定できないので
番号振って空いてるところを使えるようにしているだけ。

で、空いてるかどうかは物理アドレスを見てみないとわからない。
イコール
「物理アドレスがなければ論理アドレスが存在し得ない」


バカだろw

640 :デフォルトの名無しさん:2009/12/10(木) 23:05:07
ユーザランドな環境でのプログラミングは意識する必要がないって意味じゃないの?

641 :デフォルトの名無しさん:2009/12/10(木) 23:16:05
さっきから論外な事ばかり言ってる人がいる。

642 :デフォルトの名無しさん:2009/12/10(木) 23:27:53
_stdcallを、呼び出される関数の前につけることによって
なぜつけない場合よりメモリの使用量が少なくなるのかわかりません

643 :デフォルトの名無しさん:2009/12/10(木) 23:28:47
>>640
(笑)

644 :デフォルトの名無しさん:2009/12/10(木) 23:31:18
>>643


645 :デフォルトの名無しさん:2009/12/10(木) 23:33:59
>>642
stdcall は引数をすべてスタックに押し込んでから call
何もつけてなければコンパイラが好きなようにしてくれるはず
スタックにいれずにレジスタに乗せたまま call したり

646 :デフォルトの名無しさん:2009/12/10(木) 23:34:07
>642
お使いのコンパイラのメーカに問い合わせてください
きっと活舌の良い方が答えてくれるでしょう
分かったらさっさとタヒんでください

647 :デフォルトの名無しさん:2009/12/10(木) 23:37:54
>>645
だからプログラムの容量も減らせるとサンクス

648 :デフォルトの名無しさん:2009/12/10(木) 23:39:30
>>642
呼び出しの後処理を呼び出され側でやるから。
何回も同じのを呼び出す場合は差が出る。
一回だけなら変わらん。

649 :デフォルトの名無しさん:2009/12/10(木) 23:42:02
>>647
おまえ読解できてないぞ。
その説明だとむしろ逆になる。


650 :デフォルトの名無しさん:2009/12/10(木) 23:42:49
逆ぢゃね?

651 :デフォルトの名無しさん:2009/12/10(木) 23:45:38
stdcall は実行ファイルのサイズは小さくなるがメモリ使用量はむしろ増加する。


652 :デフォルトの名無しさん:2009/12/10(木) 23:49:08
>>651
!

653 :デフォルトの名無しさん:2009/12/10(木) 23:49:12
>>649
まぢで?
じゃあ見た本嘘かかれてるっぽいな
651のが結論?

654 :デフォルトの名無しさん:2009/12/10(木) 23:51:43
今はいろんなとこの容量が大きくなってるけど
減らすのを目指すとしたらメモリ使用量の方だよね?

655 :デフォルトの名無しさん:2009/12/11(金) 00:02:58
キャッシュ

656 :デフォルトの名無しさん:2009/12/11(金) 00:03:36
早く終わってプログラム終了したらその分のメモリが丸々空くわけだが。


657 :デフォルトの名無しさん:2009/12/11(金) 00:08:18
プログラム本体によるメモリ占有か


658 :デフォルトの名無しさん:2009/12/11(金) 00:09:47
メモリ消費量が多すぎると、早く終われないこともある。

659 :デフォルトの名無しさん:2009/12/11(金) 00:10:47
メモリ開放に手間取るのか

660 :デフォルトの名無しさん:2009/12/11(金) 00:11:21
高速アルゴリズムのオーダーってメモリのことは考慮されてないよね?

661 :デフォルトの名無しさん:2009/12/11(金) 00:12:45
>>659
手間取るよ

662 :デフォルトの名無しさん:2009/12/11(金) 00:21:16
ヒープメモリーを使え

663 :デフォルトの名無しさん:2009/12/11(金) 00:22:47
>>660
お前がそう思うんなら(ry

664 :デフォルトの名無しさん:2009/12/11(金) 00:23:23
ハードウェアのことまで考えるようになったら病気

665 :デフォルトの名無しさん:2009/12/11(金) 00:23:45
まあ俺は最適化に -O1 を選ぶけどな。

666 :デフォルトの名無しさん:2009/12/11(金) 00:24:06
そこは難しいところ

667 :デフォルトの名無しさん:2009/12/11(金) 00:27:11
>>664
ごめんな
俺、末期だ

668 :デフォルトの名無しさん:2009/12/11(金) 00:29:03
入門編のスレで深い話をするなぁ

669 :デフォルトの名無しさん:2009/12/11(金) 00:30:19
× 入門編のスレで
○ 雑談スレで

670 :デフォルトの名無しさん:2009/12/11(金) 00:31:36
>>1
これってさ
初心者、初級者、入門者の区分ってどうなってるの?どういう違いがあるのか分からんわ

671 :デフォルトの名無しさん:2009/12/11(金) 00:32:34
俺は上級者

672 :デフォルトの名無しさん:2009/12/11(金) 00:33:11
別に好きなスレでいいんじゃない?ダメなら誘導するだけだし
このスレはこの板でも勢いがある方だから人が集まってるだけだよ

673 :デフォルトの名無しさん:2009/12/11(金) 00:35:50
初心者……文法を一通り理解している
初級者……小規模(30000行ほど)のプログラムを作成できる
入門者……使用言語のコンパイラの実装ができる

674 :デフォルトの名無しさん:2009/12/11(金) 00:39:57
俺的区分

初心者・・・学校の授業なら初めてのプログラミング授業レベル
       変数とか関数とかサッパリわかんない段階から
       市販の入門書終了までのレベル。基本的なことをほとんど知らない人たち

初級者・・・学校の授業なら次のステップの応用プログラミングの授業レベル
       市販の入門書に書かれていることくらいはマスターしている人たち
       入門書には書かれてない関数やライブラリ、アルゴリズムを学ぶ段階

入門者・・・>>1で上記の人たち以外ということで
       初級者よりは知識を持っているレベル
       だけどCの世界はまだまだ広い。そんな人たちの交流のスレがここ

675 :デフォルトの名無しさん:2009/12/11(金) 00:40:23
今現在ついていけるかどうかはともかく
深い話に興味はなきゃ、お先真っ暗でしょ

今その手で打てるだけのパンチこいや
快勝と惨敗の荒波こそが人を育てる

ハナタレがいつのまにか大先生を追い詰めていく
それがこの国の原動力とでも言うべき泥流だ

676 :デフォルトの名無しさん:2009/12/11(金) 00:41:49
>>675
いや暑苦しいよ、修造みたいな爽やかさもない

677 :デフォルトの名無しさん:2009/12/11(金) 00:42:48
>>673
俺30000行とか経験無いは・・・
最高でも8000行くらいだ・・・

678 :デフォルトの名無しさん:2009/12/11(金) 00:43:51
8000と言ってもCじゃなくVBとJAVAだし・・・Cでは1000行も書いたことないかもしれん

679 :デフォルトの名無しさん:2009/12/11(金) 00:55:21
順番おかしくね?入門が最初だろ。

入門者→準備が済んで学習を始めた段階
初心者→参考書などを学習中の段階
初級者→参考書の学習をひととおり終えていくつかの実用プログラムを組んだ段階

680 :デフォルトの名無しさん:2009/12/11(金) 00:56:15
>>679
それだとこのスレが(´・ω・`)ショボーンになるだろ

681 :デフォルトの名無しさん:2009/12/11(金) 00:57:59
>>679
おまえバカだろ

682 :デフォルトの名無しさん:2009/12/11(金) 00:59:44
具体的なことを言わなくていい話は、いつでも盛り上がるなw

683 :デフォルトの名無しさん:2009/12/11(金) 01:00:39
当たり前だろ。ここは入門スレなのだから

684 :デフォルトの名無しさん:2009/12/11(金) 01:01:10
>>682
それはどこのどんなスレでも同じ
どこのスレも知識豊富なオタクばかりでは無いからな

685 :デフォルトの名無しさん:2009/12/11(金) 01:01:20
ワッショイヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノワッショイ

686 :デフォルトの名無しさん:2009/12/11(金) 01:03:19
つまり入門者ということは
C言語にはどんな環境が必要かとか
自分のPC環境でC言語使えるかとか
C言語開発にどんなソフト必要かとか
どんな入門書や専門書やサイトが使いやすいかとか
そういうのを尋ねるスレってこと?

687 :デフォルトの名無しさん:2009/12/11(金) 01:04:35
入門スレで
入門者バーカ
と言うキチガイ上級者様たち視ねよ

688 :デフォルトの名無しさん:2009/12/11(金) 01:06:40
>>687
節子!それ上級者ちゃう!

689 :デフォルトの名無しさん:2009/12/11(金) 01:07:56
上級者はこのスレに何しに来てるんだ

690 :デフォルトの名無しさん:2009/12/11(金) 01:08:20
それは、説教とか

691 :デフォルトの名無しさん:2009/12/11(金) 01:08:47
>>689
相談に乗ったり
アドバイスするためだろ

入門者同士で語り合って何になるってんだよw

692 :デフォルトの名無しさん:2009/12/11(金) 01:09:05
>>686
学習を始めてるんだから準備は終わってるだろ

693 :デフォルトの名無しさん:2009/12/11(金) 01:10:40
>>691
傷の舐め合いにはなる

694 :デフォルトの名無しさん:2009/12/11(金) 01:16:31
無駄に盛り上がってるな

695 :デフォルトの名無しさん:2009/12/11(金) 01:17:36
寝てもいいですか?

696 :デフォルトの名無しさん:2009/12/11(金) 01:17:48
どうぞどうぞ

697 :デフォルトの名無しさん:2009/12/11(金) 01:18:50
おやすみなさい

698 :デフォルトの名無しさん:2009/12/11(金) 01:51:10
リスト構造とfread/fwrite使って住所録作れって言われたんですけど、いまいちどう使えばいいかわかりません
ポインタの情報ごとファイルに保存するんですか?
それとも読み込んだあとにリスト構造を使うんでしょうか

699 :デフォルトの名無しさん:2009/12/11(金) 01:55:46
ファイルへの読み書きではポインタ情報は関係ないだろ。

700 :デフォルトの名無しさん:2009/12/11(金) 02:27:27
>>698
例えばリストの構造体を

struct interactive_list {
  char name_kana[32];
  char name_kanji[32];
  char address[128];
  struct interactive_list *prev;
  struct interactive_list *next;
} interactive_list;

とするなら、ファイルに保存するのはname_kana、name_kanji、addressの3つだけでいい。
*prevと*nextはプログラム実行のたびに変わる可能性があるので、保存しても無意味。

701 :デフォルトの名無しさん:2009/12/11(金) 02:29:33
>>700
はあ?

702 :デフォルトの名無しさん:2009/12/11(金) 02:49:40
>>701
ん?

703 :デフォルトの名無しさん:2009/12/11(金) 03:04:53
*prevと*nextはかわらなくて、prevとnextがかわるって言いたいのかもよ

704 :デフォルトの名無しさん:2009/12/11(金) 03:07:26
この場合は、ポインタよりもインデックスを使った方がいいかも。
途中のデータの削除後、データを追加したときの仕様をどうするかによって、難度も異なる。


705 :デフォルトの名無しさん:2009/12/11(金) 03:31:13
>>703
なる

>>704
課題でリスト構造といわれた場合は単方向リストでよい場合が多いと思うよ。
双方向リストの場合はそのように書かれる。
というのが俺の経験則だが、どうだろね。

706 :デフォルトの名無しさん:2009/12/11(金) 03:33:27
住所録とやらを整列する必要性は無さそうだな
とにかく継ぎ足していけばよさそう

707 :デフォルトの名無しさん:2009/12/11(金) 04:12:19
ハッシュとツリーに決まってんだろ

708 :デフォルトの名無しさん:2009/12/11(金) 04:17:40
>>706
無さそう

709 :デフォルトの名無しさん:2009/12/11(金) 04:18:34
>>700
住所録なら
名前
住所
電話番号
郵便番号
が妥当

710 :デフォルトの名無しさん:2009/12/11(金) 04:22:11
10年修業してようやく入門の入り口くらいだろ。

711 :デフォルトの名無しさん:2009/12/11(金) 04:26:41
・リスト構造をどこにどのように適用したらよいかわからない
・ファイルへどのデータをどのように保存するのかわからない
これがききたいの?

712 :デフォルトの名無しさん:2009/12/11(金) 04:30:14
不定長のデータをリストにするだろ。
つまり、住所部分。

713 :デフォルトの名無しさん:2009/12/11(金) 04:32:02
誰がうまいことを言えと

714 :デフォルトの名無しさん:2009/12/11(金) 04:39:23
>>711
わからない

715 :デフォルトの名無しさん:2009/12/11(金) 04:40:39
カオスになってきたな
このスレ

716 :デフォルトの名無しさん:2009/12/11(金) 04:44:25
>>698
自由に色々試してみればいい
それでうまくゆかなかったらまたここへ来ればいい
もうすこし日本語整理して質問するといいよ

717 :デフォルトの名無しさん:2009/12/11(金) 04:55:17
>>700以外、誰一人ソースを示さない件w

718 :デフォルトの名無しさん:2009/12/11(金) 04:58:23
ソースだらけのスレとか汚いだけだろ

719 :デフォルトの名無しさん:2009/12/11(金) 05:02:22
宿題スレじゃないからな。

720 :デフォルトの名無しさん:2009/12/11(金) 09:59:12
>>718
あのスレ最悪だよ〜

721 :デフォルトの名無しさん:2009/12/11(金) 12:10:29
>>718
ソースだらけのコロッケも不味いしなw

722 :デフォルトの名無しさん:2009/12/11(金) 12:12:31
それはうまいがな(´・ω・`)

723 :デフォルトの名無しさん:2009/12/11(金) 12:46:31
(´・ω・`) ←これ禁止

724 :デフォルトの名無しさん:2009/12/11(金) 12:48:17
そして以下コロッケ議論禁止

725 :デフォルトの名無しさん:2009/12/11(金) 13:10:12
ハンバーグ派はこれだから

726 :デフォルトの名無しさん:2009/12/11(金) 16:22:38
はいはい
おまえの勝ちだよ
よかったね


727 :デフォルトの名無しさん:2009/12/11(金) 17:01:02
>>723
わかった(´・ω・`)

728 :デフォルトの名無しさん:2009/12/11(金) 17:56:02
>>727
ブフッ∵(´ω(○=(゚∀゚ )

729 :デフォルトの名無しさん:2009/12/11(金) 18:24:53
>>609
%g はときどき予期しない出力を出してくるので、個人的にはいやです。

730 :デフォルトの名無しさん:2009/12/11(金) 18:29:33
>>642
昔は PASCAL 呼び出しっていってましたよね。MS-PASCAL がそうしていたから。
リターンするときにスタックの払い戻しを呼び出され側で処理するんですね。
不定長引数がつかえないなど、仕様としてスタンダードとは思えないのですが、なんでそんな名前になっているのでしょうね。
win16/32 API で採用されているから?

731 :デフォルトの名無しさん:2009/12/11(金) 18:33:56
>>720
え?むしろソースをさらす人しか来ない強者のスレでは?
宿題を書く人はお客様。

732 :デフォルトの名無しさん:2009/12/11(金) 18:36:17
#define WINAPI FAR PASCAL
#define PASCAL _stdcall


733 :デフォルトの名無しさん:2009/12/11(金) 18:37:50
>>730
少なくとも x86 は呼び出された側でスタックを解放する機械語命令が用意されていて
それがスタンダード。他の言語でも大抵そうなってて、C/C++ だけが異端。

734 :デフォルトの名無しさん:2009/12/11(金) 18:38:02
>>722
塩分の取りすぎに注意した方がいい

735 :デフォルトの名無しさん:2009/12/11(金) 18:40:33
unsigned long intってできれば使わない方がいいの?

736 :デフォルトの名無しさん:2009/12/11(金) 18:47:29
なんでそう思ったんだ。

737 :デフォルトの名無しさん:2009/12/11(金) 18:48:16
Why did you think so.

738 :デフォルトの名無しさん:2009/12/11(金) 18:50:02
((o(´∀`)o))ワクワクなんでー?

739 :デフォルトの名無しさん:2009/12/11(金) 18:52:34
What made you think that?

740 :デフォルトの名無しさん:2009/12/11(金) 18:56:09
>>735
まだ?

741 :デフォルトの名無しさん:2009/12/11(金) 19:26:45
よく勘違いされる豆知識
 「自動こそ正義、指定固定は邪道!」

メモリ管理やタスク管理、スレッド管理は自動でやるのが常識!と思ってるバカがいるものだが

OSが自動でやれるからには、その管理領域を食っているのである。


となると、メモリが無駄に食われる。
ユーザーのPCには大容量メモリが載っていると、確証もないことを当てにする素人がよく陥る思考であるが
こういうラクなゆとりに流れるとロクなもんは作れない。


742 :デフォルトの名無しさん:2009/12/11(金) 19:33:40
誰も言わないことをさも言ったかのように言い、
それに対して罵詈雑言を持って反論したかのように振舞う。
いわゆるマッチポンプである。藁人形理論とも言われる。

743 :デフォルトの名無しさん:2009/12/11(金) 21:20:03
スタックに大きなメモリを一度に確保しちゃダメって言ったでしょ!

744 :デフォルトの名無しさん:2009/12/11(金) 21:25:30
ム板でオレ様意見を通そうとするならウィットな一行にマトメろよ
な?

745 :デフォルトの名無しさん:2009/12/11(金) 21:43:03
上級者が湧いてきたか

746 :デフォルトの名無しさん:2009/12/11(金) 21:45:21
聞くこと無いなら黙ってりゃいいのにw

747 :デフォルトの名無しさん:2009/12/11(金) 22:01:11
ハードウェアのことも考えるようになったら一人前

748 :デフォルトの名無しさん:2009/12/11(金) 22:08:48
食べる飯の量は三人前

749 :デフォルトの名無しさん:2009/12/11(金) 22:11:52
結婚してないやつは全員半人前なんだよ!

750 :デフォルトの名無しさん:2009/12/11(金) 22:44:36
MainWindow(QWidget *parent = 0)
関数の宣言でこんなのを見つけました
これって、どういう意味なんですか?

751 :デフォルトの名無しさん:2009/12/11(金) 22:45:08
スレ違いです

752 :デフォルトの名無しさん:2009/12/11(金) 22:47:35
>>750
関数ポインタってわかる?

753 :750:2009/12/11(金) 22:49:13
>>752
関数ポインタの存在は知っていますが、
何に使うのかとかメリットがわかりません

754 :デフォルトの名無しさん:2009/12/11(金) 22:54:24
デフォルト引数はC++なのでスレ違いです。

755 :デフォルトの名無しさん:2009/12/11(金) 22:55:53
スレ違いとかいいつつ
デフォルト引数
というヒントを与えちゃうお前らツンデレだな

756 :750:2009/12/11(金) 22:58:36
>>754
ありがとう、ツンデレさん

757 :デフォルトの名無しさん:2009/12/11(金) 22:59:10
>>751で指摘してもバカには通じなかったから仕方なかったんだろw

758 :デフォルトの名無しさん:2009/12/11(金) 23:23:49
× 食べる量の飯は三人前
○ 食べる飯の量は三人前

759 :デフォルトの名無しさん:2009/12/11(金) 23:27:53
s右から左へ文字列検索する関数無いの?

760 :デフォルトの名無しさん:2009/12/11(金) 23:31:40
自分で作れカスってMSがいってた

761 :デフォルトの名無しさん:2009/12/11(金) 23:40:49
VisualBasicにLikeという文字列を検索してくれそうな関数があった

762 :デフォルトの名無しさん:2009/12/11(金) 23:46:59
strrchr()はあるのに、strrstr()はないんだな。

763 :デフォルトの名無しさん:2009/12/12(土) 00:29:09
セキュアな文書管理システムを作りたいのですが、言語はやはりCでしょうか?

764 :デフォルトの名無しさん:2009/12/12(土) 00:30:39
>>759
探したい文字列をstrrevして、strrevした文字列を、strstrする。


765 :デフォルトの名無しさん:2009/12/12(土) 00:31:36
CとかC++は確かに強力ですが
セキュアに作るにはきわめて高いスキルが必要です^^

プログラムを始める前に、オライリーの
C/C++セキュアプログラミングコックファック Vol.1-3をお勧めします。


766 :デフォルトの名無しさん:2009/12/12(土) 00:33:13
やはり、程遠いですか…サンクスですた。

767 :デフォルトの名無しさん:2009/12/12(土) 00:37:32
セキュアってどういう意味だろう

768 :デフォルトの名無しさん:2009/12/12(土) 00:38:20
ハイレベルすぎてついてゆけない入門者

769 :デフォルトの名無しさん:2009/12/12(土) 00:39:06
いやいや。CやC++で作るのには高いスキルがいるという話であって
たとえばJavaはもっと手軽にセキュアですし、
もっと便利でセキュアなツールとか世の中にはありますにょ。^^

770 :デフォルトの名無しさん:2009/12/12(土) 00:40:07
ちなみに、オライリーの本は↓
http://www.oreilly.co.jp/books/4873112001/
日本語で読める数少ないセキュ本

771 :デフォルトの名無しさん:2009/12/12(土) 01:01:33
上級者用のスレがあるだろw
ふざけるなw

772 :デフォルトの名無しさん:2009/12/12(土) 01:11:24
CやC++でのセキュアプログラミングは上級レベル。
Java、.NET、Flashのような VM 上で動かすことを考えなさい。

773 :デフォルトの名無しさん:2009/12/12(土) 01:34:59
C#に構造体ってなんのためにあるんだろう
クラスだと継承ができるし、いろいろできるから便利じゃね

774 :デフォルトの名無しさん:2009/12/12(土) 01:43:52
メモリの関係とかじゃね?
処理速度が違うとか?

775 :デフォルトの名無しさん:2009/12/12(土) 01:57:24
>>773
記法は似ているが全然違うものだ。
System.Int32 に対する int だと思ってくれ。
前者しかいらないという考えなら、構造体いらない。

776 :デフォルトの名無しさん:2009/12/12(土) 02:29:10
>>773
スレ違いだが、構造体はスタックにのるよ

777 :uy ◆e6.oHu1j.o :2009/12/12(土) 08:51:25
C言語でC++のSTLと同機能のリスト群を実装したいとき
MapStringInt("a",0,"てすと");
これでは代入という意味が構文的に曖昧なので

下のような形式での代入をしたい
A = B
そのまま書くとこうなるが、コンパイルエラーになります
MapStringInt("a",0) = "てすと"
これを、コンパイルエラーにならないように
MapStringInt関数と同名のマクロを以下のように定義したいと思いました
このマクロをどのように書いたらいいのか教えてください
#define MapStringInt(a,b) \


MapStringInt("a",0) = "てすと"
また、このような代入が出来て、なおかつ
printf("%s" , MapStringInt("a",0) );
このような表示も可能なマクロを作ってください


例を挙げると、つまりこういうことに近い
int b;
#define A(a) b
A(1) = 999;
printf("%d" , b);

778 :デフォルトの名無しさん:2009/12/12(土) 10:28:01
>777
MapStringInt の仕様が分からない。何で引数 3 つなの?
あと、文字列の代入というのがもう一段階ハードルを上げてる。
strdup されるの?それとも strcpy?あるいはポインタ値を書き換えるだけ?

なお、仮に、int* MapIntInt_(int key) という関数があって *MapIntInt_(5) = 3 という使い方をするなら
#define MapIntInt(key) (*MapIntInt_(key))
ってすりゃいいだろうね。

779 :デフォルトの名無しさん:2009/12/12(土) 11:38:18
>>777
関数の戻り値は左辺値にはできない。(参照のあるC++なら別だが)
だからCではデータの取得と代入は、get関数とset関数を別々に作るのが普通。
int MapStringInt_get(const char *key);
void MapStringInt_set(const char *key, int data);

もしくは>>778みたいにデータへのポインタを返すようにすれば左辺値っぽく使えるが
使い方をちゃんと明記しないとわかりづらいかも

780 :デフォルトの名無しさん:2009/12/12(土) 11:41:41
http://codepad.org/NUIGnPDO
123456が出力されません。
このサイトのコンパイラの問題でしょうか?

781 :デフォルトの名無しさん:2009/12/12(土) 11:50:45
いいえ、あなたの言語仕様に対する理解度の問題です。

一応ヒントを出すと
ポインタの配列は、多次元配列(配列の配列)とは違います。

782 :デフォルトの名無しさん:2009/12/12(土) 12:06:01
>>780
http://codepad.org/qBVmxxuP

783 :デフォルトの名無しさん:2009/12/12(土) 12:15:06
>>780
int main()
{
int **b;
int a[3][5][6];
a[1][2][5]=123456;
b = (int**)a[1];
printf("%d\n",&a[1][2]);
printf("%d\n",b[2]);
return 0;
}

これでどうなると思う?同じになると思うか?
同じになると思うなら配列とポインタの関係をもう一度勉強しなおそう

784 :デフォルトの名無しさん:2009/12/12(土) 12:16:54
int a[2][3][4]でa[0]とかa[1]をint [3][4]へのポインタに
明示的/暗黙的にキャストできるというのは規格票で定ま
ってること?

785 :デフォルトの名無しさん:2009/12/12(土) 12:34:31
>>733
PASCL : 呼び出され側で RET に引数をつけて 「RET 8 で8 バイト解放」などと呼び出す。
CDECL: POP BP -> BP レジスタの値を SP に代入する。→ RET → mov SP, BP
差があったとしても、果たして何クロック分になるのでしょうかね。

786 :デフォルトの名無しさん:2009/12/12(土) 13:37:03
>784

その宣言では、式の中でのa[0]の型はint(*)[3][4]です。
暗黙でも何でもない。

int a[10];
という宣言でa[0]の型はintになるのと同じ。

787 :デフォルトの名無しさん:2009/12/12(土) 13:44:46
>>784
こことその前後をよく読んで理解すべし
http://www.kouno.jp/home/c_faq/c6.html#3

788 :デフォルトの名無しさん:2009/12/12(土) 13:45:11
int a[10];

int*a; a=(int*)calloc(10,sizeof(int));


789 :787:2009/12/12(土) 13:47:10
ちゃんと規格の参照箇所も書いてある。

あ、型Tというのは、それが配列型であっても当然当てはまる。

790 :デフォルトの名無しさん:2009/12/12(土) 14:10:03
>>785
他でやれ!

791 :デフォルトの名無しさん:2009/12/12(土) 14:17:36
ループ内でreturnしてもいいの?

792 :デフォルトの名無しさん:2009/12/12(土) 14:18:34
条件を満たすまでループ、条件を満たしたらreturn

793 :デフォルトの名無しさん:2009/12/12(土) 14:46:35
>>785
普通は、returnよりも、callが多いので、callが軽いことには意味がある。
また、PASCALコールの方がアセンブラから呼びたすときわかりやすいという理由もあった。
そのほか、後ろの引数から積んでいかなければならないというのも、嫌われる理由。

794 :デフォルトの名無しさん:2009/12/12(土) 15:08:31
>>793
もういいです。

795 :デフォルトの名無しさん:2009/12/12(土) 15:13:15
>>793
なるほど。参考になりました。


796 :デフォルトの名無しさん:2009/12/12(土) 15:19:17
>>793
callとreturnは、同じなんじゃないか?
callのほうが多いって、callしっぱなしで戻ってこないケースが
たびたびあるってこと?

797 :デフォルトの名無しさん:2009/12/12(土) 15:21:37
>>796
一つの関数はたいがい複数回呼ばれるから

798 :デフォルトの名無しさん:2009/12/12(土) 15:24:15
>>797
「軽い」ってのは実行時の話じゃなくて、コードの量のこと?


799 :798:2009/12/12(土) 15:33:00
上のほうみたら「クロック」って言葉を使ってるから、
やっぱ「軽い」ってのは、実行時間のことだよな。
そりゃコードとしては、callのほうが多いだろうけど、
実行回数はcallもreturnもおんなじじゃないの?

800 :デフォルトの名無しさん:2009/12/12(土) 15:46:40
>>788
キャストすんなうぜえ

801 :デフォルトの名無しさん:2009/12/12(土) 15:49:51
>>798
違う

802 :デフォルトの名無しさん:2009/12/12(土) 16:57:33
>>800
暗黙の型変換至上主義?

803 :デフォルトの名無しさん:2009/12/12(土) 17:03:34
暗黒の肩淫乱異常手技

804 :デフォルトの名無しさん:2009/12/12(土) 19:06:30
>>800
暗黙神拳奥義?

805 :デフォルトの名無しさん:2009/12/12(土) 19:10:56
SetClipboardViewer APIを使って簡単なクリップボード拡張プログラムを作ってます
初回起動時にクリップボードの内容が取得できないことがあります
わかっているのはファイル名を指定して実行でCLIPBRD.EXEを起動後にソフトを起動したら正常に内容が取得できます
クリップボードチェインが取得できないときはMessageBox APIでエラーを通知するようにしているのですがエラーも出ないで起動するときがあります
クリップボードの中身はテキストなのですが、クリップボードの内容が取得できない原因として何が考えられますか?


806 :uy ◆e6.oHu1j.o :2009/12/12(土) 19:35:28
>>777
すいません引数の数間違えました

>>778
Cでは関数を二つに分けてしまうんですね
よくわかりました ありがとうございます

807 :デフォルトの名無しさん:2009/12/12(土) 19:52:06
>>805
スレ違い。
こっちにでもどーぞ。

ttp://pc12.2ch.net/test/read.cgi/tech/1259478896/l50

808 :デフォルトの名無しさん:2009/12/12(土) 20:13:35
>>800
C ならば void * はどのポインタ型にも代入できるから、キャストはいらない。でもC++ では必要だったかと。

809 :デフォルトの名無しさん:2009/12/12(土) 20:29:26
C++ なら malloc calloc なんか使うなよ。

810 :デフォルトの名無しさん:2009/12/12(土) 21:52:21
ホンマは、プログラマというのはソースコードだけ書ければいいのではない。

・そのソースコードの何がどう最適化されるか
・出来上がったプログラムはスタックにどう乗るか
・CPU内部での動きはどうか


これを頭に描けないやつは、所詮テキトーな半人前。
これが分からないと、人に教える教育側には回れない。
スタックがブチ壊れているのはデバッガで分かっても
どこで壊れたのか分からないなど無様なことになるからだ。

811 :デフォルトの名無しさん:2009/12/12(土) 21:53:05
うっうっうっううー。


812 :デフォルトの名無しさん:2009/12/12(土) 21:58:43
ほんもののプログラマとは何か
どっからどこまで半人前か
みたいな主観的な定義なんかどうでもいいから技術教えれ

813 :デフォルトの名無しさん:2009/12/12(土) 22:05:10
ソースコードのレビューでスタックオーバーフローとか見抜けない奴は(この仕事を続けるのは)難しい

型の不一致とかポインタで境界外にアクセスしようとしてるとか分かっても
実際にどうなるからヤバいのか、ということまで頭の中でシミュレートできないやつはノーサンキュー。

814 :デフォルトの名無しさん:2009/12/12(土) 22:07:45
しかし世の中はそんなノーサンキュープログラムでいっぱい

815 :デフォルトの名無しさん:2009/12/12(土) 22:15:21
ホンマのプログラマーとは

たとえ世の中の全員が100PBのメモリを積むようになったとしてもメモリ使用量を1ビットでも削れるなら削る
たとえ世の中の全員が10GHzのCPUを積むようになったとしても実行時間を削れるだけ削るためにifを減らす
ソースを見たら頭の中でシミュレートでき、その結果は実際にコンパイルしたものと100%相違がない
これくらいええやろ、これでチェック十分 などとバッファを甘く見ない

これである


816 :デフォルトの名無しさん:2009/12/12(土) 22:17:58
時代遅れ

817 :デフォルトの名無しさん:2009/12/12(土) 22:19:05
その前にPvsNP問題を解決してください

818 :デフォルトの名無しさん:2009/12/12(土) 22:27:25
>>815
この文体はオッサンやな
それも頭の固い

819 :デフォルトの名無しさん:2009/12/12(土) 22:28:31
プログラマなら言いたいことはソ−スで示すべき。
偉そうにゴタク並べる口だけPGほど信用できないものはない。

820 :デフォルトの名無しさん:2009/12/12(土) 22:33:11
printf("ホンマのプログラマーとは

たとえ世の中の全員が100PBのメモリを積むようになったとしてもメモリ使用量を1ビットでも削れるなら削る
たとえ世の中の全員が10GHzのCPUを積むようになったとしても実行時間を削れるだけ削るためにifを減らす
ソースを見たら頭の中でシミュレートでき、その結果は実際にコンパイルしたものと100%相違がない
これくらいええやろ、これでチェック十分 などとバッファを甘く見ない

これである");

821 :デフォルトの名無しさん:2009/12/12(土) 22:40:28
ファイルからの読み込みとかを練習してます


fgets(str,20,fp)

ネット上から引用しただけなので、この引数の意味がよく解りません
この場合の
strは、ここに一時的に格納
20は、読み込む文字数or20ビット
fpはわからん

これで合ってますか?
よく解らないので正しい知識を、どうか教えてください

822 :デフォルトの名無しさん:2009/12/12(土) 22:43:38
>>821
まずはC標準関数のリファレンスを何でもいいから読めとしか……

823 :デフォルトの名無しさん:2009/12/12(土) 22:46:21
>>815
最初の二つはネタでしょ。そんなことするなという例。
三つ目、意味不明な文であるが、いまどきのコンパイラは元のコードが想像できないような最適化をしてくることがあるので100%は無理。
四つ目、バッファを使うよう場合には、普通カプセル化する。

824 :デフォルトの名無しさん:2009/12/12(土) 22:47:23
>>821
http://www9.plala.or.jp/sgwr-t/lib/libtop.html

825 :デフォルトの名無しさん:2009/12/12(土) 22:49:37
カプセル化とか…まだいんのかよC++厨は

826 :デフォルトの名無しさん:2009/12/12(土) 22:52:24
>>825
じゃあ、関数化する。

827 :デフォルトの名無しさん:2009/12/12(土) 22:55:21
C言語でもカプセル化はできるよ

828 :デフォルトの名無しさん:2009/12/12(土) 22:57:15
>>821
> fpはわからん
> これで合ってますか?

合ってるわけないだろう常識的に考えて

829 :デフォルトの名無しさん:2009/12/12(土) 23:03:57
>>827
じゃあOOP厨で

830 :798:2009/12/12(土) 23:11:13
>>821
googleで「manpage 関数名」でググれば、リファレンスはでてくるよ。
manpage fgets()とか。

でも、なんか入門書買って、それにのってるソース打ち込んで
動かすとかしたほうが近道だと思われ。

831 :デフォルトの名無しさん:2009/12/12(土) 23:11:25
はい、わたしはOOP厨です

832 :デフォルトの名無しさん:2009/12/13(日) 01:19:41
質問なのですが、一通り基礎を勉強し、いざ練習問題を解こうとしてもどうやってコードを書けばいいかわからず、しかし答えを見たら納得できるという状況が多々あります。
こういう場合は発想力が足りないからなのでしょうか?または基礎がまだ固まっていないからなのでしょうか? 曖昧な質問で申し訳ないです。

833 :デフォルトの名無しさん:2009/12/13(日) 01:21:43
それでいいよ。答えみてパターンを覚えとけ。

834 :デフォルトの名無しさん:2009/12/13(日) 01:22:26
サンプルコード打ち込んで実行しないでただ教科書読んだだけだったりしない?

835 :デフォルトの名無しさん:2009/12/13(日) 01:25:11
>>832
知ってる語句とイディオムが足りてないんだと思います。
ただ関数の機能を覚えるだけでなくて、実際にどう使われているか、
そして実際に自分で使ってみることで自分の血肉にする作業が
私には不可欠でした。

836 :デフォルトの名無しさん:2009/12/13(日) 01:28:25
・アルゴリズムとデータ構造
・他人の書いたプログラムのソースコードを読む

837 :デフォルトの名無しさん:2009/12/13(日) 01:30:11
>>832
まず練習問題を読んでコードを考える
判らない場合、構わないので、答えを見て、よく読み、理解する
理解したら、答えを伏せて、もう一度その問題を読んで、白紙の状態から考え、コードを書き出す
書けないなら理解が足りないので、もう一度答えを読み、何が理解できてなかったのか、その部分をよく理解する
理解したら、答えを伏せて、もう一度その問題を読んで、白紙の状態から考え、コードを書き出す
以下白紙から答えを書けるまでループ
あとはたくさんやって色んなパターンを覚える

838 :デフォルトの名無しさん:2009/12/13(日) 01:35:08
int *p=new int[n]ってやってn+1個目が欲しくなったらどうすればいいの?

839 :デフォルトの名無しさん:2009/12/13(日) 01:35:25
スレ違い

840 :デフォルトの名無しさん:2009/12/13(日) 01:37:14
ゴメン

841 :デフォルトの名無しさん:2009/12/13(日) 01:39:53
口より手を動かせ

842 :デフォルトの名無しさん:2009/12/13(日) 01:54:14
手が書き方覚えるまで入力&コンパイルだな

843 :デフォルトの名無しさん:2009/12/13(日) 01:57:39
言語の習得とアルゴリズムの習得は別だからな。
文法だけ覚えても書けないよ。


844 :デフォルトの名無しさん:2009/12/13(日) 02:07:26
string $a1[] = `print $b`;
//結果:2ch1
となった場合、2ch1に1を足して
2ch2を変数に入れるにはどうしたら良いですか。

質問が分かりにくくてゴメンナサイ
エスパーな人教えて下さい

845 :デフォルトの名無しさん:2009/12/13(日) 02:13:15
>>844
根本的なことを訊くが、それはC言語なのか?

846 :デフォルトの名無しさん:2009/12/13(日) 02:14:40
言いたくても言えなかった

847 :デフォルトの名無しさん:2009/12/13(日) 02:16:11
違うのれす(^q^)

848 :デフォルトの名無しさん:2009/12/13(日) 02:36:49
数学の問題も扱うが数学とは決定的に異なる点
「コードに完成は無い」
「完成は、書き直しの始まり」
書き直し書き直しの連続

849 :デフォルトの名無しさん:2009/12/13(日) 02:41:20
甘いな

850 :デフォルトの名無しさん:2009/12/13(日) 03:32:38
トウガラシを混ぜれば?

851 :デフォルトの名無しさん:2009/12/13(日) 04:36:16
答えが合ってればそれでよいという点では数学と同じだよ。
エレガントな解法を求める点でも同じだね。

852 :デフォルトの名無しさん:2009/12/13(日) 09:22:01
答えがあってればそれでいいのはどっちかというと物理じゃないのか?

853 :デフォルトの名無しさん:2009/12/13(日) 10:12:21
エレガントさと効率は両立しない場合が多々あるからなあ。

854 :デフォルトの名無しさん:2009/12/13(日) 10:16:06
どうしてエレガントなのか何度も何度も問うてみたい
どうみてもエレファントの解放でしかないんだが

855 :デフォルトの名無しさん:2009/12/13(日) 10:31:43
100 0
5 6
40 50
74 75

こういうデータをファイルから1行ずつ読み取った時に、
左側と右側の数字を比較するにはどうすればいいですか?

856 :デフォルトの名無しさん:2009/12/13(日) 10:37:11
>>855
比較演算子を使えばいい

857 :デフォルトの名無しさん:2009/12/13(日) 10:37:21
一行ずつ読み取るってのがfgets()で読むってことなら、
sscanf()で変換すれば?

858 :デフォルトの名無しさん:2009/12/13(日) 11:42:38
strtol(), strtoul(), strtod()を使う手もある

859 :デフォルトの名無しさん:2009/12/13(日) 11:46:43
可読性的に100%でも実行効率的に40点のコードを読むのはつらい
可読性0%でも実行効率100%のコードを読むほうが遥かに楽しいし、ためになる

860 :デフォルトの名無しさん:2009/12/13(日) 12:17:33
>>833-837

お答え頂いてありがとうございます。
とりあえずパターンの習得を進めていきたいと思います。

861 :デフォルトの名無しさん:2009/12/13(日) 12:24:13
>>856-858
ありがとうございます
とりあえず調べた感じ、出来そうな
857さんの言った事をやってみます

862 :デフォルトの名無しさん:2009/12/13(日) 12:59:29
どうしても分かりません
単純挿入ソートは単純選択と単純交換ソートとアルゴリズム的にどのように違いますか?

比較回数が少ないのかも教えて頂きたいです

863 :デフォルトの名無しさん:2009/12/13(日) 13:32:06
>>861
あっそ。俺が教えたのは試さないんだね。ふーん。

864 :855:2009/12/13(日) 13:39:47
>>863
うるさい黙れ

865 :デフォルトの名無しさん:2009/12/13(日) 14:13:06
また成りすましのアホが湧いた

866 :デフォルトの名無しさん:2009/12/13(日) 14:22:29
質問スレではよくあること

867 :デフォルトの名無しさん:2009/12/13(日) 16:55:04
上級者が湧くよりはマシ

868 :デフォルトの名無しさん:2009/12/13(日) 18:20:42
printf("sriop per second:%lu\n", (unsigned long int)count / (timeB - timeA));
countをunsigned long int、timeBとtimeAをdoubleで宣言しているのですがその場合これじゃ
まともな結果はでないのでしょうか?

869 :デフォルトの名無しさん:2009/12/13(日) 18:22:50
doubleなら%f

870 :デフォルトの名無しさん:2009/12/13(日) 18:24:16
(unsigned long int)count / (timeB - timeA)
型だけ書くと
(unsigned long int) / (double - double)
-> (unsigned long int) / (double)
-> (double) / (double)
-> (double)
printf()がdoubleのものを無理矢理unsigned longとして取り出そうとしている

871 :デフォルトの名無しさん:2009/12/13(日) 18:26:19
%luに合わせたいなら(unsigned long int)(count / (timeB - timeA))

872 :デフォルトの名無しさん:2009/12/13(日) 19:36:05
成り済ましのアホ == 自称上級者

873 :デフォルトの名無しさん:2009/12/13(日) 20:48:46
(char *)malloc(sizeof(char))の(char *)ってどういう意味でしょう?

874 :デフォルトの名無しさん:2009/12/13(日) 20:50:39
キャラポインタ型に変換

875 :デフォルトの名無しさん:2009/12/13(日) 21:01:02
別に変換しなくても使えますよね?
どういう意味があるんでしょう

876 :デフォルトの名無しさん:2009/12/13(日) 21:05:44
これが、void* じゃなくて char* だってことを知ってもらうため。

877 :デフォルトの名無しさん:2009/12/13(日) 21:06:46
変換せずに使って問題が起きたらデバッグして調べればいいよその方が頭に入るよ

878 :デフォルトの名無しさん:2009/12/13(日) 21:10:43
コンパイラに怒られます

879 :デフォルトの名無しさん:2009/12/13(日) 21:12:56
キャストしなくても怒られないし、問題も起きない

880 :デフォルトの名無しさん:2009/12/13(日) 21:17:04
warning のレベルを上げよう。まさか、これをvoid*型変数へ代入しているということはないよな?

881 :デフォルトの名無しさん:2009/12/13(日) 21:22:23
キャストすんなうぜえ

882 :デフォルトの名無しさん:2009/12/13(日) 21:24:07
>>880
上げたら出たの?

883 :デフォルトの名無しさん:2009/12/13(日) 21:25:16
(char *) → (void *) キャストしろ。
 
(void *) → (char *) キャストするな。
 


884 :デフォルトの名無しさん:2009/12/13(日) 21:25:47
キャストしないやつは池沼

885 :デフォルトの名無しさん:2009/12/13(日) 21:35:32
#define NULL ((void *)0)

あとは解るよな?

886 :デフォルトの名無しさん:2009/12/13(日) 21:37:17
Cである限りWarningのレベルをいくら上げても警告でないよ。
仕様どおりだし、何もあいまいではないし。

887 :デフォルトの名無しさん:2009/12/13(日) 21:40:40
あ〜疲れた。風呂入ってくるね。

888 :デフォルトの名無しさん:2009/12/13(日) 21:41:40
>885
int execlp(const char *file, const char *arg, ...);
に対して
execlp(command, commmand, arg1, arg2, NULL);
とかやって馬鹿にされるんですね、わかります

889 :デフォルトの名無しさん:2009/12/13(日) 21:50:52
怒らないコンパイラ使ってるんだ

890 :デフォルトの名無しさん:2009/12/13(日) 22:04:13
>>888
キャストしない奴は池沼

891 :デフォルトの名無しさん:2009/12/13(日) 22:52:17
decという変数名って、何に使われますか?
十進法とかってこれで始まりますか?

892 :デフォルトの名無しさん:2009/12/13(日) 22:53:57
decimal

893 :デフォルトの名無しさん:2009/12/13(日) 22:54:18
>>891
ないから

894 :デフォルトの名無しさん:2009/12/13(日) 22:54:21
>>892
それです。
ありがとうございました。

895 :デフォルトの名無しさん:2009/12/13(日) 22:55:19
decimal
decrement
decode

896 :デフォルトの名無しさん:2009/12/13(日) 23:00:26
decaple

897 :デフォルトの名無しさん:2009/12/13(日) 23:07:31
Data East Corp.

898 :デフォルトの名無しさん:2009/12/13(日) 23:35:29
charもwchar_tも結局ただの固定長整数ですよね?
ということはC言語側からすれば文字コードという概念は無く
文字列はただの整数の配列でしか無いということでいいんでしょうか?

899 :デフォルトの名無しさん:2009/12/13(日) 23:38:22
整数の配列でしか無い

900 :デフォルトの名無しさん:2009/12/13(日) 23:39:16
>>898
C言語に限らず、内部では0か1の羅列だよ。

901 :デフォルトの名無しさん:2009/12/13(日) 23:44:37
そうなると文字コードの判別もどこかに判別用のデータを保存するか、統計から判断するしかないわけですね。うえーめんどくさい
そういえばソースコードのリテラル文字列は文字コードどうなってるんでしょうかね?

902 :デフォルトの名無しさん:2009/12/13(日) 23:48:37
日本語の判定テストレポート

対象ソフト。
universalchardet-1.0.3 http://code.google.com/p/juniversalchardet/
icu4c-4_2_1 http://site.icu-project.org/
nkf-2.0.9 http://sourceforge.jp/projects/nkf/releases/
libguess-0.2.0-d7 http://www.honeyplanet.jp/download.html

対象サンプル。
一部文字化けを含むネット上ニュースまたはwindowsXPのバイナリファイル。
個数 バイナリ 2300、 UTF8 5200、 SJIS 4100、 JIS 3800、 EUC-JP 2000

速度。
libguessがもっとも速くこれを1としたときの比較。 ICU 185、 nkf 30、 universalchardet 10

正解率。
libguess 0.99971(5個)、 ICU 0.9996(6個)、 nkf 0.998567(25個)、 universalchardet 0.969221(537個)

まとめ。
libguess( 関数 guess_jp)とnkfは日本語限定の判定。 
ICUとuniversalchardetは判定可能な全ての言語での判定。
ICUは一致率60未満でバリナリと判定しこのとき4つのバイナリが西ヨーロッパ言語、2つのEUCが中国語となった。中国語と判定されたケースはもともと漢字が多く言語判定ではICUがもっとも正確といえる。
nkfの25個はSJISをバイナリと誤認した。universalchardetは、バイナリを言語、言語をバイナリなど間違えるケースが多発した。
日本語限定であればlibguess。 世界各国語が対象なら判定速度は遅いがICUがいい。

903 :デフォルトの名無しさん:2009/12/13(日) 23:55:29
>>901
コンパイルオプションで指定できるコンパイラもある
決め打ちで固定されていて指定できないコンパイラもある

904 :デフォルトの名無しさん:2009/12/14(月) 02:38:36
memcpy関数は
memcpy(void *dst, const void *src , size_t n)になってる。
第二引数がconstになっているが、普通にバッファ間転送をやるのはどうすればいいの?


905 :デフォルトの名無しさん:2009/12/14(月) 02:48:34
>>904
第二引数がconstになっていることでバッファ間転送に不都合がある例が思いつかないんだが。。

906 :デフォルトの名無しさん:2009/12/14(月) 06:56:28
RunesusのM16ではmemcpyでバッファ間転送はできない。エラーは出ないが
コピーできない。


907 :デフォルトの名無しさん:2009/12/14(月) 06:59:04
906の記述は間違いかも。
ただしくは 「ICE動作ではOKだが、ROMに焼くと動作しない。」
sprintfなどもconstになっているが、これを使うとROM焼きすると
全く動作しない。



908 :デフォルトの名無しさん:2009/12/14(月) 09:04:47
どうして動かなくなるんでしょう?
ROMだから書き込む処理書いて動かないというなら分かるのですが、
constなら、むしろread onlyの意味で良さそうな気がするのですが。

909 :デフォルトの名無しさん:2009/12/14(月) 10:21:52
ROM領域とRAM領域でアクセスの仕方が違うのかな?
セグメントを切り替える必要があるとか

910 :デフォルトの名無しさん:2009/12/14(月) 11:11:00
RAM → RAM のブロック転送のコードのつもりなのに
const 付きのポインタは ROM 領域からの参照 ってコンパイラ/リンカがマッピングしちゃって
ROM → RAM 呼び出ししちゃってる みたいな感じで

※ 上記のケースでセグフォしないのかな?

911 :デフォルトの名無しさん:2009/12/14(月) 11:21:01
ICEとか見ると軍曹かと思ってしまう

912 :デフォルトの名無しさん:2009/12/14(月) 11:28:01
そりゃC自身の問題じゃなくて、コンパイラかランタイムのバグですね。

913 :便:2009/12/14(月) 11:55:27
問題です。
元金、単利と複利の利率に対して、次のものを求めるプログラムを作成しなさい。

* 30年後の残高。
* 30年以内に複利の残高は単利の残高を上回るか。
上回るならば何年後か。

このプログラムがわかる人は教えてください。





914 :デフォルトの名無しさん:2009/12/14(月) 11:57:57
自分でやれ。

915 :デフォルトの名無しさん:2009/12/14(月) 13:01:23
単利:預金 = 元金 + 元金 × 利率 × 年数
複利:預金 = 元金 × (1 + 利率)^年数

916 :デフォルトの名無しさん:2009/12/14(月) 13:14:24
>>913
エクセル使えよカス

917 :デフォルトの名無しさん:2009/12/14(月) 14:52:20
/*入力された文字数をカウントするプログラム*/
#include <stdio.h>

int main(void){

int i;
char str[80];

printf("文字列を入力してください->");
gets(str);/*配列に文字を格納する*/

for(i=0; str[i] != '\n'; i++);/*文字列のカウント*/
printf("入力された文字数は%dです。\n",i);
return 0;
}

このプログラムが上手く動きません。
for(i=0; str[i] != '\n'; i++);
のところがおかしいみたいなんです。
誰か教えていただけませんか?

918 :デフォルトの名無しさん:2009/12/14(月) 14:58:47
for(i=0; str[i]!='\0'; i++);

919 :デフォルトの名無しさん:2009/12/14(月) 15:09:48
strlen

920 :デフォルトの名無しさん:2009/12/14(月) 15:10:21
>>918
有難うございました....orz

921 :デフォルトの名無しさん:2009/12/14(月) 15:15:42
>>919
出来合いの関数を使うのもありですね。

922 :デフォルトの名無しさん:2009/12/14(月) 15:55:15
>>921
ですね。

923 :デフォルトの名無しさん:2009/12/14(月) 16:52:28
プログラマを薄給でこき使うのが楽なのでおすすめしますよ

924 :デフォルトの名無しさん:2009/12/14(月) 18:11:09
>>923
同意!

925 :デフォルトの名無しさん:2009/12/14(月) 18:12:42
アマグラマだろ

926 :デフォルトの名無しさん:2009/12/14(月) 18:15:50
だれがアナグラマムルじゃ!!!ぼけ!!!
しねねえええ!!!!!!!!

927 :デフォルトの名無しさん:2009/12/14(月) 18:16:55
>>923
例えば>>918はどれくらいの価値があるの?

928 :デフォルトの名無しさん:2009/12/14(月) 18:21:24
>>927
負の価値。

929 :デフォルトの名無しさん:2009/12/15(火) 02:11:19
>>926
ちんたらやってるお前にアナグラマムルはありえんよなぁ

930 :デフォルトの名無しさん:2009/12/15(火) 07:03:47
ROM->RAMへはスコンパイラ任せにしないで自分でforコピーしたほうがいい

931 :デフォルトの名無しさん:2009/12/15(火) 08:14:47
c言語でメモリの総容量やCPUの速度を調べる方法、ご存知の方おりませんか?

932 :デフォルトの名無しさん:2009/12/15(火) 08:19:30
API

933 :デフォルトの名無しさん:2009/12/15(火) 11:12:33
メモリの総容量ってのは難しい問題でして、
仮想メモリが流行ってる昨今、実際の搭載メモリ量以上にメモリを確保できたりしますし
CPUの速度ってのも難しい問題でして、
最近のCPUは状況に応じて速度を変えたりしますし

934 :デフォルトの名無しさん:2009/12/15(火) 11:56:09
/procみたらわかるよ

935 :デフォルトの名無しさん:2009/12/15(火) 13:18:16
プログラムが実行中かどうかを調べる方法をご存じのかたいらっしゃせんか?

936 :デフォルトの名無しさん:2009/12/15(火) 13:21:32
プログラムは常に実行中です
プログラムを実行しなければ、その調べる方法とやらを実行することもできません

937 :デフォルトの名無しさん:2009/12/15(火) 13:30:02
ba-ka

938 :デフォルトの名無しさん:2009/12/15(火) 14:45:50
>>935
常に動いているであろうosに聞くのが一番です

939 :デフォルトの名無しさん:2009/12/15(火) 15:06:40
>>935
説明不足。もっと細かく質問いなさい

940 :デフォルトの名無しさん:2009/12/15(火) 15:09:43
実行時に/tmp以下にファイルでも作って、
多重起動かどうかを調べたり、するかもしれない。

941 :デフォルトの名無しさん:2009/12/15(火) 15:14:23
多重起動を知りたいのか
他のアプリケーションの実行状態を知りたいのか


942 :デフォルトの名無しさん:2009/12/15(火) 15:20:58
電源の状態を知るAPIはありますか?

943 :デフォルトの名無しさん:2009/12/15(火) 15:23:26
多重起動防止なら、mutex使う。普通のosならある。

944 :デフォルトの名無しさん:2009/12/15(火) 15:25:58
>>942
OS書いてそのOSのスレで聞く。

945 :デフォルトの名無しさん:2009/12/15(火) 15:32:15
psとかtopのソース入手できれば、他のプロセスの情報取得の方法とか
わかるだろ?

946 :デフォルトの名無しさん:2009/12/15(火) 15:48:08
口ではなんとでも言えるね

947 :デフォルトの名無しさん:2009/12/15(火) 15:55:59
最近の質問C言語と関係ないのがおおいぞ。

948 :デフォルトの名無しさん:2009/12/15(火) 18:00:19
質問です。
晩御飯にチャーハンを作る予定です。
何分炒めればよいのでしょうか?
ご教示ください。

949 :デフォルトの名無しさん:2009/12/15(火) 18:00:57
20分

950 :デフォルトの名無しさん:2009/12/15(火) 18:44:23
とりあえず


ハードウェアの状態を調べるのにOS越しでしか問い合わせられないやつはクソである。

メモリのことならメモリコントローラにアクセスすればよい。


951 :デフォルトの名無しさん:2009/12/15(火) 18:52:52
ポインタというのは、

宣言時
 int *P; /* これはint型のポインタPだよ */

使用時
 P;   /* これはint型ポインタPのアドレスだよ */
 *P;  /* これはint型ポインタPのデータだよ */

で、いいのですか。いつどんなときでも、*をつければデータを表し、つけなければアドレスを表すのですか。

952 :デフォルトの名無しさん:2009/12/15(火) 18:59:43
>>951
正確には違うが、初心者はそれで問題ない。

953 :デフォルトの名無しさん:2009/12/15(火) 19:03:17
違う場合とはどんなものですか。

職場のソースで

int* ptr;
int src;
int dest;




ptr = dest;

というのがあるので、なぜアドレスに値をいれられるのかまったく分かりません。

954 :デフォルトの名無しさん:2009/12/15(火) 19:04:42
>>951
つけたかつけてないかじゃなくて、個数も考えたい。

int **p; // intへのポインタへのポインタ

のとき、*pはintへのポインタだし、**pは、intだ。

955 :デフォルトの名無しさん:2009/12/15(火) 19:05:49
>>953
そのソースを書いたやつを首にしてください

956 :デフォルトの名無しさん:2009/12/15(火) 19:08:20
ポインタを指す位置を進める場合は、アドレスじゃなくて値を進めるのが紛らわしい。

957 :デフォルトの名無しさん:2009/12/15(火) 19:12:19
ただのC言語だと、ポインタもINT型変数もない。
ただわかりやすさのため書いてるが
結局アドレスも実態はただのINT型数値
C++じゃ厳密になってるので無理

int x=100;
int *p=x;
こんなことも可能。
このあと*p=500;
とか書くと、アドレス[100]を500にしろ
というとんでもないことができる。

958 :デフォルトの名無しさん:2009/12/15(火) 19:12:59
>>953
志村、それバグっとるよw

ptr = &dest; // int型変数destの「アドレス」を代入
*ptr = dest; // ptrが指す場所にあるint領域へ、destの値を代入

どっちかになるとオモ。最初の部分がタイプミスでなければ。

959 :デフォルトの名無しさん:2009/12/15(火) 19:35:53
 int *p;  /*  *pはint型だよ */
 int **p;  /*  **pはint型だよ */
 int ***p;  /*  ***pはint型だよ */


960 :デフォルトの名無しさん:2009/12/15(火) 20:07:13
>>950
ユーザプロセスが?
ハードウェアに?
ばかなの?

>>957
入門以前の人が嘘を並べて惑わせるスレじゃないんだが。

961 :デフォルトの名無しさん:2009/12/15(火) 20:16:01
ユーザーがメモリコントローラにアクセスできない理由がどこにあるのか。
OSを通さないのに。

32bitOSで4GB以上のメモリを積んだとき、メモリマップできない以上のメモリを
RAMディスクとして用いるアプリがある

どうやって実現していると思っているのか。
そもそもメモリ管理はOSしかできないことか。

962 :デフォルトの名無しさん:2009/12/15(火) 20:19:06
そりゃOSだって結局BIOSに要求出してるわけだからな。
BIOSの制御構造がわかってれば直接制御できるだろう。

963 :デフォルトの名無しさん:2009/12/15(火) 20:21:40
そのBIOSも、Cとアセンブラで書かれているので
ますますもって出来ない理由がない。

そもそも誰も出来なかったらBIOSは存在し得ない。
BIOSが存在しなかったらOSもない。
だいたいコンピュータ自体成立しない。

964 :デフォルトの名無しさん:2009/12/15(火) 20:25:59
>>960
何がウソなのかkwsk。
単にキミがC言語とC++の違いを把握できてないだけだと思うけど。

965 :デフォルトの名無しさん:2009/12/15(火) 20:26:01
ウイルスやマルチユーザが無い性善説が通用した時代ならそれでよかったさ

966 :デフォルトの名無しさん:2009/12/15(火) 20:28:25
OSってのは、言ってみれば「勝手に色々面倒見てくれる仲立ちソフト」
みたいなもん。
ハードウェアと、俺らが作る上っ面の仲立ちをしてくれる。
でも程度の差こそあれ、俺たちが通常作るソフトウェアであることには変わりない。
なら、OSができることは、「同じことをしてやれば」俺たちも出来る

ってことだ。

967 :デフォルトの名無しさん:2009/12/15(火) 20:32:12
それをさせないように、ユーザモード、カーネルモードというものがある

968 :デフォルトの名無しさん:2009/12/15(火) 20:34:15
>>967
その仲立ちのため、アプリケーションソフトウェアが勝手にメモコンまで手を出されては困るので、
WindowsやUnixなどでは、アプリからは手を出せないようにしている。そこは役割分担。

「同じことをしてやれば」は、こっちもOSを作ればという意味でなら、その通りだ。

ちなみに、RAMディスクはカーネルモードで動くデバイスドライバ。
アプリケーションと同じ扱いではない。

969 :968:2009/12/15(火) 20:35:07
ごめん、>>966宛だった。

970 :デフォルトの名無しさん:2009/12/15(火) 20:35:19
なんで俺の方につっこみ入れるんだ

971 :デフォルトの名無しさん:2009/12/15(火) 20:35:51
CPUの仕様書見りゃ、メモリコントローラ内蔵のものであれば
アクセスする方法が書かれているな。
ここのレジスタにアクセスしてページングせえよ、横と縦のアドレス得ろや、
そういうことが書いてあるからCなどアドレッシングが楽な言語で書くと。
アセンブリソースを別オブジェクトにしてJAVAでやってもいい。遅いが。

972 :デフォルトの名無しさん:2009/12/15(火) 20:36:43
馬鹿に何を言っても無駄だなこりゃ

973 :デフォルトの名無しさん:2009/12/15(火) 20:43:24
ドライバってなんだと思う?
俺らが書くような、普通のアプリケーションみたいなものなんだよ。
ただ、それはハードウェアを制御するアプリケーションという「ような」ものであって。
大したもんじゃない。

例えばCPUのレジスタEAXに1を書き込むとメシを作ってくれるとしよう

EAXに1か0を書き込むソース(関数)が、デバイスドライバだ。

ソースにしたら、
int input_to_EAX(char input)
{
 EAX = 1;
}

これでデバイスドライバになる。
大したもんじゃないだろ
何も特別なことをしていない。

で、デバイスドライバを呼び出すときに使われるのがAPI
これもさっきの、EAXに1か0を書き込むだけの関数を呼び出すためだけのもの。

int Go_to_da_kitchin(char input)
{
 input_to_EAX(char hogera);
}

これでAPIだ
アクセスする関数があるなら直にユーザーに使わせりゃいいのに、
それだとなんか不都合があるらしい。

974 :デフォルトの名無しさん:2009/12/15(火) 20:46:39
デバイスドライバを書いたことがあるかどうか知らないが、

「すごく高度な、大層なもの」というイメージを持ってるやつがいる。

大間違い。
単にデバイスのレジスタにアクセスして、値を取ったり入れたりしてるだけ。
デバイスはレジスタに値が入れば動くような設計になっていることが多い。
ただ、そこに対して値を入れているだけ。
ソフト的にはどう入れるか、OS的にはどちら側で動くかが問題なのであって、
やってることは大したことじゃない。

以上で述べたような簡単過ぎるコードだって然るべき側で動かせば立派に動く。
メシを作ってくれるCPUがあるならば、だが。

975 :デフォルトの名無しさん:2009/12/15(火) 20:50:25
僕はまだ入門者なので素直にドライバ書ける人は尊敬する
このスレにはいますか?

976 :デフォルトの名無しさん:2009/12/15(火) 20:54:00
つまり、ルートキットやバックドアは正しい事なんです。
って事だよな。

977 :デフォルトの名無しさん:2009/12/15(火) 20:54:53
まあ画像を出すのは面倒だわな。
ピクセル単位でのデータのやり取りになるから、制御も複雑になっていく。

でも、自分ちで自分が試すぶんには面白いものだ。

978 :デフォルトの名無しさん:2009/12/15(火) 20:55:17
制御もらうときに制限かかってるだろ。
x86 ならリングレベルというものがある。
一般アプリではなんでもかんでもできるというわけじゃない。

979 :デフォルトの名無しさん:2009/12/15(火) 20:59:31
>>973
不都合がある「らしい」じゃなくて実際あるから。
マルチタスクOSでは、複数アプリから同時に要求が来たときの調停をこなさないといけない。
そんなことアプリを作る度に考えるのはやっていられないので、OSとデバイスドライバの仕事になった。

逆に、>>957だって組込ならとんでもないなんてことはない。よくある光景。
あとC++でもキャストすれば使える。

980 :デフォルトの名無しさん:2009/12/15(火) 20:59:53
必ず1回だけしか回らないループ ってどう書いてる?
途中でbreakを使いたいだけのとき

そんなループ書くくらいならgoto使った方がマシなのかなぁ

981 :デフォルトの名無しさん:2009/12/15(火) 21:03:38
ifやそのネストではだめ?

982 :デフォルトの名無しさん:2009/12/15(火) 21:04:33
>>980
goto を使う

禁止されているときは do{ 〜 }while(0);
それも禁止なら関数化して途中で return

983 :デフォルトの名無しさん:2009/12/15(火) 21:05:45
>>980
そういう用途で break を使うと、break される条件が switch 文になったり、ループの中に入ったときに発見しにくいバグになる。
私は、goto を使うべきだと信じている。


984 :デフォルトの名無しさん:2009/12/15(火) 21:05:54
つーかifだろ

985 :デフォルトの名無しさん:2009/12/15(火) 21:06:25
俺んとこはドライバ内でスレッドセーフだから、直に使われても
どってことないようになってる。
世の中のドライバ全部が全部そうであるとは言わないがロックくらいはしてんだろ
ドライバ内でもリソースの取り合いなんかザラにするわけだし、
ドライバであるから並行してどうこう、にはならない。

そういう意味でちょっとAPIの存在意義に疑問。

986 :デフォルトの名無しさん:2009/12/15(火) 21:08:59
gotoってや
「絶対使うな」って風潮どっから来たのかねえ。

そういうふうに言ったとされる人物、Edsgerなんちゃらってのも
「私は絶対使うなとは言ってない」なんて釈明するザマだし。

987 :デフォルトの名無しさん:2009/12/15(火) 21:11:37
(´・ω:;.:...

988 :デフォルトの名無しさん:2009/12/15(火) 21:12:56
CPU固有のI/O制御命令、ポートマップI/Oの制御命令なんかもそうだが
「普段見慣れない命令」が入ってると、ここで何かやってる!てのが分かりやすい。
適切に使われているgotoもそうだが、読みやすいコードになると思う。
エラー起きてるのが分かりきってんのにグダグダやってんじゃねえ、ってときもそうだが
わざわざbreakとかで戻らす意味を感じない。

989 :デフォルトの名無しさん:2009/12/15(火) 21:14:29
個人で使う個人のプログラムなら好きにすりゃいいじゃん
こっちは仕事でやってんだよ

990 :デフォルトの名無しさん:2009/12/15(火) 21:17:57
>>980
逆switch-case みたいな構文が欲しいと?

991 :デフォルトの名無しさん:2009/12/15(火) 21:18:33
>>989
自称プログラマー乙

992 :デフォルトの名無しさん:2009/12/15(火) 21:18:47
ドカタ乙


993 :デフォルトの名無しさん:2009/12/15(火) 21:19:47
gotoの何がいやかってラベルが必要なところ
できればラベルは書きたくない
breakでぬけられるってことは多重ループ脱出でもなさそうだし
ifとか関数にするとかでどうにかなんないの?

994 :デフォルトの名無しさん:2009/12/15(火) 21:19:49
gotoなんかは問答無用のジャンプだから、どこ見ればいいか何をしてるのか一瞬で分かるからな
俺は好きだな

995 :デフォルトの名無しさん:2009/12/15(火) 21:25:02
basicでgotoの嵐みたいな書き方がはやったからじゃないの

996 :デフォルトの名無しさん:2009/12/15(火) 21:49:39
ioccc に良いのがあったな。
確か goto カウンターだったかな。

997 :デフォルトの名無しさん:2009/12/15(火) 23:35:04
へえ

998 :デフォルトの名無しさん:2009/12/15(火) 23:40:54
組み込み系初心者です。

#define HOGE ((volatile unsigned int *)(0x3FFFC020))


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

999 :デフォルトの名無しさん:2009/12/15(火) 23:43:53
次のスレ
http://pc12.2ch.net/test/read.cgi/tech/1260888175/


1000 :デフォルトの名無しさん:2009/12/15(火) 23:45:00
1000げと

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

195 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)