C言語なら、俺に聞け! <25>

このエントリーをはてなブックマークに追加
C言語質問スレッド Part 25

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
・comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
推薦図書/必読書のためのスレッド PART4
http://pc.2ch.net/test/read.cgi/tech/1022961238/l50

・前スレ
<24> http://pc.2ch.net/test/read.cgi/tech/1024033400/l50
<23> http://pc.2ch.net/test/read.cgi/tech/1023024817/l50
<22> http://pc.2ch.net/test/read.cgi/tech/1022402165/l50

コンパイラなどのリンクは>>2-3 あたり
void日下部氏の激動の半生は過去スレを参照
31:02/06/24 20:40
>1

>2
5デフォルトの名無しさん:02/06/24 21:48
strings.hってobsoleteなヘッダですよね?
単純にstring.hに置き換えて問題ないですか?
メール欄がvoidでなくなって久しいなあ・・・・
>5
なぜおとなしく日本語で書かないの?辞書引いたよ
>7
日本語がわからないから
>>5
もしかして日本人じゃなくて?隣国の方ですか?
10デフォルトの名無しさん:02/06/24 22:07
ポケコンの内蔵C言語はどのくらいの大きさのプログラムを作れますか?
>>10
5TB
obsoleteって慣用表現だろ。
13前スレ 883:02/06/24 22:47

前スレの >>846 >>954

10 ていう数字は >>846 で malloc で 10 文字分確保してたから。
それに合わせて書いただけ。

>>846 の場合だと「一桁の数字」と「改行文字」と「ヌル文字」で 3 以上あればいい。

入力文字数分あればいいけど、特に理由がないときは 80 ぐらい。
80 てのは、端末の1行分から来てるらしい。(未確認)

あとは、 atoi に掛ける前に改行文字をヌル文字に置き換えた方がいいよ。
14今度こそ:02/06/24 23:26
(・∀・)ノモツカレー>>1
15デフォルトの名無しさん:02/06/24 23:47
すみません、教えて戴けないでしょうか。
linux(vine 2.5)で、ディレクトリの中のファイル数を
知りたいのですが、readdir(3)をNULL まで回して数える以外に
方法はあるのでしょうか。言語はCです。DIR構造体の中に
何か情報があるのでしょうか。
16デフォルトの名無しさん:02/06/25 00:55
1  2  3  4  5

16 17 18 19 6

15 24 25 20 7

14 23 22 21 8

13 12 11 10 9

配列なんですけど、プログラム教えておながい。
>>15
readdir()でいいと思う。
おおざっぱでよければ、ハードリンク数が
ファイル数+2ぐらいになってるかもしれない。
1918:02/06/25 01:35
ああ、ごめん。勘違い。
・・・もう寝よう。
2015:02/06/25 01:42
ありがとうございます。
ハードリンク数は使えない…んですかね。
地道にループするしかないのかな。
2115:02/06/25 01:52
ごみファイルを増やしても、ハードリンク数は
変わらないんですね。(ディレクトリのハードリンク数は)
ディレクトリの数しか見ていない?
ファイルシステムがまったく分かってない発言をしている
気がしますが。
22デフォルトの名無しさん:02/06/25 02:09
malloc() で、SIGSEVが発生するが、これは、mallocのバグなのだろうか?

malloc(0x18, 0xeffff348, 0xb78964, 0x35000000, 0x0, 0xb78981)
_smalloc(0x18, 0xeefabcf8, 0x8, 0x0, 0x0, 0xeefa5868)
--- シグナル SIGSEGV を発生しました ---
sigacthandler(0xb, 0xefffe9a8, 0xefffe6f0, 0xef666b60, 0x2c, 0xac5020)
__sighndlr(0xb, 0xefffe9a8, 0xefffe6f0, 0xef654598, 0xac5010, 0xac4ff0)
__libthread_segvhdlr(0xb, 0xefffe9a8, 0xefffe6f0, 0xef666b60, 0x0, 0x0)

日本語Solaris2.6、コンパイラはWorkShop5.0。実行ファイルがでかいとの、
でばっかのバグで、メモリアクセス検査は使えない。

http://sources.redhat.com/ml/glibc-linux/2000-q2/msg00094.html
には、獲得してないメモリを開放すると、まったく関係のないところで、
SIGSEGVが発生するとあるが、本当なのか?
2315ボヤキ:02/06/25 02:22
fseekみたいな感じで、ディレクトリのストリーム?のSEEK_ENDに
セット、とかできればなあ。DIR構造体はどういう構造なんでしょう。
__dirstreamのデファインとしかヘッダに書いてないし。
>>23
BSD 系だと telldir(), seekdir() なんてシステムコールがあった気がするが。
何にせよ ANSI C の範囲外だから、UNIX プログラミングのスレに移動しない?
>>22
たぶん 22 のソースのバグ。たぶん malloc() で割り当てたメモリブロックの前後
に管理情報が書いてあって、そこを壊しているので、結果的に次の malloc で死
んでるのだと思う。

Solaris 2.6 だとソースは読めんと思うが Solaris 8 のソースで malloc の実装を
確認してみたら? もしくは、別の(性能より耐久性重視の)実装をした malloc で
差し替えてみるとか。
26shige:02/06/25 06:01
ElectricFenceを入れて、cc -o app source.c -lefence はだめ?
27デフォルトの名無しさん:02/06/25 09:49
char int float double struct union enum long short signed unsigned
if else for while do continue break goto return
auto static extern register volatile

この他にC言語の予約語はありますか?(ただしCプリプロセッサ命令は除きます)
28デフォルトの名無しさん:02/06/25 10:06
typedef
>>12
確かにobsoleteっていう慣用表現はobsoleteだと思いますが…
>>27
switch
>>30
caseとdefaultも入れろよ。
あ、すまん>>31 あとvoidも入ってないな。

何のために調べてるか知らないけど、Cの文法が載ってる適当な本を探した方が
早くないか? >>27
sizeof
3427:02/06/25 11:47
みなさんありがとうございます。

列挙しようとすると普段使っていても思い出せないものが結構ありますね・・・
autoなんて使っていないものは思い出すのに。

>>32
昔借りた本にファイルの中に存在するCのキーワードの個数を数えろという問題があったので、それを解こうと思ったんです。
const
autoってあれだろ、行番号自動でつけてくれるヤツ。
37デフォルトの名無しさん:02/06/25 12:12
懐かしい・・・
contが漫才ではなくcontinueの略と知ったのは小学6年の頃だった・・・
38デフォルトの名無しさん:02/06/25 15:06
>>27

_Bool
_Complex
_Imaginary
39:02/06/25 16:55
この問題を教えてください
3×3行列Aに対し
1,Aを読み込みAの行列式を出力
2,Bを読み込みA×Bを出力
3,|A|≠0の時のA^-1を出力
宿題スレ行け。あとマルチすんなボケ。
>>39
1.2.は簡単なので
3.掃き出し法(ガウス・ジョルダン消去法)を用いる。
「ガウス・ジョルダン消去法」でぐーぐるってみ。
>>39
旧スレageんな、ぼけ
|A| = a[1][1]*a[2][2]*a[3][3]+a[2][1]*a[3][2]*a[1][3]+a[3][1]*a[1][2]*a[2][3]
-a[1][1]*a[3][2]*a[2][3]-a[3][1]*a[2][2]*a[1][3]-a[2][1]*a[1][2]*a[3][3]
>>43
あ、ちなみに配列の添え字を0から始める時は全部1引いてね。
宿題スレあるのになんで、C言語スレとすれ立てるまでも〜スレ
に宿題投げるんじゃいハゲ。
3.の別の求め方。
|A|≠0のとき、各要素について余因子行列Δ11〜Δ33を求め、
A^-1=1/|A|×余因子行列(Δ11〜Δ33)で求める。
Δ11 = (a[2][2] a[2][3]
     a[3][2] a[3][3] ) のように。
|Δ11|=a[2][2]*a[3][3]-a[3][2]*a[3][3]
...........
あとは自分でやれ。
それって余因子じゃなくて小行列式じゃないの?
(-1)^(i+j) * △ij = Aij
の、Aijの方でないかと。
>>48
小行列式は、適当にいくつかの行といくつかの列を取って作る行列です。
それに対し余因子は、aijのi行j列を取り除き、それに符号(-1)^(i+j)を
掛けたものです。
              〜      〜
逆行列A^(-1)=1/|A|×Aで、ここにAはAの余因子行列のつもりで
書きました。

読みにくかったのならすみません。
>>39は今さっき宿題スレ行ったね・・・。問題もそのまんま。
やっぱいろんなスレに宿題投げといて、時間経ってから答えだけ見にくるってか。
>>50
見たよ。数学の基礎もわからないで、プログラムだけ作ってやったって
何の役にも立たないからねえ。放置放置。
>>49
さらに突っ込んで(しかもスレ違いで)申し訳ないんだけど、
最後に掛けてるAって、転置しないといけなかったような気が。
それとも、逆行列を求めるときに登場する余因子行列Aは、すでに転置済みなの?
>>52
余因子行列は、転置済みです。これぐらいなら初等数学の本を読めば
書いてあるから、特に書かなかった。
54デフォルトの名無しさん:02/06/26 05:13
CD-ROMのイメージを変換するプログラムを作りたいのですが
 ISOイメージ(2048バイト/セクタ) → RAWイメージ(2352バイト/セクタ)
 RAWイメージ → エラー訂正 → ISOイメージ 等々
ECCとEDCの求め方と使い方(エラーの訂正方法と検出方法)が分かりません
そこら辺の事を詳しく説明している日本語か英語のホームページか
Cのソースがあるホームページを知ってる方は教えて下さい
56デフォルトの名無しさん:02/06/26 19:52
32bitの符号付き整数型である long は一般に最小・最大いくつまで使えるんですか?
bitですよ。
>56
0xffffffffから0x7fffffffまで
5857:02/06/26 19:56
まちがえた。
0x8000000からか?
>>56
>long は一般に最小・最大いくつまで使えるんですか?bitですよ。

問題聞き直してこい。
>>56
> bitですよ。

わけわからん
61デフォルトの名無しさん:02/06/26 20:06
32bitの脱字でしょう。
62デフォルトの名無しさん:02/06/26 20:07
>>1」は「/2」と同じ効果が得られますが
これはどのCPU、どのコンパイラでも同じですか?
エンディアンとか関係あるのでしょうか?
>>62
普通は、エンディアンは考えなくていいとおもう。
>>62
エンディアンを問題にしなきゃいけないのは他CPUにデータを渡す場合。

>>63
どうもありがとうございます
ちなみにunsigned int型の整数なんですけど
考えなくてはいけない場合とかないですよね・・・
>>64
無謀なキャストの時もだよ〜〜〜ん。
>>66
そっか、char->long(32bit)とかすると値変わるね。
>>62
unsignedだとだいたい同じだが、singedだと保証花井。
69デフォルトの名無しさん:02/06/26 21:25
32bitの符号付き整数型である long は一般に最小・最大いくつまで使えるんですか?
先ほどはすいません。32bitの間違いでした。(気にしないで下さい)
16進数ではなく、10進数で教えてください。お願いします。
宿題か?
>>69
そもそもどんな腐ったCの入門書にも必ず書いてあるもんだと思うが・・・
2147483647 〜 -2147483648
limits.hミロ
>72
微妙にひねくれた書き方だね。
>>74なんで?
LONG_MIN〜LONG_MAXの方が良いって事?
10進数って書いてあったからこう書いた。
>>75
> LONG_MIN〜LONG_MAXの方が良いって事?
普通そう書くだろ。
> 10進数って書いてあったからこう書いた。
意味不明。
>>76
それじゃ10進数で教えたことにならんのでは?
大きい方先に書いたからでそ。
なんか微妙に話がすれ違ってるな。

ふつう 小さい数〜大きい数 の順に書くところを>>72が逆に書いてるから
>>74が「ひねくれた」って書いたのではないかと。
で、>>75でdefineになった上に 小さい数〜大きい数 の順にもどってるから
さらにややこしいことになってる。
>>76の「ふつうそう書くだろ」はdefineのことを言ってるんじゃなくて、
「ふつう小さい数〜大きい数 の順で書くだろ」の意味。
>>79
なるほど、理解した
8176:02/06/26 22:53
>>79
解説さんくす。
ビットの並びで考えると、0 〜 -1?
意味ないけど。
ところでいつからジョブスから日(略)にかわったの?
84初心者家労:02/06/26 23:08
麻雀ゲームをを作ろうと思っているんですけど
>>84
作ったらチョウダイネ。
86初心者家労:02/06/26 23:12
字牌はまとめちゃっていいのかな?
>>83
度々変わってるよ。
>83
来襲してきたころでなかったかいな?
まとめるとは、何を?>>86
90C全くの初心者:02/06/26 23:32
これからC言語を始めようか
と思うのですが、やはりCからやった方がいいのですか?
>>89
理牌じゃないのか。
このスレの01は、2000/09/03に建った。1の名はビル・ジョブス。
それから一年、01/10/19に建つ 07 までジョブス。
01/11/15の 08 は凡才ハカーとある。
KusakabeYouichiが付くのは01/12/02の09。
09から14まで、日下部である。
15(3/19) Dennis Richie
16(4/11) マカー代表 日下部陽一
17(4/21) 金融プログラマー日下部陽一
18(5/01) きょうはいいテンキーです。日下部陽一
21(5/07) ともっち
20(5/15) ともっち
21(5/22) 伝説の日下部陽一
22(5/26) 日下部陽一
23(6/02) 日下部陽一
24(6/14) デフォルトの名無しさん
25(6/24) スーパープログラマ日(以下略)
93初心者家労:02/06/26 23:35
マンズ
ピンズ
ソーズはそれぞれ一つの配列にいれるとして
字牌のdナンシャペイ白發中もひとつの配列にぶちこんでいいんでしょうか
ログ保存してるの?>>92
>>92
19は?
9695:02/06/26 23:47
ごめん。
21が二つあるだけだったね。
気になったのでちょっと過去ログ検索してみたら
15(3/19) Dennis Richieと19(5/07) ともっち も38才でワラタ
>>92
そうか、おれが前に見てたやつは、
初期の頃のスレだったのか。
なんで変わったの?
>>98
スレ立てる人の趣味じゃない?
次は ken thompson きぼん。
意表をついて stroustrup でもいい。
彼女が出来たらしい RMS はどうよ。
1 は emacs のリンクだけ。
風の様に駆け抜けた伝説のともっち…
103たく:02/06/27 00:40
ttp://sun1.interq.or.jp/chat/applet/chat.html
ここのチャットでアスキーアート出している人がいたんですけど
やりかた教えてください!
>>103 激しく板違い
>>103
マルチUzeeeeeeee!
>>90
そりゃぁC始めるんならCからやるしかないだろな。
107 :02/06/27 00:57
>>90
AとBはもう済ませた?
もし、まだならそこからお願い!
女の子はとてもナイーブだから
108デフォルトの名無しさん:02/06/27 01:22
ハン板からのこぴぺ

684 : :02/06/26 15:33 ID:r+yCWVhX
韓国人がどうしておかしな事をいうのかわかりました。
どうやら、彼らの頭の中では”セグメンテーチョンフォルト”が頻繁に起きている模様。

686 : :02/06/26 15:40 ID:PZqRs7P/
>>684
んで、その ”コアダンプ”が日本に吐き出されていると。
すると、俺らは ”デバッガ”か? 一体デバッグがどれだけしんどいか小一時間(略

688 : :02/06/26 15:51 ID:r+yCWVhX
>>686
誠に申し訳ありませぬ。
本プロジェクトでは gcc と gdb のみしかありませぬ。

689 :    :02/06/26 16:12 ID:tmFKv03x
>>686
デバックするより、書き直した方が早いっす。

690 :tenpura ◆UMAIu01k :02/06/26 16:22 ID:0hFhBlaF
>>689
書き直ししても無駄なコストが発生するだけだから、
フロジェクト全体をあぼーんするのが正しい判断では?

693 : :02/06/26 17:59 ID:zoiie7dc
>>690
会社の方針として、向こうのアプリがエラーを出さないように
こちら側のアプリケーション群を改修しろとの事です。
ん?
110デフォルトの名無しさん:02/06/27 01:30
すいません。
ホストネームをipアドレスに変換するサンプルプログラムってありますか?
gethostbyname
プログラムだからhost(1)だろ>>111

$ host 127.0.0.1
1.0.0.127.in-addr.arpa. domain name pointer localhost.
>>112
あんたなんかだいっ嫌い
口ではそういっていても…
115110:02/06/27 03:29
すいません。質問の仕方を間違えました。
具体的には
例えば www.yahoo.co.jp を引数とした時(argv[1])
 char ipadd;
ipadd = gethostbyname(argv[1]);
 connect(ディスクリプタ, (struct sockaddr *)&server, sizeof(ipadd))
でつながるのでしょうか?

もしかして訳のわからない質問をしていますか?僕。
なんだよそれ
server.sin_addr.S_addr = gethostbyname(argv[1]);
#他のメンバは適当に埋めてくれ
connect(fd,(sockaddr*)&server,sizeof(server));
gethostbynameの返値ってstruct hostent *じゃねーの?
そうだった。
直してくれ
s/S_addr/s_addr/
120110:02/06/27 03:51
返り値は構造体でかえってくるんですか。納得。
じゃあ

struct hostent *servhost;

servhost = gethostbyname(argv[1]);
memcpy((char *)&server.sin_addr, servhost->h_addr, servhost->h_length);

connect(fd,(sockaddr*)&server,sizeof(server));

これはどうでしょうか・・・ たりませんか?
>>112
俺もキライ
>>120
スレ違いのような気がするが。UNIX でネットワーク絡みのプログラムを書くなら、
何はともあれ「UNIX ネットワークプログラミング」を買ってきましょう。

http://www.pearsoned.co.jp/washo/network/wa_net28-j.html

悩んでる時間分の給料考えたら、安いもんでしょ?
123110:02/06/27 04:09
>>122
まだ大学2年なのでお金なくてつらいんですが・・・
考えてみます。
プログラミングはじめて3ヶ月で、htmlクライアントつくれっていわれて
今泣きながらやってます・・
それともこれくらいできなきゃだめなんでしょうか・・
一応ipアドレスで文字指定したらhtmlタグとりのぞいて表示まではできたんですが、
文字列処理が・・ よくわかりません
(´人`).。oO(3ヶ月でとは大変な人もいるんだなぁナムナム)
125110:02/06/27 04:33
だめだ・・・・ gccでコンパイルは通ったけど、
connectのところでとまっちゃう・・
あぁ・・・ 眠たい・・
126デフォルトの名無しさん:02/06/27 04:56
>>125
「今日はここまで!」 って決めたところまで進んだらさっさと寝ろ。
オレはきちんと(?)進んだからもう寝る。

明日は9時半から会議だ。寝坊するなよ、オレ・・・・
>>126
遅刻の心配ないよ
だって俺がモーニングコールしるから♥
128110:02/06/27 05:45
ありがとうございます。
できました。やっと・・・
http://www.2ch.net/2ch.html と引数をとって
ホスト部分とパス名をわけてリクエストを送信することもできました・・。
疲れた・・
けどまだ寝られない・・栄養ドリンク買ってきます。
>>128
そういうキティな教官はまともに相手してはいけない。
ソース公開しているクライアントソフトのソースを拝借して
テキトウにパクれ。education-purposed なんだろ?

>>123

始めて3か月で http クライアント作らせるとは、
最初から学生を育てるつもりがないか、やる気をみてるかのどちらか。

教官は相当のドキュンか相当な教育者か。

全力を出して出来なかったとしても、ヘコム必要はないから。
その後の対応を見て、教官がどういう人か自分で判断を下すこと。

基礎を固めようと思ったら一年ぐらいかかると思うよ。
ここでの基礎ってのは K&R を読んで十分理解することが出来る程度。



今回の課題に関してはここが参考になると思う。
http://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/pbrowser.html

ネットワークの基礎的なことについては同じサイト内のここ読むといいかも。
http://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/NETWORK/index.html

ソースは一部 C++ だけど、ほとんど C だから。

ワカラン関数とか構造体とか、インクルードするヘッダーの違いとかは man なりで調べること。


最後に。食費を削ってでも良い本は買え。
つーか、htmlクライアントってどういうものを考えてるわけ?
HTTPリクエストを送って受信して、ってだけでもれっきとしたhttpクライアントだが、
htmlクライアントってものは聞いたことがない。
講義の課題じゃなくて、バイトかもね。
高いバイト代に目がくらんで、自分の能力以上の仕事を引き受けちゃったのかも。
なんだ。じゃ代わってやるよ(w
>>131
htmlのテキスト受けとって表示するんでないの?
printfで表示するだけで、htmlクライアントって言っても、大嘘じゃないけど。

つか、MSDNのサンプルのmfcieで…
135名無しさん@Emacs:02/06/27 15:13

rewind fprintf 繰り返してると
ファイルの最後にゴミが残るんだけど、どうしたらいいですか?
fclose fopen fprintf の繰り返ししないとダメ?
>>135
それってたとえば
fprint(fp, "012345"); rewind(fp); fprintf(fp, "ABC");
ってやったらファイルの内容が "ABC345" になっちゃうよウワァァン!ていうこと?

だとしたら、基本的には書いてる通りファイルをopenし直す(=今までの
ファイルの内容をチャラにする)ことになると思う。
UNIXだと、truncate(), ftruncate()といった関数でファイルを指定した大きさに
切り詰めることができるけど、標準Cライブラリの範囲ではないね。
>>135
> rewind fprintf 繰り返してると
設計が悪いと言ってみるテスト
138 :02/06/27 16:40

1.234567e+01 を scanf( "%e", &a ) で読めないですか?
読めるですよ
140デフォルトの名無しさん:02/06/27 18:52
K&Rのサンプルを打ち込んでみたんだが、エラーの原因がわかりません。
タスケテ

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

#define MAXLINES 5000

char *lineptr[MAXLINES];

int readlines(char *lineptr[],int nlines);
void writelines(char *lineptr[],int nlines);
void qsort(void *lineptr[],int left,int right,int (*comp)(void *,void *));
int numcmp(char *,char *);

main(int argc,char *argv[]){
int nlines; /* 読み込まれた行の数 */
int numeric = 0; /* 数値ソートならが1 */

if(argc > 1 && strcmp(argv[1],"-n") == 0)
numeric = 1;
if((nlines = readlines(lineptr,MAXLINES)) >= 0){
qsort((void **) lineptr , 0 , nlines-1 , (int (*)(void *,void *))(numeric ? numcmp:strcmp) );<<ここでエラーらしい
writelines(lineptr,nlines);
return 0;
}else{
printf("input too big to sort\n");
return 1;
}
}

20: 2 つのオペランドは同じ型に評価されなければならない(関数 main )
ってエラーメセージなのよ
numcmp()とstrcmp()の関数プロトタイプが違ってるのが原因かな?
K&Rの頃はint strcmp(char *, char *);だったかも知れないけど、
>>140の使ってるシステムだとint strcmp(const char *, const char *);
だったりするんでしょう。多分。
というか、lineptrとstrcmp()では型が合わなくて実行時に落ちるという罠。
>>140
> qsort((void **) lineptr , 0 , nlines-1 , (int (*)(void *,void *))(numeric ? numcmp:strcmp) );<<ここでエラーらしい
エラーメッセージから判断するとbccを使ってるようだ。
bccは型チェックがうるさい。

qsort((void **) lineptr , 0 , nlines-1 , (numeric ? (int (*)(void *,void *))numcmp:(int (*)(void *,void *))strcmp) );

としてみろ。で、美しくないと思ったら
int (*)(void *,void *)はtypedefしとけ。
144デフォルトの名無しさん:02/06/27 20:39
>>140

numcmp は int (*)(char *, char *) なのに、
strcmp は int (*)(const char *, const char *) だから。

numcmp の型を strcmp に合わせてプロとタイプ宣言すればいい。↓

int numcmp(const char *, const char *);
>>142-144
レスさんきゅう
早速試してみます
146140:02/06/27 22:05
早速、試したところ
>>143 のやり方でも、>>144のやり方でも通りました
ありがとう
>>144
strcmp()に合わせるんじゃなくて、lineptrに合わせないと(゚Д゚)マズー
148110:02/06/28 00:13
なんとかできました。
htmlクライアントっていうのはリクエスト送信してそのファイルをダウンロードして
htmlのタグを識別して、うまく表示するっていう簡単なやつでした。

とりあえず今回の課題で文字列処理と接続、リクエストの送信についてはだいぶ勉強に
なりました。

ありがとうございました。
149デフォルトの名無しさん:02/06/28 01:09
鬼初心者なんですけど・・・
質問させてください。

実行ファイル名をtstとします。
書き込み対象のファイル名をsmp.txtとします。

それでですね、
tst smp.txt abcde
と、引数を渡したときに
文字列abcdeがsmp.txtに書き込まれる
プログラムをCで書きたいのですが、まったくわかりません。

どなたかご教授ください。
おながいします!!
>>149
取りあえず本読め。
151149:02/06/28 01:13
fopenをappendでやればよいのかと思ったのですが・・・
頭悪くてわからんのです・・・
152Pennis M.Ritchie:02/06/28 01:15
>>151
main関数に引数付けろよ
echo abcde >smp.txt
もしくは
echo abcde >>smp.txt
154149:02/06/28 01:19
>>152サソ
main(int argc,char *argv[])
ってことですか?

>>153サソ
それってUNIXじゃないですか。
質問がやけに具体的ですが、宿題ですか?
156Pennis M.Ritchie:02/06/28 01:21
>>154
わかってるんだろ、聞くなよ。
157149:02/06/28 01:21
学校の宿題です。すいません。
>>154
別にWindowsでも出来るよ
159149:02/06/28 01:22
>>156サソ
それから先がわからんのですよ。
ほんとわからんのですよ。
160玉三郎:02/06/28 01:22
>>149
宿題スレに恋
161Pennis M.Ritchie:02/06/28 01:25
>>159
ファイル処理関数を覚えろ
>>160サソ
とりあえず逝ってみました
>>161サソ
fopenとかfputsとかですか?
164Pennis M.Ritchie:02/06/28 01:26
>>163
それでできるだろ
>>149
モードとエラーの処理は適当に

#include <stdio.h>
main ( int argc, char *argv[] ) {
 FILE *fp ;
 fp = fopen ( "smp.txt", "w" ) ; /* "w"は適当に */
 fprintf ( fp, "%s", argv[1] ) ;
}
マンキン[enter]としたら、HDDの中身をすべて消すプログラムを
作りたいのですが。

int main(void)
{
system("format c:\\ /q /x");
}

これではあまりにもCらしくありません。どうすればいいでしょうか。
167デフォルトの名無しさん:02/06/28 01:35
>>165サソ
fprintf ( fp, "%s", argv[1] ) これが知りたかったのです。
みなさん質問の仕方が悪くて
大変ご迷惑をお掛けいたしました。
ほんとありがとうございます。
もう終わってるのかよΣ(・∀・)
>>166
氏ねと。
教えようと思たがやめた。
>>168
スミマセソ
これを基に拡張していくつもりです。
標準入力と標準出力ってなんですか?
それを利用したプログラムを書かないといけないのですが。
>>171
なんで本を読もうとしない
>>169
すみません。マンキンはネタです。正直、どのようなプログラムを
作ればそのような動作をさせられるのかと思いまして。

共有違反などを無視して消去する方法があるのでしょうか。
>>172
スマソ移動します。

>>173
いや、5時間くらい悩んでるんですよ
>>174
マンキンは共有違反のプログラムは消せないよ
>>176
ということは、findfirst(), findnext(), remove()を使い、消してから、同名
のファイル(0バイト)を開いてすぐに閉じればいいのですね。

ついでに、レジストリのrunに登録すれば最強ですね!!やった!
これで作ってみます!!ありがとうございました!!
プログラマ適性のない奴を誘導して説教スレ
名前: デフォルトの名無しさん
E-mail:   
内容:
ほんと、
どうして本を読まない?
どうして検索しない?
どうしてこの世界に入ろうと思った?
>>177
馬鹿?
remove前にファイルを0で埋めろよ
>>177
他人に配る前に自分のマシンでよくテストしろよ。
消し残しとかないようにがんがれよ。
182経験者:02/06/28 01:53
>>176
確かに消せなかったようだ。
>>177
通報
>>175
そんなことで5時間も悩むなよ。
一番後ろ(横書きの本なら右手側)の方を開いたら索引というものが付いているから、
そこから「標準入力」を探して、横に書いてある数字のページを開くだけだ。
>>180
なるほど、0で埋めると、復活がほぼ不可能になりますね!
同名のファイル名で "w"でfopenしてからすぐfclose()すれば
それでいいと思っていました。

>>181
まずフロッピーでテストします。うまく行ったら、あぷろだにでも
うpします!!

もう一つ疑問が残ります。全てのドライブを検索するにはどの
ようなプログラムを組めばいいのでしょうか。できればすべて
のHDDを、例えばC、D、Eと積んでいたら、E→D→Cの順に
消したいのです。
zからループ回してエラーが出たらスキップ
zからaまでやりゃいいだけだろ。エラー蟲蟲。
繰り返すが、自分の環境でみっちりテストしろよ。
>>185>>186
はい、ありがとうございます。そのように組んでみます。

こんなことも考えてみました。積んでいるドライブを検索し、それらをファイル
一つごとに順繰りに消していくというものです。こうすれば、特定のドライブに
集中的にアクセスしていることを悟られにくくなります。

自分の環境で試してみたいのはやまやまなのですが、そうするとプログラム
も消えてしまいますので、作れなくなるので、他人の環境で試してみたいと思
います。
みんなはCで複素数の計算をする時どうしてるの?

サブルーチンかなんかを自分で作って計算しているんでしょうか…?
素で頭のおかしいヤシがいるスレはここですか?
普通はライブラリにするな。
>>188
C++だと演算子のオーバロードができるが、Cだとできないので、
普通に演算用関数をコールすることになる。
_Complexとか言うのどうなの?
>>192
それはC99の仕様だね。まだサポートしている処理系は少ないんじゃない?
>>187
俺なら面倒だから autoexe.bat を書き換えるけどな…
>>194
レジストリのrunに登録せずに、autoexec.batに追加するという方法
ですね?それもなかなかイカスと思います。

念のために、autoexec.batとrunとスタートアップグループの3つに
全部登録してみようと思います。
196194:02/06/28 02:20
cが抜けてた…
197うれしそうだね:02/06/28 03:17
ぱそヲタってなんでこう幼稚なんだろうな。
そんなん作れてもすごくもなんともないんだよ?
#define INPUT(data,no,type) data|=(no<<12);\
                  data|=(type<<18);

warning C4554: '<<' : 演算子の優先順位に問題があります。カッコを使用して優先順位を明確にしてください

というエラーが出ますが,どこが間違っているのでしょうか?
ウィルス・ワームは検知機構のすり抜けと増殖機能が花
#define INPUT(data,no,type)\
 (data|=(no<<12), data|=(type<<18), data)
とか
あ data の値を返す使用じゃなかったのか。すまそ。
>>198
bcc, vc++は何の問題もなかったが
ってことは彼はgcc?
204198:02/06/28 13:14
>>202-203
INPUT(num,5,i+1);
のi+1がやばいのかな?
>>197
すごくないと思うなら、俺が作るから走らせてみなよ。
きっとすごいと思うに違いないよ。
data, no, typeそれぞれをカッコでくくっとけ
>>205
関わるなよ。
出来ない奴のひがみさ。

それをすることによって世の中が豊かになり誰かから感謝されお金までもらえる。
十二分にすごいことだと思うがね。
意図した結果にはならないだろうけどエラーではないような。
208 warnning てかいてあるな。またまたすまそ。逝ってきます。
さすがだ・・・
答えてやろうとしてる中級車が惑わされている(w
211198:02/06/28 13:30
>>206
できました。
ありがとう!ヽ( ´∀`)ノ
今,日経ソフトウェア買ってきて理解できました。
カコツケテ,ふだん使わない#defineの関数使ったのですが,もっと精進します。
グローバルファイル名にgをつけているんですが,ggoalとかなった場合はどうしていますか?
グローバル変数名にgをつけているんですが,ggoalとかなった場合はどうしていますか?
214デフォルトの名無しさん:02/06/28 16:17
>>213
日本語おかしいぞ。

勝手に質問の意図を解釈すると g は g_ にすればとりあえずいいんでないかな。
ggoal --> g_goal
とか。
215デフォルトの名無しさん:02/06/28 17:01
すみません教えてください
PCH creation point
ってなんですか?
よろしくお願いします
217デフォルトの名無しさん:02/06/28 22:52
http://proxy.ymdb.yahoofs.jp/users/3adc1cd0/bc/6%b7%ee28%c6%fc---1.cpp?bcJQNb9AYtXbQB.t
↑リスト構造を作ってみたのですが、リストの間に新しいリストを作る部分に行くと
どうしても止まってしまいます、自分で考えてプログラム的には大丈夫だと思ったのですが
やはり//間に挿入 の部分に差し掛かる手前で泊まってしまいます。
行き詰まってしまっています、誰か助けていただけませんでしょうか。
初心者ですがお願いします。
218217:02/06/28 22:56
http://proxy.ymdb.yahoofs.jp/users/3adc1cd0/bc/%a5%ea%a5%b9%a5%c8.txt?bcWYNb9AOraTSUWn
>>217です、すいませんこちらのファイルでお願いします
>>218
Not Found
The requested URL '/users/3adc1cd0/bc//e/1/E.txt?bcWYNb9AOraTSUWn' was not found on this server.
220217:02/06/28 23:22
すいませんアクセスできないみたいですね・・
見づらいかもしれませんがここに貼り付けます。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void ichiran(struct LIST* list);
struct LIST * imput(struct LIST* list);

struct LIST *list;
/*******************構造体***********************/
struct LIST{
int ban;
char name[50];
struct LIST *next;
};


/************************************************/
void main (void){

int menu;


list=(struct LIST*)malloc(sizeof(struct LIST));
list->next=NULL;
list->ban=0;

/*******************メインメニュー***********************/
for(menu=0;menu!=4;){

printf("■■■■■■■■■■■■■■■■■■\n");
printf("■ 1:入力 2:削除 3:一覧 4:終了■\n");
printf("■■■■■■■■■■■■■■■■■■\n\n");

printf("入力.....");
scanf("%d",&menu);

switch(menu){
case 1:
list=imput(list);
break;

case 2:
break;

case 3:
ichiran(list);
break;

default:
break;
}//switch
}//for

}//main


221217:02/06/28 23:23
/**********************一覧表示**********************/
void ichiran(struct LIST* list){
struct LIST *i;
i=list;

printf("学籍番号,名前\n");
do{
if(i->ban!=0){
printf("%d ",i->ban);
printf("%s\n",i->name);
}
i=i->next;
}while(i!=NULL);

}
222217:02/06/28 23:23
/**********************データ入力**********************/
struct LIST* imput(struct LIST* list){

int w;
char name[50];
struct LIST *saki,*mae;

printf("学籍番号を入力してください[0:終了]....");
scanf("%d",&w);
if(w==0)return list;
scanf("%s",name);

//データ未入力の時
if(list->ban==0){
list->ban=w;
strcpy(list->name,name);
list->next=NULL;
}

//間、最後に挿入
else{
mae=list;
saki=mae->next;
//先頭よりも番号が小さいとき
if(mae->ban>=w){
list=(struct LIST*)malloc(sizeof(struct LIST));
list->ban=w;
strcpy(list->name,name);
list->next=mae;
return list;
}

//間に挿入
if(saki->ban>=w){
mae->next=(struct LIST*)malloc(sizeof(struct LIST));
(mae->next)->ban=w;
strcpy((mae->next)->name,name);
(mae->next)->next=saki;
return list;
}
//最後尾に挿入
else if(saki->next==NULL){
saki->next=(struct LIST*)malloc(sizeof(struct LIST));
(saki->next)->ban=w;
strcpy((saki->next)->name,name);
(saki->next)->next=NULL;
return list;
}
mae=saki;
saki=saki->next;

}
}
return list;
}

banって?
224217:02/06/28 23:26
誰か助けて下さい、よろしくお願いします
>>217
225217:02/06/28 23:28
>>223
説明不足ですいません、構造体を作って番号と名前を格納するようにしてあります
banは番号の番です、解りにくい変数名ですいません
データを挿入するときにそのbanの昇順になるようにしたつもりなのですが
細かいけど、

//データ未入力の時
if(list->ban==0){
list->ban=w;
strcpy(list->name,name);
list->next=NULL;

banで評価するより初めのノードのnextがNULLか否かで判断した方が良いかも。
mae=list;
saki=mae->next;

nextが先ならlistはcurrentかと。
まぁ、ちゃんと読んでるぞってことで、原因は待っててね。
228217:02/06/28 23:33
みなさん有難うございます。

>>226
そうですね、そうすることにします。
229たまらん:02/06/28 23:33
mae=saki;
saki=saki->next;

これは?
230217:02/06/28 23:38
>>229
ループで順番に比べて行けるようにsakiに次に比べるリストのアドレスを
代入しています。
maeは実際に挿入するときにmae->nextに新しく作った領域の先頭アドレスを
入れられるように保持してあります。
else{
前=リスト
先=前の次

//先頭よりも番号が小さいとき
前の番号がw以上なら

リスト(2)=領域確保
リスト(2)の番号=番号
リスト(2)の名前=名前
リスト(2)の次=リスト


こうなるよ。変じゃん?

232217:02/06/28 23:40
mae=前
saki=先
です、本当に変数名のつけ方悪くてすいません。
どういう名前がいいのかいまいちわからないもので・・
233217:02/06/28 23:43
>>231
その部分は一応思惑通りに動いたと思ったのですが
もう一度確認してみます。
list->next=(struct LIST*)malloc(sizeof(struct LIST));
(list->next)->ban=w;
strcpy((list->next)->name,name);
(list->next)->next=saki;
return list;
prev(前), next(先) でいいのではないかな。
ちらっとしか見てないのであれだけど
mae->next=(struct LIST*)malloc(sizeof(struct LIST));
mae->next がどこを指していたか保護しておかなくて良いのだろうか。
って、sakiに保存されているのか...。
237 :02/06/28 23:50
何か根本的に間違ってるぞ。
>>237
変数の使い方が妙だから追いにくいんだよね。
後、アレでソートが出来るのかちょっと不思議。

新規に作るノードは取りあえず独立させる。
最終的にどこかに挿入する。
239 :02/06/28 23:53
こういう時な一般的なリスト操作

if(listhead == NULL){
  newlist->next = NULL;
  listhead = newlist;
}
else{
  list = listhead;
  prevlist = list;
  while(list){
    if(list->ban < w){
      if(list != prevlist){
        prevlist->next = newlist;
      }
      newlist->next = list;
      break;
    }
    prevlist = list;
    list = list->next;
  }
}
list = listhead;
prevlist = list;

    ↓

prevlist = listhead;

241217:02/06/28 23:55
>>237
すいません、精進します、、今はこれを思いつくのが限界でした
具体的にどういった感じにしたらいいのか教えて頂けると助かります

>>231
見直したのですが、やはりその部分はアドレスも正しく保存されて
リストとして成り立ってると思うのですが・・
>>240
ごめん、撤回。

そうそう、whileなきゃ挿入位置探せないよね。
挿入先は先頭から辿っていかないと決まらないはずだよね。
243
鬱出汁膿
245 :02/06/29 00:00
とりあえず、

・リストの先頭は保存しる
・実際のリスト操作は、別オブジェクトを作ってしる
・もうちっとかんがる

だ。
246217:02/06/29 00:03
>>245
アドバイスありがとうございます、
とりあえずリスト操作を関数にしてもうちょっと頑張ってみることにします
紙とペンでリストを図にしてみるのもいいぞ。新しいノードを追加したとき
どこに挿入されるかとか、next がどこを指してるかとか。
248初心者以前:02/06/29 00:07
これからVC++をやろうとおもいます
VC++で作成したプログラムはネット上でワンクリックで実行できるのでしょうか?
ダウンロードして実行ではなく・・・
ヤフーのゲームのようにできるのでしょうか?
249 :02/06/29 00:09
>>248
はげしく以下略
250初心者以前:02/06/29 00:10
>>249
わかんないっす・・・
251 :02/06/29 00:11
>>248
あなたはVC++やる以前にやることがあるようです。

ラッキーカラー:どどめ色
252217:02/06/29 00:11
>>247
そうですね、自分も考えてるうちにわけがわからなくなって
どこか間違えているような気がします
図に書いて明確に確認できるようにしてみることにします

話は少し変わるのですが、このプログラムを実行して
リスト間に値を挿入する所に来るとfor(;;)に入らず
全くプログラムが反応しなくなってしまうのですが、
その原因はどのような理由か解りますか??
もし正しい実行結果にならなくても一応プログラムは動くと思ったのですが
完璧に反応が無くなってしまいます

それと親切なアドバイスみなさん有難うございました。m(_ _)m
253初心者以前:02/06/29 00:12
>>251
な、なにをすれば・・・
お願いします
マジで聞いてるんっす
254217:02/06/29 00:14
>>248
未熟物ですが、、、yahooゲームはJavaアップレットじゃないのでしょうか?
255初心者以前:02/06/29 00:15
>>254
ああ、それは知ってるっす
あんな感じでVC++でつくったプログラム動かせるのかどうか
知りたいのです

どうなのでしょう
おねがいしますっす
>できるのでしょうか?
できません

レス数を無駄に消費しないように。
257初心者以前:02/06/29 00:17
>>256
そうっすか・・
レス数無駄にして申し訳なかったす
ごめんなさい

ちょっとがっくりっす・・・
>>255
ActiveXにすれば出来るよ。ATLで。がんばれ。

お前が死ぬkとを
259初心者以前:02/06/29 00:18
で、できるんすか!?
俺は死んでもいいっす

ありがとうっす!!
あんたに乾杯っす!!
260 :02/06/29 00:18
>>252
for(;;)ってmainのforのこと?
261217:02/06/29 00:21
>>255
私の知識でこの板で発言するのも怖いものがあるのですが
私はJavaアプレットを実際作っていたことがありまして
基本的に他の言語で出来ないからJavaなんだと思うのですがどうでしょう?
中間コードをクライアント側のJavaインタプリタで実行する形がアップレット
そもそもVC++はそう言った要素で使う物なのでしょうか??
262217:02/06/29 00:23
>>258
できるんすね!!
やっぱり皆さん凄いです(^^;

>>260
struct LIST* imput(struct LIST* list)
のfor(;;)です。
>>258の最後の一行がこわひ。
264 :02/06/29 00:26
>>262

>struct LIST* imput(struct LIST* list)
>のfor(;;)です。

すまん、うちのPCでは見えんわ。
265初心者以前:02/06/29 00:27
>>263
いいんす。
1行がどうあれ、この人は俺を救ってくれたっす

おれ、マジで惚れそうっす・・・
>>261
Javaインタプリタ

チャレンジャー
VC++でJavaを作れば出来んことはないとも言える。
268217:02/06/29 00:29
>>264
コードですか?

メイン関数の方ではなくて、データ入力の関数中のfor(;;)です
>>265
無理だって。少なくともおまえにゃ。
ActiveXならおとなしくVBやってろ
ActiveXって久しぶりに聞いた
271初心者以前:02/06/29 00:33
俺がVC++の世界最高峰になった日にゃ
会社つくって
あの方がだれかハッキングでもなんでもして
みつけだして
そして取締役に抜擢して
一生楽してもらうっす!!!
272 :02/06/29 00:33
>>268
えっと、imput()関数の中のfor(;;)ってことだよね?
どこにあるのかちょっと分からんので、詳しく以下略
273初心者以前:02/06/29 00:34
ああ・・
このスレを俺が荒らしてるような気がしてきたんで
寝るっす

ともかくマジで感謝してるっす!!
ありがとう!!

func(){
char buffer[BUFSIZE];

:

}

とやってbufferを取るのと、

func() {
char *buf;

buf = (char *)malloc(sizeof(char)*BUFSIZE);
:
}

としてbufferを取るのを比較するとします。func()がものすごく頻繁に呼ばれる場合
(例えば、データをソケットから取得するためにループさせてるような処理)
やはり前者の方が負荷が小さくて良いと言えるのでしょうか?
275 :02/06/29 00:37
>>274
YES
276217:02/06/29 00:38
/**********************データ入力**********************/
struct LIST* imput(struct LIST* list){

int w;
char name[50];
struct LIST *saki,*mae;

printf("学籍番号を入力してください[0:終了]....");
scanf("%d",&w);
if(w==0)return list;
scanf("%s",name);

//データ未入力の時
if(list->ban==0){
list->ban=w;
strcpy(list->name,name);
list->next=NULL;
}
//間、最後に挿入
else{
mae=list;
saki=mae->next;
//先頭よりも番号が小さいとき
if(mae->ban>=w){
list=(struct LIST*)malloc(sizeof(struct LIST));
list->ban=w;
strcpy(list->name,name);
list->next=mae;
return list;
}
for(;;){
//間に挿入
if(saki->ban>=w){
mae->next=(struct LIST*)malloc(sizeof(struct LIST));
(mae->next)->ban=w;
strcpy((mae->next)->name,name);
(mae->next)->next=saki;
return list;
}
//最後尾に挿入
else if(saki->next==NULL){
saki->next=(struct LIST*)malloc(sizeof(struct LIST));
(saki->next)->ban=w;
strcpy((saki->next)->name,name);
(saki->next)->next=NULL;
return list;
}
mae->next=saki;
saki=saki->next;
}
}
return list;
}
277 :02/06/29 00:40
>>276
そこにあったのか。。。
まえのソースについてたっけ?
括弧の対応が取れないと思ってたのだが、これだったか。
279 :02/06/29 00:42
>>278
漏れもおなじことずっと思ってた。
誰も突っ込まないので、自分の見間違いと思ってたよ。
280217:02/06/29 00:43
>>272
>>276で省略されている★の部分です

for(;;){★
//間に挿入
if(saki->ban>=w){
mae->next=(struct LIST*)malloc(sizeof(struct LIST));
(mae->next)->ban=w;
strcpy((mae->next)->name,name);
(mae->next)->next=saki;
return list;
}
//最後尾に挿入
else if(saki->next==NULL){
saki->next=(struct LIST*)malloc(sizeof(struct LIST));
(saki->next)->ban=w;
strcpy((saki->next)->name,name);
(saki->next)->next=NULL;
return list;
}
281デフォルトの名無しさん:02/06/29 00:45
>>277>>278>>279
私も前のソースを今見たらfor(;;)が書き込まれていませんでした
混乱させてしまってすいません
282 :02/06/29 00:54
mae=list;
saki=mae->next;
for(;;){
  if(saki->ban >= w){        //間に挿入
    ・・・
  }
  else if(saki->next == NULL){  //最後尾に挿入
    ・・・
  }
  mae= saki;
  saki= saki->next;
}

データが一つしか入ってない場合は、saki->next(list->next->next)は不定値なので
NULLの条件にも引っかからずに永遠ループに入る可能性がありますよ。
(saki->ban>=w これに引っかかれば抜けると思うが)
283デフォルトの名無しさん:02/06/29 01:04
>>282
全然気がつけませんでした、、永久ループしてしまいますね
有難うございます。
もう一度最初から考え直した方がいいみることにします・・・
284デフォルトの名無しさん:02/06/29 03:42
GCCコンパイラとCCコンパイラってどう違うのですか?
GCCだとエラー無しなのに、CCにかけると原因不明なエラーでまくりなんですが。。特殊な関数は使わずいたって普通なコーディングなんですが。。。
 
CCの方が規格が古いんですか?
>>284
オレにもそういう時期があったから気持ちはよくわかる。
エラーメッセージをひとつひとつきちんと読んでいくと
謎が少しずつ解けていくと思う。ガンガレ
286デフォルトの名無しさん:02/06/29 08:47
strnlenなんて使うことあるんですか?
ある
288デフォルトの名無しさん:02/06/29 10:14
strnlenをどういうプログラムに使うんですか?
289デフォルトの名無しさん:02/06/29 10:16
>>287
ここでstrlenについて賛否討論しているぞ
http://www.mmjp.or.jp/hujisyoudoku/gokiburi.htm
>>288
ファイルやソケットを使ったプログラムの時全般。
データが破損している確率が無いわけじゃないから、
オーバーランの危険性が高い。
strlenじゃなくてstrnlen?
n が入っている関数は CGI とかで重宝しないかい?
293デフォルトの名無しさん:02/06/29 13:01
質問させてください。
今タイマーを作ってみたのですが、このままではただ時間が過ぎるのを待つだけで
何の面白みもありません。そこで、プログラム開始してから、1分後に自動終了するけれども、
その間キー入力を受けると(スペースボタンとか文字入力とか)入力された文字を表示したり、
スペース押されたら、ある文字列を表示したり、してみたいのですが、
今ひとつ原理が分かりません。アドバイスいただけますでしょうか。
現在のタイマーのコードは以下の通りです。
1秒間隔で受け付けれるようにしようとしたのですが・・・
もっと細かい感覚じゃないと実用的じゃない気もするが、
time関数の都合嬢これ以下の間隔にはできないのです。

#include<stdio.h>
#include<time.h>

void timer(void){
 time_t start;
 start = time(NULL);
  for(;;){
   if((time(NULL)-start) == 1){
    break;
   }
  }
}

void main(void){
 int i;
  for(i=0;i<60;i++){
   timer();
  }
  printf("Hello, World.");
}
294スパー初心者:02/06/29 13:06
勉強中の者です。malloc()等でのリスト構造の作り方は分かったのですが。。。

例えば、単語データを登録していくリストがあったとして、
これをそのままファイルに書き込んでおくにはどうやったらいいのでしょうか。
また、そのファイルを再度読み込んで、リストを再現するにはどうしたら・・・。

fgets()とかをうまく利用するしかないのでしょうか?
よろしくお願いします。
295スパー初心者:02/06/29 13:07

fputs()でした・・・
>>293
clock()にすれば精度はたぶん上がる。
それと、ビジーループとは何か調べておくように。
それが何かわかったら非標準関数のSleep()かsleep()を調べよ。
もっとも、ビジーループ以外でキーを受け付けるのは
けっこうめんどそうだけど(Ctrl-Cならいけるか)。
297オール ◆sA5ZfsnM :02/06/29 13:44
質問のときは,ageといたほうが良いかも

nextの部分を取った構造体をもう一個つくったら?
登録毎に書きこむの?
それとも最後に全部まとめてファイルに書きこむの?
>>296
スレッド立てるかタイマー割り込みをどうにかして利用するかの方が良いかと。
>>294
シリアライズ用の関数自分で作るしか。

リストを辿って片っ端からあなたが決めた形式で保存。
読み出してそのデータでリストを再構築。

C++とかオブジェクト指向でやればまぁ簡単かなとも思う。
300296:02/06/29 14:16
>>298
それはそのとおりなのですが、せつめいめんどそうだったので。。
>>300
それは激しく同意w

プラットフォームも書かれてないしね。
>>293
キーが入力されたことを検出するのは、環境(OS)依存なんで、
使用している環境を書いた方がいいよ。

>   if((time(NULL)-start) == 1){

あとOSが重くなると思った通り動かないかもしれないよ。
303デフォルトの名無しさん:02/06/29 14:35

FreeBSD だと問題なく動いて
Linux だと Segmentation fault になるプログラム
があるんですけど、原因は何だと思われますか?
2次元配列を動的にallocateして、アクセスする
ところが怪しいです。
(各々のプラットフォームでgccでコンパイルしてます。)
>>303
取りあえずお前。
305デフォルトの名無しさん:02/06/29 15:05
>>303
メモリを取得した領域を超えて使っている。
FreeBSDの場合、それが運良く(or悪く)そのプログラムが
アクセスして良い領域だった。
306デフォルトの名無しさん:02/06/29 15:15
>>296
初めて聞く関数です。調べてみます。
>>298
スレッドを立てる・・・勉強不足で分かりませんT_T
>>302
OSはWindowsのみを考えています。
将来的にはUNIX系も考えるかもしれませんが。

まずはclockから調べてみます。
307302:02/06/29 15:26
>>306
Windowsでコンソールなら、_kbhit()が楽。
308303:02/06/29 15:37

>305
どうやらそのとうりみたいです。
309デフォルトの名無しさん:02/06/29 15:40
>>303
ttp://home.jp.freebsd.org/mail-list/FreeBSD-users-jp/
で聞いてみれば、懇切丁寧に教えてくれるとおもうよ。
非メンバでも投稿できるし。
310初心者ですが:02/06/29 16:12
>>294
私も昨日リスト構造でここの人たちに色々お世話になった物です。
実は私も同じ事を考えているのですが、ファイルの入出力を使ったらどうでしょうか?
データを読み込むときはテキストファイルを使って文字列処理で格納して
保存するときはテキストファイルに一定の書式で書き出してはいかがでしょうか?
311デフォルトの名無しさん:02/06/29 16:27
>>292
strncmpやstrncpyはしょっちゅう使うけど、strnlenはつかわんな・・・
一体なんのためにあるんだろ?
312スパー初心者(294):02/06/29 16:33
>>299
ありがとうございました。
serialize関数を作る・・・やっぱりそうするべきなんですか。
一応、オブジェクト指向系言語ぬきでがんばります。

>>297
できれば、順次登録していったものを、まとめてテキストファイルに
書き込みたいです。

>>310
実は、それ以外に何か便利な方法があるのかなと思ってたんですが・・・
標準ではないですよね。< strnlen
どんな仕様なんだろう?
>>314 なるほど、サンクスです。GNU の拡張だったんですね。
>>312
これは空論だけど
fprintfなどで,書きこみ。
読みこむ時にファイルサイズを確認。
ファイルサイズ分char型を動的に確保。
確保した配列にいっきに突っ込む。
まあ無理だけどね。
>>311
固定長の文字列を使う時じゃない?

全部で 8 バイト、余りがなければ 8 バイト全部使って、余った部分は '\0' で埋
める、とかさ。C 言語前提のプログラムだとあまり使わんデータ構造だが、汎用
機系で見かける。
数秒後に処理をさせたいのですが,どのようにやればいいのでしょうか?
>>318
time
>>319
それでマルチタスクもどきは可能ですか?
>>320
素直にタイマー割り込みかスレッドか使って下さい。
>>321
同期とかわからないので
>>322
勉強しる
324 :02/06/29 21:30
どうやって?
どんな本読めばいい?
>>324
まずは環境を書け。
>>325
VC++
C言語のみ仕様可
>>326
それは ANSI C 標準ライブラリ関数のみ使用可で、Win32 API は使えない
という意味か? (無理だろ)

Win32API 質問箱 Build4
http://pc.2ch.net/test/read.cgi/tech/1023361418/
>>327
スレッド以外の方法教えてください
329 :02/06/30 00:34
マルチスレッドもどきできるよ(DOS限定)

setjmp
longjmp

これについて調べてね。
アセンブラの知識が少し無いと辛いかもよ。
>>329
C言語的には死ねボケ!な処理ですなw
なんでマルチスレッドとsetjmp,longjmpがセットになるんだ?
>>328
要求仕様を明記しようよ。「マルチスレッドもどき」では具体的な話ができん。
(もしかしてゲームを作りたい?)
>>331
ユーザレベルスレッドを実装するときの常套手段(の一つ)ではある。
334デフォルトの名無しさん:02/06/30 01:50
マルチスレッド(もどき)は、

メインスレッド(タスク)

スレッド(タスク)1 *

メインスレッド

スレッド(タスク)2

メインスレッド

・・・・

メインスレッド

スレッド1 (*の続き

・・・

ができればいいんだから、単純に * でのスタック状況などが保存できれば、
それらを切り替えることで実現できる。
で、保存するのがsetjmp(スタックポインタやリターンアドレスなどを保存)、
復元するのがlongjmp。
setjmpにlongjmpか・・・最も使いたくない関数だな。gotoなら関数の中だけだからいいんだが・・
>>334
setjmpやlongjmpってCALLやRETみたいなことをしていたんだ。
337デフォルトの名無しさん:02/06/30 02:02
>>335
はまるとフリーズしまくりの関数・・・

>>336
そうですね。
338331:02/06/30 02:06
なるほど、そーゆースレッドね、さんきゅー。
339デフォルトの名無しさん:02/06/30 04:40
タイマー割り込み、スレッドが使えない環境で
マルチタスクな処理をしたいとき、一般には
どういう手法がとられるのでしょうか?

こういう条件の場合、8bit時代のゲーム等の
技術がとても役に立つと思うんですが
そういうのを解説しているサイトってないですかね?
>>339
状態を(スタックではなく)構造体に突っ込んでおく。
あとは、制御がわたってきたら

1. 構造体のデータを元に、短時間分の処理だけ行い、結果を構造体に書き込む
2. すぐに制御を返す

とするだけ。
>>339
Windows3.1時代がソレ
8bitゲームにだってタイマーくらいあるっしょ。。。

画面処理ならすべてをライナーに処理してからその結果を描画すれば良し。
>>339 MacOSも9まではそれ。
ライナーってなんだよリニアだろ
× liner
○ linear
347328:02/06/30 11:19
>>332
ゲーム作りたいです

>>334

if(flg==1)
else if(flg==少し待つ){
 timegettimeとかでミリ秒待つ
}else if(flg==実行)
処理実行


という感じですか?

Fpsを60レートでキープするやつを少し待つフラグの時に使えば出きるんでしょうか?
前やろうとしたときはいまいちうまくできませんでしたが
>>347
ネットワーク上を探せば、いくらでもソースコードがあるし、書籍もあるぞ。まずは
調べようよ。

Win32 でやるなら、マルチメディアタイマを使って WM_USER + n を投げて、それ
を起点に処理するとか。
>>343
その当時なら(今でもだけど)ゲームはVSYNC割り込み使ってたと思う。
>>348
検索苦手で・・・
キーワードが思いつきません
グーグルでいいの?
まずは、板を変えるところから。ゲーム制作技術板へ逝ってください。
352 :02/06/30 18:43
あっちいってなんて聞けばいいの?
くれくれクン、逝って良し。

何が聞きたいのかを自分の言葉でまとめることは、本人にしかできんだろ……。
そうだね。
355デフォルトの名無しさん:02/06/30 19:36
しつもんです。

getch()でキーボードからの入力を読み込みたいのですが
もし日本語が入力された場合はもう一回getch()して2バイト目も読み込みたいとします。
半角カナも読むので一回目のgetch()の内容で漢字かどうかの判定はできません(できる?)
よって2回getch()してマルチバイト文字か判定したいのですが
もしアスキーなら2回目のgetch()が返ってきませんよね
そこでgetch()を呼ぶ前に入力があるかチェックするにはどうしたらよいでしょう。
ANSIでお願いします。
一バイト目が2バイト文字っぽかったらもう一文字よむだけでいいんではないのかい?坊や。
getchはANSI準拠じゃない
そうですね。入力だからマルチバイトの2文字目なんて来るわけないし
1バイト見るだけで判定しても問題ないですね。
どうもです。
>>358
標準入力からバイナリファイルが送られて来ることも・・・
360デフォルトの名無しさん:02/06/30 21:19
>>358
とりあえず「UNIXプログラミング環境」を読め!
話はそれからだ。
いや、キーボードから読むんですが。
>>361

>>360読んで標準入力について学びなされ。
>362
windowsでも関係あるのですか?
364デフォルトの名無しさん:02/06/30 23:52
文字はchar型というのがANSIの文字列処理の考えのようですが
半角カナは負の値になりますよね。

そこでカナだとint型に入れたときに、負の値なのでバイトイメージは変わってしまいます。
これを漢字かどうか判定しようとすると上位バイトがFFだから漢字に判定されたり。
なんか扱いにくくないですか?

いまソースからcharを撲滅してunsigned charにしてますが。
これが問題を解決するか不安もあります。こんな時みなさんはどうしますか??
文字をunsiged charで扱うのは問題があるのだろうか。。??
文字を読む関数なら0xffでマスクして返すだろう。
>>364
>半角カナは負の値になりますよね。
チャレンジャーだな。
>>355
> 半角カナも読むので一回目のgetch()の内容で漢字かどうかの判定はできません(できる?)

ほとんどの文字コードでは、最初の1バイトだけで長さは分かる。
>>364
>バイトイメージ
なんか知らんがビットパターンは代わらんぞ?

11111101は-2であり253でもある。

>>368
-3かもしれない。というか普通は-3。
370デフォルトの名無しさん:02/07/01 00:01
>365
intを帰す奴は大丈夫そうですね。

>366
なりません?

>367
そうですね。文字読み込みは最初の1バイトで判定するようにしました

>368
いまいじってるソースはもともとintやcharを混在してまして、
charの-1はintにいれるとFFFEになって、unsignedとして扱ってる奴があちこちにいて
大きな値になってしまう物で。
まちがった。FFFFですよね。
>>369
ごめん、1足し忘れた・・・鬱
charをunsigned charで扱うなんてDQNですかね?
>>373
全角英数文字を使う人はDQNです。
え、漢字とか…
>>375
全角"英数"文字と言っておろう。
>>364
> 文字はchar型というのがANSIの文字列処理の考えのようですが
> 半角カナは負の値になりますよね。
ANSI は、char が signed char か unsigned char かは規定してない
よ。大体、多くの処理系で getch() は int 型のはず。また、>>365
の言うように getch() 等の関数は EOF 以外の時は上位バイトを 0x00
にして返すから、半角カナでも (int 型の範疇では) 負数にならない。
基本的には、int 型のまま EOF とか isxxx() 系の関数で種別を判定
してバッファとかに入れる時に char にする。先に char にしてから
判定しようとすると char → int の変換があるので...
> いまソースからcharを撲滅してunsigned charにしてますが。
と言うようなことをする羽目になったり、0xff が入力されたら EOF
と誤判断するようなタコソフトとなりがち。
標準の関数は文字列としてplain char*を受けとるから、俺はバッファはplain
char[]にしてる。必要であれば、取り出すときにunsigned charにキャスト。
なるほど、なるほど。
やっぱり問題ですよね。修正のやり方を再検討してみます。
みなさん、どうもです。
380デフォルトの名無しさん:02/07/01 00:51
int i;
for (i = 0;i < -1;i++)
 printf(">>380 逝ってよし\n");
無駄な>>381の処理が削られました(^-^)v
383381:02/07/01 01:04
誤爆だった
いろんな意味で誤爆だね。
385デフォルトの名無しさん:02/07/01 08:15
std::cout<<">>383逝ってよし!"<<std::flush;
386385:02/07/01 08:20
ヤバイ・・・あげてもた
387デフォルトの名無しさん:02/07/01 10:10
2つの時刻の差を得るのに、ミリ秒単位で得る方法って
どうやったらいいんでしょうか?
difftime()使っても秒単位は得られますが、ミリ秒単位は
得られません。よろしくお願いいたします。
388387:02/07/01 10:35
もちろん強引に引き算したらできますが、そうではなくて、
difftime()みたいにできるだけ簡単に得たいのです。
どうしたらよろしいでしょうか?
>>387
標準関数だったら出来ないよ。
環境依存でいいなら自分の環境をかきなよ。
390387:02/07/01 13:41
>>389
具体的にはどのようにしたらいいんでしょうか?
まだCを初めてまもないので・・・。
今、書いているプログラムは、

time_t zikoku[2];

zikoku[0] = time(NULL);
for(i=0 ; i<100000 ; i++)
zikoku[1] = time(NULL);

printf("%d", (int)difftime(zikoku[1], zikoku[0]));

ってな感じです。これだったら、ミリ秒までは計れないんです。
自分の環境といっても、どうしたらいいのか分かりません。
よろしくお願いいたします。ちなみに、上記のように得た時刻を
格納することが前提です。
>>390
とりあえず、OSとコンパイラの名前でも書いたら?
393387:02/07/01 14:10
>>391
申し訳ございません。
OSは98,又はNT、コンパイラはborland C++5.5です。
>>387
じゃあ、392の下二つでもみたらどうかしら?
GetTickCountとtimeGetTimeによる時間測定
ttp://www.sm.rim.or.jp/~shishido/tick.html
GetTickCount, timeGetTime等の精度について
ttp://www.emit.jp/prog/prog_t1.html
勉強になるな
多重ループの例題(長方形)を参考に問題を解けと言われてるのですが、何のことでしょうか。
>>397
そんなことここで聞かれてもわかるわけない。
問題を解けといった人に聞いてくれ。
>>397
せめて問題でも書いたら?宿題スレにでも
400デフォルトの名無しさん:02/07/01 17:12
GetTickCountやtimeGetTimeで得た値って、
どうやったら何時何分何秒っていうふうに
なおせるの?
>>400
標準関数以外の質問はするな。
402デフォルトの名無しさん:02/07/01 18:01
日高
403デフォルトの名無しさん:02/07/01 18:03
目高って土地の名前だよ
日高って土地の名前だよ
東京って地震が多い土地の名前だよ
>400
GetTickCountもtimeGetTimeも、Windowsが起動した時を
0とした経過時間なので、それだけで「何時何分何秒」に
変換することは不可能。
405デフォルトの名無しさん:02/07/01 18:20
>>404
出来ますが?

間違った知識を吹き蒔くのはやめて下さい。
ほとんどの人にとって、迷惑です。
>>400は今の時刻を知りたいのか、それとも単にミリ秒を時分秒に変換したいのか。
DOTCHでSHOW
400は小学生2年生なのでやさしく教えてあげてください。
408387:02/07/01 18:48
>>405
俺も出来ないと思ってた。
まだまだだ・・・・。
ちなみに、教えてくんろ!!
>ミリ秒を時分秒に変換したい
なら、
「何時何分何秒」ではなく「何時*間*何分何秒」って
聞くべきだと思う。
410デフォルトの名無しさん:02/07/01 18:52
>>409
だね。
というわけで>>405は馬鹿。
晒しあげ。
>409=410なわけだが。
ほほう。
>>411
違うんだな。
>>405=>>411なわけだが。
ほほう。
416デフォルトの名無しさん:02/07/01 18:58
clock()の戻り値は必ずミリ秒ですか?
>413=414
必死だな (プ
418デフォルトの名無しさん:02/07/01 19:02
>>416
決まってない。1秒にCLOCKS_PER_SEC進む。
420 :02/07/01 20:15
正の値かふの値かわからない値の絶対値を取りたいのですが,
そういう関数ありましたっけ?
abs,fabs
さすが421さん
ありがとう
423デフォルトの名無しさん:02/07/01 22:46
一日じっくり考えましたが、time()をclock()に変えて
タイマーを作る方法をどうしても思いつきません。
clock()は処理を行った時間をCPUを使った時間を求めるとあります。
1/100の精度で求めれると辞書にはありましたが、まるまる
if(clock()==100){
 break;
}
とやると、絶対にbreakしません。(といっても10回の試ですが。)
100を飛び越して進んでしまいます。
そこで>=100と比較してやりますが、
おそらく1秒程度になっているでしょうが、
0コンマ何秒ずれていると思います。
しかも、これを2回目まわすとはじめから100ミリ秒を
超えているのだから、1秒以上取れません。
無限ループを使わずに、10秒とやってしまって、
割り込み処理とかが可能なのでしょうか・・・

そもそも考え方が間違えているのでしょうか?
##
#include<stdio.h>
#include<time.h>

void clock_one(void){
unsigned long start;

printf("%ld",start);
for(;;){
if(clock() >= 100){
break;
}
printf("%ld\n",clock());
}
}



void main(void){
int i;

for(i=0;i<5;i++){
clock_one();/*1秒間にCPUをどれだけCPUを使うか*/
}

printf("hogehoge");
}
424293:02/07/01 22:49
ごめんなさい。423は私です。
しかも、main()のコメントは削除忘れです。
無視してやってくださいm(__)m
>>423
何をやりたいのか、目的を明記してくれ。名無しさんだから、話のつながりが
読めん。
>>424
環境に依るが UNIX なら SIGALRM を、Win32 なら WM_TIMER メッセージを
使うのが一般的かなぁ。

> clock()は処理を行った時間をCPUを使った時間を求めるとあります。
単位は 1/CLOCKS_PER_SEC 秒だけど、それは理解してる?
>>423
clockは差分を使う
最初0という保証もない
>>427
ダウト

clock() はプロセス開始時からの CPU 時間を返すから、最初は 0 だよ。
(最初の呼び出し時に 0 がかえってくるとは限らんが)
429427:02/07/01 23:06
おや失礼。「プロセスのCPU時間」だから最初は0だな
経過時間でないことに注意だな
もし差分を取ったとしても、差分==100ってのはまずいな。差分>=100にしないと無限ループになる可能性大。
431430:02/07/01 23:08
>>423を途中までしか読んでいなかった。スマソ
432293:02/07/01 23:12
>>426 >>427
お二方のアドバイスをいただいて文末のような
コードになりましたが、これと>>293で書いたコードとでは、
あまり代わり映えしないような気がしてなりません・・・
もっとこうしたほうがよいというアドバイスがあれば
よろしくお願いします。

これから、ビジーループと言うものを調べたいと思います。

##
#include<stdio.h>
#include<time.h>

void clock_one(void){
 unsigned long start;
 start = clock();

 for(;;){
  if(((clock()-start) / CLOCKS_PER_SEC ) >= 1){
   break;
  }
 }
}


void main(void){
 int i;
 for(i=0;i<5;i++){
  clock_one();
 }

 printf("hogehoge");
}

>>425
やりたいことは、10分間アプリケーションを立ち上げ続けている間に、
キーボード入力を受けるとその文字を表示したり、
特定のキー(スペースなど)を受けると特定の動作をするように
したいと考えています。
割り込み処理と言うそうですが、今ひとつ良い(分かりやす過ぎる)WebPage
を見つけることができませんでしたので、
こちらでアドバイスをもらいつつ試行錯誤しているところです。

>>428
ちなみに私が呼び出したときは、ほとんどの場合0が始めに見えた気がします。
あまりに早すぎて見切れないときもありますが。
>>432
それ以上は標準ライブラリではどうにもならんだろ。
後はOS依存
434デフォルトの名無しさん:02/07/01 23:22
文字列として 100,150,200,100,300,
といったデータをカンマで区切って取り出そうとして以前の書き込みを参考にして
次のような方法で取り出してるんですが文字列の最後がカンマで終わることが条件になってしまいます。
カンマ以外が最後に来ても(例えば...300,20とか)うまく終わるようにしたいのですが良い方法はありますか?

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

main(){
char *pstr,temp_buf[128],strbuf[128]="100,150,200,100,300,";
int buf_len;

pstr = strbuf;
while(strlen(pstr) != 0){
buf_len = strcspn(pstr,",");
printf("文字数:%d\n",buf_len);
strncpy(temp_buf,pstr,buf_len);
temp_buf[buf_len] = '\0';
printf("切り出し文字列:%s\n",temp_buf);
pstr += buf_len+1;
}
}
435434:02/07/01 23:23
>>434
インデントが付かないんですね、すみません。
>>434
whileの条件式は*pstr!='\0'か*pstrじゃだめなの?
437デフォルトの名無しさん:02/07/01 23:32
>>432
だから、setjmp,longjmp以下略
438434:02/07/01 23:35
>>436
その二つでも良いですね。そっちのほうが関数呼ばなくてすむから良さそうですね。
だけど、今プログラム動かして確認してみたらカンマで終わらなくてもちゃんと動いてた(汗。
このプログラムで大方問題ない?
439デフォルトの名無しさん:02/07/01 23:37
>>434 ほい。

char str[]="100,200,300,400",buf[128];
char *pstr = str,*pbuf=&buf[0];

while(*pstr){
  if(*pstr == ','){
    *(++pbuf) = '\0';
    printf("%s\n",buf);
    pbuf = &buf[0];
    pstr++;
  }
  *pbuf = pstr;
  pstr++;
}
>>439
最後のトークンが表示されないんじゃない?
441デフォルトの名無しさん:02/07/01 23:40
while抜けたところに

*(++pbuf)='\0';
printf("%s\n",pbuf);

か?
442440:02/07/01 23:40
末尾が,で終わらない場合ね。
443。。。:02/07/01 23:52
今、標準関数を自作するのに凝ってるんですが、
itoa,ltoaなどの数を文字列やその逆みたいのは
どうやって実現してるんでしょうか?

だいぶ考えたけどわかんなかった。
>>443
May the source with you!

*BSD の libc でも読んでみるのが良いかと。
libc読んでみたい。
誰か教えてくれ!!
Media Playerで再生中のファイル名を取得する方法ってありますか?
そういうアプリを作りたいんですが・・・
>>432
start_time = clock();
for (;;) {
 if (キー入力の検出あり) {
  キーの処理
 }
 if ((clock() - start_time) / CLOCKS_PER_SEC >= 600) {
  exit(0)
}
}
キー入力の検出はどうしても環境に依存する。
libcのソースどこかで拾える?
449293:02/07/02 00:15
>>447
そうですそうです。
そんなかんじで、イメージしてます!
その、キー入力をどうするか、
というところを、勉強中です。
考えているところが、間違えていなくて良かったです。
<自分のはif以下に()が一つ多かったが・・・>
環境(OS)はやはりWindowsを主体に考えていますが、
割り込み処理と言う部分も環境(ハードウェア)によるのであれば、
勉強がかなり大変になりますね・・・
ちょっとうつですががんばってみます
450をい!:02/07/02 00:23
>>449
windowsなら以下略
451デフォルトの名無しさん:02/07/02 00:25
>>450
ハァァ?
452デフォルトの名無しさん:02/07/02 00:34
     /⌒ヽ   /⌒ヽ
    /    ヽ /    ヽ
    |     | |     |
    |     | |     |
    |     | |     |
          V     ヽ
  /              \
 /                 ヽ
 |                  |    /  ̄ ̄ ̄ ̄ ̄ ̄
 |    ●       ●    |   / 
 ヽ                / <    ・・・・・・・・・・・・
  \      ×      /   \  
     -、、,,,,,___,,,,,、、-       \
   //  (_人_)  ( ○川 )       ̄ ̄ ̄ ̄ ̄ ̄ ̄
  (_ /           ヽ_)
    /_________ヽ
       | |  |
       ( __) _)
453デフォルトの名無しさん:02/07/02 00:40
くすっ♪
454293:02/07/02 00:48
>>450
略しすぎで今ひとつ分かりませんが・・・
APIなるものを利用せよ!
と言うことでしょうか?

ビジーループについて分かりました。
これはやめて、sleepなるものの使い方を勉強してみます。
はふぅ(>_<;)
455age:02/07/02 00:51
>>450
WM_TIMER まで書いてやれよ。
457!:02/07/02 00:56
>>450は人気者
446が爽やかに無視されてる罠。
>>454
> これはやめて、sleepなるものの使い方を勉強してみます。
おいおい…。それじゃ入力に対して即座に反応できんだろ。
入力用の、スレッドを、つくれ、と。
WindowsならWaitForMultipleObjects()
UNIX系ならselect()かpoll()
>>461
Windows なら、入力はスレッドを別に用意せず、メッセージループ回すだけだと
思われ。
Windowアプリケーションならな。
>>423でprintf()使ってるあたりを見るとそうとも限らない。
464293:02/07/02 07:14
>>456
WM_TIMERですか。ちとまだ調べられていないので分かりませんが、
次の課題に抱えておきます。

>>459
まだs;eep()の特性を調べ切れていないので、
てっきりsleep()の方が良いのかと思ってました。

>>461-463
現在は、Windowsでbccを使って勉強しております。
ですので、現在はコマンドプロンプト上での操作になるのですが、
VisualCorC++orC#が必要と言うことになるのでしょうか?
一応環境は手持ちにあるのですが。
>>462
余計な処理までしてくれるうふふな仕様。

(´-`).。oO(>>450 は Windows スレへ行けと言いたいんじゃないかなぁ。。。)
>>443
ちと、作ってみた。制限があるけど、自分で探して。

#include <stdio.h>


void swap(char *c, char *d);
int strlen(char *s);
void reverse(char s[]);
void itoa(int n, char s[]);


int main(void){

    char str[32];

    itoa(-12345, str);
    printf("%s\n", str);

    return 0;
}

void itoa(int n, char s[]){

    char *p = s;

    int sign = 1;

    if(n < 0){
        sign = -1;
    n = -n;
    }

    do{
        *p++ = n % 10 + '0';
    }while(0 < (n /= 10));

    if(sign < 0)
        *p++ = '-';

    *p = '\0';

    reverse(s);
}
468467 続き:02/07/02 14:27

void reverse(char s[]){

    char *p = s;


    p = s + strlen(s) - 1;

    while(s < p){
        swap(s, p);
        ++s;
        --p;
    }
}

int strlen(char *s){

    char *p = s;


    while(*p)
        ++p;

    return (int)(p - s);
}

void swap(char *c, char *d){

    char temp;


    temp = *c;
    *c = *d;
    *d = temp;
}

469デフォルトの名無しさん:02/07/02 16:45
CRC計算について質問です。
32bitCRCを算出して、CRCリストと比較するモノを作成したいのですが、
CRCの計算原理がいまいちわからずに困惑しています。
どなたか噛み砕いて教えていただけないでしょうか・・・
>>469
手近なところだとソフトウェア開発技術者の参考書。
471デフォルトの名無しさん:02/07/02 18:07
構造体宣言の前に#pragma pack(push, 1)を入れると
コンパイルできなくなるのですがどうしたらよいのでしょうか

struct{構造体宣言};
(中略)
int main(){ ... }
と、これはコンパイルできるのですが、このソースに
#pragma pack(push, 1)
struct{構造体宣言};
#pragma pack(pop)
int main(){ ... }
とやると
bitmap.c:107: warning: malformed `#pragma pack'
/usr/local/lib/gcc-lib/sparc-sun-solaris2.7/2.95.2/crt1.o: In function `nope':
/usr/local/lib/gcc-lib/sparc-sun-solaris2.7/2.95.2/crt1.o(.text+0x5c): undefined
reference to `main'
collect2: ld returned 1 exit status
となるんです
>>471
#pragma pack(push, 1)
struct{構造体宣言};
#pragma pack(pop)

struct{構造体宣言} __attribute__ ((pack));
でどうか。
473471:02/07/02 19:17
>>472
コンパイルは通ったのですが、
warning: `pack' attribute directive ignored
…だそうです。無視されたってこと…でしょうね。
fwrite/freadで構造体(BMPのヘッダです)読み書きするプログラムなので
構造体をpackして欲しいのですが。
gccなので当然wingdi.hなぞありません(w
ひとまずあきらめて別のアプローチをとったほうが良いでしょうかね。
>>473
pack→packedの間違いですた。スマソ。
>>474
無事コンパイル通りました。ありがとうございます
476デフォルトの名無しさん:02/07/02 19:46
>>470
469じゃないけどさ、具体的に書名教えてよ。
CRC-16とかの計算方法が載ってそうな本
477デフォルトの名無しさん:02/07/02 19:56
>>476
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=utf8&oe=utf8&q=CRC+16+%E8%A8%88%E7%AE%97%E6%96%B9%E6%B3%95

つーか、本が好きなら「アルゴリズム辞典」系の名前の本を
片っ端から見てみりゃ幾らでもあるだろう。
>>471
構造体の要素をchar(とそのような構造体)だけにすればパディングは起きない。
普通はそうだが保証はない
これ規定されてなかったか?
openglってみんなつかってる?
これってC言語で使えるんだよね?
VCとかBCとかで
483buy:02/07/02 22:00
#include<stdio.h>
void main(void)
{
int mat[3][4],i,j;
float ave[3],is;

for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("mat[%d][%d]=",i,j);
scanf("%d",&mat[i][j]);
}
}

for(i=0;i<3;i++)
{
is=0.0;
for(j=0;j<4;j++)
{
is=is+mat[i][j];
}
ave[i]=is/4;
}


for(i=0;i<3;i++)
{
printf("%3d %3d %3d %3d %3.2f\n",mat[i][0],mat[i][1],
mat[i][2],mat[i][3],ave[i]);
}
}
これに各列の平均も出したいんですけどどうすればいいんですか?
誰か教えてください。
>>483
i と j を逆にしてループを回せばよい。
485buy:02/07/02 22:12
>>484
ループって何ですか?
>>485
・・・・・・・。
( ゚д゚)ポカーン
ループ
(1) 輪。環。「―アンテナ」。ボタンを掛ける、ひもの輪。
(2) 「ループ線」の略。急勾配(こうばい)の地に鉄道を敷く時、線路を環状にして、登りやすくしたもの。
→loop
ループを回す?
↻ฺ↻ฺ
>>485
マジレスしてやる。
ここで聞く以前の問題だ。
俺の昔使った本(すぐわかるC/C++)には
前から73ページ目に乗ってるよ。
もう一度勉強しなおしなさい。。
ループ=繰り返し

491buy:02/07/02 22:39
誰か教えてくれよ〜
まじテストやばい・・・
これだけfor使ってループが分からないわけないと思った。
>>491
やばいだろうな。

人類のためにさっさと学校やめてくれ。
テストで悪い点を取れ。
んで、勉強せぇ
495デフォルトの名無しさん:02/07/02 22:53
課題のプリント丸写しか、教材の丸写しか、
友達のソース丸・・・友達いないか
496buy:02/07/02 22:54
課題は友達のやつをコピらしもらってたからな・・・
金曜日テストなのに間にあうと思います??
しるか
498buy:02/07/02 22:58
ところでさっきのやつなんだけど is=0.0 の意味を教えてもらえますか?
iのsumを0.0で初期化しているじゃないの?
構造体Oのメンバ変数Oの値を取り出してisに代入してるんだよ。
501デフォルトの名無しさん:02/07/02 23:10
現在作成中のプログラムの中で
10個のデータg[10]のそれぞれを比較して最大値を出力したいのですが
if文を大量に書くしかないのでしょうか?
10個ならまだいいですが100個とかになった場合恐ろしいので気になりました。
よろしくお願いします。

PS もしかしてとても初歩的な質問ですか?
502buy:02/07/02 23:10
列の平均だけなら出たけど行と列の平均を一緒に出すってどうやんの?
なんかうまくいかないんだけど・・・
>>501
そのためのループです。
>>501
なんのなためにエディタのコピペがあるとおもってんの?
>>501
ループでまわして最大値をさがせばいいじゃん。
506buy:02/07/02 23:14
>>501
めっちゃくちゃ初歩的だよ
>>506
お前が言うなw
508デフォルトの名無しさん:02/07/02 23:16
>>503
>>505
ループ使うってのは考えたのですが
いまいちどう書いていいものか・・・
3個のデータで例でソース書いていただけませんか?
よろしくお願いします。

>>504
コピペですか・・・
効率が悪いと思ったのでなるべく避けたいです。。。
わははは
int a[3];
int m = a[0];
for(int i = 1; i < 3; ++i)
{
  if( m < a[i] ) m = a[i];
}
511501:02/07/02 23:19
すみません。
少し考えてからわからなかったらまた聞きに来ます。
自分で考えずに人に聞くことばかりではダメですよね(汗)
512510:02/07/02 23:23
もしかして、501は俺の書いたのを見ないで行ってしまわれましたか?
>512
いま全力で>510を思考中
514buy:02/07/02 23:34
誰か俺にも助言をくらはい
>>510
int m = a[0];

a[3]は初期化していないよね?実は広域変数とか?
>514
>>484
517501:02/07/02 23:39
>>510
レスありがとうございます。
質問の仕方が悪かったです
最大値を持っている要素と最大値を出力したいの間違いでした。
しかし、勉強になりました。

ちなみに自分がしたかったことは以下です(汗)
int k=0;
for(i=0;i<10;i++){
if(g[k] > g[i]);
else k=i;
}
printf("g[%d] = %1.2f\n",k,g[k]);

みなさん本当にありがとう御座いました。
ifとelseが微妙
>>510
ここはCスレです。C++スレではありません。
520buy:02/07/02 23:41
>>516
まじでエラーになるって〜
>>520
しょうがないなあ。ほれ、これでどうだ。

void main(void)
{
int mat[3][4],i,j;
float ave[4],is;
.........

for(j=0;j<4;j++)
{
is=0.0;
for(i=0;i<3;i++)
{
is=is+mat[i][j];
}
ave[j]=is/3;
}
522buy:02/07/02 23:46
見事できました〜〜ってできて当たり前か・・・
>>522
本当に i と j を入れ替えるだけだったろ?行と列を入れ替えただけだもん。
524デフォルトの名無しさん:02/07/02 23:50
int x,yがあったとして、x<yなら-1を、x==yなら0を、x>yなら1を返すという処理を記述する際、上級者は
if(x<y) return -1;
if(x==y) return 0;
if(x>y) return 1;
と可読性をあげるために敢えてelseを使わないとある雑誌に書いてあったのですが本当ですか?
三項式の入れ子は可読性が低いというのは分かるんですが。
>>524
・無駄
・意図した処理にならない場合も

よってダメ。
526buy:02/07/02 23:52
>>522
両方の平均を一緒に出すのがむずかったよ
>>526
足して割れやゴルァ
>>525
ですよね。
まったくもう・・・>あの雑誌
なんて雑誌?
530デフォルトの名無しさん:02/07/02 23:57
>>529
確かSoftwareDesignという雑誌だったと思います。
学校で少し見せてもらっただけなので間違っているかもしれませんが。
531!:02/07/02 23:57
漏れなら、if等使わずに、

return ((x-y)/abs(x-y));

とするな。
等しいとき死なない?
533デフォルトの名無しさん:02/07/02 23:58
>>531
おいおい、0による除算エラーがおきねーか?
534533:02/07/03 00:00
めるらんにうそですとかいてあった(うつ
535532:02/07/03 00:01
>534
ほんとだ(うつ
ホホホ
漏れならif等使わずに

return (x-y)/((x-y) ? abs(x-y) : 1);

とするな
538buy:02/07/03 00:03
#include<stdio.h>
void main()
{
int n,n100;
int y;


n=0;
n100=0;

while(scanf("%d",&y),y>=0)
{
n=n+1;
if(y>=100)
{
n100=n100+1;
}
}
printf("全部で %d ,100以上は %d \n",n,n100 );
}
入力された数字すべての和、100以上の数字の和を求めるよう、改良しろって問題なんだけど
どうやればいいの??さっぱり分からん
宿題か?
540デフォルトの名無しさん:02/07/03 00:04
>>buy
おまえはこの道はあきらめたほうがいいぞ。
>>538
大阪工業か?
542buy:02/07/03 00:06
while=forですか??
>>538
これより先は君の質問に限り、解答が有料になるがよろしいか?
544buy:02/07/03 00:07
>>538
よろしくないです
>>538
俺は明日の昼飯でいいや。
>>538
土産もってこい
>>544
じゃあ自分の力でやれ。
ポカーソ
>538
改造前のコードが、何をやっているのかは分かるの?
550buy:02/07/03 00:08
>>541
工大生?
なら教えて
551buy:02/07/03 00:10
>>538
わかんないです・・・
552Jの4:02/07/03 00:10
>>550
頼むから潔く学校やめてくれ・・・。
>>538
線を2本書き足すだけだよ! 優しいな俺って。
>>buy
おまえひょっとして、以下略
555buy:02/07/03 00:13
>>553
どこに足すの?
556buy:02/07/03 00:14
>>552
以下略って何よ?
>>555
>>538のプログラムが何をしているのか一行ずつ読みながらよく考えてみな。
Cの文法はわかっているんでしょ?
>>551
もうこれが最後だからな!1を足す代わりにyを足せ。
>>buy
生き別れになったお兄さんだろ!! こんなところで会えるなんて!!
560buy:02/07/03 00:16
n100ってなんですか?
>560
元のプログラムでは、100以上の数の個数
>>555
ちょっと待て。
そろそろくだらない質問の連続やめろよ。
自分で調べろ。
http://www.yahoo.co.jp/
>>555>>560
客観的に見てみな。
他人がこんなん書き込んでたらどう思う?
Cの前に掲示板のマナーを学ぶことを強くオススメする。
563buy:02/07/03 00:19
>>558
ありがとう 
564buy:02/07/03 00:20
>>562
すいませんでした・・・
自分でやります
>543>545>547>549>552-554>557-559>561>562
に昼飯よろしく。
scanfの後の,y>=0て何?
||だろ?
>566
べつにいいんじゃない?
568デフォルトの名無しさん:02/07/03 00:24
>>566
scanfでyに代入(?)したあとにyが0以上かどうか判断しているんだろ。

(俺は条件式でカンマ演算子なんか使いたくないな)
へー。カンマなんて使えるんだ。初めて知った。
570名無しさん@カラアゲうまうま:02/07/03 00:26
どっちもよくねー。>>566>>557

while (scanf("%d", &f) == 1)
もしyが0以上という条件があるなら
while (scanf("%d", &f) == 1 && y >= 0)
571buy:02/07/03 00:26
ところで皆さんは学生さん?
>>570
勉強用プログラムでscanfの戻り値なんて確認しないだろ。
573デフォルトの名無しさん:02/07/03 00:30
scanfの正常時の戻り値って1なの?
>>573
いや、実際に代入した個数。それを見てきちんと代入されたかどうか判断する。
scanf系の戻り値は氏んでも確認しろ(゚Д゚)ゴルァ
つーか、宿題なら、宿題スレ逝けよ、、
http://pc.2ch.net/test/read.cgi/tech/1024592344/
577デフォルトの名無しさん:02/07/03 00:33
>574
scanfで複数個の代入なんて…
>>577
するだろ?少なくともsscanfでは。
579デフォルトの名無しさん:02/07/03 00:36
>するだろ?少なくともsscanfでは。
ぷっ。
580デフォルトの名無しさん:02/07/03 00:37
scanf系をしっかり理解してるのとしてないのとじゃ開きがあるが、
「使うな」といわれてそれっきりのやつも多いんだろうなあ。

子供のおもちゃにしては危険度の高い関数だが
いい大人がなんで使っちゃいけなかったのか、
どう使うべきなのかを理解せずに未だに「いけないもの」
としてる香具師を期待したが、出てこないな、おい。
581デフォルトの名無しさん:02/07/03 00:38
そんな香具師いるかよ。
582デフォルトの名無しさん:02/07/03 00:40
scanfは大人のおもちゃ・・ハァハァ
商品じゃあるまいし個人的なものにscanfで何の問題もない
584デフォルトの名無しさん:02/07/03 00:42
583に激しく胴囲
585デフォルトの名無しさん:02/07/03 00:43
strtokは使うなというカキコは見たことがある。
586デフォルトの名無しさん:02/07/03 00:51
/*
* strtok scanf:どちらも仕事では、使ったこと梨。
* scanf    :仕事でなければ結構使うかも。
*/
587デフォルトの名無しさん:02/07/03 00:55
scanf、、、実装は大変だろうにな・・・
scanfなんか10行プログラムしか出番なし。
getline(うぐぅっ)
590デフォルトの名無しさん:02/07/03 00:58
>>586
strtokよりもscanfの方がよっぽど危険だと思うが?
strtokは素性さえ知ってれば仕事でも使えるだろ。
scanf()はFORTRANのREAD文と同じく、カードでデータを読みとっていた
頃の、過去の遺物。
そんな悩ましい関数はもう捨てよう。
593デフォルトの名無しさん:02/07/03 00:59
scanfはナゼ入門書に必ずといっても良いほど取り上げられるのか?
俺のティムポが曲がっているのと同じくらい不思議。
>>593
簡単だから。
>>593
ティムポが曲がるのは、同じ手でばかりオナーニしてるせいらしいぞ。右利きと左利き
のティムポは逆方向に曲がっているとか。
596デフォルトの名無しさん:02/07/03 01:02
>>595
逆の手でやってりゃ直るのかい?
>>596
どうかな?ちなみに俺は両効きなので、ティムポはほぼまっすぐに
なっているぞ。ふふふ
>過去の遺物。

そうそう、こういうものは沢山残ってる(w
C自体が過去の遺物
600デフォルトの名無しさん:02/07/03 01:07
>scanf()はFORTRANのREAD文と同じく、
>カードでデータを読みとっていた頃の、過去の遺物。
じゃあカードと紙テープ復活させる?
601デフォルトの名無しさん:02/07/03 01:08
>599
じゃあ最新はどこら辺よ?
>>600
そこまでしなくても、エディタで入力ファイルを書式通り書いて
リダイレクトで読み込ませるだけで十分。
603デフォルトの名無しさん:02/07/03 01:10
日本語でプログラミング」という
小学生が考えるようなプログラミング言語を作った
「ひまわり」の作者が「ひまわり.NET」を作成中との情報です。
同作者は「Web上でも動くんだよーチャキーン」と連呼し、各種掲示板サイトに
事実上荒らし行為とよばれる書き込みを多数している模様。
需要がろくにないくせに何を言ってるんだ!とあちこちで死ねコールが
発生。しかし韓国ではワールドカップの影響か「ひまわり」を愛用する
若者たちが最近多く見られるそうだ。彼らは「カムサハムニダチョムルキセヨーウォライケィ」
(ひまわりよ我らに讃えあれ)と意味不明の言葉を発しているとのこと。
ひまわりが韓日関係の向上に一役かってくれそうな状況だ。
>>601
最新は何かな?

ちなみにC++自体も中身は時代遅れと作者は言っていたようだし。
要するに何が問題かというと、CもC++も入出力機能は言語機能では
なくライブラリとして提供されている点が問題。

GUIのライブラリを入出力用に使えば機種依存は生じるが、最新の
機能を維持できる。それだけの話。
605デフォルトの名無しさん:02/07/03 01:14
入出力機能を実装する言語に入出力機能は要らないだろ。
606デフォルトの名無しさん:02/07/03 01:14
つーかCが時代おくれって言うよりは標準ライブラリが時代遅れなんじゃ?
新しくて良いものがあるのに使わないのは引退時だな。
608デフォルトの名無しさん:02/07/03 01:15
>606
剥げどう。
609通りすがり:02/07/03 01:16
ん?俺スーパーハカーだけど、Cしかしらないよ。
>604
って事はVC++って事?
やっぱりMSかい。スモールサイズはアセンブラって事に落ち着くかい。
>>606>>608
その通り。なぜこのような使い物にならないライブラリが添付されている
のか不思議。まあUNIXは未だにCUIも当たり前だから不思議でもないか
も。
612デフォルトの名無しさん:02/07/03 01:22
>611
CUIであることと、古くさいライブラリが付いているのは別問題。
>>610
Motifもお忘れ無く。
>>524
int foo(int x, int y)
{
 if (x < y) return -1;
 if (x == y) return 0;
 if (x > y) return 1;
}

> cc -c -Wall t.c
t.c: In function `foo':
t.c:7: warning: control reaches end of non-void function

という具合にwarningがでる。それなんでこう書く。

 if (x < y) return -1;
 if (x > y) return 1;
 return 0; /* x == y */
>>614
条件文無しの無条件returnが一つは必要って事かな?
単にコンパイラがreturnしないパスがあると思いこむだけ
素直にelse使ガホゲホゴホ
618614:02/07/03 02:13
if (x < y) {
 return -1;
} else if (x > y) {
 return 1;
} else { /* x == y */
 return 0;
}
こんな感じ?こだわりはなくて気分次第で使い分け。
でもelseを使うとなぜか{}を書きたくなる。
return -(x < y) + (x > y);
620デフォルトの名無しさん:02/07/03 02:31
すいません

関数に配列を投げ込んで
配列内の最大値を返そうとしてるんですが
うまくいきません

> gcc test.c
test.c: In function `MAXdt':
test.c:32: arithmetic on pointer to an incomplete type
test.c:33: arithmetic on pointer to an incomplete type

たすけて…
>>620
コンパイラのエラーの意味はわかるのか?
622620:02/07/03 02:45
>>621
なんか 変数型が ちがうんかなーと思ったりしたんですが
ぜんぶintだしうーん あんまりわかんないです すいません
よく分からんなら、ソース出せというに
624620:02/07/03 02:49
#include<stdio.h>
#include<stdlib.h>

#define N 1

int MAXdt(int dt[][]);

int main(void)
{
int i,j;
int cmax;
int org_dt[N][N];//オリジナルデータ

org_dt[0][0]=3;
//配列の最大値を探す
cmax=MAXdt(org_dt);
printf("%d",cmax);
}

int MAXdt(int dt[][])
{
int cmax,i,j;
cmax=0;

for(i=0;i<N;i++)
for(j=0;j<N;j++)
if(dt[i][j]>cmax)
cmax=dt[i][j];

return cmax;
}
625620:02/07/03 02:50
ここのぶぶんでエラーが

if(dt[i][j]>cmax)
cmax=dt[i][j];

でるみたいです
626620:02/07/03 02:51
>>623
あう、すいません
今だします
>>624
とりあえず、何を繰り返したいのか小一時間(以下略
>>624
> int MAXdt(int dt[][])
仮引数に配列を渡すときには、実際にはポインタに縮退しているのは理解してる?
629620:02/07/03 02:54
(^^;;
630デフォルトの名無しさん:02/07/03 02:55
>624
MAXdtの仮引数→dt[N][N]は?
632620:02/07/03 02:57
>>628
あんまり良くわかんないですが
dt自体はポインタでしたっけ?
dt[i][j]はintの値かなーとおもっていたのでそのままcmax
にあげちゃったんですけども…
633628:02/07/03 02:58
>>630
そう書いても良いけど、実際の内部処理を反映する形で宣言すると

 int MAXdt(int (*dt)[N])

だよね。「int 型 N 個の配列へのポインタ」が引数として渡される。
634620:02/07/03 03:01
あ、なるほど、省略しすぎだったのか…
ちゃんと、いくつかということを書かないといけないのですね…
>>630
>>633
どちらも試してみます
>>632
int dt[N][N]; と宣言してるから dt 自体は N * N の二次元配列。ただし dt を
右辺値として評価すると、それは N 要素の一次元配列へのポインタに縮退す
る。

二次元ではなく一次元でも同じなんだけど、一次元だと適当に理解していても
どうにかなる。二次以上は、ポインタと配列の区別を明確にしておかないとハマ
る。
636620:02/07/03 03:06
>>635その他多数のみなさん
ありがとうございました 動きました!!
なんかいまいちわかんないですが
dt[i]まではポインタで
[j]はそのポインタを格納している配列なのかな???
うーむ・・・
637620:02/07/03 03:12
報告

(*dt)[N] 動作しました
[N][N] エラーでとまりました
>>636
> [j]はそのポインタを格納している配列なのかな???
やっぱり分かってない。
何か・・・糞スレまっしぐらー Σ(゚д゚lll)ガーン


誰のせいかは名言しませぬが。。
640デフォルトの名無しさん:02/07/03 08:30
C言語(応用)なら、俺に聞け!(宿題は宿題スレへ)
覗いてみたら消防の宿題ばっかしやし。
641 :02/07/03 08:40
Sleep関数って使ってる?
使っても良いのかな?
どのくらいの単位で指定できるんだっけ?
1/100秒くらい?
使ってもいいからあとは手持ちのヘルプ嫁。
643デフォルトの名無しさん:02/07/03 09:20

int *a;

main( )
{
func( );
a[ 0 ] = ...;
}
void func( )
{
a = ( int *)malloc( ... );
}

みたいなことはできますか?
なんか、配列が壊れてるみたいなんですが。

可能。省略したところがバグってると思われ。

>644 ありがとうございます。
よく分かりませんが malloc するサイズを
必要な分だけにしたらうまくいきました。
>>645
>malloc するサイズを必要な分だけにしたらうまくいきました。

いや、当たり前ですが。

まだmallockとかは早いと思われ。
ポインタの使ってる割にはグローバル変数で渡してみたり・・・。
>>646
> まだmallockとかは早いと思われ
mallockって何ですか?
多分、君もmallocを使うのは早いと思われる。
>>647
mallock知らんのか?
mallocを習得したものだけが使える究極の関数だ。
きっと君は100年経ってもmallockは使えんだろうね。
mallock の k は何の略なん?
>650
k=こんにちわ
>>650
1024
653デフォルトの名無しさん:02/07/03 14:41
#define  mallock  malloc
654デフォルトの名無しさん:02/07/03 14:42
>>650
キティ街
>>650
更年期
>>650
俺のイニシャル
つまんね
658デフォルトの名無しさん:02/07/03 15:28
callockはありますか?
>>524
その場合、戻り値の情報量を減らす理由があれば別として、

return x - y;

で十分のような。
660デフォルトの名無しさん:02/07/03 15:38
>>658
勿論。callock 一度つかったら calloc なんて使ってられない。
>659
確かにその方が早い。


でも意味がちがってくる・・
つまりプログラムを読んだときに意図が見えにくくなる
>>659 のようなコードを書く人は >>524 を読み間違えることはないけど、
逆は成り立たないということでよろしいですか?
マゾレス
カーネルレベルのmallocがmallock。
>>663
printkってのもありましたな・・・
http://www.cmagazine.jp/src/kinjite/c/variable.html#index17
この内容って関数から抜けたときに配列の要素が消えるから
関数外で戻り値のポインタを使用して配列の要素にアクセス
してはならないってことであってる?
それとも、returnに自動変数を使用しちゃいけないってこと?
>>665
正解。
関数出た時点からその関数ローカルな変数の値は保証されない。
667665:02/07/03 15:55
>>666
returnに自動変数使うのはまずくないんだよね。たとえば
int foo(void)
{
 int i;
 i = 10;
 return i;
}
こんなの。
>>667
値渡しってわかるよね?
あれは引数だけでなく返値にも適応される。
だから戻り値にはその変数のコピーが渡される。
自動変数へのポインタをreturnしちゃいけないって事。
>665
>それとも、returnに自動変数を使用しちゃいけないってこと?

とか言っておきながら>667は何だろう?
671665:02/07/03 16:00
>>668
了解。サンクス。
リンク先の書き方がわかりにくいと思うのは俺だけかなぁ?
>>671
そう?リアルタイムで読んだけど、

「こんな奴おらへんわ〜往生しまっせ〜」

って感じで長し読みした。
スレッド共有オブジェクトをvolatile宣言しないってのは見る
Windowsアプリのソースで以前あった。これってヤバイの?
>>673
つぅかそんなレベルで変数共有留守法が悪いと思われ。
定規にしるしをつける問題です。関数の中身は
rule(int l, int r , int h){
int i,j,t;
for(t=1,j=1;t<=h;j+=j,t++)
for(i=0;l+j+i<=r;i+=j+j)
mark(l+j+i,t)
}このアルゴリズムの解説をお願いします。markは印をつける
という意味です。
676デフォルトの名無しさん:02/07/03 19:07
markへの2つの引数はそれぞれどういう意味?
#define HAIRETU_PLUS(kata,cnt,p,tempp) \
tempp)=(kata *)realloc((p),((cnt))*sizeof(kata));\
#define HAIRETU_PLUS(kata,cnt,p,tempp) \
 (tempp)=(kata *)realloc((p),((cnt))*sizeof(kata));\

なんかエラーが出るんですけど,なぜ?
kataが悪いようなんですが
679デフォルトの名無しさん:02/07/03 20:02
>>678
最初の行の\の後ろにある文字を消してみては。
680 :02/07/03 20:10
error C2440: '=' : 'struct tagPOINT *' から 'char *' に変換することはできません。
とでます
>>675
お前このまえも来ただろ。
682デフォルトの名無しさん:02/07/03 20:13
>>680
それはマクロじゃなくてマクロを展開した後の文に問題があるんだろ。
>>982
本当だ。
ありがとう。
3時間悩んだ俺は未熟者
これからは,前後の文もよーく見ます
国語が苦手だったのは,前後の文みなかったせいかな
684デフォルトの名無しさん:02/07/03 20:55
>>680
どんなコンパイラを使っているの?
そういうものは普通はエラーじゃなくて警告がでるよね?構文上の誤りがあるわけじゃないんだから。
685684:02/07/03 20:59
どうみてもVC++だな。
おかしいな、ポインタ同士なら警告になるはずだが・・・
実は.cppだという罠
>>686
俺もそれよくやった。

>>680
reinterpret_castを使えば警告は出ないよ。使うべきでないけどね。
普通にCのキャストで良い。どんどん使え
>>688
拡張子が".cpp"、つまりコンパイラにC++と認識されていると、C形式の
普通のキャストもエラーになる事がない?
C++で使うとは自動的にconst_cast
static_cast、reinterpret_castが行われる。とっても便利
Cで通用するキャストは全部通るはず、と思う
>>690
本当だ。第3版のP927〜928に書いてある。知らなかった。使わなかった
もので。
signed int と unsigned int の算術演算の結果が unsigned int になるのやめてホスィ・・・
演算時に片方が unsigned int に格上げされるだけで結果は int に
なるのではない?
694デフォルトの名無しさん:02/07/03 22:37
>>692
unsigned の方が、ぱぅわが強いのです。ぱぅわが。
695693:02/07/03 22:43
スマン。勘違いだ。
int value = -50; // 1つずつの値
size_t count = 10; // 個数
if ( value*count<100 ) puts("合計は100未満だよ");

(゜д゜)マズー
>>676
tは、印の高さで(l+j+i)は印をつける位置です。
698デフォルトの名無しさん:02/07/03 23:50
「あいuえ5」みたいに2バイトと1バイト文字が含まれた文字列を
一文字ずつ分解する(分けて取り出す)プログラムを教えてほしいのですが。
>>698
文字コード書いてくれてないから何とも言えません・・・
700698:02/07/03 23:55
>>699
すみません、シフトJISです。
701デフォルトの名無しさん:02/07/03 23:57
>>698
mbstowcs()とかを使ったら?使えない処理系もあるけど…
>>700
1バイト読みとって最上位ビットが1だったら2バイト読んで、0だったら1バイト読むとか・・
でも>>701がよいとおもう。
703698:02/07/04 00:02
>>701
特殊な感じがしますね。ある程度自作したいので(人に聞いてる時点で自作って言うのか・・・)。
704デフォルトの名無しさん:02/07/04 00:04
>>702
それだけでは、いわゆる半角カナがあるとうまくいかない。
>>703
ShiftJISの文字コード表探してきて法則性見つけてみる?
勉強にはなると。
>>704
ああそうか。半角仮名があったな(笑)
最初の1バイトを _ismbblead() でチェックして真なら
次の1バイトを _ismbbtrail() でチェック。これも真なら
2バイト文字として読み飛ばす。
#define is_kanji1st(c) ((unsigned int) (c ^ 0x20) - 0xa1 < 0x3c)

709デフォルトの名無しさん:02/07/04 01:06
>>708
signed char だとまずくないですか?
710デフォルトの名無しさん:02/07/04 01:21
EBCDIC って今でも現役バリバリなんだね。
銀行系とか遊戯系とか。
めちゃくちゃビックリした。
日系2世 恵比寿ディック
c^0x20じゃなくてcを直接キャスト。
つーか、cにカッコつけろや(゚Д゚)ゴルァ
>>712>>709>>708へね。スマソ
reinterpret_castを使うべきではないというのはどういうことか
>>714
意味をもったキャストではなくて、そのまま生のバイトを再解釈して
型を変えるのでややアレ。
>>714
reinterpret_castなんてはじめから存在しないものと思っていいよ
intとポインタの変換とかで確実に必要になると思うが。
特にWindowsでプログラムする場合なんかは。
キャスト話はいい加減スレ違いだと思うけど・・・
あえて聞くと、画像処理で頻繁に LPBYTE <-> LPWORD なんかの変換を行うけど、
こんなのにもわざわざ C++ スタイルのキャストを行うの?
>>718
キャストの話ではないが、RISCとかに移植しようとしてSIGBUSを喰らう罠。
LPBYTE<>LPWORD変換なんてしないよ。
void*経由だろ、フツー
>>720
LPVOID <-> LPBYTE はC++スタイルのキャスト?
>>721
つぅか汎用ポインタはキャストしないと使えないしょ。
>>721
static_cast<>()
一つの式中にキャストが3つも4つも出てくるとstatic_castって書くのうざくないっすか?
可読性も落ちる気がするし。
うざいけど、Cスタイルのキャストは見つけづらいので
リファクタリング時に泣くことになる。
>>725
キャストを検索するマクロ書け
書くときの大変さと保守するときの大変さのトレードオフ?
漏れも今度からstatic_cast使おうかな
>>726
書いてください。
漏れには正確に列挙する正規表現が思いつかないよ
>>727
書くとき大変なんて、誰も言ってないが?
そういうことにしたいのですね?(どこかで聞いたフレーズ)
typedefや[]、()のネストとかまで考えると、正規表現じゃ無理だろうな。
>>728
コンパイラと同じように、インクルード展開して、
型認識せよ
>>731
それならやっぱりC++スタイルキャストの方がいいやん
>>732
一回書けば、ずっと使えるぞ。学生なら勉強にもなるぞ。
リファクタリング時に、見づらいC++スタイルキャストで
ソースが難解になり、泣かずにすむぞ。
ソース解析ツールはコンパイラと同じように発展すべきだ。
>>733
C++スタイルキャストは冗長でうざいけど判断の妨げになることはない
grepだけで簡単に判断できるから、どの環境でも列挙できる強みもある。
736デフォルトの名無しさん:02/07/04 10:36
>>735

>>C++スタイルキャストは冗長でうざいけど判断の妨げになることはない
ソースが見づらいのは、充分判断の妨げになる。

>>grepだけで簡単に判断できるから、どの環境でも列挙できる強みもある。
Cスタイルキャストがないとは判断できない。
結局、全てのキャスト部分を列挙するツールが必要。
>>736
冗長だとは書いてあるけど、見づらいとは書いてないじゃん
一時期 C++ スタイルキャスト使っていたけど Windows プログラム
だと本当に可読性悪くなってしまう。結局 C スタイルキャストに
戻してしまった...。
ポインタからDWORDとか、構造体のポインタはCキャストで、
クラスオブジェクトのポインタはC++キャスト使ってるけど、
その住み分けにしばし迷ったりして、いっそのこと全部Cスタイルにしようかと。
740デフォルトの名無しさん:02/07/04 13:05
標準ライブラリにある、atoiとかstrtoulとかは
入力文字列にEBCDICを使えるのでしょうか?
741デフォルトの名無しさん:02/07/04 13:27
ここで紹介されている .net framework SDK には Cコンパイラ は入っていないんですけど
どうして紹介されてるんですか?
(入ってるのは、C# , JScript .NET , Visual Basic .NET コンパイラ だけなんですが)
cl.exe <- C/C++ Compiler
>>740
その処理系が対応していれば使える。
744デフォルトの名無しさん:02/07/04 16:10
>>719
(unsigned)intにキャストして下位ビットを見て処理を分けるな。
x86でも高速化に有効。

if ((((unsigend)ptr)&(sizeof(xxx)-1))==0) {
xxx *ptr2 = (xxx*)ptr;
/* aligned code */
} else {
/* unaligned code */
}
745デフォルトの名無しさん:02/07/04 16:24
アフォすぎヽ(´д`)ノ
746デフォルトの名無しさん:02/07/04 16:49
              ∩
             | |
             | |
             | |
             | |
       ∧_∧  | |   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
      ( ´Д`)/./  < 先生!バカがいます
      /     /    \___________
      /     /
  __| |     | __
  \   ̄ ̄ ̄ ̄ ̄   \
  ||\            \
  ||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄
  ||  || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
     .||              ||
747デフォルトの名無しさん:02/07/04 18:16
>>743
というか、普通に考えたらASCIIとEBCDICと同時に使えないような
気がするんだけど、文字コードがアスキーだというのは
いったい誰がどこで定義するんだ?
LANG=Cだとアスキーコードなの?
>>747
> というか、普通に考えたらASCIIとEBCDICと同時に使えないような
> 気がするんだけど、
誰がASCIIとEBCDICを同時に使おうとしてるの?
Cの仕様では文字コードはASCIIとは限定していないし、
某汎用機のCコンパイラはEBCDICコードに対応している。
しかしすげえな〜このスレは。
11日しか経って無いのにもうレス700・・・
>>748
> 某汎用機のCコンパイラはEBCDICコードに対応している。

昔から気になってるんだけど、その処理系のisascii()は何を返すんだろう。
751デフォルトの名無しさん:02/07/04 20:44
>>750
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/isascii.3.html
isascii()
はcが、ASCII文字セットに合った7ビットの unsigned char であるかを調べる。この関数はBSDやSVIDが拡張したものである。

とのことだから、値がASCIIのコードに合っていればいいんじゃないの?
>>749
初心者板に行ってみな。もっととんでもないスレがあるから・・
>>750
Cの標準関数にはisascii()などという関数は存在しません。

751も
> この関数はBSDやSVIDが拡張したものである。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
を無視して勝手な推測をするな。
754751:02/07/04 20:52
>>753
あ、ごめん。下の準拠ってところにANSI-Cと書かれていたから準拠なんだと思った。
他の関数のことだね。というかそこにもBSDや・・・と書かれているし(鬱
>>753
それを言っちゃだめ(w
質問です。
標準入力より入力された文字を見えなくして、取得するための関数はありますか?
getc(stdin)やscanf系を試しましたが、いずれも入力した文字は目に見える形で
取得されているようです。ないと思いましたが不安になったもので。よろしくお願い
します。
757デフォルトの名無しさん:02/07/04 22:27
>>756
(゚Д゚)ハァ?
質問の意味がわかりません。
文字を見えなくして?(゚Д゚)ハァ?
getpass()みたいなやつのことだろ
759shige:02/07/04 22:30
ローカルエコーを抑制したいんだろ。suのパスワード入力の際みたいに。
簡単にやるなら、cursesでnoecho()呼べ。
760757:02/07/04 22:32
>>758-759
俺だってそれくらいのことは想像がつく。
いいかたがわるかった。
ようは相手にわかるように質問する力をつけてほしいのだ。
761デフォルトの名無しさん:02/07/04 22:39
へロンの公式のソースプログラムの書き方をC言語で教えて下さい。
超初心者な質問で申し訳ないですが、お願いします。
>>761
宿題お断り。
763デフォルトの名無しさん:02/07/04 22:57
つまり、EBCDICだろーとACSIIだろーと
atoiに放り込めば数値がゲットできるってーことか。
さっそく試してみるか。

できなかったらころす
>>761
ヘロンの公式を教えろ。
>>763
アフォかw
ヘロンの公式をCで書く方法を教えろ。
教えなかったらころす。
>>761
double helon(double a,double b, double c){
double s = (a+b+c)/2 ;
return sqrt(s*(s-a)*(s-b)*(s-c)) ;
}
768デフォルトの名無しさん:02/07/04 23:02
>>766
( ´,_ゝ`)プッ
769767:02/07/04 23:05
げげ、heronか
>>767さんは命が惜しかった様子。(w
映画だとこういう場合767だけが殺られる罠。
772761:02/07/04 23:11
>>767のソースプログラムが正しいのでしょうか?
>>761さんには宿題と見抜かれてしまいましたが、
マジでお願いします。
本当にすいません。
>>772
君はヘロンの公式が何かしらないのか?
宿題は宿題スレにいけ、殺すぞ!
>>767のソースプログラムが正しいのか?
>>761には不覚にも見抜かれてしまったが、
まあ教えてくれや。
教えなかったら頃すぞゴルァ!!
775デフォルトの名無しさん:02/07/04 23:18
>>765
ちょっと待ってクダサーイ。
どうしてそこで笑うデスか?

理由をおしえないと ぶちますよ?
C言語使いは物騒デスネー
777767:02/07/04 23:19
近似的には正しい。安心しろ
ただへロンのスペリングは間違っている。
ネタで物騒な言葉を使ってもやっぱりウソはウソと見抜かれて
しまう。このスレの住人はなかなか優秀じゃのう(w
779尻めつれ:02/07/04 23:28
atoi とは ASCII to Integer とかそんな感じの略だと思うんですが
それにしたって 「アスキーじゃないとだめ」 なんてのは
man見ても載ってないし。

そもそも文字コードの「前提」ってやつは 処理系のどこで
どう定義されてるんですか ってのが
誰も応えられないのはいったいぜんたいどういうことなのか。

これがわからないと自分で変換プログラムを書かないとならないので
面倒くさいけど、てゆーか、もう書いちゃったんだけど、くやしくて
車輪の再開発って気に入らないってゆーか。

これから誰を信じていけばいいの? おしえて。
> 誰も応えられないのはいったいぜんたいどういうことなのか。
まともなプログラマは、みんな「答えられる」から。
>>779
locale
char arr[] = ""; ...

char arr[] = "";
or
char arr[] = {'\0'};
で、空文字列を格納する配列を
宣言できるらしいですけど、
空文字列の使い道ってあるんですか?

実際宣言することなんてあるんでしょうか・・・・?
783デフォルトの名無しさん:02/07/04 23:43
>>782
ないから安心しろ。
>>781
ロケールでEBCDICを使いたいときはどうすればいいの?
>>784
EBCDIC をサポートしている処理系を使う。
>>785
LinuxでEBCDICをサポートしてるディストリビューションってある?
787デフォルトの名無しさん:02/07/05 00:04
>>786
ない。
>>787
じゃー どのみち もーだめじゃん
もう しぬしかない・・・
しぬなんてかんたんに口にしちゃいけない
いきるのです
790デフォルトの名無しさん:02/07/05 00:14
mallocで外部メモリから空きを得ることはできるのですか?(FDなどに)
>>790
まず、メモリとはなんぞ輩やり直し。
792:02/07/05 00:15
正解標準のういんどうずがasciiなんだから、これからはasciiだろ
海栗コードは?
できない。ヒープ領域で無ければならない。
>>791
二次記憶(secondary memory)って知ってる?
796デフォルトの名無しさん:02/07/05 00:36
C言語のプログラムをWindows上でPascalに変換するソフトはありませんか?
CとPascalっていうとこのページを思い出します
ttp://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.8.2.html
798デフォルトの名無しさん:02/07/05 00:42
C使いがh抜きなんかするな。
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.8.2.html
ごめんちゃい
800デフォルトの名無しさん:02/07/05 00:43
>>797
そこの管理人は生意気だから嫌いだけど、それはワラタ
802デフォルトの名無しさん:02/07/05 06:47
test
803コンパイラさんへ /* とりあえずgccのみ */:02/07/05 07:32
#define 初心者です。よろしくお願いします
#define B.Kernighanマンセー
#define D.Ritchieマンセー
#define R.Stallmanは神!
#define J.Gosling逝ってよし!

#undefine<microsoft.h>

#define …<stdio.h>???      /* 見えてねーよな?*/

main(コンパイルして下さい) /* ったくよー、めんどくせえなー */
{

表示してね("hello, world\n");  /* 分かんねーんだよ */

retune コンパイラさん、今日もいかしてますね(はぁと;

}
>>803
発作?
これよりココは、>>803を焼き殺すスレに変わりますた。
806デフォルトの名無しさん:02/07/05 13:32
void Func(LPSTR str);

#defineA( str) Func( "str" )

A(hogee);と記入すると、Funcには"hogee"ではなく"str"が渡されてしまいます。
マクロで"hogee"を渡す方法ってありますか?
#define A(x) (Func(#x))
808806:02/07/05 13:40
>>807
それだと、Func(hogee)になってコンパイルエラーになりませんか?
809806:02/07/05 13:41
>>807
失礼しました。
勘違いしました。
早速試してみます。
810806:02/07/05 13:50
うまくいきました。
ありがとうございました!
811806 ◆GpSwX8mo :02/07/05 14:00
>>810
………。誰?

>>807
やっぱり警告が出るんですけど…?
なんつー警告?
>>811 やっぱり警告が出るんですけど…?
おまえ失礼な奴だな
FuncをLPSTRじゃ無くてLPCSTRにしてホスィ・・・
815 ◆GpSwX8mo :02/07/05 14:45
ホスィのか
しろよ
817新米 ◆jH.6d5ig :02/07/05 17:34
VC初心者です。

for(i=0;i<=100000;i++)
{
printf("%d",i);
}
ってやると100000が表示されるまで何にも受け付けてくれないのですが
もしこの表示中にexitと入力してエンターすれば
表示がそこでとまる、というプログラムを作りたいときは
どのようにすればいいのでしょうか?
処理をしながら別のところでは別処理をするプログラムを作りたいわけです。
>>817
スレッド。kbhit。getch
819新米 ◆jH.6d5ig :02/07/05 17:42
>>818
即レスthx。
getchって入力待ちの時に使う奴ですよね・・
kbhit・・・? スレッド・・?2ch用語ですか?
新米獅子舞てんてこ舞い
どのスレでも「スレッド」って言うと2chの掲示板のスレと勘違いする人がいるよね・・・
初心者の質問に答えてるとき、どうも話がかみ合わないなーと思ったら
その勘違いをしながらずっと話を進めてたっていう・・・
823新米 ◆jH.6d5ig :02/07/05 17:50
(;´Д`)ハァハァ
824新米 ◆jH.6d5ig :02/07/05 17:51
googleで調べてみます・・・
825デフォルトの名無しさん:02/07/05 17:58
f分布のパーセント点を(自由度1、自由度2、危険率)から求めるプログラムを教えてください。

この逆は奥村晴彦さんが書かれた「C言語によるアルゴリズム事典」から調べたんですけど…
思うように出力されないです(TT)
質問れふ
C言語で大抵の事が出来ると聞いてるのですが、
テトリスあたりの簡易ゲームも作れる事が出来るのですか?
それとC言語関連の資格試験があったら教えてください
827756:02/07/05 21:54
>>757
スマソ、UNIXパスワードみたいに見えない形といったほうが分かりやすかったようです。
>>758-759
サンクス、ためになりました。

その後調べてみたのですが、_getch()で思うような操作ができるようになりました。
お騒がせしてしまってすみませんでした。(getche()が、scanf系やgetchar()と同じく
目に見える形になる)
828デフォルトの名無しさん:02/07/06 00:44
>>826
できる。
>>756
犯罪の匂いがする。
830デフォルトの名無しさん:02/07/06 06:20
すいません、質問です。
おとといくらいからC言語の勉強を始めたのですが、本を読んでる間
貧乏ゆすりが止まりません。どうしたらいいですか?
>>830
入院してください。
>>830
つま先ではなくかかとを付くようにして下さい
833 :02/07/06 09:13
文法は超基礎はマスターしてますが、いままで100行程度のプログラムしか書いたことありません。
そんなどーしょうもない俺が1,000行、約2,000ステップのプログラムを1週間後までに修正できる実力をつけるためにはどうしたらいいでしょうか?
修正なら思ったほど難しくない。
でもなぁ、人様の書くソースはくせありまっせ。
>833
るーぷあんろーりんぐとコピペの練習(ワラ
>>835
「1,000行、約2,000ステップのプログラムを作れるようになりたい」と
勘違いしているヴァカ発見。

>>833
「1,000行、約2,000ステップ」ってどういうこっちゃ ?
>>836
妄想で補ってください。

できなければ右脳を鍛えてください。
まさか、
/* comment */
a=b; b=f(c) ; c=g(a);
みたいなコードなのでわ……
>>838
見事にすべてを破壊してますな。
840 :02/07/06 14:45
for文で3600回まわして使っているんですけど,
そのなかでif文を4つくらい使っているのですが,
これをなくすためにgoto文を使おうと思うのですが,
他の方法(文が読みにくくなるけど,elseつかったりしてなんとかしる)を取った方が良いですかね?
goto文つかうとどうifが無くせるのでつか?
842デフォルトの名無しさん:02/07/06 14:49
>>840 mono ni yoru
(gomen totsuzen IME ga sinda)
もしかして
for(){
if(・・・) goto aaa;
if(・・・) goto aaa;
if(・・・) goto aaa;
if(・・・) goto aaa;
aaa:
}
とかやってんじゃ・・
844 :02/07/06 14:52
data=tel(hairetu[i][j]);
if(data==1) No=1;
if(data==2) No=2;
if(data==3){
if(-------){
 if(-------){
   if(-------)
   else if(------)
 }else{
  }
}

switchつかったほうがいいのかな?
if(data==1){
No = 1;
continue;
}
if(data==2){



とか。
ごめん。if文の下で
表示関数(Src[No]);
ってやってるの
do {

if (xx) break;

} while(0);

を覚えなさい
やってくれる
ってか
for
 for
  do{
      }while(0);
にしている人どのくらいいる?
do{}while(0); 使うくらいなら goto つかう
do{}while(0);
???
do{}while(0)はマクロでよく使うなあ
>>851 どんな場面で使うの?
>>852
マクロ内に複雑な文を入れたいとき do/while で囲むと吉
あーなるほどです。breakも使えるし、いいっすね。
hairetu[i][j]の内容ってNoとどんな関係なの?
配列の順番でNo決めるのか?
856デフォルトの名無しさん:02/07/06 18:14
*( *(hairetu + i) + j ) = hairetu[i][j] だっけ?
*( *(hairetu + i) + j ) == hairetu[i][j]だな
>>856 オイオイ
*( *( hairetu + j ) + i ) == hairetu[i][j]
だろ
>>858
変だぞ?
*( hairetu * i * j ) == hairetu[i][j]
だろ?

もとい!!
*( hairetu + i * j ) == hairetu[i][j]
お前ら・・・わざとだろ。
863デフォルトの名無しさん:02/07/06 18:53
>855
Noって何だ.
864デフォルトの名無しさん:02/07/06 18:54
メモリ上でどう格納されているか理解してれば間違いようが無いと思う今日この頃みなさまお元気ですか?
>>860-861
馬鹿か?
*( hairetu + i + j * w)だろ。
でも、>>858が正解
>>864
>>855の情報だけでは何とも言えない。これ答え。文句あっか!
俺もう駄目かも。。。。
868デフォルトの名無しさん:02/07/06 19:12
>>865
馬鹿か?
メモリ配置は理解出来るが式が思いつかなんだ。。。
大体、>>844の質問って何?
分岐をシンプルにしたいって事?
ループ以外でのi or jに加減算なければアホなレスもOKでは?
>>860-861はネタ
>>858=865は真性

ということでよろしいか?
おいおい
j[i[hairetu]] == hairetu[i][j] だがな
>>870
いや、ネタじゃないで。。。(本人。。)
ネストしたループしか考えてなかった。。。。
>>871
どこからjとiの配列が出て来るんや。。。。。。。

>>873よく考えろ
"abcde"[i]とi["abcde"]は等価
はあ??ここは「数学スレ」か?
「C言語」のスレでは??
頃しますよ
>>874
って言うかそれ出来たら言語的にすごい気がする。
これ指向で誰か仕様考えない?
>>877
Cは言語的にすごかったのですね。
>>877
出来たらつか、出来るんだ。
x[y]の形式は x + yと等価だから、y[x]でも同じ事
>>879
だから!「言語的に」だって!!
言語的ってなんだ?
>>879
xが基準。yがオフセット?
てか、何がすごいんだ?
>>871 本当だ。初めて知りますた。
885デフォルトの名無しさん:02/07/06 20:05
マクロfoo

#define foo(x) {\
/*ほげほげ*/ \
goto XXX; \
/* ふがふが */ \
XXX: \
}

を複数回使ってもコンパイラに文句を言われないよう、XXXに __LINE__ か何かを
くっつけたいんですが、どうやったらできますか?

こんなマクロ駄目とかgoto使うなってのはナシで。
>>885
こんなマクロ駄目。goto使うな。
#define foo(x)
do {\
 break;
} while(0)
#define foo(x) \
do {\
 break; \
} while(0)

\つけ忘れ。鬱だし脳
889デフォルトの名無しさん:02/07/06 20:11
>>888
マクロの中のforの2重ループから抜けたいのよね…
>>885
マクロにラベル文字列を指定する引数を追加するってのはどうだ?
コンパイルは通ったぞ。望み通りの動きをするかどうかは知らん。
891デフォルトの名無しさん:02/07/06 20:13
>>890

goto XXX##str;

XXX##str:

でいいっけ?
>>891
ええんちゃう?
ただ、strに渡す引数は手作業で指定してやらないといけないけど。
(__LINE__等が使えない)
引数を展開してからじゃないと逝けないから、こうだな。

#define CONCAT2(x,y) x##y
#define CONCAT(x,y) CONCAT2(x,y)
#define foo() { \
goto CONCAT(xxx_,__LINE__); \
CONCAT(xxx_,__LINE__):; \
}
つぅか普通に関数にしろと。
は・げ・ど・う
896デフォルトの名無しさん:02/07/06 20:27
>>884
そうそう!良く考えたらそうなんだよね!
でもCのスレだからな。
ポインタに0入れてiもjも0なら「少し」は判るが・・・
(そりゃ無いけど)
> でもCのスレだからな。
とは?
898デフォルトの名無しさん:02/07/06 20:30
文法とかコンパイラの勉強か?
勉強熱心で若者なら有意義な質問かもね。
>>898
よかったな。向上心無しの技術者定年間近のおっさんはお前だけだ。
900 :02/07/06 20:33
>>855
for(i=0;i<100;i++)
for(j=0;j<100;j++)
No=tel(hairetu[i][j]);

#define tel(a) (a)&(1<<3)

ッてな感じです
901デフォルトの名無しさん:02/07/06 20:34
>>898
こういうので遊べるってのもプログラマの素養の一つだろ。
902デフォルトの名無しさん:02/07/06 20:41
>>897
ポインタに0が入るロジックあるのか??
いや、CでできることをCのスレで語ってるのに
> でもCのスレだからな。
ってのは変だなと思って。
904デフォルトの名無しさん:02/07/06 20:58
>>903
う〜ん。それ言われるとなーー
でも、それだと数学的になり過ぎて、
収集つかないような気がする・・・
>>904
なぜこの流れで数学なんて言葉が出てくるんだ?
906デフォルトの名無しさん:02/07/06 21:14
>>904
>>871の解についてや!。
int num;

num|=2<<20;

printf("num=%d\n",num>>20); //2
printf("num=%d\n",(num&printf("num=%d\n",(num&2097151)>>20); //2

のはずなんですが,最後の&したあとにシフトさせるのが,0になってしまいます。
上のプリント文は,2が出るのに,なんで下のプリント文では,2が出ないんでしょうか?
int num=0;

num|=2<<20;

printf("num=%d\n",num>>20); //2
printf("num=%d\n",(num&printf("num=%d\n",(num&2097151)>>20); //2

のはずなんですが,最後の&したあとにシフトさせるのが,0になってしまいます。
上のプリント文は,2が出るのに,なんで下のプリント文では,2が出ないんでしょうか?
int num=0;

num|=2<<20;

printf("num=%d\n",num>>20); //2
printf("num=%d\n",(num&printf("num=%d\n",(num&2097151)>>20); //2

のはずなんですが,最後の&したあとにシフトさせるのが,0になってしまいます。
上のプリント文は,2が出るのに,なんで下のプリント文では,2が出ないんでしょうか?
>>20を参照したやつ素直になのれ
>>907
とりあえずnum&2097151==0だ。
何がやりたいのかよく分からんが
2097151==0x1fffff
2<<20==0x200000
2<<20
で21ビット目が埋まる?
22ビット目だろ
int num=0;

num|=2<<20;

printf("num=%d\n",num>>20); //2
printf("num=%d\n",(num&printf("num=%d\n",(num&2097151)>>20))))))))))))); //2

のはずなんですが,最後の&したあとにシフトさせるのが,0になってしまいます。
上のプリント文は,2が出るのに,なんで下のプリント文では,2が出ないんでしょうか?

足りなそうだったので付け加えてみますた。
916909:02/07/06 22:56
ガクガクブルブル
関数の引数に
kansuu'const char a)
{
 return a+1;
}

のようにconstってよく付けますか?
つける場合プロトタイプ宣言の方にも付けた方が良いでしょうか?
関数の引数に
kansuu'const char a)
{
 return a+1;
}

のようにconstってよく付けますか?
つける場合プロトタイプ宣言の方にも付けた方が良いでしょうか?
>>918
関数の引数に'はつけたことがない

constもポインタ引数にはつけるが値渡しにはとくにつけない。
920木村 キタキタマシーン:02/07/07 01:49
よくは付けません
プロトタイプ宣言にも必要です
921デフォルトの名無しさん:02/07/07 02:07
>>917>>918
もれのコンパイラではつけないとわー人グ出すよ
>>919-921
ありがとん

夜はいろいろな名前の人がいて楽しいのら(徹夜でおかしくなり気味)
923デフォルトの名無しさん:02/07/07 02:24
いっぺんの長さを入力すると、その正方形の面積を返してくれる
サーバーをプログラムしたのですが、どうやってそのサーバに
長さを送ったらいいのでしょうか?
ちなみにそのプログラムは自分のPCの中においています。
telnetで送れるらしいのですが、いまいち分かりません。
924デフォルトの名無しさん:02/07/07 02:25
>>923
だから、以下略
925デフォルトの名無しさん:02/07/07 02:27
>>924
もしかして、既出ですか?
926デフォルトの名無しさん:02/07/07 02:53
AIBOはC++で動いているという話を聞きました。それで、これからの将来にドラえもんのようなロボットをつくりだすのもC++だということを聞いたのですが、それは実現可能なのでしょうか??
>>926
ドラえもんの方はどこで聞いた?
928デフォルトの名無しさん:02/07/07 03:00
>>926
これからはHSPが主流
>>927
「C++の将来」スレでそういうネタがあったんだよ。
930デフォルトの名無しさん:02/07/07 03:06
int型の整数を文字配列としてChar型の配列に入れたいときは
どうしたらよろしいのでしょうか。
931デフォルトの名無しさん:02/07/07 03:12
>>930
暇なんでマゾレス。
itoa
932デフォルトの名無しさん:02/07/07 03:17
>>931
なるほど。ありがとうございます。
では、w型をCharにかえるにはどうすればよろしいのでしょうか。
何度もすいません。
>>931
itoa()は標準にはない。
sprintf(buf, "%d", i)
934デフォルトの名無しさん:02/07/07 03:19
>>932
w型ってlongのことか?
ltoa
>>932
w型ってなんだ。あとCにCharというのはない。
936デフォルトの名無しさん:02/07/07 03:28
>>932-935
ありがとうございました。
sprintfで解決しました。
>>923
ウェブサービスのサーバ?
938デフォルトの名無しさん:02/07/07 06:15
サーバープログラミングなのですが、一人がコネクトした状態では
「待って」というメッセージを送って、2人コネクトして初めて
メインの処理が始まるようにしたいんですが、どういう構成でいけばよろしいでしょうか?
>>938
一人がコネクトした状態では「待って」というメッセージを送って、
2人コネクトして初めてメインの処理が始まるような構成にしてはどうでしょう?
>>938
一人がコネクトした状態では「待って」というメッセージを送って、
2人コネクトして初めてメインの処理が始まるような構成にに僕も賛成です。
>>938
s = socket()
bind(s, addr_and_port)
listen(s,...)
s1 = accept(s)
send(s1, "待って", ...)
s2 = accept(s)
main(s1, s2)

ぐらいでいいと思うが。3人目来たらどうするかとかは知らんけどさ。
あと当然ながら、エラー処理は言うに及ばずクローズ処理や Windows
なら必要な WSA...() は書いてねーからそのつもりで。
s2をacceptした時点で、close(s)すればいいんでないかい?
943941:02/07/07 10:17
>>942
3人目を受付ないならね。そう言う仕様かもしれないし、3〜4人目をセットにし
て同じような処理する仕様かもしれないしね。
要は、「そこの仕様が不明確だよ。」って言ってるだけ。
terminal の行数を得たい場合はどうしたらいいですか?

% echo $LINES では行数を得られるのですが、環境変数ではないようで、
getenv("LINES") ではだめなんですが。
945944:02/07/07 12:18
すみません、環境は Linux(Debian) です。
946デフォルトの名無しさん:02/07/07 16:51
age
947デフォルトの名無しさん:02/07/07 17:26
man 4 tty
/TIOCGWINSZ
948デフォルトの名無しさん:02/07/07 17:42
se/

dialogon/open.
%1-dialogaaa
949シロウト:02/07/07 18:04
関数を作るときに
if ( (fp = fopen ("omanko","w" ) )!=0 ) {
printf("Can't open");
exit(1);
}
↑の場合どうすればヨイのですか?
FILE Fopen (*fp) {
if ( (fp = fopen ("omanko","w" ) )!=0 ) {
printf("Can't open");
exit(1);
}
}
とかにすりゃいいんすかね?
とりあえず、コンパイルできないじゃん。
#include <stdio.h>
#include <stdlib.h>

void Fopen(FILE **fp);

void Fopen(FILE **fp)
{
if((*fp = fopen("omanko","r"))==NULL){
printf("cant open");
exit(1);
}
}

main()
{
FILE *fp;
char buffer[255];

Fopen(&fp);
while(fgets(buffer, 254, fp))
printf("%s\n",buffer);

return 0;
}

こんなのとか。
>>949
そんな君に送る単発質問テンプレート

「何」を、
「こう」したいので、
「こう」書きましたが、
「こうなって」しまいました。
どうすればよいでしょうか?

鍵括弧の所を適宜書き直して使ってくれ。
>951
エラー時にFopenでexitするの?
>953
まあ、オリジナルに近い形でつくってみますた。
955949:02/07/07 18:27
949を、
こうしたいので、
こう書きましたが、
こうなってしまいました。
どうすればよいでしょうか?
>>955
>949を、
>こうしたいので
ハァハァ
957949:02/07/07 20:23
>>955は漏れジャネーッス

fopenを関数にしたかったんすけど
void FileOpen (??????)
の?部分と
呼び出す際の
FileOpen(??????)
の?部分がわからなかったのです。

糞厨でスマソ
958デフォルトの名無しさん:02/07/07 21:19
>>957
偉い。本当にテンプレートを使用してくるとは・・・

最近は、こういう書き方するとすぐ突っかかってくる奴等
ばかりだからな。感心感心(いや、マジで)。

まず、fopen 自体が関数だって事は理解してるよね。
で、それを使用してエラーをはじく機能を追加した
自作の fopen (=Fopen) を作りたい訳だ。

まあ、普通(あまり細かい事に気を遣わずに)に書くなら

FILE* Fopen(char *filename,char *mode)
{
    FILE *fp;

    if((fp=fopen(filename,mode))!=NULL){
        printf("Can't open");
        exit(1);
    }
    return fp;
}

int main(void)
{
    fprintf(Fopen("omanko","w"),"hello world\n");
    return 0;
}

で、いいんじゃない?
int main()
{

return EXIT_SUCCESS; //(゚ω゚=)
}
>>958
まあ、言いたいことはわかるけど、何でプログラムの動作まで変えるん
だ ? こんな書き方すると...
while(fgets(buffer, 254, Fopen("omanko", "r")))
 printf("%s\n",buffer);
とか書きかねないぞ。あと今回は固定文字列だからいいけど、
printf("helo world\n"); は、printf("%s", "hello word\n"); にし
た方がいいと何回も言われてるのに、学習能力の無いアフォですか ?
961デフォルトの名無しさん:02/07/07 21:57
>960
何故にわざわざ「あまり細かい事に気を遣わずに」と
断り書きをいれたか分からんのか?

読解能力の無いアフォですか ?
In Article 960 (以下略)
>> printf("helo world\n"); は、printf("%s", "hello word\n"); にした方がいい

はつみみです。
963デフォルトの名無しさん:02/07/07 22:03
>>960
とりあえず、教科書では

printf("%s", "hello world\n");

ではなく、

printf("hello world\n");

と書かれている理由をじっくり考えてみるヨロシ。
964!=960:02/07/07 22:03
>>961
悪いけど、俺にとっても
> fprintf(Fopen("omanko","w"),"hello world\n");
はとても細かいこととは思えない・・・
965949:02/07/07 22:04
ケソカハヤメテ!!
>>963
著者がそろいもそろってバカばっかだからだよ。
なるほどなるほど、例えばint nを表示したいときに
printf("n=%d\n",n);
ではなくて
printf("%s%d%s","n=",n,"\n");
としたほうがいい訳だな


バ カ ァ ?
968偽551:02/07/07 22:11
>>961
ププ、簡単につれるねぇ。なんだあんたは、「細かいことに気を遣わないと」もと
のプログラムと動作が変わっちまうんのか ?
まあ、もともと「普通に書くなら」ああいうプログラムスタイルになる奴になに
言ったって無駄だけどな。

>>962
失礼、このスレじゃなかったかも知れん。「まあ、
printf("%%% hellow world %%%\n"); とかしたい時まずいだろ ?」って話だ。
フタリヲトメテ!
>>270
次スレよろしく
>>968
偽551ハケーン!!
確かに、普通に書いてあーなるのはちょとどこかおかしいかも・・・
>>971
結局、説明の力点を何処に置くかって事だろ。
説明したかったのは Fopen についてだけで
main はあくまでもオマケ。
コンパイルして実行してみたいだろうからね。

確かにちょっとおかしいと感じるのも分かるけど
動作に支障が無ければ短いほうがいいと考えただけ。
(結構 Lisper の血が流れているのかもしれん・・・)
次スレれふ。
C言語なら、俺に聞け! <26>
http://pc.2ch.net/test/read.cgi/tech/1026048820/l50
ワタシノタメニアラソワナイデ!
975969:02/07/07 22:45
>>974
キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
976 :02/07/07 22:50
callocうっとおしいので、削除しちゃっていいですか?
977デフォルトの名無しさん:02/07/07 22:55
>>960
あんた、「どんな文字列が入っているのか分からないものをprintfのフォーマット文字列に指定してはならない。」ということと勘違いしていないか?
定数ならなんの問題もないだろ(第一、"%s"だって定数だし・・・)。
>>968
> とかしたい時まずいだろ ?」って話だ。
しねーよ馬鹿(ワラ
(;´Д`)/ <  先生! 危険なので>>968にはprintf/sprintf系関数禁止令を出して下さい!
よっしゃぁ!!
やっと前スレ埋まったよ。
次は、ここだな。
おめーら、早く次ぎいけ

C言語なら、俺に聞け! <26>
http://pc.2ch.net/test/read.cgi/tech/1026048820/l50
   ⊂⊃
    ∧∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄
   ( xДx)< デブ川俣は昇天・・・
  |⌒|U U   \_______
  川 |   |
    U U
   ∫

984(・∀・):02/07/09 01:41
埋めー
985985:02/07/09 01:42
985     
986(・∀・):02/07/09 01:43
(・∀・)ウメウメ
987(・∀・):02/07/09 01:43
埋め血前!!!
988(・∀・):02/07/09 01:46
(゚∀゚)ノ アヒャ
989(・∀・):02/07/09 01:46
ヽ(゚∀゚)ノ アヒャヒャ
990990:02/07/09 01:48
990!
991(・∀・):02/07/09 01:49
9   さて、と…
992(・∀・):02/07/09 01:50
8  埋めー
993(・∀・):02/07/09 01:51
7   (・∀・)ニヤニヤ   
994(・∀・):02/07/09 01:51
6                                 
995(・∀・):02/07/09 01:52
5          
996(・∀・):02/07/09 01:54
4。。。     (・∀・)ニヤニヤ
997(・∀・):02/07/09 01:56
3。     
998(・∀・):02/07/09 01:57
2。          
999(・∀・):02/07/09 01:58
1!!!!!!!!!                         
      __     
     l⊆⊇`ヽ ≡  ヤホーイ
     (´D`Lノ ≡
    m=○=mノ) ≡
    _/_/(「_ノニコ ≡
     ( (0)=(__)0) ≡(´⌒(´⌒;;
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。