[表示 : 全て 最新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/


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なんて選択肢もあるけどね。

711 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 18:01:21 ]
>>710
>不用意にinsertやpush_backしなければ、巨大な配列もvectorにして問題ないと思う。
是。reserve しとけば push_back も怖くない。

712 名前:デフォルトの名無しさん [2007/08/01(水) 18:11:39 ]
>>710
オーバーヘッドが掛かったり無駄に確保したりしていないかvector
new単体で使えば2倍の領域確保とかないだろうし

713 名前:デフォルトの名無しさん [2007/08/01(水) 18:33:08 ]


      |
      |
      |
      |              /  ̄   ̄ \
     (=)           /、          ヽ
     J >vector厨     |・ |―-、       |
                   q -´ 二 ヽ      |
                 ノ_ ー  |     |
                 \. ̄`  |      /
                   O===== |
                  /          |
                   /    /      |

714 名前:650/668 [2007/08/01(水) 18:35:00 ]
戻りました。
VC++2005を修復インストールした結果、vector使ってもwarning LNK4217だけで済みました。
fatalなエラーでビルド失敗と言うことはないです。
やっぱ、何かが潰れていたっぽいっすね〜。
これでダメなら再インストールしようと思っていましたが、無事に済んだようです。

LNK4217エラーは4つ出て、どれも内容は似ています。
warning LNK4217: ローカルで定義されたシンボル ??1exception@std@@UAE@XZ (public: virtual __thiscall std::exception::~exception(void)) が
フィクション __unwindfunclet$??0logic_error@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z$0 にインポートされました。

僕の今の知識レベルでは、なんのことやら意味不明です。
実用上問題ないなら、#pragma warningで切っておきます。
ありがとうございました。

あれからのログを見ていると、vectorもやっぱり押さえておきたい基本技術みたいですね。
折を見て勉強再開します。


715 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 18:51:31 ]
念の為OSの再インストールからやり直したほうがいいよ

716 名前:デフォルトの名無しさん [2007/08/02(木) 21:26:13 ]
typedef std::vector<Hoge> VEC_HOGE;

を定義したいときにHoge は前方宣言で対応可能でしょうか?
それとも#include しなければいけませんか?

前方宣言の可付加の決まり方がいまいちわかりません。
よろしくお願い致します。

717 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:49:38 ]
typedef std::vector<ちぺなめ Hoge> VEC_HOGE;

718 名前:デフォルトの名無しさん [2007/08/03(金) 00:11:16 ]
すみません、質問させてください。
Cのプログラムで、popenを使ってpingを打ちたいと思っています。
その時に、p=popen("ping www.google.co.jp", "w")のように
直接相手先を書くのではなく、文字配列に相手先を格納し、
それを用いてpingを打つ方法がわかりません・・。
一応ぐーぐる先生にお尋ねはしたのですが、わかりませんでしたorz
(聞き方がまずかったのかも知れませんが・・)
どうぞよろしくお願い致します。

719 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:31:34 ]
sprintf使えばいいんじゃないの?



720 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:39:38 ]
入門書読んだ方がいいんじゃないの。
ping先壊したって知らないよ?

721 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:54:31 ]
system()じゃいかんのかね。

722 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:02:11 ]
>>716 って何か意味あんの?

723 名前:718 [2007/08/03(金) 21:14:19 ]
遅くなってしまいましたが、アドバイスありがとうございました。
正直自分でも、入門書レベルからやり直した方がいいなぁと
自覚はしているのですが、今回は時間に余裕がなかったもので、
ここでお尋ねした次第です・・すみません。ご忠告ありがとうございます。
system()ではどうかとのことですが、プログラムの中でpingの結果を
受け取って処理をしたかったので、今回はsystem()ではなくpopen()を使いました。
記載し忘れてしましたね。ごめんなさい。
sprintfですか。ちょっと試してみたいと思います。
皆様どうもありがとうございましたm(_ _)m

724 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 20:36:45 ]
行列で
-1 0 1
-1 0 1
-1 0 1 は以下のプログラムでできるんですけど(wはdouble、l,kはint)
for(k=0;k<3;k++)
{
for(l=0;l<3;l++)
{
w[k][l] = -1 + k;
}
}

-1 1 -1
-1 1 -1
-1 1 -1
はどんな感じでつくればいいですかね?増分2してみたいな・・・
上のプログラムを極力いじらない感じでお願いします

725 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 20:40:50 ]
行列で
-1 0 1
-1 0 1
-1 0 1 は以下のプログラムでできるんですけど(wはdouble、l,kはint)
for(k=0;k<3;k++)
{
for(l=0;l<3;l++)
{
w[k][l] = -1 + k;
}
}

-1 1 -1
-1 1 -1
-1 1 -1
はどんな感じでつくればいいですかね?増分2してみたいな・・・
上のプログラムを極力いじらない感じでお願いします

726 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 20:43:15 ]
すいません 2回も書いてしまいましたorz

727 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 21:12:58 ]
-1×-1=1
これ算数。

728 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 21:16:16 ]
-1 + k

(k % 2) * 2 - 1

729 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 05:27:34 ]
int v;
for(k=0;k<3;k++)
{
v=-1;
for(l=0;l<3;l++)
{
w[k][l] = v;
v*=-1;
}
}
でいいじゃん



730 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 06:31:29 ]
>>727>>729
本気でそんなプログラミングしているのか?
桑原桑原。

731 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 06:39:44 ]
>>730
桑原桑原。

732 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 07:07:12 ]
w[k][i] = i&1 ? -1 : 1;
を提案します(ぉ

733 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 07:07:59 ]
lだった…orz

734 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:40:58 ]
>>729
int v = 1;
for(k=0;k<3;k++)
{
for(l=0;l<3;l++)
{
w[k][l] = v * -1;
}
}

のほうがすっきり。

735 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:55:06 ]
>>734
9つ全部-1にならない?

736 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 11:18:23 ]
ここのつ、とう!
はい、よくできました♪

737 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 11:20:12 ]
??

738 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 11:49:07 ]
!!

739 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 11:50:44 ]
3×3の行列の初期化くらいなら、
いちいちfor文で回したりせず、
double w[3][3] = { {-1.0, 0.0, 1.0}, {-1.0, 0.0, 1.0}, {-1.0, 0.0, 1.0} }
これでいいじゃないか。




740 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 11:58:06 ]
例として3×3にしてるだけで、
実際はもっと大きいんじゃないのかな?

741 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 12:26:55 ]
えー

for(k=0;k<3;k++)
のように、ハードコーディングしてるじゃん。

もし巨大だったり、任意のサイズだったら、そういうコードになるべ?






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

前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