[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 07/15 20:46 / Filesize : 200 KB / Number-of Response : 834
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.35【環境依存OK】



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

2 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 21:37:35 ]
立ってなかったので立てました。
ついでに自分で2get

3 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 21:38:31 ]


4 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 22:09:18 ]
乙4ゲット

5 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 22:09:21 ]
cerr << '>>1乙' << endl;

6 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 22:12:28 ]
>前スレ1000
releaseしないといけないのが面倒

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

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

9 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 01:48:03 ]
>>7
秋刀魚を食べたら
まで読んだ

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

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



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

12 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 09:49:00 ]
>>10
配列は初期化リストで初期化できない。

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

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

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

ReadCastFile(cD);

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

}

14 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 14:04:59 ]
*が1個多い。

15 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 14:12:58 ]
>>14
ありがとうございます。

16 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 15:32:57 ]
>>16
pc10.2ch.net/test/read.cgi/tech/1170343752/273
向こうにレスついているからそれ読んだら二度と来るなよ。

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

19 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 18:18:29 ]
>>18
GetPrivateProfile*で始まる関数を調べるるるる〜

GetPrivateProfileInt
msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpsysinf/html/_win32_getprivateprofileint.asp
 ・
 ・
 ・

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



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

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

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

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


23 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 22:33:55 ]
GetPrivateProfileは使っちゃらめええええ

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

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

25 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 23:13:09 ]
XML使え。

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

…なんか日本語おかしい

27 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 23:25:28 ]
>>25
XMLって面倒なんだけど

28 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 23:26:06 ]
>26
グローバル変数をやめればおk。

29 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 23:32:25 ]
>>27
MSXML

30 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 23:32:55 ]
>>28
そんな Σ(´Д`lll)



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

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

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

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

35 名前:26 mailto:sage [2007/02/21(水) 00:01:23 ]
>>31-32
なるほどー…
クラスってこういう使い方もするんですね…

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

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

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

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

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

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

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

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

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

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

40 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 01:49:00 ]
externをちゃんとわかってないヤツがいるな



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

42 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 09:45:48 ]
extern 無しは「ここにおいとくから使えよコラwww」

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

43 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 10:06:32 ]
なるへそ

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

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

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

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

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

48 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 12:26:19 ]
へえ

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

50 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 15:17:14 ]
>>47
偽者発見



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

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

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

53 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 17:42:22 ]
>>51
デストラクタがすっ飛ばされちゃうんだっけ?

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

55 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 18:28:37 ]
>>54
簡単に実装できるからいいんじゃね?

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

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

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

58 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 18:47:56 ]
だめだめ

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

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



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

62 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 02:24:16 ]
>>61
コンストラクタで初期化すれば?

63 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 02:58:25 ]
>>61 ふつうに初期化すればいいよ。

64 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 02:59:14 ]
>>61
struct OBJECT a={12.345};

65 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 06:44:45 ]
そもそもFLOATってどんな型だよ。

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

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

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

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

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



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


72 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 20:20:25 ]
boost::format

73 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 20:21:12 ]
boost::spirit

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

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

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

つ boost::Xpressive

77 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 20:28:45 ]
readlineしてregexp。

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

79 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 20:37:49 ]
なんだか要求が微妙すぎるな。
自作するしかないのでは。

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

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

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



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

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

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

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

84 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 18:05:45 ]
>>83
つ[std::vector]

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

86 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 18:12:33 ]
コンストラクタで memset すればいいのでは。

87 名前:デフォルトの名無しさん [2007/02/23(金) 18:25:57 ]
memsetでやります

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

89 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 18:41:54 ]
そのほうがよかろう

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



91 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 19:42:59 ]
>>90
スレ違い

Win32API質問箱 Build50
pc10.2ch.net/test/read.cgi/tech/1171721448/

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

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

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

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

94 名前:90 mailto:sage [2007/02/23(金) 20:08:37 ]
>>91
スマン去ります。

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

95 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 21:12:58 ]
>>90
Win32APIスレ行け
んでもってリッチテキストでも使ってろ

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

97 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 11:59:22 ]
>>97
std::accumulate()

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

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

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

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

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

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

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

つ [SetProp]

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

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

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

109 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 17:16:39 ]
こんな感じのこと?

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

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

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



111 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 17:22:13 ]
やめておいたほうがいい

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

113 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:03:27 ]
clockは経過時間ではなくCPU時間

115 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:05:28 ]
デバッグ目的なら好きにすれば?

116 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:06:31 ]
デバッグ目的ならプロファイラがいいと思うけど

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

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

119 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:10:51 ]
CLOCKS_PER_SEC で割る

120 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:11:17 ]
なんか激しく無謀なことをしている悪寒。



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

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

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

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

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

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

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

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

124 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:43:38 ]
>>122
>>113をよく嫁

125 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:46:43 ]
>>113自体エスパーが必要だと思うんだが

126 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:47:50 ]
122じゃないけど、自分も同じことやってたよorz


127 名前:デフォルトの名無しさん [2007/02/24(土) 18:51:23 ]
>>125
初心者なんですいません

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

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

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

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

129 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 20:32:31 ]
CRTはソースあるんだから嫁よ。

130 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 20:57:20 ]
>>128
「〜ようです」って、何見て言ってるんだ?



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

132 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 21:12:55 ]
>>128
「〜ようです」って、何見て言ってるんだ?

133 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 21:17:32 ]
何度言えば気が済むんだ?

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

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

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

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

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

138 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 22:38:59 ]
man 3 uname

139 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 23:12:23 ]
>>139
つ[stat()]



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

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

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

144 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 01:36:52 ]
>>142
レスありがとうございます。

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

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

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

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

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

よろしくお願いします。


147 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 17:55:14 ]
EXTERN_C

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


149 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 18:00:08 ]
ヘルプ

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



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

152 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 18:06:46 ]
>>151
間違えたかも。

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


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


153 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 18:18:52 ]
>>150
設定ファイルを直接見る必要が無いなら
timeで拾った値をバイナリで書き込めばいいんじゃないかな。

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

156 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 18:25:04 ]
>>150
W3C-DTF

157 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 18:30:34 ]
>150
rfc 3339

158 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 18:33:33 ]
>>153
これで動くんじゃないの?

159 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 18:38:48 ]
おいらのところではコンパイル・リンクできたけど?

160 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 18:51:23 ]
>>155
time_tの整数値
yyyymmddhhmmss形式
y/m/d h:m:s形式
好きにしな。



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

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

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

164 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 21:51:02 ]
フォルダ内の全ファイルを列挙するプログラムを教えて下さい

165 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 21:53:35 ]
system("dir");

166 名前:164 mailto:sage [2007/02/25(日) 22:04:00 ]
printfで表示するには?

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

168 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 22:11:16 ]
>>164
環境依存

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

169 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 22:13:08 ]
>>167
十分アリだと思う dir /b ほうがイイと思うが

170 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 22:15:15 ]
popenの事たまには思い出してあげてください



171 名前:164 mailto:sage [2007/02/25(日) 22:16:58 ]
VisualC/C++
WindowsXP
フォルダ内のファイル名をstd::stringの配列に格納したいのです

172 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 22:32:34 ]
>>171
FindFirstFile
FindNextFile

あたりでどうかな

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

174 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 23:03:35 ]
そう、待機時間を0にすればいいと思う。

175 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 23:08:32 ]
そうか、ありがと。

176 名前:デフォルトの名無しさん [2007/02/25(日) 23:11:26 ]
>>172
使い方がわかりません

177 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん [2007/02/25(日) 23:21:25 ]
基本的なことで申し訳ないのですが、
クラスのオブジェクトの配列を作るとき、
そのクラスに引数を持つコンストラクタを持たせることは出来ないのですか?

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

179 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 23:33:21 ]
諦めてvectorに収納したら?

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

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



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

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

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

183 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 00:09:25 ]
reserveしてからpush_back!push_back!push_back!

184 名前:デフォルトの名無しさん [2007/02/26(月) 00:19:57 ]
>>177
ありがとう

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

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

186 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 00:22:41 ]
>>184
少しは自分で調べろ。

187 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 12:34:03 ]
彼にとって調べるとは人に聞くことだけなのさ

188 名前:デフォルトの名無しさん [2007/02/26(月) 12:52:25 ]
Win32って無くなるの?

189 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 13:26:32 ]
微妙だな。
MFCのCWndや、ATL::CWindowではconst付けているけど。



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

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

193 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 19:46:26 ]
>>192
だっは〜すいません、ありがとうございます!

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

195 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 20:56:03 ]
>>194
7.0は2002
7.1は2003
8.0は2005



196 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 20:57:33 ]
>>195
どもです!!

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

198 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 22:16:23 ]
B *b = &a[0]みたいなことなら、出来ないと思うが。
追加したメンバ変数・仮想関数がないというような
限定条件を付ければ、reinterpret_castしても動くだろうけどさ。

200 名前:198 [2007/02/26(月) 22:28:22 ]
ありがとうございます。
上でやりたいことを少し説明します。

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

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

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



201 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 22:28:30 ]
>>198
aをstd::vector<boost::shared_ptr<B> >型にでもしておけ。

202 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 23:02:25 ]
douga.adult-55.com/movie_141/flvplayer.swf

203 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 23:57:44 ]
>>183
なるほど!
ありがとう!!

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

205 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 21:24:13 ]
>>198
俺の想像だけどさ

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

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

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

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

206 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 21:38:01 ]
なんとなく前者の方が効率よさそうな気がするが、
パフォーマンスに関してはとにかく実測(して比較)しろ。それが鉄則だ。

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

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

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

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

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



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

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

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

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

214 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 22:50:12 ]
行の先頭4バイトを次(ファイルオフセットには前)の行へのオフセットと決めておいて、
ファイルの先頭だけ特別扱いすれば・・・誰かそんな変態FS作らないかな。

215 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 23:01:51 ]
>>207-209
確かに…
実測すべきでした。ハイ。
済みませんでした。
やってみます。

216 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 23:15:00 ]
>>212
>>213
はい。やりたいことは挿入です。
挿入みたいなモードは無いですか。
ログの保存を先頭に挿入して、逆の順番に保存してる
アプリがあったので、どうしてるのかと思いまして。

レスありがとうございました。

217 名前:198 [2007/02/27(火) 23:21:41 ]
>>205
ありがとうございます。
でもちと違うのかな。

198 の
  vector <A> a;

  vector <A*> a;
として
  b = a.at (x);
とすることでやりたいことができました。

218 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 23:26:58 ]
え?キャスト無かったら、こういうエラーにならない?

> error C2440: '初期化中' : 'A *' から 'B *' に変換できません。
> base から derived へのキャストには、dynamic_cast または static_cast が必要です。

219 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 23:29:45 ]
>>216
そのログのフォーマットはどんなかんじでしょうか?
タグ(目印)みたいなものがついてないでしょうか?
ログのフォーマットがわかればそのアプリがどんな
実装してるかわかるかもしれんよ

220 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 08:10:06 ]
配列の中身をランダムに入れ替えて別の配列に代入したいのですが、
被らず代入する方法を教えてください。お願いします。



221 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 08:21:50 ]
>>220
手順
要素数を N とするとき
1. そっくりそのまま別の配列にコピーする
2. 配列の 1 番目の要素と x1 番目の要素を交換する (x1 は 1 から N までの一様乱数で求める)
3. 配列の 2 番目の要素と x2 番目の要素を交換する
...
配列の N 番目の要素と xN 番目の要素を交換する

222 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 08:22:47 ]
そのままコピーした後、ランダムに並び替えるのが楽なんじゃないかな

223 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 08:29:55 ]
>>221-222
ありがとうございます。
なるほど、入れ替えた回数が「ランダム」ということになりますね

224 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 08:33:56 ]
>>223 違う

rand() の精度で良ければサンプルはこんな感じ
N 回の入れ替えで全体の順序がランダムになる

#include<stdio.h>
#include<stdlib.h>
#define N 10
void swap(int *a, int *b){
int c;
c=*a;
*a=*b;
*b=c;
}
int main(void){
int a[N], b[N];
int i;

for(i=0;i<N;i++) a[i]=i+1;
for(i=0;i<N;i++) b[i]=a[i];
for(i=0;i<N;i++) swap(&b[i], &b[rand()%N]);
for(i=0;i<N;i++) printf(" %d", b[i]);
printf("\n");
return 0;
}

225 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 16:53:00 ]
剰余かよ

226 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 17:27:59 ]
int b[1024];
に様々な+-含めた値が入ってて、そいつをfloat型として無理に渡した関数先で
+- 32768.0の範囲に収まるfloat型にきちんと直したいんですけど
具体的には
void func(float *b){
int o[1024];
for(int i=0; i<1024;i++){
o[i]=b[i]*(1.0 /32768.0);
}
}
int main(void){
func(b);
}
}
こんな感じにしたいんです。
func()の引数がfloatではなくintであれば、この計算で正常に変換出来るんですが
どうしてもfloatで渡す必要があって困っています。
func内でint型の変数を用意してコピーしてやると上手くいきますが、ループ内の計算式で何とかしたいのです。
どうすれば上手くいくのでしょうか?


227 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 19:58:37 ]
すみません。間違えました。。。
void func(float *b){
float o[1024];
for(int i=0; i<1024;i++){
o[i]=b[i]*(1.0 /32768.0);
}
}

です。結果はfloatで出したいのです。

228 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 20:19:57 ]
ようするにint to floatって事?

229 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 22:57:53 ]
>>227
どうしたいのかよく和下欄のだが、
それだと、bの中身とoの中身が全然変わっちまうぞ。

230 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 23:07:59 ]
すみません。
>>228のとおり、ようするに正しくfloatからintへ変換したいのです。

例えば
int f=-2
printf("%f\n",f);
これで正しく-2が表示出来るようにしたいのです。
この場合fに何か計算式をかければいけそうだとは思うんですが…。



231 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 23:10:12 ]
浮動小数点数には表現できない数値のいうのがあってだな

232 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 23:15:17 ]
>>230
その前の話を全て無視して、単にそのprintfの場合だったら、
可変個引数だからキャスト演算子を明示しろということになるが。
printf("%f\n", (float)f);

233 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 23:17:30 ]
>>230
まて落ち着け。
前の文を見る限りそんな単純な問題でもなさそうだが…
その話なら単純にキャストだ。

とりあえず落ち着けw

234 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 23:26:40 ]
なんか質問が似てるんだけど
GPGPU
pc11.2ch.net/test/read.cgi/tech/1128780920/377
とは別の人?

235 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 23:33:32 ]
void func(float *t){
for(int i=0; i<128;i++)
printf("%f\n",t[i]);
}
int main(void){

int t[128];
for(int i=0; i<128; i++){
t[i]=i;
}
func((float *)t);
return 0;
}
これで0〜128が表現できねぇよって話か?
GPUの事はわからんから、intやfloatのサイズの事はわからんからアドバイスは出来ない。

236 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 23:45:10 ]
>>235
そうです!それです!
GPUじゃなくて、CPUでのやり方が知りたいんです。

237 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 23:51:42 ]
C なら

int f;
*(float*)&f = -2;
printf("%f\n", *(float*)&f);

C++ なら

int f;
(float&)f = -2;
printf("%f\n", (float&)f);

238 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 23:52:41 ]
C++ タイプのキャストを使うなら

int f;
reinterpret_cast<float&>(f) = -2;
printf("%f\n", reinterpret_cast<float&>(f));

だな。

239 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 01:07:25 ]
C++の機能を使わないで済むならC++の機能は使わない方がよい。

240 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 01:16:39 ]
Cの機能を使わないで済むならCの機能は使わない方がよい。
アセンブラの機能を使わないで済むならアセンブラの機能は使わない方がよい。



241 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 01:16:40 ]
int to short
*pt>> (8 * sizeof(int) - 16)

int to floart
*p<< (8 * sizeof(int) - 32)


242 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 01:21:29 ]
>>241
質問者はint型の変数をfloatの引数を持った関数に渡して
関数内でfloatからintに戻すって話だろ

243 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 01:42:08 ]
>>237
それってsizeof(int) < sizeof(float)のときにメモリ破壊しね?

244 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 02:17:41 ]
関数の引数にすると、キャストしても無駄だよ。
だから>>235の例は上手くいかない。


245 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 07:03:14 ]
そもそもサイズの違うかもしれないものにキャストしちゃいかんだろ

246 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 07:35:14 ]
環境はC++builderです。
CreatThreadを使用したマルチスレッドのアプリケーションを
ウィンドウの右上の×ボタンを、押して終了させたとき、
リソースとか全部開放されるのでしょうか?

247 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 10:00:08 ]
>>246
動的に確保したリソースは自分で開放

248 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 10:44:51 ]
>>247
はやいお返事、どうもありがとうございます。

249 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 14:52:28 ]
>>245
このスレは環境依存 OK なはずなんだが

250 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 16:26:53 ]
環境書いてないね



251 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 16:30:37 ]
そうだね、ぬるぽだね

252 名前:デフォルトの名無しさん [2007/03/01(木) 17:30:33 ]
C++てどこでDLするの

253 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 17:33:23 ]
>>252
C++の何がほしいんだ?

254 名前:デフォルトの名無しさん [2007/03/01(木) 17:42:23 ]
統合環境なら何でも

255 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 18:12:16 ]
そんなの探す前にコミュニケーション能力あげる方が先だな

256 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 18:44:22 ]
>>254
Microsoft Visual C++ 2005 Express Edition

257 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 19:08:40 ]
>>246
窓っ子として注釈しておくと、
プロセス(タスクマネージャで見れるプログラムの単位)が終了した段階で
すべてのリソースはキレイに開放される

窓を[×]で閉じる=プロセスの終了ならそれで問題ない
だからスレッドの終了やCloseWindowだけとかなら駄目だし、
精神論で言って理想的なのはもちろん>>247

258 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 23:03:49 ]
>>257
詳細に、どうもありがとうございます。
理解できました。

259 名前:デフォルトの名無しさん [2007/03/02(金) 23:16:03 ]
vector<T>を使って、Win32のアプリでクラスの配列を扱いたいんだが、
配列をグローバルに扱う方法がわかりません…
コントロールのハンドル等を扱うクラスなので、
初期化をウィンドウプロシージャ内で行いたいのですが、
どのようにすればいいのでしょうか。

260 名前:デフォルトの名無しさん mailto:sage [2007/03/02(金) 23:19:01 ]
push_back、push_back



261 名前:259 [2007/03/02(金) 23:29:03 ]
ごめんなさい、push_back使うのはわかるのですが、
最初どこでどのように最初のメモリの確保を行えばよいのでしょうか。

262 名前:デフォルトの名無しさん mailto:sage [2007/03/02(金) 23:33:14 ]
ヘッダで以下のように
typedef vector<T> vT;
extern vT *pvT;

どっかのcファイルで
static vT *pvT;

最初のメモリ確保は、WM_CREATEとかでnewしておけば良い。

263 名前:デフォルトの名無しさん mailto:sage [2007/03/02(金) 23:37:04 ]
>>259
えーと、あるウィンドウに属するコントロールの配列を管理するんだろ?
何で「グローバル」である必要があるんだ?


264 名前:デフォルトの名無しさん mailto:sage [2007/03/02(金) 23:42:22 ]
グローバル空間に

vector<T> v;

でいいんじゃないの?

265 名前:デフォルトの名無しさん mailto:sage [2007/03/02(金) 23:42:26 ]
>>262
なぜポインタにする必要がある?

266 名前:デフォルトの名無しさん mailto:sage [2007/03/02(金) 23:44:13 ]
>>262
staticな変数をexternしてもリンクエラーが出るだけな気が。

267 名前:デフォルトの名無しさん mailto:sage [2007/03/03(土) 00:20:41 ]
>>259
int型の変数だろうとvector<T>型の変数だろうと
グローバル変数の使い方は同じじゃね?

268 名前:デフォルトの名無しさん mailto:sage [2007/03/03(土) 00:24:21 ]
>>267
static配列は
int a[] = { 0, 1, .. };
のような配列初期化構文が使えるが、vector<T>では使えないという
違いがあるな。

vector<T>をstaticに初期化したいならば
int a[] = { 0, 1, .. }:
vector<int> v(&a[0], &a[N]);
のように書くしかないが、メモリの無駄だな。

が、今回のケースでは初期化はWinProc内で行いたいそうだから
どうでもいいんだな。

269 名前:デフォルトの名無しさん mailto:sage [2007/03/03(土) 00:25:57 ]
コントロールを動的に生成/消滅させるウィンドウでないのなら
単なる配列でいいんじゃないの?
要素数が固定なら、vector<>はオーバースペック。

270 名前:デフォルトの名無しさん mailto:sage [2007/03/03(土) 08:45:11 ]
>>268
仮にvector<int> v = {0, 1, ...};のような初期化ができるようになっとしても、
コンストラクタの呼出まで初期化子を静的に用意しておくことになるだろうから、
その実装はおそらくこう書くのと同じようになると思う。
int a[] = {0, 1, ...}:
vector<int> v(&a[0], &a[N]);



271 名前:デフォルトの名無しさん [2007/03/04(日) 00:41:25 ]
質問させてください。
C++によるオブジェクト間のメッセージ通信についてなんですが、
オブジェクトAがオブジェクトBを含有する構造の場合、
AからBへのメッセージ送信は、AがBのメソッドを呼び出すという形でOKですが、
BからAへのメッセージ送信はどう実装するのがベターなんでしょうか?

1.AからBのメソッドを呼び出し、戻り値をメッセージとして扱う、(BはAに処理させたい内容を戻り値で返す)
2.BにAの参照を渡しておいて、BからAのメソッドを呼び出す、
3.各オブジェクトにメッセージプロシージャを用意して、そこにメッセージを投げる、(ウィンドウメッセージのように)
あたりは試してみているんですが、どうにもソースがスパゲッティになりがちで悩んでいます。
現在は、オブジェクトへのアクセス手段を統一でき、尚且つ不要なメッセージを無視することが可能な「3」を用いて実装しているのですが・・・
何か他にいい手法はないでしょうか?

272 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 01:02:31 ]
>>271
相互依存するぐらいなら同じクラスにしちゃえばいいのに。
それでおかしくなるようなら A, B のどちらか(または両方)が大きすぎるんじゃないの?

273 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 01:25:41 ]
>>271
デリゲートな悩みですか

274 名前:デフォルトの名無しさん [2007/03/04(日) 01:35:33 ]
実装というか、コーディングマナーの質問です。
配列の並び順を変更するときに、テンポラリ変数としてヒープ領域を使うのはありでしょうか。

275 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 01:37:36 ]
必要ないのにヒープ領域は使わないかな
うっかりミスでリークしたりしたらあれだし

276 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 01:40:47 ]
>>271
ケースバイケースだなぁ。

オブジェクト間のコミュニケーションが複雑化しすぎると感じるなら、
Mediatorパターンなんてのもあるよ。

ウィンドウメッセージは直接的なC++のメンバ関数呼び出しより
はるかに非効率だけれども、
非同期にできたり、相手が死んでいた場合のdangling pointer問題を
回避できたりという利点はある。

277 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 01:42:18 ]
>>274
ヒープ使ってstd::auto_ptr<>に突っ込む分には>>275の言うような
問題はないが、
速度の問題だけで言えばalloca()の方が速い。移植性が劣るし
スタックサイズの制限にひっかかるかもしれないが。

278 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 01:54:53 ]
>>272
元は全部1つのクラスで処理をしていたんですが、
行数が多すぎて分かり辛くなってきたため、分割しようとしたところ、相互依存の問題が出てきた感じです。

>>273,276
色々ありがとうございます。
デリゲート、Mediatorパターン、ちょっと調べてみます。

ゲームプログラムで、非同期処理なので、その辺ももう少し考えてみます。

279 名前:デフォルトの名無しさん [2007/03/04(日) 07:12:04 ]
今後WIN32は消える?

280 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 07:26:12 ]
>>279
100年後とかには生き残ってないだろな。



281 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 10:23:01 ]
>>277
allocaをMSのライブラリは拒否している(昔は使っていたが)。
デフォルトで配列を使ってサイズオーバーしたら
ヒープを使うという戦略になっている
当然allocaより速い

282 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 11:16:36 ]
どうして適当なこと言う奴が後を絶たないのか

283 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 11:31:09 ]
いい加減な事を発言した奴には罰金を科せばいい。

284 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 15:13:11 ]
国会でやると大もうけだな

285 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 18:32:04 ]
レスが付かないのでこちらにきました

Visual Studio2005 C++で
SystemParametersInfo(SPI_SETDESKWALLPAPER, NULL,
"c:\\a.bmp" ,0 );
しても壁紙が変更しません
解る方、教えてください



286 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 20:14:00 ]
人が居なくても、ちゃんと元スレには「あちらで訊いてみます」って書いたか?

287 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 00:14:35 ]
>>285
最後の引数に
SPIF_UPDATEINIFILE|SPIF_SENDWININICHANGE
しとけ

288 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 04:34:28 ]
環境は、C++builderです。

void __fastcall TForm1::Button1Click(TObject *Sender){
//処理
}

他の関数で、ボタンを押した動作をしたいときは、
どのようにすればよいでしょうか。

289 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 10:29:58 ]
TButton::Click()

290 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 14:06:31 ]
>>289
ありがとうございます。



291 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 21:30:09 ]
>>287
レスどうもです
SystemParametersInfo(SPI_SETDESKWALLPAPER, NULL,
"c:\\a.bmp" ,SPIF_UPDATEINIFILE|SPIF_SENDWININICHANGE );
ってしたんですが、だめでした
他にあればお願いします



292 名前:デフォルトの名無しさん [2007/03/07(水) 02:58:25 ]
C++
WinAPIをまとめてあるフレームワークライブラリを解析していたんですが

///// hoge.h ////
class hoge{
hoge();
}
extern hoge* phoge;

///// hoge.cpp ////
hoge* phoge;
hoge::hoge(){
phoge = this;
}

上のような(簡略化してあります)記述がありました。
コンストラクタ内でthisポインタでインスタンスのアドレスを
取得していると思うのですが、このインスタンスが実際に何処にあるのかが、分かりません。

他のファイルも調べてみましたが上の場所でしか、phogeにアドレスが代入されていませんでした。
環境はVisualC++2005です。

293 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 03:04:16 ]
hogeのインスタンスがどこにも無いならコンストラクタも走らず、
したがって、phogeは常にNULLのはず。
とおもったが、phogeの代入箇所?さがすのはhogeのインスタンス化位置でそ?

294 名前:デフォルトの名無しさん [2007/03/07(水) 03:38:54 ]
hogeのインスタンス化のいちも探してみましたが、見つかりませんでした。
さっき気がついたのですがウィンドウの作成時にWNDCLASSではなくCREATESTRUCTが
つかわれていました。これが何か関係あるのでしょうか?
以下のように、この構造体のhInstanceに先ほどのhogeのインスタンスがわたされていました。
cs.hInstance = *app;

295 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 07:08:45 ]
>>292
ソースがあるならそこにブレークポインタでとめて
ステップ実行で周辺を探すって手もある。
上手く行くか知らん。

hoge派生クラスがあるとか。
んなわけないか。

296 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 07:30:28 ]
生成された時の自分自信のポインタをいれてるだけじゃん?

297 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 07:36:58 ]
生成されているのは事実だが
何処で生成しているか判らないから聞いている質問だと思うが?

ブレークポイントを置いてこのときはまだ生成されていないとかから
すこしずつ絞り込んで行くとか。

298 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 07:41:43 ]
extern 宣言してあるんだからコンパイル開始時に生成されると思うんだけど

299 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 07:43:12 ]
あ、コンパイル開始というかプログラム開始時に

300 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 08:58:45 ]
「class hoge を継承したクラスのインスタンスを1個は作れ。 作るタイミングはおまえさん次第」
で、どこかで作られたであろう インスタンス をポインタで保持して、
いつでも呼び出せるようにしている と。

# MFC の CWinApp じゃね?



301 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 09:00:01 ]
グローバルで作ったのなら スタートアップルーチン内 でインスタンス化してる

302 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 09:30:18 ]
DLLを作成したいのですが、
フリーソフトによる開発環境では不可能なのでしょうか?
Visual C++では出来なかった物で…。

303 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 09:45:38 ]
できるよ
VCのスレ…いや、画像付きの解説ページがあったはずだから、ぐぐった方が良いな

304 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 09:50:37 ]
>>303
ExpressバージョンではMFS、ATLが含まれていないので作成出来ないと思っていました。
有難うございます、もう少しぐぐってみます。

305 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 10:43:30 ]
MFCもATLもなくたってDLLは作れる。
プロジェクト作るときにどこかでDLLを選ぶだけ。

306 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 11:29:49 ]
>>291
つ GetLastError()

307 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 16:27:32 ]
質問です。
クラスの「constメンバ関数」は、メンバー変数の書き換えを禁止しますよね。
これによって「その関数は何度呼び出しても問題ないはずだな」
と思って分担作業をしていました。

ところがconstメンバ関数の中から、グローバル空間の変数を書き換えている奴がいたのです。
いままで知らなかったのですが、constメンバ関数はグローバル空間の変数などを書き換えてもコンパイルエラーにならないのですね。

この行為を禁じるための、C++文法的な書き方はありませんでしょうか。
「グローバル変数使うの禁止!」といっても使う奴が稀にでてきてコマっています。

308 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 16:31:38 ]
ありません。

309 名前:デフォルトの名無しさん [2007/03/07(水) 16:43:50 ]
質問です。

ヘッダーファイルで
private:
     int (*ptr)[10];
     int x[10][10];
と宣言しています。ちゃんと機能しています。
それでデコンストラクターでメモリの解放をしたいんですけど
     delete [][] x;
ではコンパイルが通りません。
     delete [] x;
では
     Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
と出てRun-Time Errorになってしまいました。
どうやって解放するんでしょうか?教えてください。

環境はVC++2005 Express Editionです。

310 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 16:49:12 ]
>>309
newしてないんだからdeleteする必要はない。



311 名前:309 mailto:sage [2007/03/07(水) 16:53:34 ]
>>310
あア、ナルほど!
newとdeleteはセットなんですね。
ご親切にどうもありがとうございました!

312 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 17:02:02 ]
あと、デコンストラクタじゃなくて、デストラクタな。
俺も昔勘違いしてた。

313 名前:デフォルトの名無しさん [2007/03/07(水) 17:40:36 ]
if(aaa>=1 && aaa<=10)

のように

if(aaa>='1' && aaa<='10')

これも文字だけでできますか?わざわざ数字に変換しなくてもいいですか?

314 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 17:43:27 ]
わざわざ数字に変換しないとだめです

315 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 17:43:51 ]
'10'

316 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 17:45:25 ]
'10'は規格上は通るけど、恐らくあなたの期待した値にはならないでしょう。

317 名前:デフォルトの名無しさん [2007/03/07(水) 17:47:25 ]
'9'までしか無理ということですか?

318 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 17:49:53 ]
文字定数でぐぐれ

319 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 17:54:32 ]
そもそもaaaの型は何だよ。何が入っているんだ

320 名前:デフォルトの名無しさん [2007/03/07(水) 18:00:41 ]
リテラルにあった型です



321 名前:デフォルトの名無しさん [2007/03/07(水) 18:30:53 ]
年月日時分秒を取得するlocaltimeという関数は見つかったのですが
その取得した時間に10時間プラスしたときに
24時間を越えると日付によって年月日は変動すると思います

時間をたしたいのですが
こういう処理のためになにか用意されていないでしょうか?
環境はVC++2002です

322 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 18:33:17 ]
閏秒は無視して、localtimeに渡す前のtime_tに対して10*3600足せばよくね?

323 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 18:34:19 ]
time_t
struct tm

324 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 18:34:25 ]
>>321
time_t型にした上で、10時間(10 * 60 * 60[sec])を足し、localtime()でばらすかstrftime()で文字列にすれば宜しい。
既にlocaltime()でばらしてあるなら、tm_hourに10を足してからmktime()でtime_tにしてもいい。

325 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 18:39:11 ]
初心者本でこの辺りをまともに解説しているのってあるのかな。
ちなみに、localtime(), gmtime(), asctime(), ctime()はスレッドセーフではないので
マルチスレッドプログラミングのときはご用心。

326 名前:321 [2007/03/07(水) 18:45:56 ]
マルチスレッドプログラミングですがlocaltimeを使うのはまずいでしょうか?

327 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 18:49:18 ]
処理系のマニュアルを参照セヨ

328 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 18:49:49 ]
簡単なプログラムの途中に見栄えを良くするために
横線を引きたいのですが、何かいい方法はありますでしょうか?

329 名前:321 [2007/03/07(水) 18:50:51 ]
1スレッドでしか試してませんが
time_tに対して10*3600してできました
ありがとうございます

330 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 19:00:18 ]
localtime()などは内部の静的な領域を使い回しするから、
それを呼び出すスレッドが複数ある場合は衝突が発生する可能性がある。
まぁ、呼び出すスレッドが一つだけなら問題ないけどね。

簡単に図式化するとこうなる。
・単一スレッドからの呼び出し
スレッドA ──localtime()呼び出し──内部領域変更──localtime()から復帰──内部領域から結果を回収──

・複数スレッドからの呼び出し
スレッドA ──localtime()呼び出し──内部領域変更──localtime()から復帰──内部領域から結果を回収──
スレッドB ────localtime()呼び出し──内部領域変更──localtime()から復帰──内部領域から結果を回収──
                            ↑                      ↑
                            ここで壊れる。 もし壊れなくても、ここでスレッドBからの呼び出しの結果を読む羽目になる。



331 名前:デフォルトの名無しさん [2007/03/07(水) 19:08:53 ]
localtime()を使うスレッドクラスをひとつ用意すればいいということですね
すごく参考になりました

332 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 19:43:27 ]
>>320
ふざけたこと抜かすんじゃねー

333 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 19:44:01 ]
VCのCRTはTLS使ってるから問題ないけどね。

334 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 19:48:49 ]
>>317
数値と文字を一緒にするな。
他の言語だと自動で文字を数値に変換したりするけど
C/C++などは'9'をそのままASCII文字コードだよ。

e-words.jp/p/r-ascii.html

つまり
'9'を数値で言うと57
'$'を数値で言うと36
だ。

'10'はコンパイラによって違うと思う。

335 名前:デフォルトの名無しさん [2007/03/07(水) 21:39:31 ]
メイン関数内でnewしている継承される可能性のあるクラスを
継承された場合、継承後のインスタンスでnewしたいのですが、エレガントな方法が
思いつきません、ご教授お願いします。

336 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 21:49:53 ]
>>335
複数のクラスがそのクラスを継承してる場合はどうするべき?


337 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 21:52:44 ]
>>335
もうすでにnewしちゃったんじゃしようがないんじゃない。


338 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 21:54:41 ]
newの代わりにFactoryを用意して(関数ポインタでも可)それ経由で生成するのがC++的には一番楽かな。

339 名前:デフォルトの名無しさん [2007/03/07(水) 22:13:46 ]
>>336
継承後も含めてそのクラスのインスタンスが一つしか存在しないようにします。
>>338
Factoryでインスタンスを取得し、
FactoryをVirtualtou(等)にして継承した場合書き換えるという風にですか?

340 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 22:36:25 ]
継承するクラスをC++より上位のレイヤーで1つだけに制限できるというなら、
グローバルな関数 Base *new_derivered_class(); を実装すればよくね?

それとも、継承先のクラスが存在しない場合Baseをnewする必要があるわけ?



341 名前:デフォルトの名無しさん [2007/03/07(水) 23:07:38 ]
ホームページから任意のデータの取得を行いたいんだが
さっぱりその方法が解りません。
その手のことが書かれたサイトを教えていただけませんか?

342 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 23:10:18 ]
rubyなどのスクリプトを使う

343 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 23:14:21 ]
>>342
やはりそうですか。
Cでやりたかったのですが、素直に真珠でやります。
ありがとうございました。

344 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 23:15:59 ]
真珠…

345 名前:デフォルトの名無しさん [2007/03/07(水) 23:20:04 ]
>>340
継承してメンバー関数を上書きして処理を記述するようにしたいので、
何か処理をする場合には、必ず継承しなければならないです。
継承しない場合は、現実的にはないと思うのですが・・・

346 名前:デフォルトの名無しさん [2007/03/07(水) 23:23:48 ]
>>343
「猫でも分かるネットワークプログラミング」にhtmlを読み込んで表示する方法が書いてあったと思う
今手元にないので分からんが、WinSockをつかってたとおも

347 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 23:29:17 ]
WinsockでHTTPしゃべるのは結構面倒くさいヨ。

348 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 23:38:18 ]
どうもです。
分野はネットワーク関係なんですね。
それが解っただけでも十分です。
ありがとうございました。

349 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 23:51:03 ]
>>343
WindowsならURLDownloadToCacheFile()が一番お手軽

350 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 01:16:50 ]
>>343
真珠ってPearlって書くのしってんのか?
いやPerlもPearlから来てるんだがな



351 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 11:07:27 ]
C++builder使っております。
unsigned char*とchar*のキャストは、(*型)だけでキャストできるのでしょうか?
出来ないキャストの場合は、エラーや警告などでますか?
以下のようにしてプログラミングしましたが、希望通りの出力でした。
ネットで危険なキャストがどうの、って良く見かけるんですが
よくわかりません。
”桁が大きくなると、小さい型にキャストするときは気をつける。”
これだけ注意すれば大丈夫でしょうか?

unsigned char* un_str="hoge";
char* str;
unsigned char* from_char_to_unsigned_char_str; //char*->unsigned char *の格納する変数

printf("un_str=%s\n",un_str); //unsigned char*は、char*みたいに出力できるか

str=(char*)un_str;
printf("str=%s\n",str);//(char*)だけで、キャストできるのか

from_char_to_unsigned_char_str=(unsigned char *)str;
printf("from_char_to_unsigned_char_str=%s\n",from_char_to_unsigned_char_str);//(unsigned char*)だけで、キャストできるのか

------出力-------------------------------
un_str=hoge
str=hoge
from_char_to_unsigned_char_str=hoge

352 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:03:04 ]
C言語を仮定するけど、ポインタは全部同じサイズだから相互にキャストできるよ。

> printf("un_str=%s\n",un_str);
%s は const char* 型の引数を期待するから、
*((const char*)un_str)という変換が行われることになる。
un_strが指してるのは"hoge"、つまり const char[] だから、問題なく変換できる。
他も同じ。

353 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:26:55 ]
> C言語を仮定するけど、ポインタは全部同じサイズだから相互にキャストできるよ。
現実には大抵そうなっているけど、規格上はそんな規定なんてないはず。

354 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:28:46 ]
そうだっけ?
んじゃvoid*の扱いはどうなるんだ?

355 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:29:45 ]
同じでない場合は、void*が一番でかいポインタのサイズ
そして使うときはキャストされるので問題なし

356 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:32:17 ]
昔懐かしい、farポインタ、nearポインタ、とか?

357 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:40:29 ]
残念ながら void* も void(*)() を保持できる保証はない。

358 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:42:58 ]
375<< インラインアセンブリならできるかも・・・

359 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:45:19 ]
>>356
普通に char* と int* のサイズが違うようなアーキテクチャも存在した。

360 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 17:23:43 ]
>>352-359
> C言語を仮定するけど、ポインタは全部同じサイズだから相互にキャストできるよ。
いろいろと実験しながら、少しずつわかってきました。
丁寧に説明ありがとうございました。




361 名前:デフォルトの名無しさん [2007/03/09(金) 20:15:24 ]
WinSDKで、
モーダルダイアログボックスを使っているとき、
プロシージャに最後に呼ばれるメッセージは何ですか?
WM_CLOSEメッセージでDestroyWindow(hDlg)して、
WM_DESTROYメッセージが呼ばれた後に、WM_COMMANDがくるのですが…


362 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 20:55:26 ]
WM_DESTROYでウィンドウが消えた後は
たとえそのウィンドウ宛にメッセージが来ても
それは存在しないウィンドウハンドル宛だし
処理するところがないので無視することになるだけだと思うけど。

何か特殊なケース?

363 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 21:06:17 ]
>>362
WM_COMMANDがくること自体は問題ないのですが、
エディットコントロールにWM_COMMANDがきたときに使うメモリを解放するのに、
WM_DESTROYの後にエディットコントロールに対してWM_COMMANDがきてしまうと、
わざわざWM_DESTROY呼ばれる前後で、場合分けするのが無駄だと思えるので…

364 名前:デフォルトの名無しさん [2007/03/09(金) 21:31:38 ]
VC++6 で CString 使ってるんだけど、
CString な変数に ANSI コードページでもユニコードでもない文字列つっこんで処理したいんですわ。
具体的には、GetLenth とか Replace したい(ANSI コードページでもまともに処理してなさそうだけど)
楽に処理するにはどうしたらいいでしょう?CString 捨てな方法でもいいです。

365 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 21:56:12 ]
vector<BYTE>でよくね?

366 名前:364 [2007/03/09(金) 22:07:24 ]
>>365
俺に言ってる?
CString はたとえばコードページ 932 の場合、
Replace で 1 バイト文字を置換対象にするときに、2 バイト文字の下位バイトが置換対象とバイト的には等しくても、置換しないようにするよね?
そういうのをすべてのコードページでやりたいの。
ではよろしくお願いします。

367 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 22:08:23 ]
>>364
っ nkf

368 名前:364 [2007/03/09(金) 22:33:56 ]
>>367
nkf のライブラリにコードページを指定出来るようなメソッドを追加したクラスが実装されているということでしょうか?
単なる変換ができるというだけなら却下ですな。
(nkf 使わなくても文字コードの変換はできるし、変換することによってコードをマッピングできなくなる場合とか考えたくない。
ユニコード系のコードに変換すればマップだけはできるんだろうけど。
それといちいち文字コード変換するとよさげなソースコードにならなさそうなんだ。
そもそも nkf って日本語しか対応してないだろ?
個人的には今回の場合 UTF-8,CP51932,CP932 を使えれば問題ないと思ってるんだけど、他の奴が許さないんだぁ。)
注文多すぎてむかつくかもしれないけど、どうかどうかよろしくお願いします。
ぶっちゃけ CString::SetCodepage() とかいうメソッドが実装されていて、あとはよきにはからってくれる実装がほしい。

369 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 22:44:11 ]
>>368
一々文字コード変換をしたほうがデバッグが楽だと思う

UTF-8 -> Unicode 変換

Unicode で何か処理

Unicode -> UTF-8 変換

よさげなソースコードにならなさそうって言われればそれまでだけど…

370 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 22:50:22 ]
CStringに自分が今どのコードページのデータを持っているとか
それにあわせてReplaceの動作が変わるなんて出来ないんじゃないのって思うから
vector<BYTE>でよくね?



371 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 22:53:13 ]
>>364
つ MLang

372 名前:364 [2007/03/09(金) 23:14:46 ]
>>369
やりたいことの一つに、「ANSI CP 以外の文字列読み込み->文字置換->そのまま書き込み」ってのがあるんだけど、
ユニコードにいちいち変換してたら絶対にスマートでないよね。
あと、調べたところまずなさそうなんだけど、変換->逆変換で違うコードにマッピングされると困る。
>>370
コードページ指定して UNICODE には変換できるんだから、出来ないはずはないとおもうんだけどなぁ。
クラスに変数 1 つだけ入れておけば使用側がセットして良きにはからうことはできるはず。デフォルトは CP_ACP で。
なんで実装されてないのか理解できないほどだ。
vc8 だと reentrant locale が一部実装されていて、1文字送りは簡単にできそうになってるなぁ。VC6 でつくらないといけないんだけど。。。
>>371
ちょっと調べてみます。ざっとみた感じでは変換しかしてくれなさそうだけど。
あと、これつかわないと CP51932 つかえなさそうですね。
MultibyteToWidechar とかに 51932 とかつっこめば変換だけは出来るとおもってたけど。

373 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:17:13 ]
鬼車がCSIじゃなかったっけ。Cだけど。

374 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:30:14 ]
>>372
> ユニコードにいちいち変換してたら絶対にスマートでないよね。
コードページごとに処理を特殊化させるほうがよほどスマートじゃないと思うがね。

375 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:36:58 ]
というか、そういう、1つの言語に対応するエンコーディングが氾濫していて
UNICODEの変換・復元がもったいない、なんていうことを言うのは
日本人だけなのではないか?(w

376 名前:デフォルトの名無しさん [2007/03/09(金) 23:38:03 ]
ソケットについて質問です。

クライアントからホストを

char* szHost = "www.google.co.jp"
gethostbyname( szHost );

の様に指定してHTMLをサーバから取得できる事は判ったのですが、例えば、

取得したいHTMLが、

www.google.co.jp/search?hl=ja&q=c言語&btnG=Google+検索&lr=

の様にクエリも含む場合はどうすれば良いのでしょうか。
よろしくお願いします。(板違いなら誘導お願いします。)

377 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:40:20 ]
URLエンコードしてそのままGETにぶち込めばいいだろ?
CESも場合によっては変換する必要があるけど。

378 名前:デフォルトの名無しさん [2007/03/09(金) 23:47:15 ]
返信ありがとうございます。
暮れ暮れ君で申し訳ないですが、URLのエンコードってどうやるんでしょうか。

379 名前:364 mailto:sage [2007/03/09(金) 23:52:19 ]
>>373
単純な置換にはかなり大げさなライブラリですな。いざとなったらこれで Replace をオーバーライドするか。
どうもありがとうございます。
もっと単純にできる方法も引き続き募集いたします。
>>374
個人的にはコードページが違うんだから、特殊になるのは当然だとおもうけど。
ユニコードが*本当に万能*なら汎用的に処理できるんでしょうけど。ま、CSI 論争はやめておきましょうか。
>>375
ま、大きな声でいってるのは日本人だけでしょうな。
でも、XFree86 で utf8 関数が投入されたときは一部の外国人もぶーたれてたな。
CSI かどうかはおいといて、reentrant locale がほしい人は外国でも結構いるみたい。

380 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:55:41 ]
なんかこの人気持ち悪い…



381 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:58:26 ]
>>380
おまえもな

382 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:59:17 ]
俺も俺も

383 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:59:45 ]
std::basic_string<char, euc_jp_traits<char> >みたいな?
traitsを自作するとかさ。

384 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 00:05:36 ]
>378
「URLのエンコード」程度なら、検索するべきですわん。
簡単に見つかるから。正確な事もわかるし。

ラフに解説すると、URLとして使ってよい文字ってのは
あらかじめ決まってるから(←ってのは知ってたと思うけど)
使えない文字は %xx みたいな形式に置き換える事。

385 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 00:42:35 ]
>>379
変換コストがもったいないと思っているのなら
大抵のCSI対応クラスは内部で統一コードに変換してるから意味ないぞ

386 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 00:46:18 ]
>>385
CSIの意味わかってる???

387 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 01:13:10 ]
キーが倒されている場合は歩くのモーションを、倒されていない場合はウェイトのモーションを再生したいのですが、

whileの中で、

if(キーが倒されている)
アニメーションAを再生
アニメーションBを停止

else if(キーが倒されている)
アニメーションAを停止
アニメーションBを再生

と書くと、()内が真or偽が判定されるたびに、アニメーションが最初から再生されて、0フレーム目しか再生されません。
最初に書いたようなことをするには、どういう風にプログラムを書けば良いでしょうか?
できればヒントでよろしくお願いします。

388 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 01:19:58 ]
再生時に開始フレーム指定してそっからはじめればいいだけじゃん

389 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 01:35:22 ]
どっちみちキーが倒されている気がするのは気の所為か?
キーも大変だな、一々倒されて。

390 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 01:36:17 ]
>>380
ヘンなとこで敬語使ってるからじゃね。



391 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 02:00:27 ]
整数の加算結果がオーバーフローしたかどうかを調べるにはどうすればいいですか?

392 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 02:03:47 ]
加算前より減ってたらオーバーフロー

393 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 02:30:54 ]
>>391
鼻から悪魔がでたらオーバーフローしていると判断してよろしい。
処理系によっては、オーバーフローした場合を判断する方法があるかもしれない。

394 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 10:26:51 ]
 すいません、初歩的な質問なんですが、どなたかご意見いただければうれしく思います。
 クラスBの中でクラスAのオブジェクトの配列を管理したい。
 でもクラスAは、A2やA3などにも派生させてて、それも配列に入れたい、って場合。

class A {
...
};
class A2 : public A{
...
}
class A3 : public A{
...
}
class B {
vector<A> a1_vector;
}

 ってしたいんだが、これだとa1_vectorにはA2,A3が入らないですよね?
 ってなると・・

class B {
vector<A*> a1_vector;
}

 で、new A, new A2とかでオブジェクト作って、そのポインタをa1_vectorにpushすることになると思うんですが、これだとクラスBのインスタンスが破棄されたときに、a1_vectorで管理されている各オブジェクトって廃棄されないですよね?
 で、google先生とかに聞くと、share_ptr使う人がいるみたいなんですが、それで問題ないですかね?
 なんか注意点とかありますか?もしくは他にいい方法ありますでしょうか?


395 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 11:11:03 ]
問題ないよ、A のデストラクタを仮想関数にするの忘れないようにね


396 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 11:19:43 ]
設計を見直せ。

397 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 11:28:53 ]
>>394
boost::shared_ptrでおk
std:auto_ptrはコピーが破壊的でコンテナにいれらんないから駄目

敢えて他の方法を挙げるとすれば、Boehm GCを使うとか?

398 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 11:34:10 ]
GC使うと、メモリ解放はいいけど、デストラクタ呼びだしタイミングが
予測不能にならない?

399 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 11:35:30 ]
>>394ではないが。
>>396
参考までに聞きたいが、どう設計を見直すんだ?

C++でポリモーフィズムを実現したいなら、参照を経由するしかないし
派生クラスを基底型の配列やvectorに突っ込もうとすると
スライシングが発生するから、>>394の言っていることはごく当然の話では?

C++でポリモーフィズムを使うなと言ってる?

400 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 11:39:21 ]
>>398
勿論その辺は他のGC言語となんも変わらない。



401 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 12:31:45 ]
Boost使うならポインタに特化したboost::ptr_vectorなんてものもある。

402 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 13:11:10 ]
>>399
>396ではないが、「他にいい方法」を模索するなら実装方法を検討する前に設計を見直せということでしょ。
>394ではないから、そのクラス構成が最適解なのかは判らないのだから。

403 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 14:19:41 ]
>>402
それは深読みじゃねえの?
>>394はC++でポリモーフィズムをやりたいときのスマートな方法を問うている
だけに見えるけど。

404 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 14:36:21 ]
>>402
最適解なのか「判らない」んなら、少なくとも「設計見直せ」は言いすぎだろうな。
「その設計では駄目だ」と断定してるのと同じだ。

405 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 15:08:24 ]
394です。
みなさん、いろいろありがとうございます。
おおむねsharedでよさげな感じですね。

ただ、396さんの「設計みなおせ」も気にはなるところです。
やっぱり、こういう書き方になる設計って良くないんですかね?
他の人のソース見ても、こういう書き方してるの、あまり見たことないし。


406 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 15:28:51 ]
他所に見せるソースはサンプルが多いから
サンプルにboost使う状況を避けた設計してるとかじゃないかなぁ(適当

sharedなら割と直感的になるので悪くないと思うし、
EffectiveSTLの7項にもマンドクセってなったらsharedを検討してみては? ってある

407 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 16:26:35 ]
boostのsharedは物凄く遅いらしいから場合によっては別案を考えた方がいいと思う

408 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 16:50:44 ]
「物凄く遅い」と言うには、どの程度遅いのかデータが欲しいところだね。

409 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 16:53:03 ]
ttp://www.boost.org/libs/smart_ptr/smarttests.htm

410 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 17:01:33 ]
価値観によるところは大きいだろうけど、これが「物凄く遅い」なら
iostreamやソートは「筆舌に尽くしがたいくらい遅い」んだろうね。



411 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 17:45:37 ]
>>392, 393
鼻から悪魔ですか・・・
まあ、Intel系ならちゃんとオーバーフローしてくれますよね^^

どうもありがとうございました。

412 名前:デフォルトの名無しさん [2007/03/10(土) 22:49:42 ]
C++で、Cのstrtok()のような関数はありませんか。

別にstrtok()でも目的は果たせるんですが、
元の文字列を破壊したり、同時に2ヶ所以上で呼びづらかったりと
あまり美しいとは言えないような気がして。


413 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 22:59:03 ]
無いと思う
けどそれくらい自分で作ればいいんじゃ?
std::stringとか、目的の機能を実装するのに使えそうなモノはあるし

414 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 23:01:17 ]
>>412
istringstreamからデリミタを指定してgetline()


415 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 23:11:45 ]
istream_iteratorでfor_eachがC++流

416 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 23:14:21 ]
高機能さを求めるならboost::tokenizerだと思う。

417 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 23:17:43 ]
>>415
ただのistream_iteratorだとtokenじゃなくてcharが返らんか?

418 名前:417 mailto:sage [2007/03/10(土) 23:24:39 ]
ごめん。超アホなこと書いた。
でも、これってデリミタ指定できるか?

419 名前:412 mailto:sage [2007/03/11(日) 00:10:10 ]
レス感謝。
いただいたヒントを元に、更に調べてみようと思います。

それにしても、strtok()ってクセ強いですよねぇ……。



420 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 00:23:25 ]
>>412
ちゃんとしたベンダーならマルチスレッドな環境で同時に使っても
問題が起きないことを保証してくれてるもんだぞ>strtok()
まぁ、同じスレッドから複数の処理をやっちゃうと確実にアウトだけど。



421 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 00:30:41 ]
boost::tokenizerでは、デリミタを残す/捨てる、空トークンを残す/捨てる
を選べるのが良いな。

strtok()には色々問題があるが、デリミタも空トークンも捨てる仕様なので、
これでは困ることもある。
シェルのような感じで空白文字を区切りに使うときはこれでよいのだが。

環境によってはBSD由来のstrsep()という関数が使える場合もある。
こっちは予めリエントラントで、デリミタを捨てて空トークンを残す仕様だ。
ただし、コピーを避けるために元のバッファに破壊的に動作するのは同じ。

Cなら単にsscanf()を使うのも悪くない選択肢。

422 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 00:32:24 ]
>>420
MSVC++の場合はhidden dataをTLSに隠す仕様だから問題ない。
が、リエントラント版strtok()はstrtok_r()のような別名で提供している
実装も多いよ。
こういうことがあるから、移植性を考えてもstrtok()の使用は
好ましいとは言えない。

423 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 01:58:54 ]
質問です。

/* test.c */
#include <stdio.h>
#include <math.h>

int main(void) {
double i = 2;
double foo;

printf("%d\n", (int)pow(10, 2)); /* 結果 100 */
printf("%d\n", (int)pow(10, i)); /* 結果 99 */
printf("%f\n", pow(10, i)); /* 結果 100.000000 */
foo = pow(10, i);
printf("%d\n", (int)foo); /* 結果 100 */

return 0;
}

このソースをMinGW32-gccでコンパイル・実行すると、結果がコメントのようになります。
(bccだと、100、100、100.000000、100 になるのですが。)
これはコンパイラの仕様なのか、それともバグなのか、どちらでしょうか?


424 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 03:01:43 ]
int main(void) {
double i = 2;
double foo;
foo = pow(10, i) - 100.0;
printf("%e\n", foo);
foo = pow(10, i);
printf("%e\n", foo);
}

多分情報落ちしてるだけだと思う。

425 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 13:03:40 ]
基底クラスの代入演算子をオーバーロードしてメンバをコピーするようにしたのですが
派生クラスでも同様に代入演算子をオーバーロードした時に基底クラスのメンバをコピーするためには
派生クラスのオーバーロード内に基底クラスのメンバをコピーするような処理を自前で用意しないといけないのでしょうか?



426 名前:425 [2007/03/11(日) 13:12:55 ]
というのも、基底クラスと派生クラスでコピーコンストラクタを用意していると
派生クラスのコピーコンストラクタで自動的に基底クラスのコピーコンストラクタが
呼ばれているように見えましたので。。。

427 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 13:17:40 ]
こんな感じで基底クラスのoperaotr =を呼べばいい。
class Base
{
public:
  Base& operator =(const Base&);
};

class Derived : public Base
{
public:
  Derived& operator =(const Derived&);
};

Derived& Derived::operator =(cosnt Derived& d)
{
  Base::operator =(d);
  //以下Drived分のコピー処理
}

428 名前:425 [2007/03/11(日) 13:46:43 ]
>>427

なるほど。基底クラスを指定して呼び出せばよかったのですね。
基本的なことだったのかもしれませんがとても勉強になりました。



429 名前:デフォルトの名無しさん [2007/03/11(日) 15:08:05 ]
質問があります。

class Hoge { … }

vector<Hoge> HogeArray;

文法としてこんなことできますか?

430 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 15:13:14 ]
できるよ



431 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 15:43:21 ]
出来ないな。セミコロンがない。

432 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 16:39:16 ]
絶対言うやつがいると思った

433 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 16:47:46 ]
揚げ足取りのレベルで頭の程度が知れるのをまったく怖れないのは
ある意味度胸かも

434 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 16:58:21 ]
しかし、>>431的な言い方は問題あるにしても、
言ってあげるべきモノではあると思う。
慣れないうちはつけ忘れ多いだろうし。

435 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 16:59:37 ]
まあ文法ならtemplateがらみでもない限りコンパイル一発で間違いはすぐわかるんだけどな

436 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 17:25:54 ]
それでも文法の間違いがわからない人が来るスレだと思ってた

437 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 17:38:43 ]
>>435
ヒント:ココは初心者スレ

438 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 17:43:57 ]
ソースとエラー/警告を載せれば
もれなく>>435が全て解決してくれるスレになりました。

439 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 17:47:23 ]
>ソースとエラー/警告を載せれば
初心者はどれを載せたらいいのかもわからんし難しいなw

440 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 19:00:00 ]
いやでも「コンパイルエラーの解決」なんて話題は、
基本的には、初心者どころか入門者(入門書を読み始めたばかり)というレベルだけだろ。
それを解決するもの簡単だし。
もちろん、規格の細部や処理系異存かなんて話はあるけどさ。

本当に時間がかかる「バグ」というのは
「コンパイルは通るけど意図通りに動きません」なんだから。
もちろん、極稀なコンパイラのバグにぶつからない限り
「ソースの通りに動いている」わけだけど。



441 名前:429 mailto:sage [2007/03/12(月) 00:31:30 ]
すいません。

431さんの言うとうりセミコロンの付け忘れでした。

442 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 01:44:48 ]
>>431のエスパー能力に敬意を表する!

443 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 01:54:30 ]
これはもうメイクミラクルやね

444 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 06:03:42 ]
いや>>441は偽物だ。

三点リーダを>>429のように使えるはずないもん!

445 名前:デフォルトの名無しさん [2007/03/12(月) 11:07:51 ]
newとdeleteを頻繁に使うのはよくないですか?

446 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 11:09:38 ]
newは別にいいけど、deleteは例外安全や面倒くささを考慮して、
std::auto_ptrなど何らかのスマートポインタに入れておくべき。

447 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 16:47:03 ]
pを辿って99から1までを表示するプログラムです。

実行すると途中のcount=35あたりまで表示されてエラーが起こります。
メッセージ:「ハンドルされていない例外は TEST.exe にあります:0xC0000005: Access Violation。」

これは何故起こるのでしょうか。解決法もできれば教えてください。お願いします。
struct Test
{ int x;
 Test *p;
};
int main()
{ int i;
 std::vector<Test> v; //xに1〜99を順に入れていく。pには一つ前のポインタを入れる
 Test b;

 b.p = NULL;
 v.push_back(b);

 for (i=1;i<100;i++) { //
 b.x = i;
 b.p = &v[i-1];  //
 v.push_back(b);
 }

 Test *c;
 c = &v[v.size()-1];

 int count = 0;
 while ( c->p != NULL )  {      // NULLが出るまでpを辿る
  printf("%d: %d\n",count++,c->x);
  c = c->p;
 }                                                 長くなってすいません。

448 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 17:02:59 ]
push_backしていってvectorのサイズがでかくなったときにvector内部で再割り当てが起こってる。
なので&v[i-1]は途中から不正なポインタを指す。
なので本当は&v[i-1]が不変なのを期待しちゃダメ。

↓こうやって最初に100確保しておけば再割り当てが起こらないだろうから大丈夫。

int main()
{
int i;
std::vector<Test> v(100);
Test b;

b.p = NULL;
v[0] = b;

for (i=1;i<100;i++) {
b.x = i;
b.p = &v[i-1];
v[i] = b;
}

Test *c;
c = &v[v.size()-1];

int count = 0;
while ( c->p != NULL ) {
printf("%d: %d\n",count++,c->x);
c = c->p;
}
}

449 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 17:04:21 ]
あ、でも同僚がこんなコード打ったら殴る

450 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 17:59:18 ]
宣言した後に余裕を持ってNULLの要素を追加してやらないと駄目なのか
で、不足してきたらまた余裕を持ってNULLと末端の要素を
実際に割り当てた時は割り当てた所に書き込むのと同時に、末端となる位置も変えてやらにゃならん
こんな事してたらvectorの意味無いじゃん



451 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 18:13:42 ]
空でないディレクトリをまるごと
削除する関数ってあるでしょうか。
C++Builderです。

452 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 18:18:30 ]
C++Builderは知らんな。
Win32 APIにはSHFileOperationがあるが。

453 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 18:24:20 ]
system("rmdir /S /Q C:\");

454 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 18:30:34 ]
>>448
やはり場所が変わっていたのですか・・・
vectorを使うべきじゃなかったようですね
ありがとうございました。

455 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 18:44:58 ]
>>454
イレテータ使え

456 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 18:51:32 ]
つーかlist<int>使え

457 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 18:54:06 ]
>>452
SHFileOperationですか。
見てみたんですが、引数がたくさんあって難しそうですね。(汗
簡単な解説と使用例どこかにないか探して見ます。

>>453
おおお。今はこの方法で行きたいと思います。

ありがとうございました。

458 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 19:26:01 ]
すいませんが初心者の質問です。
あるクラス内でnewしたメンバ変数への参照かポインタを返す場合、
クラスの外側からdeleteさせないようにするにはどうすればいいんでしょうか?
constつければコンパイルエラーになるもんだと思ってたんですが、
試してみたらダメでした。

class moge;//詳細は略
class hoge{
 moge* mp;
 public:
 //略
 const moge * const getMp(){return mp;};
 const moge& getMRef(){return *mp};
}

void f(hoge& h){
 const moge * const mp = h.getMp();
 delete mp; //コンパイルエラーになってほしい
}

void g(hoge& h){
 const int& i = h.getRef();
 delete &i; //コンパイルエラーになってほしい
}

459 名前:458 mailto:sage [2007/03/12(月) 19:29:44 ]
すいません。g()がメチャクチャになってました。
void g(hoge& h){
 const moge& m = h.getMRef();
 delete &m;//コンパイルエラーになってほしい
}

が正しいですね。

460 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 19:32:01 ]
デストラクタをprivateへ移行



461 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 19:36:53 ]
>>455
std::vectorのイテレータは、
基のvectorの要素数が変わったら無効になってよいとなっているので、
何の解決にもならない。

462 名前:458 mailto:sage [2007/03/12(月) 20:02:43 ]
>>460 即レスありがとうございます。
確かに質問内容の答えにはなってるんですが、ちょっと説明不足でした。
class hogeのメンバ関数内でmogeをnewしていて、hogeのデストラクタで
deleteしたいんです。
mogeのデストラクタをprivateにするとhogeの破棄時にdeleteできずにメモリが
リークしてしまうという問題が出てしまいますよね。

463 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 20:16:05 ]
だったら、友達にでもしろよ。

464 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 20:21:16 ]
所有権が移動しないスマートポインタ使えば?

465 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 20:29:52 ]
クラスを1階層増やせばいいんでないの。
class IMoge{ protected:~IMoge(){}};
class moge : public IMoge{public:~moge(){} };
class hoge{ moge *mp;
   public : IMoge &getmogeref(){ return *mp; }
   ~hoge(){delete mp;} };

466 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 20:36:14 ]
そうだ、外側からdeleteしない設計にすればいいんだ!
うわ俺マジ頭良い^^

467 名前:458 mailto:sage [2007/03/12(月) 20:39:01 ]
>>463-465
どうもありがとうございます。
たぶん友達にするのが一番個人的な要求に合っていると思います。
というか、こんな基本的なことも浮かばないあたり、ダメダメですね。


468 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 00:04:47 ]
時間の都合だと思うが、>466のスルーされっぷりに噴いた。
いや、たぶん突っ込まれてもそれはそれで困るんだろうけど。

469 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 19:37:36 ]
以下のようなプログラムを実行すると
error LNK2019: 未解決の外部シンボル "public: void __thiscall C01::TEST(void)"〜
とでます。
inlineをはずれば通るのですが、どうしてもinlineを付けたいです。
解決方法御願いします。

//00.cpp
#include "01.h"
void main()
{
C01 c;
c.TEST();
}

//01.h
class C01
{
public:
void TEST();
};

//01.cpp
inline
void C01::TEST()
{
}

470 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 19:48:32 ]
01.hにコンストラクタの定義を書く。



471 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 19:49:28 ]
ヘッダに書けよ

472 名前:469 mailto:sage [2007/03/13(火) 21:04:32 ]
>>470
コンストラクタの有無は関係有りませんでした。

>>471
TEST()関数をヘッダに書いたら通りました。
有り難うございます。
ちなみに.cppの方に書く事は出来ないのでしょうか?

473 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 21:06:38 ]
cppファイルに定義を書くならinline付けるなよ。

474 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 21:07:28 ]
基本的に他のファイルから可視じゃないとinline展開はできない
リンカがやってくれたりもする場合もあるらしいけど

475 名前:469 mailto:sage [2007/03/13(火) 21:20:58 ]
>>473-474
なるほど、有り難うございます。

476 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 23:34:14 ]
OS RHEL V4.3

gcc version 3.4.6

コンパイルオプション
-D_XOPEN_SOURCE=600

警告: 引数 2 個の `read' を渡しますにより、ポインタの示す型か
らの修飾子が切り捨てられます。

read()を利用しているソースをコンパイルしようとすると上記のような
警告が出ます。なぜこんな警告が出るのかさっぱりです。

何かよい解決方法をご存知の方はおられませんか?

477 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 00:09:42 ]
ちょっとそのreadの周辺を晒してくれまいか?

478 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 01:27:36 ]
>>476
警告:readに渡す第二引き数のポインタ修飾子が剥がされます。

read()にconst char *渡したりしていない?

479 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 01:35:35 ]
引数2コのreadってなんだ。普通readは引数3コじゃないか。

480 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 01:44:53 ]
>>479
gccのエラーメッセージの日本語訳が無茶苦茶なの。正解は>478。



481 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 16:23:49 ]
for(int i=0; i<3; i++){
handle[i]=_beginthread(...);
}

//handle[0],handle[1],handle[2]どれから、終わるのかわかりません
for(int i=0; i<3; i++){
WaitForSingleObject( handle[i] , INFINITE );
}

3つスレッドを立ち上げましたが、後処理の方法で困っております。
上記のようにすると、WaitForSingleObjectで、
永遠に待つ状態になってしまいます。
どうするときれいに、後処理できるでしょうか?
よろしくお願いします。

482 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 16:25:03 ]
WaitForMultipleObject は?

483 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 16:44:15 ]
あと_beginthreadex使って自分でハンドルを閉じるようにしろ。

484 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 16:50:34 ]
っと、sがつくね、そういえば WaitForMultipleObjects

485 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 21:17:27 ]
C++のライブラリにファイルを扱うためのクラスはありませんか?

486 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 21:18:30 ]
std::fstreamのことを言っているのか?

487 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 21:27:52 ]
本当にありがとうございます

488 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 00:11:28 ]
ワラt

489 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 10:16:57 ]
>>482
レスありがとうございます。
for (int i=0; i<3; i++){
while(WaitForMultipleObjects(3, handle,TRUE, 1000) == WAIT_TIMEOUT){
OutputDebugString("タイムアウトしました");
}
OutputDebugString("タイムアウト以外デス");
}
これで、きれいに後処理できました。

>>483
_beginthreadは、CloseHandle()しなくても、自動で閉じてるかもしれないです。
ネットで検索すると、自動で閉じてるみたいなこと書いてありました。
試しにCloseHandle()してみると、エラーでました。
環境は、C++Builderですが、_beginthreadexを使用したほうが、良いのでしょうか?

490 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 13:10:23 ]
環境はWindowsです。
URLデコードについて教えてください。
ttp://work.tkensaku.com/tool/urldec.html
こちらのサイトなど、インターネットに落ちているものを利用して
デコードしてみたのですが、きちんとデコードできるときとできないときがあります。

例えば、
1.「%82%A0%82%A0%82%A0」->「あああ」
2.「%E6%96%B0%E8%A6%8F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%20%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88.txt」->「譁ー隕上ユ繧ュ繧ケ繝・繝峨く繝・繝。繝ウ繝・txt」

1は、うまくいきましたが2が文字化けしてしまいました。
ttp://www.taka-k.com/pg.html
こちらの関数で、確認しましたが同様に「譁ー隕上ユ繧ュ繧ケ繝・繝峨く繝・繝。繝ウ繝・txt」と出力されました。

ttp://www.tagindex.com/tool/url.htmlで、2を確認すると「新規テキスト ドキュメント.txt」と正常に表示されました。
「新規テキスト ドキュメント.txt」->「%E6%96%B0%E8%A6%8F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%20%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88.txt」
のエンコードは正常なのかもしれません。
何が原因なのかわからないのですが、どうすれば常に正常にデコードできるでしょうか。
よろしくお願いします。



491 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 13:13:11 ]
それはもしかして文字コードの違いなのでは?

492 名前:デフォルトの名無しさん [2007/03/15(木) 13:27:10 ]
質問です。
templateを使っているのですが、
template<class T>とした時、このTが「IHogeを継承したクラスかどうか」を判断する方法はないでしょうか?

if (isIHogesChild(T))
{
 IHogeを継承しているときの処理.
}
else
{
 それ意外の時の処理.
}
とやりたいのです。

493 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 14:14:16 ]
>>490
1はCP932、2はUTF-8。UTF-8をCP932環境で表示しようとするから文字化けしているだけ。

494 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 14:48:28 ]
>>491
>>493
>1はCP932、2はUTF-8。UTF-8をCP932環境で表示しようとするから文字化けしているだけ。
すごい。どうやって2はUTF-8とわかるのでしょうか。
「%E6%96・・・」を眺めているとわかるのですか?


495 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 14:51:43 ]
UTF-8は文字の先頭バイトの頭のビットが立ってたら2番目も必ず立つからな
そして、3バイト文字なら1110 で始まるので必ずEで始まる。

496 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 14:53:50 ]
眺めていても判るが、念の為にiconv -f CP932 -t UTF-8|od -t x1を実行して「新規テキスト ドキュメント」をペーストして見た。
で、予想通りこんな出力が得られたわけだ。
--
0000000 e6 96 b0 e8 a6 8f e3 83 86 e3 82 ad e3 82 b9 e3
0000020 83 88 20 e3 83 89 e3 82 ad e3 83 a5 e3 83 a1 e3
0000040 83 b3 e3 83 88 0a
0000046


497 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 15:31:49 ]
>>492
boost::is_base_of<IHoge, T>

498 名前:デフォルトの名無しさん [2007/03/15(木) 16:49:31 ]
>>492
コンパイル時に分かる事を実行時に判定するのは非効率だよ。

非効率どころかコンパイルが通らなくなることも多い。

499 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 16:55:59 ]
実行時に動的にクラスを作るような構造は駄目ということか

500 名前:デフォルトの名無しさん [2007/03/15(木) 17:07:09 ]
>499
誰もそんなこと言ってないが



501 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 17:08:16 ]
sage忘れてた…orz

502 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 18:08:05 ]
>>498
実用的なコンパイラなら最適化でif文をさっくりと消してくれる。

503 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 20:52:02 ]
C++でVisual studioの質問なんですけど、例えばabcdeをstringで引っ張ってきて
その文字数を整数に直す(この場合だと5)方法ってありますか?
別にstringを使わなくてもいいんですが・・・・

504 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 20:53:58 ]
size()
length()

505 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 20:55:49 ]
文字数を整数に直すの意味がわからん
整数じゃないのかよ元は

506 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 20:59:47 ]
ああ、lengthを忘れてました。
どうもありがとう。

507 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 21:00:14 ]
わからんぞ。>>503の世界ではマイナスかもしれんし、はたまた虚数かもしれん



508 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 21:05:31 ]
平行世界の住人でもOK
ただしその場合、質問者は必ず、出身地を書きましょう

509 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 21:28:27 ]
文字数を整数に直すっていうか、文字数を数えたかったんです。

510 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 21:56:27 ]
C++ VisualStudioで質問させていただきます

unsigned char * と System::String^ (#include<string.h>)
この二つをお互い変換する方法を教えていただきたいです



511 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 22:02:19 ]
support.microsoft.com/kb/311259/ja
マネージドC++向けの記事だが、たとえC++/CLIでも構文が違うだけで中身は通用する。

512 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 22:05:37 ]
またC++の質問なんですが、
abcde
という文字列があるとして、左から4番目・dを取り出すのはどうすればよいですか?

513 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 22:11:08 ]
c=s[3];

514 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 22:11:42 ]
ちゃんと出身地を明記しような。

515 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 22:14:33 ]
>>513
いまいちわからないのですが・・・

>>514
出身地?
一応東京ですけど・・・

もう少し詳しく教えて頂けませんか?
困ってるんです。

516 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 22:19:42 ]
困って2ch来て質問して、ズバリ回答を得てもなお食い下がるヤツってどうかしてると思う。
あとは検索でもして勉強しろよ。20分で理解できるだろ。

517 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 22:25:37 ]
>>516
>>513の c=s[3]; がズバリ答えなんですか?
C++って一文字で書かれているのを見たことがなかったので
なにか省略されてるのかと誤解してました。すいませんでした。

518 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 22:45:44 ]
>>502
それ以前にコンパイル通らなくなるときがあるって。

Modern C++ Designあたりに書いてなかったかな〜

519 名前:510 mailto:sage [2007/03/15(木) 23:03:33 ]
>>511
ありがとうございます
ページ見ながら色々勉強してみます

520 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 23:49:55 ]
>>495
>>496
ちょっと時間かかってしまいましたが、
文字コード変換できました!
まだ、あんまり理解できて無いですが
ネットで検索して勉強します。

どうもありがとうございました。
ほんと助かりました。



521 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 00:53:20 ]
>>518
もはやModernでもなんでもない本を持ち出してきてもらっても困る。
どういう時だ?

522 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 01:50:54 ]
もはやModernでもなんでもない定番本の説明なんかしなきゃいけないのか。

523 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 06:20:04 ]
>>489
遅いけどexじゃない方はハンドルを自動で閉じるのでWaitFor〜を使うべきではありません
すでに終了しているスレッドハンドルに対してWaitForSingleObject(hoge,INFINITE)
するとずっと戻ってこなかったりします
昔はまったことがあったんだけど今見てみたらMSDNにも書いてありますね

524 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 07:36:44 ]
>>521
例えば

T hoge;
if(isIHogesChild(T)){
hoge.fun1();
}else{
hoge.fun2();
}

Tにfun1,fun2の両方が定義されてないとコンパイルエラー

525 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 07:40:11 ]
それだったら部分特殊化したりenable_ifで切り替えたりすればいい。

526 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 08:35:42 ]
いや全くその通り。
普通ifは使わないでしょ。

527 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 08:49:39 ]
いや全くその通り。
普通ifは使わないでしょ。

528 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 09:22:12 ]
いや全くその通り。
普通ifは使わないでしょ。                                   nullpo

529 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 09:57:05 ]
[環境]C++Builder
hoge.iniみたいな、設定ファイルがないのに
exeファイルをクリックして再起動しても、設定値を
保持してるアプリケーションを、良く見かけますが
あれはどうやるのでしょうか。

530 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 10:45:20 ]
つ[レジストリ]



531 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 11:21:49 ]
Windowsフォルダにiniブッコミ

532 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 12:47:52 ]
>>530-531
レスありがとうございます。
インストールしてないソフトでも,設定値を保持しているので、
不思議だったんですが、そういう方法もあるんですね。

今は、自分で作るとき"hoge=hoge"(key=value)だけの形式でやっているので、
「getlineで一行ずつ読み込んで、std::map<std::string,std::string>に格納」
で簡単なんですが。

[hoge]
hoge=hoge
hoge=hoge
[hoge]
hoge=hoge
・・・
こういう設定ファイルの読み書きの方法解説してる
サイト無いでしょうか。
オープンソースのソフトなどのソース見て勉強しようと
思ってるんですが、ソースが膨大なのが多くて、
なかなか設定値の読み込んでる部分を、探し当てること出来ません。

([]の部分の名前,key値,value値)構造体に格納していくのかと思ったんですが、
読み込みも書き込みも、なんだか難しいです。

533 名前:532 mailto:sage [2007/03/16(金) 15:27:28 ]
532です。
struct inistruct{
char* section; //[]の値
std::map<std::string,std::string> map;
};

struct inistruct *p = new inistruct[length];
//iniファイルを読み込んで、pに格納

//もし、特定のsectionの値を取り出したい場合
for(int i=0;i< length;i++){
//もし、特定のsection="hoge"の値を参照したい場合
if(strcmp(p[i].section,"hoge")==0 ){
//p[i].mapから、値を取り出す
break;
}else{
continue;
}
}
こういう感じで、"読み取り"と"参照"できそうです。

あと、特定のsectionの中の値を一つ変更された場合の
設定ファイルに書き込む方法が、よくわかりません。
std::string str; //新しい設定ファイルの全文を格納
while(getline(fin,s)){
if(更新したいsectinじゃない or 更新したいmapじゃない){//ここもっと複雑かもです
str+=s;
}else{
str+="更新したい文字列";
}
}
こういう感じでしょうか。よろしくお願いします。

534 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 18:31:12 ]
>>533
msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpsysinf/html/_win32_getprivateprofilestring.asp

535 名前:532 mailto:sage [2007/03/16(金) 20:00:44 ]
>>534
GetPrivateProfileStringというキーワードで
いろいろと検索できそうです。
ピンときたので、作りかけのやつ完成させたいと思います。
どうもありがとうございました。

536 名前:デフォルトの名無しさん [2007/03/16(金) 23:47:52 ]
設定/初期化ファイルについて、便乗質問。
環境はWindows2000以降(ただし可能なら9x系も)、C++のネイティブアプリケーション。

(1) MSのサイトによると、iniファイルは使うなと書いてありますが
  少なくとも内部ツールや規模の小さなフリーウェア程度では、16ビット非対応でもまだiniファイル使っても問題ないのでしょうか?

(2) 最近はレジストリよりも、XML設定ファイルが普及しつつある気もしますが、
  検索してもC#や.NET Framework向けの説明ばかりで、C++のネイティブアプリ向けの説明が見つかりません。
  何か良さげなテキストを知ってたらお願いします。

537 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 23:54:53 ]
VistaではProgramFiles以下には書けないので。
すくなくとも、exeと同じパスにiniを書くようなアプリを今から作るのはどーかなー。

538 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 23:56:54 ]
インストールフォルダを変えれば良いだけやん

539 名前:536 mailto:sage [2007/03/17(土) 00:08:44 ]
>Program Files以下
マジっすか…。
既存プログラムのアドオンとかも考えていたのですが、それだと今あるソースを変更しないとダメですね……。

540 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 00:11:51 ]
ぶっちゃけC++でXML読み書きツライ。



541 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 01:17:00 ]
じゃあ、やりやすい言語でXMLパーサーのラッパーライブラリ作って、C++からインポートすりゃいいじゃん。


542 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 01:32:23 ]
やりやすい言語でそのまま全部作ればよくね?

543 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 02:02:55 ]
そんなことしなきゃならんのなら
C++でXML設定ファイルを簡単に使う機能が用意されていない限り
このままini使ってた方が楽だな。


544 名前:じゅん mailto:tabiwayogisya.breakoneslegman@ezweb.ne.jp [2007/03/17(土) 02:24:43 ]
ネットを開いてお気に入りを開くとフォルダがあるのですが隠しファイルになっていてきえてしまいました。復活させるにはどうしたらよいのでしょう(>_<)

545 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 02:51:02 ]
まず服を脱ぎます

546 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 02:52:40 ]
>>544
日本語でおk

547 名前:デフォルトの名無しさん [2007/03/17(土) 08:21:56 ]
Read a string of the form "characters" from the standard input.
Store the string in character array 'charArray'.
Eliminate the quatation marks from the input stream.
Read a maximum of 50 characters.

標準入力から"characters"という文字列を読み込みなさい。
その文字列をcharArrayという文字列配列に入れなさい。
入力ストリームから二重引用符を取り除きなさい。
最大で50文字読みなさい。

…という問題なんだが

int charArray;
const int SIZE = 50;
char buffer[SIZE];

cout << "Type something surrounded by \'\" \"\': ";
cin.getline(buffer, SIZE);

while ((charArray = cin.get()) != '\"')
{
cout.put(charArray);
}

while ((charArray = cin.get()) != '\"')
{
cout.put(charArray);
}
cout << endl;

こういう解でいいのかね?

548 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 08:24:14 ]
>>547
こんにちは、UTF-32(sizeof(int)が4であるならば)の文字コードを操る世界の人

549 名前:547 続き [2007/03/17(土) 08:24:17 ]
一応結果はこう↓なんで間違いではないと思うんだが

##################################################
Type something surrounded by '" "': "characters"
characters
Press any key to continue . . .
##################################################

他にもっとスマートな方法がある気がしてならんのだがどうでしょう?

550 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 11:12:30 ]
>>549
intの配列にする必要は無いだろうというのが、>548の主張だ。



551 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 11:14:12 ]
つーか、charArrayがintってなんだよ、問題の趣旨に合ってないじゃん。

552 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 11:15:11 ]
なんだかなぁ、先ずは日本語と英語の勉強をし直すところから始める必要がありそうだ。

553 名前:デフォルトの名無しさん [2007/03/17(土) 11:30:08 ]
>>550-551
それも引っ掛かってたんだよ。
だから、ここで質問してるわけなんだけど。
てか、このテキストに載ってる方法だとそれが唯一の方法に見えるんだ。
で、肝心のchar charArray[SIZE]と宣言した場合はどうやればいいの?

554 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 11:58:52 ]
>>543
Boost.Serializationは設定ファイルくらいならそう面倒なく使えると思う。

555 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 12:03:53 ]
>それが唯一の方法に見える
詳しく

556 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 12:17:27 ]
WindowsベッタリならMSXML使えばいいんでないの。

557 名前:デフォルトの名無しさん [2007/03/17(土) 12:39:52 ]
>>555
書いた通りそのまんまだが
今読んでるテキスト"C++ How To Program"には
区切り文字を指定して文字を読み込む方法はこれだけしか載ってない。
だから、intで宣言してるのはおかしいけどあれを使うしかなかった。
結果的には一応正しい出力になってる、でもなんか引っ掛かる。
俺的には「"」が見つかったときは読み込まずにスキップして後は全部読み込む、
みたいなアルゴリズムが浮かんでる。
そ・こ・で、ここの住人の力が必要なんだが…。

558 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 12:43:59 ]
>>557
> でもなんか引っ掛かる

それを説明しないと質問が成り立たないだろう。
エスパー募集なら他所でやれ。

559 名前:デフォルトの名無しさん [2007/03/17(土) 12:55:42 ]
>>558
じゃ、箇条書きで。(というか、こんな説明しなくても回答できるはずだが…)

@文字列をcharArrayという文字列配列に入れろ、という指示があるのにintで宣言している
A例えば、この入力が"character"ではなく""cha"r""ac"ter"みたいに「"」が任意の数で入ってる場合でも
きちんと読めるべきでは、と思っている(←確かに指示には書いてないが気になる)

という二点です。
そろそろ回答の方をよろしくお願いしますよ。

560 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:02:36 ]
1. intで宣言しなきゃいいじゃん
2. 1文字ずつサーチすりゃいいじゃん



561 名前:デフォルトの名無しさん [2007/03/17(土) 13:05:10 ]
>>560
それを具体的に教えてください、どの関数を使うかなどでいいですから。

562 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:14:15 ]
>>561
最初からそれを聞けばよかったのに

563 名前:デフォルトの名無しさん [2007/03/17(土) 13:16:53 ]
>>562
いやいや、最初からそう聞いてます。
つらつらと説明してきましたけど
>>547の問題読んだだけで「俺ならこうやるな」って
回答がくれば即解決のはずなんですが…。

564 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:19:46 ]
>>561
てーか、何か根本的に間違ってないかい?
標準入力からcharArrayに入れるんだろ?
なら char charArray[SIZE]; と宣言して
cin.getline(charArray, SIZE); とするべきだろ。
(詳しい仕様は忘れたので終端文字については考えてない)
そして「そこ」から引用符を取り除くという話なんじゃないの?
>>547のコードじゃ何がしたいのかイマイチ分からん。

565 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:21:53 ]
>>563
プログラム書いて欲しいなら最初からそういえば言えばいいのに。
宿題スレあたりで頼めばいいんじゃね?

566 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:23:36 ]
あとさ、お前の話が理解してもらえないのは、
決して周りの人間の理解力や洞察力が足りないからじゃない、
お前に説明能力が足りないからだよ。
そこんとこ分かっていないと損するよ。他の誰でもないお前が。
多分お前よりは(無駄に)長く生きてきた俺からの真面目な忠告。

567 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:23:53 ]
pc11.2ch.net/test/read.cgi/tech/1172981618/
こっちでやれ。

568 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:27:05 ]
>>556
iniに比べてXMLは面倒だよ。
世間でXMLが騒がれているとかiniが推奨されていないとかで
わざわざ面倒な方法で実装するようにしなければいけないなんて納得いかない。
一つ一つNodeを辿るのではなく1つのXPathで指定したり
自分でサブルーチン作ったりして何とかするけど
みんなどうしてんのか?

このパラメタがなかったらエラーだが
このパラメタがなかったらデフォルト知を使うとか
ころころ追加や削除も容易であってほしいところだし。

MSXMLはBSTRやvariant型でATLテンプレートがなかったら地獄だぜ
って感じている。

569 名前:デフォルトの名無しさん [2007/03/17(土) 13:27:07 ]
>>564
そこまでは思いついたんですよ。
でも、さっきも書いた通り、
このテキストには指定した区切り文字だけ取り除く方法が
while ((charArray = cin.get()) != '\"')
{
cout.put(charArray);
}
しか載ってないんですよ。
だからbuffer[SIZE]と組み合わせたんです。

で、その方法だと肝心の二重引用符はどのようにして取り除くんですか?

570 名前:デフォルトの名無しさん [2007/03/17(土) 13:28:11 ]
>>565
ここまで時間かけたんですからここでお願いしますよ。
もう五時間ですよ?



571 名前:デフォルトの名無しさん [2007/03/17(土) 13:29:22 ]
以前、宿題スレに質問したら
「え、自分でテキスト読んでやってんの?なら宿題じゃないじゃん」って書かれた経験あり。

572 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:33:27 ]
>>569
なんでテキストに載ってる方法しか使っちゃいけないの?

573 名前:デフォルトの名無しさん [2007/03/17(土) 13:34:26 ]
>>572
他の方法を知らないからですよ

574 名前:デフォルトの名無しさん [2007/03/17(土) 13:36:31 ]
これって面白いですか?

575 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:36:39 ]
じゃあそのテキストを窓から投げ捨てて、
もっとまともなのを探せばいいだろうに。

576 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:37:16 ]
>>571
そりゃ、普通は勉強のためにテキスト読んでるんなら、
人にコード書いてもらおうなんてのは本末転倒だからな。

577 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:37:55 ]
>>573 自分で調べろよカス。

578 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:38:59 ]
>>574
いや。割と迷惑。

579 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:39:20 ]
>>577
それこのスレの意義を否定してるぞ

580 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:39:20 ]
もういいよ、ストリームとか全部忘れてループ回せ。
int counter=0;
char output[SIZE];
for(int i=0; i<SIZE; i++)
 if(charArray[i]!='\"')
  output[counter++]=charArray[i];
これで解決。



581 名前:デフォルトの名無しさん [2007/03/17(土) 13:39:23 ]
五時間かけた結果がこれですか…いいですよ、因果応報って言葉をお忘れなく

582 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:39:55 ]
>>573
がんばれ!
途中参加の俺には何が何だかさっぱりわからないけどさ

583 名前:デフォルトの名無しさん [2007/03/17(土) 13:41:18 ]
あらあら、>>581の三秒前に回答が。

>>580さん、どうもありがとうございますです。
それなら確かにできそうです。

584 名前:デフォルトの名無しさん [2007/03/17(土) 13:42:25 ]
>>577
死ね、マジで死ね
おまいなんか生きる資格ねぇよカス

585 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:44:09 ]
>>584
だれが書いたか知らないけどそんなこというなよ

586 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:44:34 ]
>>579
「調べる=人に聞く」だとでも思ってるの?

587 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:45:19 ]
だから、>547の問題の文章をちゃんと理解するところから始めなきゃダメだって。

588 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:45:54 ]
>>586
>>547は自分でコード書いてどうですかって聞いてるんだから
それから調べるキーワードくらい教えてやってもよかったんじゃないか?

589 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:46:35 ]
>>587
原文もついてる訳だから読めなかった回答者が悪い

590 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:46:48 ]
こっちは宿題スレじゃないし、それが妥当だったかもねー



591 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:47:26 ]
>>590
それなら早く言ってあげればよかったのによくもまあネチネチと

592 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:48:13 ]
あらあら、今日も釣り大会ですか?釣果はどうでしたか?w

593 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:48:13 ]
いや俺途中参加だし、そんなこと言われても困る

594 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:48:49 ]
五時間もよく粘ったな

595 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:50:50 ]
>>583
よかったね

596 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:51:26 ]
>>588
そうは言っても元のコードが iostream 使ってるんだから
そこから調べたらいくらでも情報が出てくるはずだろ。
模範解答らしい >580 にはキーワードを足す必要があるものは
一個も無いし。その後の流れを見ても質問者がとんでもなく
アホだったとしか考えられない。

597 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:53:25 ]
>>596
じゃ、そのiostream使ってるんだから、のくだりを書いてやれよ
自分が初心者だった頃は泣きついてたくせに

598 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:55:27 ]
>>596
そのいくらでも情報が出てくるから困るんだろが
電話帳渡されて583-1723見つけろって言われて見つけられるかおまえ?
お前が言ってるのはそういうこと

599 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:56:36 ]
iostreamってテンプレート使ってるから初心者には少々取っつきづらい
まぁいきなり全部理解しようとせずに少しずつ順番に使うようにすると
勝手に手が動くようになってるけど

600 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:57:16 ]
>>597
「くだり」って、「〜調べたらいくらでも情報が出てくるはずだろ」って書けばよかったのか?
言ってることは >577 と同じなんだが。



601 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:58:59 ]
>>598
電話帳は番号で検索できないが Web はキーワードで検索できる。全然違うな。

602 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:59:10 ]
途中参加です。
本のコピペでプログラムを作ろうとしているのか。
俺はiostreamに詳しくないのだ。

質問者が何処まで知っていて何を知らないのか判らないから
回答が難しいよね。

まだ5時間しかやってないのか。
これにこりずに続けろよ。


603 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 14:01:30 ]
こんなところでもいじめやってんだから日本のいじめは根深いね

604 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 14:02:32 ]
ま、いじめた側はどうせいつか同じ目に遭うよ
ほっとけ

605 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 14:04:13 ]
これは本当にひどい

606 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 14:05:37 ]
もっとふざけた奴なら釣ってもいいだろうけどあんなマジメなのはやめとけよ

607 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 14:06:43 ]
俺からも>>586が氏ぬように呪っとくわ

608 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 14:07:31 ]
560 から 580 が導き出せないのは異常。

609 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 14:34:42 ]
読ませてもらった
俺からは>>586は無事なんだが
>>586の子供がいじめられて自殺するように呪っとくわ
それくらい悪質だな

610 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 14:57:19 ]
586は少なくとも2chの中ではごく普通のことだと思うが



611 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 15:12:51 ]
俺一応真面目に答えた側なんだけど。
なんつーか、行き詰まっているのに妙に自信過剰というか、
変な意地が見え隠れするのが気になった。
真面目なのは確かなんだろうけど、それは必ずしも
皆から受け容れられるということを保証してはくれないわけでさ。
自分も相手も匿名のこの場でこういう経験しておけたのは
長い目で見ればプラスなんじゃないのかなぁと思ってみたり。

612 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 15:20:01 ]
根拠のないプライド持った能無しほど困った存在もないからな。

613 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 15:40:57 ]
たまたま俺みたいなやさしい人がいなかったときに書き込んだのが
運が悪かっただけだよ。
2ちゃんねるが@IT会議室みたいにはなって欲しくない。

614 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 16:14:05 ]
つーか、そもそも>547の原文の下の訳が滅茶苦茶なわけで。

615 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 16:30:08 ]
ん?そうか?どこが?

616 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 16:46:26 ]
つーかお前らよくこんな下らないことでスレ引っ張るな。
そんなに暇なのか?
>>547なら、こんなもんでいいだろ。

#include <iostream>

int main()
{
    int i, c;
    char charArray[51];
    std::streambuf *sb = std::cin.rdbuf();
    if ((c = sb->sbumpc()) != '"')
        return 1;
    for (i = 0; i < 50 && (c = sb->sbumpc()) >= 0 && c != '"'; )
        charArray[i++] = static_cast<char>(c);
    charArray[i++] = '\n';
    std::cout.rdbuf()->sputn(charArray, i);
    return 0;
}

617 名前:デフォルトの名無しさん [2007/03/17(土) 16:54:16 ]
>>603からの自作自演が酷すぎてワロタ
C初心者は歓迎だがネット初心者や2ch初心者は帰れ

618 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 17:01:26 ]
C版
#include <stdio.h>

int main()
{
    char charArray[51];
    if (scanf("\"%50[^\"]\"", charArray) != 1)
        return 1;
    puts(charArray);
    return 0;
}

619 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 17:17:29 ]
>>616>>618見るまで入力テキスト内の"を全て取れって問題だと思ってた
最初と最後にしか出てこないんだな

620 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 17:19:39 ]
>>619
Read a string of the form "characters"



621 名前:デフォルトの名無しさん [2007/03/17(土) 17:54:39 ]
今Linuxで動くアプリケーション(なんて大げさなものでもないですが)を作っています。

一般的なC++におけるDebugビルド用のマクロって何か決まっていますか?
_DEBUGってのは Visual C++用みたいですが・・・
自分で勝手にマクロ決めていいもんなんですかねえ

622 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 17:56:24 ]
アンダースコアで始まらない名前なら何でもおk

623 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 17:57:32 ]
逆に、assert.hではNDEBUGを利用している。
まぁ無難に、DEBUGで委員ジャマイカ。

624 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 18:21:13 ]
>>621
リリースビルド時に NDEBUG 定義するから NDEBUG 定義されてないときがデバッグビルド。

625 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 20:07:57 ]
それってただ多くのコンパイラで採用されてるだけ?
それとも規格で決まってるの?

626 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 21:00:44 ]
623は規格で定まっている事項。

627 名前:625 mailto:sage [2007/03/17(土) 22:01:11 ]
ありがとう!
どんな環境でも安心して使えるんだね。

628 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 00:06:17 ]
規格を守っていないシステムが存在しないという証明はできないから
どんな環境でも安心して使えるということにはならん

629 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 00:18:41 ]
そんなときは assert.h を自作すればよし。簡単だよ。

630 名前:デフォルトの名無しさん [2007/03/18(日) 00:25:28 ]
Visual Studio2005 C++で
読み込んだり計算したりして出した
正の整数値分の配列を宣言したいのですが
取り方がわからないので教えていただきたいです

unsigned int a;
char buf[10] = "231";
a = atoi( buf );

こんな感じで a を取っていたとき
a の大きさ分だけもった b 配列をつくることってできないでしょうか?

/*---------------------
const unsigned int c = 231;
int d[c];
-----------------------*/
気分的に(笑)上の様な感じで

int b[a];

と宣言してしまうと
定数式が必要です。 とか
サイズが 0 の配列を割り当てまたは宣言しようとしました。 とか
'b' : サイズが不明です。 とか怒られてしまいます・・・



631 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 00:38:02 ]
const unsigned int c = 231;
int *d = malloc(c);

こんなかんじ?

632 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 00:42:17 ]
C++ って言ってるから new じゃね?

int* b = new int[a];

使い終わったら delete b[];



633 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 00:43:05 ]
delete[] b
でしょうがぁぁぁあああ!!!

634 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 00:44:07 ]
ごめんなさい><
boost::shared_ptr しか使ってないからもう忘れました><


635 名前:630 mailto:sage [2007/03/18(日) 00:54:35 ]
こんな早くレスもらえるとは!
ありがとうございます

636 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 01:18:40 ]
>>634 配列に shared_ptr は使えないんじゃね?

637 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 01:19:43 ]
vectorでいいじゃん。

638 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 01:22:09 ]
>>636
shared_array があるじゃん

639 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 06:54:25 ]
>>634
たぶんこんな感じ
namespace bll = boost::lambda;
boost::shared_ptr<int> hoge(new int[42], bll::bind(bll::delete_array, bll::_1));

640 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 08:00:39 ]
素直にshared_array使えよw



641 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 08:30:55 ]
シャーベット・アーリーと読んでしまったorz ネヨ…

642 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 08:32:24 ]
寝る前に、
早くシャーベットを食べるんだ。

643 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 13:34:06 ]
虫歯に注意

644 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 23:56:17 ]
引数がvectorでも組み込みの配列でも動作する、平均値を返す関数を書くべく、
引数を反復子(ポインタ)にして
template<class Ran>
double average(const Ran& begin, const Ran& end){ (略) }
と定義したのですが、関数呼び出し部分で
double av_arr[] = {10, 20, 30, 10};
size_t av_arr_size = sizeof(av_arr) / sizeof(*av_arr);
double x = average(av_arr, av_arr + av_arr_size);
としたところ、
「テンプレート のパラメータ 'Ran' があいまいです。
'double *' の可能性があります。または 'double [4]'」
とコンパイラ(VC2005)にダメ出しされてしまいます。
average(av_arr + 0, av_arr + av_arr_size);
とすれば共にポインタとして認識してくれるようですが、
読んだ本には、「配列の名前を添え字なしで使うと配列の先頭のポインタが渡される」と書いていたので、
元のままだと何が悪いのかよくわかりません。
"double [4]"って何の型?? みたいな話もあるんですが、
解説とスマートな解決策をご教授願えれば幸いです。


645 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 00:04:28 ]
>>644
double av_arr[4];

確かに av_arr と &av_arr[0] は、
同じ値になるけど
型としては別のものだよ。

ちょっとややこしいね。

646 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 00:07:06 ]
>>644
template<class Ran>
double average(Ran begin, Ran end);

エラーメッセージによると、
double average<double*>(double* const& begin, double* const& end);
double average<double [4]>(double const (&begin)[4], double const (&end)[4]);
のどちらか決めかねるようだけど、1つめの引数がどっちでも
マッチしてしまうからエラーになるんだと思う。

テンプレート引数の推測時には配列はまだ配列のまま。
読んだ本は C の本か、 C++ でも入門書あたりだろう。

647 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 00:10:12 ]
>>644
double av_arr[] = {10, 20, 30, 10};
において、av_arrは、'double [4]'という型ですよ。

もしav_arrが'double *'という型だと
size_t av_arr_size = sizeof(av_arr) / sizeof(*av_arr);
は、sizeof(double *) / sizeof(double);
になっちゃうよ。

648 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 00:31:57 ]
>>645-647さん
ご丁寧な解説、痛み入ります。
おかげさまで、理解に至りました。ありがとうございます。
お察しの通り、読んでいるのはC++の入門書ですね、はい。
精進いたします。

649 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 01:13:27 ]
vc8で、スタック上に複数のオブジェクトを作ったとき
デストラクタは作った順とは逆の順番で呼び出されるようですが
これに依存するような、オブジェクト間の依存関係を作ったりしてもOKなんでしょうか?

650 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 12:20:29 ]
構築した逆順で解体されるのは規格で保証されて滝ガス。



651 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 12:22:51 ]
うん。OK

652 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 21:19:45 ]
違う順番で解放されたらスタックじゃないしな

653 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 21:25:42 ]
>>652
そういう意味じゃないだろー。

654 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 21:57:37 ]
スタックだからこそじゃないんですか?

655 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 22:01:17 ]
実行順を保証しないと困る事があるからだ。
依存し合ってる場合とか。

そもそも、自動変数がスタックで実装されるかどうかなんて
規格で決まってないっしょ?

656 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 22:15:12 ]
入門書に載っていたサンプルコードをそのまま写してコンパイルしてみたのですが、
kouza.hの6行目で「宣言の構文エラー」と表示されます。
1ファイルにまとめれば正常にコンパイルされるのですが、どういった問題があるのでしょうか?
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3759.zip
ソースはこれです。

657 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 22:48:30 ]
>>649でスタック上って言ってるからスタック前提の話かと思いました

658 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 22:51:13 ]
>>656
kouza.cppとmain.cpp両方で、多重対策してないkouza.hをインクルードしてるせいで多重定義になってるだけじゃないの?

659 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 22:58:24 ]
>>648
オブジェクトA・B・CとプッシュされたものはC・B・Aと取り出される
プログラムの関数もスタックを使って実装されてる

660 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 23:42:22 ]
ソースファイル上で関数宣言の後などに
LFが挿入されているのをよく見掛けるんですが
これってどういう意味があるんですか?

void hoge(int piyo)
{

}
^L

みたいな感じ



661 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 23:44:44 ]
そんなの見た事ない。
文字コードの違う環境でいじったんじゃね?

662 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 00:22:40 ]
>>660
LF(^J)なら必ず入るだろ、改行コードだから。
FF(^L)なら改ページコードとして入れるという習慣が一部にあるらしい。
プリンタに出力したときに関数単位で出力されることを期待しているのだろう。

663 名前:656 mailto:sage [2007/03/20(火) 00:33:27 ]
>>658
kouza.cppの中身(「#include"kouza.h」以外")をkouza.hに移して試してみたのですが、
依然エラーは消えないままです。
main.cppの方に移しても同様なので、原因は別のところにありそうです。

664 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 00:42:40 ]
具体的にはどのようにコンパイルしているんだ?

665 名前:656 mailto:sage [2007/03/20(火) 02:05:14 ]
>>664
Cpadでコンパイル時パラメータの欄に
main.cpp kouza.cpp kouza.h
と入力した状態でコンパイルしています。

666 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 03:16:34 ]
>>665
Cpadは使った事無いけど、ヘッダーファイル(kouza.h)も指定しないといけないの?
Visual C++ 2005EEとg++ 4.1.2で普通にコンパイル通ったよ。


667 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 06:37:45 ]
>>656
CPadってBorlandC++Compilerだけだっけ?

↑なら
bcc32 main.cpp kouza.cpp で正常にコンパイルできたけど

668 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 06:50:51 ]
パラメータの入力順が違うだけだったりな
kouza.h kouza.cpp main.cpp とか

669 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 07:16:51 ]
ヘッダをC言語としてコンパイルしているので、classでエラーが出るという落ちでは

670 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 07:25:43 ]
>>663
そんなことしても多重対策にはならんわいw



671 名前:656 mailto:sage [2007/03/20(火) 15:43:42 ]
みなさん回答ありがとうございます。無事に解決することができました。
>>666
kouza.hを外したらコンパイルが通りました。
以前にヘッダも指定した時はたまたま上手くいったので、
それが正しいと思い込んでしまっていました。

>>670
kouza.cppの中身を移してkouza.hとmain.cppだけをコンパイルすれば
対策ではなく、そもそも多重定義が起こらないと思ったのですが・・・
何か自分が勘違いしてるかもしれません。申し訳ないです。


672 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 16:02:45 ]
>>662
^LはFFなんだね.首でも吊ってくるよ
勉強になった dクス

673 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 23:31:41 ]
>>650-651
久しぶりに職場にお泊りしてしまった
遅くなったけど、ありがとう 

674 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 15:21:56 ]
windowsでMSTPサーバを使用して、メール送信してますが
outlookで、メール送信することできるでしょうか?

APIかコマンドラインから使うことできれば、便利なんですが。
よろしくお願いします。

675 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 15:24:56 ]
Outlook Expressのことなら知らない。
OfficeのOutlookなら、VBAでできるかやってみろ。
それでできたらC++でもできる。

676 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 17:26:27 ]
>>675
レス感謝です。
検索して、しらべてみます。

677 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 18:05:11 ]
>>674
メーラーを外部から操作するためのMAPIというAPIがあり、Outlookは
対応しているが、ある時点で(XPのSP2だったかな?)、セキュリティ絡みで
非常に強い制限が課せられるようになったはず。
送信が許可されてたかどうか。

678 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 17:20:23 ]
済みません、int から byteヘとか
そのまた逆にする場合はどうしたらいいでしょうか?
ググッたんですがJavaやC#は見つかったんですけれども
C++が見つからなくて
初心者の質問で済みません



679 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 17:22:50 ]
CやC++にはbyteなどという型は存在しないのでintからbyteにする方法などはありません

680 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 17:27:08 ]
あっそうなんですか
そうすると今使ってる
byteはwinやTurbo C++の環境なのかな...orz
もうちょっと調べてみます



681 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 17:33:12 ]
typedefでしょ?
castすればいい。もちろんcastの動作を理解した上でやってね。

682 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 17:42:53 ]
byteとcharって、どの程度違うの?

683 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 17:43:22 ]
有り難う御座います、castの知識曖昧な所が多いので
勉強しながらやってみます


684 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 18:02:02 ]
>>682
charはコンパイラによって符号ありだったりなしだったりするが
BYTEは大抵は符号なしcharのtypedef
byteはシラネ

685 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 18:47:47 ]
>>678
static_cast
おそらくbyte→intのように、扱える範囲が広くなるほうへは使わなくても平気。

Cとの互換を保つため実は狭くなる方へもキャスト無しで行けるが、キャスト使っておけ。
エラーにできないもんだから、みんな警告を出す。

686 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 19:20:44 ]
有り難う御座います
やってみます

687 名前:デフォルトの名無しさん [2007/03/23(金) 05:44:57 ]
質問です。
tableと言う配列があったとして
ループ部分で、前の値を計算式に含める場合。スマートな方法は無いのでしょうか?
具体的には

int table[128],res[128];
for(int i=0; i<128; i++){
res[i]=table[i-1]*5;
}
こういった式の事です。
このままでは、1回目のi=0の時に負の値が添え字に与えられてしまいます。
int i=1だと、res[i-1]としなければならず、なんとも気持ちが悪いものです。
一般的にはこのようなループはどのように対処するものなのでしょうか?イディオム的なものはあるのでしょうか?

688 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 05:51:26 ]
>>687
res[0]には何入れるの?


689 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 06:19:26 ]
>>687
int * dest = &res[0] ;
int * src = table[-1] ;

for ( ; dest != &res[128] ; ++dest, ++src )
{ *dest = *src * 5 ; }

あるいは、

std::copy( &table[-1], &table[127], &res[0] ) ;


>>688
悪魔が入ります。

690 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 07:31:31 ]
>>689
> int * src = table[-1];
おまえ正気かいな



691 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 07:37:29 ]
>>689
それ何の解決にもなってないだろ

692 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 08:28:34 ]
>>687
>res[i-1]
結局行き着くのはここ
それで気持ちが悪いとか言ってたらC/C++なんてやってらんねぇよ

>>689
そんなにアクセス違反とか領域破壊とかしたいのかおまいはw

693 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 13:44:09 ]
添え字に飽和減算マクロを使えばおk

694 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 17:51:14 ]
>>687
res[i-1] はコンパイラによって (res-1)[i] みたいに
なることが多いので気持悪く思う必要はない。最初から
(res-1)[i] とも書けるけどこれは規約違反。


695 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 19:41:22 ]
>>694 強い電波をキャッチしました。

696 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 20:06:10 ]
>>694
(res-1)[i] <-> *(res-1+i) <-> res[i-1]

resがポインタ型なら常にこれらは等価。
規格にもなんら違反していない。

697 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 20:19:32 ]
694自身もしくは694の職場でのコーディング規約なのでは?

698 名前:デフォルトの名無しさん mailto:age [2007/03/23(金) 20:30:38 ]
ついでに言うと(-1+i)[res]でも同じだな。キモ過ぎるなこれ。

>>694はポインタ同士の演算(減算を除く)が不正であることと
混同してるんじゃないか?

699 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 21:41:50 ]
>>687
for( int i=1; i<128; i++){
res[ i - 1 ]=table[ i ]*5;
}
じゃダメなの?

700 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 21:57:26 ]
それ意味変わってね?



701 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 22:03:48 ]
>>698
さすがにそんなコードは書かないけど、
C言語におけるポインタとはどういうものかを知るには
素晴らしい例だと思う

702 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 22:09:57 ]
>(-1+i)[res]
の解説キボンウ

703 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 22:13:46 ]
例えば res[i-1] ってのは
(resが指し示すアドレス)と(添え字=この場合ならi-1)
との単なる加算を行い、そのアドレスが保持している値を返す。
数字が前に来ようが後に来ようが両方に来ようが
加算の結果は変わらないので指し示すアドレスも変わらず、
よって問題は起こらないと

704 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 22:14:01 ]
>>702
解説面倒だからポインタがなんであるかの勉強してこい

705 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 22:15:49 ]
>>702
a, bの片方がポインタ型で他方が整数型である場合、a[b] は *(a+b) に等しい。

706 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 22:18:12 ]
>>702
(-1 + i)[res] ⇔ *(-1 + i + res) ⇔ *(res + -1 + i) ⇔ res[-1 + i] ⇔ res[i - 1]

これ書いていて思い出した。CもC++も規格では
配列の先頭要素〜最後の要素を1つ越えたところの範囲外を指すポインタの存在すると
プログラムの挙動が未定義になる。694が規約違反と言っているのはこのことだ。
www.kouno.jp/home/c_faq/c6.html#17



707 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 22:19:56 ]
目からぬるぽでした
解説あんがとさんでした

708 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 22:55:03 ]
無料でC++使える環境は?.NET使えなくていいから

709 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 22:56:42 ]
cygwin, mingw gcc

710 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 23:01:17 ]
>>708
VC++EE



711 名前:デフォルトの名無しさん mailto:sage [2007/03/23(金) 23:01:44 ]
>>706
なるほど。C FAQをもう一度読み直すとするか…。

712 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 01:23:19 ]
>>707
目にガッしていいの?
目にガッって、やっていいの?


BCC

713 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 01:24:49 ]
>>706
どうでもいいけど日本語がおかしい。

714 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 01:41:55 ]
デバッグ出力なんかだと、時折り"NULLPO"[ga]なんてのも使うよね。
#流石にga["NULLPO"]とはしないけど。

715 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 01:48:48 ]
俺はテストデータに"いろはにほへとちりぬるぽ"とか使う。
最初は反応してくれる人が居たけど、最近は誰も反応してくれなくなった。
いいかげん、次のネタを考えんといかん。

716 名前:デフォルトの名無しさん [2007/03/24(土) 02:17:01 ]
分割コンパイルをやってて、
コンパイルすると「外部シンボル”○○(自分で定義した関数)”が未解決です」
ってでるんですが、俺はどうしたらいいですか?


717 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 02:18:23 ]
>>716
コンパイラエンジンの使い方を勉強すればいいと思います。

718 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 02:27:23 ]
>>716
コンパイルだけじゃなくてリンクまでやっちゃってるから。
それはリンカが出してるエラーメッセージ。

719 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 03:13:58 ]
変数の命名に関して質問です。
メンバ変数の末尾に"_"をつけているソースをよく見ますが、
これはシステムが利用している変数名とは被らないのでしょうか?

自分で調べたところ、_xや__xや_x_はダメだという記述は
見られましたが、x_に関しての記述はなかったもので。

720 名前:716 [2007/03/24(土) 03:20:22 ]
>>717-718
こんな質問に答えてくれてありがとうです。

このエラーを解決するにはどうすればいいですか?
一通りググってみたけど、いまいち理解出来ませんでした。
質問ばかりですいません。



721 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 03:26:47 ]
>>719
末尾なら良いんでないでしょうか。
俺はアンダースコア(アンダーバー)で終わる変数名は
つけないけど。

722 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 03:29:57 ]
>>719
末尾についてるのは大丈夫。ただし C++ では末尾でも(途中も含めて)二重なのはダメ。

723 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 03:31:20 ]
>>720
○○が定義されているオブジェクトファイルもリンカに渡せ。

724 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 03:33:17 ]
>>720
まず、お前自身が自分がなにをやってるのか正確に理解する必要がある。

フツーのコンパイルなら一度に全てのソースをコンパイルしリンクを行う。

分割コンパイルの場合は一部のソースのコンパイルだけ行う。
リンクは全てのソースのコンパイルが完了している任意のタイミングで行う。

で、お前の今の状況だが、大きく二つのケースに分かれると思う。

ひとつはコンパイルだけ行えばいいタイミングでリンクまでやっている。
( 通常、コンパイラは"コンパイルのみを行う"という指示がない場合、勝手にリンクまでやっちゃう。 )

もうひとつはリンク時に必要な( ソースファイルをコンパイルして生成される )オブジェクトファイルが
全部そろってない、あるいはオブジェクトファイル自体はあるが、リンカに渡っていない。

725 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 03:36:07 ]
>>720
ヘッダで関数宣言だけしてあるけど、
中身の定義が見つからんてことだよ

726 名前:716 [2007/03/24(土) 03:59:33 ]
どうやら自分は何がしたいのかが理解できてないようです。
取り敢えずもう少し勉強してみます。
こんな時間におさがわせしました

727 名前:デフォルトの名無しさん [2007/03/24(土) 04:01:15 ]
まあそう言わずに思いのたけをぶつけてくれたまえ。

728 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 04:15:14 ]
>>726
具体的にどんな環境でどんなふうにコンパイルしてるのか、詳しく教えてくれれば
多分、ちょっとしたことでうまくいく問題だぞ。

729 名前:429 mailto:sage [2007/03/24(土) 04:17:10 ]
>>430-444
ありがとうございます。

質問してたの忘れてた(汗
遅レススマムコ

730 名前:デフォルトの名無しさん [2007/03/24(土) 04:22:44 ]
#define って そのソースファイル内でしか適用されんの?

また同じ #define をソ−スごとに書かないと駄目なの?



731 名前:デフォルトの名無しさん [2007/03/24(土) 04:27:33 ]
>>730
プリプロセッサだもの、そりゃそうでしょ。
いっぱい書きたくなかったらヘッダに書けばおk。

732 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 04:28:34 ]
同じ #define を複数箇所に書くとかあまりにも意味がないw

733 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 04:32:25 ]
>>730
コンパイルオプションで指定するならソース上のどこにも書かなくていいよ。

734 名前:デフォルトの名無しさん [2007/03/24(土) 04:34:19 ]
>>731
ヘッダに書いてインクルードさせれば使えるの?


735 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 05:04:18 ]
#includeは単なるファイルのコピペ指令だ
気張る必要はないよ

736 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 09:37:31 ]
>>732
それそのまんまマイクロソフトに言ってやれ

737 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 10:03:11 ]
一応VC++でのコマンドラインからのコンパイルとリンクの仕方を
msdnから抜粋しといた。必要ないから、俺は使ったこと無いけど

コマンド ラインで、オブジェクト ファイル FIRST.obj と SECOND.obj が作成される。

CL /c FIRST.C SECOND.C

実行可能ファイルを作成するには、LINK を呼び出す必要があります。

LINK firsti.obj second.obj /OUT:filename.exe



738 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 11:19:57 ]
WinXP、MinGW-5.1.3を使ってます。
10E13位の実数を扱いたいんですが、float型やdouble型で宣言しても
warning: integer constant is too large for "long" type
というエラーが出てしまいます。どうすれば解決できるでしょうか。

739 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 11:22:20 ]
コード書け

740 名前:738 mailto:sage [2007/03/24(土) 11:27:25 ]
これだけなんですが。
float na;
long nb;

na = 100000000000;
nb = 1000000000;




741 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 11:29:05 ]
double f[] = {100000000000000., 10e+13};

742 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 11:30:28 ]
>>740
それはlongリテラルだもん

743 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 11:33:42 ]
>>740
小数点でも書いとけばいいんじゃないの

744 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 11:34:11 ]
エラーメッセージのまんまだな。
longリテラルではなく浮動小数点リテラルとして認識させればいいだけ。

745 名前:738 mailto:sage [2007/03/24(土) 11:36:04 ]
宣言はできましたが、数値を代入したら同じエラーが出てしまいました。
代入するには
f[0] = 100000000000;
でいいんですか?

746 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 11:36:32 ]
>>740
na = 100000000000.0f;

つーか10E13ってそういうことか
てっきり0x10E13かと思ってたわ

747 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 11:40:24 ]
>>745
だからdoubleリテラルにするために小数点かeつけろよ

748 名前:738 mailto:sage [2007/03/24(土) 11:48:23 ]
代入する数値に.を付けて
f = 100000000000.;
としたら解決しました。ありがとうございます。

749 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 11:55:31 ]
>>737
-cオプション与えなければclでexeを直接生成できるよ。

cl -o foo.exe first.c second.c
でよい。

ま、普通は(Makefileを使うような場合は)-cオプションつきでobjを
作った後で結合するけどな。

750 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 12:18:51 ]
C++版のgetch()ってありますか?



751 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 12:25:29 ]
ない。そもそもgetchは標準関数ではないのだからC++がどうこう言う話ではないだろ

まあ、conio.hがある環境なら#includeしとけば使えると思うよ

752 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 12:34:29 ]
標準じゃなかったんですね・・・
回答ありがとうございました

753 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 17:36:07 ]
#include <windows.h>
#include <iostream>
BYTE A(const BYTE* a)
  { return a[0]; }
BYTE A(const PBYTE a)
  { return a[1]; }

int main() {
  const BYTE a[] = { '0', '1', '2', '\0', };
  /* */ BYTE b[] = { '0', '1', '2', '\0', };
  std::cout << A(a) << A(b) << std::endl;
  return 0;
}

このコードは 01 と表示するんですが、aとbが区別される理屈がわかりません
また、Aの定義からconstを取り除いた場合、同じBYTE*の関数としてあつかわれて
コンパイルエラーになるのに、constがあるとOKなのも理解できません
なぜこうなるんでしょうか?

754 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 17:48:28 ]
const PBYTEはBYTE* constになる。
const BYTE* aはaの指す先がconstという意味。
BYTE* const aはaそのものがconstという意味。
それぞれ別の型として扱われるので多重定義できる。

仮引数そのものがconstかどうかは多重定義の解決の際に考慮されないので、
実質的にはA(const BYTE* a)とA(BYTE* a)の中からどちらのAを呼ぶかということになる。
main関数の中のAの呼出では、それぞれaとbの型に引数が最も合うAが選ばれたということ。



755 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 17:54:04 ]
constなポインタとconstなオブジェクトを指すポインタの違いはこんな感じ
int i;
const int c;
int *const pc;
const int* cp;

pc = &i; //エラー:pcはconstだから
cp = &c; //Ok

*pc = 0; //Ok
*cp = 0; //エラー:cpの指す先はconstだから


756 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 17:57:58 ]
>>754-755
うぉぉ すごく良くわかりました

> const PBYTEはBYTE* constになる。
これに気づけなかった。感激です 
あとドルジっょぃ

757 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 18:15:44 ]
ポインタが絡んだときに、constがどこにつくかってのは、定期的に出るね。
cont BYTE *
だから分かりにくいのであって
BYTE const * //上の型はこれ
BYTE * const
BYTE const * const

そもそもなんで、型の前にも後ろにも付けられるようにしたんだか。
後ろだけだったら、こんなに混乱しなかったはずなのに。

758 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 18:22:36 ]
>>757
C++の言語仕様は何でもあり
これがすべての混乱の元と言われている

759 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 18:30:57 ]
結局C/C++は女子供の使うものじゃなかったんだよ。
スキルのもった、何でも自分で出来る現場のおっさんが、好きなように出来るように作られたもの
それが出来ないなら、制限されたC♯で"安全な"プログラムを組めって事さ




760 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 18:35:28 ]
>>757
www.research.att.com/~bs/bs_faq2.html#constplacement



761 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 18:40:16 ]
>>758
これはC++だけではなく、基のCからそうだった。

762 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 18:50:53 ]
const BYTE *A だったら
(const BYTE)←Aって感じでポインタのAがconst BYTEを指してますよーっ
て感じで直感的かもしれない気がしただけでしたごめんなしあ

763 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 18:51:13 ]
C++はオブジェクト指向が追加されて更に言語仕様が複雑になった
CはポインタとGOTOを制限すれば構造化プログラミングを
正常に行える。
オブジェクト指向言語でありながらポインタがある。この言語仕様で
自由にプログラマーがコーディングする他人が読めないコードに
なるのはむしろ必然

764 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 19:14:33 ]
GOTOなんて気持ち悪すぎ

765 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 22:11:17 ]
>>763
初心者丸出しの発言乙w

766 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 22:23:51 ]
玄人がするような発言をして下さい↓

767 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 22:25:49 ]
gotoにも使いどころはあるよ

768 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 22:28:47 ]
プログラミング規約を行わないでコーディングさせたら
プログラムを複雑にするのは事実
フレームワークを言語に取り入れるのは大規模開発では常識となっている。
世界で活躍するプログラマになると実行速度・コードサイズ・可読性に優れた
コーディングを行っている。
他人が読めないコードは最悪のコーディングスタイルだ

769 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 22:33:57 ]
実行速度やコードサイズを犠牲にして可読性上げてるんじゃなかったっけ・・・

770 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 22:38:53 ]
エセ玄人がするような発言をして下さい↓



771 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 22:40:33 ]
実行速度・コードサイズは最適なアルゴリズムを採用することにより実現
可読性はクラス設計を適切に行い、関数の粒度を均一にすることで実現
更に優秀なプログラマなら再利用可能なプログラム設計も行える。

772 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 23:05:56 ]
ごめんなさい
どれも出来ません。

773 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 23:06:22 ]
・最適な
・適切に
・関数の粒度を均一にすること
・優秀なプログラマ

774 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 23:09:56 ]
goto 使わずにどうやって for の二重ループから脱出するの?

775 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 23:11:01 ]
フラグ立てんじゃね?
まあ俺はgoto使っちまうがな

776 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 23:11:45 ]
日本ブレイク工業社歌ばりにブレイクブレイク。

777 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 23:16:07 ]
最初は素直な実装を心がけてればいいんじゃないかな

778 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 23:25:07 ]
2重ループを関数に移してreturnするな俺は

779 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 23:38:25 ]
で、goto 使うななんて発言はどこにも見当たらないんだが…

780 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 23:44:06 ]
ばっかだなぁ throwがあるじゃないか



781 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 23:45:14 ]
例外ってgotoよりタチが悪いだろ

782 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 00:58:07 ]
gotoを全く使ってはいけないのではなく、多用すると可読性が悪くなるから制限が必要
多重ループからの離脱はgoto使うとむしろ可読性が良くなるから使うべきケース

783 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 01:23:56 ]
try throw catchってやばいのん?

784 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 01:27:33 ]
>>783
もちろん、ちょーやばい。宇宙並みにヤバイ。お前は絶対使うなよ! やばいから!



・・・俺は使うけど。

785 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 02:04:48 ]
例外は"見えないgoto"だとはよくいったものだ。
悪用すると、gotoよりも可読性が悪くなる。
使わなくて済むのなら避けるべき。

786 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 02:44:48 ]
どの言語でも例外を非ローカル脱出に使うのは推奨されていないなあ…

787 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 10:25:08 ]
例外って、使う使わないというものじゃなくて
「使わざるを得ない」ものではなかろうか

788 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 12:41:01 ]
うるさいうるさいうるさい!

789 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 16:35:02 ]
質問失礼します。

とある関数で、time(NULL)を種として乱数を発生させているのですが、
高速で繰り返し関数を呼び出しているため、同じ乱数が何度も発生してしまいます。
速度を落とさずこれを回避するには、どうすればよいでしょうか?

790 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 16:36:12 ]
種を与えるのは一回だけでいい



791 名前:デフォルトの名無しさん [2007/03/25(日) 18:43:58 ]
循環参照とか循環インクルードとか、
このヘッダインクルードしたらこのヘッダもついてくるから
新しくヘッダつくるかそしたらこのヘッダインクルードしないといけないから
そしたらこのヘッダもついてくるからって











もう嫌になった

792 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 18:46:20 ]
インクルードガードしろ

793 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 19:53:17 ]
分割コンパイルするならインクルードガード必須だろ、常識的に考えて

794 名前:デフォルトの名無しさん [2007/03/25(日) 20:00:55 ]
インクルードガードは本当は良くないんじゃないんですかね。
それはただの対処法ってだけじゃないの?

795 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 20:04:53 ]
やっぱ#pragma onceで重複処理するだけって駄目なのか・・・

796 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 20:09:15 ]
>>794
ただの対処法がダメならどうしろとw

>>795
そいつぁコンパイラを選ぶんじゃなかったか

797 名前:デフォルトの名無しさん [2007/03/25(日) 20:14:56 ]
>>796
基本的に循環しないように分割の設計していかないと駄目だと思うのよね。
それが基本的に本当だと思うのよね。
ヘッダ1000個とかになって人間として難しいって時の対処法でインクルードガードがあるんだと思うんだよね。


798 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 20:32:57 ]
それはつまり、NULLが定義されているのがstddef.hのみだった場合

stdio.hやstdlib.h内でstddef.hをincludeするのは禁止で、かつ
ユーザーはstdio.hとstdlib.hの両方を使用するコードを書くべきではない

ということですよね?

799 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 20:46:45 ]
標準ライブラリは重複してもおkなの?

800 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 20:48:24 ]
何をもっておkとしたいのか判らん
オブジェクトコードを1バイトでも軽くしたいとかコンパイルを1秒でも早く終わらせたいとか
そんな目標があるのか?



801 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 20:51:50 ]
つまり発生する問題はその程度ということですか、ならおkです

802 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 21:00:31 ]
>>797
>基本的に循環しないように分割の設計していかないと駄目だと思うのよね。
>それが基本的に本当だと思うのよね。

んなこたねーよ馬鹿。循環していなくても
同じ宣言・定義を2回読む危険性はあるだろ。

>>799
標準ライブラリもインクルードガードされているから大丈夫。ソース見れ。

>>800
#include <stdio.h>と何回も書くと
その分だけオブジェクトコードが増えるとでも思ってるのか?
時間は数ミリくらいは遅くなるだろうが。

803 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 21:11:19 ]
>>802
>>799>>797理論について標準ライブラリも重複しないようにせにゃならんのかと言ってんじゃね?

804 名前:デフォルトの名無しさん [2007/03/25(日) 23:18:38 ]
>>798->>803
バカかお前ら。依存関係の事言ってんだよ

805 名前:デフォルトの名無しさん [2007/03/25(日) 23:24:59 ]
>>804 ごめん、よくわからん

806 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 23:25:03 ]
結局これか
www.kouno.jp/home/c_faq/c10.html#7

807 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 23:28:37 ]
>>804
無能

808 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 23:34:21 ]
>>806に関連して(このスレの流れには関係ないが)
borlandのコンパイラ及びmakeは、自動的に依存ファイルの更新をチェックする機能がある
(.objのコメントにincludeされたファイルと日付を含め、makeがそれをチェックする)
まあmakeにかかる時間が若干増えるが。

809 名前:デフォルトの名無しさん mailto:sage [2007/03/26(月) 00:24:06 ]
>>806
Indian Hill スタイルガイドを策定したヤツは馬鹿ですか? 信じられん。
一度、#include を入れ子にしてないプログラムのメンテしたことあるけど地獄だったぞ。

810 名前:デフォルトの名無しさん mailto:sage [2007/03/26(月) 02:43:27 ]
例えばクラスAを保持しているクラスBとCがあって、それぞれが別々の
.cpp と .h のセットに記述されていた場合とか、
入れ子 #include が禁止だと非常に困る



811 名前:デフォルトの名無しさん mailto:sage [2007/03/26(月) 05:27:27 ]
>789
どういう状況かは知らないが、似たような経験がある。

とあるアプリのプラグインを開発していたんだけど、
アプリの仕様上、その機能が使われる度に毎回プラグインがロードされるので
static変数が使いにくいという状況だった。

そのときに色々と調べて見つかった方法が、
・シードをファイル等に書き込んでおく
・プラグインとは別にプロセスを立ち上げ、種を保持しておく
・ミリ秒ではなくマイクロ秒を種に与える
の3つだった。他にもあるかもしれない。


812 名前:デフォルトの名無しさん [2007/03/26(月) 16:52:23 ]
Win32APIフックについて教えてください。

ユニットテストでAPI呼出失敗を検証する為、
APIフックを行う必要があります。
いろいろ調べた結果、以下のHPにサンプルがありました。

ttp://ruffnex.oc.to/kenji/text/api_hook/
ttp://ruffnex.oc.to/kenji/text/api_hook/ex2.cpp

動作検証した所、フックは成功しました。
しかし、フック状態から元の状態に戻す方法がわかりませんでした。
(プログラムを終了すれば元の状態にもどりますが、そうではなく、任意のタイミングで戻したい)

どのようなコードを書けばよいのか、識者の方ご教授いただけませんでしょうか。

813 名前:デフォルトの名無しさん mailto:sage [2007/03/26(月) 16:57:48 ]
そりゃ、自分のプロセスのテーブルを上書きして書き換えてるだけだから。
そこのページに置いてある API_Hook.zip をちゃんと読めば分かるよ。

814 名前:デフォルトの名無しさん mailto:sage [2007/03/26(月) 17:03:34 ]
ややすれ違い WindowsAPIべったりな話題だから
pc11.2ch.net/test/read.cgi/tech/1174416295/l50

さらにいうなら親切にBBS用意してるんだからそっちで聞くほうがいいとおもうけどな
さらにいうならもう一個下のサンプルにはちゃんと実装されてるんだから
それぐらい調べてからでも遅くないと思うんだけどな
でもってReplaceIATEntryInAllModsの引数逆転させてみな

815 名前:812 [2007/03/26(月) 17:40:00 ]
>>813
>>814
レスありがとうございます。

ご指摘の通り、ソースを調べてから質問するべきでした。
また、スレ違いであることも、重ねてお詫びします。
申し訳ありませんでした。

816 名前:デフォルトの名無しさん mailto:sage [2007/03/26(月) 18:34:00 ]
Cの質問です。

unsigned int a = 1;
a -= 2;

このとき、aの値がUINT_MAXになることは保障されているのでしょうか?

817 名前:デフォルトの名無しさん mailto:sage [2007/03/26(月) 18:42:17 ]
UnsignedIntegerOutOfBoundExceptionがシグナれます

818 名前:デフォルトの名無しさん mailto:sage [2007/03/26(月) 18:52:17 ]
>>816
整数オーバーフローが発生した場合の動作は未定義

そもそもUINT_MAX==2^(sizeof unsigned)-1である保証もない

819 名前:816 mailto:sage [2007/03/26(月) 18:58:34 ]
>>818
分かりました
別の方法を考えてみることにします・・・

レスありがとうございました!

820 名前:デフォルトの名無しさん mailto:sage [2007/03/26(月) 19:31:05 ]
>>818
あれ、そうだっけ。
intとかの負数を含む型は、
オーバーフローは未定義だったのは規格で書いてあった覚えあるけど。
unsignedも未定義って書いてたっけ?
確か2^Nで余剰を取った結果になるって書いてたと思うけど。




821 名前:デフォルトの名無しさん mailto:sage [2007/03/26(月) 21:09:16 ]
>>816
規格では、符号なし整数の演算結果が範囲外になったときは範囲内に収まるまで
(その型の最大値+1) を足したり引いたりした値になるとされている。 ISO C 6.3.1.3

これにより ((unsigned int)-1) は常に UINT_MAX に等しいと言える。

822 名前:デフォルトの名無しさん mailto:sage [2007/03/26(月) 21:19:31 ]
UINT_MAX は-1よりも~0の方が好きだな
単なる好みの問題だけど

823 名前:デフォルトの名無しさん mailto:sage [2007/03/26(月) 21:21:05 ]
オーバーフローはバグの原因になるから理解するのはいいけど、
実際にプログラムに組み込むなよw

824 名前:デフォルトの名無しさん mailto:sage [2007/03/26(月) 21:44:31 ]
>>822
それって保証されてるん?

825 名前:デフォルトの名無しさん mailto:sage [2007/03/26(月) 22:00:58 ]
C90/C99ともにただ 0 とだけ書いた場合は (int)0 と等価なので
それを全ビット反転するわけだから -1 になると思うが

826 名前:デフォルトの名無しさん mailto:sage [2007/03/26(月) 22:01:46 ]
書き漏らした

int範囲で -1 になると思う

827 名前:デフォルトの名無しさん mailto:sage [2007/03/26(月) 22:02:27 ]
負数の表現方法は C の規格外。

828 名前:デフォルトの名無しさん mailto:sage [2007/03/26(月) 22:03:45 ]
~0Uだな

829 名前:デフォルトの名無しさん mailto:sage [2007/03/26(月) 22:12:28 ]
つまり、-1 が 0x80000001 な環境でも
(unsigned)-1 は 0xFFFFFFFF (が UINT_MAX とする)になるということか。

830 名前:デフォルトの名無しさん mailto:sage [2007/03/26(月) 22:15:01 ]
まぁそういうことだよな?
ただの -1 なら 0x80000001 で解釈されるけど
(unsigned)キャスト時はコンパイルでUINT_MAXに置換されるってことなんだろうか



831 名前:デフォルトの名無しさん [2007/03/26(月) 23:28:52 ]
VC++ 2005を始めました。
Byte単位でのファイル入出力はできますか?
ビギナー本には書いてないし、ネットでも色々探したのですが…。
エロい人、方法を教えてくだされ。

832 名前:デフォルトの名無しさん mailto:sage [2007/03/26(月) 23:34:42 ]
fread() fwrite()

833 名前:デフォルトの名無しさん mailto:sage [2007/03/26(月) 23:36:00 ]
fstream






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<200KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef