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


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

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



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

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

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

596 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 15:57:52 ]
struct point {
int x, y;
};
struct point p;
struct point *pp = &p;
があったとき、

(*pp).x = 1;
pp->x = 1;

が同じxに代入をしている。
構造体へのポインタを使う上での簡略化。

597 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 16:00:59 ]
>>595>>596
ありがとうございました

598 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 17:29:44 ]
使ってる教科書に載ってないのか?

599 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 19:46:39 ]
検索エンジンを作ろうとおもう。
まずEUC-JPに統一する。
旧字体は新字体、カタカナはひらがなにする。
ひらがなと、新字体以外は登録しない。
出現可能な文字に0から順に番号をつけて、N-germ (2-germ) で登録していく
あと、ハッシュを使う為に全角2文字分を圧縮して20数ビットを使う

NKF32.DLL
www.vector.co.jp/soft/win95/util/se295331.html

旧字体→新字体
www.ritsumei.ac.jp/acd/cg/lt/cl/koten/newold.htm
yasuda.homeip.net/misima/misima_seiji_test.html
www.toyama-cmt.ac.jp/~kanagawa/language/kyuuji.html
www.asahi-net.or.jp/~ax2s-kmtn/ref/old_chara.html
homepage3.nifty.com/jgrammar/ja/tools/tradkan0.htm
homepage3.nifty.com/jgrammar/ja/tools/ksimple.htm

600 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 19:56:23 ]
連載:検索エンジンを作る|gihyo.jp
gihyo.jp/dev/serial/01/make-findspot

Googleの技術は凄いと思ったがMooterっていうサイトがGoogleを上回る検索力らしい
Mooter
www.mooter.co.jp/
辞書不要の形態素解析エンジン「マリモ」とは
www.atmarkit.co.jp/news/200708/15/mooter.html
形態素解析について
www.gengokk.co.jp/thebun.htm
mecab.sourceforge.net/feature.html
Google の秘密 - PageRank 徹底解説
www.kusastro.kyoto-u.ac.jp/~baba/wais/pagerank.html
PageRankの基本概念
tnt.math.metro-u.ac.jp/labo/grad/2004/masa/graph/6.html

601 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 19:58:27 ]
>>599
ガンバレ
そしてこのスレに来るな

602 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 22:36:04 ]
「関数へのポインタ」は何に使うの?必要(あると便利)な状況がよくわからない。

603 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 22:39:42 ]
qsort関数がもろに関数ポインタ使用してるじゃないか

604 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 22:39:56 ]
qsort



605 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 22:41:46 ]
ある関数を呼ぶときに、呼ばれた関数内部で使う関数を外から指定するときに使います。
このばあい、関数へのポインターを引数で渡します。

例)
コールバック関数
リストに要素をつなげるときに大小比較関数


606 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 22:44:33 ]
qsort関数もそうですね

void qsort(void *base, size_t num, size_t size,
int (*compare)(const void*, const void*))

この、int (*compare)(const void*, const void*)が関数ポインターで
この場合はソートの並びを呼び出し側で制御できるようにしている。


607 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 22:56:19 ]
うーむ、わかったようでわからない。
複数の機能(=関数の数)を内包する関数で、引数の指定によって機能を使い分ける場合ってことかな?
でもそれって単なる文字列でも振り分け可能な気がするなぁ…やっぱりわからん。

608 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 22:59:49 ]
たとえばqsortの場合、qsortの作者が想定してない型のソートもできる

単に引数で文字列を渡すだけじゃ、qsortの作者が想定している型やソート方法しか対応できない


609 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 23:03:25 ]
>>607
ためしに qsort を使ってみろ
数値のソート、文字列のソート、自前構造体のソート・・・
そしたらわかる

610 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 23:04:51 ]
ソート機能を提供するけど、その時必要となる比較の機能は自分で作ってね ってこと
一人で作業する分にはあまり使う必要無いと思う

611 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 23:35:24 ]
比較関数はプログラマ側が用意できるので、昇順や降順、どの値を比較対象とするか等を任意に作れる。
そしてどんな比較関数でも同じ手続きで利用するために、関数へのポインタを使っている。

…で合ってる?

612 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 23:37:46 ]
ポインター自体を完全に把握してないんじゃないかね?
あれ覚えるのやっかいだし

613 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 23:38:33 ]
ソート関数とかわかりずらい STLつかっとけ

614 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 23:50:45 ]
ポインタはそんなに分かりづらいとは思わなかったなぁ。
いっぺん練習で、全ての変数をポインタとmallocでコーディングしたらイヤでも理解出来るよ。



615 名前:デフォルトの名無しさん [2007/10/31(水) 00:00:58 ]
EUC-JPコードをファイルから読み込んだとき、char やstringでは何コードで記録されるんですか?
指定できますか?

616 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 00:29:42 ]
OSは何を使ってるとか、コンパイラは何とかそういう情報も書いておこうぜ

617 名前:プリンがー mailto:aaa [2007/10/31(水) 00:47:58 ]
データa1,a2---,a10及びb1,b2,----b10を読み、積和
S=a1b1+a2b2+-----a10b10を計算せよ。

#include <stdio.h>
int main (void)
{
int i,a[10],b[10];
int S;

for(i=1;i<=10;i++){
scanf("%d",&a[i]);
scanf("%d",&b[i]);

S+=a[i]b[i]
}
printf("積和は%dです。\n",S);
return(0);
}

これであってますか??

618 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 00:49:34 ]
>>617
・Sの初期化がされていない。
・a[i]*b[i];

619 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 00:49:35 ]
>>617
>S+=a[i]b[i]
とりあえずコレが間違ってる
*と;が足りない

620 名前:プリンがー mailto:aaa [2007/10/31(水) 01:07:16 ]
>>618>>619
S=0
S+=a[i]*b[i];
ですね。
ありがとです。


621 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 01:12:26 ]
>>620
セミコロン(;)忘れるなよ

622 名前:プリンがー mailto:aaa [2007/10/31(水) 01:31:53 ]
うるせーバーカ

623 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 02:04:27 ]
かなり初心者です。
unsigned char afo_1,afo_2,afo_3,...afo_n;
とafo_1からafo_nまで宣言したい時はどうしたら良いですか?

624 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 02:09:22 ]
>>623
配列じゃダメなの?n=10なら
unsigned char afo[10];

配列の各要素へのアクセスは添字を指定する。
afo[0] = 'a';
afo[1] = 'b';

afo[9] = 'j';



625 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 02:09:30 ]
>>623
全部書くしかない。
配列でいいなら配列使え。

626 名前:623 mailto:sage [2007/10/31(水) 02:15:12 ]
>>624,>>625
nが決まった値では無いので、今の路線は無理ですねー。。
配列で頑張ってみます。夜遅いのにすみません。素早い対応ありがとうございます。

627 名前:627 [2007/10/31(水) 04:16:28 ]
明日提出のレポートのプログラムなのですが
どうしても実行後うまくいきません
簡単なプログラムで
入力された文字を”#”で表すというものですが
指摘お願いします

upsurusuru.hp.infoseek.co.jp/index.html
にアップしましたので怪しいむと思いますが
助けてくださいお願いします
07/10/31(Wed),04:10:07
この時刻にアップしました
拡張子を.cに変更してください
だれかおねがいします

628 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 04:30:05 ]
>>627
うちの環境だとコンパイルできないから確認してないけど、
isalphaとisdigitが逆なんでねーの?

629 名前:Pもかっこわりぃなぁ mailto:sage [2007/10/31(水) 10:42:33 ]
>>627
どうでもいいけど、ABCDEFGHIしKLMNOPQRSTUVWXYZになっている。

630 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 13:33:38 ]
printfとprintf_Pの違いを教えてください

631 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 13:43:36 ]
printfで数字を表示するときも”123”のように”を使いますか?


632 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 14:07:34 ]
数値と数字の違いが分からんのか

633 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 14:20:54 ]
>>631
5点

634 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 14:58:30 ]
キーが押されたら何かアクションを起こすってするにはどうすればいい?

例)
enterを押すと計算をするみたいに
enterキーが押されたっていう結果をどうやって取り込むか教えてください



635 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 15:09:11 ]
>>631
いいえ
”ではなく"を使いましょう

636 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 15:21:24 ]
>>634
getchar()でもしておいたら?

637 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 15:28:13 ]
>>634
環境による。つかキーボードドライバの仕様による。

638 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 16:35:44 ]
>>634
コンソールで?
ウィンドウで?

639 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 16:41:08 ]
ウインドウだってコンソールの一種だろ。


640 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 17:22:57 ]
>>639
>>639
>>639

641 名前:プリンがー mailto:aaa [2007/10/31(水) 17:45:50 ]
>>622
俺の猫かぶりすんなや!

642 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:16:08 ]
OSかかないと困るんだなって今日始めてしった
MS-DOSで実行した場合int型って2バイトづつのメモリじゃん?
でもXP上で実行したらint型だと4バイトづつになって超悩んでた結果、
16ビットマシンと32ビットマシンって事って始めて知ったよ・・・

643 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:23:53 ]
System.arraycopy(コピー元,コピー開始位置,転送先,転送開始位置,要素数)
のJAVAの関数を

memcpy(コピー先,コピー元,, n バイト分)
に置き換えたいのですが

要素数をnバイト分であらわすか、
nバイト分を要素数に変えるにはどうすればいいか教えてください

sizeof(nバイト分)ではダメでした

644 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:24:58 ]
>>643
sizeof(要素)*要素数



645 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:27:05 ]
>sizeof(nバイト分)
その発想は無かったわ

646 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:38:59 ]
>>644
できました!!!!!!!!!!!!!!!!!!!11
すいませんが、何をやっているのか教えていただけませんか?

>>645
バカですいません

647 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:50:11 ]
>>646
sizeof(要素)で1つあたりのバイト数が出る
要素数をかけ算すればn バイト分が求まる。
かけ算は小学校三年生だっけ?

648 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:55:23 ]
理解できました。

memcpyではあくまでバイトを扱うのであって
要素数分のバイトを3つ目に入れないとダメなわけですね。。。ありがとうございました

649 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 01:53:40 ]
ここのスレのひとはgdbの
使い方完全に理解してるのかな?

関数の中の関数とかどうやって見るの?

650 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 02:03:28 ]
>>640
コンソールって何のことだと思ってんの?

651 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 07:16:51 ]
unsigned int **pi, i, j;

if ((pi = malloc(sizeof(unsigned int *) * 32)) == NULL)
{
fputs("しっぱい", stdout);
exit(0);
}

for (i = 0; i < 32; i++)
{
if ((pi[i] = malloc(sizeof(unsigned int))) == NULL)
{
fputs("しっぱい", stdout);
exit(0);
}
}

for (i = 0; i < 32; i++)
{
fprintf(stdout, "%8u %8u", pi[i], &pi[i][4]);
fputc('\n', stdout);
}

for (i = 0; i < 32; i++) free(pi[i]);
free(pi);
return 0;

pi[i][4] と pi[i + 1][0] のアドレスが一緒になっちゃうんだけど、なんで?

652 名前:650 mailto:sage [2007/11/01(木) 07:26:15 ]
>>651
自己解決しました。バカだなオレ…orz

653 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 07:37:41 ]
>>650
ウィンドウって何のことなの?

654 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 12:06:05 ]
構造体配列を宣言するとき二次元配列として宣言できますか?

typedef struct bridge{
int a;
int b;
int c;
}DATA;

DATA m[5][5];

こんな感じです。



655 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 12:09:01 ]
>>654 全然おk

656 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 12:10:10 ]
>>655
すばやいレスありがとうございます。

657 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 13:21:06 ]
先ほどの654のものですが宣言で以下のようにしましたがうまくいきません。
typedef struct bridge{
int a;
int b;
int c;
}DATA;

DATA m[5][5] = {
{-1,0,0},{-1,0,0},{-1,0,0},{-1,0,0},{-1,0,0},
{-1,0,0},{0,0,0},{0,0,2},{0,0,0},{-1,0,0},
{-1,0,0},{0,1,5},{0,0,0},{0,1,3},{-1,0,0},
{-1,0,0},{0,0,0},{0,1,2},{0,0,0},{-1,0,0},
{-1,0,0},{-1,0,0},{-1,0,0},{-1,0,0},{-1,0,0}
};
構造体を二次元配列で宣言する場合はどのようにすればよいのでしょうか。
アドバイスお願いします。

658 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 13:32:45 ]
>>657
DATA m[5][5] = {
{{-1, 0, 0}, ...},
...
};

659 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 13:40:09 ]
>>658
本当に申し訳ありません。
単純なミスでしたorz
ありがとうございます。

660 名前:デフォルトの名無しさん [2007/11/01(木) 14:29:42 ]
>>639
CUI || GUI ?

661 名前:デフォルトの名無しさん [2007/11/01(木) 14:57:27 ]
int型の数値をchar型の文字列配列に入れたいんですけどできますか?

662 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 15:05:21 ]
>>661
char ci[100];
int i = 2007;
sprintf(ci, "%d", i);

663 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 15:09:29 ]
そういう意味だったのか
さすがエスパー

664 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 15:12:44 ]
>>662
ありがとうございます!



665 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 16:18:05 ]
>>660
ttp://www.excite.co.jp/dictionary/english_japanese/?search=CONSOLE&match=beginswith&dictionary=NEW_EJJE&block=36319&offset=400

666 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 16:20:06 ]
>>660
こっちのほうが解りやすいかな。
ttp://www.excite.co.jp/dictionary/japanese/?search=%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB&match=beginswith&itemid=07660600

667 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 16:25:24 ]
>>665
え?
>>634
のプログラムの話なんだけどなんなの?

668 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 20:52:53 ]
ポインタ意味わかんねええええええええええええええええ
*pだとしたら
p = &a ってアドレスのみ格納?
でこの場合
*pはaの中身そのまま、pならaのアドレスそのまま &pならポインタ変数pのアドレス。
これでいいのかい!?
でポインタのポインタとかイミフ!

669 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 21:04:02 ]
>>668
>*pはaの中身そのまま、pならaのアドレスそのまま &pならポインタ変数pのアドレス。
>これでいいのかい!?
まあ大体はおk

>でポインタのポインタとかイミフ!
単純に上のaがポインタだと考えればいいんだよ

670 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 21:33:12 ]
>>669
ソノハッソウハナカッタワ
すげー単純にわかった。thx

671 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 22:42:44 ]
while(count < 20)
{
  aiai = rand();
  if (aiai >= 0 && aiai <= 100)
  {
    count2 = 0;
    while(count2 < 3)
    {
      test[count][count2] = aiai;
      count2++;
      printf("%4d ",test[count][count2]);
    }
  printf("\n");
  count++;
}

配列二次元目をまず3つ埋めた後、
縦に20個の繰り返しで乱数での数字を埋めたいんだけど、
どーもcount2が機能してないみたいで、全部初期化した0が返ってくる。
なんでなんだぜ?
二次元目って変数指定できないの?

672 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 22:43:48 ]
あ、ごめん上の見やすくするためにスペース入れてたらifの閉じるの消えちゃってる。
それはご愛嬌で><

673 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 22:47:36 ]
ごめんなさい。
よくよく見直したら
      count2++;
      printf("%4d ",test[count][count2]);
これ処理の順番逆でした・・・。

674 名前:プリンがー mailto:aaa [2007/11/02(金) 00:35:43 ]
-
x(エックスバーってどうやったら入力できますか?



675 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 00:36:39 ]
>>674
ja.wikipedia.org/wiki/%E3%82%A8%E3%82%AF%E3%82%B9%E3%82%AB%E3%83%AA%E3%83%90%E3%83%BC

676 名前:デフォルトの名無しさん [2007/11/02(金) 01:12:30 ]
プログラム初心者です。
乱数のrand()を使って勝、負のとこを帰れば丁、半にかえるプログラムですが
これで問題はないでしょうか?

#include <stdlib.h>
main(){
int a;
a= rand() % 2;
if(a==1){
printf("勝");
}else{
printf("負");
}
}

プログラムの意味でifは基本なのでわかりますが

↓ここの部分があまりよく分からないんですが
a= rand() % 2;
if(a==1){
%2は2つの数のどちらかを出すと考えたのですがそれでよろしいでしょうか?
a==1のとき勝が表示されます。
a= rand() % 2で1が表示された場合
elseはa==0ということで負と表示されていると考えていのでしょうか?

応用として甲、乙、丙をランダムに表示させる場合はif(a==2)、else if(a==1)、else
として甲、乙、丙を表示させると考えるとかんがえていいのでしょうか?

分かる方がいればよろしくお願いします。
初心者用の参考書には乱数関係の説明がほとんどないんで…。


677 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 01:14:18 ]
乱数の説明はなくても%の説明がない参考書はないだろ。

678 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 01:15:57 ]
#include <stdio.h>
int main(void)
{
while(1)
{
float kyori;
int ryokin;
printf("距離?"); scanf("%f", &kyori);
if(kyori <= 0.0) return;
  for(ryokin = 1300; kyori > 8.0; kyori -= 2.0) ryokin += 200;
if(kyori <= 5.0) ryokin = 870;
if(kyori <= 3.0) ryokin = 550;
if(kyori <= 2.0) ryokin = 380;
printf("料金 : %d\n", ryokin);
}
}

↑のプログラミングリストでfloatの型使わないで表すとどうなるでしょうか?
お願いします

679 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 01:19:40 ]
宿題スレで聞け

680 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 01:28:03 ]
>>676
rand()は0以上RAND_MAX以下の整数を返す関数
%2は2で割った余り(剰余)を求める
2で割った余りは0か1だからrand()%2は0か1どちらかをランダムに生成するという意味
甲乙丙なら3種類の乱数(0,1,2)をランダムに生成すればいいからrand()%3とすればいい

681 名前:デフォルトの名無しさん [2007/11/02(金) 06:18:49 ]
>676より

>680
ありがとう。
rand()%◆では◆で割った余りをランダムに表示させるという方法で
乱数をだしているんですね。

>677
それは分かるんです。質問の仕方が悪かったようで申し訳ないです。


682 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 10:10:23 ]
表示

683 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 10:50:31 ]
char *const p;
char *const *pp = &p;

pp = foo // 可能?
*pp = bar // 可能?

char *const *ppとあるとき、

*constと*はどっちが元のもの?
ポインタのポインタのポインタの…は、
どっち方向に * が伸びていくの?

684 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 12:18:41 ]
>>683
fooとbarは何の型?



685 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 12:29:03 ]
char c;
char *const p = &c;
char *const *pp = &p;
char *const **ppp = &pp;
char *const ***pppp = &ppp;

pp = foo; // 可能
*pp = bar; // 不可能
**pp = hoge; // 可能

686 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 12:41:26 ]
char *const *pp
はconstなchar* のポインタ

char const **pp
はconstなcharのポインタのポインタ

と認識してるけど・・・

char *const p;
char *const *pp = &p; //OK

char const *p;
char *const *pp = &p; //NG


687 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 14:14:02 ]
char *const *pp

charへのconstポインタへのポインタ?
charへのポインタへのconstポインタ?

char **const p

charへのconstポインタへのconstポインタ?
charへのポインタへのconstポインタ?(char *(*const) p相当?)

688 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 14:15:29 ]
>>685 さんの説(?)で行くと、

char *const *pp
はcharへのconstポインタへのポインタ、ということになる。

689 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 14:17:26 ]
>char *const *pp 
charへのconstポインタへのポインタ

>char **const p
charへのポインタへのconstポインタ

>charへのconstポインタへのconstポインタ? 
それは char *const *const p; と書く

690 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 15:58:45 ]
おまえらはオレの脳を破壊する気ですか?

691 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 17:28:04 ]
>>683-が一切わからん

692 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 17:50:59 ]
要するにconstあり/なしの組み合わせの数がたくさんあるってこと。
ポインタじゃないただの変数の場合、constあり/なしの2種類しかない。

char c;
const char c;

ポインタには、指す先のconstあり/なしとポインタ自体のconstあり/なしがあるから、全部で4通りになる。

charへのポインタ … char *p;
charへのconstポインタ … char *const p;
const charへのポインタ … const char *p;
const charへのconstポインタ … const char *const p;

ポインタを指すポインタは、指す先が4種類あって、ポインタ自体のconstあり/なしもあるから、全部で8通り。

charへのポインタ へのポインタ … char **p;
charへのconstポインタ へのポインタ … char *const *p;
const charへのポインタ へのポインタ … const char **p;
const charへのconstポインタ へのポインタ … const char *const *p;

charへのポインタ へのconstポインタ … char **const p;
charへのconstポインタ へのconstポインタ … char *const *const p;
const charへのポインタ へのconstポインタ … const char **const p;
const charへのconstポインタ へのconstポインタ … const char *const *const p;

693 名前:デフォルトの名無しさん [2007/11/02(金) 17:53:33 ]
もうやめて>>692>>690-691のライフは0よ!

694 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 17:56:01 ]
>>692 まとめおつ!!



695 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:01:20 ]
「ポインタ完全制覇」だっけかに考え方が書いてあるよ

const char **const p;
の場合、右から順に考えて
p が const
*p はノーマル
**p が const
という風に機械的に解釈するといいらしい

696 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:03:18 ]
どうせコンパイラも機械的に解釈してるしな

697 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:09:13 ]
初心者だが上に挙げた事例でどこら辺の物まで
実際のプログラムで活用されるの?

なんか、>>692とかわけわかめなんだ。


698 名前:プリンがー mailto:aaa [2007/11/02(金) 18:11:37 ]
三角形の面積を求めよ。

#include <stdio.h>
int main (void)
{
double height teihen;
double S;

printf("height=");
scanf("%lf",&height);
printf("teihen=");
scanf("%lf",&height);

S=height*teihen/2;

printf("面積S=%f\n",S);
}

これであってますか?

699 名前:プリンがー mailto:aaa [2007/11/02(金) 18:20:13 ]
e=1+1/1!+1/2!+・・・+1/10!を求めよ。

#include <stdio.h>
int main (void)
{
int i;
double e;

for(i=1;i<=10;i++){

e+=0.1+1/i!:

}
printf("e=%f\n",e);
return(0);
}
あってます?

700 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:21:53 ]
constのポインタだと
どこらへんがおいしいの?

701 名前:デフォルトの名無しさん [2007/11/02(金) 18:22:44 ]
>>698
teihen の値が怖いwwwww


>>699
e+= が怖いwwwww

702 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:23:54 ]
!

703 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:27:18 ]
>>697
例えば、
Manpage of QSORT
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/qsort.3.html

に、(char * const *) p1が出てくる。

704 名前:デフォルトの名無しさん [2007/11/02(金) 18:34:47 ]
e+=0.1+1/i!:

eが初期化してない。
1/i!なんて式初めて見た。



705 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:38:43 ]
for(i=1;i<=10;i++)

のケースだと i! はいつも 0 になり、ゼロディバイドw

706 名前:デフォルトの名無しさん [2007/11/02(金) 18:43:07 ]
>>705
!iならそうだろうけど・・・。
i!でもおk

707 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:52:45 ]
>>703
thx
使うときは使うんだな。もっかいポインタやりなおすわ。

708 名前:プリンがー mailto:aaa [2007/11/02(金) 19:10:08 ]
>>701
teihenじゃなくどうすればいいですか?ippen?

>>704
初期化・・このときe=0の初期化が必要なんですか?

709 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:14:25 ]
>>708
printf("teihen=");
scanf("%lf",&height); // テーヘンだ!テーヘンだ!

710 名前:プリンがー mailto:aaa [2007/11/02(金) 19:19:49 ]
>>709
あ、入力ミスですw
変数名はteihenで構わないですよね?


711 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:21:09 ]
>>708
>>698の自分のプログラムをよく見ましょう
単純なケアレスミス

あとCにはi!なんて記法は存在しません

712 名前:プリンがー mailto:aaa [2007/11/02(金) 19:28:03 ]
>>711
そうなんですか。
そうした場合>>699の問題でプログラムの本体はどうすればいんですか?

713 名前:デフォルトの名無しさん [2007/11/02(金) 19:29:56 ]
>>712

まずn!の意味を考えると・・・

n! = 1*2*3*4*5 ・・・ * n


あとはそれをプログラムするだけ。

714 名前:プリンがー mailto:aaa [2007/11/02(金) 19:34:23 ]
>>713
なるほど。
プログラム内に「・・・」の表記はありなんですか?



715 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:38:14 ]
あまりにアホすぎて釣りにしか見えない

716 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:38:21 ]
>>714
まず問題の前に書式の勉強をしておいで。

717 名前:プリンがー mailto:aaa [2007/11/02(金) 19:40:32 ]
初心者なもんですんまそ。


718 名前:プリンがー mailto:aaa [2007/11/02(金) 19:46:23 ]
なしですね。

719 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:58:25 ]
本気だったならごめん
勉強がんばれ

720 名前:プリンがー mailto:aaa [2007/11/02(金) 20:00:47 ]
>>719
ありがとうございます。


721 名前:プリンがー mailto:aaa [2007/11/02(金) 20:47:49 ]
e=1+1/1!+1/2!+・・・+1/10!を求めよ。
これって関数使わずにプログラム作れますか?

722 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:51:06 ]
mainもつかわずに?

723 名前:プリンがー mailto:aaa [2007/11/02(金) 20:51:09 ]
>>721
追記
関数でfactorial使ってできるんだろな〜てのは分かるんですが関数の学習
はまだちょこっとしかしてなくて

724 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:51:53 ]
ハンドルネーム使ってる時点で…なぁ



725 名前:プリンがー mailto:aaa [2007/11/02(金) 20:51:59 ]
>>722
mainは使ってです。

726 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:52:24 ]
プリプロセッサメタプログラミングで求めろってことか

727 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:53:00 ]
作れるよ

728 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:53:24 ]
>>723
そんなのしなくても出来る。

まずn!を計算する処理を考える、
それが出来たらnn!を計算する処理を考える
それが出来たら1/nn!を計算する処理を考える。

729 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:55:00 ]
関数使って作れるならそれをインライン展開したものを考えてみよう

730 名前:プリンがー mailto:aaa [2007/11/02(金) 20:55:14 ]
>>727
そうですか〜。
for〜if〜使えばいいのかな?

731 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:55:59 ]
うん

732 名前:プリンがー mailto:aaa [2007/11/02(金) 20:59:16 ]
>>728
n!が俺には謎めいてきたw

733 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:04:13 ]
>>730
二重ループは知ってる?

734 名前:プリンがー mailto:aaa [2007/11/02(金) 21:07:24 ]
>>733
はい。条件分岐はだいたい分かってます。



735 名前:デフォルトの名無しさん [2007/11/02(金) 21:07:42 ]
C言語結構粘るな。そろそろ終わってもいいと思うんだが

736 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:12:35 ]
答えはこのとおりだが、自分で考えたいだろうから読みにくくしている。
考え方だけ参考にして。ちなみに行儀の悪いコーディングの例でもあります
#include<stdio.h>
int main(void){int i,n=10;
double e=1.0,x=1.0;for(i=1;
i<=n;i++)e+=(x/=i);printf(
"%f\n",e);return 0;}

737 名前:プリンがー mailto:aaa [2007/11/02(金) 21:20:58 ]
>>736
大変ありがとうございます。
ちなみにn=10とx=1.0は必要ないですよね!?


738 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:27:23 ]
>>737
何故そう思う?

739 名前:プリンがー mailto:aaa [2007/11/02(金) 21:42:12 ]
>>738
n=10はiの範囲のうち。x=1.0はe+=1.0/iの1.0はiを格上げするため。
double/int→doubleここはなんて説明すればいいのか・・・

740 名前:プリンがー mailto:aaa [2007/11/02(金) 21:43:38 ]
xは1.0のままだからボックスを作る必要がない。


741 名前:デフォルトの名無しさん [2007/11/02(金) 21:44:52 ]
>>738
>>736のコードが難しすぎたようだ。
初心者にe+=(x/=i);をぱっと理解できるとはおもえん。

742 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:45:00 ]
1.0のままではありませんよ

743 名前:プリンがー mailto:aaa [2007/11/02(金) 21:57:17 ]
>>742
なぜ1.0のままじゃないんですか??
めんどくさくなければ教えて下さい。

744 名前:デフォルトの名無しさん [2007/11/02(金) 21:58:27 ]
>>743

x /= i

x = x/i;
のこと。

x/iをxに代入する。



745 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:58:46 ]
>>739 の解釈だと >>736
e=1 + 1/1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 + 1/7 + 1/8 + 1/9 + 1/10
ってことになるよ

とりあえず x の値を表示させてみては?


746 名前:プリンがー mailto:aaa [2007/11/02(金) 22:04:39 ]
>>744
それは分かってます。
>>745
ちょっと説明間違ったかなー
分子は1.0のままでしょ


747 名前:デフォルトの名無しさん [2007/11/02(金) 22:17:12 ]
>>746
じゃあ1/3!は 0.5/3だって理解は出来る?
同様に 1/4!は 0.166/4

748 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:21:55 ]
>>746
前回のループで計算したxが分子だよ

749 名前:プリンがー mailto:aaa [2007/11/02(金) 22:22:53 ]
>>747
1/3!=(1/2)/3
1/4!=(1/6)/4

750 名前:デフォルトの名無しさん [2007/11/02(金) 22:26:12 ]
>>749
そうそう。
あれ、分子が1.0のまんま?はて?

751 名前:プリンがー mailto:aaa [2007/11/02(金) 22:27:29 ]
>>750
頭が痛くなってきた。

752 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:29:31 ]
e+=(x/=i);を分解すると、
x = x / i;
e = e + x;

xのところに直値で1.0を入れることはできない

753 名前:デフォルトの名無しさん [2007/11/02(金) 22:29:48 ]
>>751
つまり分子は1.0のままではない。って事。

1/3!=(1/2!)/3
1/4!=(1/3!)/4
1/5!=(1/4!)/5



754 名前:プリンがー mailto:aaa [2007/11/02(金) 22:33:33 ]
>>753
てか階乗の意味ってもともと
1/3!=(1/2!)/3
1/4!=(1/3!)/4
1/5!=(1/4!)/5
なの?
1/3!=1/1*2*3
1/4!=1/1*2*3*4
1/5!=1/1*2*3*4*5
じゃなくて?



755 名前:デフォルトの名無しさん [2007/11/02(金) 22:34:04 ]
西暦を入力すると干支が出るようにしたいんですが、何が違うのかわかりません。教えてください
if文が全般的に違うようです。
#include<stdio.h>

main() {
int year(void);
printf("西暦・・・");
scanf("%d", &year);
if(year % 12 = 2) {printf("%d 年は戌年",year);}
else if(year % 12 = 3) {printf("%d年は亥年\n",year);}
else if(year % 12 = 4) {printf("%d年は子年\n",year);}
else if(year % 12 = 5) {printf("%d年は丑年\n",year);}
else if(year % 12 = 6) {printf("%d年は寅年\n",year);}
else if(year % 12 = 7) {printf("%d年は卯年\n",year);}
else if(year % 12 = 8) {printf("%d年は辰年\n",year);}
else if(year % 12 = 9) {printf("%d年は巳年\n",year);}
else if(year % 12 = 10) {printf("%d年は午年\n",year);}
else if(year % 12 = 11) {printf("%d年は未年\n",year);}
else if(year % 12 = 0) {printf("%d年は申年\n",year);}
else {printf("%d年は酉年\n",year);}
return 0;
}


756 名前:デフォルトの名無しさん [2007/11/02(金) 22:35:47 ]
>>754
意味は同じでしょ?
結果が同じならおk

757 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:36:03 ]
>>755
比較は == で

758 名前:デフォルトの名無しさん [2007/11/02(金) 22:36:26 ]
>>755
switchで頼むわ・・・。

759 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:37:31 ]
テーブル使おうや・・

760 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:38:11 ]
Hi, Let's use array.

761 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:38:14 ]
int year(void);
って関数じゃなくて変数の宣言をしたいんじゃないの

762 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:50:41 ]
>>757-761
お前らそんな一気に言ったら>>755が可哀想だろw

>>755
これを参考に。

#include<stdio.h>

const char *eto[] = {"申年","酉年","戌年","亥年","子年","丑年","寅年","卯年","辰年","巳年","午年","未年"}

int main(){
int year;

printf("西暦・・・");
scanf("%d", &year);
printf("%d年は%s",year, eto[year%12]);

return 0;
}

763 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:54:15 ]
>>762
year にゲタをはかせて、テーブル自体は 「子」 から始まって 「亥」 で終わって欲しい

764 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:57:06 ]
>>763
ああ、まあ、そっちの方が綺麗か
適当に脳内修正しといて



765 名前:プリンがー mailto:aaa [2007/11/02(金) 23:03:11 ]
>>757
ですね。ちょいとプリントアウトでもして頭整理します。
ありがとです。

766 名前:プリンがー mailto:aaa [2007/11/02(金) 23:03:46 ]
>>756だた。


767 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:29:09 ]
>>755
それで警告が出るようにコンパイラオプションを指定しろ。
VC++なら/W4、gccなら-Wallとか。

768 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:30:17 ]
ってそもそもエラーになるな、あほだ俺orez

769 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:30:30 ]
>>767
警告っていうか、エラーにならないか?

770 名前:プリンがー mailto:aaa [2007/11/02(金) 23:43:00 ]
for(i=0.5;i<=8.2;i++)
このときのi++は0.1刻みに増え(i=i+0.1)ますか?
それとも1ずつ増え(i=i+1)ますか?

771 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:44:47 ]
>>770
やってみればいいじゃないか?

772 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:46:46 ]
インクリメント・デクリメントできるのは整数型だけですよ

773 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:47:05 ]
>>770
0.1刻みに増えると思う根拠は何だい?

774 名前:プリンがー mailto:aaa [2007/11/02(金) 23:47:06 ]
>>771
コンパイラ?もってないからできない。



775 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:47:23 ]
>>770
基本的にループ変数にfloatやdoubleを使うのはトラブルの元だよ
累積誤差が無視できない

776 名前:プリンがー mailto:aaa [2007/11/02(金) 23:48:24 ]
>>772
なるほど。

777 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:48:42 ]
>>774
今すぐインストールしなさい

778 名前:デフォルトの名無しさん [2007/11/02(金) 23:50:40 ]
コンパイラもなくコード書いてどーするwwwwwwwwwwwwwwwww

779 名前:プリンがー mailto:aaa [2007/11/02(金) 23:52:08 ]
>>775
例えばy=x^3-x^2を1.5から8.5まで0.1ずつ変化させたときのyの値を
出力せよ。の場合ループを使わざるを得ないよね!?

780 名前:デフォルトの名無しさん [2007/11/02(金) 23:53:06 ]
>>779
そういう時は i += 0.1であって i++ではない。

781 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:53:16 ]
>>779
ループは使うがループ変数は整数型でもできる

782 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:53:56 ]
>>779
ループ変数にはintを使ってループの中で10.で割って使う

783 名前:プリンがー mailto:aaa [2007/11/02(金) 23:54:38 ]
>>777
コンパイラ購入しないといけないでしょ?
ある程度入門書終わらせたら買うけど




784 名前:デフォルトの名無しさん [2007/11/02(金) 23:54:45 ]
一定時間ごとに処理を行うようなプログラムは
どのように作ればいいですか?




785 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:55:36 ]
>>784
C標準だけではできない
割り込みとかポーリングとかOSやハードウェアをいじくる

786 名前:デフォルトの名無しさん [2007/11/02(金) 23:56:04 ]
>>783
google先生に 無料のコンパイラは無いか聞いてみれ

787 名前:プリンがー mailto:aaa [2007/11/02(金) 23:57:39 ]
>>782
なるほどー!そうなのか

788 名前:プリンがー mailto:aaa [2007/11/02(金) 23:59:47 ]
>>786
いつか聞いてみる!
いい道具だしてくれるかな〜ドラえもん

789 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 00:00:20 ]
>>783
本に付属してるものならともかく今時の入門者はコンパイラ単体で買うのは珍しいと思う
いろんなコンパイラがネットから無料でダウンロードできるしね

790 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 00:00:53 ]
>>788
今すぐ聞け

791 名前:プリンがー mailto:aaa [2007/11/03(土) 00:05:00 ]
>>789
そうんだ〜!とある人から聞いたら
コンパイラは買わないといけないよって聞いた!
あぶね〜

792 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 00:11:12 ]
>>791
特殊な環境用のコンパイラは買わないと無いかも知れない (PIC用とか)
MS-Windows とか MacOS とか Linux ならフリーのコンパイラがある
勉強ならパソコンでやればいい

793 名前:デフォルトの名無しさん [2007/11/03(土) 00:13:41 ]
ああ

794 名前:プリンがー mailto:aaa [2007/11/03(土) 00:20:25 ]
>>792
なるほど。
参考になった。




795 名前:プリンがー mailto:aaa [2007/11/03(土) 00:27:51 ]
>>782
ループの前に整数を10で割るという変数を定義してて大丈夫でしょ!?

796 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 02:28:17 ]
>>795
喪前みたいにこんなに物覚えが悪い馬鹿が実際にコンパイルしないで効率落としてたら迷惑だ。
とっととコンパイラをインストールしてこい。
コンパイラなしに勉強したいなら、もう少し他人の書き込みを注意深く読めるようになってからにしろ。

797 名前:デフォルトの名無しさん [2007/11/03(土) 02:40:36 ]
生まれた年を入力することによって今年何歳になるかを表示するようにしようとしたのですが、何が間違っているかわかりません。
#include<stdio.h>
int tosi(int a,int b);
return a - b;

main() {
int year;


printf("あなたの生まれた年は?\n");
scanf("%d",&year);
printf("あなたは今年%d歳\n",tosi(2007,year));
return 0;
}


798 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 02:43:29 ]
>>797
構文

799 名前:デフォルトの名無しさん [2007/11/03(土) 03:46:22 ]
配列の入力の時に,EOFだと-1入力で終了になりますよね?
改行で入力終了にしたいのですが,どうすればいいですか?
1 1 0 0 1 0 1 1 改行
で入力を終了したいです。
教えてください。よろしくお願いします。

//---- 配列入力
num = 0;
do {
 scanf("%d", &arr[num]);
} while ( arr[num++] != EOF );   // 改行は入力の終了
num--;                // 有効な入力数


800 名前:デフォルトの名無しさん [2007/11/03(土) 04:28:06 ]
変数やポインタについて質問なんですが、
それらが自分自身のメモリサイズを知っているのは何故なんですか?
例えば、
int a[3]={1,2,3};
printf("%d",*(a+1));
とかって場合、*(a+1)の+1がint分オフセットするって記憶している場所ってどこなんでしょう??

801 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:30:23 ]
気にすんな

802 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:34:20 ]
>>800
キニスルナ
あえて言うならコンパイラさんの秘密の小部屋の中だ


803 名前:デフォルトの名無しさん mailto:age [2007/11/03(土) 04:45:16 ]
デジタルフィギュア
www.youtube.com/watch?v=9OHe2h3sZL0


804 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:49:05 ]
>>800
そういう風に作られているからとしか言いようがない
CPUが変わるとコンパイラ変えないとだめでしょ?



805 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:49:31 ]
>>801-802
ぅぅ…気になる。。
けど我慢します。
ありがとうございました。
どっかのメモリ上にいるんだろうけど…。
それを参照出来ないのかな…。。
気になる…寝れない。


806 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:51:21 ]
>>805
そんなに気になるならアセンブラ勉強しろ
大抵のコンパイラはソース吐かせられるようになっているから
それを見れば一目瞭然なんだが

807 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:53:43 ]
>>804,806
あ、なるほど。
レジスタにもメモリにもディスクにも記憶されてないんですね!?
ただ単にオフセットしたりする順序が(機械語レベルで)書かれているんですかね。
なんとなく想像付きました。

808 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:57:45 ]
>>800
intやcharのオフセットサイズが知りたいのならsizeof(int)でおk
但し、これらの結果は環境に依存するから注意が必要だ

809 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 05:01:20 ]
>>807
CPUのアドレッシングモードを活用している場合もある
例えばx86のintならレジスタに+04hずつ足しながらレジスタ+レジスタで
アドレスを算出している事が多い
RISCの場合は完全にコード内に組み込まれてしまう場合が多いね

810 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 05:02:23 ]
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, "ないよう", "たいとる", MB_OK);
return 0;
}

XP2、VC++2005Express、cl.exeなんですが、たったこれだけのソースなのに以下のエラーが出てコンパイルできません。
なんでなんだぜ?

test.obj : error LNK2019: 未解決の外部シンボル __imp__MessageBoxA@16 が関数 _WinMain@16 で参照されました。
test.exe : fatal error LNK1120: 外部参照 1 が未解決です。

811 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 05:43:32 ]
c言語で、田 (←は辺の数2x2の例) のような図形の辺上での経路探索プログラムを作っているのですが、
自分で作ったプログラムでは、再帰処理を用いたせいかやたら速度が遅く、
辺の数を増やすと数時間では終わらなくなってしまいます。
なるべく関数を再帰呼び出ししないように無駄な探索は再帰前にチェックさせたのですが、それでも遅いです。
再帰を非再帰にしたいのですが、自分の技量ではまったく記述が浮かびませんでした。
再帰の内容は、開始位置から上下左右の4つの方向にそれぞれ移動させ、さらに再帰でその処理を繰り返しながら
目的位置までの経路を探索する、というものです。
どうすれば、非再帰にできるか助言頂けないでしょうか?

812 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 06:08:11 ]
そうすを出しなさい

813 名前:デフォルトの名無しさん [2007/11/03(土) 06:17:14 ]
>>811
経路データをどう与えるんだ? あと一筆書きするって事?

814 名前:デフォルトの名無しさん [2007/11/03(土) 06:26:38 ]
1、2、・・・N 点に対して (1,2) (4,8)という風にデータを与えればいいか
ただし(a,b)書いたときa<bとしaとbはつながっているとする

前回にすすんだ経路を記録しておいて、進んだときにその経路を消していけばいいのでは?
戻るときは前回のデータを復元していく

たとえば、A=(a1,a2)などとして、ABCDEFGという繋がりが与えられれば、各段階でAからGの経路へ進めるということを繰り返す

初めに(進めるとして)Aへ進めたらBCDEFGが残る 次にAを進めようとするがここは残っていない BCD・・・とチェックしていく



815 名前:デフォルトの名無しさん [2007/11/03(土) 06:36:49 ]
繋がりの個数 N、 繋がり (a0,b0)・・・(a(N-1), b(N-1)) 
探索の深さ d
現在の探索位置 k0,・・・k(N-1)
現在位置 x

i = 0・・・N-1
xから繋がり(ai,bi)で移動できるか 出来るならkd = i、d++ とし繋がりを消す すべての繋がりがなくなれば成功でリターンする
どの繋がりにも行けないならd--。kdのつながりを復元して上へ戻る
もしd=0なら失敗でリターンする

816 名前:815 [2007/11/03(土) 06:44:37 ]
最大1000点の繋がりを処理できるプロクラム作ってやるぜ!

817 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 06:57:02 ]
最短距離となる経路を知りたいのか?経路の総数を知りたいのか?目的がわからん。
経路の総数なら数式で出したほうがラクだと思うが。

818 名前:815 [2007/11/03(土) 07:15:55 ]
ねむくなりました とちゆうまで貼り付けておきます

#include <iostream>
#include <time.h>
using namespace std;

main(){
unsigned int A[32768];
int n,a,b,c;
for(n=0;n<32768;n++)A[n];

for(n=0;n<20000;n++){
a=rand()%1024;b=rand()%1024;
if(a!=b){c=a+1024*b; A[c/32] |= 1<<(c%32);}}

int v[10000],d=0,x=0;
for(n=0;n<10000;n++)v[n]=0;

for(n=v[d];n<1024*1024;n++)
if( (A[n/32]>>(n%32))&1 ){
a=n>>10; b=n%1024;
if(x==a){x=b;v[d]=n+1;d++;A[n/32] &= ~(1<<(n%32));}
else if(x==b){x=a;v[d]=n+1;d++;A[n/32] &= ~(1<<(n%32));}
}
}

819 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 08:07:29 ]
>>810
user32.libをリンクしろ。

user32.libはPlatform SDKもしくはWindows SDKに入っている。
VC++ 2005への設定が容易な分、Windows SDKがおすすめ。

820 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 08:35:56 ]
>>799
scanf()の戻り値を見て、0だったら終わればいい。

821 名前:デフォルトの名無しさん [2007/11/03(土) 10:52:55 ]
>>798
具体的にどこをどう直せばいいですか?

822 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 10:58:41 ]
>>821
#include<stdio.h>
int tosi(int a,int b){
return a - b;
}
main() {
int year;


printf("あなたの生まれた年は?\n");
scanf("%d",&year);
printf("あなたは今年%d歳\n",tosi(2007,year));
return 0;
}

823 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 12:17:33 ]
>>811
メモ化

再起をループに書き換えたところで改善されるパフォーマンスは微々たるもの

824 名前:815 出来たけどバグあるよ 直して使ってくれ [2007/11/03(土) 14:24:44 ]
#include <iostream>
#define TEN 3
using namespace std;
main(){
int N=TEN*TEN,n,a,b,c;unsigned int A[TEN*TEN/32+1];
//経路生成
for(n=0;n<=N/32;n++)A[n]=0;
for(n=0;n<100;n++){
a=rand()%TEN;b=rand()%TEN;
if(a<b){c=a+TEN*b; A[c/32] |= 1<<(c%32);}}
//経路総数
int keirosu=0;for(n=0;n<N;n++)if( (A[n/32]>>(n%32))&1 )keirosu++;

int *y=new int [keirosu+2], z[TEN], d=0,x,s=keirosu;;
for(n=0;n<keirosu+2;n++)y[n]=0;

for(x=0;x<TEN;x++){ z[0]=x;
while(1){ n=y[d];
if(n>=N){
if(d==0)return 0;
d--;n=y[d];a=n%TEN; b=n/TEN;
if(a==x)x=b;else x=a;
A[c/32]|=1<<(c%32);s++;
y[d]++;continue;}

if( (A[n/32]>>(n%32))&1 ){
a=n%TEN; b=n/TEN;
if(a==x){s--;if(s==0)goto end; x=b; d++; y[d]=0;z[d]=x; A[n/32]&=~(1<<(n%32));continue;}
if(b==x){s--;if(s==0)goto end; x=a; d++; y[d]=0;z[d]=x; A[n/32]&=~(1<<(n%32));continue;}}
y[d]++;}}
end:for(n=0;n<keirosu-s;n++)cout<<z[n]<<"→";}



825 名前:815 すこしなおした バグ取るか、参考として利用してくれ [2007/11/03(土) 15:04:39 ]
#include <iostream>
#define TEN 20
using namespace std;
main(){
int N=TEN*TEN,n,a,b,c;unsigned int A[TEN*TEN/32+1];
//経路生成
for(n=0;n<=N/32;n++)A[n]=0;
for(n=0;n<100;n++){
a=rand()%TEN;b=rand()%TEN;
if(a<b){c=a+TEN*b; A[c/32] |= 1<<(c%32);}}
//経路総数
int keirosu=0;for(n=0;n<N;n++)if( (A[n/32]>>(n%32))&1 )keirosu++;

int *y=new int [keirosu+2], z[TEN], d=0,x,s=keirosu;;
for(n=0;n<TEN;n++)z[n]=-1;for(n=0;n<keirosu+2;n++)y[n]=0;

for(x=0;x<TEN;x++){ z[0]=x;
while(1){ n=y[d];
if(n>=N){
if(d==0)break;
z[d]=-1;d--;x=z[d];
A[n/32]|=1<<(n%32);
s++;y[d]++;continue;}

if( (A[n/32]>>(n%32))&1 ){
a=n%TEN; b=n/TEN;
if(a==x){s--;if(s==0)goto end; x=b; d++; y[d]=0;z[d]=x; A[n/32]&=~(1<<(n%32));continue;}
if(b==x){s--;if(s==0)goto end; x=a; d++; y[d]=0;z[d]=x; A[n/32]&=~(1<<(n%32));continue;}}
y[d]++;}}
end:for(n=0;n<keirosu;n++)cout<<z[n]<<"→";}

826 名前:>>811 mailto:sage [2007/11/03(土) 15:17:37 ]
もう少し悩んでみることにしました、ありがとうございました。

>>825
ソースまで公開して頂きありがとうございます。
じっくり読んで参考にします。

827 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:07:57 ]

すみません。

struct


828 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:12:56 ]
すみません。質問です。

struct AAA{


};

AAA* a = (AAA*)malloc(sizeof(AAA)*4);

とコーディングしていたら客先の担当者からおこられました。
「一応サイズは保証されているけどそれはAAA a[4]ではない」、と。
C++では
AAA* a = new AAA[4]で保証されていますの、といったら
「それはC++だからでしょ?」といわれました・・・・。
AAA* a = (AAA*)malloc(sizeof(AAA)*4);ってやっちゃいけないんですか?

829 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:19:04 ]
a[4]と宣言できる状態なら、客先の反応が正しいかな。

830 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:24:50 ]
>>828
べつに問題ないと思うけど。
固定長で、配列で済むところでmalloc()なんか使うなって意味かな?
malloc()禁止だったら、可変長の配列はどうするんだろ。


831 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:31:19 ]
>>828
それはそもそもCではエラーなわけだが。そのコードが通るなら、C++なのだからvectorかnewを使うべきだし。

832 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:32:26 ]
「AAA* a = new AAA[4]で保証されていますの」

口調に萌えた

833 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:33:57 ]
C99

834 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:35:28 ]
>>830

回答ありがとうございます。
言葉足らずでした。「構造体のmallocなんてありえない!」といわれたのを書くの忘れてました。

すみません。ついでに便乗質問なのですが

(1)
AAA aaa[30][30];
int x=...;
int y=...;
aaa[y][x]=...;

(2)
AAA aaa[30*30];
int x=...;
int y=...;
aaa[y*30+x]=...;

で(2)の使い方をしていたらこれも理解しづらいということで怒られました。
2次元配列のほうが処理的にも良いのでしょうか。



835 名前:デフォルトの名無しさん [2007/11/03(土) 16:36:30 ]
ここ見てると自分とのレベルの差が分かるんだが皆学生とかなのか?
レベルの差ってのは自分よりすげーってことね

836 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:37:20 ]
(1)でいい状況でわざわざ(2)を選ぶ神経がわからない。

837 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:38:02 ]
そりゃ、特別な理由がないかぎりa[30][30]と書くべきだろう。

838 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:39:57 ]
>>834
(2)が明確に処理的に優れてることを示せないのに(2)を選んだ理由は?

839 名前:デフォルトの名無しさん [2007/11/03(土) 16:40:15 ]
「構造体のmallocなんてありえない!」
callocを使えということかな?

840 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:40:49 ]
>>834
いいえ、処理的にはどう考えても(2)の方が何かと都合がよいと思います。

私のところではパフォーマンスを要求する場合は(2)の形式でかつ、オフセット計算関数を用意することが多く、
そうでない場合には(1)の形式を配列の配列ではなく配列へのポインタ配列の形で使うことが多くなります。

841 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:46:45 ]
>>834
> 言葉足らずでした。「構造体のmallocなんてありえない!」といわれたのを書くの忘れてました。 

その担当者は、プログラム知らなさすぎなんじゃね?



842 名前:834 mailto:sage [2007/11/03(土) 16:46:55 ]
>>838

処理的には
a[y]のアドレスにとんで、そこからsizeof(AAA)分移動になるかと思いそれなら最初から1次元で
計算したほうがよいのかなと思いまして。

>>839

担当者いわく、構造体の領域確保はできない、ない、ということらしいです。

843 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:49:51 ]
>>842
>841に同意。後学の為に、その担当者の所属企業をお教え願えませんか?w

844 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:51:15 ]
>>840
コードの可読性は(1)のほうがいいだろ。
パフォーマンスの問題なら、(2)のほうが何パーセント処理時間が短くなるとか、具体的な数字を見せて説得すれば
いいんじゃね?



845 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:51:51 ]
>>842
>処理的には
>a[y]のアドレスにとんで、そこからsizeof(AAA)分移動になるかと思いそれなら最初から1次元で
>計算したほうがよいのかなと思いまして。

だからなんで「よい」と思うのか教えてくれ。

846 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:52:00 ]
>>842
>a[y]のアドレスにとんで、そこからsizeof(AAA)分移動になるかと思い
コンパイラの最適化をなめてはいけない。
2次元配列のほうが、より最適化される可能性が高い。

847 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:55:06 ]
>>840
>いいえ、処理的にはどう考えても(2)の方が何かと都合がよいと思います

>>842
>計算したほうがよいのかなと思いまして

自分なら、思うだけじゃ、可読性を犠牲にする気にはならないな
実測して優位性を証明しる

848 名前:デフォルトの名無しさん [2007/11/03(土) 16:57:59 ]
おまいらwwwここ見てみwwwwwww天才降臨wwwww

1 :以下、名無しにかわりましてVIPがお送りします。:2007/11/03(土) 14:02:12.45 ID:o3DHz8v00
id13.fm-p.jp/185/notkephir/


裏絵バロスwwwwwwwwwwwww


やあ、ここのBBSのパス解析できたら明日おにゃのことセックルできるお(^ω^ )

wwwww.2ch.net/test/read.cgi/news4vip/1194066132/698-698

849 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 17:06:48 ]
int a[30][30];
int b[30*30];

int foo(int x, int y) {
return a[y][x];
}

int bar(int x, int y) {
return b[y * 30 + x];
}

gcc でコンパイルしたら、foo も bar も同じコードになった。
pushl %ebp
movl %esp, %ebp
movl 12(%ebp), %ecx
movl 8(%ebp), %eax
popl %ebp
movl %ecx, %edx
sall $4, %edx
subl %ecx, %edx
addl %edx, %edx
addl %eax, %edx
movl _a(,%edx,4), %eax ;または _b(,%edx,4), %eax
ret


850 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 17:47:38 ]
fseekについて教えてください。

fseekでファイルのヘッダ部分を飛ばしたいのですが
fseek(fp,???,SEEK_SET);

4行飛ばしたい、というときは第2引数はどうすればいいのでしょうか?
4行をバイトにどう直すのかわからなくて


851 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 17:54:06 ]
ワロタw

852 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 17:56:39 ]
1行を80バイトとしてCRとLFの2文字分を足して82バイト。
4行だから、82x4=328バイト分seekするというのはどうだろう?

853 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:01:55 ]
>>852
ありがとうございます、やってみます

>>851
やり方がおかしいのか、おかしいことを言っているのでしょうか?
普通はどうやるんですか?

854 名前:デフォルトの名無しさん [2007/11/03(土) 18:02:31 ]
>>822
ありがとうございます。



855 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:10:11 ]
>>853
1行が何バイトかは、その行を読み込んで改行まで数えないとわからないのが普通

856 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:10:58 ]
>>853 オイオイw

857 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:20:44 ]
でも、データをストリームとして扱うようになったのはUnix以降じゃなかったか?
だからそれ以前の人ならそういう発想でも別に変でないかも。

858 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:51:46 ]
何とかできました。

>>855
普通はそうなのですか…結構アナログな感じなのですね


ただ、すんません。疑問が増えました。
データをストリームとして扱う、の意味がわかりません


859 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:57:10 ]
>> 850
現在位置を取得し、これをAとします。
getsを4回呼び出します。
現在位置を取得し、これをBとします。
fseekで現在位置をAの場所に戻します。
fseekB-Aバイト分現在位置を進めます。

860 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:58:30 ]
>>858
「データをストリームとして扱う」というのは、普通にファイルを頭から順に読んでいくこと。
これに対して、「固定長のブロックとして扱う」やりかたがあって、
ひとつひとつのカタマリが同じ大きさの場合に、
fseekを使ってデータの開始位置にシークして、必要なデータのみを直接読み書きすることを言います。

861 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 19:24:43 ]
>>859-860
ありがとうございました。
今まで何も理解せずにプログラムしてたのだと思い知りました。。。


862 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 21:41:45 ]
KOUZOUTAI data[num];

KOUZOUTAI *data
data = (struct Point *)malloc( sizeof(struct Point) * num );


の違いって何なのでしょうか?
どちらもnum分の構造体を確保していると思うのですが。


それとポインタの場合で二次元の構造体を確保する方法教えてください。

863 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 21:42:36 ]
>>862
すません。
4行目はPointじゃなくて KOUZOUTAIです。

864 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 21:59:04 ]
int data[10]

int *data = (int *)malloc(sizeof(int)*10)
の違いと同じ。



865 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:00:33 ]
質問です。
ファイルの更新時刻を得るのってどうすればいいんでしょうか?

866 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:01:13 ]
OS次第

867 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:07:28 ]
右クリック → プロパティ

868 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:17:23 ]
>>866
標準ライブラリにそういう関数が入ってたりしないってことでしょうか

869 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:23:21 ]
>>868
ファイルシステムに依存する情報なんで、標準には入ってない

870 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:23:32 ]
>>864
んー
その、構造体で宣言するのと、ポインタで宣言するのと利点があまりわからず

あと2次元の構造体をポインタで確保する方法もお願いします

871 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:27:14 ]
まず「二次元の構造体」を詳しく。
構造体の二次元配列をポインタで確保するのなら、普通の変数を二次元に確保するときと同様でいい。

872 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:28:40 ]
スコープを跨ぐことができない・できるの違いぐらいじゃない?
あと、後者の方が前者と比べると遅そうだけど、これは実装・環境に依存するのかな。

873 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:34:47 ]
>>871
KOUZOUTAI data[10][10]
のようなことです。

二次元配列をポインタで確保するやり方調べてきます。やったことなくて。

>>872
なるほど。
というと、グローバルでKOUZOUTAI data[10]とするのと同じような感じになるのでしょうか?


874 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:49:42 ]
KOUZOUTAI (*data)[10]



875 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:25:23 ]
struct e{
int value;
};

int main(){
struct e **p,(*q)[5];
int i;

//こんな方法とか
p = (struct e**)malloc(10 * sizeof(struct e*));
for(i=0; i<9; ++i){
p[i] = (struct e*)malloc(5 * sizeof(struct e));
}

//こんな方法がある
q = (struct e(*)[5])malloc(5 * 10 * sizeof(struct e));

//こんな風に使う
p[0][0] = 0;
q[0][0] = 0;

//忘れずに解放
for(i=0; i<9; ++i){
free(p[i]);
}
free(p);
//qの方が解放は楽
free(q);

return 0;
}

876 名前:875 mailto:sage [2007/11/03(土) 23:26:22 ]
繰り返し部分間違えた
for(i=0; i<9; ++i)

for(i=0; i<10; ++i)

877 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:38:36 ]
**ばっかりでわかりにくいなぁ。

878 名前:デフォルトの名無しさん [2007/11/03(土) 23:42:07 ]
だいぶはしょりますが・・・
int i;
char b;
char a[] = "abcdefg";
scanf("%s",&b);
while(b != a[i])
i++;
・・・略
みたいなbで打たせた文字をaの配列から探させるようなプログラムを書くとwhile文のところで、
「char型はchar*型に変換できない」
というエラーが出ます。どうすればbの文字ををaの配列から参照できますか?
わかりにくくてごめんなさい

879 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:46:27 ]
>>878
>534の下3行。

880 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:49:25 ]
>>878
とりあえずそのようなエラーは出なかった

881 名前:デフォルトの名無しさん [2007/11/03(土) 23:50:30 ]
>>879
ありがとうございます。%cにすればいいってことですか…?

882 名前:デフォルトの名無しさん [2007/11/03(土) 23:56:23 ]
878ですが、エラーはでなくなったのですがどうやらwhileで無限ループがおきている気がします。
上のプログラムだと、例えばscanfでdを打ったらiが3になった時点でwhile文から出るはずですよね?

883 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:57:23 ]
iを0で初期化してる?

884 名前:デフォルトの名無しさん [2007/11/04(日) 00:01:00 ]
>>883
しています。無限ループではなく他のどこかがおかしいのかもしれません。
もう一度しっかり見てみます。
ありがとうございました。



885 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:03:57 ]
>>884
bにhを入れたらどこで止まると思う?

886 名前:デフォルトの名無しさん [2007/11/04(日) 00:06:17 ]
>>885
そうなると無限ですか?
でも実際はこの配列はa〜zで、cとかdとかを入れても次の動作にいきません。

887 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:08:04 ]
whileに入る前にbに入ってる文字をprintfで確認したか?

888 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:08:12 ]
出来る限り、はしょらないで載せてくれ
>>883みたいな細々したことを指摘しないといけなくなるから

889 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:08:54 ]
>>886
その実際のソースを書け

890 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:12:11 ]
>>878のソースで「char型はchar*型に変換できない」というエラーが出るというのが気になるんだが……
scanfの%指定ミスでこんなエラー出ないよな? せいぜい実行時エラーであって

891 名前:デフォルトの名無しさん [2007/11/04(日) 00:15:44 ]
ごめんなさい
#include<stdio.h>
int main(void){
char a;
char letter[] = "abcdefghijklmnopqrstuvwxyz";
int i = 0;
printf("半角英小文字を1文字入力。:");
scanf("%s",&a);
while(a != letter[i])
i++;
printf("%s",letter[i]);
return 0;
}

です。


892 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:18:27 ]
scanf指摘されたところ直ってないじゃん

893 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:20:18 ]
>>891
%sを%cに置換してこい。printf("%s",letter[i]);文字コードがポインタだと解釈されてしまう

894 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:20:29 ]
returnの位置



895 名前:デフォルトの名無しさん [2007/11/04(日) 00:22:40 ]
>>892
>>893
ありがとうございます。
>>894
何か場所おかしいですか?

896 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:23:01 ]
>>892
直す前のを載せたんじゃないの?

>>891
printf("%s",letter[i]);

printf("%c",letter[i]);

897 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:23:21 ]
バッファオーバーラン

898 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:26:45 ]
>>897

899 名前:デフォルトの名無しさん [2007/11/04(日) 00:32:21 ]
みなさんありがとうございます。
おかげでなんとかできました。

1つ気になるのですが"%c"と" %c"の違いはなんですか?

900 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 01:04:58 ]
>>899
%cと%sの違いなら、

・scanfの場合
%cなら、引数として渡されたアドレスの指し示す先に、標準入力からとってきた一文字を入れる
%sなら、引数として渡されたアドレスの指し示す先を配列の頭と見て、文字列を入れていく。最後に\0を付加

・printfの場合
%cなら、引数として渡された数値に対応した一文字を標準出力に出力
%sなら、引数として渡されたアドレスを配列の頭と見て、その指し示す先を\0にぶち当たるまで出力する

901 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 01:10:39 ]
' '

902 名前:デフォルトの名無しさん [2007/11/04(日) 01:22:51 ]
>>900
ありがとうございます。
よくわかりました!

903 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 10:02:07 ]
ところで、何が出来れば入門を卒業したことになるの?

904 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 10:25:43 ]
言語の文法マスターしたぜ!もう学ぶことねぇwwww

え・・ポインタのポインタ?関数ポインタ?どうだったっけ?

まだまだだな俺 ←この辺から入門卒業



905 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 11:07:39 ]
>>904
それ面白いなw
初心者に教えてるつもりが逆に初心者から教わってることに気付いたあたりも入門卒業っぽいぜ。

もう一歩踏み込む気構えが出来た頃合がそうなのかもね。

906 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 11:37:37 ]
>>904
俺的にはそこで、宣言の問題だと気がついたら卒業としたい。

907 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 11:44:38 ]
「このスレ卒業テスト」と称して課題を出せばいいんじゃね?

908 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 12:29:28 ]
CでGUIアプリを作れたら入門者卒業

909 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 12:42:34 ]
>>908
んなわけあるか

910 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 12:57:44 ]
>>908
コピペで終わりじゃねーかw

911 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 14:17:19 ]
ポインタが理解できたら入門者卒業

912 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 14:24:09 ]
ポインタも
*****pくらいついたらわけがわかりません。

const ***p
***const p
とかなったらわかりません

関数ポインタなんて使ったことありません。なんで使うんですか。
GUIなんて作ったことなんてありません

でも入門卒業したいです><

913 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 14:57:08 ]
関数ポインタの使い道が分からないなら卒業は無理だな

914 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 15:13:41 ]
関数ポインタは便利だけど、あまり使うことはないですよ。
私は、DLLを使うときくらいですかね。



915 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 15:17:29 ]
卒業せんでも中退すれば

916 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 15:37:45 ]
typedef struct
{
char *str;
int (*myfunc)();
} object;

int main()
{
object obj;
obj->str = malloc(sizeof(char) * 256);
fgets(obj->str, 256, stdin);
obj->myfunc();
puts(obj->str);
free(obj->str);
return 0;
}

int myfunc()
{

}

917 名前:915 mailto:sage [2007/11/04(日) 15:38:59 ]
>>916
×object obj;
○object *obj;

918 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 16:23:53 ]
>>916
え、そんなやり方でmyfuncを呼び出せるの?
いつ関数ポインタをセットした?

919 名前:916 mailto:sage [2007/11/04(日) 16:28:35 ]
>>918
あー忘れてた。
obj->myfunc();
の前に、
obj->myfunc = myfunc;
が必要だった。あかんね。

920 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 16:54:01 ]
#include <stdio.h>
int main(void)
{
int c;
c = getchar();
printf("%d\n", c);
c = getchar();
printf("%d\n", c);
return 0;
}

このプログラムをBCC5.5.1でコンパイルして実行し、"a"と"Ctrl+Z"を1度に入力した場合、

D:\c\my\test2>test2.exe
a^Z
97
-1

このような結果になりました。
ところが、VC++2005EEのcl.exeでコンパイルし、同じように実行すると、

D:\c\my\test2>test2.exe
a^Z
97
26

このような結果になります。なぜVC++20005では正しい結果が得られないのでしょうか。

921 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 16:59:04 ]
fflush(stdout);
これを main の return の前に。


922 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:06:20 ]
*p (*p)
の違いがわかりません><

923 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:07:39 ]
あっそ

924 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:08:00 ]
教えてください><



925 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:10:33 ]
>>920
stdinの初期設定が違うんじゃね?
^C が受けられるかどうかの設定もできるし。
あるいは ^D とか。

926 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:10:56 ]
>>922
1+2 と (1+2) の違いを考えてみるといいよ

927 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:17:19 ]
>>926
ありあとやんしたー

928 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:44:16 ]
>>920
コレってマジ?
なんで今更こんなバグが残ってんの?

929 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:52:38 ]
>>921
そのようにしても結果は変わりませんでした。

>>925
どうやって設定すればいいのでしょうか?

930 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 19:11:13 ]
>>928
うちでも確認できた。これはひどいな。

931 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 19:22:15 ]
そこは仕様では決められてない部分だから、
バグだとか、どっちが間違ってるとかでは無いんじゃね?


932 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 19:55:34 ]
>>931
でも、stdio.hでは#define EOF (-1)となっているし、^Zだけならちゃんと-1と表示される。

933 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 20:55:14 ]
そうじゃなくて EOF の前に一応 ^Z も発行するかどうか。

934 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 21:57:55 ]
>>921
プログラム終了時に、標準入出力もふくめてファイルは全部フラッシュ&クローズされるから、
それは意味ない。



935 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 22:20:44 ]
num[4][5]={
{0,1,2,3,4},
{5,6,7,8,9},
{10,11,12,13,14},
{15,16,17,18,19}
};
関数に配列の{5,6,7,8,9},とかを1行だけ送りたいのですが
どういう風にやればいいのでしょう?



936 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 22:41:03 ]
送るだけならnum[1]とかを渡すだけ。

937 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 22:59:13 ]
EOFについて。
MSのドキュメント調べたけど、記述が見つからなかったので仮説。
てゆーか、コマンドプロンプトの制御文字に関する仕様のドキュメントてどこさ?

行頭にある^Zはコマンドプロンプトが解釈してプログラムに「データ無し」を通知する。
行中にある^Zは文字「0x1A」をプログラムに通知する。
という理由で>>932な動きをするっぽい。
ここはコマンドプロンプトの仕様だと思うんだけど、文献ミツカンネ。

stdinをバイナリモードで開くと同じ挙動をするので、
テキストモードでのデータ中の0x1A(制御コードのEOF)の扱いの差のようだ。
バグというよりは仕様の範疇っぽいね。
0x1Aを含むファイルをテキストモードでオープンして読んでみれば
もうちょい分かりそうなんだけど、データ作るのめんどかったんで誰か頼む。

○ バイナリで開き直したサンプル
#include <stdio.h>
int main()
{
int c;
freopen("CON", "rb", stdin);
do{
printf("%d\n",c = getc(stdin));
}while(c != EOF);
return 0;
}


938 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:10:31 ]
>>936
受け取る方を1次元にしてやれば、まとめて受け取られるんですね。
できました!ありがとうございました!

939 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:18:03 ]
>>937
VC++2005でもファイル中の0x1Aは、getcで読んだらEOFが返ってきた。
やっぱバグじゃねーの?

940 名前:デフォルトの名無しさん [2007/11/04(日) 23:24:30 ]
Turbo Explorer
無償のアプリケーション開発環境
www.forest.impress.co.jp/lib/stdy/program/progdevenv/turboexplor.html

941 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:27:37 ]
むぅ…すんません
今度は
num[4][5]={
{0,1,2,3,4},
{5,6,7,8,9},
{10,11,12,13,14},
{15,16,17,18,19}
};
の 0 5 10 15 の縦の列の総和を出したいだけなんですが
これも丸々関数に送りたいのです。。。
1次元配列にいっそのこと退避させたほうがいいんでしょうか

942 名前:デフォルトの名無しさん [2007/11/04(日) 23:36:02 ]
numごと渡して計算せよ

943 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:42:07 ]
numがココでは小さいんですが
1000×1000と大きい場合を想定しています。
numごと渡したら、メモリがムダに消費されるとかポインタの解説ページとかで見た気がして



944 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:44:37 ]
それならなお更numを渡せ



945 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:44:40 ]
numごとって、本当に渡すわけじゃないぞ。アドレス渡すだけだから。

946 名前:デフォルトの名無しさん [2007/11/04(日) 23:47:36 ]
>>941
一次元配列を使うと32*1000バイト消費するが
そのままだと何も新規に生成しないから0バイトで済む

947 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:50:24 ]
何かもう一個同じモノが作られるっぽいことが書いてあって、怖気づいてました。

ところでnumそのものの値も更新したい場合は、参照渡しするのですよね?

948 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 23:51:17 ]
本当にnumそのものの値を変更したいのか?

949 名前:デフォルトの名無しさん [2007/11/04(日) 23:53:11 ]
C言語はふつうにやると配列は参照渡しになる
コピーを渡す方は難しい

950 名前:デフォルトの名無しさん [2007/11/04(日) 23:57:50 ]

クソの集まり創価学会

偽善者が政治活動、公明党

キチガイ集団が政治活動、公明党

池田狂信ネズミ講が政治活動、公明党

騙されバカ信者、池田犬作チョン大教祖様、さっさと死ねや

951 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 00:10:49 ]
>>948-949
すみません。。。混乱してきてしまって。

今は総和だけ求めてるのですが
やりたいのは行で計算をして、その行の値を全部更新して
その更新された状態で列を計算して、全部の列を更新するということをしようとしてます。

配列と関数の関係をやりなおしてきます。

952 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 00:31:26 ]
>>951
それならなおさらアドレス渡しでいいじゃん

953 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 00:38:26 ]
>引数の引き渡しには,値渡しと参照渡しがある.
>C言語では,特別なことをしない限り,変数は値渡し,配列は参照渡しになる
今まで配列も値渡しだと思っていました…納得できました。

ありがとございましたー

954 名前:920 mailto:sage [2007/11/05(月) 11:44:12 ]
検証してくださった方、ありがとうございます。

#include <stdio.h>
int main(void)
{
int c;
do {
printf("%d ", c = fgetc(stdin));
} while (c != EOF);
return 0;
}

このプログラムを実行し、
コマンドラインから"abc^Zdef"を入力すると、(^ZはCtrl+Z)

D:\c\my\test5>test5.exe
abc^Zdef
97 98 99 26

と表示され、入力待ちになります。



955 名前:920 mailto:sage [2007/11/05(月) 11:44:52 ]
それに対して、

61 62 63 1A 64 65 66

の内容のテキストファイル(↑は16進ダンプしたもの)をstdinにリダイレクトして
実行してみたところ、

D:\c\my\test5>test5.exe < test.txt
97 98 99 -1

このような結果になり、プログラムが終了しました。

プログラムは全てVC++2005でコンパイルしました。
どうやらコマンドラインの行中にEOF(0x1A)があった場合、
stdio.hで定義されたEOF(-1)ではなく、
テキストファイルでのEOF(0x1A)として読み込むようです…。

BCC5.5.1ではどちらの場合も、

97 98 99 -1

と表示され、プログラムが終了します。

956 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 12:56:46 ]
製品版では直ってるのかな。
一応、MSに報告したらどうだろ。

957 名前:デフォルトの名無しさん [2007/11/05(月) 13:09:38 ]
別にエラーじゃないのでは?
EOFのASCIIコードを表示しているのだから

958 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 13:11:09 ]
EOFのアスキーコードじゃないよ。

959 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 13:12:35 ]
EOF じゃなくて SUB だな。
つーか単なる ^Z だが。

960 名前:920 mailto:sage [2007/11/05(月) 13:52:32 ]
>>958 >>959
ja.wikipedia.org/wiki/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB
>ASCIIでは例えば、改行文字は0x10、水平タブは0x09、EOF(End Of File、ファイル終端マーク)は0x1Aである。

961 名前:920 mailto:sage [2007/11/05(月) 14:01:52 ]
>>957
コマンドラインの行頭にあるEOFや、リダイレクトされたファイルにあるEOFは
stdio.hに定義されたEOF(-1)と読み取ることを考えると、一貫性が無いように思えます。

962 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 14:12:08 ]
ASCII に EOF なんて無いだろ。
それ書いたの誰だよ?

ttp://e-words.jp/p/r-ascii.html
ttp://ja.wikipedia.org/wiki/ASCII
ttp://www.mew.org/Newsletters/6.html


963 名前:デフォルトの名無しさん [2007/11/05(月) 18:42:18 ]
そりゃ、文字コード体系表見てもEOFなんてあるわけないわな。

964 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 21:29:32 ]
c言語の除算はどのようなアルゴリズムで行っているんでしょうか?
わかる方がいればよろしくお願いします



965 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:03:20 ]
>>964
コンパイラによるんじゃないでしょうか。
あと、たぶん、かなりアセンブラよりの質問だと思います。

966 名前:デフォルトの名無しさん [2007/11/05(月) 22:04:36 ]
CPUよりの話でしょう
浮動小数点や整数演算はハードでします

967 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:09:11 ]
テキストモードでfopenしたら0x1aで終了だろ

968 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:13:31 ]
いつまで、CP/Mの呪いをひきづらなければならないのやら。

969 名前:迷い人 [2007/11/05(月) 22:36:25 ]
こんばんは。つぎのようなプログラムがわかりません
1を入力すると

2を入力すると

xx

4を入力すると

xx

xxx

xx

xxxx

xx

xxx

xx

となるようなものです。途中まではかけたのですが肝心なところがよくわかりませんでした。
途中までは次のようになりました


970 名前:迷い人 [2007/11/05(月) 22:37:28 ]
#include <stdio.h>

void X_sequence (int n);
void X_triangle (int n);

main()
{
int n;
printf("Enter a number : ")
scanf("%d",&n);
X_triangle(n);
}

void X_sequence(int n)
{
int i;

for (i=1; i<=n; i++)
printf("X");
printf("\n");
}

void X_triangle(int n)
{・・・・こっからわかりません!

教えてくださいおねがいします

971 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:39:06 ]
if (n > 2) X_triangle(n - 1);
X_sequence(n);
if (n > 2) X_triangle(n - 1);


972 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:39:22 ]
printf("1を入力すると\n
x\n
2を入力すると\n
x\n
xx\n
x\n
4を入力すると\n
x\n
xx\n
x\n
xxx\n
x\n
xx\n
x\n
xxxx\n
x\n
xx\n
x\n
xxx\n
x\n
xx\n
x\n
");

973 名前:デフォルトの名無しさん [2007/11/05(月) 22:39:38 ]
if (n >= 2) X_triangle(n - 1);
X_sequence(n);
if (n >= 2) X_triangle(n - 1);


974 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 23:01:21 ]
ふとオープンソースの午後のこーだのソース見てみたら、C言語だったけど、
どれくらい経験つめばこれくらい書けるようになるんですかね・・・



975 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 23:15:15 ]
>>974
5000時間くらい。

976 名前:デフォルトの名無しさん [2007/11/06(火) 00:19:12 ]
すいません、質問させてください。
rand関数とか、abs関数とか、stdlib.hで宣言されてるってことを聞きました。
で、stdlib.hを探してみて実際に見たところ、確かに宣言されてたんですが、
これら関数の実体って、どのファイルに定義されているんでしょうか。
もしくは、ソースファイルはついてないんでしょうか?(当方Mac OSXです)
見てみたいな、と思いまして・・

977 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 00:27:18 ]
>>976
そういう関数はライブラリに中身がある
ヘッダーには呼び出しかたが書いてある。
実体を見たいなら、使ってるコンパイラメーカーに聞くしかない。

978 名前:976 mailto:sage [2007/11/06(火) 00:31:18 ]
>>977
早速のお返事ありがとうございました!了解です。

979 名前:デフォルトの名無しさん [2007/11/06(火) 00:33:50 ]
scanfを使って整数型の変数に1〜100の値を入力された時のみ
続く処理をして、それ以外は再度入力を促すプログラムを作りたいです。

入力された値のエラーのチェックにはどんな処理が必要か
わからないので教えてください。

あと数値を入力してEnterを押して実行したあとに
前回入力した数値が残ったままになっているのを
消すにはどうすればいいですか?

980 名前:デフォルトの名無しさん [2007/11/06(火) 01:14:14 ]
>>979
#include <stdio.h>
int main()
{
int num;
char buff[12] = {'\0'};
do{
puts("1〜100の数値入力");
fgets(buff,sizeof(buff),stdin);
sscanf(buff,"%d",&num);

}while(1 >= num || num >=100);

/*
1以上100以下の数値が入力されたときの
処理をここに書けば〜
*/
return 0;
}

981 名前:980 mailto:sage [2007/11/06(火) 01:35:49 ]
訂正
while(1 >= num || num >=100);
       ↓
while(1 > num || num >100);

982 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 01:58:33 ]
scanfっつてんだから、scanfを使うべきなんじゃなくて?

俺ならこう書くぞ
} while (!(1 <= num && num <= 100));

983 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 02:02:57 ]
論理演算が苦手そうに見えてもいいならそれでいいんじゃね?

984 名前:デフォルトの名無しさん [2007/11/06(火) 02:30:32 ]
すいません。
!についての質問なんですが、

if ( !(fp = fopen("a.c","r")) )

もしこれでfpがNULLでない場合(どこかのメモリアドレスつまり正の整数値)、
if文が偽(つまりNULLつまり0)となると思うのですが、
何故、!(正の整数値)がNULLつまり0になるのですか??ANSIのそういう仕様ですか?


if ( !5 )は偽でNULLつまり0??

(ちなみに、現在ほとんどのstdio.hで #define NULL 0 となっている)



985 名前:デフォルトの名無しさん [2007/11/06(火) 02:33:54 ]
!5といえば 1も2も3も・・・負数でさえ含まれますよね。0ももちろん含まれますが

986 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 02:47:08 ]
#include <stdio.h>

int main(void)
{
FILE *fp;
if ( fp = (FILE*)(NULL == NULL))
;
printf("fp = %p\n", fp);
printf("(int)fp = %d\n", (int)fp);
printf("!5 = %p\n", !5);
return 0;
}




結果
fp = 0x1
(int)fp = 1
!5 = 0x0

987 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 02:58:34 ]
NULL == NULLは真だから1が返るな

988 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 05:52:39 ]
>>985
!5は「5以外」じゃないよ。
5を真偽値として評価して真、その否定で結果偽。そんだけ。

989 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 09:23:16 ]
5以外は !=5 だわな。

990 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 22:06:26 ]
レビューってどうやってやってる・・・?
なんか自分で書いたソースなのに、うまく説明できなくて凹みまくってる・・・。
頭の中じゃどんな風に動くのかわかってるんだけど、説明となると10あるうち2しか伝える事ができない・・・

991 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 22:41:32 ]
君が超天才ならしょうがないけど、
凡人なら説明できない程度の理解としか周囲には写らないだろうよ。

誰にでも納得できる説明をする必要があるの?
仕事でレビュア対象に説明するだけなら、レビュアに疑問点・不明点を上げてもらって
それに回答することで納得して貰うのじゃダメ?

レビューの経験を積めば、レビュアの傾向が見えて対策も打てるけど、
例え経験不足だとしてもレビューの前に事前にレビュアと調整しておくって手もある。
凹む前にもっと考えて行動すべきだと思うけどね。

992 名前:979 [2007/11/06(火) 22:43:34 ]
>>980 >>981 >>982
色んなサンプルソース読んでみても
scanfはあまり使われてないみたいなので
gets,fgetsに変更してみようとおもいます。

なぜなのかは、ぐーぐるさんに聞いてきます
ありがとうございました

993 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 22:55:21 ]
>>991
あ、えーと、
現状まだまだ勉強の段階なんですが、
int main(void) じゃあそのvoidってナニ?なんでここにintとかおいてるの?っていう
いわば基礎中の基礎の部分なので、プログラムに一切関係のない人でも理解できるように発言して欲しい=学べる
ということなのでやってるんですが、経験をとにかく詰むしかないんですかね・・・うーん。

994 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 23:20:34 ]
自分で書いたソースを客観的に見ることができないなら、他人に見て貰うといい。
相談できる人が身近にいればその人に協力して貰うのがいい。
相談できる人がいない、探す気もないならここにソース晒してコメントを貰うのでもいいんじゃね?



995 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 23:50:36 ]
少しお尋ねしたいのですが、
struct _TEST a
{
int num;
char ch;
}test[100] = {0};

こうした場合、test配列の中身が全て0クリアされる動作は保証されていますか?
testが配列でない場合は動作が保証されているとどこかで伺った気はしたのですが

996 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 00:10:58 ]
保証されている。ついでに言えばtest[100] = { 1 };として場合であっても
1が入るのはtest[0].numだけであって、残りは全て0になる。

997 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 01:06:24 ]
>>996
ありがとうございます!

998 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 04:38:52 ]
www.geocities.jp/horie_ryu/page01/trans.c

こちらのプログラムをVS2005でそのまま実行しても'fopen'の宣言を確認してくださいと出ます。
同HP (ttp://www.geocities.jp/horie_ryu/page01.html) にあるc1.wavやらを読み込ませて実行したいのです。
fopenで配列を読んでいるのですが、ここにどうやってc1.wavなどを読み込ませればいいのでしょうか?

999 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 05:12:45 ]
調べてたらコマンドラインで実行すらしらなかったのでなんとかなるかもしれないので失礼します。すみません。

1000 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 05:29:05 ]
1000げっつ

1001 名前:1001 [Over 1000 Thread]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






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

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

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