【初心者歓迎】C/C++室 Ver.54【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/05/14(水) 01:00:02ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.53【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1208989385/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0345デフォルトの名無しさん
2008/05/28(水) 00:00:290346デフォルトの名無しさん
2008/05/28(水) 10:31:060347デフォルトの名無しさん
2008/05/28(水) 10:34:59とすると実体なしで。コンパイルが通ります。間違えですか?
0348デフォルトの名無しさん
2008/05/28(水) 10:38:030349デフォルトの名無しさん
2008/05/28(水) 10:39:02基本的にはそう。
>>347
それだけで定数式としては使える。
でも const int& r = C::x とかするとリンクエラーになるから、
広く使うクラスなら定義も作っといたほうがいい。(その場合は初期化部分は無し)
0350デフォルトの名無しさん
2008/05/28(水) 10:41:160351デフォルトの名無しさん
2008/05/28(水) 11:54:06こんなエラーが出ます。
1>main.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: void __thiscall ANNkd_tree::annkPriSearch(double *,int,int *,double *,double)"
(__imp_?annkPriSearch@ANNkd_tree@@QAEXPANHPAH0N@Z) が関数 "int __cdecl findmatch(int)" (?findmatch@@YAHH@Z) で参照されました。
1>main.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: __thiscall ANNkd_tree::ANNkd_tree(double * *,int,int,int,enum ANNsplitRule)"
(__imp_??0ANNkd_tree@@QAE@PAPANHHHW4ANNsplitRule@@@Z) が関数 "int __cdecl findmatch(int)" (?findmatch@@YAHH@Z) で参照されました。
1>main.obj : error LNK2001: 外部シンボル ""public: virtual void __thiscall ANNkd_tree::annkSearch(double *,int,int *,double *,double)"
(?annkSearch@ANNkd_tree@@UAEXPANHPAH0N@Z)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""public: virtual int __thiscall ANNkd_tree::annkFRSearch(double *,double,int,int *,double *,double)"
(?annkFRSearch@ANNkd_tree@@UAEHPANNHPAH0N@Z)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""public: virtual int __thiscall ANNkd_tree::theDim(void)" (?theDim@ANNkd_tree@@UAEHXZ)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""public: virtual double * * __thiscall ANNkd_tree::thePoints(void)" (?thePoints@ANNkd_tree@@UAEPAPANXZ)"
は未解決です。
1>main.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: virtual __thiscall ANNkd_tree::~ANNkd_tree(void)"
(__imp_??1ANNkd_tree@@UAE@XZ) が関数 "public: virtual void * __thiscall ANNkd_tree::`scalar deleting destructor'(unsigned int)"
(??_GANNkd_tree@@UAEPAXI@Z) で参照されました。
c++ と c を合わせて使おうとしているのですが、いたるところでエラーがでています。
このエラーはなぜ起こるのでしょうか
0352デフォルトの名無しさん
2008/05/28(水) 11:55:14必要なライブラリをリンクしていないからだと思うよ
0353デフォルトの名無しさん
2008/05/28(水) 11:56:22名前マングリング でぐぐってみるとよかれ
0354デフォルトの名無しさん
2008/05/28(水) 12:02:32http://www.google.co.jp/search?q=LNK2019
http://www.google.co.jp/search?q=LNK2001
0355デフォルトの名無しさん
2008/05/28(水) 15:53:12それらを消したいのですが、ファイルは成功しますが、フォルダが無理です。
プログラムを終了して次回に消すと平気です。
なぜでしょうか? ファイルにロックがかかっていれば当然無理ですが、ファイルの削除だけは成功してます。
0356デフォルトの名無しさん
2008/05/28(水) 15:55:030357デフォルトの名無しさん
2008/05/28(水) 16:01:1132: ファイルが別の処理で使われているため、アクセスできません。
でした。 ソース見直してみます。サンクス
0358デフォルトの名無しさん
2008/05/28(水) 16:05:510359デフォルトの名無しさん
2008/05/28(水) 16:13:260360デフォルトの名無しさん
2008/05/28(水) 16:21:24カレントディレクトリはどうなってる?
0361デフォルトの名無しさん
2008/05/28(水) 19:20:22どうすれば良くなりますでしょうか?
template < class C > int write(string x, C y) {省略}
: error C2059: 構文エラー : '<'
: error C2334: '{' の前に予期しないトークンがありました。関数の本体は無視されます。
0362デフォルトの名無しさん
2008/05/28(水) 19:27:180363デフォルトの名無しさん
2008/05/28(水) 20:53:00#include <iostream>
class test {};
int main() {
const test aa;
return 0;
}
エラー
$ g++ -Wall samp80.cpp
test.cpp: In function 'int main()':
test.cpp:4: error: uninitialized const 'aa'
test.cpp:4: warning: unused variable 'aa'
0364デフォルトの名無しさん
2008/05/28(水) 20:56:430365デフォルトの名無しさん
2008/05/28(水) 20:58:19英語を勉強しようぜ
0366デフォルトの名無しさん
2008/05/28(水) 21:02:51ありがとうです。でも初期化のやりようがないと思うんですが、、、
class test {}; ってconstタイプのオブジェクトは作成できないんですか?
0367デフォルトの名無しさん
2008/05/28(水) 21:03:590368デフォルトの名無しさん
2008/05/28(水) 21:07:390369デフォルトの名無しさん
2008/05/28(水) 21:26:59constメンバを含んでいてもコンストラクタで初期化は出来る
0370デフォルトの名無しさん
2008/05/28(水) 23:31:35なんかVBっぽくて気持ち悪いんですが。
0371デフォルトの名無しさん
2008/05/28(水) 23:33:41意味あいが全然違うぞ
0372デフォルトの名無しさん
2008/05/28(水) 23:41:180373デフォルトの名無しさん
2008/05/28(水) 23:44:06templateの型解決はきれいな解決。どんな型でも通るわけではない。
0374デフォルトの名無しさん
2008/05/29(木) 00:27:14実行時に型が好きに変わる。
高等な union みたいなもん。
テンプレートの型解決は静的。
コンパイル時に型が決まる。
0375デフォルトの名無しさん
2008/05/29(木) 02:56:07const T* const func() const;
というのがあった時、2個目のconstの意味が分かりません。
どういう意味ですか?
0376デフォルトの名無しさん
2008/05/29(木) 03:13:10戻り値は書き換えできませんよ、って意味。
でも、戻り値は a + b の結果と同じように、元々別のルールで書き換えできないから
あんまり意味は無い。
戻り値の型がクラス型だと、少しは違いが出る。でもやっぱりそんな違いを利用した
コードは書かないほうがいいんで、総じて意味が無い。
0377デフォルトの名無しさん
2008/05/29(木) 04:17:35それだと、一個目のconstがあるから二個目のconstは必要bネくないですか=H
0378デフォルャgの名無しさん
2008/05/29(木) 04:22:59メンバ変数を参照することはあっても変更はしない、
という意味
0379デフォルトの名無しさん
2008/05/29(木) 04:25:06その2つは修飾している先が違うから、片方がもう一方のかわりになったりはしない。
一個目の const はポインタの指す先の値に付く const 。
二個目の const はポインタの値に付く const 。
0380デフォルトの名無しさん
2008/05/29(木) 05:29:50一番左のconstは構文上の利便性のために特別扱いされてる。
「const T* const」は
「T const * const」と解釈される。
constは左結合。
T ←const(実体がconst) * ←const(ポインタ値がconst)
※別の例
char * * const a = NULL;
a = NULL; //コンパイルエラー
char * const * b = NULL;
*b = NULL; //コンパイルエラー
0381デフォルトの名無しさん
2008/05/29(木) 06:19:100382デフォルトの名無しさん
2008/05/29(木) 06:34:492番目の位置にconstを書いてみると分かるよ。
const char const * p; // (VC++2005) warning C4114: 同じ型の修飾子が 2 度以上使われています。
0383デフォルトの名無しさん
2008/05/29(木) 06:50:34typedef const char cchar ;
const cchar c = 0;
こういうのはアリなんだ。constつけれた方が分かりやすいから?
0384デフォルトの名無しさん
2008/05/29(木) 07:07:310385デフォルトの名無しさん
2008/05/29(木) 08:39:54参照やポインタ返しの場合は書き換えを禁止できる点で有効。
0386デフォルトの名無しさん
2008/05/29(木) 08:51:52そうだったのか!いままで法則性をさっぱり見つけられなくって難儀してたとよ。
0387デフォルトの名無しさん
2008/05/29(木) 08:53:56これはインスタンスのメンバをキャッシュ参照で済ませても良いよという事をコンパイラに伝える役割を持っている。
0388387
2008/05/29(木) 08:54:350389デフォルトの名無しさん
2008/05/29(木) 10:47:381.00000000002とか出たときに、
この2の部分を消したい(小数点以下11桁以降を0にしたい)
のですが、何か方法ありますでしょうか?
0390デフォルトの名無しさん
2008/05/29(木) 11:19:56表示の問題?それとも数を変更する問題?後者なら正確には不可能。
double に 10 進法である桁以降完全に 0 にするという概念は無いから。
近似的には 10^10 かけて floor して 10^-10 かけるとかの関数書くとか。
0392デフォルトの名無しさん
2008/05/29(木) 11:36:11こんな方法もあるよ
#include<stdio.h>
#include<math.h>
int main(void){
double x=1.234567890123456789;
printf("%.12f\n", x);
x-=fmod(x, 1e-10);
printf("%.12f\n", x);
return 0;
}
0394デフォルトの名無しさん
2008/05/29(木) 14:00:26<string , クラス>のときは、未使用の判別はどうやれば良いですか?
0395デフォルトの名無しさん
2008/05/29(木) 14:03:38デフォルトコンストラクタで初期化されてる。判別できるかどうかはクラスによる。
int だって、未使用の場合と 0 を入れた場合は判別できないね。
0396デフォルトの名無しさん
2008/05/29(木) 14:05:06> もし存在しないキーを指定してアクセスした場合には、そのキーを自動的に登録します。
> その キーに対応する値は、その値の型のデフォルトコンストラクタによって初期化されます。
0397デフォルトの名無しさん
2008/05/29(木) 14:06:19トンクス! 自分で作るクラスなので判別できるように設定したいと思います。
0398デフォルトの名無しさん
2008/05/29(木) 14:22:280399デフォルトの名無しさん
2008/05/29(木) 14:28:38全部map::operator[]で済まそうとして、本来遭遇しなくていい問題に遭遇している気がする。
「見るだけなのに要素が生成されちゃう。困ったなぁ」みたいな。
0400デフォルトの名無しさん
2008/05/29(木) 14:52:490401デフォルトの名無しさん
2008/05/29(木) 17:52:27Visual C++ で作成したDLLからその配列要素に書き込んだり、読み込んだりすることは出来るの?
もちろん、Visual Basic 6.0で起動中にそのDLLを使います。
今はVisual Basic 6.0を使っていますが、これからVisual C++を勉強する自分にとってまだDLLがよく分からないので、
よろしくお願いします。
0402デフォルトの名無しさん
2008/05/29(木) 18:42:26できる。ここに書いてあることはVB6と今のVC全部でも通用する。
http://support.microsoft.com/kb/410837/ja
0403デフォルトの名無しさん
2008/05/29(木) 19:28:16技術的な問題じゃないんですが、CD付属のものを使わずに、C言語を扱える環境をつくれませんか?
0404デフォルトの名無しさん
2008/05/29(木) 19:33:21サンクス。
あと、インターネットからのホームページのHTMLデータを収得する方法がわかりましたら、
これもよろしくお願いします。
今はVB6で収得していますがチョット時間がかかるため、C++に移植したいので。
0405デフォルトの名無しさん
2008/05/29(木) 19:56:46ここをサポートセンターと勘違いしない方がよい。
0406デフォルトの名無しさん
2008/05/29(木) 19:58:300407デフォルトの名無しさん
2008/05/29(木) 20:25:26わからないならレスしないで下さい。スレが汚れます。
せっかく他の人はいい人なのに。
0408デフォルトの名無しさん
2008/05/29(木) 20:32:46多分>>405は方法を知っているんだと思うよ
とりあえず、>>404はWinsockとHTTPでググれ・・・っと
0409デフォルトの名無しさん
2008/05/29(木) 20:34:020410デフォルトの名無しさん
2008/05/29(木) 21:40:43みなさん、ありがとう。
勉強する糸口がみえました。
>>409
他に早く処理できる方法があるんですか?
VB6でやっている自分としては、C++でやった方が早いと思ったので。
0411デフォルトの名無しさん
2008/05/29(木) 22:12:450412デフォルトの名無しさん
2008/05/29(木) 22:20:20system
spawn
exec
CreateProcess
0414デフォルトの名無しさん
2008/05/29(木) 22:31:36もし、ネットワーク回線がボトルネックなら、
VCで書き換えても劇的に速くなるということはないぞ。
0415デフォルトの名無しさん
2008/05/29(木) 22:45:28参考までに同一回線&PCで、
4000ページを取込処理した場合、
自分で作ったVB6だと80秒。
他人の作ったC++だと25秒。
ということでボトルネックはプログラム手法。
だったら作った他人に聞けということはナシね。
0416デフォルトの名無しさん
2008/05/29(木) 22:48:350417デフォルトの名無しさん
2008/05/29(木) 22:49:130418デフォルトの名無しさん
2008/05/29(木) 22:54:28VB6は非同期で4列並列処理していて、もうこれ以上早くするのは無理かと思って。
となるとC++かなぁと思っています。
0419デフォルトの名無しさん
2008/05/29(木) 23:33:08しかも節操無くアクセスしてたらアクセス遮断されることもあるので、
程ほどに。
0420デフォルトの名無しさん
2008/05/30(金) 01:55:53ロジックのチューニングを検討しないあたりがVB育ちなのかね。
それとも十分に検討済みなのかな。
0421デフォルトの名無しさん
2008/05/30(金) 02:03:18variant 型にどんどん追加してるとかじゃないよね?
0422デフォルトの名無しさん
2008/05/30(金) 07:06:55それは知りませんでした。
となると、2コネクションにするとさらに取得時間がかかります。
>>420>>421
VB6をご存じなら分かると思いますが、
GetChunkでデータをString型でバイト配列または文字列として取得しているだけです。
0423デフォルトの名無しさん
2008/05/30(金) 09:37:00うーん
0424デフォルトの名無しさん
2008/05/30(金) 11:35:28あとVC++の一部にアセンブラを入れられますか?
0425デフォルトの名無しさん
2008/05/30(金) 11:38:46入れられます
0426デフォルトの名無しさん
2008/05/30(金) 11:58:58迷ってます。本だとpairといえばmapだったのですが、vectorの方が使い慣れているし
便利な感じがしてます。どういう基準でmapとvectorを使い分ければよいですか?
0427デフォルトの名無しさん
2008/05/30(金) 12:14:18配列を作りたいなら配列を使えばOK。
伸縮できる配列が欲しいならvectorを使えばOK。
pairの中身がkeyとvalueの対応関係があって(複数のpairでkeyが重ならな
い)、「keyに対応するvalueを取りだす」のような操作が必要ならmap。
0428デフォルトの名無しさん
2008/05/30(金) 12:15:07メモリ効率重視・末尾に追加のみならstd::vector
0429デフォルトの名無しさん
2008/05/30(金) 12:59:16ということなら、dequeでその場を凌いでしまうのも手かなぁ。
0430デフォルトの名無しさん
2008/05/30(金) 13:11:120431デフォルトの名無しさん
2008/05/30(金) 13:13:30MultiThread
0432デフォルトの名無しさん
2008/05/30(金) 13:16:330433デフォルトの名無しさん
2008/05/30(金) 13:28:27ボタンにループ処理はありません。
0434デフォルトの名無しさん
2008/05/30(金) 13:41:33>>430みたいな「まったく言えてない」質問に、こちら側で徹底的に頭を回して答えてあげるのは、
「たまたま動いてるだけのコード」を見てる時みたいな、得も言われぬ不安がわいてくるなぁw
適当にエラーを出して、回答できねえよと言ってあげるのが、長い目で見れば本人のためだと思う。
0435デフォルトの名無しさん
2008/05/30(金) 13:45:300436デフォルトの名無しさん
2008/05/30(金) 13:51:59メッセージハンドラ内でループして
他のメッセージが処理されずにウィンドウが固まっていると予想。
なので俺も >>431 だと思う。
他の方法として、WM_TIMER(OnTimer)で
ループ一回分の処理だけ進め、
一旦抜ける、というのを繰り返す。
0437デフォルトの名無しさん
2008/05/30(金) 14:04:41ありがとうございます。
0438デフォルトの名無しさん
2008/05/30(金) 14:59:41stringstream ss;
ss << "0123456789";
const char* p;
p = ss.str().c_str();
cout << p[2];
みたいにすると、ちゃんと2が出力されるのですが
ss.str.c_str()
はss.str()で生成した一時オブジェクトのポインタを返しているのに、なぜちゃんと2が出力されるんでしょうか??
ss.str()で生成した一時オブジェクトは、その部分を過ぎたら消えてしまうのではないかと思っていたのですが、違うのでしょうか??
0439デフォルトの名無しさん
2008/05/30(金) 15:15:12解放されたメモリというのは、以前に書き込まれていたデータがしばらくそのまま残っていることが多い。
なぜなら解放時にわざわざデータを消すっていうのは時間がかかるので。
ただし、後で誰かがどこかで何かのためにメモリをnewやmallocで確保したとき、その解放されたメモリが再利用される。
その「後で」「誰かが」「どこかで」の把握は基本的に無理なので、たまたまそのときはまだデータが残ってるかもしれないが、いつ再利用され他の用途に使われ内容が書き換えられるかわからない。
そういうわけで、解放されたメモリには触ってはいけない。
0440デフォルトの名無しさん
2008/05/30(金) 15:19:100441デフォルトの名無しさん
2008/05/30(金) 15:22:24「有効でなくなる」のと「値が残っている」のとは違う。
殊にポインタの場合、ポイント先が生きていようと死んでいようとアクセスできればデリファレンスしてしまう。
一時的なオブジェクトは恐らくスタックフレームに作られているはずなので、他の一時的なオブジェクトが
作られたときにでも上書きされるだろう。
例えば、私の環境ならこれで"2"ではなく"c"が(その前の出力と並んで)出力される。
--
stringstream ss;
ss << "0123456789";
stringstream sss;
sss << "abcdefg";
const char* p;
p = ss.str().c_str();
cout << sss.str().c_str()[2];
cout << p[2];
0442デフォルトの名無しさん
2008/05/30(金) 15:45:33Error: 外部シンボル 'myclass::set_a(int)' が未解決
Error: 外部シンボル 'myclass::get_a()' が未解決
ってエラーが出て、これのコンパイルが通らないんだ。
//main.cpp
#include "myclass.h"
int main(){
myclass ob1, ob2;
ob1.set_a(10);
ob2.set_a(99);
cout << ob1.get_a() << "\n";
cout << ob2.get_a() << "\n";
return 0;
}
0443442続き
2008/05/30(金) 15:46:10#include <iostream>
using namespace std;
class myclass{
int a; //private なメンバ変数
public:
void set_a(int num);
int get_a();
};
//myclass.cpp
#include "myclass.h"
void myclass::set_a(int num){
a = num;
}
int myclass::get_a(){
return a;
}
理由がよく分からないんだが、先輩方、この小僧にご教授くださいませんか
0444442
2008/05/30(金) 15:53:49どうやら、使っていた環境の設定をしてなかったみたいだorz
0445デフォルトの名無しさん
2008/05/30(金) 19:56:02#ifndef GUARD_myclass_h
#define GUARD_myclass_h
// ヘッダ本体
#endif
って書こう。でないとすぐにリンカが文句を・・・。
■ このスレッドは過去ログ倉庫に格納されています