スレを勃てるまでもないC/C++の質問はここで 17
1 :
デフォルトの名無しさん :
2010/09/22(水) 09:33:10
なんかいっつも完走まで次スレが建たずに俺が立ててるような錯覚に陥ってきたぞ
書き込みてすと
4 :
デフォルトの名無しさん :2010/09/22(水) 10:31:12
>今からやるならCかC++どちらがいいですか? >用途は秀丸エディタのマクロから利用するdllと変換モジュールの作成です >知識はC#,Actionscript,javascriptです >やりたい用途はDLL作成です >用途は秀丸エディタのマクロから利用するdllと変換モジュールの作成です 前スレ988で質問した者です C#で作成したDLLは呼び出し元のプログラムの間に中継するDLLが必要なため、 DLLのみCかC++で作成したいのですが今からやる分にはどちらがいいのでしょうか?
6 :
デフォルトの名無しさん :2010/09/22(水) 20:43:08
vectorのswapについて質問いたします。 ファイルのパスと、ファイルのヘッダー部分だけを取り込んだ情報をvector FileListとしてもち、 ファイル名だけをListBoxに表示しているプログラムで、選択したファイルを上下に入れ替える 処理を書いてみました。 case IDC_BUTTON_UP:{ int i = SendMessage(hList , LB_GETCURSEL , 0 , 0); //リストボックスのカーソルに合わせる if( i== LB_ERR || i == 0 ) return (INT_PTR)TRUE; wchar_t file_name_buff[_MAX_PATH]; //リストボックスの入れ替え SendMessage(hList, LB_GETTEXT, i, (LPARAM)file_name_buff ); SendMessage(hList, LB_DELETESTRING, i, NULL ); SendMessage(hList, LB_INSERTSTRING, i-1, (LPARAM)file_name_buff ); SendMessage(hList, LB_SETCURSEL, i-1, NULL ); std::swap( FileList[i-1], FileList[i]); //vectorのほうの入れ替え return (INT_PTR)TRUE; } リストボックスの表示はうまくいきましたが、動作確認のため for(i=0;i<FileList.size();,i++){ SendMessage(hDebugList, LB_ADDSTRING , 0 , (LPARAM)FileList[i].FileName.c_str()); } のように列挙してみても、vector側の順番が変わっていません。 コンパイラからはエラーが出なかったのですがswapの書き方がまずいのでしょうか。 あるいはイテレータを使えば順番が換わっているのでしょうか。
8 :
6 :2010/09/22(水) 21:28:01
ほかにswapできるコンテナないですから、コンパイル通ってる時点でOKなはず。 class FileMemmber { public: wchar_t FilePath[_MAX_PATH]; BITMAPFILEHEADER BitFileHeader; BITMAPV5HEADER BitFileInfo; }; std::vector<FileMemmber> FileList; こんな感じです。 コピーコンストラクタなんで作ってないですが、デフォルトであるものだと理解してましたが。
おかしーね。 それなら行けてるはずなんだけど。 他に考えられることは……どのタイミングでhDebugListに向けて列挙してる?
10 :
6 :2010/09/22(水) 21:39:13
え〜と、 ほか用に作ったボタン押したときに小窓作って表示してます。 case IDC_Horizontal:{//未実装 DialogBox(hInst, MAKEINTRESOURCE(IDD_DEBUGMSG), NULL, debugproc); return (INT_PTR)TRUE; } で、 INT_PTR CALLBACK debugproc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) のWM_INITDIALOG内です。 あと、FileListはグローバルで定義してます。
FIleMemmberにShallow Copy不可なメンバが含まれているのと違う?
それだ
実はファイルパスをwchar_t[]じゃなくてwstringで持ってるでしょ
>>6 のコードでc_str呼んでるじゃん
13 :
6 :2010/09/22(水) 21:53:35
いろいろとお答えありがとうございます。 自分初心者なもんで、コンストラクタとか良く理解できていません。 Shallow Copyとかもはじめて聞いた状態でして、もう少し自分で勉強してみます。 クローンの場合Shallow Copyはできない、とかありましたからそれが原因かもしれません。 ドラッグアンドドロップでファイルを受け取って、ファイルストリームからBitFileHeaderを read使ってバッファに読み込んでます。 で、ファイルメンバークラスもそこでバッファ用に定義してます。 ファイルリストにはそのバッファを代入しているのですが、それが原因でしょうか。 しかし、 FileList.push_back(file_memmber_buff); とやってるんですが、別に問題あるように感じないし..... う〜〜ん。
14 :
6 :2010/09/22(水) 21:56:34
>>12 ああああああ
わかりました。
直してみます。
そうです、型勘違いしてました。
15 :
6 :2010/09/22(水) 22:01:36
いや、違いました。 やっぱり、FileListはwchar_t[]で持ってました。 6でstirngになってるのは、デバグ用にヘッダの内容書き足して表示してるからでした。 orz
そろそろ言ってる事がイミフになってきたので実際のFileMemberをコピペして貼ってくれ 長いようならcodepad使っても。
17 :
6 :2010/09/22(水) 22:24:46
どう考えても入れ替わってるなあ int main() { std::vector<FileMemmber> FileList; FileMemmber fm; std::swprintf(fm.FilePath, L"111"); FileList.push_back(fm); std::swprintf(fm.FilePath, L"222"); FileList.push_back(fm); std::swap(FileList[0], FileList[1]); for (int i = 0; i < FileList.size(); i++) std::wprintf(L"%ls\n", FileList[i].FilePath); }
19 :
6 :2010/09/22(水) 22:59:26
スミマセン ListBoxのソートがtrueになってました.....orz
いろいろ、お手数おかけしたうえ、 くだらない理由で、ほんとスミマセンでした。
しゅぎょーがたりん!
externなどのファイルをまたいだ宣言?などについて説明している初心者向けのサイトはありますか? main.cppから#includeするファイルが.cppの時と.hの時との違いがわかりません・・・
分割の定石 でググルと一番最初に来るとこなどではだめですか?
>>23 まさにそのサイトの通りです
ありがとうございました
25 :
デフォルトの名無しさん :2010/09/23(木) 07:24:10
printfとwriteはどちらが早いですか。printfはリダイレクトしてます。
>>25 どうみてもwriteの方が文字数が少なくて早そうに見えますが、実はprintfもそこそこ早く入力できるかと思います。
リダイレクト? はて、早いかどうかと何か関係があるのでしょうか。
関数中でstaticで宣言された変数ってどう思いますか? 滅多に使われている事がない気がするんですが
グローバル変数の代わりに使ったりする
面倒の原因なので、あんまり使わないほうがよいとされる(もちろん使ったほうがすっきりする場合もあるが)
inlineにする判断基準がいまいちはっきりしない
メンバ関数の中で使ってクラスのメンバの数を減らせるのに使ってる
おれはインターフェース境界以外仮想関数も含めて全部インライン
main.cpp #include <iostream> class Test { public: Test() {} ~Test() {} void output(){ std::cout << "output"; } }; int main() { Test t; t.output(); return 0; } このコードはインライン化されているんですか?
されるかもしれないね 実際にインライン展開されるかどうかは結局のところコンパイラの気分次第だが
const char * MY_NAME( "softWareName" ); C++でこんな書き方をしている人がいたのですが、 C++をわかっていないC言語ユーザが書いたってことでOKですかね 普通に考えたらstringとかを使うと思うんですが
必ずしもそうとはいえない C++だからってstring使わなきゃいけないわけではないし、 C++標準のクラスや関数がみんなstringを受け付けてくれるわけでもないし const char * を引数に取る関数に渡すんだったら、わざわざstringにするだけ無駄なわけで
ちょっとした文字列でもわざわざstringとか嫌すぎ
C言語のとある参考書の問題 switch_(i)_{ ____case_1: ______a_=_1; ____case_2: ______a_=_2; ______break; ____case_3: ______a_=_3; ______break; ____case_4: ____case_5: ______a_=_5; } 上記のコードにたいして ・iが1ならaの値はどうなるか。 ・iが4ならaの値はどうなるか。 との問題なのですが、 本に記載されている解答が iが1のときaは2 iが4のときaは5 となっています。 後者は分かりますが、前者の解答がいまいち(いや、全く。。)理解できません。 iが1のときaは1、だと思うのですが・・ WEB正誤表には記載がありません。 上記の解答が正しいのかどうか ご教授下さい。
なぜ後者がわかって前者がわからんのだ a = 1の後にbreakがないからa = 2されるだろ
>>39 実際組んでみることをせず、頭の中だけで考えてました。
breakに出会わない限り、以下条件を無視して実行していくのですか。
おかげで理解が進みました。
サンクスです。
vectorのresizeやreserveって中の配列の再確保が行われて要素へのアドレスって無効になりますよね?
すみません。 「特定時刻 差分 現在時刻 時間カウントが1ループする時刻 の4変数で時差の経過を判定する処理」 を複数ソースファイルで共有したいのですが、 #defineで書く関数ではこういう処理を作る事はできるのでしょうか? ヘッダーファイルに書ければ共有が楽そうなのですが・・ 何か良い関数の共有方法があれば教えて頂けますと幸いです。
>>43 #define なら普通にヘッダに書けばいい
それでそれぞれのソースに展開されるだろ
>>43 もちろん、できる。
けど、C++だったら、inline関数の方をおすすめするけどね。
#defineでやるなら、
do { } while(0)
とかを使ってうまくやりなね。
結構とんでもないエラーに悩まされたりするからなw
>>45 どういう書き方閃けたら人生楽しいんだろうなー
ど→そ
48 :
45 :2010/09/25(土) 20:38:47
>>46 別に俺が考えたわけじゃないけどね(当たり前だけど)
Linuxカーネルでよく使われている手法
ウイルスバスターを入れたときに、m$ vc++ runtimeを入れろって怒られた なんで、C++なのにランタイムを入れないとダメなの? MFCとかかな〜
いや、Cにもランタイムはあるよ。 msvcrt.dllとかってのがそれ。 C++にも当然あるw
標準ライブラリをstatic linkすると空っぽのmainの場合でも 8kb -> 700kbぐらいになったな でもある程度大きいやつなら元が4Mぐらいになるからこれぐらいの増加は別になんでもないのかも
52 :
49 :2010/09/25(土) 21:02:58
>>50 vb6のランタイムの正体はランタイムだけど
vc++のランタイムの正体は、mfcとかのライブラリってことか
>>52 だけじゃないけどね。
STLの部分とか標準ライブラリの部分も含まれているはず。
ランタイムってランタイムライブラリの略じゃないの
55 :
49 :2010/09/25(土) 21:15:52
>>53 stlとかも入っているのか
thx
>>54 jreとかだとライブラリというかフレームワクークじゃないかな
それに、ランタイムって実行環境って言う時もあるから
ランタイム = 仮想マシン/インタプリタってイメージがあるな
dllがexportしてる名前一覧できるやつあるんじゃん あれで見てみればいい
dumpbinってまだあるのかね? あれがあれば、 dumpbin /depends xxx.exe とかで見れたはず。
58 :
43 :2010/09/25(土) 23:10:08
>>44-48 ご助言ありがとうございます。 defineマクロの置き換えの危険性を、調べて改めて実感し
inline関数について調べてみてそちらで解決しました。感謝。
て
って
コーディングルールでガチガチに縛るより、普段は適当にして インターフェース境界だけルール守るってしたほうが生産性ググッと上がるよね
ヘッダファイルに#include <string>って書いてあるのに、 cppにも#include<string>って書きますか また、フレームワークを使っていると暗黙的にヘッダが#includeされますが それについても明示的に#includeしているか教えてください
>>63 意味ありません
インクルードガードで2回目以降はスキップされます
フレームワークについては中を良く見て見ないとわからない
65 :
63 :2010/09/26(日) 20:38:35
初歩的な質問すみません。 int a = 1024; を byte b[50]; の b[7] に入れたいのですが、 memcpy(&b[7], &a, 4); とやって値を移そうとする事は正しいのでしょうか? また、その結果を確認しようとして int c = (int)&b[7]; としてみたら全く違う値になっていました・・。 どっちで値が壊れてしまっているのでしょうか? どう受け渡せば上手く行くのでしょうか・・orz
int c = (int)&b[7];
68 :
66 :2010/09/27(月) 17:42:28
>>67 よく中身を見たら、memcpyは7に最下1バイト 8 9 10と逆順に入るんですね。
それを直で移すからバイトを逆順に辿るから変な値になる・・と。
データが逆バイト順にならない方法はないか調べてみようかと思います。ありがとうございました。
>>68 リトルエンディアンとか知らないのかこの馬鹿は
70 :
66 :2010/09/27(月) 18:26:28
馬鹿って言う人も馬鹿なんだい(´・ω・`)
そういうことにはunion使うとすっきり書けるかもしれない でも余計混乱するだけかもしれない
#include <stdio.h> double root(double a) { double p1, p2, p3; p1 = a; p2 = (p1 + a / p1) / 2; (p1 - p2 > 0) ? p3 = p1 - p2 : p3 = p2 - p1; if (p2 < 0) p2 = -p2; if (p3 <= 1.0 * 10e-10) return p2; return root(p2); } int main(void) { double x; scanf("%lf", &x); printf("%f", root(x)); return 0; } 1>sample.c(8): error C2106: '=' : 左のオペランドが、左辺値になっていません。 コレはどういう意味でしょうか
ようするに左のオペランドが、左辺値になってないってことだよ
なるほどわかりません もう少しぃ分かりやすく
代入してはいけないものに代入してるからうんこ
>>72 (p1 - p2 > 0) ? p3 = p1 - p2 : p3
=
p2 - p1;
こう書けばわかるだろうか?
あなたは p2 - p1 を (p1 - p2 > 0) ? p3 = p1 - p2 : p3 に代入しようとしているんだ
演算子の優先順位を調べてみるといい
d
つーか、代入だけして値を利用しないのなら条件演算子なんか使わずに素直にifでいいだろ。
double p3 = p1 > p2 ? p1 - p2 : p2 - p1; って、書いてて思ったんだけど、p1 = aの意味が判らん。
struct Ref { int & r; Ref(int & r_) : r(r_) {} }; void F(Ref const &ref) { ref.r += ref.r; } これコンパイルは通るんですけど合法なんですか? constなRefのメンバだからrもconstなんじゃないの?って思うんですけど…
指す先まではconstにならないので constになるのはRefそのものだけ
82 :
デフォルトの名無しさん :2010/10/01(金) 17:11:57
int foo[10] と int bar[10] の中身が全て同一であることを確かめるのってどうやればいい? for文で回す・直に全部書く以外で
std::equal(&foo[0],&foo[10],&bar[0])
素直にforで回すのが正道 なんで変なことしたがるかな
C++だったらequalが正堂じゃないのかw
equalなんてあったのか thx
struct Vec { float x, y, z; }; Vec v1, v2; v1 = v2; // A memcpy(&v1, &v2, sizeof(Vec)); // B ぶっちゃけどっちが速いんですか?
同じだろ
>>88 構造体の代入にmemcpy()使うなよ。
何日かまえに、どっかのスレで「memcpy()は構造体の代入の関数版」とか
教えてるやつ見たけど、構造体の代入にmemcpy()使うやつはアホだろ。
PODなら別に
パディングの問題があるから同じじゃない
パディングコピーしても同じだろ ダメなのはメモリブロックの比較だ
いや、阿呆だ。PODなら尚のこと、コンパイラに任せた方がいい。
同じでも、構造体の代入をmemcpy()でやってるやつはダメだろ。
なんでだよw 宗教的理由でもあるのか?
マヌケだから。
>>98 intの変数とかmemcpy()で代入してたらおかしいと思うだろ?
昔は構造体代入とか構造体引数がダメなコンパイラがあったのは事実だが・・・。 いまさらそんな心配するかね。
ウィットな一行にマトメろよ
、、ヒック、ウィット、、、オェー
IDが出ないせいで誰が誰だか
C++でプライベートな面罵関数のポインタを外部から取得する方法 ないでつか?
#define private public
friend
静的テーブルに関数ポインタを並べたいのでフレンド関数で取得って 出来ない気がするんですが旨い方法ありまつか? const functbl[]={ {(void*)&Class1::func1,0,0}, {(void*)&Class2::func2,0,0}, 、、、 }; g++ でこんなテーブルに並べたいのですが・・
>>108 それ、publicならうまくいくのか?
メンバー関数へのポインタをvoid*にキャストしても動かないだろ。
Class1::func1, Class2::func2 がstaticなら、 class Class1 { friend class Z; private: static void func1(); }; class Class2 { friend class Z; private: static void func2(); }; struct Z { void (*pf)(); int a; int b; static const Z functbl[]; }; const Z Z::functbl[] = { { Class1::func1, 0, 0 }, { Class2::func2, 0, 0 }, };
>>109 アドレスが欲しいだけなのです
>>110 うおおおおおすげぇぇぇぇ
ありがとうございますorz
class Class1 { public: void func1() { } }; class Class2 { public: void func2() { } }; class X {}; template<class T> class Y : public X { public: T f; Y(const T & p) {f = p;} }; int main() { Y<void (Class1::*)()> a(&Class1::func1); Y<void (Class2::*)()> b(&Class2::func2); X *array[2] = {&a, &b}; } ってしてみるとか 冗談だけど っていうかやるならBoost.Any使えばいいんだけど
なんだstaticだったのか
他のプロセスを起動して、終了するまで待つにはどうすればいいですか? CreateProcessだとWindows上でしか動かないと思うので マルチプラットフォームで動作するCreateProcessみたいなのがあればいいんですが
>>114 #if defined _WIN32
CreateProcess()
#elif defined __GNUC__
execvp()
#else
#endif
ぴゅっ_/ ̄\ . ==| ^o^ | <これは しょうゆです .  ̄|\_._/| | | . | | \_/
119 :
114 :2010/10/03(日) 22:50:13
Windows以外ではsystemでやることにします ありがとうございました
質問です RAIIはどう発音するのでしょうか?
アルエツー
int n=100; double *array; array = (double *)malloc(sizeof(double)*n); といった感じで作った配列の要素数を調べることはできないでしょうか? 通常の配列における double array[10]; yousosuu = sizeof(array) / sizeof(array[0]); といった操作をしたいのです。 環境はVC Express 2010を使っています。
できません どこか別の変数に覚えておいてください
環境依存でいいのか? HeapAllocで確保するようにして, HeapSize使うとか? 決しておすすめはしないが
vectorつかえばすべて解決
文字列みたいに終端の決まりごとさえあれば
std::array
128 :
108 :2010/10/04(月) 23:52:52
>>110 他クラスファイルのクラスのプライベートメンバ関数をテーブルに並べてアドレスを獲るために↓のように
ヘッダとソースに分割したらエラーになってしまいました・・・どうすべorz
//----------------
<class1.cpp>
#include "mytbl.h"
class Class1 {
friend class Z;
private:
static void func1();
};
//-----------------
<mytbl.h>
struct Z {
void (*pf)();
int a;
int b;
static const Z functbl[];
};
//-------------------
<mytbl.cpp>
#include "mytbl.h"
const Z Z::functbl[] = { ←Z の名前がなんちゃら、、、のエラーorz
{ Class1::func1, 0, 0 },
{ Class2::func2, 0, 0 },
};
そもそもprivate関数を外部に渡そうという考えが邪道 list<void(*)(void)> FuncPtrRegister; class Hoge { private: static void Func(void) {} public: static void Register(void) { FuncPtrRegister.push_back(Func); } };
newで生成したインスタンスがどこからも参照されなくなったときに、 他の多くの言語では暗黙にガベージコレクトの対象となるが、 C++では明示的にdeleteしなくてはいけないところを、 自動的にdeleteしてくれるようにしたものがスマートポインタである。 という解釈で正しいでしょうか……?
タスクはリスト形式じゃなくてコンポジットの方がいくらか良いよ
>>130 正しいよ。
ただし、わかってると思うけど
「スマートポインタ」って言っても、実装は1種類じゃないことに注意してね。
スコープに束縛されてるオブジェクトにポインタの管理を移譲しただけだよ
134 :
130 :2010/10/05(火) 22:24:55
お返事ありがとうございます。 確認していただけて安心しました。
配列をメンバに持つとかそういうレベルじゃなくて 普通に配列として宣言して使う奇特な(半ば狂った)配列クラスとかあるんれすか?
何だって?
継承するクラスについて、その継承元が例えデストラクタ 処理が特に必要のない単純なデータクラスであっても やはり仮想デストラクタを定義しておく必要はあるのでしょうか あるとしたらその理由を教えていただければ
定義しておかないと継承先のデストラクタが呼ばれなくて困る
基底クラスの参照かポインタから呼ぶクラスじゃなければ別に仮想にしなくていいよ 無駄なオーバーヘッドだからね
>>137 class A{
} ;
class B : public A{
~B() ;
} ;
A *p = new B() ;
delete(p) ; // ←だとB::~Bは呼ばれない
class A{
virtual ~A()
} ;
としておけば親クラスのポインタから削除しても継承先のデストラクタが呼ばれる
どうも解答ありがとうございます
>>138 確かにそうなんですがC関数用の構造体を拡張する場合など少し疑問に思いまして
つまりそんな場合はそもそもデストラクタが必要となるような機能をつけるなということですね
>>139 オーバーヘッドも結構気になりますね
結構高速なループ中で使う予定なので
>>139-140 つまり継承し、かつデストラクタなしのクラスは
とりあえず通常の構造体的な使用にとどめておくべきということでいいでしょうか
なかなか全容が把握できずすみません
派生クラスの静的型情報を失うようなコードを書くって設計時からすでに解ってる時にvirtual dtorを書く virtualを付けないのが基本でvirtualを付けるのはそういう特殊なケースだけということを忘れちゃいけない
>>141 データクラスとか構造的使い方とか関係ない
要は継承先のクラスの型をそのまま使うだけならなんの問題ない
class A{
public:
virtual void func()= 0 ;
} ;
class B : public A{
public:
~B(){}
void func(){}
} ;
class C : public A{
public:
~C(){}
void func(){}
} ;
B* b = new B() ;
C* c = new C() ;
b->func() ;
c->func() ;
delete b;
delete c ;// ↑子クラスをそのまま扱うだけなら問題ない
//↓例えば型の違う子クラスを親クラスのポインタ経由に一括に処理したいときなどに問題がおきる
A* a[2] = { new B(), new C() } ;
for ( int i = 0 ; i < 2 ; i++ ){
a[i]->func() ;
delete a[i] ;// ←継承先のデストラクタが呼ばれない
}
仮想関数とか継承のメリットを実感してないとその辺の話は解かりにくいんじゃないかなぁ? ただなんとなく使ってる人だと「え?そんなことする必要あるの?」って感じだろうし
解決案:仮想デストラクタを放り投げてshared_ptrを使う
継承を使わない。使っても仮想化しない。
>継承を使わない。 コレは良いとして >使っても仮想化しない。 これは違うだろ 仮想化しないことがマズいんだから
>>146 よく解かってないないなら黙ってればいいのに
>>145 それはそれでshared_ptrがなんでそうなるか理解して無いと罠にはまりそうだが
仮想化しないのは良いだろ 仮想化するひつようがないところではするべきではない
templateってプリプロセスな言語機能と考えていいんですか? template<typename T> void Func(T arg) { } だと Func<int>(10); というのが見つかったら、 コンパイラが、 void Func(int arg) { } という関数を仮想的に自動生成してコンパイルしている、という解釈でしょうか?
あまり細かいこと言わないならそれでいいぜ
かなり初歩的なことなのですが質問させてください いままでデフォルトコンストラクタは通常のコンストラクタと同じような クラス名(){} みたいな関数だと思っていました しかし次のA、Bの処理を行ったところ、所要時間に大きな差が見られました class X1{ /*何も無し*/ }; for( UINT i = 0; i < 100000000; ++i ) X1(); // 処理A class X2{ public: X2(){} }; for( UINT i = 0; i < 100000000; ++i ) X2(); // 処理B もしかしてデフォルトコンストラクタが上記のような関数というのは大きな勘違いですか?
どっちが速かったの? 具体的な数値で
>>154 処理なしforループとABforループ10回の平均をとったら次のようになりました
for単体時間≒330[ms]前後
A処理時間≒330[ms]前後 実質処理時間≒0[ms]
B処理時間≒3450±150[ms] 実質処理時間≒3000[ms]強
一回のBループ処理では約0.03[um]となりますが積み重なると大きな差になりました
hppとcppで分けた?
C++の仕様は処理速度まで定めてないからな・・・ 特定の記述方法が早い遅いといったことはあるかもしれない でもそのケースはただ単に最適化してないだけじゃないか
単純な処理なのでcpp一つでした 分けてやってみましたが傾向は特に変わらないようです そして最適化は無効にしてあり(等価な最適化負荷方法がわからない) そのまま最適化有効時の話にはできないんですが 有効だったとしても少なくともAよりBが速くなることはまずありえないですよね
>>157 ・・・もしかして最適化すると無意味なコンストラクタは完璧に削除される、
というか一部を抜き出して処理時間を論じることはもはや無意味になるんでしょうか
自分は単純に最適化で実行速度などの全体的なスケールが縮小される
→一部要素であっても最低限比較時の傾向(比較的早いとか遅いとか)は保持されると思いこんでいました
しかしそれだと一部処理の最適化時の負荷評価はいったいどうしよう
X1はPODだけどX2はPODじゃないのが最適化に影響してるんじゃないの
最適化を切ってるってことはたぶんVCのデバッグビルドかなんかだと思うけど、 それなら実行ファイルにデバッグ用の「現在の行位置」を埋め込まなくてはいけなくなるX2の方が遅くなりそうな気がする。 つーか最適化切った状態で比較してもなぁ…… あとさっきから言ってる一時処理の最適化時の負荷評価という意味が全く分からん 一時処理ってなんだ
もしかしたら、最適化がどういうものか判っていないんじゃないだろうか。
結局コンストラクタを書く場合とデフォルトコンストラクタに任せる場合の オーバーヘッドの違いはどうなるんですか?
デフォルトコンストラクタはそもそも最適化した形で実装されている可能性がある。 自分でコンストラクタを書く以上は、それが空であったとしても、コールをするだろうし、 それを取り除けるのは最適化処理、 ということではないかな? (ちなみにコールってのは結構負荷あるぞ) 試しに最適化を入れて測ってみなよ。 ほぼ同じになるかもよ?
というかよく考えると最適化とかあまり関係なくないですか?
>>153 のようにしたら(最適化無効であろうと)デフォルトコンストラクタがあるはずの処理Aが
実際には比較にならないほど速く終わったその理由を伺っているわけですから
>>160 試しに両方にデストラクタや代入演算子を追加しても違いは埋まりませんでした
興味深いことに両方に仮想関数を追加したら処理時間は同じになりました
他クラスで無駄にvirtualしていたのを除去したら少なくとも同じテストでは大幅に速くなりました、ありがとうございます
>>165 残念ながら最適化してまともに試験できる方法を知らないです(無意味なfor処理はすっ飛ばされるので)
しかし自分としても仰っているように(ただし最適化に関わらず)デフォルトコンストラクタ(やその負荷)は
上述したような例外を除いて基本的にはそもそも影も形も存在しなかったんではないかと考えています
>>166 最適化がかかると、処理に関係しない部分は全く存在しない処理としてすっ飛ばされるので関係有る
>>168 最適化を無効にするってことが如何に意味がないか判ってないな。
そもそも何のために所要時間を知りたいの?
わざわざ遅くしたいだけなら無意味にウェイトすればいいだけだし、
速くしたいのなら最適化するのが当然だし。
ていうか、いくら最適化OFFだからといっても、 コンパイラが暗黙のコンストラクタなんて価値のないものを呼び出す義理はねぇ
forループがなくなる事を恐れて最適化を切ってるのなら、 ループカウンタにvolatileつけるとなくならないかもしれない。 ためしてないからうまくいくかわからないけど
論理的に全く同じ内容でも テストする順番を入れ替えたりするだけでも全然結果が違うことはあるよ 多分これは最適化の問題じゃないと思う 自分はよくわからない分野だけどキャッシュメモリとかハードのほうでなんか色々あるんだと思う
174 :
デフォルトの名無しさん :2010/10/07(木) 16:30:55
visual C++ 2010 Expを使ってシリアルポートの通信プログラムを 作っていて、BCD構造体という使いたいのですが、 BCDという識別子が認識されません。 これを使うにはどうしたらいいのでしょうか? 作成中のプログラムはwin32コンソールアプリケーションで すべてC言語で書いています。 <stdio.h>、<stdlib.h>、<windows.h>をインクルードしています。 windowsでのプログラミングは初めてなんで見当違いな聞き方かもしれない ですけどよろしくお願いします。
昔なんかの本で、コンパイラが自動生成する関数はそれが必要な時だけ作られる。 って感じの事が書かれてた気がする。 それが真実なら、先のクラスAはメンバがないし継承もしてないのでデフォルトコンストラクタ不要と判断され、自動生成されなかったのではないか なければ当然コールされる事もないので、実行時に行われるのはスタックポインタの変更くらいだろうので高速 対してクラスBにはデフォルトコンストラクタがあり、最適化offの場合インライン展開もされずコールされる 関数コールは結構遅いので、それが差になったのではないだろうか 最適化onの場合は今回の場合恐らくインライン展開され、もともと中身がないので何も行われないので、クラスAとほとんど同じ速さになるのではないだろうか
昨今のIDEには出力されたのを逆アセンブルして表示する機能がついてると思うから、それでどんなふうに処理されてるかみてみたら?
ごめんなさい糞が
ゆるす糞が
>>174 BCDという構造体が必要なら、自分で定義してください。
Windouws APIにもC++の規約にも、.NET APIにもBCDなんて構造体はないですよ。
二進化十進変数が使いたいと言う事なら、C++の規約には無いので適当なライブラリを探してください。
C++ CLR使って良いなら、System.Decimalが二進化十進変数ですよ。
二進化十進変数の実装は言語依存なので、普通は通信にそのまま使うことはないですよ。
>>174 マルチしなけりゃ教えてやったんだけどな。残念だったな。
Cで、配列を引数にするすることがうまくできません。
このようなコードを書きました。
ttp://codepad.org/tEn3q3lO 引数を double array[][cols] のようにする方法もありますが、
N をグローバル変数もしくは define しなくてはならず
これが自分としては嫌だったので、double** array のようにしました。
これはうまく行かないのでしょうか?
1次元配列であればうまく行きましたが・・・。
>>182 void func( double *aray, const int rows, const int cols )
{
int r=0;
for( r=0; r<rows; ++r ){
int c=0;
for( c=0; c<cols; ++c ){
aray[r*cols+c] = (r+1)*10 + (c+1);
}
}
}
func( aray[0], rows, cols );
array[0]で渡さないといけないところが気持ち悪いよね なんで次元問わずarrayで先頭のアドレスを返す仕様にしなかったんだか
array[0]が気持ち悪いなら *arrayでもいいけど
これが最強 void func(int *p, size_t m, size_t n); template <size_t M, size_t N> inline void func(int (&array)[M][N]) { func(static_cast<T*>(array), M, N); }
Cって書いてあるがな
じゃあCスレいけよカス
>>188 >C/C++の質問はここで
>C/C++の質問はここで
>C/C++の質問はここで
ぷぷぷ
>>186 あのーー、キャストって分らないんですが
>func(static_cast<T*>(array), M, N);
の場合はstatic_castが正しいのですか?reinterpretじゃ駄目なんですか?
で、その理由はなんなんですか?
static_castは型に静的関連性がある時に使う reinterpret_castは値だけそのままで無理やりキャストしたい時に使うキャスト reinterpret_castは取り扱い資格を持ったよく解ってる人がそれが正解と確信しているときにだけ使っていい そうでない場合は最悪の場合死人が出るので法律で使用が禁じられている だからここはstatic_castが正解
>>186 ところでこれって配列のサイズが自動で取得できる以外になんか利点ある?
まあそれが結構デカイんだけど
>>193 サイズがコンパイル時定数だからループとかを最適化しやすい
func(static_cast<T*>(array), M, N); <T*>はtemplate引数にないんですけど、こうしないと駄目なの? こうしないと void func(int *p, size_t m, size_t n); を呼んでくれないの?
はいそうですよ
static_castは設計の勝利。絶対正義 reinterpret_castは怠慢。 dynamic_castは自殺願望あるいは設計の敗北。
Cスタイルでいいよ
Cスタイルでいいよ
Cスタイルでいいよ
externって何するの?
>>201 その識別子の定義が、そのコンパイル単位の外部にある、ということを宣言する
ならなんで関数にexternなしで他のソースに書いていいんですか?
何も書かないとexternって書いたことにしてくれるからだよ
んーと、まずCに限定した話をするとだな、 大抵のCコンパイラについては、externで宣言する必要はない。 普通に関数宣言があればいい。 Cでは識別子は完全に一意になるので、あとはリンカがつき合わせてくれる。 で、C++では、 extern "C" int hoge( void ); みたいな書き方が使われる。 これは、C++で書かれているhogeという関数を、Cのプログラムから呼び出したい ときに必要になる。
externって変数に使うもんだろ。
統一感ないよね staticを使ったのは間違いだった これじゃ意味がハッキリしないし
別に全部矛盾してないよ
210 :
205 :2010/10/09(土) 13:39:59
>>206 あ、まあ、そうね。
Cでも、翻訳単位をまたいで、グローバル変数を使うときには必要になるな。
ただのシンプルなグローバル変数なら extern Type gFoo; より struct Foo { static Type variable; }; Type Foo::variable; のほうがクールだよね
名前空間でいいんじゃね?
C++でPerlのハッシュと同じようなアクセスの仕方をしたいのですが やり方おしえてください
template <class> struct Foo_ { static int value; }; template <class T> int Foo_<T>::value; struct Foo : Foo_<void> { }; int main(void) { Foo::value = 100; cout << Foo::value << endl; return 0; } ヘッダだけで書けるから便利
ハッシュと言うからにはunordered_mapも知っておいてください。
此処で聞いてもいいことかどうか分からないのですが質問させていただきます。 RadStudio7.0にてStlportのコンパイルは出来るのでしょうか? アプリケーションをダウンロードしたのですが「Stlport5.2.dllがありません」 とのエラーが出てdllを検索してみたのですが出てくる情報がどれもコンパイルする方法でした。 なのでソースをダウンロードしてみたのですがConfigureをみるとmsvcかIntel C++コンパイラでしか出来ないようでした。 HDDの容量の関係もあり、もともとインストールされているRadStudioでやりたいのですが・・・ 長文になってしまいましたがどなたかご教示いただけると幸いです。
stl::mapがヒープ実装な処理系って存在するの?
なぜboostってマルチプラットフォームでも、同じように動くの?
魔法がかかってるから
>>220 コンパイラベンダが独自に定義しているマクロを見て条件ディレクティブで分岐コンパイルしてる
223 :
220 :2010/10/09(土) 21:01:34
5年経ったら販売するなとは言ってないから矛盾はしていない
しかしこれは読んどけって言われる本は古い本が多い事実
decltypeとかdeclspecってなんて読むんですか
デクルタイプ デクルスペック
.netとwin32apiのがありますが どっちを使っているソフトウェアが多いんですか?
スレチ
partial_sortの魅力ってなに?
上位3つだけ欲しいときとかに全体をソートするよりは速いんじゃない
遅延評価の真似事用ですか
いいえ、例えば最大値選択法のように一部だけソートした方が速いアルゴリズムで実装できるようにするためです。 その部分がソートされている必要さえないなら更に高速なnth_element()を使うこともできます。
235 :
デフォルトの名無しさん :2010/10/15(金) 16:21:02
質問させてください。 VC++2010Expでビットマップの編集ソフトを作ろうと考えています。 ファイルから読み込んだものを、ほかのDIBにコピーしたいのですが、 下記のようにプログラムしてもうまくいきませんでした。 UINT adjust4multiples(int i){ return (UINT)((i+3)/4)*4; } として、 HBITMAP from_file = (HBITMAP)LoadImage(NULL,FilePath,IMAGE_BITMAP,x,y, LR_CREATEDIBSECTION | LR_LOADFROMFILE ); DIBSECTION dibsection_info; GetObjectW(from_file, sizeof(DIBSECTION), (LPVOID)&dibsection_info ); for(int i=1; i<=y; i++){ int iymem = (y - i) * adjust4multiples(Width*3); int iyfile = (y - i) * adjust4multiples(x*3) CopyMemory(memBITMAP+iymem, dibsection_info.dsBm.bmBits+iyfile, x*3); } memBITMAPはあらかじめDIB用にメモリ確保してあり、問題ないのですが、bmBitsを使ってコピー元を表そうとしても、 コンパイラから、明確なオブジェクトをさすポインタでない、あるいはサイズが不明などといわれ、コンパイルできません。 CreateDIBsectionで作られたものであれば、ピクセルへのポインタがあらかじめ手に入るのですが、LoadImageの場合は どうすればいいのでしょうか。 手直しすればこの方法で問題ないのか、そもそもLoadImageをつかって楽をしようとしたのが間違いなのか。 よろしくお願いします。
win32スレ行けよ
237 :
235 :2010/10/15(金) 19:11:17
了解しました。 移動します。
ある場所で処理を任意の時間まで(特定の変数の値が1になるまで、等)止めておきたい場合はどの関数を使えばいいのでしょうか? ユーザーの入力を待ちたいのですが、コンソールアプリケーションではないためcinを使うことが出来ません。
スレッド
Rubyの実装の中に、 void func( a, b ) int a; int b; { ・・・ } のような記述がCで成されていたのですが、 void func( int a, int b ) としていないのはなぜでしょうか? また、これはC++では許されないようですが、 単純に 仕様 ということでしょうか?
昔々の話じゃ…
なんでこの仕様なくしたんだろう こっちの方が美しいのに
プロトタイプ宣言がコピペでできるから昔からANSIだったし
246 :
241 :2010/10/15(金) 23:27:09
>>243 ありがとうございます。
K&Rスタイルなんですね。
全く知りませんでした。
私としては、今風(?)の書き方の方が、関数の宣言見たときに、
変数とその型がセットであるから見やすいと思ってしまいますが・・・。
かと思えばクラスの初期化子ですよ
C++のブサイクさは半端ねーからな さっさとプチ整形しろよ
ダイナミックライブラリ作りたい 簡単に作る方法は? いままでスタティックライブリ作っていたので __declspec(dllexport)やdef定義作るの面倒です 環境:VS2008
VSだったらプロジェクト新規作成するときにDLL選べなかったっけ?
上司に C++のスタティッククラスのコンストラクタに処理を書けば 何よりも早く呼ばれるからそこでLib全体の監視起動しろごるあ ついでに終了処理をデストラクタに書けば Libが存在する間ずっと動く処理が書けるだろ?簡単だろ?ごるあ と言われたのですが、 そんなことできるんでしょうか?・・・orz
シュワルツカウンタというカッコいい名前のテクニックがあってな。たぶんそれのことでしょ
おお!
>>251 スタティック(静的)クラスなるものはC++にはない。Managed C++にはある。
>>252 カッコいいか? 少なくともやってる事はダサダサだぞ。
文盲乙
staticなstorage classって意味でなら出てくる その時のクラスってのはいわゆるclassやstructのことじゃなくて、autoやstaticとかの話 普通のstatic変数の初期化はプログラムで最初に実行されるけど クラスとかは最初に制御が移った時点で初期化される なので、宣言と同時に定義もしてしまうこういうやり方で出来るってことじゃないかな static class A{public: A(){printf("hoge");}} a;
って、俺全然スレの流れ読めてないな・・シュワルツカウンタなんてあるのか レスした後で気づくとか
結論は
C++の静的クラスなるものは全メンバがstaticなクラスのことで
静的クラスはコンストラクタデストラクタを持てない
→
>>251 はGCCでは不可能
でOKでつか??
>>259 スタティッククラスってのは存在しないだろう。
仮に非スタティックメンバーが無くてもデフォルトコンストラクタは呼べるしnewもできる。
全てのメンバがデフォでstatic修飾されたクラスとか constクラスとかあったら一部の人が大喜びするかもな
262 :
259 :2010/10/16(土) 15:31:07
>>257 結論は
>>252 の方法を使えば、可能ってことでしょ
じゃなきゃ、C++ライブラリのcoutとかは処理系依存ってことになってしまう
259で説明したことは仕様書の6.7に書いてる。読み違えてなければ。
全メンバがスタティックなクラスでも
staticを付けてクラスを宣言してもコンストラクタ/デストラクタは持てる
後者は、コンストラクタがちゃんと動いたときのみデストラクタが走る
boost::randomを使っていて mt19937 gen(time(0)); uniform_smallint<> dst(1, 6); variate_generator<mt19937&, uniform_smallint<> > rand(gen, dst); cout << rand() << endl; のように書いている(実際には乱数を使って色々処理をする)のですが、 ここの分布関数を設定で切り替えて動かすようにしたいと考えています。 が、生成される rand() はみんな違うシグネチャを持つので、後段の 処理の部分だけ1つのコードにまとめることができず、C++でどう書くのが 普通なのか悩んでいます。 こういう場合、 class wraprand { public: wraprand(boost::function<int()>) { ... } wraprand(boost::function<double()>) { ... } wraprand(boost::function<bool()>) { ... } double operator() () { ... } のようにアダプタを書いて、rand を boost::function を介して ラップして持ち回る以外に簡単な方法はないでしょうか?
template <class R> void func(R rand) { cout << rand() << endl; }; でいいんじゃないの?
うわーすんません、262は、名前欄が本来は257で リンク先が259です。ケアレスミス。
よくバグを出す人と見ますた
はじめて投稿させていただきます初心者です。 今キーボードから入力した無数の数字の中から、 大きいものを順番に上から3つ表示するプログラムを作成中で、 インターネット上で同様のプログラムがあったので拾ってきました。 ここでif以降の処理の意味が理解できませんでした。 おそらく上から順番に次々と数字を代入している処理なのでしょうが・・ また最初に定義されていない「t」という変数の意味と、 t=a a=d d=tとループするような代入を繰り返していることの意味や、 なぜ同じ変数を指定しているのに処理が実行できるのかがわかりません。。 どなたかわかりやすく教えていただけないでしょうか #include <stdio.h> int main() { float a,b,c,d; int i; a=b=c=0; for(i=0;i<10;i++){ scanf("%f",&d); if(d>a){ float t=a; a=d; d =t; } if(d>b){ float t=b; b=d; d =t;} if(d>c){ float t=c; c=d; d =t; } } printf("%.1f>%.1f>%.1f\n",a,b,c); return 0; }
>>268 いわゆるswap、入れ替えのコードだね。
変数xとyの値を入れ替えたいと思ったとき、
どんな代入文を書けばいいか想像してみよう。
>>267 その通りです生きていくのが辛い助けt
>>268 例えば、a=b;b=aでa,bが交換出来るか考えて見るといいよ
違う場所から書き込んでます
>>268 です。
>>269 さん
>>270 さんありがとうございます。
直接代入する形だとa=bになって意味がなくなるので便宜上別の数を利用しているんですね
定義なしでも使える数があるということなのかな?少しわかった気がします
そう考えてみると、最初abcの値が0からスタートして、
仮に入力が1,2,3,4,5 と入力された場合は
0,0,0 => 1,0,0 => 2,1,0 => 3,2,1 => 4,3,2 => 5,4,3
と次々と大きい数字を入れていくってことですか?!
ぐぐぐなんかすごい感動してきたプログラムおもしろいなああ
なぜ2ちゃんねるは、技術的な事を質問すると 誰も答えてくれないのですか?
具体的でない質問は考えうるケースが多すぎてエスパーが必要になるからじゃね
あのスレの901が技術的な質問だというなら病院行った方がいい
ググっても答えが見つからない問題は、答えてもらえる可能性は低いわな。 そういう時に自分でなんとか出来るかどうかって所で、人は二種類に分けられるんだと思う。
いいや10種類に分けられるよ
はいはい死んでね
>>271 何か勘違いしてねぇか?
>268のコードではtもちゃんと定義しているぞ。
if(d>a){ float t=a; a=d; d =t; }
このコードは、こういう意味だ。
if (d > a) {
float t = a;
a = d;
d = t;
}
勿論、tはここでも定義されているし、他のif文の後のブロック内でも定義されている。
つまり、tはブロック内でのみ有効な変数として定義されているわけだ。
一応念の為に書き添えておくと、そのコードは所謂「ソート」の前哨戦だな。
ソートの世界は深くて楽しいぞw
簡単な質問ですが、よろしいでしょうか? strcatで \ を連結する場合は '\\'でエラーがでてしまうので"\\"にしたのですが これであっていますでしょうか?
ありがとうございます。
>>279 どうせその後ファイル名も連結する積もりなら、sprintf()を使った方が手っ取り早くないか?
char buf[256]; sprintf(buf, "%.174s\\%.80s", path, file);
>>278 あああなるほど!!!そういうことだったんですね
float t ってこの場所で定義していたのか・・・
ブロック内だけで定義するってこともできるんですね。すごい勉強になります
またお世話なるかもしれませんがよろしくお願いします
ありがとうございました!
大量の画像ファイルを扱うプログラムを作っているので メモリ上にキャッシュし、キャッシュの容量が大きくなってきたら解放したいのですが、 どんな風にやればいいでしょうか ファイル名から画像を取得できる連想配列と連結リストをそれぞれ用意して、 キャッシュの容量が一定値に達したら リストの最初の画像を取得→連想配列からも削除 という方法を考えましたが、もっと良い方法があれば知りたいです プログラムの殆どで参照カウントを使っているので、キャッシュから 画像を取得するときに必ずカウントを増やさなければいけないのも気になります
Javaにはそういうとき便利な連想配列と連結リストが合体したLinkedHashMapっていうのがあるんだけどな・・・
287 :
デフォルトの名無しさん :2010/10/17(日) 21:23:10
for(std::list<int>::iterator it = l.begin(),int i = 0; i < 10; ++i) { <iro iro>; } とやりたいのですが、FOR文の最初の項には文を一個しかかけないのでしょうか?
はい、残念ながら
それって不便な仕様だよね { list<int>::iterator it = l.begin(); int i = 0; while(i < 10) { ・・・ ++i; }; } とか書けばほとんど同じといっていいけど不恰好だ
ループはint iに依存してるからそっちだけforに残したりする
for(pair<std::list<int>::iterator,int> it(l.begin(),0);it.second<10;++it.second){ //iroiro } すごく…不恰好です… 書いといていうのはあれですが… こんなのは…嫌です…
std::list<int>::iterator it; int i; for(it = l.begin(),i = 0; i < 10; ++i) { <iro iro>; } これならいけるけどね
思ったんだけと、287含め、誰もitインクリメントしてないよね itを10進めながら処理するループだと思ってたけど、違うのかな?
if( int i = 1 ) for( std::list<int>::iterator it = l.begin(); i <= 10; ++i ){ <iro iro>; }
296 :
デフォルトの名無しさん :2010/10/18(月) 10:03:32
質問があります。 今、データを読み込んで整理しています。 手順としては 1、データを1行ずつ読み込む(行はたくさんあります) 2、読み込んだデータをif文で整理しています。 しかし、if文を用いているのですがすべて同じ結果になってしまいます。 何故か分かる方はいらっしゃいますか? ちなみに先生に聞くと読み込むプログラムはあっていてif文が間違っていると言われました。 私が書いているのは以下のような具合です。 int a = s.b + s.c;(sのクラスは用意しています。) if ( a = 1){ if ( s.nenn == 2 || s.nenn == 3 ) { cout << s.kei << endl; } } if ( a = 2){ if ( s.nenn == 2 || s.nenn == 3 ) { cout << s.kei << endl; } }
とりあえずは = と == 間違えてるからかな
298 :
デフォルトの名無しさん :2010/10/18(月) 10:35:22
297の書き込みをしてくださった方ありがとうございます。 無事に出来ました。 本当にありがとうございました。
299 :
デフォルトの名無しさん :2010/10/18(月) 15:32:16
if文の際に例えば1のデータだけを持ってきたいときは if ( a == 1){} 等で示すのは分かるのですがデータが空欄のものを持ってきたいときは どのようにすればよいのでしょうか?
if ( a == 0 ) {}
C言語より先に日本語
ローカル変数やメンバ変数が破棄される際、その順番は規格で決まっているのでしょうか? 決まっているなら、その順番を教えていただけないでしょうか。
書かれた順にコンストラクトされてその逆順にデストラクトされる
メンバ変数の場合、初期化リストに書いた順番でなく宣言に書かれた順番に従う。
305 :
302 :2010/10/18(月) 22:35:42
初期化リストの構文がクソ。
インデントなどのスタイルを指定したらそれに合わせてコードを整形してくれるアプリって在りますか? あるなら名前を教えてほしいのですがよろしいでしょうか?
VisualStudio
質問です ヒープ領域にメモリを取れる限界量というのは決まっているんでしょうか? short int *array = new short int[200000]; という類の事をしたらコンパイルは通るものの、アプリケーションがフリーズしてしまいます
積んでるメモリとスワップ領域に相談してくれ
313 :
310 :2010/10/19(火) 22:34:08
>>311 メモリ4GBを積んでいるので、数MBのnewくらいなら大丈夫かと思ったんですが・・・
>>312 してしまいます・・・
デバッガで追いかけたところ、
short int *array = new short int[200000];
のarrayに-12851という値が入っているのみなので、配列の確保に失敗しているのかなと思った次第です
>>313 ちがう原因でフリーズしてんじゃないの?
>>314 大きいサイズの確保をし始めたら出てきた上にデバッガで追えないのでコレかと思ったのですが・・・
もうちょっと探してみます
>>313 アドレスに正負は関係ないだろ。
スタックやヒープを壊しているとかの落ちな予感。
C++で、全メンバが「=」で代入できる構造体は その構造体自体も「=」で一発で代入できるのに、 比較って「==」で全メンバを比較してくれないんでしたっけ? もちろん、自分で構造体にoperator==()を作ればできるでしょうけど。
してくれない
>>318 そうでしたか。面倒だな。
勝手に代入してくれるなら勝手に比較もしてほしかった。
>>319 eqとequalのどっちを期待してるか分かんないだろ。
普通の関数は クラスの中でstatic関数にしておくのと そのままの関数とするのと どちらが良いですか?
時と場合によるのでその都度考えてください
>>321 馬鹿な事を聞くな。
クラスの中でsutatic関数にしたら、普通の関数じゃ無くなるだろ。
そのまま意外はあり得ない。
酢たちc
>>323 んなことない
が、そのクラスとまったく無関係の機能をクラスに押し込めるのもどうかと思うが
sutatic関数わらう。普段からローマ字生活なんだろうな。
>>321 は「出刃包丁とアーミーナイフどっちがいいですか?」みたいな質問だろ。
そんなの用途によるに決まってる。
>>313 たった400MB位屁でもない筈だが。
まさかとは思うが、メモリが足りなくてswapしているなんてオチじゃないよな。
普通にスワップだと思うが。 メモリは前から順番に使うわけじゃない。分散して使っている。 10MB細切れの合計400MBだったらスワップせんかもしれんけどね。 連続した400MB?スワップして当然だろ。
それなんてへぼOS…
400MB・・? > short int *array = new short int[200000]; 俺には 400KB に見えるが・・・ まぁ最近視力落ちてるからな・・・
400KBだろ。だから>328で「たった」なんだろう。
01|struct A { 02| struct P { 03| template<typename _T>void foo(){} 04| }; 05|}; 06|template<typename _A>struct B : _A { 07| typedef typename _A::P P; 08| void bar(){ 09| P p; 10| p.foo<B>(); 11| } 12|}; g++ で 10 行目でエラーが出てしまうのですが このような関数呼び出しをしたい場合はどのようにすればよいのでしょうか? 関数 foo の引数にダミーのポインタを渡す等をせず、型情報だけを渡したいです B のテンプレートパラメタ _A には A を継承した様々なクラスが指定される感じです
p.foo<B<_A> >(); でどうよ
ポインタをどういうタイミングで使えばいいのかが、わかりません ぶっちゃけ、C++では関数の戻り値がポインタ以外はポインタを使う意義がわかりません 私がポインタを必要とするプログラムを、書いたことが無いだけでしょうか?
>>336 データ構造とアルゴリズムを勉強しましょう
ポインタがもしなかったらこの世界が崩壊理由が理解できるでしょう
C++を長い間使ってる人が ポインタなんでC++の入門書の最後で扱うべき、少なくともイテレータや参照よか後にしろ とかこぼしてたみたことあるから、まぁ色々とあるんだろうなとか
STLを覚させて高級言語として使わせる ポインタとか低レベルのものは後でいいという考え方もまあ理にかなってはいるけどね 業務・実践向けの教え方だとこっちの方がいいと思う
そして増える64bitプログラム。嵩張るポインタの運命やイカに!
341 :
デフォルトの名無しさん :2010/10/22(金) 01:27:17
ポインタ、配列関連の質問なのですが、 #include<stdio.h> void main() { int i; char a[20]; for (i=0;i<=9;i++) { scanf("%c%*c",&a[i]); a[i+1]='\0'; printf("%s\n",&a); } } これのchar型配列をNULLで初期化する意味を教えてください。
C/C++には文字列型というものがなく \0で文字列の終わりを表すため。 もし\0が無ければ、配列aを見ていって\0が見つかるまで表示する なければ多分、バッファオーバーフローして\0が見つかるところまで表示する
343 :
デフォルトの名無しさん :2010/10/22(金) 01:45:56
いまいちどこで質問していいかわからなかったのですが、 パソコン上でなっている音の波形データをとってくる方法ってありますか? itunesとかで再生している音を外部からとってくるイメージなんですけど オーディオデバイスにアクセスしたりとかできるんですかね?
345 :
デフォルトの名無しさん :2010/10/22(金) 04:46:07
メモ帳のウィンドウプロシージャのアドレスが取得できないんだけど、誰か取得できたら教えて。 GetWindowLong(FindWindow("Notepad", NULL), GWL_WNDPROC) がNULLになってる。 winmap使っても見えない。
はいはいスレ違い
フックしる
質問よろしいでしょうか? c++の本でclassの中身の変数を、同じクラス同士で a = b + cという感じに計算していたのですが、これはどのようにやるのでしょうか?
演算子オーバーロードでぐぐれ
関数の中でy=1等指定しても メイン関数のほうではなかったことになりますが、 それを防ぐ方法はありますか? できればコンソールアプリ内での知識でお願いします。
入門編スレへどうぞ
>>350 引数を「値渡し」しても関数内で宣言された別の変数に値がコピーされてるだけなので
いくら関数内で変更しても呼び出し元には影響ありません
C言語なら「ポインタ渡し」、C++なら「参照渡し」をしてください
具体的なやり方はggrks
誰かboostをCに移植してください><
ググれとか言ってる奴はスレタイ読めないの?
>>353 漏れなくC++コンパイラがついてきますがそれでよければ承ります。
つーか、なんでCに拘るねん。
>>350 それを防ぐことを考えるよりも、先ずはローカル変数は関数毎に独立していることに慣れること。
受け渡しの方法は、引き数や戻り値、或いは構造体というキーワードで調べれば判る。
>>348 「classの中身の変数」の意味がよく判らんが、class Foo bar, bazとして
bar + bazなどとしているということなら、>349。
>>354 質問の体を為してないんだもん。回答しようがないやな。
キーワード書いてもらったんだから幾らでも調べられるだろう
それはおまえらが初心者だからだろwww 応えられないならそう言えよwww
こんなアホな質問するやつにポインタの説明とかしたくないしなぁ
>>358 おう、こんだけ応えているってぇのに何が気にいらねぇんだ、表に出やがれ。
上級者気取り()
幾ら煽っても回答は出ませんよ
>>362 さん
>>352 です
>>354 と358は私とは別人です
どうかご教授願いたいです
あとggrskもわかりませんでした
できればコンソールアプリ内での知識でお願いします
>コンソールアプリ内での知識
>352と>355を読んでも未だ教えろと言うのだったら、正直プログラミングは諦めた方がいい。 自分の番号さえ書き間違える(or勘違いする)くらいだしな。
何ビット目が立っているかを調べるうまい方法ありますか? 入力は1つのビットだけ立っているものして、それ以外の場合 出力は不定でかまいません。 入力 -> 出力 0001 -> 0 0010 -> 1 0100 -> 2 1000 -> 3
右シフト何回して0になったか調べるじゃだめなの?
>>367 int x = 4 ;
for ( int i = 0 ; i < sizeof(int)*8 ; i++ ){
if ( x&(1<<i)){
printf ("%dビット目が立ってる\n", i ) ;
}
}
int n = 0; if (x >> 16) { n += 16; x >>= 16; } if (x >> 8) { n += 8; x >>= 8; } if (x >> 4) { n += 4; x >>= 4; } if (x >> 2) { n += 2; x >>= 2; } if (x >> 1) { n += 1; x >>= 1; }
>>351 >>352 なるほど、ポインタを使えば確かにできそうです。
本当にありがとうございました。
>>334 >>335 レスありがとうございます
335 で行けました
スコープ演算子の後に template を使えるのは知っていたのですが
アクセス演算子の後にも使えるのですね
POD pod = POD(); これってpod = {0};と同じように0初期化保証されますか?
Cでは#defineを使うようなパターンでC++ではconstを使う気がするのですが CとC++の仕様の違いでしょうか?
#defineは様々な問題があるのでなるべくconstにしたいところだが Cではconstにしても定数として扱われないので#defineにせざるをえない
Windows 7 32bit で Visual Studio 2010 を使っています。
C++のプログラムの中でコードを書いてコンパイルすることが目的です。
Microsoft Visual Studio 10.0\VC\bin にのみパスを通しています。
今回問題としているのはプログラム上での一時的な環境変数の追加です。
ofstream により適当な test.cpp ファイルを作ります。その後、
system("vcvars32");
system("cl /EHsc test.cpp");
として、test.cppをコンパイルしたいのですが
cl.exe - システム エラー
コンピューターに mspdb100.dll がないため、プログラムを開始できません。
となり、コンパイルが実行されません。
cmd.exe上でtest.cppのあるディレクトリまで移動して
>vcvars32
>cl /EHsc test.cpp
とした場合はコンパイルが成功し、test.exeが作成されることを確認済みです。
つまり知りたいことは、cmd.exe上でvcvars32を読んだ場合はパスの設定が有効になるのに、
system関数を使った場合はそうならないのは何故か。
また、もしそうならばc++のプログラム上でどのように一時的にパスを追加するのかです。
よろしくお願いします。
コードのリンクを貼っておきます。
http://codepad.org/w74epWeu
cmd.exe上でvcvars32を実行 cmd.exeを新しく立ち上げてcl /EHsc test.cppを実行 という動作になっているから 一時的にパスを追加するのはC++じゃ無理なのでWinAPIを使う
>>379 ありがとうございます。
ExpandEnvironmentStrings と SetEnvironmentVariable を用いて
プログラム上で一時的に環境変数を追加することができました。
Visual Studio のパスが埋め込んであってちょっと汚いですが
上手くいったコードを載せておきます。
http://codepad.org/kS3qAnwV しかし最終的にはこうしました。これは C++ の話ではないので余談ですが。
system("vcvars32 & cl /EHsc test.cpp");
>>377 よく分かりました。
どうもありがとう。
explicitを使っていますか? あまり見たことがないんですけど
え〜使いまくりですよ〜
ヘッダファイルを見ると大体が、メンバ変数にポインタを使っています メンバ変数はポインタを使った方が、動作が速いのでしょうか?/
385 :
デフォルトの名無しさん :2010/10/23(土) 20:34:55
age
遅くなったり早くなったりします
ポインタにするにはその理由があるだけでしょ 速さ目的でやることじゃない
388 :
384 :2010/10/23(土) 20:55:13
>>386 >遅くなったり早くなったりします
ポインタはすごく速いイメージがあるのですが、何故遅くなったりするんですか?
LinuxのGTKについて聞きたいことあるけど、ここでいいのかな? この板のスレッド検索したら、MacとWinのGTKは見つかったけど Linuxがない。Linux板に行って聞くべき?
>>390 ダメなのか?では、別のとこ探してみます。
ありがとう。
>>391 ダメじゃないけど、このスレは「C++相談室」と比べると書き込み少ないよ
大体が文法の事だったりするし
そうかぁ。では、聞いてみる。 GTKで、テキストを表示させたい。 フォントを指定して色を変更したりサイズを変更したり。 そして、表示したテキストをコピー&ペーストしたい。 という条件に当てはまるウィジェット知りませんか? cairoを使うと、色やサイズは変更できるけど、コピペができない。 devhelpを探してみたけど、今日の昼から探しつづけて力尽きた。 知ってる人がいたら、ウィジェットの名前でいいんで教えてください。
GtkLabelかGtkTextViewか
error: a label can only be part of a statement and a declaration is not a statement gotoを利用したラベルを使ってみたところ以上のようなコンパイルエラーが。 gotoを使わずにifでやれば動くのですが・・・。 むやみに使ってはいけないとはいえ、何がだめなのかわからないので悲しいです どなたかどんなエラーなのか教えてください
>>395 gotoのためのラベルの直後には必ず文がないといけない。 }とかだとそのエラーが出る。
単純にlabel:;と書けばよかった気がする。
あ、そのエラーだと変数宣言の前にラベル置いちゃった系かな。 Cならラベルの位置を変数宣言の後に移動させてください。
398 :
デフォルトの名無しさん :2010/10/24(日) 19:53:03
メンバがポインタばっかりなのはなんで?
ポインタ大好きな人が書いたから
すみません。 状況に応じてプログラムを2つ(のexe)に分けたり、分けずに1つのままにするプログラムを作ろうとしています。 その中で共通利用するクラス(プログラムを分ける場合それぞれに複製するクラス)に 100近い変数を抱える構造体を送りたいのですが、 プログラムA側とプログラムB側で同じ構造体を送ろうとすると、当然定義の段階で衝突してしまいます。 中身が完全に一致で名前が違う構造体を送る方法 もしくはこういう状況に適した技法が有れば ご助言頂けませんでしょうか・・? 100個全部引数にするのが妥当なのでしょうか・・?
日本語の読解能力が試されるな
パス1
>>401 中身が完全に一致してて名前が違う事が問題なら
受け取った時にキャストしてやればそれだけで解決しそうだけど。
>100近い変数を抱える構造体を送りたいのですが
…これまずそうじゃね?
参照じゃなくて値で送るの?
std::auto_ptrって使っている人いますか? deleteをしているのは普通に見ますが、スマポを使っているところは見たことがありません
406 :
401 :2010/10/24(日) 23:18:53
>>404 今回は全て参照送りという形で処理してしまいました。
キャスト…メモしておき今後修正が必要になった際調べて利用させて頂こうと思います。
ありがとうございました。
>>406 参照送りでいいんじゃないの?
そんなでかい構造体、値送りで送ったらパフォーマンスに影響が出そう…
なんだその病院送りみたいな
>>395 >>396 ありがとうございます。
ラベルを使わない方法で作りましたが、ラベルありでも動くように直してみます
410 :
デフォルトの名無しさん :2010/10/25(月) 16:25:22
strchrで問題が発生 (1) buf[0]='a'; buf[1]=-126; buf[2]=10; buf[3]=0; (2) buf[0]='a'; buf[1]='a'; buf[2]=10; buf[3]=0; (1)と(2)を同じように strchr(buf,'\n'); としても同じ結果になりません (1)はNULLになります (2)はNULL以外です なぜちがうんでしょうか?仕様?
412 :
デフォルトの名無しさん :2010/10/25(月) 16:40:09
すみません関数がちょっと違いました テスト環境はVc6.0です #include "stdafx.h" #include <stdio.h> #include <string.h> #include <tchar.h> int main(int argc, char* argv[]) { char buf[4]; buf[0]='a'; buf[1]=-126; buf[2]=10; buf[3]=0; printf("%p\n", _tcschr(buf, '\n')); buf[0]='a'; buf[1]='a'; buf[2]=10; buf[3]=0; printf("%p\n", _tcschr(buf, '\n')); return 0; }
_tcschr はマルチバイト文字対応なので buf[1] と buf[2] が合わさって1つの文字とみなされてるんじゃないかと思われ
>>412 VS2010だとchar buf[4]; を wchar_t buf[4]; にしたら同じになったよ
charのままだと曖昧エラーが出てコンパイルが通らない
416 :
412 :2010/10/25(月) 16:57:16
ありがとうございます やはりマルチバイト文字なのがだめなのですね 文字入力されたものをファイルに書き込んでそれを読んだときに どうしても最後に改行コードがくっついて困ってます 上の例みたいに日本語を中途半端に書き込んでると 改行コードを消せなくなります…
マルチバイトでコンパイルするとおかしい wchar_t buf[4];にしてUnicodeでコンパイルすれば正常 つかなんでわざわざ_tcschr?
418 :
デフォルトの名無しさん :2010/10/25(月) 16:58:20
419 :
412 :2010/10/25(月) 17:07:52
実際のプログラムは汎用テキスト?使ってるので _tcschrにしてますがマルチバイトで\nさがしちゃだめってことがわかりました strrchrつかって\n消すことにしました ありがとうございました
たっかい金出してVS2010が重たい もまえらどんなPCスペックなのよ
趣味だからフリーで十分
フリーでもおもてーよ
>>420 i7-920と6GBDDR3と牛SSDで今のところストレスフリー
MSはソフトを重くして新しいパソコン買わして 新しいパソコンにインストールするwindowsを買わせようとしているのだからね すなおにGCC+ECLIPSEをつかえばいいのだよ。
>>424 gcc も結構重い by PenIII 1GHz x 2
gccが思いなんて聞いたこと無いぞwwwwwwwwwww eclipseが重いなら他にソフトいくらでもあるしwwwwwww
>>423 そこまでの環境を用意しないとダメなのか、アホらしいな
Eclipseが重いなら.NETも重いだろ そんな糞な環境やめろよ 言語の学習するだけでストレスになるなんて馬鹿らしいだろ
gccとvsを比べるんじゃないよ 比べるならclとだろwww
430 :
デフォルトの名無しさん :2010/10/25(月) 21:22:18
俺も、VSを買おうかと思ったけど、PCかいなおさなきゃいけないから やめた。 Qtを試してみたら、色々コンポーネントとかあるし(Gridとかもある)MDI対応だから Qtでしばらくいく。開発環境も軽いし。
newをあまり使わなくてもプログラミングをすることができますが、 スタックオーバーフローが発生すると思います 最近のコンピュータ(メモリ4GB)くらいだと、どのくらいスタックが確保されるのですか? また、newを使った時のメリットを教えてください
スタックサイズは意外と小さいよ Windowsは1MB、Linuxは8MBじゃないかな
>>431 普通1MB程度
VS2010ならプロパティシートのリンカ→システム→スタックサイズの設定
new/deleteはオブジェクト指向のキモだろ
ポインタで仮想関数をポリモーフィズムする
参照でも出来るがやりにくい
スタックサイズとは関係無いヒープ領域から取られる
class A{ B b; } class B{ A a; } みたいな感じで互いのclassの変数をクラスに持たせたいんだけど、どうすればできますか? これだとclassAでBが宣言されていないってエラーがでる
ごめんなさい色々試してたら解決した class B; class A{ B b; }; class B{ A a; }; とすれば使えるのね
>>434 つかえねーよ馬鹿
ちょっと考えて見ればわかるだろうがそれ無限に続いちゃうから無理
class B;
class A{
B *b;
};
class B{
A a;
};
ああそっか。通ったのは実際に組んでたのは変数ポインタにしてたからか
>>435 それ別にC++のクラスでなくても構造体でも無理だよ
遅い 遅すぎるよ
>>439 遅いんじゃなくて今見た所なの
わかる?アホ
だから遅いんだよアホ
アホが一人
二人
三人
俺がアホだ!
俺も俺もー
アホばっか
A.V.アホ ↓
失せろカスども
カスが一人
↑カス
stlのvectorでイテレータの直前(手前)に挿入ってどうやるのでしょうか?
v.(it, foo);
iterator insert( iterator itr, const T &value ) iterator insert( iterator itr, size_t num, const T &value )
>457-458 ありがとうございます。
すみませんがついでにもう一個しつもんです find_ifの逆で最後に見つかった要素を返す関数はありますか?
>>460 rbegin()とrend()を使ってfind_if()を適用する
あーなるほど、
但し逆反復子を使った場合はこういう感じで素直な結果じゃないので注意 class Value : public std::unary_function<int, bool> { int val; public: Value(int i) : val(i) {} bool operator()(int i) const { return i == val; } }; int main() { int a[] = {10, 24, 21, 42, 63, 31, 73, 25, 12}; std::vector<int> vi; for (int i = 0; i < static_cast<int>(sizeof(a) / sizeof(a[0])); i++) vi.push_back(a[i]); std::vector<int>::const_reverse_iterator vicr = std::find_if(vi.rbegin(), vi.rend(), Value(12)); std::cout << *vicr << std::endl; std::vector<int>::const_iterator vic = vicr.base(); std::cout << *vic << std::endl; std::cout << *(vic - 1) << std::endl; }
>>461 ,463
ありがとうございました。イテレータの理解が深まりました
逆順イテレーターを戻すといっこズレるのって気持ち悪くね? なんでこんな仕様なの?禿げはアホなの?
慣れろ
baseは戻すではないよね、、、?
469 :
431 :2010/10/26(火) 20:36:37
実際
>>463 のプログラムでは *vic と逆参照している所はvectorの存在しない
場所の内容を呼び出すのでエラーなんだけどな
ポインタもイテレータも最後の要素の一つ先まで指せるが、逆反復子を使った場合
一番最後を指すのはありなん?配列は明らかにエラーだけど
ああそうかわかった そういうエラーを防ぐために逆反復子はわざと一個ずらした所をポイントするようにしてあるんだ base()メンバ関数で元のイテレータに戻した時にこのエラーが出やすいのでわざとbase()なんて メンバ関数を呼び出さないと変換出来ないようなややこしい仕組みになってるんだな
>>468 普通のイテレータを逆順イテレータに変換する時はカッコで囲むだけでOK
vector<int>::iterator pos;
vector<int>::reverse_iterator rpos(pos);
しかし逆順イテレータを普通のイテレータに変換する時にはメンバ関数base()を
呼び出さなくてはならない
pos = rpos.base();
この時に
>>470 のようなエラーが起きやすいので注意をプログラマに促すために
わざとこのようなくどい方法を採っているのではないかと思う
質問です。ポインタのリストをメンバに含むクラスをSTLのvectorなどに 載せる場合、コピーコンストラクタでリストごとコピーするように しなければうごかないでしょうか。かなりめげてますorz
unique_ptrとかに突っ込んどけばいいんじゃね
そのリストの実装にコピーコンストラクタがあるなら そのクラスのデフォルトコンストラクタがあるから 動きはするだろうよ それでいいのかは知らんが むしろきっとデストラクタの関係で駄目なんだろうけど
//a.h ======== class A { public: A(void){}; ~A(void){}; void foo(void); void hoge(void); }; //a_1.cpp ======== #include "a.h" A::A(void) {} A::~A(void) {} void A::foo(void) { /* 普通のソース */ } //a_2.cpp ======== #include "a.h" void A::hoge(void) { /* 長いソース */ } IDEはVisualStudio2008です。 このように分割コンパイルしたいのですが、a_2.cppでLNK2019が出てビルドできません。 externの使えないメンバ関数の定義を、(派生クラスにするのは無しで) 別のファイルに分けられる手法があれば、ご教授願えましたら幸いです。
A(void){}; ~A(void){}; {}はずせ
すいません。そこは書き間違えました。
てか、普通に何の問題もないでしょ リンクエラーはソースを分割したことじゃないと思われ
返答ありがとうございます。その方向で調べてみます。
テンプレートクラスでも使ってるんじゃないの? まあ次からはハイエナ低スキルに噛みつかれないよう気をつけなよ
c++って本当に何でもできるよね〜 勉強しても勉強しても、知らない文法があるし
>>473 です。
>>474 、475
どうもありがとうございます。unique_ptrですか。C++0x?勉強して
みます。結局、コピーコンストラクタを使わないようなテンプレート
クラスを作ったのですが、いつのまにか既存のクラスのコピー
コンストラクタを実装してました( ゚д゚)ポカーン
いまおこったことをありのまま話すぜ(ポルナレフAA略
484 :
デフォルトの名無しさん :2010/10/29(金) 19:03:24
c++では定数定義に#defineよりもconstを使うほうが型も決まっていいんですよね. "const.h"みたいに一つのヘッダに定数をまとめて定義し,それを複数のファイルでインクルードしている場合は "const.cpp"に定義を書いて,"const.h"ではexternで宣言するのがウェブでよく紹介されている方法でした. しかし,この方法だと,リンク時にしか定数の値が各ファイルからは分からないので, 配列を定義するときの添字にはコンパイルエラーで使えません. ヘッダでconst定数定義をし,それを配列定義の添字に使う方法はないのでしょうか.
struct ArraySize { static int const value = 10000000000000000000000000; }; int main(void) { int array[ArraySize::value]; // Oh. It's cool!! return 0; }
ヘッダにconst int x = 10; みたいに書いちゃえばいいだけの話じゃないのか というかそんなアホな方法がよく紹介されてるってマジかよ
>>485 の方法いいね
俺はメモリ取られるのが気に入らないからenumにするけど
ごめんgcc4.4.5で確認したら取られてなかった。不思議な文法だな。
489 :
484 :2010/10/29(金) 21:48:27
>>486 複数のファイルからインクルードされるヘッダなので、そのままだと多重定義になってしまいます。
複数の方が提案されてた方法ですし、アホではなく現実的だと思うのですが、
配列定義の添字には使えなくて困っていました。
>>485 ありがとうございます。試してみます。
>>488 普通の質問なんですけど、
メモリ確保されていないことっていうのは
どうやって確認すればいいのですか?
>>490 &ArraySize::valueがundefined referenceになったのでそう判断した。
>>491 まじすか
VC2010で
cout << &ArraySize::value;
で普通にアドレスが出てしまいました
これはコンパイラによるということでしょうか・・・?
>>493 なるほど・・・
ありがとうございました
>>489 >ヘッダでconst定数定義をし,それを配列定義の添字に使う方法はないのでしょうか.
この要求に答えるのが
const int x = 10;
なんだが
static にしないと定数扱いにならないんだよ
498 :
493 :2010/10/30(土) 12:27:40
>>496 普通の書き方はそれだよね。それは知ってる。
ヘッダに書く方法を聞かれてて、そこに初期化を入れてた点がそんなことできるんだ、という点。
ヘッダにしか書かないので自動的に唯一のメモリが確保されてると思った。templateみたいに。
でもアドレスもなく右辺値としてだけ使用される点が不思議だな、と思ったというわけ。
どういうことなのか知っているなら、詳しく教えてくれると嬉しい。
>>496 定義を別にしなきゃいけないのは非const の時じゃなかったか?
static const で整数型メンバの場合宣言と同時に定義できる C++0xなら整数型の制限は外れる ネームスペーススコープで const int x = 10; と書いても static つけた時と同じ扱い
TMPの基本だよね
TMP関係なくね?
C++のxxx_cast<>()ですが、横に長くなって困ります。 aaa = retnterpret_cast<image_header_section *>(static_cast<hoge_section>(bbb)) 2重に重ねただけで、悪夢です。 aaa = retnterpret_cast<image_header_section *>( static_cast<hoge_section>(bbb)) ↑ ここで改行しても意味無しです。 みなさんどのように改行していますか?
そんな複雑なcastを行わなければならない仕様にしない
自分でdefineすればええやん
defineが長くなるのもいやん。
それぐらい我慢しろよ… 複数行のdefineとか、inlineの代わりに使ってる事結構あるぞ
行幅が適切な複数行defineは許容範囲。 個人的な特性かもしれないけど、横に長いと視認性が極端に落ちるからいやん。
現状では制御文をスマートに置換するには#defineしかないしな、BOOST_FOREACHとか std::for_eachとラムダ式の組み合わせは正直キモイっす
ハッカーになるとプログラム言語が小説のように読めるようになるから 改行する必要なくなる。 短い方が良いと思ってるうちはおこちゃまということだ。
ハッカー(笑)
マジレスした方がいいのかどうか分からない…
俺が変わりにマジレスしよう。 ハッキングするひとをハッカーと思っている人はおこちゃま。
hack-hacking hacker
書き捨てコードを書いて遊んでるだけの人も広義のハッカー
だらだらハッカー話が続くのも嫌だからやっぱマジレスするわ
>>510 (笑)
>>510 小説のように読むためにも、句読点と同じように改行をする必要があると思うのだけれど…
お前のよく読む大好きな小説は句読点ごとに改行されている ライトノベルというジャンルということを紹介してくれて有難うwww
おっさん何歳だ
いくらラノベだって句点のたびに改行してるわけじゃないぜ
詩じゃあるまいし
縦に長いコードは拒否反応が出るよ。 横に長いコードもイヤだけどまだ許せる。
ヘタレプログラマやな
あれだろ、ワードで縦書きにして書いてるんだろう。
エディタは何でも使うけど、eclipse/VC/emacs/vim/サクラエディタとかかな
IDE使ってて横に長いソース見るのってものすごく嫌じゃない?
monoフォントもやめて、改行は段落ごとにして、 横の長さはエディタの自動改行に任せる この自然言語風の書き方意外と読み易いけど誰も賛同してくれない
最近はディスプレイの横の解像度が1920くらいあるから横に長いコード見てもイラっとしなくなった これ以上解像度上げるとフォントが小さくなりすぎて見難くなるが
>>527 さすがに全部はみ出てたらイヤだけどそんなのないし
new Hoge(), new Hoge;は何が違うんですか?
>>531 カッコ付きは非PODとPODで挙動が異なる
非POD・・・カッコ無しは不定値が入る、カッコありは0で初期化
POD・・・どちらも同じ意味
これもFAQになってきたな
>>531-534 検索用に書き直してまとめ。
--
new Hoge(), new Hoge;は何が違うんですか?
カッコ付きは非PODとPODで挙動が異なる
POD・・・カッコ無しは不定値が入る、カッコありは0で初期化
非POD・・・どちらも同じ意味
これもFAQになってきたな
--
536 :
デフォルトの名無しさん :2010/11/01(月) 12:22:32
マージソートがわからん誰か教えて void merge(int data1[], int n1, int data2[], int n2, int data3[]){ int index1, index2, index3, i; index1 = index2 = index3 = 0; printf("merge_sort\n"); while(index1 < n1 || index2 < n2){ if(index1 == n1){ for(i=0; i<n2-index2; i++){ data3[index3+i] = data2[index2+i];} break;} if(index2 == n2){ for(i=0; i<n1-index1; i++){ data3[index3+i] = data1[index1+i];} break; } // data3[index3] に値を代入したい// for (i=0; i<(2*N) ;i++) printf("%d,", data3[i]); printf("\n");}
もしソースだけ目にして分からないって思えるなら なんか文章とか絵とかで解説されてるサイトを見るといいよ マージソートは理屈がかなり簡単なソートだからすぐわかるだろう
そんな偶然の一致があってたまるか
一致100%で言い逃れしようとするバカ初めて見たわ
ん?投稿は別人という意味だが。
545 :
デフォルトの名無しさん :2010/11/01(月) 14:27:43
>>544 >Mostly written in Python with PyGTK
と書いてあるんだから、Pythonだろ。
つーか、その程度の英語も読めないようなら無理だと思うぞ。
それとcanvasのzoom機能はあるらしいが、それでは不充分なのか?
マルチってなんで嫌われるんだろう。。。
同じ質問をあちこちにポストされると、俺らはその同じ質問を何度も目にすることになる 同じことを何度も何度も訊かれたら鬱陶しい
単純明快である
参照があちこちに散らばって管理が大変だから
マルチは手段であって目的では無いんだよな。 なんでもマルチは悪いと考えるのは思考停止のなにものでもないよ。 投稿されてから一日たっているのや別スレでスルーされていいるのや別人がコピペしているのを考慮すると これは許されるマルチだと思う。
んなことない
じゃあスルーされたり質問者が自己解決して答えが分からない場合はどうしたらいいの?
>>553 君はプログラミングに向いてないよwww
他逝きなww
許される許されないの問題じゃないから
とりあえずスルーされてる原因を考えるよ 被害者面するな
じゃあニュースは毎日同じことを何度も流すけど許されない犯罪だなwwww
面白い話題が出てて他の質問スルーすることはよくある そういう時はスレが落ち着いてから催促すればいいんじゃない まあ俺はスレ遡ってまで回答しないけど
>>558 人に聞く行為と人に知らせる行為を一緒にするなよ
頭おかしいの?
「40歳ニートですけど総理大臣になるにはどうしたらいいですか?」なんて質問にだれも答えたくないだろ?
無視される質問のみんながみんなそんな質問ではないだろ?
悪意のあるやつが一番悪い 実生活のストレス解消の場として揚げ足取りを楽しんでいるのだろう
みんながみんがそうではないってことは いくらかそういう馬鹿げた質問してる自覚はあるんだ
君は自分に反論する奴はみんな質問者だと思ってるんだ
悪意なく嘘を教える奴が最も悪い。 そういう奴は正当な批判も揚げ足取りと思い込んで暴れる。
>>565 質問者じゃなきゃこんな文句言わねーだろ
俺の意見はみんなの意見だもんね
俺はその「みんな」に含めないでくれ
質問内容がアホだからマルチするなってのはおかしいだろ それだと高等な質問ならマルチしてもいいってことになるぞ どうしてマルチが嫌われるか分かってないのにマルチ叩くのもどうかと思うよ
まともな質問をしかるべき場所ですれば マルチするまでもなく普通に回答が返ってくるからじゃね?
ウェブサイトが英語というのが気に障ったんだろうなwww 英語よめないからwwww
だからスルーされてる原因を突き止めろよ 議論中なうじゃなかったら スルー = 日本語が支離滅裂、質問内容が明晰でない 数レス上で同じ内容に答えている、態度が生意気、テンプレを使用していない みたいな質問に答えたくなくなる何かがあるんだろうよ それを、スルーするのが悪いんだろみたいに逆ギレされても困る 自分は質問者で回答者の顔色を伺ってる意識を持てよ 高飛車なやつに応えたいなんて思うやつは皆無
スルーされる原因を突き止められる人ならそのまま質問も自己解決できそうなもんだが
>>571 アホな質問をする奴は自分の質問がアホな質問だなんて思ってないだろうから、
答えが返ってこなければ
>>538 みたいに平気でマルチするだろ
しっかりとマルチ=ダメというアホでも分かる境界線を引かないとダメ
>>576 だから何?
馬鹿だから見逃せっての?
原因が突き止められない馬鹿だからマルチさせてくださいってこと?
原因を突き止められる人は初めからマルチなんてしないだろ馬鹿ってこと 原因が突き止められない馬鹿に原因を突き止めなさいって長文レスするのが意味ある事だと思ってるの?
喪舞ら餅付けって(笑) 喧嘩して無意味にスレを消費するより 1レス消費するだけでわかっていてもわざと教えない質問の 答えを書き込んだ方が得だぞ(核爆)
>>579 原因を突き止めなさいっつてんじゃねーよ
原因突き止めるのが普通なんだからマルチすんなっつってんだよ
そもそもマルチポストしないというのが一番の得だぞ マルチポストしても何もいいことがないとわかっただろう 次からは気をつけろよ
>>581 マルチすんなってのは同意だが、
>>573 はどうみても原因を突き止めろよと言ってます
わざわざ原因として考えられる要因まで列挙してる心優しいレスです
俺はバレないようにこそこそマルチポストするやつより 堂々とマルチポストする奴の方が好きだ
お前の好みは聞いてない
>>538 をかばってる人は、まず質問に答えるべきだ!
いや、マルチする人はちょっと・・・
プライドの高い人が多いようだね。 ネタではなく真面目に素直に難しすぎてわかりませんと言える ような人こそ素晴らしいと思うんだよ。
ほらな マルチは悪びれる様子もなきゃ自覚もない
わからないならレスしないでくださいって偉い人が言ってたから 素直にわかりませんと発言する人はいないと思うよ
でも分からないということも答えだろ。 もしかしたらみんなわからなくて 未解決問題の一つかもしれないわけだし。
文字通り誰にも分からない問題なら分かりませんって答えられるけど、 自分には分からないって程度だとわざわざ分かりませんとは書かないな このスレではそんな問題にお目にかかったことはないが、 サードパーティのライブラリ系のスレとかだと稀によくある話だ
operator= がconst で実装されてるぐらいしか思いつかないが
>>538 のサイトで紹介されているイディオムを全て教えてくれ
597 :
531 :2010/11/01(月) 20:51:08
598 :
484 :2010/11/01(月) 21:01:05
>>486 ,
>>495 ,
>>497 皆さんの指摘を見て,よくよくソースを見直してみると,ちょっとしたtypoでおかしなエラーが出ていたことが原因でした.
修正すると,そのままconst int x = 10;で望み通りの結果が得られました.スレ汚しになってしまい,すみません.
こんな稚拙な質問にも丁寧に答えて頂いてありがとうございました.
マルチはその掲示板の意向にもよるだろう 思考停止ダメゼッタイとか頭が凝り固まってるのを露呈してる まあ2chでは基本ご法度ではあるだろうが
>>546 うぉぉありがとうございます
pythonスレ行きます。
zoom機能じゃなくて画像を変形する感じの機能です。
ファイル入出力について質問です。 以下のように、ファイル名を受け取って、fopenを使ってそのファイルを開き、その内容を配列にしまって出力する関数があったとします。 void hoge(char *file_name){ // ファイルオープン fp = fopen(file_name, "rb"); // ファイルサイズの所得 fseek(fp, 0, SEEK_END); sz = ftell(fp); fseek(fp, 0, SEEK_SET); // メモリを確保してファイル読み込み myPtx = (char*)malloc(sz); fread(myPtx, 1, sz, fp) fclose(fp); printf("%s\n", myPtx); free(myPtx); } これに対して別のテキストファイル名を指定して二階呼び出したところ、二回目の出力がおかしくなってしまいます。 具体的には、出力の最後に"数字の羅列(一回目のファイルの内容?)+文字化け文字"がくっついてしまいます。 サイズが大きいファイル→サイズが小さいファイルと呼び出せばこのようなエラーは起きません。 メモリ開放はしっかりやってるつもりなのですが、何がおかしいのでしょうか?
>>601 myPtxの指す文字列に\0のヌル文字が格納されてるか確認してみてはどうだろう
char str[1000];とかにコピーすればデバッガで簡単に見れる
>>601 テキストファイルの場合
ftellのサイズをfseek以外に使うのは未定義のはず
fgetposでやってみたら?
>>601 読み込むのはサイズ指定していてナル終端文字列になっていないのだから、そのまま%sで出力しちゃダメ。
printf("%.*s\n", sz, myPtx)として味噌。
605 :
デフォルトの名無しさん :2010/11/02(火) 23:13:01
5目並べのクリア条件ってどんな感じでやればいいんですか?
縦か横か斜めに5つ並んでたらクリアって感じでやればいいのではないんですか?
607 :
デフォルトの名無しさん :2010/11/02(火) 23:21:32
全部確認するか置かれた位置から調べるか迷ってます
自分がプログラムを書きやすい方でいいと思います 試しにどっちかの方法で書いてみて、途中であーなんかこっちは難しそうだと思ったらもう片方にしてみるとかでもいいと思います
609 :
デフォルトの名無しさん :2010/11/02(火) 23:34:07
再帰でやればいいんじゃね?
五つ並んでるのをしらべるのに再帰いるのかね。
てか最後に置いた石によって並ぶかもしれない5目を調べるだけじゃん? 最大で15通り、碁盤上下左右端付近ならそれ以下 たいした手間じゃないでしょ
再帰でもループでも簡潔に書ける
関数型言語ならむしろ再帰で書くのが自然。
五つ並んでるの調べるのにどこから見たらいいかって話に「再帰で」って 答えも意味不明だな。
そんなもん置かれた位置からに決まってる
>>602 ,
>>603 ,
>>604 ありがとうございます
まずfgetposですが、ftellと同じ結果でした
次に配列を用意してデバッグ中に見てみると、szから少し進んだところにNULL文字がありました
szからNULLまでは文字化けした文字で埋められていました
szにはNULL文字が含まれないようです
なので、mallocのときにsz+1分だけ確保して、最後にNULL文字をいれることで解決しました
どうもありがとうございました
c言語だと文字列の配列はchar *array[] = (ry で作れるけど、 c++でstringの配列はどうやって作るんですか?
620 :
デフォルトの名無しさん :2010/11/04(木) 03:39:27
>>620 半径rの円を描く時のコード
角度0.02πラジアンごと点の座標を1回転分出力してる
っていうかこれコード間違っててコンパイルできねぇ
>>620 ・もし様々なことに目をつぶってどういうプログラムかを知りたいなら
→半径1の円周上のxy座標を角度0.02πradごとにx軸から画面表示する
・もし様々な突っ込みどころについてなら
→二行目の時点でコードを投げ捨てる
すたじお☆えっち つまりエロゲの開発コードだよ
{}もねえな
カウンタをfloatで実装するのは感心しない というかコレスタッフが書いたのか?
ring1.cという意味のないコメントも考慮して 全く分からない奴が、どっかから手動でコピペしたと考えるのが妥当だろうな 紙媒体から手打ちで写したんじゃないかしら
>>616 そして敢え無く無視される>604。出力が目的なら、無駄に1バイト確保する必要なんてないのに。
本人乙
で?
studio.hってテレビ局のスタッフがつい打っちまったんだろうな。
マジレスすると、 コンパイル出来るかどうかなんて どんなコンパイラーを使うかどうかが決まってないと意味無いと思う。 もっとマジレスするとテレビの背景として使うソースコードが コンパイル出来るかどうかなんてどうでも良い。
マジレスすると、 #include <studio.h> そのコードで正常にコンパイルできるコンパイラは使いたくない
copy stdio.h studio.h
飾り鋲入出力
実は遠まわしにインド人IT技術者を揶揄する意図で書かれたテロップだとしたら…
だが待ってほしい、そもそもC/C++だというのが思い込みなのではないか
最初のコメントに.cって書いてありますけど…
拡張子.cのインド発新言語かもしれん
カレー言語か
>>620 番組スタッフが適当に作ったんだろうな。
俺らだってゲームのマップ作るとき地質学とか建築学とか考えないで適当に作るだろ (考えて作ってる人いたらごめんなさい) 気にしたら負けだと思う
ネットとかから適当にコピったりしたらまずいと思って、 わざわざ手打ちしたんだろうな。 ほほえましいタイポから考えると。
てかマでも素でstdio.hをスタジオヘッダーって読んでる奴いるしな
ス'タ'ジオの母音はどこいったのか感
SCSI「呼んだ?」
す・・・スクシー
Cのヘッダー名もCP/M時代からの8文字の縛り(?)かもしれないし、 関数名に至っては開発当時の環境の貧弱さから6文字までしか 識別子は認識せず後は無視するようになっていた そのためCの関数やヘッダーはあのような妙な短縮形が多いんだろう 特にstring.hの関数名の分かりにくさは最悪
宿題についての相談です。 正の整数をキーボードから入力し、1からその整数までの和を計算し、出力するプログラムをfor文を用いて書け というものなのですが、どのように書けばいいでしょうか。
宿題スレいけばすでに答えが出てる
654 :
デフォルトの名無しさん :2010/11/05(金) 18:51:23
int *p; int* p; 書き方が違うだけで同じ意味でしょうか?
同じ意味です
int*p; int * p; などのように書いてもいいぞ
identify<int *>::type p; こう書くのが最も優秀です
658 :
654 :2010/11/05(金) 19:01:53
>>654 int *p; これは*pについて。*pはintを入れるんですよってこと
int* p; これはpについて。pはint*を入れるんですよってこと
int*p;
int * p;
これらは最初の2つのどちらとも取れる手抜き書き方
つまり、読み手に任せるよってこと。
配列の中の値を入れ替えるにはどうすればいいのでしょうか? 例えば、配列の中の最小値を求めて、その最小値を配列の中の値の一つに上書きする といった感じです。 お願いします。
配列の中の最小値を求めるには、まず配列の最初の値を調べて変数に覚えます それから配列の残りの値を順に見ていって、覚えた変数の値と今見てる配列の値の小さい方を変数に覚えます それを配列の最後まで繰り返したら、覚えてる変数の値が配列の中の最小値ですので、 その最小値を配列の中に好きなように上書きすればいいです
それをC++で記述お願いします。
ありがとうございます。そしてごめんなさい。 質問間違えましたorz 最小値を上書きするのではなく、その最小値に+1した値を、でした。 申し訳ないです。。。
いつのまにか書き込みが!
規制で携帯から失礼してますorz
>>662 こんなページあるんですね。分かりやすいです。
ありがとうございます。
666 :
デフォルトの名無しさん :2010/11/05(金) 20:19:10
>>659 嘘教えるな。その説明はint* p,q;で破綻する。
すみません。 3KBのBYTE配列に (※4バイトずつ利用) 変数(int型とfloat型)5〜20個(毎回一定ではない個数)を1セット。 それを3〜30セット入れています。 毎回一定ではない個数なので、 あらゆる間仕切りに「特定の整数」を使いたいのですが、 floatがその「特定の整数」と同じビットの並びを起こさないかが不安でなりません。 また、同じ並びを検出する事はできるのですが、 下手にfloatの値を動かすと誤差では済まない事になったり、 別の「特定の整数」と化す恐れがないかという不安が・・ どなたか、何か良い回避方法があれば教えて頂けますと幸いです・・orz
先頭に個数でも入れとけばいいんじゃないの
データ種別をあらわす1バイトを先行させる。
配列に入れる際にfloatが特定の整数と同じになったかどうかチェックして同じになってたら 1ulp ほどずらす ・・・あんまりいい方法じゃないと思うけど
先頭にインデックステーブルを持つ
>>667 intとfloatがグチャグチャに混在すんの?
派生クラスの方でコンストラクタによる初期化を行うつもりのプログラムなのですが以下のようなエラーが出ます。
理由を考えてみたのですが良く分からなかったので初歩的な質問ですがお願いします。
エラー E2312 oko.cpp 20: 'Basic::height' は曖昧でない基本クラス 'Human' ではない(関数 Human::Human() )
エラー E2312 oko.cpp 20: 'Basic::weight' は曖昧でない基本クラス 'Human' ではない(関数 Human::Human() )
http://codepad.org/gxrFs0NE
675 :
デフォルトの名無しさん :2010/11/06(土) 00:01:15
for文でループを const int N=hoge; for(int k=0;k<N;++k) { cout << "a" << endl; (中略) cout << "b" << endl; } のように書いたときに, 「b」と出力したきりプログラムがフリーズするということが起きています. 中略部分は事情があって具体的にはここには書けませんが,少なくともカウンタkに手をつけるような処理はしていません. おおまかには中略部分で反復計算をやって,条件をみたしたらbreak,Nを最大反復回数とする処理です. 色々と経過を吐かせると,もちろん脱出条件は満たしてはおらず,次反復への処理を終えて, 次のループに進もうとするまさにそのときにフリーズしてしまっています. この場合,どのようにしてデバッグするのが良いでしょうか.
>>674 基底クラスの方のコンストラクタで何もしないように定義して後から実行される派生クラスのコンストラクタで
メンバ変数を初期化しようとしていましたが良く分かりました。
ありがとうございました。
677 :
675 :2010/11/06(土) 00:04:33
書き忘れました. コンパイラはGCC,Intelコンパイラ両方を試し,両方共全く同じ段階でストップします. OSはLinux,最適化は-O0,-O1, -O2, -Osで再現します.
>>675 bの後でフリーズするなら
そのあと1行ずつ実行すりゃわかるだろ
(中略)にバグがあるとしか。バグ可能性はメモリー破壊
gdb?
>>676 何度も質問すみません。
もし派生クラスから基底クラスのメンバ変数を変更したいならば
派生クラスで初期化の関数を作る方法ぐらいなんでしょうか?
代入すれば?
>>682 そうですねw
出来たらコンストラクタみたいに実装したかったので
>>684 初期化ばっかり考えてたので全く頭に浮かびませんでしたw
代入の場合は派生クラスのコンストラクタでも基底クラスの値は変更できるんですね。
回答ありがとうございました。
シリアルポートで通信するクラスで すでにopenしてるポートを再度openしようとしたら例外もしくはassertしたいのですが 対象のポートが使用済みかどうかを判別する方法はないでしょうか?
ダイナミックライブラリを作るときは 関数の前に __declspec(dllexport)、__declspec(dllimport) を付けて スタティックライブラリのときは、消す必要がある?(消さないとそのライブラリを使った時リンクエラーがでた) つまり#defineでダイナミックライブラリとスタティックライブラリを分ける必要がるの?
double c[0][1]=1; double x = 1; if( tan(sita) * x == c[0][1] ){ printf("hoge"); } tan(sita) は1になるようにしてあります。 実行してみると「hoge」と出力されません。 判定式には三角関数を使ってはいけないなどあるのでしょうか?
>>689 そんなことはありませんが、 double 型の値には計算誤差が含まれるものですので
== で比較した場合は、ぴったり完全に誤差なく 1 が得られたときしか出力されません
double は 17 桁くらいの精度がありますから、
printf("%.17f\n", tan(sita) * x);
などとしていちど値を確認してみてください
あとどうでもいい話ですが、θは sita じゃなくて theta です
>double c[0][1]=1; double c[1][2]; c[0][1] = 1; こうじゃなくて大丈夫なのか?
>>688 生成物が変わるんだから宣言変えなきゃダメだろう。
>>689 不動小数点の=比較は誤差を考えて、
if( abs(A-B) < 10^-6) とかやった記憶がある。
>>694 ありがとうございます。
その方法で解決できました。
696 :
デフォルトの名無しさん :2010/11/07(日) 11:19:50
lseekの頭の"l"って何の略ですか?
long
マウスイベントメッセージを使用せずにマウスクリックの情報を取得する方法はありますか? WM_LBUTTONDOWNではなく、GetKeyStateのようなこちらから確認する方法です お願いします。
自分で書いてるじゃん GetKeyState(VK_LBUTTON)
>>700 ああ!それで大丈夫でしたか!
ありがとうございます。助かりました。
>>700 おお!それで大丈夫でしたか!
ありがとうございます。助かりました。
これはどう解釈したら良いのだろうか、
これはどう解釈したら良いのだろうか、
僕にはわからない
僕にはわからない
多分キーボードにしか使えないと思ってたんじゃないだろうか
多分キーボードにしか使えないと思ってたんじゃないだろうか
タグみたいなのあるじゃないですか。 それでタグみたいなやつを作るには class A{}; static const int A=1; typedef int A; 上記のうちのどれが最適ですか? ちなみにtypedefはint Aとint Bはべつものになりますか?
日本語でおk
iterator_tag でも参考にしろ。
for(i=1;i<10;i++) { if(no[i] < i_min) { i_min = no[i]; a = i; } no[a] = i_min+10; これを10回繰り返したいのですが、どうすればいいんでしょうか? 具体的には配列の最小値を選び、その最小値に+10をして、もとの値に入れる といった動作です お願いいたします。
forで括れよ
>>712 int j;
for ( j=0 ; j<10 ; j++ ){
i_min = no[0] ;
a = 0 ;
for(i=1;i<10;i++)
{
if(no[i] < i_min)
{
i_min = no[i];
a = i;
}
}
no[a] = i_min+10;
}
715 :
デフォルトの名無しさん :2010/11/10(水) 19:11:42
ビットフラグの定義を #define A_ENABLE 0x00000001 #define B_ENABLE 0x00000002 #define C_ENABLE 0x00000004 #define D_ENABLE 0x00000008 みたいに書いている同僚がいたので #define A_ENABLE (1 << 0) #define B_ENABLE (1 << 1) #define C_ENABLE (1 << 2) #define D_ENABLE (1 << 3) のほうがいいと思ったので指摘したんだけど、こんなものは会社によって 書き方のルールは違うからどっちでもいいみたいなことを言われました。 マイコン用のライブラリとかでは後者の書き方をよくみかけるし、 ビットフラグだということがわかりやすいので、後者で統一しようと 考えているんだけど、おかしいですかね。。。?
>>715 どっちでもいいし、デバッガで見たときなどに計算しなくてすむぶん上の方がいいという考え方もありうる。
ありがとうございます。 ただ、デバッガでみるときはビットがたっているか、いないかで確認するので 表示は16進表記じゃなく、2進数表記に切り替えると思いますがどうでしょうか? やっぱりもともとビット単位で表現するものをわざわざ16進表記にするのは 余計な脳内変換が必要なのでそうする理由がよくわからないのですが、ほかに デバッガでの表示が容易という点以外に何か利点はありますでしょうか?
2、8、16進数の相互変換は見た瞬間出来るぐらいでちょうどいいよ
A_ENABLEの定義を見ただけでフラグに何ビット使うかわかるとか
>>15 1ビットだけ立つならそれでもいいが、複数立てる場合は前者が直感的にいい。
もちろん、頭の中で瞬時にビットのイメージがわくからね
>>720 どういうこと?マクロの使用箇所は関係ないと思うが。
>>715 そんなビミョーこと指摘しても認めるわけないだろ。
マニュアルに書いてあるようなことでも絶対認めないような
連中とかゴロゴロいるくらいだし。
「SQLでbetween禁止な。インデックスがきかないから」
↓
「(各種証拠をみせて)インデックスききますよ」
↓
「いままでずっとそうだから、とにかくbetwennは禁止だ」
みたいな。
>>722 まあ指摘が細かいことはわかっているんだけど、こういう糞コードで
どんどん汚染されていくのを黙ってみてられないんだよね・・・
>>723 bit立てるのにbit長キメウチは汎用性ないからな
でも、A_ENABLE ってのはちょっとセンスないな
#define BIT_0 (1 << 0)
#define BIT_1 (1 << 1)
#define BIT_2 (1 << 2)
#define BIT_3 (1 << 3)
....
とか位にしてくれ
BIT_0 || BIT_3 とかするときにどのbitが建っているか解りやすい
BIT_0 | BIT_3 だった
#define BIT(n) (1 << (n))
#define A_ENABLE 0x100000000 #define B_ENABLE (1 << 32) intが32ビット以下のときAはlong long等になるがBはint 0 シフトするなら環境依存の有効ビット幅を意識せずにはいられない
>>722 だって日本ではドカタと呼ばれている底辺職種の人たちだよ
>>723 だから、細かいことはあまり気にするな
情報産業がなければ何もかも回らなくなるのに土方とか言われてなんでこんな立場低いのかね
>>729 プログラマに低脳多いから、立場が低いじゃないか
わが社の主業務は人貸しですってとこ多いし。売買の対象となる人の立場が高いなんてありえないよ。
自社製品を売って金を稼ぐ会社か元受に近い会社じゃないと、プログラマ==ドカタって扱いになるんじゃないか
本物の土方だっていなくなれば大変だからな いなくなれば困るなんてのは立場には関係ないわな
プログラマーは30過ぎるとSEにジョブチェンジされるんだからいいじゃん。 土方は定年まで土方だよ。
733 :
デフォルトの名無しさん :2010/11/11(木) 14:30:22
数千行のプログラムである処理を行うとき、 関数の引数としてポインタを利用する場合とグローバル変数を 用いる場合ではどのような違いがありますでしょうか?
ひ、ひじかた…
グローバル変数は極力使わないようにするべき
グローバル変数を使うと悪意を持った同僚がバグを仕込む確率が高くなります
関数コールの時にスタックに積まない分、グローバルの方が早いって事?
>>733 仕様をいちいち客に問い合わせるか、
仕様書を見るかの違い。
739 :
z :2010/11/11(木) 16:54:20
C言語で分からない問題があります。 {if-else文} 身長と体重のデータを読み込み、下の定義から体型を判定するプログラムを作成せよ。 定 義:身長h(cm),体重w(Kg)とすると w < (h-95)*0.82 やせすぎ(SLIM) w > (h-95)*1.10 ふとりすぎ(FAT) その中間 正常(NORMAL)
マルチしね
>>737 最近のコンパイラはstaticな関数はどんどんインライン展開してしまうのでスタックに積むコストはなくなる場合が多くなります。
また、グローバル変数はCPUキャッシュの外にある場合があるので、アクセスコストが馬鹿にならない場合があります。
そんなことよりも、それが問題になるようなレベルの高速化をする前にやることは腐るほどあるので、保守性を上げる為に
どうしても必要がある場合以外はグローバル変数は禁止の方向で。まして、externで外部変数を参照するなんて以ての外。
>>733 マルチスレッド化に際し、大きな障害になる。
応用的なクラスを効率とか安全性考えて試行錯誤するんだけどstlとかboost使ってとりあえずでやっつけたほうが良いものが出来上がって悲しい
>>744 俺たちの代わりに試行錯誤してくれたんだと考えれば悲しくない。
DirectXでゲームを作ってます 外部ファイルで持たせてあるデータのロードに失敗した時に、 エラーメッセージを表示して強制終了したいのですが、 MessageBox()関数には引数として、hwndが必要です。 クラス設計を進めていくと、わざわざ全てのクラスのコンストラクタに hwndを渡すのが煩わしいのですが、他の方法はないでしょうか? hwndをグローバル変数で持たせる、という方法も思いついたのですが、 エラーメッセージのために、普通、そこまでするものでしょうか? ちなみに、_ASSERT_EXPR()は、リリース時には動かないので、除外してください
例外を投げてUIを扱えるところまで戻ったところでcatchする
>>746 言わんとするところは分かるが根本的な設計が間違ってる
ウィンドウハンドルみたいなハード依存部分を
グローバルスコープで参照したり各クラスオブジェクトに渡すのは良くない
ハードに依存する部分としない部分はキッチリ分けないと再利用性が無くなる
あと、その言い方だとたぶん
各オブジェクトごとにファイルを読んでインスタンスを生成するような設計っぽいけど
それだと同じファイルを使うオブジェクトを複数生成するときに
オブジェクトの数だけ読み込みを行わなくならなくならないか?
やるべきことはデータロード部分と各クラスオブジェクトを分離すること
まずデータロードクラスなりを1つ作って
データ読み込みは全てコイツが行う
ウィンドウハンドルもこコイツだけが内部で知ってれば良くて
メッセージ表示等も全てコイツがやる
各クラスオブジェクトはこのデータロードクラスで
読み込んだデータを参照してインスタンスを生成し
それ自身はファイルの読み込みはしないようにする
なるほど!
>>748 便乗して質問してしまうが「データの参照」って具体的にどうやって書けばいいの?
>>746 コンストラクタとか関数の引数全てにhwnd渡すぐらいなら、
グローバル変数の方がいい
どうしても気なるなら、staticな変数にhwndを覚えるようなクラスを作って、
メッセージボックス表示をそのクラスで行なうとか
強制終了ならFatalExceptionとか作ってスローしてmainでキャッチすればいいじゃん
>>746 けっこうみんな悩んでるからここで聞いて解決する問題じゃないと思う
constってクラスをインスタンス化する時に、何度も初期化されるの?
>>746 >クラス設計を進めていくと、わざわざ全てのクラスのコンストラクタに
>hwndを渡すのが煩わしいのですが、他の方法はないでしょうか?
エラー表示に使わないようなパラメータをコンストラクタで渡していくのは煩わしいし蔵設計がいびつになることは確かにある。
その手の問題は、エラー表示クラスを作って、そのクラスのプライベートstaticメンバー変数にアプリ初期時に
エラー表示に使うウインドウハンドルを設定して置くようにしている。
staticメンバー変数も結局はグローバルなんだけどプライベートstaticメンバー変数であれば、
初期化タイミングがはっきりするし変更不可にもできるし、ただのグローバルよりはマシ。
でもね、ひとつだけいえることはMessageBoxのhWndは0でもOKなんだよ
うん。普通にNULLでいいじゃない。
NULLで渡してフルスクリーンモードでメッセージボックスでて死ぬに1票
解像度変更&フルスクリーンの上にコモンダイアログを表示するゲームとかあったな
>>732 一応スーパープログラマ呼ばわりされてたけど、30過ぎたあたりでクラスチェンジすることなく燃え尽きた。
趣味でコーディングは、するけど…もうSEもプログラマも辞めた。
なにをもってスーパーなのか知らんが、そう呼ばれてた時期が長かったな
納期2週間を2時間、処理で20時間掛かるコードの最適化で6時間まで短縮
ひらめきプログラマなんで同じコードが書けないのが短所かw
聞かれてもいないのに自分語り気持ち悪い
プログラミングは得意だが一般常識もコミュ力も無いとかで 「スーパープログラマーくん(笑)」とか呼ばれてたんだろどうせ
>>759 の文章からはそんなスーパーとか言われるような知性を読み取ることはできないな
スーパーを名乗るなら20時間が6分位じゃないと。
自分語りすると叩かれる見本
自分にとってどうでもいい短所を混ぜつつ譲れない点を自慢するのがミソ
\み会行きたくない… orz ……orz /orzorzorzorzorzorzorzorzorzorz . .: : : : : \ orz orz 彼女にアニオタだってバレ/orzorzorzorzorzorzorzorzorzorz . .: : : : : : : \ノジョにフられた…… orz … /orzorzorzorzorzorzorzorzorzorz . . : : : \ …… orz 友達と喧嘩/ ■■■ ■ ■■ ■■■■■ . . .... ..: : ::\orz 女の子のアドレス30件しか /■ ■ .■ ■ Λ_\ ……orz …orz / ■ ■ ■ ■ リア充→ /:彡ミ゛ヽ;\ … 経験人数が一/ .■ .■ ■ ■ / :::/:: ヽ、ヽ、\ … ∧∧∧∧∧ / ■■■ .■ ■■■■■ / :::/;;: ヽ ヽ ::l\< 自 >/ orzorzorzorzorzorzorzorzorzorzorz  ̄ ̄ ̄(_,ノ  ̄ ̄ ̄ヽ、_ノ ̄< 虐 > orzorzorzorzorzorzorzorzorzorzorz < 風 >orzorzorzorzorzorzorzorzorzorzorz ―――――――――――< の 自 >―――――――――――― 36 名前:学生さんは名前 < 予 慢 > OTL セックスしすぎて… 東大に入って、昨日の駒 < 感 > OTL 彼女が… orz 彼女に運ばれて、今日の < !! > 高学歴なのに… orz /∨∨∨∨∨\ 友達が… OTL mixiで… 24 名前:学生さんは名前が/ \ 合コンで… orz 彼女から着信あるとマジで/ リア充[ピーーー]よ!\´ OTL イケメンなのに… 連続ですごいかけてくる /∧_∧ ∩ \サークルが… orz 正直しんどいです… /( ;´Д`)ノ______ \ orz 180cm65kgで… / (入 ⌒\つ /| \ 女の子が… OTL 427 名前:学生さんは/ ヾヽ /\⌒)/ | \ バイトの… 童貞に戻りたい…orz/ || ⌒| ̄ ̄ ̄| \
ミサワかよ
20時間が6時間なら3倍強か。プログラムの種類にも拠るけど、 その位だとPC換えるか追加して終わりってレベルだから金にならない。 20時間が6分なら200倍だから、そこまでできるのなら金になる。 つーか、高速化で飯喰ってるけど3倍強はコンパイラのご機嫌伺いのレベルだよw
ここはスーパープログラマの多いスレですね
1から作りなおさないと20時間を6分に短縮なんて普通できないだろwww
ヒント:妄想
高速化で飯食ってるなら、まぁ普通なのかもしれんな というか20時間掛かるプログラムを書いた奴が土方レベルなんだと思うがな 高速化はボトルネックの特定から始まるから面倒な作業だと思うよ。 1日〜2日目なんてtimeGetTimeあたりを仕込んでログとって終わりだろうからな 20時間を6分は無理だろう…(1から作っても設計的に無理だろw) どっかにSleepでも仕込んであったんなら可能だがなw 昔だけどDBの仕事で故意にSleepが仕込まれていたケースがある。 次の受注でSleep取って高速化しました。とかしたり顔で言うつもりだったのか
sleepワロタ
なんか不具合があって Sleep噛ませたら動いた! ってなったからそのままという可能性も
って書いて自分もSleep入れたことがあるのを思い出した。 他プロセスから完了の通知が来て、プログラム実行したのは良いけど そのプロセスがファイルに処理結果を書き出し中で、それを読む俺は… forで回しながらSleepして待った記憶あるわwww 100回やって駄目だったらタイムアウトとかだったかなぁ… 完了通知はファイル書き終わってから出せと言ったが、相手が韓国人で 通じねえwww
REM WAIT FOR I=0 TO 1000000:NEXT
C++難しすぎ
パールとかに比べればはるかに簡単でしょ
( ゚Д゚)
スクリプト系は俺も嫌いだな コンパイラが無いから構文エラー特定してくれないし (自分で作れって話もあるが) tclとかやっててイライラしてくるわ
>>768 高速化で時間70%削減は並みじゃないと思うぞ。
ここはC/C++スレだからどちらかの言語だと思うが、ハードを買いなおした方が安いってのは幻想
確かに最新PCを買ってそれで済むならハード交換のが安いが大規模な企業の場合は
ハード買いなおしたらインフラの人が動くしそこで金が動くと思われる。
トータルコストでソフトを改良した方が良いと判断されたのだろう
ハードは時期が着たら交換するだろうが、その時はさらに速度UPするだろうからな
俺もスクリプトは嫌いだ
そろそろハードの交換ではスピードアップは期待できないんじゃないかな。4GHz超で駆動している CPU は、まだない。
>>783 あるよ
wikipediaより
>POWER6+は5.0GHzまでのクロックが可能で
Visual Studio 2010 で C++ のプログラムを作っています。 double er[12], ei[12]; という配列に任意の値が入っているとします。 この2つの配列を使った値、i番目ならば double lensq = er[i] * er[i] + ei[i] * ei[i]; を使ってlensqの降順にインデックスの番号を振った int index[12]; という配列を作りたいです。 スマートな方法はないでしょうか? Boostは使わないでください。 例えば配列の要素数は3だったとして er[3] = { 1.0, -1.0, 2.0 } ei[3] = { 0.0, 4.0, -1.0 } だったとすると index[3] = { 1, 2, 0 } となって欲しいのです。
普通に計算してソートする。
普通に計算するのをスタート地点としてそこからスマートにするって話じゃないのか
じゃあ、一つ思いついたからいうよ。 abs(er[i])<abs(er[j])&&(ei[i])<ei([j])ならi<j
じゃあ、一つ思いついたからいうよ。 abs(er[i])<abs(er[j])&&abs(ei[i])<abs(ei([j])ならi<j
>>2 もう挙げられてるけど
index[3] = { 0 1, 2 };
を用意して比較関数を与えてstd::sortをすればいいんじゃない?
お前の求めるスマートさが見た目をすっきりさせることならだが
791 :
785 :2010/11/17(水) 15:47:07
くだらなすぎて答えようがない質問でしたね。ごめんなさい。 普通にソートしました。 const int d = 3; double er[d] = { 1.0, -1.0, 2.0 }; double ei[d] = { 0.0, 4.0, -1.0 }; int index[d]; for(int i = 0; i < d; i++) index[i] = i; std::sort(index, index + d, [&](int l, int r) { return (er[l]*er[l]+ei[l]*ei[l]) > (er[r]*er[r]+ei[r]*ei[r]) ? true : false; }); for(int i = 0; i < d; i++) std::cout << index[i] << std::endl;
Cで多重ループから一気に抜け出すのにgotoとlongjmpのどっちが良い?
gotoが使えるならgotoのほうがいいに決まってるが
Longjumpて使ったことない。 harmfulなんてもんじゃないと思うけど一体何に使うの?
C++なら確実に要らない子だが、Cでまともなエラー処理をしようとすると避けては通れぬ道>longjmp そもそも、いくらharmfulでもどんなharmか分かっていれば問題ないよねというのがC言語
多重ループから抜け出すケースが複数ある場合にlongjmp使った方がすっきりかけるかなあと… gotoは脱出先でも合流するために更にgotoつかうのがイヤだな。 switch (setjmp(env)) { case 0: for () { for() { if () longjmp(env, 1); else if() longjmp(env, 2); } if () longjmp(env, 3); } break; case 1: ... break; case 2: ... break; case 3: ... break; }
ねーよ 変数一個増やしてでもgoto後に分岐すべき。読みにくすぎる
goto使うとこうだよね。goto l0がとても嫌だ。 for () { for() { if () goto l1; else if() goto l2; } if () goto l3; } goto l0 l1: ... goto l0; l2: ... goto l0; l3: ... /*goto l0;*/ l0:
こうだろ、普通は int a = 0; for () { for() { if () a=1; goto loopEnd; else if() a=2; goto loopEnd; } if () { a=3; goto loopEnd; } } } switch(a) { case 1: break; case 2: break; case 3: break; default: break; }
switchの上にloopEnd:忘れたが脳内補完してくれ
aもloopEndも不要 for () { for() { if () goto l1; else if() goto l2; } if () { goto l3; } } } switch(0) { default: break; l1: break; l2: break; l3: break; }
ていうかそもそもgoto前に処理すればいい。ジャンプした後に別々の処理を行うという設計が意味不明。
>>804 この形だけだからそう見えるけどエラー処理だから最後にまとめて記述する事自体は普通だろう
catchが複数並んでるようなもんで
goto前に処理すればいいな
>>805 for文抜けるだけなんじゃなかったか?
それだとなんで飛び先複数いるのかわからんが
エラー処理ならなおさら分けることは望ましくない
>>809 じゃぁただの馬鹿か
goto文の使い方ぐらいじゃんと勉強しとけ
switch内に突撃しちゃだめなんじゃなかったか?
defaultって一番上に書いていいの?
それは何処に書いてあるのだ?
>>813 最初でも途中でも、好きなところに書いていい。
てゆーか
>>802 って動作すんの?
switch文のラベルに外部のgoto文で飛ぶんだよな?
switch文のラベルじゃない
defaultの中に書いてあるってことか
>>816 全く正しい。
>>810 は正しくないとする根拠を示すように。
>>818 これでも構わない。
for () {
for() {
if ()
goto l1;
else if()
goto l2;
}
if () {
goto l3;
}
}
}
switch(0) {
l1: break;
l2: break;
l3: break;
default: break;
}
普通はあまり深い階層に入るようなら 関数化するとかで回避するのが堅実なんじゃないかな? 避けて通れないようなら仕方ないけどねぇ いかに簡素化して書けるかが問われるとこだと思うけども
>>818 defaultに中も外もないよ。
switchの中はどこでも同じ。
配列の中にある値を変数に代入する場合 a=[0][0]; のような形でやってみたんですが上手くいかないのですが、どうすればいいのでしょうか?
何がやりたいんだよ
b = a[0][0]; a[0][0] = b; のどっちかだろう
>>819 正しいかどうかじゃねーだろ
そんな糞みたいな使い方してんじゃねーよ
gotoはあくまで入れ子の中から外に出すために使われるべきでif文やswitch文の外から中に飛ぶべきではない
間違ったgoto文の使用は正しいエラー処理をすっ飛ばし意図しない不具合が起こるしプロジェクト全体に迷惑をかける
>>825 それを禁止するなら、ラベルのスコープを変数と同じくブロックにすればいい。
ところがCはそのようにしなかった。すなわち想定内の正しい使用法。
本当は
>>802 のような使い方知らなかったんだろ。
Duff's Device に比べりゃどうってことない でも switch(0) じゃなくて while(0) でいいんじゃない
gotoって処理速度優先の時にはどんな用法でも認められるべきじゃないの?
>>826 コンパイラの仕様は関係ないだろ 頭おかしいのか?
int[5]の配列の六番目にアクセスしても何ら文句は言われないがそれが正しいのか?
使い方知らない、とかそんな発想する時点でアセンブラも弄ったこと無いゆとり丸出しだな
一から勉強しなおせ
>>827 >Duff's Device
見た目恐ろしいが凄いこと考えつく人がいるんだな
>>829 全然関係ない例を引っ張り出して、頭の悪さがはっきりと出ていね。
>>829 難しいで「アセンブラ」が真っ先に思い浮かぶなんて、貧困過ぎる。
そういう小学生みたいな煽りは要らんから。
せやなw
>>833 小学生みたいっていうやつが小学生なんですぅ〜
int[0]の配列のi番目(i>0)にアクセスするなんてしょっちゅうやってますが、なにか?
>>825 じゃあこれなら文句無いだろ
while(1){
for(){
for(){
if()goto l1;
if()goto l2;
if()goto l3;
}
}
break;
l1:
break;
l2:
break;
l3:
break;
}
なんで、わざわざgoto使うのかな?
ラムダがあれば一発で解決する
つまり、breakが使用できる制御構造は複数gotoの飛び先の合流に利用出来る。 外から飛び込むか、中に記述するかは好みの問題ってことでいいね。
俺なら、エラーコード変数を作って、エラーコードでもどすけど。 gotoのほうが良い利点はステップ数が少ないだけ?
俺なら多重ループの部分を関数化してリターンする
>>842 820で言ってる。
ネストが深い構造はあまり作るべきではないよな
俺なら関数化するね
名前空間がstdは全てSTLなのですか?
そもそも多重ループからジャンプしたくなるような設計にしない
人のコーディングスタイルが気になったり、口出ししたくなるうちは、まだ半人前!
template <int N> struct Tag { }; try { for(…) { for(…) { if(…) throw Tag<0>(); } if(…) throw Tag<1>(); } } catch(Tag<0>) { //… } catch(Tag<1>) { //… } つーかC++なんだし、エラー処理なら例外使うのが正解 なんでこんなこともわからないのかね 正常フローでネストから抜けたいなら宗教論争だから好きにしろ
キリッ
元の質問者がCで、と前提を決めてるのに、それを無視しちゃうのか?
ププ
>>847 一理あるけど、あまりヒデーと口も出したくなるもんだw
規約上OKならいいのか?となるっしょ
俺の上司なんか元コボルだからほぼ全部グローバル変数だぞwww
直しといて、って気軽に渡されたけど訳わかねーよw
関数の引数は一切なかったwww(AccessVBAだったからスレチかもしれんが)
たかが1関数の中の記述方法なんてどうでもいいじゃん 関数化してブラックボックスになったらバグってない限りもう永遠に触らないんだし 迷うのはもっとスケールの大きい選択にぶつかってからでいい
まあそういうが、大きくなればなるほど一歩一歩の積み重ねも大事だ。
>848 おまえは、マ板でやってる例外の議論を一万回読んでこい
今日もC/C++スレでは低レベルと高レベルの話が交錯するのであった… 分けるべきかもね、スレ…
>>856 自分には全部低レベルに見えるけど、いったいどのへんに高レベルな話があるんですか?
あげ
859 :
デフォルトの名無しさん :2010/11/19(金) 00:30:47
あ
860 :
デフォルトの名無しさん :2010/11/19(金) 00:49:56
>>853 でも
>>852 は"記述方法"の範疇外の問題だろw
グローバル変数のみ、引数なしってことは内部実装を知らないとパラメータが設定できないんだから
int flag=LOOPi,i=ZEROi,j=ZEROj; while(1){ switch(flag){ case LOOPiQ:/*〜*/; if(!i+=Xi<ENDVALUEi)break; case LOOPi: /*〜*/; flag=LOOPj; case LOOPj: /*〜*/; if()flag=L0;else if()flag=L1;else if(!j+=Xj<ENDVALUEj)j=ZEROj,flag=LOOPiQ; continue; case L0: /*〜*/; break; case L1: /*〜*/; break; }flag=LOOPi,i=ZEROi,j=ZEROj;} キリッ
それ見るの何回目だろうか
866 :
865 :2010/11/20(土) 09:33:45
できやがりました どうもすいませんでした(怒
アホス
*(pointer + 3) なんて何に使うんですか?
pointer + 3 の場所にアクセス
pointer[3]とおなじです
871 :
868 :2010/11/21(日) 10:23:39
>>870 では、何のためにこの記法を使うのですか?
*(pointer - 1) と書いてもいいので便利ですね
pointer[-1]とも書けますが。
そんな書き方をすると正気を疑われますが、pointer-1ならそうなりません。よかったですね
>>870 じゃないけど
ポインターに演算してアクセスしているよ、の意思表示。(けっこう重要)
pointer[3]だと、配列だと間違う可能性もあるだろ。
>>871 >868の方が速いと信じているか、>870とは意味が違うと勘違いしているか、何も考えていないのでしょう。
877 :
868 :2010/11/21(日) 10:36:57
なるほど、>874も>875も「意味が違うと勘違いしている」ようですねw
879 :
868 :2010/11/21(日) 10:39:14
リロードしてなかった…
>>876 では、速さも意味も同じでどっちを使おうと違いは無いんですか。
コーディング規約でそう決めるとか、自分はそうするとか、ポリシーがあるのならそれ自体はいいことだと思います。 が、他人に「正気を疑われる」などと押し付けるほどの意味はありませんね。 ついでに言えば、配列と間違わないためには文字列を扱う関数内では[]が全く使えなくなります。 ForExample: int sample(const char * str) { int len = 0; while (* (str + len) != '\0') ++len; return len; } -- 私にはstr[len]の方が見易いのですが、どちらでも好きに書けばいいことでしょう。
組み込み型の場合はp[n]は*(p+n)のただの糖衣構文ですが イテレータクラスの場合はすこし状況が変わります p[n]に比べて*(p+n)はテンポラリなイテレータの生成が含まれるので無駄なコストがかかります *(p+n)のような使い方をすると予め分かっている場合は必ず[]をオーバーロードしてこちらを使うようにしましょう そしてC++使いはイテレータに合わせて組み込み型のインクリメントを++itと書くように統一感を重視します したがってただのポインタの場合でも*(p+n)とは書かずにp[n]と書くことが推奨されています *(p-1)と書くのは間違いでp[-1]と書くのが普通なのです
5行目までは正しい
すぐに中身を参照するとは限らないのだから その場では pointer+3 だけを計算してあとで *pointer したいかもしれない pointer[3] だとそれができないじゃないか いやまぁ & つければいいんだけどね しかし pointer+3 を &pointer[3] と書くなんて、実にまわりくどい
画像ライブラリ(libHello.so)を作っています。 libzとlibpng,libjpegを使うのですが、コンパイルの時に一緒にこれらのライブラリを 指定したほうがいいですか? 特に指定しなくてもあとで画像ライブラリを使うときに リンクすればいいのでしなくてもいいし、した方がいいのかどっちでしょうか?
.libの互換性が今後も保証されてるなら指定しなくていいんじゃない? まぁ、コンパイラのバージョンが変わったときに 以前のコンパイラで作ったlibとリンクできません、なんてことがよくあるんだけど
887 :
885 :2010/11/22(月) 13:56:42
やっぱりよくわからない。念のためリンクしときます。御免なさい libpngとかないとそもそも動かないのでおかしくはないはず。
>>884 C++ならstd::vector<int> foo;に対して当たり前のように&*foo.begin()と書くから(回りくどいという意識は余りないので)大丈夫。
ポインタ演算できる保障が常にあるわけじゃないことに注意。
>>827 Duff's Deviceにインスパイヤされて、こんなの思いついた
do{} while(0)バージョン
int x = -1;
switch (a) {
do {
case 0: x = 1; break;
case 1: x = 10; break;
case 2: x = 100; break;
} while(0);
printf("%d %d\n", a, x);
break;
}
ifバージョン(breakなし)
int x = -1;
switch (a) {
if (1)
case 0: x = 1;
else if (1)
case 1: x = 10;
else if (1)
case 2: x = 100;
printf("%d %d\n", a, x);
break;
}
あるクラスが持っているコンテナに順にアクセスしたいのですが その場合はイテレータを返せばいいのでしょうか?
ハイ
イテレータを返してるソース見たこと無い
PHPでいう var_dump() のようなものは、C++にはありませんか? 標準では存在しないとしたら、類似の処理をライブラリで配布していたり、 サンプルコードを掲載しているサイトはありませんか?
デバッガを使ってください
895 :
885 :2010/11/23(火) 12:55:43
ライブラリAをコンパイルするときにlibpngとlibjpegを指定しておくと、 あとでAを使うときにはlibpngとlibjpegをリンクする必要はないのな。 始めて知った。どのみち必要な事には変わりないけどすっきりしていい感じ。
>>895 そうしちゃいけない例外もある。例えば特定のOSでのpthreadライブラリ。
pthread.soにスレッドバージョンのforkが含まれているので、ライブラリAが
pthreadを使うときは、実行ファイルのリンクの際にもpthreadをリンクする
必要がある。
unsigned intは32ビットプロセッサ上でインクリメントすると65535までしか入らないんですか?
intのサイズによる。
VisualBasicのIntegerは何故か2バイトだったなあ
javaもあと20年くらいしたら、なぜかintが32bitとか言われてるかもしれない。
>>897 それはプロセッサの問題じゃなくてコンパイラの実装の問題
標準では最大値がそれ以上(2^16-1)ならよい事になっている
gccなら32bitプロセッサでも 2^32-1が最大値のはず
ja.efreedom.comってサイトなんなの?
>>902 google先生でヒットするやつだろ
あれウザイよなjj
すげーうざいよね
-site:hogeをくっつけてgoogleにリダイレクトするサービス始めたら使う?
無駄
googleの検索設定に常に除外するサイトが欲しいわ
自分でフィルターかませばいいじゃん
POD型についてなんですが、 >>memcpyなどでメモリを直にいじってコピーしたりして問題のない オブジェクトのこと とありますが、別に仮想関数テーブルさえなければコンストラクタを持っていても問題ないと思うのですが
struct hoge { int id; hoge(void) { id = getUniqID(); } hoge(hoge const & other) { id = getUniqID(); } hoge & operator = (hoge const & other) { return *this; } }; これでmemcpyしたら死人がでてもおかしくないよ
912 :
デフォルトの名無しさん :2010/11/27(土) 01:30:58
C++プログラマの皆さんは、今どきリスト内包表現のすら無い言語を使って恥ずかしくなったりしませんか?
恥ずかしいとか恥ずかしくないなんていう得にも損にもならない理由で言語を選ぶ方が恥ずかしい
下を向いたら禿が丸見えになってもっと恥ずかしくなるだろ
>>916 thisのアドレスが変わってしまうだろうが
全く問題ないからmemcpy使っていいよ
>>910 あんたの言うとおりなわけで、今度の規格改定(C++0x)でそこらへんの定義が変わって、
memcpyできるクラスの制限が緩くなる。
c++0x pod memcpyあたりでググってみればいい。
PODの定義は変わるがmemcpyできるクラスの制限はとくに緩くはならない 別の言い方をするなら 「memcpyなどでメモリを直にいじってコピーしたりして問題のない オブジェクトのこと」 っていうのが不正確
ぶっちゃけ余計な事はするな、と言いたいな。良く知らないけど。 オブジェクトはコピーするな。コピーは構造体まででいいじゃん。
いやコピーしろよ
人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人 < オブジェクトのコピーはやめよう。とにかくコピーは構造体まででいいじゃん。 > YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
いや、普通に代入するかstd::copyでいいだろ。オブジェクトだろうと構造体だろうと。
VCでOutputDebugStringを使わずに、 デバッガ出力画面に文字列を出力する方法はありますか?
927 :
926 :2010/11/28(日) 00:11:25
あちこちで<windows.h>をinlcudeするのが嫌なのが理由です
トレース
ラップすれば良いじゃん
930 :
926 :2010/11/28(日) 00:20:59
>>929 ありがとうございます
あ、普通に考えてそうですよね
なんでこの考えにいたらなかったのか俺
むしろリリースビルドでも出力しちゃう OutputDebugStringさんをどうにかしたい
ブレーク貼るのが不得手になるリリースビルドでバグったときに、表示が抑制されてたら困りそうだが。
ふとわき出た疑問なのですが、質問よろしいでしょうか? 現在C/C++などを勉強し始めたばかりの学生です。 最近ポインタ周りを勉強していてふと思ったのですが ポインタは変数のアドレス先を保存すると書かれてそれで納得していたのですが、 何故(INT*)などのINTのように型の宣言が必要なのでしょうか? 当たり前な事なのかもしれないですが、よろしければご教授いただけないでしょうか?
ああ、その質問は・・・
宣言いらないんじゃないの?と思う理由がききたい
そのポインターを使うとき型がわからないと困るじゃん
ポインタは変数のアドレス先を保存する ↓ だから、ポインターは変数を知っていると考えると。 *だけでいいと思う。 がきっと int* の疑問かな ポインターはメモリー上のアドレス値を持つ。 ↓ と考えれば、ポインターに型情報はない。 だから、アクセスするための型情報を宣言する−>int* 実際これが正しい。
ポインタはポインタ型じゃん
機械の扱うデータは内部的に1と0の羅列でしかありません なのでたとえば101010111101というデータがあったときに これを整数と解釈するのか実数と解釈するのかあるいはほかの形式のデータと解釈するのか 機械はアホなので迷ってしまいます そんなわけで型を機械に教えてあげないとだめなわけです
>934 実際、『型を決めていないポインタ』として、[void*]という型があるよ。 [intだと分かってる場合] int a=0, b=5; int *p = &b; a = *p + 3; [型情報がない場合] int a=0, b=5; void *p = &b; a = *(int*)p +3; みたいにいちいちキャストしなきゃいけないのが面倒で、最初から型情報をもってたほうが簡単。
942 :
デフォルトの名無しさん :2010/11/30(火) 23:52:12
>>934 int *a;
struct intx2 { int x, int y} *b;
とすると、コンパイラは、a++はint1個分、b++はint2個分アドレスを進めれば言いって分かる。
void *c;
だと、どれだけポインタを進めていいのか判らない。
サイズ情報とvoid*を含むクラスを作ればいいんじゃないの?
それを世間では車輪の再発明と言う
boost::anyのソースコードでも見てみろよ
素晴らしい流れだ。
++にはどんな意味があるの?
C++はCより1レベル進化してる
1レベルどころか全く別の言語になっちまってる Cの部分はほとんど残してるけどな
Cから一歩進んだように見えて成果物はCで作るのとあんま変わらないという
人もいる
C++でも書けるけど旧式だから非推奨なソースコードを入門書で積極的に教えてほしい 型キャストをC式で書くのが非推奨だって知ったのはC++勉強しはじめてから何年も経ってからだった
953 :
947 :2010/12/02(木) 01:33:40
C++なんだから、評価時にはまだインクリメントされてないわけで、 C==C++
>>952 stdio.hではなくcstdio
#ifdef __cplusplus を積極的に使う
mainのreturn 0;はいらない
C++になって複雑になった割には、できる事がCから増えていない
>>952 そういう常識的なことは Effective C++ に書いてあるんでは
>>956 だが、同じことを楽に安全にできることは物凄く増えた
覚えなければいけない常識が、それ以上に増えた。
言語上可能だが、やらない方が良い事がものすごく増えた
もうC言語でいいや
>957 書いてあったけど、EffectiveC++を発見できるのはたまたま見つけた奴だけだろ……
>>962 すごく有名な本だし、入門書読んで少しコーディングするようになったら
次に読む本って感じではない?俺はそういう印象持ってるけど
たまたま見つけるって程知られてないかなぁ
その前にネットで学習してれば気づくだろ
ネットで学習ねぇ
クラスhogeがあるとして vecotr<hoge*> *vec = new vector<hoge*>(); hoge hg1 = new hoge(); hoge hg2 = new hoge(); vec->puss_back(hg1); vec->puss_back(hg2); ってするとvecをclearしてもnewしたhogeがメモリリークするんだけど vec側から全てのhogeを解放することってできる?
ミスった hoge hg1 = new hoge(); hoge hg2 = new hoge(); じゃなくて hoge *hg1 = new hoge(); hoge *hg2 = new hoge(); ということで
オレ、STLつかいはじめたど素人だけど、vectorに つっこんだ時点ですべてコピーされてると思う。
>>966 std::vectorの替わりにboost::ptr_vectorを使えば解決する
>>966 for (int i = 0; i < (int)vec.size(); i++) {
delete vec[i];
}
vec.clear();
そうは言ってないだろう 後出し厨だな
フツーコンテナにぶち込むなら何かしらスマートポインタ使うだろ
そんなことないでしょう
スマポのが楽だけどいつもブルジョアマシンを使えるとはかぎらないし
unique_ptrにでもぶちこんでおけ
その辺に転がっているCore2のPC辺りでも普通にgcc4やiccが動くことを考えると、 スマートポインタを使うのに当たってブルジョアマシンは必要ないという事に成るな。
>>977 975 はハードの話じゃないんじゃないかな
開発環境を自分が常に選べるわけじゃない
STLコンテナ使ってスマポ使わない環境って何?
すまんが国家機密情報なのでな
この例でvector<vector<hoge>> *vec にしないのはなんでだ 理由はいろいろあるにしても
982 :
デフォルトの名無しさん :2010/12/04(土) 16:51:28
class C{ public: A a; int B(); }; C::C(){ a = 代入; } これだと代入で例外で止まってしまいます。 class C{ public: int B(); }; C::C(){ A a; a = 代入; } これだと行けます。何が問題でしょうか。
× C::C(){ ○ C::B(){ まちがえました
違いはAがメンバー変数かローカル変数かだけだが、
それで違いが出るはずはないので
>>982 の気づいてない何かがあるな。
というか例外メッセージぐらい張れ。
>vtable.free = free; このようなコードを見かけたのですが、関数に()を書かないと 関数のアドレスが渡されるのですか?
はい
989 :
982 :2010/12/05(日) 07:12:22
#include <windows.h> #include <mmsystem.h> class C_OpenWave { public: HMMIO hMmio; //ハンドル MMIOINFO mmioInfo; WAVEFORMATEX wFmt; //BufferDesk用 bool InitWave(); }; bool C_OpenWave::InitWave() { //ファイルオープン memset( &mmioInfo, 0, sizeof(MMIOINFO) ); mmioInfo.pchBuffer = (HPSTR)ファイルへのポインタ; mmioInfo.fccIOProc = FOURCC_MEM; mmioInfo.cchBuffer = sizeof(ファイルのサイズ); hMmio = mmioOpen(NULL, &mmioInfo, MMIO_ALLOCBUF | MMIO_READ); return true; }
990 :
982 :2010/12/05(日) 07:14:36
ファイルオープンの memset( &mmioInfo, 0, sizeof(MMIOINFO) ); ないし、 hMmio = mmioOpen(NULL, &mmioInfo, MMIO_ALLOCBUF | MMIO_READ); で test.exe の 0x004114f5 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xcccccccc に書き込み中にアクセス違反が発生しました。 と出ます。 ちなみに HMMIO hMmio; MMIOINFO mmioInfo; をローカル変数にするとエラーが出ません。
エラーが再現する最低限のコードを全部貼れ。できればcodepad辺りに。
MSVCのデバッグモードでコンパイルしたプログラムでは初期化していない ローカル変数は0xccccccccになる。
カタカナで書くと「フフフフフフフ」な
ゴゴゴゴゴゴゴゴ
995 :
982 :2010/12/05(日) 11:27:47
変数はコンストラクタで初期化してあります。
>>990 初期化されてないポインタ変数を渡してるんだろ
どうせそんなところだ。
>>995 エラーメッセージは未初期化のポインタを参照したといっている。
これ以上の質問は「未初期化のポインタをどこで使っているか分らないので、
ソースみて指摘してくれ」に他ならない。
それでも質問したいなら、全ソース何処かにうpしろ。
コンテナに基底クラスのポインタ入れて使うときにダウンキャストするのは良くない設計?
キミ、ダウンキャストっていいたいだけでしょ。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。