10/02/13 06:42:23
URLリンク(www.not-enough.org)
にあるレイトレーシングのソースコードをコンパイルしてみたのですがエラーが出てしまいます
URLリンク(codepad.org)
どこをどうすればよいのでしょうか?
お助けください。
410:デフォルトの名無しさん
10/02/13 13:12:43
>>409
URLリンク(codepad.org)
正しいかどうか知らんよ
しかし基本的なC++文法エラーを犯しているなこの作者は
411:デフォルトの名無しさん
10/02/13 13:16:11
g++の拡張文法を使っているのかもしれない
ポータビリティを考えるなら標準C++に従って書いた方がいいね
412:デフォルトの名無しさん
10/02/13 13:50:32
>>410
コンパイルしてちゃんとppmファイルを得ることが出来ました
ありがとうございました!
413:デフォルトの名無しさん
10/02/13 17:05:09
超初歩的な質問で恐縮なんですが
CとC++ではCを先に学んだ方がいいんですか?
それとおすすめのサイトとか書籍があったら教えてもらえませんか?
414:デフォルトの名無しさん
10/02/13 17:08:20
>>413
歴史をなぞるなら C から。
何か早く作りたいものがあるなら C++ からのほうが早いかもしれない。
ただし C に由来する落とし穴も多く残っているので、危ないかもしれない。
どっちからと考えずに、必要なときに必要な情報を確認しながら学ぶのが
おすすめ。
お勧めサイト。
URLリンク(www.google.co.jp)
415:デフォルトの名無しさん
10/02/13 17:11:04
>>413
プログラミングしたことあるの?
416:デフォルトの名無しさん
10/02/13 17:11:48
C++入門といってもクラスやSTLは後半!とか続刊!とかの入門書なら
内容はCとかわらないよ。
417:デフォルトの名無しさん
10/02/13 17:15:19
あと面倒なのが最近はunicodeベースでコンパイルしちゃう物があるのに
古い標準関数はマルチバイトベースだったりととにかく古いだけあってめんどくさい>C/C++
418:デフォルトの名無しさん
10/02/13 17:15:25
>>414
特に急ぎ足では無く、ゆっくり学ぼうと思ってるんでCからいこうと思います。
ググるのは大切ですね、しかし紹介されてるサイトや書籍があまりにも多いので戸惑います。
>>415
すごい勢いでド素人です。
419:デフォルトの名無しさん
10/02/13 17:17:25
>>417
CとC++はわりと古いから、やり難い事があるという事だけわかりました!・
420:デフォルトの名無しさん
10/02/13 17:20:05
>>413
お勧め書籍。
URLリンク(www.stroustrup.com)
421:デフォルトの名無しさん
10/02/13 17:20:11
C++を学びたいならC++から
Cも学びたいからCから
C++をやるとCなんて馬鹿らしくてやってられないから
422:デフォルトの名無しさん
10/02/13 17:25:03
>>420
おぅふ・・・なんかすげぇのきた。これは理解できそうにない
>>421
++というだけあって発展形なんですね。
423:デフォルトの名無しさん
10/02/13 17:37:34
>>422
> ++というだけあって発展形なんですね。
今もC++はC言語のコードを(割と互換性があるので)使える。
でも厳密な互換性じゃないので使えないこともある。
424:デフォルトの名無しさん
10/02/13 17:38:41
>>418
windowsしか使わないなら、C#あたりからやった方がいいよ
C/C++はなかなかソフトが完成しないから嫌になるし、初心者には難しい
425:デフォルトの名無しさん
10/02/13 17:43:20
>>424
> windowsしか使わないなら、C#あたりからやった方がいいよ
いや、俺の意見としては
C#だけは止めた方が良い。
> C/C++はなかなかソフトが完成しないから嫌になるし、初心者には難しい
そんならP言語(Python, Pascal, PHP)をやれば良いと思う。
Rubyはよーしらんが。
426:デフォルトの名無しさん
10/02/13 17:43:29
>>423
なるほど!参考になります。
>>424
#ですか、比較的敷居が低いんでしょうか。
まずそれから弄るのもいいかもしれませんね、ありがとうございます。
427:デフォルトの名無しさん
10/02/13 17:45:23
qmakeとcmakeって何が違うわけ
makeファイルを作っているだけなのか
428:デフォルトの名無しさん
10/02/13 17:46:22
まぁC#使っても、あれは出来ないだの、これはC経由しろだの、あるけどな。
429:デフォルトの名無しさん
10/02/13 17:47:41
C#使うくらいならJavaでいいじゃん
430:デフォルトの名無しさん
10/02/13 17:50:08
C, C++をやってから、GCのありがたみを感じるべき
431:デフォルトの名無しさん
10/02/13 17:51:47
>>428
API使えるしまあいろいろ方法はあるよ
C#->C++に戻ってみるとC#で当たり前に使ってる部品がなくて自作することになったり
文字コード関連ではまるよりよっぽどいい
432:デフォルトの名無しさん
10/02/13 17:54:50
昔の言語関連って無意味に省略しまくってるから直感で意味が通じないんだよな
C->C#とC++すっとばして覚えたところでC++にいったけどさ
c_strとかなんだよそれ
433:デフォルトの名無しさん
10/02/13 17:57:21
好きなのを選ぶが良い
URLリンク(vintage-digital.com)
434:デフォルトの名無しさん
10/02/13 17:58:17
俺ロキュータスいくわ
435:デフォルトの名無しさん
10/02/13 17:58:37
>>433
怪しすぎるww
特にC++は何だこりゃw
436:デフォルトの名無しさん
10/02/13 18:00:01
>>432
仕方ねーんだよ
昔のリンカは識別子を最大6文字しか認識しない時代があって
Cはその時に作られた物だから
C++はとっくにその制限は撤廃されているがなぜかCの癖を無意味に
引きずって省略しまくっている
タイプ量を減らすためか?
437:デフォルトの名無しさん
10/02/13 18:01:01
>>433
ASP.NETにいかざるをえない
というか皆さん千差万別ですね、そりゃネットのおすすめの書籍も色々あるわけだ・・・
ここにテンプレがないのもそのせいか!
438:デフォルトの名無しさん
10/02/13 18:03:32
>>436
まあギークが「ぼくのかんがえたさいきょうのげんごかくちょう」がC++だからタイプ量減らすためじゃね?
std::stringのstringからcharに変換するやつね
stringだからC++からの物だよね
439:デフォルトの名無しさん
10/02/13 18:04:57
Haskellやべえ
440:デフォルトの名無しさん
10/02/13 18:05:06
C++やるならQt Creator + VCのコンパイラがいいよ
441:デフォルトの名無しさん
10/02/13 18:17:54
>>426
いや、俺の意見としては
C#だけは止めた方が良い。
442:デフォルトの名無しさん
10/02/13 18:18:13
>>440
メモっときます、ありがとう。
皆ありがとう。感謝します。
とりあえず色々触ってみた上で何か一つに絞って、学んでいこうと思う!
443:デフォルトの名無しさん
10/02/13 20:03:26
>>441
いやいや、C#は便利だぞ。
C++よりも綺麗だし。
444:デフォルトの名無しさん
10/02/13 20:46:45
>>443
そんなこと言ってまた不幸になる人を増やすのか!
> C++よりも綺麗だし。
そんな言語いっぱいあるじゃないかw
445:デフォルトの名無しさん
10/02/13 21:45:41
>>444
C#で不幸になるやつは、もともと不幸なやつだけだ。
446:デフォルトの名無しさん
10/02/13 23:14:59
C#は.NETで出来ないことしようとすると、途端に不幸になる気がする。
MFCだと、のっけから不幸にだが・・・
447:デフォルトの名無しさん
10/02/13 23:27:06
ぶっちゃけCから始めるのがいいよ
C99ならC++の便利なところは大体使えるし
448:デフォルトの名無しさん
10/02/14 00:06:35
Cを覚えてenumや構造体や関数で取り敢えずなんとか実用になるライブラリとか書く。
しかしC++でnamespaceやクラスを知ると、それまで書いたのを全部書き直したくなるんだよ。
で、書き直した頃にtemplateに手を出して、また書き直したくなるわけ。
その後もSTLやらEffectiveC++やらBoostやらにかぶれるたびに、今まで書いたものがゴミに見える。
さらにC++0.xなんてので、今また過去の糞化現象が起こるんです。
449:デフォルトの名無しさん
10/02/14 00:11:09
それを楽しめるマゾ向け
450:デフォルトの名無しさん
10/02/14 00:14:47
最近はもう逆に余計なものみんな取り払って++も付かない99でもないCだけでいいんじゃないかと思えてきた
451:デフォルトの名無しさん
10/02/14 00:15:35
99より前にもいくつかあるんだが
452:デフォルトの名無しさん
10/02/14 00:18:56
shop99 と shop100 だと500円の買い物で
5円とか半端な数字出る出ないの違いが有るよね
453:デフォルトの名無しさん
10/02/14 05:48:56
入門書とかで「解説のためにわざと非効率なコード書いてます」とか出ると混乱するよな。
454:デフォルトの名無しさん
10/02/14 10:02:18
>>447
C99に完全準拠しているコンパイラはIntel C++などごく一部だけだぞ
g++も部分準拠だし移植性がないしだいたいg++はC++0xへの改訂作業で
手一杯で今は時代遅れのC99に携わっている暇はないだろう
455:デフォルトの名無しさん
10/02/14 10:07:15
C++0xへの改訂作業なんて、
考えるだけで頭痛くなってくるなww
456:デフォルトの名無しさん
10/02/14 10:11:50
C99への準拠を強化するよかまだ0xに力入れた方がマシということ
457:デフォルトの名無しさん
10/02/14 10:11:59
でもnullptrとdecltype、auto、右辺値参照、コンテナの初期化子
など痒い所に手が届くようになるのはありがたいよな
458:デフォルトの名無しさん
10/02/14 11:36:08
今までが届かなさすぎだったんだよ!
459:デフォルトの名無しさん
10/02/14 12:53:10
/usr/include/を見ていたら、*.hと*.cppがありました
*.cppには#include "*.h"としか書いてありません
一体何がしたいんですか?
460:デフォルトの名無しさん
10/02/14 12:57:27
>>459 知るか。書いた奴に聞けよ。
461:デフォルトの名無しさん
10/02/14 15:00:38
イテレータから元の変数にアクセスできますか。
vector<int>::iterator p;だと、配列要素の値と位置がわかるだけ気がしますが
pの前方に要素追加したり削除したりとか。
462:デフォルトの名無しさん
10/02/14 15:04:23
>>461
「元の変数」って何?
vector インスタンスのことなら、無理。
463:デフォルトの名無しさん
10/02/14 15:06:31
サンクス
464:デフォルトの名無しさん
10/02/14 15:24:40
スタティックリンクライブラリ作成についての質問なんですが
1.C言語でも扱えるようにAPIの引数や戻り値部分だけあわせておけば
内部でC++で書いていようが問題はない?
2.スタティックリンクライブラリをコンパイルする際にスタティックリンクライブラリが
利用する外部の機能を取り込まないようにするにはどうすればいいですか?
(VC++2008
465:デフォルトの名無しさん
10/02/14 15:33:30
親クラスを継承して子クラスを作るときには、
子クラスのヘッダファイルにもオーバーライドするメソッドを、定義しないとダメなんですか?
一応自分でも試してみたんですが、コンパイラ様に怒られたので
466:デフォルトの名無しさん
10/02/14 15:35:30
>>465
そんなことはない。
エラーメッセージは?できればソースも出して。
467:デフォルトの名無しさん
10/02/14 15:36:57
純粋仮想関数を持つ親クラスを継承した子クラスをインスタンスとして使おうとしたとか?
468:デフォルトの名無しさん
10/02/14 15:38:57
>>465
あとメソッドっていう用語は存在しないので、
今後はメンバ関数member functionと
呼ぶようにしなさいね。
469:デフォルトの名無しさん
10/02/14 15:42:06
>>464
1は、extern "C"もつければおk
2は、「取り込まない」の意味が微妙。
作ってるライブラリをAとして、
AはBというライブラリを使用しているとき、
AにBを含ませたくないという意味?
特殊なことしなければ「取り込まない」状態だと思う。
Aのプロジェクトの中にBのlibファイルを追加すれば
「取り込む」状態になるけど。
470:465
10/02/14 15:48:08
ひとまず、ヘッダファイルだけ晒します
class Super{
public:
Super();
virtual void print();
~Super();
};
class Sub : public Super{
public:
Sub();
void print();
~Sub();
};
エラー
${HOME}/Test/sub.cpp:8: error: no ‘void Sub::print()’ member function declared in class ‘Sub’
471:デフォルトの名無しさん
10/02/14 15:57:10
Visal C++ 2008 ExpレッsEditionでWindowsXP向けの開発です。
ウィンドウごとに音量を調整、若しくは開いているフラッシュオブジェクトの音量を調整する関数
または手法は無いでしょうか?
472:デフォルトの名無しさん
10/02/14 16:16:59
イテレータは挿入しても保たれるけど、end()とbegin()はそうでないのね。
不便。何でこんな事にしたの。
473:デフォルトの名無しさん
10/02/14 16:24:09
>>472
??保たれない場合もあるだろ。何を言いたいのかよく分からんぞ。
474:デフォルトの名無しさん
10/02/14 16:28:15
そうなのか。気をつける。
475:デフォルトの名無しさん
10/02/14 16:41:04
何が保たれるんだ?
476:デフォルトの名無しさん
10/02/14 16:42:04
*.cppに直接宣言している変数って何なんですか?
477:デフォルトの名無しさん
10/02/14 16:44:46
どんなコード?
478:476
10/02/14 16:48:30
>>477
こんなコードです
DownloadManager *BrowserApplication::s_downloadManager = 0;
HistoryManager *BrowserApplication::s_historyManager = 0;
NetworkAccessManager *BrowserApplication::s_networkAccessManager = 0;
479:デフォルトの名無しさん
10/02/14 16:53:36
googleのコード検索で見たけど
グローバル変数だね
480:デフォルトの名無しさん
10/02/14 16:57:51
prefix の s_ はstatic変数のsを表しているのかもしれない
481:デフォルトの名無しさん
10/02/14 16:58:43
>>478
staticのメンバ変数は、どっかに実体を宣言しないといけない。
482:479
10/02/14 17:01:50
そうだったw
479は間違い
483:デフォルトの名無しさん
10/02/14 17:04:26
boost::tuples or tuple
の使い方が分かる日本語のサイトを教えてください。
名前空間が
boost::tuplesなのかboost::tupleなのか、
色々混ざっているようなので
ググっても謎です。
現行仕様のboost.タプルのの使い方が分かる日本語のサイトを教えてください。
よろしくお願い申し上げます。
484:デフォルトの名無しさん
10/02/14 17:05:53
アキラさんのboost本買うといいよ
485:デフォルトの名無しさん
10/02/14 17:18:10
テンプレート本?
486:デフォルトの名無しさん
10/02/14 17:41:35
>>483
URLリンク(boost.cppll.jp)
487:483
10/02/14 17:49:05
>>486
お返事ありがとうございます。
拝読致します。
488:デフォルトの名無しさん
10/02/14 18:41:11
>>481
ありがとう
489:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/14 19:10:50
CやC++を今から勉強したいんですけど、
全くの初心者ですがオススメの本ってありますか?
将来仕事にすることも考えてます。
491:デフォルトの名無しさん
10/02/14 19:14:57
>>490
独習シリーズ
本屋に行って、黄色い分厚い本を買って頭からケツまで20回嫁。
492:デフォルトの名無しさん
10/02/14 19:19:28
>>489
ありとあらゆる意味でダメ。
期待したとおりに動かないし、(直したとして)保守性も最悪。
窓からソースを投げ捨てるレベル。
493:デフォルトの名無しさん
10/02/14 19:20:11
ワロタw
494:デフォルトの名無しさん
10/02/14 19:20:53
>>491
ありがとうございます
明日にでも買ってこようと思います
495:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/14 20:15:00
>>495
ちなみにvectorだったらどんな感じになるんですか?
497:デフォルトの名無しさん
10/02/14 20:30:02
>>495
元のコードって、領域が配列を跨いで連続してる必要があるんじゃないの?
498:デフォルトの名無しさん
10/02/14 21:17:12
>>496
std::vector<int> a[N];
for (int i = 0; i < N; ++i)
{
a[i].resize(N - i);
}
499:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/14 21:37:35
>>497
そこが問題になるんですよね・・・
>>498
なるほど
501:デフォルトの名無しさん
10/02/14 22:41:14
上でC99に準拠しているコンパイラが少ないって話が出ていたけど、
実際に試してみたら
VC, gcc, bcc, dmc, OpenWatcom
で全部ガン無視されててフイタwww
むしろIntelの仕様がおかしいって言われそうで不憫だ。
502:デフォルトの名無しさん
10/02/14 22:45:10
gcc?
503:デフォルトの名無しさん
10/02/14 22:47:11
>>502
GNU C Compiler ですけど?
504:デフォルトの名無しさん
10/02/14 22:48:49
gnu compiler collection
505:デフォルトの名無しさん
10/02/14 22:53:13
gccじゃなくてg++じゃ、と>>502は言いたかったに1ペリカね。
506:デフォルトの名無しさん
10/02/14 22:54:05
こまけぇことはいいんだよ
507:デフォルトの名無しさん
10/02/14 22:54:26
>>504
その略称のこともあるけど、GNU C Compilerの名前としてもgccは使われる。
>>502
お前人の揚げ足取ろうとする嫌な性格のやつなのね?
そのくらい分かることだろ?
さらに言えば今回の文脈ではg++じゃなくてgccが正しい。
508:デフォルトの名無しさん
10/02/14 22:56:51
gccで全然問題ない
509:デフォルトの名無しさん
10/02/14 23:05:20
>>502
がフルボッコw
510:デフォルトの名無しさん
10/02/14 23:06:32
俺は502じゃないが、-std=c99つけてもあかんの
あと関係ないけどGNU Compiler Collectionを指すときってGCCにするんじゃね
511:デフォルトの名無しさん
10/02/14 23:10:18
>>510
その略称のこともあるけど、GNU C Compilerの名前としてもgccは使われる。
さらに言えば今回の文脈ではg++じゃなくてgccが正しい。
512:デフォルトの名無しさん
10/02/14 23:11:56
>>510
> 俺は502じゃないが、-std=c99つけてもあかんの
いやだれ一人としてダメなんて言ってないぞ?
513:デフォルトの名無しさん
10/02/14 23:12:37
>>499
大きな領域を一度に確保してからplacement newを発動するとか
デストラクタが面倒臭い事になるけど
514:507
10/02/14 23:13:42
>>512
いや言ってるんじゃね?
515:デフォルトの名無しさん
10/02/14 23:13:48
GCCがC99ガン無視って事は無いな
516:デフォルトの名無しさん
10/02/14 23:14:45
どうみても>>499は愚行だと思うんだが
517:502
10/02/14 23:19:43
俺の疑問は>>510の1行目が理由で>>515なのではないかということ。
ok?
518:デフォルトの名無しさん
10/02/14 23:21:18
お前ら全員いい加減にしようぜ
519:499
10/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
10/02/14 23:29:10
boost::tuple
勉強してきました。
感動しました。
521:デフォルトの名無しさん
10/02/14 23:30:29
> 広く使われている処理系でも、タプルのこの種の用途について
> 最適化をしくじるものが存在する(例えば bcc 5.5.1)
> ことに注意されたい。
Boostに名指しされとるww
522:デフォルトの名無しさん
10/02/14 23:32:42
まあ普通にstd::pairの拡張版だと捉えているがな
523:デフォルトの名無しさん
10/02/14 23:34:19
bcc 5.5.1は今から見るとひでぇからな。
524:デフォルトの名無しさん
10/02/14 23:35:47
仕方ねえよ
標準C++にできるだけ準拠しようとして精一杯で
最適化まで手が回らなかったんだろ
525:デフォルトの名無しさん
10/02/14 23:49:33
>>519
何がしたいのかわからん。
new した領域はいつ delete されるの?
なんで std::vector 使わないの?
526:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/14 23:57:10
>>526 typename
528:デフォルトの名無しさん
10/02/14 23:58:27
>>527
ありがとうございます。
何か追記する必要がありますでしょうか?
529:デフォルトの名無しさん
10/02/14 23:58:31
>>526
typename TestClass<T>::SS* TestClass<T>::TestCode(void)
530:デフォルトの名無しさん
10/02/14 23:59:46
>>529
ありがとうございます。
コンパイル通りました。
なぜ、先頭に typename と入れる必要があるのでしょうか?
教えて下さい。
宜しくお願いします。
531:デフォルトの名無しさん
10/02/15 00:01:57
>>530 URLリンク(ja.lmgtfy.com)
532:デフォルトの名無しさん
10/02/15 00:05:55
>>531
ありがとうございました。
533:デフォルトの名無しさん
10/02/15 00:07:47
>>531
こんなサイトがあるんだw
>これは、質問を自分で調べずに質問する人のために、Google検索の便利さを伝えるものです!
534:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/15 02:22:07
Cでも構造体を返すことが出来るのは当然知ってるよな?
で、当然、その構造体のメンバとして、
(mallocで確保した領域への)ポインタを持てることも知ってるよね?
536:デフォルトの名無しさん
10/02/15 02:24:17
>>534
mallocとか使って自分で管理するのと違って、クラスにその責任は任せてしまえる。
つまり、あんまり気にしなくていい。
537:デフォルトの名無しさん
10/02/15 02:24:26
>>535
はい
std::stringで確保したデータが不要になった場合は
clear()しておけば従来のfreeに相当する動作ということでいいんですかね?
538:デフォルトの名無しさん
10/02/15 02:34:49
ああ・・・いろいろ勘違いを・・・
テンプレートクラスということなので
std::string* Data = new std::string();
stringの確保をこういう感じにしてこれを返せばいいんですね
539:デフォルトの名無しさん
10/02/15 08:06:25
>>538
ちがーう。
std::string をそのまま int か何かと思って同じように扱えばいい。
540:デフォルトの名無しさん
10/02/15 11:46:06
>>537
オブジェクト指向を根本的に勘違いしているな
std::stringは一種のクラスであり、それ自体データとメンバ関数の
集まりとして完結しているものだ
だから普通のPOD型の変数や構造体と同じように値返しが出来る
但しこれは当たり前だが、関数の中で定義したローカルstringを
参照返しするような事をすれば、これはstringに限らずどんなデータ型
だとしても未定義の動作となる
541:デフォルトの名無しさん
10/02/15 21:52:32
回答側がバラバラすぎて、それぞれ何を主張してるのかよくわからん
542:デフォルトの名無しさん
10/02/15 21:53:01
>>538
C++初心者にオススメ。
ロベールの部屋
URLリンク(www7b.biglobe.ne.jp)
Codian
URLリンク(www.kab-studio.biz)
猫でもわかるプログラミング
URLリンク(www.kumei.ne.jp)
少なくともこれぐらいは読んで
初めて質問が出来るレベルになるだろう
と思います。
543:デフォルトの名無しさん
10/02/15 22:12:47
素直にCから学べばよかったのに
544:デフォルトの名無しさん
10/02/15 22:14:20
Cから学ぶとC++の習得に余計な時間がかかるぜ
545:デフォルトの名無しさん
10/02/15 22:26:47
Javaだのを習得して、おかしな脳内回路ができるよりマシ
546:デフォルトの名無しさん
10/02/15 22:43:03
プログラミング経験皆無から始めるとして
Cに3週、C++&STLに9週、テンプラ遊びの基礎に12週
これぐらいかかるかな
547:デフォルトの名無しさん
10/02/15 22:43:22
>>545
それはあるわ。Javaって結構綺麗な言語だから、
C++みたいな清濁併せ持ったカオスな言語だと
勉強がいやになってしまうんだよな。
548:デフォルトの名無しさん
10/02/15 22:46:21
>>546
あとたくさん本を買わなければならないよ
C++について学べば学ぶほど、たくさんの本が必要になる
中には絶版になってしまったものもあって残念だが
俺は絶版扱いのC++標準ライブラリを一番多用している
手垢が付いてもう真っ黒だぞ
549:デフォルトの名無しさん
10/02/15 22:59:56
>>547
> Javaって結構綺麗な言語だから、
そうか?
Javaも結局 謎の仕様を覚えなきゃならんことがあるし、
落ち目の感が否めない
550:デフォルトの名無しさん
10/02/15 23:02:30
>>549
謎仕様も多いけど、C++くんに言われとうないわ!
まぁそうだな、綺麗だった、と言い直しとくわ。
551:デフォルトの名無しさん
10/02/15 23:11:28
多くのプラットフォームで使えるC言語以上の
高級言語の内、
仕様が最も綺麗な言語って何だろう?
実際に役立つかとかはおいといて。
D言語かPython 3系(2系でなく)かな?
552:デフォルトの名無しさん
10/02/15 23:12:54
>>551
brainfuck とか whitespace とか
553:デフォルトの名無しさん
10/02/15 23:13:00
後でできた言語の方が綺麗な構文になるのは仕方ないこと
Javaはまあ綺麗になる前の踏み台みたいなポジションなのでしかたない
しかしC#からC++に戻るとゲシュタルト崩壊?するわ
C言語くらいまで戻るといろいろな面倒は自分で見ないといけないと
割り切ることができるけどC++のような中途半端だとスゲー悩む
554:デフォルトの名無しさん
10/02/15 23:17:12
ゲシュタルト崩壊 - Wikipedia
URLリンク(ja.wikipedia.org)
555:デフォルトの名無しさん
10/02/16 00:32:17
教えて下さい。
テンプレートクラスから派生したクラスから、
基底クラスのメンバ関数をオーバーライド
することは出来ないのでしょうか?
なんどやってもエラーになってしまいます。
よろしくおねがいします。
556:デフォルトの名無しさん
10/02/16 00:35:27
codepadあたりにエラーになるコードを貼ってくれ
557:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/16 00:54:05
>>557 >>527-
あと、ポインタ返す関数で return 1 は無いだろう。
559:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/16 01:14:06
>>559 >>527-
サルかお前は?
561:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/17 01:01:13
>>561
ありがとうございました。
563:デフォルトの名無しさん
10/02/17 07:48:40
typename A<T>::S * TestFunc( typename A<T>::S *p );
564:デフォルトの名無しさん
10/02/17 10:43:57
テンプレートクラスを特殊化する場合
メンバ全てを宣言・実装し直さないといけないのでしょうか?
それとも変更点のみで良いのでしょうか?
あと、
template <typename T ,typename S = T>
というデフォルト引数の設定は可能なのでしょうか?
565:デフォルトの名無しさん
10/02/17 11:03:13
>>564
クラステンプレートを特殊化したなら全部宣言しなおさないとダメでしょ。
クラステンプレートのメンバ関数ごとに特殊化できなかったっけ?
> template <typename T ,typename S = T>
やってみればいいじゃない。
566:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/17 13:31:38
ごめん、間違えた
template<class A>
struct DefTypeA {
typedef Base<A, nanika> type;
};
568:デフォルトの名無しさん
10/02/17 14:04:17
テンプレート引数が異なるクラステンプレートの実体は関連が無いので、
同じクラステンプレートの異なる実体を継承することも出来る。
使いどころは限られるが。
template<typename T>
class A { ... }; // デフォルト実装
template<>
class A<int>: public A<...> // int以外を与えた場合のAを継承
{ ... }; // 追加の実装
569:デフォルトの名無しさん
10/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
10/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:デフォルトの名無しさん
10/02/17 20:31:44
>>569
標準ではなかった気がする
自分で作るかboost::operatorsだな
572:デフォルトの名無しさん
10/02/17 22:07:41
std::vector<class A> のpush_back() ってどんな動作してるんだ?
たとえば
vector<string> vec;
vec.push_back("test");
ってやったら
stringの何を呼び出してstringクラスに"test"を入れているんだ?
自作の文字列クラスをvecにつっこんで機能を使わせたいのです
573:デフォルトの名無しさん
10/02/17 22:13:46
コンストラクタ
574:デフォルトの名無しさん
10/02/17 22:44:09
STLを使うならEffectiveSTLには絶対に目を通しておけ
575:572
10/02/18 01:18:05
>>573
コンストラクタに(const char* )を追加して実行してみました.
URLリンク(codepad.org)
どうやら大分ひどいことをしているようなんですが,
コンパイルは通ってしまいます.
ご指導をよろしくおねがいします.
もしくは>>574さんの勧める書籍を読めば何故こうなるのか理解出来るでしょうか?
576:デフォルトの名無しさん
10/02/18 01:21:03
クロージャで出来て関数ポインタで出来ない例が思いつかない。
577:デフォルトの名無しさん
10/02/18 01:32:58
>>575
暗黙定義のコピーコンストラクタと代入演算子で浅いコピーになってる。
デストラクタを書くようなクラスではこの2つも必ず確認しなければいけない。
578:デフォルトの名無しさん
10/02/18 01:47:45
>>576
関ポじゃ状態を持てないじゃん
579:デフォルトの名無しさん
10/02/18 02:01:11
>>575
URLリンク(codepad.org)
これでいいと思われます
要するにクラス内部でnew/deleteを行うような場合は
必ずコピーコンストラクタと代入演算子関数は自前で用意
しなければならないという事です
そうしないとクラッシュしたり、メモリリークしたりします
580:572
10/02/18 02:59:22
>>579 >>577 ありがとうございます!
コピーコンストラクタと代入演算子を作らないといけなかったんですね
わかりやすくコードもひいてくださりありがとうございました
581:デフォルトの名無しさん
10/02/18 08:36:28
>>579
operator= の new で失敗するとゴミポインタ持ったままのインスタンスが残っちゃうよ。
delete の前のヌルチェックは要らないよ。(メッセージを分けたかったんなら別だけど)
strlen() してから strcpy() するのってもったいないね。
date() じゃなくて data() だよね?(あ、 >575 から間違ってるのか。)
こんなちっちゃいクラスでもこんだけ問題が出るんだから、やっぱり自作文字列クラス
なんて作るもんじゃないね。みんなわかってると思うけど。
582:デフォルトの名無しさん
10/02/18 09:51:30
>>578
やっと理解した。Cというか関数ポインタだと代替にならないな。
でもこれC++ならクラスでやれって話になるな。
583:デフォルトの名無しさん
10/02/18 10:18:58
乱暴に言うと、クラスはデータとそれに付随する振る舞いをまとめたもの。
クロージャは振る舞いとそれに付随するデータをまとめたもの。
・・・っていうのはどの本の説明だったかな。
584:デフォルトの名無しさん
10/02/18 10:38:06
データ構造を決めれば操作は大体決まるから
俺にとっては前者のほうが自然に感じるが
一方、振る舞いだけでデータも記述できるんだよな
抽象データ型とかは操作ありき、だし
object is a poor man's closure
closure is a poor man's object
585:デフォルトの名無しさん
10/02/18 12:11:05
クロージャって要は関数オブジェクトみたいなもんでしょ?
586:デフォルトの名無しさん
10/02/18 12:45:33
>>581
>delete の前のヌルチェックは要らないよ。
デタラメ言うんじゃないよ
代入前に既に値が入ってたらどうするつもりだ
それともtextが0だったらdeleteしても何も起きないというつもりか
それだったら個人の自由だ
プログラム上値が入っていたら消すんだよという意味を強調している
それから
>operator= の new で失敗するとゴミポインタ持ったままのインスタンスが残っちゃうよ。
文句言うなら自分でもっといいプログラム貼れや
>strlen() してから strcpy() するのってもったいないね。
>date() じゃなくて data() だよね?
元のプログラムをそのまま使っただけだ
自分が1から書いたらもちろんこういう書き方はしない
もう一度言う 文句あるなら自分で貼れ
587:デフォルトの名無しさん
10/02/18 13:20:25
>プログラム上値が入っていたら消すんだよという意味を強調している
んなの強調して何の意味が。deleteなんだから消すに決まってる。
「値が入っていたら」はdeleteがやってくれる。
588:デフォルトの名無しさん
10/02/18 13:24:06
delete null 規格上は許されてるよ。
でもまあ、nullチェックしたほうが自然だろな。
589:デフォルトの名無しさん
10/02/18 13:29:38
そのnullチェックがそのコードで意味があってのことならやるが
機械的にチェックするだけ、という意味しかないのなら消すわ
590:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/18 13:45:25
上の実装だと内部データ返せるから
dateの戻り値をdeleteだって出来る(これは設計ミスだろう)。
そうなるとチェックせずにdeleteするのは「二重delete」で死ぬと思ったんだが
ノーチェックで問題ないんかえ?
592:デフォルトの名無しさん
10/02/18 13:47:07
は?NULLチェックするに決まってるだろ
んでdelete後にはNULL入れとけボケ
593:デフォルトの名無しさん
10/02/18 13:53:36
俺は暗にあんたを擁護したんだが・・日本語勉強しる
594:デフォルトの名無しさん
10/02/18 14:05:06
ID出ないと誰が誰だか分からない
まあとりあえずみんな落ちつけ
595:デフォルトの名無しさん
10/02/18 14:06:13
なんでID無しなんだろうな
おかげで自演し放題だわ
596:デフォルトの名無しさん
10/02/18 14:44:11
●持ちには隠しID丸見えだよ
自演はほどほどに
597:デフォルトの名無しさん
10/02/18 14:54:03
あちゃー、このスレ全部俺だったのバレてたか
598:デフォルトの名無しさん
10/02/18 14:58:48
いやいや、俺俺。
599:デフォルトの名無しさん
10/02/18 15:11:47
>>591
「deleteしたらNULL入れる」だけで二重deleteは防げる。
NULLチェックしたって二重deleteは全く防げない。
600:デフォルトの名無しさん
10/02/18 16:11:57
>>599
C++は規格票でもNULLより0が推奨されています
601:デフォルトの名無しさん
10/02/18 16:35:47
もう>>498はいないだろうが
n行m列のvectorの二次元配列の確保で
vector<vector<int> > v(n,vector<int>(m));
こういう書き方って異端?
602:デフォルトの名無しさん
10/02/18 16:55:40
>>601
別に
三次元の場合もその書き方でよく書いてるけど
603:デフォルトの名無しさん
10/02/18 17:49:15
異端じゃないけど効率悪いよ
n*mサイズのベクタ一本とってインデクスは計算で出すほうがいい
つーかC++は効率を良くしつつv[a][b][c]=1;みたいに書くことができないのが残念
せめて[a, b, c]とかでもいいからoperator定義できればよかったんだが
604:デフォルトの名無しさん
10/02/18 19:27:19
>>602
なるほど、了解
>>603
>n*mサイズのベクタ一本とってインデクスは計算で出すほうがいい
直感的にはループの中で剰余と割り算でインデックス計算したりするほうが
遅くなるように思うけど
領域が連続でないことでそんなに遅くなるもん?
605:デフォルトの名無しさん
10/02/18 19:30:37
>>604
連続でないってことは内部的に管理する仕組みが動いてるだろうから
インデックスの増減ですぐにアクセスできるのとでは消費パワーが違うよ
606:デフォルトの名無しさん
10/02/18 19:58:58
(n, m)のインデックス算出に剰余と割り算使うのか?
普通はかけ算と足し算だと思うが
607:デフォルトの名無しさん
10/02/18 19:59:25
>>604
剰余も割り算も使わないよ
v[siz1 * idx2 + idx1]
乗算と和だけ
あとベクタのベクタはメモリに関するコストが増える
608:デフォルトの名無しさん
10/02/18 20:01:36
URLリンク(kansai2channeler.hp.infoseek.co.jp)
クイックソートを再帰なしに作ったんですが,なぜかソートされません・・・なぜorz
609:デフォルトの名無しさん
10/02/18 20:17:17
>>605-607
確かにorz
自分の勘違いも含めたベンチコード
URLリンク(codepad.org)
vectorにしたら結果が大きく変わるってことはないと思うんで
思ったほど差はない模様
610:デフォルトの名無しさん
10/02/18 20:52:26
>>608
まずpartitionがうまく動いてるか調べてみたら?
611:569
10/02/18 22:35:34
>>571 レスありがとう.
boost::operators 調べてみたけど,クラスに operator を自動追加してくれるだけで
関数オブジェクトには利用できないのかな?
ソート対象のメンバ変数ごとに Less の関数オブジェクト用意して,
逆順ソートする場合は Less の関数オブジェクトから Greater の関数オブジェクトを生成して
ソートに利用する手法は良くやりそうだけど,自分で作るしかないか…
612:デフォルトの名無しさん
10/02/18 23:01:17
#if defined(Q_WS_MAC)
何これ?
613:デフォルトの名無しさん
10/02/19 00:34:01
#define TEST 5でマクロを定義し、char型の配列等に文字列TESTを代入すると、
"5"が判断されなくなってしまいます。
マクロを文字列に代入し、尚且つ置き換え後の値を取り出すにはどうしたらよいのでしょうか?
614:デフォルトの名無しさん
10/02/19 00:53:02
こんな感じの??
URLリンク(codepad.org)
615:デフォルトの名無しさん
10/02/19 00:54:44
何かエラー出るな。
URLリンク(codepad.org)
616:デフォルトの名無しさん
10/02/19 01:02:39
#define TEST "5" じゃダメなん?
617:デフォルトの名無しさん
10/02/19 01:07:15
>>616
まったくダメなことはないけど、質問がよく解らんから普段使わない機能を使ってみた。。。vv
618:デフォルトの名無しさん
10/02/19 01:22:07
>>591
dateの戻り値をdeleteされる場合を考慮しはじめると、何をどうチェックしたところで無駄。
どうにもならない。
619:デフォルトの名無しさん
10/02/19 01:24:05
>>599
二重deleteを防ぎたいなら「deleteしたらNULL入れる」なんてせずに、
auto_ptr/vectorをはじめとするRAIIスタイルのライブラリを使ったほうがいい。
無駄なNULL代入が減る分、効率も向上する可能性が高い。
620:デフォルトの名無しさん
10/02/19 01:29:02
ご返答ありがとうございます。
試してみたけど駄目でした…
やりたいことは、
#define TEST 5
…
char * a = { "TEST" };
この変数aがどうやってもTESTという文字列でしか認識されず、5が出せないのです。
char型の配列にはヌル文字が付くからマクロとして認識されてないのでしょうか…?
621:620
10/02/19 01:37:42
型がLPCTSTRの所で変数aを入れてるのが原因かなぁ
622:デフォルトの名無しさん
10/02/19 01:37:50
なんか>>616でいいような気がするが。。。
文字列を結合したいならそういう関数を使う。sprintfとか
623:デフォルトの名無しさん
10/02/19 01:39:05
情報の後出しは基本的にご法度だぜ。。。
ウインドウズ使っていいなら簡単な方法がある。ちょとコード書く。
624:デフォルトの名無しさん
10/02/19 01:39:47
む、LPCTSTR・・・・・とかhoge_sとか・・・
この辺の話はどうにかならんのかね・・・?
625:デフォルトの名無しさん
10/02/19 02:00:42
>>620
文字列リテラルの中はマクロ展 されない。
626:620
10/02/19 02:01:49
char型の配列使わずにint型の配列にTESTを入れて処理を進められました('A`)
大変ありがとうございました
627:デフォルトの名無しさん
10/02/19 02:05:03
#define TEST "5"
…
char * a = { TEST };
これでいいんでないの?
628:デフォルトの名無しさん
10/02/19 02:05:12
お前それで良いのか
629:デフォルトの名無しさん
10/02/19 02:06:09
おっと>>628は>>626向け
630:デフォルトの名無しさん
10/02/19 02:06:37
>>586 URLリンク(codepad.org)
631:デフォルトの名無しさん
10/02/19 02:11:36
>>620
#include "boost/preprocessor/stringize.hpp"
#define TEST 5
char const* a = BOOST_PP_STRINGIZE(TEST);
632:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/19 02:23:19
>>610
なんかうちの環境が悪いだけでしたあざす
634:デフォルトの名無しさん
10/02/19 02:29:21
>>630
これってstaticにする意味って何?
あおりじゃなくてただの素人です
635:デフォルトの名無しさん
10/02/19 02:30:09
俺は文字列リテラル外すマクロが欲しい
636:デフォルトの名無しさん
10/02/19 02:35:19
>>635
文字コードすべて暗記してint型の配列を確保してエンディアン考慮して
文字を16進数にでもして並べていけばリテラルいらないよ
637:デフォルトの名無しさん
10/02/19 02:40:11
>>634
static にしないと引数として this ポインタが付く。無駄な引数は付けないのが当たり前。
638:デフォルトの名無しさん
10/02/19 02:44:40
リテラル嫌なら
int a[2] = { 0x65676f68,0x00000000 };
printf("%s\n",(char*)&a[0]);
639:デフォルトの名無しさん
10/02/19 02:52:21
>>638
で、そう書く利点は?
640:デフォルトの名無しさん
10/02/19 02:53:55
無いよ
リテラルがいやとかぬかすから書いただけ
わざわざこんなめんどくさい書き方しなくてもいいようにC言語なりに考えられてるのに
いやとかぬかすからねえ
641:デフォルトの名無しさん
10/02/19 02:56:11
表示サンプルがhogeだったからまずかったのかね?
642:デフォルトの名無しさん
10/02/19 03:05:36
>>637
private な static メンバ関数ってそういう目的があるんすね
ありがとうございます
643:デフォルトの名無しさん
10/02/19 03:07:01
文字列リテラルを勝手に外部化して後付けで差し替え可能なリソースを作ってくれるプリプロセッサを所望してるんだよな
644:デフォルトの名無しさん
10/02/19 03:10:34
>>643
いいたいことがイマイチよくわからんがエスパー的ひらめきだと
VC++のメニュー関連のリソースが浮かんだ
しかも手書きでやらないといけないというのを・・・
645:デフォルトの名無しさん
10/02/19 03:12:21
>>640
誰も嫌とはいってなくね?
646:デフォルトの名無しさん
10/02/19 03:13:55
おまけにVCのリソースを標準関数に喰わせようとすると無茶苦茶大変だし。
647:デフォルトの名無しさん
10/02/19 03:15:07
vsくらいになるとsettingとかあるんだけどな
勝手にxml読み込んだり書き出したりしてくれる機能があってそこへ
文字とかいれておけば呼び出せたりするんだが
648:デフォルトの名無しさん
10/02/19 03:24:32
文字列リテラル外部化って今でもできるんじゃね?
文字列リテラルだけ書き込みヘッダ用意してそこへ入れておけば・・・
そういうのとは違うのか?
649:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/19 07:29:54
メモリの大きさがそれほど無い組み込み環境化だとC++って使われるんだろうか
std::stringとかの動作を考えてみてもすげー細かいレベルでメモリが断片化しそうなんだが
651:デフォルトの名無しさん
10/02/19 07:35:09
>環境化
環境下
652:デフォルトの名無しさん
10/02/19 08:21:59
>>650
相応にメモリの使用量や動的確保のタイミングに注意を払えばいいだけのこと。
C++ はそういう環境でも使えるようにできている。
653:620
10/02/19 12:18:39
>>625
>>627
>>631
>>632
>>649
マクロ展開できてなかったのですか…
632と649にある方法を試したところ、ちゃんとマクロとして認識され、5が表示できました。
boost入れてなかったんで631にある方法は試せなかったのですが、boostを利用する方法もあったんですね。
今後も似たような場面に出くわす可能性が高いので、提示されたサンプルはメモらせてもらいます。
ありがとうございました。