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


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

スレを勃てるまでもないC/C++の質問はここで 3



1 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:07:56 ]
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ
スレを勃てるまでもないC/C++の質問はここで
pc11.2ch.net/test/read.cgi/tech/1167476845/
スレを勃てるまでもないC/C++の質問はここで 2
pc11.2ch.net/test/read.cgi/tech/1178503366/

2 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:08:45 ]
sizeof(char)論争は隔離スレでやってくれ。

sizeof(char)が必ず1でも、省略すべきではない
pc11.2ch.net/test/read.cgi/tech/1187521586/

3 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:20:52 ]
わざわざスレ立てるなんてアホじゃねw

4 名前:前スレ980 mailto:sage [2007/08/19(日) 23:22:39 ]
>>前スレ983
フォロー thx

MSDNもあわせて読んでみた。
デバッグのmallocで余分に取られる領域を、デバッグのためというか
その一部をちゃんとオーバーフローに備えた領域として確保して
かつオーバーフローを検出してる、と。
だから、極端にオーバーフローしなければ、
デバッグ情報含めて正常に(?ん〜、落ちずに?)動作する、ということか。

980で書いた「食いつぶして」って言うのは、表現おかしいな。

5 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 00:18:08 ]
たとえば、
mallocが隙間なくメモリを割り当ててくると仮定すると、

char* s="ABCD" ;
for(int i = 0 ; i < 3 ; ++i ) {
p[i] = (char*)malloc(strlen(s)) ;
strcpy(p[i], s) ;
}
printf("%s", p[0]) ;

の結果は、
ABCDABCDABCD
になる。

とてつもなく長い文字列ができあがってしまい、
ヒープの残り容量よりも大きくなり、新たにヒープをこさえることになる。

6 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 01:31:04 ]
>>5
わけわかんねぇソースと理屈をたれんな

7 名前:デフォルトの名無しさん [2007/08/23(木) 20:41:03 ]
一言だけ言わせてください。TCHARなんて使ってるCプログラマはいません!

8 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 20:45:32 ]
使ってるよ。
お前がプログラマじゃないだけ

9 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 21:12:58 ]
>>7
Windowsは変なTypedefつかうくらいならTCHARでポインタ宣言したりしたほうがわかりやすいと思う。
LPCTSTRとかねぇ、もーわけわからん。

10 名前:デフォルトの名無しさん [2007/08/23(木) 23:18:15 ]
教えて君ですみません。
これから、WindowsのAPIのプログラミングを勉強しようと思っているのですが、
お勧め(必須)の書籍はありますでしょうか?
言語はC言語は多少つかえます。apiでのプログラミングに興味があります。

スレ違いかもしれませんが、ご存じでしたら教えてください。



11 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 23:21:30 ]
悪いことは言わん。
諦めた方がいい。

12 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 23:27:12 ]
>>10
推薦図書/必読書のためのスレッド 36
ttp://pc11.2ch.net/test/read.cgi/tech/1187699049/


13 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 23:28:39 ]
>>10
マルチ乙

14 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 23:29:04 ]
猫でもわかるWin32API

15 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 00:05:12 ]
>>10
ぐぐるさん

16 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 00:06:07 ]
>>10
C++/CLIに移行するとか。

17 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 01:34:20 ]
>>9
LPCTSTRって、const TCHAR * じゃんか。


18 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 01:44:04 ]
だからそう書いてんじゃねぇか

19 名前:ポポ [2007/08/24(金) 02:05:47 ]
プログラミングの問題なのですが
「n個のランダムデータを大きい順に並べるプログラムを作れ」
という問題がどうしても解けません。
誰か回答お願いします。

20 名前:宿題は宿題スレへ mailto:sage [2007/08/24(金) 02:09:22 ]
>>19
いやです。



21 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 02:10:34 ]
>>19
どうしても解けないんじゃないだろ
勉強サボってるから解けないんだろ

22 名前:883 mailto:sage [2007/08/24(金) 19:43:59 ]
どうしても解けないと分かっているならそれで良いじゃないか。

23 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 19:47:45 ]
あんた誰

24 名前:デフォルトの名無しさん [2007/08/25(土) 15:00:06 ]
void func03()
{
const size_t n = 10;
const int maxrand = 100;
srand(time(NULL));
int* pia;
pia = new int[n];
printf("input:");
for(int i = 0; i < n; i++)
{
pia[i] = rand()%maxrand;
printf("%d:[%d] ", i, pia[i]);
}
printf("\n");

qsort(pia, n, sizeof(int), func_big);

printf("output:");
for(int i = 0; i < n; i++)
{
printf("%d:[%d] ", i, pia[i]);
}
printf("\n");

delete[] pia;

return;
}
改行が多すぎて書き込めないんで比較関数は自分で考えてくれ

25 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 15:45:15 ]
かわいそうに。すでに解決済みだというのに・・・

26 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 15:53:04 ]
マルチってひどいな
しかも他所で解決した旨を書かない
ほんと最低だわ

27 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 16:18:03 ]
自分一人くらいプールの中で小便したって、水はさほど汚れないだろう

そういう考え方の人間がいるんですよ。ばっちいばっちい。

28 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 18:21:28 ]
#include <pstade/vodka/drink.hpp>
#include <ctime>
#include <vector>
#include <boost/random.hpp>
#include <pstade/oven.hpp>

template <typename T> boost::mt19937 make_mt19937(T seed)
{ return boost::mt19937( static_cast<unsigned long>(seed)); }
template <typename T> boost::uniform_smallint<> make_uniform_smallint(T min, T max)
{ return boost::uniform_smallint<T>(min,max); }
template <typename gen_t, typename dst_t>
boost::variate_generator<gen_t, dst_t> make_variate_gen(const gen_t& gen, const dst_t& dst)
{ return boost::variate_generator<gen_t, dst_t>(gen, dst); }

int main(int argc, char* argv[]) {
namespace oven = pstade::oven;
const int RND_MIN = 0, RND_MAX = 100, NUM = 10;
std::vector<int> v(NUM);
oven::generate(v,
make_variate_gen(
make_mt19937(std::time(0)), make_uniform_smallint(RND_MIN, RND_MAX) )
);
std::cout << "source:" << '\n';
PSTADE_OVEN_FOREACH (i, v)
std::cout << '\t' << i << '\n';
std::cout << "sorted:" << '\n';
PSTADE_OVEN_FOREACH ( i, v | oven::sorted )
std::cout << '\t' << i << '\n';
}

人様のライブラリに頼ると楽になるわぁ

29 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 18:26:39 ]
俺ならstd::vectorではなくstd::setを使う。
intなら比較関数オブジェクトを与える必要もなく、
rendからイテレータで舐めることで、ソート順をひっくり返す。

30 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 21:20:53 ]
うへぇ、確かにこの場合はそっちの方が楽そうだ



31 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 21:24:29 ]
rendではなくrbegin()な。

32 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 01:53:30 ]
これができたらC++について基本は押さえてるという基準になる課題とかないですかね?

33 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 02:46:12 ]
>>32
「Exceptional C++」という本の47の問題に適切な回答ができたら

ってのはどうよ。

34 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 04:32:11 ]
いやです。

35 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 09:35:37 ]
>>33
ありがとうございます。
その本チェックしてみますね。

36 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 18:20:18 ]
template <class T> void Show( T &data )
{
std::cout << data << std::endl;
}

この関数に引数としてunsigned charを入れると
文字として出力されてしまうのですが
なんとか数値として出力できないでしょうか?

int や doubleもこの関数を使うので表示するときにキャストは使えません。

ちなみにほんとの関数では配列をぶち込むので
関数に渡すときにキャストしたりもできません。

37 名前:デフォルトの名無しさん [2007/08/31(金) 19:48:05 ]
>>36
呼ぶときにキャストしたら?

38 名前:36 mailto:sage [2007/08/31(金) 19:56:31 ]
すまん。最後まで読む前に書いてしまった。
これでどうでしょう?
#include <iostream>
template <class T> void Show( T &data )
{
std::cout << data << std::endl;
}
template <> void Show( unsigned char &data )
{
std::cout << static_cast<int>(data) << std::endl;
}
int main(){
unsigned char a='a';
int b=3;
double c= 3.1;
Show(a);
Show(b);
Show(c);
}


39 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 20:07:29 ]
自己レスかよ

40 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 22:07:04 ]
以下のコード、VC++6.0では通るのにVC++2005では
error C2597: 静的でないメンバ 'TTest::axx' への参照が正しくありません。
というエラーが出てしまいます。なぜでしょうか?お助けあれ

struct TTest
{
int axx;
};
strict TParamItem
{
int TTest::* p;
int x;
};
class T2 : public TTest
{
public:
static const TParamItem KParamTable[];
};
const TParamItem T2::KParamTable[] = { { &axx, 10 } };

int _tmain(int argc, _TCHAR* argv[])
{
T2 t1;
t1.axx = 150;

printf("%d %s\n", t1.*(KParamTable[0].p), "test");
return 0;
}



41 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 22:18:26 ]
>>40
&TTest::axxと書けばいいはず。
VC++ 2005では規格への準拠度が上がって、
メンバへのポインタの取得に標準から外れる書き方を認めなくなった。

42 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 00:07:59 ]
>>41
できました…本当にありがとう!

43 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 01:07:46 ]
え?
staticなメンバ関数から、staticではないメンバ変数にアクセスすんな!
ってことでしょう。


44 名前:デフォルトの名無しさん [2007/09/01(土) 01:51:15 ]
あるプログラムの実行処理を速くしたいとき、どのようなことに
気をつけてコーディングすべきでしょうか?
アルゴリズム?メモリ管理?。
非常にアバウトな質問ですが教えていただけたらと思います。
みなさんはどのように意識して処理速度パフォーマンスを
向上されているのでしょうか。
もしも何か参考図書があったら教えてください。
Efficient C++を読みましたが、クラスの生成に気をつけることが
重点的に書かれていたような気がしました。

45 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 01:54:20 ]
気がしました。

46 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 01:55:49 ]
>>44
先ずは、動作の安定したしっかりしたプログラムを作ること。
勿論それは、速度向上のために今後修正されるのだからそれを考慮して読みやすく誤解の少ないものであるべき。
後は、適当なリビジョン管理ツールと速度評価ツールを用意し、格闘するだけだな。

47 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 01:57:38 ]
と書かれていたような気がしました。

48 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 02:38:14 ]
>>44
すでにあるプログラムの速度を改善したいのか
それとも
これから書くプログラムを速くしたいのか

速くしたいのはどれくらいか、
数割なのか、それとも桁違いなのか

それによって答えは違ってくるよ。


49 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 02:42:29 ]
と書かれていたような気がしました。

50 名前:44 [2007/09/01(土) 09:52:47 ]
みなさんおはようございます。
すでにあるプログラムの速度を改善したいと思っております。
速くしたいのはどれだけ、というのは難しくとにかくできるだけ
処理時間を短くしたいと思います。

そのようなコーディングの”コツ”を未熟ながらわかっておりません。
ですので、相談させていただきました。



51 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 09:58:26 ]
まずはプロファイラで何回も実行される部分を見付ける。
そこが最も実行時間上ネックになっているところだから、
そこを重点的に高速化する。80:20の法則。

52 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 10:23:55 ]
>>51
最初は、実行回数よりも、実行時間の合計が大きな関数を見つけるほうがいいと思う。
ミクロな最適化して速度を稼ぐのは、後からでもいい。


53 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 10:33:26 ]
>>52
うるせーバ〜カ

54 名前:48 mailto:sage [2007/09/01(土) 10:40:57 ]
>>50
> 速くしたいのはどれだけ、というのは難しくとにかくできるだけ

達成すべき目標が与えられていないのなら、現状を目標にしてしまえ。
何もしなくても目標達成だ。おめでとう。

「とにかくできるだけ」つまり速度無限大が目標なら、
それを実現するためのコストも無限大が必要だ。
ということは、
自分でやらないで金を出してプロを雇ったほうがいい。

まぁいいや、桁違いに速くしたい、ということだと解釈しよう。

処理時間の大半を占めている部分について、
データ量Nに対して処理のオーダーがNのX乗になっている部分を探し、
よりオーダーの小さいアルゴリズムに変更する。
下手なプログラムなら、これで桁違いに速くなる。

55 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 10:41:52 ]
>>53
心が寂しいんだね。同情するよ。

56 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 10:53:11 ]
>>55
同情するな金をくれ!

57 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 10:56:55 ]
>>56
同情ってことは、俺も心が寂しいってことだ。
だから金はやれない。

あの安達祐実のセリフは日本語として間違っている。
「同情するなら〜」ではなく、「哀れむなら〜」のほうが意味としては適切かと。インパクトないけどね。

58 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 11:06:12 ]
もう少し日本語を勉強したほうが良いと思うよ・・・

59 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 17:44:33 ]
gcc -O2 hoge.c

60 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 11:33:14 ]
まあ、この書き込みもみたくねぇって言われるのは承知の上で、

なんでここ、IDでないの?
こんなウザイ書き込みIDNGワードにしてしまいたい。



61 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 11:39:07 ]
>>60
死ね

62 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 23:00:16 ]
たった一言で誰だか分かってしまうこのクォリティw

63 名前:44 [2007/09/04(火) 00:45:27 ]
返事がすごく遅れて申し訳ありません。アドバイスありがとうございます。

>データ量Nに対して処理のオーダーがNのX乗になっている部分を探し、
>よりオーダーの小さいアルゴリズムに変更する。
オーダーがNのX乗になる部分の探し方がわからないです。
まずはぐぐってみます。

そして、実行時間、実行回数が多い関数を探し出し(プロファイル使用。
使用したことはないのですが・・・)、その部分のより適した
計算方法を検討することを行ってみます。

大体このような流れでみなさんも処理時間の短縮を図っているのでしょうか?



64 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 00:56:30 ]
わかりやすいボトルネックは二重ループしてるところとかかな。
でもループ内から呼び出した関数の中で別のループをしてるような一見わかりにくいものもある。
ま、プロファイラを使えば簡単に見つかるだろうけど。

65 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 03:04:58 ]
>>63
> オーダーがNのX乗になる部分の探し方がわからないです。

データ量Nを10倍にしてみて、実行時間が100倍になれば2乗、1000倍になれば3乗。


66 名前:65 mailto:sage [2007/09/04(火) 03:08:06 ]
言葉が足りなかったかも。

プログラムを見て探すのではなく、
実際にプログラムを走らせてみて、
実行時間の変化を見るのです。

10倍だと極端かもしれません。
2倍とか3倍とか適当に試して。


67 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 05:00:10 ]
C++の演算子の
.*
->*
は、どういう時に、どのように使うものなのですか?

68 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 05:18:11 ]
(構造体).(構造体のメンバ)
(構造体へのポインタ)->(構造体のメンバ)

69 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 07:47:22 ]
メンバポインタのようにも見える
→ *

70 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 12:43:16 ]
メンバポインタだな

X x, *p;
int X::*m;
というのがあったとき、

x.*m = 1;
p->*m = 2;
このように使う



71 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 23:53:45 ]
クラスのメンバに、
自分自身を破棄してメモリを解放する関数って作れるのでしょうか?
例えばこんな感じです。

void destroy(){
DELETE(this);//インスタンスを破棄してメモリ解放する関数
}

72 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 23:56:10 ]
そうすると静的に作ったインスタンスの扱いはどうなるの?
インスタンスが有効かどうかを保持するフラグをメンバ変数に持たせておく、
ぐらいの解決方法が一番な気がする。

73 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 23:56:36 ]
delete this;

当然newしたものである必要がある。

74 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:08:48 ]
newで作ってないインスタンスはdeleteで消せないんですね。

Javaしかやったことがないので、メモリ解放がイマイチ馴染まず、
できるだけ意識せず簡単に消せる作りにしたいんです。
メソッドのスコープ抜けたり、参照外れたりしたら、
勝手に解放されるとかいう風に作るのは無理でしょうか。

75 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:15:31 ]
つ[スマートポインタ]

76 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:22:07 ]
>>74
そもそもnewする必要がないものをわざわざnewして作ることもないと思うが。

77 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:23:59 ]
>>75
stdっていうのが無いので使えませんたぶん…
>>76
もしかしてnewで作らなければ、メソッドのスコープ抜けたとき勝手に破棄されるんでしょうか。

78 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:25:26 ]
>>77
される(それはJavaと同じ)。
てか、まずは試してみたらどうだろう?

79 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:27:27 ]
スタックとヒープの区別すらついていないとは…まるで知性を感じませんよ

newで作ったやつ…関数抜けても消えない。ヒープに取るから
ローカル変数…関数抜けたら消える。以降は使用不可


80 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:33:04 ]
スタックとヒープなんとなく違いが分かりました。
確かに知識不足ですね。まだ始めたばかりなんで勉強してみます。



81 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 07:06:58 ]
>>77
ないならば、用意すればいい。

テンプレートが使えるコンパイラなら、
boost::scoped_ptrやboost::shared_ptrが使える。
もちろん外部のライブラリ使用禁止なら、
適当に名前空間を変えて自己責任で使えばいい。
そんなに複雑なものでもないし。

82 名前:67 mailto:sage [2007/09/05(水) 08:31:06 ]
>>69-70
ありがとうございます。

これはエグい機能ですね。
どうりで今まで使いみちが理解できなかったわけです。

これを使うべき場面というのはあるのでしょうか。


83 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 09:11:26 ]
>>71
C++に不慣れなうちは、delete this するようなクラスを作るのは、やめたほうがいいと思う。
なぜなら、delete this は、どうしてもそれが必要な特別な場合だけに限定すべきだから。

どうして、自分自身を破棄するようなメンバ関数が必要なの?
もっと適切で良い方法を教えられるかも。

84 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 10:45:08 ]
>>82
メンバ関数ポインタ でぐぐると使用例がいくつかヒットするかもしれない。
まぁでも滅多に使うもんじゃない。

85 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 11:21:37 ]
直接メンバへのポインタには触れないけど、
mem_fun(やboost::bind)の中で使っているんだろうなとは思う。

86 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 22:29:14 ]
>>83はもしかしからデストラクタを呼びたいのかも。


87 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 22:30:20 ]
>>83じゃねえや>>71だな。

88 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 13:10:16 ]
関数の引数で、
読み取りのみで変更を行わないものは、

void hoge(const Type& o) ;
void hoge(const Type* p) ;

どう使い分けるべきなのでしょうか。

89 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 13:19:56 ]
常に前者。

ただし、配列の要素を指すポインタを受け取るのであれば、
要素数を示す引数を追加した上で、ポインタを使う。
しかし、イテレータで済むならそっちを使う。

90 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 15:59:14 ]
なぜポインタではなく参照を使うのでしょうか。




91 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 16:04:27 ]
void hoge(const Type& o) ;
だったら引数にNULLを設定した場合、コンパイル時にエラーが分かるから。

ついでに
void hoge(const Type* o) ;
だと常にNULLチェックが必要、そうしないと実行時にどんなエラーが起こるやら。

ちなみにNULLがありえる場合は後者を使う。

ちなみに、ここでいうNULLとは
Type* p = NULL; hoge(p);
のことではなく
hoge(NULL);
のことですぅ。念のため補足




92 名前:デフォルトの名無しさん [2007/09/08(土) 16:58:52 ]
C++で色々なプログラムを作りそのときの考え方を示し
実際にどのようにして作るのか解説してくれる本はありませんか?

93 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 17:25:48 ]
88です。

ポインタの安全ではない部分を解決するために、C++で参照が導入されたのだから、
参照を使ったほうがいい、ということですね。

94 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 00:30:37 ]
>>91
NULLで参照がエラーになるのはNULLだからじゃなくて型が違うからだろ。

95 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 01:14:54 ]
>>94
>>91はそういう話をしている。何も間違ってない。

96 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 01:46:04 ]
>>95
>>91の書き方はからは読み取れない。
補足も意味不明。

97 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 01:51:34 ]
日本語でおk

98 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 01:55:28 ]
>>97
日本語じゃなくてC++が分かってないんだろ。

99 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:00:32 ]
何や此奴俺初めて書き込んだのに

100 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:03:39 ]
91の言いたいことはわかるが、
説明がいまいちだったな。



101 名前:デフォルトの名無しさん [2007/09/09(日) 02:23:37 ]
94の言いたいことはわからないし、
人としていまいちだったな。

102 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:29:00 ]
>>91 のポインタだと常にNULLチェックが必要ってのも素人くさいな。

103 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:32:35 ]
>>102
まぁその辺は宗教入って来る話な気もするし、無しにしようや。

104 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:32:52 ]
>>91
補足は、hoge(p); でなくて、hoge(*p); だよな。

hoge(p);とhoge(NULL); なら、どっちも参照ならエラーだし、ポインタならエラーにならないし。


105 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:45:13 ]
>>103
宗教って言うと「常にNULLチェックする」ほうにも理があるみたいじゃん。

106 名前:デフォルトの名無しさん [2007/09/09(日) 04:51:23 ]
今BCCを使ってC言語の勉強をしていますが何かアプリケーションを作製したいときってどんなソフトがいりますか?

107 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 04:52:58 ]
>>106
VisualC++

108 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 04:54:27 ]
>>107 ありがとうございます!

109 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 07:18:46 ]
>>106
107は、あなたをからかっている。

BCCでもアプリケーションは作れるが、
便利で強力な道具を使えば手間が省けるというもの。

どのようなアプリケーションを作りたいの?

110 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 07:44:59 ]
>>109 メーラーです。複雑な機能は抜きとしてメールサーバーからメールを取ってくるというものです



111 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 07:58:30 ]
GUIとCUIどっち?

112 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 08:02:49 ]
GUIです。最低限の機能としてメール受信送信それと閲覧ができれば。

113 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 08:21:34 ]
じゃぁ、C++Builder


114 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 09:35:15 ]
>>112
何故作りたいの?
一発で巧く動くものが作れればいいけどそうでなければメールサーバに迷惑を掛けることにもなりかねないし、
何より便利なメールソフトが腐るほどあるのに。

115 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 09:37:33 ]
>メールサーバに迷惑を掛けることにもなりかねない

ここには同意だが、なぜそんなにもやってみようという気持ちをくじくようなことを言うのか。

116 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 09:57:01 ]
どうせやるなら、そこらに無いものを作ろうよ。


117 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 09:57:54 ]
>>114
言語の話とはズレるけど、メールサーバを自分で立てるという発想は無いのか?

118 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 10:05:25 ]
>>105
ある。
例えばバグの早期発見と原因分析に役立つ。

119 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 10:34:43 ]
NULLポインタに何か意味があるならともかく、
そうでないなら、
NULLチェックなんてするとバグを見落とすことになる。

デバッグ中は、
NULLチェックせずに例外で落ちたほうがマシだと思うよ。

120 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 10:53:18 ]
>>119
そういうのを含めてNULLチェックというんでないの?
NULLに対し何らかの処理が必要という意味で



121 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 10:56:34 ]
>>104
Type* p = NULL;
のあとに*pとかやったら関数とか関係なく落ちるだろ…それもコンパイル時には分からん品

122 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 11:20:55 ]
>>120
ふつ〜NULLチェックといったら、
NULLでないことを確認してからポインタの指す先を触り、NULLの場合はエラーとしてfalseを返す
だろう。

正しくエラー処理していて堅牢に見えるけど、かえって、バグを抱えたまま、それらしく動いたりするのよ。

123 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 11:25:27 ]
>>119
例外で落ちるってWindowsのメモリアクセス違反例外のこと?
さておき。

単にセグメンテーションフォルトされたら、
落ちた位置とか原因とか分かり辛くなるじゃん。
現象が再現するとも限らないし、
テスト環境に開発環境があるとも限らないし。

異常発生後も動くのが嫌ならNULLチェックで
例外投げるなりexit()するようにしたら良いよ。
少なくともログ出せない落ち方よりログ出せる落ち方のが良いと思う。


そいえば。
Linuxとかでcore吐いてたら、まだコールスタックやら拾えるかなぁ。
VCとかにもそういうのあるの?

124 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 11:52:27 ]
>>123
Windows限定ではないけど、いまどきのリッチな環境向けのOSなら、
NULLポインタの指す先にアクセスしたら、OSが待ったをかけてくれると思う。
メモリ保護がないハードとかは・・・別の話にしてほしい。

Windowsローカルの話だと、Dr.ワトソンというログ記録ツールが、OS標準搭載されてる。
メモリアクセス違反をやらかした場所のコードを逆アセンブルし、レジスタとスタックの状態を
テキストファイルで保存してくれる。設定でプロセスのメモリイメージのダンプも可能。
下手にハンドルして貴重な情報をログに残さず捨ててしまうくらいなら、これを使ったほうがいい。

まぁ普通は、開発環境が入っているPCでテストしている最中に問題を見つけるし、
逆に言うと、その段階で問題を見つけられるようにテストすべきだから、
メモリアクセス違反をやらかしたらデバッガをアタッチすることになるかと。

自分は使うに至ったことないけど、リモートデバッグもできるとのこと。
これなら、リモートデバッグ用のエージェントだけをターゲットマシンに
インストールすればいいので軽い。

125 名前:124 mailto:sage [2007/09/09(日) 12:04:27 ]
捕捉

逆アセンブルされたコードを見ても、C/C++のソースの該当箇所がわからないとダメなので、
コンパイルするときに、ソースコード付きでリスティングファイルを出力
リンクするときに、mapファイルを出力
んでもって、これらを生成されたバイナリとセットでしっかり管理する。


126 名前:デフォルトの名無しさん [2007/09/09(日) 12:44:44 ]
データへのポインタpDataを取得する関数が、
こんな感じで定義されているのですが、
long GetData( void*& pData )
「*」と「&」が並んでいるところのわけがわかりません。
void*& pDataのところは「*」がpDataのポインタをさしていて、
「&」はその参照を受け取る、というようなことなんでしょうか。
自分の持っている初心者向けの参考書には「参照には*をつける必要はない」と
書いているのですが…。

127 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 12:57:45 ]
int &x
bool &y
void* &pData

128 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 12:59:01 ]
>>126
たとえば、
typedef void* VOID_PTR ;
としたならば、
long GetData(VOID_PTR& pData )
と同等。

仮に参照を使わなければ、
long GetData(VOID_PTR* ppData )
long GetData(void** ppData )
かな。

129 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 14:32:38 ]
"voidポインタ"型の参照 と思え
それがよくわかるように>>127みたいに書くのを俺はすすめる
(int* a, b; ってできないから困るが。)

130 名前:デフォルトの名無しさん [2007/09/09(日) 14:55:46 ]
質問です。
 stl::listやstl::queueなどを複数のスレッドから操作
(push_back()やpop_front()など)する場合ミューテックスで
ロックする必要があるのでしょうか?
 それとも元からスレッドセーフになっているのでしょうか?



131 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 15:38:10 ]
VC++の場合はロックする必要がある
msdn2.microsoft.com/en-us/library/c9ceah3b(VS.80).aspx

gccの場合もロックする必要がある
gcc.gnu.org/onlinedocs/libstdc++/faq/index.html#5_6

他の実装でもたぶんロックする必要がある
あと stl:: っていう名前空間はないと思うが

132 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 16:30:35 ]
>>130
もしWindowsなら、Mutexよりも、CriticalSectionを使おう。

念のため言っとくけど、
STLのコンテナのメンバ関数を1つ呼び出す直前・直後でロックするのはダメよ。
iteratorやコンテナ内のオブジェクトへのポインタの有効期間を考えて、適切な範囲でロックすべし。

133 名前:デフォルトの名無しさん [2007/09/09(日) 17:01:58 ]
>>131
>>132
ありがとうございます。参考になりました。(英語はあんまり読めないけど。)
コンテナのメンバ関数内で勝手にロックされるわけではないのですね。

>>131
std::の間違いでした。

134 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 19:49:57 ]
>>114 何故?といわれましても別に仕事でもなく学校の課題でもないのですが個人的に作りたいと思いまして・・・
     サーバーに関しては知り合いの許可をもらいやるので大丈夫です

135 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 19:59:33 ]
テスト用のメールサーバくらい、VMwareとかVirtualPCとか使って、Linuxで適当に立てればいいじゃん。
通信するプログラムの場合、自分側だけでなく、相手側もデバッグモードにしたり、ログをチェックしたりするよ?

136 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 20:09:18 ]
>>135 ありがとうございます。ちょと調べてみます。

137 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 20:13:29 ]
パケットモニタも用意しよう。
暗闇を照らすものは多ければ多いほどいい。

138 名前:デフォルトの名無しさん [2007/09/09(日) 21:57:47 ]
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int
main()
{
int sock0;
struct sockaddr_in addr;
struct sockaddr_in client;
int len;
int sock;

sock0 = socket(AF_INET, SOCK_STREAM, 0);

addr.sin_family = AF_INET;
addr.sin_port = htons(12345);
addr.sin_addr.s_addr = INADDR_ANY;

bind(sock0, (struct sockaddr *)&addr, sizeof(addr));

listen(sock0, 5);



139 名前:デフォルトの名無しさん [2007/09/09(日) 21:58:48 ]
while (1) {
len = sizeof(client);
sock = accept(sock0, (struct sockaddr *)&client, &len);
write(sock, "HELLO", 5);

close(sock);
}

close(sock0);

return 0;
}


364 名前:デフォルトの名無しさん[] 投稿日:2007/09/09(日) 21:48:41
このプログラムは複数のクライアントと接続するサーバプログラムらしいのですが
なぜ複数のクライアントと接続することができるんですか?
実際、このプログラムはどのように動作するんですか?

まず、listen(sock0, 5);で接続受付状態になって停止して
接続を受け付けたらwhile以下を実行するんですよね?

140 名前:デフォルトの名無しさん [2007/09/09(日) 22:00:34 ]
コピペ?



141 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:03:03 ]
すいません
聞く場所を間違えたのでここにコピペしました

142 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:11:19 ]
>>121
だから>>91が意味わからんって言ってるんじゃないの。
「補足」どの部分の何を補足してるつもりなのか、意味がわからん。

143 名前:140 [2007/09/09(日) 22:17:53 ]
>>141
すまそんとりあえず分かる範囲で…
listen関数の第2引数は待ち受けの数を表し、
複数のクライアントからの接続要求を待つようです。

144 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:32:27 ]
>>143
このプログラムでは待ちうけ数が5であるということは
接続要求が1つ来たらコードのlisten以下に処理が移るということですよね?
このときの待ち受け数は4でこのプロセスはwhile内部の処理を行う
そして、closeしたら待ち受け数が5になる
以下接続要求が来るごとにそれぞれのプロセスがlisten以下をcloseされるまで
実行するということですか?

かなり日本語がおかしくて申し訳ないです

145 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:42:01 ]
違う。
listenは5つ分の接続要求を貯めるキューを作ってポートを開くだけ。

acceptで実際に接続が来るまで待ち、接続が来たらacceptから下にいく。
クライアントにHELLOを送って、接続を閉じて、またacceptで次の接続を待つ。

146 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:47:06 ]
待ち受け数とかプロセスとか妙な言葉を使ってるけど、別に複数のプロセスが立ち上がるわけでもないし、同時並行的に5つの接続を捌けるわけでもない。
listenに指定する5っていうのは、プログラムの処理が追いつかなくてクライアントをどんどんacceptするのが追いつかないときに、OSが裏で5つまで接続要求を貯めておけるだけ。
6つめが来るとクライアントは接続拒否される。

147 名前:140 [2007/09/09(日) 22:47:45 ]
ソケットは扱った事が余り無いのでなんとも言えませんが
その通りだと思います。

また、複数の接続要求(この場合だと5以下)が来た時は、
待ち行列に置かれアクセプト待ちに
越えると無視されるようです。

つ UNIXネットワークプログラミング入門 雪田修一 著

買ったは良いが今日まで読む機会が無かったありがとう…orz

148 名前:144 mailto:sage [2007/09/09(日) 22:54:48 ]
>>145
>>146
並列的に処理をするものとばかり・・・
実際は処理を行っているのは1つだけであとはためておくんですね
listenで停止する(待つ)のではなくてacceptで停止して接続を待つんですね

149 名前:144 mailto:sage [2007/09/09(日) 22:59:27 ]
あともうひとつ聞きたんですがlen = sizeof(client)という処理を行っているんですけど
この時点でclientには代入などが行われていないのでこのような処理を行うことは
出来ないと思うのですが?

150 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 23:08:02 ]
代入してなくても、その変数のサイズ (つまり sockaddr_in 構造体のサイズ) くらいはわかる



151 名前:144 mailto:sage [2007/09/09(日) 23:09:28 ]
>>150
ああそういえば・・・

色々答えていたただいてありがとうございました

152 名前:140 [2007/09/09(日) 23:32:37 ]
#include <sys/types.h>
#include <sys/socket.h>

int accept(int s, struct socketaddr *addr, socklen_t *addrlen);

s…ソケットに結びついているディスクリプタ
addr…ユーザプログラムの責任でアロケートしたアドレス格納用バッファへのポインタ
addrlen…socklen_tへのポインタ

よって
struct sockaddr_in client;
とあるので
第2引数にはclientのポインタが…
&client
第3引数にはアドレス用バッファのバイト数が入ります。
int len = sizeof(client);

はぁ、もう寝よ…

153 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 00:04:13 ]
おやすみ。

明日からは
ネットワークプログラミング相談室 Port20
pc11.2ch.net/test/read.cgi/tech/1186418855
へどうぞ。

154 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 00:11:46 ]
(struct tm)* now;

と書いてもキャストだと思わず「struct tm型」のポインタだと思ってくれるコンパイラない?

155 名前:デフォルトの名無しさん [2007/09/10(月) 17:26:31 ]
今度、就職するときにC,C++を勉強しなくてはいけないのですが
オススメの教習本ってありますか?

156 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 17:46:15 ]
Boostのドキュメント

157 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 18:19:54 ]
>>155
参考書スレがあるから、そっちを読んだほうがいい。

とりあえず自分からアドバイスできるのは、
・文法だけ理解しても、使いこなすことはできない
・世の中、良書もあれば、ろくでもない本もある。とくに後者の罠は引っかかりやすい。
ってこと。

文法を解説する本だけでなく、
使いこなし方を解説する本も読もう。

C++の使いこなし入門としては、
Effective C++
Effective STL
この2冊をお勧めする。

本の値段は安くないが、値段の10倍の価値はある。
少なくとも自力で悟りを開くよりは、遥かに近道だ。

158 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 22:00:27 ]
質問です。実行中のプログラムにコマンドラインから設定を渡すにはどうすればよいでしょうか?
これは、実行中のプログラムがコマンドラインを監視するのではなく、
2重起動時にパラメータだけ渡されるようなイメージです。

お願いします。

159 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 22:09:32 ]
先に起動した方は何かの通信手段でデータを受信できるように待機しておいて、
後に起動した方はその通信手段でコマンドライン情報を送信する。

160 名前:158 mailto:sage [2007/09/10(月) 22:12:35 ]
>>159
共有メモリ/Socket以外の方法で可能なら、それを教えてください。
へたれですいません。お願いします。



161 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 22:16:50 ]
なぜ共有メモリやらソケットがイヤなのかその理由を書かないと、何か提案しても、やっぱりそれもイヤとか言われる予感。
あと、ANSIの範囲外の話は、OSの種類を書いてください。

162 名前:158 mailto:sage [2007/09/10(月) 22:23:09 ]
>>161
上記以外の方法で、より簡単な方法があればそれで行きたいからです。
規格はANSIで。Winだったらメッセージ使うんですが。

それと、上記の方法がいやな理由は以下の通り。
・共有メモリ -> 保守/拡張がめんどい
・ソケット -> プログラム規模が大きくなるからめんどい

よろしくお願いします。

163 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 22:26:45 ]
ANSI ではプロセス間通信の方法は fopen で同じファイルを読み書きする以外にありません。 終わり。

164 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 22:31:25 ]
ちなみに共有メモリもソケットも ANSI には無いものですから 残念

165 名前:158 mailto:sage [2007/09/10(月) 22:44:57 ]
>>163, 164
ANSIではファイル以外にはないですが・・・どうもです!
共有メモリってANSIではないのですね。勉強になります。
ソケットはそうですね。OS依存で言語使用ではないですね。仰るとおり。
ご丁寧にどうも!

166 名前:やおい [2007/09/10(月) 23:49:58 ]
typedef unsigned long dword;
typedef unsigned char byte;
typedef union _struct{
byte data[12];
struct test_bit{
dword program_info_length :12;
dword flag_4 :4;
dword PCR    :13;
dword flag_3  :3;
dword last_section_number :8;
dword section_number    :8;
dword current_next_indicator:1;
dword version_:5;
dword flag_11:2;
dword program_number :16;
dword section_length:12;
dword falg_2_ :2;
dword flag_0:1;
dword testdata :1;
dword table_id :8;
}bit;
}header_type;


167 名前:やおい mailto:sage [2007/09/10(月) 23:50:47 ]

上記のようなビットフィールド構造を作ってdata配列に値を入れて共用体のメンバから
欲しいビット値を手に入れると言ったプログラムを作ってます。
上記の様に定義してprintfで出力し一つ一つ確認を行ったところ
dword program_number以降に入るデータが期待する値と違うものが入ってしまいます。
共用体で切った容量と、構造体で切った配列は同じ大きさだと思うのですが・・・何故こんな
事が起こるのかわかりません・・・。

ちなみに dword program_number :16;の部分を
>dword program_number1 :8;
>dword program_number2 :8;
で二つに分けるとprogram_number以降も正しくデータが入りました。

原因が分かる方が居ましたら是非、お願いします。

168 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 02:41:37 ]
質問です。
char* foo(){
return new char[50];
}
という関数があって、戻り値をdeleteしたいとき、
char* buf=foo();
delete buf;
でよいの? delete[]にできなくて気持ち悪いんだが。
char[] foo(){ とか書けないし。

169 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 04:32:34 ]
>>168
普通にdelete[] bufと書けばいいのでは?

170 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 07:24:39 ]
最後Enterを押すまでウィンドウを閉じないようにしたいのですがどうすればいいですか?



171 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 07:50:08 ]
>>170
止めたいところで getchar();

172 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 08:05:49 ]
テキストファイルを読み込んで指定した文字が何個含まれるかを出力するプログラム
を作りたいと思いこんな感じで書いてみたんですが、stringで宣言したbufファイル
はstrstrでは使えないみたいで困ってます
他に何かいい方法ありませんか?


  int count=0;
  string buf;
  while(getline(test, buf)) {//読み込んだテキストファイル(test)を1行ずつbufにコピー
    if(strstr(buf,"test")!=NULL)//もしbufにtestという文字があれば
     count++;
  }
  out<<cout<<endl;//out.textに何個あったか書き出す

173 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 08:15:30 ]
C++は知らない俺の案

 string buf → char buf[1024]

としてgetlineではなくfgetsを使う。
ただしstrstr(buf,"test")とするといつまでも一個めの"test"に引っかかるので、

 char* start;
 while(...){
  if((start=strstr(buf,"test")) != NULL){
   count++;
   start++;
   //startを"test"の先頭の次、つまり'e'を指すようにして、次回同じ"test"にひっかからないようにする
  }
 }

などとする

174 名前:173 mailto:sage [2007/09/11(火) 08:17:23 ]
追加

stringを使うにしても何にしても while の中でもう一個ループ組まないと一行に2回以上"test"があっても1回しか数えてくれないよ

175 名前:173 mailto:sage [2007/09/11(火) 08:20:43 ]
たびたびすまん

if((start...) != NULL) じゃなくて while((start...) !=NULL) だ。

176 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 08:23:33 ]
>>172
strstreamとか
strstreambufとかを調べろ

177 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 08:27:49 ]
>>170
話を端折りすぎ。

何のために?
誰が作ったウィンドウを?
さっぱりわからん。

178 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 08:34:11 ]
>>172
buf.find("test") != std::string::nposか、
std::strstr(buf.c_str(), "test") != NULL

でも、これだと1行に2個以上あったときにまずくないか?

179 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 08:52:37 ]
C言語らしく。

まずは、ある文字列が1行に何回出現するのかカウントして返す関数を作るべし。
その後に、1行読んでは、出現回数を積算するループを回すべし。

180 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 08:53:48 ]
>>173
おいおい、間違いすぎだろ。それから、startを更新しているのに使っていないぞ。
それに、strstr()でマッチしたときにstartはstrlen()分進める方がよくないか?



181 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 08:58:49 ]
>>171
ありがとうございます。うまくいきました

182 名前:やおい mailto:sage [2007/09/11(火) 09:09:19 ]
>>166-167
この問題についても分かる方居ましたら是非お願いします・・・。



183 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 09:15:37 ]
ビットフィールドの配置なんて処理系依存なんだから、
まずはお前が何のコンパイラを使っているか書かないと始まらない。

184 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 09:29:07 ]
>>182
フィールド幅が16だから、16ビット境界(2バイト境界)に配置されたと思われ。
pragma packかなにかでスタブ0にしてやれば間が埋まって想定どおりになるかと。

それはさておき、ビットフィールドに於いて、整数型の幅は意味がないので
dwordなんて書かれると却って混乱する。signed/unsignedと書いておくことお勧め。

185 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 18:36:31 ]
C言語で何かアプリケーションを作成したい時、ソフトは何を使えばいいですか?
GUIの物を作ってみたいのですが。
ちなみにOSはWindowsXPを使っています

186 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 18:39:25 ]
VC

187 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 18:54:21 ]
Visual C++というのでいいのでしょうか?

188 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 18:57:53 ]
VC#

189 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 18:59:44 ]
>>185
C++ではなく、Cで?
それはまた酔狂だな。

VisualC++なんていらない。
BCCでも、PlatformSDK付属コンパイラでも、何でもいいよ。

190 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 20:27:52 ]
何でも良いけど強いてというならVisualC++で、コンパイラオプションを設定してCとしてコンパイルすれば良い。



191 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 21:45:11 ]
VC++6.0なら拡張子を .c にしとけば勝手にCだと思ってくれるよ

2005は知らね

192 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 22:21:48 ]
2005もだけど

193 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 23:47:52 ]
ありがとうございます。それを取って使ってみようと思います。

194 名前:やおい mailto:sage [2007/09/14(金) 00:03:55 ]
>>183-184
遅くなってすみません。
返信ありがとうございました。

言われた通りpragmaを使って挑戦したいと思います。
ビットフィールドって処理系に依存していたんですね。
その編の事も含めて初めて知りました。

ちなみに使っているのはVisual C++6.0です。



195 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 01:47:52 ]
ファイルがあって先頭にHEADERがついています

-------

○○○
○ ○ ○

以下必要な部分…1万行以上
--------

先頭部分が6行くらいで一定で続いていて
その後の必要な部分はRGB値がこの順番で入っています

この形式のファイルを1000個くらい連続で読み込む必要があるのですが
こういう作業をしたことが無いので、ヒントやどういう風にやればいいのか教えてください。

先頭6行分を飛ばして、あとをfscanf(%f)なんかで読めるといいのですが…

196 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 01:57:15 ]
>>195
固定長ならfseek()でスキップ、可変長ならfgets()で空読み

197 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 13:28:35 ]
>>195
ヒント
同じような処理をしているプログラムのソースを見る。
unix系には、画像のファイル形式で、テキストなのがあったと思う。

ていうか、あなたのは、まさに、それなんじゃないか?
ファイルの拡張子なんだい? それで検索すれば見つかると思うぞ。

ちなみに、学校の宿題っぽいな。

198 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 19:43:59 ]
PPMやBMPならばfgetsでヘッダーを全部とばして、そのあとfreadすればOK.

199 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 21:13:03 ]
>>198
ハァ?

200 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 23:32:55 ]
>>199
pbmのtypoだろ。察してやれよ。
# だとしたら、pgmの立場がないけどねw



201 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 02:07:32 ]
C++のmutableは、どういう時に使うものなのでしょうか?

202 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 02:10:41 ]
例えばこういうとき。

class MyObject {
mutable int hashcode_cache;
public:
int hashcode() const {
if(hashcode_cache == 0) {
hashcode_cache = なにかすごい複雑な計算;
}
return cached_hashcode;
}
};

203 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 02:48:03 ]
なるほど。

ありがとうございます。

204 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 03:51:04 ]
void foo(int *ar){
printf("%d",ar[2]);
}

void main(){
int array[2][2] ={{0,1},{2,3}}

printf("%d",array[0][0]); //a
printf("%d",array[0]); //b
printf("%d",array[2]); //c
foo(&array[0][0]); //d
}

上のaは0が表示、
bはa[0][0]のアドレスが表示され、
cは配列の範囲外参照になる、で合ってますか?
(cのarray[2]でarray[1][0]が表示されたりはしませんよね?)
そしてdですが、やはりこれも範囲外参照、ということになりますか?

どうにかして二次元配列を一次元扱いすることはできませんか?

205 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 08:24:29 ]
>>204
int * p = & array[0][0];
for (int i = 0; i < sizeof(a); ++i) {
printf("%d\n", p[i]);
}

206 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 08:42:46 ]
C++でもおkってんならboost::multi_arrayを導入するのを考えてもいいよ
って僕の隣のboost厨がいってます

207 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 15:42:16 ]
>>205
環境が整い次第、それで試してみます。
二次元配列はそれぞれの列(行?)が連続的に配置されているとは限らない、とどっかに書いてあったので、
それを鵜呑みにしていました……。
ということは>>204のdはarray[1][0]を表すということですよね。
それならなんとかなりそうです。
ありがとうございます。

>>206
C++は今はちょっと……
答えてくださりありがとうございます。

208 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 16:27:40 ]
>>207
>ということは>>204のdはarray[1][0]を表すということですよね。
いいえ。関数内でアクセスしているのは、array[1][0]ですが。

209 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 17:21:40 ]
>>207
隙間なく連続しているとは限らないというのは、正しい。


210 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 18:12:53 ]
>>207
>二次元配列はそれぞれの列(行?)が連続的に配置されているとは限らない、とどっかに書いてあったので、
いいえ、それが二次元配列として定義されたものなら連続しているはずです。



211 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 15:58:38 ]
#include <stdio.h>
#include <stdlib.h>
void dary(int *ary,size_t n);
void pary(int *ary,int *aryeof);
int main(){
int ary1[100] = {0};
int ary2[10][10] = {0};
int i,j,*temp;
dary(ary1,100);
pary(&ary2[0][0],&ary2[9][9]);
for(i = 0,j = 1; i < 100; i++,j++){
printf("%-3d ",ary1[i]);
if(!(j%10)) putchar('\n');
}
for(temp = &ary2[0][0],j = 1; temp <= &ary2[9][9]; temp++,j++){
printf("%-3d ",*temp);
if(!(j%10)) putchar('\n');
}
return 0;}
void dary(int *ary,size_t n){
int i = 0;
for(i = 0; i < n; i++)
ary[i] = i;}
void pary(int *ary,int *aryeof){
int i = 0;
int *temp;
for(temp = ary,i = 0; temp <= aryeof; temp++,i++)
*temp =i;}

212 名前:デフォルトの名無しさん [2007/09/25(火) 22:39:29 ]
超初心者質問ですが「defineできる」とはどういう意味ですか?
defineで定数を宣言するということでしょうか?

213 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 22:48:24 ]
前後の文脈が分からんとなんとも。
直訳すると「定義することが出来る」か?

214 名前:デフォルトの名無しさん [2007/09/26(水) 01:44:40 ]
すみません、これの違いって何ですか?
ポインタかどうか?だけですか?

MyClass my;
my.foo(5);

と、

MyClass* my;
my = new MyClass;
my->foo(5);
delete my;


215 名前:デフォルトの名無しさん [2007/09/26(水) 01:49:08 ]
VC6 の SDK で、ボタンを作ってあーだこーだしているのですが、
描画がうまくいきません。マウスを左クリックしたときに
そのメッセージを捕まえて、描画更新すればよいのかと思って
いたのですが、上手くいきません。
WM_LBUTTONDOWNと、WM_LBUTTONUPは取れてます。が、ボタンを押す
と、凹まないし、凹んだと思ったら、他のボタンは凹まないし・・
描画処理が足らないのかと思っているのですが、どこに何を入れれば
いいのでしょう?ちなみにWM_LBUTTONDOWNを受信したときに
InvalidateRectと、UpdateWindowを呼んでみたのですが、何も変わりませんでした。
よろしくおねがいします。


216 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 02:02:57 ]
>>214
前者はローカル変数としてスタックに確保しているが、
後者はヒープに確保している。
巨大なクラスでないなら前者にするべき。

217 名前:214 [2007/09/26(水) 02:07:53 ]
>>216
そういうことでしたか。ありがとうございます。
サクっとは前者で、ぐごごご、は後者みたいな感じですね。
これからはサイズや用途などを考えて使い分けるようにします。

218 名前:デフォルトの名無しさん [2007/09/26(水) 02:11:52 ]
>>212
文脈がわからんからなんともいえないけど、「defineできる」って、
誰かに言われたの?だとすると、「defineできる」って言わせる何か
(プライスレス)があったわけだと思うわけですよ。
もし、そこに整数や文字列なんかがあった場合、それらはソース
コード上に書くよりdefineできるから、そこらへん修正しちゃってYO
みたいな感じになるのかな?

219 名前:超初心者です [2007/09/26(水) 02:13:15 ]
質問があるんですがよろしくお願いします。
C++を使ってヘリコプタのシミュレータを作っています。
今回「compact flight controller」というコントローラを使いたいと考えています。
コントローラで動きを入力するとその動きがシミュレータにも反映されるようにしたいです。
入力した動きを数値化して代入すればいいのかなと思っているのですが、
動きをC++に取り込む方法が分かりません。誰か教えて頂けませんか?

説明がへたくそですごく分かりにくくなってしまいました。申し訳ありません。

220 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 07:02:17 ]
>>219
質問のポイントが漠然としすぎてる。

まるで、
私の代わりに作ってください
と言っているようなものだ。



221 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 08:03:39 ]
デバイスドライバと連携をとりたいとかかなあ。

222 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 08:36:58 ]
>>219
DirectX

223 名前:超初心者です [2007/09/26(水) 15:55:37 ]
すいません。漠然としすぎでした。本当に初心者なのでどう質問していいか
分かりませんでした。

ジョイパッドの入力データをC++に取り込む関数みたいなものがあると
聞いたので、もしあるのなら教えていただきたいです。

224 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 16:11:41 ]
超初心者はプログラムするな

225 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 16:14:01 ]
あほか

226 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 16:20:33 ]
DXライブラリ使いなさい
目的の関数はマニュアル見れば一発で見つかるから

227 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 17:00:31 ]
質問です

cout.precision(17);
cout << .8F + .1F << endl; //Line a
cout << .8 + .1 << endl; //Line b

これを実行すると

0.90000003576278687
0.90000000000000002

と表示されるのですが0.900000000・・・とならないのは
Line aのほうはfloat型、Line bのほうはdouble型でメモリ上に確保されていて
確保していない領域まで表示してしまった結果と考えてよいのでしょうか?
まったく見当違いなことを言っていましたら、どなたかなぜ0.9000・・・・とならないのかご指導お願いできますか?
よろしくお願いします

228 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 17:25:42 ]
>>227
2進数だから。

229 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 17:28:31 ]
たとえば、
10進数の0.5は、2進数なら0.10000000000000000・・・・・
では、
10進数の0.9を、2進数で現わすと? 何桁必要なのか。
それを有限の桁数で打ち切って、さらに10進数に変換すると、どうなるのか。
ちょっと自分で計算してみればわかる。

230 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 18:01:12 ]
>>228
>>229
ありがとうございます
二進数だと0.111001100110011・・・・
って感じで無限に続いてっちゃうんですね
それでサイズに入らない分は切り捨てられると

なんかぜんぜん見当違いなことかいててすみません
勉強になりました
ありがとうございました



231 名前:デフォルトの名無しさん [2007/09/26(水) 22:47:40 ]
[1] 授業: 教科書
[2] OS Windows
[3]問題
double data[5] ={10.8,20.3,30,6.40,10.4,2.12}:
配列の全要素の合計と平気を求めるプログラムをポインタを使って作成しなさい 
誰か宜しくお願いします
ちなみに初心者です

232 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 23:10:54 ]
>>231

template <int N> double sum( double (&array)[N] ) {
double result = 0;
for( double* i = array ; i < &array[N] ; ++i) {
result += *i ;
}
return result ;
}

template <int N> double average( double (&array)[N] ) {
return sum(array)/N ;
}

233 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 23:16:12 ]
double result = 0;

double result(0.0) ;
のほうがいい気がする。


234 名前:774 [2007/09/27(木) 22:47:40 ]
log10f()はVC6ではどのライブラリに含まれてるんでしょうか?
リンクで未解決になっちゃう。


235 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 22:56:38 ]
>>234
VC6はC99未対応だから無いんで内科医?

236 名前:デフォルトの名無しさん [2007/09/28(金) 01:13:27 ]
未入力のエラーチェックしたいのですが
getsだと簡単なのにscanfだとうまくいかない
getsは非推奨だそうなので出来ればscanfでやりたいのですが
いい方法ありますか?

237 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 01:19:27 ]
>>236
fgets()でやれば?

238 名前:デフォルトの名無しさん [2007/09/28(金) 01:38:13 ]
>>237
できませんでした(´・ω・`)
if(a[0] == '\0')
で未入力エラーチェックしてたのですが他の方法ってありますか?


239 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 01:42:31 ]
>>238
その場合fgets()は改行文字を取り除かないから、if (a[0] == '\0' || a[0] == '\n')とでもすればいい。

240 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 01:56:46 ]
scanfも非推奨



241 名前:デフォルトの名無しさん [2007/09/28(金) 02:06:19 ]
なんか頭痛くなってきた。もう寝ます。
教えていただきありがとうございました。

242 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 02:42:28 ]
>>236
「未入力のエラーチェック」って何だよ。
わかんねーよ。

243 名前:デフォルトの名無しさん [2007/09/28(金) 03:06:52 ]
質問です。

#include<stdio.h>

#define NAME_MAX 20

int main()
{
char name[NAME_MAX+1];

scanf("%s",&name[0]);
printf("%-20s : 名前",&name[0]);
}
以上のようなプログラムを#defineの値を変えただけで
表示幅の左詰めを変更できるような方法を
知っている方がいらっしゃったら教えて頂けませんか?

244 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 03:17:34 ]
printf("%-*s : 名前", NAME_MAX, &name[0]);

&name[0] は name と書いたほうがいいよ。

245 名前:デフォルトの名無しさん [2007/09/28(金) 03:57:43 ]
できました!ありがとうございます。
>244


246 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 14:56:42 ]
>>242
何も入力しないでエンター押した時のことでしょ

247 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 21:29:24 ]
>>246
それは未入力ではなく空入力と書いたほうがわかりやすいし、
もっと具体的に説明したほうがいいんじゃまいか。

248 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 17:51:52 ]
#include <stdio.h>

int sum_ave(int num1,int num2,int *sum,int *ave)
{
*sum = num1 + num2;
*ave = (num1 + num2) / 2;
}
int main(void)
{
int x = 3;
int y = 5;
int goukei = 0;
int heikin = 0;

sum_ave(x, y, &goukei, &heikin);

printf("合計は %d です\n",goukei);
printf("平均は %d です\n",heikin);

}

これでコンパイルするとerror C4716: 'sum_ave' : 値を返さなければいけませんと表示されてしまいます。
何度も本を読み返してみたのですがどこがおかしいのかわかりません。ご教示お願いします。


249 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 17:54:57 ]
int sum_ave → void sum_ave

250 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 17:56:37 ]
エラーメッセージの言うとおりにしろよ
sum_aveの中でreturnしろ
値戻す気ないなら戻り値型voidにしろ



251 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 17:57:17 ]
>>249
ありがとうございます

本に書いてあるのが間違いだとは思いませんでした

252 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 18:02:51 ]
本のタイトル晒せ

253 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 18:08:45 ]
本のサンプルが細かい所で間違ってるのは良くあること

254 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 23:11:22 ]
>>252
C言語のポインタがゼッタイにわかる本の160ページです

本に書いてあるのがひょっとしたら間違えてるのかなと思って
正誤表www.shuwasystem.co.jp/books/7980/1192-4/1192-4.htmlをみたのですが
そのページのことは何も書いてなかったので私が間違えてるのかなと・・・

255 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 01:55:00 ]
>>254
すごく恥ずかしいタイトルの本だなぁ。

ポインタくらいで躓く人は、その先にある、もっと大きなハードルを越えられないから、
いまのうちに諦めたほうがいいよ?

256 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 03:01:53 ]
>>254
そういう壮大なタイトルをつける著者は、自分にしか分からないような文章を書く事が多いからねぇ。
まずは、メモリとアドレッシングについてきちんと理解した方がいいよ。

257 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 17:30:41 ]
> そういう壮大なタイトルをつける著者は、自分にしか分からないような文章を書く事が多いからねぇ。
ハゲ堂w

258 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 16:36:02 ]
ハゲって言うなこのハゲ!!

259 名前:デフォルトの名無しさん [2007/10/06(土) 04:38:31 ]
テンプレートを使うとリンクで失敗します。
ソースをまとめて一つのファイルにした場合は大丈夫なのですが、
テンプレートを使ったクラスを分割コンパイルしようとすると、必ずリンクで失敗します。
環境はFC6+gcc4.0です。

260 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 06:54:23 ]
そうだそうだ!
「ハゲ」って言うな俺ハゲ!



261 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 09:15:21 ]
>>259
テンプレートクラスを分割コンパイルってどうやってやってるの?
Vandevoorde と Josuttis の C++ Templates という本では 6 章で
議論しているけど。

262 名前:デフォルトの名無しさん [2007/10/06(土) 12:18:30 ]
画像を一覧表示 −> 簡単な加工 −> 保存
を行うアプリケーションを開発させられています。
PhototoShop等の画像処理ソフトでは、作成したファイルのアイコンに、画像のプレビューが表示されますが、あれができないかと言われたのですが
VisualStudioのhelpを探しても、helpのテキストが膨大すぎてどうにもなりません。
これに関しての情報をどなたかご存知ありませんでしょうか?

263 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 12:46:08 ]
>>262
help でキーワード検索してみるとか。
「イメージ ライブラリ」で検索するとちょっと近付くかも。

264 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 13:37:13 ]
>>262
漠然としすぎてる。

やりたいことを具体的に適切に書かないと、アドバイスできない。

265 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 13:40:31 ]
おいモマイラ
C and C++ Forum forums.belution.com/ja/cpp/
↑ここ見える、漏れは9月の終りから覗けなくて困ってるんだが。

266 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 14:01:53 ]
>↑「ここ見える、漏れ」は9月の終りから覗けなくて困ってるんだが。

そこが見えるあんたは何で覗けないんだ?

267 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 14:21:15 ]
>>266
本当に見えるのか?
会社からも、自宅からも見えないんだが?

268 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 14:26:56 ]
日本語が書けない・読めない人を雇ってる会社の人が不憫だ

269 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 14:31:15 ]
嫌いな人が居るなら殺しちゃえばいいんだよ

270 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 14:32:26 ]
belution最近調子わるいみたいだね。



271 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 14:41:21 ]
>>267
>265に、「ここ見える、漏れ」と書いてあるが。

272 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 14:46:41 ]
揚げ足を取るならせめておもしろくしようや

273 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 15:49:48 ]
ここ見える?って区切らなきゃだめってのと、266の突っ込みが理解できてないの両方だからな
相手に伝える能力もなければ、相手の言うことも理解できない。
仕事でこういう奴と組まされる人がかわいそうだ。

274 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 03:37:55 ]
数字をカウントしたいんだけど
(宣言等省略)
fgets(input,256,stdin);
for(i = 0;input[i] != '\n';i++){
if(isdigit(input[i]) != 0){
for(j = '0';j <= '9';j++){
if(input[i] == j){
output[j - '0']++;
}
}
}
}
でやってもうまくいかない。どっかおかしいところあります?

275 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 04:59:03 ]
ある

276 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 05:00:08 ]
>>274
for(j = '0';j <= '9';j++){
if(input[i] == j){
output[j - '0']++;

output[input[i]-'0']
でいいと思うけど、一応目的通りには動くよな。

どう上手くいかないのか、もう少し詳しく書いてくれないと

277 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 05:28:07 ]
配列外アクセスしてないか
inputとoutputの長さは大丈夫か?

278 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 08:38:25 ]
どのようにうまくいかないのか、ちゃんと説明しろよ。

まともな頭脳していたら、もっと問題点を絞り込めるハズだ。
大抵はその課程で自己解決するものだがな・・・。

279 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 19:20:57 ]
>>274
省略しちゃった宣言のほうが
とてつもなくおかしかったりして

280 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 20:14:51 ]
問題に気がついていないからこそ、省略したところに、問題があるんだろうな。

ソースコードは全部見せたほうがいい。
とはいえ、問題とは関係ない処理は削るべし。

スレに直接書くのは大変だろうから、
自分の持っているWebサイト上にソースコードを置くべし。

過去ログを見た人のために、そのソースコードは長期にわたってWebに残すべし。



281 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 01:03:50 ]
ありがとうございます。
どう動かないかというと、実行したとたんに終了してしまうのです。
この入れ子自体は変じゃないんですね?

一応変数宣言は
int i,j;
char input[256];
char output[256];


282 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 09:56:54 ]
>>281
> 実行したとたんに終了してしまうのです。

まず、デバッガ上でステップ実行しろ。
次に、fgetsの返り値をチェックしろ。

話はそれからだ。

問題箇所はわかっているが、
すぐに教えてしまうと、
ステップ実行すらやらなさそうだからな!


283 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 10:06:18 ]
デバッガなしでprintf()をはさんでデバッグすればすむことだ。

284 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 11:01:20 ]
>>283
printfデバッグなんて、いったい、いつの時代の話だよ。
デバッグ用のログを取るべき状況もあるが、これは、明らかに違う。

285 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 11:07:02 ]
>>281
>実行したとたんに終了
正常に動作して終了しただけじゃね?

あと、outputは数字の数を数えてるんだから[10]でよくね?

286 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 11:22:48 ]
質問します。このようなコードがあるのですが

fseek(fp, 0, SEEK_SET);
for( ; l>=0; l = l - 2L) {
ch = fgetc(fp);
putchar(ch);
fseek(fp, 1L, SEEK_CUR);
}

なんでわざわざ定数をLong型で表現してるのですか?普通に
for(;l>=0;l-=2){で良いと思うのですが。何か理由があるのでしょうか?

287 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 11:28:37 ]
>>286
関数のプロトタイプ宣言がなされていない場合などに、スタックに積まれる内容が違ってくる。

288 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 11:38:10 ]
l -= 2 でいいと思うが、long を明示したい年頃だったんじゃないかね

289 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 12:33:37 ]
>>284
時代もへったくれも、きちんとロジックを追えれば済むと言っているのだが。
まぁ、対処療法プログラミングを心掛けたいのなら止めはしないが。

290 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 12:36:17 ]
>>287
for ループの l = l - 2L には関係ない話だね。


>>288
それならそれで、 l -= 2L でいいわけで。

>>286
つーことで、普通はそんな書き方しない。
書いた香具師に聞け。



291 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 12:48:03 ]
>>289
おいおい。

printfデバッグとデバッガを使うのと、本質的には何も変らないぞ。


292 名前:BjarneStroustrup mailto:sage [2007/10/09(火) 17:08:29 ]
なにこのスレワロタ

293 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 20:34:24 ]
64bit環境を想定したかったんじゃね

294 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 20:51:56 ]
そこでユニットテストですよ
ステートメント毎にログ、強制終了等処置方法を細かく選べ
大量のテストを一度に実行できて再利用もできる
これを使わない手はないね☆

>>292
うっさいハゲ!

295 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 21:48:57 ]
>>286
暗黙のキャストが嫌いなんじゃね?
どっちかっつーと
>fseek(fp, 0, SEEK_SET);
ry
>fseek(fp, 1L, SEEK_CUR);
ここの差が気になる。


296 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 22:06:16 ]
>>289
× 対処療法
○ 対症療法

297 名前:281 mailto:sage [2007/10/10(水) 21:01:28 ]
アドバイスありがとうございます。
fgetsの返り値は異常ありませんでした。
デバッカ上でステップ実行てどのようにするんですか?

298 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 21:05:17 ]
環境を書かないと

299 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 21:44:33 ]
>>297
デバッガ って何だか、わかってる?
ステップ実行 って何だか、わかってる?

いまどきのGUIの開発環境なら、ちょっとマニュアル見ればわかると思う。

300 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 21:45:30 ]
>>297
なんじゃそら。
プログラム実行したとたん終わるのに、fgetsで入力あんのか?
fgetsで入力待ちしてるの?

「実行したとたん終了する」の状態がさっぱり分からんくなった。



301 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 21:47:16 ]
すいません質問させてくださいm(_ _)m
RPGとかで誰かがしゃべると文字列が1個ずつ順次に表示されるんですが
あれ半角ならできるんですが、2バイト使用する全角の場合って、char配列2個使うので
解決できません;;

全角文字を配列に格納したり、1個ずつ表示するのってどうすればいいんでしょうか・・・
よろしくお願いします

302 名前:デフォルトの名無しさん [2007/10/10(水) 21:52:09 ]
stringつかっとけ こっちが業界標準

303 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 21:54:20 ]
マルチバイト使うなら俺はwstringを使うぞ

304 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 21:55:00 ]
>>301
半角文字のときは1個、全角文字のときは2個分進める。

305 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 22:01:37 ]
>>302-304
早速の回答、本当にありがとうございますm(__)m
>>304
char配列を2つ使用しているので、この配列2こを利用して表示するというのは
理解しているのですが・・・2個分進めるというのはメモリ操作のことなんでしょうか?

恐ろしく低レベルな質問をしている気がしますが、よろしくお願いいたしますm(__)m


306 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 22:06:49 ]
ソースを置いておきますm(__)m 連投申し訳ございません

// シーンの描画(テキスト@)
RECT rect = { x, y, 0, 0 }; // 描画領域
Font->DrawText(
Sprite, // 描画に使うスプライト
say, // 文字列
-1,      // 文字数(-1は自動計算)
&rect, // 描画領域
DT_LEFT | DT_NOCLIP,         // 左揃え&クリップしない
D3DXCOLOR(1, 1, 1, a));         // 文字色(R255,G255, B0) aは1で出る

// ここで出力
wsprintf( str,"%s","おはようございます。。" );
font1.print_char((int)x+260,(int)y+50,str);

全角を1こずつ順次だし????

307 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 22:21:26 ]
それは、半角なら1個ずつ順番に出せるコードなのか?

308 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 22:39:00 ]
>>300
もともとの質問者は、
相手に分かるように的確に説明する
というスキルが足りないからなぁ。

>>301
お前さんが言ってる「char配列」というのは何者か。
言いたいことは、なんとなくわかるが、
自分で勝手に変な用語を作り出したり使ったりされると、
話が見えにくくなるよ。

309 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 22:40:56 ]
>>305
面倒くさいからUnicode使え。

310 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 22:47:51 ]
VC++6.0Proをインストールしたのでサービスパックを当てようとしたんですが、
公式見ると最新の物はVisualStudio6.0のSP6しか見当たりませんでした。
これを当てればVC++6.0にもSP6が当たっている認識でいいんでしょうか?



311 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 23:10:03 ]
>>310
OK。
VS6を買ってVC6しかインストールしない構成もアリだからね。

312 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 23:10:33 ]
>>311
ありがとうございました。

313 名前:デフォルトの名無しさん mailto:sage [2007/10/11(木) 03:12:06 ]
しばしば、(void)hoge() などと関数呼び出しの前に (void) を付けているのを見かけるのですが、あれは何のメリットがあるのでしょうか?

314 名前:デフォルトの名無しさん mailto:sage [2007/10/11(木) 03:16:57 ]
>>313
専らLINTを黙らせるために付けている。
要は、値を返す関数の戻り値を利用しないことを明言するわけだ。

315 名前:313 mailto:sage [2007/10/11(木) 03:44:00 ]
>>314
ありがとうございました。

316 名前:デフォルトの名無しさん [2007/10/11(木) 18:54:16 ]
WINDOWS環境で、OS標準でない画像形式をフォルダの縮小版表示で一覧できるようにしたいと思っています。
シェル拡張を利用するdllを用意してやればよいというのはわかったのですが、サンプルがなかなか見つかりません。
MSDN内等によいサンプル等はないでしょうか?


317 名前:デフォルトの名無しさん mailto:sage [2007/10/11(木) 19:33:08 ]
WindowsSDKのサンプルは漁ってみた?
なければ、
同様のことをやっているオープンソースのフリーウェアを、
SourceForge等で探そう。

318 名前:デフォルトの名無しさん [2007/10/11(木) 22:13:50 ]
WindowsSDKでビットマップ(カラー)の拡大・縮小がやりたいです。
サンプルソースなどがある良きサイトをご存知の方いましたら教えていただきたいのです。

319 名前:デフォルトの名無しさん mailto:sage [2007/10/11(木) 22:27:08 ]
>>318
StretchBltで検索

320 名前:デフォルトの名無しさん mailto:sage [2007/10/11(木) 22:33:50 ]
Expression Template(ET)の質問です

homepage1.nifty.com/herumi/prog/prog82.html

上記ページのETサンプルプログラム(vect2.h)
と同等の機能を持つETを使用しないコードの
実行速度を比較したところ
ET不使用の方が2倍程度早かったのですが、
どのような場合にETを使えば有効なのでしょうか??



321 名前:デフォルトの名無しさん [2007/10/11(木) 23:39:22 ]
入力パラメータが5つくらいあって、そのパラメータの条件でデータを
検索する関数を作らないといけないのですが、5つのパラメータ毎に
使用フラグがあって、フラグOFFの時は、検索条件になりません。
なので、検索条件としては、最低0個、最大5個になり、検索条件の
組み合わせもいろいろになってしまいます。
作り方としては、どういうやり方が簡単そうでしょうか?
パラメータの組み合わせがいろいろになるので、オーバーロードも
できないかなあ、と悩んでいます。

322 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 00:40:32 ]
>>320
質問の答えにはならないが・・・。

そのWebページで紹介しているノウハウは、
下手な小細工
であるが故に、かえって遅くなったのだと思うよ。

無駄な一時オブジェクトの生成は、
コンパイラの最適化によって端折られるのであれば、
素直にコーディングするのがいいと思うよ。

323 名前:322 mailto:sage [2007/10/12(金) 00:41:14 ]
文章が変だった。

無駄な一時オブジェクトの生成が、コンパイラの最適化によって端折られるのであれば、
素直にコーディングするのがいいと思うよ。

324 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 00:44:45 ]
>>321
その「使用フラグ」を見ながら検索処理するのでは、ダメ?

325 名前:デフォルトの名無しさん [2007/10/12(金) 01:10:18 ]
>>324
ありがとうございます。
お風呂に入って考えてたけど、結局それが一番見通しがいいような
気がしてきた・・・


326 名前:シロートです [2007/10/12(金) 01:41:53 ]
C++言語を使っています。質問です。
4種類の連続した数値のデータがあります。4種類の測定時間や時間間隔は一緒です。
その4種類をひとまとまりとします。そのまとまりがいくつかあります。
それぞれのまとまりから一部分だけを取り出します。その一部分のデータの特徴を
どんどんと集めていき4種類のデータの特性を求めたいです。その方法がわかりません。
すいません。ホントシロートです。質問の意味がわからないかもしれません。
でも本当に困ってます。ヒントだけでもいいのでお願いします。

プログラムが違うのかもしれませんが、
「似たようなデータをどんどん記憶していくことによりそのデータ達の
特性を求める」ということかなと自分では考えたのですがその方法も分かりません。
方法を知っているとかこんなコマンドがあるなど本当に何でもいいのでよろしくお願いします。

327 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 01:55:59 ]
エスパー以外お断りでなければもっと具体的に頼む

328 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 04:18:09 ]
「特性」ってのをもっと具体的に説明しる

329 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 05:01:45 ]
>>326
アルゴリズムの問題だね。
C/C++言語に特有の話ではないので、スレ違い。
さようなら。

330 名前:デフォルトの名無しさん [2007/10/12(金) 05:07:00 ]
      / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
     | 吉本いるか  
     \            
        ̄ ̄ ̄|/ ̄ ̄ ̄ ̄
                   ∧_∧      / ̄ ̄ ̄ ̄ ̄
         ∧_∧     ( ´Д`)    < 吉本いるか 
         ( ´Д` )   /⌒    ⌒ヽ    \_____
        /,  /   /_/|     へ \
       (ぃ9  |  (ぃ9 ./    /   \ \.∧_∧  / ̄ ̄ ̄ ̄ ̄
        /    /、    /    ./     ヽ ( ´Д` )< 吉本いるか 
       /   ∧_二つ (    /      ∪ ,  /   \_____
       /   /      \ .\\     (ぃ9  |     
      /    \       \ .\\    /    /  ,、  
     /  /~\ \        >  ) )  ./   ∧_二∃  
     /  /   >  )      / //   ./     ̄ ̄ ヽ    
   / ノ    / /      / / /  ._/  /~ ̄ ̄/ /   
  / ./     ( ヽ、     ( ヽ ヽ | /       ( ヽ、     
(   _)      \__つ    \__つ).し          \__つ   




331 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 05:33:44 ]
いるよ

332 名前:シロートです [2007/10/12(金) 08:49:30 ]
みなさん、説明が下手ですいません。
4種類のデータはヘリコプタの制御に使う、スロットル、エルロン、エレベータ、ラダーです。
特性はホバリングをしている時の4種類のデータ入力の特徴を見つけたいです。
よろしくお願いします。

333 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 09:01:18 ]
私らはヘリコプタの専門家ではないから、それらのデータの特徴と言われても
何をどうすればいいか判らんのだがね。
もっと具体的に説明はできないもんかね。

334 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 09:49:43 ]
>>332
コンピュータは勝手に思考して適当によろしくやってはくれない。
処理の手順を1つずつ手取り足取りコーディングしてやる必要がある。

まずは、人間が手作業で計算して処理する手順を明らかにすること。
それくらいは自分でやってから、相談してね。

335 名前:デフォルトの名無しさん [2007/10/12(金) 11:40:08 ]
C言語で2次元変数a[4][5]として適当な文字を入れる場合、20文字入れないといけないんですよね?

336 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 11:53:19 ]
何をしたいのかよくわからん。
こういうことか?
char a[4][5] = { "This", "is", "a", "pen" };

337 名前:デフォルトの名無しさん [2007/10/12(金) 12:02:44 ]
vector配列について質問です。
現在、配列に構造体を設定しているのですが、
その構造体の内容を書き換えるとき、以下のようなコードを書いています。

struct DATA data;

data=vec[i];
data.n=5;
vec.push_back(data);

できれば、このようなコードではなく、
vector[i]のところで構造体のアドレスを得るようにして、
メンバを変更したいと思っているのですが、
そのようなことは可能でしょうか。








338 名前:デフォルトの名無しさん [2007/10/12(金) 12:08:00 ]
>>335に追加で
#include<stdio.h>
void main(){
int i,j,a[4][5];
a[0][0]='た';a[0][1]='さ';a[0][2]='か';a[0][3]='あ';
a[1][0]='ち';a[1][1]='し';a[1][2]='き';a[1][3]='い';
a[2][0]='つ';a[2][1]='す';a[2][2]='く';a[2][3]='う';
a[3][0]='て';a[3][1]='せ';a[3][2]='け';a[3][3]='え';
a[4][0]='と';a[4][1]='そ';a[4][2]='こ';a[4][3]='お';
for(i=0;i<4;i++){
for(j=0;j<5;j++){
printf("%d",a[i][j]);
}
printf("\n");
}
}
と入力しても正しく入力できないのですがどうすればいいのでしょうか?

たさかあ
ちしきい
つすくう
てせけえ
とそこお

と表示させたいです。

339 名前:デフォルトの名無しさん [2007/10/12(金) 12:09:08 ]
>>336
そういうことです

340 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 12:12:17 ]
>>338
ぱっと見、
printf("%d",a[i][j]);
これはおかしい。
%cだよ。



341 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 12:12:26 ]
>>338
1) printfの書式について調べよう
2) charについて調べてみよう
3) 全角を表示するにはどうしたらいいか調べよう

342 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 12:14:33 ]
>>340
無駄な指摘乙。

>>337
vec[i].n = 5ではいけないの?
安全にやるなら
vec.at(i).n = 5になるけど。

343 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 12:15:35 ]
>>337
vec[i].n = 5;

344 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 12:16:03 ]
そのコードは、
コンテナ内の既存の要素を変更しているのではなく、
コンテナ内の既存の要素をコピーし、少し変更し、新規の要素として末尾に追加しているぞ。

既存の要素を変更するなら、
vec[i].n=5 ;
でいけると思う。

あるいは、明示的に参照を使って、
DATA& data ;
data = vec[i] ;
data.n = 5;
これでもいいね。

345 名前:デフォルトの名無しさん [2007/10/12(金) 12:16:53 ]
>>340
>>341
ありがとうございます。
調べてみます

346 名前:340 mailto:sage [2007/10/12(金) 12:17:32 ]
>>342
あー、%Cの間違い。

処理系によってはサポートしていないかもしれんが。

347 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 12:21:52 ]
いや、
a[0][0]='た';a[0][1]='さ';a[0][2]='か';a[0][3]='あ';
とかも、
a[0][0]=L'た';a[0][1]=L'さ';a[0][2]=L'か';a[0][3]=L'あ';
にする必要あるな。

348 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 12:22:47 ]
そもそも、int はマズいな。wchar_t だ。

とにかくツケ刃じゃダメだ。

349 名前:デフォルトの名無しさん [2007/10/12(金) 12:39:49 ]
>>347
>>348
ありがとうございます
試してみます

350 名前:337 [2007/10/12(金) 13:24:28 ]
ご指摘ありがとうございます。
vec[i].nできれいにコードを書くことができましたが、
やはり構造体のアドレスを取得する方法が気になっています。
というのも、最終的に行いたいことは、
基底クラスを継承した複数の派生クラスをvetor配列に格納し、
その派生クラスのアドレスを基底クラスで受け取って、
仮想関数を呼び出すという処理をしたいからです。

CData *p;

//ここでvector配列と添字でCDataの派生クラスのアドレスをpで受け取る

p->Draw(); // 受け取った派生クラスの種類を意識せず関数を呼び出す

コードとしては、このようなものをイメージしているのですが、
実装は可能なのでしょうか。
申し訳ありませんが、よろしくお願いします。



351 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 13:25:49 ]
p = &vec[i];

352 名前:351 mailto:sage [2007/10/12(金) 13:29:06 ]
いや、まて。 なにかおかしい。

例えば
class Base{};
class Derived : public Base{};
だとして、
vector<Base> に Derived を入れることは出来ないぞ。
vector<Base*> とすることになるんじゃないか?
だったら
Base *p;
p = vec[i];
だと思うが。

353 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 13:33:12 ]
的確すぎてワロタw

354 名前:337 [2007/10/12(金) 13:52:05 ]
ご指摘ありがとうございます。
つまり、クラスのアドレスをvector配列に格納し、
実体そのものは別に管理するということでしょうか。


355 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 14:15:49 ]
>>337
>実体そのものは別に管理するということでしょうか。
yes.
vector内でのコピーがポインタのコピーで済むから動作が速くなる(可能性もある)し。
余裕があれば(管理者が許せば)boost::shared_ptrとかを検討してみるのもあり。

356 名前:337 mailto:sage [2007/10/12(金) 14:39:49 ]
vector<Base*>で上手くいきました。
ありがとうございました。

357 名前:デフォルトの名無しさん [2007/10/12(金) 14:59:31 ]
動画像からフレームを取り出してフーリエ変換したいのですが
取り出すプログラムが分かりません。
分かる方、教えて頂けると幸いです。

358 名前:デフォルトの名無しさん [2007/10/12(金) 15:01:50 ]
>357
動画像処理したいというなら、ライブラリが限られるけどDirectShowを使いたいのかな?
それならDirectShowフィルタを使うのが現実的で、次がサンプルグラバで1枚づつ画像を取り出すとかになると思う。
むつかしめだけどがんば。


359 名前:357 mailto:sage [2007/10/12(金) 15:23:15 ]
>>358
レスありがとうございます。
秒間20フレーム程度で数秒の動画なのですが
簡単なプログラムで実装出来ないでしょうか?

先生に難しいプログラムでは無いと言われました。
その2つを見てみたのですがこの分野が苦手な自分には
少し難しいです;;

360 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 16:13:43 ]
>>359
何のために学費払ってんだよ。
先生に聞け、先生に。



361 名前:358 [2007/10/12(金) 16:16:00 ]
fft(高速フーリエ変換)自体は画像処理系の本ではかなりあたりまえにあるコードなので難しいものではないと思うんだけど
動画から画像を取り出すのはwindows標準でライブラリとか存在したかな...。
fftが難しくないのか、動画からフレームごとの画像を取り出すのも含めて難しくないのかちょっと聞いてみて欲しい。
あと、だれかできるだけ楽な、その方法知らないですか?>all

362 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 16:21:51 ]
20フレームで数秒ってことは、50フレーム前後か。
そこいらの、動画を入力して、ビットマップ画像の羅列を出力するプログラムを使えばいいじゃん。

363 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 20:47:09 ]
いろいろなデータファイルからデータ抽出して
アルゴリズムに適用して出力結果を出すプログラム作ってんだけど
微妙に値がおかしいんだよね。大方あってるんだけど。

これはデバックでなおるのかな?
150X30くらいのデータを配列にいれて1行ずつ処理してるんだけど
領域破壊とかなってるんでしょうかね。


364 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 20:57:03 ]
>>363
さぁな、どんなバグがあるかは、デバッグしてみないとな。

365 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 20:58:47 ]
>>363
テストしたの?

本屋に行って、
「基礎から学ぶソフトウェアテスト」
とかの本を買って読んでみ。

366 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 21:13:30 ]
おまえらこんな抽象度の高い質問によく答えられるな

367 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 21:21:50 ]
回答も抽象的だし

368 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 21:23:55 ]
だってプログラムの概要をいってなんとかしてくれるのかい?
データファイル大量すぎて
説明しようがない

369 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 21:29:22 ]
4725円のやつですか?
学校で買ったソフトウェア工学じゃ駄目?

370 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 22:00:39 ]
学生さんか。
じゃぁ、>>365の本は向いてない。

ちゃんとしたレクチャーなんて、ここではできないから、インチキな方法を教えてお茶を濁そう。

メモリの不正アクセスは、検出するためのツールがある。高価なものから無償のものまで。
開発環境は何?

次に、プログラムが意図通り動いていないのであれば、まずはステップ実行して確認してみよう。
案外、あっさりと間違いを見つけられる。

それでもダメなら、すでに確認済のデータを入力し、正しいデータが出力されるか、確認してみよう。
おかしなデータが出力されるようなら、プログラムを部分ごとに個別に、テストデータを与えて、出力が正しいことを確認しよう。




371 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 23:16:09 ]
cppunitとかunittest++とかboost.testとかライブラリから学ぶのがいいと思うんだぜ
中でもboost.testはbjamと組みあわせて複数のプロジェクトを一括テストとかできるし
make書くのが面倒臭い人にはおすすめ

372 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 23:28:44 ]
んなものは、反復してテストするレベルに到達してからでいい。

すでにバグがあるらしいということが、わかっているのだから、まずはステップ実行だ。


373 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 01:49:15 ]
データ処理において配列をたくさん使ってプログラムを作るのは
やめておいたほうがいいですか?
グリッドでの計算で二次元配列を2つ使って行っているんです。
30X150行を2つくらい。
領域を使いすぎてはいけないと聞いたんですけど。


374 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 07:53:56 ]
>>373
たったそれだけ?
今時のPCなら問題ないでしょ。

375 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 09:19:25 ]
まーその二次元配列のファイルを2500個処理するんだけどね

376 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 11:02:24 ]
>>373,375
要は、そのときのメモリ使用量が使用環境において妥当かどうかだ。
30x150x2x2500と考えて、それぞれ4バイトデータとしたら、高々100MiB未満。
全部メモリ上に置いたって何にも問題ないだろ。
# 勿論、Linux@PS3やWinCE、組み込みってことなら話は別だが。

377 名前:デフォルトの名無しさん [2007/10/13(土) 11:13:23 ]
long l1 = 1.2;
long l2 = 3.4;
printf("%f\n", l1 + l2);
これで4.6または4.600のような値を表示したいのですが、どう直したらよいのでしょうか?

378 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 11:14:58 ]
l1とl2の型をdoubleにする。

379 名前:デフォルトの名無しさん [2007/10/13(土) 11:16:58 ]
long l1 = 1.2;
long l2 = 3.4;
はもしかしたら優秀なコンパイラなら
long l1 = 1;
long l2 = 3;
として解釈するということでしょうか?

380 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 11:19:57 ]
>>379
いいえ。優秀なコンパイラに限らず、気が違っていない限りそう解釈するはずです。



381 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 11:20:43 ]
何が優秀なコンパイラなのかは知らないが、
規格上、浮動小数点数を整数に変換する際には、
小数点以下切捨てが行われることになっている。

382 名前:デフォルトの名無しさん [2007/10/13(土) 11:21:14 ]
kzk9.net/column/time.html
の一番上のソースを見たんですが、clock_tはlongですよね。
なのに%10.30fとして小数以下を30桁出そうとしたこの人も
勘違いしているのでしょうか?

383 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 11:40:57 ]
>>376
返答ありがとう。
よくよく考えてみると配列を150X30を30X150にしたり
無駄なことをしてるから
そこらへんを直してみるわ。

384 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 12:03:23 ]
>>382
clock_tが実際に何型かは実装に依存する。
しかしprintfには、型が判明していなければデータを渡せない。
とりあえずdoubleにキャストすれば、大抵の環境では値が保持される。
俺ならlong longにキャストしたいところだが、long longはまだ標準にないからな…。

385 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 12:06:10 ]
切捨てに関して便乗で

-4 -3 -2 -1 0 1 2 3 4 ・・・

-2 -2 -1 -1 0 0 1 1 2 ・・・
にしようと思ったのですが

int X=-1;
printf("%d\n",X/2);

が0になります
とりあえずXがマイナスのときを条件分けしましたが
EXCELのINT関数だとすんなりいくので不思議な感じがします
そういうものなんでしょうか?

386 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 12:07:12 ]
>>382
いいえ、勘違いではなくclock_tがdoubleなどの実数型であるとでも思っているのでしょう。

387 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 12:08:20 ]
>>382
もとが整数なのに小数で出力しようとするのはナンセンスだが、
doubleにキャストして変換しているので、間違いではないよ。

388 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 12:14:35 ]
>>385
負数の丸めは実装依存ですが、一般的には0に近い方に丸められるようです。

389 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 12:22:17 ]
>>388
浮動小数点数型から整数型への変換は、常に小数点部分を捨てた値で、
つまり0方向への丸めに決まっていたはずだが。

>>385
(int)floor(X / 2)

390 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 12:29:31 ]
すまん、(int)floor(X / 2.0)とでもしないとだめだな。

浮動小数点数型から整数型への変換のことは、X3010:2003 6.3.1.4に書いてある。
手元のANSI C言語辞典の型変換の項目にもそう書いてあるから、
C89でも0方向への丸めで間違いないはず。



391 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 12:32:21 ]
>もとが整数なのに小数で出力しようとするのはナンセンス
よしよし

392 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 13:09:33 ]
>>389,390
すみません、どこに浮動小数点型が出てくるんですか? 元質はこれなんですが。
--
int X=-1;
printf("%d\n",X/2);


393 名前:390=391 mailto:sage [2007/10/13(土) 13:52:16 ]
すまんorz

388の言うとおりだ。ただしC99では0方向への丸められることになった。
また、div関数などを使えば、C89でも必ず0方向への丸めになる。
丸め方を指定したければ、391のように浮動小数点数を使うという手もある。

394 名前:385 mailto:sage [2007/10/13(土) 14:44:59 ]
>>388-390,393
整数型/整数型の丸めは0方向に
floorとかEXCELのINTとかは小数点部分を捨てた値にする関数っていう感じですかね

>>392
とりあえず(int)floor(X/2.0)=-1でできますね
たしかにわざわざ実数で割るのもなんかすっきりしませんが、そういうものだと思うことにします

ありがとうございました

395 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 14:52:37 ]
floorとExcelのINTは負の無限大方向への丸め。
小数部分を捨てるというと、
Cのやる0.5→0、-1.5→1のような字面的に整数部分だけの値にすることを連想する。

396 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 16:22:59 ]
(int)floor(X / 2.0)

これってアリなの?

Xが整数型だから、
X / 2
になっちゃわないか?

(int)floor((double)X / 2.0)
などとして、Xを実数にしないと。

397 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 16:24:37 ]
>>396
2.0

398 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 16:31:49 ]
doubleで割ってるからdoubleになる
大丈夫

399 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 16:44:39 ]
左項に合わせるのだと思い込んでたよ。


400 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 18:10:02 ]
コンパイルしたら警告が600個あります
今のところバグは無いのですが、何か他に弊害はありますか?



401 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 18:11:19 ]
まず間違いなくバグだらけだろうな

402 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 18:32:22 ]
>>400
そんなに大量に警告が出ていたら、無視してはいけない警告が出ても、気がつかないだろうな。
それが、大量の警告を放置することによる害。

きちんと精査した上で警告を無視すると決めたら、
当該部分だけに限定して、pragmaとかで警告を抑制すべし。

403 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 18:53:41 ]
GNUのソースは警告0ですか?

404 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 19:38:20 ]
>>400
多分ライブラリが嫌らしいコーディングしてるんだろうがな

405 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 20:03:57 ]
Wallにしたらstlでも凄い量の警告出るぜ

406 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 20:08:08 ]
>>404
wow
調べてみたらけっこうライブラリというか同じ部分の警告でかぶってました

407 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 21:59:34 ]
3桁ごとにカンマが入ってる数字文字列を
int型に変換する関数ってないんですかね

408 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 22:09:50 ]
標準ではありません。大したもんじゃないから自作しましょう。

409 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 22:16:07 ]
そうですか

lexical_castで通ると思ってたらエラー出るし…

自分で書くことにします
すみません

410 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 22:22:18 ]
boost使うならやりようは色々あるかと

当該スレで聞いてみては?



411 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 20:13:04 ]
C++なんですが、AfxsetResuseで
明示的にリソースを設定した場合
リソースの解放も明示的に行う必要が
あるんでしょうか?

412 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 20:44:31 ]
>>411
C++標準には、そのような識別子は定義されていないが?

413 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 04:05:24 ]
質問です。

以下のように書いたとき、
arrayの各要素は10で初期化されると思っていたんですが、
コンパイルして実行してみるとarray[0]のみ10で
残りは0で初期化されてました。
配列の各要素をすべて同じ値で初期化するにはどうすれば良いんでしたっけ?
よろしくお願いします。

#include <iostream>

int main(int argc, char** argv)
{
int array[10] = {10};

for (int k = 0; k < 10; ++k) {
std::cout << array[k] << std::endl;
}

return (0);
}

414 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 04:33:10 ]
int array[10] = {10,10,10,10,10,10,10,10,10,10};

0以外の数字で全て同じ数値で初期化するには、いちいち全部書かなきゃダメ。

めんどくさいなら for(i=0; i<10; i++) array[i] = 10; みたいにループで初期化する。

415 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 04:50:04 ]
int array[10] = { FILL(10,10) };
みたいにプリプロセッサで書けないかなぁ…

416 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 05:02:13 ]
C++ならクラスにしてコンストラクタで初期化させればええやん

417 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 07:03:56 ]
std::vector<int> array(10, 10);

418 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 08:47:11 ]
>>414
0以外のときは駄目だったんですね。
全然知りませんでした。

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


419 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 12:25:23 ]
あれ?自動変数は0に初期化されるんでしたっけ?

420 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 12:43:56 ]
いいえ、普通の自動変数は初期化されません。
但し、構造体や配列の初期化指定子の数が足りない場合は0が補われます。
従って、all bit 0が数値0を表わさない実数型であったとしても、数値0が保証されます。



421 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 13:34:07 ]
プログラム的にmain関数内でforループの中で配列を宣言するのはどう思いま
すか?配列の領域がループ回数分かわるのでforループの中にいれたいのですが。


422 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 13:36:43 ]
>配列の領域がループ回数分かわる
ここが意味不明なので何とも言えない。

423 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 13:41:17 ]
forループの中で1ループごとにファイルを1つ読み込んで
そのファイルの行数を配列の領域としたいんです。
だからファイルをかえるとファイルの行数もかわり、領域もかわるというわけ
です。わかりにくいですか

424 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 13:44:09 ]
あーなるほど、言いたいことは判った。

配列って言うか、動的メモリ領域の話ね。
ループ外で全く使わないなら、ループ内で定義していいんじゃない?
つーか、そうすべきだと思うけど。
# 但し、殊にCではアナクロ的に関数の先頭で全てのローカル変数を宣言しないと気が済まない人もいるから注意。

425 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 13:55:16 ]
ただそのときに
その配列の前にファイル読み込んで行数確認して
配列の領域確保して
またファイル読み込んでそこの配列に代入というプログラムにしてるんです。
無駄にファイル読み込んでるとかいわれそうだけど。

最初に全てのファイルの領域を確保する
配列を定義してもいんですが、その行数をまた違う配列でも使うので、
それは避けたいんです。

426 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:04:46 ]
ファイルの二回読み自体は仕様的に問題ないなら構わないと思う。
しかし、寧ろそれだけ複雑ならループ内を全部別関数にするべきじゃないのか?
main()はあくまでもコマンドラインとのI/Fだと思うんだが。

427 名前:デフォルトの名無しさん [2007/10/16(火) 14:06:45 ]
STLなら自動拡張する

428 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:20:06 ]
まあそうなんですけど。
今つくってるのは1つのファイル(これを入力)に対して
forループ回違うファイルを読み込んで処理して
それぞれファイルでの値を出して一番高いものを出す。
その一番高いものが入力と合ってたら正解みたいなプログラムなんですけど。
これをmain関数内でやってるわけなんですが、
入力が複数として、この複数の入力の中で正解がいくつあるかって最終的には
したいんです。

今のmain関数も別関数として
入力をいれる処理をmainとして、元のmain関数において正解のものを
returnさせて正解率を出すべきですよね?


429 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:27:02 ]
抽象的に過ぎてよく判らんw

こんなもんじゃないのかな?
main()
{
問題処理();
}

問題処理()
{
統括ファイル読み込み();
for () {
個別ファイル処理();
if (正解判定()) {
正解処理();
}
}
}

430 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:32:14 ]
んなもんですね。。ありがとうございます。
mainから問題処理のところを手作業でやってもいんですけど
入力データが100くらいあるから手作業だとだるすぎるので。
今求められてるのは正解率ですから。しかし何かの機械の実装って本当にめん
どくさいね。まだ社会人じゃないから実情は知らないけど。




431 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:33:04 ]
オジサンの弱った頭には、ややこしくて理解できん。
話を整理してもらえないか。

432 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:36:26 ]
宿題スレじゃないんだし、エスパーごっこはそろそろ終わりでいいんじゃないか?
>430だって>429までの流れを踏まえて少しは自分で頭を使いたいだろうし。

433 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:44:07 ]
もうforループの中で配列宣言つかっていいてのと
ファイル2回読みはOKかどうかもわかったので失礼します

434 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 17:55:42 ]
まあ、ファイルのクローズと、領域の解放を忘れなければどうでも良いんじゃね

435 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 18:48:47 ]
若い人は記憶力まかせにしても破綻しにくいからのぉ。

わしも小学生の頃は、
恐ろしくスパゲッティなコードを書いていたが、
ちゃんと把握できていたので何ら問題なかったな。

いまではもう無理。

436 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 18:51:02 ]
若いのにRAIIとかエディタの支援機能に頼りまくりで記憶力低下中だけど
元からそんなに記憶力良い方じゃないから問題ないか

437 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 18:51:59 ]
ここは自分のダメな所を書くスレになりました

438 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 18:57:10 ]
若くても、頭脳を有効に使うために、スマートなコードを書くべき。

439 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 20:59:21 ]
Cの配列宣言って要素数に定数じゃなくて変数って使えないんじゃ?
動的な領域確保したい時はCはmallocに頼るしかないはずだと記憶していたのですが?
覚え間違いかな…?

># 但し、殊にCではアナクロ的に関数の先頭で全てのローカル変数を宣言しないと気が済まない人もいるから注意。

これはブロック({}で囲まれた部分のこと、正式な呼び方知らない)の先頭でしか変数の宣言を許さないCの制限のせいでしょう
C++ではこの制限がないからbetterCとしてC++を使っているなら関係ない話ですが

440 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 21:47:30 ]
>>439
その制限は関係ないよ。

関数の先頭でしか変数宣言すべきではないという石頭の連中は、
制限がないC++においても、同様のルールを主張していたりするから。




441 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 22:16:45 ]
>>439プ

442 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 22:23:16 ]
>>439
>Cの配列宣言って要素数に定数じゃなくて変数って使えないんじゃ?
C99なら出来る。C89はムリ

443 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 11:22:34 ]
C言語の入門書を読んでたら、getsやscanfは使うなとか、fgetsを使えとか
ややこしいですよね。デリミタで区切られたデータ列を読み込む必要がある
んですが、呼び側のコードをシンプルにするため、こんな関数を作ってみま
した。下記のように使うのですが、何かマズいところはないでしょうか?
今のところ一応動いているのですが・・・

 char s[128];
 FILE *p = fopen("hoge.txt", "rb");
 if (ReadData(p, s) == 0) break;

/*********************************************************************
 ☆ファイルから1単位読み込んで文字列として返す
  デリミタで挟まれた文字列を1単位とする。
  int IsDelimiter(int c)はデリミタなら1、そうでなければ0を返す
  空のフィールドは存在しないものとする。
*********************************************************************/


444 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 11:23:47 ]
int ReadData(FILE *p, char *s)
{
int ex, c, ip;
/* 非デリミタ文字が現れるまで読み飛ばす */
ex = 0;
while (ex == 0){
c = fgetc(p); if (c == EOF) break;
if (IsDelimiter(c) == 0) ex = 1;
}
if (ex == 0) {
s[0] = '\0'; return 0;
}
else {
s[0] = (char) c;
}

/* デリミタが現れるまで,文字列を積み上げる */
ip = 1;
ex = 0;
while (ex == 0){
c = fgetc(p); if (c == EOF) break;
if (IsDelimiter(c) == 1) {
ex = 1;
}
else {
s[ip] = (char) c; ip++;
}
}
s[ip] = '\0';
return 1;
}


445 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 12:31:33 ]
128文字以上を入力するとマズい

getsを使うなってのは、読み込む最大文字数を指定できないからで、入力ファイルに予想より長い文字列が現れたら致命的
代わりにfgetsを使えってのは、fgetsは最大文字数を指定できるので、どんな入力が来ても死ぬことはない
>>444 の関数はそれと同じ問題を孕んでいる

ユーザに127文字までしか入力してはいけないといくら言い聞かせてみたところで、禁止されるとやりたくなるのが人というものだし、
そうでなくてもついうっかり文字数制限を忘れてしまうこともあるだろうし、プログラムはどんな入力が来ても安全なように作っておくべき

446 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 12:56:45 ]
>>444
ReadDataにsの要素を渡して文字数のチェックをちゃんとすればおk
てかex変数が無駄に見える……

447 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 12:57:32 ]
間違えた、sの要素数を、ね

448 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 13:52:11 ]
ofstreamはdeleteした際には自動的にcloseされるますか?

449 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 16:56:00 ]
yes yes yes

450 名前:444 mailto:sage [2007/10/17(水) 21:22:36 ]
レスありがとうございます。

>>445
>128文字以上を入力するとマズい

実装時には、バッファ長を1kB位取ってごまかしちゃうつもりでしたが、
言われてみればその通りですね。変数ipをチェックすればいいので、
バッファがあふれたらエラーを返すコードを追加しようと思います。

>>446
>ex変数が無駄に見える……

やっぱり?
ループの脱出条件をコーディングしながら決められるので、ついつい
やっちゃいます。こんな場合は、

  while ( (c=fgetc(p) != EOF ) {

とか書くもんなんでしょうか?




451 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 22:24:27 ]
>>450
exが無駄って言ったのは、
ループ中途脱出(break)を判別するためだけに使ってるように見えたから。
あれならwhileループ後のif文をそのままwhile内にぶちこめば、
ex使わないでいけそうだったし。
まあ、分かりやすく書けば良いと思うので、聞き流して結構です

do {
if( (c=fgetc(p)) == EOF ) {
s[0] = '\0';
return 0;
}
} while (IsDelimiter(c));
ループ終了条件を>>450みたくデリミタでなくEOFにすると、
この場合はreturnするために別にまたif文書かないといけないから、無駄そう

452 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 22:50:46 ]
C言語なんだから、関数ばしばし作ろうよ。

・デリミタもしくはEOFまで読み飛ばし、最後に読み飛ばした文字を返す
・デミリタまで文字列を格納する
という2つの関数を作ればスッキリするよ。


453 名前:444 mailto:sage [2007/10/17(水) 22:59:06 ]
>>451
>whileループ後のif文をそのままwhile内に

む。なるほど。
こちらの方がシンプルですね。

プログラムをできるだけ愚直に書こうと努力しているつもりですが、
スマートな解を示されると感動しちゃいます。勉強になりました。

>>452
>関数ばしばし

実装フェーズでは、そうなっちゃうかもしれません。
ただ、データ読み出しの関数なので、恐らく何万回も呼ばれる
ことになると思います。
実のところ、こんな冗長な関数を作るべきか、まだ悩んで
いるんです・・・


454 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 23:09:09 ]
何万回程度の関数呼び出しコストなんて屁でもないぞ


455 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 23:15:46 ]
というかこれでいいと思う

int ReadData(FILE *p, char *s){
int c, ip=0;

while( (c=fgetc(c)) != EOF)
if (IsDelimiter(c))
s[ip++] = (char) c;

s[ip] = '\0';
return !!ip;
}

456 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 23:21:41 ]
いいのか、ほんとに。

457 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 23:29:45 ]
なんでいいのか判らん・・・


458 名前:455 mailto:sage [2007/10/17(水) 23:32:29 ]
あ、すまん、所々ミスってる上にそもそも動作が違うなw

これでどうだ

int ReadData(FILE *p, char *s){
int c , ip=0 , flag=0;

while( (c=fgetc(p)) != EOF ){
if (flag){
if (!IsDelimiter(c)) s[ip++] = (char) c;
else break;
} else if (IsDelimiter(c)) flag=1;
}

s[ip] = '\0';
return !!ip;
}

うーん、あんまりスマートじゃない……

459 名前:455 mailto:sage [2007/10/17(水) 23:34:58 ]
>>456-457
いや、IsDelimiterの戻り値を勘違いしてた上に、
そもそも動作を全く勘違いしてたw

これならわざわざ書き直す必要なかったですね……
偉そうにでしゃばってすみませんorz

460 名前:444 mailto:sage [2007/10/17(水) 23:44:46 ]
各位殿

色々ご指導ありがとうございました。
とりあえず仮決めですが、下記のようにすることにしました。
色々いじったら、仕様が変わっちゃった・・・

>>454
ちょっと安心しました。

>>455
読み込み長を返すアイデア頂きました。
ありがとうございました。




461 名前:444 mailto:sage [2007/10/17(水) 23:45:24 ]
int ReadData(FILE *p, char *s)
{
int c, ip;

/* 非デリミタ文字が現れるまで読み飛ばす */
do {
if ( (c = fgetc(p)) == EOF ) {
s[0] = '\0';
return 0;
}
} while (IsDelimiter(c) == 1);
s[0] = (char) c;

/* デリミタが現れるまで,文字列を積み上げる */
ip = 1;
while (1) {
if ( (c = fgetc(p)) == EOF ) break;
if ( IsDelimiter(c) == 1 ) break;

s[ip] = (char) c;
ip++;
if (ip >= MAXBUFSIZE) {
ip--;
s[ip] = '\0';
return -ip;
}
}
s[ip] = '\0';
return ip;
}


462 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 23:58:02 ]
自分なら、↓こんな感じかなぁ。

int ReadData(FILE* pFileIn, char* strOut) {
*s = '\0' ;
int countDelimiter = 0 ;
int countOutput = 0 ;

while(1) {
int c ;

c = fgetc(pFileIn) ;
if (c == EOF) break ;

if (IsIsDelimiter(c)) {
++countDelimiter ;
if (countDelimiter ==2) break ;
} else if (countDelimiter == 1) {
*strOut = (char)c ;
++strOut ;
}
}

return countOutput ;
}


463 名前:462 mailto:sage [2007/10/17(水) 23:58:45 ]
おっと、間違った。

int ReadData(FILE* pFileIn, char* strOut) {
int countDelimiter = 0 ;
int countOutput = 0 ;

while(1) {
int c ;

c = fgetc(pFileIn) ;
if (c == EOF) break ;

if (IsIsDelimiter(c)) {
++countDelimiter ;
if (countDelimiter ==2) break ;
} else if (countDelimiter == 1) {
*strOut = (char)c ;
++strOut ;
}
}

*strOut = '\0' ;
return countOutput ;
}

464 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 00:14:00 ]
countDelimiterで制御するのですね。
ちょっとトリッキーかな・・・


465 名前:462 mailto:sage [2007/10/18(木) 00:22:08 ]
やりたい処理を素直に書いただけなんだけどなぁ・・・。

466 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 00:35:46 ]
文化が違うのがオモロイなぁ・・・

467 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 01:16:12 ]
int ReadData(FILE *fp , char *out , int n){
int c , i=0;

while(i<n-1){
c = getchar(fp);
if (c == EOF || (IsDelimiter(c) && i != 0)) break;
if (!IsDelimiter(c)) out[i++] = c;
}
out[i] = '\0';
return i;
}

468 名前:デフォルトの名無しさん [2007/10/20(土) 22:47:48 ]
エラーメッセージを出力するところなんですが、

#define ABC "ABCの時のエラーメッセージ"

などと定義しておいて、エラーメッセージの出力関数には、
エラーコードの「ABC」のみを引数で渡すようになっています。
ただの文字列に変換する場合はこれでよかったんですが、
エラーの時に出た数字もエラーメッセージに含める場合も追加されました。
その数字は、書式指定(%dとか%lfとか)なので、同じようにマクロで
文字列を生成しようとして、つまづいてしまいました。

こんな感じで書いてみたんですが、当たり前だけどstrをどこで定義すれば
よいのかがわかりません。

#define ABC(gStr) sprintf( str, "ABCの時のメッセージ( %g ).", gStr )

引数なしの時と同じように、文字列(str)をそのまま生成するには
どう書いたらいいですか?

469 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 23:28:42 ]
>>468
> エラーコードの「ABC」のみを引数で渡す

あなたは自分がやっていることを理解してない。
ABCはエラーコードなんてものではなく、文字列リテラルへのポインタ。
なお、複数の同じ内容の文字列リテラルが1つにまとめられることは保証されていない。

そして、マクロが何者なのか、理解していない。
いまのコンパイラはプリプロセッサが統合されているので、わかりにくいが、
ソースコードは、プリプロセッサによってマクロが展開された後に、コンパイルされる。
マクロは「定義」するものだが、その定義とは、日本語の定義とは意味が異なる。

> strをどこで定義すればよいのかがわかりません。

エラーはネストするの?
シングルスレッドとマルチスレッド、どっち?


470 名前:469 mailto:sage [2007/10/20(土) 23:35:01 ]
ああぁ

呼び出し側の関数にエラーコードとして返したりせず、
エラーメッセージを出力する関数にしか渡さないのなら、
適当に自動変数で持てばいいと思うよ。

CとC++どっち?



471 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 00:00:21 ]
>>468
#define ABC(gStr) "ABCの時のメッセージ("#gStr")"

ってgStrが変数なのか
知らね

472 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 00:21:50 ]
基本的なことが理解できてない人に、
場当たり的に教えるのは、
効率が悪すぎる。

473 名前:デフォルトの名無しさん [2007/10/21(日) 00:42:22 ]
468です。いくつかのご回答、ありがとうございました。
>>469
自分のしていることを、自分で理解していないのかもしれません。
> エラーコードの「ABC」のみを引数で渡す
は間違いで、エラー出力関数への引数には、文字列になります。
エラーはネストしません。また、シングルスレッドです。

>>470
C++です。
「適当に自動変数」というのは、文字列自動変数をエラーコード
毎にその場でベタにつくって、エラー出力関数に渡す、という感じでしょうか?

>>472
効率よく教わるためには、どの基本的なことを勉強すればよいでしょうか。




474 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 00:56:30 ]
>>473
ネストせず、シングルスレッドなら、str をグローバル変数にしてしまうのも可能。
簡単だけど、あんまり良いやり方ではないが、とりあえず最小の変更で済むかな。
strなんて短くてどこにでもありそうな名前は、変えるべきだよ。

> 「適当に自動変数」というのは、文字列自動変数をエラーコード
> 毎にその場でベタにつくって、エラー出力関数に渡す、という感じでしょうか?

そう。


475 名前:wolf ◆8VH3XAqjlU mailto:sage [2007/10/21(日) 11:00:52 ]
>>468
>>473
C++なら普通polymorphismを使いますが兎も角動かすには
#define ABC(i_code) { char str[256]; sprintf(str, "ABCの時のメッセージ( %d ).", i_code); printf("%s\n",str); }
ブロックについては www.geocities.jp/ky_webid/c/022.html

476 名前:デフォルトの名無しさん [2007/10/21(日) 11:47:16 ]
>>475
ありがとうございます。
実環境で確認してみます。

477 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 16:45:38 ]
おま・・・。
せめてdo-while

#define ABC(i_code) do{ char str[256]; sprintf(str, "ABCの時のメッセージ( %d ).", i_code); printf("%s\n",str); }while(0)

で、ソレは俺も質問見たとき考えたけど、マクロの意味というか役割というかが変わってるから、
「なんでエラーメッセージをマクロにしたいのか」が分からないと使えるかどうか分からなかった。

個人的には、ストリングテーブル的に↓とかで十分かな、と思う。

#define ABC "ABCの時のメッセージ( %s )."
(共通な文字列リテラルの切り出し。日本語版やら英語版やらを作るときに使う)

478 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 16:56:29 ]
>>477
do whileハックを使わないといけないのは、古いコンパイラ。


479 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 17:33:37 ]
>>478
それはすまない。俺の勉強不足のようだ。
ついては↓のコードがエラー無くコンパイル通るような
「新しいCコンパイラ」は何かを教えてくれないか?

#include <stdio.h>
#define macro(x) {puts(x);}

int main()
{
if(1) macro("str1");
else macro("str2");
return 0;
}


480 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 17:56:42 ]
>>479
そういう{}のないif文は、コーディング規約で禁止。



481 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 18:00:58 ]
マクロには;をつけないっていう選択肢はなし?

482 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 18:32:53 ]
どう考えてもバグの原因になるだろ。

483 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 18:58:42 ]
小細工禁止!

マクロによる関数もどきはダメ。
インライン関数やテンプレート関数を使うべし。

484 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 19:06:06 ]
コンパイルに5分かかるプログラムを作ったら一人前ですか

485 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 19:07:23 ]
そうだねえ。
再帰テンプレートとか作ると簡単に5分超えるね。
練習にはいいんじゃない?

486 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 19:10:36 ]
で、規約やら小細工やら良いんだけど

>do whileハックを使わないといけないのは、古いコンパイラ。
誰かコレを解説して貰えんか?
コンパイラの新旧が、マクロを括るブロックにdo-whileを使うことと
どう関係してんだ?

487 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 19:11:40 ]
勘弁してやれw 勘違いだろw

488 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 19:42:09 ]
制御文なしに中括弧だけを書くとエラーになるような古いコンパイラがあったんじゃないか。

489 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 20:31:08 ]
>>475
それだとABC(data);って書いたら駄目だわなw
#define ABC(i_code) do{ char str[256]; sprintf(str, "ABCの時のメッセージ( %d ).", i_code); printf("%s\n",str); }while(0)
こうだな
まあ受け売りだが

てか一回sprintf経由する必要はあるの?
#define ABC(i_code) printf("ABCの時のメッセージ( %d ).\n", i_code)
これじゃ駄目なんかいな

490 名前:489 mailto:sage [2007/10/21(日) 20:33:43 ]
やべ、俺リロードしなさすぎw
吊ってくるww



491 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 20:34:54 ]
エラーメッセージを生成するのと、表示するのは、分離したほうがいいと思う。

492 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 10:50:35 ]
つーか、元質はデバッグ出力関数に渡す引き数を生成したいんじゃないかな?
だとしたら、>475以下はダメだろう。

493 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 19:39:51 ]
C言語に関して質問です。
構造体の各要素に添え字を使ってアクセスすることはできないのでしょうか?

例えば
struct OBJ{
int x;
int y;
char c;
char str[10];
};

main()
{
struct OBJ tmp;
tmp.[0] ← xのこと
tmp.[1] ← yのこと
tmp.[2] ← cのこと
tmp.[3] ← str[]のこと
}

といった感じのことがしたいのです。実現可能な方法があれば是非お願いします。

494 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 19:43:42 ]
unionを使えば出来ないことはないけど、正直お勧めしない。

495 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 19:44:02 ]
C++なら・・・無理か。
型もバラバラだしな。
添え字に変数を使って

tmp.[i]

ってしたとき、何型で扱うつもりなんだ

496 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 19:44:13 ]
>>493
限定的にはunionを使えばできる。
ややこしくはなるがポインタをキャストしてもできる。
どちらにしろ、サイズの違う型を統一的には扱えない。

497 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 20:19:14 ]
>>493
なんで、そんな変なことをしたいの?


498 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 20:22:08 ]
テンプレートクラスでtemplate <Type T>のTにクラスを入れることが可能なのですか?
int型などを入れるメリットは分かるのですが具体的にどんなクラスを入れれば役に立つのか教えていただけないでしょうか?

499 名前:493 mailto:sage [2007/10/22(月) 20:29:47 ]
回答して下さった方々有難う御座います。
for文のインデックスを利用出来たらと思いました。
しかし型などが違うのでその都度場合わけをしないといけないので出来たとしても結局のところ手間は増えますね。

500 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 20:33:51 ]
>>498
可能です。
STLのvector<T> はTの配列と置き換えられる動的な再配置も可能なクラスですが
当然組み込み型以外でもvectorを使うことが出来ます。



501 名前:デフォルトの名無しさん [2007/10/22(月) 21:15:25 ]
float a;
a=1;
print("%d",a);
を実行すると
1072693248っていう数がでてくる。
これってどういうこと?

502 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 21:24:52 ]
>>501
言語およびコンパイラは何?
"%f" を使うべきである事は知っていて、なぜそうなるのかが知りたいということ?

503 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 22:53:01 ]
>>501
printfの引数の2つ目以降の型って決まってないよね。
だから、printfにとっては、どんな型の値を引数に渡されたのか、わからない。
そのため、書式文字列に%dとあれば、intだと思って処理するわけ。

504 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 22:54:09 ]
>>498
可能。

int型を入れるのと同じメリットが、stringクラスを入れるのにもあると思うのだが。
stringの配列なんて使う機会ないか? ないなら、まぁ仕方ない。

505 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 22:58:36 ]
list<vector<string> >
とかな。

506 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:28:17 ]
>>505
そんなこと、したことないぞ。

まず、stringのように重いものを、ポインタや参照ではなく値として持つvectorに格納するのが、乱暴だ。

次に、vector<string>を直にlistに格納するのも、乱暴だ。
vector<string>に何か意味があるのであれば、それなりのクラスにすべきだ。

507 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:35:45 ]
乱暴ってのが何を意味してるかわからんが、
別にstringは重くないしvector<string>も十分に速いぞ


508 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:36:17 ]
あほすぎる・・・

509 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:46:20 ]
>>506が何を言いたいのかワカンネ
乱暴ってどういう意味?
vector<string>を使うなって言ってるの?

510 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:57:05 ]
vector<string>を内包したオブジェクトつくって
インターフェースをきちんとしたオブジェクト指向な作り方しろってことか…。

C++だからって必ずオブジェクト指向で作らんでもいいだろ…



511 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 00:00:22 ]
>>506は「そんなこと、したことないぞ」と言っている通り、思い込みで書き込んでいるんだよ。

512 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 00:02:01 ]
vector<string> に何か意味をもたせるとして、所詮 vector 程度なら変数名で十分示せると思う。
vector<string> はオブジェクト指向だよ。

513 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 00:27:02 ]
>>507
それは実装依存だな。

どーでもいい場所なら乱暴なコーディングをしても構わないし、すべきだろうが、
重くないとか十分に速いとか言ってるようじゃ、C++使う意味がないんじゃないか。

>>509
文字どおりさ。
動けば何でもいい、そういうやりかた。

>>510
何らかの意味があるのだからtypedefすべきだし、
大抵の場合は何か付随したデータがあるわけで、
それと本体のvector<string>を別管理するのは、
不適切だと思う。

>>512
オブジェクト志向と言いながら、
BASICやスクリプト言語のように、型にルーズでどうしようもない代物を作る人を、見てきたわけだが。
彼らは万能ナイフを作ることに喜びを感じているようだが。

514 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 08:58:30 ]
ふ〜ん。君はそういう事に喜びを感じているんだね。

515 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 09:02:19 ]
そこでboost::ptr_vector, ptr_list
内部ではvoid*として保持されているためコードサイズ膨張対策にもなる
重いオブジェクトのコンテナならこれで決まり☆

516 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 10:21:21 ]
>>513 のやり方を推し進めたら、プログラム中に出てくる概念全部を
typedefなりクラス化なりすることになるな
アホとしか思えん

いちいち型を定義してたら型がむやみに大量発生するし、
そのせいでtypedefされた型の元の型がわからなくなって
どういう操作ができるのかいちいち調べる羽目になる

名前の一覧は vector<string> names; で十分
過度の抽象化は毒であると知れ

517 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 10:44:09 ]
>>516の書き込みをみて
VC++が頭をよぎった。
ふとよぎった。


518 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 10:50:52 ]
>>513は早すぎる最適化をやっちゃうタイプだな

519 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 10:51:54 ]
>>516
> 名前の一覧は vector<string> names; で十分

名前だけで単独なんだ・・・どういう場合?

520 名前:デフォルトの名無しさん [2007/10/23(火) 15:36:35 ]
スイッチを押すと外部割り込みでInterrupt関数が呼び出されて、スイッチを押した回数を数えて変数countに保存し、
タイマ割り込みで一定時間ごとにTimer関数を呼んで押した回数ごとに行動を変えるプログラムを作りたいです。
グローバル変数を使う以外に二つの関数の間でcount変数の値を渡す方法はありますか?



521 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 16:04:40 ]
つまり、二つの割り込み関数からそれぞれ設定と参照を行いたいわけだな。

グローバル変数の代わりに、それらの関数をメンバとして持つクラスを作ってそのメンバとしてcountを持てばいい。
勿論、そのクラスの生存期間に注意が必要。

522 名前:520 [2007/10/23(火) 16:23:07 ]
せっかく回答してくれたのにすみません。
C++ではなくCで行う方法を教えてください。

523 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 16:37:47 ]
>>520
設定も参照もどちらも割り込みルーチンから行なうのなら、
グローバル変数にしておくのが無難だがなぁ。
グローバル変数にしたくない理由は?

524 名前:デフォルトの名無しさん [2007/10/23(火) 16:44:44 ]
メインで変数作ってポインタ渡せば?
グローバルと同じような物だけど

525 名前:520 [2007/10/23(火) 17:49:50 ]
>>523
やはりグローバル変数がいいですか・・・。
プログラム作ってる途中でよくわからなくなることが多くて個人的にあまり好きじゃないだけです。

526 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 18:12:44 ]
>>520
gccなら関数内関数で外側のローカル変数を参照出来るはず。
グローバル変数以上に問題のあるコードかもしれんが。

527 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 19:13:25 ]
>>524
割り込み処理だと渡しようがないと思うんだ。

528 名前:wolf ◆8VH3XAqjlU mailto:sage [2007/10/23(火) 21:52:40 ]
>>520
>>525
1.割り込みマスク外した後ならsignal関数では?
2.共通の割り込みハンドラで割り込みを1箇所で受けられるかな?

529 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 07:25:37 ]
ここで聞いてよいのかわからないのですが・・・
CPadてVistaでも使えるものなんでしょうか?

とりあえず実行すると〜.exeが見つかりません〜てなエラーが出てきます。
これはOSとCPadとの相性が悪いのか、自分が何かミスを犯しているのか、どちらなのでしょう?

530 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 07:29:32 ]
調べてみたら自己解決できそうなので、自分で調べてみます。



531 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 07:32:45 ]
解決、スレ消費申し訳ありませんでした。

532 名前:デフォルトの名無しさん [2007/10/25(木) 16:20:24 ]
VCでコントロール(仮にオリジナルのペイントソフト)を作成して
それをVB.NETから呼び出して、VBで作成したインターフェース内に埋め込みたいのですが
VCで作ったものをDLLにまとめることくらいしか現在わかっていません。
何に対応(例えば継承させるクラス)させればよいのかなどおおまかに教えていただけないでしょうか?


533 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 16:23:09 ]
VBのスレで聞いたら?

534 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 18:26:14 ]
>>532
> 何に対応させればよいのか

> コントロール

自分で書いていて気がつかないとは。

535 名前:デフォルトの名無しさん [2007/10/25(木) 19:31:24 ]
ABのどっちが好き?

#include <iostream.h>
void f(unsigned int u){
 printf("%u", u);
}
main(int argc, char **argv){
 unsigned int u = 0;
 if(argc > 1){
A  u = static_cast<unsigned int>(atoi(argv[1]));
B  sscanf(static_cast<const char *>(argv[1]), "%u", &u);
 }
 f(u);
}

536 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 19:32:55 ]
lexical_cast<>

537 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 19:55:07 ]
qa3457974

538 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 01:33:48 ]
>>535
エラー処理してない点は同じなのでどちらも却下。

だ が 敢 え て 言 わ せ て も ら う

if(1 < argc){

だと!

539 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 06:44:04 ]
>>538
if(argc > 1)
より
if(1 < argc)
の方がいい理由も添えて書いてくれ。

540 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 11:33:39 ]
いまどきiostream.hって・・・



541 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 13:57:17 ]
.h

542 名前:デフォルトの名無しさん [2007/10/26(金) 14:13:27 ]
bf

543 名前:538 mailto:sage [2007/10/26(金) 17:15:12 ]
>>539
半分冗談だったんだけどね(^^; 適当に流して欲しかったんだけど。
単に俺のスタイルなだけ。

例えば、『aが1よりおおきくて、かつ10より小さい』という命題について

if(1 < a && a < 10)

と書くと、常に右が大きくなるでしょ。
完全に主観だけど、あとでソースを見返すとき分かりやすいんですよ。
(数学の)実数線も右が大きいし、なんとなくそういうクセをつけました。

それだけ。



544 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 17:36:45 ]
>>543
俺もそう書く
理由も同じ

545 名前:デフォルトの名無しさん [2007/10/26(金) 21:27:52 ]
vectorは「動的配列」という事なのですが、
これは、

void init_vct()
{
   vector< vector<int> > v;
   v.resize(3);
   for(int i=0; i<v.size(); ++i) v[i].resize(5);

   int array[] = { 0, 1, 2, 3, 4};
}

int main()
{
   init_vct();

   return 0;
}


としたときに、init_vct()関数を抜けても、
int型配列 arrayと違って、vector< vector<int> >型配列 vは、
メモリ上から消されないということですか?

//初歩的な質問で申し訳ありません。

546 名前:デフォルトの名無しさん [2007/10/26(金) 21:33:34 ]
消えるだろ ふつう

547 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 21:37:01 ]
>>545
関数中のvはスコープから抜ける時デストラクタが呼ばれ、
確保された領域は開放される。

v.push_back(i)などで、どんどん追加でき、
サイズが動的に拡張されていく配列。

548 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 21:57:37 ]
>>543
if( x==0xFF ) などと比較したいのに、誤って代入文 if( x=0xFF ) と
書いてしまう凡ミスを防ぐために変数を右に つまりif( 0xFF==x ) と
書くと良い みたいなことがドコカの本で書かれていた記憶がある

549 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 22:00:36 ]
>>548
ぱっと見て「ヘタだなぁ」と思うコード その6
pc11.2ch.net/test/read.cgi/tech/1193250955/l50
ここで今、思いっきりその話になってます。

550 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 22:33:42 ]
>>543
俺は『aが1よりおおき』いなら、

if(a > 1)

と書くな。『1がa未満』なら逆に書くけど。

俺も一時期>>543と同じ書き方してたけど、
仕事でプログラム書き始めてからは仕様書通りに書く癖が付いた。



551 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 23:35:50 ]
sscanf()はバッファオーバーフローがあるから
使ってはいけないんじゃなかったっけ?
普通atoi()だろ。

552 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 23:39:02 ]
どちらでも仕様書どおりだよ。

553 名前:デフォルトの名無しさん [2007/10/26(金) 23:50:21 ]
>>545です。
>>546さんありがとうございます。

以下のようなプログラムを書いたのですが、
正しく表示されるのはたまたまメモリに残っているせい?

#include<iostream>
#include<vector>
using namespace std;

class VEC{
  private:
  public:
    vector< vector<int> > vec;
    VEC(int num);
    VEC(){};
};

VEC::VEC(int num)
{
  vec.resize(3);
  for(int i=0; i<3; ++i) vec[i].resize(5);

  for(int i=0; i<vec.size(); ++i){
    for(int j=0; j<vec[i].size(); ++j){
      vec[i][j] = num+j;
    }
    num+=vec[i].size();
  }
}

554 名前:デフォルトの名無しさん [2007/10/26(金) 23:50:58 ]
class A{
  private:
  public:
    A();
    void Show();
    vector<VEC> v;
};

A::A()
{
  int j=0;
  for(int i=0; i<10; ++i){
    v.push_back(VEC(j));
    j+=10;
  }
}

555 名前:デフォルトの名無しさん [2007/10/26(金) 23:51:55 ]
void A::Show()
{
  for(int i=0; i<v.size(); ++i){
    for(int j=0; j<(v[i].vec.size()); ++j){
      for(int k=0; k<(v[i].vec[j].size()); ++k){
        cout << v[i].vec[j][k] << " ";
      }
      cout << endl;
    }
    cout << endl;
  }
}


int main()
{
  A aa;
  aa.Show();

  return 0;
}


556 名前:デフォルトの名無しさん [2007/10/26(金) 23:52:44 ]
>>553
関数抜けた時点で解放され、別の値に変わる可能性はある
ゴミ箱の中身消したけど復活できるかどうかと同じ事だ

557 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:04:16 ]
>>553-555
別にどこもおかしなようには見えないが、どこに問題があると思ってるの?

558 名前:デフォルトの名無しさん [2007/10/27(土) 00:49:51 ]
>>545です。
>>546
>>547
>>556
さんのご指摘もありますが、
newで確保されていないvector配列の中身(vector< vector<int> > vec)が、
最後まで保持されていること・・・
についてです。

vecはクラスの中で宣言はされているものの、
VEC()で代入される中身は局所的なもので、
VEC()を出たらvec配列の中身は、開放されるのかなぁと。

サイトで「vectorは"動的"配列」というのを目にしたのですが、
これは配列のサイズを"動的"に確保するだけで、
newのメモリの"動的"確保とは別物なのではないか?
と思ったので、試しています。

559 名前:デフォルトの名無しさん [2007/10/27(土) 00:51:53 ]
>>545です。
かなりトンチンカンなこと言ってると思いますが、
ご指導お願いいたします。m(_ _)m

560 名前:デフォルトの名無しさん [2007/10/27(土) 00:57:53 ]
>>559
クラス内の関数は、抜けても値は保持される 常識だろう vectorとか関係なし



561 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:59:15 ]
>>559
基本的なことが、いくつも、理解できていない気配がする。
泥縄的に教えてもしょーがないので、ちゃんとC++の基本を勉強したほうがいいよ、としか言えない。

562 名前:デフォルトの名無しさん [2007/10/27(土) 00:59:20 ]
オブジェクト指向っていうのは、データに対してあれこれ作業をするって事だ
あれこれ作業するごとにデータが消えていたら駄目だろ

563 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:00:16 ]
v.push_back(VEC(j));

VEC(j)はどこいっちゃったの?

ってこと?

564 名前:デフォルトの名無しさん [2007/10/27(土) 01:20:13 ]
>>545です。
みなさん、レスありがとうございます。

クラスの中でサイズを指定しないと配列の宣言てできませんよね。
もしコンストラクタの引数の値を配列のサイズにしたいときには、
データメンバに、
int a*;
を入れて、
コンストラクタの中で、
a=new int[コンストラクタの引数の値];
と(私は)します。

だから、私はvector配列をクラスのデータメンバとするときも、
配列のサイズを指定しないから、
どこかでnewすることでvector配列の領域を確保しなければ
ダメなのかぁと思ってしまったわけです。
newをせずに、ただ値を代入しただけでは、
局所な値を代入しているに過ぎないなどと思ってしまいました。

色々考えているうちに、頭の中がごちゃごちゃになってしまいました。
己の力の無さを改めて自覚しました。

565 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:31:07 ]
>>564
vectorの中でnew/deleteしてる。

566 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:32:02 ]
コンストラクタとデストラクタで何か表示するクラス作って
vectorにpush_backしてると何か閃くかもしれない

567 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:38:24 ]
クソッタレな本に引っかかってしまった可哀想な犠牲者なんだろうな。
きちんとした本を読んでいれば間違わないような誤解してるんだもの。

568 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:50:13 ]
これからプログラムを勉強する俺に是非教えてほしい。

ちょっとしたアプリケーションを作りたくて
なんとなく、適当に参考書見て、高校の頃少し勉強した、デルファイに似てるような気がしたから
VBの参考書買って、MSからVS2008bata2をダウンロードしてサンプルプログラムを作っては
自分なりに書き換えて違う結果を出力させたりと、少しずつ理解してきてる・・つもり。

けど、VBとC++はどのスレ見てもVBは糞ってよく見るんだけど、それはなぜですか?
自分は結構VBがなじんできてるしこの頃。。
実際、プログラムの組みやすさ、軽さ、ほか色々。
ここで聞くのはどうかと思うけど、できれば教えてほしい

もし、VBはやめとけ!と言うならばお勧めの言語を教えていただきたい。

569 名前:デフォルトの名無しさん [2007/10/27(土) 01:54:18 ]
すいません、教えていただけないでしょうか。

C言語で、2つのスレッドが交互にグローバル変数を参照→インクリメントして、
決められた値になったら終了する。という処理を作りました。
ここからグローバル変数を用いずにスレッド間でデータを渡しあうことで同様の処理を
実現したいのですが、どうすればいいでしょうか。

自分で調べたところ、スレッド間ではお互いのメッセージキューへ格納→読み出しを行えば
データを渡せることがわかったのですが、見当違いな考えかもしれません…。
どのような方法・関数を用いればいいか、ご教授のほど宜しくお願いします。

570 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:59:25 ]
OSぐらい書けよ



571 名前:デフォルトの名無しさん [2007/10/27(土) 02:02:14 ]
>>570
申し訳ありませんでしたorz
作成環境は以下のとおりです。

OS:Windows XP
コンパイラ:Microsoft Visual C++ 2005 Express Edition

572 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:03:22 ]
VBが糞と言われる理由

1. VB自体ではなく、VB使いが糞であるため
2. VBでプログラミングを勉強すると糞になるため
3. VBが適切な手段の場合には良いが、そうではないのにVBを使う糞がたくさんいるから
4. VB.NETではないVBは既に終わっており、なおかつ、VB.NETをやるならC#をやるべきだから

573 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:05:35 ]
>>569
質問が抽象的すぎる。
もっと具体的に詳しく。

また、なぜ、グローバル変数をやめようと考えているのか、その理由も。

574 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:16:09 ]
  ∧_∧ クワッ!
 ∩`iWi´∩ 
 ヽ |m| .ノ
  |. ̄|
  U⌒U

575 名前:デフォルトの名無しさん [2007/10/27(土) 02:17:26 ]
>>574
それ何か可愛いな。

576 名前:デフォルトの名無しさん [2007/10/27(土) 02:25:48 ]
>>573
色々と足りない部分が多くて申し訳ありません。
初心者の為、処理が的確ではないかもしれませんが現在の処理は以下のとおりです。

unsigned __stdcall thread0(void *lpx)
{
 /*排他制御にミューテックスを使っています*/
 HANDLE hM;
 hM = *(HANDLE*)lpx;

 while ( 100 > nCnt )
 {
  WaitForSingleObject( hM, INFINITE );
  nCnt++;
  printf("nCnt = %d", nCnt);
  ReleaseMutex( hM );
 }
 printf("thread0 END");
 return 0;
}

これと同様の処理を行うスレッドがもう一つありまして、
交互にグローバル変数nCntをインクリメントして、100になったら終了させるようにします。
このnCntをグローバル変数ではなく、ローカル変数にしてスレッド間で値を渡し合うことで、
同様の処理ができるようにしてみたいのです。

グローバル変数を使わない理由ですが、現在C言語を勉強中で、
様々な処理方法を試してみたいと思ったからです。

577 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:33:47 ]
そのスレッドに渡すlpxでミューテックスと一緒に共有したいデータを渡すとか。

struct thread_data {
HANDLE hM;
int nCnt;
};
unsigned __stdcall thread0(void *lpx)
{
struct thread_data *data = lpx;
 /*排他制御にミューテックスを使っています*/
 HANDLE hM;
 hM = data->hM;

while ( 100 > data->nCnt )
以下略

578 名前:573 mailto:sage [2007/10/27(土) 03:03:46 ]
>>576
なるほど。文字どおりの処理をしていたのね。ごめん。

まず、そのプログラムには重大な問題がありそう。

それはともかく、
スレッド毎にメッセージ・キューを持たせて、相互にメッセージを送り合う
ということだと、まず、最初の選択として、
Windowsが提供してくれるメッセージ・キューを使うのか、
それ以外のメッセージ・キューを使うのか、
というのがあるが、とりあえず前者の方向で。

Win32APIのPostThreadMessageを使う。
まずは、MSDNライブラリ等でPostThreadMessageの解説を見よう。

579 名前:デフォルトの名無しさん [2007/10/27(土) 03:04:25 ]
>>577
ご助言ありがとうございます。
ただ、私が今回試してみたいのはスレッド間通信?というものになりそうなんですが、
このコードがそういった処理になるのでしょうか。
サンプルコードが分かり辛いと思うので、自信がありません…。

580 名前:デフォルトの名無しさん [2007/10/27(土) 03:07:12 ]
>>578
ありがとうございます。
エラー処理や組み方自体についても、学ぶべきことが多いですorz

PostThreadMessageについて、早速見てみます。



581 名前:573 mailto:sage [2007/10/27(土) 03:14:26 ]
ついでに>>576のプログラムの問題点と解決方法を。

まず、コンパイラの最適化の問題。
変数nCntの宣言にvolatileを付けていますか? 付けていなければ、付けること。

次に、100 > nCnt の比較が、排他制御の外にあること。
nCntに触っていいのは、排他制御の内側だけ。


582 名前:デフォルトの名無しさん [2007/10/27(土) 03:28:55 ]
>>581
たしかにこれでは…色々と参考になりました。

MSDNライブラリで調べたところ、
PostThreadMessage関数でデータをポストして、
GetMessage関数でポストされたデータを取得することで、
スレッド間でデータをやりとりできそうなので、早速試してみます。

ご助言いただいた方々、本当に有難うございましたm(_ _)m

583 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 16:47:47 ]
>>545です。
>>554
のA()で、

A::A()
{
  int j=0;
  for(int i=0; i<10; ++i){
    v.push_back(VEC(j));
    j+=10;
  }
}

としているのですが、ここで作られるVEC型オブジェクトは、
局所的なもので、寿命はfor 1回分の間だけですよね?
コンストラクタが呼ばれた直後にデストラクタが呼ばれるので、

vector<VEC*> v;
と宣言を直して、
A()では、
v.push_back(new VEC(j));
としなければダメですか?

何度も申し訳ないです。

584 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 16:55:04 ]
VEC(j)のコピーがvector内に追加される

585 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 16:59:02 ]
> コンストラクタが呼ばれた直後にデストラクタが呼ばれるので、
ただし、Aのvector<VEC> v;は、v.push_backの内部で、
引数を使ったコピーコンストラクタを使い、勝手に保持する。

vector<string> v;でv.push_back("ababa");と渡しても、
const char *pを受け取って内部で string(p) のようにして保持する。

> vector<VEC*> v;
> v.push_back(new VEC(j));

のようなことをするのなら、Aのデストラクタで、
push_backの所でnewしたぶんをdeleteしてやる必要がでてくる。



586 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 16:59:51 ]
かぶったorz

587 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 18:34:43 ]
>>583
基本ができてなさすぎ。
ちゃんと勉強して出直せ。

588 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 20:26:59 ]
>>583
いろいろごっちゃになっているようだが、
・関数内で宣言されたオブジェクトは関数が終わったら破棄される
と言われて、
関数が終わったらvectorの中身が壊れるのでは、と疑問を持ったみたいだけど、
この場合は関数へ渡す引数として宣言した「一時オブジェクト」なので問題ない。
そうでなくても、vectorは要素を「コピー」して保持するので、
元のオブジェクトが破棄されても何ら問題はない。

589 名前:588 mailto:sage [2007/10/27(土) 20:31:56 ]
間違えた、俺がごっちゃになってるorz
書き直すと、

関数内で作ったオブジェクトをvectorに入れたら、
関数を抜けた時にそのオブジェクトが破棄されてvectorの要素が無効になるのでは、と疑問を持ったみたいだけど、
この場合はvectorへ渡す要素として宣言した「一時オブジェクト」なので問題ない。
そうでなくても、vectorは要素を「コピー」して保持するので、
元のオブジェクトが破棄されても何ら問題はない。

590 名前:588 mailto:sage [2007/10/27(土) 20:34:03 ]
ああ、いや、一時オブジェクトは関係ないか、結局破棄されるんだから

とにかくvectorはコピーコンストラクタ呼び出してコピーしてるので、
元のオブジェクト破棄しても問題ない



591 名前:588 mailto:sage [2007/10/27(土) 20:42:08 ]



592 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 20:47:52 ]
ややこしく考え杉。

int g_c ;

void funcA(int& a) {
int b = a ;
g_c = a ;
}

void testA(void) {
int x = 3 ;
funcA(x) ;
}

これと同じよ

593 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 21:33:41 ]
フフフフフフハハハハハハ

594 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 23:07:18 ]
int ary[2] = { 1000 , 2000 };
int *po;

po = &ary[0];
printf("po\t = %x\n" , po);
printf("*po++\t = %d\n" , *po);
po++;
printf("po++\t = %x\n" , po);
printf("*po++\t = %d\n" , *po);
*po++;
printf("po++\t = %x\n" , po);
printf("*po++\t = %d\n" , *po);

これで最後の方で*poに1を加えてるつもりなのですが、変な値になって
*po+=1だと大丈夫です

*poはポインタの中身だと今まで思ってたのですが、、、、なんでなのでしょうか

595 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 23:09:12 ]
(*po)++;

釣りなんだろうけど

596 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 23:21:37 ]
理由のところ、教えてくれませんか

なんで()つけないとダメなのか。
というか中身にアクセスするときは()つけた方がいいんでしょうか

597 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 23:28:44 ]
>>596
演算子の優先度

598 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 04:23:38 ]
*po++ は *(po++) という意味だから、だな

599 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 04:48:37 ]
俺は演算子の優先度の表を暗記するだけの頭脳がないので、
決して、
*po++ ;
なんてコードは書かない。
他人が書いたのを読まないといけないときは、優先度の表を見て確認する。

そもそも、後ろに++を付けるのは特別なときだけだし・・・。

600 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 13:39:19 ]
*++p



601 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 13:40:46 ]
++(*po);

602 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 20:56:27 ]
>>601
括弧イラネ

603 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 21:02:43 ]
優先順位覚えてないから付けといて

604 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 21:33:35 ]
左側に単項演算子二つで優先順位も糞もないだろ

605 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 21:52:24 ]
むしろ全ての演算子を単項演算子にすれば頭で思い浮かべたものをキャレットを一々前後させずに一気に書ける

606 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 21:55:25 ]
>>605
それって何て逆ポーランド記法?

607 名前:デフォルトの名無しさん [2007/10/28(日) 23:15:58 ]
★改行が多すぎと言われたので、何度かにわけます。

構造体Sのvectorがあって、SのメンバdoubleDataに関してfindをしようとしています。
(#include <algorithm>しています)

struct S{
string strA;
int intData;
double doubleData;
};

findを使っているところは、こんな感じです。
vector<S>::iterator it;
it = find(VecTest.begin(), VecTest.end(), 1.7);
cout << (*it).doubleData << endl;


608 名前:デフォルトの名無しさん [2007/10/28(日) 23:16:34 ]
★続き

Boland55で、以下のようなエラーが出ます。

エラー E2094 c:\Borland\Bcc55\include\algorith.cc 72: != 演算子が使われたがクラ
ス S では double 型のための定義が存在しない(関数 find<S *,double>(S *,S *,const
double &) )
警告 W8057 c:\Borland\Bcc55\include\algorith.cc 75: パラメータ 'last' は一度も使
用されない(関数 find<S *,double>(S *,S *,const double &) )
警告 W8057 c:\Borland\Bcc55\include\algorith.cc 75: パラメータ 'value' は一度も
使用されない(関数 find<S *,double>(S *,S *,const double &) )
*** 1 errors in Compile ***


609 名前:デフォルトの名無しさん [2007/10/28(日) 23:17:24 ]
★続き

ちなみに、以下のような演算子オーバーロードをしているのですが、
何がよくないのでしょうか。
bool operator == ( const S& left, const S& right )
{
return left.doubleData == right.doubleData;
}

bool operator != ( const S& left, const S& right )
{
return left.doubleData != right.doubleData;
}



610 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:32:46 ]
find には 1.7 じゃなくて S を渡さんといかんのでは?



611 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:34:03 ]
struct has_double
{
bool operator()(const S& s, double d) const
{
return s.doubleData == d;
}
};

find_if(VecTest.begin(), VecTest.end(), has_double(1.7));

612 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:36:44 ]
まちがった

struct has_double
{
double d;

has_double(double d)
:d(d)
{}

bool operator()(const S& s) const
{
return s.doubleData == d;
}
};


613 名前:デフォルトの名無しさん [2007/10/28(日) 23:44:17 ]
>> 612さん

コンパイル、通りました!すごい!!
でも全く解読できましぇん。
一語一句の意味をこれから勉強します。。。


614 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:55:56 ]
>>612
テンプレート使って、

template<double value>
struct has_double
{
bool operator()(const S& s) const
{
return s.doubleData == value;
}
};

find_if(VecTest.begin(), VecTest.end(), has_double<1.7>);

ってのではダメ?

615 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 00:00:45 ]
はは
定数だからね

616 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 00:13:48 ]
もっと簡潔・明瞭に書く方法ないのかなぁ。


617 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 09:53:08 ]
C++勉強しはじめてリファレンスを知って、
ポインタ使うよりずっといいじゃないですかって気分なんですが、
関数の引数としてリファレンス使うときに、

void hoge(int* out1, int* out2); //out2の出力が必要ない場合はout2としてNULLを渡す

のような仕様はリファレンスでは実現できないってことなんでしょうか?
毎回ダミー変数宣言して渡すのも馬鹿らしいし。

618 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 12:44:05 ]
>>617
どうしてもやりたかったらこういう手はどうだろう。
--
int dummyOut;

void hoge(int & out1, int & out2 = dummyOut)
{
if (& out2 != & dummyOut) {
out2 = someOutput;
}
}
--
ダミーは必要だけど、毎回じゃないし使わないときは出力処理を回避することもできる。

619 名前:かぜひいてます←寝てろ mailto:sage [2007/10/29(月) 13:39:10 ]
>>617
ダミー変数を渡すのがバカらしいのなら、ポインタ渡しのままでいいのでは?

参照は、結局ポインタ渡ししてるだけだから、組み込み型を渡すときはあまりメリットがない。
しかも、ポインタ渡しでも上手に組めば代入するのは1、2ヶ所だから読みにくくも無い。

俺のスタイルとしては、値を返すときは参照型ではなくポインタ渡し。

参照型が活きるのはクラス等を渡すとき。
void hoge(vector<char>& ref_v);
void hoge(const vector<char>& ref_v);

メンバアクセス演算子( . -> )がオーバーライドされてる場合でも深く考えなくともよい。


620 名前:619 mailto:sage [2007/10/29(月) 13:44:56 ]
>>618
それも一応考えてみた。他にもオーバロードって手もあるよね。



621 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 14:30:48 ]
int val = 100;
val = val++;
int result = val;

このとき、result はいくつになりますか?
また、処理系に依存せず、同じ値になりますか?

622 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 14:44:58 ]
>>621
www.kouno.jp/home/c_faq/c3.html#3

623 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 14:47:49 ]
>>622
おぉ。ファック。
なんてこった。
ありがとう。

624 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 14:57:30 ]
ファックしてもいい?

625 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 00:59:37 ]
>>572
超遅レスで申し訳ない。

VB自体は糞というわけではないのか。。

もし、また改めて勉強するとするならば、VisualC++とVisualC#はどちらがお勧めですか?
もちろんどんな物を作るか、目的は何か、ってのが決まっててこそ選ぶのかもしれないけど、
もし、将来性等考えたらどっちになります??


626 名前:デフォルトの名無しさん [2007/10/30(火) 01:01:04 ]
VisualC#

627 名前:625 mailto:sage [2007/10/30(火) 01:06:12 ]
検索したらいっぱい出てきたんでとりあえず色々眺めて決めます。


・・とおもったらレスがついてた。
>626
なぜですか?よかったら教えてほしいです。

628 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 01:26:32 ]
自動車に例えるなら、

C# → トヨタ自動車本社の設計技術者
C++ → トヨタに部品を収めている協力会社の設計技術者

そういう感じ。

629 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 01:41:21 ]
…え。

630 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 06:09:37 ]
C# → Windowsユーザー
C++ → マイクロソフト



631 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 10:29:36 ]
>>628
確かに C++ の方がスキルが必要だから間違ってないね。

632 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 10:36:13 ]
.NET Frameworkって「のり」があるからC#, C++, F#とどれも使えるのが一番だね
状況に応じてシームレスに言語を選択できる開発環境ってのはかなり美味しいだろう
さらにPowerShellスクリプトも使えば窓も*nix系に匹敵するかなり強力な環境になると思う

633 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 12:24:06 ]
んじゃ、
C→町工場の工員
こんなかんじか?

634 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 13:09:12 ]
C→拡張しすぎてわけがわからなくなった、おじいちゃん技術者


635 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 15:43:19 ]
質問させてくださいー・・・。

Visualstudio2005のC++でCのソースをコンパイルしているんですけど、
off_t strip_offset, data_offset, curve_offset;
off_t thumb_offset, meta_offset, profile_offset;
の2行で構文エラーって出るんです。

error C2061: 構文エラー : 識別子 'strip_offset'
error C2061: 構文エラー : 識別子 'thumb_offset'

ココだけ見てもわかんねーよって感じでしょうか・・・。
なんとなく原因が雰囲気でも分かれば教えてください。


636 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 15:47:08 ]
>>635
off_tのtypedefを探して貼れ

637 名前:635 mailto:sage [2007/10/30(火) 16:11:04 ]
レスありがとうございます。

typedef、存在しないみたいです。
設定しなきゃ駄目ですか?

638 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 16:14:16 ]
typedefが存在しないわけがなかろう。
off_tは予約語じゃないぞ。

639 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 16:16:33 ]
それか、struct off_t strip_offsetとして使うべきものかも。

640 名前:635 mailto:sage [2007/10/30(火) 16:21:06 ]
>638
off_t、ココにしか出てこない上にtypedefってのも無いんです。
元々Linux用(?)に書かれたソースらしいんですけど、そっちではちゃんと動いているみたいなんですけど・・・。
すみません、いまいちよく分かってなくて。とにかくtypedefしなきゃ駄目って事でしょうか。

>639
struct off_t strip_offsetみたいにしてみたんですけど、、エラーが出ちゃいますね・・・。
「error C2079: 'strip_offset' が 未定義の struct 'off_t' で使用しています。」
だそうです。



641 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 16:26:44 ]
>>640
じゃあそのソースがインクルードしているソースやヘッダを
全部調べてoff_tの定義を調べるべきだな。

642 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 16:28:04 ]
もしかしたらtypedefではなく#defineかもしれない。

643 名前:635 mailto:sage [2007/10/30(火) 16:33:32 ]
>614
インクルードされているファイルって言うと#include <winsock2.h>みたいなやつですよね?
全部調べていくのはちょっと自分には難しいかもしれません。

そっちに原因があるということだったら、コンパイラを変えてみると何とかなるかも、ですか?
MinGWとかでコンパイルできるか試してみます!

>642
#defineもありませんでした。>635に書いた2行以外のどこにも出てこないんです。


644 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 16:34:14 ]
#include <sys/types.h>

645 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 16:38:35 ]
>>643
off_tでぐぐるぐらいの事はしてみたよな?

646 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 16:38:56 ]
typedef long off_t;

647 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 16:40:53 ]
>>635
検索を使ってちゃんと探してみたか?
俺は自分の環境で探してみつかったぞ。
しかも難しい定義でもなんでもなかったぞ。
答えは言わない。自分で環境全部きちんと探して。


648 名前:647 mailto:sage [2007/10/30(火) 16:45:36 ]
答えでちゃったね。
VS C++のファイル検索使えば全検索でも何分もかからないのに。
いずれ仕事にするならそれぐらいはきちんと覚えておいて。

649 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 17:01:56 ]
>644
その記述を入れたらoff_tに関してのエラーは出なくなりました!ありがとうございます。

>645
ググって、検索結果のページも色々参照させてもらったんですけど、なにぶんCそのものについての知識がなさ過ぎて・・・。すみません。

>646
その記述を入れてもoff_tに関してのエラーは出なくなりました!ありがとうございます。

>647
ありがとうございます。皆さんに助けていただいてひとつ前に進めました。
まだエラーが出てるんで先は長そうでけど・・・。

650 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 20:50:14 ]
理解しないで使うには危険な言語だと思うぞ。




651 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 12:14:47 ]
>>649
「その記述を入れたら出なくなった」じゃなくて、
なんでエラーが解消できたのかを知っておかないと
これから先苦労するぞ。

652 名前:デフォルトの名無しさん [2007/10/31(水) 18:09:26 ]
Win32環境+VS2005で開発を行っています。
ダブルクリックでファイルを開く処理に対応させようと頑張っていた所
Debugビルドでは成功したのですが、Releaseビルドにするとファイルを開かなくなりました。
(でもショートカットに開きたいファイル名を指定するとReleaseビルドでもきちんと開く)

そこで処理を追っていくと、どうもInitInstanceメソッドが呼び出されていないようなのですが、似たような経験をされた方はいらっしゃらないでしょうか?


653 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 18:11:41 ]
スレ違い

654 名前:652 [2007/10/31(水) 18:27:32 ]
了解しました、他スレに流れてきます。

655 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 18:59:54 ]
グリッド状に3次元ボクセルが並んでいる座標を格納したファイルがあって
0 0 0
1 0 3
5 20 9
…(順番はメチャクチャ)

ttp://up2.viploader.net/upphp/src/vlphp083780.jpg

こういう感じに1層だけ取り出して計算処理。
終わったらその上の層だけ取り出して計算処理

ということをしたいのですが

これって

for(slice=0,slice<MAX;slice++){
while(fscanf(fp,"%d%d%d\n",x,y,z)!=EOF){
array[x][y][z]に層を格納
}
格納した層について計算処理
}

という風に、計算したい層を取り出すために、毎回ファイルを読み込むという賢くない処理をしなくてはならんでしょうか
もう少し賢いやり方をしたいのですが、アドバイスいただけませんか。

656 名前:デフォルトの名無しさん [2007/10/31(水) 19:28:37 ]
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5186.txt

これに実験結果を入れたいのですが、どこに入れたらいいか分かりません。
教えてください。

657 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 19:30:04 ]
>>656
コンパイルして、./a.out 実験結果 とでもすればいいだろ。

658 名前:wolf ◆8VH3XAqjlU mailto:sage [2007/10/31(水) 21:09:30 ]
>>655
For your Reference.

Managing Memory-Mapped Files in Win32
msdn2.microsoft.com/en-us/library/ms810613.aspx

Beej's Guide to Unix Interprocess Communication(Ref. Memory Mapped Files)
www.ecst.csuchico.edu/~beej/guide/ipc/

659 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 21:47:11 ]
>>658
thanks for your advice

but I don't mention accessing memory
and that code was rough. so I have some mistake



660 名前:デフォルトの名無しさん [2007/11/01(木) 01:31:10 ]
「派生クラスのインスタンスを生成する時、newで生成しないと使えない」
と言われたのですが、何でなのかわかりません。

  親クラス* p= new 子クラス;
  p->なんか関数();

これしか方法はないんですか?



661 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 01:39:13 ]
>>660
そんな事はない

662 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 05:49:28 ]
>>655
データ量にもよるが・・・

ファイルの読み書きと計算処理を分離し、
データはすべてメモリに読んでしまい、
計算処理はメモリ上にあるデータに対して行う。
いくつもの計算処理を済ませた後に、
メモリからファイルに書きだす。

663 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 10:38:55 ]
子クラス kokurasu;
親クラス* oyakuasu = &kokurasu;
oyakurasu->NFunction();

664 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 16:13:54 ]
>>662さん
レスありがとうございます。
小さいデータ量なら3次元配列に読み込んでしまえばいいのですが
量がメモリの容量を越えてしまうくらい大きいので…

2048×2048×2048の大規模なものや、それ以上を想定しています。。。

メモリに乗り切らない→1層ずつ処理→そのためには?
という考えからきています

665 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 16:34:53 ]
ファイルを何度もスキャンするくらいなら、
物理メモリに乗らないような巨大なサイズでも、
仮想記憶を使ってメモリ上に読んでしまったほうがマシかもよ。



666 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 17:00:46 ]
>仮想記憶を使ってメモリ上に読んでしまったほうがマシかもよ。
仮想記憶で扱うということはこれまでやったことが無くて。
どこかわかりやすく参考になるところありますか?

667 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 17:02:15 ]
>>666
ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E8%A8%98%E6%86%B6

668 名前:デフォルトの名無しさん [2007/11/01(木) 17:15:27 ]
教えてください。

(Aが1)、かつ(Bが2)以外に処理を実行するっていう場合どう記述したらいいんですか?


if((A==1)&&(B==2)){

}
else{
  処理
}

でいいのかなぁ?



669 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 17:17:15 ]
ありがとうございます。
だいぶ難しそうな気配がしています。。。


670 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 17:19:27 ]
if( (A!=1)&&(B!=1) )
処理

でいんでない



671 名前:よろず [2007/11/01(木) 17:21:39 ]
募集してるよん♪
bloom@geocities.co.jp

672 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 17:22:21 ]
if((A!=1)||(B!=2))
{
処理
}

673 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 17:22:36 ]
よくねぇよ

674 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 17:23:05 ]
>>668
ド・モルガンの法則でひっくり返せ。

A != 1 || B != 2

675 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 17:23:24 ]
>>668
if( !(A==1 && B==2) ) {
 処理
}

676 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 17:23:40 ]
更新してなかtったorz

677 名前:デフォルトの名無しさん [2007/11/01(木) 17:23:51 ]
ありがとう || でやってみます

678 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 17:24:41 ]
>>666
高々GiBオーダだろ。普通にmalloc()したらOSが勝手に確保してくれて、使うときに勝手にスワップアウトしてくれるよ。
OSがタコじゃなきゃ。

679 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 17:26:13 ]
WindowsXPはタコですか?

680 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 17:26:41 ]
>>677
果たして、>670で「(Aが1)、かつ(Bが2)以外」と読めるか?
if (!(A == 1 && b == 2)) {
処理
}
の方が読みやすいかも知れんぞ。
# ド・モルガンの定理を知らん香具師がメンテナンスするかもしれないんだし。



681 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 17:28:59 ]
「(Aが1以外)且つ(Bが1以外)」と読める

682 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 17:29:48 ]
どっちも同じようにしか見えない俺は眼が腐ってる

683 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 17:30:11 ]
だね

684 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 17:49:50 ]
「(Aが1以外)且つ(Bが1以外)」じゃないの?

685 名前:デフォルトの名無しさん [2007/11/01(木) 17:52:10 ]
if( !(A==1 && B==2) ) {
処理
}

こういう記述もできるんですね

みなさんありがとう 勉強になりました

686 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 18:25:35 ]
>>680
読みやすさとかより
!(A == 1 && b == 2)) と (A!=1)&&(B!=1) は別物なんだが。

687 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 18:30:38 ]
そりゃそーだ
Bの値が違う

688 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 18:47:54 ]
>>678
ためしにmallocで 1024 1024 1024 を確保して解放しただけで仮想メモリの警告が出ましたが
確保をしているような感じでした。
ただ、合計4GBくらいになるはずのものが2.5GBで解放されたのが気になりますが。。。


もう少し別のやり方調べてみます。。。

689 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 19:12:47 ]
>>688
Windowsの32ビットアプリケーションは、
3GiBオプションを付けない限り、ユーザアドレス空間2GiBしかないよ。
その2GiBをプログラム本体や、WindowsのDLL、スタックを差し引いた残りが、
およそmallocほか動的メモリ確保で使用できる領域になる。

それ以上使いたければ、64ビット化するか、2GiB未満に小分けして処理する必要がある。
いずれにせよ、同じ仮想記憶を使うのでも、
単純にmallocでメモリを確保するよりは、メモリマップドファイルにしたほうがいいと思う。

690 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 20:02:10 ]
>>687
それだけ?



691 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 20:34:15 ]
うぜ

692 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 22:00:13 ]
>>689
動的メモリになると2GBの壁がでるのですね…

それだと必然的に1024^3はムリになるので、目的のは出来ないかもしれません
ファイルにランダムアクセスできればいいのですが…
それかファイルをソートする方がはやいのかも

693 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 22:05:34 ]
>>692
ランダムアクセスはできるよ
テープじゃないんでしょ

694 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 22:07:58 ]
テープですよ
ランダムアクセスはできるけど

695 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 22:17:07 ]
>>692
流れをあんまり理解してないけど、
ファイルにランダムアクセスってfseekとかその手の話?

696 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 22:19:59 ]
まさか数GBのファイルを全部メモリに読むつもりとか

697 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 22:20:04 ]
そのファイルはテキスト?

698 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 22:21:37 ]
層毎に読み込むのがいいよ

699 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 23:21:22 ]
>>655のことです
層ごとに読み込みたくて。

15GBくらいのデータを縦軸・横軸の層で読み込んで計算したくて伺っていました。
テキスト形式のデータで要素数にして数億個のデータです。


700 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 23:39:36 ]
なんで一度に読み込みたいのかがわからん。
ある層の計算をするときは、他の層がどうなってるかは知らなくていいんじゃないの?

逐次的に計算できるなら、何億個、何兆個データがあっても関係ないでしょ?



701 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 23:40:03 ]
層順にソートしておくとか

702 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 23:44:40 ]
何層あるのか知らないけど、元ファイルを順次読み込み、層ごとのファイルに分ける。
slice001.txt, slice002.txt, ... みたいに。
で、それぞれのファイル毎に層毎の計算をする。

で、ダメ?

703 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 23:45:52 ]
>>700
一度に読み込まないための方法を探してるんです。

>>701
それは考えました。
縦方向に層を作るのであればZだけでソートしたファイルを読み込み処理ですむのですが
横方向に層も必要で
最悪2つの15GBのデータを作らないといけなくなりそうです。



704 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 23:47:23 ]
あー、2k*2k*2k程度を想定してるのか。
層ごとに分けてしまえば次元が一つ減るから、オンメモリでいけるでしょ。

705 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 23:48:41 ]
めんどくせーから、64bitOSにしちゃえよ

706 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 23:49:57 ]
めんどくせーから、諦めちゃえよ

707 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 23:51:50 ]
めんどくせーからDBにしとけ

708 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 23:56:27 ]
>>703
> 横方向に層も必要で
おいおい、必要な情報は一度に開示しとけよ。

709 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 23:59:58 ]
>>708
はい、すみません。

縦方向の層/横方向の層 でスライス作って計算するのが一番速そうですね。
始めは15GBの3次元の塊から、層を2次元配列で確保していくつもりでしたが

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

710 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 00:43:29 ]
> (Aが1)、かつ(Bが2)以外に処理を実行するっていう場合どう記述したらいいんですか?

どーみても、
if ( (A==1) && (B!=2)) {
処理
}
だろ。

それとも日本語が不自由なのか?



711 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 00:45:03 ]
668の例を見てそう言えるお前のほうが不自由

712 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 00:45:12 ]
うは亀レス
日本語が不自由なんですね

713 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 00:45:41 ]
もうその話題終わったよ

714 名前:デフォルトの名無しさん [2007/11/03(土) 01:41:40 ]
実体のまだないData型のpDataAというクラスが、ポインタで関数DataA_Setupにわたってきます。
DataA_Setupの中で、実体化(new)して、いろいろ値をつめます。
次に、このpDataAを、別の処理関数DataA_Modifyにわたして中身を書き換えるのですが、
DataA_Modifyのインタフェースが、Data型の参照を受けているのです。

int DataA_Setup(Data* pDataA)
{
pDataA = new Data();
// pDataAにいろいろ値をセット

    DataA_modify(ここが、Data型の参照になっている);



715 名前:デフォルトの名無しさん [2007/11/03(土) 01:45:14 ]
>>714の続き
で、DataA_modifyにpDataAを渡すには、どのように変換すればいいのでしょう。

Data rDataA = &pDataA;

とすると、
error: conversion from `Data**' to non-scalar type `Data' requested

とエラーが出ました。

716 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 01:48:22 ]
*pDataA でいいんではないの

717 名前:デフォルトの名無しさん [2007/11/03(土) 01:51:06 ]
ありがとうございます。

DataA_modify( *pDataA );

で通りますか?

718 名前:デフォルトの名無しさん [2007/11/03(土) 02:35:35 ]
ゲームに制限時間を付けたいんですが、どうすればいいのか
わかりません。


719 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:52:32 ]
>>714
> 実体のまだないData型のpDataAというクラスが

「クラス」???
基本的なことを理解していないっぽいな。

> ポインタで関数DataA_Setupにわたってきます。

実体がないのに、どうしてポインタが渡せるんだ?

そして案の定、

> int DataA_Setup(Data* pDataA)
> {
> pDataA = new Data();

なんていう変なことをしている。

引数の型はData*ではなくData**か、Data*&にしないと。
pDataAに何を代入したって、DataA_Setupの呼び出し側には伝わらないぞ。

> Data rDataA = &pDataA;

わかってなさすぎ。

720 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 08:39:58 ]
>>718
あなたがどんなゲームをどのように作っているのか判らないので「こうしなさい」などとおこがましいことは言えません。



721 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:40:26 ]
>>714
>>719のとおりだなあ。
とりあえずC++ Primerと初心者本を買って理解することをお勧めする。

722 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 16:35:46 ]
二次元配列で
foo[たて][よこ]
を走査したいのですが
どんなループが一般的にやられてますか?

723 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 16:39:32 ]
ふつう

for(y = 0;y < たて;y++){
for(x=0;x < よこ:x++){
}
}

724 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 16:40:09 ]
二重ループ

725 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 16:58:20 ]
>>723-724
ありがとうございます。

あとすいません、言葉足りなくて
foo[][]を

行だけ取り出して、計算→次の行へ。
列だけ取り出して、計算→次の列へ

ということです。



726 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:01:18 ]
>>725
for(y = 0;y < 列;y++){
for(x=0;x < 行:x++){
}
}

for(y = 0;y < 行;y++){
for(x=0;x < 列:x++){
}
}


727 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 17:05:07 ]
…そうだ。そうですね
なんか変に考えすぎてました。

ありがとうございます

728 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 02:03:47 ]
if(条件1){処理1}
else if(条件2){処理2}
else if(条件3){処理3}
else if(条件4){処理4}
else{処理5}

という処理をやりたいのですが、ネストは3までと決められているので、このままの形では書けません
なんとかスマートにネストを減らしたいのですがどうするのがいいのでしょうか
今は仕方なくこんな風に書いてるんですが、不格好だし面倒くさいし…

int flg;
if(条件1){flg=1}else{DoNothing();}
if(条件2){flg=2}else{DoNothing();}
if(条件3){flg=3}else{DoNothing();}
if(条件4){flg=4}else{DoNothing();}
if(条件5){flg=5}else{DoNothing();}
switch(flg)
{
 case 1:処理1;break;
 case 2:処理2;break;
 case 3:処理3;break;
 case 4:処理4;break;
 case 5:処理5;break;
 default:DoImpossible();break;
}

729 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 02:07:49 ]
ごめんなさい
条件の方のflg=*にセミコロン忘れました

730 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 02:17:22 ]
>>728
ネストが3ということだが、一番はじめに提示したソースはネストは1じゃないか?
普通かどうかしらんが、俺の感覚でネストが深くなるといわれると
if ( XXX ) {
if ( YYY ) {
if ( ZZZ ) {
}
}
}
ということだと思うんだが?



731 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 02:20:14 ]
一応、回避策(?)も提示してみる。
int Check( void ) {
if ( 条件1 ) return 1;
if ( 条件2 ) return 2;
if ( 条件3 ) return 3;
if ( 条件4 ) return 4;
if ( 条件5 ) return 5;
return -1;
}
/**/
switch( Check( ) ) {
case 1://以下略
}

732 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 02:22:28 ]
else if{〜}はelse{if{〜}}のことなので、最初のソースのネストは5なんです
正直納得いかないんですが、コードチェッカがそう言って怒るので仕方ありません

733 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 02:28:20 ]
>>731
結局条件を数値に直してswitchしかないんですかね
elseは必ず書くことになってるので正直あまり変わらない気がします。ごめんなさい

734 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 02:33:01 ]
そのコードチェッカーは必ず、例外なく、何があっても、守らなければいけないもの?
可読性や汎用性やテスト容易性まで犠牲にしてまで守る利点はあるの?
っていっても、守らなきゃならない状況ってのはあるんだろうけど・・・
関数分割をなるたけして、厳しい部分はswitchに落とすしかないかな?

735 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 02:40:00 ]
>>733
elseはcase -1:でよくね?-1じゃなくてもなんでもいいけど。
条件の内容次第ではうまくいく場合もあるよ。
例えば、文字列比較によって関数呼び出しを行うなら・・・
typedef sturct {
const char * str;
void ( * func )( void );
} T_HOGE;
const T_HOGE Hoge[ 3 ] = {
{ "right", Func1 },
{ "center", Func2 },
{ "left", Func3 },
};
for ( cnt = 0; cnt < 3; cnt++ ) {
if ( strcmp( Hoge[ cnt ].str, input ) == 0 ) {
Hoge[ cnt ].func( );
}
}
条件が複雑になれば厳しくなるけど・・・

736 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 02:41:57 ]
bool notYet = true;
if (notYet && condition1) {process1; notYet = false;}
if (notYet && condition2) {process2; notYet = false;}
if (notYet && condition3) {process3; notYet = false;}
...

737 名前:1/2 mailto:sage [2007/11/14(水) 05:31:15 ]
#include <utility>
#include <vector>
#include <iostream>
#include <functional>

struct func_holder : public std::unary_function<void,void> {
  typedef result_type (*func_type)(argument_type);
  func_holder( func_type f ) : m_func(f) {};
  result_type operator()(argument_type) const { return (*m_func)(); }
private: func_type m_func;
};
struct pred_holder : public std::unary_function<int, bool> {
  typedef result_type (*func_type)(argument_type);
  pred_holder( func_type f ) : m_func(f) {};
  result_type operator()(argument_type a) const { return (*m_func)(a); }
private: func_type m_func;
};
template< class Pred, class Func >
struct dispatcher
 : public std::unary_function<typename Pred::argument_type, void> {
  typedef std::pair<Pred, Func> pair;
  typedef std::vector<pair> vector;

  void add(pair const& p) { v.push_back(p); }
  void operator()(argument_type a) {
    for (vector::iterator i = v.begin(); i < v.end(); ++i) {
      if ( i->first(a) ) { i->second();break; }
    }
  }
private: vector v;
};

738 名前:2/2 mailto:sage [2007/11/14(水) 05:34:32 ]
void out1() {
  std::cout << "out1!\n";
}
void out2() {
  std::cout << "out2!\n";
}
bool pred1(int i) {
  return i > 0;
}
bool pred2(int i) {
  return i == 0;
}
int main() {
  dispatcher<pred_holder, func_holder> dis;
  dis.add( std::make_pair(&pred1, &out1) );
  dis.add( std::make_pair(&pred2, &out2) );
  dis(0);
}

.*_holderで指定する関数の方を変えてやったり、predのargumentとして状態を保持した構造体を渡すようにすれば
もっと複雑な条件でも使えるかもしれない
boostを使えば使い勝手が良くて読みやすいのが作れる?

739 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 16:11:34 ]
>>734
必ず守らなければならないとしたときの利点:
  お前のように、ごちゃごちゃ文句言う奴に対応する時間を取らなくて済む

740 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 16:18:34 ]
>>739
必ず守らなければならないとしないときの利点:
  お前のように、ごちゃごちゃ文句言う奴に対応する時間を取らなくて済む



741 名前:738 mailto:sage [2007/11/14(水) 17:59:11 ]
よく考えるまでもなく激しく車輪の再発明してる気になるなぁ(それ以前にC++)
これと同じようなものが「boostにあるよ」とか「lokiにあるよ」とか「俺が作ったよ」とかあれば
是非情報をおながいします

あとこういうのって、デザパタ用語で責任の連鎖パターンっていうんですか?

742 名前:デフォルトの名無しさん [2007/11/14(水) 21:50:49 ]
コンソール上で動かすプログラムを作っています。
画面消去の方法で『ESC [2J』と解説されてるサイトが多いのですが、
XPではエスケープ・シーケンスが使えないようなのです。
他に画面消去に使えるような命令はないでしょうか?
コンソール画面上をスペースで塗り潰す以外の方法は無いのでしょうか。

743 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 21:51:38 ]
プログラムを書くというのは、特殊化だと思う。
だから、汎用に書くのは間違い。

可読性を損なわないようにベタっと書くべき。

744 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 21:55:55 ]
DRY原則は守ってね

745 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:09:17 ]
>>742
Win32APIスレで質問すべし。

746 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:13:36 ]
APIじゃなくてもclsでよくね?

747 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:18:55 ]
そこでPDCursesですよ
単にコンソールIOのシステムコールをCursesのインターフェースでラップしただけだけど
そのまま使うよりは使いやすいような使いにくいような

748 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:25:05 ]
血圧が高くて疲労感が取れません。

749 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 03:23:46 ]
A.cpp
CSample *Sample = 〜〜〜


B.cpp
Sample->Loop();

という風にしたいんですが
どうにかしてB.cppでSampleオブジェクトを使う方法はありませんか

750 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 04:30:17 ]
>>749
グローバル変数




751 名前:デフォルトの名無しさん [2007/11/15(木) 04:45:48 ]
windowsでC言語の開発環境を整えようと思いbcpadをダウンロードしようとしたのですが、
ベクターでダウンロードできなくなっており、自身で探してみたのですが、ダウンロードできるサイトが見つかりません。
ご存知の方がいらっしゃいましたら教えてください。

752 名前:デフォルトの名無しさん [2007/11/15(木) 10:28:55 ]
>>751
シェアウェアにするとかなんとか書いてるから
フリーのVC++2005expとSDKでやれば?
ANSIIの関数で複数の関数が
警告で「安全性がなんたらかんたら・・・」って警告
でるけど、別に関数の使い方間違ってなかったら
問題無いし、C言語の開発環境としては
VC++2005で十分気軽に使えるでしょ

753 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 21:04:22 ]
配列の要素数をsizeof演算子で得ることができるということは理解できるのですが
配列のポインタから、そのポインタが指す配列の要素数を得ることはできるのでしょうか?

754 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 21:22:21 ]
>>753
できない。

755 名前:753 mailto:sage [2007/11/16(金) 02:27:16 ]
ありがとうござました

756 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 19:26:34 ]
WikibookのMore C++ Idiomsって更新されてるの?
10項目ぐらい聞いたことも無い名称が出ててとても気になるんだけど・・・

757 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 19:29:58 ]
更新履歴みればいいじゃない

758 名前:デフォルトの名無しさん [2007/11/17(土) 19:50:02 ]
コンストラクタなんですが

クラス名::クラス名() : クラス変数名(値){
// 以下コード
}

みたいな宣言をされているのですが、「:」以降の文法の意味が分からないのですが・・・。
クラス変数の型は、インクルードしている他のクラスです。

759 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 19:52:17 ]
初期化してるだけ
class A{
 int a;
 A();
};
A::A(): a(1) {
}
の場合、Aのメンバ変数aは1で初期化される

760 名前:デフォルトの名無しさん [2007/11/17(土) 20:02:35 ]
なるほどです。
手持ちの本では載っていなかったので。
ありがとうございます。




761 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:07:18 ]
その本が入門書であるなら窓から投げ捨てたほうがいい。

762 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 03:02:02 ]
未だにこんなコード載せてる本がたまにあるから困る
間違いだからなこれ
A::A(){
 a=1;
}

763 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 07:34:46 ]
int a=1 ;
ってのも間違いで、
int a(1) ;
にしろってか?

764 名前:デフォルトの名無しさん [2007/11/18(日) 07:40:24 ]
どこが?

765 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 07:54:07 ]
>>762
間違いってほどでもないな。効率が悪いってだけで。

効率の悪さよりも保守性のために、
あえて初期化リストを使わないという選択もあるよ。

多数のコンストラクタがある場合、
同じ初期化リストをコピペすることになる。

コンストラクタ内で代入するのであれば、
共通した代入をprivateなメンバ関数にできる。

766 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 08:00:24 ]
>>765
それはクラス設計が悪い

同じように初期化するメンバで1つクラスにして、それを継承すべし

767 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 08:53:40 ]
>>763
その2つは同値な表記
A::A():a(1){}とA::A(){a=1}は意味が違う
まあint型くらいなら大して変わらんけどさ

768 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 10:02:10 ]
>>766
アンチパターン

769 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 11:01:06 ]
>>766
継承はやりすぎ
包含で十分

770 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 11:02:24 ]
>>767
意味が違うのなら、どちらが正しいかなんて言えないよな



771 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 11:04:58 ]
クラスだとコンストラクタとコピー代入演算子が違う意味を持っているから初期化子に馴れておいた方がいい。
さらにstatic/constが絡んでくると初期化子の方が合理的だと思えるようになるよ。

772 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 11:14:04 ]
説明がド下手

773 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 11:52:42 ]
C++での質問です

EA001 80
EA002 60
EA003 100
EA004 0
EA005 50

みたいな感じに学籍番号と整数値が与えられているテキストファイルを読み込んで、
整数値をソートして行ごとに並べ替えるプログラムを作りたいのですが
どのようにテキストファイルを読み込めばいいのか教えてください。

774 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 11:56:49 ]
#include <fstream>

std::fstream f("ファイルのパス.txtxtxtxt", std::ios::in | std::ios::binary);

void *buff new char[適当な数];

f.read((char*)buff, 読み込むサイズ);

775 名前:デフォルトの名無しさん [2007/11/18(日) 11:59:31 ]
>>774
バイナリで読み込む必要ない
あとソートはSTLのmapとかsetだと読み込めばソート完了する

776 名前:デフォルトの名無しさん [2007/11/18(日) 15:32:20 ]
Visual C++ 2005 Express Edition で、PCのイベントログをとってくるには
どうしたらいいんですか?

777 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 15:59:26 ]
>>776
Win32API質問スレへどうぞ。

778 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 16:01:51 ]
>>776
Win32APIのReadEventLogを使う。

WMIあたりにもっと便利なのがあると思うが、
その質問の仕方を見ていると使いこなせるか疑問。

779 名前:デフォルトの名無しさん [2007/11/18(日) 19:28:29 ]
>>777-778
すみません。ありがとうございます。
おっしゃる通り、C言語すら知らないド素人です。
Win32APIとやら・・・Cの基礎を知ってないと駄目なほどのものを使わないと
できませんか・・・Windowsのイベントログだから考えてみればそうですよね・・
ありがとうございました。

780 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 22:11:53 ]
Cの基礎を知らないでVisual C++でまともなプログラムを作るのはそもそも無理だろWin32APIがどうこういう前に



781 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 11:13:10 ]
>>779
とやらって…。Win32APIは別にCの基礎じゃない。

782 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 23:49:41 ]
>>781
日本語読めない人ですか?
779は Win32API = Cの基礎を知ってないと駄目なほどのもの って言ってるんであって
Win32API = Cの基礎 だなんて一言も言ってないだろ。

783 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 00:15:24 ]
そんな必死にならなくてもいいのに

784 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 00:17:31 ]
と言う事にしたいのですね:-)

785 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 01:44:13 ]
いいえ、事実です。

786 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 02:25:22 ]
1,2、たくさんとしか数えられないから、三行以上の書き込みが必死に見えるらしい。

787 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 12:34:12 ]
>>782
Win32APIがCの基礎を知ってないと駄目なほどのもの?
笑わせてくれるぜ。

788 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 13:19:02 ]
Win32APIがCの基礎を知ってないと駄目なほどのものって言ってるのは782じゃなくて779だろ。
782は781の読み違いを指摘してるだけ(煽ってるともいう)なのに、なんで782に絡むんだよw

789 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 13:23:47 ]
そんなことよりみんなで乱交パーティしようぜ

790 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 13:29:54 ]
そんなどうでもい話で盛り上がってんなよ



791 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 13:42:43 ]
新しいネタもないし別にいいんじゃね?
どうしても話題変えたかったらなんか質問でもしなよ

792 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 15:18:08 ]
C++で、stringに入力した文字列をint型に変換する方法が分かりません。
atoi()を使うとエラーが出てしまいます。

793 名前:デフォルトの名無しさん [2007/11/20(火) 15:19:08 ]
string s="123456";

cout << atoi(s.c_str());

794 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 15:29:00 ]
string s="123456";
int i;
istringstream(s) >> i;

795 名前:デフォルトの名無しさん [2007/11/20(火) 15:39:01 ]
代入演算子で、整数変数に浮動小数点をかけ算するとき、ワーニング出ないようにするにはどうすればいいの。
int value=10;
value *= 0.5;


796 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 15:45:22 ]
整数演算に直す。
value /= 2;

797 名前:デフォルトの名無しさん [2007/11/20(火) 16:15:33 ]
WindowsAPI使えば、スタンバイとか自分の好きな風にカスタマイズできますか?

PCのスタンバイ設定が気に入らないので。

798 名前:デフォルトの名無しさん [2007/11/20(火) 16:16:42 ]
レジストリだろう

799 名前:デフォルトの名無しさん [2007/11/21(水) 08:51:30 ]
double型・float型っていくらの整数まで厳密に保持できると保証されてるんでしょうか?
(桁が上がっていくと1の位を保持できなくなるわけですよね)
具体的にはunsigned intの最大値までそれぞれ保証しているのか知りたいのです。

800 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 09:29:21 ]
>>799
それぞれの仮数部のビット数を調べればいい。
結論から言えば、一般的にdoubleは53bit、floatは24bitとなる。
従って、一般的な4バイト整数と較べた場合、floatは精度が足りないと言うことになる。



801 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 12:50:50 ]
>>800
なるほど、納得です!
ありがとうございました。

802 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 22:31:20 ]
保障はされてなかった気がする

803 名前:デフォルトの名無しさん [2007/11/22(木) 01:15:33 ]
質問です。
今自分はCからFORTRANにする事をしていて、
wgtinit(w,s1,inival,flag) /*initialize random weight matrix*/

drawrest(xps+50,50,200,200,yellow)

line(xp,250,xp,yp,white,0,0)
といのがCのプログラムの中で出てきたのですが、これはどういう意味で、
これをFORTRANで表現するにはどうしたらいいのでしょうか?


804 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 01:24:43 ]
>>803
我々はエスパーじゃない。

805 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 01:27:41 ]
>>803
お前みたいなのを雇うなんて会社の程度が知れてるな

806 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 01:39:29 ]
>>803
>といのがCのプログラムの中で出てきたのですが、これはどういう意味で、
>これをFORTRANで表現するにはどうしたらいいのでしょうか?
それを調べるのがあんたの仕事だ。
調べずとも明らかなことだけなら猫にでもやらせればすむことだからな。

807 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 01:44:40 ]
すみません超初心者なんですが質問いいでしょうか

1、ネットで見つけたあるサンプルをVisual C++ 2005 Express Editionというソフトで開くと
「古いバージョンのソフトで作ってあるから新しいソフトに書き直す」
というような内容のメッセージがでたのでOK、開けました

2、ビルドして実行しようとすると
”ビルドエラーが発生しました。続行して、最後に成功したビルドを実行しますか?”
というメッセージが出たのでOK

3、”プログラム’・・・.exe’を開始できません。指定したファイルが見つかりません。’
というメッセージが出てきて実行できません。

これってVisualC++2005だとこのソースはビルドできなくて結局使えないってことですか?
ゲームを作ろうとしたのにいきなり詰まってて困ってます。

808 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 01:47:35 ]
>>807
2.の時点で間違っている。
ビルドエラーが発生してるのに実行しようとしているため。
ちゃんとビルドできるようにして来い。
わかんなかったらソースとエラー書いてくれ。
もしくは、そのサンプルがあるURLを書いてくれ。

809 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 02:02:47 ]
CUIでのゲームプログラムを作ろうと思ってるんですが、
保存したデータ内容の編集はCの標準ライブラリのみで出来るのでしょうか。
追記は出来ても一部分のみ書き換えや削除等の方法が分からなくて。

810 名前:809 mailto:sage [2007/11/22(木) 02:04:00 ]
説明不足でした。
ファイル処理の話です。



811 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 02:06:36 ]
C以外でやった方が楽だし早いんじゃね?

812 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 02:08:50 ]
>>809
ファイルの途中への挿入や削除は標準関数ではできない。
サイズが変わらないなら、方法はある。

813 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 02:09:58 ]
>>811
仰るとおりですが、まだ授業でCの勉強しかしてなくて。
javaも独学で勉強してるもののいまいちピンと来ないんですよ…。

814 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 02:12:26 ]
>>812
書き換えや削除するとサイズが変わってしまうのでは?

もし宜しければ参考のためにご教示願えますか。

815 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 02:12:50 ]
テキスト操作したいならPerlとかPHPでいいんでない?
CとかJavaよりよっぽど楽に扱えるし、新しく勉強するに
してももそれほど時間かからないと思うよ

816 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 02:18:22 ]
ファイルがそこまで大きくないなら起動時に一気にすべて読み込み、終了時に新規に出力しなおすとかじゃだめ?

817 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 02:18:59 ]
// >>814
// for Example.
#include <stdio.h>
int main()
{
FILE * fp = fopen("foo", "w");
fprintf(fp, "a\nb\nc\n");
fclose(fp);

fp = fopen("foo", "r+");
fscanf(fp, "%*s");
fprintf(fp, "B\n");
fclose(fp);
return 0;
}

818 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 02:29:42 ]
>>815
暇潰しにする程度なので、新たに勉強する気力がなくて…。
基本的に学校のPCでしてるので環境がないのもあるんですが。

>>816
その方法が一番確実そうですね。
内容はユーザ情報とスコアランキングくらいなので。

>>817
無知で申し訳ないんですが、%*sってどういう意味でしょうか。
*はワイルドカードって事ですか?
あと試しにコンパイル実行してみましたが特に変化が分からなかったです…。

819 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 05:37:26 ]
>>803
> wgtinit(w,s1,inival,flag) /*initialize random weight matrix*/

wgtinit関数に引数w, s1, inival, flagを渡して呼び出す、という意味。
セミコロンがあるはずだが、写し忘れか?
こういうのはキーボードでタイプし直したりせず、コピペしような。

> drawrest(xps+50,50,200,200,yellow)
> line(xp,250,xp,yp,white,0,0)

この2つも同様に、drawrestやlineという名前の関数を呼び出している。

820 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 05:38:12 ]
>>807
ダイアログに表示されたメッセージの内容を理解せずにYesやOkを押すような人は、
プログラムを書くのに向いてない。やめたほうがいい。



821 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 05:40:51 ]
>>818
気力がなかったら、暇潰しで頭を使うようなことをせず、酒でも飲んで寝てたらどうよ。

> 無知で申し訳ないんですが、%*sってどういう意味でしょうか。

読み飛ばす・・・だったような。
こういうのは覚えておくものではなく、都度scanfのリファレンスで確認刷るものだよ。

822 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 07:14:43 ]
>>818
知らないことは調べるだけの話。
それをする気がないのは「無知」ではなく「無気力」。
刻苦を厭う怠惰は人を虎に変えてしまうのだよ。

823 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 07:51:59 ]
怠惰には、
無気力な怠惰 = メンドクサイから、何もやらない
と、
前向きな怠惰 = メンドクサイことをしなくても良いように努力・工夫する
がある。


824 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 19:50:07 ]
本当に怠惰な人間ならこんな便所の落書きに長文書いていつ来るとも知れぬ無責任な名無しの回答を待つ前に
さっさとグーグル先生でも聞いて済ますと思う

825 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 21:19:04 ]
*は代入抑止文字ですか。
変数に格納されないって事ですね。

ご迷惑おかけしました。

826 名前:807 mailto:sage [2007/11/22(木) 21:43:11 ]
すみません。実行できました
VBではよくプログラムをしてるんですがCの勝手がわからなくって。
まだよく分からないのですが、
SDKとかDXライブラリとかの設定をしてなかったから見たいです
出力に
DxLib.exe': 'なんとかかんとか' を読み込みました。必要な DBG ファイルが見つからないか、開けません。
等など沢山でているのは大丈夫でしょうか?

827 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 21:51:04 ]
>>826
「何が」大丈夫なのか否かを知りたいの?

828 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 22:38:53 ]
>>827
すみません
プログラムが変な動作をしたりしないのか、とか
バグじゃないのか、とか

プログラムに問題があるというメッセージなのか、それとも
これらのメッセージが出ているのは普通で問題はないのか
そういう意味です
なんだかVBと全然違うんですね

829 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 22:44:39 ]
>>828
> プログラムが変な動作をしたりしないのか

基本的には、しない

> バグじゃないのか

基本的には、バグではない

> プログラムに問題があるというメッセージなのか

基本的には、違う

> これらのメッセージが出ているのは普通で問題はないのか

基本的には、普通で問題ない

デバッグのための情報がないので、シンボルデバッグできないぞ、というメッセージ。

830 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 22:45:37 ]
自分が作ったクラスを入れるlistをsortするため、operator<を定義してるんですが詰まっています。

class Data{
  int x;
  int y;
public:
  Data(int a = 0, int b = 0){ x = a, y = b };
  int getx(){ return x; };
  bool operator<(const Data&);
};

bool Data::operator<(const Data& obj){
  return x < obj.getx();
}

const Dataのobjからgetx()を呼び出しているせいか(?)、以下のコンパイルエラーが出ます。
passing `const Data' as `this' argument of `int Data::getx()' discards qualifiers
getx()はxを変更しないのに、objをconstにしたらダメなのでしょうか?



831 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 22:55:52 ]
>>830
int getx() const { return x;}

832 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:04:43 ]
>>831
ありがとうございます。
const int getx()は試したんですけどねぇ。
この辺ややこしくなってるので勉強し直します。

833 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:58:10 ]
>>829
本当に親切に答えてくださってどうもありがとうございます。
凄く助かったし安心しました。
これからもっと精進して頑張ってゲームを作ります。

834 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 05:31:13 ]
8bit以外のchar型の処理環境ってどんなのがあるの?

835 名前:デフォルトの名無しさん [2007/11/23(金) 15:12:38 ]
#include <iostream>
using namespace std;

class Base
{
public:
static int m_iVal;
void SetValue(int val) { m_iVal = val; }
void Show() { cout << "m_iVal: " << m_iVal << endl; }
};
class Hoge1 : public Base{ };
class Hoge2 : public Base{ };

int Base::m_iVal = 0;

void main()
{
Hoge1 hoge1;
Hoge2 hoge2;

hoge1.SetValue( 100 );
hoge2.Show();
}

このプログラムで hoge2.m_iVal = 100 となるんですが よかったでしょうかね?
確認のためですけど


836 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:48:08 ]
>>834
ttp://ja.wikipedia.org/wiki/ACOS-6

837 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:48:32 ]
良い。

838 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:55:53 ]
charは少なくとも8ビットじゃなかったか?

あーsizeofが1になることが定義されてるだけだっけか

839 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:58:11 ]
RISCだと、longからcharまで全部32bitってのがあるんじゃね?

840 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 16:15:40 ]
確かに規格上 char ≦ short ≦ int ≦ long だから全部同じサイズでも許されるな



841 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 17:00:18 ]
>>838
char は1バイト、1バイトが何ビットかって? そんなこと、好きに決めて良いよ

842 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 17:09:35 ]
>>838
少なくとも8ビットだよ。

843 名前:デフォルトの名無しさん [2007/11/23(金) 17:31:57 ]
初心者ですが、質問です。

#include <stdio.h>

int main (void)
{
int i = 1000, j = 40, k = 3000;
printf ("iが%dで、\njが%dで、\nkが%dです。\n",i,j,k);
return 0;
}

こう書いた場合はエラーにならないのに、こうする↓と、
printf ("iが%dで、\n
jが%dで、\n
kが%dです。\n",i,j,k);

構文エラー : ')' が、識別子 'jが' の前に必要です。
と言われて、コンパイルでエラーになってしまいます。
C言語では、;を文末をみなすため、どこに改行を入れてもいいと聞いていたのですが、
入れる位置が決まっているのでしょうか?環境は Visual C++ 2005 Express Edition です。

844 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 17:38:55 ]
printf ("iが%dで、\n"
"jが%dで、\n"
"kが%dです。\n",i,j,k);

845 名前:デフォルトの名無しさん [2007/11/23(金) 17:45:07 ]
>>844
実行されました!
printfの""の中だと改行するには一度"で終わらせてあげないといけないんですね。
ありがとうございました。

846 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 18:08:01 ]
>>845
printfに限らず、文字列は1行ごとに""で終ってないといけない。

847 名前:デフォルトの名無しさん [2007/11/23(金) 18:14:05 ]
プログラムの初心者ですがSQLを書いていますが、C言語と似てると
思いますので、わかる範囲で答えて頂けると助かります

以下のようなプログラムを書いたのですが、パソコンに複数のメールが
送られてきます。 メール送ったら終了のように直したいのですが、
どのようにしたら良いでしょうか


if ((fasterLWMAnow > slowerLWMAnow) && (fasterLWMAprevious < slowerLWMAprevious) && (fasterLWMAafter > slowerLWMAafter)) {
CrossUp[i] = Low[i] - Range*0.5;
Alert(Symbol(), " hit ");
SendMail("Mail Alert", Symbol()+" hitdesu ");


848 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 18:22:20 ]
>>847
――これは、新しい釣りですね…。

849 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 18:26:58 ]
>>847
100どんだけぇを軽く超えてるよ

850 名前:デフォルトの名無しさん [2007/11/23(金) 18:32:18 ]
すいません。まじめに質問したつもりですが、何がいけなかったでしょうか?



851 名前:デフォルトの名無しさん [2007/11/23(金) 19:05:38 ]
>>846
分かりやすく教えていただき、ありがとうございました!

852 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 19:18:01 ]
>>847
そうなっていたんですか!
疑問が解決してすっきりしました、ありがとうございます!!

853 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 20:01:54 ]
C++ってCと比べてどれだけ遅いのですか?

854 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 20:05:15 ]
午後のこーだの作者曰く話しにならんぐらいとのこと

855 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 20:11:12 ]
そりゃ
午後は
アセンブラァばりばり

856 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 20:40:08 ]
ただし、一般的には機能を使おうとすればそれに応じてオーバーヘッドがかかるようになる。
Cと全く同じコードを書けば、Cと全く同じ速度にはなる。

まずはアセンブリ出力を見比べてみたり、実測することから始めようか。

857 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:02:16 ]
>>853
昔は、コンパイラが生成するコードがC++の場合は遅く、
同じことをするにしてもCで書いたほうが速かったのだろう。

C++で書いたコードを、手作業でCに変換しても、
速度的には大して変化しないと思うよ。

すべてのクラスにvtableを持たせるようなことをしなければ、ね。

858 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:09:20 ]
Cの範囲で書いていたら、C++としてコンパイルしても、生成されるコードは同じだよ。昔から。

859 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:28:17 ]
一歩C++の領域に踏み入ると劇的に変わるけどね
デストラクタ一つで激変

860 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:30:12 ]
C++ は参照とかインライン関数とかテンプレートとか駆使したら、
C と同じ速度でより安全なプログラムが書けると思う。



861 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:32:01 ]
std::sortは比較操作がインライン展開できるから、
qsortよりも速くなりやすいなんてのは有名だよね。

862 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:35:56 ]
そうそう。
まあ、qsort をマクロ化すれば C でも速いの書けるんだろうけど。

863 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:36:29 ]
C++は例外に備えないといけないので
Cと同じコードを吐ける場面は少ない

864 名前:デフォルトの名無しさん [2007/11/23(金) 22:37:14 ]
テンプレートとか、STLとかどのくらい手間掛けているか不明なやつ使うと鈍くなる
charやintを直接あやつる範囲ではアセンブラに匹敵する

865 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:40:22 ]
アセンブリ言語っつっても、
速いコード書くノウハウ無かったら
コンパイラの最適化の方が速かったりするもんな。

866 名前:デフォルトの名無しさん [2007/11/23(金) 22:59:52 ]
とりあえず初心者が動かせる3Dライブラリを開発しますか

867 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:08:38 ]
>>859
それは、
不必要にデストラクタをvirtualにする
という愚をやらかしているだけだろ。

>>863
それはどこの何というコンパイラ?

例外をthrowする、throwされたものをcatchする、それにはコストは要するが、
例外中立なコードにはオーバーヘッドかからないと思うが。

868 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:10:33 ]
catchしなくても例外が通り抜けるときにデストラクタを呼ばないといけない
さっきg++で試してみた
virtualかどうかは関係ない

869 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:10:35 ]
デストラクタから virtual を外すのは
どうしても必要な時だけにするのが無難だべ。

870 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:17:58 ]
逆だろ? 仮想関数を使う必要がある時だけ付けるよな。



871 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:19:40 ]
馬鹿が飛びつくつまらない話が出てきちゃった

872 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:22:00 ]
あとから仮想関数が必要になった時に付け忘れても知らんべ。

873 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:24:00 ]
JavaやC#みたいに継承禁止ができたら、安心してvirtualをはずせるけど。

874 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:24:09 ]
使われ方によって、virtualをつける必要があったりなかったりするC++は糞言語。

875 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:29:11 ]
final/sealed 欲しいよなあ。
Final ですってコメントつけて非仮想デストラクタにすることはあるけど、
コメントだけじゃ心もとないよな。

876 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:31:57 ]
クラス設計時点で継承の有無はわかるだろ。
あとから必要になったら、その時点で必要な修正を行えばいいと思うが。

877 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:33:10 ]
C++しか知らないと、そういう物の考え方するんだ

878 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:33:54 ]
うん

879 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:35:06 ]
そういう意味で言うと、後から必要になったときでも修正の必要がないように、
デストラクタは必ずvirtualで、っていうのも、あながち間違った選択ではないと思える。

880 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:35:29 ]
一体誰がどう使うクラスの設計してるんだ?



881 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:36:14 ]
とりあえず virtual を付けとけば、
どういう変更が必要になろうが何の心配も要らない。
virtual を付けてないと、後の変更でバグを発生させる可能性がある。
その変更を行うのが自分とは限らないわけで、
どっかのバカが変な事をするかもしれない。
そう考えると、デストラクタを非仮想にするのは、
よほど非仮想にするメリットがある場合じゃないと怖くてできない。

882 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:37:33 ]
C++って、そういう本質的でないところにも気を使わせるのが、糞言語たる所以だね。

883 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:38:31 ]
速度やデータサイズは本質的な問題だよ。

884 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:39:30 ]
じゃ、Javaなんてとてもじゃないが使えないってわけだ。

885 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:39:57 ]
そこが本質的な問題になることがあるから。

886 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:41:02 ]
速度やデータサイズを気にする必要があれば
Java なんてとてもじゃないが使えないってわけだよ。
気にする必要がないなら使えばいい。

887 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:42:07 ]
道具は選んで使うべきだ

888 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:42:50 ]
Cで書けばいいのに(^^

889 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:13:35 ]
>>868
> catchしなくても例外が通り抜けるときにデストラクタを呼ばないといけない

当たり前だろ。

正常にreturnする時にもデストラクタは呼ばれるのだから、
それは、例外のオーバーヘッドとは言わないだろう。

>>869
それなら、virtual なんて書かずとも全てがvirtual で、
nonvirtual などと書いたものだけがvirtual でなくなる、
そういう言語仕様になるだろうに。

890 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:15:24 ]
>>889
色々とお話しにならない。



891 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:19:11 ]
>>872
それをもってして、C++は実行時オーバーヘッドが大きな言語だと言われてもなぁ。

>>873
継承できないようにするハックはあるけど、まぁ、オススメしないわな。
もっと別の方法で、管理すべきだろうな。

>>874
使い方によって、だろ。

キャストしたポインタでdeleteするような使い方をする側が、
デストラクタがvirtualであることを確認し、そうでなければ、
継承するのではなくメンバに持つように実装すべきなんだ。

892 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:21:26 ]
>>890
具体的に

893 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:21:33 ]
>>891
> それをもってして、C++は実行時オーバーヘッドが大きな言語だと言われてもなぁ。
別にそんなこと言っとらんわ。

894 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:22:58 ]
>>891
> 継承できないようにするハックはあるけど、まぁ、オススメしないわな。
何か特殊なクラスを継承して、結局仮想関数が必要だったような気がする。

895 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:25:12 ]
C++が糞言語であることには、誰も異論はないだろう。

使っている道具を糞だと言っているだけで、
それを使う人間が糞だと言っているわけでもないのに。

C++が糞言語だと言われて顔を真っ赤にするのは、
Stroustrupだけで、いいんじゃないか。

896 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:26:07 ]
>>893
話の流れを無視した独り言だったのか。

897 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:26:23 ]
>>889
下記の f と h のコンパイル結果を比べてみるといい

struct S { ~S(); };

int g();

int f()
{
S s;
g();
return 0;
}

int h()
{
S s;
return 0;
}

898 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:28:39 ]
そういう言語仕様になるだろうにとか言われても、
今実際にそうなってないんだから、そういう事言っても無駄だよな・・・。

899 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:32:50 ]
>>894
ttp://article.gmane.org/gmane.comp.lib.boost.devel/101260
これかな。

それなりのコンパイラなら、
vtableは作られるが、使われないので、リンカによって削除されるだろう。

900 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:35:05 ]
>>898
そういう言語仕様になっていない
ということは、
というのが言語仕様を決めた人達は、
基本的にvirtual で例外的にvirtualではなくする
というポリシーではなかった、ということだね。

互換性のために、そういうポリシーだという可能性もあるが。



901 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:36:20 ]
>>899
あ、別に仮想関数は要らんかったか。

902 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:37:39 ]
>>900
デストラクタはデフォで virtual な方がいいけど、
他の関数は virtual がデフォである場合も nonvirtual がデフォである場合も
一長一短なので何とも言えない。

903 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:46:09 ]
>900

Stroustrupに聞いてみ、と言おうと思ったら、本人のページに書いてあったわ。
www.research.att.com/~bs/bs_faq2.html#virtual

「多くのクラスは、基底クラスとして使われるように設計されないから」だって。
基底クラスは、「基底クラス」と意識して最初から設計しろ、ってことか。


904 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:47:20 ]
仮想関数が1つでもあれば自動的にデストラクタもデフォで仮想関数になってくれればいいのにね。

905 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:55:29 ]
>>904
virtualなメンバ関数があるからといって、virtualなデストラクタが必要とは限らないしなぁ。
結局、どのようにdeleteするのかは、そのクラスを使う人が決めることだから。

使う人が決めることなのに、作る人が決めないといけないのは変だがね・・・。

906 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 01:18:27 ]
>>897
何が言いたいのか理解した。

~S()の呼び出しコードがhでは1個なのに対して、fでは2個になるってことか。
たしかにコードサイズは肥大するが、正常系のルートの実行速度には影響しないだろう。

ちなみに、
struct S { ~S(); };
というのは、
struct S { ~S() throw() ; };
とすべきだろうな。
デストラクタで例外をthrowしちゃいかんよ。

実行速度のために例外を(部分的に)使わないという選択もC++では可能だぞ。
int g() ;

int g() throw() ;
とすれば、f()やh()内では例外のためのコードが生成されない。

907 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 01:21:06 ]
結局、C++は遅い と言っている人は、
Cと同じことをするコードをC++で書いて遅いと言っているのではなく、
Cよりも複雑なことをするコードをC++で書いて遅いと言っているわけだ。


908 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 01:30:37 ]
>>907
少なくとも自分はそう言ってる
で、Cよりも複雑なことをしないのは難しい
まあ、Cとしてコンパイルできるコードを書けばいいだけだけど

909 名前:デフォルトの名無しさん [2007/11/24(土) 01:42:10 ]
stlとか複雑な機能を簡単にするやつを使うとCで書いた方が速い
たとえばstringなどは確保したときにサイズは確保されない もし文字列の最大長が分かっていればchar[]で取っておいた方が速い

910 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 01:43:35 ]
> int g() throw() ;
> とすれば、f()やh()内では例外のためのコードが生成されない。

そうするとg()側でコストが掛かる
g 内のコードが例外を投げないことが明確なときはコストはないけど
例外指定を書けないCのライブラリを呼んでたりするとお手上げ

例外関連のコストを避けるのは難しいね、ということでした



911 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 01:45:25 ]
>>909
そもそもクラスである意義を忘れないで下さい。

912 名前:デフォルトの名無しさん [2007/11/24(土) 01:46:51 ]
実際はアセンブラもCもC++もたいして変わらないが、まれにCよりアセンブラのほうが速く、まれにC++よりCのほうが速い
まれが重なると細かい手入れが出来るアセンブラが良くなる

913 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 01:52:57 ]
>>908
そうか・・・

>>909
STLの使い方が悪いと、そうなるね。

そのstringの例だと、
固定長の文字列のクラスを作ったらどうよ。

>>910
え? Cのライブラリは自動的に throw() として扱われるっしょ。
CのライブラリがC++の例外をthrowすることなんて、できないんだから。

914 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 02:02:27 ]
> え? Cのライブラリは自動的に throw() として扱われるっしょ。
> CのライブラリがC++の例外をthrowすることなんて、できないんだから。

いつもコンパイラにわかるわけじゃない

915 名前:デフォルトの名無しさん [2007/11/24(土) 02:05:26 ]
別にC++は遅くないと思うよ。標準ライブラリやSTLも使わずに、
カリカリにチューニングして書けば。でも、標準ライブラリも
STLも使わないC++使う意味なぞない。

標準ライブラリはメモリコピーとメモリの動的確保・開放
を前提にしているから遅い。だがしかし、これはC++を使う大きな
利点であるので捨てられない。

速度と効率を求めるならCを使えばいい。

916 名前:デフォルトの名無しさん [2007/11/24(土) 02:19:11 ]
これをインストールしたいのですがメイクが出来ません BCC5.5.1です
www.vector.co.jp/soft/dl/win95/prog/se059033.html
どうすればいいんでしょうか? エラー内容です

..\source\lib\remul.cpp:
エラー E2017 ..\source\lib\remul.cpp 38: メンバー名 'ctype_base::digit' が曖昧(関数 Mint::isRemUL(const unsigned long,int) const )
*** 1 errors in Compile ***
** error 1 ** deleting ..\BC5LIB\remul.obj

..\source\driver\berntbl1.cpp:
エラー E2367 D:\Programs\bcc\INCLUDE\constrea.h 41: 非 RTTI 基本クラス streambuf からは RTTI クラスを継承できない
エラー E2367 D:\Programs\bcc\INCLUDE\constrea.h 207: 非 RTTI 基本クラス ostream からは RTTI クラスを継承できない
エラー E2318 D:\Programs\bcc\INCLUDE\constrea.h 255: 'ostream' は多様性を持つクラスではない(関数 constream::isCon(ostream &) )
*** 3 errors in Compile ***



917 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 02:33:31 ]
>>914
具体例は?

>>915
STLが遅いと言ってる人は、
実装が悪いSTLを使っているか、
コピーにコストがかかるオブジェクトを直にコンテナに格納するとかの使い方が悪いんじゃないか。

918 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 02:38:19 ]
ヘッダファイルに

int g();

と書かれててコンパイラにわかる?

919 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 02:53:18 ]
>>918
C++から、C++を考慮していないCのヘッダファイルを使う場合、

extern "C" {
#include "hoge.h"
}
とするのが普通だろ。

"C"なら、C++の例外をthrowしないということがわかる。

920 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 02:56:30 ]
>>918
で、コンパイラ付属のC標準ライブラリをC++から使った場合に、
例外をthrowするものとして扱われてしまう、そういう具体例は?

具体例を挙げてもらったところで、
そんなダサいコンパイラを使うのはやめろ
なのだが・・・。



921 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 03:04:18 ]
じゃあ、C++のヘッダファイルでCのヘッダをナイーブにインクルードしちゃってた場合は?

いいだしたらきりがないけど

922 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 03:07:44 ]
ああそうか
インクルードパスの調整とかで回避できるか

923 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 03:08:31 ]
>>920
はは、そんなことは言ってないよ

924 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 03:14:34 ]
>>921
そのC++のヘッダファイルの責任だよ、Cのヘッダファイルをextern "C"の中でincludeするのは。

間違った使い方をしたときの話をしても、しかたあるまい?

925 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 03:17:27 ]
いや、そういうことも含めてコストの話をしていたつもり
ほとんどのプログラムは完璧じゃないから

論点がずれてたね

926 名前:デフォルトの名無しさん [2007/11/24(土) 03:27:21 ]
>>917
いやいや。例えば、あるバッファがプログラムの中で必要だったとしよう。

myvec.assign(nlen, '\0');
func(&myvec[0], myvec.size());

というように、C++だとかけるし、スコープ外にでれば、myvecで確保した
メモリが自動解放されるので、メモリリークの心配も少ない。Cだときちんと開放
しないとメモリリークを起こす。んで、これはC++の大きな利点。

クラスを自分で実装しても、ちゃんとメモリリークしにくい実装という
のはできるけど、標準ライブラリで多くの機能が実装されているという
のがC++の利点だといっているわけで。

ただし、こういう利点を享受するためには、メモリの動的確保・開放
を受け入れなければならないって話ナ。

927 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 04:08:27 ]
>>926
何を言いたいのか、わからないなぁ。

もしかして組込屋?

以前に電話の交換機のソースを見たが、ありゃぁ酷かった。
変数がすべてグローバルでstaticな上に、変数名がメモリの番地で、
しかも、同じ変数を時と場合によって違う用途に使いまわしていたり。

メモリの容量が足りないとか、
どれだけ長く動かし続けても決められた状態以外にはならないとか、
そういう特殊な事情があるというのは理解できるが、ありゃぁ別世界だよ。

928 名前:デフォルトの名無しさん [2007/11/24(土) 04:14:23 ]
>>927
別世界だが、そういう世界でなければCをワザワザ使わないって。
俺もC++スキダケドナ。使えないのよ。

929 名前:デフォルトの名無しさん [2007/11/24(土) 04:15:30 ]
>>927
>変数がすべてグローバルでstaticな上に、変数名がメモリの番地で、
>しかも、同じ変数を時と場合によって違う用途に使いまわしていたり。

ちなみにこの発言は、もの知らなすぎるなw

930 名前:デフォルトの名無しさん [2007/11/24(土) 04:21:57 ]
ちなみに、メモリ制約の大きいところでは、そもそもメモリの
動的確保・開放は使えないからな。最終的に作り上げたアプリが
最大でいくつのメモリを必要とするかを提示できないといけないから。



931 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 04:24:47 ]
>>929
ああ、その別世界の住人ではないからな。

たまたま機会があって、ちらっとソースを見て話を聞いて、
その彼らのコーディングルールにぶったまげただけだもの。


932 名前:デフォルトの名無しさん [2007/11/24(土) 04:27:39 ]
まぁ927は、コンピュータの基礎から勉強しなおすのを薦める。

933 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 04:33:23 ]
>>932
話が繋がりませんが? どういうことよ。

マイコン = マイクロ・コントローラな人達の世界の常識なんて、いらないよ。

934 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 04:34:05 ]
日本の時代錯誤的な作り方をしている携帯電話屋か。
過労で頭がどうにかしてしまったかい?

935 名前:デフォルトの名無しさん [2007/11/24(土) 04:42:07 ]
>>933,>>934

時代錯誤だと思い込んでるのは、幼稚な日本の技術者だけだよ。
自分の頭で普通に考えればわかることだ。

課題「なぜ、低級言語がなくなることは考えにくいか、1000文字以内で論じなさい」

936 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 04:44:32 ]
>>935
三流大学の講師にでもなったら?

937 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 04:46:49 ]
プッ

938 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 04:58:26 ]
自分で理路整然と説明できないので、
学生たちにレポート書かせて、その中から優秀なのを見つけて自分のものにする
そんな人間だな。

携帯電話のアプリケーション用プロセッサの性能とメモリ容量は、
すでにSun4あたりの昔のUNIXワークステーション並で、
リブートせずに連続動作する時間は同じくらいなのに、ソフトの作りがまるで違う。
その理由は様々考えられるだろうけど、1つ言えるのは、
設計者が過去の別次元のやり方をそのまま使っているか否かだと思うよ。

939 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 05:00:59 ]
お前ら、スレタイも読めない馬鹿には、発言権なし!

940 名前:デフォルトの名無しさん [2007/11/24(土) 05:05:39 ]
>>938
君の発想では、もっとも低レベルのCPU、メモリを使用している
ものは携帯電話までだというようだけど、それって今後も
ホントウにそうなのか?



941 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 05:07:10 ]
こういうタイプの人間は決まって自分から答えを言おうとしないんだよな。

942 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 05:38:45 ]
>>940
スレタイも読めない馬鹿ですか?

943 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 05:40:53 ]
>>941
言おうとしないのは、言えないからだよ。

944 名前:デフォルトの名無しさん [2007/11/24(土) 05:47:33 ]
>>941,943
思考停止は、成長を停めるぞ。

945 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 06:28:37 ]
>>944
煽るだけかよ。
スレタイを見て適切な行動を取れ。
でなければ、お前が思考停止の老害だ。

946 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 07:26:39 ]
>>916
なんか指定のコンパイラが古いね。
エラーメッセージも危険な香りがする。
あきらめて同等の他のものを探した方が早い気がするんだけど、だめかなぁ?

947 名前:デフォルトの名無しさん [2007/11/24(土) 09:01:17 ]
ループの中で行う処理の中に標準出力を入れたとき、
コンパイルして実行したらループの中の標準出力がでてこないときがあるのですが
どうすれば解決できるのですか?

948 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 09:07:18 ]
>>947
ループと標準出力を結びつけないで考えるようにすればいいんじゃないかな?

949 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 09:18:33 ]
>>947
現象を再現できる最小のコードを書いてうpしてみそ。

950 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 09:20:25 ]
組込み屋だが・・
>>927が例に出してるような環境は組込みでも珍しいと思う。
10年以上やってるが、そんなコードは見たこともない。
スタックは昔から使えるから、auto変数ぐらいは使えるはずだが。
ただ、
>変数がすべてグローバルでstaticな上に、変数名がメモリの番地で、
>しかも、同じ変数を時と場合によって違う用途に使いまわしていたり。
↑これはレジスタのような気がしなくも無い。

今ではmalloc/freeくらいは実装する場合が多いと思うよ。
動的確保でも、大体のメモリ見積はできるしね。
けどSTLとなると大概はオーバースペックだと思うな。

>>938
>設計者が過去の別次元のやり方をそのまま使っているか否かだと思うよ。
↑これは別に否定しないが、仮想記憶が無いことがほとんど、というのがでかいと思うよ。
ちょっと前までやってた仕事では、メモリ1GBあっても「足りない」と言ってたし。




951 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 09:22:02 ]
>>947

何らかの理由でループの中に入らないことがある、と言う事だろう。
そのあたりが多分バグ。


952 名前:デフォルトの名無しさん [2007/11/24(土) 09:40:44 ]
>>949
再現というか、一通りforループの中の計算の処理をしおわって、ループを抜けた後に
ループの中に書いた標準出力がワーッと出てくるような感じなんですよね

シェルスクリプトみたいに逐一でるようにはならないのかなあと考えているのですが
どうすればよいのかわかりませんです

953 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 09:43:05 ]
>>952
ループの中にfflush(stdout);とか入れてみるとか。

954 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 09:44:28 ]
>>905
まあ new しないで使うだけの事もあるし、
new したとしても常に元の型で delete する場合もあるだろうしな。
ただ、安全を考えるならとりあえず virtual にしといて、
それが速度に影響していた場合だけ変えればいいと思うよ。

仮想関数が1つでもあればどうせ仮想関数テーブルは存在するし、
delete 使わずにデストラクタが直接呼ばれる場合には
どのクラスのデストラクタを呼ぶか確定してるから普通のメンバ関数と同じ形で呼ばれるから
特別なコストは発生しないし。(インライン化も可能。)
つまり、仮想デストラクタが影響するのは delete 時のコスト変化だけだから、
既に仮想関数テーブルがあるような状況では、
常に元の型で delete する場合にしか影響は無い。
でも、delete のコストで普通はまぎれる。

955 名前:デフォルトの名無しさん [2007/11/24(土) 09:48:06 ]
endlだとブッファが効く \nだと一行ずつ出力する

956 名前:デフォルトの名無しさん [2007/11/24(土) 09:50:25 ]
質問お願いいたします。

動かないゲームの補助ソフトのソースをいただき、
「○○の部分を○○に書き換えてコンパイルしてexeにすれば動くようになるよ」
と教えて頂き、書き換えまでは何とか出来たのですが、コンパイルが出来ません
googleでしらべてみて、該当ソフトらしき物を幾つかベクターで落として試してみたのですが、exeファイルに出来ない状態です。
ご指導いただけると嬉しいです

ちなみに書き換えたファイルの拡張子は cpp と h でした

よろしくくお願いします

957 名前:デフォルトの名無しさん [2007/11/24(土) 09:56:44 ]
ファイルをアップしてくれないと分からない
してくれればexeに出来るかもしれない

958 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:01:30 ]
>>947
可能性1 標準出力がバッファリングされている
可能性2 ループがCPUを使いっぱなしのため、標準出力を画面等に表示するスレッドにCPUが廻らない

具体的な話を出さない質問だと、これくらいか。

959 名前:956 mailto:sage [2007/11/24(土) 10:02:20 ]
>>957

www.vipper.org/vip674870.rar.html

こちらになりますです
よろしくおねがいいたします

960 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:03:23 ]
>>956
VC++ 2005 Express Edition でも使え

>>957
そのゲームがやりたいだけだろw



961 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:04:36 ]
>>956
多分、コンパイルができるようにならないと無理だと思う。
cpp は C++ のソースファイルだと思うから、 C++ の勉強を一からしてみよう。

962 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:10:05 ]
>>959
おいおい、そのソースはこうやって公開していいものなのか?

963 名前:956 mailto:sage [2007/11/24(土) 10:14:33 ]
>>960
VC++ 2005 Express Edition が該当コンパイルソフト?なのでしょうか?

>>961
それがベストなのはもちろん理解しているのですが、今回とりあえずはこれさえexeに出来れば良いMPのでして・・・

>>962
作者の方が勝手にいじってくれて結構と公言しておりますので問題有りません
作者による更新が止まってしまったので、ソースを頂いて書き直したのですが、コンパイル出来ない状態です 笑

964 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:18:33 ]
>>954
パレートの法則があるわけで、速度が求められる部分は限られていて、
大半の部分は速く動く必要がないので、C++が多少遅くても問題ないよね。
速度が求められる部分だけ、速度に気を遣って書けばいいし、
なんなら、そこだけCで書いてもいいしさ。

それに、C++が遅いといってもO(1)の話だから、どうでも良かったりする。

965 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:20:02 ]
ようわからんが、オンラインゲームチーティング用コード?

966 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:22:25 ]
まあ O(1) もループ内に入れば O(N) やら O(N^2) やらになるんだけどね。

967 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:22:53 ]
>>959
おい、そいつはUltimaOnlineのチートツールか?

プログラムを書くのではなく、使うのが目的の人は、板違い。

968 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:24:55 ]
升ツールにやれるアドバイスはないな。

969 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:25:43 ]
>>966
そういう場合、多重にループさせるアルゴリズムのほうに問題があって、そっちを改良すべきでしょう。

970 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:26:16 ]
>>963

このソースはVC++じゃないとコンパイルできない。
VC++はいくつかエディションがあるが、無償なのはExpress Editionだけ。
www.microsoft.com/japan/msdn/vstudio/express/visualc/

あと、このソースだとPlatform SDKが要る。
多分これ。
www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en




971 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:27:12 ]
>>970
仁義守れや。

972 名前:956 mailto:sage [2007/11/24(土) 10:30:34 ]
>>967
>>965
そうです
あれ、板違いですか
失礼致しました・・・

>>968
そう言わずに何とかお願い致します。

>>970
おっと
有り難うございます!
とても難しそうですが頑張ってみます!

973 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:52:45 ]
なんでNODEFAULTLIB設定してるんだろ
あと古いプロジェクトファイルをVC2005でコンパイルするとたまにGSオプション無効にしないとリンカエラーになるのもよくわかんね

974 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 11:02:46 ]
>>972
大麻の栽培方法を公衆の面前で人に聞いて回るような、そういう行為をしているっていう自覚ないんか?

975 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 11:07:09 ]
ないからやっているんだろ

976 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 11:08:15 ]
次スレ要る?ここへ合流でいいと思うんだが。
【初心者歓迎】C/C++室 Ver.44【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1194016813/l50


977 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 11:09:08 ]
>>974
違法じゃないと思うからちょっと大げさなんじゃないかな。
金払ってやるゲームでのずるの仕方を聞いてるわけだ。
それ以上でもないし、それ以下でもない。

978 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 11:11:15 ]
UOはチート自由なのか? それでよくゲーム運営が成立しているな。

979 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 11:37:16 ]
>>977
認識が甘い。

チートは、
不正アクセス防止法
電子計算機損壊等業務妨害罪
この2つに抵触する可能性がある。

980 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 11:41:15 ]
チートというよりbotのようだけど



981 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 11:46:35 ]
違法か否かというのは刑事の話。

刑事とは別に民事で訴えられる可能性もある。
もしも、他の大勢のプレーヤのゲームバランスを著しく損うようなチートをして、
それが原因でゲーム会社の売上が見込みよりも大幅に減った場合、
その損害の賠償を求められる可能性もある。
一人のプレーヤがチートしたところで高が知れているので現実的には可能性は低いがね。


982 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 11:49:17 ]
まぁ何にしても、
後ろめたいことをやるなら、自力でやれ、他人に手伝わせるな
ってことだ。


983 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 18:18:18 ]
>動かないゲームの補助ソフトのソースをいただき、
HWND window = FindWindow ("Ultima Online", NULL);
確かに補助ソフトになるのかな?
笑ろた、
DLLへの参照が未解決になってるっぽいけど、
もしかして新手の釣りかも
調子こいてexe実行したらキンタマが感染なんて怖いお


984 名前:デフォルトの名無しさん [2007/11/25(日) 13:18:23 ]
RubyからDirectXは扱えないと一度レスもらったのですが、
ということはRubyからCOMにアクセスできないということなのでしょうか?

985 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 13:42:24 ]
スレタイ嫁

986 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 13:59:35 ]
スレ違いでしたね
すいませんでした。
というより
そろそろレス数も少ないので
証拠隠滅で埋めますか?ウヒ

987 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 14:20:14 ]
埋める前に次スレたててこい

988 名前:デフォルトの名無しさん [2007/11/26(月) 12:33:18 ]
質問します
LPDWORD型をint型に変換する方法教えていただけませんか?

989 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 12:39:51 ]
(int)lpdw

990 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:23:21 ]
>>989
ありがとうございます。それって、こういうことですよね?
LPDWORD lpdw;
int i = (int) lpdw;
エラーになるようですが。
foo.c:4: error: aggregate value used where an integer was expected



991 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 16:44:33 ]
そもそも、LPDWORD型は何なのか勉強しなおした方がいいとおもうよ

992 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 16:54:12 ]
>>991
typedef struct {
int foo;
int bar;
} LPDWORD;
こうですか? わかりません。

993 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 17:15:05 ]
LPDWORDは、long pointer DWORDじゃね?

994 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 17:18:32 ]
>>993
どこの規格に書いてありますか?

995 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 17:33:20 ]
Microsoftの俺仕様

996 名前:やばす [2007/11/26(月) 17:36:52 ]
rubyで最大値を出すコマンド教えてください><

997 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 17:38:06 ]
何の最大値?

998 名前:やばす [2007/11/26(月) 17:39:19 ]
えーと
例えばクラスのテストの点数の最高点をだす
とかです

999 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 17:39:47 ]
埋まるからとりあえず質問したいやつはここ行け
【初心者歓迎】C/C++室 Ver.44【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1194016813/l50

>>996
スレ違い

1000 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 17:40:56 ]
umeeeeeeeeeeeeeeeeeeeeeeeeeee



1001 名前:1001 [Over 1000 Thread]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<260KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef