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


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

C言語なら俺に聞け(入門篇) Part 21



1 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 06:24:18 ]
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 20
pc11.2ch.net/test/read.cgi/tech/1192455273/

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 99代目
pc11.2ch.net/test/read.cgi/tech/1194262698/

381 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 23:18:31 ]
ソートがわかるようでわからん・・・
配列に適当に数字おいて、一時的に保管しておく変数用意して、
ループの入れ子ループでカウントアップしつつ、
比較Aと比較Bで片方補完変数にいれてループ抜けて、
親ループでカウントアップさせて・・・ってやるんだけど、結果一番でかいのだけ連続して出力される('A`

382 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 23:19:34 ]
ソースうp

383 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:03:35 ]
ダメだ。アスタリスクを見るとポインタに見えてfor無限ループ(;;)を見ると顔文字に見えてしまったり
俺の頭はどうにかしてしまったのだろうか

384 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:05:00 ]
->も然り

385 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:08:42 ]
頼むから俺に聞くとき、変数 i を使わないでくれ
印刷したソース逆から見る俺の身にもなってくれ
なんでここで否定してんだって何度も思うじゃねえか

386 名前:デフォルトの名無しさん [2007/11/16(金) 00:12:28 ]
プログラムの仕事につくには英語を最低限身につけないといけないんですか?

387 名前:デフォルトの名無しさん [2007/11/16(金) 00:15:37 ]
>>386
最低限、英語で書かれた技術文書は、読める必要が必ずでてくる。
ただ、技術文書は平易な英語で書かれているから、すぐなれると
思うよ。

出世して、英語の契約書読む羽目になるとまた別だが。

388 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:19:20 ]
完全に読めなくても、だいたいの意味はわからないか?
見たこと無い単語が出てきたら辞書引く程度で間に合うよ。

389 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:31:24 ]
ときどき
printf("")のprintf文をいれなかったらセグメンテーションエラーでて
printf文をいれたらセグメンテーションエラー消えることがあるんですけど
これはどういうことなんでしょうか?



390 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:34:50 ]
バグです(多分バッファオーバフローの)

391 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:47:38 ]
>>381
ソートもアルゴリズムの分野だけど
理解できないんなら
有名どころのソート(6個くらい)
丸覚えしとけば良いじゃん。

まぁ、バブルソートぐらいは理解しといた
ほうが良いとは思うけど。

392 名前:392 [2007/11/16(金) 00:49:25 ]
ある処理の実行時間の測定を次のようにしました。

start = clock();
なんらかの処理
end = clock();

time = (float) (end - start) / CLOCKS_PAR_SEC;
pirntf("実行時間%d\n", time);

これでtimeを出力すると、
536870912, 2147483648, 1073741824, 1610612736, 0
のうちのどれかの値に-ついたりつかなかったりして、出力されます。
「なんらかの処理」を変えても 上記の値しかでません。
どうしてこうなるのか分かりません。教えてください。

393 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:55:20 ]
>>392
time という変数名がマズイ
time が実数型であるにもかかわらず %d で出力している
typo がある
の全てが原因でしょう

394 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:58:52 ]
clock()が返すのはclock_tだが、startとendの型は?

395 名前:392 mailto:sage [2007/11/16(金) 01:04:08 ]
>>393
timeという変数について調べてみます。
%fでしたね@@;
ありがとうございました!!

>>394
clock_tで宣言しています。
回答ありがとうございます!

396 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 01:18:02 ]
しかし深夜にならないとプログラム作る気おきないのはなぜなんだろう

397 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 07:14:36 ]
あるある

398 名前:デフォルトの名無しさん [2007/11/16(金) 16:49:36 ]
文字列を倍精度に変換する関数strtodにバグがあるようでうまく変換してくれません。

const char* pszInput = "9999999999999999999999999999999999999999999999999999999999999999999999999999999999";
char* pszStop;
double dOutput;
dOutput = ::strtod(pszInput, &pszStop);
::printf("input:%s\noutput:%f\nstop:%s\n", pszInput, dOutput, pszStop);

output:9999999999999999600000000000000000000000000000000000000000000000000000000
000000000.000000
となってしまいます。ERANGEも検出されません。
これはよく知られたバグなのでしょうか?また対策はあるのでしょうか?

よろしくお願いします。

399 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 16:51:47 ]
>>398
「有効桁数」でググってきな



400 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 17:12:46 ]
9999999999999999999999999999999999999999999999999999999999999999999999999999999999
約 10^83

有効桁数 83 桁の数値を扱うために最低限必要なビット数を x とすると
2^(x-1) < 10^83 < 2^x
x = ceil( 83 / log2 )
x = ceil( 83 / 0.301 )
x = 276
1 バイトを 8 ビットとして最低 35 バイトは必要

>>398 が自分で実装するのは無理だろうからライブラリを探した方がいいでしょう

401 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 17:14:01 ]
>>400 は83桁じゃなくて82桁だった

402 名前:デフォルトの名無しさん [2007/11/16(金) 19:18:42 ]
質問:C言語の「volatile」の名前の由来について

質問です。
C言語には「volatile」という記号が あります。
これを記入すると、該当部分でのコンパイル時の最適化を抑制できます。
しかし、なぜ volatile(移り気な、気まぐれな)なのでしょうか。
最適化を抑制しているのですから、むしろ「変化しない」という意味に なるはずです。
つまり、volatile では なく、「un-volatile(不揮発の、変化しない)」になるべきでは ないでしょうか。
教えてください。よろしくお願い致します。

403 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 19:29:20 ]
volatile 変数は移り気で勝手に変化するから、最適化せずに毎回ちゃんとメモリを読みにいかないと正しい結果を得られない、と考えてはいかが

404 名前:デフォルトの名無しさん [2007/11/16(金) 19:31:36 ]
快活に計算動作するから
最適化などで省略して定数になったり計算無効になったりしたらこちらは変化無い

405 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 20:57:33 ]
最初に名前を入力させ、5件分の入力が行われるか、endと入力されたら、その分だけ出力させる
ただし名前入力の最初にendが入力された場合は、その旨のメッセージを出力して再入力させてください
名前は最大15文字入力とする

これのやり方を教えてください

406 名前:デフォルトの名無しさん [2007/11/16(金) 21:10:12 ]
初歩的な質問スミマセン

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

int main()
{
char *cp=NULL;
void *ptr=NULL;

if((ptr=(char*)calloc(10,sizeof(char)))==NULL){
printf("error\n");
exit(EXIT_FAILURE);}

if((cp=strchr(fgets(ptr,100,stdin),'\n'))!=NULL){
*cp='\0';}

printf("%s",ptr);

return EXIT_SUCCESS;
}

半角文字10文字分のメモリをcalloc関数で確保して
fgets関数で10文字以上入力しましたが
普通10バイト分の配列を用意しfgets関数でそれ以上の文字を入力すると
オーバーフローが起き、強制終了しますよね?
ですがこれでは起きないんです、何故でしょうか

407 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 21:13:04 ]
>>402
どっかで勝手に値が変えられる可能性があるから volatile だな。

408 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 21:56:34 ]
>>406
ひーぷに余裕があるからじゃね?

409 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 22:10:54 ]
>>405
丸投げは宿題スレへ
pc11.2ch.net/test/read.cgi/tech/1194262698/l50



410 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 22:12:14 ]
>>406
>オーバーフローが起き、強制終了しますよね? 

そうとは限らない
他のところで使ってるメモリ領域を黙って書き換えるだけの場合もある

411 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 22:16:27 ]
>>409
あっすいませんでした

412 名前:デフォルトの名無しさん [2007/11/16(金) 22:17:24 ]
>>408
あ、そういうことか!!
どうもありがとうございました

413 名前:デフォルトの名無しさん [2007/11/16(金) 22:37:56 ]
>>402
「最適化しないだって?」
「ああ、今日はそんな気分なんだ」
「まったく気まぐれな奴だよ」

414 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 22:52:46 ]
>>402
#define donotoptimize volatile

415 名前:デフォルトの名無しさん [2007/11/16(金) 22:56:56 ]
違うとおもいますよ。
綿密な計画と設計思想に基づいてボラタイルに したんです。
気まぐれで ボラッたわけでは ありません。

416 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 23:23:58 ]
なぜmainはmainという名前にしたんだろう、startの方がよくない?と思ったことはあります

417 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 23:25:04 ]
だったらstopも要ると思わないか

418 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 23:36:50 ]
多分main,subで分けて書いたからじゃないかな。

419 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 23:46:05 ]
>>417
関数の名前にしちゃうとその辺の理屈あわせが難しくなるよね
>>418
ああなるほど

関係ないけどmain"メソッド"には今でも違和感がある…



420 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 01:36:08 ]
mainメソッド……てJAVA?

421 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 02:07:26 ]
Cから始めた自分には違和感なかったけど、よくよく考えたら不思議な名前のメソッドだな。

422 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 02:17:27 ]
mainと言いつつ、主要な処理は他のところでやってるしね。

423 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 02:22:01 ]
主要な流れ、ということじゃないか?
主要な処理を他でやっていても、
全体通してのメインの流れを定めるのがmain関数

int main(){
first_step();
second_step();
third_step();
return 0;
}

424 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 03:51:36 ]
構造体のメンバの数って制限あるのですか?

425 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 09:08:36 ]
そりゃあるだろうが、限界まで使ったこと無いな。


426 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 09:18:17 ]
ハード側の限界にぶつかったことならあるが、規格の限界は知らないな

427 名前:デフォルトの名無しさん [2007/11/17(土) 19:17:14 ]
MFCって何?

428 名前:デフォルトの名無しさん [2007/11/17(土) 20:24:04 ]
>>427
ググれ

429 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 20:33:33 ]
HTMLのform解析をしたいのですが、
<form action="./int.php" method="post">
<input type="text" name="id" value="C">
<input type="submit" name="button" value="押す">actionは./int.php
methodはPOST
typeはtext、nameはbutton valueはC
というように<>内をそれぞれ抽出したいのですが、どのようにしたら出来ますでしょうか?



430 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 22:36:57 ]
オイラだったら perl でやる。rubyも好いらしい。


431 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 22:42:25 ]
字句解析はCよりPerlを勉強した方がはるかに楽だよ

432 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:01:25 ]
>402

volatileは「最適化抑制」という意味じゃない。
「値が外的要因(ハードウェアなど)によって変化しうる」という意味。


433 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:05:27 ]
>429

Win系だったらMFCや.NET Framework、UNIX系ならPerlを使ったほうがいいな。

Cでやるしかない、という場合だったら、methodなどのキーワードの後の"...;"の中を一々抽出するしかないな。


434 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:08:04 ]
>>429
どっかから正規表現のライブラリ持ってくるのが楽じゃない?

435 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:11:01 ]
HTMLのライブラリだって、探せばありそう。

436 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:19:45 ]
>>435
たとえばWindowsならMSHTMLとかだな。

437 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:34:44 ]
レスありがとうございます。
まずはCだけで頑張ってみます。

438 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:04:55 ]
>>と>=で処理する式が違うんですけど、
プログラムを作るとき、どう区別すべきですか?

439 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:08:11 ]
違うってわかってるんなら、区別できてるってことじゃないか



440 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:20:31 ]
for(;i<10;)

for(;i<=9;)
の違いがわからんってこと?

441 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:23:01 ]
>>は非常に左が大きいだけど
>=は以上ってことだし。

442 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:29:57 ]
if(A>>B)    C=A
elseif(B>>A)   C=B
elseif(A>=B) C=A+1;
elseif(B>=A) C=B+1;

の条件分岐を作りたいんだけど
区別どうすればいいのかってね。




443 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:33:32 ]
>if(A>>B) C=A
 
AがBより非常に大きいってことを言いたいのなら、
コンピュータは 「非常に」 なんて曖昧な条件は理解できないので、
どのくらいかを具体的に指示してやらないとだめ。

if (A >= B + 1000) C = A;
とか
if (A >= B * 10000) C = A;
とか。

444 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:34:25 ]
>>>は非常に左が大きいだけど
C言語でそんな比較演算子は無い
単なる大小比較( > )にし問題を書き換えなさい

445 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:59:48 ]
きっとビットシフトだ

446 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 07:12:45 ]
良くも悪くもコンピュータは正直だから、命令されたことしかやらない。
「〜よりは大きいが常識の範囲内で」とか言われても判断できるわけがない。

447 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 07:37:40 ]
おれもビットシフトだと思って、何のことだか全然わからんかった。
「非常に左が大きい」て何だよw


448 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 07:38:50 ]
以前にも同じような質問してきた奴が居たから俺はわかった

449 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 08:23:39 ]
unsigned A; の下位 B ビット以外が0であることを
判別する関数をつくりなさい。(10点)




450 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 08:30:08 ]
int f(unsigned A, int B) { return !(A >> B); }

451 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 08:38:36 ]
bool func(unsigned A, unsigned B) {return A >= (1 << B);}

452 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 08:44:45 ]
後出しなのに・・・

453 名前:デフォルトの名無しさん [2007/11/18(日) 09:15:50 ]
すみません、まだC初めて一週間足らずの初心者ですが質問させてください。

課題で
void printIPAddress( unsigned int address )
{
printf("%d.%d.%d.%d",
(address & 『 @ 』 ) >> 24,
(address & 『 A 』 ) >> 16,
(address & 『 B 』 ) >> 8,
(address & 『 C 』 ));
}
ア.0x000000ff イ.0x0000ff00 ウ.0x00ff0000 エ.0xff000000

とありまして、@〜Cにア〜エから適切なものを選択して関数を完成させるというものです。
ネットなどで色々検索して、答はたぶん@:エ A:ウ B:イ C:アじゃないかと思ってるのですが
どうしてそれが正解?なのかがわかりません。(そもそも正解かどうかすらわかりません)

考え方としては例えば@:エなら0xff000000は11111111 00000000 00000000 00000000で
>>24というのが右に24bit(3byte)移動するという意味なんだろうか?と思ってるんですが
3byte移動したら11111111が一番→にきて後ろについてたたくさんの0は前に行くんでしょうか?
それがどうして正解?なんでしょうか?他のもの(例えば0x000000ffとか)が入ってはいけないんでしょうか?
&を使ってるという事は論理積を理解できてないとこの問題は理解できないんだと思うのですが
本や解説を見てる時はふんふんなるほどと思っても実際こうやって問題にされると全くわからなくてお手上げです…

長文すみませんがどなたかご教授お願いします。
もしスレチならどこか該当スレに誘導お願いします。
(最初ふらっとCスレに書き込もうとしたら1000スレ達成しちゃってました…)

454 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 09:27:51 ]
>>453
論理演算とビットシフトでググればわかりそうなもんだが…

&はand演算だから、左右どちらも1なら真=1になる。そうでなければ0になる。
例えば、11001100 & 11000000の結果は11000000になる。
これを右に6ビットシフトすれば00000011が得られる。

455 名前:デフォルトの名無しさん [2007/11/18(日) 09:38:37 ]
アドレスは、
11100010  上位ビット
01100011  
00100100  
11011100  下位ビット

のように格納されている

0ビットシフトさせてff = 11111111とand取れば下位ビットが出てくる
8ビットシフトさせてff = 11111111とand取れば下から二つ目が出てくる

456 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 09:42:04 ]
>>452
インライン展開するときに、Bが定数なら>451の方が効率がよくなる。

457 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 09:49:08 ]
効率とか言うレベルじゃなくて、単純に間違ってるだけだろw

458 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 10:03:48 ]
11000000 10101000 00000001 00000001 (3232235777 = 192.168.101.1)
11111111 00000000 00000000 00000000 (4278190080 = 0xff000000)
----------------------------------
11000000 00000000 00000000 00000000 (3221225472 = and後)
00000000 00000000 00000000 11000000 (192 = 24ビット右シフト後)

ビットシフトした後には0が入る。つまり1ビットシフトはx2か/2と同等。
これで理解できなければ諦めてくれ。

459 名前:453 mailto:sage [2007/11/18(日) 11:44:35 ]
なるほどっ!
すごくわかりやすい解説ありがとうございます。
ビットシフト自体は皆さんのご説明ですぐに理解できたのですが

「だからどうして@:エ、A:ウ・・・・・になるの?」というところが
なかなか理解できずレスに時間かかりました><

ただ少しばかり>>458さんに確認も含めた質問があるのですが
もしご覧になってたらお時間あればレスいただけませんか?
一行目の(192.168,101.1)というIPアドレスが最初はどこから出てきたのかさっぱり???だったのですが
これはわかりやすく例をあげるために適当?に書いてくれたのかな?と解釈しました。それでよろしいでしょうか?
あと、同じくカッコの中の3232235777や4278190080、3221225472という数字がイマイチピンとこないのですが
これはそれぞれ110000001010100000000010000001という2進法の数値を10進法で現してるものでしょうか?
(ググレ!でしたらすみません・・・ビット換算表はぐぐって今見てるのですが数字が大きすぎて・・・orz)

結局、最初の質問であった「どうして@:エA:ウ・・・になるのか?」という質問についてはやっと理解できました。
みなさんご親切にどうもありがとうございました^^




460 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 12:08:51 ]
>>459
ああ、スマン間違ってる。458の2進数表記だと192.168.1.1になるね。

IPアドレス自体は例として適当に書いただけ。
数字の部分は1バイトずつにそれぞれ192、168、1、1と当てはめたものを
4バイトのunsigned int型変数addressの10進数として表現したもの。

ちなみにこの処理は欲しい部分を切り取るのによく使われる方法で「マスク」等と呼ばれたりする。
まあ頑張ってや〜。

461 名前:デフォルトの名無しさん [2007/11/18(日) 12:51:48 ]
C言語によるリスト構造について質問させてください。

連結リストに末尾からデータを蓄えて指定した数字を削除し
削除後のリストを画面に表示するプログラムを作りたいのですが、
手元にある参考書を見たり、ネットで調べても分らなかったので
どなたかご教授お願いします。

462 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 12:58:05 ]
www.google.co.jp/search?q=%E3%81%94%E6%95%99%E6%8E%88
ネットで調べてわからなかったらここで聞いてもわからないんじゃない?

まずは指定した数字が何番目にあるか判定するプログラムを作ってみて、
それができたら一つ前のデータと一つ後ろのデータを連結するように書いてみればいいんじゃない?
宿題スレにいって丸投げするのが一番早いと思うけど。

463 名前:デフォルトの名無しさん [2007/11/18(日) 13:04:03 ]
>>462
ありがとうございます。宿題スレいってみます。

464 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 15:18:47 ]
www.uploda.org/uporg1118116.txt.html
こういうプログラムを作ったのですが
これに「平均点順に並び替えて表示する」という操作を加えたいのですがよくわかりません。
お願いします。

465 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 17:31:47 ]
>>464
そのプログラムを自分で作れるなら出来ると思うけな

466 名前:459 mailto:sage [2007/11/18(日) 17:32:31 ]
>>460さん、レスありがとうございました^^
マスクという処理方法については
名前だけ知ってたものの具体的にどういうものかまだ知りませんでした。
数字についてはまだピンときてないので引き続き2進数10進数16進数についても色々勉強してみます。


また何かわからない事ありましたら皆さんよろしくお願いします!

467 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 18:05:59 ]
>>465
よくわからないでございます

468 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 18:10:51 ]
>>467
普通のソートと同じ

469 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 18:12:50 ]
そうなの?
ちょっとやってみる。thx



470 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 18:40:46 ]
n番目のcellのポインタを呼び出す関数(*cell getcell(n)とか)でも作って、
バブルソートで比較しては入れ替えを繰り返せばいいんじゃないか。
for(i=0;i<MAX-1;i++)for(j=0;j<i;j++){
x=getcell(j);
y=getcell(j+1);
if(x->heikin > y->heikin){xとyの入れ替え}
}
cellごと入れ替えるにはもう一個前にもアクセスせんといかんから、
cell内の値だけ入れ替えるのが楽なのかなぁ。

471 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 18:46:08 ]
その変数がnanかそうでないかを判断するにはどうすればいいですか?

472 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 19:24:18 ]
有名なイディオムx != x(IEEE 754なら確実;あほなコンパイラでない限り)
C99のisnan
一部の独自関数_isnan

473 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 21:18:54 ]
NGワード:ご教授

474 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 16:36:19 ]
ANSI-Cについて質問です。

#include <stdio.h>
int main(int argc, char *argv[])
{
int x = 10;
printf("x=%d¥n", x);
char *s = "foo"; /** should be error? **/
printf("s=%s¥n", s);
return 0;
}

というコードを gcc -Wall -ansi hoge.c としてコンパイルすると何のエラーもなくコンパイルできてしまったんですけど、
Cでは文のあとに変数宣言できましたっけ?できなかったと思うのですが。
今までダミーのブロックを使ってたけど、いらないということでしょうか。
なおGCCは4.0.1です。


475 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 16:46:34 ]
>>474
従来のCではダメ
C99ならOK

476 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 17:21:09 ]
>>475
なるほど!さんくす
ちなみによく知られているコンパイラのうち、C99に対応していないものはありますか。
変数宣言が先頭じゃなくていいのは大変便利なのでぜひ使いたいんですけど、世の中の対応状況次第ではやめとこうと思います。
調べてみたらGCCはver3から対応しているみたいでした。今のGCCはver4が主流だと思うので、GCCは大丈夫ですね。

477 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 19:20:14 ]
途中宣言はキモイから使いたくないな。

478 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 19:24:47 ]
途中宣言ってわけわからなくなったりしないのかな?

479 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 19:32:23 ]
>>476
Visual C++は対応していない。
世間一般ではGCCのようなC99に対応しているCコンパイラのほうが珍しい。

ブロック途中での変数宣言はC++だと当然の機能なんだけどね。



480 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 19:41:20 ]
自己参照構造体がイミフ
最初に用意したポインタの示す値をNULL(ストッパーの役割)にして
んで次に用意したポインタの示す構造体の内部の自己参照ポインタには、その直前にあった構造体のアドレスを代入して。
繰り返すごとにどんどん構造体が繋がるってのはわかるんだけど、
例えば先頭から10個目の構造体内部を書き換えたい!って場合はどうすりゃいいの?
予め10個目ってわかるように変数で振っとけばいいの?

481 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 19:45:40 ]
>>480
構造体を先頭から辿るときに、いま何個目かわかるように、その辿った回数を数えとけばいい

482 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 19:48:20 ]
結局ソレが一番無難ですかー。
習ってたものでは一つ一つに入力の際でも、内部処理としての変数でもカウントアップさせるようなものを用意して、
その番号に直。
か、または、たどる時に何個かこっちが指定するって感じですか・・・。
難しそうだ('A`

483 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 20:10:58 ]
つまり、何番目にアクセスしたいという要求が頻繁にあるときには、
そういう線形リストは向いていない。配列が向いている。

484 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 20:11:35 ]
>>480
自己参照構造体というか、線形リストのことでしょ。

485 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 20:49:54 ]
なるほど・・・勉強になります。

486 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 23:50:37 ]
>>479
狭い世間なんだね。

487 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 23:55:07 ]
なんか妄想してる奴がいるな

488 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 23:56:02 ]
構造体のメンバのアドレスって構造体の先頭のアドレスから
求められるものなの?

489 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 23:56:54 ]
>>478
途中宣言のほうが格段に読みやすい。



490 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 00:00:33 ]
関数の長さによるだろ。

491 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 00:03:41 ]
関数の長さによらず、途中宣言のほうが読みやすい。

492 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 00:10:17 ]
こんばんは
大学の課題のことで質問です。
文字列をクイックソートで並ぶかえるプログラムなのですが、エラーが出来ます。
void your_sort(char *s[NS][WC]) {

int pivot;
int l_hold,r_hold;
int x=0;
int left = 0;
int right = WC-1;
l_hold = left;
r_hold = right;
pivot = (left+right)/2;
while(x<WC){

while(left < right)
{
while(strcmp(&s[x][right],&s[x][pivot])>0)
right--;
if(left =right)
{
s[x][left] = s[x][right];
left++;
}


493 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 00:12:09 ]
>>492
コンパイラの警告は無視しないできちんと対処しましょう。
もしそのコードで警告が出ないようなら、コンパイラのオプションを見直しましょう。
もし警告レベルを換えても警告が出ないようなら、そんなコンパイラは投げ捨てましょう。

494 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 00:12:23 ]
while((strcmp( &s[x][pivot],&s[x][left])<0) &&(left <right))
right--;
if(left != right)
{
s[x][left] = s[x][right];
left++;
}
while((strcmp( &s[x][pivot], &s[x][left])>0)&&(left < right))
left++;
if(left != right)
{
s[x][right] = s[x][left];
right--;

}
left = l_hold;
right = r_hold;
if(left < pivot)
your_sort(s[x][pivot-1]);
if(right > pivot)
your_sort(s[x]pivot+1,right);
}
x++;
}
エラー:cpp(39) : error C2664: 'strcmp' : 1 番目の引数を 'char **__w64 ' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
どこがおかしいのか教えて下さい

495 名前:宿題スレへ逝け mailto:sage [2007/11/20(火) 00:16:14 ]
>どこがおかしいのか教えて下さい
あんたの頭。

496 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 00:26:48 ]
>>474
今更っぽいけど、ちょい補足。
-ansiはc89相当だけど、gcc拡張機能として途中の宣言が出来るので何も言われない。
厳密にc89を適応したければ-pedanticか-pedantic-errorsを-ansiと一緒に指定する。

でもコレやると//でのコメントとかですら怒られるけどな。

497 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 00:32:57 ]
>>495
いつもならこういう煽りは見ていて腹立たしくなるが今回は同意してしまった。

498 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 08:15:27 ]
>>494
>どこがおかしいのか教えて下さい

strcmp の 1 番目の引数がおかしいって書いてあるじゃん

499 名前:デフォルトの名無しさん [2007/11/20(火) 15:25:31 ]
bool 型同士の比較演算の結果はどうなるのでしょうか?
true / false それぞれが何らかの整数に変換されてから
比較されるのでしょうか?



500 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 16:09:59 ]
>>499
trueは非0、falseは0としてコンパイラが評価する。

501 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 16:14:20 ]
>>499
C言語にbool型なんて無い。

502 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 16:40:31 ]
>>501
c99はcではないとでも?

503 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 16:50:14 ]
それ_Boolのtypedef。
1と0を保持する整数型で、比較演算では結局int型に格上げされるはず。

504 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 17:25:48 ]
文字列0.051/0.056/0.095/0.010 msから
2番目の要素、上の文字列だと0.056を文字列検索かけてうまくとる方法教えてください

505 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 17:28:52 ]
>>504
これでいいのかな?
#include <stdio.h>

int main(void){
char str[]="文字列0.051/0.056/0.095/0.010 msから";
char second_value[100];

sscanf(str, "%*[^/]/%[^/]", second_value);
puts(second_value);

return 0;
}

506 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 17:41:44 ]
>>505
ありがとう、うまくいきました。
私が書いた正規表現が間違ってたみたいです。


507 名前:476 mailto:sage [2007/11/20(火) 21:55:54 ]
>>479
遅れましたが、情報サンクスです。
VisualC++が対応していないというのは驚きですね。C++とみなしてコンパイルすればいいんだろうけど。
>>496
細かい情報ありがとう。-ansiで厳密なANSI準拠にならないというのはなんか間違ってる気がする。UIとして。


508 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 01:12:45 ]
>厳密なANSI準拠
ここに矛盾を感じない人には丁度いいのでは?

509 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 10:18:11 ]
もうテンプレに、このスレはC89用って書いとけよ



510 名前:デフォルトの名無しさん [2007/11/21(水) 10:26:43 ]
C90 じゃなくて?

511 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 10:30:37 ]
うん

512 名前:デフォルトの名無しさん [2007/11/21(水) 10:38:37 ]
1年は365日ですけど、それを1月は31日、2月は28日、3月は31日・・・・12月は31日っいう感じに書き換えるプログラムを作りたいんですがどうすればいいでしょうか?

513 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 10:42:06 ]
お前にはまだ早い

514 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 10:44:07 ]
>>512
書き換えるの意味がわからん。
122日 -> 5月2日
という感じ?

515 名前:デフォルトの名無しさん [2007/11/21(水) 10:45:02 ]
>>514
そうです。

516 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 10:47:46 ]
年はどうするの?
うるう年を考慮するのか、とか

517 名前:デフォルトの名無しさん [2007/11/21(水) 10:50:25 ]
今年の月日です。

518 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 10:59:47 ]
>>517
自分で月数の配列作って計算してもいいけど、
標準関数使うなら、mktime で 2007年1月122日を設定(122はtm_mdayに入れる))すれば
tm_mon に0から始まる月、tm_mdayに1から始まる日が入るはず。

519 名前:デフォルトの名無しさん [2007/11/21(水) 11:20:43 ]
>>518
ありがとうございます!
…が、初心者の俺には難しいようでした。まったくわかりません。
お手数おかけしてすみませんでした。



520 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 11:27:40 ]
void calendar(int day){
if(day > 0 && day <= 365){
int data[] = {31,28,31,30,31,30,31,31,30,31,30,31};
for(int i=0;i<12;i++){
if((day-=data[i])<= 0){
printf("%d月%d日\n",i+1,day+data[i]);
return;
}
}
}
else
printf("1〜365の間で入力してください。\n");
}

521 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 11:32:06 ]
>>519
struct tm tm = {0};
tm.tm_year = 2007 - 1900;
tm.tm_mday = 122;
time_t t = mktime(&tm);

printf("%d月%d日", tm_mon + 1, tm.tm_mday);

522 名前:デフォルトの名無しさん [2007/11/21(水) 12:38:46 ]
#include <stdio.h>
int main(void)
{ char str[256];
char s[] = "This is a pen. That is an apple.";
int i,j,k,checker;
printf("This is a pen. That is an apple.\n\n");
gets(str);
for(j=0;j<256;j++)
{for(i=j,k=0;str[k]!='\0';k++,i++)
{if(str[k]==s[i])
{checker=1;
break;}
else
{checker=0;}}}
if(checker==1)
{printf("OK!その文字列は含まれています。。\n");}
else
{
printf("NG!その文字列は含まれていません。\n");}}

初期化した文字列(This is~)と, キーボードから入力した文字列 str に対し, 文字列中に str が出現するかどうかを判定して表示するプログラムを作成したいのですが、
なかなかうまくいきません。最初のifelse文においてのreturnが変だと思うのですが。
例えば This→OK That→OK is→OK apple→OK pple→OK…


523 名前:デフォルトの名無しさん [2007/11/21(水) 12:43:41 ]
>>522
#include <string.h>
char *strstr(const char *s1, const char *s2);

www9.plala.or.jp/sgwr-t/lib/strstr.html
これじゃ駄目なの?



524 名前:デフォルトの名無しさん [2007/11/21(水) 12:45:39 ]
>>523
申し訳ないです。
stiring.hを使わず、for文でループして検索するっていう条件付です;


525 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 12:51:49 ]
>>522
この前同じようなの見かけた
pc11.2ch.net/test/read.cgi/tech/1194016813/389-

526 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 12:54:12 ]
>>522
×s[] について検索開始位置 (j=0 ; j<256; j++)とあるが、s[j] != '\0'でで辞めるべき
×1文字でも一致していると、処理を抜けてしまう
→1文字でも不一致で処理を抜けるべき

527 名前:526 mailto:sage [2007/11/21(水) 13:01:08 ]
あと、2段目のforループで一致判定出たら、1段目のforループ抜けるのも
忘れずに

528 名前:デフォルトの名無しさん [2007/11/21(水) 13:04:16 ]
>>526
ってことは根本的には間違ってるんですかね?
数文でもいいので例をあげてもらえればうれしいです。

529 名前:デフォルトの名無しさん [2007/11/21(水) 13:07:14 ]
>>527
あっ、なるほど!
サンクスです。



530 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 13:08:29 ]
>>522
なるべく原型を留めたつもり。

char *sp,*strp,*bsp;
for(sp = s; *sp!='\0';sp++){
for(strp = str, bsp=sp; *strp!='\0' && bsp != '\0';strp++,bsp++){
if(*strp == *bsp)
checker = 1;
else{
checker = 0;
break;
}
}
if(checker)
break;
}


531 名前:デフォルトの名無しさん [2007/11/21(水) 13:12:26 ]
やばいw
少しわかったつもりですが、forで混乱してるかも…
>>527のヒントがすごいわかり易いんですけど、こっからつまってます。

532 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 13:21:12 ]
つーかchekerは0で初期化しといて、elseで代入はやめなよ

533 名前:デフォルトの名無しさん [2007/11/21(水) 13:25:37 ]
>>532なるほど

教えてくんでごめんなさい


534 名前:デフォルトの名無しさん [2007/11/21(水) 15:07:20 ]
整数型の数字を一文字ごとに分割したいので
sprintf(b,"%x",a);
としたのですが
printf("%s",b[0]);
としてみたところセグメントエラーが出てしまいます
どうしてでしょうか?
aはint型変数です

535 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 15:11:50 ]
bの型は?
あと%xは16進数、%sは文字列だがいいのか?
b[0]がchar型なら、%cだろ?

536 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 15:12:17 ]
bがchar*として考えると,printf("%s",b[0]);はprintf("%c",b[0]);

537 名前:デフォルトの名無しさん [2007/11/21(水) 15:29:47 ]
>>535>>536
sとcは違うんですねw
ありがとうございました

538 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 16:36:35 ]
同じだと思ってたのか

539 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 16:56:03 ]
>>536
ウソツケ

printf("%s",b[0])
はb[0]の値をアドレスとする番地から始まるゼロ終端文字列を表示し
printf("%c",b[0])
はb[0]の値を文字コードとする文字を表示する



540 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 17:07:12 ]
質問から読んで書いてるのだろうか。

541 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 17:08:37 ]
>>539
後者に直せって意味で書いた

542 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 17:13:21 ]
何コイツ

543 名前:539 mailto:sage [2007/11/21(水) 17:40:45 ]
>>541
スマン
イコールの意味だと勘違いしてた

544 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 17:53:09 ]
m9(^Д

545 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 18:49:06 ]
borlandからVisualStudio2005に変えたんですが、
VSだとexeファイルってできないんですかね


546 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 18:51:05 ]
なぜそう思った?

547 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 19:24:48 ]
debug フォルダの中にできてるよ。

548 名前:デフォルトの名無しさん [2007/11/21(水) 21:23:29 ]
初心者です。
return 0
がどういう意味なのかがどうしても分かりません。
return 0
があると、コンピュータは何をするのでしょうか?

549 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 21:28:57 ]
まずmain内に記述してると思うけど、main関数(mainという小さなプログラム)があるんだ。
int main(void)って書いてるでしょ?
return 0;ってのは、OSに 正常終了しましたよ〜って知らせるための記述。
でなぜ0なのかってのはint main(void)ってコトからわかるように、
main関数には整数を返しますよってコトです。

まぁ余談になったけど、 正常終了 ってコトです。



550 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 21:31:20 ]
>main関数には整数を返しますよってコトです。
「には」じゃなくて「は」だろ。

551 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 21:32:29 ]
んじゃreturn 1だとしたらどうなるんです?

552 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 21:35:19 ]
光あれと1と戻すだけ。
受け取る者がいなければ、
次のクロックで虚無に消える。


553 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 21:35:20 ]
return 1って異常終了じゃないっけか?
exit(1)と同じだと認識してる・・・

554 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 21:39:37 ]
受け取る側で判断するから異常とは限らないな

555 名前:デフォルトの名無しさん [2007/11/21(水) 22:01:01 ]
>>549
そうです。それがよく分からないんです。
正常終了したかどうかはコンピュータが判断することでは?
「これは正常終了したことにします」って人間が決めちゃうんですか?
「正常終了」の意味が分かってないんだと思います。
main()関数は引数として0か1を渡してあげないといけないということでしょうか?
1を渡した場合、どうなるのでしょうか?


556 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 22:03:03 ]
2とか3とかも渡せるぞ

557 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 22:09:00 ]
>>555
OSが何なのか分かってないのでは?

558 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 22:13:03 ]
>>555
別にプログラムから1が返ってきたからってコンピュータはどうもしないけど、
シェルスクリプトやバッチファイルでコマンドの終了状態で処理を分岐したりだとか、
make中にコンパイルが失敗した時に処理を中断したりだとか、
そういう場面で使う。

俺的には「1つのプログラムで処理が完結する場合ばっかりじゃないので、
一応お約束が決まってます」ってぐらいだと思ってるけど。

559 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 22:14:25 ]
>>555
コンピュータがどうやって「正常終了」の判断をするのかkwsk



560 名前:555 mailto:sage [2007/11/21(水) 22:19:56 ]
スマン適当に言っただけだ。流してくれ。

561 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 22:21:03 ]
>>555
main関数からどんな値を返そうと、WindowsやUnixなど大抵のOSは何も行わない。
ただ、その値を「欲しがっているところ」に引き渡すだけ。
「欲しがっているところ」とは、単に別のプログラム、大抵はバッチファイルやシェルスクリプト。

0が正常終了というのは、シェルスクリプトらとプログラムとの間の暗黙の了解。
当時の資料を探せば何か根拠が出てくるかもしれない。
Cはそれを標準規格へ取り込んだ。

562 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 22:32:10 ]
正しいか正しくないかは人間がきめること。
CPUはただクロックを数えるのみ。


563 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 22:40:55 ]
自己参照構造体のポインタの動きで頭がこんがらがりまくる・・・
繋ぎなおして先頭アドレスをmainに返すってのはわかるんだけど、
か、書けねえ・・・
なんかコツとかありますか('A`)

564 名前:デフォルトの名無しさん [2007/11/21(水) 22:44:19 ]
>>557-558>>561
ありがとうございます。
どうやら
return 0;
が何かを理解するのに必要な知識がだいぶ不足しているようです。
OSが何なのかや「make中」などが分かりません。
あてどもなくググってみたところ、
www.mech.utsunomiya-u.ac.jp/ozaki/education/c/text.html
の下の方の記述を見つけ、ようやっと、「一応お約束」や「暗黙の了解」
という意味が分かりました。
ただ、
return 0;
を書いた段階でプログラムが終わってしまうのは知りませんでしたが、
引数を返した時点で関数というのはそれ以上見なくなってしまうものなんですね。
もう少し勉強が必要です。少し知識を身につけてから、また皆さんの書き込み
を見たら意味が理解できるのかもしれません。ありがとうございました。

565 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 22:44:37 ]
紙に書いて考えれば?

566 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 22:45:22 ]
>>563
構造体を四角、ポインタの指す方向を線で、紙に書いてやってみそ。
慣れたら、頭の中でできるようになる。

567 名前:デフォルトの名無しさん [2007/11/21(水) 22:52:16 ]
www.mech.utsunomiya-u.ac.jp/ozaki/education/c/text.html
の下の方のところ、貼っておきます。
------------------------------------
return 0 とは,プログラムの正常終了を意味している.とはいえ,これは UNIX 上でないとほとんど意味をなさないかもしれない.
UNIXでは,シェル(shell)と呼ばれるインタフェースプログラムを介してプログラムの実行が行われる. return 0 はこのシェルに
よってプログラムの終了状態に合わせた処理を行わせることができる.たとえば,Bash(Linux の標準シェル)の場合,

if program; then echo "OK"; else echo "ERROR"; fi

と記述することによって, program という名前のプログラムを実行し,もしそのプログラムが正常に終了した場合は OK を表示し,
正常に終了しなかった場合には ERROR を表示するようにすることができる. 正常に終了しなかった場合を表すには,たとえば次のよう記述する.
#include <stdio.h>

int main()
{
int a, b, c;

if (c != 0) {
a = b / 0;
} else {
printf("c = 0 なので割れません\n");
exit(1); /* 異常終了として1を返してプログラムを終了する */
}
return 0;
}

このプログラムでは, 0で割算を行わないように,まず変数 c がゼロでないかチェックし,もし変数 c がゼロのときには異常を
示してプログラムを終了する. exit() はプログラムを終了させるための関数で,引数の値が返される.一般的には,正常に終了
した場合には 0 を返すことにし,正常に終了しなかった場合には他の値を返すことになっている.だから,return 0 は
プログラムの正常終了を示すために必要なのである.また,main() の前の int は 0 や 異常終了の値の型を表している.

568 名前:デフォルトの名無しさん [2007/11/21(水) 23:11:09 ]
おそらく>>297は皆を困らせようとして書いただけだよ

569 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 23:50:47 ]
xor eax, eax
ret




570 名前:デフォルトの名無しさん [2007/11/21(水) 23:59:44 ]
>>564
process.h のsystem関数で外部exeを実行できるんだけど、
system関数の戻り値がintでそのプログラムが返した値を返す。
最後にreturn 0;だったら0。return 10;だったら10。
void main()だと不定っぽい。

571 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 00:04:12 ]
//child.c
#include <stdio.h>
int main(){
printf("hogeeeeeeee!!\n");
return 10;
}

//parent.c
#include <stdio.h>
#include <process.h>
int main(){
printf("system::%d", system("child"));
return 0;
}

二つをコンパイルしてparentを実行した結果
>hogeeeeeeee!!
>system::10

と出るはず。


572 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 01:13:16 ]
プログラムの正常終了は0だが、各関数の正常終了も0を返すようにしてる?
if文やwhile文が0以外を真としたりするので、0を返しちゃうと判定で偽になるよね?
みんなは省略形は使わずに、必ず==で何かと比較してますか?

573 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 01:16:40 ]
俺はmain以外の関数の場合、<ctype.h>のisナントカに合わせて0以外を真と見做すことにしている。
ほかの言語 (C++, Java, C#)でもtrueは1で、falseは0に相当するし。

574 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 02:05:04 ]
自分はファイル分割をする際、main.hなどと命名したヘッダファイル
にプロジェクトで使う全ての関数をプロトタイプ宣言しています。
例えば、
<<main.hの中身>>
#include "proj1.h"
extern void test1(void);
extern int test2(int);
    : // 以下色々な宣言等を列挙
といった具合です。
今までプロトタイプ宣言している関数の頭にはとりあえずexternを
書く必要があるのだろうと思っていました。
しかし、このexternを書かなくても正常にビルド出来てしまいます。
環境がVisualStudioだからでしょうか?
このextern宣言は邪魔くさいのでこれからは外して記述しようと思う
のですが、externが無い場合困るケースとしてどのような事が考えられますか?

575 名前:デフォルトの名無しさん [2007/11/22(木) 02:50:24 ]
ヤメレ

576 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 04:51:07 ]
関数の宣言は暗黙にexternだから別に構わないけど、
変数は定義になるから、extern必須。
普通は両方つけて揃えるはず。

577 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 05:19:54 ]
関数にexternをつけてるソースは、殆ど見た事が無いなぁ。

578 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 07:20:44 ]
>574

直接関係無いけど、なんでもかんでもグローバル関数にしないこと。


579 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 11:05:55 ]
static でプロトタイプ宣言するのと区別するのに、
外部参照なんだから extern つければ?




580 名前:デフォルトの名無しさん [2007/11/22(木) 11:53:53 ]
ビットマップの画像を平行移動させるプログラムを作っているのですが、
出力が真っ黒になってしまい、うまく動作しません。
単純なバグだと思うのですが、教えていただけると大変助かります。よろしくお願いします。

/* 画像の平行移動 */
void image_shift( unsigned char out2[Y_SIZE][X_SIZE][3],
unsigned char out[Y_SIZE][X_SIZE][3] )
{
unsigned int i,j,sx,sy,x,y;

sx=148; // X方向のシフト量
sy=128; // Y方向のシフト量

for(i=0;i<biHeight;i++){
for(j=0;j<biWidth;j++){
y=i+sy;
x=j+sx;
out2[y][x][0]=out[i][j][0];
out2[y][x][1]=out[i][j][1];
out2[y][x][2]=out[i][j][2];
}
}
}


581 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 13:43:27 ]
OPENGLを使えばいいと思うよ><
あとBMPがちゃんと確保されてるか確認した?



582 名前:デフォルトの名無しさん [2007/11/22(木) 13:50:06 ]
回答ありがとうございます!
BMPはちゃんと確保されてます。そのまま出力もできますし・・・
OpenGLも考えてみます。

583 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 13:51:19 ]
>>580
取り敢えずシフト量を0にして試してみたら?

584 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 14:04:32 ]
シフト量を0
そのあと1とか小さい値にして

デバッグモードで確認して


585 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 14:07:41 ]
シフトした分だけあふれてるような気がするんだけど。

586 名前:デフォルトの名無しさん [2007/11/22(木) 14:11:17 ]
みなさんのおっしゃるとおりです。
シフト量を0にすると、ちゃんと元の画像が出るんです。
ずらすと真っ黒になったりするんです。マイナス方向にずらすとエラーで止まってしまいますし・・・。


587 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 14:15:36 ]
>>マイナス方向にずらすとエラーで止まってしまいますし・・・。

それout2の領域外に書き込んでないか?
つまり配列の添え字がマイナスになったりX_SIZEやY_SIZEをオーバーしたり…

588 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 14:19:34 ]
for(i=0; i<biHeight; i++) {
for(j=0; j<biWidth; j++) {
y = (i+sy) % biHeight;
x = (i+sx) % biWidth;
ってしてみれば?

589 名前:デフォルトの名無しさん [2007/11/22(木) 14:19:53 ]
ありがとうございます!
やっと解決しました。
大きな理由はビットマップのビット深さを間違えてました。
どうもお手数おかけしてすいません。ありがとうございました!



590 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 14:38:34 ]
アチャー

591 名前:デフォルトの名無しさん [2007/11/22(木) 14:47:41 ]
なんかC言語の配列って何度も呼び出すと鈍くならない?
なんで
a = x[y[z[n]]];
みたいな感じ

a=z[n];a=y[a];a=x[a];
のほうが速くない?

592 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 14:56:24 ]
計ってみれば?

593 名前:デフォルトの名無しさん [2007/11/22(木) 15:05:40 ]
計ってみたよ 配列に何度も入れた方がわずかに速いようだ

#include <iostream>
#include <time.h>
#define N 900000
using namespace std;
main(){
unsigned int n,k,c,sum;
unsigned int *x,*y,*z,*v,*w;
x=new unsigned int [N]; y=new unsigned int [N];
z=new unsigned int [N]; v=new unsigned int [N];
w=new unsigned int [N];

for(n=0;n<N;n++){x[n]=rand()%10;y[n]=rand()%N;z[n]=rand()%N;v[n]=rand()%N;w[n]=rand()%N;}

sum=0; c=clock();
for(n=0;n<N;n++){k=w[n];k=v[k];k=z[k];k=y[k];sum+=x[k];}
c=clock()-c; cout<<c<<" clock "<<sum<<endl;

sum=0; c=clock();
for(n=0;n<N;n++)sum+=x[y[z[v[w[n]]]]];
c=clock()-c; cout<<c<<" clock "<<sum<<endl;
}


594 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 15:30:37 ]
>>593
手元のiccでは全く同じコードにコンパイルされたよ。
--
movl (%rbx,%rcx,4), %ecx #15.20
movl (%rbp,%rcx,4), %edi #15.27
movl (%r12,%rdi,4), %r8d #15.34
movl (%r13,%r8,4), %r9d #15.41
addl $1, %edx #15.13
movl %edx, %ecx #15.13
addl (%r10,%r9,4), %r15d #15.46
movl %ecx, %edx #15.1
cmpl $900000, %edx #15.1
jb ..B1.15 # Prob 99% #15.1
--
movl (%rbx,%rcx,4), %ecx #19.30
movl (%rbp,%rcx,4), %esi #19.28
movl (%r12,%rsi,4), %edi #19.26
movl (%r13,%rdi,4), %r8d #19.24
addl $1, %edx #19.13
movl %edx, %ecx #19.13
addl (%r9,%r8,4), %r15d #19.17
movl %ecx, %edx #19.1
cmpl $900000, %edx #19.1
jb ..B1.23 # Prob 99% #19.1
--

595 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 15:31:30 ]
処で、>593はなんでC++でコンパイルしているんだ?

596 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 15:34:55 ]
仮想関数を利用する上での注意点があれば教えて下さい。

597 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 15:40:00 ]
iccだとmovlにしてくれるのか
VCだとmov,mov,...ってのにしかならない

598 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 15:44:40 ]
>593以下速度の話題
C/C++スレか速度スレ、或いは最適化スレへどうぞ。

>>596
あんたもスレ違い。

599 名前:デフォルトの名無しさん [2007/11/22(木) 21:02:53 ]
for(i=10;i>=0;i--)printf("%d\n"i);
っていうコード unsigned にするとやばいね 全然気づかなかったよ



600 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 21:11:23 ]
処理系依存になるってこと?

601 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 21:17:31 ]
unsigned int iに対してi>=0は常に真だべ

602 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 21:20:46 ]
なるほど
どうもありがとう

603 名前:デフォルトの名無しさん [2007/11/22(木) 22:37:22 ]
ポインタが指してる内容を配列に入れたいのですがどうしたらいいですか?
例えば、
char *a="ABC";
char b[4];
このとき、 b[0]=A,b[1]=B,b[2]=C にしたいです。

604 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 22:39:15 ]
strcpy(b,a);

605 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 22:41:18 ]
memmove(b,a,3);


606 名前:603 mailto:sage [2007/11/22(木) 23:01:19 ]
>>604,>>605
できました。
ありがとうございます。



607 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:01:27 ]
for(i=0;b[i]=a[i];i++);

608 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:16:00 ]
昨日自己参照構造体でのリストについてかけねーって嘆いてた者だけど、
今日紙に書きつつ、これがこーなるから次はこうなるだろーってソース書いてったら無事動きました!

609 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:28:12 ]
二次方程式の解の公式を求めるプログラムを作れとの課題が出たので考えてみたのですが
思うようにうまくいきません。
#include <stdio.h>
#include <math.h>


int main() {
double x1 ,x2, a, b, c;

printf( "a = " );
scanf("%lf" , &a);

printf( "b = " );
scanf("%lf" , &b);

printf( "c = " );
scanf("%lf" , &c);

x1 = -b+sqrt(b*b-4.0*a*c)/2.0*a;
x2 = -b-sqrt(b*b-4.0*a*c)/2.0*a;
printf("x1= %lf x2= %lf\n", x1, x2);
}

までできたのですが、
x1= -1.#IND00 x2= -1.#IND00
何を入力してもこの答えになってしまいます。
自分なりに見直してみたのですが間違いが分かりません。
どなたかご教示いただけたら幸いです。





610 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:32:03 ]
そもそも式が違うじゃん

611 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:39:05 ]
かけざんとわりざんはたしざんやひきざんよりもさきにけいさんします。

612 名前:609 mailto:sage [2007/11/22(木) 23:40:33 ]
式からして間違ってるのでしょうか?
今の式じゃ-bがが最後に計算されてしまうってことですかね?

613 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:43:51 ]
>>609
あなたが書いている式は

       √(b^2 - 4ac)
x1 = -b + ------------- * a
          2

こんなだよ

614 名前:609 mailto:sage [2007/11/22(木) 23:44:12 ]
x1 = (-b+sqrt(b*b-4.0*a*c))/2.0*a;
x2 = (-b-sqrt(b*b-4.0*a*c))/2.0*a;

こんな感じでいいんでしょうか?あと
warning C4996: 'scanf' が古い形式として宣言されました。
というエラーが発生してるんですがこれが原因でしょうか?
習ったとおりに書いてみたのですが。

615 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:46:11 ]
printfで%lfは標準じゃなかった気がする。
独自拡張とかC99とかならいけたかもしれんけど。

616 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:47:57 ]
>>613
最後のaは分母にかかりますよね?

>>615
そうなんですか・・・家と学校じゃ環境が違うのでそのせいかもしれません。
他に間違ってるところありますかね?

617 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:48:09 ]
>>614
それは警告であってエラーじゃない

618 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:48:11 ]
>>614 (...)/2*aじゃなくて(...)/(2*a)

619 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:48:15 ]
それだと

    -b + √(b^2 - 4ac)
x1 = ----------------- * a
         2
だな

>warning C4996: 'scanf' が古い形式として宣言されました。
warning C4996 でぐぐれ



620 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:48:46 ]
>>616
かからねーよwww

621 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:51:39 ]
>>618-620
なるほど・・・()付けない限り数字同士はくっ付かないんですか
ご指摘ありがとうございます。修正してみましたが、相変わらず答えは変わりません。
他に間違っているところがないのであれば家の環境が悪いということで諦めます。


622 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:53:55 ]
入力してる値が悪いのでは?実数解を持つ値を入れてみ

623 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:59:22 ]
>>622
答えがでました。適当に値を入れていたのが原因でしたか・・・
こんな基礎の問題に答えてくれて助かりました。
もっと勉強しないと駄目なようです、ありがとうございました。

624 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 00:02:47 ]
適当にいれんなよwwwwwwwwwwww

625 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 00:05:03 ]
Cに一番大事なのはとにかく基礎。
応用なんてものは後回しでとにかく基礎だぜ。

626 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 00:06:46 ]
AもBもすっとばしていきなりCやるとはたかれるってことですよねー

627 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 00:11:14 ]
たまにする背伸びは楽しいけどな
良い気分転換になる

628 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 00:12:09 ]
fizzbuzzもかけない段階でchaos pp使ってメタプログラミングしたりな

629 名前:助けてBOYZ [2007/11/23(金) 02:27:55 ]
今日からの連休中に3つの課題を出されました。
ポインタ大嫌いです。
どなたか助けて下さい。
この問題が一つ目です。

【問】数字文字列を数値化する関数を作成して下さい。

<関数仕様>
書式 :short *AtoS(char *pStr, int *pRetCode);
戻り値:数字文字列のポインタ
引数 :char *pStr → 文字列の先頭アドレス
    :int *pRetCode → 動作の成否を返す (正常なら:0,エラー時は-1)
              ※但し、NULLの時は返さない
処理 :pStrで与えられた文字列をshort型の数値に変換する
    ※負数(マイナス)にも対応

<考慮必要事項>
・short型の範囲外の数値文字列
・非数字文字列
・数字文字列と非数字文字列の混在(先頭の'-')は除く
・空文字列
・NULL

以上の5つはpRetCodeの示す領域にはエラーを返す、戻り値は0



630 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 02:28:53 ]
>>629
いつまで逃げ続けられるの?
終わりはあるの?

631 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 02:40:04 ]
>>629
自分で考える気がないなら宿題スレへ
pc11.2ch.net/test/read.cgi/tech/1195668114/

632 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 03:03:04 ]
>>609
printf("x1= %f x2= %f\n", x1, x2);
で試したのか? どうみてこうだと思うんだが

633 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 03:05:05 ]
>>632
そういう問題じゃないから

634 名前:助けてBOYZ [2007/11/23(金) 03:11:41 ]
何とか自分で作ってみました。
だけど戻り値?とか関数の意味がよく分からないし、何だかグダグダと
長いプログラムになってしまいました。
ポインタ&関数を理解するコツを教えて下さい。

635 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 03:15:18 ]
戻り値ってshort*なの?

636 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 03:15:18 ]
そもそも問題がおかしいのにどうしろと
文字列を数値化するのに文字列へのポインタ返してどうしろと

637 名前:助けてBOYZ [2007/11/23(金) 03:22:30 ]
戻り値はshortみたいです。
一応表示はされたんですけど…
ちょっとチェックして下さい。
おかしいところ教えて下さい。

638 名前:助けてBOYZ [2007/11/23(金) 03:26:42 ]
#include <stdio.h>
short AtoS(char *pStr, int *pRetCode);
int main(void)
{
short val;
int ret = 0;

val = AtoS("1234", &ret);
printf("%d\n", val);

val = AtoS("-789", &ret);
printf("%d\n", val);

val = AtoS("atai", &ret);
if (-1 == ret) {
printf("数値文字列でないデータが渡されました。\n");
}
return 0;

639 名前:助けてBOYZ [2007/11/23(金) 03:27:56 ]
改行が多くて入りませんでした。
間違ってるところあれば教えて下さい。
short AtoS(char *pStr, int *pRetCode)
{
int *p;
int i;
int sum;
short goukei;

goukei = 0;
if (pStr[0] == '-') {
for (i = 1; pStr[i] != '\0'; i++) { /* p[0]に'-'が入力された */

pStr[i] = pStr[i] - '0';
goukei = pStr[i] + (goukei * 10);
}
goukei = goukei - (goukei * 2);
return goukei;
}
goukei = 0;
for (i = 0; pStr[i] != '\0'; i++) { /* p[0]〜'\0'の中に数字だけが入力された */
if (pStr[i] > 48 && pStr[i] < 58) {
pStr[i] = pStr[i] - '0';
goukei = pStr[i] + (goukei * 10);
}
else {
*pRetCode = -1;
return pRetCode[0];
}
}
return goukei;



640 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 05:10:13 ]
>>629
次からは宿題スレへ
#include <stdio.h>
short AtoS(char *pStr, int *pRetCode)
{
int n,s;
if(pRetCode == NULL) return 0;
*pRetCode = -1;
if(pStr == NULL || *pStr == '\0') return 0;
for(s=*pStr=='-'?1:0,pStr+=s,n=0;*pStr != '\0' && *pStr>='0' && *pStr<='9';pStr++)
n=n*10+*pStr-'0';
n=s==1?-n:n;
if(*pStr != '\0' || *(pStr-1) == '-' || n<-32768 || n>32767) return 0;
*pRetCode = 0;
return n;
}
int main()
{
int i,s,r;
char t[][8]={"","-","a","-a","a1","1a","1-",
"-32769","-32768","-1","0","1","32767","32768","-000001","000001"};
printf("String\t: Value\t(RetCode)\n");
s = AtoS("1",NULL);
printf("\"1\"\t: %d\t(NULL)\n",s);
s = AtoS(NULL,&r);
printf("(NULL)\t: %d\t(%d)\n",s,r);
for(i=0; i<sizeof(t)/8; i++) {
s = AtoS(t[i],&r);
printf("\"%s\"\t: %d\t(%d)\n",t[i],s,r);
}
return 0;
}

641 名前:640 mailto:sage [2007/11/23(金) 06:31:08 ]
訂正
#include <stdio.h>
short AtoS(char *pStr, int *pRetCode)
{
int n,s;
if(pRetCode == NULL) return 0;
*pRetCode = -1;
if(pStr == NULL || *pStr == '\0') return 0;
for(s=*pStr=='-'?1:0,pStr+=s,n=0;*pStr != '\0' && *pStr>='0' && *pStr<='9' && n>=-32768;pStr++)
n=n*10-*pStr+'0';
n=s?n:-n;
if(*pStr != '\0' || *(pStr-1) == '-' || n<-32768 || n>32767) return 0;
*pRetCode = 0;
return n;
}
int main()
{
int i,s,r;
char t[][16]={"","-","a","-a","a1","1a","1-",
"-32769","-32768","-1","0","1","32767","32768","-000001","000001","4294967296"};
printf("String\t: Value\t(RetCode)\n");
s = AtoS("1",NULL);
printf("\"1\"\t: %d\t(NULL)\n",s);
s = AtoS(NULL,&r);
printf("(NULL)\t: %d\t(%d)\n",s,r);
for(i=0; i<sizeof(t)/16; i++) {
s = AtoS(t[i],&r);
printf("\"%s\"\t: %d\t(%d)\n",t[i],s,r);
}
return 0;
}

642 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 09:05:09 ]
>>639
> pStr[i] = pStr[i] - '0';

文字列へのポインタ貰った関数が、中身を書き換えちゃいけない。
呼び出し側が、
n=AtoS("12345", &x);
とした場合、pStrの指す先は書き換えは不可能である処理系が多い。

普通、こういう文字列へのポインタを貰う関数は、
short AtoS(const char *pStr, int *pRetCode)
のようにconstを付ける。

643 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 09:23:18 ]
>641

for(s=*pStr=='-'?1:0,pStr+=s,n=0;*pStr != '\0' && *pStr>='0' && *pStr<='9' && n>=-32768;pStr++)
n=n*10-*pStr+'0';

↑こういう可読性の悪い書き方はやめようぜ…


644 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 09:24:47 ]
わざとだろう

645 名前:デフォルトの名無しさん [2007/11/23(金) 10:41:36 ]
x[n]とr=0.6に対して

(x[0]-x[1])/x[1] + r * (x[1]-x[2])/x[2] + r^2 * (x[2]-x[3])/x[3] + ・・・

という計算を多くするとき計算が速く終わるコードって分かりますか?
x[n]は変化します 厳密な値ではなくていいです

646 名前:デフォルトの名無しさん [2007/11/23(金) 10:42:45 ]
あとx[n]の値は50%以内のずれしかありません

647 名前:デフォルトの名無しさん [2007/11/23(金) 10:54:43 ]
x[n]の平均値hとその誤差をd[n]とすると

(x[0]-x[1])/x[1]
=d[0]-d[1]/x[1]
=d[0]-d[1]/h
=(d[0]-d[1])*k k=1/h
とすれば速そうですね

648 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 11:57:13 ]
(x[0]-x[1])/x[1] = x[0]/x[1]-1 でしょ。
-1の部分だけ分けて、
元の式=x[0]/x[1]+r*x[1]/x[2]+r^2*x[2]/x[3]....-(1+r+r^2+...)
とすれば、
r=0.6固定なら後ろの部分は定数だから前もって計算しておけば早いのかも。

精度が無視できる項以降は計算しないって手もあるのかな。
有効数字2ケタでいいなら、0.6^10以降は計算しなくてもいいと思う。

649 名前:デフォルトの名無しさん [2007/11/23(金) 12:22:00 ]
>>648
サンクス



650 名前:574 mailto:sage [2007/11/23(金) 13:43:42 ]
>>576-579
ありがとうございました。
プロトタイプ宣言はやはり暗黙的にexternのですね。
社内のソースと合わせるため、一応これからはグローバルな関数はexternを付けて区別していこうと思います。

651 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 14:22:28 ]
プロトタイプ宣言は厳密には暗黙的に extern なのではなくて、
それより前に static なプロトタイプ宣言や関数定義がなければ extern になり、
あれば static になる。

652 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 14:24:28 ]
そういうときに「規定」って言葉を使うのかな。


653 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 14:26:23 ]
ヘッダファイルで static な関数プロトタイプを書くことは無いし、
ヘッダファイルはファイルの先頭でインクルードするしで、
>>651 のような曖昧さがあっても実際の所これが問題になる事はない。
extern をつけるかどうかは好みの問題。

654 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:14:15 ]
>>653
すまん。
前2行と後ろ2行の関係が分からん。
出来ればもうちょい詳しく頼む。

655 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:39:55 ]
別のスレに翻訳単位をよくわかってない奴がいたな。
ヘッダファイルは彼にとって何か特別なものなのかもしれないが。

656 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:52:05 ]
>>654
前2行の理由により、普通はヘッダファイル内にあるプロトタイプ宣言より先に
static なプロトタイプ宣言や関数定義が現れることはないから、
実質的には暗黙的に extern になると考えても問題ないという話。

657 名前:デフォルトの名無しさん [2007/11/23(金) 19:14:43 ]
ここに来てるのってみんなプログラマーなの?

658 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 19:36:03 ]
プログラムが出来るって意味ではみんなプログラマーだろうな

659 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 19:59:26 ]
職業=プログラマはあんまいないと思う
学生とSEばっか



660 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 20:09:55 ]
いや、プログラマーって普通にいるだろ。

661 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 20:13:13 ]
>>659
SEが居るならプログラマも居る事になるんだよ

662 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 20:19:42 ]
SEと職業プログラマはちょっと違うけどな

663 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 20:21:40 ]
あ、名刺はSEだけどプログラマって人はいっぱいいると思う
特に若い人。

664 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 20:35:16 ]
昔職業プログラマって優れたコードを書く人だと思ってたけど、
なってみたら優れたコードとかは二の次で動くコードを書く人だと知った。

665 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 20:40:15 ]
資格とかいらなくて、基本的にだれでもやれる職業だしな。

666 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:25:12 ]
頭使うドカタだしな。

667 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:44:55 ]
名刺もってるプログラマに出会ったことないんだけど

668 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:46:47 ]
名刺は持ってるぞ
渡す機会は無いけど

669 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:47:29 ]
名刺に「プログラマ」と書くとどうしても低く見られるから、
「システムエンジニア」と書くんだよ。




670 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:48:33 ]
みんな普通にもってるでしょ?
自社以外の人にいっさい会わないで、こもって仕事してるならいらないけど。
名詞の肩書きに「プログラマー」とか入ってないって意味?

671 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:50:10 ]
所属とか役職は入ってるけど、プログラマーとかSEとかってのは書いてないよね。

672 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:50:43 ]
いや、会社が名刺をつくってくれないらしいんだが……

673 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:54:02 ]
たまにしか使わないのに何十枚も刷ると高いから、
使うときに1枚だけプリンタから出せってことだよ。

674 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:58:23 ]
数十枚刷れば数年もつ

675 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:03:15 ]
プログラマが名刺出すような状況にならんだろ
SEとして派遣されたら名刺だすけどさ

676 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:10:23 ]
>672-673

どんだけ貧乏な会社なんだよ。
100枚1000円ぐらいなのに…


677 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:11:36 ]
使わないものを作ったってねぇ

678 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:15:03 ]
あんま名刺出すとセールスの電話が増えて業務が滞る

679 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:19:51 ]
>>678
わたくしどもはお客様の会社にプログラマを派遣いたしております
わたくしどもは常に優秀な人材を取り揃えてございます
おたくの会社にもおひとついかがでしょうか?



680 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:23:29 ]
おもしろくないよ

681 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:32:04 ]
そのとおり
笑えない話なのさ

682 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:47:54 ]
Cでpow(5,i)の計算をした時のことでお聞きしたいことがあります。
最初はpow(5,0)=1,pow(5,1)=5,(5,2)=25....と順調です。
しかし、pow(5,23)の時に本来ならば11920928955078125のはずなのですが、
なぜか11920928955078124と1小さい数になってしまいます。
pow(5,24)以降も正しい数値が得られず誤差がどんどん大きくなっていってしまいます
この原因が全く分からず途方にくれている状態です…よろしくお願いします。

683 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:50:40 ]
>>682
ttp://ja.wikipedia.org/wiki/%E8%AA%A4%E5%B7%AE#.E8.A8.88.E7.AE.97.E8.AA.A4.E5.B7.AE.E3.81.AE.E7.A8.AE.E9.A1.9E

684 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:51:45 ]
>>682
doubleの有効桁数を超えてるとか。

685 名前:デフォルトの名無しさん [2007/11/23(金) 23:57:53 ]
多売長ライブラリ

686 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:15:23 ]
>683

倍精度浮動小数点で普通使われるIEEE 754 形式だと仮数部52ビットだけど、
pow(5,23)で52bitを超えるから、以降は誤差が出る。
誤差を避けるためには自分で作るしかない。
でも多分そういうアルゴリズムは探せばあるよ。


687 名前:デフォルトの名無しさん [2007/11/24(土) 01:53:27 ]
0*0.003=0

をlog計算するためにプログラムでかくにはどうすればいいですかね?

0*確率なら0になるから処理の結果に影響ないんだけど
logだと0にならないんで困るわ。

688 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 01:54:20 ]


689 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 02:09:44 ]
わからないかな?
たとえばこの図であらわすと
kossie.net/up/src/kos1247.jpg
startから1回目の移動で↑と↓に移動できるそのときの確率が0.5と0.5
start地点の状態確率が1とすると↑と↓に移動した段階の状態確率はそれぞれ0.5 0.5

プログラム的に1回の移動ごとに、すべての状態をまわって、
そのあとに2回目の移動をすることにしてます。そうじゃないと作れないので。
これを小数点でなら最初すべての状態の確率を 0にしておけば、それぞれの移動ごとに
すべての状態をまわっても0*移動確率 =0になるので変な数値が値がでることはありません。

ただlogで計算する場合に、logはlog(A*B)=logA+logBという性質があるので
Aが0であってもBが0でなければ数値は残ってしまういうわけ。

これでプログラムになやんでるんですよ。



690 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 02:13:56 ]
そもそもlogxって定義域x>0だろが

691 名前:689 mailto:sage [2007/11/24(土) 02:35:46 ]
まあ問題はこういう感じなんですけど、図は>>689のとおりです

いま、start,1,2,3,10,11,endという状態がありまして、
以下のような確率で移動することとします。
最初はstartで最後はendです。startの状態確率は1.0です。
1.0から移動する確率をかけると状態1のその時点での状態確率が0.5、状態2の状態確率が
0.5となります。
ただし状態1は入ってくる矢印が3つですので、その時点では0.5ですが
次の状態に状態1から状態1へ移動すると0.5X0.6の計算をして0.3となるわけで
す。この(startから状態1への移動確率)
(状態1の状態確率)X(状態1から状態1への移動確率)と、(状態11の状態確率)X(状態11
から状態1への移動確率)の和が状態1の状態確率となります。
startから状態10に移動したり、状態2に移動したりして計算をしていって
endにきたときの最終状態確率を求めよ。っていうのが問題です。

これをlogで計算しないといけないっていう前提にプログラムを作るとしたら
どうつくっていきますか?ただし状態に入ってくる3つの値は比較しながら
計算しないといけないんでね。logの計算なので。

692 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 02:39:14 ]
>>689
なんだお前か
氏ね

693 名前:689 mailto:sage [2007/11/24(土) 02:46:15 ]
どうせできないのにいばんな。

694 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 02:47:25 ]
非友好的な態度だな

695 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 03:40:22 ]
負の無限大?

696 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 03:57:50 ]
>>691
人に説明する気はありますか?
宿題スレでも、簡単なことを訳の分からない説明してたし
考えていることを整理してみてはどうでしょう?

エスパーしておくと、対数を使うのは外部データの入出力のときだけで
内部での計算は対数を使わなくていいんじゃないかと・・・
(どうせ浮動小数点だし)

697 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 09:14:10 ]

             「 ̄ `ヽ、   ______
             L -‐ '´  ̄ `ヽ- 、   〉
          /           ヽ\ /
        //  /  /      ヽヽ ヽ〈
        ヽ、レ! {  ム-t ハ li 、 i i  }ト、
         ハN | lヽ八l ヽjハVヽ、i j/ l !
         /ハ. l ヽk== , r= 、ノルl lL」
        ヽN、ハ l   ┌‐┐   ゙l ノl l
           ヽトjヽ、 ヽ_ノ   ノ//レ′
    r777777777tノ` ー r ´フ/′
   j´ニゝ        l|ヽ  _/`\
   〈 ‐ 知ってるが lト、 /   〃ゝ、
   〈、ネ..         .lF V=="/ イl.
   ト |お前の態度が とニヽ二/  l
   ヽ.|l         〈ー-   ! `ヽ.   l
      |l気に入らない lトニ、_ノ     ヾ、!
      |l__________l|   \    ソ

698 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 09:21:52 ]
>>689
>ただlogで計算する場合に、logはlog(A*B)=logA+logBという性質があるので
>Aが0であってもBが0でなければ数値は残ってしまういうわけ。

なんで、そんな偉そうにウソを語るんだ。

699 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 09:53:50 ]
log0 は未定義だから log(A*B)=logA+logB で A が 0 の場合を考える事自体がナンセンス



700 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:03:19 ]
>>689
よく分からんが、log0って出来ないんじゃないの?

701 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:06:58 ]
エスパーすると、確率を log した値で保持しておいて、
確率変化を積じゃなく和で表現したいんだろうな。
log(0) は CPU によっては -inf (マイナス無限大) として扱われるから、
そういう CPU では特に問題は発生しないと思うんだけど。

702 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:45:05 ]
>>683-686
レスサンクス!
結局、多倍長演算をするためにGMPとやらを入れてみました。
しかしGMPの関数を解説してるサイトの少ないこと…
どんな関数があるのか、引数の意味は何かとかさっぱり分からないorz

703 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 11:32:52 ]
練習で、サーバーソケットとクライアントソケットを両方持つプログラムを作ってます。
サーバーはサーバーでリッスンさせといて、クライアントはメッセージを入力すると相手サーバーへ飛ぶ、
と考えたんだけど、先にサーバーソケットをaccept()でループさせとくと、後のクライアント処理に行けなくて困ってる。
スレッド使わないとムリ?

704 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 11:55:20 ]
>>703

>スレッド使わないとムリ?

無理。素直にスレッド立てれ。


705 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 11:57:22 ]
プロセスでもいいけどな

706 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 12:00:22 ]
selectとその仲間


全然(標準)Cじゃねーじゃねーか

707 名前:デフォルトの名無しさん [2007/11/25(日) 00:04:32 ]
for文とwhile文の使い分けがよく分かりません。
苦Cのサイトに、「for文はwhile文を拡張した文」と書いてあったのですが、
while文が先にできて後でfor文を追加したのでしょうか?

while文でなければできないことや、while文でやった方がいいこと、またその逆など、
ありましたら教えてください。よろしくお願いいたします。

708 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 00:10:58 ]
>>707
とりあえずループカウンタをつかってるループはfor()を使っておけばいいんじゃないの?



709 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 00:17:10 ]
>>707
while文でできてfor文でできないことや、その逆のことは、ない。
 i = 0;
 while (i < 10) {
  ....
  i++;
 }

 for (i = 0; i < 10; i++) {
  ...
 }
のどちらが読みやすいか?
その程度の問題。



710 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 00:19:45 ]
do{}while(); // 必ず一回は行う処理
for(;;) // ループ途中で continue を行っても for の第三項が実行される

711 名前:デフォルトの名無しさん [2007/11/25(日) 00:36:29 ]
>>708-710
ありがとうございます。
文法的にwhile文の方が見やすいので、個人的にはそちらを使おうかと思っています。
一般的にはどういう使い分けがされてるとか、「慣習」や「常識」みたいのはありますでしょうか?

712 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 00:54:11 ]
文字列処理とか数値処理とかで使い分けるだろ。


713 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 01:03:14 ]
ここでfor文の方が速いからfor文使え、とその後200レス程費やす無駄な議論を起こす為のネタ投下

714 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 01:04:49 ]
慣習とかは無いだろうけど,
回数が固定なら for,未定なら while が一般的だと思う
たとえば,「荷物を10個選ぶ」なら for で,「荷物を10kg分選ぶ」なら while とか


715 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 01:07:00 ]
そうだな
内容の容量の制限したいときにforではせんわな。

あープログラムつくらないといけないのに
作る気がしない。
作り始めたら5,6時間いけるのに
そういうのが全然ない。

716 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 09:10:10 ]
たしかに for でも while でもよいネ。
オイラは無限ループは while 使うようにしてるな。
do while は使わなくなった。


717 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 09:50:56 ]
ループするごとに毎回行いたい処理があれば for を使うね。
continue しても実行されるから。

718 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 11:06:17 ]
vcだとwhile(1)は警告レベル最大だと文句言われるのでfor(;;)を使うようになった
この辺の習慣は環境で変わるんだろうね

719 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 11:08:38 ]
泣く泣く for (; ;) を使うように



720 名前:デフォルトの名無しさん [2007/11/25(日) 13:30:51 ]
>>718
どういう警告?


721 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 13:42:40 ]
>>720
C4127

722 名前:デフォルトの名無しさん [2007/11/25(日) 15:10:01 ]
CとC++はもう仲良くできないの?
C99すごすぎ。

723 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 17:28:24 ]
認識率1%とかの実験のプログラムを前の先輩をつくられて
再実験でそのプログラムを作ってるんだけど。
データ100でそのうちの何個かで認識率を出すって感じで
今ようやくデータ1つで数値を出せるようになった。
データ100個をプログラムで入力できるようにして自動でしたいんだけど
結構複雑。
データ1つ入力して値をだして100回するのも
認識率1%とかいうやって意味あるのか的な感じがして自重してる。

しかしプログラムの内容を率でだされるのっていやだね。

724 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 17:36:31 ]
日記帳にでも書いてろカス

725 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 18:57:23 ]
www.nicovideo.jp/watch/sm1619083
これか

726 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 19:48:10 ]
文字列処理を極めたいのですが、何から手を付けたらいいですか?

727 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 20:01:28 ]
左から。

728 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 20:02:51 ]
まずは文字列の表現方法を考えることから

729 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 20:03:10 ]
修辞的疑問文というやつだな



730 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 20:13:07 ]
ファイルを読み取る時に一文字ずつ読み取る方法と
一行ずつ読み取る方法がありますが、
どういう場合に使い分けるんですか?

731 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 20:14:23 ]
カンタンなことだ。
ファイルを1文字ずつ読み取りたい場合は1文字ずつ読み取る方法を使い、
1行ずつ読み取りたい場合は1行ずつ読み取る方法を使う。

732 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 20:16:09 ]
その日の気分による

733 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 20:30:51 ]
一行ずつ、もしくは一文字ずつ読み取らなければいけない場合とは、
例えばどんな場合がありますか?

734 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 20:43:56 ]
>>733
行に意味があるときには行単位で読んだほうが楽
行に意味がないときには文字単位で読んだほうが楽

735 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 22:13:40 ]
バイナリファイルは1文字ずつ読んで、
テキストファイルは1行ずつ読む。

736 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 22:39:40 ]
>>735
さらっと嘘教えるな

737 名前:デフォルトの名無しさん [2007/11/25(日) 23:10:37 ]
型変換しないのに型変換するとコストかかりますか?

たとえばunsigned int型を同じ型でキャストした場合です

738 名前:737 [2007/11/25(日) 23:17:16 ]
どうやらたいして差がないことが分かりました

739 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 23:39:11 ]
まず間違いなく出力は1バイトもたがわないと思う。



740 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 00:22:38 ]
ビルドしてfc /bで比べればいいんじゃね

741 名前:デフォルトの名無しさん [2007/11/26(月) 01:08:03 ]
>>714
分かり易い説明をありがとうございます。
>>709の例で言うと、for文を使う方が一般的、ということですね。
どちらも i を宣言しないといけないことに変わりはないんですね。

742 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 05:05:13 ]
ループの終了条件がループカウンター以外の場合はwhileを使う。
ループごとにある関数を呼んで、その結果が真の時のみループを抜ける、とかな。

while (func() != 0)
{
〜何かの処理〜
}

まあforでも実現できるから、どっちでもいいんじゃない?

743 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 09:16:58 ]
C言語の参考書Lvを卒業して、線形リストとかアルゴリズムみたいなのをある程度組んでみた。
30日位考えれば作れるようなプログラムとかどのような物があります?
大学にも行けなかったような頭なので、そこまで難しい物はまず出来ませんが。

744 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 09:31:01 ]
>>743
トランプのポーカーを AI 付で

745 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 09:36:18 ]
>>743
OS。本が売ってるからそれに従えばおk

746 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 09:55:58 ]
>>744
色々ネットにソースありましたが、AIって部分が難しそうですね・・・
ゲーム作ってみたかったので参考にさせて頂きます。

>>745
アセンブラも使うそうですし、OSとなると自分には無理な気がしてならないですがw
30日でOSが出来るならとなると少し興味もありますね。
レビューのみでは分からなかったのでこれから本屋行って二つを見て周って来ます

レス下さった方有難うございました

747 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 13:45:16 ]
int a[256]={0} という配列を定義して
例えば1024をscanfでこの配列に
a[0]=1024 , a[1]=0 ,a[2]=0,......,a[255]=0
ではなく
a[0]=4 ,a[1]=2, a[2]=0, a[3]=1.a[4]=0,.....,a[255]=0
という風に格納したいのですが、どういう風にプログラムを書けばいいのか思いつきません
よろしくお願いします。

748 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 13:48:11 ]
int n, a[256] = {0}, i;

scanf("%d", &n);
for(i=0; n; i++, n/=10) a[i] = n % 10;

749 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:06:25 ]
>>748
ありがとうございます!
int型やdouble型以上の桁の数字を扱う方法として
一桁ずつ格納する方法ならば!と思ったのですが、
どちらにしろ一度int型の変数に代入しないといけないことにプログラム見て気付きましたorz

char型の配列(例えばstr[256])に文字として数値を文字として格納した後に、
それをint型の配列(a[256])に入れなおすことって出来ませんよね…




750 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:19:16 ]
>>749
こういうこと?

char buf[] = "123456789";
int val[sizeof(buf)];
for (unsigned ic = 0; ic < sizeof(buf); ++ic) {
val[ic] = buf[ic] == '\0' ? 0 : buf[ic] - '0';
}

751 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:20:01 ]
int i, j=0, a[256];
char str[256];

scanf("%s", str);
for(i=0; str[i]; i++);
whil(i--) a[j++] = str[i] - '0';

752 名前:デフォルトの名無しさん [2007/11/26(月) 14:20:10 ]
void array_double(int *a, int n)
{
int i;
for(i=0;i<n-1;i++,n--)
{
a[i] = a[n-1];
}}
配列aとそのサイズnを受け取り、要素を逆順にするプログラムを考えているんですが、
うまくコンパイルすることができず、1,2,3,4,5と入力すると、5,4,3,4,5と出力されます。
どこがおかしいのでしょうか?

753 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:25:38 ]
>>752
>どこがおかしいのでしょうか?
頭。

コードと結果が合致してさえいないぞ。自分のコードくらい間違うな。

754 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:29:45 ]
>>752
ヒント: 上書きと交換は違う


755 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:31:48 ]
>>753
ヒント: ピントが外れている

756 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:32:11 ]
>>753
お前の頭もおかしいよ

757 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:36:06 ]
>>752
自分の頭(紙と鉛筆でもいい)の中で実行して
1行ずつ変数の中身がどうなるか考えてみよう
ループを展開するんだ。
a[0] = a[5-1];
a[1] = a[5-1];




758 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:36:57 ]
>>757
お前もちゃんとコード見ろ

759 名前:753 mailto:sage [2007/11/26(月) 14:40:36 ]
とりあえず、>755のお蔭でn--を見落としていたのは判ったw

>>757
同士よw



760 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:52:32 ]
>>752
a[i] = a[n-1] を

int temp = a[i];
a[i] = a[n-1];
a[n-1] = temp;

にすればok

761 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:58:31 ]
Cに交換演算子が欲しいと思う恭子の頃。

762 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 15:31:04 ]
>>761
具体的にどう実装する?

763 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 15:33:38 ]
>>762
>760の例なら
a[i] <> a[n - 1];
とか。
評価の回数を減らせるし、swapマクロを作って自爆することもなくなるし、
CPUに交換ニモニックがあれば使えるべさ。

764 名前:デフォルトの名無しさん [2007/11/26(月) 16:08:54 ]
今大学でプログラミング授業を取ってるんだが、色々とワカンネorz

演習内容うpするので教えてくれませんか?

765 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 16:16:21 ]
>>764
スレ違い

766 名前:デフォルトの名無しさん [2007/11/26(月) 16:18:44 ]
>>765
キティーだから許して。スレ違いだったらスマン

板いろいろ探したんだが、何処で聞いたらいい?
ググレ以外の回答を頼むw

767 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 16:26:09 ]
C/C++の宿題を片付けます 100
pc11.2ch.net/test/read.cgi/tech/1195668114/l50


768 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 16:26:32 ]
>>764
宿題スレも見つけられないなら大人しく首括っとけ。

769 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 17:57:03 ]
Visual C++ 2005を使用しています。
文字列をLONGLONG型の整数値に変換したいんですが、atoll関数が見つかりません。
Visual C++ 2005の環境では、atoll関数は自作するしかないでしょうか。




770 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 17:58:25 ]
>>769
つ[strtoll()]

771 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 18:42:36 ]
_atoi64

772 名前:デフォルトの名無しさん [2007/11/26(月) 18:51:11 ]
boost::lexical_cast

773 名前:769 mailto:sage [2007/11/26(月) 18:53:19 ]
>>770-772
ありがとうございます。
_atoi64でいけました。

774 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 19:59:33 ]
>>770
VC2005はC99に未対応じゃね?

775 名前:デフォルトの名無しさん [2007/11/26(月) 20:56:49 ]
変な質問ですが、C言語をマスターするのにだいたいどのくらいかかりますか?

776 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:01:58 ]
オレにも教えて下さい。C言語って何が出来ますか?
入門書卒業後何をしたらいいのやら。

グラフィック系統の本みたけど、これを利用してぱらぱら漫画みたいなの作れないですか

777 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:05:11 ]
Cでできないことはほとんどない

778 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:06:05 ]
>>776
それだけなら画像表示ツール自身でできるからなぁ。
あんたの質問は、「英語で何ができますか?」と同じくらい無意味なんだよ。

779 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:40:46 ]
#include <stdio.h>

int main(void)
{
FILE *fp;
int x;
int y = 30;

fp = fopen("test.txt","r");
fscanf(fp,"%d",&x);
printf("%d",x);
fclose(fp);
fp = fopen("test.txt","w");
fprintf(fp,"%d",x);
fscanf(fp,"%d",&x);
printf("%d",x);
fclose(fp);

return(0);
}

------test.txt-----
10
-----------------
馬鹿な質問で申し訳ないです。
実行結果が107になるんですが、何か見落としてるのでしょうか。



780 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:47:04 ]
"w" なのになんで fscanf を?

781 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:48:45 ]
>>779
>何か見落としてるのでしょうか。


冗談さておき、"w"でオープンしたストリームからは読み込めません。
まして、fprintf()で出力した先には何もありません。

782 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:49:26 ]
あ、ホントだ。
ありがとうございます。

また"r"で開きなおさないとダメなんですね。
"r+"とか"w+"の使い方もいまいち不明だし。

783 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:58:29 ]
ついでに質問です。
"r+"と"a+"の違いって何でしょう?
両方ともファイルに出力したら追記されますよね。

単純にファイルが新規に作成されるか否かですか?

784 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 22:01:41 ]
r+ は途中にも書き込める。
a+ はファイルの終わりにしか書き込めない。

785 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 22:14:53 ]
>>784
挿入可能って事ですか?
それとも上書きが出来るって事でしょうか。

色々試してみてるけど思うように扱えないです。

786 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 22:23:12 ]
r+ は上書き可能。こんな感じ。       ポップアップ用アンカー >>786
#include <stdio.h>
#include <stdlib.h>

int main() {
static const char FILENAME[] = "test.txt";
FILE *fp;
int x = 0;

/* とりあえず 10 と書き込む */
fp = fopen(FILENAME, "w");
fprintf(fp, "%d", 10);
fclose(fp);

fp = fopen(FILENAME, "r+"); /* r+ で開く */

/* ファイルの先頭から数値を読み出す */
fscanf(fp, "%d", &x);
printf("%d\n", x); /* 10 と出力されるはず */

/* ファイルの先頭に移動して 30 と書き込む */
fseek(fp, 0, SEEK_SET);
fprintf(fp, "%d", 30);

/* またファイルの先頭に移動して数値を読み出す */
fseek(fp, 0, SEEK_SET);
fscanf(fp, "%d", &x);
printf("%d\n", x); /* 30 と出力されるはず */

fclose(fp);
return EXIT_SUCCESS;
}

787 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 22:32:56 ]
分かり易い解説ありがとうございます。
上記の例で、"a+"だと、
10
1030
と出力されちゃうんですね。

fseek関数はまだ触った事ないので勉強してみようと思います。

788 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 23:07:17 ]
/* fseekってイマイチよく分からん。 オフセットとかなんだか知らんが
読んだときか書き込んだときでかは忘れたけど、数字で
int型の4バイトの時と、char型の1バイトの時があってイミフ。
チラシの裏で馬鹿なレスだからスルーしてね^^ */

789 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 23:43:55 ]
>>788
それは恐らくfseek()が判らないのではなくて、fprintf()で書き込むのかfwrite()で書き込むのかの
違いがよく判っていないんジャマイカ。

>>787
書き込み後は、fseek()(或いはそのサブセットのrewind())をするか、明示的にfflush()しないと
書き込んだ結果が実際のストリームに出力される保障がないことに注意。

まぁ、ファイル先頭に移動するにはrewind()の方が判りやすいだろうね。



790 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 23:56:48 ]
条件によって01を記録し、
記録した情報を順番に読み取って01を判別し、
条件分けをしたいのですが思ったとおりになりません。。
具体的には、書き込み
FILE *fp;
char output = 0;
int bit = 0;
fp = fopen("bitstream","rb");
for(i=0; i...... )
{
if(bit == 8)
{bit = 0; fputc(output,fp);}
if(条件)
{手順1; output = ((output<<1) | 0x01); bit++;}
else
{手順2; output <<= 1; bit++;}
}
output = (output<<(7-bit));
fputc(output,fp);
読み込み
char a;
for(i=0; ){
if(bit == 8)
{a = getc(fp); bit = 0;}
if( ( a >> (7-bit) ) & 0x01 )
{手順1; }
else
{手順2; }
bit++;}
こんな感じで書いてるんですが、どこかおかしいところがあればご指摘ください。

791 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 00:13:53 ]
float *a;
a = new float();
*a = 120;
float *temp = a;

これはOKですよね

float *temp = 120

これはなんでダメなんですか?


792 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 00:29:03 ]
tempが格納するのはアドレスだから。
120を変数に格納して、その変数のアドレスをtempに渡すなどする必要がある。

793 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 00:30:17 ]
newはC++なんだけど

794 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 00:30:49 ]
セミコロンが無いから。

795 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 00:32:19 ]
つまり
float *tempは、ポインタとして宣言してる状態で、そこにaのアドレスが入って、
temp = a となっている、ということですか?上の例だと

で、3行目の
*a =120 は aのアドレスをもったところに120をぶち込んでる、ということで
float *tempとは別ものなんですよね?



796 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 00:47:27 ]
564.1
451.6
154.1
[EOF]

こういう風になってるテキストファイルがあるときに
「EOFまで数字をテキストファイルから読み込む」という作業をする場合はどうすればいいんでしょうか?

i=0;
while(1){
if(fread(&c,sizeof(char),1,fp)==EOF) break;
else
{
data[i]=fscanf(fp,"%lf\n",&value);
i++;
}
}

こんな感じにかいたらdata[0][1][2]には564.1 451.6 154.1 が入っているんでしょうか?
よくfreadとfscanfなどがわかっていないのでよろしくお願いします。


797 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 00:47:38 ]
別もの。
*a=120の*はデリファレンス、float *tempの*はポインタ宣言。

798 名前:ワカメ高専 mailto:sage [2007/11/27(火) 01:05:59 ]
[-3,3] fx=1/(1+5x^2) 分点の数 10個(n=9)
これをラグランジュで求めて結果を出力するプログラムを作れって(c or c++)言われたけどさっぱりでしゅ

799 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 01:44:24 ]
>>798
課題丸投げは宿題スレへ
pc11.2ch.net/test/read.cgi/tech/1195668114/



800 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 01:49:31 ]
>>796
i=0;
while(1){
if (fscanf(fp, "%lf", &data[i]) == EOF) {
break;
}
i++;
}

801 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 01:55:32 ]
>>795
そう。上の例は
float *a;
a = new float();
*a = 120;
float *temp;
temp = a;
に等しい。下の例は
float *temp;
temp = 120;
ということになる。floatポインタに整数120は代入できない(型が異なる)のでエラー。

802 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 02:14:26 ]
エラーにはならないだろボケ


803 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 02:16:13 ]
>>791
別に駄目じゃねーよ。
期待してるのとは違う動作だろうけどな。

804 名前:801 mailto:sage [2007/11/27(火) 02:19:44 ]
本当だ、エラーにはならんね、すまそ






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

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

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