【初心者歓迎】C/C++室 Ver.48【環境依存OK】 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
08/02/05 01:18:41
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.47【環境依存OK】
スレリンク(tech板)
【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)


2:デフォルトの名無しさん
08/02/05 01:31:04
2get

3:デフォルトの名無しさん
08/02/05 01:51:09
C はもういいだろ

4:デフォルトの名無しさん
08/02/05 03:58:45
int *p;
p=new int[3];
deleteせずに
p=new int[4];
deleteせずに
p=new int[2];
とした場合どうなりますか?

5:デフォルトの名無しさん
08/02/05 04:39:44
>>4
p は最後の new int[2] で確保された配列の先頭を指す。
前2つの new で確保された配列を破棄する手段はなくなっている。

6:デフォルトの名無しさん
08/02/05 06:52:35
>>5
ありがとうございます。領域の再利用も破棄もされないまま新たに確保されちゃうんですね
新たにnewするまえにdeleteを必ずつけるようにします

7:デフォルトの名無しさん
08/02/05 07:05:31
>>6
入門書買えやカス!

8:デフォルトの名無しさん
08/02/05 07:18:25
>>7
うっせーカス!

9:デフォルトの名無しさん
08/02/05 07:20:47
>>8
そうだよな! ネットの入門サイトにも載ってるよな!

10:デフォルトの名無しさん
08/02/05 09:58:32
vector<string> v;
として、vを
{"AAAAAA","BBBBBB","CCCCCC","DDDDDD","EEEEEE"};
という内容で初期化したいときは、push_back()とかで1つずつ代入するしかないですか?


11:デフォルトの名無しさん
08/02/05 10:51:55
>>10
イテレータを受け取るコンストラクタを使うといい。
コンストラクタと同じ引数で assign() というメンバ関数もあるから覚えとこう。

12:デフォルトの名無しさん
08/02/05 11:36:57
>11
ありがとうございます。
でもやり方がわかりませんでした。もう少し教えてください。

std::string a[] = {"AAAAA", "BBBBB", "CCCCC", "DDDDD"};
std::vector<std::string> v(a);
これだと、コンパイルエラーになってしまいました。
invalid conversion from 'std::string*' to 'unsigned int'
どう書けばよいですか?


13:デフォルトの名無しさん
08/02/05 12:13:11
>>12
イテレータを受け取るコンストラクタを使えってばよ。

14:デフォルトの名無しさん
08/02/05 12:20:42
>>13
イテレータを渡したいけど、どこにあるのかわかりません

15:デフォルトの名無しさん
08/02/05 12:28:14
>>14
配列要素へのポインタはイテレータとして使える。

16:デフォルトの名無しさん
08/02/05 12:34:21
>>15
ありがとうございます。
std::string a[] = {"AAAAA", "BBBBB", "CCCCC", "DDDDD"};
std::vector<std::string> v(&a[0], &a[3]);
で、できました!


17:デフォルトの名無しさん
08/02/05 12:57:07
それだと"DDDDD"は収容されないけどな。

18:売国まるはん
08/02/05 13:11:26
パチンコスレで遠隔、ホルコン、サクラ、マネーロンダリングなどについて書き込むと渋谷マルハン社員やマルハンに依頼された
ネット工作会社がスレ荒らしをしてスレが機能停止します。
↓↓工作員の荒らしのやり方↓↓
2008/01/10(木)ID:iA54nBU50
■■■■マルハン総合スレッド 9■■■■スレリンク(pachij板:783-784番)
【宮崎県都城市】パチ事情そのAスレリンク(pachij板:658-659番)
【山と川】宮崎県児湯付近PART1【自然イパーイ】スレリンク(pachij板:471-472番)
【基地外が大暴れ4】エスパス日拓総合スレ【18発目】スレリンク(pachij板:401-410番)
2008/01/13(日)ID:1HLcWzUK0
【基地外が大暴れ4】エスパス日拓総合スレ【18発目】スレリンク(pachij板:461-462番)
■■■■マルハン総合スレッド 9■■■■スレリンク(pachij板:809-810番)
【香川】パーラーグランドのスレ2【徳島】スレリンク(pachij板:324番)
【延岡】宮崎県北情報PART3【日向】スレリンク(pachij板:186番)

工作員に荒らされ機能停止したスレ
■■■■マルハン総合スレッド 9■■■■スレリンク(pachij板)
【山崎】MPT渋谷パート9【シャネル】スレリンク(pachij板)
【基地外が大暴れ4】エスパス日拓総合スレ【18発目】スレリンク(pachij板)
MPT渋谷はマルハン・パチンコ・タワー渋谷の略です。

パチンコ産業は荒らすことでレスとレスの間を空けて読む気をなくさせたり
マネーロンダリング、さくら、ホルコン、遠隔、などの風評被害を最小限に抑えようとしてる。

新スレ→○○○マルハンパチンコタワー渋谷パート10○○○
★★★★★このスレの解説★★★★★を読んでみるとよく判る。
スレリンク(pachij板:52-54番)



19:デフォルトの名無しさん
08/02/05 13:29:53
assign()のソースを出し渋ってる奴から使えと言われてもねー

20:デフォルトの名無しさん
08/02/05 15:11:24
はじめまして。今までCの学習用開発環境としてvmware上のFreeBSDでemacsを使ってきた者です。
何かと不便なのでwindows上で開発環境を整えようと思うのですが、何かお勧めのソフトはありますでしょうか?


21:デフォルトの名無しさん
08/02/05 15:15:20
>>20
cygwin

22:デフォルトの名無しさん
08/02/05 15:24:55
>>20
Eclipse + CDT

23:デフォルトの名無しさん
08/02/05 15:47:35
このような構造体があるとして
struct KOUZOUTAI{
 std::vector<int> Array;
 int nNum;
 std::string str;
};

KOUZOUTAI g_Kouzoutai;

std::ofstream fout;
fout.write( (char*)(&g_Kouzoutai), sizeof( g_Kouzoutai ) );

こんな風に構造体を書き込んでおきます。

このデータを次に読み込みたい場合、
KOUZOUTAI data;
fin.read( (char*)(&data), sizeof( data ) );

こうやって読み込むと配列の部分が正常に読み込めません。
何かいい方法はありますか?

24:デフォルトの名無しさん
08/02/05 15:53:06
>>23
ありません。つーか、そもそもそれではvectorは書き込まれていない筈です。ご愁傷様。

25:デフォルトの名無しさん
08/02/05 15:56:15
std::vectorの中身をserialize/unserializeする関数を作成して、保存/読み込み時にその関数を経由させる。

26:デフォルトの名無しさん
08/02/05 15:58:56
動的配列はメモリが無条件に動的になるわけじゃなく、
動的配列を実現できるようなメンバ関数でアクセスするから動的配列たりうるわけで。
エレベーターのボタンを押さずに扉こじ開けてもエレベーターには乗れないでしょ?

27:デフォルトの名無しさん
08/02/05 16:01:53
その例えもどうかと思う。

28:デフォルトの名無しさん
08/02/05 17:20:39
ただの配列なら書き込めますか?

29:デフォルトの名無しさん
08/02/05 17:21:42
はい。

30:デフォルトの名無しさん
08/02/05 17:26:50
わかりました
ありがとうございました

31:デフォルトの名無しさん
08/02/05 19:03:05
下記のコードはBCB6で通りません。

template<typename FunctionPtr>
struct FunctionTraits;

template<typename ResultType,class ClassT>
struct FunctionTraits<ResultType (ClassT::*)(void)>
{
typedef ClassT ClassType;
};

テンプレートの関数ポインタによる特殊化でメソッドのクラスを推測することは不可能なんでしょうか。

32:デフォルトの名無しさん
08/02/05 19:35:31
VCでは通ったが。

33:デフォルトの名無しさん
08/02/05 19:46:16
>>31
部分特殊化は VC6 あたりでも対応してなかったと思う。
コンパイラが対応してないのはありうると思う。

34:デフォルトの名無しさん
08/02/05 20:08:26
とりあえずBCB2007で通るか検証してみては

35:デフォルトの名無しさん
08/02/05 21:20:13
最近Cを勉強し始めたのですが、とりあえずチンチロリンでも
作ってみろというようなことをいわれました。

早速やってみようと思ったのですが、何から手をつけていいのか
さっぱりです。何か良い書籍などあるでしょうか?
チンチロリンのサンプルプログラムを見てみるのも勉強になると
いわれたので、検索してみたのですがサンプルが無く困っています。

どうかよろしくお願いします。

36:デフォルトの名無しさん
08/02/05 21:47:25
本屋に行って何冊か立ち読みしてみるか、ぐぐればいいと思うよ

37:デフォルトの名無しさん
08/02/05 21:58:18
>チンチロリンのサンプルプログラムを見てみるのも勉強になると
>いわれたので
簡単にそんなものが見つかるのが前提のアドバイスにワロタw
でも、そういう簡単なゲームを作るのはいい練習になると思うよ。

とりあえず、今勉強に使ってる本かサイトか知らんが
その知識だけで自分で作ってみるといいよ。
多分いろいろと汚いプログラムになりはするとは思うけど、
そうやって作ってみた後にサンプルなり本なりを読むと、
どこがマズかったのかってのがよく分かっていいと思うぜ。

38:デフォルトの名無しさん
08/02/05 22:03:38
>>36
今は、手元にある入門書とぐぐって何とかやってる状態です。
何冊か立ち読みして、よさそうなのをもう1冊買ってみようかと
思います。ありがとうございます。

>>37
簡単に見つかるものじゃないんですね・・。
なんとか形にしてみてから調べてみることにします。
ありがとうございます。

39:デフォルトの名無しさん
08/02/05 23:41:22
VC9ですけど、
std::exceptionにうにこーど入れると文字が壊れますか?

40:デフォルトの名無しさん
08/02/05 23:43:58
>>39
[std::exception unicode]でググって速効。
URLリンク(jinguru.blog86.fc2.com)

41:デフォルトの名無しさん
08/02/05 23:56:32
やっぱりそうですか。

42:デフォルトの名無しさん
08/02/05 23:59:49
UTF-8なら入れられると思う。そこまでする必要があるかは別として。

43:デフォルトの名無しさん
08/02/06 05:39:37
コンソールアプリケーションで、ユーザにインプットをもらって処理をするコードがあります。
その時、
int a;
cin >> a;
として、入力が数字ではなかったとき、変数aにはなにも代入されず、
ユーザが行った入力はどこかのバッファに溜まってる
のでしょうか。その次の入力から動作がおかしくなります。
あと、もし上記が正しいとすると、ユーザからの入力を受け取る処理は、
とりあえずstringで受けるべきなのでしょうか?


44:デフォルトの名無しさん
08/02/06 10:57:57
>>43
intには数字しか読込めない。今の場合、何も読込まれずに
cinにはfailbitが立つ。cin.clear()か何かでgoodbit立てない
限り次の読み込みは出来ない。stringにすべきかどうかは何を
読み込むかによる。

45:デフォルトの名無しさん
08/02/06 11:34:06
>>44
ありがとうございます。自分でも調べてみたのですが、

int a;
cin >> a;
入力データを使って処理する
cin.clear();
cin.ignore(numeric_limits<int>::max(),'\n');

とするとcinが元の状態に戻りました。
ここで、clear()はgoodbitを立てるものだとして、
ignore()は指定文字数分か指定した文字(上記だと'\n')が出るまで
入力値をバッファから消す、という処理ですよね。

cinの入力ってこう書かないとだめなのでしょうか?
(結構面倒かも、と思った)

46:デフォルトの名無しさん
08/02/06 11:59:49
Win32APIなんですがnewで確保した領域をWM_DESTROY:がきたときにdeleteしたら
コンパイル時はエラーでないけど、実行してnewで確保した後プログラムを終了
(WM_DESTROYが送られる)したらエラーがでるんですが、何故ですか?
WM_CLOSEでならdeleteしてもエラーでないんで問題は無いんですが興味本位で

47:デフォルトの名無しさん
08/02/06 12:16:07
>>45
入力フォーマットの仕様がどうなってるのかわからないから
なんとも言えないな。任意の値が入力されるならgetlineで
一行読込んでstring解析したほうがいいかも。


48:デフォルトの名無しさん
08/02/06 12:21:08
>>46 どうせメモリ破壊や二重解放だろ。

49:デフォルトの名無しさん
08/02/06 14:18:30
doubleをcoutを使って出力するときに、かならず小数点以下2桁までを
出力するようにしたいのですが、どうすればよいですか?
double amount = 3.33333;
cout << amount;
=> 3.33
どうかお願いします。


50:デフォルトの名無しさん
08/02/06 14:27:18
今までソフトのバイナリいじったりして満足してたんですが
これからCを始めようと思ってます。
(とりあえず、Cが基本だからやっとけ!と、どこかで見たので)

その際、アルゴリズムを先に学んだ方がいいですか?
周りに技術者がいないので、ネットで勉強する形になりますが・・。

51:デフォルトの名無しさん
08/02/06 14:35:04
>>50
すみません
書き込む場所間違えました・・。

吊って来るんで許してください

52:デフォルトの名無しさん
08/02/06 14:47:22
49です。
ios::rightとかその他諸々を使って出来たみたいだったのですが、
次回必要になった時に絶対わすれてそうだったので、sprintf()を使ってやりました。
失礼しました。


53:デフォルトの名無しさん
08/02/06 14:48:25
stringは、値渡しですか

54:デフォルトの名無しさん
08/02/06 14:50:57
値渡しでも参照渡しでもポインタ渡しでもお好きな方法をどうぞ

55:デフォルトの名無しさん
08/02/06 14:54:21
コンパイラに任せたときは値渡しですか

56:デフォルトの名無しさん
08/02/06 14:57:04
文字列 は参照ですが、stringもそうなりますか

57:デフォルトの名無しさん
08/02/06 15:06:37
>>49
<iomanip>ヘッダ
setprecisionマニピュレータを使う。

double amount = 3.33333;
streamsize oldprec = cout.precision();
cout << setprecision(3) << amount << setprecision(oldprec) << endl;

58:デフォルトの名無しさん
08/02/06 15:17:12
しかし1の位が0だと小数点以下が3ケタになってしまいます

#include <iostream>
#include <iomanip>

int main() {
   using namespace std;
   double amount=3.33333;
   double aaa=0.3333;
   streamsize oldprec = cout.precision();
   cout << setprecision(3) << amount << ' ' << aaa << setprecision(oldprec) << endl;
}

$ bjam precision-run
3.33 0.333

EXIT STATUS: 0

こういう場合は文字列処理に持っていくしかないですかねぇ?

59:デフォルトの名無しさん
08/02/06 15:34:32
>>55
コンパイラは自動的にプログラムを書いたりはしてくれませんので、コンパイラに任せるなどということはできません
コンパイラは あなた が書いた通りに動きます
>>56
文字列(=文字の配列)への参照っていうと、こういうのでしょうか
void foo(const char(&s)[6]) {
printf("%s\n", s);
}
int main() {
foo("Hello");
}
あんまりやらないと思いますが

60:58
08/02/06 15:40:26
#include <iostream>
#include <sstream>
#include <cassert>

using namespace std;

string foo (double n) {
  ostringstream os;
  string s;
  os << n;
  assert(os.str().size() >= 4);
  s = os.str();
  string::size_type b=0, e=0;
  b = s.find('.');
  e = b+3; --b;
  return s.substr(b, e);
}
int main() {
   double amount=3.33333, aaa=0.3333;
   cout << foo(amount) << ' ' << foo(aaa) << endl;
}
$ bjam
3.33 0.33

よくわからないので適当にsstreamで

61:デフォルトの名無しさん
08/02/06 15:41:03
>>58
cout.setf(ios::fixed, ios::floatfield); をcout前に追加
setprecision(3) → setprecision(2)

62:デフォルトの名無しさん
08/02/06 17:21:15
普通小さくするのがぬ゛うんキャストじゃないの?

63:デフォルトの名無しさん
08/02/06 17:56:43
>>62
ごめん、よくわからない

64:デフォルトの名無しさん
08/02/06 18:59:44
MacOSXとGLUTの組み合わせで◯◯.appというディレクトリを作って
起動させると、はじめカレントディレクトリは
ルートディレクトリになってるんですけど
glutInit()を通過すると、◯◯.app/Contents/Resourcesが
カレントディレクトリになってんですよ
なんでこんな妙なところに行っちゃうんですかね

ちなみに◯◯.appの中身は以下の通りです
◯◯.app/Contents/Info.plist <--謎
◯◯.app/Contents/MacOS/○○.exe <--実際に動くc++コード
◯◯.app/Contents/Resources/icon.icns <--アイコンの絵

65:デフォルトの名無しさん
08/02/06 19:21:04
D3DPRESENT_PARAMETERS d3dpp;
::ZeroMemory(&d3dpp, sizeof(d3dpp));



D3DPRESENT_PARAMETERS d3dpp = {0};

はちがいますか?

66:デフォルトの名無しさん
08/02/06 19:23:40
詰め物

67:デフォルトの名無しさん
08/02/06 19:30:09
>>64
そこがアプリケーションのリソースを置く場所だから、
親切に(あるいは余計なお世話か)移動してくれてるんじゃないかな

68:デフォルトの名無しさん
08/02/06 20:39:50
>>67
なるほど
Glutで何かしているのではなく
◯◯.exeに引数で渡してるんですね。
そんな気がしてきました。
ちょっとチェックしてみます。

69:デフォルトの名無しさん
08/02/06 22:00:07
>>48
NULLポインタdeleteって問題ないんじゃないの?

70:デフォルトの名無しさん
08/02/06 22:03:06
>>69
二重解放つったら解放したアドレスをもっかい解放のことだろ?

71:デフォルトの名無しさん
08/02/06 22:04:35
deleteしただけで、0(NULL)になってるとは限らないんじゃないの?

72:デフォルトの名無しさん
08/02/06 22:32:43
とりあえず gcc だとなってないな

73:デフォルトの名無しさん
08/02/06 23:35:43
質問です。g++を使っています。O2 で最適化してます。

クラスの中で定義した関数は勝手に inline となるのでしょうか?
inline をつけても意味は無いのでしょうか?

74:デフォルトの名無しさん
08/02/06 23:38:40
deleteした後自分で0をポインタに代入するというTipsがある位だからな

75:デフォルトの名無しさん
08/02/06 23:44:29
>>73
inline指定してるのと同じになる。
実際にinline化されてるかはコンパイラ次第。

76:デフォルトの名無しさん
08/02/06 23:48:07
ありがとう。何か勘違いしてたみたい
deleteした後nullになるわけじゃないのね
WM_DESTROYが来た時点ではOSかが自動的にdeleteしちゃってるから多重解放
でエラーでかうのかな

77:デフォルトの名無しさん
08/02/07 00:42:46
OSは自動的にdeleteなんてしません

78:デフォルトの名無しさん
08/02/07 00:47:50
libhoge.so
をスタティックリンクすることってできるんでしょうか?

79:デフォルトの名無しさん
08/02/07 00:54:20
はい。それがスタティックリンクできるようなアーカイブやオブジェクトモジュールであれば。

80:デフォルトの名無しさん
08/02/07 03:40:14
>>77
じゃあ何でエラーでるの?
newしたまま終了してしまっても最悪OSがエラー処理として解放してくれるって聞いたけど

81:デフォルトの名無しさん
08/02/07 05:19:50
>>80
エラーが出る事と自動的にdeleteする事を同列に考えるなよ
そもそもソース出してないのに的確な答えが出せると思える?
つーか自分で考えて答え出すか出たんなら帰れよ、必要最低限のレスは付いたんだから

82:デフォルトの名無しさん
08/02/07 05:55:50
的確な答じゃないなら断言口調で書くなよ、紛らわしい。

83:デフォルトの名無しさん
08/02/07 06:04:00
>>81
その考えをおまえが否定したから聞いてきてるんだろ

84:デフォルトの名無しさん
08/02/07 06:42:38
vector って大きさが可変のはずですが、vectorの配列のポインタ操作ってうまくいくのでしょうか?


たとえば以下のように double の vector の配列を作ったとします。

std::vector<double> a[3][4];

この vector 配列の要素ごとに違う回数だけ push_back() で値を入れたとします。
そして vector のポインターを引数にとる以下の関数があり

void hogehoge (std::vector<double>* arg ){

 for(std::vector<double>::const_iterator it=arg[0].begin();
  it!=arg[0].end();
  it++){
   std::cout<<"arg[1] "
 }
}

その引数に a[1] を以下のように入れた場合は

hogehoge(a[1]);

arg[0]というのは a[1][0] をちゃんとさしてくれるのでしょうか?

85:デフォルトの名無しさん
08/02/07 06:44:38
否定したんじゃなくて、ありがちなパターンに陥っていそうだから指摘しただけだろ。

86:デフォルトの名無しさん
08/02/07 07:16:58
>>84
当然さす

87:デフォルトの名無しさん
08/02/07 07:18:13
>>80
newしたまま終了って、main/WinMain すら終了した後の話だぜ

88:84
08/02/07 07:20:43
>>86
ありがとう!
ってことは sizeof(vector<double> は要素の数にかかわらず値は変わらないって事か。
不思議。

89:デフォルトの名無しさん
08/02/07 07:23:40
>>88
意味が分からん。

ポインタに [0] をつけたら
そのアドレスにあるオブジェクトを指す。
極めてシンプルな答え。

90:84
08/02/07 07:30:44
メモリを動的に作ってるからコンテナの要素が増えてもポインタは同じ所にあるって事か

91:デフォルトの名無しさん
08/02/07 07:31:39
vectorの中身はnewで確保したメモリへのポインタ(と管理情報)だからな

92:デフォルトの名無しさん
08/02/07 07:35:21
>>88
要素自体は動的確保されているからな

93:デフォルトの名無しさん
08/02/07 07:35:52
いいえ。

94:デフォルトの名無しさん
08/02/07 09:42:52
vectorの中の要素をソートしたいのですが、そのとき、自分で定義した関数によって
ソートしたいです。どうすればよいですか?

95:デフォルトの名無しさん
08/02/07 09:45:44
vectorは連続領域に格納される(配列と同じように扱える)から普通にソートしたらいい。

96:デフォルトの名無しさん
08/02/07 10:00:45
>>94
std::sort

97:デフォルトの名無しさん
08/02/07 14:14:42
スタティックリンクとかシャードリンクとかそのあたりのことが勉強できるサイトありませんでしょうか?

98:デフォルトの名無しさん
08/02/07 14:26:10
>>96
sort(vec.begin(), vec.end(), func);
と書きたい時、funcはどういう風に書けばよいでしょうか?
class func : public binary_function
{
bool operator()(const string &a, const string &b){}
};
と書いてみたのですが、コンパイルも通りません。
どうかお願いします。


99:デフォルトの名無しさん
08/02/07 14:29:08
binary_functionでぐぐれ

100:デフォルトの名無しさん
08/02/07 14:30:57
>>98
厳密に言うとstrict weak orderingを満たすように書く
ことになるが、

struct func : public binary_function
{
bool operator()(const string &a, const string &b) {
    return a < b; //辞書順で昇順
}
};

sort( vec.begin(), vec.end(), func() );

とかでどう?


101:デフォルトの名無しさん
08/02/07 14:31:04
質問です。
VC6.0で自前のライブラリをまとめたStatic Link Libraryを作っています。
そのライブラリを実際に他のプロジェクトで使う際、リンクのところで以下のように躓きました。

・すでに LIBCMTD.lib(crt0dat.obj) で定義されています
これを筆頭に、大量にリンク警告がでました。
調べたところ
URLリンク(m--takahashi.com)
libの方はシングルスレッドで。テストプロジェクトのほうはマルチスレッドでコンパイルしているのが問題のようでした。
両方マルチスレッドにしたところ…

・"libcmt.lib" は他のライブラリの使用と競合しています
今度はこれだけでました。
調べたところ
URLリンク(m--takahashi.com)
libがReleaseコンパイルで、テストプロジェクトがDebugコンパイルなのが悪いようでした。
libをRelease版とDebug版の両方をつくり、適切にリンクするようにしたところ、エラーがきえました。

ここで疑問なのですが、今後の汎用性を考えるとlibは
・シングルスレッドDebug版
・シングルスレッドRelease版
・マルチスレッドDebug版
・マルチスレッドRelease版
をそれぞれ用意しておかなければならないのでしょうか?

一般的に用意されている"winmm.lib"などは、何も考えずにstdafx.hに
#pragma comment(lib, "winmm.lib")
と書いておけば、シングルスレッドだろうがマルチスレッドだろうが、DebugだろうがReleaseだろうが適切にリンクされました(警告やエラーでません)

自作のlibも同じくらい気軽に使えるようにするには、どのようにしたら良いのでしょうか?

102:デフォルトの名無しさん
08/02/07 14:32:02
おっと、
>>99を見て
struct func : public binary_function<string, string, bool>
{
bool operator()(const string &a, const string &b) {
    return a < b; //辞書順で昇順
}
};

か。

103:デフォルトの名無しさん
08/02/07 14:38:33
const が有った方がいいな。

104:デフォルトの名無しさん
08/02/07 14:39:36
ハードディスクへの書き込みで、メモリへのキャッシュを自動で行ってくれる命令ありますか

105:デフォルトの名無しさん
08/02/07 14:52:29
おっと、
>>103を見て
struct func : public binary_function<string, string, bool>
{
bool operator()(const string &a, const string &b) const {
    return a < b; //辞書順で昇順
}
};

か。おれはconstをよく忘れる。


106:デフォルトの名無しさん
08/02/07 14:53:31
>>101
・Debug版は公開しちゃいけません
・現行VCはシングルスレッド版ランタイムがありません

>>104
そんな「命令」なんてあるもんですか。

107:デフォルトの名無しさん
08/02/07 14:59:57
>>106
MFC等のデバッグ版DLLの再配布が禁止なだけで
自前ライブラリのデバッグ版配布は禁止じゃねえだろ。

108:デフォルトの名無しさん
08/02/07 15:05:41
>>106
自前でキャッシュ用意しましたよ

109:デフォルトの名無しさん
08/02/07 15:16:46
>>106
101です
お返事ありがとうございます。

>・Debug版は公開しちゃいけません
確かにそもそもDebug版は用意しておく必要ないですよね
ただ、d3d9.lib も、デバッグ版らしき d3d9d.libというものがあります。

もしかして「Debug/Releaseで自動的にリンクを変えている」なんていうのは私の妄想で
d3d9d.libは使われていないのでしょうか?

>・現行VCはシングルスレッド版ランタイムがありません
これはつまり、世の中に配布されてるlibはマルチスレッド版で作られており、
マルチスレッド版libは、シングルスレッドなプロジェクトで利用しても特に問題が起きないということでしょうか?
(実際試してみたところ、シングルプロジェクトからマルチLibを呼び出してもエラーとなりませんでした)

そもそも「_beginthreadを使うためにはマルチスレッド版にする必要がある」という認識しかもっておらず、
「マルチスレッド版にしないことによる利点」は知らないのです

110:デフォルトの名無しさん
08/02/07 15:21:59
>>109
まず、デバッグ版のlibがあるやつはpragmaで切り替えてるはず。
自分の作ったlibが物によって変わるのは、そいつの中でデバッグ版や
MT版のlibを呼んでるから。

そういうの避けたければスタティックリンクしてしまうといいかも。

111:デフォルトの名無しさん
08/02/07 16:08:21
>>109です
>(実際試してみたところ、シングルプロジェクトからマルチLibを呼び出してもエラーとなりませんでした)
これですが、勘違いでした。
やはり「マルチスレッド版のlibファイル」を「シングルスレッド版のプロジェクト」からリンクすると、
LINK : warning LNK4098: defaultlib "LIBCMTD" は他のライブラリの使用と競合しています; /NODEFAULTLIB:library を使用してください
となってしまいました。
(上のは、Debugマルチ版LibをDebugシングル版のプロジェクトにリンクした場合の警告です)

>>110
なるほど。hファイルあたりで、#ifdef _DEBUG やら色々としているのでしょうか。

>そういうの避けたければスタティックリンクしてしまうといいかも。
ちょっとこの意味合いがわからないのですが、詳しく教えていただけますでしょうか
どこかのサイトへのリンクでも構いません



112:デフォルトの名無しさん
08/02/07 16:26:09
教えてください。
以下の式で、shinが偽になるのはなぜでしょうか?

unsigned int a =10, b = 20;
char shin = ((a - b) < (b - a));

(a - b) = -10, (b - a) = 10 なので、shin = 真になるように思うのですが。。。


113:デフォルトの名無しさん
08/02/07 16:29:04
unsigned同士の演算の結果はunsigned

114:デフォルトの名無しさん
08/02/07 16:32:12
int型変数(-32768〜32767)に-40000とか入れようとしたらどうなると思う?

115:デフォルトの名無しさん
08/02/07 16:32:16
ありがとうございます

116:デフォルトの名無しさん
08/02/07 16:37:11
>>101
コンパイラオプション/ZlってVC6にない?
これはobjファイルにLIBCMTD.LIBとかCRTへの参照を
埋め込まないようにするコンパイラオプション。
1つのlibで全てを賄えるようにもなる。

けど現実的には最適化・デバッグオプションの有無で、
少なくともRelease/Debugの2種用意すべきだと思うけど。

117:デフォルトの名無しさん
08/02/07 16:48:16
>116
Zlオプションを使ったところ、DebugプロジェクトからReleaseLibを使っても警告がでなくなりました。
ありがとうございます。
(最初 Zl が ゼット・アイだと思って混乱しましたw ゼット・エルですね)

しかし、StaticLibraryの作り方を詳しく解説しているサイトって全然見当たりませんね…。

Lib側としては、Releaseだけ用意しておけばいいと思うのですがどうでしょうか?
Libがバグっていないと仮定して利用するのが前提ですけど

118:デフォルトの名無しさん
08/02/07 16:51:38
>>101
winmm.libってwinmm.dllの単なるインポートライブラリでは?
VCのランタイムをリンクしないライブラリならそういった問題は当然起きない

119:デフォルトの名無しさん
08/02/07 16:52:47
別にReleaseだけでもいいと思う。
DLLだとデバッグ版も提供なんて話聞かないし。

120:デフォルトの名無しさん
08/02/07 17:02:19
>>118
あ、なるほど。そういえばlibにはもうひとつ「DLLとリンクするためのインポートライブラリ」という役目がありましたね。
winmmはそっちですか。
(拡張子変えればいいのになぁ…)

>>119
了解しました。

>ALL
大変参考になりました。
ありがとうございました!

121:デフォルトの名無しさん
08/02/07 17:19:25
デバッグ版のlibを提供するのはlibをデバッグしてもらおうということじゃなくて、
それを使ったプログラムもLibのソースをトレースできるようにだよw

122:デフォルトの名無しさん
08/02/07 17:23:39
>121
誰への返事だ??

123:デフォルトの名無しさん
08/02/07 17:26:13
環境依存のレスはすべてスルーしてます

124:デフォルトの名無しさん
08/02/07 17:36:05
スレタイももちろんスルーです

125:デフォルトの名無しさん
08/02/07 18:04:43
template<typename T>
void foo() {
T x = T();
}

intやint*などの基本型に対してテンプレートでのデフォルト初期化
を可能にするために上のような表記が許されておりint*ポインタも渡せます。
(NULLポインタに初期化されている)

しかし、以下のポインタの初期化は許されていないのでしょうか?

int* p = int*(); //コンパイルNGでした

int i = int(); //OK

126:デフォルトの名無しさん
08/02/07 18:05:37
ISO 9660ファイルを参照できるDLLとかありませんか

127:デフォルトの名無しさん
08/02/07 18:28:40
>>125
それはできないけど、これならできる。
typedef int* pint;
template<typename T>
struct identity
{
  typedef T type;
};
int* p1 = pint();
int* p2 = identity<int*>::type();

128:デフォルトの名無しさん
08/02/07 19:05:06
メモリが解放されてるかどうか確認する方法ってなんかあるかな?

void a( void* p ) {
if( rand() %2 ) delete p;
}

void main () {
char*pc = new char[100];
a(pc);
// pcが解放されてなかったら解放
if( soreppoino( pc ) ) delete pc;
}

みたいな。

129:デフォルトの名無しさん
08/02/07 19:08:34
すまん誤爆った・・・ってここでもいいのかなこれ

130:デフォルトの名無しさん
08/02/07 19:13:57
>>127
typedefで可能ということは単なるシンタックスの問題だという
ことですかね。だとしてもfoo<int*>()は結果的に
int*()となるからNGのような気もしますがね。

131:デフォルトの名無しさん
08/02/07 19:31:29

リスト管理の時
リストのアイテムをdeleteしたとき、自動的に所属するリストからはずれる機能は、
stlでvectorとかlistとか使って所属リストを覚えて、リストからはずすより、
前後のポインタを持った、自己連結クラスのほうが速度的に早いですか?
というか、deleteしたとき、自動的に所属するリストから外れるtemplateみたいなもの
STLみたいな標準ライブラリにありますか?


132:デフォルトの名無しさん
08/02/07 19:34:12
>>130
単純にシンタックスの問題っぽいよ

>postfix-expression:
> simple-type-specifier ( expression-listopt )
(略)
>simple-type-specifier:
> ::opt nested-name-specifieropt type-name
> ::opt nested-name-specifier template template-id
> char
> wchar_t
> bool
> short
> int
(略)
>type-name:
> class-name
> enum-name
> typedef-name
>class-name:
> identifier
> template-id

intやクラス名やtypedef名はOKだけどint*は構文に合致しないっていう・・

133:デフォルトの名無しさん
08/02/07 20:03:47
>>128
そういうクラスでも用意しない限り、ありません。
つーか、そんな阿呆なメモリ管理戦略はありえません。

>>131
逆に、リストにあるオブジェクトをremoveするときにdeleteしては?

134:デフォルトの名無しさん
08/02/07 20:22:12
1904年の日露戦争の際に、ロシア正教会は全教会をあげて日本に天罰を
下すように神に祈りをささげた。結局なにも天罰は降りず、ロシアは負けた。
20年後、日本で関東大震災が発生。ロシアの物理学者カピッツァはこの事実から
「神はわれわれから9光年以内にいる」と結論を下したという。

135:デフォルトの名無しさん
08/02/07 20:47:14
 お、おかしいアル・・・
/'⌒`ヽ、 5年後の世界に行ったらチューゴクがなかったアル・・・
ヽ、┗ ノ  
  `ーー'        γ⌒`ヽ           /'⌒⌒ヽ、
  ,-ーー-、      .|| ̄ ̄             (     ┃  ⌒ヽ
 /  ┃  )    ||    ∧_∧       \ ━┛    )
.(.   ┃   )   ||.   ( `ハ´;)
 ヽ、__,ノ     ||  _(つ¶¶と)__
           /||'''''|  三  |    |'(⌒)
        /    '―――`  ̄ \
        `============'


136:デフォルトの名無しさん
08/02/07 20:51:06
>>132
なるほど。まあテンプレートのときのために用意されてる
規則なので、そのときだけ利用します。
ありがとうございました。

ところで、みなさんは原文の規格を持ってるんですか?
買うと4万近かったので高くてとても買えません。


137:デフォルトの名無しさん
08/02/07 21:14:24
JISならオンラインで読めるじゃん。画像だけど。

138:デフォルトの名無しさん
08/02/07 21:17:09
Visual C++ 6.0を使っているんですけど
C++のプログラムを実行すると

c:\program files\microsoft visual studio\vc98\include\new(16) : error C2143: 構文エラー : ';' が '<class-head>' の前に必要です。
c:\program files\microsoft visual studio\vc98\include\new(16) : error C2501: '_STD_BEGIN' : 識別名を宣言するのに、型が指定されていません。
c:\program files\microsoft visual studio\vc98\include\new(16) : fatal error C1004: 予期せぬ EOF が検出されました。

と出てしまいます。
どんなプログラムでもこのエラーが出てしまい実行できません…
どのようにすればこのエラーはなくなりますか?

139:デフォルトの名無しさん
08/02/07 21:18:22
>>137
そこでドラフトですよ。
若干現規格と違うけど、
古いドラフトだとまあまあ現規格に近いから十分参考にはなる。

140:デフォルトの名無しさん
08/02/07 21:25:29
>>138
必要なものが入ってないか入れる設定にしていない。

_STD_BEGINってのはSTLが使う宣言だからSTLが使えないんだろう。
(vectorでも使ってるんかね?)

俺はSTL使ってないんで後はぐーぐる先生か他の人にまかすわ

141:デフォルトの名無しさん
08/02/07 21:37:29
>>137
>>139
あれ検索できないから不便ですよね。まあ無料なのでたまに見ますが。
正式版を無料で配布して欲しいですね。

142:デフォルトの名無しさん
08/02/07 22:03:32
>>138
Visual C++ 2008 Expressとかだとどうなる?

143:デフォルトの名無しさん
08/02/07 22:50:19
>>105
(遅くなりましたが)
ありがとうございました。

144:デフォルトの名無しさん
08/02/07 23:20:56
>>128
標準では用意されていないので、人によっては解放したらその領域を指
していたポインタ変数を (* 自分で *) NULL にしておくようにしてい
る人もいる。

どっちかって言うと、バグってた時の二重解放除けとか、変な領域を壊さ
ないようにと言う防御策だが。

void a( void** p ) {
if( rand() %2 ) delete *p;
}

void main () {
char*pc = new char[100];
a(&pc);
// pcが解放されてなかったら解放
if( soreppoino( pc ) ) delete pc;
}

145:デフォルトの名無しさん
08/02/08 01:48:10
確保していないのにdeleteするとバグるんですが対処法ありますか

146:デフォルトの名無しさん
08/02/08 01:50:44
単独ではつかわないでコンストラクタ、デストラクタ内で使えば安全かなあ

147:デフォルトの名無しさん
08/02/08 01:59:05
void a( void** p ) {
  if( rand() %2 ){
    delete *p;
    *p = NULL;   // delete後はNULLを入れておく
  }
}

void main () {
  char*pc = NULL;    // ポインタは普通NULLで初期化しておく
  if( rand() %2 )
    new char[100];
  a(&pc);
  delete pc;      // pcがNULLなら何もしない
}

148:デフォルトの名無しさん
08/02/08 01:59:41
while (cin) {
...
}
という処理についてなんですが、cinって最初はとりあえずtrueになるのですか?
すると、いつfalseになるんですか?
エラーフラグがたってればfalse、それ以外はtrueになるのかな?
cinで何かデータを読み込んだ後だけtrueになるのかと思ってました。


149:デフォルトの名無しさん
08/02/08 02:00:03
> new char[100];
pc = new char[100] でした。

150:デフォルトの名無しさん
08/02/08 02:04:09
スタート

標準入力からデータがcinに行く

cinがtrueになる

while(cin)が評価される

というかんじなんじゃね?

151:デフォルトの名無しさん
08/02/08 02:12:09
>>147
C++では汎用ポインタへのポインタって合法だったっけ。

152:デフォルトの名無しさん
08/02/08 03:44:28
問題ない。

153:デフォルトの名無しさん
08/02/08 03:55:20
coutとfstream(適当なファイルに対してオープン済みのもの)とのそれぞれに、ほぼ同じ処理を書くのですが、
1つの関数にまとめたいと思うのですが、どうすればいいでしょうか?

void print((型が分からない) stream) {
stream << "hogehoge" << endl;
 ...
}
こんなのも考えてみたのですが、コンパイルできず、ダメでした。
template<class T>
void print(char *filename) {
T outStream;
if (filename) outStream.open(filename);
outStream << "hogehoge" << endl;
...
}
どうかよろしくお願いします。


154:デフォルトの名無しさん
08/02/08 07:25:40
>>138
new ヘッダをインクルードする前に
new をマクロで置き換えてないか?

155:デフォルトの名無しさん
08/02/08 10:49:42
>>153
std::ostream

156:デフォルトの名無しさん
08/02/08 11:53:19
サクラエディタのソースコードを眺めていたのですが、コメント部でよくわからない表記があります。
@param などはなんとなく想像がつくのですが、「//!<」や「/*! */」は何を意図しているのでしょうか。
どなたか教えてください。

157:デフォルトの名無しさん
08/02/08 11:57:37
>>156
つ[Doxygen]

158:デフォルトの名無しさん
08/02/08 11:59:11
まさに、それですね。
ありがとうございました。

159:デフォルトの名無しさん
08/02/08 13:23:53
例外処理の使い方がいまいち分かりません

例外を投げたらその処理の中で解決した方が良いのか
それとも解決方法を使う側に投げっぱなしにしてしまうのか
例外をどういう形でthrowするのがいいのか

なんというか感覚的に掴みにくいというかなんというか

160:デフォルトの名無しさん
08/02/08 13:25:33
無用物

161:デフォルトの名無しさん
08/02/08 13:32:44
参照を返すとオブジェクトが捨てられたときに
帰ってきたものも向こうに?

162:デフォルトの名無しさん
08/02/08 13:34:05
>>159
自関数の中でリカバリできるならcatchして処理すればよい
そうでないなら呼び出し元にまかせる

普通のエラー処理と同じようなもんだ
自分で処理できるならして、処理できないなら呼び出し元にエラーコードなりなんなりをreturnするだろう
エラーコードのreturnが例外のthrowに変わるだけ

163:デフォルトの名無しさん
08/02/08 13:34:37
>>161
日本語で

164:デフォルトの名無しさん
08/02/08 13:48:01
>>162
そういう感じで良いんですか
気軽に使えるなら使ってみようかな・・・

165:デフォルトの名無しさん
08/02/08 14:03:21
とある3種類の計測器をモニターするプログラムなんですが
似てるけど若干ちがう命令が3つあるとします

この場合
クラス分けをしていくとき
計器の共通化持つクラスを基底として、それぞれの機能をもつ派生クラスを作るか

機能の共通処理をもつクラスを基底として、それぞれの計器にあわせて派生クラスを作るか

どちらが今後計器が増える可能性を加味したとき、よい設計でしょうか

166:デフォルトの名無しさん
08/02/08 14:07:41
>>165
その計測器メーカに合わせるのが一番。
あるメーカは旧型機種の機能を改変しつつ新機能を作るかもしれないし、
あるメーカは旧型機種の機能を残しつつ新機能を作るかもしれない。

なんてことは兎も角、使い易いように作れば?

167:138
08/02/08 15:05:04
返信遅くなってすいません!

>>140
STLは使ってなくてもこのエラーなんですよ…
Hello Worldみたいな文字を出力するだけのプログラムでも
実行できないです。

>>142
Visual C++ 2008 Express Editionで実行したらできました!
ありがとうございます。

>>154
マクロも使ってないので違うと思うのですが…

Visual C++ 6.0を使い慣れているので
どうにかして実行させたいのですが・・・

168:デフォルトの名無しさん
08/02/08 15:22:22
class Fruit;
class Apple : Fruit;

std::vector<Fruit> fruits;を作ると

抽象クラスをインスタンス化できません。
と言われるです。どうするですか?

169:デフォルトの名無しさん
08/02/08 15:23:31
Fruit がそういうつくりになってるんじゃないの?

170:デフォルトの名無しさん
08/02/08 15:24:38
>>168
class Fruitを具体化してください。

171:デフォルトの名無しさん
08/02/08 15:36:19
std::vector<Fruit*> fruits;

172:デフォルトの名無しさん
08/02/08 16:14:45
コンパイラにBCCを使って数値計算をしているのですが、
しばらくプログラム実行していると、EXP: OVERFLOW ERRORと出ます。
これは、exp関数に入れた値がexp関数の扱える値(doubleの範囲)よりも大きいと言うことでしょうか?


173:デフォルトの名無しさん
08/02/08 16:23:52
>>167
俺、解決方法知ってるんだが…

174:デフォルトの名無しさん
08/02/08 16:25:09
vevtorにvcの_com_ptrは入りますか?

175:デフォルトの名無しさん
08/02/08 16:59:55
コピー初期化もコピー代入もできるから問題ないはず。

176:デフォルトの名無しさん
08/02/08 22:22:37
すいませんちょっとお聞きしたいんですが、

#include <iostream>
using namespace std;

int main(){
char ss[80] = "これは文字列です";

cout << ss[0] << ss[1];

return 0;

}

ってやって、coutで「こ」って表示されないのは、どういう理屈でしょうか??

177:デフォルトの名無しさん
08/02/08 22:24:09
UTF-8 なら3バイト必要だが、そういうわけではなくて?

178:デフォルトの名無しさん
08/02/08 22:34:20
>>176
ひょっとしてなんか変な文字がでたりしてるか?

179:176
08/02/08 22:34:23
ぐは、そうだったんですね・・2バイトでいいんだと思ってました汗
cout << ss[0] << ss[1] << ss[2];
とやったらちゃんと表示されました。
ありがとうございましたm(_ _)m

180:デフォルトの名無しさん
08/02/08 22:40:31
ちなみにWindows上だと>>176のコードで「こ」はちゃんと出た。(bcc32 / gcc@cygwin)

181:デフォルトの名無しさん
08/02/08 22:44:58
それはお前がソースをSJISで書いてるだけ

182:デフォルトの名無しさん
08/02/08 22:55:36
>>175

ども。

183:デフォルトの名無しさん
08/02/08 23:42:34
UTF-8 だと全て3バイトって訳じゃないのが面倒なところだよな。

184:デフォルトの名無しさん
08/02/08 23:43:11
>>181
UTF-16 でも出るがな。

185:デフォルトの名無しさん
08/02/09 00:17:28
他で聞いてきます

186:デフォルトの名無しさん
08/02/09 00:20:35
fatal error LNK1104:コンパイラは、ファイルd3d9.libを開けません
とでてしまいビルドできません
手動でリンカにd3d9.libを設定しましたが無理でした
どうすればよいのか

187:デフォルトの名無しさん
08/02/09 00:33:08
ファイルはあるの?

188:デフォルトの名無しさん
08/02/09 00:40:25
pathの設定はしたか?

189:デフォルトの名無しさん
08/02/09 01:58:17
More Exceptional C++が届いたんだが
いきなり最初のコードがコンパイルできねえ
一気にやる気失くした。やっぱ古い本はこんな
もんかねえ。

190:デフォルトの名無しさん
08/02/09 02:00:08
ちなみにコレ
VC++2008 g++ 4.0 でも不可

#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, char* argv[])
{

(argc > 2
   ? ofstream(argv[2], ios::out | ios::binary)
   : cout)
<<
 (argc > 1
    ? ifstream(argv[1], ios::in | ios::binary)
    : cin )
.rdbuf();

 return 0;

}




次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4940日前に更新/249 KB
担当:undef