- 1 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 11:02:46 ]
- スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。
スレを勃てるまでもないC/C++の質問はここで pc11.2ch.net/test/read.cgi/tech/1167476845/
- 577 名前:デフォルトの名無しさん [2007/07/24(火) 17:28:14 ]
- 今までVC6をつかっていたのですが環境をVS2005 C++に変えました。
メモリアクセス違反を不正なポインタにアクセスして出した場合、いままでは catch(...) で例外を捕捉できていたのですが2005にしたらできなくなってしまいました 原因もしくは解決方法をご存じの方がいましたらお願いいたします。 処理としては不正なポインタからローカルの変数に代入しているだけです。 よろしくおねがいします
- 578 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 17:38:12 ]
- ディスプレイの任意のピクセルの色情報を取得したいんですけど
どんなことをすれば出来るんでしょうか 普通に入ってるwindows.hとかでも出来ますか? 画面丸々ビットマップに変換して〜 とかなら自分でも出来そうなんですけど、全然スマートじゃない気がするので
- 579 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 17:52:04 ]
- >>578
ディスプレイ=デスクトップとして、 デスクトップのDCを得る。 HDC hdc = GetDC(NULL); HDCの任意の場所のピクセル情報を得る COLORREF rgb = GetPixel(hdc, x, y); こんなんでどうか
- 580 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 17:59:54 ]
- >>579
おお、そんな便利な命令があったんですか 2,3時間ネットで調べて見てもダメだったんですが綺麗に解決しました。 ありがとうございます
- 581 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 19:23:04 ]
- >>577
コンパイラオプション/EHa使え
- 582 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 19:28:20 ]
- 最近C初めたんですが
#include <string.h> を入れるとコンパイルしても結果が得られないのですがなぜですか??? 超初心な質問だと思いますが・・・ どなたか助言をお願いします
- 583 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 19:30:53 ]
- 嗚呼、ぬるぽ
- 584 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 19:41:53 ]
- 私も最近C初めたんですが
#include <string.h> を入れるとコンパイルしても結果が得られますのですがなぜですか??? >>582は超初心な質問だと思いますが・・・ どなたか助言をお願いします
- 585 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 19:43:57 ]
- 私も最近C初めたんですが
#include <string.h> を入れるとコンパイルしても結果が得られないのですがなぜですか??? >>584も超初心な質問だと思いますが・・・ どなたか助言をお願いします
- 586 名前:デフォルトの名無しさん [2007/07/24(火) 19:46:46 ]
- >>584
>>582が低脳だから
- 587 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 19:52:00 ]
- >>582
その「結果が得られない」というソースを張りたまえ。
- 588 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 19:56:25 ]
- ソースってなんでしょう???ウスターソースならウチにありますが・・・
- 589 名前:582 mailto:sage [2007/07/24(火) 19:58:19 ]
- なんだかよくわかりませんがもう一度コンパイルしたら
でてきました どうもすいません
- 590 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 20:03:37 ]
- ____
/_ノ ヽ、_\ プギャアアアアアアアアアアアアアア o゚((●)) ((●))゚o /::::::⌒(__人__)⌒::::: \ (⌒) | |r┬-| | ,┌、-、!.~〈 | | | | | | | | | __ヽ、 | | | | | レレ'、ノ‐´  ̄〉. \ `ー' / `ー---‐一' ̄
- 591 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 20:49:48 ]
- >>581
ありがとうございます。無事動作いたしました。 SEHというものを初めて知りましたが、便利ですね
- 592 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 08:19:12 ]
- 連想配列を実現する関数のサンプルってどこかにありませんか?
- 593 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 08:22:35 ]
- >>592
std::map?
- 594 名前:592 mailto:sage [2007/07/27(金) 08:33:40 ]
- サンプルを自力で発見しました。
どうもお騒がせしました
- 595 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 08:34:27 ]
- >>593
C言語で連想配列を実現したかったんです。 舌足らずですみません。 で、こんなHPを見つけて事故解決しました。 ew-and-f.hp.infoseek.co.jp/MyStudy/C-Language/associated-array.html
- 596 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 09:34:22 ]
- Cだとハッシュという言葉のが一般的だからなあ。
- 597 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 18:54:56 ]
- template <class T>
class foo { public: T _data; foo(const T& v){ _data = v; } }; というクラスがあったとして foo<int> foo1(4); foo<double> foo2(2.5); … foo2 = foo1; foo<double>foo3 = foo<int>(2); という代入を実現したいのですがこれは可能でしょうか テンプレートコンストラクタを作ろうとしたら当然無理でした
- 598 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 19:09:34 ]
- >>595
STLにあるのに、自分で作るの? ・・・たぶん学校の宿題なんだろうな・・・
- 599 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 19:14:03 ]
- 事故解決したら危ない
- 600 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 19:36:30 ]
- >>598
C++じゃなくてCだそうだよ。
- 601 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 19:43:10 ]
- >>597
テンプレートのコンストラクタと代入演算子を用意するだけでは? template<typename U> foo(const foo<U>&); template<typename U> foo& operator =(const foo<U>&); これとは関係ないが、コンストラクタでは代入ではなく初期化リスト使え。
- 602 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 20:09:03 ]
- >>597
あなたが実際にやろうとしていることは、 foo<double> foo_d = foo<int>(2) ; ではなく、 double d = foo<int>(2) ; だと思う。 とりあえず operator T&() { return _data } を用意すれば、コンパイラが持っているintからdoubleの変換が使われる。
- 603 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 20:11:17 ]
- ちなみに、
> テンプレートコンストラクタを作ろうとしたら当然無理でした というのは、 template<class U> foo(const foo<U>& u) { _data = u } だったりしないか? そりゃダメだ。 やはり、 double d = foo<int>(2) をやろうとしている。 template<class U> foo(const foo<U>& u) { _data = u._data } でなければ。
- 604 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:50:15 ]
- >>601-603
回答ありがとうございます 解決できました template <class U> foo(const foo<U>& u)
- 605 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:54:31 ]
- 途中送信してしまいました・・・
template <class U> foo(const foo<U>& u) { _data = u._data; } この形式でいけました ちなみにクラステンプレートだとfoo<T>とfoo<U>とは 別のクラスになるようなので _dataのゲッタを使って解決できました ありがとうございました
- 606 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 02:44:33 ]
- >>605
>>597の通りなら、_dataはpublicだからgetterはいらないよ。 publicではない場合は・・・面倒くさいからgetterを使うか。 同じテンプレートのクラスどうしならいいけど、違っていたらダメだから、 副作用もあるけど、operator T&を用意したほうが便利だと思う。
- 607 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 07:50:35 ]
- ゲッタを用意するのとoperator T&を用意するのとでは、本質的には何も変わらないだろ。
- 608 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 07:55:49 ]
- getterを誰が呼ぶのか、getterを呼ぶコードを誰が書くのか、という点で違うと思う。
- 609 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 08:16:00 ]
- もうfriendにすればいいよ。
template<typename U> friend class foo<U>; auto_ptrとかshared_ptrもこんなことやってのかと思ったら、 getterあるから不要だった。
- 610 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 08:30:31 ]
- >>609
friendにしたところで、肝心のメンバ変数の名前が一致していないとダメだ。 ちなみにVC7.1では、そういうfriend宣言はできない・・・orz
- 611 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 14:11:55 ]
- Cで、ボタンを押すとファイルから1行ずつ読み取って描写するプログラムを作っています。
テキストの描写にはDrawTextを使っているのですが、うまくいかないので質問したいと思います。 例えば、長い文字列を描写した後、同じ場所に短い文字列を描写すると前の文字列の後ろの方が残ってしまうのです。 1回最小化してまた開くと、うまく表示されるのですが何が悪いのかよく分かりません。 こんな説明ですが、分かる方が居ましたらお願いします。
- 612 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 14:14:14 ]
- 知らないけど、リフレッシュ
- 613 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 14:14:58 ]
- 文字を書く前に、一旦後ろを真っ新に塗りつぶせばいい。
- 614 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 14:37:44 ]
- 文字列に空白でもたくさんつけとけ。
- 615 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 14:39:42 ]
- あるいは自動で最小化→最大化とか
- 616 名前:611 mailto:sage [2007/07/28(土) 15:05:28 ]
- 私の技術力の低さのせいで614さんと615さんの方法しか試せませんでしたが、なんとか解決できました。
提案して下さったみなさん、本当にありがとうございました!
- 617 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 18:18:44 ]
- えー
ちゃんと描画ハンドラを適切に実装しる
- 618 名前:611 mailto:sage [2007/07/28(土) 18:53:04 ]
- 今までにコンソールアプリケーションを作る事はあったのですが、
windowsアプリケーションは初めてで、色々苦戦してます。 メッセージ等初歩的な事は理解できたのですが、分からないことが多いです。 描画ハンドラの適切な実装?を私は InvalidateRectを呼び出して再描画させる事だと考えたのですが、うまくいかないようです。 見当違いなことを言っていたらすみません。
- 619 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 19:16:06 ]
- >>618
WindowsのGUIの基礎を勉強したほうがいいと思う。 断片的にやり方を調べてやっていると、 根本的なところを間違ったりするよ。 自前でチマチマやるくらいなら、 VCLとか使ったほうがいいかも。
- 620 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 19:20:28 ]
- >>618
見当違いなことを言い過ぎで恥ずかしいです。
- 621 名前:611 mailto:sage [2007/07/28(土) 19:30:50 ]
- 今回質問をして、明らかに知識も技術も不足していることが分かりました。
もう一度基礎から勉強し直そうと思います。 指摘や指導して下さったみなさん、ありがとう。 次にこのスレに来るときは、もう少しレベルアップしてきます。 では。
- 622 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 21:19:59 ]
- >>621
し直す というあたりが不安だ。 一度も勉強していないものを、どうやって し直す のかと。
- 623 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 21:50:39 ]
- お前さ、どんだけ上から目線なんだよ
- 624 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 22:07:01 ]
- お前さ、どんだけ下から目線なんだよ
- 625 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 22:13:23 ]
- #お前さ、どんだけ下から目線なんだよ
- 626 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 08:54:31 ]
- ∧_∧
( ・ω・ ) <消しゴムが落ちたので拾ってください (====) ______( ⌒) ) /\  ̄`J ̄ ̄ ̄\  ̄ ̄ ̄ ̄| | ̄ ̄ ̄ ̄ | | / \ □
- 627 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 09:47:56 ]
- ##お前さ、どんだけ下から目線なんだよ
- 628 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 11:03:13 ]
- #ここに初心者に対するコメントをどうぞ
- 629 名前:デフォルトの名無しさん [2007/07/31(火) 18:51:32 ]
- #include<stdio.h>
#include<window.h> main(){ int i; while(1){ printf("入力して下さい: "); scanf("%d",&i); Sleep(5000);//長い処理の代わり printf("値:%d",i); } } このようなプログラムの場合、sleepしてる間(長い処理)に キーボードから標準入力を入れると次にscanfに回ってきたとき sleepしてる間に打った数字が勝手に入ってしまうのですが、 scanfの後、キーボードからの標準入力をいったん停止することはできませんか?
- 630 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 18:55:36 ]
- 読み捨てるしかありません。
- 631 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 19:36:16 ]
- すいません、読み捨てるって意味がよくわからないです。
- 632 名前:デフォルトの名無しさん [2007/07/31(火) 19:41:46 ]
- すいません、これって超基本という感じもするのですが、、、
以下のソースをg++でコンパイルすると 最初の行とその次の行の結果が異なるのですが、 これは何故なのですか? #include <iostream> using namespace std; int main() { cout << 1 + 0.05 * (0.25) / 90 << endl; cout << 1 + 0.05 * (90/360) / 90 << endl; return 0; }
- 633 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 19:47:00 ]
- 90 / 360 = 0 だから。
90.0 / 360 とかすれば同じになる。
- 634 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 19:53:59 ]
- int 型同士の演算はその結果も int 型
90/360 は 0.25 という結果が int 型に切り詰められてゼロになる
- 635 名前:デフォルトの名無しさん [2007/07/31(火) 19:55:36 ]
- >>633
そうか! ありがとうございます。 結構大きなソースを追いかけていたのですが、最後にようやく 上記の行が原因とわかりまして、でもなぜうまく動かないのか わからなかったのですが、そうですよね、90も360もintになりますよね。 ありがとうございました。
- 636 名前:デフォルトの名無しさん [2007/07/31(火) 19:56:20 ]
- >>634
ありがとうございました。
- 637 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 20:49:08 ]
- >>631
「scanf() 呼ぶ直前に、残った文字を全部読んでしまえ」ってことだろうが それは無理。 ttp://www.kouno.jp/home/c_faq/c12.html#26 ついでに ttp://www.kouno.jp/home/c_faq/c12.html#20
- 638 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 20:52:14 ]
- >>637
fflush使わずともscanf("%*[^\n]%*c");みたいにscanfだけでも何とかなる。
- 639 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 21:04:46 ]
- いや、
>読まれていな い文字は、O/Sレベルのバッファにもため込まれている可能性がある。 だから「それは無理。」なのだろう。 しかしこれはちょっと・・・元の>629はそんなシビアな話ではないと思う。
- 640 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 21:08:38 ]
- 裏で字を食い続けるだけのスレッド動かせばいいんじゃね?
すげー無駄だけど
- 641 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 21:48:35 ]
- Aというファイルfopenで開き、fgetcでCString型の箱に格納。
Replaceで一部を置き換え、Bというファイルに書き出すというのは可能でしょうか。
- 642 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 21:57:17 ]
- >>641
そりゃぁできるでしょ。
- 643 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 22:00:23 ]
- CStringはTCHAR用なので、_gettc()ではなく(f)getc()を使うのなら
CStringAを使え
- 644 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 01:58:23 ]
- class Counter;
{ /* 略 */ int data[]; int total; }; int main() { Counter counter(N); /* counter[i] = 0 */ クラスCounterは内部に配列を持っていて0で初期化されているとします counter[i]の値をインクリメントしたとき自動的に totalもインクリメントされるようにしたいのですが Counter::inc(index) { data[index]++;total++; } ではなく Counter::operator ++ (int)で実現する方法はないでしょうか class val
- 645 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 02:01:13 ]
- 途中送信してしまいました・・・
class value { static int total; int val; /* 略 */ int operator ++(); }; というクラスを作れば実現できますが これだとCounter c1,c2;としたときtotalが共有されてしまいます
- 646 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 02:02:48 ]
- 最終的に
counter[i]++; としたとき counter.totalも++されるようにしたいのです なにかいい方法があればご教授ください
- 647 名前:デフォルトの名無しさん [2007/08/01(水) 03:22:28 ]
- テンプレートクラスをtypedefする方法ってありますか?
- 648 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 05:12:34 ]
- >>644-646
ちょっとサンプル作ってみたよ、参考にしてみてくだしあ>< ttp://2ch-library.com/uploader/src/2ch7515.cpp.html 方針としてはDataの配列(サンプルではvectorだけど^^;) を持つCounterから直接インクリメント演算子を呼び出すんでなくて、 間に別のクラスをかませるってやり方 サンプルではそのクラスが合計インクリメント数も保持しちゃうんだけど、 チョッと弄ればCounterクラスが合計を保持するようにも出来る この場合はfriend指定使ってるけどboost::functionみたいなデリゲート使えば 必要な関数だけ渡してfriend指定なしにもできる >>647 ちょっとエスパー回答だけど、例えば foo< bar< hoge< hage<piyo> > > > …(*) ってのをtypedefみたいにショートカットするなら template <type T> struct foo2 { typedef typename foo< bar< hoge< hage<T> > > > type; }; とでもして、foo2<piyo>::typeってすれば(*)と同じような意味になりtypedefみたいな使い方ができる こういうのをメタ関数と呼ぶらしい
- 649 名前:646 mailto:sage [2007/08/01(水) 11:39:12 ]
- >>648
非常に参考になりました Binderを内部クラスにする方向で進めてみます どうもありがとうございました
- 650 名前:デフォルトの名無しさん [2007/08/01(水) 11:39:21 ]
- すいません。質問です。
DXライブラリ(DirectXライブラリ)とVC++を使ってゲーム製作の学習中です。 スクリプトエンジンを作るため、テキストファイルを開いてstring型の配列に格納してファイルをクローズする、 という処理が上手く行きません。 ファイルを行と行ごとの内容でアクセス出来るようにしたいので、string型の二次元配列で最初は書いていたのですが、 上手く行きませんでした。 一昨日にvectorの存在を知って、早速試しているのですが、やはり上手く行きません。 vector<string> Scenario; Scenario.resize(500); char* ScenarioFile = "Log.txt"; char Buf[256]; int FileHandle = FileRead_open( ScenarioFile ); int i=0; while(FileRead_eof(FileHandle) == 0){ FileRead_gets(Buf,256,FileHandle); Scenario.push_back(Buf); } FileRead_close(FileHandle); このように記述しているのですが、Scenario[0]から全て ・ としか表示されず、 どうやら漢字コードの半分だけを表示しているようだと予測しました。 完全に失敗です。 whileの中にブレークポイントいれてみると、Bufの内容はちゃんと1行まるまる入っています。 格納が上手くいっていないようです。 どうすればテキストファイル丸々をstring型配列に落とすことが出来るのでしょうか? どんどん足していって、改行コード毎に1行と判別させるメソッドを組むしかないのでしょうか? アホですいません。宜しくお願いします。
- 651 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 11:43:54 ]
- ファイルのエンコードの問題かな?
プログラムとファイルの双方のエンコードを確認してみては?
- 652 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 11:59:53 ]
- >>650
>Scenario.resize(500); もしかして: Scenario.reserve(500);
- 653 名前:650 [2007/08/01(水) 12:12:39 ]
- すいません、誤解を招きそうな書き方をしてしまいました。
『Buf自体にはちゃんと1行入っていて、Scenario.puch_back(Buf)が出来ていないようです』という意味でした。 本当にすいません。 >>651さん 念のため、他のメソッドで使っているイベントデータを読み込んでみましたがダメでした。 ちなみに、そのメソッドはchar型で格納して1行ずつ表示したり、それをstrtok()に掛けるなど の処理を行っています。こちらは動いています。 >>652さん リザーブしてもダメでした…… おそらく、文法がちゃんと理解出来ていないせいだろうと思いますが、 例によって何が間違っているのか分からないという状態に陥っています(´・ω・`) vector<string> a; a.reserve(500);と string a[500];は、ひょっとすると配列としてはほぼ同じですか?
- 654 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 12:20:59 ]
- 次の3つが、後にa[0]からa[499]までの要素が使えるという点で似たようなもの。
1. std::vector<std::string> a; a.resize(500); 2. std::vector<std::string> a(500); 3. std::string a[500]; push_backは現在の最終要素の後ろに追加するメンバ関数。 a.size()が500のときにpush_back(Buf)したら、 そのBufの内容はa[500]で参照することになる。
- 655 名前:650 [2007/08/01(水) 12:52:30 ]
- >>654さん
push_backの意味、理解出来ました!ありがとうございます。 ひょっとして、std::string Text[512];として、 Text[0]に1行目、Text[1]に二行目、という風に合計512行を 格納出来るんじゃないかという考え方は、そもそも間違っていますか? char型のa[10]とstring型のa[10]は、どちらも10バイト分の要素を持つ配列、 という意味になってしまうのでしょうか? てっきり、string型は1行を動的に格納出来る優れものだと思ってました…… 行単位で保持しようという考え方が、そもそも無茶なのでしょうか。 ここまできて、ようやく、『ひょっとするとファイルオープンしたままのほうが 面倒が少なくていいんでね?』とか思い始めてきました……(´・ω・`) ちなみに、リザーブせずにpush_backで継ぎ足していったら、要素を出力した瞬間に 『ハンドルされてない例外エラー』で停止しました……切ないです(´・ω・`)
- 656 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 13:03:43 ]
- >>655
stringは一行(というか可変長な文字列ひとつ)を扱うクラス。 stringの配列で、行ごとに扱うというのは別に間違ってないよ。 あと、reserveは使うとpush_backが早くなるかもしれないけど、 使わなくてもいいという代物。 reserveしないとエラーが出るというのは、別のとこに原因があるはず
- 657 名前:650 [2007/08/01(水) 13:19:33 ]
- >>656さん
ありがとうございます。 原因は、Scenario[0]を出力しようとしているところにありました。 そして、string型の要素が入ってるくせに、.c_str()が使えないようです。 諦めて、string Scenario[500]; にしてコードを適切に変えたら、 やりたかったこと(1行単位で格納)そのものは出来ました。 やはり、stringの考え方そのものは正しかったようです。 それはそれで嬉しいのですが、今度はvectorの使い方を理解出来ていないと いうことが発覚して、非常に悔しいです。 改めて、また全く別の質問をさせてください。 vector<string> a(10); と宣言しても、a. でリストに出てくるメソッドはvectorのもので、stringの .c_str()等が 使えないのはどうしてでしょうか? また、a[0].にいたっては、リストすら表示されません。 a[0]にはstring型のデータが格納されていると考えるのは間違っていますか? これが、string b[10];なら、b[0].c_str();が使えることは確認済みです。 てっきり、同じように扱える物だと思っていましたが、どうやら違うようです。 宜しくお願いします(涙)
- 658 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 13:38:24 ]
- いや、そんな感じだぞ。
vector<string> a(10);とすると、aは10個要素を持った状態になる。 a[0].でstringのメンバが出てこないのは、単にエディタが阿呆なだけだから諦めろ。
- 659 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 13:39:13 ]
- VC2005だとちゃんと表示されるぜ
- 660 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 14:06:47 ]
- VC2003だと所々怪しい。
ポインタと配列が組み合わさるとインテリセンスが働かないことがある。 VC6を使ってたときはもっとひどかった。
- 661 名前:650 [2007/08/01(水) 14:32:24 ]
- 皆さん、本当にありがとうございます。
泥沼に入り込んだような絶望的状況の中、優しさに泣けてきます。 コーディング専用に使ってる古いノーパソの方はVC++2002でしたので、 メインPCに入っているVC++2005ExpressEditionのほうにソースコード移して、プロジェクト作り直してみました。 (2002と2005で互換性無いみたいで、余計なトラブル防ぐためです) すると……出ます! vector<string> a; a.resize(500); で、 a[0]にちゃんとstringのメソッドが出ます! やったぜ! 喜び勇んでデバッグビルド。 ……LNK4217やらLNK2019やらLNK1120やら出まくりやがります……(´;ω;`) どうやら、vectorを使うと出るっぽ……(コメントアウトすると出ない とりあえずエラーコードを全部ググってみたのですが、正直、専門用語連打で今ひとつ原因が理解できていません。 もうちょっと格闘してみます。
- 662 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 14:35:53 ]
- #include <vector.h> とかやってるってオチはないだろうね
- 663 名前:650 [2007/08/01(水) 14:52:27 ]
- >>662さん
ちゃんと #include "string" #include "vector" にしてます。 昼飯抜きでやってたので、いまちょっとラーメン食ってます。 今日は有給取ってまとまった時間があるんで頑張ります(^^)
- 664 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 15:00:07 ]
- ランタイムライブラリの設定がおかしくなっているような気がする。
- 665 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 15:44:18 ]
- C++のソースを他の言語に移植しているのですが、ちょっとこまったことがありました。
class Hoge { Hoge(); virtual ~Hoge(); } といった、クラスがある場合、 ソース中、 Hoge hoge; として、動的生成ではなく、静的に宣言?した場合、 デストラクタ(~Hoge);は、スコープから外れると自動で呼ばれるものなのでしょうか? 自動で、呼ばれない言語に移植しているいじっているもので(Delphi)
- 666 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 15:45:22 ]
- >>665
試してみればわかると思うけど、YES
- 667 名前:665 [2007/08/01(水) 15:45:28 ]
- 途中で、送信してしまいました。
自動で、静的な構造体の場合、デストラクタが呼ばれない言語に移植しているもので(Delphi)、 その場合は、手動でデストラクタを呼び出す必要があるということになりますよね。
- 668 名前:650 [2007/08/01(水) 15:46:10 ]
- いろいろ確認しましたが、やはり、vectorを使用するとリンカエラーが出るようです。
vector<int> i; と宣言して未使用のままでも、エラーが出ます。 stringは問題なく使えます。 他のSTLについては、そもそも使い方をまだ学習していないのでインクルードすらしてません。 ノートの方でエラー出ないってのが不思議です…… どなたか、原因が分かる方いらっしゃいますか? >>664 設定を戻したいのですが、どのようにしたら元に戻せるんでしょうか? 再配布用のVC++2005 SP1ランタイムは見付けましたが、多分、再配布用じゃないですよね(´・ω・`)
- 669 名前:665 [2007/08/01(水) 15:49:27 ]
- >>666
サンクスです。 こちらにも書いてありました。 C++編(言語解説) 第7章 コンストラクタとデストラクタ www.geocities.jp/ky_webid/cpp/language/007.html newしない場合は、スコープ外れるときに自動で呼ばれるのですね。 newした場合は、deleteするときに呼ばれる、と・・・。
- 670 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 15:54:29 ]
- >>668
プロジェクトの設定でC/C++→コード生成で ランタイムライブラリの設定をDLLからスタティックリンクライブラリにしてみたらどう?
- 671 名前:650/668 [2007/08/01(水) 16:10:06 ]
- >>670さん
ありがとうございます。 プロパティ→C/C++→コード生成→ランタイムライブラリ を見てみたところ、 マルチスレッド マルチスレッド デバッグ マルチスレッド DLL マルチスレッド デバッグ DLL の4つ選択肢があって、デフォルトではマルチスレッドデバッグDLL(Debugモードです。リリースだとマルチスレッドDLLになります)に なっていましたので、スタティックリンクライブラリの意味が正直よく分かっていないのですが、 『マルチスレッドデバッグ』にしてみました。 やはりリンカエラーでます。 「LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。」 これだけ、新しい(?)エラーが出た……のかな??? 他はLNK2019,LNK2001,LNK1120(fatal)です。 ざーーーーーっとMSDNやぐぐってヒットした質問掲示板を片っ端から見て行ってるのですが、自分と該当するものは 今のところ見付かっていません。 #include "vector" vector<int> i; の二行だけでエラー出るってやっぱおかしいですよね?
- 672 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 16:11:49 ]
- ライブラリ見てる先が違うのでは?
- 673 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 16:23:59 ]
- ライブラリの設定をマルチスレッドデバッグDLLに戻して
#include <vector> でも駄目かね?
- 674 名前:デフォルトの名無しさん [2007/08/01(水) 16:26:36 ]
- いやまずは、
char str[100][300]; string str [100]; で読む込むかやって見ろよ
- 675 名前:デフォルトの名無しさん [2007/08/01(水) 16:28:33 ]
- char* ScenarioFile = "Log.txt";
char buf[500][256]; int FileHandle = FileRead_open( ScenarioFile ); int i=0; while(FileRead_eof(FileHandle) == 0){ FileRead_gets(Buf[i], 256, FileHandle); i++; } FileRead_close(FileHandle);
- 676 名前:650/668 [2007/08/01(水) 16:30:57 ]
- >>672
それだと、stringもダメになりませんかね? stringは普通に使えてます。 >>673 戻してみて、#include <vector>にしましたがダメでした。 時間掛かるけど、再インストールしてみたほうがいいっすかね?
- 677 名前:デフォルトの名無しさん [2007/08/01(水) 16:32:07 ]
- つか、なぜC/C++ライブラリや、windowsAPIを使わないのか教えろ
|

|