C言語なら俺に聞け( ..
[2ch|▼Menu]
428:デフォルトの名無しさん
07/11/17 20:24:04
>>427
ググれ

429:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/17 22:36:57
オイラだったら perl でやる。rubyも好いらしい。


431:デフォルトの名無しさん
07/11/17 22:42:25
字句解析はCよりPerlを勉強した方がはるかに楽だよ

432:デフォルトの名無しさん
07/11/17 23:01:25
>402

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


433:デフォルトの名無しさん
07/11/17 23:05:27
>429

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

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


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

435:デフォルトの名無しさん
07/11/17 23:11:01
HTMLのライブラリだって、探せばありそう。

436:デフォルトの名無しさん
07/11/17 23:19:45
>>435
たとえばWindowsならMSHTMLとかだな。

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

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

439:デフォルトの名無しさん
07/11/18 00:08:11
違うってわかってるんなら、区別できてるってことじゃないか

440:デフォルトの名無しさん
07/11/18 00:20:31
for(;i<10;)

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

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

442:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/18 00:34:25
>>>は非常に左が大きいだけど
C言語でそんな比較演算子は無い
単なる大小比較( > )にし問題を書き換えなさい

445:デフォルトの名無しさん
07/11/18 00:59:48
きっとビットシフトだ

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

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


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

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


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

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

452:デフォルトの名無しさん
07/11/18 08:44:45
後出しなのに・・・

453:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/18 09:27:51
>>453
論理演算とビットシフトでググればわかりそうなもんだが…

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

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

のように格納されている

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

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

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

458:デフォルトの名無しさん
07/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
07/11/18 11:44:35
なるほどっ!
すごくわかりやすい解説ありがとうございます。
ビットシフト自体は皆さんのご説明ですぐに理解できたのですが

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

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

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


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

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

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

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

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

462:デフォルトの名無しさん
07/11/18 12:58:05
URLリンク(www.google.co.jp)
ネットで調べてわからなかったらここで聞いてもわからないんじゃない?

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

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

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

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

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


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

467:デフォルトの名無しさん
07/11/18 18:05:59
>>465
よくわからないでございます

468:デフォルトの名無しさん
07/11/18 18:10:51
>>467
普通のソートと同じ

469:デフォルトの名無しさん
07/11/18 18:12:50
そうなの?
ちょっとやってみる。thx

470:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/18 18:46:08
その変数がnanかそうでないかを判断するにはどうすればいいですか?

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

473:デフォルトの名無しさん
07/11/18 21:18:54
NGワード:ご教授

474:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/19 16:46:34
>>474
従来のCではダメ
C99ならOK

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

477:デフォルトの名無しさん
07/11/19 19:20:14
途中宣言はキモイから使いたくないな。

478:デフォルトの名無しさん
07/11/19 19:24:47
途中宣言ってわけわからなくなったりしないのかな?

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

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

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

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

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

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

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

485:デフォルトの名無しさん
07/11/19 20:49:54
なるほど・・・勉強になります。

486:デフォルトの名無しさん
07/11/19 23:50:37
>>479
狭い世間なんだね。

487:デフォルトの名無しさん
07/11/19 23:55:07
なんか妄想してる奴がいるな

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

489:デフォルトの名無しさん
07/11/19 23:56:54
>>478
途中宣言のほうが格段に読みやすい。

490:デフォルトの名無しさん
07/11/20 00:00:33
関数の長さによるだろ。

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

492:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/20 00:12:09
>>492
コンパイラの警告は無視しないできちんと対処しましょう。
もしそのコードで警告が出ないようなら、コンパイラのオプションを見直しましょう。
もし警告レベルを換えても警告が出ないようなら、そんなコンパイラは投げ捨てましょう。

494:デフォルトの名無しさん
07/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:宿題スレへ逝け
07/11/20 00:16:14
>どこがおかしいのか教えて下さい
あんたの頭。

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

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

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

498:デフォルトの名無しさん
07/11/20 08:15:27
>>494
>どこがおかしいのか教えて下さい

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

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

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

501:デフォルトの名無しさん
07/11/20 16:14:20
>>499
C言語にbool型なんて無い。

502:デフォルトの名無しさん
07/11/20 16:40:31
>>501
c99はcではないとでも?

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

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

505:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/20 17:41:44
>>505
ありがとう、うまくいきました。
私が書いた正規表現が間違ってたみたいです。


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


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

509:デフォルトの名無しさん
07/11/21 10:18:11
もうテンプレに、このスレはC89用って書いとけよ

510:デフォルトの名無しさん
07/11/21 10:26:43
C90 じゃなくて?

511:デフォルトの名無しさん
07/11/21 10:30:37
うん

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

513:デフォルトの名無しさん
07/11/21 10:42:06
お前にはまだ早い

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

515:デフォルトの名無しさん
07/11/21 10:45:02
>>514
そうです。

516:デフォルトの名無しさん
07/11/21 10:47:46
年はどうするの?
うるう年を考慮するのか、とか

517:デフォルトの名無しさん
07/11/21 10:50:25
今年の月日です。

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

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

520:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/21 12:43:41
>>522
#include <string.h>
char *strstr(const char *s1, const char *s2);

URLリンク(www9.plala.or.jp)
これじゃ駄目なの?



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


525:デフォルトの名無しさん
07/11/21 12:51:49
>>522
この前同じようなの見かけた
スレリンク(tech板:389-番)

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

527:526
07/11/21 13:01:08
あと、2段目のforループで一致判定出たら、1段目のforループ抜けるのも
忘れずに

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

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

530:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/21 13:12:26
やばいw
少しわかったつもりですが、forで混乱してるかも…
>>527のヒントがすごいわかり易いんですけど、こっからつまってます。

532:デフォルトの名無しさん
07/11/21 13:21:12
つーかchekerは0で初期化しといて、elseで代入はやめなよ

533:デフォルトの名無しさん
07/11/21 13:25:37
>>532なるほど

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


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

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

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

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

538:デフォルトの名無しさん
07/11/21 16:36:35
同じだと思ってたのか

539:デフォルトの名無しさん
07/11/21 16:56:03
>>536
ウソツケ

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

540:デフォルトの名無しさん
07/11/21 17:07:12
質問から読んで書いてるのだろうか。

541:デフォルトの名無しさん
07/11/21 17:08:37
>>539
後者に直せって意味で書いた

542:デフォルトの名無しさん
07/11/21 17:13:21
何コイツ

543:539
07/11/21 17:40:45
>>541
スマン
イコールの意味だと勘違いしてた

544:デフォルトの名無しさん
07/11/21 17:53:09
m9(^Д

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


546:デフォルトの名無しさん
07/11/21 18:51:05
なぜそう思った?

547:デフォルトの名無しさん
07/11/21 19:24:48
debug フォルダの中にできてるよ。

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

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

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

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

551:デフォルトの名無しさん
07/11/21 21:32:29
んじゃreturn 1だとしたらどうなるんです?

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


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

554:デフォルトの名無しさん
07/11/21 21:39:37
受け取る側で判断するから異常とは限らないな

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


556:デフォルトの名無しさん
07/11/21 22:03:03
2とか3とかも渡せるぞ

557:デフォルトの名無しさん
07/11/21 22:09:00
>>555
OSが何なのか分かってないのでは?

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

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

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

560:555
07/11/21 22:19:56
スマン適当に言っただけだ。流してくれ。

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

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

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


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

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

565:デフォルトの名無しさん
07/11/21 22:44:37
紙に書いて考えれば?

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

567:デフォルトの名無しさん
07/11/21 22:52:16
URLリンク(www.mech.utsunomiya-u.ac.jp)
の下の方のところ、貼っておきます。
------------------------------------
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:デフォルトの名無しさん
07/11/21 23:11:09
おそらく>>297は皆を困らせようとして書いただけだよ

569:デフォルトの名無しさん
07/11/21 23:50:47
xor eax, eax
ret


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

571:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/22 01:13:16
プログラムの正常終了は0だが、各関数の正常終了も0を返すようにしてる?
if文やwhile文が0以外を真としたりするので、0を返しちゃうと判定で偽になるよね?
みんなは省略形は使わずに、必ず==で何かと比較してますか?

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

574:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/22 02:50:24
ヤメレ

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

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

578:デフォルトの名無しさん
07/11/22 07:20:44
>574

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


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


580:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/22 13:43:27
OPENGLを使えばいいと思うよ><
あとBMPがちゃんと確保されてるか確認した?



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

583:デフォルトの名無しさん
07/11/22 13:51:19
>>580
取り敢えずシフト量を0にして試してみたら?

584:デフォルトの名無しさん
07/11/22 14:04:32
シフト量を0
そのあと1とか小さい値にして

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


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

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


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

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

588:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/22 14:19:53
ありがとうございます!
やっと解決しました。
大きな理由はビットマップのビット深さを間違えてました。
どうもお手数おかけしてすいません。ありがとうございました!

590:デフォルトの名無しさん
07/11/22 14:38:34
アチャー

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

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

592:デフォルトの名無しさん
07/11/22 14:56:24
計ってみれば?

593:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/22 15:31:30
処で、>593はなんでC++でコンパイルしているんだ?

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

597:デフォルトの名無しさん
07/11/22 15:40:00
iccだとmovlにしてくれるのか
VCだとmov,mov,...ってのにしかならない

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

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

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

600:デフォルトの名無しさん
07/11/22 21:11:23
処理系依存になるってこと?

601:デフォルトの名無しさん
07/11/22 21:17:31
unsigned int iに対してi>=0は常に真だべ

602:デフォルトの名無しさん
07/11/22 21:20:46
なるほど
どうもありがとう

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

604:デフォルトの名無しさん
07/11/22 22:39:15
strcpy(b,a);

605:デフォルトの名無しさん
07/11/22 22:41:18
memmove(b,a,3);


606:603
07/11/22 23:01:19
>>604,>>605
できました。
ありがとうございます。



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

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

609:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/22 23:32:03
そもそも式が違うじゃん

611:デフォルトの名無しさん
07/11/22 23:39:05
かけざんとわりざんはたしざんやひきざんよりもさきにけいさんします。

612:609
07/11/22 23:40:33
式からして間違ってるのでしょうか?
今の式じゃ-bがが最後に計算されてしまうってことですかね?

613:デフォルトの名無しさん
07/11/22 23:43:51
>>609
あなたが書いている式は

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

こんなだよ

614:609
07/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:デフォルトの名無しさん
07/11/22 23:46:11
printfで%lfは標準じゃなかった気がする。
独自拡張とかC99とかならいけたかもしれんけど。

616:デフォルトの名無しさん
07/11/22 23:47:57
>>613
最後のaは分母にかかりますよね?

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

617:デフォルトの名無しさん
07/11/22 23:48:09
>>614
それは警告であってエラーじゃない

618:デフォルトの名無しさん
07/11/22 23:48:11
>>614 (...)/2*aじゃなくて(...)/(2*a)

619:デフォルトの名無しさん
07/11/22 23:48:15
それだと

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

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

620:デフォルトの名無しさん
07/11/22 23:48:46
>>616
かからねーよwww

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


622:デフォルトの名無しさん
07/11/22 23:53:55
入力してる値が悪いのでは?実数解を持つ値を入れてみ

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

624:デフォルトの名無しさん
07/11/23 00:02:47
適当にいれんなよwwwwwwwwwwww

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

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

627:デフォルトの名無しさん
07/11/23 00:11:14
たまにする背伸びは楽しいけどな
良い気分転換になる

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


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4984日前に更新/195 KB
担当:undef