【初心者歓迎】C/C++室 Ver.54【環境依存OK】
レス数が900を超えています。1000を超えると表示できなくなるよ。
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
0830デフォルトの名無しさん
2008/06/11(水) 02:02:03エラーメッセージぐらい貼ろうぜ。
どうせ friend の <> なんだろうけど。
0831デフォルトの名無しさん
2008/06/11(水) 02:08:06エラーメッセージは「エラー」という意味しか持たないものだから、
どういうエラーが出たかを書くという行為にまったく意味を見出せないんだろうね。
いつか胃ガンにでもなった時、「病気である」とだけ解釈してどういう病気かまったく興味を持たず、
呑気に胃薬飲み続けて死ねばいいと思うよ。
0832デフォルトの名無しさん
2008/06/11(水) 04:30:56実行時クラッシュです・・・
0833デフォルトの名無しさん
2008/06/11(水) 04:31:19コンパイルは通るのです。
0834デフォルトの名無しさん
2008/06/11(水) 04:59:21テンプレート周りにバグ抱えてる処理系はまだまだ多いぞ
0835デフォルトの名無しさん
2008/06/11(水) 05:09:420836デフォルトの名無しさん
2008/06/11(水) 07:40:39実行時クラッシュでもエラーメッセージは出てるだろ?
そうじゃなけりゃ何を見て「実行時クラッシュ」だと思ったのさ?
0837デフォルトの名無しさん
2008/06/11(水) 08:48:19どうせ答えは>>830だろうけど。
0838デフォルトの名無しさん
2008/06/11(水) 17:11:00VC9だけど通らない
Temaplate1.obj : error LNK2019: 未解決の外部シンボル "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class test<int>)"
(??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@V?$test@H@@@Z) が関数 _main で参照されました。
C:\Documents and Settings\*****\My Documents\Visual Studio 2008\Projects\Learn1\Debug\Temaplate1.exe : fatal error LNK1120: 外部参照 1 が未解決です。
0839デフォルトの名無しさん
2008/06/11(水) 17:12:52class test {
template <class U>
friend std::ostream& operator<<(std::ostream& os, test<U> t);
public:
void set(T val ){ x = val; }
private:
T x;
};
これなら通るし正常に動く
0840デフォルトの名無しさん
2008/06/11(水) 18:19:36class Hoge{
int nhoge;
public:
operator==(Hoge hoge){
if(this->nhoge == hoge.nhoge){ return true;
}else{ return false; }
}
hoge(int nhoge){ this->nhoge = nhoge; }
}
class Hogehoge{
std::vector<Hoge> vHoge;
public:
std::vector<Hoge> getVhoge(){return vhoge;}
void push_back(Hoge hoge){vHoge.push_back(hoge);}
}
main関数以下次レス。
0841840
2008/06/11(水) 18:20:13int main(){
Hoge hoge1(1), hoge2(2), hoge3(3), hoge4(4);
Hogehoge hogehoge;
hogehoge.push_back(hoge1);
hogehoge.push_back(hoge2);
hogehoge.push_back(hoge3);
std::vector<Hoge>::iterator itrHoge;
itrHoge = std::find(hogehoge.getVhoge().begin(), <-ここがおかしい
hogehoge.getVhoge().end(),hoge2);
hogehoge.insert(itrHoge,hoge4);
return 0;
}
とかいう感じでやりたいんですが、findのところで上手くイテレータを返してくれません。
hogehoge.getVhoge()を一時変数std::vector<hoge> tmpVhogeなどに格納してから
std::find(tmpVhoge.begin(),tmpVhoge.end(),hoge2)
などとやれば動くのですが、一時変数ではなく実体を直接いじりたいのでこれだと上手くないです。
原因がおわかりになるでしょうか?また、解決策はありますでしょうか。
コンパイラはcygwinのg++です。よろしくお願いします。
0842デフォルトの名無しさん
2008/06/11(水) 18:24:35getVhogeがvHoge自身ではなくvHogeのコピーを返してるから
実体を直接いじりたいなら
std::vector<Hoge> &getVhoge(){return vhoge;}
0843840
2008/06/11(水) 18:43:31それでしたorz
とても助かりました。ありがとうございます。
Effective C++にも似たようなことが書いてあったので読んで修行します。
0844デフォルトの名無しさん
2008/06/11(水) 20:03:13ベンチマークソフトと言ったら大袈裟ですが
HDDの単純な読み書き性能テストを行える
ソフトを作ろうかと思ってます。
単純にファイルの読み書きを100回位やった
ラップタイムを計測しようと思っています。
ベンチマークソフトのHDD性能計測ってなんか
凄いロジックとか使ってるんでしょうか?
C++じゃダメで何か他の言語じゃないと
いけないとかあるんでしょうか?
アドバイスをお願いします。
0845デフォルトの名無しさん
2008/06/11(水) 20:34:25メモリ/CPUの速度を測るオチになる
0846デフォルトの名無しさん
2008/06/11(水) 20:52:020847デフォルトの名無しさん
2008/06/11(水) 21:55:06挿入が終わったあとにイテレータが指している要素が
場合によって変わってしまう現象が起こります。
具体的には
vector:12345 iterator:3 vector.insert(iterator,6)
をやったときに
vector:126345 iterator:6
となる場合と
vector:126345 iterator:3
となる場合があります。
ちなみに前者は大きめのコードを書いてcygwin g++でコンパイル、
後者は検証用に仮想マシンのvine Linux上で書いてg++でコンパイルしてます。
原因等わかりますでしょうか。
0848デフォルトの名無しさん
2008/06/11(水) 21:58:56変わるのは仕様
メモリ確保しなおすからアドレスが変わるの
イテレータセットしなおすかlist使うとかしてください
0849848
2008/06/11(水) 21:59:430850847
2008/06/11(水) 22:05:19イテレータの位置が変わるのはいいのですが、
・insertした要素を指すように変わる
・insert前に指していた要素を指すように変わる
場合が発生して、どちらかに統一されていないので困るという話です。
insert後のイテレータの位置は保障されないってだけの気もしてきました。
だとしたらなんて不便なんだvector…
0851デフォルトの名無しさん
2008/06/11(水) 22:06:340852デフォルトの名無しさん
2008/06/11(水) 22:10:53単独ならinsertの戻り値
0853847
2008/06/11(水) 22:11:03orz
ありがとうございます。
ランダムアクセスイテレータを前提にしたコードなので今更listにするわけにもいかず…。
いちいちinsertする度にfindするしかなさそうですね。遅くなりそうだ…。
0854847
2008/06/11(水) 22:15:22それだ(;´Д`)上手く行きました!どうもありがとうございます!
0855デフォルトの名無しさん
2008/06/11(水) 22:38:55って関数があったとき、
void mein() {
struct na = *ni();
}
って呼び方あってる?
0856デフォルトの名無しさん
2008/06/11(水) 22:41:39printf("A");
sleep(1);
printf("B");
}
としてもABが同時に表示されるのは何故ですか?
sleep(1) を system("sleep 1") としても同じです。
コンパイラは gcc version 4.1.2 20061021 prerelease (NetBSD nb3 20061125) です。
0857デフォルトの名無しさん
2008/06/11(水) 22:44:13AとBが重なって出るようなら端末がしぼん
0858デフォルトの名無しさん
2008/06/11(水) 22:45:17setvbuf でググるよろし
0859デフォルトの名無しさん
2008/06/11(水) 22:45:26切ってしまうか必要に応じてfflushするか、stderrに出力するか
0860デフォルトの名無しさん
2008/06/11(水) 22:45:32バッファの問題じゃないかな
printf("A");
fflush(stdout);
sleep(1);
printf("B");
ってやってみては?
0861デフォルトの名無しさん
2008/06/11(水) 22:45:40ni()の仕様による。mein()ので正しい場合もある。
>>856
printf()の出力がバッファリングされているから。間にfflush(stdout)
とか入れると意図どおりになるかと。
0862デフォルトの名無しさん
2008/06/11(水) 23:05:25ありがとうございます。
最近の悩みが解消した気がします。
0863デフォルトの名無しさん
2008/06/11(水) 23:16:04fgets(buff,sizeof(buff),stdin);
if(!strcmp(buff, "A\n")){
.....
}
上のプログラムで、何故かループ2週目からのfgetsでキーボードからの入力を待機せずにそのままif文に入ってしまいます。
どなたか原因を教えていただけないでしょうか(´・ω・)
0864デフォルトの名無しさん
2008/06/11(水) 23:17:01buff が小さすぎるんじゃね?
0865デフォルトの名無しさん
2008/06/11(水) 23:17:37win32API勉強中なんですが、
CreateProcess("hoge.exe",..., pInfo);
WaitForSingleObject(pInfo.hProcess, INFINITE);
DeleteFile("hoge.exe");
とやると たまに DeleteFileが失敗するときがあります。
アクセス拒否 5 を返してるようです。
まだプロセスが終了していないということなのでしょうか。
0866デフォルトの名無しさん
2008/06/11(水) 23:18:19移植性のある解決方法としては空読みして捨てるしかない
0867863
2008/06/11(水) 23:18:340869デフォルトの名無しさん
2008/06/12(木) 00:42:08DWORD dwBaudRate; // 取り得る値 9600/19200/38400
BYTE byByteSize; // 取り得る値 4/5/6/7/8
・・・ // 上記以外の5個ほどの変数
}SERIAL_PARAM;
CSerialCom::Open(SERIAL_PARAM *pParam)
{
// 引数チェック {・・・}
// dcb構造体に代入
GetCommState(hComm, &dcb);
}
上記のような型が違う可変の引数を複数チェックをする場合、
みなさんならどのように実装しますか?
ケースバイケースと言われそうな気もしてますが、
ソースコードの可読性を優先して実装案をお願い致します。
0870デフォルトの名無しさん
2008/06/12(木) 06:05:43int num;
num = min + max;
return num;
}
例えばこれだったら
int sum(int min,int max){
return min + max;
}
でもいいと思うんだけど
そうしないのが慣習なのは見やすくするため?
0871デフォルトの名無しさん
2008/06/12(木) 07:42:18構造体チェック用の関数を作る
さらに構造体メンバそれぞれについてチェック用の関数を作る
構造体自身を隠蔽して(不完全型)セッターでのアクセスしかできないようにする
C++ならセッターで制限する
0872デフォルトの名無しさん
2008/06/12(木) 08:52:53そこまで短いコードだったら下1択でいいと思うよ。
0873デフォルトの名無しさん
2008/06/12(木) 12:44:49書き方がまちまちだと気持ち悪いから統一する
自分のルールに則ってるだけ
自分ルールでOKなら下でいいんじゃないかな
複数人開発なら気持ち悪いの度合いが違うからルールを統一する
このときはルールを厳しくした方が例外出にくいから上の書き方に統一したりする
0874デフォルトの名無しさん
2008/06/12(木) 13:25:05そんな慣習無いだろ。無駄だよ。
0875デフォルトの名無しさん
2008/06/12(木) 13:39:260876デフォルトの名無しさん
2008/06/12(木) 14:09:45これを実行して
性別のとこで1と入力しても結果が「性別不明」になってしまいます
どうしてですか?
0877デフォルトの名無しさん
2008/06/12(木) 14:11:05ありがとうございます
もし誰かと何か作ることになったら周りの人に合わせる感じでいきます
0878デフォルトの名無しさん
2008/06/12(木) 14:17:42最初の if 文の条件が成立してもしなくても、2番目の if 文が実行されるから
0879デフォルトの名無しさん
2008/06/12(木) 14:21:32解決しました
ありがとうございます
0880デフォルトの名無しさん
2008/06/12(木) 14:24:490881デフォルトの名無しさん
2008/06/12(木) 14:30:58「コンテナ」として同様に扱うことができるようにするため。
このための要件はコンセプトとして定義されている。
http://www.sgi.com/tech/stl/Container.html
0882デフォルトの名無しさん
2008/06/12(木) 14:31:49「vectorとかと同じメソッド」というのは「コンテナと同じメンバ関数」という意味だろうけど、
「同じ」というのは関数名のこと? 機能まで含めてのこと?
0883デフォルトの名無しさん
2008/06/12(木) 16:35:31どちらの場合も同じような寿命を持つ気がするのですが、区別するべきですか?
0884デフォルトの名無しさん
2008/06/12(木) 16:38:360885デフォルトの名無しさん
2008/06/12(木) 16:45:220886デフォルトの名無しさん
2008/06/12(木) 16:51:230887デフォルトの名無しさん
2008/06/12(木) 18:28:04ある処理の実行時間を計測しようと思い、次のようなコードを書いたのですが、うまく動きません。
int main()
{
s=GetTickCount();
{ // 処理 }
e=GetTickCount();
cout << s; cout << e; cout << e-t << endl;
return 0;
}
このようなコードをコンパイル、実行すると、sとeが一致してしまいます。
一体なぜなのでしょうか?
どなたか、ご回答よろしくお願いします。
0888デフォルトの名無しさん
2008/06/12(木) 18:42:37試しに処理のとこにSleep()入れてみては
0889887
2008/06/12(木) 19:21:15GetTickCountで時間を取得するタイミングをずらしても計測できました。
でも、
s=GetTickCount();
{ // 処理 }
e=GetTickCount();
みたいにすると、計測できません。
一体なぜ?
極端に短い時間で処理が終了した?
うーん…。
とにかく、ご回答下さった皆さん、ありがとうございました。
0890デフォルトの名無しさん
2008/06/12(木) 19:27:020891デフォルトの名無しさん
2008/06/12(木) 21:10:50明確なメリットってあるの?
0892デフォルトの名無しさん
2008/06/12(木) 21:19:50C++的には「非推奨」なんで将来なくなるかも知れない
現実にはありえないだろうけど
0893デフォルトの名無しさん
2008/06/12(木) 21:29:44最適化で、無意味処理として削られたんじゃないの?
ちなみにSleep()は削られないから測定可能。
0894デフォルトの名無しさん
2008/06/12(木) 21:55:04使ったらいいんじゃね?
SetPriorityClass()で他のプロセスの影響を最小限に
抑えておかないと測定の度にバラツキが出やすいけど
0895デフォルトの名無しさん
2008/06/12(木) 23:39:48C++です。プリプロセッサでsizeof(int)に応じて新しい型を定義したいのですが、
こういうことって不可能なんでしょうか?
0896デフォルトの名無しさん
2008/06/12(木) 23:41:13クラスなど、無名名前空間にできてstaticでは不可能な
ものがあるということが大きな違いだと俺は思っている。
もともとの趣旨はstaticを静的確保の意味だけにする
(可視性制御の意味をなくす)ということだったと思うけど。
0897デフォルトの名無しさん
2008/06/12(木) 23:43:06struct hoge;に対してsizeof(hoge)の結果を任意に決めたいってこと?
0898895
2008/06/12(木) 23:48:34いえ、例えば
#if sizeof(int) == 4
#define int32 int
#elif sizeof(int) == 8
#define int64 int
#else
#error("unsupported")
#endif
といったような感じです。通りませんけど。
0899デフォルトの名無しさん
2008/06/12(木) 23:51:08目的がよく分からないんだけど
int と書いたほうが処理速度が速くなるんじゃなくて
処理速度が速いものが int だと思ったほうがいいよ
0900デフォルトの名無しさん
2008/06/12(木) 23:51:40intのサイズは処理系依存で、大抵はその処理系のヘッダファイルにサイズ保証の整数型がtypedefされている。
0901895
2008/06/12(木) 23:54:58まあ上の例はただの例なんですけど、
やっぱりできないみたいなのでまた別の方法を考えてみます。
どうもありがとうございました。
0902デフォルトの名無しさん
2008/06/12(木) 23:56:060903デフォルトの名無しさん
2008/06/12(木) 23:56:400904デフォルトの名無しさん
2008/06/12(木) 23:58:340905デフォルトの名無しさん
2008/06/13(金) 00:00:49レスありがとうございます。
以下の認識でOKですか?
>構造体チェック用の関数を作る
>さらに構造体メンバそれぞれについてチェック用の関数を作る
→bool CSerialCom::CheckParam(SERIAL_PARAM *pParam) { bool ret = checkBaud(pParam->dwBaudRate); ...}
>構造体自身を隠蔽して(不完全型)セッターでのアクセスしかできないようにする
>C++ならセッターで制限する
→bool CSerialCom::Open() {}
bool CSerialCom::SetParam(void *pParam) {... m_Param = *(SERIAL_PARAM *)pParam) ...}
0906デフォルトの名無しさん
2008/06/13(金) 00:04:33型のサイズに応じて別な型をtypedefするってことなら
まさにテンプレートの領域じゃないか?
selector<sizeof(hoge)>::fuga_type fuga; // hogeのサイズによってfugaの型が変わる
0907デフォルトの名無しさん
2008/06/13(金) 00:45:050908デフォルトの名無しさん
2008/06/13(金) 00:54:360910905
2008/06/13(金) 01:17:46早々のご回答ありがとうございます。
便乗して追加質問よいですか?
>構造体自身を隠蔽して(不完全型)セッターでのアクセスしかできないようにする
>C++ならセッターで制限する
無学で申し訳ないですが、上記2案の差分がモヤモヤしてました。
もう少し詳しく意見をいただけませんか?(サンプルコードがあると助かります)
0911871
2008/06/13(金) 01:46:02Cの場合には不完全型にしないと隠蔽できないから
// ----- hoge.h -----
typedef struct tagSerialParam SERIAL_PARAM;
SERIAL_PARAM *hoge_alloc(void);
void hoge_free(SERIAL_PARAM *param);
int hoge_BaudRate_set(SERIAL_PARAM *param);
// ----- hoge.c -----
#include"hoge.h"
struct tagSerialParam {
DWORD dwBaudRate; // 取り得る値 9600/19200/38400
BYTE byByteSize; // 取り得る値 4/5/6/7/8
・・・ // 上記以外の5個ほどの変数
};
static const DWORD dwBaudRateList[]={9600, 19200, 38400};
SERIAL_PARAM *hoge_alloc(void){
SERIAL_PARAM *param;
param=malloc(sizeof(*param));
param->dwBaudRate=dwBaudRateList[0];
param->... // 色々有効範囲内になるよう初期設定
return param;
}
int hoge_BaudRate_set(SERIAL_PARAM *param, DWORD dwBaudRate){
int i;
for(i=0;i<ARRAY_SIZE(dwBaudRateList);i++)
if(dwBaudRate==dwBaudRateList[i]){
param->dwBaudRate=dwBaudRate;
return 1;
}
return 0;
}
0912デフォルトの名無しさん
2008/06/13(金) 10:36:26自分はBorland C++ CompilerってのとBCC Developer 1.2.21使ってるんですが
勉強になるかもしれないし他のやつ使ってみたいです
0913デフォルトの名無しさん
2008/06/13(金) 11:17:42VC++ Express (コンパイラとエディタとその他もろもろのセット)とか。
GCC と Emacs とか。
0914デフォルトの名無しさん
2008/06/13(金) 12:21:33エディタとしてインストールするのもありだな。これはいいこと聞いた
0915デフォルトの名無しさん
2008/06/13(金) 12:42:37テンプレートを使うメリットと言うのは何になるんでしょうか。
自分なりに考えた結論としては下記のような感じなんですが
・コードを書く量が少なくて済む
・変数を扱う場合、型を指定しなくて良いので柔軟に出来る
0916デフォルトの名無しさん
2008/06/13(金) 12:45:44目的も効果も違う2つを比べる意味がわからない。
何をするときの話?
0917デフォルトの名無しさん
2008/06/13(金) 12:45:48比べるものではないと思うけど。
0918デフォルトの名無しさん
2008/06/13(金) 12:52:16ありがとうございます
0919デフォルトの名無しさん
2008/06/13(金) 13:25:53どんなときにテンプレートを使ったりするんでしょうか
0920デフォルトの名無しさん
2008/06/13(金) 13:28:13とりあえず Google に聞いてみろ。ひとつでも解説ページを見れば同じ物だなんて思わないはずだから。
0921デフォルトの名無しさん
2008/06/13(金) 17:36:35昔から愛用していたVC6.0製品版から、このたびVC9.0(VS2008)の無料版に乗り換えました。
VC6.0用のプロジェクトを9.0用に変換し、コンパイルを通したのですが、実行速度にだいぶ差があるように見えます。
単純なファイルコンバータプログラムなのですが、だいたい9.0版のほうが1.5倍程度時間がかかります。
両方最適化をONにしていますし、ソースも当然同一のものです。
時代が経過して性能が下がったというのは不思議なのですが、そんなものなのでしょうか?
2008質問スレで聞こうかと思ったのですが、そういうスレがなかったのでここで質問させていただきました。
よろしくお願いします。
0922デフォルトの名無しさん
2008/06/13(金) 17:48:28コンパイラオプション調べて弄ってみろとしか言えない。
0923デフォルトの名無しさん
2008/06/13(金) 17:50:25まぁ、2008のスレはあるけどね。
0924デフォルトの名無しさん
2008/06/13(金) 17:52:33以前libc.lib(シングルスレッド版のCランタイム)を使っていたのなら、
マルチスレッド版ランタイムを使うようになったためである可能性が高いかな。
libc.libはVC7.1以前のデフォだが、VC8以後は無くなって、現在は
マルチスレッド版のCランタイムしかない。マルチスレッド版ランタイムは
デフォで排他制御を行うので、何も考えずにgetc()のようなものを使うと
パフォーマンスへの影響がデカい。
一応その対策として、_getc_nolock()のような関数が用意されているんだが。
MSDNの「マルチスレッドライブラリのパフォーマンス」の項目を
参照。
ttp://msdn.microsoft.com/ja-jp/library/ms235505(VS.80).aspx
0925デフォルトの名無しさん
2008/06/13(金) 18:02:18>>922
なるほど。確かにそのとおりです。オプション調べてみます
>>923
2008スレ自体はあったのですが、なんだかピリピリしていて・・・
>>924
あ、ほんとですね。マルチにさせられてます。
リンク先を読んで、改良してみようと思います。
シングルスレッド版のころそのもののスピードはでなくても、近い速度が出るといいなぁ
ありがとうございました。
改良してテストしたら、また報告に伺います
0926デフォルトの名無しさん
2008/06/13(金) 18:07:52とりあえず #define _CRT_DISABLE_PERFCRIT_LOCKS しとけば、ファイルアクセスは全部nolock版使うよ
とあったので速攻試せました。
速度はがっつりあがり、VC6.0版の半分程度の時間で処理が終わるようになりました。
やっぱり最適化の部分は進化してたんですね!
アドバイスありがとうございました。
0927デフォルトの名無しさん
2008/06/13(金) 18:18:00今までvectorに追加した文字列全てを
ひとつの文字列にして返す関数が欲しくて
以下のように書いたのですが
vector<const char*> ログ;
char* ログ追加・取得(const char* getstr)
{
ログ.push_back(getstr);
char logs[1000];
for(int i = 0; i<ログ.size() - 1 ; ++i)
{
strcat(logs,ログ[i]);
}
return logs;
}
strcatのところで入力した文字が化けてしまいます
どこがまずいでしょうか?
0928デフォルトの名無しさん
2008/06/13(金) 18:20:080929デフォルトの名無しさん
2008/06/13(金) 18:28:53・ローカル変数を返してどーする
レス数が900を超えています。1000を超えると表示できなくなるよ。