【初心者歓迎】C/C++室 Ver.64【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/02/10(火) 00:25:51ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.63【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1231499251/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
0232デフォルトの名無しさん
2009/03/01(日) 20:38:29メモリのサイズを入れる型ってsize_t以外になんかなかった?
0233デフォルトの名無しさん
2009/03/01(日) 20:50:58専門的にお願いします。
0234デフォルトの名無しさん
2009/03/01(日) 20:55:57反復も繰り返しだろうけど、お前は違い分からないだろう
0235デフォルトの名無しさん
2009/03/01(日) 21:26:000236デフォルトの名無しさん
2009/03/01(日) 21:29:11もうちょっとかっこいい言い方あるだろ
それを教えろ
0237デフォルトの名無しさん
2009/03/01(日) 21:31:09死ねハゲ
0238デフォルトの名無しさん
2009/03/01(日) 21:31:470239デフォルトの名無しさん
2009/03/01(日) 21:47:200240デフォルトの名無しさん
2009/03/01(日) 22:14:30見事な繰り返し処理
>>232は空気嫁
0241デフォルトの名無しさん
2009/03/01(日) 22:19:39ssize_tとか、でもCでもC++でも標準ではないけど。
0242デフォルトの名無しさん
2009/03/01(日) 22:24:27ptrdiff_tのこと?ポインタ同士の引き算の型だからちょっと違うが
0243デフォルトの名無しさん
2009/03/01(日) 22:34:14そうだな。size_tでよかった。
0244デフォルトの名無しさん
2009/03/03(火) 05:50:11ボタンを押したら実行するようにしたいので
ShellExecute(Handle,"open",ファイル名.c_str,NULL,NULL,SW_SHOW);
と書いたのですが、うまくいきません・・・どなたか教えてくださいOTL
0245デフォルトの名無しさん
2009/03/03(火) 06:13:52何故、どう巧くいかないのか書かないのですか?
0246デフォルトの名無しさん
2009/03/03(火) 06:28:56バッチファイルの中身自体が実行されません;;
0247デフォルトの名無しさん
2009/03/03(火) 06:39:59pause
入れとけ
0248デフォルトの名無しさん
2009/03/03(火) 07:00:46ありがとうございます。
やってみたところ指定されたパスがありませんとのことでした。
普通にbatファイルを起動すると何も問題がないのですが・・・
原因などわからないでしょうか?
0249デフォルトの名無しさん
2009/03/03(火) 07:08:140250デフォルトの名無しさん
2009/03/03(火) 07:12:19こんな時間に、質問に答えてくださりありがとうございました
大変助かりました。
0251デフォルトの名無しさん
2009/03/03(火) 18:34:32入っている場合もポインタの宣言なんでしょうか?
static unsigned int * ADDR;
スペースが、後だけのもは参考書にも紹介されていますが
前後両方ともスペースのものは見つかりませんでした。
よろしくお願いいたします。
0252デフォルトの名無しさん
2009/03/03(火) 19:01:490253デフォルトの名無しさん
2009/03/03(火) 19:06:04おんなじ。空白類がいくらあろうと関係ない。
0254デフォルトの名無しさん
2009/03/03(火) 19:47:28static unsigned int * ADDR;
全くこのままのコードです。
>>253
ご回答有難う御座いました。
もやもやしていましたが、これですっきりしました。
0255デフォルトの名無しさん
2009/03/04(水) 03:11:45Void Func(LPCSTR pMsg);
みたいな関数があって、ここに文字列を渡すのですが、
Func("xxx");
というように普通に書くと問題ないのですが、
Func(_T("xxx"));
とやると、
const wchar_t[3] から LPCSTRに変換できません、みたいなエラーが出ます。
全ての文字列を_T("") で括ればいいのかと思ってたのですが、違うのでしょうか?
0256デフォルトの名無しさん
2009/03/04(水) 03:14:42_Tで括るのはLPC"T"STRのとき。
LPCSTRはconst char*のtypedefだから_Tは要らない。
0257デフォルトの名無しさん
2009/03/04(水) 03:25:58なるほど、ありがとうございました。
0258デフォルトの名無しさん
2009/03/04(水) 13:36:24すでに宣言してある配列の配列数を求めて
それと同じ配列数の配列を宣言するには
どうすればいいですか?
よろしくお願いします。
0259デフォルトの名無しさん
2009/03/04(水) 13:39:38配列数はプログラム書いた人しか知らないから無理
それができたら配列のオーバーフロー管理も楽なんだけど
0260デフォルトの名無しさん
2009/03/04(水) 13:44:40状況がよくわからん
0261259
2009/03/04(水) 13:44:42でいいか
マクロで定義して同じマクロ使うとか
0262デフォルトの名無しさん
2009/03/04(水) 13:49:06char b[sizeof(a)];
int c[(sizeof(a)-1+sizeof(int))/sizeof(int)]
0263258
2009/03/04(水) 13:53:28int a[]= {1,2,...};
size=sizeof(a)/sizeof(a[0]);
int b[size];
として同じ配列数の新しい配列を宣言しようとしてもできません。
0264デフォルトの名無しさん
2009/03/04(水) 13:56:39Cなら int b[sizeof(a)]
0265デフォルトの名無しさん
2009/03/04(水) 13:57:14size の型は何か
言語をいえ言語を
C か C++どっちだ
あとCならC89かC99なのか
0266デフォルトの名無しさん
2009/03/04(水) 13:57:33コンパイラも
0267デフォルトの名無しさん
2009/03/04(水) 14:03:12C++です。
size の型はintです
>>266
gccです。
0268258
2009/03/04(水) 14:08:43int b[size];
として宣言できました。
ありがとうございました。
0269デフォルトの名無しさん
2009/03/04(水) 15:03:270270デフォルトの名無しさん
2009/03/04(水) 15:30:51C99だろ
0271デフォルトの名無しさん
2009/03/04(水) 17:19:240272デフォルトの名無しさん
2009/03/04(水) 17:20:51標準にはない
標準じゃなくていいならある
0273デフォルトの名無しさん
2009/03/05(木) 09:53:350274デフォルトの名無しさん
2009/03/05(木) 10:11:11結果としてabort()
_ASSERTはVC++独自
_CrtSetReportMode等で動作の調整が可能
0275デフォルトの名無しさん
2009/03/05(木) 18:14:15取得はCxxx::&funcでなく&Cxxx::funcなの?
&がなんで宣言の時の*の位置より移動するの?
0276デフォルトの名無しさん
2009/03/05(木) 18:40:47発想としては、Cxxx::という修飾が
メンバへのポインタ型では*にかかっていて、
メンバへのポインタを得るときには、メンバ名funcにかかっている
ということのようだ。
0277デフォルトの名無しさん
2009/03/05(木) 18:51:32なんでCxxx::&funcなの?
どこのクラスのメンバ関数のアドレスか分からんが
0278デフォルトの名無しさん
2009/03/05(木) 20:41:28さっぱりわからん
0279デフォルトの名無しさん
2009/03/05(木) 20:43:44何が分からないんだかさっぱり分からないぞ
0280デフォルトの名無しさん
2009/03/05(木) 20:44:43単に文法的な曖昧さを除いた結果そうなっただけ。
class A {
public:
static void (*A::func)();
};
としてしまうと、static メンバ変数の実体定義がこうなってしまう。
void (*A::A::func)();
どっちがどっちの A:: やら分からん。
0281デフォルトの名無しさん
2009/03/05(木) 21:16:460282デフォルトの名無しさん
2009/03/05(木) 22:09:090283デフォルトの名無しさん
2009/03/05(木) 22:41:190284デフォルトの名無しさん
2009/03/06(金) 01:31:130285276
2009/03/06(金) 19:49:52すみません、レス読んでも、それが
取得はCxxx::&funcでなく&Cxxx::funcなの?
の回答になるのか、さっぱり理解できないですが><
あと、&Cxxx::funcは&(Cxxx::func)としては良くないと本に書いてあるんですが
なんで良くないんですか?
0286デフォルトの名無しさん
2009/03/06(金) 20:12:15派生クラスは無いのですが
その派生クラスの無い抽象クラスが型な引数をとる関数を使いたいのですが初期化?の方法がわかりません
0287デフォルトの名無しさん
2009/03/06(金) 20:16:31まずは、その抽象クラスへのポインタ型か参照型を引数にしている?
0288デフォルトの名無しさん
2009/03/06(金) 20:24:22ポインタ型を宣言してます、いろいろ上手くいかなかったのでポインタで宣言、元の抽象型で宣言、アドレスをポインタ型に代入→引数に
としてます、エラーメッセージはメンバが抽象型です、宣言を確認してください、です
0289デフォルトの名無しさん
2009/03/06(金) 20:27:48派生クラスがない、ではなく、派生クラスは自分で作れということでは?
0290デフォルトの名無しさん
2009/03/06(金) 20:29:590291デフォルトの名無しさん
2009/03/06(金) 20:43:25これ、抽象クラスのインターフェイスを使って新しいクラスを作れということ
0292デフォルトの名無しさん
2009/03/06(金) 20:56:180293デフォルトの名無しさん
2009/03/06(金) 22:13:20普通の関数でも&(func)はよくないだろ?
そういうこと
0294デフォルトの名無しさん
2009/03/06(金) 22:51:58普通の関数で、&funcを&(func)にするとコンパイルエラーにでもなるのか?
>>280 のvoid (*A::func)(); は何を宣言しているんだ?
本人はメンバー関数へのポインタ宣言のつもりなのかな
これだと、俺俺的にはfuncはスコープAにあり、引数void型で戻り型voidの関数を指すポインタの宣言してると解釈するんだが
つまり、funcは引数void型で戻り型voidの関数ならA::以外のでも受付OK
そうなると、funcはA::以外のでも受付OKなのにメンバー関数へのポインタ宣言ですって言えないよな
そうなるから、*Cxx::じゃなく、Cxx::*をメンバーへのポインタ宣言としているだろ
俺俺解釈間違ってる?
0295デフォルトの名無しさん
2009/03/06(金) 23:05:45関数は式中に現れると関数ポインタに暗黙変換される
だから(func)はfunc関数へのポインタで、&(func)はそのポインタのアドレスになる
つまり関数ポインタへのポインタになる
そして(func)は右辺値だから、そんなものを使うとろくなことにならない
一方&funcは、関数が単項&演算子のオペランドの場合は関数ポインタに変換されないと特別に決まってるから
無事にfuncへのポインタが取れる
と、思ってたんだがよくよく読むと()の中身が関数の場合は特別に()を外しても関数になると決まっているらしい
だから&funcも&(func)も全く一緒だ
すまん
0296デフォルトの名無しさん
2009/03/07(土) 23:59:08C言語の参考書などには「グローバル変数は初期化をしなくてもはじめから0が入る」
と書かれていたので今まで特に初期化処理を追加せずに書いてきたのですが、
プログラムの途中でグローバル変数を初期化(中身を全て0にする)処理を入れる必要が出たので
//EDIT_DATAは構造体配列で事前にDATA EDIT_DATA[16][64][34][64]と宣言しています。
memset(EDIT_DATA, 0, sizeof(EDIT_DATA));
という処理を加えたところ途端にメモリの使用量が跳ね上がりました。
最初から0が入っているのであれば、新たに0を入れ直してもメモリの使用量はかわらないと思ったのですが、どうやら違うようなので
いったい初期化処理を行っていない宣言した直後のグローバル変数と
memsetを利用し初期化処理を行ったグローバル変数では何が違うのかを教えて頂きたいです。
0297デフォルトの名無しさん
2009/03/08(日) 00:16:13書き込みが起こるまでは非初期化データ領域(BSS等と呼ばれる)には
アドレスを割り当てるだけで物理メモリは割り当てない仕様になっているから。
0298デフォルトの名無しさん
2009/03/08(日) 01:38:45私の知識不足で非初期化データ領域や物理メモリと言われても、ぱっと理解できなかったのですが
以下のような考えでよいのでしょうか?
私の使っているOS(WinsowsXP)の場合
・関数内で宣言するローカル変数の場合
void main(){
int a; //この時点で非初期化データ領域に変数aの存在が知らされる。
printf("%d\n", a); //この時点では値を代入したわけではないので何が表示されるか分からない(物理メモリにはaが存在しないのでメモリの使用量は増えない)
a = 0; //値が代入された(これによりaには0という値が存在するということになり物理メモリに割り当てられメモリの使用量が増える)
printf("%d\n", a); //0が表示される(物理メモリにはaが存在する)
}
・関数外で宣言するグローバル変数の場合
int b; //この時点で非初期化データ領域に変数bの存在が知らされる。
void main(){
printf("%d\n", b); //0が表示される(物理メモリに割り当てられているわけではないがグローバル変数なので特別にbは0として扱える)
b = 0; //値が代入された(これによりbには0の値が存在するということになり物理メモリに割り当てられメモリの使用量が増える)
printf("%d\n", b); //0が表示される(物理メモリにはbが存在する)
}
0299デフォルトの名無しさん
2009/03/08(日) 06:38:13とりあえず環境依存の話だというのは認識しておいてくれ。
まずローカル変数とグローバル変数では確保されるメモリ領域が異なる。
ローカル変数は BSS には確保されない(スタックに確保される)。
非初期化データ領域への割り当てはコンパイラ、リンカによって行われるので実行時に
「知らされる」という表現はおかしい。
物理メモリの割り当ては OS、ローダが行う。
恐らく、書き込みじゃなくて読み込みでも物理メモリへの割り当ては発生すると思われる。
なので memset じゃなくてループで全領域に対してアクセスしてもメモリ使用量は増えないか?
「仮想記憶」でぐぐるといいと思う。
0300デフォルトの名無しさん
2009/03/08(日) 08:00:03void fn_nul(int){};
if(a){ fn(a);}
と
static void (*const_f[2])(int) = {fn, fn_nul};
f[(a>>3)&0x1](a);
どっちが効率いいかな?
0302デフォルトの名無しさん
2009/03/08(日) 08:08:17やはり知識不足で具体的には理解できておらず、考えを上手く文字にまとめる事ができませんでしたが
ぐぐりつつ調べてみた結果、何となくではありますがイメージすることができました。
仰るとおりfor文でアクセスした結果もmemsetした際と同じ結果になりました。
もう少し時間をかけてじっくりと理解を深めていこうかと思います。
ありがとうございました。
0303デフォルトの名無しさん
2009/03/08(日) 10:23:48俺は「はじめて読む486」という本が参考になった。
0304デフォルトの名無しさん
2009/03/08(日) 10:46:03下の方が効率いい。
ただし、何かコメントしておかないと
可読性が低い。
0305デフォルトの名無しさん
2009/03/08(日) 17:01:16CPUじゃなくOS
0306デフォルトの名無しさん
2009/03/08(日) 19:10:521つはサウンドバッファ書き込み用のCALLBACK関数で、
もう一つはMAINスレッドにあるリードルーチン。
MAINスレッドにあるリードルーチンをある条件時に寝かせ、
CALLBACK関数側から寝てる状態を起こしたい処理なのですが、
何か良い方法ありますでしょうか?
sigwait()を使ってできそうなんだが、通常処理なので
signalは使いたくないのです。よろしくお願いします。
0307デフォルトの名無しさん
2009/03/08(日) 19:12:40環境依存なので利用環境を書いてね
0308デフォルトの名無しさん
2009/03/08(日) 19:31:42環境:linux. gcc version 4.3.2 ,SDL(Callback)
マルチスレッドではないのですが、CallBack関数側から、
MAINスレッドの寝ている状態を起こせないものかと、、、
MAINスレッドでやっている処理は、標準入力から
データ読み込み、固定領域にバッファリングしています。
バッファが一杯だったら、標準入力からの読み込みは
しないで寝かせたいのです。(BusyWaitやポーリングはNG)
gdk_input_addとgtk_mainの組み合わせで
とりあえずできたのですが、gtkを使うのは目的外かと、
よろしくお願いします。
0309デフォルトの名無しさん
2009/03/08(日) 20:08:54pthread.h を覗いてみては?
pthread_cond_??? あたりでいけそう
0310デフォルトの名無しさん
2009/03/08(日) 21:11:29サンクスです。チューw
pthread_cond_wait(&cond,&mutex);
pthread_cond_signal(&cond);
上記で実装しました。動作OKでした。
mutexの使い方は良く判りませんがこれから理解しておきます。
CPUもビジーウェイトにはなっていないのでOKです。ありがとうございました。
(DIONは書き込み規制はいってるの?)
0311デフォルトの名無しさん
2009/03/09(月) 03:45:12(ただのパクリですが・・・もちろん勉強のためです)
CStatic : public CWindow {
public:
CStatic(HWND hWnd) : CWindow(hWnd) {}
CStatic& operator=(HWND hWnd) { m_hWnd = hWnd; return *this; }
...
};
CStatic text = GetDlgItem(IDC_STATIC); // CWindow型を返す
などのCStaticコンストラクタの初期化がコンパイル通りません。
>error C2679: 二項演算子 '=' : 型 'class CWindow' の右オペランドを扱う演算子は定義されていません。(または変換できません)
考えてみれば派生クラスに基底クラス代入しようとしてるので当然の結果だと思うのですが
ATL/WTLではこれが上手くいっているのは何故なんでしょうか?
ATL/WTL見たことある方で分かられる方があればご教示ください。
0312デフォルトの名無しさん
2009/03/09(月) 04:09:36それ以前にこれ間違ってね?
0313デフォルトの名無しさん
2009/03/09(月) 04:16:54レスありがとうございます。
WTLのをそのまま流用したつもりでしたが;
どこが間違ってるのでしょうか?戻り値の参照ですか?
0314デフォルトの名無しさん
2009/03/09(月) 04:27:45CStatic text = GetDlgItem(IDC_STATIC); // CWindow型を返す
これに当てはまるoperator=が無いじゃん
0315デフォルトの名無しさん
2009/03/09(月) 04:47:48すみません、そもそもoperator=は今回関係ないみたいです。
コンストラクタの初期化で
CStatic text(GetDlgItem(IDC_STATIC));
CStatic text = GetDlgItem(IDC_STATIC);
上の2つは同じという認識だったのですが上だけコンパイル通ります;
CWindowでは operator HWND() const { return m_hWnd; } を持ってるので初期化構文でこれが適用されるかと期待したのですが。
0316デフォルトの名無しさん
2009/03/09(月) 10:11:14IDC_STATICは-1でdefineされていて、こういう場面で使えないと思うけど。
0317デフォルトの名無しさん
2009/03/09(月) 19:02:57遅くなりすみません。実際は違う値(オリジナルの値)です。すみません。
例えばATL/WTL解説で有名な↓ここ
http://home.att.ne.jp/banana/akatsuki/doc/atlwtl2/stdctrl05/index.html
では CStatic view = GetDlgItem(IDC_STATIC_VIEW); としておられます。
0318デフォルトの名無しさん
2009/03/09(月) 20:03:55コンストラクタにexplicit付いてんじゃねぇの
0319デフォルトの名無しさん
2009/03/09(月) 20:49:52explicitは付けていません。変換コンストラクタについてもっと勉強が必要でしょうか;
試しに簡易コードで再現してみました。皆さんの環境ではコンパイル通りますでしょうか?
class A { // 基底クラス
public:
DWORD_PTR a; // データメンバ
operator DWORD_PTR() { return a; }
A(DWORD_PTR x = 0) : a(x) {} // コンストラクタ
A getData() { return A(a); } // 自クラスでキャスト
};
class B : public A { // 派生クラス
public:
B(DWORD_PTR x = 0) : A(x) {} // コンストラクタ
B& operator=(DWORD_PTR x) { a = x; return *this; }
};
A aaa;
B bbb = aaa.getData(); // NG
bbb = aaa.getData(); // OK
それともこの再現自体が間違ってるのでしょうか・・・?
0320デフォルトの名無しさん
2009/03/09(月) 20:53:33class A に A(a)のコンストラクタは付けないの?
0321デフォルトの名無しさん
2009/03/09(月) 21:06:28VC2008EEで通ったけど
0322デフォルトの名無しさん
2009/03/09(月) 21:42:540323デフォルトの名無しさん
2009/03/09(月) 21:59:40C++で、ヘッダに書いたクラスの宣言の中にあるstatic constなメンバ構造体、
メンバ配列についてお行儀のよい書き方を教えてください。
メンバ構造体の初期化値(たとえば、文字列 "hogehoge" や 10 や 20 といった値)は、cppで持つとして、
文字列や値は同様にメンバ変数として持つのか? それとも、
cppの上の方に無名空間で切った変数を新たに宣言するのか?
そもそも前提条件のstatic constな値を持つメンバ構造体や配列は、クラスに持たないで
cppの上の方に無名空間で値を作って、ポインタかなんかで受けるのが正しいのか?
ちょっと、わからないので教えてください。
0324デフォルトの名無しさん
2009/03/09(月) 22:34:420325323
2009/03/09(月) 22:42:56<hoge.h>
class CHoge {
public:
CHoge(){}
~CHoge(){}
private:
enum { END = 10 };
static const int Array[END];
};
<hoge.cpp>
const int CHoge::Array[END] = {
0,1,2,3,4,5,6,7,8,9 //!< ←ここの値をどのように書くとお行儀がいいか?
};
>>324
レスありがとうございます。
その場合、マジックナンバなどはどこに宣言してありますか?
0326デフォルトの名無しさん
2009/03/09(月) 22:52:04そのまま数値書いてコメント付けとけばいいんじゃねぇの。
その値をどういう意味があって、どう使うかわからんから
ケースバイケースとしか言いようが無いと思うけど。
0327323
2009/03/09(月) 23:05:52ケースバイケースについて質問なんですが、ユーザーインターフェイスを作成するときにボタンがあったとします。
ボタンに表示する文字列とか,ボタンのサイズを持つ構造体配列を作ると
その構造体配列自体で、共通する値が出てきます。
<hoge.h>
class CHoge {
public:
CHoge(){}
~CHoge(){}
private:
enum { END = 3 };
struct BTN_TAG {
int X;
int Y;
int W;
int H;
char *Str;
};
static const BTN_TAG m_BTN[END];
};
<hoge.cpp>
const CHoge::BTN_TAG CHoge::m_BTN[END] = {
{ 100, 200, 200, 50, "ボタン1" }, //!< ここら辺の100とかの値
{ 100, 300, 200, 50, "ボタン2" },
{ 100, 400, 200, 50, "ボタン3" },
};
こういう場合は、どのようにするのがお行儀がいいでしょうか?
0328デフォルトの名無しさん
2009/03/09(月) 23:14:020329デフォルトの名無しさん
2009/03/09(月) 23:26:46そのまま100でいいんじゃないかなぁ。
200と50がデフォルトのボタン幅・高さとかだったり
頻繁に調整する必要があるなら、無名名前空間にでも定数作ればいいと思う。
でもまぁ俺だったら、UIの情報はプログラム中に書かず
リソースや外部ファイルに書いて実行時に読み込むけど。
0330デフォルトの名無しさん
2009/03/09(月) 23:27:48返信ありがとうございます。
リージョン固定というのを不勉強で知らないのですが、
CHogeからのみ参照できる、statc constだらけのクラスと考えれば
いいでしょうか?
0331デフォルトの名無しさん
2009/03/09(月) 23:35:33static struct{int x, y; char *c;}m_BTN[3];
}
追い出すメリットが勝つるメンバは追い出す。
■ このスレッドは過去ログ倉庫に格納されています