スレを勃てるまでもないC/C++の質問はここで 3
わざわざスレ立てるなんてアホじゃねw
>>前スレ983 フォロー thx MSDNもあわせて読んでみた。 デバッグのmallocで余分に取られる領域を、デバッグのためというか その一部をちゃんとオーバーフローに備えた領域として確保して かつオーバーフローを検出してる、と。 だから、極端にオーバーフローしなければ、 デバッグ情報含めて正常に(?ん〜、落ちずに?)動作する、ということか。 980で書いた「食いつぶして」って言うのは、表現おかしいな。
たとえば、 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 になる。 とてつもなく長い文字列ができあがってしまい、 ヒープの残り容量よりも大きくなり、新たにヒープをこさえることになる。
>>5 わけわかんねぇソースと理屈をたれんな
7 :
デフォルトの名無しさん :2007/08/23(木) 20:41:03
一言だけ言わせてください。TCHARなんて使ってるCプログラマはいません!
使ってるよ。 お前がプログラマじゃないだけ
>>7 Windowsは変なTypedefつかうくらいならTCHARでポインタ宣言したりしたほうがわかりやすいと思う。
LPCTSTRとかねぇ、もーわけわからん。
10 :
デフォルトの名無しさん :2007/08/23(木) 23:18:15
教えて君ですみません。 これから、WindowsのAPIのプログラミングを勉強しようと思っているのですが、 お勧め(必須)の書籍はありますでしょうか? 言語はC言語は多少つかえます。apiでのプログラミングに興味があります。 スレ違いかもしれませんが、ご存じでしたら教えてください。
悪いことは言わん。 諦めた方がいい。
猫でもわかるWin32API
>>9 LPCTSTRって、const TCHAR * じゃんか。
だからそう書いてんじゃねぇか
19 :
ポポ :2007/08/24(金) 02:05:47
プログラミングの問題なのですが 「n個のランダムデータを大きい順に並べるプログラムを作れ」 という問題がどうしても解けません。 誰か回答お願いします。
>>19 どうしても解けないんじゃないだろ
勉強サボってるから解けないんだろ
22 :
883 :2007/08/24(金) 19:43:59
どうしても解けないと分かっているならそれで良いじゃないか。
あんた誰
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; } 改行が多すぎて書き込めないんで比較関数は自分で考えてくれ
かわいそうに。すでに解決済みだというのに・・・
マルチってひどいな しかも他所で解決した旨を書かない ほんと最低だわ
自分一人くらいプールの中で小便したって、水はさほど汚れないだろう そういう考え方の人間がいるんですよ。ばっちいばっちい。
#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'; } 人様のライブラリに頼ると楽になるわぁ
俺ならstd::vectorではなくstd::setを使う。 intなら比較関数オブジェクトを与える必要もなく、 rendからイテレータで舐めることで、ソート順をひっくり返す。
うへぇ、確かにこの場合はそっちの方が楽そうだ
rendではなくrbegin()な。
これができたらC++について基本は押さえてるという基準になる課題とかないですかね?
>>32 「Exceptional C++」という本の47の問題に適切な回答ができたら
ってのはどうよ。
いやです。
>>33 ありがとうございます。
その本チェックしてみますね。
template <class T> void Show( T &data ) { std::cout << data << std::endl; } この関数に引数としてunsigned charを入れると 文字として出力されてしまうのですが なんとか数値として出力できないでしょうか? int や doubleもこの関数を使うので表示するときにキャストは使えません。 ちなみにほんとの関数では配列をぶち込むので 関数に渡すときにキャストしたりもできません。
37 :
デフォルトの名無しさん :2007/08/31(金) 19:48:05
38 :
36 :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); }
自己レスかよ
以下のコード、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; }
>>40 &TTest::axxと書けばいいはず。
VC++ 2005では規格への準拠度が上がって、
メンバへのポインタの取得に標準から外れる書き方を認めなくなった。
え? staticなメンバ関数から、staticではないメンバ変数にアクセスすんな! ってことでしょう。
44 :
デフォルトの名無しさん :2007/09/01(土) 01:51:15
あるプログラムの実行処理を速くしたいとき、どのようなことに 気をつけてコーディングすべきでしょうか? アルゴリズム?メモリ管理?。 非常にアバウトな質問ですが教えていただけたらと思います。 みなさんはどのように意識して処理速度パフォーマンスを 向上されているのでしょうか。 もしも何か参考図書があったら教えてください。 Efficient C++を読みましたが、クラスの生成に気をつけることが 重点的に書かれていたような気がしました。
気がしました。
>>44 先ずは、動作の安定したしっかりしたプログラムを作ること。
勿論それは、速度向上のために今後修正されるのだからそれを考慮して読みやすく誤解の少ないものであるべき。
後は、適当なリビジョン管理ツールと速度評価ツールを用意し、格闘するだけだな。
と書かれていたような気がしました。
>>44 すでにあるプログラムの速度を改善したいのか
それとも
これから書くプログラムを速くしたいのか
速くしたいのはどれくらいか、
数割なのか、それとも桁違いなのか
それによって答えは違ってくるよ。
と書かれていたような気がしました。
50 :
44 :2007/09/01(土) 09:52:47
みなさんおはようございます。 すでにあるプログラムの速度を改善したいと思っております。 速くしたいのはどれだけ、というのは難しくとにかくできるだけ 処理時間を短くしたいと思います。 そのようなコーディングの”コツ”を未熟ながらわかっておりません。 ですので、相談させていただきました。
まずはプロファイラで何回も実行される部分を見付ける。 そこが最も実行時間上ネックになっているところだから、 そこを重点的に高速化する。80:20の法則。
>>51 最初は、実行回数よりも、実行時間の合計が大きな関数を見つけるほうがいいと思う。
ミクロな最適化して速度を稼ぐのは、後からでもいい。
54 :
48 :2007/09/01(土) 10:40:57
>>50 > 速くしたいのはどれだけ、というのは難しくとにかくできるだけ
達成すべき目標が与えられていないのなら、現状を目標にしてしまえ。
何もしなくても目標達成だ。おめでとう。
「とにかくできるだけ」つまり速度無限大が目標なら、
それを実現するためのコストも無限大が必要だ。
ということは、
自分でやらないで金を出してプロを雇ったほうがいい。
まぁいいや、桁違いに速くしたい、ということだと解釈しよう。
処理時間の大半を占めている部分について、
データ量Nに対して処理のオーダーがNのX乗になっている部分を探し、
よりオーダーの小さいアルゴリズムに変更する。
下手なプログラムなら、これで桁違いに速くなる。
>>56 同情ってことは、俺も心が寂しいってことだ。
だから金はやれない。
あの安達祐実のセリフは日本語として間違っている。
「同情するなら〜」ではなく、「哀れむなら〜」のほうが意味としては適切かと。インパクトないけどね。
もう少し日本語を勉強したほうが良いと思うよ・・・
gcc -O2 hoge.c
まあ、この書き込みもみたくねぇって言われるのは承知の上で、 なんでここ、IDでないの? こんなウザイ書き込みIDNGワードにしてしまいたい。
たった一言で誰だか分かってしまうこのクォリティw
63 :
44 :2007/09/04(火) 00:45:27
返事がすごく遅れて申し訳ありません。アドバイスありがとうございます。 >データ量Nに対して処理のオーダーがNのX乗になっている部分を探し、 >よりオーダーの小さいアルゴリズムに変更する。 オーダーがNのX乗になる部分の探し方がわからないです。 まずはぐぐってみます。 そして、実行時間、実行回数が多い関数を探し出し(プロファイル使用。 使用したことはないのですが・・・)、その部分のより適した 計算方法を検討することを行ってみます。 大体このような流れでみなさんも処理時間の短縮を図っているのでしょうか?
わかりやすいボトルネックは二重ループしてるところとかかな。 でもループ内から呼び出した関数の中で別のループをしてるような一見わかりにくいものもある。 ま、プロファイラを使えば簡単に見つかるだろうけど。
>>63 > オーダーがNのX乗になる部分の探し方がわからないです。
データ量Nを10倍にしてみて、実行時間が100倍になれば2乗、1000倍になれば3乗。
66 :
65 :2007/09/04(火) 03:08:06
言葉が足りなかったかも。 プログラムを見て探すのではなく、 実際にプログラムを走らせてみて、 実行時間の変化を見るのです。 10倍だと極端かもしれません。 2倍とか3倍とか適当に試して。
C++の演算子の .* ->* は、どういう時に、どのように使うものなのですか?
(構造体).(構造体のメンバ) (構造体へのポインタ)->(構造体のメンバ)
メンバポインタのようにも見える → *
メンバポインタだな X x, *p; int X::*m; というのがあったとき、 x.*m = 1; p->*m = 2; このように使う
クラスのメンバに、 自分自身を破棄してメモリを解放する関数って作れるのでしょうか? 例えばこんな感じです。 void destroy(){ DELETE(this);//インスタンスを破棄してメモリ解放する関数 }
そうすると静的に作ったインスタンスの扱いはどうなるの? インスタンスが有効かどうかを保持するフラグをメンバ変数に持たせておく、 ぐらいの解決方法が一番な気がする。
delete this; 当然newしたものである必要がある。
newで作ってないインスタンスはdeleteで消せないんですね。 Javaしかやったことがないので、メモリ解放がイマイチ馴染まず、 できるだけ意識せず簡単に消せる作りにしたいんです。 メソッドのスコープ抜けたり、参照外れたりしたら、 勝手に解放されるとかいう風に作るのは無理でしょうか。
つ[スマートポインタ]
>>74 そもそもnewする必要がないものをわざわざnewして作ることもないと思うが。
>>75 stdっていうのが無いので使えませんたぶん…
>>76 もしかしてnewで作らなければ、メソッドのスコープ抜けたとき勝手に破棄されるんでしょうか。
>>77 される(それはJavaと同じ)。
てか、まずは試してみたらどうだろう?
スタックとヒープの区別すらついていないとは…まるで知性を感じませんよ newで作ったやつ…関数抜けても消えない。ヒープに取るから ローカル変数…関数抜けたら消える。以降は使用不可
スタックとヒープなんとなく違いが分かりました。 確かに知識不足ですね。まだ始めたばかりなんで勉強してみます。
>>77 ないならば、用意すればいい。
テンプレートが使えるコンパイラなら、
boost::scoped_ptrやboost::shared_ptrが使える。
もちろん外部のライブラリ使用禁止なら、
適当に名前空間を変えて自己責任で使えばいい。
そんなに複雑なものでもないし。
82 :
67 :2007/09/05(水) 08:31:06
>>69-70 ありがとうございます。
これはエグい機能ですね。
どうりで今まで使いみちが理解できなかったわけです。
これを使うべき場面というのはあるのでしょうか。
>>71 C++に不慣れなうちは、delete this するようなクラスを作るのは、やめたほうがいいと思う。
なぜなら、delete this は、どうしてもそれが必要な特別な場合だけに限定すべきだから。
どうして、自分自身を破棄するようなメンバ関数が必要なの?
もっと適切で良い方法を教えられるかも。
>>82 メンバ関数ポインタ でぐぐると使用例がいくつかヒットするかもしれない。
まぁでも滅多に使うもんじゃない。
直接メンバへのポインタには触れないけど、 mem_fun(やboost::bind)の中で使っているんだろうなとは思う。
>>83 はもしかしからデストラクタを呼びたいのかも。
関数の引数で、 読み取りのみで変更を行わないものは、 void hoge(const Type& o) ; void hoge(const Type* p) ; どう使い分けるべきなのでしょうか。
常に前者。 ただし、配列の要素を指すポインタを受け取るのであれば、 要素数を示す引数を追加した上で、ポインタを使う。 しかし、イテレータで済むならそっちを使う。
なぜポインタではなく参照を使うのでしょうか。
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++で色々なプログラムを作りそのときの考え方を示し 実際にどのようにして作るのか解説してくれる本はありませんか?
88です。 ポインタの安全ではない部分を解決するために、C++で参照が導入されたのだから、 参照を使ったほうがいい、ということですね。
>>91 NULLで参照がエラーになるのはNULLだからじゃなくて型が違うからだろ。
日本語でおk
>>97 日本語じゃなくてC++が分かってないんだろ。
何や此奴俺初めて書き込んだのに
91の言いたいことはわかるが、 説明がいまいちだったな。
101 :
デフォルトの名無しさん :2007/09/09(日) 02:23:37
94の言いたいことはわからないし、 人としていまいちだったな。
>>91 のポインタだと常にNULLチェックが必要ってのも素人くさいな。
>>102 まぁその辺は宗教入って来る話な気もするし、無しにしようや。
>>91 補足は、hoge(p); でなくて、hoge(*p); だよな。
hoge(p);とhoge(NULL); なら、どっちも参照ならエラーだし、ポインタならエラーにならないし。
>>103 宗教って言うと「常にNULLチェックする」ほうにも理があるみたいじゃん。
106 :
デフォルトの名無しさん :2007/09/09(日) 04:51:23
今BCCを使ってC言語の勉強をしていますが何かアプリケーションを作製したいときってどんなソフトがいりますか?
>>106 107は、あなたをからかっている。
BCCでもアプリケーションは作れるが、
便利で強力な道具を使えば手間が省けるというもの。
どのようなアプリケーションを作りたいの?
>>109 メーラーです。複雑な機能は抜きとしてメールサーバーからメールを取ってくるというものです
GUIとCUIどっち?
GUIです。最低限の機能としてメール受信送信それと閲覧ができれば。
じゃぁ、C++Builder
>>112 何故作りたいの?
一発で巧く動くものが作れればいいけどそうでなければメールサーバに迷惑を掛けることにもなりかねないし、
何より便利なメールソフトが腐るほどあるのに。
>メールサーバに迷惑を掛けることにもなりかねない ここには同意だが、なぜそんなにもやってみようという気持ちをくじくようなことを言うのか。
どうせやるなら、そこらに無いものを作ろうよ。
>>114 言語の話とはズレるけど、メールサーバを自分で立てるという発想は無いのか?
>>105 ある。
例えばバグの早期発見と原因分析に役立つ。
NULLポインタに何か意味があるならともかく、 そうでないなら、 NULLチェックなんてするとバグを見落とすことになる。 デバッグ中は、 NULLチェックせずに例外で落ちたほうがマシだと思うよ。
>>119 そういうのを含めてNULLチェックというんでないの?
NULLに対し何らかの処理が必要という意味で
>>104 Type* p = NULL;
のあとに*pとかやったら関数とか関係なく落ちるだろ…それもコンパイル時には分からん品
>>120 ふつ〜NULLチェックといったら、
NULLでないことを確認してからポインタの指す先を触り、NULLの場合はエラーとしてfalseを返す
だろう。
正しくエラー処理していて堅牢に見えるけど、かえって、バグを抱えたまま、それらしく動いたりするのよ。
>>119 例外で落ちるってWindowsのメモリアクセス違反例外のこと?
さておき。
単にセグメンテーションフォルトされたら、
落ちた位置とか原因とか分かり辛くなるじゃん。
現象が再現するとも限らないし、
テスト環境に開発環境があるとも限らないし。
異常発生後も動くのが嫌ならNULLチェックで
例外投げるなりexit()するようにしたら良いよ。
少なくともログ出せない落ち方よりログ出せる落ち方のが良いと思う。
そいえば。
Linuxとかでcore吐いてたら、まだコールスタックやら拾えるかなぁ。
VCとかにもそういうのあるの?
>>123 Windows限定ではないけど、いまどきのリッチな環境向けのOSなら、
NULLポインタの指す先にアクセスしたら、OSが待ったをかけてくれると思う。
メモリ保護がないハードとかは・・・別の話にしてほしい。
Windowsローカルの話だと、Dr.ワトソンというログ記録ツールが、OS標準搭載されてる。
メモリアクセス違反をやらかした場所のコードを逆アセンブルし、レジスタとスタックの状態を
テキストファイルで保存してくれる。設定でプロセスのメモリイメージのダンプも可能。
下手にハンドルして貴重な情報をログに残さず捨ててしまうくらいなら、これを使ったほうがいい。
まぁ普通は、開発環境が入っているPCでテストしている最中に問題を見つけるし、
逆に言うと、その段階で問題を見つけられるようにテストすべきだから、
メモリアクセス違反をやらかしたらデバッガをアタッチすることになるかと。
自分は使うに至ったことないけど、リモートデバッグもできるとのこと。
これなら、リモートデバッグ用のエージェントだけをターゲットマシンに
インストールすればいいので軽い。
125 :
124 :2007/09/09(日) 12:04:27
捕捉 逆アセンブルされたコードを見ても、C/C++のソースの該当箇所がわからないとダメなので、 コンパイルするときに、ソースコード付きでリスティングファイルを出力 リンクするときに、mapファイルを出力 んでもって、これらを生成されたバイナリとセットでしっかり管理する。
126 :
デフォルトの名無しさん :2007/09/09(日) 12:44:44
データへのポインタpDataを取得する関数が、 こんな感じで定義されているのですが、 long GetData( void*& pData ) 「*」と「&」が並んでいるところのわけがわかりません。 void*& pDataのところは「*」がpDataのポインタをさしていて、 「&」はその参照を受け取る、というようなことなんでしょうか。 自分の持っている初心者向けの参考書には「参照には*をつける必要はない」と 書いているのですが…。
int &x bool &y void* &pData
>>126 たとえば、
typedef void* VOID_PTR ;
としたならば、
long GetData(VOID_PTR& pData )
と同等。
仮に参照を使わなければ、
long GetData(VOID_PTR* ppData )
long GetData(void** ppData )
かな。
"voidポインタ"型の参照 と思え
それがよくわかるように
>>127 みたいに書くのを俺はすすめる
(int* a, b; ってできないから困るが。)
130 :
デフォルトの名無しさん :2007/09/09(日) 14:55:46
質問です。 stl::listやstl::queueなどを複数のスレッドから操作 (push_back()やpop_front()など)する場合ミューテックスで ロックする必要があるのでしょうか? それとも元からスレッドセーフになっているのでしょうか?
>>130 もしWindowsなら、Mutexよりも、CriticalSectionを使おう。
念のため言っとくけど、
STLのコンテナのメンバ関数を1つ呼び出す直前・直後でロックするのはダメよ。
iteratorやコンテナ内のオブジェクトへのポインタの有効期間を考えて、適切な範囲でロックすべし。
133 :
デフォルトの名無しさん :2007/09/09(日) 17:01:58
>>131 >>132 ありがとうございます。参考になりました。(英語はあんまり読めないけど。)
コンテナのメンバ関数内で勝手にロックされるわけではないのですね。
>>131 std::の間違いでした。
>>114 何故?といわれましても別に仕事でもなく学校の課題でもないのですが個人的に作りたいと思いまして・・・
サーバーに関しては知り合いの許可をもらいやるので大丈夫です
テスト用のメールサーバくらい、VMwareとかVirtualPCとか使って、Linuxで適当に立てればいいじゃん。 通信するプログラムの場合、自分側だけでなく、相手側もデバッグモードにしたり、ログをチェックしたりするよ?
>>135 ありがとうございます。ちょと調べてみます。
パケットモニタも用意しよう。 暗闇を照らすものは多ければ多いほどいい。
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
コピペ?
すいません 聞く場所を間違えたのでここにコピペしました
>>121 だから
>>91 が意味わからんって言ってるんじゃないの。
「補足」どの部分の何を補足してるつもりなのか、意味がわからん。
143 :
140 :2007/09/09(日) 22:17:53
>>141 すまそんとりあえず分かる範囲で…
listen関数の第2引数は待ち受けの数を表し、
複数のクライアントからの接続要求を待つようです。
>>143 このプログラムでは待ちうけ数が5であるということは
接続要求が1つ来たらコードのlisten以下に処理が移るということですよね?
このときの待ち受け数は4でこのプロセスはwhile内部の処理を行う
そして、closeしたら待ち受け数が5になる
以下接続要求が来るごとにそれぞれのプロセスがlisten以下をcloseされるまで
実行するということですか?
かなり日本語がおかしくて申し訳ないです
違う。 listenは5つ分の接続要求を貯めるキューを作ってポートを開くだけ。 acceptで実際に接続が来るまで待ち、接続が来たらacceptから下にいく。 クライアントにHELLOを送って、接続を閉じて、またacceptで次の接続を待つ。
待ち受け数とかプロセスとか妙な言葉を使ってるけど、別に複数のプロセスが立ち上がるわけでもないし、同時並行的に5つの接続を捌けるわけでもない。 listenに指定する5っていうのは、プログラムの処理が追いつかなくてクライアントをどんどんacceptするのが追いつかないときに、OSが裏で5つまで接続要求を貯めておけるだけ。 6つめが来るとクライアントは接続拒否される。
147 :
140 :2007/09/09(日) 22:47:45
ソケットは扱った事が余り無いのでなんとも言えませんが その通りだと思います。 また、複数の接続要求(この場合だと5以下)が来た時は、 待ち行列に置かれアクセプト待ちに 越えると無視されるようです。 つ UNIXネットワークプログラミング入門 雪田修一 著 買ったは良いが今日まで読む機会が無かったありがとう…orz
148 :
144 :2007/09/09(日) 22:54:48
>>145 >>146 並列的に処理をするものとばかり・・・
実際は処理を行っているのは1つだけであとはためておくんですね
listenで停止する(待つ)のではなくてacceptで停止して接続を待つんですね
149 :
144 :2007/09/09(日) 22:59:27
あともうひとつ聞きたんですがlen = sizeof(client)という処理を行っているんですけど この時点でclientには代入などが行われていないのでこのような処理を行うことは 出来ないと思うのですが?
代入してなくても、その変数のサイズ (つまり sockaddr_in 構造体のサイズ) くらいはわかる
151 :
144 :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); はぁ、もう寝よ…
(struct tm)* now; と書いてもキャストだと思わず「struct tm型」のポインタだと思ってくれるコンパイラない?
155 :
デフォルトの名無しさん :2007/09/10(月) 17:26:31
今度、就職するときにC,C++を勉強しなくてはいけないのですが オススメの教習本ってありますか?
Boostのドキュメント
>>155 参考書スレがあるから、そっちを読んだほうがいい。
とりあえず自分からアドバイスできるのは、
・文法だけ理解しても、使いこなすことはできない
・世の中、良書もあれば、ろくでもない本もある。とくに後者の罠は引っかかりやすい。
ってこと。
文法を解説する本だけでなく、
使いこなし方を解説する本も読もう。
C++の使いこなし入門としては、
Effective C++
Effective STL
この2冊をお勧めする。
本の値段は安くないが、値段の10倍の価値はある。
少なくとも自力で悟りを開くよりは、遥かに近道だ。
質問です。実行中のプログラムにコマンドラインから設定を渡すにはどうすればよいでしょうか? これは、実行中のプログラムがコマンドラインを監視するのではなく、 2重起動時にパラメータだけ渡されるようなイメージです。 お願いします。
先に起動した方は何かの通信手段でデータを受信できるように待機しておいて、 後に起動した方はその通信手段でコマンドライン情報を送信する。
160 :
158 :2007/09/10(月) 22:12:35
>>159 共有メモリ/Socket以外の方法で可能なら、それを教えてください。
へたれですいません。お願いします。
なぜ共有メモリやらソケットがイヤなのかその理由を書かないと、何か提案しても、やっぱりそれもイヤとか言われる予感。 あと、ANSIの範囲外の話は、OSの種類を書いてください。
162 :
158 :2007/09/10(月) 22:23:09
>>161 上記以外の方法で、より簡単な方法があればそれで行きたいからです。
規格はANSIで。Winだったらメッセージ使うんですが。
それと、上記の方法がいやな理由は以下の通り。
・共有メモリ -> 保守/拡張がめんどい
・ソケット -> プログラム規模が大きくなるからめんどい
よろしくお願いします。
ANSI ではプロセス間通信の方法は fopen で同じファイルを読み書きする以外にありません。 終わり。
ちなみに共有メモリもソケットも ANSI には無いものですから 残念
165 :
158 :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 :
やおい :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以降も正しくデータが入りました。 原因が分かる方が居ましたら是非、お願いします。
質問です。 char* foo(){ return new char[50]; } という関数があって、戻り値をdeleteしたいとき、 char* buf=foo(); delete buf; でよいの? delete[]にできなくて気持ち悪いんだが。 char[] foo(){ とか書けないし。
>>168 普通にdelete[] bufと書けばいいのでは?
最後Enterを押すまでウィンドウを閉じないようにしたいのですがどうすればいいですか?
>>170 止めたいところで getchar();
テキストファイルを読み込んで指定した文字が何個含まれるかを出力するプログラム を作りたいと思いこんな感じで書いてみたんですが、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に何個あったか書き出す
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 :2007/09/11(火) 08:17:23
追加 stringを使うにしても何にしても while の中でもう一個ループ組まないと一行に2回以上"test"があっても1回しか数えてくれないよ
175 :
173 :2007/09/11(火) 08:20:43
たびたびすまん if((start...) != NULL) じゃなくて while((start...) !=NULL) だ。
>>172 strstreamとか
strstreambufとかを調べろ
>>170 話を端折りすぎ。
何のために?
誰が作ったウィンドウを?
さっぱりわからん。
>>172 buf.find("test") != std::string::nposか、
std::strstr(buf.c_str(), "test") != NULL
でも、これだと1行に2個以上あったときにまずくないか?
C言語らしく。 まずは、ある文字列が1行に何回出現するのかカウントして返す関数を作るべし。 その後に、1行読んでは、出現回数を積算するループを回すべし。
>>173 おいおい、間違いすぎだろ。それから、startを更新しているのに使っていないぞ。
それに、strstr()でマッチしたときにstartはstrlen()分進める方がよくないか?
>>171 ありがとうございます。うまくいきました
182 :
やおい :2007/09/11(火) 09:09:19
ビットフィールドの配置なんて処理系依存なんだから、 まずはお前が何のコンパイラを使っているか書かないと始まらない。
>>182 フィールド幅が16だから、16ビット境界(2バイト境界)に配置されたと思われ。
pragma packかなにかでスタブ0にしてやれば間が埋まって想定どおりになるかと。
それはさておき、ビットフィールドに於いて、整数型の幅は意味がないので
dwordなんて書かれると却って混乱する。signed/unsignedと書いておくことお勧め。
C言語で何かアプリケーションを作成したい時、ソフトは何を使えばいいですか? GUIの物を作ってみたいのですが。 ちなみにOSはWindowsXPを使っています
VC
Visual C++というのでいいのでしょうか?
VC#
>>185 C++ではなく、Cで?
それはまた酔狂だな。
VisualC++なんていらない。
BCCでも、PlatformSDK付属コンパイラでも、何でもいいよ。
何でも良いけど強いてというならVisualC++で、コンパイラオプションを設定してCとしてコンパイルすれば良い。
VC++6.0なら拡張子を .c にしとけば勝手にCだと思ってくれるよ 2005は知らね
2005もだけど
ありがとうございます。それを取って使ってみようと思います。
194 :
やおい :2007/09/14(金) 00:03:55
>>183-184 遅くなってすみません。
返信ありがとうございました。
言われた通りpragmaを使って挑戦したいと思います。
ビットフィールドって処理系に依存していたんですね。
その編の事も含めて初めて知りました。
ちなみに使っているのはVisual C++6.0です。
ファイルがあって先頭にHEADERがついています ------- ○ ○○○ ○ ○ ○ 以下必要な部分…1万行以上 -------- 先頭部分が6行くらいで一定で続いていて その後の必要な部分はRGB値がこの順番で入っています この形式のファイルを1000個くらい連続で読み込む必要があるのですが こういう作業をしたことが無いので、ヒントやどういう風にやればいいのか教えてください。 先頭6行分を飛ばして、あとをfscanf(%f)なんかで読めるといいのですが…
>>195 固定長ならfseek()でスキップ、可変長ならfgets()で空読み
>>195 ヒント
同じような処理をしているプログラムのソースを見る。
unix系には、画像のファイル形式で、テキストなのがあったと思う。
ていうか、あなたのは、まさに、それなんじゃないか?
ファイルの拡張子なんだい? それで検索すれば見つかると思うぞ。
ちなみに、学校の宿題っぽいな。
PPMやBMPならばfgetsでヘッダーを全部とばして、そのあとfreadすればOK.
>>199 pbmのtypoだろ。察してやれよ。
# だとしたら、pgmの立場がないけどねw
C++のmutableは、どういう時に使うものなのでしょうか?
例えばこういうとき。 class MyObject { mutable int hashcode_cache; public: int hashcode() const { if(hashcode_cache == 0) { hashcode_cache = なにかすごい複雑な計算; } return cached_hashcode; } };
なるほど。 ありがとうございます。
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ですが、やはりこれも範囲外参照、ということになりますか? どうにかして二次元配列を一次元扱いすることはできませんか?
>>204 int * p = & array[0][0];
for (int i = 0; i < sizeof(a); ++i) {
printf("%d\n", p[i]);
}
C++でもおkってんならboost::multi_arrayを導入するのを考えてもいいよ って僕の隣のboost厨がいってます
>>205 環境が整い次第、それで試してみます。
二次元配列はそれぞれの列(行?)が連続的に配置されているとは限らない、とどっかに書いてあったので、
それを鵜呑みにしていました……。
ということは
>>204 のdはarray[1][0]を表すということですよね。
それならなんとかなりそうです。
ありがとうございます。
>>206 C++は今はちょっと……
答えてくださりありがとうございます。
>>207 >ということは
>>204 のdはarray[1][0]を表すということですよね。
いいえ。関数内でアクセスしているのは、array[1][0]ですが。
>>207 隙間なく連続しているとは限らないというのは、正しい。
>>207 >二次元配列はそれぞれの列(行?)が連続的に配置されているとは限らない、とどっかに書いてあったので、
いいえ、それが二次元配列として定義されたものなら連続しているはずです。
#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で定数を宣言するということでしょうか?
前後の文脈が分からんとなんとも。 直訳すると「定義することが出来る」か?
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を呼んでみたのですが、何も変わりませんでした。 よろしくおねがいします。
>>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++に取り込む方法が分かりません。誰か教えて頂けませんか? 説明がへたくそですごく分かりにくくなってしまいました。申し訳ありません。
>>219 質問のポイントが漠然としすぎてる。
まるで、
私の代わりに作ってください
と言っているようなものだ。
デバイスドライバと連携をとりたいとかかなあ。
223 :
超初心者です :2007/09/26(水) 15:55:37
すいません。漠然としすぎでした。本当に初心者なのでどう質問していいか 分かりませんでした。 ジョイパッドの入力データをC++に取り込む関数みたいなものがあると 聞いたので、もしあるのなら教えていただきたいです。
超初心者はプログラムするな
あほか
DXライブラリ使いなさい 目的の関数はマニュアル見れば一発で見つかるから
質問です 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・・・・とならないのかご指導お願いできますか? よろしくお願いします
たとえば、 10進数の0.5は、2進数なら0.10000000000000000・・・・・ では、 10進数の0.9を、2進数で現わすと? 何桁必要なのか。 それを有限の桁数で打ち切って、さらに10進数に変換すると、どうなるのか。 ちょっと自分で計算してみればわかる。
>>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}: 配列の全要素の合計と平気を求めるプログラムをポインタを使って作成しなさい 誰か宜しくお願いします ちなみに初心者です
>>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 ;
}
double result = 0; ↓ double result(0.0) ; のほうがいい気がする。
234 :
774 :2007/09/27(木) 22:47:40
log10f()はVC6ではどのライブラリに含まれてるんでしょうか? リンクで未解決になっちゃう。
>>234 VC6はC99未対応だから無いんで内科医?
236 :
デフォルトの名無しさん :2007/09/28(金) 01:13:27
未入力のエラーチェックしたいのですが getsだと簡単なのにscanfだとうまくいかない getsは非推奨だそうなので出来ればscanfでやりたいのですが いい方法ありますか?
238 :
デフォルトの名無しさん :2007/09/28(金) 01:38:13
>>237 できませんでした(´・ω・`)
if(a[0] == '\0')
で未入力エラーチェックしてたのですが他の方法ってありますか?
>>238 その場合fgets()は改行文字を取り除かないから、if (a[0] == '\0' || a[0] == '\n')とでもすればいい。
scanfも非推奨
241 :
デフォルトの名無しさん :2007/09/28(金) 02:06:19
なんか頭痛くなってきた。もう寝ます。 教えていただきありがとうございました。
>>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の値を変えただけで 表示幅の左詰めを変更できるような方法を 知っている方がいらっしゃったら教えて頂けませんか?
printf("%-*s : 名前", NAME_MAX, &name[0]); &name[0] は name と書いたほうがいいよ。
245 :
デフォルトの名無しさん :2007/09/28(金) 03:57:43
できました!ありがとうございます。 >244
>>242 何も入力しないでエンター押した時のことでしょ
>>246 それは未入力ではなく空入力と書いたほうがわかりやすいし、
もっと具体的に説明したほうがいいんじゃまいか。
#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' : 値を返さなければいけませんと表示されてしまいます。 何度も本を読み返してみたのですがどこがおかしいのかわかりません。ご教示お願いします。
int sum_ave → void sum_ave
エラーメッセージの言うとおりにしろよ sum_aveの中でreturnしろ 値戻す気ないなら戻り値型voidにしろ
>>249 ありがとうございます
本に書いてあるのが間違いだとは思いませんでした
本のタイトル晒せ
本のサンプルが細かい所で間違ってるのは良くあること
>>254 すごく恥ずかしいタイトルの本だなぁ。
ポインタくらいで躓く人は、その先にある、もっと大きなハードルを越えられないから、
いまのうちに諦めたほうがいいよ?
>>254 そういう壮大なタイトルをつける著者は、自分にしか分からないような文章を書く事が多いからねぇ。
まずは、メモリとアドレッシングについてきちんと理解した方がいいよ。
> そういう壮大なタイトルをつける著者は、自分にしか分からないような文章を書く事が多いからねぇ。 ハゲ堂w
ハゲって言うなこのハゲ!!
259 :
デフォルトの名無しさん :2007/10/06(土) 04:38:31
テンプレートを使うとリンクで失敗します。 ソースをまとめて一つのファイルにした場合は大丈夫なのですが、 テンプレートを使ったクラスを分割コンパイルしようとすると、必ずリンクで失敗します。 環境はFC6+gcc4.0です。
そうだそうだ! 「ハゲ」って言うな俺ハゲ!
>>259 テンプレートクラスを分割コンパイルってどうやってやってるの?
Vandevoorde と Josuttis の C++ Templates という本では 6 章で
議論しているけど。
262 :
デフォルトの名無しさん :2007/10/06(土) 12:18:30
画像を一覧表示 −> 簡単な加工 −> 保存 を行うアプリケーションを開発させられています。 PhototoShop等の画像処理ソフトでは、作成したファイルのアイコンに、画像のプレビューが表示されますが、あれができないかと言われたのですが VisualStudioのhelpを探しても、helpのテキストが膨大すぎてどうにもなりません。 これに関しての情報をどなたかご存知ありませんでしょうか?
>>262 help でキーワード検索してみるとか。
「イメージ ライブラリ」で検索するとちょっと近付くかも。
>>262 漠然としすぎてる。
やりたいことを具体的に適切に書かないと、アドバイスできない。
>↑「ここ見える、漏れ」は9月の終りから覗けなくて困ってるんだが。 そこが見えるあんたは何で覗けないんだ?
>>266 本当に見えるのか?
会社からも、自宅からも見えないんだが?
日本語が書けない・読めない人を雇ってる会社の人が不憫だ
嫌いな人が居るなら殺しちゃえばいいんだよ
belution最近調子わるいみたいだね。
>>267 >265に、「ここ見える、漏れ」と書いてあるが。
揚げ足を取るならせめておもしろくしようや
ここ見える?って区切らなきゃだめってのと、266の突っ込みが理解できてないの両方だからな 相手に伝える能力もなければ、相手の言うことも理解できない。 仕事でこういう奴と組まされる人がかわいそうだ。
数字をカウントしたいんだけど (宣言等省略) 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']++; } } } } でやってもうまくいかない。どっかおかしいところあります?
ある
>>274 for(j = '0';j <= '9';j++){
if(input[i] == j){
output[j - '0']++;
は
output[input[i]-'0']
でいいと思うけど、一応目的通りには動くよな。
どう上手くいかないのか、もう少し詳しく書いてくれないと
配列外アクセスしてないか inputとoutputの長さは大丈夫か?
どのようにうまくいかないのか、ちゃんと説明しろよ。 まともな頭脳していたら、もっと問題点を絞り込めるハズだ。 大抵はその課程で自己解決するものだがな・・・。
>>274 省略しちゃった宣言のほうが
とてつもなくおかしかったりして
問題に気がついていないからこそ、省略したところに、問題があるんだろうな。 ソースコードは全部見せたほうがいい。 とはいえ、問題とは関係ない処理は削るべし。 スレに直接書くのは大変だろうから、 自分の持っているWebサイト上にソースコードを置くべし。 過去ログを見た人のために、そのソースコードは長期にわたってWebに残すべし。
ありがとうございます。 どう動かないかというと、実行したとたんに終了してしまうのです。 この入れ子自体は変じゃないんですね? 一応変数宣言は int i,j; char input[256]; char output[256];
>>281 > 実行したとたんに終了してしまうのです。
まず、デバッガ上でステップ実行しろ。
次に、fgetsの返り値をチェックしろ。
話はそれからだ。
問題箇所はわかっているが、
すぐに教えてしまうと、
ステップ実行すらやらなさそうだからな!
デバッガなしでprintf()をはさんでデバッグすればすむことだ。
>>283 printfデバッグなんて、いったい、いつの時代の話だよ。
デバッグ用のログを取るべき状況もあるが、これは、明らかに違う。
>>281 >実行したとたんに終了
正常に動作して終了しただけじゃね?
あと、outputは数字の数を数えてるんだから[10]でよくね?
質問します。このようなコードがあるのですが 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){で良いと思うのですが。何か理由があるのでしょうか?
>>286 関数のプロトタイプ宣言がなされていない場合などに、スタックに積まれる内容が違ってくる。
l -= 2 でいいと思うが、long を明示したい年頃だったんじゃないかね
>>284 時代もへったくれも、きちんとロジックを追えれば済むと言っているのだが。
まぁ、対処療法プログラミングを心掛けたいのなら止めはしないが。
>>287 for ループの l = l - 2L には関係ない話だね。
>>288 それならそれで、 l -= 2L でいいわけで。
>>286 つーことで、普通はそんな書き方しない。
書いた香具師に聞け。
>>289 おいおい。
printfデバッグとデバッガを使うのと、本質的には何も変らないぞ。
なにこのスレワロタ
64bit環境を想定したかったんじゃね
そこでユニットテストですよ
ステートメント毎にログ、強制終了等処置方法を細かく選べ
大量のテストを一度に実行できて再利用もできる
これを使わない手はないね☆
>>292 うっさいハゲ!
>>286 暗黙のキャストが嫌いなんじゃね?
どっちかっつーと
>fseek(fp, 0, SEEK_SET);
ry
>fseek(fp, 1L, SEEK_CUR);
ここの差が気になる。
297 :
281 :2007/10/10(水) 21:01:28
アドバイスありがとうございます。 fgetsの返り値は異常ありませんでした。 デバッカ上でステップ実行てどのようにするんですか?
環境を書かないと
>>297 デバッガ って何だか、わかってる?
ステップ実行 って何だか、わかってる?
いまどきのGUIの開発環境なら、ちょっとマニュアル見ればわかると思う。
>>297 なんじゃそら。
プログラム実行したとたん終わるのに、fgetsで入力あんのか?
fgetsで入力待ちしてるの?
「実行したとたん終了する」の状態がさっぱり分からんくなった。
すいません質問させてくださいm(_ _)m RPGとかで誰かがしゃべると文字列が1個ずつ順次に表示されるんですが あれ半角ならできるんですが、2バイト使用する全角の場合って、char配列2個使うので 解決できません;; 全角文字を配列に格納したり、1個ずつ表示するのってどうすればいいんでしょうか・・・ よろしくお願いします
302 :
デフォルトの名無しさん :2007/10/10(水) 21:52:09
stringつかっとけ こっちが業界標準
マルチバイト使うなら俺はwstringを使うぞ
>>301 半角文字のときは1個、全角文字のときは2個分進める。
>>302-304 早速の回答、本当にありがとうございますm(__)m
>>304 char配列を2つ使用しているので、この配列2こを利用して表示するというのは
理解しているのですが・・・2個分進めるというのはメモリ操作のことなんでしょうか?
恐ろしく低レベルな質問をしている気がしますが、よろしくお願いいたしますm(__)m
ソースを置いておきます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こずつ順次だし????
それは、半角なら1個ずつ順番に出せるコードなのか?
>>300 もともとの質問者は、
相手に分かるように的確に説明する
というスキルが足りないからなぁ。
>>301 お前さんが言ってる「char配列」というのは何者か。
言いたいことは、なんとなくわかるが、
自分で勝手に変な用語を作り出したり使ったりされると、
話が見えにくくなるよ。
VC++6.0Proをインストールしたのでサービスパックを当てようとしたんですが、 公式見ると最新の物はVisualStudio6.0のSP6しか見当たりませんでした。 これを当てればVC++6.0にもSP6が当たっている認識でいいんでしょうか?
>>310 OK。
VS6を買ってVC6しかインストールしない構成もアリだからね。
しばしば、(void)hoge() などと関数呼び出しの前に (void) を付けているのを見かけるのですが、あれは何のメリットがあるのでしょうか?
>>313 専らLINTを黙らせるために付けている。
要は、値を返す関数の戻り値を利用しないことを明言するわけだ。
315 :
313 :2007/10/11(木) 03:44:00
316 :
デフォルトの名無しさん :2007/10/11(木) 18:54:16
WINDOWS環境で、OS標準でない画像形式をフォルダの縮小版表示で一覧できるようにしたいと思っています。 シェル拡張を利用するdllを用意してやればよいというのはわかったのですが、サンプルがなかなか見つかりません。 MSDN内等によいサンプル等はないでしょうか?
WindowsSDKのサンプルは漁ってみた? なければ、 同様のことをやっているオープンソースのフリーウェアを、 SourceForge等で探そう。
318 :
デフォルトの名無しさん :2007/10/11(木) 22:13:50
WindowsSDKでビットマップ(カラー)の拡大・縮小がやりたいです。 サンプルソースなどがある良きサイトをご存知の方いましたら教えていただきたいのです。
321 :
デフォルトの名無しさん :2007/10/11(木) 23:39:22
入力パラメータが5つくらいあって、そのパラメータの条件でデータを 検索する関数を作らないといけないのですが、5つのパラメータ毎に 使用フラグがあって、フラグOFFの時は、検索条件になりません。 なので、検索条件としては、最低0個、最大5個になり、検索条件の 組み合わせもいろいろになってしまいます。 作り方としては、どういうやり方が簡単そうでしょうか? パラメータの組み合わせがいろいろになるので、オーバーロードも できないかなあ、と悩んでいます。
>>320 質問の答えにはならないが・・・。
そのWebページで紹介しているノウハウは、
下手な小細工
であるが故に、かえって遅くなったのだと思うよ。
無駄な一時オブジェクトの生成は、
コンパイラの最適化によって端折られるのであれば、
素直にコーディングするのがいいと思うよ。
323 :
322 :2007/10/12(金) 00:41:14
文章が変だった。 無駄な一時オブジェクトの生成が、コンパイラの最適化によって端折られるのであれば、 素直にコーディングするのがいいと思うよ。
>>321 その「使用フラグ」を見ながら検索処理するのでは、ダメ?
325 :
デフォルトの名無しさん :2007/10/12(金) 01:10:18
>>324 ありがとうございます。
お風呂に入って考えてたけど、結局それが一番見通しがいいような
気がしてきた・・・
326 :
シロートです :2007/10/12(金) 01:41:53
C++言語を使っています。質問です。 4種類の連続した数値のデータがあります。4種類の測定時間や時間間隔は一緒です。 その4種類をひとまとまりとします。そのまとまりがいくつかあります。 それぞれのまとまりから一部分だけを取り出します。その一部分のデータの特徴を どんどんと集めていき4種類のデータの特性を求めたいです。その方法がわかりません。 すいません。ホントシロートです。質問の意味がわからないかもしれません。 でも本当に困ってます。ヒントだけでもいいのでお願いします。 プログラムが違うのかもしれませんが、 「似たようなデータをどんどん記憶していくことによりそのデータ達の 特性を求める」ということかなと自分では考えたのですがその方法も分かりません。 方法を知っているとかこんなコマンドがあるなど本当に何でもいいのでよろしくお願いします。
エスパー以外お断りでなければもっと具体的に頼む
「特性」ってのをもっと具体的に説明しる
>>326 アルゴリズムの問題だね。
C/C++言語に特有の話ではないので、スレ違い。
さようなら。
330 :
デフォルトの名無しさん :2007/10/12(金) 05:07:00
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | 吉本いるか \  ̄ ̄ ̄|/ ̄ ̄ ̄ ̄ ∧_∧ / ̄ ̄ ̄ ̄ ̄ ∧_∧ ( ´Д`) < 吉本いるか ( ´Д` ) /⌒ ⌒ヽ \_____ /, / /_/| へ \ (ぃ9 | (ぃ9 ./ / \ \.∧_∧ / ̄ ̄ ̄ ̄ ̄ / /、 / ./ ヽ ( ´Д` )< 吉本いるか / ∧_二つ ( / ∪ , / \_____ / / \ .\\ (ぃ9 | / \ \ .\\ / / ,、 / /~\ \ > ) ) ./ ∧_二∃ / / > ) / // ./  ̄ ̄ ヽ / ノ / / / / / ._/ /~ ̄ ̄/ / / ./ ( ヽ、 ( ヽ ヽ | / ( ヽ、 ( _) \__つ \__つ).し \__つ
いるよ
332 :
シロートです :2007/10/12(金) 08:49:30
みなさん、説明が下手ですいません。 4種類のデータはヘリコプタの制御に使う、スロットル、エルロン、エレベータ、ラダーです。 特性はホバリングをしている時の4種類のデータ入力の特徴を見つけたいです。 よろしくお願いします。
私らはヘリコプタの専門家ではないから、それらのデータの特徴と言われても 何をどうすればいいか判らんのだがね。 もっと具体的に説明はできないもんかね。
>>332 コンピュータは勝手に思考して適当によろしくやってはくれない。
処理の手順を1つずつ手取り足取りコーディングしてやる必要がある。
まずは、人間が手作業で計算して処理する手順を明らかにすること。
それくらいは自分でやってから、相談してね。
335 :
デフォルトの名無しさん :2007/10/12(金) 11:40:08
C言語で2次元変数a[4][5]として適当な文字を入れる場合、20文字入れないといけないんですよね?
何をしたいのかよくわからん。 こういうことか? 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
>>338 ぱっと見、
printf("%d",a[i][j]);
これはおかしい。
%cだよ。
>>338 1) printfの書式について調べよう
2) charについて調べてみよう
3) 全角を表示するにはどうしたらいいか調べよう
>>340 無駄な指摘乙。
>>337 vec[i].n = 5ではいけないの?
安全にやるなら
vec.at(i).n = 5になるけど。
そのコードは、 コンテナ内の既存の要素を変更しているのではなく、 コンテナ内の既存の要素をコピーし、少し変更し、新規の要素として末尾に追加しているぞ。 既存の要素を変更するなら、 vec[i].n=5 ; でいけると思う。 あるいは、明示的に参照を使って、 DATA& data ; data = vec[i] ; data.n = 5; これでもいいね。
345 :
デフォルトの名無しさん :2007/10/12(金) 12:16:53
346 :
340 :2007/10/12(金) 12:17:32
>>342 あー、%Cの間違い。
処理系によってはサポートしていないかもしれんが。
いや、 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'あ'; にする必要あるな。
そもそも、int はマズいな。wchar_t だ。 とにかくツケ刃じゃダメだ。
349 :
デフォルトの名無しさん :2007/10/12(金) 12:39:49
350 :
337 :2007/10/12(金) 13:24:28
ご指摘ありがとうございます。 vec[i].nできれいにコードを書くことができましたが、 やはり構造体のアドレスを取得する方法が気になっています。 というのも、最終的に行いたいことは、 基底クラスを継承した複数の派生クラスをvetor配列に格納し、 その派生クラスのアドレスを基底クラスで受け取って、 仮想関数を呼び出すという処理をしたいからです。 CData *p; //ここでvector配列と添字でCDataの派生クラスのアドレスをpで受け取る p->Draw(); // 受け取った派生クラスの種類を意識せず関数を呼び出す コードとしては、このようなものをイメージしているのですが、 実装は可能なのでしょうか。 申し訳ありませんが、よろしくお願いします。
p = &vec[i];
352 :
351 :2007/10/12(金) 13:29:06
いや、まて。 なにかおかしい。 例えば class Base{}; class Derived : public Base{}; だとして、 vector<Base> に Derived を入れることは出来ないぞ。 vector<Base*> とすることになるんじゃないか? だったら Base *p; p = vec[i]; だと思うが。
的確すぎてワロタw
354 :
337 :2007/10/12(金) 13:52:05
ご指摘ありがとうございます。 つまり、クラスのアドレスをvector配列に格納し、 実体そのものは別に管理するということでしょうか。
>>337 >実体そのものは別に管理するということでしょうか。
yes.
vector内でのコピーがポインタのコピーで済むから動作が速くなる(可能性もある)し。
余裕があれば(管理者が許せば)boost::shared_ptrとかを検討してみるのもあり。
356 :
337 :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 :2007/10/12(金) 15:23:15
>>358 レスありがとうございます。
秒間20フレーム程度で数秒の動画なのですが
簡単なプログラムで実装出来ないでしょうか?
先生に難しいプログラムでは無いと言われました。
その2つを見てみたのですがこの分野が苦手な自分には
少し難しいです;;
>>359 何のために学費払ってんだよ。
先生に聞け、先生に。
361 :
358 :2007/10/12(金) 16:16:00
fft(高速フーリエ変換)自体は画像処理系の本ではかなりあたりまえにあるコードなので難しいものではないと思うんだけど 動画から画像を取り出すのはwindows標準でライブラリとか存在したかな...。 fftが難しくないのか、動画からフレームごとの画像を取り出すのも含めて難しくないのかちょっと聞いてみて欲しい。 あと、だれかできるだけ楽な、その方法知らないですか?>all
20フレームで数秒ってことは、50フレーム前後か。 そこいらの、動画を入力して、ビットマップ画像の羅列を出力するプログラムを使えばいいじゃん。
いろいろなデータファイルからデータ抽出して アルゴリズムに適用して出力結果を出すプログラム作ってんだけど 微妙に値がおかしいんだよね。大方あってるんだけど。 これはデバックでなおるのかな? 150X30くらいのデータを配列にいれて1行ずつ処理してるんだけど 領域破壊とかなってるんでしょうかね。
>>363 さぁな、どんなバグがあるかは、デバッグしてみないとな。
>>363 テストしたの?
本屋に行って、
「基礎から学ぶソフトウェアテスト」
とかの本を買って読んでみ。
おまえらこんな抽象度の高い質問によく答えられるな
回答も抽象的だし
だってプログラムの概要をいってなんとかしてくれるのかい? データファイル大量すぎて 説明しようがない
4725円のやつですか? 学校で買ったソフトウェア工学じゃ駄目?
学生さんか。
じゃぁ、
>>365 の本は向いてない。
ちゃんとしたレクチャーなんて、ここではできないから、インチキな方法を教えてお茶を濁そう。
メモリの不正アクセスは、検出するためのツールがある。高価なものから無償のものまで。
開発環境は何?
次に、プログラムが意図通り動いていないのであれば、まずはステップ実行して確認してみよう。
案外、あっさりと間違いを見つけられる。
それでもダメなら、すでに確認済のデータを入力し、正しいデータが出力されるか、確認してみよう。
おかしなデータが出力されるようなら、プログラムを部分ごとに個別に、テストデータを与えて、出力が正しいことを確認しよう。
cppunitとかunittest++とかboost.testとかライブラリから学ぶのがいいと思うんだぜ 中でもboost.testはbjamと組みあわせて複数のプロジェクトを一括テストとかできるし make書くのが面倒臭い人にはおすすめ
んなものは、反復してテストするレベルに到達してからでいい。 すでにバグがあるらしいということが、わかっているのだから、まずはステップ実行だ。
データ処理において配列をたくさん使ってプログラムを作るのは やめておいたほうがいいですか? グリッドでの計算で二次元配列を2つ使って行っているんです。 30X150行を2つくらい。 領域を使いすぎてはいけないと聞いたんですけど。
>>373 たったそれだけ?
今時のPCなら問題ないでしょ。
まーその二次元配列のファイルを2500個処理するんだけどね
>>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のような値を表示したいのですが、どう直したらよいのでしょうか?
l1とl2の型をdoubleにする。
379 :
デフォルトの名無しさん :2007/10/13(土) 11:16:58
long l1 = 1.2; long l2 = 3.4; はもしかしたら優秀なコンパイラなら long l1 = 1; long l2 = 3; として解釈するということでしょうか?
>>379 いいえ。優秀なコンパイラに限らず、気が違っていない限りそう解釈するはずです。
何が優秀なコンパイラなのかは知らないが、 規格上、浮動小数点数を整数に変換する際には、 小数点以下切捨てが行われることになっている。
382 :
デフォルトの名無しさん :2007/10/13(土) 11:21:14
>>376 返答ありがとう。
よくよく考えてみると配列を150X30を30X150にしたり
無駄なことをしてるから
そこらへんを直してみるわ。
>>382 clock_tが実際に何型かは実装に依存する。
しかしprintfには、型が判明していなければデータを渡せない。
とりあえずdoubleにキャストすれば、大抵の環境では値が保持される。
俺ならlong longにキャストしたいところだが、long longはまだ標準にないからな…。
切捨てに関して便乗で -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関数だとすんなりいくので不思議な感じがします そういうものなんでしょうか?
>>382 いいえ、勘違いではなくclock_tがdoubleなどの実数型であるとでも思っているのでしょう。
>>382 もとが整数なのに小数で出力しようとするのはナンセンスだが、
doubleにキャストして変換しているので、間違いではないよ。
>>385 負数の丸めは実装依存ですが、一般的には0に近い方に丸められるようです。
>>388 浮動小数点数型から整数型への変換は、常に小数点部分を捨てた値で、
つまり0方向への丸めに決まっていたはずだが。
>>385 (int)floor(X / 2)
すまん、(int)floor(X / 2.0)とでもしないとだめだな。 浮動小数点数型から整数型への変換のことは、X3010:2003 6.3.1.4に書いてある。 手元のANSI C言語辞典の型変換の項目にもそう書いてあるから、 C89でも0方向への丸めで間違いないはず。
>もとが整数なのに小数で出力しようとするのはナンセンス よしよし
>>389 ,390
すみません、どこに浮動小数点型が出てくるんですか? 元質はこれなんですが。
--
int X=-1;
printf("%d\n",X/2);
すまんorz 388の言うとおりだ。ただしC99では0方向への丸められることになった。 また、div関数などを使えば、C89でも必ず0方向への丸めになる。 丸め方を指定したければ、391のように浮動小数点数を使うという手もある。
394 :
385 :2007/10/13(土) 14:44:59
>>388-390 ,393
整数型/整数型の丸めは0方向に
floorとかEXCELのINTとかは小数点部分を捨てた値にする関数っていう感じですかね
>>392 とりあえず(int)floor(X/2.0)=-1でできますね
たしかにわざわざ実数で割るのもなんかすっきりしませんが、そういうものだと思うことにします
ありがとうございました
floorとExcelのINTは負の無限大方向への丸め。 小数部分を捨てるというと、 Cのやる0.5→0、-1.5→1のような字面的に整数部分だけの値にすることを連想する。
(int)floor(X / 2.0) これってアリなの? Xが整数型だから、 X / 2 になっちゃわないか? (int)floor((double)X / 2.0) などとして、Xを実数にしないと。
doubleで割ってるからdoubleになる 大丈夫
左項に合わせるのだと思い込んでたよ。
コンパイルしたら警告が600個あります 今のところバグは無いのですが、何か他に弊害はありますか?
まず間違いなくバグだらけだろうな
>>400 そんなに大量に警告が出ていたら、無視してはいけない警告が出ても、気がつかないだろうな。
それが、大量の警告を放置することによる害。
きちんと精査した上で警告を無視すると決めたら、
当該部分だけに限定して、pragmaとかで警告を抑制すべし。
GNUのソースは警告0ですか?
>>400 多分ライブラリが嫌らしいコーディングしてるんだろうがな
Wallにしたらstlでも凄い量の警告出るぜ
>>404 wow 調べてみたらけっこうライブラリというか同じ部分の警告でかぶってました
3桁ごとにカンマが入ってる数字文字列を int型に変換する関数ってないんですかね
標準ではありません。大したもんじゃないから自作しましょう。
そうですか lexical_castで通ると思ってたらエラー出るし… 自分で書くことにします すみません
boost使うならやりようは色々あるかと 当該スレで聞いてみては?
C++なんですが、AfxsetResuseで 明示的にリソースを設定した場合 リソースの解放も明示的に行う必要が あるんでしょうか?
>>411 C++標準には、そのような識別子は定義されていないが?
質問です。 以下のように書いたとき、 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); }
int array[10] = {10,10,10,10,10,10,10,10,10,10}; 0以外の数字で全て同じ数値で初期化するには、いちいち全部書かなきゃダメ。 めんどくさいなら for(i=0; i<10; i++) array[i] = 10; みたいにループで初期化する。
int array[10] = { FILL(10,10) }; みたいにプリプロセッサで書けないかなぁ…
C++ならクラスにしてコンストラクタで初期化させればええやん
std::vector<int> array(10, 10);
>>414 0以外のときは駄目だったんですね。
全然知りませんでした。
ありがとうございました。
あれ?自動変数は0に初期化されるんでしたっけ?
いいえ、普通の自動変数は初期化されません。 但し、構造体や配列の初期化指定子の数が足りない場合は0が補われます。 従って、all bit 0が数値0を表わさない実数型であったとしても、数値0が保証されます。
プログラム的にmain関数内でforループの中で配列を宣言するのはどう思いま すか?配列の領域がループ回数分かわるのでforループの中にいれたいのですが。
>配列の領域がループ回数分かわる ここが意味不明なので何とも言えない。
forループの中で1ループごとにファイルを1つ読み込んで そのファイルの行数を配列の領域としたいんです。 だからファイルをかえるとファイルの行数もかわり、領域もかわるというわけ です。わかりにくいですか
あーなるほど、言いたいことは判った。 配列って言うか、動的メモリ領域の話ね。 ループ外で全く使わないなら、ループ内で定義していいんじゃない? つーか、そうすべきだと思うけど。 # 但し、殊にCではアナクロ的に関数の先頭で全てのローカル変数を宣言しないと気が済まない人もいるから注意。
ただそのときに その配列の前にファイル読み込んで行数確認して 配列の領域確保して またファイル読み込んでそこの配列に代入というプログラムにしてるんです。 無駄にファイル読み込んでるとかいわれそうだけど。 最初に全てのファイルの領域を確保する 配列を定義してもいんですが、その行数をまた違う配列でも使うので、 それは避けたいんです。
ファイルの二回読み自体は仕様的に問題ないなら構わないと思う。 しかし、寧ろそれだけ複雑ならループ内を全部別関数にするべきじゃないのか? main()はあくまでもコマンドラインとのI/Fだと思うんだが。
427 :
デフォルトの名無しさん :2007/10/16(火) 14:06:45
STLなら自動拡張する
まあそうなんですけど。 今つくってるのは1つのファイル(これを入力)に対して forループ回違うファイルを読み込んで処理して それぞれファイルでの値を出して一番高いものを出す。 その一番高いものが入力と合ってたら正解みたいなプログラムなんですけど。 これをmain関数内でやってるわけなんですが、 入力が複数として、この複数の入力の中で正解がいくつあるかって最終的には したいんです。 今のmain関数も別関数として 入力をいれる処理をmainとして、元のmain関数において正解のものを returnさせて正解率を出すべきですよね?
抽象的に過ぎてよく判らんw こんなもんじゃないのかな? main() { 問題処理(); } 問題処理() { 統括ファイル読み込み(); for () { 個別ファイル処理(); if (正解判定()) { 正解処理(); } } }
んなもんですね。。ありがとうございます。 mainから問題処理のところを手作業でやってもいんですけど 入力データが100くらいあるから手作業だとだるすぎるので。 今求められてるのは正解率ですから。しかし何かの機械の実装って本当にめん どくさいね。まだ社会人じゃないから実情は知らないけど。
オジサンの弱った頭には、ややこしくて理解できん。 話を整理してもらえないか。
宿題スレじゃないんだし、エスパーごっこはそろそろ終わりでいいんじゃないか? >430だって>429までの流れを踏まえて少しは自分で頭を使いたいだろうし。
もうforループの中で配列宣言つかっていいてのと ファイル2回読みはOKかどうかもわかったので失礼します
まあ、ファイルのクローズと、領域の解放を忘れなければどうでも良いんじゃね
若い人は記憶力まかせにしても破綻しにくいからのぉ。 わしも小学生の頃は、 恐ろしくスパゲッティなコードを書いていたが、 ちゃんと把握できていたので何ら問題なかったな。 いまではもう無理。
若いのにRAIIとかエディタの支援機能に頼りまくりで記憶力低下中だけど 元からそんなに記憶力良い方じゃないから問題ないか
ここは自分のダメな所を書くスレになりました
若くても、頭脳を有効に使うために、スマートなコードを書くべき。
Cの配列宣言って要素数に定数じゃなくて変数って使えないんじゃ? 動的な領域確保したい時はCはmallocに頼るしかないはずだと記憶していたのですが? 覚え間違いかな…? ># 但し、殊にCではアナクロ的に関数の先頭で全てのローカル変数を宣言しないと気が済まない人もいるから注意。 これはブロック({}で囲まれた部分のこと、正式な呼び方知らない)の先頭でしか変数の宣言を許さないCの制限のせいでしょう C++ではこの制限がないからbetterCとしてC++を使っているなら関係ない話ですが
>>439 その制限は関係ないよ。
関数の先頭でしか変数宣言すべきではないという石頭の連中は、
制限がないC++においても、同様のルールを主張していたりするから。
>>439 >Cの配列宣言って要素数に定数じゃなくて変数って使えないんじゃ?
C99なら出来る。C89はムリ
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を返す 空のフィールドは存在しないものとする。 *********************************************************************/
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; }
128文字以上を入力するとマズい
getsを使うなってのは、読み込む最大文字数を指定できないからで、入力ファイルに予想より長い文字列が現れたら致命的
代わりにfgetsを使えってのは、fgetsは最大文字数を指定できるので、どんな入力が来ても死ぬことはない
>>444 の関数はそれと同じ問題を孕んでいる
ユーザに127文字までしか入力してはいけないといくら言い聞かせてみたところで、禁止されるとやりたくなるのが人というものだし、
そうでなくてもついうっかり文字数制限を忘れてしまうこともあるだろうし、プログラムはどんな入力が来ても安全なように作っておくべき
>>444 ReadDataにsの要素を渡して文字数のチェックをちゃんとすればおk
てかex変数が無駄に見える……
間違えた、sの要素数を、ね
ofstreamはdeleteした際には自動的にcloseされるますか?
yes yes yes
450 :
444 :2007/10/17(水) 21:22:36
レスありがとうございます。
>>445 >128文字以上を入力するとマズい
実装時には、バッファ長を1kB位取ってごまかしちゃうつもりでしたが、
言われてみればその通りですね。変数ipをチェックすればいいので、
バッファがあふれたらエラーを返すコードを追加しようと思います。
>>446 >ex変数が無駄に見える……
やっぱり?
ループの脱出条件をコーディングしながら決められるので、ついつい
やっちゃいます。こんな場合は、
while ( (c=fgetc(p) != EOF ) {
とか書くもんなんでしょうか?
>>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文書かないといけないから、無駄そう
C言語なんだから、関数ばしばし作ろうよ。 ・デリミタもしくはEOFまで読み飛ばし、最後に読み飛ばした文字を返す ・デミリタまで文字列を格納する という2つの関数を作ればスッキリするよ。
453 :
444 :2007/10/17(水) 22:59:06
>>451 >whileループ後のif文をそのままwhile内に
む。なるほど。
こちらの方がシンプルですね。
プログラムをできるだけ愚直に書こうと努力しているつもりですが、
スマートな解を示されると感動しちゃいます。勉強になりました。
>>452 >関数ばしばし
実装フェーズでは、そうなっちゃうかもしれません。
ただ、データ読み出しの関数なので、恐らく何万回も呼ばれる
ことになると思います。
実のところ、こんな冗長な関数を作るべきか、まだ悩んで
いるんです・・・
何万回程度の関数呼び出しコストなんて屁でもないぞ
というかこれでいいと思う 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; }
いいのか、ほんとに。
なんでいいのか判らん・・・
458 :
455 :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 :2007/10/17(水) 23:34:58
>>456-457 いや、IsDelimiterの戻り値を勘違いしてた上に、
そもそも動作を全く勘違いしてたw
これならわざわざ書き直す必要なかったですね……
偉そうにでしゃばってすみませんorz
460 :
444 :2007/10/17(水) 23:44:46
各位殿
色々ご指導ありがとうございました。
とりあえず仮決めですが、下記のようにすることにしました。
色々いじったら、仕様が変わっちゃった・・・
>>454 ちょっと安心しました。
>>455 読み込み長を返すアイデア頂きました。
ありがとうございました。
461 :
444 :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; }
自分なら、↓こんな感じかなぁ。 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 :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 ; }
countDelimiterで制御するのですね。 ちょっとトリッキーかな・・・
465 :
462 :2007/10/18(木) 00:22:08
やりたい処理を素直に書いただけなんだけどなぁ・・・。
文化が違うのがオモロイなぁ・・・
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)をそのまま生成するには どう書いたらいいですか?
>>468 > エラーコードの「ABC」のみを引数で渡す
あなたは自分がやっていることを理解してない。
ABCはエラーコードなんてものではなく、文字列リテラルへのポインタ。
なお、複数の同じ内容の文字列リテラルが1つにまとめられることは保証されていない。
そして、マクロが何者なのか、理解していない。
いまのコンパイラはプリプロセッサが統合されているので、わかりにくいが、
ソースコードは、プリプロセッサによってマクロが展開された後に、コンパイルされる。
マクロは「定義」するものだが、その定義とは、日本語の定義とは意味が異なる。
> strをどこで定義すればよいのかがわかりません。
エラーはネストするの?
シングルスレッドとマルチスレッド、どっち?
470 :
469 :2007/10/20(土) 23:35:01
ああぁ 呼び出し側の関数にエラーコードとして返したりせず、 エラーメッセージを出力する関数にしか渡さないのなら、 適当に自動変数で持てばいいと思うよ。 CとC++どっち?
>>468 #define ABC(gStr) "ABCの時のメッセージ("#gStr")"
ってgStrが変数なのか
知らね
基本的なことが理解できてない人に、 場当たり的に教えるのは、 効率が悪すぎる。
473 :
デフォルトの名無しさん :2007/10/21(日) 00:42:22
468です。いくつかのご回答、ありがとうございました。
>>469 自分のしていることを、自分で理解していないのかもしれません。
> エラーコードの「ABC」のみを引数で渡す
は間違いで、エラー出力関数への引数には、文字列になります。
エラーはネストしません。また、シングルスレッドです。
>>470 C++です。
「適当に自動変数」というのは、文字列自動変数をエラーコード
毎にその場でベタにつくって、エラー出力関数に渡す、という感じでしょうか?
>>472 効率よく教わるためには、どの基本的なことを勉強すればよいでしょうか。
>>473 ネストせず、シングルスレッドなら、str をグローバル変数にしてしまうのも可能。
簡単だけど、あんまり良いやり方ではないが、とりあえず最小の変更で済むかな。
strなんて短くてどこにでもありそうな名前は、変えるべきだよ。
> 「適当に自動変数」というのは、文字列自動変数をエラーコード
> 毎にその場でベタにつくって、エラー出力関数に渡す、という感じでしょうか?
そう。
476 :
デフォルトの名無しさん :2007/10/21(日) 11:47:16
>>475 ありがとうございます。
実環境で確認してみます。
おま・・・。 せめて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 )." (共通な文字列リテラルの切り出し。日本語版やら英語版やらを作るときに使う)
>>477 do whileハックを使わないといけないのは、古いコンパイラ。
>>478 それはすまない。俺の勉強不足のようだ。
ついては↓のコードがエラー無くコンパイル通るような
「新しいCコンパイラ」は何かを教えてくれないか?
#include <stdio.h>
#define macro(x) {puts(x);}
int main()
{
if(1) macro("str1");
else macro("str2");
return 0;
}
>>479 そういう{}のないif文は、コーディング規約で禁止。
マクロには;をつけないっていう選択肢はなし?
どう考えてもバグの原因になるだろ。
小細工禁止! マクロによる関数もどきはダメ。 インライン関数やテンプレート関数を使うべし。
コンパイルに5分かかるプログラムを作ったら一人前ですか
そうだねえ。 再帰テンプレートとか作ると簡単に5分超えるね。 練習にはいいんじゃない?
で、規約やら小細工やら良いんだけど >do whileハックを使わないといけないのは、古いコンパイラ。 誰かコレを解説して貰えんか? コンパイラの新旧が、マクロを括るブロックにdo-whileを使うことと どう関係してんだ?
勘弁してやれw 勘違いだろw
制御文なしに中括弧だけを書くとエラーになるような古いコンパイラがあったんじゃないか。
>>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 :2007/10/21(日) 20:33:43
やべ、俺リロードしなさすぎw 吊ってくるww
エラーメッセージを生成するのと、表示するのは、分離したほうがいいと思う。
つーか、元質はデバッグ出力関数に渡す引き数を生成したいんじゃないかな? だとしたら、>475以下はダメだろう。
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[]のこと } といった感じのことがしたいのです。実現可能な方法があれば是非お願いします。
unionを使えば出来ないことはないけど、正直お勧めしない。
C++なら・・・無理か。 型もバラバラだしな。 添え字に変数を使って tmp.[i] ってしたとき、何型で扱うつもりなんだ
>>493 限定的にはunionを使えばできる。
ややこしくはなるがポインタをキャストしてもできる。
どちらにしろ、サイズの違う型を統一的には扱えない。
テンプレートクラスでtemplate <Type T>のTにクラスを入れることが可能なのですか? int型などを入れるメリットは分かるのですが具体的にどんなクラスを入れれば役に立つのか教えていただけないでしょうか?
499 :
493 :2007/10/22(月) 20:29:47
回答して下さった方々有難う御座います。 for文のインデックスを利用出来たらと思いました。 しかし型などが違うのでその都度場合わけをしないといけないので出来たとしても結局のところ手間は増えますね。
>>498 可能です。
STLのvector<T> はTの配列と置き換えられる動的な再配置も可能なクラスですが
当然組み込み型以外でもvectorを使うことが出来ます。
501 :
デフォルトの名無しさん :2007/10/22(月) 21:15:25
float a; a=1; print("%d",a); を実行すると 1072693248っていう数がでてくる。 これってどういうこと?
>>501 言語およびコンパイラは何?
"%f" を使うべきである事は知っていて、なぜそうなるのかが知りたいということ?
>>501 printfの引数の2つ目以降の型って決まってないよね。
だから、printfにとっては、どんな型の値を引数に渡されたのか、わからない。
そのため、書式文字列に%dとあれば、intだと思って処理するわけ。
>>498 可能。
int型を入れるのと同じメリットが、stringクラスを入れるのにもあると思うのだが。
stringの配列なんて使う機会ないか? ないなら、まぁ仕方ない。
list<vector<string> > とかな。
>>505 そんなこと、したことないぞ。
まず、stringのように重いものを、ポインタや参照ではなく値として持つvectorに格納するのが、乱暴だ。
次に、vector<string>を直にlistに格納するのも、乱暴だ。
vector<string>に何か意味があるのであれば、それなりのクラスにすべきだ。
乱暴ってのが何を意味してるかわからんが、 別にstringは重くないしvector<string>も十分に速いぞ
あほすぎる・・・
>>506 が何を言いたいのかワカンネ
乱暴ってどういう意味?
vector<string>を使うなって言ってるの?
vector<string>を内包したオブジェクトつくって インターフェースをきちんとしたオブジェクト指向な作り方しろってことか…。 C++だからって必ずオブジェクト指向で作らんでもいいだろ…
>>506 は「そんなこと、したことないぞ」と言っている通り、思い込みで書き込んでいるんだよ。
vector<string> に何か意味をもたせるとして、所詮 vector 程度なら変数名で十分示せると思う。 vector<string> はオブジェクト指向だよ。
>>507 それは実装依存だな。
どーでもいい場所なら乱暴なコーディングをしても構わないし、すべきだろうが、
重くないとか十分に速いとか言ってるようじゃ、C++使う意味がないんじゃないか。
>>509 文字どおりさ。
動けば何でもいい、そういうやりかた。
>>510 何らかの意味があるのだからtypedefすべきだし、
大抵の場合は何か付随したデータがあるわけで、
それと本体のvector<string>を別管理するのは、
不適切だと思う。
>>512 オブジェクト志向と言いながら、
BASICやスクリプト言語のように、型にルーズでどうしようもない代物を作る人を、見てきたわけだが。
彼らは万能ナイフを作ることに喜びを感じているようだが。
ふ〜ん。君はそういう事に喜びを感じているんだね。
そこでboost::ptr_vector, ptr_list 内部ではvoid*として保持されているためコードサイズ膨張対策にもなる 重いオブジェクトのコンテナならこれで決まり☆
>>513 のやり方を推し進めたら、プログラム中に出てくる概念全部を
typedefなりクラス化なりすることになるな
アホとしか思えん
いちいち型を定義してたら型がむやみに大量発生するし、
そのせいでtypedefされた型の元の型がわからなくなって
どういう操作ができるのかいちいち調べる羽目になる
名前の一覧は vector<string> names; で十分
過度の抽象化は毒であると知れ
>>516 の書き込みをみて
VC++が頭をよぎった。
ふとよぎった。
>>516 > 名前の一覧は vector<string> names; で十分
名前だけで単独なんだ・・・どういう場合?
520 :
デフォルトの名無しさん :2007/10/23(火) 15:36:35
スイッチを押すと外部割り込みでInterrupt関数が呼び出されて、スイッチを押した回数を数えて変数countに保存し、 タイマ割り込みで一定時間ごとにTimer関数を呼んで押した回数ごとに行動を変えるプログラムを作りたいです。 グローバル変数を使う以外に二つの関数の間でcount変数の値を渡す方法はありますか?
つまり、二つの割り込み関数からそれぞれ設定と参照を行いたいわけだな。 グローバル変数の代わりに、それらの関数をメンバとして持つクラスを作ってそのメンバとしてcountを持てばいい。 勿論、そのクラスの生存期間に注意が必要。
522 :
520 :2007/10/23(火) 16:23:07
せっかく回答してくれたのにすみません。 C++ではなくCで行う方法を教えてください。
>>520 設定も参照もどちらも割り込みルーチンから行なうのなら、
グローバル変数にしておくのが無難だがなぁ。
グローバル変数にしたくない理由は?
524 :
デフォルトの名無しさん :2007/10/23(火) 16:44:44
メインで変数作ってポインタ渡せば? グローバルと同じような物だけど
525 :
520 :2007/10/23(火) 17:49:50
>>523 やはりグローバル変数がいいですか・・・。
プログラム作ってる途中でよくわからなくなることが多くて個人的にあまり好きじゃないだけです。
>>520 gccなら関数内関数で外側のローカル変数を参照出来るはず。
グローバル変数以上に問題のあるコードかもしれんが。
>>524 割り込み処理だと渡しようがないと思うんだ。
>>520 >>525 1.割り込みマスク外した後ならsignal関数では?
2.共通の割り込みハンドラで割り込みを1箇所で受けられるかな?
ここで聞いてよいのかわからないのですが・・・ CPadてVistaでも使えるものなんでしょうか? とりあえず実行すると〜.exeが見つかりません〜てなエラーが出てきます。 これはOSとCPadとの相性が悪いのか、自分が何かミスを犯しているのか、どちらなのでしょう?
調べてみたら自己解決できそうなので、自分で調べてみます。
解決、スレ消費申し訳ありませんでした。
532 :
デフォルトの名無しさん :2007/10/25(木) 16:20:24
VCでコントロール(仮にオリジナルのペイントソフト)を作成して それをVB.NETから呼び出して、VBで作成したインターフェース内に埋め込みたいのですが VCで作ったものをDLLにまとめることくらいしか現在わかっていません。 何に対応(例えば継承させるクラス)させればよいのかなどおおまかに教えていただけないでしょうか?
VBのスレで聞いたら?
>>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); }
lexical_cast<>
qa3457974
>>535 エラー処理してない点は同じなのでどちらも却下。
だ が 敢 え て 言 わ せ て も ら う
if(1 < argc){
だと!
>>538 if(argc > 1)
より
if(1 < argc)
の方がいい理由も添えて書いてくれ。
いまどきiostream.hって・・・
.h
542 :
デフォルトの名無しさん :2007/10/26(金) 14:13:27
bf
543 :
538 :2007/10/26(金) 17:15:12
>>539 半分冗談だったんだけどね(^^; 適当に流して欲しかったんだけど。
単に俺のスタイルなだけ。
例えば、『aが1よりおおきくて、かつ10より小さい』という命題について
if(1 < a && a < 10)
と書くと、常に右が大きくなるでしょ。
完全に主観だけど、あとでソースを見返すとき分かりやすいんですよ。
(数学の)実数線も右が大きいし、なんとなくそういうクセをつけました。
それだけ。
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
消えるだろ ふつう
>>545 関数中のvはスコープから抜ける時デストラクタが呼ばれ、
確保された領域は開放される。
v.push_back(i)などで、どんどん追加でき、
サイズが動的に拡張されていく配列。
>>543 if( x==0xFF ) などと比較したいのに、誤って代入文 if( x=0xFF ) と
書いてしまう凡ミスを防ぐために変数を右に つまりif( 0xFF==x ) と
書くと良い みたいなことがドコカの本で書かれていた記憶がある
>>543 俺は『aが1よりおおき』いなら、
if(a > 1)
と書くな。『1がa未満』なら逆に書くけど。
俺も一時期
>>543 と同じ書き方してたけど、
仕事でプログラム書き始めてからは仕様書通りに書く癖が付いた。
sscanf()はバッファオーバーフローがあるから 使ってはいけないんじゃなかったっけ? 普通atoi()だろ。
どちらでも仕様書どおりだよ。
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 関数抜けた時点で解放され、別の値に変わる可能性はある
ゴミ箱の中身消したけど復活できるかどうかと同じ事だ
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とか関係なし
>>559 基本的なことが、いくつも、理解できていない気配がする。
泥縄的に教えてもしょーがないので、ちゃんとC++の基本を勉強したほうがいいよ、としか言えない。
562 :
デフォルトの名無しさん :2007/10/27(土) 00:59:20
オブジェクト指向っていうのは、データに対してあれこれ作業をするって事だ あれこれ作業するごとにデータが消えていたら駄目だろ
v.push_back(VEC(j)); の VEC(j)はどこいっちゃったの? ってこと?
564 :
デフォルトの名無しさん :2007/10/27(土) 01:20:13
>>545 です。
みなさん、レスありがとうございます。
クラスの中でサイズを指定しないと配列の宣言てできませんよね。
もしコンストラクタの引数の値を配列のサイズにしたいときには、
データメンバに、
int a*;
を入れて、
コンストラクタの中で、
a=new int[コンストラクタの引数の値];
と(私は)します。
だから、私はvector配列をクラスのデータメンバとするときも、
配列のサイズを指定しないから、
どこかでnewすることでvector配列の領域を確保しなければ
ダメなのかぁと思ってしまったわけです。
newをせずに、ただ値を代入しただけでは、
局所な値を代入しているに過ぎないなどと思ってしまいました。
色々考えているうちに、頭の中がごちゃごちゃになってしまいました。
己の力の無さを改めて自覚しました。
>>564 vectorの中でnew/deleteしてる。
コンストラクタとデストラクタで何か表示するクラス作って vectorにpush_backしてると何か閃くかもしれない
クソッタレな本に引っかかってしまった可哀想な犠牲者なんだろうな。 きちんとした本を読んでいれば間違わないような誤解してるんだもの。
これからプログラムを勉強する俺に是非教えてほしい。 ちょっとしたアプリケーションを作りたくて なんとなく、適当に参考書見て、高校の頃少し勉強した、デルファイに似てるような気がしたから VBの参考書買って、MSからVS2008bata2をダウンロードしてサンプルプログラムを作っては 自分なりに書き換えて違う結果を出力させたりと、少しずつ理解してきてる・・つもり。 けど、VBとC++はどのスレ見てもVBは糞ってよく見るんだけど、それはなぜですか? 自分は結構VBがなじんできてるしこの頃。。 実際、プログラムの組みやすさ、軽さ、ほか色々。 ここで聞くのはどうかと思うけど、できれば教えてほしい もし、VBはやめとけ!と言うならばお勧めの言語を教えていただきたい。
569 :
デフォルトの名無しさん :2007/10/27(土) 01:54:18
すいません、教えていただけないでしょうか。 C言語で、2つのスレッドが交互にグローバル変数を参照→インクリメントして、 決められた値になったら終了する。という処理を作りました。 ここからグローバル変数を用いずにスレッド間でデータを渡しあうことで同様の処理を 実現したいのですが、どうすればいいでしょうか。 自分で調べたところ、スレッド間ではお互いのメッセージキューへ格納→読み出しを行えば データを渡せることがわかったのですが、見当違いな考えかもしれません…。 どのような方法・関数を用いればいいか、ご教授のほど宜しくお願いします。
OSぐらい書けよ
571 :
デフォルトの名無しさん :2007/10/27(土) 02:02:14
>>570 申し訳ありませんでしたorz
作成環境は以下のとおりです。
OS:Windows XP
コンパイラ:Microsoft Visual C++ 2005 Express Edition
VBが糞と言われる理由 1. VB自体ではなく、VB使いが糞であるため 2. VBでプログラミングを勉強すると糞になるため 3. VBが適切な手段の場合には良いが、そうではないのにVBを使う糞がたくさんいるから 4. VB.NETではないVBは既に終わっており、なおかつ、VB.NETをやるならC#をやるべきだから
>>569 質問が抽象的すぎる。
もっと具体的に詳しく。
また、なぜ、グローバル変数をやめようと考えているのか、その理由も。
∧_∧ クワッ! ∩`iWi´∩ ヽ |m| .ノ |. ̄| U⌒U
575 :
デフォルトの名無しさん :2007/10/27(土) 02:17:26
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言語を勉強中で、
様々な処理方法を試してみたいと思ったからです。
そのスレッドに渡す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 :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 :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
>>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));
としなければダメですか?
何度も申し訳ないです。
VEC(j)のコピーがvector内に追加される
> コンストラクタが呼ばれた直後にデストラクタが呼ばれるので、 ただし、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してやる必要がでてくる。
かぶったorz
>>583 基本ができてなさすぎ。
ちゃんと勉強して出直せ。
>>583 いろいろごっちゃになっているようだが、
・関数内で宣言されたオブジェクトは関数が終わったら破棄される
と言われて、
関数が終わったらvectorの中身が壊れるのでは、と疑問を持ったみたいだけど、
この場合は関数へ渡す引数として宣言した「一時オブジェクト」なので問題ない。
そうでなくても、vectorは要素を「コピー」して保持するので、
元のオブジェクトが破棄されても何ら問題はない。
589 :
588 :2007/10/27(土) 20:31:56
間違えた、俺がごっちゃになってるorz 書き直すと、 関数内で作ったオブジェクトをvectorに入れたら、 関数を抜けた時にそのオブジェクトが破棄されてvectorの要素が無効になるのでは、と疑問を持ったみたいだけど、 この場合はvectorへ渡す要素として宣言した「一時オブジェクト」なので問題ない。 そうでなくても、vectorは要素を「コピー」して保持するので、 元のオブジェクトが破棄されても何ら問題はない。
590 :
588 :2007/10/27(土) 20:34:03
ああ、いや、一時オブジェクトは関係ないか、結局破棄されるんだから とにかくvectorはコピーコンストラクタ呼び出してコピーしてるので、 元のオブジェクト破棄しても問題ない
591 :
588 :2007/10/27(土) 20:42:08
ややこしく考え杉。 int g_c ; void funcA(int& a) { int b = a ; g_c = a ; } void testA(void) { int x = 3 ; funcA(x) ; } これと同じよ
フフフフフフハハハハハハ
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はポインタの中身だと今まで思ってたのですが、、、、なんでなのでしょうか
(*po)++; 釣りなんだろうけど
理由のところ、教えてくれませんか なんで()つけないとダメなのか。 というか中身にアクセスするときは()つけた方がいいんでしょうか
*po++ は *(po++) という意味だから、だな
俺は演算子の優先度の表を暗記するだけの頭脳がないので、 決して、 *po++ ; なんてコードは書かない。 他人が書いたのを読まないといけないときは、優先度の表を見て確認する。 そもそも、後ろに++を付けるのは特別なときだけだし・・・。
*++p
++(*po);
優先順位覚えてないから付けといて
左側に単項演算子二つで優先順位も糞もないだろ
むしろ全ての演算子を単項演算子にすれば頭で思い浮かべたものをキャレットを一々前後させずに一気に書ける
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; }
find には 1.7 じゃなくて S を渡さんといかんのでは?
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));
まちがった 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さん コンパイル、通りました!すごい!! でも全く解読できましぇん。 一語一句の意味をこれから勉強します。。。
>>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>);
ってのではダメ?
はは 定数だからね
もっと簡潔・明瞭に書く方法ないのかなぁ。
C++勉強しはじめてリファレンスを知って、 ポインタ使うよりずっといいじゃないですかって気分なんですが、 関数の引数としてリファレンス使うときに、 void hoge(int* out1, int* out2); //out2の出力が必要ない場合はout2としてNULLを渡す のような仕様はリファレンスでは実現できないってことなんでしょうか? 毎回ダミー変数宣言して渡すのも馬鹿らしいし。
>>617 どうしてもやりたかったらこういう手はどうだろう。
--
int dummyOut;
void hoge(int & out1, int & out2 = dummyOut)
{
if (& out2 != & dummyOut) {
out2 = someOutput;
}
}
--
ダミーは必要だけど、毎回じゃないし使わないときは出力処理を回避することもできる。
>>617 ダミー変数を渡すのがバカらしいのなら、ポインタ渡しのままでいいのでは?
参照は、結局ポインタ渡ししてるだけだから、組み込み型を渡すときはあまりメリットがない。
しかも、ポインタ渡しでも上手に組めば代入するのは1、2ヶ所だから読みにくくも無い。
俺のスタイルとしては、値を返すときは参照型ではなくポインタ渡し。
参照型が活きるのはクラス等を渡すとき。
void hoge(vector<char>& ref_v);
void hoge(const vector<char>& ref_v);
メンバアクセス演算子( . -> )がオーバーライドされてる場合でも深く考えなくともよい。
620 :
619 :2007/10/29(月) 13:44:56
>>618 それも一応考えてみた。他にもオーバロードって手もあるよね。
int val = 100; val = val++; int result = val; このとき、result はいくつになりますか? また、処理系に依存せず、同じ値になりますか?
>>622 おぉ。ファック。
なんてこった。
ありがとう。
ファックしてもいい?
>>572 超遅レスで申し訳ない。
VB自体は糞というわけではないのか。。
もし、また改めて勉強するとするならば、VisualC++とVisualC#はどちらがお勧めですか?
もちろんどんな物を作るか、目的は何か、ってのが決まっててこそ選ぶのかもしれないけど、
もし、将来性等考えたらどっちになります??
626 :
デフォルトの名無しさん :2007/10/30(火) 01:01:04
VisualC#
627 :
625 :2007/10/30(火) 01:06:12
検索したらいっぱい出てきたんでとりあえず色々眺めて決めます。 ・・とおもったらレスがついてた。 >626 なぜですか?よかったら教えてほしいです。
自動車に例えるなら、 C# → トヨタ自動車本社の設計技術者 C++ → トヨタに部品を収めている協力会社の設計技術者 そういう感じ。
…え。
C# → Windowsユーザー C++ → マイクロソフト
>>628 確かに C++ の方がスキルが必要だから間違ってないね。
.NET Frameworkって「のり」があるからC#, C++, F#とどれも使えるのが一番だね 状況に応じてシームレスに言語を選択できる開発環境ってのはかなり美味しいだろう さらにPowerShellスクリプトも使えば窓も*nix系に匹敵するかなり強力な環境になると思う
んじゃ、 C→町工場の工員 こんなかんじか?
C→拡張しすぎてわけがわからなくなった、おじいちゃん技術者
質問させてくださいー・・・。 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' ココだけ見てもわかんねーよって感じでしょうか・・・。 なんとなく原因が雰囲気でも分かれば教えてください。
>>635 off_tのtypedefを探して貼れ
637 :
635 :2007/10/30(火) 16:11:04
レスありがとうございます。 typedef、存在しないみたいです。 設定しなきゃ駄目ですか?
typedefが存在しないわけがなかろう。 off_tは予約語じゃないぞ。
それか、struct off_t strip_offsetとして使うべきものかも。
640 :
635 :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' で使用しています。」 だそうです。
>>640 じゃあそのソースがインクルードしているソースやヘッダを
全部調べてoff_tの定義を調べるべきだな。
もしかしたらtypedefではなく#defineかもしれない。
643 :
635 :2007/10/30(火) 16:33:32
>614 インクルードされているファイルって言うと#include <winsock2.h>みたいなやつですよね? 全部調べていくのはちょっと自分には難しいかもしれません。 そっちに原因があるということだったら、コンパイラを変えてみると何とかなるかも、ですか? MinGWとかでコンパイルできるか試してみます! >642 #defineもありませんでした。>635に書いた2行以外のどこにも出てこないんです。
#include <sys/types.h>
>>643 off_tでぐぐるぐらいの事はしてみたよな?
typedef long off_t;
>>635 検索を使ってちゃんと探してみたか?
俺は自分の環境で探してみつかったぞ。
しかも難しい定義でもなんでもなかったぞ。
答えは言わない。自分で環境全部きちんと探して。
648 :
647 :2007/10/30(火) 16:45:36
答えでちゃったね。 VS C++のファイル検索使えば全検索でも何分もかからないのに。 いずれ仕事にするならそれぐらいはきちんと覚えておいて。
>644 その記述を入れたらoff_tに関してのエラーは出なくなりました!ありがとうございます。 >645 ググって、検索結果のページも色々参照させてもらったんですけど、なにぶんCそのものについての知識がなさ過ぎて・・・。すみません。 >646 その記述を入れてもoff_tに関してのエラーは出なくなりました!ありがとうございます。 >647 ありがとうございます。皆さんに助けていただいてひとつ前に進めました。 まだエラーが出てるんで先は長そうでけど・・・。
理解しないで使うには危険な言語だと思うぞ。
>>649 「その記述を入れたら出なくなった」じゃなくて、
なんでエラーが解消できたのかを知っておかないと
これから先苦労するぞ。
652 :
デフォルトの名無しさん :2007/10/31(水) 18:09:26
Win32環境+VS2005で開発を行っています。 ダブルクリックでファイルを開く処理に対応させようと頑張っていた所 Debugビルドでは成功したのですが、Releaseビルドにするとファイルを開かなくなりました。 (でもショートカットに開きたいファイル名を指定するとReleaseビルドでもきちんと開く) そこで処理を追っていくと、どうもInitInstanceメソッドが呼び出されていないようなのですが、似たような経験をされた方はいらっしゃらないでしょうか?
スレ違い
654 :
652 :2007/10/31(水) 18:27:32
了解しました、他スレに流れてきます。
グリッド状に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
>>656 コンパイルして、./a.out 実験結果 とでもすればいいだろ。
>>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->なんか関数(); これしか方法はないんですか?
>>655 データ量にもよるが・・・
ファイルの読み書きと計算処理を分離し、
データはすべてメモリに読んでしまい、
計算処理はメモリ上にあるデータに対して行う。
いくつもの計算処理を済ませた後に、
メモリからファイルに書きだす。
子クラス kokurasu; 親クラス* oyakuasu = &kokurasu; oyakurasu->NFunction();
>>662 さん
レスありがとうございます。
小さいデータ量なら3次元配列に読み込んでしまえばいいのですが
量がメモリの容量を越えてしまうくらい大きいので…
2048×2048×2048の大規模なものや、それ以上を想定しています。。。
メモリに乗り切らない→1層ずつ処理→そのためには?
という考えからきています
ファイルを何度もスキャンするくらいなら、 物理メモリに乗らないような巨大なサイズでも、 仮想記憶を使ってメモリ上に読んでしまったほうがマシかもよ。
>仮想記憶を使ってメモリ上に読んでしまったほうがマシかもよ。 仮想記憶で扱うということはこれまでやったことが無くて。 どこかわかりやすく参考になるところありますか?
668 :
デフォルトの名無しさん :2007/11/01(木) 17:15:27
教えてください。 (Aが1)、かつ(Bが2)以外に処理を実行するっていう場合どう記述したらいいんですか? if((A==1)&&(B==2)){ } else{ 処理 } でいいのかなぁ?
ありがとうございます。 だいぶ難しそうな気配がしています。。。
if( (A!=1)&&(B!=1) ) 処理 でいんでない
671 :
よろず :2007/11/01(木) 17:21:39
if((A!=1)||(B!=2)) { 処理 }
よくねぇよ
>>668 ド・モルガンの法則でひっくり返せ。
A != 1 || B != 2
>>668 if( !(A==1 && B==2) ) {
処理
}
更新してなかtったorz
677 :
デフォルトの名無しさん :2007/11/01(木) 17:23:51
ありがとう || でやってみます
>>666 高々GiBオーダだろ。普通にmalloc()したらOSが勝手に確保してくれて、使うときに勝手にスワップアウトしてくれるよ。
OSがタコじゃなきゃ。
WindowsXPはタコですか?
>>677 果たして、>670で「(Aが1)、かつ(Bが2)以外」と読めるか?
if (!(A == 1 && b == 2)) {
処理
}
の方が読みやすいかも知れんぞ。
# ド・モルガンの定理を知らん香具師がメンテナンスするかもしれないんだし。
「(Aが1以外)且つ(Bが1以外)」と読める
どっちも同じようにしか見えない俺は眼が腐ってる
だね
「(Aが1以外)且つ(Bが1以外)」じゃないの?
685 :
デフォルトの名無しさん :2007/11/01(木) 17:52:10
if( !(A==1 && B==2) ) { 処理 } こういう記述もできるんですね みなさんありがとう 勉強になりました
>>680 読みやすさとかより
!(A == 1 && b == 2)) と (A!=1)&&(B!=1) は別物なんだが。
そりゃそーだ Bの値が違う
>>678 ためしにmallocで 1024 1024 1024 を確保して解放しただけで仮想メモリの警告が出ましたが
確保をしているような感じでした。
ただ、合計4GBくらいになるはずのものが2.5GBで解放されたのが気になりますが。。。
もう少し別のやり方調べてみます。。。
>>688 Windowsの32ビットアプリケーションは、
3GiBオプションを付けない限り、ユーザアドレス空間2GiBしかないよ。
その2GiBをプログラム本体や、WindowsのDLL、スタックを差し引いた残りが、
およそmallocほか動的メモリ確保で使用できる領域になる。
それ以上使いたければ、64ビット化するか、2GiB未満に小分けして処理する必要がある。
いずれにせよ、同じ仮想記憶を使うのでも、
単純にmallocでメモリを確保するよりは、メモリマップドファイルにしたほうがいいと思う。
うぜ
>>689 動的メモリになると2GBの壁がでるのですね…
それだと必然的に1024^3はムリになるので、目的のは出来ないかもしれません
ファイルにランダムアクセスできればいいのですが…
それかファイルをソートする方がはやいのかも
>>692 ランダムアクセスはできるよ
テープじゃないんでしょ
テープですよ ランダムアクセスはできるけど
>>692 流れをあんまり理解してないけど、
ファイルにランダムアクセスってfseekとかその手の話?
まさか数GBのファイルを全部メモリに読むつもりとか
そのファイルはテキスト?
層毎に読み込むのがいいよ
>>655 のことです
層ごとに読み込みたくて。
15GBくらいのデータを縦軸・横軸の層で読み込んで計算したくて伺っていました。
テキスト形式のデータで要素数にして数億個のデータです。
なんで一度に読み込みたいのかがわからん。 ある層の計算をするときは、他の層がどうなってるかは知らなくていいんじゃないの? 逐次的に計算できるなら、何億個、何兆個データがあっても関係ないでしょ?
層順にソートしておくとか
何層あるのか知らないけど、元ファイルを順次読み込み、層ごとのファイルに分ける。 slice001.txt, slice002.txt, ... みたいに。 で、それぞれのファイル毎に層毎の計算をする。 で、ダメ?
>>700 一度に読み込まないための方法を探してるんです。
>>701 それは考えました。
縦方向に層を作るのであればZだけでソートしたファイルを読み込み処理ですむのですが
横方向に層も必要で
最悪2つの15GBのデータを作らないといけなくなりそうです。
あー、2k*2k*2k程度を想定してるのか。 層ごとに分けてしまえば次元が一つ減るから、オンメモリでいけるでしょ。
めんどくせーから、64bitOSにしちゃえよ
めんどくせーから、諦めちゃえよ
めんどくせーからDBにしとけ
>>703 > 横方向に層も必要で
おいおい、必要な情報は一度に開示しとけよ。
>>708 はい、すみません。
縦方向の層/横方向の層 でスライス作って計算するのが一番速そうですね。
始めは15GBの3次元の塊から、層を2次元配列で確保していくつもりでしたが
レスありがとうございました
> (Aが1)、かつ(Bが2)以外に処理を実行するっていう場合どう記述したらいいんですか? どーみても、 if ( (A==1) && (B!=2)) { 処理 } だろ。 それとも日本語が不自由なのか?
668の例を見てそう言えるお前のほうが不自由
うは亀レス 日本語が不自由なんですね
もうその話題終わったよ
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
とエラーが出ました。
*pDataA でいいんではないの
717 :
デフォルトの名無しさん :2007/11/03(土) 01:51:06
ありがとうございます。 DataA_modify( *pDataA ); で通りますか?
718 :
デフォルトの名無しさん :2007/11/03(土) 02:35:35
ゲームに制限時間を付けたいんですが、どうすればいいのか わかりません。
>>714 > 実体のまだないData型のpDataAというクラスが
「クラス」???
基本的なことを理解していないっぽいな。
> ポインタで関数DataA_Setupにわたってきます。
実体がないのに、どうしてポインタが渡せるんだ?
そして案の定、
> int DataA_Setup(Data* pDataA)
> {
> pDataA = new Data();
なんていう変なことをしている。
引数の型はData*ではなくData**か、Data*&にしないと。
pDataAに何を代入したって、DataA_Setupの呼び出し側には伝わらないぞ。
> Data rDataA = &pDataA;
わかってなさすぎ。
>>718 あなたがどんなゲームをどのように作っているのか判らないので「こうしなさい」などとおこがましいことは言えません。
>>714 >>719 のとおりだなあ。
とりあえずC++ Primerと初心者本を買って理解することをお勧めする。
二次元配列で foo[たて][よこ] を走査したいのですが どんなループが一般的にやられてますか?
ふつう for(y = 0;y < たて;y++){ for(x=0;x < よこ:x++){ } }
二重ループ
>>723-724 ありがとうございます。
あとすいません、言葉足りなくて
foo[][]を
行だけ取り出して、計算→次の行へ。
列だけ取り出して、計算→次の列へ
ということです。
>>725 for(y = 0;y < 列;y++){
for(x=0;x < 行:x++){
}
}
for(y = 0;y < 行;y++){
for(x=0;x < 列:x++){
}
}
…そうだ。そうですね なんか変に考えすぎてました。 ありがとうございます
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; }
ごめんなさい 条件の方のflg=*にセミコロン忘れました
>>728 ネストが3ということだが、一番はじめに提示したソースはネストは1じゃないか?
普通かどうかしらんが、俺の感覚でネストが深くなるといわれると
if ( XXX ) {
if ( YYY ) {
if ( ZZZ ) {
}
}
}
ということだと思うんだが?
一応、回避策(?)も提示してみる。 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://以下略 }
else if{〜}はelse{if{〜}}のことなので、最初のソースのネストは5なんです 正直納得いかないんですが、コードチェッカがそう言って怒るので仕方ありません
>>731 結局条件を数値に直してswitchしかないんですかね
elseは必ず書くことになってるので正直あまり変わらない気がします。ごめんなさい
そのコードチェッカーは必ず、例外なく、何があっても、守らなければいけないもの? 可読性や汎用性やテスト容易性まで犠牲にしてまで守る利点はあるの? っていっても、守らなきゃならない状況ってのはあるんだろうけど・・・ 関数分割をなるたけして、厳しい部分はswitchに落とすしかないかな?
>>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( );
}
}
条件が複雑になれば厳しくなるけど・・・
bool notYet = true; if (notYet && condition1) {process1; notYet = false;} if (notYet && condition2) {process2; notYet = false;} if (notYet && condition3) {process3; notYet = false;} ...
737 :
1/2 :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 :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を使えば使い勝手が良くて読みやすいのが作れる?
>>734 必ず守らなければならないとしたときの利点:
お前のように、ごちゃごちゃ文句言う奴に対応する時間を取らなくて済む
>>739 必ず守らなければならないとしないときの利点:
お前のように、ごちゃごちゃ文句言う奴に対応する時間を取らなくて済む
741 :
738 :2007/11/14(水) 17:59:11
よく考えるまでもなく激しく車輪の再発明してる気になるなぁ(それ以前にC++) これと同じようなものが「boostにあるよ」とか「lokiにあるよ」とか「俺が作ったよ」とかあれば 是非情報をおながいします あとこういうのって、デザパタ用語で責任の連鎖パターンっていうんですか?
742 :
デフォルトの名無しさん :2007/11/14(水) 21:50:49
コンソール上で動かすプログラムを作っています。 画面消去の方法で『ESC [2J』と解説されてるサイトが多いのですが、 XPではエスケープ・シーケンスが使えないようなのです。 他に画面消去に使えるような命令はないでしょうか? コンソール画面上をスペースで塗り潰す以外の方法は無いのでしょうか。
プログラムを書くというのは、特殊化だと思う。 だから、汎用に書くのは間違い。 可読性を損なわないようにベタっと書くべき。
DRY原則は守ってね
APIじゃなくてもclsでよくね?
そこでPDCursesですよ 単にコンソールIOのシステムコールをCursesのインターフェースでラップしただけだけど そのまま使うよりは使いやすいような使いにくいような
血圧が高くて疲労感が取れません。
A.cpp CSample *Sample = 〜〜〜 B.cpp Sample->Loop(); という風にしたいんですが どうにかしてB.cppでSampleオブジェクトを使う方法はありませんか
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で十分気軽に使えるでしょ
配列の要素数をsizeof演算子で得ることができるということは理解できるのですが 配列のポインタから、そのポインタが指す配列の要素数を得ることはできるのでしょうか?
755 :
753 :2007/11/16(金) 02:27:16
ありがとうござました
WikibookのMore C++ Idiomsって更新されてるの? 10項目ぐらい聞いたことも無い名称が出ててとても気になるんだけど・・・
更新履歴みればいいじゃない
758 :
デフォルトの名無しさん :2007/11/17(土) 19:50:02
コンストラクタなんですが クラス名::クラス名() : クラス変数名(値){ // 以下コード } みたいな宣言をされているのですが、「:」以降の文法の意味が分からないのですが・・・。 クラス変数の型は、インクルードしている他のクラスです。
初期化してるだけ class A{ int a; A(); }; A::A(): a(1) { } の場合、Aのメンバ変数aは1で初期化される
760 :
デフォルトの名無しさん :2007/11/17(土) 20:02:35
なるほどです。 手持ちの本では載っていなかったので。 ありがとうございます。
その本が入門書であるなら窓から投げ捨てたほうがいい。
未だにこんなコード載せてる本がたまにあるから困る 間違いだからなこれ A::A(){ a=1; }
int a=1 ; ってのも間違いで、 int a(1) ; にしろってか?
764 :
デフォルトの名無しさん :2007/11/18(日) 07:40:24
どこが?
>>762 間違いってほどでもないな。効率が悪いってだけで。
効率の悪さよりも保守性のために、
あえて初期化リストを使わないという選択もあるよ。
多数のコンストラクタがある場合、
同じ初期化リストをコピペすることになる。
コンストラクタ内で代入するのであれば、
共通した代入をprivateなメンバ関数にできる。
>>765 それはクラス設計が悪い
同じように初期化するメンバで1つクラスにして、それを継承すべし
>>763 その2つは同値な表記
A::A():a(1){}とA::A(){a=1}は意味が違う
まあint型くらいなら大して変わらんけどさ
>>767 意味が違うのなら、どちらが正しいかなんて言えないよな
クラスだとコンストラクタとコピー代入演算子が違う意味を持っているから初期化子に馴れておいた方がいい。 さらにstatic/constが絡んでくると初期化子の方が合理的だと思えるようになるよ。
説明がド下手
C++での質問です EA001 80 EA002 60 EA003 100 EA004 0 EA005 50 みたいな感じに学籍番号と整数値が与えられているテキストファイルを読み込んで、 整数値をソートして行ごとに並べ替えるプログラムを作りたいのですが どのようにテキストファイルを読み込めばいいのか教えてください。
#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のイベントログをとってくるには どうしたらいいんですか?
>>776 Win32APIのReadEventLogを使う。
WMIあたりにもっと便利なのがあると思うが、
その質問の仕方を見ていると使いこなせるか疑問。
779 :
デフォルトの名無しさん :2007/11/18(日) 19:28:29
>>777-778 すみません。ありがとうございます。
おっしゃる通り、C言語すら知らないド素人です。
Win32APIとやら・・・Cの基礎を知ってないと駄目なほどのものを使わないと
できませんか・・・Windowsのイベントログだから考えてみればそうですよね・・
ありがとうございました。
Cの基礎を知らないでVisual C++でまともなプログラムを作るのはそもそも無理だろWin32APIがどうこういう前に
>>779 とやらって…。Win32APIは別にCの基礎じゃない。
>>781 日本語読めない人ですか?
779は Win32API = Cの基礎を知ってないと駄目なほどのもの って言ってるんであって
Win32API = Cの基礎 だなんて一言も言ってないだろ。
そんな必死にならなくてもいいのに
と言う事にしたいのですね:-)
いいえ、事実です。
1,2、たくさんとしか数えられないから、三行以上の書き込みが必死に見えるらしい。
>>782 Win32APIがCの基礎を知ってないと駄目なほどのもの?
笑わせてくれるぜ。
Win32APIがCの基礎を知ってないと駄目なほどのものって言ってるのは782じゃなくて779だろ。 782は781の読み違いを指摘してるだけ(煽ってるともいう)なのに、なんで782に絡むんだよw
そんなことよりみんなで乱交パーティしようぜ
そんなどうでもい話で盛り上がってんなよ
新しいネタもないし別にいいんじゃね? どうしても話題変えたかったらなんか質問でもしなよ
C++で、stringに入力した文字列をint型に変換する方法が分かりません。 atoi()を使うとエラーが出てしまいます。
793 :
デフォルトの名無しさん :2007/11/20(火) 15:19:08
string s="123456"; cout << atoi(s.c_str());
string s="123456"; int i; istringstream(s) >> i;
795 :
デフォルトの名無しさん :2007/11/20(火) 15:39:01
代入演算子で、整数変数に浮動小数点をかけ算するとき、ワーニング出ないようにするにはどうすればいいの。 int value=10; value *= 0.5;
整数演算に直す。 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の最大値までそれぞれ保証しているのか知りたいのです。
>>799 それぞれの仮数部のビット数を調べればいい。
結論から言えば、一般的にdoubleは53bit、floatは24bitとなる。
従って、一般的な4バイト整数と較べた場合、floatは精度が足りないと言うことになる。
>>800 なるほど、納得です!
ありがとうございました。
保障はされてなかった気がする
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で表現するにはどうしたらいいのでしょうか?
>>803 お前みたいなのを雇うなんて会社の程度が知れてるな
>>803 >といのがCのプログラムの中で出てきたのですが、これはどういう意味で、
>これをFORTRANで表現するにはどうしたらいいのでしょうか?
それを調べるのがあんたの仕事だ。
調べずとも明らかなことだけなら猫にでもやらせればすむことだからな。
すみません超初心者なんですが質問いいでしょうか 1、ネットで見つけたあるサンプルをVisual C++ 2005 Express Editionというソフトで開くと 「古いバージョンのソフトで作ってあるから新しいソフトに書き直す」 というような内容のメッセージがでたのでOK、開けました 2、ビルドして実行しようとすると ”ビルドエラーが発生しました。続行して、最後に成功したビルドを実行しますか?” というメッセージが出たのでOK 3、”プログラム’・・・.exe’を開始できません。指定したファイルが見つかりません。’ というメッセージが出てきて実行できません。 これってVisualC++2005だとこのソースはビルドできなくて結局使えないってことですか? ゲームを作ろうとしたのにいきなり詰まってて困ってます。
>>807 2.の時点で間違っている。
ビルドエラーが発生してるのに実行しようとしているため。
ちゃんとビルドできるようにして来い。
わかんなかったらソースとエラー書いてくれ。
もしくは、そのサンプルがあるURLを書いてくれ。
CUIでのゲームプログラムを作ろうと思ってるんですが、 保存したデータ内容の編集はCの標準ライブラリのみで出来るのでしょうか。 追記は出来ても一部分のみ書き換えや削除等の方法が分からなくて。
810 :
809 :2007/11/22(木) 02:04:00
説明不足でした。 ファイル処理の話です。
C以外でやった方が楽だし早いんじゃね?
>>809 ファイルの途中への挿入や削除は標準関数ではできない。
サイズが変わらないなら、方法はある。
>>811 仰るとおりですが、まだ授業でCの勉強しかしてなくて。
javaも独学で勉強してるもののいまいちピンと来ないんですよ…。
>>812 書き換えや削除するとサイズが変わってしまうのでは?
もし宜しければ参考のためにご教示願えますか。
テキスト操作したいならPerlとかPHPでいいんでない? CとかJavaよりよっぽど楽に扱えるし、新しく勉強するに してももそれほど時間かからないと思うよ
ファイルがそこまで大きくないなら起動時に一気にすべて読み込み、終了時に新規に出力しなおすとかじゃだめ?
//
>>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;
}
>>815 暇潰しにする程度なので、新たに勉強する気力がなくて…。
基本的に学校のPCでしてるので環境がないのもあるんですが。
>>816 その方法が一番確実そうですね。
内容はユーザ情報とスコアランキングくらいなので。
>>817 無知で申し訳ないんですが、%*sってどういう意味でしょうか。
*はワイルドカードって事ですか?
あと試しにコンパイル実行してみましたが特に変化が分からなかったです…。
>>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という名前の関数を呼び出している。
>>807 ダイアログに表示されたメッセージの内容を理解せずにYesやOkを押すような人は、
プログラムを書くのに向いてない。やめたほうがいい。
>>818 気力がなかったら、暇潰しで頭を使うようなことをせず、酒でも飲んで寝てたらどうよ。
> 無知で申し訳ないんですが、%*sってどういう意味でしょうか。
読み飛ばす・・・だったような。
こういうのは覚えておくものではなく、都度scanfのリファレンスで確認刷るものだよ。
>>818 知らないことは調べるだけの話。
それをする気がないのは「無知」ではなく「無気力」。
刻苦を厭う怠惰は人を虎に変えてしまうのだよ。
怠惰には、 無気力な怠惰 = メンドクサイから、何もやらない と、 前向きな怠惰 = メンドクサイことをしなくても良いように努力・工夫する がある。
本当に怠惰な人間ならこんな便所の落書きに長文書いていつ来るとも知れぬ無責任な名無しの回答を待つ前に さっさとグーグル先生でも聞いて済ますと思う
*は代入抑止文字ですか。 変数に格納されないって事ですね。 ご迷惑おかけしました。
826 :
807 :2007/11/22(木) 21:43:11
すみません。実行できました VBではよくプログラムをしてるんですがCの勝手がわからなくって。 まだよく分からないのですが、 SDKとかDXライブラリとかの設定をしてなかったから見たいです 出力に DxLib.exe': 'なんとかかんとか' を読み込みました。必要な DBG ファイルが見つからないか、開けません。 等など沢山でているのは大丈夫でしょうか?
>>826 「何が」大丈夫なのか否かを知りたいの?
>>827 すみません
プログラムが変な動作をしたりしないのか、とか
バグじゃないのか、とか
プログラムに問題があるというメッセージなのか、それとも
これらのメッセージが出ているのは普通で問題はないのか
そういう意味です
なんだかVBと全然違うんですね
>>828 > プログラムが変な動作をしたりしないのか
基本的には、しない
> バグじゃないのか
基本的には、バグではない
> プログラムに問題があるというメッセージなのか
基本的には、違う
> これらのメッセージが出ているのは普通で問題はないのか
基本的には、普通で問題ない
デバッグのための情報がないので、シンボルデバッグできないぞ、というメッセージ。
自分が作ったクラスを入れる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にしたらダメなのでしょうか?
>>830 int getx() const { return x;}
>>831 ありがとうございます。
const int getx()は試したんですけどねぇ。
この辺ややこしくなってるので勉強し直します。
>>829 本当に親切に答えてくださってどうもありがとうございます。
凄く助かったし安心しました。
これからもっと精進して頑張ってゲームを作ります。
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 となるんですが よかったでしょうかね? 確認のためですけど
良い。
charは少なくとも8ビットじゃなかったか? あーsizeofが1になることが定義されてるだけだっけか
RISCだと、longからcharまで全部32bitってのがあるんじゃね?
確かに規格上 char ≦ short ≦ int ≦ long だから全部同じサイズでも許されるな
>>838 char は1バイト、1バイトが何ビットかって? そんなこと、好きに決めて良いよ
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 です。
printf ("iが%dで、\n" "jが%dで、\n" "kが%dです。\n",i,j,k);
845 :
デフォルトの名無しさん :2007/11/23(金) 17:45:07
>>844 実行されました!
printfの""の中だと改行するには一度"で終わらせてあげないといけないんですね。
ありがとうございました。
>>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 ");
850 :
デフォルトの名無しさん :2007/11/23(金) 18:32:18
すいません。まじめに質問したつもりですが、何がいけなかったでしょうか?
851 :
デフォルトの名無しさん :2007/11/23(金) 19:05:38
>>846 分かりやすく教えていただき、ありがとうございました!
>>847 そうなっていたんですか!
疑問が解決してすっきりしました、ありがとうございます!!
C++ってCと比べてどれだけ遅いのですか?
午後のこーだの作者曰く話しにならんぐらいとのこと
そりゃ 午後は アセンブラァばりばり
ただし、一般的には機能を使おうとすればそれに応じてオーバーヘッドがかかるようになる。 Cと全く同じコードを書けば、Cと全く同じ速度にはなる。 まずはアセンブリ出力を見比べてみたり、実測することから始めようか。
>>853 昔は、コンパイラが生成するコードがC++の場合は遅く、
同じことをするにしてもCで書いたほうが速かったのだろう。
C++で書いたコードを、手作業でCに変換しても、
速度的には大して変化しないと思うよ。
すべてのクラスにvtableを持たせるようなことをしなければ、ね。
Cの範囲で書いていたら、C++としてコンパイルしても、生成されるコードは同じだよ。昔から。
一歩C++の領域に踏み入ると劇的に変わるけどね デストラクタ一つで激変
C++ は参照とかインライン関数とかテンプレートとか駆使したら、 C と同じ速度でより安全なプログラムが書けると思う。
std::sortは比較操作がインライン展開できるから、 qsortよりも速くなりやすいなんてのは有名だよね。
そうそう。 まあ、qsort をマクロ化すれば C でも速いの書けるんだろうけど。
C++は例外に備えないといけないので Cと同じコードを吐ける場面は少ない
864 :
デフォルトの名無しさん :2007/11/23(金) 22:37:14
テンプレートとか、STLとかどのくらい手間掛けているか不明なやつ使うと鈍くなる charやintを直接あやつる範囲ではアセンブラに匹敵する
アセンブリ言語っつっても、 速いコード書くノウハウ無かったら コンパイラの最適化の方が速かったりするもんな。
866 :
デフォルトの名無しさん :2007/11/23(金) 22:59:52
とりあえず初心者が動かせる3Dライブラリを開発しますか
>>859 それは、
不必要にデストラクタをvirtualにする
という愚をやらかしているだけだろ。
>>863 それはどこの何というコンパイラ?
例外をthrowする、throwされたものをcatchする、それにはコストは要するが、
例外中立なコードにはオーバーヘッドかからないと思うが。
catchしなくても例外が通り抜けるときにデストラクタを呼ばないといけない さっきg++で試してみた virtualかどうかは関係ない
デストラクタから virtual を外すのは どうしても必要な時だけにするのが無難だべ。
逆だろ? 仮想関数を使う必要がある時だけ付けるよな。
馬鹿が飛びつくつまらない話が出てきちゃった
あとから仮想関数が必要になった時に付け忘れても知らんべ。
JavaやC#みたいに継承禁止ができたら、安心してvirtualをはずせるけど。
使われ方によって、virtualをつける必要があったりなかったりするC++は糞言語。
final/sealed 欲しいよなあ。 Final ですってコメントつけて非仮想デストラクタにすることはあるけど、 コメントだけじゃ心もとないよな。
クラス設計時点で継承の有無はわかるだろ。 あとから必要になったら、その時点で必要な修正を行えばいいと思うが。
C++しか知らないと、そういう物の考え方するんだ
うん
そういう意味で言うと、後から必要になったときでも修正の必要がないように、 デストラクタは必ずvirtualで、っていうのも、あながち間違った選択ではないと思える。
一体誰がどう使うクラスの設計してるんだ?
とりあえず virtual を付けとけば、 どういう変更が必要になろうが何の心配も要らない。 virtual を付けてないと、後の変更でバグを発生させる可能性がある。 その変更を行うのが自分とは限らないわけで、 どっかのバカが変な事をするかもしれない。 そう考えると、デストラクタを非仮想にするのは、 よほど非仮想にするメリットがある場合じゃないと怖くてできない。
C++って、そういう本質的でないところにも気を使わせるのが、糞言語たる所以だね。
速度やデータサイズは本質的な問題だよ。
じゃ、Javaなんてとてもじゃないが使えないってわけだ。
そこが本質的な問題になることがあるから。
速度やデータサイズを気にする必要があれば Java なんてとてもじゃないが使えないってわけだよ。 気にする必要がないなら使えばいい。
道具は選んで使うべきだ
Cで書けばいいのに(^^
>>868 > catchしなくても例外が通り抜けるときにデストラクタを呼ばないといけない
当たり前だろ。
正常にreturnする時にもデストラクタは呼ばれるのだから、
それは、例外のオーバーヘッドとは言わないだろう。
>>869 それなら、virtual なんて書かずとも全てがvirtual で、
nonvirtual などと書いたものだけがvirtual でなくなる、
そういう言語仕様になるだろうに。
>>872 それをもってして、C++は実行時オーバーヘッドが大きな言語だと言われてもなぁ。
>>873 継承できないようにするハックはあるけど、まぁ、オススメしないわな。
もっと別の方法で、管理すべきだろうな。
>>874 使い方によって、だろ。
キャストしたポインタでdeleteするような使い方をする側が、
デストラクタがvirtualであることを確認し、そうでなければ、
継承するのではなくメンバに持つように実装すべきなんだ。
>>891 > それをもってして、C++は実行時オーバーヘッドが大きな言語だと言われてもなぁ。
別にそんなこと言っとらんわ。
>>891 > 継承できないようにするハックはあるけど、まぁ、オススメしないわな。
何か特殊なクラスを継承して、結局仮想関数が必要だったような気がする。
C++が糞言語であることには、誰も異論はないだろう。 使っている道具を糞だと言っているだけで、 それを使う人間が糞だと言っているわけでもないのに。 C++が糞言語だと言われて顔を真っ赤にするのは、 Stroustrupだけで、いいんじゃないか。
>>889 下記の f と h のコンパイル結果を比べてみるといい
struct S { ~S(); };
int g();
int f()
{
S s;
g();
return 0;
}
int h()
{
S s;
return 0;
}
そういう言語仕様になるだろうにとか言われても、 今実際にそうなってないんだから、そういう事言っても無駄だよな・・・。
>>898 そういう言語仕様になっていない
ということは、
というのが言語仕様を決めた人達は、
基本的にvirtual で例外的にvirtualではなくする
というポリシーではなかった、ということだね。
互換性のために、そういうポリシーだという可能性もあるが。
>>900 デストラクタはデフォで virtual な方がいいけど、
他の関数は virtual がデフォである場合も nonvirtual がデフォである場合も
一長一短なので何とも言えない。
仮想関数が1つでもあれば自動的にデストラクタもデフォで仮想関数になってくれればいいのにね。
>>904 virtualなメンバ関数があるからといって、virtualなデストラクタが必要とは限らないしなぁ。
結局、どのようにdeleteするのかは、そのクラスを使う人が決めることだから。
使う人が決めることなのに、作る人が決めないといけないのは変だがね・・・。
>>897 何が言いたいのか理解した。
~S()の呼び出しコードがhでは1個なのに対して、fでは2個になるってことか。
たしかにコードサイズは肥大するが、正常系のルートの実行速度には影響しないだろう。
ちなみに、
struct S { ~S(); };
というのは、
struct S { ~S() throw() ; };
とすべきだろうな。
デストラクタで例外をthrowしちゃいかんよ。
実行速度のために例外を(部分的に)使わないという選択もC++では可能だぞ。
int g() ;
を
int g() throw() ;
とすれば、f()やh()内では例外のためのコードが生成されない。
結局、C++は遅い と言っている人は、 Cと同じことをするコードをC++で書いて遅いと言っているのではなく、 Cよりも複雑なことをするコードをC++で書いて遅いと言っているわけだ。
>>907 少なくとも自分はそう言ってる
で、Cよりも複雑なことをしないのは難しい
まあ、Cとしてコンパイルできるコードを書けばいいだけだけど
909 :
デフォルトの名無しさん :2007/11/24(土) 01:42:10
stlとか複雑な機能を簡単にするやつを使うとCで書いた方が速い たとえばstringなどは確保したときにサイズは確保されない もし文字列の最大長が分かっていればchar[]で取っておいた方が速い
> int g() throw() ; > とすれば、f()やh()内では例外のためのコードが生成されない。 そうするとg()側でコストが掛かる g 内のコードが例外を投げないことが明確なときはコストはないけど 例外指定を書けないCのライブラリを呼んでたりするとお手上げ 例外関連のコストを避けるのは難しいね、ということでした
>>909 そもそもクラスである意義を忘れないで下さい。
912 :
デフォルトの名無しさん :2007/11/24(土) 01:46:51
実際はアセンブラもCもC++もたいして変わらないが、まれにCよりアセンブラのほうが速く、まれにC++よりCのほうが速い まれが重なると細かい手入れが出来るアセンブラが良くなる
>>908 そうか・・・
>>909 STLの使い方が悪いと、そうなるね。
そのstringの例だと、
固定長の文字列のクラスを作ったらどうよ。
>>910 え? Cのライブラリは自動的に throw() として扱われるっしょ。
CのライブラリがC++の例外をthrowすることなんて、できないんだから。
> え? 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です
http://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 ***
>>914 具体例は?
>>915 STLが遅いと言ってる人は、
実装が悪いSTLを使っているか、
コピーにコストがかかるオブジェクトを直にコンテナに格納するとかの使い方が悪いんじゃないか。
ヘッダファイルに int g(); と書かれててコンパイラにわかる?
>>918 C++から、C++を考慮していないCのヘッダファイルを使う場合、
extern "C" {
#include "hoge.h"
}
とするのが普通だろ。
"C"なら、C++の例外をthrowしないということがわかる。
>>918 で、コンパイラ付属のC標準ライブラリをC++から使った場合に、
例外をthrowするものとして扱われてしまう、そういう具体例は?
具体例を挙げてもらったところで、
そんなダサいコンパイラを使うのはやめろ
なのだが・・・。
じゃあ、C++のヘッダファイルでCのヘッダをナイーブにインクルードしちゃってた場合は? いいだしたらきりがないけど
ああそうか インクルードパスの調整とかで回避できるか
>>921 そのC++のヘッダファイルの責任だよ、Cのヘッダファイルをextern "C"の中でincludeするのは。
間違った使い方をしたときの話をしても、しかたあるまい?
いや、そういうことも含めてコストの話をしていたつもり ほとんどのプログラムは完璧じゃないから 論点がずれてたね
926 :
デフォルトの名無しさん :2007/11/24(土) 03:27:21
>>917 いやいや。例えば、あるバッファがプログラムの中で必要だったとしよう。
myvec.assign(nlen, '\0');
func(&myvec[0], myvec.size());
というように、C++だとかけるし、スコープ外にでれば、myvecで確保した
メモリが自動解放されるので、メモリリークの心配も少ない。Cだときちんと開放
しないとメモリリークを起こす。んで、これはC++の大きな利点。
クラスを自分で実装しても、ちゃんとメモリリークしにくい実装という
のはできるけど、標準ライブラリで多くの機能が実装されているという
のがC++の利点だといっているわけで。
ただし、こういう利点を享受するためには、メモリの動的確保・開放
を受け入れなければならないって話ナ。
>>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
ちなみに、メモリ制約の大きいところでは、そもそもメモリの 動的確保・開放は使えないからな。最終的に作り上げたアプリが 最大でいくつのメモリを必要とするかを提示できないといけないから。
>>929 ああ、その別世界の住人ではないからな。
たまたま機会があって、ちらっとソースを見て話を聞いて、
その彼らのコーディングルールにぶったまげただけだもの。
932 :
デフォルトの名無しさん :2007/11/24(土) 04:27:39
まぁ927は、コンピュータの基礎から勉強しなおすのを薦める。
>>932 話が繋がりませんが? どういうことよ。
マイコン = マイクロ・コントローラな人達の世界の常識なんて、いらないよ。
日本の時代錯誤的な作り方をしている携帯電話屋か。 過労で頭がどうにかしてしまったかい?
935 :
デフォルトの名無しさん :2007/11/24(土) 04:42:07
>>933 ,
>>934 時代錯誤だと思い込んでるのは、幼稚な日本の技術者だけだよ。
自分の頭で普通に考えればわかることだ。
課題「なぜ、低級言語がなくなることは考えにくいか、1000文字以内で論じなさい」
プッ
自分で理路整然と説明できないので、 学生たちにレポート書かせて、その中から優秀なのを見つけて自分のものにする そんな人間だな。 携帯電話のアプリケーション用プロセッサの性能とメモリ容量は、 すでにSun4あたりの昔のUNIXワークステーション並で、 リブートせずに連続動作する時間は同じくらいなのに、ソフトの作りがまるで違う。 その理由は様々考えられるだろうけど、1つ言えるのは、 設計者が過去の別次元のやり方をそのまま使っているか否かだと思うよ。
お前ら、スレタイも読めない馬鹿には、発言権なし!
940 :
デフォルトの名無しさん :2007/11/24(土) 05:05:39
>>938 君の発想では、もっとも低レベルのCPU、メモリを使用している
ものは携帯電話までだというようだけど、それって今後も
ホントウにそうなのか?
こういうタイプの人間は決まって自分から答えを言おうとしないんだよな。
>>941 言おうとしないのは、言えないからだよ。
944 :
デフォルトの名無しさん :2007/11/24(土) 05:47:33
>>944 煽るだけかよ。
スレタイを見て適切な行動を取れ。
でなければ、お前が思考停止の老害だ。
>>916 なんか指定のコンパイラが古いね。
エラーメッセージも危険な香りがする。
あきらめて同等の他のものを探した方が早い気がするんだけど、だめかなぁ?
947 :
デフォルトの名無しさん :2007/11/24(土) 09:01:17
ループの中で行う処理の中に標準出力を入れたとき、 コンパイルして実行したらループの中の標準出力がでてこないときがあるのですが どうすれば解決できるのですか?
>>947 ループと標準出力を結びつけないで考えるようにすればいいんじゃないかな?
>>947 現象を再現できる最小のコードを書いてうpしてみそ。
組込み屋だが・・
>>927 が例に出してるような環境は組込みでも珍しいと思う。
10年以上やってるが、そんなコードは見たこともない。
スタックは昔から使えるから、auto変数ぐらいは使えるはずだが。
ただ、
>変数がすべてグローバルでstaticな上に、変数名がメモリの番地で、
>しかも、同じ変数を時と場合によって違う用途に使いまわしていたり。
↑これはレジスタのような気がしなくも無い。
今ではmalloc/freeくらいは実装する場合が多いと思うよ。
動的確保でも、大体のメモリ見積はできるしね。
けどSTLとなると大概はオーバースペックだと思うな。
>>938 >設計者が過去の別次元のやり方をそのまま使っているか否かだと思うよ。
↑これは別に否定しないが、仮想記憶が無いことがほとんど、というのがでかいと思うよ。
ちょっと前までやってた仕事では、メモリ1GBあっても「足りない」と言ってたし。
>>947 何らかの理由でループの中に入らないことがある、と言う事だろう。
そのあたりが多分バグ。
952 :
デフォルトの名無しさん :2007/11/24(土) 09:40:44
>>949 再現というか、一通りforループの中の計算の処理をしおわって、ループを抜けた後に
ループの中に書いた標準出力がワーッと出てくるような感じなんですよね
シェルスクリプトみたいに逐一でるようにはならないのかなあと考えているのですが
どうすればよいのかわかりませんです
>>952 ループの中にfflush(stdout);とか入れてみるとか。
>>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に出来るかもしれない
>>947 可能性1 標準出力がバッファリングされている
可能性2 ループがCPUを使いっぱなしのため、標準出力を画面等に表示するスレッドにCPUが廻らない
具体的な話を出さない質問だと、これくらいか。
959 :
956 :2007/11/24(土) 10:02:20
>>956 VC++ 2005 Express Edition でも使え
>>957 そのゲームがやりたいだけだろw
>>956 多分、コンパイルができるようにならないと無理だと思う。
cpp は C++ のソースファイルだと思うから、 C++ の勉強を一からしてみよう。
>>959 おいおい、そのソースはこうやって公開していいものなのか?
963 :
956 :2007/11/24(土) 10:14:33
>>960 VC++ 2005 Express Edition が該当コンパイルソフト?なのでしょうか?
>>961 それがベストなのはもちろん理解しているのですが、今回とりあえずはこれさえexeに出来れば良いMPのでして・・・
>>962 作者の方が勝手にいじってくれて結構と公言しておりますので問題有りません
作者による更新が止まってしまったので、ソースを頂いて書き直したのですが、コンパイル出来ない状態です 笑
>>954 パレートの法則があるわけで、速度が求められる部分は限られていて、
大半の部分は速く動く必要がないので、C++が多少遅くても問題ないよね。
速度が求められる部分だけ、速度に気を遣って書けばいいし、
なんなら、そこだけCで書いてもいいしさ。
それに、C++が遅いといってもO(1)の話だから、どうでも良かったりする。
ようわからんが、オンラインゲームチーティング用コード?
まあ O(1) もループ内に入れば O(N) やら O(N^2) やらになるんだけどね。
>>959 おい、そいつはUltimaOnlineのチートツールか?
プログラムを書くのではなく、使うのが目的の人は、板違い。
升ツールにやれるアドバイスはないな。
>>966 そういう場合、多重にループさせるアルゴリズムのほうに問題があって、そっちを改良すべきでしょう。
972 :
956 :2007/11/24(土) 10:30:34
>>967 >>965 そうです
あれ、板違いですか
失礼致しました・・・
>>968 そう言わずに何とかお願い致します。
>>970 おっと
有り難うございます!
とても難しそうですが頑張ってみます!
なんでNODEFAULTLIB設定してるんだろ あと古いプロジェクトファイルをVC2005でコンパイルするとたまにGSオプション無効にしないとリンカエラーになるのもよくわかんね
>>972 大麻の栽培方法を公衆の面前で人に聞いて回るような、そういう行為をしているっていう自覚ないんか?
ないからやっているんだろ
>>974 違法じゃないと思うからちょっと大げさなんじゃないかな。
金払ってやるゲームでのずるの仕方を聞いてるわけだ。
それ以上でもないし、それ以下でもない。
UOはチート自由なのか? それでよくゲーム運営が成立しているな。
>>977 認識が甘い。
チートは、
不正アクセス防止法
電子計算機損壊等業務妨害罪
この2つに抵触する可能性がある。
チートというよりbotのようだけど
違法か否かというのは刑事の話。 刑事とは別に民事で訴えられる可能性もある。 もしも、他の大勢のプレーヤのゲームバランスを著しく損うようなチートをして、 それが原因でゲーム会社の売上が見込みよりも大幅に減った場合、 その損害の賠償を求められる可能性もある。 一人のプレーヤがチートしたところで高が知れているので現実的には可能性は低いがね。
まぁ何にしても、 後ろめたいことをやるなら、自力でやれ、他人に手伝わせるな ってことだ。
>動かないゲームの補助ソフトのソースをいただき、 HWND window = FindWindow ("Ultima Online", NULL); 確かに補助ソフトになるのかな? 笑ろた、 DLLへの参照が未解決になってるっぽいけど、 もしかして新手の釣りかも 調子こいてexe実行したらキンタマが感染なんて怖いお
984 :
デフォルトの名無しさん :2007/11/25(日) 13:18:23
RubyからDirectXは扱えないと一度レスもらったのですが、 ということはRubyからCOMにアクセスできないということなのでしょうか?
スレタイ嫁
スレ違いでしたね すいませんでした。 というより そろそろレス数も少ないので 証拠隠滅で埋めますか?ウヒ
埋める前に次スレたててこい
988 :
デフォルトの名無しさん :2007/11/26(月) 12:33:18
質問します LPDWORD型をint型に変換する方法教えていただけませんか?
(int)lpdw
>>989 ありがとうございます。それって、こういうことですよね?
LPDWORD lpdw;
int i = (int) lpdw;
エラーになるようですが。
foo.c:4: error: aggregate value used where an integer was expected
そもそも、LPDWORD型は何なのか勉強しなおした方がいいとおもうよ
>>991 typedef struct {
int foo;
int bar;
} LPDWORD;
こうですか? わかりません。
LPDWORDは、long pointer DWORDじゃね?
Microsoftの俺仕様
996 :
やばす :2007/11/26(月) 17:36:52
rubyで最大値を出すコマンド教えてください><
何の最大値?
998 :
やばす :2007/11/26(月) 17:39:19
えーと 例えばクラスのテストの点数の最高点をだす とかです
umeeeeeeeeeeeeeeeeeeeeeeeeeee
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。