【初心者歓迎】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
0809デフォルトの名無しさん
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();
}
って呼び方あってる?
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:36レス数が900を超えています。1000を超えると表示できなくなるよ。