hayasugi
すべて→全て→ぜんて
>>1 って「全て」を「ぜんて」と読むと思ってる人なの?外国人?
>>5 ネタだYO!!(w
#マジレス カエシチャ ダメ ダッテ
7 :
デフォルトの名無しさん :02/02/18 10:13
愚問一発お答えください。 「明解c」を読んだら普通はどれくらいのレベルのソフトが作れるんですかね? この1冊でフリーソフトで公開できるくらいのものが作れるんでしょうか?
>>7 フリーソフトって、いろんなレベルがあるしなぁ。
>>7 どれくらいってのがどんなもんか分からんけど
Hello、Worldだってフリーで出そうと思えば出せるっしょ。
君の事を知らないんでなんだけど
基本的に入門書一冊読んだくらいでは無理。
10 :
デフォルトの名無しさん :02/02/18 10:36
>>8-9 どうもありがとう。
他にどんなことしていけばいいですかね?
「明解c」にはifとかwhileとかの説明は載ってますが
ある程度のプログラム?の作り方とかは書いてないみたいなんですけど・・・
K&R読んだら作れるんですかね?
>10 なんか根本的にカンチガイしてないか
>>10 K&R読んだら作れるようになるということはないよ。
演習問題を解くのは力になると思うけど。
ソース公開されてるソフト探して
解析したり改良したりするのがいいんじゃない?
13 :
デフォルトの名無しさん :02/02/18 11:06
>>11-12 違うんです。文法を覚えた後の設計図?みたいなのの書き方はどうやって身に付けていくんですか?
だから
>>12 の言うように
他人のソースをいっぱい読め。
で、なんでもいいから作り倒せ。
設計図と言うとUMLとかあるが
それを勉強するとC++とかJavaとかに手を出したくなる罠。
15 :
デフォルトの名無しさん :02/02/18 17:48
age
16 :
デフォルトの名無しさん :02/02/18 19:35
厨房な質問すいません。 本なんかを見たのですが、今ひとつ構造体と共用体の差がわかりません。 教えてもらえないでしょうか?
>>16 構造体は普通に構造体。
共用体は、メンバがメモリを共有する。
例) union { int x; int y; }; だったら、 x を書き換えると y も変わる。
絶対unionじゃなきゃいけないって理由でもない限り、普通はunionは使わない。
共用体はレジスタの定義とかで使うくらいだね。
union little_endian_word { char low_byte; char high_byte; struct{ short word; }; }; こんな感じかな。
>>17 unionじゃなきゃいけない場合っていうのはどんな時でしょうか?
ごめんなさい。
>>18-19 よくわかりません。ホントすいません。
使えるメモリがかぎられてるときとか?
正直、16にはunion要らないとおもう。
俺は通信絡みでよく使うなぁ。 struct Hoge { int foo1; int type; ← ここの値によって、この後のフォーマットが変わる! : }; こういう時、 struct Hoge { int foo1; int type; union { struct Hoge1 hoge1; struct Hoge2 hoge2; : : }; みたいな。 そういや X Window System のイベント構造体もこんな感じになってる。
メモリを使うのが限られてたり通信絡みの関係で使うんですか。 難しいですが、うっすらとわかったような気がします。 ありがとうございました。
最近C言語の勉強を始めたのですが、エラーの意味が分かりません ~c 19: illegal character ってどういう意味ですか?
26 :
デフォルトの名無しさん :02/02/19 00:05
>25 英語の辞書持ってないの? 英単語検索の仕方知らないの?
27 :
デフォルトの名無しさん :02/02/19 00:09
>>25 コンパイル中にレジストリが壊れたという警告です。
再起動した方が良いです。
28 :
デフォルトの名無しさん :02/02/19 00:13
>作ってわかるCプログラミング アマゾン見たら、「作ったがわからなかった」っていうレビューに ものすごく賛成票がついてました。 あんまり評判はよくないのでは?
29 :
デフォルトの名無しさん :02/02/19 00:15
>>28 作って「解らないことが」わかる
なのでは
>>28 賛成してる大部分は、読んでもいない 2ちゃんねらと思われ。
本自体はいいと思うんだけど、如何せん著者がね…
↑ついにそれを言ってしまったか・・・ 絶対にそうだね。他の票とあまりに差がありすぎるしね。
>26 意味は不正文って意味だと思うのですが、その前の19って19行目って事なんですか? >27 嘘つき! 初心者なんだから、何でも本気にするぞ!!
33 :
デフォルトの名無しさん :02/02/19 00:27
↑ワラタ
マジで泣くぞ・・・
36 :
デフォルトの名無しさん :02/02/19 00:31
37 :
デフォルトの名無しさん :02/02/19 00:32
|| ∧||∧ ( / ⌒ヽ | | | ∪ 亅| | | | ∪∪ : : ‐ニ三ニ‐
+激しく満足+ | ̄ ̄| ┬┬ ∩ ≡≡ _ | ̄ ̄ ̄ ̄ ̄| | |(‘台‘) ∠ \ |;;;;... | \⌒ ̄⌒l ∩|/゚U゚| ⑩ |;;;::. | |bob |_| \||_||つ .(⌒|;;::.. . |⌒) |---|U | | |⌒⌒⌒⌒⌒⌒| | | | (_ノ _) . | ̄ ̄ ̄ ̄ ̄ ̄| | | | _______U ∪ ___|______|______(二(二)______
すぐAAで荒らさない。 本を読め、なければ買え。
いいもん、負けないもん 漏れ頑張る!
>42 38,39は俺じゃないし…
メガネが飛んだ 超初心者 のメガネが飛んでった 空の彼方の峠を越えて イカロス墜落株価も暴落 超初心者の右手に30円 明日の暮らしも定かでないが 5年後見据えて超初心者 が今 一人寂しく残された メガネケースを庭に埋め メガネのなる木に望みを託す これで将来ウッハウハ 「父さん愛ってホントだね」
>~c 19: illegal character どっか、大事なところが壊れてるとおもうけどなぁ…
CPUとか?
>>51 はっ!
お、俺の・・
男じゃ無くなっちゃった!
55 :
デフォルトの名無しさん :02/02/19 05:31
イリーガル→不正な キャラクタ→文字 19→19行目
56 :
日下部幼一 ◆YjtUz8MU :02/02/19 07:18
>バブー はつみみです;)
>>25 そろそろ勘弁してあげよーよ。
>~c 19: illegal character
エラーの意味は、何度も出てるけど「変な文字が入ってるぞゴルァ」
です。で、変な文字とは、大概全角スペースだったりします。
>>1 ・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html わ ,..-―-、
| /:::::::::::::::::l み
∩ /::::::::::::::::::::| ,、 ん
-―-、 |⌒ヽ/::::::::::::::::::::::| _/|ノ な
/´Y (´ヽ ,、 l: : : i::::::::::::::::::::::::|-―'´: :丿 大
,、 _し' l lヽJ/|ノ \: |∧/l/|ノレ : : : :/ 変
Y: : `ー`ー-―'´一': : | /: : : : : : : : : : ::i-‐'′ だ
\: : : : : : : : : : : : / /: : : : : : : : : : : | |
Y: : : : : : : : :r'´ /: : : : : : : : : : : :|
/: : : : : : : : : :| /: : : : : : : : : : : : |
/:: : : : : : : : : ::| / : : : : : : : : : : : : |
/: : : : : : : : : : : | /: ::_: : : : : : : : : :|
`77ー--┬r一'  ̄/ / ̄`ー-┬r-'
l'´) ├| l'´) |~|
し' (ニ⊃ し' (ニ⊃
59 :
デフォルトの名無しさん :02/02/19 14:32
どんどん書き込んでー
ここって、ascii-net, pcs時代からの怨念を引きずっている人が多そう。
61 :
デフォルトの名無しさん :02/02/19 18:48
C++のメリットとはなんぞや? ちょっとみてみたけど全然Cとはちがうし。 どこが便利なの? やっぱりC++やったほうがいいの?
>>61 STLが使える、あとオブジェクト指向プログラミングがしやすい。
>62 うちの職場に「C++はどこでも変数の宣言ができて便利」と言ってるヤツがいますが、 吊るして良し! ですか? でもたしかC99からできるんだっけ?
>>62 逆にJava、いやいやC#を薦めておあげなさい。
フォッフォッフォ・・・
>>64 出来ますね<C99。
けど C99 使えない環境ってまだまだ多そうだから、C++ を
C の拡張版と割り切って使う、ってのもアリだと思うけどな。
(勿論、人には「C++ やってるんですよ」なんて言えない)
最近C言語を勉強しはじめたんですが、 OSがMeなんでMS-DOSプロンプトのスクロールバーがなくてすごい不便なんです。 出来ればcygwinを使ってやっていきたいんですが、 何かいい方法ないですか? #OS替えるとかは無しで。
>>68 バックスクロールしたいのかcygwinのインストールの仕方が
知りたいのかはっきりせい。それによってgoogleでの検索ワードが
変わってくるぢゃないか。
すいません。 知りたいのはバックスクロールの方法です。
>67 一時変数ならブロックスコープ変数使え、って突っ込み入れたかったけど、 保守が大変になりそうなので止めたのでした。 C++はCのスーパーセットなんでそれもありだけど、 それを会社でやるとcoutでログ表示してC++使ってる気分になってる奴が増えそうで鬱。 # 俺だってこのくらいではC++やってるなんて言えない。 全然関係ないけど、 オブジェクト指向でオブジェクトをたくさん設計するなら、 データベース関連でいうテーブルの設計チーム(兼DBA多し)みたいのがないと、 まずプロジェクトがコケるかデスマーチの実地訓練になる、と思ってるのは俺の勘違いですか?
コマンドプロンプトを使いたくない人が良くやる方法はTeraTermで localhostにtelnet。
>>57 あなた神!
本当にありがとう。世の中にはいい人っているもんだね!
全角スペースが原因だったのか~。
間違いないはずなのにエラーになるから訳分からなかったんだけど、これで謎が解けた!
ありがとう!続き頑張ろうっと
> 間違いないはずなのに なんで初心者さんはこういう痛い思い込みをしてそれを平気で口に出来るのでしょうか。 少しは反省してみろと小一時間はめんどうだから言わない。
rxvtを使って出来ました。 でもteratermを使う方法も興味があるので調べてみます。 回答してくださった方々ありがとうございました。
ヘンなハナシを振らせてください。 gccやVisual C++6.0の実装のハナシだけど、 ifstream(fd)/ofstream(fd)でファイルディスクリプタを渡せますよね。 これでソケットやパイプに対してgetlineやマニピュレーターを適用できる。 (Visual C++だと_get_osfhandle()なんかでハンドル→ディスクリプタ変換) さあて、ここで、open/read/write/socket/pipeなんてのは POSIXでもANSIでもありませんよね。 あと、↓の仕様って妥当だと思うけど、これに外れる実装例ってあるのかしら。 ファイルがコンストラクタまたは open メンバ関数を使って開かれているときだけ、 ファイルはクローズされます。 あ、引数にもどしてないや・・・
「初心者というか、わたしにとっては、もう東京に来てからずうううっと 間違いないはずなのになんですよ。わたし、けっこう家族とか複雑 だったから、痛い思い込たちが家族みたいなものなんです。」
83 :
デフォルトの名無しさん :02/02/20 09:15
ハイソサエティー上げ
84 :
デフォルトの名無しさん :02/02/20 09:39
はい
ふぇい
最近くそ壁いないね・・・
87 :
デフォルトの名無しさん :02/02/20 11:26
スクでゲーム作りたいんですけど、何できればOK? Cで募集してるけど、Javaはダメかいね? Cならどの辺のレベルがいるわけ? 数学と物理バリバリじゃないと無理っぽいけど・・・ 3Dプログラミングってどれくらいの高校程度の物理と数学でいけるもん? 誰かシットル人おらんかね。
>87 FFなみのゲームつくれりゃOK
スクとは?
スクウェアじゃないの? おいらカンチガイしちゃった?
スクールみじゅぎでゲーム作るのは大変そうだが頑張れ。 出来たら俺も遊びたい。
>>87 > スクでゲーム作りたいんですけど、何できればOK?
> Cで募集してるけど、Javaはダメかいね?
Cにはスクはないよ。
Javaにはスクはあるけど、JavaとJavaスクは名前は同じだけど別の言語だよ。
とボケてみるテスト
>>87 >スクでゲーム作りたいんですけど、何できればOK?
シベリア抑留並みの苛酷な労働に耐えられること。
あと、このようなクソレスをしない常識。
94 :
デフォルトの名無しさん :02/02/20 12:25
>>87 MIT、ハーバードを好成績で出た奴しか無理。
もちろん、数学、物理ともバリバリでな。
この板にはそんな奴はいないので何を聞いても無駄ってもんよ。
>>92 > Cにはスクはないよ。
csh という選択もあるぞ。
96 :
デフォルトの名無しさん :02/02/20 14:00
VC++6.0アカデミックを近々購入したいのですが、 プロフェッショナルとスタンダードのどちらを 買えばいいのか悩んでいます。 Microsoftの製品の紹介を読んでも ちんぷんかんぷんです。 最終的にはDirectXを使った3Dゲームを 作りたいのですが、スタンダードは そこまでの使用に耐えますか? また、スタンダードに付属する初心者向けの マニュアルの使い勝手はどうなんでしょう。
十分
マニュアルはいきなり MFCの話題からはいってくる。 Windowsプログラミングがわかれば それなりに理解できると思う。
>97 スタンダードで十分ってことですか。 ならスタンダードを買います。 万一不満を感じるようになっても、 そのころには7.0が出てるかもしれないし。 >98 Windowsプログラミングは全然わかりません。 組めるのはDOSのプログラムだけです。 でもまぁ頑張ってみます。 ありがとうございました。では。
>>99 君の状態から見て、VCを買っても死蔵する可能性がかなり
高いと思われる。
まだ買わないほうがただしいとおもわれる。
>>99 >組めるのはDOSのプログラムだけです。
これはなんかマズーなよかん。
実は大して組めません、というオチが予想できると思われ。
#類例:Cは大学の演習でひとおおりやりました。
102 :
デフォルトの名無しさん :02/02/20 14:46
>また、スタンダードに付属する初心者向けの >マニュアルの使い勝手はどうなんでしょう。 マイクロソフトに多くを期待しない方が人生を豊かに過ごせます。
103 :
デフォルトの名無しさん :02/02/20 15:11
>>96 Visual Studio6.0のEnterprise版を買え。
アカデミックなら35000円くらいだろ。
105 :
デフォルトの名無しさん :02/02/20 16:35
>>103 Enterprise はデータベースがらみのプログラミングしたり、付属のエンタープライズ
ツール (Rational Rose のサブセットとか) 使わなければ要らんよ。Pro で十分。
vc6ならプロ版でも屋夫億とかで4Kぐらいで買えると思われ
107 :
デフォルトの名無しさん :02/02/20 22:51
>>79 >でもteratermを使う方法も興味があるので調べてみます。
やめとけ。多分キミのマシンにtelnetdはいない。
108 :
デフォルトの名無しさん :02/02/21 00:03
SEとネットワークエンジニアの違いを知りたい
109 :
デフォルトの名無しさん :02/02/21 01:09
>>108 そういう意味不明な質問をC言語のスレでしている君の非常識
がどういうふうになっているのか知りたい。
C言語でdelayの様な処理を遅くする方法(標準装備関数)ってありますか?
ネタってわかれよ。
>>110 delayってなんじゃろか~
おじ~いちゃんは、はつみみだ~
delayってなんじゃろか~
おじ~いちゃんは、はつみみだ~
delayってなんじゃろか~
おじ~いちゃんは、はつみみだ~
何の言語かは知らんけど、 delay(200)とかdelay(500)とか書いてプログラムの実行速度を 遅くする命令文です。(数字が大きいほど負荷がかかって実行速度が遅くなる)
>100-101 以前知り合いのVC++を立ち上げて、 その訳わからなさに畏怖したことがあるので、 VC++の恐ろしさについては理解しているつもりです。 とりあえずVC++を買うまでは、 「猫でもわかるプログラミング」でも読んで、BCCを使って Windows SDKのプログラミングについて学んでみます。 >102 そうします。 >103 欲しいのはVC++だけなので…。 >104 うげ、また選択肢が増えた。検討してみます…。 >106 検討してみます。いまヤフオクを覗いてみると、 VC++6.0 Enterprise Academic が最低\5000で出品されてました。 「勉強しようとして挫折した」からだそうです。他人事とは思えない…。 では。
迷惑な命令だな
>>115 わざわざ遅くしてるんだってば
マリオブラザーズで言うと亀が緑の時は(500)で赤になったら(200)にするとか
そうゆう使い方。
とりあえずスレッドの優先順位でも落としておけ。 SetThreadPriorityだぼけ
>>116 > 負荷がかかって実行速度が遅くなる
迷惑なのは「負荷がかかって」の部分だろ。どうでも良いが、ゲームプログラミング
でキャラクタの動きを遅くするためにビジーループを使うのは禁じ手だ。
そんなコードがあちこちにあったら、並行して実行されるゲーム全体のタイミングを
取れなくなる。
CPUのクロック下げれ。 環境にもやさしくてウマー
120 :
デフォルトの名無しさん :02/02/21 01:38
平行して実行しないから大丈夫です。
キャラクタが一つしか現れない、新感覚のゲームなのです。
つーか俺はただ初心者だからC言語で作ったプログラムをゆっくり実行させたいだけ・・
型落ちのパソコンで実行したらいいよ、うん。解決。
最近のマシンでも、BIOSの設定でキャッシュを全部OFFにすれば、ほほえましいくらい遅くなるよ。
√ ̄ ̄ ̄ ̄ ̄\ / ̄ | / / ̄ ̄ ̄ ̄ ̄\| | / | | / ` ´ | | / _ _ | 初心者の文字が目に入らぬか!! (6 つ. | | ___ | _ | /__/ | ⊃|房| | ___/ つ  ̄ ⊂ ⊃
>>122 世の森羅万象すべては気でなりたっておる。
人間気持ちの持ちようでなんとでもなるものです。
ゆっくりしていると念じればゆっくりしてるように感じられます。
>>122 デバッガで実行。で、ステップ実行に割り当てられたキーの上に消しゴムでも乗せておく。
>>113 delay()って、TurboCにあったような・・・
で、プログラムを遅くするような命令じゃなくて、
ミリ秒単位でウエイトするだけだったような・・・
デバッガでトレースすればよいだけの話しだったりして
ゲームの1動作ごとにgetcharを入れておく。 キーをかちゃかちゃする速度でゲームの速度は思いのままに。
>>131 初心者なのでデバッガを知らないと思われ。
そういえば昔のBASICには TRACE ON なんて命令があったな。 1行ごとに自動的にポーズするやつ。
>>133 まぁ、自分の開発環境も説明できないようなやつだからなぁ。
一般には、プログラムの特定部分の実行の様子を詳細にチェックしたい場合には
デバッガで
1. その直前にブレークポイントを設定
2. ブレークポイントに達するとデバッガが呼ばれる
3. 後はデバッガでステップ実行
して様子を追うんだが
>>122 の開発環境は何なんだ? VC6 とか gcc とか具体
的な処理系と動作プラットホームを書くと、より詳細な回答が得られる可能盛大だ
ぞ。
137 :
デフォルトの名無しさん :02/02/21 03:23
>名前:名前は開発中のものです。 投稿日:02/02/20 07:04 ID:SsD5xIm7 >「ozawa-ken」というタイピングソフト知ってますか? >ああいうのを作りたいんですけど、初学者が一から作るには何ヶ月くらいでできますか? >それと、何言語でつくられているかわかりますか? >名前:名前は開発中のものです。 投稿日:02/02/20 12:29 ID:??? >ozawa-kenはshockwaveじゃなかったっけ? >1ヶ月もあれば雛型(とりあえずタイピングっぽいもの)までは作れるでしょ。 >あとは、納得のいく形になるまで果てし無く仕上げていく。どちらかというと技術力よりもセンス。 >VC++とかで作ろうとするなら、もちょっと時間かかるかもね。 別スレで発見しました。C言語だったらどれくらいかかりますでしょうか?
>>107 > やめとけ。多分キミのマシンにtelnetdはいない。
cygwin にはtelnetd.exe sshd.exeがありますが…
>>137 √ ̄ ̄ ̄ ̄ ̄\
/ ̄ |
/ / ̄ ̄ ̄ ̄ ̄\|
| / |
| / ` ´ |
| / _ _ | 初心者の文字が目に入らぬか!!
(6 つ. |
| ___ |
_ | /__/ |
⊃|房| | ___/
つ  ̄ ⊂
⊃
>>137 Cだけで組むのか・・・。
もう、がんばれとしか言いようが無い。
がんばれ!
>>137 「C言語だったら」じゃなくて、「ハイソサエティハッカーの手にかかれば」
だろ?
多分、8時間あればプロトタイプができるだろう(勝手な予想)
なんたってハイソサエティだぜ?みくびんなよ。
143 :
デフォルトの名無しさん :02/02/21 15:43
ポインタはCを学ぶ人が必ずつまずくという大きな壁と言われますが、 僕は全くポインタにつまずいた覚えがありません。 要するに、メモリのアドレスを保持する変数ってだけでしょう? アドレスを直接に指定して内容にアクセスすることが可能になるわけですよね。 一体ポインタの何がそんなに難しいのか教えてください。 ひょっとして僕がまだポインタのさわりしか理解していないだけですか?
Spy++ってVC6Pro版についてます?
145 :
デフォルトの名無しさん :02/02/21 15:48
>>143 メモリとアドレスがわかっていたのならつまづかないですよね。
私もそうでした。
>>143 そりゃ良かったね、としか言いようが無い。
>何がそんなに難しいのか教えてください。
もっとC言語を理解できないアホが集まる場所で質問してください。
ここで聞いてもどうにもなりません。
二次元配列とかポインタのポインタとか 配列へのポインタとかポインタの配列とか そーゆーのがこんがらがる場合もありうる
148 :
デフォルトの名無しさん :02/02/21 16:02
farってのがわからないのですが、どなたか教えてください。
151 :
デフォルトの名無しさん :02/02/21 16:15
あるメモリー領域がalloc系関数で確保された領域かどうか判断する方法はありますか? 頭でプログラムの流れを間違いなく追うしかないのでしょうか。
>>151 一体どう言う状況でそういう必要性にせまられるのか、
まるで解りません。
>>152 必要性というか、間違っていないか判断したいだけです。
単に一つの変数に代入したくらいでは間違いませんが。
>>153 動的に確保した領域を指すポインターには特定の前置詞で始まる
名前をつけとけ。
終わり
>>152 機種依存の方法でよければ、アドレス見ればわかると思う。
>>156 そうなんですか?デバッグ中に使うだけなので機種依存でも大丈夫です。
Win+VC6.0pro,Linux+gccです。
そのばあいにしてもデバッガの仕事ではないのか?
>>159 ・・・・・・・
もしかして「デバッガ」って人間のことだと思ってない?
「デバッガ」って人間も指すよね。
164 :
デフォルトの名無しさん :02/02/21 18:35
C言語で作られたゲームで「これはすごい!」というのはありますか? また、そういうのが見れるサイトを知ってたら紹介してください。
165 :
デフォルトの名無しさん :02/02/21 18:51
みんなは「char」をなんて呼んでるの? 自分は「チャー」って呼んでるんだけど。「int」は「イント」。
キャラ
キャラって呼び方あったんだ。そっちの方が良い感じ。 チャーだとなんだか格好がつかない気がしてたんだ。ありがと。
これは? hoge
>172 ちゃんとカタカナでシャアって書けよ
スイマセン!C++ Builder に関するスレはないんですか?
大域的な構造体定義内の構造体定義の、他から使われる範囲は ブロック内だけでしょうか、ファイル全体でしょうか。 struct _1{ int i; struct _2{ //これとか char *p; }; };
すいません、言い方が悪かったですね。 struct STRCT{ struct STRCT_IN{ int i; }; }; // としたとき int main() { /* 関数の中でSTRCT_INを型としてオブジェクトを作る手段はあるのか? またできたとしてもそれは許されるのか? */ return 0; } を聞きたかったのです、よろしくお願いします。
>150 >177 ありがと。
>>178 普通に
struct STRCT_IN obj;
で作れないか?
C++なら
STRCT::STRCT_IN obj;
とか。
181 :
デフォルトの名無しさん :02/02/21 23:06
double buffer; scanf("%lf",&buffer); // <=ここで セグメンテーションエラーが出てしまうんですけどどうしたらいいんでしょう
>>180 さん、ありがとうございます。
普通にしたらできましたm(_ _)m
迷惑かけてすいません(;_;)
ファイル読み込みで、 1 2 3..... 1/2/3 4/5/6 7/8/9......... 最初から要素が何個あるか解からない時は、 fgets(line, 255, fp); で一行読み込んでから、空白ごとに読み込んでいく 以外に方法はないんでしょうか? 最初から何要素在るか解かる関数など在るんでしょうか? m(__)mm(__)mm(__)m
>>183 √ ̄ ̄ ̄ ̄ ̄\
/ ̄ |
/ / ̄ ̄ ̄ ̄ ̄\|
| / |
| / ` ´ |
| / _ _ | 初心者の文字が目に入らぬか!!
(6 つ. |
| ___ |
_ | /__/ |
⊃|房| | ___/
つ  ̄ ⊂
⊃
>>183 読まないで個数をどうやって数えるんでしょうか?
>>183 C言語には念写する機能はついていません。
>>183 解る関数が無ければ解る関数を作ればよい(藁
色々な面で処理効率は落ちるが、コーディングで難しいって点は無い筈。
補足。意外と使われてない気がするけど、こういう処理にはstrtokって関数が有る。
貴兄の求める仕様に合致するかは知らないけど、知識外なら一度調べてみては。
>>190 オーバーヘッドが多いような。
というか、FGETSしてるのならすぐに調べられるだろうが。
FGETSせずに調べるのは超能力が必要だし。
愚かな質問。
>>183 何を悩む必要があるのかまるでわからん。
「コードを書きたくない」と書いてるように見えるが。
データの頭に要素数突っ込んどけ
なぜにこんな質問ばかりなのかと小1時間問い詰めたい。
ファイルポインタで while((c = fgetc(fp)) != EOF) fputc(c,wp); のようにして最後まで読んでしまって また一から読みたい場合はどうすればよいのですか? lseek()を使うのでしょうか。
>>183 fgetcで1文字ずつ読んでった方が楽なケースというのも世の中にはある。
>>195 それでいいと思う。確実にしたいなら閉じてからまた開く。
>195 fgetc, fputc ときたら fseek だろ。もしくはrewind。
やあ。 今日もGETかな( ´ー`)y-~
みなさん、ありがとうございます。 開き直しかfseekかrewindやってみます。
>>203 知ってることで出来ることを無理に知らないことでやろうとしないこと。
205 :
デフォルトの名無しさん :02/02/22 16:13
const int foo[3]={1, 2, 3}; と int const foo[3]={1, 2, 3}; はどう違うんですか?
>>205 とりあえずお約束だが「プログラミング言語C」は読んだか?
>>205 初心者なら気にしなくても大丈夫な気も・・
209 :
デフォルトの名無しさん :02/02/22 16:28
関数の定義で function(i1, i2){ unsigned char i1[size1][size2]; unsigned char i2[size1][size2]; { ・・・ } なら大丈夫なのに function(i1, i2, x, y){ unsigned char i1[size1][size2]; unsigned char i2[size1][size2]; int x,y; { ・・・ } ではダメなのはどうしてなんでしょう?
古いスタイルだな...
constを先に書いたほうが読み良いな。
212 :
デフォルトの名無しさん :02/02/22 16:38
>>211 int *const p;
とかも考えると、修飾子は右に書く方が、統一はとれてるんだけどね。
でも、
int const *p;
const int *p;
だと、後者の方が良く見かける気がする。
>>213 あうあう、そうか。
C言語でややこしい宣言をする時には
(ポインタのポインタの関数のポインタの・・みたいな)
「段階的宣言」をして明確にする口なので気がつかず。
constの方が「重要な情報」であることは確実だとおもうのと
constが色々な方にまたがって複数ある時にはconstを
先に出して連ねた方が見やすい。
・・と思ってるんですけど、正しい?
大体ポインタの「*」表記がいかん。 一見便利だが、複雑になると死にそうになる。 長いけど例えば AddressOf みたいな感じだったら混乱しなかったはず。 p : AddressOf Const Integer; p : Constant AddressOf Integer; pf AddressOf Array AddressOf func(); 例えばこんな感じで
216 :
デフォルトの名無しさん :02/02/22 17:17
>>208 >
>>205 intとconstの位置が違うだけです
そうなのですか。どうもありがとうございます。
constって不思議ですね。
#include <stdio.h>
main(int ac, char **av)
{
const int a=1;
const int b=2;
const int *p = &a;
printf("%d\n", *p);
p = &b;
printf("%d\n", *p);
*p = 3;
printf("%d\n", *p);
}
*p=3でWarning出ますが、実行すると書きかえれちゃう(gccです)
こんなものなのでしょか。
>>216 ROMに焼くようなプログラム作るときには、重宝するかも。
漏れあんまりconstってかいたことない。
>>218 テーブルとかconstで宣言しとかないと心配じゃ無い?
>>216 C 言語で「警告」が出たら、他の言語だと「致命的エラー」に相当すると思って
おいた方がいい。特にキャストやポインタがらみの場合。
bakaがたくさんいる
C言語を勉強して、ポインタで挫折するという典型的なパターンをふんだものです。 学校では「コンソールアプリケーション」とかいうので、DOSプロンプトで実行するやつしか 作ったことがないのですが、VBみたいにボタンとかテキストボックスとかをCでも作れるのですか?
大変遅くなり申し訳ありません。 お答え下さいました皆様方、真に ありがとうございました。 >193 要素数とゆうか、Lineが数千行在るんでなんとも・・・・。 今のところ、中身が解かるので、 for(hoge=0 ; !feof(fp);) { fgets(line, 255, fp); sscanf(line, "%s", ky); if(!strcmp(ky, "文字")) { sscanf(line, "%*s %lf %lf %lf", &hoge[v][0], &hoge[v][1], &hoge[v][2]); v++; } . . . の様にしているので、改良してみます。
訂正 for(v=0 ; !feof(fp);) { fgets(line, 255, fp); sscanf(line, "%s", ky); if(!strcmp(ky, "文字")) { sscanf(line, "%*s %lf %lf %lf", &hoge[v][0], &hoge[v][1], &hoge[v][2]); v++; }
>>230 いまいち何を悩んでるんだかつかめないんだけど、
1.各行の要素数がまちまちなので、最大の要素数を知らないと配列確保できねーじゃねーかゴルァ
2.1行が長すぎて、fgets()で読み切れない時があるんじゃゴルァ
3.sscanf()しか知らんから、要素数可変でスペースで区切られてる文字列をパースできねーんじゃゴルァ
のどれなのよ?
232 :
デフォルトの名無しさん :02/02/23 02:05
お前ら、ポインタのポインタって何か教えてください。
早いレスさんくす!!!!!!!!!!!!!!!!!!!こ。
>>232 int i = 9999,*p = &i,**pp = &p;
printf("%d",**pp);
---結果---
9999
つまり
int i = 9999
はこういうこと
0x0001番地 ←アドレス(例)
| ̄ ̄ ̄ ̄|
| 9999 | ←変数i(中身はデータ)
|____|
次の
*p = &i
は
0x000A番地 ←変数iとは必ず異なるpのアドレス
| ̄ ̄ ̄ ̄ ̄|
| 0x0001 | ←ポインタ変数p(中身は変数iのアドレス)
|_____|
ほんで
**pp = &p;
でポインタ変数pのアドレスを代入
0x000FF番地 ←ppのアドレス
| ̄ ̄ ̄ ̄ ̄|
| 0x000A | ←ポインタを指すポインタ変数pp(中身はポインタpのアドレス)
|_____|
最後の
printf("%d",**pp);
は単項の*演算子で指すものを取り出している。
単項の結合規則は右から左なので
*(*pp)
こういうことだから
pp p i
↓ ↓ ↓
| ̄ ̄| | ̄ ̄| | ̄ ̄|
|__}→(*参照)→|__|→(*参照)→|__}
こうなって見事に繋がりを参照することによってiが取り出されて
printf()関数に9999を渡し、表示されるわけ。
遅かったしなんか違うかな(´-`)?? まあ暇だからいいや。
>>231 1ぽいです。
何か良い方法があったらと思いまして。
2はstd::getline()で・・・。
3の意味が良くわかりませんスマソ。
>>237 なんか長くなっちゃった・・・鬱
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LINE_BUF_GROW_STEP 8
#define MAX_LINE 10240
char **hoge[MAX_LINE];
main() {
char *line,*line_tmp;
char *word;
char **line_element_ptr;
int lines = 0;
int chars;
int count;
int line_buf_len = 2; /* 最低でも 2 は必要(man fgets) */
int i,j;
/* 行バッファ確保 */
line = (char *)malloc(line_buf_len);
line_tmp = (char *)malloc(line_buf_len);
if (!line || !line_tmp) {
puts("メモリ買えや・・・");
exit(1);
}
/* 読み込むよぅ */
while(fgets(line,line_buf_len,stdin)) {
/* 継続読み込み */
while(line[strlen(line)-1] != '\n' && !feof(stdin)) {
/* 行バッファ伸ばす */
line_buf_len += LINE_BUF_GROW_STEP;
line = (char *)realloc(line,line_buf_len);
line_tmp = (char *)realloc(line_tmp,line_buf_len);
if (!line || !line_tmp) {
puts("メモリねぇんだゴルァ・・・");
exit(1);
}
/* 続きを読み込む */
fgets(line+(line_buf_len - LINE_BUF_GROW_STEP -1),
LINE_BUF_GROW_STEP+1,stdin);
}
/* 改行コード削除 */ if (line[strlen(line)-1] == '\n') line[strlen(line)-1] = '\0'; /* strtok は引数で渡した文字列破壊するので、コピーしる */ strcpy(line_tmp,line); /* 単語数カウント */ count=0; for(word = strtok(line_tmp," \t"); word; word = strtok(NULL," \t")) { count++; } /* 単語数分のポインタ領域確保 */ line_element_ptr = hoge[lines] = (char **)malloc( (count+1) * sizeof(ch\ ar*) ); if (!line_element_ptr) { puts("メモリねーよ"); exit(1); } /* 単語を複製し、そのアドレスをさっき確保した領域に入れてく */ for(word = strtok(line," \t"); word; word = strtok(NULL," \t")) { *line_element_ptr++ = strdup(word); } *line_element_ptr = NULL; lines++; } /* 行バッファ開放 */ free(line); free(line_tmp); /* ついでに表示するよぅ(ついでにメモリ開放しる) */ for(i=0; i<lines; i++) { for(j=0;hoge[i][j];j++) { printf("[%s]",hoge[i][j]); if (hoge[i][j+1]) printf(","); free(hoge[i][j]); } free(hoge[i]); puts(""); } }
>>237 あーーー途中行末が\で切れてるとこは、次の行とひっつけてくれー
・・・さらに鬱
puts("メモリねーよ"); ↓ fprintf(stderr,"殿!メモリがたりませぬ!\n");
なんかある度に鬱鬱言うなよ。 お前の気分なんてどうでもいい。 大体お前だって本当は鬱でもないんだろ。
>>242 つっこむ以前に汚すぎて読む気もおきねーよ
そんなに鬱ならメンヘル板逝け
画像などの大きなデータを交換する方法としては、 どれが適してるのでしょうか? 本来なら私自身が全方法をテストして調査するべきなのでしょうが、 みなさんのご意見を聞かせていただけると有り難いです。
>>244 「ダメなコメントのつけかた」のサンプルじゃないのか?
>>246 DVD-RAM
(その質問だと、前提が正しく示されてないから、こういう大ボケな答えが返って
きても文句言えんと思う)
このプログラムの解説をしてもらえませんか? ハノイの塔っていうプログラムです。 #include<stdio.h> hanoi(char src,char dst,char tmp,int n) { if(n > 1) { hanoi(src,tmp,dst,n-1); hanoi(src,dst,tmp,1); hanoi(tmp,dst,src,n-1); } else { printf("move from %c to %c\n",src,dst); } } main() { int n; printf("何個? "); scanf("%d",&n); hanoi('A','B','C',n); }
・・・まさか貴様、 ハノイの塔の説明でも聞きに来たんじゃないだろうな?
>>249 いやん。「246 だと答えようがないから、もう少し詳しく書け」と遠回しに言ってる
だけだって。
> 画像などの大きなデータを交換する方法
これだけじゃ、圧縮方法聞きたいのかメディアを聞きたいのか、一対多なのか
分からんから、何とも言えんでしょ。
>>250 なんか酷く人使いの荒い質問が来てるぞ・・・
宿題全部やってください、よりも酷いかも。
257 :
デフォルトの名無しさん :02/02/23 14:47
エロサイトなんですけど なんかHP上にリンクが多すぎて それ自体の入り口がどこか分かりにくいし 実際に中に入ってみると 全然違う内容のページが表示されるのですけど何故でしょう?
>ハノイの塔の説明でも聞きに来たんじゃないだろうな? ハノイの塔の事は分かってます。 hanoi()関数の中身がいまいち分からないんです。
259 :
デフォルトの名無しさん :02/02/23 14:54
261 :
デフォルトの名無しさん :02/02/23 14:58
MEで使えるフリーのCコンパイル あるとこ教えて!!
>>256 さん、ありがとうございます。
このHPでアルゴリズムとやらを勉強してみますね。
263 :
デフォルトの名無しさん :02/02/23 15:00
264 :
デフォルトの名無しさん :02/02/23 15:00
Cコンパイル をさがしてるんですか? コンパイル は開発現場に行けば見かけることが出来ます。
267 :
デフォルトの名無しさん :02/02/23 15:33
共用体って本当に便利なの?
269 :
デフォルトの名無しさん :02/02/23 15:51
272 :
デフォルトの名無しさん :02/02/23 16:47
疑ってすまん。 では、どんな場面で使います??
ぽいんたのキャストをせずにメモリ領域を共用したいとき。 その他もろもろ。 有益な使い方はたくさんある。
variant型の実装に持つかっとるな
うーむ。。。 メモリ領域の共用だったらキャストしたほうが 融通が効くように思うのですが。 イマイチ理解できないっすTT
>>276 単純にキャストすると、アライメントがらみで死ぬと思うが。
キャストで済むのはもっともなんだが、 コンパイラの型検査機能を台無しにしたり 277の言うようにアライメントが保証されずにバスエラーが発生したり、 キャストでコードが汚くなる。 それよりは共用体をうまく使った方が 「同じバイトデータを異なる複数の型でアクセスするんだ」という 意志がはっきりと読みとれてよい。 仕様目的はメモリ領域の共用。 わざわざ共用体を試用する意義は、それをコンパイラにもコードの読み手にも それをはっきりと明示できるから、に他ならない。 キャストは最後の手段だぞ。
誤字でござるよ。 ニン、ニン。
よく関数呼び出しにはオーバーヘッドがかかるから マクロ呼び出しの方が有利とか言うでない?? 一体全体、オーバーヘッドってなんなの? 仮引数をスタックにつんだり、おろしたりする作業のことですか??
>>278 はっきり言ってWin32APIのようなAPIや関数設計だと
いちいちunionで共用を宣言してたらトンデモソースになるぞ
>>266 そのサイトってUG?
MFCとか非オブジェクトコードで配っちゃってるし、
イマイチ聞いたことがないコンパイラなので
>>283 CreateWindow の引数 hMenu とかの話か? あれは API の設計が腐ってると
思うんだが、まぁ CreateWindow() を使う側の人間としては、キャストで済ませ
るしかないな。
Win32 API でも MMTIME や MIXCONTROL, LARGE_INTEGER なんかは union
を使ってるよ。
286 :
デフォルトの名無しさん :02/02/23 21:03
>>284 元 Symantec C++、と言えばそんなに聞いたことのない
コンパイラでもないのではなかろうか。
288 :
デフォルトの名無しさん :02/02/23 21:13
昔 : Apple純正 VS Symantec C++ 今 : Apple純正 VS CodeWarrior
この糞スレまだあったのか
290 :
ビル・ジョブス :02/02/23 23:31
今のCPUなら、実際のスタックに積むオーバーヘッドなんか無いに等しい。 だって、実際は内部REG or キャッシュにしか積まないだろ? デバッガから一見Stackに見えるエリアもCPUの中だよな?
>>290 おいおい(w
試しに関数呼び出しと、inline 展開した場合のコードを使ってプロファイルを
とってみなよ。
まだ続ける気なの?
293 :
ビル・ジョブス :02/02/23 23:39
あのさーマルチタスク環境で、なにが「プロファイル」だよ! もう少し別のところに頭使おうよ。 関数コールのオーバーヘッドなんて議論は10年前に終わってるんだよ。 あんたはその「プロファイル」とやらをJ-TAG ICEでとるのか? ならばすげー(w
マルチタスク環境下で、意味のあるプロファイルが取れないと思ってるんだろうか。
295 :
ビル・ジョブス :02/02/23 23:48
今時「ms」オーダーで満足するヤツが居れば使えばいい。 プラットフォームによってまったく意味ないと思う。
> プラットフォームによってまったく意味ないと思う。 逆にターゲットによっては重要になるだろうよ。 あんた、一体何が言いたいの?
297 :
デフォルトの名無しさん :02/02/23 23:59
授業の課題でソートのプログラムを2種類作成しました。 で、実行時間を比較したいのですが、 どうすればよい??
>296 シングルタスク専門の組み込み屋さんが 特殊なケースを勝手に一般化して語ってるだけ。 捨て置けい。
300 :
ビル・ジョブス :02/02/24 00:00
>>296 論点が曖昧で議論に値しないということ。
それと・・・おまえに「あんた」と呼ばれる覚えはないな、
このスレの創設者に対して失礼じゃないか?
君は出禁にします。
>297 OS・開発環境による。
302 :
ビル・ジョブス :02/02/24 00:05
>>297 CPUのデーターシートからインストラクションの実行時間を
計算すれば?
後は、GetTickCount()っていうクソ「プロファイル」APIで
測ったふりでもしたら?
>>301 学校の課題ってことは UNIX だろうから time コマンド使え、が正解かな。
>>300 君が知ったか君だという事だけは判った。
>>302 キミが出入り禁止で良いよ。回答が役に立たな過ぎ…。
307 :
ビル・ジョブス :02/02/24 00:10
言い忘れたけど・・・ P4 1.6GHzとかにすればプロファイルする必要ないね。 今の世、スピードはH/Wで稼いでS/Wは設計手法重視するべし。
308 :
デフォルトの名無しさん :02/02/24 00:11
環境はWindowsです。関数の呼び出し元前後に仕掛けを入れる形にしたいのですが。。。
309 :
ビル・ジョブス :02/02/24 00:11
312 :
デフォルトの名無しさん :02/02/24 00:13
borlandのフリーのやつです。。。
313 :
ビル・ジョブス :02/02/24 00:14
>>308 Windows?の何?
リアルタイムクラスとか使ってる?
なら、ほぼ正確に測定できるよ。
>>309 今は b-mobile からアクセスしてるから、端末の IP アドレス外から見えるのは
proxy server のアドレスだけだぞ。(そもそも削除人じゃなきゃ見えないだろうが)
315 :
ビル・ジョブス :02/02/24 00:17
>>314 うそうそ、子供みたいにすぐムキになるなよ。
寒いスレになりつつあるな
317 :
ビル・ジョブス :02/02/24 00:21
相変わらず、このサイトってバカが多いな。
>>312 なら #include <time.h> して clock() 関数を使うのが良いと思うが。
これは呼び出し側プロセスが使った
CPU 時間を tick 数単位で返す。CLOCKS_PER_SEC で割ると秒単位に 変換できる。
>>317 お前、氷魚なみの妄想君だな。
厨房入ってるし。
> P4 1.6GHzとかにすればプロファイルする必要ないね。 もうね、アフォかと、バカかと…
322 :
ビル・ジョブス :02/02/24 00:29
シングルスレッドならね・・・ comとかが勝手にスレッド生成してますよ・・・ 関数レベルの正確なプロファイルは簡単に出来ないよ。 そして、意味がない。
質問なのですが、inlineを関数の前につけると、プログラムが早くなりますよね そうならば、どの関数にもinlineをつければいいんじゃないかと思うのですが、 そうではないんですよね? inlineは、ローカル関数として宣言している時 意外ではつけてはいけないのでしょうか?
324 :
ビル・ジョブス :02/02/24 00:31
326 :
ビル・ジョブス :02/02/24 00:36
>>323 関数コール・リターンのオーバーヘッドよりも、キャッシュヒットする
事のほうが遥かに重要なんだよ。よって速くなりません。
もうー・・・だからバカは嫌いなんだよ。
俺はバカよりキティ飼いの方が嫌いだ。 バカは教え諭せば話が通じるが、 キティ飼いは意思の疎通が図れん。
>>322 正確なプロファイルってなんだ?
もしかしてかかった時間を1ms単位で計れと?
あくまでプロファイル結果は処理集中個所を探すための指標にすぎないから、
大まかで良いんだよ。
俺も致命的に間違ってた。スマン。 ビルは単なる無知な素人だったみたいだ。 >326 >関数コール・リターンのオーバーヘッドよりも、キャッシュヒットする >事のほうが遥かに重要なんだよ。よって速くなりません。 だから勝手に一般化するなっての。 単純なsetter/getterはinlineにしたほうがいいだろ。
>>323 明示的な関数ポインタ (C++ なら暗黙的にも) 使ってたら inline 効かないし
何より、全部の関数に付けてたらサイズが肥大して仮想記憶のスワップが
バカにならなくなるからねぇ。
ローカルである必要は無いけど、ほんの数行で済む様な関数なら inline に
しとけばいいんじゃないかな。
>>326 「キャッシュには連続した領域がひとつだけ読み込まれる」と思ってないか?
>>326 なんか、珍しく(部分的に)正しいことを言ってるな(w
inline 関数展開してしまうと、同じ関数の中身が複数の場所に展開されることに
なるため、プログラムのサイズが肥大化します。その結果として命令キャッシュ
のヒット率が落ちかねないので、
「どこまで inline 展開するのか」
は慎重に判断する必要があります。
また inline 展開をするためには、関数の定義(宣言ではなく中身)が見えてる必
要があります。ということは定義をヘッダに書く必要があるわけで、プログラム間
の相互依存関係が深くなるというデメリットもあります。
一般的には「スタックフレームを削除できる程度」に簡単な関数なら inline 化
した方がお得です。それ以上は、場合によりけり。
332 :
ビル・ジョブス :02/02/24 00:45
>>328 「大まかで良いんだよ。」って、それで意味ある?
1万回とかの平均とるなら話は別だけど・・・?
>>332 ベンチじゃないんだから、実行時間そのものが重要なわけじゃないんだが?
(´-`)。o ○ (重要なのは比率だよね)
335 :
ビル・ジョブス :02/02/24 00:51
>>330 nウェイセットアソシエイティブって知ってますが・・・
というか、昔おれの作った同ロジック(S/W)のデバイスドライバを
皆さん使ってますが・・・(EMMなんとかってやつで、DOSに付いてたよな)
ハー・・・
すごい遅いアプリがある。 そのアプリは関数f1()..f100()の100個の関数で構成されている。 そのアプリを高速化しようと思ったら まずプロファイラをとって各関数の実行時間の割合を調べる。 プロファイラの結果は大体こんな感じ f33() 33% f21() 18% f65() 5% f43() 1% ... この結果から全体の速度を10%あげたければ f33()を33%->23%になるように高速化すればよいことがわかる。 割合に多少の誤差があってもこの方針はあまり狂わない。 これがプロファイラの基本的な使い方。
338 :
デフォルトの名無しさん :02/02/24 00:56
>>319 サンクスです!
でも、オレが作った関数、、、おそっ!
あのさーマルチタスク環境で、なにが「キャッシュヒット」だよ
340 :
ビル・ジョブス :02/02/24 00:58
>>336 んなことしても意味ないね。
プロファイルする以前に設計が悪いんだよ。事前に分からないのか?
お勉強ツールにはいーかな?
>>337 emm386の事か?
emsメモリ用のドライバだが…
電波は放置推奨。
> んなことしても意味ないね。 > プロファイルする以前に設計が悪いんだよ。事前に分からないのか? 事前に予測できなかった性能上のボトルネックを探ってるんでしょ。 設計して実装したらその後のチューニングはしないんですか? “ア ン タ”は?
f43()を100倍高速化して嬉々としてるタイプだな>ビル
345 :
ビル・ジョブス :02/02/24 01:04
>>339 「だからこそ」だよ。
みんなで少しでもコードの肥大を抑えるのが「エチケット」。
346 :
ビル・ジョブス :02/02/24 01:06
>>340 > プロファイルする以前に設計が悪いんだよ。事前に分からないのか?
ふつーわからない。設計が良くても、思わぬ実装上の問題でボトルネックが
発生している事は良くある。
> しねーよ、テメーは死ねよ。 うわぁ(笑 あんさん、めっちゃおもろいわ その駄洒落! 最高、流石!! 惚れたね、もう
>>347 ビル様くらいになってくると、生成されるコードすべても考慮して設計できるんだよ、きっと。
350 :
ビル・ジョブス :02/02/24 01:10
>>347 じゃーそのボトルネックとやらが、MS提供のDLL内だったらどうする?
ビルに遊ばれている人々多数…
354 :
ビル・ジョブス :02/02/24 01:14
355 :
ビル・ジョブス :02/02/24 01:16
>>353 John ◆0z.4Is5E は知らないが・・・
変なヤツと一緒にするなよ。
> じゃーそのボトルネックとやらが、MS提供のDLL内だったらどうする? アンタがこう書いた意図は、 “自前の処理に置き換える”というのはコストが掛かりすぎるし、現実的には対応不能 という意味じゃねぇのか? ならそこは置いておき2番目以降のボトルネックを改善するのが なんでアフォな事なのかと、問い詰めたくも無いんで消えてくれ。 むしろ氏んでくれ。
357 :
ビル・ジョブス :02/02/24 01:19
>>ALL おいおい小僧ども!もう終わりか? Windows環境でプロファイルなんて、大した意味がないって分かったか?
>>351 っつか、ビルはこの板では John に続く逸材だし。マ板のほうでは氷魚が活躍
中だが。
>>350 ボトルネックがはっきりしていいじゃない。
問題の API / 関数を極力呼ばないで済むように考える。
360 :
ビル・ジョブス :02/02/24 01:22
>>356 じゃー50番目のボトルネックとやらまで、
>“自前の処理に置き換える”というのはコストが掛かりすぎるし、現実的には対応不能
だったらどうする?
…その三人で好いただけ殴りあってくれ。 他所様には迷惑かけないようにな。 体力・スタミナ面では氷魚が抜きんでてるか?
>>361 氷魚の書き込み量は Kusakabe と張り合える。他のスレッドに伝染しないだけ
マシだけど。
>>360 それ、ボトルネックとは言わんが。
いくつかの関数で均等に CPU 時間食ってる場合には、たいていは実装上の
致命的なミスはない(よって実装レベルでの最適化は必要なし)と判断される。
364 :
ビル・ジョブス :02/02/24 01:27
バカ相手にしてるのは退屈でもう眠い。 頑張ってプロファイルしてくれ! 最後に言わせてもらうが、プロファイル以前の問題を解決してくれよ。 また語ろう!さらば!
>>360 ネタにマジレスするが、、、
そこまで深刻なら普通はボトルネックの原因であるMSのDLLを使わないようにするだろ。
>>362 どのスレか参考までに教えてください。
是非みたい!
以前一般のPC系BBSに居た電波もそんな名前だったな
FBI心理分析官のローバート・レスラーですがなにか?
アメリカ大統領ブッシュですがなにか?
>>330 >>331 ありがとうございました
やみくもに5個程度inlineしていました
今から改良します
>>364 やばくなると逃げる。
ネズミ男の類だな。
この前凄いプログラマ見たよ! あたまで全部処理してる人・・・。(凄い・・・
C言語のCはなにの?
375 :
デフォルトの名無しさん :02/02/24 01:48
むむ、ここは一体なんのスレじゃ?
376 :
デフォルトの名無しさん :02/02/24 01:48
377 :
デフォルトの名無しさん :02/02/24 01:49
>>374 そ、そんなアンタ、放送できませんがな・・
ビルもぼろが出ない程度に書き込んでりゃ 適度に尊敬されてたものを..
>>378 また、死体に鞭を打つような真似を…
ゾンビのごとく復活してきたら、ロケットランチャーで追い払うことにして、
とりあえずは放置しときましょうよ。
380 :
デフォルトの名無しさん :02/02/24 01:55
>378 プロファイラ関連の発言を見る限り やたら視野の狭い厨房にしか見えんが...
なんか、だんだんハイソサエティから遠ざかって行くな。 カルシウム足りねぇんだな、きっと。 面白いからいいけど。
383 :
(・∀・) :02/02/24 15:21
mallocなんかで確保したメモリ領域をファイルみたいに readしたいんだけど、うまい方法ありますか?
ワケワカラソ memcpy()で何か問題が?
>>384 read() といってるから、そもそも * (間接参照) で終わりじゃないのか?
>>385 オレもそう思う。なんでコピーしたがるかなぁ?
#define MEMFILE_EOF -1 typedef struct tagMEMFILE { char *buf; size_t bufsize; size_t readcnt; } MEMFILE; MEMFILEBUF *MemFileOpen(MEMFILEBUF *pmem, char *p, size_t len) { if ((pmem->buf = (char *)malloc(len)) != 0) { memcpy(pmem->buf, p, len); pmem->bufsize = len; pmem->readcnt = 0; } return pmem; } void MemFileClose(MEMFILEBUF *pmem) { if (pmem->buf != 0) { free(pmem->buf); } } int MemFileGetChar(MEMFILEBUF *pmem) { if (pmem->readcnt >= pmem->bufsize) return MEMFILE_EOF; return (unsigned char)pmem->buf[readcnt++]; } unsgiednchar *MemFileGetLine(MEMFILEBUF *pmem, char *buf, size_t bufsize) { size_t cnt = 0; int c; while ((c = MemFileGetChar(pmem)) != MEMFILE_EOF) { if (c == '\n') break; if (cnt >= bufsize - 1) break; buf[cnt++] = c; } buf[cnt] = 0; return buf; } こんなんじゃねえの?
>>384-387 ありがとね。標準入力からデータ加工するときと
メモリ領域から加工するときがあって、ロジックを
あまり変えないでメモリもストリーム・イメージに
ならないかな?とおもたんで。387を参考にしてみます。
389 :
デフォルトの名無しさん :02/02/24 16:27
>>388 ならば、最初からそう書いておかないと、
またヴァカ質問が振ってきたのかと思うですよ。
>>388 それなら、ストリームのほうに統一しないで、標準入力から加工する
時も、メモリに一旦読み込むってのはダメなの?
Cっていまでもたくさんの人が学んでいるのねえ
392 :
デフォルトの名無しさん :02/02/24 17:43
自分で考えろ
394 :
デフォルトの名無しさん :02/02/24 18:00
>>393 いやあねえ、
私が教えて欲しいのではなくて、
なにか代替案でもあってそう言っているのかな、と思って
ご意見を伺って見ましょうかと。
ただ俺は他のスレとみくらべて 続いてるなーと思っていっただけでふ
>>395 なあんだ。
Cは古いぜ、とかわざわざ書きに来たのかと思った。
C言語のファイルIOって、高水準入出力と低水準入出力があるみたいなんだけど、 何が違うのですか??
398 :
デフォルトの名無しさん :02/02/24 18:09
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> C
高水準は遅いけどバッファリングとか改行コードの処理をライブラリレベルでやってて(あるいみ)便利。 低水準は速いけど読み書きだけなので不便。 unix: 低水準入力はシステムコールで実現。 高水準入出力は、たぶんおそらく内部的に低水準入出力を呼び出している。 win: 低水準入出力はAPIで実現。 高水準入出力もAPIで実現。 仮想記憶に頼りっきりなので性能はあまりかわらんが、どっちかというと高水準の方が遅い。
401 :
デフォルトの名無しさん :02/02/24 19:58
int 32bit、short 16bit、char 8bit と仮定します。 例えば、 int n = 0x00000000; short i = 0x1111, j = 0x2222; char c = 0x33, d = 0x44; とした場合、デバッガでメモリの確保のされかたを見てみると、 僕の環境では以下のようになっていました。 44 CC CC CC 33 CC CC CC 22 22 CC CC 11 11 CC CC 00 00 00 00 つまり、各変数に置き換えると、 DD xx xx xx CC xx xx xx JJ JJ xx xx II II xx xx NN NN NN NN となっています。 すべて 4 バイトの倍数番目から確保されていて、 それぞれの変数の間にはすきまが空いています。 ここで思ったのですが、それぞれの変数間を詰めないのであれば、 メモリの消費をできるだけ抑えるために、 int の代わりに char や short を使ったりするのは意味がないんじゃないでしょうか? 結局、int 分の領域が用意されていることと同じになりませんか? それとも、この変数間のすきまは何かにちゃんと有効利用されているんでしょうか? どなたか教えてください。 (説明がややこしくなってすいません。)
>>401 処理系依存。
コンパイラによってpaddingを調整できるものもある。
VCだと1~16byteまでかな?
>>401 > メモリの消費をできるだけ抑えるために、
> int の代わりに char や short を使ったりするのは意味がないんじゃないでしょうか?
いまどきのプラットホームだと、あまりない。
ただし配列やら malloc() やらで連続したデータ領域を取ってくるときには、効い
てくる。
>>402 構造体の padding じゃなくて stack のアライメントな。
>>401 >>401 のような環境で、メモリ消費を抑える目的”だけ”でintのかわりにcharやshortにしている場合は、
まったくもってその通り。
ちなみに、スキマができるのは理由がある(アクセスが速くなったりする)ので、
使っているCPUのアーキテクチャを調べてみるのがお薦め。
Intelのホワイトペーパー(?)の日本語訳は、めちゃくちゃ読みやすいよ。
表示する文字に色をつける方法はありますか?具体的なソースもおねがいします。 あと、画面消去の方法も教えてください。
C FAQ嫁。
C言語を実行するツールで使いやすいのはありますか? 学校で使ってるのは、WINDOWSでは使えないやつなので WINDOWS対応の奴を教えてください。お願いします。
Delphi 6 Personal
gcc bcc32
413 :
デフォルトの名無しさん :02/02/24 22:00
すまん、教えてください。 C言語勉強中なんだけど、配列のソートでつまづいてます。 int main(void) int test[NUM]; int tmp; int i,j,s,t; printf("%d人の点数を入力してください。\n", NUM); for(i=0; i<NUM; i++){ scanf("%d", &test[i]); } for(s=0; s<NUM-1; s++){ for(t=s+1; t<NUM; t++){ if(test[t] > test[s]{ temp = test[t]; test[t] = test[s]; test[s] = tmp; } } } for(j=0; j<NUM; j++){ printf("%d番目の人の点数は%dです。\n, j+1, test[j]; } return 0; } これをすると点数が一番高い人から表示されるようになるらしいんだけど、 プログラムの意味がよくわかりません。 めんどくさいけど、プログラマー様教えてくださいな。。
NUM個の中で一番大きい数値を探し、それを0番目に置く 上の数値を除いた(NUM-1)の中で一番大きい数値を探し、それを1番目に置く … バブルソート、っていうんだけっか
隣接交換法で調べれ
>>413 google で「馬鹿ソート」と検索すれば説明があるよ。
それでもわからなければ、トランプを使って同じことをやればよし。
417 :
デフォルトの名無しさん :02/02/24 22:06
>>414 そうなんです。教科書にはそう書いてあるんですけど、
ifが絡んでるところがわからないんです。
よろしければ、言葉で流れを説明してもらえませんか??
こういうのってデバッガでステップ実行すればすぐわかるよ。
419 :
デフォルトの名無しさん :02/02/24 22:10
=413 馬鹿ソートということでしたら、 もっと、効率的なプログラミングはあるんですか?? よろしければ、そっち(効率てき方)を教えてもらえませんでしょうか?
これもわからないようじゃ無理。 ひらがながわからないんで漢字教えてくださいって逝ってるようなもんだ。
うむ、見事な“教えて君”だ。 これほど見事な“教えて君”を見るのは久しぶりだ。
422 :
デフォルトの名無しさん :02/02/24 22:15
=413 見事な教えて君ですんません。 これがわからなければ言語はきついのかな・・ んでも、マジでやってるんで、よろしくです。
423 :
デフォルトの名無しさん :02/02/24 22:16
#pragma comment ってなに?
それより効率的だと シェルソートかクイックソートかヒープソートかシェーカーソートかその他
425 :
デフォルトの名無しさん :02/02/24 22:23
struct hoge{ int hoge_i; struct hoge *next; }; ↑これはコンパイル通るけど、↓これは通らないけど、なんで?(BCCで) struct hoge{ int hoge_i; struct hoge (*next)[5]; };
カッコ抜いても?
428 :
デフォルトの名無しさん :02/02/24 22:30
馬鹿ソート(バブルソート)でお世話になったものです!! わかりました。アドバイスありがとうございました。 実は単純だったんですね。お世話になりました(_O_)
あ~ぁ、
>>428 が勘違いしたまま帰って行くよ・・・
430 :
デフォルトの名無しさん :02/02/24 22:35
>>427 カッコを取ったらできたけど、カッコをつけた状態のソースが
意図する変数を宣言したい場合どうしたらいいの?
…ならアンタがアドバイスしてやれよ。 アフォか?
432 :
デフォルトの名無しさん :02/02/24 22:36
「愛」ってC言語でなんていうんですか?
同じだよ
>>430 「struct hoge (*next)[5];」は“hoge 5個の配列へのポインタ”だが
struct hoge は定義している途中なのでサイズが判らない。
一方「struct hoge *next;」はポインタだから、hoge の定義が終わってなくても
サイズが判る。
…で本当に“hoge 5個の配列へのポインタ”を意図してるの?
>>431 バブルソートではない、と言いたいのだろうけど、
思わせぶりにする程の事か?
436 :
デフォルトの名無しさん :02/02/24 23:05
>>433 今まで何か勘違いしてたみたい。
俺のやりたかったのは、カッコが無いやつだった。
アドバイスありがとうございました。
>>428 >>433
437 :
デフォルトの名無しさん :02/02/24 23:08
>>436 誤爆。
#define 428 427
#define 433 434
表示する文字に色をつける方法はありますか? 具体的なソースもおねがいします。 あと、画面消去の方法も教えてください。 好きなタイミングでそれまでの表示を削除することは可能ですか? これもソースキボン
バカにC FAQ嫁といっても効かない場合はどうしたらよいのでしょうか?
答えられないやつはだまってろアフォ
441 :
デフォルトの名無しさん :02/02/24 23:44
>438 環境依存の質問を書いてるのに、自分の環境を書いてない。 ちゃんとCFAQよめよ。
調べられたらとっくに調べてますが? そのつもりがないから聞いてるんですが。
443 :
デフォルトの名無しさん :02/02/24 23:46
文字列の中からある文字列とある文字列の間にある文字列を抽出したいのですが、 いかようにすればいいでしょうか? "あいうえおかきくけこさしすせそ" 上記のような文字列を格納した変数があるとします。 その変数と"かき"と"さし"の二つの文字列を引数に与えると "くけこ" が返ってくるような関数が作りたいのですが・・・
445 :
デフォルトの名無しさん :02/02/24 23:51
>441 環境ですか?コンパイラとかでしょうか 一応Visual C++ですが
>443 問題:以下のプログラムを書きなさい "かき”の位置を調べる処理 ”かき”の長さを求める処理 文字列の位置と長さを指定して抜き出す処理 getstr("abcde", 1, 3)="bcd" それらを組み合わせた処理
>>443 お好きなように。
strstr() で最初の文字列見つけて、その末尾から strstr() するとか。
448 :
デフォルトの名無しさん :02/02/24 23:56
基本的に文字にいろをつけたり画面を消去するのは無理なの? じゃぁみんなはそんな問題をどう処理するの? やっぱりそれまでの流れは全部後ろに表示されっぱなしなわけ?? 消したいときもあるでしょ?そんなときはどーしてるの?
449 :
デフォルトの名無しさん :02/02/24 23:57
>443 おなじ文字列が複数あった場合の動作を規定しないと。 "あいうえおかきくけこさしすせそさし" のときは、"くけこ"を返すのか"くけこさしすせそ"を返すのか。
>>448 我らはあなたのしもべではござらん。
なんでも聞けばよいってものではない。
・過去ログを読みましたか?
・1のリンク先を見ましたか?
・Googleでしらべましたか?
すべて既出頻出とうちゃん楽勝ホームランです。
どの方法をとっても、答えは見つかります。
>基本的に文字にいろをつけたり画面を消去するのは無理なの? 無理ではないです >じゃぁみんなはそんな問題をどう処理するの? どうにかします。 >やっぱりそれまでの流れは全部後ろに表示されっぱなしなわけ?? そうじゃないかもしれません。 >消したいときもあるでしょ?そんなときはどーしてるの? どうにかします。
>>448 √ ̄ ̄ ̄ ̄ ̄\
/ ̄ |
/ / ̄ ̄ ̄ ̄ ̄\|
| / |
| / ` ´ |
| / _ _ | 初心者の文字が目に入らぬか!!
(6 つ. |
| ___ |
_ | /__/ |
⊃|房| | ___/
つ  ̄ ⊂
⊃
>>455 もうちょっと礼儀正しく質問してください、質問君。
はい。ごめんなさい。
DOS上で作ったEXEファイルをウィンドウズ上で実行(ダブルクリック)すると 終了した途端にドスプロンプトの画面が閉じちゃうんだけど何故?
>458 そーゆーもんだから。 最初からDOC窓開いて実行するか cmd.exe /k yourprog.exe ってショートカット作ってやってみな。
今回は最短の"さし"を調べたいので 1.文頭からstrstr()で"かき"の位置を調べる。 2.文頭からstrstr()で"さし"の位置を調べる 3. 2ー1の値が抽出する文字列の長さだから(?) >446のgetstr(格納してある変数,1の値+"かき"の長さ,2,)を完成させればよしと言うわけですね。 ありがとうございました。挑戦してみます!
>>458 とりあえず動体視力を鍛えなさい。
・・ではなくて、
気がついて欲しい回避方法
・mainの最後にgetsを入れとくだけでとりあえず回避できる。
正しい方法
・DOS窓の設定を「実行後に閉じない」にする。(ショートカットのプロパティ)
>>460 strstrとかStrtokをごちゃごちゃいじりまわす知識を付けるよりは、
自分でゼロから書いたほうが絶対勉強になります。
463 :
デフォルトの名無しさん :02/02/25 00:56
独習Cの評判ってどうなの?
>>461 >・DOS窓の設定を「実行後に閉じない」にする。(ショートカットのプロパティ)
こんなのあったっけ?
Win2k/XPにはないような。
char *pickup(const char *str, const char *key1, const char *key2, char *buf, size_t bufsize) { size_t len1; char *p1; size_t len; len1 = strlen(key1); if ((p1 = strstr(str, key1)) != 0) { if ((p2 = strstr(p1 + len1, key2)) != 0) { len = p2 - p1 - len1; if (len >= bufsize) { /* 長すぎ。ぶった切る */ len = bufsize - 1; } strncpy(buf, p1 + len2, len); buf[len] = 0; return buf; } } return 0; }
>>461 それは「プログラムを終了時に閉じる」のチェック
を、はずすということですか?それでもむりだったんですけど・・・
>>465 む、確かに無い・・・Win98とかにはあったのになぁ
>>467 諦めて、DOS窓を開いてから手でファイル名入力して実行しましょう。
>>467 あ、訂正。手で入力しなくても、DOS窓開いてから、そこにexeファイルを
ドラッグ&ドロップすれば、ファイル名入力されるんだった。
気がついて欲しい回避方法 ・mainの最後にgetsを入れとくだけでとりあえず回避できる。
それは邪道と心得よ
>>470 それも無理でした、ちなみにOSはWIN95です。
プログラムの最後にfor(;;);を入れるのは?
>>471 そういうこだわりは、Cが出来るようになってからでよろしい。
普通、最後にgetchar();を入れて待機させない? 俺はDOS窓からコンパイルしているからそのまま実行しちゃうけど。
>>466 なんなのそれ?
$ gcc -c a.c
a.c: In function `pickup':
a.c:13: `p2' undeclared (first use in this function)
a.c:13: (Each undeclared identifier is reported only once
a.c:13: for each function it appears in.)
a.c:21: `len2' undeclared (first use in this function)
>>478 大成功しました。
皆さんご協力有り難うございました。
481 :
デフォルトの名無しさん :02/02/25 17:58
windows2000でプリンタポートを汎用ポートとして 使うにはどうすればよいの? なんかgiveioとか言うのいれたけどできません。 ちなみにC言語でポート制御しようとしてます 誰か教えて~
482 :
デフォルトの名無しさん :02/02/25 23:21
超初心者です。 本(独習C)で、 int main(void) { としているのですが、 main() { と何が違うのでしょうか。下のを使っていてもいいんですよね。
型は省略するとintになる。 仮引数は省略するとvoidになる。 はずだけど、明示的に書いておいたほうがコンパイラタンに文句を言われない。
4桁の数字intがあって、 これを文字.txtつけてcharポインタを返す関数を作りたいんですが、 1000を入れれば、1000.txtと返すような。。。 char *itotxt(int nu){ char fn[9]; sprintf(fn,"%d.txt\0",nu); return fn; } これじゃダメですよね?シクシク
485 :
デフォルトの名無しさん :02/02/25 23:30
482です。ありがとうございます。 return(0); と return 0; は何が違うのですか?
char *itotxt(int nu){ static char fn[9]; sprintf(fn,"%d.txt",nu); return fn; }
>485 1+1 と (1)+(1) くらいには違う。
490 :
デフォルトの名無しさん :02/02/25 23:47
>489 タイプ量って何ですか?
type ryou = キーボード鬱量
>>484 一体誰が文字列の中に "\0" を入れ始めたんだろうか…
要らんですよ。
char fn[9] は、その関数の中にしか存在しません。
(文字列への) ポインタを返すなら
1. static char fn[9] にして、関数を抜けても無くならないようにする。
2. 文字列へのポインタを引数で貰う。
3. malloc() 等で動的にメモリを割り当てて、そこに文字列を格納して返す。
のどれかでしょう。マルチスレッドなプログラムで無ければ 1. が最も
簡単ですね。
493 :
デフォルトの名無しさん :02/02/26 00:07
質問です。 この問題を教えてください。 次のプログラムの誤りを指摘しなさい。 #include<stdio.h> void sqr_it(int num); main() { sqr_it(10.0); return 0; } void sqr_it(int num) { printf("%d", num*num); }
494 :
デフォルトの名無しさん :02/02/26 00:09
5行目 sqr_it(10.0); → sqr_it(10);
main() ↓ void main()
コレはコレである意味間違いでもなんでもないんだがよ。 出題者、DQNか?
497 :
デフォルトの名無しさん :02/02/26 00:14
>494 ありがとうございます。 その解答に「sqr_it()関数には整数の引数が必要だが、 呼び出す時には浮動小数点値を必要とします。」 とかいてあるのですが、どういう意味ですか?
誰がどう考えても、 >void main() ここだろ。
>497 整数の引数を要求する関数に実数を渡した場合、 自動的に実数->整数変換されるのはまったく正しい動作です。 よって実は誤りがないという誤り。
とんでもない無能が講師やってるという誤り。
501 :
デフォルトの名無しさん :02/02/26 00:19
関数内の static 変数のアドレスを返すコーディングに違和感を 覚えるのは俺だけ?(確かに間違ってはいないけど。。。)
>501 安易に static char buf[256]; ... return buf; とかやると破綻するよね。
>501 マルチスレッド時代に生きていると 違和感を覚えるのが正常です。
スレッドローカルにすれば違和感が消えるかといえばそうでもなかろう。
505 :
デフォルトの名無しさん :02/02/26 00:35
>501 おれも違和感ある。 その関数を複数回呼び出すとき混乱しそうで。
>501 でも、関数の中でmallocしてそのアドレスを返すと 誰がfreeするのか気になって仕方がないんですが。
>506 そういう場合呼び出し側がmallocしてそのバッファのアドレス渡して 使い終わったら呼び出し側でfreeするのが良い。
>>506 呼び出し元が free() すれば良いじゃない。もしくは文字列長が呼び出し側で
予測つくなら、snprintf() のように
char *buf, size_t n
を渡すのも手だ。これなら呼び出し側でメモリ領域を確保できるから、自動
変数だろうが malloc した領域だろうが global 変数だろうが OK だし。
501はmallocについて何も語っていませんが?
>>509 「static 変数を返す」で、即座に対案として malloc の単語が思い浮かばないよう
なら逝って良いぞ。
ハァ?
失礼しました、文をよく読んでませんでした。 勘違いは逝ってきます;- -)
つまり、 教訓としては Staticは内部で消えない変数としては使って良いが、 外部に渡せることを期待してはいけません。 ですか。
いい例が思い付かないが、 シングルスレッドでも割り込みルーチンで static 変数のアドレスを返す関数を呼んで、 その関数内で static 変数の操作+呼出元のルーチンで変数の参照をしてたら目も当てられない というのを今思い付いたが、どうだろう?(かなり強引な例だが、やはり static 変数の アドレスを返す関数は良くないと思う)
再帰ルーチンだと簡単に破綻しそうだな。 どうも寝ぼけてるようなので逝って来ます。
Cで内部音源のMIDIを鳴らしたいんですけれども どの様にすれば良いですか?
>>501 printf("%s,%s",itotxt(3),itotxt(4));
でアウトってことだよね。はげどー。
520 :
デフォルトの名無しさん :02/02/26 07:20
みんなそんなに安易にmallocを使うの?
>>520 おれはmalloc()に特に抵抗ないよ。
必要ない時は使わないけど。
不安ならleakチェッカーみたいなのがお薦め。
inet_ntoa()は思いっきり内部バッファから文字列返しとるが...
>>486 >>492 どうもありがとうございますです。
変数のスコープが問題だったのですねん。
確かに複数回呼ぶのでmainの方に作ろうと思ってますです。
>>522 ほんとだ。
struct in_addr in1,in2;
in1.s_addr = inet_addr("1.1.1.1");
in2.s_addr = inet_addr("2.2.2.2");
printf("%s\n%s\n",inet_ntoa(in1),inet_ntoa(in2));
1.1.1.1
1.1.1.1
自前でコピーしとけってことか。
そんなの山ほどあるよ gmtime,localtime,asctimeなんかみんなそうだし、 strtokもstatic変数使ってる たとえマルチスレッドライブラリを使用していても 関数引数に2つ渡せない、+-等の演算で2つ使えない、再帰処理中に使えない、は皆同じ
>>525 で、結論的には、
1.static変数を戻り値で返すな。gmtimeなんかうんこ。もう使ってやらん。
2.なんか山ほど例があるので、いいんじゃないの。あんま気にすることないだろう。
の2ってことでよろしいか?
結論は、 一長一短あるからmallocしようがstatic返そうが好きにしろ。
STATICで戻り値の関数は、知らないで使うとバグの元になりそうだね。 gmtimeなどは一般的な注意知識として、喚起されているので しょうか。 知らなかったので、自分が今までに書いたソースが大丈夫か と一瞬焦ったのですが。
>>528 > gmtimeなどは一般的な注意知識として、喚起されているので
> しょうか。
UNIX系だと man gmtime すれば書いてあるし、
WindowsだとMSDNにはあるし…。知らないのは不注意という気がする。
> WindowsだとMSDNにはあるし…。知らないのは不注意という気がする。 OSだけに依存するの?
531 :
デフォルトの名無しさん :02/02/26 13:28
argumentとparameterは意味的にどうちがうのでしょうか?
数学用語ではargumentは「独立変数」parameterは「媒介変数」だろ? C的に言うとargumentは関数の引数、parameterは関数の引数とは 限らずグローバル変数かもしれない。
>>532 プログラミングでは訳語が決まってて、それぞれ実引数と仮引数となってる。
意味は次のとおりね。
実引数 (argument)
関数呼び出し時に、関数に渡す値
仮引数 (parameter)
呼ばれた関数で、渡された値を参照する引数
例
int foo(int n); // n は仮引数
foo(3); // 3 は実引数
534 :
デフォルトの名無しさん :02/02/26 13:58
>>532 そうすると、占めるメモリ領域の違いに応じて本来ならば
厳密に使い分けないといけないということですか?
今FAQを読んでました。そこにはこう書いてあります。
argument:
関数呼出し式において、括弧で囲みコンマで区切った並びの中の式
関数形式マクロの呼出しにおいて、括弧で囲みコンマで区切った並びの中の前処理字句の列
parameter:
関数宣言あるいは関数定義の一部として宣言され、関数に入る時点で値を得るオブジェクト
関数形式マクロ定義におけるマクロ名の直後の括弧で囲まれコンマで区切られた並びに現れる識別子
これだけじゃなんのことかよく分からなかったので。
解釈の細部に関する事柄になるのかな?
>>532-533 どうもありがというございます。
言語的な詳細は分かりませんが、
お二方の説明を総合して、
引数を関数の内側と外側のどちら
見た違いという理解に留めておきます。
ありがとうございました。
#include <stdio.h> { printf("ガンバッテルね\n"); }
↑何言語だよ
C♭
>>539 なるほどね。だが、残念ながらスレ違いだ。
541 :
デフォルトの名無しさん :02/02/27 23:03
でかい配列使うのに、static宣言とmalloc()使うのどっちがいいの?
時と場合によるが基本的にはmallocだな。
配列の長さが不定ならmalloc
>>541 使い捨ての数値計算プログラムなら前者。
というかグローバル変数を使う。
>>543 malloc を使う理由
- 必要なサイズが、実行してみるまで分からない
- 再入可能にしたい
- スレッドセーフにしたい
static を使う理由
- ヒープの断片化を防ぎたい
- コンパイル時に決まった値で初期化したい
546 :
デフォルトの名無しさん :02/02/27 23:25
547 :
デフォルトの名無しさん :02/02/28 00:49
\#include <stdio.h> int main ( void ) { int a; unsigned int b; a = -1; b = 0; if ( a < b ) { printf ( "b is bigger then a.\n" ); } else { printf ( "a is bigger then b.\n" ); } return 0; } この結果に驚くのは私だけ?
警告出るだろ
>>547 thenはthanの間違い?どうでもいいけど。
550 :
デフォルトの名無しさん :02/02/28 00:52
gcc-2.95.3-8(linux)では警告がでなかったが?
551 :
デフォルトの名無しさん :02/02/28 00:53
then の間違い。
bは大なり 是a。 aは大なり 是b。
if(a<b) こうした時はaの型で見るんだっけ?bの型でみるんだっけ? unsignedで比べたらfalseになるけど。
同じサイズの符号付き正数と符号無し正数を比較もしくはその他の二項演算を行う場合 符号付きの項は符号無しのほうに符号拡張される。 -1を符号無しに符号拡張したときの動作は未定義。 だが普通は0xffffffffのような大きな符号無し正数に変換される。 コンパイル時に警告がでる場合がほとんどだろう。
同じサイズの符号付き正数と符号無し正数を比較もしくはその他の二項演算を行う場合 ↓ 同じサイズの符号付き整数と符号無し整数を比較もしくはその他の二項演算を行う場合
>550 もちろん、-Wallはつけた上での話だろうな。
げっ、gcc version 2.95.3-5 (cygwin special)だとでないぞ 腐っとる・・・
>>554 符号無しとして見るんですね。ありがとうございました。
符号ありなら要キャストか。
559 :
デフォルトの名無しさん :02/02/28 01:36
>>541 プラットフォームにもよるが一般的にはmalloc。
static配列デカイの作ると実行モジュールサイズでかくなるだろ。
かといってStack上に作ればstack overflow起こすし。
561 :
デフォルトの名無しさん :02/02/28 04:00
>>560 初期化してない、もしくは0初期化なら実行モジュールサイズには
影響されないんちゃう?
562 :
デフォルトの名無しさん :02/02/28 04:31
#define D(a) itte として D(a)yosi が itteyosi ではなく itte yosi(スペースが入る)と展開されるのは 規格で決まってますか?決まってれば少しありがたいのですが。 vc6では cl /E の出力ではスペースがないが、実際のコンパイルではスペースが入ってるようです。 gccでは gcc -E も実際のコンパイルでもスペースありになってました。
>>559 gccで符合のありなし比較の警告を出すのは -W だよ。
unsigned char から const char * に変換する方法在りますか? len = (int)strlen(byte型); としたいのですが・・・。
お前向こう一年間キャスト禁止。 VCなら len = _mbslen(bytes); 長さを取り扱う型はsize_tだぼけ。
もっか一回だけお願いします! byte bitmaps[][12] = { {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, ・ ・ ・ とあるのを for (i=32; i<127; i++){ len = _mbslen(bitmaps[i-32]); と出来ますか?
>>567 なんだ そりゃ?
何がやりたいんだ?
つーか、出来るか出来ないか自分でやってみりゃイイだに。
( ゚Д゚)ハア? _mbslenで何を取得する気? > unsigned char から const char * に変換する方法在りますか? 「unsigned char* から const char*」か?
>>568 glutで文字を出したいんですけど・・・。
glutBitmapCharacter(void *font, int len);
glの方で自分が間違ってるか、上で書いた部分が
間違ってるのか良くわからないので・・・。
571 :
デフォルトの名無しさん :02/02/28 09:29
glutBitmapCharacter は OpenGL を用いて, ビットマップ・キャラクターを描画します. void glutBitmapCharacter(void *font, int character); font 使用するビットマップ. character 描画しようとする文字(8ビットに制限されていません). の様です・・・。
>>571 すいませんその様に致します。m(__)m m(__)m m(__)m
574 :
デフォルトの名無しさん :02/02/28 14:38
お客さんに渡す資料のなかにフックという言葉があり 物議をかもしています。フックのうまい説明ないですかね?
フックって何?
576 :
デフォルトの名無しさん :02/02/28 14:44
自分はC組めないからよく説明できないんだけど、 仮にプログラムに3D描画機能があるとする。 でも外部からその3Dを呼び出すためのAPIがない。 そこでフックなるコードをプログラムに埋め込んで、 任意で呼び出せるようにする、みたいなもんだと思う。 ただし完全なAPIではないのでいろいろ制限がある。
fuck?
578 :
デフォルトの名無しさん :02/02/28 14:57
hookです
イベントのよこどり
580 :
デフォルトの名無しさん :02/02/28 15:10
"W" モードでfopenしたらファイルのオープン失敗した... なぜ?
横山フック
586 :
デフォルトの名無しさん :02/02/28 15:23
string操作関数(strcmpやらもろもろ)で 日本語テキスト(SJIS,JIS,EUC,UNICODE)での 動作は処理系によっては保証されてないと思って コーディングすべきでしょうか。
フロントフックブラ
>>574 脇をしめ,内角に向かってえぐり込むように打つべし
七フック神
フック山雅治
モックン フックン
FreeBSD な環境で、ログインする時のパスワード打ち込み時のように、 端末にエコーバックされないようにするためにはどうすればいいのでしょうか。 特別なファイルオープンだとかがあるのでしょうか。
>>593 簡単に済ませるなら stty コマンドを使って stty -echo
マジメにやるなら ioctl システムコールを使って、端末の動作を設定
>>593 パスワード入力目的なら、getpass()にしよう。
自力でやろうとすると、
>>594 のいうように、結構大変だよ。
man termios とか調べないとだめかも。
>>594 , 595
man termios,ioctl しましたけど私の実力だとかなり厳しそうなので
取敢えずの所、getpass() でやってみようと思います。
どうもありがとうございます。
横取りとかそういういみじゃないの? < hook たとえば、割り込みルーチンをCでかくときに、 hook するよね。 曖昧なしったか君なんで、偉い人のマジレスきぼんぬ。
>>580 ファイルがないとか?
W+ でopen したら?
移植コーディング中に問題発生。 旧いコンパイラでは、0/2 のように 0の除算をすると0を返していた(信じられん) が新しいコンパイラでは不定値 が返る。 そのため、除算専用の共通関数を作って該当箇所を全て置き換えるか、 マクロを定義して置き換えるか迷っている。 俺的にはマクロだと思うが、おまえらどう思いますか? また、ほかにもっといい方法はありませんか? よろしくおながいします。
>>599 >旧いコンパイラでは、0/2 のように 0の除算をすると0を返していた(信じられん)
おまえの頭が信じられん
>>600 >>旧いコンパイラでは、0/2 のように 0の除算をすると0を返していた(信じられん)
>おまえの頭が信じられん
すまそ。
2/0のように0で除算をすると
の間違いでした。(鬱
>>599 なんとなくマクロで。
ちなみに、0除算(あ、これじょざんて言うのか・・・じょさんかと思ってた)
でトラップだか例外だかが発生しない環境なのー?
603 :
デフォルトの名無しさん :02/02/28 23:39
初心者です。 if文でCの式はその結果が0以外の値なら真、0ならば偽と評価される というのはどういうことですか。 また、「次の式のうち真なのはどれか答えなさい」という問題で a. 0 b. 1 c. 10*9<90 d. 1==1 e. -1 で答えはb,d,eなのですが、bとdがどうして答えなのかわかりません。
>>603 そのままの意味です。0以外=真、0=偽。日本語読めませんか?
そーすると b と e が真なのは、定義そのままで、疑問の余地なし。
d は、1==1 は真なので、真です。
606 :
デフォルトの名無しさん :02/03/01 00:02
>>605 ごめん。オレ知らない>#define展開時の詳細規則
>>606 どういうことって、数字の 0 だ。 1 より 1 小さい奴。 -1 より 1 大きいの。
609 :
デフォルトの名無しさん :02/03/01 00:08
>>606 整数のゼロです。
>>605 スペースが入るというか、そこにホワイトスペースがあるのと同じ扱いのはず。そういう妙な識別子の連結は ## を使わない限り行われないはず。
>>606 0はゼロだよ。で例えば、Cで何かを比較した場合、
a<b
a==b
a!=b
とかね。これらの関係が成り立っていれば、1を返すことに決まってるのよ。
ちゅまり、
printf("%d\n",1>0);
printf("%d\n",0>1);
ってやると、
1
0
って表示されるわけ。なので、
if (11<10) とか
if (0)
は、どちらもelse以降が実行される。
if (10<11) とか
if (1) とか
if (30)
は、どれも直後の文が実行される。実際やってみれば判るはず。
1というか、非0
if文が判断できるのはゼロか非ゼロだけ。
>0というのはどういうことですか? 見れば見るほどすごい質問だな…
615 :
デフォルトの名無しさん :02/03/01 00:17
くだらない質問ですみません。 printf("2数を入力せよ"); scanf("%d%d", &i, &j); printf("整数を入力せよ"); scanf("%d", &i); printf("整数を入力せよ"); scanf("%d", &j); 上の2つは同じことですよね。どちらを使いますか? 一番上のは、一つめの数を入力してからエンターキーを 押してから2つ目の数を入力しますが、なぜエンターキー なのですか?
>>615 別にエンターでなくても、スペースで区切って2つの数を入力してもおっけー。
scanfは改行飛ばしがなんたらじゃなかったけ(´-`)?
あれほどscanfは使っち(略
>>615 まずscanfを使わない。
エンターキーなのは、標準入力が行単位でフラッシュされるバッファを
経由しているから。
これからwindows上でC言語の勉強を始めようと思っています。 そこでフリーソフト等のソースファイルを参考書代わりに 勉強しようと考えているですが、 お勧めのものはありませんでしょうか??
622 :
デフォルトの名無しさん :02/03/01 00:36
615です。
scanfを使わないってどういうことですか?
>>619 初心者なので言葉の意味が分からないです、すみません。
標準入力、フラッシュ、バッファを経由する、の意味を教えてほしいです。
>>620 そゆことじゃなくて、真=1、偽=0って思わせるような書き方がマズいんだと思われ。
>>622 俺はよく知らないけど、scanfは使わない方がいいらしい。
でも、scanfって必要になることある?
>>623 なる。
if(1)外して、if(30)だけにしとけばよかったかな。
フラッシュ → fflush(stdout);
厨房:gets 初級:fgets 中級以上:scanf
>>622 例えば、
char c[10];
scanf("%s", c);
で、画面から20文字入力しちゃったりすると…
#include <stdio.h> int main (void) { char arry[2][5] = {'o','r','e','a','h','o','\0'}; for (int i = 0 ; i < 2 ; i++ ){ printf ("%s\n",arry[i]); } return 0; } を実行すると oreaho o って表示されます。 自分的には oreah (↑2行目は何も表示されない) という結果になるのかと思ってたんだけど・・・・・ arry[2][5]が大きさ5の物を2つ宣言しているのはわかってます。 printfで%sが文字列(最初の\0まで)を表示することもわかってます。 でも、%sにchar[5]の物を与えているんだからoreahまでしか 出力されないもんだと思ってました。 charの配列に\0を入れないのが悪いというのはわかってるんですが なんかしっくり来ません。 こんなお猿さんに愛の手をっ!!
>>630 残念ながら、多次元配列はふつーめもり上に一直線に確保されます。
なので、切れ目っていうのはありません。そこはプログラマの責任で
がんばらないといけません。
unknown software exception が0x00000027で発生しました
634 :
デフォルトの名無しさん :02/03/01 00:54
2/8 はなぜ0になるのですか?
635 :
デフォルトの名無しさん :02/03/01 00:55
>>634 整数型で計算すると余りが破棄されるから。
これはさすがにネタぽ
2/8 = 0.25 小数部を破棄して0
638 :
デフォルトの名無しさん :02/03/01 00:57
じゃあ、2/14はなぜ0になるのですか?
2/14に貰ったチョコが0個だったからさ・・・
641 :
デフォルトの名無しさん :02/03/01 01:01
(´-`).。oO(自演だね)
じさくじえんだろう
640=641=642=643
なるほど。だからオレの環境では printf("%d\n",2/14); が Inf ってなるのか・・・
>>631 ヨーク考えてみたらわかった。
%sに与えているのはchar[5]の配列ではなくて
特定のchar(あえて書くならchar[1])のアドレスなのね。
そこのアドレス以降ではじめて\0が出てくるところまで
出力すると・・・・・
>>645 の環境は%dでInf出るのかYO!
ネタ結構だけどせめて%fでやってホスィ
>>647 ツッコミさんきゅーーー!!!
だれもネタにつっこんでくれなかったらどうしようと心配だった・・・
あぁそうさ。オレの環境でも0って出るのさ。ちょっと見栄はってみたかったんだよーーーん。
正直氏んでホスィ
>>624 標準関数のソースってどこにあるんですか?
>>650 環境は? *BSD とか使ってるなら /usr/src/lib/libc 以下にあるし、VC6 なら
C:\Program Files\Microsoft Visual Studio\VC6\CRT\SRC (インストール先
を変えてなければ) あたり。
>>651 cygwin の gcc です。*.c で検索してみたけど出てきたのは違う気が...
glibcか何かのソースに入ってるのかな?ちょっと探してきます。
ちなみに今 GNU の fileutils-4.1 を拾ってきて ls のソースを読んでみてい るんですが...難しい。
GNU のソースはどれも汚いよ。職人芸の極みだ。
>>653 GNU のソースはポータビリティの優先度が高いので、はっきりいって汚いコード
が多い。勉強のために読むなら *BSD の方が良いと思うぞ。
657 :
デフォルトの名無しさん :02/03/01 22:20
is_prime =1; for(i=2;i<num/2;i++) if((num%i)==0) is_prime =0; if(is_prime==1)printf("素数です"); else printf("素数ではありません"); こう書いてある本があるんですけど、おかしくないですか。 for文に{ }ってつけますよね。
>>657 > for文に{ }ってつけますよね。
ループ内で実行する文が複数あればな。
661 :
デフォルトの名無しさん :02/03/01 22:58
char *Generate(void) { char c[12]; ……(文字列を生成してcに代入する処理) return c; } 上記のような、文字列のポインタを返す関数を書いて、 ダイアログプロシージャで以下のように書きました。 SetWindowText(GetDlgItem(hDlgWnd, IDC_EDIT), (LPCTSTR)Generate()); Generate()で生成した文字列がエディットボックスに 表示されるはずなんですけど、どうも期待した動作になりません。 どうやったら文字列のポインタを渡してそれを表示できますか。 仕方ないので今は c をグローバル変数に変えて Generate(); SetWindowText(GetDlgItem(hDlgWnd, IDC_EDIT), (LPCTSTR)c); としています。でも何か格好悪いです。
662 :
デフォルトの名無しさん :02/03/01 23:00
>>661 自動変数のアドレスを返してどうする。
静的変数にしろ。
Generateの戻り型をCStringにしる!
#define CString static char
今だ!666ゲットォォォォ!!  ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ (´´ ∧,,∧,,,,,, ) (´⌒(´ ⊂ミ゚Д゚⊂ `つ≡≡≡(´⌒;;;≡≡≡ """"" (´⌒(´⌒;; ズザーーーーーッ
>>660 まったくもっておかしくないよ。
試しにコンパイルしてみればいいじゃん。
>>662 static char c[12];
と宣言したら期待していた動作になりました!
>>663 CStringなる型を使ってみましたが、
未定義のシンボルだと叱られてしまいました。
では、どうもありがとうございました。
669 :
デフォルトの名無しさん :02/03/01 23:31
>>667 そういう意味じゃなくて、forには疑問を抱いているのに、ifやelseには疑問を抱いていないということがおかしいと思ったから聞いたの。
関数も一文だけならできるかと思ったけど 当然できない(;_;)
>>670 今、俺もそう思って試しやってみたところ(笑)
×試し ○試しに
一文なら関数にするまでも無いからかな。 さすがリッチィ様(愛)
動的にfor文の最大値を動かすのはどうなのでょうか?
677 :
デフォルトの名無しさん :02/03/02 02:01
678 :
デフォルトの名無しさん :02/03/02 02:02
forの判定式の部分に変数を使えばいいんでないの?
for(i=0; i<max_count; i++) if(finish) max_count = i;
>>676 こう?
for(i=0; i < i+1; i++);
それ実行しないよw
違う。止まらないよだ。
とまるよ
とまるってばよ
ハァ?どやって止めんのよ?
やってみなよ
intだからってオチはないよな?藁 そもそもiの宣言書いてないんだし。
>>691 unsignedでも止まることは止まる・・・けどね・・・
bignumという罠
ここはCスレ
longlongという罠。
char*という罠
名スレの予感・・・
#define for(exp) do{}while(0)
すいません書き方が悪かったです・・・。 プログラム的には良く使われるかどうか聞きたかったでが・・。
>>700 差し支えなければ、たとえばどのような時に
多く使用されるのでしょうか?
>>702 遅くまですいません・・。
紙にカキコして流れを追ってみます。φ(`∇´)φ
ではオレンジジュースに行ってから寝ます。
後、SONYのVAIOに詳しい人居ませんか~?( ゚Д゚)ホスィ
ではでは。m(__)m
704 :
デフォルトの名無しさん :02/03/02 03:39
>>703 この問いには正解ってもんは無いと思うが・・・
forの継続条件が動的に可変なのは、正直お薦めしない。
forはwhileで置き換え可能なんだから、こちらの使用をお薦めする。
こちらの方が可読性が上がると思われ。
で、VAIOは板違いだ!( ゚Д゚)ゴルァ!
705 :
デフォルトの名無しさん :02/03/02 04:19
caseが一つしかないなにswitchを使う理由はなんなんでしょう? ifを使わない理由が知りたいです。
>>705 世の中にはif文を嫌うキティちゃんがいます。
>>706 その理由が知りたいです。簡単でいいので
彼らがifを嫌う理由、教えていただけませんか?
単純な比較ならswitchの方が最適化されるということですね。 こんどからそう理解しておこうと思います。
>>707 さあ?俺には理解できないので。
嫌う人がいるのは知っているけど、その理由まではわからない。
自己満足とか?
>>708 単純な比較の最適化なら大して変わらないと思うが。
今は一つでも、後から付け足して 結局 case を使うかもしれないような場所では そういうふうに書くかも。 コマンドラインのオプションのような 後から増えることがありそうなものとか。 そういうものでは if 使うより意味的にも合ってる感じもするし。
712 :
デフォルトの名無しさん :02/03/02 05:10
>>705 その条件が仕様変更とかで、将来増える可能性が有るからかと。
1つの条件が2つ3つと増えるかもしれないって考えるなら、
最初からswitchで書くのもアリかと。
単純にtrue,falseだけの条件ならif使うけど。
> 結局 case 使う でなく > 結局 switch 使う です。 普段 switch がなくて case はある言語を使ってるもので…。
こんな時間にケコーンしてしまうとは・・・ 会社に泊まって仕事してたばっかりに(w
>>716 こんな時間に仕事っすか…。ご苦労様です。
ガムバッテください。
ちっ・・・無視された・・・・ VBか?って聞いただけなのに。
>>718 4時位で仕事切り上げて、ここで遊んでた(w
でももう寝る。おやすみー
むしろ条件が増える可能性があるところでは 可能な限りswitchを使えということかな? そうすれば後から見たときに、ああ条件が増える こともあるんだな、って分かるというか。。 こういうコーディング規約なんて見たことありますか?
>>707 まっとうな理由なら、今朝ご結婚なされた
>>711 >>712 夫夫(ふうふ)の
おっしゃることが理由かも。
ただ、if のかわりに switch case と聞くと、どうも昔のBASICのなごりで、
「ifは遅いからON GOTOを使え!(by Dr.D)」ってのがいまだにひっかかってて、
コンパイラ時代に取り残されてしまった可哀想な方々を想像して
しまうんだけど、想像力逞しすぎですか?
>>721 ない。
というか、後から条件が増えそうな場合には、条件をデータファイルに切り出して
switch - case や if else のロジックでプログラムに埋め込まないようにする。
普通、Cもコンパイラなんだけど・・・
コンパイラ時代に乗り遅れた、これなら意味とおる?
>>724
>>722 switchはジャンプテーブルに変換されるんでifより速いよ。
全てがではないけどね。
>725 なるほど。逆の意味にとってたよ~(;´Д`)。 スマソ。
728 :
デフォルトの名無しさん :02/03/02 13:45
strlen("abc"); sizeof "abc" - 1; どっちが早いですか?
0.5秒くらい考えればわかるはずだが?
>>729 初心者いじめるなよ・・・ 禿同だけど。
>>728 strlenは、文字列を1文字づつ確認して長さを求める。
sizeofは、コンパイルする時に値が確定する。
あと5秒考えれば解るぞ(w
>>730 > strlenは、文字列を1文字づつ確認して長さを求める。
とは限らない。C 標準関数呼び出しは、コンパイラの判断でインライン展開する
ことも許されてる。結果的に strlen("abc"); がオブジェクトコードでは定数になっ
てるかもしれんぞ。(まぁ重箱の隅だけど)
>>731 >C 標準関数呼び出しは、コンパイラの判断でインライン展開する
>ことも許されてる
へ、そうなの?初めて知ったよ、そんなの。
たとえインライン展開してもstrlen("abc")が定数になるのは難しくないか? 各標準関数毎のインライン展開時の最適化が仕組まれていないと。 不可能ではないだろうけどさ…
>>732 あまり知らなくても困らんしね。gcc なら -mmemcpy とか VC6 なら pragma の
intrinsic とか調べると書いてあるよ。
>>733 > 各標準関数毎のインライン展開時の最適化が仕組まれていないと。
C 標準関数のインライン展開は C++ の inline 関数と違って、たいていはコンパイラ
が直にアセンブルコードを出力するようになってるから、不可能ではないよ。ただ、
そこまでやってる処理系が存在するかどうかは知りません。
strlenの引数がポインタ変数か文字列リテラルかを判別した上でないと、 定数化はできないと思われ…
「sizeofはコンパイル時に定数として確定する」 だけで十分だろ。 コンパイラがリテラル定数を引数に取るstrlenをコンパイル時に解釈するかどうかは 環境依存な問題だ。
>>735 もちろんそうだが、インライン展開する場合にはコンパイラは必要な情報を
持ってる(構文解析した結果のツリー構造をメモリ中にもってる)から、定数
展開はできるよ。(っつか、俺が昔書いた処理系ではそうしてた)
ただ、それは重箱の隅だというのも最初から言ってる通り。
あと個人的にはワイド文字を使うときに死ぬ可能性が高いのと可読性が落
ちるから、文字列長を取得する目的で sizeof() を直にコードに埋め込むは
お勧めしないけど。LITERAL_LEN() みたいなマクロを一つ定義した方が良
い。
738 :
デフォルトの名無しさん :02/03/02 14:58
fgetc(fp)って ファイルfpからデータをどういう風に読み込むんでしょうか? 読み込んだら次はどこを読み込むんでしょう?
strlenがインライン展開された後まで、「文字列の長さ」っていう 意味を保持するのは、技術的に興味あるなぁ。 int i; {char* ptr;for(i=0,ptr="abc";*ptr;++ptr,++i);} が i=3; に最適化されるってのも、すごいけど。
fpはファイルではない。 ファイルを読み書きするための情報がつまった構造体へのポインタだ。 読み書きするための情報がつまった構造体の実体は標準ライブラリの中にある。 読み込んだら、「次」のデータを読み込む。 直前にungetcしてたら、ungetcしたデータを読み込む。
>>738 って言うか、どういう意図でそういう質問をしてるのかがわからん。
>>739 strlen をインライン展開する場合には
strlen '(' expr exclude literal ')'
OUTPUT "push addr_of(var)"
OUTPUT "call strlen"
strlen '(' literal ')'
size_t n = strlen(value_of(literal))
OUTPUT "mov reg <- %d", n
ってな感じで、コード生成ルーチンを分ければ簡単じゃないの? 引数が
文字列リテラルか変数かは構文解析の段階で分かってるわけで。
すみません。質問の意味がわかりにくかったみたいですね。 ファイル(0と1が並んだファイル)からデータを読み込んでbit処理する次のプログラムがあって、 どうなってるのかよく分からなかったので質問しました。 bit_index = 1; do{ byte_data = (unsigned char)fgetc(fp); work = (unsigned char)(byte_data << (bit_index-1)); work = (unsigned char)(work >> 7); bit_index++; }while(work = !0); この場合最初読み込むデータが1のときは work >> 7 で左に0が7入って00000001になるってことでいいんでしょうか? 後、次にfgetc(fp)でデータをお読み込んだとき 読み込んだ値は一番左の0に上書きされるんでしょうか? それとも全体が一つ右にシフトしてデータが一番左に入るんでしょうか? bit処理演算子を使ったことなくて本読んでもよく分かりません。 何でbit処理するのか
>>742 その、「リテラルだとコンパイル時に関数が返す値が決定できる」っていう
情報は、どーやって表現するのか、っていう問題だよ、興味があるのは。
745 :
デフォルトの名無しさん :02/03/02 15:45
>>728 って言うか、どういう意図でそういう質問をしてるのかがわからん。
>>739 「strlen は文字列の長さを返す関数だ」って情報をコンパイラが
持っておきゃいいだけでは? memcpy, memmove, strcpy, strlen 辺りを
組み込み関数として展開する場合だと、C++ の inline みたいに
関数のソースを呼び出し元にそのまま持ってくる…みたいな悠長な展開は
あまりやらない気がする。
VC++だとこんなん出た。
> xor eax, eax
> mov edi, 0040A250 ; "abc"
> or ecx, -01
> repne scasb
> not ecx
msnなどのブラウザチャットをmschat2.5 で繋げる方法はありますか? そのたJAVAチャットをソフトで繋ぐ方法があれが教えて
748 :
デフォルトの名無しさん :02/03/02 15:47
>748 mschat2.5 などのチャットソフトのこと いってるんデス
>>728 って言うか、それはfgetcには関係無い質問だと思うが・・・
751 :
デフォルトの名無しさん :02/03/02 15:50
>>746 それは、コンパイラが情報を持ってるんじゃなくて、標準関数のインライン展開ルーチンを
関数ごとに持っているっていうだけで、「strlen は文字列の長さを返す関数だ」って情報を
コンパイラが持っているわけではないでしょ。
つか、激しくスレ違いなので、ええですよ、もう。
関数型言語によくある、パターンマッチングみたいな方へ話
がいっちゃうから。
>>752 > 標準関数のインライン展開ルーチン
> 「strlen は文字列の長さを返す関数だ」
どこが違うのか謎だが。
>>717 >>719 ああっ、すまん。
見えてなかったのだ…。
VB じゃなくって Haskell です。
strlenはsizeofで最適化するとして、 他の標準関数Aはそれ用の最適化パターン、 標準関数Bはまた別の最適化パターン… といった、関数毎の情報をコンパイラが持つ必要がある、 って事でしょ。
>>753 752の言いたい事とは違うかもしれないけど。
strlenは標準ライブラリと言うだけで、C言語そのものの仕様には含まれない。
つまりコンパイラそのものは、strlenの存在は知らない。
故にstrlenを定数として返す事は無いんではなかろうか?
技術的に可能で有ったとしても。
>>756 > strlenは標準ライブラリと言うだけで、C言語そのものの仕様には含まれない。
ANSIでは含まれていなかったが、C89以降ではC言語そのものの仕様に含まれている
どーでもいい話なのが ライブラリの提供者がインライン展開しやすいように strlenをinline属性で提供していて、かつ、 コンパイラが、リテラルを走査する簡単なインライン関数を コンパイル時に処理してくれる場合、返す可能性はあるな。 strlenが言語仕様として規格化されているかどうかは全く関係ない。 技術的には可能だ。 行きすぎた最適化のせいで意図しないコードが出されることよりは ある程度、書き手の想像の範囲内でコードが出される方がヨイ場合も多い。 想像だけで考えてないで、コンパイラに関する理論をちょっとでいいから かじっておきなさい。
たとえば、実装が _strlen(char* ptr){ int i; for(i=0;*ptr;++ptr,++i); return i; } のような場合、 strlen(char* ptr){ #if isLiteral(ptr) size_t n = _strlen(value_of(literal));// OUTPUT "mov reg <- %d", n #else OUTPUT "push ptr" OUTPUT "call _strlen" #endif } っていうのが、関数ごとにコード生成ルーチンを持っている例だとすると、 strlen(x[0]:x[1]: .. :x[n]){ return n; } が、「コンパイラが文字列の長さをかえすことを知っている」ってところでしょか。 こんな感じのが、「実装ではなくて、宣言として」書ける(Cの構文でなくて、 コンパイラのコード生成情報として)っていうようなのを想像してます。 ほかにも、再帰を使って定義するとか・・・ (スレ違いのうえに、電波っぽくなってきたぞ… つか、電波だな、ゴメソ)
>>755 > 数毎の情報をコンパイラが持つ必要がある、
その通り。
逆に C++ の <algorithm> のように static inline 関数定義するのは、C 標準ライ
ブラリでは不可。
> 7. Library
> 7.1 Introduction
> 7.1.2 Standard headers
> 6 Any declaration of a library function shall have external linkage.
これに抵触してしまうから。
inline版とstatic版を両方提供してはいかんとは、書いてないな。
>>759 strlen("ABCD\0EFG")
を正しく展開できるのか?それで。
>>761 inline はそもそも static だと思うが。
あと、たしか同一の名前をもつ関数を external, static 両方で定義した場合の
動作にも規定があった気がするが、見つからんな。
>>762 後者
> strlen(x[0]:x[1]: .. :x[n]){
> return n;
>}
の方だと NG だな。
>>742 のヤツなら大丈夫だけど。
やっぱここは男らしく __builtin_strlen() の登場だろう。 はい、これで議論おわり。
随分盛り上がったな。 で、ここで回答してる人たちで、定数欲しいのにstrlen使う人居るの?
>>761 インライン版というと C++ のインライン関数展開を連想しそうなんで、組み込み版
とでも読んだほうが良いかも知れん。
インライン版
ソースコードが、コンパイル対象のプログラムと同じ言語で書いてある。コンパ
イル時にコンパイラがインライン展開し、後は普通にコンパイル。
組み込み版
ソースコードはコンパイラ内部に(たいていはアセンブル直接埋め込みで)書い
てある。コンパイル時にコンパイラの内部状態、とくにパーサーがもっている情
報を使える。
まとめだが、
- C 標準ライブラリは「組み込み版」で提供することは認められている。ただし、
同時に外部リンケージを持つライブラリ関数も提供することは必須。でないと
size_t (*pf)(const char *) = &strlen; とかコンパイルできなくなってしまう。
- C 標準ライブラリを「インライン版」で提供するのは不可。C 言語の規格で、標
準ライブラリ関数は外部リンケージを持つことが要請されているため。
でいいかな。
リテラルに対してstrlenを多用してるどうしようもない糞コードを 手を入れずに高速化したいやつはいるだろうな。
っていうかリテラルにstrlen()を使うような状況って珍しいだろ。
個人的な意見としては、 strlen(リテラル)くらいコンパイラが最適化してしかるべきだと思う。 それくらいは。
#define LITERAL "foo" if (!strnmp(str, LITERAL, strlen(LITERAL))) { }
772 :
デフォルトの名無しさん :02/03/02 17:52
>>771 ああ、マクロなら文字列リテラルにstrlenをつかってもおかしくないか。。
773 :
デフォルトの名無しさん :02/03/02 18:02
ところで、sizeof("ABC") って 3 なの? sizeof(char[3]) と等価? sizeof(char*) と思ってた。
774 :
デフォルトの名無しさん :02/03/02 18:06
>>773 > ところで、sizeof("ABC") って 3 なの?
4だよ。
あぁ、3 じゃなくて 4 か。どうもです。
#define LITERAL_LEN (sizeof(LITERAL)-1)
778 :
デフォルトの名無しさん :02/03/02 22:06
void func( a) unsigned char a[y][x]; { とすると再定義されましたっていうエラーが出ます。 他の関数ではこのエラーが出ないのでなぜかと悩んでいます。 よろしくお願いします。
yとxはいったい何なんだ?
変数というか定数です。すみません。
配列の宣言に、グローバル変数を添え字として使うことはできません。 配列の宣言に、グローバル変数を添え字として使うことはできません。 配列の宣言に、グローバル変数を添え字として使うことはできません。
>778 unsigned char a[y][x]; はコンパイル時にx,yが定まってないとコンパイル不可
funcを使用しているすべてのソースファイルの頭の方で extern void func(); と書いたヘッダファイルをインクルートしる!
>>782 ,783
ちょっと行き違いがあったようですみません。
定数なら大丈夫なんですよね?
やってみな
>>784 extern宣言はしてるんですけど、ダメみたいです。
どうしてなんでしょう?
gccだと int main(int argc, char** argv) { char a[argc]; } こういうのありなんだけど・・・
784は嘘
>788 gccローカルな機能は使っちゃ駄目。 C99からは正式サポートだけど。
>>790 C99ってのがよく分からないんだけど、
いずれ89のやつに置き換わったりするのかな?
>>788 え~っと、どういうことなんでしょう?理解不能です。
>>792 C90 だと配列の要素数は、コンパイル時に確定できる定数じゃないとダメなんだ
が、gcc だと拡張機能で変数のような「実行時に確定できる値」も OK になってる
という話。
C90 でこういう事をやりたい場合、ふつーは alloca() を使う。非標準の機能だが、
大抵の処理系でサポートされてる。
794 :
デフォルトの名無しさん :02/03/02 22:32
>>793 mallocと違うの?
関数を抜けるときに自動的にfreeされるとか?
引数の値は評価してスタックにpushするってだけじゃないの?
>>794
796 :
デフォルトの名無しさん :02/03/02 22:35
そういえばApacheのソースにもalloca()があったな。
>>787 ヘッダと関数定義を両方とも↓の形式にしたらどうなる?
void func(unsigned char a[y][x])
これでもダメなら
へっだ
#ifdef __cplusplus
#extern "C" {
#endif
extern void func(unsigned char a[y][x]);
#ifdef __cplusplus
}
#endif
本体
#include "へっだ"
void func(unsigned char a[y][x])
{
でやってみれ!
gccジュニア
はっぴゃくげとずざぁ
801 :
ビル・ジョブス :02/03/02 23:43
sizeof(TEXT("ABC"))/sizeof(TCHAR) って書いて欲しい・・・
_TCHARの方がよくないか? どっちにしろVCのtchar.hに依存しとるが。
803 :
ビル・ジョブス :02/03/02 23:52
構造体とかでも全体のサイズを型で割れば数を求められるぜ。 #define DIM(x) (sizeof(x)/sizeof((x)[0]))
#define DIM(x) (sizeof(x)/sizeof(*(x))) 普通はこっち 今日のおまえは格段にしょぼいな
どっちでもいいんじゃねーの?
806 :
ビル・ジョブス :02/03/03 00:08
あー、そーかもな・・・ 言い訳する気はないが、昔々のコンパイラでそれエラーになってさー・・・
807 :
ビル・ジョブス :02/03/03 00:13
でも、しょぼいとか言うなよ・・・おまえイカか?
よくわかったな、俺の正体。
a book on c って本は面白いですか? 読んだことある人、感想聞かせてよ
正直、読んだこと無い。 4版まででてるのか...
811 :
デフォルトの名無しさん :02/03/03 01:59
関数で f(int &x) { ってすると、&の前に)が必要だとか、{が必要だとかいう エラーが出てしまいます。 どうしてなんでしょうか?
f(int *x) {
>>812 *xじゃないといけないって意味だろうけど
&xだと逆参照演算子を使わなくてすむっていうメリットがあるぞ。
kokohaCsure
>>812 &xでも定義はできるはずだと思うんですけど。
>>806 X Window System のマクロ XtNumber が、まさに
>>803 なのは
多分そういう理由。
>>811 まさか C じゃないよね?
ここはCスレだ
低レベルな煽りか
819 :
デフォルトの名無しさん :02/03/03 03:03
ポインタがある意味がいまいちわかんないんだけど、どーして?
貴様には想像もできない深遠な理由があるのだ。 アセンブラの勉強してから出直してこい
822 :
デフォルトの名無しさん :02/03/03 03:09
>820 そのうちが半年続いてるんですが・・・。 >821 いやいきなりキレなくてもいーじゃん。
823 :
デフォルトの名無しさん :02/03/03 03:13
ポインタはOSを書くのに必要なのです。
とりあえず、ポインタを使ったソートの実例とか リンクリストとか、そういう簡単なやつを調べてみれ。
825 :
デフォルトの名無しさん :02/03/03 03:40
アドレスが指してるもん取り出せるんだぞ。 これほど便利なものはない。
>>825 アドレスが指してるもん書きかえられるんだぞ。
これほど危険なものはない。
827 :
デフォルトの名無しさん :02/03/03 03:53
アドレスのビット演算が出来るんだぞ これほど なものはない。
a[]="012"; として i=2; のしたときに i[a]は'2'になるのはなんだか不思議だ。
ある本を読んでいたらこんな関数がありました。 const char* makefname(char* uname, char* dstr) { char buf[1024]; strcpy(buf, uname); strcat(buf, "-"); strcat(buf, dstr); return buf; } sprintf 使えば関数にするまでもないような、、ていうのは置いておくとして、 ローカル変数のポインタを返しているんですが、これってありなんですか?も しかしてこの本逝ってよしですか?
830 :
デフォルトの名無しさん :02/03/03 05:23
class classA{ classB member; }; class classB{ classA member; }; こおゆう風にしたいんですけど・・・
class classB; 以下同じ
832 :
デフォルトの名無しさん :02/03/03 05:38
class classA{ struct classB member; }; class classB{ classA member; };
>>829 それは書名をさらすべきでしょう。他にもないのか見てみたい。
835 :
デフォルトの名無しさん :02/03/03 06:03
>>829 大昔なら、ローカル変数のポインタ返しても、スタック壊す前に呼び出し元が使うならおっげー
みたいな風潮あったから、その影響かも。
>>828 漏れも不思議だった
「要は a[i] => *(a + i) => *(i + a) => i[a] だから」って聞いて
for(int i=0; i<28; putchar(i++["思わすイっちまったね、漏れは"]));
思わす 思わす 思わす
思わす逝っちまった…
ijk+kji=1333のi、j、kを求める(c言語で) を教えて下さい。
>>841 総当りでいいなら超簡単。
工夫して効率化するなら
・i+k=13
・j=1
という条件をつければループは6回で済むし。
>>843 条件をつければ、ってのはヘンな表現だった。
ijk+kji=1333なら、
>>843 の式は常に満たされると言いたかったのです。
845 :
デフォルトの名無しさん :02/03/03 14:47
>>829 問題はローカル変数のアドレスを返している事じゃなくて、自動変数のアドレスを返していることだろ。
ローカル変数でも静的変数なら問題ない。
もしかして今時staticなんて使わないとか?
ローカルなstaticとグローバルなstaticの違いは コンパイラがチェックするだけで実態としては、 同じ領域に隣り合わせで確保されるわけですよね?
ココで聞くようなことではないかもしれませんが CGIとして実行されるPerlなどのプログラムはどうやって ADDR_HOSTなどの情報を取得しているんでしょうか。
わかってんなら他逝け
>>849 じゃあ少し質問の内容を変えます。
C言語でどのようにすれば環境変数を取得することができるのでしょうか?
getenv()
>>851 ありがとうございます。
その気ワードで検索したら解決しました。
>>847 実装依存だと思うがたいていはそうなるだろうな
>>852 ANSI非準拠だけど、main関数の第三引数は環境変数のリストへのポインタであることが多いよ。
特定のものを取り出すならgetenv()だけど。
855 :
デフォルトの名無しさん :02/03/03 23:31
>831で解決したのでは……と思っていたが、 よくよく見たらマトリョーシカ作ろうとしてやがる。 確かに無理だな。
857 :
デフォルトの名無しさん :02/03/04 00:19
日下部先生! 先生は
マトリョーシカというより、クラインの壷ってかんじ。
859 :
デフォルトの名無しさん :02/03/04 10:14
int ketasuu(int n){ return 「」; } n(10進)の桁数を返す関数です。「」を埋めてください。
int ketasuu(int n){ return (int) log10(n); }
数学関数使うんですか、、 forで10で割りながら、ぐるぐるまわす方法しか思いつかないんで、 もっとスマートな方法を教えてもらおうと思ったんですが。
if (n < 10) return 1; if (n < 100) return 2; if (n < 1000) return 3; if (n < 10000) return 4; if (n < 100000) return 5; if (n < 1000000) return 6; if (n < 10000000) return 7; if (n < 100000000) return 8;
n>=0の場合にしか使えないけど。 int ketasuu(int n) { return n < 10 ? 1 : ketasuu(n/10) + 1; }
864 :
デフォルトの名無しさん :02/03/04 10:43
リンクトリストと隣接リストってどう違いますか? 隣接リストのアルゴリズムってどなたかご存知ないでしょうか? またその辺のことが書いてあるホームページとか。
log10()呼ぶのが一番スマートで速いと思うけど。
そうっすか、、 他に数学関数1個も使ってないんですが、 こういう状況でlog10()呼んでも誰も怒らないですよね? unix上のXで動くアプリだから、数学関数ライブラリねーよってこともないだろうし。
int でしょ?文字数=桁数じゃないの?俺ヴァカ? 解説プリーズ
>>870 いや、ある意味その通りなんだが、その「文字数」をどうやって得るかって話。
>>872 そうか、int だから「文字数」なんてないですね。やっぱりヴァカだ。
おとなしく逝ってきます。
てことはこうか? int ketasuu (int n) { char buf[16]; return sprintf (buf, "%d", n); }
マイナスだったら -1かける必要がありますね。
>>860 ,
>>862 ,
>>863 ,
>>875 それぞれの算出結果。
n = 0, 860 : -2147483648, 862 : 1, 863 : 1, 875 : 1
n = 1, 860 : 0, 862 : 1, 863 : 1, 875 : 1
n = 9, 860 : 0, 862 : 1, 863 : 1, 875 : 1
n = 10, 860 : 1, 862 : 2, 863 : 2, 875 : 2
n = 100, 860 : 2, 862 : 3, 863 : 3, 875 : 3
n = -1, 860 : -2147483648, 862 : 1, 863 : 1, 875 : 2
n = -10, 860 : -2147483648, 862 : 1, 863 : 1, 875 : 3
整数だけで計算したくて速度が必要ならバイナリ検索かな if (n < 10000) { if (n < 100) if (n < 10) return 1; else return 2 else if (n < 1000) return 3; else return 4; }else 書くのメンドクセ
負号を桁数に入れなくていいなら、
if (n < 0) n = -n;
をketasuu()の先頭に入れるだけでいいと思われ
桁数に入れるなら、
>>875 以外は修正の必要があるけど。
>>880 あ、ちょっとわかりにくかった。スマソ
↓のプログラムを、引数をいろいろかえて実行してみたということです。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int ketasuu_860(int n) {
return (int)log10(n);
}
int ketasuu_862(int n) {
if (n < 10) return 1;
if (n < 100) return 2;
if (n < 1000) return 3;
if (n < 10000) return 4;
if (n < 100000) return 5;
if (n < 1000000) return 6;
if (n < 10000000) return 7;
if (n < 100000000) return 8;
return 0; // dummy
}
int ketasuu_863(int n) {
return n < 10 ? 1 : ketasuu_863(n / 10) + 1;
}
int ketasuu_875(int n) {
char buf[16];
return sprintf (buf, "%d", n);
}
int main(int argc, char *argv[]) {
int n;
if (argc < 2) return 1;
n = atoi(argv[1]);
printf("n = %d, 860 : %d, 862 : %d, 863 : %d, 875 : %d\n",
n, ketasuu_860(n), ketasuu_862(n), ketasuu_863(n), ketasuu_875(n
));
return 0;
}
882 :
デフォルトの名無しさん :02/03/04 13:55
int d[5]; int *p; p = d; とすると p[0]、p[1]はd[0],d[1]の値を示すことができるって 本に書いてるんですけど、 d[5][5] の各要素を操作したいときなんかは どういう風にポインタを使えばいいんでしょうか?
ポインタのポインタかな
int **pp; int (*ap)[5];
>>885 二重配列ならint (*ap)[5]だけじゃない?
DOSプログラムで指定ディレクトリの全ファイルを列挙するには どうすればいいのでしょうか? WIN32APIのFindFirstFileみたいな MSDN&web検索したけどワカラン
>>887 char *path=".\\";
system(path);
889 :
デフォルトの名無しさん :02/03/04 17:39
>>887 そんなんコンパイラのドキュメント見ないとわからんよ。
DOSのコンパイラだったら、FindFirstみたいな名前の関数だと
思うけどな。
おっと間違った。 char *path="dir .\\"; 他のディレクトリなら適当に変えて。
>>887 MSDN(ローカル版)でfindfirstで検索したら、_findfirst()ってのでてきたよ。
ちなみに、アクティブサブセット(カテゴリ)はVisualC++ドキュメントね。
>882 886が正しい。 配列int a[3][4]を操作するポインタはint (*ap)[4]; 配列int b[3][4][5]を操作するポインタはint (*bp)[4][5]; 一番左の数字以外は残さないとだめ。
わかりやすいジサクジエソだこと。
>>892 この場合
ap[0] = a[0]にすると(ap[0])[0]がa[0][0]になるんでしょうか?
どうなるんでしょう?
>>894 あんま意味無いけど、とりあえず例。
int i,j;
int a[5][5];
int **ap;
ap = (int **)malloc(sizeof(int *)*5);
for(i=0;i<5;i++) {
ap[i] = a[i];
}
for(i=0;i<5;i++) {
for(j=0;j<5;j++) {
ap[i][j] = i*10+j; /* apのほうに代入 */
}
}
for(i=0;i<5;i++) {
for(j=0;j<5;j++) {
printf("%d ",a[i][j]); /* aのほうを表示 */
}
puts("");
}
こういうのも勉強しよう! #include <stdio.h> #include <stdlib.h> #define X 5 #define Y 7 int main(int argc, char *argv[]) { int i,j; int **a; /* ALLOC */ a = malloc(sizeof(int **) * X); for (i=0; i<X; i++) { a[i] = malloc(sizeof(int *) * Y); } /* VALUE SET */ for (i=0; i<X; i++) { for (j=0; j<Y; j++) { a[i][j] = i * 10 + j; } } /* VALUE PRINT */ for (i=0; i<X; i++) { for (j=0; j<Y; j++) { printf("a[%d][%d] = %d\n", i, j, a[i][j]); } } /* FREE */ for (i=0; i<X; i++) { free(a[i]); } free(a); return 0; }
>>895 malloc() はいらん。
ap = a;
でいい。
898 :
デフォルトの名無しさん :02/03/05 01:10
ap = (int **)malloc(sizeof(int *)*5); ってどういう意味?
int型のポインタ5ヶ分の大きさのメモリブロックをヒープに確保し、 その先頭アドレスをint**にキャストしてる。
900 :
デフォルトの名無しさん :02/03/05 01:16
int*やint**って初めて見るんですけど、intとどう違うんでしょうか?
今だ900げとーざー
ポインタの指し示す型を表してるだけ
905 :
デフォルトの名無しさん :02/03/05 01:22
**はどこの何を指すんでしょうか?
本を読め。
907 :
デフォルトの名無しさん :02/03/05 01:47
**はダブルポインタなのです。 つまりポインタを指す、ポインタ。 精進せぇよ。
本読んだら int* 見たことないってことはないだろ。 ところで、 int* i; int *i; どっち派ですか?
int * i; はだめですか
>908 int* i; って書く奴はバカっぽい
int* i だな。 int *iは余り良い使い方ではないと思ふ。
意見が分かれますね。 int* i; 派の人は int *i, *j; みたいに複数並べたりはしないのかな。
統計的に type *value; は7割 type* value; は3割 程度と見た。
昔からあるC言語の参考書はみんなint *i;だよ。 だから昔の人ほどint *i;派になると思うけど。
逆に、 int* i;と書く人って、どこから取ってきたの? 最近の本はこういう書き方するの?
前どっかのスレで type *value; が古くて type* value; は新しい書き方だって見た覚えがある。
918 :
デフォルトの名無しさん :02/03/05 02:04
私は恩師が int* i と書く人だったので自然にそうなった。
919 :
名無しさん@おひさまのよう。 :02/03/05 02:05
type* a,b,c; ってやるとどうなるの?
920 :
デフォルトの名無しさん :02/03/05 02:05
で、「*」はどういう意味?
>>919 type* a;
type b;
type c;
とおなじ。
バカっぽいね(w
>は新しい書き方 なんじゃそら。きもすぎるぞ なんでいまさら変える必要がある?
いちおうマジレスすると、最近はC++とかの強い型指向のせいで、 int* a;と書いたほうが「int*」という型にはっきりと見えるので そう書くようになってる。
>>925 最近て、、、
int* a,b,c;
が駄目なんだから、そんなの意味無いとおもうけど
LISPみたいに単一シンボルとみなすならともかく
927 :
デフォルトの名無しさん :02/03/05 02:13
int *p; だろ、俺はこの書き方。
>>925 typedef int * int*;
とは書けないC/C++では混乱の元>925
929 :
デフォルトの名無しさん :02/03/05 02:23
int& a=x,b=y,c=z; はどうなるの?
>>897 え?マジ?
コンパイル通るソースキボン。
aだけリファレンス多分
933 :
デフォルトの名無しさん :02/03/05 02:26
私はint *p; プロトタイプやキャストではint * int* p;は違和感がある。
934 :
デフォルトの名無しさん :02/03/05 02:28
じゃあ、 int* i int& i 考えた奴って、真性のバカじゃん。 申し訳無いけど
そういえばプロトタイプ宣言をしている既存のプログラムってあまりみかけないね。
>>921 ,
>>929 みたいのは紛らわしいだろ
typedef int& int_r;
int_r a,b,c;
てすりゃ全部リファレンスだが
int& a,b,c;
これだと一瞬、同じかと思う。
937 :
デフォルトの名無しさん :02/03/05 02:37
>>936 >typedef int& int_r;
なんで
int& int_r;
みたいな書き方するのか理解できない。typedef使うのに。
&とint_rよりも、intと&の方が結合度高いと思ってるバカにしかみえん。
938 :
デフォルトの名無しさん :02/03/05 02:40
おもしろいな。この話題でしばらく引っ張れるか?(w
typedef 既存の型名 新しい名前; だから。その方が読みやすいだろ。 書き方は人それぞれ。
>>897 あ、意味判った。すまん。わざわざmalloc()しないで、
int *ap[5]; /* もしくは明示的に int *(ap[5]) */
ってしろってことね。確かに。
>>939 typedefは変数宣言とシンタクス的に変わらんのだが・・
昔は int * p; みたいに書いていたけど今は int *p; にもどした。 解釈規則からみて、やはりこのほうが良さそう。
>>930 (895)
すまそ。嘘でした。あなたが正しい。
C は int *p; C++ は int* p; が「自分の理想」。 でもいつもC風。
だーから今回は新しく付ける名前が1つだったからだっつーの。 やり方は趣味の問題だろ、しつこいなぁ。
>int* a,b,c; これができないから型名に*つけるのはやめろって意見があるみたいだけど、 その記法使わなきゃいいだけじゃん。 int* a; int* b; int* c; みたいにして。 このほうが型名らしくてカコイイ。
C++ でも int* pa, pb; で pb が怪しいすね。 理想よりケアレスミス撲滅のほうをとりました。
typedef int& inta,intb,intc; はどうなるの?
int* i; とするやつと一緒に仕事したくねーな
んーまぁ 趣味の問題すね。
954 :
デフォルトの名無しさん :02/03/05 03:04
>951 なんじゃそら?
939にはぜひC/C++の文法を調べてホシイ できれば一度Cの宣言部のパーサー作ってもらいタイ
>>951 intaはintへの参照
intb,intcはint
>>951 Cでは構造体のtypedefとかで良く使う
typedef struct {...} *ptype_t, type;
そういやint* i派はstructの場合はどうすんのやろ?
>>955 あなたが作れば?
どうせ暇なんでしょ。
struct {...}* h; やっぱ気持ち悪い
int* i; とするやつと一緒に仕事したくねーな
>>960 自分で作ると面白い事実に気付くかも・・
>>875 その手で行くならこう?
int ketasuu(int n)
{
char buf[16];
sprintf(buf, "%d", abs(n));
return strlen(buf);
}
C++な連中はそもそも列挙しないのかも? int* a = NULL; int* b = NULL; int* c = NULL; みたいな
新スレ立てるよ
つーか関数へのポインタを宣言するときはどうするんだよ! typedef無しでな。
>>967 void (* func)(void);
じゃない?
2ch に貼られてるコード見ると結構 int* i; タイプの人を見る気がするけど少数派なのかな。
>>969 それはきっと、int と * の間のスペースの幅が短くて見にくくなってて、
int* i; に見えているという罠。
971 :
デフォルトの名無しさん :02/03/05 13:36
>>964 なんでstrlenを使うの?
sprintfの戻り値だけで十分じゃない。
fputs("新スレは?\n",2ch_progtech);
975 :
デフォルトの名無しさん :02/03/05 13:54
こんなことを聞いて申し訳ないのですが、時間差を求める方法を 教えてください。例えば足し算を10問解いて、それにかかった 時間を教えてください。
976 :
デフォルトの名無しさん :02/03/05 13:56
>>975 time.hをインクルードして
解く前と解いた後にclock()を使う。
あとは引いて差を求めるだけ。
CLOCK_PER_SECで割れば秒に。
適当に書いたので間違っているかも。
>>975 足し算の開始前に時刻を表示します。
足し算の終了後に時刻を表示します。
おわり。
足し算の訓練と同じに時刻計算の訓練もできるので
ソフトウェアの評価はうなぎのぼり。
980 :
デフォルトの名無しさん :02/03/05 14:03
>>978 それスゲー
かなり画期的だ。
ビジネスモデル特許を申請しなきゃ。
981 :
デフォルトの名無しさん :02/03/05 14:05
system("time");
982 :
デフォルトの名無しさん :02/03/05 14:05
983 :
デフォルトの名無しさん :02/03/05 14:06
>>981 サービスとして毎回時刻調整できるようになっています。
便利です。
984 :
デフォルトの名無しさん :02/03/05 14:06
10 cls 20 print time$ 30 goto 20
ところで、
>>976 の方法で実行速度を測るのって好ましい方法?
986 :
デフォルトの名無しさん :02/03/05 14:07
987 :
デフォルトの名無しさん :02/03/05 14:09
printf("ストップウヲッチをようゐしてくださひ\n"); getchar(); printf("それでは、ようゐどん!\n");
988 :
デフォルトの名無しさん :02/03/05 14:10
ソフトウェアにサポート要因として ストップウォッチおじさんを一人ずつつけて配る。
989 :
デフォルトの名無しさん :02/03/05 14:10
puts("すとっぷ!!");
測りたい時間にもよるがストップウォッチ的なのがほしいなら、いいんでないかい? 厳密な実行速度は測れないよ。
991 :
デフォルトの名無しさん :02/03/05 14:12
いまだ990げとずざぁ
つまんねぇネタばっかだな
993 :
デフォルトの名無しさん :02/03/05 14:14
>>990 printf("%s\n",
"コテハン?"
"この板にコテハンなんていたんだね。あ、voidは除いて");
994 :
デフォルトの名無しさん :02/03/05 14:19
FILEって構造体?
いまだ995げとずさー ってはやく新スレいけよ
996 :
デフォルトの名無しさん :02/03/05 14:24
>>996 あ、やっぱり。
stdio.h見てもなんだかよく分からなくて。
998
おまえらもうすぐ1000だっていうのにマターリしてんなぁ
1000 :
デフォルトの名無しさん :02/03/05 14:27
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。