1 :デフォルトの名無しさん:2011/06/15(水) 11:47:04.75
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ
01 http://pc11.2ch.net/test/read.cgi/tech/1167476845/
02 http://pc11.2ch.net/test/read.cgi/tech/1178503366/
03 http://pc11.2ch.net/test/read.cgi/tech/1187521676/
04 http://pc11.2ch.net/test/read.cgi/tech/1221633708/
05 http://pc11.2ch.net/test/read.cgi/tech/1230516307/
06 http://pc11.2ch.net/test/read.cgi/tech/1231564903/
07 http://pc11.2ch.net/test/read.cgi/tech/1232983248/
08 http://pc12.2ch.net/test/read.cgi/tech/1235921779/
09 http://pc12.2ch.net/test/read.cgi/tech/1240022781/
10 http://pc12.2ch.net/test/read.cgi/tech/1242300936/
11 http://pc12.2ch.net/test/read.cgi/tech/1245059383/
12 http://pc12.2ch.net/test/read.cgi/tech/1248010352/
13 http://pc12.2ch.net/test/read.cgi/tech/1260842197/
14 http://pc12.2ch.net/test/read.cgi/tech/1269273471/
15 http://pc12.2ch.net/test/read.cgi/tech/1273368706/
16 http://hibari.2ch.net/test/read.cgi/tech/1279285647/
17 http://hibari.2ch.net/test/read.cgi/tech/1285115590/
18 http://hibari.2ch.net/test/read.cgi/tech/1291571263/

5 :デフォルトの名無しさん:2011/06/17(金) 20:52:41.40
矢印キーが押されたかどうかを判定する関数を教えてください

8 :デフォルトの名無しさん:2011/06/18(土) 13:41:59.17
質問です。
lstrcmp()で文字列比較をしているのですが、稀に戻り値の値が間違った値になります。
具体的には、第1引数の文字列の方が辞書順で前にある場合は-1、後ろにある場合は+1が返るはずなのですが
ときどき、辞書順で前にあるはずなのに+1が返ったり辞書順で後ろにあるはずなのに-1が返ったりします。
ビルド環境はVisualStudio2005で動作環境はWindowsVista Buisiness SP2です。

VC6でビルド→WinXPで動作、VC2008でビルド→Win7で動作 の場合は
いずれも問題が起きていません。(確認した限りでは。)

lstrcmp()のかわりにCompareString()を使用しても同じ現象となります。
lstrcmp()、CompareString()ともおなじKernel32.libをインポートライブラリとして使用しているので
これが原因だったりしないかなーと思ったりしますが確証なしです。

なにか分かる方いませんでしょうか?

9 :デフォルトの名無しさん:2011/06/18(土) 15:19:35.11
strcmpでも同じ?lstrcmpは使ったこと無いが、
その異常が起こる場合のテストケースをうpすれば解決は早いだろう

10 :デフォルトの名無しさん:2011/06/18(土) 15:22:53.12
ひらがな比較してたりしないだろうな

48 :デフォルトの名無しさん:2011/06/22(水) 19:33:06.75
c_str()の有効期限は更新するまで。

49 :デフォルトの名無しさん:2011/06/22(水) 19:47:24.50
>>48
回答ありがとうございます。ただ説明が端的すぎで、もう少し補足をいただけると助かります。
「更新するまで」というのが、よくわかないのですが、
初期化、または代入時までということでしょうか?(要素や文字列を追加したらダメということ?)

63 :デフォルトの名無しさん:2011/06/23(木) 12:09:00.29
すみません。
char str[5000][800][500]; // 5000行 800項目 1個500byte
に入っている文字列をstrcatで800項目連結してはfputsして、それを5000行分行っているのですが、
大したデータ量ではないのにやたらと時間がかかってしまいます。(1回40秒くらいでしょうか・・)

もっと素早く処理するにはどうすれば良いでしょうか?

80 :デフォルトの名無しさん:2011/06/25(土) 21:48:20.84
映像のフレームを定期的に処理するプログラムを作っています。
たとえば30fpsですと33.33ミリ秒周期なので処理間隔を33ms or 34msにして1秒間あたりの
処理フレームが設定どおりにしたいと考えています。
で、間隔を33msにするか34msにするかというところの処理を書いてみたのですが、
もう少し良い書き方が無いものかご教示お願いします。

117 :デフォルトの名無しさん:2011/06/27(月) 17:56:50.25
class CManiac {
public:
bool operator<(const CManiac& rmaniac) const {
// *this が rmaniac よりも小さいという条件をコーディングし、bool 値を返す。
return b;
}
}

上の例のような,仮引数と関数定義の間にあるconst修飾子の表す意味が分かりません.
どなたかぜひ教えてください.

129 :デフォルトの名無しさん:2011/06/27(月) 23:55:46.00
char *hoge[]

char hoge[]
の違いがわかりません

131 :デフォルトの名無しさん:2011/06/28(火) 00:02:56.19
>>129
char *hoge[255]みたいな宣言だとすると
*hoge[255]=*hoge×255
hoge[255]=hoge×255

178 :デフォルトの名無しさん:2011/06/29(水) 06:05:24.05
構造体の引渡しについてですが、ネットで調べると大体こんな感じです。

struct ABC{
int x;
int y;
};

main(){         //↑メインより先に宣言しているからグローバル扱い?
struct ABC bbb;
func(bbb)
{

int func(struct ABC test)
{
test.x
test.y
}

または
int func(struct ABC *test)
{
test->x
test->y
}

でも、構造体をグローバルで宣言しているからわざわざ引数にする必要が無いと思うのですが?
グローバルでなくローカルで構造体を宣言した場合は引数として使えないようですし


234 :デフォルトの名無しさん:2011/07/01(金) 09:06:11.26
わざわざ文字列用のバッファ用意するのか

235 : 忍法帖【Lv=14,xxxPT】 :2011/07/01(金) 10:46:42.23
>>234
要らないよ。
--
int val;
sscanf("5", "%1d", & val);

237 :デフォルトの名無しさん:2011/07/01(金) 12:00:09.69
>>235
文字列になってるじゃねーかwwww
なにが「要らないよ」だよww

char型に入った文字の変換の話だよ?

238 :デフォルトの名無しさん:2011/07/01(金) 12:20:59.66
>>237
だから要らないんだって。
char foo = '5';
sscanf(& foo, 以下略
応用が利かない奴はこれだから……

324 :デフォルトの名無しさん:2011/07/05(火) 15:45:18.56
doubleをifの条件式==で使いたい

doubleは小数点以下の計算で微妙な誤差が出るっていうけど、
数値が整数のみになるように、整数のみで計算していれば誤差はでないんだろうか?

330 :デフォルトの名無しさん:2011/07/05(火) 16:25:38.15
ある程度の桁数なら普通にズレずに使えるってことでいいのかな
i=100.000004とかになると、
if(i==100)に引っかからないような気がして心配だったんだ
ありがとう

331 :デフォルトの名無しさん:2011/07/05(火) 16:36:06.58
>>330
それだと暗黙的にアップキャストされるから
if((int)i==100)とかでダウンキャストしないとだめ

332 :デフォルトの名無しさん:2011/07/05(火) 16:38:46.07
>>324 >>330
変数の中に常に整数しか入ってないのか、少数もはいる場合があるのかよくわからん。


363 :デフォルトの名無しさん:2011/07/08(金) 12:42:55.30
すみません。
SubCommon.hに書いた構造体の宣言 struct DATAPACK { int t; };
これを
DataManage.hで #include "SubCommon.h"してから
struct DATAPACK datapack_A; と実体を作ろうとすると、定義されていないと警告が出ます。

不可解な事にほぼ同じ事を別の2組のヘッダーで行うと問題なく実体が作れるのに
なぜ未定義となってしまうのでしょうか?
うっすらでも思い当たる事が有ればご指摘頂けますと幸いです。

365 :デフォルトの名無しさん:2011/07/08(金) 12:57:37.65
>>363
実はインクルードされてないのでは?
インクルードガードが邪魔してるとか。

367 :デフォルトの名無しさん:2011/07/09(土) 11:08:08.90
Cというか、プログラムの基本中の基本の質問だけど
10より↑か↓かの処理で

if(i<10){
10未満だよ;
}
if(i>10){
10以上だよ;
}



if(i<10){
10未満だよ;
}
else{
10以上だよ;
}

前者は以下のチェック→以上のチェック。
後者は以下のチェック→それ以外ならの処理

どちらも同じ動きをしてくれると思うのですが、条件は2分岐の時
ifを2つとif、else。どちらが処理が早いのでしょう?
イメージ的にはifが2つのが理解しやすいのですが、if文=処理が重いという先入観がありまして

処理速度はelseとifで大きく変わるものですか?




370 :デフォルトの名無しさん:2011/07/09(土) 11:15:27.85
無意味に速度を気にしだした初心者の臭いがする

余程のことが無い限り、速度の為にわけの分からない表記にはしるのはよせ
そしてそれをやるなら実測結果とかに基づいて行え




371 :367:2011/07/09(土) 11:22:52.93
>>370
>無意味に速度を気にしだした初心者の臭いがする
まさにその状況に陥ったので質問しました

わかりやすさ重視にしておきます


373 :デフォルトの名無しさん:2011/07/09(土) 11:25:22.83
80:20規則は小学校で必修にするべきだと思う
そうすれば日本人もくだらない無意味な節電なんてやめられる

374 :デフォルトの名無しさん:2011/07/09(土) 11:27:35.33
>>373
誤爆?
次からは気をつけろよ

425 :デフォルトの名無しさん:2011/07/10(日) 17:54:49.53

インメモリデータベースvsC++標準ライブラリコンテナ

インメモリデータベースのコードは、前回最速だったCase5を使用します。

測定結果は以下のようになりました。

http://www.sutosoft.com/room/archives/images/20070127_graph1.png
http://www.sutosoft.com/room/archives/000482.html



428 :デフォルトの名無しさん:2011/07/10(日) 18:41:18.80
>>425
大規模なデータベースでなく、CSVに毛が生えた程度の小規模のデータ郡を扱うなら
STLのLISTを駆使しろって事なのかな?

438 :デフォルトの名無しさん:2011/07/10(日) 21:27:17.87
ゲームのセーブ機能をつくろうとしているのですが
設計をどうしたら良いか悩んでいます

class ISprite
{

561 :デフォルトの名無しさん:2011/07/16(土) 11:52:57.83
×◯◯×じゃないのか?

563 :デフォルトの名無しさん:2011/07/16(土) 11:58:27.51
>>561
◯◯××じゃないのか?

567 :563:2011/07/16(土) 12:31:58.56
> a[i++] = i; は未定義って規格にも注釈があるけど、
a[i] = i, i++;

568 :デフォルトの名無しさん:2011/07/16(土) 13:37:33.41
>>567
つまんねーよ。引っ込んでろ。

574 :デフォルトの名無しさん:2011/07/17(日) 11:40:17.96
スコープに関して
そのブロックで使われなくなった時点で破棄されるのか
ブロックを抜けるときに破棄されるのか知りたいです

575 :デフォルトの名無しさん:2011/07/17(日) 11:42:08.82
STLの使い方について悩んでます
std::list<MyClass*> mylist
で行こうか、
std::list<MyClass> mylist
で行こうか。。

前者なら
MyClass * p = new MyClass();
mylist.push_back(p);
std::list<MyClass*>::iterator it = mylist.begin();
delete (MyClass *)(*it);
みたいな流れで、作成、削除ができるけど、後者だとどうなるのですか?

MyClass * p = new MyClass();
mylist.push_back(*p);
std::list<MyClass>::iterator it = mylist.begin();
delete (MyClass *)&(*it); //←じゃないよね。これだとコピーしか消せないし
delete p; //結局pが含まれるスコープで消すしかない?

アドバイスください

576 :デフォルトの名無しさん:2011/07/17(日) 11:51:55.44
>>574
ブロックを抜けるとき

>>575
後者はdeleteいらないnewする必要もない
MyClass a;
mylist.push_back(a);
これだけでいい

577 :575:2011/07/17(日) 12:03:11.39
>>576
ありがとうございます
後者を選択する場合、実体のコピーをリストに作るという思想の設計なのでしょうか?
また、取り出して値を参照したり書き換えたりする場合はどのようにすればよいのでしょうか?
MyClass & ra = (*it);
ra.x = 100;
ra.y = "abc";
みたいにやるのですか?(コンパイルできるかどうかはわかりません。机上で考えて書いてます)

連続で質問してすみませんがよろしくお願いします

614 :デフォルトの名無しさん:2011/07/22(金) 07:21:26.10
すみません。文字の書き換えを行いたいのですが上手く行かず困っています。
char text[50] = "abcdefghijklmn.og";
char *tgt;

tgt = strstr(&text[0], ".og");
if(tgt != NULL) { sprintf_s(tgt, sizeof(tgt), ".txt\0"); }

tgtのサイズより大きい文字を入れようとしてしまっているので、Buffer too smallのエラーが出るのは当然とは思うのですが・・
strstrの検索結果を、text[]の要素ナンバーに直す方法か、もっと正しいやり方があれば教えて頂けますと助かります;

622 :デフォルトの名無しさん:2011/07/23(土) 15:23:16.52
「KEY=VALUE」みたいな行が複数あるテキストファイルを行単位で読み込んで、
map(string, string)にkeyとvalueを分けて挿入したいんですが、C言語のstrtokのように新しいbasic_stringを生成せずに、
文字列のRangeだけ渡して生成する、みたいなことはできないんでしょうか?

map<string, string> config_map;
ifstream config_is(".config");
string line;
string::size_type index = 0;

while (getline(config_is, line)) {
  if ((index = line.find("=")) == string::npos) {
    continue;
    // line[index++] = '\0'; // C言語でやると←↓のような感じになることをC++でやりたい。substrではなく。
    // config_map.insert(map<string, string>::value_type(line, line[index]));
  }
}


626 :デフォルトの名無しさん:2011/07/23(土) 16:14:58.16
>>622
stringのコンストラクタ見たらなんとでもなるんじゃないのか


629 :デフォルトの名無しさん:2011/07/23(土) 16:23:55.18
>>622
>「KEY=VALUE」みたいな行が複数あるテキストファイル
それiniファイルの書式だから
所謂MBCSの扱いでいいならboostかwindowsならapi使えば?
win32apiなら予めUnicodeにしておけばそのままwstringに入れられるし

634 :デフォルトの名無しさん:2011/07/23(土) 20:15:37.03
アセンブリコード吐かせてみればわかるけど、両方とも似たようなコードに
コンパイルされる。switchはジャンプテーブル使ったジャンプにはならない。

636 :デフォルトの名無しさん:2011/07/23(土) 20:41:11.93
>>626
詳しく教えてもらえますか?

>>629
それもありなんですが、C++を覚えている最中で、
C言語で出来る一番効率がいい方法(文字列を複製せずに分割)をC++でどうやるのかと思い質問した感じです。
最終的に手段はいいように調整したいんですが、同じようなことをしたいとき、C++ならどうやるのかなと。

個人的には string の特定部分だけをアドレスで持つ range みたいなものがあると思っていたんですが・・・

786 :デフォルトの名無しさん:2011/08/25(木) 00:58:20.52
if(boguDataObj.fukaS1[boguNo]==1)soubi_Eattack+=boguDataObj.fukaV1[boguNo];//遠距離攻撃
else if(boguDataObj.fukaS1[boguNo]==2)soubi_Kattack+=boguDataObj.fukaV1[boguNo];//近距離攻撃
else if(boguDataObj.fukaS1[boguNo]==3)tikara_p+=boguDataObj.fukaV1[boguNo]; //力
else if(boguDataObj.fukaS1[boguNo]==4)sutamina_p+=boguDataObj.fukaV1[boguNo]; //スタミナ
else if(boguDataObj.fukaS1[boguNo]==5)seisin_p+=boguDataObj.fukaV1[boguNo]; //精神
else if(boguDataObj.fukaS1[boguNo]==6)hanno_p+=boguDataObj.fukaV1[boguNo]; //反応
else if(boguDataObj.fukaS1[boguNo]==7)maryoku_p+=boguDataObj.fukaV1[boguNo]; //知恵

if(boguDataObj.fukaS2[boguNo]==1)soubi_Eattack+=boguDataObj.fukaV2[boguNo];//遠距離攻撃
else if(boguDataObj.fukaS2[boguNo]==2)soubi_Kattack+=boguDataObj.fukaV2[boguNo];//近距離攻撃
else if(boguDataObj.fukaS2[boguNo]==3)tikara_p+=boguDataObj.fukaV2[boguNo]; //力
else if(boguDataObj.fukaS2[boguNo]==4)sutamina_p+=boguDataObj.fukaV2[boguNo]; //スタミナ
else if(boguDataObj.fukaS2[boguNo]==5)seisin_p+=boguDataObj.fukaV2[boguNo]; //精神
else if(boguDataObj.fukaS2[boguNo]==6)hanno_p+=boguDataObj.fukaV2[boguNo]; //反応
else if(boguDataObj.fukaS2[boguNo]==7)maryoku_p+=boguDataObj.fukaV2[boguNo]; //知恵
↑のコードを変数名を変えずにスマートにまとめるにはどうしたらいいでしょうか。

818 :デフォルトの名無しさん:2011/08/28(日) 12:42:05.09
そもそもどう渡したんだ?
struct X {
int y:1;
int const & get() {return y;}
}
とかだとgetの返却値はyをintにキャストした一時変数の参照だぞ。

826 :デフォルトの名無しさん:2011/08/30(火) 20:18:01.10
switch文ってcaseの後に↓のような感じで{}をつけてもいいんですか?
switch(a)
{
case 1:
{
文1;
文2;
}
break;
case 2:
{
文1;
文2;
}
break;
}

827 :デフォルトの名無しさん:2011/08/30(火) 20:24:39.60
>>826
えーよー

828 :デフォルトの名無しさん:2011/08/30(火) 20:55:20.42
>>827
ありがとうございます。
やってるの見たことなかったので何か不安だったので質問しました。

836 :デフォルトの名無しさん:2011/09/01(木) 03:03:18.04
最近CからC++に移行したのですが、ある本を見るとmain関数の中にreturn 0;がありませんでした。
これは、「C++ではmain関数で戻り値を明示しなかった場合は0になる」という理解で合ってますか?

838 :デフォルトの名無しさん:2011/09/01(木) 11:24:18.01
>>836
warning C4508: がコンパイルすると出るだろ?

844 :デフォルトの名無しさん:2011/09/02(金) 06:47:53.71
atan2の引数はなぜあのような順番になっているの?

845 :デフォルトの名無しさん:2011/09/02(金) 10:28:46.13
>>844
何かご不満でも?

846 :デフォルトの名無しさん:2011/09/02(金) 11:42:16.06
>>845
xy平面上に原点Oおよびそれと異なる点P(x,y)があるとき、x軸と半直線OPのなす角を求めたりするときに
atan2の引数の順番が逆になっていれば、点Pの座標をそのまま使ってatan2(x,y)と出来ると思うんですが

850 :デフォルトの名無しさん:2011/09/02(金) 12:30:26.65
tanがy/xだからyが先

852 :デフォルトの名無しさん:2011/09/02(金) 13:03:17.68
>>850-851
それぐらいの理由ならわざわざatan2を用意する必要も無いような……
と思ったら、atanとatan2では値域が違うんですね
(atanは数学的な逆正接関数と同じく-π/2??π/2、atan2はx, yの符号に応じて-π??πの値をとる)
これには何か意味があるんでしょうか?
>>846のような使い方では引数の順番が合わないので違うと思いますが……

853 :デフォルトの名無しさん:2011/09/02(金) 13:09:35.83
だから、y / xの順番なんだよ。xが0のときには重宝するぞ。


http://hibari.2ch.net/test/read.cgi/tech/1308106024/l50人気ブログランキングへ