2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

C言語の事訊いて!!!第.38支部

1 :隊員NO.1919072 ◆rhAfp.iLoU :02/10/27 23:38
C言語の質問スレッド38発目だよ。
それはそうと君もC言語隊員になろう!!

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

・前スレ <36>
http://pc3.2ch.net/test/read.cgi/tech/1035211039/

コンパイラ、過去ログなどのリンクは>>2-5 あたり


2 :デフォルトの名無しさん:02/10/27 23:39
2


3 :隊員NO.1919072 ◆rhAfp.iLoU :02/10/27 23:39
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.redhat.com/software/tools/cygwin/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/

【ライセンスや機能などに問題あり】
Microsot C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html


4 :デフォルトの名無しさん:02/10/27 23:39
4げとずさ

5 :隊員NO.1919072 ◆rhAfp.iLoU :02/10/27 23:40
【その他】
http://www.cmt.phys.kyushu-u.ac.jp/~M.Sakurai/prog/progf.html
http://www.bloodshed.net/index.html

【注意】
Cmachineは一般的なCと挙動が違いすぎるので動作の保証はできません。
まともな処理系を使いましょう。

1間違えた。隊員失格だね・・・

<前スレ(37支部)>
http://pc3.2ch.net/test/read.cgi/tech/1035623265/

6 :Void ◆XHOW.zla5c :02/10/27 23:42
改訂第4版 ANSI C対応 はじめてのCはどうなの?と言ってみる罠。

7 :デフォルトの名無しさん:02/10/27 23:43
即答できる質問をかけ

8 :デフォルトの名無しさん:02/10/27 23:44
で、結局C99の話題はありなのか?

9 :デフォルトの名無しさん:02/10/27 23:44
ついに、”オレ様”の名前がなくなっちゃったね。

10 :デフォルトの名無しさん:02/10/27 23:45
なぜCのポインタ周りの仕様は複雑ですか?

11 :デフォルトの名無しさん:02/10/27 23:46
>>10
どこが?

12 :デフォルトの名無しさん:02/10/27 23:46
プリプロセッサはCの機能の一部ですか?

13 :隊員NO.1919072 ◆rhAfp.iLoU :02/10/27 23:47
ああ、みんなごめんね。
前スレのリンクが、前々スレになってるよ・・・

ぐへぁ!

14 :デフォルトの名無しさん:02/10/27 23:47
>>8
有りだが、個人的にはC99に特化した書き込みなら
そのように前置きしてほしい。

15 :デフォルトの名無しさん:02/10/27 23:47
質問ですけど、c = (char)c;って(以下略

16 :デフォルトの名無しさん:02/10/27 23:47
C#とJava の違いを教えてください。

17 :デフォルトの名無しさん:02/10/27 23:48
>>15
(以下略

18 :デフォルトの名無しさん:02/10/27 23:53
>>12
一部だが、前処理として実行されるため、Cの文法解釈を無視している。

19 :デフォルトの名無しさん:02/10/27 23:53
c=(char)c;の目的って結局なんだったの?
char文字列と比較するために単にint→charにしただけ?

20 :デフォルトの名無しさん:02/10/27 23:53
>>8
あなたの好きにしていいのよ。
>>9
そうですね。
>>10
あなたには複雑に感じるのかも知れません。
>>12
はい、ただし C コンパイラの一部ではありません。
>>16
残念ながらスレ違いです。

21 :デフォルトの名無しさん:02/10/27 23:56
windowsで環境変数の値を取得したいのですがどうすればいいのでしょうか?


22 :12:02/10/27 23:57
>>18 >>20
分かりやすい解答をサンクスコ

23 :デフォルトの名無しさん:02/10/27 23:59
>>21
「C」 では getenv() を使ってください。
環境依存の話では、Windows で動く多くの処理系が main() の第三引数 envp
をサポートしているのでそれを走査してください。

24 :21:02/10/28 00:07
>>23
ありがとうございます。試してみます。

25 :デフォルトの名無しさん:02/10/28 00:11
>>19に答えてくれんか。
もしchar文字列と比較するために型をそろえただけなら
なぜあんな論争になったのかがわかんないんだよ・・・

26 :デフォルトの名無しさん:02/10/28 00:12
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
printf("%d\n" , __argc);

return 0;
}

どうしてこれで動くのでしょうか?

27 :デフォルトの名無しさん:02/10/28 00:13
strchrの引数が絡んでるんじゃ無いの?

28 :デフォルトの名無しさん:02/10/28 00:15
>>26
動きませんが

29 :デフォルトの名無しさん:02/10/28 00:15
>>24
まんま、19 の通り。
なぜそんな事をしているかと言えば、規格で引数が int なのに 「char に変換された値」
と明記されているから。

30 :デフォルトの名無しさん:02/10/28 00:16
アンダーバー二つは何かあったっけ?

31 :デフォルトの名無しさん:02/10/28 00:16
>>25
c = (char)c;
の c が int 型ってのは分かってる?

32 :デフォルトの名無しさん:02/10/28 00:17
>>25
それだけ。
論争の原因はたぶん、なくても動く処理系が多いから不要と考える人が多かったからかな。

33 :26:02/10/28 00:17
環境はWindows2000です。

34 :デフォルトの名無しさん:02/10/28 00:19
>>26
VC++ を使ってますね?
__argc は <stdlib.h> でコソーリ定義されています。
何に使っているのかはよくわかりません。

何にせよ、これは C の規格に無い事なので __argc を使っては逝けません。

35 :デフォルトの名無しさん:02/10/28 00:20
>>33
ウィソ厨は(・∀・)キエロ!!!

36 :デフォルトの名無しさん:02/10/28 00:25
>>25
charがsignedな処理系でも
strchrx("aアa", 0xb1); 
がちゃんと'ア'にヒットするかどうか。

37 :デフォルトの名無しさん:02/10/28 00:27
>>34
激しくコンパイラ依存の話ですまんが、
GUIアプリはエントリポイントがWinMain()だからだろうね。
BCCでも同じようなグローバル変数が用意されていたと思う。

38 :デフォルトの名無しさん:02/10/28 00:35
>>25
規格で決まってるからという理由以外で説明するなら、
36が書いてるように、charの最上位ビットが1になるような
文字の場合に、それが負の数値で渡されても正の数値で渡されても
対応できるようにするため
というのが一番の目的だろうね。
(他に charで表現できない整数がcharに切り詰められるというのもあるね)

39 :デフォルトの名無しさん:02/10/28 01:26
あるヘッダファイルに
typedef unsigned int bit_16;
が記述されていて、
Cのソース
void main(bit_16 argc, byte *argv[])
{
}
と記述されている場合、このCソースファイルをどうすれば
コンパイルできるのでしょうか。コンパイラにヘッダファイルの
置き場所を指定すれば良いのでしょうか。

40 :デフォルトの名無しさん:02/10/28 01:26
char *c="chinko"

先頭アドレスしか入ってないはずなのに、
printfするとちゃんとchinkoと表示されるのはなぜですか?
普通に考えると、cとしか表示されないはずです。

もう一度聞きます。
なぜポインタ周りの仕様は複雑ですか?

41 :デフォルトの名無しさん:02/10/28 01:29
>>40
デンパですか?

42 :デフォルトの名無しさん:02/10/28 01:31
>>40
・・・・・・・

43 :デフォルトの名無しさん:02/10/28 01:33
char型の配列でしょう?chinkoは。
int型の配列であれば、先頭だけしか表示されなかったはずです。
しかしchar型はcだけでなくchinkoまでちゃんと表示されるのです。

もう一度聞きます。
なぜポインタ周りの仕様は複雑ですか?

44 :デフォルトの名無しさん:02/10/28 01:35
単に、
>printfするとちゃんとchinkoと表示されるのはなぜですか?
に答えればいいんじゃないすかね。皆さんがんばってください。

45 :デフォルトの名無しさん:02/10/28 01:45
>>43
> しかしchar型はcだけでなくchinkoまでちゃんと表示されるのです。

cしか表示されません。なんででしょうか?
char *c="chinko";
printf("%c", *c);

46 :デフォルトの名無しさん:02/10/28 01:47
s

47 :デフォルトの名無しさん:02/10/28 01:55
>>39
ソースファイルと同じ場所に置いておけば、
#include "そのヘッダー.h"
で取り込める。

ソースファイルと同じ場所に置いておくことができない場合は、
#include "フルパスのそのヘッダー.h"
で取り込める。

48 :デフォルトの名無しさん:02/10/28 02:16
>>39
多くのコンパイラにはオプショナルなヘッダファイルの場所を指定するための
コマンドラインオプションとして -I がある


49 :279:02/10/28 02:23
発言しようと思ったけど叩かれそうなのでやめました。

50 :デフォルトの名無しさん:02/10/28 02:25
>>49
叩かれて人は強くなる。どんどん発言しなさい。

51 :デフォルトの名無しさん:02/10/28 02:36
>>40
関数にポインタを渡したとき、普通にポインタが渡されます。
関数に配列を渡したとき、その配列の最初の要素へのポインタが渡されます。
だから char c[]="chinko"; でも char *c="chinko"; でも、 printf("%s", c)
には結局 "chinko" の c へのポインタが渡されます。

一方 printf() では、"%s" が渡されると対応する引数をポインタとして受け取り、
'\0' を検出するまでそのアドレスからその次のアドレスへと、ひたすら次々に文字を
出力していくのです。

だから表示は c ではなく chinko になります。

ポインタ周りはあなたにとっては難しいのかも知れませんね。
printf() の動作もよく研究して下さい。

52 :デフォルトの名無しさん:02/10/28 02:36
ポインタ周りはあなたにとっては難しいのかも知れませんね。
printf() の動作もよく研究して下さい。

>>43
「int型の配列であれば、先頭だけしか表示されなかったはずです」 とは、何を
表現したかったのでしょう。
int c[]="chinko"; ではエラーになりますし、int c[]={"chinko"}; でも c[0] に
"chinko" へのポインタが格納されます。
これは、おそらくあなたの意図した初期化ではないでしょう。

int c[]={'c','h','i','n','k','o','\0'}; なら c[] の要素要素ごとにそれぞれの
文字の値が入ります。
int の内部表現は少なくとも 16-bit が保証されていますから、c[0] == 0x0063 のよ
うになるでしょう。
しかし、この値がメモリ上に 00 63 と格納されるか 63 00 と格納されるかは処理系
依存です。
もし後者 (ビッグエンディアン) ならあなたの言う通り c だけが表示されますが、
もし前者 (リトルエンディアン) でかつ char が 8bit であれば、何も表示されない
可能性もあります。

ところで、char 型と言ってしまっているのは char 型の配列の事ですよね?
一方、char の配列やポインタは >>前 で述べた通り、'\0' が見つかるまで次々と
走査して行きますので、c だけで途切れることも無く chinko と表示されるのです。

なお、int 型の配列であれば絶対に chinko と表示されないような口ぶりですが、
int が 32bit、char が 8bit でリトルエンディアンの処理系の場合に、
int c[]={ 0x6E696863, 0x00006F6B }; printf("%s", c); は chinko を表示しますが
何か?
まあ、これは処理系依存の、ほんのお遊びですが、いずれにせよあなたの 「int型の配列
であれば、先頭だけしか表示されなかったはずです」 という仮定は成り立ちません。

ポインタ周りに加えて変数初期化周りも、あなたにとっては難しいのかも知れませんね。

53 :デフォルトの名無しさん:02/10/28 02:36
>>45
あなたの試したコード printf("%c", *c); を見てみましょう。
まず *c は、c が指しているアドレスにある、char 型のデータを表します。つまりこの
場合、文字 c です。

一方 printf() では、"%c" が渡されると対応する引数を文字データとして受け取り、
その 1 文字だけを出力します。

だから表示は chinko ではなく c になります。

あなたも >>40 と同じく、ポインタ周りと printf() の動作を研究するべきです。

54 :デフォルトの名無しさん:02/10/28 02:40
>>53
>>45はネタだろ。

55 :デフォルトの名無しさん:02/10/28 02:42
>>54
メ(略

56 :デフォルトの名無しさん:02/10/28 02:45
>>54


57 :51-53:02/10/28 02:51
すこし肩が凝ってしまいました・・・。

58 :54:02/10/28 02:55
正直、すまんかった。

59 :45:02/10/28 02:57
あはは。ネタにネタレスされちゃった。
でも
> しかし、この値がメモリ上に 00 63 と格納されるか 63 00 と格納されるかは処理系
> 依存です。
> もし後者 (ビッグエンディアン) ならあなたの言う通り c だけが表示されますが、
> もし前者 (リトルエンディアン) でかつ char が 8bit であれば、何も表示されない
> 可能性もあります。

ここまでネタ書かなくてもいいのにね。

60 :51-53:02/10/28 03:04
自分で改めて見返すと、そう秀逸でもない。
どっかにポロありそうだ。

>>59
まあネタだから許して。

61 :デフォルトの名無しさん:02/10/28 03:06
カッコワリィ

62 :45:02/10/28 03:09
>>60
いや、あれだけの長文で「ツッコミどころがない」ような文章は
なかなか書けるものではない。正直、間違い探しに苦労しました。

63 :デフォルトの名無しさん:02/10/28 03:13
ディスクファイルってなんですか?
高水準出力関数は、OSとの間にバッファを持ち、プログラムではこのバッファとの間で
データの入出力を行うイメージになります。このバッファはOSが管理し、自動的に
“ディスクファイル”とデータの入出力を行います。
という使われ方してんねんけど、ディスクファイルだけ意味わからん。
マルチになりますがお願いします。

64 :デフォルトの名無しさん:02/10/28 03:16
63 マルチ放置

65 :デフォルトの名無しさん:02/10/28 03:17
>>63
> マルチになりますがお願いします。
意味わかって言ってる?

66 :51-53:02/10/28 03:20
>>62
ツッコミどころと言うと、52 の頭 2 行が余計だとか、51 へのリンクを貼る
つもりが >>前 のままだったとか・・・

67 :デフォルトの名無しさん:02/10/28 03:21
>>63
そのくらいぐぐれや

68 :デフォルトの名無しさん:02/10/28 03:23
>>65
ええ、過去スレにも書きましたし、スレ立てるまでも…にも書いたんでマルチになるかと。
でも過去スレに書いたんはここが新スレって気がつかんかったんです。
スレ立てるまでも…には答えがないのでこっちに来たと言うことです。せっかちなんで。

69 :51-53:02/10/28 03:24
>>63
ここの 「マルチポスト 」 はお読みになりましたか?
http://www.geocities.co.jp/SiliconValley/5634/t82DC_0004.html#555

70 :デフォルトの名無しさん:02/10/28 03:25
>>69
ここは2ちゃんねるですよ。

71 :51-53:02/10/28 03:27
ヽ(´ー`)ノ

72 :デフォルトの名無しさん:02/10/28 03:29
>>70=>>68=>>63
どっちだ?
・ 調べ方が分からない
・ そもそも自分で調べるつもりは全く無い

73 :デフォルトの名無しさん:02/10/28 03:32
70は俺じゃねー。いちおー調べてみたけど単語としてディスクファイルってでてるだけで
意味は書いてなかった。ここならさくっと答えてくれるかなと思ったんやけど
そんなに難解なことなんかな?

74 :デフォルトの名無しさん:02/10/28 03:41
漏れらに難解なのはディスクファイルという用語ではなく、
73 が 69 の忠告を無視したり 72 の質問を無視したりする根拠だ。
第一、2 ちゃんねるをなんだと思ってる?

つーか難解だと思わないなら自分で調べてみれ。

75 :デフォルトの名無しさん:02/10/28 03:42
>>73
ここは2ちゃんねるですよ。

76 :デフォルトの名無しさん:02/10/28 03:44
c = (a < c++) ? y * c : c++;
このコードが未定義でないという理由がわからないので教えてください

77 :デフォルトの名無しさん:02/10/28 03:46
>>74
2ちゃんねるはやりたいことを好き勝手やるとこに決まってんじゃん。
なにか疑問があったときに言葉巧みに答えを引き出したりするけどね。

78 :デフォルトの名無しさん:02/10/28 03:49
>>77
> なにか疑問があったときに言葉巧みに答えを引き出したりするけどね。

なるほど。
> ここならさくっと答えてくれるかなと思ったんやけど
> そんなに難解なことなんかな?
これが「言葉巧み」に該当するわけね。


79 :デフォルトの名無しさん:02/10/28 03:50
77 が哀れだ・・・
2 ちゃんねるは単なる媒体で、書き込みを行っているのは日本中 (世界中?) の
人間だ。
その面前で堂々と 「2ちゃんねるはやりたいことを好き勝手やるとこに決まってん
じゃん」 なんて言い放つとは・・・。

80 :デフォルトの名無しさん:02/10/28 03:51
あーわかった、わかった。そんなに怒んなや、別に69の忠告は無視してないで、
今度から気をつけよーおもてるし、72の解答としては「調べてみたけど分からんかった」
ってことになるかとおもたんや。


81 :デフォルトの名無しさん:02/10/28 03:51
ちょっとまて77は俺ちゃうぞ。


82 :デフォルトの名無しさん:02/10/28 03:56
>>79
匿名掲示板で言ってるの?

83 :デフォルトの名無しさん:02/10/28 03:57
>>76
それ、(a < c++) は問題無いけど、それが偽だった場合に
c = c++; と等価になるからまずくないか?

84 :82:02/10/28 03:57
「何」が抜けちゃったよ。
正しくは、匿名掲示板で何言ってるの? ね。

85 :デフォルトの名無しさん:02/10/28 03:58
>>82
ある程度の好き勝手はいいけど、悪質が過ぎるならアクセス禁止食らうよ。

86 :85:02/10/28 03:58
>>82
あと、匿名なら相手のことは全く考えないで (・∀・)イイ!! とでも?

87 :73 ◆GRRPdDaVH. :02/10/28 04:01
>>74
とりあえず気を悪くしたんなら誤ります、すみませんでした。

88 :デフォルトの名無しさん:02/10/28 04:01
アクセス禁止ってただ単に俺(と同じプロバイダの奴?)が2ちゃんねるに
アクセスできなくなるくらいだろ。
別に2ちゃんねるにアクセスできないなら出来ないで問題ないし。
どうしてもアクセスしたかったらプロバイダ変えればいいだけだし。
その程度じゃなんの問題も無いね。

89 :デフォルトの名無しさん:02/10/28 04:03
>>83
持ってる本に (a < c++) のあとに副作用完了点があるから
問題ないとだけ書いてあるんです。で、自分も偽だったとき
まずいのではと思ったんです。
一応試しに a = 100 c = 1 で if (a < c++) c = y * c else c = c++;
をやると未定義ですが3になり、三項演算子のは2になりました。

90 :デフォルトの名無しさん:02/10/28 04:03
>>86
そんなに言いたいなら俺以外の相手のことは全く考えてない奴全員に言ったら。
2ちゃんねるはそんな奴ばかりだから苦労するだろうね。

91 :デフォルトの名無しさん:02/10/28 04:05
>>80
指摘されなきゃ反省のそぶりも見せないなら、そりゃあ怒るわさ。
でもすまん漏れもいい気になってた、確かに検索だとなかなか出てこないな。

しかし、ディスクファイルって文字通りディスクに格納されたファイルの事
なんだが、想像つかなかったか?
他に、メモリファイルとかあるわけだが。
検索で単語は引っかかったみたいだけど、それがどう使われているかで何と
なく感じ取れなかったか?
考えてね。

後、マルチポストがいけない理由はちゃんと理解した?
それは、あなたが恥をかくからじゃないよ。
より多くの人に迷惑というか手間をかけるから、しかもどこか 1 ヶ所で
答えが見つかったら他の探してた人の苦労が水の泡になるからだよ。
「スレ立てるまでも…」 の方では、ちゃんと質問を個のスレに写した事を
明記してきた?

92 :デフォルトの名無しさん:02/10/28 04:06
>>91
ここは2ちゃんねるですよ。

93 :デフォルトの名無しさん:02/10/28 04:08
88 って超迷惑野郎じゃないか?

94 :73 ◆GRRPdDaVH. :02/10/28 04:09
>>90
最低やな、匿名性が高いから言うてそんなこと言うとったら私生活で隠してても
いつかボロがでて痛い目みるやろ。

95 :デフォルトの名無しさん:02/10/28 04:09
どうもこのスレに、63 をはるかに凌ぐ迷惑野郎がいるようだな。

96 :デフォルトの名無しさん:02/10/28 04:09
>>91
いい人だな。俺だったらこんな奴には絶対答えたくない。

97 :91:02/10/28 04:13
>>96
91 の冒頭の通り、漏れにも落ち度があったからな。詫び。
でなかったらやっぱり答えないよ。

98 :73 ◆GRRPdDaVH. :02/10/28 04:14
>>91
レスくれてありがと。
なんとなくの予想はついてても、初心者やからちゃんとした知識身につけたいと
思ってて確証が欲しかった。

99 :デフォルトの名無しさん:02/10/28 04:15
>>93
迷惑野郎ですよ。いや女かもしれないけどね。
2ちゃんねる以外でこんなことする奴は痛い目見るでしょうね。
私はしませんけど。

>>94
楽しみですね、その日が。まあ例えそうなってもあなたは私が痛い目を
見たことを知ることは無いでしょうが。匿名ってのは不便ですね。

100 :97:02/10/28 04:16
あと、どうも話が通じそうだったからな。
でなきゃ何書いても無駄だし。

101 :デフォルトの名無しさん:02/10/28 04:17
>>88
わざわざそんなレスしないといけない程2ちゃんねるが重要なのか。。。

102 :デフォルトの名無しさん:02/10/28 04:17
あれっ。もしかして俺のおかげで答えが得られたのかな? 俺っていい奴じゃん。

103 :100 get したけど:02/10/28 04:18
99 には話が通じそうも無いな。

104 :デフォルトの名無しさん:02/10/28 04:19
>>101
ん? 俺が面白いから書き込んでるだけだけど。

105 :89:02/10/28 04:21
雑談やめて、俺の質問が流されちゃったよ。
あんなコード書かないだろうから、そんなに切実でもないけど。

106 :デフォルトの名無しさん:02/10/28 04:22
>>99
というより、匿名掲示版で暴れないといけないって時点ですでにかなり
痛い状態になっているような。

107 :73 ◆GRRPdDaVH. :02/10/28 04:23
>>99
いつかは分からなくても、お前がいつか痛い目見るだけでうれしいわ。
お前が自分の本性隠そうと必死に生きてる姿を想像するだけでもうれしいわ。

108 :83:02/10/28 04:23
>>105
悪い見失ってた。
そうだな、未定義かどうかわからない不気味なコードは書く事は無い。

109 :デフォルトの名無しさん:02/10/28 04:25
>>105
ごめんね。雑談ってのは一人じゃ出来ないんだ。
全部相手が悪いんだよ。俺は悪くないよ。



別に俺が悪者扱いされようがここだけの話だし知ったことじゃないが。

110 :91:02/10/28 04:26
漏れは、2 ちゃんねるそのものはそんなに大事だと思わないが、ここに
集まってくる人はそれなりに応対しないとあかんと思う。
前にも出たけど、2 ちゃんねるは単なる媒体で、その向こう側は生の人間
なんだからな。
しかし、少しばかりその例外を作らないといけないようだ。

111 :デフォルトの名無しさん:02/10/28 04:28
109 は匿名なので誰が謝っているか全くわからない罠

112 :デフォルトの名無しさん:02/10/28 04:28
>>107
本性? 本性ってのは本来のすがたってだけで本性が悪いとは限らないんだよね。
ここでの姿が仮の姿で本性はいい奴だよ。すでに本性ばればれだけどね。

113 :デフォルトの名無しさん:02/10/28 04:28
>>109
いえ、こっちこそすいませんでした。つい取り乱して。

114 :デフォルトの名無しさん:02/10/28 04:30
112 は hiloshi

115 :デフォルトの名無しさん:02/10/28 04:33
>>110
少しばかりの例外って何? 匿名性を低くするって事?
それには俺も賛成だ。2ちゃんねるはマナーが悪い奴が多すぎる。
俺の仮の姿みたいにな。もっと平和な所にしてほしいよ。

116 :デフォルトの名無しさん:02/10/28 04:33
月曜日のこの時間に書き込んでるのは2〜3数人だろうから、、
さて、誰と誰が同一人物でしょう?

117 :デフォルトの名無しさん:02/10/28 04:33
お前らいい人だな。でも常識のないアホは放置というか、
せいぜい心の中で憐れむくらいでいいんだよ。
相手にするのは時間の無駄。

118 :デフォルトの名無しさん:02/10/28 04:36
>>116
70と75と77と82と84と88と90と92と99と102と109と112と115が俺

119 :デフォルトの名無しさん:02/10/28 04:37
>>117
その通り。ここは2ちゃんねるだしな。

120 :デフォルトの名無しさん:02/10/28 04:37
>>115
2ちゃんねるはもともと平和な所じゃなくて喧嘩上等な所。

121 :73 ◆GRRPdDaVH. :02/10/28 04:37
>>112
匿名性が高いとこで出てくるのが本性や、そんなんもわからんか?
それとも分裂症か?

122 :110:02/10/28 04:40
>>115
いや、匿名性が多少下がってもそんなに意味無いのはメーリングリスト等で
実証済みだし。
完全実名制でもないと。
そうでなくて、人にはそれなりに誠意もって応対すべき、ただし一部の誰かさんは
きっぱり無視すべき、って事。

>>116
5 人はいただろ、1 人は去ったようだが。
ま、大差ないか。
ROM はもうちょっといるだろう。

123 :デフォルトの名無しさん:02/10/28 04:41
>>115
2 ちゃんねるのどの規約にそんな事書いてあった?
たまに、ローカルルールで許可されている板はあるものの。

124 :デフォルトの名無しさん:02/10/28 04:42
>>120
煽りと荒しは違う。
中には目的もなく煽ってるやつもいるが。

125 :123:02/10/28 04:42
スマソ 120 宛て。

126 :デフォルトの名無しさん:02/10/28 04:42
>>122
なんつーか農水大臣みたいなお人だ

127 :122:02/10/28 04:44
>>126
そーなの?

128 :デフォルトの名無しさん:02/10/28 04:45
>>123
規約以前にいろいろな板を見ていればわかるだろ。
規約がすべてで現状認識ができていないのでは。

129 :デフォルトの名無しさん:02/10/28 04:46
>>119
( ´,_ゝ`)プッ

130 :デフォルトの名無しさん:02/10/28 04:46
>>120
そうそう。だから喧嘩上等な場所通りの行動をしているまで。
でもいやだよ。本性は。

>>121
匿名性が高い所で出てくるのが本性ってことは
匿名性が低い所では本性じゃないのかな? あなたは。
匿名性が高いここで本性を出しているってことは、匿名性が低いリアルではどんな奴なんだか。

131 :デフォルトの名無しさん:02/10/28 04:47
法律以前にいろいろな事件を見ていればわかるだろ。
法律がすべてで現状認識ができていないのでは。

( ´,_ゝ`)プッ

132 :デフォルトの名無しさん:02/10/28 04:47
>>128
誤爆

133 :デフォルトの名無しさん:02/10/28 04:49
>>130
これはあなたか?

99 :デフォルトの名無しさん :02/10/28 04:15
 >>93
 迷惑野郎ですよ。いや女かもしれないけどね。
 2ちゃんねる以外でこんなことする奴は痛い目見るでしょうね。
 私はしませんけど。

134 :デフォルトの名無しさん:02/10/28 04:50
128 はモラルが無いんだねえ・・・
131 の比喩を見ればよくわかるよ。

135 :デフォルトの名無しさん:02/10/28 04:51
いいからお前ら一部のアホは放置しとけよ。
なんでわざわざ煽りに反応してやるんだ?

ここはCの話題を扱うスレだぞ。


136 :デフォルトの名無しさん:02/10/28 04:51
まぁ、あれだ。
匿名性が高い状態でチンポ出すやつもいれば、親の前でチンポ出すやつもいるってことだ。


137 :デフォルトの名無しさん:02/10/28 04:51
モラルなど煮ても焼いても食えないものは捨ててしまえ

138 :73 ◆GRRPdDaVH. :02/10/28 04:51
>>117
いや、そんなことは無いぞ。確実にいやな気分になるかムカついてるはずや、
根拠は
>>本性? 本性ってのは本来のすがたってだけで本性が悪いとは限らないんだよね。
>>ここでの姿が仮の姿で本性はいい奴だよ。すでに本性ばればれだけどね。
ここに書き込んでるのは仮の姿でほんまの自分じゃないって言っとる。
つまり、仮の姿の自分が虐められててほんまの自分は虐められてないってことにしとる。
何でそうせなあかんか?それはほんまの自分が傷つくからやろ。
そうやって仮の姿に現実逃避してても無駄やぞ、さっきも言うたけど今のお前がほんまのお前。
自分で気がついてないだけや




139 :デフォルトの名無しさん:02/10/28 04:53
つーかね。ひろゆきだっけ? 2ちゃんねるの管理人。嵐とか偽の情報とか
そんなのをちゃんと管理するなら俺も悪者ぶったりしないって。
疲れたので消えるよ。いや逃げるよ。いい暇つぶしになった。
今までお付き合いくださってありがとうございます。

140 :デフォルトの名無しさん:02/10/28 04:53
だいだい何故スレ違いが延々と続いているんだ?

CスレならCスレらしくしろ。

141 :デフォルトの名無しさん:02/10/28 04:54
136 がいい事言った。
134 や 138 もそろそろ放置にしてくれ。

142 :デフォルトの名無しさん:02/10/28 04:57
>>138
お前も頼むからもう書きこまないでくれ。冷静になってくれ。
マルチな質問を親切な住人に答えてもらったこのスレを
いつまで荒らす気だ?

143 :デフォルトの名無しさん:02/10/28 04:57
>>139
スレ違いの話を延々と引っ張って己を正当化して逃げる貴方、ステキです

144 :デフォルトの名無しさん:02/10/28 04:58
>>143
つっついてみたい気持ちはわかるが、140 とかの気持ちも考えてやれ。

145 :73 ◆GRRPdDaVH. :02/10/28 04:59
>>142
それ言われたら弱いな。最後にあんたに謝辞させてくれ。

146 :デフォルトの名無しさん:02/10/28 05:03
じゃ、誰かお口直しにCのネタきぼーん
といきたいところだが、今日はもう眠いので寝るか

147 :デフォルトの名無しさん:02/10/28 05:07
未解決の >>76 なんかどうよ?

148 :デフォルトの名無しさん:02/10/28 05:12
( ゚д゚) ポカーン

149 :デフォルトの名無しさん:02/10/28 05:33
strchr(const char *str, int c)の実装について
c=(char)c;が何故必要?->c&=0xffではダメ?->ビット切り取りだと問題が出る事がある。
(char = signed char,int = signed intな環境と仮定)
int c = 0xFFFFFFB1を渡す時
cの上位ビットを切り取ると0x000000B1---------------------[A]
文字列中の文字*strのint昇格後取りうる値0xFFFFFF80-0x0000007F
(charはint型に昇格されて比較される,その際「符号は保持」する。)
マッチする筈の元のiの値0xFFFFFFB1がstrに入っていても[A]の為にはじかれる。
以上の理由でビット切り取りではダメ。
->しかし上記の論は「c=(char)cが必要である事の理由」では無い。
->ではchar,intをsigned,unsignedの各場合について分けて考えてみる。

変換前のint cと変換後(c=(char)c;を行った後)のc(混同を防ぐためc'とする) 比較
signed char,signed intな環境:∀c,-127<c<128でc'=cとなる
unsigned char, unsigned intな環境:∀c,0=<c<256でc'=cとなる
signed char,unsigned intな環境:0=<c<128はc'=c,128=<c<256ではc'が大きな値になる。
unsigned char, signed intな環境:∀c,0=<c<256でc'=cとなる

signed char,unsigned intな環境でかつ、128=<c<256な場合,cとc'に違いがある訳だが
この時c=(char)cがある場合と無い場合ではどのようになるか考えてみる。
無い場合: cは128=<c<256の値をとる。比較時でも当然128=<c<256の値,
    一方*strはchar(signed char)であり整数への拡大が適用される。
    この時-127=<*str<0なる*strは非常に大きな正の値に変換される為
    c=*strであった筈の値でも合致しない事となる。
有る場合: 128=<c<256なるcはc=(char)cで非常に大きな正の値に変換される。
    比較において意図した結果が得られる.
    (変換前のint c(128=<c<256)に対応する*str(-127<=*str<0)中の値)
よってc=(char)c;はchar=signed char,int=unsigned intな環境で128=<c<256 なcの値の時必要。


150 :デフォルトの名無しさん:02/10/28 06:00
> int=unsigned intな環境

はあ?ネタでつか?


151 :デフォルトの名無しさん:02/10/28 06:01
char以外はみんなデフォルトでsignedと決まっているね。

152 :デフォルトの名無しさん:02/10/28 06:01
>>149
全く的はずれ。
charがsignedかunsignedかは処理系依存だが、intはsignedであることが保証されてる。
さらに、intは最低でも16bitだがそれを全く考慮してない。
まあ、そんなことはどうでも良くて・・・なんだこりゃ!
前スレもう一回読んで見ろ。
それと壮大なネタか?

153 :デフォルトの名無しさん:02/10/28 06:05
シフトで、signedなら算術シフトにunsignedなら論理シフトになると規格で決めてほしかった・・・
あれって処理系依存なんだよな〜

Cで確実に算術シフト(または論理シフト)をする方法ってあります?


154 :デフォルトの名無しさん:02/10/28 06:09
確かにイタいな。というか単なる符号拡張の話を
よくもこんなにゴチャゴチャと書けるな。

155 :デフォルトの名無しさん:02/10/28 06:13
>>153
確実に論理シフトしたいのなら、最初っからunsignedでやればいい。
だが、算術シフトは、移植性のある方法ってあるんだろうか。

156 :デフォルトの名無しさん:02/10/28 06:14
>>155
unsignedなら論理シフトになるというのは規格では決まっていないはず・・・

157 :デフォルトの名無しさん:02/10/28 06:20
>>156
unsignedなら必然的に論理シフトになると思うのだが・・・

158 :デフォルトの名無しさん:02/10/28 06:21
>>157
漏れもそう思う。

159 :デフォルトの名無しさん:02/10/28 06:23
算術シフトは加減乗除でなんとかしる!

160 :デフォルトの名無しさん:02/10/28 06:25
>>149
> c&=0xffではダメ?->ビット切り取りだと問題が出る事がある。

比較の両辺とも処理すれば問題なし。

161 :デフォルトの名無しさん:02/10/28 06:36
signedを論理シフトしたいなら、単にキャストすればいいだけでないの?
int n = -1;
n = (unsigned)n >> 1;

なんかはずしてる?

162 :デフォルトの名無しさん:02/10/28 06:39
>>161
合ってるけどそれは155の言ってることに含まれてるはず。

163 :デフォルトの名無しさん:02/10/28 09:12
printf("signed char\n");
printf("int c(-1); %x\n", -1);
printf("c(変換後); %x\n", (signed char)-1);
printf("int c(0xff); %x\n", 0xff);
printf("c(変換後); %x\n", (signed char)0xff);
printf("*str(元の値): ff\n");
printf("*str(比較時): %x\n", (int)-1);
printf("unsigned char\n");
printf("int c(-1); %x\n", -1);
printf("c(変換後); %x\n", (unsigned char)-1);
printf("int c(0xff); %x\n", 0xff);
printf("c(変換後); %x\n", (unsigned char)0xff);
printf("*str(元の値): %x\n", 0xff);
printf("*str(比較時): %x\n", (int)0xff);
一旦charとして妥当な値に直してやってそれをまた比較の為符号拡張するのか。
なんとか分かった。


164 :デフォルトの名無しさん:02/10/28 12:16
argc/argvの処理って普通はどんな風に書くものなのでしょうか。
書籍ではargcの数を数えることしかしてないし。
getopt()はなんか機能不足な気もしますし。

フリーソフトウェアのソースを読むほどの技量がないので
どなたかごきょうじゅくだはい

165 :デフォルトの名無しさん:02/10/28 13:14
記念ぱぴぽ

166 :デフォルトの名無しさん:02/10/28 13:37
argc は引数の数をチェックする為に使う。
argv は引数を取得する為に使う。

テキストファイルをコピーするプログラム fcopy.c について考えると、
Usage: fcopy "input filepath" "output filepath"
として、
/* fcopy.c */
#include <stdio.h>
int main(int argc, char *argv[])
{
  FILE *fin, *fout;
  /* argc を利用した引数の数をチェックする */
  if (argc != 3) {
    fprintf(stderr, "引数が足りません\n");
    return 1;
  }
  /* argv で任意のファイル名を使ってファイルオープン */
  fin = fopen(argv[1], "r");
  fout = fopen(argv[2], "w");
  /* ファイルコピー処理 */
  fclose(fin);
  fclose(fout);
  return 0;
}
argc, argv は、こんな感じで使います。

167 :166:02/10/28 13:38
>>164に対してのレスね。ごめん

168 :デフォルトの名無しさん:02/10/28 16:24
>>164
自分で面倒見るのならこうやってやるかなあ。
プログラムの機能によって全然変わっちゃうけど、いつもはこうしてる。
つうかいつもはunix前提なんでgetopt使っちゃうけど(w
argvをいじっちゃうのであまりよくないスタイルではある。
int main(int argc, char **argv)
{
 while (*++argv) {
  if (*argv[0] == '-') { /* スイッチの処理 */
   char *p;
   for (p = *argv + 1; *p; p++) {
    switch(*p) {
    case 'a':
     :
    }
   }
  }
  else { /* ファイルの処理 */
   :
  }
  :
}
ただこれだと'-'で始まるファイル名は扱えない。

169 :164:02/10/28 18:00
レスありがとう。参考になります。

なかなか穴の無い処理が書けなくて
悩んでたんですが、ある程度
端折っちゃって大丈夫ですよね。
考えすぎでしたスマソ

170 :デフォルトの名無しさん:02/10/28 18:32
今本読んでたら、

「Cでは配列の後に[]をつけずに、配列名だけ単独で書くと
配列の先頭要素へのポインタとみなす」
っていうのは間違いだ( ゚Д゚)ゴルァ!

って書いてたんだけど、ほんとうですか?

171 :アフォ ◆Ez1ZxZMJoU :02/10/28 18:35
こういう事?
char data[300];
char *p = data; // OK
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(data)); // NG

172 :配列とポインタ:02/10/28 18:40
質問です。

typedef struct
{
  double *base;
  …
}matrix;

matrix A;

このAに
double a[4][4]={
 {0.0,0.0,1.0,0.0},
 …
};

と定数で宣言した配列の先頭アドレスを
A.base = (double *)a;

と突っ込んでいるんですが、ここでプログラムが落ちてしまいます
(コンパイルエラーはないです)
ポインタ宣言したAに直接、配列の定数を突っ込みたいのですが、
それが分からなかったので、こんな方法をやってます。
( *(A.base+0+0) = 1.0; とか突っ込むのも考えたんですが)
元のプログラムがMS-DOSのTurboC++で書かれていて(ある本のプログラム)
それをWin+BC++5.02J上でやりたいんです。
何が間違いでしょうか。

173 :配列とポインタ:02/10/28 18:41
質問はageみたいですね・・・
ということでage

174 :デフォルトの名無しさん:02/10/28 18:44
C++の質問は余所でおながいします。

175 :デフォルトの名無しさん:02/10/28 18:47
>>174
C++じゃないよ。

176 :デフォルトの名無しさん:02/10/28 18:50
>>172
別に落ちないよ。BCC5.5.1だけど。

177 :デフォルトの名無しさん:02/10/28 18:54
みなさんは配列を扱うときにポインタ演算子を使ってますか?
それとも添え字演算子を使ってますか?

178 :デフォルトの名無しさん:02/10/28 18:55
>>174
Cの範囲だろ。

>>172
gccでやってみたけど特に問題は起きなかったよ。
typedef struct 

  double *base; 
}matrix; 

matrix A; 

double a[4][4]={ 
  {0.0,0.0,1.0,0.0}, 
  {0.0,0.0,1.0,0.0}, 
  {0.0,0.0,1.0,0.0}, 
  {0.0,0.0,1.0,0.0}, 
}; 

int main(int argc, char * argv[])
{
  A.base = (double *)a; /* ここ */
  return 0;
}

本当に「ここ」の部分でエラー起きてる? どうやってそこだと特定したんだろう。

179 :デフォルトの名無しさん:02/10/28 18:57
すまそ、質問です。

fgets(a,b,c)は
a=入力する文字列
b=文字列の長さ
c=入力場所
でいいんですか?
あとsscanf(a,b,c)は
それぞれどんな仮引数なんでつか?

180 :配列とポインタ:02/10/28 18:57
>>176
本当っすか?!
なんで自分の環境では落ちるのかな・・・。
値は上手くわたっているみたいなんですが。

181 :デフォルトの名無しさん:02/10/28 19:01
#include "windows.c"
ってなんじゃらほい?

182 :配列とポインタ:02/10/28 19:01
>>178
ありがとうございます。
えっと、return 0; の前にgetch()をおいて
DOSプロンプトが自動的に閉じるのを防いで、
その後に
//A.base = (double *)a;
とすると他の行列はきちんと表示して自分の思い通りになるので・・・。

183 :デフォルトの名無しさん:02/10/28 19:03
>>179
自分で調べる癖を付けましょう
http://tyrant.chem-eng.kyushu-u.ac.jp/2nd/Programming/Library/Main.asp

184 :デフォルトの名無しさん:02/10/28 19:04
MSDOSプロンプトで、プログラムを実行したときに
全画面をクリアしてから実行するようにするには
どうしたらいいんですか?

185 :デフォルトの名無しさん:02/10/28 19:05
>>184
system("cls");

186 :178:02/10/28 19:08
>>182
なるほど。178で書いたコードでは特に問題になるところはないと思う。
他に色々やってるようなので、どこか別のところで変数を壊すなりしてないか?
配列で確保した以上のところに書いているとかその辺。


187 :デフォルトの名無しさん:02/10/28 19:19
>>172
> A.base = (double *)a; /* ここ */
変なキャストを行っているから

> typedef struct
> {
> double *base;
  double (*base)[4];
> }matrix;

> A.base = (double *)a; /* ここ */
  A.base = a;
こうしてみろ

>>186
> なるほど。178で書いたコードでは特に問題になるところはないと思う。
おいおい、問題ありまくりの糞ソースが「たまたま」動いたから
問題ないというのは非常に疑問だぞ。

188 :デフォルトの名無しさん:02/10/28 19:24
>>187
それは気づいていたけど、代入しただけで落ちるというから、別の理由が
あるんじゃないかと思っている。

189 :配列とポインタ:02/10/28 19:25
>>186 = >>178
>別のところで変数を壊すなりしてないか?
問題の処理の前後でメモリの配置・開放(行列式に適用したmallocのようなもの(?))
があるくらいで、>>178で書いていただいたコードとほとんど一緒です。

もっと詳しくプログラムを追ってみたほうが良さそうですね・・・。
ありがとうございました。

190 :デフォルトの名無しさん:02/10/28 19:27
超初心者なんですが。
Cywinをダウンロードしてインストールもしたんですが
このあとどうすればいいんですか?
英語のサイトばっかで訳がわかりません

191 :デフォルトの名無しさん:02/10/28 19:31
>>188
> 代入しただけで落ちる
いいえ、現在の情報では、「代入をコメントにしたら落ちる」です。
どの箇所で落ちたのかは不明です。
おそらく、代入した部分ではなく、表示や計算の部分で落ちている
可能性が高いと思われます。

192 :デフォルトの名無しさん:02/10/28 19:35
>>189
>>(行列式に適用したmallocのようなもの(?))
それだ!そこで確保した領域を破壊しているか。
freeすべき場所が書き換えられている。

A.base = &a[0][0]
でいいだろ。

193 :デフォルトの名無しさん:02/10/28 19:36
>いいえ、現在の情報では、「代入をコメントにしたら落ちる」です。
・・・・・・・
もしかして初期化してないポインタを使っているとか、そういうオチは
ないよな?

194 :配列とポインタ:02/10/28 19:38
>>187
ありがとうございます。

キャストをしたのはコンパイラに怒られて、
この方法しか思いつかなかったので・・・。

ご指摘の通りにやってみましたが、やはりエラーログを吐いてしまいます。
(win2kの調子がおかしいんでしょうか・・・)
あと
>double (*base)[4];
なんですが、この場合のみならOKなんですが、
他の行列1*4や3*3の行列でも使用しますので、これだと少し都合が・・・。
(#defineなどで指定するのも都合が悪いです・・・)

195 :デフォルトの名無しさん:02/10/28 19:38
>>190
ほれ
http://www.mars.dti.ne.jp/~sohda/cygwin/setup.html
ただし、
> (9)ダウンロードするパッケージを選択します。
では全部defaultにしてしまうと、gccなとのコンパイラは
インストールされないので、Devel配下にあるgcc, gdb, make
ぐらいはインストールしといた方がいい。
容量に余裕があるならDevelを全部インストールする方法もある。


196 :配列とポインタ:02/10/28 19:40
>>191
わかりづらくてすいません。
「代入したら落ちる(エラーログを吐く)」です。
コメントすると普通に動きます。

197 :配列とポインタ:02/10/28 19:45
すいません、ちょっと席をはずします。(22時過ぎまで)

明日、別の環境で試してみます。
皆さん、ありがとうございました。

198 :デフォルトの名無しさん:02/10/28 19:47
>>189
> 問題の処理の前後でメモリの配置・開放(行列式に適用したmallocのようなもの(?))
俺の経験と勘によるとそこが非常に怪しいのだが...そこは大丈夫なのか?

199 :デフォルトの名無しさん:02/10/28 19:48
>>194
サンクス!
インストール成功しました!
環境変数変えたりとかはいいんでつか?

200 :デフォルトの名無しさん:02/10/28 19:53
200げっと

201 :デフォルトの名無しさん:02/10/28 19:55
>>199
> 環境変数変えたりとかはいいんでつか?
そのページの下のリンクをよく見てみろ
Cygwin 環境の構築
http://www.mars.dti.ne.jp/~sohda/cygwin/setenv.html
環境変数を設定して.bashrcを書けば一応終了

Cygwinを起動してgccと打ってみて
gcc: no input files
と出るとインストール成功、hello,worldでも作ってろ
bash: gcc: command not found
とか出るとインストール失敗、インストールからやり直せ

202 :デフォルトの名無しさん:02/10/28 20:08
これって Windowsでも?

http://rec.ncos.co.jp/cgi-bin/errorfrmC.cgi?161



203 :193→一休さん:02/10/28 20:08
Ikanji1st()に、ついて質問したいことがあります。
ソースを、二つに分けて出力したいと思います。
 int Iskanji1st(int c)
{
unsigned char uch=c;

if(uch>=0x81&&uch<=0x9f||uch>=0xe0&&0xfc)
return 1;
else
return 0;
}

204 :193→一休さん:02/10/28 20:09
main()
{
int n;

while((n=getchar())!=EOF){
if(Iskanji1st(n)){

if(isalnum(n=getchar()))
putchar('?');
else
putchar('*');
continue;
}
else if(isalnum(n))
putchar(n);
else
;
}
return 0;
}

205 :デフォルトの名無しさん:02/10/28 20:13
>>203-204
どうでもいいが、こんな汚いコード書くな。


206 :193→一休さん:02/10/28 20:14
int getchar(void)関数は、unsinged char→intに変換します。
 その際、位置インジゲータとエラーインジゲータを返すとある。
  この手のソースの中によくからんでくるのが。
   getchar();だけで、読み飛ばしとか何かgetchar関数の細かい
 操作がしてある。(while((n=getchar())!=EOF){}の中で)
 こういったEOFを使ったループの使い方がいまいち把握できない。
  ループ内で、getchar();とn=getchar();の違いなんですか!?


207 :デフォルトの名無しさん:02/10/28 20:23
c++の質問をお願いします

0〜99の数字を1秒間隔で表示。1〜9で改行、表示する
こんな感じです

1 2 3 4 5 6 7 8 9
10 11 12〜〜〜〜〜〜〜〜〜〜〜〜
〜〜〜〜〜〜〜省略〜〜〜〜〜〜〜〜
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜99

これのプログラムを教えてください
よろしくお願いします

208 :デフォルトの名無しさん:02/10/28 20:29
>>207
すれ違いだし環境書いてないし日本語がちょっと変。

209 :デフォルトの名無しさん:02/10/28 20:29
>>207
> c++の質問をお願いします
ここはCスレ、以下の場所に逝ってくれ。
C++相談室 part12
http://pc3.2ch.net/test/read.cgi/tech/1035005882/

210 :デフォルトの名無しさん:02/10/28 20:32
すまん

211 :デフォルトの名無しさん:02/10/28 20:37
>>202
結論から言うと「状況による」です。
Linuxの場合、逆に速くなる場合もあるそうです。
# fjの「WORDは遅い、int の6倍遅い?」で
# 彼の勇姿をなま暖かく見守っていた一人

212 :デフォルトの名無しさん:02/10/28 20:43
>>208
Cの標準関数だけでもできないわけじゃないけどな・・・
ビジーループ使うから効率悪いけど。


213 :デフォルトの名無しさん:02/10/28 20:46
tabeみたいなキチガイにネットを使わせちゃまずいでしょ。
彼の保護者はなにやってるの?

214 :デフォルトの名無しさん:02/10/28 20:56
scanfの返却値って改行を含めない入力文字個数なんでつか?

215 :デフォルトの名無しさん:02/10/28 21:03
>>51-53
非常に丁寧かつ長文のレスありがとうございました。
特にprintfに関する説明には感謝しております。

確かに私にとってポインタ周りの仕様は複雑に
思えます。
また勉強し直し、髭をそり直しそして出直して参ります。

ギャフン

216 :デフォルトの名無しさん:02/10/28 21:07
Cで点は描けますか?
Win32API使うとしたら出来ますか?

217 :デフォルトの名無しさん:02/10/28 21:09
>>216
>Win32API使うとしたら出来ますか?

できます。


218 :デフォルトの名無しさん:02/10/28 21:09
>>216
> Cで点は描けますか?
printf("."); printf("点");

> Win32API使うとしたら出来ますか?
うん。
Win32API 質問箱 Build6
http://pc3.2ch.net/test/read.cgi/tech/1032548635/l30

219 :デフォルトの名無しさん:02/10/28 21:14
もうFAQだね

220 :rubyist@カラアゲうまうま:02/10/28 21:31
FLASHによるC言語講座
http://www.geocities.co.jp/Milano-Killer/8183/swf/wori.swf

221 :デフォルトの名無しさん:02/10/28 23:06
>>220
スレ違いです。

222 :デフォルトの名無しさん:02/10/28 23:29
>>207 はマルチだから放置。

223 :デフォルトの名無しさん:02/10/28 23:36
>>214
リファレンスとかヘルプとか参考書とか読め。
scanf() の戻り値は、正常に値を入力できた変数の数。
何文字入力したかは関係無い。

224 :配列とポインタ:02/10/28 23:40
さっきの続きで、皆さんの知恵をお貸しください。
>>198さんの仰るようにメモリ周りが怪しいので
その部分をいろいろいじってみたんですが、エラーログを吐きます。
関係する部分を以下に・・・

typedef struct
{
/* double base;*/
 double *base;
 unsigned row;
 unsigned col;
 unsigned temp;
}matrix;

/* main */
...
 matalloc(&A,4,4); /* メモリ取得 */
...
 A.base = &a[0][0]; /* 代入 */
...
 mfree(&A);


225 :配列とポインタ:02/10/28 23:44
/* 怪しい関数 */
void matalloc(a,row,col)
matrix *a;
unsigned row,col;
{
 /* char *malloc();*/
 char *p;
 unsigned i;
 p=malloc(row*col*sizeof(double));
 /* (char *) でキャストすべきっすか?*/

 if(p==0){
  printf("\n メモリ不足");
  exit(0);
 }
 a->base=(double *)p; a->row=row;
 a->col=col; a->temp=0;
 for(i=0;i<row*col;i++) *(a->base+i)=0.0;
}

以上、よろしくお願いします。

226 :デフォルトの名無しさん:02/10/28 23:48
>>225
mfree()関数内で
free( a->base );
とかしてない?

227 :デフォルトの名無しさん:02/10/28 23:49
mfreeもぁゃιぃ。

>A.base = &a[0][0];
ここでメモリリークしている

228 :デフォルトの名無しさん:02/10/28 23:49
なんでdoubleをいちいちメモリ確保するわけ?
(つかなんでポインタなの?)

229 :デフォルトの名無しさん:02/10/28 23:53
禿しく何も見ずにレスしてた。

230 :配列とポインタ:02/10/28 23:56
レスありがとうございます。

>>226
void mfree(a)
matrix *a;
{
 if(a->temp) abort();
 free((char *)a->base); /* たしかにしてますね・・・ */
}

>>227
>A.base = &a[0][0];
あれ?上の方でこうしる・・といわれたような。
A.base = &a;
で良いですか?

>>228
えっとですね、参考にしている本が行列計算をポインタ中心で
やっているので、その行列計算(関数?)に合わせたいんです。
合わせると言っても引数のタイプを合わせるだけなんですが・・・。

main関数以外は本のプログラムのままなので、なんとも言えないのが実情です。。。

231 :デフォルトの名無しさん:02/10/29 00:05
>>320
その参考書が怪しくねーか?
駄本も多いから気をつけろ。

232 :デフォルトの名無しさん:02/10/29 00:06
処理を並べてみろ

matirx A;
A->p=malloc(row*col*sizeof(double));
A->p = &a[0][0];
free(A->p);

明らかにおかしいだろが

233 :デフォルトの名無しさん:02/10/29 00:08
freeしてる時点でbaseのアドレスは(以下略

234 :デフォルトの名無しさん:02/10/29 00:09
おかしいのは漏れだ。吊ってくる、、

 ∧||∧
(  ⌒ ヽ
 ∪ 。ノ 
  ∪∪

235 :デフォルトの名無しさん:02/10/29 00:10
s/A->p/A->base/g ってことね

236 :デフォルトの名無しさん:02/10/29 00:10
>>224
 matalloc(&A,4,4); /* メモリ取得 */
...
 A.base = &a[0][0]; /* 代入 */
...
 mfree(&A);

って領域確保とポインタ(アドレス)と実体とゴッチャになってるから
/*代入*/で間違っている。アドレスを代入するのではなくポインタが指し示す
メモリ上に値を埋めていく作業が必要。

237 :デフォルトの名無しさん:02/10/29 00:28
または、mallocもfreeも必要無い。
今度はグローバル変数である事で何か問題が
起こる可能性もあるが。

238 :配列とポインタ:02/10/29 00:29
皆さん、どうもありがとうございます。

>>236さんの
>メモリ上に値を埋めていく作業が必要。
というのが決め手で、分かりました。
自分では領域確保してアドレスを渡せば間接参照(?)されるかと思ってました。

 for(i=0;i<M;i++){
  for(j=0;j<N;j++){
   *(A.base+i*N+j) = a[i][j];
  }
 }

こんな感じで作ったらうまく渡すことができました。
ありがとうございました。

239 :配列とポインタ:02/10/29 00:37
すいません、まだ済んでませんでした。
mfreeのコメントをはずすのを忘れてました。
(mfreeが怪しいといわれたのでコメントをしてました。)

で、(一度コメントしてmakeした後に)mfreeのコメントをはずしたら
エラーログを吐き出されました・・。

mfree(free)せずに処理系に任せるのは・・・まずいっすよね・・・。
この場合、どのように対処したら良いのでしょうか。

240 :デフォルトの名無しさん:02/10/29 00:44
>>239
a->temp
が 0 のままじゃない?

241 :デフォルトの名無しさん:02/10/29 00:45
>>239
対症療法でやるなって。
ちゃんとポインタとかを理解して、コード組めよ。

242 :デフォルトの名無しさん:02/10/29 00:58
ポインターアドレスを取得して、メモリーを確保して、
アドレスのコピーを取って、使って、
使って居ないもとのアドレスを指している方をフリー

243 :デフォルトの名無しさん:02/10/29 01:04
>>239
> A.base = &a[0][0];

この代入がまだ残ってるとか。
ちゃんと削除した?

244 :配列とポインタ:02/10/29 01:17
>>240
a->tempは0のままで良いようです。
"保存用"なら0、"作業用"なら1のフラグを立てるところのようで、
今、Aには保存用のデータを収納したいので。
(abort()は飛ばされていることを確認しました)

>>241
ポインタ(配列)を100%理解はしていませんが、今は対症療法(打って覚える)を
実践しようと思ってやってるので・・・。
(理解が足りていないのは百も承知でやってます)

>>243
言われて削除したんですが、変わらずでした。

で、現在、>>242さんのご意見を頭の中で整理しています。
やはり、理解が足りないようです。出直してきます。
皆さん、ありがとうございました。

245 :デフォルトの名無しさん:02/10/29 01:28
>>244
まず、いわゆる二次元以上の配列は初心者にはかなり理解が厳しいと思う。

やるのなら、matrixを操作する関数群を作るといいと思う。

matrixを確保、開放する関数、row、colを指定して値を設定する関数、
同様に取り出す関数、比較する関数、複製する関数など。

確保する関数はrowとcolを指定して、matrixのポインタを返すようにして、
残りの関数はmatrixのポインタと必要なパラメータを受け取るようにすれば
いいんじゃないかな。

246 :配列とポインタ:02/10/29 02:17
>>245
ご意見、ありがとうございます。
そうですね。matrixに関しての関数をもう一度、自分で作成するか
手元にある怪しい関数を一から見直す必要があるようです。
( >row、colを指定して値を設定する関数 は今作ってみました。 )

勉強と思って一から作成してみます。
では、これにて。。。

247 :デフォルトの名無しさん:02/10/29 08:46
お前ら!! どうよ?

248 :デフォルトの名無しさん:02/10/29 09:06
Visual C++6でC言語のコンパイルってどうやればできる?

249 :デフォルトの名無しさん:02/10/29 09:26
>>248
スレ違い。
http://pc3.2ch.net/test/read.cgi/tech/1030985362/l50
http://pc3.2ch.net/test/read.cgi/tech/1022499000/l50

250 :デフォルトの名無しさん:02/10/29 09:32
QUAJPG.exeってプログラム知ってますか?
↑非可逆圧縮のプログラムね
知ってたらソースファイル教えてください

スレ違いだったらすまん。

251 :デフォルトの名無しさん:02/10/29 09:34
>>249
さんきゅです

252 :デフォルトの名無しさん:02/10/29 09:35
>>250
スレちがい。
作者のサイトで公開されてなかったらあきらめろよ。

253 :デフォルトの名無しさん:02/10/29 09:39
8 桁の整数を入力として受け付けて、それぞれの桁を配列の要素として格納する。繰り
返しを使って実現せよ。ただし配列名をdata とすると、1 の位がdata[0]に、10 の位
がdata[1]に格納されるものとする。最後に配列の全要素を出力せよ。
例: 38459341 が入力された場合
配列には{1,4,3,9,5,4,8,3}が格納される

254 :デフォルトの名無しさん:02/10/29 09:42
>>253
それが人に教えを請う態度かよ。
つか、宿題は自分でやれや。

255 :◆Ez1ZxZMJoU :02/10/29 10:04
char data[9];
sprintf(data, "%d", N);
for(i = 0; i < 4; ++ i) {
c = data[i]; data[i] = data[7-i]; data[7-i] = c;
}

256 :デフォルトの名無しさん:02/10/29 10:33
>>253perl -e '@data=split(//,<STDIN>);foreach(@data){print;}'

257 :デフォルトの名無しさん:02/10/29 11:11
>>254
「問題の掲載ご苦労様でした。」 とでも言っとけ。

258 :デフォルトの名無しさん:02/10/29 11:42
char *p;
p="abc";
p="abcd";
p="abcde";

上でstrlenとやるとそれぞれ3,4,5になるのに、sizeofだと最初の4のままなのはどうして?

259 :デフォルトの名無しさん:02/10/29 11:49
>>258
ポインタの大きさと、文字列の大きさの違いについて調べてきなさい。
理解するまで、このスレにカキコ禁止。

260 :デフォルトの名無しさん:02/10/29 11:51
>>258
1 のリンクにある C FAQ を通読してくれ。

261 :258:02/10/29 11:53
>>259
ポインタの大きさは32ビットコンパイラの場合4バイトってこと?
ポインタにsizeofすれば文字列+\0の大きさが返ってくるものとばっかりおもってました。

262 :260:02/10/29 12:09
>>261
だから、まず 1 のリンクにある C FAQ を通読してくれ。
ちなみに、ポインタの大きさはコンパイラが何ビットかとは直接関係無い。
たまたま一致する事もあるが、規格では規定されていないので思い込んではいけない。

263 :配列とポインタ :02/10/29 12:31
それらしい動きになったので、一応報告です。
>>242さんに言われたことを整理して
matalloc内の
p=malloc(row*col*sizeof(double))
このpをreturnで戻してmain関数内で(char *)型のchaaで受け取って
free(chaa)としたらエラー無しで終了できました。
>>242 "使って居ないもとのアドレスを指している方をフリー"
が重要だったようです。

皆さん、ありがとうございました。
(もっと勉強が必要だと感じました。。)

264 :258:02/10/29 12:54
>>260の書き込みを見たのは>>261を書き込んでからでしてはい。
C FAQ読んできます

265 :デフォルトの名無しさん:02/10/29 13:49
すいません、質問です。
int型だけで、1兆+1兆=?
みたいな計算をどうやるかっていう問題で、
多倍長演算使うってとこまではわかったんですが、
多倍長演算ってのが何かわかりません。
誰か教えてください。



266 :デフォルトの名無しさん:02/10/29 14:05
>>265
そこまで分かったのなら、とりあえず検索して見れ。

267 :デフォルトの名無しさん:02/10/29 14:05
>>265配列を使う。 int i[];専用の加減乗除関数を作成。ex.add(int i[], int j[], int val[])

268 :デフォルトの名無しさん:02/10/29 14:05
>>265
http://www.google.co.jp/search?q=%E5%A4%9A%E5%80%8D%E9%95%B7

100進4桁にするといいよ。


269 :デフォルトの名無しさん:02/10/29 15:48
stdinから受け取った内容をstdoutに出して、他のプログラムにバイパスする処理を作りたいのですが 巧くいきません、教えてください、おながいします
# out | in のイメージで

/* out.c */
#include <stdio.h>
int main(void) {
char buff[128];

memset(buff, '\0', sizeof(buff));
while (fgets(buff, sizeof(buff), stdin) != NULL) {
fputs(buff, stdout);
memset(buff, '\0', sizeof(buff));
}
return system("./in");
}

/* in.c */
#include <stdio.h>
int main(void) {
char buff[128];
FILE *fp=NULL;

fp = fopen("./hoge.txt", "wb");
memset(buff, '\0', sizeof(buff));
while (fgets(buff, sizeof(buff), stdin) != NULL) {
fputs(buff, fp);
memset(buff, '\0', sizeof(buff));
}
return 0;
}

270 :デフォルトの名無しさん:02/10/29 16:02
なんでpipeつかわへんの?
なんでreturn system("./in")なん?

271 :269:02/10/29 16:06
>270

pipe ってのがあるんですか・・・(´・ω・`)
そのものズバリな予感。

調べてみます


272 :デフォルトの名無しさん:02/10/29 16:08
代理クラスって何か教えてください。
ネットで探しても見つからないんで

273 :デフォルトの名無しさん:02/10/29 16:15
>>272
プロキシークラスでぐぐれ。

274 :デフォルトの名無しさん:02/10/29 16:17
C:\デスクトップ\20021025\20021025.c(21) : warning C4005: 'MAX_THETA' : マクロが再定義されました。
という警告がたまにでるのですが、いいのでしょうか?


275 :269:02/10/29 16:29
popen() で、バイパス自体は巧くいきました。

ただ、この場合呼び出し先のリターンコードって取得できるんでしょうか?


276 :デフォルトの名無しさん:02/10/29 16:40
man pclose

277 :ゆみこ:02/10/29 16:47
ここで宿題やってもらうのっていいんですか?

278 :デフォルトの名無しさん:02/10/29 16:49
>>277
http://pc3.2ch.net/test/read.cgi/tech/1021862587/l50

279 :デフォルトの名無しさん:02/10/29 16:51
>>277
土建屋のゼネコンのような丸投げ君は禁止しています。
# 昔の1には書いてあったのだが...今は無いな。

自分でやってみてわからないところを質問するのは構いません。

280 :ゆみこ:02/10/29 16:52
わかりました。今度お願いします。

281 :デフォルトの名無しさん:02/10/29 17:00
#include <stdio.h>

struct hoge {
 char a[4];
 long b;
 short c;
};

int main(void)
{
 printf("%d\n", sizeof(struct hoge));
 return 0;
}
↑のようなコードで、12 と結果が出ます。
sizeof(long)は4で、sizeof(short)は2です。
何故、構造体hogeのサイズが10にならんのですか?

282 :デフォルトの名無しさん:02/10/29 17:05
>>281
>>1のC FAQを読んでから出直せ。


283 :デフォルトの名無しさん:02/10/29 17:08
>>281
目に見えない何かが詰まってるんだよ。

284 :281:02/10/29 17:21
>>282,283
納得しました。
sizeofは詰めものまで数えるのね。

285 :デフォルトの名無しさん:02/10/29 17:22
そりゃそーだ。


286 :269:02/10/29 17:22
>276

pclose のリターン値ですが、
これって、fcloseに準拠するんでしょうか?

呼び出し先のアプリが複数ステータスを返す場合は
pipeで、やり取りするしかないんでしょうか?


287 :デフォルトの名無しさん:02/10/29 17:22
>>281
C FAQ 2.13:を参照
http://www.catnet.ne.jp/kouno/c_faq/c2.html
> 構造体にsizeof演算子を使ったら、私が思っていたよりも大きな大き
> さを返してきた。まるで、おしりに詰め物がしてあるようだ。

288 :デフォルトの名無しさん:02/10/29 17:32
だからmanしろと言ってるだろ。

> The pclose() function waits for the associated process to terminate and
> returns the exit status of the command as returned by wait4().

289 :デフォルトの名無しさん:02/10/29 17:40
どうも。3*3の○×ゲームの対CPUのプログラムを作りたいんですが
何から初めていいものか分かりません。
そもそも、こういう処理をコンピュータにやらせる事をなんていうんですか?
思考ルーチンとか?

290 :デフォルトの名無しさん:02/10/29 17:41
>>288
bugsに
> Failure to execute the shell is indistinguishable from the
> shell's failure to execute command, or an immediate exit of the
> command. The only hint is an exit status of 127.
こんなことが書いてあるけど、pcloseでは成功の判断はできるけど
どのプロセスで何のエラーが発生したのかは判断できないんじゃない?

291 :269:02/10/29 17:46
>288
見落としてました・・・。・゚・(ノД`)・゚・。


292 :デフォルトの名無しさん:02/10/29 17:47
>>289
以前おれ三目並べ作ったよ。一ヶ月もかかったがあれは楽しかった。
まずは紙に三目並べの局面の樹形図を描きまくることからはじめた。

293 :デフォルトの名無しさん:02/10/29 17:54
>>292
三目並べ程度だったら今のマシンパワーだと、
枝刈りしなくても全然おっけーだから力技で解けちゃいそう。

つかMS-DOSの頃も枝刈りの必要なかったか。

とはいえ、練習だと思って枝刈り入れるといいかもね。
正規化するルール作って、回転対称とか軸対称とかで刈っちゃう。
んで、それぞれの局面を正規化して探索する、と。

294 :デフォルトの名無しさん:02/10/29 17:55
うぅ
樹形図しか理解できないんで、勉強してきます・・・

295 :デフォルトの名無しさん:02/10/29 18:00
枝刈りしないで全局面数えても9!だから、45通りしかないんじゃないか。
力技つってもたいしたことないな(w
ただ、それをどう評価するかを考えるのが楽しそうだ。

296 :295:02/10/29 18:03
あ、ごめん45って1〜9の和じゃないか。
9!は362880か。
ただこれでも力技いけそう。

297 :デフォルトの名無しさん:02/10/29 18:04
3目ならべなら、テーブル作って終わり。

298 :デフォルトの名無しさん:02/10/29 18:36
4マスで3並びの個数が多い奴が勝ちとかしたらちょっとは面白くなるかもね。

299 :すみません:02/10/29 20:26
#include<stdio.h>
#include<stdib.h>
#define juand() ((double)rand()/(32767.0+1.0))
void main()
{
double z;
int i;
srand(2);
printf("自分の名前の入力\n");
for(i=1;i<10;i++){
z=jurand();
printf("%4d番目の乱数は%10.7lf\n",i,z);

これを利用して、乱数10個の平均をディスプレイに
出力するプログラムを作りたいんですが、
どのようにすればよいのか全く分かりません。
どなたか教えてください。

300 :デフォルトの名無しさん:02/10/29 20:31
三つ前の自分の手が消えるとしたら、
三目並べも少しは面白くなるかもね。

301 :デフォルトの名無しさん:02/10/29 21:09
>>299
srandの引数を定数にすると結果がいつも同じ。

302 :デフォルトの名無しさん:02/10/29 21:12
>>299
あちこちに張るなよ。ボケが。

303 :デフォルトの名無しさん:02/10/29 21:32
近藤君はまだ健在ですか?

304 :デフォルトの名無しさん:02/10/29 22:56
>>299
酔っ払い五月蝿いよ

305 :>>300を作ってみた:02/10/30 00:03
#include <stdio.h>
#define SL(i) (m[i][0]==m[i][1]&&m[i][1]==m[i][2]&&m[i][0]!=' ')
#define SC(i) (m[0][i]==m[1][i]&&m[1][i]==m[2][i]&&m[0][i]!=' ')
#define D1 (m[0][0]==m[1][1]&&m[1][1]==m[2][2]&&m[0][0]!=' ')
#define D2 (m[0][2]==m[1][1]&&m[1][1]==m[2][0]&&m[0][2]!=' ')
#define DU(i) (SL(i)||SC(i)||D1||D2)
#define PL() printf("-----\n");
#define PM(i) printf("%c|%c|%c\n", m[i][0], m[i][1], m[i][2]);
#define I(i) for(i=0;i<3;i++)
int main(void) {
  char m[3][3]={},s[3],me[3]={},com[3]={};
  int i,j,k,x,y;
  I(i)I(j)m[i][j]=' ';
  for (;;) {
    fputs("手は?(x):", stdout);fgets(s,3,stdin); x=atoi(s);
    fputs("手は?(y):", stdout);fgets(s,3,stdin); y=atoi(s);
    if (x<0||x>2||y<0||y>2||m[x][y]!=' ')
      {printf("そこには置けない\n");continue;}
    memmove(me+1,me,2); me[0]=(x*4+y+1);  /* player */
    I(i){I(j){if(m[i][j]=='o')m[i][j]=' ';}}
    I(i)if(me[i])m[(me[i]-1)/4][(me[i]-1)&3]='o';
    PM(0);PL();PM(1);PL();PM(2); printf("\n");
    I(i) if(DU(i)){ puts("o won");exit(1);}
    I(i) I(j){if(m[i][j]==' '){x=i;y=j;goto ll;}} ll:
    memmove(com+1,com,2); com[0]=(x*4+y+1); /* com */
    I(i){ I(j){ if(m[i][j]=='x')m[i][j]=' '; }}
    I(i)if(com[i])m[(com[i]-1)/4][(com[i]-1)&3]='x';
    PM(0);PL();PM(1);PL();PM(2); printf("\n");
    I(i) if(DU(i)){ puts("x won");exit(1);}
  }
}


306 :デフォルトの名無しさん:02/10/30 00:15
3目並べあたりだと7行プログラミングスレの連中なら簡単に作りそうだな
7行でオセロにはビビったよ

307 :デフォルトの名無しさん:02/10/30 00:54
>>305
すごい・・・
マクロ展開したんだけど、質問。
char型の配列の宣言の要素はなんでないの?

あと、#include <stdlib.h>
#include <string.h>が必要で、
セミコロンが1個余計なとこはけーん


308 :デフォルトの名無しさん:02/10/30 00:55
>>306
これじゃないのかな
http://pc3.2ch.net/test/read.cgi/tech/1033143528/527

309 :デフォルトの名無しさん:02/10/30 01:07
>>307char s[3]ならfgets専用の配列で嫌でも変わるから入れなかったよ。1文字,改行,0ってなるし。string.hはmemmove,stlib.hはatoiか,-Wallしてなかったんで見過ごしてた。○×ならできそうだけどオセロはすごいな。

310 :307:02/10/30 01:22
オレも今見てきた。オセロすごすぎ。
オレは未だに単なる3*3の○×ゲームで
思考ルーチンに試行錯誤なのに・・・
しかもif文ばっかだし。
ソース全部展開して、見やすくして
徹底的に盗んでやる!

311 :307:02/10/30 01:27
オレがコンパイルしたのはこれ

http://pc.2ch.net/test/read.cgi/tech/984182993/336
336レス目ね

312 :浦島太郎な気分。:02/10/30 03:04
6年ぶりにプログラミングを再開しようと考えているのですが、VC++とC#、どちらにしたら
良いでしょうか。6年前は、富士通FM−R50/S(OS MS−DOS Ver 3.3)というマシンで、
F−BASIC、Quick C、MASMを使っていました(アセンブラはほんのお遊び程度)。
ネット、Windowsはおろか、ハードディスクさえ無い環境でしたので、いざ再開せん、と
意気込んだは良いのですが、当時のPC環境とのあまりの違いに、何をどうしたらよいのやら全く
分かりません。

313 :デフォルトの名無しさん:02/10/30 03:17
>>312
Borland C++ Builderにしとけ。

314 :デフォルトの名無しさん:02/10/30 03:20
Borland C++ Compiler

315 : ◆i.HARPeeuc :02/10/30 03:38
>>312
Windows 対応のコンパイラでコンソールアプリケーションを選べば、「昔」 と
ほぼ同じ感覚でプログラミングできる。
ウィンドウアプリは 「猫」 でも見ながら追々。
http://www.kumei.ne.jp/c_lang/
ただし C# なら 1 から始めるくらいの気持ちの方がいい。

316 :デフォルトの名無しさん:02/10/30 04:03
((void (*pu)())1)
この場合puは値を返さない関数へのポインタってことなんでしょうか?
それはそうと"1"ってなんですか?
FreeBSDのソースでみかけたんですが
わからなくて困ってます

317 :デフォルトの名無しさん:02/10/30 04:16
>>316
1を値を返さない関数へのポインタにキャストしているのかな?
なんでpuと書いてあるのかわからないけど。


318 :デフォルトの名無しさん:02/10/30 04:18
C99では
void foo(void){}
void bar(void){ return foo();}
は合法とされているんでしょうか?
教えてください。


319 :デフォルトの名無しさん:02/10/30 04:25
>>316
よくわからん。
VC6 と gcc-2.95 ではコンパイルエラーになる。

320 :デフォルトの名無しさん:02/10/30 04:26
>>318
何がいけないと思うの?

321 :デフォルトの名無しさん:02/10/30 04:29
>>320
あ、一般的なコーディングでこういうのって出て来るものですか?


C++で合法なのは知っていますが、Cではどうなのかなと。
プリプロセッサもどきを作成していて、こういうことが
したくなったのですが移植性が気になって。


322 :321:02/10/30 04:46
320タン......

(-_-)

323 : :02/10/30 04:46


324 :デフォルトの名無しさん:02/10/30 05:28
>>321
320 は、つまりどうしてそういう疑問を持つ事になったのか訊きたかっただけだけど。
書き方は悪かった、すまん。

移植性が気になるようなプリプロセッサを作るなら、規格書ぐらい自分で
読めなきゃダメだろう。

ISO-C-FDIS.1999-04.pdf
6.8.6.4 The return staatement
| 1 A return statements with an expression shall not appear in a function
|  whose return type is VOID. A return-type statement without an expression
|  shall only appear in a function whose return type is VOID.

void 型の関数で、エクスプレッションのある return は使っちゃダメだとさ。
逆に、エクスプレッションの無い return は void 型の関数のみで使えと。

「with an expression」 って、「戻り値のある」 って訳していいのかな?
漏れも英語苦手なんだから、英文読ませないでくれ。
PDF 検索しる。

あと、C++ で合法って何故?? 何が根拠?

325 :324:02/10/30 05:35
すまん、typo してる。
で、探したら PDF でなくて TXT のバージョンがあるからそっち使ってくれ。

# Acrobat Reader って何でコピペできないんだよぅ・・・

326 :デフォルトの名無しさん:02/10/30 05:40
>>324
> 「with an expression」 って、「戻り値のある」 って訳していいのかな?

訳すなら「引数を持った return 文」かなあ。
要するに return; はいいけど return expr; は駄目ってことなんだけど。


327 :デフォルトの名無しさん:02/10/30 05:47
>>316
多分やりたい事は 317 だろう。
しかし、どう見ても文法エラーなんだが。
昔のコンパイラならキャストに名前が混じっててもコンパイル通ったのかな?

328 :318:02/10/30 05:48
>>324
おおう。 調べていただいてどうもありがとうございます。C99の規格
持ってなくて・・。

C++の方ですが、ISO/IEC 14882-1998 の p.98, section 6.6.3

| A return statement with an expression of type ``cv void'' can be used only in functions
| with a return type of cv void; the expression is evaluated just before the function returns
| to its caller.

によります。templateにvoid戻りの関数オブジェクトを渡すとき、このような規格
でないと問題になるケースがいくらかあります。

ありがとうございました。

329 :318:02/10/30 05:49
>>328
同じく英文は苦手なので引用すべき部分が間違ってたら平にご容赦。


330 :デフォルトの名無しさん:02/10/30 06:19
>>325
普通に作ったPDFはコピペできるはず
できない文書はビットマップにしてあるんかな


331 :デフォルトの名無しさん:02/10/30 06:27
>>328
cv void 型の表現を伴う return 文は cv void 型を返す
関数でのみ使うことができる。表現は呼び出し元に戻る直前に
評価される。

よく読め。

332 :デフォルトの名無しさん:02/10/30 06:32
>>331
318が許される理由にはなっていない?


333 :デフォルトの名無しさん:02/10/30 07:18
唐揚げ


334 :デフォルトの名無しさん:02/10/30 07:29
cv void,where cv is [const|volatile].evaluation is applied to "cv void",whice is not "void" but [const|volatile]

335 :デフォルトの名無しさん:02/10/30 07:48
>>334
C++の話題はメインじゃないんだから粘着せんでも。


336 :デフォルトの名無しさん:02/10/30 13:53
講義でこんな問題出ました

4個の整数集合{a,b,c,d}と{e,f,g,h}が与えられたとき
2集合の全要素の組み合わせでかつ同一でない演算をする(+,−,×,÷,論理和,論理積)
※集合の要素値の与え方は自由
 組み合わせとはa+eのような2要素からなるものとする

記号16通り×6で96通りの計算をすればいいとおもうのですがC言語まったくわからないので
さっぱりです。

#include <stdio.h>
までしかわかりません

337 :デフォルトの名無しさん:02/10/30 14:01
どうして 1 は 「課題丸投げ禁止」 を消してしまったんだ・・・。

>>336
スレ違い。
http://pc3.2ch.net/test/read.cgi/tech/1021862587/l50

338 :デフォルトの名無しさん:02/10/30 14:07
本を読んでいたら
int hoge;
char buf[256];

fgets(buf,sizeof(buf),stdin);
sscanf(buf,"%d",&hoge);
っていうのが出てきたんだけど
sscanfって言い換えれば
文字列bufからscanf("%d",&hoge)しろって事?

あとなんでこんな事してるの?

339 :デフォルトの名無しさん:02/10/30 14:10
>>336
この前も同じようなの見た。
同じ学校なのだろうか…

340 :デフォルトの名無しさん:02/10/30 14:17
>>338
> sscanfって言い換えれば
> 文字列bufからscanf("%d",&hoge)しろって事?
まぁ、大体そんなかんじです。

> あとなんでこんな事してるの?
その本が比較的まともな本だからです。
良く読めば何でそんなことをしているのかも書いてあるはずです。

341 :デフォルトの名無しさん:02/10/30 14:19
答え書こうとしたけど 340 みて踏み止まり。

>>338
参考までに、この場合に限っては

  fgets(buf,sizeof(buf),stdin);
  hoge = atoi(buf);

の方が一般的だし、わかりやすい。
関数のそれぞれのくわしい機能は調べておいてね。

342 :デフォルトの名無しさん:02/10/30 14:31
>>340
>>341
ありがとう!!
atoiは今から調べてきます!

343 :デフォルトの名無しさん:02/10/30 14:46
ANCI Cで、関数の引数に、決まってない数のパラメータを渡す方法ってどうやるんでしょうか?
printf() なんかみたいに、渡すパラメータの数が決まってないんです

344 :わかりません ◆MSEEFfect2 :02/10/30 14:49
>>343
ANSI C って、なんでしたっけ。
stdarg.h はあるなら、va_list 使う。
ない場合は、以下で逝って世し。

宣言
void myprintf();
定義
void myprintf(int a, int b, int c, int d, int e, int f, int g, int h, int i)
{
}

345 :デフォルトの名無しさん:02/10/30 14:54
>>343
多分、君のやりたいことはC FAQ 15.4: or 15.5: で解決する。
http://www.catnet.ne.jp/kouno/c_faq/c15.html

346 :デフォルトの名無しさん:02/10/30 14:58
>>344
<stdarg.h> は ANSI で定義されてたと思う。

347 :343:02/10/30 14:59
(・∀・)イイ!

やってきます

348 :デフォルトの名無しさん:02/10/30 16:09
どこで聞こうか悩んだけど、ここで質問させてホスイ
・C言語で開発している爺
・グローバルな変数はあまり使いたくない志向
・文字列”名前”を渡し、加工後に決められたコントロールにて表示という以下の関数を作成
 void SetHogeName(HWND, LPSTR);

今までなんの疑いもなくこういう組み方をしていたんだけど、ある日気がついたんだ。
SetHogeNameって結構あちこちから呼び出しているんだよね。
で、コンパイルエラーが出ない範囲でHWNDやLPSTRを指定し間違えると、潜在バグってことになるよな?

ここで思ったんだが、どうせHWNDやLPSTRに指定するデータなんぞ出所は決まってるんだよ。
つまらんバグを回避するなら、いっそのこと必要データはグローバル変数に持っておき、SetHogeNameからグローバル変数にアクセスしに行けば良いんじゃないかと。

一応、グローバル変数って簡単に書き換えることが出来るという点で危険が残るのでよ、書き換える場合はアクセッサでも通してやれば良いかと思った。

ちょっとデムパ入ってるかのぅ?

C++なお年ごろ?
勘違い?

349 :デフォルトの名無しさん:02/10/30 16:21
#include <stdlib.h>
#include <stdio.h>
int main(
int argc,
char * argv[ ]
)
{
if (argc !=3)
printf("wrong no. of arguments\n");
else
{
printf("Sum: %d\n", atoi(argv[1]) + atoi(argv[2]));
}
return 0;
}
このプログラムを改良して。引数より少ない正整数で割りきれるものをすべて列記する。
プログラムを開発せよ。


a.out22なら

22は11で割りきれる

22は2で割りきれる

22は1で割りきれる

だれかお願いします。


350 :デフォルトの名無しさん:02/10/30 16:23
a.out20なら

20は10で割りきれる

20は5で割りきれる

20は4で割りきれる

20は2で割り切れる

20は1で割り切れる

引数より少ない正整数で割りきれるものをすべて列記する。
プログラムを開発せよ。


351 :デフォルトの名無しさん:02/10/30 16:29
今度の1は必ず「宿題丸投げお断り」の文言を入れといてくれ
>>350
ヒント:素因数分解

352 :デフォルトの名無しさん:02/10/30 16:30
>>351

もっとヒントプリーズ

できれば答えも

353 :デフォルトの名無しさん:02/10/30 16:32
>>348
グローバル変数では無く、ファイルスコープのstatic変数にしろ。
でアクセサ経由でstatic変数にアクセスしろ。
これで意味が分かるか?

354 :デフォルトの名無しさん:02/10/30 16:37
>>352
http://www5.airnet.ne.jp/tomy/cpro/etc5.htm

355 :352:02/10/30 16:42
>>354

ぎぶあっぷ

どうでもいいや俺の宿題じゃないし

356 :348:02/10/30 16:52
>>353
サンクス。よっく分かりますた。
でも、SetHogeNameみたいな関数って他にもかなり沢山あるんだよね・・。
ちと鬱。

357 :デフォルトの名無しさん:02/10/30 16:55
>>355
君のレベルが知りたい
質問1:素数は知っているか。
質問2:任意の数が素数であることを判定するプログラムが作れるか?
質問3:任意の数の最大公約数を求めるプログラムが作れるか?
全部の質問にyesならば素因数分解するプログラムも作れるはずなのだが。

358 :355:02/10/30 17:04
>>357
質問1にのみイエス

C言語は必須じゃなかったから去年あきらめたんだよ。

だから君のことは少し尊敬かも。でも無事卒業したよ。


359 :デフォルトの名無しさん:02/10/30 17:07
>>357
@1とそれ自身以外で割り切れない数
A枝切りしながらやる
Bこれも枝切り
よって、高枝切りばさみが必要

360 :デフォルトの名無しさん:02/10/30 17:11
>>359
氏ね

>>357
@握りこぶし位の大きさで、湿気の多い所にある
A中火で5分、弱火で10分コトコト煮込む
Bアニメ「一休さん」のさよちゃんによく似ていた

361 :デフォルトの名無しさん:02/10/30 17:31
質問です。
猫でも・・・を見ていたらエスケープシーケンスってのが出てきたから
やってみたんだけど、実行結果が
[2j
こういう風になって、全然画面が変わらない!

ちなみにソースは
#include <stdio.h>
int main()
{
    printf("\x1b[2j");
    return(0);
}
です。

色が変わったりするのも、何も起きなかったし。
OS XPで、BCC使ってます。
何か原因わかります?

362 :デフォルトの名無しさん:02/10/30 17:36
>>361
たしかXPはエスケープシーケンスは使えなかったと思う。

363 :デフォルトの名無しさん:02/10/30 17:39
>>362
( ̄□ ̄;)!!
まじっすか!?
ふざけんなビルゲイツ( ゚Д゚)ゴルァ!
できねーじゃねーか( ゚Д゚)ゴルァ!

アア・・・マジ切ないよ
やる気なくすよ・・・。
VC++なら出来ますか?

364 :デフォルトの名無しさん:02/10/30 17:41
>>363
config.ntにansi.sysをデバイスドライバ登録すればいいじゃん。

365 :教えて厨:02/10/30 17:43
課題
4個の整数集合{a,b,c,d}と{e,f,g,h}が与えられたとき、
二集合の全要素の組み合わせで、かつ同一でない演算をする
プログラムを作る
(演算とは+−×÷、論理和、論理積)

集合の要素値の与え方は自由
「組み合わせ」とはa+bのような二要素からなるものとする

366 :351:02/10/30 17:43
悪い、難しく考えすぎてた
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
  int n, i;
  
  if(argc != 2 || (n = atoi(argv[1])) == 0)
  {
    printf("数値を入力してください\n", argv[0]);
    return 0;
  }
  for(i = n - 1; i > 0; i--)
    if((n % i) == 0)
      printf("%dは%dで割り切れる\n", n, i);
  return 0;
}

367 :教えて厨:02/10/30 17:44
誰か、Cでプログラム組んでください
おながいします

368 :デフォルトの名無しさん:02/10/30 17:46
>>361
第58章 コンソールアプリで文字色を変える
ってので色変えるヨロシ。

369 :デフォルトの名無しさん:02/10/30 17:48
>>364
ごめん!全然わからんw
こことか?
http://mayu.als.jp/XPcom/wxp_conf.html
これって、MS-DOS使ってやるの?
なんかダウンロードする必要ある?

370 :デフォルトの名無しさん:02/10/30 17:48
>>367
この板の何処かに同じような問題を見たなぁ。
答えも書いてあったような...

371 :教えて厨:02/10/30 17:49
うpキボン

372 :デフォルトの名無しさん:02/10/30 17:49
>>368
でもオレVC++でなくてBCCだから・・・
bccじゃ出来ないよね・・・?

373 :デフォルトの名無しさん:02/10/30 17:51
ごめん!NT用っぽいけどこんなのあった
http://www.tim.hi-ho.ne.jp/gonbuto/memo/nt-esc.txt
とりあえずこれやってみます。

374 :デフォルトの名無しさん:02/10/30 17:52
>>371
http://pc3.2ch.net/test/read.cgi/tech/1021862587/889-

>>372
bccでも可。

375 :デフォルトの名無しさん:02/10/30 17:56
何度もごめん!>>373のサイト行ったら、
step1:config.ntにansi.sysを追加。
step2:config.ntの最後に"dosonly"と追加。
step3:command.comを起動。
※NTのコマンドプロンプトはcmd.exeです。command.comはsystem32に含まれています。)
step4:エスケープシーケンスを含むバッチを実行。

ってあったんだけど、ステップ3のって
XPでいうとコマンドプロンプトなのかなあ

>>374
できる!?コンソールアプリね。
調べてきます


376 :デフォルトの名無しさん:02/10/30 18:03
>>374
できたあ!ありがとうございます。
エスケープシーケンスはまだ出来ないけどw
再起動しないとダメなのかな。

で、質問なんだけどもw
コンソールAPIって、Win32APIみたいなものっすか?
windowsヘッダをインクルードしてるし・・・。
でもbccじゃWin32API使えないよね!?

377 :デフォルトの名無しさん:02/10/30 18:12
>>376
> bccじゃWin32API使えないよね!?
MFCが使えないだけで、win32api SDKは使うことができます。
つまり、猫でも〜のSDK編に載っているapiは全て使える。

378 :デフォルトの名無しさん:02/10/30 18:21
>>377
そうだったんですか!!
VC++だったら全部できるんだよね?
かおっかなー。でもまだまだだからいいや。


379 :デフォルトの名無しさん:02/10/30 18:27
>>377
すいませぬが・・・
http://www.kumei.ne.jp/c_lang/sdk/sdk_25.htm
にあるソースをこぴって実行しようとしたら
エラー E2034 graph.cpp 25: 'void *' 型は 'HBRUSH__ *' 型に変換できない(関数 __stdcall WinMain(HINSTA
NCE__ *,HINSTANCE__ *,char *,int) )
というエラーが4つも出てきたよー!!
やっぱ何かがおかしい・・・

380 :デフォルトの名無しさん:02/10/30 18:40
キャストは他の演算子に比べてどれくらい優先度が高いんですか?

381 :デフォルトの名無しさん:02/10/30 18:45
>>379
bcc32 -tW xxx.cpp
ってやればできるよ。

382 :デフォルトの名無しさん:02/10/30 18:48
>>379
C++としてコンパイルすると確かにそのエラーが出てくる
hoge.cpp をhoge.cにして
bcc32 -W hoge.c
でコンパイルすると
  Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
  hoge.c:
  警告 W8057 hoge.c 31: パラメータ 'lpszCmdLine' は一度も使用されない(関数 WinMain )
  警告 W8004 hoge.c 79: 'y' に代入した値は使われていない(関数 ShowText )
  Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
こんな警告が出てくるけどコンパイルと実行はできる。

383 :デフォルトの名無しさん:02/10/30 18:54
>>381
>>382
THANX!!
でもC++ではだめで、Cならできるってどういう事なんだ・・・。

384 :デフォルトの名無しさん:02/10/30 18:55
>>380
http://tyrant.chem-eng.kyushu-u.ac.jp/2nd/Programming/Operator/Main.asp

385 :デフォルトの名無しさん:02/10/30 19:01
>>383
> でもC++ではだめで、Cならできるってどういう事
俺も良くわからん。
以下のスレの方がもう少し詳しい回答をもらえそうな気がする。

タダで使えるBorland C++ part2
http://pc3.2ch.net/test/read.cgi/tech/1030493157

386 :デフォルトの名無しさん:02/10/30 19:05
>>383
C++はそれだけ厳格だってこと。

387 :デフォルトの名無しさん:02/10/30 19:11
void *vp;
int *ip;

ip=vp; // CだとOKでC++だとだめ。
ip=(int *)vp; // これならどちらでもOK

388 :デフォルトの名無しさん:02/10/30 19:21
NULLポインタってどういう時使うんですか?
数字の0とは何が違う?

389 :デフォルトの名無しさん:02/10/30 19:22
>>388
勘弁してください。

390 :デフォルトの名無しさん:02/10/30 19:48
ストリームからとりこんでchar配列に格納する関数ってありますか?
改行してもEOFまでひたすらとりこむ関数

391 :デフォルトの名無しさん:02/10/30 19:59
>>390
freadで出来ると思う

392 :デフォルトの名無しさん:02/10/30 20:02
>>391
どもやってみます

393 :デフォルトの名無しさん:02/10/30 21:00
/*演習3-3 en03_3.c*/
/*学籍番号 02C1075 氏名 山下祥隆*/
/*作成日10月10日*/
#include <stdio.h>
int main(void)
{
int num1;
printf("あなたの年齢を入力してください。\n");
scanf("%d",&num1);

double num2;
double num3;
printf("あなたの身長と体重を入力してください(センチ、キログラム)。\n");
scanf("%lf",&num2);
scanf("%lf",&num3);
printf("あなたの年齢は'%d'です。\n");
printf("あなたの身長は、%lf、あなたの体重は%lfです。\n");
return 0;
}


すいません、他の板に書いたら不適切だとのご指摘を頂いたのでこちらに
カキコさせていただきます。二重カキコになりますがお許しくださいm(__)m

上記のプログラムを実行したらランタイムエラーが起きて、
プログラムがうまく実行できません。エラーは0なんですが・・・。

ご指導をいただけたら幸いですm(__)m

394 :デフォルトの名無しさん:02/10/30 21:02
>>393
下の二つのprintf()で引数が足らない。

あと、板ではなくスレね

395 : ◆hMJAPH9PWA :02/10/30 21:06
学籍番号とか氏名とか本気なんだろうか、とか、
作成日から20日たってるけど全然間違いに気付かなかったのか、とか突っ込みどころ満載だけど…。

#トリップ忘れてた…

396 :デフォルトの名無しさん:02/10/30 21:06
>>394
ご返答ありがとうございますm(__)m

申し訳ありませんが引数とは何でしょうか?

わかりました、次から気をつけます。

397 :デフォルトの名無しさん:02/10/30 21:07
>>378
おお!仲間ハケーンだ。
とりあえずVS.NETの学割版かなぁ・・・

398 :デフォルトの名無しさん:02/10/30 21:09
互換モードでもできんのか・・・。
あー面毒さw

399 :デフォルトの名無しさん:02/10/30 21:12
>>395
しまった・・・それ自分のじゃないんです・・・聞かれてコピーしてしまいました・・・
その部分は見なかったことにしてやってください(T^T)

400 :デフォルトの名無しさん:02/10/30 21:13
>>396

printf("あなたの年齢は'%d'です。\n" , num1 );
/* %dで指定したら変数を指定しる!  ↑ ここ。 */

printf("あなたの身長は、%lf、あなたの体重は%lfです。\n", num2 , num3);
/* ここも上と同じで%n.mが二つあるから二つ指定する。    ↑ここと↑ここ。*/

401 :デフォルトの名無しさん:02/10/30 21:13
やたー400げtしてもたw

402 :デフォルトの名無しさん:02/10/30 21:14
func(aa,bb);
とかいうのがあったとしまして
引数二個しかとらないfunc()関数をプログラム中から探し出すとき
$grep 'func(.*,.*)' unko
ってやったら引数2個どころじゃない行が該当します
任意の文字列に「,」を含めない正規表現はどーかけばいいですか?

403 :デフォルトの名無しさん:02/10/30 21:17
>>400
出来ました!本当にありがとうございましたm(__)m


解答していただいた皆様本当にありがとうございましたm(__)m

404 :デフォルトの名無しさん:02/10/30 21:17
>>402
ここはC言語のためのスレッドです。

405 : ◆hMJAPH9PWA :02/10/30 21:18
>>402
C言語とは何の関係もないんじゃ…
とりあえず /func([^,]+,[^,]+)/ でいいんじゃないの?
func("a, b", 10)とか出せないけど。

406 :402:02/10/30 21:26
いた違いでした
ありがとうございます


407 :デフォルトの名無しさん:02/10/30 22:42
>>388

・ヌルポインタは、ポインタが何も参照していない事を示す為に使う。
・ヌルポインタは、副作用無しに free delete できる。

・定数の "0" は、文脈によってヌルポインタ、または整数の 0 として解釈される。ただし、可変長引数、またはプロトタイプをもたない関数の引数に現れた場合は、整数の 0 として解釈される。
 また、整数型とポインター型とで多重定義している関数の引数では、解釈は実装依存となる。
・ヌルポインタのビットパターンは実装依存である。
・条件式にヌルポインターが現れた場合、偽となる。
・ヌルポインタとヌルポインタとは等しい。
・ヌルポインタとその他のポインタとは、常に等しくない。
・ポインタ型によりヌルポインタのビットパターンが異なる場合があるが、コンパイラは(騙されない限り)正しい型を知っているので、比較は正しく行われる。

・NULL は 定数 "0" がヌルポインタとして解釈される場合のみ、定数 "0" の代わりに使用できる。他の文脈では、結果が実装依存となる。
(NULL を整数 0 の代わりに使用してはいけない)
・NULL の定義方法は実装依存である。(#undef NULL は合法)

408 :デフォルトの名無しさん:02/10/30 23:02
>>397
オレはとりあえずVC++のアカデミック買うよ
たぶん1万2千くらいなはず!
フリーはなんだかんだいってフリーだからね
ボーランドごめん!
bccをサンクス・・・

409 :デフォルトの名無しさん:02/10/30 23:06
かるい疑問だけど
よくchar型の配列strを宣言してるソースとかに
char str[256];
ってあるけど、
この256は2の8乗だよね?
分かりそうで分かんない256の意味をテルミー!

410 :デフォルトの名無しさん:02/10/30 23:19
きりがいいんじゃない

411 :デフォルトの名無しさん:02/10/30 23:21
>>409
バッファを2の乗数倍にしておくと、処理によっては早くなるケースも
あるけど、ほとんどの場合、意味は無いんじゃない?

412 :デフォルトの名無しさん:02/10/30 23:32
tmp[100]とかとおなじで、適当なサイズ、ってことさ。

413 :デフォルトの名無しさん:02/10/30 23:34
じゃあなんでstr[0x100]って書かないのさ?

414 :デフォルトの名無しさん:02/10/30 23:37
str[0x100] だとなんか意味ありげ

415 :デフォルトの名無しさん:02/10/30 23:38
バッファってなんでしょうか?

416 :デフォルトの名無しさん:02/10/30 23:42
>>415
検索しる
http://www.wdic.org/


417 :デフォルトの名無しさん:02/10/30 23:44
56gaiikara
256mosukareru

418 :417:02/10/30 23:46
uso

419 :デフォルトの名無しさん:02/10/31 00:04
関数形式マクロで

#define SWAP(a,b) {int temp;temp=a;a=b;b=temp;}

こんなの作ったとするしょ?
で、ソース中に

SWAP(data[left_index],data[right_index]);

こんな風に出てきたら、セミコロンが余計でないの?
あとこの場合はコンマ演算子使えないよね。
でも例えば

#define putsa(str) (putchar('\a',puts(str))

putsa("警告!!");

とかはコンマ演算子使えるしょ?
この二つの違いってなんだ?

420 :デフォルトの名無しさん:02/10/31 00:08
>>419
普通は
#define SWAP_INT(a,b) do { int temp = a; a = b; b = temp } while( 0 )
ってするね

421 :デフォルトの名無しさん:02/10/31 00:09
セミコロンは区切り子なので、
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
と書いてもエラーにはならない罠。

422 :デフォルトの名無しさん:02/10/31 01:00
>>419
え?(プロトタイプ宣言をしていれば)putchar('\a',puts(str))はエラーになるでしょ?
引数が多すぎるって・・・

関数の実引数リストのコンマはコンマ演算子とは別物のはず。評価される順番は保証されていないし。

423 :422:02/10/31 01:05
よく見たら括弧の対応がおかしいな。
そうかputchar('\a'),puts(str);と書きたかったのか。

424 :419:02/10/31 01:21
>>421
空文ってことか。だったらなくてもおkだよね?

>>423
ごめん。まちがった。その通りです。
あとさ、>>490のは
#define SWAP_INT(a,b) {do { int temp = a; a = b; b = temp } while( 0 )}
って書かなくていいん?

>>422
オレが持ってる本に載ってたソースなんだけども
「こういうときはコンマ演算子を使いましょう」
って感じで紹介してるよ。

425 :419:02/10/31 01:22
わりい。
>>490
>>420に訂正

なんで間違ったんだ・・・
もう潮時か・・・

426 :デフォルトの名無しさん:02/10/31 01:39
age

427 :デフォルトの名無しさん:02/10/31 02:17
>#define SWAP_INT(a,b) {do { int temp = a; a = b; b = temp } while( 0 )}

つか、do..while()に終端の ; が無いからコンパイラが文句言うだろ

428 :デフォルトの名無しさん:02/10/31 02:33
char *p = (char *)NULL; という冗長な記法のルーツを教えてください。

429 :デフォルトの名無しさん:02/10/31 02:35
>>428
NULLはvoid *だったため。

430 :デフォルトの名無しさん:02/10/31 02:38
void*から任意の型のポインタへの変更って、昔はキャストが必要だったんですか?


431 :デフォルトの名無しさん:02/10/31 02:48
>>429
要らない。428 のようなコードはクソ。
C++ ではきちんとしたキャストが必要だけど、NULL が型を持ってないから
結局キャストは要らない。

432 :デフォルトの名無しさん:02/10/31 02:49
>>431
>要らない。428 のようなコードはクソ。

早く寝な(藁

433 :428:02/10/31 02:51
あ、昔から不要だったんですか。じゃぁルーツはなんだろう。

>>431
はい。C++では <cstddef> で #define NULL 0 ですね。


434 :デフォルトの名無しさん:02/10/31 02:52
NULL論争するやつは、おそらく勘違いしているヤシが
混ざっているはずなので、まずC FAQを読むべし。

435 :428:02/10/31 02:53
>>434
勘違いしてるのは僕?


436 :デフォルトの名無しさん:02/10/31 02:55
>>435
自信がない奴は読んどいた方がいいよ。
おそらく「そうだったのか」と思うだろうから。

437 :デフォルトの名無しさん:02/10/31 02:56
C/C++が勘違いしやすいように作られているのだから仕方ない。
悪いのは全部C/C++のせい。

438 :デフォルトの名無しさん:02/10/31 02:56
>>419
> #define SWAP(a,b) {int temp;temp=a;a=b;b=temp;}
>>424
> #define SWAP_INT(a,b) {do { int temp = a; a = b; b = temp } while( 0 );}

if(a < b)
  SWAP(a,b);
else
  a = b;

と書いた時、文法エラーになる。
420 が正しい。

>>424
> 「こういうときはコンマ演算子を使いましょう」
その本のタイトルを晒したのち、すぐさま燃やせ。
コンマ演算子は何の役にも立たず、ソースを見にくくするだけの機能しかない事が
既にわかっている。

439 :デフォルトの名無しさん:02/10/31 02:57
>>437
あと、誤解をさも真実のように言いふらす生兵法馬鹿が
過去に大勢いたせい、というのもあるねえ(ワラ

440 :428:02/10/31 02:57
読んできた。
Cでは 0 か ((void*)0) にdefineされるんでしょう?ならキャスト不要では。


441 :デフォルトの名無しさん:02/10/31 02:58
>>437
勘違いしているのはあなたのせい。
プログラムが動かない時、すぐ処理系のせいにする DQN が多くて困る。
一体何でつまずくんだか。

442 :デフォルトの名無しさん:02/10/31 03:00
>>441
言語仕様書を読むことにつまづくんだろうよ(ワラ


443 :428:02/10/31 03:00
期せずして燃料投下した感じだな(w



444 :デフォルトの名無しさん:02/10/31 03:01
>>440
その通り。
432 のような DQN が、428 のようなクソコードを書く。
真に優れた人は char *p = 0; と書く。

445 :デフォルトの名無しさん:02/10/31 03:02
>>442
そら思いっ切り処理系じゃなくて読む人のせいだ。

446 :デフォルトの名無しさん:02/10/31 03:03
正式な言語仕様書が手軽に入手できないのが悪い

447 :428:02/10/31 03:04
では、char *p = (char *)malloc(hoge); もDQNの所業ってことでいいっすね。


448 :デフォルトの名無しさん:02/10/31 03:07
>>447
そりゃ意味が違うとおもうが・・・

449 :428:02/10/31 03:08
>>448
void*からのキャストは不要、の文脈を採用。


450 :デフォルトの名無しさん:02/10/31 03:08
お前等ちゃんと言語仕様書熟読してから使えよ

451 :デフォルトの名無しさん:02/10/31 03:14
>>450
お前がまず読め


452 :デフォルトの名無しさん:02/10/31 03:15
嫁が欲しい

453 :デフォルトの名無しさん:02/10/31 03:19
447とは方向が逆だが、read(fd, (void *)buf, len); もDQNってことでOKだよね(readはBerkleySocketAPIの)。



454 :デフォルトの名無しさん:02/10/31 03:19
>>452
お前がまず嫁

455 :デフォルトの名無しさん:02/10/31 03:32
>>447
そのコードは C じゃなくて C++ だから話が違う。
>>453
DQN。

456 :デフォルトの名無しさん:02/10/31 03:36
>>455
どこがC++?



457 :456:02/10/31 03:37
もちろん、C++でどーしてもstd::mallocを使うならcastしないと駄目ってのはわかってるよ。


458 :デフォルトの名無しさん:02/10/31 03:37
皆さんCとC++は別物ですよ〜。
pascalとDelphiぐらい違います。

459 :デフォルトの名無しさん:02/10/31 03:38
んなこたーわかってるわ。


460 :デフォルトの名無しさん:02/10/31 03:47
>>459
わかってないから言ってるんです。

461 :デフォルトの名無しさん:02/10/31 03:49
>>460
じゃぁ何番が何をわかってないのか書いて(はぁと)


462 :デフォルトの名無しさん:02/10/31 03:52
>>461
皆さんがCとC++は別物ということをわかっていない。

463 :デフォルトの名無しさん:02/10/31 03:57
.........




相手にすんのやめよ・・


464 :デフォルトの名無しさん:02/10/31 04:00
>>463
そうそう。さっさと去れ。

465 :デフォルトの名無しさん:02/10/31 04:03
C++使いが来てはいけないんだよ。嫉み厨の心が乱れちゃうから(w >>463



466 :デフォルトの名無しさん:02/10/31 04:04
C++厨必死だな(w

467 :デフォルトの名無しさん:02/10/31 04:05
釣れてるし。


468 :デフォルトの名無しさん:02/10/31 04:06
ちょっと疑問。
変数の初期化に非定数を指定するのは C では OK なのか?

469 :456:02/10/31 04:08
あのー、強いて言うならどちらもそこそこ好きってだけなんで、>>455
返答願う。


470 :455:02/10/31 04:11
>>468
いや、そう思って VC6 で試したら、477 のコードが通ってしまうので規格見てた。
C99 では 6.7.8 の 4 で 「constant expressions or string literals」 って
書いてある。
ANSI ではどうなんだ?

471 :デフォルトの名無しさん:02/10/31 04:14
このスレは昼と夜で性格が変わるな。

472 :428:02/10/31 04:17
>>470
あら、ごめん。>>448 の宣言と使用は別行ってことにしてください。
でも、gccの3.2で gcc -Wall -ansi -pedantic でも何も警告されんなぁ。



473 :455:02/10/31 04:21
>>472
そうか、じゃあ多分 ANSI では OK だったんだな。
ちなみに今しがた DOS の MS-C6 で試したけど、やっぱり通ったよ。

C++ ならもちろん OK なんだよな。

474 :428:02/10/31 04:22
C99で厳しくなったのか・・・
勉強になりましたサンクスコ


475 :428:02/10/31 04:36
漏れも規格読んでみた。

>>470
6.7.8.4だよねえ。"that has static storage" って限定されてますが・・・・・・


476 :428:02/10/31 04:38
static char *p = malloc... にしたら、"initializer element is not constant" でハネられましたわ。



477 :455:02/10/31 04:39
>>475
すまん。じゃ、いいのか?


478 :428:02/10/31 04:40
他はよんでないからわからんけど、いいんじゃないんかねえ・・
だれかの突っ込みを待ちまつ。


479 :455:02/10/31 04:49
ANSIなんてクソ規格より俺様の趣味を優先しる!!
初期化は定数!!初期化は定数!!

480 :デフォルトの名無しさん:02/10/31 04:52
>>479
寝つきがわるいのか?お子様は突然置きださないでちゃんと麻まで寝なさい。

481 :455:02/10/31 04:56
>>479
おいおい・・・。

482 :デフォルトの名無しさん:02/10/31 10:20
>>479
じゃあまずは&演算子の優先順位から何とかしてくれ。

483 :419:02/10/31 11:50
昨日の問題を掘り起こすんだけど
関数形式マクロってのは、ただ単純に展開するだけだよね。
>>438が書いてる
#define SWAP(a,b) {do { int temp = a; a = b; b = temp } while( 0 );}

if(a < b)
  SWAP(a,b);
else
  a = b;
ってのは、展開して
if(a < b)
{
  do
  {
    int temp = a;
    a = b;
    b = temp
  } while( 0 );
}
else
  a = b;

こういう風には解釈されないの?



484 : ◆hMJAPH9PWA :02/10/31 11:56
そうはならない。正確に展開してね。
というか、わざわざdo{}while()で囲んであるのに、更にそれをブロックで囲んだのは誰?

if(a < b)
{
  do
  {
    int temp = a;
    a = b;
    b = temp
  } while( 0 );
}; /* <- セミコロンが!*/
else
  a = b;

485 :デフォルトの名無しさん:02/10/31 11:58
>>483
if(a < b)
{
  do
  {
    int temp = a;
    a = b;
    b = temp
  } while( 0 );
};
else
  a = b;

こう展開されるのでは?

486 :419:02/10/31 12:01
>>484
そうなるねw

でさ、今>>483に書いたソースでやってみたら
if(a < b)
  SWAP(a,b)
こうやって、最後の;はずしたらできたんだ。
Cって文末には;がいるけど、この場合は例外?
でも好ましくはないよね?
だとすると、ソース中にセミコロンがつくように
マクロの部分を調整するのがベスト?


487 :デフォルトの名無しさん:02/10/31 12:06
#define swap(a, b) {int tmp; tmp=a;a=b;b=tmp;}これではダメなのか?swap(a,b);として普通にコンパイルできるが。

488 :419:02/10/31 12:07
ごめん。まちがった。
オレがやったのはこういうの
#include <stdio.h>
#define putsa(str) {do{putchar('\a');puts(str);}while(0);}

int main(void)
{
  int na;

  printf("整数を入力してください:");
  scanf("%d",&na);

  if(na)
    putsa("その数は0ではありません。")
  else
    putsa("その数は0です。")

return(0);
}
これならおkだった。
あとさ、マクロの部分は{}をつけなきゃだめなんでないの?
それとも複文のときのみ?

489 :419:02/10/31 12:09
>>487
それが最初に本にのってた
で、こうは出来ないのかなって思って質問しますた

490 :487:02/10/31 12:15
>>488
putsaに;がついていなくて気色悪いな。
そう言うのを防止すると言う意味でのdo while(0)か?


491 :419:02/10/31 12:16
>>487
それだと;が一個多いしょ?
空分だけど。
なんか納得いかん。

492 :デフォルトの名無しさん:02/10/31 12:19
多くても別に間違いでは無いから気にする必要もない。


493 :デフォルトの名無しさん:02/10/31 12:21
>>492
その意見を持つヤツに恐ろしく汚いコードを書くヤツは少なくない。

494 :419:02/10/31 12:22
>>492
でもif文とかに使ったらエラーになるじゃん。
{}で括ってないから。
やっぱこういうときはdo{}while使えってこと?

495 :デフォルトの名無しさん:02/10/31 12:26
>>487
>>438

>>494
マクロで複数ステートメント書きたかったら、do { } while(0) は定石。

496 :495:02/10/31 12:28
間違えた。

>>492
>>438

497 :419:02/10/31 12:28
>>495
なるほど。了解しました。
頭に叩き込んでおきます

498 :デフォルトの名無しさん:02/10/31 12:33
C++ だと参照があるから、何も考えずにインライン関数書けばいいんだけどなー。

499 :デフォルトの名無しさん:02/10/31 12:35
>>498
参照とインライン関数ってなんか関係あるんですか?

って言うか最近のインライン関数ってほとんどregister変数とかと同じ扱いでは?(初めからか・・・)

500 :デフォルトの名無しさん:02/10/31 12:39
>>499
registerは指定してもレジスタに割り当てられるけど、
inlineは指定しないと、インライン展開されないでしょ。

501 :デフォルトの名無しさん:02/10/31 12:41
>>500
ないよりましと。なるほど。

502 :デフォルトの名無しさん:02/10/31 12:52
×registerは指定してもレジスタに割り当てられるけど、
○registerは指定しなくてもレジスタに割り当てられるけど、


503 :498:02/10/31 12:54
いや、漏れはそんなに大した事言ってない。
C++ なら関数でも SWAP(a, b) って書き方できるでしょ。
C だと SWAP(&a, &b) って書かなきゃいけない。
それだけ。

ちなみに、最近のコンパイラでは register というキーワードは単に無視してるみたい。
あと、inline 指定しても内容が長かったり呼び出しが多かったり関数ポインタを得てる
場合はインライン展開されない。
頭のいいコンパイラは、inline 指定してなくてもインライン展開する事もある。
というか、C では inline はキーワードじゃないけど。

504 :デフォルトの名無しさん:02/10/31 14:26
そうするとまた「C99にはinlineありますが何か?」という展開になって

505 :503:02/10/31 14:31
何かと言われても、最後の行以外は何も変わらないけど・・・。

506 :デフォルトの名無しさん:02/10/31 15:29
多倍長を使ってint型だけで、1兆+1兆をするって
配列とか使ってやるの?
でも1兆だったらたとえば、
int vc[4]={1,0000,0000,0000};
ってやっても、無駄だよね。
charが使えないからなー。どうしたらいい?

507 :デフォルトの名無しさん:02/10/31 15:31
>charが使えないからなー。
意味が分からない。

508 :デフォルトの名無しさん:02/10/31 15:35
つーかマクロ使わないで関数にしろ

509 :デフォルトの名無しさん:02/10/31 15:36
友達がchar使ったらできるとか言ってたよ
でもintしか使えないから無理だなあって

510 :デフォルトの名無しさん:02/10/31 15:36
誰か>>506に答えてくれーーー

511 :また貴様か!&rlo;!ろり懲はし少 &lro;:02/10/31 15:37
              ヽ \
             / \ \
       ∧_∧/
      (;´Д`)     i i i
      /    ヽ _   i i i--、
     ./| |   | |   ̄ ̄ ̄ |:::::|.
    / \ヽ/| |       ノ__ノ..
   /   \\| |
   / /⌒\ し(メ    .i i i . .
 / /    > ) \  ノノノ
/ /     / /    .\_  ザックザック
し'     (_つ   /:::::/::...   /ヽ
          ; "ノ・ ./∴: / )i iヽ-、_へ    ,ヘ
          '',, : :―― / / i i i iヽ . ̄ ゙― ノ /
    n_    _/;    i  .ノ / /ノ-' ̄ ゙ ― 、__ノ
  _ノ 二二二、_( _Д_ ;)-ヽ_ノ-'>>506
  ゙ー ''~      ∨ ̄∨

512 :デフォルトの名無しさん:02/10/31 15:37
int vc[4]={1,0000,0000,0000};
でええんちゃう。無駄が多いかもしれんが。

513 :デフォルトの名無しさん:02/10/31 15:39
>>506
sizeog(int) >= 8 の処理系を使う。

514 :デフォルトの名無しさん:02/10/31 15:39
char型の配列に下の位から1バイトずついれるんじゃないの?

515 :デフォルトの名無しさん:02/10/31 15:40
>>512
それでやったら0000ってただの0に解釈されんの?

516 :デフォルトの名無しさん:02/10/31 15:40
贅沢に、int を最小要素としてゾーン 10 進。これ最強。

517 :デフォルトの名無しさん:02/10/31 15:40
8進数?

518 :デフォルトの名無しさん:02/10/31 15:41
10進数で

519 :デフォルトの名無しさん:02/10/31 15:41
せめてパック十進数で。
つーかよくしらねーんだが。

520 :デフォルトの名無しさん:02/10/31 15:43
512 は擬似的なパック 10 進だろう。
正確にはゾーン 10000 進だが。

つーか、ここはネタスレか?

521 :デフォルトの名無しさん:02/10/31 15:46
マジでわかんない。
てかそんな難しい話じゃないと思うよ。
まだ1ヶ月ちょっとしかたってないうちに
出された課題だからさ

522 :デフォルトの名無しさん:02/10/31 15:48
>>521
人ごとみたいないいぐさ。
いいキャラだね。

523 :デフォルトの名無しさん:02/10/31 15:48
printf("1兆+1兆=2兆\n");

524 :デフォルトの名無しさん:02/10/31 15:50
つーかCで多倍長なんかつかえねーよ。

525 :デフォルトの名無しさん:02/10/31 15:50
>>521
一ヶ月でもう授業についていけなくなってるのか。
かわいそうに。

526 :デフォルトの名無しさん:02/10/31 15:52
俺の環境だとdoubleなら一兆入るな。

527 :デフォルトの名無しさん:02/10/31 15:54
パック形式を使った演算処理を思い出した。
時間かかるけど。メモリーの許す限りの数を扱えるからな。

528 :デフォルトの名無しさん:02/10/31 15:55
>>527
桁を増やすたびにreallocするの?

529 :デフォルトの名無しさん:02/10/31 15:57
>>525
多倍長なんて習ってねーんだよ
なのいいきなり出しやがって、あのやろー。
無理なんでないの、こんなの。
お前らから、あのハゲにそう言ってやってくれ。
だってまだ授業じゃ関数の作り方すらやってねーんだもん

530 :デフォルトの名無しさん:02/10/31 16:00
529 は習わないと何もできないのか。
くれぐれもプログラマは目指さないでくれよ。

531 :デフォルトの名無しさん:02/10/31 16:01
ほへ?
多倍長整数、関数使ったほうがすっきりするけど、全部 main() でも
書けない事無いでしょ。

532 :デフォルトの名無しさん:02/10/31 16:02
宿題スレにいけよ・・・

533 :デフォルトの名無しさん:02/10/31 16:02
>>530
あめーな、今出来た。お前よりは頭いいんだよボケ

#include <stdio.h>

int main(void)
{
  int vc1[13]={1,0,0,0,0,0,0,0,0,0,0,0,0};
  int vc2[13]={1,0,0,0,0,0,0,0,0,0,0,0,0};
  int vc_data[13];
  int s;
  int up_s=0;
  int i;
  for(i=12;i>=0;i--)
  {
    s=vc1[i]+vc2[i]+up_s;
    up_s=0;
    if(s<10)
     vc_data[i]=s;
    else
    {
      vc_data[i]=s-10;
      up_s=1;
    }
  }
  for(i=0;i<13;i++)
    printf("%d",vc_data[i]);
  return(0);
}

534 :デフォルトの名無しさん:02/10/31 16:04
結局お前らの誰もわかんなかったんだね
C初めて一ヶ月のオレに何も教えてやれないなんてw
頭のデキがちげーんだよ
特に>>530
煽る事しか能がねーw


535 :デフォルトの名無しさん:02/10/31 16:06
>>528
何桁ごとにreallocするかのか?という発想が欲しいね。
64byte(128桁)ごとに確保していたプログラムを打った。

536 :デフォルトの名無しさん:02/10/31 16:06
バッファリングなしで、正真正銘一文字入力の関数ってなんだっけ?
getche()・・・?

537 :デフォルトの名無しさん:02/10/31 16:09
>>503
inlineに展開しないのは、あとは再帰関数かな。

538 :デフォルトの名無しさん:02/10/31 16:12
>>534
2ちゃんねらーよりあなたのほうがはるかにレベルが上です。
だれもあなたの質問に答えられません。
だからもうここでは聞かないでね
sage

539 :デフォルトの名無しさん:02/10/31 16:14
>>536
バッファリングなしにするのなら、

setvbuf(pf, NULL, _IONBF, 0);
fgetchar(pf);

ってやればいいかな。

540 :デフォルトの名無しさん:02/10/31 16:15
>>538
なに偽者煽ってるんだよ(藁
お前本当に2ちゃんねらーか?

541 :デフォルトの名無しさん:02/10/31 16:15
>>539
setvbufてstdio.h?

542 :539:02/10/31 16:16
おれは一体何を書いているのだ。
fgetchar(pf); /* × */
fgetc(pf); /* ○ */

543 :デフォルトの名無しさん:02/10/31 16:16
>>536
それ。処理系依存だけど。

544 :539:02/10/31 16:17
>>541
そう。C89にある標準関数。

545 :デフォルトの名無しさん:02/10/31 16:21
fgetchar() は標準じゃないぞ。
fgetc() にしる。

546 :デフォルトの名無しさん:02/10/31 16:21
>>544
サンクス!やってみる!

547 :デフォルトの名無しさん:02/10/31 16:22
c言語におけるシンボルっていったいなんなんですか?
変数のこと?

548 :デフォルトの名無しさん:02/10/31 16:23
533 のコードは確かに 1 兆 + 1 兆を計算するが、どう見ても多倍長整数では
ないぞ。

549 :デフォルトの名無しさん:02/10/31 16:24
>>547
グローバルな変数名および関数名の事。

550 :デフォルトの名無しさん:02/10/31 16:26
>>539
多分バッファリングなしに入力ってEnterキーを押さなくても入力できる方法という意味だと思うぞ。
それなら多分setvbufじゃ無理。それとfgetcharってなによ。

551 :デフォルトの名無しさん:02/10/31 16:27
>>550
お。そうそう。
getcharだと\nまで溜め込むしょ?
そうじゃなくて、いちいちリターン押さなくても
入力されるようにしたいのさ

552 :デフォルトの名無しさん:02/10/31 16:28
>>548
マジ!?
多倍長整数て・・・どんなもの?

553 :533:02/10/31 16:31
こんなのは?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
  int vc1[13]={1}; /* 13桁の数字1 (単位は兆で、13桁目は1) */
  int vc2[13]={1}; /* 13桁の数字2 */
  int vc_data[13]; /* 計算結果を格納 */
  int s; /* 一桁ずつ計算して、vc_dataにいれる数 */
  int up_s=0; /* くりあがり(1か0) */
  int i;
  int t;

  srand((unsigned int)time(NULL));

  /* vc1とvc2にランダムで数を入れる */
  for(i=1;i<13;i++){
    vc1[i]=rand()%10;
    vc2[i]=rand()%10;
  }

554 :533:02/10/31 16:33
  /* 計算部分 */
  for(i=12;i>=0;i--){
    s=vc1[i]+vc2[i]+up_s;
    up_s=0;
    if(s<10)
      vc_data[i]=s;
    else{
      vc_data[i]=s-10;
      up_s=1;
    }
  }

/* vc1の表示 */
for(i=0;i<13;i++)
printf("%d",vc1[i]);
printf(" + ");
/* vc2の表示 */
for(i=0;i<13;i++)
printf("%d",vc2[i]);
printf(" = ");
/* 計算結果の表示 */
for(i=0;i<13;i++)
printf("%d",vc_data[i]);
putchar('\n');
return(0);
}

555 :デフォルトの名無しさん:02/10/31 16:36
555

556 :デフォルトの名無しさん:02/10/31 16:42
>>551
機種依存関数を使わないとできないと思うよ。
(この問題はたしかFAQにもあった)

557 :548:02/10/31 16:42
>>552
多倍長整数ってのは、例えば short に対する long とでも思ってくれ。
553-554 はゾーン 10 進と言って、多倍長整数とは別物だ。

558 :デフォルトの名無しさん:02/10/31 16:43
>>556
DOS/Windows なら getch() ね。

559 :デフォルトの名無しさん:02/10/31 16:45
>>557
>多倍長整数ってのは、例えば short に対する long とでも思ってくれ。

これは違うだろ。


560 :デフォルトの名無しさん:02/10/31 16:48
>>559
じゃあどういうこと?
以外にどこにも書いてないよ
多倍長の定義って。

561 :デフォルトの名無しさん:02/10/31 16:55
>>560
定義はしらないけど、ネットで公開されてる多倍長整数演算ライブラリはどれも
>>533みたいに変数をいくつも使ってでかい数を計算するライブラリじゃん。
(もちろんやり方ははるかに洗練されてるけど)

562 :デフォルトの名無しさん:02/10/31 16:59
DOSのディレクトリ名を取得する関数はなんでしょうか?

563 :デフォルトの名無しさん:02/10/31 17:00
>>560
多倍長整数の定義はC言語自体には含まれない。
処理系が独自の型として long long などを持っていたり、
gmp のようにライブラリとして存在する。


564 :デフォルトの名無しさん:02/10/31 17:04
>>562
_dos_findfirst() in <dos.h>
スレ違い。

565 :557:02/10/31 17:07
559 で何故否定されたのか理解できない・・・

566 :デフォルトの名無しさん:02/10/31 17:09
>>564
すいません。有難う御座いました。

567 :デフォルトの名無しさん:02/10/31 17:26
>>561
ってことは>>533でも一応は
多倍長演算になってる?

568 :デフォルトの名無しさん:02/10/31 17:29
>>561
勘違いされるからその表現はやめてくれ。
多倍長整数は、整数というからにはバイナリで整数だ。
「変数をいくつも使ってる」 ように見えるのは、単にデータが複数回に分けないと
アクセスできない大きさだからだ。

569 :デフォルトの名無しさん:02/10/31 17:33
>>568
結局>>567の答えは?
ってたぶん「なってない」だよね。
どうやって出力したらいいんだろ。
バイナリって2真数のことだっけ?
あーわからん。

570 :デフォルトの名無しさん:02/10/31 17:33
>>568
ええ?
じゃあ、単にlongを使っただけで多倍長整数?

571 :デフォルトの名無しさん:02/10/31 17:33
>>567
なってない。あれは単なるゾーン計算。
しかし、関数も教えていない学生に多倍長演算を出題する講師もまた DQN だな。

572 :デフォルトの名無しさん:02/10/31 17:37
>>570
sizeof(long)==sizeof(short)*2 の環境ならそれでも間違いではないけど、
そもそもそれじゃ 1 兆を表現できないでしょ。
一般的に多倍長演算は、処理系で扱えないサイズの整数をなんとか扱おうという
仕組みの事を指すよ。

573 :デフォルトの名無しさん:02/10/31 17:41
double使えばいいじゃん。

574 :デフォルトの名無しさん:02/10/31 17:44
ちなみに 1 兆 = 0xE8D4A51000 だね。最低 40bit 要る。
short * 3 の 48bit か、long * 2 の 64bit で計算するといいだろうね。

575 :デフォルトの名無しさん:02/10/31 17:45
>>573
>>506

576 :デフォルトの名無しさん:02/10/31 18:02
とりあえず、みんなの言ってることが火星語にしか聞こえないオレは
ゾーン演算とやらで、このレポートを提出します。
みんなありがとう。

577 :デフォルトの名無しさん:02/10/31 19:19
ユーザーにカンマを挟んで二つの数字を入力させたいのですが
(ユーザーはカンマも打ち込む)(入力例:2,3)
scanf("%d"",""%d",&x,&y);
とするとうまくいきます。
うまくいくんですが、"%d"に挟まれた","が
どういう働きをしてるのか調べても本に載ってません。
コメントを書かなくてはならないので
ご存知の方どうか教えてください。お願いします。

578 :デフォルトの名無しさん:02/10/31 19:39
>>577
可変個の引数をとるからコンパイルエラーにはならないけど、
それだと引数が多すぎるぞ。
scanf("%d%*[,]%d",&x,&y);でうまくゆくかも。

579 :578:02/10/31 19:40
あ、よくみたら,が"で囲ってあった。
ということはその三つの文字列が連結されて・・・


580 :デフォルトの名無しさん:02/10/31 19:45
scanf("%d,%d",&x,&y);
素直にこう書けばいいってことか。


581 :578:02/10/31 19:49
文字集合じゃないから%*[.]なんて書かないで素直に.と書けばいいか。。

582 :デフォルトの名無しさん:02/10/31 21:03
さげ

583 :デフォルトの名無しさん:02/10/31 21:37
EOFってどうやって入力するんですか?

584 :デフォルトの名無しさん:02/10/31 21:42
DOSならCtrl+Zじゃなかった?

585 :583:02/10/31 21:54
>>584
ありがとうございました。

586 :デフォルトの名無しさん:02/10/31 22:59
多倍長演算
数値にはunsigned short a[N+1];のような配列を用いる.ここでa[0]が整数部分、
a[1]からa[N]までが小数部分で、32768(=32768)進法で表す.たとえば3という値は
a[0]=3,a[1]=...=a[N]=0で表す.log[10]32768≒4.5154であるからm配列要素1個分が
10進4.5桁に相当する.したがって、10進で小数第1000位まで求めるには、N≒1000/4.5≒
222とする.(〜〜うんたらかんたら)
とか書いてあります。
「C言語による最新アルゴリズム事典」(P.179)より抜粋
本読めよ。

587 :デフォルトの名無しさん:02/10/31 23:21
>>586
やべー持ってるw
でも意味わかんねー
勉強します

588 :デフォルトの名無しさん:02/10/31 23:25
cscopeって便利ですよ

589 :デフォルトの名無しさん:02/10/31 23:42
10進数で考えずに、intとかの使える範囲を全部使って、
効率良く詰め込む感じでしょ。

590 :デフォルトの名無しさん:02/11/01 00:00
$ gcc christmas_plan.cgcc:No such plan$ gcc date_with_lover.cgcc:No such lover

591 :デフォルトの名無しさん:02/11/01 00:04
_lwriteのパラメータを教えて下さい。
_lwrite(fp, (LPSTR)&fh, sizeof(fh)); だと
一番左が書き込むファイルのハンドルで、2番目が良くわかんないです。
3番目がfhのバイト数の指定ってとこまでは分かってます。(間違ってたら指摘下さい)
お願いします。

592 :デフォルトの名無しさん:02/11/01 00:06
>>591
書き込むバッファの戦闘アドレスだろうが。


593 :デフォルトの名無しさん:02/11/01 00:07
>>591
スレ違いぽ

594 :デフォルトの名無しさん:02/11/01 00:43
なんでLPSTRなんかでキャストしてるんだろう?

595 :デフォルトの名無しさん:02/11/01 16:37
doubleで表現できる範囲ってどれくらい?
処理系依存なのは分かってるけど、小数点が入ることで
どう変わるのかなって分かんない

596 :デフォルトの名無しさん:02/11/01 17:21
>>595
IEEEフォーマットだと、

struct ieee_double {
u_int dbl_fracl;
u_int dbl_frach:20;
u_int dbl_exp:11;
u_int dbl_sign:1;
};

なので

-(2^52)*2^2047 〜 +(2^52)*(2^2047)-1

かな?


597 :デフォルトの名無しさん:02/11/01 17:31
>>595
<float.h> の DBL_??? の定義を見てください。
DBL_DIG が 10 進での有効桁数。
表せる範囲は DBL_MIN 〜 DBL_MAX です。

598 :デフォルトの名無しさん:02/11/01 19:37
ネットで拾った通信系のソースコード内に、

struct hoge hoge_data {
 bind: hoge_bind,
 accept: hoge_accept,
 ioctl: hoge_ioctl
};

てな構造体定義があったんですけど、この

bind:

のコロンの意味は何でしょうか?
今までこんな書式見たことない・・・制御系の基本なんだったらすみません。

599 :デフォルトの名無しさん:02/11/01 19:39
>>598
ビットフィールドじゃないの?この文脈なら。

600 :デフォルトの名無しさん:02/11/01 19:41
構造体のポインタを関数に渡して操作したいのですが、
bcc32でうまくいきません。

「)がありません」とか「構文エラー」とか「ひきすうが多すぎる」とか
でるのですが、どこがいけませんか?
勘違いをたぶんしてるとおもいますが。

struct Player
{
long money;
long game_num;

/* 省略。longとintしかない。 */

int luck;
}

void play()
{
plyr1.money -= 500;
printf("%ld\n",plyr1.money);
return;
}

int main()
{
Player plyr1;
plyr1.money = 10000;
play(&plyr1);
return 0;
}

601 :598:02/11/01 19:44
あ、hoge_ioctlなどの部分は関数で宣言されてます。
OSはLinuxっす。

ioctlを呼んでいる部分はあるんすけど、hoge_ioctlとかpochi_ioctlとか…
宣言されている同種類(と思える)関数は、どこからも呼ばれている形跡がないので
もしかして上の構造体宣言は、システムコールをハックするような特別な記述なのかなーと
思ったんですが、社内誰も「そんな書式知らん」なんですよ。

>>599
早レスありがとうございます。
ビットフィールドは

型 変数名:ビットサイズ;

と違いましたっけ?


602 :デフォルトの名無しさん:02/11/01 19:45
・・・・・・・・・・・・・・・・・ >>600

void play()

play(&plyr1);

この2行に違和感を感じないのが不思議だ。

603 :デフォルトの名無しさん:02/11/01 19:50
>>602
あ、ゴメソ。

void play(Player *player)
です。

604 :デフォルトの名無しさん:02/11/01 19:51
>>602
あ、ゴメソ。

void play(Player *player)
です。

#age忘れスマソ。
#つーかインデントを&nbsp;に置換しときゃよかった。

605 :デフォルトの名無しさん:02/11/01 19:52
うわー二十カキコスマソ。
回線切れたw

606 :デフォルトの名無しさん:02/11/01 19:54
void play(struct Player *player)

void play(Player *player)

void play(Player *player)

607 :デフォルトの名無しさん:02/11/01 19:56
void play(struct Player *plyr1)
{
plyr1->money -= 500;
printf("%ld\n",plyr1->money);
}

608 :デフォルトの名無しさん:02/11/01 19:56
>>598
これって構造体定義じゃなくて、変数宣言なんじゃねーの?
bindは構造体のメンバで、メンバを指定し、初期化できる仕様が
あるという話をどっかできいたようなきかなかったような…

609 :598:02/11/01 20:00
>>608
回答どうもです。

ん〜、変数で同名のものは見当たらないので、関数へのポインタであると
思ってました。

何にせよ、 bind: のコロン部分の意味がわからない。
付けても付けなくても同じとかゆー ふざけたもんではないと思うし。

今日中にわからないと上司に頃されるわけではないので
どなたか・・・月曜までに(休出)何らかのヒントを・・・でないと犯頃しにされるかも。

610 :デフォルトの名無しさん:02/11/01 20:01
メンバ指定の構造体部分初期化でしょ。

struct hoge {
int a;
int b;
int c;
};

struct hoge hoge_data = {
a: 1,
c: 2
};

みたいなことができるよ。少なくともgccでは。


611 :デフォルトの名無しさん:02/11/01 20:02
何も付けてないとintになるってやつではなかろうか。

612 :デフォルトの名無しさん:02/11/01 20:05
>>606
これがstructつけてもダメなんです。。。

ゴルァって思ってたらソース消してもた
#しかもShift-Delでゴミ箱残ってないw
#どうせクソコードだからいいよ、いいよw

613 :デフォルトの名無しさん:02/11/01 20:06
struct Player
{
long money;
long game_num;

/* 省略。longとintしかない。 */

int luck;
};
最後に;をつける。


614 :デフォルトの名無しさん:02/11/01 20:08
>>609
なんかいろいろ意見がでてるが、gccの拡張仕様だよ。それ。
>>608>>610が正解。
gccのinfoが参照可能なら、C Extensions -> Labeled Elements を見てみましょう。


615 :デフォルトの名無しさん:02/11/01 20:10
>>610
初めて見た。gccはんなこともできるのか。

616 :デフォルトの名無しさん:02/11/01 20:14
>>613
ソース消えましたが、こんど作ったときにやってみます。

さんくすこ。

617 :デフォルトの名無しさん:02/11/01 20:15
ビットフィールドとまぎらわしい。
struct hoge hoge_data = {
a = 1,
c = 2
};
とかだったらいいのに。

618 :デフォルトの名無しさん:02/11/01 20:18
>>616
>>607は無視か?
struct foo *hoge;なら
hoge->a か (*hoge).a だぞ。
hoge.aはダメ。

619 :デフォルトの名無しさん:02/11/01 20:18
:ってC++でのコンストラクタ初期化子を真似たのかな。

620 :608:02/11/01 20:21
>>614
フォローありがと。

>>617
オレも似たような感想を持ったんで、印象に残ってた。
a = 1だと式になっちゃうから、何かとまずいんでは。

621 :598(609):02/11/01 20:27
>>608=620
>>610
>>614
おおう! 知識人さん情報ありがとうございます from 無知人

ううむ・・・拡張仕様でつか。
それで再度確認してみます。

これで上司に頃されないですむ・・・しかも今日中にヒントが得られたと言って
安心させることができる!




と思ったら、さっきトイレ行ってた間に上司帰ってしまって鬱。。。



622 :デフォルトの名無しさん:02/11/01 20:32
正解はこれだ!
struct hoge hoge_data = {
a := 1,
c := 2
};

623 :598(609):02/11/01 20:39
ん?
ioctlやbindってのは、構造体ではなくてlinuxのシステムコール関数のはずなんですが・・・

余計わけわからん(T−T
GCCの解説ページでも探して、解決目指します。
情報どうもでした(引き続き何か情報あればお願いします・・・まだまだ帰れそうにないので)

624 :598(609):02/11/01 20:40
んんん?

てことは、システムコール関数へのポインタとユーザー関数へのポインタを
結びつけて、結果的にシステムコール関数が呼び出されたらユーザー定義の
関数へ流れるよう、ハックしていることになるのかいな???


あーむず。10分ほど休憩しよう。。。

625 :デフォルトの名無しさん:02/11/01 20:41
>>622 禿げ導

626 :デフォルトの名無しさん:02/11/01 20:42
>>598の質問って以前にあった気がするんだが…。見た時デジャブを感じた。ビットフィールドと主張した奴がいて、その後gccの拡張仕様だと分かって最初に主張してた奴がコケにされてた気がする。

627 :デフォルトの名無しさん:02/11/01 20:44
598はstruct hoge の定義を読めば?
hogeのioctlが関数へのポインタか、何かの変数なのか調べる。

628 :598(609):02/11/01 20:53
正直に一部バラします。これで職場バレることが無いことを祈る・・・

拾ったのはGNUとして公開されている某通信系のソースコードで、基本的な概念の説明としてテキストファイルがちょこっと同梱されている以外は
ソースコード内にもコメント一切なし(あっても、 ret = xxx; /* set return code */ 程度)、で泣く泣く解析しているところなんです。

Linux板の某スレで超初心者として質問したこともあり・・・。初Linux・初通信系・初デバイスドライバで頭壊れそうですわ。
んで、その定義部分。

/* Protocol family operations */

struct proto_ops rpf_ops = {
family:PF_AFFIX,
release:rpf_release,
bind:rpf_bind,
connect:rpf_connect,
socketpair:sock_no_socketpair,
accept:rpf_accept,
getname:rpf_getname,
poll:datagram_poll,
ioctl:rpf_ioctl,
listen:rpf_listen,
shutdown:sock_no_shutdown
setsockopt:rpf_setsockopt,
getsockopt:sock_no_getsockopt,
sendmsg:rpf_sendmsg,
recvmsg:rpf_recvmsg,
mmap:sock_no_mmap
};

これ以上の説明なし。 なんとかなるかいな〜


629 :デフォルトの名無しさん:02/11/01 21:11
>>628 分からんならマニュアル嫁
ttp://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Designated-Inits.html#Designated%20Inits

struct point p = { .y = yvalue, .x = xvalue };
is equivalent to
struct point p = { xvalue, yvalue };

Another syntax which has the same meaning, obsolete since GCC 2.5,
is fieldname:, as shown here:
struct point p = { y: yvalue, x: xvalue };


630 :デフォルトの名無しさん:02/11/01 21:21
>>618
Thax.

> >> 607は無視か?
なんかgcc関連の話題で見過ごしてた。ス

631 :デフォルトの名無しさん:02/11/01 21:44
>>628
struct proto_ops は include/linux/net.h にあるみたいやね。
http://rainbow.mimuw.edu.pl/SO/Linux/Kod/include/linux/net.h.html
ほとんど関数だし、こっちでつくった関数をカーネルにわたすんじゃない?


632 :デフォルトの名無しさん:02/11/01 23:18
>>628
プロトコル毎に関数のポインタを構造体にしてるだけじゃないのか?
下位部分から rpf_ops->bind(...) みたいにして使うんでしょ。
パッと見ただけでわかるやん…


633 :デフォルトの名無しさん:02/11/01 23:29
ソースファイル消したのならここから拾えば良いと思ったが、
該当するのかしないのか??

634 :デフォルトの名無しさん:02/11/02 12:53
>>633
何を言ってるの?

635 :デフォルトの名無しさん:02/11/02 17:19

(,, ゚д゚) ┳┳┳┳┳

636 :デフォルトの名無しさん:02/11/02 18:38
ある配列について、その添字の値の範囲を制限したいとき、どうすればいいですか?
例えば、その配列の添字に使うために特別に用意したtypedef enumを使えば、その
タイプを添字に使う限りはいいと思うのですが、そうではなく、もっと一般的に、汎
整数型の添字を使った場合に、コードの中で検査しなくても自動的になんらかの対策
をとる方法はありますか?

637 :デフォルトの名無しさん:02/11/02 18:42
>>636
スマートな回答は無い。
配列を直接扱わず、配列を操作する関数を作る事ぐらいしかできない。
あるいは、C を諦めて C++ に移行する。

638 :デフォルトの名無しさん:02/11/02 18:45
>>636
どういう対策をとりたいのかによって
返事は変わってくると思われ。

639 :デフォルトの名無しさん:02/11/02 18:47
>>636
operator[]を定義して、添え字の値次第で例外を投げるとかにすれば?

640 :デフォルトの名無しさん:02/11/02 18:49
>>636
境界線チェックをきちんとするということ?
なら>>637がいうように関数をつくることしか・・・・

そういえばC++ Primerの配列クラスの作成のところにまさにそんなものがあったような。

641 :デフォルトの名無しさん:02/11/02 18:59
>>639
なにを言っているのかわかりませんが? と突っ込んでみるテスト

642 :デフォルトの名無しさん:02/11/02 18:59
a[n%N];

643 :デフォルトの名無しさん:02/11/02 19:08
正直、642 のコードは役に立たないと思う。
デバッグが難しくなるから、素直に core 吐いて落ちてくれる方がマシだ。

644 :デフォルトの名無しさん:02/11/02 19:21
でも、巧いとはオモタな。
>636には理解できたろうか?

645 :デフォルトの名無しさん:02/11/02 19:24
if(n<0||n/N>=1)
goto label;
a[n];
label:

646 :636:02/11/02 19:26
>>644
Nを要素数にすればn%Nの解が0からN-1になるってことでしょ?

647 :デフォルトの名無しさん:02/11/02 19:34
>>646
当たり。でも 643 参照。
実際のところは 645 にして、エラー処理をするべき。

648 :デフォルトの名無しさん:02/11/02 19:59
CGIを作ってるんですが、
&を入力されると、
test1=1&test2=2&3 (test2に2&3を入れた)
のようになり、うまく切り分けることができません。
&の時はエラーを出すようにするしかないんでしょうか?

649 :デフォルトの名無しさん:02/11/02 20:02
>>648
%2fに変換しろ

650 :デフォルトの名無しさん:02/11/02 20:45
>>648
ん、それってブラウザの問題じゃないの。
URLエンコーディングしてないってことでしょ。

そんなブラウザあるの?

651 :デフォルトの名無しさん:02/11/02 21:04
char * const srcと
const char *strの違いがよく分からん。
上のは「srcは、キャラ型への読み出し専用のポインタ」で、
下のは「srcは、読み出し専用のキャラ型へのポインタ」?
違いが全然わかんねー。だれか分かりやすく教えてくり。

652 :デフォルトの名無しさん:02/11/02 21:09
>>651
上は src = NULL; とするとエラーになる。
下は *src = 'A'; とするとエラーになる。

653 :デフォルトの名無しさん:02/11/02 21:12
>>651
const char*はポインタの指す値を変えられない。char* constはポインタの指す
値は変えられるがポインタそのものは変えられない。

654 :デフォルトの名無しさん:02/11/02 21:13
>>651
http://member.nifty.ne.jp/maebashi/programmer/pointer.html

655 :デフォルトの名無しさん:02/11/02 21:14
擬似的に()でくくってみるとわかるYO

( (char *) const) src; ポインタがconst
( (const char) *) str; charがconst
( (char const) *) str;の方が対比としてはわかりやすいかも。
「後置の*はconstより優先度が低い」と覚えればよい。

656 :デフォルトの名無しさん:02/11/02 21:17
ちなみにchar const*とconst char*は同じだYO。

657 :デフォルトの名無しさん:02/11/02 21:18
例えばポインタ演算子 **p は右から順に結合する。つまり、(* (*p) ) という事だ。
これと同じように考えればいい。

つまり char * const p; は (* (const p)) であり、p そのものを変更する事はできない。
p が指す先を変更する事はできる。

一方 char const * p; は (const (*p)) であり、p そのものは変更する事ができる。
p が指す先を変更する事はできない。

そして char const * const p; は (const (* (const p) ) ) であり、p も p が指す
ものも変更できない。

なお const char * p; は char const * p; と全く同一である。


654-655 の説明は、かえってわかりにくいと思う。
「ポインタ演算子と同じく右から順に結合する」 と覚えればよい。

658 :デフォルトの名無しさん:02/11/02 21:18
練習問題:
char const **p; // 1
char *const*p; // 2
char **const p; // 3
pへの代入がエラーになるのはどれ?
*pへの代入がエラーになるのは?
**pへの代入がエラーになるのは?

659 :デフォルトの名無しさん:02/11/02 21:19
>>648
http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1

660 :デフォルトの名無しさん:02/11/02 21:20
>>648
俺はとりあえず通常通り切り出して、必要なキーをもつ値が見つからなければエラーにするようにしているよ。

661 :デフォルトの名無しさん:02/11/02 21:20
>>648
pへの代入がエラーになるのは3
*pへの代入がエラーになるのは2
**pへの代入がエラーになるのは1

662 :デフォルトの名無しさん:02/11/02 21:23
>>657
じゃあ
char const *p1, *p2;
はどう説明するんだYO

663 :デフォルトの名無しさん:02/11/02 21:24
リードオンリーのポインターって使うことある?
配列名はリードオンリーのポインタだという意見はなしで。

664 :デフォルトの名無しさん:02/11/02 21:29
>>662
それってchar (const *p1), *p2; って意味でしょ。

665 :デフォルトの名無しさん:02/11/02 21:33
環境はVC++.netなのですが、
Cのrand関数を使って乱数を取得したときに5桁の整数が最大になってしまうのですがなぜでしょうか?
7桁の乱数を取得したいのですが・・・

666 :デフォルトの名無しさん:02/11/02 21:35
2つとって掛け合わせるなど、工夫して見たら?

667 :デフォルトの名無しさん:02/11/02 21:35
>>665
> 5桁の整数が最大になってしまうのですがなぜでしょうか?

そういう仕様だからしかたないよ。


668 :デフォルトの名無しさん:02/11/02 21:35
>>665
自前でrand()作れ。

669 :デフォルトの名無しさん:02/11/02 21:36
>>665
(long)rand() * RAND_MAX + rand()とかすれば?

670 :デフォルトの名無しさん:02/11/02 21:38
>>669
それじゃ、出目が偏るでしょ。

671 :651:02/11/02 21:38
char const*とconst char*は一緒なんだ。
const考えるときは型名排除して考えるって感じかな。
ところで上の二つの書き方はどっちの方が好ましいの?

672 :666げt:02/11/02 21:39
単に掛け合わせると偏りが出るもんな。ゴメン

673 :デフォルトの名無しさん:02/11/02 21:41
>>665
rand() が返す値は 0 〜 RAND_MAX です。
RAND_MAX は <stdlib.h> で定義されています。

674 :デフォルトの名無しさん:02/11/02 21:42
>>670
そうか?

675 :デフォルトの名無しさん:02/11/02 21:42
>>671
どっちでもいい。
ただ漏れの意見としては、const が頭の方が定数である事を強調してていいと思う。

676 :デフォルトの名無しさん:02/11/02 21:43
>>664
違うよ。
char const *p1, *p2;
p1もp2もchar const *だよ。

677 :デフォルトの名無しさん:02/11/02 21:44
>>676
そしたら
char const *p1, const *p2;
って書いたらエラー?

678 :デフォルトの名無しさん:02/11/02 21:44
>>665
(int)(
((double)rand() * (RAND_MAX + 1) + rand())
/ ((RAND_MAX + 1) * (RAND_MAX + 1) - 1)
* 1000000000.0
)

679 :デフォルトの名無しさん:02/11/02 21:46
>>675
オレもそう思う。
読むのは慣れれば自然にわかるようになるから
書きやすい方でいいと思うよ。
オレは*const pとか使ったこと全然なかったから、
ずっとconstを先頭にもってきてた

680 :デフォルトの名無しさん:02/11/02 21:46
double a[N][N];
double det(const double matrix[][N]); // 書き換えないのでconstつけた
これでdet(a)と呼ぶと警告が出るんだけど、どうするのが正しいの?

681 :デフォルトの名無しさん:02/11/02 21:47
>>677
エラーだよ。
だから>>657に納得できないの。

682 :デフォルトの名無しさん:02/11/02 21:48
>>680
どんな警告?それでいいんじゃないの?

683 :デフォルトの名無しさん:02/11/02 21:49
>>682
良くないらしい。
warning: passing arg 1 of `det' from incompatible pointer type

684 :デフォルトの名無しさん:02/11/02 21:49
>>678
それって、RAND_MAXがたとえば0x10000だったら、うまく動かないでしょ。

685 :デフォルトの名無しさん:02/11/02 21:50
閑話だが、rand() 関連でこんなページ見つけた。
http://aoki2.si.gunma-u.ac.jp/Hanasi/Algo/letsc/6-body.html
これを書いた香具師はアフォか?

686 :デフォルトの名無しさん:02/11/02 21:51
>>684
どんなコンパイラ?gcc3.2だとエラー出ないぞ。

687 :デフォルトの名無しさん:02/11/02 21:52
>>685
間違いなくアフォです。

688 :デフォルトの名無しさん:02/11/02 21:53
>>684 何で?

689 :デフォルトの名無しさん:02/11/02 21:56
>>688
出目に偏りがでるよ。

690 :デフォルトの名無しさん:02/11/02 21:58
>>684
gcc 2.95.3ではでないぞ(-Wallもつけた)

691 :690:02/11/02 21:58
レス先間違えた。
>>683です。

692 :デフォルトの名無しさん:02/11/02 21:58
>>686
char const *p1, const *p2;
parse error before `const'
gcc 2.96

693 :デフォルトの名無しさん:02/11/02 21:59
>>689
もちろん rand() を 2 回呼ぶ事で偏りは大きくなるけど、それは RAND_MAX が
いくつかどうかは全く関係無いでしょ。

694 :665:02/11/02 22:02
仕様だったのですか。
どうすればいいのでしょうか。アドバイスお願いします。



695 :デフォルトの名無しさん:02/11/02 22:03
>>694
自分で乱数発生関数をかく。

696 :デフォルトの名無しさん:02/11/02 22:04
>>693
つーか、RAND_MAX+1って、たとえば0x7fffみたく+1して、
(2進数で)桁上がりする数値を想定してるでしょ。
たいていの処理系はそうだろうけど、そういう保証はないし。

697 :デフォルトの名無しさん:02/11/02 22:09
>>694
乱数の生成ルーチンは検索すれば、いいのが見つかるんじゃないの?

698 :デフォルトの名無しさん:02/11/02 22:09
>>690
出るよ。-Wallつけなくても。
それに、出て当然だ。
const T *とT *はcompatibleだが、
const T **とT **や
const T *[N]とT *[N]はcompatibleでないから。

699 :デフォルトの名無しさん:02/11/02 22:12
>>698
gcc3.2でも警告でないんですけど・・・・

700 :デフォルトの名無しさん:02/11/02 22:12
>>693
RAND_MAX+1が2のべき乗でないと、
2つの一様分布乱数を足し合わせることになって、
一様分布でなくなる。

701 :デフォルトの名無しさん:02/11/02 22:13
趣味でC言語やってみたいと思ってるんですが、
一万円程度も出して買う価値ありますか?

702 :デフォルトの名無しさん:02/11/02 22:13
>>699
gcc-2.96.1とegcs2.91とVC++6.0とSun Forte 6.0では警告でマシタ。

703 :デフォルトの名無しさん:02/11/02 22:14
>>701
ありません。フリーのを使いましょう。

704 :デフォルトの名無しさん:02/11/02 22:14
>>702
ということはgcc3.2の-Wallって糞?

705 :デフォルトの名無しさん:02/11/02 22:15
>>696
> 桁上がりする数値を想定してるでしょ

してないよ。何で?
範囲が 0 〜 RAND_MAX の場合、発生する乱数の数値の数は常に (RAND_MAX + 1)
でしょうが。
まず手始めに、RAND_MAX == 2 くらいだった時のケースを考えてみなさい。

706 :デフォルトの名無しさん:02/11/02 22:18
>>700
2 進数で考えるなよ。
(RAND_MAX + 1) 進数で考えろ。

707 :デフォルトの名無しさん:02/11/02 22:19
>>705
「桁上がり」という言葉が悪かったかな。
言いたいのは>>700と同じ。

708 :デフォルトの名無しさん:02/11/02 22:20
>範囲が 0 〜 RAND_MAX の場合、発生する乱数の数値の数は常に (RAND_MAX + 1)
>でしょうが。

わけわからん…

709 :デフォルトの名無しさん:02/11/02 22:21
678 は - 1 必要無いよ・・・。

>>665
(int)(
((double)rand() * ((double)RAND_MAX + 1) + rand())
/ (((double)RAND_MAX + 1) * ((double)RAND_MAX + 1))
* 1000000000.0
)

710 :デフォルトの名無しさん:02/11/02 22:22
>>705
(RAND_MAX+1)が2のべき乗じゃなくて、かつ
RAND_MAX*(RAND_MAX+1)がdoubleの有効桁より大きかったら?

711 :デフォルトの名無しさん:02/11/02 22:22
ctimeの戻り値で戻ってくる文字列へのポインタは何者なのでしょうか?
誰が確保して誰が開放しているの?
グローバル変数?

712 :デフォルトの名無しさん:02/11/02 22:23
>>710
桁落ちするね。

713 :デフォルトの名無しさん:02/11/02 22:24
define N 10
double det(const double matrix[][N]) { return 0.0; }
double a[N][N];

int main()
{
det(a);
return 0;
}
これで本当に警告でないの?

714 :デフォルトの名無しさん:02/11/02 22:25
>>710
その場合はそもそも 665 の質問が出てこない。

>>711
グローバル変数。
static で確保されている。
勝手にいじりまわしたりしないように。

715 :デフォルトの名無しさん:02/11/02 22:26
>>713
出る。defineの前に#がない。・・・・・
というのは冗談で、-Wallにしても本当にgcc3.2(MinGW)では通ります。

716 :デフォルトの名無しさん:02/11/02 22:27
>>711
staticな領域へのポインタを返す。
だからリエントラントでないし、2回呼んだら前の値は壊れる。

717 :デフォルトの名無しさん:02/11/02 22:30
713 のソースのどこに問題があるんだ?
(define の # は置いといて)

718 :デフォルトの名無しさん:02/11/02 22:30
>>705
>まず手始めに、RAND_MAX == 2 くらいだった時のケースを考えてみなさい。

RAND_MAX が 2 で下記の計算を実行したら、
(rand() * (RAND_MAX + 1) + rand())

出目の確率はそれぞれ下のように偏るよ。

0=50%
1=25%
2=0%
3=25%

719 :デフォルトの名無しさん:02/11/02 22:32
>>715 ↓これは?
int main()
{
const char **p;
char **p2;
p = p2;
return 0;
}

720 :デフォルトの名無しさん:02/11/02 22:33
>>717
>>698参照

721 :デフォルトの名無しさん:02/11/02 22:37
>>719
それは警告出ました。
invalid conversion from 'char**' to 'const char**'だそうです。

722 :718:02/11/02 22:37
>>718は間違いだ。ごめん。

723 :デフォルトの名無しさん:02/11/02 22:40
>>718
RAND_MAX == 2

(RAND_MAX + 1) == 3

rand(/*1*/) * (RAND_MAX + 1) + rand(/*2*/)
   0   *   3     +   0    = 0
   0   *   3     +   1    = 1
   0   *   3     +   2    = 2
   1   *   3     +   0    = 3
   1   *   3     +   1    = 4
   1   *   3     +   2    = 5
   2   *   3     +   0    = 6
   2   *   3     +   1    = 7
   2   *   3     +   2    = 8

何で結果の範囲が 0 〜 3 なわけ?

724 :718:02/11/02 22:44
> 何で結果の範囲が 0 〜 3 なわけ?

すまん。
頭の中で % 2でやってしまった。


725 :デフォルトの名無しさん:02/11/02 22:44
>>720
const 値を非 const 仮引数に渡すのはダメだけど、
非 const 値を const 仮引数に渡すのが何故いけない?

726 :デフォルトの名無しさん:02/11/02 22:50
>>725
いけなくないと思うが・・・
いけなかったら
char s1[1024],s2[]="abc";
strcpy(s1,s2);
とかできないし。


727 :726:02/11/02 22:52
悪い。
いけないと言っているのは>>720か。

728 :デフォルトの名無しさん:02/11/02 22:53
>>719
↓ちなみにこれですと警告出ません。
int main()
{
const char *const*p;
char **p2;
p = p2;
return 0;
}

729 :723:02/11/02 22:53
で、漏れは結局 >>700 とかが何を訴えたかったのかわからない。
(RAND_MAX + 1) 進数で考えた時、
rand(/*1*/) * (RAND_MAX + 1) は必ず 2 桁目になり、rand(/*2*/) は必ず
1 桁目となって絶対にぶつからず、足し合わされる事は無い。
なのに、そんなに偏りが出たりするわけ?
それと、2 のべき乗か否かは分布に何の関係があるの?

730 :デフォルトの名無しさん:02/11/02 22:55
>>725
なぜかは知らんが↓のように決まっているらしいYO

void f(char const **);
void g(char * const *);
int main()
{ char *p;
f(p); // NG
g(p); // OK
return 0;
}

731 :デフォルトの名無しさん:02/11/02 22:57
>>719 >>728
>>655

732 :デフォルトの名無しさん:02/11/02 22:58
>>723
doubleじゃなくて、長い整数で計算するのかと思ったんだよ。
>rand(/*1*/) * (RAND_MAX + 1) は必ず 2 桁目になり、rand(/*2*/) は必ず
>1 桁目となって絶対にぶつからず、足し合わされる事は無い。
整数なら2桁目の計算が溢れたときぶつかるよね。


733 :デフォルトの名無しさん:02/11/02 22:58
INT compare(STRING s1, STRING s2)
BEGIN
 WHILE *s1++ == *s2
 DO IF *s2++ == 0
  THEN return(0);
  FI
 OD
 return (*--s1 - *s2);
END

これは何をやっている処理なのでしょうか?


734 :725:02/11/02 22:59
>>730
char* と char** は元々非互換だが?

735 :デフォルトの名無しさん:02/11/02 22:59
>>733
1 億光年スレ違い。

736 :デフォルトの名無しさん:02/11/02 22:59
#define BEGIN {
#define END }

737 :デフォルトの名無しさん:02/11/02 23:00
>>733
何じゃこの言語は?

738 :665:02/11/02 23:01
つーか具体的にどうすればいいか教えてちょ

739 :デフォルトの名無しさん:02/11/02 23:01
>>734
まちがえた。
char **p;

740 :デフォルトの名無しさん:02/11/02 23:02
#define WHILE while(
#define DO ){
#define OD }
#define IF if(
#define THEN ){
#define FI }

741 :733:02/11/02 23:02
>>737
Cですが、何か問題がありますか?

742 :725:02/11/02 23:02
>>730
もしかして char *p; は char **p; の間違いか?
それでも、いずれにせよ >>725
いったいその情報はどこから出てきた?

743 :デフォルトの名無しさん:02/11/02 23:03
>>733
CをPascalのソースのようにみせかけるマクロ群か?(w

744 :デフォルトの名無しさん:02/11/02 23:03
>>733
strcmp() と同じ処理。
でも、そのようなソースを書く香具師は足蹴りにしていい。いや、そうすべきだ。

745 :デフォルトの名無しさん:02/11/02 23:04
int compare(char *s1, char *s2)
{
 while (*s1++ == *s2)
  if (*s2++ == 0) return(0);

 return (*--s1 - *s2);
}

746 :デフォルトの名無しさん:02/11/02 23:04
>>733
単にstrcmpを少し効率悪くコーディングしただけだと思うが。

747 :デフォルトの名無しさん:02/11/02 23:04
>>733
Cだとこうなのかな?

int compare(char *s1, char *s2)
{
while( *s1++ == *s2) {
if(*s2++ == 0) return 0;
}
return *--s1 - *s2;
}

748 :デフォルトの名無しさん:02/11/02 23:05
>>738
とりあえず >>709 でしのげ。
乱数の内容に不満があるなら、Web で乱数ライブラリを探せ。

749 :723:02/11/02 23:21
>>732
すまん、レス見落としてた。

> 整数なら2桁目の計算が溢れたときぶつかるよね。
了解。
ただし、その場合は >>714

で、
> 2 のべき乗か否かは分布に何の関係があるの?
これには答えてくれぬのかのう、>>700 の人。気になるんだが。

750 :749:02/11/02 23:22
> > 整数なら2桁目の計算が溢れたときぶつかるよね。
> 了解。
> ただし、その場合は >>714

すまん、見逃してくれ・・・。

751 :デフォルトの名無しさん:02/11/02 23:24
>>749
いや、単に2のべき乗なら、(RAND_MAX+1)かけるかわりに
左シフトすれば、下位はぶつからなくなると思っただけです(敬語)

752 :751:02/11/02 23:28
あ、というか、2のべき乗なら掛け算してあふれてもぶつからないよね。

753 :デフォルトの名無しさん:02/11/02 23:30
つまり、
char random_=rand(20)+rand(20)*20;
とかだったりすると、
取り得る最高値が、399で、mod(256)かかった時に、
399-256=143
143以上(少しずれるのかも)の値が出にくいと言う偏りが出るって事ですよね。
RAND_MAXとchar,int,longのずれが偏りを産むような。

754 :749:02/11/02 23:31
>>751
そうか。了解。
700 を見る限り、2 のべき乗じゃないと何か問題があるとしか読めないから。
安心した。
でも敬語はよして (;´Д`)

755 :749:02/11/02 23:33
>>753
待った。いつ mod(256) なんかかかる?
>>709 の式をよく見てくれ。
double で割って掛けて割合を出している。

756 :デフォルトの名無しさん:02/11/02 23:38
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define RAND_NUM ((double)RAND_MAX + 1)
int main()
{
  unsigned r, i, cnt[10];
  srand(time(NULL));
start:
  memset(cnt, 0, sizeof(cnt));
  for(i = 0; i < 2000000; i++)
  {
    r = (unsigned)( (rand() * RAND_NUM + rand()) / (RAND_NUM * RAND_NUM) * 1000000000.0);
    cnt[r / 100000000]++;

  }
  for(i = 0; i < 10; i++)
    printf("%u ", cnt[i]);
  putchar('\n');
  goto start;
  return 0;
}

757 :753:02/11/02 23:39
charで。
例えだよ。
実数型であれば問題無い。と思う。

758 :755:02/11/02 23:44
>>757
ああ、732 の解説を入れてたのね。了解。

759 :756:02/11/02 23:54
756 は誤爆。
乱数の結果の 1 〜 7 桁目について、0 〜 9 のそれぞれの出現回数をサンプリングする。
試しに実行したけどまあまあなばらつき。各要素が 100000 付近に落ち着く。

#define RAND_NUM ((double)RAND_MAX + 1)
int main()
{
  unsigned r, i, j, cnt[10];
  unsigned div[7] = { 1000000, 100000, 10000, 1000, 100, 10, 1 };
  srand(time(NULL));
start:
  for(i = 0; i < 7; i++)
  {
    memset(cnt, 0, sizeof(cnt));
    for(j = 0; j < 1000000; j++)
    {
      r = (unsigned)( (rand() * RAND_NUM + rand()) / (RAND_NUM * RAND_NUM) * 10000000.0);
      cnt[r / div[i] % 10]++;
    }
    printf("%u: ", i + 1);
    for(j = 0; j < 10; j++)
      printf("%u ", cnt[j]);
    putchar('\n');
  }
  putchar('\n');
  goto start;
  return 0;
}

760 :751:02/11/03 00:06
>>742
ポインタの代入やパラメタ渡しの際には、変数と値がcompatibleであるか、
値が変数へconversionできる必要がある。
const TへのポインタとTへのポインタはcompatibleでない。
TへのポインタはT constへのポインタにconversionできる。
なので、char ** 型の値((char*)へのポインタ)は、
char *const *p ((char *)constへのポインタ型変数)には代入できるが、
const char **p ((const char)*へのポインタ型変数)に
代入することは出来ない。
同様に、double (*)[N] ((大きさNのdouble配列)へのポインタ)は、
double const (*)[N] ((大きさNのdouble constの配列)へのポインタ)
に代入できない。
ISO-C99規格の6.3.2.3と6.7.3を参照。

761 :デフォルトの名無しさん:02/11/03 00:11
>>760 もし本当なら、なぜ↓で警告が出るんで塚?
#define N 10

typedef double T[N];

double det(T const * matrix) { return 0.0; }

T a[N];

int main()
{
det(a);
return 0;
}

762 :デフォルトの名無しさん:02/11/03 00:24
>>760
「なので」 の前と後ろが全然繋がっていない。
FDIS 1999 の 6.3.2.3 と 6.7.3 のどこを見ればそんな解釈ができるんだ?
「なので」 の後ろの部分のように判断した文を引用してくれ。

>>761
まず、コンパイラは何を使っているか晒してくれ。

763 :デフォルトの名無しさん:02/11/03 00:32
>>761
漏れの使っているどのコンパイラでも警告出ないよ。
コンパイラは何を使ってるの?

764 :デフォルトの名無しさん:02/11/03 00:55
>>760
1 つ減らして考えてみようか。
typedef char* LPSTR;

> char ** 型の値((char*)へのポインタ)は、
> const char **p ((const char)*へのポインタ型変数)に
> 代入することは出来ない。

LPSTR* 型の値(LPSTR へのポインタ)は、
const LPSTR *p (const LPSTR へのポインタ型変数)に
代入することは出来ない。

・・・何でだよ。
↓はどうなった?

> TへのポインタはT constへのポインタにconversionできる。

765 :デフォルトの名無しさん:02/11/03 01:10
>>764
おいおい。const LPSTR *はLPSTR const *と同じなんだから、
char * const *だろう。

766 :デフォルトの名無しさん:02/11/03 01:15
>>764
LPSTRへのポインタはLPSTR constへのポインタにconversionできるよ。
>const LPSTR *p (const LPSTR へのポインタ型変数)に
これはLPSTRへのconstポインタ型変数であって
(const LPSTR)へのポインタ型じゃない。

767 :764:02/11/03 01:19
>>765
そーだ、逝ってくる・・・。
ところで、760 にはどう思うの?

768 :デフォルトの名無しさん:02/11/03 01:22
>なので、char ** 型の値((char*)へのポインタ)は、
>char *const *p ((char *)constへのポインタ型変数)には代入できるが、
>const char **p ((const char)*へのポインタ型変数)に
>代入することは出来ない。
typedef char *T; としよう。
T*はT const *へconversionできるが、const char **へはconversionできないし
compatibleでもない。Tとconst char *は別の型だから。
わかった?

769 :760:02/11/03 01:36
あ、>>768も俺ね。
ポインタの代入ができるのは、
6.5.16.1 (1) both operands are pointers to qualified or unqualified
versions of compatible types, and the type pointed to
by the left has all the qualifiers of the type pointed
to by the right;
のとき。だからcompatibleでない型へのポインタは(他で許されてない限り)
代入しちゃいかんのよ。

770 :デフォルトの名無しさん:02/11/03 01:39
>> 768-769
> Tとconst char *は別の型だから。

const 値と非 const 値は、確かに別の型だ。
しかし、別の型だからというだけの理由で変換ができないなら、

> T*はT const *へconversionできる

のは何故だ?

> T*はT const *へconversionできるが、const char **へはconversionできないし
> compatibleでもない。Tとconst char *は別の型だから。

T*はT const *へconversionできるが、const char **へはconversionできないし
compatibleでもない。

> Tとconst char *は別の型だから。

char* が const char* に変換できないなら、char は const char に変換できないのか?
いいや違う。

char* は const char* に変換できる。
でなければ strcmp() 等はプロトタイプが間違っている事になるが、実際はそうではない。

従って char** は const char** に変換できる。

> だからcompatibleでない型へのポインタは(他で許されてない限り)代入しちゃいかん

それは了解。
だが、char* が const char* に変換できないとはどこに書いてある?

771 :770:02/11/03 01:41
追記。
char** は、const char** の役割を充分に果たす。
なのに compatible でないと言いきるのか?
(逆は成り立たないが)

772 :デフォルトの名無しさん:02/11/03 01:46
どうでもいいけど 769 は 760 で示したのとは違う場所を引用してるな。
自分の論に都合のよさそうな場所をみつくろってるだけか?
726 も無視してるみたいだし。

773 :デフォルトの名無しさん:02/11/03 01:51
>>768
(char) * と (char) const * が別と言うなら、
(char *) * と (char *) const * も別だろう。

774 :デフォルトの名無しさん:02/11/03 01:55
>> T*はT const *へconversionできる
>のは何故だ?
規格にそう書いてあるから。
6.3.2.3 (2) For any qualifier q, a pointer to a non-q-qualified
type may be converted to a pointer to the q-qualified
version of the type; the values stored in the original and
converted pointers shall compare equal.

>> Tとconst char *は別の型だから。
>char* が const char* に変換できないなら、char は const char に変換でき
>ないのか?
>いいや違う。
>
>char* は const char* に変換できる。
>でなければ strcmp() 等はプロトタイプが間違っている事になるが、実際はそ
>うではない。
T * → T const *はOKなので、
char * → char const *はOKだよ。(T=char)
char ** → char *const *もOK。(T=char*)
char ** → char const **はダメ。(Tをどう置いてもうまくいかない。)

>だが、char* が const char* に変換できないとはどこに書いてある?
どこにも書いてないよ。

>char** は、const char** の役割を充分に果たす。
>なのに compatible でないと言いきるのか?
規格は言いきってるね。
6.7.6.1 (2) For two pointer types to be compatible, both shall be
identically qualified and both shall be pointers to
compatible types.

775 :760:02/11/03 01:57
>>772
760で書いたのは「conversionできる」「compatibleである」ことを定義した箇所。
768で書いたのは「compatibleでないと代入しちゃいかん」と判断した根拠。

776 :760:02/11/03 02:00
あ、ただし>>760で6.7.3と書いたのは6.7.6.1の間違い。
>>760で書いた
>ISO-C99規格の6.3.2.3と6.7.3を参照。
の重要な部分は>>774に示したから、>>762にも答えたことになると思う。

777 :760:02/11/03 02:05
>(char) * と (char) const * が別と言うなら、
>(char *) * と (char *) const * も別だろう。

compatibleではない。
しかしconversionできる。>>774の通り。


778 :770:02/11/03 02:18
らじゃ。
個人的には、char * → char const * の時点で valid で、それ以上いくつ
ポインタがネストしても OK のような気はするんだが・・・。
規格書じっくり読んでみる。

779 :760:02/11/03 02:21
俺もそう思ってたけど、1段しかダメなんだよー。
実際、const char **にchar **を代入すると警告出るだろ?

780 :デフォルトの名無しさん:02/11/03 02:24
これはエキスパートCプログラミングの48ページからの話題ですか?

781 :デフォルトの名無しさん:02/11/03 02:25
>>780
そうなの?
なんて書いてあるの?

782 :770:02/11/03 02:39
>>779
ところが、VC6 ではそのままスルー。

今 gcc で試したら警告出た。
あれと思って VC6 の方で拡張子を c から cpp に変えたら、警告じゃなくて
エラーになった。
もしかして、ANCI C では OK だったんじゃないか?
だとしたら、漏れらが OK だと思い込んでいたのも頷ける。

783 :デフォルトの名無しさん:02/11/03 03:33
バリバリの明示型キャスト!!
これ最強!!これ最強!!

784 :デフォルトの名無しさん:02/11/03 03:44
>>783
ま、警告を抑制するためだけとかのキャストは最強にクソだわな。

785 :デフォルトの名無しさん:02/11/03 04:14
>>784
でもしかたない場合もあるよ。
例えばstrchrの中でreturnする時。
あれはキャストするしかないよ。第一引数の型はconst char *と決まっているんだから。


786 :デフォルトの名無しさん:02/11/03 04:34
最近のコンパイラは、明示的であっても危険なキャストは警告出すんじゃないか?

787 :デフォルトの名無しさん:02/11/03 06:23
>>786
んなわきゃない
786みたいなド素人は #define {static,const,reinterpret}_cast(type,expr) ((type)(expr)) とでもしてなさいってこった。


788 :60cm浮き上がるストレート:02/11/03 06:42
>>665 遅レス∧クソコードでごめんチャイ。
VC++.netのことはよくわかりませんが、Cのを使ってもいいならこんな感じ?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
long land(long);
int main(void)
{
 printf("7桁の乱数は %ld です\n",land(7));
 return 0;
}
long land(long keta)
{
 long a,b,c,r/*,d,e*/;
 srand(time(0));
 for(a=1,b=1,r=0;a<=keta;a++,b*=10)
 {
  /*e=rand()%10;
  for(d=0;d<=e;d++)
   rand();*/
  c=rand()%10;
  r+=b*c;
 }
 return r;
}

789 :こういう考え方は?:02/11/03 07:36
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
long land(long);
int main(void)
{
  printf("7桁の乱数は %ld です\n",land(7));
  return 0;
}
long land(long keta)
{
  long a,b,c,r/*,d,e*/;
  randomize();
r=floor(((double)random(RAND_MAX/*+1?*/)/RAND_MAX)*10000000l);/**/
  return r;
}


790 :789:02/11/03 07:53
<math.h> 入れといて
<time.h> 要るっけ?


791 :ダメっぽいな:02/11/03 08:06
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

long lrand(long keta)
{
long r;

r=floor(((double)random(RAND_MAX)/RAND_MAX)*10000000l);

return r;
}

int main(void)
{
long r1;

randomize();
printf("7桁の乱数は %ld です\n",r1=lrand(7));
printf("7桁の乱数は %ld です\n",r1=lrand(7));
printf("7桁の乱数は %ld です\n",r1=lrand(7));

return 0;
}


792 :デフォルトの名無しさん:02/11/03 08:17
>>788
rand()%10 を使ってる時点で DQN。
理由は Web に転がっている。

>>789-791
未定義の randomize() や random() を使うな。


いいから >>759 を試せ。

793 :デフォルトの名無しさん:02/11/03 08:49
いきなりエラーが8個もでますが。

794 :デフォルトの名無しさん:02/11/03 09:02
>>793
適切なヘッダはインクルードした?

795 :デフォルトの名無しさん:02/11/03 09:10
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

796 :628:02/11/03 09:13
>>629
>>631
ほか

ヒントどうもっす!
火曜に現場で確認してみます。

797 :デフォルトの名無しさん:02/11/03 09:26
if( aaa && bbb && ccc )
if( aaa | bbb | ccc )

の、aaa~cccの評価の順番はどうなりますか?

798 :デフォルトの名無しさん:02/11/03 09:28
if( aaa || bbb || ccc )およびif( aaa + bbb + ccc )と、if( aaa * bbb * ccc )もおながいします。

799 :デフォルトの名無しさん:02/11/03 09:41
>>797
ttp://www-ccs.ucsd.edu/c/express.html#sequence%20point


800 :デフォルトの名無しさん:02/11/03 09:47
C言語を用いた回路合成システムBach
http://www.sharp.co.jp/corporate/rd/journal-78/13-5-3a.htm

こういうハードウェア設計システムでつかわれる拡張(?)C言語では
C言語に演算のビット幅指定やローテート命令が拡張されているのですが、
普通にCでプログラムを組んでいてもそういうビットがらみの演算って必要なことがありますよね?

俺はインラインアセンブラでやっているのですが、正直、エレガントでないと思うこのごろ。
ポータブルに書くためにはどうしたらいいのでしょうか?

801 :デフォルトの名無しさん:02/11/03 09:48
>>797-798
それぞれ何か適当なメッセージを表示する aaa() bbb() ccc() 関数を作れば
一目瞭然です。

802 :デフォルトの名無しさん:02/11/03 09:50
>>800
ビットにそれぞれ意味を持たせるなら構造体のビットフィールド。
そうでなく単にシフト等を行う場合はむしろインラインアセンブラの方が
スマートです。
C にはローテイトがありませんし。

803 :デフォルトの名無しさん:02/11/03 09:55
>>802
やっぱインラインアセンブラですか。
いままで Z80, 6809, 680x0, x86系 しかやったこと無くて、
最近(なぜか) Power4 (OSは IBM AIX5L) でやれと・・・

制御やさんなどのために、ANSI なんかで関数群が決められているのなら、
まずそっちを実装してしまおうかと考えてたんですが。

これって俺的には Z80 使って Small C 使ってたときからの永遠の課題なんです。

804 :デフォルトの名無しさん:02/11/03 10:03
そんなことより、MMX でローテートができないのは酷い。

805 :デフォルトの名無しさん:02/11/03 12:28
>>801
馬鹿?

806 :デフォルトの名無しさん:02/11/03 13:07
標準関数のエラーチェックはどの程度行っていますか?

807 :デフォルトの名無しさん:02/11/03 13:25
>>806
私は行った覚えがありません。

808 :806:02/11/03 13:30
>>807
fopenでもですか?
勇者ですね。

809 :デフォルトの名無しさん:02/11/03 13:39
fopenは、ファイルが無ければ作るように指定するのが俺のデフォ。

810 :デフォルトの名無しさん:02/11/03 13:46
ディスク容量不足、ライトプロテクト等によりエラー。

811 :806:02/11/03 14:02
読み込みに行きたいときパスが間違っていたらどうするんだろ。
エラー判定せずに空のファイルを作成して見に行くのか?
まさに選ばれし者

812 :デフォルトの名無しさん:02/11/03 14:08
オレが新人のとき先輩から「エラーチェックはしっかりしろよ」と
言われていて「fclose()がエラーの時はどうするんですか?」と
聞いたら「それはエラーにならないからチェックしないでいいよ」と
言われた……

813 :デフォルトの名無しさん:02/11/03 14:10
例外使えよ。

814 :デフォルトの名無しさん:02/11/03 14:13
この場合にはfcloseが例外出してくれないと。

815 :デフォルトの名無しさん:02/11/03 14:23
Cでも例外使えるようになったのか?

816 :(;´Д`):02/11/03 16:07
ファイル長を調べる方法をおしえてください

817 :デフォルトの名無しさん:02/11/03 16:12
>>816
fseek(fp, 0, SEEK_END);
length = ftell(fp);

818 :(;´Д`):02/11/03 16:24
>>816
サンクスコ(;´Д`)

819 :デフォルトの名無しさん:02/11/03 16:33
>>818
DOS/Windowsの上で、テキストモードでfopenしてるときは
817の方法だと、予想外の結果が返ってくることがあるので要注意。

820 :デフォルトの名無しさん:02/11/03 17:14
>>812
fcloseでもディスクへの書き込みが発生するから
エラーの可能性は大いにあり。
その前にfflushしてるなら別だけど。

ネタの意味で書いたんだったらごめんよ。

821 :デフォルトの名無しさん:02/11/03 18:15
つい最近Cを始めたのですが(プログラミング自体始めて)
CってDOS上でしか動かせないのですか?

あと、Cで作られたアプリケーションを見てみたいのですが
どこにあるのでしょうか?

822 :緑茶。(ZAPONEZE) p0225-ip01kagawa.kagawa.ocn.ne.jp:02/11/03 18:16
>>821


823 :緑茶。(ZAPONEZE) p0225-ip01kagawa.kagawa.ocn.ne.jp:02/11/03 18:17
>>821
失礼。Cでもwindowsアプリは作れますよ。
http://www.kumei.ne.jp/c_lang/


824 :821:02/11/03 18:28
>>823ありがとうございます。
最近「Cはダメダメ」とか聞きますけどそれでもCを一生懸命
勉強したいと思います。

いずれはアプリケーションを作りたいです。

825 :デフォルトの名無しさん:02/11/03 19:56
Cをだめだめって言っているやつがだめなんだよ。
2000もXPもCで作られてるのに。

826 :デフォルトの名無しさん:02/11/03 20:47
>>825
あー、だからダメなんだ(藁

827 :デフォルトの名無しさん:02/11/03 20:52
ANSI-C
これ何て読むんですか?
アンシ?アンジ?

828 :デフォルトの名無しさん:02/11/03 20:55
アンシ

829 :デフォルトの名無しさん:02/11/03 21:00
>>827
アンジーですが何か?

830 :デフォルトの名無しさん:02/11/03 21:00
今までJava野郎でしたが、その内部にも踏み込みたいのでC(not C++)はじめました。
しかし慣れないメモリ管理などは怖いので、とりあえず何事も練習だし
JavaのStringみたいなの作ってみるかな〜と思ったのですが、
メソッドに対して自分自身のポインタを渡す方法が分かりません。
これでは、せっかく自分自身を適切に扱う関数へのポインタをメンバとして持ってても、
(strをインスタンスとして)
str.strcpy( &str , "This is Test!!");
~~~     ~~~~~
になってしまい、ダサさ&バグ100倍です。
プリプロセスでまとめて……なんての以外で、なにかうまい方法はないものでしょうか?

831 :デフォルトの名無しさん:02/11/03 21:23
>>830
Cだとプリプロセスでごちゃごちゃやる以外にうまくやる方法はないと思うよ。
昔そのあたり追及してみたけど、おれには無理でした。

あるのなら教えて欲しい。

自分自身のインスタンスを渡す必要があるならC++使っといたほうがいいと思う。

832 :デフォルトの名無しさん:02/11/03 21:33
安西

833 :デフォルトの名無しさん:02/11/03 21:34
>>830
#define invokevirtual(obj,method,...) ((obj)->vtbl->(method)(obj,...))

834 :太田:02/11/03 22:43
C言語とはあまり関係ないことですが、
makeすると以下のエラーが出てしまいます。

make: Fatal error in reader: Makefile, line 317: Unexpected end of line seen

Makefileの間違いは見つけにくくてよく困ります。
Makefileを書く際のコツ(間違いやすいポイント)がありましたら教えてください。



835 :デフォルトの名無しさん:02/11/03 22:46
>>830
ネタだろ?
str.の.ってなんだよ。
str.いらねーじゃん。

836 :デフォルトの名無しさん:02/11/03 22:58
>>835
char* mystrcpy (char* dst, const char* src) { 〜 }
struct { char* (*strcpy) (char*, const char*); } str = { mystrcpy };
# 書き方あってるかちょっと自信ないけど。

837 :830:02/11/03 23:03
>831 >833
う〜む、やはりプリプロセスでやるのですか。
そこまでやってしまうと、"Cの味わい"を超えてC++になってしまいますね……
ちょっと前、本質的に安全なコンテナについて思考したときもそんな感じでした……。

>835

名前空間に関するまつわる問題の解決や、
再コンパイルなしのポリモルフィズム実現のために必要と思うのですが……
もっと他によい方法をご存知でしたらぜひ御師事ください。

838 :デフォルトの名無しさん:02/11/03 23:19
> しかし慣れないメモリ管理などは怖いので、とりあえず何事も練習だし

> プリプロセスでまとめて……なんての以外で、なにかうまい方法はないものでしょうか?

> 名前空間に関するまつわる問題の解決や、
> 再コンパイルなしのポリモルフィズム実現のために必要と思うのですが……

どう見てもネタだな。言ってることが矛盾だらけだ。
OOから入った甘チャンにはCは無理だ。一生Java使っとけ。

839 :デフォルトの名無しさん:02/11/03 23:29
>>837
まずは落ち着いてから書き込め
読みづらい

840 :デフォルトの名無しさん:02/11/03 23:57
>>837
なぜJavaの考え方でわざわざCを使うことに拘る?
C++にした方がいいんじゃないか?

841 :830:02/11/04 00:14
>838
う〜む、ネタを出せるほどの能力もありません。
顔を洗って出直してきます。

>839
すみません、Cはまだ慣れてないので、これ以上整理できないのです。

>840
まず、
>今までJava野郎でしたが、その内部にも踏み込みたいのでC(not C++)はじめました。
のとおり、CでJavaっぽくするためにはどうすればいいかを理解する、のは目的です。

さらに、仕事でフレームワークを担当しているので、
「どうせならよりよく部品化・共通化してしまおう」という意思が働き、
Cの本質に反しない範囲でライブラリ的なものを整備してみようかと思ったのです。

しかし、やはり >840 さんの言うとおり、Java -> C よりも、
C++を一段挟んだほうがよさそうですね……
明日から、C++について勉強してみます。

それでは、失礼しました。


842 :デフォルトの名無しさん:02/11/04 00:46
CでSQLServerに繋ぐサンプルなんか公開してる所、誰か知ってたら
教えてもらえませんか?


843 :デフォルトの名無しさん:02/11/04 01:05
SQL教えて〜!!
http://pc3.2ch.net/test/read.cgi/tech/1028653822/l50
の方がヒット率高いんじゃない?

844 : :02/11/04 02:32
ファイルの途中行を編集したいのですが、どのように実現したら良いでしょうか?

イメージとしては
 1日
 2日
 3日
というファイルを
 1日(金)
 2日(土)
 3日(日)
というように編集したいのですが、、

845 :デフォルトの名無しさん:02/11/04 02:42
>>844
while (一行読んでEOFじゃない) {
 if (目的の行か?) {
  行を編集する
  それを出力
 }
 else {
  そのまんま出力
 }
}

テンポラリファイルに書いて、
成功したときのみrenameすればよろし。
元のファイルをとっとくかどうかは適宜判断してくれ。

846 :デフォルトの名無しさん:02/11/04 04:22
>>844
awkでやったほうが早いと思われ。

847 :デフォルトの名無しさん:02/11/04 04:23
>>837
send(obj, message, ...)と書くなら
それほど抵抗はないんじゃないか。

848 : :02/11/04 08:57
>>845
それでは汎用性に欠けるので、

if(目的の行か?)

の部分を

if(読み込んだ行が日付であるかどうかを自動解析して、日付であるか?) {
曜日を自動取得して出力
}

と出来るソースを書いてみてください。

849 :デフォルトの名無しさん:02/11/04 11:45
プログラム初心者なので間違った質問をしたら、すいません。C++言語を使って
乱数を一万個発生させるプログラムを作りました。それで、発生させた一万個の乱数のうち
ランダムに10個出力させたいのですが、「アドレス」、「番地」という考えが
分かりません。色々と本を調べましたが、よく分かりません。
どなたか教えてください。

850 :デフォルトの名無しさん:02/11/04 11:51
>>849
http://www.amazon.co.jp/exec/obidos/ASIN/4774111422/
嫁!

851 :デフォルトの名無しさん:02/11/04 11:58
すみませんこれはどう解釈したらいいですか?
const char const *(*foo[10])(int **P);

852 :デフォルトの名無しさん:02/11/04 12:06
>>851
ネタとしか思えんほどの複雑さだ。

853 :デフォルトの名無しさん:02/11/04 12:14
二つめのconstは最初のconstと被るから余計。

intへのポインタのポインタを引数にとり、変更できないcharへのポインタを返す、
要素数10の関数ポインタの配列fooを宣言している。

854 :851:02/11/04 12:20
連休中でも2ちゃんみるんだね

855 :デフォルトの名無しさん:02/11/04 14:52
日本の数学界はなんでコンピュータを嫌うの?
http://science.2ch.net/test/read.cgi/math/987602293/

1

856 :デフォルトの名無しさん:02/11/04 14:58
>>855
まず、そこに書かれている英字が読めません意味もわかりません。

857 :デフォルトの名無しさん:02/11/04 15:03
質問があります。
cの上でosのコマンドを使う方法を教えてください。
ちなみにsolarisです。
system()ですか?
馬鹿全開ですいません。

858 :デフォルトの名無しさん:02/11/04 15:07
>>857
shine(const char *)だよ。


859 :sage:02/11/04 15:11
>858
ありがとうございます。
早速明日にでも試してみます。

860 :デフォルトの名無しさん:02/11/04 15:17
>>859
sageの使い方間違ってるし・・・
嘘でも仕様です、とかいうなよ。

861 :デフォルトの名無しさん:02/11/04 15:23
>860
ごめんなさい初心者なんです。
sageの使い方はこれでいいんですか?
>嘘でも仕様です、とかいうなよ。
意味わかりません。板違いなのは分かってますがさらっと教えてくださると嬉しいです。

862 :860:02/11/04 15:29
http://www.wdic.org/?word=%BB%C5%CD%CD+%3ATECH

863 :デフォルトの名無しさん:02/11/04 15:37
>860
いや、仕様の意味は知ってますけど・・・
つまり、この場合は『sageの使い方がわかんなかったことを、自分以外のせいにするな』ってこと?
あってたら無視してください、間違ってたら再教授お願いします。

864 :860:02/11/04 15:44
つまり、漏れがいいたかったのは、
>sageの使い方間違ってるし・・・
と言われたことに腹を立てて、(本当は知らないのに)
「知ってるよボケ」とか書き込んでくんなよという意味
ワカタカイ?

865 :860:02/11/04 15:45
>>863
あとリンクは>じゃなくて>>

866 :デフォルトの名無しさん:02/11/04 15:49
>>860
んなこと誰が決めたんだよ!!!

867 :デフォルトの名無しさん:02/11/04 15:51
>>866
2chができた時から決まってんだよ???

868 :863:02/11/04 15:53
>>864
ありがとうございます。
あと866は僕じゃないですからね。
なんか2chで初めて親切な人に会ったかのような・・・(笑)

869 :860:02/11/04 15:55
>>868
どういたしましてモルァ。

870 :875:02/11/04 16:14
どう致しまして。

871 :1:02/11/04 16:17
どう致まして。

872 :おながいします:02/11/04 16:36
c言語勉強し始めたばかりのもんです。現在自宅のWINDOWSで
「はじめてのc言語」という本の付録についていたコンパイラ
(LSI C−86VER3.30試食版)というのを使用しています。
プログラム自体はMS−DOSを立ち上げてノートパッドで書き込み
しているのですが最近エデイターの存在を知りました。
それでお聞きしたいのは使いやすいエデイターはないでしょうか?
しかも出来ればフリーのもので。
 以前「1週間でマスターするPERL」という本を購入したのですが
付録のエデイターが色が何色も出ていて字の大きさも適当で使いやすいので
C言語でもこういったエデイターがあれば助かるのですが・・。
本に載っていたTeraPadというのを試してみたんですがちょっと
使いにくいです。秀丸エデイタというのが使いやすそうな感じなんですが
正直シェアウェアっていうのを使ったことが無くて。出来ればフリー
のものが良いのですが。長くなってすみません。

873 :デフォルトの名無しさん:02/11/04 16:38
フリーならTeraPad
Shareなら秀丸。
・・・て言うか秀丸のPASSならみんな知ってるんじゃ・・・
(教えてあげないよ)

874 :デフォルトの名無しさん:02/11/04 16:40
っていうか秀丸はPASSなくてもずっとつかえるし・・・

875 :ぽりんきー=872:02/11/04 16:41
>>873
そのPASSがあればただで使えるんですか?
秀丸以外でフリーでいいものないんでしょうか。
教えてください。

876 :デフォルトの名無しさん:02/11/04 16:42
>>872
学生だったら、秀丸は無料で使えるよ。
オレは秀丸使ってるし。
あとオレはbccとCPadっていう組み合わせでやってる。
ドス窓立ち上げなくてもすぐにコンパイルとかできるから
便利だ。VC++っぽくて(・∀・)イイ!w
金ないから、フリーで固めてます

877 :デフォルトの名無しさん:02/11/04 16:43
>>874
マジすか。期限とか機能に制限ないんすか?

878 :manko_chinko ◆GLc2rpKRNM :02/11/04 16:44
ボクはお金がないのでラインエディタを使ってます


879 :デフォルトの名無しさん:02/11/04 16:45
>>877
Nothing!!
ほとんどボランティアだよね。


880 :デフォルトの名無しさん:02/11/04 16:47
可変長の引数をもつ関数で
void tiny_printf(char *format, ...)
{
  int i;
  va_list ap;
  va_start(ap,format);
  for(i=0;i!='\0';i++)
  {
    switch(format[i])
    {
     case 's':
      printf("%s",va_arg(ap,char*));break;
     case 'd':
      printf("%d",va_arg(ap,int));break;
     default:
      assert(0);
     }
     }

   va_end();
   putchar('\n');
}
va_endの引数が間違ってるってエラーが出るんだけど
どういうこと?

int main(void)
{
tiny_printf("sdd","結果・・・",3,5);

return(0);
}

881 :デフォルトの名無しさん:02/11/04 16:47
秀丸はフリーソフトを公開すれば社会人でも無料になるはず。


882 :デフォルトの名無しさん:02/11/04 16:48
TeraPad使いずらいと思う時点で房だな。

おれはずっとTeraPad使ってますけど何か?

883 :デフォルトの名無しさん:02/11/04 16:48
>>879
うげー、今までプログラミングでよく使われてると聞いてたけど
シェアウェアだから全然眼中になかった。
乗り換えるかな・・・
つーか板違いだからこれで終わりにすます。教えてくれてありがと。

884 :デフォルトの名無しさん:02/11/04 16:49
>>880
va_end(ap);
と書き直せ。

885 :872:02/11/04 16:49
今秀丸さんのHP見てきたんですがフリーで使えるのって
ありますか?あったら一応学生なので使いたいです。

↓秀丸さんのHP
ttp://hidemaru.xaxon.co.jp/index.html

886 :デフォルトの名無しさん:02/11/04 16:50
>>882
そりゃよかったね。はいはい。

887 :デフォルトの名無しさん:02/11/04 16:50
>>875
いや、多分違法(秀丸)
けど、まわりの奴はそれで秀丸使ってる奴多い。
俺はTeraPadだけど。
TeraPadって拡張ファイルがフリーで出てたりするから探してみたら?
俺はCとJAVAだし、あれで充分だけど。

888 :デフォルトの名無しさん:02/11/04 16:51
>>885=初心者
ブラクラじゃないんだから直リンすれよ。
あとsageろ。

889 :872:02/11/04 16:52
リンクつながんない。すみません(恥)
TeraPadでもいいですかね。もうちょっと調べます。
ありがとうございました。

890 :デフォルトの名無しさん:02/11/04 16:52
>>886
自作自演だからage

891 :デフォルトの名無しさん:02/11/04 16:53
どういうことって、引数が足りてないんだろ。

http://www.linux.or.jp/JM/html/LDP_man-pages/man3/va_end.3.html
>void va_end(va_list ap);

892 :デフォルトの名無しさん:02/11/04 16:55
>>891
でも本にあったソースをそのまま打っただけなのに・・・
なんなんだこの著者は!!
( ゚Д゚)ゴルァ!

893 :デフォルトの名無しさん:02/11/04 16:57
>>892
著者名と書名さらしageろ!

894 :デフォルトの名無しさん:02/11/04 16:58
>>882
TeraPadってコード書くのはいいんだけど、置換とか文字列操作が遅すぎ!
でも、愛用してるけど。

895 :デフォルトの名無しさん:02/11/04 16:58
va_endに引数が無くてもとおる処理系が
どっかにあったのかな・・・?
まあ大体マクロやから、通るヤツもあるやろうけど。

896 :デフォルトの名無しさん:02/11/04 17:03
ヘルプより
---------
●秀丸フリー制度について
 秀丸エディタは、以下の方々には送金無しで使っていただけます。秀まるおのホ
ームページの「サポート」ページで必要事項を入力して申し込んでください。
 秀まるおのホームページはhttp://hide.maruo.co.jp/ です。

  − WINDOWS関係を扱う本や雑誌の著者の方(著書をお知らせください)

  − フリーソフトウェア作者の方(ソフトを公開していることが条件)
  − 学生の方で難儀している方、または学校内PCでの学生による利用の場合
    (アカデミックフリー制度)

 学生の方の場合で卒業後も継続して秀丸エディタを使用する場合は、そのときに
送金をお願いします。
----------

897 :872:02/11/04 17:07
>>896さん ありがとうございました。

898 :デフォルトの名無しさん:02/11/04 17:37
つぅかメモ帳も立派なエディタだぞと。

899 :892:02/11/04 17:41
技術評論社
前橋和弥 著
C言語ポインタ完全制覇
104ページ

ほんとそのまま載せるんで、チェックきぼんぬ

900 :892:02/11/04 17:42
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>

void tiny_printf(char *format,...)
{
int i;
va_list ap;

va_start(ap,format);
for(i=0;i!='\0';i++)
{
switch(format[i])
{
case 's':
printf("%s",va_arg(ap,char*));
break;
case 'd':
printf("%d",va_arg(ap,int));
break;
default:
assert(0);
}
}


901 :892:02/11/04 17:42

va_end(ap);
putchar('\n');
}

int main(void)
{
tiny_printf("sdd","結果・・・",3,5);

return(0);
}

902 :デフォルトの名無しさん:02/11/04 17:43
>>899
通報しました。

903 :デフォルトの名無しさん:02/11/04 17:54
>>892
こっちは合ってるじゃねーか。
お前が写し間違えたんだろ(w

904 :デフォルトの名無しさん:02/11/04 17:57
>>902
あふぉだね。
ちゃんとこういう風に書いたら、法律的には「引用」に当たるんだよ?
覚えとけ房が

905 :デフォルトの名無しさん:02/11/04 17:57
正誤表ぐらいちゃんとチェックしろよ、、、

http://member.nifty.ne.jp/maebashi/seiha/seigo.html
p.104 List2-5の23行目

va_end();

va_end(ap);

906 :デフォルトの名無しさん:02/11/04 17:58
>904
引用は、引用に対する評論が主でないといかんかった気がする。

907 :892:02/11/04 17:58
>>903
えー!!
したっけ、これコンパイルして実行してみて
本には「結果・・・3 5」ってなってるから
オレはできない・・・

908 :デフォルトの名無しさん:02/11/04 17:59
>>903
禿同。
いるよな自分の未熟を本とかのせいにする奴・・・

909 :デフォルトの名無しさん:02/11/04 17:59
>>904
お前がな。
引用はあくまで「主文」に対する補足的な「副文」でなければならない。
お前が引用と呼ぶ他人の著作物を丸々貼り付ける行為は引用とは認められない。



910 :デフォルトの名無しさん:02/11/04 17:59
引用するなら許可取れよ。


911 :デフォルトの名無しさん:02/11/04 18:02
>>909
同意。「今から宇多田の新曲全部張るぞ!」と声高らかに宣言しているに等しい。

>>910
許可を取らなくても他人の文章を載せてもよい。(>>909他いろいろ制約はある)のが「引用」の目的。

912 :デフォルトの名無しさん:02/11/04 18:02
計算中心のプログラムを打ってるんですが、
計算でよく使う変数をグローバルで宣言、main関数内でmallocにて領域確保
すると計算が速くなる・・・ってことになりますか?
それともコンパイラの速度重視っていうオプションで指定した方が良いでしょうか?

913 :デフォルトの名無しさん:02/11/04 18:05
そのくらい自分でベンチマークとれよ。

914 :デフォルトの名無しさん:02/11/04 18:05
>>912
今のギガヘルツマシンとかだと下手な小細工したところであまり効率は上がらないと思われ。

915 :892:02/11/04 18:05
間違い発見しますた。
死んできます。

916 :デフォルトの名無しさん:02/11/04 18:09
引用と複製の違い
http://www.melonpan.net/aboutcopyright.html
これから考えると、微妙に901は複製にあたる。
まあ、でもどっちでもいーや。

917 :デフォルトの名無しさん:02/11/04 18:11
>>913
あ、そうっすね。ボケてました。

>>914
クラシックPentiumでも軽く・・・っていうのが目標なんで・・・。

ベンチ取りに逝ってきます。

918 :デフォルトの名無しさん:02/11/04 18:56
関数をポインタで扱うっていうのを教えてください。例文付きでお願いします。

919 :デフォルトの名無しさん:02/11/04 19:00
先生教えて下さい!
なぜこれはちゃんと出力されないんでしょうか!!!
#include<stdio.h>

main()
{
char* color_name[]=
{
"hoge",
"piyo",
"hoge_p"
};

printf("%s\n",&color_name);
printf("%s\n",&color_name+1);
printf("%s",&color_name+2);
}


920 :デフォルトの名無しさん:02/11/04 19:03
>>918
int main(int argc,char argv[][])
{
int (*shine)() = main;

printf("無限ループ\n");

shine(argc,argv);
}

921 :デフォルトの名無しさん:02/11/04 19:05
>>919
出力は

hoge
oge
ge

でいいの?

922 :>>921:02/11/04 19:06
hoge
piyo
hoge_p
と出力されると思うんですが文字化け起こしてます。

923 :デフォルトの名無しさん:02/11/04 19:08
>>922
取りあえず配列に対してアドレス操作するのやめなさいな。

文字列ポインタと配列は仕様が似ているだけで別の概念ですわ。


924 :>:02/11/04 19:12
>>923
今Cを勉強していて、実用性の無いプログラムを大量に
作っている毎日ですので・・・
良かったら、なぜちゃんと出力されないのか教えて下さい。

925 :デフォルトの名無しさん:02/11/04 19:16
colornameの中身:&"hoge",&"piyo","hoge_p"

&coloename -> colorname[0] -> &"hoge" != "hoge"



926 :デフォルトの名無しさん:02/11/04 19:18
#include<stdio.h>

main()
{
char* color_name[]=
{
"hoge",
"piyo",
"hoge_p"
};

printf("%s\n",*(&color_name));
printf("%s\n",*(&color_name+1));
printf("%s",*(&color_name+2));
}


927 :デフォルトの名無しさん:02/11/04 19:18
>>923
アフォですか?

928 :デフォルトの名無しさん:02/11/04 19:19
>>925忘れて。

929 :デフォルトの名無しさん:02/11/04 19:21
>>927
確実にアフォですね。
アドレス演算しないんでしょうか?
K&Rは読め無そうですね。(プッ

930 :デフォルトの名無しさん:02/11/04 19:24
┌─────┬─┬─┬─┬─┬─┐        
│ *char   │h │o │g │e  │\n│        
└─────┴─┴─┴─┴─┴─┘        
                         
┌─────┬─┐     ┌─┬─┬─┬─┬─┐
│ char[]   │* ├──→ │h │o  │g │e │\n│
└─────┴─┘     └─┴─┴─┴─┴─┘

                         

931 :930:02/11/04 19:26
ずれた上に反対でした。さようならわが人生。逝ってきます。

932 :930:02/11/04 19:27
遺言です。
┌─────┬─┬─┬─┬─┬─┐        
│ char[]   │h │o │g │e  │\n│        
└─────┴─┴─┴─┴─┴─┘        
                         
┌─────┬─┐     ┌─┬─┬─┬─┬─┐
│ *char   │* ├──→ │h │o  │g │e │\n│
└─────┴─┘     └─┴─┴─┴─┴─┘


933 :デフォルトの名無しさん:02/11/04 19:28
>>926
コンパイルしたんですが、文字化け起こしてます。

934 :デフォルトの名無しさん:02/11/04 19:28
>>932
文字列の終端って\0じゃないの?

935 :デフォルトの名無しさん:02/11/04 19:29
>>930指す元の所に格納されるのはchar *じゃなくて変数名では?

936 :デフォルトの名無しさん:02/11/04 19:31
>>916
俺もそう思った。
しかしニュー速+なんか引用だらけだが。


937 :デフォルトの名無しさん:02/11/04 19:31
>>935
>変数名では

と、言うことはJavaで言うリフレクションのようなことも可能になるのですか?

938 :デフォルトの名無しさん:02/11/04 19:32
>>933
てか素直に配列で書けと
printf("%s\n", color_name[0]);
printf("%s\n", color_name[1]);
printf("%s", color_name[2]);

939 :デフォルトの名無しさん:02/11/04 19:32
>>930
文字列終端は'\0'。凡ミスか?
急ごしらえで作るとそーゆー目にあう。
下の奴も935の言うとおりだろう。

940 :デフォルトの名無しさん:02/11/04 19:35
頼むし >1 にあるC FAQ日本語訳は読んでくんさい。

941 :デフォルトの名無しさん:02/11/04 19:37
>>929
>K&Rは読め無そうですね。(プッ

時代遅れですと。

942 :デフォルトの名無しさん:02/11/04 19:52
>>941
禿同
ANSICの規格読め
K&Rは規格化される以前に書かれてるから(当たり前だけど)
間違いっつーか、規格と違うとこがある
くそ本です

943 :デフォルトの名無しさん:02/11/04 20:03
>>942
今時初版ですか?

>>941の言う時代遅れはきっと意味が違うと思うぞ。


944 :デフォルトの名無しさん:02/11/04 20:05
>>943
ええ、ただの負け惜しみです。

945 :デフォルトの名無しさん:02/11/04 20:08
このスレもラベルが落ちたな。


946 :デフォルトの名無しさん:02/11/04 20:11
goto このスレ;

947 :デフォルトの名無しさん:02/11/04 20:12
このスレ:;

948 :デフォルトの名無しさん:02/11/04 20:14
>>947セミコロンいらない。

949 :デフォルトの名無しさん:02/11/04 20:15
>>950
次スレよろ

950 :949:02/11/04 20:17
そうそう、>>950が次スレ立てるのは伝統で俺が決めたことじゃないから。

951 :デフォルトの名無しさん:02/11/04 20:20
>>949>>950
つまらん。とっとと立てれ。

952 :デフォルトの名無しさん:02/11/04 20:20
>>949
次スレよろ


953 :949:02/11/04 20:21
>>951-952
>>950は漏れじゃないんだけどな

954 :デフォルトの名無しさん:02/11/04 20:22
次スレはちゃんと「俺(私)に聞け」スレでよろ

955 :デフォルトの名無しさん:02/11/04 20:23
スレタイは
C言語のことは漏れらに聞けモルァ!!<39刷>
でどう?


956 :デフォルトの名無しさん:02/11/04 20:25
敢えて、

C言語だけは俺に聞くな!【サンキュー】

957 :デフォルトの名無しさん:02/11/04 20:26
>>956
それじゃスレ内容と全然違うだろ?

i--; /* increment i */
って書くか?


958 :949:02/11/04 20:30
次スレ立てマスタ
http://pc3.2ch.net/test/read.cgi/tech/1036409391/

959 :デフォルトの名無しさん:02/11/04 20:31
サンキューが採用されたのでまぁ、引き分けってとこか。良い勝負だったよ。>>957

960 :デフォルトの名無しさん:02/11/04 20:38
>>957>>955じゃない
>>955は漏れ 引き分けだな。

961 :955:02/11/04 20:42
よくみたら8対2で漏れの勝ちじゃないかモルァ。

962 :デフォルトの名無しさん:02/11/04 20:44
>>948
ラベルの後にはなにかしら文が必要だからセミコロンが必要。

963 :デフォルトの名無しさん:02/11/04 20:46
>>962
そうだったな。スマソ

964 :デフォルトの名無しさん:02/11/04 21:14
>>882,>>894
TeraPadっていいよな。HTML書くときも使ってる。
でもSakuraEditも捨てがたい。
いやEmEditorのインデント機能は最高だ。

TeraPadではインデントがちょっと。。。
ちょっとあさってこよう。



965 :デフォルトの名無しさん:02/11/04 21:22
>>964
やっぱりTpadはいいよな。
SakuraEditor,Emeditorってのは初めて聞いたな。
ダウソして見る。
あと秀丸は個人的には機能がありすぎて苦手かな。
あとVC++のエディタってどうなの?

966 :デフォルトの名無しさん:02/11/04 22:55
>>880 >>900
> va_end();

va_end(ap);
その本、本当に引数何も書いてない?

あと、va_end の説明は読んでない?
それとも書いてない?
前者だったらあなたが DQN、後者だったら本が DQN。

967 :966:02/11/04 22:56
済まん、表示が 801-900 のままだった・・・
逝ってくる・・・

968 :デフォルトの名無しさん:02/11/04 23:10
>>966
マジで書いてないよ。どう見ても書いてない。
va_endの説明は、「たいていの処理系ではただのお飾り」
って書いてある。
ああ、この本失敗かーー。評判よかったのに・・・

969 :966:02/11/04 23:17
>>968
でも、その後に続くレスを見る限りでは、訂正が出ているようだが。
それは見なかったの?
実物が手元に無いから、その本については何とも言えない。

970 :デフォルトの名無しさん:02/11/04 23:27
>>894
> TeraPadってコード書くのはいいんだけど、置換とか文字列操作が遅すぎ!

はっきり言って、外部ツール作って置換させた方が速いよ。
外部ツールは DLL プラグインじゃなくて単なる EXE だから難しいことは無い。
作るなら ↓ の cTeraPad.h がユーティリティーライブラリ。
http://www.egroups.co.jp/files/team-terapad/C%2B%2B/cTeraPad_20020206.lzh
C++ だけど better C としてしか使ってないから C には簡単にダウングレードできる。

971 :よっちゃん:02/11/05 00:04
どうしたらC言語がよくわかるようになりますか?
教えて下さい。

972 :デフォルトの名無しさん:02/11/05 00:05
>>970
・・・要はクソエディタってことか。

973 :デフォルトの名無しさん:02/11/05 00:08
高機能だからといって高性能だとは限らない。


974 :デフォルトの名無しさん:02/11/05 00:08
>>971
C言語の本を10冊詠んでください。

975 :よっちゃん:02/11/05 00:10
そんないいかげんな事言わないで下さい。

976 :デフォルトの名無しさん:02/11/05 00:13
>>973
そして、わざわざ低機能低性能のエディタを選択する理由もない。

977 :デフォルトの名無しさん:02/11/05 00:14
>>975
どうしたら自転車が乗れるようになるか説明できますか?
同じことです。

978 :デフォルトの名無しさん:02/11/05 00:15
C言語の本を10冊泳いでください。

・・・に見えた。


>>975
試しもしないでいい加減と言う訳かい。
あんた一生 「C言語がよくわかる」 ようにならないよ。
漏れも C の本なら 5 冊は読んだし、C で〜〜プログラミング系の本だと
数え切れない。
Web にある解説ページも見て回った。
あんたは何もしないのかい。

つーか次スレ立ってるんだからそっち・・・いや逝くな。

979 :デフォルトの名無しさん:02/11/05 00:15
>>971,>>975
旧すれあげるな

980 :デフォルトの名無しさん:02/11/05 00:16
>>976
「低機能低性能エディタ」 も作れない DQN

981 :デフォルトの名無しさん:02/11/05 00:17
>>975
確かにいい加減だ。本なんぞいくら読んでも書けるようには成らん。
一冊でいい。読みつぶせ。それだけで問題ない。
書いて書いて書きまくれ。基本がわかれば後はもう己の頭の程度の問題だ。
本ばかり読んで言語仕様には詳しいがプログラムは書けない馬鹿が多いのも事実だ。
そうならないようにがんばれ!

982 :よっちゃん:02/11/05 00:21
>981
ありがとうございます。


983 :>>844:02/11/05 00:27
>>845さん >>848さん
亀レスでごめんなさい。

数千行のうち1行しか編集しない場合、非効率に感じるのですが
Cで実現するにはこの方法しか無いようですね。
取りあえず、845さんの方法でやってみます!!

>>846さん
awk()という関数があるのかと思ったら、awkって言語だったのか、、(^_^;
短いプログラムでいろいろ出来そうみたいですが、
今回はCで作ってみます(というかCしか知らないのです)。

984 :デフォルトの名無しさん:02/11/05 01:43
>>983
可変長のファイルシステムを使っており、
行の長さが可変長であれば、
その行がディスクのどの位置にあるか
ファイルの頭から読んでみないと分からないので、
どの言語でもその方法しかない(あったりして)。

例えば一行が 256 byte 固定であれば
n 行目はファイルの先頭より 256 * (n-1) byte 目から始まることが
計算できるのでそこまで fseek(3) すればいい。

985 :デフォルトの名無しさん:02/11/05 07:55
>>984
どちらにしろ、その行がどの行なのかは比較してみないとしょうがないかと。

986 : :02/11/05 08:01
fseek(3)の3は何ですか?
引数は3固定でいいんですか?

987 :デフォルトの名無しさん:02/11/05 08:07
>>986
ファイルを先頭からシークすると言うことです。
固定で構いません。

リファレンスくらい引こうな。

988 :デフォルトの名無しさん:02/11/05 13:13
>>987
ボケにボケで返してどうする。

989 :デフォルトの名無しさん:02/11/06 12:23
ファイルのコード変換で、'\n' → '\r\n' とか '\r' → \'r\n' に変換する
いい方法ってないでしょうか?

ファイルを1バイトずつ覗いて、おきかえって言う方法しかないんでしょうか・・・


990 :デフォルトの名無しさん:02/11/06 12:28
        まもなくここは 乂1000取り合戦場乂 となります。

      \∧_ヘ     / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ,,、,、,,, / \〇ノゝ∩ < 1000取り合戦、いくぞゴルァ!!       ,,、,、,,,
    /三√ ゚Д゚) /   \____________  ,,、,、,,,
     /三/| ゚U゚|\      ,,、,、,,,                       ,,、,、,,,
 ,,、,、,,, U (:::::::::::)  ,,、,、,,,         \オーーーーーーーッ!!/
      //三/|三|\     ∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
      ∪  ∪       (    )    (     )   (    )    )
 ,,、,、,,,       ,,、,、,,,  ∧_∧∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
      ,,、,、,,,       (    )    (    )    (    )    (    )

http://big.freett.com/scheme_a/num1000.swf

991 :デフォルトの名無しさん:02/11/06 12:30
置換してくれるソフトとか使えば?
エディタであるでしょ。

992 :989:02/11/06 12:32
>991

処理の中のバッファファイルなんです。

既存のソフトから標準出力で受け取ると、改行コードがCRLFがLFになってしまって・・・
当方の環境は Linux + gcc です

993 :デフォルトの名無しさん:02/11/06 12:35
>>992
ライブラリを探してきたところで結局やってることは同じだと思われ。
一回は読まないとそこに改行コードがあるか否かなんて判定できないわけで。

994 :デフォルトの名無しさん:02/11/06 12:36
perlで変換かましたら?

995 :989:02/11/06 12:41
> 994

perl -pe 's/\n/\r\n/' wk > wk

とやってみたんですが、

Substitution replacement not terminated at -e line 1.

と返ってきてしまいます。

後、シェルスクリプトって、system()でコールできるんでしょうか?

> 993

それしかないんでしょうか・・・(鬱

996 :デフォルトの名無しさん:02/11/06 12:42
>>995
セミコロンがない。

997 :デフォルトの名無しさん:02/11/06 12:44
つづきはこっちで。
C言語のことは漏れらに聞け!!<サンキュー>
http://pc3.2ch.net/test/read.cgi/tech/1036409391/l50

998 :デフォルトの名無しさん:02/11/06 12:44
そんな面倒なもんでもないと思うが
while ((c = getchar()) != EOF) {
if (c == '\n') putchar('\r');
putchar(c);
if (c == '\r') putchar('\n');
}
\r\n が \r\n\r\n になってしまうが。

999 :デフォルトの名無しさん:02/11/06 12:45
>>995
> perl -pe 's/\n/\r\n/' wk > wk
perl -pe 's/\n/\r\n/' wk > temp; mv -f temp mk
入力ファイルにリダイレクトはできない。

> 後、シェルスクリプトって、system()でコールできるんでしょうか?
yes, でもセキュリティホールには気をつけろよ。

1000 :デフォルトの名無しさん:02/11/06 12:45
perl -pe 's/\n/\r\n/' wk > wk
だと読み込んでる途中の wk を上書きしてエラーになるぞ。

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

242 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)