【初心者歓迎】C/C++室 Ver.40【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.40【環境依存OK】 - 暇つぶし2ch900:デフォルトの名無しさん
07/08/05 18:18:51
BCCなんて糞コンパイラ使ってるからだよm9(^Д^)プギャー

901:デフォルトの名無しさん
07/08/05 18:20:01
しかし886よ、そのプログラムをなんとか動かせたとして、使い方は判ってるのか。

902:デフォルトの名無しさん
07/08/05 18:20:26
これでどう?
URLリンク(sund1.sakura.ne.jp)

903:886
07/08/05 18:24:27
>>902

わざわざアップまで親切にありがとうございます。エラーが4つになりました。
迷惑をお掛けしました。

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
steiner.c:
エラー E2219 steiner.c 40: マクロ 'RANDM' の呼び出しにおける引数の個数が誤ってい
る(関数 buildtree )
エラー E2188 steiner.c 40: 式の構文エラー(関数 buildtree )
エラー E2219 steiner.c 53: マクロ 'RANDM' の呼び出しにおける引数の個数が誤ってい
る(関数 buildtree )
エラー E2188 steiner.c 53: 式の構文エラー(関数 buildtree )
警告 W8066 steiner.c 261: 実行されないコード(関数 main )
*** 4 errors in Compile ***

904:デフォルトの名無しさん
07/08/05 18:25:37
あ、間違えた。

RANDM(a) の a を削除

905:デフォルトの名無しさん
07/08/05 18:27:21
何かこのプログラム永遠に終了しないみたいなんで、
main の最後の return 0; は不要みたいだな。

906:886
07/08/05 18:28:03
>>900

それじゃあ他の只でダウンロードできるやつ、もしくはフリートライアル
のやつをインストールして、やってみた方がいいでしょうか?

>>901

大体何をしたいかはわかってます。後は試行錯誤です。
InputとOutputのサンプルが載っている論文が手元にあります。

907:デフォルトの名無しさん
07/08/05 18:36:18
>>902 で一様buildできたが、何をするんだこれ?

908:デフォルトの名無しさん
07/08/05 18:42:08
>>906
そのまま一生試行錯誤してればいいよ

909:デフォルトの名無しさん
07/08/05 18:48:14
enum {MSG_OK,MSG_YESNO};
enum {ID_OK,ID_YES,ID_NO};
int Message(char* msg ,int type){
char ch;
switch(type){
case MSG_OK:
printf("%s¥tPush Enter>",msg);
scanf("%c",&ch);
return ID_OK;
case MSG_YESNO:
printf("%s y/n>",msg);
scanf("%c",&ch);
return (ch == 'y' ? ID_YES:ID_NO);
}
return 0;
}
int main(){
Message("question",MSG_OK);
if(Message("How do you do?",MSG_YESNO) == ID_YES)
printf("good¥n");
return 0;
}
というプログラムで、わざとPush Enterと出た時に、Enterを押さないで適当なキーを押すと
huga$ ./a.out
question Push Enter>y
How do you do? y/nhuga$
と表示されます。
フォールスルーでもないし、ちゃんと2度目のMessage関数の呼び出しも出来ている
みたいなのですが、なぜこういう風に動くのでしょうか?

910:886
07/08/05 18:48:41
>>907

説明するのが難しいのでとりあえず論文中にあったInputのサンプルです。

1 2 3
1 0 1.6180339887
0 1.6180339887 1
1.6180339887 1 0
-1 0 1.6180339887
0 1.6180339887 -1
1.6180339887 -1 0
1 0 1.6180339887
0 1.6180339887 1
-1.6180339887 1 0
-1 0 -1.6180339887
0 -1.6180339887 -1
-1.6180339887 -1 0

上のようなInputを与えると、(実際どのような手順で与えるかは
試行錯誤しないとわからないのですが)

new record length 18.5529
topology-describing vector
2 3 7 6 7 6 14
.........................

というOutputが出てくるはずです。
Inputは正20面体のすべての頂点の座標で、Outputはこれらすべての頂点を結ぶ木
(サイクルを作らないようなグラフ)の枝の総長を表わしています。

911:デフォルトの名無しさん
07/08/05 18:52:10
最初の scanf("%c",&ch); でその適当に入力した文字が ch に入る。
そして2度目の scanf("%c",&ch); で改行が ch に入る。

912:デフォルトの名無しさん
07/08/05 18:55:22
>>907
一様(いちよう)じゃなくて一応(いちおう)ね
一様は「違い・むらが無い」って意味

913:デフォルトの名無しさん
07/08/05 18:56:46
なんかお子様多いな

914:デフォルトの名無しさん
07/08/05 18:58:18
お前が一番お子様なのにね

915:デフォルトの名無しさん
07/08/05 18:59:23
>>911
>最初の scanf("%c",&ch); でその適当に入力した文字が ch に入る。
>そして2度目の scanf("%c",&ch); で改行が ch に入る。
成る程です。
ちなみに、2度目の関数呼び出しの際、1度めに使われた変数の中身はクリアされないんでしょうか?

916:デフォルトの名無しさん
07/08/05 19:01:02
>>910
正20面体って正三角形が20個でしょ?

917:デフォルトの名無しさん
07/08/05 19:01:15
そもそも関数を抜けた時点で ch の中身は保証されなくなる。

918:デフォルトの名無しさん
07/08/05 19:20:14
>>911
>最初の scanf("%c",&ch); でその適当に入力した文字が ch に入る。
>そして2度目の scanf("%c",&ch); で改行が ch に入る。
すいません、何故勝手に改行が入力されるのでしょうか?
その辺のFAQってどこかにありませんでしょうか?
勉強したいので。

919:デフォルトの名無しさん
07/08/05 19:22:51
「y」と「改行」を入力したでしょう。別に勝手に入るわけじゃない。

920:デフォルトの名無しさん
07/08/05 19:27:57
>>918
scanfの仕様に則っただけだからキニスルナ

921:デフォルトの名無しさん
07/08/05 19:28:59
>>918
FAQだけで簡単に済まそうとしているのが間違い。
もっと基礎的なことからちゃんと勉強したら?
基本を知らずにFAQだけ読んでも、得られるものは少ないと思う。

> エラー E2379 steiner-code.c 39: ステートメントにセミコロン(;)がない(関数 buil dtree )

こんなエラーすらを自分で解決できないのでは、先に進みようが無い。

922:デフォルトの名無しさん
07/08/05 19:39:28
>>921
ごめんなさい、ごめんなさい
あのー、基礎的なことってどんなことですか?
何が基礎的なことなのか分からないのです(>_<)

923:デフォルトの名無しさん
07/08/05 19:40:27
基礎的なこと=何が基礎的なことなのか分からないこと

924:デフォルトの名無しさん
07/08/05 19:44:24
C言語を真面目に勉強しろってさ

925:デフォルトの名無しさん
07/08/05 19:46:27
HelloWorldは書いたかい?

926:デフォルトの名無しさん
07/08/05 19:47:19
a,b,cはint型です。
a=0;b=0;c=0;とするところを、a=b=c=0;としても同じでしょうか?

927:デフォルトの名無しさん
07/08/05 19:49:34
>>926
同じ、それくらい入門書でも読んでくれ。

928:デフォルトの名無しさん
07/08/05 19:55:48
a=b=c=0;この場合の代入の順序はどうなんですか?
a=0,b=0,c=0 順番なのですか?
それとも
a=0,b=a,c=a

929:デフォルトの名無しさん
07/08/05 20:01:36
=(a, =(b, =(c,0) ) );

930:デフォルトの名無しさん
07/08/05 20:04:08
優先順位表見てる?
あれに右左も書いてあるべ

931:デフォルトの名無しさん
07/08/05 20:06:11
a = (b = (c = 0)); ということ

932:926
07/08/05 20:12:50
>>928
アフォか俺でも分かるわ

933:928
07/08/05 20:22:08
>>931 しつこくすみません、低能なもんで
a = (b = (c = 0));は
c=0,b=0,a=0 なのですか?
それとも
c=0,b=c,a=b
つまりb = (c = 0)の処理の場合、b=0、b=cどちらが実行されるのでしょうか?

>>930 優先順位表って何ですか

934:デフォルトの名無しさん
07/08/05 20:29:40
わざわざ1つの式にまとめて書いといて、順序もクソも無いもんだ。

935:デフォルトの名無しさん
07/08/05 20:32:08
>>933
試せよそんぐらい。

936:928
07/08/05 20:34:37
>>935
どうやってどちらが実行されてるか試すのですか?

937:デフォルトの名無しさん
07/08/05 20:40:12
> つまりb = (c = 0)の処理の場合、b=0、b=cどちらが実行されるのでしょうか?

なにか違いが?

938:デフォルトの名無しさん
07/08/05 20:45:33
c=0の評価値は0だ

939:デフォルトの名無しさん
07/08/05 20:47:20
>>936
int a;
char b;
a = b = 12345;
printf("%d %d", a, b);

940:デフォルトの名無しさん
07/08/05 20:47:35
a = (b = (c = 0));

cに0が代入される。
bに(c = 0)の式の値が代入される。この場合0なので0が代入される。
aに(b = (c = 0))の式の値が代入される。この場合0なので0が代入される。

941:840
07/08/05 22:23:56
説明不足で申し訳ありません。
C/C++でstaticを使用する場合グローバルに変数の宣言が必要かと思いますが、
クラスの部品化の観点から、出来るだけグローバル変数の使用は避けたいと考えています。
で、記憶が曖昧なんですが、以前static_castなど(テンプレートを使用していたかもしれません)を使用して
GoFのSingletonパターンを実現している記事を見かけましてこちらで質問させていただきました。
何か情報御座いましたらよろしくお願い申します。


942:デフォルトの名無しさん
07/08/05 22:29:35
>>941
グローバル変数は駄目でシングルトンならいいってのは、どういう理屈かね?

943:デフォルトの名無しさん
07/08/05 22:31:51
>>941
>C/C++でstaticを使用する場合グローバルに変数の宣言が必要かと思いますが、
いや…、必要ないよ

class HOGE
{
public:
 static HOGE& get_instance(){
  static HOGE hoge;
  return hoge;
 }
private:
 HOGE();
};


944:デフォルトの名無しさん
07/08/05 22:42:19
>>877
libjingleではboostからshared_ptrだけとりだしてコピペしてる箇所があるって聞いたぞ。
そんなに面倒とも思わんけどなぁ

945:デフォルトの名無しさん
07/08/05 22:56:04
>>877
依存関係の調査自体は bcp 使えば要らない。結果の膨大さにびびるだろうけど。

946:909
07/08/05 23:23:53
>>919
>「y」と「改行」を入力したでしょう。別に勝手に入るわけじゃない。
え、でもscanfで1文字標準入力を取得した後、
returnでmain関数に戻って、もう一度ifでMesssage関数を呼び出してるから
たとえ、改行文字があっても無視されるんじゃないんですか?
それにこのプログラムが意図したと売りに動く場合の、
一度目にenterおしてifでMessage関数呼び出して、2度目のifでMesssage関数
を呼び出してyを入力した場合、
huga$ ./a.out
question Push Enter>
How do you do? y/n>y
good
の場合はHow do you do? y/nでyとenterを押しているのに
なんで正確に動くんですか?
もしかして標準入力の内容ってバッファみたいなところに貯められるんですか?
>>921
自分は886では無いですよ。
少なくともコンパイルエラーを直してから、質問します。

947:デフォルトの名無しさん
07/08/05 23:27:12
>>941
例えstaticやグローバル変数を避けてシングルトンを実装したとしても、
目的を達成する手段が変わっただけで、本質的には何も変わっていない。

そう書いてから942の焼き直しだと気付いた。

948:デフォルトの名無しさん
07/08/05 23:28:01
>>946
>もしかして標準入力の内容ってバッファみたいなところに貯められるんですか?
そのとおり。
標準入力に限らず入出力にはバッファを利用されることが多い。

949:909
07/08/05 23:42:42
>>948
へぇ、知らなかったです。
そんなこと、本には書いてなかったので。
イメージとしては
入力した文字がメモリのどっかに
hogehugamoge
みたいに保存されて、
そこからscanfの引数の変数の型の分(今回はchar型)
コピーされるみたいな感じなんですかね?


950:デフォルトの名無しさん
07/08/05 23:58:44
そう。
正常に動くケースは、1文字目が改行で2文字目がyで3文字目が改行でしょ。
3文字目は読まれずにバッファに残ったままプログラムが終了するだけ。

951:909
07/08/06 00:11:27
ありがとうです。
んで、何文字バッファに保存されるかはOSの実装によると。

952:デフォルトの名無しさん
07/08/06 00:39:39
普通の使い方なら充分なくらいのバッファはあるはず・・・
10文字程度で満杯とかそんなことはまずない。

953:デフォルトの名無しさん
07/08/06 00:45:25
ストリーム入出力ってのは、バッファリングされる入出力のことだ。

954:デフォルトの名無しさん
07/08/06 03:34:18
すみません質問させてください。
txtファイルから、例えば40.123/42.591/43.569という文字列を読み込んで、
真中の42.591だけを数値として変数に格納したいのですが、
どうにも巧い方法が思いつきませんorz
何卒お力をお貸し頂けますようお願い致します。

955:909
07/08/06 03:35:24
     / ̄ ̄ ̄ ̄\
   / ( ( (  ) .) )\
  / ( ( / ̄ ̄ ̄”\ .) )
  / ( ( |.        | ) )
  ( ( (  |   \ハ/ | ) )
  ( ( (  |  ゚ ̄ 〈 ゚ ̄ | ) )
  ( ( (  |      >   | ) )
  (. ( (  |    /へ)  /  ) )
  \_/|\   ー //\/
  / ̄ ̄\ ゛ーー/ ̄ ̄\
./     \ ̄ ̄ ”/     \
|       ●|・|  ||/       |
|   |    ●|・|  ||/       |
|   \_ ●|・|   ||/       |
.\   》||つ【♪1076】___/

956:デフォルトの名無しさん
07/08/06 03:40:07
>>954
C なのか C++ なのか、まずはそれからだ。

957:954
07/08/06 03:41:45
ごめんなさい、Cでお願いします。
後、sage禁止だったのですね。重ね重ねすみませんorz

958:デフォルトの名無しさん
07/08/06 03:49:30
自己判断で
~~~~~~~~~~~~
寧ろage禁止

959:デフォルトの名無しさん
07/08/06 03:50:58
sage禁止とはなんという斬新なルールなのか

960:954
07/08/06 04:01:48
すみません、以後下げるようにしますorz

961:デフォルトの名無しさん
07/08/06 04:22:28
どっちでもいいよ。自分で判断しる。

962:デフォルトの名無しさん
07/08/06 04:28:03
>>957
いろいろ方法はある。

scanf 系関数を使うなら、
%*f のように書式に * を挟むことで
変数に格納しなくなるようにできるのを利用するとか。

あとは1行取得して、
それを strtok で "/" をデリミタにして処理した2番目の文字列を atof するとか。
strtok を使うのが気持ち悪いなら strchr を使ってもいいかもしんない。

963:957
07/08/06 04:48:30
了解です、状況で判断しますorz

>>962
ご解答頂きありがとうございます。
教えていただいた通り、今回はstrtokを使ってみたいと思います。
%*fという表記は知らなかったので勉強になりました。
本当にどうもありがとうございましたm(_ _)m
また皆様のお力をお借りすることがあるかと思いますが、その時はどうぞよろしくお願い致します。

964:デフォルトの名無しさん
07/08/06 04:52:45
strtok()は癖が強すぎるのでお勧めしない。
scanf()でフォーマットを'%*f/%f/%*f"にしてはいけないのか?

965:957
07/08/06 05:55:20
>>964
strtok()は癖が強いのですか。
strtok()を使ったことが無かったので使ってみようかと思ったのですが、
そういうことであれば素直に%*fを使ってみたいと思います。
アドバイスありがとうございましたm(_ _)m

966:デフォルトの名無しさん
07/08/06 05:56:20
test

967:デフォルトの名無しさん
07/08/06 08:26:44
for(int i=0;i<n1;i++) {                          ←ここに飛びたい場合どうするのが一般的でしょうか?
  // 処理                            ↑
    for(int j=0;j<n2;j++) {                      ↑
        if (a[j] == b)    // 条件が成立したらループを抜けて↑
    }
    //処理
}

968:デフォルトの名無しさん
07/08/06 08:35:09
>>967
つ[goto]

まぁ、アルゴリズムを見直してbreakだな。

969:デフォルトの名無しさん
07/08/06 10:36:46
中のループをboolを返す関数にしてしまって
trueだったらcontinueとかね

970:デフォルトの名無しさん
07/08/06 12:31:43
void f()
{
static char *theTxt;

strcpy(theTxt,"TEST¥n");
printf("%s",theTxt);
}
これってtheTxt;がstaticでnull初期化されているから
駄目なんですか?


971:デフォルトの名無しさん
07/08/06 12:38:10
>>970
theTxtはポインタ。
strcpyはポインタの指すアドレスにデータをコピーする関数。

問題は、theTxtがどこも指していないこと。
mallocで確保するとか、配列にするとか、データの領域をまず用意

972:デフォルトの名無しさん
07/08/06 12:39:01
どこも指してない、つーかNULLで初期化されてっからアドレス0を指してる、とも言えるか。
まあ同じだけど。

973:デフォルトの名無しさん
07/08/06 12:41:58
理解出来ました。
有り難うございます

974:デフォルトの名無しさん
07/08/06 13:35:12
>>972
>アドレス0を指してる、とも言えるか。
いえない。
因みに、初期化されていないポインタは
「何処を指しているかわからない」

975:デフォルトの名無しさん
07/08/06 13:35:58
>>974
staticがついてると0に初期化される

976:デフォルトの名無しさん
07/08/06 13:36:57
static だから = 0 で初期化されている。
ただ、アドレス 0 だとは限らない。

977:デフォルトの名無しさん
07/08/06 13:40:29
もうヌルポインタが0じゃない話はいいから

978:デフォルトの名無しさん
07/08/06 13:57:16
>>977
「ぬるぽはどこも指していない話」じゃないのか?

979:デフォルトの名無しさん
07/08/06 14:04:28
NULLが0なんじゃない、0がNULLなんだよ。

980:デフォルトの名無しさん
07/08/06 15:01:18
        ぬるぽ! ぬるぽ!
    ぬるぽ! ぬるぽ!  ぬるぽ!
  ぬるぽ!  ∩   ∩ ノ)   ぬるぽ!
 ぬるぽ!   川 ∩ 川彡'三つ  ぬるぽ!
ぬるぽ!  ⊂ミ∩、⊂ミ∩彡⊃    ぬるぽ!
ぬるぽ! ⊂三ミ( ゚∀゚)彡三彡三⊃ ぬるぽ!
ぬるぽ!  ⊂彡川⊂彡川ミ⊃    ぬるぽ!
ぬるぽ! ⊂彡川∪⊃ U川彡⊃   ぬるぽ!
 ぬるぽ!  (ノ ∪  川 ∪ミ)  ぬるぽ!
  ぬるぽ!       ∪     ぬるぽ!
    ぬるぽ!  ぬるぽ!  ぬるぽ!
       ぬるぽ!  ぬるぽ!
           ぬるぽ!

981:デフォルトの名無しさん
07/08/06 21:47:18
#define NULL ぬるぽ
#define 0 NULL

982:デフォルトの名無しさん
07/08/06 22:40:13
fopenやifstreamがどういう処理をしているか気になります。
遠回しにAPIを呼んでたりするんですか?

983:デフォルトの名無しさん
07/08/06 22:47:34
そりゃシステムコール呼ばないとファイル開けまへんがな(´・ω・`)
そこらのOS毎の差異を吸収するのも標準ライブラリの役目

984:デフォルトの名無しさん
07/08/06 22:48:24
そう。 遠まわしに、WindowsならCreateFileとかのAPIを呼んでる。

985:デフォルトの名無しさん
07/08/06 22:51:22
まー結局、細部まで一致しないからWINDOWS API使うのが賢い
かなり単純なものでないとCのみでしょり出来ないからな

986:デフォルトの名無しさん
07/08/06 22:53:31
×>>972,>>974
>>976

C言語の仕様によれば、staticな変数は『定数ゼロ』(K&R第2版)で初期化される。
だから
static char *theTxt;
は、
static char *theTxt = 0;
と置き換える。
ここで、定数ゼロは整数型に代入されれば整数0であり、ポインタに代入されればヌルポインタになる。
ヌルポインタは、(アドレス0を指す処理系もあるかもしれないが、)
『どこも指していないポインタ』が正解。実際のbit列がゼロの連続とも限らない。

従って、ヌルポインタはprintf()の引数として処理できない。

ちなみに、『ぬるぽ』はNullPointerExceptionの略で、ヌルポインタではない。

987:デフォルトの名無しさん
07/08/06 22:54:54
BCCで書いているのですが、突然ファイルオープンができなくなりました。
#include<stdio.h>

main(void){
int i,j,k,t;
int No1,No2;
int Rs[3500][20],Hn[3500]={0};
double u,x,y;
double Odds[3500][20],Poll[3500][20],Poll_S[3500][20],Poll_T[3500][20];
FILE *fpr,*fpw;
fpr=fopen("horse.txt","r");
fpw=fopen("r.txt","w");
while(fscanf(fpr,"%d %d %lf %d",&No1,&No2,&u,&k)!=EOF){
Odds[No1][No2-1]=u;
Rs[No1][No2-1]=k;
Poll[No1][No2-1]=0.788/(u-1.0);
Hn[No1]++;
Poll_T[No1][No2]=0;
Poll_S[No1][No2]=0;
}
何か問題はありますか?教えてください。

988:gotoです
07/08/06 22:55:51
たまには私を思い出してください。
ほら、try-catch句がなかったあの頃を思い出してください・・・

989:デフォルトの名無しさん
07/08/06 22:58:45
>>987
釣り?

990:デフォルトの名無しさん
07/08/06 23:02:37
マジです

991:デフォルトの名無しさん
07/08/06 23:03:22
>>987
とりあえずmainの'{'に対応する'}'と、fcloseが足りない。

992:987
07/08/06 23:07:22
すみません。
ソースが長いので省略しています。
コンパイルエラーはないんですが
テキストファイルが読み込めないんです。


993:デフォルトの名無しさん
07/08/06 23:09:38
>>993
実行方法は?
まさか、カレントディレクトリにファイルがないって落ちじゃないよな?

994:デフォルトの名無しさん
07/08/06 23:10:31
horse.txtが無いんじゃね?

995:デフォルトの名無しさん
07/08/06 23:11:32
errno調べてみ

996:987
07/08/06 23:16:06
horse.txtはあります。
今まで動いていたプログラムもファイルが開かなくなりました。
ライトファイルはできます。

997:デフォルトの名無しさん
07/08/06 23:18:07
どっか別のアプリケーションがファイルを開いてるんじゃない?
アプリケーションを全部終了するか、最悪OS再起動したら直るんじゃないかね。

998:987
07/08/06 23:19:45
と思って再起動したんですが直りませんでした。

999:デフォルトの名無しさん
07/08/06 23:22:17
errno !!!

1000:デフォルトの名無しさん
07/08/06 23:26:49
次スレ!!!
スレリンク(tech板)

1001:1001
Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch