スレを勃てるまでもないC/C++の質問はここで 15
2 :
デフォルトの名無しさん :2010/05/09(日) 10:34:37
おまいら janeの隠し機能を発見したぞ! 1.まず半角入力に切り替える 2.Wキーを押しっぱなしにする 3.Wキを押しっぱなしにしながらsageのチェックするところをおもむろにクリック
3 :
デフォルトの名無しさん :2010/05/09(日) 14:15:16
何は vector、map 、iterator
複数の情報ひとまとめに定義する方法ってありませんか? 現状、 enum TEX_ID{ TEX_A, TEX_B, TEX_C, TEX_NUM } char* TexTbl[] = { ("tex/a.bmp"), ("tex/b.bmp"), ("tex/c.bmp"), } と、別々に定義して、 TexTbl[TEX_B] のように呼び出していますが、これだと2つの順番を意識的にあわせる必要があります。 そうではなく、 enum TEX_ID{ (TEX_A, ("tex/a.bmp")), (TEX_B, ("tex/b.bmp")), (TEX_C, ("tex/c.bmp")), TEX_NUM } のようにひとまとめにしたいのですが・・・(上のような記述はありえませんが)
5 :
4 :2010/05/09(日) 16:11:54
ちなみにこのTEX_IDは別のファイルからも読み込める前提でおねがいします
mapじゃダメなの?
揃えるだけなら初期化を諦めて代入すればいい。 ただ、色々犠牲になるけど。 C99なら要素番号を指定して初期化とかできるするけど これも同じく犠牲になるものはある。 両方に共通して言える犠牲は、全要素が初期化されてるか判断が面倒という点。 普通に配列を初期化すれば、要素数とTEX_NUMを比較するassertを書けば済む。 mapにするとこれは解決できるが、今度はコストが気になると思われる。 一旦mapで初期化して、配列に移す、とまでやれば大丈夫だろうが・・・。
8 :
4 :2010/05/09(日) 16:27:35
限りなくシンプルに登録、利用ができることを目的としています。 mapだと、 enum TEX_ID{ TEX_A, TEX_B, TEX_NUM } map<int, string> names; names.insert( map<int, string>::value_type( TEX_A, "a.bmp" ) ); names.insert( map<int, string>::value_type( TEX_B, "b.bmp" ) ); こんな感じになってしまい、利用する側は登録するときに enumと、insert部分の2箇所を記述する必要がでてきてしまいます。 TEX_AやTEX_Bのかわりに0や1を使ってdefineを取り除くと、 今度は利用するときにわかりにくいです。
コードを生成するといいよ
そういうクラスを作ればいいんじゃないの?
コードの自動生成くらいしか解決法はないと思われ
usingとかtypedef使えばいいじゃない
13 :
4 :2010/05/09(日) 16:59:49
>>9 〜
>>12 それらをどう使って、どういう形になるのかが想像できません(;´д`
struct MEDIA_INFO{
int id;
char* filename;
};
enum TEX_ID{
MEDIA_INFO(TEX_A, "a.bmp")
MEDIA_INFO(TEX_B, "b.bmp")
MEDIA_INFO(TEX_NUM, "")
};
TEX_ID aaa;
aaa[TEX_A].filename
うーん
data.h: MEDIA_INFO(TEX_A, "a.bmp") MEDIA_INFO(TEX_B, "b.bmp") MEDIA_INFO(TEX_NUM, "") media.h: enum TEX_ID{ #define MEDIA_INFO(a,b) a, #include "data.h" #undef MEDIA_INFO }; media.c: const char* TexTbl[] = { #define MEDIA_INFO(a,b) b, #include "data.h" #undef MEDIA_INFO };
なるほど それいいな
16 :
4 :2010/05/09(日) 18:26:07
ソートに最適なアルゴリズムってどうやって選べばいいんでしょうか Visual C++で開発していますが、JavaのLinkedListのような仕組みを使ったリストに ソートをかけたいです。 一度コピーでもしない限り、インデックス指定でリストにアクセス出来ないので、 使用できるアルゴリズムが限られそうです。データ型はfloatです。
std::sortでええやん
>>18 std::listにstd::sort()は使えない。
まぁ、std::listのメンバにsort()があるけど。
>>17 つーことで、先ずはstd::list<type> fooしてfoo.sort()だね。
プログラムというより算数の疑問なんですが…いまフィボナッチ数列作れってプログラム作ってて参考書どおりに書いたんですけど int fibonacci(int n) { if (n == 1 || n == 2) return 1; else return fibonacci(n - 1) + fibonacci(n - 2); } の結果が 1=1 2=1 3=2 4=3 5=5 ってなるのが分からんのですけど、n=3の時は3−1+3−2ですよね? nが−1で減るとして3−1+2−2とも考えたんですけどそれだと4の答えは4になるんじゃないでしょうか?
21 :
デフォルトの名無しさん :2010/05/10(月) 10:14:09
n = 3のときは fibonacci(3 - 1) + fibonacci(3 - 2) つまり fibonacci(2) + fibonacci(1) だから n=2とn=1 のときの結果を足し合わせるの それはどっちも1だろ?
まず関数の概念を理解すべきだな
>>21 速レス感謝です、if (n == 1 || n == 2) のリターン1が評価されてn(3)は1+1は2ということでしょうか?
そうすると4は3+1?だとやはり4になってしまうような?できれば4の場合も教えていただけないでしょうか
再帰って知ってるか?
25 :
デフォルトの名無しさん :2010/05/10(月) 10:54:57
>>21 n = 4のときは
fibonacci(4 - 1) + fibonacci(4 - 2)
で
fibonacci(3) + fibonacci(2)
だから
n=3のときの結果とn=2の時の結果を足すんだよ!
>>25 fibonacci(2)が1?で3+1?
そうすっと4=3てのは…
>>24 本の少し後ろの頁みたら解説してました
if (n == 0)
return 1;
else
return n* kaijo(n - 1); で4を入れると4*(3*(2*(1*1)))で24となるてやつでしょうか
これを
>>20 に当てはめろということでしょうか
このスレのアホな質問読んでると、自分が天才のように思えてくるわw
>>20 の出力を
fibonacci(1) == 1
fibonacci(2) == 1
fibonacci(3) == 2
fibonacci(4) == 3
fibonacci(5) == 5
と書けばわかるか?
fibonacci(4)
== fibonacci(3) + fibonacci(2)
== 2 + 1
== 3
>>28 4の一つ前のn(3)が=2だったからfibonacci(3)が2になるということでしょうか?
例えばfibonacci(6)だとfibonacci(5)+fibonacci(4)で5+3でfibonacci(6)=8
n( )て何の記号だ?
>>32 よくわかりました、正直フィボナッチの意味がわかってませんでした
ペラン数ぱねぇw
CreateFileでtxtファイルを作成してUnicodeの文字を書き込みましたが、作成したtxtでは文字化けして保存されました。 そのtxtの文字コードを メモ帳から文字コードをUnicodeに変更して保存しなおすと、Unicodeの文字を書き込むと表示できました。 手動ではなくプログラム中でtxtファイルの保存形式を指定したいのですがどうすれば良いのでしょうか?
36 :
デフォルトの名無しさん :2010/05/10(月) 13:16:50
BOMは書き込んでるか?
38 :
35 :2010/05/10(月) 13:43:12
>>36 特殊文字を記録したいのでUnicodeで保存しようと思ってます。
>>37 BOMって文字の前に付けて、その文字のコードを宣言するもので合ってましたっけ。
出力する文字はUnicodeで出ました。
CreateFileで作られたtxtがAnsiで保存されてるらしく駄目でした。
Unicodeで保存したファイルに出力するとOkでした。
メモ帳からAnsiでUnicodeを保存する時に「Unicodeの文字です。保存形式をUniCodeにしないとデータは失われます〜」
って表示がでたんで、Textファイル自体をUnicodeで保存させる設定がいるのかなと思いまして。
>>38 根本的に勘違いしてるみたいだな
テキストファイルに文字コードがなんであるかを記録する方法はない(エディタの方言としてはあるが)
読み取るソフトが内容から自分で判断してる
だから
>Textファイル自体をUnicodeで保存させる設定がいるのかなと思いまして。
そんな設定は無い、
>CreateFileで作られたtxtがAnsiで保存されてるらしく駄目でした。
これも勘違いだろうな、メモ帳で開いて保存する時のダイアログでAnsiだと思ったんだろ?
Unicode(UTF-16)だとBOM付けないと エディタは高確率でエンコード誤認するぞ。 C文字列にBOMは含まれないから、保存時にどうするかはプログラマの責任。
41 :
35 :2010/05/10(月) 15:05:43
>>39 メモ帳はBOMを見て文字を判断してる。メモ帳にUnicode貼り付け時
[メモ帳に元からあったデータ] 続いて [UnicodeのBOM(0xEF, 0xBB, 0xBF) 2byte×文字数]
でUnicodeを表現。
指定した文字コードで保存しようとすると、全ての文字のコードを一括変換してくる?
[File_Beginに保存形式のBOM 以下→?byte×メモ帳の文字数]
今までBOM無しのデータでもきちんと表示されていたのはCharだったから。
TcharならBOM付けないとエンコードに失敗するから駄目だって事でしょうか?
>>41 メモ帳で確認するのではなく、ファイルを1バイトずつダンプするツールで確認することも覚えましょう。
43 :
35 :2010/05/10(月) 16:00:16
>>42 確認してみた所、UnicodeのBOM(0xFF,0xFE) ANSIのBOM(無し) UTF-8のBOM(0xEF, 0xBB, 0xBF)でした。
BOMの記入後はちゃんと表示できました、ありがとうございます。
ペテン数
ペテン師
47 :
デフォルトの名無しさん :2010/05/10(月) 23:11:39
変数hogeの値を見て、10未満ならプラス1、それ以上なら10に設定する 普通に書くなら hoge = (hoge<10?hoge+1:10); だが、hogeを何度も書いてて冗長な気がする。 もっといい書き方ない?
普通に書くのがいいと思う。でも普通はこんなんじゃない? if (hoge < 10) hoge++; else hoge = 10; 1行にするとこうなる。でもこれじゃわかりづらい if (hoge++ >= 10) hoge = 10;
49 :
デフォルトの名無しさん :2010/05/11(火) 00:01:43
>>47 hoge = hoge-hoge*(hoge>=10)+(hoge<10)-(hoge<10)*(hoge>=10)+10*(hoge>=10);
>変数hogeの値を見て、10未満ならプラス1、それ以上なら10に設定する if (look(hoge) < 10) set(hoge, +1); else set(hoge, 10);
hoge = std::min(hoge + 1, 10);
52 :
デフォルトの名無しさん :2010/05/11(火) 00:20:08
(hoge++)<11||hoge=10;
53 :
デフォルトの名無しさん :2010/05/11(火) 07:39:09
>>53 そんな保守もへったくれもないようなコード、冗談だよな?
つーか、間違ってるじゃん。
55 :
デフォルトの名無しさん :2010/05/11(火) 09:16:40
自演だろ
++hoge > 10 || hoge = 10; で十分。 これがわかりにいくとかいう初心者の意見は聞かない。
こんなコードを書く奴と仕事したくない。
俺も初心者とは仕事したくない
perlだとそんな感じのコード書くなあ
unix系のシェルスクリプトなら、これが書けないと話にならない
|| を「命令文の後の or」の意味で「さもなければ」と読めばわかり易いよ
普通は制御構文とはみないで論理演算子とみるわな。 短絡評価が規格に明記されてる言語は多いけど、 論理演算子とみてるからこそ「短絡評価」という表現が使われる。
>>62 >普通は制御構文とはみないで論理演算子とみるわな。
普通なら論理演算子の評価で制御機能が働くことは重々承知してるはず
初心者は知らんが
hogeクラスでメンバ関数で引数にクラスを使う場合, hoge operator+(hoge&); のように宣言しているのはhogeクラスそのものを引数にしているということであってますか?
>>64 hogeクラスへの参照を引数としている
これが君の言っていることと同じかはこっちにはわからん
>>65 hoge hoge::operator+(hoge &h){
>>65 途中送信してしまいました
hoge hoge::operator+(hoge &h){
なんとかかんとか
}
こうゆうhへの参照という意味なのでしょうか?
宣言では型だけ書いているという意味で
>>67 引数の(型の)話しかしてないよ
引数の型がhogeへの参照だということ
日本語でOK
コンパイラVisualC++、OS VISTAでウィンドウズプログラミングをしているのですが、 あるプッシュボタンを押すとWM_KEY系を処理してくれなくなるバグが発生してしまいました。 ボタンを押す前はきちんと処理をしてくれるのですが、 ボタンを押すとその後メッセージボックスが表示されるまで キーを押しても反応しなってしまいます。(ほかのメニューなどはきちんと処理されているようです) ちなみにほかのボタンではこのような不具合は起こりませんでした。 どなたか、ご教授お願いいたします。
すみません。 C++言語でデストラクタを再起させても良いのでしょうか? 木構造の全ノードをデストラクタで開放したいです。
72 :
デフォルトの名無しさん :2010/05/12(水) 01:26:32
いいですよ。
73 :
71 :2010/05/12(水) 01:31:24
あーあ
別オブジェクトのデストラクタを呼ぶ形になるだけなら問題ない
thisもパラメータとして考えるとれっきとした再帰 まあ普通は再帰と言わないだろうけど 木構造で考えるとそうなってんだろうなあ、とは思うが
78 :
デフォルトの名無しさん :2010/05/12(水) 22:52:24
「〜だけなら」とか「〜として考えると」とかは一切なく、 デストラクタが直接にでも間接にでも自身を呼び出す再帰関数であって全く問題ない。
~A() 内で this->~A() は規格で違法なんじゃね? きちんと調べてないけど
ソケットプログラミングでおぬぬめの本はありますか。
>>79 うんだろうね。
規格は知らないけど、デストラクタの二重呼び出しという不正なコードになるね。
引数も無いから再帰の終了条件も無いし意味の無いコードだな。
規格を知らない奴がごちゃごちゃ言うなw
教授とか就職先の人とかに「君Cできる?」って聞かれたときに 「できますよ」って答えるにはどのくらいの知識が必要?
85 :
デフォルトの名無しさん :2010/05/15(土) 14:24:17
>>84 知識は関係ないよ。やる気を試しているだけ。
仕事が欲しくないなら「できません」って言えばいい。
>>85 >>84 はあれだよ。つまり『やらないか』って言われたんだと思うよ。
「はじめてだけど……がんばりますっ!」って言えば高ポイントだったに違いない。
ありすぎて困るw
一つ質問させてください。 あるオブジェクトを登録できる管理クラスを用意し、 オブジェクトを登録後、オブジェクトが削除されたら登録も 自動的に解除するという機能を入れようと考えています。 管理クラスからもオブジェクトメソッドにアクセスできるようにしたいのですが、 この場合単純に相互参照を使用するのが一番良い方法なのでしょうか? 現状ではこのような形を考えています。 class Child{ private: Controller* m_pController; // Controller::register時に入る public: ~Child(){ m_pController->unregister( this);} void setControllerPointer( Controller* pController){ m_pController = pController;} void update( void); // Controllerから呼びたい }; class Controller{ private: Child* m_pChild[6]; public: void redister( Child* pChild, unsigned int slot); void unredister( Child* pChild); }; よろしくお願いします。
>>88 相互参照は後々トラブルの元だから避けるのが一番良い方法。
登録解除でオブジェクトを削除にするのが無難。所有者をはっきりさせるように設計しよう。
俺も昔そういう構造を作ることもあったけど今は作らないようにしている。
質問です。 #include <iostream> #include <string> using namespace std; int main() { string org = string("org"); string org2 = string("org2"); string org3 = string("org3"); string &str = org; // コピーコンストラクタで初期化 string &str2 = org2;// コピーコンストラクタで初期化 string &str3(org3);// コピーコンストラクタで初期化 str2 = org; // コピー代入 str3 = org; // コピー代入 return 0; } コメントの理解で良いのでしょうか。 string &str2 = org2;がよくわかりません。
>>90 >// コピーコンストラクタで初期化
というのは3つとも全部間違い
参照をセットしているだけで、コンストラクタが呼び出されたりはしない
92 :
90 :2010/05/17(月) 20:55:29
>>91 とても勉強になりました。参照難しいです。
ありがとうございます。
>>89 ありがとうございます!
やはり方向ははっきりさせないとあかんのですね
9×9の2次元配列を3×3の小さなブロック9個で区切り左上から 0,1,2, 3,4,5, 6,7,8,と番号をつけるとします。 各番号のブロックにある数字を足し、1次元の配列にブロック内の数の合計を保存したいです。 以下のプログラムを書いた場合、1次元の配列の添え字を工夫すると簡単にプログラミングできる と聞いたのですが、どうしても思いつきません。アドバイスお願いします。 (i=0;i<10;i++) (j=0;j<10;j++) total[ここの添え字を工夫]=data[i][j]; totalを2次元配列にする方法は思いつくのですが、1次元に保存する方法がどうしてもわかりません。 よろしくお願いします。
数独?
96 :
デフォルトの名無しさん :2010/05/21(金) 00:05:07
int data[81]; int total[3][3]; for(n=0;n<3;n++) for(m=0;m<3;m++) for(j=0;i<9;i++) for(i=0;j<9;j++) total[n][m] = data[m*3+i + (n*3+j)*9];
for(i = 0; i < 9; i++) total[i] = 0; for(i = 0; i < 9; i++) for(j = 0; j < 9; j++) total[(i / 3) * 3 + j / 3] += data[i][j];
8つのCPUが動作している環境において、 GDBでのデバッグ時に各CPUのプロセスで set debug_flag2 = 0x00008040 set test_flag5 = 0x00802020 などとと入力したい。 これを8回も入力するのが大変なので 一つのCPUで入力すれば各CPUでも設定されるようにしたいのですが そういう処理って可能ですかね? (第一引数をデバッグフラグ名の文字列, 第二引数をフラグ値 のような関数を作成したい)
99 :
94 :2010/05/21(金) 23:02:14
>>96 +97
ありがとうございます。
もう少し大きいM×Nの配列で、p×qサイズごとの合計の値を調べるにはどうしたら良いでしょうか?
応用力皆無だな
101 :
デフォルトの名無しさん :2010/05/21(金) 23:43:35
>>99 int data[M*N];
int total[q][p];
int t,i,j,m,n;
for(n=0;n<N;n++)
for(m=0;m<M;m++) {
for(j=0;j<q;j++)
for(t=i=0;i<p;i++)
t = data[m*p+i + (n*q+j)*M];
total[n][m] = t;
}
Mはpの整数倍なのか? Nはqの整数倍なのか?
なにやってるか理解できれば、それをアレンジするだけだと思うんだが
まあ基本すらできなかったんだから応用なんて無理だね
105 :
94 :2010/05/22(土) 00:00:20
>>101 totalは1次元の配列で処理したいです。
>>102 Mはpの整数倍・Nはqの整数倍でおkです。
106 :
デフォルトの名無しさん :2010/05/22(土) 00:06:05
int data[M*N]; int total[q*p]; int t,i,j,m,n; for(n=0;n<N;n++) for(m=0;m<M;m++) { for(j=0;j<q;j++) for(t=i=0;i<p;i++) t = data[m*p+i + (n*q+j)*M]; total[n*M+m] = t; }
107 :
デフォルトの名無しさん :2010/05/22(土) 00:12:18
それ、授業中に3〜4行で書けるって言われたんじゃねぇの?
108 :
デフォルトの名無しさん :2010/05/22(土) 00:30:51
int data[M*N], total[q*p], n, t, i; for(n=0;n<M*N;total[n++] = t) for(t=i=0;i<p*q;i++, t=data[n%M*p+i%p + (n/M*q+i/p)*M]);
int i, j, data[M][N], total[(M/p)*(N/q)]; for(i=0; i<M; i++) for(j=0; j<M; j++) total[i/p*(N/q)+j/q] += data[i][j];
110 :
デフォルトの名無しさん :2010/05/22(土) 01:26:27
int data[M*N], total[q*p], n, t, i; for(i=0; i < M*N; i++) total[i/(M/p)%(M/p) + (i/M)/(N/q)*(M/p)] += data[i];
なんだろう、このアホは
そんなに悔しかったのか?
え?w
wwwww
>>109 >for(j=0; j<M; j++)
じゃなくてfor(j=0; j<N; j++) じゃね?
>>110 pとqを勘違いしてね?
あんなの質問してるやつに分かるわけないだろwwwwww
117 :
デフォルトの名無しさん :2010/05/22(土) 02:55:31
118 :
デフォルトの名無しさん :2010/05/22(土) 03:03:26
int data[M*N], total[q*p], n, t, i; for(i=0; i < M*N; i++) total[i/p%(M/p) + (i/M)/(N/q)*(M/p)] += data[i];
元は二次元配列なのに執拗にdata[M*N]に拘るのは病的だなw
>>117 pとqは小さなブロックのサイズなのに、total[q*p]じゃそうならないだろ
121 :
デフォルトの名無しさん :2010/05/22(土) 03:37:03
ああ、そうだな。
>>109 totalを0で埋めるか初期化しないとまともな結果にならんだろw
staticならすべて解決
標準の組み込み型って char 1byte 固定 short 2byte以上 long 4byte以上 short <= int <= long float 32bit 固定 double 64bit 固定 long double 80bit 固定 であってる?
規格の話なら char 1byte 固定 short <= int <= long しか合ってない 1byte >= 8bit short 最低でも-32767〜32767を表現可能 long 最低でも-2147483647〜2147483647を表現可能 float <= double <= long double 値の範囲は面倒くさいので略(最低でも表現でいないといけない指数とか桁数とかはある)
つまり、 char = short = int = long 1byte = 32bit でも規格合致
VC++限定にしても long double 64bit だしなあ。
g++は128bitだな 80bit分しか使ってないけどアラインメントの関係で DOS時代に使ってたTurbo C++は80bitだったと思う
>>128 >g++は128bitだな
-m96bit-long-double がデフォルトのこともある。環境によって異なる。
DLLとかLIBファイルってバイト長整数長少数モデルとかいちいち考えてやらないといけないの?めんどくさくね?
>>131 「totalを0で埋めるか初期化」するって書いてるだろw
コードかけよw
え? そんなコードも書いてもらわないと分からないの?!
自然言語で答えるだけならアホでも出来る。無駄レス。
137 :
デフォルトの名無しさん :2010/05/22(土) 19:26:57
まあ、アホには出来ないだろうが、ど素人でも出来る罠
宿題は自分で解こう
すみません、txtファイルに書いた2進数(10011101)をchar配列に保存しているのですが、 これをint型10進数(10011101 → 157)に直すシンプルな方法は無いでしょうか? 現状atoiで整数にしてから 10ずつ割りながら、整数で1の論理積を確認し、 別途1..2..4..8..と数値を足し合わせ作る手しか思い付かず。。 (※書き込み失敗したのか2度目の書き込みになります; もし別スレに誤爆しててマルチになってたらすみません;)
文字列を後ろから走査してn桁目が1なら1<<nを足す
特別便利な方法はないけど、普通にやれば十分では? main() { char buf[]="10011101"; char *p; int x = 0; for(p=buf; *p ; p++) { x *= 2; if(*p == '1') x+=1; } printf("x=%d\n", x); /* x=157 */ }
142 :
139 :2010/05/22(土) 22:25:44
>>140 ありがとうございます。ビットシフトでも良いのでしたね、記憶しておきます。
>>141 サンプルありがとうございます。
ポインタを使えばこうもシンプルに書けるのですね。 勉強になります。
2倍にする事でビットシフト同等の効果・・学んだ記憶が何とか蘇る程度でした。
とても勉強になりました。お2方、ありがとうございました。
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
int num[100][100],i,j; int X1[4][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}}; int X2[4][4]={{15,14,13,12},{11,10,9,8},{7,6,5,4},{3,2,1,0}}; int X3[4][4]=・・・・; int X4[4][4]=・・・・; for(i=0;i<100;i++) for(j=0;j<100;j++) num[i][j]+=X1[i%4][j%4]; この様なプログラムにおいて、X1〜X4を簡単に切り替える方法はありませんか? Xの配列は必要に応じて1〜4を選択したいのですが、プログラムで何カ所も使っているため、書き換えるのが非常に面倒です。 #define X "x1" として、X[i%4][j%4]としてみたのですが、予想通り無理でした。 1カ所書き換えるとすべてに適用されるような方法はありませんか?
145 :
デフォルトの名無しさん :2010/05/23(日) 21:40:06
int *x[4][4] = {X1, X2, X3, X4};
146 :
デフォルトの名無しさん :2010/05/23(日) 21:41:10
int x[][4][4] = {X1, X2, X3, X4};
#include <iostream> int main(void) { int x1[4][4]; int x2[4][4]; int x3[4][4]; int x4[4][4]; typedef int (*px_t)[4]; px_t x[] = {x1, x2, x3, x4}; x[0][1][2] = 100; std::cout << x1[1][2] << std::endl; return 0; } typedefなしで書く方法がわからんorz
int (*x)[4][4] = {x1, x2, x3, x4}; xはint型の[4][4]の配列へのポインタ
int (*x[])[4] = {x1, x2, x3, x4};
>>150 それでいいっぽいな
ただし配列名での初期化が出来るのはC++のみで、Cだとコンパイルエラーが出た
#include <iostream>
#include <iomanip>
int main(void)
{
int x1[][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};
int x2[][4] = {{17, 18, 19, 20}, {21, 22, 23, 24}, {25, 26, 27, 28}, {29, 30, 31, 32}};
int x3[][4] = {{33, 34, 35, 36}, {37, 38, 39, 40}, {41, 42, 43, 44}, {45, 46, 47, 48}};
int x4[][4] = {{49, 50, 51, 52}, {53, 54, 55, 56}, {57, 58, 59, 60}, {61, 62, 63, 64}};
int (*x[])[4] = {x1, x2, x3, x4};
int i, j, k;
for (k = 0; k < 4; k++) {
std::cout << "x = " << (k + 1) << '\n';
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++)
std::cout << std::setw(4) << x[k][i][j];
std::cout << std::endl;
}
}
}
Cだとわざわざこういう風に書かないとならん 面倒だな #include <stdio.h> int main(void) { int x1[][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}}; int x2[][4] = {{17, 18, 19, 20}, {21, 22, 23, 24}, {25, 26, 27, 28}, {29, 30, 31, 32}}; int x3[][4] = {{33, 34, 35, 36}, {37, 38, 39, 40}, {41, 42, 43, 44}, {45, 46, 47, 48}}; int x4[][4] = {{49, 50, 51, 52}, {53, 54, 55, 56}, {57, 58, 59, 60}, {61, 62, 63, 64}}; int (*x[4])[4]; int i, j, k; x[0] = x1; x[1] = x2; x[2] = x3; x[3] = x4; for (k = 0; k < 4; k++) { printf("x%d = \n", k + 1); for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) printf(" %3d", x[k][i][j]); putchar('\n'); } } return 0; }
>Cだとコンパイルエラーが出た 当たり前だ。 Cだと配列の要素には定数以外使えない。 実行時に決まるスタック上のアドレスや関数呼び出しの戻り値などは 配列を初期化する値に出来ない。
>>151 かしこいな!
こんな使い方があったのか
157 :
デフォルトの名無しさん :2010/05/24(月) 00:03:15
クラスの配列で 要素0内の複数のメンバ変数を要素1に複製したいときって 普通にmemcpyでOK?
>>157 条件によっては大丈夫な場合もあるけどまったく保証はされない。
>>157 Cならおk
C++なら、コピーするメンバ変数が組み込み型かPODならおk
ていうか a[1] = a[0]; でえーやん。 ディープコピーの問題だとかメモリ確保してた場合にどうだとかは 代入演算子をどうする(作る)かの問題だけど。
stl風にコンテナの中から絶対値が最大のモノを指すイテレータを探すにはどう書く? findだと最初のが見つかったら終わっちゃうよね あ、ちなみにソート済みコンテナではないです
162 :
デフォルトの名無しさん :2010/05/24(月) 22:14:18
質問です。Hoge という class が合ったとして、その配列の pointer を あるプログラムのheaderで以下のように定義して Hoge* h[2]; それをメインルーチンで以下のようにobject を指すようにしたとします。 h[0] = new Hoge("foo"); h[1] = new Hoge("bar"); そのときにデストラクタでは delete h[0]; delete h[1]; のように二回呼ばないといけませんか? それとも delete [] h; でいけるのでしょうか?何となく前者じゃないといけない気がするのですが。 よろしくお願いします。
163 :
デフォルトの名無しさん :2010/05/24(月) 22:17:08
2回呼ばないといけません。
VisualStudio2010でWIN32アプリケーションの勉強をしているのですが、 作った関数で戻り値に文字列を指定する事は出来るのでしょうか? 普通に LPWSTR CLASS(・・){ WCHAR str[100] 略 return str } とかやっても文字列は帰ってきませんし、他のサイトでは文字列を戻す関数作成のサンプルを見かけません。
>>162 delete[] h; は完全な間違いです。
未定義の動作ですから鼻から悪魔です。
166 :
デフォルトの名無しさん :2010/05/24(月) 22:31:22
>>164 ローカル変数を戻り値にしちゃだめだよ。
167 :
デフォルトの名無しさん :2010/05/24(月) 22:33:44
>>164 std::stringとかstd::wstring
>>164 文字列受け取りたい場合は
void GetStr( WCHAR* str, int size )
{
strに値をコピー
}
ってやったら?
170 :
デフォルトの名無しさん :2010/05/24(月) 23:32:38
#include <stdio.h> int main(void){ int n=1; float w,kei=0,heikin,max,min; while(1){ printf("%d件目のデータを入力してください-->",n); scanf("%f",&w); if(w==0) break; kei+=w; if(n==1){max=w;min=w;} if(w>max) max=w; if(w<min) min=w; n++; } heikin=kei/(n-1); printf("合計 :%.1f[kg]\n" "件数 :%d[件]\n" "平均値:%.1f[kg]\n" "最大値:%.1f[kg]最小値:%.1f[kg]\n",kei,n-1,max,min); return 0; } 最小値にループを抜けるための条件のW=0が代入されてしまいます breakでループを抜けたらその後の kei+=w; if(n==1){max=w;min=w;} if(w>max) max=w; if(w<min) min=w; の文は処理されないはずではないのですか?
171 :
デフォルトの名無しさん :2010/05/24(月) 23:33:52
浮動小数点と==は相性悪いよ
c言語の質問です。 main(void){ register int a[10], i; for(i = 0; i < 10; i++) scanf("%d", a[i]); } というようにレジスタ上の配列aに数値を読みこみたいのですが、 windowsのgccでコンパイルするとwarningが出てしまい、 配列aはレジスタ上に配置されずにメモリに配置されている予感がします これをレジスタ上に確保したままfor文で数値を読み込む方法はあるのでしょうか?
173 :
デフォルトの名無しさん :2010/05/24(月) 23:41:44
nをint型にしていてもダメなんですか?
174 :
デフォルトの名無しさん :2010/05/24(月) 23:42:30
175 :
デフォルトの名無しさん :2010/05/24(月) 23:48:46
breakするかどうかは、nでは決まらないよね?
>>166 JAVAのようには出来ないんですね どうもです。
177 :
デフォルトの名無しさん :2010/05/24(月) 23:50:41
>>175 あっ!そういうことですか。ありがとうございました_ _
178 :
デフォルトの名無しさん :2010/05/24(月) 23:51:19
>>172 お前がやりたい事は無理
そもそもレジスタを理解してないように見えるが
180 :
172 :2010/05/25(火) 04:56:04
>>178-179 ありがとうございます
最近学び始めたばかりでして知らないことが多すぎたようです
registerなんてキーワードは忘れてしまってよろしい
なんでboostは動的デリータ付きのスコポを用意しなかったんですか?
183 :
デフォルトの名無しさん :2010/05/25(火) 14:54:32
アメリカ人にとってのアルゴリズム辞典の定番の書籍って何がありますか?
AmericanCode第三版
現実に存在する本でお願いします。
186 :
デフォルトの名無しさん :2010/05/25(火) 18:16:33
187 :
デフォルトの名無しさん :2010/05/25(火) 23:39:09
C言語であるメモリアドレスを引数経由で返すような関数を定義する場合 int hoge( void ** ); といった定義をしたのですが、 char *fuga; hoge( &fuga ); だと、ポインタの方が違うとワーニング hoge( (void**)&fuga ); だと、strict aliasingのワーニングになってしまいます。 void **という引数指定をするのはおかしな事なのでしょうか? int hoge( void * ); という定義にするとなんだか意図が異なる関数のような int hoge( char * ); とポインタの型を決めてしまうのも意図が異なるような ・・・というあたりで行き詰まっています。
188 :
デフォルトの名無しさん :2010/05/26(水) 00:12:47
4.9: 参照呼び出しに使うため汎用のポインターを関数に渡すのに、 void **を使うことができるか。 A: 移植性まで考れば不可能である。C言語には汎用のポインターへのポ インター型は存在しない。void *が汎用のポインターとして振る舞う のは、他の型のポインターをvoid *に設定したり参照するときに、 自動的に変換が行われるからである。void *以外の何かを指している void **を使って間接参照しようとすると、この変換は実行できない (隠れた正しいポインターの型がわからない)。
.libファイルって作ったコンパイラ以外のコンパイラでも使えますか?
190 :
デフォルトの名無しさん :2010/05/26(水) 00:25:20
互換性があれば使えます。
>>188 と、いうことは汎用性をあきらめて特定の型のポインタのポインタとするか
ポインタは戻り値で返すように作るかしかないということでしょうか?
それともほかに常套手段のようなものがありますか?
192 :
デフォルトの名無しさん :2010/05/26(水) 00:28:45
void* hoge();
正直そこまで汎用性にこだわる理由が分からん
気にせず使え
void *p; f((void**)&p); char *fuga = (char*)p; てのはどうよ?
>>193 こだわるわけでもないですが
いい方法があるなら知りたい使いたいというわけで
ないのなら特に気にしないで適当に
>>195 確かにその方法ならキャスト不要ですが
わざわざそのためだけに別の変数を定義するのも・・・
って事で、気にしないことにします
template<class T, class U> T **pp_cast(U **pp) { return reinterpret_cast<T**>(pp); } char *p; f(pp_cast<void>(&p));
typedef struct _CELL{ char as_status; int x; int y; int cost; int heuristic; int score; }CELL; void SetScoreBubbleSort(const CELL*& node, CELL*& list){ int cnt(0); // ソート開始 while( ( node->cost > list[cnt].cost ) && ( list[cnt].cost != 0 ) ){ cnt++; } list[cnt] = *node; }//続く
// 続き int main(void){ // ---上・省略--- // 床セルのデータ生成(newの二次元配列) CELL** cell_floor; int cnt(0); int cnt2(0); cell_floor = new CELL* [CellWidth]; for(cnt=0; cnt<CellWidth; cnt++){ cell_floor[cnt] = new CELL[CellLength]; // Astarソート用セルリスト生成(ポインタ型) CELL** open_list; open_list = new CELL*[(CellWidth * CellLength)]; // ---途中・省略--- SetScoreBubbleSort(cell_floor[x][y], open_list);//★ここでコンパイルエラー // ---途中・省略--- // 床セルのデータの削除(deleteの二次元配列) for(cnt2=0; cnt2<CellLength; cnt2++){ delete[] cell_floor[cnt2]; } delete[] cell_floor; // Astarソート用セルリスト削除 delete[] open_list; } ってやってるんだけど、コンパイルするとerror C2664: 'SetScoreBubbleSort' : 1 番目の引数を 'CELL' から 'const CELL *&' に変換できません。って出るんだけどどうしたらいい?
&はどっから出てきたんだよ
&はSetScoreBubbleSortの関数の引数にポインタを渡したいから使ったんだけどマズイかな?
ポインタ渡すなら&cell_floor[x][y]
>>203 配列の形式でそのまま渡せばポインタの先頭アドレスが入ると思って&はつけてなかったけどつけてコンパイルしてみた。
そしたら「error C2664: 'SetScoreBubbleSort' : 1 番目の引数を 'CELL *__w64 ' から 'const CELL *&' に変換できません。」になった。
ポインタ受け取る方は const CELL * で
>>205 ポインタ受け取る方の参照演算子&を除いて
void SetScoreBubbleSort(const CELL* node, CELL* list)とし、
int main{}の中の部分は
SetScoreBubbleSort(&cell_floor[x][y], *open_list);
としたら一応、コンパイルエラーは取れた。
関数使うときにポインタ渡したいのに*つけるのは気が引けたけど、エラーになる。
関数が抜けたときにまともに値が反映されてるか禿げしく不安・・・。
>>206 引数として渡したいものが、
・CELL
・CELLへのポインタ
・CELLへのポインタのポインタ
の何れなのかをはっきりさせよう
>>207 引数として渡したいのは「cell_floorの先頭アドレス」と「open_listの先頭アドレス」です。
CELLは型名なので。
先頭アドレスならcell_floorだけでいいんじゃね
Cのポインタから勉強しなおしだな
すみません。引数として渡したいのは「cell_floorポインタ型配列の中のポインタ」の間違いです。
>>208 (先頭)アドレスというのは値のことであり、その値の型として
・CELLへのポインタ
・CELLへのポインタのポインタ
があるということ。
同じ値であっても型が違うんだよ。その変がよくわかってないんじゃないか。
SetScoreBubbleSort関数では、 1番目の引数の配列の中のポインタの先の値(2次元配列)を 2番目の引数の配列の中のポインタの先の値(1次元配列)と比較した後に 1番目の引数の配列の中のポインタを2番目の中にコピーしようとする意図があります。
214 :
199、200 :2010/05/27(木) 19:50:46
デバッグしてたらいくつもマズイ点を見つけたので出直してくるorz
Unix上のCで標準入力と標準出力をファイルとしてオープンする場合に "/dev/stdin", "/dev/stdout"と記述することができたと思いますが Windows上のC++(Visual C++ 2010 Express)ではどのように記述 すれば良いでしょうか?
// fprintf に標準出力したいなら、こうだ。 #include <stdio.h> main(){ // FILE *stdout; fprintf(stdout,"err"); }
>>216 一般のファイルの入出力用に書かれたプログラムをそのまま利用して
標準入出力の読み書きをするにはどうするの?という質問だと思う。
FILE *fp; if(1==0){ fp = fopen("/dev/stdin"); }else{ fp = stdin; } か、コメントにすればいいのではないか。例をw
fopen() で con は使えたっけ?
>>220 使えないって確認した?
>>215 Linux MS-DOS
/dev/stdin con
/dev/stdout con
/dev/null nul
のように対応するからやってみて。
>>216 「fprintfに標準出力」じゃ日本語が破綻している。
>>221 con は入力には使えるが出力には使えない
お前こそ試したことあるのか?
コンパイル環境がVC++ならok
224 :
221 :2010/05/28(金) 11:54:33
ないよ。だから、試してみてと書いている。 別に、「使えるに決まっているから>220は嘘だ」なんて書いていないから安心してね♥
221じゃないけど bcc5.82ではできた
>>215 環境依存せず stdout と stdin を使うのがいい
バカどもの発言には惑わされない方がいいよ
>>226 話がわからないのなら、無理に書かなくていいよ。
今は、「標準入出力の環境依存したデバイス名は何?」って話題だからね。
それとも、環境依存しないデバイス名が存在しているなんて妄想に囚われているのかい?
>>227 アンカー見てないの?
>>215 に対するレスだよ
お前が振ったくだらん話題には興味ないよ
自意識過剰にも程があるよ
conで開けるのは標準入出力ではなくコンソールだけどね Windows API の CreateFile で CONIN$ と CONOUT$ というのもある
誰と戦っているのだろう……
231 :
215 :2010/05/28(金) 15:23:44
fgets(buf, 256, stdin); で問題なく動きました。 ありがとうございました。
質問はオープンの仕方だったのにね
まあ、ファイルは開かないと読めないものという先入観があるのは しょうがないだろう。
え?
235 :
233 :2010/05/29(土) 01:02:34
いや、だからstdinというファイルハンドルが自動的に開いているという可能性を
知らなかったから
「標準入力をファイルとしてオープンする」という質問になっちゃったんでしょう。
>>231 結果的に欲しかったのはファイルハンドルだったから。
boostが使えない環境でスマポを自作しないといけないとして どの程度のレベルまで仕様とか実装を練りこむ?
>>236 理由が政治的かメモリサイズかによって違ってくるな。
ハードウェア的な問題ではない ただ、boostに不慣れな人がいてとりあえず今回はなしで、という感じ
>>238 その判断は今回だけではすまないし後々後を引く。スマポは後から導入が面倒だから今後も見送りになりやすいぞ。
スマポ作るならboost::shared_ptrかstd::tr1::shared_ptrのインターフェース互換にして後にusingで切り替えられるようにすることを勧める。
プロジェクトに必要なもの調べてそれだけ実装
Googleみたいにboostの一部だけを厳選して使用すればいい この場合の選定基準は理解が簡単でトレーニングの必要が少ないライブラリだけを許可することかな shared_ptrやoptionalとか、その辺の解説サイトを流し読みすれば理解できるでしょ
選定の結果、見事
>>236 の社内標準に採択されたprogress_displayであった。
shared_ptrはヘッダだけだし、boost展開した箇所にincludeパス張るだけなんだからってPM説得したほうが良さげ
shared_ptr使ってて修正を重ねるうちに 気が付かないうちに循環関係になっててメモリリークを引き起こしちゃって原因の判明に苦労したのだが もうこれは気をつける以外に対応がないものなのか?
>>244 デバッグ終了時にリークはレポートされるから、レポートされたときの版のコミットログ調べればすぐに特定できると思う。
循環参照が起きるパターンは限られてるんで、その場で対応すればいいと思うよ。
予想外の循環参照が起きるのは設計が悪いとしか言いようがない。たとえば参照の方向を一定にし、前方参照とshared_from_thisを使わない設計にすれば循環参照は自然に避けられる。
246 :
デフォルトの名無しさん :2010/05/30(日) 10:57:28
stdio.hをインクルードしなくても printf関数が使えるんですけどどういうことですか? 単なる警告なだけでエラーにならないのが不思議です。 本にはインクルードせよみたいに書いてあるのに じゃあ何のためにインクルードするの?って感じなんですが・・・。
Cの事なら、宣言されていない関数は 戻り値の型が int で、引数が (...) であるのと同じように解釈されて実行される。 だから、math.h をインクルードせずに sin(1) とかやると 変になる(int sin(int) であると解釈して実行されるので)など、 ちゃんとインクルードしないと意図しない動作を引き起こす恐れがあるので、 必ずインクルードすること。 (数学関数を特別視してちゃんとdoubleにしてくれるコンパイラもあるけど、 それはそのコンパイラ独自の仕様) C++なら文法エラー。
googleのコーディング規約の整数型の項目についてなんだけど これってコンテナのoperator[]の引数もintあるいはintN_tにしろってこと? あとintは少なくとも32bitあると考えても良いって書いてあるけどそんな保証はないよね?
グーグルの開発環境では最低32bitなだけだろ
組み込みやらないなら最低32bitの過程が今時崩れることはないだろう
社内規約をなんだと思ってるんだろうw
252 :
デフォルトの名無しさん :2010/05/30(日) 16:10:26
float に100.123と入力して表示させると 100.123001となってしまうのは何故ですか?
100.123が2進数では循環小数になるから
254 :
デフォルトの名無しさん :2010/05/31(月) 03:48:08
VS2008のコンソールでスレッド使ったプログラムを作ってるんですが, 例外でデバッグが止まると時々,終了できなくなります. デバッグ→すべて中止でも止まらない,タスクマネージャのプロセスにも表示されない... プロセスIDを調べてPskillで指定しても終了できません. コンソールwindowは残ったままなんですが….おかげでwindowsごとリセットしていますが, 何か止める方法orこうならないための対策ありますか.
あ、俺も知りたい。 Windows自体再起動も終了も出来なくなるし、放置すると全体がフリーズしてすごく困る。
翻訳お願いします。英語版できいたら分からないといわれました。 The problem here is that our template was instantiated for the type char, which turns out to be too by introducing an additional template parameter AccT の英文は 「この問題はテンプレートは文字型についてインスタンス化されたことのことです。」 コンマまではこの訳であってますよね。その後は, 「witchはまた追加パラメーターACCTの導入によるもでであることがはんめいした」 であってますよね? witchが指すものが前文に無いようにおもえて翻訳できません。 詳しく教えてください。
whichはproblemにかかってるんじゃねーの?
which turns out to be too がわからない。 この too は何だ?
tooは 最後につけるところを真ん中につけただけ。
>>263 じゃ、 be の補語は? exist の意味のbe?
which turns out to be (instantiated) too かなあ。
beの補語はby以下らしい。
関係代名詞はbeの補語ではなくて主語になるらしい。
この問題は追加テンプレートパラメーターAccTの導入からも、 存在することがが明らかになる
まとめて訳すとこんな感じか? ここでの問題は、追加テンプレートAccTの導入からもわかるように、 我々のテンプレートが文字型についてインスタンス化されてることです。
ありがとうございました。
271 :
デフォルトの名無しさん :2010/05/31(月) 17:22:57
質問です。C++2008には #pragma ○○ ・・・ #pragma end○○ と書けば横の+、−でコードを格納できたと思いますが、 忘れてしまったので教えてもらえませんか?
region
staticってどういう時に使うの? なんでグローバル変数じゃなくて静的変数を使うの?
グローバル変数との比較だと static変数はスコープがソースコード単位になるから 他のソースコードと名前が重複しても大丈夫
Cにはnamespaceがないから。
staticって意味が幾つも有ったような
C#言語で言う#regionみたいなことがしたいのですが 何かいい方法はありませんか? 現在は #define COM 1 #ifdef COM ~折りたたみたい部分~ #endif といった使い方をしていますがスマートではなく、何かいい方法がないか探しています
釣りかギャグかはたまたガチか それが問題だ
初心者すれに行くべきでしたね すいません移動します
数レス前に書いてあるだろw
あれだ 灯台下暗し
かなり初歩的な質問なのですが継承で 基本クラスのメンバ関数から派生クラスのデータメンバを変更するには どういった操作がありますでしょうか? 基本クラスのメンバ関数に派生クラスのオブジェクトのアドレスを 渡してみたりしたのですがコンパイルエラーで上手くいきませんでした。 よろしくお願いします。
普通に仮想関数でいいと思うが。
そんな基本クラスが派生クラスの中身を知っているような設計は投げ捨てるかどうしてもというならCRTPを使いなさい
286 :
デフォルトの名無しさん :2010/06/02(水) 17:13:54
1. 構造体のポインタ*tがある 2. 構造体の中にint型のポインタhogeがある 3. mallocを使って*tのメモリを確保 3. mallocを使ってhogeにint型x個分のメモリを確保 4. fwriteで構造体をファイルに書き込みたいが、二項目はどうやって指定すればいい?
fwrite(t, sizeof *t, 1, fp); 構造体のサイズが増えるわけでもないし。
288 :
デフォルトの名無しさん :2010/06/02(水) 17:27:25
>>287 上手くいかん
typedef struct test_t {
int a,b,c,d,e;
int *p;
} test_t;
test_t *t;
t = (test_t *)malloc(sizeof(test_t));
t->p = (int *)malloc(sizeof(int)*60);
printf("%d",sizeof(*t));
で、24って出る
>>286 fwrite(t, sizeof(int), x, fp);
だろ
ただし、
>1. 構造体のポインタ*tがある
でなく、
>1. 構造体のポインタtがある
であるならということ。3.も同様。
もし原文通りなら
fwrite(*t, sizeof(int), x, fp);
となる
>>288 pに確保した領域のサイズは構造体とは別。
trivially copyable classに展開してまとめて読み書きすればいいよ
>>288 構造体には他のメンバもあるのか。
それなら fwrite を2回する必要があるだろ。
fwrite(t, sizeof(test_t), 1, fp);
fwrite(t->p, sizeof(int), x, fp);
>>290 知ってる。だから質問した
>>292 それが一番スマートかな
構造体からpをそもそも切り離しとくってのも一つの手か
thx
知ってたら
>>288 で24が出ても上手くいかんなんて言わないだろw
fwriteしたものを、そのままfreadしようっていう魂胆なの?
定数じゃないならxもどっかに保存しとかないと読み込むとき困る。
読み込みは t = malloc(sizeof *t) → fread(t) → t-> = malloc(int*x) -> fread(t->p) で。
型変換を伴うコピーの時の参照カウンタのコピーをどうやってるのかと疑問に思って shared_ptrの中身を覗いてみたらpublicメンバだった こんなものなの
>>298 public でないと参照できないじゃん
>>299 まあそうなんですが
boostのことだからもっと複雑怪奇な方法で回避してる物かと思ったのでw
template friend classにしないのはなんで?
http://codepad.org/1ZyOAlyL 上は、はじめてのCという本に乗っていたコードを
少し書き換えたもの(printfをcoutに、など)です
結果が3→2→1→0→1→2→3と表示される内、
行きの3→2→1→0は分かるのですが、
帰りの0→1→2→3の部分がどうしてそうなるのか、さっぱり分かりません
tline(int x)に渡す引数を増加させる処理はないように見えるのですが、
どなたか教えていただけないでしょうか
再帰関数で0以外は一つの関数で2回表示してるから。
recfunc(3)を呼び出す 3を表示する recfunc(2)を呼び出す 2を表示する recfunc(1)を呼び出す 1を表示する recfunc(0)を呼び出す 0を表示する recfunc(0)から抜ける 1を表示する recfunc(1)を抜ける 2を表示する recfunc(2)を抜ける 3を表示する recfunc(3)を抜ける
>>303 冷静になってみると仰る通り2回表示してますね
ifの中身だけ見て、その下を見てませんでした
ありがとうございます
>>304 詳しい説明ありがとうございます
小一時間も考え込んでた自分が恥ずかしいです
低レベルな質問にも関わらずお答えいただき、お二方に感謝します
ありがとうございました
>>301 どうもコンパイラにより対応状況がまちまちらしい
boostのコードをみてみたら狡賢いコードになってたw
public:
/*
〜省略〜
*/
#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
private:
template<class Y> friend class shared_ptr;
template<class Y> friend class weak_ptr;
#endif
T * px; // contained pointer
boost::detail::shared_count pn; // reference counter
ポインタp,qがあって参照剥がしして一致、あるいは、両方NULLならtrueにしたいときって↓でおけ? ((p && q) && (*p == *q)) || (p || q)
だめじゃね?
だめだな
どうして諦めるんだよ!
((p&&q) && (*p==*q)) || (!(p || q))か?
答え:(p && q && (*p == *q)) || !(p && q)
X
314 :
デフォルトの名無しさん :2010/06/02(水) 23:29:56
!p && !q || p && q && (*p == *q)
答え。 p-q
!p && !q と !(p || q) のどっちにするかは趣味の問題だな。
p == q || p && q && *p == *q
p == q || と || p == q のどっちにするかは趣味の問題だな。
p == q を先にチェックするほうがいいにきまってるだろ。
なんで?
p と q が 0 でない事を先にチェックした方が良い 0だと以降が実行されない p == q は p と q の両方が0でも真になってしまう
> p == q は p と q の両方が0でも真になってしまう それが >307 が求めていたものでしょ。
>>32 参照はがしをしなくてすむなら、しないほうがはやいでしょ?
ポインタが同じところをさしているなら、ポインタの先を見るまでもない。
>>324 ポインターの値が同じでも実体の値が違うことがある
順序は実際のデータでプロファイリングして決めるのが一番
>ポインターの値が同じでも実体の値が違うことがある そんなスマポは使いたくない。
>>328 普通のポインタじゃなくて、スマートポインタの話をしていたの?
p,qが生ポインタでp == qで*p != *qって例えばどういうケースよ?現実的な事例を教えてくれ
メモリマップトI/Oなんて、もちださないでくれよ。
ポインターの値が同じでも実体の値が違う ってどんな用途に使うスマートポインタなんでしょうか? 気になる
>>331 それが保証されるのはCに限った話、C++は違うね
保証されるとかじゃなくて、現実的な話として、そういう設計の有益なクラスを例示してくれって言ってるの
>>336 例えばベースクラスが共通(またはどちらかがベースクラス)で、
片方への cast operator が定義されている場合とか
こういうコード普通に沢山存在してるだろ
有益かどうかはお前のさじ加減だし
p==qの時点でp,qの型は同じ 参照はがしても同じ型で比較されるだけだからキャストは関係ないだろ
>>337 あたまがわるいので、例が思いつかない。 具体例を教えてください。
class B { int x; };
class C { int y; };
class D : public B, C { int z; };
int main() {
D* p = new D();
B* q = p;
printf("p == q => %d\n", p == q);
printf("*p == *q => %d\n", *p == *q);
}
D に、どんな演算子を定義すればいいんですか?
みなさんが当たり前のように言ってるC++なら違うっていうのは
!=のおかしなオーバーロードのことでいいんでしょうか?
なんだか!=が真になるのが普通にあることみたいにいわれてるようなので
ひょっとしてこれではないのでしょうか?
あと
>>334 はPODって言ってますが組み込み型の間違いであっていますか?
PODの構造体は比較演算子が使えないですよね?
341 :
339 :2010/06/03(木) 12:29:06
operator == を再定義するのは反則だよねえ? #include <stdio.h> class B { int x; }; class D : public B { int y; }; bool operator==(const D&, const B&) { return false; } int main() { D* p = new D(); B* q = p; printf("p == q => %d\n", p == q); printf("*p == *q => %d\n", *p == *q); }
342 :
339 :2010/06/03(木) 12:31:53
>ポインターの値が同じでも実体の値が違うことがある operator == を再定義したら、「実体の値が違う」ことにはならないか。
if p == q はダメだろう。
(1) p と q が別のオブジェクトを指していて (2) p == q で (3) *p と *q の実体が違う ということはありえないで、ファイナルアンサー?
p==qかつ*p!=*qなんて非常識なケースが普通に沢山あるようなコードを自信満々に書いちゃう
>>337 は別業種への転職をおすすめする
そうなるように書くことはできるが、副作用も含めてそうならないようにコードを書くのが当たり前の感覚
>>307 に答えだしたら
p=123456;
q=123456;
if p == q はダメだろう。
>>348 無効なポインタを渡したときに、アクセス違反が発生しないからダメとかつまんないこといってんじゃないよね?
>>349 自分で適当なアドレス突っ込んだ場合、
「参照剥がしして〜」
の条件に合わなくなる(参照はがせない)
って言ってるんだろ?
アホかと思うがwwwww
普通にやってて自分でアドレス突っ込んじゃうような子がいたら消費者に訴えられるレベル
>>338 これが違う
p と q が同じ型だとはどこにも書いてないだろ
>>339 operator B();
というメソッド。
>>354 だからベースクラスが共通な場合って言ってるだろ
アップキャストはされるんじゃね
>>356 共通でなくどっちかがベースクラスの場合だね
p と q が別の実体を指しているのに、 p == q にするコードなんて書けないよ。
pとqは違うクラスです、とか、もう無茶苦茶 何考えてんだか… だったらC++と言わず char *p; long *q; でもいいわけでね…
>>361 >pとqは違うクラスです、とか、もう無茶苦茶
どっから同じクラスだって前提が出てきたんだ。
君の思い込みだろ?
>>318 がダメって言ってる奴って、ひとりだけ?
>>362 ばかばかしい。
次は、「釣りでした」とか「何あつくなってんの」とかかよ。
ひとりだけ
>>364 実務だと仕様書とか解釈が厳格になるからね
型が同じと書かれていないのに、勝手にそういう前提をおいたりしないんだよ
まぁ趣味の人にはわからない話かもしれないけどね
2chまできてお仕事ご苦労様です^^;
そうそう、ここは趣味の範囲だから実務の話されても困るわ。
C /C++という前提において仮定が無ければ、一般の場合を適合するのが普通じゃないか?
>>366 は特殊な場合のみいってるよね。
>>307 を見て、同じ型へのポインタじゃないと思えるほうが不思議
それはただの思い込み。
>>369 >>370 だから、趣味ならそれでいいんじゃない、大体動けばOK
でも仕事なら動かない場合とかあったら問題になる
だから最初から色んなケースを想定する
そういう習慣がついてんだよ
>>372 繰り返すが、ここは趣味のスレ、お前は場違い、出て行け。
仕事なら仕様を聞くだけで、余計な想像なんて入り込む余地はないだろw
>>374 ん?
最初の質問で p と q が同じ型だと書いてなかったら、
俺は同じ型でない場合も想定してただけだよ。
仕事でこういう場合に、勝手に同じ型だけしかありえんだろうって考えで
コードを書いたらとんでもないバクを生むことになるから。
屁理屈はお上手ですね。
どう見てもただの後付けw
いくら正論言おうと空気読めない奴が何をいっても無駄。
実務でもありえないような数値入力して、 プログラムが暴走して損害だしても、それは入力したユーザのせいになるよ。 プログラマがそんな細かいことまで考える義務はない。 プログラマの前提が優先されるからね。
>>375 お前以外の99人はpとqは同じ方という前提なんだよ
その時点でお前がまちがってるということ
民主主義の国は何もかも多数決で決められる、 それがいやなら北朝鮮でもジンバブエでも好きなところいけ。
p=qなら常に*p=*qは成り立つ、これが常識 そうならないケースを考える馬鹿が一人いるってこと そして沢山の人から非難をあびている
p=q; をみて /* p=q; */ まで仮定しないといけなくなるな。
仮定を排除してまずコンパイラが仕様通りでバグが無いか確かめます
パソコンにコンセントが刺さっているか調べます。
自分が仮想現実の住民でないか確かめます
例外的な可能性を考慮してダメだししたって言うには、 指摘の時点でそれを言ってないとダメ。
388 :
デフォルトの名無しさん :2010/06/03(木) 14:37:51
教えてください。 クラス foo と bar を用意したとします。 bar は foo 1つにつき1インスタンス必要なので、foo のコンストラクタで bar のインスタンスを作ってます。 ただ、bar は foo の情報を元に処理するので、bar のインスタンスを作る際の引数に、this (foo) を渡そうと思いました。 要するに、相互参照です。 foo.h と bar.h とした場合、include 順の指定がうまく行かずこまっています。 これは、この設計が誤っていますか? ヘッダファイルや宣言の記述に細工が必要ですか? 正しい考え方や、記述の仕方を教えてください。
馬鹿なレスが多いんで見落としてた
>>347 俺も基本的にそういう考えだよ。別に俺がそう書きたいというわけでなく、
p==qかつ*p!=*q は存在しないということに対して、存在する場合もあると言っただけだよ。
そもそも cast operator を定義する時点で怪しいコードになってくる。
けどその有用性を利用しているコードも存在している。
だから、その性質を理解しておくのは必要なことだと思っている。
例えば行列を表すクラス A があって、
それを拡張してインバース属性を持つクラス B 作るとする。
このときに B には opertore A() を用意しておき、
インバース属性が立っていれば逆行列を返すようにするとか
そうすると A を使用していたコードがそのまま使える。
こういう手法を使うことはよくあるだろ。(少なくとも使ってる奴がいるだろう。)
ウザイ
ここまで来ると哀れだなw
>>388 'foo.h' で
class bar;
class foo {
.....
};
のように、空のクラス宣言をしてやれば回避できる場合もある。
これでいけるかどうかは相互参照の内容次第。
>>388 インナークラスとして、一つのヘッダーにまとめてしまうとか
class foo {
class bar {
・・・・
};
・・・・
};
395 :
388 :2010/06/03(木) 14:54:43
なるほど、空クラスですね。 やってみたのですが、やっぱり仰るとおり相互参照次第で、コンストラクタに this を渡したい場合はそれ相応の宣言が必要でした。 この考え方(構成)が間違っているという事ですかね。。
396 :
388 :2010/06/03(木) 14:56:04
>>394 なるほど!!!
為してみます。
インナークラスかぁ。勉強になります。
397 :
デフォルトの名無しさん :2010/06/03(木) 19:50:52
質問です。 例文 int a; printf("値をいれてください:"); scanf("%d",&a); if(a<0&&a<9) { printf("値が違います!!"); } とこういう文があったとして、aにたとえば10を入力するとエラーメッセージを出してもう一度 入力させる処理に戻りたいんですがなにを付け加えればいいですか?
398 :
デフォルトの名無しさん :2010/06/03(木) 19:55:37
do while
while(1) { printf("値をいれてください:"); scanf("%d",&a); if(0<=a && a<=9) break; printf("値が違います!!"); }
int a; INPUT: printf("値をいれてください:"); scanf("%d",&a); if(a<0&&a<9) { printf("値が違います!!"); goto INPUT; }
int a; do { printf("値をいれてください:"); scanf("%d",&a); if (a < 0 && a < 9) { printf("値が違います!!"); } else {
途中送信しちゃった ごめんね break; } while (true);
>>398-402 たくさん回答ありがとうございます。gotoが一番簡単そうですね、勉強になりました。
>>403 こうする手もある
int a;
while (!Input(&a)) { }
int Input(int* p) {
printf("値をいれてください:");
scanf("%d", p);
if(*p<0&&9<*p) {
printf("値が違います!!");
return 0;
}
return 1;
}
gotoは推奨されていない
それは思考放棄 gotoを使ったほうがやりたい事を的確に表現している場合はgotoを使うほうが良い
まぁgoto使った方が便利な時もあるけど
あんまり
>>397 の質問のレベル的にgotoを
使う癖は付けない方が良いと思う。
Cで無限大を表記するにはどうすればいい?
+inf -inf
って処理系依存だっけ?
411 :
408 :2010/06/04(金) 01:10:36
ごめんなさい説明不足がありました 今xy軸上に三角形を作るプログラムをやっていて3点を直線で結び出来上がる三角形があるとして ある線が傾き無限の直線になったとき三角形が描けなくなります。※2点のx座標が等しい場合 それで無限になったとき(yの変化量/0)になったら回避したいので質問させていただきました
傾きを計算する前に判断しようぜ
413 :
デフォルトの名無しさん :2010/06/04(金) 02:51:47
今xy平面に三角形を作るプログラム作成に取り組んでいて3点を線分で結び出来上がる三角形があるとして ある線分の傾きが無限になったとき三角形が描けなくなります。※2点のx座標が等しい場合 それで無限になったとき(yの変化量/0)になったら回避したいので質問させていただきました
414 :
デフォルトの名無しさん :2010/06/04(金) 02:53:44
3点A(1, 0) B(1, 1) C(0, 1) で、AとBのx座標が等しいが、三角形ABCは書ける。 三角形がかけないのは、3点が同一直線上にある場合。
>※2点のx座標が等しい場合 なぜこれで判定しない?
参照を後からセットすることはできませんか? Class B; Class A { B& m_b; }; のような状態で m_b をコンストラクトより後のタイミングでセットしたいのです。 ポインタにすればできますが * を付ける必要があるので、参照でやりたいんです。
無理。 生ポインタ弄るのが嫌な場合はboost::reference_wrapper的なのを使えばいいが、 operator* 等を使うのが嫌という要求は言語仕様の埒外。
>>417 >operator* 等を使うのが嫌という要求は言語仕様の埒外。
参照ってそういう機能だろ、問題はセットできるのが初期化時に限られてるということ
問題というより安全性の確保だろ。 いつのまにかぬるぽになってたりしないように。
get()メソッドで妥協していいならboost::optional<T &>だな int x, y; boost::optional<int &> opt(x); opt.get() = 1; // x = 1 opt = y; // yに張替え *opt = 2; // y = 2
*でも面倒くさいと言ってんのに.get()はないわ
じゃあどうしようも無いな operator . がオーバーロードできない時点で参照剥がしの手間はかならず必要になる 代入と暗黙変換はその限りではないが
unionに参照は入れられないか・・・
LZ77で圧縮したデータを解凍するソースを書いて欲しいと言われたんだが 圧縮情報を表す箇所って、規定無いよね? abcdeabcdezをLZ77に掛けると、abcde[5,5]zとなるけど [5,5]を判断する場合どうすれば良いの? 圧縮側もこちらで書いていいなら\\[5,5]とか目印入れれば分かるけど 解凍ソースのみで困ってる
解凍ソースあるならいればいいじゃん
>>428 ソースは一切なし。圧縮したデータを見ることもまだ出来ない
それでいて、最初のLZ77を使ってるからと言われ
きちんと解凍出来るソースを書かなきゃいけないみたい
調べると、何処のサンプルも圧縮情報の前に適当なマーク入れたり
9bitにして、その後ろが圧縮情報か見たりしてるから、一発で動くのが書ける気がしない
LZ77の仕様書よめばどう扱ってるか解るんじゃね?
亜種が大量にあるとかいう話だけど
int[10]が書き込まれてるファイルをfread(hoge,sizeof(int),100,fp)とかやったら足りない部分はどうなるの? ちゃんと0で埋まる?それとも保障されてない?
433 :
デフォルトの名無しさん :2010/06/05(土) 22:43:52
thx
C++の具体的に難しいところってどの辺なんでしょうか?Cだとポインタと配列辺りだと思うんですが。 ちなみに今継承あたりを勉強中です。
436 :
デフォルトの名無しさん :2010/06/06(日) 02:40:11
TMP
経験的には、ポインタとか配列は難しくなくて、初心者でもすぐに使い始める。 難しいのは適切に使うこと。初心者はなんでもポインタで解決しようとしがち C++とかもだいたい同じで言語仕様が難しいというより、どう使うのかが難しい。 いっぱい用語があるのも難しいところかも。pimplとか
pimpl使ったら分からんと怒られた
ポインタは概念が難しいのではなく書式が難しいと言う人が多いけど どう考えても書式が難しいのではなく概念が難しいから初心者はつまずくだろ
ポインタのポインタの配列とか 関数ポインタの配列とか 概念は簡単でも書き方に戸惑う
そんなふうに書かなくても済ませられるのがC++のいいところじゃないか
>>439 概念が簡単だとは言わないが、わけのわからん書式が、せっかく理解しかけた
初心者の脳を改めて引っ掻き回して台無しにするのも事実。
>>442 int *a;
*aはint変数のように扱える。論理的かもしれないけど直感的ではないな。
イテレータも、二つのイテレータを使えば0個も表現できるってのも論理的だけど直感的ではなくわかりにくいね。
444 :
デフォルトの名無しさん :2010/06/06(日) 11:41:00
ポインタは全く難しくないよ。 だってお前らですら全員理解してるじゃんwww
つうか概念は簡単だろ
Cでポインタより難しい概念あるの?
int *p じゃなくて *int p ならまだ分かりやすかったんじゃないかとか思ったり
int* a
449 :
デフォルトの名無しさん :2010/06/06(日) 12:13:04
>>447 int *a;
int pa;
int asteriska;
int XXX;
これらの表記では、*a も pa も asteriska も XXX もすべて int型として扱える。
int の後ろに書いたものが、int型になる。
つまり、aの参照剥がしは*aと直感的に分かる。
*int p;
この表記では、pがint型へのポインタということが分かるのかもしれないが、
pをどう参照剥がしすればint型になるのかこの書式からは分からない。
以上の点で、前者の表記のほうが分かりやすいと考えられる。
>>449 ならば、int *a;で変数の領域が確保されなきゃおかしいじゃん。
451 :
デフォルトの名無しさん :2010/06/06(日) 12:20:51
ああ、そうだね。
じゃあ int &a; は &a が int なんだね
int *a = XXX の右側に来るのがポインタ値って時点で全く直感的じゃない
int *a; のメリットは int *a, *b; とするのを確実に忘れないという一点のみなのに *a が int だとよく分かる(キリッ とか言うから面倒なことになる
なるほど
int* const a = XXX; とやりたい時はどうするの?
それでいいんじゃないの
int *const a = XXX, *const b = YYY;
直感に頼るからいけない 俺は左から型に演算していくと理解してる int const * const & a; (((((int) const) *) const) &) a; intをconstにして、そのポインタ型をとって、それをconstにして、その参照型をとって、それにaという名前をつける add_ref<add_const<add_ptr<add_const<int>::type>::type>::type>::type a;
そこへ配列宣言が颯爽と登場。
メンバ関数ポインタへの配列があらわれた!
464 :
デフォルトの名無しさん :2010/06/06(日) 14:19:24
別に
identityとtypedefがあればすべて解決
構文と言うか文法と言うか、とにかくそっち方面で残念な言語だとは思う
すみません。 現在1クラス1ヘッダ&1ソース という形で30対のヘッダーとクラスがずらっと並んでいます。 他の方のプロジェクトを見るとヘッダの数だけがやたら多かったり、 逆にヘッダは1個しかなかったりする様なのですが、 1クラス1ヘッダ&1ソース というのは無駄で変なのでしょうか? 新クラスを作るたびに宣言程度のヘッダーを増やすのはやめて、 クラスの宣言程度のヘッダーはギッシリ纏めてしまったりした方が良いのでしょうか。
boostなんてファイルのモンスターハウスだぜ
↑ ×30対のヘッダーとクラスがずらっと ○30対のヘッダーとソースがずらっと(訂正すみません)
1クラス1ヘッダ&1ソースでいいだろ
Javaじゃないんだから、1クラス1ソースに拘ることはないだろ。 まぁ、関連のないクラスを纏めるのは論外だが。 インクルードファイルに関しては、ソースの数だけあっても全くおかしくはないと思う。
>>468 業務開発なら珍しくない
メンテ時には、ひとつのファイルに詰め込むより
こっちのが良いことが多い
C++のdelete[]の挙動について質問です。 int* p = new int[5]; int* q = new int[10]; int* z=p;p=q;q=z; //ポインタの交換 delete[] p; //どこまで開放されるのか? delete[] q; //どこまで開放されるのか? これ、メモリリークが起きたり、 逆に、開放しちゃいけない場所まで 開放されたりしないでしょうか?
476 :
468 :2010/06/09(水) 13:31:07
p[-1], q[-1] あたりにサイズが入ってるから大丈夫
>>475 それはない
配列newは自分で確保したサイズを覚えているので
アドレスさえ渡せば配列deleteは間違えない
なんでだろうね20byteも間に挟むなんて勿体無い
フリーリストとかブロックサイズとかハウスキーピングに必要な情報はいっぱいあるだろうさ。
>476 入れてもらえなかった471涙目www
サイズの情報があるのにプログラマからは使えないというのは理不尽な気がする
プログラマがnewにサイズ渡してんだから要らんでしょという考え
数バイト確保するより数キロバイトとか多めにとる方が一回の処理時間は大きいの?
487 :
デフォルトの名無しさん :2010/06/09(水) 21:28:48
大きくないよ
>> ずっと前の人 ctfmonをkillっても駄目ダタ やっぱりコンソールが閉じない&killできない。 激オソ報告スマソ
デフォコンのみ、constメソッドのみ つまり状態が1つで変化しないクラスのオブジェクトを何個も作るのは勿体無いと思うんだけど これを共有する自然なコードってどう書く?シングルトンかな?
>>480 環境依存の事を書いても仕方がない
BCCだとp[-4], q[-4]にサイズが入ってるぞ
別に
>>480 は単なる例であって、どんな環境でもそうだとは言ってないだろ
環境依存のスレは別にあるんだからこのスレで書くな
493 :
デフォルトの名無しさん :2010/06/10(木) 09:21:50
return 0;は0に返すという意味って大雑把な意味はわかるんですが、 例えば関数 keisan()があったとして return keisan();ってのは同じようにkeisan()に返すって意味ですか? returunの概念がいまいちよくわからんのですが・・
returnは返す。 keisan()はkeisan関数を呼び出して、その値。 つまり、return keisan()はkeisan関数を呼び出して、その値を返す。 以上
あー、そもそもreturn 0は0「を」(呼び出し元に)返すだからね。
496 :
デフォルトの名無しさん :2010/06/10(木) 09:30:21
>>494 なるほど、わかりやすい
別にreturn使わなくても
int main(void)
{
keisan();
}
だけで呼び出せるけどどういうことでしょう?
意味が違うし、色々と説明したいのは山々だが時間がないので後続に期待w
Pascal ならfunctionとprocedureってしっかり分かれているから 理解しやすいのだが、C言語はごちゃ混ぜに出来るし、戻り値を 捨ててしまえるというエレガント(?)な設計になっているため初心者が ここで混同しやすい
499 :
デフォルトの名無しさん :2010/06/10(木) 09:39:12
>>499 たとえばkeisan()の戻り値型がdoubleだとすると
double a;
...
a = keisan();
return a;
と
return keisan();
は同じような意味になる
要するにこの関数は値を返すか返さないかの違いだけ
501 :
デフォルトの名無しさん :2010/06/10(木) 09:50:42
>>500 関数ってのは返すのが当たり前じゃないんですか?
>>501 そんな事はない
void kansuu(void);
のように戻り値の所にvoidと書いた関数は値を返さない
返そうとするとコンパイルエラーになる
503 :
デフォルトの名無しさん :2010/06/10(木) 09:55:47
プログラムの中でreturn使ってないのはいいの? 正しいプログラムなの?
>>503 戻り型があるのにreturnを使わないと大抵のコンパイラでは警告が出る
正しいとは言えないが、戻り値を使わないプログラムだとそのまま動いて
しまう事がある
505 :
480 :2010/06/10(木) 10:11:11
506 :
デフォルトの名無しさん :2010/06/10(木) 10:27:22
>>504 #include<stdio.h>
int main(void){
int a;
scanf("%d",&a);
printf("%d\n",a);
}
エラーでないけどなwreturn使ったほうがいいのかこんな簡単なもんでも。
>>506 誰もエラーが出るとは書いてないだろアホ
「警告が出るコンパイラが多い」と書いたんだよ日本語わかる?
mainはエラーでないが他だとVCではエラー出る voidなら不問
509 :
デフォルトの名無しさん :2010/06/10(木) 10:45:37
>>506 はreturn使う必要どこにあるの?ないと思うが。
複雑なプログラムだけだろ。
取り敢えずvoid main()と書く奴はCを使う資格ないな WindowsのGUIならvoid main()でもいいが
またかよおめーら
>>512 根拠は俺様だ
LinuxなどのUNIX環境でvoid main()などあり得ない
シェルが実行ファイルの戻り値をほとんど使う
それだけじゃなくてWindowsでもコマンドプロンプトからバッチファイルで 使う場合は戻り値を使う その時にvoid main()じゃ戻り値が不定値になってしまうだろうが
1がエラーとか0が成功とかの規定なんて無いだろ。 0が成功かもしれないし1がエラーかも知れないし、 それ以外の情報を戻り値が教えてくれるかもしれない。 だから何も返さない方が一般性が高いと思う。
はいはい 勝手に言ってろ
>>516 Cのstdlib.hににEXIT_SUCCESSとEXIT_FAILUREというマクロが
定義されているのは何のためだと思う?
無知にも程がある
マクロというのはC言語の中でしか通用しないから OSからみたら1か0にしか見えないの。 もし、プログラムが成功や失敗ではなくて 計算の結果を返して、その答えが1か0だった場合どうするの? だから規定なんて無い。
だいたいC言語のマクロというのはUNIXの総合環境の中で培われて きたものだ だからC言語の中でしか通用しないという言い訳はおかしい
OSから見たらそのプログラムがCで作られたかJavaで作られたか GCCでつくれたかどうかも分からない。 だから規定なんて無い。
>>523 お前も頑固なやっちゃなー
そんな固い頭でプログラマで食って行けてるの?
下っ端プログラマーでは食っていけないけど SEとしては食っていけるよ。
嘘付け ニートの癖に良く言うよ
C ->ネイティブ吐く Java ->仮想マシン上 GCC ->そもそも言語じゃない これらを一緒くたにして語ってる時点でもうね……
と言うより、そんなに意地っ張りだからニートから抜け出せないんだと言っておくか
世の中を渡って行くには柔軟な頭脳は欠かせない
>>523 のようなカチコチ馬鹿は家の中に引き籠もっているしかない
結局何を書いても引きこもりにされるわ(ry
いや実際
>>523 は引き籠もりだろ
言ってる事がSEにしてはおかしいもん
MS-DOSでは0が正常終了
>>519 exit()のためじゃないの?
main関数で使う物ってどこで定められてんの?
みんな、そんなにマルチプラットフォームなプログラムを書いてるの?
質問。MFCではなくWinSDK使って書く場合 case WM_CREATE: g_Cls.init( ); break; case WM_PAINT: g_Cls.paint( ); break; と書くのは、オブジェクト指向では無いよね? でも、プロシージャ等の一式をクラスに纏めるのも微妙だけど、どういう書き方綺麗かな?
exitのエラーは-1じゃね?
>>535 俺の知る限りの環境では0以外全部エラーだお
次のようなコードで::max<int>()でも::max<d>()でも実体化出来るようにしたいのですがどう直せばいいでしょうか。 #include <algorithm> template<typename T> class c{ /* 省略 */ }; template<typename T> c<T> max(const c<T>& a, const c<T>& b) { return std::max(a, b); } class d { /* 省略 */ }; namespace std { d max(const d&, const d&) { /* 省略 */ } } ::max<int>()は一例で、要するに何でも受け付けるようにしたいという意味です。 ここで実現したい制限がいくつかあります: 1. 値が変化するためstd::max(const d&, const d&)の戻り値はconst d&に出来ない。つまりalgorithmのstd::max()を特殊化出来ない。 2. std::max(const d&, const d&)が宣言されない場合があるため、::max<T>()はstd::max(const d&, const d&)の存在を知らなくてもいいようにしたい。 当然その時はコード中に::max<d>()を実体化するようなコードは無い。 またそもそも論として、 1. ::max<int>()でも::max<d>()でも実体化できるようにする際に::max<T>()の中で呼び出すべきなのはstd::max()なのか。 2. d max(const d&, const d&)の宣言場所はstdの中でいいのか。 といった疑問があります。
539 :
538 :2010/06/10(木) 23:23:02
実際に試せるコードの方がいいですね。 #include <algorithm> template<typename T> struct c { T v; }; template<typename T> c<T> max(const c<T>& a, const c<T>& b) { c<T> r = {std::max(a.v, b.v)}; return r; } struct d { int v; }; namespace std { d max(const d& a, const d& b) { d r = {a.v+b.v}; return r; } } int main(int a, char** v) { c<int> ci; c<d> cd; max(ci, ci); max(cd, cd); } ::max<T>()をstd::max(const d&, const d&)より後に宣言すればコンパイルできるのですが、 出来ればstd::max(const d&, const d&)はどこに現れても(現れなくても)コンパイルできるようにしたいです。
stdに変なもん入れんなよ
541 :
538 :2010/06/10(木) 23:29:02
>>540 やっぱり入れないほうがいいですよね。
stdに入れないで::max<int>()と::max<d>()を両立するにはどうしたらいいでしょうか。
>値が変化するためstd::max(const d&, const d&)の戻り値はconst d&に出来ない とはなんのことを言ってるのか、さっぱりわからない
544 :
538 :2010/06/11(金) 00:56:43
>>542 示したのは意味のない例ですが、例ではmaxの中でa+bってやってますよね。
だからconst d&を返すことが出来ないんです。
>>543 ありがとうございます!
時を同じく丁度自前template maxの定義を思いついたところでした。
std::maxを特殊化しようとしないで自分で新たにtemplate maxを作って、それを特殊化しちゃえば良かったんですよね。
初歩的な質問で恐縮なんですが継承を行うと 基本クラスのデータメンバは派生クラスにも同じように データメンバが作られるのでしょうか? また基本クラスのデータメンバをprotectedにして publicで継承したとき,派生クラスは基本クラスのデータメンバに アクセス,変更が出来るという認識でよろしいでしょうか?
C++&DirectX(dxlib)でゲーム作ってるんだけど、ムービーシーンにFlashムービーで作った物を使いたい(楽なので) 何か方法ある?
>>546 ついでにゲームの核もFlashで作っちゃえばいいのにw
>>547 ググったけどよく分からなかった というかなんか周りくどくない?
>>548 AS3でも遅すぎて話にならん
Flashからaviに変換すりゃいいんでね?
>>550 画質荒くなるしサイズ大きくなるし、いいこと無し
>>549 じゃあムービーのときだけIE立ち上げればいいよ
ノ´⌒ヽ,, γ⌒´ ヽ, // ""⌒⌒"\ ) _/\/\/\/\/|_ i / ⌒ ⌒ ヽ ) \ / !゙ (・ )` ´( ・) i/ < 泣かせるおつむ > | /// (__人_)//| / \ \__ `ー'_/  ̄|/\/\/\/\| ̄ / ,}  ̄  ̄ { ヽ, / i i \ / /^i| |i^ヽ \ ヾ ̄ i / .l l \._ノ`フ  ̄ ̄ ト ,, ,.l  ̄ | \ / | l ヽ_r l | | | l ,,_ l _,,. l } ! { / 二二 | 二二ヽ i⌒i .i⌒i i⌒i ____ __ | .|.| .| | .| ,ー、◎ (____ ) (__) rヽ ノ ノ | .| , r───ヽ | .二ノ r───ヽ / / | | ノ ノ | .レ'ノ .ヽ───┘ | .|__ノヽ ヽ───┘ (⌒ / .ノ | ∠/ |____ノ ゝ___ノ ヽ ヽ ( ̄ ̄ ノ
>>555 サイトの紹介ありがとうございます。
データメンバも継承されることは分かったのですがprotectedがまだ今ひとつ分かりません。protectedは派生クラスから基本クラスの値を変更する為に利用するのでしょうか?それとも基本クラスから継承したデータメンバを変更する為に利用されるのでしょうか?
よろしくお願いします、
557 :
デフォルトの名無しさん :2010/06/11(金) 07:11:35
ポインタの意味がサイトとか見てもよくわかりません。 例えば (*p)はどういうことなんですか?(*f)もあるんですが
558 :
デフォルトの名無しさん :2010/06/11(金) 09:19:45
C言語習得に一番初心者に優しいわかりやすいサイト教えてください。 猫でもわかる〜でも難しいです。
>>556 protectedは実際はあまり使われない
ロベールのC++でも買って読むと良い
基本クラスでprivateで、そのまま継承して継承したクラスからも
見えるようにしたい時に使う事か多いけど実際はそんなに登場
する機会はない
562 :
デフォルトの名無しさん :2010/06/11(金) 11:42:49
(*p)と(*f)の違いについて
>>560 ありがとうございました!
非常に参考になりました。
565 :
デフォルトの名無しさん :2010/06/11(金) 20:40:05
自作のテキストエディタに予想変換機能(簡単な物)を付けたいのですが その手の解説かソースプログラムある場所ありますか? 出来ればVC++のウィンドウズ非コンソールプログラムで
>>565 現状何が問題なのよ。
予測文字列を算出することなのか、予測文字列群をポップアップで表示する方法なのか、いろいろあるでしょ。
>>566 出来れば予測文字郡をリストボックス形式で表示して
入力と共にリストが絞り込める形がいいです
share_ptrって凄く便利だけど遅かったりするの?
>>568 メリットに対してコストは全然問題ないレベル。
普通に使って問題ないよ。万が一問題になったらそこで対応すればいい。
>>570 ありがとん!
あともう一つ質問なんだけど、
listのremove()で、とあるメンバ変数が1だったら削除、とかやりたいんだけどどうやって指定したらよいの?
いろんなサイト見てるけどlist<int>とか<char>ばかりで<class*>がない…
ごめん、やっぱ分からん メンバ変数の指定ってどうやるの?
>>575 std::mem_fun_refを使って渡す
メンバ関数のアドレスを直接渡そうとするのはダメよ
ごめんなさい間違えました
>>575 bool func(Object t){
if (t.x = 1)
return 1;
else
return 0;
}
みたいなのを作ってremove_if の第三引数に渡す
boost::bind使うと楽なんだけどな
C++0xだと思わずラムダ式を使ってしまう C++にもboost::lambdaは使えるけど
>>578 なるほど、クラスまるごと受け取るのか
やってみる
一回の走査で配列から中間値に最も近い値をもつインデックスを見つけることってできる?
できたら、ソートのアルゴリズムに大革命起こせるな。
え?普通に出来るだろ。
メモリーにインデックスと値の組を保存する。 値の平均を計算する。 平均に最もちかいインデックスを検索する。
ソートしておく
ほんとに中間値なら最大値と最小値の間の数は全部中間値ってことになるよ。 平均値の間違いかと思ったよ。 ちなみに走査は一回しかしてないよ。
>>587 ソートした時点で既にオーダーが最低NlogNになってまうだろうが
O(N)にはならない
590は必要条件と十分条件の区別が付いてないようだな・・・・
>>591 いや、区別は付いている
ソートしてあるという前提条件が付いているなら
それは必要条件になる
O(N)⇒一回の走査だけど、 一回の走査⇒O(N)じゃないからね。 一回の走査したあと他に何かする場合もあるからね。
>>596 >一回の走査⇒O(N)じゃないからね。
え?
一回の走査をするアルゴリズムの略にきまってるだろ。
だからソートしたらOが変わるって
listでさ あらかじめある程度の領域確保しといて、足りなくなったら適当な所から取って使う みたいなこと出来ない? placement new+仮想メモリ みたいな
>>603 そういうアロケーターを書いてあるそのままに作ればいいと思うよ
>>603 listにはそのためにアロケーターを指定できるようになっている。
boostにすぐ使えるpoolアロケータが用意されているからそれを使うのが楽
こんな感じ
list<hoge,boost::fast_pool_alocator<hoge>> a;
>>596 二回の走査でもO(N)
従って
> O(N)⇒一回の走査だけど、
は間違い。
綴りミスってた fast_pool_allocatorだな。
Boostのアロケータか 使ってみたけどあまり変わらんぞ はっきり言ってあまり期待しない方がよい 標準のアロケータで通常は十分
そもそも標準で十分だと思ってるヤツ向けの機能じゃないし。
boostって実際使って仕事してる? 規約で禁止されてるところとか多そう。
612 :
デフォルトの名無しさん :2010/06/12(土) 16:09:06
必要があれば使うけど、基本的には使わない。
>>609 意外と標準のnewは速いから大きな差はないな。差がないのはアロケータはスレッドセーフにする必要があるのが要因のようだね。
プールアロケータのメリットはたくさんのオブジェクトを作成、破棄を繰り返すときにヒープの断片化を防ぐ。これはnewの速度低下に地味に効いてくる。
あと、オブジェクトの生成破棄再生成を繰り返すときの高速化ぐらいだね
二つ以上のクラスで同じ関数使いまわしたいんだけど何かいい方法ない? class CA { void hoge(); } class CB { void hoge(); } void CA::CB::hoge() { } こんなイメージ(勿論上はエラー) まあ二回書けばいいんだけど、中身が数十行あるからうざったい
テンプレート関数でできそうな飢餓。
普通に class Choge { void hoge(); } class CA:public Choge { } class CB:public Choge { } void Choge::hoge() { } これでいけるか 合ってるよね?
is-a に出来ないんだったら絶対にpublic継承は使うなよ 場合によっちゃprivate継承が適切なケースもあるが なるべくならコンポジションだ
もうちょっとわかりやすく!
>>617 そのhoge()はなんでメンバ関数なんだ? そこをよく考えて設計するべき。
622 :
614 :2010/06/12(土) 17:55:09
ありがとうございました!
std::istringstreamからstd::getline()やらread()やらでデータを取得していって、 さぁ残りの文字列を取得しようとstr()を呼んだら最初の初期化で指定したものが出てきました。 現在の読み込み位置以降の文字列を取得するスマートな方法は無いですか?
>>623 istreambuf_iteratorでもなんでもいいけど、
istringstreamから残り全部の文字を読み出すようなコードを書くのが手っ取り早いと思う。
625 :
623 :2010/06/12(土) 20:11:54
>>624 どうもありがとうございます。大当たりです。
std::string str( ( std::istreambuf_iterator<char>(istr) ), std::istreambuf_iterator<char>() );
で期待した動作になりました。
c++の学習のためにゲームを作っているのですが、コードを書くごとにどんどんグローバル変数が増えていって困っています。 呼び出し関係のない2つの関数で共通する変数を扱う為にグローバル変数を使う、というパターンがほとんどなのですが、 こういう場合にグローバル変数をなるべく使わないで済ます方法はないでしょうか? たとえばカーソルを動かして選択肢を選ぶ処理を作るために、 「キーボードの入力を受け取ってカーソルの位置情報を動かす」関数と「位置情報からカーソルを描画する」関数があり、 カーソルの位置情報をグローバル変数にするという感じです。(上記の関数はどちらもゲームのメインループから呼び出しています)
>>626 「カーソル位置情報を動かす」オブジェクトが「カーソルを描画する」オブジェクトを参照できるようにしておく。
>>626 オブジェクトうんぬんじゃなくて、ただの構造化プログラミング的には
キーボードの入力を引数にとり、カーソルの位置情報を返す関数
位置情報を引数にとり、カーソルを描画する関数
キーボードの入力を受け取って上記二つを呼び出す関数
に分けるとか
そういう風にするだけでも、関数内でそれなりに完結するようになって大分良くなるんじゃないかな
カーソル位置情報を関数に参照渡しすれば?
630 :
626 :2010/06/13(日) 10:44:34
ご回答ありがとうございます。 実は学習のしかたが偏っていたせいか、今まで参照がどんなものなのか知りませんでした。 今参考書をあたりつつ、関数の分け方も考えています。
listがremove()使ったほうがいいって言われるのはなんで? 一個だけ削除するにもremove使ったほうがいいの?
普通の関数のremoveよりメンバ関数のremove使った方がいいって話と勘違いしてるとか?
?removeは機能も違うし置き換えにはらんだろう。しかもO(N)じゃないのか?
>>634 そこ間違いが多いから参考にしないほうがいいよ
高橋麻奈著の『やさしいC』を読み終えファイル入出力までは理解できた 次は何すればいい?C以外の言語を学んだ方が良い?
次は自分で考える事を勉強する、かな
ソースファイル落としたら.mの拡張子のファイルも入ってて良くわからないです 明日までにとりあえず動作させなければいけないんで 使い方だけ簡潔に教えていただければ助かります
m4 かなあ?
mファイルと言うらしいのですが、matlabは触ったことがないので全然分からないのです… 特別なコンパイラとかいるのでしょうか?
matlabが必要になります。
オーバーフローアンダーフローを検出してくれる整数演算のライブラリってなんかありますか?
.mってObjective-Cじゃないんかね
648 :
デフォルトの名無しさん :2010/06/14(月) 23:13:49
初期化子でポインタは初期化できないのですか?
初期化出来るでしょ
MATLAB なら Octave が free soft。
651 :
デフォルトの名無しさん :2010/06/14(月) 23:55:01
int i; sscanf(str, "%d", &i); これでstrにiを超える桁数の数が入ってたら 適当に丸めてくれるの? それとも桁あふれになるの?
struct Rec { int type; /* 0なら四角、1なら丸*/ int yoko; /* 幅*/ int tate; /* 高さ*/ }; struct Cir { int type; /* 0なら四角、1なら丸*/ int r; /* 半径*/ }; struct Zukei { int type; /* 0なら四角、1なら丸*/ }; void RecCreate(void* hoge){ (Rec*)hoge->type=0; (Rec*)hoge->yoko=10; (Rec*)hoge->tate=5; } void CirCreate(void* hoge){ (Rec*)hoge->type=0; (Rec*)hoge->r=7; }
PrintMen(void* hoge){ switch((zukei*)hoge->type) case 0: sprintf("%d",(Rec*)hoge->yoko * (Rec*)hoge->tate); case 1: sprintf("%d",(Cir*)hoge->r * (Cir*)hoge->r * 3.14); } main{ zukei* x; RecCreate(x); (間にいろんな処理) PrintMen(x); } 先輩の作ったモジュール見たらこんな感じのコード出てきたんですが CreateTri抜ける〜PrintMen行くまでにyoko、tateの情報落ちないんでしょうか? zukeiへのポインタとしてしかxを宣言してない (mainモジュール中でzukei構造体分のサイズしかメモリ確保してない?)んで yoko、tateの値が入った領域って(間にいろんな処理)の際に 別の変数の為に使われちゃったりしないか気になるんですが。
>>653 すごい良くないコードだね。
危惧しているとおりに、違う型で上書きしなければ動くだろうけど。間違いを防止することができない良くないコードだね。
ひでぇコードだな
C++で仮想関数にすればまだ見られるようになりそうだが
回覧板の角で頭ぶっ叩くレベル
Cでクラス・継承を実装するのは結構めんどくさいよね
>>658 各構造体をunionするしかないか。コンパイラのチェックが効かないから相当危険なコードになるのは間違いないが。
Cなら普通にある。キミらが使っているネットワークスタックも同様に書かれている。
>>660 IPのアドレス構造体なんかそうだけど。
type値で切り替えるのは有るけど普通じゃないと思う。APIなどのインターフェースとかぐらいだろ
xの先はどこで確保されているんだろう。 常識的に考えればRecCreate()で確保するのが関の山だと思うが。
>>652 はLが無いけど、TLVな構造なんてどこでも使われてるだろ。
型をコンパイラがチェックできなくなるんでお勧めできない方法だ
すみません。ポインタの変数の値が壊れる事に悩んでいます。 struct DATABOX { int no; bool chk; float *data_a, *data_b; } この構造体のインスタンス DATABOX dbox[100]; が有るのですが、 私がまだ理解できていないテンプレートを使った移植クラスの利用の為に DATABOX* tmp = spDAry[i]->mpObj; // 右の式がテンプレートらしく理解が・・ ここに tmp->data_a = dbox[i].data_a; とすると正常通過する時と、dbox[i].data_a側が 0.000000 になってしまう時が有ります。 (デバッグで手前では数値が確実に入っています。必ず0.000000以外の数値で確認済みです。) ここ以外 dbox[100] を触っている部分は全く無い処理に入ってから壊れるので ここしか考えられないのです。 ポインタの扱いに慣れておらず、 イコールして右の式が壊れるなんて初めてで、混乱しております。 申し訳ないですが、何がまずそうかできれば推測で構いませんので、助言頂けませんでしょうか
>>665 おそらくテンプレートは関係ない。
先ずは周辺のソースを全部出せ。
spDAry[i] の i が spDAry のサイズを超えてるんじゃないの? んで、tmp が変な所指してしまってて、dbox か i かの中身を壊してるとか
C++を使うのがおすすめですよ
型をちゃんと指定するのがおすすめですよ
OpenCVもCで継承使ってる部分はvoid *だな C++だと問題ないんだが
>>668 C++で継承を使うのがお勧めだろう。
今回の例だと
class Zukei
{
public:
virtual ~Zukri(){}
virtual void PrintMen()=0;
};
class Rec :public Zukei
{
int type; /* 0なら四角、1なら丸*/
int yoko; /* 幅*/
int tate; /* 高さ*/
public:
virtual void PrintMen(){//略}
};
class Cir :public Zukei
略
class Rect :public Zukei
略
他言語から使う以外に手間をかけてまでわざわざCでやるメリットは有るのか?
>>672 typeは要らなかったな。こぴぺミスった
>>673 新規案件ならC++だろう。
既存コード使うならCを使わざるを得ないだろうけど
InitTest::InitTest(QString *p) : m_str(QString("abc")), m_pstr(new QString("abc")) こんな初期化子の使い方ありだと思いますか?
pはどこに行ったの?
何の問題ですか
679 :
676 :2010/06/15(火) 22:57:12
>>677 pは消し忘れました
無視してください
>>678 ポインタは初期化子で初期化するのか
コンストラクタの中で初期化するのか気になっただけです
ぶっちゃけどっちでもたいした差はないよ 初期化子でnewしてもいいし 初期化子で0クリアして後でnewしてもいい
>コンストラクタの中で そりゃ代入 QString * const m_pstr だったら後者は使えない
>>675 extern Cで十分じゃないか?
同僚にCしか使えないような奴がいるんなら別だけど。
C++にはプログラムを見難くする機能が満載である。
>>652 の方がずーっとまし。
それはないわ
>>652 はほとんどC++だからね
どっちがましかと言えば、同じようなもんだけど
C++の方がきれいに書けるだろうね
>>653 >zukeiへのポインタとしてしかxを宣言してない
その通り。
>(mainモジュール中でzukei構造体分のサイズしかメモリ確保してない?)
いや、Zukei構造体分の確保すらどこにもない。
>yoko、tateの値が入った領域って(間にいろんな処理)の際に
>別の変数の為に使われちゃったりしないか気になるんですが。
(間にいろんな処理)の以前、RecCreate()でyoko, tateに代入してる時点で
どこに書いてるのかわからない。
これが死なずに動いてるなら、それはただの偶然。
せめて、
main() {
Rec x;
RecCreate((void *)&x);
...
}
なら、動くだろうと思うけどさ。
687 :
デフォルトの名無しさん :2010/06/16(水) 19:56:03
ある数字の各桁をそれぞれ別の変数(配列)に代入したいんですが、いい方法ありますか?
10で割れ
689 :
デフォルトの名無しさん :2010/06/16(水) 19:58:11
>>688 すみません、もう少し詳しくお願いします
ここまでヒントもらって分からないとなるとひょっとすると脳に障害があるかもしれんな
for(i = 0; n; i++, n /= 10) a[i] = n % 10;
障害があったみたいです、ありがとうございました
いいってことよ
#include <iostream> using namespace std; static const int N = 1024; static const double L = 1.0; int main(int argc,char** argv) { int i; double I[N],a[N],b[N]; double dx=L/N; cout << dx << endl; I[0]=1.0; for(i=0;i<=N;i++){ a[i]=1.0; b[i]=1.0; } cout << dx << endl; for(i=0;i<N;i++) I[i+1] = (1-a[i]*b[i]*dx)*I[i]; cout << dx << endl; return 0; } このコードで10,16と18行目でdxの値が変わるんですが17行目でdxを変えるような事はしてないと思うのですが なんで変わってしまうかを教えてください
I[i+1]
#include <iostream> using namespace std; //static const int N = 1024; //static const double L = 1.0; int main(int argc,char** argv) { int i,N=1024; double I[N],a[N],b[N]; double L=1.0,dx=L/N; cout << dx << endl; I[0]=1.0; for(i=0;i<=N;i++){ a[i]=1.0; b[i]=1.0; } cout << dx << endl; for(i=0;i<N;i++) I[i+1] = (1-a[i]*b[i]*dx)*I[i]; cout << dx << endl; return 0; } こっちだったら問題なく一緒になるんですがI[i+1]のところが問題あるんですか?
17行目のiが最大な時のi+1は?
i<N なんで最終的に i+1=N になってると思うのですが
double I[N] は l[0] .. l[N-1]まで
配列のサイズを[N+1]にしたら同じになるようになりました しかしなんで同じになるのか解せません
似たようなアドレスにローカル変数ブチ込んでるから配列サイズオーバーして書き込んだ結果だろ。
&I[N] と &dx を出力してみると分かるよ
あとここも直しておくように >for(i=0;i<=N;i++){ >a[i]=1.0; >b[i]=1.0; >}
質問してるときはその質問が一段落するまではなんか一時コテでも名乗ってくれや。 >694=>696=>698=>700でいいのか?
どうでもいい
メンバのstd::vector< boost::weak_ptr<T> > container にオブジェクトを追加する関数ですが share_ptrで受けて void add(boost::shared_ptr<T> const& sp){ boost::weak_ptr<T> wp(sp); container.push_back(wp); } 関数内でweak_ptrを追加するのか それとも直にweak_ptrを受ける void add(boost::weak_ptr<T> const& wp){ container.push_back(wp); } どちらがよいでしょうか また、生ポインタを引数にとってうまくやる仕組みはないでしょうか? それとも生ポインタは受けないようにした方が良いでしょうか?
どっちでもいいです
708 :
デフォルトの名無しさん :2010/06/18(金) 05:47:06
delete a; delete b; とすればOKなのですが、 delete a,b; とするとmemory leakがおきます。なんででしょうか?
誰がそんな書き方ができるって言った?
>>708 delete a,b;
だと, はカンマ演算子なので
delete a;
b;
という感じになってるんだよ
え?
delete a, delete b;
可変長テンプレートで纏めてデリートがトレンディ
int a,b;はなぜOKなのでしょうか?
宣言だから
delete はああ見えて演算子だからね
マクロスエースフロンティア[YouTube]
http://www.youtube.com/watch?v=1yn0fYFnMKk この動画みたいに、移動する物体(敵)を追いかけながら
曲線を描いて、ビーム、もしくはミサイルのようなものを発射するのって
どうしたら良いのでしょうか?
直線でビームを出すのなら2点間の座標を取ってその間で
動かせばいいと思うんですが
何故曲がりくねらせることが出来るのか分かりません助けて下さい><
>>560 亀ですまんが、protectedはよく使うだろ
>>719 毎フレーム玉とターゲットの位置を調べて軌道修正してる。あとスレチな
protected継承の話じゃなくて、protectedメンバの話だよな? 使う使う。
>>560 はprotected継承の話だぜ
まあ滅多に使わないな
726 :
デフォルトの名無しさん :2010/06/20(日) 16:49:11
メンバ変数をコンストラクタで全部0にしたいんだけどどうするのが定石? floatとかはとりあえず考えない感じで memset(this,0,sizeof(this));とかできんの?
>>726 memsetは危険。できない。
メンバー変数にはコンストラクターを持つ型を使用すれば、それらは自動的に初期化される。
コンストラクターを持たない型はboost::value_initializedを使う方法がある。
なるほど。ありがとう!
729 :
デフォルトの名無しさん :2010/06/22(火) 15:16:18
>729 エラー処理ができていないってことかな。 read はエラーが発生すると -1 を返すけど、size_tはunsignedなので受け取れないとか。 (read_sizeに-1を代入すると MAX_UINTにかわってしまう。 (size_t)-1 と比較すればいいんだけど。) どうせ、1024より大きな値が返ることはないので, int read_size にしておけばいい。 writeの戻り値をチェックしていないとか。
コンストラクタTest()の中で別のコンストラクタを呼び出したいのですが ※1のようにしてTest()を実行しても変数nameは空のままです。 ※2のようにするしかないのでしょうか? --------------------------------------- ※1 Test(){ Test("名無し"); } Test(const string& st){ setName(st); } void setName(const string& st){ name=st; } --------------------------------------- ※2 Test(){ setName("名無し"); } Test(const string& st){ setName(st); } void setName(const string& st){ name=st; }
>>731 C++0x準拠のC++ならこう書けるけどね
Test() : Test("名無し") {
}
>732 ありがとうございます。 記述を変更したところ、 E2312 test.cpp 13: 'Test' は曖昧でない基本クラス 'Test' ではない(関数 Test::Test() ) よろしくお願いします。
C++0xだとと書いてあるね。
ありがとうございます。 了解です。
>>732 これVC++2010でも対応してないんだよなあ
すっげー期待してたのに
while(!関数名)ってあったんですけどこれってどういう意味なんでしょうか? もし関数が0を返したらwhile(!0)になると思うんですがこれは真なんでしょうか? よろしくお願いします。
738 :
デフォルトの名無しさん :2010/06/23(水) 01:47:11
>>737 0を返すまでループ、って意図じゃないのか
>>738 よく分かりました。
ありがとうございます!
740 :
デフォルトの名無しさん :2010/06/23(水) 02:35:26
日本語にするなら、1が返っている間はループ、ほうが多いかな まあどっちでもいっしょだけど
関数が0を返してる間はループだろw 正反対じゃねーかよ
>>740 1が返ってきたら抜ける、と読み替えたとしてもまるでダメだな
while (somefunc() == 0) って書くほうが意図がはっきりしていていいじゃないか。
while(! isReady()) 分かりやすい while(isReady() == 0) 分かりづらい
while(isReady() == FALSE) これでおk
LPVOIDから(ry 環境 XPSP3, VC++2008EE DDSURFACEをDIBに変換して色情報をLPVOID lpvBitsから R=0x0F とかいう具合に 取り出したいのですが, どのようにすればいいでしょうか? フックするのに必要だったので#define CINTERFACE してます bool Screenshot(LPCTSTR FileName, LPDIRECTDRAWSURFACE7 lpDDS) { if (!FileName || !lpDDS) return false; bool Success=false; HDC SurfDC=NULL; // GDI-compatible device context for the surface HBITMAP OffscrBmp=NULL; // bitmap that is converted to a DIB HDC OffscrDC=NULL; // offscreen DC that we can select OffscrBmp into LPBITMAPINFO lpbi=NULL; // bitmap format info; used by GetDIBits LPVOID lpvBits=NULL; // pointer to bitmap bits array 中略) if (!GetDIBits(OffscrDC, OffscrBmp, 0, Height, NULL, lpbi, DIB_RGB_COLORS)) ERROR_BREAK(5); if ((lpvBits = new char[lpbi->bmiHeader.biSizeImage]) == NULL) ERROR_BREAK(6); if (!GetDIBits(OffscrDC, OffscrBmp, 0, Height, lpvBits, lpbi, DIB_RGB_COLORS)) ERROR_BREAK(7); ここのlpvBits[x+y*width]から取り出す場合どうすればいいのでしょう. 32bitBitMapだと仮定します.widthは中略内で宣言されてます
http://codepad.org/b91JkFQh これでセグっちゃうんですが何がいけないんでしょうか?
gdbで見てみたら
#0 0x00007ffff7ab3dd9 in vfprintf () from /lib/libc.so.6
#1 0x00007ffff7abecb8 in fprintf () from /lib/libc.so.6
#2 0x000000000040076c in main (argc=1, argv=0x7fffffffe8a8) at print.c:24
こんなエラーがでてきます
そのループでいいのか?
fopenの回数とfcloseの回数が全然違う。
750 :
747 :2010/06/23(水) 12:52:01
正しくはiのループはfprintfの上にあるべきだと思うんですがそれでもエラーでるんでいろいろ試してました
fopenしっぱなしでfcloseしないでいると、一つのプロセスで開いておけるファイル数には制限があるので そのうちfopenに失敗してfpがNULLになってsegvしている。
何がしたいループなのかよくわからん。 datはいくつ作りたいんだよ?
セグっちゃう
セグウェイに乗れってことだろw
756 :
746 :2010/06/23(水) 14:01:17
代わりにgdi+になげて何とかしてみましたが, たまに一般的エラー?をはきます。 fail safeかけて今のところ順調に動いてますが, 不安定なモジュールなのでしょうか.
>>753 世の中夜勤帰りで朝から寝てる人だっているんだよ?
引っ越しの時ちゃんと挨拶行った?
顔合わせたら軽く会話するとかしてちゃんとコンタクト取り続けてる?
日頃からそういうコミニュケーションが取れてればいつ洗濯機を回していいのか
いつ静かにしなければならないのか
迷惑を掛けないように生活出来るはずなんだが
VC++2005のMFCについて質問です。 数値(BYTE型)を入力するエディットボックスを使用します。 DELETEキー等でボックス内の値を未入力状態にすると 「0から255までの数値を入力してください」と出るのですが これを表示させない方法があれば教えていただけますか?
>>758 表札すら出してない隣人どもにわざわざ挨拶なんてしない
仮にしたとしても世間話にすらならないので相手の生活は基本推して知るべしだな
>>762 値のチェックを有効にしたままメッセージだけ出さないように
したいんです。
自分で範囲を決める場合(たとえば1から10までを入力可能範囲
にする)ならメッセージだけ回避する方法はわかるのですが、
型の入力範囲(BYTEなら0から255)そのものに対するチェックを
有効にした上でメッセージだけ回避したいのです。
>QIODevice::QIODevice() : QObject(*new QIODevicePrivate, 0) コードを読んでいたらこんなのを見つけたわけですが、 なんでnewの前に *を付けるんですか?
newで返ってくるのはポインタ型。 それに*をつけて参照型にしてるだけ。
766 :
デフォルトの名無しさん :2010/06/27(日) 11:28:46
「初期化子リスト」の読み方ですが、 「しょきかし・りすと」 or 「しょきか・こりすと」 どっちが正しいのでしょうか?
>>765 まて、それどうやってdeleteするんだ?
>>767 関数内じゃね?
出来るのか出来ても意味あるのか知らんけど。
>>769 たしかに、参照で受けたのをdeleteするって変だよね
それは参照の使い方として正しいのか?
出来ると思うけどあまりいいコーディングとは思えないな shared_ptr使うのが吉
規格上問題はない まあ生のポインタを保持する時点で気持ち悪いが
775 :
766 :2010/06/27(日) 14:43:27
777 :
764 :2010/06/27(日) 21:05:04
一応フレームワークのコードなので、 フレームワーク側で何とかしてくれているんじゃないですかね
>>776 読み込むときに横方向と縦方向が逆になってると思う
class.cpp
41 hig=HIG;
42 for(int i=0;i<hig;i++){
43 for(int j=0;j<wid;j++)
44 fscanf(fp,"%d",&pix[j][i]);
45 }
main.cpp
43 for(int i=0;i<HIG;i++){
44 for(int j=0;j<WID;j++){
45 fprintf(fp,"%d\n",op[j][i]);
46 }
47 }
template<class T>はclass T;と同じニュアンスで書いているのですか?
780 :
776 :2010/06/27(日) 21:49:53
List[5][2][20]の配列のi番目をaと置き換えたく List[i][0]='a'; List[i][1]='a'; としたのですが、「式は変更可能な左辺値である必要があります」と エラーが出ました。 どうしたらいいですか?
>781 i番目がどこなのかさっぱりわかりませぬ。 エラーメッセージの通り、左辺が変更可能では無いのでしょう。 Listはどのように宣言していますか?
なんとなく strcpy(List[i][0], "a"); とかやりたいのかな、なんて思ったり
補足です。 char List[5][2][20] です。 int i; printf("削除したい番号を入力:"); scanf("%d",&i) List[i-1][0]='a'; List[i-1][1]='a'; 入力した番号の配列を削除するのが目的ですが 置き換えたほうが後に便利なので置き換えたかったのです・・・。
List[i-1][0]='a'; List[i-1][1]='a'; の行を、 strcpy(List[i-1][0],"a"); strcpy(List[i-1][1],"a"); に変えればいいと思います。 回答とは関係ないですが、 Listは、「文字列の」2次元配列ってことですか?
788 :
786 :2010/06/27(日) 22:44:00
>>787 どうもありがとうございます!
成功しました。
えっとちなみにstrcpyを使わない方法はないでしょうか…?
あと自信はないですが、文字列の3次元配列だと思います。
string使えばいいと思うよ
>>788 文字の3次元配列だと思うよ。
strcpy使わないならこんな感じ。
List[i-1][0][0] = 'a';
List[i-1][0][1] = '\0';
List[i-1][1][0] = 'a';
List[i-1][1][1] = '\0';
791 :
786 :2010/06/28(月) 00:01:38
>>790 成功しました!!!
どうもありがとうございます!!
ゲーム画面の文字を自動で取得してテキスト化にするには どうすればいいですか? というか、可能ですか?
ゲーム画面を取り込んでOCRにでもかければ?
>>792 ゲーム毎に対応が異なってくるので、制作者にご相談ください。
相談できないような内容なら、この板のローカルルールに則って然るべくどうぞ。
>786>790 もう解決したみたいだけど、 >入力した番号の配列を削除するのが目的ですが 配列を削除?ってのがちょっと引っかかる。 ほんとにやりたいのはこれじゃない? List[i-1][0][0] = '\0' List[i-1][1][0] = '\0'
>>795 削除するのをあきらめて置き換えにしてるわけで、空文字列にするのは置き換えのほうに分類されると思う。
ほんとにやりたいのはmemmoveで解決できたんじゃないかな。
質問です。 私の環境はVC++2010、2008ですが、C++の言語全体として 答えていただけると幸いです。 enum E { E1, E2, }: のようなenumがあったとき、E2 | E1 は、int になるらしいです。 ということは、 E e = E1 | E2; に警告が出ます。 この辺のenumの取り扱いとして、 1. ビット演算のような用法 ( e = E1 | E2; ) 2. まさにenum的な用法 (どれかひとつ) ざっくりと、2種(または混合)があると思うのですが、この辺、何かしら 指針、指標のようなもの、もしくはベンダからの情報等はあるのでしょうか? ベンダー依存でもいいので、何かしら情報があれば、よろしくお願いします。
enum E{ E1 = 0x1, E2 = 0x2, E3 = E1 | E2 }; または E e = static_cast<E>( E1 | E2 ); だけどcastするぐらいだったら int e = E1 | E2; にして E1、E2もconst int 型にする方が良いと思う。(またはstd::bitset) 後 E e = E1 | E2; はgccのc++0xではErrorになる
>>797 > 1. ビット演算のような用法 ( e = E1 | E2; )
それはない。
C++では列挙子同士のビット演算の結果を その列挙型にキャストなしで戻せないからね ビットフラグを扱う変数は普通の整数型にするしかない 個々のビットフラグをconst intで定義するかenumで定義するかは趣味の領域か
C++の場合、暗黙のうちに整数型へ昇格されるから各種演算が可能なだけで、 列挙型の演算自体はデフォルトでは定義されないからな。 Cなら列挙型への暗黙の型変換があるから何でもできるが。
inline関数化して違う型同士のビット演算を弾くべき
コギレイに static const へ乗数入れる方法教えて。
いみふ
ファクトリでインスタンス生成して複数の他のオブジェクトに所有させるとき 削除の責務を何処に負わせるのが良いでしょうか? 共有してる側に負わせると、共有側それぞれの寿命までキニシナイと行けないようになるし ファクトリにどんなインスタンスを生成したか記憶させるようにして 動作終了時にごそっと削除させてしまうべきか・・・?
よろしい君にshared_ptrを使う権利を与えよう
スマポが基本じゃね
using namespace boost; bind( CHoge::hoge , this , 50 , _1 , _2 , _3 ); を c++0xでboostを使用せずに記述する方法は無いでしょうか。
>>804 staticメソッド作っておいて初期化でそれ使うぐらいしか思いつかん
ラムダ関数は使えないのか?
テンプレートの例題を見ると、変数xとyの値を交換するってのがある こんなの本当にプログラミングで使うのか? テンプレートってobject型の代わりに使っているような印象を受けるんだけど
swapを使うこともない程度のプログラムしか書かないなら、たぶん一生テンプレートの恩恵は理解できない
>>811 ヒントありがとうございます
f = [this](int a1,int a2,int a3) -> void { hoge(a1,a2,a3); };
で解決しました( VC10で確認 )
ただ残念な事に gcc4.4 を使用しているので当面は boost::bind の方を使用します。
半年待ちかな
配列のバッファオーバーランが生まれてる場所って知る方法ないの? どっかでぶっ壊れてるんだがまったく特定できん…
assert使えばいいじゃない
>>815 デバッガにメモリの特定の箇所が変化したら止まる機能があるかもしれないから、
毎回決まった箇所が壊れるなら、それ使えばいい。
VSにはあった。
>>817 まじで。スレ違いだけど教えてもらっていい?vs2008proで出来る?
>>818 手元に2008がないから確認できない。
2005proなら、メニューの「デバッグ」→「ブレークポイントの作成」→「新しいデータブレイクポイントの作成」でできる。
>>820 選択できないんだけど、どうすればいい?
あ、ごめんデバッグ中にやればいいのか。
int/intをやったときに小数点以下が「切り下げ」られるってのは保証されてる?
うん
てんきゅー
>>823 -x/y だと 89 と 99 で結果が異なる CPU もあるんじゃなかったけ?
たしか、89 だと CPU 依存で 99 だと厳密に来ていされていたような気が…
# 完全にうろ覚え
828 :
デフォルトの名無しさん :2010/07/03(土) 13:10:28
gcc4.2 mac osx で次のコードがコンパイルできません。不可能なのでしょうか。ご教授下さい。 template< class T > class A { public: A() { std::vector< A< T > > vec; } };
>>828 vectorのところでA<T>のサイズが決まらないからじゃなイカ?
vector<shared_ptr<A<T>>> vec;
で試すでゲソ
explicit なんですか、これ?
暗黙的型変換を抑制するキーワード
832 :
830 :2010/07/03(土) 19:29:19
Windows 7 Borland C++ 5.5.1で、カラー画像を指定した閾値で2値化するプログラムを書きました。 プログラムで処理した画像をout.bmpとして出力しているのですが、 この画像をプログラムを終了させることなく表示する方法はありませんか?
閉じろ
>>833 GUIを扱えるように勉強する
system関数等でwindows付属のビューア等を呼び出す
あたりかな
system("out.bmp");
838 :
デフォルトの名無しさん :2010/07/05(月) 14:21:21
出力と入力が決まっていない関数は f(cin , cout ); って感じの関数を作ればいいですか? cinとかをfinとかに変えても動作するみたいにできますか?
Foo f(std::istream& in, std::ostream& out);
ありがとうございます。
ヘッダファイルって何であるんですか? ヘッダファイルはコンピュータにとって何処が美味しいの
ヘッダーはコンパイラのためにあるよ
844 :
デフォルトの名無しさん :2010/07/06(火) 06:27:36
vector<クラス*>のobjがあって(* objのイタレータ)->idというint型のメンバがあるのですが vector<クラス*>の要素数は最大10個で idは1〜10までの整数で、重複しないようにしたいのです vector<クラス*>に要素を追加した時にそのidメンバに他のvector<クラス*>の要素が持ってない整数を入れたいです 例えば今要素5個のvctor<クラス*>があったとして前から並べた時にidが3,5,2,6,0のような場合に 6個目のvector<クラス*>を作ってそのidに3,5,2,6,0以外の1〜10の整数のうち一つ(無い値ならなんでも良い)を入れたいのですがどうすれば良いでしょうか?
vectorじゃなくてmapを使う
10個程度なら、総当りで使ってない整数を探したらいい
>>844 たとえばクラスをFooとする。
Foo *valids[10] = {0};
vector<Foo *> v;
for (int i = 0; i < 10; i++) {
if (!valids[i]) {
Foo *foo = new Foo();
foo->id = i;
v.push_back(foo);
valids[i] = foo;
}
}
ユニークな整数のリストを共有して そこから借りたり返したりする
入門Qt4プログラミングで OvenTimer::OvenTimer(QWidget *parent) : QWidget(parent) { //関数の中身 } という表現があるのですが、 「: QWidget(parent)」の部分は何を意味しているのでしょうか? OvenTimerクラスはpublicでQWidgetクラスを継承しています
>>849 C++の基礎を勉強しなおせ
基底クラスの初期化子
>>850 ベースクラスのコンストラクタの引数がポインタなことに違和感があって、
何か意味があるのかなと。。。参照ならしっくりくるんですが。
私に基礎がないからなんですね?頑張って勉強します。
> ベースクラスのコンストラクタの引数がポインタなことに違和感があって、 なんでだよw そのコンストラクタの引数も単にポインタでしょうにw
>>853 コピーコンストラクタとかでは参照で受けるようにするのが普通だと思っていて、
そのコンストラクタを呼び出してもいいはずなのに、あえてポインタで受けるコントラクタを用意して
そのコンストラクタを呼び出すのは何か理由があるのかなと思ってしまったんです。
サブクラスのコンストラクタでベースクラスのポインタを受けるのは、
そのベースクラスがisでなくhasな場合もあるだろうし、
あまり違和感を感じないんです^^;
そもそも自身のポインタを受けるコンストラクタって用意するのが普通なんでしょうか。
ってことからわかってない><
> そもそも自身のポインタを受けるコンストラクタって用意するのが普通なんでしょうか。 厳密に言うとおかしい。自身のポインタってのをthisのことだとすると。 自身のポインタを受けるコンストラクタっていう表現が。 コンストラクタにそのインスタンスのthisポインタを渡すことなどできない(?)し、 コンストラクタの初期化リスト呼び出しが終わったあと、 コンストラクタ本体へ処理が移らないとthisは使えない。 自身のポインタってのがQWidget(parent)に対する、 QWidget *parentのことであるとするなら(多分そのつもりなんだろうけど)、 クラスとインスタンスの違いが分かってない可能性すらある。 分かってるんだとしたら、そういう質問出てこないと思う。 たとえば、古典的なリンクリストを実装しようとしたら、 Node::Node(Node *next)っていうコンストラクタがあっても不思議じゃないし、 双方向だとしたらNode::Node(Node *next, Node *prev)ってのがあって不思議じゃない。 GUIのコンポーネント間に親子関係があるとき、 親が子を知っていることにくわえ、 子が親を知っていることもあたりまえによくあること。 だから、OvenTimer(QWidget *parent) みたいにコンストラクタで親オブジェクトを渡す。 コンストラクタだからどうあるべき、ってんじゃなくて、 あくまで用途ありきでオブジェクトやクラスなんかもあるし、 どういうコンストラクタを設けるかも、あくまで用途次第。 > そのコンストラクタを呼び出してもいいはずなのに つまり、コピーする目的じゃ無いと思われ。
>>855 ありがとうございます。
>厳密に言うとおかしい。自身のポインタってのをthisのことだとすると。
インスタンスの話ではなく、型の話です。ですから this のことはないと思っています。
>Node::Node(Node *next)っていうコンストラクタがあっても不思議じゃないし、
リンクのノードならしっくりきます。全然普通です。
>つまり、コピーする目的じゃ無いと思われ。
ということなんですね。よくわかりました。謎が解けました。
自身の(コピーによる)初期化ではなくて、あくまでメンバの一つにそのポインタを格納しているんですね。
そういう想像が直ぐにできなくて、不思議な書き方だなと思ってしまいました。
勉強になりました。ありがとうございました。
>>856 >メンバの一つにそのポインタを格納しているんですね
それも違う・・・・・
いいからC++の勉強やり直してこいって
>>857 例えばノードの場合だったら、
Node::Node(Node *next) {
// m_next 以外の初期化
m_next = next;
}
だと思ったので、同じように
m_parent = parent;
というコードがあるんだろうと理解したんですが・・・
うーん、なんかまだまだわかってないことがありそうですね、
まだ3週目ですし、もっと勉強してから質問します。失礼しました。
859 :
849 :2010/07/06(火) 19:50:52
勝手に話が進んでてワロタ
>>850 どうもありがとう
質問です。boost または stl の function です。 std::function<A(B, C, D)> func1; std::function<A(C, D)> func2; B b = 10; func2 = xxx(func1, b); 上のように、テンプレート引数Bのみを拘束する、汎用的な xxx のような 機能をする関数とかありますでしょうか? bind だと、引数ごとにプレースホルダが必要ぽいので、面倒なんです。 よろしくお願いします。
質問です 音を扱うプログラムにて #define RATE_44100 0xac440000 という定義を見ました 16進数でac44が10進数の44100に相当することは分かっているのですが、そうすると定義のように 0を余計に4つもつけている意味はなんでしょうか? はじめ16進数でac440000が44100相当なのか、でも計算が全然合わない、と悩んだのですが・・・
上位16bitと下位16bitに分けてるんだよ。
すくなくともそのまま整数での意味じゃないよなその名前。 $ ruby -e 'p 0xac440000' 2890137600 $ ruby -e 'p 0xac44' 44100 なんかしらのビット演算をしようとして、 ac44を44100と名づけなおすことに何かメリットがある、 からそうなってるのか、 あるいは勘違いか。
864 :
861 :2010/07/07(水) 12:54:27
釈然としませんが半ばブラックボックス関数で扱われている数値であるので
>>862 で指摘されたとおり、関数内部で上位下位16bitで分けられていうるようです。
>>862-863 すばやいご返答ありがとうございました。
865 :
デフォルトの名無しさん :2010/07/08(木) 03:55:10
タイマーを使いたいのですがSetTimerは引数にHWNDがあるのでいろんな場所で使えませんよね? HWNDを引数に持たない自分で作った関数の中でタイマーをセットするにはどうすれば良いのでしょうか?
ヒント:SetTimerの第四引数
>>866 調べてみましたがよくわかりませんでした
void hogeA()
{
この関数中で大麻を窃盗
}
CALLBACK MsgProc( HWND hWnd〜)
{
大麻が経過したら最悪ここでhogeB関数をする、KillTimer
}
という感じにしたいのですが大麻 凍る獏関数というのが使えるのでしょうか?どうすれば良いのでしょうか?
型だけ同じコールバック関数を作ってその関数の名前を第四引数に入れたらいいんだな わかりやすく書けよ 乙!ありがとな!
monodevelopで#include <stdio.h> int main (void) { int num; num = 0; float f; f = 0; printf("整数を入力してください:"); scanf("%d", &num); printf("浮動少数点数を入力してください:"); scanf("%f", &f); printf("%d ", num); printf("%f", f); return 0; } を実行しても 整数を入力してください:浮動少数点数を入力してください:0 0.000000 と表示されるだけで入力ができません 何か問題があるのでしょうか?
>>863 RATE_44100から、CDのサンプリングレート44.1kHzを連想出来ないキミはPGに向いていない。
これだからruby脳は…
>>870 うるせー馬鹿w
CDのサンプリングレート44.1kHzなんか知らないっつーの。
LZ法で圧縮したっていうデータのバイナリを見たら データの中間辺りで、00 00 00 00と00が凄い連なっていたんだが LZ法でこういうデータを吐き出すケースってどんな時? スライド窓とか大きく確保しても、こうならないと思うんだが…
870の方が馬鹿だね。
1G所か10G合っても連なるのか怪しいな
下位アドレスを豪快に端折ってるコンテナ形式とかだったら詰め物の可能性もあるね
プログラムで生成した画像データを連番のファイル名で保存したいと思っています。 for(i=0;i=<100;i++) sprintf(str,"out-%d.jpg",i); というプログラムを書いたのですが、出力は out-0.jpg out-1.jpg・・・out-10.jpg ・・・ out-100.jpg と桁がそろっていない形になっています。 出力する数字を3桁にして、out-0.jpgをout-000.jpgとなるようにする場合、 どうしたら良いですか?
%d -> %03d
struct{ std::string text; int number; int count; } data; std::vector<data> このようなdataの配列があるとして、textとcountが重複している要素があったら重複しないようにしてcountは足すという事をしたいのですが、 単純に前から順に比較していって新しい配列に結果を格納していくという方法しか思いつきません。 速い方法があったら教えて頂きたいです。
>>881 どういう処理をさせたいのか分からないけど、
その構造でそういうやりくりするのって、
すっげー始末が悪いと思う。
>>881 >textとcountが重複して
textとnumberが重複してたらcountを足すんじゃなくてtextとcountなんだな?
じゃぁvectorの全走査でしかたないんじゃない?
判定に使うcountが変動するんじゃ、
単純に前から比較しなくて済む方法使った場合格納時に並べ直す必要が出ちゃうし
24bitのビットマップで表現出来る色(256^3)色をすべて含めた1枚の画像を作りたいです。 1画素に1色とすると(256^3)画素が必要だと思うので、 √(256^3) = 4096で、4096×4096の画像を出力することになりますよね? そこで、出力用の配列としてimage_out[4096][4096][3]という配列を用意したのですが、うまく色が入ってない様です。 for(i=0;i<255;i++){ for(j=0;j<255;j++){ for(k=0;k<255;k++){ image_out[l][m][0]=k; image_out[l][m][1]=j; image_out[l][m][2]=i; m++; if(m==4096){ m=0; l++; } } } } この様なプログラムを書いたのですが、どう修正したら良いでしょうか?
なんで<255
あー 256か<=255か・・・・ でも、同じ色の菱形ができるんです・・・
スレ違いかも知れまんが質問させてください。 現在中学二年生で工科高校のシステム科を受験しようと考えています。 それに伴い、C言語を学習しようと考えているのですが、どのような事をまなべばいいのでしょうか? いままでHSPというwindows用のインタプリタ言語を使いゲーム制作をしてきました。 C言語でもゲーム制作を学習して良いのでしょうか?それともゲームなどとはちがうソフトウェア制作を学習したほうが良いのでしょうか。
>>887 ゲームで学ぶことを知っているのなら、
ゲームで学んで十分。
構造体やポインタ、メモリの動的確保。
全部ゲームで押さえることができる。
むしろゲームは集大成っていう
普通高校に行きなさい
工業高校は高卒で地元企業で一生下っ端もしくはたたき上げになるつもりがなければ行くメリット無し。 普通の進学校いけ。プログラミングは学校で学ぶもんでもない。 やりたいことなんていつ変わるかわからんのだし。
プログラミングは独学するやる気があるなら全く学校に拘る必要はない。
これからのIT産業は斜陽産業だぞ? 景気の良かった頃でもゲーム開発は社員の寿命が短かった (若くても辞めざるを得なくなる) あまり勧められんなぁ
入り口はどうあれ、結局最後は独学だよな。 いかに言語の規格を正しく理解するか。 コードをいっぱい読んでイディオムを見出し、 設計に躓きまくってデザパタにも親しむ。 APIリファレンスとホワイトボードだけが友達。
はっきり言って常に新技術の勉強を続ける覚悟がいるぞ。
>>895 若い頃は簡単でも歳食うとこれがまあかなり難しい。
みなさんありがとうございます。 別にゲーム制作を本業にするつもりは全くないです。 ただ工科高校のシステム科は就職率が高いとのことなのでそちらを進路に選択しました。 家庭事情的にも働かなければいけないので大学に行けないので… それならプログラムをまなぶ前にパソコン検定などの資格を取り、基本的な操作を学んだほうがいいのでしょうか?
書き込んでから気付いたのですが、はげしくスレチですね。 スルーで構いません。無駄レスすみませんでした。
このご時世高卒がありつける仕事なんてどこ行こうが変わらんよ
マ板に帰れお前ら
あと
>>887 も行け
スレチどころか板違いだ死ね
ハ,,ハ
(*゚ω゚ )
>>900 お断りします
. (=====)
_(_⌒) )
/\ `J  ̄ ̄\
 ̄ ̄ ̄ ̄| | ̄ ̄ ̄
|
/ \
 ̄
902 :
名無しさん@そうだ選挙に行こう :2010/07/11(日) 20:28:31
2ch書き込み用のライブラリって何がありますか?
socket.h
あ、いやなんかごめん
>>902 現在無いので
httpを簡単に扱えるライブラリ(これはいろいろある)を探して
monazillaあたりで、書き込みの方法を調べるのが割と楽かと
>>907 いや嘘じゃねーよ。socke.h使えば2ch書き込みだってできるっつのふざけんな。
2ch書き込み用のライブラリか?って言われると確実に嘘だけどな
dolib
2chの書き込みなど簡単だろ。スクリプト言語のブラウザ動作真似るやつ使え。 UWSCなら手動操作をスクリプト化出来るし。
それよりも、P2P掲示板作ってくれよ。 そしたら、規制掛からないし。いいよ。
FreeNet
javaの場合はthis()で違うコンストラクタを呼び出すことができます でも、C++の場合は別のコンストラクタを呼び出してはいけないらしい なんで、C++の場合は他のコンストラクタを呼び出しちゃダメ何ですか?
規格でそう決めたから
917 :
915 :2010/07/12(月) 22:06:18
>>916 それじゃ、似たような処理の場合はどうすればいいんですか?
>>917 できないんだから、一般的な代替手段なんて無い
具体的に行ってくれれば方法提案してやるよ
919 :
915 :2010/07/12(月) 22:22:18
そうか、わかったよ ありがとうな
そして作られるInitialize
そういう場合はinitメンバー用意してなかでと配置newかな アラインメントが解ってないと事故に繋がるかもだけど あと0xなら普通にほかのコンストラクタに委譲できる
it = hoge.begin(); while( it != hoge.end() ) { // Action ++it; } これと for (it = hoge.begin(); it!=hoge.end(); ++it) { // Action } これって全く同じ?
いや違うよ 書き方が
動作、結果は同じ まあ聞き方がよろしくない
continueが混じってたりして
それは気づかなかった
PNGとBitmapってあらゆる面でPNGの方が優れているような気がしますがどうなのでしょうか?
板違い
低級PGは黙っていてもらえますか?
知ってるけど低級PGなので教えられない
Low Level Programmingが好きじゃないと (C/C++を使うのは)難しい。
全部の単語の先頭を大文字にする奴って 英語の出来ない人に多いよね(核爆)
CIAに喧嘩売ってるのか
FBIディスってんの?
#if defined(DEBUG) printf("test"); #endif こんな感じでデバッグプリントがC/C++には沢山残されているわけですが、 これってデフォなんですか? マクロがあると可読性が下がってしょうがないんですけど
マクロちゅうのはやな、自分のために使うもんであっておまえさんのために使っているわけやないんで
>>936 >C/C++には
お前が読んでるソースが世界のすべてか?
#ifndef(NDEBUG) # define dprintf printf #else # define dprintf (void) #endif __VA_ARGS__が使える環境なら #ifndef(NDEBUG) # define dprintf(...) printf(__VA_ARGS__) #else # define dprintf(...) ((void)0) #endif
デバッグ切り替えマクロってNDEBUGを使うのが標準的なの? DEBUGとか_DEBUGとかいろいろあって迷っちゃうよね
俺普通に_DEBUGだけど
標準C/C++で言及されているのはNDEBUGのみ(assertについてだけ)だろ。 DEBUGとか_DEBUGについては完全に環境依存。
std::string.find()で複数の文字を見つけるにはどう書けばいいのでしょうか? たとえば"RED"または"BLUE"でどちらか先に見つかった方の場所を戻り値として得たいです
どう書くもこう書くもねぇと思うが…
分からないなら回答しなくていいです ちなみに自分で実装することにしたのであなたの力及ばずといったところでしょうか
本当のバカだったのか…
質問です。 hoge<int(int, int)> 上のようなテンプレート引数を受け取るためのhogeの記述がわからないのですが、 受け取るための方法を教えてください。 あと、このような書式に名前とかあれば、それもお願いします。
教えるも何もねぇよ…
>>945 >>949 もし真面目な質問なら、もう少し真面目に質問しようよ。
まぁただの荒らしだとは思うけど。
template <class> class a; template <class d, class g> class a<d(g)>{}; 特殊かしただけ
953 :
949 :2010/07/14(水) 18:13:26
>>950-951 すいません、説明不足でした。
template <typename T>
struct hoge
{
};
void test(void)
{
hoge<int(int)> h;
}
たとえば上のようなコードだと、T は int(int) となると思うのですが、
もはや int(int) ってどんな型なのかよくわかりません。
Tの分解方法とか、それともtypename T 以外の記述ができるとか、
何らかの情報がほしかったんです。
954 :
949 :2010/07/14(水) 18:15:50
>>952 うおおおお、なぞが解けました。ありがとう!
<> の中に何で int(int) を突っ込んでるの?
>>945 min(s.find("RED"), s.find("BLUE");
括弧足りねぇorz min(s.find("RED"), s.find("BLUE"));
それはコスト掛かるぞ。検索文字が増えたら2倍、3倍と時間食う。
自分で実装する事にしたって言ってるんだから放置しとけよ。
マクロ/定数は全部大文字でアンダバー区切りが普通なのか?
割とそういうところが多かった。最近は、必ずしもそうじゃない。
>>961 昔も今もマクロの命名規則だけはどこで見ても大文字アンダーバー区切りだったが・・・
assertマクロとか小文字で命名したやつは死ぬべき
>>960 別に決まってないけど複数人プロジェクトで変数名と変わらないような値付ける奴が居たら俺は殴りにいく
errno ってマクロだよな
putchar()とかもマクロだよな。
std::assertってできないのが不快
std::stringに入っている文章で ' と " をエスケープしたいのですが PHPでいうreplaceみたいなのって無いみたいなので、どう置換したらいいでしょうか? stringのreplaceはなんか別物みたいですし。 それかPHPのmysql_escape_stringみたいなのないでしょうか。
>>970 ありがとうございます。
自分では検索で探せませんでした・・
972 :
デフォルトの名無しさん :2010/07/15(木) 19:23:54
Humanクラスのインスタンスを格納する配列peopleの大きさを静的に決めて情報を格納することはできたのですが 配列のサイズを動的に決めたい(今回はファイルの行数分)場合どうすればよいのでしょうか? int size = getSize(); <-ファイルの行数 Human *people = new Human[size]; のようにしてもpeopleを利用する際に以下のようなエラーが出ます。mallocを使った場合でも同じエラーでした。 'Human *' から 'Human *[]'に変換できません。 インスタンスの配列の扱いに慣れていないので操作がよくわかりませんでした。 最悪、配列の要素数さえわかればいいので動的でなくともいいのですがお教えいただけないでしょうか sizeOf〜で要素数が求まるのはわかっているのですが要素が入っている分だけが知りたいので動的に作ろうと思いました。
すいません規制明けでsage忘れてました
vectorじゃだめなん
vectorも試したのですが'Human *' から 'Human *[]'と似たようなエラー(詳しくは覚えてないですが型が合わないエラー) が出てしまって方法を変えました。一応もう一度やり直してみようと思いますが望み薄いです。
こう? std::vector<Human> people( size );
int main(int argc, char *argv[]) どうやったら、argvの長さを取得することができるの? C言語の勉強をしないで、C++の勉強をしているからわかんね
長さって何? 要素数ならargcで各要素の文字列ならstrlenなりなんなり
979 :
977 :2010/07/15(木) 21:54:39
>>978 argcってargcの要素数が入るのね
知らんかった
thx
そんなもんさ
配列でもSTLコンテナでも何でもいいんだけど、 その中からとあるキー(数値)を探して、見つかったらそれを削除すると共に1を返す、て関数は 走査に必ずO(N)かかるよね この関数を別々のキーで複数回呼ぶとその回数×コンテナの内容物分の処理が増えるんだが、なんか勿体無い気がする 何か上手い方法はないかな
>>981 map/set はO(log n)
unorderdはO(1)
最近のこは基本的なデータ構造も勉強しないのかね
>>981 根本的なこともわかってないのに、勿体無いかどうかの判断をしない方いいよ。
初心者のうちはパフォーマンスより、分かりやすコードを心掛ける方が懸命だね。
O記法知ってるのに、なんでSTLのコンテナが必ずO(N)なんてことを思ってるんだ。
アラ探しして弄るのが楽しいか? お前ら病んでるぞ。 O(N)のコンテナに関して言っていると、好意的に解釈してやれよ。
987 :
デフォルトの名無しさん :2010/07/16(金) 12:15:38
イベントの優先度について質問させてください。 イベントの優先度について記載が行われているサイトはないでしょうか。 MSDN2005を見ていて [WM_TIMER]の優先度はlowだというのは見つけたのですが、 [WM_CREATE]の優先度の記載が見つけられません。 [WM_TIMER]よりは高いとは推測していますが・・・ また[WM_TIMER]の処理が溜まっているために、 画面の表示が行えなくなることというのはありえるのでしょうか。 コーディングした画面は、 [WM_TIMER]の処理が溜まっていても表示されるのですが、 IDD_ABOUTBOXの画面だけ表示されないという現象が発生して、 困っています。
言葉足らずだったが
>>986 で正解
つーか聞いてんのはそこじゃないが。
>>987 CreateWindowを呼び終わった後ですでにWM_CREATEは処理されてるはずだけど
ウィンドウを作っただけで表示する処理を入れてないだけじゃね
990 :
987 :2010/07/16(金) 13:37:53
>>989 言葉足らずで誤解させてしまいました。
申し訳ありません。
SetTimer(WM_TIMER)を受けた先の処理が正常系の場合には、
IDD_ABOUTBOX(フォーム方で最初から準備されているダイアログ)は表示されます。
他のダイアログの表示もできています。
異常系(処理に遅延が発生する)の場合は、IDD_ABOUTBOXだけ表示されないんです。
他のダイアログは表示できています。
表示する処理が抜けていることはないです。
SetTimerを10msとか不必要に値を小さくした時に指定したときに、
正常系でも、現象が発生することはあります。
そのため
[WM_TIMER]とIDD_ABOUTBOXと限定して質問していました。
あと。。。
IDD_ABOUTBOX、
見えない(disible=False)けどアクティブウィンドウで作成されているようで、
Enterキー押下でイベントを発生させています。
>>988 「O(N)のコンテナで、複数のキーでサーチすると処理がN*キーの数になるけど
なんとかなりませんか?」とか、そんな質問されても、複数のキーで舐めながら
ループしろくらいしか答えられないだろ。
>>976 今vectorで作成してみたのですがHumanのコンストラクタが以下のような感じで(splitはファイルからとってきたデータ(string型のvector))
Human::Human(){
int age = atoi(split[0].c_str());
string name = split[1];
int number = atoi(split[2].c_str());
}
以下のようにしてインスタンスを生成し
Human * human = new Human(split);
格納はできました。インスタンスを格納しているので宣言は以下のようにしました。
std::vector<Human *> people( size );
ただまた問題が発生しました。以前Human型の配列を使用していた際は配列のポインタを渡せば簡単に他のクラスでも配列の操作ができました。
しかしvector型の場合はどのようにして他のクラスでデータを操作すればいいのかわかりません。
ポインタは試したのですが型が合わないとエラーが出てしまいました。
gdgd長くなりましたが「配列を渡し配列を返す。」という操作をvectorを利用して行う方法が知りたいです。
>>991 それよりも良い方法があるかもしれないから聞いてんだろうが
テーブル化とかキャッシュとか
自分が知らないだけでイベント管理の常套手段として使われるアルゴリズムがあるかもしれないし
それくらいしか答えられないなら黙っとけ
>>993 だからそういう答えをするのに、質問が大まか過ぎるっていってるんじゃん。
すごい初歩的だったりあいまいな質問に、それに見合った答えをしてやると、 「そのくらい分かってるよ」とか言い出すやついるな。 じゃ最初から書いとけよ。
>>992 コンテナにインスタンスを直接入れる事はあまり推奨されない
インスタンスへのポインタを入れれ
だいたいそうしないとポリモーフィズムが出来ないだろ
そしてboost::ptr_vectorを使えばポインタが失われる時に自動的に
デストラクタを呼び出してくれるから都合がいい
そうしないとクラスの中身によってはメモリリークが起きる
何この馬鹿。
>>996 JavaやRubyの感覚でインスタンスを突っ込んでました。ポインタに変更し配列の受け渡しもポインタを使って普通に行うことができました。
格納されたインスタンスのポインタから各フィールド(age,nameとか)を取得する方法がわかっていませんがもう少し自力で調べようと思います。
ありがとうございました。
>>998 なんで、イタレータを使わないの? 折角vector使うのならイタレータを渡せばいいのに。
∧,,,∧ ( ・∀・) 1000ならジュースでも飲むか ( ) し─J
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。