【初心者歓迎】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
0756デフォルトの名無しさん
2008/06/08(日) 13:19:11勝手に、インクルードのパス変えてみたりフォルダの構造変えてみたり・・・
聴いてみれば、あれがなかったからかえてみた。とか、パスを通すの面倒だからコピーしたとか・・・・
どんな経験者でも、他人が作ったプロジェクトのどこにノウハウが隠れているか分からないものを変更するのは細心の注意が必要なのにな。
0757デフォルトの名無しさん
2008/06/08(日) 13:37:33>ソリューションのビルドをすると1 失敗となってしまいます
ビルドエラー時にもっと詳細なメッセージが出ているはずだけど、それについて調べる努力はした?
自分にとって意味不明なメッセージはスルー?
>>753も書いているけど、失敗というだけでなくもっと詳細な情報を出さなければ回答してもらえないよ。
たぶんこのスレで聞く様な問題ではなく、visual stdioとかそっち系を探すべきだとは思うけど。
0758750
2008/06/08(日) 13:54:49すみません
エラーが多いので環境自体が整ってないのかと思っていました。
長いのでttp://uproda.2ch-library.com/src/lib030582.txt
スレ違いのようでしたら移ります。
0759デフォルトの名無しさん
2008/06/08(日) 14:13:530760デフォルトの名無しさん
2008/06/08(日) 14:18:09d:\gsplayer\libmad\libmad.c(2) : fatal error C1083: include ファイルを開けません。'windows.h': No such file or directory
0761デフォルトの名無しさん
2008/06/08(日) 15:42:11++a; /* lvalue required as increment operand */
printf("%p", &a);でアドレスは取れるのにもかかわらず、このaは左辺値じゃないんですか?
0762デフォルトの名無しさん
2008/06/08(日) 15:43:040763デフォルトの名無しさん
2008/06/08(日) 15:49:24lvalueでもmodifiableなものとそうでないものがある。
その例のほかに、たとえばconst修飾されたlvalueはmodifiableでない。
0764761
2008/06/08(日) 16:00:36代入が不可能である時点でインクリメントが出来ないんだろうなという気はするんですが、
>lvalue required as increment operand
というような表現なんで不思議に思ったのですよ
>>763
じゃあこのエラーメッセージは罠で、
aが変更不可能な変数であることがポイントって事なんでしょうか?
0765デフォルトの名無しさん
2008/06/08(日) 16:06:37char a[] は、
char* const a だと思っておけ。
0766デフォルトの名無しさん
2008/06/08(日) 16:14:06The pointer shall be created explicitly, using the unary & operator, or
implicitly using a non-type template parameter of pointer type, or using
an expression of array (4.2) or function (4.3) type.
このルールで右辺値じゃないけど&でポインタをとれる
0767デフォルトの名無しさん
2008/06/08(日) 16:15:13そもそもa[0]などがlvalueであって、a自体はlvalueではないだろ。
&演算子が使えるかどうかはlvalueであることとは無関係では?
0768デフォルトの名無しさん
2008/06/08(日) 16:18:320769デフォルトの名無しさん
2008/06/08(日) 16:18:44lvalue の解釈を「アドレスが取れるもの」とせずに、素直に「代入式の左辺に置けるもの」と
考えておけば何も問題ないエラーメッセージじゃないか?
0770768
2008/06/08(日) 16:19:34modifiableでないlvalueだ
0771デフォルトの名無しさん
2008/06/08(日) 16:25:07左辺値なら何でも代入可能とは限らない。
0772デフォルトの名無しさん
2008/06/08(日) 17:58:07#include <bitset>
#include <boost/lambda/lambda.hpp>
#include <boost/cstdint.hpp>
int main() {
double d=1.0;
std::bitset<64> b(*((boost::int64_t *) &d));
namespace bl=boost::lambda;
for (int i=0; i < b.size(); ++i)
std::cout << b[i];
}
doubleのビット表現をbitsetにぶちこむ為に一時変数使ってポインタのキャストしてるんですが
こういう面倒臭いことせずに
std::bitset<64> b( foo(1.0) );
みたいに一発でできる方法ってないですかね?
0773デフォルトの名無しさん
2008/06/08(日) 18:16:38std::string("0110110101")みたいな
0774デフォルトの名無しさん
2008/06/08(日) 18:48:03一時変数を使うほうが分かりやすいと思うぞ。
reinterpret_cast<boost::uint64_t const&>(static_cast<double const&>(1.0))
そもそも標準のbitsetでは、コンストラクタが
773も言っているstringを取るやつと、unsigned longを取るやつ、
あとコピーコンストラクタしかないからうまくいかなくても知らないぞ。
0775デフォルトの名無しさん
2008/06/08(日) 19:00:00double型を引数としてビット表現を文字列表記したstd::string型を返す関数fooを用意すれば
>std::bitset<64> b( foo(1.0) );
という風にかけるんじゃない?
以下は適当に書いてみた。テストもコンパイルもしてない。
template<typename T>
std::string foo(T d)
{
char buf[sizeof(T)];
for (int i= 0 ; i < sizeof(T) ; i++)
{
buf[i] = *(reinterpret_cast<char*>(&d))[i/8] & (0x80 >> i%8);
}
return std::string(buf);
}
0776デフォルトの名無しさん
2008/06/08(日) 19:00:53○ (reinterpret_cast<char*>(&d))
0777デフォルトの名無しさん
2008/06/08(日) 20:13:530778デフォルトの名無しさん
2008/06/08(日) 20:16:040779デフォルトの名無しさん
2008/06/08(日) 20:30:490780デフォルトの名無しさん
2008/06/08(日) 21:35:470781デフォルトの名無しさん
2008/06/08(日) 23:46:000782デフォルトの名無しさん
2008/06/08(日) 23:47:520783デフォルトの名無しさん
2008/06/08(日) 23:50:170784デフォルトの名無しさん
2008/06/08(日) 23:51:520785デフォルトの名無しさん
2008/06/09(月) 00:02:360786デフォルトの名無しさん
2008/06/09(月) 00:10:190787デフォルトの名無しさん
2008/06/09(月) 00:18:270788デフォルトの名無しさん
2008/06/09(月) 00:19:080789デフォルトの名無しさん
2008/06/09(月) 00:19:540790デフォルトの名無しさん
2008/06/09(月) 00:32:22#undef nagato
#endif
0791デフォルトの名無しさん
2008/06/09(月) 00:56:190792デフォルトの名無しさん
2008/06/09(月) 01:13:110793デフォルトの名無しさん
2008/06/09(月) 01:14:500794デフォルトの名無しさん
2008/06/09(月) 01:42:570795デフォルトの名無しさん
2008/06/09(月) 23:34:24構造体の配列をユーザ関数で作って
それをメイン関数に返したいのですが可能ですか?
0796デフォルトの名無しさん
2008/06/09(月) 23:35:40staticな変数なら返してもおk
0797デフォルトの名無しさん
2008/06/09(月) 23:36:250798デフォルトの名無しさん
2008/06/09(月) 23:43:18T data[L];
};
array_wrapper<int, 10> function(){
array_wrapper<int, 10> result_value;
/* ... */
return result_value;
}
0799デフォルトの名無しさん
2008/06/09(月) 23:45:29どうすればメイン関数で使えるか分からないんです
返却値を構造体の配列の0番目の要素のアドレスにして、
メイン関数で使おうとしたら、0番目の要素以外には処理に使えなくて…
どうすれば、メイン関数ですべての構造体の配列が使えるようになりますか?
0800795
2008/06/09(月) 23:47:39使ってるのはCです
0801デフォルトの名無しさん
2008/06/09(月) 23:47:57使えるよ。
どう使えないの?
0802デフォルトの名無しさん
2008/06/09(月) 23:48:500803デフォルトの名無しさん
2008/06/09(月) 23:56:010804デフォルトの名無しさん
2008/06/09(月) 23:57:190805795
2008/06/09(月) 23:57:59printf("%d n",a[i]->num);
}
見たいな処理を関数内とメイン関数内ですると
構造体を作った関数内では表示できるんですけど
メインでは0番目の要素を処理した後に処理が止まります
0806デフォルトの名無しさん
2008/06/09(月) 23:58:570807デフォルトの名無しさん
2008/06/10(火) 00:18:560808デフォルトの名無しさん
2008/06/10(火) 11:20:430809デフォルトの名無しさん
2008/06/10(火) 11:46:51TCHAR bar = foo;
但し、桁あふれに注意。
0810デフォルトの名無しさん
2008/06/10(火) 15:12:36「char型データ(\t)int型データ(\t)int型データ(\t)double型データ(\n)」
この形式で、保存されている分(1件〜無制限)だけデータを表示させたいのですが、
char型データは最大で全角20文字で、この文字数によって表示が崩れてしまいます。
0811810
2008/06/10(火) 15:24:03氏名 英語 数学 平均
ほげ 20 21 20.5
名無しのごんべ 100 100 100.0
このように揃えたいのですが、現状だと
名前 英語 数学 平均
ほげ 20 21 20.5
名無しのごんべ 100 100 100.0
名無し 50 50 50.0
このように表示されてしまいます。
0812810=811
2008/06/10(火) 15:24:550813デフォルトの名無しさん
2008/06/10(火) 15:26:06それはchar型ではなく、char配列だろ。
と言うのはさておき、printf()を使えば済む話なのか?
printf("%20.20s\t%12d\t%12d\t%24.20g\n", string, int1, int2, double1)
0814デフォルトの名無しさん
2008/06/10(火) 15:49:51そうでした、ご指摘ありがとうございます。
printf("%40.40s\t%d\t%d\t%0.1f\n",p->name,p->english,p->mathematics,p->average);
このように記述したところ、一応揃いました。
ただこの構造体は、毎回標準入力でデータを保管していくので、氏名の文字数も毎回変わります。
その都度(全データにおけるの氏名の最大文字数)に合わせて幅を変えたいのですが、可能でしょうか?
そんなのねえよ!というのであれば、ここで諦めるのですが・・・。
0815デフォルトの名無しさん
2008/06/10(火) 16:05:56printf("%*s", 40, "string")
0816デフォルトの名無しさん
2008/06/10(火) 19:52:040817デフォルトの名無しさん
2008/06/10(火) 20:12:48VS2003のVC++のGDI+なんですが、
Font font = new Font(dc, &logfont);
とするとフォントをインスタンス化できますけど、logfontのフォント名に
"@MSゴシック" のように横に傾くフォントを指定すると、うまく指定され
ないように思われます。
たとえば
LOGFONT lf1, lf2;
lf1.lfFaceName = "@MS ゴシック"
Font* font = new Font(dc, &lf1);
font->GetLogFontW(&graphics, &lf2);
というように確認してみると、lf1には確かに"@MS ゴシック"がセットされて
いるのに、lf2には"@"が外れて"MS ゴシック"がセットされてしまいます。
私は何を勘違いしてるでしょうか?
0818デフォルトの名無しさん
2008/06/10(火) 20:25:330819817
2008/06/10(火) 20:31:54ぷーん
それじゃ他のトコで質問してきます…
0820デフォルトの名無しさん
2008/06/10(火) 21:17:12どのように書けばいいのでしょうか
#include <iostream>
using namespace std;
class A {
public: virtual void func() { cout << "func A" << endl; }
};
class B {
public: virtual void func() { cout << "func B" << endl; }
};
enum COMMAND { FUNCA_CMD, FUNCB_CMD, EoC };
int main()
{
A a;
B b;
void (*f[EoC]) = { &a, &b };
//(*f[FUNCA_CMD])->func(); エラー
return 0;
}
0821デフォルトの名無しさん
2008/06/10(火) 21:46:35class Base {
public:
virutal void func() = 0;
}
class A : public Base {
public:
virtual void func() { cout << "func A" << endl; }
};
class B : public Base {
public:
virtual void func() { cout << "func B" << endl; }
};
int main()
{
A a;
B b;
Base* f[2] = {&a, &b};
f[0].func();
f[1].func();
}
0822デフォルトの名無しさん
2008/06/10(火) 21:53:00次は示して頂いた物をテンプレートを使って再現できないか弄ってみます。
0823デフォルトの名無しさん
2008/06/10(火) 22:01:450824デフォルトの名無しさん
2008/06/10(火) 22:28:36template < class _T >
sub( _T & t )
{
A aa;
B bb;
t F[2] = {&aa, &bb}; // error
}
int main()
{
A a;
sub ( a )
}
なんだか二度手間っぽくて面倒だし、型もBはAに出来ないと言われちゃいましたw
0825デフォルトの名無しさん
2008/06/10(火) 22:35:020826デフォルトの名無しさん
2008/06/10(火) 22:36:550827デフォルトの名無しさん
2008/06/10(火) 23:02:030828デフォルトの名無しさん
2008/06/11(水) 01:37:31#include <iostream>
template < class T >
class test
{
friend std::ostream& operator<< ( std::ostream& os, test< T > t );
public:
void set( T val ) { x = val; }
private:
T x;
};
template < class T >
std::ostream& operator<< ( std::ostream& os, test< T > t )
{
os << t.x;
return os;
}
↑のようにfriend宣言したとき、
int main()
{
test< int > t;
t.set( 5 );
cout << t << endl;
}
とするとエラーが出るのですがなぜでしょう・・・。orz
テンプレートクラスでなければ問題なく動くのですが・・・。
0829デフォルトの名無しさん
2008/06/11(水) 02:01:02template < class T >
class test
{
friend template< class U > std::ostream& operator<< ( std::ostream& os, test< U > t );
public:
void set( T val ) { x = val; }
private:
T x;
};
本当は知らない。
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();
}
って呼び方あってる?
■ このスレッドは過去ログ倉庫に格納されています