スレを勃てるまでもないC/C++の質問はここで 3at TECH
スレを勃てるまでもないC/C++の質問はここで 3 - 暇つぶし2ch2:デフォルトの名無しさん
07/08/19 20:08:45
sizeof(char)論争は隔離スレでやってくれ。

sizeof(char)が必ず1でも、省略すべきではない
スレリンク(tech板)

3:デフォルトの名無しさん
07/08/19 20:20:52
わざわざスレ立てるなんてアホじゃねw

4:前スレ980
07/08/19 23:22:39
>>前スレ983
フォロー thx

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

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

5:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/08/20 01:31:04
>>5
わけわかんねぇソースと理屈をたれんな

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

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

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

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

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

11:デフォルトの名無しさん
07/08/23 23:21:30
悪いことは言わん。
諦めた方がいい。

12:デフォルトの名無しさん
07/08/23 23:27:12
>>10
推薦図書/必読書のためのスレッド 36
スレリンク(tech板)


13:デフォルトの名無しさん
07/08/23 23:28:39
>>10
マルチ乙

14:デフォルトの名無しさん
07/08/23 23:29:04
猫でもわかるWin32API

15:デフォルトの名無しさん
07/08/24 00:05:12
>>10
ぐぐるさん

16:デフォルトの名無しさん
07/08/24 00:06:07
>>10
C++/CLIに移行するとか。

17:デフォルトの名無しさん
07/08/24 01:34:20
>>9
LPCTSTRって、const TCHAR * じゃんか。


18:デフォルトの名無しさん
07/08/24 01:44:04
だからそう書いてんじゃねぇか

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

20:宿題は宿題スレへ
07/08/24 02:09:22
>>19
いやです。

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

22:883
07/08/24 19:43:59
どうしても解けないと分かっているならそれで良いじゃないか。

23:デフォルトの名無しさん
07/08/24 19:47:45
あんた誰

24:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/08/25 15:45:15
かわいそうに。すでに解決済みだというのに・・・

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

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

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

28:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/08/25 18:26:39
俺ならstd::vectorではなくstd::setを使う。
intなら比較関数オブジェクトを与える必要もなく、
rendからイテレータで舐めることで、ソート順をひっくり返す。

30:デフォルトの名無しさん
07/08/25 21:20:53
うへぇ、確かにこの場合はそっちの方が楽そうだ

31:デフォルトの名無しさん
07/08/25 21:24:29
rendではなくrbegin()な。

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

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

ってのはどうよ。

34:デフォルトの名無しさん
07/08/26 04:32:11
いやです。

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

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

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

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

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

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

38:36
07/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:デフォルトの名無しさん
07/08/31 20:07:29
自己レスかよ

40:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/08/31 22:18:26
>>40
&TTest::axxと書けばいいはず。
VC++ 2005では規格への準拠度が上がって、
メンバへのポインタの取得に標準から外れる書き方を認めなくなった。

42:デフォルトの名無しさん
07/09/01 00:07:59
>>41
できました…本当にありがとう!

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


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

45:デフォルトの名無しさん
07/09/01 01:54:20
気がしました。

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

47:デフォルトの名無しさん
07/09/01 01:57:38
と書かれていたような気がしました。

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

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

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


49:デフォルトの名無しさん
07/09/01 02:42:29
と書かれていたような気がしました。

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

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

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

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


53:デフォルトの名無しさん
07/09/01 10:33:26
>>52
うるせーバ~カ

54:48
07/09/01 10:40:57
>>50
> 速くしたいのはどれだけ、というのは難しくとにかくできるだけ

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

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

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

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

55:デフォルトの名無しさん
07/09/01 10:41:52
>>53
心が寂しいんだね。同情するよ。

56:デフォルトの名無しさん
07/09/01 10:53:11
>>55
同情するな金をくれ!

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

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

58:デフォルトの名無しさん
07/09/01 11:06:12
もう少し日本語を勉強したほうが良いと思うよ・・・

59:デフォルトの名無しさん
07/09/01 17:44:33
gcc -O2 hoge.c

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

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

61:デフォルトの名無しさん
07/09/03 11:39:07
>>60
死ね

62:デフォルトの名無しさん
07/09/03 23:00:16
たった一言で誰だか分かってしまうこのクォリティw

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

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

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

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



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

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

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


66:65
07/09/04 03:08:06
言葉が足りなかったかも。

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

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


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

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

69:デフォルトの名無しさん
07/09/04 07:47:22
メンバポインタのようにも見える
→ *

70:デフォルトの名無しさん
07/09/04 12:43:16
メンバポインタだな

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

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

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

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

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

73:デフォルトの名無しさん
07/09/04 23:56:36
delete this;

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

74:デフォルトの名無しさん
07/09/05 00:08:48
newで作ってないインスタンスはdeleteで消せないんですね。

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

75:デフォルトの名無しさん
07/09/05 00:15:31
つ[スマートポインタ]

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

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

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

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

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


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

81:デフォルトの名無しさん
07/09/05 07:06:58
>>77
ないならば、用意すればいい。

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

82:67
07/09/05 08:31:06
>>69-70
ありがとうございます。

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

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


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

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

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

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

86:デフォルトの名無しさん
07/09/07 22:29:14
>>83はもしかしからデストラクタを呼びたいのかも。


87:デフォルトの名無しさん
07/09/07 22:30:20
>>83じゃねえや>>71だな。

88:デフォルトの名無しさん
07/09/08 13:10:16
関数の引数で、
読み取りのみで変更を行わないものは、

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

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

89:デフォルトの名無しさん
07/09/08 13:19:56
常に前者。

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

90:デフォルトの名無しさん
07/09/08 15:59:14
なぜポインタではなく参照を使うのでしょうか。


91:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/09/08 16:58:52
C++で色々なプログラムを作りそのときの考え方を示し
実際にどのようにして作るのか解説してくれる本はありませんか?

93:デフォルトの名無しさん
07/09/08 17:25:48
88です。

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

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

95:デフォルトの名無しさん
07/09/09 01:14:54
>>94
>>91はそういう話をしている。何も間違ってない。

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

97:デフォルトの名無しさん
07/09/09 01:51:34
日本語でおk

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

99:デフォルトの名無しさん
07/09/09 02:00:32
何や此奴俺初めて書き込んだのに

100:デフォルトの名無しさん
07/09/09 02:03:39
91の言いたいことはわかるが、
説明がいまいちだったな。

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

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

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

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

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


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

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

107:デフォルトの名無しさん
07/09/09 04:52:58
>>106
VisualC++

108:デフォルトの名無しさん
07/09/09 04:54:27
>>107 ありがとうございます!

109:デフォルトの名無しさん
07/09/09 07:18:46
>>106
107は、あなたをからかっている。

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

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

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

111:デフォルトの名無しさん
07/09/09 07:58:30
GUIとCUIどっち?

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

113:デフォルトの名無しさん
07/09/09 08:21:34
じゃぁ、C++Builder


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

115:デフォルトの名無しさん
07/09/09 09:37:33
>メールサーバに迷惑を掛けることにもなりかねない

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

116:デフォルトの名無しさん
07/09/09 09:57:01
どうせやるなら、そこらに無いものを作ろうよ。


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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

125:124
07/09/09 12:04:27
捕捉

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


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

127:デフォルトの名無しさん
07/09/09 12:57:45
int &x
bool &y
void* &pData

128:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/09/09 14:32:38
"voidポインタ"型の参照 と思え
それがよくわかるように>>127みたいに書くのを俺はすすめる
(int* a, b; ってできないから困るが。)

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

131:デフォルトの名無しさん
07/09/09 15:38:10
VC++の場合はロックする必要がある
URLリンク(msdn2.microsoft.com)(VS.80).aspx

gccの場合もロックする必要がある
URLリンク(gcc.gnu.org)

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

132:デフォルトの名無しさん
07/09/09 16:30:35
>>130
もしWindowsなら、Mutexよりも、CriticalSectionを使おう。

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

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

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

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

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

136:デフォルトの名無しさん
07/09/09 20:09:18
>>135 ありがとうございます。ちょと調べてみます。

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

138:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/09/09 22:00:34
コピペ?

141:デフォルトの名無しさん
07/09/09 22:03:03
すいません
聞く場所を間違えたのでここにコピペしました

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

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

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

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

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

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

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

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

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

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

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

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

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

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

151:144
07/09/09 23:09:28
>>150
ああそういえば・・・

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

152:140
07/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:デフォルトの名無しさん
07/09/10 00:04:13
おやすみ。

明日からは
ネットワークプログラミング相談室 Port20
スレリンク(tech板)
へどうぞ。

154:デフォルトの名無しさん
07/09/10 00:11:46
(struct tm)* now;

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

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

156:デフォルトの名無しさん
07/09/10 17:46:15
Boostのドキュメント

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

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

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

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

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

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

お願いします。

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

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

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

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

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

よろしくお願いします。

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

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

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

166:やおい
07/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:やおい
07/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:デフォルトの名無しさん
07/09/11 02:41:37
質問です。
char* foo(){
return new char[50];
}
という関数があって、戻り値をdeleteしたいとき、
char* buf=foo();
delete buf;
でよいの? delete[]にできなくて気持ち悪いんだが。
char[] foo(){ とか書けないし。

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

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

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

172:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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
07/09/11 08:17:23
追加

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

175:173
07/09/11 08:20:43
たびたびすまん

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

176:デフォルトの名無しさん
07/09/11 08:23:33
>>172
strstreamとか
strstreambufとかを調べろ

177:デフォルトの名無しさん
07/09/11 08:27:49
>>170
話を端折りすぎ。

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

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

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

179:デフォルトの名無しさん
07/09/11 08:52:37
C言語らしく。

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

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

181:デフォルトの名無しさん
07/09/11 08:58:49
>>171
ありがとうございます。うまくいきました

182:やおい
07/09/11 09:09:19
>>166-167
この問題についても分かる方居ましたら是非お願いします・・・。



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

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

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

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

186:デフォルトの名無しさん
07/09/11 18:39:25
VC

187:デフォルトの名無しさん
07/09/11 18:54:21
Visual C++というのでいいのでしょうか?

188:デフォルトの名無しさん
07/09/11 18:57:53
VC#

189:デフォルトの名無しさん
07/09/11 18:59:44
>>185
C++ではなく、Cで?
それはまた酔狂だな。

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

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

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

2005は知らね

192:デフォルトの名無しさん
07/09/11 22:21:48
2005もだけど

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

194:やおい
07/09/14 00:03:55
>>183-184
遅くなってすみません。
返信ありがとうございました。

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

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



195:デフォルトの名無しさん
07/09/18 01:47:52
ファイルがあって先頭にHEADERがついています

-------

○○○
○ ○ ○

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

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

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

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

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

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

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

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

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

199:デフォルトの名無しさん
07/09/18 21:13:03
>>198
ハァ?

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

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

202:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/09/22 02:48:03
なるほど。

ありがとうございます。

204:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/09/23 08:42:46
C++でもおkってんならboost::multi_arrayを導入するのを考えてもいいよ
って僕の隣のboost厨がいってます

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

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

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

209:デフォルトの名無しさん
07/09/23 17:21:40
>>207
隙間なく連続しているとは限らないというのは、正しい。


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

211:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/09/25 22:39:29
超初心者質問ですが「defineできる」とはどういう意味ですか?
defineで定数を宣言するということでしょうか?

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

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

MyClass my;
my.foo(5);

と、

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


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


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

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

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

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

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

220:デフォルトの名無しさん
07/09/26 07:02:17
>>219
質問のポイントが漠然としすぎてる。

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

221:デフォルトの名無しさん
07/09/26 08:03:39
デバイスドライバと連携をとりたいとかかなあ。

222:デフォルトの名無しさん
07/09/26 08:36:58
>>219
DirectX

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

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

224:デフォルトの名無しさん
07/09/26 16:11:41
超初心者はプログラムするな

225:デフォルトの名無しさん
07/09/26 16:14:01
あほか

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

227:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/09/26 17:25:42
>>227
2進数だから。

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

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

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

231:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/09/26 23:16:12
double result = 0;

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


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


235:デフォルトの名無しさん
07/09/27 22:56:38
>>234
VC6はC99未対応だから無いんで内科医?

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

237:デフォルトの名無しさん
07/09/28 01:19:27
>>236
fgets()でやれば?

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


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

240:デフォルトの名無しさん
07/09/28 01:56:46
scanfも非推奨

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

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

243:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/09/28 03:17:34
printf("%-*s : 名前", NAME_MAX, &name[0]);

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

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


246:デフォルトの名無しさん
07/09/28 14:56:42
>>242
何も入力しないでエンター押した時のことでしょ

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

248:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/02 17:54:57
int sum_ave → void sum_ave

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

251:デフォルトの名無しさん
07/10/02 17:57:17
>>249
ありがとうございます

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

252:デフォルトの名無しさん
07/10/02 18:02:51
本のタイトル晒せ

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

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

本に書いてあるのがひょっとしたら間違えてるのかなと思って
正誤表URLリンク(www.shuwasystem.co.jp)をみたのですが
そのページのことは何も書いてなかったので私が間違えてるのかなと・・・

255:デフォルトの名無しさん
07/10/03 01:55:00
>>254
すごく恥ずかしいタイトルの本だなぁ。

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

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

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

258:デフォルトの名無しさん
07/10/04 16:36:02
ハゲって言うなこのハゲ!!

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

260:デフォルトの名無しさん
07/10/06 06:54:23
そうだそうだ!
「ハゲ」って言うな俺ハゲ!

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

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

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

264:デフォルトの名無しさん
07/10/06 13:37:13
>>262
漠然としすぎてる。

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

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

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

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

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

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

269:デフォルトの名無しさん
07/10/06 14:31:15
嫌いな人が居るなら殺しちゃえばいいんだよ

270:デフォルトの名無しさん
07/10/06 14:32:26
belution最近調子わるいみたいだね。

271:デフォルトの名無しさん
07/10/06 14:41:21
>>267
>265に、「ここ見える、漏れ」と書いてあるが。

272:デフォルトの名無しさん
07/10/06 14:46:41
揚げ足を取るならせめておもしろくしようや

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

274:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/07 04:59:03
ある

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

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

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

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

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

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

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

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

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

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

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

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

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


282:デフォルトの名無しさん
07/10/09 09:56:54
>>281
> 実行したとたんに終了してしまうのです。

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

話はそれからだ。

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


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

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

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

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

286:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/09 11:28:37
>>286
関数のプロトタイプ宣言がなされていない場合などに、スタックに積まれる内容が違ってくる。

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

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

290:デフォルトの名無しさん
07/10/09 12:36:17
>>287
for ループの l = l - 2L には関係ない話だね。


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

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

291:デフォルトの名無しさん
07/10/09 12:48:03
>>289
おいおい。

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


292:BjarneStroustrup
07/10/09 17:08:29
なにこのスレワロタ

293:デフォルトの名無しさん
07/10/09 20:34:24
64bit環境を想定したかったんじゃね

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

>>292
うっさいハゲ!

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


296:デフォルトの名無しさん
07/10/09 22:06:16
>>289
× 対処療法
○ 対症療法

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

298:デフォルトの名無しさん
07/10/10 21:05:17
環境を書かないと

299:デフォルトの名無しさん
07/10/10 21:44:33
>>297
デバッガ って何だか、わかってる?
ステップ実行 って何だか、わかってる?

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

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

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

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

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

302:デフォルトの名無しさん
07/10/10 21:52:09
stringつかっとけ こっちが業界標準

303:デフォルトの名無しさん
07/10/10 21:54:20
マルチバイト使うなら俺はwstringを使うぞ

304:デフォルトの名無しさん
07/10/10 21:55:00
>>301
半角文字のときは1個、全角文字のときは2個分進める。

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

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


306:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/10 22:21:26
それは、半角なら1個ずつ順番に出せるコードなのか?

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

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

309:デフォルトの名無しさん
07/10/10 22:40:56
>>305
面倒くさいからUnicode使え。

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

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

312:デフォルトの名無しさん
07/10/10 23:10:33
>>311
ありがとうございました。

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

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

315:313
07/10/11 03:44:00
>>314
ありがとうございました。

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


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

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

319:デフォルトの名無しさん
07/10/11 22:27:08
>>318
StretchBltで検索

320:デフォルトの名無しさん
07/10/11 22:33:50
Expression Template(ET)の質問です

URLリンク(homepage1.nifty.com)

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

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

322:デフォルトの名無しさん
07/10/12 00:40:32
>>320
質問の答えにはならないが・・・。

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

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

323:322
07/10/12 00:41:14
文章が変だった。

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

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

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


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

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

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

328:デフォルトの名無しさん
07/10/12 04:18:09
「特性」ってのをもっと具体的に説明しる

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

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


331:デフォルトの名無しさん
07/10/12 05:33:44
いるよ

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

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

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

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

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

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

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

struct DATA data;

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

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








338:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/12 12:09:08
>>336
そういうことです

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

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

342:デフォルトの名無しさん
07/10/12 12:14:33
>>340
無駄な指摘乙。

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

343:デフォルトの名無しさん
07/10/12 12:15:35
>>337
vec[i].n = 5;

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

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

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

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

346:340
07/10/12 12:17:32
>>342
あー、%Cの間違い。

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

347:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/12 12:22:47
そもそも、int はマズいな。wchar_t だ。

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

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

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

CData *p;

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

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

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

351:デフォルトの名無しさん
07/10/12 13:25:49
p = &vec[i];

352:351
07/10/12 13:29:06
いや、まて。 なにかおかしい。

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

353:デフォルトの名無しさん
07/10/12 13:33:12
的確すぎてワロタw

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


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

356:337
07/10/12 14:39:49
vector<Base*>で上手くいきました。
ありがとうございました。

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

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


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

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

360:デフォルトの名無しさん
07/10/12 16:13:43
>>359
何のために学費払ってんだよ。
先生に聞け、先生に。

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

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

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

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


364:デフォルトの名無しさん
07/10/12 20:57:03
>>363
さぁな、どんなバグがあるかは、デバッグしてみないとな。

365:デフォルトの名無しさん
07/10/12 20:58:47
>>363
テストしたの?

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

366:デフォルトの名無しさん
07/10/12 21:13:30
おまえらこんな抽象度の高い質問によく答えられるな

367:デフォルトの名無しさん
07/10/12 21:21:50
回答も抽象的だし

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

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

370:デフォルトの名無しさん
07/10/12 22:00:39
学生さんか。
じゃぁ、>>365の本は向いてない。

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

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

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

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


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

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

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


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


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

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

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

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

378:デフォルトの名無しさん
07/10/13 11:14:58
l1とl2の型をdoubleにする。

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

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

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

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

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

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

385:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/13 12:07:12
>>382
いいえ、勘違いではなくclock_tがdoubleなどの実数型であるとでも思っているのでしょう。

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

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

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

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

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

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

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

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



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