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


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

【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131



1 名前:デフォルトの名無しさん [2007/02/01(木) 23:08:46 ]
このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244

他の過去ログはここに
nssearch.hp.infoseek.co.jp/clang/
前スレ
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
pc10.2ch.net/test/read.cgi/tech/1159613789/


GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそこへさようなら。

【初心者歓迎】C/C++室 Ver.34【環境依存OK】
pc10.2ch.net/test/read.cgi/tech/1169039760/
C/C++の宿題を片付けます 82代目
pc10.2ch.net/test/read.cgi/tech/1169575464/

449 名前:デフォルトの名無しさん mailto:sage [2007/05/01(火) 17:51:05 ]
昔、if (x || y || z) よりも if ((x | y | z) != 0) の方が
速くなる可能性がある(コメント必須)という話があったが

if (memcmp(p, "924", 3) != 0) より
if (p[0] != '9' || p[1] != '2' || p[2] != '4') より
if ((p[0] ^ '9' | p[1] ^ '2' | p[2] ^ '4') != 0) の方が
速くなる可能性もあるのかな。(コメント絶対必須で)
もちろん、ショートサーキットの起こる率によっても違うだろうが。


まあ、このケースに限れば(バスエラーが起きない状況なら)
if (*(DWORD *)p & *(DWORD *)"\xFF\xFF\xFF" == *(DWORD *)"924")
の右2つを整数定数に変えたものが最速か。
もちろん、このコードは移植性も無いし可読性もない
最悪のコードではあるのだが。

450 名前:デフォルトの名無しさん mailto:sage [2007/05/01(火) 17:51:27 ]
stdioのFILE系で読み書きを同時にするのはトラブルの元だって
たしかrubyの人が言ってた気がする。

451 名前:デフォルトの名無しさん mailto:sage [2007/05/01(火) 18:00:03 ]
宿題の答えとしては条件に合わない方法

unsinged long c = a + b;
if(c < a) {
 puts("Overflow");
} else {
 puts("(a+b) OK");
}

∵)
オーバーフローしたとすると、
c = a + b - m (m = 0x100000000)
c >= a だと仮定すると b >= m となるが、b < m なので矛盾する。
従って、オーバーフローした場合は必ず c < a となる。

逆に、オーバーフローしていない場合に
必ず c >= a になるのは自明。

∴ c < a ならばオーバーフローしている。

452 名前:デフォルトの名無しさん mailto:sage [2007/05/01(火) 18:06:40 ]
>>449
分岐は基本的にコストが高いから
分岐が少ない方が速くなる可能性はあるけど、
どのくらい速くなるかは
環境と実行条件によるとしか言えない。
だから、よく使われると想定する環境下で実測するしかない。

ただ、よほどじゃないと問題にならない程度の差しかないと思うけどね。今の時代。
数兆周のループの中に入ってるとかでもない限り。

453 名前:デフォルトの名無しさん mailto:sage [2007/05/01(火) 18:32:01 ]
a > 0xFFFFFFFF - b
ではいかんか?

454 名前:デフォルトの名無しさん mailto:sage [2007/05/01(火) 18:47:24 ]
氏ね

455 名前:デフォルトの名無しさん mailto:sage [2007/05/01(火) 19:25:10 ]
>>445
Hacker's Delightの2-12でも読めば?

456 名前:デフォルトの名無しさん mailto:sage [2007/05/01(火) 20:51:40 ]
リモートの機器から日、時、分、秒を取得して、
ローカルの日時から、年月を補ってtime_t型通算病
(所謂UNIXタイム)を求めたいのだけど・・

単純にtime, localtime, mktimeで作ると、月替わりタイミングでバグるよね。
スマートなやり方があった気がするが・・思い出せない、おながいします。

※リモートとの時刻誤差は数分以内程度を想定してます。



457 名前:デフォルトの名無しさん mailto:sage [2007/05/01(火) 20:55:26 ]
日が違ってる場合に年月の補正をすればいいんじゃない?



458 名前:デフォルトの名無しさん mailto:sage [2007/05/01(火) 23:47:23 ]
C言語の問題じゃねー気がするが
日が取得できるのならそれをつき合わせて補正でイナフ

459 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 00:24:31 ]
年が今年なら、年月日だけあわせて0時の通産を求めて時分秒足したら

460 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 01:02:14 ]
>>451
このスレ的には加算を禁じる理由は何もないからいいんじゃね

461 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 01:23:14 ]
>>457-459
サンクス、思い出した。言語は関係ないな、こんなイメージで、ぶちこんどいた。

time_t now = time(0);
struct tm local = *localtime(&now);
time_t adjust = (local.tm_mday - remote->tm_mday) * (24 * 60 * 60);
if (adjust > issenwokoeta) {
  throw new AdjustOverflowException();
}
local.tm_mday = remote->tm_mday;
local.tm_hour = remote->tm_hour;
local.tm_min = remote->tm_min;
local.tm_sec = remote->tm_sec;
return mktime(&local) + adjust;



462 名前:444 のものです。 [2007/05/02(水) 02:04:03 ]
あるプログラムから別のプログラムから立ち上げて、
その標準入出力を掴むプログラムを作っていたものです。

その呼ばれたプログラムのstdin,stdoutを呼び出し元プログラムで制御するまでに一立ったのですが。
仮にsshやftpを立ち上げてみると、ログインパスワード入力時の
「Password:」 の表示が標準出力じゃないみたいで、
呼び出し元プログラムを通さず、画面に出てきてしまいます。

一体何故でしょうか?

463 名前:462訂正 [2007/05/02(水) 02:04:43 ]
>あるプログラムから別のプログラムから立ち上げて、

あるプログラムから別のプログラムを立ち上げて、


464 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 02:41:30 ]
>>463
スレ違い。

465 名前:デフォルトの名無しさん [2007/05/02(水) 03:03:04 ]
んじゃ別のところで;^^)

466 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 04:58:46 ]
つ【stderr】

467 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 09:34:10 ]
パスワード系はエコーバックもあれしてるからなあ



468 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 11:25:37 ]
つ/dev/tty

469 名前:デフォルトの名無しさん [2007/05/03(木) 04:12:22 ]
話ぶった切って悪いんですがILP64環境で4バイト長の整数を使いたいときってどうなるの?

470 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 04:23:57 ]
C99 ならこれが使えるんじゃないかと思うけど、どうだろう?
ttp://seclan.dll.jp/c99d/c99d09.htm#dt19990621

471 名前:デフォルトの名無しさん [2007/05/09(水) 11:36:43 ]
ヘッダにコードを書いてはいけないと聞いたのですが
何かあるのでしょうか?
別に書いても動きますよね?

472 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 11:42:37 ]
動く事は動くが再利用性やコードの見通しが悪くなるからあんまり書かない方がいい

473 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 11:55:36 ]
>>471
規格の 6.9 External definitions で、一つの関数または変数に対する定義は
プログラム全体で一つ以下(使われなければ無くてもいい)と制限されている。
ただし inline 関数や初期化子の無い外部変数定義は例外。

ヘッダは複数のコンパイル単位に取り込まれるので、うかつに関数や変数の
定義を置くとプログラム全体としては同じ名前に対する定義を複数持ってしまう
ことになり、未定義動作となる。

現行の一般的な処理系では、この規則に反するほとんどの場合がリンク時に
「重複した定義」などのエラーとして報告される。

474 名前:デフォルトの名無しさん [2007/05/09(水) 12:03:53 ]
>>472 473
なるほど、わかりました。
ありがとうございます。

475 名前:デフォルトの名無しさん [2007/05/09(水) 13:41:50 ]
3次元配列を使ってプログラムを組んだんですが、これをポインタを使ったプログラムに書き換えたいです。
簡単な方法があれば教えて欲しいです。
いまいちポインタが分かってないもんで、よろしくお願いします。
3次元配列は、2000*2000*2000の配列です。

476 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 14:03:38 ]
>>475
配列とポインタって中でやることはほとんど同じだから、
書き換えたってたいして意味無い(動かないものが動くようになったりしない)よ?

> 3次元配列は、2000*2000*2000の配列です。
これ、一般人が買うようなPCだとオンメモリでは扱えない大きさだよ?
(わかってるならいいんだけど)

477 名前:デフォルトの名無しさん [2007/05/09(水) 14:22:57 ]
>>476

ありがとうございます。やっぱり動作が軽くなったりはしないですよね・・・




478 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 14:28:48 ]
何十ギガという単位で実メモリがあれば速くなるんじゃないかな。


479 名前:デフォルトの名無しさん [2007/05/09(水) 14:47:12 ]
今FDにはいっている会員IDとPCの中にあるDATファイルの会員IDを照らし合わせて、同じ会員IDの名前だけとりだすというプログラムをつくっているんですがどなたか優しいできる方プログラムをのせていただけませんか?おねがいします!

480 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 14:50:45 ]
まずは両方のデータをアップしなさいな。
データのフォーマットがわかないと作れないじゃん。

481 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 14:53:31 ]
訂正:わかないと→わからないと

482 名前:デフォルトの名無しさん [2007/05/09(水) 14:55:28 ]
データとは会員IDのナンバーとかですか?ほんと初心者ですいません。

483 名前:デフォルトの名無しさん [2007/05/09(水) 15:26:41 ]
FDの中のデータは会員IDのみになっていて、1001がはいっています。PCのDATファイルには会員ID、名前、生年月日、住所の順に
1001 田中 19840908 千葉県
1002 高橋 19841203 埼玉県
1003 吉田 19840405 山形県
1004 佐藤 19841112 沖縄県
がはいっています。この2つを照らし合わせて1001のIDの田中だけ表示させたいというプログラムです。やさしいかた教えてください!お願いします!

484 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 15:35:58 ]
>1001 田中 19840908 千葉県
「1001」と「田中」の間には何があるの?
半角スペース?
他の項目の区切りも同じ?

485 名前:デフォルトの名無しさん [2007/05/09(水) 15:41:40 ]
区切りは全部タブです!よろしくお願いします!

486 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 16:00:39 ]
>>480 >>484
丸投げするような莫迦の相手をするな。

487 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 16:07:23 ]
何日までに作ってほしい?



488 名前:デフォルトの名無しさん [2007/05/09(水) 16:16:07 ]
早ければ早いほどうれしいですが忙しいなら無理には大丈夫です。今週いっぱいにはつくりたい予定ですが。丸投げですいません。よろしくお願いします。

489 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 16:21:33 ]
代金は銀行振り込みでいい?

490 名前:デフォルトの名無しさん [2007/05/09(水) 16:28:26 ]
#include <stdio.h>

const int BUFFER_SIZE = 100;
int main()
{
int y,m,d,days,n;
char buf[BUFFER_SIZE],c;
printf("年月日を入力してください\n");
while(true){
fgets(buf,BUFFER_SIZE,stdin);
n=sscanf(buf,"%d%d%d%c",&y,&m,&d,&c,);
if(n==3){
break;
}
else if(n==-1){
continue;
}
else{
printf("error\n");
return 0;
}
}


年月日を入力して曜日を求めるプログラムの一部なんですが、
fgets(buf,BUFFER_SIZE,stdin);
n=sscanf(buf,"%d%d%d%c",&y,&m,&d,&c,); の部分はどういう処理になるんでしょうか?nに整数が入るのがイマイチわかりません

491 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 16:44:15 ]
ユーザがどういう入力をすると想定してるの?
もしかして"20070509"(YYYYMMDD)とか?

492 名前:490 mailto:sage [2007/05/09(水) 17:05:15 ]
そうです。2007 5 9 って半角スペースで区切ると曜日が表示されます。
2007 5 9みたいに入力してなぜnが3とか-1とかになるんですか?

493 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 17:10:27 ]
-1 ではなく EOF と書け。

494 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 17:22:59 ]
>n=sscanf(buf,"%d%d%d%c",&y,&m,&d,&c,);
この%cは何を得ようとしてるの?

495 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 17:27:22 ]
標準関数のリターン値の意味を質問しているのか?

ヘ ル プ 読 め。

manとかMSDNとかググるとか、ヘルプ読めない環境でプログラミングなんて無茶だから。

496 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 18:04:25 ]
>>483
#include <stdio.h>

int main(void)
{
 system("grep -f fddata.dat pcdata.dat");
 return 0;
}


497 名前:490 mailto:sage [2007/05/09(水) 18:14:30 ]
簡単に書き直したらうまく出来ました。
ありがとうございました



498 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 22:44:15 ]
WindowsでもLinuxでもいいんだけど共有メモリ使う時に
構造体にキャストして使う方法とわざわざmemcpyで各要素ごとにコピーする方法が
等価だって言い張る人にどうやって違うんだよって説明すればいいですか?

相手は37歳のシナです。

499 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 22:56:06 ]
>>498
比較用のコードを書いて、ベンチマークの結果をみせてやるとか。

500 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 22:57:49 ]
>>498
そのシナさんはキャストでもコピーが作成されると思ってんの?
だとしたら、キャストの場合はアドレスが変わってないことを
見せてあげればいいんじゃない?

501 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 22:58:49 ]
>>498
まず >>1 を読み直せ。それでも相談を続けるなら2つの方法に
対応するコードと、双方の主張を理由をつけて挙げてくれ。

502 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 22:58:50 ]
>>499
それが、そうやって今しがたみせてやりましたが今度は
このような書き方は一般的じゃないとかいって怒り出して机をめちゃめちゃに
して帰りました。おまえの低能ぶりには呆れるとか捨て台詞を吐いて行ってしまいました。

正直な話、共有メモリの一番うまい使いかたってOpenMPとか見たいに自作のデータ構造を
そのまま共有メモリで共有できる形が理想なのにそれを言っても解かってもらえないのだろうか。

503 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 23:02:04 ]
よそでやれ

504 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 23:10:58 ]
Cの話じゃないよね
そいつの人格か理解力の問題か
そういう人とのコミュニケーションの取り方の問題だよね

505 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 23:12:08 ]
>>502
シナさんがこんな時間まで残業付き合ってくれてたんなら少しは大目に見てやれ。

506 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 00:32:14 ]
マ板でやれ

507 名前:デフォルトの名無しさん [2007/05/10(木) 11:03:51 ]
483ですがどなたか本当におねがいします。新社会人でこまっています。やさしい方おねがいします。



508 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 11:12:27 ]
Excel でも使えば?

509 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 11:14:59 ]
>>483
Cじゃないとだめ?
C#とかJavaは?

510 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 11:17:50 ]
>>507
>>1 を100回音読後、首吊って詫びろ阿呆。

511 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 11:33:06 ]
>507
上司に「できません」って言え

512 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 14:37:05 ]
>>507
仕事なのか? だったらコマンドラインで grep 使えよ。
わざわざ作れもしないCプログラムで仕事を遅らせるのはアホ。


513 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 15:00:16 ]
>>507
もしやそれは練習課題?

514 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 17:29:15 ]
上にもあるように、scanfつかえ

515 名前:デフォルトの名無しさん [2007/05/10(木) 18:10:54 ]
ごめんなさい。でも真剣に困ってるし助けてほしいんです。よろしくお願いします。

516 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 18:12:27 ]
だからscanfつかえよ

517 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 18:13:24 ]
帰れ



518 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 18:13:55 ]
常識知らずにかける情けは無い

519 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 18:20:37 ]
スレ違い

520 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 19:38:09 ]
だーから相手すんなってば。
相手するなら誘導してやれ。

521 名前:デフォルトの名無しさん [2007/05/10(木) 22:03:02 ]
>>515
ですけどもういいです。もっとできる人探しておしえてもらいます。
ここにいる人達はどうせこのプログラムがかけないんでしょ?
こんなしたてに聞いているのにひどい人達ですね。みなさんわからない
時期はなかったんですか?

522 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 22:07:50 ]
君は自分の要求を受け入れる人の言うことにだけ耳を傾けるのかね。

523 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 22:24:34 ]
>ここにいる人達はどうせこのプログラムがかけないんでしょ?
こういうこと言うやつに何も教える気は無い、消えろ。
その聞き方じゃどこ行っても同じだぞ、初心者にしか相手してもらえない

524 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 22:26:54 ]
少なからず相手しちゃってる件

525 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 22:26:59 ]
ネタにマジレスカコイイ

526 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 22:30:26 ]
でしょでしょエヘヘ

527 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 01:53:21 ]
でも実際こういう新入社員は居る事実。



528 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 16:58:23 ]
>>521を本人が書いているという保証はどこにもないなあ・・・。


529 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 17:41:56 ]
だから?

530 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 21:21:44 ]
疑問文に感嘆符つけて質問する奴は俺の中ではスルー対象だわ。
非常に高い確率でDQNだからな。相手してられん。

531 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 21:23:12 ]
疑問文に感嘆符とはどういうことだね!

532 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 21:35:48 ]
?!

533 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 21:37:02 ]
>>530
感嘆符つけて質問する奴なんてお前のレス以前に見たこと無い。

534 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 21:39:36 ]
勘違いしつつぼやく奴は俺の中ではスルー対象だわ。
非常に高い確率でDQNだからな。相手してられん。

535 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 21:43:23 ]
インテロバーング

536 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 21:46:44 ]
疑問符と感嘆符を間違える奴は俺の中ではスルー対象だわ。
非常に高い確率でDQNだからな。相手してられん。

って、スルーできてねーっつーの。

537 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 13:03:18 ]
今こそスルー力が試されるとき!



538 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 13:34:27 ]
throw new NullPointerException("ぬるぽ");

539 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 15:05:17 ]
try {
 >>538
} catch(Exception e) {
 System.out.println("ガッ");
}

540 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 15:06:41 ]
Javaはスレ違い。
C言語で書け!!

541 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 15:06:53 ]
>>483
あんまり暴れるな

「IDが一致してたら表示」でいいんだよね

FDからIDを1つ取ってくる
それをPCのファイルのIDを照らし合わせて一致したら表示
次のIDをFDから持ってきて上を繰り返す

という手順でいいんじゃない?
いまケータイだからソースは載せられんけど

542 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 16:43:12 ]
>>541
>あんまり暴れるな
君みたいに、いちいち反応する連中がいなくなってくれれば
もっと早く収束してたんだろうけどね。

543 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 16:47:37 ]
あまりにくだらない

544 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:24:35 ]
>>542
いちおう>>541はやり方書いてるけど?

545 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:18:25 ]
>>544
は?関係ねえよ。
>>486

546 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:36:30 ]
てst

547 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 21:56:34 ]
>>545
とりあえずおまいが氏ね



548 名前:デフォルトの名無しさん [2007/05/15(火) 23:15:56 ]
どなたか
www.cns.ci.ritsumei.ac.jp/~kitano/exp1/ex3.html
の08、09の解析をしていただけないでしょうか?

549 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 23:22:45 ]
>>548
スレ違い

550 名前:デフォルトの名無しさん [2007/05/20(日) 06:03:52 ]
整数12ビットの列を扱うには、構造体のビットフィールドを使うしかないのでしょうか?

551 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 06:33:12 ]
16bitなり32bitなりで読み込んで
必要な部分だけマスクして取りだしゃいい。

それでも外部に記録されているものを読み書きする場合には
エンディアン依存は避けられないが
ビットフィールドよりはまし。

552 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 13:14:54 ]
charを介して変換すればマシンのエンディアンには依存しない
どう変換するかは元データのエンディアンによる(6ビット1バイトだとすれば)

553 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 17:36:09 ]
どうせ外部とのI/Fなら、コンパイラもセットで依存し捲くってもいいというコンセンサスを得た上で
ビットフィールドを使うのが一番楽だと思うが。
#後は野とn(ry

554 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 22:00:06 ]
そしてBeOSの悲劇

555 名前:デフォルトの名無しさん [2007/05/21(月) 16:02:25 ]
1000までの素数を求めて出力するプログラムの作成を教えてください。
mod使う方法で。


556 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 16:14:04 ]
mod 素数 C言語あたりでググったほうがはやい

557 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 16:15:12 ]
つか、Cでmod使えとは。
>>555
宿題スレへ行け。そしてもう来るな。



558 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 16:18:27 ]
#define mod(a, b) ((a) % (b))

559 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 17:27:29 ]
inline int mod(int a, int b) { return (a % b); }

560 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 00:15:06 ]
ファイルの行数を数えてその分配列を確保したいのですが、
このような配列の使い方(foo関数の部分)をしていいのでしょうか?
malloc()した方がいいんでしょうか。

よろしくお願いします。

int main()
{
  int line_count;

file_line_count(&line_count); //ファイルの行数を数える関数
foo(line_count);
}

void foo(int line_count) //foo関数
{
  int array[line_count]:
       ^^^^^^^^^^^^^^
  :
  :
}

561 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 00:33:19 ]
>>560
対象とする規格による。いわゆる C99 なら標準で認められている。
C99 より前の C の規格や現行の C++ では認められていない。

562 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 00:34:16 ]
>>560
そのような可変長の配列はC99で採用された仕様だから、
一部のC89信者に蛇蠍の如く忌み嫌われる。

まぁ、C99限定でいいのなら使っていいと思うよ。
但し、スタックサイズに注意すること。

563 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 02:47:44 ]
関係ないけどファイルの行数を数える関数で戻り値使わないでポインタ渡しなのが気持ち悪い・・・

564 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 02:51:17 ]
昔あった、関数は全部voidで宣言しろっていうとんでもないコーディングルールを思い出した

565 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 04:45:24 ]
>>564
戻り値を表示できるデバッガが無かったとか?

566 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 08:22:36 ]
でも結構しっかりしたC用のAPIだと戻り値はエラー状態を表すのに使われていて、
本来戻り値になるであろうものもポインタの引数になるというのはよく見かける。

567 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 08:33:37 ]
MPI とかそんな感じだったような。



568 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 09:41:44 ]
余計 void はありえないなw

569 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 11:30:55 ]
戻り値のチェックを忘れる馬鹿がいるから、とかじゃね?

570 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 11:36:05 ]
is〜な問い合わせ関数でも、戻り void でステートをポインタ引数に取るのか…
たまんねーコーディング規約だな

571 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 23:25:39 ]
>>570
うんにゃ
ポインタは渡さない
後はわかるな?

572 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 23:33:04 ]
よりよってグローバル変数かよ。

573 名前:572 mailto:sage [2007/06/04(月) 23:33:55 ]
"に"が抜けた。

×よりよってグローバル変数かよ。
○よりによってグローバル変数かよ。

574 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 23:52:32 ]
>>572-573が妙にイラッと来る

575 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 00:02:58 ]
×>>572-573が妙にイラッと来る
>>572-573が妙にムラッと来る

576 名前:560 mailto:sage [2007/06/05(火) 00:03:24 ]
>>561
>>562
有難うございます。

色々つっこまれてる。(;゚□゚)

577 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 05:00:17 ]
>>571
まあ、N88-BASIC のコードを移植するプロジェクトならアリかもしれんが・・・。



578 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 13:40:27 ]
>>572
eax だってグローバル変数だー (i86系)

579 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 13:42:30 ]
スマン環境依存スレじゃなかった

580 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 13:42:38 ]
>>578
いくらなんでもスレ違い。どっか他所でやってくれ。

581 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 13:53:48 ]
レジスタはスレッド切り替わる時に退避されるからスレッドセーフで、
グローバル変数なんかとは格が違う。

582 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 14:01:55 ]
>>581
>580

583 名前:デフォルトの名無しさん [2007/06/13(水) 23:07:43 ]
pc11.2ch.net/test/read.cgi/prog/1175485506/758

char *data = 30000;
↑これに対して↓を行うと
gcc -fsyntax-only -x c -std=c99 -pedantic -Wall -Wextra

:1: warning: initialization makes pointer from integer without a cast

と警告は出るけどエラーにはならない。あれ?と思って規格を見た。

6.7.8 Initialization p11 に
"the same type constraints and conversions as for simple assignment apply"
とあったので 6.5.16.1 Simple assignment の Constraints を見たけど、
左辺ポインタで右辺が整数というのは認められないように見える。

規格ではエラーになるべきなんじゃないの?
ちなみに C++ では思ったとおりエラーになった。

584 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:09:15 ]
暗黙の・・・

585 名前:デフォルトの名無しさん [2007/06/22(金) 04:01:03 ]
ファイルサイズの取得方法って、「ftell」を使用するのが常道なんでしょうか。

Cでファイルサイズを取得する場合、自分は「fgetpos」を使用すのかなーと漠然と考えていて【B】のようなソースを考えていたんですが、
>>402がファイルサイズの取得方法として「ftell」を利用してるとのことだったので、【A】のようなソースも考えてみました。
やはりAのほうがよいのでしょうか。。。

========================
【A】
========================
long size = 0L;
FILE *fp = NULL;
fp = fopen( "hogehoge.jpeg", "rb" );
if ( fp == NULL ) {
 /* エラー処理 */
} else {
 if ( fseek( fp, 0L, SEEK_END ) != 0 ) {
  /* エラー処理 */
 } else {
  size = ftell( fp );
  if (size == -1L ) {
   /* エラー処理 */
  }
  if ( fclose( fp ) != 0 ) {
   /* エラー処理 */
  }
 }
}
/* sizeの値がhogehoge.jpegのファイルサイズ */

586 名前:585 [2007/06/22(金) 04:01:52 ]
で、Bです。
========================
【B】
========================
fpos_t *pos;
FILE *fp = NULL;
fp = fopen( "hogehoge.jpeg", "rb" );
if ( fp == NULL ) {
 /* エラー処理 */
} else {
 if ( fseek( fp, 0L, SEEK_END ) != 0 ) {
  /* エラー処理 */
 } else {
  if ( fgetpos( fp, &pos ) != 0 ) {
   /* エラー処理 */
  }
  if ( fclose( fp ) != 0 ) {
   /* エラー処理 */
  }
 }
}
/* posの値がhogehoge.jpegのファイルサイズ */
/* fpos_tってキャストできそうだからサイズの値が取れると思ったのですが。。。 */
========================


587 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 04:02:02 ]
環境依存の方法を使うのが普通じゃないかな。



588 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 04:04:05 ]
>>586
全然本質じゃない細かいところで
> fpos_t *pos;
これは
fpos_t pos;
だよね。多分わかってはいるとは思うんだけど。

589 名前:デフォルトの名無しさん [2007/06/22(金) 04:14:58 ]
fpos_tって別の変数にキャストしたりするとき困らない?

fpos_tって環境依存だからlong long型とは限らないと聞いたことがある。


590 名前:デフォルトの名無しさん [2007/06/22(金) 04:19:29 ]
横からすみません。

この>>585って、もしhogehoge.jpegのファイルサイズが巨大だった場合、
どうなっちゃんですか?

591 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 05:16:26 ]
標準Cでは2GBを超えるファイルのサイズを知る手段はないって結論になる。
fpos_tがキャスト可能であることは保障されていないことだし。

ファイル関連は標準Cだけで書くのを諦めて、64ビット系のstat()相当の関数を使うのが無難じゃない?

592 名前:デフォルトの名無しさん [2007/06/22(金) 06:19:36 ]
>>587〜のみなさん、ありがとうございました(588さんご指摘ありがとうございます)。
ファイルのサイズが大きい場合のことまで頭が回っていませんでした。
標準Cでは難しそうですね。
stat等の機能を持つ関数使用が無難といったところでしょうか。
一応stat使用時のソースも考えてみましたが…

struct stat fInfo;
if ( stat( "hogehoge.jpeg", fInfo ) != 0 ) {
 /* エラー処理 */
} else {
 /* fInfo.st_sizeにファイルサイズが入る */
}

あるいは・・・非 POSIX 標準 API インタフェースで(UX上で動作)

struct stat64 fInfo;
if ( stat64( "hogehoge.jpeg", fInfo ) != 0 ) {
 /* エラー処理 */
} else {
 /* fInfo.st_sizeにファイルサイズが入る */
}









593 名前:デフォルトの名無しさん [2007/06/22(金) 07:49:47 ]
相乗り質問ですいませんが
ファイルサイズ自体を知りたいのではなくて
ファイルサイズがある一定値を超えているか否かを判定したい場合も、
やはりstatなりftellなりでバイトサイズを一度取得してから
if文で判定するしかないですよね。

2GBだろうが3GBだろうが、とにかくある値を
超えてるか超えてないかだけわかればいいのですが。。。

594 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 08:16:12 ]
ファイル開いたらある値まで無理矢理ファイルポインタ動かしてみて
エラーが出るかを拾うってのはどうだろう
やっぱ2GB超えちゃうとダメなのかな

595 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 08:36:48 ]
そもそもファイルが開けないとサイズが調べられないプログラムはどうかと思うんで、
stat64 なりで調べた方がいいと思うよ。

596 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 08:45:05 ]
ていうかPOSIX環境だと_FILE_OFFSET_BITS=64が無ければ
2G以上のサイズはのopen/fopen自体が失敗する。
Windows環境だとopenは出来るけど、seekが出来ない(シーケンシャルには読める)。
それぞれ、open64や_lseek64(bccには無い)を使う。
もちろん、_FILE_OFFSET_BITS=64なら、openだけでよい。

また、statも同様に、_FILE_OFFSET_BITS=64ならstatだけで良いが
それ以外はstat64等を使う。

597 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 09:31:14 ]
そもそもfseek()はエラーを返せない。



598 名前:デフォルトの名無しさん [2007/06/22(金) 09:54:27 ]
stat構造体のst_sizeはoff_t型だから、……
long int型になるのかな、
そうするとlong int型に格納しきれないバイト数のファイルは
桁あふれするのかな? 0? 再現させてテストしたいが
環境が手元にないのだが。。。。。。

599 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 10:00:42 ]
だからoff_t型の大きさは_FILE_OFFSET_BITSや_LARGEFILE64_SOURCEによって変わる。
off_tに格納できないようなサイズのファイルは、そもそもstat自体が失敗する。

600 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 10:07:58 ]
あ、Windowsだとstatは失敗しないな。たぶん。
で、結果がどうなるかは処理系(ライブラリ)依存。
何故ならstatはエミュレーションしているので、
stat("c:/*", &st)が成功してしまったりする処理系があるから。

601 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 11:44:19 ]
ファイルサイズというのが何を意味するかによる。
OS上でのサイズのことなら、
そもそも環境依存なので環境に用意されたAPIを好きなように使えばいい。
Cの入出力関数で読んだときのバイト数のことなら、
読めないようなものは無視してしまえばいい。

まあ、なんでファイルサイズを知りたいのかってとこまで
一回さかのぼって考えてみるのも一計。

602 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 22:25:44 ]
サイズは「サイズ」以外ないだろ。
「文字数」とは違う。

603 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 08:17:34 ]
昔のCP/Mはセクタ数でしか管理してなかったなぁ

604 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 08:53:01 ]
>>603
今のCP/Mとやらはどう管理しているの?

605 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 09:23:37 ]
>>603
最終セクタの0x1Aまでがファイルの「サイズ」だろ?

606 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 09:45:36 ]
でもそれは管理されてない。

607 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 09:54:38 ]
ん、「管理されているかどうか」という話なの?
「ファイルのサイズとは何か」という話の揚げ足を取ろうとして墓穴を掘っただけじゃなかったの?

だったらそれでいいけど。



608 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 09:57:38 ]
あっと、
「ファイルのサイズとはOSに管理されていなければならない」という
話の流れとは関係ないことを言いたかっただけで
「ファイルのサイズとは一意に決まるものである」ということに対する反論じゃなかったって事ね。

609 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 10:25:40 ]
バイナリファイルは「0x1aまで」というルールを採用できないからセクタ単位でしかサイズを得られない。

610 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 03:19:11 ]
ファイルシステムがファイルのサイズをセクタ単位でしか管理してない上に、
テキストとバイナリで終端の扱いが違うようなシステムだって存在してたんだ。
統一した「ファイルサイズを得る方法」なんてあるわけがない。

あー、それから人の書き込みが何でも揚げ足取りに見えるとしたら重症だぞ。


611 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 03:23:51 ]
ファイルサイズを取得する関数が標準で用意されなかったのは、
そのあたりが理由なのかな?

612 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 04:03:56 ]
>>611
そそ、ファイルシステムという概念も統一できないからディレクトリ操作関係も入れられていないし
ファイル操作もストリーム処理系を除くとremove()位しかない。

613 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 04:31:09 ]
MS-DOS 1.0 もディレクトリないんだっけ?

614 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 04:43:31 ]
汎用機もねーよ

615 名前:デフォルトの名無しさん [2007/06/24(日) 22:22:42 ]
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?

616 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 22:24:17 ]
そのネタ飽きた

617 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 10:05:04 ]
そういや、xmodemプロトコル(無印)もファイルサイズの概念無かったな
128バイトのブロック単位だったからファイルの後ろにはゴミがついていた
Mac専用にファイル名やサイズをヘッダにつけるマックバイナリができたっけ・・



618 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 10:55:57 ]
マックバイナリができた事情はリソースフォークの管理のためだが詳細はスレ違いにつき割愛。

619 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 11:58:13 ]
リソースフォークの話は出してくるやつが出ると思った
リソース/データフォークのサイズもファイルサイズの指定の意味で
書いたんだがわからなかったんだろう


620 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 15:09:30 ]
>リソース/データフォークのサイズもファイルサイズの指定の意味で
>書いたんだがわからなかったんだろう
これ日本語なの?

621 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 19:06:14 ]
まるでXMODEM対応のためにマックバイナリが作られた様な表現はどうと思う。

622 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 19:07:17 ]
どうと思う!
いや、どうかと思う、だorz

623 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:39:59 ]
MFCでCString型の変数strにメタ文字の.が入っている場合\記号と連結するのに
str = "\\" + str;
これで全然問題ないのですが、標準のCで
char str[MAX_PATH];
strcpy(str, ".");
starcat("\\", str);
こうするとアクセスバイオレーションが発生します
どうしたらええの?
strcpy(str, "\.");これでも駄目だった
そうそう環境はWinXPSP-2、VC6です


624 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:41:45 ]
>>623
starcat なる謎の関数の仕様をよーく確認しろ。

625 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:42:52 ]
星猫

626 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:46:52 ]
スマンstrcatだったMSDN見ても問題ないと思うのだが?
文字列の連結するんだよねstrcatって、まぁ今回は連結する方もされる方も一文字だったが

627 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:48:00 ]
>>626
じゃぁ strcat の仕様をよーく確認しやがれこのバ



628 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:48:55 ]
そりゃ文字列リテラルに文字列を追加しようとしたら落ちるわな。

629 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:50:02 ]
それでもstarcatならきっとやってくれるさ

630 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:50:05 ]
MFC 使える環境なら CString か std::string 使えば?
そっちの方が幸せになれるよ。セキュリティ的にも。

631 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:56:52 ]
>>628
ところがどっこいリラテルでなくてもアクセスバイオレーションが起こるんだよねこれがまたww
>>630
だからMFCなら全然無問題なのだが、Cの事も知りたいからよ

632 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:56:54 ]
>>626
strcatでは、後ろに追加することしか出来ないんだ。
"//"には、後ろにstrを追加する余裕なんて無い。

633 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:59:06 ]
>>631
ならリテラル以外で問題が再現するコードを書いてみやがれ

634 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:00:41 ]
>>631
C は面倒臭いよ。
バッファオーバーフローをいちいち気にしないといけないから。

635 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:04:06 ]
sprintf()一回ですむことをstrcpy(), strcat()を駆使しようとするからそうなる。
しかし、やりたいことがよく判らないからサンプルを書けない。
例えばディレクトリとファイル名を連結したいだけならこうなるのだが。
sprintf(path, "%s\\%s", dir, file)

636 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:08:05 ]
>>631
どうせ初期化してないのに strcat とかしたんじゃないのか?

637 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:12:33 ]
元のCStringを使ったコードはこうなっていると解釈するぞ。
CString str = ".";
str = "\\" + str;

char str[MAX_PATH] = ".";
size_t size = strlen(str) + 1;
if (size >= MAX_PATH)
  abort(); /*好きにしてくれ*/
memmove(str + 1, str, strlen(str) + 1);
str[0] = '\\';
WindowsならTCHAR系使えという気もするが、とりあえずcharにしておいた。




638 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:39:04 ]
BoehmGCのようなライブラリを使えば
char *str = ".", *tmp;
tmp = GC_MALLOC(strlen(str) + strlen("\\") + 1);
sprintf(tmp, "\\%s", str);
str = tmp;
でいいよ

んでも毎回strlen()とかすんのはウザいので、
typedef struct string_t { char *s; size_t len; } string_t;
とかして、string_tに対する操作を関数で一通り作るといいよ

んでもそんなアホくさい作業をするくらいならC++で素直に
std::basic_string<>使ったほうがいいよ

639 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:53:40 ]
MFC使っているならCStringもありさ

640 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:19:12 ]
strcpy -> strncpy
strcat -> strncat
sprintf -> snprintf

641 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 20:09:50 ]
>>640
残念ながら、前2者は仕様が仕様だから推奨できない。そして最後は未だ標準じゃない。

642 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 21:07:18 ]
結局C++でstd::basic_string<>なりMFCのCStringなりを使えということになる。
何より楽だし。

643 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 22:28:15 ]
バッファオーバーフロー脆弱性の話を聞くたびに、
敢えて C を使う以上はエラー処理ちゃんとしろよと思ってしまう。
それができないなら C++ にしる、と。

644 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:19:51 ]
>641
C99は未だ存在しないのか・・・

645 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:22:59 ]
C99 が使える環境では snprintf を使って、
使えない環境なら等価な関数に #define すればいいんじゃない?

646 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:26:40 ]
snprintf()に等価な関数なんてないっしょ。環境によってはあるんだっけ?

647 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:33:00 ]
VC++ には _snprintf がある。



648 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:13:07 ]
char *s;
FILE *fp = fopen("/dev/null", "w");
size_t len = fprintf(fp, ...); /* 長さを数えてもらう */
fclose(fp);
s = malloc(len + 1);
sprintf(s, ...);

勿論こんなコードを使うぐらいならapacheあたりのコードをパクるのが良いが
それぐらいならやっぱりC++を使うべきという結論に

649 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:38:37 ]
>>648
必要なバッファの大きさを求める部分は、関数化して切り出すべきだと思う。
C99ならsnprintf(NULL, でいいし、VCなら_scprintfが使えるし。

650 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:48:37 ]
>>649
そいつらの代替実装の話だろ。

651 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:48:40 ]
問題は移植性の低さだな
標準とはいえC99未対応のCコンパイラは多い

652 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:00:52 ]
snprintf 程度なら、C99 に対応してない処理系でも大抵独自に用意されてるんじゃない?

653 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:09:55 ]
>>652
あってもC99と同じ仕様とは限らん
たとえばSingle Unix Specificationだと、たしか返り血が違うんじゃなかったか

654 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 03:06:17 ]
その場合は自分でラッパ関数を定義すればいいんじゃないかな?

655 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 21:29:01 ]
*BSD LIBCあたりから掻っ払って来りゃええやん。

656 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:59:02 ]
ねぇねぇおまえらちょっと教えてくんない
ファイルの行数を取得する標準関数なんてないよね
そんなことがしたい時ってやっぱ一旦ファイルを全部読み込んでそん時に\nの数
数えるとかやってんの?
どうよ


657 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:03:13 ]
そうする



658 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:34:14 ]
それ以外の方法があるなら是非とも教えてもらいたいもんだ

659 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:50:13 ]
fp = fopen(filePath,"r");
while(fgets(szBuff, MAX_PATH, fp) != NULL)
{
  maxLine++;
}
fclose(fp);

char szItem[7][maxLine++];

じゃぁこれはどうよ、二次元配列が作りたくてこうやったら
error C2057: 定数式が必要です、MSDNとか調べてsupport.microsoft.com/kb/142493/ja

char szItem[7][((const int)maxLine++];
こうしてもなおんないんだよねぇこれってどうよ

660 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:52:13 ]
スマン訂正
int maxLine;
罰char szItem[7][((const int)maxLine++];
丸char szItem[7][(const int)maxLine++];

661 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:59:58 ]
C99じゃない限り配列の大きさはコンパイル時に固定=定数

662 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:07:53 ]
あきらめきれなくて
回避策はないのかと聞いてみる

663 名前:デフォルトの名無しさん [2007/07/05(木) 00:09:15 ]
ttp://www23.atwiki.jp/homework/pages/11.html#id_062fdb0f
のwikiに載っていたリサージュのプログラムで
x = cos(2 * PI * a * t);
y = sin(2 * PI * b * t);
の2の値を自由に変えられる(自分で入力できる)ように
したいんですけど、どうやったらいいですか?


664 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:10:28 ]
>>662
malloc使えばいいんじゃない

665 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:12:44 ]
>>664
クワシク

666 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:17:10 ]
そこらへんの入門書に書いてある。
残念ながらここで1から説明していられるほど簡単に説明できる機能ではない。

667 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:53:10 ]
>>662
寧ろ、C++でstd::vector使えばいいんじゃない?



668 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 01:32:50 ]
ドウシテC99ヲツカワナイノデスカ

669 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 16:48:51 ]
ドウシテC99ガフキュウシテルトオモウノデスカ

670 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 16:50:55 ]
C99 使うくらいなら C++ 使う

671 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 16:52:17 ]
んだな

672 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:13:16 ]
単項演算子の+って、どう言ったときに役に立つのでしょうか?
Cだけの話ではないかもしれませんが。

673 名前:デフォルトの名無しさん mailto:age [2007/07/05(木) 23:13:35 ]
メジャーなコンパイラでC99に対応してないのってあるの?
俺趣味グラマでgccしか使わんからわからん。

674 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:16:17 ]
>>673
VC++

675 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:20:05 ]
>>672
桁合わせくらいには役に立つことはあるかも。

676 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:47:34 ]
>>672
-があるから+も装備したらしい

677 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:45:33 ]
昔、
#ifdef xx
# define SYM 10
#else
# define SYM
#endif
のような時に

int num = SYM +0;
というような使い方をした覚えがあるような無いような。



678 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:20:07 ]
マクロ関連で役に立つことがたまにありそうではあるな。

679 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:35:03 ]
正確には、式に単項演算子をつけない場合は+を省略したものとみなされる・・・じゃなかったっけ?

680 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:36:20 ]
単項+のオペランドも式だし、
単項+のオペランドになれない式もあるだろ。

681 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 03:44:31 ]
#ifdef xx
# define SYM 10
#else
# define SYM 0
#endif
では、何故ダメだったのか教えてほしい。

682 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 22:11:51 ]
学校でC言語実習やったんだがどうしてもわからないことがあったんで聞いてみる。
○×ゲームを作るプログラムを作っていたんですが。
1〜9の数字キーでどこのマスを使うか決めるプログラムなんです。
line1[10]=" 789\n",
line2[10]=" 456\n",
line3[10]=" 123\n",
という行があるんだが↑このスペース間をTabキー使って開けたらエラーが出たんですが
何故Tabキー使っては駄目なのか教えていただけませんか?

683 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 22:17:17 ]
>>682
書き換える前後で strlen(line1) の数値を比べてみれば分かるんじゃないかな

684 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 22:37:32 ]
いやコンパイルエラーになるんだろ。
たぶん、構文的に駄目になっているのだろうとしか言えない。
後できちんと規格書に当たってみる。

とりあえず、文字列リテラルの中でタブ文字を表現したければ、
タブを直接入力する代わりに\tを使えばいいと言っておく。

685 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 22:44:18 ]
>>683
ほんとにCはかじったばっかりなんでよく分からない上に
今気づいたんだけどスペースに半角使用してしまったため↑の位置が変すぎる('A`)
"と7のスペースね。

strlenって言ったら文字列の長さだよね?
Tabキーのスペースは普通のスペースの何個分もあるけど1カウント?しかしないという解釈でいいのだろうか?

686 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 22:48:07 ]
>>685
やってみたほうがよく分かる

687 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:05:02 ]
>>684
指導書に基づいてプログラム作ってるんだ。
基本的に書き換え不可だからそういうことはできないんだ
>>686
ほんとに実習でやってるだけだしそんな環境ないんだけど('A`)



688 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:12:54 ]
環境もないのに実習なんて言うのか?

689 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:28:53 ]
>>688
ヒント:やるのは学校今は家にいる
学校のPCは勝手に使っちゃいけないんだ。

690 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:30:22 ]
じゃぁ学校でやれよ。ここで文句言われてもどうしようもない。

691 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:32:15 ]
>>689
今書き込みをしているのが自分の自由に使えるPCからなら、
開発環境をインストールすることを勧める

692 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:36:48 ]
>>691
今やってみたがページが真っ白のまま止まってしまう。
ダメみたいだ/(^o^)\

693 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:38:11 ]
とりあえずお前はCの勉強する前にPCの勉強をしろ。

694 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:40:29 ]
>>692
Windows Vista と予想

695 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:49:11 ]
やっぱり聞くんじゃなかったかな。
もう書かないよ。僕のせいで13レスも進んでしまって申し訳ない。

696 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:54:59 ]
そりゃあんた、初心者スレなりに行けばいいものをこんなスレに書くからだ。

697 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:59:16 ]
寿司食いたい



698 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 09:13:41 ]
基本的に書き換え不可なのに、なんでスペースをタブにしようとすんの?

699 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 10:29:56 ]
スペースをタブにできるなら、スペースを\tにもできるだろう

700 名前:デフォルトの名無しさん [2007/07/12(木) 10:53:19 ]
ファイルがテキストファイルかバイナリーファイルかを
Cプログラムで判定したいのだけれど、方法を教えてくれ。


701 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 11:01:37 ]
>>700
ファイルの内容を1バイトずつ全て調べて、テキストファイルに通常含まれない
コードが含まれているかどうかをチェックするしかない。
ただし fopen() でバイナリモードで開くのを忘れずに。

702 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 11:23:16 ]
つ[/usr/bin/file]

703 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 11:33:10 ]
文字データって言ってもいくつかの体系を考慮したら・・・ヘッダとか考えてみたけど
それも当てにならんか・・・っつーことで、ちゃんと拡張子を付けい。

704 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 12:26:31 ]
>>702
ここをどこだと思ってるんだ

705 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 12:27:18 ]
そもそもテキストファイルとは何なのか。

706 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 12:28:40 ]
SUBをファイルの終わりとして認識すべきファイルのこと。

707 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 15:25:59 ]
>>706
CP/M の世界から、ようこそ!



708 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 00:46:50 ]
発注元がどうしても欲しい、というのでフローチャートを書いているのですが
#if を if文とフローチャート上で区別する方法はありますか?
具体的には

#if defined(MODEL_xx)
if (zzz) {
processYYY();
}
#endif

ソフトは MODEL_xx が定義してあるやつとそうでないもの、両方納品します。

709 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 00:58:46 ]
両方納品するんならフローチャートは2セット要るんじゃないか?

710 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 09:42:40 ]
>>708
定義してあるかどうかで動作が変わる関数のみ
複数書けばいい希ガス。

711 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 10:21:15 ]
if文は実行時に働くものだからフローチャートの一部だが
#ifはコンパイル時に働くものだからそもそも異なる実行ファイルができるわけで
よってフローチャートもその数だけ必要になる

っていうかCの話かこれ?

712 名前:デフォルトの名無しさん [2007/07/13(金) 16:31:31 ]
char型のcharってcharacterの略で%nのnはnewlineの略ですよね?
こういう略してある語の元の単語が載ってるサイトってないですかね?
探してもこの2つしかわからなくて

713 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 16:36:42 ]
念のために言っとくが\nな

語なんてそんなに多くないから何がわからないか聞けばここで全部答えてもいいぞ(一回にまとめるなら)

714 名前:デフォルトの名無しさん [2007/07/13(金) 18:17:06 ]
\nでしたすいません


stdioとhの意味
printfのprintとfの意味
scanfのscanとfの意味
int型 int
double型 double
%f f  
%c c  
%s s 
\t t 

全部でこれだけなんですがお願いできますか?stdioはstandard input outputかなとも思うんですが

715 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 18:28:06 ]
とおりがかりだけど、
hはheader、fはformat、intはinteger(整数)、doubuleはDouble Precision(倍精度(実数))、
%f はfloat(floating point 浮動小数点)、%c はcharacter、%sはstring、\t はTAB
あとは想像通り、辞書ひいてもいいし。

まあ誰かまとめてくれるかな。

716 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 20:07:17 ]
printfはprint formatted

717 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 20:26:52 ]
stdioはStandard IO(InputOutput)



718 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 20:42:49 ]
714は挙げていないけど、%gはe、fの次の文字だからという理由。
ANSI C言語辞典にはそう書いてある。

719 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 22:22:38 ]
>>712
新ANSI C言語辞典って本にたいがい載ってるけど、それだけに買うのはもったいないしな。

720 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 00:13:43 ]
俺あれもってるけど、一度も引いたことないわ
manかぐぐればいいだけの話しだしな

721 名前:名無し [2007/07/14(土) 05:10:14 ]
hpcgi3.nifty.com/mmgames/patio/patio.cgi?

ここの「ファイル入出力」ってやつ分かりません。

助けてください

722 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 05:18:33 ]
>>721
初心者スレへどうぞ。

723 名前:デフォルトの名無しさん [2007/07/16(月) 03:14:46 ]
(a+1)x^2+(b+1)x+(c+1)=0を
解くプログラムがわからないorz
a=1b=1c=1を入れるのだが
#include<stdio.h>
int main(void)
{
int a=1,b=1,c=1,d,x,y;
scanf("a=%f",&a);
scanf("b=%f",&b);
scanf("c=%f",&c);
d=b^2-4*a*c;
if(d>0)
x=(-b+sqr(d))/a;
y=(-b-sqr(d))/a;
printf("x=%d,%d\n",x,y);
elxe
printf("解なし\n");
return 0;
}
ではダメみたいなんよ
よくわからない、たすけておくれ



724 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 03:37:42 ]
マルチすんな

725 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 10:19:32 ]
elxe
これなに

726 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 10:23:46 ]
マルチ先で指摘済み
pc11.2ch.net/test/read.cgi/tech/1184003625/

727 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 21:36:40 ]
C99で、
for(int i = 0; i < 10; i++) /* something */ ;
みたいにforの中で変数宣言できますけど、
while( int i = f() ) /* something */ ;
みたいなことはできないんですね。不便。



728 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 22:26:34 ]
>>727
C99だとできないんだっけ?
その書き方ができるとどこが便利なのかわからないけど

729 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 22:27:05 ]
条件判定のところで変数宣言して何の意味があるんだい?



730 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 22:28:33 ]
判定のたびにブチ壊しては作り直すのであろうよ
おほほほ

731 名前:727 mailto:sage [2007/07/16(月) 22:49:06 ]
while( obj = nextObj() ) {
// something
}

みたいなことしません?

732 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 22:55:17 ]
int obj;
while( obj = nextObj() ) {
// something
}

でいいじゃんとか思ったら負け?

733 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 23:03:09 ]
>>727
for文の第一節はループ開始前に一回だけ実行される。
だから for(int i=0; … は、ループ開始前に変数iを確保して0に初期化し、
ブロック(forループ)を抜けたら破棄することを意味する。

対してwhile文の条件節は、処理がループするごとに実行される。
もしここに while(int i= … と書いたとしたら、
それは処理の先頭にくるたびにiを宣言するという意味になるが、
まだその時点ではブロックを抜けていないから、
前に宣言したiは有効で、これは文法上エラーとなる。
もし while(static int= … と宣言してうまくいくとしても、
それはおそらく何の利益もない。

734 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 23:04:35 ]
for(i=0;i=f();i=0){

とでも書いとけ

735 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 23:08:04 ]
そんなにループ内だけで変数を使いたいなら関数にでもしてしまえばよろしい

736 名前:734 mailto:sage [2007/07/16(月) 23:10:44 ]
まちがったが訂正はしない
わかって
おねがい

737 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 23:15:49 ]
{
 int obj;
 while( obj = nextObj() ) {
 // something
 }
}

みたいにブロックで囲めばいいじゃん。



738 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 23:25:36 ]
つーか
for (int obj; obj = nextObj(); ) {
// something;
}
でおk

739 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 08:18:31 ]
はんのーした香具師らは負け組

740 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 10:40:12 ]
>>733
>それは処理の先頭にくるたびにiを宣言するという意味になるが
ブロック先頭での宣言と同様に扱えばいいわけですが
規格ではそうはしなかった、ってだけの話では?

741 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 15:04:07 ]
>>740
そもそもそんな話じゃない。
規格では while に書いたステートメントは値を返さないといけないが、
int i = ... のような変数の宣言は値を返さないので書けないだけの事。

742 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 15:10:43 ]
>>741
> while に書いたステートメント
> 変数の宣言は値を返さない

現行の規格の話するんなら正確にな。
文法的に while の条件に文は書けない。
式だけ。そして文には値とかないから。

743 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 16:31:46 ]
なんというマジレスの嵐

744 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 17:23:12 ]
for (;int i = hoge();)

745 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 17:32:03 ]
寿司食いたい

746 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 17:35:08 ]
>>745
ガリでも食ってろ

747 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 18:50:31 ]
C++でできるんだから、C99でできるようにすることも可能だったとは思う。
どういう経緯があったかは知らないが、結果として制定されたC99では、
できるようになっていないけど。

以下チラシの裏
これは、こういうコード
Tok* ct;
if (ct = gettok()) { /* ... */ }
に対して、条件式のところで変数を宣言できれば、未初期化の変数を減らせ、
ついでに条件文内に変数の有効範囲を閉じ込められるというアイデアだった。
if (Tok* ct = gettok())
{
  // ctはスコープ内
}
// ctはスコープ外
参考『C++の設計と進化』 3.11.5.2 条件文の中の宣言

C++では、C以上に初期化と代入が区別されるので、
>>737-738のような書き換えができないこともある。
それもあって、俺はたまに使うし、C++からは無くなれと思わない。



748 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 19:06:31 ]
この文でコンパイルできるんだが結果が正しくでません。
どこか誤りありますか?
#include<stdio.h>
void main()
{
int a, b,c;
printf("a = ");
scanf("%d",&a);
printf("b = ");
scanf("%d",&b);
printf("c = ");
scanf("%d",&c);


if( a == b == c ){
printf("%d\n",a);
}else if( a >= b >= c ){
printf("%d\n",a);
}else if( a >= c >= b ){
printf("%d\n",a);
}else if( b >= a >= c ){
printf("%d\n",b);
}else if( b >= c >= a ){
printf("%d\n",b);
}else if( c >= a >= b ){
printf("%d\n",c);
}else if( c >= b >= a ){
printf("%d\n",c);
}
}

749 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 19:14:43 ]
>>748
「何をやろうとしているのか、また何が正しいのかは
 コードから読みやがれ」ってか。大した奴だ。

…とか思ってたら、ひと目で変な記述が。

>if( a == b == c ){
>if( a >= b >= c ){
    :(略)

そんな書き方できない。
面倒でも

if (a == b && b == c) {
if (a >= b && b >= c) {
    :(略)

と書かないと。

750 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 19:16:46 ]
>>749
スマソ。そしてありがとう。
そうやったら、できました。

751 名前:c言語初心者 [2007/07/17(火) 19:38:16 ]
突然すいません!!学校の問題でc言語の問題が3つ出たのですがまったくわからないです。問題書き込むんで誰か解いてもらえませんか?
よろしくお願いします。


752 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 19:40:08 ]
OKとりあえず宿題スレ逝け。

753 名前:c言語初心者 [2007/07/17(火) 19:43:22 ]
宿題すれってあるんですか??


754 名前:デフォルトの名無しさん [2007/07/17(火) 19:45:11 ]
C言語なら俺に聞け(入門篇) Part 16
pc11.2ch.net/test/read.cgi/tech/1184003625/


755 名前:c言語初心者 [2007/07/17(火) 19:50:54 ]
ここならしていただけるんですか??

756 名前:デフォルトの名無しさん [2007/07/17(火) 19:53:03 ]
>>755
>>751
> 学校の問題

C/C++の宿題を片付けます 93代目
pc11.2ch.net/test/read.cgi/tech/1184506311/


757 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 19:55:22 ]
ただし回答者の気が向いたら
気に入られなければスルーされる



758 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 05:49:19 ]
スレ立てられなかった。誰かキボン。

スレタイ: 【初心者歓迎】C/C++室 Ver.40【環境依存OK】

エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
age 推奨ですが、自己判断で。

◆ 前スレ: 【初心者歓迎】C/C++室 Ver.39【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1182740506/

◆ アップローダー (質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

759 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 11:05:17 ]
>>758
何故このスレで……

760 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 13:58:47 ]
もう立ってるね

761 名前:デフォルトの名無しさん [2007/07/19(木) 01:02:10 ]
cの入門書とポインタ攻略本を読んでほぼ理解できたんだけど次に何読めばいいかわからん

何かお勧めの参考書教えてください

762 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 01:05:40 ]
アルゴリズムとデータ構造

763 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 01:10:14 ]
30日でできる! OS自作入門

764 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 01:13:03 ]
K&R

765 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 01:41:38 ]
アルゴリズム辞典

766 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 10:10:47 ]
>>761
>読んでほぼ理解できたんだけど
本当なら大したもんだけど、
>cの
も少しケースセンシティブになろうね。

767 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 21:12:03 ]
ケースセンシティブにもう少しもないものだ



768 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 01:15:22 ]
たしかにw

まぁ、ポインタは理解したんだろう。
面倒なのはポインタよりも、ポインタの絡んだ型宣言の方だから。

769 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 01:38:29 ]
えーとintの配列へのポインタを受け取って関数へのポインタへのポインタを返す関数・・・

770 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 11:12:34 ]
typedef って便利だよな。

771 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 13:33:33 ]
俺は、typedef void (*func)(int)っていうのを見て
何をtypedefしてんだ?と思った時期もありました。

772 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 16:53:23 ]
void (*const *foo(const int (*p)[10]))(void (T::*)(int (U::*)()));

773 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 17:03:50 ]
typedef様様だな

774 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 17:16:19 ]
>>771
それ何をtypedefしてるの?
初めて見た

775 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 17:29:32 ]
>>774
intの引数が1つで値を返さない関数を func にtypedef
例えば、、、

void foo(int);
func f = foo;
とか

776 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 17:38:57 ]
なるほどー
自分に使う機会が来るかはわからんけど覚えておこう
thx

777 名前:デフォルトの名無しさん [2007/07/20(金) 18:12:25 ]
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?



778 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 18:13:29 ]
typedef int (U::*FP1)();
typedef void (T::*FP2)(FP1);
typedef void (*FP3)(FP2);

const FP3* foo(const int p[][10]);

779 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 20:18:26 ]
>>777
ビットフラグのクリアとか?

780 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 20:45:24 ]
>>777
ビットの配列を作るときに使う

781 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 20:45:55 ]
「作る」じゃなくて「操作する」だな。すまん。

782 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 21:50:27 ]
>>779-781
ビットシフトはなんの役に立つのでしょうか?
でぐぐれ

783 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 21:56:19 ]
そういえばどうしてローテートはないんだろ

784 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 22:20:58 ]
>>777
コレ見るの、3回目か4回目くらいなんだけど、ギャグかなんかなの?

785 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 23:02:06 ]
不定期テンプレ

786 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 23:14:02 ]
ただの荒らし
あるいは風物詩
あるいは新参の受ける洗礼

787 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 00:56:47 ]
>>783
ローテートをサポートしない CPU も多いんじゃね?
知らんけど。



788 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 01:07:00 ]
>>784
少ないなw

789 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 02:04:14 ]
&a->bって&(a->b)か(&a)->bかどっち?

790 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 02:09:29 ]
「演算子 順位」とかでぐぐれ

791 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 02:19:04 ]
&(a->b)ですね。ありがとう。

792 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 02:25:36 ]
つか、やってみりゃ分かるだろ。

793 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 02:39:22 ]
その態度は良くない。
・規格を読んで正しい挙動を把握する
・実際に処理系で実験してみる
・結果が規格と異なった場合パッチを書いてしかるべき所に送りつける(オプション)

794 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 03:25:22 ]
規格読んで来て、理解して&(a->b)を常に&a->bとか書くように
なる人と仕事組んだら俺泣きそうw

795 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 04:28:59 ]
&a->b は普通に書くだろw

796 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 04:41:50 ]
>・規格を読んで正しい挙動を把握する
=「演算子 順位」とかでぐぐれ
>・実際に処理系で実験してみる
=つか、やってみりゃ分かるだろ。

797 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 04:45:12 ]
正しい挙動を把握してから実験で確認するのと、
実験して結果を見て予想するのは、大きな違いがある。




798 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 05:26:51 ]
その態度はよくない。
実験して結果を見て法則を導くスタイルが無いと。

799 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 05:30:11 ]
はいはい、そうですね

800 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 05:48:50 ]
実験した後に確かめた方がいい。

801 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 10:00:56 ]
演算子の優先順位は、処理系依存ってことはないだろうから、実験でいいんじゃね?

802 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 10:02:37 ]
規格読む→実験する→2chで煽りつつ確かめる

803 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 10:11:19 ]
規格読む前に実験した方が実感しやすいな。

804 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 10:36:58 ]
その通りだ。実験して、壁にぶち当たって、その壁をぶっ壊せ!
フラグメンテーションエラーで、メモリーもぶっ壊せ!
そして泣きながら規格読んで実感だ!

805 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 11:26:38 ]
>>804
>そして泣きながら規格読んで実感だ!
お疲れ様です。

806 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 11:51:31 ]
C++ だが、export は色んな意味で泣ける。

807 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 12:27:13 ]
俺の胸でなけ



808 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 13:02:06 ]
俺の下であがけ

809 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 14:42:57 ]
実験だけじゃ優先順位なのか結合の方向なのか解らない、と。
まぁ、&a->bくらいなら、どっちでもいいけど。

810 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 16:25:12 ]
&a->b が (&a)->b と見做されるんだとしたら
皆 a.b と書くと思うんだわ。

811 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 00:30:44 ]
&a.bじゃないか?

812 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 00:31:41 ]
終電まで仕事してて疲れてた。>>811はお願いだから忘れて

813 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 10:05:19 ]
CD-R に保存しました

814 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 03:59:19 ]
石版に刻みました

815 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 09:46:04 ]
DNAに移植しました

816 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 10:10:45 ]
アカシックレコードに刻まれました。

817 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 00:15:00 ]
C++ の STL に感動しました
C言語で STL に似たことをしたいと思ったらどうすれば良いですか?



818 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 00:16:19 ]
C++に乗り換える。

819 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 00:17:24 ]
やっぱりそれが確実ですよね

820 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 00:20:58 ]
マクロを使う。

821 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 02:11:51 ]
そういえば、templateが使えない時代にはgeneric.hってのがあったな

822 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 21:08:58 ]
>>817
こんなんあった。かなりSTLに近いんじゃないか?
マクロを使ってるからデバッグがむずかしそうだが


>sourceforge.jp/projects/cstl
>CSTLは、C言語で使えるC++のSTLライクなコンテナライブラリです。
>vector, deque, list, set, multiset, map, multimap, stringを提供します。

823 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 10:16:24 ]
FILE *t=tmpfile();
で作成したtを
fclose(t);
してもいいですか?
なんか危なくて、こわいです。


824 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 10:24:04 ]
なんで危ないんだよw
まあ、またその内容を使うことがあるなら閉じちゃだめだが。

825 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 10:44:31 ]
ええ!
fclose(t)ってやってよかったの?

826 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 10:56:00 ]
C言語辞典見てみたけど、やっていいみたい。

827 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 11:09:09 ]
用がなくなったら閉じないとダメだろ。常考。



828 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 11:52:56 ]
tmpfile()は、そのファイルがクローズされたか、またはプログラムが終了したときに
自動的に削除されるファイルを生成し、そのストリームへのポインタを返す。

何も問題はない。

829 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 06:35:21 ]
自分ならOOライクにたとえ1行で済んだとしても生成と破棄を対にして両方の関数を作る

830 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 07:59:09 ]
なら別にC使わないで他のOO使えばいいじゃん。頭かたいね。

831 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 08:38:00 ]
生成と破棄を対にすることがOOライクだと思うくらいならそれでもいいんじゃね?

832 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 09:21:23 ]
ぷっ

833 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:09:16 ]
>>830
固いんじゃなく、弱いんだろう。

834 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:43:24 ]
>>822
面白そうなものがあるんですね
GPLじゃないところもイイ!

ただ、著作表示だけはしないといけないようですね

835 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:29:40 ]
>>834
BSDライセンスらしいから緩いでしょ

836 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:34:52 ]
いや修正BSDって中のファイルに書いてるじゃん

837 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:02:02 ]
////(main.h)
#ifndef MAIN_H
#define MAIN_H
int X
#endif
////

////(main.cpp)
#include "main.h"
#include "move.cpp"
main(){
move();
}
////

////(move.cpp)
#include "main.h"
move(){
(Xを操作する処理)
}
////

ゲームプログラミングを勉強中で、大筋で感じな状況になってます。
これをコンパイルすることも実行することもできるのですが
BCCでコンパイルすると、「パブリックモジュール_Xが、main.objとmove.objの
両方で定義されている」と警告されます。
これはどういうことで何が悪いのでしょうか?
グローバル関数を使いながら、ファイルを分割してみたいのですがどうしたらいいのでしょうか?







838 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:03:42 ]
>>837
////(main.cpp)
#include "main.h"
#include "move.cpp"←いらなくね?

839 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:06:54 ]
int X;
    ~

840 名前:837 mailto:sage [2007/08/05(日) 18:15:40 ]
>>838
それを消したら、未定義の関数moveを呼び出したなどとエラーだ出ます。

>>839
掲示板に書き込む時に簡略化したら忘れてしまいました。

841 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:21:04 ]
>>837
宣言と定義の区別をしっかりと。ヘッダには変数や関数の宣言だけ置くこと。

842 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:23:31 ]
プロトタイプ宣言でググれ

843 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 20:04:20 ]
////(main.h)
#ifndef MAIN_H
#define MAIN_H
extern int X;
#endif
////

////(main.cpp)
#include "main.h"
#include "move.h"
int main(){
move();
}
////

////(move.h)
#ifndef MOVE_H
#define MOVE_H
int move();
#endif
////

////(move.cpp)
#include "main.h"
int move(){
(Xを操作する処理)
}
////

844 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 20:05:03 ]
まちがった

////(main.cpp)
#include "main.h"
#include "move.h"
int X;
int main(){
move();
}
////


845 名前:◆V92eIRyEPU mailto:sage [2007/08/14(火) 14:48:11 ]


846 名前:◆J/ZoJAt3T2 mailto:sage [2007/08/14(火) 14:50:07 ]
テスト

847 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 23:58:55 ]
>>843-844
俺なら、
extern int X; はmove.h側に入れて、int X; は move.cpp に入れて、
main.hは消すかな。細かいことですんませんね。

>>837
安心しなさい。あなたの方が、うちの元請けより優秀です!
ちゃんと #ifndef使うあたりが。



848 名前:名無しさん@お腹いっぱい mailto:sage [2007/08/19(日) 03:09:14 ]
すいません最近c言語を習い始めたのですが、円の半径(double型)をあたえて、円周の長さと
と円の面積を表示するプログラムがどうしてもできません。
どうすればよいのでしょうか?

849 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 03:47:30 ]
お前さんが書いたコードを晒せ

850 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 04:10:29 ]
その前に初心者スレに行け。

851 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 10:50:59 ]
>>848が出来ない可能性
・scanfで&忘れ、%dを指定している
・式中にint型とかを使っている
・まともに調べてない、読んでない
・円周の長さ、円の面積が分からない

852 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 10:57:20 ]
#define PI 3

853 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 12:33:21 ]
ゆとりな定義だな

854 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 12:39:38 ]
#define ENSYUURITSU 3

855 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 18:23:29 ]
>>848 どぞ。

double pi = 3.14159265358979323846
double r = 1.0;
double s = pi * r * r;
double d = 2 * pi * r;
printf("s=%f,d=%f\n",s,d);

856 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:58:27 ]
どうでもいいが円周はlな方がしっくりくる

857 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 21:16:49 ]
#include <math.h>
double pi = atan(1) * 4;



858 名前:名無しさん@お腹いっぱい mailto:sage [2007/08/20(月) 02:27:48 ]
>857
ありがとうございます。あと家でc言語使えるようにしようと思って
microsoft.net Framework version 2.0 再頒布可能パッケージ
microsoft.net Framework version 2.0 SDK 日本語版
をダウンロードしたのですが友達の話によると
microsoft.net Framework version 2.0 日本語版 language pack
が必要らしいのですがmicrosoftの公式サイトに行っても見つからないのですが
どうやったら手に入るのでしょうか?
すごい初歩的な質問ですいません。

859 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 05:52:55 ]
>>858
初歩的以前にスレ違いなんだが自覚あるか?

860 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 09:16:00 ]
math.hインクルードするならM_PI使ったほうが早い

861 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 09:20:12 ]
>>860
M_PIは標準ではない。

862 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 09:45:41 ]
ここは世界レベルでの標準に関わる内容のスレです。標準的ではない手法はお断りします。

863 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 10:10:12 ]
M_PIが無い最近の環境って何がある?

864 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 10:18:59 ]
つ MS Visual C++

865 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 10:28:00 ]
gccでもansi適合モードにするとスルーされる。

866 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 13:43:09 ]
VC++は定義されてないのがデフォで、_USE_MATH_DEFINESを定義すると使えるようだね

867 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 14:00:16 ]
関数から構造体を受けることはできたんですが,構造体を渡して,受け取る関数を作りたいのですが
どのように記述すれば良いですか

struct Initset getinfo(struct Initset *syoki2)
↑のような記述はできないですか?



868 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 14:07:52 ]
それでいいです

869 名前:867 mailto:sage [2007/08/24(金) 15:10:45 ]
>>868
できました〜。ありがとうございます

870 名前:名無しさん@お腹いっぱい mailto:sage [2007/08/24(金) 16:41:08 ]
入力した自然数nの正の約数をすべて表示するプログラムを今、作っているのですが、
int main(void)
{
int a = 1;
int n = 500;
int f = n / a;

while(a < n) {
a += 1;
}
printf("%d\n",f);
return 0;
}
上のものは自分がわからないながらも作ったものです。
でもできませんでした。
改善点お願いします。

871 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 16:52:01 ]
while(a < n) { と a += 1; の間に
if (n % a == 0) {
printf("%d\n", a);
}
とか入れてみ

まあ約数なら 1/2 以上はありえないから省くとかするけどな。
入力とかはとりあえずscanfかなんかで。

872 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 16:57:44 ]
>>870
まず処理の流れ自体がわかってないだろう
もう一回教科書を読み直せ

873 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 23:19:39 ]
入力した自然数nの正の約数をすべて表示するプログラムを今、作っているのですが、
int main(void)
{
int a = 1;
int n = 500;
int f = n / a;

while(a < n) {
a += 1;
}
printf("%d\n",f);
return 0;
}
上のものは自分がわからないながらも作ったものです。
でもできませんでした。
改善点お願いします。


874 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 23:30:37 ]
改善というか、まずプログラムを使わずに
正の約数を全て列挙する方法すら分かってないように思える。
プログラム以前の問題。

875 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 00:30:50 ]
どういう順番での実行を予想してるんだ?

876 名前:名無しさん@お腹いっぱい mailto:sage [2007/08/25(土) 00:41:32 ]
870ですが約数をすべて列挙する方法ってnまでの数ですべて割る条件式つくって
それが成立するやつを表示するプログラムでよいのですか?

877 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 01:09:54 ]
よくない



878 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 01:12:07 ]
「nまで」がどこからnまでなのか、まら「まで」とは未満なのか以下なのか
「全て割る条件式」とは何のことなのか
本当にわかってるか?

879 名前:名無しさん@お腹いっぱい mailto:sage [2007/08/25(土) 01:18:28 ]
すいません。たとえば500だったら1,2,3,4,5,6,7,8、という風に
して割り切れる、割り切れないのif文を作ればよいのかと思ったのですがそれではだめですか?

880 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 01:22:00 ]
>>879
そこまではいい
問題は「割り切れる」の意味がわかってるかどうかだ

881 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 01:22:31 ]
自然数nの正の約数を列挙する

自然数nを割り切れる正の整数を列挙する

自然数nを割り切れる可能性のある正の整数すべてについて、
その数で本当に割り切れるかどうかを調べ、
割り切れるときはその数を画面に表示する

一応言っとくが「割り切れる」とは除算して余りが出ないことだからな

882 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 01:24:00 ]
とりあえず「nをaで割り切れるならば」を意味するif文を書いてみろ

883 名前:名無しさん@お腹いっぱい mailto:sage [2007/08/25(土) 01:26:01 ]
ありがとうございます。実は今もう一個悩んでいるのがあってかけ算の九九の表をつくるというプログラムをやっているのですが
自分なりにつくったのは
/* kuku.c */

int main(void)
{
int a, b;

int n = 9;

for(a = 1; a <= n; a = a + 1 ){
for(b = 1; b<=n; b = b + 1 ){
printf("%d\n",a*b);
}
printf("\n");
}





return 0;
} なのですが表になりません。おとといから始めたばかりなのでちんぷんかんぷんです。
いろいろとすいませんがご指導をお願いします。

884 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 01:28:22 ]

 一 個 ず つ や れ


885 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 01:32:20 ]
>883
初心者スレ逝け

886 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 01:35:55 ]
>>883
printf("%d\n",a*b); → printf("%3d",a*b);
がんばれ!

887 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 01:37:43 ]
>>883
処理の流れ、つまり「まずこれが起きて、次にこれが起きて……」という順番をたどりながら考えろ。
漠然と書いて走らせて出来なかったーわかんないーじゃいつまでも理解できん。

そしてここは基本的に「ある程度Cがわかってる人」が「標準C」というものについて少しつっこんだ質問をする場所だから
まずは初心者スレへ行くことをお勧めする。



888 名前:名無しさん@お腹いっぱい mailto:sage [2007/08/25(土) 01:45:23 ]
>886
ありがとうございます。できました。

889 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 11:17:58 ]
なんだよ>>871は無視かよ

890 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 12:49:26 ]
だって約数はその数自身も含まれるから
ありえないなんて事はありえませんもん

891 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 13:24:42 ]
まあ順番を問わなければもっと速いが

if(!n%a){
 if(n/a < a)break;
 printf("%d\n",a);
 if(n/a != a)printf("%d\n",n/a)
}

892 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 01:28:44 ]
!

893 名前:デフォルトの名無しさん [2007/09/03(月) 18:47:21 ]
bool a,b,c,d,e,f;
とか
int a,b,c,d,e,f;
みたいに並べて書いた変数を一気に同じ値で初期化する書き方ってありますか?
あったら教えてください。

894 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 18:55:12 ]
a = b = c = d = e = f = 0;

895 名前:デフォルトの名無しさん [2007/09/03(月) 18:57:51 ]
>>894
宣言と合わせて一行でかけませんか。

896 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 18:58:05 ]
>>893
static int a,b,c,d,e,f;
これで全部0で初期化される。
struct foo {
int a,b,c,d,e,f;
} foo = {0};
これでも全部0で初期化されるな。

まぁ、横着するなってことだ。

897 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 18:59:10 ]
int a,b,c,d,e,f;a = b = c = d = e = f = 0;




898 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 19:25:37 ]
>>897
ワロタ

899 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 19:29:01 ]
それほど面白くはない

900 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 19:59:10 ]
>>898
そんなので笑えるなんて君の人生楽しそうでうらやましいわ

901 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 20:07:29 ]
>>893
同じ値で初期化するような変数なら同じような扱いをするんだろう
配列で宣言しろ

902 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 16:40:24 ]
過疎ってますね
ビットシフトでも入れてみますか?

903 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 16:52:28 ]
聞くことがないならそれでよし
わざわざ増やさんでいいw

904 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 17:00:56 ]
ビットシフト入れたかったのに・・・

905 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 17:24:08 ]
じゃビットシフト絡みで

MMXの様に、4Byteの整数型を1Byte単位で飽和演算する方法を
昔どこかで見た気がするんだけど、どうやるんだっけ

0xFEFEFEFE に 各バイトに3を加算

0xFFFFFFFF

画像処理に使おうと思ったけど思い出せない

906 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 21:51:57 ]
MMX対応のプロセッサを使う。

907 名前:905 mailto:sage [2007/09/06(木) 21:56:42 ]
あった
www.emit.jp/prog/prog_b.html

しかし原理がよくわかんね



908 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 21:58:04 ]
if文を任意の位置でぬけるbreakとかcontinueみたいな
命令ってないですか?

909 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:00:49 ]
>>908
こんなイメージ?
if (...) {
...;
if (...) ifBreak;
...;
}
これくらいしか手がない気が。
if (...) {
...;
if (...) goto endIf;
...;
}
endIf:

910 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:01:58 ]
goto

911 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:15:29 ]
>>909-910
サンクス

912 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:38:47 ]
do {
if(...)
{
}
else if(...)
{
....
break;
}
} while(0)
とか

913 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 23:43:12 ]
俺がよく使うのは

if(...){
 do{

  ...

  if(...) break;

  ...

 }while(0);
}

914 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 00:12:33 ]
何その隠れgoto

915 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 00:51:35 ]
んな隠れgoto使うくらいなら、素直にgotoで書いた方が未だ見やすい希ガス。
そもそも、ロジックを整理すべきじゃないかとは思うが。

916 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 00:54:57 ]
if (...){

 ...

 if(!...){

  ...

 }
}

でいいんじゃないの?


917 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 01:11:34 ]
int i;

scanf("%d",&i);

while( i<1 || i>9999 )
 {
 printf("もう一度入力してください");
 scanf("%d",&i);
 }


iに数字じゃなく、aaaaなどの文字列を入れると”もう一度入力〜”がえんえんループ表示されてしまいます。
これを防ぐにはどうしたらいいのでしょうか?



918 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 01:14:43 ]
>>917
ja.wikipedia.org/wiki/Scanf#.E7.95.B0.E5.B8.B8.E3.81.AA.E5.85.A5.E5.8A.9B.E3.81.8C.E8.A1.8C.E3.82.8F.E3.82.8C.E3.81.9F.E6.99.82.E3.81.AE.E5.87.A6.E7.90.86

919 名前:917 [2007/09/07(金) 01:23:41 ]
>>918
ありがとうございます!

920 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 01:26:09 ]
>>918
その方法もどうかと思うな。
scanf()は行単位の処理じゃないのに、バッファクリアだけ行単位になってしまう。

921 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 01:34:26 ]
それではどうすればいいかってのは、このスレでガイシュツです。

922 名前:デフォルトの名無しさん [2007/09/07(金) 10:37:17 ]
typedef struct _st {
  char ** ppsz;
} st;

void freeif(st* pst) {
  for(int i = 0; i < 3; i++) {
    for(int j = 0; j < 2; j++) {
      if(*pst->ppsz != NULL) {
        free((void*)pst[i].ppsz[j]);
      }
    }
  }
  for(int i = 0; i < 3; i++) {
    if(pst->ppsz != NULL) {
      free((void*)pst[i].ppsz);
    }
  }
  if(pst != NULL) {
    free(pst);
  }
  return;
}

923 名前:デフォルトの名無しさん [2007/09/07(金) 10:38:36 ]

int main(void) {
  st* pst;
  // make struct object
  pst = (st*)malloc(3);
  if(pst == NULL) {
    printf("st is null\n");
  }
  else {
    for(int i = 0; i < 3; i++) {
    // make struct member
    pst[i].ppsz = (char**)malloc(2);
      for(int j = 0; j < 2; j++) {
        // make member area
        pst[i].ppsz[j] = (char*)malloc(10);
      }
    }
    // free memory
    freeif(pst);
  }
  return 0;
}


924 名前:デフォルトの名無しさん [2007/09/07(金) 10:40:37 ]
メモリの解放が上手くいきません。よろしくお願いします。

(正誤)
if(pst->ppsz != NULL) {  ← ×
if(pst[i].ppsz != NULL) { ← ○

925 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 11:03:01 ]
>>923
typedef struct _st {
  char ** ppsz;
} st;
static const char STRINGS[3][2][11] = {
  { "idx1:data1", "idx1:data2", },
  { "idx2:data1", "idx2:data2", },
  { "idx3:data1", "idx3:data2", },
};

void freeif(st* pst) {
  for(int i = 0; i < 3; i++) {
    for(int j = 0; j < 2; j++) {
      if(pst[i].ppsz[j] != NULL) {
        printf("pst[%d].ppsz[%d]:FREE\n", i, j);
        free((void*)pst[i].ppsz[j]);
      }
    }
  }
  for(int i = 0; i < 3; i++) {
    if(pst[i].ppsz != NULL) {
      printf("pst[%d].ppsz:FREE\n", i);
      free((void*)pst[i].ppsz);
    }
  }
  if(pst != NULL) {
    printf("pst:FREE\n");
    free(pst);
  }
  return;
}

926 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 11:03:55 ]

int main(void) {
  st* pst;
  // make struct object
  pst = (st*)malloc(3 * sizeof(st));
  if(pst == NULL) {
    printf("st is null\n");
  }
  else {
    for(int i = 0; i < 3; i++) {
      // make struct member
      pst[i].ppsz = (char**)malloc(2 * sizeof(char*));
      for(int j = 0; j < 2; j++) {
        // make member area
        pst[i].ppsz[j] = (char*)malloc(11 * sizeof(char));
        lstrcpy(pst[i].ppsz[j], STRINGS[i][j]);
      }
    }
    // debug
    printf("---------------------\n");
    for(int i = 0; i < 3; i++) {
      for(int j = 0; j < 2; j++) {
        printf("pst[%d].ppsz[%d] >> %s\n", i, j, pst[i].ppsz[j]);
      }
    }
    printf("---------------------\n");
    // free memory
    freeif(pst);
  }
  _getch();
  return 0;
}

927 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 11:31:28 ]
>>922-924
固定サイズなら無理にmalloc()/free()を使う必要はないと思うぞ。
typedef struct _st {
char ppsz[2][10];
} st;
でいいやん。




928 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 11:36:05 ]
メモリ動的確保/解放の練習とかじゃない?>>927

929 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 22:08:23 ]
C89 の規格票ってどこかで見れない?

930 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 22:38:18 ]
過去ログにURLが転がってたような。
印刷できないPDFでよければJISCのサイトで閲覧できる

931 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 23:14:17 ]
JISCって過去の規格票まで見れたっけ?
現在有効のX3010:2003はC99相当だけど。

932 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 23:19:57 ]
最新版以外はなかったことになるから。
ふつーはそれでも問題ないんだよ。非互換な改訂しなければ。
JIS漢字とかJIS漢字とかJIS漢字とか、あとJIS漢字とか

933 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 00:31:37 ]
そうなんだよな。それにJIS漢字も追加で。

934 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 00:53:09 ]
おいおい、JIS漢字を忘れちゃいないか?

935 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 01:01:56 ]
規格票

936 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 01:15:46 ]
無粋なヤツだな

937 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 02:38:12 ]
無粋



938 名前:デフォルトの名無しさん [2007/09/12(水) 03:48:23 ]
今日学校でプロトタイプ宣言に関する問題を習ったんですが
問題:再帰関数を使って、Xのn乗を求めるプログラムを作成しなさい
プロトタイプ宣言:int Power(int x,int n);

実行画面
文字列入力==>2
文字列入力==>0
値:1

文字列入力==>2
文字列入力==>3
値:8

文字列入力==>6
文字列入力==>4
値:1296

この問題だけどうしても判らなくて困っています^^;
何方かわかる方がいましたら教えてください



939 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 04:00:01 ]
>>938
int Power(int x,int n)
{
int i;
int sum = 1;
if(n == 0)
return 1;
else{
for(i = n; i > 0; i--)
sum *= x;
}
return sum;
}

940 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 04:04:51 ]
再帰じゃないじゃん

941 名前:939 mailto:sage [2007/09/12(水) 04:06:40 ]
あ、再帰だったんだ、出直してくる。

942 名前:939 mailto:sage [2007/09/12(水) 04:16:22 ]
再帰版
int Power(int x,int n)
{
if(n == 0)
return 1;
else
return x*Power(x,n-1);
}

943 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 04:21:11 ]
int Power(int x, int n)
{
if(x == 0 && n == 0) exit(1);
if(n < 0) return 0;
if(n == 0) return 1;
return Power(x, n - 1) * x;
}

944 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 06:51:52 ]
static int power(int x, int n, int v)
{
if (n < 0) return 0;
if (n == 0) return v;
return power(x, n - 1, x * v);
}
int Power(int x, int n) {return power(x, n, 1);}
これで末尾再帰で最適化が利いてループになるはず。

945 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 09:13:16 ]
特定の範囲の整数(例えば1〜10000)だけを入力させたいのですが、
fgets()使用時に桁溢れを完全に抑止することは可能ですか?

char *buf[10];
unsigned int value;
while(1)
{
fgets(buf, 10, stdin);

〜isdigit()とかで数値のみかを判定して、atoi()でvalueに格納してbreak〜

}
fprintf(stdout, "%u\n", value);

こんな感じで書いてるんですが、わざと入力を10桁以上にしたときに入力バッファに残ってしまってうまくいきません。
何かイイ方法あるでしょうか?(fflush(stdin)は無しで)

946 名前:945 mailto:sage [2007/09/13(木) 09:14:22 ]
>>945
× char *buf[10]
○ char buf[10]
orz

947 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 09:19:36 ]
>>945
fgets の後で
fscanf(stdin,"%*[0-9]");



948 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 11:18:05 ]
>>947
通常の入力をした場合(桁数が少ない場合)に入力待ちにならない?

949 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 11:22:42 ]
fflush(stdin)と置換可能な関数を自作するのは厳しい
とはいえ、fflush(stdin)は未定義
面倒くさいけど、fgetsで読み込んだbufに'\n'が有るかチェックして、
'\n'が無いなら'\n'が出てくるまで読み捨てることになる

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

int main(void)
{
  char buf[10];
  char *p;
  int c;
  while (fgets(buf, sizeof buf, stdin) != NULL) {
    if ((p = strchr(buf, '\n')) != NULL) {
      *p = '\0';
    }
    else {
      while ((c = fgetc(stdin)) != '\n' && c != EOF) {}
    }
    puts(buf);
  }
  return 0;
}


950 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 12:33:40 ]
もっといい方法あるのかもしれないけど、こんなんでどうかな

int get_unsigned(unsigned *v)
{
  char buf[16];
  char *p;
  int c;

  if (fgets(buf, sizeof buf, stdin) == NULL)
    return EOF;
  if (strchr(buf, '\n') == NULL)
    while ((c = fgetc(stdin)) != '\n' && c != EOF) {}
  *v = strtoul(buf, &p, 10);
  return *p;
}

int main(void)
{
  unsigned val;
  int end;

  while (printf(">>"), (end = get_unsigned(&val)) != EOF) {
    if (end == '\0' || isdigit(end)) printf("W:入力が切り捨てられました.\n");
    else if (end != '\n')      printf("W:不正文字がありました. '%c'\n", end);
    if (val < 1 || 10000 < val)   printf("W:入力範囲外です.\n");
    printf("<<%u\n", val);
  }
  return 0;
}

951 名前:945 mailto:sage [2007/09/13(木) 13:55:57 ]
>>947-950
ありがとうございます。おかげさまで解決しました。

952 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 14:16:48 ]
scanf("%*[^\n]%*c");なんてできなかったっけ?

953 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 14:20:57 ]
>>952
それだと、次の文字が\nだと[^\n]にマッチしないので、その時点でひっかかり
読み捨てることが出来ない。
scanf("%*[^\n]"); scanf("%*c");
ならおk

954 名前:デフォルトの名無しさん [2007/09/15(土) 02:24:20 ]
うーん勉強になるなあ。ここに書き込みしている人達て通算何年くらい勉強してきたんですか。
俺には凄過ぎっすよ。

955 名前:デフォルトの名無しさん [2007/09/15(土) 02:26:09 ]
名プログラマになる為に猛勉強だぜ。

956 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 09:32:53 ]
ここは知ったかばっかり

957 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:28:45 ]
知ったかな〜知ったかな〜うにゃうにゃ
はれってほれってひれんら〜



958 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 18:37:19 ]
>>957 迂闊にも笑ってしまいますた

959 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 17:05:01 ]
SHRT_MIN >= INT_MIN && SHRT_MAX <= INT_MAX 常に成り立つと思うのですが
sizeof(short) <= sizeof(int) は処理系に関係なく成り立ちますか?

960 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 17:07:56 ]
はい。

961 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 18:26:29 ]
ANSI C99準拠の標準ライブラリについて、詳しく説明しているサイトありませんか?
素直に本買ったほうがいいでしょうか?

962 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 18:35:59 ]
っ[JIS X 3010]

963 名前:961 mailto:sage [2007/09/18(火) 19:21:05 ]
>>962
ありがとう。でも高いねコレ…素直に本買います。

964 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 20:47:24 ]
つ[ttp://www.jisc.go.jp]

965 名前:デフォルトの名無しさん [2007/09/19(水) 15:50:54 ]
設計(PAD)でファイルを開いて読み込んでファイルの情報を構造体に格納するのって
どうやるか教えていただけませんか?

966 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 16:06:49 ]
たぶんCの話じゃないと思うぞ

967 名前:デフォルトの名無しさん [2007/09/19(水) 17:28:22 ]
今C言語の勉強をしていて、ファイルの情報を構造体に格納して
それをメモリに展開するってゆーのをやってまして



968 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 17:30:39 ]
fread

969 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 17:32:23 ]
そんなもんファイルにどういう形式でデータが記録されていて
格納する構造体はどんなものかによるとしか言えん

970 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 17:34:00 ]
PADは関係あるのか?

971 名前:デフォルトの名無しさん [2007/09/19(水) 17:34:18 ]
JIS X 3010-1993 を読むと

3.4
バイト
実行環境の基本文字集合の任意の要素を保持するために十分な大きさを持つデータ記憶域の単位。
1 バイト中のビット数は,処理系定義とする。
5.2.4.2.1
CHAR_BIT
ビットフィールドでない最小オブジェクト(バイト)におけるビット数
6.3.3.4
sizeof演算子の結果は,そのオペランドの(バイト数での)大きさとする。
sizeof(char) == 1

となっているのですが,ここから char 型オブジェクトのデータ記憶域での大きさは
1 バイトで 1 バイトは CHAR_BIT ビットと判断できるでしょうか?


972 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 17:36:24 ]
マジっすか。バイト=8bitだと信じてました。
int型が、その処理系で一番速く処理できるビット幅、というのは聞いたことありますが・・・

973 名前:967 [2007/09/19(水) 17:58:00 ]
今PADの最中なんです。
問題としてはファイルにある社員IDと氏名を構造体に格納し、
メモリに展開するというものです

974 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 18:06:04 ]
C言語の規格改定って今でも進められているんでしょうか?

975 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 18:47:35 ]
>>971
そう思って構わないはず。

>>973
常に8ビットを表す単位が必要なら、オクテットを使う。

976 名前:967 [2007/09/19(水) 19:03:57 ]
文字の長さが2-10で変化するってどゆ意味ですか?
そもそも文字の長さってなんですか?

977 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 19:09:43 ]
次スレテンプレ

【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 132



このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244

他の過去ログはここに
nssearch.hp.infoseek.co.jp/clang/
前スレ
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
pc11.2ch.net/test/read.cgi/tech/1170338926/


GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそこへさようなら。

【初心者歓迎】C/C++室 Ver.42【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1188748806/
C/C++の宿題を片付けます 95代目
pc11.2ch.net/test/read.cgi/tech/1187944110/



978 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 19:15:34 ]
GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
                                 ↓
GUIなどの標準Cではできない事の質問、ソース丸投げ、宿題、書籍 は

何か気になるから変えてくれたら嬉しい

979 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 19:58:51 ]
>>937
お前前も来たな
帰れ
いや
死ね

980 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 19:59:21 ]
>>973だった

981 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 20:22:18 ]
(char *)*char_list->c
という式が表す値は
(char *)型のポインタcが指しているデータ
(char *)型のデータ
のどっちなんでしょうか?

982 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 20:37:54 ]
演算子の優先順位から、(char *)(*(char_list->c))

983 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 20:47:49 ]
>>982
その式を見るとカッコ(キャスト)よりも*演算子のほうが優先されている
みたいなんですが、(1+2)*(3*3)のようなカッコとキャストとしてのカッコは
別物として扱われているんでしょうか?

984 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 20:52:45 ]
そりゃ意味からして別物だろうが

985 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 20:56:27 ]
ついでに言うと、関数呼出演算子の括弧も別物。

986 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:04:19 ]
>>985
全部一緒くたにして考えてました。orz
最後にもう一つ、

char c = 'a';
char *pc = &c
printf("%d\n", (int)*pc);

予想では上のコードは4バイト分の整数を出力すると思ったのに、
実際にやってみたらa一つ分の97しか出力しませんでした。
これは何故なんでしょうか?

987 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:06:35 ]
何を言ってるんだ、お前は



988 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:07:45 ]
*(int*)pc とでもやりたかったのか?

989 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:09:33 ]
>>986
何が言いたいか分からん。
97は2桁だろ。何が出て欲しいんだか。

990 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:11:57 ]
>>986
charだろうがintだろうが10進数で出力したら97だろ

991 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:13:08 ]
>>986
>4バイト分の整数
この部分を具体例をあげつつ詳細に説明してくれ

992 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:15:21 ]
char c = 'a';
char *pc = &c;
printf("%d\n", sizeof((int)*pc));

4バイト(intの大きさ)分の整数が出力されているってのはあってるぞ

993 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:16:26 ]
>>986
これでどうだ。
printf("%.8X\n", (unsigned int)(unsigned char)*pc);
ここにunsigned intへのキャスト演算子は不要だがサービスしておいた。

994 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 22:21:24 ]
>>973
PADって構造化フローチャートみたいなやつ?


995 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 22:24:57 ]
>>994
大学でやった記憶が

996 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 02:05:03 ]
99というのはISOの年度だからANSI C99というのはおかしくないか

997 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 02:12:12 ]
おかしいね。
ANSI C89
ISO C90
ISO C95(と言っていいのか)
ISO C99



998 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 08:33:04 ]
個人的にはC89とかC99の前にANSIとかISOとか付いてる時点でキモい。
まぁキモいだけで、だからどうしようってほどじゃないけど。

999 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 09:18:44 ]
埋め

1000 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 09:20:04 ]


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






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

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

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