【初心者歓迎】C/C++室 Ver.48【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/02/05(火) 01:18:41ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.47【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1200464091/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0013デフォルトの名無しさん
2008/02/05(火) 12:13:11イテレータを受け取るコンストラクタを使えってばよ。
0014デフォルトの名無しさん
2008/02/05(火) 12:20:42イテレータを渡したいけど、どこにあるのかわかりません
0015デフォルトの名無しさん
2008/02/05(火) 12:28:14配列要素へのポインタはイテレータとして使える。
0016デフォルトの名無しさん
2008/02/05(火) 12:34:21ありがとうございます。
std::string a[] = {"AAAAA", "BBBBB", "CCCCC", "DDDDD"};
std::vector<std::string> v(&a[0], &a[3]);
で、できました!
0017デフォルトの名無しさん
2008/02/05(火) 12:57:070018売国まるはん
2008/02/05(火) 13:11:26ネット工作会社がスレ荒らしをしてスレが機能停止します。
↓↓工作員の荒らしのやり方↓↓
2008/01/10(木)ID:iA54nBU50
■■■■マルハン総合スレッド 9■■■■http://money6.2ch.net/test/read.cgi/pachij/1187021165/783-784
【宮崎県都城市】パチ事情その�Ahttp://money6.2ch.net/test/read.cgi/pachij/1187189246/658-659
【山と川】宮崎県児湯付近PART1【自然イパーイ】http://money6.2ch.net/test/read.cgi/pachij/1188235164/471-472
【基地外が大暴れ4】エスパス日拓総合スレ【18発目】http://money6.2ch.net/test/read.cgi/pachij/1188885488/401-410
2008/01/13(日)ID:1HLcWzUK0
【基地外が大暴れ4】エスパス日拓総合スレ【18発目】http://money6.2ch.net/test/read.cgi/pachij/1188885488/461-462
■■■■マルハン総合スレッド 9■■■■http://money6.2ch.net/test/read.cgi/pachij/1187021165/809-810
【香川】パーラーグランドのスレ2【徳島】http://money6.2ch.net/test/read.cgi/pachij/1188315438/324
【延岡】宮崎県北情報PART3【日向】http://money6.2ch.net/test/read.cgi/pachij/1196865970/186
工作員に荒らされ機能停止したスレ
■■■■マルハン総合スレッド 9■■■■http://money6.2ch.net/test/read.cgi/pachij/1187021165/
【山崎】MPT渋谷パート9【シャネル】http://money6.2ch.net/test/read.cgi/pachij/1197771701
【基地外が大暴れ4】エスパス日拓総合スレ【18発目】http://money6.2ch.net/test/read.cgi/pachij/1188885488
MPT渋谷はマルハン・パチンコ・タワー渋谷の略です。
パチンコ産業は荒らすことでレスとレスの間を空けて読む気をなくさせたり
マネーロンダリング、さくら、ホルコン、遠隔、などの風評被害を最小限に抑えようとしてる。
新スレ→○○○マルハンパチンコタワー渋谷パート10○○○
★★★★★このスレの解説★★★★★を読んでみるとよく判る。
http://money6.2ch.net/test/read.cgi/pachij/1201304777/52-54
0019デフォルトの名無しさん
2008/02/05(火) 13:29:530020デフォルトの名無しさん
2008/02/05(火) 15:11:24何かと不便なのでwindows上で開発環境を整えようと思うのですが、何かお勧めのソフトはありますでしょうか?
0021デフォルトの名無しさん
2008/02/05(火) 15:15:20cygwin
0022デフォルトの名無しさん
2008/02/05(火) 15:24:55Eclipse + CDT
0023デフォルトの名無しさん
2008/02/05(火) 15:47:35struct 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 ) );
こうやって読み込むと配列の部分が正常に読み込めません。
何かいい方法はありますか?
0024デフォルトの名無しさん
2008/02/05(火) 15:53:06ありません。つーか、そもそもそれではvectorは書き込まれていない筈です。ご愁傷様。
0025デフォルトの名無しさん
2008/02/05(火) 15:56:150026デフォルトの名無しさん
2008/02/05(火) 15:58:56動的配列を実現できるようなメンバ関数でアクセスするから動的配列たりうるわけで。
エレベーターのボタンを押さずに扉こじ開けてもエレベーターには乗れないでしょ?
0027デフォルトの名無しさん
2008/02/05(火) 16:01:530028デフォルトの名無しさん
2008/02/05(火) 17:20:390029デフォルトの名無しさん
2008/02/05(火) 17:21:420030デフォルトの名無しさん
2008/02/05(火) 17:26:50ありがとうございました
0031デフォルトの名無しさん
2008/02/05(火) 19:03:05template<typename FunctionPtr>
struct FunctionTraits;
template<typename ResultType,class ClassT>
struct FunctionTraits<ResultType (ClassT::*)(void)>
{
typedef ClassT ClassType;
};
テンプレートの関数ポインタによる特殊化でメソッドのクラスを推測することは不可能なんでしょうか。
0032デフォルトの名無しさん
2008/02/05(火) 19:35:310033デフォルトの名無しさん
2008/02/05(火) 19:46:16部分特殊化は VC6 あたりでも対応してなかったと思う。
コンパイラが対応してないのはありうると思う。
0034デフォルトの名無しさん
2008/02/05(火) 20:08:260035デフォルトの名無しさん
2008/02/05(火) 21:20:13作ってみろというようなことをいわれました。
早速やってみようと思ったのですが、何から手をつけていいのか
さっぱりです。何か良い書籍などあるでしょうか?
チンチロリンのサンプルプログラムを見てみるのも勉強になると
いわれたので、検索してみたのですがサンプルが無く困っています。
どうかよろしくお願いします。
0036デフォルトの名無しさん
2008/02/05(火) 21:47:250037デフォルトの名無しさん
2008/02/05(火) 21:58:18>いわれたので
簡単にそんなものが見つかるのが前提のアドバイスにワロタw
でも、そういう簡単なゲームを作るのはいい練習になると思うよ。
とりあえず、今勉強に使ってる本かサイトか知らんが
その知識だけで自分で作ってみるといいよ。
多分いろいろと汚いプログラムになりはするとは思うけど、
そうやって作ってみた後にサンプルなり本なりを読むと、
どこがマズかったのかってのがよく分かっていいと思うぜ。
0038デフォルトの名無しさん
2008/02/05(火) 22:03:38今は、手元にある入門書とぐぐって何とかやってる状態です。
何冊か立ち読みして、よさそうなのをもう1冊買ってみようかと
思います。ありがとうございます。
>>37
簡単に見つかるものじゃないんですね・・。
なんとか形にしてみてから調べてみることにします。
ありがとうございます。
0039デフォルトの名無しさん
2008/02/05(火) 23:41:22std::exceptionにうにこーど入れると文字が壊れますか?
0040デフォルトの名無しさん
2008/02/05(火) 23:43:58[std::exception unicode]でググって速効。
http://jinguru.blog86.fc2.com/blog-entry-10.html
0041デフォルトの名無しさん
2008/02/05(火) 23:56:320042デフォルトの名無しさん
2008/02/05(火) 23:59:490043デフォルトの名無しさん
2008/02/06(水) 05:39:37その時、
int a;
cin >> a;
として、入力が数字ではなかったとき、変数aにはなにも代入されず、
ユーザが行った入力はどこかのバッファに溜まってる
のでしょうか。その次の入力から動作がおかしくなります。
あと、もし上記が正しいとすると、ユーザからの入力を受け取る処理は、
とりあえずstringで受けるべきなのでしょうか?
0044デフォルトの名無しさん
2008/02/06(水) 10:57:57intには数字しか読込めない。今の場合、何も読込まれずに
cinにはfailbitが立つ。cin.clear()か何かでgoodbit立てない
限り次の読み込みは出来ない。stringにすべきかどうかは何を
読み込むかによる。
0045デフォルトの名無しさん
2008/02/06(水) 11:34:06ありがとうございます。自分でも調べてみたのですが、
int a;
cin >> a;
入力データを使って処理する
cin.clear();
cin.ignore(numeric_limits<int>::max(),'\n');
とするとcinが元の状態に戻りました。
ここで、clear()はgoodbitを立てるものだとして、
ignore()は指定文字数分か指定した文字(上記だと'\n')が出るまで
入力値をバッファから消す、という処理ですよね。
cinの入力ってこう書かないとだめなのでしょうか?
(結構面倒かも、と思った)
0046デフォルトの名無しさん
2008/02/06(水) 11:59:49コンパイル時はエラーでないけど、実行してnewで確保した後プログラムを終了
(WM_DESTROYが送られる)したらエラーがでるんですが、何故ですか?
WM_CLOSEでならdeleteしてもエラーでないんで問題は無いんですが興味本位で
0047デフォルトの名無しさん
2008/02/06(水) 12:16:07入力フォーマットの仕様がどうなってるのかわからないから
なんとも言えないな。任意の値が入力されるならgetlineで
一行読込んでstring解析したほうがいいかも。
0048デフォルトの名無しさん
2008/02/06(水) 12:21:080049デフォルトの名無しさん
2008/02/06(水) 14:18:30出力するようにしたいのですが、どうすればよいですか?
double amount = 3.33333;
cout << amount;
=> 3.33
どうかお願いします。
0050デフォルトの名無しさん
2008/02/06(水) 14:27:18これからCを始めようと思ってます。
(とりあえず、Cが基本だからやっとけ!と、どこかで見たので)
その際、アルゴリズムを先に学んだ方がいいですか?
周りに技術者がいないので、ネットで勉強する形になりますが・・。
0051デフォルトの名無しさん
2008/02/06(水) 14:35:04すみません
書き込む場所間違えました・・。
吊って来るんで許してください
0052デフォルトの名無しさん
2008/02/06(水) 14:47:22ios::rightとかその他諸々を使って出来たみたいだったのですが、
次回必要になった時に絶対わすれてそうだったので、sprintf()を使ってやりました。
失礼しました。
0053デフォルトの名無しさん
2008/02/06(水) 14:48:250054デフォルトの名無しさん
2008/02/06(水) 14:50:570055デフォルトの名無しさん
2008/02/06(水) 14:54:210056デフォルトの名無しさん
2008/02/06(水) 14:57:040057デフォルトの名無しさん
2008/02/06(水) 15:06:37<iomanip>ヘッダ
setprecisionマニピュレータを使う。
double amount = 3.33333;
streamsize oldprec = cout.precision();
cout << setprecision(3) << amount << setprecision(oldprec) << endl;
0058デフォルトの名無しさん
2008/02/06(水) 15:17:12#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
こういう場合は文字列処理に持っていくしかないですかねぇ?
0059デフォルトの名無しさん
2008/02/06(水) 15:34:32コンパイラは自動的にプログラムを書いたりはしてくれませんので、コンパイラに任せるなどということはできません
コンパイラは あなた が書いた通りに動きます
>>56
文字列(=文字の配列)への参照っていうと、こういうのでしょうか
void foo(const char(&s)[6]) {
printf("%s\n", s);
}
int main() {
foo("Hello");
}
あんまりやらないと思いますが
006058
2008/02/06(水) 15:40:26#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で
0061デフォルトの名無しさん
2008/02/06(水) 15:41:03cout.setf(ios::fixed, ios::floatfield); をcout前に追加
setprecision(3) → setprecision(2)
0062デフォルトの名無しさん
2008/02/06(水) 17:21:150063デフォルトの名無しさん
2008/02/06(水) 17:56:43ごめん、よくわからない
0064デフォルトの名無しさん
2008/02/06(水) 18:59:44起動させると、はじめカレントディレクトリは
ルートディレクトリになってるんですけど
glutInit()を通過すると、◯◯.app/Contents/Resourcesが
カレントディレクトリになってんですよ
なんでこんな妙なところに行っちゃうんですかね
ちなみに◯◯.appの中身は以下の通りです
◯◯.app/Contents/Info.plist <--謎
◯◯.app/Contents/MacOS/○○.exe <--実際に動くc++コード
◯◯.app/Contents/Resources/icon.icns <--アイコンの絵
0065デフォルトの名無しさん
2008/02/06(水) 19:21:04::ZeroMemory(&d3dpp, sizeof(d3dpp));
と
D3DPRESENT_PARAMETERS d3dpp = {0};
はちがいますか?
0066デフォルトの名無しさん
2008/02/06(水) 19:23:400067デフォルトの名無しさん
2008/02/06(水) 19:30:09そこがアプリケーションのリソースを置く場所だから、
親切に(あるいは余計なお世話か)移動してくれてるんじゃないかな
0068デフォルトの名無しさん
2008/02/06(水) 20:39:50なるほど
Glutで何かしているのではなく
◯◯.exeに引数で渡してるんですね。
そんな気がしてきました。
ちょっとチェックしてみます。
0069デフォルトの名無しさん
2008/02/06(水) 22:00:07NULLポインタdeleteって問題ないんじゃないの?
0070デフォルトの名無しさん
2008/02/06(水) 22:03:06二重解放つったら解放したアドレスをもっかい解放のことだろ?
0071デフォルトの名無しさん
2008/02/06(水) 22:04:350072デフォルトの名無しさん
2008/02/06(水) 22:32:430073デフォルトの名無しさん
2008/02/06(水) 23:35:43クラスの中で定義した関数は勝手に inline となるのでしょうか?
inline をつけても意味は無いのでしょうか?
0074デフォルトの名無しさん
2008/02/06(水) 23:38:400075デフォルトの名無しさん
2008/02/06(水) 23:44:29inline指定してるのと同じになる。
実際にinline化されてるかはコンパイラ次第。
0076デフォルトの名無しさん
2008/02/06(水) 23:48:07deleteした後nullになるわけじゃないのね
WM_DESTROYが来た時点ではOSかが自動的にdeleteしちゃってるから多重解放
でエラーでかうのかな
0077デフォルトの名無しさん
2008/02/07(木) 00:42:460078デフォルトの名無しさん
2008/02/07(木) 00:47:50をスタティックリンクすることってできるんでしょうか?
0079デフォルトの名無しさん
2008/02/07(木) 00:54:200080デフォルトの名無しさん
2008/02/07(木) 03:40:14じゃあ何でエラーでるの?
newしたまま終了してしまっても最悪OSがエラー処理として解放してくれるって聞いたけど
0081デフォルトの名無しさん
2008/02/07(木) 05:19:50エラーが出る事と自動的にdeleteする事を同列に考えるなよ
そもそもソース出してないのに的確な答えが出せると思える?
つーか自分で考えて答え出すか出たんなら帰れよ、必要最低限のレスは付いたんだから
0082デフォルトの名無しさん
2008/02/07(木) 05:55:500083デフォルトの名無しさん
2008/02/07(木) 06:04:00その考えをおまえが否定したから聞いてきてるんだろ
0084デフォルトの名無しさん
2008/02/07(木) 06:42:38たとえば以下のように 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] をちゃんとさしてくれるのでしょうか?
0085デフォルトの名無しさん
2008/02/07(木) 06:44:380086デフォルトの名無しさん
2008/02/07(木) 07:16:58当然さす
0087デフォルトの名無しさん
2008/02/07(木) 07:18:13newしたまま終了って、main/WinMain すら終了した後の話だぜ
008884
2008/02/07(木) 07:20:43ありがとう!
ってことは sizeof(vector<double> は要素の数にかかわらず値は変わらないって事か。
不思議。
0089デフォルトの名無しさん
2008/02/07(木) 07:23:40意味が分からん。
ポインタに [0] をつけたら
そのアドレスにあるオブジェクトを指す。
極めてシンプルな答え。
009084
2008/02/07(木) 07:30:440091デフォルトの名無しさん
2008/02/07(木) 07:31:390092デフォルトの名無しさん
2008/02/07(木) 07:35:21要素自体は動的確保されているからな
0093デフォルトの名無しさん
2008/02/07(木) 07:35:520094デフォルトの名無しさん
2008/02/07(木) 09:42:52ソートしたいです。どうすればよいですか?
0095デフォルトの名無しさん
2008/02/07(木) 09:45:440096デフォルトの名無しさん
2008/02/07(木) 10:00:45std::sort
0097デフォルトの名無しさん
2008/02/07(木) 14:14:420098デフォルトの名無しさん
2008/02/07(木) 14:26:10sort(vec.begin(), vec.end(), func);
と書きたい時、funcはどういう風に書けばよいでしょうか?
class func : public binary_function
{
bool operator()(const string &a, const string &b){}
};
と書いてみたのですが、コンパイルも通りません。
どうかお願いします。
0099デフォルトの名無しさん
2008/02/07(木) 14:29:080100デフォルトの名無しさん
2008/02/07(木) 14:30:57厳密に言うと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() );
とかでどう?
0101デフォルトの名無しさん
2008/02/07(木) 14:31:04VC6.0で自前のライブラリをまとめたStatic Link Libraryを作っています。
そのライブラリを実際に他のプロジェクトで使う際、リンクのところで以下のように躓きました。
・すでに LIBCMTD.lib(crt0dat.obj) で定義されています
これを筆頭に、大量にリンク警告がでました。
調べたところ
ttp://m--takahashi.com/bbs/pastlog/08900/08806.html
libの方はシングルスレッドで。テストプロジェクトのほうはマルチスレッドでコンパイルしているのが問題のようでした。
両方マルチスレッドにしたところ…
・"libcmt.lib" は他のライブラリの使用と競合しています
今度はこれだけでました。
調べたところ
ttp://m--takahashi.com/bbs/pastlog/03900/03888.html
libがReleaseコンパイルで、テストプロジェクトがDebugコンパイルなのが悪いようでした。
libをRelease版とDebug版の両方をつくり、適切にリンクするようにしたところ、エラーがきえました。
ここで疑問なのですが、今後の汎用性を考えるとlibは
・シングルスレッドDebug版
・シングルスレッドRelease版
・マルチスレッドDebug版
・マルチスレッドRelease版
をそれぞれ用意しておかなければならないのでしょうか?
一般的に用意されている"winmm.lib"などは、何も考えずにstdafx.hに
#pragma comment(lib, "winmm.lib")
と書いておけば、シングルスレッドだろうがマルチスレッドだろうが、DebugだろうがReleaseだろうが適切にリンクされました(警告やエラーでません)
自作のlibも同じくらい気軽に使えるようにするには、どのようにしたら良いのでしょうか?
0102デフォルトの名無しさん
2008/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; //辞書順で昇順
}
};
か。
0103デフォルトの名無しさん
2008/02/07(木) 14:38:330104デフォルトの名無しさん
2008/02/07(木) 14:39:360105デフォルトの名無しさん
2008/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をよく忘れる。
0106デフォルトの名無しさん
2008/02/07(木) 14:53:31・Debug版は公開しちゃいけません
・現行VCはシングルスレッド版ランタイムがありません
>>104
そんな「命令」なんてあるもんですか。
0107デフォルトの名無しさん
2008/02/07(木) 14:59:57MFC等のデバッグ版DLLの再配布が禁止なだけで
自前ライブラリのデバッグ版配布は禁止じゃねえだろ。
0108デフォルトの名無しさん
2008/02/07(木) 15:05:41自前でキャッシュ用意しましたよ
0109デフォルトの名無しさん
2008/02/07(木) 15:16:46101です
お返事ありがとうございます。
>・Debug版は公開しちゃいけません
確かにそもそもDebug版は用意しておく必要ないですよね
ただ、d3d9.lib も、デバッグ版らしき d3d9d.libというものがあります。
もしかして「Debug/Releaseで自動的にリンクを変えている」なんていうのは私の妄想で
d3d9d.libは使われていないのでしょうか?
>・現行VCはシングルスレッド版ランタイムがありません
これはつまり、世の中に配布されてるlibはマルチスレッド版で作られており、
マルチスレッド版libは、シングルスレッドなプロジェクトで利用しても特に問題が起きないということでしょうか?
(実際試してみたところ、シングルプロジェクトからマルチLibを呼び出してもエラーとなりませんでした)
そもそも「_beginthreadを使うためにはマルチスレッド版にする必要がある」という認識しかもっておらず、
「マルチスレッド版にしないことによる利点」は知らないのです
0110デフォルトの名無しさん
2008/02/07(木) 15:21:59まず、デバッグ版のlibがあるやつはpragmaで切り替えてるはず。
自分の作ったlibが物によって変わるのは、そいつの中でデバッグ版や
MT版のlibを呼んでるから。
そういうの避けたければスタティックリンクしてしまうといいかも。
0111デフォルトの名無しさん
2008/02/07(木) 16:08:21>(実際試してみたところ、シングルプロジェクトからマルチLibを呼び出してもエラーとなりませんでした)
これですが、勘違いでした。
やはり「マルチスレッド版のlibファイル」を「シングルスレッド版のプロジェクト」からリンクすると、
LINK : warning LNK4098: defaultlib "LIBCMTD" は他のライブラリの使用と競合しています; /NODEFAULTLIB:library を使用してください
となってしまいました。
(上のは、Debugマルチ版LibをDebugシングル版のプロジェクトにリンクした場合の警告です)
>>110
なるほど。hファイルあたりで、#ifdef _DEBUG やら色々としているのでしょうか。
>そういうの避けたければスタティックリンクしてしまうといいかも。
ちょっとこの意味合いがわからないのですが、詳しく教えていただけますでしょうか
どこかのサイトへのリンクでも構いません
0112デフォルトの名無しさん
2008/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 = 真になるように思うのですが。。。
■ このスレッドは過去ログ倉庫に格納されています