【初心者歓迎】C/C++室 Ver.35【環境依存OK】 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
07/02/19 21:36:23
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.34【環境依存OK】
スレリンク(tech板)
【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)

2:デフォルトの名無しさん
07/02/19 21:37:35
立ってなかったので立てました。
ついでに自分で2get

3:デフォルトの名無しさん
07/02/19 21:38:31


4:デフォルトの名無しさん
07/02/19 22:09:18
乙4ゲット

5:デフォルトの名無しさん
07/02/19 22:09:21
cerr << '>>1乙' << endl;

6:デフォルトの名無しさん
07/02/19 22:12:28
>前スレ1000
releaseしないといけないのが面倒

7:デフォルトの名無しさん
07/02/19 23:02:43
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。

8:デフォルトの名無しさん
07/02/19 23:27:33
7 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん

9:デフォルトの名無しさん
07/02/20 01:48:03
>>7
秋刀魚を食べたら
まで読んだ

10:デフォルトの名無しさん
07/02/20 09:30:57
質問です。
クラスメンバに配列を持っている場合、その初期化はどうすればよいでしょうか?
現在は
class foo{
foo(int *b){
a[0] = b[0];
a[1] = b[1];
}
private:
int a[2];
}

としているのですが、初期化リストで初期化することはできないでしょうか?

11:デフォルトの名無しさん
07/02/20 09:38:21
そのやり方が一番無難だと思う。
C++には「これ一発でおk」な方法が無い。

12:デフォルトの名無しさん
07/02/20 09:49:00
>>10
配列は初期化リストで初期化できない。

どうしても初期化リストで初期化するのが必要な場合は vector を使うと
可能になる。少し大げさなようだけど、動的確保が一つ追加されるほかは
たいした違いは無い。

class foo{
foo(int *b) : a(&b[0], &b[2]) {}
private:
std::vector<int> a;
}

13:デフォルトの名無しさん
07/02/20 13:59:37
配列構造体を渡したいのですが、間違いを指摘してください。
お願いします。
static cardData cD[256];

ReadCastFile(cD);

int ReadCastFile(cardData **cD) {
  cD[0]->cName = (LPSTR)malloc(GetFileSize(hFile , NULL));

}

14:デフォルトの名無しさん
07/02/20 14:04:59
*が1個多い。

15:デフォルトの名無しさん
07/02/20 14:12:58
>>14
ありがとうございます。

16:デフォルトの名無しさん
07/02/20 15:31:24
双子素数を求めるプログラムを作成してみたのですが、どこか改善点などあれば教えてください。
#include<iostream>
using namespace std;
const int MAX_NUMBER = 2000; //保存できる素数の数
int sosu[MAX_NUMBER]; //この配列に素数を保存
int main(){ int num=0; //見つけた素数の総数 初期値は0
int i,j,route;
int judge; //素数のとき1,素数でないとき0とする
int k=0,h=0;
sosu[num] = 0; //素数の初期化
for(i=2;i<=10000;i++) //1をとばして2から素数判定を始める {
/*エラトステネスのふるい*/
for(route=1;route*route<=i;route++); //iの平方根より大きい自然数で、最も小さいものを求める
for(j=0,judge=1;sosu[j]!=0 && sosu[j]<route;j++)//iの平方根より小さい素数で割り切れるものが無いとき、iは素数 {
if(i % sosu[j] == 0){ //何らかの素数で割り切れたとき、その数は素数でないので終了
judge = 0; //素数でないので0にする
break; } }
if(judge){
sosu[num] = i; //新しく見つけた素数の保存
num++; //見つけた素数の数を1増やす
sosu[num] = 0; //保存されている素数配列の終わりが分かるように、配列の最後を0にしておく } }
while(sosu[k+1]){ //求めた素数のうち双子素数を表示
if(sosu[k+1] - sosu[k] == 2){ //連続する二つの素数の差が2なら双子素数なので表示
cout << "(" << sosu[k] << "," << sosu[k+1] << ")" << " ";
h++; //一つの組を表示するたびにカウンタhを1増やす
}
if(h == 6){ //1行に6つの組が表示されたら改行
cout << endl;
h = 0; //カウンタ初期化
} k++; } cout << endl; return 0;}


17:デフォルトの名無しさん
07/02/20 15:32:57
>>16
スレリンク(tech板:273番)
向こうにレスついているからそれ読んだら二度と来るなよ。

18:デフォルトの名無しさん
07/02/20 17:43:12
iniファイルからキーを指定して文字列や数字を取得する方法を教えてください

19:デフォルトの名無しさん
07/02/20 18:18:29
>>18
GetPrivateProfile*で始まる関数を調べるるるる〜

GetPrivateProfileInt
URLリンク(msdn.microsoft.com)
 ・
 ・
 ・

20:デフォルトの名無しさん
07/02/20 19:00:14
iniファイルというのは別にWindowsオンリーなものではないのであるが
まぁたぶんWindowsだろうけど

21:デフォルトの名無しさん
07/02/20 19:52:58
>>10
一個ずつコピーするぐらいなら、せめてstd::copyを使え。

22:デフォルトの名無しさん
07/02/20 22:24:49
裏切派遣って知ってる?
元々は正社員だったのに取引先にフリーのほうが稼げるとか騙されて派遣やってるバカのことw

前の会社を裏切り、結局派遣先からも騙されてる。
そもそも信頼されてるなら直接契約するか正社員にするはずだが、派遣会社経由って舐められ杉

自分でも騙され裏切れられてることは薄々わかってるから派遣問題の話が出るとウッキー!って逆ギレw


23:デフォルトの名無しさん
07/02/20 22:33:55
GetPrivateProfileは使っちゃらめええええ

ってMSDNに書いてるよね。どうなんだろ。
俺は自分で関数書いてるけどさ。

24:デフォルトの名無しさん
07/02/20 23:06:07
え?INIファイルは使っちゃらめえええ、とは書いてあるが。レジストリをどうぞ、ということ。
あとNT系ではいっさいキャッシュが効かないのでパフォーマンス的にはごめんなさい、だったと思う。

25:デフォルトの名無しさん
07/02/20 23:13:09
XML使え。

26:デフォルトの名無しさん
07/02/20 23:18:54
ソースがごっちゃになるので、
機能ごとに関数を別ファイルにして分割コンパイルにしたいのだが、
そうするとグローバル変数を、いちいちexternでファイルの先頭に持ってくるのも面倒なので、
ヘッダファイルにまとめてしまいたいのだが、何かウマい方法ありませんか?
externで宣言されているヘッダをすべてにつけて、
main関数のあるところにだけ、externが付いていない宣言をつけたヘッダをつける方法で、間違っていませんか?

…なんか日本語おかしい

27:デフォルトの名無しさん
07/02/20 23:25:28
>>25
XMLって面倒なんだけど

28:デフォルトの名無しさん
07/02/20 23:26:06
>26
グローバル変数をやめればおk。

29:デフォルトの名無しさん
07/02/20 23:32:25
>>27
MSXML

30:デフォルトの名無しさん
07/02/20 23:32:55
>>28
そんな Σ(´Д`lll)

31:デフォルトの名無しさん
07/02/20 23:36:17
>>26
グローバル変数をやめて、今までグローバル変数にしていたものを管理するクラスを作ればいい。
#つーか、設計しなおせよ。

32:デフォルトの名無しさん
07/02/20 23:47:24
>30
全部パラメータ渡しに変える。可能な限りconstつきで。
これで今まで気がつかなかったバグも見つかって一石二鳥。

33:デフォルトの名無しさん
07/02/20 23:49:48
よーしぱぱシングルトンクラス1つ作って全部つめこんじゃうぞー

34:デフォルトの名無しさん
07/02/20 23:50:23
グローバル変数どこで使う?みたいなグダグダ進行してるスレ探してみたがないな

35:26
07/02/21 00:01:23
>>31-32
なるほどー…
クラスってこういう使い方もするんですね…

しかし、一つしかないグローバル変数扱うのに
わざわざクラス作って宣言し、pc->a(data)とかやるのは非効率な気がしてならないのですが、
そこら辺教えていただけませんか?

36:デフォルトの名無しさん
07/02/21 00:07:47
実行時の効率という意味なら、そこがボトルネックになることは100%ない(言い切ってみる
コーディングのしやすさや後々のわかりやすさという意味なら、ぐろーばるはしねばいいのに

37:デフォルトの名無しさん
07/02/21 00:21:08
>>29
それがめんどくさい。
スペースをどうするかとか同期か非同期か指定して
BSTRとかvariantとかL"〜"とか、
HRESULT hr =〜
if(FAILD(hr)〜

もっと、楽に設定ファイルの読み書きが出来たらなあ。

GetPrivateProfileは、キーがなかったらデフォルト値を返す
みたいな便利なのがある。

てか、便利なものってC/C++標準装備になんねーかな。

38:デフォルトの名無しさん
07/02/21 00:30:17
>>35
時間ないし、複雑じゃないし、いっそグローバル変数にしたほうが楽なら
グローバル変数でいいと思うのが俺。
悩んで時間かけて改造したけどたいしたことないなら効率悪いじゃん。

でも、そうでないなら、グローバル変数やめたほうがいい。

引数減らす程度でどれくらい速くなると思う?
俺は調べたことないけどさ
メモリアクセスがわりとキャッシュにヒットしたと考えれば
よほど大量に実行しないと測定できないんじゃないの。
アセンブラでスタック積み込みに数命令、
読み込みはグローバルでもスタック積み込みでもたいして命令数かわらんだろ。

39:デフォルトの名無しさん
07/02/21 00:35:25
>>26
externつけてない宣言でも外部から参照可能だよ。
externつけた宣言しておきながら定義してもOKだよ。
それともCとC++でちがったっけ?
ちゃんと確認していないので間違えてたらすみません。
グローバル変数はあまり使わないものでして。

40:デフォルトの名無しさん
07/02/21 01:49:00
externをちゃんとわかってないヤツがいるな

41:デフォルトの名無しさん
07/02/21 09:35:38
externって「どっかにあるから探せよコラwwww」っていう感じくらいしかわかってない

42:デフォルトの名無しさん
07/02/21 09:45:48
extern 無しは「ここにおいとくから使えよコラwww」

ヘッダー内で extern 無しを書いて、あちこちでインクルードされると、
じゃどれつかうんだよコラ!!! とリンカが怒る

43:デフォルトの名無しさん
07/02/21 10:06:32
なるへそ

44:デフォルトの名無しさん
07/02/21 10:19:44
超訳/超解説の類って集めると楽しそうだ。役には立たなさそうだが。

45:デフォルトの名無しさん
07/02/21 10:40:48
D&Eによれば、Stroustrupはグローバル変数肯定派だよ
Simula使った後にC with classを開発する際にその必要性を
痛感していたようだ

C++ならてきとーにnamespaceにくるんどけば、別に困らんと思うよ

46:デフォルトの名無しさん
07/02/21 10:53:43
まず、宣言と定義を理解しているかを各自再確認するように。

47:デフォルトの名無しさん
07/02/21 12:22:01
本物のプログラマはヘッダを書かない。
よって本物のプログラマはグローバル変数を使わない

48:デフォルトの名無しさん
07/02/21 12:26:19
へえ

49:デフォルトの名無しさん
07/02/21 13:47:07
>>37
#import使えば戻り値のHRESULTの値がエラーのとき勝手に例外に変えてくれるから、
それに関しては毎回FAILDなんかで調べる必要はなくせるぞ。

50:デフォルトの名無しさん
07/02/21 15:17:14
>>47
偽者発見

51:デフォルトの名無しさん
07/02/21 17:33:39
C++ で exit 関数とか abort 関数を使ってもいいの?

52:デフォルトの名無しさん
07/02/21 17:41:53
exitを呼ぶと、関数呼び出しだから自動変数のデストラクタは呼ばれない。
グローバル変数など静的記憶期間にあるオブジェクトはデストラクタで解体される。
abortはそれすらも保障がない。

それを踏まえた上で呼ぶのなら誰も止める者はいない。

53:デフォルトの名無しさん
07/02/21 17:42:22
>>51
デストラクタがすっ飛ばされちゃうんだっけ?

54:デフォルトの名無しさん
07/02/21 17:46:50
exit と同じことをやろうと思ったら、
例外をスローして main でキャッチして return しかないのか。。。

55:デフォルトの名無しさん
07/02/21 18:28:37
>>54
簡単に実装できるからいいんじゃね?

でも catch(...) とかあるから確実に exit することができないって問題があるか。
まぁ、これは利点でもあるわけだが。

56:デフォルトの名無しさん
07/02/21 18:33:57
全部オブジェクトのポインタをグローバルに保っておいて適当な関数で解放させるようにしてその関数をatexitで登録したらいいんじゃないかな?

57:デフォルトの名無しさん
07/02/21 18:37:38
単純にcatch(...)で捕まえたらmainへ向けてさらにthrowすれば良いのでは?

58:デフォルトの名無しさん
07/02/21 18:47:56
だめだめ

59:デフォルトの名無しさん
07/02/21 18:51:23
>>57
それは自分ですべてのコントロールが可能であることが前提だし、
catch(...)じゃなにを捕まえたのかわからんから再throwすべきものなのか
再throwしちゃいけないものなのかの判断ができんし。

60:デフォルトの名無しさん
07/02/21 21:40:16
>59
よく分からない例外を握りつぶすなよ。
処理できる例外なら...で捕まえるなよ。

61:デフォルトの名無しさん
07/02/22 02:02:00
struct OBJECT
{
  FLOAT fHigh;
};
のとき、fHighを初期化するには、何か特別なことをしなければいけないのでしょうか?

62:デフォルトの名無しさん
07/02/22 02:24:16
>>61
コンストラクタで初期化すれば?

63:デフォルトの名無しさん
07/02/22 02:58:25
>>61 ふつうに初期化すればいいよ。

64:デフォルトの名無しさん
07/02/22 02:59:14
>>61
struct OBJECT a={12.345};

65:デフォルトの名無しさん
07/02/22 06:44:45
そもそもFLOATってどんな型だよ。

66:デフォルトの名無しさん
07/02/22 09:43:15
>>62を検索したところ、まさにそれでした!!ありがとうございました。

67:デフォルトの名無しさん
07/02/22 19:55:42
C++でscanf()のいい代替物って無いんですかね

68:デフォルトの名無しさん
07/02/22 20:07:15
#include <cstdio>
std::scanf()

69:デフォルトの名無しさん
07/02/22 20:11:32
>>68
型安全性が無いのと、文字列読み込みで長さを無制限にできない点がちょっと。
素直にstd::stringに読み込みたいのですが。

70:デフォルトの名無しさん
07/02/22 20:14:34
>>67
std::basic_istream<_Elem,_Traits> operator>>(なんとか)

71:デフォルトの名無しさん
07/02/22 20:15:14
>>70
それって、%[a-z]とか%[^,]みたいなことができますか?


72:デフォルトの名無しさん
07/02/22 20:20:25
boost::format

73:デフォルトの名無しさん
07/02/22 20:21:12
boost::spirit

74:デフォルトの名無しさん
07/02/22 20:23:11
>>72
boost::formatがサポートしているのは出力だけだと思っていました。
入力もサポートしていたのですね。

75:デフォルトの名無しさん
07/02/22 20:24:14
>>73
それはscanf()の代わりにlex & yaccを使え、と言っているようなもので、
適切な代替物というよりはオーバースペックに思えます。
無論、もともとlexが適切なケースではlexを使えばよいでしょう。

76:デフォルトの名無しさん
07/02/22 20:27:14
少なくとも俺がBoostを使い始めてからの3年間では
入力でboost::formatが使えるなんて与太話は聞かない。

つ boost::Xpressive

77:デフォルトの名無しさん
07/02/22 20:28:45
readlineしてregexp。

78:デフォルトの名無しさん
07/02/22 20:33:38
>>76
初めて知りました。boost::regexの次期バージョンなのでしょうか。
>>77
regexpだと、その後さらに型変換が必要ですよね。文字列からの。
scanf()より余程複雑な字句解析を行うことができますが、
記述性と簡便性においては、かなり劣るといわざるを得ないのではないでしょうか。

79:デフォルトの名無しさん
07/02/22 20:37:49
なんだか要求が微妙すぎるな。
自作するしかないのでは。

80:デフォルトの名無しさん
07/02/22 20:44:27
googleがPCREに寄贈したラッパーコード(pcrecpp)では、

int n;
string s;
pcrecpp:RE re("(\\w+)=(\\d+)");
re.FullMatch("ruby=1234", &s, &n);
のようなことが出来るようですね。

これぐらいだとかなりいい感じです。

81:デフォルトの名無しさん
07/02/23 11:36:38
仮想関数についての質問です
派生クラスで再定義するメンバ関数以外に仮想関数にする意味はありますか?

82:デフォルトの名無しさん
07/02/23 11:45:35
>>81
あんまり無い。
仮想関数の意味を理解していれば自明だと思うが。

ただしデストラクタとか暗黙のうちに再定義されるものも
あるので、知らないと良く分からない場合もあるかも。
あとは RTTI を有効にするためだけのダミーとか。

83:デフォルトの名無しさん
07/02/23 17:58:49
整数型のメンバ配列変数の便利な初期化方法を教えてください

84:デフォルトの名無しさん
07/02/23 18:05:45
>>83
つ[std::vector]

85:デフォルトの名無しさん
07/02/23 18:08:07
普通の配列の初期化は無理ですか?

86:デフォルトの名無しさん
07/02/23 18:12:33
コンストラクタで memset すればいいのでは。

87:デフォルトの名無しさん
07/02/23 18:25:57
memsetでやります

88:デフォルトの名無しさん
07/02/23 18:39:05
memset()なんて濫りに使うもんじゃない。
せめてstd::fill()を使え。

89:デフォルトの名無しさん
07/02/23 18:41:54
そのほうがよかろう

90:デフォルトの名無しさん
07/02/23 19:41:21
カラフルなテキストを表示したいんですけど
SetTextColor+DrawTextだと限度を感じました。(頑張っても行単位がいいところ)
黒黒赤赤黒黒
黒黒青青赤青
こんな風に描写するのに適した関数教えてください。

91:デフォルトの名無しさん
07/02/23 19:42:59
>>90
スレ違い

Win32API質問箱 Build50
スレリンク(tech板)

92:デフォルトの名無しさん
07/02/23 19:53:32
>>90
一文字ずつ色設定して一文字ずつ書き込む
どうかんがえても、これしかないでしょう
どの環境でも

93:デフォルトの名無しさん
07/02/23 19:59:59
VisualStudio 2002環境で確認したのですが
stringstream::operator <<()を使用すると
プロセス終了まで開放されないメモリプールが発生しているようなのですが
対応方法をご存知の方いらっしゃいませんか?

スレッドを作っては消すを繰り返すプログラムで
生成したスレッド内でoperator<<()を使用すると使用メモリが増加するのですが
インスタンス・スレッドハンドルの開放を行ってもメモリが減りません
(インスタンスを生成しただけでは問題ないようです)

CreateThread()ではCライブラリでメモリリークが発生するとの記述もありますが
スレッドを_beginthreadex()で生成しても発生していて困っています

94:90
07/02/23 20:08:37
>>91
スマン去ります。

>>92
文字列中のタグ解析して色自動でつけてくれるよな物が関数化されてるかと思って

95:デフォルトの名無しさん
07/02/23 21:12:58
>>90
Win32APIスレ行け
んでもってリッチテキストでも使ってろ

96:デフォルトの名無しさん
07/02/24 00:15:58
>>93
それは繰り返しただけメモリ使用量が増加していくの?
プールがちゃんと再利用されてれば問題ないようにも思うんだけど。

97:デフォルトの名無しさん
07/02/24 11:50:18
質問です。
配列を使い、その値の合計値を出す際に私はループカウンタを利用して足す手法を
思いつくのですが、それ以外の方法があると聞きました。
ですが、それ以外の方法が思いつかなく質問させてください。

int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int nSum = 0;

for ( int i = 0; i < 10; i++ )
{
nSum += a[i];
}

return nSum;

ここでループカウンタを使用せず、配列の全てを足すにはどうしたら良いでしょうか。

98:デフォルトの名無しさん
07/02/24 11:57:24
>>97 素直が一番
こんなのじゃなくて
int nsum(int data[], int data_num){
if(data_num<=0) return 0;
return data[data_num-1]+nsum(data, data_num-1);
}

int nsum(int data[], int data_num){
int *p, sum=0;
for(p=&data[0];p!=&data[data_num];p++)
sum+=*p;
return sum;
}

99:デフォルトの名無しさん
07/02/24 11:59:22
>>97
std::accumulate()

100:デフォルトの名無しさん
07/02/24 12:05:12
回答者にも遠慮なく突っ込みを入れよう。

引き数がポインタなので、&data[0]する意味がない。p = dataで充分。
そもそも、ポインタを回す必要はない。ポインタ演算はバグの温床として禁止するコーディング規約もあるくらいだ。
したがって、

int nsum(int data[], int data_num){
// if (data_num < 0 || data == NULL) return 0; // 状況によっては神経質にここまでやるべき。
int sum = 0;
for (int ic = 0; ic < data_num; ++ic) {
sum += data[ic];
}
return sum;
}
の方が自然だろう。

101:デフォルトの名無しさん
07/02/24 12:12:07
>>100
>引き数がポインタなので、&data[0]する意味がない。p = dataで充分。
終了条件と書き方を合わせたほうがいいと判断した

>そもそも、ポインタを回す必要はない。
*ループカウンタを使用せずに*

ついでいうと >>98 の書き方を推奨してはいない

102:デフォルトの名無しさん
07/02/24 12:14:39
std::accumulate( &data[0], &data[num], 0 )

103:デフォルトの名無しさん
07/02/24 14:12:19
>>101
ちょっと>>98を改造して末尾再帰になるようにしたぞ。
これなら文句あるまい。

#include <stdio.h>

int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

int nsum(int data[], int data_num, int acc){
return data_num<=0?acc:nsum(&data[1], data_num-1, *data+acc);
}

int main(void) {
printf("%d\n", nsum(a, 10, 0));
return 0;
}


104:デフォルトの名無しさん
07/02/24 16:37:53
WinAPIの関数で、DWORD型で(コールバック)関数のアドレスを渡す ものがあるのですが、
これに自作のクラスのメンバ関数のアドレスを渡すと、DWORDに変換できないと言われ、コンパイルできません。
そのメンバ関数がstaticなら、コンパイルに成功するので、
「メンバ関数は、普通の関数とは構造が異なる」という理由だと思うのですが・・・
メンバ関数のアドレスを渡すことは不可能ですか?

105:デフォルトの名無しさん
07/02/24 16:43:43
>>104
非staticなメンバ関数≒インスタンス情報をパラメータに取るstaticなメンバ関数 なので、
そのままでは渡せません。素直にstaticなメンバ関数を渡せば宜しいのでは?

106:デフォルトの名無しさん
07/02/24 16:47:55
ここでエスパー
ウィンドウクラスを作ろうとしているなら、

つ [SetProp]

107:デフォルトの名無しさん
07/02/24 17:11:31
>>104
その「コールバック関数を引数に取る関数」に、
コールバック関数に渡す値という引数はないか?

ところでWindows APIのコールバック関数のアドレスを引数に取るのだったら、
DWORD型ではなく何か関数へのポインタ型になっていると思うのだが、
一体何の関数だ?

108:デフォルトの名無しさん
07/02/24 17:13:24
初心者です
if文の中で処理をしてから判断できるんですか?
if(a=5,a==5)みたいな感じ

109:デフォルトの名無しさん
07/02/24 17:16:39
こんな感じのこと?

int moji;
while((moji=getchar())!=EOF)
putchar(moji);

典型的なパターンの時以外はやめたほうがいいよ

110:デフォルトの名無しさん
07/02/24 17:21:20
評価式と別の普通の式をif文の中で分けて使いたいんですが

111:デフォルトの名無しさん
07/02/24 17:22:13
やめておいたほうがいい

112:デフォルトの名無しさん
07/02/24 17:26:56
>>108
>108の例だと、素直に a = 5; if (a == 5) ...; と書いた方がいい。
醜くなるだけでメリットは殆どない。

113:デフォルトの名無しさん
07/02/24 17:34:40
では例えば

if(関数式==1)
else if(関数式==1)
else if(関数式==1)
else if(返り値=関数==1)
のときの

else if(返り値=関数)の関数にかかる時間を計りたいとき

関数の中で時間を計らないで関数の呼び出されてから終了までの
経過時間を計りたいときはどうすればいいですか?

その場合 if(整数A=clock(),評価式)
整数B=clock();
整数A-=整数Bでいけますか?

114:デフォルトの名無しさん
07/02/24 18:03:27
clockは経過時間ではなくCPU時間

115:デフォルトの名無しさん
07/02/24 18:05:28
デバッグ目的なら好きにすれば?

116:デフォルトの名無しさん
07/02/24 18:06:31
デバッグ目的ならプロファイラがいいと思うけど

117:デフォルトの名無しさん
07/02/24 18:07:24
そのあとの経過時間によって処理を分けるので^^;
なにか良い方法があれば教えてください

118:デフォルトの名無しさん
07/02/24 18:08:46
>>114
1000で割れば経過秒数になりますよね?

119:デフォルトの名無しさん
07/02/24 18:10:51
CLOCKS_PER_SEC で割る

120:デフォルトの名無しさん
07/02/24 18:11:17
なんか激しく無謀なことをしている悪寒。

121:デフォルトの名無しさん
07/02/24 18:16:02
ゲームでPCスペックが低い時にフレームスキップするみたいなことをしたい訳だな

122:デフォルトの名無しさん
07/02/24 18:38:30
>>113
if(返り値=関数==1)
こういうのって修正とかデバッグなどしにくいから俺としてはNG。

返り値=関数;
if(返り値==1)

最初からこうならデバッグとか修正とかしやすい。

確かに行数増えるけど
今の俺はそんなこと気にしなくなった。

経過時間は以下みたいに巣りゃいいんじゃナインお

st = 現在時間取得
返り値=関数
et = 現在時間取得
経過時間 = et - st

123:デフォルトの名無しさん
07/02/24 18:43:36
>>122
それ意味変わってね?
==のほうが優先順位高いよ。

124:デフォルトの名無しさん
07/02/24 18:43:38
>>122
>>113をよく嫁

125:デフォルトの名無しさん
07/02/24 18:46:43
>>113自体エスパーが必要だと思うんだが

126:デフォルトの名無しさん
07/02/24 18:47:50
122じゃないけど、自分も同じことやってたよorz


127:デフォルトの名無しさん
07/02/24 18:51:23
>>125
初心者なんですいません

やってみたらできたんで今はclock()を使ってます

128:デフォルトの名無しさん
07/02/24 20:30:32
>>96
1スレッドごとにプールを製作するようです
したがって、同一スレッド内では再利用されるので問題ないのですが
スレッドを閉じて新しいスレッドを生成すると
新しいプールが作成されて、古いプールが残るようなのです

このプールがいつまでも残っているようで困っております

遅レスでもうしわけないです

129:デフォルトの名無しさん
07/02/24 20:32:31
CRTはソースあるんだから嫁よ。

130:デフォルトの名無しさん
07/02/24 20:57:20
>>128
「〜ようです」って、何見て言ってるんだ?

131:デフォルトの名無しさん
07/02/24 21:04:07
>>128
「〜ようです」って、何見て言ってるんだ?

132:デフォルトの名無しさん
07/02/24 21:12:55
>>128
「〜ようです」って、何見て言ってるんだ?

133:デフォルトの名無しさん
07/02/24 21:17:32
何度言えば気が済むんだ?

134:デフォルトの名無しさん
07/02/24 21:18:15
malloc()/newの類はfree()/deleteしても一般にはOSにメモリを返さないという
超基本的事項を知っているか。
free()されたメモリはOSに返さず次のmalloc()で再利用するのがこうした
関数の基本的な戦略だ。

したがって、一般にプロセスの最初にガバッとmalloc()して大きな仕事をし、
その後free()してもプロセスのワーキングセットは大きいままだ。
これは俗に言う「メモリリーク」ではないのだが、
それが問題になるようであれば、自分でHeapAlloc()なりVirtualAlloc()なりを
用いてカスタムのアロケータを書いて、basic_stringstream<>の
テンプレートパラメータとして渡してやるんだな。

135:デフォルトの名無しさん
07/02/24 22:15:30
>>134
ありがとうございます
やってみます

136:デフォルトの名無しさん
07/02/24 22:18:53
HeapAlloc/FreeだってOSに返さないで次のHeapAlloc呼出に再利用するぞ。
HeapDestroyでは流石にOSへ返すが。

137:デフォルトの名無しさん
07/02/24 22:35:45
Linux、UNIXあるいはMacで、OSの名称やバージョン情報を取得するにはどの関数を使えば良いですか?
例えば、FreeBSD 6.0、Vine Linux 4.0などです。
WindowsはGetVersionExなどで出来ました。

138:デフォルトの名無しさん
07/02/24 22:38:59
man 3 uname

139:デフォルトの名無しさん
07/02/24 23:02:10
OSはlinuxです。C/C++勉強してます。
ディレクトリの中のファイルの日付を取得したいのですが、
opendirとreaddir関数使いました。
struct dirent {
ino_t d_ino; /* "inode number" of entry */
off_t d_off; /* offset of disk directory entry */
unsigned short d_reclen; /* length of this record */
char d_name[1]; /* name of file */
};
この中に日付無いのですが、どうしたらよろしいでしょうか。
よろしくお願いします。

140:デフォルトの名無しさん
07/02/24 23:12:23
>>139
つ[stat()]

141:デフォルトの名無しさん
07/02/24 23:37:57
>>140
レスありがとうございます。
d_nameを元にファイルのpath指定して、
stat()実行して、struct statを取得する感じですか。
なんか大変な感じします。(汗

142:デフォルトの名無しさん
07/02/24 23:55:57
>>141
つ[popen("/bin/ls -l", "r")]

143:デフォルトの名無しさん
07/02/25 00:48:23
unsignedはどういう場合に使うべきなんでしょうか?
例えばループのカンターなんかは符号付きを使用すると思いますが、
実際の所は符号なしの方が意味的にはあっていると思います。
ビットシフトしたいとき、くらいしか思いつかないんですが、他にどんな使い道がありますか。

144:デフォルトの名無しさん
07/02/25 01:07:48
>>143
typedef unsigned char BYTE;
size_tもunsignedだな
ループカウンタとかunsigned付けるの面倒だよね。
size_tがunsignedだからもっと使っているはずだけど面倒。
負にならないもの全てunsignedとか面倒だからやらないんじゃない。
unsigned intならファイルサイズとか4Gまで表現できるけど面倒だからintで計算。
2GB以上はこのプログラム動きません。
たとえlong longとかあっても面倒だからunsigned long longでファイルサイズを表そうとも思わない。
俺の場合はね。

145:デフォルトの名無しさん
07/02/25 01:36:52
>>142
レスありがとうございます。

FILE *p;
p = popen("/bin/ls -l", "r");
ネットで検索したところ、
こういう使い方すると、出力をファイルのように
扱うことが出来るみたいですね。
一行ずつ読み込んで、スペースで区切ると日付も取得できそうです。
コマンド実行->標準出力取得 って、やり方知らなかったので
大変勉強になりました。
でも、時間の型を考えるとやっぱり、今回は、stat()関数使用してみます。
ありがとうございました。

146:デフォルトの名無しさん
07/02/25 17:45:57
質問です。
CのソースからC++のソースを呼び出したいのです。

具体的には、
既にかなりの規模になってしまった拡張子.cのプログラムソースがありまして、
どうしても欲しい機能がC++で書かれているので、インクルードしたんですが、当然Cのソースからそれらを読むとコンパイルエラーになってしまいました。

hoge.cppと言うファイルにC++関連のプログラムを書き、何とかその関数をc側から読み出したいのですが
インクルードすると、エラーが出ますし、どのようにすれば良いのでしょうか?

尚環境はVC++.NET 2003です。

よろしくお願いします。


147:デフォルトの名無しさん
07/02/25 17:55:14
EXTERN_C

148:デフォルトの名無しさん
07/02/25 17:58:33
>>147
レスありがとうございます。
extern "C"
をつけた関数の中から、C++固有の機能(クラスなど)へのアクセスが出来ないのですが…
具体的には、error LNK2019: 未解決の外部シンボル とエラーが出ます。


149:デフォルトの名無しさん
07/02/25 18:00:08
ヘルプ

150:デフォルトの名無しさん
07/02/25 18:02:01
ユーザーが入力した日時 (日付と時刻) を
設定ファイルに記録しておこうと思うのですが、
どういう形式で記録するのが一般的ですか?
asctime 関数のような 「Sun Feb 03 11:38:58 2002」 のような形式は
気持ち悪いので採用したくないです。

151:デフォルトの名無しさん
07/02/25 18:02:58
>>148
そりゃC言語にない機能だからクラスを扱えないよ。
C++の方で呼べるようにしてあげないと。

152:デフォルトの名無しさん
07/02/25 18:06:46
>>151
間違えたかも。

>>148
C++の方では
Cから呼べるようにクラスじゃない関数でextern "C"を付けて作る。


Cの方では
extern "C"を付けた宣言をする。
これで呼び出せると思うけど忘れた。


153:デフォルトの名無しさん
07/02/25 18:11:24
>>151
確認したいのですが、extern "C"をつけるのはC++側の関数へですよね?
main.c
#include "hogehoge.h"
int main(void){
int a=0;
func(a);
return 0;
}
hogehoge.cpp
#include <vector.h>
extern "C" void func(int a){
vector<int> v;
}
hogehoge.h
#ifdef __cplusplus
extern "C" {
#endif
void func(int a);
#ifdef __cplusplus
}
#endif

こういう形なんですが・・・。

154:デフォルトの名無しさん
07/02/25 18:18:52
>>150
設定ファイルを直接見る必要が無いなら
timeで拾った値をバイナリで書き込めばいいんじゃないかな。

155:デフォルトの名無しさん
07/02/25 18:20:35
設定ファイルはテキストファイルと決まってしまっているんです。
見ることはあまりないですけど、たまに見ることもあるものです。

156:デフォルトの名無しさん
07/02/25 18:25:04
>>150
W3C-DTF

157:デフォルトの名無しさん
07/02/25 18:30:34
>150
rfc 3339

158:デフォルトの名無しさん
07/02/25 18:33:33
>>153
これで動くんじゃないの?

159:デフォルトの名無しさん
07/02/25 18:38:48
おいらのところではコンパイル・リンクできたけど?

160:デフォルトの名無しさん
07/02/25 18:51:23
>>155
time_tの整数値
yyyymmddhhmmss形式
y/m/d h:m:s形式
好きにしな。

161:デフォルトの名無しさん
07/02/25 19:00:51
>>150
どういう形式にするにしても、strftime関数が使えると思う。

162:デフォルトの名無しさん
07/02/25 19:12:08
>>150
一般的といいつつも日本人向けにしたいっていうことだよね。

163:デフォルトの名無しさん
07/02/25 20:11:34
W3C とか RFC の形式を採用してみます。
情報ありがとうございます。

164:デフォルトの名無しさん
07/02/25 21:51:02
フォルダ内の全ファイルを列挙するプログラムを教えて下さい

165:デフォルトの名無しさん
07/02/25 21:53:35
system("dir");

166:164
07/02/25 22:04:00
printfで表示するには?

167:デフォルトの名無しさん
07/02/25 22:06:14
そういえば昔、
system("dir > hoge.txt")して、fopen("hoge.txt","r")...みたいなことを
やってた連中が居た。

168:デフォルトの名無しさん
07/02/25 22:11:16
>>164
環境依存

>質問者は必ず、環境を書きましょう。

169:デフォルトの名無しさん
07/02/25 22:13:08
>>167
十分アリだと思う dir /b ほうがイイと思うが

170:デフォルトの名無しさん
07/02/25 22:15:15
popenの事たまには思い出してあげてください

171:164
07/02/25 22:16:58
VisualC/C++
WindowsXP
フォルダ内のファイル名をstd::stringの配列に格納したいのです

172:デフォルトの名無しさん
07/02/25 22:32:34
>>171
FindFirstFile
FindNextFile

あたりでどうかな

173:デフォルトの名無しさん
07/02/25 22:56:24
イベント オブジェクトが現在シグナル状態にあるかどうかを調べるには、
どうしたらいい? WaitForSingleObject を使うの?

174:デフォルトの名無しさん
07/02/25 23:03:35
そう、待機時間を0にすればいいと思う。

175:デフォルトの名無しさん
07/02/25 23:08:32
そうか、ありがと。

176:デフォルトの名無しさん
07/02/25 23:11:26
>>172
使い方がわかりません

177:デフォルトの名無しさん
07/02/25 23:20:03
>>176
#include<windows.h>
#include<stdio.h>
int func1(void){
    HANDLE    h_find;
    WIN32_FIND_DATA    file_info;
    printf("\n----- func1 -----\n");
    h_find=FindFirstFile("*", &file_info);
    if(h_find==NULL) return 0;
    do{
        printf("%s\n", file_info.cFileName);
    }while(FindNextFile(h_find, &file_info)==TRUE);
    FindClose(h_find);
    return 1;
}
int func2(void){
    FILE    *fp;
    char    filename[FILENAME_MAX];
    printf("\n----- func2 -----\n");
    fp=popen("dir /b", "r");
    if(fp==NULL) return 0;
    while(fgets(filename, sizeof(filename), fp)!=NULL)
        printf("%s", filename);
    fclose(fp);
    return 1;
}
int main(void){
    func1();
    func2();
    return 0;
}

178:デフォルトの名無しさん
07/02/25 23:21:25
基本的なことで申し訳ないのですが、
クラスのオブジェクトの配列を作るとき、
そのクラスに引数を持つコンストラクタを持たせることは出来ないのですか?

一つ一つコンストラクタ引数を指定する形でも良いので、配列化させたいのですが…
一つ一つ宣言した上でポインタの配列を作った方が手っ取り早いですか?

179:デフォルトの名無しさん
07/02/25 23:33:21
諦めてvectorに収納したら?

180:デフォルトの名無しさん
07/02/25 23:38:28
>>178
引数を持つコンストラクタを持たせることは可能だが、
クラスの配列の初期化時にはデフォルトコンストラクタが呼ばれるので
デフォルトコンストラクタが必須。

どーしてもデフォルトコンストラクタを持たせたくないのなら、
(スマート)ポインタの配列にするしかないな。

181:デフォルトの名無しさん
07/02/25 23:40:35
配置newとかを使ってやる方法は無くもないが、最後の手段。
現在のC++ではどうしようもないから179-180の言うとおりにするしかない。

182:デフォルトの名無しさん
07/02/26 00:07:26
>>179
vectorに収納…というのは、どのような使い方ですか?

vector<MyClass> c1(10);
のような使い方だとデフォルトコンストラクタしか呼べませんよね?

183:デフォルトの名無しさん
07/02/26 00:09:25
reserveしてからpush_back!push_back!push_back!

184:デフォルトの名無しさん
07/02/26 00:19:57
>>177
ありがとう

フォルダとかディレクトリまで表示されるけどファイルだけに
するにはどうするの?

185:デフォルトの名無しさん
07/02/26 00:22:20
>>184
1. それぞれのファイル属性を調べる
2. dir のオプションを調べる

186:デフォルトの名無しさん
07/02/26 00:22:41
>>184
少しは自分で調べろ。

187:デフォルトの名無しさん
07/02/26 12:34:03
彼にとって調べるとは人に聞くことだけなのさ

188:デフォルトの名無しさん
07/02/26 12:52:25
Win32って無くなるの?

189:デフォルトの名無しさん
07/02/26 13:19:14
たとえば Windows のファイル ハンドルをカプセル化したような
クラスを作った場合、

class File {
private:
    HANDLE  m_handle;
public:
    .....
    HANDLE GetHandle(void) { reeturn m_handle; }
    operator HANDLE(void)  { return m_handle; }
};

この GetHandle や operator HANDLE は const 関数にすべき?

190:デフォルトの名無しさん
07/02/26 13:26:32
微妙だな。
MFCのCWndや、ATL::CWindowではconst付けているけど。

191:デフォルトの名無しさん
07/02/26 19:36:57
とあるツールのソースがあるんですが、拡張子が.vcprojというファイルがあることから
Visual C++ で作られたと言うことが想像できるんですが、具体的にVisual C++ のどのバージョン
で作られているのかを知るためにはどうやって調べたらいいのでしょうか?僕の持っているVisual C++
ではコンパイルに失敗して困ってます。

192:デフォルトの名無しさん
07/02/26 19:41:06
.vcprojファイルをテキストエディタで開くと
VC++のバージョンが書いてあります

193:デフォルトの名無しさん
07/02/26 19:46:26
>>192
だっは〜すいません、ありがとうございます!

194:デフォルトの名無しさん
07/02/26 20:51:36
たびたびすみません。。
>ProjectType="Visual C++"
>Version="7.10"
とあったのですが、これは .NETになるんですかね?
Visual Studioの .NETを使うべきですかね、それともVisual Studio2005でしょうか

195:デフォルトの名無しさん
07/02/26 20:56:03
>>194
7.0は2002
7.1は2003
8.0は2005



196:デフォルトの名無しさん
07/02/26 20:57:33
>>195
どもです!!

197:デフォルトの名無しさん
07/02/26 21:04:54
>>194
2003を使うのが手っ取り早いですが、2005でも問題ないと思います。

198:デフォルトの名無しさん
07/02/26 22:13:12
VC++ で質問です。

class A
{...}

class B: public A
{...}

class C
{
B* b;
vector <A> a;
}

こんな感じのクラスを作成してて
C::a のうちの一つの参照から C::b へポインタをコピーした場合
C::b を B* として適切に扱えるのでしょうか?

199:デフォルトの名無しさん
07/02/26 22:16:23
B *b = &a[0]みたいなことなら、出来ないと思うが。
追加したメンバ変数・仮想関数がないというような
限定条件を付ければ、reinterpret_castしても動くだろうけどさ。

200:198
07/02/26 22:28:22
ありがとうございます。
上でやりたいことを少し説明します。

まず A が基本フレームと呼ばれるセクタ単位のデータ構造を扱います。
B は基本フレームを拡張したフレームで基本的には仮想ではない関数郡です。
そして C はフレーム集合を保持するクラスです。
C では C::a のうち頻繁に利用するフレームを C::b として利用できたらいいのにと考えています。

今手元に開発環境がないのですが
適切に扱える C::b1 もあったりできない C::b2 があったりして悩んでいます。

ポインタを使わないでよい用法があればよいのですがありますでしょうか。

201:デフォルトの名無しさん
07/02/26 22:28:30
>>198
aをstd::vector<boost::shared_ptr<B> >型にでもしておけ。

202:デフォルトの名無しさん
07/02/26 23:02:25
URLリンク(douga.adult-55.com)

203:デフォルトの名無しさん
07/02/26 23:57:44
>>183
なるほど!
ありがとう!!

204:デフォルトの名無しさん
07/02/27 09:41:55
>>200
vector<A*>にしてBにキャストしたい要素はちゃんとBのインスタンスを格納しとけば普通にダウンキャストできると思うんだが
キャストしたくないというならクラス別に配列分けるか、クラスの設計見直すか

205:デフォルトの名無しさん
07/02/27 21:24:13
>>198
俺の想像だけどさ

某ライブラリで
struct Box { int x0,y0,x1,y1; }; が既にあるとする。

値の配列でライブラリから受け取ったり渡したりするから
Box型の配列のまま変えられない。

受け取ったり渡したりするだけならそのままでいいが
頻繁に使う要素は、やはり不便だ。

そこで
struct BoxEx : Box
{
    int GetWidht() { return x1-x0; }
};
みたいに便利なメソッドつきの無理やりキャストしたいって事か。

206:デフォルトの名無しさん
07/02/27 21:30:58
根本的ですが、

for(i = 0; i < 10; i++){
 if(i < 5) a();
 if(i < 7) b();
 if(i < 9) c();
 d();
}

と、

for(i = 0; i < 5; i++) a();
for(i = 0; i < 7; i++) b();
for(i = 0; i < 9; i++) c();
for(i = 0; i < 10; i++) d();

ではどっちが効率的ですか?

207:デフォルトの名無しさん
07/02/27 21:38:01
なんとなく前者の方が効率よさそうな気がするが、
パフォーマンスに関してはとにかく実測(して比較)しろ。それが鉄則だ。

208:デフォルトの名無しさん
07/02/27 21:46:02
そもそもabcdを呼び出す順番が違ってくるけど、それでいいのか。

209:デフォルトの名無しさん
07/02/27 21:47:13
たぶん後者のほうが効率いいと思うが
そんな効率気にする必要があるのか

「これじゃぁ効率悪いよなぁ」と余計なとこまで考えてプログラミングがなかなか進まないのは罠

210:デフォルトの名無しさん
07/02/27 22:02:03
ファイルの書き込みについて、なんですが
追加モードで開いて書き込むと、一番最後に追加されます。
”先頭に追加した文字列を作ってから書き込む以外”
先頭に追加する方法はあるでしょうか?
std::ofstream ofs( "hoge.txt", std::ios::app );

seekで先頭にファイルのポインタ先頭にしても
末尾に追加されるみたいなんです。
よろしくお願いします。

211:デフォルトの名無しさん
07/02/27 22:06:05
日本語の実装に難があるような気もするが、
要するに、ファイルの先頭行が最新の書き込みであってほしい、という話?

212:デフォルトの名無しさん
07/02/27 22:26:29
>>210
先頭に追加?OSレベルでもそういう機能をファイルシステムに
備えている物はないんじゃないか?

213:デフォルトの名無しさん
07/02/27 22:35:09
>>210
追加だから最後に追加されるのが正しいでしょ。
先頭に書いたら上書きじゃないのか。

それとも先頭に挿入?
メモリでもファイルでも挿入というのは、
それ以降の全てのデータをずらして書き込み場所を空けてから
書き込むのでちょっと大変なサギョウだ。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5304日前に更新/200 KB
担当:undef