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


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

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



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

91 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 22:54:05 ]
階乗こそ単純ループで十分で再帰にする必要なんてないんだが。

92 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 23:00:41 ]
無向グラフの経路探索とか再帰使わないと面倒でやってられんけど

93 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 23:01:26 ]
>>89
ディレクトリをおりていく処理とか、ループで書くとめんどくさいだろ。

94 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 23:12:27 ]
>>91
教材的な意味だろ

95 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 23:46:11 ]
教材としてあげるにしても、せめてユークリッドの互除法とか、フェボナチ数列(など漸化式)とかが出てこないものか

96 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 23:47:17 ]
再帰関数の教材ならハノイの塔の問題を解く奴が好き

97 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 23:56:03 ]
他人のコードで見つけるとループに書き換えられないかと難癖付けてみたくなる要素
自コードと同じスタックでライブラリ的利用させてもらう場合特に

98 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 00:55:01 ]
組み込み系だと、変数を取れるキャパが決まってたりして
「お、スタックが空いてる再帰でなんとかしろ」とかあるよ

99 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 01:18:44 ]
>>89
再帰だとシンプルに書けるものはたくさんある。
もちろんスタックオーバーフローには注意が必要だけど、
プログラマの差ってのはこういうところから来るんだと思う。

例えば、テキストファイルの行を逆順に出力する(いわゆるtacコマンド)
を作ろうとすると、再帰だとこんなにシンプル

#include <stdio.h>
void rev()
{
   char buf[1000];
   if(fgets(buf, 1000, stdin) != 0) {
       rev();
       fputs(buf,stdout);
   }
}
main() {
   rev();
}



100 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 01:21:16 ]
>>99
再帰関数で大きな自動変数の配列を使うのはナシだろ

101 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 01:25:22 ]
なにこの制限だらけのtac

102 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 01:50:03 ]
>99
これは再帰の悪い例としていつか使わせてもらう

103 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 02:14:39 ]
>>再帰
文字列の中から、正規表現によって単語検索をする場合、正規表現の文字列の並びを、配列から、一旦、順序木の構造に変換してしまって、
木のノードを順番に辿りながら、文字列を検索していくと、一連の検索を、共通の操作であつかえて簡単だとおもいます。

たとえば括弧で囲まれて1まとめになった複数条件も、あるノードの子としてまとめて、”あるノードの子というひとまとまりの単位”であつかえるので、
たとえば単純な ”A" という条件も、複雑な ”[AかBかC]”みたいな括弧で囲まれた条件も、どちらも同一の「”このノード”を使って検索する」という操作で扱えます。
これが再帰を使って得られる簡単さという恩恵だと思います。 簡単に素直にするために再帰を使うんだと思います。

たとえば括弧に囲まれた複数文字も、囲まれてない単一文字も、どちらも同じように考えて検索できるのだから、
木がどんなに複雑な形をしてても、逆にどんなに単純な形だとしても、
どちらも同じ要領で「”このノード”を使って検索する」という共通の操作だけで最後まで処理できます。

この順序木を巡っていくという操作を、単一のループだけでやろうとすると、
「さまざまな形の木を想定」して、それぞれに専用の動作を書いたりするケースが出てきやすいと思います。
(たとえば "A"の場合と "[AかBかCか]"の場合とでの動作の違いを、「わざわざ専用に用意」しないといけいない。などのメンドクササ。
これがループだけでやる場合のメンドクササだと思います。)


だけど、純粋に繰り返しの処理速度だけでみれば、やっぱり for ループみたいなモノの方が優れてるような気がします。よく知りませんが。
普通はループで十分事足りるので、たとえば「シンプルな int[1000] の配列全部に0を代入する」だけのことに、わざわざ再帰を使う必要は無いと思うし、
無理やり再帰なんか使ったら、逆に、わかりづらくなるだけだろうし、わかり辛いとミスも増えますし。

あたりまえですけど、「より簡単に、より素直に書ける方」を選んで使えばいいだけのことかとおもいます。どっちも便利だとおもいます。

104 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 04:41:46 ]
Cの場合、非再帰で記述(スタックを自前で構築ってのは
この場合反則になるんで)できる位の力量が無いのに
再帰(間接再帰を含む)を使いまくったコードを書くと
後で地獄を見る可能性も視野に...

105 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 05:08:48 ]
>>104
よく分からん縛りだけど
人に強要するのは勘弁してね

106 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 05:11:09 ]
ライブラリ、長く使うものに再帰はないな。
どこがスタック積まれるか判らないし、スタックオーバーフローもいつ起こるか特定できない。

107 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 07:41:46 ]
>>99
逆順にならない。

108 名前:107 mailto:sage [2010/03/08(月) 18:48:09 ]
失礼、行を単位に逆になるという意味だったんですね。ちゃんとうごきました。

109 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:51:24 ]
1行毎に1000バイトずつスタックに積むとか使えない。
手元にあるテキストは、1行当たり数キロバイトとか逆に数十万行とか普通にあるんだが。
まぁ発想方法としては、悪くないんだけどね。



110 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:58:51 ]
一行読んで、それを連結リストで繋いでおく方がいいな。
それでもファイルサイズが大きすぎると面倒だけど。
tacコマンドは、ファイルの末尾にseekしてから表示しているな。
seekできないストリームに対しては、テンポラリファイルにコピーしてから。
まあちゃんと読んだわけではないから詳しくは知らないけど。

111 名前:デフォルトの名無しさん [2010/03/08(月) 20:21:44 ]
Cと直接関係してる質問じゃないけど
ソースを見れる形でファイルを上げれるcodepadのようなアップローダって他にある?
なんか似たような感じで見やすいところがもう一つあった気がするんだけど

112 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:27:44 ]
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
ここ?

113 名前:デフォルトの名無しさん [2010/03/08(月) 20:32:06 ]
いや、もっと企業がやってるようなオシャレな感じで掲示板では無かったんだけど。
codepadみたいにソースが表示されてdownloadボタンが付いてる感じで

114 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:35:20 ]
gist.github.com/
ここ?

115 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:44:11 ]
おおそれだ、探しても見つかんなかったんだありがとう。

116 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:44:29 ]
言われてから探して見つけてきたけど

117 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:52:01 ]
アップローダとか無駄なキーワード入れてたのが駄目っだのかな・・

118 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:54:14 ]
codepadの類似サービスだから一緒くたに紹介されてると思って、はてブでcodepadと検索したら出てきた

119 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 21:41:02 ]
#include <stdio.h>
void rev(void)
{
  char *buf;
  if ((buf = malloc(sizeof(char) * 1000)) == NULL) {
    fputs("memory allocate error.", stderr);
    exit(1);
  }
  if (fgets(buf, 1000, stdin) != 0) {
    rev();
    fputs(buf,stdout);
  }
  free(buf);
}

int main(void) {
  rev();
  return 0;
}

これでいいですか?



120 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 21:55:53 ]
malloc()で動的に確保しても、領域計算量が大きければ意味なし。

121 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:27:03 ]
最近も再起なんて使う?みたいなレスを見たなぁと思ったら図書スレでか
まぁこの手の話題は定期的にあがるもんだけど

122 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:28:31 ]
C言語って難しいんですか??


123 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:30:22 ]
難しいの定義による。

124 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:30:22 ]
>>122
わかれば簡単だと思うよ

125 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:30:56 ]
>>122
文法自体はかなり簡単な部類
ポインタで躓かなかったらな

126 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:32:03 ]
英語とかって、出来てたほうがいいですかね??

127 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:33:37 ]
>>122
難しいともいえるしやさしいともいえる。

低機能の言語なので、文法自体はシンプルで覚えることは少ない。(やさしい?)
低機能の言語なので、なんかやろうとするとめちゃくちゃ手間がかかる。(難しい?)

128 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:39:03 ]
>>126
出来た方がいいに決まってるが、
そんな質問するアホには必要ない。

129 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:39:54 ]
>>126
読みやすいプログラムはそれ自体英文として読めるプログラムだから(俺流の解釈)
読みやすいプログラムを書くためには英語は必要。

英語のできない人が書いたプログラムは大変。

CにしてもJavaにしても英語圏の産物なんだな。



130 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:54:34 ]
プログラミング言語は、アルファベット使うけど英語じゃなくて数学に近いな

131 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:24:31 ]
>読みやすいプログラムはそれ自体英文として読めるプログラムだから

こんなこというやつの変数や関数は長くてむかつく

ReadDataFromUserFileToImageBuffer()

みたいなやつ
あるいはアンダーバーでつなげてみたりして
今時補完機能があるからへいきだろう、とか言い出してさ

>読みやすいプログラムを書くためには英語は必要。英語のできない人が書いたプログラムは大変。

こういうこと言うやつは俺がnamaeみたいな変数とかyomikomi()みたいな関数作ると怒り出すよな
いいじゃん、日本人なんだから日本語にしただけで読みずらくなったりしないよ

と見ず知らずの129にすげえむかつく

132 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:26:24 ]
英語できないやつのプログラムは、
childs とか serch とか、ありえないスペルミスがあって、読みにくくてかなわん。

133 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:26:40 ]
いや読みにくいから

134 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:26:53 ]
>>131
日本語があやふやなお前が言っても説得力は無い


135 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:42:49 ]
俺が普段書くスクリプトなんて一文字変数、スペースけちって詰め詰めばっかりだよ

136 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:44:49 ]
SQL?

137 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 02:41:32 ]
>>131
ReadDataとToImageBufferが意味的にかぶってない?
UserFileというのもちょっと。
ReadImageFromFileじゃだめかい?

英文として読めるように、というのはよくある指針だね。

138 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 03:58:43 ]
RiyousyaFileKaraGazouBufferHeYomikomi()
とか書かれたらキレそう

139 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 05:21:39 ]
プログラムが正しく動作して、開発スタート時に決めた関数の命名規約
(※腐ったルールだとしても)を遵守しているなら、あまり気にしないレベル



140 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:16:23 ]
>>137

そうそう、こういう人
上記のやうは例じゃん、適当に作ったさ
それにたいしてまで、こんな事言ってくる
そういう点がむかつくんだって事

ReadImageFromFileじゃだめじゃん
長々と英文を関数名にしてるやつが居るよねって例としては短すぎる
ここは多少英語としておかしくても長くして置かないと駄目

141 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:17:31 ]
JISYO のように複数のローマ字方式をミックスしたり、
JYOHO のような適当ローマ字で書かれているのを見るとためいきが出る。

142 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:32:31 ]
readdata
readdata2
readdata3
readdataEX
readdataEX2

みたいにされるのもむかつく、混在してたりするとさらに

143 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 08:15:36 ]
とりあえず読みにくいのはお断り

関数名は英語とローマ字のどちらかに統一されていれば気にしない
混在してるとイラッとくるが

144 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 08:17:50 ]
>>140
シンプルだが単語のせいで長くなる場合は仕方ない
i18nのようにごまかすのもいいけど、やりすぎはよくない
複数の意味を含めた名前になるのならそれは関数化が足りない

145 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 10:05:36 ]
つかもともとCは単語を略す文化だよね

intもcharもbufだってそう
memcmpとかやっちゃうし

昔の本とかのソース見るとインデントもあって目を細めると螺旋模様のように見える
今のソースはBASICのようにブロック並べたみたい

146 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 10:09:31 ]
スパゲティコードより読みにくいという説もあるいわゆるうねりコードですね

147 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 10:35:16 ]
文化じゃなくて制限。creatとか今思えばひどいもんだよね
端末に表示できる文字数の問題もあったし、環境に合わせてその辺は変化していってもいいと思うんだ

148 名前:デフォルトの名無しさん [2010/03/09(火) 11:45:10 ]
Visual C++ 2008 Expressで1から勉強を始めたいのですが
ソリュージョンのディレクトリの作成はオンにするのとオフにするのはどちらがよろしいのでしょうか?

参考に2つのサイトを見て勉強したいと思います
苦C 9cguide.appspot.com/p_vc2005.html
猫  homepage2.nifty.com/c_lang/net2005/project.htm

苦Cでは特にオフにしろとは書かれてなく、猫のほうはオフにしろと書かれてましてオンとオフどちらにしたらいいのか分かりません

149 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 11:58:44 ]
すべてローマ字で書くことに決めたとしても、簡単なカタカナ語をどうするか悩む
どうしてもrisutoと書かなきゃいけないのか、listにしちゃいけないのか
そして無意識のうちにlistと書いちゃってコンパイルエラー



150 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 12:00:28 ]
>>148
両方やってみて違和感が少なかったほうにすればいいよ

151 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 12:01:36 ]
あ、気に入らなかったらフォルダごと捨てれば大丈夫だから、神経質にならずにためせばいいよって意味も含んでるよ
最初は確かにいろいろそわそわしたなぁと思い出したので追記

152 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 12:25:15 ]
ありがとうございます
オフにしてやってみます

153 名前:デフォルトの名無しさん [2010/03/09(火) 12:26:20 ]
> 読みやすいプログラムはそれ自体英文として読めるプログラムだから

COBOL 屋かてめーわ

154 名前:デフォルトの名無しさん [2010/03/09(火) 13:52:42 ]
他人のコードを改造しているんですが
コードの量が大きいので一つの変数の型を変更するとそれに関連するものを変更する作業が大変です。
例えばint型だったものを制度をよくしたいのでdouble型に変えたとします。
それに関連する関数の戻り値や引数、代入される変数等、膨大な数になってしまいます。
なにか自動で型を変換する方法ってありませんか?

155 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:09:54 ]
typedefしておけばいい

156 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:33:17 ]
理解力がなくてすみませんがtypedefでどう解決するのでしょうか?

157 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:42:44 ]
全部変えてしまうのは、まずいだろ
見ながら1こ1こかえるしかねーべ、そういうものとあきらめて

158 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:47:01 ]
mozillaではパーザで構文木作ってそれを木の変換技法を使って自在に書き換えするっていうのを
javascriptで作って、それをコードメンテに使ってるみたい
dehydraとかいうやつだっけか

159 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:08:52 ]
検討の例えで整数変数を実数に入れ替えにしてるのは

釣りかい?



160 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:14:02 ]
んだなぁ
(x == y)みたいなのは、型を変えただけじゃだめだしなぁ
結局>>157しかないな

161 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:21:18 ]
たとえばビット演算を使っていたりしたらアルゴリズムから検討する必要が出てくるので
自動でやるのはとても不可能だろうなあ。

162 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:22:10 ]
   , -‐−-、  ヽ∧∧∧ //  |
.  /////_ハ ヽ< 釣れた!> ハ
  レ//j け ,fjlリ / ∨∨V ヽ  h. ゚l;
 ハイイト、"ヮノハ     //   |::: j  。
  /⌒ヽヾ'リ、     //     ヾ、≦ '
. {   j`ー' ハ      // ヽ∧∧∧∧∧∧∨/
  k〜'l   レヘ.   ,r'ス < 初めてなのに >
  | ヽ \ ト、 ヽ-kヾソ < 釣れちゃった!>
.  l  \ `ー‐ゝ-〈/´   / ∨∨∨∨∨∨ヽ
  l     `ー-、___ノ
  ハ   ´ ̄` 〈/‐-、

163 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:32:51 ]
すいません、苦Cの事を一通り覚えた後は何をしたらいいでしょうか?

164 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:35:48 ]
>>163
アルゴリズムとデータ構造が少ない希ガス

165 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:41:12 ]
コマンドラインで動作する素数判定プログラムprimeを作っているのですがうまくいきません。
コマンドラインオプションでの整数取得・切り分けがうまくいかないです。
助言お願いします。

166 名前:154 mailto:sage [2010/03/09(火) 16:59:15 ]
多くのレスありがとうございます。
全intをfloat(double)に変換するとか強引な方法をとってはダメでしょうか?

167 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 17:04:35 ]
駄目かもしれないしOKかもしれない
なんでそんなことわかるの?

でもきっとコンパイルエラーがわんさか出るだろうな

sprintfとかの辺とかビット演算の辺とかまずそう
switch文とかもまずそう
サイズをsize_tじゃなくてintでやってるところとかあればまずそう
戻り値をintでエラーで分岐してたらまずそう

168 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 17:04:56 ]
ダメだって書いてあんだろーが

169 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 18:19:45 ]
#include <stdio.h>
void hack(void){
printf("実行可能\n");
exit(0);
}
void func(void){
int iArray[2];
iArray[4] = (int)hack;
}
void main(void){
func();
}

VC++のDebugで、
どうしてこれが実行できてしまうのでしょうか?



170 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 18:42:09 ]
そういう風にできてるから

171 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 18:44:52 ]
>>165
つ codepad
瞬殺でアドバイスが得られると思います。

172 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:15:01 ]
運がいいから

173 名前:165 mailto:sage [2010/03/09(火) 19:53:43 ]
素数判定ではなく素因数分解factorでした
ttp://codepad.org/ESKYLo9R

うまい具合に引数を整数にしたいです。
例えば、
factor 123451234512345
のときも動いてほしいです。

OSはwindows vistaでコンパイラはgcc、バージョンは
gcc version 3.4.5 (mingw-vista special r3) です。
その時のint型(4bytes)の上限は +2,147,483,647 (10桁)です


174 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 20:23:07 ]
>>173
gmp みたいな多倍長整数ライブラリを使う

175 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 20:40:07 ]
引数は整数になってると思うけど桁数を増やしたいって話?
20桁未満ならgccはlonglong使えるんじゃないか

176 名前:165 mailto:sage [2010/03/09(火) 21:15:02 ]
>>174
試してみます。

>>175
桁数を増やすのと、

例えばint型を使っていて、
引数argv[1]がその上限を超えたときに
エラーにしてくれるようなチェック方法を知りたいです。


177 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 21:45:35 ]
>>176
コマンドラインオプションの解析は getopt(3)でいいんじゃない?
自分で判定するのは面倒でしょ。

パラメタを整数にするのも、strtol とかstrtoll あたりでいいかと。
上限超えたらどうなるかは、man 見れば載ってると思う

178 名前:デフォルトの名無しさん [2010/03/09(火) 23:12:10 ]
ヘッダファイルで

#define RED 1
#define BLUE 2
.....

#define YELLOW 100

と数百個定義しているのですが(全部定義しているわけではない)
結構順番を入れ替えます.そこでインクリメンタル的なものをつかえないかと思っているのですが,
よい方法ございますでしょうか?

よろしくお願いします.


179 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 23:14:01 ]
enum



180 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 16:36:16 ]
ヒープメモリとスタックメモリって読み書き速度に差はあるの?

181 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 16:37:55 ]
>>180
スタックは頻繁にアクセスされるためCPUキャッシュに乗った状態の可能性が高い

182 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:09:32 ]
スタックもヒープも物理的に差はない。
C言語がやりくりする一定値のメモリがスタック。OSに問い合わせしないので解放取得が速い。
ヒープはOSに問い合わせる。
スタックもプログラム開始時にOSに問い合わせて取得する。
OSはこの二つの違いは認識しない。使われていなければ、スタックでもページアウトする。

183 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:12:31 ]
100Mとか多めに確保したヒープにランダムアクセスしたら遅くなるが
確保できたとしてスタックでも同じ程度の速度。
はじめに一定値を確保してあるか無いかの違いだけ。

184 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:13:31 ]
スタックはメモリプールという機能と同じってこと。

185 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:28:47 ]
Windowsを初め、比較的新しいOSではスタックも追加確保
されるる時にOSに問い合わせます。

186 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:31:37 ]
XPはスタックオーバーフローするが。
vistaからはそうなったか。

187 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 18:12:17 ]
>>185
OSが許容するスタック上限値よりずっと低いスタック量で
プロセスを起動しても、行儀の良いプログラムだったら
問題がないんでそうしてるわけですね。
少し「仕事をする」(再帰とか使ってたり、ローカル変数に
配列とか大量に確保する)プログラムだったら当然それでは
足りないからスタックオーバーフローする。そのタイミングで
OSはスタックを追加してプロセスを停止させず続行するわけ
です。

188 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 18:30:49 ]
OS的には、変数は極力グローバル変数に確保し、再帰を使わない
プログラムであることを望んでいるというわけですね

189 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 18:43:30 ]
OSはスタック追加などしないぞ。OSから見たらカタックとヒープの違いはない。
MS-DOS Windwos3.1では区別はあったとおもうが。
Windwos3.1はスタックの固定領域を指定して使い切ったら駄目だった気がする。



190 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 19:00:26 ]
MS-DOSにおいて、カーネルを含むプログラムの実行に確保できるメモリ空間(コンベンショナル・メモリ)は8086のアドレス空間の最大1MBである。
ほとんどのコンピュータでは、この空間にBIOS ROMやメモリマップドI/O、VRAMなどの空間も存在するため、
アクセス可能なメモリ空間は最大でも640KBから768KB程度であった。
ただし、バンクメモリやEMS、プロテクトメモリ(80286/386以降)等のコンベンショナルメモリ以外の領域・手段の利用が一般化していたため、
「貴重な」コンベンショナルメモリがこれらの領域によって圧迫されることはなかった。

日本語入力用のFEPなどの常駐型のデバイスドライバを使用すると一度に使用できるユーザーメモリはさらに減少するため、
ユーザーはEMSやXMS、HMAやUMBなどの拡張メモリの管理機能を利用して、
辞書や常駐部やMS-DOSシステムの一部をそれらへ配置し、コンベンショナルメモリの圧迫を少しでも避けることが重視されるようになった。

「とりあえず動く」という状態を作るだけであればエンドユーザーがこれらを直接操作する必要はほぼ無かったが、
「とりあえず」に飽き足らず無駄を省き最適な設定をするためには知見と試行錯誤が要求されるある種の職人芸的な資質が要求されたため、
これらの事情が「MS-DOSの環境設定は非人間的で困難なものであった」とする後世の評価を招く原因ともなった。
MS-DOS - Wikipedia

191 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 19:32:23 ]
XPでもコンベンショナル・メモリのような設定あるんだがな。
デスクトップアプリケーションヒープ、非対話型サービスヒープの設定可能。
ここ変えないといくらメモリふやしても、メモリ不足改善しないことある。






[ 続きを読む ] / [ 携帯版 ]

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

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