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


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

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



1 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:40:35 ]
C言語の入門者向け解説スレです。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
  C/C++の宿題を片付けます 115代目
  pc11.2ch.net/test/read.cgi/tech/1217741118/

・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
  C言語なら俺に聞け(入門篇) Part 35
  pc11.2ch.net/test/read.cgi/tech/1219761846/
過去スレ
  makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000

511 名前:デフォルトの名無しさん [2008/10/01(水) 19:35:55 ]
なぜ bsearch を使わん?

512 名前:デフォルトの名無しさん [2008/10/01(水) 19:38:50 ]
>>511

バイナリサーチを理解するため。

513 名前:デフォルトの名無しさん [2008/10/01(水) 20:02:46 ]
>>509
プログラムが正しいかどうか、他人に聞くしかテスト技法を知らんのか
テスト項目の導き方はいろいろある
それが知りたければ便所の落書きより有料情報をあたったほうがいい

514 名前:デフォルトの名無しさん [2008/10/01(水) 20:15:04 ]
>>513

分かった。



515 名前:デフォルトの名無しさん [2008/10/01(水) 20:34:11 ]
floatのエンディアン変換が分からないのですが、教えてください。

typedef union
{
float f;
unsigned char b[4];
} Endian32;

float ConvertF32( void *inData )
{
EndianF32 val;

val.b[0] = ((Endian32 *)inData)->b[3];
val.b[1] = ((Endian32 *)inData)->b[2];
val.b[2] = ((Endian32 *)inData)->b[1];
val.b[3] = ((Endian32 *)inData)->b[0];
return val.f;
}

void test( float inVal )
{
float ret = ConvertF32( &inVal );
fwrite( &ret, sizeof(float), 1, fp );
}

こんな感じでやっています。
1.0を送ると、int型の1が何故か入ってしまいます。

516 名前:515続き [2008/10/01(水) 20:34:40 ]
リトルエンディアンだとこうなっているので、
0011 1111 1000 0000 0000 0000 0000 0000
ビッグエンディアンにすればこうなるはずなんですが、
0000 0000 0000 0000 1000 0000 0011 1111

なぜか
0000 0000 0000 0000 0000 0000 0000 0001
こうなりますw
同じようなやり方で、intなど整数型は問題なく出来ています。
どこが間違っているんでしょうか?><

517 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 20:48:33 ]
ループ変数に対して

int main(void){

...

{
int i, j;
for(i...)
for(j...)
}

...

{
int i;
for(i...)
}

...

return 0;
}

見たいな感じでよく書くんだけど、これは機械のほうからすると無駄が多い処理なんでしょうか?



518 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 20:57:00 ]
>515
そのシステムのエンディアンではない値をfloatとして返すのが間違い。
代入した直後に正規化されたりしてややこしいことになる。

519 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 21:13:07 ]
>>515
代入というのは単にビット列をコピーすることではない
正しい内部表現を持たない値を実数として受け渡そうとしたら
場合によっては例外が送出されてプログラムが停まることもある

>>517
コンパイラの最適化次第



520 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 21:16:41 ]
型のサイズを気にするのはコンパイルするまででおk?


521 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 21:23:41 ]
意味不明

522 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 21:40:26 ]
>>515
void test( float inVal )
{
  EndianF32 ret = ConvertF32( &inVal );
  fwrite( &ret, sizeof(float), 1, fp );
}

とやれば、希望する結果が出るのではなかろうか。

523 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 21:54:51 ]
>>520
コンパイルしてから何かを気にしたとして、それでどうするつもりだ

524 名前:デフォルトの名無しさん [2008/10/02(木) 00:57:10 ]
いざ、リンクしてみたら、コンパイル済みのオブジェクトファイルが
おかしな変数宣言しすぎてメモリ不足になるとか気にしてるのかな?

525 名前:デフォルトの名無しさん [2008/10/02(木) 01:02:05 ]
そういう目に遭ったことがないのか? うらやましい

526 名前:デフォルトの名無しさん [2008/10/02(木) 01:05:07 ]
メモリ不足解消するのなら、標準関数は変数へいったん代入するとだいぶ変わるらすい。

527 名前:デフォルトの名無しさん [2008/10/02(木) 01:17:56 ]
int a = printf;
a("imi wakaran");

528 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 01:32:04 ]
int(*a)(const char*, ...) = printf;
a("naniga kawarun daro");

529 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 01:34:13 ]
>>527-528
え!そういう意味の代入なの?



530 名前:デフォルトの名無しさん [2008/10/02(木) 02:27:15 ]
void_No4様がきましたよ。

俺は天才、そしてIQは400↑、すげーだろ


531 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 03:13:57 ]
すごいね
俺の半分もあるじゃん

532 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 03:35:21 ]
またメンサか

533 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 11:21:28 ]
>>515
エンディアン云々以前に、ポインタを学んだほうが。
>val.b[0] = ((Endian32 *)inData)->b[3];
inData が指してるのは float (多分4バイトしかない) なわけだが。

534 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 13:05:06 ]
>>533
union

535 名前:デフォルトの名無しさん [2008/10/02(木) 13:43:09 ]
つmemrev

536 名前:515 mailto:sage [2008/10/02(木) 13:54:06 ]
>>518>>519>>522
ありがとうございます。たいへんよく分かりました。
>>522さんのやり方で上手く行きましたー!

>>533
共用体を使うと、そういうことが出来ちゃうんです。

537 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 17:12:00 ]
うにおんっていまいちクールなつかいかたがわからないよね


538 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 17:13:16 ]
regs

539 名前:デフォルトの名無しさん [2008/10/02(木) 17:17:48 ]
企業秘密です



540 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 18:04:14 ]
>>537
一つの領域を複数の型として使えることが共用体の意味だからそのように使えばいい
具体的にはサイズが同じ複数の型からなる配列などがある
intとfloatが不定間隔で現れるようなフォーマットのデータを扱うときに便利

541 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 18:09:50 ]
でもそれって値を取り出すときにintなのかfloatなのかわからなくない?


542 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 18:11:37 ]
floatにキャストしちゃえ

543 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 18:23:33 ]
>>541
そういうフォーマットは、たいてい先行するintの値によって
その後いくつfloatが来るのか決まってる

544 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 18:34:42 ]
たいていじゃなくて、規則性がなかったらどうするの?


545 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 18:39:36 ]
何も手がかりが無いのにそんなことしないわw

546 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 18:41:05 ]
>>544
規則性がなかったら無理

そうじゃなくて、floatが先行してintが混ざる場合もあるという意味

547 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 19:39:40 ]
構造体のメモリ確保をしたいのですが、
コンパイルできません。
visual C++ 2008 express editionです。

ソース

struct list
{
int data;
struct list* next;
};

newcell = malloc( sizeof(struct list) );

548 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 19:43:20 ]
>>547
問題の起こるソースコードとエラーメッセージを書けよ

549 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 21:15:01 ]
>>548すいません
ここのソースコンパイルしようとしたのですが
ttp://www.geocities.jp/ky_webid/algorithm/010.html

1>z:\users\phenix1gou\documents\visual studio 2008\
projects\list\list\source.cpp(77) :
error C2440: '=' : 'void *' から 'LIST *' に変換できません。

って出ます。



550 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 21:15:58 ]
newcell = (struct list*)malloc( sizeof(struct list) );

551 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 21:17:12 ]
キャストすれば

newcell = (LIST *)malloc( sizeof(struct list) );

552 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 21:17:49 ]
>>549
.cppにすんな.cにしれ

553 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 21:18:13 ]
ありがとうございました。
キャストしたらできましたm(’_’)m

554 名前:kazu [2008/10/02(木) 22:38:31 ]
独学ではじめた者です。
練習問題
・数値を複数回入力し、最後に"END"と入力された後、それぞれに対し
80以上なら"verygood"、80未満で60以上なら"good"、60未満なら"normal"
と表示されるプログラムを作成しなさい。

例) 25(enter押下)
   90(enter押下)
   73(enter押下)
   END (enter押下)


   25 normal
   90 verygood
   73 good

という問題なんですが、
正解が分かりません。


本にはヒントとして
1 文字の入力にはgets()という標準関数を使用する。
2 "END"との比較にはstrcmp()という標準関数を使用する。
3 文字を数値に変換するには、atoi()という標準関数を使用する。
4 繰り返し文(for、while文)とbreak文
と載っていました。
どなたか教えていただけないでしょうか?
よろしくお願いします。

555 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:40:47 ]
>>554
そういうのは宿題スレで聞け

556 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:44:44 ]
その本は模範解答載せてないのか
不親切だな

557 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:51:08 ]
>>554
char s[10000];
int x[10000];
int i, j;
for (i = 0; i < 10000; ++i) {
gets(s);
if (strcmp(s, "END") == 0) break;
x[i] = atoi(s);
}
for (j = 0; j < i; ++j) {
if (80 <= x[j] ) {
printf("%2d verygood\n", x[j]);
} else if (60 <= x[j]) {
printf("%2d good\n", x[j]);
} else {
printf("%2d normal\n", x[j]);
}
}

558 名前:kazu [2008/10/02(木) 23:35:55 ]
>>557
親切にありがとうございます。


559 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 23:52:06 ]
>>558
死ねやゴミ



560 名前:デフォルトの名無しさん [2008/10/03(金) 00:42:03 ]
stopppp4ststartcommandoperation2ppppppppppppppppppppppppppppppppppppppppppppppppppppppppPPPPpppp
stopp stack stack stack stack chr dir 2
sometime printf troff terminal fuu サーバーに接続します ターボコマンドをおねがいします
cdプレイヤーの接続名をきにゅうしてください
PL2 メーカーはマランツ 88 pl2の意味をおかきください
初期モデル
プレイヤーの搭載位置をおかきください マウント22 日本製と認識しました
ではくわしい おんしつを おかきください ひらがなでおかきください
じどうにんしきソフトをきどうしてください きどうご じどうちょうせいに はいります。
おわります どうもありがとうございました。
eth:0 それでけっこうです
エンファシスをクリヤモードにいたします。
 



561 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 00:46:30 ]
        ., -、,. -─- 、⌒〉
         {  }      ヽ_    r'⌒)
         ヽ、  ,,-‐‐  ‐‐-、  iヽ、 J
         {   、_(o)_,: _(o)_ヽ/ ヽ/∪
           !       >::  }  /     丶
          l    /( [三] )ヽノ‐''>  < つわぁぁぁああああ!
        i⊂}__   `二´‐'´__/__  
        ヽ   ‐- 、二`ヽ/〉⊂ニニ⊃)
         |    // ̄ ̄)j~U^∪ヽ
         ノ ` ‐-L!--‐''(´      )
        `i''ー----‐ ''"´ ヽ、__/
         !           }  ` }
          !.  , -‐- 、.    ノ--─ '    はちみつだと思ったら味噌だった〜
          ヽ、_{.     `ヽi'⌒i
           `''‐- 、.. __,!


562 名前:デフォルトの名無しさん [2008/10/03(金) 03:51:38 ]
すいません、LSI‐C86試食版を落として使ってるんですが
なぜかプログラムをコンパイルして実行すると日本語部分だけ
文字化けしてしまいます
chcpでいろいろとコードいじったりしてみても効果なしです
ググったりしたんですがそう言った情報はまったく載っていません
どなたか教えてください
ちなみにOSはVistaのホームベーシックです
よろしくお願いします

563 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 05:25:27 ]
そんなもの使うな
VC++かMinGWを使え

564 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 09:37:29 ]
文字化けする最小のコード貼ってみてよ

565 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 10:44:00 ]
makeが成功したら実行と言う場合

make && ./a

と言うのが定石だと思うんですが./aを明示せずにmake自身に
(開発中にテスト的に)実行させるような一般的な表記ってありますか?
とりあえず

make && make run

ってやってます。

566 名前:デフォルトの名無しさん [2008/10/03(金) 10:49:32 ]
make build test

567 名前:デフォルトの名無しさん [2008/10/03(金) 13:49:45 ]
いまどきLSI-Cとかまだ使ってるんだ。。VC++のExpressEditionがあったり
意外としられてないけど、.NET FrameworkSDKはコマンドライン開発専用のコマンドラインがあるのにね。

568 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:16:36 ]
入門書をそのままなぞってるんじゃない?

569 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:39:11 ]
int main(){



570 名前:デフォルトの名無しさん [2008/10/03(金) 14:40:38 ]
int main(){

double hoge[256];

func(hoge);

}


int hoge(double data[])

}

これはアドレス渡しですか?それとも配列のデータをコピーして渡していますか?

571 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:43:31 ]
int hoge(double data[]) {
}
int main() {
double fuga[256];
hoge(fuga);
}
だと思うんだが基本はアドレス渡し

572 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:27:21 ]
hogeはプロトタイプ宣言されていると考えてください。
アドレス渡しということはメモリの無駄は発生しないということですか?

573 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:29:27 ]
>>572
まあ、配列は内部的に見るとポインタで持ってるしなあ。

574 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:31:57 ]
配列全体のコピーが作られるかと言う意味なら作られない。
逆に言えば関数内で不用意にいじると配列が破壊される。

575 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:49:10 ]
配列の中身を見たいだけなので、書き換えたりはしないです
どうも!

576 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:15:18 ]
571だけどプロトタイプ宣言に噛みついたんじゃなくて
配列名と関数名が一緒ってのが気になったのよ
納得できたようでなにより

577 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:18:13 ]
そもそも関数名が違うしなw

578 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:20:36 ]
>>576
すいません。適当に書いたんで一緒のなめえになっちゃいました

579 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:22:20 ]
なめえww
らめえww



580 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:37:00 ]
中国人ですね。わかります

581 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:43:39 ]
>>575
書き換えないことが確定的ならconstをつけておけ

582 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:46:02 ]
int hoge(const double data[]) {


}

int main() {
 double fuga[256];
 hoge(fuga);

}

こうですか?

583 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:09:17 ]
>>582
そう

>hoge(fuga);
このときhogeに渡っているのは &fuga[0]
つまり配列の先頭の要素のアドレス
constを付けずにhoge内でdataの中身を変更するとfugaの中身も変更される

584 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:31:43 ]
アルゴリズム概論って言う授業で
システムを想定せよ、っていう宿題が
でたんですが,何を書けばいいでしょうか?

585 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:34:53 ]
>>584
>>1を100回読んでからお帰りください

586 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:35:13 ]
それだけじゃ何を言ってるのかわからないから三倍に書き足して宿題スレで聞け

587 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:18:33 ]
WinLibD.lib(Misc.obj) : warning LNK4099: PDB 'vc80.pdb' が '..\WinLib\lib\WinLibD.lib' で、または 'c:\Documents and Settings\\デスクトップ\VS2005対応版\chapter5\Debug\vc80.pdb' に見つかりません。デバッグ情報がないものとして、オブジェクトにリンクします。


このエラーはどうすれば回避できますか・・・?

588 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:19:42 ]
回避すべきエラーが存在しません

589 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:21:46 ]
エラーじゃなくて警告な
ライブラリにvc80.pdbが含まれてなかったなら諦めるしかない



590 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 20:06:02 ]
>>588 >>589
ありがとうございます






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

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

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