【初心者歓迎】C/C++室 Ver.37【環境依存OK】
2 :
1 :2007/05/06(日) 15:30:35
埋めるなら次スレ建てろよなまったく
埋めるならじゃなくて、こういう板では埋めは荒らしってスタンスじゃないと(ry
埋めたの1000だけじゃん
5 :
デフォルトの名無しさん :2007/05/06(日) 22:22:07
初めまして、C++の内部クラスについて質問があります。 例えば、OUTというクラスの中にINNERというクラスがありまして、 そのINNERクラスのメンバ関数から、OUTクラスのメンバ変数にアクセスしたいのですが、 どうすればいいのか分かりません。クラスの宣言の仕方がポイントのような気がするのですが、 メンバ関数の実装は宣言の外で個別に行いたいと思います。 どうか、ご指導、助言等よろしくお願いします。
Javaとは違うのだよJavaとは
>>5 #include <iostream>
using namespace std;
class Outer {
friend class Inner;
class Inner {
Outer& outer;
public:
Inner(Outer* theOuter) : outer(*theOuter) { }
void hoge() { cout << outer.foo << endl; }
};
private:
int foo;
public:
Outer() : foo(3) { }
void hoge() { Inner inner(this); inner.hoge(); }
};
int main() {
Outer outer;
outer.hoge();
}
8 :
デフォルトの名無しさん :2007/05/06(日) 23:14:14
>>6 レスありがとうございます。
確かに検索してもJAVAの情報ばかりでした。
C++ではあまりしないのでしょうか。
>>7 プログラムまで書いて頂きありがとうございます!
まだ全ては理解できていないですが、
Outerクラスのインスタンスを作った時点では、
まだInnerクラスのインスタンスは出来てないんですね。
だから、thisポインタを渡して、インスタンスを作っていると、
そこまでは分かりました。
この方法で私のしたいことが出来そうです。
本当にありがとうございました。
いやだから Javaでは親子関係がある(から外側のメンバにアクセスできる)けど C++ではただのnamespaceみたいなもんだから。 内部クラス単独のインスタンスも作れる。
10 :
デフォルトの名無しさん :2007/05/06(日) 23:40:27
質問です int hoge(char inputStr) { return inputStr == '\t' || inputStr == ' '; } 入力された引数inputStr を数値で返すというのは分かるんですが、 returnの行の動作は if(inputStr == '\t'){ return 1; } else if(inputStr == ' '){ return 0; } と同じ意味ですか?
いや、キミの書き方にあわせるとこうなる if(inputStr == '\t'){ return 1; } else if(inputStr == ' '){ return 1; } else { return 0; }
12 :
デフォルトの名無しさん :2007/05/06(日) 23:56:29
>>10 int hoge(char inputStr)
{
if (inputStr == '\t') {
return 1;
}
if (inputStr == ' ') {
return 1;
}
return 0;
}
まだ見てないけど、プロファイラとってみては
って実行時間じゃないのか
>>14 > /* 理論上の微分方程式の一般解 */
> double differentiation_function(double t){return ( theta_i*cos(sqrt(g/r)*t*RADIAN) );}
DEG → RAD 化係数の場所が違うんでない?
return (theta_i *RADIAN) * cos(sqrt(g/r)*t);
18 :
14 :2007/05/09(水) 00:31:24
そもそも三角関数の使い方って、こんな感じでよかったものか・・・
size_t と uintptr_t って、違いが出る環境あるのか?
例えばDOSのlargeモデルは ポインタ32bitでsize_tは16bit。 まあ当時uintptr_tなんて名前は無かったが。
>>19 違う環境は見たことないけど、
Intel 8086 あたりは違うかもしれない。
なるほど。
ファイルサイズってなぜかsize_tではないんだよな。
long > size_t の環境もまさに16ビット環境だな。
size_tを64bitの型にしなきゃいけないからね。
fgetpos/fsetpos の方か。
27 :
デフォルトの名無しさん :2007/05/09(水) 19:10:40
Linux or OS X + GCCです。 foo.cとfoo.hがあって、 foo.hの中でvoid foo()を宣言、 foo.cの中でvoid foo()を定義してるとします。 で、bar.hとbar.cxxがあって、 class barのメンバ関数の内部でfoo()を呼んでいます。 で、これを1つにまとめてライブラリlibfoobar.aにしたいんですが、 1) ccでfoo.cをコンパイル 2) g++でbar.cxxをコンパイル 3) arでlibfoobar.aに合体 という手順を踏みました。 ところが、libfoobar.aを利用したプログラムを書くと、 libfoobar.aとリンクさせたときに undefined reference to foo() などと怒られてしまいます。 CとC++を混在させてライブラリ作る時って、 何か違う手順を踏まないといけないんでしょうか?
extern "C" はしてるの? あとは、cc って gcc ?
29 :
27 :2007/05/09(水) 19:21:50
extern "C"が必要なのか。 foo.cのほうは他所から持ってきたパッケージだったので、 中をいじっておりませんでした。 extern "C"をしてきます。 さんくす。
foo.c の方じゃなくて、foo.h の方に必要。
コンパイラが違えば、 オブジェクトファイル内で識別子名に _ が付くか付かないか、 付くならどこに付くか、 とかいうややこしい問題があるんだけど、 それは大丈夫なのかね?
32 :
27 :2007/05/09(水) 19:33:48
ccはGCCです。 foo.hはいじりたくないので、 extern "C" { #include "foo.h" } とbar.hの頭に書いたんですが、 これで問題ないでしょうか。 コンパイルは通るようになったのですが、 普通はfoo.hの中でexternすると思うので、 後になにか弊害を起こすとかありますか?
>>32 なら、
// foo.hpp
#ifndef FOO_HPP_
#define FOO_HPP_
#ifdef __cplusplus
extern "C" {
#endif
#include "foo.h"
#ifdef __cplusplus
}
#endif
#endif // #ifndef FOO_HPP_
ってのを作って、C++ からは foo.hpp をインクルードするといいよ。
別に弊害はないかと。
34 :
デフォルトの名無しさん :2007/05/09(水) 19:53:46
35 :
27 :2007/05/09(水) 20:03:18
>>33 ありがとうございます。
CとC++の部分は解決したのですが、
その他所から持ってきたfoo.c/foo.hがですね、
hoge.fも使ってるんです。
hoge.fの中にSUBROUTINE hoge()があって、
今度はリンクするときにhogeがundefinedだと怒られました。
hoge.fはg77でコンパイルしています。
何か、.fも混在させる時の方法があるんでしょうか。
ググっても、1回ライブラリにしてから、というのが見つからない。
何度もすみません。
F77 もあるのかw
すげーチャンポンだな。
それはまさに
>>31 の問題があるはず。
nm コマンドを使うとオブジェクトファイル内のシンボル名一覧が表示されるけど、
gcc の出すシンボル名と g77 の出すシンボル名に違いがあるんじゃないかと思う。
gcc はシンボル名の先頭にアンダースコアを付けるけど、
g77 はまた別の形になってるんじゃないかと。
それが両方で同じになるようにアンダースコアを付けて調整すればうまくいくと思う。
あとは、そのライブラリを使う際に、
F77, C, C++ の標準ライブラリが全てリンクされる状態にしないといけない点にも注意。
37 :
27 :2007/05/09(水) 21:01:49
>>36 なるほど。
確かにnmすると、アンダースコアがついてました。
そこを直して動きました。
ありがとうございます。
STLのmapのeraseなんだけど size_type erase(const key_type& x) ってことは、xはキーを指定するんだよね?
39 :
デフォルトの名無しさん :2007/05/09(水) 23:39:49
class Base{ virtual void Complete(); protected: int m_nStatus; }; class A : public Base{ void Complete(){ /* A固有の処理(m_nStatusを更新) */ }; }; class B : public Base{ void Complete(){ /* B固有の処理(m_nStatusを更新) */ }; }; ↑こんなクラス構成があって、↓に格納されています。 std::vector<Base*> BaseList; 仕様変更で、新規クラスが追加されました。 これが曲者でして、Updateを呼び出すと、自分自身をベクタから削除すると いう変な仕様でして…。 class C : public Base{ void Complete(){ /* C固有の処理(自分を削除) */ }; }; これを実装するとしたら、どんな方法があるでしょうか? ヒントでもいいので、教えていただけないでしょうか?
Updateってやつの記述がないけど、Completeでいいのかな。 問題は自分を管理しているvectorをどうやって知るか、 どのタイミングで知るべきかってことだよね。 CのインスタンスよりもBaseListの寿命が長いことが確実なら、 std::vector<Base *> *m_pBaseList; をCに追加してコンストラクタで渡すのが手っ取り早いと思うけど。
>>38 それくらい、ヘルプや規格書読んだりググったりして自分で確認しようよ
42 :
デフォルトの名無しさん :2007/05/10(木) 01:00:19
環境:Linux gcc X上CUIで、マッピングが施される前のキーコード(物理的キーコード)をキーが押下された際に取得したいです。 スキャンコードまで低レベルでなくてよく、xmodmap -pk や xev で調べられる KeyCode に相当するものが丁度いいのですが、 showkey のソースを参考にした方法では /dev/console を Xサーバが握ってしまっていて不可能、 xev のソースの方法ではXウィンドウを生成せねばならず、CUI上で実装する方法が見つかりません…。 ncurses の keybound なども試してみましたがこちらはマッピング後のキー情報しか得られませんでした。 最悪 xmodmap した結果をパースして利用するなりでなんとかなるとは思うのですが、 何か都合の良い方法があるのではないかと諦めきれず質問させて頂きました。 識者の方がいらっしゃいましたらご教授くださいませ。
43 :
39 :2007/05/10(木) 01:43:10
>>40 レスありがとうございます。
参考にさせていただきます。
44 :
デフォルトの名無しさん :2007/05/10(木) 11:03:54
std::stringのリテラルを埋め込むにはどうすりゃいいのですか
リテラルの意味が分かってるんだろうか
>>42 その種の質問はUnixプログラミング質問スレかUnix/Linux板のほうが
回答を得られやすいと思われ
47 :
デフォルトの名無しさん :2007/05/10(木) 22:01:06
環境:タブ幅4, XP, bcc5.5.1, Cpad
猫でもわかるプログラミング / C言語編 第1部 /
第69章
ttp://www.kumei.ne.jp/c_lang/intro/no_69.htm 第70章
ttp://www.kumei.ne.jp/c_lang/intro/no_70.htm 第70章について、#include <stdlib.h>,<ctype.h>,<string.h>
が抜けているのはすぐに解かるのですが、
第69章から第70章になり、変数宣言などが書き換えられてから
実行結果で"A1"が入力できずに以下のように判定されてしまいます。
if (check_location(row, col) != 0) {
Locate(hOut, 0, MASU + 3);
printf("そこには置けません!");
goto INP;
}
また、後手を選択すると"A2"も入力できず同様に判定されます、このときコンピュータは"A2"に置けます。
48 :
デフォルトの名無しさん :2007/05/10(木) 22:01:48
惜しい、猫の話じゃなければ相談に乗るんだが。
>>48 printf("そこには置けません! %d,%d, %d", row, col, ban[row][col] );
こうすると、A1の時にはban[0][0]になんか値が入ってるぞ。
値が入ってたら、check_locationが!0を返すのは仕方ない事だな。
で、main()の宣言直後に初期化してみたが、
// init
for ( row=0; row<MASU; ++row )
for ( col=0; col<MASU; ++col )
ban[row][col] = 0;
それでも現象が変わらんね。
調べるのが面倒になったから、check_locationを改変してお茶を濁す。
int check_location(int row, int col) {
if (ban[row][col]!=1 && ban[row][col]!=2)
return 0;
else
return -1;
}
これでA1に置けるようになったぞ。
でもなんか石を取るロジックとかバグ多くないか?w
class A { public: virtual A& a() { return *this; } }; class B : public A {}; int main() { B b = A().a(); } とするとAをBに変換できないって怒られるけど、いちいちBでもa()をオーバーライドしないとダメ? 理屈は分かるんだけど、継承してるんだから勝手に変換してくれりゃいいのに・・・ ↑みたいなことやるのに何か良い方法ないですか?
>>52 > B b = A().a();
では B(const A&) というコンストラクタが呼ばれる事になる。
だから、それを作る必要がある。
>>53 サンクス。派生するたびにいちいち面倒な・・・
Bから呼ばれたa()のthisはBのポインタなんだからBに代入できても良いと思うんだけどなぁ。
なんで勝手に virtual B& a() を定義してくれないんだろう。
情報が足りないんだから当たり前じゃ。
>>54 Bから呼ばれたってどういうこと?
>>52 では A() に対して a() を呼び出してるんだろ。
B& なんて返せるわけ無い。
virtual B& a() が勝手に定義されるなど、なんて恐ろしい((((;゚Д゚)))ガクガクブルブル
sizeof(A) != sizeof(B) だったらどうなると思う?
59 :
42 :2007/05/11(金) 23:25:57
アドバイス・誘導をして頂いた方、ありがとうございます。 微妙なスレ違いで申し訳ありませんでした。
60 :
デフォルトの名無しさん :2007/05/12(土) 00:10:17
printf("%s/n","Hello World"); 上のprintf文の%sでどのように"Hello World"を処理しているのか分かりません。 どなたかご教授して下さい。
XのCUIってどういうこと?xterm上で起動してたりしたら、 それを検出してX->xtermの入力を掻っ払うってはなし? ktermとかmltermとかだったり、間にscreenがはさまってたり、 したらどうするわけ?
爪楊枝でとる
63 :
デフォルトの名無しさん :2007/05/12(土) 00:34:05
すいません,c++勉強始めたばかりの超初心者です. とあるc++のソースをc#に書き換えるという作業をしているのですが,下記記述の意味がわかりませんでした. MyClass* mc; mc = (Myclass*) aList -> at(n); aListは List* aListで宣言してあります. なぜリスト型のポインタの前で,再度クラスのポインタを()の中に記述するのでしょうか? どうぞよろしくお願いいたします.
優先順位。 mc = (Myclass*) ( aList -> at(n) );
>>63 それはキャスト演算。
aListは、T型のオブジェクトを要素としてやりとりするようになっているのだと思う。
(Tが何なのか俺にはわからないので、これは仮称)
そしてaList->atの戻り値の型はT*。
MyClassはTから派生しており、MyClassへのポインタへダウンキャストしているのだろう。
C#はわかるというなら、aListの型がSystem.Collections.ArrayList、
T*はobject、atをインデクサだと思えば事情は大体同じ。
66 :
63 :2007/05/12(土) 01:02:07
>>64 >>65 ありがとうございました.
キャストだったんですね...ポインタにキャストできるって初めて知りました.
また考えてみます.
>>60 const char* str = "Hello World";
printf("%s/n", str);
こう書けばわかるか?
68 :
デフォルトの名無しさん :2007/05/12(土) 01:53:38
>>67 strのポインタが指す'H'のアドレスから'\0'までの文字を%sが文字列として表示してくれる
ということですか?
>>51 ban[row][col]、気がつきませんでした、値が入ってしまってますね。
初期化と改変の流れまで教えていただきありがとうございました。
ロジックは猫に習ってということで、
あとあとリバーシのアルゴリズムを勉強するときにちゃんとしたものをゴリゴリします。
>>68 「printf 書式指定」でググるか、開発環境に付いてるマニュアル読め
sprintf使ってみ
std::stringを継承して、メンバ関数を増やしたクラスを作りたいんですが、 (具体的には、中身UTF-8nに特化した文字列クラスを作りたい) class my_string : public std::string { public: my_string() : std::string() {} my_string(const char* src) : std::string(src) {} my_string(const my_string& src) : std::string(src) {} … } こんな感じでコンストラクタをずらずら書いていって、 あとは自分の好きなだけメンバ関数増やしていくだけで大丈夫ですか?
>>72 std::string はデストラクタがバーチャルじゃ無いので、
オブジェクトの削除時には注意が必要。
具体的には、
std::string *str = new my_string("('A')");
...
delete str;
とやるとstd::stringのデストラクタが呼ばれてしまう。
ほとんどの場合は大丈夫だと思うのだけど、
ふとした拍子にはまることになるかもしれない。
wstringでも使っとけ
関数の前にコロンを二つ付けるのは 何の意味があるんでしょうか?
aが1かそれ以外になるタイミングはプログラマが完全に把握でき、 処理nanntokaが頻繁に起こる場合において、 //hinnpann if(a==1){ //nanntoka } とするか //junnbi void voidfunc(){}//何もしない関数 void nanntokafunc(){ /* nanntoka */ } void(*pfunc)();//a==1ならnanntokafuncが、それ以外ならvoidfunc //hinnpann pfunc(); とするかでは、後者の方が条件判断をしない分早いんですか? それとも無駄に何もしない関数にジャンプする分だけ遅いんですか? あと歯を磨くのが面倒くさいので、 手軽に口内の歯垢を生成する菌そのものを除去するオススメの方法って知りませんか?
>>76 速度は実測が基本。
菌の除去には強酸を使うのはどうだろう?
塩酸とか硫酸とかでよーくうがいすれば、きっと菌なんて生きてられないはず。
やっぱりCPUによって違いますよね・・・。 「頻繁」とか、曖昧な表現をしてすみませんでした。 塩酸や硫酸は、練り歯磨き粉に入ってる分だけでも痛いのに リステインなどは泣きそうになるほど厳しいです。 ミュータンス菌も生きるために必死だから、そうそううまい話なんてありませんよね。
水酸化ナトリウムや水酸化カリウムなんかの強塩基でも菌を破壊できます。
>>75 グローバルスコープだね。
ローカルと明示的に分ける場合に必要
// Foo.h class Foo { private: int a; public: static int GetA() const }; // Foo.cxx #include "Foo.h" int Foo::GetA const { return a; } っていうのは、なんか間違ってますか? GCCで ./include/Foo.h:6: error: static member function 'static int GetA()' cannot have cv-qualifier src/Foo.cxx:2: error: static member function 'intt Foo::GetA() const' declared with type qualifiers と怒られます。 staticメンバ関数ってconstに出来ないんでしょうか。
83 :
82 :2007/05/13(日) 20:31:18
簡略化して書くときに書き間違えました。 実際には、int aはstaticになっていて、 Foo.cxxの中で定義されてます。
staticはthisがないという指定なのに、 thisをconstにする指定を併用しても仕方ない
>src/Foo.cxx:2: error: static member function 'intt Foo::GetA() const' declared with type qualifiers intt? セミコロンもないし、単純ミスじゃね?
86 :
82 :2007/05/13(日) 20:40:11
>>84 あー、なるほど。そういうことですか。
>>85 実際のコードはもっと長いので、
抜き出して書いてます。
inttとか、GetAに()がついてないのとかは、
簡略化したときの打ち間違い。
ってーことは、例えばGetAの中でa++とかやったりとかして、
const関数にしておけばコンパイラが注意してくれるのに、
っていうのは期待できないということですか。
簡略化するときに何カ所も間違えるようなうっかりさんは、 実際のコードでもミスしてそうだな
エラーメッセージはコピペだろうから、 intt ってのはリアルで間違ってんじゃね?って思って指摘したんだけどな
89 :
82 :2007/05/13(日) 21:00:52
本当に申し訳ございませんでした。 皆さん、ありがとうございます。
すみません。ポインタの素朴な疑問です。 いれこの構造体enemyを固定領域に確保したいときは struct enemy { short mainface; short b; struct POS Pos[32]; }; struct POS { short X; short Y; }; struct enemy *enemy_struct; enemy_struct = (enemy*)malloc(sizeof(struct enemy)); でいいんですか? あとsizeof(struct enemy*)=4ってなるんですけど struct enemy *enemy_struct;で消費されるenemy型へのポインタの メモリ領域は4Byteってことですか? よろしくお願いします。
>struct enemy *enemy_struct; >enemy_struct = (enemy*)malloc(sizeof(struct enemy)); >でいいんですか? だめです。型違いです。 >あとsizeof(struct enemy*)=4ってなるんですけど struct enemy *enemy_struct;で消費される4byteでおけ
んんん?問題なくね?
... = (enemy*)malloc( ...
94 :
90 :2007/05/13(日) 23:18:34
すんません。型違いということは ..=(struct enemy *)malloc(.. と訂正すればいいんですか?
>>94 そうだね。それでおk。
実際コンパイルしてみて確認すればいいと思うよ。
入れ子であっても特に使い方に変わりはないよ。
自己参照構造体と呼ばれる特殊な入れ子は慣れるまで厄介(慣れれば便利)
なんだけど、今回はそれじゃないし。
にしても、short変数とか微妙なの使うなあ。
ところでstructが省略できないって事はCを使用しているんだね。
C++では省略が許されたはず。「//」によるコメントみたいに
C++で先に作られてから後になって、ANSIがCの文法として認めたものも
あるから将来は
>>90 のような書き方も許されるかも。
まあtypedefすれば良いだけなんだけどね。
96 :
デフォルトの名無しさん :2007/05/14(月) 01:08:45
printf("1¥n"); printf("2¥n"); printf("3¥n"); としたあとに1、2、3を4、5、6と上書きしたいんですが、 CRで先頭に戻るのは分かるのですが(最終行は上書き可能)、 1行前に戻るってのはできるんでしょうか?
それは処理系依存な方法を使わないとダメ エスケープシーケンスとか、ConsoleAPIとか
98 :
96 :2007/05/14(月) 01:26:38
>>97 すいません。環境書き忘れてました。(VT100相当)
エスケープシーケンスでググって、
printf("¥x1b[3A");
で解決しました。
ありがとうございます。
99 :
デフォルトの名無しさん :2007/05/14(月) 01:52:37
asdf<int (int)> a; みたいな事がしたいんですが、asdfの定義はどういう風にすれば良いかはなんてググれば詳しく出てくるんでしょうか
boost::function
なるほど
asdf<int (*)(int)> a; のことか?
なんだと
105 :
デフォルトの名無しさん :2007/05/14(月) 14:32:49
C言語のあるプログラムで、 Cファイルではなく、hヘッダに 関数を実装している人がいるんですけど 普通なんですか? やっぱりヘッダに実装する方がベターなんでしょうか?
はっきり言ってどっちでも良い。 技術的でない話題はマ板へ
どっちでも良くないよw ヘッダに実装できるのは内部リンケージの関数だけだけど、 そんなことやっちゃったら同じ関数が複数のソースに定義されて 無駄にも程がある状況になる。 ヘッダに実装する必要があるのはインライン関数だけ。 他は普通はヘッダに実装してはいけない。
インクルードガードやってたから気づかなかった
インクルードガードとは関係ない話。 a.h を a.c と b.c でインクルードすれば a.c と b.c の両方に関数定義が展開される。
インクルードガードしてりゃそんなけったいなことにはならんだろ。
と、思ったがなるな。スマン
112 :
105 :2007/05/14(月) 15:23:06
そうですね。勉強になりました。 ありがとうございました。
C++ だとテンプレートの実装もヘッダに書く必要がある。
export なんてあってないような仕様だし。
クラスの宣言内に直接関数定義することもあるけど、
これはインライン関数になるから
>>107 の範囲内。
>>a.h を a.c と b.c でインクルードすれば >>a.c と b.c の両方に関数定義が展開される。 それはへたくそなインクルードガード。 関数の重複インクにならんやり方はちょっと考えれみれ。直ぐわかるやろ。 a.h #ifndef … a.c #incliude "a.h" … b.c #incliude "a.h" … ただし、それがエエ方法やとは言うてへんど。
>>114 重複インクルードが問題なのではなく、同じ関数が複数リンクされることが問題。
理解できていないなら、無理にレスしなくていいからね。
>>重複インクルードが問題なのではなく、同じ関数が複数リンクされることが問題。 >>理解できていないなら、無理にレスしなくていいからね。 だから、「同じ関数が複数リンク]されない方法があるって言うとんじゃ、阿呆かいな。 それとも、ホンマの初心者か?
そういう方法があるんかしらんが、
>>114 では何の解決にもなってない。
>>116 >「同じ関数が複数リンク]されない方法がある
だったらそれを書き給え。
尤も、それならそれで>114の「関数の重複インクにならんやり方」は
一体全体なんなのかという疑問は残るが。
>>118 これでOK。
--a.h
#ifdef NEED_FUNC
void func() {}
--a.c
#define NEED_FUNC
#include "a.h"
--b.c
#include "b.h"
--
ただし、これをインクルードガードとは言わないと思う。
それだとa.cでfuncが使いたいときに困るだろ。
114のインクファイル中の記述で、ちょっと工夫したら(ヒントは関数の定義じゃ)できると言うとんじゃ。 これだけ言うたら、普通のC言語1年坊主でも気が付くど。気が付かんようなら、C諦めた方がええで。 それより、こんなレベルで初心者を教えるな! 初心者も迷惑じゃ。 >>だったらそれを書き給え。 誰に向かって言うとんじゃ、ボケ。
すみません、喧嘩しないで頂けますか?
>>121 分からなくても別に誤魔化さなくていいよ。
俺だって分かんないんだもん。
まだわからんか? そもそも”関数名”て何や?
まさかstaticを付けるというオチでは・・・
void foo ( ナンたらこたら… ↑で "foo" は何をしとるんや?
#define foo ↑で foo は何をされとんねん?
>>121 もちろんその方法では、
* a.h に関数の実装を記述する。
* a.c, b.c でインクルードすればどちらからでも使える。
* 関数は重複してリンクされない。
が満たされるんだよな。
当たり前だのクラッカ
もったいぶっちゃって、どうせそんな方法ないんだろ・・・
void foo ( なんたらこたら … void bar (ああでもこうでも … #ifndef foo printf ( "宣言済み" ) #else printf ( "未宣言" ) #endif … これでもわからんか?
void foo ( なんたらこたら #undef foo int foo ( ああでもないこでもない これではどや?
staticつけても同じ(内容の)関数が複数リンクされることには違いないしなぁ。
双方のソースから同じ名前で参照される別物の関数と言う条件だと、
どうにもならない気がしてきた。
>>132 まさかとは思うけど、関数を定義したかどうかをディレクティブで
判定できるなんて思っちゃいないよね?
そろそろ正解をどんと出してみてよ。
訂正 誤:int foo ( ああでもないこでもない 正:int foo ( ああでもないこうでもない
>>133 俺頭悪いからわかんないんだって・・・
意地悪しないで教えてくれよ
わかった。リンカディレクティブだッ(w
静的メンバ関数として実装するとか? struct HOGE_unique{ static int hoge() { ... } }; #define hoge Hoge_unique::hoge
もはやCじゃないがな
// aaa.h #ifndef test int test(int i){return i + 10;} #endif // bbb.c #include "aaa.h" int test ( int i ); int foo(int i){return test(i)+10;} // main.c #include <stdio.h> #include "aaa.h" void foo(int i); int main(void){printf("%d",test(i)+foo(i);}
只今
>>133 は>134を読んで真っ青になっている最中です。
次の御託を思い付くまでもう暫くお待ちください。
↑アホ
>>140 こんなふうにプリプロセスされました。
// main.c
#include <stdio.h>
int test(int i){return i + 10;}
int foo(int i);
int main(void){printf("%d",test(1)+foo(1));}
// bbb.c
int test(int i){return i + 10;}
int test ( int i );
int foo(int i){return test(i)+10;}
>>140 testなんかどこで#defineしてるの?
test は何回定義されとるん?アセブルリスト見てみ?
>>145 宣言されとらんから次のtest()がインクルードされるねんやんかいな。
トリッキやよって別々ライブではとおらんけどな。 わしが言いたいのんは「決めつけんな」ちゅうこと。
$ gcc -c main.c bbb.c $ nm main.o 00000000 b .bss 00000000 d .data 00000000 r .rdata 00000000 t .text U ___main U __alloca U _foo 0000000b T _main U _printf 00000000 T _test $nm bbb.o 00000000 b .bss 00000000 d .data 00000000 t .text 0000000b T _foo 00000000 T _test どう見ても両方にtestが含まれてるんだが
つまり、関西弁のような発言に見えるからと言って、関西人だと決めつけるな、ということですね?
↑そうそう。 それと、gcc はバカやよって別別オブジェ作るねん。
なんだ、もう少し笑わせてくれるのかと思ったら意外に伸びなかったな。がっかりだぜ。
ようするにはったりだったわけだろ
違うやろ、call _test のアドレス見れ
char line[] = "abcde¥012345¥0ABCDE"; みたいなことやりたいんですが、 '¥0'があるために、 lineの中身は"abcde¥0"となってしまいます。 当たり前と言えば当たり前なんですが、 回避方法はあるでしょうか。 '¥0'を含む長いchar配列を、 classのstatic constメンバ変数として持たせたいんです。
>>155 > lineの中身は"abcde¥0"となってしまいます。
どうやって確認したんだよ。
ちゃんと最後まで入っているはずだ。
初心者アドバイザは、今、それどころやありません。
158 :
154 :2007/05/14(月) 18:52:42
「長いchar配列」というのは、数万文字あります。 なので、配列長を確保してから1つずつ代入というのは厳しい。 そんなもん別のテキストファイルにして必要なときに読めよ、 という以外のでお願いします。
159 :
155 :2007/05/14(月) 19:02:58
#include <iostream> using namespace std; int main() { char line[] = "abcde¥012345¥0ABCDE"; for(int i=0; i<18; i++){ cout << "(" << line[i] << "," << (int)line[i] << ")"; } // i return 0; } $ ./a.out (a,97)(b,98)(c,99)(d,100)(e,101)( ,10)(3,51)(4,52)(5,53)(,0)(A,65)(B,66)(C,67)(D,68)(E,69)(,0)(,0)(,0) となります。
161 :
155 :2007/05/14(月) 19:07:45
> lineの中身は"abcde¥0"となってしまいます。 は不正確でした。すみません。 "12345"の"12"が改行コードLF=10になっています。
>>159 char line[] = "abcde\0" "12345\0" "ABCDE";
こうしとけ。
163 :
155 :2007/05/14(月) 19:10:14
>>160 あれ?なんかまずかったですか?
見やすいかと思って。
i=15, 16, 17のときに(,0)となってるので、
ここに何も入ってないんですよね。
なんで"¥012"が"¥0¥n"に化けてしまうのか。
"\012" が {'\0', '1', '2'} ではなく {'\012'} とみなされてるんだから、 配列の全長が2文字分みじかくなってる。 つまり最後の二つの0は不正なアクセス。
165 :
155 :2007/05/14(月) 19:12:35
>>162 その方法で、
(a,97)(b,98)(c,99)(d,100)(e,101)(,0)(1,49)(2,50)(3,51)(4,52)(5,53)(,0)(A,65)(B,66)(C,67)(D,68)(E,69)(,0)
になりました。
ありがとうございます。
166 :
155 :2007/05/14(月) 19:13:53
>>164 ああ、octで解釈されてるわけですか。
なるほど。
>>159 みたいに
for(int i=0; i<10; i++){
} // i
とか
if(hoge){
} // if
っていう書き方を推奨してる本って、
なんかありませんでしたっけ?
この書き方をどっかで読んだ記憶があるんです。
168 :
54 :2007/05/14(月) 21:52:47
>>55-58 class A
{
int a;
public:
A(int i) : a(i) {}
A& geta() { return *this; }
virtual void prt() const { printf("a:%d\n", a); }
};
class B : public A
{
int b;
public:
B(int i) : A(0), b(i) {}
virtual void prt() const { printf("b:%d\n", b); }
};
int main()
{
B b(100);
b.geta().prt();
}
これを動かすと「b:100」と表示されて、geta()はA&を戻す筈なのに実際は
B&を戻している訳ですよ。B&を返すメソッドを勝手に定義してくれたほうが
よっぽど自然だと思うんですが、私が愚かしいこと言ってるんですかね?
うん、けっこう愚かしいと思うよ…。
>>168 が理解できない
どこでB&を戻してるの?
>>168 class C : public B
{
public:
A& geta()
{
static A a(0);
return a;
}
//コンストラクタほか省略
};
このとき、こうされたらどうする?
C c;
B& b = c;
b.geta().ptr();
B型の式に対してgeta()を呼ぶとB&が返ってくることにしたら、
このb.geta()ではA型のインスタンスへの参照を返しているので型システムを侵すことになる。
だから暗黙的にやらないで、B内ではB&を返すgetaを明示的にオーバーライドしてやったほうがいい。
次のコードはC::getaでコンパイルエラーになる
struct A {virtual A& geta();};
struct B : A {virtual B& geta();};
struct C : B {virtual A& geta();};
172 :
171 :2007/05/14(月) 22:30:14
すまん 168のgetaも仮想関数だと思い込んでいたorz
173 :
デフォルトの名無しさん :2007/05/14(月) 22:41:55
とあるソースを読んでいる初心者です. クラスClass1のヘッダファイル先頭に,下記のように他のクラスClass2,Class3の記述がありました. #ifndef ******* #include ************ class Class2; class Class3; ←これ class Class1 public 以下略 これはいったいどういう意味を持つのでしょうか?
Class2, Class3は別のところでちゃんと定義されてますよ ってコンパイラに教えるためのおまじない
175 :
54 :2007/05/14(月) 22:58:24
>>171 なるほど。そのとおりでした。
サンクス。
>>173 試しにその行を削除するなりコメントアウトするなりしてコンパイルしてみろ
たぶんエラー吐くから
>>168 そのルールでいくと、自分の型のポインタか参照を返すようなメソッドは
すべて下位クラスで再定義する必要がある。
('return *this' だけのメソッドは特別なんていうルールを採用する?)
ちなみに、以下のようなプログラムではどんな結果になるべき?
void prt3(A* obj) { printf("prt3(A)\n"); }
void prt3(B* obj) { printf("prt3(B)\n"); }
class A {
public:
A() {}
virtual void prt() const { printf("A::prt\n"); }
void prt2() const { printf("A::prt2\n"); }
// thisの型はA?,B? return時だけB?
A& geta() { prt(); prt2(); prt3(*this); return *this; }
};
class B : public A {
public:
B() {}
virtual void prt() const { printf("B::prt\n"); }
void prt2() const { printf("B::prt2\n"); }
};
int main() {B b; b.geta(); }
結果
B::prt
?::prt2
prt3(?)
*thisをthisにしてVC2003でコンパイル 結果: B::prt A::prt2 prt3(A)
VS2005,XPです。 HWND hwnd; RECT rc; GetWindowRect(hwnd,&rc); if ((rc.bottom-rc.top) == GetSystemMetrics(SM_CYCAPTION)) うまくいかないのですが、こういう比較の仕方は使えないのでしょうか? 使えない場合、どのように直せばいいですか?
180 :
デフォルトの名無しさん :2007/05/15(火) 19:33:30
クラスなどを使って、通常存在しないサイズの変数にアクセスできませんか? int型の変数を24と8ビットに分けて使うような x.aは24bit x.bは8bit として使いたいんですが
>>17 D&Eには、できるようにしたところでメリットがない(オーバーライドできる仮想関数がない)し、
Cの型変換のルールが混沌としていて内蔵型をクラスとして扱おうとしてもうまくいかないと、
そうできるようにしなかった理由が書かれている。
182 :
180 :2007/05/15(火) 19:34:31
代入、参照が普通の変数のように出来る方法を教えてください
>>180 どうしてもやりたいなら、ビットフィールドがその目的に使える。
但し、移植性を大きく損なうことになりかねないので注意。
184 :
デフォルトの名無しさん :2007/05/15(火) 19:40:06
185 :
デフォルトの名無しさん :2007/05/15(火) 19:59:46
>>183 すみません boolとcharだとどっちを使った方がいいとかありますか???
struct A{
char n : 1; char m : 7;
};
struct A{
bool n : 1; bool m : 7;
};
187 :
185 :2007/05/15(火) 20:07:05
自己解決しました 移植性を考慮して、unsigned char n : 1; にしておきますね
移植性が欲しいならunsigned intにしておけ
189 :
デフォルトの名無しさん :2007/05/15(火) 20:12:37
>>188 サイズは出来るだけ削りたいんです
上の例では32bit使っていますけど
8bit以内ならcharのほうが削れます
ビットフィールドに使えるのはsignedかunsignedのintだけ。
ビットフィールドの移植性って実のところどうなの? 一応、標準だよね?
192 :
デフォルトの名無しさん :2007/05/15(火) 20:16:15
bcc(c++)だと使えますけど
>>192 処理系依存で他の型が使えても構わないことにはなっている。
C++ならほとんどの整数型が使えるだろ。
>>189 unsigned charがビットフィールドに使える処理系で、
同じ8ビットのビットフィールドでもunsigned intにするかunsigned charにするかで
違いが生じるなんて話聞いたことがない。
>>195 #include <iostream>
template<typename T> struct S { T a: 1; T b: 7; };
int main() {
std::cout << "sizeof(S<unsigned int>) = " << sizeof(S<unsigned int>) << std::endl;
std::cout << "sizeof(S<unsigned char>) = " << sizeof(S<unsigned char>) << std::endl;
}
g++だと違う結果になったが。
197 :
デフォルトの名無しさん :2007/05/15(火) 20:42:42
>>195 違いますけど・・・
#include <stdio.h>
int main(void){
struct A{
unsigned int m : 1;
unsigned int n : 7;};
struct B{
unsigned char m : 1;
unsigned char n : 7;};
printf( "%u\n", sizeof(struct A) );
printf( "%u\n", sizeof(struct B) );
return 0;}
VC8で確認。こちらも違った。
VC7.1でも違った。
200 :
デフォルトの名無しさん :2007/05/15(火) 21:58:58
ふつう違うよな int とchar 一バイトと四バイトだんもんな
その理屈はおかしい。
202 :
デフォルトの名無しさん :2007/05/15(火) 22:29:47
BCC55で次のソースをコンパイルするとリンカがエラーを出すのですが、 私は何を誤っているのでしょうか? どう直せばよいか教えていただけないでしょうか。 ●ソース #include<iostream> class Singleton { public: static Singleton getInstance() { if(&singleton == '\0') { singleton = *(new Singleton()); std::cout << "Created!" << std::endl; } else { std::cout << "Not Created!" << std::endl; } return singleton; } ~Singleton() {} private: static Singleton singleton; Singleton() {} }; int main() { Singleton s1 = Singleton::getInstance(); Singleton s2 = Singleton::getInstance(); }
203 :
202 :2007/05/15(火) 22:31:15
エラーの内容は次の通りです。 ●コマンドラインとエラー X:\>bcc32 -nX:\data\bin -5 -f X:\data\src\Singleton.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland X:\data\src\Singleton.cpp: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル 'Singleton::singleton' が未解決(X:\DATA\BIN\SINGLETON.OBJ が参照)
一時オブジェクトとして使うならコンストラクタ呼び出さないと駄目ぽ Singleton()::getInstance();
static変数の実体がないって怒ってるわけなんだが… そんなことよりも、何もかもが誤りだから ポインタと参照とシングルトンの勉強をしたほうがいいと思うよ。
>>202 クラスの静的メンバ変数は、外部で定義しなければならない。
Cのグローバル変数がヘッダで宣言して、どこか1ヶ所で定義するのと同じ理屈。
それはともかくマルチスレッドを考慮しないのなら、単にこうでいい。
class Singleton {
public:
static Singleton getInstance() {
return singleton;
}
~Singleton() {}
private:
static Singleton singleton;
Singleton() {}
};
static Singleton Singleton::singleton;
マルチスレッドを考慮するなら、Singletonはポインタ、
当然std::auto_ptrやboost::scoped_ptrあたりにすべき。
207 :
202 :2007/05/15(火) 23:07:21
>>204-206 有難うございます。
マルチスレッドやboostのライブラリは当分手を出しません。
コマンドラインアプリをある程度満足に作れるようになってから先に行きます。
まだポインタの使い方も習得できてないわけですし。
ずっとJavaをやってきたんですが、アレは全部参照扱いだから
ポインタと実体を意識するシーンは限定されてたんですが、
C++はそうでないから難しいです。
C++プログラマにJavaを教える本はあるのに、その逆はないんですよね。
仕事ではないので、手探りでなんとかやっていこうと思います。
Accelerated C++マジオヌヌメ
209 :
206 :2007/05/16(水) 00:07:44
>>206 getInstanceがSingletonへの参照を返すようにするのを忘れていたorz
正しくはこう
class Singleton {
public:
static Singleton& getInstance() {
return singleton;
}
private:
static Singleton singleton;
Singleton() {}
Singleton(const Singleton&);
~Singleton() {}
Singleton& operator =(const Singleton&);
};
210 :
202 :2007/05/16(水) 01:31:34
>>208 Amazonのレビューによると、
既に他言語の知識がある人間にとって丁度良い本のようですね。
店頭で探してみます。
>>209 ありがとうございます。
operatorを使うんですね・・・。
まだ「パッと見」で、なぜこれがシングルトンを実現するのかが
分からないレベルなので、ソースを研究してみます。
Singleton(const Singleton&); Singleton& operator =(const Singleton&); はインスタンスのコピーを禁止するためのちょっとした工夫だよ。 privateにする&処理の内容を記述しないことで、 コピーしようとしたらコンパイルエラーになるようにしてる。 あと、コンストラクタをprivateにしてるのも、 getInstance()以外で勝手にインスタンスを作られないようにするため。
212 :
202 :2007/05/16(水) 01:58:23
>>211 ありがとうございます。
なるほど、インスタンスのコピー禁止も意識しないといけないんですね。
privateなコンストラクタについては、Javaも同じ手法なのでわかりました。
XPです。 タスクトレイのアイコンを指定しても違うアイコン(赤い×マーク)が出るんですけど何故でしょうか? アイコンは32x32,256色と16x16,256色が入ってます。
215 :
214 :2007/05/16(水) 10:36:34
ソース nid.hIcon = (HICON)LoadImage(hInstance,MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, 0); リソース IDI_ICON1 ICON "1.ico" こんな感じで読み込んでます。 それとあともう一つお願いします。 タスクトレイのアイコンを右クリックしたらTrackPopupMenuという便利な位置指定できる関数がありますが、 右クリックメニューからダイアログなどのウィンドウを開いた場合のウィンドウ位置の指定はどうやるのがスマートでしょうか? タスクバーを移動してる場合にも、アイコン位置の角に表示させたいです。 それぞれの位置の場合の処理を書く必要があるんでしょうか?
そのアイコンを試しにクライアントエリアに描いてみては 位置指定は、、、思ったとおりにやってみなよ
struct base{}; template<typename T>struct drived:base{ template<typename TT>bool typecmp(){ return typeid(T)==typeid(TT); } }; base *p1=new drived<int> , *p2=new drived<char>; //で、base*からdrived::typecmpにアクセスしたい訳だが
218 :
デフォルトの名無しさん :2007/05/16(水) 14:01:53
vipの方が人がいそうなので。
http://pc11.2ch.net/test/read.cgi/tech/1178432985/217 217 名前:デフォルトの名無しさん[sage] 投稿日:2007/05/16(水) 13:59:23
struct base{};
template<typename T>struct drived:base{
template<typename TT>bool typecmp(){ return typeid(T)==typeid(TT); }
};
base *p1=new drived<int> , *p2=new drived<char>;
//で、base*からdrived::typecmpにアクセスしたい訳だが
これをやりたいんだけど、やっぱり原理的に無理だよね?
219 :
218 :2007/05/16(水) 14:02:42
すみません、218は誤爆です
>>215 IDI_ICON1の値が問題な希ガス
ヘッダでの#defineも晒したほうがいいとおも
>>217 お勧めはしないがdynamic_cast<derived<int>*>(p1)->typecmp<int>()
222 :
デフォルトの名無しさん :2007/05/16(水) 21:35:09
>>222 よく読んでないけど、delete p;は実行されないと思うぞ
配列はmain関数側で作って渡した方がいいと思うぞ
224 :
デフォルトの名無しさん :2007/05/16(水) 22:00:19
あ、やっぱりそうですか。 ・・・あ、なるほど、思いついた ありがとさんでした
>>221 仮想関数無いと dynamic_cast って効かないんじゃない?
>>217 new drived した直後なら static_cast でいいだろう。
やっぱりお勧めはできないんだけども。
226 :
202 :2007/05/16(水) 23:39:03
>>213 ありがとうございます。
こういうサイトは良いですね。
今は鯖落ちしてるようで、キャッシュを見ていますが・・・。
なんで実行時に決まる子の型を、コンパイル時判定で 親が使いたい、なんて言う発想になるんだろう
vectorについてどなたか教えて下さい。 例えば、メイン関数で空のvectorを定義して 別の関数でその中に数値を代入したい場合には 何を渡して、何を仮引数にとってやればいいのでしょうか? あくまで別関数のreturnは0か1で返したく、別関数で代入するだけで メイン関数vectorの値を操作したいのです。 sub(?????) { こちらで値を入れたい } int main() { vector<int> Vint; sub(?????); } 何も入っていないためかiteratorを渡しても駄目でした。 またmain{sub(&Vint)}で、sub(vecter<int> *Vint){}でも 値の代入は出来ませんでした。困っていますよろしくお願いします。
>>228 一番最後のポインタを使った奴なら大丈夫なはず。
できなかったってのは、何をしたらどうなったんだ?
ポインタのかわりに参照を使うのが C++ 的に適切。
>またmain{sub(&Vint)}で、sub(vecter<int> *Vint){}でも >値の代入は出来ませんでした。 できるよ …気になったんだが、main の中で値を入れることはできるの? resize もせずに Vint[0] = 1; とかやってないよな?
231 :
214 :2007/05/17(木) 00:38:52
ありがとうございます。
>>216 クライアントエリアにも赤い×マークが描かれました。
>>220 #define IDI_ICON1 103
です。
>>231 じゃあそういうデータなんだよ
複数の形式でアイコンが入ってるなら全部チェックしてみては
233 :
214 :2007/05/17(木) 01:00:02
自分で作ったアイコンなので赤い×マークなんて入ってないんですが・・・。 実行ファイルのアイコンとタイトルバー左上のアイコンも同じアイコンを使っていてそちらはちゃんと出ます。
んじゃOEMアイコンを読んでるんだな。 hInstanceがNULLだったりしないか?
235 :
214 :2007/05/17(木) 02:08:59
ビンゴでした。 すいません、どうもありがとうございました。
VC++で ULONGLONG x = 0; x += 10000000 * 60 * 60 * 3; ULONGLONG y = 0; y += (ULONGLONG)10000000 * 60 * 60 * 3; if (x != y) cout << "Different" << endl; とするとxの方はオーバーフローになってxとyが違う数字になってしまうんだけど 64ビットコンパイラではこれは起こらないんだよね? この辺の仕様について 書いてあるページとか無いだろうか?
>>236 intが64bitなら起きないけど、VC++の64bitターゲットはintが32bitな
ので、起きる。
ページは知らね。探してないけど、Cの規格書にあるはず。
整数定数は(特に記述が無ければ)int。
int同士の演算はintで行われ、結果もint。
これはどんなコンパイラでも一緒。
つまり、
>>237 の通り。俺もページは知らないが。
VIPPERが意外と侮れない 昨日VIPでレスついてた 130 名前:以下、名無しにかわりましてVIPがお送りします。[] 投稿日:2007/05/16(水) 14:52:36.04 ID:G4TJRFdQ0 struct base { private: virtual bool typecmp( const type_info &typeinfo ){ return false; }; public: template<typename TT> bool typecmp(){ return typecmp( typeid(TT) ); }; }; template<typename T> struct drived : public base { public: virtual bool typecmp( const type_info &typeinfo ){ return typeid(T) == typeinfo; } }; こんなんでどうだい?
>>229-230 一番下ので可能とのことで、もう一度やってみます。
resizeというものに関しては知らなかったです。
どうもありがとうございました。
241 :
デフォルトの名無しさん :2007/05/17(木) 11:28:44
char *strという変数に文字列を格納するのを関数で行う場合 どういう渡し方すれば良いんでしょうか?
hoge(char *dst, int dst_size)
244 :
241 :2007/05/17(木) 11:56:44
あれ?文字列を格納するのって char str[50]="hoge"; char *str="hoge"; の二種類でやるのではないのですか? C言語は今日から勉強し始めたので激しく狂ったこと言ってたらすいません。
おとなしく、配列とポインタの関係あたりを勉強してからにしろ。
if(a==b)とif(b==a)って同じですか?
>>246 それがC++で特殊な演算子オーバロードされていると言うことがないなら、同じ。
a, b の型が異なっても同じだったけ? int と long とか double と int とか
>>248 promotion rule に従うってだけで同じじゃね?
mallocはnew、freeはdeleteに置き換え可能だと思いますが、 reallocはどうしたらいいでしょうか。(STLのコンテナ使え、は無しで
>>250 STLのコンテナを使わない理由を調べ、その理由如何では敢えてnew/deleteに置き換えずにそのままrealloc()を使うべし。
C++の機能に置き換えるというなら、インラインアセンブリでシコシコ
つplacement new
>>236 (ULONGLONG)10000000よりも10000000ullのほうがすっきり
意味が違うだろ。
scanfでdouble型変数に数値を入力し、その数値を1/2,1/4,1/5の値を出力するプログラムを作成 したいのですが、どのようにして作ればいいのでしょうか?
inline指定した関数がインライン展開されなかったとき、なんで警告が出ないの? 個人的には「この関数は現在の設定(orコンパイラ)ではインライン展開されません」という警告が低いレベルで出て欲しい。
それでデバッグビルド/サイズ優先ビルドで警告が出まくりか?
>>256 どこで躓いてるのか分からん。
scanfでint型変数に数値を入力し、その値を2, 4, 5倍して
出力するプログラムは作れるかい?
foo = !!bar; という文を見たんですか、これは bar をboolにしてるだけで、 foo = (bool)bar; と同じですか?
C++で変態的な演算子定義をしていないなら。 (operator !だけ定義してあるとか)
VC++は-W4異常以上は標準ヘッダですら警告出たりして煩かったから 使ったことないなぁ 今はどうだか知らないが
なるほど。 独習C++で「展開されるか否かはコンパイラによる」って書いてあった気がしたから 低血圧な俺は心配しすぎで心拍数上がってぶっ倒れそうだったけど安心した。
>>266 標準ライブラリは滅多に出てこないが、
Boostなんかの外部のライブラリのヘッダではよく出てくるから、
#pragma warningが手放せない。
自作の型に対し、プリミティブな型と同じような四則演算を行う場合って、 + - * / % += -= /= %= ++ -- の12個全部定義しないとダメ?
boost::operatorsを使えば手間が省けるかと思う。
>270 boostに頼るのが現実的っぽいですね。ありがとうございました。 しかし、これを使わないとすると一体何パターン定義すればいいのやら……比較やら何やら。
何の型かは知らんが、例えば同じ * でも MyType * MyType、MyType * int、int * MyType は別定義かもしれんしな 後 const ありなしとか
非メンバな演算子でもboost::operatorで定義出来るんですかいね?
>>273 クラス定義内で friend 関数を定義することで実現するみたい。
VC++2003にSP1あてたら強制コンパイル(Ctrl+F7)できなくなった のですが、どなたか対処法知りませんか?
C/C++の話ではないような・・・ オプションのキーボードで、ビルドのコンパイルがどれに割り当てられているか見てみては
>>275 です。
>>276 さんレスありがとうございました。
ここはスレ違いっぽいとは思いながら該当するスレがみつからず
書いてしまいました。すみません。
書き方が悪かったです。
キーの割り当てがどうという問題ではなく、
1度コンパイルしたソースファイルを
もう1度強制的にコンパイルすることがSP1になってから
できなくなってしまったのです。
適切なスレ探して聞いてみます。
Ctrl-F7は普通のビルドだから強制でもなんでもないだろ リビルドしたいのか?
>>277 コマンドラインからdevenv /rebuildしたらどうなる?
280 :
275 :2007/05/18(金) 14:26:11
>>278 さんレスありがとうございました。
こっちのスレで同様な質問かいてしまいました・・・。
Visual Studio IDE環境
http://pc11.2ch.net/test/read.cgi/tech/1115707321/ 要はOBJファイルが存在する状態でも
リビルドではなく普通にもう1度コンパイルかけたいだけなんです。
理由は、ソリューションが巨大なため単にリビルドでなくて一部のみコンパイル
かけたいときがあるので・・・。
>>279 さん
OBJ消したり、リビルドすれば大丈夫なのは分かっているのですが、
業務上他のVer.(2005など)のVisualStudioも使うので同様の操作
で何故できないのかと。
ちなみにSP1あてる前は普通にできてたことですし、
VS6.0SP6,2005,2005SP1でも同様に問題なくできていました。
コンパイルできなくなったってだけじゃ何もわからんよ。 具体的にどうなってんのか(ビルドログとか)晒せ。
普通build っつーのは src target の依存関係を追って時刻更新がかかったもだけを 更新する作業だと思うのだが… make -u はリビルドと同じだし、なんのことかわかんね<強制ビルド まさか単に時刻が崩れているおち?
283 :
275 :2007/05/18(金) 14:51:25
ログ晒します。 1回目のコンパイル。当然通常通りです。 ------ ビルド開始 : プロジェクト : AAAAA, 構成 : Debug Win32 ------ コンパイルしています... BBBBB.cpp WINVER not defined. Defaulting to 0x0501 (Windows XP and Windows .NET Server) C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afx.h(281) : warning C4005: 'ASSERT' : マクロが再定義されました。 コマンド ラインの引数 : 'ASSERT' の前の定義を確認してください。 ビルドログは "file://d:\AAAAA\Debug\BuildLog.htm" に保存されました。 AAAAA - エラー 0、警告 1 ---------------------- 終了 ---------------------- ビルド : 1 正常終了、0 失敗、0 スキップ 2回目のコンパイル。スキップされてしまいます。 ------ ビルド開始 : プロジェクト : AAAAA, 構成 : Debug Win32 ------ ---------------------- 終了 ---------------------- ビルド : 1 正常終了、0 失敗、0 スキップ ソリューション壊れてるのかな・・・? ちなみに2005で同等のソリューションでは1回目も2回目も同じログはきます。
むしろ2回目も同じログ吐くほうがおかしくないか・・・ PCの時刻とファイルのタイムスタンプのチェック、 あと新規でソリューション作って試してみて
285 :
275 :2007/05/18(金) 15:06:39
>>284 さん
>むしろ2回目も同じログ吐くほうがおかしくないか・・・
ですが、今までSP1あてる前とか、VC6.0のときもこんな動作
してなかったのですが。
PCの時刻やタイムスタンプが壊れていることはないです。
ソリューション大きすぎるとおかしいんですかね?
VC6やVC2005で新規ソリューションで同様の操作してみます。
ログじゃなくてゲロ吐きそう・・・・
OBJ とかの中間生成物が違うフォルダを指してるとか read-only とかそういうことないか?
288 :
275 :2007/05/18(金) 15:26:53
VC6.0MFCアプリで新規プロジェクト作ったら、 2回目スキップされました。あれ?2003SP1と同じでした。 ・・・ VC2005のMFCアプリの新規ソリューションも 2回目スキップされました・・・。 ごめんなさい。これがデフォルト動作なんですね・・・。 でもそうすると今あるこの巨大ソリューションの2005版で こうならないのは何故?? いや、そもそも2003SP1当てる前はスキップされなかった ですし。 プロジェクトファイルを起こすところからやりなおした方が よさそうですね。 皆様お騒がせしました。ありがとうございました。
290 :
288 :2007/05/18(金) 15:48:15
SP1前後で違うんだったな。無視してくれ。
291 :
290 :2007/05/18(金) 15:50:33
289 だった…orz
292 :
デフォルトの名無しさん :2007/05/18(金) 18:43:13
294 :
デフォルトの名無しさん :2007/05/18(金) 21:33:10
戻り値として配列を戻したいんだが、そういう時ってのはどうやればいいんでしょうかね? 戻り値の型はどうすればいいのか、return の後に書くのは関数内の配列名でいいのか、関数を呼び出した場所の=の左オペランドはどういう型にすればいいのか 教えてください。
引数に配列のポインタ受け取ってそれを操作すればいいような気もする
C++でnew演算子には三種類あるらしいですが 普通のnew、placement new、あともう一つは何ですか?
というよりCではそれが一番使われている。 ほかには、構造体を返したりC++ならstd::vectorを使ったりする方法がある。 関数内でメモリ確保して、呼出元で解放してもらうという手もある。
>>296 new[]のような気がするが、そうするとplacement new[]も考えられるんだよな
new(nothrow) のことか?
>>300 第三のnewはそれでしたか…名前からするにbad_alloc例外を投げないnewってところかな?
ともあれ回答ありがとうございました
>>294 配列を含む構造体を使う。
C++ なら std::vector も使える。
new(nothrow) は placement new の一種だろう。 三種類あると言ってる人の認識がどうなってるか知らないけど。
304 :
294 :2007/05/18(金) 22:06:48
//ん〜、こんなんでしょうか?(実際作りたいプログラムはこんなじゃないですけど #include<iostream> using namespace std; int factor(int a[]){ for(int i =0; i<5 ; i++){ a[i]=i+1; } return a; } int main(){ int a[5]; a = factor(a); for(int i =0; i<5 ; i++){ cout <<a[i]; } return 0; } て、コンパイルが出来ませんでした。コンパイラはVC。メッセージは次の通りです。 test.cpp(9) : error C2440: 'return' : 'int []' から 'int' に変換できません。 この変換が可能なコンテキストはありません。 test.cpp(14) : error C2440: '=' : 'int' から 'int [5]' に変換できません。 配列型への変換はありませんが、参照またはポインタから配列への変換があります。 やっぱり引数と戻り値の型らへんの知識があいまいなので、どうやって渡してどうやって戻せばいいのか分かりません。 このコード直してくれたりすると、ありがたいんですけど・・・wさすがに無理な頼みでしょうか
STL使った方が遥かに楽だと思う #include <vector> #include <iostream> int factor(std::vector<int>& in) { enum { NUM=5 }; typedef std::vector<int>::size_type vec_sz; in.reserve(NUM); for (vec_sz i = 0; i < NUM; ++i) in.push_back(static_cast<int>(i)); return 0; } int out(const std::vector<int>& in) { for (std::vector<int>::const_iterator i = in.begin(); i != in.end(); ++i) std::cout << *i << " "; return 0; } int main() { std::vector<int> v; factor(v); out(v); return 0; }
>>304 JavaかC#でもやっていたのかもしれないけど、
まずCには「配列を渡す」という概念自体がない。
ポインタの型で配列のサイズを指定するというやり方が
ないわけでもないけど、やはり普通は配列の先頭の要素の
アドレス(ポインタ)を渡して処理をすることになる。
その辺が面倒だと言うのならSTLか配列かクラス使う。
こんにちは。Cでプログラムをしているのですが、 _beginthread()で作成したスレッドをCloseHandleで終了させる時に、 デバッグなしで実行すると何もエラーは起こらないのですが、 デバッグありで実行すると、例外が発生してしまいます。 おそらくCloseHandleで出ているエラーなのですが、正常な終了方法ではないのでしょうか? なんか、_freeptd(ptd);の所に矢印があります・・・。 スレッドの作成の部分と終了の部分は下のようになってます。 hThread = (HANDLE)_beginthread(connect, 0, NULL); CloseHandle(hThread_connect);
>>307 _beginthread のマニュアルに
_beginthread に対応する関数書いてない?
malloc と fclose は対応してない様に
違う関数呼ぶと問題が多いよ
309 :
デフォルトの名無しさん :2007/05/18(金) 22:37:48
_beginthreadで開始したスレッドはCloseHandleしちゃ駄目。
>>303 new(nothrow) は確保に失敗したら NULL を返す new 。
placement new は既に確保してあるメモリを利用する new 。
全然違う。
>>308 _endthreadというのがあって、そのスレッドの最後に
_endthread();すればスレッドが終わるようなのですが、
スレッドの外から強制的にスレッドを終わらしたいのです。
しかも_endthreadは引数を持たないので複数スレッドを走らせている場合は
どのようにスレッドの外から強制的に終わらせればいいのか・・・
>>309 そうなんですか・・・。それはエラーが出るわけですね;;
ん〜・・・
>>310 new に与える追加の引数のことを総じて new-placement と言う。 (5.3.4)
元々は new (place) T として配置に使う構文として追加されたから
こんな名前になってるんだろうけどね。
単純な方法としては 生成時にスレッドを生成して、消滅時にスレッドを終了させる っていうスレッドそのものを表すクラスは作ってそいつに自殺するように命令するとか となるとそいつらを生成、管理するクラスが必要になるわけで…
ExitThreadでスレッドを終了させた場合、その終了させたスレッドが プロセスの最後のスレッドであれば、そのプロセスも終了するっぽいので、 これはこれで非常に使いにくいです。一体どうすれば・・・
>>311 短い答え:
スレッドを強制的に終了させる必要などないような設計に汁
少し長い答え:
_beginthreadex(), TerminateThread()を使え
316 :
315 :2007/05/18(金) 23:29:08
おっと後者のほうが短かったぜ
>>315 ありがとうございます。Exではありませんが、
_beginthread()とTerminateThread()でエラーが出ないようになりました。
色々調べたところ、あるサンプルプログラムにおいて
TerminateThread()の後にCloseHandle()で更にハンドル開放を行ってますが
これは必要なのでしょうか?
>>317 イベントを受け取ったら自分で_endthreadして死ぬようにした方がいいと思う。
スレッドを無理やり止めるってことはどこで止まるか分からないんだぞ。気色悪い。
319 :
315 :2007/05/19(土) 00:12:44
>>317 長い答え:
ヘルプに書いてある筈だが、_beginthread()で開始したスレッドは
自分が終了する時に自分でCloseHandle()を呼び出してスレッドハンドルを
破棄する。言い換えると、_beginthread()で開始したスレッドのハンドルが
いつ無効になるか外からは全く分からないので、スレッドのハンドルを
外から何らかの形で使いたいのなら、必ず_beginthreadex()を使え。
_beginthreadex()で開始したスレッドは自分でCloseHandle()を
呼び出さないので、リークを避けたければ誰かが責任を持って代わりに
呼び出してやる必要がある。つまりWaitForMultipleObjects()などを使って
終了を待ち、その後CloseHandle()を呼ぶ必要があるってことだ。
TerminateThread()した場合も同様だな。
>>318 とりあえずスレッドではrecv()をSOCKET_ERRORが出るまで永遠にループさせています。
サーバーが終了した時などは、自動でループを抜けて終了するのですが、
それ以外にこちらから接続を終了する切断ボタンを用意しています。
そのボタンを押したときに強制的にスレッドを終了させているのですが、
ボタンを押されたイベントをスレッド内で取得してすぐにスレッドを終了させる
事なんて出来るのでしょうか・・・?
>>319 丁寧にありがとうございます。とても分かりやすいですw
321 :
デフォルトの名無しさん :2007/05/19(土) 00:41:34
Linux,gccです。 ./aaa 3 2 | ./bbb というように、最初に実行したaaaの結果をパイプでつないで、後ろのbbbというプログラムで操作したいのですが、 うまくbbbに渡すことができません。 aaaは、 1 -2 -1 2 のように出力するので、bbbで int main(int argc,char **argv) として読み取ろうとしているのですが、 argcの値を出力してみると1とでるので、./bbbそのものしか読み取れていません。 自分としてはここで ./bbb 1 -2 -1 2 でargcの値が5になるようしたいのですが、 このようなパイプの使い方は間違いでしょうか?
>>321 大間違い。パイプの使い方の勉強してらっしゃい。
要は、標準出力と標準入力を繋ぐだけだから。
>>320 おいおい、recv()しているスレッドをいきなり殺しちゃ拙いだろ。
>>322 ではサーバーとの接続をぷちって切りたい時は
どうすればいいのでしょうか?
324 :
315 :2007/05/19(土) 01:01:18
>>320 長い答え:
ブロッキングモードでひたすらrecv()ループをしているんだな。
確かに簡単だが、それでは綺麗にスレッドを終了させられない。
1)ブロッキングモードでrecv()を使う代わりに、
例えばasynchronousモードでWSARecv()+WSAGetOverlappedResult()を使う
2)スレッド間通信用にEventを作る。そのスレッドを止めたい場合は
外からSetEvent()でやんわりと「お願い」する。
3)受信スレッドでは、WSARecv()でトリガした受信の完了と上記のイベントの2つを、
WSAWaitForMultipleEvents()などを用いて、同時に待つようにする。
4)SetEvent()によって待機から抜けた場合は、スレッドが自分で終了する。
こんな感じにすればできるぞ。まあ、基本的なテクニックだが。
>>324 初めて聞く関数がいっぱい出てきたので
ちょっくら勉強してきます!
まあ要するに、recv()という「外(他スレッド)からブレーク出来ないもの」を使う代わりに 他のもので待機してrecv()ではブロックしないようにする、ということだな。 ネットワークでは誰もが必要とすることなので、対処法もほぼ確立してる。 一般的には「select系」と呼ばれるけど、Windowsにもそれに向けた方法が用意されている。
327 :
デフォルトの名無しさん :2007/05/19(土) 02:54:08
OS依存しない現時点でC++の仕様を網羅した入門的教科 書ってなにかよいのないでしょうか。 クラスとかSTLのさわりのところまで知っているのですが 数年やっていなかったので今どういう機能が投入されている のかわかりません。図書館でパラパラみていたら 「詳説C++第2版」というのが値段も含めて よいかなと思ったのですが。
CALLBACK関数内で変数の宣言をすると処理が重くなりますか?
>>328 ↓のどっちと比べて重くなるって言ってるの?
1.CALLBACKじゃない関数で変数の宣言をする
2.CALLBACK関数内で変数の宣言をしない
330 :
328 :2007/05/19(土) 03:05:34
すみません。 1.CALLBACKじゃない関数で変数の宣言をする です。
>>327 興味を持ってるところに水を差して悪いが…
>クラスとかSTLのさわりのところまで
このレベルで「最新の仕様」を知る事に意味があるのか?
それならまだ知らないC++の基本を押さえるのが先じゃないか?
332 :
デフォルトの名無しさん :2007/05/19(土) 03:19:00
C系のを中断してLispとかHaskellあと言語そのものを作ったりとか とかしばらくやっていたので 今度は今のC++らしいところが全体的に知りたいっていう かんじなんです。 そのあたりの気分を理解していただけますでしょうか。
それなら安心して Effective C++
334 :
デフォルトの名無しさん :2007/05/19(土) 03:50:56
質問ですが、ワードパッドの[ファイル]メニューの[送信]コマンドのように 既存の標準電子メールソフトから送信用ウィンドウを呼び出す機能を実現するには どうすれば良いのでしょうか?
gcc -pg でコンパイルしたらそれまで出てなかった Detaching after fork from child process XXX と言うメッセージ出るようになったんですけど、これは何ですか?なにか問題あるでしょうか?
>>334 「ファイル名を指定して実行」で
mailto::
やってみれ
337 :
334 :2007/05/19(土) 06:52:25
338 :
304 :2007/05/19(土) 07:10:12
>>305 答えてくれてありがとうございました。
が、関数とか全くと言っていいほど知らないので、書いてくださったコードは理解できませんでした・・・。
どうにか自分のコードをちょちょいと直してコンパイルエラー無くなるようにならないでしょうか?
もし良ければお答え下さい。
>>306 >JavaかC#でもやっていたのかもしれないけど
すみません、全くのプログラミング初めて2ヶ月の初心者です
配列の先頭要素のアドレスを渡すには配列名を書けばいい、と本に載っていましたが、それでいいんですよね?
関数内でいじった配列を、元のところに戻してやるとき、returnの後と、関数の戻り値の型はどう書けばいいのか教えてください;;
>>338 上手くいかないというのは、知識が足りていない事の証明。
解らないと思うなら、他人に聞く前に死ぬ気で調べなさい。
その方が自分のためだよ。
配列とポインタの関係について、ぐぐりつつ、テストコードを書きつつで、
ちゃんと基本を押さえれば、難しいことはないよ。
340 :
304 :2007/05/19(土) 07:44:56
そうですね。甘えてました。 出直してきます。 ありがとうございました!
>>338 配列を関数で変更したいだけなら、例えばこれだけでいい。
void incrementArray(int * foo, unsigned nFoo)
{
for (int ic = 0; ic < nFoo; ++ic) {
++foo[ic];
}
}
別の配列にコピーする場合も、関数で配列を新規に確保するのは判り難いからやめた方がいい。
void copyArray(int * bar, int const * foo, unsigned nFoo)
{
for (int ic = 0; ic < nFoo; ++ic) {
bar[ic] = foo[ic];
}
}
342 :
デフォルトの名無しさん :2007/05/19(土) 07:50:14
コピーのほうの仮引数名は fooだのbarだの書かずにsrc,destにしようぜ。
343 :
デフォルトの名無しさん :2007/05/19(土) 07:51:54
Linuxでの初心者の質問です。 C++のstd::sort(v.begin(), v.end())のsort()の実装を見てみたいのですが、 どこをみればよいのでしょうか。 関数ポインタ2つだけを引数にしなくても、v自体を引数にする仕様の方が 自然な感じがするのですが。。。 どなたかよろしくお願いします。
>>343 それでは「配列」か「コンテナ」か、どれか一つの全体しかソートできない。
例えば、vectorの二番目からソートしたいかも知れない。
>>343 ディストリビューションによるけど、たとえば
/usr/include/c++/*/bits/stl_algo.h
渡しているのは関数ポインタじゃなくて、イテレータオブジェクトだよ。
範囲を指定できるようにしておけば、コンテナの全体をソートするのも
一部をソートするのも同じ使い方にできるから、いい設計。
346 :
332 :2007/05/19(土) 08:48:50
>それなら安心して Effective C++ どうもありがとうございました。読んでみます。
>>327 入門的教科書の条件は満たさないが、規格書でも買っとけば?
>>330 変数の型が糞重たいコンストラクタ/デストラクタを持ってるクラスだったら重くなるだろうね。
まぁ環境による
執筆中かよw いつ出版されるんだ?w
>>327 その本俺持ってるけど、初心者には詳しく書きすぎてあって読んでいる
うちに眠くなるよ。
独習C++などの問題集を一通りやってみてはいかがかな。あれなら
一冊やり終えた所である程度の力が付く。
>349 諦めとけ。 Kusakabe氏と猫王(猫皇)氏の参加コミュニティには近付かないが吉。 自分も「なるほど、考え方の違いですね」などと発言したら 「バカにするのもいい加減にしてください」とか返されてビックリですよ。詳細曖昧でごめん。
ミクシィ(笑)
2ch(笑)
独習C++、exceptional C++以外にC++の問題集ってありますか?
C with Classes 問題集
そのK氏、マイミクのマイミクなんだよなあ…… なんであんなキチガイと付き合いあるんだろうあの人。
A man is judged by the company he keeps. 類は友を呼ぶ。 キチガイの知り合いはキチガイ。
つまり359は無自覚のキチガイ
話題に対して関係ない人についての言及は思わぬ蛇を出させる
>>363 デバッグくらい自分でしろよ。
デバッグの過程で学ぶ事は、プログラムを書く事以上にあるんだぞ。
わからないので書き込んだのですが…
わかってて書き込んでたらそれはさすがにまずいだろ
>>363 とりあえず、データが一杯の時に
「どういう動きにしたいのか」
「実際はどういう動きをするのか」
を、まとめてみるのはどうだろうか
Aという起動中のプログラム(既存)のウィンドウを、Bというプログラム(自作)から開きたいです。 できるだけ簡単に開く場合はどんな方法がありますか?(SendMessage?) Aのウィンドウはメニューから開くタイプでアクセラレータキーは付いていません。
std::vectorについて質問です。 #include <vector> template <class T> class test{ public: test(T a){ data.resize(1); data[0] = a; } const T& getData() const{ return data[0]; } private: std::vector <T> data; }; int main() { test <bool> a(true); a.getData(); test <int> b(0); b.getData(); return 0; } boolで初期化された方にはVC8、GCC3.4共に、テンポラリのリファレンスを返すと怒られてしまいます。 boolとintでどのような違いがあるのでしょうか? 識者の方、ご教授お願いします。
>>371 Effective C++第18項
vector<bool>の返す型はbool*ではなくvector<bool>::reference型だから
参照は返せない。だから値で返すしかない。
const T& → const T
内部でプロキシオブジェクトを使っているのでアドレスが取れないため。
×Effective C++ ○Effective STL
なるほど、vector< bool >にそんな事情があったとは。 const T& → const T にすると、vectorの中身によっては、 コピーが馬鹿にならない場合もあるので、この制約は嫌らしいですね。
>>374 一応補足しておくと、
const T となるのは vector<bool> ’のみ’ね
376 :
デフォルトの名無しさん :2007/05/20(日) 11:15:08
コピーが気になるなら、boost::call_traitsみたいな感じで 適切な戻り値の型を選ぶようにすればいいんじゃないかな。
>>370 C/C++、関係ナクネ?
プログラムAがどういう実装で新しいWindowを生成してるか
分からないとBからじゃ無理だと思うけど。
378 :
370 :2007/05/20(日) 12:31:22
分かりにくくてすみません。 プログラムAはWindowsアプリケーションで、 TrackPopupMenu(ショートカットメニュー)からCreateWindowExでウィンドウを開いているようです。 プログラムBはC++(またはC)で作ります。
もうちょい詳しく。 てか、APIスレ行こうぜ
380 :
デフォルトの名無しさん :2007/05/20(日) 12:49:15
WM_COMMANDとメニューIDを SendMessageで送りつければいいんじゃないの?
VC++のリストボックスについて、行き詰ってしまいまして、質問させて下さい。 環境はeMbedded Visual C++ 4.0 / windows CE です。 リストボックスにあるスクロールバーを使用せずに、別スクロールを付加させて、 リストボックスの動きを制御させています。 垂直スクロールに関しては、リスト数を取得して、スクロールバーで制御が出来るのですが、 水平スクロールがうまくいきません。。 リストボックス内では、文字列が途中までしか表示されておらず、 水平方向専用のスクロールバーを付加したのですが、 リスト内における表示位置(文字列の表示位置について)が取得&設定出来れば、 擬似スクロールが可能かな、と思ったのですが、取得することが出来ませんでした。 例えば、リストに水平スクロールをつけてしまい、そのスクロール部分を隠してしまい、 別スクロールから操作しているように見せかける、ということも考えたのですが、 その場合のリストについている水平スクロールの表示位置も取得できず。。。 もしかしたら、リストのスクロール位置が取得出来る方法があるのかもしれませんが、 申し訳ないのですが、調べたのですが、いまいち、探すことが出来ませんでした。 何かいい関数や処理がないかなぁ、、と行き詰っている状態です。 どなたか、いい方法をご存知の方がいらっしゃいましたら、教えていただけますでしょうか。 よろしくお願い致します。 追伸:もし、VC自体にそのような関数や処理方法がないのであれば、 別リスト(コピーリスト)を用意して、表示の仕方で擬似スクロールするように 見せかけるしかないのかなぁ。。。と悩み中です。。
switch文のcase句の条件を(ほぼ)同時に満たしたら下記の場合どうなるんでしょうか? int nCount; switch (a) { case1: nCount=0 break; case2: nCount=1 break; }
>>382 switchを通った時点の数値で評価される
一回で評価される式は1つ つまりほぼ同時に満たすと言うのは a == 0x01 && a == 0x02の時 これを満たすようなaは果たして存在するか?
switchとifは実行速度の面では一緒ですか?
386 :
382 :2007/05/20(日) 16:18:06
>>384 case1とcase2をそれぞれ満たす違う値のaがほぼ同時に入ってくるということです。
>>383 でしたら下の場合nCountは3になるんでしょうか?
int nCount=3;
switch (a)
{
case1:
nCount=0
break;
case2:
nCount=1
break;
}
switch通過後にnCountの値が3になるのはaが1でも2でもない場合
>>386 >case1とcase2をそれぞれ満たす違う値のaがほぼ同時に入ってくるということです。
___ ━┓
/ ―\ ┏┛
/ノ (●)\ ・
. | (●) ⌒)\
. | (__ノ ̄ |
\ /
\ _ノ
/´ `\
| |
| |
___ ━┓
/ ― \ ┏┛
/ (●) \ヽ ・
/ (⌒ (●) /
/  ̄ヽ__) /
. /´ ___/
| \
| |
389 :
デフォルトの名無しさん :2007/05/20(日) 16:23:06
>>368 素数を定数配列で持っとけ。1,000,000までの解を求めるんなら
1,000( == √1,000,000 )以下の素数データがあれば十分。
素数を定数配列使うのが邪道だと思う場合でもせめて素数だと
わかった値はどっかにプールしといて再利用しれ。
スコープの問題か ブロックローカルのa、関数ローカルのa、クラスメンバのa、グローバルのa と色々あっても優先順位がちゃんと決まってるから入る評価されるaは唯一つだよ
volatile変数なんだろ。
おーい誰かエスパー呼んで来い
まさかとは思って念のため
>>382 のコードをコンパイルしてみたが
エラーもワーニングもでなくてワラタ。
>>382 case 1: と case1: じゃ全然意味が違うから気をつけてね♪
>>393 case 1のコロンがなくてもGCCでコンパイルできるよ
それはない。
396 :
382 :2007/05/20(日) 16:43:20
混乱させてしまって申し訳ないです。
グローバルフックのコールバック関数で以下のようにしてて、
AとBのウィンドウがあって、Bのウィンドウがアクティブな時にAのウィンドウをアクティブにすれば
BのWA_INACTIVEとAのWA_CLICKACTIVEがほぼ同時に飛んでくるんではないでしょうか?
この場合nCountの値はどうなるんでしょう?
int nCount=0;
case WM_ACTIVATE:
switch (lp->wParam)
{
case WA_ACTIVE:
case WA_CLICKACTIVE:
nCount--;
break;
case WA_INACTIVE:
nCount++;
break;
}
>>382 は文法めちゃくちゃでした。
queueがあるから同時じゃないよ
>>396 switch文の外にあるcase WM_ACTIVATE: は本当にエラーにならないか?
まずWA_INACTIVEが呼ばれて次にWA_CLICKACTIVEが呼ばれる。 つまり nCount=0; nCount++; が実行されてから nCount=0; nCount--; が実行される
breakしてるからfall-throughはしないんだろ?
>>400 お前さんも質問者の言ってることが解ってないようだが、
質問者はそんなレベルじゃない勘違いをしている。
まああれだ、変数(または関数)と値というものの区別がついてないんだな、たぶん
403 :
382 :2007/05/20(日) 17:05:01
まだいくつか省略してますがどこがおかしいのでしょうか?
>>399 ありがとうございます。見直して成功したら報告させて頂きます。
>>385 コンパイラによってはテーブルジャンプにしてくれる場合もあるとか
まぁ環境によるので実測しなさい
>>404 それを言うならジャンプテーブルだろ、馬鹿w
それからコンパイラによってはっていうよりそもそも
ジャンプテーブルに変換する為のモンだぞ、switch は。
確かに状況により必ずしもジャンプテーブルになるわけじゃないが。
万単位の分岐をelse ifのはしごで書くと 結構はっきり違いが分かるらしい
そこまで作るのがここに何人(ry ごめんなさい妬みですorz
int型の整数の中に、任意の整数が含まれているか調べる方法ってありますか? たとえば int a = 1234; があって、この中に3という数値が含まれてるかどうか、みたいな感じです。 文字列として扱ってしまえばできそうなのですが、intからcharにキャストすると どうもおかしくなってしまって・・・ よろしくお願いします
sscanf
10で割って一桁ずつ見ていけばいいでしょ
sprintfしてstrchrで探すとか。
412 :
410 :2007/05/20(日) 18:27:24
1の位を見るにはa%10
>intからcharにキャスト toString()ではいかんのか? (Cなら >411 だが)
itoa系列の関数を使うといい
itoa()は標準関数じゃないよ。
ごめんちゃい><
417 :
408 :2007/05/20(日) 19:15:16
いろいろとどうもです sprintfの存在を初めて知りました それで挑戦してダメだったら1桁ずつ見ていきたいと思います
速度求めるなら一桁ずつ見る方法の方がいいよなO(N)未満だし
>>381 です。
なんとか、少しづつ進んでみたのですが・・・。
現状のリストについている水平スクロールの値は取得&設定できました。
でも、設定をすると、リストの水平スクロールは稼動するのですが、
リストは一緒に動いてくれません。
どうしたら、リストも一緒に動いてくれますか?
GetDlgItem(IDC_リストコントロール)->GetScrollRange(SB_HORZ ,&iMin,&iMax);
iTest = GetDlgItem(IDC_リストコントロール)->GetScrollPos(SB_HORZ);
GetDlgItem(IDC_リストコントロール)->SetScrollPos(SB_HORZ,iTest+5,true);
>>368 >>389 直観的方法だけど、
・必要な素数列を最初に求める。
・1は定義より含まれないことが自明なので2から始める(2も自明のような気がするけど)。
・任意の数の友愛数は二つ以上ないと仮定して(証明されてるのか知らん)、既に友愛数になった数はスルー。
・求めた素数列を使って素因数分解してから組み合わせを網羅して約数列を作る。
・約数列の合計を求めて元の数より小さければその数は既に調べているのでスルー(等しいということはないだろうけど一応含めてスルー)。
・そうでない場合はその数の約数列を作り合計を求めて元の数と比較し、一致していれば友愛数。
ttp://www.geocities.jp/krtcw777/amicable_numbers.txt この方法だと
>>368 の環境で1000000まで30分どころか30秒もかからない(と思う。当方Pen4 2.53GHzで28秒)。
はじめて質問します。よろしくお願いします。 switch文で、int型の特定の値を入力するまで処理を繰り返すものを作っているのですが、 (1、2、のメニュー番号を入力するまで繰り返す、など) int型(1)ではなく、1.0やaなど指定されたもの以外入力すると 無限ループになってしまい、処理を抜けることができません。 画面に表示された番号以外打ち込むなと言いたいところなのですが…。 これを避けるためにはどのようにcaseを設定したらよいのでしょうか? よろしくお願いします。
default:
>>421 switchの前でscanf()を使って入力しているのなら、fgets()+sscanf()に変更してみることお勧め。
O(N^2)台のアルゴリズムはまだかね
>>368 >>427 のオーバーフロー耐性を強化
yakuwa[i]=yakuwa[i_copy]*(i/i_copy*j-1)/(j-1);
↓
yakuwa[i]=yakuwa[i/j]+yakuwa[i_copy]*(i/i_copy);
定数の割り算は、かけ算に自動的に直されてしまうのですか?
>>429 そんな事はないけど大抵はコンパイラの最適化によってそうなる
理由は割り算よりかけ算の方が大抵のCPUで速いから
ツリービューコントロール等で項目が選択された場合に、何番目の項目が選択されたか調べたいのです。 WM_NOTIFYメッセージを捕まえて、何番目の項目が選択されているか調べているのですが、どうやら この方法だとツリービューコントロールが選択される直前に選択されていた項目の値が返ってしま います。 恐らくWM_NOTIFY以外のウィンドウメッセージを捕まえるべきなのでしょうが、どのメッセージを 捕まえればよいのでしょうか?
TVN_SELCHANGED
>>432 ありがとうございます。
しかしTVN_SELCHANGED メッセージはそのままでは取得できないんですね…。
色々と面倒そうですがやってみます。ありがとうございました。
WM_NOTIFY を捕まえてるのに、そのままでは取得できないってのは無いだろう。
>>434 すみません、リストビューの扱いを間違っていました。
ちゃんとTVN_SELCHANGEDでそのままメッセージを取得できました。
重ね重ねアドバイス感謝します!
リストビュー? ツリービューじゃないのか?
あ、ツリービューでした。
438 :
デフォルトの名無しさん :2007/05/21(月) 20:13:33
class Foo { public: Foo(bar b); func(); private struct Impl; smart_ptr<Impl> pimpl; }; があった時、インスタンス化されたFoo型のオブジェクトfのfunc()を 関数オブジェクトにしてSTLのアルゴリズムに渡したいんですが (理由:func()はFooのコンストラクタによって初期化されたメンバpimplを利用する)、 どうすればいいんでしょう? 出来れば関数ポインタではなく関数オブジェクトとして扱いたいです
boost::function<int ()> f = std::bind1st(std::mem_fun(&Foo::func), that); だって、boostのチュートリアルに書いてあった
boost::bind(std::mem_fun(&Foo::func), &f)
回答ありがとうございます、上手く行きました。 しかしこんな奇怪なコードが通ることについてとても不思議に思います。
442 :
デフォルトの名無しさん :2007/05/21(月) 21:45:31
質問です。 プログラム初心者の質問なんですが、 プログラム上で指定したフォルダに、ファイルがいくつ格納されているのか? また、どんな名前のファイルなのか調べる方法はないものでしょうか?
あります。
あげてしまいました。ごめんなさい。 あと環境はC++です
>>442 Windows環境なら、FindFirstFile でぐぐるとよろし
>>442 Win32ならFindFirstFile/FindNextFile
>>442 Win32APIを使うならFindFirstFile、FindNextFile、FindClose。
<boost/filesystem/operations.hpp>あたり
421です。 いただいたヒントとatoiで修正することができました。 どうもありがとうございました。
442です ありがとうございます。 環境はWindowsなので、FindFirstFileでいいようです。 例になるコードもぐぐれたので、なんとかがんばってみます!
>>439-441 boost::bind なら↓でおk
boost::bind(&Foo::func, _1)
>448 全然一致してないじゃん
tr1::bindでもいいよ
二次関数(y = a x^2+ bx +c)でxがx1 <= x <= x2のときの最大値と最小値(そのときのxの値も含めて)を求めるプログラムを作成せよ。 ここでa,b,cは整数、x1,x2は浮動小数とする。 数学の発展課題として出されたのですがさっぱり分かりません。 どなたか手を差し伸べてください・・・orz
C++の質問なのですが、 配列:123224があるとして、2の要素数だけを取り払い、前詰めをして 配列:134にするには、どのような方法がありますか? お願いします。
458 :
457 :2007/05/22(火) 03:13:32
Deleteを使わない方法がありましたら、それをお願いします
459 :
デフォルトの名無しさん :2007/05/22(火) 03:21:13
Deleteというのが何なのか知らんが、 std::vectorと共通アルゴリズム使えば一発じゃないか?
>>457-458 配列って std::vector のことか?
結果の要素数が変わってるんで、組み込み配列じゃないんだろう。
だったら remove + erase でいい。
"Delete" って delete 演算子のことか?
new を使ってないなら使うもクソもねーよ。
>457 #include <vector> #include <algorithm> #include <iostream> using namespace std; int main(){ int array[] = {1,2,3,2,2,4}; vector<int> vi(array, array+6); vi.erase(remove(vi.begin(), vi.end(), 2), vi.end()); for(int i=0; i<vi.size(); i++) cout << vi[i] << ' '; cout << endl; return 0; }
>>368 です
>>389 >>420 >>425 >>427 さん、レスありがとうございます。
素因数分解を使うと手っ取り早く約数が計算できるのですね。
後でwikipediaを見て知りました(汗
あと、本探索部分もいらないループしてましたし。
プログラムを書いていただいたお二方もありがとうございました。
>>427 さんのプログラムだと2秒で終わりました!
素因数分解の方法とか、ためになります。(まだ、ちゃんと読めてないですけど)
ありがとうございました。
うーむ・・こんなにも差が出るもんなんやね・・ アルゴリズムの大切さをあらためて実感した。
>>462 約数の和
例
60 の場合
60= 2^2 * 3^1 * 5^1
(60の約数の和)=(2^0 + 2^1 + 2^2)*(3^0 + 3^1)*(5^0 + 5^1)
=(1+2+4)*(1+3)*(1+5)=168
>>427 のアルゴリズム
60=2^2*15
(60の約数の和)=(15の約数の和)*(2^0 + 2^1 + 2^2)
=(15の約数の和)*(2^3-1)/(2-1)
>>428 のアルゴリズム
60=2^2*15
(60の約数の和)=(15の約数の和)*(2^0 + 2^1 + 2^2)
=(15の約数の和)*(2^0 + 2^1) + (15の約数の和)*2^2
=(30の約数の和) + (15の約数の和)*2^2
C++で値クラスを作る際に、Cスタイルの構造体を選択した場合、 コンストラクタのオーバーロード (引数なしでメンバは全てゼロ、または指定引数で初期化といった動作をさせるため) すること、さらに考えを進めて振る舞い、つまりメンバ関数を持たせることって良くないんでしょうか?
凸包を調べるためにQhullを使ってるんだけど、頂点配列points[i]から 凸包の外周要素に使われた点の添字を抜き出す方法って無い? 色々やってみたけど、外周要素の点の座標しかもってこれないです。
構造体にメンバ関数を持たせることに対する文法的な質問? それとも比較的どうでもいいコーディングスタイル的な質問? 前者なら、文法上可能。 classとstructはデフォルトのアクセス修飾が異なるだけでなんら問題なし。 後者なら、好きにすれば?としか言いようがない。
469 :
デフォルトの名無しさん :2007/05/22(火) 13:15:52
|は演算子ですか?こういう使い方みるんですが a(x|y,z)
入門書に書いてあるような事を聞かない。
471 :
デフォルトの名無しさん :2007/05/22(火) 13:18:57
じゃあスレタイに初心者歓迎なんてつけないでください
読んでも分からない事ならいいが、 読めば誰でも必ず分かる事を聞かれても困る。
473 :
デフォルトの名無しさん :2007/05/22(火) 13:28:11
1か0かって書いてたんで変数1か0しか無意味ということですか?
演算子ですよ
x|y ビットOR x||y 論理演算OR
476 :
デフォルトの名無しさん :2007/05/22(火) 13:30:59
ビットOR の使いかたがわかりません
各ビットでORが必要になったら使う 必要でなかったら使わない
y==11001010 x==00110101 z=x|y z==11111111
たとえば a = 99|137;//aには235が代入される 01100011 (99) 10001001 (137) ---------ビットOR 11101011 (235)
こんなのにわざわざ…
おまいら親切だな
>>471 モノには順序(ry
うん、俺今ちょっと気分いいんだ。
惚れました(*´ェ`*)
誰かcygwinでwhileを使った九九のプログラムの作り方を教えてくれませんか(´д`)
宿題は自分で。
ポインタを初期化もして無いくせにrealloc使うな。 どうしても使いたきゃNULLで初期化してから使え。
つーか、 struct late data[20];//とりあえず、20個分 struct late *memp=data;//↑のデータの最初のアドレスをmempに 配列のアドレスで初期化しとる。 初期化しなければ、グローバル変数だからNULLが入るんでうまくうごいたのにね。
reallocの動作を勘違いしてる
489 :
485 :2007/05/22(火) 16:52:22
む・・・良く分かんない・・・・・・orz reallocの一つ目の引数には、中身が入ったポインタを指定してはいけないって事ですか?
>>489 一つ目の引数は必ずmallocやreallocで取得したポインタ(か、NULL)
同じ位置で指定したサイズが取得できないと、別の場所でallocしなおして
最初のやつはfreeされる。
491 :
485 :2007/05/22(火) 16:57:11
>>490 あ、分かりました。
struct late data[20];//とりあえず、30個分
struct late *memp=data;//↑のデータの最初のアドレスをmempに
↑の部分を
struct late *memp;
memp = (struct late*)malloc((sizeof(struct late)) * 20);
こうすればいいんですよね?
>>491 まあそういうこと。
そして、reallocするということは、それが常に同じアドレスとは限らない。
493 :
485 :2007/05/22(火) 17:01:35
>>492 ありがとうございました。物凄く勘違いしてたっぽいですねorz
勉強になりました。
>>466 C++/CLIでのことだったらそっちのスレで聞いたほうが的確な助言がくると思うぞ。
>>495 なんで hoge.h がエラー扱いされてしまうのかは俺も少々不可解だけど、
bcc32 a.cpp hoge.cpp
でおk。hoge.h は a.cpp と hoge.cpp から include される対象に
過ぎないからコンパイルする必要は無し。
.hをコンパイルすると、C++じゃなくて、Cとして コンパイルされるんじゃないの。
ああ、なるほど。
>>496-497 うわぁああ出来ました!!
そうか、iostreamとかもコンパイルの時書かないですしね><
分割するの初めてだったからファイルの書き方間違っているのかと
今日一日中ネットや本で調べたけど分からなかったのでホントに嬉しいです・・・(;△;)
まさかそっちのやり方が間違っていたとは。
ありがとう、本当にありがとうございます><
(;△;)
501 :
デフォルトの名無しさん :2007/05/22(火) 22:49:01
オーム社「C言語によるプログラミング[応用編]」(第一版) サンプルプログラム sample2 myform.c をそのまま写して、コンパイルしたところエラーがでました。 環境は、 gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21) です。 エラー出力は、 myform.c:57: error: two or more data types in declaration specifiers myform.c:104: error: conflicting types for ?。GetArg?「 myform.c:57: error: previous declaration of ?。GetArg?「 was here myform.c:256: error: conflicting types for ?。LineAdd?「 myform.c:58: error: previous declaration of ?。LineAdd?「 was here int GetArg( int, char *[], int *, int *, int *, int *, char [] ); int GetArg( int argc, char *argv[], int *column, /* カラム数 */ int *line, /* 行数 */ int *upper, /* 上余白行数 */ int *left, /* 左余白行数 */ char file[] /* 入力ファイル */ ) int *LineAdd( char *, char *, int ); char *LineAdd( char *to_buff, char *from_buff, int num )
502 :
501 :2007/05/22(火) 22:51:35
このエラーの原因を知りたいのですが、 ヒントやポインタをおねがいします。 一番下のこの部分は無視してください。 int *LineAdd( char *, char *, int ); char *LineAdd( char *to_buff, char *from_buff, int num ) _
どこが57行目?
int GetArg( int, char *[], int *, int *, int *, int *, char [] ); int GetArg( int argc, char *argv[], int *column, /* カラム数 */ int *line, /* 行数 */ int *upper, /* 上余白行数 */ int *left, /* 左余白行数 */ char file[] /* 入力ファイル */ ){ return 0; } とりあえず、gcc 3.4.6にかけてみたけど、エラーなんて でなかったぜよ。
506 :
501 :2007/05/22(火) 23:03:33
57行目 int GetArg( int, char *[], int *, int *, int *, int *, char [] ); 104行目 int GetArg( int argc, char *argv[], int *column, /* カラム数 */ int *line, /* 行数 */ int *upper, /* 上余白行数 */ int *left, /* 左余白行数 */ char file[] /* 入力ファイル */ ) です。 myform.c:256: error: conflicting types for ?。LineAdd?「 myform.c:58: error: previous declaration of ?。LineAdd?「 was here は無視してください。
507 :
501 :2007/05/22(火) 23:06:50
>>504 int GetArg( int, char *[], int *, int *, int *, int *, char [] );
^^^
このセミコロンのことでしょうか?
>>505 わざわざコンパイルしてくださって、ありがとうございます。
お手数かけてすいません。
これから、自分の環境でその部分だけコンパイルしてみます。
508 :
501 :2007/05/22(火) 23:11:45
>>505 をコンパイルしたところ、自分の環境でもエラーはでませんでした。
ほかに GetArg関数に関係があるところは、メイン関数でよびだしたこの場所だと思います。
なにかまちがえたことをしているでしょうか。
int main ( int argc , char *argv[] )
{
int column, line, upper, left;
char file[SMALL_BUFF_SIZE];
int result;
/* main引数取得 */
result = GetArg( argc, argv, &column, &line, &upper, &left, file );
「基本クラスにあるprotectedなメンバ関数を、 派生クラスで名前も処理も変えず、publicに昇格する」 というのは、 class base { protected: int hoge() { ... } }; class derived : public base { public: int hoge() { return this->base::hoge(); } }; こんな感じになりますか? それとも、もっと簡単にできますか?
名前も処理も変えないんだったらオーバーライドする意味無いやん さらに言えばprotectedにする意味無いやんhoge()はpublicにすりゃいいやん って思ったんですがどうでしょう?
511 :
501 :2007/05/23(水) 00:09:27
エラーの原因がわかりました。
57行目の int GetArg( int, char *[], int *, int *, int *, int *, char [] );
の前にある、
enum
{
NORMAL_END, /* 0 */
USAGE_ERROR, /* 1 */
FILE_ERROR /* 2 */
};
^^^^
このセミコロンが欠けていました。
>>504 さんのいうとおりでした。
おさわがせいたしまして、どうもすいませんでした。
レスくださった方たち、ありがとうございました。
using base::hoge; でよくね?
514 :
デフォルトの名無しさん :2007/05/23(水) 12:47:58
>>514 よく見てないけどこんなのは?
extern "C" {
#include "SFMT.h"
}
#include<iostream> #inlucde<iostream.h> C++でのこの2つって何か違いがあるんですか?
はい。
後者は過去の遺産。
積極的に.h無しが推奨される理由があるなら教えて頂きたいです>< Cの勉強始めた時から.h有りで書いていて慣れていたので。
規格に書いてあるから。
違いがあるから
iostream.h の方は std 名前空間に入ってないから。
>>516 iostream.hの方が入出力が速い処理系があります(VC6とかVC6とかVC6とか)。
でも既に古いC++です。
>>522 し、正直よく分からないけどあなた様のレスのコピペを保存して
賢くなったら読み返して理解してみます><
>>523 ありがとうございます。
新しい処理系だと.h無しの方が処理が速いんですね。
参考になりました><
>>524 >518とか>520も無視すんなや。ちゃんとメモしとき。
それからついでに。
>新しい処理系だと.h無しの方が処理が速いんですね。
誰もそんなこと書いていない。
>>525 いや、2chでよくあるYES/NOレスみたいな感じで
スルーか微妙だったから具体的に教えてくれた人にレスしたんだ。
もし気を悪くしたらごめんです。
それと昔は.h有りの方が速かったけど今は
>>522 さんが言った理由な感じで
.h無しの方が良いから処理速度は.h無しでも変わらなくなったってことかな?
なんだか分かったような分かってないようなだけど突っ込んでくれてありがとう><
処理速度なんて関係ない。 要は.h有りは古い規格で、今は.h無しが標準ということ。 実際VC++では2003あたりから標準に則ってiostream.hは提供されなくなった。
528 :
デフォルトの名無しさん :2007/05/23(水) 15:49:52
礼儀のなってない自称初心者ほど嫌われるものはない。
>>527 つまりその名前空間云々で.h無しの方が良くて、
その規格に合わせて処理系も変わってきたから.h無しが推奨されると。
という把握をしてみました。
とりあえず名前空間云々を可及的速やかに勉強してみます><
>>528 うん、なんだかごめんです。
「規格だから」「過去の遺産」「違いがあるから」的なのじゃなくて
「どうしてそういう規格でどう違いがあって」的な理由を聞きたくて
「うん」とか表面的な答えの人は2chではあまりちゃんと答えてくれない
経験則から他の人にだけレスしてしまった。
気を悪くしていたら反省している。
他の板には余りないこの板の特徴かも知れんが、 「答えだけ書くから後は自分で調べろ」的なパターンかもね。 兎にも角にも>529は「書いてあるものを読み」、「書かれてないことを読まない」ようにしないとな。
自分で答えを決め付けてから読むから 回答者の意図なんて全然読み取れてない
>>531 こんだけ反省してるって言ってるんだから、
流石にいい加減しつこいというか。
質問者だけにやたら厳しいが仮にも初心者歓迎謳ってるんだから
回答者にもある程度誘導的な姿勢は必要だとも思うし。
いつまで苛めてんだ。カルシウム摂れ。
いつまでもいいんだ。カルシウムくれ。
煮干が美味いんだ。昆布でダシは邪道
質問です 最近C++(つかプログラミング)を始めた者です 入門書「やさしいC++」を読んで、一通り簡単な文法とかは理解したんですけど、 この板に出てくるソースによくある、関数の種類とかについては全く分かりません。 そろそろコンソールアプリケーションじゃなくて、ウインドウのソフトも作ってみたいと思うんですが、 どうやら、関数をいっぱい知ってなきゃ作れないらしいですね。 これから自分はどんな本,どんなサイトを見て勉強していくべきなのでしょうか?
やれやれ。そろそろネタばらしでもしてやるか。 昔はインクルードするものと言ったらヘッダーファイルで当然だったのだが 果たしてヘッダーファイルが実在する必要があるのか、 それを規格で要求するべきなのかと言う議論があった。 そのためにいかにもファイルの拡張子っぽい.hをなくし、 コンパイラは標準ライブラリのヘッダーをインクルードしている部分を 通常のインクルード処理ではなく、対応する標準関数その他を有効にする 単なるスイッチとして使うことを許すようにした。
質問です。 typedef float Vector3[3]; なんてtypedefをしたんだけど。 vector<Vector3> vec; vec.resize(10); が通らない。 vector<float> vec; vec.resize(10); なら通るんだけど。 どうして?
>>539 配列にはそのまま代入ができないので、無理。
vectorが内部で何やってるか考えてみようぜ
542 :
デフォルトの名無しさん :2007/05/23(水) 20:54:27
ここで聞いて良いのか分からないのですが、間違っていたらすみませんが誘導お願いします VC++の初心者質問なんですがCOMインターフェイス使って#import する場合 例えば、エクセルなんかの場合 ##import "C:\Program Files\Microsoft Office\Office\excel9.olb" rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") rename("DocumentProperties", "DocumentPropertiesXL") no_dual_interfaces とかやるんですが、これはビルドしたときにexeに組み込まれちゃうんでしょうか? もしくはexeが実行したときにオブジェクトライブラリが読み込まれるのでしょうか?
>>542 excel9.olbの内容はコンパイル時にのみ参照される。
実行時にexcel9.olbは不要。
>>539 vector<vector<float> > vec; でいいじゃん
resize()は要素分行う必要があるので面倒だけど
545 :
デフォルトの名無しさん :2007/05/23(水) 21:29:35
>>544 struct Vector3 { float vec[3]; };
vector<Vector3> vec;
の方がいいんじゃないか
>>539 struct Vector3 {
float a;
float b;
float c;
};
vector<Vector3> vec;
abcよりもxyzのほうが的確だと思う
そんなことはどうでもいいと思う
M$のABC構造体とかふざけた名前のやつを思い出した
フォントの幅だっけ?
ABCD包囲網だな。CとDがうぜえ
553 :
デフォルトの名無しさん :2007/05/24(木) 19:01:31
VC++2003でexeのプロジェクトを別のexeで参照設定する事はできますか??
--------------------------- Microsoft Development Environment --------------------------- '○×△□.exe' への参照を追加できませんでした。 これは有効なアセンブリまたは COM コンポーネントではありません。拡張子 'dll' を持つアセンブリまたは COM コンポーネントのみを参照することができます。ファイルがアクセス可能で、有効な アセンブリまたは COM コンポーネントであることを確認してください。 --------------------------- OK ---------------------------
COMコンポーネントじゃないので、できませんという事ですね。 ありがとうございます><
( ゚д゚)ポカーン
>>556 >>555 とは別人だけど、違うの?
COMコンポーネントかDLLしか参照できないってことじゃないの……?
VC++2003で exeのプロジェクト を 別のexeで 参照設定する事 謎が多いな。 make の依存関係だけなのか、 別のexe が、元 exe をリンケージするのか
559 :
557 :2007/05/24(木) 21:02:04
>>558 それは自分も思った。
ShellExecuteとかそのたぐいでいいじゃんてね。
でも、exeの参照の可否と、その有用性はとりあえず関係なくね?
>>557 exeでも参照できるよ
.NET Frameworkならね
561 :
560 :2007/05/24(木) 21:22:02
ていうかVC初心者スレ池
「構造体とクラスは無関係」という人をよく見かけるけど、 構造体からヒントを得て、クラスという概念を作ったわけではないの? 構造体使ってて、あー、こういう風にしてーなー、と思ったところを、 クラスという形で実現したのであれば、 無関係ってちと言い過ぎじゃないかなー、とか思うんだけど。
563 :
デフォルトの名無しさん :2007/05/24(木) 23:29:18
switch(event) { case1: foo; case2: bar; default: ←100行目 } if( !p1) { ・・・ GOTO Test; Test: ←100行目 } gcc version 4.1.2 で、 上のように、default: や Test: の後が空行のまま } がくると、次のようなエラーがでます。 handle.c:100: error: label at end of compound statement これは仕様なのでしょうか? default: は消し、 Test: は {}の外にうつして回避したのですが、それで正しいでしょうか。 アドバイス、よろしくお願いします。
>>563 ラベルの後には文が必要です。
;(セミコロン)だけでも付けましょう。
565 :
563 :2007/05/24(木) 23:39:39
>>564 セミコロンをつけたところ、コンパイルがとおりました。
どうもありがとうございました。
swapに渡されるのは引数のコピーだ swap(int* a,int* b);
色々やってみましたが、分かりませんでした。 よろしければ正解例を示していただけないでしょうか。 お願いします。
よくみたら内部で配列を交換してんのか つうかコレコンパイルできなくね? 面倒だからとりあえず int i,j,k,work,num,a[100]; をmainの外に出せば動くんじゃね
>>569 はい、566の下のソースはコンパイルできていません。
mainの外に出してもできないようです。
mainの外に出したら動いたわけだが、、、
572 :
デフォルトの名無しさん :2007/05/25(金) 01:45:14
mciSendStringでnotify(+MCI_NOTIFY_SUCCESSFUL)で ループ再生を行っている時、 まれにループに入るタイミングでループされず、 永遠とnotifyが投げられビジー状態になってしまいます。 100回に1回も起こらないので、原因は良く分かりませんが、 もしかしたら、曲を変えようと前の曲をstop、closeし、 新しい曲をopen、playするのと同じぐらいのタイミングで notifyが来た時に起きているのかもしれません。 対策方法などがありましたら、教えてください。
再生するファイルの種類は何かね?あとOS
×永遠と ○延々と
>>562 C++のクラスはSimulaからのインスパイヤ
577 :
573 :2007/05/25(金) 09:22:55
578 :
573 :2007/05/25(金) 09:34:53
後、もちろんmciSendStringの戻り値は0(成功)です。 音楽を変えるためstop、closeした後、 前の曲のnotifyが来てしまいおかしくなるのかもしれません。 notifyが連続で来る事は普通は無いので、 その時は、playをsendしないようにする方法とかもあると思うんですけど。
579 :
デフォルトの名無しさん :2007/05/25(金) 10:20:06
stringはあまりよくないと聞いたことがあるのですが charの配列を使うよりstringを使ったほうがいいですよね?
580 :
566 :2007/05/25(金) 10:50:50
>>572 ありがとうございました。
保存したので、もう消していただいてもかまいません。
>>579 好きにすればいいと思うよ。
配列とnew/delete演算子と
テンプレートクラスの勉強が済んでいる前提で。
>>583 まずは自分で書けよ。今のソースじゃどういう動作にしたいのかもわからん。
もうソース見えん。 削除ってのはさ、 A→B→C のBを消すときにAの指してる先をCにしてBを消せばいいわけだ。 でも片方向でBの前を探すのは面倒だから、Bが指してるCの内容を そっくりBにコピーしてCを消す、というトリックが使える場合があるぞ。
586 :
デフォルトの名無しさん :2007/05/25(金) 15:20:22
mfcについて教えてください。 通信受信プログラムで受信データをエディットコントロール(複数行表示)に表示しているのですが、 以下のコードでは、エディットコントロールに文字列を追加する際に必ずスクロールされてしまいます。 スクロールされない方法を教えてください。 int iLen = edit->GetWindowTextLength(); edit->SetSel(iLen, iLen); edit->ReplaceSel("Hello\n"); WinXP & Visual Studio 2003 & mfc7です。
!(Φ_Φ+){???} "hello" ↓ 0 ##### # # # #
!(Φ_Φ+){???} "hello" ↓ 0 ##### # # # #
>>586 MFCスレへどうぞ。
つーか、LineScrollで元のとこに戻せばいいんでないの?
590 :
デフォルトの名無しさん :2007/05/25(金) 16:24:49
>>589 レスありがとうございます。
LineScrollで戻すと、1行書くごとに「下へスクロール→上へスクロール」となり、上下にスクロールが発生してしまい
とても見づらくなってしまうのです。
「スクロールなし」でエディットコントロールに文字列を追加できないものでしょうか?
!(ΦyΦ+){???} 『のだめカンタービレ』
!(ΦyΦ+){???} 『のだめカンタービレ』
初めまして、VC++のC++/CLIのフォームアプリケーションについて質問があります。 今、LimeChat 2 の様なアプリを作っていています。 そのアプリのテキストボックスには、カーソルが表示されていません。 どのようにすれば、カーソルを表示させないようにできるのでしょうか? また、TreeViewの再描画を一時停止させたいのですが、どうすればよいのでしょうか?
>>590 誘導されているんだから更に質問するなよ。
>>593 C++/CLIは最早C++でさえないので該当スレへ。つーか、プロパティだか属性だか知らんが編集可否とかカーサ表示有無とかないの?
>>595 それが無くて困ってますorz
該当スレ = C++/CLI について語ろうぜ Part2
で質問してもいつもスルーされてしまうんですorz
そりゃ、明らかにC++/CLIの話題じゃなくて、.NET FrameworkなりCLRなりの話題だもん。
自分でスレ立てるしかないですかね?
やめときますorz どこに書き込んでも >こんな奴がC++出来るんだぜとかいってると思うとため息出るな・・・ とか >(゚Д゚) みたいに馬鹿にされますorz これってそこまで初歩的な質問ですかね?
>>602 ヘルプぐらい見ろよ。
MSDNで「TreeViewメンバ」一覧とか見れば、
BeginUpdate ツリー ビューの再描画を無効にします。
とか思いっきり書いてあるだろ。
日本語読めないの?
>>602 > そのアプリのテキストボックスには、カーソルが表示されていません。
> どのようにすれば、カーソルを表示させないようにできるのでしょうか?
>
とりあえず、この文面だとカーソルを消したいのか表示させたいのか分からん。
あとこの場合は、マウスの移動とともに表示される矢印のマウスカーソルと、
テキストの間に表示される縦棒の二つの意味にとれるので、
そこも説明する必要あり。
>>602 スレ違いって指摘されているの判る?
それでも居座るような状態だから馬鹿にされるんだよ。
俺はこのスレでC++/CLIを出してきても構わないと思うけどな まあ答える奴は少ないだろうとも思うけど 602が答えを得られないのは602自身の問題
片っ端からマルチかよ。 そりゃ答えてもらえないわけだ。
構造体の末尾にパディングを入れてサイズを固定にしたいのですが、 struct hoge { int a; int *b; hoge *c; char padding[???]; }; 例えば sizeof(hoge) == 16 になるようにしたい場合、??? にはどう書けばいいでしょうか? 16 - offsetof(hoge, padding) とか書ければいいのですが。
paddingまでが詰まってる前提なら 16-sizeof(a)+sizeof(b)+sizeof(c) でいいんじゃね 試してないけど
16バイトの配列との共用体にするとか union hoge{ char size[16]; struct { int a; int *b; }; };
テキストに入力できる状態なら 縦棒消すの無理じゃない?
なぜなのかよく分かりませんが、LimeChat 2というIRCでチャットをするためのソフトでは、点滅しているカーソルが表示されていないんです
キャレット表示されてないと入力編集がものすごく難しくないか?
チャットソフトだからログ表示部品と発言入力部品が別なんだろ。 でログ表示部品にキャレット(カーソル)が出てしまうのがウザイと。
おまえらどこか一箇所でやれよw
ぐぐったらこんなのが引っかかった BOOL HideCaret(HWND); つーわけで消したいEditBoxのhwndを放り込んで使ってみよう
HideCaret(static_cast<HWND>(this->textBox1->Handle.ToPointer())); でなんとかキャレットを非表示にできそうです。 しかし、外部シンボル ""extern "C" int __stdcall HideCaret(struct HWND__ *)" (?HideCaret@@$$J14YGHPAUHWND__@@@Z)" は未解決です。 というリンクエラーが出てしまいましたorz
環境以前にスレ違いなわけだが
シフト演算(<< >>)ではなく、ローテートを行いたい場合、どのようにすればよいのでしょうか?
左右シフト演算をORで結合、かな。 コンパイラに拠っては、rotに展開されるであろう 組み込み関数とかがあるかもしれないけど。
組み込み関数あるね unsigned long _lrotl(unsigned long value, int shift) 符号なし long 型整数の各ビットを左にローテートします。 unsigned long _lrotr(unsigned long value, int shift) 符号なし long 型整数の各ビットを右にローテートします。 unsigned int _rotl(unsigned int value, int shift) 符号なし整数の各ビットを左にローテートします。 unsigned int _rotr(unsigned int value, int shift) 符号なし整数の各ビットを右にローテートします。
>>620 さんのおかげで解決しました。ありがとうございました。
>>621 スレ違いなら消えますorz
何度もスレ違いって言われてるだろ。 さっさと消えろやこの世からもな!
_、,、
θ《▼》θ ; ,;从 , ガッ
ノリ#゚−゚リ)((ニ(ニ(l チュドーン .., ''"´"''': ; . 、゙,',::、⌒::;.,'."));": ←
>>626 ( ノ つ|_||三三二弌ll============lニlll),,' . : ; _,; " `.、:.(`:'⌒::"`.;`⌒゙":ドカーン
《ソ|__/|ニ〃l,=l┘ "'' -''''"´ ;;.゛;((:;;`';::,");;";;;))`.;
し'ノ ゛;((:;;`::"`.;`⌒゙);;";;;))`.;
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
おまえが死ねよ
価値がないのはおまえだろw
そもそもCLIってなんですか?なにに使うんですか?
.NETプログラミングのことですか?
managed C++ とどう違うの?
>>630 大体あっている
.NET Frameworkを標準規格化した際の名称がCLIとでも思えばいい
>>631 構文がましになった
VS2005EEです。 Wktk(void(*func)(void)) というような関数に クラスメソッド void cKwsk::Osieru() のポインタを渡したいのですがC2440エラーでうまくいきません。 どのようにキャストすれば良いのですか?
634 :
デフォルトの名無しさん :2007/05/26(土) 19:44:45
Visual Studio 2005にて、以下のようなコードを書いたのですが const TCHAR OutBuff[] = _T("D:\\TEST\\アイウエオ.txt\n"); const TCHAR OutFile[] = _T("abc.txt"); _tfopen_s(&fp, OutFile, _T("w+, ccs=UNICODE")); _fputts(OutBuff, fp); fclose(fp); これで出来上がったabc.txtの中身を見ると D:\TEST\[EOF] 要するにカタカナの「ア」以降出力されません。 これはどうすればうまくいくでしょうか? 環境はVS2005 SP1 WindowsXP SP2 ワイド文字を使用するでコンパイルしています。
>>633 そのメンバ関数を静的メンバ関数にすればいい。
>>633 キャストできない。
クラスメソッドでない普通の関数を噛ませるか、Wktkの方を変えるしかない。
638 :
634 :2007/05/26(土) 20:13:49
639 :
633 :2007/05/26(土) 20:56:47
静的メンバ関数にすることで対応しました。 レスありがとうございました。
誰だよ >環境以前にスレ違いなわけだが みたいな糞逝ったのは
atlのT2Wを使うにしても、mbstowcs系を使うにしても マルチバイトで"あいう"っていうのをワイド文字列strに変換したばあい、 str[0] = "あ", str[1] = "い", str[2] = "う"と言うふうにはならないんです 変換前と変換後で文字列が対応するように変換するにはどうしたらいいでしょう?
え?なるだろ? ならないっていうなら、現状どうなってるんだ?
すいません、マルチバイトに変換してましたorz ちゃんとT2W使った上手く変換できました
初心者ですが質問にお答えいただけるとうれしいです。 配列に直接機械語を埋めて関数ポインタで実行させたいのですが よくわかりません。 環境はPentium4、WindowsXP、BorlandC++Compiler。 //ソース #include <stdio.h> int main(void) { int (*func)(void); const char ch[] = { 0xb8, 0x45, 0x23, 0x01, 0x00, 0xc3 }; func = (int(*)(void))ch; printf("%X", (*func)()); return 0; } 何かが決定的に間違っているのにちゃんと12345と表示されます。 アセンブリで mov ax, 123h ret と書いてnasmでアセンブルすると B8 23 01 C3と機械語が吐き出されます。 これをそのままch[]に埋め込んでもエラーで正しく実行されません。 axレジスタって16Bitですよね?なぜか32Bitで補正してやると正しく実行されるんですよね。 きっと、正しくできていると思い込んでいて実際には偶然こうなっただけなのでしょうけど なぜ、これが出来て、普通にアセンブルして出来た機械語が実行できないのでしょうか? もしかして、こういう行為自体が土台不可能な話で、今回出来たのはまったくの偶然ということでしょうか? 教えていただけないでしょうか、よろしくお願いします。
なんで初心者なのにhackのマネ事してるんだ
>>644 C++言語の範疇を逸脱した内容なのでスレ違い。
アセンブラ関連のスレへどうぞ。
masm系ならuse32
648 :
644 :2007/05/27(日) 04:37:26
>>645 hackといわれてもよくわかりませんが
ただ、興味があったとしか申し上げられません。
>>646 こちらC言語です。どうぞ。
失礼。そうですね。ただCでこういうことが可能かどうかを知りたかっただけでして。
出来るか出来ないかだけでも教えて頂きたいと思っているのです。
あとはアセンブリでも機械語でも自分で調べて何とかしますので。
649 :
デフォルトの名無しさん :2007/05/27(日) 06:09:24
すいませんPGMファイルの読み込みの関数を作っているのですが、 im[j][i]=tempのところで落ちます。どうすればいいですか?おしえてください。 /*------------------------------------------------------- PGMファイルの読み込みの関数 --------------------------------------------------------*/ int** read_PGM( FILE *fp, int *pw, int *ph){ int **im; int i, j; int temp, bright; printf ("PGMの読み込み開始\n"); /*---------------------- P2形式のファイルか判別 -----------------------*/ if ( fgetc(fp) != 'P' || fgetc(fp) != '2' ){ printf("このデータはP2形式PGMファイルではありません。\n"); return (NULL); }
650 :
デフォルトの名無しさん :2007/05/27(日) 06:10:50
/*---------------------- 幅のデータの読み込み ----------------------*/ if ( fscanf( fp, "%d", pw) != 1 ){ printf ("幅の読み込みに失敗しました。\n"); return (NULL); } printf("幅のサイズは%dです。\n", *pw ); /*---------------------- 高さのデータの読み込み ----------------------*/ if ( fscanf( fp, "%d", ph) != 1 ){ printf("高さの読み込みに失敗しました。\n"); return(NULL); } printf("高さのサイズは%dです。\n", *ph );
651 :
デフォルトの名無しさん :2007/05/27(日) 06:12:24
/*----------------------- 輝度のデータの読み込み -----------------------*/ if ( fscanf(fp, "%d", &bright ) != 1 ){ printf("最大輝度値の読み込みに失敗しました。\n"); return(NULL); } if ( bright != MAXVALUE ){ printf("最大輝度値が%dではありません。\n", MAXVALUE ); return(NULL); } printf("最大輝度値は%dです。\n", bright ); /*------------------------ ヘッダーの取得完了 ------------------------*/ printf("ヘッダーの取得完了\n");
652 :
デフォルトの名無しさん :2007/05/27(日) 06:14:21
/*---------------------------- メモリの確保 ----------------------------*/ if ( (im = (int**)malloc(sizeof(int*) * (*ph))) == NULL ) { printf("メモリが確保できません。\n"); return (NULL); for ( j=0; j< *ph; j++){ if( (im[j] = (int*)malloc( sizeof(int) * (*pw) )) ==NULL ){ printf("メモリを確保できません。\n"); return(NULL); } } } printf("メモリ領域が確保できました。\n");
653 :
デフォルトの名無しさん :2007/05/27(日) 06:15:21
/*----------------------------- 画像データの読み込み -----------------------------*/ for ( j=0; j< *ph; j++ ){ for ( i=0; i< *pw; i++ ){ if ( fscanf(fp,"%d", &temp) != 1 ){ printf("画像データの取得に失敗しました。\n"); return(NULL); } im[j][i] = temp; } } return (im); }
>>649 ・長いソースはアップローダを使ってくれ。
・その画像ファイルにはコメントは含まれていないか?
試しにエディタで開いてみて、コメントがあるようなら削って味噌。
・そもそもなんでlibpgmでも使わないんだ?
>>648 >647でも指摘されているが、CPU側の事情で巧く動かないだけ。
(x86)アセンブラの勉強をすれば容易に解決する問題。
655 :
644 :2007/05/27(日) 11:15:59
>>654 了解です。
「はじめての」シリーズがアマゾンで評価高かったので見てみようかと思います。
あとは、インラインアセンブラで関数作ってその部分だけバイナリで吐き出させて
再び埋め込んでみるのもいいかもしれないです。
シェルコードの解説サイトにソースがあったので使えそうです。
スレ違いな感じですがいろいろ有難うございます。
>>649 おそらくポインタ関係でミスってる、てことは分かるでしょ?
>>652 で im != NULL のときどうなるか考えてみ。
>>644 EAX の上位ビットをクリアすればいけるかも
>>644 のは ret のC3がeaxレジスタにmovするときの数値で食われてるから
返ってこないんだよ。
>>644 IMMが32bitの場合と16bitの場合を区別するために、
mov ax, 0x123
では、0x66, 0xb8, 0x23, 0x01
とプリフィックスを入れる必要があるみたい。
まぁ厳密には関数ポインタは他のポインタと互換性があるとは限らないんだけど
確かに… リニアアドレスであればいいかもしれないが、 データセグメントとコードセグメントなんかに分かれてると 普通に呼び出すのは無理そう OSのセキュリティレベルが上がってくると またDOSのようにセグメント毎に分かれるかもしれんし
>>660 >>661 こういうことをやる場合は16bit/32bit/64bitで分けるのは当然。
逆にそれを分けてしまえば、ポインタのサイズも
セグメントの問題もどうにでもなると思うけど…
16bit/32bit/64bitで分けるっていうのは、 CPUの種類の話ね^^
664 :
649 :2007/05/28(月) 09:22:00
みなさん、ありがとうございます。 無事に動かすことができました。
クラスのコピーコンストラクタとoperator=って、 実装する処理がまったく同じになることが多いんですけど、 メンバのコピー自体はoperator=だけに書いて、 AAAA::AAAA(const AAAA& rSrc) { *this = rSrc; } とか書いて処理を合体してしまうことって やっぱり好ましくないことですか?
>>665 代入と初期化は異なる演算です。
コピーコンストラクタでは初期化リストで各メンバのコピーコンストラクタを使いましょう。
結果:Strike! char *pszMsg = "Lucky Strike!"; char *pszHit; [ 問 ]; printf("%s\n,pszHit");
最後の"はそこでいいのか
VisualStudio2005でC++をコンパイルした実行ファイルをリバースエンジニアリングできますか?
はい、できます。
CLRヘッダが無いと怒られてしまいました。 どうすれば、リバースエンジニアリングできますか?
リバースエンジニアになればリバースエンジニアリングできます!
馬鹿にはできない不思議なリバースエンジニアリング
逆アセンブラはできるけど、逆コンパイルはできない。
× 逆アセンブラ ○ 逆アセンブル × できない ○ それ的な事はできるけど、元のソースを再現できるわけではない
ブーメラン ブーメラン
64ビットになったらアセンブラでプログラムなんて無理だよね
めんどくさくない?
>>678 ドラスティックな変化があると思っているなら、不勉強にも程がある。
eax とかが rax とかになるだけだろ。
歳も歳だし、新しく勉強なんてもう俺には無理だよorz 16ビットが恋しい
逆アセでollydbg使ってる奴はいないのか?
なんだよ
16ビットなら人間の手足で数えられるんだな
つーか16ビットの方がめんどうだっだろ
だっだろ
だっだろだっだろ
リスクは面倒だっだ
フリスクはよかった
ロリスクってなんですか?ハァハァ
ローリスクっぽい言葉の響きなのに凄くハイリスクな感じがするな。
なんら意味のないプログラム void add(int) int main(void){ add(2); return 0; } void add(int x){ x=x+1; } これ、main関数の中のadd(2)が実行された時点で、 内部だとx==2なので2=2+1になってエラーが起こると思うんだけどおこらない。 main関数の中に 2=2+1; ってやったらエラーが出て実行できない。 これはなぜ?教えてください
>>695 関数へはコピー渡しだからaddを呼んだ時点で2が変数xにコピーされている。
void add(int& x) だとコンパイルエラーにならないか?
意味がないなら、どうでもいいじゃないか。( ´∀`) >内部だとx==2なので2=2+1になってエラーが起こると思うんだけどおこらない。 C/C++ では、引数は値渡しなので add() 内部で x という変数が 2 になっているだけ。 add() を抜けると、+1 したはずの x は消滅。
おいおいw
↑誤爆スマソ
↓自爆スマソ
>>695 そのx=x+1;での=は、数学の授業でやるような等しいという状態を表しているものではなく、
「代入しろ」という動作の命令なのよ。
代入しろという命令だから=の左には代入できるものを書かないとエラー。
だからx=x+1;はokで2=2+1;はエラーになる。
CかC++で、整数型のユニークなIDを作るような機能を持ったライブラリってありませんか?
用途が分からんと何とも言えない気がする。
unsigned long GenerateUniqueID() { static unsigned long id=0; id++; return id; }
スレッドセーフじゃないな。
unsigned long GenerateUniqueID() { static unsigned long id=0; static int locked=0; while(locked) msleep(1); locked=1; id++; locked=0; return id; } ミューテックス使わなきゃ駄目?
当然なんらかの同期化機構を利用しないとダメ。 スレッドAがwhile(locked)で "lockedの値をレジスタに取った直後に" スレッドが切り替わり スレッドBが同様にwhile(locked)を実行したらどうなる? あと、そのコードはstatic変数の初期化も下手すると二回以上行われるね。
いや、、、初期化は実行時じゃ無いぞ・・・ クリティカルセクションでいいな
ごめん。C++のつもりで書いてたわ…。
最適化でゴッソリ消える予感
synchronized
C++ にあればねえ
>>711 その点については volatile つけとけばおk
そういう問題じゃないけどまぁいいか。
716 :
デフォルトの名無しさん :2007/05/31(木) 08:42:34
すいません、この関数って何か間違ってますか? hairetsu2は、メモリ領域が確保してあり、srand()も関数の外で処理しています。 hairetsu2[j][i] = rand()%2のところで止まります。お願いします。 void rand_point( int **hairetsu2, int row, int line ){ int i, j; /*** 2次配列の0or1をランダムに格納する ***/ for (j=0; j<row; j++){ for (i=0; i<(1+line); i++){ hairetsu2[j][i] = (rand()%2); } } printf("2次配列にランダムに0or1を格納できました。\n"); }
>hairetsu2は、メモリ領域が確保してあり、 どうせちゃんと確保してないに決まってる
「止まります」?そもそもコンパイル通らんだろ。
719 :
デフォルトの名無しさん :2007/05/31(木) 09:25:24
コンパイルは通るんですよ↓メモリ確保は、次の関数で確保してます。 void securement2( int **hairetsu2 , int row , int line ){ int i, j; /*** 2次配列の行を確保する ***/ if (( hairetsu2 = (int **)malloc( sizeof( int* ) * row )) == NULL ){ printf("2次配列のメモリ領域が確保できません。\n"); exit (1); } /*** 各行に得点の列を確保する ***/ for ( j=0; j<(row); j++){ if (( hairetsu2[j] = (int*)malloc( sizeof(int) * (1+line) )) == NULL ){ printf("2次配列のメモリ領域が確保できません。\n"); exit (1); } } /*** 2次配列を0で初期化 ***/ for (j=0; j<row; j++){ for (i=0; i<(1+line); i++){ hairetsu2[j][i] = 0; } } printf("2次配列のメモリ領域が確保できました。\n"); }
>>718 根拠は?
>>717 同意。
>>716 その構造だと、メモリはとint配列[line + 1]をrow回とポインタ配列[row]だけ確保する必要があるわけだが。
その部分のコードを晒して味噌。
721 :
デフォルトの名無しさん :2007/05/31(木) 09:30:21
hairetsu2[0][0]だけが格納されて止まるみたいです。hairetsu2[1][1]も格納できないみたいです。
722 :
720 :2007/05/31(木) 09:32:01
>>719 あーすまん、やってたのね。
で、止まるってのは具体的にどうなると?
>>719 確かにメモリ確保はできてるようだけど、
hairetsu2 をそのまま使うことは出来ない。
変数 hairetsu2 は関数 securement2 を終えた時点で使用不能
void securement2( int **hairetsu2 , int row , int line ){ ↓ void securement2( int ***hairetsu2 , int row , int line ){ または void securement2( int **hairetsu2 , int row , int line ){ ↓ int **securement2( int row , int line ){ int **hairetsu2; printf("2次配列のメモリ領域が確保できました。\n"); ↓ printf("2次配列のメモリ領域が確保できました。\n"); return hairetsu2;
2次元配列も連続した領域である必要があるんだよ。 その配列のアクセスの仕方をやめるか、メモリ確保を一回でやるかどっちかにせい
素朴な疑問だが、
>>719 みたいな奴って「2次元配列」言うの?
確かに同じ形で操作出来た気はするが。
>>725 何に対するレスか非常に疑問。
可変長二次元ぬるぽ( ´∀`)
731 :
デフォルトの名無しさん :2007/05/31(木) 12:37:24
windows98で SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS); は実行できますか? 実行するとどうなりますか?
732 :
649 :2007/05/31(木) 13:10:14
716です。ありがとうございます。ちょっと試してみます。
>>716 はダブルポインタ理解してるか?
引数にint **hairetsu2って書いてあるが、ここでダブルポインタにする必要はなにもない。
引数をダブルポインタにするには、関数内でメモリを確保して返すような場合だけだ。
ダブルポインタ=二次元配列じゃないぞ。配列は何次元になってもメモリ内の表現は連続だ。
あとrowとlineは普通どっちも行を意味する。
rowを行とするなら、列の変数名はcolumnの方がいい。
>>707 Windows APIのInterlockedIncrementのような関数が使えれば、それを使うのが楽
ダブルポインタってなに?
1点決めると2点分になる人
配列の連続性だけど、 a[3][3] で a[0][2] と a[1][0] の連続性って規格で保証されてたっけ?
int**がダブルポインタならこれは何ポインタ? int*************** nullpo;
pentadecuple
741 :
デフォルトの名無しさん :2007/05/31(木) 18:47:40
>>733 読みました。2000以降と書いてありますが、98でどうなるかは書いていません。
それは「どうなっても知らんから使うな」という意味だ。
>>738 されてない。
C FAQ 6.19 でも、「ANSI C規格に厳密には従っていないことに
注意すること。」 となってる。
>>744 気になるんだけど、それって、
int a[3][3]; で sizeof a / sizeof a[0] は
3 になる保証がないということなのか?
Visual C++ 2005 Express Edition ってSPY++入ってる?
連続性と関係なくね? 同じサイズでとびとびに確保されるかもわからんし
とびとびに確保されたら、sizeof a は (sizeof a[0]) * 3 より大きくならね?
>>745 それは sizeof の例にも書かれている通り、保証されている。
問題になるのは、例えばワードマシンで
char b[3];
とか書いたら sizeof c が 4 になるような処理系。
(構造体のパディングと同じ理屈で)
この場合でも、
char c[3][3]
は
sizeof c[0] = 4
sizeof c = 12
になって、 sizeof c / sizeof c[0] = 3 になる。
ほほう。配列の場合はパディングありでも sizeof には影響しないんだ。
いや、違う。 sizeof に影響するけど、両方に影響するから打ち消される、ということか。 でも、それだと今度は sizeof c[0] / sizeof c[0][0] は 4 になってしまうのか?
昔はダイナミックキャストは物凄く遅!!かったらしいですが さっきwinXP環境でQueryPerformanceCounterを使って計測した結果 数百満開キャストしてもスタティックキャストと同じくらいかそれより早いという結果が出ました これは使えそうなところには気前良く使っちゃって良いってことでしょうか?
スタティックキャストより早いというのは有り得ないと思うんだけど、どうだろう。 検証コードがどうなってるのかが気になる。
staticより早いといっても誤差レベルです 可能性としてはPCの負荷とかそういうのだと思います しかし、もう一度実験コードや環境見直した方がいい気がしたのでもう一度計ってみます
仮想関数が無いとか
dynamicである必要性がないと判断されて static_castにされてるんじゃないのかね?
最近のQueryPerformanceCounterの精度は、 ACPIタイマーかなんか知らんけど3MHzくらいだったりするので、 たとえ1000クロックくらいかかっても誤差になりかねない
758 :
752 :2007/05/31(木) 21:57:46
その記事のとおりにして、static_cast版で 最適化(/O2)かけたら、ループ毎お亡くなりに。
情報系の大学2年です。 C言語のアルゴリズムの授業があるのですがついてけません。 仕組み?というかイメージはできるのですが実際にプログラミングすることができません。 例えば木構造は図があって仕組みもわかっているつもりなのですがいざ、プログラムを書こうとするとどうやって実現していくかがわかりません。 1年の頃は授業とは別に「C言語入門」という本で実際に書きながら勉強して基本的なことはわかったつもりなのですが。 自分に何が不足しているのかわかりません。基本ができていないのか…。 授業指定の教科書も硬い文章で難しく書かれていて自分では独学できないので困っています; C++もやりたいのですが先が思いやられます。
そもそも理想的には、性能上の問題ではなく、設計上の問題からdynamic_castは避けるべき
>>760 は、情報処理試験の基本情報技術者とソフトウェア開発技術者を
同時に勉強することをお勧めする。
それに、ソフトウェア開発技術者を取得しておけば、就職をかなり有利に進められる。
ところで、Fizz-Buzz問題は解ける? >1から100までの数をプリントするプログラムを書け。 >ただし3の倍数のときは数の代わりに「Fizz」と、 >5の倍数のときは「Buzz」とプリントし、 >3と5両方の倍数の場合には「FizzBuzz」とプリントすること。
>>761 ちょい違う。
「dynamic_cast が必要になるような設計はできるだけ避けるべき」であって、
どうしても必要になる所ではむしろ使うべき。
自分、文系大学生で独学でプログラミングの勉強してて、 シスアド、基本情報技術者、ソフ開の資格取ったけど 全く職業レベルで使える気がしない。 プログラム板で出てくる会話も分からないことの方が多いし、 WIN32APIしか使えなくてMFCも分からない。 我ながら頭悪すぎ資格馬鹿死ねば良いのに\(^o^)/
>>764 こんな感じでしょうか?作成時間は5分ぐらいです。Cygwinで確かめました。
#include <stdio.h>
int main(int argc, char* argv[])
{
int i;
for(i = 1; i <= 100; i++)
{
if(i%3 == 0 && i%5 == 0)
{
printf("FizzBuzz\n");
}
else if(i%3 == 0)
{
printf("Fizz\n");
}
else if(i%5 == 0)
{
printf("Buzz\n");
}
else
{
printf("%d\n", i);
}
}
return 0;
}
>>766 APIやフレームワークは覚えるものだから、使えないのは当たり前。
それに設計技能はベンダニュートラルに行えないと意味がない。
現状のソフ開だと、内部設計とアルゴリズムは出題されるけど、
クラス図やXMLの出題傾向が低いから。
APIだのフレームワークだの、覚えなくてもリファレンスドキュメントあればどうとでもなる
プログラミングって偏差値とか点数みたいに分かりやすい指標が無いから 自分のレベルが分かりづらいです。 新卒でプログラマになりたかったらどの程度出来れば良いんでしょうか? また、どの程度までが初心者でどの程度出来たら中級者ですか? 多少独断と偏見が入っても良いので教えてください。 マ板で聞くべきか迷ったけどC/C++のレベルの話を聞きたかったので こちらで聞きましたが、スレ違い気味な話題だったらすいません。
新卒なら別に初心者でも教育してくれるところはある。 ま、できるに越したことは無いと思うが。
>>770 プログラマになりたいだけなら、fizzbuzz問題が解ければOK
・・・本気にして過労死しても責任取らないからね?
プログラマというより、技術者として今後やっていくつもりなら、 プログラミングだけに拘泥しないで、クラス図、内部設計なども 同時に学習するほうが良い。 設計が悪いと、プログラミングに苦労するからな。
774 :
770 :2007/05/31(木) 23:21:42
int main() { int i=1; char *fizz=new char[10]; char *buzz=new char[10]; char *fizzbuzz=new char[20]; strcpy(fizz,"fizz"); strcpy(buzz,"buzz"); strcpy(fizzbuzz,fizz); strcat(fizzbuzz,buzz); for(;i<=100;i++) { if(i%3==0&&i%5==0) cout<<fizzbuzz<<endl; else if(i%3==0) cout<<fizz<<endl; else if(i%5==0) cout<<buzz<<endl; else cout<<i<<endl; } return 0; }
775 :
770 :2007/05/31(木) 23:25:58
>>771 なんかマ板で「未経験者歓迎」謳ってたくせに(ryっていう
スレを見かけたので不安になりまくりなのですorz
>>772 あ、、delete書き忘れ><;;
fizzbuzz問題ってこれで良いんでしょうか?
プログラマになるにはこういう問題を解くのが重要なのですか?
>>773 なるほど、それは新しい情報でした。
正直一人でやってるだけだからクラス図とか全く関わりがなかったです。
今度本屋に探しに行ってみます。
>>770 C言語の話になるけど、ポインタ絡みとビット演算絡みのコード見て、
時間かかっても良いからどんな処理なのか分かるようになったら
「脱初心者」かなぁ、と思ってる。個人的に。
C++は良く分からんな。
777 :
デフォルトの名無しさん :2007/05/31(木) 23:42:45
32.123 47.195 67.393 55.670 19..809 を4bit(0〜15の16段階)で表現するにはどうすればいいのでしょうか?
778 :
デフォルトの名無しさん :2007/05/31(木) 23:44:01
>>775 fizzbuzz問題は、その程度も解けない人間は新卒ですら雇ってもらえないよってこと
会社にもよるが、新卒はあとで教育するから実践的な知識は無くてもOKってところがそこそこある
・・・鵜呑みにしてのらりくらり就職して、歯車のように働かされても私は責任取らないからね?
>>777 5 個の値を区別するだけなら 3 ビットで十分じゃね。
そういう話ではなくて?
781 :
760 :2007/05/31(木) 23:46:28
>>764 >>767 で一応解けましたが…。
こういう簡単な問題を解いていけば大丈夫ですか?
個人的にプログラムに書き起こす練習が不足しているのかな、と思えてきました。
余談ですが
解いてからネットで調べたのですがFizzBuzz問題は有名だったんですね。
剰余を使わないでどうやって実現するか悩み中ですが。
>>781 実現する手段が多すぎて、どれを試そうか悩んでいるなら一つずつ試していくと練習になる。
そもそも実現法を思いつかないなら・・・とにかくがんばれ。
783 :
775 :2007/05/31(木) 23:55:17
>>776 やはりポインタは分かりづらいですものね><;
自分はポインタのポインタとかなってくると頭がこんがらがってきますorz
ビット演算は結構大丈夫だから微妙な感じです。
>>779 あぁ、そういう意味の問題なのですか><
しかも気付かなかったけど少し上で同じようなレスが。
ググって問題を見た後にひどく簡単だったから何か隠された意味
(コードの書き方の綺麗さとかを見る)があるのかと思ってしまいました。
ところで実際問題、もちろん人それぞれだと思うのですが仕事ってどんなことするのですか?
自分で勉強していて本での勉強と実践との間にかなりの差がある気がするのです・・・。
784 :
デフォルトの名無しさん :2007/06/01(金) 00:12:44
>>780 本当はそれで十分だと思うのですが
もし16段階で表すとしたらどうなるのかな、と思いまして
785 :
デフォルトの名無しさん :2007/06/01(金) 00:15:17
研究用に軽くC++でGUI付きのソフトを書きたいのですが、 どのプラットフォームが使いやすいですか?? FreeBSDで開発予定ですが、 Windowsに移行する可能性もあるので、 今のところマルチプラットフォーム対応のQtかSDLを考えているのですが、、
そこはやっぱりOpenGL
wxWidgets
789 :
785 :2007/06/01(金) 00:52:42
>>786 OpenGLもクロスプラットフォームのAPIなんですね。
3Dとかに使うイメージですねけど、
早いんでしょうか。
>>787 Windowsプログラミングの経験がないのです…
790 :
785 :2007/06/01(金) 00:59:21
>>788 wxWidgets使いやすそうですね。
もうちょっと調べてみます。
>>789 経験がなければ研究を通して経験していけばいいじゃないか
792 :
785 :2007/06/01(金) 01:43:30
>>791 そうですね。
とりあえず今ある環境で実験として作ってみたいのです。
うまくいけば、windowsで実装しなおそう(環境を作り直そう)と思っていました。
793 :
785 :2007/06/01(金) 01:49:55
とりあえずwxWidgetsがわかりやすそうなので、 これをつかってやってみたいと思います。 GUIのプラットフォームやらライブラリって、 なにがどの分野ををカバーしてるのかわかりにくいですね。 wxWidgetsもGTKやSDLを使うみたいですし、、、 詳しい方々知っていたらこのあたりの事情を教えていただけるとありがたいです。
794 :
785 :2007/06/01(金) 01:51:34
すいません。お礼が抜けていました。 答えていただいた 786,787,788,791さん、 ありがとうございました。
795 :
デフォルトの名無しさん :2007/06/01(金) 02:05:38
構造体配列をそっくり交換する問題について質問します struct dint { public: int a; int b; }; void starswap(dint x[], dint y[]) { int i; dint* t=new dint[3]; for(i=0;i<3;i++) { t[i]=x[i]; } for(i=0;i<3;i++) { x[i]=y[i]; } for(i=0;i<3;i++) { y[i]=t[i]; } delete[] t; }
796 :
795 :2007/06/01(金) 02:07:30
続きです int main() { int i; dint di1[3]; dint di2[3]; di1[0].a=4; di1[0].b=6; di1[1].a=2; di1[1].b=3; di1[2].a=5; di1[2].b=8; di2[0].a=7; di2[0].b=3; di2[1].a=1; di2[1].b=6; di2[2].a=9; di2[2].b=2; for(i=0;i<3;i++) { printf("%d,%d\n",di1[i].a,di1[i].b); printf("%d,%d\n",di2[i].a,di2[i].b); } printf("starswap!\n"); starswap(di1,di2); for(i=0;i<3;i++) { printf("%d,%d\n",di1[i].a,di1[i].b); printf("%d,%d\n",di2[i].a,di2[i].b); } return 0; }
コードだけ書かれても質問がわからん
798 :
795 :2007/06/01(金) 02:14:15
bccを使ってコンパイル、実行しております。 このような配列の交換で、関数内引数を dint x[], dint y[] という形でなく、c++の状態で 配列を参照型で読み取る方法がある、 ような話を聞いたのですが、調べても分かりませんでした。 またstructとしましたが、classとして内部をpublicとした場合 パソコンの調子次第で、コンストラクタが無い、などのエラーが 出てしまいます。私はただ書き写すも同然の状態で STLを弄っていた後でそれが発生しました。その数ヵ月後に 起こらなくなりました (すみません、プログラムでstructのままpublicを残してしまいました) このような配列(のポインタ)を引数に取る関数を、 []や*など使わずに配列を引数に取り、目的を達成する方法を 教えて下さい。よろしくお願いします STLを使うしか無いのでしょうか?
そんな長い説明書かれても読めん
&
>>795 こんなんじゃダメ?(二箇所変更)
dint di1[3]; dint di2[3];
↓
dint data_array[2][3];
dint *di1=data_array[0], *di2=data_array[1], *temp;
これと
starswap(di1,di2);
↓
temp=di1;di1=di2;di2=temp; // 又は di1=data_array[1];di2=data_array[0]; でもおk
>c++の状態で配列を参照型で読み取る方法がある の意味が分からん。 vector<dint>& を意味してるのか、 dint(&)[3] を意味してるのか。 というか、swap 用にそんな大きなバッファ作らなくても、 1 要素ごとに swap していきゃいいじゃん・・・。
配列交換関数をテンプレート関数で実装すれば、配列サイズは得られる。 template<class T, std::size_t N> void swap(T(&x)[N], T(&y)[N]) { T t; for (int ic = 0; ic < N; ++ic) { t = x[ic]; x[ic] = y[ic]; y[ic] = t; } }
あ、ミスった。変数は極力局在化。 template<class T, std::size_t N> void swap(T(&x)[N], T(&y)[N]) { for (int ic = 0; ic < N; ++ic) { T t = x[ic]; x[ic] = y[ic]; y[ic] = t; } }
マルチスレッドプログラミングにおいて、排他制御をする場合、 グローバル変数の値を書き換える時以外、つまりグローバル変数を参照する場合にも 排他制御をした方がいいのでしょうか?
排他制御をしないと不具合が起こる場合はするだろ。 しなくても問題が起こらないプログラムなら、しなくていいだろ。
そのグローバル変数に書き込みしかしないなら、 排他制御はそもそも要らない。 参照で排他しないなら、書き込み途中のへんな値 (64bit変数で上位32bitだけ書き換わり済みとか)に なるかもしれない。
>そのグローバル変数に書き込みしかしないなら、 >排他制御はそもそも要らない。 変数への書き込み途中にコンテキストスイッチが起きたらどうすんの
書き込み途中ってどんな状態よw
読み込まれることのない Write Only な変数って意味ないようなキガス 書き込み途中 := 代入操作が レジスタ/イミディエイト → メモリ を複数回 複数回の転送の間にコンテキストスイッチが起きた
>>809 例えば64bit変数の書き込みがatomicでない(2回にわけて書き込まれる)ような
アーキテクチャで64bit変数に書き込むような状況でしょ。
まー変数の読み書きがatomicであるとしても、排他が必要かどうかは
ケースバイケースだよ。一般に原子性が必要な区間に排他をかけるわけで、
そういうコードブロックが単なる変数の読み書きより大きいのなら
いずれにせよ排他は必要。結局どういうコードかによるってことだ。
>>810 Memory Mapped I/Oとかのケースじゃねぇの
>>812 ふむふむ。 プロセス・スレッドから見ると ALL Write になるか
Memory → I/O 間の(仮想的)リード で結局排他なりの約束が必要だとは思うが…
どの程度 非atomic write を許すかだろうな
OSは、windowsです。 ファイルをzip圧縮したいのですが、 やさしい方法ないでしょうか。
「ZIPでくれ」って書き込むとしてくれるよ
>>815 >>816 zip32.dll発見しました。
でも、頭が悪いので使い方わかりません。
簡単な使い方が書いてあって、ぼくにも
できるdllないでしょうか。
a.txt->a.zip
a.zip->a.txt
がやりたいことなんです。
CreateProcess なり ChellExecute なりでアーカイバ起動すれば?
-ChellExecute +ShellExecute
zip32.dll を見てみたけど、コマンドラインで使う文字列を渡すだけじゃんか まあ複数ファイルを扱うアーカイバでもあるから、それ考慮するとちょっとめんどくさくなるかな
zipというファイル形式にこだわりがなくて
>>817 のように単一ファイルの圧縮伸張がしたいだけなら
zipの持つアーカイバ機能だのパスワード機能だの要らないんだから、
gzipやbzip2のようなものでいいっつかそのほうがお勧めだぞ
拡張子を.zipに変えて再出力するのが一番簡単だよ。
>>820 人大杉で書き込めませんでした。
簡単か難しいかも、わからないレベルなので、
簡単と聞いて元気が出てきました。
「コマンドラインで使う文字列を渡す」これを
頭に入れて、7-zip32.txt、7-zipAPI.txt、7-zipCMD.txt
をとにかく、もう一回読んでみます。
>>821 zipにあまりこだわり無いです。
gzipやbzip2ですが、検索してみます。
どうもありがとうございました。
>>817 system("zip a.zip a.txt");
system("unzip a.zip");
でおk
システムコール使えば確かに楽だな。 環境変数を用意しておかないとできないが。
>>825 system()はシステムコールとは無縁ですが。
シェルの機能だろ
system(システム)関数を呼ぶ(コール) という意味かもw
プログラムを実行したら Debug Assertion Failed! file: fread.c line: 101 Expression: (stream != NULL) for information on how your program can cause an assertion failure, see the visual C++ documentation on asserts. というエラー?が出たのですが、これはどういう内容なのでしょうか? 人のプログラムを実行したのですが、分からない事だらけで死にそうです。
assertマクロでstream!=NULLがfalseだったからエラーとして終了した。
>>829 assert っつうデバッグの仕組み。
fread.c の101行目って、、、VC++2005か、、、別のスレで似たようなの見たな。
freadでFILE*fpにNULLを渡したんだろう。
デバッグビルド時だけチェックが入る機構がある。
>>831 確かめてみたらfopenのところでNULLが返ってきてました。
fopenの第一数の指定の仕方ですが、"c:img/test.bmp"とかではダメなのでしょうか?
>>832 windowsだから"c:\\img\\test.bmp"じゃねーのか?
多分 / でも動作するとは思うが、それでも "c:/img/test.bmp"だな
別に'/'でもいいけど、>832のままではCドライブの相対パスになっているからそこが問題。
>>804 そういう違いを気にする位だったら、
各要素の交換にはstd::swapを使えばいいじゃない
>>836 それを言うなら、std::swap_ranges()を使えということになる。
template<class T, std::size_t N> void swap(T(&x)[N], T(&y)[N])
{
std::swap_ranges(x, x + N, y);
}
いや〜ん うっふ〜ん♪
>>837 そこでBoost.Rangeですよ
template<typename R>
void swap(R& x, R& y)
{
std::swap_ranges(boost::begin(x), boost::end(x), boost::begin(y));
}
ていうかboost/range_ex/algorith.hppにswap_rangesがないのは俺だけ?
Windows上でただのC言語のソースコードをLSICとかの古いコンパイラでコンパイルすると、 DOSエクステンダを利用してプロテクトモードのプログラムを実行するDOSプログラムが出来上がって 最近のBCCやVCだと、直接プロテクトモードのプログラムにコンパイルする、 Win32コンソールアプリが出来上がるってことでいいんでしょうか?
まあ大体合っているが、LSI-Cって俺の知る限りでは、 リアルモードの16bit DOSプログラムしか作れなかったと思う。
>>842 あ、本当だ、すみませんありがとうございます
やっとすっきりしました
844 :
795 :2007/06/02(土) 00:36:44
>>799-804 皆様方
返事が遅れて申し訳ありません。
参考にさせていただきました。
本当に、ありがとうございました。
C++初心者ですが自分でコンテナ作ろうと思ってます。 template <class T> myVector { private: int cur_size; T * array; public: push_back(T &x) { array = realloc (array, cur_size++); あれ?reallocって使っていいんでしたっけ?
>>845 少なくとも cur_size++ は間違ってる
++cur_size だな。
増分は 1 じゃなくて sizeof(T) のはず
そういやそうだ
>>845 T が POD 型なら大丈夫だけど、テンプレート引数になってるから
そんな前提は成り立たなくて、駄目ってことだね。
new で新しい配列を作って、copy 、っすね。
>>845 realloc ではコンストラクタが呼ばれないのでダメです
853 :
845 :2007/06/02(土) 03:05:10
みなさん、ありがとうございますm(_;_)m うーむ、vectorのソース読んでみます。不思議だ。
854 :
デフォルトの名無しさん :2007/06/02(土) 04:11:04
ビットフィールドのようなテクを使って1ビットの配列作れませんか? struct test { char m_1 : 1; char m_2 : 1; char m_3 : 1; char m_4 : 1; }; と書けばそれらしいのは出来るのですが・・・変数ではアクセスできません・・・
855 :
デフォルトの名無しさん :2007/06/02(土) 04:12:23
struct test { char m[4] : 1; }; だとエラーになってしまいます・・・ムリなんですか
856 :
854 :2007/06/02(土) 04:20:40
なるべく、容量と計算量を減らしたいのですが・・・よい実現法はないでしょうか?? 配列には参照と代入をしたいのですが
858 :
デフォルトの名無しさん :2007/06/02(土) 04:26:57
メモリ容量減らしたいってのならこんなのはどう? union uni_test{ struct str_test { char m1 : 1; char m2 : 1; } STR; int a; };
配列になって無いジャン
861 :
デフォルトの名無しさん :2007/06/02(土) 04:32:36
>>860 俺でしょw
いや、容量しか考えてなかったから・・・orz
boost::dynamic_bitset なんてのも
864 :
854 :2007/06/02(土) 04:40:04
結局、どうやったらいいんでしょうか?? boost::dynamic_bitset ですか??bitsetですか??
std::bitset と boost::dynamic_bitset は大きな違いがある。 そのくらいググれ。
866 :
デフォルトの名無しさん :2007/06/02(土) 05:21:51
使い方わかりましたよサンクス!!! #include <stdio.h> #include <bitset> using namespace std; main(){ bitset<1> m[10]; m[0]=5; printf("%d\n",m[0]); }
vector<bool> でいいじゃん。
vector<bool> は非推奨
vector<bool> は推奨
vector<BOOL>でいいじゃない
既に目的を見失っているな
それ、容量減ってませんから。
ワラタ
bitsetって内部でどんな実装してるの? 容量と計算量が問題みたいだけど、intとかにシフト使ってぶち込んだりしても 十分だと思ったり・・・
ヘッダを見ればいいんじゃね
>>876 VC6.0で見てきた
STL始めたばっかであんまわかんなかったけど、
結局longの配列作ってシフト操作してるっぽかった。
あってる?
まあ、そういう実装しかできないだろうね。
>>876 大丈夫、恐らくはあんたが書くよりは効率よく扱えるように書かれているから。
まぁ、機能制限つき劣化版を書くのは自由だがな。
880 :
デフォルトの名無しさん :2007/06/02(土) 14:15:04
コンパイラが用意してくれているセットはなかなか効率がいいんだ 自分であれこれ高速化を考えてみても大抵コンパイラの方がいい
日本語がおかしいな
boost::dynamic_bitsetの方が便利そうなんだけど 256bit分ぐらい使わないとコンテナのサイズがstd::bitsetより大きくなるようだ 大量に作るオブジェクトの状態フラグとして用いるにはちょっと重たいコンテナだね そういう特殊な用途に使う為に極小規模向きのdynamic_bitsetをつくるぐらいはありだと思う
#include <iostream> #include <boost/scoped_ptr.hpp> class Test { // 共通インターフェース class IFunc { // NVI public: void operator()() { func(); } private: virtual void func() =0; }; // 状態別の動作 class Off : public IFunc { void func() { std::cout << "off\n"; } }; class On : public IFunc { void func() { std::cout << "on\n"; } }; boost::scoped_ptr<IFunc> f; public: // デフォルトでOff Test() { off(); } int run() { (*f)(); return 0; } void on() { f.reset(new On); } void off() { f.reset(new Off); } }; int main() { Test t; t.run(); t.on(); t.run(); t.off(); t.run(); return 0; }
885 :
884 :2007/06/02(土) 15:00:12
>>884 のような関数オブジェクト(関数ポインタ)の差し替えで動作を変えるのって
切り替えがあまり頻繁でない、かつ実行時の条件判定を省きたいって要求の解決策として
適しているでしょうか?
あとこういうのってなんか特別な呼び方ありますか?
>>885 前段→いいんでないの。
後段→デザパタで言うとStateやStrategyかな。
「関数オブジェクト」に限定したパターンではないけどな。
888 :
884 :2007/06/02(土) 19:03:41
>>886 あーなるほど、状態オブジェクトとしてstateとか、アルゴリズムの切り替えでstrategyとか
そういうのなんですね…
実行時に条件判定を回避する事しか考えてませんでした
>>887 pimpl的な所はまさにそれな気がします
pimpl 関係ない。
実装的にはコメントにもあるけどNVIじゃまいか
ハァ?
>>890 オマエ NVI の 'I' が何のことか知らんのか?
impotent
Isitel
I don't know
New VIsual editor
_tcsncpy_s とstrncpy_sってどう使い分けるの?
TCHARかcharか
どのようなときにinline関数にすればいいのか分からないです。 クラスの単純なgetter/setterはinlineにするのが普通ですか? コンストラクタも、そのクラスが多用されるならinlineにするべきですか?
inline書いたって、展開されるかコンパイラしだいなんだし。 呼び出しが多い+get/setなら買いてもいいんじゃね?
>>899 基本は書かない。
どうしても速度が必要で inline を付けることで
改善できると確信できるときだけ使う。確信ってのは
つまり実測してみるってことね。
inline 関数は中身いじったら インクルードしてるファイル全部コンパイルしなおしだからねー。
あるクラスで 静的に浮動小数点の定数を確保しようとしたら↓ static const double aaa = 3.7; もの凄い勢いでVCに怒られました。 いまのところ、定数にせず、 絶対に最初のほうで実行する関数で初期化してますが、何か悲しいです。 こおゆった場合の、定石みたいなのってあるのですかね?
1. 普通の静的変数と同じようにクラス内で宣言だけ行い、外で定義する。 2. その値を返す静的なインライン関数にして、コンパイラの最適化に期待。 まあこんなとこ
あれって、なんでVC怒るんだろうな・・・ メンバの配列数に定数使いたいときは、どうすればいい?
浮動小数点定数はヘッダで初期化するのは無理だよ。
C++ の仕様。
>>904 みたいにする。
整数ならいいけど、古い VC++ はこの規格に対応してない。
そういう場合は enum を使うのが定石。
907 :
903 :2007/06/03(日) 00:47:11
>>904 ありがとうごぜました。1で我慢します。
2は良く分かりません。
>>905 整数だとokっぽいのです。
ヘッダでというか、クラス宣言内で、か。 浮動小数点定数は「必ずデータ用のメモリに置かれる」ものであって、 整数みたいに命令内に埋め込めるものじゃないから、 という風な理由だったと思う。
ついでに言うなら、テンプレート引数も整数はいいけど浮動小数点数はダメ。 template <int N> ... はいいけど、 template <double N> ... はダメ。
const int N = 123; とか言うのを C++ だとヘッダに置けるけど、 const double N = 123; とかいうのはヘッダに置くと、 複数のソースでインクルードされると、 外部リンケージオブジェクトの多重定義と見なされ、 リンクエラーになる。 整数と浮動小数点数での仕様の差は、意外と大きい。
そうなのか、サンクス 浮動小数点なんて、もう何年も使ってないんだが・・・ Cとかで仕事してるやつで、バリバリ使ってる!ってやついる?数学系除いて。 演算結果の表示時にのみ、ローカルに格納とかはあるけど。
物理化学系ならいくらでも。
ゲームもバリバリ使うだろ
やっぱ、数学とか物理とかはそうなの? 個人的に全部桁上げして整数で演算!っていう感じがあるんだが。
>>910 C++ だと const なオブジェクトはデフォルトで内部リンケージだから
const double をヘッダに置いてもエラーにはならなかったりする。
あれ? double も大丈夫だっけ? 覚え間違えてたか・・・。
>>914 科学計算で整数使うなんて考えられない。
科学計算ならFORTRANだNE!
919 :
915 :2007/06/03(日) 01:07:57
>>916 大丈夫なのはグローバルスコープの話ね。
クラスの静的メンバとしての const double は外部リンケージで、
クラス外での定義が必要。
FORTRAN みたいな糞言語は早く死滅して下さい><
>>917 そうなのか・・・
俺は0.1も正確に表現できない浮動小数点なんて使わないと思ってた。
世界は広いな・・・
実験精度よりよっぽど正確だよ。
925 :
デフォルトの名無しさん :2007/06/03(日) 07:46:20
円周率は、整数精算だろう
どこが科学計算?
科学計算は近似値が命 商売計算は桁が命
それだと科学計算ソフトを売ってる会社はどうなるんだ・・・
そういう意味じゃなくて、経理関係のソフトってことか?
3D を使ってるプログラムは小数使いまくりだぜ。 専ら float だけど。
>>930 無知でスマン。3Dで例えば何を浮動小数点で持つ?
座標も色も整数だよな?
コンシューマ機はどうか知らんが、 PC だと座標は普通に小数だぞ。
>>931 俺も無知なんですが
OpenGLとかだとシェーダ?意味良くわかんないけど
とりあえず光の原点、加減等色んなところで
float型を使ってるみたいっすよ。
例えば、小数点3桁までしか必要ないなら、整数で1000をかけて計算して、表示の段階だけ1000で割って表示すれば 格段に、演算速度は上がるよ
>>938 うむ、俺が言いたいのはそういうことだ。
でも、やっぱ浮動小数点とか普通に使われてるんだな。
勉強になったよ。みんなdクス
>>934 んな当たり前の事を今更言われても・・・
浮動小数点数は全体の有効桁数を重視したもの。 もの凄く大きい数ともの凄く小さい数を両方同時に扱う必要がある場合に有効。
行列配列から勉強しないと必要なリテラルが解らないんだろうな。
GPU のサポートあるから、固定小数点で自分で計算するよりゃ float の方がよっぽど速いな。
>>933 OpenGLはそもそも座標系が-1.0〜+1.0とかだし
ま、どっちみち誤差ありの世界だけど、
実数使えないと単なる正三角形だの円だの描くにも困るわな
>>939 GPUとか言わんでも今時のCPUにはコプロが載ってるし
浮動小数点演算遅いとか蛇蝎のように嫌うのはいつの時代の老人かって話だな
むしろ誤差が問題になるような問題領域かどうかが重要だよな
>>940 >OpenGLはそもそも座標系が-1.0〜+1.0とかだし
こちらでは0,0,0を原点の整数で持ってOpenGL側に渡すときに
-1.0〜+1.0の範囲に変換とかしないの?
整数にこだわるなあ。 誰も整数なんて使わないよ。
いや、なぁんもないよw 物体AとBが接触しているかの判定とかで色々思ったりする程度
floatならSSEでまとめて演算できるしな charもMMXでできるけど。
100×100の画像2枚をそれぞれ10×100に分割して 左から交互に並べた200×100の画像を作成するプログラムってCで作れますかね? 画画画画画 像像像像像 ・・・・・ A B A B A 1 1 2 2 3 なんかわかりにくい質問で申し訳ないんですが・・・
できますよ
サンクス
GDI+もfloat使うなぁ… ところで、昨今のPCはdoubleよりfloatの演算の方が遅いって聞いたことあるけど、本当なの?
速度は実測が基本。
float→double→floatがいろんなところで行われるからじゃね?
>>949 sseだと、floatなら4要素まとめて計算できるのに対して、
doubleだと2要素までが限界。
そういう意味ではfloatの方が圧倒的に速いね。
藤原の翁の時代は、圧倒的にdoubleの方が速かった。 何故なら、当時のCはfloat同士の演算でもdoubleへの格上げが起こっていたから。 今のCは超越関数にも全てfloat版が用意されているしx86系などのCPUについては ベクタ演算やキャッシュを考えてもfloatが不利の状況は随分と減った。 しかし、精度が高々10進に換算して7桁程度しかないのは痛い。
気になって、IA32アーキテクチャってやつを読んでググったりもした結果 さっぱりわかんね。ま、わかんなくて当たり前なんだけど。(頭悪りいから) 結局コンパイラ次第なのかな。 まぁ、いいや。
955 :
デフォルトの名無しさん :2007/06/03(日) 17:24:50
近似でおおざっぱに計算するときは、浮動小数点が速い(CPUに専用ハードが搭載されているからな) 厳密な計算をするには、整数でやるしかない 例えば、エンコーディングなどは、浮動小数点計算を多用するだろ?同じオプションで2度やっても 同じファイルは生成されない(これは途中の計算が近似になってしまっているという事だ) 例えば、円周率計算などは、何度やっても正確に数億桁求まる(整数演算は正確だという事だ)
つまり、doubleで実数演算を繰り返して円周率を数億桁正確に求めるプログラムを作った漏れは神と言うことですな。
958 :
デフォルトの名無しさん :2007/06/03(日) 18:02:31
触っちゃだめだよ。きっと変なのがうつる。
960 :
955 :2007/06/03(日) 18:11:28
実数計算は、桁落ちとかあるんだぞ しらんのか 10億と、10のマイナス20乗くらいを足してみると、10億になってしまうんだ しらんのか
よくわからんが、それは実行ごとに違った結果を返すの?
962 :
955 :2007/06/03(日) 18:18:15
float/double使わない奴ってmath.hインクルードしたことないんだろうな
ま、実際使わん方面では全然使わんからUnix方面では通常
libmがlibcから分離されてるんだろうけどな
ま、
>>955 の持ってるPCでは中の人がサイコロ振ってて、
sin()だのlog()だのが呼ぶたんびに違う結果を返すんだろw
964 :
955 :2007/06/03(日) 18:21:02
>>961 よく知らんが、FFTとかで計算順序(CPUへ命令が送られる順序)が変わったりするため
浮動小数点を使うエンコーディングなどは同一データが生成され無いと思われ
965 :
デフォルトの名無しさん :2007/06/03(日) 18:23:46
>>963 誰のPCでもMP3のエンコーディングすると、違うファイルが生成されるはずだ
同一オプションでMP3を生成して、ファイル比較ソフトundupで比較してみ
966 :
デフォルトの名無しさん :2007/06/03(日) 18:26:50
class CObjectがあるとき、配置newを使ってCObjectの為のリソースchar* pool を使いまわしにしているとする。 あるCObjectのインスタンスAが既にある時に同じリソースを使って別のインスタンスBを 作る際に、どうやらAのデストラクタが呼ばれないようなんで、"仮想"デストラクタを設計したい。 こういうときに使える常套的な方法をどなたかご存知ないでしょうか? 自分で思いついた方法は、同じCObjcetのインスタンスをファクトリから作らせるようにして 新たにインスタンスを作る際に既に存在しているインスタンスの"仮想"デストラクタを 呼ぶような設計にするぐらいです。
>>965 Lameで10Kほどのファイルを4回エンコしてみたが、結果かわらんみたいだよ。
968 :
955 :2007/06/03(日) 18:34:29
>>967 使ったソフトの入手先教えて 再現するか試してみるから
午後のこ〜だでも変化なし。
>>968 cdex v1.51付属のlameエンコーダ。
普通にcdexからエンコした。
入手先は忘れたよ。CDEX_151.EXEって名前のインストーラだけど。
4分のapeをそれぞれ5つ変換してmd5sumで比較してみたけど、 lameなら全部同じで、oggencは全部違った。
972 :
955 :2007/06/03(日) 18:41:18
確認するけど違いは、音質や、ファイルサイズのことでは無いよ 厳密に1ビットもズレが無いって事だよ
>>972 んなの分かりきっとる。俺はUnix環境じゃないからcompコマンド使ったよ
974 :
955 :2007/06/03(日) 18:47:45
エンコーダとマルチコアとかで結果は変わってくるようだな 一般的に、並列処理する部分があれば、浮動小数点計算は、桁落ちや、情報落ちが 起こって最終的な結果がかわる
975 :
955 :2007/06/03(日) 18:49:24
ぁあ…キムチ食べるっ、キムチ食べますうっ!! ビッ、ブリュッ、ブリュブリュブリュゥゥゥーーーーーッッッ!!! いやああああっっっ!!おかわりしないで、お願いぃぃぃっっっ!!! ブジュッ!ジャアアアアーーーーーーッッッ…ブシャッ! ブババババババアアアアアアッッッッ!!!! んはああーーーーっっっ!!!キッ、キムッ、キムチィィィッッ!!! ムリムリイッッ!!ブチュブチュッッ、ミチミチミチィィッッ!!! おおっ!メイド イン チャイナッ!!チッ、チッ、チャイナッッ!!! 原産国見てぇっ ああっ、もう ダメッ!!はうあああーーーーっっっ!!! ブリイッ!ブボッ!ブリブリブリィィィィッッッッ!!!! いやぁぁっ!あたし、こんなにいっぱいキムチ食べてるゥゥッ!
>>966 配置 new やメモリ領域の使い回しをやめればいいと思うよ。
TUBAMEや地球シミュレータやその他諸々の並列演算処理系を否定する勢いだな。
ファイルヘッダにエンコード日時欄があるとかいうオチは勘弁だぜ?
まー何だ、浮動小数点数では結合法則や交換法則が厳密にはなりたたんことが
あるのは事実だわな。
A=すんごいでっかい数
のとき、
数学的には
A-A+1 == 1
でなければならないが、加算の順序を変えたりするとそうはならなかったり。
だから、逐次的でないやり方で計算をすれば確かに結果は変わり得るだろう。
とはいえ「逐次的に計算すれば」問題は無いわけだから、浮動小数点数の
演算は再現性が無いから糞、というように読み取れる
>>955 は
暴論としかいいようがない(実際lameの結果はビットパーフェクトで
再現してるよな)し、逐次的でない並列計算を行うにしろ、誤差が
許容範囲に入ってて、ビットパーフェクトの再現性が必要でないのなら
別に問題ではないわけだよな。
全く同じ計算を同じCPUの同じ命令で行えば、 誤差も全く同じになるから、結果も同じにならないわけがない。 違ったらそれこそPentium以上の大事件だ。
>>980 だから、「計算順序を変えたら結果が変わる」ってだけだべ
要は「同じ計算」をやってないってことなんだが
マルチコアでも、コアによって計算結果が違うことは無いだろう。 一つ一つのデータを見た場合、 それに対する計算は常に同じ順序で行われるわけだから、 並列計算時でも結果が違うことは無いだろ。
>>978 oggencが入れているかどうかは知らないけれど、日付けのフィールドは確かにあるね。
命令スケジューリングで並び替えられたらマズそうな気が 結果が変わるような浮動小数点演算を並び替えたりはしないんだろか
>>984 例えば、'r = a + b + c'をコンパイルして
mov r, a // r = a
add r, b // r += b (1)
add r, c // r += c (2)
となった場合に、(1)と(2)の順番が入れ替わることがありえるのかって話だよね?
↑のコードだと、依存性があるからアウトオブオーダーで入れ替わることは無いんだけど、
他のコンパイル結果ならそういうことが起こるかもしれない。
ちょっと分からない。
まぁ、しないね。 寧ろ、x86系の場合FPUとSSEで精度が変わる方が厄介。 #まぁ、それもコンパイルオプションで強制できるけど。
987 :
デフォルトの名無しさん :2007/06/03(日) 22:05:12
CPUのキャッシュに送られてからでも計算順序は変わる可能性あるだろ OSとか他の命令動かしているんだし OSの命令が入り込むかどうかで変わるだろ
988 :
984 :2007/06/03(日) 22:06:35
>OSの命令が入り込むかどうかで なんと危なっかしいアーキテクチャだろうか。
>>987 の脳内ではマルチタスクOSではプログラムの逐次実行という
ノイマン型計算機の基本すら保障されないらしいw
991 :
987 :2007/06/03(日) 22:21:29
>>987 燃料投下乙。埋めネタとしてはまぁまぁ上出来だったよ。
CPUの最適化ってのは丸め誤差や情報落ちその他、 浮動小数点計算について回る存在しないことを前提に 行われるものだったのか
また面白くもないものを引っ張ってきたようだな(@wぷ 計算機アーキテクチャに関する書籍でも買ったらどうかね(@wぷ >>991
(@wぷ
梅
1000なら幸せになれる
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。