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

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でもコンベンショナル・メモリのような設定あるんだがな。
デスクトップアプリケーションヒープ、非対話型サービスヒープの設定可能。
ここ変えないといくらメモリふやしても、メモリ不足改善しないことある。

192 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 20:22:20 ]
Win3.1の場合、8086向けのコンパイラを若干改造した
もので生成出来るコードでGUIアプリが作れるという
のが基本設計
8086ではスタックの動的変更を行う一般的
方法のCPUアーキテクチャーレベルのサポートは
殆ど無いしコンパイラでもサポートしている例は
皆無。

193 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 20:26:14 ]
おまえは勘違いしている。
スタックというのは、OSから見たら特別な領域でない。
スタックとヒープというのは、C言語(その他)から呼ばれているだけ。
どっちもOSに合わせたメモリ取得関数を呼び出して確保する。同じもの。

194 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 20:30:58 ]
昔のOSは区別してあった領域があるかもしれないが
いまのメモリ確保はどれ使っても、OSレベルでは結局は一通りのメモリ確保しかないだろ。
レジスタとかGPUとかは別。

195 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 20:39:53 ]
>>179
ありがとうございました.
うまくいきました.

196 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 21:20:04 ]
暴れてる長文バカも
同じくらい環境依存なのに
startupコードやセクションの話になるとサクッと黙るんだよな

197 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 23:15:37 ]
>>193
WindowsはCPUレジスタそのものを管理しないって?
んなことない。ないからこそ他のプロセッサ向けに移植
されていない。初期のWinNT(4.0まで)はプロセッサ
が今のように分化してないから対応できたんだろうが
さすがに無理になってしまって現在はIntel以外は非対応

198 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 23:19:13 ]
レジスタやGPUメモリは専用命令で扱えるが
スタックとヒープを区別して扱う命令はない。
OSではこれらの差はない。

199 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 23:19:18 ]
おっとMovail (CE)とかは上位レイヤーや言語インターフェース
の互換性があるだけでメモリアーキテクチャーはIntel版とは全然違ってると考えたいね。HD非搭載なマシンでも動作させる必要がある
わけだから違って当然だけど

200 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 23:25:22 ]
入門スレであまり難しい話しないでよ



201 名前:デフォルトの名無しさん [2010/03/10(水) 23:33:17 ]
>>197
alpha とかサポートやめた主な理由は商業的なことで
儲かるとなれば技術的な問題はどうとでもなったはず

202 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 01:06:16 ]
>>198
何を根拠にそういうこと言い切っちゃうの?

OSが無い環境もあるし、物理的にアクセス速度が違うメモリに振り分けられることもあるだろう。
結局は環境を絞らないと何も言えない。

203 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 02:11:18 ]
Javaならどうだろうか?

204 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 02:36:13 ]
Intelと一口に言っても、x86/x86-64とIA-64はまったく別物だしね。

205 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 02:55:40 ]
CPUが特殊命令持っていて、スタック動作を速くすることが出来たとしても
それが付いてないCPUでも、スタック、ヒープメモリは使えないといけない。
これより、C言語のスタックとヒープはソフトウェアとしての用語。

206 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 02:58:52 ]
コンパイラの実装次第だがWindowsXP以降では、
スタックもヒープも同一のメモリ確保関数を使っているだろう。
すべてのコンパイラを知っているわけではないが。
CPUレジスタやCPUキャッシュのみをスタックに使う実装も出来ないことはないけど
ないんでは。

207 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 03:24:29 ]
「スタック処理支援命令が付いていないプロセッサなどCPUと
呼んではいけない」
という意見には必ずしも賛成ではないが、付いていることを
前提とするかしないかでは、OSのカーネル開発の開発者の
集団力学には大きな影響が発生し、それがOS全体に
作業環境全体に与える影響力は計り知れず、スタック支援命令が
ついたプロセッサ上のOSしか知らない俺にとっては
とてもじゃないが反対だとも言えない。

208 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 04:07:46 ]
ハードウェアのスタック機能と、C言語のスタックとヒープは
名前と動作は似ていても別物。
C言語のスタックメモリは複雑だろ。auto変数や関数呼び出しや再帰とか。
ハードウェアの機能に丸任せできないだろ。

209 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 04:14:51 ]
>>181で答え出てるのにまだ続けるのか

210 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 04:23:33 ]
C言語に限らずプログラミングで頻繁に出現する
データ構造の総称的名称としてのスタックやヒープと
CPUが決定する「具体的な」ものとでは使われる
コンテクストが全く違うだろうな(特に範疇性)
同じ用語を用いていてもコンテクストが全く異なる
ので同じコンテクストで使われていると決めつける
と何かと混乱の原因になりやすい鴨



211 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 04:48:24 ]
文字列が数値かどうか判定するのにisdigitを使うと
マイナスや小数が誤判定されてしまいますが
これらも正しく数値と判定させるためには自前で関数用意するしかないのでしょうか。

212 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 04:52:39 ]
>>211
isdigitは数字かどうかを判定する(一般には)マクロ
なんで、数値かどうかの判定を一発でするのは
無理
受け取った文字列をsscanf等で数値に直したものを
人の目を通して確認してもらうのが一番
0.9994242123123232132という文字列を数値
に直したのを表示させた時に
0.9994242123123456789
となった場合にそれが問題なのかどうかは状況に
依存。

213 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 05:41:48 ]
>>211
atoiやatof等で不満なら自作するしかないね。

214 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 06:01:50 ]
レスどうもです。
sscanfだと"1xyz"みたいに先頭だけ数字の文字列も数値として通ってしまうなぁ・・
と試行錯誤してたらatofで完璧でしたどうもありがとうございます。

215 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 06:10:06 ]
とおもったらatofでもやはり先頭が数字だとだめでした;;

216 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 06:32:11 ]
>>208
べつに、auto変数や再帰や関数の引数で特別なことはやっていないし C 言語のスタックメモリが複雑とも思えませんけれども。

217 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 07:00:12 ]
>>215
じゃぁ、自作だね。
チェック関数だけ書いて後はatofに流すのが無難かなっと思うけど
用途や目的次第なのでお好きにどうぞ。

218 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 13:54:53 ]
>>215
#include<stdio.h>

double get_value(const char *str)
{
double value;
int n;

if(sscanf(str, "%lf%n", &value, &n)==1)
{
if(str[n]=='\0') return value;
}
return -1.0;
}

#define TEST(str) printf("[%s]=%f\n", str, get_value(str))

int main(void)
{
TEST("0.12345");
TEST(" 0.12345");
TEST("0.12345 ");
TEST("1xyz");
return 0;
}

219 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 15:01:30 ]
素直にstrto{l,ul,d,f,ld}を教えてやれよ

220 名前:デフォルトの名無しさん [2010/03/11(木) 18:54:28 ]
スレチかもしれませんが
detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1137870116
これ、答えて下さいませんか?



221 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 18:56:35 ]
>>220
スライドショー フリーソフト でggrks

222 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 19:57:20 ]
断片化対策にこういうことってやっていいの?
サイズ違うのにキャストしても大丈夫かな?

void *my_allocate(size_t size)
{
    return malloc(size / 4 * 4 + 4);
}

void my_deallocate(void *address)
{
    free(address);
}

int main(void)
{
    char *pc = (char *)my_allocate(sizeof char);

    *pc = 'c';

    printf("%c", *pc);

    my_deallocate(pc);

    return 0;
}

223 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 20:05:17 ]
>>222
多いのは大丈夫
不足するのはダメ

224 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 21:59:52 ]
>>222
4バイト単位で大きさ調整しても意味なさそう。

225 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:24:21 ]
その式だと、最初から4の倍数だった時、必要なサイズより4バイト大きくなってしまう
普通はビット演算を使うと思う
(size + 0x00000003) & 0xfffffffc

226 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:46:52 ]
>225
それはsize_tが何バイトだと想定しているわけ
いや、むしろ何ビットといった方が良いのかな

227 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 01:10:36 ]
(size + 3) / 4 * 4
だな

228 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 01:54:07 ]
>>226
それなら、0xfffffffcを~(size_t)3にでもすればいいと思う。

229 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 02:32:04 ]
~((size_t)3)かな

230 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 02:41:42 ]
昔は乗除算は必ずシフトに展開しろと教わったもんだが
今のCPUだとコストに差はないのかな
(size + 3) >> 2 << 2



231 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 02:48:41 ]
演算子の強度低減ぐらいなら処理系がうまく最適化してくれるので
意図をそのまま表現するのが良いとされるようになってきたような

232 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 02:59:55 ]
/ 4 * 4 も >> 2 << 2 も & 0xfffffffc に最適化してくれるね






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

前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