1 :
ビル・ジョブス :
2000/09/03(日) 21:43 おれは25才、3年間プログラムを一生懸命作ってきた。 C言語しか知らないがC言語なら誰にも負けない...
2 :
名無しさん@お腹いっぱい。 :2000/09/03(日) 21:51
Cだけっつーことは、アセンプラも知らないのか?
3 :
ビル・ジョブス :2000/09/03(日) 21:53
知っているが、オレの中であれは言語ではない。
4 :
名無しさん@お腹いっぱい。 :2000/09/03(日) 22:01
じゃぁ、あっちこっちで議論になってる、 「配列の名前はポインタ定数か?」 に、決着つけてください。
5 :
名無しさん@お腹いっぱい。 :2000/09/03(日) 22:05
俺は2年間VBをやってきて、自信は1ぐらいある。 同い年だ、結婚するか?(ワラ
6 :
名無しさん@お腹いっぱい。 :2000/09/03(日) 22:25
VBである ReDIm hoge(i) as integer で再定義して、任意の配列を宣言する方法があるが Cで配列の宣言する方法をおしえて。
7 :
ビル・ジョブス :2000/09/03(日) 23:15
>4 んっ?どこでやってる! >6 LocalReAlloc()するしかない。
8 :
名無しさん@お腹いっぱい。 :2000/09/04(月) 00:02
>7 おい、そりゃAPIだろ?
9 :
ビル・ジョブス :2000/09/04(月) 00:09
>8 だ・か・ら!領域サイズ不定の配列なんかCでは確保できねーって 意味だよ!
10 :
8 :2000/09/04(月) 00:13
>9 realloc()
11 :
名無しさん@お腹いっぱい。 :2000/09/04(月) 00:17
>だ・か・ら!領域サイズ不定の配列なんかCでは確保できねーって 7は「サイズ不定」の配列は無理って言ってんだよね。 でも「C言語」って自分で書いてるんだからrealloc()書こうよ。
12 :
ビル・ジョブス :2000/09/04(月) 00:18
>10 ば〜か、realloc()はライブラリ関数って言って、 Cの言語仕様じゃねーよ!APIとどう違うんだよ! 顔洗って出直しな!
13 :
8改めa3r :2000/09/04(月) 00:19
>11 まぁ、3年ならしょうがないよ。 俺なんか十年近くやってるしなぁ・・・ (といっても俺は1より年下だったりするんだけどね)
14 :
a3r :2000/09/04(月) 00:20
>12 おいおい、だったらAPIだって同じじゃん。 (ライブラリじゃないけど)
15 :
ビル・ジョブス :2000/09/04(月) 00:27
>14 おまえも分からんヤツだな! 言語仕様上できないから、こうでもしろ! って意味で書いたんだよ!
16 :
a3r :2000/09/04(月) 00:35
ところでその言語仕様はいつのだい?
17 :
名無しさん@お腹いっぱい。 :2000/09/04(月) 00:38
標準ライブラリは言語仕様だろ、つーか1はライブラリのこと わからなくて誰にも負けないって逝ってるのか? そんなオチだろうと思ったが。 さて、ライブラリが関係なくても答えられる4の質問は、どうよ>1
18 :
a3r :2000/09/04(月) 00:45
>16 ちょっと大人げなかったかな・・・ ビル・ジョブスごめんな。
19 :
ビル・ジョブス :2000/09/04(月) 00:48
>14 LocalReAlloc()はDLLに入ってるからライブラリだぞ! まぁそれ以前に、インポートライブラリをリンクしてる事も 知らんとみた。 >17 ばーか標準ライブラリは言語仕様じゃねーよ!K&Rでも読め! ”ポインタ定数”ってなんだ?絶対アドレスってこと?
悲惨な1スレの予感…
21 :
ビル・ジョブス :2000/09/04(月) 00:50
>18 おう!おまえの事忘れてたぜ!もちK&Rだろ!
22 :
a3r :2000/09/04(月) 01:05
K&R・・・ そりゃ話が通じないわけだ。 ANSI−C標準規格じゃ標準ライブラリは実装するように 明記されてるから、言語仕様と考えても間違いじゃないんだよね。 (じゃなきゃC99で追加されたbool@`true@`falseが使えない。 これは標準ライブラリヘッダに定義されてるからね。)
23 :
おれ :2000/09/04(月) 01:21
ポインタ定数と互換型。ってことでどうだ?
24 :
ビル・ジョブス :2000/09/04(月) 01:23
>22 ANSI-Cでは確かに実装するように明記されている。 しかし言語仕様であるとは明記されていない。 そもそも、周辺ライブラリはCPU依存する場合もあるのに、 何で言語仕様に成り得るんだ? 標準ライブラリがC言語仕様であると書いてある書籍は 見たことが無い。ちなみにコレコレのヘッダーファイルが 無いと動作しないコンパイラも見たことが無い。 VC++で1行のCプログラムを書いて統合環境下にはそのソース ファイル以外は何も組み込まれないのがその証拠だ。 付け加えて言うのであれば、実行時に必ず必要なランタイム ライブラリー自体は言語仕様ではない。言語仕様上それらの 動作が規定されているにすぎない。
25 :
a3r :2000/09/04(月) 01:33
>23 おれも同感。23に一票!
26 :
名無しさん@お腹へった :2000/09/04(月) 01:49
そういやC99ではプロトタイプ宣言必須になったんだっけ? (定義が先に出現してれば、それだけで良いのはもちろんだが) >コレコレのヘッダーファイルが無いと動作しないコンパイラも見たことが無い。 この甘えた言い抜けもそろそろ終わりだね。 まあ、MSのWindowsというOSローカルなAPI過ぎないものが 真っ先に出てくることと言い、 >VC++で1行のCプログラムを書いて統合環境下にはそのソース >ファイル以外は何も組み込まれないのがその証拠だ。 とある処理系の事情ごときに「証拠」とすがることと言い、 その状態で単に「C」を語るのは哀れみの涙を誘って止みませんな。 「MSローカルな」を付けて出直しなさい >「誰にも負けない」クン
27 :
ビル・ジョブス :2000/09/04(月) 01:53
>23 ワリーワリー!横でも同じスレ立ててるもんで... えっと、あ〜、LVALUEに成り得ないって事でいいか?
28 :
ビル・ジョブス :2000/09/04(月) 01:59
>26 答えになってませ〜ん! ちなみにおれが使ったことあるコンパイラは、 BDS-C80、LATTICE-C80/86、LSI-C80/86、 TURBO-C、OS-9のCコンパイラ、 UNIXのCC、LINUXのgcc、MS-C、VC、VC++。
標準ライブラリが言語仕様かどうかってどうでもいいけどさ、 配列の名前は代入できない左辺値だってC−FAQに書いてある んだが… どうよ。
細かい事だが、VC++、MS−Cが出て、その間のVCって?
31 :
ビル・ジョブス :2000/09/04(月) 02:07
そうだよ、LVALUEになれないよ!
32 :
a3r :2000/09/04(月) 02:08
>28 >UNIXのCC、LINUXのgcc、MS-C、VC、VC++。 あまり言いたくないんだが、LINUXのgccは無いだろ GNUの連中がまた怒るぞ。 「GNU/gccって言いなさい」ってさ。(藁
33 :
ビル・ジョブス :2000/09/04(月) 02:09
>30 VisualC Version1.0って製品があったんだよ! 1.5まであった。
MS−CはVer7からC/C++なんだよ。
だからLVALUEなんだよ。代入が出来ないだけで。
36 :
名無しさん@お腹いっぱい。 :2000/09/04(月) 02:14
constなポインタ定数って事でどうだい?
37 :
名無しさん@お腹いっぱい。 :2000/09/04(月) 02:19
ポインタリテラルっていう意見もあったな。
38 :
ビル・ジョブス :2000/09/04(月) 02:21
あった気がするんだけど... そんなことより、ガキども質問ねーのかよ? ねーならこっちは終わりにするぞ!
あんまり面白くなかったが、まぁいいや。 仕事中だし。
アホなビル・ジョブスに拍手!! −−−−−−−−−−−−−−−−−終了−−−−−−−−−−−−−−−−
41 :
ビル・ジョブス :2000/09/04(月) 02:27
>35 質問か? >36 言いたいことは分かるが、constは領域を持つものなので 間違い!オレはイヤだと言いたい。 >39 もうちっとやるか?
おわったスレ、ageんなや。
>42 ウルセーよこのおばかガキが!小便して寝ろよ! いきちがいなんだよ!
ちゃんとsageてるあたり、けっこうイイやつかも(藁
45 :
しつもん :2000/09/04(月) 10:10
再起版から、ループ版への移行はどのよーにやればいいのれすか? ・ハノイの塔 ・Qソート などなど・・
やい、ビル・ジョブス const な定数と const な変数の違いがわかってないだろ! クソして寝ろよ!
俺は、だいたい、朝起きてからクソするんだけどなあ。
寝てからクソするよろし。
クーソーしてから寝てください。(C)ナムコ
ビル・ジョブズさん、今日はおやすみ?
クソして寝たんじゃねーか?
惜しいキャラクターを寝かしてしまった・・・
かわりに、スティーヴ・ジョイ登場きぼっ
さぁ、#43以来の登場だ! どこからでもかかってこい! >46 おまえは#36か?だとして話を再開しよう! constな定数って、構造体のconst intメンバを定数によって初期化した場合? これは、君の言うところのconstな変数だよな? ちなみに、ちょっと実装依存した言い方ではあるが、配列名・定数を代入した 時はそれらは命令コードに含まれる。 定数にconstという記述はできない。処理のプロセスが違う。 おまえら、再レスするとき番号書け。誰がだれだかワカンネ〜。
55 :
ビル・ジョブス :2000/09/06(水) 19:39
ageるの忘れてたぜ!
56 :
名無しさん@お腹いっぱい。 :2000/09/07(木) 03:16
間違いを認めず屁理屈書いて逆切れするのって楽しいのか?
57 :
名無しさん@お腹いっぱい。 :2000/09/07(木) 03:38
読んでるぶんには楽しいですけどね(^^
ビル・ジョブズに限っては、彼のキャラクターのせいで楽しい。です。
59 :
ビル・ジョブス :2000/09/08(金) 02:02
>56 なに!オレがいつ間違えたって! LVALUEの件か?だったら、あえて言うがANSI-CでLVALUEは、 "Modifiable LVALUE"と定義されている。 要は、変更できないものはLVALUEになりえない。 なりえるのであれば、文法上正しく配列名がLVALUEになる式を 言ってみたまえ!
60 :
名無しさん@お腹いっぱい。 :2000/09/08(金) 02:36
やれやれ。そういうのをドツボというんだよ。ひとつ勉強になったね。 わざわざ「変更可能な左辺値」という言葉が出てくるのだから、 「変更不可能な左辺値」というものが存在するとは思わんかね? 例えばだな、&(アドレス演算子)のオペランドは関数指示子 または左辺値でなければならないというのは知っているかな? また「&配列名」が正しいというのは知っているかな? これにより、配列名は左辺値以外の何者でもないだろう。
61 :
ビル・ジョブス :2000/09/08(金) 02:58
>60 おばかは机上の空論にあぐらをかいて実務を知らん。 具体的に配列名のみが左辺にある式をかいてみたら? 実際に「&配列名」って、拡張子Cでコンパイルとおるか? 配列名はアドレスを持つので命令コードに含まれるから アドレスは求められません。
62 :
名無しさん@お腹いっぱい。 :2000/09/08(金) 04:19
能無しでも、実務はなんとかこなせるご時世におばかさんだねえ。 int array[ARRAY_SIZE]; assert(&array == array); は正しいCのコードだからちゃんとコンパイルできるよ。 >実際に「&配列名」って、拡張子Cでコンパイルとおるか? 恥かしい言い回しだね。 60じゃないけど、ほんと「やれやれ」だねえ。
63 :
名無しさん@お腹いっぱい。 :2000/09/08(金) 09:08
>61 左辺値って何だか知ってる? 代入演算子の左辺にくるものだけが左辺値ではないよ。
ビル・ジョブズくん、いつのまにK&R派からANSI派に?
65 :
名無しさん@お腹いっぱい。 :2000/09/08(金) 12:36
お人良しが多いな どうしてお前達はこんな奴に親切に正解を教えてやってるんだ? 正解教えてやっても屁理屈言うか逆切れするかだけで礼も何も 言わない奴だぞ。 こいつはもしも自分でも間違いだと気付いたとしても、絶対認めず 言い訳と逆切れする性格のキチガイだろ。後から何食わぬ顔で教えてもらっ た正解を最初から知ってたように語る厚顔無恥のキチガイだ こいう奴は放置するか騙して間違えたまま覚えさせておくのが 一番だと思うがどうよ?
ビル・ジョブズ様はえらい ビル・ジョブズ様のおっしゃられる事は全て正しい なにビル・ジョブズの言ってることはC言語の規格と 違うから間違ってる? 馬鹿!それはビル・ジョブズ様が間違ってるんじゃなくて C言語の仕様の方が間違ってるんだ! たったの3年でC言語の規格を越えてしまわれたビル・ ジョブズ様はC言語の天才だ
>>65 みんなバカぶりを指摘して、楽しんでるだけなんだがな
だったらageなきゃいいのに。
おっと、マジレスのふりをして、煽ってスレを盛り上げようという
高等戦術にひっかかっちまったか?
つーか、全然高等戦術じゃないな・・・
バカぶりを指摘するのは大いに結構だがマジの正解レスは 必要なのか?
つーかこのスレはビル・ジョブズは自分の為に作ったように 見えるんだが? ビル・ジョブズって馬鹿の癖して素直に人に教えを乞うことが できない曲がった性格をしていて、適当なことを書けば自分の 知りたいことを誰かが書いてくれるとでも思ってるんじゃないのか? だとしたら教えてやるのはバカぶりを笑うどころかビル・ジョブズの 思う壺だろう
71 :
ビル・ジョブス :2000/09/09(土) 00:17
配列名が代入不可能な左辺値であることは知っている。 しかし、配列名のみが有効な左辺値として動作するケース は無い。よって、左辺値でないと言っても過言ではない。 ちなみに、#62・#70はプログラムを辞めたほうが良いだろ! あんなコード書かれたら周りのヤツラの迷惑だからな! 「&配列名のみ」なんて使ってたらおーバカだよ。
72 :
プログラマ板には逝かないの? :2000/09/09(土) 00:39
>>ピル様
技術的な話しがほとんど出ないのは、1の発話をみんなネタとしか 見ていないからだ。その原因は当然1にある。 このスレ終了しようよ。
74 :
名無しさん@お腹いっぱい。 :2000/09/09(土) 01:39
ねービル、ちょっと質問。 TextOut(HDC@` int@` int@` LPCTSTR@` int)ってAPIあるっしょ? 一文字だけ描きたいとき char c = 'A'; TextOut(hdc@` x@` y@` &c@` 1); っていうのは、ビル的にはオッケー?それとも、 char s[1]; s[0] = 'A'; TextOut(hdc@` x@` y@` s@` 1); って書かなきゃだめ?
LPCTSTRへキャストすればどちらでもよしとする。 個人的には1文字だけなら前者がいいというか、 配列長1を使う理由が分からん、構造体の最後のメンバなら まだ分かる気もするけどな。 質問の意図が分からんのでサゲ。
76 :
名無しさん@お腹いっぱい。 :2000/09/09(土) 03:39
&cがLPCTSTRでないけども許せるかってことをきいてるんじゃないの?
77 :
名無しさん@お腹いっぱい。 :2000/09/09(土) 03:57
>75 てことはさあ、 foo (char (*)[N]@` int); こんな関数があるとするでしょ? そうすると、呼び出し側は当然、 char s[N]; foo (&s@` 1); となるわけだよね? char s[1][N]; foo (s@` 1); ではなくて。 「&配列名のみ」なんて使うのはおーバカなんだっけ?
78 :
名無しさん@お腹いっぱい。 :2000/09/09(土) 04:06
ビルジョブスさまはどのようなコンパイラをお使いなのでしょうか?
>76 char s[1];もLPCTSTRじゃないだろ! だからキャストしろって言ってんだよ! あ〜つまらん!
80 :
初心者ですけどいいですか? :2000/09/09(土) 04:48
今、自分は”独習C”で関数の再帰について 勉強しているんですが、 例えば次のような問題、 「再帰を使って文字列の長さを数える rstrlen()という関数をつくりなさい。」 が全くできないのです。 同じような問題がいくつもあるんですが、 お手上げです。 この種の問題を解く上でのちょっとした 考え方のコツとかヒントをいただければ幸いです。 ボンヤリした質問ですいません。
81 :
名無しさん@お腹いっぱい。 :2000/09/09(土) 05:53
>80 再帰を使って文字列の長さを数える? ハァ? なんで再帰? そりゃ問題が悪いわ。漏れがいい問題を出してやる。 「迷路脱出」だ。迷路を抜ける順路を示す奴な。 迷路のデータは自分で適当に作れ。一歩進むごとに自分自身を 呼び出す関数を使うんだ。十字路なら進み先が3つあるから 3回呼ぶ(ループでだぞ)。あとは自分で考えろ。
82 :
名無しさん@お腹いっぱい。 :2000/09/09(土) 06:49
>79 キャストする必要がどこにある?
int sub(char *str@`int len) { if(str[len] == 0x00){ return len ; }else{ return sub(&str[0]@`len+1) ; } } 再起を使う意味がわからん・・・ ちなみに上位ルーチンでは、こんな感じね long main(void) { char moji[適当] ; printf("文字入れろ⇒") ; gets(moji) ; printf("文字の長さは、%dで〜す\n"@`sub(moji@`0)) ; return 0L ; }
84 :
名無しさん@お腹いっぱい。 :2000/09/09(土) 08:59
>80 間違い。
85 :
C仙人 :2000/09/09(土) 10:44
>80 int rstrlen ( char *s ) { return ((*s)?(1+rstrlen(s+1)):(0)); }
86 :
>80 :2000/09/09(土) 10:53
数学的帰納法に慣れるとイイよ。 ポイントは2つ。 1)終端点の条件を考える。 rstrlen の場合は文字が '\0' なら rstelen()=0 だね。 2) f(x+1) を f(x) で表現する。 rstrlen の場合は rstrlen(x+1) = 1 + rstrlen(x) ※ちょっと引数xが変だけど、汲み取ってくれい。
int func(int a@`int b){ if(b>0){ return func(a+a@`--b); }else{ return a; } } 笑い。
間違いでした。ウフフ 正しくは int func(int a@`int b){ b--; if(b>0){ return a + func(a@`b); }else{ return a; } } でした。鬱だ氏脳
むしろこっちのほうが良いですか。笑い。 int func(int a@`int b){ if(b>0){ return a + func(a@`--b); }else{ return 0; } }
90 :
ビル・ジョブス :2000/09/09(土) 15:36
>80 こんなでどうだ! 考え方のヒントととしては、 結果を演算で求められるのか求められないのかの判断。演算で求められるので あれば、演算対象となる値を常に引き渡す必要がある。演算で求められずに、 カウントなどをその都度しなければならないのであれば、staticな変数を持つ しかないだろう。再帰ロジックは、結果の求め方から考えたほうが良い。 int rstrlen(char *org@` char *p) { return (*p ? rstrlen(org@` ++p): p - org); }
>>79 どーせUnicodeアプリなんか作れないだろうから、お前には関係ないこと
かも知れないけど、
char * をLPCTSTRになんかキャストした時点でアウトになる場合がある
ことも忘れるなよ。
92 :
名無しさん@お腹いっぱい。 :2000/09/09(土) 16:02
>90 全然だめだ。君には再帰のセンスはないな。 85のコードが正解だ。記述には品がないけどな。
>91 おぅ!そりゃ知ってるよ!おまえみたいなおバカなクソガキに 言われるまでもない。 ちなみに今は、CEがメインだからUnicodeオンリーだけどな!
こいつはすごいプログラムだねえ 何のための再帰だ?ぷぷぷ‥>90
95 :
初心者ですけどいいですか? :2000/09/10(日) 01:00
80です。たくさんのレスありがとうございます。 一応、”独習C”の模範解答載せときます。 int rstrlen(char *p) { if(*p) { p++; return 1+rstrlen(p); } else return 0; } ところで再帰とは関係ない話ですが、 この本の付属CDのソースを実際に 動かそうとすると、 コンパイル時にエラーが出たり、 動かしてもちょっとしたチョンボ があったりと、 なんかいまいち信用できないんですが、 こういうことって他の本や資料でも 起こるんでしょうか?
>95 常識化しています。
>94 ちょっと悔しいぞ!
98 :
少年Z :2000/09/11(月) 22:14
C++ から C の関数を呼ぶ時は extern "C" { …とかで宣言してやれば簡単に呼べますが 逆に C から C++ の関数を呼ぶ時は、どうすれば良いのでしょう? インスタンスのメンバ関数とかじゃなくて、単なる「関数」です。 VC++ でやってみたのですが、リンク時に未定義エラーが出てしまいます (T_T)
99 :
>98 :2000/09/11(月) 22:38
foo::foo()を呼びたいなら、c++のコードで extern "C" FooFoo(); FooFoo() {foo::foo();} とやってCのコードから FooFoo()をよんでやればいいのです。 応用力F #うちの会社の人間じゃないよね?
100 :
名無しさん@お腹いっぱい。 :2000/09/11(月) 22:48
>>98 それ、extern "C" を逆の意味で理解している。
C++では、コードをオブジェクトへ落とす際に、関数名をその引数の種類
数などで修飾して落としている。(ポリモフィズムを実現するため)
extern "C" は、そのC++での関数の修飾を禁止して、Cと同様の名前変換
(func()を _funcにするみたいな)でオブジェクトに落とすようにする。
そうすると、Cで記述されたプログラムから、C++で記述された関数を呼べ
るようになる。(リンカが関数名を見つけることが出来るようになる)
Cの関数から、コンパイラが吐き出す修飾名付きの関数名を使用して
C++のコードとリンクすることは、もしかすると可能かも知れないけど
(やったこと無い)関数名の修飾方法は、コンパイラ依存。しかもコンパ
イラのバージョンにすら依存する場合があるので現実的ではない。
結論:
C++の関数をextern "C" で宣言すると、Cから呼べる(リンクが出来る)
ようになるってこと。
ああ、書いているうちに、先を越されたか。
ごめんね、かぶっちゃった。
>>99
ビルさんヘ 参考までに、今までに読んだ本を教えてください。 僕もあなたのようなCウィザードになりたいので。
自分で名前マングリングをすればOK!!!たぶん・・・。
104 :
>103 :2000/09/12(火) 00:29
VC++とかは"?"で名前を含む名前を付けるのでぺけ。 「コンパイラ依存」が正しい
>102 はじめてのC 三田典玄の三部作
>102 ビルの読むような本はやめておけ。 ビルの様な寒い奴になっちまうぞ。
107 :
名無しさんの声 :2000/09/12(火) 02:58
エキスパートCプログラミングは、内容はいいけど翻訳者は氏ね!
>102 日経なんちゃらとか読んでおけばビル程度にはすぐなれるぞ。
109 :
C言語練習生 :2000/09/12(火) 04:04
int main() { int matrix[2][4]; matrix[2][4] = { {1@` 2@` 3@` 4}@` {10@` 20@` 30@` 40} }; return (0); } このプログラムがコンパイルできないのは何故なのですか?
ネタですか?
>109 そういう文法だから。 初期化と代入は違います。
112 :
109 :2000/09/12(火) 05:49
正確にはどのように記述すればよろしいのでしょうか?
int initmatrix[2][4] = { { hoge } }; memcpy( matrix@` initmatrix@` sizeof(matrix)); struct UserMatrix { int matrix[2][4]; UserMatrix( int matrix_[2][4]) { memcpy( matrix@` matrix_@` sizeof(matrix)); }; }; matrix( { { hoge } } );
びるちゃんのもは〜ん回答きぼっ
115 :
名無しさん@お腹いっぱい。 :2000/09/12(火) 07:11
おれならstaticでやるけど、そーゆーのはダメダメ?
116 :
少年Z :2000/09/12(火) 11:07
>>99 @`100
ありがとうございます。
無事リンクできました。
extern "C" の使い方を完全に誤解していたようです (^^;)>
117 :
名無しさんの声 :2000/09/13(水) 02:33
もう飽きちゃったのか、びるちゃん。
凹んでるんじゃないの?
119 :
ビル・ジョブス :2000/09/13(水) 05:49
回答してあげよう! 集合体の集合初期化は行えるが集合体への集合代入は行えない。 ちなみに、集合体の初期化は2種類あって、静的集合体の場合は その集合体のイメージどおりデータとして確保されるが、 動的集合体の場合はエリアの確保後コードで初期化する。 尚、0以外の初期値を持つ静的変数の初期値はプログラム として持っているため、スタートアップルーチンにて ブロック転送されている。 int main() { int matrix[2][4] = { {1@` 2@` 3@` 4}@` {10@` 20@` 30@` 40} }; return 0; }
120 :
>109 :2000/09/13(水) 05:49
int main() { int matrix[2][4] = { {1@` 2@` 3@` 4}@` {10@` 20@` 30@` 40} }; return (0); }
>119 ROMでない限り、ブロック転送なんかしないよ。
>>121 ローダーがやる? これも、広い意味ではブロック転送では?
123 :
名無しさん@お腹いっぱい。 :2000/09/14(木) 03:26
>122 テキストセクションと同様、ディスクイメージをそのまま 読み込んでいるだけだが、それをブロック転送と呼ぶ? 特に、最近(ここ十年ぐらいか?)のOSではマップしているので、 アクセスされるまで読み込まれないし。
124 :
名無しさん@お腹いっぱい。 :2000/09/14(木) 04:47
#define とか #ifdef はCの言語仕様にはいってますか? あと、べき乗をプリプロセッサにやらせたいんだけど むりですか? int a = 2^11; とかつい書いて、あとで見つけるのが大変でした。
125 :
>124 :2000/09/14(木) 05:13
>#define とか #ifdef はCの言語仕様にはいってますか? YES >べき乗をプリプロセッサにやらせたいんだけど 意味不明。定数式でべき乗を計算したいと言うことか? それなら、2の整数乗なら可能。 int a = 2^11; を int a = 1 << 11; とすべし。
126 :
名無しさん@お腹いっぱい。 :2000/09/14(木) 05:40
>>124 C++だと、テンプレートを使ってできたような気がします。
って、ちょっと違うか。できないような気もするし。
127 :
124 :2000/09/14(木) 05:44
>>#define とか #ifdef はCの言語仕様にはいってますか? > YES たんなるトランスレータだと思ってたんだけど、 ちがうんすね。 >>べき乗をプリプロセッサにやらせたいんだけど > 意味不明。定数式でべき乗を計算したいと言うことか? > それなら、2の整数乗なら可能。 > > int a = 2^11; を int a = 1 << 11; とすべし。 では 3のべき乗とか、5のべき乗とかは どう記述すればいいのでしょう? やっぱ電卓で計算すかね?
128 :
124 :2000/09/14(木) 05:52
>126 C++のテンプレートならできました。 階乗とかも作って1人で喜んでました。 ただ、C++のテンプレートをチャンとサポートしていない 開発環境とかだと、やっぱり頼れるのはマクロしかないわけで。 電卓で計算すりャいいだけなんですが。
129 :
名無しさん@お腹いっぱい。 :2000/09/14(木) 05:53
>127 単なるトランスレータだけど、言語仕様の一部。 べき乗は自分で組むか、実数演算でやる。 x^y なら、pow(x@` y)
130 :
名無しさん@お腹いっぱい。 :2000/09/14(木) 11:47
>>128 そりゃ、テンプレート使えば出来るだろうけど、
そういうテンプレートを常用している人が、Cのプログラムで
a = b ^ c //a@`b@`cはint もちろんbをc乗するつもり
とか書いておいて、「なんで計算が合わないんだろう……。」
って客先デバッグ中、3時間ぐらい悩んでいたのを見たことあり。
(当然XORになる……。)
演算子を全く別に意味で再定義するのは、止めといた方がいいと、
思うぞ……。
あまりにも悩んでいるので、他の会社の人だったのだがソースを
見て上げた。自分のソースでは多分やらない間違いなんだけど、
やっぱり人のソースで、堂々と a = b ^ c とか書いてあると、
「うんうん、何の間違いもないなあ。」などと思ってしまい、
気が付くのに5分ぐらいかかった……。(最初に触れた言語が
BASICなもんで。)
× 演算子を全く別に意味で ○ 演算子を全く別の意味で 要するに、百害あって一利無しってこと。 ^ をオペレータオーバロードした場合、XORはどうやって計算するの?
>>131 定義済みの型に対する演算子のオーバーロードは出来ないので、問題なし。
^ をC++で累乗の意味に使いたければ、実数クラスを作ってそこでオーバーロードすればよろしい。
第一、実数型のXORは、そもそも計算することが出来ない(はず)。
ほぼ、机上の空論にすぎないのでsage。
あ、誰も実数とは言ってないか。 まあ、どうでもいいや。机上の空論だし。
>>123 なるほど。まあ、ディスク読み込みをブロック転送というのは
無理がありますね。
マッピングについては、その通りです。
仮想記憶は便利ですね。(仕事は組み込みやってるので、無縁なのです)
>131 (a^b) の代用 ((~(a&b))&(a|b))
これでもいい ⇒ ((~a&b)|(a&~b))
137 :
>135@`136 :2000/09/17(日) 23:13
やはりこういうのは、コンパイラは最適化してくれるのだろうか…?
>137 悩むならコンパイラ様に任せるが吉です。 コンパイラ様の吐くコードに間違いはありません。
MSC Vr6.0の最適化はひどかったけどな。
勘違いしてるかもしれないが、オペレータオーバーロードをテンプレート関数を 使ってやるという話じゃないぞ。 もしかしたら、勘違いしてるのは俺の方かもしれないけどな。
141 :
>139 :2000/09/18(月) 15:26
MSC v6 って凄く古くない? 俺はMSC v8の頃、某ランド社のター某Cとコンパイルの比較をして やっぱOS作っているとこのほーがすげーやなんて思ったけ・・・
142 :
名無しさん@お腹いっぱい。 :2000/09/18(月) 15:39
>142 MSC V8??ってVC++2.0のことか?
143 :
139 :2000/09/18(月) 20:44
MSC/C++ Ver8はVC++1だ (ただしくは)MSC/C++ Ver6.0A 6〜7年まえだったか、最適化にバグがあってレジスタ変数をずいぶんこわしてくれたっけ。
144 :
名無しさん@お腹いっぱい。 :2000/09/19(火) 04:27
VC++ver1.xがコンパイラーのver8.0x MSC/C++ ver6.0Aなんてあったっけ?C++じゃなかったぞ
しちゅれいしました。MSC Ver6.0Aです。 ごめんなさい。
さらに、もしかしたらMSC Ver6.02Aだったかもしれません。
147 :
名無しさん@お腹いっぱい。 :2000/09/19(火) 11:49
>>やっぱOS作っているとこのほーがすげーやなんて思ったけ・・・ これは今でもそうなの? DelphiよりVC++の方が生成コードが“すげー”の?
元(Lattice)がよかっただけでしょう。
コンパイラのコード生成に、ターゲットOSを作っているかどうか、 なんて関係ないと思うがなあ。 リンカがOSに最適の実行ファイルを吐く(意味不明)とか、 スタートアップコードが秀逸!、ライブラリはやっぱりMSだね。 だったら分からない話でもないのだが。(……やっぱりわからん) じゃなくて、OSを作る「技術力」のある会社が作ったコンパイラは、 やっぱりすごいなあ、って話?
隠しAPIを知っているから。(藁
151 :
名無しさん@お腹いっぱい。 :2000/09/19(火) 14:00
>>148 Lattice C ってまだ使ってる人いるのかな。
懐かしすぎ。
153 :
syam :2000/09/22(金) 19:42
はじめまして。いきなりで厚かましいですけど、 「人喰いと宣教師」、「水瓶」のプログラムを教えて下さい。 なるべくすべて、無理だったらヒントだけでもお願いします。
155 :
名無しさん@お腹いっぱい。 :2000/09/22(金) 22:11
<ひとくいとせんきょーし しらみつぶしでも解にたどり着けるよ。
156 :
名無しさん@お腹いっぱい。 :2000/09/22(金) 23:02
>>148 全然良くねーよ。
Lattice Cって、ちょっと複雑なソースをコンパイルすると
コンパイラのくせにハングしやがるし、ラージメモリモデルは
今のヒュージのようにポインタを操作するたびに正規化しやが
ってメチャ遅だし、アセンブリ出力も出来なくて、アセンブリ
言語ソースはOMDという逆アセンブラを使ってオブジェクト
を逆アセンブルして見なきゃならなかったし、そのくせ日本じゃ
19万もしやがったし・・・。
MS-C V3が出たときは、その素晴らしさに涙が出たよ。
157 :
名無しさん@お腹いっぱい。 :2000/09/23(土) 01:28
158 :
名無しさん@お腹いっぱい。 :2000/09/23(土) 02:08
MSのCコンパイラ(VC++も含む)は、-Ox(最大限の最適化)かけると 余計な所まで最適化してバグらせる伝統があるな。 初めて触ったのがMS-C 5.10で、結構はまった。 ちなみに日本語版MS-Cは6.0A@` C/C++7.0A@` VC++1.0(8.0) 以下略で、 Quick C 2.0のengineは6.0A相当だったと思う。 今MS-C 5.10のcl.exe dumpしてみたらQuick C 1.01とか入ってた。 つーかいつまで持ってんだ俺。
159 :
名無しさん :2000/09/30(土) 01:04
int a[3][4] = { {1@`2@`3@`4}@` {5@`6@`7@`8}@` {9@`10@`11@`12} }@` int (*p)[4] = a; printf("%d\n"@` *(*p)); を実行すると、VC++では1が出力されるんですが、 Ultra-Cでは0が出力されます。なぜでしょうか。
160 :
名無しさん@お腹いっぱい。 :2000/09/30(土) 01:29
161 :
名無しさん@お腹いっぱい。 :2000/09/30(土) 04:43
gccを使っていますが stdio.h をインクルードしなくても、 printf関数が使えるのはどうしてでしょう
162 :
名無しさん@お腹いっぱい。 :2000/09/30(土) 05:01
>161 libcをリンクしているからです。 なぜ使えないと思ったのですか?
163 :
! 161 :2000/09/30(土) 06:16
>>162 C99では宣言がない関数を呼び出すとエラーになる。とか。:-)
それ以前にC99対応の処理系ってあるのかな?
「Cの仕様」では、入出力は定義されていない(含まれていない)と 本で読んだのですが、では、外部ライブラリのcの入出力関数は 何で書かれているのでしょうか? Cの仕様に含まれていないのにCで入出力関数を書けるのでしょうか?
165 :
名無しさん@お腹いっぱい。 :2000/10/01(日) 23:27
>>164 いまいち言っている事がよく分からないのだが、
仕様に含まれていないからCで書けない、ってのは話が違うぞ。
166 :
>164 :2000/10/01(日) 23:57
標準関数の実装方法も「Cの仕様に含まれていない」んだから C以外の言語(アセンブラとか)でライブラリ作ったっていいし 処理系依存のOSのシステムコールやらAPIやら呼んだっていいし 標準関数の仕様さえ満たせればやりたい放題でしょ? そのための標準関数なんだし。
>162@`163 Cの関数て前方参照じゃなかったっけ? 変数だけだったっけ?
<164 「Cはライブラリを使わないと何も出来ない」君をおもいだした、どうしてるだろう、彼…
www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.95.2/gcc_toc.html
170 :
共用体を :2000/10/02(月) 17:30
使う意味は主記憶のせつやくのためだけですか? あと、自己参照構造体が全然分かりませんが、どう解釈したらいいのでしょうか?
171 :
名無しさん@お腹いっぱい。 :2000/10/02(月) 18:02
ポインターが指している相手がたまたま同じ型になってるだけ。 自己参照という言葉はえらくコムズカシク響くね。
172 :
名無しさん@お腹いっぱい。 :2000/10/02(月) 19:34
ん?自己参照構造体って再帰的なデータ構造のことじゃないの?
>172 単なるリンクリスト。
/* 自己参照構造体 */ struct foo{ struct foo* next; };
175 :
中学生 :2000/10/03(火) 03:52
一般に言われているC++って TURBO C++ のことですか? また、どこで手に入れるんですか? 教えてください。宜しくお願いします
176 :
名無しさん@お腹いっぱい。 :2000/10/03(火) 04:19
>>175 そうだよ、TURBO C++。
パソコンショップに行って、おじちゃんにこれくださーいって言えば売ってもらえるよ。
あ、学生証はくれぐれも持参しないように。
できるだけ大人っぽい姿をしていこうね。舐められるから。
178 :
>175 :2000/10/03(火) 09:49
それって… 一般に言われてるPCって iMacのことですか? ってぐらいに不思議な質問だと思います…
179 :
中学生 :2000/10/04(水) 03:19
全然ネタじゃないですよ〜〜 全くの初心者なので・・・ ところで Borland C++ と Turbo C++ って 何がどう違うのですか?? どっちが一般的なのですか?? なるべく一般に普及してるやつを使いたいので(スーパー初心者だから) 他にも Borland C++ Suite や Borland C++ Builder など細かく分かれていてどれを買っていいのか分かりません。(泣) 一体、何が違ってこんなに細分化されているのでしょうか?? 教えてください。お願いします。
180 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 03:29
とりあえずBorland C++ Builder買っとけ。
181 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 10:53
>179 買える奴を買えば? 「一般的」なんて言っている時点で分不相応だ。 本当に学生(中学生?)なら学割で1万もしないだろ。
182 :
>179 :2000/10/04(水) 11:05
中学生でC++ならBorland C++ Builder でしょうね。 目的によってはC++より同じ会社のDelphiをお勧めします。 他にマイクロソフトのVisual C++というのもありますが、お勧めしません。 折角これを覚えても5年先には無意味になってるでしょうからね。 こんなものに貴重な成長期の時間を使ってしまうのは自分の将来の損失です
ぼくはVisual C++を進めるよ 寄らば大樹の陰ってね 5年先なんて誰にもわからんからね
185 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 12:30
>>179 ネタじゃなさそうだから、マジレスする。
Borland C++(以下BC++と略す)ってのは、Borland社が出したC++の開発環境。
で、Turbo C++はその廉価版。
BC++Suiteというのはよくわからんが、名前から察するにBC++の豪華版みたいなものだろうか。
で、Borland C++ Builder(以下BCBと略す)だが、これはBC++とは全くの別物だ。
今パソコンショップに行けば、多分BCBとあればBC++のともにバージョン5が売ってるのを見かけると思うが、
BCB5.0というのは大まかに言うとBC++10.0ぐらいに相当する。
従って、今更BC++を買う理由はあまりない。
そんなわけで、BCBを買うのをお勧めする。
あ、BCBにもいくつかのエディションがあると思うが、Professional版を買うといいだろう。
186 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 12:36
BC++にすれば、AFW使えるぞ、かっこいいぞ。 AFWはBCBにはついてないぞ。
187 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 12:38
Professional版は高いので、さいしょは安いので十分です。 すこし実力がついたと思ったら、そのあとで BC++なりBCBprofessionalなりVCなり選んで買いましょう そのころにはちゃんと違いがわかって買えます。
188 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 13:57
>>185 SuiteはBCC5.0、TurboDebuggerとかがパックになったやつです。
オンラインでしか購入できないです。
>>179 BCBなら体験版があったりするからそれで試してみては?
若いころはsymdebとLSI-C試食版で開発してたなあ って何時の話じゃ
190 :
あなたのうしろに名無しさんが・・・ :2000/10/04(水) 14:46
これコンパイルしても実行結果が悲しいのですが どこを訂正すればよいか教えて下さい。 πを計算させたいのですが。 #include<stdio.h> int main() { int counter; double PI; counter = 0; PI = 1; while(1){ PI -= (1 / (3 + 2 * counter)); if(counter == 15) break; } printf("π=%lf\n"@` PI * 4); return 0; }
191 :
>190 :2000/10/04(水) 14:57
数値に1.0 3.0 2.0のように小数点を付けるか 割算を(double)でさせるように型変換するかしてからね
192 :
>190 :2000/10/04(水) 15:00
counterが15になったら終わるように作ったみたいですが、 いつ15になりますか?また、それはなぜですか?
193 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 15:02
191は、やんなくても大丈夫なんじゃないか?
194 :
>193 :2000/10/04(水) 15:08
いや整数同士の割算は 整数DIV でされる から結果は常に0という事ね それ以外の問題は自分で解決出来そうに思うから ガンバレ
ねえ、もしかして数学板でπの計算の仕方聞いてた人?だったらあそこででた 式って冗談だってわかってなかったのでは?π/4=arctan(1)なんて とてつもなく収束遅いよ。。。(しかもプログラムも間違ってるし)。
196 :
>190 :2000/10/04(水) 15:23
197 :
193 :2000/10/04(水) 17:44
counterがdoubleだと思ってたよ。スマソ。
doubleで収束もヘッタクレもないような
πの計算だったら、モンテカルロ法で充分!
200 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 19:30
counterは10万は回したい
201 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 20:01
分かったら教えてくれ. rand()を使って擬似乱数を発生させると,当然SEEDはそれに伴って どんどん変わっていくよね. で,今現在のSEEDを知る方法ってないの?
202 :
漢太郎>201 :2000/10/04(水) 20:57
ソースを見てみたら? ソース通りだよ。 俺の知ってるのは、rand()で得た値が現在の種そのものになる奴
>俺の知ってるのは、rand()で得た値が現在の種そのものになる奴 ??? 例えば、100ってでてきたとすると、 次の数は100を種に生成されるの? なんかちがくない?ちゃんと一様乱数??
204 :
>203 :2000/10/05(木) 12:40
昔のはそんなのもあったよ。最近は改善されたのが多い。 同じ事して結果の上位ビットだけを渡すとか程度だけどね。 その場合はrandの結果は種の上位ワードって事ね。
205 :
>204 :2000/10/05(木) 13:26
longの乱数が欲しい場合は、自作?
206 :
201 :2000/10/05(木) 13:55
すいません,あんまりよくわかんないよー. ようは,複数の系列の乱数列がほしいんだ. 今現在のSEEDを保存して,またその系列の乱数が必要なときに srand()でSEEDをセットしてやれば,rand()だけで複数の乱数列 を提供することができるよね. 結局自作するしなかいのかなぁ.
207 :
名無しさん@お腹いっぱい。 :2000/10/05(木) 14:00
要は タネから1番目の乱数を作る方法と、n番目からん+1番目の 乱数を作る方法が同じかそうじゃないかの違いでしょ? なんらかの形で前回の乱数を使わないと、呼び出されるたびに次の乱数 を返す関数なんて、作れないんでないのかな?
208 :
名無し>206 :2000/10/05(木) 14:02
ややこしい事をするより、別の系列を作った方がいいですよ
randの中身はこれだけです
x=a*x+b; //a@`bが定数xが変数
return x ;あるいは return x
>>16 ;
良く使われるaの値でも3つくらいありますから Webで乱数で検索してみては?
209 :
おこぼれくん :2000/10/05(木) 20:18
memsetの使いかたがわかりません。 というか、使っていいことあるのでしょうか? ありがたみも教えてくださいです
210 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 01:40
構造体を0fillして0をデフォルトにするとラクチン スタック・配列を'X'fillしてどこまで壊れたか視認する
211 :
> ジョブズ様 :2000/10/06(金) 02:00
const char *hoge; は char が変更不可なんですよね? では、 char const *hoge; とか、 char * const hoge; ってのはどういった意味とか、使い道があるのですか?
212 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 02:58
char * const volatile hoge;の意味も教えてください。
試したら判るじゃない。それぞれ値とポイント先を変更してみてごらんよ それと char const * const hoge; もついでにね
char constとconst charはいっしょ。
212 の説明は?(藁
216 :
ななななし :2000/10/07(土) 02:47
double (*f[])(double) = {cos@`sin@`tan@`sqrt}; ってのが本に載っていました。 f[]にcos@`sin@`tan@`sqrtの関数ポインタが入ることはわかるんですけど、 どうしてこういう書き方ができるんですか?
217 :
名無しさん@お腹いっぱい。 :2000/10/07(土) 03:33
>212 volatileは、外部から値の変更がある場合などに 最適化による参照の省略をふせぐためにつけます。 これでわかるかな?
218 :
名無しさん@お腹いっぱい。 :2000/10/07(土) 03:35
>216 どうして?というのは何がききたいのでしょう? そのような言語仕様だから(文法だから)と こたえてほしいわけじゃないですよね‥
219 :
名無しさん@お腹いっぱい。 :2000/10/07(土) 20:33
localtime()について質問です #include<stdio.h> #include<time.h> main(void){ time_t t; struct tm *ptm; t = time( NULL ); ptm = localtime( &t ); } っていうコードがあるのですが、この場合、ptmがstruct tm型のポインタつーのはわかるのですが、 では、このポインタが指しているstruct tm型のデータはどこにあるのですか? localtime()を呼び出した時点で、自動的に確保されるのですか?
220 :
名無しさん@お腹いっぱい。 :2000/10/07(土) 20:42
>>219 YES。localtime()内部でね。
だからマルチスレッド非対応版runtime使うと怪しいことになる。
>220 どうもありがとうございます すっきりしました
222 :
名無しさん@お腹いっぱい。 :2000/10/08(日) 04:17
おぼえたてです、誰か暇だったらてんさくしてください #include <stdio.h> #include <stdlib.h> #include <conio.h> #define DEBAG 1 #define NOT 0 #define WHITE 1 #define BLACK 2 #define POKE 3 #define T_MAX 8 void main( void ); char scan( char * ); void clear( char (*)[T_MAX]@` char * ); void see( char (*)[T_MAX] ); void at_change( char * ); char count( char (*)[T_MAX]@` char *@` char *@` char * ); char input( char *@` char * ); char main_search( char (*)[T_MAX]@` char @` char@` char ); char search( char (*)[T_MAX]@` char@` char@` char@` char@` char@` char ); char pass_ch( char (*)[T_MAX]@` char ); char main_get_ch( char (*)[T_MAX]@` char@` char@` char ); char get_ch( char (*)[T_MAX]@` char@` char@` char@` char@` char@` char ); void osero_ai( char (*)[T_MAX]@` char *@` char *@` double@` char );ar );
223 :
名無しさん@お腹いっぱい。 :2000/10/08(日) 04:17
void main() { char til[ T_MAX ][ T_MAX ]; char at_counter; char white_n@` black_n@` not_n; char in_tate@` in_yoko; char ing; char chack; char com_at; char damy; for( ; ; ) { puts( "| 人間 vs 人間 ---------------------&gt; 0 |" ); puts( "| 人間[先手:白] vs 機械[後手:黒] ---&gt; 0より大きい数字 |" ); puts( "| 機械[先手:白] vs 人間[後手:黒] ---&gt; 0未満の数字 |" ); puts( "| 終了 -----------------------------&gt; それ以外 |" ); printf( ">>>" ); if( scan( &chack ) == 0 ) { puts( "終了します。" ); return; } else { if( !chack ) puts( "人間 vs 人間 を開始します。" ); else if( chack > 0 ) { com_at = BLACK; puts( "人間[先手:白] vs 機械[後手:黒] を開始します。" ); } else { com_at = WHITE; puts( "機械[先手:白] vs 人間[後手:黒] を開始します。" ); } } clear( til@` &at_counter ); &at_counter );
224 :
名無しさん@お腹いっぱい。 :2000/10/08(日) 04:17
for(ing = 1; ing; ) { see( til ); if( !pass_ch( til@` at_counter ) ) { if( at_counter == WHITE ) puts( "何も取れないので白はパスします。" ); else puts( "何も取れないので黒はパスします。" ); if( ing == 2 ) { puts( "両方とも何も取れないので終了します。" ); break; } at_change( &at_counter ); ing = 2; continue; } ing = 1; if( at_counter == WHITE ) puts( "白の番です。" ); else puts( "黒の番です。" ); if( chack && at_counter == com_at ) { while( 1 ) { printf( "機械の番です、Speseを押して下さい。>>>" ); scan( &damy ); if( damy == ' ' ) break; } osero_ai( til@` &in_tate@` &in_yoko@` (double)(white_n + black_n)@` com_at ); printf( "機械は[ %d@` %d ]と入力しました。\n"@` in_tate@` in_yoko ); } else { printf(" 縦、横、の順で数字を入力してください。強制終了 --&gt; [ -2@` -2 ]\n>>>" ); if( input( &in_tate@` &in_yoko ) == NULL ) { puts( "入力が不正です、始めからやり直して下さい。" ); continue; } } if( (in_tate == -1) && (in_yoko == -1) && DEBAG ) { puts( "パスします。" ); at_change( &at_counter ); continue; } if( (in_tate == -2) && (in_yoko == -2) ) { puts( "強制終了します。" ); break; } if( main_search( til@` at_counter@` in_tate@` in_yoko ) == NULL ) { puts( "間違った数字が入力されました、始めからやり直して下さい。" ); continue; } puts( "入力に成功しました。" ); switch( count( til@` &white_n@` &black_n@` &not_n ) ) { case WHITE: puts( "白が全滅しました。" ); ing = 0; break; case BLACK: puts( "黒が全滅しました。" ); ing = 0; break; case NOT: puts( "マスが全て埋まりました。" ); ing = 0; break; default: break; } printf( "白 ---&gt; %d 個\n" "黒 ---&gt; %d 個\n" "空き---&gt; %d 個\n"@` white_n@` black_n@` not_n ); at_change( &at_counter ); } if( white_n > black_n ) puts( "白の勝利です。" ); else if( white_n < black_n ) puts( "黒の勝利です。" ); else puts( "引き分けです。" ); } }else puts( "引き分けです。" ); }}
225 :
名無しさん@お腹いっぱい。 :2000/10/08(日) 04:18
char scan( char *put_in ) { char a@` b; b = 1; a = getch(); if( a == '-' ) { a = getch(); b = -1; } if( '0' <= a && a <= '9' ) { *put_in = b * atoi( &a ); printf( "%d"@` *put_in ); return 1; } *put_in = a; printf( "%c"@` *put_in ); return 0; } void clear( char (*til)[T_MAX]@` char *at_pointer ) { *at_pointer = WHITE; char *t_p = (char *)til; while( t_p <= *( til + (T_MAX - 1) ) + (T_MAX - 1) ) *( t_p++ ) = NOT; *(*(til + 3) + 3) = *(*(til + 4) + 4) = WHITE; *(*(til + 3) + 4) = *(*(til + 4) + 3) = BLACK; } void see( char (*til)[T_MAX] ) { char tate@` yoko; puts( " 0 1 2 3 4 5 6 7" ); for( tate = 0; tate < T_MAX; tate++ ) { printf( " %d"@` tate ); for( yoko = 0; yoko < T_MAX; yoko++ ) { switch( *(*(til + tate) + yoko) ) { case WHITE: printf( " 白" ); break; case BLACK: printf( " 黒" ); break; default: printf( " " ); break; } } puts( "\n" ); } } void at_change( char *at_pointer ) { *at_pointer = (*at_pointer)==(WHITE)?(BLACK):(WHITE); } char count( char (*til)[T_MAX]@` char *white@` char *black@` char *not ) { char *t_p = (char *)til; *white = *black = *not = 0; while( t_p <= *( til + (T_MAX - 1) ) + (T_MAX - 1) ) { switch( *( t_p++ ) ) { case WHITE: ( *white )++; break; case BLACK: ( *black )++; break; default: ( *not )++; break; } } if( *white == 0 ) return WHITE; else if( *black == 0 ) return BLACK; else if( *not == 0 ) return NOT; else return POKE; } 0 ) return NOT; else return POKE;}
226 :
名無しさん@お腹いっぱい。 :2000/10/08(日) 04:18
char input( char *in_tate@` char *in_yoko ) { if( scan( in_tate ) ) { if( scan( in_yoko ) ) return 1; } return NULL; } char main_search( char (*til)[T_MAX]@` char at_pointer@` char in_tate@` char in_yoko ) { char attak@` down; char tate_ch@` yoko_ch; char roop; char chack; attak = ( at_pointer == WHITE )?( WHITE ):( BLACK ); down = ( at_pointer == WHITE )?( BLACK ):( WHITE ); if( *(*(til + in_tate) + in_yoko) != NOT ) return NULL; chack = 0; for( roop = 0; roop < 8; roop++ ) { switch( roop ) { case 0: tate_ch = 1; yoko_ch = 0; break; case 1: tate_ch = 1; yoko_ch = 1; break; case 2: tate_ch = 1; yoko_ch = -1; break; case 3: tate_ch = -1; yoko_ch = 0; break; case 4: tate_ch = -1; yoko_ch = 1; break; case 5: tate_ch = -1; yoko_ch = -1; break; case 6: tate_ch = 0; yoko_ch = 1; break; case 7: tate_ch = 0; yoko_ch = -1; break; } chack += search( til@` attak@` down@` in_tate@` in_yoko@` tate_ch@` yoko_ch ); } if( chack ) return 1; else return NULL; } char search( char (*til)[T_MAX]@` char attak@` char down@` char in_tate@` char in_yoko@` char tate_ch@` char yoko_ch ) { char tate@` yoko@` tate_k@` yoko_k; char chack = 0; tate = in_tate; yoko = in_yoko; tate += tate_ch; yoko += yoko_ch; for( ; (tate >= 0) && (tate < T_MAX) && (yoko >= 0) && (yoko < T_MAX); tate += tate_ch@` yoko += yoko_ch) { if( *(*(til + tate) + yoko) == down ) chack = 1; else if( *(*(til + tate) + yoko) == attak ) { if( chack ) { tate_k = tate; yoko_k = yoko; chack = 2; } else return 0; } else return 0; if( chack == 2 ) break; } tate = in_tate; yoko = in_yoko; for( ; (tate >= 0) && (tate < T_MAX) && (yoko >= 0) && (yoko < T_MAX) && ( chack == 2 ); tate += tate_ch@` yoko += yoko_ch ) { *(*(til + tate) + yoko) = attak; if( (tate_k == tate) && ( yoko_k == yoko) ) return 1; } return 0; }tate) && ( yoko_k == yoko) ) return 1; } return 0;}
227 :
名無しさん@お腹いっぱい。 :2000/10/08(日) 04:19
char pass_ch( char (*til)[T_MAX]@` char at_pointer ) { char tate@` yoko; char ret = 0; for( tate = 0; tate < T_MAX; tate++ ) { for( yoko = 0; yoko < T_MAX; yoko++ ) ret += main_get_ch( til@` at_pointer@` tate@` yoko ); } return ret; } char main_get_ch( char (*til)[T_MAX]@` char at_pointer@` char ch_tate@` char ch_yoko ) { char attak@` down; char ret; char roop; char change_t@` change_y; attak = ( at_pointer == WHITE )?( WHITE ):( BLACK ); down = ( at_pointer == WHITE )?( BLACK ):( WHITE ); for( ret = 0@` roop = 0; roop < 8; roop++ ) { switch( roop ) { case 0: change_t = 1; change_y = 0; break; case 1: change_t = 1; change_y = 1; break; case 2: change_t = 1; change_y = -1; break; case 3: change_t = -1; change_y = 0; break; case 4: change_t = -1; change_y = 1; break; case 5: change_t = -1; change_y = -1; break; case 6: change_t = 0; change_y = 1; break; case 7: change_t = 0; change_y = -1; break; } ret += get_ch( til@` attak@` down@` ch_tate@` ch_yoko@` change_t@` change_y ); } return ret; } char get_ch( char (*til)[T_MAX]@` char attak@` char down@` char ch_tate@` char ch_yoko@` char change_t@` char change_y ) { char tate@` yoko; char count; tate = ch_tate; yoko = ch_yoko; if( *( *(til + tate) + yoko ) != NOT ) return 0; tate += change_t; yoko += change_y; for( count = 0; tate >= 0 && tate < T_MAX && yoko >= 0 && yoko < T_MAX ; tate += change_t@` yoko += change_y ) { if( *( *(til + tate) + yoko ) == down ) count++; else if( *( *(til + tate) + yoko ) == attak ) return count; else break; } return 0; } break; } return 0; }
228 :
最後です :2000/10/08(日) 04:20
void osero_ai( char (*til)[T_MAX]@` char *in_tate@` char *in_yoko@` double an_not@` char com_at ) { char tate@` yoko; double in_point = 0; double p_0 = 0.0; double p_1 = 1.0; double p_2 = 2.0; p_2 -= ( p_2 - p_1 ) * ( (an_not - 3.5) / 60.0 ); double p_3 = 3.0; p_3 -= ( p_3 - p_1 ) * ( (an_not - 3.5) / 60.0 ); double p_4 = 4.0; p_4 -= ( p_4 - p_1 ) * ( (an_not - 3.5) / 60.0 ); double p_5 = 5.0; p_5 -= ( p_5 - p_2 ) * ( (an_not - 3.5) / 60.0 ); double p_6 = 6.0; p_6 -= ( p_6 - p_2 ) * ( (an_not - 3.5) / 60.0 ); double p_7 = 7.0; p_7 -= ( p_7 - p_2 ) * ( (an_not - 3.5) / 60.0 ); double til_ai[T_MAX][T_MAX] = { /* 0 1 2 3 4 5 6 7 */ /* 0 */{ p_7@` p_4@` p_6@` p_5@` p_5@` p_6@` p_4@` p_7 }@` /* 1 */{ p_4@` p_1@` p_2@` p_2@` p_2@` p_2@` p_1@` p_4 }@` /* 2 */{ p_6@` p_2@` p_4@` p_3@` p_3@` p_4@` p_2@` p_6 }@` /* 3 */{ p_5@` p_2@` p_3@` p_0@` p_0@` p_3@` p_2@` p_5 }@` /* 4 */{ p_5@` p_2@` p_3@` p_0@` p_0@` p_3@` p_2@` p_5 }@` /* 5 */{ p_6@` p_2@` p_4@` p_3@` p_3@` p_4@` p_2@` p_6 }@` /* 6 */{ p_4@` p_1@` p_2@` p_2@` p_2@` p_2@` p_1@` p_4 }@` /* 7 */{ p_7@` p_4@` p_6@` p_5@` p_5@` p_6@` p_4@` p_7 } }; for( tate = 0; tate < T_MAX; tate++ ) { for( yoko = 0; yoko < T_MAX; yoko++ ) *( *(til_ai + tate) + yoko ) *= main_get_ch( til@` com_at@` tate@` yoko ); } for( tate = 0; tate < T_MAX; tate++ ) { for( yoko = 0; yoko < T_MAX; yoko++ ) { if( in_point < *( *(til_ai + tate) + yoko ) ) { in_point = *( *(til_ai + tate) + yoko ); *in_tate = tate; *in_yoko = yoko; } } } } yoko; } } }}
読む気も起きません。自慢したい気は分かるが、 もうちっと考えろ。
なんか、すごいですね(^^; 個人的には #define DEBUG て書いてほしいなぁ、、、>#define DEBAG 1 つーか、この出ファインつかってないのか
231 :
名無しさん@お腹いっぱい。 :2000/10/08(日) 19:14
debag -- v.t.《英俗》〈人の〉ズボンを(いたずらに)脱がす.
まわす?
233 :
名無しさん@お腹いっぱい。 :2000/10/09(月) 03:34
まったく読めないんですがどのレベルで上のプログラム書けるんですか? おぼえたてとか書いてるし..
234 :
プロ :2000/10/09(月) 05:49
この程度のプログラムはちゃんと学校なり師匠なりに習えば書ける。仕様があればね。 問題は仕様を自分で作れるかってこと。 先人たちが築いてきたアルゴリズムの山やら言語やらをいくら覚えたって自慢にならない。 自分で与えられた問題に対する仕様を作れるかが技術力ってもん。 言語マスターとかいう触れ込みで入社するも、自分でプログラムを作れんアホが大量にいる。 挙句に仕様がないとプログラム作れないとまで言う。 仕様を作れてこそプログラマ。 仕様を作れなきゃただのコーダ。 仕様を作れる人はどんな言語でもちゃんとプログラム考えれます。 まあ、言語のクセとかは経験だろうけど、そんなのは使い捨てのコーダにやらせればいいだけ。 かつてはCOBOLマスターとか言ってたヤツらが、結局使い捨てになってるのを見てるんで、たかだか言語が使える云々で吠えてるヤツを見ると可哀想になる。 マジレスすまん。
235 :
名無しさん@お腹いっぱい。 :2000/10/09(月) 06:27
234は完全体の厨房です。 異論反論おまちしております。
せめて関数についてのコメントはあったほうがいいな。 つうか完全体の厨房ってどんなよ。金髪になって逆立つのか?
ん?図星つかれて泣いてんのか? 234言ってる事は間違ってないじゃん。
>237 あまりにも当然のことをプロと自称して主張してるからだろ。 「間違ってないじゃん」とか恥ずかしい反応をするお前がイタイ。
「添削してください」でなく 「これこれは、よくわかんなくてとか、悩んだ結果とかで、 こうしてしまったけどももっとうまい方法ありますか?」 とか 「このへん工夫しましたがどうでしょうか?」 などと書いてれば少しは反応も違うだろうに‥ ここで反応してくれる人は、先生でも上司でもなくて ホント好意だけでやってるというのを理解しなさいや。
> 糞ソース どこかにUPしろよ。あれじゃ暇人すら見てくれないぞ。
それはスーパー厨房だ
>>236 完全体はツノが生えてうろこがついて顔がステキになる。
>顔がステキになる。 いいなぁ、それ・・・
確かに金髪よりいいなあ。
でもウロコとツノ生えてんだよな…。
確かにあのソースだと見る気が起きない。
最初から最後まで全部見て理解しないと添削できんのはちょっとなあ。
そうそう
>>239 のように目的とかどうしたいのかがわかるとまだ違うんだけどね。
244 :
名無しさん@お腹いっぱい。 :2000/10/09(月) 21:14
>241 素敵にドキュソ!
234は、発見は過去の蓄積の上にあることを知らない無垢な赤子である、という意味で 完全体の厨房であるといえよう。
246 :
206 :2000/10/12(木) 18:57
みなさん,先日はどうも.今なんとかやってます. また,分かる人がいたら教えて欲しいんだけど. 『345.323 234.456 … 545.675』中身がdouble型の数字1000個の,こんなファイルdata001.txtが 既に存在していて,これをプログラム中で使われている配列Kekka[1000]に 入れたいときはどうしたらいいんだろ. いままでは,プログラム中で計算して入れてたんだけど,入れる値はいつも 同じ値で,かつデータも上のファイル1万個分くらい算出しなきゃいけない ので,もう別ファイルに用意しておいたほうがいいかなって. 分かる人いて,教えてくれたら嬉しいな.
247 :
名無しさん@お腹いっぱい。 :2000/10/12(木) 19:18
>206 fgetsしてsscanf
248 :
携帯モナー :2000/10/12(木) 20:01
>>1 俺はC言語は13年前から使ってるよ。
じゃ、頑張ってね。(ワラ
249 :
名無しさん@お腹いっぱい。 :2000/10/12(木) 20:04
>>246 -247
fgets して atof というのもある。
fscanf で全部読むというのもある。
250 :
名無しさん@お腹いっぱい。 :2000/10/12(木) 20:23
以前体験してヒヤリとしたこと。 #include <stdio.h> main() { long a = -1L; unsigned long b = 1UL; if (a < b) puts("a < b"); else puts("a >= b"); return 0; } 実行すると a >= b と出てきた。
そういわれてみると、Lattice-C Ver2 からもう15年かぁ
252 :
名無しさん@お腹いっぱい。 :2000/10/18(水) 03:27
学生時代にDOSベースでやってたCをこの度GUIでやろうと思う。 覚えること多いけど手応えあって面白いねー。 でもC++もやりたいねー。 いや、そんだけー。
C++からCへソースコードを変換するトランスレータって知りませんか? これがあれば、Cの処理系実装しか無い環境でもC++を使えそうなんですけど。 ずいぶん前からネット上で探しているんですがなかなか見つからないです。 f2cやp2cとかは見つかるんだけどね〜。
正統派は今でもcfront
256 :
名無しさん@お腹いっぱい。 :2000/10/18(水) 23:29
cfrontって名前なんですか?>C++->Cトランスレータ なんか聞いたことある様な…GNU系のツールかな〜
257 :
名無しさん@お腹いっぱい。 :2000/10/18(水) 23:33
最近の標準化されたC++ってサポートできるんでしょうかね。>トランスレータ 例外とかテンプレートって無理っぽい気がするんですが…
258 :
名無しさん@お腹いっぱい。 :2000/10/18(水) 23:41
それ以前にどこから入手出来ますか? AT&TとかBellを探してみます。
259 :
258 :2000/10/18(水) 23:57
260 :
名無しさん@お腹いっぱい。 :2000/10/18(水) 23:58
AT&Tってことはお金取られちゃうのかも
261 :
名無しさん@お腹いっぱい。 :2000/10/19(木) 00:01
個人とかで実装した人っていないんですかね。 結構おもしろそうだけど。 そういえば富士通のワークステーションでC++->Cってやってた様な…
262 :
名無しさん :2000/10/19(木) 00:21
このプログラムの場合のEOFになるのはどのような場合なのでしょうか? 問題集にあった入力した文字列の数を数えるプログラムです。 int main() { int n; printf("文字を入力\n:"); n = Keynum(); printf("入力した文字の総数は%d\n"@` n); return (0); } int Keynum() { int ch@` counter = 0; while(((ch = getchar()) != EOF) && (ch != '\n')) counter++; return (counter); }
263 :
名無しさん@お腹いっぱい。 :2000/10/19(木) 00:27
>262 WindowsのコンソールならControl+Z(コントロールキーを押しながらZ) UNIX系ならControl+D で、EOFコード(0x1a or "\x1a" or '\x1a')が出力されます。
264 :
名無しさん@お腹いっぱい。 :2000/10/19(木) 00:40
にゅーりょくのりだいれくとがあったばやいはふぁいるのおわりでもEOFになるような‥
266 :
名無しさん@お腹いっぱい。 :2000/10/19(木) 01:27
OSって簡単に作れますか?一度自分で作ってみたいと思うんですが。
267 :
264 :2000/10/19(木) 01:35
違った… 構文解析関係のコードが入ってたから、似たようなツールなんだろうけど
>266 OSの定義によると思う。 まあ、最初は既存のOS上で動く仮想機械のOSとか作ってみれば? 仮想機械の方は、最近のエミュレータのソースとか参考になると思う。
269 :
名無しさん :2000/10/19(木) 05:37
VineLinuxでJavaを使いたいんですが使えるのでしょうか? 後C++もどうなんでしょうか。
1ってもういないの? 質問たまってるみたいだけど
271 :
名無しさん@お腹いっぱい。 :2000/10/19(木) 10:20
>>269 JBuilder 3.5日本語版も動きましたよ。(VineLinux2.0CR)
VineLinux2.0だとegcsが始めから入っていると思います。
これ、ネームスペースとかfor文での変数スコープも使えたと思います。
STLはSGIのやつかな。たぶん。
272 :
262 :2000/10/19(木) 10:50
>>263 なるほど。 ありがとうございます。
>>265 マウスでの操作をしたりキーボードを引っこ抜いて別のキーボードから入力した場合等の事ですか?
その場合にフリーズするのを防ぐ為の行でしょうか?
273 :
名無しさん@お腹いっぱい。 :2000/10/19(木) 11:51
フラグ、ビットのセット等が全く理解できないので教えて下さい。 参考書に通信ステータスフラグとして ERROR@`FRAMING_ERROR@`PARITY_ERROR@`CARRIER_ERROR@`CHANNEL_ERROR 等と書いてあったのですが、 上記のフラグはただの文字列ではなく、通信のエラーがあったときに プログラムが返す信号なのでしょうか? また、 const int ERROR = (1<<1); 等はどういう意味で、どんな場合に利用されるのか教えて下さい。
入出力のリダイレクトを知らんのか?
275 :
名無しさん@お腹いっぱい。 :2000/10/19(木) 17:12
>>273 待て待て、焦るな落ち着け。
取りあえず、前提条件を端折っていきなり質問するんじゃないよ。何を
聞きたいのか、さっぱりわからなくなるから。
と言うわけで、一体何に対して質問したいのかさっぱり判らんから回答
できん。
まずは、開発環境ぐらい書け。
276 :
名無しさん@お腹いっぱい。 :2000/10/19(木) 18:12
>>275 レスありがとうございます。
開発環境というより学習環境はLinuxのccです。
オライリーの参考書を読みながら勉強しているのですが
そもそもフラグとは何なのかを教えて下さい。
277 :
>276 :2000/10/19(木) 18:23
2進数とビット操作勉強すれ
278 :
名無しさん@お腹いっぱい。 :2000/10/19(木) 19:03
00000001が 00000010になるってこった
279 :
名無しさん@お腹いっぱい。 :2000/10/19(木) 19:03
つうか レベル低すぎ(`Д´)
ビルジョブスに任せて寝ようや
281 :
275 :2000/10/19(木) 19:35
>>276 すまん、まだちっともわからん。
そもそも、ERROR@` FRAMING_ERROR@` PARITY_ERRORというのはいったい
何というライブラリの何という関数を使うときに出てくるのかがさっぱり
わからん。
まあ、これらがフラグであるとして、フラグのセットやリセット、検査の
しかたぐらいなら説明できるが‥‥‥それでいいのか?
282 :
>273 :2000/10/19(木) 20:31
>FRAMING_ERROR@` PARITY_ERROR … シリアルIOのドライバだろうね。たぶん、定数か、ビットが立ってて それが組み合わさって返ってくるんだろうけど… シリアルIOと、bit操作のお勉強を分けて考えたほうがいいぞ。
283 :
初心者ですけどいいですか? :2000/10/20(金) 01:25
数値計算の行列の確保と計算のハナシです。 自分はx[0][j]とx[i][0]を捨てています。 計算する時不便という理由で。 そこで行列の有効利用のために オフセット処理(言い方合ってる?) を利用してx[0]→x[1](一次元の場合) とスライドさせる技があるのですが、 二次元でのやり方が判りません。 たしかnumerical recipes in c と言う本には書いてあったと思うの ですが、自分はなかなか借りられる環境に ありません。 よろしくおねがいします。
なんで計算するとき不便なのかわからん。 何が不便なの? スライドさせるやりかたってどういうテクニックなんですか?
285 :
初心者ですけどいいですか? :2000/10/20(金) 02:27
double b[5]@`*bb; bb=b-1; が一次元のやり方です。 >284 だって実際の行列では0行や0列 は使わないじゃないですか。
>283 numerical recipes in cなら工業系の図書館にならあると思います 借りれないなら、暇なときに図書館行って勉強するってのは?
>283 ふつー 基点は0のほうが自然だよ 位置差分が初めから1より0のほうが自然だっしょ 素直に0を基点にして考えたまい * x[1] => x[0] として考える int x[10][10]; x[0][0] ... x[9][9] でいいのでは。 BASIC みたいに基点を1にしたいなら何も考えずに 0 は捨てておいたほうが楽。メモリなんてあまるほどあるよ・・。
int Data[4][4]; int (*b)[4] = (int (*)[4])&(Data[-1][-1]); b[4][4] が Data[3][3]
>288 ありがとうございました。
Data[i-1][j-1]でいいやん。
int Data[5][5] ;でもええやん。
つーか、1オリジンにするだけのために、
>>288 みたいなコード書く
のは・・・(以下略)
ではいったいどうやって1オリジンになさいますか?>291
郷に入りては郷にしたがえっつうか。 少なくともCプログラマは配列のインデクスは0から始まるものと 想定するから、それに外れるようなコーディングは「邪悪」の 謗りをまぬがれんと思う。まあ自分一人しか見ないプログラムなら どうでも良いが.... perlの$[の運命を思い出せ。
>>292 291 が言いたいのは、1オリジンなんかにする必要は無いっつー事だろ。
295 :
名無しさん@お腹いっぱい。 :2000/10/21(土) 06:40
頭痛かったんです 皆様ポインタは楽勝ですか? #include <iostream> using namespace std; class samp { int a; public: samp( int n ) { a = n; } int get_a() { return a; } }; void main() { samp ob[ 4 ][ 2 ] = { 1@` 2@` 3@` 4@` 5@` 6@` 7@` 8 }; samp ( *p )[ 2 ]; for( p = ob; p < ob + 4; p++ ) cout << ( *p )->get_a() << " " << ( *p + 1 )->get_a() << " "; cout << "\n"; }
296 :
CプログラマC++って何? :2000/10/21(土) 06:53
297 :
名無しさん@お腹いっぱい。 :2000/10/21(土) 07:22
cout << ( *p )->get_a() << " " << ( *p + 1 )->get_a() << " "; はCでは printf( "%d %d "@` ( *p )->get_a()@` ( *p + 1 )->get_a() ); となります
ていうかポインタの演習用に無理矢理作ったようなコーディング で好きになれん。これだけではわざわざpを使う意味が無いし、 pでのアクセスも、下のように書いた方がよっぽど読みやすくて いいぞ。 for (int i = 0; i < 4; ++i) { cout << p[i][0].get_a() << " " << p[i][1].get_a() << " "; } cout << endl;
299 :
名無しさん :2000/10/21(土) 18:11
ビルジョブス 新しい伝説の幕開けですか?9/11で終わってますね。 回答者がいつのまにかお腹いっぱいさんになっていますが...
ビルジョブスが再登場するまでsage!
301 :
名無しさん@お腹いっぱい。 :2000/10/22(日) 00:22
c言語やJAVAは独学でも習得できますか?学校に行かなければ覚えられないということはありませんか?また、独習用のいい参考書(C言語)を教えてください。
302 :
名無しさん@お腹いっぱい。 :2000/10/22(日) 00:26
C言語なら「現実的なCプログラミング」と K&Rを全部読めば充分独学可能。
プログラム技術@2ch掲示板 ←タイトル お勉強ページへのリンクスレ ←その下 参考図書スレ#2 ←その下
C言語信者をC++言語使いに移行させるにはどうすればよいんですか?
308 :
名無しさん@お腹いっぱい。 :2000/10/24(火) 00:08
1からC言語をやる人にお勧めの本を教えてください
Cプログラマになるつもりなら 0からC言語をやると言いましょう
>307 漠迦に説教? そりゃ無駄だわ。
311 :
名無しさん@お腹いっぱい。 :2000/10/24(火) 02:44
>>308 ソフトバンクから出てる、林晴比古か柴田望洋あたりの本かなぁ。
林晴比古はマニアには評判悪いけど、初心者はいいって言う人多い。
312 :
名無しさん@お腹いっぱい。 :2000/10/24(火) 03:15
>>308 しつこいよーだがソフトバンクの「現実的なCプログラミング」が良い。
文法の説明にとどまらず、デバッグ・最適化、モジュール的プログラミング、
移植性、さらには設計・コーディング・テスト・リリースの一般的な開発サイクル
についても説明されていて、開発者としての一通りの知識が身に付く。
しかもとても読みやすい。
でもあんまりこういったところで紹介されないんだよね。何ででしょ。
314 :
名無しさん@お腹いっぱい。 :2000/10/24(火) 03:35
>>312 その本は、出版社が変わって「C実践プログラミング」という
タイトルになってます。
315 :
名無しさん@お腹いっぱい。 :2000/10/24(火) 10:34
typedef struct _FILETIME DWORD dwLowDateTime; DWORD dwHighDateTime; } FILETIME; っていう構造体があるんだけど、これを64ビット符号なし整数として 比較するにはどうやるのがスマート?
316 :
名無しさん@お腹いっぱい。 :2000/10/24(火) 11:17
>>315 単なる大小比較ならCompareFileTime使えばいいと思うんだけど、そういう話じゃなくて?
あと、環境はWin32でいいの?
>64ビット符号なし整数 これを32bitCPUでやっても全然スマートじゃないよ、 各要素を比較するかマクロでやるのが無難。 C99からは64bit整数をサポートするみたいだし VCは固有の64bit整数型をサポートしてる。 その場合無理矢理キャストすれば出来るんじゃない
318 :
315 :2000/10/24(火) 12:37
>316 あー、そっかー・・・ すっかり、ボケてました。それを使わせていただきます。 >317 知りませんでした、ちょっと残念です。 VCの64bitはLONGLONGって型でしたよね、たしか・・・
319 :
名無しさん@お腹いっぱい。 :2000/10/24(火) 13:08
>>315 こんなのはどう?
bool operator==(FILETIME& lhs@` FILETIME &rhs)
{
&nbsp;&nbsp;&nbsp;return !CompareFileTime(&lhs@` &rhs);
}
321 :
移植行き詰まり中 :2000/10/25(水) 18:51
PerlをC書いているのですが、プロセス番号の取得方法がわかりません。 どうすればよいのでしょう?FreeBSDとGCCです。
322 :
名無しさん@お腹いっぱい。 :2000/10/25(水) 19:39
pid_t getpid(void) 自分のプロセス番号 pid_t getppid(void) 親のプロセス番号
323 :
321 :2000/10/25(水) 20:10
>322 ありがとうございます、助かりました GET@@@系って全然覚えていませんので、出てきませんでした
>>320 あ、そうっすね、_int64ス、そっすそっす、スマンス、
でも、LONGLONGも使えなかったっけ?
DDKはLONGLONGなんだけどね。
325 :
名無しさん@お腹いっぱい。 :2000/10/25(水) 23:57
方程式:Xの2乗 - Yの2乗 = 1 の解を探すプログラムを組んだんですけど x = 15@`y = 4238172という滅茶苦茶な解答を返してきます。 どこがまずいか教えて下さい。 #include<stdio.h> int main() { int x@` y@` answerx[30]@` answery[30]@` i; i = 0; for(y = 1; y != 1000; y++){ for(x = 1; (x * x) <= (1 + (1999 * y * y)); x++){ if((x * x) == (1 + (1999 * y * y))){ answerx[i] = x; answery[i] = y; i++; } } } for(i = 0; answerx[i] != '\0'; i++){ printf("%dst answer is (%d@`%d)@`"@` i@` answerx[i]@` answery[i]); } printf("\n"); return (0); }
326 :
名無しさん@お腹いっぱい :2000/10/26(木) 01:00
>>325 その1: Xの2乗 - Yの2乗 = 1 を満たす整数X、Yは多分存在しない
その2: for(i = 0; answerx[i] != '\0'; i++) int型のanswerxに'\0'はおかしい(使えないことも無いが)
その3: 初期化されてないローカル変数(answerx[30]@` answery[30])の中身はゴミなので'\0'は無理
その4: 解を求める始めのループで i で数を調べたのに次のループで i をループ用変数として再利用は非効率的
その5: とりあえず見にくい!
327 :
名無しさん@お腹いっぱい。 :2000/10/26(木) 03:25
328 :
名無しさん@お腹いっぱい。 :2000/10/26(木) 04:36
typedef float Vector[4]; で Vector Add(const Vector a@` const Vector b); って書けないのが納得いきません。 引数は良くて返り値がダメなんて・・・ 僕はどうすれば良いのでしょうか?
>>328 引数はスタック経由、返り値はレジスタ経由だから。
引数はポインタになりさがるけど、戻り値はそうならないから。
レジスタに入りきれない構造体を返す場合もあるので>329
そもそも配列の代入ができないから戻り値にできたとしても使えん。 C++ にして vector<float> 使え。
どうしてもCで書きたいなら、配列丸ごと構造体の中にいれて typedefしろ。
334 :
ダイアモンド :2000/10/26(木) 17:45
for文などのiをintで取るのと、short intで取るのでは、 なんか違うんでしょうか? または、iが255以内だったら、charでもいい? ぼく的には、intよりshort intの方が早くて、 なおかつcharの方がもっと早いんじゃないかと、 思ってますけど、違いますか?
そんくらい、まず自分で試してみなさい。 それぞれコードを書いて、実行速度を計測するだけだ。簡単じゃろ? ちなみに charには255は代入できないぞ。-128〜127だな。
336 :
名無しさん@お腹いっぱい。 :2000/10/26(木) 18:04
>355 >ちなみに charには255は代入できないぞ。-128〜127だな。 ↑ダウト char が signed char か unsigned char かは処理系依存 さらしあげ
337 :
ダイアモンド :2000/10/26(木) 18:34
調べてみたよ。 unsigned long: 5.66s unsigned short: 6.76s unsigned char: 6.76s longの方が早かったよ。なんで? (コードを見ろ!!ってレスがつくかな・・) プログラムは、こんなん↓。 ///////////////////////////////////////////////////////// unsigned char i@`j ;←ここの型をかえてみた。 long x@`y ; clock_t start@` finish; double duration; start = clock(); for(i = 0;i < 250;i ++) for(j = 0;j < 250;j ++) for(x = 0;x < 10000;x ++) y ++ ; finish = clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC; CString Str ; Str.Format("%2.5f s"@`duration) ; AfxMessageBox(Str) ; /////////////////////////////////////////////////////////
338 :
ダイアモンド :2000/10/26(木) 18:46
00407C64 mov word ptr [ebp-14h]@`offset CMainFrame::OnDebug2+48h (00407c68) 00407C6A jmp CMainFrame::OnDebug2+58h (00407c78) 00407C6C mov ax@`word ptr [ebp-14h] 00407C70 add ax@`offset CMainFrame::OnDebug2+52h (00407c72) 00407C74 mov word ptr [ebp-14h]@`ax 00407C78 mov ecx@`dword ptr [ebp-14h] 00407C7B and ecx@`0FFFFh 00407C81 cmp ecx@`0FAh 00407C87 jge CMainFrame::OnDebug2+0B6h (00407cd6) 00407C89 mov word ptr [ebp-18h]@`offset CMainFrame::OnDebug2+6Dh (00407c8d) 00407C8F jmp CMainFrame::OnDebug2+7Dh (00407c9d) 00407C91 mov dx@`word ptr [ebp-18h] 00407C95 add dx@`1 00407C99 mov word ptr [ebp-18h]@`dx 00407C9D mov eax@`dword ptr [ebp-18h] 00407CA0 and eax@`0FFFFh 00407CA5 cmp eax@`0FAh 00407CAA jge CMainFrame::OnDebug2+0B4h (00407cd4) 00407CAC mov dword ptr [ebp-1Ch]@`0 00407CB3 jmp CMainFrame::OnDebug2+9Eh (00407cbe) 00407CB5 mov ecx@`dword ptr [ebp-1Ch] 00407CB8 add ecx@`1 00407CBB mov dword ptr [ebp-1Ch]@`ecx 00407CBE cmp dword ptr [ebp-1Ch]@`2710h 00407CC5 jge CMainFrame::OnDebug2+0B2h (00407cd2) 00407CC7 mov edx@`dword ptr [ebp-20h] 00407CCA add edx@`1 00407CCD mov dword ptr [ebp-20h]@`edx 00407CD0 jmp CMainFrame::OnDebug2+95h (00407cb5) 00407CD2 jmp CMainFrame::OnDebug2+71h (00407c91) 00407CD4 jmp CMainFrame::OnDebug2+4Ch (00407c6c) コード見たら、shortの場合、andして比較してるね。 だから、shortの方が遅いんだね。。。じゃーね。>ALL
339 :
名無しさん@お腹いっぱい。 :2000/10/26(木) 18:52
>ぼく的には、intよりshort intの方が早くて、 >なおかつcharの方がもっと早いんじゃないかと、 >思ってますけど、違いますか? この問題はCPUに依存します 32bitCPUの場合、shortより、longの方が速くなる可能性があります 16bitCPUの場合、longより、shortの方が速くなる可能性があります
340 :
C++レモン :2000/10/26(木) 19:15
リスト構造って、はじめの構造体へのポインタを保存しておいて データを構造体の変数に入れるごとに その構造体に必要なメモリを確保して入れて、f最初の構造体へのアドレスを参照してforでインクリメントして次々に構造体を読み込んで最後の構造体がNULLに等しかったら処理を抜けるというプログラムのことですか?
>char が signed char か unsigned char かは処理系依存 恥。ご指摘感謝。鬱だ氏脳。
342 :
名無しさん@お腹いっぱい。 :2000/10/26(木) 19:35
>>340 何言ってるのかわからん。
従って、理解できてるのかそうでないのかもよくわからん。
取りあえず、本でも読み返せ。
>340 forで何をインクリメントするつもりですか? 少なくとも「リスト構造」は「プログラム」ではなく 「データの形」(←変な日本語だな‥)のほうなのですが‥
344 :
Age17(♀) :2000/10/26(木) 19:49
UNICODEからMBCSへ変換するにはどうすればいいんですか? また、逆の変換も教えてください。 VC6を使っています。
346 :
C++レモン :2000/10/26(木) 21:42
ということは 構造体の中に構造体へのポインタが入っている構造体をリスト構造というのだという解釈でいいですか?
347 :
C++レモン :2000/10/26(木) 21:56
もうひとつ聞きたいのですが、コンソールアプリケーションで、 ビルドしたファイルが150KBもあるのですが。なぜたった5〜6行のソースコードで150KBにもなるのでしょう。 不思議で仕方ありません。これならVBを使ったほうが容量的に7倍くらいマシです。
狭義にはおおむねその解釈でよいと思います。 構造体(struct)そのものではなく、そのような構造の概念をそう呼びます。 広義には、ポインタなどを含まなくても、表のように一覧性のあるものを すべてリストということもあります。そういった意味では配列もリストの 一種です。
環境も処理系も書いていないのでなんとも言えませんね。 必要ないライブラリをリンクしているのかもしれませんが‥ 5〜6行ということなら、そのままアップしてみてはいかが?
350 :
白紙 :2000/10/26(木) 22:10
>>347 コマンドライン解釈のためのルーチンがくっつくんでしょ?
それにそこで使われているライブラリーもね。
嫌だったら、リンカーのマニュアル読むべし!
351 :
C++レモン :2000/10/26(木) 22:14
失礼しました。VC++6.0 ProとWIN98SEです。 ちなみにソースコードです(CGI)。 #include <stdio.h> void main(){ int a=1; printf("Content-type :text \n\n%d"@`a); } 空のプロジェクトを作成してからC/C++ソースファイルを追加しました。
>これならVBを使ったほうが容量的に7倍くらいマシです。 VBはDLLが要るんですけど・・
あと、デバッグ情報がたくさん入ってるんじゃない?
354 :
名無しさん@お腹いっぱい。 :2000/10/26(木) 22:58
>353 俺もなんかそんな気がしてきた これだからVB上がりはウゼエ(苦笑)
355 :
名無しさん@お腹いっぱい。 :2000/10/26(木) 23:36
あんだコラ354。C系低級プログラマーの分際でイッチョマエな口きくんじゃねえよ。 貴様の理解できることは猿でも理解できるんだからあんま調子にのるなよ。
356 :
名無しさん@お腹いっぱい。 :2000/10/27(金) 02:29
>>351 メニューの「ビルド」-「アクティブな構成の設定」で「win32 Release」を選択しろ。
357 :
C++レモン :2000/10/27(金) 02:40
できました。21KBになりました。ありがとうございました。
ありがとねっ!
>>350 少なくとも俺の汁限りではデフォルトではSETARG.OBJはリンクされない
ぞ。
VC++5だと、この程度なら-MDで4KB程度のEXEモジュールになった
と思うが、VC++6だと生成されるEXEモジュールのサイズが大きくなった
ように思う。つうか要するにDLLとリンクしろ。デフォルトでは
MSVCRT.DLL使ってくれんのよ。
360 :
名無しさん@お腹いっぱい。 :2000/10/27(金) 22:01
int ****hege; ポインタのポインタヘのポインタヘのポインタです。どう言えばいいのかわからないしどういうときに使えばいいの?
361 :
pianoman :2000/10/27(金) 22:07
破棄する時に嫌がらせで使います。
362 :
360 :2000/10/27(金) 22:09
破棄?ってなに?開発を放棄するときに最後っ屁をかますってこと?
363 :
pianoman :2000/10/27(金) 22:15
>360 これはマジで聞いてるの?
364 :
360 :2000/10/27(金) 22:18
そう。本に書いてあったんだけど、何だコレは?と思った。何なの?
365 :
pianoman :2000/10/27(金) 22:37
>364 う〜ん。 まず、ポインタのポインタは理解していると仮定して。 制御の場合、ホスト、クライアント、別タスクなどが同期 している時に共有のメモリの割り当てとかで使ったりする。 けど、意識して使うことはないなあ。 実際使う時はポインタで見るし。 空間系のソースでは、関数の戻り値で****とかはたま〜にある。 けど、こんなセメントプログラムは俺は自分で最初から作り直す。
初心者には教えてはいけないことになっているので秘密です。
367 :
360 :2000/10/27(金) 22:46
ということは、使ったり理解する必要は必ずしも無いっていうことだね。 よかった。ありがとう。
368 :
pianoman :2000/10/27(金) 22:55
>360 あらら、ちょっと違うよ〜。 意識しないっていうのは、変数の取り込みとかでの話し。 理解してないとこういうのはあとで自分が困るし。 >366 まあ、そう言わないでね。 秘密といえば、上級者ぶってる人ほど、ソースを見せたがらない。 で、急にバグを出して無理矢理残業に付きあわされる..とほほ
369 :
360 :2000/10/28(土) 12:17
やっぱり理解できないとたかが知れるか。 もっと勉強しないと駄目だな。
370 :
名無しさん@お腹いっぱい。 :2000/10/28(土) 15:04
すみません ここの話題とは関係なさそうなのですが 詳しい方が居そうなので 書きこませてもらいます。 windowsでごみ箱から完全に消してしまったファイルを元に戻すには どうしたら良いのでしょう。 良心的な方教えて下さい。
>>370 ほんとに関係ないぞ
まず適切な板を探す能力を身につけるべし
方法は知っているが、ここでは教えない
372 :
名無しさん@お腹いっぱい。 :2000/10/28(土) 15:24
>371 失礼しました。 今他の所を探してます。
373 :
>370 :2000/10/28(土) 15:30
つーか、そのパソコン使い続けてると、 本当に消滅する確率がどんどん高くなるぞ。 すみやかに電源を切りなさい。
374 :
名無しさん@お腹いっぱい。 :2000/10/28(土) 15:48
>373 ファイルは自分で消してしまっただけで 特に消滅はしていませんが、どう言う事でしょう?
>>370 ノートンなんとかっていうツールを使ってください。
goto 371
377 :
質問 :2000/10/28(土) 20:43
この板でよく聞く「ライブラリ」って、DLLのことですか?それとも拡張子LIBのファイルのことですか? あと、ライブラリというのは何に使うのでしょうか。
378 :
storm :2000/10/28(土) 20:53
ホームページをつぶすツールを教えてください。
379 :
おねぇさん@出張 :2000/10/28(土) 20:56
>>377 > この板でよく聞く「ライブラリ」って、DLLのことですか?それとも拡張子LIBのファイルのことですか?
それら全てライブラリです。あと、MFCやVCLのクラスライブラリなんかも、
単にライブラリっていったりします。
> あと、ライブラリというのは何に使うのでしょうか。
手抜き、実装の隠蔽、コードの共有化、モジュール化などのために
使われます。
でも、おねぇさんはまだレベルが低いので、
間違っているかもしれません。
380 :
pianoman :2000/10/28(土) 21:04
>377さんが学習を初めたばかりと仮定して。 ライブラリ:インクルードファイルで読み込んでるやつのこと。 DLL:VBとCを関連づけるもの(ちょっと違うけどイメージ的に)。 >378 おっかないなあ。
381 :
質問 :2000/10/28(土) 21:25
わかりました。 ところで、C言語でウインドウ作れるんですか?C++にはあるみたいですけど。
382 :
pianoman :2000/10/28(土) 21:32
>380 作れますよ。 ただ通常は別参照が多い。
383 :
質問 :2000/10/28(土) 22:58
知らなかった。MS−DOSプロンプトで動くのしか作れないのかと思ってました。 ところで別参照って何ですか?
なんか微妙に適当なことを吹き込まれているな…
>>380 はぁ?
インクルードファイルとライブラリは別物。
ライブラリにはスタティックリンクライブラリとダイナミックリンクライブラリとあって、実行モジュールと結合してしまうのがスタティックリンクライブラリ。
ダイナミックリンクライブラリは実行モジュールとは結合せずに実行時に結合する。
>>385 それだとなんか「なにっ、実行したら.exeと.dllが1つの.exeになって
しまったあ!?」というのを思い浮かべてしまうな(w
ダイナミックリンク時の結合ちゅうのは、あくまでメモリ上で結合される
だけす。
387 :
名無しさん@お腹いっぱい。 :2000/10/29(日) 04:18
何か違うぞ。
>>377 ここで言うライブラリというのは、おそらく大抵の場合は何らかのクラスライブラリ
か関数ライブラリのこと。
DLLかLIBファイルかどうかは多分話の本質に関係ない。
>>pianoman
おまえは人に教える前に自分が勉強しろ!
どいつもこいつも・・・
>387 あら、366で初心者には内緒って言ってるんで、そういうことになってるもんだと。 マジなのか、ふざけるのかどっちかに統一してもらいたいんだけど。
391 :
名無しさん@お腹いっぱい。 :2000/10/29(日) 23:59
つーかどこがVISUALなんだVC++。視覚的なC++。
VISUAL C++ ってのは、見た目がC++って訳すんだよ。
見た目だけなのか
ビジュアル系のバンドと同じさ、 顔だけよくて、中身は???
395 :
名無しさん@お腹いっぱい。 :2000/10/30(月) 19:06
セマフォってどれぐらい狭いんですか?
396 :
名無しさん@お腹いっぱい。 :2000/10/30(月) 19:18
>>395 素粒子4個ぐらい。
注意:右スピンと左スピンに限る。
>395
並んでいるプロセス君の間に割り込めないぐらい狭い
UnixとWindowsでは狭さが違い、
Windowsならば
>>396 が言っているくらい
Unix系は知らない
大変よくわかりました。
わかんね〜
俺も分かんね〜。 セマフォって排他処理に使う奴じゃなかったけ? よく分からん。
401 :
名無しさん@お腹いっぱい。 :2000/10/31(火) 18:58
長ド級初心者の質問で申し訳ないけど教えてください。 外部変数を定義したいんですけど、 undefined reference to `p_rc'ってでます。 global.cってとこに定義してglobal.hでextern double〜ってやって main.cでヘッダファイルをインクルードしてますけどこれではダメですか?
402 :
>401 :2000/10/31(火) 19:59
良いと思います。 上記のメッセージはコンパイルで発生したのでしょうか? それともリンクで発生したのでしょうか? global.cで定義した変数型と、global.hで宣言した変数型 p_rcは一致しているでしょうか?
403 :
名無しさん@お腹いっぱい。 :2000/10/31(火) 20:06
>402 お返事ありがとうございます。 メッセージはリンクで発生しました。 global.cでもglobal.hでもp_rcの変数型はdoubleです。
404 :
名無しさん@お腹いっぱい。 :2000/10/31(火) 20:10
>>403 static で修飾してたりとかしてません?(んなわけないか)
いずれにせよ、その部分のソースを載っけたほうが話が早いと思う。
リンクで発生したんだから、単にglobal.objを指定してないだけじゃねーの。
406 :
名無しさん@お腹いっぱい。 :2000/10/31(火) 20:21
405でいっている通りです 実行ファイルを作成する際にはglobal.cとmain.cを指定すれば うまくいきます。
407 :
名無しさん@お腹いっぱい。 :2000/10/31(火) 20:24
global.c(抜粋) double f_rc; double p_rc;/*renshow()用制御変数@`rc発火頻度@`発火パルス間隔*/ double r_time; double d_time;/*renshow()用制御変数@`ipsp発火開始@`終了時刻*/ double rc_os_time;/*renshow()用制御変数@`rc発火時刻*/ = global.h(抜粋) extern double r_time; extern double d_time; extern double f_rc; extern double p_rc; extern double rc_os_time; = 関数 #include <stdio.h> #include "header.h" #include "const.h" #include "global.h" int renshow(double time){ int rc_count; double t_time; double g=21.9; if(time==0.0){ rc_count=0; rc_os_time=0.0; } else{ if(alphamn_os[tmp_time]==1){・・・ = で、mainの中でこの関数を使います。 こんな感じです。
408 :
401=403=407 :2000/10/31(火) 20:25
長くなってすいません。
bcc32 main.c global.c でコンパイル&リンクできました。
>408 406で解決しませんか?
おそかった。スマソ
412 :
401=403=407 :2000/10/31(火) 20:53
これまでにも数個の外部変数を設定してコンパイルなどをしてきたんですが これまではうまくいってたんです。 今回、初めてこうしたエラーが出て戸惑っています。 renshow.cは以前からあるものでこれまでもコンパイルとリンクは出来ていたので その点は大丈夫だと思うのですが.
413 :
401=403=407 :2000/10/31(火) 21:02
renshow.c:55: undefined reference to `f_rc' renshow.o:renshow.c:56: more undefined references to `f_rc' follow メッセージの中に上記の二つが出ているのですが、 違いは何でしょうか。
414 :
401=403=407 :2000/10/31(火) 21:30
いろいろ手を尽くした結果、 何故かは解りませんがうまくいきました。 いろいろご助言を下さった皆さんありがとうございます。
>>414 まあ・・・あと言うとしたら、
・グローバル変数の識別子の頭には、uniqなprefixを付けよう。
せめてmy_project_〜とか。その命名規則だと、そのうち
標準ライブラリの識別子と衝突したりして痛い目を見ると思われ。
・Makefileとmakeを使おう
ファイルが2個以上になった永続的なソースのコンパイルは
makeを使おう。どれかのオブジェクトが古いバージョンだった
ために、謎のバグと勘違いして痛い目を見ると思われ。
416 :
名無しさん@お腹いっぱい。 :2000/11/03(金) 02:09
n@`mの二つの整数を繰り返し入力してn/mの値を100桁まで正確に求めるには どんなプログラムを組めばいいんですか?教えて下さい。
417 :
名無しさん@お腹いっぱい。 :2000/11/03(金) 02:13
>>416 多倍長整数を使って有理数計算をやればいいんじゃないのか?
418 :
名無しさん@お腹いっぱい。 :2000/11/03(金) 02:15
>>416 整数部分はそのまま計算。
小数以下は初めに n%m を求め、
あとは100桁になるまで keta[i]=(n*10)/m; n=(n*10)%m;
を繰り返す。
419 :
名無しさん@お腹いっぱい。 :2000/11/03(金) 02:31
420 :
名無しさん@お腹いっぱい。 :2000/11/03(金) 02:49
>417,418,419 どうもありがとうございました。参考にしてプログラムを組んでみます。 またわからなくなったら来ると思うので、その時も宜しくお願いします。
421 :
名無しさん@お腹いっぱい。 :2000/11/07(火) 14:05
!i (iはint型)の定義は、ANSIでは i ? 0 : 1; だと思いますが、ANSIでないCでもそういうふうに なっているのでしょうか? i@` jがともに0か、またはともに0以外であることを判断するのに if (!i == !j) { ... } と書きたいのですが、フリーウェアにするプログラムなので、 色んな環境で動くようにしたいのです。 だれか知ってたら教えてください.
422 :
>421 :2000/11/07(火) 14:40
普通に書けばいいじゃん if( ( i==0 && j==0 ) || ( i!=0 && j!=0 ) ) { ... }
「ANSIでないC」ということならなにを期待してはいけない。 Cらしいけど、Cでないいかもしれない。
>ANSIでないCでもそういうふうになっているのでしょうか? ・ANSIでないCはprintfが無いこともある(組み込み系) ・ANSIでないCはfree(NULL)をするとコアダンプすることがある (昔のコンパイラだが忘れた) ANSI準拠であればいいんでない? # それとも上記のものにも対応する?
425 :
こんな書き方ってできたっけ? :2000/11/07(火) 15:41
( i eor j )
426 :
421 :2000/11/07(火) 16:40
>>422 ループの中で何度も呼び出していて、速度が求められる部分なんです。
>>423 @`424
なるほど、ANSIでないCというのは非常に幅広い範囲があるのですね。
現役でまともに使われているUNIXマシンの99%に対応できればいいと
思っています。目安としてはSunOS4.1.3とか、5@`6年前のDECのマシン
あたりまででしょうか。SunOS4.1.3のccで大丈夫なことは確認
しています。
427 :
>426 :2000/11/07(火) 18:25
!演算子の返す値が信用できないなら、こう書く手はある。 if((0==i)==(0==j)){‥ ==演算子を返す値を信用するかどうかはキミ次第だ‥
428 :
名無しさん@お腹いっぱい。 :2000/11/07(火) 18:26
s/==演算子を/==演算子の/
429 :
名無しさん@お腹いっぱい。 :2000/11/07(火) 22:18
>>426 >ループの中で何度も呼び出していて、速度が求められる部分なんです。
ホントに? プロファイルとってみた?
430 :
名無しさん@お腹いっぱい。 :2000/11/07(火) 23:01
>426 そんなことを言い始めたらループ本体にif文があること自体がすでに問題では?
431 :
421 :2000/11/07(火) 23:07
>>427 飴ちゃん2個。
>>429 すみません、よく見たら速度が求められる部分ではありませんでした。(^^;
ただ、if (!f(a) == !f(b)) { ... }
のように関数の返り値を使っているため、
>>422 のようにするには
関数の返り値をさらに一時変数に入れないといけないのでちょっと
美しくないんですよね。たぶん大丈夫だと思うのでこのまま
行くことにします。;)
432 :
ミトコンドリ子 :2000/11/08(水) 01:23
>>431 アタシは
if ( (f(a)?1:0) == (f(b)?1:0) ) { ... } って書いてるわ。ご参考まで。
>421 あせえんぶらで書け。
>433 ポータビリティを考えろ。
>434 ぽーたびりてぃがこの場合重要なのかぁ?
436 :
> :2000/11/08(水) 05:17
421がそうしたいといってるんだからそうしたいんだろ?
! が a ? 0 : 1 でない環境なんて異常なんだから 切り捨てちゃえ。切り捨て御免(藁)
438 :
名無しさん@お腹いっぱい。 :2000/11/08(水) 06:53
↓本の例題見ながらこれ書いたんですが、実行して、ちゃんと数字を タイプすれば問題ないんですが、アルファベットとかを入れると暴走 します。これを避けるにはどうしたらいいんでしょう。 #include <iostream.h> #include <math.h> void main( ) { const float pi = (float) 3.14159; float radius = 0.0; float height = 0.0; float volume = 0.0; float maxvol = 0.0; while (radius != -1){ cout << "Enter the radius: "; cin >> radius; if (radius == -1){break;} cout << "Enter the height: "; cin >> height; volume = pi * pow(radius@`2) * height; if (maxvol < volume){maxvol = volume;} cout << "The volume is " << volume <<endl; } cout << "The dimension of the sylinders with the maxmum volume was " << maxvol <<endl; }
439 :
名無しのエリー :2000/11/08(水) 07:06
>>438 1.アルファベットは入力しない。
2.文字列で受け取って数値かどうかチェックする。
やり方は教えない。
学校逝ってくるよ〜ん。
一旦バッファに入れ、アルファベットなら捨てる
442 :
教えて君 :2000/11/08(水) 20:47
このスレのタイトルに甘えて質問させてもらいます。 私は、超ー初心者です・・・、細部に渡り教えていただきたいです。 では、いきます。 参考書を買ってそれのRoMのコンパイルをインストールしましたが それをMSDOSに知らせなければならないとあります。 Autoexec.batのメモ帳にpath********** とかけとありますが、これはメモ帳ー開く(すべてのファイル)−Autoexec.bat としてそこにPAHT********と書き込んで上書き保存でよろしいのですか?(再起動)
443 :
>442 :2000/11/08(水) 20:54
あなたの場合は、まず、PC初心者板かも。
444 :
標準CPPで .h を付けるのは古いぞ勧告会 :2000/11/08(水) 20:57
#include <iostream> #include <string> #include <cstdlib> using namespace std; int main(){ int num; string strOfNumber; cin >> strOfNumber; num = atoi(strOfNumber.c_str()); if(num != 0){ // 変換できないときは atoi() から 0 が返る。 cout << "This is safe number : " << num << endl; }else{ cout << "This is not number : " << strOfNumber << endl; } }
445 :
名無しさん@お腹いっぱい。 :2000/11/08(水) 20:59
コンパイラが例えば、c:\comp以下にインストールされたなら、それまでの内容 PATH=c:\xxxx;c:\yyyy を PATH=c:\comp;c:\xxxx;c:\yyyy のようにすれば良いはずです。
446 :
名無しさん@お腹いっぱい。 :2000/11/08(水) 21:00
445は、442のレすです。 443の言っていることは正しい。
447 :
421 :2000/11/08(水) 21:01
>>432 なるほど!!そのままANSIの定義通りに書けばよかったんですね!
頭いいなあ。どうもありがとうございます。
448 :
名無しさん@お腹いっぱい。 :2000/11/08(水) 21:17
421です。調子に乗ってもう一つ質問させて下さい。 a = f(i); if (a) b = a; というのを一時変数aを使わずに記述できないでしょうか? b = f(i) || b; だと0/1になってしまいます(perlだと期待通りに動く)。
多分、期待した記述ではないだろうが... (2回関数を呼び出してしまう為) if(f(i)) b = f(i);
450 :
>448 :2000/11/08(水) 21:34
気休めに register int a; とかやっとけば。 たいていのコンパイラはaを最適化してくれると思うけど。
451 :
名無しさん@お腹いっぱい。 :2000/11/08(水) 22:56
>>448 話しがずれるけどaじゃなくてtmpあたりにしといてね。
452 :
名無しさん@お腹いっぱい。 :2000/11/08(水) 23:07
はじめまして、以下の疑問を誰か教えて頂けないでしょうか。 int *p; <hogehoge...> if (p != NULL) <hogehoge...>; というソースですが、なんで if (p) <hogehoge>; としないのでしょうか。NULLが0にバインドされていない処理系がある からだ、というのを聞いたことがあるのですか、そんな処理系ホントに あるんでしょうか。if (p) ...; の方がシンプル&直感的でいいと 思うのですが。
453 :
名無しのエリー :2000/11/09(木) 00:09
>>452 Cの場合は常に NULL==0 だと思いますけど。
Javaとかだと NULL(null) は特殊変数?として扱われます。
Javaだと if(p != null) って書かないと正常に動かないはずです。
454 :
名無しさん@お腹いっぱい。 :2000/11/09(木) 01:03
>シンプル&直感的 ひとによって感じ方は違うからな。 >NULL==0 これはけっして「NULLのビットは全部0」を意味しないことにちういせよ(だれにいう?)
455 :
名無しさん@お腹いっぱい。 :2000/11/09(木) 01:12
0という定数は「ビット全部が0の整数値」を意味するとは限らないことにちういせよ。(藁
456 :
444 :2000/11/09(木) 01:31
レスくれた皆さんどうもありがとうございます。 atoiですね。初めて見ました。これから調べることにします。
457 :
名無しさん@お腹いっぱい。 :2000/11/09(木) 02:18
>>452 宗教問題みたいなもんだし、あまり気にしない方がいいんじゃない。
俺も0派。 if (p) を p が真、つまり有効か無効かと読むとわかりやすいので。
俺のソースには NULL はでてこない。変数がポインタの場合0は
自動的に 0→偽→無効→NULL(ビット全部が 0 の整数値に非ず) に変換されて
読めるんだけど、NULL 派のひとにはわかりづらいでしょうね。
昔は使ってたんだけど、if (!a) って書き方はあまり使わなくなった。
if (a) なら真か偽か簡単なんだけど、 ! は反転させるからちょっと考える。
極力考えなくて済むように変わってきたのかもしれない。
>>454 -455
全ビット0だろ?
DWORD値の0として扱われるんじゃないの?
あ、ANSI ならポインタ p が NULL のとき p==0 が真になるよん。cfaq 参照。
>>458 ちょっとちゃう。NULL が全ビット0の整数値の処理系はいいけど
そうでない処理系でも成立するように、比較、代入のときは
0 を NULL(という概念) にしてるっす。
461 :
優しい名無しさん :2000/11/09(木) 07:33
462 :
名無しさん@お腹いっぱい。 :2000/11/09(木) 11:58
>460 0が全ビット0でない処理系って例えばどんなのでしょうか。 また、"0 を NULL(という概念) にする"というのは、 "0を偽という概念にする"と拡大解釈してもよろしいのでしょうか。 (つまり、ポインタの話だけでないということ)
463 :
名無しさん@お腹いっぱい。 :2000/11/09(木) 12:52
464 :
名無しさん@お腹いっぱい。 :2000/11/09(木) 15:54
>>462 一昔前のLispChipを使ったマシンでは0は全ビット0じゃない
しかし今では意味は無いだろうな、きっと
465 :
名無しさん@お腹いっぱい。 :2000/11/09(木) 18:21
466 :
名無しさん@お腹いっぱい。 :2000/11/09(木) 18:53
(概念的には)定数0はint型の0からvoid *型のヌルポインタへ暗黙の型変換が行われるのである。 つーかK&R 2ndのリファレンスマニュアル読め。書いてあるぞ。
>>466 それだと定数0がいつでもヌルポインタに変換されてしまいそうな
誤解が生じそうだ。
初期化・代入・比較をするときに左辺/右辺の
どちらかにポインター型の変数か式が現れた場合のみ
> 定数0はint型の0からヌルポインタへ
> 暗黙の型変換が行われるのである。
468 :
名無しさん@お腹いっぱい。 :2000/11/09(木) 19:25
個人的には、ヌルポインタの値って、ゼロ以外が良いんですけどね。 (実装レベルの話ね)
469 :
>468 :2000/11/09(木) 19:57
なんで?
470 :
名無しさん@お腹いっぱい。 :2000/11/09(木) 21:24
NULLをナルと読むときもあるんですか? 前読んだパールの本ではナル文字とかいてありました。
成瀬川NULL
世界NULLほどハウマッチ
NULLシスト
アNULL
ファイNULLファンタジー
477 :
452 :2000/11/10(金) 04:17
ポインタとしての0が整数値の0と違うの初めて知りました。 まだまだ修行足りないようです。結論として、 C言語だけの話だとNULLが0以外にバインドされてない処理系があるというのは 大嘘で、NULLはかならず0である。 しかし注意しなければならないのは、ポインタ型として解釈された0は 整数値の0とは違う特別な定数であり、処理系によっては全ビット0以外の 値をとり得る。(これがしばしばNULLが0以外の場合があるという誤解を生んでいる) だがNULLが0(実際の値に関係なく)であることには変わりないので、 if (p) ...; と if (p != NULL) ...; は完全に同じであり、 その良し悪しは単にポリシーの問題である。 ということですね。 皆様ありがとうございました。
478 :
名無しさん@お腹いっぱい。 :2000/11/10(金) 08:51
「(NULL==0)が成り立つ」を「NULLは0である」とかいうから誤解を生じるのよ。 NULLが0なんじゃなくて、0はポインタと比較されるときにNULLに変換されるつー 事なんだから。
479 :
468 :2000/11/10(金) 12:26
>>469 実装でヌルポインターのある辺りって(ゼロ番地)、結構重要なデータとかある場所だったりしない?
480 :
>479 :2000/11/10(金) 14:06
ゼロ番地あたりってUNIXは書き込みできなくないか? 書き込めてしまうMS-DOSとかはご愁傷さまだが...
482 :
477 :2000/11/10(金) 17:43
> 478 465さんによるC-faqの 5.4: に"マクロNULLは0として定義されている。"と あります。よって「マクロの」NULLは0であると言って良いと思います。 そして、その0はポインタと比較されると「実際のヌルポインタ」に変換される。 (その値は全ビット0とは限らない) これでよろしいでしょうか。
483 :
吾輩は名無しさんである :2000/11/10(金) 17:53
484 :
465 :2000/11/10(金) 18:18
485 :
465 :2000/11/10(金) 18:18
あう、だぶってしまった‥‥‥ スマソ。
NULLマクロとnull pointer constantとnull pointerは区別 しようぜ。 178がNULLと表記しているものは実はNULLマクロではなく null pointerの意味だな。
488 :
名無しさん@お腹いっぱい。 :2000/11/10(金) 19:05
C言語って何ですか?
B言語の次の言語です
>471 おお、こんな便利なサイトが。どうも。
>>488 子どもがそんな猥褻な言葉使っちゃダメ!
母より。
492 :
477 :2000/11/11(土) 02:58
>483 拝見しました。これは、「実際のヌルポインタ」の値が 処理系によって不定である、ということですよね。 私の書いたNULLとは「マクロ」のつもりでしたので(477も私です)、 間違っていませんよね? しつこくてすいません。 (サイトを教えてくださってありがとうございました。勉強します。)
493 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 03:12
MAKEの使い方教えろや。
VisualC++ 持ってるんですけど、 いまいち使い方がわからないんです。 MAKEを理解すれば、 VisualC++の使い方の 理解の助けとなるでしょうか?
495 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 05:47
>>493 =494
makeが知りたいんであれば、本も色々ありますが、
タダという点で、LSI-C試食番のマニュアルが意外に参考になるかもしれません(藁
実装も、かなりまともなmakeだし。しかもソース付き(だっけ?)
#VisualC++のIDE環境を使うのであれば、makeは必要無いです。
#コマンドラインの方が楽だと思うのならmakeを覚えることをお勧めします。
gmakeで我慢しろや!
497 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 13:53
gccを使っていて、 ターゲットアークテキチャがmipsというクロスコンパイル環境の話です。 他のアークテキチャでは不明です。 メモリ管理機構が無い環境で、 プログラムを動的ロードする仕掛けを作ろうと思ったのですが・・ gccでリロケータブルオブジェクトを吐かせる-fpicオプションがありますよね? main関数のコードに適応すると、 出来あがったアセンブラコードに得体の知れないgccmainという関数があって、 なぜか絶対ジャンプで飛んでしまうのです。 main関数を使わなければ済む話ですが、 しかし、このgccmainとは一体なんなのでしょう・・・? なぜ絶対ジャンプするのでしょうか? どなたかご存知の方はいらっしゃいませんか?
おお、ここにもLSIC試食版でmakeを覚えた同志が
499 :
名無しさん :2000/11/11(土) 16:13
初心者です。 プロトタイプについての質問です。 文字列をあらわす関数をxyz(j)としたときなぜ次のプログラムは間違いなんですか? char j[80]; int i; char xyz(j); int main(void) { printf("文字列を入力してください: "); gets(j); char xyz(j); return 0; } char xyz(j) { for(i=0;i<=strlen(j)-1; i++) printf("%c"@` j[i]); }
本読めよ。 宣言と呼出を混同するな。 宣言・定義部でパラメータの型をつけろ。
501 :
499 :2000/11/11(土) 16:22
一番上はこうです。 #include<stdio.h> #include<string.h> プロトタイプわけわからんよ、まじ。 おしえてー!!!
502 :
499 :2000/11/11(土) 16:24
>500 だからそんなこといわれてもわけわからんって
503 :
名無しさんi486 :2000/11/11(土) 16:55
1@`2@`3...じゃなくて001@`002@`003...みたいな数字を書くときって どーするの? 手でやるしかない? sprintfで%使って出来ない?
504 :
Visual名無しさん :2000/11/11(土) 17:02
>503 sprintf(str@`"%03d"@`num); とか。ANSIじゃないかも。 >499 構造そのまんまで正しく書くならこうだ。 違いは自分で考えろ。 char j[80]; int i; void xyz(); int main(void) { printf("文字列を入力してください: "); gets(j); xyz(); return 0; } void xyz() { for(i=0;i<=strlen(j)-1; i++) printf("%c"@` j[i]); }
505 :
名無しさんi486 :2000/11/11(土) 17:06
#include <stdio.h> void xyz(char*); int main(void) { char j[256]; printf("文字列を入力してください: "); gets(j); xyz(j); return 0; } void xyz(char* p) { while(*p != '\0') { putchar(*p++); } }
コイツがわかってないのは「戻り値」と「パラメータ」と見た。 いいから入門書読め。
508 :
499 :2000/11/11(土) 17:31
文字列jをあらわす関数がxyz(j)としたときの話を聞きたいです。 何度もすみません
週末になると、自分の頭を使わない奴がボコボコ現れる。 この板のお約束になってしまいましたねぇ。
>>509 このスレッドで聞くだけまだまし。
糞スレッドを立てるやつはなにものなんだ?
「初心者です。教えてください」
スレッド立てる勇気がすごい。
2ちゃんねるでスレッド作れるが、検索できないってなんなの?
511 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 17:51
1を含めここはリアル厨房の集まりだな
お、煽り始めたぞ!?
513 :
497 :2000/11/11(土) 17:56
>>497 一瞬で流されてしまった・・・・
main以外では大丈夫という事は、そもそもmain関数はリロケートできないんでしょうか?
動的にロードできる予定のリロケータブルオブジェクトは
別にmainにあたる(常に同じ名前の)関数を作る約束にしたほうがよいのでしょうか?
たとえばOS-9とかsx-windowとか、MMUが無くても動くマルチタスクOSでは
一体どうやってたのでしょうか?
sxではmainを使ってなかったとは聞きますが・・・?
すみません。どなたか・・・
「課題の提出期限が来週なんですぅ」ってか。
開発が一段落ついて、ATAデバイスを評価ボードへ増設するために 作りかけのOSを取出したら 動的ロードを組まなければならなくなって壁にぶち当たったんです。 本当ならmainを使って組めればcの教科書通りに組む事ができるのに、 なぜ他の関数名を使わなければいけないのか、という点が問題なのです。 他力本願で申し訳ありませんが私の読解力では gccの何処に条件があるのか見つけられないのです。
516 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 19:08
>499 こうだろ #include<stdio.h> #include<string.h> char j[80]; int i; void xyz(j); int main(void) { printf("文字列を入力してください: "); gets(j); xyz(j); return 0; } void xyz(j) { for(i=0;i<=strlen(j)-1; i++) printf("%c"@` j[i]); return j; }
517 :
名無しさんi486 :2000/11/11(土) 19:20
>516 オイオイ
518 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 19:25
>516 こいつもわかってない。 xyz(j)は無理やり使いたいのか・・ なぜそんなめんどいことを。 課題か?
519 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 19:35
そんくらい自分でやれ
変数が全部グローバルだなんて、プロトタイプ以前の問題。 あ、だから悩むのか。引数なんて考えてないんだろうね。
521 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 19:59
>520 激しく同意。
これ解れ ゴルァ C なんて久々だから突っ込まれるかもしれんぞ ゴルァ /* FUNCTION という名前の関数の定義。 「定義」はプログラム内でこれを使うことを示すだけで内容は別に指定しなければならない。 char 型のアドレスと int 型の数値を引数として与える。 そして値は返さない(void)関数であることを示す。 */ void FUNCTION(char *@` int); /* FUNCTION という名前の関数の内容。 char 型配列のアドレス値を p に受け取り(char *p)、 int 型の数値を n に受け取る(int n)。 この2つの引数はこの関数内でのみ有効であり、 別の関数(main も)からは同じ名前であってもメモリ空間が違うために操作できない。 */ void FUNCTION(char *p@` int n){ printf("%s and %d"@` p@` n); return; }
>>516 腰を低くして質問してる人間が間違ってるのはいいけど、
偉そうに教えているやつがそこまでヘタだとギャグだな。
524 :
499 :2000/11/11(土) 20:05
今、本読んでて言ってることはわかるんだけど。 戻り値の型は配列だからcharで仮引数はjじゃないの?
525 :
499 :2000/11/11(土) 20:11
つづき。 >522 つまりxyz(j)を無理やり使うとどうなるの? ポインタ使わんといけないのかな? >520 mainのほうとプロトタイプの両方にi@`jはつかわれてるわけだからグローバルにしないといけないんじゃないの? むずい。
526 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 20:15
>499 重症だな。 このくらいはわからんとやっていけんぞ。 かんじんなとこが抜けてる。 もう一度本読み返せ。 みんなとおる道だ。
527 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 20:18
C言語なら、俺に聞けというスレッドで問題を聞いたら自分でやれってすげえな。 責任者呼んでこい。
528 :
名無しさんi486 :2000/11/11(土) 20:52
プロトタイプは、関数を呼び出すときにどーいう型の引数をとって、その関数を
使うとどーゆー型の値が返ってくるかを書く。
文字列を表示する関数xyz()で考えると、戻り値がないからvoid
引数も表示する文字列がグローバル変数なら、xyz()は操作する文字列の情報を
もってるからvoidになる。
つまりvoid xyz(void);になる。
表示する文字列をmain()に持たせる場合は、xyz()は文字列の情報が見えないから
その文字列のポインタを引数に持つことによって文字列の情報を渡す、
その場合は
>>505 になる。xyz()内のwhileの処理が何やってるか分かりにくいかも
しれないがやってることは499や504のforと同じようなことをやってる。
>>516 に関してはプロトタイプ宣言の説明するのに致命的な間違いがあるから
読むな。
529 :
499 :2000/11/11(土) 21:01
>528 だから結局無理やりxyz(j)をつかったらどうなるの?
527=511(=499?)はビルジョブスに何か言わせたいらしいな。 スレッドの序盤を読んでみな。
いいから、勉強しなおせ。 プロトタイプじゃなく、「ローカル変数」。そして「仮引数」だ。
532 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 21:16
>531(トラコス社員か?) わかんないんだろ? ぷ。
>>500 で解決しているだろ。
最初のxyzが宣言、
次に出てくるのが呼出、
最後が定義だ。
534 :
Visual名無しさん :2000/11/11(土) 21:18
>529 無理矢理使うも何も、使えんだろう。
535 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 21:19
>532 一言余計だよ。
537 :
旅団団長 :2000/11/11(土) 21:20
使おうと思えばつかえるよ。
538 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 21:22
>わかんないんだろ? >ぷ。 わかんない人間なんて、この板にどれ程居るんだ?
539 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 21:23
あれそうだな・・
>わかんない人間なんて、この板にどれ程居るんだ? 499以外にいるのかね?
541 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 21:39
>540 おまえもわかんないんだろ? モナー板逝ってよし。
いや、わかんねー奴は死ぬほどいるだろ。 じゃなかたらもっとこの板レベルが高いはず。 499 のは課題だろ? 初歩の初歩なんて自分の勉強にすらならんのに この板で親切丁寧に教えてくれる奴はいないだろ。 ソースの何が間違ってるかってのは定義と呼出を混同してるとこだ。 本来なら3つの char xyz(j) は全部違う書き方だ。 これでもわからんだろうから課題出した先生に聞け。授業料払ってんならそっちを使いまくれ。
543 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 22:17
わからないやつのほうがはるかに多いだろうね かたにはまった勉強しかしてないからちょっと条件つけられるとできないんだろう。 xyz(j)を使うと少しだけど頭使わないとかけないよ。 初心者レベルにはちょうどいいと思う。 おそらくjという文字列を並べる関数をxyz(j)としてキーボードから入力された文字列を表示しろってもんだいなんだろ。 こう書いたらできるんじゃないか? どっかから持ってきたプログラムをかいてるから混乱してる。
499が現れて以降、急に「リアル厨房」「モナー板」といった 普段この板では使われていない言葉が見られるようになりましたね。
545 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 22:24
499はある意味天才かも
>>542 -543
いやいや、499が出来てないのは「配列を・・・」ではなく、
「引数のある関数を作ること」だろ。
これが出来ないのは初歩の初歩というより、何もわかってないと言う方が・・・
499が現れて以降、 ビル・ジョブスに向かって文句を言ったり、 看板に偽りありと言い出す人も出てきたね。
548 :
543 :2000/11/11(土) 22:43
初心者ははじめよくここでつまずくんじゃないか? 俺もはじめは引数とか苦手だったしさ。 配列とかポインタとかもかたちから入っていっていつのまにかできてるって感じじゃん。 だからといって499も少しは精進した方がいいかもな。 本何度も何度も読み返せばできない問題じゃないぞ。 配列とかも大体かたちできてるみたいだし。 結局、文字列jの表示をxyz(j)関数を使ってってところでつまずいてるんだろ。 ちゃんと先生が何を勉強してほしいのかよくわかる良問だと思う。 ここでおまえは勉強しないといけないんじゃないか。 よりによって2chとは・・。
以後、テーマは「自作自演の煽りで如何に解答を引き出すか」になりました
550 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 23:14
>>497 はるか彼方
スタートアップルーチンが呼んでんじゃないの?組み込みやっててなんでそんなこと
(およびその調べ方が)わかんないの?
551 :
名無しさんi486 :2000/11/11(土) 23:26
>jという文字列を並べる関数をxyz(j)としてキーボードから入力された文字列を表示 の意味が良くわからないんだけど、俺って馬鹿?
552 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 23:45
>>499 何度か「文字列をあらわす関数をxyz(j)」
という表現を使っているけど、これが勘違いの始まりだと思う。
「文字列を返す」か「文字列を受け取る」じゃない?
わからないことを質問する姿勢はいいと思うが、ただもう少し謙虚
な態度と努力することを身につけろ。
そうして3年後には優秀な技術者になってくれ(マジで)。
553 :
ああっ名無しさまっ@質問 :2000/11/12(日) 01:07
関数を呼び出すところの有効範囲内に関数の宣言がないときはなんかやばいことでもあるのですか?
言っている事がイマイチ理解できないが、 「宣言されていない関数」と言う意味ならば、 コンパイラは関数呼出に出会ったときに 関数の返り値をint型、引数を(...)として扱ったはず。(C99以前) 自動的な型変換等が無くなるね。
そいつがやりたい事と書いたソースがあんまりかけ離れてると、 スレッドの行方は、こうなるよね、やっぱ。
556 :
名無しさん@お腹いっぱい。 :2000/11/12(日) 04:32
>>522 >FUNCTION という名前の関数の定義。
これは「宣言」。
>FUNCTION という名前の関数の内容。
でもって、これが「定義」だ。(宣言としても機能する)
あと、グローバル変数を使うことを前提にした解説はしない方がいいと思うぞ。
>>499 が何処に逝くかわからないから。
557 :
名無しさん@お腹いっぱい。 :2000/11/12(日) 04:38
a==bはaはbに同じ、なのかbはaに同じ、なのかどちらでしょうか。 a==bとb==a違いはあるのですか?
評価順序が違う
a と b は等価と読む、に一票。 評価順序は不定です。
560 :
名無しさん@お腹いっぱい。 :2000/11/12(日) 05:12
561 :
557 :2000/11/12(日) 05:19
a@`c@`timeがdoubleで、 if(a==time){ count=1; a=a+c; } って言うのをtime=0.0~100.0まで0.1刻みでループさせてるんですが ifの条件を満たしていてもif内を処理してくれない時があるので困ってます
>560 a==b を a を評価してから b を評価するのも ..(1) b を評価してから a を評価するのも ..(2) 式ごとに順序が違うのもアリだから ..(3) > ANSI (1)なら a==b は a が先に評価され、 b==a は b が先に評価される (2)なら a==b は b が先に評価され、 b==a は a が先に評価される といいたいのでは。 評価順序が不定の演算子は、 評価順序によって結果が変わる書き方をしてはいけない。 ex. if( (a++) == a ) ...;
563 :
557 :2000/11/12(日) 05:29
補足。 printfでaとtimeを出力してみると同じになっているのに if内を処理しないのです そこで上のifの条件文を満たしていないのかな。と思ったりして 上のような質問をしたのですが、
>557 double で 0.1 をたすと、誤差がでてくる。 厳密に 0.1 は表現できないから。 だから、それを加え続けると誤差が大きくなり 意図して値より微妙にずれることになる。 printf では小さい誤差は四捨五入するので 違いはわからない。(機械イプシロンまで出力したら別だけど) double をつかわずに long int あたりを使うか 誤差を考慮してコーディングしましょう。
565 :
名無しさん@お腹いっぱい。 :2000/11/12(日) 05:56
>557 double でループすると誤差で終了条件とかの判定がおかしくなるという話は そこらへんの教科書にはだいたい書いてあるので読んで見てください。
566 :
557 :2000/11/12(日) 06:16
>>564 @`565
おっしゃるとおりのようで@`微妙な差が生じていました。
timeやa@`cの値をintで定義してやり直すなどします。
ご教授ありがとうございました。
今後もいろいろ教えてください。
ビルジョブス...懐かしい名前だ strlenの再帰版をしくじってから見かけないな...
568 :
名無しさん@お腹いっぱい。 :2000/11/13(月) 13:51
==って左結合だから左から評価されるのでは?
570 :
名無しさん@お腹いっぱい。 :2000/11/15(水) 06:46
windows上で動くプログラムをCで作成するに あたって必要なのはwin apiと他になにか ありますでしょうか? cを勉強中で、アプリを作ってみたいと 思いまして。
俺も数日前からWin上での始めたけど、ウィンドウの生成関係とメッセージループがなんとなくわかれば あとは順に覚えていけばいいんじゃねーかと思う。 DOSから覚えることが増えまくったがAPIはかなり楽だなー あとは役立ちリンクスレッド参考にするとかな。 俺は猫でも解るプログラミングなどを参考にしてやってみた。
572 :
名無しさん@お腹いっぱい。 :2000/11/15(水) 13:59
データベースに簡単にアクセスできるライブラリってないですか? ODBC直打ちは面倒なので‥‥‥ あ、VC++6.0です。
573 :
名無しさん@お腹いっぱい。 :2000/11/15(水) 14:51
MFC使っていいならCRecordSet(ODBC)@` CDaoRecordSet(DAO)辺り。 ADOはCOMコンポーネントになってるんだっけ?
574 :
572 :2000/11/15(水) 14:59
>>573 すいません、C++が使えるぐらいならこのスレッドで質問しません。
というか、質問自体しません。
Cで開発することになってるから困ってるのですが、何かCで楽に開発
できるライブラリはないですかね?
575 :
573 :2000/11/15(水) 15:04
Cだと見た事ない。 つーかもうWinはCだけではつらくなってきてる時期だよ。C++の全てを 理解する必要はないけど、MFCとかCOMとかを使える位にはなっとかな いと、無用な苦労を背負い込むだけ。
576 :
名無しさん@お腹いっぱい。 :2000/11/15(水) 15:14
>>572 DBMSはSQL Server?
どうしてもODBC + Cじゃないといかんの?
577 :
572 :2000/11/15(水) 16:02
>>575 あ、俺自身はC++は使えます。
プロジェクトの都合で、C++が使えないので。
ま、周辺のソースはC++で組んでるんですけどね。
やっぱり、そっちの方が圧倒的に楽。
>>576 とりあえずAccessですが、そうじゃないとも限らない?
一応、ODBC + Cじゃなきゃいかんことになってるようです、はい。
578 :
名無しさん@お腹いっぱい。 :2000/11/15(水) 16:44
>>577 ODBC直叩きが面倒なのであれば、C++でCDatabaseやCRecordsetの
C用のラッパーでも書いてDLLにでも封じ込めたら?
579 :
572 :2000/11/15(水) 18:07
>>578 ふむ、それは悪くないかもしれない。
試してみます。ありがとうございました。
ありがとうございます。 どうもc++やった方がいいようなので とりあえず本買ってきました。
みなさんありがとうございます。 とりあえずc++やっとこうと思います。
582 :
名無しさん@お腹いっぱい。 :2000/11/16(木) 21:06
UNIXでもEOFは「Ctrl+Z」キーでいいですか?
>582 Ctrl+d
全く基本的なことで申し訳ないのですが、 sturct { char a; char b; char c; int d; } temp; とやったときに、temp.dはmemoryのint境界に配置されますが、 temp.bとtemp.cはbyte境界に配置されますのはなぜでしょう。 また、temp.bとtemp.cをint境界に配置したい場合は、 たとえばgccの場合はどのようなoptionで指定したらよいのでしょうか。
585 :
582 :2000/11/16(木) 22:06
>583 ありがとう 助かりました
>584 >temp.bとtemp.cはbyte境界に配置されますのはなぜでしょう。 バイトアクセスと、ワード境界をまたいだアクセスの違いです。
587 :
名無しさん@お腹いっぱい。 :2000/11/16(木) 23:14
一時ファイルを作らずにファイルの内容の一部を変更・削除するには どうすれば良いのですか?
588 :
名無しさん@お腹いっぱい。 :2000/11/17(金) 01:01
>>587 メモリに全部読み込んで、
そこで変えてから
吐き出せ。
ほら一時ファイル無しだ。
589 :
cafe :2000/11/17(金) 01:44
>584 char aki[3];でもいれとく。option無いと思う。
padding filler なんつーのもあるね。
591 :
あう :2000/11/17(金) 04:08
ハンドルがわかってるアプリ窓のマウス座標は どうやって得ればええのでしょうか。 全体のは得られるんですが・・plz help me
窓の絶対座標と幅を受け取って相対座標に計算すればいいんじゃないか?
593 :
あう :2000/11/17(金) 05:09
>592 GetCursorPos以外に関数使いそうですか?
586@`589@`590さんありがとうございました。
595 :
名無しさん@お腹いっぱい。 :2000/11/17(金) 13:33
>>584 int=32bitなら、
sturct {
char a;
char dummya[2];
char b;
char dummyb[2];
char c;
char dummyc[2];
int d;
} temp;
っつーんじゃダメ?
どっかでプリプロセッサ使ったパディングを自動化する
マクロ見たんだけど覚えてないや。スマソ。
言いたいことは sturct { char a; char dummya[3]; char b; char dummyb[3]; char c; char dummyc[3]; int d; } temp; だよな? ただのtypoだよな?
>>596 ぐああああ、その通り。[2]じゃダメやん。[3]取らないと。
指摘ありがとう。
598 :
名無しさん@お腹いっぱい。 :2000/11/17(金) 17:46
CでPN系列を生成したいのですが、方法はありますか? rand()で生成される疑似乱数はPN系列とよばれるもの なのでしょうか?
599 :
初心者 :2000/11/18(土) 18:26
int main(int argc@` char *argv[]) で、 ++argv; っていうコードは不正ではないのですか? argvはポインタ配列の先頭アドレスを表すだけで 変数ではないのではと思うのですが。
600 :
名無しさん@お腹いっぱい。 :2000/11/18(土) 19:24
配列(の名前)は引数に渡すときにポインタになる(成り下がると いう表現をC FAQでは使ってる)ので、不正ではないと思います。
601 :
600 :2000/11/18(土) 19:26
しちゅれい。渡ってきたほうは、渡した方が配列だったかポインタだったか 知り得ないんでした。仮引数だからポインタということですね。
602 :
名無しさん@お腹いっぱい。 :2000/11/18(土) 22:15
>>599 仮引数は「必ず」変数です。例外はありません。
また、仮引数の宣言で[]宣言子が出てきたときには、
それは「常に」*宣言子に読み替えます。
従って、argvは、char型へのポインタへのポインタという
型の変数、ということになります。この場合const修飾も
ありませんから、変数を書き換えることに、何ら文法上の
制約はありません。
603 :
599 :2000/11/18(土) 23:12
どうもです。 ということは、 argvは始めは&argv[0]を示していて、 ++argvで&argv[1]を示すんですよね。 argvがargv[4]を示すこともあるということですが、 このときにもargv[0]を使う(参照、書き換え)することはできるのでしょうか?
604 :
599 :2000/11/18(土) 23:14
どうもです。 ということは、 argvは始めは&argv[0]を示していて、 ++argvで&argv[1]を示すんですよね。 argvがargv[4]を示すこともあるということですが、 このときにもargv[0]を使う(参照、書き換え)することはできるのでしょうか?
605 :
名無しさん@お腹いっぱい。 :2000/11/19(日) 15:57
>>603 argv[-4]とか、argv - 4とかで表現できると思うけど、訳わからなくなるから
インデックス変数で操作するべきでは。
というか、あとで巻き戻すつもりならargvそのものを直接いじるのは止めた方が
いいと思う。
606 :
名無しさん@お腹いっぱい。 :2000/11/19(日) 16:44
質問です。 以下のようなプログラムだと、「5」と「1」が 表示されてしまうんですけど、なんででしょう? 配列の要素数を求める関数って作れませんか? void main() { int a[]={1@`2@`3@`4@`5}; printf("%d\n"@`sizeof(a)/sizeof(a[0])); /*配列の要素数を求めている*/ count(a); } void count(int a[]) { printf("%d\n"@`sizeof(a)/sizeof(a[0])); }
607 :
名無しさん@お腹いっぱい。 :2000/11/19(日) 17:32
無理。 Cにおいて関数インタフェイス経由で配列そのものを受け渡すことは 出来ない。関数の実引数として配列名を渡した場合、実際に関数に 渡されるのは、配列の先頭要素へのポインタだ。
>>606 >count(a);
で配列aの先頭を指すポインタがcount()に渡されるから、
sizeof(a) == sizeof(int *) == sizeof(a[0])
要素数を保持したいなら、
配列の末尾に特殊な値(INT_MAXとか)を入れておくか、
普通に要素数を別の変数に入れておくか。
前者は余りおすすめしないけど。
609 :
名無しさん@お腹いっぱい。 :2000/11/19(日) 18:04
配列の[-1]に要素数を入れておく手もあるがちとあつかいが面倒。 そんなことするくらいならC++で要素数の問い合わせができる配列クラス作れ。 って‥そんなのわざわざつくらんでももうあるか‥
610 :
名無しさん@お腹いっぱい。 :2000/11/19(日) 22:41
>>606 文法的にはどういうことかというと、
「配列名は、それが式の中に現れたときには、ごく少数の例外を除いて、
その配列の先頭要素を指すポインタ値に変換される」
という規則があります。
だから、main関数の「count(a)」の式(関数呼び出しもCの文法では
式に相当する)で「a」は、配列aの先頭要素を指すポインタ値になります。
要するに、引数としてcount関数に渡されるのは、そのポインタ値で
あって、配列全体ではありません。
さて、count関数の方はどう見るかというと、
「void count(int a[])」
ですが、上のほうでも書きましたけど、関数の仮引数では、
[]宣言子と*宣言子は同じものです。だから、これは
「void count(int *a)」
と全く同じ意味になります(例外はありません)。
また、関数の仮引数はその関数のスコープを持つ自動変数です。
(これも例外はありません)
だから、count関数のなかで「sizeof(a)/sizeof(a[0])」と
書いたら、その式の値は5になる保証はありません。
(1になるかどうかも処理系依存ですが)
あ、余談ですけど、この式の場合、sizeof演算子の後ろの()は
不要ですね。「sizeof a / sizeof a[0]」でおっけー。
611 :
名無しさん@お腹いっぱい。 :2000/11/19(日) 22:47
>>608 >>count(a);
>で配列aの先頭を指すポインタがcount()に渡されるから、
こう誤解している人がよくいますけど、正確には
「配列aの先頭要素を指すポインタ」ですね。
違いないじゃないか、と思う人もいるかも知れませんけど、
型が違います。
配列aの先頭を指すポインタなら「int (*a)[5]」型だし
配列aの先頭要素(の先頭)を指すポインタなら「int *a」型です。
この辺をきっちり理解していないと、多次元配列をうまく
使いこなせません。
612 :
611 :2000/11/19(日) 22:50
すまん、間違えた。 配列aの先頭を指すポインタなら「int (*)[5]」型だし 配列aの先頭要素(の先頭)を指すポインタなら「int *」型です。 が正解。
>>611 ああ、失礼。確かに配列の先頭を指すポインタだったら、
インクリメント一発で配列の彼方に行ってしまうな。
しかもそれだと sizeof(*ptr)で配列のサイズもわかってしまうま‥
ん〜その方が便利なこともあるかも‥
やっぱりアセンブラやってないとこのへん難しいんかのぉ
>>614 Perlみたいで便利かも(笑)
$size_of_array = @array
int size_of_array = sizeof(*array) てなもんで。
618 :
名無しさん@お腹いっぱい。 :2000/11/20(月) 14:33
CでPN系列を生成したいのですが、方法はありますか? rand()で生成される疑似乱数はPN系列とよばれるもの なのでしょうか?
619 :
>618 :2000/11/20(月) 14:52
Pseudo Noise系列の意味ならrandもそりゃPN系列を吐くね。 でも、たぶん勘違いだろな。やりたい事は何?
620 :
618 :2000/11/20(月) 14:55
ありがとうございます。 気になってる女の子がCDMAのケイタイを買ったので受信したいのです
>620 あんたのストーカー行為を手伝う義理はありません # 「ストーカー」ってつい「ストーカ」と書きそうになる
どうしても最後のーを抜く癖は付いちまうな。 なんか同類かどうかの判定基準になっちまうな。
623 :
618?????タ :2000/11/21(火) 16:05
大きなノイズの上に送信側が信号を乗せ、受信側でその信号を取り出したいのです。 直接拡散(DD)方式というのでしょうか。 rand()で-1@`+1の乱数を生成して、受信側で相関をとってみたのですが あまり良い結果が得られなかったので@`本物の(?)PN系列ではどうなるのかな? とおもい質問しました。 私の意図している本物のPN系列というのは、0@`1でいうと 0@`1の出て来る確率が等しいだけでなく、 00@`01@`10@`11の出て来る確率が等しかったり 001@`010@`011@`100@`101@`110@`… の出て来る確率も等しかったりするもののことです。
624 :
名無しさん@お腹いっぱい。 :2000/11/21(火) 16:14
>623 『モンテカルロ法でやれば』なんていってみたりする
625 :
>623 :2000/11/21(火) 19:29
通信に使用するのであれば、周期系列である事が必要では? 周期系列で良く使われるのはM系列です。 周期は(2^ビット幅 -1 )つまり奇数です。そして M系列なら0@`1の頻度の差は1周期あたりわずか1でしかありません
626 :
625 :2000/11/21(火) 19:34
さらに、M系列は(2^N-1)の周期ですから、1ビット毎にシフトしながら 観察すれば、当然、Nbitで表現出来る数の0以外が全て現れます。 つまり2番目の頻度が等しい特性も満たす事になります
627 :
名無しさん@お腹いっぱい。 :2000/11/22(水) 07:47
628 :
超初心者 :2000/11/22(水) 17:57
Visual C++を使っています。 #include<stdio.h> int main() { char *ch; scanf("%s"@`ch); printf("%c\n"@`*(ch+3)); return 0; } これを実行すると「不正な処理・・・」になってしまうのは何故ですか? ビルド中にはエラーはありませんから構文的には大丈夫なんでしょうけど・・・ 詰らない質問で申し訳ありませんが、いくら考えてもわからないのです。
char *ch; が初期化されてないからッしょ
630 :
ε :2000/11/22(水) 18:11
>>628 ありがちですが、chの実体を確保してないのが原因です。
char ch[256];
とするか、chの領域を動的に確保しましょう。
>>628 あなたはこのプログラムに何をさせたいのでしょう?
特に
printf("%c\n"@`*(ch+3));
の ch+3 は何を意図しているのでしょう?
詰らない質問で申し訳ありませんが、いくら考えてもわからないのです。
632 :
超初心者 :2000/11/22(水) 20:54
なるほど! ポインタが何も指してない状態だったんですね ありがとうございました。 >631 いや、特に何も意味してないです。 配列とポインタの動きを確かめるために書いたコードなので意味のあるものではないのです。 ch+3のところをch[3]に変えてみたり、いろいろと・・・ なにぶん初心者ですので意味不明な部分があると思いますが気になさらないでください。
633 :
名無しさん@お腹いっぱい。 :2000/11/23(木) 03:14
標準入力があった場合 true を返して なかった場合は false を返すっていうのは どうしたらいいのでしょうか。 知識不足で分かりません。 要は ls -al | ./a.out とやった場合 ok を出したいんです。 で、 ./a.out だけの場合は ng を出したいんですが。
stdinを読みゃーわかるんじゃねーの?
635 :
0xE104 :2000/11/23(木) 03:52
633氏が言いたいのって、標準入力がパイプやリダイレクトで渡された 場合はOKで、コンソールの場合にはNGにしたいってことですよね? EOFは^D待ちになっちゃうし…SIGALARM自分に送らせるようにして 一定時間待つくらいしか思いつかないです。
636 :
名無しさん@お腹いっぱい。 :2000/11/23(木) 11:50
isatty()
637 :
名無しさん@お腹いっぱい。 :2000/11/23(木) 13:30
>>636 うお、出来た。
こんな関数があったとは。
有り難う御座います。
638 :
名無しさん@お腹いっぱい。 :2000/11/23(木) 18:48
int hoge[10]={1@`5@`23@`4.5@`78@`9@`2@`23@`55@`}; intのとある配列の初期化で上のようなミスに気がつくのに 2時間も費やしてしまいました‥ これはどうしてエラーにもワーニングにもならないのでしょうか? コンパイラはBCCです。 他の処理系だとエラーやワーニングになるのでしょうか?
639 :
>638 :2000/11/23(木) 21:10
分かり易く書くように気を付けるべし。 ツールでテーブルデータを作る時以外は、こんなふうに書くといい int hoge[10]={/*0*/ 1@` /*1*/ 5@` /*2*/23@` /*3*/4.5@` /*4*/78@` /*5*/ 9@` /*6*/ 2@` /*7*/23@` /*8*/55@`};
640 :
名無しさん@お腹いっぱい。 :2000/11/23(木) 21:28
>>638 gcc ではCとしてコンパイルした場合はエラーにもワーニングにも出ず、
C++としてコンパイルした場合は、以下のようなワーニング。
warning: initialization to `int' from `double'
LSICとかも通った。通すコンパイラ多いな。 が、根本的に「データの区切り(@`の後)に空白かタブを入れる」 をすれば、全てエラーになる。 コンパイラも悪いが、書き方も悪い。 多くの人はちゃんと区切りを入れているので、 コンパイラのバグにすら気がつかない。
642 :
くにひこ :2000/11/25(土) 04:44
Cで配列の要素数を[2048]×[2048]の2次元配列を作ろうとしたら、 segmentation fault@` core dumpedになってしまった。 どうすればいいのでしょう。
643 :
くにひこ :2000/11/25(土) 04:57
↑メモリ不足なのかしらん? double型なんだけど。 2048*2048*8バイト=3×10^7 バイト=30Mバイト 64Mマシンでは動かないのかな?
644 :
名無しさん@お腹いっぱい。 :2000/11/25(土) 07:55
>>643 staticとかグローバルなら取れるんじゃない?
645 :
名無しさん@お腹いっぱい。 :2000/11/25(土) 08:14
646 :
名無しさん@お腹いっぱい。 :2000/11/25(土) 17:45
使用言語:C
ある整数xが2のべき乗かどうかをできる限り高速に判定したいんですが、
いい方法あったら、教えてください。
つまり、こういう風な関数にしたいのです。
0->!0@` 1->!0@` 2 -> !0@` 3 -> 0@` 4->!0@` 5->0 ...
いまのところ考えているコードは
int is_power_of_2(int x)
{
if (x==0)
return 1;
while ((x&1)==0)
x>>=1;
return ~(x
>>1 );
}
なんですが、もっとよくならないものでしょうか。
容量無視なら、テーブルにして一括変換。
648 :
名無しさん@お腹いっぱい。 :2000/11/25(土) 18:29
変数が空かどうかをテストするにはどうしたらいいですか?
if(num & 1) 奇数 ; else 偶数 ;
例えば、char c; としたときにcが0x00であるか 空であるかどうやって見分けるのでしょうか? メモリの各bitには、2状態しかないわけですよね?
???読み間違った・・・なでに・・・?
>>648 if(num == 空)
空 ;
else
空じゃない ;
所で"空"ってなに?
652 :
名無しさん@お腹いっぱい。 :2000/11/25(土) 18:37
領域を割り当てられただけで 値がセットされていない変数のことです。
処理系によって違う ただ、static でとった場合の初期値は 0x00(charの場合)。
654 :
名無しさん@お腹いっぱい。 :2000/11/25(土) 18:48
>647
キャッシュミスや、はたまたページフォルトがおきたら、LUTのほうがはるかに遅い。
むしろ
>>646 のほうがはやいんじゃないか。
で、
for(x=1; a^x ;x <<= 1);
return x;
こんなのはどうだ?
手もとで実験してみたところ、 #include <stdio.h> int main() { int i; char c; float f; printf("i : %d\nc : %d\nf : %f\n"); printf("i : %x\nc : %x\n"); return (0); } で i : 134513595 c : 134517920 f : -1.999046 i : 80483bb c : 80494a0 なる結果を得ました。この値は全くのランダムなんでしょうか?
656 :
失敗 :2000/11/25(土) 18:52
#include <stdio.h> int main() { int i; char c; float f; printf("i : %d\nc : %d\nf : %f\n"@`i@`c@`f); printf("i : %x\nc : %x\n"@`i@`c); return (0); } で i : 134517944 c : 8 f : 0.000000 i : 80494b8 c : 8 でした。
>655 C言語リファレンス読め。 ああ、それから、ランダムっていう言葉の使い方は 注意したほうがいいぞ。
>657 分かりました。どうもです。
>654 止まらない場合があるじゃん(藁
int Num; int KARAflg=1; int SetNum(int val){ KARAflg=0; return Num=val; } int IsKARA(void){ return KARAflg; } こうやって調べろ。 意味があるかどうかは謎だが‥
int is_power_of_2(int x) { switch(x){ case 1<<0: case 1<<1: case 1<<2: case 1<<3: case 1<<4: case 1<<5: case 1<<6: case 1<<7: case 1<<8: case 1<<9: case 1<<10: case 1<<11: case 1<<12: case 1<<13: case 1<<14: case 1<<15: return 0 ; } return 1 ; }
662 :
名無しさん@お腹いっぱい。 :2000/11/25(土) 19:26
0って2の階乗なのか?
ばかぁ
2の階乗=2!=1*2=2 1<<0 は、1を0ビット左にシフトなので、1。 ちなみに2の0乗は、1。
665 :
鏝半>646 :2000/11/25(土) 19:52
最高16bitまでとして、2の16乗を引数*で*割って余らなかったら 2のべき乗。なんか剰余があればば2のべき乗にあらず。 ただし0は別扱い。
666 :
鏝半=665 :2000/11/25(土) 20:02
2の15乗で十分や。 打つ出汁膿
667 :
これどこがいけないんでしょうか? :2000/11/25(土) 20:07
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct two{ int a; int b; struct two *next; }; //ここにtwoを加えるととおる void main(){ two x@`y; x.next = &y; printf("aのネクストは%dです\n"@`x.next); }
typedefは、ある型の別名を定義するのに使うもの。 typedef struct two{...} two; なら「struct two の別名は two」って意味になるけど typedef struct two{...}; じゃ struct two の別名を何にするのかさっぱりわからんだろ?
669 :
667 :2000/11/25(土) 20:39
>668さん ところが僕がもってる”入門 かならずわかるC言語”土井滋貴著 CQ出版社には typedef struct{ int a@`b; } XGATA; という記述があり、またこれを含むプログラムをコンパイルしたらきちんと動いたのですよ。だから疑問におもっているんです。
>>669 構造体定義にはタグ名は必ずしも必要じゃない。
その例ではタグ名を指定しない無名の構造体を定義して、それに
対してtypedefによってXGATAという別名をつけている。これは
好ましいかどうかは別として、構文上は全く問題ない。
>>667 は、typedefと言っておきながら、typedef名を指定していない
のが誤りなのだ。"typedef"を削除するか、typedef名を指定するか
のどちらかにせよ。
> typedef struct{ > } XGATA; を参考にしたんなら > typedef struct two{ > }; こうぢゃなくて > typedef struct{ > } two; こう書け!アホか‥
672 :
667 :2000/11/25(土) 21:38
667のプログラムで、 typedef struct { int a; int b; struct two *next; }two; とすると、14行目の x.next = &y; で”問題のあるポインタ変換”と警告をくらいます。これはどうしてでしょうか?
x.nextはstruct twoへのポインタで &Y は twoへのポインタだ。 twoという名のstructは無いからだな。
s/&Y/&y/
ついでだ > printf("aのネクストは%dです\n"@`x.next); これは通るだろうけども、キミが何を期待してるのかわからん ポインタの指すアドレスを知りたいなら printf("aのネクストは%pです\n"@`x.next); と、しとけ。
676 :
667 :2000/11/25(土) 22:47
うーん、なるほど(分かったような分からないような・・・) そうすると struct two{ int a; int b; struct two *next; }; をtypedefを使って書く場合はどのようにすればいいのでしょう?
// typedef キーワードの例 typedef unsigned long ulong;
678 :
Visual名無しさん :2000/11/25(土) 23:30
>>676 =667
だから自分で最初に書いてるように
typedef struct two{
int a;
int b;
struct two *next;
} two;
こうすればいいだろ?
struct tagtwo{ int a; int b; struct tagtwo *next; }; typedef struct tagtwo typetwo; 素直に分けてこう書けや‥ 無名構造体にこだわる必要がどこにある?
680 :
Visual名無しさん :2000/11/25(土) 23:31
>>676 =667
だから自分で最初に書いてるように
typedef struct two{
int a;
int b;
struct two *next;
} two;
こうすればいいだろ?
struct tagtwo{ int a; int b; struct tagtwo *next; }; typedef struct tagtwo typetwo; 素直に分けてこう書けや‥ 無名構造体にこだわる必要がどこにある?
682 :
名無しさん@お腹いっぱい。 :2000/11/25(土) 23:36
>667 typedef struct two_{ int a; int b; struct two_ *next; } two;
分かりました。その線でいきます。ありがとうございました。
684 :
名無しさん@お腹いっぱい。 :2000/12/03(日) 00:10
C言語である変数のアドレスを出力したいんですけど、 printf("%#x・・・ と printf("%x・・・ の違いって何? #の意味は? 達人の皆様教えてください。 K&Rでは載っていませんでした。 お願いします。
アドレス出力は"%p"じゃないノカ?>684
686 :
名無しさん@お腹いっぱい。 :2000/12/03(日) 06:44
>684 フラグ文字です ---------------------------------------- o、x、X の各書式と一緒に使うと、0 以外の すべての出力値の前にそれぞれ 0、0x、0X が付く。 ---------------------------------------- と、MSDNライブラリには載ってましたよ。
すいません、続きがありました ---------------------------------------- e、E、f の各書式と一緒に使うと、必ず出力 値に強制的に小数点が入る。 後続の数値が ある場合にのみ小数点が表示される。 ---------------------------------------- g または G の書式と一緒に使うと、必ず出 力値に強制的に小数点が入り、後続する 0 が切り捨てられない。c、d、i、u、s のいず れかと一緒に使うと無視される。 後続の数値 がある場合にのみ小数点が表示される。後続 の 0 は切り捨てられる。 ---------------------------------------- だそうです
|| (@`@`゜д゜) / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
|| /_ノ _) <
>>686 '#'を指定して進数毎に正規化したいって事? 変数のアドレスの話は?
||__//y_y____ \__________
||~~~~~~~~~~
>ギコハト え?だって元の質問が >#の意味は? ってあったから・・・
690 :
うら :2000/12/06(水) 01:26
「直接挿入法」ってなんですか?教えてください。
俺も直接挿入してぇぇぇ!
>>690 種馬になれるような遺伝子を持っているなら教えてあげる。
693 :
SE :2000/12/07(木) 10:43
関数ポインタから関数名を取得する方法を教えてください。 ■時間 3時間 ■ 配点 20点
694 :
名無しさん@お腹いっぱい。 :2000/12/07(木) 10:47
>>693 そんな事は標準の方法ではできない。
関数ポインタと関数名をメンバとする構造体を作成し、
それを検索すれば実現できるかもしれない。
696 :
693 :2000/12/07(木) 10:54
__builtin_return_address(level)で 関数の呼び元のアドレスを取得することはできます。 __PRETTY_FUNCTION__で関数名を取得することができます。 知りたいのは、呼び元の関数名を出力する方法です。
>>693 それが出来たら実行ファイル覗いて関数名も取れるつー事になるゾ!
なので、答えは
解なし(思考時間10s)
>>696 __builtin_return_address(level)
__PRETTY_FUNCTION__
処理系依存の方法だな、OSと処理系を書かないと
駄目だと思うぞ。
699 :
名無しさん@お腹いっぱい。 :2000/12/07(木) 10:59
GDBのバックトレースとかってどうやってるの?
700 :
名無しさん@お腹いっぱい。 :2000/12/07(木) 11:01
>698 ANCI-C標準規格です。
>>697 関数名と関数ポインタの対応が取れなかったら、
どうやってダイナミック・リンクが実現できるんだ?
厨房は中途半端な知ったかするんじゃねぇよ!
>>700 げっ! 知らなかった。
偉そうな事言ってすいません。
鬱だ死のう...
703 :
名無しさん@お腹いっぱい。 :2000/12/07(木) 11:20
age
704 :
名無しさん@お腹いっぱい。 :2000/12/07(木) 11:25
>>701 共有ライブラリの話などどこにも出てませんが?
>>700 >ANCI-C標準規格です。
くそっ、騙された!!
少なくとも__builtin_return_address(level)
はgccの組み込み関数じゃねーか、嘘ついてんじゃねー!
http://www.issei.org/diary/d200010b.html > 1. gcc の組込み関数 __builtin_return_address() で関数のリターンアドレスを取得する。
> 2. 実行ファイルから nm (1) を使ってシンボルをリストし、
> 1 で得られたリターンアドレスと照らし合わせて、関数の呼び出し履歴を再構築する。
まぁ、1つ賢くなったから許してやる
ダイナミックリンクを実現するために、すべてのオブジェクトや 実行モジュールが関数名の表をもっていると思い込んでるんでしょ。 ただの勘違いおバカさんです。
708 :
700 :2000/12/07(木) 11:50
ごめんなさい。しかも ANCI × ANSI ○ でした。氏にます。
>>708 オレモナー
C99で始めて__fun__ ×
C99で初めて__func__ ○
お昼前なので気が立ってしまいました。
お昼を食べて少し落ち着きました。
まぁ、少し賢くなったということでこの1時間は有意義でした。
ありがとうございました。
710 :
701 :2000/12/07(木) 12:49
>>704 (゚Д゚)ハァ?、
>>697 が
>それが出来たら実行ファイル覗いて関数名も取れるつー事になるゾ!
と「実行ファイルから関数名は取れない」みたいなことを言っているから
取れなかったら「どうやってダイナミック・リンクが実現できるんだ? 」
と質問しただけです。
>>706 >ダイナミックリンクを実現するために、すべてのオブジェクトや
>実行モジュールが関数名の表をもっていると思い込んでるんでしょ。
少なくとも、unixでは実行モジュール、ライブラリは関数名の表をもっています
nm か strings -a を実行モジュールに対して実行すると関数名が
出力されます。
winはよくわかりませんが。
> ただの勘違いおバカさんです。
オマエガナー
無知をさらして楽しいかい?
711 :
>710 :2000/12/07(木) 12:54
補足 winは、午後のコーダによれば ; GOGO2DLL.def : DLL 用のモジュール パラメータ宣言 LIBRARY "GOGO" DESCRIPTION 'GOGO Dynamic Link Library' EXPORTS ; 明示的なエクスポートはここへ記述できます MPGE_initializeWork @100 MPGE_setConfigure @101 MPGE_getConfigure @102 MPGE_detectConfigure @103 MPGE_processFrame @104 MPGE_closeCoder @108 MPGE_endCoder @105 MPGE_getVersion @106 MPGE_getUnitStates @107 MPGE_initializeWorkVB @200 MPGE_setConfigureVB @201 MPGE_getConfigureVB @202 MPGE_detectConfigureVB @203 MPGE_processFrameVB @204 MPGE_closeCoderVB @208 MPGE_endCoderVB @205 MPGE_getVersionVB @206 MPGE_getUnitStatesVB @207 なるものが、あるが。
712 :
名無しさん@お腹いっぱい。 :2000/12/07(木) 13:32
>>711 710はバカです。無視してOKです。
UNIXでは*.defファイルはありません。コンパイラが勝手にリストアップ
してくれます。
共有ライブラリは関数名を持ってます。じゃないと呼べない。
中間オブジェクトも関数名を持ってます。じゃないとリンクできない。
デバックオプションでも実行ファイルに関数名を持ちます。じゃないと
デバック出来ない。ちゅーか、ソースそのもの。
実行ファイルに共有ライブラリ関数の名前は持ってます。じゃないと
呼べない。
以外の理由で、実行ファイルに関数名を持つ理由などありませんし、
実際普通持っていません。
710がどのUNIXを使ってるのか知りませんが、関数名を実行ファイルに
持ち込む糞コンパイラは見たことありません。
ちゅーことで、本題に戻しましょう。
>>696 の呼び元の関数名を出力する方法、私も知りたいです。
ここまでレスがないってことは、そんな方法はないのかな?
713 :
名無しさん@お腹いっぱい。 :2000/12/07(木) 13:34
英文のアルファベットの出現度数を求めるプログラムなんですが。
1. 任意の関数ポインタから関数名を取得する ことと 2. 実行ファイルから関数名を得る ことでは次元が違う問題。 上を実現するには、メモリ上にその関数を含むセグメントがどのように リロケートされているかといった問題を知る必要がある。 そして、いずれにせよ外部名を持たない関数(ようするにstaticな関数) はどうするねんという問題は残る。 (nmやstrings -aで出力されるのは「外部名」だけでしょ) DLLに関しては、リンクエディタから見えるように シンボル表をエクスポートしているから見えるのであって、 エクスポートしていないものはやっぱり見えないという話にしか ならん。 710 >> winはよくわかりませんが システムに標準でついているはずの 「クイックビューア」によってエクスポートメンバ程度の情報は見れる。 もっとマジで色々みるにはVC++付属のdumpbinユーティリティが便利。
715 :
701 :2000/12/07(木) 14:02
>>712 まただ、まだ終わらんよ
長文になる。(1/2)
内部関数は確かにシンボル・テーブルに持つ必要性はないことは認める。
しかし、私の環境
OS:SunOS 5.6 コンパイラ:gcc 2.7.2.3
で以下のソースfoo.cをgcc -O foo.c でコンパイルし、
nm a.out を実行すると出力結果にfooが出力されるぞ
これはやはりgccは糞コンパイラだからなのか?
---- foo.c ここから ----
#include <stdio.h>
static void foo( void );
int main( void )
{
foo();
return 0;
}
static void foo( void )
{
printf( "hallo world!!\n" );
}
---- foo.c ここまで ----
長文になる。(2/2) nm 出力結果 [21] | 0| 0|SECT |LOCL |0 |20 | [2] | 65748| 0|SECT |LOCL |0 |1 | [3] | 65768| 0|SECT |LOCL |0 |2 | [4] | 66068| 0|SECT |LOCL |0 |3 | [5] | 66740| 0|SECT |LOCL |0 |4 | [6] | 66928| 0|SECT |LOCL |0 |5 | [7] | 66960| 0|SECT |LOCL |0 |6 | [8] | 66972| 0|SECT |LOCL |0 |7 | [9] | 67020| 0|SECT |LOCL |0 |8 | [10] | 67388| 0|SECT |LOCL |0 |9 | [11] | 67408| 0|SECT |LOCL |0 |10 | [12] | 67432| 0|SECT |LOCL |0 |11 | [13] | 132992| 0|SECT |LOCL |0 |12 | [14] | 133004| 0|SECT |LOCL |0 |13 | [15] | 133156| 0|SECT |LOCL |0 |14 | [16] | 133256| 0|SECT |LOCL |0 |15 | [17] | 133256| 0|SECT |LOCL |0 |16 | [18] | 133264| 0|SECT |LOCL |0 |17 | [19] | 133272| 0|SECT |LOCL |0 |18 | [20] | 0| 0|SECT |LOCL |0 |19 | [22] | 0| 0|SECT |LOCL |0 |21 | [23] | 0| 0|SECT |LOCL |0 |22 | [24] | 0| 0|SECT |LOCL |0 |23 | [25] | 0| 0|SECT |LOCL |0 |24 |
書ききれない...( nm 出力結果その2 ) [55] | 133004| 0|OBJT |GLOB |0 |13 |_DYNAMIC [27] | 133276| 0|OBJT |LOCL |0 |18 |_END_ [51] | 132992| 0|OBJT |GLOB |0 |12 |_GLOBAL_OFFSET_TABLE_ [60] | 133156| 0|OBJT |GLOB |0 |14 |_PROCEDURE_LINKAGE_TABLE_ [26] | 65536| 0|OBJT |LOCL |0 |1 |_START_ [46] | 133260| 0|OBJT |LOCL |0 |16 |__CTOR_END__ [31] | 133256| 0|OBJT |LOCL |0 |16 |__CTOR_LIST__ [45] | 133268| 0|OBJT |LOCL |0 |17 |__DTOR_END__ [32] | 133264| 0|OBJT |LOCL |0 |17 |__DTOR_LIST__ [41] | 67284| 0|FUNC |LOCL |0 |8 |__do_global_ctors_aux [33] | 67136| 0|FUNC |LOCL |0 |8 |__do_global_dtors_aux [59] | 133272| 0|OBJT |GLOB |0 |17 |_edata [50] | 133276| 0|OBJT |GLOB |0 |18 |_end [49] | 133272| 4|OBJT |GLOB |0 |18 |_environ [61] | 67455| 0|OBJT |GLOB |0 |11 |_etext [57] | 133228| 0|FUNC |GLOB |0 |UNDEF |_exit [64] | 67408| 20|FUNC |GLOB |0 |10 |_fini [54] | 67388| 20|FUNC |GLOB |0 |9 |_init [62] | 67432| 4|OBJT |GLOB |0 |11 |_lib_version [48] | 67020| 116|FUNC |GLOB |0 |8 |_start [1] | 0| 0|FILE |LOCL |0 |ABS |a.out [37] | 0| 0|FILE |LOCL |0 |ABS |aaa.c [52] | 133204| 0|FUNC |GLOB |0 |UNDEF |atexit [28] | 0| 0|FILE |LOCL |0 |ABS |crti.s [47] | 0| 0|FILE |LOCL |0 |ABS |crtn.s [40] | 0| 0|FILE |LOCL |0 |ABS |crtstuff.c [30] | 0| 0|FILE |LOCL |0 |ABS |crtstuff.c [58] | 133272| 4|OBJT |WEAK |0 |18 |environ [53] | 133216| 0|FUNC |GLOB |0 |UNDEF |exit [36] | 67228| 0|FUNC |LOCL |0 |8 |fini_dummy [39] | 67260| 24|FUNC |LOCL |0 |8 |foo [35] | 133256| 0|OBJT |LOCL |0 |15 |force_to_data [43] | 133256| 0|OBJT |LOCL |0 |15 |force_to_data [34] | 67136| 0|NOTY |LOCL |0 |8 |gcc2_compiled. [38] | 67240| 0|NOTY |LOCL |0 |8 |gcc2_compiled. [42] | 67284| 0|NOTY |LOCL |0 |8 |gcc2_compiled. [44] | 67376| 0|FUNC |LOCL |0 |8 |init_dummy [63] | 67240| 20|FUNC |GLOB |0 |8 |main [56] | 133240| 0|FUNC |GLOB |0 |UNDEF |printf [29] | 0| 0|FILE |LOCL |0 |ABS |values-Xa.c
718 :
701 :2000/12/07(木) 14:15
アホだ...(結果を見てみて)
nmの出力結果貼付けは荒らしに近い行為をしているような気がする
つまり、言いたいことは、試してみた結果
[39] | 67260| 24|FUNC |LOCL |0 |8 |foo
と出力されている理由を知りたい
>>712 の主張では内部関数はシンボル・テーブルに出力されない
はずだよな?
719 :
701 :2000/12/07(木) 14:17
>>712 > システムに標準でついているはずの
> 「クイックビューア」によってエクスポートメンバ程度の情報は見れる。
> もっとマジで色々みるにはVC++付属のdumpbinユーティリティが便利。
ありがとう。
720 :
>715 :2000/12/07(木) 14:35
stripしろ。 -fpic オプションしらべろ。そして、-Sで、assemblerに落とせ。 .type aaaa@`@function とかあるだろ。それがexportされるんだ。 DoSアタックに近いものを感じるぞ
721 :
名無しさん@お腹いっぱい。 :2000/12/07(木) 14:53
むつかしい・・・・。むむむー。
722 :
701 :2000/12/07(木) 15:08
>>720 ありがとう、また1つ賢くなりました。
>>696 の結論としては
関数ポインタから関数名を取得することは
・外部関数ならば可能
・シンポル表が削除されていない場合ならば可能
・シンボル表が削除されていて、かつ内部関数の場合不可能
っていうことでいいんですよね?
ちなみに、710からの711@` 713以外のレスは同一人物ですよね?
罵声は飛び交いましたが、私はけっこう楽しんでました。
長い間、お付き合いいただきありがとうございました。
# さて、仕事するか...
723 :
712 :2000/12/07(木) 15:10
>>719 ありがとう、gccはデフォルトでシンボルが出力されるって
しらなかったよ。しかし、ちょっと経過を読み返してみてくれ。
あなたが一般論じゃないことを言ってることに変わりはないだろ?
ちなみにVCはデフォルトでそんなことしないぞ。
724 :
712 :2000/12/07(木) 15:26
>>722 私の発言は712から以降は723までないぞ。
世の中には物知りさんがいっぱいいるよ。
ほんと、謙虚な気持ちになるよ。
消えるといったが、もう1言だけいわせてくれ ccもデフォルトでシンボルが出力される cc@` gcc 共に-sオプションでシンボルが含まれない様にできるようだ > 世の中には物知りさんがいっぱいいるよ。 同感、改めて自分の知ったか厨房さ加減に嫌気が差した。 ちなみに698も私だったりする(バレていると思うが) また、これで名無しに戻るが、 まだまだ、Cマスターへの道は険しく遠いらしい... # なんか恥ずかしいことを言っているので sage
726 :
出題者 :2000/12/07(木) 16:03
私は、698に対してANSI標準と断言してしまいました。 みなさんどうもありがとうございました。
この板って結構、人がいるって事を今日知った・・・
728 :
出題者 :2000/12/08(金) 18:00
>>696 の回答って、
具体的にどうやったらできるんでしょ?
730 :
Cドキュソ :2000/12/09(土) 02:27
文字列として入力された数値をlongに変換したい。 POSIXでgccな環境だと定石はどういうことをするのだろう。
731 :
Cドキュソ :2000/12/09(土) 02:35
strolとか*scanf系か。 邪魔した。
732 :
名無しさん@お腹いっぱい。 :2000/12/11(月) 03:46
C言語である数Aの約数の個数を求めるプログラムは?
733 :
名無しさん@お腹いっぱい。 :2000/12/11(月) 04:00
a >= 1 としてこんな感じだな int func(int a){ int x; int f; int nf; x = 1; for(f = 2; f <= a; f++) { nf = 0; while (a % f == 0) { a /= f; nf++; } x *= (nf + 1); } return x; }
せめてfをループ回数にそのまま使うのは止めてくれ。 他の解法でバグがないかどうか調べるリファレンスとしてなら 文句はないが。
fじゃなくてaだな。スマソ。
736 :
名無しさん@お腹いっぱい。 :2000/12/11(月) 13:08
小さなmain.c(argv[]に複数ファイルを受付る)と 別のモジュールファイル(いろんな関数とそれらを使ってファイルごとの操作を実行する do_file()が入っている)をコンパイルしようとすると、 /tmp/ccgCDz8H.o: In function `main': /tmp/ccgCDz8H.o(.text+0x60): undefined reference to `do_file' collect2: ld returned 1 exit status とエラーがでます。 どういうことでしょうか? gccです。
ちなみにモジュールファイルである module.h と module.c のコンパイルは成功するのですが。
738 :
名無しさん@お腹いっぱい。 :2000/12/11(月) 13:23
>>736 -737
>module.h と module.c のコンパイルは成功するのですが。
module.hをコンパイルしてどうすんの?
なんか、コンパイルとリンクの区別がついていない気がする。
gcc main.c ccgCDz8H.c
↑ 別のモジュールファイル?
ってやるとどうなる?
>738 それで成功しました。 どうもです。
>>739 ほへー
成功すりゃそれでいいのか。大成せんぞー。
741 :
出題者 :2000/12/12(火) 17:56
>関数ポインタから関数名を取得することは >・外部関数ならば可能 >・シンポル表が削除されていない場合ならば可能 >・シンボル表が削除されていて、かつ内部関数の場合不可能 >っていうことでいいんですよね? この取得可能可否の堺の「アドレス」を求められる方いますか? 現在GDBのようなBackTrace実装中です。
742 :
初心者 :2000/12/19(火) 18:12
unsigned int rightrot(unsigned int x@` int n) (xのビットパターンを右にnだけ回転させた値を返す関数) をint型のビット数が未知の状態で実現する方法はないですか?
743 :
名無しさん@お腹いっぱい。 :2000/12/19(火) 19:01
>>742 unsigned int rightrot(unsigned int x@` int n)
{
int rot = sizeof(int) * 8 - n;
return (x >> n) | (x << rot);
}
こんなもんでいかがでしょ。
どうもありがとうです。
nがsaizeof(int)*8を超えてたときの処理も書いといた方がいいぞ エラーにするか割った余りをするかは用途次第だが
746 :
名無しさん@お腹いっぱい。 :2000/12/20(水) 21:47
>>743 「sizeof(int)*8」はまずいだろう。
1バイトが8ビットとは限らんからな。
オレが知っている範囲では、NECのメインフレームの
ACOS6アーキテクチャ(と、その元になった…何だっけ、
忘れた)は、1バイト=9ビットだぞ。
ANSI Cでも、1バイトのビット数は8ビット以上、としか
決まっていない。
こういう問題での基本は、「~0」ってやって、すべての
ビットを立てておいて、でビット数を数えるんだよ。
ヒントは出したから、あとは自分で考えてくれ > 742=744
これって、K&Rに載っている問題だよね。
747 :
名無しさん@お腹いっぱい。 :2000/12/20(水) 23:18
748 :
名無しさん@お腹いっぱい。 :2000/12/21(木) 00:35
perlで言うsplitみたいな便利関数はないんですか。
749 :
名無しさん@お腹いっぱい。 :2000/12/21(木) 00:35
perlで言うsplit見たいな関数はないんですが。
750 :
名無しさん@お腹いっぱい。 :2000/12/21(木) 00:46
処理系毎に独自のがある気がするが、 標準では無いから自分で作れ>748-749
751 :
名無しさん@お腹いっぱい。 :2000/12/21(木) 01:24
>748 strtokを使って自分で作る
752 :
65 :2000/12/21(木) 01:30
ちなみに今はしょうがないのでメモ帳モドキと、vi使ってます。
753 :
65 :2000/12/21(木) 01:30
まちがえました
754 :
749 :2000/12/21(木) 01:45
>751 そんな関数が。 これ使って自分でつくります。 なにぶんPerlで食ってきたもんでCなんざさっぱり。
>>754 おおっ、perlだけで食えるんですか?
侮れないですね。>perl
>>754 strtokは癖があるから気をつけて使え
処理系依存だがstrtok_rを使う手もある
757 :
奈々氏 :2000/12/21(木) 20:28
誰でも作れるけど、作るのがめんどくさいライブラリってあるじゃないですか。 (10進→16進文字列変換とか、あsprintfつかえばいいか) 誰かが作ってるんだろうなぁ。でも「誰か持ってません?」と聞くと 初心者っぽいしね〜。しょうがないわ、作ろう・・・ という自作関数をもっと公開する場がほしいんです。どっかないのかしら。
758 :
名無しさん@お腹いっぱい。 :2000/12/21(木) 20:35
>>757 汎用文字列ライブラリとか。
ゲームに特化したcursesラッパーとか。
サンデープログラマのコード投稿広場って感じかな。
759 :
名無しさん@お腹いっぱい。 :2000/12/21(木) 22:08
細かなことですが、型宣言(struct@` typedef@` 関数プロトタイプなど)を 行うとき、外部で行うのとなにかしらの関数の内部で行うのと 違いはあるのですか?
760 :
名無しさん@お腹いっぱい。 :2000/12/21(木) 22:24
質問です。 char a="aiuep"; char *s; で、sにaを代入するにはどうしたらいいのでしょう。
761 :
名無しさん@お腹いっぱい。 :2000/12/21(木) 22:30
>>760 質問です。
char a = "aiuep";
って何してるの?
762 :
名無しさん@お腹いっぱい。 :2000/12/21(木) 22:39
>>760 char* a="頑張ってね(はぁと)";
char* s;
s = a;
printf("a=%s@` s=%s\n"@`a@`s);
763 :
名無しさん@お腹いっぱい。 :2000/12/21(木) 22:43
>>759 スコープが違います…って、これだけだけど、何が疑問なの?
>>760 >char a="aiuep";
aの型はchar、"aiuep"の型はchar[6](結果的にはchar*)なので、
この宣言は文法違反。
>char *s;
sの型はchar*なので、型が違うのでsにaを代入することは出来ません。
char *a = "aiuep";
char *s;
s = a;
なら文法的には正しいけど、質問者の意図とは違うような気もする(藁
764 :
名無しさん@お腹いっぱい。 :2000/12/21(木) 22:51
>>760 Cには”文字列”型はありません、”文字”型しか無いんです。
だから、文字列を表すのに文字型の配列を使います。
で文字列型が無いから、Cの提供する演算子では代入できません。
文字型の配列10個を、文字型の配列10個に各代入する
には10回代入を繰り返す必要があります。
メモリの勉強をしてくださいね。
>>763 この回答どう?(^^)
765 :
名無しさん@お腹いっぱい。 :2000/12/21(木) 22:59
>762、763 どちらも僕が意図した通りの結果になりました。 どうもありがとうございました。
766 :
760 :2000/12/21(木) 23:07
765は僕です。 >764 ああ、なるほど。今わかりました メモリのデータを記憶する部分は一バイトごとにくぎられているんですね。 つまり1バイトづつ代入していか無ければならないんですね。
767 :
>764@`765 :2000/12/21(木) 23:28
How about this? struct string { data[MAX_STRING_LEN]; }; string aString={"aaa"}; string anotherString= aString;
>766 なんか違う、発想を変えてくれ。 文字も存在しない、文字コードとして数字があるだけ、 文字として扱えば文字になるというだけ、 0で区切って文字列として扱ってみようと誰かが決めただけ。
769 :
名無しさん@お腹いっぱい。 :2000/12/22(金) 23:20
int itoa(int kazu@` char s[]) { int i; if (kazu / 10 != 0){ i = itoa(kazu / 10@` s); s[i] = kazu % 10 + '0'; return (i + 1); } else return (0); } kazuを10進ストリングs[]に変換する再帰関数の問題ですが、 ラストに'\0'をitoa内で置いてしまう方法はないですか? それとも根本的に変えた方がいいですか?
>>769 この構造のままでやるならこれしか思いつかんかった。非効率的。
int itoa(int kazu@` char s[])
{
int i;
if( kazu / 10 != 0 ){
i = itoa(kazu / 10@` s);
s[i] = kazu % 10 + '0';
s[i+1] = '\0';
return (i + 1);
}
else
return (0);
}
てゆーかおい、ちと待て。修正。 else { s[0] = kazu%10 + '0''; s[1] = '\0'; return 0; }
>>769 再帰に入る前にバッファを'\0'でクリアしておく
ってのは、なしですか?
773 :
デフォルトの名無しさん :2000/12/23(土) 09:09
再帰を使うと順番を簡単に変えられる。 だから10進表示に再帰を使う事はある。 しかしこの場合はやってみた通りスマートにゆかない スマートじゃないのは格好悪い
774 :
デフォルトの名無しさん :2000/12/23(土) 10:22
>>769 Q1 最上位の値は表示しなくていいのか?
Q2 値ゼロの時無文字でもいいのか?
775 :
デフォルトの名無しさん :2000/12/23(土) 10:30
>>773 void PutItoa(int kazu)
{
if(kazu<0) {putchar('-');PutItoa (-kazu);}
else
if(kazu) { int div10=kazu/10;
if(div10)PutItoa(div10);
putchar('0'+(kazu % 10));
}
else {putchar('0');}
}
('-');
('0');
1: hensu = 4/3*r*r*r; 2: hensu = (4*r*r*r)/3; 1と2ではhensu変数の値が違うのですが、どうしてそうなるのですか?
779 :
名無しさん@お腹いっぱい。 :2000/12/24(日) 07:12
>>778 計算の順番が違うから。
4/3 は整数で計算するので 1 に成る。
1は 4/3*r*r*r = 1*r*r*r
2は最後に 3 で割ってるのでちょっと正確?な値になる。
>>779 うぁ、意味がわかりました。どうもです。
781 :
いそうろう :2000/12/25(月) 20:30
ウェイトをいれるときに int i; for(i=0; i< 100000; i++) {;} などとして@`実際に何秒(何マイクロ秒)とまるかを@` クロック数などから知る方法ってあります?
782 :
名無しさん@お腹いっぱい。 :2000/12/25(月) 20:42
最適化されてi=100000にされちゃいそう‥ なくなるかもな
783 :
名無しさん@お腹いっぱい。 :2000/12/25(月) 23:18
time.hのCLOCKS_PER_SECが一秒あたりのクロック数を示す そしてstruct tm clock_t clock( void )関数でプログラム が始まって何クロックたったか解る だから例えば10秒止めたいときには下のようにする clock_t a@` b; for( a = b = clock(); (b - a) <= (CLOCK_PER_SEC * 10) ;b = clock() );
784 :
名無しさん@お腹いっぱい。 :2000/12/25(月) 23:57
sleep 使えよ。 ループなんかしたらCPU無駄に使うだけだろ。 マルチタスクなんだから他のアプリのことも考えろよ。
785 :
名無しさん :2000/12/26(火) 00:21
C言語で2点間の距離を求めるプログラムを組みたいのですが、私にはくめません。 どうか、このプログラムを作れる方は作ってください。 お願いします。
786 :
名無しさん@お腹いっぱい。 :2000/12/26(火) 00:23
sqrt((x1-x0)^2+(y1-y0)^2)
中学生に聞け。
って'^'を書いてどうする。 鬱だ死のう
789 :
名無しさん :2000/12/26(火) 00:35
785です。 ^いらないの?
790 :
名無しさん@お腹いっぱい。 :2000/12/26(火) 00:48
sqrt((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)); ^はネット上で階乗を表すのに使う。 プログラムで使うとビット演算になる。
>>785 Xの2乗 + Yの2乗 = Zの2乗
ってのがあるじゃないですか
終点X - 始点X で幅が取得できる
終点Y - 始点Y で高さが取得できる
(eX - sX) * (eX - sX) + (eY - sY) * (eY - sY)
これでZの2乗の値が取得できる
あとはZの2乗の平方根を取れば2点間の距離 Z が取得できる
sqrt( (eX - sX) * (eX - sX) + (eY - sY) * (eY - sY) );
ちなみにC言語に^ってべき乗を求める演算子は無いです
powって関数がありますが
sqrt(pow(eX - sX@` 2) + pow(eY - sY@` 2));
792 :
名無しさん :2000/12/26(火) 00:53
785です。 どうもご親切にありがとうございます。 今からプログラムを組んでみます。
793 :
名無しさんおっぱい。 :2000/12/26(火) 01:28
あの C++のプログラムっていくらぐらいするんですか マイクロソフト から出てるやつ あと他のプログラムのソフト(JAVA、PERL等)はいくらぐらい でしょうか?
>>793 ガクセイ サン オッシャッテル コトガ ヨク ワカリマセン
モシカシテ
>M$カラ デテルヤツ
ッテ Visual C++ ノ コト?(Y/N?)
795 :
名無しさん@お腹いっぱい。 :2000/12/26(火) 04:07
私も三次元上の2点 p1(x1@`y1@`z1)@` p2(x2@`y2@`z2) を結ぶ直線と 任意の点 p3(x3@`y3@`z3) の距離を求めるプログラムを考えているのですが どうやって組んだら良いのかわかりません。教えてください。お願いします。
796 :
名無しさん@お腹いっぱい。 :2000/12/26(火) 04:10
2点を結ぶ直線は閉区間です。永遠に続く直線・・ではないのですが・・。
797 :
名無しさん@お腹いっぱい。 :2000/12/26(火) 04:12
>>795 そんなの無数にあるじゃん。
最短距離とか最長距離のこと?
798 :
795 :2000/12/26(火) 04:15
最短距離です。どうかよろしくお願いします。
799 :
名無しさん@お腹いっぱい。 :2000/12/26(火) 04:22
p1 と p2 を結ぶ直線と p3 をなんかの公式に当てはめれば解ける。 高校の三角比?でやったけどもう忘れた。 スマソ。
そろそろ数学の教科書読みましょうって話になりつつあるやうな気も。
801 :
名無しさん@お腹いっぱい。 :2000/12/26(火) 08:09
こういう機会に数学の教科書を読め。 効率と演算誤差を気にしなければ解けるだろう。っつーか、解けないなら 赤点でもとって、この業界に進むこと自体あきらめな。適性ないよ。
803 :
795 :2000/12/26(火) 17:33
皆さんありがとうございます。解けました。 1つの計算式で出せるみたいです。どうもお世話になりました。
804 :
>795 :2000/12/26(火) 17:40
え?1つの計算式で出るか? 3つの値を得てから大小比較せずに?
805 :
名無しさん@お腹いっぱい。 :2000/12/26(火) 20:08
はぁ〜。。高校の問題じゃん。
806 :
795 :2000/12/27(水) 06:02
求められますよ。>804さん
807 :
804 :2000/12/27(水) 17:51
うーん考えても判らん。教えてくれ。 どうやって線分の始点終点迄の距離の大小比較が消えるのかを
808 :
デフォルトの名無しさん :2000/12/27(水) 18:58
話を簡単に2次元として、rx@`dxの定義は例のページに合せて 1)直線迄 (rx*dy-ry*dx)/√(dx^2+dy^2) 2)始点迄 √(rx^2+ry^2) 3)終点迄 √(rx^2+ry^2 + dx^2+dy^2 + 2(rx*dx+ry*dy) この3つの一番小さいのを選ぶ必要がやはりあると思うが?
809 :
デフォルトの名無しさん :2000/12/27(水) 20:32
810 :
デフォルトの名無しさん :2000/12/27(水) 20:49
>>809 あまりにも丸投げじゃないかい?
もうちょっと絞ってそこだけコピペして聞くとか
汎用な問題にするとか
811 :
>808 :2000/12/27(水) 20:49
「線分」と「点」の距離だから、確かに場合分け要りそうな気がするけど 一番小さいの選んだらダメなんじゃない?
812 :
808=804 :2000/12/27(水) 21:05
え?だって点と線分迄の距離でしょ? 何か根本的な勘違いしてるのかな俺?
813 :
デフォルトの名無しさん :2000/12/27(水) 21:32
線分の延長線上に点があったら、 直線との距離0がいちばん小さくなってしまうんじゃなかろうか。
世の中、こんなバカばかりなのか? 点と直線の距離は、点pから直線lにおろした垂線の足点hと、点pの距離だ。 中学の算数もできないのがこんなにうじゃうじゃいるとは、なげかわしや。
815 :
809 :2000/12/27(水) 21:58
>>810 すいません。。
とりあえず、引数のdir=foo が使えるように、
src/parse.c
の690行らへんに
else if (mystrncasecmp(keyword@`"dir"@`3) == 0)
{
safeStrcpy(digit_info->datadir@`value@`
sizeof(digit_info->datadir)-1);
Debug2("sizeof(digit_info->datadir)=%d"@`sizeof(digit_info->datadir)@`0);
}
をいれて、
src/main.c
にDATA_DIRと、digit_info.datafile
の間にdigit_info.datadir をはさむようにして、
とりあえずmakeしてみたら、
parse.c: In function `ParseQueryString':
parse.c:995: structure has no member named `datadir'
parse.c:996: structure has no member named `datadir'
parse.c:997: structure has no member named `datadir'
make[1]: *** [parse.o] Error 1
とエラーが出てしまいました。
変えたソース全部コピペするわけに行かないし、どうしましょう。
816 :
808 :2000/12/27(水) 22:11
>>818 なるほど、一番小さい値ではダメですね。了解しました
817 :
デフォルトの名無しさん :2000/12/27(水) 22:18
>>809 datadirが構造体に無いって言ってるじゃん?
なんかその技量じゃそういう改造は止めた方がいいぞ
df=sample.dat&dir=foo という引数をもらったら
df=foo/sample.dat
に変換してからそいつを呼ぶ方が早い
818 :
809 :2000/12/27(水) 22:42
最初は、その方法で出来て、そのまま行こうと思ったんですけど、 df=../../../foo/hogehoge/hoge.dat とかされちゃったら困るな…と思って、、 df= に .. が含まれたらエラーにすること出来ます?
819 :
デフォルトの名無しさん :2000/12/27(水) 23:42
820 :
デフォルトの名無しさん :2000/12/27(水) 23:42
っていうかキミが答えを書け。
821 :
名無しさん@お腹いっぱい。 :2000/12/27(水) 23:59
ファイル操作の方法を教えてください。 Aファイルの中身をBファイルにコピーして、 Bファイルを読めないように暗号化したいのですが、 色々試してみたのですが、なかなかうまくいきません。 どうかよろしくお願いします。
822 :
名無しさん@お腹いっぱい。 :2000/12/28(木) 00:09
>>821 Aを開いてメモリにコピー。
メモリ上のデータを暗号化。
Bを開いて保存。
どこがうまくいかないの?
暗号化のアルゴリズム?
823 :
デフォルトの名無しさん :2000/12/28(木) 00:12
自分のインクルードしてるヘッダファイルがどこにあるのか 分かりません。中身を見たいのですが、どうやったら逆に 辿れますか? あるいはOSはsolarisです。カシコ
ヘッダファイル部分をダブルクリック。
825 :
795 :2000/12/28(木) 00:23
>807 >どうやって線分の始点終点迄の距離の大小比較が消えるのかを >813 >線分の延長線上に点があったら、 >直線との距離0がいちばん小さくなってしまうんじゃなかろうか。 >814 >点と直線の距離は、点pから直線lにおろした垂線の足点hと、点pの距離だ。 813@`814さんの言葉に気づいたら、答えは出たようなものです。
826 :
名無しさん@お腹いっぱい。 :2000/12/28(木) 00:32
>>822 メモリ上のデータを暗号化。
です。
dat[i] = ndat[i] ^ (BYTE)0xFF;
ってやってますが、なぜかうまくいきません…
>>826 それってテキストファイル?
テキストファイルだとビット反転させると制御文字になったりしてうまくいかない。
バイナリなら別の部分が間違ってる。
828 :
デフォルトの名無しさん :2000/12/28(木) 00:53
テキストファイル以外でも変換させたいので、 バイナリでやりたいのですがすが、どう修正すればいいのでしょうか?
ファイルを開いたり保存したりするときにバイナリモードでやれば大丈夫。
830 :
デフォルトの名無しさん :2000/12/28(木) 01:09
>>829 それはどうやるんですか?
すいません。その方法知らないんです…
fopenのヘルプを見ろ。
832 :
BCB使ってたんで、fopen使ってなかったんですよ。 :2000/12/28(木) 01:31
+bをつけるだけで良かったんですね。 おかげでうまくいきました。 どうもありがとうございます。
usleepが起きてくれない事があるのですが、何かバグ報告って 有りましたっけ? OSはSunOS 5.6 なんですけど。
834 :
808 :2000/12/28(木) 10:41
話を簡単に2次元として、rx@`dxの定義は例のページに合せて 線分の長さ L= √(dx^2+dy^2) 線分延長上の投影点C= (rx*dy+rx*dy)/L やっぱり判断は必要で 0<=C<=Lの時 (rx*dy-ry*dx)/L 0> Cの時 √(rx^2+ry^2) C>L ようは3角公式で面倒なので略 CとLの代わりに L'= (dx^2+dy^2) C'= (rx*dy+rx*dy) として同じ条件分けが使える まだミスがある? 判断無くせる?
835 :
808 :2000/12/28(木) 10:51
×(rx*dy+rx*dy) ○(rx*dx+ry*dy) ようは内積ね
836 :
808 :2000/12/28(木) 11:00
結局 1)まず線分の長さ2乗を求める L'= (dx^2+dy^2) 2)線分の一方を始点として 内積C'=(rx*dy+rx*dy) 3)C'>L'になるならもう一方を始点に変更して2)を求める 4)C'>=0 なら 帰り値(rx*dy-ry*dx)/√L' 5)でなけば 帰り値√(rx^2+ry^2)
837 :
808 :2000/12/28(木) 13:02
動作チェックしたが正しく判定してるようだ dx=x1-x0; dy=y1-y0; L2=dx*dx + dy*dy; rx=px-x0; ry=py-y0; C2=rx*dx + ry*dy; if( L2 < C2 ) { rx= px-x1; ry= py-y1; C2=-(px*dx + py*dy); } if (C2<0) return sqrt(rx*rx+ry*ry); else return fabs(rx*dy-ry*dx)/sqrt(L2);
微妙に836@`837と微妙にミスを混入してるのはワザ?
839 :
名無しさん@お腹いっぱい。 :2000/12/28(木) 14:01
だれか推移的包括曲線のアルゴリズム教えてください。
840 :
デフォルトの名無しさん :2000/12/28(木) 14:24
841 :
デフォルトの名無しさん :2000/12/28(木) 14:32
包括=>包絡としてもまだ意味が判らない
842 :
初心者 :2000/12/28(木) 23:42
関数呼び出しはなんであんなにオーバーヘッドを伴うんですか? アセンブラレベルでみれば変数をスタックにプッシュして ジャンブ命令かましているくらいだと思うんですが、 何かすごい処理でもしているんでしょうか?
>842 なんでだろうね!不思議だよね!
メモリアクセスとジャンプだから。
845 :
名無しさん@お腹いっぱい。 :2000/12/29(金) 00:47
>>842 安物の低メモリPCだとアドレスジャンプのときにページングが起こるからだろ。
そそ、ぢつはスタックに書き込むのは重いんだよ
847 :
デフォルトの名無しさん :2000/12/29(金) 00:52
C++を使っているのにfstreamを使わずに fopenを使う方が多いですが 何かfopenの利点があるのでしょうか?
848 :
デフォルトの名無しさん :2000/12/29(金) 01:11
>>847 ・C使いでも理解できる。
・古いC++環境でも動作する。
これくらいか?
C++ならどっちにしろ、そのまま使うんじゃなくてラップするのがベターだと思う。
849 :
デフォルトの名無しさん :2000/12/29(金) 01:39
>>847 これは全く実装系による話だと思うが、俺が以前試した時は、
stdioの方がはるかに効率が良かった。特に1文字入出力系の
getc/putc <--&gt; get/put
の差が顕著。試してみるのは簡単なのだから、試してみると
いいだろう。
ただし、上の差の多くは、getc/putcが昔ながらのマクロで
実装されていることに依存しており、thread-safeな実装
では効率はあまり変わらないだろう。例えばVC++のLIBCでは、
MT版かどうかで5倍以上の性能の差があったと記憶している。
>808さん 私とは少し計算方法が違いますが、やり方はほぼ同じようです。 簡単な ? 演算子を含む数式になりました。厨房な質問でしたごめんなさい。
851 :
デフォルトの名無しさん :2000/12/29(金) 10:44
フリーでお勧めコンパイラあります?
852 :
デフォルトの名無しさん :2000/12/29(金) 12:23
dcl@` direct-dclって何ですか?
853 :
847 :2000/12/29(金) 23:26
>>848 なるほど
古いC++環境だとfstreamが動作しないことがあるんですね。
>>849 Windows2000 C++Builder5で、getc@`putc/get@`putを試してみました。
getc@`putcの方がかなり効率が良かったです。
848さん、849さん
どうもありがとうございました。
854 :
デフォルトの名無しさん :2000/12/30(土) 14:19
UNIX C で exit(2) に引数に渡す値の範囲は 決まっているのでしょうか? 子プロセスが exit(2) によって終了した場合に wait(2) で取得できる情報は 上位8ビットに exit(2) の引数に指定した値が設定されるとあります。 8ビット(0〜255)の範囲でないといけないのでしょうか? 256としたら0と同じ扱いなのでしょうか?
855 :
デフォルトの名無しさん :2000/12/30(土) 15:23
mallocで取得したメモリを、別のスレッドでfreeで解放しようとすると エラーがでるのですが、なぜでしょうか?教えてください。
856 :
デフォルトの名無しさん :2000/12/30(土) 16:02
enum token {NAME@` CHAR@` STRING@` NUMBER@` COMMENT@` PRE_PROCESS}; と関数の外側で宣言すると tree1.c:18: two types specified in one empty declaration とエラーが出ます。 どういう意味でしょうか?
解決しました。どうも。
858 :
デフォルトの名無しさん :2000/12/30(土) 19:08
質問です。 newptr = realloc(ptr@` newsize); でメモリの伸縮に失敗した場合、以前のメモリ(ptrの指している領域)はどうなるのでしょう? ・ptrの指している領域も破棄されている。 ・ptrの指している領域は残っている。よって、後でfreeで破棄する必要がある。 処理系毎に異なっていたらやだなあ…
859 :
逆立楯突 :2000/12/30(土) 19:16
860 :
858 :2000/12/30(土) 20:48
859さんありがとうございます。 859のリンクにあるコードは、 1つの実装というわけじゃないのですか? Cの標準委員会で決定してるのかなあ… 処理系(cl gcc tccなど)のマニュアルに失敗時の動作が詳しく載ってないもので。 確認する方法があれば良いんだけど… とりあえず後者の方針で組むことにしました。
861 :
>>860 :2000/12/30(土) 22:43
失敗したらデータが消えてしまうより、元のデータは 残っていた方がいいだろうと普通の人は考えると思います。
862 :
>>860 :2000/12/31(日) 02:51
realloc()に失敗したら元の領域は解放されるなんてことは書いていないと思うが。
863 :
858 :2000/12/31(日) 06:18
>>862 えーと、realloc(ptr@` 0)がfree(ptr)と同等って仕様でなんか、引っかかって。(笑
864 :
>>863 :2001/01/01(月) 01:01
だったら処理系のマニュアルなんか読まずにJIS CなりISO Cの仕様書読めば?
必ずしも処理系が規格書に従っているとは限らないからなあ。 処理系の作られた時期にも依るし。 まあ、realloc程度なら大丈夫かな?
866 :
デフォルトの名無しさん :2001/01/01(月) 01:50
それなら自分で realloc 定義したらいいじゃない。>865
そうするよ。
868 :
初心者 :2001/01/01(月) 18:52
CではK&Rの、"プログラミング言語C 第2版"が絶大な評価を得ていますが、 C++でこれに当たるような大御所書籍はないですか?
870 :
名無しさソ :2001/01/02(火) 06:17
BCBをBCCのように使用することはできますか? "HELLO WORLD"などの、練習用プログラムを学ぶことはできないのでしょうか? あくまで、GUI? もしやり方わかったら教えてください。
871 :
デフォルトの名無しさん :2001/01/02(火) 12:40
>>870 BCB5の話しだけど
新規作成 -> コンソールウィザード -> コンソールアプリケーションにチェック
これじゃないかな?
872 :
864 :2001/01/03(水) 12:17
realloc()の再割り当てサイズが0の場合の動作は処理系定義。 ANSI Cなら7.10.3あたりに書いてあるから気になるなら読め。
あんたしつこいね。(藁>872 もう気にしないよ。
次に質問したい人は新スレを パート2で たてて下さい。
875 :
デフォルトの名無しさん :2001/01/04(木) 15:38
mprobe関数とは何かわかりません。教えてください。
876 :
デフォルトの名無しさん :2001/01/04(木) 15:40
char *path; /* the pretty path to display */ char *upath; /* the pretty path tolower'd for searching */ char *fpath; /* the full path for accessing the file */ この意味と違いを教えてください。
877 :
デフォルトの名無しさん :2001/01/04(木) 15:41
スレたてるのはもうちょい後にします。
>>876 char *path; /* (ファイル名として)表示する文字列 */
char *upath; /* 検索用に、path を小文字化したもの */
char *fpath; /* ファイルアクセス用の、フルパス */
879 :
デフォルトの名無しさん :2001/01/06(土) 00:22
わからないことがあるので、教えていただきたいんですが、C言語を勉強 しようと思って、BORLAND55をダウンロードしたんですが、インストール できたのかわからないんです。泣いてしまいそうです・・・ 出来ていたとしても、使い方がわからないんです。(×_×;)シュン 使い方を最初から詳しく教えていただきたいのですが・・・ おねがいします。
880 :
卒研迷い中 :2001/01/06(土) 20:45
ご教授頂きたいのですが C++で動的にメモリ確保するnew演算子において 多次元(必要としているのは3次元)配列の確保の仕方がわからないのです int **pp; pp = new int*[ROW]; for(int i = 0; i < ROW; i++) pp[i] = new int[COL]; のように2次元まではよく方法が載っているのですが 応用をキかそうとして自分でがんばってもうまくいきません 何卒宜しくお願いします
881 :
デフォルトの名無しさん :2001/01/06(土) 22:15
NR式ならこうだ. Type*** p; p = new Type** [nx]; p[0] = new Type* [nx*ny]; p[0][0] = new Type [nx*ny*nz]; for( iy=1; iy<ny; iy++ ) p[0][iy] = p[0][iy-1]+nz; for( ix=1; ix<nx; ix++ ){ p[ix] = p[ix]+ny; p[ix][0] = p[ix-1][0]+ny*nz; for( iy=1; iy<ny; iy++ ) p[ix][iy] = p[ix][iy-1]+nz; } コピーやファイル書き込みでは上のより良いぞ. bad_allocは適当に対処すれ. 同じやり方で8次元でもできる.
882 :
卒研迷い解消♪ :2001/01/07(日) 06:12
ありがとーございますー♪ 助かりました
883 :
デフォルトの名無しさん :2001/01/07(日) 20:08
3.00 0.65 1.00 3×3行列:A= 0.65 5.00 1.60 1.00 1.60 7.00 0 初期ベクトル:X0=0 1 そしてX0の成分@`0.0.1のうち絶対値をつけた状態で 最大の数|1|でX0を割った行列とAをかけます。 つまりA*(X0/|1|)です。 これをX1=A*(X0/|1|)として以下繰り返し、 X0/|1|@`X1/|?|@`X2/|?|・・・を繰り返し33回目まで 表示させるプログラムを作っていただきたいのです。 ちなみに0回目は0@`0@`1 繰り返し1回目は0.1428571429@` 0.2285714286@` 1 2回目は0.21004 @` 0.37766 @` 1 になります。 僕の作ったプログラムではうまくいきません。 何卒よろしくお願いします。
>883 どこがC言語と関係あるんだ。 放置。
885 :
>883 :2001/01/07(日) 20:52
つーか、問題が間違ってるんじゃないのか? その問題ではその答えは出ない。
886 :
SAGE :2001/01/07(日) 20:56
動くかどうかすら試してないが。 int i; double a[3][3] = { 3.00@` 0.65@` 1.00@` 0.65@` 5.00@` 1.60@` 1.00@` 1.60@` 7.00 }; double x[3] = { 0.00@` 0.00@` 1.00 }; double y[3]@` z; for( i=0; i<=33; i++ ) { z = fabs(x[0])>fabs(x[1]) ? (fabs(x[0])>fabs(x[2])?fabs(x[0]):fabs(x[2])) : (fabs(x[1])>fabs(x[2])?fabs(x[1]):fabs(x[2])); y[0] = x[0] / z; y[1] = x[1] / z; y[2] = x[2] / z; printf( "%d: (%f@` %f@` %f )\n"@` i@` y[0]@` y[1]@` y[2] ); x[0] = a[0][0] * y[0] + a[0][1] * y[1] + a[0][2] * y[2]; x[1] = a[1][0] * y[0] + a[1][1] * y[1] + a[1][2] * y[2]; x[2] = a[2][0] * y[0] + a[2][1] * y[1] + a[2][2] * y[2]; }
>>883 君は問題を誤読してる。
X1 = A * X0 / ( X0 の最大成分 ) だと、 X1は 1@`1.60@`7.00 になる。
X1 = A * X0 / ( A * X0 の最大成分 ) ならその答えになるけどね。
888 :
885 :2001/01/07(日) 21:09
スマン。問題を見間違ってたぜ。 表示するのはX0/|1|@`X1/|?|@`X2/|?|なのな。 変な問題。 鬱だ氏
俺もだ(藁
890 :
デフォルトの名無しさん :2001/01/07(日) 22:07
891 :
デフォルトの名無しさん :2001/01/07(日) 22:54
890さんありがとうございました。 よく読んで頑張ってみます。 本当にありがとうございました。(^ー^)
892 :
883 :2001/01/07(日) 23:31
すみません。問題が分かりにくかったかもしれませんね。 ちなみに僕が作ったプログラムはこれです。 うまく動きませんが・・・。 #include<stdio.h> #include<math.h> #define N 3 void main(void) { float A[N][N]@`X[N][100]@`c[N][100]; int i@`j@`k@`z; for(i=0;i<N;i++) { for(j=0;j<100;j++) { X[i][j]=0; } } for(i=0;i<N;i++) { for(j=0;j<100;j++) { c[i][j]=0; } } for(i=0;i<N; i++) { for(j=0;j<N;j++) { printf("A[%d@`%d]="@`i+1@`j+1); scanf("%f"@`&A[i][j]); } } for(i=0;i<N;i++) { printf("X[%d]="@`i+1); scanf("%f"@`&X[i][0]); } for(j=0;j<33;j++) { if(abs(X[2][j])>abs(X[1][j])&&abs(X[2][j])>abs(X[0][j])) { for(i=0;i<N;i++) { c[i][j]=X[i][j]/(abs(X[2][j])); } } if(abs(X[1][j])>abs(X[0][j])&&abs(X[1][j])>abs(X[2][j])) { for(i=0;i<N;i++) { c[i][j]=X[i][j]/(abs(X[1][j])); } } if(abs(X[0][j])>abs(X[2][j])&&abs(X[0][j])>abs(X[1][j])) { for(i=0;i<N;i++) { c[i][j]=X[i][j]/(abs(X[0][j])); } } for(i=0;i<N;i++) { for(k=0;k<N;k++) { X[i][j+1]+=A[i][k]*c[k][j]; }} printf("V=%d"@`j); printf("\n"); for(i=0;i<N;i++){ printf("%12.10f "@`X[i][j]);} printf("\n"); }} /* for(s=1;s<6;s++){ for(t=0;t<N;t++) {e[i][0]=0; for(k=0;k<N;k++) { e[t][0]+=A[t][k]*c[k][0];}} printf("V=%d \n"@`s+1); for(i=0;t<N;t++) printf("%12.10f "@`c[t][s]); printf("\n"); } }
886さんありがとうございました。 今886さんのをもとにして、プログラム完成しました。 レスしてくださった方々、多少混乱を招いてしっまたようで 申し訳ありませんでしたが、皆さんには本当に感謝しています。 ありがとうございました。
894 :
YOUQ :2001/01/10(水) 08:35
ご存じの方お願い致します。 ファイルシステムの操作プログラミング例 (ディレクトリ削除ファイル削除)が紹介されている サイトが有りましたら教えてください。
>>896 そうだったな スマン
しかし、少なくともWin系かUnix系か教えてくれないと
答えられないな
898 :
デフォルトの名無しさん :2001/01/11(木) 11:50
だれか100行でゲーム作ってください。
899 :
?f?t?H???g??????? :2001/01/11(木) 11:57
誰か、簡単でおもしろいプログラムを教えてください。
900 :
デフォルトの名無しさん :2001/01/11(木) 21:14
文字ではなく文字列を配列に入れるのはどうやったらいいのですか?
901 :
デフォルトの名無しさん :2001/01/11(木) 21:18
つまり c[]={'*sage@`*age@`*2chan} っていうふうにする方法を教えてください。'
902 :
900 :2001/01/11(木) 21:45
つまり文字列へのポインタを配列として格納していきたいのです。 よろしくお願いします。
>>900 char* example1[] = {
"何をやりたいのか"@`
"良く分からんが"@`
"これで満足か?"
};
char frac1[] = "それとも";
char frac2[] = "いちいち";
char frac3[] = "独立に定義しておいて";
char* set[] = { frac1@` frac2@` frac3 }; // ...とでもやりたいのかい?
904 :
デフォルトの名無しさん :2001/01/12(金) 06:28
>>900 char c[3][] = { "sage" @` "age" @` "逝ってよし" };
905 :
デフォルトの名無しさん :2001/01/12(金) 07:42
なんか面白い質問ない?
>>900 > 文字列を配列に入れる
例
>>904 ことと
> 文字列へのポインタを配列として格納
例
>>903 ことは同じようでいて少し違う事は覚えておいた方がいい
907 :
デフォルトの名無しさん :2001/01/12(金) 11:23
簡単なゲームのプログラムを教えてください。
908 :
名無しでGO! :2001/01/13(土) 10:39
main(){int a=rand();int b;printf("input number>");scanf("%d"@`&b);if(a==b)puts("atari-");else puts("sineya gorua");}
本で見ておもしろそうだと思って、このプログラムを実行したのですが、 そのためにはこの(印刷)プログラムに自分自身のプログラムを与えな きゃいけないみたいなのですが・・・(何分にもお馬鹿なもので、)その 仕方が具体的にわからないのです・・・。教えてください、お願いします! 長くてごめんなさい…(どこで省略したらいいのかわからないんです;><;) /* double column print */ #include <stdio.h> #define LL 80 #define COL 2 #define CSIZE LL/COL-9 #define PL 60 #define MARGIN 3 char buff[COL] [PL] [CSIZE]; int ln[COL] [PL]; int col@` l@` p; main(argc@` argv) int argc; char *argv[ ]; { int p; for (p=1; p<argc; p++) dprint(argv[p]); } dprint(fname) char *fname; { FILE *fp; int line@` c; if ((fp=fopen(fname@` "r"))==NULL) return; line = 0; p = 0; l = 0; col = 0; c = getc(fp); while (c!=EOF) { ln[col] [l] = ++line; while (c!='\n' && c!=EOF) { if (p>=CSIZE) { nextline(): ln[col] [l] =0; } buff[col] [l] [p++] = c; c = getc(fp); } nextname(); if (c!=EOF) c = getc(fp); } while (col!=0 | | l!=0) { ln[col] [l] = 0; nextname(); } fclose(fp); } nextline() { while (p<CSIZE) buff[col] [l] [p++] = ' '; if (++l>=PL) { if (++col>=COL) { printout(); col = 0; } l = 0; } p = 0; } printout() { int l@` i@` lpos@` col@` d@` p; char line[LL]; for (l=0; l<MARGIN; l++) putchar('\n'); for (l=0; l<PL; l++) { for (i=0; i<LL; i++) line[i] = ' '; lpos = 0; for (col=0; col<COL; col++) { d = ln[col] [l]; p = lpos+4; while (d>0) { line[p--] = d%10+'0'; d = d/10; } p = lpos+7; for (i=0; i<CSIZE; i++) line[p++] = buff[col] [l] [i]; lpos += CSIZE+9; } p = LL; while (p>= && line[p-1] ==' ') p--; for (i=0; i<p; i++) putchar(line[i]); putchar('\n'); } for (l=0; l<MARGIN; l++) putchar('\n'); }
えぇ〜っと、これは↑文字列ファイルの内容を1ページに2列ずつ印刷するって言うプろグラムなんですけど。・・・ ほんとに困ってます・・・お願いします(;><;)
?あんま読んでないけど >プログラム名 2 ファイル名 でいいのでは。
違った
>プログラム名 ファイル名 かも俺も初心者なんで許して
914 :
デフォルトの名無しさん :2001/01/13(土) 16:47
VC初心者ですが、 string str; int count = 20; sprintf((char*)str.c_str()@` "%d"@` count); ってコードが、あった場合MFCベースの場合は 問題ないんですが、コンソールだと落ちます。 なんででしょう? 気になったもので。
>>914 プログラムが間違っているから。
MFCベースで堕ちないのは「たまたま」。
std::string の c_str() により返されるポインタ
(の指す領域)には勝手に書き込んでは
いかんのです。だから const char*で返されるのに、
それを無理矢理キャストして書込みに使おう
としているのが、間違い。
916 :
>915 :2001/01/13(土) 17:23
string str; int count = 20; sprintf(&str.at(0)@` "%d"@` count); この場合も落ちますが、 この場合は、なんででしょう?
そろそろ新スレに移る頃合だね。 ビル・ジョブスともお別れか。なんだか悲しいな。
>>916 んーと。
sprintfの第一引数の型がchar*であるというのは、
何でもいいから型がchar*であればいいというものではなくて、
フォーマットした結果を書き込むためのバッファ(つまり
charの配列)のアドレスをよこせという意味なのだ。
&str.at(0)で、std::stringの内部バッファのアドレスが
得られるように思うかも知れないが、std::stringの内部
バッファはstd::stringの実装の詳細であって、このような
方法で内部バッファを直接いじることは保証されていないし、
いろいろと問題が生じることになるから、やってはいけない。
内部バッファを配列として保持している保証も無いしね
(大概の実装ではそうなっているだろうが)。
std::string::at()は、あくまで1文字だけを参照・変更する
のに使ってよいインターフェースなのだ。
この例の場合、実際に堕ちる直接の原因は、確保したばかりの
std::stringオブジェクトでは十分なサイズの内部バッファ
が確保されていないからであろうが、さしあたりは
std::string::at()の間違った使用をしたからだと思って良い。
すなおにテンポラリのcharの配列を用意してsprintf後に
strに代入したまえ。
919 :
914 :2001/01/13(土) 18:10
やっぱり、そうするしかないんですね。 良く分かりました。 ありがとうございました。
920 :
914 :2001/01/13(土) 18:17
うーん。 いままで、作った関数はすべて string::c_str()をキャストして作ってしまった・・ 書きかえないと・・
921 :
デフォルトの名無しさん :2001/01/14(日) 13:11
>914 std::stringを返す関数を作るなら, sprintf()で使ったバッファのポインタをreturnするといい. #std::stringのコピーコンストラクタを利用してるわけね.
922 :
デフォルトの名無しさん :2001/01/14(日) 13:49
すみません。質問です。 main() { int i; char c[20]; for(i=0;i<5;i++){ printf("c[%d]="@`i); scanf("%c"@`&c[i]); } } このプログラムを実行すると@`例えばa@`b@`c@`d@`eと入力しようとすると c[0]=a c[1]=c[2]=b c[3]=c[4]=c という風になってしまうのですが、どこがおかしいのでしょうか?
924 :
デフォルトの名無しさん :2001/01/14(日) 14:06
>922 scanfが改行コードを飲み込んでしまうからだ. つまり,'a',ENTERキーと続けて入力すると c[0] = 'a'@` c[1] = 改行コード が入ることになる. もしUnixであれば,文字を入力した後にCtrl+Dでバッファを フラッシュしてやれば期待通りの動作が得られるだろう. 一般的にはfgets()で行バッファに読み込み, sscanf()やatoi()@` atoif()@` str系の関数で解釈する.
925 :
デフォルトの名無しさん :2001/01/14(日) 17:10
>>914 よかったら使いたまえ。
#include <cstdarg>
using namespace std;
string Format(string format@` ...)
{
&nbsp;&nbsp;&nbsp;va_list argptr;
&nbsp;&nbsp;&nbsp;va_start(argptr@` format);
&nbsp;&nbsp;&nbsp;char *buffer;
&nbsp;&nbsp;&nbsp;int size = 256;
&nbsp;&nbsp;&nbsp;buffer = new char[size];
&nbsp;&nbsp;&nbsp;while(_vsnprintf(buffer@` size - 1@` format.data()@` argptr) == -1){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete [] buffer;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size *= 2;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer = new char[size];
&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;string ret = buffer;
&nbsp;&nbsp;&nbsp;delete [] buffer;
&nbsp;&nbsp;&nbsp;va_end(argptr);
&nbsp;&nbsp;&nbsp;return ret;
}
926 :
925 :2001/01/14(日) 17:12
忘れてた、先頭に、 #include <string> #include <cstdio> を入れるように。
927 :
デフォルトの名無しさん :2001/01/14(日) 17:33
次に質問したい人は新スレを パート2で たてて下さい