1 :
隊員NO.1919072 ◆rhAfp.iLoU :
02/10/27 23:38
2
3 :
隊員NO.1919072 ◆rhAfp.iLoU :02/10/27 23:39
4げとずさ
5 :
隊員NO.1919072 ◆rhAfp.iLoU :02/10/27 23:40
改訂第4版 ANSI C対応 はじめてのCはどうなの?と言ってみる罠。
7 :
デフォルトの名無しさん :02/10/27 23:43
即答できる質問をかけ
で、結局C99の話題はありなのか?
ついに、”オレ様”の名前がなくなっちゃったね。
なぜCのポインタ周りの仕様は複雑ですか?
11 :
デフォルトの名無しさん :02/10/27 23:46
12 :
デフォルトの名無しさん :02/10/27 23:46
プリプロセッサはCの機能の一部ですか?
13 :
隊員NO.1919072 ◆rhAfp.iLoU :02/10/27 23:47
ああ、みんなごめんね。 前スレのリンクが、前々スレになってるよ・・・ ぐへぁ!
>>8 有りだが、個人的にはC99に特化した書き込みなら
そのように前置きしてほしい。
質問ですけど、c = (char)c;って(以下略
16 :
デフォルトの名無しさん :02/10/27 23:47
C#とJava の違いを教えてください。
>>12 一部だが、前処理として実行されるため、Cの文法解釈を無視している。
c=(char)c;の目的って結局なんだったの? char文字列と比較するために単にint→charにしただけ?
>>8 あなたの好きにしていいのよ。
>>9 そうですね。
>>10 あなたには複雑に感じるのかも知れません。
>>12 はい、ただし C コンパイラの一部ではありません。
>>16 残念ながらスレ違いです。
21 :
デフォルトの名無しさん :02/10/27 23:56
windowsで環境変数の値を取得したいのですがどうすればいいのでしょうか?
>>21 「C」 では getenv() を使ってください。
環境依存の話では、Windows で動く多くの処理系が main() の第三引数 envp
をサポートしているのでそれを走査してください。
>>19 に答えてくれんか。
もしchar文字列と比較するために型をそろえただけなら
なぜあんな論争になったのかがわかんないんだよ・・・
26 :
デフォルトの名無しさん :02/10/28 00:12
#include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { printf("%d\n" , __argc); return 0; } どうしてこれで動くのでしょうか?
strchrの引数が絡んでるんじゃ無いの?
>>24 まんま、19 の通り。
なぜそんな事をしているかと言えば、規格で引数が int なのに 「char に変換された値」
と明記されているから。
アンダーバー二つは何かあったっけ?
>>25 c = (char)c;
の c が int 型ってのは分かってる?
>>25 それだけ。
論争の原因はたぶん、なくても動く処理系が多いから不要と考える人が多かったからかな。
環境はWindows2000です。
>>26 VC++ を使ってますね?
__argc は <stdlib.h> でコソーリ定義されています。
何に使っているのかはよくわかりません。
何にせよ、これは C の規格に無い事なので __argc を使っては逝けません。
>>25 charがsignedな処理系でも
strchrx("aアa", 0xb1);
がちゃんと'ア'にヒットするかどうか。
>>34 激しくコンパイラ依存の話ですまんが、
GUIアプリはエントリポイントがWinMain()だからだろうね。
BCCでも同じようなグローバル変数が用意されていたと思う。
>>25 規格で決まってるからという理由以外で説明するなら、
36が書いてるように、charの最上位ビットが1になるような
文字の場合に、それが負の数値で渡されても正の数値で渡されても
対応できるようにするため
というのが一番の目的だろうね。
(他に charで表現できない整数がcharに切り詰められるというのもあるね)
あるヘッダファイルに typedef unsigned int bit_16; が記述されていて、 Cのソース void main(bit_16 argc, byte *argv[]) { } と記述されている場合、このCソースファイルをどうすれば コンパイルできるのでしょうか。コンパイラにヘッダファイルの 置き場所を指定すれば良いのでしょうか。
char *c="chinko" 先頭アドレスしか入ってないはずなのに、 printfするとちゃんとchinkoと表示されるのはなぜですか? 普通に考えると、cとしか表示されないはずです。 もう一度聞きます。 なぜポインタ周りの仕様は複雑ですか?
char型の配列でしょう?chinkoは。 int型の配列であれば、先頭だけしか表示されなかったはずです。 しかしchar型はcだけでなくchinkoまでちゃんと表示されるのです。 もう一度聞きます。 なぜポインタ周りの仕様は複雑ですか?
単に、 >printfするとちゃんとchinkoと表示されるのはなぜですか? に答えればいいんじゃないすかね。皆さんがんばってください。
>>43 > しかしchar型はcだけでなくchinkoまでちゃんと表示されるのです。
cしか表示されません。なんででしょうか?
char *c="chinko";
printf("%c", *c);
s
>>39 ソースファイルと同じ場所に置いておけば、
#include "そのヘッダー.h"
で取り込める。
ソースファイルと同じ場所に置いておくことができない場合は、
#include "フルパスのそのヘッダー.h"
で取り込める。
>>39 多くのコンパイラにはオプショナルなヘッダファイルの場所を指定するための
コマンドラインオプションとして -I がある
発言しようと思ったけど叩かれそうなのでやめました。
>>49 叩かれて人は強くなる。どんどん発言しなさい。
>>40 関数にポインタを渡したとき、普通にポインタが渡されます。
関数に配列を渡したとき、その配列の最初の要素へのポインタが渡されます。
だから char c[]="chinko"; でも char *c="chinko"; でも、 printf("%s", c)
には結局 "chinko" の c へのポインタが渡されます。
一方 printf() では、"%s" が渡されると対応する引数をポインタとして受け取り、
'\0' を検出するまでそのアドレスからその次のアドレスへと、ひたすら次々に文字を
出力していくのです。
だから表示は c ではなく chinko になります。
ポインタ周りはあなたにとっては難しいのかも知れませんね。
printf() の動作もよく研究して下さい。
ポインタ周りはあなたにとっては難しいのかも知れませんね。
printf() の動作もよく研究して下さい。
>>43 「int型の配列であれば、先頭だけしか表示されなかったはずです」 とは、何を
表現したかったのでしょう。
int c[]="chinko"; ではエラーになりますし、int c[]={"chinko"}; でも c[0] に
"chinko" へのポインタが格納されます。
これは、おそらくあなたの意図した初期化ではないでしょう。
int c[]={'c','h','i','n','k','o','\0'}; なら c[] の要素要素ごとにそれぞれの
文字の値が入ります。
int の内部表現は少なくとも 16-bit が保証されていますから、c[0] == 0x0063 のよ
うになるでしょう。
しかし、この値がメモリ上に 00 63 と格納されるか 63 00 と格納されるかは処理系
依存です。
もし後者 (ビッグエンディアン) ならあなたの言う通り c だけが表示されますが、
もし前者 (リトルエンディアン) でかつ char が 8bit であれば、何も表示されない
可能性もあります。
ところで、char 型と言ってしまっているのは char 型の配列の事ですよね?
一方、char の配列やポインタは >>前 で述べた通り、'\0' が見つかるまで次々と
走査して行きますので、c だけで途切れることも無く chinko と表示されるのです。
なお、int 型の配列であれば絶対に chinko と表示されないような口ぶりですが、
int が 32bit、char が 8bit でリトルエンディアンの処理系の場合に、
int c[]={ 0x6E696863, 0x00006F6B }; printf("%s", c); は chinko を表示しますが
何か?
まあ、これは処理系依存の、ほんのお遊びですが、いずれにせよあなたの 「int型の配列
であれば、先頭だけしか表示されなかったはずです」 という仮定は成り立ちません。
ポインタ周りに加えて変数初期化周りも、あなたにとっては難しいのかも知れませんね。
>>45 あなたの試したコード printf("%c", *c); を見てみましょう。
まず *c は、c が指しているアドレスにある、char 型のデータを表します。つまりこの
場合、文字 c です。
一方 printf() では、"%c" が渡されると対応する引数を文字データとして受け取り、
その 1 文字だけを出力します。
だから表示は chinko ではなく c になります。
あなたも
>>40 と同じく、ポインタ周りと printf() の動作を研究するべきです。
すこし肩が凝ってしまいました・・・。
正直、すまんかった。
あはは。ネタにネタレスされちゃった。 でも > しかし、この値がメモリ上に 00 63 と格納されるか 63 00 と格納されるかは処理系 > 依存です。 > もし後者 (ビッグエンディアン) ならあなたの言う通り c だけが表示されますが、 > もし前者 (リトルエンディアン) でかつ char が 8bit であれば、何も表示されない > 可能性もあります。 ここまでネタ書かなくてもいいのにね。
自分で改めて見返すと、そう秀逸でもない。
どっかにポロありそうだ。
>>59 まあネタだから許して。
カッコワリィ
>>60 いや、あれだけの長文で「ツッコミどころがない」ような文章は
なかなか書けるものではない。正直、間違い探しに苦労しました。
63 :
デフォルトの名無しさん :02/10/28 03:13
ディスクファイルってなんですか? 高水準出力関数は、OSとの間にバッファを持ち、プログラムではこのバッファとの間で データの入出力を行うイメージになります。このバッファはOSが管理し、自動的に “ディスクファイル”とデータの入出力を行います。 という使われ方してんねんけど、ディスクファイルだけ意味わからん。 マルチになりますがお願いします。
63 マルチ放置
>>63 > マルチになりますがお願いします。
意味わかって言ってる?
>>62 ツッコミどころと言うと、52 の頭 2 行が余計だとか、51 へのリンクを貼る
つもりが >>前 のままだったとか・・・
>>65 ええ、過去スレにも書きましたし、スレ立てるまでも…にも書いたんでマルチになるかと。
でも過去スレに書いたんはここが新スレって気がつかんかったんです。
スレ立てるまでも…には答えがないのでこっちに来たと言うことです。せっかちなんで。
ヽ(´ー`)ノ
70は俺じゃねー。いちおー調べてみたけど単語としてディスクファイルってでてるだけで 意味は書いてなかった。ここならさくっと答えてくれるかなと思ったんやけど そんなに難解なことなんかな?
漏れらに難解なのはディスクファイルという用語ではなく、 73 が 69 の忠告を無視したり 72 の質問を無視したりする根拠だ。 第一、2 ちゃんねるをなんだと思ってる? つーか難解だと思わないなら自分で調べてみれ。
76 :
デフォルトの名無しさん :02/10/28 03:44
c = (a < c++) ? y * c : c++; このコードが未定義でないという理由がわからないので教えてください
>>74 2ちゃんねるはやりたいことを好き勝手やるとこに決まってんじゃん。
なにか疑問があったときに言葉巧みに答えを引き出したりするけどね。
>>77 > なにか疑問があったときに言葉巧みに答えを引き出したりするけどね。
なるほど。
> ここならさくっと答えてくれるかなと思ったんやけど
> そんなに難解なことなんかな?
これが「言葉巧み」に該当するわけね。
77 が哀れだ・・・ 2 ちゃんねるは単なる媒体で、書き込みを行っているのは日本中 (世界中?) の 人間だ。 その面前で堂々と 「2ちゃんねるはやりたいことを好き勝手やるとこに決まってん じゃん」 なんて言い放つとは・・・。
あーわかった、わかった。そんなに怒んなや、別に69の忠告は無視してないで、 今度から気をつけよーおもてるし、72の解答としては「調べてみたけど分からんかった」 ってことになるかとおもたんや。
ちょっとまて77は俺ちゃうぞ。
>>76 それ、(a < c++) は問題無いけど、それが偽だった場合に
c = c++; と等価になるからまずくないか?
「何」が抜けちゃったよ。 正しくは、匿名掲示板で何言ってるの? ね。
>>82 ある程度の好き勝手はいいけど、悪質が過ぎるならアクセス禁止食らうよ。
>>82 あと、匿名なら相手のことは全く考えないで (・∀・)イイ!! とでも?
87 :
73 ◆GRRPdDaVH. :02/10/28 04:01
>>74 とりあえず気を悪くしたんなら誤ります、すみませんでした。
アクセス禁止ってただ単に俺(と同じプロバイダの奴?)が2ちゃんねるに アクセスできなくなるくらいだろ。 別に2ちゃんねるにアクセスできないなら出来ないで問題ないし。 どうしてもアクセスしたかったらプロバイダ変えればいいだけだし。 その程度じゃなんの問題も無いね。
>>83 持ってる本に (a < c++) のあとに副作用完了点があるから
問題ないとだけ書いてあるんです。で、自分も偽だったとき
まずいのではと思ったんです。
一応試しに a = 100 c = 1 で if (a < c++) c = y * c else c = c++;
をやると未定義ですが3になり、三項演算子のは2になりました。
>>86 そんなに言いたいなら俺以外の相手のことは全く考えてない奴全員に言ったら。
2ちゃんねるはそんな奴ばかりだから苦労するだろうね。
>>80 指摘されなきゃ反省のそぶりも見せないなら、そりゃあ怒るわさ。
でもすまん漏れもいい気になってた、確かに検索だとなかなか出てこないな。
しかし、ディスクファイルって文字通りディスクに格納されたファイルの事
なんだが、想像つかなかったか?
他に、メモリファイルとかあるわけだが。
検索で単語は引っかかったみたいだけど、それがどう使われているかで何と
なく感じ取れなかったか?
考えてね。
後、マルチポストがいけない理由はちゃんと理解した?
それは、あなたが恥をかくからじゃないよ。
より多くの人に迷惑というか手間をかけるから、しかもどこか 1 ヶ所で
答えが見つかったら他の探してた人の苦労が水の泡になるからだよ。
「スレ立てるまでも…」 の方では、ちゃんと質問を個のスレに写した事を
明記してきた?
88 って超迷惑野郎じゃないか?
94 :
73 ◆GRRPdDaVH. :02/10/28 04:09
>>90 最低やな、匿名性が高いから言うてそんなこと言うとったら私生活で隠してても
いつかボロがでて痛い目みるやろ。
どうもこのスレに、63 をはるかに凌ぐ迷惑野郎がいるようだな。
>>91 いい人だな。俺だったらこんな奴には絶対答えたくない。
>>96 91 の冒頭の通り、漏れにも落ち度があったからな。詫び。
でなかったらやっぱり答えないよ。
98 :
73 ◆GRRPdDaVH. :02/10/28 04:14
>>91 レスくれてありがと。
なんとなくの予想はついてても、初心者やからちゃんとした知識身につけたいと
思ってて確証が欲しかった。
>>93 迷惑野郎ですよ。いや女かもしれないけどね。
2ちゃんねる以外でこんなことする奴は痛い目見るでしょうね。
私はしませんけど。
>>94 楽しみですね、その日が。まあ例えそうなってもあなたは私が痛い目を
見たことを知ることは無いでしょうが。匿名ってのは不便ですね。
あと、どうも話が通じそうだったからな。 でなきゃ何書いても無駄だし。
>>88 わざわざそんなレスしないといけない程2ちゃんねるが重要なのか。。。
あれっ。もしかして俺のおかげで答えが得られたのかな? 俺っていい奴じゃん。
99 には話が通じそうも無いな。
>>101 ん? 俺が面白いから書き込んでるだけだけど。
雑談やめて、俺の質問が流されちゃったよ。 あんなコード書かないだろうから、そんなに切実でもないけど。
>>99 というより、匿名掲示版で暴れないといけないって時点ですでにかなり
痛い状態になっているような。
>>99 いつかは分からなくても、お前がいつか痛い目見るだけでうれしいわ。
お前が自分の本性隠そうと必死に生きてる姿を想像するだけでもうれしいわ。
>>105 悪い見失ってた。
そうだな、未定義かどうかわからない不気味なコードは書く事は無い。
>>105 ごめんね。雑談ってのは一人じゃ出来ないんだ。
全部相手が悪いんだよ。俺は悪くないよ。
別に俺が悪者扱いされようがここだけの話だし知ったことじゃないが。
漏れは、2 ちゃんねるそのものはそんなに大事だと思わないが、ここに 集まってくる人はそれなりに応対しないとあかんと思う。 前にも出たけど、2 ちゃんねるは単なる媒体で、その向こう側は生の人間 なんだからな。 しかし、少しばかりその例外を作らないといけないようだ。
109 は匿名なので誰が謝っているか全くわからない罠
>>107 本性? 本性ってのは本来のすがたってだけで本性が悪いとは限らないんだよね。
ここでの姿が仮の姿で本性はいい奴だよ。すでに本性ばればれだけどね。
>>109 いえ、こっちこそすいませんでした。つい取り乱して。
112 は hiloshi
>>110 少しばかりの例外って何? 匿名性を低くするって事?
それには俺も賛成だ。2ちゃんねるはマナーが悪い奴が多すぎる。
俺の仮の姿みたいにな。もっと平和な所にしてほしいよ。
月曜日のこの時間に書き込んでるのは2~3数人だろうから、、 さて、誰と誰が同一人物でしょう?
お前らいい人だな。でも常識のないアホは放置というか、 せいぜい心の中で憐れむくらいでいいんだよ。 相手にするのは時間の無駄。
>>116 70と75と77と82と84と88と90と92と99と102と109と112と115が俺
>>115 2ちゃんねるはもともと平和な所じゃなくて喧嘩上等な所。
121 :
73 ◆GRRPdDaVH. :02/10/28 04:37
>>112 匿名性が高いとこで出てくるのが本性や、そんなんもわからんか?
それとも分裂症か?
>>115 いや、匿名性が多少下がってもそんなに意味無いのはメーリングリスト等で
実証済みだし。
完全実名制でもないと。
そうでなくて、人にはそれなりに誠意もって応対すべき、ただし一部の誰かさんは
きっぱり無視すべき、って事。
>>116 5 人はいただろ、1 人は去ったようだが。
ま、大差ないか。
ROM はもうちょっといるだろう。
>>115 2 ちゃんねるのどの規約にそんな事書いてあった?
たまに、ローカルルールで許可されている板はあるものの。
>>120 煽りと荒しは違う。
中には目的もなく煽ってるやつもいるが。
スマソ 120 宛て。
>>123 規約以前にいろいろな板を見ていればわかるだろ。
規約がすべてで現状認識ができていないのでは。
>>120 そうそう。だから喧嘩上等な場所通りの行動をしているまで。
でもいやだよ。本性は。
>>121 匿名性が高い所で出てくるのが本性ってことは
匿名性が低い所では本性じゃないのかな? あなたは。
匿名性が高いここで本性を出しているってことは、匿名性が低いリアルではどんな奴なんだか。
法律以前にいろいろな事件を見ていればわかるだろ。 法律がすべてで現状認識ができていないのでは。 ( ´,_ゝ`)プッ
>>130 これはあなたか?
99 :デフォルトの名無しさん :02/10/28 04:15
>>93 迷惑野郎ですよ。いや女かもしれないけどね。
2ちゃんねる以外でこんなことする奴は痛い目見るでしょうね。
私はしませんけど。
128 はモラルが無いんだねえ・・・ 131 の比喩を見ればよくわかるよ。
いいからお前ら一部のアホは放置しとけよ。 なんでわざわざ煽りに反応してやるんだ? ここはCの話題を扱うスレだぞ。
まぁ、あれだ。 匿名性が高い状態でチンポ出すやつもいれば、親の前でチンポ出すやつもいるってことだ。
モラルなど煮ても焼いても食えないものは捨ててしまえ
>>117 いや、そんなことは無いぞ。確実にいやな気分になるかムカついてるはずや、
根拠は
>>本性? 本性ってのは本来のすがたってだけで本性が悪いとは限らないんだよね。
>>ここでの姿が仮の姿で本性はいい奴だよ。すでに本性ばればれだけどね。
ここに書き込んでるのは仮の姿でほんまの自分じゃないって言っとる。
つまり、仮の姿の自分が虐められててほんまの自分は虐められてないってことにしとる。
何でそうせなあかんか?それはほんまの自分が傷つくからやろ。
そうやって仮の姿に現実逃避してても無駄やぞ、さっきも言うたけど今のお前がほんまのお前。
自分で気がついてないだけや
つーかね。ひろゆきだっけ? 2ちゃんねるの管理人。嵐とか偽の情報とか そんなのをちゃんと管理するなら俺も悪者ぶったりしないって。 疲れたので消えるよ。いや逃げるよ。いい暇つぶしになった。 今までお付き合いくださってありがとうございます。
だいだい何故スレ違いが延々と続いているんだ? CスレならCスレらしくしろ。
136 がいい事言った。 134 や 138 もそろそろ放置にしてくれ。
>>138 お前も頼むからもう書きこまないでくれ。冷静になってくれ。
マルチな質問を親切な住人に答えてもらったこのスレを
いつまで荒らす気だ?
>>139 スレ違いの話を延々と引っ張って己を正当化して逃げる貴方、ステキです
>>143 つっついてみたい気持ちはわかるが、140 とかの気持ちも考えてやれ。
>>142 それ言われたら弱いな。最後にあんたに謝辞させてくれ。
じゃ、誰かお口直しにCのネタきぼーん といきたいところだが、今日はもう眠いので寝るか
( ゚д゚) ポカーン
149 :
デフォルトの名無しさん :02/10/28 05:33
strchr(const char *str, int c)の実装について c=(char)c;が何故必要?->c&=0xffではダメ?->ビット切り取りだと問題が出る事がある。 (char = signed char,int = signed intな環境と仮定) int c = 0xFFFFFFB1を渡す時 cの上位ビットを切り取ると0x000000B1---------------------[A] 文字列中の文字*strのint昇格後取りうる値0xFFFFFF80-0x0000007F (charはint型に昇格されて比較される,その際「符号は保持」する。) マッチする筈の元のiの値0xFFFFFFB1がstrに入っていても[A]の為にはじかれる。 以上の理由でビット切り取りではダメ。 ->しかし上記の論は「c=(char)cが必要である事の理由」では無い。 ->ではchar,intをsigned,unsignedの各場合について分けて考えてみる。 変換前のint cと変換後(c=(char)c;を行った後)のc(混同を防ぐためc'とする) 比較 signed char,signed intな環境:∀c,-127<c<128でc'=cとなる unsigned char, unsigned intな環境:∀c,0=<c<256でc'=cとなる signed char,unsigned intな環境:0=<c<128はc'=c,128=<c<256ではc'が大きな値になる。 unsigned char, signed intな環境:∀c,0=<c<256でc'=cとなる signed char,unsigned intな環境でかつ、128=<c<256な場合,cとc'に違いがある訳だが この時c=(char)cがある場合と無い場合ではどのようになるか考えてみる。 無い場合: cは128=<c<256の値をとる。比較時でも当然128=<c<256の値, 一方*strはchar(signed char)であり整数への拡大が適用される。 この時-127=<*str<0なる*strは非常に大きな正の値に変換される為 c=*strであった筈の値でも合致しない事となる。 有る場合: 128=<c<256なるcはc=(char)cで非常に大きな正の値に変換される。 比較において意図した結果が得られる. (変換前のint c(128=<c<256)に対応する*str(-127<=*str<0)中の値) よってc=(char)c;はchar=signed char,int=unsigned intな環境で128=<c<256 なcの値の時必要。
> int=unsigned intな環境 はあ?ネタでつか?
char以外はみんなデフォルトでsignedと決まっているね。
>>149 全く的はずれ。
charがsignedかunsignedかは処理系依存だが、intはsignedであることが保証されてる。
さらに、intは最低でも16bitだがそれを全く考慮してない。
まあ、そんなことはどうでも良くて・・・なんだこりゃ!
前スレもう一回読んで見ろ。
それと壮大なネタか?
153 :
デフォルトの名無しさん :02/10/28 06:05
シフトで、signedなら算術シフトにunsignedなら論理シフトになると規格で決めてほしかった・・・ あれって処理系依存なんだよな~ Cで確実に算術シフト(または論理シフト)をする方法ってあります?
確かにイタいな。というか単なる符号拡張の話を よくもこんなにゴチャゴチャと書けるな。
>>153 確実に論理シフトしたいのなら、最初っからunsignedでやればいい。
だが、算術シフトは、移植性のある方法ってあるんだろうか。
>>155 unsignedなら論理シフトになるというのは規格では決まっていないはず・・・
>>156 unsignedなら必然的に論理シフトになると思うのだが・・・
算術シフトは加減乗除でなんとかしる!
>>149 > c&=0xffではダメ?->ビット切り取りだと問題が出る事がある。
比較の両辺とも処理すれば問題なし。
signedを論理シフトしたいなら、単にキャストすればいいだけでないの? int n = -1; n = (unsigned)n >> 1; なんかはずしてる?
>>161 合ってるけどそれは155の言ってることに含まれてるはず。
printf("signed char\n"); printf("int c(-1); %x\n", -1); printf("c(変換後); %x\n", (signed char)-1); printf("int c(0xff); %x\n", 0xff); printf("c(変換後); %x\n", (signed char)0xff); printf("*str(元の値): ff\n"); printf("*str(比較時): %x\n", (int)-1); printf("unsigned char\n"); printf("int c(-1); %x\n", -1); printf("c(変換後); %x\n", (unsigned char)-1); printf("int c(0xff); %x\n", 0xff); printf("c(変換後); %x\n", (unsigned char)0xff); printf("*str(元の値): %x\n", 0xff); printf("*str(比較時): %x\n", (int)0xff); 一旦charとして妥当な値に直してやってそれをまた比較の為符号拡張するのか。 なんとか分かった。
argc/argvの処理って普通はどんな風に書くものなのでしょうか。 書籍ではargcの数を数えることしかしてないし。 getopt()はなんか機能不足な気もしますし。 フリーソフトウェアのソースを読むほどの技量がないので どなたかごきょうじゅくだはい
記念ぱぴぽ
argc は引数の数をチェックする為に使う。 argv は引数を取得する為に使う。 テキストファイルをコピーするプログラム fcopy.c について考えると、 Usage: fcopy "input filepath" "output filepath" として、 /* fcopy.c */ #include <stdio.h> int main(int argc, char *argv[]) { FILE *fin, *fout; /* argc を利用した引数の数をチェックする */ if (argc != 3) { fprintf(stderr, "引数が足りません\n"); return 1; } /* argv で任意のファイル名を使ってファイルオープン */ fin = fopen(argv[1], "r"); fout = fopen(argv[2], "w"); /* ファイルコピー処理 */ fclose(fin); fclose(fout); return 0; } argc, argv は、こんな感じで使います。
>>164 自分で面倒見るのならこうやってやるかなあ。
プログラムの機能によって全然変わっちゃうけど、いつもはこうしてる。
つうかいつもはunix前提なんでgetopt使っちゃうけど(w
argvをいじっちゃうのであまりよくないスタイルではある。
int main(int argc, char **argv)
{
while (*++argv) {
if (*argv[0] == '-') { /* スイッチの処理 */
char *p;
for (p = *argv + 1; *p; p++) {
switch(*p) {
case 'a':
:
}
}
}
else { /* ファイルの処理 */
:
}
:
}
ただこれだと'-'で始まるファイル名は扱えない。
レスありがとう。参考になります。 なかなか穴の無い処理が書けなくて 悩んでたんですが、ある程度 端折っちゃって大丈夫ですよね。 考えすぎでしたスマソ
170 :
デフォルトの名無しさん :02/10/28 18:32
今本読んでたら、 「Cでは配列の後に[]をつけずに、配列名だけ単独で書くと 配列の先頭要素へのポインタとみなす」 っていうのは間違いだ( ゚Д゚)ゴルァ! って書いてたんだけど、ほんとうですか?
こういう事? char data[300]; char *p = data; // OK printf("%d\n", sizeof(p)); printf("%d\n", sizeof(data)); // NG
質問です。 typedef struct { double *base; … }matrix; matrix A; このAに double a[4][4]={ {0.0,0.0,1.0,0.0}, … }; と定数で宣言した配列の先頭アドレスを A.base = (double *)a; と突っ込んでいるんですが、ここでプログラムが落ちてしまいます (コンパイルエラーはないです) ポインタ宣言したAに直接、配列の定数を突っ込みたいのですが、 それが分からなかったので、こんな方法をやってます。 ( *(A.base+0+0) = 1.0; とか突っ込むのも考えたんですが) 元のプログラムがMS-DOSのTurboC++で書かれていて(ある本のプログラム) それをWin+BC++5.02J上でやりたいんです。 何が間違いでしょうか。
173 :
配列とポインタ :02/10/28 18:41
質問はageみたいですね・・・ ということでage
C++の質問は余所でおながいします。
>>172 別に落ちないよ。BCC5.5.1だけど。
177 :
デフォルトの名無しさん :02/10/28 18:54
みなさんは配列を扱うときにポインタ演算子を使ってますか? それとも添え字演算子を使ってますか?
>>174 Cの範囲だろ。
>>172 gccでやってみたけど特に問題は起きなかったよ。
typedef struct
{
double *base;
}matrix;
matrix A;
double a[4][4]={
{0.0,0.0,1.0,0.0},
{0.0,0.0,1.0,0.0},
{0.0,0.0,1.0,0.0},
{0.0,0.0,1.0,0.0},
};
int main(int argc, char * argv[])
{
A.base = (double *)a; /* ここ */
return 0;
}
本当に「ここ」の部分でエラー起きてる? どうやってそこだと特定したんだろう。
179 :
デフォルトの名無しさん :02/10/28 18:57
すまそ、質問です。 fgets(a,b,c)は a=入力する文字列 b=文字列の長さ c=入力場所 でいいんですか? あとsscanf(a,b,c)は それぞれどんな仮引数なんでつか?
>>176 本当っすか?!
なんで自分の環境では落ちるのかな・・・。
値は上手くわたっているみたいなんですが。
181 :
デフォルトの名無しさん :02/10/28 19:01
#include "windows.c" ってなんじゃらほい?
182 :
配列とポインタ :02/10/28 19:01
>>178 ありがとうございます。
えっと、return 0; の前にgetch()をおいて
DOSプロンプトが自動的に閉じるのを防いで、
その後に
//A.base = (double *)a;
とすると他の行列はきちんと表示して自分の思い通りになるので・・・。
184 :
デフォルトの名無しさん :02/10/28 19:04
MSDOSプロンプトで、プログラムを実行したときに 全画面をクリアしてから実行するようにするには どうしたらいいんですか?
>>182 なるほど。178で書いたコードでは特に問題になるところはないと思う。
他に色々やってるようなので、どこか別のところで変数を壊すなりしてないか?
配列で確保した以上のところに書いているとかその辺。
>>172 > A.base = (double *)a; /* ここ */
変なキャストを行っているから
> typedef struct
> {
> double *base;
double (*base)[4];
> }matrix;
> A.base = (double *)a; /* ここ */
A.base = a;
こうしてみろ
>>186 > なるほど。178で書いたコードでは特に問題になるところはないと思う。
おいおい、問題ありまくりの糞ソースが「たまたま」動いたから
問題ないというのは非常に疑問だぞ。
>>187 それは気づいていたけど、代入しただけで落ちるというから、別の理由が
あるんじゃないかと思っている。
189 :
配列とポインタ :02/10/28 19:25
>>186 =
>>178 >別のところで変数を壊すなりしてないか?
問題の処理の前後でメモリの配置・開放(行列式に適用したmallocのようなもの(?))
があるくらいで、
>>178 で書いていただいたコードとほとんど一緒です。
もっと詳しくプログラムを追ってみたほうが良さそうですね・・・。
ありがとうございました。
190 :
デフォルトの名無しさん :02/10/28 19:27
超初心者なんですが。 Cywinをダウンロードしてインストールもしたんですが このあとどうすればいいんですか? 英語のサイトばっかで訳がわかりません
>>188 > 代入しただけで落ちる
いいえ、現在の情報では、「代入をコメントにしたら落ちる」です。
どの箇所で落ちたのかは不明です。
おそらく、代入した部分ではなく、表示や計算の部分で落ちている
可能性が高いと思われます。
192 :
デフォルトの名無しさん :02/10/28 19:35
>>189 >>(行列式に適用したmallocのようなもの(?))
それだ!そこで確保した領域を破壊しているか。
freeすべき場所が書き換えられている。
A.base = &a[0][0]
でいいだろ。
>いいえ、現在の情報では、「代入をコメントにしたら落ちる」です。 ・・・・・・・ もしかして初期化してないポインタを使っているとか、そういうオチは ないよな?
194 :
配列とポインタ :02/10/28 19:38
>>187 ありがとうございます。
キャストをしたのはコンパイラに怒られて、
この方法しか思いつかなかったので・・・。
ご指摘の通りにやってみましたが、やはりエラーログを吐いてしまいます。
(win2kの調子がおかしいんでしょうか・・・)
あと
>double (*base)[4];
なんですが、この場合のみならOKなんですが、
他の行列1*4や3*3の行列でも使用しますので、これだと少し都合が・・・。
(#defineなどで指定するのも都合が悪いです・・・)
196 :
配列とポインタ :02/10/28 19:40
>>191 わかりづらくてすいません。
「代入したら落ちる(エラーログを吐く)」です。
コメントすると普通に動きます。
すいません、ちょっと席をはずします。(22時過ぎまで) 明日、別の環境で試してみます。 皆さん、ありがとうございました。
>>189 > 問題の処理の前後でメモリの配置・開放(行列式に適用したmallocのようなもの(?))
俺の経験と勘によるとそこが非常に怪しいのだが...そこは大丈夫なのか?
199 :
デフォルトの名無しさん :02/10/28 19:48
>>194 サンクス!
インストール成功しました!
環境変数変えたりとかはいいんでつか?
200 :
デフォルトの名無しさん :02/10/28 19:53
200げっと
202 :
デフォルトの名無しさん :02/10/28 20:08
Ikanji1st()に、ついて質問したいことがあります。 ソースを、二つに分けて出力したいと思います。 int Iskanji1st(int c) { unsigned char uch=c; if(uch>=0x81&&uch<=0x9f||uch>=0xe0&&0xfc) return 1; else return 0; }
main() { int n; while((n=getchar())!=EOF){ if(Iskanji1st(n)){ if(isalnum(n=getchar())) putchar('?'); else putchar('*'); continue; } else if(isalnum(n)) putchar(n); else ; } return 0; }
int getchar(void)関数は、unsinged char→intに変換します。 その際、位置インジゲータとエラーインジゲータを返すとある。 この手のソースの中によくからんでくるのが。 getchar();だけで、読み飛ばしとか何かgetchar関数の細かい 操作がしてある。(while((n=getchar())!=EOF){}の中で) こういったEOFを使ったループの使い方がいまいち把握できない。 ループ内で、getchar();とn=getchar();の違いなんですか!?
207 :
デフォルトの名無しさん :02/10/28 20:23
c++の質問をお願いします 0~99の数字を1秒間隔で表示。1~9で改行、表示する こんな感じです 1 2 3 4 5 6 7 8 9 10 11 12~~~~~~~~~~~~ ~~~~~~~省略~~~~~~~~ ~~~~~~~~~~~~~~~~99 これのプログラムを教えてください よろしくお願いします
>>207 すれ違いだし環境書いてないし日本語がちょっと変。
210 :
デフォルトの名無しさん :02/10/28 20:32
すまん
>>202 結論から言うと「状況による」です。
Linuxの場合、逆に速くなる場合もあるそうです。
# fjの「WORDは遅い、int の6倍遅い?」で
# 彼の勇姿をなま暖かく見守っていた一人
>>208 Cの標準関数だけでもできないわけじゃないけどな・・・
ビジーループ使うから効率悪いけど。
tabeみたいなキチガイにネットを使わせちゃまずいでしょ。 彼の保護者はなにやってるの?
214 :
デフォルトの名無しさん :02/10/28 20:56
scanfの返却値って改行を含めない入力文字個数なんでつか?
>>51-53 非常に丁寧かつ長文のレスありがとうございました。
特にprintfに関する説明には感謝しております。
確かに私にとってポインタ周りの仕様は複雑に
思えます。
また勉強し直し、髭をそり直しそして出直して参ります。
ギャフン
216 :
デフォルトの名無しさん :02/10/28 21:07
Cで点は描けますか? Win32API使うとしたら出来ますか?
>>216 >Win32API使うとしたら出来ますか?
できます。
もうFAQだね
>>214 リファレンスとかヘルプとか参考書とか読め。
scanf() の戻り値は、正常に値を入力できた変数の数。
何文字入力したかは関係無い。
さっきの続きで、皆さんの知恵をお貸しください。
>>198 さんの仰るようにメモリ周りが怪しいので
その部分をいろいろいじってみたんですが、エラーログを吐きます。
関係する部分を以下に・・・
typedef struct
{
/* double base;*/
double *base;
unsigned row;
unsigned col;
unsigned temp;
}matrix;
/* main */
...
matalloc(&A,4,4); /* メモリ取得 */
...
A.base = &a[0][0]; /* 代入 */
...
mfree(&A);
/* 怪しい関数 */ void matalloc(a,row,col) matrix *a; unsigned row,col; { /* char *malloc();*/ char *p; unsigned i; p=malloc(row*col*sizeof(double)); /* (char *) でキャストすべきっすか?*/ if(p==0){ printf("\n メモリ不足"); exit(0); } a->base=(double *)p; a->row=row; a->col=col; a->temp=0; for(i=0;i<row*col;i++) *(a->base+i)=0.0; } 以上、よろしくお願いします。
>>225 mfree()関数内で
free( a->base );
とかしてない?
mfreeもぁゃιぃ。 >A.base = &a[0][0]; ここでメモリリークしている
なんでdoubleをいちいちメモリ確保するわけ? (つかなんでポインタなの?)
禿しく何も見ずにレスしてた。
レスありがとうございます。
>>226 void mfree(a)
matrix *a;
{
if(a->temp) abort();
free((char *)a->base); /* たしかにしてますね・・・ */
}
>>227 >A.base = &a[0][0];
あれ?上の方でこうしる・・といわれたような。
A.base = &a;
で良いですか?
>>228 えっとですね、参考にしている本が行列計算をポインタ中心で
やっているので、その行列計算(関数?)に合わせたいんです。
合わせると言っても引数のタイプを合わせるだけなんですが・・・。
main関数以外は本のプログラムのままなので、なんとも言えないのが実情です。。。
>>320 その参考書が怪しくねーか?
駄本も多いから気をつけろ。
処理を並べてみろ matirx A; A->p=malloc(row*col*sizeof(double)); A->p = &a[0][0]; free(A->p); 明らかにおかしいだろが
freeしてる時点でbaseのアドレスは(以下略
おかしいのは漏れだ。吊ってくる、、 ∧||∧ ( ⌒ ヽ ∪ 。ノ ∪∪
s/A->p/A->base/g ってことね
236 :
デフォルトの名無しさん :02/10/29 00:10
>>224 matalloc(&A,4,4); /* メモリ取得 */
...
A.base = &a[0][0]; /* 代入 */
...
mfree(&A);
って領域確保とポインタ(アドレス)と実体とゴッチャになってるから
/*代入*/で間違っている。アドレスを代入するのではなくポインタが指し示す
メモリ上に値を埋めていく作業が必要。
237 :
デフォルトの名無しさん :02/10/29 00:28
または、mallocもfreeも必要無い。 今度はグローバル変数である事で何か問題が 起こる可能性もあるが。
238 :
配列とポインタ :02/10/29 00:29
皆さん、どうもありがとうございます。
>>236 さんの
>メモリ上に値を埋めていく作業が必要。
というのが決め手で、分かりました。
自分では領域確保してアドレスを渡せば間接参照(?)されるかと思ってました。
for(i=0;i<M;i++){
for(j=0;j<N;j++){
*(A.base+i*N+j) = a[i][j];
}
}
こんな感じで作ったらうまく渡すことができました。
ありがとうございました。
239 :
配列とポインタ :02/10/29 00:37
すいません、まだ済んでませんでした。 mfreeのコメントをはずすのを忘れてました。 (mfreeが怪しいといわれたのでコメントをしてました。) で、(一度コメントしてmakeした後に)mfreeのコメントをはずしたら エラーログを吐き出されました・・。 mfree(free)せずに処理系に任せるのは・・・まずいっすよね・・・。 この場合、どのように対処したら良いのでしょうか。
>>239 a->temp
が 0 のままじゃない?
>>239 対症療法でやるなって。
ちゃんとポインタとかを理解して、コード組めよ。
ポインターアドレスを取得して、メモリーを確保して、 アドレスのコピーを取って、使って、 使って居ないもとのアドレスを指している方をフリー
>>239 > A.base = &a[0][0];
この代入がまだ残ってるとか。
ちゃんと削除した?
244 :
配列とポインタ :02/10/29 01:17
>>240 a->tempは0のままで良いようです。
"保存用"なら0、"作業用"なら1のフラグを立てるところのようで、
今、Aには保存用のデータを収納したいので。
(abort()は飛ばされていることを確認しました)
>>241 ポインタ(配列)を100%理解はしていませんが、今は対症療法(打って覚える)を
実践しようと思ってやってるので・・・。
(理解が足りていないのは百も承知でやってます)
>>243 言われて削除したんですが、変わらずでした。
で、現在、
>>242 さんのご意見を頭の中で整理しています。
やはり、理解が足りないようです。出直してきます。
皆さん、ありがとうございました。
>>244 まず、いわゆる二次元以上の配列は初心者にはかなり理解が厳しいと思う。
やるのなら、matrixを操作する関数群を作るといいと思う。
matrixを確保、開放する関数、row、colを指定して値を設定する関数、
同様に取り出す関数、比較する関数、複製する関数など。
確保する関数はrowとcolを指定して、matrixのポインタを返すようにして、
残りの関数はmatrixのポインタと必要なパラメータを受け取るようにすれば
いいんじゃないかな。
>>245 ご意見、ありがとうございます。
そうですね。matrixに関しての関数をもう一度、自分で作成するか
手元にある怪しい関数を一から見直す必要があるようです。
( >row、colを指定して値を設定する関数 は今作ってみました。 )
勉強と思って一から作成してみます。
では、これにて。。。
247 :
デフォルトの名無しさん :02/10/29 08:46
お前ら!! どうよ?
248 :
デフォルトの名無しさん :02/10/29 09:06
Visual C++6でC言語のコンパイルってどうやればできる?
249 :
デフォルトの名無しさん :02/10/29 09:26
QUAJPG.exeってプログラム知ってますか? ↑非可逆圧縮のプログラムね 知ってたらソースファイル教えてください スレ違いだったらすまん。
251 :
デフォルトの名無しさん :02/10/29 09:34
252 :
デフォルトの名無しさん :02/10/29 09:35
>>250 スレちがい。
作者のサイトで公開されてなかったらあきらめろよ。
253 :
デフォルトの名無しさん :02/10/29 09:39
8 桁の整数を入力として受け付けて、それぞれの桁を配列の要素として格納する。繰り 返しを使って実現せよ。ただし配列名をdata とすると、1 の位がdata[0]に、10 の位 がdata[1]に格納されるものとする。最後に配列の全要素を出力せよ。 例: 38459341 が入力された場合 配列には{1,4,3,9,5,4,8,3}が格納される
>>253 それが人に教えを請う態度かよ。
つか、宿題は自分でやれや。
char data[9]; sprintf(data, "%d", N); for(i = 0; i < 4; ++ i) { c = data[i]; data[i] = data[7-i]; data[7-i] = c; }
>>253 perl -e '@data=split(//,<STDIN>);foreach(@data){print;}'
>>254 「問題の掲載ご苦労様でした。」 とでも言っとけ。
char *p; p="abc"; p="abcd"; p="abcde"; 上でstrlenとやるとそれぞれ3,4,5になるのに、sizeofだと最初の4のままなのはどうして?
>>258 ポインタの大きさと、文字列の大きさの違いについて調べてきなさい。
理解するまで、このスレにカキコ禁止。
>>258 1 のリンクにある C FAQ を通読してくれ。
>>259 ポインタの大きさは32ビットコンパイラの場合4バイトってこと?
ポインタにsizeofすれば文字列+\0の大きさが返ってくるものとばっかりおもってました。
>>261 だから、まず 1 のリンクにある C FAQ を通読してくれ。
ちなみに、ポインタの大きさはコンパイラが何ビットかとは直接関係無い。
たまたま一致する事もあるが、規格では規定されていないので思い込んではいけない。
それらしい動きになったので、一応報告です。
>>242 さんに言われたことを整理して
matalloc内の
p=malloc(row*col*sizeof(double))
このpをreturnで戻してmain関数内で(char *)型のchaaで受け取って
free(chaa)としたらエラー無しで終了できました。
>>242 "使って居ないもとのアドレスを指している方をフリー"
が重要だったようです。
皆さん、ありがとうございました。
(もっと勉強が必要だと感じました。。)
265 :
デフォルトの名無しさん :02/10/29 13:49
すいません、質問です。 int型だけで、1兆+1兆=? みたいな計算をどうやるかっていう問題で、 多倍長演算使うってとこまではわかったんですが、 多倍長演算ってのが何かわかりません。 誰か教えてください。
>>265 そこまで分かったのなら、とりあえず検索して見れ。
267 :
デフォルトの名無しさん :02/10/29 14:05
>>265 配列を使う。 int i[];専用の加減乗除関数を作成。ex.add(int i[], int j[], int val[])
268 :
デフォルトの名無しさん :02/10/29 14:05
269 :
デフォルトの名無しさん :02/10/29 15:48
stdinから受け取った内容をstdoutに出して、他のプログラムにバイパスする処理を作りたいのですが 巧くいきません、教えてください、おながいします # out | in のイメージで /* out.c */ #include <stdio.h> int main(void) { char buff[128]; memset(buff, '\0', sizeof(buff)); while (fgets(buff, sizeof(buff), stdin) != NULL) { fputs(buff, stdout); memset(buff, '\0', sizeof(buff)); } return system("./in"); } /* in.c */ #include <stdio.h> int main(void) { char buff[128]; FILE *fp=NULL; fp = fopen("./hoge.txt", "wb"); memset(buff, '\0', sizeof(buff)); while (fgets(buff, sizeof(buff), stdin) != NULL) { fputs(buff, fp); memset(buff, '\0', sizeof(buff)); } return 0; }
なんでpipeつかわへんの? なんでreturn system("./in")なん?
>270 pipe ってのがあるんですか・・・(´・ω・`) そのものズバリな予感。 調べてみます
272 :
デフォルトの名無しさん :02/10/29 16:08
代理クラスって何か教えてください。 ネットで探しても見つからないんで
274 :
デフォルトの名無しさん :02/10/29 16:17
C:\デスクトップ\20021025\20021025.c(21) : warning C4005: 'MAX_THETA' : マクロが再定義されました。 という警告がたまにでるのですが、いいのでしょうか?
popen() で、バイパス自体は巧くいきました。 ただ、この場合呼び出し先のリターンコードって取得できるんでしょうか?
man pclose
ここで宿題やってもらうのっていいんですか?
>>277 土建屋のゼネコンのような丸投げ君は禁止しています。
# 昔の1には書いてあったのだが...今は無いな。
自分でやってみてわからないところを質問するのは構いません。
わかりました。今度お願いします。
281 :
デフォルトの名無しさん :02/10/29 17:00
#include <stdio.h> struct hoge { char a[4]; long b; short c; }; int main(void) { printf("%d\n", sizeof(struct hoge)); return 0; } ↑のようなコードで、12 と結果が出ます。 sizeof(long)は4で、sizeof(short)は2です。 何故、構造体hogeのサイズが10にならんのですか?
283 :
デフォルトの名無しさん :02/10/29 17:08
>>282 ,283
納得しました。
sizeofは詰めものまで数えるのね。
そりゃそーだ。
>276 pclose のリターン値ですが、 これって、fcloseに準拠するんでしょうか? 呼び出し先のアプリが複数ステータスを返す場合は pipeで、やり取りするしかないんでしょうか?
だからmanしろと言ってるだろ。 > The pclose() function waits for the associated process to terminate and > returns the exit status of the command as returned by wait4().
289 :
デフォルトの名無しさん :02/10/29 17:40
どうも。3*3の○×ゲームの対CPUのプログラムを作りたいんですが 何から初めていいものか分かりません。 そもそも、こういう処理をコンピュータにやらせる事をなんていうんですか? 思考ルーチンとか?
>>288 bugsに
> Failure to execute the shell is indistinguishable from the
> shell's failure to execute command, or an immediate exit of the
> command. The only hint is an exit status of 127.
こんなことが書いてあるけど、pcloseでは成功の判断はできるけど
どのプロセスで何のエラーが発生したのかは判断できないんじゃない?
>288 見落としてました・・・。・゚・(ノД`)・゚・。
>>289 以前おれ三目並べ作ったよ。一ヶ月もかかったがあれは楽しかった。
まずは紙に三目並べの局面の樹形図を描きまくることからはじめた。
>>292 三目並べ程度だったら今のマシンパワーだと、
枝刈りしなくても全然おっけーだから力技で解けちゃいそう。
つかMS-DOSの頃も枝刈りの必要なかったか。
とはいえ、練習だと思って枝刈り入れるといいかもね。
正規化するルール作って、回転対称とか軸対称とかで刈っちゃう。
んで、それぞれの局面を正規化して探索する、と。
294 :
デフォルトの名無しさん :02/10/29 17:55
うぅ 樹形図しか理解できないんで、勉強してきます・・・
枝刈りしないで全局面数えても9!だから、45通りしかないんじゃないか。 力技つってもたいしたことないな(w ただ、それをどう評価するかを考えるのが楽しそうだ。
あ、ごめん45って1~9の和じゃないか。 9!は362880か。 ただこれでも力技いけそう。
3目ならべなら、テーブル作って終わり。
4マスで3並びの個数が多い奴が勝ちとかしたらちょっとは面白くなるかもね。
299 :
すみません :02/10/29 20:26
#include<stdio.h> #include<stdib.h> #define juand() ((double)rand()/(32767.0+1.0)) void main() { double z; int i; srand(2); printf("自分の名前の入力\n"); for(i=1;i<10;i++){ z=jurand(); printf("%4d番目の乱数は%10.7lf\n",i,z); これを利用して、乱数10個の平均をディスプレイに 出力するプログラムを作りたいんですが、 どのようにすればよいのか全く分かりません。 どなたか教えてください。
三つ前の自分の手が消えるとしたら、 三目並べも少しは面白くなるかもね。
301 :
デフォルトの名無しさん :02/10/29 21:09
>>299 srandの引数を定数にすると結果がいつも同じ。
303 :
デフォルトの名無しさん :02/10/29 21:32
近藤君はまだ健在ですか?
#include <stdio.h> #define SL(i) (m[i][0]==m[i][1]&&m[i][1]==m[i][2]&&m[i][0]!=' ') #define SC(i) (m[0][i]==m[1][i]&&m[1][i]==m[2][i]&&m[0][i]!=' ') #define D1 (m[0][0]==m[1][1]&&m[1][1]==m[2][2]&&m[0][0]!=' ') #define D2 (m[0][2]==m[1][1]&&m[1][1]==m[2][0]&&m[0][2]!=' ') #define DU(i) (SL(i)||SC(i)||D1||D2) #define PL() printf("-----\n"); #define PM(i) printf("%c|%c|%c\n", m[i][0], m[i][1], m[i][2]); #define I(i) for(i=0;i<3;i++) int main(void) { char m[3][3]={},s[3],me[3]={},com[3]={}; int i,j,k,x,y; I(i)I(j)m[i][j]=' '; for (;;) { fputs("手は?(x):", stdout);fgets(s,3,stdin); x=atoi(s); fputs("手は?(y):", stdout);fgets(s,3,stdin); y=atoi(s); if (x<0||x>2||y<0||y>2||m[x][y]!=' ') {printf("そこには置けない\n");continue;} memmove(me+1,me,2); me[0]=(x*4+y+1); /* player */ I(i){I(j){if(m[i][j]=='o')m[i][j]=' ';}} I(i)if(me[i])m[(me[i]-1)/4][(me[i]-1)&3]='o'; PM(0);PL();PM(1);PL();PM(2); printf("\n"); I(i) if(DU(i)){ puts("o won");exit(1);} I(i) I(j){if(m[i][j]==' '){x=i;y=j;goto ll;}} ll: memmove(com+1,com,2); com[0]=(x*4+y+1); /* com */ I(i){ I(j){ if(m[i][j]=='x')m[i][j]=' '; }} I(i)if(com[i])m[(com[i]-1)/4][(com[i]-1)&3]='x'; PM(0);PL();PM(1);PL();PM(2); printf("\n"); I(i) if(DU(i)){ puts("x won");exit(1);} } }
3目並べあたりだと7行プログラミングスレの連中なら簡単に作りそうだな 7行でオセロにはビビったよ
307 :
デフォルトの名無しさん :02/10/30 00:54
>>305 すごい・・・
マクロ展開したんだけど、質問。
char型の配列の宣言の要素はなんでないの?
あと、#include <stdlib.h>
#include <string.h>が必要で、
セミコロンが1個余計なとこはけーん
>>307 char s[3]ならfgets専用の配列で嫌でも変わるから入れなかったよ。1文字,改行,0ってなるし。string.hはmemmove,stlib.hはatoiか,-Wallしてなかったんで見過ごしてた。○×ならできそうだけどオセロはすごいな。
オレも今見てきた。オセロすごすぎ。 オレは未だに単なる3*3の○×ゲームで 思考ルーチンに試行錯誤なのに・・・ しかもif文ばっかだし。 ソース全部展開して、見やすくして 徹底的に盗んでやる!
6年ぶりにプログラミングを再開しようと考えているのですが、VC++とC#、どちらにしたら 良いでしょうか。6年前は、富士通FM-R50/S(OS MS-DOS Ver 3.3)というマシンで、 F-BASIC、Quick C、MASMを使っていました(アセンブラはほんのお遊び程度)。 ネット、Windowsはおろか、ハードディスクさえ無い環境でしたので、いざ再開せん、と 意気込んだは良いのですが、当時のPC環境とのあまりの違いに、何をどうしたらよいのやら全く 分かりません。
>>312 Borland C++ Builderにしとけ。
Borland C++ Compiler
316 :
デフォルトの名無しさん :02/10/30 04:03
((void (*pu)())1) この場合puは値を返さない関数へのポインタってことなんでしょうか? それはそうと"1"ってなんですか? FreeBSDのソースでみかけたんですが わからなくて困ってます
317 :
デフォルトの名無しさん :02/10/30 04:16
>>316 1を値を返さない関数へのポインタにキャストしているのかな?
なんでpuと書いてあるのかわからないけど。
C99では void foo(void){} void bar(void){ return foo();} は合法とされているんでしょうか? 教えてください。
>>316 よくわからん。
VC6 と gcc-2.95 ではコンパイルエラーになる。
>>320 あ、一般的なコーディングでこういうのって出て来るものですか?
C++で合法なのは知っていますが、Cではどうなのかなと。
プリプロセッサもどきを作成していて、こういうことが
したくなったのですが移植性が気になって。
320タン...... (-_-)
>>321 320 は、つまりどうしてそういう疑問を持つ事になったのか訊きたかっただけだけど。
書き方は悪かった、すまん。
移植性が気になるようなプリプロセッサを作るなら、規格書ぐらい自分で
読めなきゃダメだろう。
ISO-C-FDIS.1999-04.pdf
6.8.6.4 The return staatement
| 1 A return statements with an expression shall not appear in a function
| whose return type is VOID. A return-type statement without an expression
| shall only appear in a function whose return type is VOID.
void 型の関数で、エクスプレッションのある return は使っちゃダメだとさ。
逆に、エクスプレッションの無い return は void 型の関数のみで使えと。
「with an expression」 って、「戻り値のある」 って訳していいのかな?
漏れも英語苦手なんだから、英文読ませないでくれ。
PDF 検索しる。
あと、C++ で合法って何故?? 何が根拠?
すまん、typo してる。 で、探したら PDF でなくて TXT のバージョンがあるからそっち使ってくれ。 # Acrobat Reader って何でコピペできないんだよぅ・・・
>>324 > 「with an expression」 って、「戻り値のある」 って訳していいのかな?
訳すなら「引数を持った return 文」かなあ。
要するに return; はいいけど return expr; は駄目ってことなんだけど。
>>316 多分やりたい事は 317 だろう。
しかし、どう見ても文法エラーなんだが。
昔のコンパイラならキャストに名前が混じっててもコンパイル通ったのかな?
>>324 おおう。 調べていただいてどうもありがとうございます。C99の規格
持ってなくて・・。
C++の方ですが、ISO/IEC 14882-1998 の p.98, section 6.6.3
| A return statement with an expression of type ``cv void'' can be used only in functions
| with a return type of cv void; the expression is evaluated just before the function returns
| to its caller.
によります。templateにvoid戻りの関数オブジェクトを渡すとき、このような規格
でないと問題になるケースがいくらかあります。
ありがとうございました。
>>328 同じく英文は苦手なので引用すべき部分が間違ってたら平にご容赦。
>>325 普通に作ったPDFはコピペできるはず
できない文書はビットマップにしてあるんかな
>>328 cv void 型の表現を伴う return 文は cv void 型を返す
関数でのみ使うことができる。表現は呼び出し元に戻る直前に
評価される。
よく読め。
>>331 318が許される理由にはなっていない?
333 :
デフォルトの名無しさん :02/10/30 07:18
唐揚げ
cv void,where cv is [const|volatile].evaluation is applied to "cv void",whice is not "void" but [const|volatile]
>>334 C++の話題はメインじゃないんだから粘着せんでも。
講義でこんな問題出ました 4個の整数集合{a,b,c,d}と{e,f,g,h}が与えられたとき 2集合の全要素の組み合わせでかつ同一でない演算をする(+,-,×,÷,論理和,論理積) ※集合の要素値の与え方は自由 組み合わせとはa+eのような2要素からなるものとする 記号16通り×6で96通りの計算をすればいいとおもうのですがC言語まったくわからないので さっぱりです。 #include <stdio.h> までしかわかりません
338 :
デフォルトの名無しさん :02/10/30 14:07
本を読んでいたら int hoge; char buf[256]; fgets(buf,sizeof(buf),stdin); sscanf(buf,"%d",&hoge); っていうのが出てきたんだけど sscanfって言い換えれば 文字列bufからscanf("%d",&hoge)しろって事? あとなんでこんな事してるの?
>>336 この前も同じようなの見た。
同じ学校なのだろうか…
>>338 > sscanfって言い換えれば
> 文字列bufからscanf("%d",&hoge)しろって事?
まぁ、大体そんなかんじです。
> あとなんでこんな事してるの?
その本が比較的まともな本だからです。
良く読めば何でそんなことをしているのかも書いてあるはずです。
答え書こうとしたけど 340 みて踏み止まり。
>>338 参考までに、この場合に限っては
fgets(buf,sizeof(buf),stdin);
hoge = atoi(buf);
の方が一般的だし、わかりやすい。
関数のそれぞれのくわしい機能は調べておいてね。
342 :
デフォルトの名無しさん :02/10/30 14:31
343 :
デフォルトの名無しさん :02/10/30 14:46
ANCI Cで、関数の引数に、決まってない数のパラメータを渡す方法ってどうやるんでしょうか? printf() なんかみたいに、渡すパラメータの数が決まってないんです
>>343 ANSI C って、なんでしたっけ。
stdarg.h はあるなら、va_list 使う。
ない場合は、以下で逝って世し。
宣言
void myprintf();
定義
void myprintf(int a, int b, int c, int d, int e, int f, int g, int h, int i)
{
}
>>344 <stdarg.h> は ANSI で定義されてたと思う。
(・∀・)イイ! やってきます
348 :
デフォルトの名無しさん :02/10/30 16:09
どこで聞こうか悩んだけど、ここで質問させてホスイ ・C言語で開発している爺 ・グローバルな変数はあまり使いたくない志向 ・文字列”名前”を渡し、加工後に決められたコントロールにて表示という以下の関数を作成 void SetHogeName(HWND, LPSTR); 今までなんの疑いもなくこういう組み方をしていたんだけど、ある日気がついたんだ。 SetHogeNameって結構あちこちから呼び出しているんだよね。 で、コンパイルエラーが出ない範囲でHWNDやLPSTRを指定し間違えると、潜在バグってことになるよな? ここで思ったんだが、どうせHWNDやLPSTRに指定するデータなんぞ出所は決まってるんだよ。 つまらんバグを回避するなら、いっそのこと必要データはグローバル変数に持っておき、SetHogeNameからグローバル変数にアクセスしに行けば良いんじゃないかと。 一応、グローバル変数って簡単に書き換えることが出来るという点で危険が残るのでよ、書き換える場合はアクセッサでも通してやれば良いかと思った。 ちょっとデムパ入ってるかのぅ? C++なお年ごろ? 勘違い?
349 :
デフォルトの名無しさん :02/10/30 16:21
#include <stdlib.h> #include <stdio.h> int main( int argc, char * argv[ ] ) { if (argc !=3) printf("wrong no. of arguments\n"); else { printf("Sum: %d\n", atoi(argv[1]) + atoi(argv[2])); } return 0; } このプログラムを改良して。引数より少ない正整数で割りきれるものをすべて列記する。 プログラムを開発せよ。 例 a.out22なら 22は11で割りきれる 22は2で割りきれる 22は1で割りきれる だれかお願いします。
350 :
デフォルトの名無しさん :02/10/30 16:23
a.out20なら 20は10で割りきれる 20は5で割りきれる 20は4で割りきれる 20は2で割り切れる 20は1で割り切れる 引数より少ない正整数で割りきれるものをすべて列記する。 プログラムを開発せよ。
今度の1は必ず「宿題丸投げお断り」の文言を入れといてくれ
>>350 ヒント:素因数分解
352 :
デフォルトの名無しさん :02/10/30 16:30
>>348 グローバル変数では無く、ファイルスコープのstatic変数にしろ。
でアクセサ経由でstatic変数にアクセスしろ。
これで意味が分かるか?
>>354 ぎぶあっぷ
どうでもいいや俺の宿題じゃないし
>>353 サンクス。よっく分かりますた。
でも、SetHogeNameみたいな関数って他にもかなり沢山あるんだよね・・。
ちと鬱。
>>355 君のレベルが知りたい
質問1:素数は知っているか。
質問2:任意の数が素数であることを判定するプログラムが作れるか?
質問3:任意の数の最大公約数を求めるプログラムが作れるか?
全部の質問にyesならば素因数分解するプログラムも作れるはずなのだが。
>>357 質問1にのみイエス
C言語は必須じゃなかったから去年あきらめたんだよ。
だから君のことは少し尊敬かも。でも無事卒業したよ。
359 :
デフォルトの名無しさん :02/10/30 17:07
>>357 ①1とそれ自身以外で割り切れない数
②枝切りしながらやる
③これも枝切り
よって、高枝切りばさみが必要
360 :
デフォルトの名無しさん :02/10/30 17:11
>>359 氏ね
>>357 ①握りこぶし位の大きさで、湿気の多い所にある
②中火で5分、弱火で10分コトコト煮込む
③アニメ「一休さん」のさよちゃんによく似ていた
361 :
デフォルトの名無しさん :02/10/30 17:31
質問です。 猫でも・・・を見ていたらエスケープシーケンスってのが出てきたから やってみたんだけど、実行結果が [2j こういう風になって、全然画面が変わらない! ちなみにソースは #include <stdio.h> int main() { printf("\x1b[2j"); return(0); } です。 色が変わったりするのも、何も起きなかったし。 OS XPで、BCC使ってます。 何か原因わかります?
362 :
デフォルトの名無しさん :02/10/30 17:36
>>361 たしかXPはエスケープシーケンスは使えなかったと思う。
363 :
デフォルトの名無しさん :02/10/30 17:39
>>362 ( ̄□ ̄;)!!
まじっすか!?
ふざけんなビルゲイツ( ゚Д゚)ゴルァ!
できねーじゃねーか( ゚Д゚)ゴルァ!
アア・・・マジ切ないよ
やる気なくすよ・・・。
VC++なら出来ますか?
>>363 config.ntにansi.sysをデバイスドライバ登録すればいいじゃん。
課題 4個の整数集合{a,b,c,d}と{e,f,g,h}が与えられたとき、 二集合の全要素の組み合わせで、かつ同一でない演算をする プログラムを作る (演算とは+-×÷、論理和、論理積) 集合の要素値の与え方は自由 「組み合わせ」とはa+bのような二要素からなるものとする
悪い、難しく考えすぎてた #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { int n, i; if(argc != 2 || (n = atoi(argv[1])) == 0) { printf("数値を入力してください\n", argv[0]); return 0; } for(i = n - 1; i > 0; i--) if((n % i) == 0) printf("%dは%dで割り切れる\n", n, i); return 0; }
誰か、Cでプログラム組んでください おながいします
368 :
デフォルトの名無しさん :02/10/30 17:46
>>361 第58章 コンソールアプリで文字色を変える
ってので色変えるヨロシ。
369 :
デフォルトの名無しさん :02/10/30 17:48
>>367 この板の何処かに同じような問題を見たなぁ。
答えも書いてあったような...
うpキボン
372 :
デフォルトの名無しさん :02/10/30 17:49
>>368 でもオレVC++でなくてBCCだから・・・
bccじゃ出来ないよね・・・?
373 :
デフォルトの名無しさん :02/10/30 17:51
374 :
デフォルトの名無しさん :02/10/30 17:52
375 :
デフォルトの名無しさん :02/10/30 17:56
何度もごめん!
>>373 のサイト行ったら、
step1:config.ntにansi.sysを追加。
step2:config.ntの最後に"dosonly"と追加。
step3:command.comを起動。
※NTのコマンドプロンプトはcmd.exeです。command.comはsystem32に含まれています。)
step4:エスケープシーケンスを含むバッチを実行。
ってあったんだけど、ステップ3のって
XPでいうとコマンドプロンプトなのかなあ
>>374 できる!?コンソールアプリね。
調べてきます
376 :
デフォルトの名無しさん :02/10/30 18:03
>>374 できたあ!ありがとうございます。
エスケープシーケンスはまだ出来ないけどw
再起動しないとダメなのかな。
で、質問なんだけどもw
コンソールAPIって、Win32APIみたいなものっすか?
windowsヘッダをインクルードしてるし・・・。
でもbccじゃWin32API使えないよね!?
>>376 > bccじゃWin32API使えないよね!?
MFCが使えないだけで、win32api SDKは使うことができます。
つまり、猫でも~のSDK編に載っているapiは全て使える。
378 :
デフォルトの名無しさん :02/10/30 18:21
>>377 そうだったんですか!!
VC++だったら全部できるんだよね?
かおっかなー。でもまだまだだからいいや。
379 :
デフォルトの名無しさん :02/10/30 18:27
380 :
デフォルトの名無しさん :02/10/30 18:40
キャストは他の演算子に比べてどれくらい優先度が高いんですか?
381 :
デフォルトの名無しさん :02/10/30 18:45
>>379 bcc32 -tW xxx.cpp
ってやればできるよ。
>>379 C++としてコンパイルすると確かにそのエラーが出てくる
hoge.cpp をhoge.cにして
bcc32 -W hoge.c
でコンパイルすると
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
hoge.c:
警告 W8057 hoge.c 31: パラメータ 'lpszCmdLine' は一度も使用されない(関数 WinMain )
警告 W8004 hoge.c 79: 'y' に代入した値は使われていない(関数 ShowText )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
こんな警告が出てくるけどコンパイルと実行はできる。
383 :
デフォルトの名無しさん :02/10/30 18:54
>>381 >>382 THANX!!
でもC++ではだめで、Cならできるってどういう事なんだ・・・。
386 :
デフォルトの名無しさん :02/10/30 19:05
void *vp; int *ip; ip=vp; // CだとOKでC++だとだめ。 ip=(int *)vp; // これならどちらでもOK
388 :
デフォルトの名無しさん :02/10/30 19:21
NULLポインタってどういう時使うんですか? 数字の0とは何が違う?
390 :
デフォルトの名無しさん :02/10/30 19:48
ストリームからとりこんでchar配列に格納する関数ってありますか? 改行してもEOFまでひたすらとりこむ関数
392 :
デフォルトの名無しさん :02/10/30 20:02
393 :
デフォルトの名無しさん :02/10/30 21:00
/*演習3-3 en03_3.c*/ /*学籍番号 02C1075 氏名 山下祥隆*/ /*作成日10月10日*/ #include <stdio.h> int main(void) { int num1; printf("あなたの年齢を入力してください。\n"); scanf("%d",&num1); double num2; double num3; printf("あなたの身長と体重を入力してください(センチ、キログラム)。\n"); scanf("%lf",&num2); scanf("%lf",&num3); printf("あなたの年齢は'%d'です。\n"); printf("あなたの身長は、%lf、あなたの体重は%lfです。\n"); return 0; } すいません、他の板に書いたら不適切だとのご指摘を頂いたのでこちらに カキコさせていただきます。二重カキコになりますがお許しくださいm(__)m 上記のプログラムを実行したらランタイムエラーが起きて、 プログラムがうまく実行できません。エラーは0なんですが・・・。 ご指導をいただけたら幸いですm(__)m
>>393 下の二つのprintf()で引数が足らない。
あと、板ではなくスレね
学籍番号とか氏名とか本気なんだろうか、とか、 作成日から20日たってるけど全然間違いに気付かなかったのか、とか突っ込みどころ満載だけど…。 #トリップ忘れてた…
396 :
デフォルトの名無しさん :02/10/30 21:06
>>394 ご返答ありがとうございますm(__)m
申し訳ありませんが引数とは何でしょうか?
わかりました、次から気をつけます。
>>378 おお!仲間ハケーンだ。
とりあえずVS.NETの学割版かなぁ・・・
互換モードでもできんのか・・・。 あー面毒さw
399 :
デフォルトの名無しさん :02/10/30 21:12
>>395 しまった・・・それ自分のじゃないんです・・・聞かれてコピーしてしまいました・・・
その部分は見なかったことにしてやってください(T^T)
>>396 printf("あなたの年齢は'%d'です。\n" , num1 );
/* %dで指定したら変数を指定しる! ↑ ここ。 */
printf("あなたの身長は、%lf、あなたの体重は%lfです。\n", num2 , num3);
/* ここも上と同じで%n.mが二つあるから二つ指定する。 ↑ここと↑ここ。*/
やたー400げtしてもたw
402 :
デフォルトの名無しさん :02/10/30 21:14
func(aa,bb); とかいうのがあったとしまして 引数二個しかとらないfunc()関数をプログラム中から探し出すとき $grep 'func(.*,.*)' unko ってやったら引数2個どころじゃない行が該当します 任意の文字列に「,」を含めない正規表現はどーかけばいいですか?
403 :
デフォルトの名無しさん :02/10/30 21:17
>>400 出来ました!本当にありがとうございましたm(__)m
解答していただいた皆様本当にありがとうございましたm(__)m
404 :
デフォルトの名無しさん :02/10/30 21:17
>>402 C言語とは何の関係もないんじゃ…
とりあえず /func([^,]+,[^,]+)/ でいいんじゃないの?
func("a, b", 10)とか出せないけど。
いた違いでした ありがとうございます
>>388 ・ヌルポインタは、ポインタが何も参照していない事を示す為に使う。
・ヌルポインタは、副作用無しに free delete できる。
・定数の "0" は、文脈によってヌルポインタ、または整数の 0 として解釈される。ただし、可変長引数、またはプロトタイプをもたない関数の引数に現れた場合は、整数の 0 として解釈される。
また、整数型とポインター型とで多重定義している関数の引数では、解釈は実装依存となる。
・ヌルポインタのビットパターンは実装依存である。
・条件式にヌルポインターが現れた場合、偽となる。
・ヌルポインタとヌルポインタとは等しい。
・ヌルポインタとその他のポインタとは、常に等しくない。
・ポインタ型によりヌルポインタのビットパターンが異なる場合があるが、コンパイラは(騙されない限り)正しい型を知っているので、比較は正しく行われる。
・NULL は 定数 "0" がヌルポインタとして解釈される場合のみ、定数 "0" の代わりに使用できる。他の文脈では、結果が実装依存となる。
(NULL を整数 0 の代わりに使用してはいけない)
・NULL の定義方法は実装依存である。(#undef NULL は合法)
408 :
デフォルトの名無しさん :02/10/30 23:02
>>397 オレはとりあえずVC++のアカデミック買うよ
たぶん1万2千くらいなはず!
フリーはなんだかんだいってフリーだからね
ボーランドごめん!
bccをサンクス・・・
409 :
デフォルトの名無しさん :02/10/30 23:06
かるい疑問だけど よくchar型の配列strを宣言してるソースとかに char str[256]; ってあるけど、 この256は2の8乗だよね? 分かりそうで分かんない256の意味をテルミー!
きりがいいんじゃない
411 :
デフォルトの名無しさん :02/10/30 23:21
>>409 バッファを2の乗数倍にしておくと、処理によっては早くなるケースも
あるけど、ほとんどの場合、意味は無いんじゃない?
tmp[100]とかとおなじで、適当なサイズ、ってことさ。
じゃあなんでstr[0x100]って書かないのさ?
str[0x100] だとなんか意味ありげ
415 :
デフォルトの名無しさん :02/10/30 23:38
バッファってなんでしょうか?
56gaiikara 256mosukareru
uso
419 :
デフォルトの名無しさん :02/10/31 00:04
関数形式マクロで #define SWAP(a,b) {int temp;temp=a;a=b;b=temp;} こんなの作ったとするしょ? で、ソース中に SWAP(data[left_index],data[right_index]); こんな風に出てきたら、セミコロンが余計でないの? あとこの場合はコンマ演算子使えないよね。 でも例えば #define putsa(str) (putchar('\a',puts(str)) putsa("警告!!"); とかはコンマ演算子使えるしょ? この二つの違いってなんだ?
>>419 普通は
#define SWAP_INT(a,b) do { int temp = a; a = b; b = temp } while( 0 )
ってするね
セミコロンは区切り子なので、 ;;;;;;;;;;;;;;;;;;;;;;;;;;;; と書いてもエラーにはならない罠。
422 :
デフォルトの名無しさん :02/10/31 01:00
>>419 え?(プロトタイプ宣言をしていれば)putchar('\a',puts(str))はエラーになるでしょ?
引数が多すぎるって・・・
関数の実引数リストのコンマはコンマ演算子とは別物のはず。評価される順番は保証されていないし。
よく見たら括弧の対応がおかしいな。 そうかputchar('\a'),puts(str);と書きたかったのか。
>>421 空文ってことか。だったらなくてもおkだよね?
>>423 ごめん。まちがった。その通りです。
あとさ、
>>490 のは
#define SWAP_INT(a,b) {do { int temp = a; a = b; b = temp } while( 0 )}
って書かなくていいん?
>>422 オレが持ってる本に載ってたソースなんだけども
「こういうときはコンマ演算子を使いましょう」
って感じで紹介してるよ。
age
>#define SWAP_INT(a,b) {do { int temp = a; a = b; b = temp } while( 0 )} つか、do..while()に終端の ; が無いからコンパイラが文句言うだろ
428 :
デフォルトの名無しさん :02/10/31 02:33
char *p = (char *)NULL; という冗長な記法のルーツを教えてください。
430 :
デフォルトの名無しさん :02/10/31 02:38
void*から任意の型のポインタへの変更って、昔はキャストが必要だったんですか?
>>429 要らない。428 のようなコードはクソ。
C++ ではきちんとしたキャストが必要だけど、NULL が型を持ってないから
結局キャストは要らない。
>>431 >要らない。428 のようなコードはクソ。
早く寝な(藁
あ、昔から不要だったんですか。じゃぁルーツはなんだろう。
>>431 はい。C++では <cstddef> で #define NULL 0 ですね。
NULL論争するやつは、おそらく勘違いしているヤシが 混ざっているはずなので、まずC FAQを読むべし。
>>435 自信がない奴は読んどいた方がいいよ。
おそらく「そうだったのか」と思うだろうから。
437 :
デフォルトの名無しさん :02/10/31 02:56
C/C++が勘違いしやすいように作られているのだから仕方ない。 悪いのは全部C/C++のせい。
>>419 > #define SWAP(a,b) {int temp;temp=a;a=b;b=temp;}
>>424 > #define SWAP_INT(a,b) {do { int temp = a; a = b; b = temp } while( 0 );}
if(a < b)
SWAP(a,b);
else
a = b;
と書いた時、文法エラーになる。
420 が正しい。
>>424 > 「こういうときはコンマ演算子を使いましょう」
その本のタイトルを晒したのち、すぐさま燃やせ。
コンマ演算子は何の役にも立たず、ソースを見にくくするだけの機能しかない事が
既にわかっている。
>>437 あと、誤解をさも真実のように言いふらす生兵法馬鹿が
過去に大勢いたせい、というのもあるねえ(ワラ
読んできた。 Cでは 0 か ((void*)0) にdefineされるんでしょう?ならキャスト不要では。
>>437 勘違いしているのはあなたのせい。
プログラムが動かない時、すぐ処理系のせいにする DQN が多くて困る。
一体何でつまずくんだか。
>>441 言語仕様書を読むことにつまづくんだろうよ(ワラ
期せずして燃料投下した感じだな(w
>>440 その通り。
432 のような DQN が、428 のようなクソコードを書く。
真に優れた人は char *p = 0; と書く。
>>442 そら思いっ切り処理系じゃなくて読む人のせいだ。
446 :
デフォルトの名無しさん :02/10/31 03:03
正式な言語仕様書が手軽に入手できないのが悪い
では、char *p = (char *)malloc(hoge); もDQNの所業ってことでいいっすね。
>>448 void*からのキャストは不要、の文脈を採用。
お前等ちゃんと言語仕様書熟読してから使えよ
嫁が欲しい
453 :
デフォルトの名無しさん :02/10/31 03:19
447とは方向が逆だが、read(fd, (void *)buf, len); もDQNってことでOKだよね(readはBerkleySocketAPIの)。
456 :
デフォルトの名無しさん :02/10/31 03:36
もちろん、C++でどーしてもstd::mallocを使うならcastしないと駄目ってのはわかってるよ。
皆さんCとC++は別物ですよ~。 pascalとDelphiぐらい違います。
459 :
デフォルトの名無しさん :02/10/31 03:38
んなこたーわかってるわ。
460 :
デフォルトの名無しさん :02/10/31 03:47
461 :
デフォルトの名無しさん :02/10/31 03:49
>>460 じゃぁ何番が何をわかってないのか書いて(はぁと)
462 :
デフォルトの名無しさん :02/10/31 03:52
>>461 皆さんがCとC++は別物ということをわかっていない。
......... 相手にすんのやめよ・・
C++使いが来てはいけないんだよ。嫉み厨の心が乱れちゃうから(w
>>463
C++厨必死だな(w
釣れてるし。
ちょっと疑問。 変数の初期化に非定数を指定するのは C では OK なのか?
あのー、強いて言うならどちらもそこそこ好きってだけなんで、
>>455 に
返答願う。
>>468 いや、そう思って VC6 で試したら、477 のコードが通ってしまうので規格見てた。
C99 では 6.7.8 の 4 で 「constant expressions or string literals」 って
書いてある。
ANSI ではどうなんだ?
471 :
デフォルトの名無しさん :02/10/31 04:14
このスレは昼と夜で性格が変わるな。
>>470 他
あら、ごめん。
>>448 の宣言と使用は別行ってことにしてください。
でも、gccの3.2で gcc -Wall -ansi -pedantic でも何も警告されんなぁ。
>>472 そうか、じゃあ多分 ANSI では OK だったんだな。
ちなみに今しがた DOS の MS-C6 で試したけど、やっぱり通ったよ。
C++ ならもちろん OK なんだよな。
C99で厳しくなったのか・・・ 勉強になりましたサンクスコ
漏れも規格読んでみた。
>>470 6.7.8.4だよねえ。"that has static storage" って限定されてますが・・・・・・
static char *p = malloc... にしたら、"initializer element is not constant" でハネられましたわ。
他はよんでないからわからんけど、いいんじゃないんかねえ・・ だれかの突っ込みを待ちまつ。
ANSIなんてクソ規格より俺様の趣味を優先しる!! 初期化は定数!!初期化は定数!!
>>479 寝つきがわるいのか?お子様は突然置きださないでちゃんと麻まで寝なさい。
>>479 じゃあまずは&演算子の優先順位から何とかしてくれ。
昨日の問題を掘り起こすんだけど
関数形式マクロってのは、ただ単純に展開するだけだよね。
>>438 が書いてる
#define SWAP(a,b) {do { int temp = a; a = b; b = temp } while( 0 );}
if(a < b)
SWAP(a,b);
else
a = b;
ってのは、展開して
if(a < b)
{
do
{
int temp = a;
a = b;
b = temp
} while( 0 );
}
else
a = b;
こういう風には解釈されないの?
そうはならない。正確に展開してね。 というか、わざわざdo{}while()で囲んであるのに、更にそれをブロックで囲んだのは誰? if(a < b) { do { int temp = a; a = b; b = temp } while( 0 ); }; /* <- セミコロンが!*/ else a = b;
485 :
デフォルトの名無しさん :02/10/31 11:58
>>483 if(a < b)
{
do
{
int temp = a;
a = b;
b = temp
} while( 0 );
};
else
a = b;
こう展開されるのでは?
>>484 そうなるねw
でさ、今
>>483 に書いたソースでやってみたら
if(a < b)
SWAP(a,b)
こうやって、最後の;はずしたらできたんだ。
Cって文末には;がいるけど、この場合は例外?
でも好ましくはないよね?
だとすると、ソース中にセミコロンがつくように
マクロの部分を調整するのがベスト?
#define swap(a, b) {int tmp; tmp=a;a=b;b=tmp;}これではダメなのか?swap(a,b);として普通にコンパイルできるが。
ごめん。まちがった。 オレがやったのはこういうの #include <stdio.h> #define putsa(str) {do{putchar('\a');puts(str);}while(0);} int main(void) { int na; printf("整数を入力してください:"); scanf("%d",&na); if(na) putsa("その数は0ではありません。") else putsa("その数は0です。") return(0); } これならおkだった。 あとさ、マクロの部分は{}をつけなきゃだめなんでないの? それとも複文のときのみ?
>>487 それが最初に本にのってた
で、こうは出来ないのかなって思って質問しますた
>>488 putsaに;がついていなくて気色悪いな。
そう言うのを防止すると言う意味でのdo while(0)か?
>>487 それだと;が一個多いしょ?
空分だけど。
なんか納得いかん。
多くても別に間違いでは無いから気にする必要もない。
>>492 その意見を持つヤツに恐ろしく汚いコードを書くヤツは少なくない。
>>492 でもif文とかに使ったらエラーになるじゃん。
{}で括ってないから。
やっぱこういうときはdo{}while使えってこと?
>>495 なるほど。了解しました。
頭に叩き込んでおきます
C++ だと参照があるから、何も考えずにインライン関数書けばいいんだけどなー。
>>498 参照とインライン関数ってなんか関係あるんですか?
って言うか最近のインライン関数ってほとんどregister変数とかと同じ扱いでは?(初めからか・・・)
>>499 registerは指定してもレジスタに割り当てられるけど、
inlineは指定しないと、インライン展開されないでしょ。
×registerは指定してもレジスタに割り当てられるけど、 ○registerは指定しなくてもレジスタに割り当てられるけど、
いや、漏れはそんなに大した事言ってない。 C++ なら関数でも SWAP(a, b) って書き方できるでしょ。 C だと SWAP(&a, &b) って書かなきゃいけない。 それだけ。 ちなみに、最近のコンパイラでは register というキーワードは単に無視してるみたい。 あと、inline 指定しても内容が長かったり呼び出しが多かったり関数ポインタを得てる 場合はインライン展開されない。 頭のいいコンパイラは、inline 指定してなくてもインライン展開する事もある。 というか、C では inline はキーワードじゃないけど。
そうするとまた「C99にはinlineありますが何か?」という展開になって
何かと言われても、最後の行以外は何も変わらないけど・・・。
多倍長を使ってint型だけで、1兆+1兆をするって 配列とか使ってやるの? でも1兆だったらたとえば、 int vc[4]={1,0000,0000,0000}; ってやっても、無駄だよね。 charが使えないからなー。どうしたらいい?
>charが使えないからなー。 意味が分からない。
つーかマクロ使わないで関数にしろ
友達がchar使ったらできるとか言ってたよ でもintしか使えないから無理だなあって
ヽ \
/ \ \
∧_∧/
(;´Д`) i i i
/ ヽ _ i i i--、
./| | | |  ̄ ̄ ̄ |:::::|.
/ \ヽ/| | ノ__ノ..
/ \\| |
/ /⌒\ し(メ .i i i . .
/ / > ) \ ノノノ
/ / / / .\_ ザックザック
し' (_つ /:::::/::... /ヽ
; "ノ・ ./∴: / )i iヽ-、_へ ,ヘ
'',, : :―― / / i i i iヽ . ̄ ゙― ノ /
n_ _/; i .ノ / /ノ-' ̄ ゙ ― 、__ノ
_ノ 二二二、_( _Д_ ;)-ヽ_ノ-'
>>506 ゙ー ''~ ∨ ̄∨
512 :
デフォルトの名無しさん :02/10/31 15:37
int vc[4]={1,0000,0000,0000}; でええんちゃう。無駄が多いかもしれんが。
>>506 sizeog(int) >= 8 の処理系を使う。
char型の配列に下の位から1バイトずついれるんじゃないの?
>>512 それでやったら0000ってただの0に解釈されんの?
贅沢に、int を最小要素としてゾーン 10 進。これ最強。
8進数?
10進数で
せめてパック十進数で。 つーかよくしらねーんだが。
512 は擬似的なパック 10 進だろう。 正確にはゾーン 10000 進だが。 つーか、ここはネタスレか?
マジでわかんない。 てかそんな難しい話じゃないと思うよ。 まだ1ヶ月ちょっとしかたってないうちに 出された課題だからさ
>>521 人ごとみたいないいぐさ。
いいキャラだね。
printf("1兆+1兆=2兆\n");
つーかCで多倍長なんかつかえねーよ。
>>521 一ヶ月でもう授業についていけなくなってるのか。
かわいそうに。
俺の環境だとdoubleなら一兆入るな。
パック形式を使った演算処理を思い出した。 時間かかるけど。メモリーの許す限りの数を扱えるからな。
>>527 桁を増やすたびにreallocするの?
>>525 多倍長なんて習ってねーんだよ
なのいいきなり出しやがって、あのやろー。
無理なんでないの、こんなの。
お前らから、あのハゲにそう言ってやってくれ。
だってまだ授業じゃ関数の作り方すらやってねーんだもん
529 は習わないと何もできないのか。 くれぐれもプログラマは目指さないでくれよ。
ほへ? 多倍長整数、関数使ったほうがすっきりするけど、全部 main() でも 書けない事無いでしょ。
宿題スレにいけよ・・・
>>530 あめーな、今出来た。お前よりは頭いいんだよボケ
#include <stdio.h>
int main(void)
{
int vc1[13]={1,0,0,0,0,0,0,0,0,0,0,0,0};
int vc2[13]={1,0,0,0,0,0,0,0,0,0,0,0,0};
int vc_data[13];
int s;
int up_s=0;
int i;
for(i=12;i>=0;i--)
{
s=vc1[i]+vc2[i]+up_s;
up_s=0;
if(s<10)
vc_data[i]=s;
else
{
vc_data[i]=s-10;
up_s=1;
}
}
for(i=0;i<13;i++)
printf("%d",vc_data[i]);
return(0);
}
結局お前らの誰もわかんなかったんだね
C初めて一ヶ月のオレに何も教えてやれないなんてw
頭のデキがちげーんだよ
特に
>>530 煽る事しか能がねーw
ぷ
535 :
デフォルトの名無しさん :02/10/31 16:06
>>528 何桁ごとにreallocするかのか?という発想が欲しいね。
64byte(128桁)ごとに確保していたプログラムを打った。
536 :
デフォルトの名無しさん :02/10/31 16:06
バッファリングなしで、正真正銘一文字入力の関数ってなんだっけ? getche()・・・?
>>503 inlineに展開しないのは、あとは再帰関数かな。
>>534 2ちゃんねらーよりあなたのほうがはるかにレベルが上です。
だれもあなたの質問に答えられません。
だからもうここでは聞かないでね
sage
>>536 バッファリングなしにするのなら、
setvbuf(pf, NULL, _IONBF, 0);
fgetchar(pf);
ってやればいいかな。
>>538 なに偽者煽ってるんだよ(藁
お前本当に2ちゃんねらーか?
541 :
デフォルトの名無しさん :02/10/31 16:15
おれは一体何を書いているのだ。 fgetchar(pf); /* × */ fgetc(pf); /* ○ */
543 :
デフォルトの名無しさん :02/10/31 16:16
fgetchar() は標準じゃないぞ。 fgetc() にしる。
546 :
デフォルトの名無しさん :02/10/31 16:21
547 :
デフォルトの名無しさん :02/10/31 16:22
c言語におけるシンボルっていったいなんなんですか? 変数のこと?
533 のコードは確かに 1 兆 + 1 兆を計算するが、どう見ても多倍長整数では ないぞ。
>>539 多分バッファリングなしに入力ってEnterキーを押さなくても入力できる方法という意味だと思うぞ。
それなら多分setvbufじゃ無理。それとfgetcharってなによ。
551 :
デフォルトの名無しさん :02/10/31 16:27
>>550 お。そうそう。
getcharだと\nまで溜め込むしょ?
そうじゃなくて、いちいちリターン押さなくても
入力されるようにしたいのさ
552 :
デフォルトの名無しさん :02/10/31 16:28
>>548 マジ!?
多倍長整数て・・・どんなもの?
こんなのは? #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int vc1[13]={1}; /* 13桁の数字1 (単位は兆で、13桁目は1) */ int vc2[13]={1}; /* 13桁の数字2 */ int vc_data[13]; /* 計算結果を格納 */ int s; /* 一桁ずつ計算して、vc_dataにいれる数 */ int up_s=0; /* くりあがり(1か0) */ int i; int t; srand((unsigned int)time(NULL)); /* vc1とvc2にランダムで数を入れる */ for(i=1;i<13;i++){ vc1[i]=rand()%10; vc2[i]=rand()%10; }
/* 計算部分 */ for(i=12;i>=0;i--){ s=vc1[i]+vc2[i]+up_s; up_s=0; if(s<10) vc_data[i]=s; else{ vc_data[i]=s-10; up_s=1; } } /* vc1の表示 */ for(i=0;i<13;i++) printf("%d",vc1[i]); printf(" + "); /* vc2の表示 */ for(i=0;i<13;i++) printf("%d",vc2[i]); printf(" = "); /* 計算結果の表示 */ for(i=0;i<13;i++) printf("%d",vc_data[i]); putchar('\n'); return(0); }
555
556 :
デフォルトの名無しさん :02/10/31 16:42
>>551 機種依存関数を使わないとできないと思うよ。
(この問題はたしかFAQにもあった)
>>552 多倍長整数ってのは、例えば short に対する long とでも思ってくれ。
553-554 はゾーン 10 進と言って、多倍長整数とは別物だ。
>>556 DOS/Windows なら getch() ね。
>>557 >多倍長整数ってのは、例えば short に対する long とでも思ってくれ。
これは違うだろ。
560 :
デフォルトの名無しさん :02/10/31 16:48
>>559 じゃあどういうこと?
以外にどこにも書いてないよ
多倍長の定義って。
>>560 定義はしらないけど、ネットで公開されてる多倍長整数演算ライブラリはどれも
>>533 みたいに変数をいくつも使ってでかい数を計算するライブラリじゃん。
(もちろんやり方ははるかに洗練されてるけど)
562 :
デフォルトの名無しさん :02/10/31 16:59
DOSのディレクトリ名を取得する関数はなんでしょうか?
>>560 多倍長整数の定義はC言語自体には含まれない。
処理系が独自の型として long long などを持っていたり、
gmp のようにライブラリとして存在する。
>>562 _dos_findfirst() in <dos.h>
スレ違い。
559 で何故否定されたのか理解できない・・・
566 :
デフォルトの名無しさん :02/10/31 17:09
567 :
デフォルトの名無しさん :02/10/31 17:26
>>561 勘違いされるからその表現はやめてくれ。
多倍長整数は、整数というからにはバイナリで整数だ。
「変数をいくつも使ってる」 ように見えるのは、単にデータが複数回に分けないと
アクセスできない大きさだからだ。
569 :
デフォルトの名無しさん :02/10/31 17:33
>>568 結局
>>567 の答えは?
ってたぶん「なってない」だよね。
どうやって出力したらいいんだろ。
バイナリって2真数のことだっけ?
あーわからん。
570 :
デフォルトの名無しさん :02/10/31 17:33
>>568 ええ?
じゃあ、単にlongを使っただけで多倍長整数?
>>567 なってない。あれは単なるゾーン計算。
しかし、関数も教えていない学生に多倍長演算を出題する講師もまた DQN だな。
>>570 sizeof(long)==sizeof(short)*2 の環境ならそれでも間違いではないけど、
そもそもそれじゃ 1 兆を表現できないでしょ。
一般的に多倍長演算は、処理系で扱えないサイズの整数をなんとか扱おうという
仕組みの事を指すよ。
573 :
デフォルトの名無しさん :02/10/31 17:41
double使えばいいじゃん。
ちなみに 1 兆 = 0xE8D4A51000 だね。最低 40bit 要る。 short * 3 の 48bit か、long * 2 の 64bit で計算するといいだろうね。
576 :
デフォルトの名無しさん :02/10/31 18:02
とりあえず、みんなの言ってることが火星語にしか聞こえないオレは ゾーン演算とやらで、このレポートを提出します。 みんなありがとう。
577 :
デフォルトの名無しさん :02/10/31 19:19
ユーザーにカンマを挟んで二つの数字を入力させたいのですが (ユーザーはカンマも打ち込む)(入力例:2,3) scanf("%d"",""%d",&x,&y); とするとうまくいきます。 うまくいくんですが、"%d"に挟まれた","が どういう働きをしてるのか調べても本に載ってません。 コメントを書かなくてはならないので ご存知の方どうか教えてください。お願いします。
578 :
デフォルトの名無しさん :02/10/31 19:39
>>577 可変個の引数をとるからコンパイルエラーにはならないけど、
それだと引数が多すぎるぞ。
scanf("%d%*[,]%d",&x,&y);でうまくゆくかも。
あ、よくみたら,が"で囲ってあった。 ということはその三つの文字列が連結されて・・・
scanf("%d,%d",&x,&y); 素直にこう書けばいいってことか。
文字集合じゃないから%*[.]なんて書かないで素直に.と書けばいいか。。
さげ
583 :
デフォルトの名無しさん :02/10/31 21:37
EOFってどうやって入力するんですか?
DOSならCtrl+Zじゃなかった?
多倍長演算 数値にはunsigned short a[N+1];のような配列を用いる.ここでa[0]が整数部分、 a[1]からa[N]までが小数部分で、32768(=32768)進法で表す.たとえば3という値は a[0]=3,a[1]=...=a[N]=0で表す.log[10]32768≒4.5154であるからm配列要素1個分が 10進4.5桁に相当する.したがって、10進で小数第1000位まで求めるには、N≒1000/4.5≒ 222とする.(~~うんたらかんたら) とか書いてあります。 「C言語による最新アルゴリズム事典」(P.179)より抜粋 本読めよ。
587 :
デフォルトの名無しさん :02/10/31 23:21
>>586 やべー持ってるw
でも意味わかんねー
勉強します
588 :
デフォルトの名無しさん :02/10/31 23:25
cscopeって便利ですよ
10進数で考えずに、intとかの使える範囲を全部使って、 効率良く詰め込む感じでしょ。
$ gcc christmas_plan.cgcc:No such plan$ gcc date_with_lover.cgcc:No such lover
_lwriteのパラメータを教えて下さい。 _lwrite(fp, (LPSTR)&fh, sizeof(fh)); だと 一番左が書き込むファイルのハンドルで、2番目が良くわかんないです。 3番目がfhのバイト数の指定ってとこまでは分かってます。(間違ってたら指摘下さい) お願いします。
>>591 書き込むバッファの戦闘アドレスだろうが。
なんでLPSTRなんかでキャストしてるんだろう?
595 :
デフォルトの名無しさん :02/11/01 16:37
doubleで表現できる範囲ってどれくらい? 処理系依存なのは分かってるけど、小数点が入ることで どう変わるのかなって分かんない
>>595 IEEEフォーマットだと、
struct ieee_double {
u_int dbl_fracl;
u_int dbl_frach:20;
u_int dbl_exp:11;
u_int dbl_sign:1;
};
なので
-(2^52)*2^2047 ~ +(2^52)*(2^2047)-1
かな?
>>595 <float.h> の DBL_??? の定義を見てください。
DBL_DIG が 10 進での有効桁数。
表せる範囲は DBL_MIN ~ DBL_MAX です。
598 :
デフォルトの名無しさん :02/11/01 19:37
ネットで拾った通信系のソースコード内に、 struct hoge hoge_data { bind: hoge_bind, accept: hoge_accept, ioctl: hoge_ioctl }; てな構造体定義があったんですけど、この bind: のコロンの意味は何でしょうか? 今までこんな書式見たことない・・・制御系の基本なんだったらすみません。
>>598 ビットフィールドじゃないの?この文脈なら。
構造体のポインタを関数に渡して操作したいのですが、 bcc32でうまくいきません。 「)がありません」とか「構文エラー」とか「ひきすうが多すぎる」とか でるのですが、どこがいけませんか? 勘違いをたぶんしてるとおもいますが。 struct Player { long money; long game_num; /* 省略。longとintしかない。 */ int luck; } void play() { plyr1.money -= 500; printf("%ld\n",plyr1.money); return; } int main() { Player plyr1; plyr1.money = 10000; play(&plyr1); return 0; }
あ、hoge_ioctlなどの部分は関数で宣言されてます。
OSはLinuxっす。
ioctlを呼んでいる部分はあるんすけど、hoge_ioctlとかpochi_ioctlとか…
宣言されている同種類(と思える)関数は、どこからも呼ばれている形跡がないので
もしかして上の構造体宣言は、システムコールをハックするような特別な記述なのかなーと
思ったんですが、社内誰も「そんな書式知らん」なんですよ。
>>599 早レスありがとうございます。
ビットフィールドは
型 変数名:ビットサイズ;
と違いましたっけ?
・・・・・・・・・・・・・・・・・
>>600 void play()
play(&plyr1);
この2行に違和感を感じないのが不思議だ。
>>602 あ、ゴメソ。
void play(Player *player)
です。
604 :
デフォルトの名無しさん :02/11/01 19:51
>>602 あ、ゴメソ。
void play(Player *player)
です。
#age忘れスマソ。
#つーかインデントを に置換しときゃよかった。
うわー二十カキコスマソ。 回線切れたw
606 :
デフォルトの名無しさん :02/11/01 19:54
void play(struct Player *player) void play(Player *player) void play(Player *player)
607 :
デフォルトの名無しさん :02/11/01 19:56
void play(struct Player *plyr1) { plyr1->money -= 500; printf("%ld\n",plyr1->money); }
>>598 これって構造体定義じゃなくて、変数宣言なんじゃねーの?
bindは構造体のメンバで、メンバを指定し、初期化できる仕様が
あるという話をどっかできいたようなきかなかったような…
>>608 回答どうもです。
ん~、変数で同名のものは見当たらないので、関数へのポインタであると
思ってました。
何にせよ、 bind: のコロン部分の意味がわからない。
付けても付けなくても同じとかゆー ふざけたもんではないと思うし。
今日中にわからないと上司に頃されるわけではないので
どなたか・・・月曜までに(休出)何らかのヒントを・・・でないと犯頃しにされるかも。
メンバ指定の構造体部分初期化でしょ。 struct hoge { int a; int b; int c; }; struct hoge hoge_data = { a: 1, c: 2 }; みたいなことができるよ。少なくともgccでは。
611 :
デフォルトの名無しさん :02/11/01 20:02
何も付けてないとintになるってやつではなかろうか。
>>606 これがstructつけてもダメなんです。。。
ゴルァって思ってたらソース消してもた
#しかもShift-Delでゴミ箱残ってないw
#どうせクソコードだからいいよ、いいよw
613 :
デフォルトの名無しさん :02/11/01 20:06
struct Player { long money; long game_num; /* 省略。longとintしかない。 */ int luck; }; 最後に;をつける。
>>609 なんかいろいろ意見がでてるが、gccの拡張仕様だよ。それ。
>>608 と
>>610 が正解。
gccのinfoが参照可能なら、C Extensions -> Labeled Elements を見てみましょう。
615 :
デフォルトの名無しさん :02/11/01 20:10
>>610 初めて見た。gccはんなこともできるのか。
>>613 ソース消えましたが、こんど作ったときにやってみます。
さんくすこ。
617 :
デフォルトの名無しさん :02/11/01 20:15
ビットフィールドとまぎらわしい。 struct hoge hoge_data = { a = 1, c = 2 }; とかだったらいいのに。
618 :
デフォルトの名無しさん :02/11/01 20:18
>>616 >>607 は無視か?
struct foo *hoge;なら
hoge->a か (*hoge).a だぞ。
hoge.aはダメ。
619 :
デフォルトの名無しさん :02/11/01 20:18
:ってC++でのコンストラクタ初期化子を真似たのかな。
>>614 フォローありがと。
>>617 オレも似たような感想を持ったんで、印象に残ってた。
a = 1だと式になっちゃうから、何かとまずいんでは。
>>608 =620
>>610 >>614 おおう! 知識人さん情報ありがとうございます from 無知人
ううむ・・・拡張仕様でつか。
それで再度確認してみます。
これで上司に頃されないですむ・・・しかも今日中にヒントが得られたと言って
安心させることができる!
と思ったら、さっきトイレ行ってた間に上司帰ってしまって鬱。。。
622 :
デフォルトの名無しさん :02/11/01 20:32
正解はこれだ! struct hoge hoge_data = { a := 1, c := 2 };
ん? ioctlやbindってのは、構造体ではなくてlinuxのシステムコール関数のはずなんですが・・・ 余計わけわからん(T-T GCCの解説ページでも探して、解決目指します。 情報どうもでした(引き続き何か情報あればお願いします・・・まだまだ帰れそうにないので)
んんん? てことは、システムコール関数へのポインタとユーザー関数へのポインタを 結びつけて、結果的にシステムコール関数が呼び出されたらユーザー定義の 関数へ流れるよう、ハックしていることになるのかいな??? あーむず。10分ほど休憩しよう。。。
626 :
デフォルトの名無しさん :02/11/01 20:42
>>598 の質問って以前にあった気がするんだが…。見た時デジャブを感じた。ビットフィールドと主張した奴がいて、その後gccの拡張仕様だと分かって最初に主張してた奴がコケにされてた気がする。
627 :
デフォルトの名無しさん :02/11/01 20:44
598はstruct hoge の定義を読めば? hogeのioctlが関数へのポインタか、何かの変数なのか調べる。
正直に一部バラします。これで職場バレることが無いことを祈る・・・ 拾ったのはGNUとして公開されている某通信系のソースコードで、基本的な概念の説明としてテキストファイルがちょこっと同梱されている以外は ソースコード内にもコメント一切なし(あっても、 ret = xxx; /* set return code */ 程度)、で泣く泣く解析しているところなんです。 Linux板の某スレで超初心者として質問したこともあり・・・。初Linux・初通信系・初デバイスドライバで頭壊れそうですわ。 んで、その定義部分。 /* Protocol family operations */ struct proto_ops rpf_ops = { family:PF_AFFIX, release:rpf_release, bind:rpf_bind, connect:rpf_connect, socketpair:sock_no_socketpair, accept:rpf_accept, getname:rpf_getname, poll:datagram_poll, ioctl:rpf_ioctl, listen:rpf_listen, shutdown:sock_no_shutdown setsockopt:rpf_setsockopt, getsockopt:sock_no_getsockopt, sendmsg:rpf_sendmsg, recvmsg:rpf_recvmsg, mmap:sock_no_mmap }; これ以上の説明なし。 なんとかなるかいな~
>>618 Thax.
> >> 607は無視か?
なんかgcc関連の話題で見過ごしてた。ス
631 :
デフォルトの名無しさん :02/11/01 21:44
632 :
デフォルトの名無しさん :02/11/01 23:18
>>628 プロトコル毎に関数のポインタを構造体にしてるだけじゃないのか?
下位部分から rpf_ops->bind(...) みたいにして使うんでしょ。
パッと見ただけでわかるやん…
ソースファイル消したのならここから拾えば良いと思ったが、 該当するのかしないのか??
(,, ゚д゚) ┳┳┳┳┳
636 :
デフォルトの名無しさん :02/11/02 18:38
ある配列について、その添字の値の範囲を制限したいとき、どうすればいいですか? 例えば、その配列の添字に使うために特別に用意したtypedef enumを使えば、その タイプを添字に使う限りはいいと思うのですが、そうではなく、もっと一般的に、汎 整数型の添字を使った場合に、コードの中で検査しなくても自動的になんらかの対策 をとる方法はありますか?
>>636 スマートな回答は無い。
配列を直接扱わず、配列を操作する関数を作る事ぐらいしかできない。
あるいは、C を諦めて C++ に移行する。
>>636 どういう対策をとりたいのかによって
返事は変わってくると思われ。
>>636 operator[]を定義して、添え字の値次第で例外を投げるとかにすれば?
>>636 境界線チェックをきちんとするということ?
なら
>>637 がいうように関数をつくることしか・・・・
そういえばC++ Primerの配列クラスの作成のところにまさにそんなものがあったような。
>>639 なにを言っているのかわかりませんが? と突っ込んでみるテスト
a[n%N];
正直、642 のコードは役に立たないと思う。 デバッグが難しくなるから、素直に core 吐いて落ちてくれる方がマシだ。
でも、巧いとはオモタな。 >636には理解できたろうか?
if(n<0||n/N>=1) goto label; a[n]; label:
>>644 Nを要素数にすればn%Nの解が0からN-1になるってことでしょ?
>>646 当たり。でも 643 参照。
実際のところは 645 にして、エラー処理をするべき。
648 :
デフォルトの名無しさん :02/11/02 19:59
CGIを作ってるんですが、 &を入力されると、 test1=1&test2=2&3 (test2に2&3を入れた) のようになり、うまく切り分けることができません。 &の時はエラーを出すようにするしかないんでしょうか?
>>648 ん、それってブラウザの問題じゃないの。
URLエンコーディングしてないってことでしょ。
そんなブラウザあるの?
651 :
デフォルトの名無しさん :02/11/02 21:04
char * const srcと const char *strの違いがよく分からん。 上のは「srcは、キャラ型への読み出し専用のポインタ」で、 下のは「srcは、読み出し専用のキャラ型へのポインタ」? 違いが全然わかんねー。だれか分かりやすく教えてくり。
652 :
デフォルトの名無しさん :02/11/02 21:09
>>651 上は src = NULL; とするとエラーになる。
下は *src = 'A'; とするとエラーになる。
>>651 const char*はポインタの指す値を変えられない。char* constはポインタの指す
値は変えられるがポインタそのものは変えられない。
654 :
デフォルトの名無しさん :02/11/02 21:13
擬似的に()でくくってみるとわかるYO ( (char *) const) src; ポインタがconst ( (const char) *) str; charがconst ( (char const) *) str;の方が対比としてはわかりやすいかも。 「後置の*はconstより優先度が低い」と覚えればよい。
ちなみにchar const*とconst char*は同じだYO。
例えばポインタ演算子 **p は右から順に結合する。つまり、(* (*p) ) という事だ。 これと同じように考えればいい。 つまり char * const p; は (* (const p)) であり、p そのものを変更する事はできない。 p が指す先を変更する事はできる。 一方 char const * p; は (const (*p)) であり、p そのものは変更する事ができる。 p が指す先を変更する事はできない。 そして char const * const p; は (const (* (const p) ) ) であり、p も p が指す ものも変更できない。 なお const char * p; は char const * p; と全く同一である。 654-655 の説明は、かえってわかりにくいと思う。 「ポインタ演算子と同じく右から順に結合する」 と覚えればよい。
練習問題: char const **p; // 1 char *const*p; // 2 char **const p; // 3 pへの代入がエラーになるのはどれ? *pへの代入がエラーになるのは? **pへの代入がエラーになるのは?
659 :
デフォルトの名無しさん :02/11/02 21:19
660 :
デフォルトの名無しさん :02/11/02 21:20
>>648 俺はとりあえず通常通り切り出して、必要なキーをもつ値が見つからなければエラーにするようにしているよ。
>>648 pへの代入がエラーになるのは3
*pへの代入がエラーになるのは2
**pへの代入がエラーになるのは1
>>657 じゃあ
char const *p1, *p2;
はどう説明するんだYO
663 :
デフォルトの名無しさん :02/11/02 21:24
リードオンリーのポインターって使うことある? 配列名はリードオンリーのポインタだという意見はなしで。
>>662 それってchar (const *p1), *p2; って意味でしょ。
665 :
デフォルトの名無しさん :02/11/02 21:33
環境はVC++.netなのですが、 Cのrand関数を使って乱数を取得したときに5桁の整数が最大になってしまうのですがなぜでしょうか? 7桁の乱数を取得したいのですが・・・
2つとって掛け合わせるなど、工夫して見たら?
667 :
デフォルトの名無しさん :02/11/02 21:35
>>665 > 5桁の整数が最大になってしまうのですがなぜでしょうか?
そういう仕様だからしかたないよ。
>>665 (long)rand() * RAND_MAX + rand()とかすれば?
670 :
デフォルトの名無しさん :02/11/02 21:38
char const*とconst char*は一緒なんだ。 const考えるときは型名排除して考えるって感じかな。 ところで上の二つの書き方はどっちの方が好ましいの?
単に掛け合わせると偏りが出るもんな。ゴメン
>>665 rand() が返す値は 0 ~ RAND_MAX です。
RAND_MAX は <stdlib.h> で定義されています。
>>671 どっちでもいい。
ただ漏れの意見としては、const が頭の方が定数である事を強調してていいと思う。
>>664 違うよ。
char const *p1, *p2;
p1もp2もchar const *だよ。
>>676 そしたら
char const *p1, const *p2;
って書いたらエラー?
>>665 (int)(
((double)rand() * (RAND_MAX + 1) + rand())
/ ((RAND_MAX + 1) * (RAND_MAX + 1) - 1)
* 1000000000.0
)
679 :
デフォルトの名無しさん :02/11/02 21:46
>>675 オレもそう思う。
読むのは慣れれば自然にわかるようになるから
書きやすい方でいいと思うよ。
オレは*const pとか使ったこと全然なかったから、
ずっとconstを先頭にもってきてた
double a[N][N]; double det(const double matrix[][N]); // 書き換えないのでconstつけた これでdet(a)と呼ぶと警告が出るんだけど、どうするのが正しいの?
>>682 良くないらしい。
warning: passing arg 1 of `det' from incompatible pointer type
684 :
デフォルトの名無しさん :02/11/02 21:49
>>678 それって、RAND_MAXがたとえば0x10000だったら、うまく動かないでしょ。
>>684 どんなコンパイラ?gcc3.2だとエラー出ないぞ。
689 :
デフォルトの名無しさん :02/11/02 21:56
690 :
デフォルトの名無しさん :02/11/02 21:58
>>684 gcc 2.95.3ではでないぞ(-Wallもつけた)
>>686 char const *p1, const *p2;
parse error before `const'
gcc 2.96
>>689 もちろん rand() を 2 回呼ぶ事で偏りは大きくなるけど、それは RAND_MAX が
いくつかどうかは全く関係無いでしょ。
仕様だったのですか。 どうすればいいのでしょうか。アドバイスお願いします。
696 :
デフォルトの名無しさん :02/11/02 22:04
>>693 つーか、RAND_MAX+1って、たとえば0x7fffみたく+1して、
(2進数で)桁上がりする数値を想定してるでしょ。
たいていの処理系はそうだろうけど、そういう保証はないし。
697 :
デフォルトの名無しさん :02/11/02 22:09
>>694 乱数の生成ルーチンは検索すれば、いいのが見つかるんじゃないの?
>>690 出るよ。-Wallつけなくても。
それに、出て当然だ。
const T *とT *はcompatibleだが、
const T **とT **や
const T *[N]とT *[N]はcompatibleでないから。
>>698 gcc3.2でも警告でないんですけど・・・・
>>693 RAND_MAX+1が2のべき乗でないと、
2つの一様分布乱数を足し合わせることになって、
一様分布でなくなる。
701 :
デフォルトの名無しさん :02/11/02 22:13
趣味でC言語やってみたいと思ってるんですが、 一万円程度も出して買う価値ありますか?
>>699 gcc-2.96.1とegcs2.91とVC++6.0とSun Forte 6.0では警告でマシタ。
>>702 ということはgcc3.2の-Wallって糞?
>>696 > 桁上がりする数値を想定してるでしょ
してないよ。何で?
範囲が 0 ~ RAND_MAX の場合、発生する乱数の数値の数は常に (RAND_MAX + 1)
でしょうが。
まず手始めに、RAND_MAX == 2 くらいだった時のケースを考えてみなさい。
>>700 2 進数で考えるなよ。
(RAND_MAX + 1) 進数で考えろ。
707 :
デフォルトの名無しさん :02/11/02 22:19
708 :
デフォルトの名無しさん :02/11/02 22:20
>範囲が 0 ~ RAND_MAX の場合、発生する乱数の数値の数は常に (RAND_MAX + 1) >でしょうが。 わけわからん…
678 は - 1 必要無いよ・・・。
>>665 (int)(
((double)rand() * ((double)RAND_MAX + 1) + rand())
/ (((double)RAND_MAX + 1) * ((double)RAND_MAX + 1))
* 1000000000.0
)
>>705 (RAND_MAX+1)が2のべき乗じゃなくて、かつ
RAND_MAX*(RAND_MAX+1)がdoubleの有効桁より大きかったら?
711 :
デフォルトの名無しさん :02/11/02 22:22
ctimeの戻り値で戻ってくる文字列へのポインタは何者なのでしょうか? 誰が確保して誰が開放しているの? グローバル変数?
define N 10 double det(const double matrix[][N]) { return 0.0; } double a[N][N]; int main() { det(a); return 0; } これで本当に警告でないの?
>>710 その場合はそもそも 665 の質問が出てこない。
>>711 グローバル変数。
static で確保されている。
勝手にいじりまわしたりしないように。
>>713 出る。defineの前に#がない。・・・・・
というのは冗談で、-Wallにしても本当にgcc3.2(MinGW)では通ります。
>>711 staticな領域へのポインタを返す。
だからリエントラントでないし、2回呼んだら前の値は壊れる。
713 のソースのどこに問題があるんだ? (define の # は置いといて)
718 :
デフォルトの名無しさん :02/11/02 22:30
>>705 >まず手始めに、RAND_MAX == 2 くらいだった時のケースを考えてみなさい。
RAND_MAX が 2 で下記の計算を実行したら、
(rand() * (RAND_MAX + 1) + rand())
出目の確率はそれぞれ下のように偏るよ。
0=50%
1=25%
2=0%
3=25%
>>715 ↓これは?
int main()
{
const char **p;
char **p2;
p = p2;
return 0;
}
>>719 それは警告出ました。
invalid conversion from 'char**' to 'const char**'だそうです。
>>718 RAND_MAX == 2
↓
(RAND_MAX + 1) == 3
↓
rand(/*1*/) * (RAND_MAX + 1) + rand(/*2*/)
0 * 3 + 0 = 0
0 * 3 + 1 = 1
0 * 3 + 2 = 2
1 * 3 + 0 = 3
1 * 3 + 1 = 4
1 * 3 + 2 = 5
2 * 3 + 0 = 6
2 * 3 + 1 = 7
2 * 3 + 2 = 8
何で結果の範囲が 0 ~ 3 なわけ?
> 何で結果の範囲が 0 ~ 3 なわけ? すまん。 頭の中で % 2でやってしまった。
>>720 const 値を非 const 仮引数に渡すのはダメだけど、
非 const 値を const 仮引数に渡すのが何故いけない?
>>725 いけなくないと思うが・・・
いけなかったら
char s1[1024],s2[]="abc";
strcpy(s1,s2);
とかできないし。
>>719 ↓ちなみにこれですと警告出ません。
int main()
{
const char *const*p;
char **p2;
p = p2;
return 0;
}
で、漏れは結局
>>700 とかが何を訴えたかったのかわからない。
(RAND_MAX + 1) 進数で考えた時、
rand(/*1*/) * (RAND_MAX + 1) は必ず 2 桁目になり、rand(/*2*/) は必ず
1 桁目となって絶対にぶつからず、足し合わされる事は無い。
なのに、そんなに偏りが出たりするわけ?
それと、2 のべき乗か否かは分布に何の関係があるの?
>>725 なぜかは知らんが↓のように決まっているらしいYO
void f(char const **);
void g(char * const *);
int main()
{ char *p;
f(p); // NG
g(p); // OK
return 0;
}
>>723 doubleじゃなくて、長い整数で計算するのかと思ったんだよ。
>rand(/*1*/) * (RAND_MAX + 1) は必ず 2 桁目になり、rand(/*2*/) は必ず
>1 桁目となって絶対にぶつからず、足し合わされる事は無い。
整数なら2桁目の計算が溢れたときぶつかるよね。
733 :
デフォルトの名無しさん :02/11/02 22:58
INT compare(STRING s1, STRING s2) BEGIN WHILE *s1++ == *s2 DO IF *s2++ == 0 THEN return(0); FI OD return (*--s1 - *s2); END これは何をやっている処理なのでしょうか?
>>730 char* と char** は元々非互換だが?
736 :
デフォルトの名無しさん :02/11/02 22:59
#define BEGIN { #define END }
つーか具体的にどうすればいいか教えてちょ
740 :
デフォルトの名無しさん :02/11/02 23:02
#define WHILE while( #define DO ){ #define OD } #define IF if( #define THEN ){ #define FI }
>>730 もしかして char *p; は char **p; の間違いか?
それでも、いずれにせよ
>>725 。
いったいその情報はどこから出てきた?
>>733 CをPascalのソースのようにみせかけるマクロ群か?(w
>>733 strcmp() と同じ処理。
でも、そのようなソースを書く香具師は足蹴りにしていい。いや、そうすべきだ。
745 :
デフォルトの名無しさん :02/11/02 23:04
int compare(char *s1, char *s2) { while (*s1++ == *s2) if (*s2++ == 0) return(0); return (*--s1 - *s2); }
>>733 単にstrcmpを少し効率悪くコーディングしただけだと思うが。
747 :
デフォルトの名無しさん :02/11/02 23:04
>>733 Cだとこうなのかな?
int compare(char *s1, char *s2)
{
while( *s1++ == *s2) {
if(*s2++ == 0) return 0;
}
return *--s1 - *s2;
}
>>738 とりあえず
>>709 でしのげ。
乱数の内容に不満があるなら、Web で乱数ライブラリを探せ。
>>732 すまん、レス見落としてた。
> 整数なら2桁目の計算が溢れたときぶつかるよね。
了解。
ただし、その場合は
>>714 。
で、
> 2 のべき乗か否かは分布に何の関係があるの?
これには答えてくれぬのかのう、
>>700 の人。気になるんだが。
> > 整数なら2桁目の計算が溢れたときぶつかるよね。
> 了解。
> ただし、その場合は
>>714 。
すまん、見逃してくれ・・・。
>>749 いや、単に2のべき乗なら、(RAND_MAX+1)かけるかわりに
左シフトすれば、下位はぶつからなくなると思っただけです(敬語)
あ、というか、2のべき乗なら掛け算してあふれてもぶつからないよね。
つまり、 char random_=rand(20)+rand(20)*20; とかだったりすると、 取り得る最高値が、399で、mod(256)かかった時に、 399-256=143 143以上(少しずれるのかも)の値が出にくいと言う偏りが出るって事ですよね。 RAND_MAXとchar,int,longのずれが偏りを産むような。
>>751 そうか。了解。
700 を見る限り、2 のべき乗じゃないと何か問題があるとしか読めないから。
安心した。
でも敬語はよして (;´Д`)
>>753 待った。いつ mod(256) なんかかかる?
>>709 の式をよく見てくれ。
double で割って掛けて割合を出している。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define RAND_NUM ((double)RAND_MAX + 1) int main() { unsigned r, i, cnt[10]; srand(time(NULL)); start: memset(cnt, 0, sizeof(cnt)); for(i = 0; i < 2000000; i++) { r = (unsigned)( (rand() * RAND_NUM + rand()) / (RAND_NUM * RAND_NUM) * 1000000000.0); cnt[r / 100000000]++; } for(i = 0; i < 10; i++) printf("%u ", cnt[i]); putchar('\n'); goto start; return 0; }
charで。 例えだよ。 実数型であれば問題無い。と思う。
>>757 ああ、732 の解説を入れてたのね。了解。
756 は誤爆。 乱数の結果の 1 ~ 7 桁目について、0 ~ 9 のそれぞれの出現回数をサンプリングする。 試しに実行したけどまあまあなばらつき。各要素が 100000 付近に落ち着く。 #define RAND_NUM ((double)RAND_MAX + 1) int main() { unsigned r, i, j, cnt[10]; unsigned div[7] = { 1000000, 100000, 10000, 1000, 100, 10, 1 }; srand(time(NULL)); start: for(i = 0; i < 7; i++) { memset(cnt, 0, sizeof(cnt)); for(j = 0; j < 1000000; j++) { r = (unsigned)( (rand() * RAND_NUM + rand()) / (RAND_NUM * RAND_NUM) * 10000000.0); cnt[r / div[i] % 10]++; } printf("%u: ", i + 1); for(j = 0; j < 10; j++) printf("%u ", cnt[j]); putchar('\n'); } putchar('\n'); goto start; return 0; }
>>742 ポインタの代入やパラメタ渡しの際には、変数と値がcompatibleであるか、
値が変数へconversionできる必要がある。
const TへのポインタとTへのポインタはcompatibleでない。
TへのポインタはT constへのポインタにconversionできる。
なので、char ** 型の値((char*)へのポインタ)は、
char *const *p ((char *)constへのポインタ型変数)には代入できるが、
const char **p ((const char)*へのポインタ型変数)に
代入することは出来ない。
同様に、double (*)[N] ((大きさNのdouble配列)へのポインタ)は、
double const (*)[N] ((大きさNのdouble constの配列)へのポインタ)
に代入できない。
ISO-C99規格の6.3.2.3と6.7.3を参照。
>>760 もし本当なら、なぜ↓で警告が出るんで塚?
#define N 10
typedef double T[N];
double det(T const * matrix) { return 0.0; }
T a[N];
int main()
{
det(a);
return 0;
}
>>760 「なので」 の前と後ろが全然繋がっていない。
FDIS 1999 の 6.3.2.3 と 6.7.3 のどこを見ればそんな解釈ができるんだ?
「なので」 の後ろの部分のように判断した文を引用してくれ。
>>761 まず、コンパイラは何を使っているか晒してくれ。
>>761 漏れの使っているどのコンパイラでも警告出ないよ。
コンパイラは何を使ってるの?
>>760 1 つ減らして考えてみようか。
typedef char* LPSTR;
> char ** 型の値((char*)へのポインタ)は、
> const char **p ((const char)*へのポインタ型変数)に
> 代入することは出来ない。
LPSTR* 型の値(LPSTR へのポインタ)は、
const LPSTR *p (const LPSTR へのポインタ型変数)に
代入することは出来ない。
・・・何でだよ。
↓はどうなった?
> TへのポインタはT constへのポインタにconversionできる。
>>764 おいおい。const LPSTR *はLPSTR const *と同じなんだから、
char * const *だろう。
>>764 LPSTRへのポインタはLPSTR constへのポインタにconversionできるよ。
>const LPSTR *p (const LPSTR へのポインタ型変数)に
これはLPSTRへのconstポインタ型変数であって
(const LPSTR)へのポインタ型じゃない。
>>765 そーだ、逝ってくる・・・。
ところで、760 にはどう思うの?
>なので、char ** 型の値((char*)へのポインタ)は、 >char *const *p ((char *)constへのポインタ型変数)には代入できるが、 >const char **p ((const char)*へのポインタ型変数)に >代入することは出来ない。 typedef char *T; としよう。 T*はT const *へconversionできるが、const char **へはconversionできないし compatibleでもない。Tとconst char *は別の型だから。 わかった?
あ、
>>768 も俺ね。
ポインタの代入ができるのは、
6.5.16.1 (1) both operands are pointers to qualified or unqualified
versions of compatible types, and the type pointed to
by the left has all the qualifiers of the type pointed
to by the right;
のとき。だからcompatibleでない型へのポインタは(他で許されてない限り)
代入しちゃいかんのよ。
>> 768-769 > Tとconst char *は別の型だから。 const 値と非 const 値は、確かに別の型だ。 しかし、別の型だからというだけの理由で変換ができないなら、 > T*はT const *へconversionできる のは何故だ? > T*はT const *へconversionできるが、const char **へはconversionできないし > compatibleでもない。Tとconst char *は別の型だから。 T*はT const *へconversionできるが、const char **へはconversionできないし compatibleでもない。 > Tとconst char *は別の型だから。 char* が const char* に変換できないなら、char は const char に変換できないのか? いいや違う。 char* は const char* に変換できる。 でなければ strcmp() 等はプロトタイプが間違っている事になるが、実際はそうではない。 従って char** は const char** に変換できる。 > だからcompatibleでない型へのポインタは(他で許されてない限り)代入しちゃいかん それは了解。 だが、char* が const char* に変換できないとはどこに書いてある?
追記。 char** は、const char** の役割を充分に果たす。 なのに compatible でないと言いきるのか? (逆は成り立たないが)
どうでもいいけど 769 は 760 で示したのとは違う場所を引用してるな。 自分の論に都合のよさそうな場所をみつくろってるだけか? 726 も無視してるみたいだし。
>>768 (char) * と (char) const * が別と言うなら、
(char *) * と (char *) const * も別だろう。
>> T*はT const *へconversionできる >のは何故だ? 規格にそう書いてあるから。 6.3.2.3 (2) For any qualifier q, a pointer to a non-q-qualified type may be converted to a pointer to the q-qualified version of the type; the values stored in the original and converted pointers shall compare equal. >> Tとconst char *は別の型だから。 >char* が const char* に変換できないなら、char は const char に変換でき >ないのか? >いいや違う。 > >char* は const char* に変換できる。 >でなければ strcmp() 等はプロトタイプが間違っている事になるが、実際はそ >うではない。 T * → T const *はOKなので、 char * → char const *はOKだよ。(T=char) char ** → char *const *もOK。(T=char*) char ** → char const **はダメ。(Tをどう置いてもうまくいかない。) >だが、char* が const char* に変換できないとはどこに書いてある? どこにも書いてないよ。 >char** は、const char** の役割を充分に果たす。 >なのに compatible でないと言いきるのか? 規格は言いきってるね。 6.7.6.1 (2) For two pointer types to be compatible, both shall be identically qualified and both shall be pointers to compatible types.
>>772 760で書いたのは「conversionできる」「compatibleである」ことを定義した箇所。
768で書いたのは「compatibleでないと代入しちゃいかん」と判断した根拠。
あ、ただし
>>760 で6.7.3と書いたのは6.7.6.1の間違い。
>>760 で書いた
>ISO-C99規格の6.3.2.3と6.7.3を参照。
の重要な部分は
>>774 に示したから、
>>762 にも答えたことになると思う。
>(char) * と (char) const * が別と言うなら、
>(char *) * と (char *) const * も別だろう。
compatibleではない。
しかしconversionできる。
>>774 の通り。
らじゃ。 個人的には、char * → char const * の時点で valid で、それ以上いくつ ポインタがネストしても OK のような気はするんだが・・・。 規格書じっくり読んでみる。
俺もそう思ってたけど、1段しかダメなんだよー。 実際、const char **にchar **を代入すると警告出るだろ?
これはエキスパートCプログラミングの48ページからの話題ですか?
>>779 ところが、VC6 ではそのままスルー。
今 gcc で試したら警告出た。
あれと思って VC6 の方で拡張子を c から cpp に変えたら、警告じゃなくて
エラーになった。
もしかして、ANCI C では OK だったんじゃないか?
だとしたら、漏れらが OK だと思い込んでいたのも頷ける。
783 :
デフォルトの名無しさん :02/11/03 03:33
バリバリの明示型キャスト!! これ最強!!これ最強!!
>>783 ま、警告を抑制するためだけとかのキャストは最強にクソだわな。
785 :
デフォルトの名無しさん :02/11/03 04:14
>>784 でもしかたない場合もあるよ。
例えばstrchrの中でreturnする時。
あれはキャストするしかないよ。第一引数の型はconst char *と決まっているんだから。
最近のコンパイラは、明示的であっても危険なキャストは警告出すんじゃないか?
>>786 んなわきゃない
786みたいなド素人は #define {static,const,reinterpret}_cast(type,expr) ((type)(expr)) とでもしてなさいってこった。
>>665 遅レス∧クソコードでごめんチャイ。
VC++.netのことはよくわかりませんが、Cのを使ってもいいならこんな感じ?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
long land(long);
int main(void)
{
printf("7桁の乱数は %ld です\n",land(7));
return 0;
}
long land(long keta)
{
long a,b,c,r/*,d,e*/;
srand(time(0));
for(a=1,b=1,r=0;a<=keta;a++,b*=10)
{
/*e=rand()%10;
for(d=0;d<=e;d++)
rand();*/
c=rand()%10;
r+=b*c;
}
return r;
}
#include <stdio.h> #include <stdlib.h> #include <time.h> long land(long); int main(void) { printf("7桁の乱数は %ld です\n",land(7)); return 0; } long land(long keta) { long a,b,c,r/*,d,e*/; randomize(); r=floor(((double)random(RAND_MAX/*+1?*/)/RAND_MAX)*10000000l);/**/ return r; }
<math.h> 入れといて <time.h> 要るっけ?
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> long lrand(long keta) { long r; r=floor(((double)random(RAND_MAX)/RAND_MAX)*10000000l); return r; } int main(void) { long r1; randomize(); printf("7桁の乱数は %ld です\n",r1=lrand(7)); printf("7桁の乱数は %ld です\n",r1=lrand(7)); printf("7桁の乱数は %ld です\n",r1=lrand(7)); return 0; }
>>788 rand()%10 を使ってる時点で DQN。
理由は Web に転がっている。
>>789-791 未定義の randomize() や random() を使うな。
いいから
>>759 を試せ。
いきなりエラーが8個もでますが。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h>
797 :
デフォルトの名無しさん :02/11/03 09:26
if( aaa && bbb && ccc ) if( aaa | bbb | ccc ) の、aaa~cccの評価の順番はどうなりますか?
798 :
デフォルトの名無しさん :02/11/03 09:28
if( aaa || bbb || ccc )およびif( aaa + bbb + ccc )と、if( aaa * bbb * ccc )もおながいします。
800 :
デフォルトの名無しさん :02/11/03 09:47
>>797-798 それぞれ何か適当なメッセージを表示する aaa() bbb() ccc() 関数を作れば
一目瞭然です。
>>800 ビットにそれぞれ意味を持たせるなら構造体のビットフィールド。
そうでなく単にシフト等を行う場合はむしろインラインアセンブラの方が
スマートです。
C にはローテイトがありませんし。
803 :
デフォルトの名無しさん :02/11/03 09:55
>>802 やっぱインラインアセンブラですか。
いままで Z80, 6809, 680x0, x86系 しかやったこと無くて、
最近(なぜか) Power4 (OSは IBM AIX5L) でやれと・・・
制御やさんなどのために、ANSI なんかで関数群が決められているのなら、
まずそっちを実装してしまおうかと考えてたんですが。
これって俺的には Z80 使って Small C 使ってたときからの永遠の課題なんです。
そんなことより、MMX でローテートができないのは酷い。
805 :
デフォルトの名無しさん :02/11/03 12:28
806 :
デフォルトの名無しさん :02/11/03 13:07
標準関数のエラーチェックはどの程度行っていますか?
809 :
デフォルトの名無しさん :02/11/03 13:39
fopenは、ファイルが無ければ作るように指定するのが俺のデフォ。
ディスク容量不足、ライトプロテクト等によりエラー。
読み込みに行きたいときパスが間違っていたらどうするんだろ。 エラー判定せずに空のファイルを作成して見に行くのか? まさに選ばれし者
812 :
デフォルトの名無しさん :02/11/03 14:08
オレが新人のとき先輩から「エラーチェックはしっかりしろよ」と 言われていて「fclose()がエラーの時はどうするんですか?」と 聞いたら「それはエラーにならないからチェックしないでいいよ」と 言われた……
例外使えよ。
この場合にはfcloseが例外出してくれないと。
815 :
デフォルトの名無しさん :02/11/03 14:23
Cでも例外使えるようになったのか?
816 :
(;´Д`) :02/11/03 16:07
ファイル長を調べる方法をおしえてください
>>816 fseek(fp, 0, SEEK_END);
length = ftell(fp);
818 :
(;´Д`) :02/11/03 16:24
>>818 DOS/Windowsの上で、テキストモードでfopenしてるときは
817の方法だと、予想外の結果が返ってくることがあるので要注意。
>>812 fcloseでもディスクへの書き込みが発生するから
エラーの可能性は大いにあり。
その前にfflushしてるなら別だけど。
ネタの意味で書いたんだったらごめんよ。
821 :
デフォルトの名無しさん :02/11/03 18:15
つい最近Cを始めたのですが(プログラミング自体始めて) CってDOS上でしか動かせないのですか? あと、Cで作られたアプリケーションを見てみたいのですが どこにあるのでしょうか?
822 :
緑茶。(ZAPONEZE) p0225-ip01kagawa.kagawa.ocn.ne.jp :02/11/03 18:16
>>823 ありがとうございます。
最近「Cはダメダメ」とか聞きますけどそれでもCを一生懸命
勉強したいと思います。
いずれはアプリケーションを作りたいです。
825 :
デフォルトの名無しさん :02/11/03 19:56
Cをだめだめって言っているやつがだめなんだよ。 2000もXPもCで作られてるのに。
827 :
デフォルトの名無しさん :02/11/03 20:52
ANSI-C これ何て読むんですか? アンシ?アンジ?
828 :
デフォルトの名無しさん :02/11/03 20:55
アンシ
今までJava野郎でしたが、その内部にも踏み込みたいのでC(not C++)はじめました。 しかし慣れないメモリ管理などは怖いので、とりあえず何事も練習だし JavaのStringみたいなの作ってみるかな~と思ったのですが、 メソッドに対して自分自身のポインタを渡す方法が分かりません。 これでは、せっかく自分自身を適切に扱う関数へのポインタをメンバとして持ってても、 (strをインスタンスとして) str.strcpy( &str , "This is Test!!"); ~~~ ~~~~~ になってしまい、ダサさ&バグ100倍です。 プリプロセスでまとめて……なんての以外で、なにかうまい方法はないものでしょうか?
>>830 Cだとプリプロセスでごちゃごちゃやる以外にうまくやる方法はないと思うよ。
昔そのあたり追及してみたけど、おれには無理でした。
あるのなら教えて欲しい。
自分自身のインスタンスを渡す必要があるならC++使っといたほうがいいと思う。
安西
833 :
デフォルトの名無しさん :02/11/03 21:34
>>830 #define invokevirtual(obj,method,...) ((obj)->vtbl->(method)(obj,...))
C言語とはあまり関係ないことですが、 makeすると以下のエラーが出てしまいます。 make: Fatal error in reader: Makefile, line 317: Unexpected end of line seen Makefileの間違いは見つけにくくてよく困ります。 Makefileを書く際のコツ(間違いやすいポイント)がありましたら教えてください。
835 :
デフォルトの名無しさん :02/11/03 22:46
>>830 ネタだろ?
str.の.ってなんだよ。
str.いらねーじゃん。
>>835 char* mystrcpy (char* dst, const char* src) { ~ }
struct { char* (*strcpy) (char*, const char*); } str = { mystrcpy };
# 書き方あってるかちょっと自信ないけど。
>831 >833 う~む、やはりプリプロセスでやるのですか。 そこまでやってしまうと、"Cの味わい"を超えてC++になってしまいますね…… ちょっと前、本質的に安全なコンテナについて思考したときもそんな感じでした……。 >835 名前空間に関するまつわる問題の解決や、 再コンパイルなしのポリモルフィズム実現のために必要と思うのですが…… もっと他によい方法をご存知でしたらぜひ御師事ください。
> しかし慣れないメモリ管理などは怖いので、とりあえず何事も練習だし > プリプロセスでまとめて……なんての以外で、なにかうまい方法はないものでしょうか? > 名前空間に関するまつわる問題の解決や、 > 再コンパイルなしのポリモルフィズム実現のために必要と思うのですが…… どう見てもネタだな。言ってることが矛盾だらけだ。 OOから入った甘チャンにはCは無理だ。一生Java使っとけ。
>>837 まずは落ち着いてから書き込め
読みづらい
>>837 なぜJavaの考え方でわざわざCを使うことに拘る?
C++にした方がいいんじゃないか?
>838 う~む、ネタを出せるほどの能力もありません。 顔を洗って出直してきます。 >839 すみません、Cはまだ慣れてないので、これ以上整理できないのです。 >840 まず、 >今までJava野郎でしたが、その内部にも踏み込みたいのでC(not C++)はじめました。 のとおり、CでJavaっぽくするためにはどうすればいいかを理解する、のは目的です。 さらに、仕事でフレームワークを担当しているので、 「どうせならよりよく部品化・共通化してしまおう」という意思が働き、 Cの本質に反しない範囲でライブラリ的なものを整備してみようかと思ったのです。 しかし、やはり >840 さんの言うとおり、Java -> C よりも、 C++を一段挟んだほうがよさそうですね…… 明日から、C++について勉強してみます。 それでは、失礼しました。
CでSQLServerに繋ぐサンプルなんか公開してる所、誰か知ってたら 教えてもらえませんか?
ファイルの途中行を編集したいのですが、どのように実現したら良いでしょうか? イメージとしては 1日 2日 3日 というファイルを 1日(金) 2日(土) 3日(日) というように編集したいのですが、、
>>844 while (一行読んでEOFじゃない) {
if (目的の行か?) {
行を編集する
それを出力
}
else {
そのまんま出力
}
}
テンポラリファイルに書いて、
成功したときのみrenameすればよろし。
元のファイルをとっとくかどうかは適宜判断してくれ。
>>837 send(obj, message, ...)と書くなら
それほど抵抗はないんじゃないか。
>>845 それでは汎用性に欠けるので、
if(目的の行か?)
の部分を
if(読み込んだ行が日付であるかどうかを自動解析して、日付であるか?) {
曜日を自動取得して出力
}
と出来るソースを書いてみてください。
849 :
デフォルトの名無しさん :02/11/04 11:45
プログラム初心者なので間違った質問をしたら、すいません。C++言語を使って 乱数を一万個発生させるプログラムを作りました。それで、発生させた一万個の乱数のうち ランダムに10個出力させたいのですが、「アドレス」、「番地」という考えが 分かりません。色々と本を調べましたが、よく分かりません。 どなたか教えてください。
851 :
デフォルトの名無しさん :02/11/04 11:58
すみませんこれはどう解釈したらいいですか? const char const *(*foo[10])(int **P);
852 :
デフォルトの名無しさん :02/11/04 12:06
二つめのconstは最初のconstと被るから余計。 intへのポインタのポインタを引数にとり、変更できないcharへのポインタを返す、 要素数10の関数ポインタの配列fooを宣言している。
連休中でも2ちゃんみるんだね
855 :
デフォルトの名無しさん :02/11/04 14:52
>>855 まず、そこに書かれている英字が読めません意味もわかりません。
857 :
デフォルトの名無しさん :02/11/04 15:03
質問があります。 cの上でosのコマンドを使う方法を教えてください。 ちなみにsolarisです。 system()ですか? 馬鹿全開ですいません。
>>857 shine(const char *)だよ。
>858 ありがとうございます。 早速明日にでも試してみます。
>>859 sageの使い方間違ってるし・・・
嘘でも仕様です、とかいうなよ。
>860 ごめんなさい初心者なんです。 sageの使い方はこれでいいんですか? >嘘でも仕様です、とかいうなよ。 意味わかりません。板違いなのは分かってますがさらっと教えてくださると嬉しいです。
>860 いや、仕様の意味は知ってますけど・・・ つまり、この場合は『sageの使い方がわかんなかったことを、自分以外のせいにするな』ってこと? あってたら無視してください、間違ってたら再教授お願いします。
つまり、漏れがいいたかったのは、 >sageの使い方間違ってるし・・・ と言われたことに腹を立てて、(本当は知らないのに) 「知ってるよボケ」とか書き込んでくんなよという意味 ワカタカイ?
866 :
デフォルトの名無しさん :02/11/04 15:49
>>866 2chができた時から決まってんだよ???
>>864 ありがとうございます。
あと866は僕じゃないですからね。
なんか2chで初めて親切な人に会ったかのような・・・(笑)
どう致しまして。
どう致まして。
872 :
おながいします :02/11/04 16:36
c言語勉強し始めたばかりのもんです。現在自宅のWINDOWSで 「はじめてのc言語」という本の付録についていたコンパイラ (LSI C-86VER3.30試食版)というのを使用しています。 プログラム自体はMS-DOSを立ち上げてノートパッドで書き込み しているのですが最近エデイターの存在を知りました。 それでお聞きしたいのは使いやすいエデイターはないでしょうか? しかも出来ればフリーのもので。 以前「1週間でマスターするPERL」という本を購入したのですが 付録のエデイターが色が何色も出ていて字の大きさも適当で使いやすいので C言語でもこういったエデイターがあれば助かるのですが・・。 本に載っていたTeraPadというのを試してみたんですがちょっと 使いにくいです。秀丸エデイタというのが使いやすそうな感じなんですが 正直シェアウェアっていうのを使ったことが無くて。出来ればフリー のものが良いのですが。長くなってすみません。
フリーならTeraPad Shareなら秀丸。 ・・・て言うか秀丸のPASSならみんな知ってるんじゃ・・・ (教えてあげないよ)
874 :
デフォルトの名無しさん :02/11/04 16:40
っていうか秀丸はPASSなくてもずっとつかえるし・・・
875 :
ぽりんきー=872 :02/11/04 16:41
>>873 そのPASSがあればただで使えるんですか?
秀丸以外でフリーでいいものないんでしょうか。
教えてください。
876 :
デフォルトの名無しさん :02/11/04 16:42
>>872 学生だったら、秀丸は無料で使えるよ。
オレは秀丸使ってるし。
あとオレはbccとCPadっていう組み合わせでやってる。
ドス窓立ち上げなくてもすぐにコンパイルとかできるから
便利だ。VC++っぽくて(・∀・)イイ!w
金ないから、フリーで固めてます
>>874 マジすか。期限とか機能に制限ないんすか?
ボクはお金がないのでラインエディタを使ってます
879 :
デフォルトの名無しさん :02/11/04 16:45
>>877 Nothing!!
ほとんどボランティアだよね。
880 :
デフォルトの名無しさん :02/11/04 16:47
可変長の引数をもつ関数で void tiny_printf(char *format, ...) { int i; va_list ap; va_start(ap,format); for(i=0;i!='\0';i++) { switch(format[i]) { case 's': printf("%s",va_arg(ap,char*));break; case 'd': printf("%d",va_arg(ap,int));break; default: assert(0); } } va_end(); putchar('\n'); } va_endの引数が間違ってるってエラーが出るんだけど どういうこと? int main(void) { tiny_printf("sdd","結果・・・",3,5); return(0); }
秀丸はフリーソフトを公開すれば社会人でも無料になるはず。
TeraPad使いずらいと思う時点で房だな。 おれはずっとTeraPad使ってますけど何か?
>>879 うげー、今までプログラミングでよく使われてると聞いてたけど
シェアウェアだから全然眼中になかった。
乗り換えるかな・・・
つーか板違いだからこれで終わりにすます。教えてくれてありがと。
886 :
デフォルトの名無しさん :02/11/04 16:50
>>875 いや、多分違法(秀丸)
けど、まわりの奴はそれで秀丸使ってる奴多い。
俺はTeraPadだけど。
TeraPadって拡張ファイルがフリーで出てたりするから探してみたら?
俺はCとJAVAだし、あれで充分だけど。
>>885 =初心者
ブラクラじゃないんだから直リンすれよ。
あとsageろ。
リンクつながんない。すみません(恥) TeraPadでもいいですかね。もうちょっと調べます。 ありがとうございました。
890 :
デフォルトの名無しさん :02/11/04 16:52
892 :
デフォルトの名無しさん :02/11/04 16:55
>>891 でも本にあったソースをそのまま打っただけなのに・・・
なんなんだこの著者は!!
( ゚Д゚)ゴルァ!
>>882 TeraPadってコード書くのはいいんだけど、置換とか文字列操作が遅すぎ!
でも、愛用してるけど。
va_endに引数が無くてもとおる処理系が どっかにあったのかな・・・? まあ大体マクロやから、通るヤツもあるやろうけど。
ヘルプより
---------
●秀丸フリー制度について
秀丸エディタは、以下の方々には送金無しで使っていただけます。秀まるおのホ
ームページの「サポート」ページで必要事項を入力して申し込んでください。
秀まるおのホームページは
http://hide.maruo.co.jp/ です。
- WINDOWS関係を扱う本や雑誌の著者の方(著書をお知らせください)
- フリーソフトウェア作者の方(ソフトを公開していることが条件)
- 学生の方で難儀している方、または学校内PCでの学生による利用の場合
(アカデミックフリー制度)
学生の方の場合で卒業後も継続して秀丸エディタを使用する場合は、そのときに
送金をお願いします。
----------
つぅかメモ帳も立派なエディタだぞと。
技術評論社 前橋和弥 著 C言語ポインタ完全制覇 104ページ ほんとそのまま載せるんで、チェックきぼんぬ
#include <stdio.h> #include <stdarg.h> #include <assert.h> void tiny_printf(char *format,...) { int i; va_list ap; va_start(ap,format); for(i=0;i!='\0';i++) { switch(format[i]) { case 's': printf("%s",va_arg(ap,char*)); break; case 'd': printf("%d",va_arg(ap,int)); break; default: assert(0); } }
va_end(ap); putchar('\n'); } int main(void) { tiny_printf("sdd","結果・・・",3,5); return(0); }
>>892 こっちは合ってるじゃねーか。
お前が写し間違えたんだろ(w
904 :
デフォルトの名無しさん :02/11/04 17:57
>>902 あふぉだね。
ちゃんとこういう風に書いたら、法律的には「引用」に当たるんだよ?
覚えとけ房が
>904 引用は、引用に対する評論が主でないといかんかった気がする。
>>903 えー!!
したっけ、これコンパイルして実行してみて
本には「結果・・・3 5」ってなってるから
オレはできない・・・
908 :
デフォルトの名無しさん :02/11/04 17:59
>>903 禿同。
いるよな自分の未熟を本とかのせいにする奴・・・
>>904 お前がな。
引用はあくまで「主文」に対する補足的な「副文」でなければならない。
お前が引用と呼ぶ他人の著作物を丸々貼り付ける行為は引用とは認められない。
引用するなら許可取れよ。
>>909 同意。「今から宇多田の新曲全部張るぞ!」と声高らかに宣言しているに等しい。
>>910 許可を取らなくても他人の文章を載せてもよい。(
>>909 他いろいろ制約はある)のが「引用」の目的。
計算中心のプログラムを打ってるんですが、 計算でよく使う変数をグローバルで宣言、main関数内でmallocにて領域確保 すると計算が速くなる・・・ってことになりますか? それともコンパイラの速度重視っていうオプションで指定した方が良いでしょうか?
そのくらい自分でベンチマークとれよ。
>>912 今のギガヘルツマシンとかだと下手な小細工したところであまり効率は上がらないと思われ。
間違い発見しますた。 死んできます。
916 :
デフォルトの名無しさん :02/11/04 18:09
>>913 あ、そうっすね。ボケてました。
>>914 クラシックPentiumでも軽く・・・っていうのが目標なんで・・・。
ベンチ取りに逝ってきます。
918 :
デフォルトの名無しさん :02/11/04 18:56
関数をポインタで扱うっていうのを教えてください。例文付きでお願いします。
先生教えて下さい! なぜこれはちゃんと出力されないんでしょうか!!! #include<stdio.h> main() { char* color_name[]= { "hoge", "piyo", "hoge_p" }; printf("%s\n",&color_name); printf("%s\n",&color_name+1); printf("%s",&color_name+2); }
>>918 int main(int argc,char argv[][])
{
int (*shine)() = main;
printf("無限ループ\n");
shine(argc,argv);
}
>>919 出力は
hoge
oge
ge
でいいの?
hoge piyo hoge_p と出力されると思うんですが文字化け起こしてます。
>>922 取りあえず配列に対してアドレス操作するのやめなさいな。
文字列ポインタと配列は仕様が似ているだけで別の概念ですわ。
>>923 今Cを勉強していて、実用性の無いプログラムを大量に
作っている毎日ですので・・・
良かったら、なぜちゃんと出力されないのか教えて下さい。
colornameの中身:&"hoge",&"piyo","hoge_p" &coloename -> colorname[0] -> &"hoge" != "hoge"
#include<stdio.h> main() { char* color_name[]= { "hoge", "piyo", "hoge_p" }; printf("%s\n",*(&color_name)); printf("%s\n",*(&color_name+1)); printf("%s",*(&color_name+2)); }
927 :
デフォルトの名無しさん :02/11/04 19:18
>>927 確実にアフォですね。
アドレス演算しないんでしょうか?
K&Rは読め無そうですね。(プッ
┌─────┬─┬─┬─┬─┬─┐ │ *char │h │o │g │e │\n│ └─────┴─┴─┴─┴─┴─┘ ┌─────┬─┐ ┌─┬─┬─┬─┬─┐ │ char[] │* ├──→ │h │o │g │e │\n│ └─────┴─┘ └─┴─┴─┴─┴─┘
ずれた上に反対でした。さようならわが人生。逝ってきます。
遺言です。 ┌─────┬─┬─┬─┬─┬─┐ │ char[] │h │o │g │e │\n│ └─────┴─┴─┴─┴─┴─┘ ┌─────┬─┐ ┌─┬─┬─┬─┬─┐ │ *char │* ├──→ │h │o │g │e │\n│ └─────┴─┘ └─┴─┴─┴─┴─┘
>>926 コンパイルしたんですが、文字化け起こしてます。
>>930 指す元の所に格納されるのはchar *じゃなくて変数名では?
>>916 俺もそう思った。
しかしニュー速+なんか引用だらけだが。
>>935 >変数名では
と、言うことはJavaで言うリフレクションのようなことも可能になるのですか?
>>933 てか素直に配列で書けと
printf("%s\n", color_name[0]);
printf("%s\n", color_name[1]);
printf("%s", color_name[2]);
>>930 文字列終端は'\0'。凡ミスか?
急ごしらえで作るとそーゆー目にあう。
下の奴も935の言うとおりだろう。
頼むし >1 にあるC FAQ日本語訳は読んでくんさい。
>>929 >K&Rは読め無そうですね。(プッ
時代遅れですと。
942 :
デフォルトの名無しさん :02/11/04 19:52
>>941 禿同
ANSICの規格読め
K&Rは規格化される以前に書かれてるから(当たり前だけど)
間違いっつーか、規格と違うとこがある
くそ本です
943 :
デフォルトの名無しさん :02/11/04 20:03
このスレもラベルが落ちたな。
goto このスレ;
このスレ:;
そうそう、
>>950 が次スレ立てるのは伝統で俺が決めたことじゃないから。
次スレはちゃんと「俺(私)に聞け」スレでよろ
スレタイは C言語のことは漏れらに聞けモルァ!!<39刷> でどう?
敢えて、 C言語だけは俺に聞くな!【サンキュー】
>>956 それじゃスレ内容と全然違うだろ?
i--; /* increment i */
って書くか?
サンキューが採用されたのでまぁ、引き分けってとこか。良い勝負だったよ。
>>957
よくみたら8対2で漏れの勝ちじゃないかモルァ。
>>948 ラベルの後にはなにかしら文が必要だからセミコロンが必要。
>>882 ,
>>894 TeraPadっていいよな。HTML書くときも使ってる。
でもSakuraEditも捨てがたい。
いやEmEditorのインデント機能は最高だ。
TeraPadではインデントがちょっと。。。
ちょっとあさってこよう。
>>964 やっぱりTpadはいいよな。
SakuraEditor,Emeditorってのは初めて聞いたな。
ダウソして見る。
あと秀丸は個人的には機能がありすぎて苦手かな。
あとVC++のエディタってどうなの?
>>880 >>900 > va_end();
va_end(ap);
その本、本当に引数何も書いてない?
あと、va_end の説明は読んでない?
それとも書いてない?
前者だったらあなたが DQN、後者だったら本が DQN。
済まん、表示が 801-900 のままだった・・・ 逝ってくる・・・
968 :
デフォルトの名無しさん :02/11/04 23:10
>>966 マジで書いてないよ。どう見ても書いてない。
va_endの説明は、「たいていの処理系ではただのお飾り」
って書いてある。
ああ、この本失敗かーー。評判よかったのに・・・
>>968 でも、その後に続くレスを見る限りでは、訂正が出ているようだが。
それは見なかったの?
実物が手元に無いから、その本については何とも言えない。
971 :
よっちゃん :02/11/05 00:04
どうしたらC言語がよくわかるようになりますか? 教えて下さい。
高機能だからといって高性能だとは限らない。
975 :
よっちゃん :02/11/05 00:10
そんないいかげんな事言わないで下さい。
>>973 そして、わざわざ低機能低性能のエディタを選択する理由もない。
>>975 どうしたら自転車が乗れるようになるか説明できますか?
同じことです。
C言語の本を10冊泳いでください。
・・・に見えた。
>>975 試しもしないでいい加減と言う訳かい。
あんた一生 「C言語がよくわかる」 ようにならないよ。
漏れも C の本なら 5 冊は読んだし、C で~~プログラミング系の本だと
数え切れない。
Web にある解説ページも見て回った。
あんたは何もしないのかい。
つーか次スレ立ってるんだからそっち・・・いや逝くな。
>>976 「低機能低性能エディタ」 も作れない DQN
>>975 確かにいい加減だ。本なんぞいくら読んでも書けるようには成らん。
一冊でいい。読みつぶせ。それだけで問題ない。
書いて書いて書きまくれ。基本がわかれば後はもう己の頭の程度の問題だ。
本ばかり読んで言語仕様には詳しいがプログラムは書けない馬鹿が多いのも事実だ。
そうならないようにがんばれ!
982 :
よっちゃん :02/11/05 00:21
>981 ありがとうございます。
>>845 さん
>>848 さん
亀レスでごめんなさい。
数千行のうち1行しか編集しない場合、非効率に感じるのですが
Cで実現するにはこの方法しか無いようですね。
取りあえず、845さんの方法でやってみます!!
>>846 さん
awk()という関数があるのかと思ったら、awkって言語だったのか、、(^_^;
短いプログラムでいろいろ出来そうみたいですが、
今回はCで作ってみます(というかCしか知らないのです)。
>>983 可変長のファイルシステムを使っており、
行の長さが可変長であれば、
その行がディスクのどの位置にあるか
ファイルの頭から読んでみないと分からないので、
どの言語でもその方法しかない(あったりして)。
例えば一行が 256 byte 固定であれば
n 行目はファイルの先頭より 256 * (n-1) byte 目から始まることが
計算できるのでそこまで fseek(3) すればいい。
>>984 どちらにしろ、その行がどの行なのかは比較してみないとしょうがないかと。
fseek(3)の3は何ですか? 引数は3固定でいいんですか?
>>986 ファイルを先頭からシークすると言うことです。
固定で構いません。
リファレンスくらい引こうな。
989 :
デフォルトの名無しさん :02/11/06 12:23
ファイルのコード変換で、'\n' → '\r\n' とか '\r' → \'r\n' に変換する いい方法ってないでしょうか? ファイルを1バイトずつ覗いて、おきかえって言う方法しかないんでしょうか・・・
まもなくここは 乂1000取り合戦場乂 となります。
\∧_ヘ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
,,、,、,,, / \〇ノゝ∩ < 1000取り合戦、いくぞゴルァ!! ,,、,、,,,
/三√ ゚Д゚) / \____________ ,,、,、,,,
/三/| ゚U゚|\ ,,、,、,,, ,,、,、,,,
,,、,、,,, U (:::::::::::) ,,、,、,,, \オーーーーーーーッ!!/
//三/|三|\ ∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
∪ ∪ ( ) ( ) ( ) )
,,、,、,,, ,,、,、,,, ∧_∧∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
,,、,、,,, ( ) ( ) ( ) ( )
http://big.freett.com/scheme_a/num1000.swf
置換してくれるソフトとか使えば? エディタであるでしょ。
>991 処理の中のバッファファイルなんです。 既存のソフトから標準出力で受け取ると、改行コードがCRLFがLFになってしまって・・・ 当方の環境は Linux + gcc です
>>992 ライブラリを探してきたところで結局やってることは同じだと思われ。
一回は読まないとそこに改行コードがあるか否かなんて判定できないわけで。
perlで変換かましたら?
> 994 perl -pe 's/\n/\r\n/' wk > wk とやってみたんですが、 Substitution replacement not terminated at -e line 1. と返ってきてしまいます。 後、シェルスクリプトって、system()でコールできるんでしょうか? > 993 それしかないんでしょうか・・・(鬱
998 :
デフォルトの名無しさん :02/11/06 12:44
そんな面倒なもんでもないと思うが while ((c = getchar()) != EOF) { if (c == '\n') putchar('\r'); putchar(c); if (c == '\r') putchar('\n'); } \r\n が \r\n\r\n になってしまうが。
>>995 > perl -pe 's/\n/\r\n/' wk > wk
perl -pe 's/\n/\r\n/' wk > temp; mv -f temp mk
入力ファイルにリダイレクトはできない。
> 後、シェルスクリプトって、system()でコールできるんでしょうか?
yes, でもセキュリティホールには気をつけろよ。
perl -pe 's/\n/\r\n/' wk > wk だと読み込んでる途中の wk を上書きしてエラーになるぞ。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。