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

239 名前:デフォルトの名無しさん [2010/03/12(金) 15:17:38 ]
ありがとうございます。

.NET(C#?)の問い合わせが多いので
その言語のサンプルを読めるようになると
サポートの幅は広がるよね。
とは言われました。

そうか、と思いつつ、
基本である(と思っている)C 言語の初歩本くらい
やっといた方がいいのかな、
と思ってせこせこやっていました。



240 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 15:20:59 ]
あとC#で何分野やってるのかも聞くといい。 
GUIとかゲームとかネットワークとか。
その分野を重点してやる。

241 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 15:25:07 ]
C#で開発ってXbox360かと思った。

242 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 17:16:54 ]
>>239
土方を目指すのでなければCは必須

243 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 18:00:22 ]
Cできたところで結局ドカタなんすけどね

244 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 18:37:40 ]
switch(c->programming){
 case YES:
  printf( "Cができるとは素晴らしいですね\n" );
 default:
  c->status = "土方"
  break;
}

245 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 19:05:31 ]

浮動小数を文字列に変換する方法について教えてください。
求める動作は次のとおりです:

* double型を文字列に変換
* printf系などの外部関数で変換しない
* 整数は整数として表示(小数点を付けない)
* 小数点以下の不必要な0は付けない
* 有効な精度(15桁程度?)で適当に丸める
* 出力が長い場合も扱える(例えば、「12340000000000000000000」など)

いろいろやってみたのですが思い通りのものが作れなかったので・・・
アイデア・ヒントいただければと

自分で作ってみたものも一応晒しておきます。
↓だと、「456」のときに「459.9999...」となってしまいうまくいきません。
codepad.org/lEqBv5Qz


246 名前:245 mailto:sage [2010/03/12(金) 19:07:20 ]
↑の「459.9999...」は「455.9999...」の間違いでした。
申し訳ない。


247 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 19:44:29 ]
配列を関数に渡して、その値を取得したいんですが、上手くいきません
どうすればいいでしょうか?



248 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 19:46:36 ]
>>247
[50] を除けばいいかも

249 名前:デフォルトの名無しさん [2010/03/12(金) 19:58:47 ]
すみません、取得したいというのは

int test[10];

func( &test );

a = test[ n ];

というつもりでした

250 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 21:00:10 ]
>>249
質問がよく判らんが、こういうことか?

void func(int * test)
{
test[0] = 1;
}

void caller()
{
int test[10];
func(test);
int a = test[0];
}

251 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 21:47:19 ]
>>250

それだと関数の中で1を代入しても関数を呼ぶ側では変化しないと思うんですが
普通の変数をポインタで引数を渡して変更した値を取得するプログラムの配列バージョンみたいなのは可能でしょうか?

252 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 21:56:56 ]
変化しましたけど。。
codepad.org/OGLPv5dF

253 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 22:57:46 ]
勘違いしてました
解決しました
ありがとうございます

254 名前:デフォルトの名無しさん [2010/03/12(金) 23:31:42 ]
>>238
違うね
「基礎ができて」ない奴の道のりが険しいだけ

計算をしっぱなしな奴と、ちゃんと検算する習慣がある奴の違いは
小学校で受けた教育の質から来る

255 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 23:33:45 ]
基礎からやればいいじゃん
簡単なプログラム書くときでもホーア論理とか記述的意味論とか使って検証しながら書くとかさ

256 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 23:58:26 ]
>>222
mallocがアライメント調整してるのに自前でもやる意味あるのかな?

257 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 00:04:47 ]
「何故かは分からんが出来たからいいや」

こういうタイプは一生伸びない。
応用できるのは何故そうなったか、つまりプロセスの部分であり、解は応用できないからである。



258 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 00:12:55 ]
うるせーばか
既解決問題の証明を一生再生産してろ

259 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 00:19:19 ]
こうしてHTMLは死んだ

260 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:23:10 ]
>>256
malloc()がアライメント調整してない場合も、pragma指定かAPIで調整できる場合が多いね。

261 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 05:35:26 ]
>>239
10年っていったらもう30前後なんだろ?
今更言語やっても身につかないし
そんな奴は役に立たない

262 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 08:36:24 ]
確かに>>261は役に立たない

263 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 12:47:32 ]
>>261
お前使えねーな

264 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 12:52:07 ]
>>261
ごめん。相当気持ち悪いな、お前

265 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 13:06:55 ]
261の人気にシット☆

266 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 13:16:18 ]
shit?

267 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 17:04:47 ]
執刀



268 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 19:58:55 ]
ファイルが存在すれば追記でオープン
ってのを格好よく書くにはどうしたらいいかな

あればエラー無ければ作成ってオプションならfopen()にあるけど
逆なんだよな〜access()使うの面倒くさいな〜

269 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 20:04:45 ]
質問です
ネストって一般的に何重が限度ですか?

270 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 20:12:56 ]
何のネストだよ

271 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 20:14:30 ]
>>268 "r+" でよくね?

272 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 20:17:32 ]
>>270
if文のです

273 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 20:40:30 ]
C言語の弱点はネストだな。短い文で使えばいいけど
間に沢山あるとわかりにくくなる
for{}つかえときはcontinue;で括弧を引きずらないようにするといい
場合によってはgotoもいい
長い部分は関数化

274 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 20:51:43 ]
>>269,272
> 5.2.4.1 Translation limits
> The implementation shall be able to translate and execute at least one
> program that contains at least one instance of every one of the
> following limits:
> - 127 nesting levels of blocks
> - ...

275 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 20:52:04 ]
>>272
みっつくらいじゃね?

276 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 20:55:31 ]
>269
ISO/IEC 9899:1999 (E)
5.2.4.1 Translation limits
1 The implementation shall be able to translate and execute at least one program that
contains at least one instance of every one of the following limits:13)
127 nesting levels of blocks
63 nesting levels of conditional inclusion
63 nesting levels of parenthesized declarators within a full declarator
63 nesting levels of parenthesized expressions within a full expression
13) Implementations should avoid imposing fixed translation limits whenever possible. number of characters as the corresponding universal character name, if any)14)
14) See ``future language directions'' (6.11.3).
15 nesting levels for #included files
1023 case labels for a switch statement (excluding those for any nested switch statements)
63 levels of nested structure or union definitions in a single struct-declaration-list
ネスト以外の限界については省かせてもらった
やっぱり63か
>274
その一つ下じゃないか

277 名前:デフォルトの名無しさん [2010/03/13(土) 20:56:03 ]
>>273

ネスト深くてもわかりやすい言語なんかねーよ
安易にgoto勧めんなよ
場合によって、の解釈でとんでもないことになるし
goto排斥主義者の人が来ちゃったら揉めるだろ





278 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 20:58:54 ]
だからgoto使わなければいいだけ

279 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:10:33 ]
>>276
"conditional includion" は 6.10.1 にある #if とかの話。

280 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:13:57 ]
>276
あっ、ほんとだ
プリプロセッサの話だ

281 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:21:24 ]
>>280
許してやる

282 名前:268 mailto:sage [2010/03/13(土) 21:21:26 ]
>>271
あー、オープンしてから自分でシークすりゃいいだけか。
ありがとう。

283 名前:デフォルトの名無しさん [2010/03/13(土) 22:19:58 ]
プログラム勉強始めたばかりの初心者です。例えば以下のようなif文があるとします。
カッコを入れるタイミングと位置がよく理解できていません。
なんで下記のように2回連続カッコが続いて記述されるのでしょうか?
きっとそれぞれのカッコがどこで始まり終わっているのかが理解できていないと思います。
必ず対になるので偶数個になるのは理解できていますが・・・
 おかしな日本語で大変申し訳ありませんが、どなたかわかりやすく解説をお願いできますでしょうか。
よろしくお願いします


if (条件1) {
if (条件2) {
文1;
}
else {
文2;
}
} ←これは何に対してのカッコ?なんで2回連続なんだろう???
else {
文3;
}

284 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:25:09 ]
>>283
2回連続しているけど、意味は別もの。
ネストしているカッコをそれぞれ別のカッコと考えれば分かると思うよ

  if(条件1)「
   if(条件2)『
     文1
      』else『
     文2
      』
 」
  else


285 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:26:00 ]
>>283
例にあげた if 文自体が間違っています。
わからなくて当然です。
なんの本にかいてあったんですか?どこのサイトですか?

286 名前:デフォルトの名無しさん [2010/03/13(土) 22:31:48 ]
>>283です
解説ありがとうございます。いまからじっくり読んで見ます。汗
サイトはこちらです。コピペした時におかしくなっただけかもしれません 汗
www9.plala.or.jp/sgwr-t/c/sec06-1.html

287 名前:デフォルトの名無しさん [2010/03/13(土) 22:51:51 ]
>>284さんありがとうございます。
初心者の私にはこのように見えます。

if(条件1)「 @
   if(条件2)『 A
     文1
A』else『 B
     文2
B 』
 」@  ←上記の番号がきっとそれぞれ対になっていると思っています。ただ、
     条件1が満たされなかったら下のelse文に続くからこの閉めカッコは何?とも感じます。
     きっと私は文の構成の初期的なところを理解していないと思われます 汗

else



288 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:56:51 ]
才能無い奴はやめてしまえ
おまえがC言語をやらなくてもかわりはいくらでもいる
ゴミなんだよお前は

289 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:58:46 ]
むやみに煽りすぎだろ。

290 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:59:35 ]
最初のうちは↓のような書き方をした方が分かりやすいかも

if (条件1)
{
  if (条件2)
  {
    文1;
  }
  else
  {
    文2;
  }
}
else
{
  文3;
}

291 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:00:31 ]
煽り?どこがだよ!お前もそうおもうだろ!正直に言えよ!

292 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:01:36 ]
ifの中にifがはいってるってことはわかってる?
「ネスト」で調べてみましょう

293 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:12:57 ]
>>291
ま、正直、あまりに根本的なところで、なんで?なんで?って聞かれるとイラっとはする。

294 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:13:35 ]
>>288
視野が狭いな
まさに土方の考え方だわ

295 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:15:27 ]
>>294
はぁ?じゃあお前がちゃんと答えればいいじゃねえか!てめえがびしっとこたえねえからこんな事になってんだろ!クソが!

296 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:17:04 ]
まず落ち着いて入門書を読むレベルだろコレ
おまえらが半端に親切にするからチャット状態で何も考えずに質問しちゃうんだよ

297 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:18:52 ]
九九の表を覚えないのに掛け算するレベル。



298 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:21:26 ]
この程度で才能なのかよ。
可哀想だなお前ら。。

299 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:25:00 ]
この程度もできないのはまさに才能だろうな。

300 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:25:07 ]
>>287 
疑問の回答になってるかわからないけど、

 if( 条件1 ){
   略
 }                     ←このカッコ
 else {
      略
 }

このカッコは、"else"があれば終わりが分かるんだから
不要じゃないか?っていう疑問なら、確かにその通り。
でもそれは"else"が来る場合限定の話で、else の来ない場合はそうじゃない。

C言語は、カッコでくくったブロックが基本単位になってるんだけど、
この辺りの感覚が分かってくると、閉じカッコが2重につくのも納得いくと思うよ

301 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:26:58 ]
変なところでひっかかる人はたまにいる
んで、引っ掛かりが取れたらグンと伸びることも結構ある
283もそうなのかは分からんけどね

302 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:28:06 ]
んじゃとりあえず期待。

303 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:28:08 ]
>>287
条件1が満たさた場合、「 @から」@までが実行される。
どこからどこまでか範囲を指定してるから、どこまでを示す閉めカッコが必要。
範囲じゃない場合は省略できるが、最初のうちは必ず{}でくくっておいた方がいいと思う。

304 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:29:55 ]
if (条件1) {
if (条件2) {
文1;
}
else {
文2;
}
}
else {
文3;
}

if ( (条件1) && (条件2){ 文1;}
else if( 条件1) { 文2; }
else {文3;}と等価でよいでしょうか?

305 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:32:55 ]
実際に条件式書いてコンパイルしてみたら分かるでしょ。

306 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:33:00 ]
if (条件1) {
  if (条件2) {
    文1;
  }
  else {
    文2;
  }
}
else {
  文3;
}

307 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:34:32 ]
>>304
一般的には等価ではない。条件1を再度評価したとき同じ結果が
返るとは限らないから



308 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:35:21 ]
>>304
条件1が評価時に変化しなければ等価

309 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:38:28 ]
そんな条件の条件があるのなら等価じゃないだろ

310 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:40:24 ]
そもそもコーディングの意図が明らかに違う

311 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:41:36 ]
だから適当な変数を用意して
int 条件1結果;

条件1結果=(条件1)?1:0;

if ( (条件1) && 条件2 ){文1;}
else if(条件2) {文2;}
else {文3;}
と書くのがもっとも無難じゃないかと...

312 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:41:39 ]
質問に答えてください

313 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:44:41 ]
ここで聞くより入門書を買って読んだ方が手っ取り早い

314 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:47:31 ]
ここは
「C言語なら俺に聞け(入門編)」
です
煽るだけの奴は去れ

315 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:48:00 ]
>>312
お前が質問するのは自由だが、それに答えるかどうかもこっちの自由だ。


316 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:49:48 ]
煽るだけじゃなく、例えば荒らしもする奴は居てもいい。


317 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:50:22 ]
>>314
スレタイにだまされるな。
初心者の質問をネタに雑談するスレだ。



318 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:50:52 ]
>>1
>C言語の*入門者*向け解説スレッドです。

質問または答えない奴はここにいる資格は無い

319 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:51:47 ]
じゃあ俺に聞けなんて自信満々にいわないでください
スレタイをC言語なら入門書を読んだ上でたまになら俺に質問してもいいよ(入門編)に改名するべきです

320 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:53:01 ]
質問を議題とし、初心者同士がディスカッションするスレだよ

321 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:53:14 ]
自信満々に答えられないなら来なきゃいいのに。

322 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:53:20 ]
>>317
それでいいんだよ
通ぶってても規格票と違っている事を固く信じ込んでいる事はよくある

323 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:53:54 ]
>>319
「俺に聞け」なんて不遜な言い方、ジョークに決まってるだろ。

324 名前:285 mailto:sage [2010/03/13(土) 23:54:08 ]
>>283
んー、私が間違っていましたね。
これであっています。失礼いたしました。
で、こういう書き方をすればわかりやすいかもしれませんが、いかがでしょうか。
if (a == 0) {
  if (b == 0) {
    x = 0;
  } else {
    y = 0;
  }
} else {
  z = 0;
}

325 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:54:37 ]
マジに、ただひたすら初心者様に奴隷のように教えるだけのスレになったら回答者なんてだれもよりつかなくなるよな。

326 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:57:57 ]
低レベルな回答者はいらないです。

327 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:59:01 ]
逆ギレすんなよ



328 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:05:41 ]
ヤフの質問箱とかOKWebとかなら、むやみに煽られないんじゃないのかね。
あそこらは「君たちは質問の意図を理解してませんね。
そういうことはいいから早く質問にこたえなさい」系の物言いも許されるイメージ。
あんまり見てないから知らんけど。

329 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:17:35 ]
if文のネストで巧くいかなかったら
条件式を工夫してみろ

条件式をいじってうまくいかなったら
if文のネストを工夫してみろ

両方駄目だったらあきらめろ

言えることはこれくらいかな

330 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:29:35 ]
聞くだけならいくらでも聞いてやる
ただし答えるとは誰も言ってない

331 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:32:42 ]
答えないならせめてずっと黙ってろ

332 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:34:53 ]
いや質問があるなら俺に聞けよ

333 名前:デフォルトの名無しさん [2010/03/14(日) 00:34:56 ]
<object width="480" height="385"><param name="movie"
value="www.youtube.com/v/n-PyrgNSGHA&hl=ja_JP&fs=1&">
</param><param name="allowFullScreen" value="true"></param>
<param name="allowscriptaccess" value="always"></param>
<embed src="www.youtube.com/v/n-PyrgNSGHA&hl=ja_JP&fs=1&"
type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true"
width="480" height="385"></embed></object>


このプログラムを教えてください。私のレベルは、cを少しかじっただけです。

334 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:35:56 ]
>>329
最初から理屈だけで覚えようとすると得てして失敗しやすいからな

335 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:38:15 ]
>>333
Cをかじったなら、それはCじゃないってわかるだろ。

336 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:40:14 ]
おCりかじり虫〜

337 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:08:45 ]
鉄分ミネラルビタミンCは



338 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 11:08:49 ]
保存済みのメモ帳に書いてある10個の数字からランダムに5個読み取りたいんですけど、
fopen、fscanf、for、ifのみを使ってそのようなプログラムを作ることって可能なのでしょうか?

339 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 11:11:26 ]
不可能

340 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 11:12:15 ]
手書きだったら、スキャナで読み取って画像認識しなければ
ならないから、相当難しいだろうな。
しかも使える関数や構文にも強い制限があるみたいだし....

341 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 11:16:10 ]
/dev/randomとかある環境ならいけるんじゃね?とか思うけど

342 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 11:16:21 ]
宿題はC/C++宿題スレへ。テンプレート持って。

343 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 11:17:06 ]
ってnotepad.exeで作成したテキストファイルじゃなくてリアルメモ帳かよ!

344 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 11:40:26 ]
木綿生地以外は全部ナイロンに分類してしまう某民族みたいな話だな

345 名前:デフォルトの名無しさん [2010/03/14(日) 12:26:11 ]
randとかの関数のアドレス調べておいて
それでfopenを上書きすればいいんじゃね
あるいはランダムな数字が入ってるテキストファイル用意しておくとか

346 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 12:27:13 ]
却下

347 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:00:38 ]
>>338
できるよ



348 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:26:37 ]
fopen、fscanf、for、ifだけじゃ無理だろ。
カッコや演算子もないとプログラムの書きようがない。

349 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:29:57 ]
糞スレ

350 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:30:27 ]
開くだけ開いて閉じないってのはなぁ

351 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:36:40 ]
必要な関数を全部挙げろよカス

352 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:37:04 ]
>>348
なんか小学生みたいだな

353 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 15:05:35 ]
hoge.hにint num;というグローバル変数を宣言?します

全然関係ない所から、#include "hoge.h"をしてhoge.hのint num;を使うと
numのスコープはどうなるのですか?

354 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 15:10:57 ]
記憶クラス指定子にextern付けとけ
どっかのコンパイル単位でint numで定義すればいい

355 名前:353 mailto:sage [2010/03/14(日) 15:36:26 ]
>>354
ひとまず、グローバル変数にはexternをつければいいことは分かりました
でも、いつグローバル変数が死ぬかわかりません

356 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 15:42:23 ]
グローバルに限らず静的変数はmain()が始まってから終わるまで生きてる。
寿命をスコープと言わない。スコープってのは名前の有効範囲。

357 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 16:00:40 ]
>>350
fopen()で開いたストリームは、プログラムが終了すると自動で閉じられるんで、
閉じるのは省略しても問題ないって場合もある。



358 名前:353 mailto:sage [2010/03/14(日) 16:06:29 ]
すみません、まだexternとグローバル変数について分からないので教えてください

staticのまとめ
1.#include "hoge.h"とした時に初期化(定義)される
2.staticは何度も#include "hoge.h"としても、1度しか初期化されない
3.プログラムのすべてが終わると自動的に、削除される
4.オブジェクト指向のpublic?

externのまとめ
1.#include "hoge.h"とした時に初期化(定義)される
2.#include "hoge.h"とする度に初期化されてしまうので、多重定義になってしまう
3.プログラムのすべてが終わると自動的に、削除される

359 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 16:29:24 ]
>>358
#includeと切り離して説明すると、

file1.cとfile2.cで、それぞれ、static int n = 1; とstatic int n = 2; と宣言されていたら、
この二つのnはそれぞれ別の変数になる。
それぞれ1と2で初期化される。
file1.cで宣言されたnはfile1.cの中からしかアクセスできない。よそからは見えない。
file2.cで宣言されたnはfile2.cの中からしかアクセスできない。よそからは見えない。


file1.cとfile2.cで、それぞれ、int n = 1; とextern int n; と宣言されていたら、
この二つのnは同じ変数になる。
1で初期化される。
file1.cとfile2.cでnを書き換えると、同じ変数だから、とうぜん、file1.cとfile2.cから
みえるnは同じように書き換えられる。



360 名前:353 mailto:sage [2010/03/14(日) 16:52:37 ]
>>359
わかりました、ありがとうございます
また、疑問に思う事があったら質問します

361 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 17:56:37 ]
C言語の入門サイトではヘッダの作り方がかかれていませんが、
C言語では普通ヘッダを作らないのでしょうか?

ちなみに、*.cを*.hにするだけじゃダメなんですか

362 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 18:37:33 ]
if(1)
{〜}
else
{〜}

elseブロックは最適化で消滅する?

363 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 18:46:39 ]
>>361
ちょっと規模が大きいとファイルを複数にわけるんで、ヘッダを作るのが普通。
ヘッダには定数とか関数のプロトタイプを入れるもんなので、.cを.hに変えるだけじゃだめ。

364 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 18:51:50 ]
だめだお。

365 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 18:52:32 ]
>>362
おまえさんが使っているコンパイラに聞いてみろ

366 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:05:19 ]
>>245
ソース見たら、たぶん20行から28行までのところを、なんかしたら、なんかなるかもなぁ〜〜って気がしたんで、
そこのところをあてずっぽうでいじったら、456 って出た(^_^/わーい

ソースの、ここのところを
/* 各桁の数字を、有効な桁まで計算しておく */
for(i = 0, trunc = 0; i < 15; ++i) {
m = modf(n, &n);
buf[i] = (int)n;
n = m * 10.0;



こういうふうに変えてみたです。あとはいっしょです
/* 各桁の数字を、有効な桁まで計算しておく */
double def = n; // ここと
for(i = 0, trunc = 0; i < 15; ++i) {
m = modf(n, &n);
buf[i] = (int)n;
n = ( modf( ((def+pow(10.0,-15)) * pow(10.0,i)), &n ) * 10.0 ); // ここ

わかんないけど、「誤差とかが、掛け算で、かける10ってのを何度もしてると、誤差がでるのかなぁ〜」とかおもったので、
まいかい全部バ〜〜って、かける1000とかして一気にやったらどうかな?って思ってやったけどダメだったので、
しょうがないので0.00000......1 て小さい1足して、四捨五入しちゃえ〜〜 えいや〜〜ってやったら、なんか偶然456 ってなった。 よかった。

すいません、ぜんぜん知的じゃなくて(・_; 算数的な根拠はないです。なんかラッキー頼りですみません(orz はずぅ〜〜い


367 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:25:05 ]
>>363
thx



368 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:40:38 ]
C言語のことならなんでも聞いてくれるんですか。

369 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:50:21 ]
難しいのはちょっと・・・

370 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:51:50 ]
さあ願いを言え
どんな願いも一つだけ
聞き流してやろう…

371 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 22:05:45 ]
いくらでも聞くよ

372 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 22:40:35 ]
>>366
pow()のアルゴリズムを知っているか? 知っていればすぐに判ることだが非常に誤差が発生しやすい。
従って、第二パラメータが整数になるなら使わない方が無難。
後は、その分の計算量をどこでどう分散させるかだな。

373 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 01:32:38 ]
いまだにミドルウェアっていうのがよくわからない

374 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 11:29:44 ]
>>373
ミドルウェアってのはOSとソフトウェアの中間に値する物
ミドルウェア = DBMSって覚えておけばok

375 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 11:49:53 ]
ヘッダファイルには全ての関数/変数に、extern/staticを付けなければならないんですか?

376 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 12:44:34 ]
いいえ

377 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 12:50:48 ]
>>375
そもそも、ヘッダファイルで定義をしてはいけません。



378 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 15:01:24 ]
中間搾取w

379 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 15:04:54 ]
元ダフ屋が金券ショップになりやがて中央銀行になったようなもの

380 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 21:58:35 ]
>>338

#include <stdio.h>
#include <stdlib.h>
void main(int argc, char** argv ) {
char str[0xFF]; double n[1000]; int n_max = 0; int i=0;
FILE* fp = fopen( argv[1], "r"); while( fgets(str,0xFF-1,fp) != NULL ){ n[n_max++]=strtod( str, NULL ); }
srand((unsigned)(time(NULL)));
while( i < 5 ) { int r = rand()%n_max; if( n[r] != 1e+306 ) { printf( "%f\n", n[r] ); n[r]=1e+306; i++; }}
}

くじびき的な何か?

381 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:02:18 ]

fopen、fscanf、for、ifのみを使って

という条件を満たしていない気がするのだが、いいのか。

382 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:10:58 ]
うむ、randが使えないのが難点だな

383 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:11:06 ]
>>380
fgets()の第二パラメータの意味を誤解していそうだ。

384 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:45:47 ]
せめて現在時刻がわかれば乱数のように使えるのに
制限が厳しすぎる

385 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 23:27:10 ]
__asm は使ってもいいですか? 関数じゃないからいいよね?

386 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 23:53:32 ]
乱数の代わりに初期化していない自動変数の中身を読むってのは無し?

387 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:14:56 ]
厳密なことをいうと、十分にランダムである保証がない
特に乱数や、乱数の種、ましてや暗号関係で使うのは厳禁

あと初期化されていない変数って、規格上は読んでいいんだっけ?



388 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:18:33 ]
定義されていないだけで、読むのは別にいいんでない

389 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:39:10 ]
>>381

#include <stdio.h>
#include <stdlib.h>
static double s;
static int rnd(void){ int p; if(s>1e+8){s*=1e-4;}; if(s<0){s*=1e+8;} s += 0.1*s; return((s<0.0)?-s:s); }
void main(int argc, char** argv ) {
char str[0xFF]; double n[1000]; double d; int n_max = 0; int i=0;
FILE* fp = fopen( argv[1], "r"); for( ; fscanf( fp, "%lf", &d ) != EOF ; ){ n[n_max++]=d; }
s=((double)((long)&str)); rnd();
for( i=0; i<5 ; ){ int r = rnd()%n_max; if( n[r] != 1e+306 ) { printf( "%f\n", n[r] ); n[r]=1e+306; i++; }}
}

な、なんか意味あんのん?… この制限て…(・_; ばたり…

390 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:43:09 ]
もうひとつ制限がありました。7行で書いてください

391 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:47:44 ]
改行しなきゃいいだけ

392 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:53:39 ]
>>390

#include <stdio.h>
static int rnd(double* s){ int p; if(*s>1e+8){*s*=1e-4;}; if(*s<0){*s*=1e+8;} *s += *s*0.1; return((*s<0.0)?-*s:*s); }
void main(int argc, char** argv ) {
double n[1000]; double d; int n_max = 0; int i=0; double s =(double)((long)&n); rnd(&s);
FILE* fp = fopen( argv[1], "r"); for( ; fscanf( fp, "%lf", &d ) != EOF ; ){ n[n_max++]=d; }
for( i=0; i<5 ; ){ int r = rnd(&s)%n_max; if( n[r] != 1e+306 ) { printf( "%f\n", n[r] ); n[r]=1e+306; i++; }}
}

もぅ寝まつ…(つ_\

393 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 01:08:23 ]
>>338
これでどうだ
ウチでは実行するたびに結果が変わったよ
#include<stdio.h>

#define DATA_NUM 1000

int main(void)
{
unsigned long rand_pool[DATA_NUM], rand_num[5];
int value[10], i, index;
FILE *fp;

if((fp=fopen("hoge.txt", "r"))==NULL) return 1;

for(i=0;i<10;i++) if(fscanf(fp, "%d", &value[i])!=1) return 2;

for(i=0;i<DATA_NUM;i++) rand_num[i%5]^=rand_pool[i];

for(i=0;i<5;i++)
{
index=rand_num[i]%(10-i);
printf("%d\n", value[index]);
value[index]=value[10-1-i];
}

return 0;
}

394 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 02:27:07 ]
回答が知りたい。
こんな問題を出した意図とか。

どうせ>>338が問題を書き間違えて重要な情報が抜け落ちてたってオチだろうけど。

395 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 16:26:46 ]
関数で参照渡しするときの所作を詳細に教えてくささい

396 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 16:30:29 ]
まず、参照渡しの定義をしてから質問してください

397 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 16:36:06 ]
C言語では参照渡しはできません
JAVAを使いましょう



398 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 16:37:08 ]
もどきはできるじゃん

399 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 16:37:44 ]
ポインタによる間接参照

400 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 22:08:09 ]
>>395
洒落じゃね?

401 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 22:45:29 ]
sprintfを使って整数から文字列に変換しようとするとき
"%04d",i みたいに前をゼロで埋める指定で、0で埋める個数って変数にできないんですかね?

402 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 22:49:04 ]
*

403 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 23:05:00 ]
なるほど、%0*d , (int) , i でいけました
ありがとうございます

404 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 23:08:23 ]
超初心者ですがよろしくお願いします。
Macでも使えて軽いコンパイラってありますか?

405 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 23:26:55 ]
gccでいいだろうに

406 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 06:44:00 ]
軽いコンパイラって、どんなコンパイラだよ。

407 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 14:35:10 ]
じゃ軽いライブラリで



408 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 15:30:45 ]
俺の作ったコンパイラすごいぜ。

5年前のノートPCなのに、円周率計算させると2秒で5億桁まで出力する。

VisualStudio2008ってソフトなんだけど。

409 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 15:42:31 ]
ネタだろうけど、GMPより糞速いじゃん
gmplib.org/pi-with-gmp.html

410 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 00:39:07 ]
gccでプログラム作ってます。
例えば、buff=(char *)malloc(sizeof(char) * 10);とメモリを確保したあと
配列が不足するたびにreallocでメモリを増やしていこうと考えてます。
buff=(char *)realloc(buff, sizeof(char) * 20);という具合に。
そこで悩んだのですが、ある時点でbuffにどれくらいメモリが割り当てられてるか
確認する方法ってないですか?
「* 10」を「* i」みたいに変数を使って確認するしかないんでしょうかね?

411 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 00:41:37 ]
サイズを保存するしか無いよ

412 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 00:46:46 ]
>>411
ありがとう。そうします。

413 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 01:11:33 ]
>>410
> buff=(char *)realloc(buff, sizeof(char) * 20);という具合に。
出たよ。メモリ確保できないときにリークが確定するパターン。
初心者に realloc() 教えるとすぐこれをやらかす。

414 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 01:16:08 ]
鬼の首でも取ったのか?
喜びすぎだろ

415 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 01:20:57 ]
喜んでるわけが無いだろjk
うんざりしてるんだよ。

416 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 02:32:19 ]
#include <stdio.h>
#include <stdlib.h>
// 構造体 B
typedef struct tagB { int max_size; char* buff; } B;

// B を初期化する命令
void B_init( B* b ) { b->max_size=10; b->buff =(char*)malloc(sizeof(char) * b->max_size); }

// B のメモリを10ふやす命令
void B_realloc( B* b ) { b->max_size += 10; b->buff = (char*)realloc( b->buff, sizeof(char) * b->max_size ); }

// Bに char を一文字セーブする命令 ( B の buff が短かったら自動的に伸ばしてくれる )
void B_write( B* b, char c, int index ) { if( index >= b->max_size ){ B_realloc(b); B_write( b, c, index ); } b->buff[index] = c; }

// Bから char を一文字ロードする命令 ( B の buff が短かったら自動的に伸ばしてくれる ) 
char B_read ( B* b, int index ) { if( index >= b->max_size ){ B_realloc( b ); B_read( b,index ); } return( b->buff[index] ); }

void main() { B b; B_init( &b ); B_write( &b, 'A', 12345 ); printf("%c\n", B_read( &b, 12345 ) ); }

おこられそう…w(^_^

417 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 02:52:10 ]
>>416
怒りはしないが、ダメダメ。
ロードする関数でrealloc()しても、増えた領域に何にも書いてないから不定値が返るぞ。
それに、セーブする方も任意のindexを指定できるのに一度に伸ばせるのが高々10文字だから簡単に範囲外書き込みになってしまう。
それに、sizeof(char)なんて無意味なことは書くべきじゃない。



418 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 02:55:55 ]
>>413
出たよ。問題の本質と関係ない話をする奴。
buffの宣言がないじゃん、と言ってるのと同レベルだぜそれ。
初心者じゃなくなったと思い込んでる初心者はすぐこれをやらかす。

419 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 02:56:52 ]
そもそも、メモリ確保ができなくなる心配をする前にすることがあるだろうと。

420 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 02:57:08 ]
その程度のサイズでrealloc使うとか、何の冗談だよw

421 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 03:00:21 ]
足りなければ倍にするというやんちゃな方式が時として功を奏することもあるよ
とりあえず、ポインタを元にアロケーションしているサイズを知ることはできないので他で管理しましょう

>>420
ええと。

422 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 09:12:57 ]
どうしても必要ならともかく、入門レベルでrealloc使わせるのはどうかと思うが。
余裕をもとって大きめに領域確保するほうがよっぽどマシ。

423 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 09:15:29 ]
>>413
すぐそのあとに、if (buff == NULL) exit(1); と書けば問題なし。
メモリ不足なら、ほかのところだってまともに動くわけないんだから。

424 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 09:32:48 ]
>>422
それはそれでイヤン

425 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 11:07:20 ]
>>424
サイズをオーバーするかどうかちゃんとチェックするならありじゃね?

426 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 14:55:30 ]
>>425
オーバーしそうになったらどうすんの?

427 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 15:50:24 ]
>>426
・ごめんなさい、私には無理です
・オーバーする分はなかったことにしていいよね

どちらでもお好きに。



428 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 16:08:53 ]
一行が長いテキストファイルを開くと落ちるエディタ
一行が長いと後ろのほうが切り捨てられるエディタ

どっちもいやだなぁ

429 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 16:10:43 ]
4G以上のファイルとかどうやって扱ってんのか気になる

430 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 16:27:26 ]
>>429
4GB以上のファイルを普通に扱える環境なら、64ビットアドレッシングで使うのが当たり前だから特に工夫は要らないよ。
32ビット環境で扱いたいなら、一度に全部開かなければいいだけだからやはり、4GB以上だからといって別段大仰な手間は要らない。

>>428
初心者が作るのなら、取り敢えずそれでもいいのでは? まさか、そのまま保存するわけでもあるまいし。

431 名前:デフォルトの名無しさん [2010/03/19(金) 19:50:57 ]
文字配列についてお尋ねします

char buf[6] = {'A', 'B', 'C', 'D', 'E', '\0'};
と宣言したとします。

このとき
buf[1]は 'B'が格納されており文字コードが例えば66だとします
buf[1]は数値そのものであるので、if(buf[1] == 66)もしくはif(buf[1] == 'B')のような比較が可能です。(ですよね?)
ここでbufとするとABCDEという文字列を表すことになりますが、このときbuf自体の数値は
bufのアドレスが入っています。(ですよね?)

ここで疑問なのですが、bufは一体どこのアドレスが入っているのでしょうか?
例えば、buf[0]のアドレスと同じものであればAとしか表示されないはずです。
ABCDE\0をもってくるにはbuf[0]からbuf[5]までのアドレスが必要なはずです。

buf自体はアドレスの開始地点で終端文字の\0が現れる部分までのオフセットを割りだし
そのアドレスをすべて与えて文字列を表示しているということでよろしいでしょうか?
回答よろしくお願いします。

432 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 20:01:01 ]
>>431
buf と等価なのは &buf[0]

433 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 20:04:08 ]
>>431
だいたい合ってるが、1点だけ。

> ここでbufとするとABCDEという文字列を表すことになりますが、
bufがABCDEという文字列を表しているわけではない。
あくまで文字列の先頭のアドレスを保持しているにすぎない。
buf == &(buf[0])

puts(buf)で"ABCDE"と表示されるのは、以下のような処理をしているため。
for(char *p = buf; *p != '\0'; p++) { *pを出力; }

434 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 20:07:07 ]
>>431
配列は配列であってポインタじゃない

435 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 20:10:42 ]
char buf[] = {'h', 'o', 'g', 'e', '\0'}
char *p = buf;

buf

'h' 'o' 'g' 'e' '\0'

0x00..... ← p

436 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 20:13:39 ]
グダグダ言ってないでデバッガで変数見りゃいっぱつだろうが

437 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 20:14:09 ]
>>431
>ここでbufとするとABCDEという文字列を表すことになりますが
ここでってどこだよw



438 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 20:26:53 ]
>431
言っていることはその通り何だけど
NUL('\0')終端文字列はNULが現れるまでを文字列とみなすから表示させたい最初の文字のアドレスを渡すだけでいいのよ
あなたにお薦めなサンプルプログラム

#include <stdio.h>
#include <string.h>

int
my_print(char const*str)
{
  size_t i;
  for ( i = 1; i < str[0]+1; ++i ) {
    putchar(str[i]);
  }
  return i-2;
}
int
main(int argc, char **argv)
{
  char foo[6] = {'a', 'b', 'c', 'd', 'e', '\0'};
  char bar[16] = {'a', 'b', 'c', 'd', 'e'};
  char baz[] = {3, 'b', 'a', 'z'};
  memset(bar+5, '\100', 10); /* ゴミを入れる */
  bar[15] = '\0'; /* NUL終端させる */
  printf("%s\n", foo);
  printf("%s\n", &foo[0]);
  printf("%s\n", &foo[3]);
  printf("%s\n", bar);
  my_print(baz);
  return 0;
}

439 名前:デフォルトの名無しさん [2010/03/19(金) 21:22:55 ]
配列はメモリ上連続しているので、先頭アドレスと型がわかれば計算で出ます。
コンパイラは &buf[5] を &buf[0] + (5 * sizeof(char)) と捉えます。

440 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 21:33:35 ]
プログラミングに使う単語って英語ですか?

441 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 21:37:20 ]
基本的には

442 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 21:43:31 ]
皆さんは英語ペラペラですか?

443 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 21:44:01 ]
My English is poor.

444 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 22:17:57 ]
>>442
fuck u

445 名前:431 [2010/03/19(金) 22:18:43 ]
>>433
buf自体がが先頭アドレスなのは↓に書いたように知ってます
>buf自体はアドレスの開始地点
結局全部
for(char *p = buf; *p != '\0'; p++) { *pを出力; }
これやってるだけなんですね…

446 名前:431 [2010/03/19(金) 22:24:21 ]
>>439

buf[5]を例えばprintfするときはオフセットで
文字列を全部表示するときはポインタをズラす方法で表示しているのですか?

for(char *p = buf; *p != '\0'; p++) { *pを出力; }
このようにポインタをズラしているのか、
それとも
&buf[5] を &buf[0] + (5 * sizeof(char))
のようにオフセットで計算しているのか
内部の処理はどっちなんでしょうか?

それが>>431の質問で一番知りたいことなんですが


447 名前:431 [2010/03/19(金) 22:26:02 ]
>>436
オフセットで計算したものか、ポインタをズラしたものなのか
格納されたアドレス見るだけじゃわからないんですよ…



448 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 22:26:32 ]
どういう風にprintfを作るかなんて決まってないしコンパイラメーカーが勝手にやってるだけだよ
きっと、前者だろうなって気はするけど

449 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 22:27:39 ]
前者な気がする

450 名前:431 [2010/03/19(金) 22:28:24 ]
>>448
そうなんですか…
どっちが主流なのか知りたかったのですが(速度とかいろんな意味で)

451 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 22:30:39 ]
そんなこと知ってどうすんだろ

452 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 22:31:24 ]
速度とかそれこそきまってねえだろ
おまえはなにか?コンパイラは全て同じ中身じゃないといけないと思ってんのか?主流ってなんだ?どの環境の主流だ?
クソして寝ろや

453 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 22:33:28 ]
>>450
もう答えは出てるだろう。文字列探索程度のコストを気にするより
もっと他の所の速度を気にしろ。

454 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 22:35:29 ]
簡単なプログラムつくって、最適化全部はずしてバイナリを逆アセンブルして追っかけてみれば?
ペンティアム以降になると急に難しくなるから、LSICの試食版あたりからははじめて
あるいはgccならprintfもソースみれるよ

そうやって3,4個調べてみれば主流もわかるんじゃね

455 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:38:50 ]
robot C わかる人いる?

456 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:41:38 ]
ボクは個人的には
char c[1234]
ってのを

putchar( c[0] ); putchar( c[1] ); putchar( c[2] ); putchar( c[3] ); putchar( c[4] ); putchar( c[5] ); 〜〜〜ずーっとつづく
って書くよりも

char* p=c;
putchar( *p++ ); putchar( *p++ ); putchar( *p++ ); putchar( *p++ ); putchar( *p++ );  〜〜〜ずーっとつづく
って書く方が、コピペが楽なので好きですw


457 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:43:53 ]




458 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:44:02 ]
頭おかしいのかおまえ

459 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:52:53 ]
俺がコンパイラなら syntax error 出すわな

460 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:53:21 ]
最終的にはsystem callを追っかけてlibcやkernelに入りそうだな

461 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:59:13 ]
int 21Hで終わりでいいじゃん

462 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 00:06:12 ]
char c[1234];
ってのは、使うときは putchar( c[3] ) みたいにして使います。 c[0] なら最初の文字、c[3]なら3番目の文字です。  

&c[3]  みたいに、頭に&マークをつけると、このデータがメモリのどこに書かれてるかがわかります。配列の先頭が、メモリのどこにあるかは &c[0] でわかります。

使うときにカッコを取って c って書くと、 &c[0] って書いたときと同じ数字がわかります。 この c そのものを c++ ってやって一個増やすと、
char型の配列なら、char一個分だけメモリをさしてる場所が増えます。 だから c++ とすると、つぎに使うときは c は &c[1] といういみになります。

int型の配列なら、int i[1234];

463 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 00:08:19 ]
i++ で int の大きさ分だけ増えます。 

や〜めた

464 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 00:14:26 ]
>462
またまたご冗談を

465 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 00:19:03 ]
>>462
そんなコンパイラなんて…
あるかもしれないが規格無視じゃないか

466 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 00:27:03 ]
>>462
その場合cは定数だからc++なんて出来ないだろアホ






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前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