[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 05/09 21:15 / Filesize : 160 KB / Number-of Response : 654
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.71【環境依存OK】



1 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 23:15:45 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.70【環境依存OK】
pc12.2ch.net/test/read.cgi/tech/1258873470/

【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め)

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。


489 名前:デフォルトの名無しさん [2010/02/14(日) 19:06:37 ]
C++なのですが
1行目 n個、2行目(n-1)個、・・・、n行目 1個の配列をつくるコードって
これであっているのかどうかチェックしていただきたいのですが
どうでしょう?
---------------------------
int **a = new int*[N];

a[0] = new int[(int)(N * (N + 1) /2)];
int j = N;
for(int i=1; i<N; i++){
  a[i] = a[0] + i * (j-1);
 j--;
}

delete[] a[0];
delete[] a;
---------------------------

490 名前:デフォルトの名無しさん [2010/02/14(日) 19:10:50 ]
CやC++を今から勉強したいんですけど、
全くの初心者ですがオススメの本ってありますか?
将来仕事にすることも考えてます。

491 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 19:14:57 ]
>>490
独習シリーズ

本屋に行って、黄色い分厚い本を買って頭からケツまで20回嫁。

492 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 19:19:28 ]
>>489
ありとあらゆる意味でダメ。
期待したとおりに動かないし、(直したとして)保守性も最悪。
窓からソースを投げ捨てるレベル。

493 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 19:20:11 ]
ワロタw

494 名前:デフォルトの名無しさん [2010/02/14(日) 19:20:53 ]
>>491
ありがとうございます
明日にでも買ってこようと思います

495 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 19:23:33 ]
>>489
動くのかもしれんけどなんかおかしいような
普通はこんな感じじゃない?
とかいって、普段vectorばっか使ってるから
初めてこういうコードを書いたわけだが

int n=10;
int **a=new int*[n];
for(int i=0;i<n;++i){
a[i]=new int[n-i];
for(int j=0;j<n-i;++j){a[i][j]=j;}
}
for(int i=0;i<n;++i){
for(int j=0;j<n-i;++j){
cout << a[i][j];
}
cout << endl;
}
for(int i=0;i<n;++i)
delete[] a[i];
delete[] a;


496 名前:デフォルトの名無しさん [2010/02/14(日) 20:15:00 ]
>>495
ちなみにvectorだったらどんな感じになるんですか?

497 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 20:30:02 ]
>>495
元のコードって、領域が配列を跨いで連続してる必要があるんじゃないの?



498 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 21:17:12 ]
>>496
std::vector<int> a[N];
for (int i = 0; i < N; ++i)
{
 a[i].resize(N - i);
}

499 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 21:31:18 ]
ポインタ配列は愚行でしょ
struct C{size_t sz;int*p;
C(size_t x):sz(x),p(new sz(int)){}
C(size_t x,int*a):sz(x),p(a){}};

template<size_t N>struct L:C{
size_t am(size_t x){return x*N-((N+1)*N)/2;}
L():C(am(N)){}
C operator[](size_t x){return C(N-x+1,p+sz-am(x));}};

500 名前:デフォルトの名無しさん [2010/02/14(日) 21:37:35 ]
>>497
そこが問題になるんですよね・・・

>>498
なるほど

501 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:41:14 ]
上でC99に準拠しているコンパイラが少ないって話が出ていたけど、
実際に試してみたら
 VC, gcc, bcc, dmc, OpenWatcom
で全部ガン無視されててフイタwww

むしろIntelの仕様がおかしいって言われそうで不憫だ。


502 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:45:10 ]
gcc?

503 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:47:11 ]
>>502
GNU C Compiler ですけど?

504 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:48:49 ]
gnu compiler collection

505 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:53:13 ]
gccじゃなくてg++じゃ、と>>502は言いたかったに1ペリカね。

506 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:54:05 ]
こまけぇことはいいんだよ

507 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:54:26 ]
>>504
その略称のこともあるけど、GNU C Compilerの名前としてもgccは使われる。

>>502
お前人の揚げ足取ろうとする嫌な性格のやつなのね?
そのくらい分かることだろ?

さらに言えば今回の文脈ではg++じゃなくてgccが正しい。




508 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:56:51 ]
gccで全然問題ない

509 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:05:20 ]
>>502
がフルボッコw

510 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:06:32 ]
俺は502じゃないが、-std=c99つけてもあかんの
あと関係ないけどGNU Compiler Collectionを指すときってGCCにするんじゃね

511 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:10:18 ]
>>510
その略称のこともあるけど、GNU C Compilerの名前としてもgccは使われる。
さらに言えば今回の文脈ではg++じゃなくてgccが正しい。



512 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:11:56 ]
>>510
> 俺は502じゃないが、-std=c99つけてもあかんの
いやだれ一人としてダメなんて言ってないぞ?


513 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:12:37 ]
>>499
大きな領域を一度に確保してからplacement newを発動するとか

デストラクタが面倒臭い事になるけど

514 名前:507 mailto:sage [2010/02/14(日) 23:13:42 ]
>>512
いや言ってるんじゃね?


515 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:13:48 ]
GCCがC99ガン無視って事は無いな


516 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:14:45 ]
どうみても>>499は愚行だと思うんだが


517 名前:502 mailto:sage [2010/02/14(日) 23:19:43 ]
俺の疑問は>>510の1行目が理由で>>515なのではないかということ。
ok?




518 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:21:18 ]
お前ら全員いい加減にしようぜ


519 名前:499 mailto:sage [2010/02/14(日) 23:21:22 ]
うん。適当に打ち過ぎて矛盾やイミフメイな所がいっぱいあったんだ。気付いた処なおしたよ
template<bool F=false>struct C{size_t sz;int*p;
C(size_t x):sz(x),p(new int[sz]){}
C(size_t x,int*a):sz(x),p(a){}};
typedef C<> E;

template<size_t N>struct L:C{
size_t am(size_t x){return x*N-((N+1)*N)/2;}
L():C<true>(am(N)){}
E operator[](size_t x){return E(N-x+1,p+sz-am(x));}};

520 名前:483 mailto:sage [2010/02/14(日) 23:29:10 ]
boost::tuple
勉強してきました。

感動しました。


521 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:30:29 ]
> 広く使われている処理系でも、タプルのこの種の用途について
> 最適化をしくじるものが存在する(例えば bcc 5.5.1)
> ことに注意されたい。
Boostに名指しされとるww


522 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:32:42 ]
まあ普通にstd::pairの拡張版だと捉えているがな

523 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:34:19 ]
bcc 5.5.1は今から見るとひでぇからな。


524 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:35:47 ]
仕方ねえよ
標準C++にできるだけ準拠しようとして精一杯で
最適化まで手が回らなかったんだろ

525 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:49:33 ]
>>519
何がしたいのかわからん。
new した領域はいつ delete されるの?
なんで std::vector 使わないの?

526 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:52:14 ]
テンプレートについて教えて下さい。

下記のようなテンプレートクラスを書いたところ
コンパイルエラーになってしまいます。

template <class T>
class TestClass {
public:
TestClass(){};
~TestClass(){};
struct SS {
int a;
char b;
long c;
T d;
};
SS * TestCode(void);
};
template <class T>
TestClass<T>::SS * TestClass<T>::TestCode(void)
{
return NULL;
}
gccでコンパイルすると、
error: expected constructor, destructor, or type conversion before '*' token
error: expected `;' before '*' token
となります。

どこが悪いのでしょうか。
教えて下さい。
宜しくお願いします。

527 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:57:10 ]
>>526 typename



528 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:58:27 ]
>>527
ありがとうございます。
何か追記する必要がありますでしょうか?

529 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:58:31 ]
>>526
typename TestClass<T>::SS* TestClass<T>::TestCode(void)

530 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:59:46 ]
>>529
ありがとうございます。
コンパイル通りました。

なぜ、先頭に typename と入れる必要があるのでしょうか?
教えて下さい。
宜しくお願いします。

531 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 00:01:57 ]
>>530 ja.lmgtfy.com/?q=template+typename

532 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 00:05:55 ]
>>531
ありがとうございました。

533 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 00:07:47 ]
>>531
こんなサイトがあるんだw

>これは、質問を自分で調べずに質問する人のために、Google検索の便利さを伝えるものです!

534 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 02:17:13 ]
C++を勉強中の初心者です

std::string Hoge(int Num)
{
   std::string Data
   Data.clear();

   処理

   return Data;
}

こういう関数があった場合Hoge関数の中で確保したstd::string Dataは
C言語のころのmallocで確保された領域とどう違うのでしょうか?

GCがあるような言語の場合参照が一定以下だと開放されるとかありますが
C++はそういうのが無かったはずですし

535 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 02:22:07 ]
Cでも構造体を返すことが出来るのは当然知ってるよな?
で、当然、その構造体のメンバとして、
(mallocで確保した領域への)ポインタを持てることも知ってるよね?

536 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 02:24:17 ]
>>534
mallocとか使って自分で管理するのと違って、クラスにその責任は任せてしまえる。
つまり、あんまり気にしなくていい。

537 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 02:24:26 ]
>>535
はい

std::stringで確保したデータが不要になった場合は
clear()しておけば従来のfreeに相当する動作ということでいいんですかね?



538 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 02:34:49 ]
ああ・・・いろいろ勘違いを・・・

テンプレートクラスということなので

std::string* Data = new std::string();
stringの確保をこういう感じにしてこれを返せばいいんですね

539 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 08:06:25 ]
>>538
ちがーう。
std::string をそのまま int か何かと思って同じように扱えばいい。


540 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 11:46:06 ]
>>537
オブジェクト指向を根本的に勘違いしているな

std::stringは一種のクラスであり、それ自体データとメンバ関数の
集まりとして完結しているものだ

だから普通のPOD型の変数や構造体と同じように値返しが出来る

但しこれは当たり前だが、関数の中で定義したローカルstringを
参照返しするような事をすれば、これはstringに限らずどんなデータ型
だとしても未定義の動作となる

541 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 21:52:32 ]
回答側がバラバラすぎて、それぞれ何を主張してるのかよくわからん

542 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 21:53:01 ]
>>538
C++初心者にオススメ。

ロベールの部屋
www7b.biglobe.ne.jp/~robe/
Codian
www.kab-studio.biz/Programing/Codian/
猫でもわかるプログラミング
www.kumei.ne.jp/c_lang/
少なくともこれぐらいは読んで
初めて質問が出来るレベルになるだろう
と思います。



543 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 22:12:47 ]
素直にCから学べばよかったのに

544 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 22:14:20 ]
Cから学ぶとC++の習得に余計な時間がかかるぜ

545 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 22:26:47 ]
Javaだのを習得して、おかしな脳内回路ができるよりマシ

546 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 22:43:03 ]
プログラミング経験皆無から始めるとして
Cに3週、C++&STLに9週、テンプラ遊びの基礎に12週
これぐらいかかるかな

547 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 22:43:22 ]
>>545
それはあるわ。Javaって結構綺麗な言語だから、
C++みたいな清濁併せ持ったカオスな言語だと
勉強がいやになってしまうんだよな。



548 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 22:46:21 ]
>>546
あとたくさん本を買わなければならないよ
C++について学べば学ぶほど、たくさんの本が必要になる
中には絶版になってしまったものもあって残念だが

俺は絶版扱いのC++標準ライブラリを一番多用している
手垢が付いてもう真っ黒だぞ

549 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 22:59:56 ]
>>547
> Javaって結構綺麗な言語だから、
そうか?
Javaも結局 謎の仕様を覚えなきゃならんことがあるし、
落ち目の感が否めない

550 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 23:02:30 ]
>>549
謎仕様も多いけど、C++くんに言われとうないわ!

まぁそうだな、綺麗だった、と言い直しとくわ。


551 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 23:11:28 ]
多くのプラットフォームで使えるC言語以上の
高級言語の内、
仕様が最も綺麗な言語って何だろう?

実際に役立つかとかはおいといて。

D言語かPython 3系(2系でなく)かな?


552 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 23:12:54 ]
>>551
brainfuck とか whitespace とか

553 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 23:13:00 ]
後でできた言語の方が綺麗な構文になるのは仕方ないこと
Javaはまあ綺麗になる前の踏み台みたいなポジションなのでしかたない

しかしC#からC++に戻るとゲシュタルト崩壊?するわ
C言語くらいまで戻るといろいろな面倒は自分で見ないといけないと
割り切ることができるけどC++のような中途半端だとスゲー悩む

554 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 23:17:12 ]
ゲシュタルト崩壊 - Wikipedia
ja.wikipedia.org/wiki/%E3%82%B2%E3%82%B7%E3%83%A5%E3%82%BF%E3%83%AB%E3%83%88%E5%B4%A9%E5%A3%8A


555 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 00:32:17 ]
教えて下さい。

テンプレートクラスから派生したクラスから、
基底クラスのメンバ関数をオーバーライド
することは出来ないのでしょうか?

なんどやってもエラーになってしまいます。
よろしくおねがいします。

556 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 00:35:27 ]
codepadあたりにエラーになるコードを貼ってくれ

557 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 00:43:15 ]
>>556
ありがとうございます。

template <class T>
class A {
public:
  A(){}; ~A(){};
  struct S {
    long a;
    T   b;
  };
  S * TestFunc( S *p );
};
template <class T>
typename A<T>::S * A<T>::TestFunc( S *p ){
  return 0;
}
template <class T>
class B : public A<T> {
public:
  B(){}; ~B(){};
  struct S : A<T>::S {
    double c;
  };
  A<T>::S * TestFunc( A<T>::S *p );
};
template <class T>
typename A<T>::S * B<T>::TestFunc( A<T>::S *p ){
  return 1;
}
よろしくお願いします。



558 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 00:54:05 ]
>>557 >>527-

あと、ポインタ返す関数で return 1 は無いだろう。

559 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 01:10:51 ]
>>558
ありがとうございます。

return 0; と return 1; を return p; に書き換えてコンパイルしてみました。

: error: expected `;' before '*' token
: error: `typename A<T>::S*B<T>::TestFunc' is not a static member of `class B<T>'
: error: template definition of non-template `typename A<T>::S*B<T>::TestFunc'
: error: `p' was not declared in this scope
: error: expected `;' before '{' token

よろしくお願いします。

560 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 01:14:06 ]
>>559 >>527-

サルかお前は?

561 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 01:43:17 ]
template <class T>
class A {
public:
A(){};
~A(){};
struct S {
long a;
T b;
};
S* TestFunc( S *p );
};
template <class T>
typename A<T>::S* A<T>::TestFunc( S* p ){
return 0;
}

template <class T>
class B : public A<T> {
public:
B(){};
~B(){};
struct S : A<T>::S {
double c;
};
S* TestFunc( S* p );
};
template <class T>
typename B<T>::S* B<T>::TestFunc( S *p ){
return 0;
}

562 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 01:01:13 ]
>>561
ありがとうございました。

563 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 07:48:40 ]
typename A<T>::S * TestFunc( typename A<T>::S *p );

564 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 10:43:57 ]
テンプレートクラスを特殊化する場合
メンバ全てを宣言・実装し直さないといけないのでしょうか?
それとも変更点のみで良いのでしょうか?

あと、
template <typename T ,typename S = T>
というデフォルト引数の設定は可能なのでしょうか?

565 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 11:03:13 ]
>>564
クラステンプレートを特殊化したなら全部宣言しなおさないとダメでしょ。
クラステンプレートのメンバ関数ごとに特殊化できなかったっけ?

> template <typename T ,typename S = T>
やってみればいいじゃない。

566 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 13:25:55 ]
デフォルトパラメータも使えたような気がしたが、こういうやり方もある

template<class A, class B>
class Base {
---
};

template<class A, class B = hoge>
struct DefType {
typedef Base<A,B> type;
};


{
 DefType<hoge>::type fuga;
}

567 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 13:31:38 ]
ごめん、間違えた

template<class A>
struct DefTypeA {
typedef Base<A, nanika> type;
};



568 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 14:04:17 ]
テンプレート引数が異なるクラステンプレートの実体は関連が無いので、
同じクラステンプレートの異なる実体を継承することも出来る。
使いどころは限られるが。

template<typename T>
class A { ... }; // デフォルト実装

template<>
class A<int>: public A<...> // int以外を与えた場合のAを継承
{ ... }; // 追加の実装

569 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 19:54:38 ]
less を定義すれば greater とかも(特別な処理がない限り)自動で決まると思うのですが
そういった処理(less がら greater を作製)をするテンプレートは標準であるのでしょうか?

class CHoge
{
public:
CHoge(int i, const std::string& str) : m_i(i), m_str(str){}

int m_i;
std::string m_str;

struct Less
{
bool operator()(const CHoge& lh, const CHoge& rh) const
{
return lh.m_i < rh.m_i;
}
};
};



570 名前:569 mailto:sage [2010/02/17(水) 19:55:26 ]

//こんなの
template<typename T, typename FuncT>
struct GeaterFromLess
{
bool operator()(const T& lh, const T& rh) const
{
return FuncT()(rh,lh);
}
};

std::vector<CHoge> vtHoge;
vtHoge.push_back( CHoge( 4, "hoge" ) );
vtHoge.push_back( CHoge( 1, "foo" ) );
vtHoge.push_back( CHoge( 0, "bar" ) );
vtHoge.push_back( CHoge( 2, "alpha" ) );
vtHoge.push_back( CHoge( 3, "omega" ) );
vtHoge.push_back( CHoge( 1, "hotel" ) );

std::sort( vtHoge.begin(), vtHoge.end(), CHoge::Less() );
std::sort( vtHoge.begin(), vtHoge.end(), GeaterFromLess<CHoge,CHoge::Less>() ); // CHoge::Less() から Greator を作って逆順ソートしたい

571 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:31:44 ]
>>569
標準ではなかった気がする
自分で作るかboost::operatorsだな

572 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:07:41 ]
std::vector<class A>  のpush_back() ってどんな動作してるんだ?
たとえば
vector<string> vec;
vec.push_back("test");
ってやったら
stringの何を呼び出してstringクラスに"test"を入れているんだ?
自作の文字列クラスをvecにつっこんで機能を使わせたいのです

573 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:13:46 ]
コンストラクタ

574 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:44:09 ]
STLを使うならEffectiveSTLには絶対に目を通しておけ

575 名前:572 mailto:sage [2010/02/18(木) 01:18:05 ]
>>573
コンストラクタに(const char* )を追加して実行してみました.
ttp://codepad.org/8ai16KPo
どうやら大分ひどいことをしているようなんですが,
コンパイルは通ってしまいます.
ご指導をよろしくおねがいします.
もしくは>>574さんの勧める書籍を読めば何故こうなるのか理解出来るでしょうか?

576 名前:デフォルトの名無しさん [2010/02/18(木) 01:21:03 ]
クロージャで出来て関数ポインタで出来ない例が思いつかない。

577 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 01:32:58 ]
>>575
暗黙定義のコピーコンストラクタと代入演算子で浅いコピーになってる。
デストラクタを書くようなクラスではこの2つも必ず確認しなければいけない。



578 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 01:47:45 ]
>>576
関ポじゃ状態を持てないじゃん

579 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 02:01:11 ]
>>575
codepad.org/kAeUsq2i
これでいいと思われます
要するにクラス内部でnew/deleteを行うような場合は
必ずコピーコンストラクタと代入演算子関数は自前で用意
しなければならないという事です

そうしないとクラッシュしたり、メモリリークしたりします

580 名前:572 mailto:sage [2010/02/18(木) 02:59:22 ]
>>579 >>577 ありがとうございます!
コピーコンストラクタと代入演算子を作らないといけなかったんですね
わかりやすくコードもひいてくださりありがとうございました

581 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 08:36:28 ]
>>579
operator= の new で失敗するとゴミポインタ持ったままのインスタンスが残っちゃうよ。
delete の前のヌルチェックは要らないよ。(メッセージを分けたかったんなら別だけど)
strlen() してから strcpy() するのってもったいないね。
date() じゃなくて data() だよね?(あ、 >575 から間違ってるのか。)

こんなちっちゃいクラスでもこんだけ問題が出るんだから、やっぱり自作文字列クラス
なんて作るもんじゃないね。みんなわかってると思うけど。

582 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 09:51:30 ]
>>578
やっと理解した。Cというか関数ポインタだと代替にならないな。

でもこれC++ならクラスでやれって話になるな。

583 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 10:18:58 ]
乱暴に言うと、クラスはデータとそれに付随する振る舞いをまとめたもの。
クロージャは振る舞いとそれに付随するデータをまとめたもの。
・・・っていうのはどの本の説明だったかな。

584 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 10:38:06 ]
データ構造を決めれば操作は大体決まるから
俺にとっては前者のほうが自然に感じるが
一方、振る舞いだけでデータも記述できるんだよな
抽象データ型とかは操作ありき、だし
object is a poor man's closure
closure is a poor man's object

585 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 12:11:05 ]
クロージャって要は関数オブジェクトみたいなもんでしょ?

586 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 12:45:33 ]
>>581
>delete の前のヌルチェックは要らないよ。

デタラメ言うんじゃないよ
代入前に既に値が入ってたらどうするつもりだ
それともtextが0だったらdeleteしても何も起きないというつもりか
それだったら個人の自由だ

プログラム上値が入っていたら消すんだよという意味を強調している

それから
>operator= の new で失敗するとゴミポインタ持ったままのインスタンスが残っちゃうよ。
文句言うなら自分でもっといいプログラム貼れや

>strlen() してから strcpy() するのってもったいないね。
>date() じゃなくて data() だよね?

元のプログラムをそのまま使っただけだ
自分が1から書いたらもちろんこういう書き方はしない

もう一度言う 文句あるなら自分で貼れ

587 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 13:20:25 ]
>プログラム上値が入っていたら消すんだよという意味を強調している
んなの強調して何の意味が。deleteなんだから消すに決まってる。
「値が入っていたら」はdeleteがやってくれる。



588 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 13:24:06 ]
delete null 規格上は許されてるよ。
でもまあ、nullチェックしたほうが自然だろな。

589 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 13:29:38 ]
そのnullチェックがそのコードで意味があってのことならやるが
機械的にチェックするだけ、という意味しかないのなら消すわ

590 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 13:34:14 ]
if(p) Delete(p);

void Delete(Obj *p)
{
if(p) _Delete(p);
}

void _Delete(Obj *p)
{
if(p) __Delete(p);
}

・・・

591 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 13:45:25 ]
上の実装だと内部データ返せるから
dateの戻り値をdeleteだって出来る(これは設計ミスだろう)。
そうなるとチェックせずにdeleteするのは「二重delete」で死ぬと思ったんだが
ノーチェックで問題ないんかえ?

592 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 13:47:07 ]
は?NULLチェックするに決まってるだろ
んでdelete後にはNULL入れとけボケ

593 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 13:53:36 ]
俺は暗にあんたを擁護したんだが・・日本語勉強しる

594 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 14:05:06 ]
ID出ないと誰が誰だか分からない
まあとりあえずみんな落ちつけ

595 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 14:06:13 ]
なんでID無しなんだろうな
おかげで自演し放題だわ

596 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 14:44:11 ]
●持ちには隠しID丸見えだよ
自演はほどほどに

597 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 14:54:03 ]
あちゃー、このスレ全部俺だったのバレてたか



598 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 14:58:48 ]
いやいや、俺俺。

599 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 15:11:47 ]
>>591
「deleteしたらNULL入れる」だけで二重deleteは防げる。
NULLチェックしたって二重deleteは全く防げない。

600 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 16:11:57 ]
>>599
C++は規格票でもNULLより0が推奨されています

601 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 16:35:47 ]
もう>>498はいないだろうが
n行m列のvectorの二次元配列の確保で
vector<vector<int> > v(n,vector<int>(m));
こういう書き方って異端?

602 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 16:55:40 ]
>>601
別に
三次元の場合もその書き方でよく書いてるけど

603 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 17:49:15 ]
異端じゃないけど効率悪いよ
n*mサイズのベクタ一本とってインデクスは計算で出すほうがいい

つーかC++は効率を良くしつつv[a][b][c]=1;みたいに書くことができないのが残念
せめて[a, b, c]とかでもいいからoperator定義できればよかったんだが

604 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 19:27:19 ]
>>602
なるほど、了解

>>603
>n*mサイズのベクタ一本とってインデクスは計算で出すほうがいい
直感的にはループの中で剰余と割り算でインデックス計算したりするほうが
遅くなるように思うけど
領域が連続でないことでそんなに遅くなるもん?

605 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 19:30:37 ]
>>604
連続でないってことは内部的に管理する仕組みが動いてるだろうから
インデックスの増減ですぐにアクセスできるのとでは消費パワーが違うよ

606 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 19:58:58 ]
(n, m)のインデックス算出に剰余と割り算使うのか?
普通はかけ算と足し算だと思うが

607 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 19:59:25 ]
>>604
剰余も割り算も使わないよ
v[siz1 * idx2 + idx1]
乗算と和だけ
あとベクタのベクタはメモリに関するコストが増える



608 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 20:01:36 ]
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10537.c

クイックソートを再帰なしに作ったんですが,なぜかソートされません・・・なぜorz

609 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 20:17:17 ]
>>605-607
確かにorz
自分の勘違いも含めたベンチコード
codepad.org/FTA8SWtA
vectorにしたら結果が大きく変わるってことはないと思うんで
思ったほど差はない模様

610 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 20:52:26 ]
>>608
まずpartitionがうまく動いてるか調べてみたら?

611 名前:569 mailto:sage [2010/02/18(木) 22:35:34 ]
>>571 レスありがとう.

boost::operators 調べてみたけど,クラスに operator を自動追加してくれるだけで
関数オブジェクトには利用できないのかな?

ソート対象のメンバ変数ごとに Less の関数オブジェクト用意して,
逆順ソートする場合は Less の関数オブジェクトから Greater の関数オブジェクトを生成して
ソートに利用する手法は良くやりそうだけど,自分で作るしかないか…

612 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:01:17 ]
#if defined(Q_WS_MAC)
何これ?

613 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 00:34:01 ]
#define TEST 5でマクロを定義し、char型の配列等に文字列TESTを代入すると、
"5"が判断されなくなってしまいます。
マクロを文字列に代入し、尚且つ置き換え後の値を取り出すにはどうしたらよいのでしょうか?

614 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 00:53:02 ]
こんな感じの??

codepad.org/M0mcikaJ 

615 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 00:54:44 ]
何かエラー出るな。

ttp://codepad.org/M0mcikaJ

616 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:02:39 ]
#define TEST "5" じゃダメなん?

617 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:07:15 ]
>>616
まったくダメなことはないけど、質問がよく解らんから普段使わない機能を使ってみた。。。vv



618 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:22:07 ]
>>591
dateの戻り値をdeleteされる場合を考慮しはじめると、何をどうチェックしたところで無駄。
どうにもならない。

619 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:24:05 ]
>>599
二重deleteを防ぎたいなら「deleteしたらNULL入れる」なんてせずに、
auto_ptr/vectorをはじめとするRAIIスタイルのライブラリを使ったほうがいい。
無駄なNULL代入が減る分、効率も向上する可能性が高い。

620 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:29:02 ]
ご返答ありがとうございます。
試してみたけど駄目でした…

やりたいことは、
#define TEST 5

char * a = { "TEST" };
この変数aがどうやってもTESTという文字列でしか認識されず、5が出せないのです。
char型の配列にはヌル文字が付くからマクロとして認識されてないのでしょうか…?

621 名前:620 mailto:sage [2010/02/19(金) 01:37:42 ]
型がLPCTSTRの所で変数aを入れてるのが原因かなぁ

622 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:37:50 ]
なんか>>616でいいような気がするが。。。
文字列を結合したいならそういう関数を使う。sprintfとか


623 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:39:05 ]
情報の後出しは基本的にご法度だぜ。。。
ウインドウズ使っていいなら簡単な方法がある。ちょとコード書く。

624 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:39:47 ]
む、LPCTSTR・・・・・とかhoge_sとか・・・

この辺の話はどうにかならんのかね・・・?

625 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:00:42 ]
>>620
文字列リテラルの中はマクロ展 されない。


626 名前:620 mailto:sage [2010/02/19(金) 02:01:49 ]
char型の配列使わずにint型の配列にTESTを入れて処理を進められました('A`)
大変ありがとうございました

627 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:05:03 ]
#define TEST "5"

char * a = { TEST };

これでいいんでないの?



628 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:05:12 ]
お前それで良いのか

629 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:06:09 ]
おっと>>628>>626向け

630 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:06:37 ]
>>586 codepad.org/eoOEH0RH

631 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:11:36 ]
>>620
#include "boost/preprocessor/stringize.hpp"

#define TEST 5
char const* a = BOOST_PP_STRINGIZE(TEST);

632 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:13:03 ]
手を抜くつもりが黒魔術になってしまった。
後悔はしてるが反省はしていない。

#include <stdio.h>
#include <locale.h>
#include <tchar.h>
#include <windows.h>
#define TEST 5
#define BufSize 1024
int main(){

    TCHAR BUF[BufSize];
    _tsetlocale(LC_ALL, TEXT("Japanese"));
    /*wsprintf(BUF,TEXT("ほげほげ戦隊 ほげほげ%d"),TEST);*/
    _sntprintf_s(BUF,BufSize,TEXT("ほげほげファイブ「%d」"),TEST);
    _tprintf(TEXT("%s"),BUF);
    return 0;
}

633 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:23:19 ]
>>610
なんかうちの環境が悪いだけでしたあざす

634 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:29:21 ]
>>630
これってstaticにする意味って何?
あおりじゃなくてただの素人です

635 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:30:09 ]
俺は文字列リテラル外すマクロが欲しい

636 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:35:19 ]
>>635
文字コードすべて暗記してint型の配列を確保してエンディアン考慮して
文字を16進数にでもして並べていけばリテラルいらないよ

637 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:40:11 ]
>>634
static にしないと引数として this ポインタが付く。無駄な引数は付けないのが当たり前。



638 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:44:40 ]
リテラル嫌なら

int a[2] = { 0x65676f68,0x00000000 };
printf("%s\n",(char*)&a[0]);

639 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:52:21 ]
>>638
で、そう書く利点は?

640 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:53:55 ]
無いよ
リテラルがいやとかぬかすから書いただけ
わざわざこんなめんどくさい書き方しなくてもいいようにC言語なりに考えられてるのに
いやとかぬかすからねえ

641 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:56:11 ]
表示サンプルがhogeだったからまずかったのかね?

642 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 03:05:36 ]
>>637
private な static メンバ関数ってそういう目的があるんすね
ありがとうございます

643 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 03:07:01 ]
文字列リテラルを勝手に外部化して後付けで差し替え可能なリソースを作ってくれるプリプロセッサを所望してるんだよな

644 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 03:10:34 ]
>>643
いいたいことがイマイチよくわからんがエスパー的ひらめきだと
VC++のメニュー関連のリソースが浮かんだ
しかも手書きでやらないといけないというのを・・・

645 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 03:12:21 ]
>>640
誰も嫌とはいってなくね?

646 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 03:13:55 ]
おまけにVCのリソースを標準関数に喰わせようとすると無茶苦茶大変だし。

647 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 03:15:07 ]
vsくらいになるとsettingとかあるんだけどな
勝手にxml読み込んだり書き出したりしてくれる機能があってそこへ
文字とかいれておけば呼び出せたりするんだが



648 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 03:24:32 ]
文字列リテラル外部化って今でもできるんじゃね?
文字列リテラルだけ書き込みヘッダ用意してそこへ入れておけば・・・
そういうのとは違うのか?

649 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 07:23:21 ]
>>613
解決しちゃったの?
こういう話だと思ったんだけど。
#include <stdio.h>

#define TEST 5

#define TO_STRING2(s) #s
#define TO_STRING(s) TO_STRING2(s)
int main()
{
const char *p = TO_STRING(TEST);
puts(p);
}

650 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 07:29:54 ]
メモリの大きさがそれほど無い組み込み環境化だとC++って使われるんだろうか
std::stringとかの動作を考えてみてもすげー細かいレベルでメモリが断片化しそうなんだが

651 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 07:35:09 ]
>環境化
環境下

652 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 08:21:59 ]
>>650
相応にメモリの使用量や動的確保のタイミングに注意を払えばいいだけのこと。
C++ はそういう環境でも使えるようにできている。

653 名前:620 mailto:sage [2010/02/19(金) 12:18:39 ]
>>625
>>627
>>631
>>632
>>649
マクロ展開できてなかったのですか…
632と649にある方法を試したところ、ちゃんとマクロとして認識され、5が表示できました。
boost入れてなかったんで631にある方法は試せなかったのですが、boostを利用する方法もあったんですね。
今後も似たような場面に出くわす可能性が高いので、提示されたサンプルはメモらせてもらいます。
ありがとうございました。








[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<160KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef