■過去ログ置き場に戻る■ 1- 前250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part19
751 名前:デフォルトの名無しさん :03/06/02 18:38
}が足りない。

752 名前:デフォルトの名無しさん :03/06/02 18:39
#include<stdio.h>#include<conio.h>#include<math.h>

main(){ float a1,a2,X=0,x=0,x1=4,x2,s=0,b,i,s1;

printf("分割数入力\n");scanf("%f",&b);

printf("α0入力→\n");scanf("%f",&a1);
printf("α1入力→\n");scanf("%f",&a2);
for(i=1; i<=b; i++){x=x+(1/b);
x2=(a1*a1)+(x*x)/(1+exp(x));
s1=((x1+x2)*(1/b))/2;x1=x2;s=s1+s;
}for(i=1; i<=b; i++){X=X+(1/b);X2=(a2*a2)+(X*X)/(1+exp(X));
S1=((X1+X2)*(1/b))/2;X1=X2;S=S1+S;
}

ごめん。こっちだった。


753 名前:デフォルトの名無しさん :03/06/02 18:42
プリプロセッサ命令は一行にひとつ

754 名前:デフォルトの名無しさん :03/06/02 18:51
大文字小文字を区別できないお前の頭














とでも言って欲しいのか?

755 名前:デフォルトの名無しさん :03/06/02 19:13
なんか、強力なデムパが…










パナウェーブの仕業か!

756 名前:デフォルトの名無しさん :03/06/02 22:20
質問です。
内容としては、ストラウストラップの10章の部分なんですが、
大域・名前空間オブジェクトの順序依存はさけるべきだという
話があって、で初回スイッチというテクニックが紹介されて
いました。オブジェクトが0かどうかをチェックしていますが、
これは、どういうことなんでしょうか?0だとどうで、0じゃないと
どうなんでしょうか?そもそも順序依存とは、オブジェクトが確保
されたかどうかですか?それとも初期設定されたかどうか?

757 名前:デフォルトの名無しさん :03/06/03 01:25
>>756
読まずにレス。静的なポインタ変数をぬるぽと比較してると見た。

758 名前:デフォルトの名無しさん :03/06/03 04:12
ストラウストラップの10章って何のこと?
あの人の書いた本で、ストラウストラップ本とか言われてるのがあるの?

# お、ググったら1件だけあった>ストラウストラップ本

759 名前:デフォルトの名無しさん :03/06/03 13:21
>>758
"Stroustrup本"でググったらもうちょっとでてきたぞ

760 名前:r :03/06/03 14:04
class Hanage {
  enum hanage_len_t{ LONG, SHORT };
  const hanage_len_t length;
  Hanage( hanage_len_t l ) : length( l ) {}
};
こんなクラスがあるんです。このクラスのインスタンスを作るには
Hanage hanage(Hanage::LONG);
だとか、
Hanage* pHanage = new Hanage( Hanage::SHORT );
なんて書きますよね。

ここで、この Hanage::LONG の Hanage:: の部分が、
Hanageのインスタンスを生成しまくる場面ではすごくめんどくさいのです。

たとえば、
class HanageGenerator {
  using class Hanage; // ←こんなのを書いて
  Hanage** Create( int n ) {
    Hanage** buf = new Hanage*[n];
    for( int i = 0; i < n; i++ )
      buf[i] = new Hanage( i % 2 ? LONG : SHORT ); // ←これ!Hanage::の省略!
    return buf;
  }
};
こんな風に書けたら素敵だなぁ、って思うのです。
で、これ-----Hanage::の省略----の実現方法を知ってる人がいたら
教えてくださいませ。

761 名前:デフォルトの名無しさん :03/06/03 14:06
面倒っても、new Hanage(HANAGE_SHORT)とかやるのと大差ないと思うにょ。

762 名前:デフォルトの名無しさん :03/06/03 14:43
>>760
namespace hanage { } で囲み、
enum hanage_len_t はクラスの外でこのnamespace内に移動すれば

using namespace hanageでできないこともないが、美しくはないか

763 名前:756 :03/06/03 21:45
あ、ストラウストラップとはプログラミング言語C++(第3版)
のことです。すんません、わかりづらかったようで。

で、その10章のラストにアドバイスとして次のようなことが書かれて
います。
・大域、名前空間内オブジェクトを構築するときには、順番への依存を避けよ。
・順番への依存を抑えるためには初回スイッチを使え。

この順番への依存とは何の順番なんでしょうか。まぁたとえば静的メンバ
をもつクラスが大域スコープで定義された時のように、ある大域オブジェクト
が他の大域オブジェクトを参照する時のことなんでしょうが、これは要するに
参照しようとした時に、まだ使えない場合があるということなんですかね。
それとも初期設定がされてるかどうかって話なんでしょうか。

10章で紹介されている初回スイッチ(よく使われる戦略だそうで)ですが、
bool型の静的メンバをもつクラスのメンバ関数で、その静的メンバがfalseか
どうかをチェックしています。falseならtrueをセットして初期設定してる
ようです。この手法はコンストラクタがない静的オブジェクトが0で初期設定
されることを利用しているということだそうですが、falseの時はどいう時で
trueの時はどいう時なんでしょうか?(ってわかりづらくてすんません)

764 名前:デフォルトの名無しさん :03/06/03 21:51
> 順番への依存とは何の順番なんでしょうか

大域オブジェクトの初期化の順番は処理系依存

> 初回スイッチ

シングルトンの実装方法を見れば判ると思う

765 名前:デフォルトの名無しさん :03/06/03 22:23
>>763
なんでそんなことも分からないのかが分からない。
初期化してないときがfalseで初期化済みがtrueに決まってるだろ。
bool型の静的メンバの名前が「initialized」だし。

>参照しようとした時に、まだ使えない場合があるということなんですかね。
>それとも初期設定がされてるかどうかって話なんでしょうか。

まだ使えない=初期設定がされてない なので言ってる事がトンチンカン。

766 名前:756 :03/06/03 22:35
レスどうもです。
順番とは初期化のことなんですね。じゃ、とりあえず
初期化されてなくても、参照はできるということは
保証されてるってことですね。うーむ。ということは
大域オブジェクトに何か値をセットするような関り方を
している場合、値をセットした後、0にもどされるって
場合があるってこと?こんがらがってきた・・・。

シングルトンですか・・・なんでしょうかそれは。


767 名前:デフォルトの名無しさん :03/06/03 22:52
> 参照はできるということは保証されてるってことですね。

逆。
初期化されていないオブジェクトを参照できるから、危険。

シングルトンはデザインパターンの本を見れば書いてあるよ。

768 名前:756 :03/06/03 23:12
あ、もちろん安全という認識はないんですが、
言ってることは間違ってないですよね?


そうですか。ちょっと本を探してみます。
ありがとうございました。

769 名前:デフォルトの名無しさん :03/06/03 23:15
初期化って0クリアのことを指してたの?
てっきりコンストラクタ呼び出しのことかと思ってた・・・

それから、初期化時のコンストラクタ呼び出しの順序だけじゃなくて、
mainを抜けた後のデストラクタ呼び出しについても、同様の問題が
起こりうることは覚えておいたほうがいいと思う。

770 名前:デフォルトの名無しさん :03/06/03 23:25
> デストラクタ呼び出しについても、同様の問題が
おこらねーだろ。

771 名前:デフォルトの名無しさん :03/06/03 23:27
>>770
デストラクタ呼び出し後のオブジェクトを参照する場合。

772 名前:デフォルトの名無しさん :03/06/03 23:32
Stroustrup本見てみたけど訳分からんね、これじゃ。
理解する気失せるわ。やっぱいろいろと不親切な本や。

Effective C++の47項を見るか、あるいはSingletonパターンでいいと思う。

773 名前:770 :03/06/03 23:37
>>771
あーそういうことか。

774 名前:デフォルトの名無しさん :03/06/03 23:51
>>760
とりあえず、 Hanage::hanage_len_t は Hanage::len_t のようにすべき。
で、
inline Hanage* create( Hanage::len_t len ) { return new Hanage( len ); }
こんなやつを定義すると、ナントカ参照という仕様により
Hanage* p = create( Hanage::LONG );
と書ける。
あからさまに冗長な new Hanage( Hanage::LONG ) よりは読んでて気持ちいい。

でも、実用はお勧めできない。

775 名前:デフォルトの名無しさん :03/06/04 07:53
>>766
0クリアはされないかと。
コンストラクタ以前にスタートアップコードのあたりで0クリア済みじゃない?
初期化ってのはコンストラクタが呼ばれること。

0クリア云々のくだりはbool型のinitializedのことで、他のクラスの事じゃない。
false==0ってことは理解してる?
initializedが最初の実行時は必ずfalseだから、それで初期化済みか判定して
いるってこと。

で、例の本にもデストラクタの問題も書いてあって、解決法としてatexit()と
参照カウンタをチョロっと紹介してる。

>>772
あの本はテクニックを解説する本じゃなくて、C++の言語仕様を説明する本だから
Singletonなんてあの程度の解説で十分かと。
逆に言語仕様と関係ない部分ばかり説明されても困る。
ただでさえ分厚い本なんだし。

756が何でこの本を読んでいるのかはちょっと疑問。
これは入門書じゃないぞ。

776 名前:デフォルトの名無しさん :03/06/04 23:01
age

777 名前:デフォルトの名無しさん :03/06/04 23:41
オブジェクトをファイルに保存、復元したいんだけどこんなんでいいの?
VC++のデバッガでは出来てるっぽくみえたんだけど
#include <stdio.h>
#include <string.h>

class CLS_A{
char m_a[16];
public:
CLS_A(){strcpy( m_a, "Test");};
~CLS_A(){};
};

void main(){
CLS_A *A = new CLS_A;
FILE *fp;
fp = fopen("TEST.bin", "w");
fprintf( fp, (const char *)A);
fclose(fp);
delete A;

CLS_A *C = new CLS_A;
fp = fopen("TEST.bin", "r");
fscanf( fp, (const char *)A);
fclose(fp);
delete C;
}

778 名前:デフォルトの名無しさん :03/06/04 23:54
VC++.netでC言語コンパイルできるんでしょうか?
C言語の勉強用に買ったんですが、どうやってもコンパイルできません。
VC++を.netで初めて使ったのでかなり試行錯誤してる段階です。
それと.net用の解説書を買いにいったのですが近所のパソコンショップ
数件まわったのですが6.0用のしかありませんでした。
6.0の解説書でも参考になるんでしょうか?
初歩的な質問ですいません。


779 名前:デフォルトの名無しさん :03/06/05 00:01
>>777
fscanf( fp, (const char *)A);

( ´_ゝ`)フーン…

780 名前:r :03/06/05 00:06
>>778
VC++は知らないけど、
C++なら、Cの殆どのコードはコンパイルできるはず。

というか、「どうやってもコンパイルできません」って書いているけど、
具体的にどうやったんだ?それをまず書け。

781 名前:デフォルトの名無しさん :03/06/05 00:22
>>780 rさん
#include <stdio.h>

void main()
{
  printf( "〜〜〜〜" );

}
コンソールモード、デバックで開始
するとこれらのプロジェクトは古い形式で構成されてます
と警告気味のコメントがでます。
「はい」をえらぶと6個のエラーがでます
エラーC2018 文字 0x40は認識できませんが3つ
エラーC2018 文字 0x81は認識できませんが3つ
です。


782 名前:デフォルトの名無しさん :03/06/05 00:27
>>781
http://www.google.com/search?hl=ja&lr=lang_ja&q=0x40+0x81

783 名前:デフォルトの名無しさん :03/06/05 00:29
>>781
ん?それコンパイルできるはずだけど・・・。コンソールモードって
プロジェクト立ち上げるときに選ぶやつを言ってるのかな?

まずメニューより[ファイル]→[新規作成]→[プロジェクト]と
進む。[テンプレート]の欄でWin32プロジェクトを選び、
適当なプロジェクト名を入力してOKを押す(保存先変えるなら変える)。
んで[概要]と[アプリケーションの設定]というのがでてくるんで、
[アプリケーションの設定]タブをクリックしてコンソールアプリケーションを
選択して、空のプロジェクトにチェックを付けて完了。

この手順でやってるの?

784 名前:783 :03/06/05 00:32
あ、もしかして
printf( "〜〜〜〜" );
って〜〜〜〜の部分をそのまま使ってるんかい(w。
最初はHellow World!って決まってるのに・・・・。
全角じゃなくて半角英数字でも入れてみたら。

785 名前:783 :03/06/05 00:33
Hello が Hellowになってるし(w・・・俺も死んでくる

786 名前:デフォルトの名無しさん :03/06/05 00:35
>>782さん

調べてみたんですが全角スペースは使ってないっす。
解説サイトからひろってきたりしたサンプルソースなども
すべてエラーがでます、、


787 名前:デフォルトの名無しさん :03/06/05 00:35
>>781 全角文字の匂いがする。

788 名前:デフォルトの名無しさん :03/06/05 00:41
>781
どう考えても全角スペースぽ
>783
べつにそこは〜〜〜でもなんでもよいでわないか。

789 名前:デフォルトの名無しさん :03/06/05 00:44
781のソースはコピペか? だったら全角スペースがみっつ入ってるぞ?

790 名前:デフォルトの名無しさん :03/06/05 00:44
>>783さん
その手順とほとんどおなじっす。
コンソールに変える手順がすこしちがって
左のプロジェクトのプロパティからリンカ→システム
サブシステムから変えてました。


>>784さん

786でも書いたとおりサンプルソースなど
を貼り付けても全行にわたってエラーがでます。



791 名前:デフォルトの名無しさん :03/06/05 00:59
voidとmainの間が全角スペース
printfの前に2つの全角スペースが入ってる



792 名前:デフォルトの名無しさん :03/06/05 02:40
クラスの定義する時

class A{
...
}

じゃなくて

struct A{
...
}

にすると何かいい事あるの?

793 名前:デフォルトの名無しさん :03/06/05 04:11
>>790
露骨に全角スペースだと思うが・・・・・・
ttp://www.hidecnet.ne.jp/~sinzan/tips/vc/vc_tip0b.htm

794 名前:デフォルトの名無しさん :03/06/05 05:55
>>792
publicメンバから書きたい場合、public:を省略できる。

795 名前:デフォルトの名無しさん :03/06/05 08:41
>>777
ダメ。
CLS_A の中にファイル書き込み/読み出し用のメンバ関数か
m_a を返すメンバ関数を追加しよう。

あと、>>779 の言う通り、
fscanf をあーいう風には使えない。
同じく、fprintf もダメ。
fprintf/fscanf じゃなくて fputs/fgets を使おう。

796 名前:デフォルトの名無しさん :03/06/05 08:44
>>781
0x81 0x40 は全角スペースの文字コードです。
確実に全角スペースが原因です。

あと、いきなり実行するのではなく、
ビルドしてから実行しましょう。

797 名前:デフォルトの名無しさん :03/06/05 16:32
>>792
俺はソースの可読性
template<typename T>
class trait
{
public:
/**/typedef T result;
};
これより
template<typename T>
struct trait
{
/**/typedef T result;
};
こちらの方がなんか良くない

798 名前:デフォルトの名無しさん :03/06/05 16:46
>>797
漏れは
class C {
    int n;
};
よりも
class C {
private:
    int n;
};
の方がなんか良いと思ってるから賛同しかねる。


つか、/**/ってなに?
そゆコーディングスタイルなの?

799 名前:デフォルトの名無しさん :03/06/05 17:07
>>798
顔文字だろ

800 名前:デフォルトの名無しさん :03/06/05 17:10
int i=4,o=5; int *_=&i;

(*_*o);

801 名前:デフォルトの名無しさん :03/06/05 19:19
>>800
カコイイ

802 名前:デフォルトの名無しさん :03/06/05 20:45
ここで聞いて良いのかどうかわかりませんが教えてください。
整数を返す、rand()の代わりになる関数を作ろうとしています。
条件としては、
・乱数の周期がそれなりに長い。
・CPUのタイプに依存しない(浮動小数点を使うのは×)
・再現性がある。前回GetRand(5/*key*/) = 123だったときは、次もGetRand(5) = 123である必要がある。
・iterateしなくてもいい。int GetRand(int inKey)のように、前回の結果が必要でなく、キー(種)さえ与えればいつでも値を得ることが出来る。
乱数発生に詳しい方、お願いします。

803 名前:デフォルトの名無しさん :03/06/05 20:46
boostの乱数ライブラリを使う。

804 名前:デフォルトの名無しさん :03/06/05 20:48
って良く読んだらそういう話じゃないし。

805 名前:デフォルトの名無しさん :03/06/05 20:50
>>802
それって、つまり同じ値は一回づつしかでない、循環する数列を生成するってことかね

806 名前:デフォルトの名無しさん :03/06/05 20:51
int GetRand(int inKey)
{
srand(inKey);
return rand();
}

・再現性がある。前回GetRand(5/*key*/) = 123だったときは、
次もGetRand(5) = 123である必要がある。
・乱数の周期がそれなりに長い。
この2つが重なるのが全然意味わかんないんだけど。乱数なめてるだろ?

807 名前:デフォルトの名無しさん :03/06/05 20:58
>806
そーゆーGetRandにとって、周期って何の意味があるんだろね?
int-intの写像としか思えないが、、

808 名前:デフォルトの名無しさん :03/06/05 20:59
>>806
「周期が長い」というのは、
GetRand(0) = 11
GetRand(1) = 22
GetRand(2) = 33
GetRand(3) = 44
GetRand(4) = 11
GetRand(5) = 22
と、簡単に値が繰り返すようでは困る、という意味で書きました。再現性がある、というのは別問題だと思います。
例えば円周率を思い出してください。小数点の値が繰り返しパターンになることはありませんが、少数第2位はいつ見ても「4」です。

809 名前:デフォルトの名無しさん :03/06/05 21:02
何がしたいのかわからん

810 名前:デフォルトの名無しさん :03/06/05 21:03
> 例えば円周率を思い出してください。小数点の値が繰り返しパターンになることはありませんが、少数第2位はいつ見ても「4」です。
当たり前だろ? 円周率を示す数値は一つしか存在しない。



811 名前:デフォルトの名無しさん :03/06/05 21:03
>>806
>srand(inKey);
>return rand();
これで「再現性がある」というキミは天才。

812 名前:デフォルトの名無しさん :03/06/05 21:04
再現性のある周期の長い乱数でキーを選ぶ

813 名前:デフォルトの名無しさん :03/06/05 21:08
昔のBASICの「RANDOMIZE」みたいなことをやりたいんちゃう?

C++の乱数にしたってどうせ擬似乱数に過ぎんのだし、
同じようなことは出来るんじゃないの?

814 名前:デフォルトの名無しさん :03/06/05 21:08
>>810
だから、GetRand(5)とすれば、円周率の少数第5位を返すような関数が欲しいんです。
あと処理系依存するのも駄目です。IntelのチップでもAMDのチップでも、同じキーを与えたら同じ答えが返ってくる必要があります。
なので、浮動小数点の計算や、乱数表を使うやり方はいけません。

815 名前:デフォルトの名無しさん :03/06/05 21:11
>>811
?

#include <iostream>
#include <cmath>
using namespace std;
int GetRand(int inKey)
{
 srand(inKey);
 return rand();
}

int main()
{
 for(int i=0;i<50;i++)
 {
  cout << GetRand(i%5)+1 << endl;
 }
}

これで再現性が無かったらどうやったら再現性がある事になるんだろう…

816 名前:デフォルトの名無しさん :03/06/05 21:13
>>815
コンピュータによって持ってる乱数表が違う。

817 名前:デフォルトの名無しさん :03/06/05 21:13
×cout << GetRand(i%5)+1 << endl;
○cout << GetRand(i%5+1) << endl;

818 名前:デフォルトの名無しさん :03/06/05 21:14
じゃあもう自分で乱数表作るしか

819 名前:デフォルトの名無しさん :03/06/05 21:15
>>816
乱数表持ってる実装のrandがあったら教えて下さい。

820 名前:デフォルトの名無しさん :03/06/05 21:18
>>818
さっきから乱数表とか言ってる香具師は馬鹿ですか?

Portableじゃなきゃいけないなら自分で線形合同実装したら?
int GetRand(int seed)
{
seed = seed * 1103515245 + 12345;
return ((unsigned int)(seed / 65536) % 32768) & 0xff;
}

821 名前:デフォルトの名無しさん :03/06/05 21:19
>>820
ガンオタし値

822 名前:デフォルトの名無しさん :03/06/05 21:19
>>821
自分が馬鹿なのを思い知らされたからってネタに走るのは止めて下さい。

823 名前:デフォルトの名無しさん :03/06/05 21:22
何かいいアイディアありませんか。カオスを使うのは小数点の計算に誤差が出るので使えないんです

824 名前:デフォルトの名無しさん :03/06/05 21:23
>>820
おおっ それは何ですか
ぐぐった時に名前だけは見たんですが>線形合同
それで常に変化する値が取れるんですか

825 名前:デフォルトの名無しさん :03/06/05 21:23
>>823
>>820とか>>806じゃ駄目なの?

826 名前:デフォルトの名無しさん :03/06/05 21:27
>>824
rand()のソース見たら大抵それが書いてあります。
でもintが何bitかによって結果変わるから完全にPortableではない。

827 名前:デフォルトの名無しさん :03/06/05 21:28
つーか全然C++じゃないだろCスレに帰れよお前ら

828 名前:デフォルトの名無しさん :03/06/05 21:30
そうだな。
レベルの低い話はCスレでやれ。

829 名前:デフォルトの名無しさん :03/06/05 21:30
>>827
Cでもないだろ。アルゴリズム系スレか?

830 名前:827 :03/06/05 21:31
>>828
簡単に釣れたな。つーか理解できないならお前帰れよ。

831 名前:デフォルトの名無しさん :03/06/05 21:31
数学板へ

832 名前:デフォルトの名無しさん :03/06/05 21:31
厨房しかいないなこの時間

833 名前:デフォルトの名無しさん :03/06/05 21:32
( ´∀`)σ)´Д`)←>>827

834 名前:デフォルトの名無しさん :03/06/05 21:36
>>826
なるほど〜、そうでしたか。動かしてみたんですが、十分変化する値が取れるようになりました
intはまあ、今の所32bitの環境でしか動かす予定が無いのでOKです
ありがとうございまし

835 名前:デフォルトの名無しさん :03/06/05 21:40
た。

836 名前:デフォルトの名無しさん :03/06/05 21:46
>>834
言っておくけど、>>820>>812と組み合わせないと乱数じゃないよ

837 名前:デフォルトの名無しさん :03/06/05 21:53
MT使え、MT。

838 名前:デフォルトの名無しさん :03/06/05 21:56
ttp://www.math.keio.ac.jp/~matumoto/mt.html
線形合同法にしろMT法にしろある内部状態から次の値は決まってるわけだから
内部状態を外部から与えれば以前出した状態を再現できるはず。
内部状態と値は別物として考えること。


839 名前:デフォルトの名無しさん :03/06/05 22:02
>837
その場合、
unsigned long GetRand( unsigned long mt[624])
になってしまうとおもうぞ

840 名前:デフォルトの名無しさん :03/06/05 22:03
そもそも真っ当な乱数アルゴリズムの殆どは
> ・乱数の周期がそれなりに長い。
> ・CPUのタイプに依存しない(浮動小数点を使うのは×)
> ・再現性がある。前回GetRand(5/*key*/) = 123だったときは、次もGetRand(5) = 123である必要がある。
> ・iterateしなくてもいい。int GetRand(int inKey)のように、前回の結果が必要でなく、キー(種)さえ与えればいつでも値を得ることが出来る。
の条件を既に満たしていると思うんだが。


841 名前:デフォルトの名無しさん :03/06/05 22:09
最後の一項目はアルゴリズム選ぶかな

842 名前:デフォルトの名無しさん :03/06/05 22:17
まさか>>834>>820をこういうふうに使うつもりか?

for (i = 0; i < N; i++) {
x = GetRand(i);
;
}

843 名前:デフォルトの名無しさん :03/06/05 22:19
乱数ってローカル時間から作るんじゃないの?

844 名前:デフォルトの名無しさん :03/06/05 22:24
↑多分ネタレス

845 名前:デフォルトの名無しさん :03/06/05 23:35
しつもんです。
std::vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);

int* p = &vec[3];

vec.erase(vec.begin());

こうやった場合、もうpの値は保証されないんですか?

846 名前:デフォルトの名無しさん :03/06/05 23:37
× int* p = &vec[3];
○ int* p = &vec[2];

847 名前:デフォルトの名無しさん :03/06/06 00:25
 p == &vec[3]
 *p == vec[3]
は両方とも保証されない。

848 名前:デフォルトの名無しさん :03/06/06 00:29
>>847
listなら保証されますかね

849 名前:デフォルトの名無しさん :03/06/06 00:38
>>848
要素を指すイテレータについての保証は規格化されてるが、
ポインタについては何も保証が無いと思われ。

850 名前:デフォルトの名無しさん :03/06/06 00:41
>>849
あらいがとうございます、わかるました。

851 名前:777 :03/06/06 00:51
thx! >>779 >>795
こんな感じ?
class CLS_A{
char m_a[16];
public:
CLS_A(){strcpy( m_a, "Test");};
~CLS_A(){};
void m_put(FILE *fp);
void m_get(FILE *fp);
};
void CLS_A::m_put(FILE *fp){
fputs( m_a, fp);
}
void CLS_A::m_get(FILE *fp){
fgets( m_a, sizeof(m_a), fp);
}


852 名前:デフォルトの名無しさん :03/06/06 01:57
>>820
seed には unsigned int 使おうよ。
seed * 1103515245 の結果がおかしくなるよ。

>>834
符号なし32bit整数なのを保証するために
typedef unsigned int randseed_t; とか typedef するといいかも。
環境によって定義を切り替えればいい。
尤も、CHAR_BIT が 9 な環境のことまで考えるとアレだけど、
普通はそこまで考える必要はない。
まぁ、それでも seed を毎回 0xFFFFFFFF でマスクすればいいかね。

853 名前:デフォルトの名無しさん :03/06/06 02:05
>>851
そんな感じ。

で、いくつか補足すると、

1. 関数定義の { } の後にセミコロンは付けない。
2. m_a の初期化は
   CLS_A() : m_a("Test") { }
  とした方が良い。
  なぜなら、strcpy だと初期化する文字列を変えてみたときに
  m_a のサイズを超えていてもコンパイルできてしまうから。
3. メンバ関数名には普通 m_ を付けない。

854 名前:デフォルトの名無しさん :03/06/06 02:11
>>853
> 3. メンバ関数名には普通 m_ を付けない。

おいおい、こいつどこから紛れ込んだんだ?

855 名前:デフォルトの名無しさん :03/06/06 02:15
>>854
メンバ変数名じゃなくてメンバ関数名だってことに気付いてる?

856 名前:デフォルトの名無しさん :03/06/06 02:43
つけたってええやんけー!

857 名前:デフォルトの名無しさん :03/06/06 02:49
>>856
何のために他のメンバ関数や普通の関数と
名前空間が分かれてるのか分からんやんけー!

858 名前:デフォルトの名無しさん :03/06/06 02:50
いや、メンバ関数は余計だった。
普通の関数と名前空間が分かれてる、の方だけで良かった。

859 名前:デフォルトの名無しさん :03/06/06 08:09
俺はクラス設計でメンバー変数にすらm_は付けん.
ビル・ゲ@ツに洗脳された人がm_なんてつけるんだ。
>>858の言うようにもし必要になったらどうせ限定子つけるから。




860 名前:_ :03/06/06 08:10
http://homepage.mac.com/hiroyuki43/moe/hankaku06.html

861 名前:デフォルトの名無しさん :03/06/06 08:32
エスピーなんとかに洗脳されて
メンバ変数のsuffixに_を付けるようになりました。

862 名前:デフォルトの名無しさん :03/06/06 08:35
メンバ関数に付けるのは見たことないなあ

メンバ変数はアリだとは思うが、
最近実装しないからどうでもよくなってる・・・

863 名前:超初心者 :03/06/06 08:57
directx9でプログラムを作ってみたのですが
d3drm.libというのを開くことができないという
エラーがでるのですがなぜでしょうか?

864 名前:デフォルトの名無しさん :03/06/06 09:10
>>849
え、マジっすか?
手元の「C++標準ライブラリ チュートリアル&リファレンス」
って本には
要素の挿入や削除が行われても他の要素のポインタ、参照、反復子は無効にならない。
と書かれているのですが・・・


865 名前:デフォルトの名無しさん :03/06/06 12:16
>>864
vector で実験してみろ。サイズが2倍に拡張された瞬間に死ぬから。

list、連想コンテナなら大丈夫だと思った。

dequeはしらん。

866 名前:デフォルトの名無しさん :03/06/06 12:33
848 名前: デフォルトの名無しさん 投稿日:03/06/06 00:29
>>847
listなら保証されますかね

849 名前: デフォルトの名無しさん 投稿日:03/06/06 00:38
>>848
要素を指すイテレータについての保証は規格化されてるが、
ポインタについては何も保証が無いと思われ。

で、vectorで実験してみろとは如何に?

867 名前:デフォルトの名無しさん :03/06/06 14:27
くだらない質問で悪いけど
(0=A、1=B、2=C…)っていうような数字に対応したアルファベットを得たいとき

sprintf(buffer, "%c", (char)('A'+num));

で何か不都合な点はある?

868 名前:デフォルトの名無しさん :03/06/06 14:32
sprintを使う意味が見えないが。

*buffer = char('A' + num);
じゃダメなのか?

869 名前:デフォルトの名無しさん :03/06/06 14:46
>868
いや、一文字だけでない場合もあるんで…
とにかくありがと

870 名前:デフォルトの名無しさん :03/06/06 14:52
#defineの以下のような使い方ってできるのでしょうか?

#define Encode(n) (10000 + (n))
#define BEER 1
#define SAKE 2
#define LLBEER Encode(BEER)    // ←これ
#define LLSAKE Encode(SAKE)    // ←これ


871 名前:デフォルトの名無しさん :03/06/06 15:05
>>867
charにキャストしてもintに戻されるね。

872 名前:デフォルトの名無しさん :03/06/06 15:10
>>869
for(int i=0; i<len; i++) {
buffer[i] = char('A' + num[i]);
}
sprintよりこっちの方が速い。

873 名前:デフォルトの名無しさん :03/06/06 15:11
*buffer = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[num];
の方が26倍安全です

874 名前:デフォルトの名無しさん :03/06/06 15:14
>>873
安全性はnumの範囲に依存するんだから同じだろ。

875 名前:デフォルトの名無しさん :03/06/06 15:22
Cスレ状態?

876 名前:デフォルトの名無しさん :03/06/06 16:44
移植の安全性の話をしてるんじゃないの?


877 名前:あらしって馬鹿だね :03/06/06 18:21
http://moon.gaiax.com/home/shadows/main
あらしって馬鹿だね。どうせろくな人間じゃない。

878 名前:デフォルトの名無しさん :03/06/06 18:32
マーチンの法則を用いてπ(円周率)を小数以下10000桁まで求める
プログラムをC言語で作成してください。お願いいたします。

879 名前:デフォルトの名無しさん :03/06/06 19:04
>>859
ソースを自分しか見ないのならそれでいいだろうけど

880 名前:デフォルトの名無しさん :03/06/06 22:49
for(int i=0;i<10;i++){
str[i] = "";
}
という文を書いたのですがエラーがでます
参考書が手元になく、調べることもできません
エラーの原因を教えてもらえないでしょうか
ちなみにChar型でstr[10]と宣言しています

881 名前:デフォルトの名無しさん :03/06/06 22:49
>>880
char *str[10]と定義すればOK

882 名前:881 :03/06/06 22:51
エラーの原因を聞きたかったのか。
Char -> charと置き換えて・・・
str[i]の型はcharでしょ?""(文字列リテラル)が返す型はchar *だから合わない。

883 名前:デフォルトの名無しさん :03/06/06 22:53
>>881-882
解説ありがとうございます
課題をやっていたのですが、エラーの原因がわからなくって詰まってました(;´Д`)
これで続きができますヽ(´ー`)ノ

884 名前:881 :03/06/06 22:56
>>883
ひとつ聞くけど、なにをしたいの?
多分881じゃやりたいことを達成できないと思うんだけど。

885 名前:880 :03/06/06 23:00
>>884
デフォルトコンストラクタで配列の中身を初期化しようとしてたのですが
これじゃぁ不十分なのですか?

886 名前:デフォルトの名無しさん :03/06/06 23:00
Cスレ池っと言いたいヤシの数→(∞)

std::string使えよ…

887 名前:デフォルトの名無しさん :03/06/06 23:02
>>885
もしかしてCharってcharの間違いじゃなくて、自分でつくったクラス?

888 名前:デフォルトの名無しさん :03/06/06 23:02
多分これがやりたいんだろ?ちゃんとCから勉強しろ。

for(int i=0;i<10;i++){
  str[i] = '¥0';
}



889 名前:880 :03/06/06 23:03
>>886
C++はじめたばかりなのであまりよくわかってません(;´Д`)スミマセンスミマセン
どういうことなのでしょうか?

>>887
変換ミスです(;´Д`)charです

890 名前:デフォルトの名無しさん :03/06/06 23:05
>>885
memset使え つーか長さ0の文字列にしたいなら先頭str[0]に'\0'を入れればよし。

・・・・全然C++らしくねぇ

891 名前:デフォルトの名無しさん :03/06/06 23:47
More exceptinal C++ の
マクロの所の ERR_ENTRY ってどう書けばいいんですかね?
で、どうやって使うんだろう?

文の意味があんまり読み取れなかったからよくわかんなかったんだけど。


892 名前:デフォルトの名無しさん :03/06/06 23:50
テキストファイルから一行ずつstd::stringに入れて読み込みたいのですが
どのようにすればできますか?どなたかポインタだけでもお願いします。

893 名前:デフォルトの名無しさん :03/06/06 23:52
getline

894 名前:デフォルトの名無しさん :03/06/06 23:54
>>892
ポインタというところにツッコみたくてうずうずする。

std::string str;
std::getline(file, str);

895 名前:892 :03/06/06 23:56
>>893
ありがとうございます。

>>894
そしたらリファレ(略

896 名前:892 :03/06/07 00:02
>>894,895
できますた。ありがとうございました。

897 名前:892 :03/06/07 00:03
×>>894,895
>>893,894

スイマセン

898 名前:デフォルトの名無しさん :03/06/07 00:06
>>891
<errcode.h>
#ifndef ERR_ENTRY
 #define ERR_ENTRY_BEGIN enum Error {
 #define ERR_ENTRY(code, value, str) code = value
 #define ERR_ENTRY_END };
#endif
 ERR_ENTRY( ERR_OK, 0, "No Error" ),
 以下略

<errcode.cpp>
#define ERR_ENTRY_BEGIN
#define ERR_ENTRY(code, value, str) lookup.insert( make_pair(code, (const char*)str) )
#define ERR_ENTRY_END
void init_map() {
 #include "errcode.h"
}

ってことじゃないのかと思ってたのだけどどーだろ。

899 名前:デフォルトの名無しさん :03/06/07 00:51
シングルdクラスのインスタンスって
delete をしていいものなんでつか?
しない場合はメモリリークと 考えていいのかな?
staticにするやつをオートポインタにしとけばOK?

なに言ってるか自分でもよくわからん・・・

900 名前:デフォルトの名無しさん :03/06/07 00:53
>>899
・onexitを使う。
・インスタンスを静的に生成する

パターンハッチングのシングルトンについて語ってる所とか読んでみてね。

901 名前:デフォルトの名無しさん :03/06/07 01:01
>>899
意図してないのにアクセスできなくなり、メモリが無駄になる状況がメモリーリーク。
シングルトンは意図してんだからメモリーリークとは言わないのでは?

902 名前:901 :03/06/07 01:02
いや、まあ言いたいことはなんとなく分かるんだけど。
自分だったら気にせずほっとくかな。

903 名前:デフォルトの名無しさん :03/06/07 01:04
>>888 ++iの方が教育的。

904 名前:デフォルトの名無しさん :03/06/07 01:10
++C

905 名前:r :03/06/07 01:11
>>899
class Singleton {
Singleton() {}
public:
Singleton* GetInstance() {
static Singleton instance;
return &instance;
}
}

これできちんと削除される。


でもなぜかあんまり推賞されてないみたい。

906 名前:デフォルトの名無しさん :03/06/07 01:16
>>903
昔は i++ を使ってた貧弱な坊やでした。
++i を使うとかっこよく、お金持ちで、モテモテになるよということを聞き、
そんなばかな、と思いつつも、
騙されてもいいかと ++i を使うようにしました。
それがなんと ++i を使うようになってからというもの、
メキメキ筋肉がつくわ、競馬で十万馬券が当たるわ、
彼女は出来るわで、人生変わりました!
みんなも ++i で人生の勝ち組になりましょう!


いや、++ 演算子のオーバーロードとかすると
どっちの方を使う癖をつけるといいかがよく分かるよね。

907 名前:デフォルトの名無しさん :03/06/07 01:18
>>905
何かの本かサイトかで推奨できない理由を見た。
確か、instance の生成がロックされてないので
マルチスレッドで問題になる、というものだったはず。

908 名前:デフォルトの名無しさん :03/06/07 01:20
>>907
パターンハッチングですね

909 名前:デフォルトの名無しさん :03/06/07 01:22
>>900
onexit?
・・・・
初耳だと思い、ぐぐったら、単にOnExitのことか・・

>>903

そうだ。たまに++i を
見かけるがなんでだろうと思ってた。
どっちもいっしょだと思い、好みの問題として放置してた。
それが教育的な理由ってなんなの?

910 名前:デフォルトの名無しさん :03/06/07 01:23
>>909
atexitと間違えた。

911 名前:デフォルトの名無しさん :03/06/07 01:24
>>909
>>903=>>906
http://pc2.2ch.net/test/read.cgi/tech/1051496506/
追い出されたアフォなので無視してOK。
組込型に対しては最適化されるの記述も読めなかったんだろうか…

912 名前:デフォルトの名無しさん :03/06/07 01:27
>>909
普通の数だと最適化で一緒になると思うけど、
イテレータとかでは ++it の方が効率的な場合も多い。
it++ だとイテレータを進める前のイテレータを生成して、
それを返すことになるからね。

913 名前:デフォルトの名無しさん :03/06/07 01:33
>>910

こんなイイもんがC言語にあったとは・・


914 名前:デフォルトの名無しさん :03/06/07 01:36
いいのか?

915 名前:デフォルトの名無しさん :03/06/07 01:40
>>911
組み込み型とイテレータとで表記変えるのは気持ち悪い。
どちらかに統一するとするならやっぱり ++i だろう。

C ならどっちでも好きな方を使えばいいと思うけどね。

916 名前:デフォルトの名無しさん :03/06/07 01:42
うーん・・・イテレータ使うことないしなぁ。

917 名前:899 :03/06/07 01:48
>>905

すまん。実は、クラスのインスタンスを唯一にしたいのではなく
クラスのプライベートメンバ変数を唯一にしたかった。
そんでstatic つけた。
しかしその変数はとあるユーザ定義型のポインタで
終了処理が必要なものであったと。
やっぱクラスで一枚包んどけばいいだけかな。
終了。

918 名前:デフォルトの名無しさん :03/06/07 01:50
>>916
折角C++なのにコンテナ使わないのは非常に勿体無い

919 名前:デフォルトの名無しさん :03/06/07 03:34
>>911 教育的の真意が読み取れないんだな藻前は。

920 名前:891 :03/06/07 11:41
>>898
レスありがd。
それって結局 map を作っちゃうって事?
そのまま書くのに比べて何が利点なのかな?
俺が考えてたのは
<errorcode.inc>
ERR_ENTRY(ERR_OK, 0, "No Error"),
ERR_ENTRY(ERR_INVALID_PARAM, 1, "<description>"),
-以下略-
<errorcode.h>
#undef ERR_ENTRY
#define ERR_ENTRY(name, value, desc) name = value
enum ERR {
#include "errorcode.inc"
};
extern const char* ERR_NAME_TBL[];
<errorcode.cpp>
#undef ERR_ENTRY
#define ERR_ENTRY(name, value, desc) value
const char* ERR_NAME_TBL[] = {
#include "errorcode.inc"
};
<foobarbaz.cpp>
#include "errorcode.h"
int main() {
std::cout << ERR_NAME_TBL[ERR_OK] << std::endl;
return 0;
}
こんな感じかなぁと思ったんだけど、結局配列作っちゃうからマクロな意味が
あんまりないかなと思って。コンパイル時にすべてが解決されるような
いい方法があるのかなぁ?

921 名前:898 :03/06/07 12:56
>>920
本の文脈からすると利点は
 ERR_OK = 0 と ERR_OK => "No Error" って対応を
 分けて2箇所に書くのは面倒だし間違いやすいから、マクロ使ってコンパイル時に
 ソース構造を自動生成させることで、1箇所にまとめることもできる
って意味かと。

エラー値は実行時まで決まらない(コンパイル時定数じゃない)から、
> コンパイル時にすべてが解決される
は無理。

922 名前:デフォルトの名無しさん :03/06/07 16:20
>>905みたいな方法でのシングルトンはグローバルにインスタンス置くのと何が違うの?
途中で削除できるわけでも無いし、起動時に生成されて終了時に削除されるのも同じだし。


923 名前:デフォルトの名無しさん :03/06/07 16:24
>>922
あの方法では、起動時ではなく、
GetInstance()が初めて呼ばれたときにに生成されるはず

924 名前:デフォルトの名無しさん :03/06/07 20:43
ソースファイル分割した時の初期化順番の影響とかある。
グローバル変数のコンストラクタからメンバー関数呼んでるとまずいことになる可能性があったり。


925 名前:デフォルトの名無しさん :03/06/07 21:19
ptrdiff_tはC++独自?Cにはないの?

926 名前:デフォルトの名無しさん :03/06/07 21:29
あるよ

927 名前:デフォルトの名無しさん :03/06/07 22:30
BASE64のエンコード・デコードクラスってないすかねぇ…
それらしきものを自分で作ってみましたが、どうも設計がいけてない

928 名前:デフォルトの名無しさん :03/06/07 23:40
namespace で特定の関数を見えないようにする方法があれば教えて下さい。

929 名前:デフォルトの名無しさん :03/06/07 23:43
>>928
何がしたいのかわからん。

930 名前:デフォルトの名無しさん :03/06/07 23:44
>>928
classのprivate/protected相当ってことだよね。
ない。

.cppだけに書くかさらにnamespace作って混ざらないようにするくらい。

931 名前:デフォルトの名無しさん :03/06/07 23:46
>>930
そうなんです。クラスにしたら全てがstaticな関数になったんで
namespace の方が簡単でいいかな、っと。
ありがとうございました。

932 名前:デフォルトの名無しさん :03/06/08 00:01
iostreamとかのライブラリーって中のクラスがどうなってるみれるの?

933 名前:デフォルトの名無しさん :03/06/08 00:31
>>932
何がしたいのかわからん。

934 名前:デフォルトの名無しさん :03/06/08 00:41
>>931
.cpp 内で無名 namespace 内で定義したものは
別の .cpp 内からは参照できない。
static 関数の C++ 版だね。

935 名前:デフォルトの名無しさん :03/06/08 00:44
自分のアドレスを返すのってどうすればいいですかね。
この2種類の方法で試みたのですが、エラー出てしまいますい。
SampClass* SampClass::GetAddress(){
return &this;
}

void SampClass::GetAddress(SampClass* samp){
samp = &this;
}

936 名前:デフォルトの名無しさん :03/06/08 00:46
&はいらんだろ

937 名前:932 :03/06/08 00:52
iostreamのクラスがどうやって作られてるか知りたいので
ソースがみたいのです

938 名前:デフォルトの名無しさん :03/06/08 00:55
>>937
STLport見ろ。
ただし、規格と実装を混同するなよ。

939 名前:931 :03/06/08 01:00
>>934
やっと理解できました。
ありがとうございました。

940 名前:デフォルトの名無しさん :03/06/08 03:08
int main()
{
  A<int> a;
}
↑↑Test.cpp↑↑

↓↓A.h↓↓

#pragma once

template<class T>
class A
{
public:
  A(void);
  ~A(void);
};
↑↑A.h↑↑

941 名前:940 :03/06/08 03:08
↓↓A.cpp↓↓
#include "A.h"

template <class T> A<T>::A(void)
{
}

template <class T> A<T>::~A(void)
{
}

↑↑A.cpp↑↑

Test error LNK2019: 未解決の外部シンボル "public: __thiscall A<int>::~A<int>(void)" (??1?$A@H@@QAE@XZ) が関数 _main で参照されました。
Test error LNK2019: 未解決の外部シンボル "public: __thiscall A<int>::A<int>(void)" (??0?$A@H@@QAE@XZ) が関数 _main で参照されました。
Test fatal error LNK1120: 外部参照 2 が未解決です。

どうすればいいですか?

942 名前:デフォルトの名無しさん :03/06/08 03:13
テンプレート関数の定義が使用するコンパイル単位に含まれるようにすればいい。

943 名前:デフォルトの名無しさん :03/06/08 03:13
テンプレートつきクラスのメソッドを、クラス定義の外に書くときは、
exportだっけなぁ。なんかキーワードが必要だったとおもうなぁ。

944 名前:デフォルトの名無しさん :03/06/08 03:17
そういやSTL無関係に自前でtemplateなんて使ったことないな

945 名前:デフォルトの名無しさん :03/06/08 03:45
テンプレートはヘッダに全部書くがよろし。

946 名前:940 :03/06/08 03:46
テンプレートつきクラスの場合ヘッダーに実装を書くの普通なんですか?

947 名前:デフォルトの名無しさん :03/06/08 03:50
いまのところ、exportをサポートしているコンパイラが少ないので、普通。

948 名前:940 :03/06/08 03:53
そうですか ヘッダーに書くことにします
みなさまありがとうございました

949 名前:デフォルトの名無しさん :03/06/08 03:59
>>938
STLportは古いコンパイラに対応するために色々無理を
しているから、さすがに読ませるのはどうかと思うぞ。
gccのlibstdc++くらいでいいんじゃないか?
ところどころ実装が汚いor間違っている部分があるけど。
(例外まわりとか)

950 名前:デフォルトの名無しさん :03/06/08 08:17
(^^)(^^)(^^)(^^)(^^)(^^)
(^^)(^^)(^^)(^^)(^^)(^^)
(^^)(^^)(^^)(^^)(^^)(^^)
(^^)(^^)(^^)(^^)(^^)(^^)
(^^)(^^)(^^)(^^)(^^)(^^)
(^^)(^^)(^^)(^^)(^^)(^^)
山崎渉





■過去ログ置き場に戻る■ 1- 前250 最新50
DAT2HTML 0.33f Converted.