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


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

スレを勃てるまでもないC/C++の質問はここで 2



1 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 11:02:46 ]
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

スレを勃てるまでもないC/C++の質問はここで
pc11.2ch.net/test/read.cgi/tech/1167476845/


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を使わないのか教えろ

678 名前:デフォルトの名無しさん [2007/08/01(水) 16:37:36 ]
普通のやり方だと動くのか???

#include <fstream>
using namespace std;

fstream fp;
string str;
fp.open("Log.txt", ios::in );

do{
getline(fp, str);
cout<< str<<endl;
}while(!fp.eof());



679 名前:650/668 [2007/08/01(水) 16:38:12 ]
>>674さん
>>675さん
ありがとうございます。
vectorを使わないで何とかする方法は皆さんのおかげで無事なんとかなりましたm(_ _)m
今は、VC++2005でvectorそのものが使えないという状態で困っております……

>>677
すいません。WinAPIはまだ学習していませんので、使い方が分かりません。
やっとポインターと参照送りを覚えて、STLの存在を知って2週間ばかりのど素人です……
C/C++ライブラリとは、STLのことですよね?
今はSTLのstringを覚えて、vectorに差し掛かったばかりです。


680 名前:650/668 [2007/08/01(水) 16:41:14 ]
すいません、先ほど>>677にさん付けるの忘れてました。他意はありませんm(_ _)m

>>678
普通のやり方でももちろん動きます。特にDXライブラリが悪さしているとは思えません。
ぜんぜん関係ない、ごく普通のC++の部分でエラー吐いてますので……

vectorさえ使わなければ、エラーも出ず普通に動きます。
さし当たって今やろうとしていることには必要のないものですが、C++の学習が主な目的でもありますので、
使ったらエラーという状態だけは何とかしておきたいなと思っています……


681 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 16:43:02 ]
2003もアンインスコして再インスコだな
標準でさえこのざまなんだからこの先どんな不具合が起こるかわからないって状況は普通に怖いぞ

682 名前:デフォルトの名無しさん [2007/08/01(水) 16:46:06 ]
↓のプログラムをDOSで実行すると、何故か画面がフリーズして
「問題が発生したため、終了します」という画面が出て実行できないのですが
何故なんでしょうか?文法上の誤りも自分で見る限りは特に無いと思うのですが・・・
混じれ酢お願いします。
改行が多すぎて一度に書き込めない様なので分割して書き込ませて頂きます

#include<stdio.h>
#include<string.h>




683 名前:デフォルトの名無しさん [2007/08/01(水) 16:47:05 ]
main(int argc, char* argv[])
{


char filename[256];
char key[128];
if(argc>2){strcpy(filename,argv[1]);
strcpy(key,argv[2]);}
else if(argc){
strcpy(filename,argv[1]);
printf("暗号キーを入力してください>");
scanf("%s",key);

} else {
printf("ファイル名を入力してください>");
scanf("%s",filename);
printf("暗号キーを入力してください>");
scanf("%s",key);

}

printf("ファイル名:%s\n",filename);
printf("暗号キー:%s\n",key);

return 0;}


684 名前:デフォルトの名無しさん [2007/08/01(水) 16:47:23 ]
vectorは殆ど使い道ないよ
初めから必要な領域を動的確保すればよい

685 名前:デフォルトの名無しさん [2007/08/01(水) 16:49:38 ]
>>682
実行するときに引数入れろよ

686 名前:デフォルトの名無しさん [2007/08/01(水) 16:52:43 ]
>>683
コマンドライン引数ないとargv[1]参照してエラー起きる

argcは少なくとも1だよ
argv[0]にはプログラム名が入ってるから

687 名前:デフォルトの名無しさん [2007/08/01(水) 16:52:45 ]
else if(argc>=2){ にしとけ

688 名前:デフォルトの名無しさん [2007/08/01(水) 16:53:07 ]
>>685
実行するときに引数を入れても同じ画面が出てエラーになります・・・



689 名前:デフォルトの名無しさん [2007/08/01(水) 16:53:43 ]
途中だったw

if文書きかえて

if(argc > 2) うんたら
else if(argc == 2)うんたら
else うんたら
にしる


690 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 16:54:24 ]
>>684
それだと解放する手間がかかるでしょ。
例外に強くするためにもvectorに解放を任せるのは有用。

もしかして釣られた?

691 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 16:59:46 ]
>>689
ありがとうございます!!やってみたらできました
こんなくだらないミスで質問をしてすみません・・・
皆さんありがとうございました

692 名前:デフォルトの名無しさん [2007/08/01(水) 17:00:47 ]
一つ一つ内容を増やしていって確保する領域が不明であるケースなんて
ほとんどないよ
それに、個数が多ければ一度に確保しておいた方が速いし、
個数が少なければ多めに確保しておけばエラーは出ない

多くても少なくてもvectorは使えない

693 名前:650/668 [2007/08/01(水) 17:01:09 ]
>>684さん
なんとなく『最初から上手く設計すればいらないような……?』とは思っていたのですが……_| ̄|○
はっきり言って下さってありがとうございます。
踏ん切りが付きましたので、ひとまずvectorの学習は中断することにします。


あ、でもVC2005の再インストールだけは念のためしておこうと思います(^^;

皆さん、本当にありがとうございました!


694 名前:デフォルトの名無しさん [2007/08/01(水) 17:02:41 ]
例えば、100万個データ追加するのに
毎回vectorのメンバ関数で追加するより
a[i]=5とやった方が速いし見やすい

695 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 17:06:06 ]
               .|   |  | |   |    |  | |   |   |   || | |
               .|   |  | レ  |    |  | |   |  J   || | |
    ∩___∩    |   |  |     J    |  | |  し     || | |
    | ノ\   ,_ ヽ  .|   レ |      |  レ|       || J |
   /  ●゛  ● |   .J      し         |     |       ||   J
   | ∪  ( _●_) ミ             .|    し         J|
  彡、   |∪|   |              .J                レ
 /     ∩ノ ⊃  ヽ
 (  \ / _ノ |  |
  \  "  /  | |
   \ / ̄ ̄ ̄ /
      ̄ ̄ ̄ ̄

696 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 17:08:56 ]
>>692
reserve

>>694
resize

697 名前:デフォルトの名無しさん [2007/08/01(水) 17:10:55 ]
vectorの方が楽
それだけで使用価値があるとは思わないか


698 名前:デフォルトの名無しさん [2007/08/01(水) 17:13:17 ]
vectorの方が不便
だって[]での代入が装備されていない



699 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 17:13:43 ]
>>698
はい?kwsk

700 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 17:16:27 ]
template <typename T>とtempalte <class T>ってどう使い分けすれば良いんでしょうか?

701 名前:>>699 [2007/08/01(水) 17:18:39 ]
#include <vector>
#include <iostream>
using namespace std;

main(){
vector<int> v;

v.push_back(1); cout << v[0]<<endl;
v[0]=2; cout << v[0]<<endl;

/* 逆にしたこっちはエラーになる

v[0]=2; cout << v[0]<<endl;
v.push_back(1); cout << v[0]<<endl;


*/

}

702 名前:デフォルトの名無しさん [2007/08/01(水) 17:20:46 ]
reserve();で確保すればエラー出ないんだな
しらんかった すまん

703 名前:デフォルトの名無しさん [2007/08/01(水) 17:21:27 ]
>>701
そんな使い方ありえないから実装されてない
使いたければオーバライドすればいいじゃん


704 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 17:26:07 ]
>>700
好みの問題。
ただし、下みたいなテンプレートテンプレートではclassしか使えなかったはず。
template<template<typename T> class T>
こんな機能使わないけど。

705 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 17:28:39 ]
>>702
reserveで押さえただけ領域は使ってはいけないところ。
vectorで使える要素は0番目からsize()の1つ手前の要素まで。
size()の値を変えるにはresize()。

特に要素がクラスオブジェクトだとコンストラクタが呼ばれていなかったり、
デストラクタが呼ばれた後だったりするのでわかりやすいけど、
組込型でも駄目なことに変わりはない。


706 名前:デフォルトの名無しさん [2007/08/01(水) 17:29:21 ]
vectorかnewかどっちがいいかは、巨大配列を確保したときに問われるだろう
何となくvectorは100M超の領域確保に向いていない気がするが・・・
速度、安定性において同程度ならvectorに統一した方がいい




707 名前:デフォルトの名無しさん [2007/08/01(水) 17:30:12 ]
>>701
それを不便というなら、比較対照にしてる組み込み型では
int *v = new int[0]
と宣言してるも同然じゃね?

708 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 17:31:28 ]
>>706
それは仰るとおり
ほとんどの場合はvectorでも問題ないから
おれはvector使う




709 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 17:31:46 ]
>>704
なるほど
複雑な特殊化をする時に必要となりそうな気がするのでメモっておきます

710 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 17:37:55 ]
>>706
new[]はoperator new[]関数、newはoperator new関数、
vectorは、operator new関数で確保される。
共に<new>に存在し、operator newとoperator new[]で
異なる実装になっていることは考えづらい。殆どの処理系で、同一の実装だと見なして問題ないはず。
そして、operator newやoperator new[]を自分で定義すれば、メモリ確保ルーチンを差し替えられる。

またvector(やその他全てのコンテナ)はアロケータをテンプレート引数に取り、
それを差し替えることでもメモリ確保ルーチンを変更可能。

不用意にinsertやpush_backしなければ、巨大な配列もvectorにして問題ないと思う。
それでも不安ならshared_array/scoped_arrayなんて選択肢もあるけどね。






[ 続きを読む ] / [ 携帯版 ]

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

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