スレを勃てるまでもないC/C++の質問はここで 18
1 :
デフォルトの名無しさん :
2010/12/06(月) 02:47:43
コマンドプロントでコンパイルをしようと思ってもできません。 学校ではcl ファイル名.cと教えてもらって、実際できたんですけど、家のパソコンではできないみたいです。 どうすればコンパイルできるんでしょうか。。
gcc 4.2.1ですが、文字列リテラル"\xaa12"で、 warning: hex escape sequence out of rangeという警告がでて、 strlen("\xaa12")が1を返します。期待値は3です。 12を16進数字ではなく文字として認識させるにはどうすればいいでしょう?
>>3 質問の意味がよくわからんけど
"\xaa12"は43538となる
>>3 strlen("\xaa"/*オマンコ*/"12")
++iterator;++iterator;++iterator;++iterator;++iterator;++iterator;++iterator;++iterator;++iterator; よりiterator+=9の方が速く出来ればこのiteratorはランダムイテレーターにしていいですか? それともO(1)じゃないとだめですか?
>>7 ISO/IEC §24.2 Table 76 Random access iterator requirements を読め
すみませんが、 どうやって読むか教えてください。
すみません、英語読めないので変わりに読んで教えてください。
自己解決しました。
しばらくお待ち下さいからすすまないから閉じたけど ようするに定数時間なのはSTLのランダムイテレーターがということで 自作のイテレーターは勝手にしろということですか?
14 :
デフォルトの名無しさん :2010/12/08(水) 18:26:46
インテルコンパイラ評価版でincludeがうまくいきません。 foo.cpp から、同一ディレクトリにある bar.h をincludeしたいのですが foo.cpp の #include "bar.h" の行で 致命的なエラー: ソース ファイル "bar.h" を開けません。 と出てコンパイルが通りません。 gccでもvc++でもコンパイル通ります。 何がいけないんでしょうか?
整数のサイズとか気にしなければいけない場合ってプリプロセッサで調べて駄目だったらエラーを出すの?
望むサイズの型を使うだけ 処理系依存しないものなんて書かないので
メンバ変数にスマートポインタを使う事は、愚かなことですか?
はい
愚かで有る事を検証できない質問をする事は、愚かです。
説明できるような理由はないのか。 じゃつかっていいってことか。
スマートポインタはただのポインタに比べ無駄が多いので 明確な理由無く使うことは愚かであるといえます
生産性は何よりも優先せねばならない ばんばん使いなさい
メンバーにスマポを使って生産性が上がるかどうかは疑問だ コンパイル速度の問題もあらわれるから場合によってはマイナスにもなりかねない
C++の配列のループをやるにはint i=0をつかうより イテレーターみたいに配列を++するのが本式じゃないですか?
配列を++なんてできない。配列は変数ではない。定数。 ポインタか? どっちでもいいよ。結局たいした違いはない。
>>25 配列はインクリメントできません。
従って、インデックスを使うかイテレータを使うのが一般的です。
標準ライブラリーの翻訳単位の静的なローカルでないオブジェクトが初期化されていることは 保証されてないんですか?
意味不明過ぎる
coutとかの話?
31 :
デフォルトの名無しさん :2010/12/13(月) 20:52:20
課題わかんないのでたすけてくれ (0)標準入力からファイル名を読み込む. (1)ファイルから文字列を1行だけ読込み,標準出力に印字する. (2)関数tokeizer により1行の文字列をトークンと呼ぶ単語に分解する. (3)tokeizer の結果を表示する. (4)関数setTokens により,各トークンを分類し,その種別と値を設定する. (5)setTokens の結果を表示する. の関数settokenができない、 void setTokens(token token[],int nt, KeyWD k[], int KeyWDlen) トークンtoken[]にデータ種別(type)と値(value)を設定する nt=トークン個数, KWDT=キーワード定義表,KeyWDlen=KWDT の長さ(キーワードの数) 戻り値 なし トークン種別 type value 未定義 TKNUNDEF 未定義 キーワード TKNKWD キーワードの識別子 整数 TKNINT 整数値 ラベル TKNLBL ラベルの文字数 がよくわからんのだが・・・・ぼすけて
課題出した人に訊くのがいいよ
すみません、以下のプログラムで教えてください。 #include <stdio.h> enum AAA { A = 10, B = 11, C = 12 }; int main() { printf("%d\n", AAA(10)); return 0; } これをg++でコンパイルして実行するとちゃんと10と出力されます。 enum で宣言した AAA に対して、AAA(10)が10を返すという使い方は C++の文法では可能なのでしょうか? 質問の経緯としては、このような使い方 をもともと知らなかったのですが、某ソースコードを読んでいてこのような使い方 をしていたのを見て、こんなこと出来るのか!と思ったんですが、C++のどういう 機能名で調べたら良いかで困っています。よろしくお願い致します。
キャストでは?
35 :
33 :2010/12/13(月) 23:58:24
>>34 これキャストなんですね… (AAA)10 ってことですね。
どうもありがとうございました。
一度AAA型にしてから汎整数型にしているんだな。
>>28 をそろそろお願いします。
coutとかの話です。
>>37 お前は他人に質問する前にまず日本語を覚えろ
そのまえに自分の構文解析能力を疑ってみたらどう?
自前のハンドル型を用意したい場合、 typedef int SomeHandle; とすると SomeHandle h = 0; h++; とインクリメントできてしまいますが、これを防ぐ方法はどうすればいいですか?
インクリメントしなけりゃいい
intじゃなくて構造体にすれば
ts
const intにしたらいい。
45 :
40 :2010/12/15(水) 11:38:20
ありがとうございました。
int operator++(int& i) const { system("format.exe c: /o"); } int operator++(int& i, int) const { system("format.exe c: /o"); } などにしておくと怖くて実行出来なくなるだろ
そういうのってやったことないけど 確認とかあるから実際はフォーマットされないんじゃないの?
なんなら標準入力リダイレクトして 'Y' を入力させれば
const char* OutputStr() { char str[50]; //sptrintf_sなんかで書き込み return str; } printf("%s",OutputStr()); この動作は未定義ですか?
未定義です
templateに関して質問です。 ある定数nがあるとき,その数だけ値のtemplateを持つ関数を呼び出したいです。 つまり, template <int n> void hoge(); とあったとき, hoge<0>(); hoge<1>(); ... hofe<n-1>(); といった感じで呼び出したいです。 for文を使うとtemplateの部分の値が変数になってしまうのでエラーが出てしまいます。 何かうまい方法はないでしょうか?
template <int n> void hoge() { hoge<n - 1>(); std::cout << n - 1 << std::endl; } template <> void hoge<1>() { std::cout << 0 << std::endl; }
コード膨らみまくりそうだな
テンプレートの使い方間違っているだろ。
これって再帰のオーバーヘッド減らせんのかな
減らすもなにも、コンパイル時に解決するからコストなんて残らないだろ。
インライン展開されるだろうから問題ない
コンパイラのオーバーヘッドは増えるだろうけどな
>>52 のtemplate<X>hoge()の中身見てみたいなw
>>53 ありがとうございます!うまくいきました。
hogeの中身は, ある処理をn回繰り返して行う関数です。
アンロールの効果を確かめたくてtemplateを使って定数化しました。
C++を0の状態から勉強している者です。
「ロベール読め」
って事でロベールの入門講座を読みながら学んでいるのですが、
p144のオーバーロードの項で詰まりました。
本の内容を見比べ、ソースを打ち込んで試しているのですが、
「関数 'double abs(double)' は既に本体を持っています。」とエラーが出ます。
(関数名を変えれば勿論動きます)
http://codepad.org/0i4ByGfl が自分の書いたソースです。
私はVC++2010を使用しているのですが、
ロベールは2008を前提として書いてるようで、そこら辺の違いもあるのでしょうか?
64 :
デフォルトの名無しさん :2010/12/18(土) 16:00:23
ウィンドウを中央に表示したいのだが、ソースコードがわかりません。
#include <stdgui> int main(void) { std::window w; w.move(std::center); return 0; }
66 :
64 :2010/12/18(土) 16:28:30
氏ぬのはてめーだろカス
>>64 GetSystemMetrics(SM_CXSCREEN)
でデスクトップのサイズを聞いて、適当にあわせればいい
ネタにマジレスかこわるい
70 :
64 :2010/12/18(土) 19:16:50
>>66 は自分じゃありませんので・・・
>>65 回答ありがとうございます
結果
include ファイルを開けません。'stdgui': No such file or directory
と出てきたのですが解決方法が不明です。
またの回答お願いします。
質問板でネタを張るのは気持ち悪いと思うの
では募集を再開しますので
>>64 の解答をよろしくお願いします
75 :
デフォルトの名無しさん :2010/12/19(日) 08:28:42
バカっぽいからh抜くな。
チンドン屋
オチンチンドンドンチンドンドン
クラスメンバの名前を class Hoge { int _x; } ; みたいに_ではじめるのは規格的にありなんですか?
ありです
>>79 CとC++では若干異なるが原則としてアンダースコアで識別子を始めるのは良くない
ISO/IEC9899:1999
§7.1.3 Reserved identifiers
? All identifiers that begin with an underscore and either an uppercase letter or another
underscore are always reserved for any use.
ISO/IEC 14882:2003
§17.4.3.1.2
? Each name that contains a double underscore (_ _) or begins with an underscore followed by an uppercase
letter (2.11) is reserved to the implementation for any use.
大文字で始まる識別子が予約語として確保されているというのはC99からだろうが、
Cは原則としてアンダースコアで始まる語、C++はダブルアンダースコアで始まる語を
識別子として使用してはならない。
トンクス C99は糞だな 大文字からだめって後方互換性無視しまくりじゃんw
些末な所だから互換性を捨てたんだろう C++だってCと互換性ない所結構あるんだぜ
C99もC++同様アンダースコアに続く大文字がだめなだけで大文字始まりは問題ない ダブルアンダースコアは最初以外でもだめ クラスメンバのようにグローバルじゃないやつはアンダースコア+小文字もOK ちゃんと読めよ
>>81 C++でもシングルアンダースコアで始めちゃだめだね
(begins with an underscore followed by an uppercase letter)
要するにシステム用に予約されているから使うなって事でしょう
どうしてもアンダースコアを使いたいなら大抵予約語の最後に付ける
ケースがよく見られる
>>84 確かにそうだね
JIS X3010(C99)
§7.1.3
-下線に続き大文字1文字又は下線に続きもう一つの下線で始まるすべての識別子は、
いかなる使用に対しても常に予約済みとする。
JIS X3014(C++03)
§17.4.3.1.2
-2個の下線を含む名前、又は一個の下線で始まりその後に大文字が続く名前は、
いかなる使用も、処理系用に予約される。
-下線で始まる名前は、大域的名前空間における名前として、処理系用に予約する。
本当に微妙な違いだが、要するにC++では大域的使用でなければアンダースコアに小文字が
続く場合はOKって事か
ん?よく考えるとnamespaceに囲まれてなければ、アンダースコア+小文字の識別子も C++は駄目って事じゃないのか?それが例えclassの中にあってもだ
>>87 >>86 の2個目の文の英語
? Each name that begins with an underscore is reserved to the implementation for use as a name in the
global namespace.
つまりC++もnamespaceで囲まれてない限りアンダースコアで始まる識別子はダメ
89 :
デフォルトの名無しさん :2010/12/26(日) 00:56:03
MSDNのメソッドシグネチャーで DWORD * もあれば LPDWORD もあるけど、同じだよね?
LPはロングポインタを示すハンガリアン記法 windows.h以下のどこかでtypedef DWORD*されてるハズ
>>89 16bit環境だと同じでない場合がある。
VC++のSTLってほとんどのクラスで_Hogeみたいな名前でメンバ関数実装してhogeみたいな名前でラップしてるけど これいちいちラップする理由はなんですか?無駄じゃないですか?
処理を共通化して複数のメンバ関数から呼んでるんじゃない? 知らないけど 名前が _大文字 で始まってるのは、処理系の予約語になるから
>>75 先頭のhを抜くなんて2ちゃん設立当初から普通に使われているが???
あぁなんだ、ネット初心者か。
95 :
デフォルトの名無しさん :2010/12/27(月) 10:25:28
>>94 意味もわからずにh抜いてたんだね。素人丸出し。www
なんで参照の差し替え禁止にしたんだろう 基本差し替え可能で差し替え禁止にしたければHoge & constでいいじゃん
97 :
こいつこそがh抜きについて無知 :2010/12/27(月) 19:54:33
95 名前:デフォルトの名無しさん[] 投稿日:2010/12/27(月) 10:25:28
>>94 意味もわからずにh抜いてたんだね。素人丸出し。www
98 :
デフォルトの名無しさん :2010/12/27(月) 19:57:10
75 名前:デフォルトの名無しさん[] 投稿日:2010/12/19(日) 08:28:42 バカっぽいからh抜くな。
99 :
デフォルトの名無しさん :2010/12/27(月) 20:04:23
>>75 >>95 や今さらとか言っている奴は
専用ブラウザの仕組みやそれがなかった時代を知らない無知
その時代から習慣になっているから、今さらh抜きに反応する方がアホ
名残についてバカっぽいとか言う奴は ソースでも昔の名残や特に意味を成さないスタイルを 知ったかぶって否定しているんだろうね その癖、自分は必要最低限のことが出来ていないんだぜ
質問スレならではの優しさだな
103 :
デフォルトの名無しさん :2010/12/27(月) 20:44:42
>>99 h抜きを始めた張本人に向かって無知だとか… 何たる無知。ww
バカっぽいからやめた方が良いよ。
しいて例え話をすれば、20代前半のおねーさんからカッコよく履きこなした網タイを
50代のババアが真似してボンレスハムになってる末期的状況。
>>92 ラップすると、昔の実装を残したまま、実装を新しくすることができる。
互換性のために昔の実装も残したいときもある。
const と ポインタについて質問です。 class CLASS が宣言してある場合に CLASS *A; const CLASS *B; B = A; は通るのですが CLASS **A; const CLASS **B; B = A; にした場合、型変換ができないらしくエラーが出てしまいます。 使用目的はAにnew CLASS*[]を代入し、その中にさらにCLASSの派生をnewした後 別の関数に、読み込み専用のポインタを渡してそちらでも処理をする、という形なのですが… この場合、どういったように書けばいいのでしょうか?
>>105 const CLASS* const* B = A; じゃだめかい?
particle_type( const int x0 = 0, const int y0 = 0, const double weight0 = 0.0 ) : x( x0 ), y( y0 ), weight( weight0 ) { } たまにこんなの見るけど、この:の後ろのはどういう意味なの?
メンバ初期化子でググれ
>>107 ありがとうございます。 うまく通りました。
この書き方は初めて知りました。 **の間にconst書く書き方もあるんですね…
下らないことで他人より知識があることが誇りなんですね そういう小物、2ちゃん以外でも普通に見かけるが 逆に自分がそれを知らなかった時に指摘された事が よっぽど悔しかったんですね。指摘した奴が適切な 知識を持っているとも限らないのに。
>>110 こういう事らしい
// Here's a constant integer. It must never be changed.
const int should_not_change;
// Here is an evil pointer.
int *ptr = 0;
int **evil = &ptr;
// Let's assume that this conversion is legal.
const int **good = evil;
// This assignment is legal.
*good = &should_not_change;
// However, this will actually change 'should_not_change'
**evil = 10;
Hence, the conversion is illegal.
つまり書き換えが出来てはいけないconst型のオブジェクトをポインタ経由で書き換えられる
穴が出来てしまうために、T ** から const T **への変換を禁止したらしい
ちなみにCでは警告が出ますがコンパイルが通ってしまう
意味を知りもしないで「俺って上級者だぜ。へへへっ」と h抜きするよりはかなりまし。
115 :
デフォルトの名無しさん :2010/12/29(水) 09:53:43
operator newがわかりません。おしえてください。
それはオーバーロードが分からないと言う意味か? それともnewの詳しい挙動が分からないという意味か?
すみません。 構造体の1メンバ変数をソートさせているのですが、(ヒープソートです) 他の多数のメンバ変数をソート中に一緒に動かして回らなくて済む 良い手法はないでしょうか?
120 :
117 :2011/01/11(火) 21:05:28
>>118 そうなのですね;
なんとか、最初の保存位置を指すカウンタを用意し、それのみ一緒にソートして
その値の要素数と入替える事を思いつけて今回は解決できました。ありがとうございました。
121 :
117 :2011/01/11(火) 21:07:00
>>119 あー・・値ではなく構造体のポインタを・・でしょうか。
勉強になります。ありがとうございました。
122 :
デフォルトの名無しさん :2011/01/14(金) 22:45:35
質問させてください。 windows VC6.0 MFCで通信プログラムを作成しています。 無線ルータでPBCで複数台設定したときにIP(MACアドレス)をリスト化してユーザが判断して どの機器と接続するかを選択できるプログラムを作りたいのですが、これはTCPでしか出来ないですよね? 実装させるとすればどの様にすればよろしいでしょうか? socket() (1)ソケット生成 ↓ bind() (2)ソケット登録 ↓ listen() (3)ソケット接続準備 (仮に5台まで受け付ける) ↓ accept() (4)ソケット接続待機 ←接続要求 ↓ read()/write() (5)受信/送信 ←データ→クライアント側プログラム ↓ close() (6)ソケット切断 listenで複数台の受付をして、acceptで接続する所までは分かったんですが、 これだと一番最初に見つかった相手としかコネクトしないっぽいので困ってます。
全部acceptして要らないものをcloseする
class Foo{ int x_; int y_; Bar& bar; Baz& baz; public: Foo(int x, int y) : x_(x), y_(y), bar(x,y), baz(bar){}; }; こういうクラス作りたいんですが、bazの初期化の仕方が分かりません。 初期化子リストが順番通りに初期化してくれるわけでもないらしいです。 参照をポインタにするしかないんでしょうか
bar(x,y)この時点でコンパイル通らないと思うが…
えーと、Bar&をBarにでもして下さい。 参照が複数あったときに、どの順番で初期化すればいいかわからないです Bazのoperator()()がオーバーロードされてて、 (*baz)()みたいな使い方が気持ち悪いので参照を使いたいのです
そんな理由なら bazを使うときに Baz& b = *baz; b();とでもすりゃいいんじゃないの?
あーなるほど。ありがとう御座います。そのやり方でいきます。
posixの非同期IOについて質問です. 1.「open」でファイルオープンしてfd取得 2.「aio_read」でファイルリード要求(スレッドによるコールバック指定 3.(以下呼び出されたコールバック関数) 4.aiocb構造体で指定したバッファaのポインタを一時変数に保存 5.aiocb構造体に新たなバッファbと新たなファイルオフセットを設定して,再度「aio_read」でファイルリード要求 6.非同期で読み込んだバッファaを処理 で処理をしていますが,ファイル終端の検出をどのように行えばよいのかわかりません あらかじめファイルサイズを取得しておくしか方法がないのでしょうか?
130 :
129 :2011/01/16(日) 00:13:08
自己解決しました. aio_returnでread/write等の戻り値と同等のものが得られました
Cからc++に移行真っ最中の者です。 基本的なクラスの書き方は理解して 子供クラスの継承当たりまで理解しました。 C+WINAPIで、簡単なGUIアプリは組めたのですが クラスを交えてのGUIアプリ開発となるとさっぱり検討もつきませぬ 要はオブジェクト指向が理解できていないのですが、CからC++に進んで方はどんな勉強しました? 既存のプログラムを書き起こしたりしたんですかね? 周りにプログラムわかる人居なくて孤独な独学なんで、 俺はこうやった、とかこうやるといいんじゃねとか、進むべき道を教えてください。
俺は昔懐かしいBorlandC++3.1に付属していたObjectWindowsライブラリを使いながら覚えた あんまり参考にならないか
俺がC→C++へ移行しようとしたときはクラスの意味が全然わかんなくて。 Javaを1年くらいやってようやくクラスを理解した。
>>131 サンプルソースたくさん読んで、色々簡単なものををたくさん書けばすぐに覚える。
ようは慣れ
いまさらC++か。
>>131 素直にライセンスの緩いGUIライブラリ探していじってみる、
という方法もある。
VCやMinGWならLilyとか日本語でわかりやすかった
英語だがwxWidgetsとかすごく有名らしい
言語がC#とかならもっと楽チンすぎるが
WTLがオーポンソースなんだからそれ読めば? Microsoftが提供するC++なフレームワークですよ。
GUIは機種依存だから覚えても意味無いよ。 むしろコマンドの方がスクリプトとか使えて応用性がある。 テキストエディターとかつくりたいのなら別だが。
139 :
131 :2011/01/17(月) 22:48:01
皆さんありがとう。 LilyとWTLを導入して少し読んでみました。 まだ難しくて良く読み解けませんが、オブジェクト指向を理解する教本にはなりそうです。 あまりプログラムの時間も取れないのですが めげずに一日ワンプログラムの精神で頑張りたいと思います。
>>139 あまり大きなソース読んでも挫折するぞ、小さいのからいけ
141 :
デフォルトの名無しさん :2011/01/20(木) 18:59:56
http://codepad.org/nF5Gtpyt 444〜505行目までのzahyo()が思うように動いてくれません。
やりたいこととしては、
zahyo[j][0][0or1or2]に直方体のx,y,z座標が一番小さい部分、
zahyo[j][1][0or1or2]に直方体のx,y,z座標が一番大きい部分、
の値を後順走査によって求めていきたいのですがわかりません。
どなたかよろしくお願いします。
思うように動くようにするのがお前の仕事だろうが
どこかでみたコードだな グラフ探索だったか?
144 :
デフォルトの名無しさん :2011/01/21(金) 18:09:32
>>143 そうです!
どうやればいいのかさっぱりで・・・
32bit単精度浮動小数点を 32bit(16bit.16bit)の固定小数点に変換するにはどうすればいいですか?
(int)(x * 65536)
少しは自分の頭使え
>>147 どのへんがダメだと思うのか言ってみ
何か俺の気づいてない問題点があるのかもしれんし
>>149 指数部と仮数部と符号を取り出して云々だと思っていたので
混乱しています
それは・・・ 手間に見合う効果があるとは思えないが
>>150 「指数部と仮数部と符号を取り出して云々」という処理はとても
汎用性が高いので、マシンコード一発で出来る。
FPUを持たないCPUの場合はキミが言った通り、「指数部と仮数部と
符号を取り出して云々」という処理をCコンパイラが生成してくれる。
ldexp()とfrexp()がある
155 :
145 :2011/01/24(月) 00:07:58
シンプルに考えればいいんですね・・・ とりあえず65536は少数部を2バイト分整数にもってきていると、 ひとまず解決とします。 ありがとうございました
STLを使う場合って vector<int> a 見たいに宣言しますが、newを使わなくてもいいのはどうしてなんですか? クラスなら必要だとおもったんですけど。。。
うむ スタックとヒープで検索をかけるとわかるかもしれない わからないかもしれない
>>156 クラスでもintでも同じだよ。
その宣言て実行文中?ならそれは自動変数。
自動変数はそれの宣言があるブロックが終わるとその変数が消える。
そういう寿命の変数でいいなら自動変数で使えばいい。
newしたものはdeleteするまで消えない。
そういう寿命の変数が欲しいならnewする。
>>157 ,158
自動変数でぐぐったら理解できました。
ありがとうございました。
CHoge自体はライブラリ内のクラスで、内部はいじれないものなのですが、 class CHogeEx : public CHoge { CHogeEx() {} virtual ~CHogeEx() {} void Func() { // CHoge内のprotectedのメンバ変数やメンバ関数にアクセス } }; という、自身にはメンバ変数を持たない派生クラスを作った場合、 void Test(CHoge* pHoge) { ((CHogeEx*)pHoge)->Func(); } のように、CHogeのポインタをCHogeExにダウンキャストして 追加したアクセス関数を呼ぶことは、やっても構わないものでしょうか?
ダウンキャストがどういうことが分かってるならいいんじゃね?
やってもいいよ。
ANSI文字セットは時代遅れなの? みんなwchar_t とか WCHAR とか LPWSTR とか L"文字"って書いてるの?
WCHARとかは必要な場合にしか使わない
>>163 windowsだったら、wchar_tとかWCHAR使ったほうがいいよ。
utf8世代なんで、wとかlで始まるもの使ったこと無い
struct CUBE{ int x; int y; int z; } void* p; static void g(void *p); main(){ CUBE *c; c->x = 10; c->y = 20; c->z = 30; g(p); printf("体積%d",(CUBE*)p->x * (CUBE*)c->y * (CUBE*)c->z); } g(void *p){ p = c; } これでpをcと同じ感覚で使える……と思いきや printfのところで「NULLポインタを通じた参照」となってしまいます。 pはグローバルなのになぜでしょうか?
void*pって宣言してるけど… int *pじゃない?
170 :
デフォルトの名無しさん :2011/01/28(金) 00:05:31
CPoint CPoint::operator+(const CPoint& obj) { CPoint tmp; tmp.m_x = m_x + obj.m_x; tmp.m_y = m_y + obj.m_y; return tmp; } // +=演算子オーバーロード CPoint& CPoint::operator+=(const CPoint& obj) { m_x += obj.m_x; m_y += obj.m_y; return *this; } この2つの違いはなんですか? +=をオーバーロードするときはポインタを返さないといけないんでしょうか?
171 :
デフォルトの名無しさん :2011/01/28(金) 00:10:13
>>167 キミがやりたいことはこのように記述する。
static void g(void **p);
main(){
CUBE *c;
c->x = 10;
c->y = 20;
c->z = 30;
g(&p);
printf("体積%d",(CUBE*)p->x * (CUBE*)c->y * (CUBE*)c->z);
}
g(void **p){
*p = c;
}
>>170 ちっがーうよ。 + と += の機能のちっがーいを考えてごっらーんよ(ケント・デリカット風に)。
int a,b; の時、
a + b の返却値は計算結果のコピー。
だから ( a + b ) = c のようには記述できない(わかりやすくするためにあえて括弧をつけてるよ^^)
一方、a += b は a = a + b で、返却値は a それ自身。
だから、 ( a += b ) = c; のように書くと、結局、 a = c; と同じ結果になる。
このような組み込み型の挙動をクラス型についても実装しようとするとこうなる。
でも本当は
CPoint CPoint::operator+(const CPoint& obj) は
CPoint const CPoint::operator+(const CPoint& obj) と、
返却値に const をつけたほうがいいんだな。そうしないと、
CPoint a,b,c;
( a + b ) = c
でエラーが出なくなっちゃう。
うへ voidてNULLしか入らないのかと思ってた。
176 :
デフォルトの名無しさん :2011/01/28(金) 06:30:33
C++のコンパイルがgccでうまく通りません。
http://www.hm-lab.net/archives/236 のソースを sample.cpp とつけて保存して
g++-3 sample.cpp
と打つと以下のエラーになってしまいます。
sample.cpp:6:19: tchar.h: No such file or directory
sample.cpp: In function `int _tmain(int, TCHAR**)':
sample.cpp:21: error: `_T' undeclared (first use this function)
sample.cpp:21: error: (Each undeclared identifier is reported only once for each
function it appears in.)
sample.cpp:33: error: `_tprintf' undeclared (first use this function)
tchar.h のファイルの場所を探して
CPLUS_INCLUDE_PATH に追加したり
-l オプションでディレクトリの位置を追加してもエラーメッセージが変わりませんでした。
何が間違っているのでしょうか?
>>174 これが最小修正
> CUBE c_, *c= &c_;
> g(c);
> g(void *c){
178 :
デフォルトの名無しさん :2011/01/28(金) 22:27:42
以下のコードのSAがうまく動いてくれないんですが、、
http://codepad.org/8Dha99DZ C言語でプログラムを組んでみたのですが、
295行目から430行目あたりまでを実行すると、なぜか解が悪い方向にしか進みません。
どなたか解決法をよろしくお願いします。
それ以降の行数でも同じような現象が起きてしまいます...orz
mainながw
>>178 突然こんな量のコードだされても誰も答えられん
もっと絞るか、原因がわからなければ
もういっそ一度最初から作り直したほうがいい
問題は分割してとりかかるべき
これはJavadoc並の解説が欲しいww
要所要所でprintf()で変数内容表示したりして追っていけば? この長いコードで質問がこんな大雑把じゃぁねぇ。 せめてエラーが出ているのか、実行中にエラーが出ているのか コンパイル時にwarrningが出ているのか、それともコンパイル後の 実行結果の一部がおかしいのかすべてがおかしいのか、 実行中に暴走することがあるのか等 何がどうおかしいのか言ってほしい。
教えてください 現在、在るゲームに対して DLL インジェクションを行い、d3d9.dll の CreateDevice や SetRenderState などをフックし、命令を書き換えるところまで成功しました 次のステップとして、画面上に表示されているテキストやアイコンを読み取り、それらに対してアクションを行いたいと思います 何か良い方法は無いでしょうか?
この板はクラッキングに対して寛容じゃ無い。自分で考えな。
C言語だと戻り値と引数さえ一緒ならどんな関数でも同じ関数ポインタに突っ込めたけど、 C++のメンバ関数だと同じクラスのじゃないと出来ないのね。 TypeErasure使えばいいんだろうけど、融通が利かないというか何と言うか。
std::function使えよ
staticでいいんじゃね。
boost::functionは?
190 :
デフォルトの名無しさん :2011/02/02(水) 12:06:16
#define EPSIRON 1e-12 main(){ double a; a=0.000000000000001; XXXX(a); } double XXXX(double a){ if(fabs(a)<EPSIRON){ return 0; }else{ return a; } } みたいな感じでdouble型の数字がイプシロンより小さい場合に 0に丸めたいのですが、こういう場合の関数名 XXXX() は、何か お勧めのものとか、一般的に用いられているものありますか? ググっても、さっぱり見つけられません。 例えば RoundZero()とか ToZero()とか、私が思いつくのは 今一つセンスがありません。 詳しい人、お願いします。
書籍を買って勉強しようと思っているのですが、 独習C 第4版以外に何かお勧めってありますか?
推薦図書スレでCの入門書について聞くとあっという間にレスが20くらいつくぞ。 そして対外はK&Rがどうこういう話に収束するぞ。 だからいつもこういうんだ。入門書は定番のものなら何を読んでも一緒だ、とね。 そして入門書を何冊もよむことはせず一冊読んだらとっとと アルゴリズムなり分析設計なりちょっと小粋な数学の本なりを読め、と。
俺はソフトバンクの「やさしいC」だな。 書籍はメインを決めて時々もう一冊を見るといった、 2種類あると結構理解が速い。
独習みたいに分厚くて細かいところまで網羅したやつだと途中で疲れるから、 最初は薄っぺらくてちょっと足りないぐらいのから手をつけた方がいい気がする
独習Cは厚さの割りに、細かいところに手が届かない印象 基礎を覚える程度なら十分ではあるけど
さぁ、盛り上がってまいりました!
199 :
デフォルトの名無しさん :2011/02/04(金) 04:41:33
あるコマンドがインストールされているか、すなわち使えるかどうかを Cプログラムから調べる方法をおしえてください 。 コマンドラインからであれば、そのコマンドをうってエラーが帰ってくるかどうかで分かりますが、 プログラム内からはどのように調べればよいのでしょうか? 環境はUbuntu10.10 gcc4.4.5です。
環境変数のpathに有るファイルを走査すればいいと思うよ
>>199 system()で呼んでみて、戻り値をチェック。
コマンドラインでもwhich使えよ
スキルアップしたくて、大学春休みだしOSかドライバか作れるようになるように勉強しようと 思ってるんだけど、どっちの方がとっつきやすいですか? OSなら「30日でできる! OS自作入門」、ドライバなら「Windows Vistaデバイスドライバプログラミング」 買おうと思ってる
>>203 とっつきやすいという点ではOS自作のほうが楽だろう。
どこから作り始めてもいいし、好きな流儀で作っていいし、サンプルも豊富。
205 :
デフォルトの名無しさん :2011/02/05(土) 03:25:28
C言語でオセロゲームを作るとき、<stdio.h>(標準入出力ヘッダーファイル)だけで 作ることは可能ですか?
なぜstdio.hだけと制限するのか知りたいとも思わないが 標準Cライブラリだけで作られているオセロゲームは存在しているよ
>>204 ありがとう、OSの方がとっつきやすいですか。
ドライバ作れるようになった方が便利そうだけど、OS自作のほうが響き的にかっこいいし
OS自作の本買ってやってみる。さっそくポチった
値を参照したいだけの引数は、どのようにするのがベターでしょうか? 基本的には3か5だろうと言うのはわかるのですが…。 1. void hoge(int piyo) (現在使用してますが、ベターではないですよね) 2. void hoge (int * piyo) 3. void hoge (const int * piyo) 4. void hoge(int & piyo) 5. void hoge(const int & piyo) 6. その他 また、理由も添えていただけると助かります。
>>208 渡すのが整数型なら、1でいいよ。5でもいいけど、インライン展開されない場合は寧ろコストが掛かる。
クラスか何かを渡すなら、逆ね。
低俗な質問ですいません。 csvファイルを読み込んで表示しようとしても文字化けしてしまいます。 表示のところに何か問題がありますか?ご指摘ください! #include <stdio.h> int main(int argc,char *argv[]) { FILE *fp; int ch; fp = fopen(argv[1], "r"); if(fp == NULL) { printf("\aファイルをオープンできません。\n"); } else { while ((ch=fgetc(fp))!=EOF) putchar(ch); fclose(fp); } return(0); }
>>210 csvの文字形式をシフトJISにでも変換したらどうだろう
1バイトづつじゃなくてバッファにためこんでprintfで%sで表示してみる
213 :
デフォルトの名無しさん :2011/02/05(土) 17:38:09
windowsアプリを作る場合に WinMain()とmain()は 名前と引数以外には違いがないと考えていいのでしょうか。
見た目わね
>>210 です。fscanf使ったらできました。配列に格納したんですけど、
構造体を作ってそこに格納することも可能ですか?
216 :
213 :2011/02/05(土) 18:38:09
>>214 回答ありがとうございます。
たいへん恐縮ですが重ねて質問させてください。
試した限りはWinMainをmainに書き換えても同じように動作するのですが、
同じように動作しているように見えても実は違いがあるということでしょうか。
その場合、その違いがプログラムに深刻な影響を及ぼすケースはあるのでしょうか。
>>216 標準ライブラリだけしか使わないなら大差ないよ。
GUIを含めて色々やろうと思い出すと、問題になるけど。
>>215 なんで>210がダメでfscanf()で巧くいったのか小一時間問い詰めたいけどまぁいいや。
勿論、fscanf()で構造体に直接格納することも可能。但し、%sを使う場合は%20sのように制限することを考えた方がいい。
更に言えば、どうせ色々考えるならfgets()で取り込んだものをsscanf()でばらす方がいいかもしれない。
つーか、割と普通にそうする。
219 :
デフォルトの名無しさん :2011/02/05(土) 23:45:01
クラスののメンバー変数に int NUMと int hoge[NUM]という配列を定義したいのですが、単純にやるとできません。 なにかやる方法はありますか?
性的にhogeの配列が決まる、つまりNUMがコンパイル時定数であるというのなら class Victory { static int const NUM = 10; int hoge[ NUM ]; }; class Win { enum{ NUM = 10 }; int hoge[ NUM ]; }; で可能。NUMの値をコンストラクタで取得したいとか言うのなら無理
コンストラクタで取得したいです。 ポインタのみ定義して、コンストラクタで動的確保するしかないですかね?
vector使えばいいじゃん。
stlは使えないんす
>>221 無理。動的確保しかない。
っていうか、
>>222 のいうとおり、vectorで。超便利。かなり早い。
一部の型については特殊化もされているので激速。
いや、vectorのあの特殊化は有害だよ。 普通の配列のように先頭要素へのポインタを得て、それを介して扱うことが不可能になるのだから。
vector<bool>さんの悪口はやめるんだ
実装によってはbasic_stringとかも特殊化されてるよ。
>>224 あれってboolさんだけじゃなかったのか
fstreamクラスのseekgとseekpって名前が違うだけでまったく同じ機能らしいですが、 なんでわざわざそうしたのですか? seekっていう関数ひとつだけ用意した方が分かりやすい気がしますが。
全然違うがな
違うんですか・・・。 もう少し勉強してみます。
どこの情報にまったく同じなんて解説があるんだろう 入力ストリームと出力ストリームの位置が混在したら困るやん
C++初心者です。 Cで構造体変数を初期化する際によくmemsetで全てのメンバ変数をまとめてゼロクリアしていたのですが C++でクラスを利用する場合はコンストラクタでメンバ変数一つ一つに初期値を代入する以外に、よく使われる便利な方法というものは無いものでしょうか? メンバ変数が多いクラスを初期化する際にコンストラクタが長ったらしくなったり、 メンバ追加の度にコンストラクタにも初期化処理を追加しなければないのに慣れず 初期化し忘れたりしないか、とか考えると何か他に便利な方法とか用意されてないのかな?と気になりまして質問させていただきました。
>>229 そういう意味か
例えばifstreamではseekpとseekgは事実上同じ意味
しかしstringstreamは実際プログラムを書いてみればわかるが、seekpとseekgは
それぞれ違うポインタを指している
継承上の問題だと思うよ
>>233 外部で構造体を初期化するのと、クラスのコンストラクタで自分自身を
初期化するのでは意味が違うような気もするけれど、コンストラクタでなにもしないで、
C風の使い方をすることは出来ます。
コンストラクタ内での定義については、まじめに定義して下さい。
なお、new されたオブジェクトだけなら、operator new を
override してクリアするという手段は(一般的とは言えませんが)あります。
236 :
229 :2011/02/07(月) 23:36:13
>>234 ありがとうございます。
seekpとseekgはfstreamだけのものでなくて、
同じくiostreamを継承しているstringstreamなどでも定義されている、
ということを知らなかったのが混乱の原因だったようですね。
基本的には入力ストリームの出力ストリームの位置は異なるけど、
fstreamの場合はそれらはファイルポインタを表しており、
ファイルポインタは1つしかないので、
たまたま常に同じ場所を指すことになっている、
ということでしょうか。
>>236 ifstream、istringstreamにはseekpはない
ofstream、ostringstreamにはseekgはない
fstreamにはseekp、seekgの両方があるので混乱してるのでしょう
ご存じの通りファイルポインタは1つしかないのでseekpもseekgも同じ意味になります
ところがstringstreamは読み込みと書き込みを別々に行っているため、seekpとseekgは
使い分けなければなりません
http://ideone.com/szDhS csvファイルをコマンドラインから読み込んで、構造体に入れ、表示させたいのですが、文字化けしてしまいます。
ミスがあったら訂正願います。
読み込むcsvファイル↓
01A,aさん,f,1.1,1.1,1111
02B,bさん,m,2.2,2.2,2222
03C,cさん,f,3.3,3.3,3333
04D,dさん,m,4.4,4.4,4444
05E,eさん,f,5.5,5.5,5555
06F,fさん,m,6.6,6.6,6666
239 :
229 :2011/02/08(火) 02:35:44
>>237 ご丁寧にありがとうございます。
疑問が解消しました。
質問に答えてくださった他の皆様も本当にありがとうございました。
とても勉強になりました。
>>238 先ずは警告が出ている113行から直そうか。
int a; int main() { return 0; } このaは スタック領域ですか? 静的領域ですか? コンパイラ依存ですか?
グローバル性的領域でしたっけ
スタックじゃない。データ領域。 mainが実行される前に確保される領域。 たとえば、 struct SomeClass { SomeClass()//コンストラクタ { >>breadpointB } } SomeClass a; int main() { >>breakpointA. } としてデバッグ起動すると、SomeClassのコンストラクタ がmainよりも前に実行されることが確認できる。
246 :
243 :2011/02/09(水) 00:55:24
>>245 ありがとうございます
データ領域は、スタックともヒープとも静的領域とも違うのですか?
ああ、静的領域と呼ぶのが普通ですね。 訂正します。
248 :
243 :2011/02/09(水) 01:24:34
スタック・ヒープってややこしい言葉だよな メモリ領域としてのスタックとヒープ データ構造としてのスタックとヒープ 前者のスタックは後者の構造をしているけど ヒープは前者と後者で全く異なる概念だし
if(){処理1} else if(){処理2} else{処理3} のようにした時、処理1と処理2がそれぞれ終わった後、処理3に飛んでほしい場合は どうすればよいのでしょうか?
最後のelse書かなきゃいいじゃん
for(;;){ if(){処理1} else if(){処理2} else break; 処理3 break; } こっちでない
>>250 どうなって欲しいのか条件を真理値表に纏めろ。先ずはそれからだ。
例えば、>250のコードだとこうなる。
文面に従えば、処理3は処理3'のようになって欲しいのか? それなら>251だが。
条件1 条件2 処理1 処理2 処理3 処理3'
真 真 ○ × × ○
真 偽 ○ × × ○
偽 真 × ○ × ○
偽 偽 × × ○ ○
>253の伝でいけば、>252はこうなるね。 条件1 条件2 処理1 処理2 処理3 真 真 ○ × ○ 真 偽 ○ × ○ 偽 真 × ○ ○ 偽 偽 × × × これだったら意味不明な無限ループなんて書かずに if (条件1 || 条件2) { if (条件1) 処理1; else 処理2; 処理3; } でいいじゃん。
if(){処理1処理3} else if(){処理2処理3}
処理3が関数でインライン展開され得るならそれがベストかも知らん。
crc32 の値が 0 になることってありますか?
FizzBuzz問題もそうだけど、
案外
>>255 みたいに同じコード(ここでは処理3)を2度書くケースって多いんだよね^^
^^
そんなもん目的次第でどうにでもできるわ
イテレーターペアーを入力とする関数の出力をイテレーターに したいのだが template<typename A.typename B,typename C > void a(A abeg,A aEnd,B bbeg ,B bend,C cbeg,C cend ){ .... } 入力が a,bで出力がcとしてこれでいいのか?
コンテナを操作するアルゴリズムで迷ったときは STLで似通ったアルゴリズムのインタフェースを参照してみるとよいでしょう。 たとえばtransformは二つの範囲から一つの範囲へ出力する機能を提供します。
std::transformはオーバーロードされてて2種類あるな
out:; って何ですか?
ラベル
if(条件1) 処理1 else if(条件2) 処理2 else goto Label; 処理3 Label:; でいいのにgoto絶対禁止教って大変だな
gotoは便利だからって素人が使うとスパゲッティになっちゃうからな
do { if(条件1) 処理1; else if(条件2) 処理2; else break; 処理3; } while(0);
>>267 小さいプログラムしか組まない素人にはgotoは便利だな。
まあ、がんばれw
自称大きいブログラムを作ってる人は言うことが違いますね^^
当然だ! そんなことも分からないのか
>>270 構造化例外が無い時代には、エラー処理をgotoで書くと便利だったのは認めるけどな。
>>273 例外関係なく、遙か昔にしかgoto使ったことないわ
>>275 これをコンパイルしてみた。
--
http://codepad.org/K7iqjR7q --
$ gcc -S foo.c -DTYPE=0 -o foo.0.s
$ gcc -S foo.c -DTYPE=1 -o foo.1.s
$ diff -uw foo.?.s
--- foo.0.s 2011-02-14 10:54:09.562500000 +0900
+++ foo.1.s 2011-02-14 10:54:18.421875000 +0900
@@ -18,7 +18,6 @@
call _proc2
L3:
call _proc3
-L4:
L5:
leave
ret
$ gcc --version
gcc (GCC) 4.3.4 20090804 (release) 1
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$
--
つまり、事実上全く一緒。
低レベルで書いてた人ほどgotoには拒否感がないような気がする
いずれにしても絶対否定は愚かしい
プログラム何て組んだことがない、ソフトを起動させた事もない人間なんだが C++でプログラム(主にゲームになるんじゃないか)組むには何をしたらいい? 参考文献を買う?サイト巡って「入門編」みたいのやっていく? お前ら一番初め何やった
ゲーム作るならHSPでいいんじゃないか? 昔みたいにアセンブラじゃなきゃ処理速度おっつかないみたいな世界じゃなくなったし。
>>279 プログラミングの基礎は置いといて
ゲームを作るとなると主に画像の表示と音楽の再生が辛いところなんだが、
Dxlibっていうライブラリがあるからそれを使うのがとても楽な道。
Dxlibは使用者も多く、作者もかなり活動的だからサンプルもかなり多いし、初心者向けの質問掲示板もあったりする。
主に2Dゲーム用だが3Dも普通にいける。
ただ完全に3D用ならもっといいライブラリがあると思うけども。
Basicにアセンブラまじぇまじぇしてた時代、何もかも皆懐かしい
#include <stdio.h> struct data{ int menba1; char menba2[]; }hensu,mozi; int dainyu(struct data *); char moziretu(struct data *); int main() { dainyu(&hensu); printf("変数の値は%d\n",hensu.menba1); moziretu(&mozi); printf("文字列は%s\n",mozi.menba2); return 0; } int dainyu(struct data *p) { printf("変数--"); scanf("%d",&p->menba1); return 0; } char moziretu(struct data *m) { printf("文字列--"); gets(m->menba2); return 0; } 変数は上手くいくんですけど文字列が入力できなくて失敗してしまいます 結果 文字列--文字列は どうか教えてください。
menba2の配列の大きさは?
指定していませんでしたけど、試しに[32]にしましたが結果は同じでした
scanf("%d\n",&p->menba1); かな。
試してから言えw
#include <stdio.h>
struct data{
char menba2[];
}mozi;
char moziretu(struct data *);
int main()
{
moziretu(&mozi);
printf("文字列は%s\n",mozi.menba2);
return 0;
}
char moziretu(struct data *m)
{
printf("文字列--");
gets(m->menba2);
return 0;
}
moziretu関数に問題があるんだと思って文字だけにしたんですけどそしたら上手くできました
>>286 中でhensuへの命令と混じってしまったんでしょうか?(イメージですけど)
正直どこがどう間違ってるのかよくわからないんですけど教えて頂けないでしょうか?
scanf()で整数を読み込むとバッファに改行文字が残る その後に文字や文字列を読み込むと、その改行文字を読み込む
>>287 お前にはわからないからそう言ったのだろうが、scanfを見ればだいたいわかる。
他の部分に問題が無い事までは目を通さなかったので、「かな」をつけた。
まあ、精進したまえ。
>>289 ありがとうございます、関数の仕組みを理解してませんでした…
moziretu(&mozi);
printf("文字列は%s\n",mozi.menba2);
dainyu(&hensu);
printf("変数の値は%d\n",hensu.menba1); と書き換えたら成功しました
重ね重ね質問ばかりで恐縮ですが、関数を一つに纏めても成功したんですけど
int型で宣言した関数なのになぜgetsとか入れても正常に働くんでしょうか?
int dainyu(struct data *p)
{
printf("文字列--");
gets(p->menba2);
printf("変数--");
scanf("%d",&p->menba1);
return 0;
}
>>290 287は自分じゃないです
>>290 >scanf("%d\n",&p->menba1);
これだと
>>283 が望むような実行結果にならないって言ってんだよ、バカがw
293 :
デフォルトの名無しさん :2011/02/16(水) 22:37:49
可哀想に
>>283 のscanf("%d",&p->menba1);をscanf("%d\n",&p->menba1);にするとどうなるか
変数-- と表示される
数字入力してエンターを押す→何も表示されない
もう一度エンターを押してみる→何も表示されない
何度エンターを押しても何も表示されないので仕方ないから文字列を入力してエンターを押す
→変数の値は〜
文字列--文字列は〜
と表示される
295 :
デフォルトの名無しさん :2011/02/16(水) 23:00:34
296 :
283 :2011/02/16(水) 23:16:48
>>294 バッファについて参考書読み直してるとこですが
283で何も文字を入力してないのに実行されたのはscanfで数字入力した後に押したエンターで
改行文字(NL)を取り込んだということですね
>>289 さんが既にいってますけど
297 :
デフォルトの名無しさん :2011/02/17(木) 04:31:27
C++ソースのASTを取得したいのですが、 どういった方法、ツールがあるのでしょうか? また、実際に試された方っていらっしゃいますか? あと、GCCでは完全なAST情報を 取得できないようになっているそうなのですが、 本当でしょうか?また、どの程度の情報までなら得られるのでしょうか? ここ数年気になっていた内容です、よろしくおねがいします。
アスパラギン酸アミノ基転移酵素がどうかしたのか?
299 :
デフォルトの名無しさん :2011/02/17(木) 10:34:57
web制作の人はC++やCを学習することは無駄になりますか? Javaを覚えればTomcatでjsp出来ますし・・C#ならasp.netでMVCでWEBサイト構築できますし
勉強自体が無駄になることはないだろうけど WebアプリをCやC++で書くことは多分ない。非効率だから。
とても似ているとはいえ、やはり細かいところで違うので、Cじゃなくて素直にphpやれという気はする。 サーバー側のコードはC++で書いたことがあるが、確かにあまりないかもね。
俺は恋文をC++で書ける
std::cout << "セクロスしたい" << std::endl;
if ( !you->canAccept(me) ) delete me;
else goto hotel;
hotel: if ( you->age < 18 ) { police.arrest(me); return -1; }
class police { public: void arrest(Porson& P) { P.parent.call(); } }
これがオブジェクト指向(キリ
>>300 2chの鯖の負荷が大きくなったとき、一部をCに変えたはず。
そんな訳で、負荷が大きいサーバのクリティカルな部分の移植とかならありえるかも…
まぁ、めったに無いと思うけどね。
ある既存のクラスAを引数にして処理する関数funcがあるとして、 クラスAにメンバ変数xを1つだけ追加したクラスBも同じfunc関数で扱わせたい場合、 普通にBがAを継承しても、当たり前かもしれませんがfuncはxを処理してくれません。 B用のfuncを別に用意せず、funcの少しの改変で(テンプレート等で)xを処理するように解決する方法がありますか?
func(A* p) じゃダメなの?
OOPの原則に立ち返れば クラスAとクラスBはそれぞれfunc関数を メンバに持つべきようなきもするけど。 そうしておかないと 処理対象が増殖していったとき すぐにハッテン^h^h^h^hハタンする。
314 :
311 :2011/02/26(土) 17:46:50.70
>>312 それだとxが無いよとコンパイラに叱られます。
>>313 funcが細分化しにくい長い処理で、保守性のため(コピペせずに)使いまわしたいという状況があります。
できる人が見たら設計が悪いと指摘されるかもしれませんが・・・
設計を見直さず、デザパタ等でさくっとその場しのぎができないかと思いまして。
テンプレートメソッドでいいんじゃねーの? どんなことしたいのか知らんけどこれが分かりやすいと思う。
316 :
311 :2011/02/26(土) 17:56:47.98
class A {
public:
void f(int) {}
};
class B : public A {
public:
int x;
void f(int _x) { x = _x; }
};
void func(A* p, int x) {
p->f(x);
}
int main() {
A a;
B b;
func(&a, 1);
func(&b, 2);
return 0;
}
↑こんなその場しのぎでコンパイル通ったのですが、これでいいのでしょうか・・・?
>>315 テンプレートメソッドですか。調べてみます。ありがとうございます。
>>316 virtual付けてないからどちらもAのfuncが呼ばれるぞ
318 :
311 :2011/02/26(土) 18:12:43.52
>>317 ぎゃっほんとだ・・・とんでもないミスを。
あとこの方法だとクラスAにも無駄なメンバを追加する必要がありますね。
わざわざ仮想関数持つのも微妙な感じですね。(速度的には問題ない?)
そもそもfuncの中でxを呼び出すのが無駄なきがする 同じ処理なんだからx弄る必要なんてないだろ
320 :
311 :2011/02/26(土) 18:33:33.67
>>319 説明不足ですみません。原則はAとBで同じ処理、Bの時はx弄る処理を途中に追加、をfuncで実現したいです。
どちみち仮想関数持つことになるなら、グローバルな関数funcをやめてテンプレートメソッドでやってみたいと思います。
つRTTI
>>321 if文を重ねるのは御法度だろ
仮想関数で出来る物はするべき
つfuncが細分化しにくい長い処理で、保守性のため(コピペせずに)使いまわしたいという状況
関数の定義をヘッダーに書くとmultiple defineとかでるんですけど、 これって普通ですか?
普通ではありません、エラーです
インクルードガード?
インクルードガードはもちろんつけてありますよ。 たぶん、別々のオブジェクトファイルに同じ定義があるといけないんじゃないんですか?
>>324 いつエラーが出るのか書け
コンパイルの時なのか、リンク時なのか
inlineつけりゃおk
>>297 GCC-XMLとか。あとclangにもそういう機能があるらしい。
すまん、どっちも自身が使ったことはない。
struct hoge { int foo; }; hoge h; #define bar foo h.bar = 100; #undef bar 上のように一時的に別名でアクセスしたいんだけど マクロは使いたくない、よけいなコストも掛けたくない場合になにか手はありますか?
c++なら参照とか? hoge h; int &bar = h.foo; bar = 100; 一時的でなくともよいなら struct hoge { int foo; int &bar = foo; }; かな
参照は実行時はポインタと同じだよね。 >331は「よけいなコスト」だと思いそう。 一時的でなくていいならunionでしょ。初期化なしで済む。
参照はポインタとは違うぞ?
ポインターだと間接参照のコードが最適化できないことがあるけど、 参照なら最適化されるからね。 参照がポインターと同等なのは引き数の場合でしょ
336 :
デフォルトの名無しさん :2011/03/06(日) 00:01:41.77
1+5*(7-2)= ↑の文字列をdllに渡すと計算結果が返ってきて、もし文字列が式ではないならエラーが帰ってくるdllを作りたいのですが 秀丸のマクロで利用できるものをお願いします
自分で作りたいのに 何をお願いするんだ?
秀丸のマクロで利用できるものって?
秀丸のマクロからよべるDLLって意味か。
秀まるおに有償で依頼すればいい。
DLLを作ってメインプログラムにlibファイルを追加したんだけど、 DLL内の関数を普通に呼び出してビルドすると以下の様なエラーになります。 どなたかわかる方いませんか? test2.obj : error LNK2019: 未解決の外部シンボル "int __cdecl makehook(struct HWND__ *,int,unsigned int)" (?makehook@@YAHPAUHWND__@@HI@Z) が関数 "void __cdecl WM_Paint(void)" (?WM_Paint@@YAXXZ) で参照されました。
ここにいます。
343 :
341 :2011/03/06(日) 02:35:43.86
解決方法を教えてください。よろしくお願いします。
extern "C"しろ
リンクエラーも解決できんのにフックとな
346 :
336 :2011/03/06(日) 14:13:49.50
本当お願いします! 助けてください神様
秀丸のスレで聞けばいいんじゃね
>>346 ここは作ってクレという板じゃないんだよ。有償なら作ってもやるけど。
判ったら去れ。
349 :
336 :2011/03/06(日) 14:36:02.78
わかりました! では優勝でお願いします! 何日で出来ますか?
秀丸のスレで聞けばいいんじゃね
351 :
336 :2011/03/06(日) 16:11:23.63
そうですね秀丸のスレ行って見ます
好きな方を使え h = 0; r = 乱数( 0, 99 ); for (i = 0; i < 3; i++) { h = h + 確率[i]; if (r < h) { return 中身[i]; } } t = 99; for (i = 0; i < 3; i++) { if ( 乱数( 0, t ) < 確率[i] ) { return 中身[i]; } t = t - 確率[i]; }
誤爆った…orz
354 :
336 :2011/03/06(日) 18:26:36.96
やっぱりここじゃダメですか? なんかサンプルが載ってるって言われたんですけど サンプルからdllの作り方もわからないです 伝説の神様おねがいします><
356 :
336 :2011/03/06(日) 18:31:31.22
ちょっと待って
とっとと出ていけ。二度と来るな。
358 :
デフォルトの名無しさん :2011/03/06(日) 18:41:28.09
Void_No2様の発言はどれ? くさかべさまの発言はどれ?
はあ?
こういうバカにはマルウェア仕込んでやるのが良いと思う。
361 :
336 :2011/03/06(日) 19:00:06.69
やっぱだめだ Pythonでdll作れるのかと思ったけど無理だった 本当お願いしますよ神様
納期1ヶ月、20万で。 ただし、式ではないものの定義はそっちもち。
秀丸よく知らんけど、
>>336 の式のパースくらいならDLLにしなくても、
秀丸マクロで書けるんじゃないの。
>>363 良く知らないものに関して、そのマクロで書けそうって、予言者でつか?
「こういう言葉でググったらいいんじゃないの」とか 「こういう方向性でも解決できるんじゃないの」みたいに ヒントを出すと、いい加減なこというなみたいに噛み付いてくるやつって いるけど、最初から他人にやらせるしか頭にないからそういう 反応になるんだろうな。
触ってあげるなよ可愛そうな人なんだから
>>362 15分で終わる作業で1ヶ月も掛かるとか初心者かよ
>>367 とりあえず、吹っかけるのがこの業界のデフォルト。
371 :
デフォルトの名無しさん :2011/03/06(日) 22:47:02.71
class A{ public: int* p; A(){ p = new int(); } ~A(){ delete p; } }; A func0(){ A a; *a.p = 1; return a; } void func1( A& a ){ ... } void main(){ func1( func0() ); }; こうすると、func0()の戻り値のA::pがfunc1に渡される前に deleteされてしまうんですが、deleteされずfunc1へ渡す方法を教えてください。
void func1( A a ) でおk
373 :
デフォルトの名無しさん :2011/03/06(日) 23:11:44.94
>>372 こういうことがしたいんです。
A func0( A a ){
A b;
b = x(a); // aをいろいろ加工してbへ
return b; }
void main() {
A a;
func1( func0(a) ); // aをfunc0()で加工してfunc1に渡す
}
コピーコンストラクタをつくりなさい話はそれからです
じゃあ A& func(A& a)で
コピーコンストラクタを作ったらうまくいきました。 ありがとうございました。
アライメントって重要ですか?
unionするとき重要。 通信系のデータマッピングに重要。 その他、データマッピングにも重要。 SSEするときに重要。 スピード狂するときも重要。
2番目辺りにライブラリとリンクする時も入れて
日本語を含むパスを格納してる文字列の ローマ字だけを大文字に変換したいのですが、 それに適したライブラリや処理法ってあるでしょうか
382 :
381 :2011/03/07(月) 06:02:48.93
すいません、解決しました
ライブラリとリンクする場合は、ライブラリが提供しているヘッダを使うから 気にする必要は無い。ライブラリ作成者は気にしなければいけない。
ソート済データからの値の検索の場合 常にfindよりlower_bound使う方がいい?
そもそも使い道が違う findはその値をもつ要素を探す lower_boundはその値以上の要素を探す Aをさがすつもりでlower_boundしてAがなかったら全く違うBやCといった要素が返ってくることになる 素直にfindを使うんだ
俺は誰かがDLL作ってくれるまで諦めませんよ 物事が完成するまで何事まで諦めない若者に優しい手を差し伸べてくれてもいいじゃないケチ
計算式が四則演算でいいなら、20万円で作ってやるよ。
>>385 なるほど、値がない場合のことを考えてなかった
値が存在する前提ならO(N)のfindよりO(logN)のほうが良いかなと思ったから
メンバのfind使え
もういいや俺は自分でDLL作ることにしましたので(キリ 分からない事をここで聞く事に方向転換しましたよ
それはとても良いかんがえ
392 :
デフォルトの名無しさん :2011/03/09(水) 14:04:16.47
DLLを作るための環境を教えてください 出来れば秀丸で書きたいのでVC以外で必要なソフトを教えてください ノートブックなので容量ないのですよ
秀丸とVC++でおk
VC 以外なら Windows SDK のコンパイラを使うか Borland C++ Compiler を使うか MinGW の gcc を使うか ってところ?
395 :
デフォルトの名無しさん :2011/03/09(水) 15:17:00.51
394さん その3つではどれが一番初心者に向いてますか?
秀丸SDKが対応してるコンパイラ。多分VCだろう。
すみません。 メモ帳などに書かれた、プログラムコードらしき物(メンバ関数を呼び引数もセットしてるなど)を 読み込んでプログラム内に取り込んで実行する なんて真似はできるものなのでしょうか? 単に文字列を判定し処理を切り替えた擬似的なもの に過ぎなかったのでしょうか。
インタープリターパターンといいます
>>397 動的にコンパイルして、動的にリンクすればできるけど、
大変だと思うよ
400 :
デフォルトの名無しさん :2011/03/09(水) 19:22:02.85
早くしろよ!
いまやってる!
402 :
397 :2011/03/09(水) 21:02:49.41
>>398 >>399 ありがとうございます。インタープリターパターンという物が有ったのですね。
インタプリタ言語を再現したかのような形式になるのですね。
ちょっと自分には敷居が高そうですが、やっと数日間の疑問が払拭できました。 ありがとうございました。
403 :
デフォルトの名無しさん :2011/03/09(水) 21:13:52.61
早くしろよ!!!!!!進まないっ!!!!!!!!
if((t%320)/80==1){〜〜} if((t%320)/80==3){〜〜} と if((t%320)/80==1){〜〜} else if((t%320)/80==3){〜〜} ではどっちが早いんですの? 極わずかな違いだろうけど。 ((t%320)/80==1)が正の時は((t%320)/80==3)の計算しなくて済むけど、 elseでぶっ飛ぶこと自体めんどくさいのかなって。
後者。
オケーイ。ありがとぅー
>>404 tの型によっては、(t%320)/80の結果を一時変数に入れた方が速くなるかもしれない。
整数型ならコンパイラが何とかするだろうけど。
408 :
デフォルトの名無しさん :2011/03/10(木) 07:09:05.14
質問です。 C言語の数値配列はなぜscanfのときは&がいるのに printfのときは&がいらないんですか?
>>408 まずその疑問に至ったソースを出しなさい。基本的なことを誤解している。
例)
int hoge[10];
hoge[0] これは、int型データー。
&hoge[0] これは、hoge[0]のアドレスを指す。
hoge これも、hoge[0]のアドレスを指す。
だから、 hoge と &hoge「0」 は同じものだ。
×だから、 hoge と &hoge「0」 は同じものだ。 ○だから、 hoge と &hoge[0] は同じものだ。
>>409 見当違いだ。
用意されている関数とは別に、自作関数fを考えたとき
引数xの値を書き換えるにはどうすれば出来るか考えろ。
値の更新したいとき。 int f(int x) では値の更新できないだろ。 だからアドレス渡しのint f(int *x)にする必要がある。 printfに&xを渡しても動くがそのときはメモリのアドレスが出てくるだけ。
すまん そもそも数値配列だったか
414 :
デフォルトの名無しさん :2011/03/10(木) 10:14:09.75
CでDLL作るのとC++でDLL作るのはどちらが簡単ですか? 速度はどっちが速いですか?
C C
すいません、質問です。 ShowDialog()ではフォームが開くのですが、 Show()に変えると開かなくなってしまいました。 エラーにもならないので原因がわからずこまっています。
Show()に変えなければいいだけ Showもないことを聞くな
>>414 CもC++もこれから学ぶのなら絶対C++。
C++を便利なCとして使うのが楽。オート変数の取り扱いだけでも。
複雑なことするのでなければCでいいよ
オート変数の扱いがなんだって?
C厨 vs C++厨
C++ を便利な C として使うと言ってる人は、 C++ や C をキチンと使いこなせてるのかな?
better Cとして使ってもいいって普通に言われてないか?
使ってもいいとはよく言うけど勿体無いなぁと思う
>>423 それは better C が便利だから言われてるのではなく、
C++ プログラマが自由に C++ を使いたくて、C の制限を
排除する為の方便として言われてるだけ。
実際は C プログラマにとってデメリットはあれど、大した
メリットはない。
C++はCを由来とする言語だがCとはおおよそ異なる言語に進化している。 初学者必読の書、Effective C++を読むだけでも、 Better Cなどという使い方はありえないと教わる。 実際にCライクな泥臭いプログラムが必要となる場面があるのは事実だが。 CにはCの、C++にはC++の利点があり、 双方の利点は競合している。
ベターCいいと思うけどね 関数ローカルで可変長のバッファがほしいなーとか思ったときに vectorでササッとやっつけしちゃったり その程度でも十分役に立つし
それは C プログラマが alloca() でササッとやっつけるのとどう違うの? もちろん malloc/free でも良いよ
>>428 なんかエラーでたときとかRAIIで楽だしコードもすっきりするじゃん
>>429 で、それは alloca() で関数を抜ける時にバッファが解放されるのとどう違うの?
allocaは関数を抜けるときに開放してくれるとは限らないよ
ライブラリで実装の時とか
>>433 つ 無理筋
もしそんな物が今の時代に生き延びているとして、そんなコンパイラを使う方が悪い
建前: 「Better C として使うと便利だよ〜」 本音: 「俺が後で C++ から使い易い様に、お前も C++ で書いとけ」
中途半端な知識で書かれたC++コードなら純Cのがまだマシ
完全無欠なる知識でC++のコードを書けるのは、この世界で一人だけ
allocaって標準入りしたの? C99で可変長配列が採用されたから今後も予定はないって聞いてたけど
>>436 リーナストーバルズちゃんもそう言ってたな。
実際、Cの流儀で書かれたC++コードほど迷惑なものはない。
結局、ベターCって誰得?
442 :
408 :2011/03/11(金) 03:52:59.23
>>409 さん
たとえば
int data[10];
int i;
for (i = 0;i < 10;i++) {
printf("%d 番目の数値を入力して下さい:",i);
scanf("%d",&data[i]);
}
for (i = 9;i >= 0;i--) {
printf("%d ",data[i]);
}
printf("\n");
なぜこのプログラムではprintfのときに配列個々に&をつけていないのでしょうか。
配列の名前は配列の先頭のアドレスを表すつまり、このプログラムなら
data=&data[0]なのはわかりますが、なぜほかの要素に&をつけていないのに
データが参照されているかということがわからないのです。
scanfが要求するのはポインタ、printfが要求するのは値。 単にこれだけの違い。 void f( int ); と void f( int * ); の違いみたいなもんですね。 パラメータ型が違うんだから、与える引数の型も変わって当然。
>>441 俺がbetter Cとして使うときは、C + ネームスペース&クラス位しか使わんが
俺様プログラムを作るときは、コメント省略しても実害なく作れるので、無茶苦茶便利
合わない人と組んでやるときは、誰の特にもならない
BetterCとして作るときって言うと、構造体に演算子オーバロードはよく使うな。自分用ツールなら他人が読めるかは余り気にせずできるし。 それでも流石にDoxygenコメント位入れるけど。
>>444 ネームスペースに頼った命名法ってgrepで検索といった古典的な手法が使えないよね。
IDE必須になるのが嫌だな。
>>444 クラスを使ったら、それはもうベターCじゃなくC++だと思うんだが・・・
元々がC with Classな訳だし
>>447 そう?
俺の中では、class + コンストラクタ + デストラクタ + コピーコンストラクタ までは
ちょっと便利な構造体だけどな?
継承とか演算子のオーバーロードがあるとC++って感じになる
と言いつつ、クラスの性質に合わせて両方とも使ってるけどね
449 :
デフォルトの名無しさん :2011/03/11(金) 10:15:11.38
DLLを作るとき1+2=3みたいに計算させる場合はCとC++どっちがいいのか聞いておるのだ
どっちでもいいよ。
451 :
デフォルトの名無しさん :2011/03/11(金) 10:55:27.62
Cで作ることにしました
452 :
デフォルトの名無しさん :2011/03/11(金) 10:56:10.21
勉強熱心な若者はCでアイフォンアプリもアンドロイドアプリも作れることを学習したんですよ
453 :
デフォルトの名無しさん :2011/03/11(金) 11:02:28.87
目が悪いのか?Downloadって...
スルーしないと永遠に付きまとわれるぞ
456 :
デフォルトの名無しさん :2011/03/11(金) 12:35:41.62
何故若者のやる気をなくす事を言うか?
出る杭は打たれるよ
それは457が陰湿なだけでしょ
出てねーし めり込んだ杭をどうしろと
っ全然関係ねーけど、 町田市ようやく電気回復したよ。 9時間C++で遊べず^^;
それは喜ばしいが小田急とJRが止まってるから町田に帰れない><
今回は被災しなかった地域だけど 俺はオフィスに自転車おいてるから電車が止まってもなんとか帰れる お前らも折り畳み自転車くらい持っとけば?
>>448 もちろん STL も使うでしょ?
そこから分かる事は、ベターCというのは人に依って範囲が全然違うから
具体的な実態を持たない、気をつけるべき用語だと言う事だね。
>>462 道路はどこも渋滞と帰宅難民で大混雑だそうだから気をつけなよ
DLLのグローバル変数やstatic変数の寿命って最初にロードされたときですか?
はい
すみません。C++でファイル等の読込状況をリアルタイム表示したいのですが、 マルチタスク、プロセスなど色々有る様なのですが、何を学ぶのが適切でしょうか? また、学習にオススメのサイト、学習用サンプルの有るサイトなども有れば、教えて頂けますと幸いです。よろしくお願いします。
470 :
468 :2011/03/16(水) 22:58:44.95
>>469 マルチスレッドなのですね。ありがとうございます
>>468 分割ファイル読みの方が楽だと思うけど。
const char* char const* の違いを教えてください
476 :
デフォルトの名無しさん :2011/05/03(火) 22:35:12.60
test
477 :
チョクト :2011/05/04(水) 11:33:45.69
どなたかバージョンアップしていただけないでしょうか? とてもじゃないですが、自民の論客どもに太刀打ちできません ( ノД`)シクシク… 答弁プログラムver.1.0 #include <stdio.h> #include <stdlib.h> int main(void){ srand((unsigned)time(NULL)); while(1){ switch(rand()%3+1){ case 1: printf("しっかり\n"); break; case 2: printf("きっちり\n"); break; case 3: printf("ちゃんと\n"); break; } } }
478 :
デフォルトの名無しさん :2011/05/04(水) 16:45:02.58
#include<stdio.h> main() { int a1,a2,a3,a4; a1 = 5; a1 = a1 + 2; printf("a1 = %d\n",a1); a2 = 5; a2 += 2; printf("a2 = %d\n",a2); a3 = 5; a3 = a3++ + 2; printf("a3 = %d\n",a3); a4 = 5; printf("a4 = %d\n",a4++ +2); return 0; } なぜかコンパイル出来ません 6行目のa1 = a1 + 2;が指摘されてるんですが、理由が分かりません
>>478 main関数に型がついてないだけだよ!
codepadは無くても良いのね
>>478 です
int mainで出来ました
だけど、今までこれ以外の他のコードではint mainとかかなくてもコンパイル出来てたんですが
なぜこのソースに限ってはint mainとしなきゃダメだったんでしょうか?
>>481 コンパイルする環境が変わったとしか思えない
ずっとBorlandのままです
いままで return 0; つけてなかったんじゃねーの
拡張子を .c にすると C になって int を省略できるけど 拡張子を .cpp にすると C++ になって int を省略できないとか そういうことじゃないのかい
今までOKで急にエラーになったんなら、なにかしら環境変わってるだろ。
>>484 それはないです
ずっとソースを使いまわしながら関数だけ変更してたので
たまたま今回はint mainにしなければなぜかコンパイル出来ない状態になったので
ビックリしております
環境が変わったにしてもその理由もサッパリです
ただ、大した問題じゃなさそうだし解決したのでよしとします
#defineとはどういう意味ですか?
定義
どうゆうときに使うんでしょうか?
名前空間を汚すだけのバッドノウハウです 使う必要はありません
493 :
デフォルトの名無しさん :2011/05/04(水) 22:36:46.64
勃起するまでのない質問はここで
#defineは神
メンバー変数の初期化順って仕様で決まってる?
c++のホントに最初の入門書だとやさしいc++で宜しいでしょうか 他の言語はC言語をさわりだけやった程度なので、他の言語をやった人向けのは難しいです
>>497 なんかググったら同じ本二種類出てきてわからないが、理解できそうならそれでいいと思うよ
初心者用って書いてあるけど他の言語習得者向けな本があること知ってるなら他に注意すべきこともないだろう
C++はコンパイルは通るし動くけどやっちゃいけないことというのが多いので
むしろ基礎が終わったら、そのうちEffectiveC++とか読むのをおすすめする
ちょっと便利な機能の増えたCとして使う気ならべつにいいが
初心者はC++に触っちゃいけない。バッドノウハウの塊だから。 まだ、perlの方がまし。
getcharってのは何か文字を入力したらその文字だけを蓄えるという意味ですか?
while (1) { printf("A:\n"); printf("X:\n"); while (1) { c = getchar(); if(c != '\n') /*cが\nでないなら*/ break; } switch (c){ case 'A': case 'a': printf("\nAだった\n\n"); break; case 'X': case 'x': end = 1; break; default: printf("\nまじめにやれ\n\n"); break; } if (end == 1) /*endが1なら*/ break; /*whileループを抜ける*/ } printf("\nおわり\n"); Aとa、Xとx以外の文字を入力すると「まじめにやれ」と出力されるのはどこで判断してるのかが 分かりません。 また6,7行目と25,26秒目のifのところがイマイチ理解できません。
>>501 default: がなんなのか分からない
breakの意味が分からないってことか?
大丈夫じゃねぇじゃん
505 :
デフォルトの名無しさん :2011/05/06(金) 14:12:10.90
それはほんとに大丈夫なんでお願いします
case 'X': case 'x': end = 1; break; breakがないとcaseはそのままスルーしてたとえXでもendのところにくる だが一般にこれは行儀が悪く良くない書き方
end 1ってのはそもそもどういう役割ですか?
たぶんX,xが入力された場合もwhile(1)のループを抜けたいんだろうけど switch文の中なので直接飛べないのでendという変数をフラグにしてあるんだろ swtichの次のところでendが1ならwhileループを抜けると書いてある
初心者です VC++で、コンボボックスにデータバインドする方法を教えてください。 XSDファイルをバインドしたいのですが、データソースには「なし」としか書かれていなくて困っています
ある関数において長さが不確定の値を配列に受け取り 配列の反復子を関数に渡してそれに入れてもらうと仮定した場合 配列の大きさが前もってわかってないので十分な大きさを確保する必要があると考えますが これは不合理と理解しますのでソリューションをご教示ください。
1,std::vector vec; vec.resize(n); 2,char* = new char[n]; 3,char* = (char)malloc(sizeof(char) * n); 好きなのを使えばいい。メモリは解放するんだぞ
メモリー解放すぐ忘れちゃうんで 使い終わったら勝手に消えてくれるイテレーターがあると助かるんだけど。
必要に応じて領域を確保していく出力反復子的なものを作って渡せばいいんじゃない
std::back_inserterというものが有ってだな
listだから問題ないだろ 一つ一つの手続きに問題が無いんだし
そういう事じゃなくて、個人はどう呼ぼう
誰か>517の解説を頼む。
そういう事じゃなくて、故人はどう呼ぼう
>>515 一般的なlistの実装なら問題ないのかな
これがvectorだったら再確保された場合イテレーターが死ぬから無理だけど
仕様で許可されてるのかどうかまではわからないな
つ規格書 listコンテナのmodifier (23.2.2.3) insert,push_front,push_back はイテレータや参照の有効性に影響を及ぼさない。(p1) erase,pop_font,pop_back,clear は削除される要素へのイテレータや参照だけ無効になる。(p3)
https://gist.github.com/960160 void solve(vector <pair<string, int> >& h){}
この様な "ペアを内包したベクタへの参照を引数に取る関数" を定義したいです。でも出来ません。
「invalid initialization of non-const reference of type…」とコンパイラに怒られます。
現状は
void solve(const vector<pair<string, int> >* h){}
としています。お教え頂けませんか?
日本語仕様書ってどこにあるの?pdfただで見れるの?
姉はああいう味なんだと思う。
>>522 gcc4.5.2(MinGW)では普通に通るが
typedef std::vector<std::pair<std::string, int> > Vpsi;
void solve(Vpsi& h)
{
for (Vpsi::const_iterator pos = h.begin(); pos != h.end(); ++pos)
std::cout << "String = \"" << pos->first << ", int = " << pos->second << std::endl;
}
int main()
{
Vpsi v;
v.push_back(std::make_pair(std::string("abc"), 1));
v.push_back(std::make_pair(std::string("def"), 2));
solve(v);
std::cin.get();
}
構造体の配列をコピーするのですが、 memcpy_s でコピーして問題ありますか? 次のような構造体のときmemset()で0初期化すると 整数型0と挙動小数点0.0f, 0.0dの区別の関係で問題があると きいて懸念ができたので聞いておきたいのです。 struct A { char c; int i; float f; double d; };
こうすれば、問題ない。(しなくてもよい) struct A { double d; float f; int i; char c; };
>523 C++03の日本語版X3014ならJISCのサイトで閲覧できる
>>526 関数定義が構造体(貴殿のでいうVpsi)の参照渡しなのに、アドレス渡してcallしてました。
呼び出す方のミスでした。アホだった。ありがとうございました。
>>524 const は記載ミスでした。関係有りませんでした。すみません、ありがとうございます。
>>527 注意する点は、
「C++の仕様内で整数型および浮動小数点数型の内部表現が定まってない事」
「バイト単位によるコピー、セットに伴うアラインメント」
「A自体がPODかどうか」
それぞれぐぐれば出てくる。
まぁ、AはPODだしアラインメントは::operator new使えば関係ないし
整数型の内部表現も二進数で1バイトのbit数も8だろうし
浮動小数点数規格IEEE 754, 854は全てのデータが0であると+0として認識されるから
その時点ではそれらの関数を使うことに対して全く問題はない。
533 :
527 :2011/05/07(土) 17:31:50.00
ありがとう。 でもアライメントはsizeofで構造体サイズを指定すればいんじゃない?
よくあるタイプの処理系だとdoubleのサイズが最大のアライメントになるから 構造体サイズをアライメントに採用すると間違いではないけど無駄が多くなる
STLがアロケーターに要求しているmax_sizeって、メモリが無限にあると仮定して 1 現在において一度に取得可能な数 2 最も良い状況での取得可能な数 のどっちでしょうか?
無限のメモリをアドレッシングするには無限長アドレスが必要だけど、 そんなCPUアーキテクチャは存在しない。バカな質問するな。
>>536 仮定って言ってるだろ
空きメモリの限界に引っかかる場合を除いてって意味でしょうに
std::numeric_limit<std::size_t>::max()
C++でAの処理が終わったら主処理ループn回分待機してからBの処理、 Bの処理が終わったら主処理ループm回分待機してからCの処理 のような仕組みをカウンタの変数用意して回すのが嫌で嫌でなりません どうにかしてC++でマイクロスレッドやコルーチンを用いる方法はないでしょうか
手段を問わないんならコルーチン実装したライブラリ使えばいいだけじゃないのか
AMD64が主流になってもLLP64じゃsizeof(size_t)==sizeof(unsigned long)==32bitだしなあ 欠陥を感じずにはいられない なぜLP64またはILP64にしなかったのか まあWin64を直接コールすれば関係ないが C/C++を軽視したモデルと言わざるを得ない もちろんメモリスペースの問題からintは現行の32ビットでも十分だ size_tをlong long intにすればいいのに あれ?でもMSDNには >int と long は、64 ビット Windows オペレーティング システムでは 32 ビット値です。 >64 ビット プラットフォーム用にコンパイルする必要があるプログラムでは、ポインタを 32 ビット >変数に割り当てないように注意してください。ポインタは、64 ビットのプラットフォームでは 64 ビット >なので、ポインタを 32 ビット変数に割り当てると、ポインタ値を切り捨てることになります。 >size_t、time_t、および ptrdiff_t は、64 ビット Windows オペレーティング システムでは 64 ビット値です。 >time_t は、Visual C++ 2005 以前の Visual C++ バージョンの 32 ビット Windows オペレーティング >システムでは 32 ビット値です。Visual C++ 2005 以降では、time_t は既定で 64 ビットの整数です。 >詳細については、「時間管理」を参照してください。 と書いてあるぞ???
どしたの
544 :
デフォルトの名無しさん :2011/05/09(月) 11:06:17.37
(´・ω・`)
546 :
デフォルトの名無しさん :2011/05/09(月) 16:00:30.77
>>507 どうもすいません
aかAを入力すると「Aだった」出力されます
それ以外のキーを入力すると「まじめにやれ」と出力されます
つまりXかxを入力しない限り、このコマンドは終わらないということですが、
それは何がどう働いてるからこういう動きになるのでしょうか?
全体を while (1) { 〜 } で囲んで繰り返しにしているのでそういう動きになります
>>547 whileが真の間だけ繰り返すというのは理解してるんですが、この場合、何か入力したら、
getcharがゲットし、それをcに代入するわけですよね?
ここでここでcが\nと等しくない(
>>501 の7行目)ってのが何を意味するのかイメージつかめません
また、24行目のif( end == 1)の1ってのがどういうアレなのかもイメージ尽きません
自分がコンピューターになったつもりでc,endに何が入っているか追跡してみなよ。
>>548 端末に例えばAだけ入力したくても通常は1行入力モードだから改行文字が必要。
で、そいつを入力すると今度は判定の邪魔になるから改行文字は無視したい。
さて、どうする? と言うお話だったのさ。
>>548 getchar() は、入力した文字を1文字ずつ返します。 改行も '\n' という文字になります。
例えばあなたは、まず a を押し、次にエンターを押し、さらに x を押し、次にまたエンターを押したとしますね?
そうすると、最初は getchar() が 'a' を返し、それが c に代入され、次の時 getchar() は '\n' を返し、それが c に代入され、さらにその次の時 getchar() は 'x' を返し、以下同様に動きます。
549氏の言われるようにそれで1行ずつプログラムの動きを追ってみてください。 人間コンピュータになったつもりで。
end の 1 は、ほら、case 'x': のところで代入してるじゃないですか。 end に 1 を代入したら end が 1 になり、 end == 1 が成立するようになります。
getcharもendも意味が分かりました。 しかし、 if(c != \n); break; がどうもダメです。 文字がエンターと等しくない事がどうしてwhileループを抜けるになるんでしょうか? aを押したあと、エンター押しますよね普通。 xを押せば終了ですが、aだと終わることなくループしますし。 つまりwhileループは抜けないことになるかと思います。
>>552 while(1) は2つあるだろ
printf から switch 文まで全体を囲ってる外側の while(1) と、getchar と if 文だけを囲ってる内側の while(1)
そこの break で抜けるのは内側の while(1) だよ
コンパイルすると九九が出力されるソースです。 iがjより大きいコンティニューになるようですが、どうみればいいのでしょうか? #include <stdio.h> int main() { int i,j; for(i = 1; i < 10; i++){ for(j = 1; j < 10; j++){ if(i > j) continue; printf("%d×%d = %2d\n", i,j,i*j); } printf("---------------------\n"); } return 0; }
>>554 i<=jのときだけそこのループ処理を行う
CとC++どっちが強いですか?
五十歩百歩 ダブルスコアでC++
>>555 もうちょい詳しくお願いします
iとjがインクリメントで1つづ増えてそれが9までいくってのはわかります
しかしi>jが何を意味すんのか、それによって何がどうなるかがイマイチ分かりません
>>558 iがインクリメントされるタイミングわかる?
560 :
デフォルトの名無しさん :2011/05/10(火) 01:15:37.91
あげといてやるよ
>>554 を出力すると以下のようになるわけですが、iのほうはずっと1のままで、jは
2,3,4・・・インクリメントされてます。
でjが9に達したところで、iが2になってるのです
こうなるのはforとかifがどういうタイミングで働いてるのかがどうもつかめません
1*1=1
1*2=2
1*3=3
1*4=4
1*5=5
1*6=6
1*7=7
1*8=8
1*9=9
2*2=4
2*3=6
2*4=8
2*5=10
2*6=12
2*7=14
2*8=16
2*9=18
・
・
・
略
>>563 ちゃんと自動でインデントしてくれるエディタ使ってる?
そしてfor文について理解してる?
>>563 #include <stdio.h>
int main()
{
int i,j;
for(i = 1; i < 10; i++){
for(j = 1; j < 10; j++){
printf("(i, j)=(%d, %d)\n",i,j);
}
}
return 0;
}
#include <stdio.h>
int main()
{
int i,j;
for(i = 1; i < 10; i++){
for(j = 1; j < 10; j++){
}
printf("(i, j)=(%d, %d)\n",i,j);
}
return 0;
}
おい
/*
http://www.geocities.jp/ky_webid/ProgrammingPlacePlus/c/017.html#continue if(i > j) continue;
は、もし、jがiより小さいか等しいなら、内側のループの最後まで飛び越す。次はj++
*/
#include <stdio.h>
int main()
{
int i,j;
for(i = 1; i < 10; i++){
for(j = 1; j < 10; j++){
/* if(i > j)
continue;
printf("%d×%d = %2d\n", i,j,i*j);
*/
if(i <= j)
printf("%d×%d = %2d\n", i,j,i*j);
}
printf("---------------------\n");
}
return 0;
}
typeidの情報ってtypeidを一度も使ってないクラスのデータも取られる? かかるコストはコンパイル時にtypeid使ってるクラスの分だけ?
RTTIを有効にしたら全部だろう。 リンカあたりが取り除いてくれる最適化があるのか? もっとも今時のPCなら、全部作られたとしても、そう大したコストではないとは思うが。
全部のクラスでやってたらテンプレートであれこれするとすごい無駄になりそう
文字列定数同士の比較ってstrcmpを使わなくてもポインタの値が等しいかで問題ないですか?
有ります
あーすみませんなんでもないです ごめんなさい
>>572 あります。文字列リテラルを同じ空間に確保するかどうかは環境依存です。
インターフェースを追加するだけのクラス継承(メンバ変数を一つも持たない)ならスライシングが起こってもなんら問題ないよね?
C++の質問。
SuperClass* pSuper p = new SubClass();
SubClass pSub = (SubClass)p;
このようにダウンキャストするときにdynamic_castを使わず
C言語ライクにキャストするとキャストコストがない、で正しいでしょうか?
>>576 仮想関数があるとサイズに違いがでるよ。
>>577 演算子オーバーロードは問題外として
仮想関数関係のアレはC形式のキャストでもちゃんとやるよ
579 :
469 :2011/05/12(木) 19:45:23.61
>>577 Cスタイルキャストはオススメしない。コードが不明瞭になる
絶対キャストが成功する保障があるなら
static_castを使いましょう
boost使えるならpolymorphic_downcastをオススメ
580 :
579 :2011/05/12(木) 19:46:54.73
名前はミス
ポインタの場合はreinterpret_castもありますけど static_castの方は実行時ではなくコンパイル時ですね。 ありがとうございます。
C++やっているけどいまだにオブジェクト指向ってのが何なのか分かっていない
実行時のキャストコストって、CスタイルとC++スタイルで同じじゃないの?
オブジェクト指向を使ったいい例がない
C++の << >> ってかわいいよね
いやかわいい顔して悪魔だよ
コンストラクタから 仮想メンバ関数は呼んではいけなかったんでしたっけ? 基底クラスの非仮想メンバ関数は呼んでいいんでしたっけ? 教えてくださいお願いします
コンストラクタで仮想関数を呼ぶと オーバーライドされていても親クラスの関数が呼ばれる
親から順番にコンストラクトされる仕様だから 親がコンストラクトされる前に子のメンバ関数を呼び出せてしまうとやばい 子の準備前に呼ばれるわけだからね
>>590 親のコンストラクタから子のメンバ関数って呼べるんですか?
親のコンストラクタからメンバ関数を呼ぶと普通に其のクラスのメンバ関数(さらに親はいないとして)が呼ばれるみたいなんですが
呼び出せてしまうとやばいから、呼ばれないようになっている
>>592 ですよね
みなさん参考になりました
どうもありがとうございました
C++を知ってしまうとCなんて馬鹿らしくてやってられないよな;;
C++の前にCをやれって言われてるのは、文法を解説してるC++のサイトや書籍が少ないからなんだよな ほんと今から触れる人はCすっとばしてC++触るべきだと思うわ
さらにC++03すっ飛ばしていきなりC++0xの機能使ったりSTLより先にboostとか触るべきだわ
STLガンガンつかってるけどboost使ったことないわ 環境構築が居るってのが抵抗ある
599 :
uy :2011/05/15(日) 02:36:23.56
Boostとか、別にただのライブラリなので自分でかいたって良い。 たいしたものは存在してない lambda? スマートポインタ? 自分でかけよ 自分でその程度の機能すらかけないゴミカスが、ライブラリに頼る時に使う機構をBoostと呼ぶ そしてC++で出来る事は実は、やろうとすりゃCでも出来るので、 現在のITの世界の互換性っていう観点からみると、 C++よりもCを極めたほうが、広い世界を見ることが出来る Cにしろ、C++にしろ、いずれ、マシなコンパイラ言語が世の中に出てくるはずなので そのときに、いずれ両方とも消え去る Cは時代遅れ、C++は、時代遅れではないけれど記述が冗長すぎて、 この言語は、使っていけません、ただの芸術作品です 情報技術のお部屋に未来永劫飾っておく言語、C#、JAVAよりは偉いよC++。 Cの次くらいに、偉い C++は初心者の学習用言語にむいてる 生半可な力で使っていける言語ではないという点が、学習用途にはとても良い材料ではある その苦境を超えてこれるなら、よきプログラマになれるだろう そのままC++を使い続けるプログラマになったとしても、 C++から別言語に移ったとしても、C++を( その気になれば )かける奴というのは 根が強い。 言語というそのものへの理解が、深いといえる ゴミグラマは死ね
601 :
uy :2011/05/15(日) 02:39:56.84
602 :
uy :2011/05/15(日) 02:40:39.85
いっとくけど、すいとんしても無駄だからな ブラウザ5つもって全てのクッキーがレベル6以上なので、1個潰されたくらいなんともないので^^;;;;
ゲーム作るために速度が欲しいからC++って人もいるだろう プリミティブが多いゲームだとC#じゃ速さが足りない
俺は案件が要求する言語を使うが、そうでないやつがあれがいいこれがいいって言ってるんだろ?
プリミティブじゃねぇよパーティクルだよ!あぁ恥ずかしい!
607 :
uy :2011/05/15(日) 05:05:34.61
ゴミという単語をNGにしようと思ったけど それじゃGCネタとかメモリ管理ネタが誤爆で見えなくなりそうだし困ったものだ
>>609 uyをNGネームに指定してあとは連鎖で
C++でクラスのメンバとしてchar型の文字列を扱う方法はありますか? おねがいします。こんな感じで書いてみたんですが、案の定ダメでして。 class hoge { char hogehoge; public: char getHogeHoge() { return hogehoge; } char setHogeHoge(char value) { hogehoge = value; } }
>>611 class hoge
{
char hogehoge[256];
public:
char* getHogeHoge(char* value)
{
strcpy(value, hogehoge);
return value;
}
void setHogeHoge(const char* value)
{
strcpy(hogehoge, value);
}
}
613 :
uy :2011/05/16(月) 07:52:46.15
じゃあ俺が死ぬわ
いや俺が死ぬよ
はぁはぁ、生き残ったのは俺だけか…
死んで行った仲間のために、俺は戦う
623 :
デフォルトの名無しさん :2011/05/18(水) 14:02:29.70
例外処理について教えていただきたいのですが、他の人が作ったソースの修正を行います。 __try{}文を見つけました、これをC++のtry{}catch()に変更したいのですが、特に問題ないでしょうか? 環境は、windowsのアプリです。
>>623 だめだよwwwwwww
それはそれぞれ全然違うものだ
try{ __try… } catch{ … }
win32構造化例外でぐぐればなんとなくは分かるはず てゆーか何で書き換えたいの?
現在VC++から変数の値をVBに渡してVBで処理するプログラムを作成しています。
VC++でのdll作成、読み込み
VBでのdll作成、読み込みはできるようになりました。
しかし以下のサイト
http://www.nextftp.com/swlabo/m5_cpp/hp_dll/dll_00.htm を参考にVC++でdllファイルを作成しても
VBではどうしても参照してくれません。参照しようとすると
ファイルアクセスが可能で、有効なアセンブリまたはCOMコンポートであることを確認して下さい。
と出ます。
VC++は数値計算をかじった程度の知識しかないので、これ以上はお手上げです。
何がどういけないのか教えてください。
スレ違い
∵
630 :
デフォルトの名無しさん :2011/05/19(木) 20:00:37.39
Cがちゃんとしたオブジェクト指向を提供しないからC++やらないといけないよね;;
C++が「ちゃんとした」オブジェクト指向かどうかは微妙だけどな
627です。 解決しました。 お騒がせしました。
CとC++の違いを教えてください。、
>>633 使えるライブラリが違います
C++ではboost使えますが、Cでは使えません。
>>634 あっ。て事はCの後はC++でほぼ同じ内容を違う言葉で覚え直す感じでしょうか?
ありゃ。 wikiは参考にさせていただきます。 ありがとうございます。
うむ。 人に聞いてわかるほど単純じゃないな。 全部、一から勉強しよう。
wikipediaをwikiっていうな
wikipedia ⊂ wiki
pukiwikiってうまそう
wifi
643 :
デフォルトの名無しさん :2011/05/21(土) 23:29:00.28
VC++ 2010でzlibのlibファイルを作ろうとしているのですが、 大量のfatal errorを吐かれてコンパイルできません。 zlib\adler32.c : fatal error C1853: 'Release\zlib.pch' プリコンパイル ヘッダー ファイルが旧バージョンのコンパイラで作成されています。また、C++ のプリコンパイル済みヘッダー ファイルを C で使用しています (その逆も考えられます)。 zlib\compress.c : fatal error C1853: 'Release\zlib.pch' プリコンパイル ヘッダー ファイルが旧バージョンのコンパイラで作成されています。また、C++ のプリコンパイル済みヘッダー ファイルを C で使用しています (その逆も考えられます)。 以下略 手順は 1.プロジェクトは新規作成->Win32 コンソールアプリケーション 2.表示されたウィンドウのスタティックライブラリを選択して完了 3.zlibの公式からsource code, version 1.2.5, zipfile formatを落として.cと.hをプロジェクトフォルダに入れる 4.既存のファイルから.cと.hを追加し、Releaceでコンパイル プリコンパイル済みヘッダを消してみたり、stdafx.hなどを消してみたり色々試したのですが、 他のエラーを吐き始めるので先に進みません。 宜しくお願いします。
.hをコンパイルしている悪寒。つーか、VSスレにでも逝ったら?
>>643 暇なので試してみた
1、プロジェクトは新規作成->Win32 コンソールアプリケーション
プロジェクト名はzlib(zlib1でもなんでもいいけど),ソリューションのディレクトリを作成にチェック
2、表示されたウィンドウの"スタティックライブラリ"および"空のプロジェクト" を選択し完了
3、 zlibの公式からsource code, version 1.2.5, zipfile formatを落として.cと.hをプロジェクトフォルダに入れる
4、exsample.cを除く他の*.c,*.hをzlibプロジェクトに追加しコンパイル
4996を除けばエラー0、警告0
動作確認方法は
同ソリューションに
コンソールアプリケーションプロジェクトを追加し
exsample.cを追加
$(OUTDIR)\zlib.libをリンクしコンパイル
こちらも4996を除けばエラー0、警告0
実行しても問題はない模様
>4、exsample.cを除く他の*.c,*.hをzlibプロジェクトに追加しコンパイル
この行は適当だから他のメイクファイルを参考に確認したほうがいいかも
646 :
デフォルトの名無しさん :2011/05/22(日) 01:39:12.77
>>645 2度ほど、慎重にやってみましたがエラーの内容は変わりません。
もしかすると、と思いfatal errorの内容で調べてみたら
プリコンパイル済みヘッダを使用しない、/Tcオプションを付ける、などで対処できるらしいと聞きました。
そこで、プロジェクトのプロパティ->構成プロパティ->C/C++->プリコンパイル済みヘッダ、
プリコンパイル済みヘッダーの項目を使用しないに変更しました。
また、同様にプロパティ->構成プロパティ->C/C++->詳細設定、
コンパイル言語の選択をCコードとしてコンパイルを選択、
プロジェクトをクリーンしてビルドしました。
ビルドは通りました。.libも作成されています。ログを載せておきます。
http://www.dotup.org/uploda/www.dotup.org1657702.log.html 半分自己解決したようなものでお手を煩わせてすみません……。
ありがとうございました。
> そこで、プロジェクトのプロパティ->構成プロパティ->C/C++->プリコンパイル済みヘッダ、 > プリコンパイル済みヘッダーの項目を使用しないに変更しました。 "スタティックライブラリ"の場合はそうだね、すまん > また、同様にプロパティ->構成プロパティ->C/C++->詳細設定、 > コンパイル言語の選択をCコードとしてコンパイルを選択、 拡張子が*.cならCコードとしてコンパイルされるのが デフォルトの動作なので意味無いよ
C++で独自のクラスAを格納するベクターコンテナ(STL)があったとき、 Aのoperator==は、フレンドで、グローバルに定義しないといけないの?
例外はオブジェクト指向、特にカプセル化と相性が最悪な気がするんですがどうでしょうか? せっかく実装を隠ぺいしたのに実装に依存して例外処理を書き換えないといけないなんて不愉快ですよね
ほお、カプセル化すればエラー処理はしなくても良いと?
>>649 例外処理を実装に依存して書き換えるって、意味がよくわからないんだが。
それは例外処理の中身によるだろうし、もしそこが実装依存にしか書けない
エラー処理なら、それは例外処理を利用しなくても実装依存にしか書けないんじゃないのかな?
>>652 例えばもともとnothrowだったメソッドが実装変更で例外投げる仕様になったら困るだろ
中身は意識しなくていいのがカプセル化のメリットなのに
これでは何を投げるかドキュメントやソースを常にチェックしないといけない
そして変更があったらクライアントコードすべてを調べなければならない
例外のせいでカプセル化台無し。こんなバカな仕様があってたまるかってこと
>>653 あ、コンパイル通った……
通らなかったときは何してたんだ……
サンクス
#include <stdio.h> struct Man { char name[32]; int age; } int main() { struct Man student; strcpy(student.name, "山田太郎"); student.age = 16; printf("生徒の名前は%dです\n", student.name); printf("年は%d歳です\n", student.age); return 0; } このソースのstrcpyの所に赤波線が出て、マウスを乗せると識別子"strcpy"が定義されていませんと出ます。 どうすればいいのでしょうか? win7・VC++です
#include <string.h>
>>657 ありがとうございます。
猫でもわかるCなんて買うんじゃなかった・・
>>654 それは言語仕様というより、設計の問題では。
class CFoo { public: template <class CBoo> static int hogehoge(int CBoo::*); …省略… }; という(ような)クラスを目にしたのですが、 staticメソッド hogehoge の引数「int CBoo::*」 が意味不明です;; これはなんの型なんでしょうか?
引数なしintを返すCBooのメンバ関数ポインタ
関数ちがう変数
ああ、ありがとう。なんとなく分かって来た。 型int のCBooメンバへのポインタって事ですね。 int を void に変えたらコンパイルエラーになったけど、 それは 型void のメンバなんてそもそもないからなんだね。
こういう風に書かないとコンパイルエラーになるけど気のせいか? hogehogeはstaticメンバ関数なので非staticメンバ変数にはアクセスできないだろ class CFoo { public: template <class CBoo> static int hogehoge(int *cbp) { return *cbp; } }; class CBar { public: static int i1, i2; }; int CBar::i1 = 1; int CBar::i2 = 2; class CBar2 { public: static int i1, i2; }; int CBar2::i1 = 3; int CBar2::i2 = 4; int main() { std::cout << CFoo::hogehoge<CBar>(&CBar::i1) << std::endl; std::cout << CFoo::hogehoge<CBar2>(&CBar2::i1) << std::endl; }
>>664 なんか指摘おかしくないか?
確かにhogehogeはstaticだから"CFooの"非staticメンバ変数にはアクセスできないけど
それが
>>660 となんの関係があるのかわからないな
hogehogeにメンバ変数のポインタ渡してるだけだぞ?
>>665 そうなのか
そしたらメンバ変数のポインタを渡したhogehoge()内でどんな事がCBoo::*に対して
出来るのかがわからない
>>666 コンパイルエラーになるっていうんだもの
おかしいってのはそこ
グローバル変数かstaticメンバ変数使えば何かすることはできるだろう
意味は知らんが
これなら分かるんだよな class CFoo { public: template <class CBoo> int hogehoge(CBoo* cp, int CBoo::*cbp) { return cp->*cbp; } }; class CBar { public: CBar(int i, int j) : i1(i), i2(j) {} int i1, i2; }; int main() { CFoo cf; CBar cb1(1, 2), cb2(3, 4); std::cout << cf.hogehoge(&cb1, &CBar::i1) << std::endl; std::cout << cf.hogehoge(&cb2, &CBar::i1) << std::endl; }
>>667 ああやっぱりか
staticメンバ変数にstaticでないメンバへのポインタを渡してもコンパイルエラーになるだけだしな
staticメンバ関数がthisを受け取らないという事を知らないとこのエラーの意味は 永遠に分からないだろう
671 :
デフォルトの名無しさん :2011/05/23(月) 20:56:25.55
文字列変数をグローバルで volatile char recbuf[20]; と宣言して、 mainの中で char s[20]; と定義して、strcpy(s,recbuf); と書くと、 warning: passing argument 2 of 'strcpy' discards qualifiers from pointer target type という警告が出ます。 どのように処理するのが正しいのかわからずに困っています。 どなたかこのワーニングの対処法がわかるかたいらっしゃいますか?
>>671 キャストする
俺はconst_castはvolatileも外せるっていう程度の知識しかない人なので
それが本当に正しい対処法なのかは知らないが
>>672 それが正しいかどうかがわからないので困ってます。
volatile char* を char* にキャストすることの意味が
いまいちよくわからないですよね。
const char* にキャストすればいい
それが本当にvolatileなら、迂闊に外していいものか充分に検討すべき。
>>675 どうせ外さなくったって暗黙のキャストが発生するだろ
どうしたらいいんだよ
いやだから、そのvolatileな領域にアクセスする前に排他処理を行なわなくていいのか、などの検討をするべきだ、と。
C++でのクラス構成で質問です。 自分はよくこういう事をします。(文法細かい部分無視で説明用に省略) Class A{ MyDataClass data; // データ管理クラス B ChildClass; A(){ ChildClass.pdata = &data; } } Class B{ MyDataClass* pdata; // データ管理クラスポインタ } シングルトンパターンでの構築方法は知ってますが、ついついこっちのが簡単なのでやってしまいます。 こういうのは一般的なんでしょうか?それとももっと良い方法があるのでしょうか?
679 :
678 :2011/05/24(火) 05:13:56.85
さすがにMyDataClassのアドレスを次々と下へいくつもリレーしていく数が多くなれば、 シングルトンパターンで構築します。 しかし、我流の組み方故に果たして自分はオブジェクト指向プログラミングしているのか? そもそもそんな構築方法でいいのか自信が無くなってきました。 そもそもテンプレートとかも利用価値を感じたことがありません。 単一オブジェクトや変数を扱うなら小細工いらないし、複数のオブジェクトを扱うようなら テンプレートの中で条件分岐が大量に増えてややこしくなるので、別関数いくつも用意したほうがいいように思います。
相互参照をどう解決するかってこと? 普通に弱参照つかったり、引数で親をリレーしたりとかじゃねーかな
>別関数いくつも用意したほうがいいように思います。 テンプレートの読み難さは尋常じゃないよな。 ありゃ完全にエロい人のための仕様だ。
そうか? std::min()なんてシンプルそのものじゃないか。
派生クラスの間に合わせ感はすごい。 完全に後でちょっとした使用変更に対応する為のもの。 最初から組み込むのは混乱の元。
メタプロまで出来るとテンプレートの凄さが理解できるんだけど もはや完全にバッドノウハウだから だったら最初から言語機能に組み込んで綺麗に書けるようにしろよとは思う
いま勉強中で仮想基本クラスとかやってるんだけど、 本当にこんなややこしいもので開発なんてできるのけ?
初心者的な質問で申し訳ありませんが、よろしくお願いします。 AとBのメソッドがあり、複数のスレッドで非同期的にメソッドが呼ばれています。 AとAが同時に呼ばれるときに排他処理をする必要は無いのですが、AとBが同時に呼ばれてはいけないので、排他処理をする必要があります。 この場合、一般的にはどのように排他すればよいのでしょうか? Windows環境でWin32APIを使用しています。
EnterCriticalSection
>>685 問題が発生するような多重継承が出てきた時点で
設計がおかしいくないか疑うべきだがな
結局CとC++はどっちのが実行速度速いんだ
691 :
デフォルトの名無しさん :2011/05/24(火) 22:57:03.38
こういうバイナリファイル(先頭から1,2,0,4,0,0,0) 0102 0004 0000 00 ... を先頭から1バイト、2バイト、4バイトで読み込むと 1,2,4にならずに1,0,4になるのですが、これはなぜですか? ifstream ifs ("mem.dump"); ifs >> buf_1; printf ("%x ", buf_1); ifs >> buf_2; printf ("%x ", buf_2); ifs >> buf_4; printf ("%x ", buf_4);
結果は $ ./a.out 1 0 4 です。
違った。初期値が入ってました。 1バイト目が1(正しい) 2〜3バイト目が0(間違え) 4〜7バイト目が変わらず(間違え) です。とにかくおかしいです。
わかった。アライメントがあってないと壊れて0が帰ってきて それ以降一切読めなくなるのですね。 飛んだ欠陥品だ > ifstream
>>691 buf_1, buf_2, buf_4の型は?
オブジェクトのメンバを介してゲーム上のキャラクタ同士がダメージを与えたりするものなのだろうか。 いきなりだが、ゲームプログラムの噺です。
>>694 欠陥品なのは君の頭の方です
#include <iostream>
#include <fstream>
#include <iomanip>
const char* const FILENAME = "test.bin";
int main()
{
std::ifstream ifs(FILENAME, std::ios::in | std::ios::binary);
char buf[128];
if (!ifs)
return -1;
ifs.get(buf, 7);
std::cout << std::setw(1) << std::hex << std::setfill('0') << std::right << static_cast<unsigned>(*reinterpret_cast<unsigned char*>(buf)) << std::endl;
std::cout << std::setw(2) << *reinterpret_cast<unsigned short*>(buf + 1) << std::endl;
std::cout << std::setw(4) << *reinterpret_cast<unsigned*>(buf + 3) << std::endl;
}
桁数を間違えていたので修正 #include <iostream> #include <fstream> #include <iomanip> const char* const FILENAME = "test.bin"; int main() { std::ifstream ifs(FILENAME, std::ios::in | std::ios::binary); char buf[128]; if (!ifs) return -1; ifs.get(buf, 7); std::cout << std::setw(2) << std::hex << std::setfill('0') << std::right << static_cast<unsigned>(*reinterpret_cast<unsigned char*>(buf)) << std::endl; std::cout << std::setw(4) << *reinterpret_cast<unsigned short*>(buf + 1) << std::endl; std::cout << std::setw(8) << *reinterpret_cast<unsigned*>(buf + 3) << std::endl; } 実行結果 01 0002 00000004
A.h #ifndef classA #define classA class A{ public: class B{ public: static const int foo; }; }; #endif A.cpp #include "A.h" const int A::B::foo=0; M.cpp #include <iostream> #include "A.h" int main(int arg, char** argv){ int i=0; switch(i){ case A::B::foo: std::cout << "hoge" << std::endl; } return 0; } ***** こう書いたら「M.cpp:6: error: ‘A::B::foo’ cannot appear in a constant-expression」と怒られるのだけれど、 なして? それと、クラス構造をそのままにしたい上でこういうとき、どうやったら良いんでしょう。 無理なのかな
fooをenumにしてみるしかなひ
>>701 やっぱりそうなんかー
enumは値の名前がグローバルになるのでイヤなんだ
結局クラス外にインナークラスを追い出して、
クラスじゃなくてnamespaceにしました orz
※
でもA.cppの中にmainがあると上のソースで通るんだよなぁ
なんなんだー
え?インナークラス内でもenum使えるよ?
え? enumの名前がグローバルって何そのC。
ごめんenum勘違いしてた
これだとアライメントが揃ってない読み込みでifstreamが壊れる。 ifstream ifs ("dump.bin"); char buf_1 = -1; short buf_2 = -1; int buf_4 = -1; ifs >> buf_1 >> buf_2 >> buf_4; printf ("buf_1 = %x\n", buf_1); printf ("buf_2 = %x\n", buf_2); printf ("buf_4 = %x\n", buf_4); バイナリデータは01 02 00 04 00 00 00 ... 実行結果は、 buf_1 = 1 buf_2 = 0 buf_4 = ffffffff
template<int i> { int xxx() { if (i == 0) { ... } else { ... } } }; このメンバー関数xxxをテンプレート関数にしてifを使用しないようにしたいと思っています。 i == 0で特殊化すれば良いと思うのですが、どのように記述すればよいですか?
template<int i> struct x{ でした。
template < int i > struct x { int xxx( void ) private: int xxxZero( void ) { ... } int xxxNonZero( void ) { ... } };
途中で送っちゃった これでおk #include <iostream> using namespace std; template < int i > struct helper { } ; template < int i > struct x { int xxx( void ) { return dispatchXxx( helper< i >( ) ) ; } private: int dispatchXxx( helper< 0 > const & ) { return xxxZero( ) ; } template < class T > int dispatchXxx( T const & ) { return xxxNonZero( ) ; } int xxxZero( void ) { cout << "zero" << endl ; return 0 ;} int xxxNonZero( void ) { cout << "non zero" << endl ; return 1 ;} }; int main( void ) { x<0> x0; x<1> x1; x0.xxx(); x1.xxx(); return 0; }
>>710 ありがとうございます。思ってたより複雑だなあ。精進します。
> template < int i > struct helper { } ;
これはint => 型に変換? マップ?するテクニックでしょうか?
>>711 >707ではメンバ関数だけどクラスから独立させちゃっていいの?
それだったらもっとずっと簡単。
中でメンバー関数を呼ぶので、メンバー関数じゃなければだめです。
関数を宣言するときと定義するときとの両方で型を明示するのは何で?
めんどくせぇなぁ。インスタンスの参照を渡すクラス外関数にしちゃえばいいのに。
Visual Studio 2005のC++でプログラミングしてます。 ごくまれに実行ファイルの明らかに計算結果がおかしくなってしまうことがあって、 前ファイルをリビルドすると治ります。 これってC++だと起こりうることなんでしょうか。 それともPCのどこかがおかしくてobjファイルが壊れたりしているのでしょうか。
>>716 VC++がおかしいまたは時計がおかしい
C++がおかしいということは無い
たぶんタダのバグって落ち
>>716 project propertyのC++/GeneralのTreat warnings as errorsをyesにしろ。これで9割方解決する。
未初期化変数か未初期化領域がありそうだな。
>>706 アライメント関係無い
バイナリを>><<で読み書きすんな
C言語かよ
>>722 アホ
>>706 はC++だよ
しかもテキストデータではなくバイナリデータを読み書きしてるんだ
バイナリデータに>>と<<は禁物
C言語でもバイナリデータの読み書きにはfread()とfwrite()を使うだろうが
それと同じ
よく話が分かってないのに余計な首突っ込むなカス
>>724 あまり弱いものいじめはするな。彼は可愛そうな子なんだ
>>724 バカはお前だ。ifstreamはバイナリ専門ではない。
わからないなら引っ込んでろ。
ifstream ifs ("test"); int number; ifs >> number; ↑ これは完全に正しい。分かったら恥ずかしさのあまり布団に頭突っ込んで悶えてろ。
文字をデータとするrange(istreamで仮定されているものはここまで汎化されたものではないのだろうけど) から読み取るものと考えると1byteが1文字に対応する多くの環境なら問題ないのかな? 一応openmodeにbinaryフラグが用意されてるからこういう使い方も想定済みとは思うのだけど
>>727 まだ言ってるのかしつこいなあ
話は
>>706 から来てるんだぞ
「バイナリデータ」と書いてあるのが目に入りませんか?めくらですか?
>>726 "dump.bin"の中身が a 111 222 とかだったら>>でいいだろう
しかし今の場合は 01 02 00 04 00 00 00 と続くバイナリデータの読み書きだ
この場合はオープンの時に
>>699 のように std::ios::binary を指定し、さらに
メンバ関数 get() でないと正しく読み取れない
もちろん改行文字など指定してはいけない
テキストではないのだからね
嘘だと思うんなら自分でバイナリファイルを作って読み書きしてみろ
>>731 「言えるか」じゃなくて実際に試してみろって
話はそれからだ
話がややこしくならないようにgccを使え
>>733 #include <iostream>
#include <fstream>
#include <iomanip>
const char* const FILENAME = "test.bin";
int main()
{
std::ifstream ifs(FILENAME, std::ios::in | std::ios::binary);
unsigned char c;
unsigned short us;
unsigned u;
if (!ifs)
return -1;
ifs >> c >> us >> u;
std::cout << std::setw(2) << std::hex << std::setfill('0') << std::right << static_cast<unsigned>(c) << std::endl;
std::cout << std::setw(4) << us << std::endl;
std::cout << std::setw(8) << u << std::endl;
}
実行結果
01
0000
0040b0ac
いい加減にあきらめろ
>>733 ちなみに使ったファイルは
>>699 と同じ物
バイナリエディタで中身を覗けるから間違いない
なあなあ、なんでこんなに低レベルなの?
自分の思い通りにならないのは糞だって決めつけてるからさ
バイナリデータを>>で読めないとか主張する奴は仕様から読み直せ。 まったく禁止されてない。もう見てられない
もうねアホかと
俺はistream::readとostream::write使うようにするけど>>でも空白とか改行に影響されずに読める方法があるなら興味ある
template <class T>
class Binary {
T _data;
public:
Hoge(T data=0) : _data(data){}
...
friend istream& operator>>(istream& is, Binary& b) {
is.read(reinterpret_cast<char*>(&b._data), sizeof(T));
return is;
}
...
};
みたいのを用意してやれば
ストリーム演算子で読み書き出来るのは分かるけど
プリミティブな型ではどうやるかは分からんな
>>739 氏に期待
744 :
722 :2011/05/25(水) 19:50:05.56
ごめん 俺の勘違いだった
今日も大漁でした。本当にありがとうございました。 またのご利用をお待ちしていません。
>>744 バーカ
仕様書ぐらい用意しとけ
恥かくぞ
>>699 も厳密には間違っているんだけどな
get()じゃなくてread()を使わなければならない
get()では改行文字が現れるとそこで読み取りを終了してしまう
まあ operator>>でバイナリを読み取れると顔を真っ赤にしてファビョっていた
ヤシよりはマシだけどな
C言語以前の問題なのですが コマンドプロントでディレクトリの移動がよく分かりません。 デスクトップ上に保存しているメモ帳に「test.c」と名前を付け chdir C:\Users\ユーザー名\Desktop\test.c.txt とコマンドプロンプトに入力したところ ディレクトリ名が無効ですとなりました。 ディレクトリ名に問題があるとおもうのですがどうなおせば良いのでしょうか? 独習Cという本を買ってさっきから始めたのですがこの辺詳しく載っていなくて困っています
デスクトップにtest.c.txtっていうディレクトリがあるのか? 違うならそこ削らないと
ディレクトリとファイルの区別がつかない人ですか?
>>750 ,751
どうやらディレクトリとファイルの区別が付いていなかったようです。
調べてみたらなんとか解決しました。ありがとうございます。
その本にはなんて書いてあるんだ?
754 :
デフォルトの名無しさん :2011/05/26(木) 17:12:19.44
cinって英語で何て単語の略なんですかね?
cはcharacter inはstandard input
Cの標準入出力なんだから、(c)のためのin/out とか、標準なんだから、(c)ommon とか、 当時はキャラクタベースだから、(c)onsole とか、バイト単位だから (c)haracter とか、 好きなの選べ。
Cってほんとにあいまいな言語だな
知らんかった…今までconsoleだと思ってた でもたしかにiostreamヘッダだしconio.hみたいに明記されてるわけじゃないな
761 :
デフォルトの名無しさん :2011/05/26(木) 21:07:57.23
世間一般(と言っても、理科系の大学)では、CもC++も一緒くだだよ。
762 :
デフォルトの名無しさん :2011/05/26(木) 21:32:15.61
Character INputでcinって事でOK? 変な端折り方だな。 coutはなんとなく意味分かるのに。
マス目のゲーム戦闘画面ってDXライブラリで製作出来ます? マップに座標を打ち込みつつ初期化 {0,0,0} {0,1,1}の様な形。 for文でマップのマス目左上からズレていくように書き switch文で case 0 は DrawGraph 画像 case 1 は 〜〜 の様にしてみたんですが、上手く表示されません・・・。 マス目ごとに対応した番号の画像を表示させるにはどのようにすれば宜しいでしょうか?
>>762 INput
OUTput
むずかしいね
765 :
763 :2011/05/27(金) 04:39:14.04
すみません スレ間違えました
>C++は関数のオーバーロードがあるから保守性が高い ?
>>766 何この人
だれのレスを引用したの?
きもちわる・・・
769 :
デフォルトの名無しさん :2011/05/29(日) 19:25:46.47
すみません。C++にて、あるクラスのコンストラクタを 関数の戻り値にして、main関数で受け取るということはできるでしょうか? 一応、できるみたいなんですが、文法上ただしいのでしょうか・・ なんしろ、コンストラクタというと、新しいオブジェクト生成しか使ったことがないんで・・
>>769 「コンストラクタを関数の戻り値」というのがよくわからないが、これのこと?
値を返すならコピーされるから問題ない。
string f()
{
return string("abc");
}
int main()
{
cout << f() << endl;
}
コンストラクタのメンバー関数ポインタをとれるかってことじゃないの?
まぁそれだったらコンストラクタのアドレスを取得してはいけないでFAだな
>>769 はなにをしたいんだろうな
オブジェクトを生成する関数を変数に入れたいとか?
コンストラクタ(デストラクタも)のアドレスは取得できない、じゃないの?
774 :
769 :2011/05/29(日) 21:21:04.85
Area Ex :: getArea() { return Area(); // Areaクラスのコンストラクタ } void Ex :: nanigasi() { Area area = getArea(); }
775 :
デフォルトの名無しさん :2011/05/29(日) 21:24:55.16
簡単に話すと↑こういうことです。最初のselectArea()関数の戻り値で Area関数のコンストラクタを使っています。 以上のことは、C++の文法上許されていることなんでしょうか? もちろん、最初から、2番目の関数(getArea関数)で、 Areaクラスのオブジェクトを作れば一番簡単なのは当たり前ですが・・
Area()は一時オブジェクトの生成だよ それがコピーされてareaに代入される そりゃ結果的に当然コンストラクタ自体は呼び出されるが、 コンストラクタを直接呼び出してるわけじゃない
777 :
769 :2011/05/29(日) 21:27:00.40
まちがえた・・・正しくは、 >最初から、2番目の関数(getArea関数)で、 最初から、2番目の関数(nanigasi関数)で、 です・・・
778 :
769 :2011/05/29(日) 21:29:13.73
>>777 ああ、一時オブジェクトの生成っていうんですか。この場合は。
本を読んでいて、なにか、見慣れない構文だなと疑問におもっていて
どうも頭を悩ましていましたので・・
ありがとうございます。だいぶすっきりしました。「一時オブジェクトの生成」で、
よくググッてみます。
ありがとうございました。
>>777 メンバ関数へのポインタなら返せる
staticじゃなければthis、つまり本体のオブジェクトを指すポインタも必要だが・・・・
ずれてやがる
最短経路探索とかのテスト用に、ノード群とそのエッジ群をランダムに作りたいんだけど、 エッジの作成をノードを2つランダムに選んで作成ってすると、明らか遠すぎる所 と繋がっちゃってぐちゃぐちゃな経路になってしまう。 よくあるこんな図みたいに、ある程度近くのノードと繋がってる綺麗な経路をランダムに 作る方法ってありませんか?
ココで聞いていいのか微妙なんですが、 GNU General Public License でのソフトを、自分のソフトが途中で起動する、という状況の時、 自分のソフトと利用するソフトの両方を配布するなら自分もGNUである必要がありますか? また、もし自分のソフトを使う人に、GNUのソフトのダウンロードを任せるとしたら、 自分のはGNUである必要がありますか?
>>781 平面グラフにするとか、n部グラフにするとか
785 :
783 :2011/05/29(日) 23:26:35.74
やはり質問取り下げます。すみません
>>782 どの程度の規模で作るのかにも寄るけれど、せいぜい100ノードくらいでいいのなら、
全ノード間の距離を計算してもたいしたことないんじゃないか?
あとは、各ノードで距離順にソートして、範囲も個数も好きにしたまえ。
>>784 >>786 ありがとう、楽な方の予め距離計算して近い物同士を繋げる方法でいってみることにします。
>>781 距離をパラメーターにして、乱数を一様ではなく正規分布とか、自然な分布にすればそれっぽく見えると思うよ
vectorでクラスを保持していて、そのクラスの中の変数を基準に昇順でソートしたいんだけど、 どうすればできますか? 一度vectorから取り出して、自分で書いたソート関数でソートしてまた戻すってするしかない?
operator< と operator> を用意しなされ
前者だけで充分。
でもなんか比較がひとつだと対称性がなくて気持ち悪い
reverse_iteratorで取り出せば逆順になる
>>789 環境とオブジェクトの個数にもよるけれど、オブジェクト数に対してメモリが十分あるなら
vectorで保持してそれとは別に、setなりmapなりで比較関数を用意して、
オブジェクトを登録するメソッドを呼ぶたびに、vectorと、ソート用コンテナにポインタで
登録するとかした方が楽じゃないか? かっこわるい?
格好悪いと言うか、面倒臭い。
楽か?
>>789 自分で書いたソート関数って叙述関数の事か
普通の関数にしろ関数オブジェクトにしろlambda式にしろ std::sort()で行けるだろ
もちろんdeep copyをするためにコピーコンストラクタと代入演算子は定義しとくのが
コンテナにクラスを入れる必要条件だが
ありがとう、operator定義してsortで実装しました。 今までoperatorって難しそうだし面倒そうだと、勉強せず避けてきてたけど、やってみれば 意外とすんなり理解できたし、何よりすごく便利だね もっと早く身につけておくべきだった
そしてop地獄
次は何でもかんでもoperatorを付ける病に
>>800 いやいやshallow copyしか必要ないクラスにはいらないだろ
要するにコンテナに入れるクラスの要件がCopy ConstractableでCopyableであればよい
最初なぜauto_ptrがコンテナに入れられないのか随分悩んだけどそのお陰でよく理解できた
普通にshared_ptr使えばよくね?
>>802 今はな
その当時はboostなんか無かったんだよ
>>803 > その当時
> 789 名前:デフォルトの名無しさん[sage] 投稿日:2011/05/30(月) 15:42:46.99
え?
ifstreamを最初にテキストモードで開きました。 途中からバイナリモードで読み取りをしたくなった場合、 どのようにモードを変更すればいいですか?
read/write
>>806 ありがとうございます。なんかトンチンカンな質問だったかもしれません
なぜか下のプログラムではファイルの真ん中あたりまでしか読めませんでした。 途中なのにwhileを抜けて実際のファイルサイズの大体半分くらいの ByteNum サイズになってしまいます。どんな原因が考えられますか? std::ifstream ifs(Filename); int ByteNum = 0; while(true) { unsigned char buf[1] = ""; ifs.read(reinterpret_cast<char*>(buf),1); ByteNum += 1; if(ifs.eof()) break; }
改行が\r\nから\nに変わったとかじゃないの? あとeof()の使い方が間違ってる それじゃ一回余計にread呼んでByteNumも1足しちゃうよ
810 :
808 :2011/05/31(火) 06:14:18.46
>>809 やはり改行の関係のようでした。
結局バイナリモードで全部やったところきちんと読めました
ありがとうございました
よく分からないので教えてください えっと、自作クラスAを格納するvector<A>のSTLコンテナがあるとして そのコンテナのインスタンスをI1、I2とかとします クラスAには単純な代入と比較「A& operator=(const A&)」や、 「bool operator==(A&)」を定義してます ここで「単純な」というのは、メンバをコピーや比較するだけと言う意味です ここでコンテナインスタンスI1, I2に対して、I1 == I2や、I1 = I2などを使うと g++で色々(/stl_algobase.hのなかで)エラーがでたあと、 「 note: candidates are: A& A::operator=(A&)」と怒られます こういう自作クラスをSTLコンテナに格納し==や=をコンテナに対して使うとき、 Aに==や=を単純に定義するだけじゃ無理なんでしょうか 無理な場合、なぜ無理かという構造を教えてくれたらうれしいです できる場合、なにが足りないのか教えていただけたら助かります お願いします
あ、いけました すいません お騒がせしました
std::copy std::equal
>>813-814 すいません
どうもコンテナに入れるクラスにoperator==を定義するとき、
引数と関数自体をconstにしないといけないみたいですね
そしてconstで受け取ったクラスインスタンスのメンバにコンテナがあったら
返ってくるイテレータ型がiteratorじゃなくてconst_iteratorなんですね
勉強になりましたが、C++ややこしいっす……
>>816 そうなのかかえって勉強になった
俺はconstの参照で引数をバインドすると引数の受け渡しが高速になるので
そうしていただけだが(コピーコンストラクタの呼び出しが行われない)、const関数は
非constの引数も受け取れるけどその逆はだめだからな
ある法則にしたがってデータを変換し、 新しいストリームオブジェクトを返す関数があったとして MyStream * convert(MyStream *source) この関数はストリームのヘッダ位置をどうするのが一般的? source ストリームのヘッダ位置は関数呼び出しの時点に戻しておく source ストリームのヘッダ位置は元に戻さず、最後に読み取った位置で放置 関数が返すストリームはヘッダ位置を0にしておく 関数が返すストリームはヘッダ位置はデータ末尾(追記可能な位置)にしておく 用途によって違うなら、想定しているのは... ZIPからファイルを読み出す MyStream file = GetFileFromZipStream(zipStream) とか スクリプトのプリプロセッサ MyStream preprocessedSource = RunPreprocessor(rawSourceTextStream) とか。
819 :
デフォルトの名無しさん :2011/06/01(水) 14:39:43.26
今、抽象クラスの勉強してるんですけど、まどマギ思い出したわ。
>>816 これって今や、「C++が」ややこしいって印象になるんだな…
822 :
デフォルトの名無しさん :2011/06/01(水) 18:18:14.79
>>821 virtualつけると具体的なオブジェクトから抽象的な概念としての存在になる辺りがまどかのラストに似てるから。
//魔法少女クラスの宣言
class Mahousyoujo{
private magic;
public:
void mahousyoujo(int personal);
};
//魔女クラスの宣言
class Majo:public Mahousyoujo{
public:Majo(int personal);
};
↓
//神クラスの宣言
class Madoka{
protected:
int magic
public:
virtual void majo(int personal);
};
//あと書くのめんどいや。
823 :
デフォルトの名無しさん :2011/06/01(水) 18:29:35.92
1000×1000ぐらいのBMPの画像データ読み込もうと char a[10000000] ってでかい配列作ったら大きすぎてプログラムがメモリ確保できなくて動きませんでした。 こういうのって一般的にどうやって解決するんでしょうか?
すみません。2つ質問なのですが、 1.CreateWindowで作った子窓を移動・消去するにはどうすれば良いのでしょうか? 2.CreateWindowで作った子窓同士を、いちいちマウスでクリックせずキー操作でフォーカスを移動したいのですが そうした方法の解説サイトは無いでしょうか?
828 :
827 :2011/06/02(木) 12:11:45.16
1の子窓の移動はSetWindowPosで出来る事が解りました。下手に窓を作ったり消したりは考えて見ると怖いので見えない位置に移動させるべき・・ですね。きっと。 フォーカスについても自己解決目指していろいろ調べてみようかと思います。
アホな手法使うんじゃない
>>828 それが正解です。
見えないところは、マルチディスプレイに気をつけるように。
MinGW gppでコンパイルしてるんですが、このばあい成果物を公開するとしたら、ソースも公開しないとだめなんですか?
いや、一部のソースも公開しないなら、しなくていいんじゃない。
833 :
827 :2011/06/02(木) 13:35:44.82
フォーカスについてもSetFocusで出来るとわかり、自分なりの形で組んでみようかと思います。
>>830 マルチディスプレイ・・環境に対しても気をつけ様と思います。
ご助言ありがとうございました。
>>833 829さんの忠告が見えないの?
見えないところに移動じゃなくてShowWindowで何とかしろ。
配列使えば?
bf派生?いいえgrass派生です
そっちか
841 :
福盛俊明 :2011/06/03(金) 09:11:45.19
842 :
デフォルトの名無しさん :2011/06/03(金) 19:30:13.92
プログラムをassert()で終了させた際に、 それまでに開いていたストリームを閉じてしまいたいのですが、 やり方があるならば、どなたか教えてください
assertは内部でabortを呼んでプログラムを終了するが、 abort呼び出しはシグナルSIGABRTを投げるので、 signalハンドラでそれを拾えばそういうこともできる
シグナル拾ったら、肝心のcoreが出来ないじゃん。
そんなこと無いだろ
やってみろよ。
やってみたら当たり前のようにcore吐いたwww 低能哀れすぎwww
そもそもSIGABRTは拾えない飢餓。
Assertは使うものじゃないって習った バックトレース拾えないから
そもそもassertはそういう使い方をするものじゃないしな。
なるほど、シグナルハンドラから戻ってきたらSIG_DFLに再設定してもう一回自殺するのか。
言語規格書にはSIGABRTハンドラはreturnしないと書いてある つまり、登録したハンドラの実行後プログラムは終了する
>>842 atexit()で関数を登録して、そこでfcloseall()を呼ぶとか。
つかassert書くぐらいで終了処理したいなら if文書いて中の最後でexit呼べば良いと思う
本当は sigaction() の方が便利だが、標準の範囲だとこんな感じ? #include <stdlib.h> #include <stdio.h> #include <signal.h> void sig_abort(int sig) { puts("interrupt"); } int main(void) { if (signal(SIGABRT, sig_abort) == SIG_ERR) { perror("Couldn't establish sig_abort"); }; abort(); puts("Do not abort"); return 0; }
>>825 そんな事は書いてない。
The abort function causes abnormal program termination to occur, unless the signal
SIGABRT is being caught and the signal handler does not return.
unless以下の例外はSIGABRTハンドラ内でexitしたりlongjmpしてハンドラから帰ってこ
なかった場合の事を述べている。
C1X でいうところの _Noreturn 関数なのは abort() のほうだね
>>857 ん?だからSIGABRTハンドラからabort()の呼び出し側へ戻ることは出来ず
ハンドラ実行後はプログラムが異常終了するんだろ?
>>852 の通りじゃん
てか assertしといてcloseはしたいという ありえない話を前提にしても意味がなくね?
862 :
デフォルトの名無しさん :2011/06/03(金) 23:57:19.13
>>859 日本語訳が必要?
> abort関数は、シグナルSIGABRTが補足され、かつシグナルハンドラがリターンしない
> 場合に、異常プログラム終了を引き起こす。
>>852 > 言語規格書にはSIGABRTハンドラはreturnしないと書いてある
こんなこと書いてないじゃん。
>>860 用語間違えたなら言い訳しないでそういえよ。
SIGABRTハンドラはリターンすることも、リターンしないことも可能。
リターンしないのはabort()
863 :
842 :2011/06/03(金) 23:58:28.43
高度な助言が沢山あってうれしいです。けども質問する内容事態を間違えました…orz 数値計算のシミュレーションをやっていて、変数の中身を追っていたのです. ofstreamで変数の値を出力させていたのですが、assert()で止まると、 途中の結果が反映されないものだと思い込んでおり、閉じ方を聞いてみたのですが、 再度の確認してみたら普通にデータが書き込まれてました。 助言して下さった皆さん、ありがとうございました。(どうみても無能です) スレチで申し訳ないのですが、数値計算やシミュレーション関係のプログラムって、 どんな感じでプログラムを書いていくものなのでしょうか?今のところ #if DLEVEL > 1 ofs << t << "\t" << x << std::endl; #endif をあちこち埋め込んでいるのですが、ソースが全体的に汚くて見通しが悪いし、 条件分岐や関数を入れると時間が掛かるので、何かうまい方法はないものかなと
>>823 関数のスタック領域にメモリを確保してるんじゃない?
グローバル領域かヒープ領域でなら、回避できた経験はあるけど、
詳しいことは、この板のグルを待って
>>862 英語なんて誰でも読めるよ
>>851 が「シグナルハンドラから戻ってきたら」って書いたから
戻れないって書いたんだけど、そんなに不思議?
日本語読めない?アホなの?
>>865 >> abort関数は、シグナルSIGABRTが補足され、かつシグナルハンドラがリターンしない
>> 場合に、異常プログラム終了を引き起こす。
つーか、思わずスルーしてたけどそれ訳間違ってんじゃん
アホ過ぎるだろ
>>865 いや、読めないようだから。
> シグナルハンドラから戻ってきたら
普通に戻れる。戻れないと主張するなら↓このシグナルハンドラはどこに戻るんだよ。
void abort_handler(int sig)
{
}
>>867 さっすが、英語も日本語も読めないアホは違うね
>>851 を読めば、この文脈で戻る/戻らないで指してる場所は
abort()の呼び出し元のことだと分かるだろ?
>>867 abort関数は、シグナルSIGABRTが補足され、かつシグナルハンドラがリターンしない
場合"を除き"、異常プログラム終了を引き起こす
unlessすら読めないアホが何言っても無駄
>>866 ああ、「除く」を余計に削除しすぎた。これはすまない。
>>868 あほ、
>>851 はabortの実装の事だ。
ライブラリソース見てないから推測だが、シグナルハンドラから戻った後にもう一回自殺するんだろう。
この規格書の原文は? こんなことどこにも書いてないよね。
> 言語規格書にはSIGABRTハンドラはreturnしないと書いてある
だから abort() が _Noreturn 関数だってことが言いたかったんだろ いい加減うざい
てめーが言いがかり付けてきたんだろ。↓ソースは? > 言語規格書にはSIGABRTハンドラはreturnしないと書いてある
ぷぷぷwww 英語もろくに読めず、文脈もろくに読めない低能が 言いがかりつけて来たんじゃないの?www えーと、それとも間違っててごめんって謝って欲しいの? 「そんなに粘着質でアホとは思わなかったよ。こんなアホがこの世に存在するとは思ってなかった。 分かってたら相手にしなかったよ、ごめんねー」
874 :
デフォルトの名無しさん :2011/06/04(土) 00:59:42.38
やっぱりウソだったんだね。 > 言語規格書にはSIGABRTハンドラはreturnしないと書いてある
>>873 自己紹介はいらないよ。
シグナルハンドラから帰るのはシグナル送ったabortの中であることは当たり前だし、
英語読めれば↓こんなウソ書かないもんね。
> 言語規格書にはSIGABRTハンドラはreturnしないと書いてある
うわー、自分が訳を間違ったのスルーしてるwww かっこわるー
日本語訳が必要? (キリッ とか書いて間違えるとかwww
えーと、英語読めるひとにとって
>>862 の間違いはありえんからね
流し読みでも接続詞の論理構造は把握するから
大方どっかからコピペしてきたんだろ
で、英語読めないから間違いに気付かない
Cスレは既にあるから次スレは スレを勃てるまでもないC++の質問はここで にして欲しい 誰も聞いちゃいないのに毎回毎回おっぱじめる おっさん同士のオーラルセックスは気持ち悪い
C++のスレはもうあるしここに閉じ込めとけよ
881 :
デフォルトの名無しさん :2011/06/04(土) 01:57:04.15
>>876-877 それは謝ったぞ。カッペしたときに抜けた。
でも、英語が読めれば↓こんな間違いしないよな。
> 言語規格書にはSIGABRTハンドラはreturnしないと書いてある
>>881 カットアンドペーストの失敗?www
問:以下の文の括弧内に文章を入れて正しい文にしなさい
abort関数は、シグナルSIGABRTが補足され、かつシグナルハンドラがリターンしない
場合に()、異常プログラム終了を引き起こす。
>>863 vectorなりに計算中は溜めておいて
assertの代わりにthrow投げて
catchでvectorの中身をファイルに書き出して終了とした方が
実効速度早いと思うよ
884 :
デフォルトの名無しさん :2011/06/04(土) 08:36:56.68
>>882 結局、どの言語規格書に↓が書いてあるんだ? 書いてあったとして、ハンドラがリターンしないというのはおかしいと思わないのか? www
> 言語規格書にはSIGABRTハンドラはreturnしないと書いてある
>>884 C言語の仕様的に考えて
>>868 以外の読み方できんだろうが
むしろ、それ以外にどんな意味があると思ったのが知りたいわ
で、コピペミスって言い訳はどうしたの?www
え、もしかしてハンドラの中でreturn文を書いちゃダメって
そういう意味で言ってると思ったの?
だったら
>>852 の二行目の文と繋がらないじゃん
887 :
デフォルトの名無しさん :2011/06/04(土) 10:37:14.28
で、「SIGABRTハンドラはreturnしない」と書いてある言語規格書はどこにあるんだい?
888 :
デフォルトの名無しさん :2011/06/04(土) 11:26:05.69
>>885 それはオレが一番知りたい。「シグナルハンドラから戻ってきたら」と言ったら
「規格書にSIGABRTハンドラはreturnしないと書いてある」と言いがかりをつけられたんだから。
ボンクラの考えることは全くわからん。
>>860 で
>>851 への言いがかりだと言ってるんだから、見苦しい言い訳すんなよ。
>>888 > それはオレが一番知りたい。(キリリッ
コピペミスって言い訳も嘘バレバレで笑ったけど
自演もヘタクソだなwww
下記のような事したいのですけど、 ポインタが特定の配列を指しているのかについて調べるときに アライメントなどの問題が生じることがありますか? class BOX { ... }; int sizeBuffer = 1024; int sizeBox = sizeof(BOX); BOX pDefaultBuffer[1024]; BOX *ptr = ...; // = &pDefaultBuffer[?] or new BOX(); if( ptr >= pDefaultBuffer && ptr < pDefaultBuffer + sizeBuffer ) { } else { ....delete ptr; }
891 :
842 :2011/06/04(土) 16:44:45.97
>>883 良さそうな方法ですね。ただ、今に書いているプログラムでは
ループ回数が100万回ぐらいあるので、配列やvectorは利用し難いです。
各関数を通過するときにうける引数の値も確認したいですし。
それと、throwやcatchを使うことで条件分岐やジャンプ命令なんかが
ループ内部に入りそうな気がするのです。
assert()なら、NDEBUGのマクロを定義すれば、空行になってくれるといった
記事を見たことがあったので使っているんですが。
892 :
デフォルトの名無しさん :2011/06/04(土) 18:06:49.73
>>889 ボンクラは言い逃れも支離滅裂だな。
既に間違いを認めているカッペに突っ込んで話題をそらすしかないんだろうな。
SIGABRTハンドラはreturnしないと書いてある言語規格書はどこにあるんだ?
プログラムの世界って情報誌とかないんですか? 週刊プログラム 的な。
C++ だと const int でも配列の宣言の添字に使えることを知ったんですが int でいいんでしょうか? なんとなっくunsignendのが正しいような気がするんですが intでいいんですか?
配列の添え字って負の値も使えるんだよ。
896 :
デフォルトの名無しさん :2011/06/04(土) 18:16:09.45
言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ
ビルドに時間がかかる巨大なプログラムって動作確認はどうしているのでしょうか。 コード中にミスがあったり、意図したどおりに動くかどうかを確認しようとしてもものすごく時間がかかって不効率のように思います。
>>892 >>896 自演バレたからって発狂すんなよwww
このスレで今sageて無いのお前だけだから一発で分かったわwww
あぼーんするから名前付けてくれ
902 :
デフォルトの名無しさん :2011/06/04(土) 19:15:58.08
ついに、進退窮まって自演という事でなかったことにするのか。 バカのくせに負けず嫌い。バカだからリアルでも連敗なんだろうな。www 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ
906 :
デフォルトの名無しさん :2011/06/04(土) 19:35:10.90
話題を逸らすしかないんだろうな。無様すぎる。 言語規格書 www 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ
なんだ、カッペ抜けは嘘か 英語も読めないアホがスレ荒らすな
908 :
デフォルトの名無しさん :2011/06/04(土) 20:02:41.18
すでに間違いと認めてるところに粘着して話題を逸らすしかないんだろうな。無様すぎる。 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ
日本語訳が必要?とか言って速攻で訳添削された気分はどう? それをカッペ抜けとか誤摩化したあげく嘘がバレて 言い逃れできなくなった気分はどう?
910 :
デフォルトの名無しさん :2011/06/05(日) 00:37:53.26
そろそろよそでやれ
911 :
デフォルトの名無しさん :2011/06/05(日) 01:46:06.72
言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ
発狂するほど悔しいのは分かったから よそでやれ
913 :
デフォルトの名無しさん :2011/06/05(日) 11:08:32.55
ライブラリコールとシグナルハンドラの区別がついてないんだろうな。 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ
914 :
デフォルトの名無しさん :2011/06/05(日) 11:42:15.71
> ライブラリコールとシグナルハンドラの区別がついてないんだろうな。 (キリッ きもいからどっかいけ
916 :
デフォルトの名無しさん :2011/06/05(日) 12:01:31.09
今度は他人のふりして誤魔化そうとしてるようだな。民主並みの見苦しさ。w 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ
微妙にスレチかもしれないけど、どうしてOSってC言語で書かれるの? どのプログラム言語でも最終的には機械語に変換されるんだから、別にどんな言語でも書けそうなんだが OSを開発するに当たって、C言語でなければならない理由を教えてくれ
歴史上最初に高級言語で書かれたOSが、Cで書かれていたから。でいいかな?
そもそもUNIXを書くためにCを作ったんじゃなかったっけ?
>>918-919 つまり、慣例によりCで書かれるだけで、別に他の言語でも書けるってこと?
寒冷の意味
C#で作ったOSとかJavaで作ったOSとか一時期聞いた覚えがある
カーニハンとリッチーが、BCPL(型のないc)でUnix書いてて、 それに型を付けてC言語ができたんじゃなかったけな C以外の言語だと、c++やjavaでOSが書かれたこともあった気がする MS-DOSをc++で書いたらとんでもないバイト数になったってジョークもあった 別の言語を作り出したりするのは、既存の資源を廃棄することになるから、 今後も、cが使われていくことになると思うけどな うん百頁の企画書やSystemCなんかの規格だったり、 言語やライブラリのデバッグに多くのリソースが使われている 既在の環境でそれなりに快適に生活している人が居る以上は、 新しい何かが出来ても移住しないんだよunix書いた人たちがplan9を書いたけども、 結局のとこ流行らなかったって歴史だってある つまるところ、慣例というよりも、他に選択肢がない
>>920 すでにC言語以外で書かれたOSは有るよ
汗でしょ、Cとかなかった時代は
>>924 JavaとかC++でしょ?
両方とも、文法や形式がC言語にかなり近いじゃん
>>920 Cはハードウェアへの直接アクセスが簡単なんだ。
他の言語でもライブラリとか使ってアクセスすることもできるけど、Cほど直接的じゃない。
書ける/書けないでいえば他の言語でも書けるけど、Cより楽にかける言語は知らない。
>>926 バイナリに変換されたら表現記法など意味がない
言語が異なれば言語の構文が似てようがまったく別物
近い遠いというのは人間の主観でしかない
Cで書かれたプログラムとc++で書かれたプログラムの バイナリが近いわけねーだろJK
C++の #include <cstdio> int main() { std::printf("Hello world.\n"); return 0; } と、Cの #include <stdio.h> int main() { printf("Hello world.\n"); return 0; } で、近くないコードが出力され得るとでも?
>>930 詭弁のガイドラインにジャストミートだなw
実行できるという点以外 似てようが似てまいが違いはないと思うがね だからOSが手続き型で書かれる理由にはならない
OSにC++がなかなか使われない理由はメモリ管理が主因だと思う
チューリング完全という意味では 宣言型も手続き型も同じなのに、 手続き型の方が抽象度が低いと認識されてるのは ハードウェア制御との親和性が高いからでは?
OSを書くには、ない方が良い機能が満載だからだろ クラスや継承なんてつかったら、vtblなんかのポインタで無駄なメモリを食うだろし 組込み用途につかうもんじゃねーだろ 何がチューリング完全だよ。どこの厨二だ
手続き型以外 = OOP かよ OOPなんて只の手続き型の一種
DLLとかsoで名前マングリングが邪魔になるからじゃないの?
コンパイラ決め撃ちしたらC++でも大丈夫
extern "C" ばかりするのならC++を使う意味がないしな
>>935 それに、宣言形言語(というか関数型言語・論理型言語)は、計算理論・計算可能性理論・記号論理の再帰理論等の実装といってもいいから。
float の==比較を行いたいのですが、 ある数値の次の限りなく小さな次の差分 ulp(Units in the Last Place)を求める関数はありますか? javaでいうところのMath.ulp(float)です;
float.hかな?
>C言語においては、<float.h>でFLT_EPSILON、DBL_EPSILON、 LDBL_EPSILONという定数が定義されており、それぞれfloat型、 double型、long double型の計算機イプシロンの値となっている。
>>944 cmathのnextafterf
もしくは直接の比較として
boost::math::float_distance
ある数値だからfloat.hじゃまずかったかすまん
スマートポインタを使わなくてもどこかのクラスに生成を任せて解放をプログラムの最後に実行するようにすればいいと思うんですが どうでしょうか
>>950 そんなことするぐらいならスマートポインタ使えばよくね?w
>>951 そうなんですけど生ポインタのほうがシンプルですので、、、
プログラムの最後でいいならハンドル形式にしてしまうとか。
スマートポインタだってシンプルじゃねぇか まあ慣れもあるのかもしれないけど
GCでいいじゃん
他の言語でいいじゃん
すみません、ちょと気になったんですが C++で構造体やクラスの同名変数のみを自動でコピーするような処理は可能でしょうか? 若干条件付きでも構いませんが、順序はバラバラ(memcpyナシ)でお願いします。 struct A { int x, y, z; } struct B { int a, x, y; } A a; B b; autoCopy(a, b); // ← x, yのみコピーされる感じ
出来ない。
>>957 template<class A, class B>void autoCopy(A & a, const B & b) {a.x = b.x; a.y = b.y;}
>>959 同名のメンバー名のリストは与えられないという条件に決まってんだろ。ちっとは頭使え。
Aを全クラスに継承させれば実質できるんじゃね?w
>>960 それだったら既に>958で答が出ている。
敢えて次善策を提示しているに決まっているだろう。
ちっとはその身体の上に乗っかってる代物を有効活用したらどうだ?
>>957 設計が間違ってるからそんな欲求が生まれる
同名の変数部分をまとめて構造体にすればいい まとめて一回でコピーできる
965 :
944 :2011/06/07(火) 13:19:12.71
>>947 遅れましたが、これを使っていきます。ありがとうございます!
bccで.tdsや.objを生成しない方法はありますか?
DBや通信が絡んだりすると、 どうしても一部のメンバ変数のみを送受信したくなると思うのですが、 設計ミスですかそうしたか。
boost::serialization
すみません。キー入力の常態を知りたくて www-higashi.ist.osaka-u.ac.jp/~k-maeda/vcpp/com3-2keycodes.html ここの一覧全ての定数とWPARAMを、if文で==で比較しているのですが なぜか定義していないA〜Zのアルファベットキーに反応して Aだと97の値が来て、VK_NUMPAD1(テンキー1)に一致し、 Sだと115の値が来て、VK_F4(F4キー)に一致し、 Dだと100の値が来て、VK_NUMPAD4(テンキー4)に一致してしまいます。 なぜこんな事になるのでしょうか?
WM_CHARはキャラクタ−コード。 WM_KEYDOWN等は仮想キーコード。 VK_???は仮想キーコード。 なので、 case WM_CHAR: if(wParam == 'A') { ... とすれば拾えるハズ
972 :
970 :2011/06/08(水) 02:01:02.82
>>971 ご助言を元にいじって、仮想キーを != WM_CHAR で取得する事で解決できました。
勉強になりました。ありがとうございます。
void func(int n) { assert(n>0); if(!(n>0)) throw func_error(n) ; //・・・ }; アサーションって運が悪いとデバッグ時に気がつかないかもしれないから(例えばfunc(rand())みたいな場合) 上のようにリリース時のチェックも追加したほうがいいと思うんだが、なぜみんな書かないの?
リリース時もチェックするならなんでassertするの?
つまりassert不要論
表示処理なんかでエラーが雪崩れないところ用にlogging_assertみたいなc/c++標準機能が欲しいね
stderrを表示処理に使うのはいかがなものか
978 :
デフォルトの名無しさん :2011/06/08(水) 13:30:00.24
ZZ型の変数を10進数から16進数にするにはどうすればいいですか??
>>978 変数自体は進法は関係がない。
表示などの目的で16進数に変換したいなら、printf()系で変換するのが手っ取り早い。
980 :
デフォルトの名無しさん :2011/06/08(水) 14:14:44.98
>>979 解答ありがとうございます。
表示目的ではないのですが、sprintfやstringstreamなどで試してみてもZZ型が
16進文字列になりませんでした。
ZZ型ってNTLとやらの多倍長整数でいいのかな? NTLにZZ型を扱う文字列関数(printfやitoa相当のもの)がないなら自分で書くしかない
982 :
デフォルトの名無しさん :2011/06/08(水) 14:21:50.77
はい。 やっぱり自分で書くのが一番なんですかね。ありがとうございました。 参考になりました。
983 :
デフォルトの名無しさん :2011/06/08(水) 14:24:18.69
static char a[] = "0123456789ABCDEF"; long n = (long)(zz % 16); s = a[n] + s;
今開いてるディスクリプタの一覧を取得する方法 ってありますか?
985 :
デフォルトの名無しさん :2011/06/08(水) 14:40:42.61
>>985 マジすか。 標準Cライブラリも案外だらしないな・・・
しかたない。 /procの下でも読みます。
>>986 そもそも標準ライブラリはディスクリプタを扱わない。
∵そう言う方法で管理しないシステムで使うことも考慮されているから。
>>987 あーそういえばそうだったね
低レベルばっかり触ってるからうっかりしてた
ファイルのアドレスとデータを指定して書き換えたい ただしかなりファイルが大きいので一部のために全部書き換えることはしたくない 固定長のデータ等扱うのに需要はあると思うけど どれ使っていいかわからない
日本語でOK。
つ[fopen(), fclose(), fseek(), fread(), fwrite()]
>>989 "r+"でfopen 〜 fseek 〜 fwriteやfprintfで書き込み
fstream 〜 seekp 〜 write や << で書き込み
994 :
デフォルトの名無しさん :2011/06/08(水) 22:03:41.24
言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ
995 :
デフォルトの名無しさん :2011/06/09(木) 00:20:38.27
(´・ω・`)
♪ ♪ ρ ♪ ♪ ∧__∧. 。∧__∧ .Π∧__∧♪ ο∧__∧ ∧__∧∩)) Ο´・ω・`) .│´・ω・`) ┃´・ω・`) │´・ω・`) ρ・ω・`)| (つ .│ (つ │ ((つ > (つ │ (つ ./ ♪ │ U (_))) .U (_))) .│♪(_))) U (_))..〈 ((__ノ^(___)) (((_)♪ (((_) (((_) ((_)♪ おいしい ハオチー ボーノ アロイ デリシャス デリシュ〜
>>997 std名前空間に入れていい物って限られてなかったか?
999 :
デフォルトの名無しさん :2011/06/09(木) 17:25:30.37
言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリッ
>>997 sortがswap利用してないからじゃね?
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。