【初心者歓迎】C/C++室 Ver.81【環境依存OK】
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.80【環境依存OK】
http://toro.2ch.net/test/read.cgi/tech/1348161305/ ◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)
NG推奨:◆QZaw55cn4c←半角にして登録してくだい
clangはいつになったらWindowsで普通に使えるようになりますか?
Hoge
foobar, foo, bar, baz, qux, quux, corge, grault, garply, waldo, fred, plugh, xyzzy, thud
DMC8.55が出てるが更新履歴が見当たらない
何が変わったか分かるエスパーいますか?
質問ですが、以下のリンカエラーが多発してしまいます。
multiple definition of 'error'
で、私は error という関数を定義していません。
/usr/include/c++/4.4/new:101でかち合ってるみたいですが
何が何やらサッパリです。
何から確認すればいいでしょうか。お願いします。
ここはエスパースレじゃないぞ
>>8 多重定義しているんでしょう。
まずは、自分の作ったヘッダファイル全ての1行目に
#pragma once
を書いてリビルドしてみたらいかがでしょう。
それでもダメなら別の原因。
11 :
デフォルトの名無しさん:2012/11/29(木) 19:20:34.85
int main(void) { return 0; }
これだけでエラーになるならコンパイラが壊れている
#include でも何でも、どうしたら再現する不具合なのかを突き止めれ
12 :
デフォルトの名無しさん:2012/11/30(金) 02:03:53.21
マルチスレッドの排他処理のミューテックスって重いんすか?
10スレッド動かして各スレッドが60fpsでループ、その1スレッドの1フレーム間でロックとアンロック合計200回とかきついっすかね?
10スレッドあるのでそれだけで2000回、他の諸々入れるとそのアプリ全体で毎フレーム2200回いく予定なんすけどね
2.4GHzのデュアルコアで他に重いものは動かさない前提っす
今の設計だと上記状態になるんで、無理なら開発を進める前にまた頑張って考えて設計を変更しなきゃいけないんす
>>12 ・Cの質問でない
・ミューテックスの重さはOSによる。もっと言えば実装による。
・そもそも組み込みで無いOSが動いているなら、そのOS自体の重さを考慮する必要があるだろう。
組み込みなら2,4GHzのデュアルコアとか神レベルの速さ。
いずれにせよハイレベルの3Dゲームでも作るんじゃなければ気にする必要はない。
・ミューテックスの一般的な実装をイメージするならそこまで重く無いだろう。
ディスパッチした時は負荷がかかるだろうが、常識的な作りなら1スレッドの実行で数回発生するくらいでは。
・1スレッドごとに200回のロック・アンロック。という設計思想が良く分からない。
ロック->アンロック->ロック->アンロック->の繰り返し?それなら効率が悪いからまとめてロックしとけ。
ロック->ロック->ロック->アンロック->アンロック->アンロック?200回とか階層深すぎじゃないの?
・全てのスレッドを60fpsで動かす必要が本当にあるのだろうか。同じスレッドをたくさん起動するのだろうか。
それ、ミューテックスが重いかどうかよりそんなに同期が必要になる時点で設計がおかしいよ。
うんだ。設計がおかしい。
大方、画面中のオブジェクト1個ずつに対してスレッドを割り当てて
それぞれが排他しないとまずいタイミングでロックかけようとしてる
んだと思うけど、設計が頭悪すぎる。
あとなんか
>>12の書き方から察するに業務用アーケード基板(TAITOのとか)
くさいニオイがぷんぷんするんだけど、こんなところで質問する前に会社の
上司とか同僚に聞いたほうが早いぞ。
スレッドに分ければオーバーヘッドが減るってものではない。
18 :
デフォルトの名無しさん:2012/11/30(金) 13:49:04.06
>>13-17 ありがとうございます
MMORPGを作ろうとしているニートっす
質問はMMO鯖に関するものっす
最初のユーザーの同時接続数の目標を1000にしてたので、それぞれ接続チェックごとにメッセージキューのロック&アンロックをすると上記の感じになるっす
1スレッドで1000接続全部処理するとタイムラグが出ると思って100接続ずつに分けようと考えたんす
でもスレッドを分けると、同期がいるじゃないっすか
だけどスレッドごとにロックするとそこでまたタイムラグが発生するじゃないっか
例えばスレッドAの誰かがスレッドBの2番目(B-2)の人に攻撃したとき、そのイベントの発生がB-1の人の処理をしてる最中だったとすると、
スレッドごとロックをかけていた場合、B-100まで処理が終わってアンロックされるまでB-2のキューに攻撃されたという情報が渡らないじゃないっすか
だけど接続ごとにロックする方式なら、B-1しかロックされていないからB-2のキューに情報を積めるじゃないっすか
少し前までチョン政府の助成金を追い風にチョンゲ企業が粗悪なMMORPGを大量に送り込んできたじゃないっすか
その助成金もなくなった今、反撃のチャンスだと思ってるんす
そしてそれで稼いでニート脱出するっす
とりあえず設計しなおします
ROエミュのAEGISでも参考にすれば
20 :
デフォルトの名無しさん:2012/11/30(金) 23:37:55.67
>業務用アーケード基板
近からずといえど遠からずだったなw
>>18 ・60fpsというのは基本的に画面表示用スレッドの周期。
画面表示の無いサーバなら60fpsで処理する意味は無い。
・普通に考えると受信スレッドとゲームスレッドの2つで良い。
・受信スレッドは常時受信を行い、各ユーザーからの通信メッセージを受けてリストにする
・ゲームスレッドは常にループしていて、各ユーザーの通信メッセージを順次処理していく。
通信メッセージごとにサーバ上のゲームデータを更新し、必要に応じて通信メッセージを送信する。
・MMOの作り方みたいな本があるはずだから読んだ方が良いかも
>>21 その本は買ったがプログラム初歩習得ゲームはド素人みたいな人向けに
基本のキの部分しか解説してなかった。役に立つかと言えば微妙。
>>18 便所の落書きや知恵遅れで質問するなら趣味のプログラミングは辞めたほうがいい。
質問です。
class PointTest {
private:
int m_x;
int m_y;
public:
void Set(int x, int y) { /*省略*/ }
};
このようなクラスにGetメソッドを用意する場合
void Get(int &x, int &y) として1つで済ませるのと
int GetX() int GetY() の2つを提供するのとではどちらがより一般的なのでしょうか?
struct POINT {
int x;
int y;
};
class PointTest : public POINT
>>24 両方いれたらいいじゃん
でもよく見るのは各成分getかな
各成分getが多いけど
別に作りたけりゃ両方作ってもいいのよ
メンバ変数をpublicにするのはこの場合適切ではないだろ。
>>28 変数間で保つべき不変条件でも無けりゃ private にする意味ないでしょ。
点の x, y 座標間に何かそんな関係があるか?
元の
>>24でprivateにする意図を示しているのに
publicにしたら質問の意味がなくなるだろう。
馬鹿じゃないの?
他のクラスのメンバで
void SetPoint(const PointTest& pt);
PointTest GetPoint();
ならまだ理解できるんだが
privateにするのは不変条件のためだけの話じゃないぞ
ブレークはったりデバッグコード仕込んだりできるのも重要
やっぱこれだろ。
get、setは余りたくさん書きたくないからx,yくらいなら構造体でまとめる。
struct Point {
int x;
int y;
};
class PointTest {
private:
Point point_;
public:
void setPoint(Point &point);
Point getPoint(void);
};
プロパティってなかったっけ?
しかしpointごときはprivateにする必要もないと思う
>>24 getterが
> void Get(int &x, int &y) として1つで済ませるのと
この形の一つだけっていうのならそれは間違いなく駄目な設計
そういうクラスを実際に使うとわかるが値の取得に変数が必要ってのは明らかに使い勝手が悪い
37 :
デフォルトの名無しさん:2012/12/01(土) 22:12:03.43
同時性にこだわる俺っち、別に潔癖症とは思ってない
C++ の const は性的だし♡
有用を悩む程度のメンバアクセスにはアクセス専用の一時クラス通すんだよ
適当な型を扱う時に
デバッグ用にブレーク貼れるようにする
クラステンプレート作ってるわ
const Point& GetPoint() const;のがいいきがする
41 :
デフォルトの名無しさん:2012/12/02(日) 02:59:51.42
山椒がピリリと引き立つわけですか
Pointぐらいならpublicにしてもいい気はするけど、あとで何か処理が追加されるかもしれない事を考えてgetter,setterを用意するほうが良い
C++初心者です
cout/wcout/printf/wprintf 全てを共存する一般的な方法はありますか?
ラップ
書き込むごとにフラッシュして使い分けるだけだろ
Print()を作ってパラッパラッパー♪
>>43 そもそも「共存」ってどういう意味なんだ? そこがはっきりしないと答えようがない。
48 :
43:2012/12/05(水) 21:34:40.59
printfとwprintfは_tprintf
std::coutとstd::wcoutは共存しない
>>43 仕様上はstreamにはorientationという概念があってnarrowとwideのI/Oを
同一のストリームに混在させられないことになってる
MSVCだと一見平気で混ぜられるけど、_O_U8TEXTみたいなモードは
orientationに基づいてるみたいで、その場合は混ぜられないよ
51 :
43:2012/12/06(木) 01:58:51.49
>>50 解説したブログが見つかり納得するまでにはいかないけど
理解することは出来ました。
reopenするとかで何とか出来そうなこともなさそうだけど
コストが高そうなので諦めます。
ありがとう。
>>50 orientationなる単語で検索したところ //←コピペミスで抜けてました。
解説したブログが見つかり納得するまでにはいかないけど
理解することは出来ました。
reopenするとかで何とか出来そうなこともなさそうだけど
コストが高そうなので諦めます。
ありがとう。
イクリメント、デクリメントの後置きってどういう動作になってるんですか?
>後置きの場合にはインクリメント演算子による演算以外の処理を先に行います。
ググるとこんな感じの事が書いてあるし、自分でもそうだと思ってたんですが
最後に後置きのイクリメント、デクリメントの処理がされると思ってるとなんかおかしい事になります
環境はwindows7でVC++2010Expressです
>>53 ×イクリメント
○インクリメント
例えば、j = i++はj = i, i = i + 1と等価だと考えればいい。
副作用完了点(sequence point)で調べな
しれっとstdout/stderrに出力するオープンソースのライブラリは結構あるので
そういうの使う時はorientationには要注意
そういうライブラリはまず間違いなくnarrowで出力していると思うが
MC68000上で開発された名残がそこかしこに。
インクリメントでした。恥ずかしい・・・
訂正ありがとうございます
副作用完了点でググったら一つの式で一つのオブジェクトの値の変更は一回しかできない、とありました
自分がやろうとしてたのは一つの式で一つのオブジェクトの値の変更が二回になっていたのでたぶんそのせいですね
ありがとうございました
>>50 このような手当てが必要な理由はなんでしょうか?
tcharの、charの前のtは何から来ているの?
あと L"あ"の時のLは何から来ているの?
wide文字だよって示すならwprintf見たいに、w"あ"って感じにしたほうがいいような
Lはlong
tはtext
wにしなかったのは、多分整数と合わせたんじゃないのかな
LPCTSTR lpszText;
long pointer constant text string long pointer string zero-terminated text
long pointer ってなんですか?
長いポインタです
>>65 32ビットのポインタ。従来の16ビットポインタより長いという意味。
昔、16ビットと32ビットのポインタを混在して区別する必要があった時代のなごり。
今じゃ(少なくともWindowsやLinuxでは)サイズの異なるポインタが混在することはないから気にするな。
どっちなの?
http://msdn.microsoft.com/ja-jp/library/ff381404%28v=vs.85%29.aspx P は "ポインター (pointer)"、LP は "ロング ポインター (long pointer)"
の略として使われてきました。ロング ポインターはファー ポインター (far
pointer) とも呼ばれますが、16 ビット Windows の名残で、現在のセグメント
の外にあるメモリ範囲をアドレス指定するのに使用されていました。LP プレ
フィックスは、16 ビットのコードを 32 ビット Windows に簡単に移植できる
よう、予約されていました。現在ではこの区別は存在せず、単にポインターと
呼ばれています。
>>71 far pointerはsegment16bit * 16 + offset16bitで20bit(1MB)のメモリ空間を表すもの。
>>73 しかしリアルモードではCPU 自身がセグメントを16ビット、オフセットを16ビットと持ち、12ビット分を重ねるのはCPU内
したがって記述レベル、たとえばアセンブリ言語で記述するときもセグメント、オフセットそれぞれに word=16bit の領域を準備することが多い
大概のC処理系でもそう。(sizeof(void far *) = 32)
>>74 同じことしか言ってないように見える
最後4だし
>>73 long pointer は FAR で定義されている
FAR を far で定義するか空定義にするかは環境次第
farなんていうのは16bit x86(16bit プロテクトモードを含む)の
化石だよね。だから
>>74がリアルモードに限定しているのは間違い。
16bit x86の設計は8bitCPU8080のコードをポーティングしやすくする
ためにアドレス空間も8080と同じ64KBを基本とした。
この範囲のプログラムはポインタも16bitで良かった。
だが時代が進みコードサイズが爆発的に増えた結果、オフセット
だけでは不足してきたので、セグメントとペアで扱うことにした。
だがC言語的にはポインタはポインタでしかないので、ポインタが
アドレス可能な範囲は実装依存だった。
でもオフセットのみのポインタとセグメントとペアのポインタは区別して
扱わないと開発上問題になる。そこで予約語farを定義して、farがつく
ポインタはセグメントとペア、それ以外はオフセットのみと定義すること
にした。
一般的にはfarのつくポインタだけをセグメントとペアのもの、つかない
ポインタはオフセットのみという認識だが、あえて両者を区別しやすく
するという意味でオフセットのみのポインタを「nearポインタ」と呼ぶ場合
もある。でも今となっては用済みのテクノロジでどうでもいいヨタ話。
ヨタついでにもう1つ。
昔の16bit x86用Cコンパイラには「メモリモデル」なるものが存在した。
詳しい話は英文だけど
ttp://www.c-jump.com/CIS77/ASM/Directives/D77_0030_models.htm このへんを参照。
んで、開発を始める前にプログラム規模をまず見積もり、メモリモデル
のどれを採用するかを慎重に決める必要があった。なぜなら途中から
メモリモデルを変更するとコード全体に波及する可能性があったから。
大抵のプログラムでは単一コードセグメント、単一データセグメントで
間に合うものだったが、後々の保険にということで複数セグメント前提
にしてポインタを全部farにする、なんていう「大は小を兼ねる」判断も
行われていた。
MS-DOS陣営と違い意外に知られていないが、Mac-OSも680x0の時代は
32KBのコードリソースに入るサイズで切り分ける必要があった。
コードリソースと言う制約自体はMac-OSをベースにしていたPalmOSにも受け継がれた。
32KBのコードリソースっていうのはおそらくMC680x0における
ショートジャンプ(PC相対とかレジスタ相対ジャンプ)の範囲で
おさめるための策だと思われる。
時代背景から考えて現実的とは言えるけど、単なるウィンドウ
システム側の制約なだけ。MC680x0はリニアなアドレス空間で
16MBまでアクセスできた。
LPは16-bit時代の遺産だからな
farポインタの存在する環境であればfarポインタになるのだが
32-bit環境以上なら普通のポインタと同じ
コードリソースの32kBというサイズはPC相対アドレッシングの制約からきたものかも
知れないが、セグメント間はA5相対JSRでアクセスするようコンパイラが判断するから、
関数ポインタを使いたいような場面でもない限りプログラマが意識する必要はなかったな。
昔のコンパイラは
switchがショートジャンプなので
延々と処理を書くと
適当なとこにジャンプしてた
>>84 「適当」って「適切」じゃなくて「いい加減」という意味ですか?
怖いですね。
昔のコンパイラと言うかそのコンパイラが手抜k
飛べねーぞごらぁ って言うのは見たことあるけど、変なとこに飛ぶコードを吐く奴は
さすがに見たことない。
88 :
デフォルトの名無しさん:2012/12/16(日) 02:35:18.51
質問させてください。
http://www.geocities.jp/ky_webid/cpp/language/007.html 上記のURL中に
「デストラクタですが、これはクラスのインスタンスが解体されるときに、
解体の直前で自動的に呼び出されます。
解体されるタイミングは、そのインスタンスのスコープを抜けるときです。 」
とあるのですが、
では
IProduct* createFactory(Content* content)
{
switch( content->id )
{
case PARTS_ID_A:
return new ProductA( content );
default:
return NULL;
}
}
ProductA* product = createFactory(content);
のようなコードはなぜ正常に動くのでしょうか??
createFactory内でnewしたProductAはすぐreturnされてスコープを抜けてしまうので
その時点でデストラクトされ、
productに代入されるポインタはすでに使えないものになっているのではないのでしょうか?
理屈がよくわからないのですが、教えて頂けると嬉しいです。
newで作成したインスタンスはスコープを抜けても勝手にデストラクトされない
>>88 new で得たポインタはdeleteしない限り無効にはならない
new で得たポインタは関数を超えても生き残り続ける
new したものはdeleteせよ、という宗教もここからきているかと
C#だとnewばっかで滅多に削除を明示しない
92 :
デフォルトの名無しさん:2012/12/16(日) 03:36:33.83
なるほど!
ありがとうございますm(__)m
C++でもスマートポインタ使うから滅多に削除を明示しないよ。
構文レベルの予約語なのに滅多に記述されずラップして使われるのは
言語としてヤバイ状態なんじゃないかな
何がヤバイんだ
gotoみたいなもんだ
下手に使うと危険だが、上手く使えば効果的
gccならスマポを使う必要がもうないのでわ?
gcc拡張ってのがあって、配列の宣言時、要素数に変数が
指定できるのですよ。
int a;
a=100;
char hoge[a];
ってもC++の話じゃないね。させん
色々わかってなさ杉だろ
Effective c++第3版11項p52なんだけど
delete pOrig;のところって
if(pOrig != pb) delete pOrig;
としなければ例外安全とは言えないよね?
GetPrivateProfileなんたらって標準関数を使ってiniファイルからデータを取得しているのですが、
データ数がどれくらいあるかわからない場合はどうしたらいいでしょうか?
前に見たソースだと
同じiniファイルのどこかでキー名を宣言?しておき、
そのキー名に文字列をくっつけてキー名を作るみたいな事をしていた気がするのですがどこかにいったので・・
[Object]
ObjectName=Hoge
HogeNum=10
HogeStr=ほげ
ObjectName=Aho
AhoNum=20
AhoStr=あほ
みたいな感じだった気がしなくもないんですが・・・、
あれ?
section名の重複ってありなんでしょうか?
Aho1,Aho2,Aho3・・・とか順番に読めるとこまで読めばいいだろ
>>108 キー名決まってないというか、iniファイル側でやりたいです
111 :
デフォルトの名無しさん:2012/12/18(火) 01:16:34.22
最近、スマートポインタなる概念があると聞き、調べていたのですが、
【1】newを伴わないポインタでは利用できるのでしょうか。あるいは、利用するべきでしょうか。
char *p1 = "Hello, Work!"; // 例えば文字列定数の先頭アドレス。
int *p2 = foo->GetPointer(); // 例えばポインタを返す関数。内部でnewされているかもしれない。
【2】宣言と同時に初期化しない場合、どう記述するべきでしょうか。(boost::scoped_ptrを想定)
boost::scoped_ptr<bar> p3;
p3 = new bar(); //今まではこう書いていたが…?
112 :
デフォルトの名無しさん:2012/12/18(火) 01:28:01.15
スマートポインタ、ガベージコレクションは必ずしも使う必要はない。
Java、C#、スクリプト言語には標準で入るが、速度を犠牲にする。
プログラム上で開放を忘れなければ必要なし。
113 :
111:2012/12/18(火) 01:31:05.06
>>112 もちろん、その大前提は把握しているつもりです。
114 :
デフォルトの名無しさん:2012/12/18(火) 01:59:57.85
>>99 hoge使ってる馬鹿は議論しようとするな
馬鹿の議論ほど不毛なものはない
>>111 > 【1】newを伴わないポインタでは利用できるのでしょうか。あるいは、利用するべきでしょうか。
破棄処理に応じたRAIIラッパーを使うか、 boost::shared_ptr, std::shared_ptr, std::scoped_ptr などの
破棄処理を指定できるスマートポインタを使う。
> 【2】宣言と同時に初期化しない場合、どう記述するべきでしょうか。(boost::scoped_ptrを想定)
p.reset(new ...) とする。
116 :
111:2012/12/18(火) 03:14:08.17
>>106 セクション名だけ指定したら
キーのコレクションが返却される
とか書いてないか
>105
俺の持ってるのは英語版なのでページが違うようだが、
Widget& Widget::operator=(const Widget& rhs)
{
Bitmap *pOrig = pb;
pb = new Bitmap(*rhs.pb);
delete pOrig;
return *this;
}
のことだったら new がオーバーロードされてなければ pOrig != pb になるから意味ないんじゃね?
new で例外が飛ぶならそこまで処理来ないし。
>>106 そもそもそんな標準関数なんてないんだが。
みんながちゃんと、あんたの想定と同じ環境を想定してくれるとは限らんぞ。
>>117 公式リファレンスが英語でよくわからないです
>>119 すいません、マイクロソフトのページにあったのでつい・・・
>>110 キー名を羅列したものを文字列として取得した後にcsvとして取得しないとダメですか?
>>117 GetPrivateProfileSection
GetPrivateProfileSectionNames
がそれっぽい関数なんですけどなんでしょうか?
>>121 GetPrivateProfileSectionNames
これが答えそのもの
123 :
105:2012/12/18(火) 19:46:52.62
>>118 どこかでbad_allocがcatchされているということなら納得です
例外安全を勘違いしてないか?
if( flag ) {max = CONSTANT; return;}
else if( (int v = calc_a(i)) > max ) max = v;
else max = calc_b(i);
と書きたいのですがコンパイルが通らないので、仕方なく
int v;
if( flag ) {max = CONSTANT; return;}
else if( (v = calc_a(i)) > max ) max = v;
else max = calc_b(i);
とやっています。
もっと楽な書き方は無いでしょうか?
if ( flag ) {
max = CONSTANT;
return ;
}
max = calc_a(i) > max ? calc_a(i) : calc_b(i);
calc_aが2回呼ばれていやだな
switch(f){
default:
int v=cal_a(i);
if (!(v>m))v=cal_b(i);
m=v; break;
case true: m=CON; }
どうも、参考になります。
>>125 一時変数たるvを関数(?)の先頭で宣言して生存期間が長いのが嫌だとエスパーすると、
中括弧で新たにブロックを作ってやれば処理の途中でもブロック内でのみ有効な一時変数を宣言できる。
違ったら無視してくれ。
// :
// ここまで処理
{
int v;
// ここに処理
}
// ここからも処理
// :
インナークラスという機能がありますが積極的に使うべきなのでしょうか?
外側にあっても同じことができますよね?
使う理由がなければ外に置きましょう
インナークラスのほうがアクセス権限が強いからです
>>132 C++のインナークラスはただのクラスじゃね?
>>123 catch されてるかどうか関係なくね?
catch されてなかったとしたら何が問題だと思ってるの?
>>131 他から隠したいもの、他に公開する必要がないものは内部クラスにする
あるクラスからしか使わないようなものは、内部クラスにした方が良い
>>136 newが失敗して例外が投げられて、その後誰もcatchしなかったらエラーにならないの?
なるよ
例外が誰にもcatchされなかったら、そのままOSが取って動作停止おつかれさんだな
仕様的には terminate() が呼ばれる
>>138 例外発生で即 terminate() となるが、それが問題かどうかはプログラムに対する要求による。
問題だとしても
>>118 で挙げられているコード片に例外安全上の問題があるとは言わない
即 terminate() になるか、そこまでのデストラクタが呼ばれるかは未規定だったような
144 :
デフォルトの名無しさん:2012/12/21(金) 18:42:30.68
ある変数が取る値として、enumが定義されているとします。
これらは、ちょうど二進数になるように数値が設定されています。
enum MyEnum
{
APPLE=1, ORANGE=2, GRAPE=4, BANANA=8, STRAWBERRY=16,
};
const intや#defineで設定するのとは異なり、enumは型チェックをしてくれるので便利ですが、
せっかく二進数になるように値を設定したのに、 APPLE|BANANA のようなORで複数を代入するような使い方ができません。
関数の引数の場合は、呼び出し側でstatic_cast<int>とするなり、
あるいはint版とMyEnum版で関数を作ってオーバーロードするなりすれば問題ないですが、enumの恩恵を受けているとは言いがたいです。。
特に後者の場合は、引数が複数あると定義の数が倍々で増えてしまいます。
何かスマートな解決方法はありませんでしょうか。
145 :
デフォルトの名無しさん:2012/12/21(金) 19:22:36.45
C+で
switch(i) {
case 1:
func1();
break:
case 2:
func2();
break:
case 3:
func3();
break:
}
を
void func<1>(){}
void func<2>(){}
void func<3>(){}
func<i>();
みたいにして
呼び出すよう方法はありませんか?
>>145 typedef void (*pfunc)();
pfunc func[] = {func0, func1, func2};
func[i]();
みたいなこと?
148 :
デフォルトの名無しさん:2012/12/21(金) 19:37:05.03
>>146 それしかないですか、ありがとうごあいます。
>>145 関数オブジェクトあるいは関数ポインタなんてどう?
149 :
デフォルトの名無しさん:2012/12/21(金) 19:43:12.92
>>147-148 登録されていない番号の場合はデフォルトで
func<int>()
を呼び出したいdす
多胎とかテンプレートで記述する方法ないですか?
有りますよ
少し考えればできるから頑張ってね
>>144 c++ならばenum型を演算子のオーバーロードで
MyEnum operator|(MyEnum a,MyEnum b)
{return static_cast<MyEnum>(static_cast<int>(a)|static_cast<int>(b));}
>>145 つenable_if
152 :
デフォルトの名無しさん:2012/12/21(金) 20:13:34.77
>>151 enable_ifだと
テンプレート関数の特殊化とあんまり変わらない飢餓するのですが
気のせいでしょうか?
func<1>{
処理1
}
func<2>{
処理2
}
を
func<i>();
で呼び分けるような事が屍体のです:
テンプレート関数の特殊化だと、
func<i>();
のi の部分は変数はだめだとコンパイラ(VC10)に起こられました
(*func)()select(int a){switch(a){
case 1:return func1;
case 2:return func2:
case 3:return func3;
default return NULL; }
とすればいいとおもうよ。
関数へのポインタの配列
iを定数にすれば使えるよ
悪魔の所行にしか見えない
多態でいいじゃん
コストの問題
なぜそこまでswitchを使いたくないのか
コストの問題ならswitch使え
ジャンプテーブル最適化もしてくれるぞ
つうかダイナミクスを多用するな
多用するとコンパイラはおろかPGの目でもコードが追跡出来なくなる
それは間違いなく破滅に繋がる
すべて静的な世界で完結させる癖を付けなさい
161 :
デフォルトの名無しさん:2012/12/22(土) 13:39:12.11
そうだな
switch(i) {
case 1:
func1();
break:
case 2:
func2();
break:
case 3:
func3();
break:
case 4:
func4();
break:
case 5:
func5();
break:
case 6:
func6();
break:
case 7:
func7();
break:
case 8:
func8();
break:
case 9:
func9();
break:
}
162 :
デフォルトの名無しさん:2012/12/22(土) 14:29:43.20
template <int N> struct Factorial {
enum { value = N * Factorial<N - 1>::value };
};
template <> struct Factorial<0> {
enum { value = 1 };
};
で、でた〜くだらないTMPでドヤ顔するやつwww
変数でやりたいってのにどうしてTMP出してくるんだよ・・・
呼び出すときに未意味な0指定したり
99とかいうマジックナンバーで再起をとめたり
連番じゃないといけないのがダサい
>>162 それさあ、コンパイラによって再帰のネストレベルがえらく違うんだよね
その前にオーバーフローするから大丈夫
変更できるんじゃね? コンパイラスイッチをしらべろ
番号の型と関数ポインタのtupleをあらかじめ、なにかしらのコンテナに入れておく
>>167,
>>169 環境によるけど、大抵コンパイラじゃなくてリンカーのオプションだよ。
て言うか、そこで指定されるのは初期値なだけで、例えば Windows
ならスレッド作る時に個別に指定できるし。
なんでリンカが出てくるんだよ
templateはリンカに頼らずコンパイラの内部でバイナリ吐いてしまうだろうが
それにネストレベルを変更するスイッチがないコンパイラもある
ネストレベルが何に制限を受けるのかぐらい理解してから書こうよ…
>>173 関数の再帰呼び出しならスタックかもしれないけど、templateはコンパイル時に展開されてしまうんだぞ
すまん、マジでよく見てなかった。
const int SIZE = 10;
typedef int intArray[SIZE];
と同じことをstd::vectorでもやりたいのですが
typedef std::vector<int> intVector[SIZE]; //これは意図したものとは違う挙動になる
typedef std::vector<int> intVector(SIZE); //エラー
typedef std::vector<int>(SIZE) intVector; //エラー
などやってみても、どうしてもエラーが出て実現できません。
std::vectorと全く同じ振る舞いをするが初期サイズだけが決まっている別名をつけたいのですが、
std::vectorは継承もダメっぽいということで、どうすれば実現できるでしょうか?
今のところ
class intVector
{
public:
std::vector vec;
intVector() : vec(SIZE) {}
};
これしか思い浮かばないのですが、やはり振る舞いに不満があります・・・
std::arrayじゃダメなん?
>>176 そのクラスになんの意味があるの?
ファクトリ関数ではいけないの?
ありがとうございます
>>177 すみません知りませんでした、試してみます
>>178 サイズの保証された用途別のvectorを色々なクラスのメンバとして持たせたいと思いました
その名前でメンバとして宣言すればサイズが保証されるようにしたかったのです。
それぞれのクラスの初期化子にconst変数持ち出してサイズ指定するのでは保証できないなと思ったので
質問
class Base
{
...
public:
virtual ~Base(){}
};
class Derive : public Base
{
...
public:
~Derive(){}
};
このように仮想デストラクタを持つ基底クラスとその派生クラスがあったとします。
派生クラスのインスタンスをfprintfなどで一旦シリアライズし、それをさらに派生クラスとして
デシリアライズし、その派生クラスをdeleteしようとするとエラーがでます
これは、基底クラスの仮想デストラクタがvtableを持ち、シリアライズ・デシリアライズで
ポインタがずれたため、と思って正しいでしょうか?
自分でもいまいち仮想デストラクタのdeleteの挙動について正しく理解できていない気がします
まさかそのままバイナリで読み書きしたのか
他にポインタなどは持っておらず地味に読めるのです
deleteだけ通らないので何故と思いまして
> 地味に読めるのです
気のせい
悪魔を召喚したいならそれで正しいコードだよ
デシリアライズしたプロセス内で手順再生して同じもの作って比べてみりゃいいじゃん
これが現代の召喚魔法か
そのデシリアライズってどうやってるの?deleteはそのプログラムの実行中にnewしたポインタにしか使えないぞ
>>187 結局これなんですよね>deleteは〜
悔い改めました
ちゃんとシリアライズ用データ用意し事無きを得ました
なお、実際のシリアライズ・デシリアライズはあるapiで行ってるので詳細はわかりませんが
恐らくバイナリベタ書きと思われます
189 :
デフォルトの名無しさん:2012/12/26(水) 02:46:39.53
char配列をファイルに書き出す時に、読み込むときに楽をするために改行も含め一行で書き出したい。
そこで、\nを他の数値に置き換えて書き出し、読み込み時にその数値の部分を\nとして
読み出せばいいやと考えているんですが、日本語環境では絶対に入力されることの
ない数値や、または入力される可能性がすごく低い数値を教えてください
\rでいいだろ
つーか、
>読み込むときに楽をする
の目的で
>改行も含め一行で書き出したい
に至った理由が判らん。
単に複数行纏めて読みたいだけならfread()でも使えばいいのに。
理由は分かる
0x01〜0x1F の中で通常使われない値、
例えば 0x01 を使えばいいと思われ
まさにその\をつけるエスケープじゃだめなん?
王道はエスケープだけどとにかく手抜きしたいってことだよな
俺のおすすめは\v(vertical tab)。一応改行類だが通常のテキストファイルでは
まず出てこない(俺は今まで見たことが無い)
Unicodeにまで広げていいならU+2028(LINE SEPARATOR)ってのもあるよ
class Base
{
private:
int m_base;
public:
virtual int GetSize() { return( sizeof(this) ); }
};
class Sub : public Base
{
private:
int m_sub;
};
int main(void)
{
Base *pBase = new Sub;
int size = pBase->GetSize(); //※
return(0);
}
自分の環境でコレを試したところ、※の部分で得ることが出来るサイズはBaseの大きさになり、
Subクラス側のpublic部分にBaseと同じ記述の【 virtual int GetSize() { return( sizeof(this) ); } 】を追加しても、
サイズはBaseの大きさのままでした。
このような場合でSubのサイズを取得したい場合は、pBaseをSubにdynamic_castしてから行うか、
サブクラスに【 virtual int GetSize() { return( sizeof( Sub ) ); } 】と記述するしかないのでしょうか?
>>195 × sizeof(this)
○ sizeof(*this)
197 :
デフォルトの名無しさん:2012/12/26(水) 15:33:10.99
#include <chrono>
VS2012でこれをコードに書くとx64でビルドできません。
Win32ではできます。
みなさんはどうですか?
自分のところではビルド通りました
プラットフォームツールセットがVisual Studio 2012 (v110)になってるか確認してください
199 :
改造神:2012/12/26(水) 18:11:04.78
C++って、VBSの言語ですよね?
Win8 VisualStudio2012 で Win標準(?)のOrientationSensorクラスを扱うには
何をincludeしてどうする必要があるんでしょうか・・・?
MSのmsdn読んでも理解できないし 他のブログなどを探しても見当たりません・・・
とりあえずは傾きをハードから受け取ってprintfなんかで表示できるようになればOKなんですが・・・
どうかお助けください
ストリームとキューって何が違うんですか?
ストリームは流れ、キューは待ち行列。
同じだよ
どっちもFIFOの要素集合でしかない
キューは一つのプロセス内でも読み書きするけど、
ストリームはそんなことしないんじゃね?
実装はFIFO
>>201 まずOrientationSensorクラスがWindows Runtime classであるってのは理解してる?
>>206 知識としてはわかるけど 完全に理解してるかというと微妙
C++から名前空間や関数を簡単に呼び出すってのは可能なの?
>>202 本質的にはキューは溜めておいたものを取り出すもの、ストリームは今流れているものを取り出すもの
http://www.wisdomsoft.jp/366.html を読む
#include <iostream>
using namespace Windows::Devices::Sensors ;
int main(Platform::Array<Platform::String^>^ args)
{
auto sensor = OrientationSensor::GetDefault();
if (sensor != nullptr){
auto result = sensor->GetCurrentReading();
}
else{
std::wcout << "No orientation sensor found" << std::endl;
}
return 0;
}
前C#で書いたのを書き直してみた
こんな感じで出来ないかな?センサー使えるハードウェアがないからわからない
ストリームを実現するのに、読む方より書く方が速いと困るので、
その溜めておく場所がキュー
ストリームは長さが分からない
キューは長さが分かる
インターフェイスクラスについて質問ですが
定数のスコープの関係でインターフェイスクラス内にconstな静的メンバ変数を持たせいのですが
それはC++のインターフェイスクラスの概念的にOKなのでしょうか?
また、メンバ関数の動作を保証するために静的メンバ変数を持つというのはOKなのでしょうか?
例えば、そのインターフェイスクラスを継承しているクラスのインスタンスが今現在どれだけ
あるかを得る、というメンバ関数の動作を保証するためには基底クラスのメンバにインスタンスを
カウントするためのstatic intが必要になる。という場合です
214 :
デフォルトの名無しさん:2012/12/28(金) 00:32:02.27
スレ違いだった申し訳ないのですが、
あるソフトウェアを作って、それをユーザーにインストールさせるとき、
ライセンスの問題上ソースコードをダウンロードさせてユーザーの環境で
ビルドさせる必要がある場合、インストーラにgcc(mingw)のバイナリを同梱させて、
ユーザーの環境で無理やりビルドさせるようなことってできるのでしょうか??
昔rubyで作られたマリオをインストールさせる際、rubyの処理系自体を
バイナリで固めたものをダウンロードさせていたものがあったので
似たようなことができるのではないかなと思ったのですが
どうでしょうか
簡単に出来るが?
216 :
214:2012/12/28(金) 01:25:34.28
レスありがとうございます。
手順としてはこんな感じであってますでしょうか。
1. 214 が作ったソフトウェア(Xとする)のインストーラをユーザーがダウンロードする
↓
2. ユーザーがダウンロードしたインストーラを実行
↓
3. インストーラがMinGWをダウンロード。 Cドライブ直下あたりに配置
↓
4.ソフトウェアXをビルドするためのソースコードをインストーラがダウンロード
↓
5.インストーラがmingwを実行してダウンロードしたソースコードをコンパイル&リンク
↓
6. exeファイルを生成
>>213 他のクラスのと名前が被ると名前解決は必要だけど
特に問題はないと思う
分かってると思うけど、インタフェースクラスは仮想継承することね
特にインスタンス数をカウントするのなら必須
219 :
214:2012/12/28(金) 16:27:18.35
ありがとうございます。
216の形式でやってみます。
あと別件でお聞きしたいのですが、
c++のpriority_queue で 先頭から2個目の要素をpopを使わずに
取り出したいのですが、何か方法はありませんでしょうか。
queueの性質上先頭から2個めが欲しいというのがそもそも
おかしいとは思うのですが・・
int test(string file){
wfstream fst;
wchar_t buf;
fst.open(file.c_str(), ios::in);
if(fst.fail()) printError(990);
while(fst.get(buf)){
wcout << buf << endl;
}
return 0;
}
上の関数でファイルから一文字ずつ読み込み→出力っていうことをやりたいんですが、マルチバイト文字をうまいことgetしてくれません。。。
どうすれば処理できるようになりますか?
ちなみに入力ファイルの文字コードはUTF-8を想定しています。
#include <codecvt>
std::wfstream filestream(L"filepath");
filestream.imbue(std::locale(std::locale(), new std::codecvt_utf8_utf16<wchar_t>));
>>218 ありがとうございます。無名空間も考えてみます
>>221 すみません、開発環境はLinuxです。。。
>>223 そういうのは先に言え
ファイルから全部読みだしてicuあたりを使ってUTF-8からUTF-32に変換して渡してやればいい
>>224 すみませんでした。
icuがよくわからないんで色々調べてみます。
どっちみちlocaleさわらないとwcoutに出力しても日本語文字は出ないよ
でもLinuxのlibstdc++はwcoutにimbueしてもスルーされて
グローバルロケール設定しないと動かないっぽいね
ロケールてなんなんや
プロンプトの文字コードとか?
文字エンコーディングだけでなく国別の数値や時刻の書式、文字のソート順等
いろんな種類(カテゴリ)の情報を扱うのがロケール
ただしC/C++標準で提供されている物は正直大して役に立たないし
あまり利用されていない気がする
Linuxだとそもそもwchar_tの利用がレアじゃないか?そういう印象があるけど
>>219 priority_queue を継承すれば、
内部利用してるコンテナ c を使ってどうとでもできそう
(ただし仮想デストラクタが無いので注意)
でも、そういう目的なら priority_queue じゃなくて
set 使えばいいんじゃないのかな
class HogeA {
public:
HogeA() {}
〜〜〜
HogeW toHogeW(); //←構文エラー ';' が、識別子 'toHogeW' の前に必要です。
};
class HogeW {
public:
HogeW() {}
〜〜〜
HogeA toHogeA();
};
相互に変換するメンバ関数を持ったクラス宣言はどう書けばいいのでしょうか?
HogeWクラス宣言前にHogeW使ってるからエラーなのだと思うのですが、どう解決すればいいのかわからないです
ニンゲン側から歩み寄ってやる必要があるんだよ
class HogeW;
class HogeA {
〜〜〜
233 :
デフォルトの名無しさん:2012/12/28(金) 22:37:50.77
>>230 Hogeとか書いてる暇があるなら自分で調べろ池沼
それができてないお前のような奴には無理
>230
解決しなくていいからさっさと回線切れや糞hoge厨。
>>230は露骨な荒らしなんだからいちいち構うなようっとうしい
スルーよろ
>>230 hoge使うこととネットで見ず知らずの他人にタダで教えろって情報乞食することは覚えられても
自分に必要な情報を自分で調べることは覚えられないのか
どんなクズにどういう教育受けたらお前みたいなクズに育つの?
自覚ないんだろどうせ、自覚のないクズが一番迷惑
238 :
デフォルトの名無しさん:2012/12/28(金) 23:22:16.31
またHOGE厨か
わざわざ時間おいて連投とか情熱あるな
hogeに恨みはないけど何で文字数の少ないfooではなくわざわざ文字数の多いhogeを選択したのかが疑問。
hoge使ってる基地害はどうせ書籍すら調べてないんだろ
hoge使ってる基地害には知恵遅れが多いからな
書籍→検索→質問掲示板
の順じゃなくて、
検索→質問掲示板
って順の基地害が多い
どうかしたらいきなり質問掲示板に来る基地害までいる
お前ら禿げてるからってhoge叩くのやめろよ
248 :
デフォルトの名無しさん:2012/12/29(土) 05:22:11.35
hogewwwwwwww
馬鹿じゃね
ホントこのスレ伸ばすのは手軽でいいなwww
class Hoge{
public:
Hoge();
};
年の瀬で寂しいから適当なhoge質問作って人気者になろうかな
hogeを含む質問をすればスレが伸びる風潮
std::shared_ptrの説明を読んで、受け渡しする際にはきちんと一度宣言して名前を付けてから
受け渡すということはわかったのですが、どうしてもうっかりmake_pairなど便利な関数の
返り値を使ってそのまま受け渡しをしてしまったりします。
こういったミスが起きないようにするためのみなさんの心がけや良い方法があったら
アドバイスお願いしたいです。
例外安全の崩れたプログラムで一度痛い目を見るといいよ
ほげぇ
ほげぇ
頭悪そう
急遽プログラミングを使うことになり、昨日からc++の勉強をしているのですが、
ポインタについて自分の認識があっているかを確認させていただけませんでしょうか?
・char* mojiという宣言はmojiというchar型のポインタ宣言なのでmojiに入れるのはアドレス
・関数の宣言の中で、function(char* c)
と引数の型を指定したとき呼び出す際はcにはchar* moji1は入れられるが、char moji2入れられない
moji2を入れたければfunction(&moji2)とすればいい
・char tekito[10]="waiwai"として初期化できると思いますが、char* tekito2も同じように初期化できるのでしょうか?
・また、tekitoの2文字目を変えたいとき、*tekito[1]="z"とすればよいのでしょうか?
間違いがあれば指摘していただけませんでしょうか
よろしくお願いいたします
>・char* mojiという宣言はmojiというchar型のポインタ宣言なのでmojiに入れるのはアドレス
はい
>・関数の宣言の中で、function(char* c)
>と引数の型を指定したとき呼び出す際はcにはchar* moji1は入れられるが、char moji2入れられない
>moji2を入れたければfunction(&moji2)とすればいい
はい
>・char tekito[10]="waiwai"として初期化できると思いますが、char* tekito2も同じように初期化できるのでしょうか?
はい
>・また、tekitoの2文字目を変えたいとき、*tekito[1]="z"とすればよいのでしょうか?
*はいりません
>>258 ・char* mojiという宣言はmojiというchar型のポインタ宣言なのでmojiに入れるのはアドレス
Yes
・関数の宣言の中で、function(char* c)
と引数の型を指定したとき呼び出す際はcにはchar* moji1は入れられるが、char moji2入れられない
moji2を入れたければfunction(&moji2)とすればいい
Yes
ただし c を文字列として扱う場合は
単一の変数である moji2 のアドレスを入れてはいけない。(危険)
*c = 'A'; のように単一の文字を返すためにポインタを使ってるなら問題ないけど、
文字列なら配列を渡すこと。
・char tekito[10]="waiwai"として初期化できると思いますが、char* tekito2も同じように初期化できるのでしょうか?
初期化できるけど意味合いが異なる。
配列 tekito の初期化の場合は配列が指定した文字列で初期化され、
ポインタ tekito2 の初期化の場合は文字列リテラル "waiwai" がメモリ上のどこかに置かれ、そこへのアドレスで初期化される。
あと、文字列リテラルは変更不可なので、const char* でないと危険。
C++11 で正式に const がないとだめになったが、C++03 までは互換性のために許容されている。(だったよね?)
配列の場合は tekito[10] の領域に "waiwai" がコピーされるので、変更しても問題ない。
・また、tekitoの2文字目を変えたいとき、*tekito[1]="z"とすればよいのでしょうか?
tekito[1] = 'z';
C#で変数宣言するときvarを使う人は結構多いと思いますが、
C++でautoを使ってる人をほとんど見かけません。何か理由があるんでしょうか。
C#からC++に入った私は結構使ってるんですが、やめたほうがいいですか。
>>261 最近追加された機能だから
サポートしてないコンパイラを使ってると当然使えない
>>260 >ただし c を文字列として扱う場合は
>単一の変数である moji2 のアドレスを入れてはいけない。(危険)
>*c = 'A'; のように単一の文字を返すためにポインタを使ってるなら問題ないけど、
>文字列なら配列を渡すこと。
function(char* c[ ])としておかないといけないということでしょうか??
例えばchar* cで受けて、実装で文字列に変換することはできないのでしょうか?
ポインタcからポインタを進めて0が入ってるところまでをメモリを確保した先にコピーするようなことはできないのでしょうか?(あまり意味のない実装だとは思いますが…)
>>266 function(char* c) のまま
char mojiretsu[128];
function(mojiretsu);
と渡す
汚ジャバつかってろ
>>267 それは配列は先頭のポインタが格納されているからという理解でよいでしょうか??
>>269 配列にはポインタなど格納されていない
mojiretsu はポインタに変換出来て
その値は配列の先頭アドレス (&mojiretsu[0]) になるというだけ
class CObject {
public:
virtual CObject* GetPtr(void) const {return this;}
};
↑のようなクラスを作ってコンパイルすると
「error C2440: 'return' : 'const CObject *const ' から 'CObject *' に変換できません。」とエラーになってしまいます
constメンバ関数の中でメンバに対する変更は行えないのは知ってますが
メンバに対する変更をしているのではなく、ただポインターを返そうとしているだけなのになぜエラーになるのでしょう?
virtual CObject* const GetPtr(void)
constをそこにつけると関数中のthisがconst Type*型になる?しかないよな
試しに
virtual const CObject* GetPtr(void) const{return this;}
にしたら通った
本当だ・・・const CObject*にしたり、(CObject*)thisにしたりしたら通った
constメンバ関数は戻り値もconstってことなんですかね
(CObject*)this はまずいだろう。
void* が4バイトの環境で、まずポインタが保持するアドレス値を8バイトの整数値に
reinterpret_castして、その値をもう一度ポインタにreinterpret_castした場合、そのポインタは
元の通りの動作をしてくれるのでしょうか?
ポインタサイズの整数型にreinterpret_castしてから
8バイト値に入れればいいと思うぞ
そもそも8バイト整数値にする理由とはなんぞや
intptr_t型が使えるならそれ使っとけ
無ければ似たような物作っとけ
整数にする意図は何だ?
チートコードぐらいじゃね
汎用パラメータに渡すとかはよくある話
mapのキーにstringを使うと文字列を比較するせいで数値のキーに比べて時間がかかるということで
今までは文字列を適当にハッシュ化してからインサートしてたんですが、
unordered_mapなら理論上1回しか比較しないからstringのままでも十分速いんでしょうか?
ハッシュ化だけだとハッシュが被ったら困るぞ >
途中で書き込んじゃった
ハッシュ化だけだとハッシュが被ったら困るぞ >map
ハッシュが被った場合は string を使って管理しないと
unordered_map はまさにハッシュで管理するので string のままでも速いし
ハッシュが被った場合に string の比較もやってくれる
>>286 なんと素晴らしい!ありがとうございました
今年はhoge厨が来ませんように。
NG掛けて放っておいたらいいんじゃないですかねぇ・・・
hogehoge
NGの使い方を知らないプログラマなんていませんよね・・・ホゲホゲ・・・
異なるデータ型を返すようなインターフェースは作成可能なんでしょうか?例えば
class IHelper {
public:
virtual ~IHelper() {}
template <class T>
virtual T Get() = 0;
};
template <class T>
class TypeHelper : public IHelper {
private:
T val;
public:
virtual ~TypeHelper() {}
template <class T>
virtual T Get() {return val;}
};
//main
std::vector<IHelper*> test;
test.pushback(new TypeHelper<int>);
test.pushback(new TypeHelper<float>);
int i = test.at(0)->Get();
float f = test.at(1)->Get();
このようなことはできるのでしょうか?
メンバ関数テンプレートは virtual にはできない
boost::any のような variant 型を使うしかないね
>>293 ありがとうございます。やはりスクリプトは偉大ですね
引数を void* にして引数から返すという手もある
そのままでは危険なので一工夫あった方がいいが
用途によってはCRTPが適用できる
GUIを使って簡単なプログラムを組んでいたのですが、行き詰ったので助けてください
ウィンドウにウィジェット(入力BOX、ボタン)を組み込んで、
それらを使いボタンを押すたびに円が表示されるようにします。
さらに、その円をそれぞれキーボードなどで動かしたいと思っていたのですが
解決法が見つかりませんでした。ヒントでもいいので教えてください。
ヘッダファイルなどはこちらのものを使っています↓(主にgarph,point,window)
http://www.stroustrup.com/Programming/Graphics/
宣言時に未定義なクラスAでも
void Func(class A& a);
みたいな宣言はできますよね
このクラスがnamespace Nのなかだった場合は同宣言すべきですか?
void Func(class N::A& a);
のようなことがやりたいのですが
using namespaceすべき?
namespace N
{
class A
}
void Func( N::A &a );
なるほど
運用的には、namespaceとその中の宣言だけのファイルとかあったほうが良いのですかね
まあ運用は自分でも考えてみます
ありがとうございます
301 :
297:2013/01/03(木) 03:15:16.73
自己解決しました!
circle型のヴェクタ使えばできるんですね
他のクラスの関数を呼ぶと
「静的でないメンバー参照は特定のオブジェクトを基準とする相対参照である必要があります」
と怒られます。どうすればいいのでしょうか
ConfLoader.cpp:
#include "ConfLoader.h"
class ConfLoader {
char *Get (char *name) {
こーど
}
}
ConfLoader.h:
class ConfLoader {
public:
char *Get (char *name)
}
Display.h:
#include "ConfLoader.h"
Display.cpp:
#include "Display.h"
void Display::updateNotify() {
Lang::Get("文字列");
}
Langってどこから出てきたん
すみません
"class ConfLoader"でなく
"class Lang"です。
静的メソッドじゃないものを、静的に呼び出されても・・・
そのGet()関数は静的関数じゃない
↓
なんらかのインスタンスを使って呼び出さないと
↓
Lang lang;
lang.Get("もじれつ");
または
Lang lang = new Lang;
lang->Get("もじれつ");
あるいは逆に関数を静的にするとか
ConfLoader.h:
class ConfLoader {
public:
static char *Get (char *name)
}
ただしこれは「こーど」の内容次第
(非staticメンバ変数依存)では不可能
なるほど
分かりました
こんな感じのコードを書いてみたのですが、ループに入っても円が動いてくれません
動く前に次のループに入ってしまっているのでしょうか?
//ループしている間a(x座標),b(y座標)ずつ円が動く
char c;
while(1){
cin >> c;
if(c == 'q') {gui_main();} //ループを抜ける
circle.move(a,b);
}
cinからの読み込みは入力があるまで待つからそこで止まってるhogehoge
うああああああああああああああああああ
これは恥ずかしい
どうやって抜けようか・・・
peek()で確認すればいいんじゃね
peek()関数は初めて聞きました、こういう事でしょうか?
char c;
while(1){
c=cin.peek();
if(c == 'q') {gui_main();} //ループを抜ける
circle.move(a,b);
}
313 :
312:2013/01/04(金) 03:29:47.52
>>312 これでいいんじゃね?
#include <conio.h>
while(1){
if(_kbhit() && (_getch() == 'q')) {gui_main();} //ループを抜ける
circle.move(a,b);
}
たしかpeekも入力があるまで待つはずだけど
もし標準準拠の範囲でやるのなら11使ってマルチスレッド化だな
>>315 > たしかpeekも入力があるまで待つはずだけど
仕様見てないけど、peek という名前で入力待ちするような設計をする奴はアホだと思う。
317 :
312:2013/01/04(金) 15:04:25.02
>>314 レスありがとうございます!
ですがstart()に入った瞬間プログラムが終了してしまいます。
入力待ちの方は問題ないと思うので、別のところにミスがあるようです。。
>>313 よくわからんけど
236行目は
> int main()
> try{
> …
じゃなくて
> int main()
> {
> try{
> …
じゃないかな
320 :
317:2013/01/04(金) 19:29:49.32
例外処理中に例外でたらどないしはります?
>134 vdx_dy[n] = dxy + vdx_dy[n];
ここで落ちてるようで
ソース見たところvdx_dyにpushしてるところが一つもないんだが
そりゃランタイムエラー出るわな、要素が一つもないのにアクセスしようとしてるんだから
>>313 LinuxでFLTKの最新stableのv1.3.2を入れて、ディレクトリに
>
ttp://www.stroustrup.com/Programming/Graphics/ を置いて
>
ttp://codepad.org/rQHVgGeZ を313.cppで置いてmakeしたけど通りません。
313.cpp: In constructor ‘Coulomb_window::Coulomb_window(Point, int, int, const String&)’:
313.cpp:63:3: error: class ‘Coulomb_window’ does not have any field named ‘Window’
313.cpp:76:13: error: ‘attach’ was not declared in this scope
313.cpp: In member function ‘void Coulomb_window::add()’:
313.cpp:157:21: error: ‘attach’ was not declared in this scope
313.cpp:161:21: error: ‘attach’ was not declared in this scope
313.cpp:164:9: error: ‘redraw’ was not declared in this scope
313.cpp: In member function ‘void Coulomb_window::quit()’:
313.cpp:210:7: error: ‘hide’ was not declared in this scope
313.cpp: In member function ‘void Coulomb_window::reset()’:
313.cpp:226:22: error: ‘detach’ was not declared in this scope
と出ます。
どうすれば良いのでしょう。
makeてまだ現役なの?
もっと使いやすい新しいの無いんですか?
makeはなんか馴染めなかったgccから直打ちしてたよ
分割コンパイル時にはmakeかその類は必須
>>320 配列の添字が範囲外になっているという例外
標準の例外クラスってコピーするときに例外安全なんですか?
>>328 そりゃそうだ。
例外安全でないってことは例外発生時にメモリリークやデータ破壊が
起こるってことで、そんなの実装がバグってるってことだろ。
具体的に何を疑ってるのかよくわかんないけど。
330 :
317:2013/01/04(金) 21:30:08.27
>>321 それは困るので戻しておきます
>>322 やっぱりですか、これはだめですよね
それも含めて少し訂正してstart()関数を使ってみたところ
ボタンが固まっているのでループはしているようです、ただ円は動いてくれませんでした。。。
http://codepad.org/h9QogXXh >>327 配列の添字を変えたりはしていませんし、pushのし過ぎというのも考えにくですね
原因は何なのでしょう。。だんだんと動いてくれないのが不思議になってきました。
引き続きランタイムエラーを探してみます
そもそも FLTK のキー入力処理自体イベントが飛んで来たりするんじゃないの?
よく知らないけど普通の GUI フレームワークならそう。
今の状態なら FLTK で開いたウィンドウじゃなくて
起動したコンソール側でキー叩けば反応するかもね。
追記。
>分かっている問題点は「円が動いてくれない」と「ループから抜けて制御をgui_main()に戻らない」の二点です。
これ多分同じ問題だと思うけどね。
>ボタンが固まっているのでループはしているようです、ただ円は動いてくれませんでした。。。
ボタンが固まっている=再描画ルーチンとかその辺に処理が回っていない=「円が動いてくれない」&&「ループから抜けて制御をgui_main()に戻らない」
だと思う。
イベント駆動の考え方に慣れてないんだと思うけど、
1) とりあえず1つ円を表示するだけ
2) 1つ円を表示、キー入力がある毎に円が移動
3) 1つ円を表示、キー入力があるまで移動(タイマーイベントとかを使う)
4) 複数の円でできるようにする
とか、ステップ踏んでいく方がいいと思うよ。
printf で添字をダンプするとかの焼き畑デバッグも
意外と役に立つ
335 :
317:2013/01/04(金) 23:08:17.84
>>331 ステップ実行かなり便利ですね!!くせになりそうです
エラーをどんどん見つけているところです
a,b=0; とするとbだけ初期化されてaはされないんですね。。
>>332 >>333 >>334 その通りでした、ループに入ってすぐにランタイムエラーが出てました
ステップ実行でも無理ならそうしようと思います。
336 :
335:2013/01/05(土) 02:38:35.80
修正したところ、正常に246行目のmove()関数まで動いているようです(数値上では円は移動している)。
http://codepad.org/x6UThpod ですが、ループ中は全く円は移動してくれません。
ループを'q'で抜けて再びadd()関数で円を追加したり、ウィンドウの大きさを変更したりすると円が瞬間移動します。
>>333さんの方法で書いてみてたところ上と同じような事になりました。
http://codepad.org/GnZHzOVr 最初から円を配置しておいて、startボタンを押すとループに入ります。
ループ中にキーボードの'a'を押すたび右へ少しずつ動くようにしてありますが、ループ中は全く動いてくれません。
そして'q'でループを抜けると一気に右へ'a'を押した分だけ瞬間移動します。
リアルタイムでの描画が出来ていないようです、何かいい方法はありませんか?
>>336 描画を行なわせるための仕掛けが用意されているはずなので、それを使えばいい。
イベントドリブンなライブラリならイベントフラッシュ、描画エリアの無効化などのキーワードを参考に。
>335
全然分かってねええええええええええええええええ。
自分でイベント待ちのループを回すという発想をやめよう。他の部分に処理が回らない。
FLTK 良く分からないけどこれで動かない?
struct Coulomb_window :Window{
// 略 ↓追加
public:
int handle(int); // in Fl_Widget
};
void start() {} // とりあえず空にする
// ↓追加
void handle(int e)
{
int ret = 0;
switch (e) {
case FL_FOCUS:
case FL_UNFOCUS:
ret = 1;
break;
case FL_KEYDOWN:
if ( Fl::event_key('a') ) { ret = 1; circle.move(10,0); }
break;
}
return ret || Fl_Window::handle(e);
}
>337
彼は redraw() は呼んでる。なので InvalidateRect() なり RedrawWindow() は多分呼ばれてる。
自分でループを回していてそこから抜けないので WM_PAINT を処理するメッセージループまで処理が戻ってないんだ。
339 :
335:2013/01/05(土) 16:44:17.46
>>338 なるほど、自分でループを作るのではなくてgui自体のループを利用するってことですよね
'a'を押しても円はは動いてくれませんでした。。
widgetの操作には反応するのに、キーボードからの入力には反応しないのでしょうか
fltkで検索してもあまり引っかからないですね、マイナーなのかな
340 :
335:2013/01/05(土) 16:57:44.02
ちなみにstart()を
void start()
{
circle.move(10,0);
redraw();
};
にするとうまく動きました。
どしても起点がwidgetにあるようです、キーボー入力起点もできればいいのですが。。
なんだか目標の無限ループが遠のいていくようです
>340
ごめん。俺が redraw() つけるの忘れてた。
if ( Fl::event_key('a') ) { ret = 1; circle.move(10,0); redraw(); }
でどうだろう。
うちの環境(Cygwin)だと、なぜか Fl::event_key('A') にしないと動かなかったんでその辺も試してみて。
説明書くの忘れてた。0.1 秒毎に timeout_callback が呼ばれるんで
this_->circle.move(10,0); this_->redraw();
の部分を適宜書き換えてくれ。動きを止めたければ repeat_timeout を呼ばないようにすればいい。
344 :
335:2013/01/05(土) 17:53:06.67
おぉぉぉぉぉぉぉぉ!!
動きました、ありがとうございます!
これからいろいろ試してみます
345 :
323:2013/01/05(土) 17:55:40.18
かたや
>>323はいまだにビルドが通らないのであった・・
346 :
335:2013/01/05(土) 22:39:50.09
>>343 元のプログラムに
>>342を組み込もうと思ったのですが、Fl_系,timeout系の関数の使い方が分かりません。。
検索してもなかなか引っかからないのですが、使い方が乗っているHPなどはありませんか?
もう一つ
int handle(int)
void start()
timeout_callback(void*)
この3つはどう関連しているのでしょうか?
ステップ実行を使っても今並べた順番で動いているということしか分かりませんでした。。
>346
FLTK の公式サイトのドキュメント
http://www.fltk.org/doc-1.3/index.html 見ても分からないってことだよねぇ。
Fl_Gl_Window になってるけど基本的な考え方は↓が参考になると思う。FL::add_timeout でぐぐったら 7 番目に出てきた。
http://www.slis.tsukuba.ac.jp/~fujis/cgi-bin/wiki/index.php?Fl_Gl_Window%A4%C7%A4%CE%A5%A2%A5%CB%A5%E1%A1%BC%A5%B7%A5%E7%A5%F3 >int handle(int)
>void start()
>timeout_callback(void*)
>この3つはどう関連しているのでしょうか?
まず、CUI のプログラムを書いてるときは自分が次々に関数を呼び出していく形だけど、
GUI のプログラムでは次々に自分が呼び出される形になるってのはまず押さえといてくれ。
handle() は他のと無関係で関連してない。キー入力に対応する分のコードを消し忘れてただけ。
FLTK 内部のループに入ってるときに何かイベントが発生したら都度呼び出される。
キー入力だけじゃなくてマウスの移動とかクリックでも呼び出されてる。
で他の2つについて。
start() の中の
Fl::add_timeout(0.1, timeout_callback, static_cast<void*>(this));
によって、0.1 秒後に timeout_callback() を呼び出して欲しい、と FLTK に指示している。
で、(FLTK 内部のループから) timeout_callback() が呼び出されたときに移動処理と再描画を指示した上で、
Fl::repeat_timeout(0.1, timeout_callback, static_cast<void*>(this_));
で、再度 0.1 秒後に timeout_callback() を呼び出して欲しい、と指定している。
以下繰り返し。
handle() も start() も timeout_callback() も FLTK 内部のループから呼び出されるってことは同じだね。
348 :
335:2013/01/06(日) 02:53:34.63
>>347 ありがとうございます、納得しました!
どうやらtimeout_callback(void*) が静的らしく非静的のCalculation_of_powervoid()が中で使えないようなので
repeat_timeoutでコールバックして使おう思ったのですが
「型"void(Coulomb_window::*)(void *pp)"の引数は型"Fl_Timeout_Handler"のパラメータと互換性がありません」
とエラーが出ます。
void Coulomb_window::Calculation_of_power(void* pp)
{} //ppは使用していない
と修正し
void timeout_callback(void* ptr)
{
void* p;
Fl::repeat_timeout(0.1, Coulomb_window::Calculation_of_power, p); //Coulomb_window部分にエラー
Coulomb_window* this_ = static_cast<Coulomb_window*>(ptr);
this_->circle.move(10,0); this_->redraw();
Fl::repeat_timeout(0.1, timeout_callback, static_cast<void*>(this_));
}
と書いています。エラーの原因は何でしょうか?
ちなみにビルドエラーでは
「 error C3867: 'Coulomb_window::Calculation_of_power': 関数呼び出しには引数リストがありません。メンバーへのポインターを作成するために '&Coulomb_window::Calculation_of_power' を使用してください」
と表示されます。
349 :
348:2013/01/06(日) 02:57:41.89
>非静的のCalculation_of_powervoid()ではなく非静的のCalculation_of_power()です
Calculation_of_power()の中には非静的なものが含まれているのでstaticは使えませんでした
メンバ関数ポインタだけあっても適切に呼び出すことはできない
どうにかしてstaticな関数にしないと無理
>>348 もちっと考えようや。
circle だって非静的メンバでしょ。
きっとそうなろだろうと思って this_ ポインタ用意したのに。
this_->Calculation_of_power(); の形式で呼んでください。
念のために言っとくと this ポインタみたいに使うってことで、
this_ という名前にしただけで this とは別物だしそういう
機能が有るわけでもないからね。
>まず、CUI のプログラムを書いてるときは自分が次々に関数を呼び出していく形だけど、
>GUI のプログラムでは次々に自分が呼び出される形になるってのはまず押さえといてくれ。
って書いちゃったから混乱させちゃったかもしれないけど、必ず FLTK 側から呼びださせなければ
いけないわけではなくて、必要な処理だけして十分短い時間で処理を戻せばいいです。
んで、Calculation_of_power() って毎回やらせたい移動処理なんだから move の代わりに、
void timeout_callback(void* ptr)
{
Coulomb_window* this_ = static_cast<Coulomb_window*>(ptr);
// 毎回必要な処理があったらこの辺に追加していく
// 非静的メンバ関数1つにまとめておいてそれ呼び出した方が見通しがいいかもしれないけど。
this_->Calculation_of_power();
this_->redraw();
Fl::repeat_timeout(0.1, timeout_callback, static_cast<void*>(this_));
}
ってすればいいです。
ちなみに、この静的、非静的の問題というか枠組みは cb_start() と start() でも発生していて、
FLTK からは静的な cb_start() を呼んでもらって、cb_start() から非静的な start() を呼び出してる。
reference_to<Coulomb_window>(pw). にあたるのが this_-> とその前のキャスト。
参照とポインタという違いはあるけどね。
バカにはムリ
>348
あー、あと忘れてた。
>どうやらtimeout_callback(void*) が静的らしく非静的のCalculation_of_powervoid()が中で使えないようなので
現状の timeout_callback() は非静的メンバ関数ですらなくて通常の関数。フリー関数と呼んだりもする。
ただし friend 指定をつけて無理矢理 private メンバをアクセスできるようにしたりしてる。
それなら静的メンバ関数にする方が自然だし friend 指定も消えるので(一般的に friend は避けるべき)、
friend void timeout_callback(void*);
→
static void timeout_callback(void*);
void timeout_callback(void* ptr)
→
void Coulomb_window::timeout_callback(void* ptr)
とした方が良かった。名前も cb_timeout にした方が他と揃っていいかもね。
cb_ は callback (FLTK から呼び出される)の意味で付けてるはず。
いい加減ウザイわ
そうだよなーそこまでやるなら基礎から勉強しなおして自分でやれって感じだよなー
まあお人好しな暇人が多くて良かったね、と
357 :
349:2013/01/06(日) 09:24:57.59
すいません、もうこのスレには現れません、勉強しなおしてきます
もし今後この質問を私のふりをしてぶり返す人がいてもそれは
私の偽物ですので無視してください。
ご迷惑をお掛けしました
358 :
349:2013/01/06(日) 09:49:29.48
↑こいつは私の偽物です
間に受けないでください
359 :
348:2013/01/06(日) 14:13:45.18
>>354 今考えればどうしてこうthis_->Calculation_of_power(); しなかったのが不思議です
おかげでほとんど完成しました、親切にありがとうございました
もっと勉強が必要ですね、初心者になれたらまたきます
なんだかF10とF11のテンキーが欲しくなってきました
C++です。
ある関数の成否を判断する必要があって、かつ例外を出すほど大袈裟ではないとき、
どういう作りにするのがスタンダードでしょうか。
特に理由がない限り、成功時は戻り値にマジックナンバーで0を、失敗時は-1を返すくらいで問題ないでしょうか。
>>360 C++さんに物申す。
特に理由がない限り、成功時は戻り値にtrueを、失敗時はfalseを返すくらいでも問題ないかと。
boost::optionalを返す
0/-1ってBASICかよ
DXライブラリがそれだから、使う場合に合わせたくなる気持ちはわかる
>>365 お前か宿題スレにありもしない問題を書いたのは
BASICやDXライブラリは分からんけど、Cの標準関数で失敗時に非0(特に負の数)を返すものはチラホラあった気がする。
main の戻り値とか?
成功時に0、失敗時に非0というものは
標準関数じゃmainとsystemくらいじゃね
OSのAPIじゃよくあるけど
戻り値の論理が反転しちまった一部の関数には
揃える用のインライン関数
つかなんでCはmainが成功0なのに非0がtrueなんだろう。
>>369 最近少し増えた。
C11のerrno_tとC++11のerror_codeクラス(それぞれ別物)。
shared_ptrはSTLコンテナ用に比較演算子がget()で生ポインタの値を渡してから
比較するようにオーバーロードされているようですが、
unordered_mapのハッシュ化には対応しているでしょうか?
失敗が複数ある場合は0を正常にするのが普通
0 なんていうマジックナンバーを直接使うからいけない
#define SUCCESS 0 とでもしておいて
return SUCCESS; とか if (result == SUCCESS) って書けば不自然さはない
main の戻り値も return EXIT_SUCCESS; って書いとけ
なんちゃら_OK とかよく定義されてるな
C++で#define使うなよ
Cでも使うなら許す
380 :
374:2013/01/07(月) 21:58:29.88
すみませんunique_ptrとshared_ptrが対応してるのは確認できました
weak_ptrはリファレンスにもないみたいですね
auto宣言が用意された今ならテンプレートクラスでboolを取り出すべきだよ
>>380 今はstd::mapとowner_lessで我慢するしかない。
標準でサポートされてるから知らんが
ハッシュくらいいくらでも指定すればええんでないの
×標準でサポートされてるから知らんが
○標準でサポートされてるかは知らんが
class Hoge
{
public:
explicit Hoge(int v) : v_(v) {}
explicit Hoge(const std::string& v) : v_(v) {}
private:
boost::variant<int, std::string> v_;
};
こういうようなクラスがあって、
Hoge a(...);
if (a == "foo" || 4545 > a) ...;
というようにやりたいんですが、比較演算子を1個ずつ対応する型ごとに全部実装しないとダメですか?
他には
const boost::variant<int, std::string>& v() const { return v_; }
を作るくらいしか
>>385 4545 > Hoge("bar") なんてのをどう定義するつもり?
388 :
デフォルトの名無しさん:2013/01/08(火) 01:03:38.86
>>385 比較の仕様によってはテンプレート使って数を減らすこととかは出来るでしょ
>>385 Hoge
Hoge
Hoge
こいつ本物のクズだろw
std::make_pairのリファレンスを眺めていたところ
template <class T1,class T2>
pair<T1,T2> make_pair (T1 x, T2 y)
{
return ( pair<T1,T2>(x,y) ); //←※
}
※の部分で生成したペアを直接返していますが、つまりこれは
T1かT2にshared_ptを指定すると事故ってしまう場合があるということでしょうか?
なぜshared_ptrが関係するんだ
pairのメンバ変数が参照持ちならな
ありがとうございます。
make_pair( "TestID", shared_ptr<int>(new int(10)) );
あくまでこのようなnewしたポインタで一時的なshared_ptrを生成するのが危ないのであって
この使い方はmake_pairに限ったことではなかったのですね。失礼いたしました。
>>395 その例だと他で例外発生しないから大丈夫だと思うけど、
一般的には
shared_ptr<int> p(new int(10));
と構築してから
make_pair("TestID", p);
とすれば何の危険も無い
shared_ptr<int>(new int(10)) という文脈は全て
make_shared<int> (10) に置き換えれば安全
あるクラスのソースファイルには自身のクラスのヘッダファイルのみを
インクルードするのが原則らしいですが、そのヘッダファイル内では
必要のない情報(例えばソース側でしか使用しないヘルパ関数や、
ヘッダファイルで使うインターフェイスクラスのImplを記述したファイルなど)
はソースとヘッダのどちら側でインクルードするのが望ましいのでしょうか?
インターフェイスの実装部分などは隠蔽・分散の概念からするとソース側で
インクルードしたいのですが、原則がノドにつっかえる気分です
>>398 何その原則初めて聞いたんだが
普通にソースで必要なヘッダをインクルードしろよ
実装の都合でヘッダファイルにインクルード晒すとかないわ
>>398 宣言と定義の違いを正しく認識できたらまたきてください。
>>398 その原則が業務上の縛りならそれを護るのが筋だがな。
そんな意味の無いどころかむしろ危険な縛りなんて糞喰らえだ
>>402 害しかないような縛りは改善しろよ。それが「業務」ならなおさら。
405 :
デフォルトの名無しさん:2013/01/10(木) 12:44:16.52
おかしな規約作るバカは排除する
こっちが死なないためにはそうするしかない
ヘッダファイルで思い出した。
外部に公開する必要はないんだけど、定数やら宣言やらを切り分けて1ファイルにしたい時ってどうしてる?
一切禁止のところから、ヘッダファイル名に一定のルールを付ける(拡張子等)ところ、
あるいは、あまり気にせずに普通に外部用ヘッダに書いてしまうとか、色々あると思うけれど。
#ifdef LIBHOGE_PRIVATE
非公開な定義とか;
#endif
みたいにするのが最近の俺のやり方
>>406 翻訳単位に閉じてるって意味なら、ヘッダには書かない
モジュール/ライブラリプライベートって意味なら、公開ヘッダには書かず
非公開ヘッダに書く(両者を分けるのが重要)
shared_ptrのスコープについての質問です(各種includeや名前空間のstdなどは省いてます)
class Test
{
private:
shared_ptr<int> m_spInt;
public:
Test() { m_spInt.reset( new int); } //コンストラクタ
int Get() { return (*m_spInt); }
void Set(int val) { (*m_spInt) = val; }
};
int main(void)
{
Test test;
test.Set(100); //※
cout << test.Get() <<endl;
return 0;
}
これを実行すると※の行で「test.m_spIntは空だよ」と怒られてしまうのですが
↑のようにメンバ関数内(ここではコンストラクタ)でshared_ptrに対しresetで
newした実態を渡しても意味がないのでしょうか?(関数から抜ける時に消滅してしまうのでしょうか)
vc2012
別に怒られんが
もっと環境を晒せよ
>>410 どうもありがとう、
そしてご指摘どおりコンストラクタの記述ミスってただけでした、本当に申し訳すみません・・・
412 :
406:2013/01/10(木) 18:53:33.61
>>407 上手いなそれ。
foo.cppに対するfoo.hのような、正しいところからインクルードする際の手間は増えるけど、
コンピュータ側からも人間の目でも、インクルードミスをミスだと判断できるのは良いよね。
>>408 非公開ヘッダにするとき、何かやってることはある?
413 :
デフォルトの名無しさん:2013/01/10(木) 19:26:40.44
質問させてください。
struct Events
{
int numEvents; ///< number of Events in array
Event* events[2]; ///< event pointer array, variable size
};
使用しているライブラリの中に上記のような構造体が定義されていたのですが、
この構造体のメンバのeventsにはEvent*のポインタがいくつでも入れられるのでしょうか。
///< event pointer array, variable size
とあるのでそのように見えるのですが、
では events[2] の 2は一体なんなのだろうと思っています。
いくつでも可ではなく、2個までしか入れられないのでしょうか。
ご教示いただけると嬉しいです。
>>406 どうしても公開せざるを得ない場合は
boost の detail 名前空間みたいなのを作って
内部使用用ですよと分かるようにする
配列のポインタじゃなくて
ポインタの配列だから
ふつうに予想すればリンクどリスト
416 :
413:2013/01/10(木) 19:53:54.35
レスありがとうございます。
連結リストとのことですが、それと2という数字はどう関わりがあるのでしょうか
events[2]
で連結リスト表すといった慣習があるのでしょうか??
俺は聞いたことないな
どうしても知りたければライブラリ製作者に直接聞けばいい
前の要素と次の要素で2つだろ
↓
Events の中に Event があるんだから前後はなくない?
beginとendだと思われる
なるほど
配列って言ってるしそうかもな
p->event[x]のxを代えるだけでシフト演算子を使いたりヤヤこしい事せず
上向き下向きを一つのコードで扱えるから
英語に慣れてない身としては複数形のsを付けるのと付けないのとで
定義が違うなんて見分け付かないから止めて欲しいが
メリケンにとっては日常的に重要な部分だから目に付くんかな
それは単に粗忽なだけ
>>422 そんなことないとおもうよ
英米人でもまちがえるだろう
sはコンテナを表すサフィックス、くらいには思ってるけど、
それの有無で別の変数になるような命名は避けるようにしてる
別の変数になっても型が大きく違うから
間違えてもコンパイルエラーになる
コンテナのコンテナとかになるとよくわからなくなるからsでごまかすのやめて
ベクトル計算とかGPU計算はfortranとC系列どちらが得意ですか?
物理シミュレーションで伸び悩んでるので習得したいのですがどっちでやるべきでしょう
>>428 ライブラリによると思うが、、Cを覚えたらFORTRANを覚えるのは苦にならないが、
FORTRANを覚えてもCを覚えるのに応用があまり利かないので、
Cを覚えるべきだと思う。
fortran は並列化コンパイラが発達してるから
ベクトル計算は得意
GPUやるならC系列だろうな
ベクトル計算つってもそういうスパコンないと無意味じゃね?
432 :
デフォルトの名無しさん:2013/01/11(金) 11:57:07.85
gnuな環境で、素敵な乱数を教えて
error: '素敵' が未定義です。
>>431 今時ベクトル演算もできないPCとかあり得へん
でもgpuはfloatしか使えませんし…
floatあれば充分だろ
物理じゃ精度が足りない事がままある
9桁くらい精度が必要だったり
438 :
デフォルトの名無しさん:2013/01/12(土) 14:19:04.87
物理やるなら128bit欲しくなるよ
スケールを工夫すればdoubleでもなんとかなるケースが多いけど
※128bit:39桁
Fortranだと128bit浮動小数点数があったと思うけど
それが使える環境だとC/C++でもlong doubleが128bitなのかな
CPU自体が128bit浮動小数点数をサポートしてないと遅そうだな
std::vectorとstd::dequeで、dequeの方が機能豊富で便利なのですが、
vectorは何のために残されているのでしょうか?
444 :
デフォルトの名無しさん:2013/01/13(日) 02:53:49.80
高速でリニアだから
dequeは連続性が保証されないじゃん
配列を受け取るポインタ引数に渡せない
446 :
デフォルトの名無しさん:2013/01/13(日) 09:45:31.21
>>440 最近のGCCは__float128で4倍精度使える
printfとかがまだ対応していないけど
C++の本読んでたらイベントマネージャとリスナーを作れってあって
さらにインターネットで調べたらどうもJavaの概念らしいんですが
これって結局、各クラスが相互にアクセスできるような手段を
グローバル空間に用意することと同じようなものなんですよね?
publicイコールグローバルならそういうことだろう
先頭への挿入・削除を行わない場合はvectorの方が効率がいい。
C++の継承に関する質問です
class cBase {
public:
virtual ~cBase(){};
int func1(int num1, int num2) {
return num1+num2;
}
};
class cSub : public cBase {
public:
int func1(int num1, int num2) {
return cBase::func1(num1,num2)+num1;
}
};
以上のようなテストクラスを作ったのですがclass cSubのfunc1で使用している
cBase::func1という呼び出しは正しい記述なのでしょうか?
コンパイルや結果は正しく動いているようですが、好ましくないといった感じなのでしょうか
宜しくお願い致します
正しいよ
あまり見ない記述方法だったので不安だったのですが正しいのですね
ありがとうございました
あまりlong doubleは多用するなってことなんかな?
二次配列上?でとある数値計算を行なっているんだけど、一部の列がnanになってしまう
>>455 > 一部の列がnanになってしまう
普通にバグでしょ。
ちゃんと見直しなよ。
>>456 よく見ると言うほどには使わないと思う。
日常的に書いてるというなら、むしろ設計を疑ったほうが良いかも。
>>457 まあ確かにあまり使わないけどw
入門書に普通に書いてあるレベルには見るという事
「オーバーライドするときは最初に親の呼び出す」ってルールは危ういんだよな
それするくらいなら継承じゃなくて包含にして呼び出し順序を固定しろって話だったよな
親の処理をある程度知ってないとダメだからな
少なくとも、子の処理の前に実行すべきか、後に実行すべきか、
それとも途中で実行すべきかくらいは
あまりやりたくはない
というかオーバーライド自体に
継承関係の上から下までよく知ってるor良くルールを決めてある
のどちらかが必要になるという欠点があるのであって
べつに親の仮装関数を呼び出すことに限った話ではない
この例はオーバーライドじゃない
463 :
デフォルトの名無しさん:2013/01/14(月) 20:44:30.85
オーバードライブだよ
映画版オズの魔法使いの曲?
//hoge.h
template<typename T>class Hoge
{
public:
static T m_hoge;
Hoge(T hoge){m_hoge = hoge;}
};
template class Hoge<Fuga>;
template<> Fuga Hoge<Fuga>::m_hoge = (Fuga)0;
このようなテンプレートクラスの具体化を含むヘッダを複数のcppでインクルードして
ビルドしたところ、duplicate symbolで弾かれてしまいました
gcc4.2
各cppファイルではm_hogeにアクセスする必要があるのですが
どうすべきでしょうか
hoge.hをincludeするcppのどれか一つに
template class Hoge<Fuga>;
template<> Fuga Hoge<Fuga>::m_hoge = (Fuga)0;
を書く
hoge piyo fugaで発狂するキチガイをからかうのが楽しい
からかってるだけなのにマジレスしちゃってる
>>467哀れwwwwwwww
>>467-468 荒らしにレスするのやめてくれない?
荒らしにレスしてる時点でお前らも立派な荒らしだよ。
迷惑でしかないんだけど、親には他人に迷惑かけなさいって教育受けたのかね?
472 :
デフォルトの名無しさん:2013/01/15(火) 04:56:48.20
>>466←はい、いつもの「Hogeを覚える暇はあっても必要なことは調べられないゴミクズ」入りました〜
こいつ本当に頭おかしいんじゃね
どうせ自覚ないだろ、基地害の典型
foo, bar, baz, qux, quux, foobar
>>466 template<typename T,typename D=void>class Hoge{〜};
template<typename D>Hoge<Fuga,D>::m_hoge=(Fuga)0;
>>467 ありがとうございます。
cppファイルに記述してしまうとほかのcppファイルからアクセス出来ないと思ったのですが
できているようです。不思議
>>474 {~}は全部書くということでしょうか?Dで更にテンプレートっぽく見せるのが味噌なのでしょうか
Hoge is cool.
HogewwwwwwwwHogewwwwwwwww
ほらHoge厨かかってこいよwwwwへいへいwwwwHogewwww
No Hoge. No Life.
質問者が Hoge とか使うな。
Hoge ってのは目上の人間が、教える時に使う言葉だ。
将棋で玉を目上の対戦者に譲るのと同じ。
自分で使うなど、失礼な態度を見せておいて教えを乞うなどあってはならない。
質問者は頭を悩ませて例にあった名前を考えろ。それが礼儀だ。
480 :
デフォルトの名無しさん:2013/01/15(火) 12:47:59.16
答えられない質問が来ると必ずhogeって書くなって言う奴が出てくるよね
>>475 お前が友達だと勘違いしてる動機に何て思われてるか知ってる?
氏ねばいいのにって思われてるよ
それを言わないのはゴミに氏ねって言っただけで自殺教唆で逮捕されるのが嫌だからだよ
482 :
デフォルトの名無しさん:2013/01/15(火) 14:41:12.95
>475=歩く恥さらし
hoge厨が来る度に荒れるのにはうんざりだ。
>>475も結局底辺の基地害だったな
今回もHoge厨にまともな奴はいないという説を強化する結果と相成りました
それわほげほげだな
>>466 お前みたいな池沼にプログラミングは無理
何でfooじゃなくてhogeなの?
無意識なんだろうけど、無意識で手間を4/3にするとかありえないよ
そういう無意識はコーディングにも現れるよ
そういう池沼は9000行で済むはずコードが12000行になっても平気なんだよ
知識や経験が足りないタイプの馬鹿は努力でどうにかなるけど、
お前みたいに感覚から腐ってるタイプの馬鹿は救いようがない
>>485 hoge?hogehogeho?
hogehhohogehhohogehogehoge?
>>475 いい加減ウザがられてるのに気付け。
お前リアルでもウザがられてるだろ。
491 :
デフォルトの名無しさん:2013/01/15(火) 19:34:35.78
ホゲホゲマシーン もーれーすー!
493 :
デフォルトの名無しさん:2013/01/15(火) 20:48:54.99
ほげぇ
ほげぇ
頭悪そう
Romancing HoGe
ホーゲと発音するのね
497 :
デフォルトの名無しさん:2013/01/16(水) 03:32:13.76
>>475 何の疑問も持たずにHOGEとか使えるってのそれ精神異常だから。
きゃりぃほげほげ
hogeはハゲにhageを見られると困るからごまかしたもの
500 :
デフォルトの名無しさん:2013/01/16(水) 09:52:51.23
ああなるほどそういうことか
何でそんなにファビヨってるのかと思ってた
"デベロップ"とか"デバッグ"とかも省略語作るとき注意した方がいい
struct Hoge { bool isCool() const { return true; } };
今socket入門して勉強してるんですが
httpとかpop3みたいな通信はもしかしてsocket.hには無いんですか?
どうすれば出来るようになるんでしょうか?
>>503 ソケット使って自分で作るか、適当なライブラリ拾ってくる
TCPソケットを開いたら自分でHTTPをしゃべるだけ。
SSLみたいな暗号化も自分で書くんですか?
めちゃくちゃ大変じゃないですか
今FILE入門して勉強してるんですが
エクセルとかビットマップみたいなファイルの読み書きはもしかしてstdio.hには無いんですか?
どうすれば出来るようになるんでしょうか?
>>506 そのとおり
どのプログラムにもめちゃくちゃ大変な同じ処理を書くのが面倒なので
誰かがライブラリを作ってそれを利用する
>>507 ファイル構造を調べて、それに沿って読み書き
あるいは、ライブラリを探すか変換ツールを探す
応用レベルのライブラリは標準化などしないというのがC以来のポリシーだから
>>510 C以来もへったくれも、>507はCのことだろ。
> ファイルの読み書き
は、標準ライブラリにあるでしょ
内部のフォーマットは言語に依存してないような
>>511 そうだねスマン
そのポリシーはC++でも受け継がれてるからJavaとかC#からC++に入って来た奴が
戸惑うパターンをよく見掛けるもので
関数一発で解決したいガキはHSPでもやってろよ
HSPはそういう低能のための開発ツールなんだから
Javaのクラスライブラリはそのへんすごく割り切っていて、
HttpURLConnectionでできないことをやる場合はソケット作って
自分でプロトコル処理を書かないといけない。
未だに高レベルは外部ライブラリーとか時代遅れだな
外部ライブラリーのお世話になってるのも知らんのがいるな
boostでいいやん標準ライブラリ
スクリプト全否定のゴミは置いとくとして
>>507 API……いやそれだとstdio.hじゃないな
ファイルフォーマットをググるとかして理解してから自作するor他ライブラリ利用でおk
>>512 ただのバイナリって話だからな……
バイト単位でデータを作れる必要はあるが、それだけだしな
520 :
デフォルトの名無しさん:2013/01/18(金) 14:57:10.50
521 :
520:2013/01/18(金) 16:00:05.11
追記です。
上記のURLには別のプロセスから呼べば別インスタンスに出来るとかいてあるのですが、
わざわざ別プロセスにしないでなんとかする方法がないものかと思っています。
loadLibrary以外の関数で別インスタンスでのdll読み込みができるものとかはないでしょうか
そもそもdllを複数読み込んで何がしたいんだ?
お手軽スレッドセーフが出来るとでも思ってるんじゃないの?
rundll32を複数起動させてプロセス間通信とかできないことはないだろうけど
絶対やりたいこととずれてる気がするわ
LoadLibrary を LoadLibrary に頼らず自力でやってる記事をどっかで見た覚えがあるが
それをやればいいんじゃね
同じ関数名が存在できるの?
当たり前だ
DLLをコピーして別々に読み込めばできる、ってリンク先にも書いてあるか。
でも、何をしたいのか教えてくれれば、もっと穏当な解決方法を提示できると思う。
529 :
520:2013/01/18(金) 19:24:40.65
レス有難うございます
>でも、何をしたいのか教えてくれれば、もっと穏当な解決方法を提示できると思う。
やりたいことは、
とあるGUIプログラムを複数立ちあげたいというものです。
dllを呼び出すホストアプリケーション側でloadLibrary(gui.dll)
をしたあとに、gui.dllのmainEntry()関数を呼ぶと、
自動的にGUI.dllのウィンドウがが立ち上がります。
これを複数回繰り返した時、繰り返した数分のウィンドウが立ち上がる動作を期待しているわけですが、
loadLibaryを使うと同じウィンドウが毎回アクティブになるだけという問題です。(複数ウィンドウにならない)
解決方法教えていただけると嬉しいです。
gui.dll側を修正できないんなら複数プロセス立ち上げるしかないだろ
某所でネトゲ複アカ立ち上げチートの質問してた人っぽいな
ホストアプリケーションが複数立ち上がらないとどうにもならんだろ。
533 :
デフォルトの名無しさん:2013/01/20(日) 15:03:50.55
Linuxというか、MacOSXの10.8.2で、Xcodeを使ってC言語でプログラミングしています。
シリアルポートと通信をするプログラムを作っているのですが、
最初から躓いています。。。
http://ideone.com/HGOYeo シリアルポートを開くopen関数が帰ってこないのです。
出力は program startだけ表示されて、それ以降は表示されません。
terminalで
ls /dev/tty.*
で確認してみると、確かにシリアルポートでtty.usbmodemfa1311は存在しています。
何か原因は考えられますでしょうか?
534 :
デフォルトの名無しさん:2013/01/20(日) 16:28:34.08
ちなみにUSBに接続しているのはArduino UNOです。
Arduino IDEのプログラムは終了させた状態で接続しています。
535 :
デフォルトの名無しさん:2013/01/20(日) 16:44:50.68
すみません、今色々いじっててわかった情報ですが、
ずっとopenのところでプログラムが止まっているのですが、
ArduinoのUSBを引っこ抜いたらopenから返って来ました。
ただ、もちろんopenの関数はエラーで返って来てます。。。
>>533 >シリアルポートを開くopen関数が帰ってこないのです。
>出力は program startだけ表示されて、それ以降は表示されません。
まさかと思うが、実はopen()からは帰ってきていて
printf()の出力がバッファリングされていて見えていないだけ、なんてことはないよな。
>>533 使い方が正しいのなら、O_NONBLOCK フラグを付けて使うデバイスかもしれない
539 :
デフォルトの名無しさん:2013/01/21(月) 20:30:58.39
C++で引数でwchar_tってところに'a'とL'a'が両方入るのですが同じなんでしょうか?
違うよ
541 :
デフォルトの名無しさん:2013/01/21(月) 22:43:34.99
printf()がprintf(笑)に見える
コパイルエラーになりそうですね
>>539 たいていの処理系では 'a' と L'a' の値は同じだろうから事実上同じだけど、厳密に言えば異なる。
'a' は char型、L'a' は wchar_t型 で、char から wchar_t へは自動的に整数の昇格が行われるので
引数として渡せる。
>>539 どういうこと?
>>543 そういう事なら違うよ
キャストだけでなく内部リテラルの扱いも考えなくちゃならんよ
exec-charsetのオプション一つで乙っちゃう
>>544 void f(wchar_t c);
こういう関数を
f('a');
と呼び出してもエラーにならないってことだろう。
546 :
デフォルトの名無しさん:2013/01/22(火) 02:03:47.55
それはオーパロードだろ
なんか気が抜けそうな名前ですね
char* と wchar_t* ならともかく、char と wchar_t のオーバーロードなんて恐ろしいもの作るなw
>>546 オーバーロードじゃないじゃん
>>548 別にいいじゃん
むしろ
>>545みたいな事にならないよう、オーバーロードしてあった方が安全に見える
めくるめく文字コード障害マラソン走の世界へようこそ
cpp固有の話か迷ったんだけど聞いて良いかな
グローバル変数を使うと、ローカル変数とグローバル変数のキャッシュ載せ替えが頻発して、プログラムが遅くなる
↑これは正解?
グローバルだろうがローカルだろうがたくさん変数使えば乗せ換えが発生するがな
アドレスが離れてるからキャッシュミスは起こりやすいはず
キャッシュミスよりアルゴリズムの善し悪しによる性能差のほうが
ぜんぜん大きいから安心しろ。
cpp固有ってどこが
キャッシュミス率が増えるとは聞くけど
全ては実測だろ?
理論は実験を裏付ける為の道具であって
主役は実験である
理論と現実が異なるならば現実を優先させるべきだ
cf. アキレスと亀
キャッシュミスが増えたから何だと言うのか
キャッシュ効率の悪いコードは、場合によってはキャッシュ効率の良い同等のコードなら数分の処理が、何時間かけても終わらないなんてこともある
キャッシュ効率なんて一般論における実装では誤差にもならんぞ。
効率の悪いコードはキャッシュ効率などではなくアルゴリズムまたは
実装方法そのものの効率が悪いだけだ。
>>562 そう思うんならそうなんだろう
お前の中ではな
実行コードの読み込みが早くなるだけでしょ
逝ってる系はどんだけキャシュメモリ積んでると思ってるんだろう
CPUにおけるキャッシュの話なら、量を積んでも一定のラインから
極端に効果が低くなることが統計的にわかってきている。
だからプロセスルールが進んでキャッシュを大量に搭載可能でも
巨大なキャッシュにしないのは、コストに比べて効果が低いから。
>>565 コードキャッシュとデータキャッシュがある。最近のCPUではL1が
コードとデータ独立、L2以降が混在になっている。
キャッシュ効率なんかどうでもいいみたいな意識低いレスしてるやつらはなんのためにC系使ってんだろうな
そんな効率無視の粗悪品しかかけないならままごとみたいなスクリプトでもいじってればいいのに
キャッシュに頼らないと速度出せないの?
キャッシュさえ積めば高速になるという迷信を信じている時点で
技術もへったくれもないんだろ。
570 :
デフォルトの名無しさん:2013/01/23(水) 03:55:03.93
char a[1024];
これって1024バイトの物理的に連続したメモリ領域が確保されるって認識でOK?
char a[1024*1024];
メモリが1024*1024バイト以上空いてるのにこれが失敗するのは
連続した領域として確保できなかったからって認識でOK?
それでも確保したかったら
char *a;
a = malloc( 1024*1024 );
でOK?
はい
>>570 配列の宣言が失敗するっていうのはどういう状態を想定してるか
知らないけど、普通は無いよ。
アーキテクチャ上の制限で確保できない配列なら、ポインタとして
確保しようとしてもアクセスは保証されない可能性がある。
vectorを使おう(提案)
>>572 スタックサイズの制限に引っかかてるだけでしょ。
>>570 ローカル変数はスタックという領域に確保される。
スタックというのは、(簡単に言うと)プログラムの開始時に確保される領域で、
変数を宣言してもメモリ確保のコストがかからない代わりに容量の制限がある。
VC++だとデフォルトのスタックサイズが1MBだから、スタックから1MB確保することはできない。
malloc() はヒープという領域からメモリを確保する。
メモリ確保のコストがかかる代わりに、容量の制限が緩い。
基本的には(WindowsやLinux環境なら)連続したアドレス空間が空いていれば確保が可能。
1MBの連続したアドレス空間が空いてないということはまずないので、ほとんどの場合は成功する。
でもせっかくC++なんだから、malloc()なんか使わないで、解放し忘れる心配のない方法を使おう。
std::vector<char> a(1024);
std::unique_ptr<char> a(new char[1024 * 1024]);
>>561 行列演算はそういう傾向あるかもしれないけど
今回の話とはあまり関係がないような
昔は(Pen2の頃だが)、設定でCPUのキャッシュを無効にできたものだけど、
最近は可能なのかな?
実行時間が10倍くらいになったりして、キャッシュの効果が如実にわかったものだけど。
アドレスが離れているのとキャッシュヒット率は関係ないだろ。
最近、UNIX系ばかりでVC++から離れていた。
作りたいものがあって久々にVC++2005・・・警告やエラーメッセージが難解すぎる(汗)。
最近のVC++も同じく難解ですか?
>>579 「難解な警告やエラーメッセージ」例の一つも出さずに質問とは・・・
>>571-575 あざっす
長年のもやもやがスッキリした
最初にドカッと宣言するとその関数に入った時点で強制終了するけどmallocなら強制終了しない
一応これで動いてるけど、大丈夫なのか?mallocにしたのがよかったのか?それとも偶然か?
といった感じで開発続けてた
vectorが便利だという噂はきいてたのでこれを機に試してみます
583 :
デフォルトの名無しさん:2013/01/23(水) 14:23:57.55
巡回セールスマンに似たNP問題を再帰関数と配列使ってやろうとしたら
行くべき地点が増えるにつれて計算時間が爆上がりしてお手上げ状態です
以前行った場所を記憶しときつつ繰り返し処理になるので配列と再帰を使ったが
もっと効率的な計算方法はないでしょうか?
>>575 new[]に対してはstd::unique_ptr<T[]>にしないとだめだぞ
>>583 NP問題に効率的な計算方法とか求めんなよ
近似解法ならともかく
>>581 論理メモリ上のアドレスが近くても、物理メモリ上がどう配置されるかはわからないだろ。
ページ単位内なら近い事は保証されるけど
それ以外は保証されない(近いかもしれないし遠いかもしれない)のだから
確率的には近い方がいいだろ
fortranでもつかえ
COMMON変数で結局同じ話が出てくるだけだろ
近いって、32バイトとか64バイト以内しか無意味
591 :
デフォルトの名無しさん:2013/01/23(水) 20:59:54.54
int baka[1];
int i;
for(i=0;1;i++){
baka[i]=1;
}
BAKA
実体参照使えなくなったのも知らないBAKAがいる
そもそもページが違えばキャッシュラインも変わる
594 :
デフォルトの名無しさん:2013/01/23(水) 21:41:11.02
二分探索木を実装しているんですが、
下みたいなコードを書いたらコンパイルエラーが出ました。
struct tree {
struct node {
int key, value;
node *left, *right;
} *root;
int find(int key, node *n = root) { /* ... */ }
}
error: invalid use of nonstatic-data member 'tree::root'
今はこれを回避するために
int find(int key, node *n = root) { /* ... */ }
int find(int key) { return find(key, root); }
と、補助関数を作って対応しているのですが、
1つで済ます方法はないでしょうか。
よろしくお願いします。
メンバ変数はデフォルト引数には使えない仕様だな
そもそも普通はnodeは外に公開しないので
自然と補助関数を作る実装になると思う
正確には静的でないメンバ変数は、だ
分かってるとは思うけど
FILEでopenしてfcloseした後にdelete出来ないんですか?
読み込み専用ファイルなら削除できないだろうから
条件次第というところ
599 :
デフォルトの名無しさん:2013/01/23(水) 23:35:06.46
>>595-596 ありがとうございます。
ずらずらと find, insert, remove, ... と root から再起する関数の
補助関数が並ぶのが美しくなかったので聞いてみたのですが
確かに公開範囲を考えればそうするものですね。
再帰関数はわりと補助関数作る事が多い
再帰用の引数はあまり公開したくないしね
inline関数にしておけば速度的にも気にすることは無いし
再帰関数はインライン展開できないだろ
入り口をinlineにするって事だよ
>>597 fclose(); した後に、
#include <stdio.h>
の
int remove(const char *pathname);
で消せないの?
>>597の書き直しします
FILE *p_file = new FILE();
fopen(省略);
fclose(省略);
delete p_file;
ってやったらいけないんですか?
deleteのところでエラーになります。
>>604 newもdeleteもするな
そんな糞コード捨てろ
なんでFILEをnewしてんだバカじゃねーの
上級者になると使えるテクだよ
FILE *fp;
fp=fopen("hoge.txt","r");
/*なんかの処理*/
fclose(fp);
>FILE *p_file = new FILE();
この時点でコンパイルエラーになるはず。
#include<stdio.h>
int main() { FILE *fp = new FILE(); delete fp; return 0; }
これを
g++ -Wall
で何も警告もなくビルド出来たし、実行しても何も問題なかったよ。
そりゃそうだろ
614 :
611:2013/01/24(木) 02:05:39.56
なるほど、書き方としては、エラーにならんけど
使い方が...
まともに相手するなよ。
CかC++をちゃんと勉強したなら
>>604みたいなの書くわけないし、
勉強している途中だったら
>>604みたいなコードにお目にかかることもないだろ?
あるとしたら、ちゃんと勉強しなかった者同士で作っているプログラムにそういうコードがあったか、
釣りだ。
>>604 こんなのエスパーできるかっ!!
fopenのヘルプを見ろ!
>>611 VCだとFILEが不完全型だったような気がする
不確かな記憶だが
fopen/fcloseがalloc/free相当で
fstream::open|constructor/fstream::close|destructorがnew/delete相当
CとC++で資源操作取得の混在はほぼ許されるけど混用は許されないんだよ
>>621 エスパーすると、fopen/fcloseはC/C++両方にある機能、fstreamはC++にしかない機能って言いたいんだと思うよ。
ここでそれを言う意味はわからないけど。
FILE *fopen(const char *path, const char *mode);
int fclose(FILE *fp);
CかC++標準でファイルのアクセス権を指定することは出来ないの?
読み込み専用に開いてアクセス権を独占とか
書き込み専用に開いて後続の読み込みアクセスは許可とか
規格で想定されているようなシステム環境に何かを期待すんじゃねえ
自分以外のスレッドの存在は想定されてないから排他制御の仕組みなんか標準に無い
627 :
デフォルトの名無しさん:2013/01/24(木) 17:11:49.56
暖房だけでは部屋が暖まらず今は布団をかぶって震えています。
マジで寒くて凍え死にそうです。
今から夜になればさらに気温が下がり、ほんとやばいです。
そこでC/C++が得意な皆さんに質問です。
パソコンはクアッドコアのCPUと670Wの電源を積んでいるので、
これを全力で動かして部屋を暖めたいと思います。
どんなコードなら全力で動かすことができるでしょうか。
よろしくお願いします。
while(true) ;
寒いから着る毛布ってやつ買ったよ
631 :
デフォルトの名無しさん:2013/01/24(木) 22:15:37.85
Cygwin環境で、boostというライブラリを使うファイル一式手に入れ、リンクまで行うmakefileをmakeするとライブラリが見つからないというエラーがでてきてしまいます。(表現あってる?)
指定バージョンのboostをダウンロードして、./bootstrap や./bjam 、./bjam installという手順でビルド、インストールまで成功しましたが、リンクでエラーが起こります。
ライブラリのパスの設定がうまくいってないのかな?やり方教えてください。
ちなみに見つからないのは、
-lboostprogramoption_mtみたいなのや、-lboostregex_mtです。
インストール先は、libboost〜on/ex.aで微妙に違うけど問題ない?
> CygwinのインストーラでBoostを一緒にインストールできます。
> 「Devel」カテゴリの「boost」と「boost-dev」を選択してください。
-L /your/boost/lib/path -lboost_xxxxx-mt みたいな感じで。
なお、boost のビルドの仕方によっては -mt だけじゃなくて -lboost_xxxxx-mt-gcc45 みたいにする必要があるかもしれないのでライブラリのファイル名を確認してくれ。
newでメモリ確保したら、returnする前にかならずdeletする
であってますか?
newする必要あんのかそれ
巨大バッファならありだが
ローカル変数にnewしてるなら、その変数の生存期間がその関数内だよ
deleteしないと、メモリリークする
スマポを使うのがモダンC++
>>636 newしたブロックとそれを受ける変数は直接関係ねえ。
deleteせずにreturnで返すなんてのはごく普通にやるだろ。
なるほど、そういう場合もあるね
640 :
631:2013/01/25(金) 00:31:18.65
>>632 includeで良いもの、ビルド必須があるらしく、programoptionなどは、
ビルドしないといけないとネットにあった。
インストーラから入れたものでもOKですか?試してみたいと思います。
>>633 makefileにあるg++コマンドのオプションのことでしょうか。
makefileいじる必要ないと思っていたのですが、いじることも考えなけ
ればいけないでしょうか。オプションは、-lboost_programoption-mtなどあり
実際(usr/local/include/lib?うるおぼえ)は、libboostprogramoption.a
というのありました。意味不明かもですが、心当たりあったらお願いします。
>>639 ローカル変数にnewして、他に渡さず、関数内でdeleteするのって
巨大バッファを確保する時くらいしか意味が無い
しかもそれすら普通vector使うし
newはreturnしたりメンバ変数に保持したりしてなんぼやで
c++はGUI系でちょっとやったぐらいだから
お作法みたいなのはよー知らんのよね
643 :
デフォルトの名無しさん:2013/01/25(金) 04:17:36.75
配列のアドレスの配列を作りたいのですがどうしたらいいですか
int *cp_0 , *cp_1 , *cp_2;
と宣言しているのを、一つにまとめたいのです
cp_0〜cp_2についてはmallocで必要なぶん領域を確保しますが、最初は確保するサイズも決まってません
int cp[3];
みたいな感じでまとめてしまいたいのです
また、この例ではポインタを3つ固定で宣言していますが、可変にしたいです
int cp;
みたいに宣言して、可変な配列のアドレスの配列にしたいです
例えばcp[2]が3番目の配列の先頭のアドレスを指すのが理想です
int** cp = new int[3];
ミスった
int** cp = new int*[3]; ね
646 :
643:2013/01/25(金) 04:22:59.57
>>648 >キモくなる
>マジキチな
>若干キモい
これ日本語?意味がわからない
ポインタへのポインタなど何の特殊な事もないのにみんな怖がり過ぎー
typedef int* intp_t; と置いて考えてポインタ以外の型と使い方を比べれば
きっと一体何を悩んでいたのだろうと思うこと請け合い
constが絡むと少しややこしいルールがあるし
そこんとこがCとC++で仕様が異なるが
二次元配列を動的確保する分には問題は無いな
*が3つくらいから、設計を見直したくなってくる
>>645 配列 new するぐらいなら std::vector 使えよ。
std::vectpr<int*> cp(3);
配列で確保して構造把握してメタればポインタ変数なんてnewで受け取る一個で十分。
>各行の要素数が違うマジキチなデータ構造を実現したいならこれしかない。
お前がそう思うのならそうなんだろうよ。お前の中ではな。
つーか、「各行の要素数が違う」のならその要素数を保持する配列も必要になるのだが、
それを考慮していない時点で論外。
ヘビーメタる
CとC++どっちが学習量おおいですか?
C++を勉強する場合、Cの知識は役に立ちますか?
>>653 (vectorのvectorじゃ)いかんのか?
vectorでひとまとめにバッファを確保して
vector<int*>で各行のアドレスを保持すれば
メモリの確保が2回で済んで良い
>>659 いいよ。
>>660 メモリの確保を減らさないといけない理由が特になければそんな面倒なことはしなくてよい。
vectorでひとまとめにバッファを確保して
インデックスを自分で作ればいいんだよ
行列演算だと常套手段だ
long *data;
long *index;
//3つの配列を作成
//1つ当たりの配列の長さは、12、8、16byte
data = (long*)malloc( sizeof( long ) * ( 12 + 8 + 16 ) );
index = (long*)malloc( sizeof( long ) * 3 );
&index[0] = &data[0];
&index[1] = &data[12];
&index[2] = &data[12+8];
>>663 long *data;
long **index;
data = (long *) malloc(sizeof(long) * (12 + 8 + 16));
index = (long **) malloc(sizeof(long *) * 3);
index[0] = &data[0];
index[1] = &data[12];
index[2] = &data[12 + 8];
>1つ当たりの配列の長さは、12、8、16byte
48
32
64
バイトだろ
>>664 見せられたら理解できるけど
自力でそれを書けない
一度見てしまったから全く同一の状況なら自力で書けるけど
ちょっと違う状況だと書ける気がしない
どうしたもんか
>>666 いきなりコーディングしない。
紙にメモリイメージを描いて、理解できたらコーディング。
ポインタのポインタとか全部順番にtypedefしておけ。
typedef long* pLong;
typedef pLong* ppLong;
参照とかconstとか混乱しなくてすむ。
>>666 long *data;
int *index;
data = malloc(sizeof(long) * (12 + 8 + 16));
index = malloc(sizeof(int) * 3);
index[0] = 0;
index[1] = 12;
index[2] = 12 + 8;
data[index[0] + i] = x;
data[index[1] + j] = y;
data[index[2] + k] = z;
とやってる事は大して変わらない
怖がり過ぎてるだけ
>>666 std::vector<std::vector<int> > v(3);
v[0].resize(12);
v[1].resize(8);
v[2].resize(16);
メモリとかにきつい要件が無いならこれでいい。
自身の無いやつが malloc() なんかに手を出すべきじゃない。
char a[100];
strcpy(a, 'hoge');
あらかじめ、こんな風に文字列が入っているケツに書式文字列を追加したいです。
char b;
char c[10];
sprintf(c, "%02X", b);
strcat(a, c);
こんな風が一般的だろうと思いますけど、代わりに
char b;
sprintf(&a[strlen(a)], "%02X", b);
ってやっちゃってもいいんでしょうか
>>671 やればいいんじゃない?
hogeとか使ってるようなゴミの書くコードなんだからどうでもいいだろ。
hogeとか書く一般的じゃないお前が一般的とか気にしてどうするの
ウジ虫は回線切れ
675 :
671:2013/01/26(土) 14:00:07.14
はい、ヴァカが3匹釣れたwwww
ほんとここはいい釣り堀だなwwwwww
本気で質問してると思った?wwwwwwwwwwwwwwwwwwwwwwwwwwwwww
>>671 できるけど、その前にstrcpyとstrcatとsprintfは
セキュリティホールになりかねない危険な関数なので使い方には気をつけろ
どんな条件でも文字列が格納可能なバッファサイズが残っている事はチェックしろよ
>>676は荒らしにレスしてるから同類の荒らしなんだろうな
ほげwwwwっうぉげほげwwwwwほげーwwwwwwwwほっほげーwwwwwww
HOGEHOGEwwwwwwwwwHogewwwwwwwwwwwHohhohおHOGEEえええええええええええwwwwwwww
679 :
671:2013/01/26(土) 14:21:37.08
ここIDでないのかよ
俺は
>>675 じゃないぜ
strcpy(a, 'hoge');
でコンパイルエラーでますた
strcpy(a, "hoge");
でっと
>>676 ありがと
外部から引数で可変文字列をもらうわけじゃないから
特にサイズチェック不要ですよね?
680 :
デフォルトの名無しさん:2013/01/26(土) 14:29:20.79
>>679 チェックは不要だよ
お前がそもそも世の中に不要
不要なゴミの書いたゴミコードに問題があっても誰も困らない
>>679←こいつ何?釣り宣言したりレスしたりしててキモい。二重人格か?
>>676が荒らしたいだけの馬鹿だということはよく分かった
分かったから他スレでやってくれ
荒らす理由は何か知らないけどとにかく迷惑
>>681 釣り宣言とか無視しろよ。子供じゃあるまいし
>>679 >ここIDでないのかよ
自分の不手際をシステムのせいにする典型的な知恵遅れ入りましたー
他人のせいにする腐った根性してたらそりゃプログラミングも上達しないわな
>>681,682,685,686は荒しだからスルーよろ。
荒したい人だけレスして。
hoge厨が来るたびに荒れてうんざり
689 :
デフォルトの名無しさん:2013/01/26(土) 14:57:28.13
HOGE厨はそれが目的だからな。
hoge厨、ダメ、ゼッタイ
hogeって韓国が起源なんだけどな。これはガチ。
韓国のエンジニアって自分の名前とかその略称をメタ変数に使うことが多くて、hogeもその一種。
キム・ホンギョン(うろ覚えだから間違ってるかも)とかいう韓国のエンジニアが自分の名前の略称hongeを使ったのが始まり。
当然他の人は自分の名前を使ってたわけだからhonge以外にもたくさんあった。
ではなぜhogeだけが日本に入ってきたのか?
日本のエンジニアと韓国のエンジニアの交流はほとんどなく、たまたま交流会を開催したときに韓国のエンジニアチームの中にキム・ホンギョンが混ざっていた。
そして資料の一部に載っていたコードがキム・ホンギョンのものだったから、hongeという文字が含まれていた。
日本のエンジニアは意味が分からなかったから、hongeとは何だと質問したら、メタ変数だと返答が帰ってきた。
当時は今みたいに反韓の風潮はなかったから日本のエンジニアは日本へ帰ってきて使ってみたところ、それが少しずつ広まった。
最初はhongeだったがいつしか省略されて今のような状態になった。
692 :
413:2013/01/26(土) 17:58:24.96
レスありがとうございました。
全部拝見させていただいてますが、結局よくわからない・・
自分でもう少し調べようとしているところです..
>>691がコピペネタなのかマジで言ってるのか分からん…
アスペの疑い
hogeは犯罪です
>>692 このスレの結論としては
可変長配列ではないかという推測
void Resize(Events* ev, int num)
{
Free(ev);
events[0] = new Event[num];
events[1] = events[0] + num;
numEvents = num;
}
のような形で確保して、
ev.events[0] は begin、
ev.events[1] は end を表す
例えば
std::sort(ev.events[0], ev.events[1]);
のように使える
あくまで推測だけどね
697 :
日本基地害hoge房防止協会:2013/01/26(土) 19:53:51.86
こんにちは、日本基地害hoge房防止協会、通称「hoge防」の者です。
hogeというワードの利用はあなたの育ちの悪さを疑われることになります。
例えば、相手の言っていることが気にいらない場合、
育ちの良い人は「何をおっしゃってるのか理解しかねますな」と言いますが、
育ちの悪い人は「あんだとテメーバーローちょーしこいてんじゃねーぞボケが」と言います。
hogeを使っていると間違いなく後者に見られるでしょう。
>>696で ev 使ってなかったw
void Resize(Events* ev, int num)
{
Free(ev);
ev->events[0] = new Event[num];
ev->events[1] = ev->events[0] + num;
ev->numEvents = num;
}
で、
Events ev = {};
Resize(&ev);
のように確保して
std::sort(ev.events[0], ev.events[1]);
のようにソートする
>>699 それは根拠ないだろ。
1995年ごろに、ニフティのパソコン通信でhoge, hugaみたことある。
foo、barのセンスのなさは異常
マジでどんな精神構造してたらfooとかbarみたいなアルファベットの並びが出てくるんだろうな
絶対にまともじゃない
音の響きもアホっぽいし使うと恥ずかしい
それでもhogeより100倍マシだけど
どうせ書き換えるんだから…
て言うか、書き換えないといけないんだから、あえて違和感のある名前じゃないと困るんだが…
だったらhogeじゃなくてobobo_i-x-i_ododoでいいだろ馬鹿かお前
706 :
デフォルトの名無しさん:2013/01/27(日) 00:53:55.24
またhoge厨が荒らしにきてたのか
708 :
国際hoge活動禁止機構日本支部:2013/01/27(日) 03:56:33.82
国際hoge活動禁止機構日本支部広報よりお知らせです
hogeはfooよりも文字数が33%多いため効率が悪く、これが広まることによりIT業界全体の効率が低下することが懸念されています
試算によると、IT業界の約50%の人間がhogeに汚染された場合、業界全体の合計作業時間が約1.166666倍となることが明らかになっています
IT業界全体への悪影響が避けられないばかりか、関連する他の業界への影響も深刻なものとなります
健全な社会の発展のためにhogeは使わないようにしましょう
CPUとメモリアクセスの関係と同じで、入力がやや多くなったくらいでは、思考時間の長さがあるから、結果への大きな影響はねーよ
入力してるのは人間
ブラインドタッチできる人なら、fooよりhogeの方が入力速いと思うぞ
理由は?
f は、左手人差し指のホームポジションで移動不要、o も右手薬指で
少し移動するだけの上に、二回目の o は移動不要。
対して、hoge は全て移動が必要なので、普通に考えたら、hoge の方
が入力が遅いと思うぞ。
一つの指で連続してキー押すのはタイピングのプロにとっても一番のボトルネックなんだぜ
ああ、言われればそうかも。
715 :
デフォルトの名無しさん:2013/01/27(日) 13:20:31.92
じゃぁbarでいいだろ
716 :
711:2013/01/27(日) 13:22:15.23
717 :
711:2013/01/27(日) 13:24:53.11
barは全て左手
hogeは右手と左手をバランス良く使うので入力早い
719 :
デフォルトの名無しさん:2013/01/27(日) 13:30:06.12
foo bar baka
>>718 >hogeは右手と左手をバランス良く使うので入力早い
右右左左だろ。
hgoe の方が速いかも。
>>720 いや、やってみると分かるけど、
交互より2つずつのが遥かに速い
その理論だと、bar の方が速いぞ。
って思ったが、b と r が両方人差し指だから、打ちにくいな。
geho gohe
724 :
711:2013/01/27(日) 13:57:37.72
>>720 リズムが悪くなりそう
慣れの問題かもしれないけど
hogehoge ぴー! ほげほげ
>>722 片手3つより片手2つを交互の方が打ちやすい
728 :
デフォルトの名無しさん:2013/01/27(日) 14:26:15.14
しかしhogeよりも打ちやすい並びがあるのは確か
つーか1文字が一番速いだろ
わざわざホゲとか恥ずかしいものを打ち込む必要はない
>>727 全て違う指だというのも重要
hogeの配置は優秀
>>728 短すぎると目視検索し辛い
3文字以上は必要だな
hogとかならいける
その条件を満たすならmizでいいじゃん
hogeとか恥ずかしいだけだし
ほげぇ
ほげぇ
頭悪そう
小指打ち辛い
732 :
デフォルトの名無しさん:2013/01/27(日) 14:54:44.66
打ち辛さより恥ずかしいさをとるhoge厨
人としての尊厳のかけらもないとかね
服着ると暑いとかめんどくさいとか言ってパンイチで電車に乗ってるキチガイが昔いたけどあれと同じ
プログラマは冷徹な実利主義であるべき
じゃあパンイチで電車乗ってろ
そのパンツにhogeとか書いとけばいいんじゃね
実利主義とか言ってる奴に限って人間の心理を無視した数値のみの評価基準作ったりするんだよな。
それで効率が良くなるならまだしも、士気を下げる結果になって効率を下げることが多い。
VC++ 2010 expressを使ってCのコードを書いています。
1行目のサイズは2^0 = 1、2行目のサイズは2^1 = 2、3行目のサイズは2^2=4・・・最後は11行目で、サイズは2^10というような配列を作りたい場合、
double **hoge;
hoge = (int**)malloc(sizeof(int*)*(cDEPTH+1));
hoge[0] = (int*)malloc(sizeof(int)*maxgroup*2);
for(i=1;i<=cDEPTH;i++){
hoge[i] = GP_NUM0[i-1]+pow2n(i-1);
}
というようなコードでいいのでしょうか?
どこかでメモリエラーが出ているらしく、途方にくれています・・・
>>736 C++じゃいかんのか?
C++でvector使えば捗るで
>>736 hogeとか使ってるからだろ
失せろゴミ
>>736 hoge使って違和感感じない歪んだ感覚が原因じゃないの?
普通の感覚してたら一発で書けるけど。
741 :
デフォルトの名無しさん:2013/01/27(日) 15:22:03.33
>>736 お前みたいなゴミhoge厨が途方にくれたところで誰も困らないからさっさと回線切ってね^^
742 :
736:2013/01/27(日) 15:23:09.59
すいません、変数の名前がおかしかったので書き直します。
double **hoge;
hoge = (int**)malloc(sizeof(int*)*(line+1));
hoge[0] = (int*)malloc(sizeof(int)*1024*2);
for(i=1;i<=cDEPTH;i++){
hoge[i] = hoge[i-1]+pow2n(i-1);
}
よろしくお願いします。
作りたいのは
1x1,1x2,1x4・・・1x1024のジョグ配列のようなものです。
なんだ、荒らしだったか
744 :
736:2013/01/27(日) 15:25:56.84
>>737-741 返信ありがとうございます。
またコードを間違って張っていました。実際のものは型を間違ってはいません。
double **hoge;
hoge = (double**)malloc(sizeof(double*)*(line+1));
hoge[0] = (double*)malloc(sizeof(int)*1024*2);
for(i=1;i<=cDEPTH;i++){
hoge[i] = hoge[i-1]+pow2n(i-1);
}
かなりのコードをすでにCで書いてしまっているのと、C++は知らないもので・・・
あまり時間がないので今から習得している余裕が無いです。
だからスルーしろって
回答してる奴も煽ってる奴も
荒らしの相手をしてる時点で荒らしだから
>>744 卒論か?
それなら自分でやれと言いたいが
747 :
736:2013/01/27(日) 15:28:48.02
>>746 そのとおり、卒論です。
この部分が間違っているのであれば、それだけでも教えていただけると嬉しいです。
>>736の配列が欲しいんだったら
double **hoge;
int i, alloc_size = 1, cDEPTH = 10;
hoge = (double **) malloc(sizeof(double *) * cDEPTH);
for(i = 0; i < cDEPTH; i++) {
hoge[i] = (double *) malloc(sizeof(double) * alloc_size);
alloc_size *= 2;
}
で良いんじゃないの?
一発でメモリ確保したいんだろ
場合によってはメモリの連続性が必要な場合もあるかもしれないし
750 :
748:2013/01/27(日) 15:33:38.72
>>748 間違った
cDEPTH = 11;
だ
cDEPTH = 10で通るコードにすべきだろ
2^10という上限を意味してんだから
752 :
デフォルトの名無しさん:2013/01/27(日) 15:36:59.34
>>748 投稿前にチェックできないほど知能の低いゴミはレスするな
>>747 hoge使ってるのが間違い
それにお前の存在そのものが間違い
煽ってる奴は当然ながら、回答してる奴も荒らしたいんだろうな。
755 :
736:2013/01/27(日) 15:39:29.68
すみません、int pow2n(int x)は2^xを返す関数です・・・・
我ながらひどい
>>748 ありがとうございます。ただ
>>748さんの仰っているとおり、メモリを一度に取得したいです。
人に見せてわかりやすいコードってのはこういうものなんですね、勉強になります。
他人に卒論を手伝ってもらうとかやっぱりhoge厨の思考回路はすごいな
pow2nとかビットシフトでいいじゃねえか
>>756 まだ気づかない?
煽るためだけに質問してることに。
やり方を教えるより、デバッグの仕方を教えた方がいいわこれ
変数の内容をダンプしろダンプ
>>754 ぶはあああああああああああああああああああああああああああああwwwwwバレたwwwwwwwwwwwwwwwwwwww
そうですwwwwwwwwwだって回答者のふりしてたらゴミ質問者がまた書き込むから、そうしたらアンチhogeがまた叩いて荒れるからなwwwwwwwwwwwwwwwwwww
回答者のレスがつかないと質問者は叩かれてどっかいってしまって長く続かないもんwwwwwwwwwwwwwwwwww
自分では手を下さなくてもスレが荒れるからいい手段だと思ったのにwwwwwwwwwwwwwwwwwwwwwwwwwばwwwれwwwwたwwwwwwww
そりゃそうだよなwwww荒らす目的がなかったらhoge厨に回答なんかしないもんなwwwwwwwwwwwwwwwやっぱ不自然だったかwwwwwwwwwwwwwwwwwwwwwwww
763 :
736:2013/01/27(日) 15:54:08.76
質問に不備が多すぎて申し訳ないです。
質問を取り下げます。
そりゃ丸わかりだろ。
まともな回答者はhogeをNGに入れてるし。
>>763 卒論は本気なの?
本気なんだったら
卒業できないことをお祈りしていますw
hoge嫌いの話題のさなかにhogeコード投下するってことは釣りだったのか…
周りが見えてないよね
釣り宣言もないし、ただ荒れるのを見て楽しんでる釣りより程度の低いキチガイだと思う。
fooでもhogeでも何でもいいけどくだらないことにこだわる人が
常駐してるんだねこの板。
その手の話しか出来ない人なんでしょ、スルーしなよ。
771 :
デフォルトの名無しさん:2013/01/27(日) 17:08:40.21
3文字でも4文字でもいいってことは30文字でも40文字でもいいと言ってるのと同じ。
それが大規模開発になると300万文字と400万文字になる。
スピードでいえばキーボードは左右交互に売ったほうががががががががとか言いながら無駄に長いコードを書く。
100万文字の差は無視できないのにね。
アルゴリズムや実行時の効率上の関係で長くなるならまだしも、それ関係なく100万文字長くなるとかもうね。
普段から「くだらないこと」と決めつけてる思考停止は雇わないほうが吉。
こういう根本的に腐ってる人間は文字数以外にも現れるから、
300時間も400時間も同じだと言って仕事チンタラ仕事をする。
>>771 >3文字でも4文字でもいいってことは30文字でも40文字でもいいと言ってるのと同じ。
この批判は、まあわかるが…
>それが大規模開発になると300万文字と400万文字になる。
これは、馬鹿だろ。
大規模だと、それ以外の部分も多くなるし、そもそも1人で開発するわけじゃないし。
>>771 そんなことに思考を割くこと自体が時間と労力の無駄
一番貴重なのは人的にリソースだからな
> それが大規模開発になると300万文字と400万文字になる。
こいつのプログラムは識別子並べるだけで構成されてるらしい。
変数名の長さを短くした方がいいとかいいたいのか?w
時代に逆行してんな
776 :
デフォルトの名無しさん:2013/01/27(日) 17:37:49.43
入力補完がある今の時代、識別子の長さなんてどうでもいいんだよ
そんな事より見て意味が分かる方が重要
hogeは意味が分からない
意味が分からないだけならまだしも馬鹿っぽい
>>777 bool kore_ha_nanrakano_jyoutai_no_hitei_wo_arawasu_huragu_desu;
bool kore_ha_nanrakano_jyoutai_no_koutei_wo_arawasu_huragu_desu;
そうやって似たような名前の変数補完ミスるんだよな
変数名短い方が似やすいだろw
アホか
781 :
デフォルトの名無しさん:2013/01/27(日) 18:04:44.62
意味の分からないhogeを使う頭のおかしいhoge厨
人間が判別しやすいかどうかが全てであってな、長さは関係ないと思うの
hoge使ってる奴って見事に社会の落伍者ばっかだよな。
MSVC x64で、
std::wstringstream wss;
wss << L"year: " << 2013; ←ここでエラー
なぜなんでしょうか?
MSVC Win32では正常にとおります
x64でビルドすると数字がくっつきません
hogeにトラウマありすぎて笑える
>>784 環境がないから分からんが、
ロケールに問題があるのかも?
そりゃ会う奴会う奴hoge使ってる奴が例外なく精神障害ならトラウマにもなるだろうよ
お前だって外出たら黒のパーカー着た奴が全員ゲイでしかも全員お前に襲いかかったら
黒のパーカーがトラウマになるよ
そういう背景を考慮せずに笑うのは、まともに精神が発達してるという前提なら小学生低学年までなんだけどな
>>779 そんな同じ意味の変数を複数作る奴はバカだと思う。
>>736 #define DEPTH 5
#define AMOUNT_ARRAY (1<<(DEPTH-1))
#define AMOUNT_X(a) (1<<((a)-1))
#define TOP_INDEX(a) ((1<<((a)-1))-1)
#define IS_INDEX(a,b) AMOUNT(((a)-1))+(b))
#define L_INDEX(a,b) (IS_INDEX((a)+1,(b)*2)
#define R_INDEX(a,b) (L_INDEX(a,b)+1)
クラスをポインタ使ってオブジェクト生成できるようになったんだけど俺もしかして才能あるのかな
オブジェクト生成ってなんだ?
new hoge とか new fuga とか new hage のことじゃない?
できないなら卒業できるレベルじゃないってことだから
留年するか中退
hogeよりhageのほうがマシだな
そもそも、おれは学校がきらいだ
797 :
デフォルトの名無しさん:2013/01/28(月) 15:57:28.13
g++で科学計算向けの最強の最適化オプションを教えてくれ
-O2
-march=native
object->func() {
/*省略*/
}
って感じでセミコロン無しでメンバ関数呼び出した後にブロック書いてるコードがあったんだけどこれってどうやるの?
カプセル化について質問です
class Example
{
private:
int val;
public:
Example(int _val) : val(_val) {}
bool Compare(const Example& target) const { return (this->val == target.val); }
};
Compare内でtargetのプライベートメンバを直接参照してもコンパイルエラーに
ならないのですが、自身と同じクラス(もしくはアップキャストできるクラス)の
インスタンスであれば関数内でプライベートメンバにアクセスできるということでしょうか?
>>801 自分自身はできる
親(基底)クラスはダメ
後者を許すために protected がある
学習した手の初心者ですがよろしくお願いします。
理解があやふやな部分の確認をお願いしたいです。
Person & operator=(const Person & psn); について、
Person & operator= の&はアドレスを指す&のことで、
つまり返値は&Person(Personの先頭アドレス)であると解釈して良いでしょうか?
実際の定義を見ると返値がreturn *this; になっているのですが。
つまりポインタthisの実際に指すデータはオブジェクトPersonの先頭アドレスということですか?
this自体がポインタなのに、*thisもアドレスを指すというのがしっくり来ないのですが。
>>803 >Person & operator= の&は
参照です。
>ポインタthisの実際に指すデータはオブジェクトPersonの先頭アドレス
ですが、
>*thisもアドレスを指す
わけではありません。
宣言で int *p と書いたとき、p はアドレスではあっても、*p はアドレスではなく、p が指し示すなにかのオブジェクトそのものでしょう、それと同じです。
>>804 ああ。なるほど。アドレスを見る&ではなくて、参照の&でしたか。
つまりここで参照を使っているのは、thisが大きなデータかもしれないので、
コピーした値を返すより効率よいという理由なのですね?
>>805 これは個人的な見解ですが、参照は表記の上でインスタンスを渡すように記述しながら実はアドレス渡しをているだけ――糖衣構文――と考えています。
こちらでは、きっちりポインタで(あたかもアセンブラレベルで)記述するのと、参照を使ってわかりやすい(かどうかは議論のところかもしれませんが)記述をとることを比較しています。
(私はかいてみないとわからない人ですから‥‥orz)
http://toro.2ch.net/test/read.cgi/tech/1313183984/605 もっとも & は const と一緒に使ってコンストラクタ発動を防止する、とかが普通の使い方のようですけど。
いいえ参照です
thisさんは参照が産まれるよりも前に決められてしまいました
809 :
デフォルトの名無しさん:2013/01/29(火) 11:19:45.16
QZさんもだいぶ頑張ってるようだけど、あと一歩のところから
全然先に進めてないね。
いったん自分の知識を体系立てて学びなおした方がよさそう。
老害だからもう新しい事は頭に入らないんじゃね
個人的な見解とかいらないしねえ
参照の実装方法なんて規格で決まってないんだから処理系依存ですわ。
ああ不思議じゃないのか、GetやSetがなくてもコピーはできるようになってるんだ
テンプレート関数やクラスに接頭語付けてる人いる?
つけない
接頭語付けるよりネームスペースだは
テンプレート引数くらいにはつける
>>809 ご指摘感謝いたします。たしかに自身でもうすうす感じるところです。
言語仕様を今一度押さえるべきでしょうか?
言語処理系自体にも興味があるのでセオリーを成書で学ぶべきでしょうか?
それとも応用分野を決めて追求していくべきなのでしょうか?
>>819 applicationの本来の意味は何でしょうか?
炎上学習法もそろそろ終わりですね
823 :
デフォルトの名無しさん:2013/01/30(水) 14:10:55.47
cgvgってどうやって使うんだ? まったく資料が無いぞ
namespace hoge
825 :
デフォルトの名無しさん:2013/01/31(木) 16:33:31.08
hoge?
826 :
デフォルトの名無しさん:2013/01/31(木) 16:40:16.95
huga
大量に呼び出される関数内で、
if(cond1) /*何かする*/
if(cond2) /*何かする*/
if(cond3) /*何かする*/
というのコードを挿入する場合、cond1とcond2とcond3が全部ランダムに変化する場合は遅くなるが、
main関数で一度設定された後変わらない場合は、分岐予測が全部ヒットして速度が変わらないという認識で問題ないでしょうか?
(ただし、if文の/*何かする*/はa = bなどのほとんど計算時間のかからない処理だとします。)
CPUはSandyBridge世代以降のIntel CPUだとしてください
コンパイルさんが静的に解決してくれるんじゃね?
>>829 すみません言葉足らずでしたが、cond1〜3はmain関数内で(正確に言うと上記関数を呼び出す前の段階で)
外部の設定ファイルを読み込んで動的に決定されるものとしてください
だったらイーブンだろ
小さな効率のことは忘れ、時間の97%について語ろう。時期尚早な最適化は諸悪の根源だ
つまり、分岐予測は効かないということでしょうか?
分岐予測なんて宝くじみたいなもんだろ
せいぜいあたればいいなって思っとくぐらいで
そんなことより手を動かすべきだろう
なぜそのように言えるのですか?分岐予測にの具体的な挙動を理解している人の話を聞きたいのですが・・・
分岐予測がないと困るようなもんでも作ってるの?
/*何かする*/
の組み合わせを全パターン用意して
関数ポインタで呼び出したら、ifの判定いらなくなるよ
>分岐予測にの具体的な挙動を理解している人
こんな人が2chに居るわけがないだろ…
あんたに分岐予測という機能を教えた人に聞けばいいんじゃないか?
cpp初心者なんですが、namespaceというのがよくわかりません。
教えて下さい。
ここで聞くよりCPP namespaceでぐぐって出てきたページを見たほうが
詳しくてわかりやすく書かれてますよ
それでもわからない点がでてきたときに改めてここに書き込めばいいでしょう
namespaceは単にClassの名字のようなものです
>>837 関数なんかの苗字ですよ
Hoge家のfuga関数って感じ
分岐予測すら理解しないでifを使うって低脳ゆとり杉
俺もだが2chは低脳ゆとりだらけだからな
C++プログラマ的にはifなんぞ使わずに静的に解決すべき
>>840 ありがとうございます。
なんでcppでは「苗字」が必要になったんですか?
cにはないですよね?
なるべくプリプロセッサを使わないようにしたかったからだよ
分岐予測テーブルには限りがあるんだから
当たればイイナくらいに思っておいた方がいい
>>843 実はCの時代にも、名称被りを防ぐために
会社名_プロジェクト名_機能別カテゴリ_プログラマ苗字_関数名( )
みたいな命名をすることがあったらしい。(もちろんこれは極端な例だが)
まあ名前空間が被ったらどうにもならないんだけどな
自分で作ってるプログラムなら変更出来るが
std::mapとかのコンテナのテンプレートパラメータに不完全型を指定してもよいのでしょうか?
やりたいのは
struct C {
std::map<int, C> val;
};
みたいなことです。
GCCだとコンパイルは通るのですが、規格を読むと明示的にOKとは書いてないようで、
規格のクラス定義の内容にも「実装依存」の箇所があり自分では判断できませんでした。
大人しくポインタにすれば?
>>848 テンプレートのインスタンス化が起こる地点で完全型になっていればOK。
無理に決まってんだろ
Standard 17.4.3.6:
In certain cases (replacement functions, handler functions, operations on types
used to instantiate standard library template components), the C++ Standard
Library depends on components supplied by a C++ program.
If these components do not meet their requirements, the Standard places no requirements
on the implementation.
In particular, the effects are undefined in the following cases:
(...)
--- if an incomplete type (3.9) is used as a template argument when instantiating
a template component.
問題のある実装は特に無いとは思うが、
コンパイルエラーになっても文句は言えんだろうね
>>849-853 回答ありがとう。
大体動くような気がするけど、規格でダメだと決まってて、
ポインタでも使ってどうにかしろと。
856 :
848:2013/01/31(木) 20:56:12.25
>>855 あれ? C::valの宣言のところでstd::map<int, C>型のインスタンス化
が起きて、その時点でCは不完全型だからダメって話じゃないの?
Cをインスタンス化しないから大丈夫
なのが普通の実装
だけど規格は保証してくれない
858 :
848:2013/01/31(木) 22:15:10.84
くどくてごめんね。自分の理解が間違ってるかもしれないので。
>>857 テンプレートクラスのインスタンス化はそのインスタンスを
使用した(848ではC::valの宣言)時点で起きるのであって、struct Cの
インスタンスを定義した時点ではないと思ってたけど、そういう
コンパイラもあり(というか普通はそう)ってことですか?
GCCが実際通ったり
>>853で言われた「問題のある実装は特にない」
のはstd::mapがstruct Cのポインタまたは参照しか使用しないから
だと思ってた。
>>857 Cはテンプレートじゃなくて普通のクラスなわけで「Cをインスタンス化」の意味がわからない。
std::map<int, C> のメンバ変数に C c; のようなものがなければ
問題が起きないよという事
861 :
848:2013/01/31(木) 23:38:58.06
int = 1
とint 100ってメモリ使用量同じなんですか?
int 100はコンパイルエラーになりますという冗談はさておき
どっちも同じです
配列の長さ指定して宣言するときによく長さを2の乗数にしてるのよく見るけどこれだといいことあるの?
unsigned short a = 65530;
a += 100;
これやったら、a は
65530+100-65536=94
になるんでしょうか
あるクラスを継承した派生クラスで、継承元のメンバ変数に別名を付けることはできますか?
クラス内で参照を宣言しようとしたところ「静的メンバじゃないと初期化できないよ」って
コンパイラに怒られました
ポインタ使えば良いんじゃない?
>>868 振る舞いは同じ方が嬉しいですね・・・
一応、コンストラクタの初期化子で指定するとエイリアスとして機能するみたいですが
コンストラクタだと誰かがまたこれを継承した場合、確実にエイリアスとして動作するか保証しにくいような・・・
これはconstメンバーと同じで仕方ないのでしょうか
>>865 なにもない。ただ、2の乗数だとキリがいいような気がする。
>>865 プログラマの習性ってだけ
100,1000よりも256,1024の方が切りの良い数字に見えるのがプログラマ
1000とか凄い切りが悪いよねー
あとたった24で切りが良くなるのにって思ってしまう
ヒープ上だとエントリ情報があるから
チョット小さい確保は逆に美しく見える
ポインタをconst参照で受け取る意味ってあるんですか?
constポインタでなくconst参照ってこと?
->より.の方が打鍵数が少ないとか
const参照にする前にNULLチェックしておけば
以降NULLでない事がコード上見て取れるとか
constなのは変更しないのならその方が安全だからだな
->って打ちにくい
func(const Kurasu* &hikisuu)
こんな感じです
それはconst参照ではないぞ
constポインタへの非const参照だ
const Kurasu* p;
func(p);
として、func 内で p に値を入れてもらう使い方が普通かな
ポインタからヒープのサイズを取得したいと思っています
void* operator new[](size_t a)
{
void* ptr = ::malloc(s);
map[ptr] = a;
return ptr;
}
void operator delete[](void* p)
{
heapsize = map[p]; (GetHeapsize(void* p)などに使える)
::free(p);
}
例えばnew[]してdelete[]するだけのプログラムで,ptr != pとなってしまっています(Windows/VS2012使用)
別のmallocを使う(…と上手くいく)以外にいい方法は無いでしょうか
症例を勘違いしてました.別のmallocを使っても上手くいきません
ptr == p ですが,deleteのp != GetHeapSize(p)のpとなっているのが問題です
これ、何やってるの?
new[] と delete[] はあまりオーバーロードしない方がいい
引数に渡ってくるサイズが未規定で、環境に応じて挙動も変わりうる
GCCで実験した場合は、new[] に渡されるサイズは次のようになる
・デストラクタを持たない型の場合
→ 型のサイズ×要素数
・デストラクタを持つ型の場合
→ 型のサイズ×要素数+要素数を保持する領域のサイズ(8)
オーバーロードした new[] から返したアドレスに
要素数を保持する領域のサイズを足した値が実際の new[] から返されて、
要素数は自動的に入れられるようだ
この要素数は delete[] 時にデストラクタを呼ぶループの周回数を決めるのに使われる
で、delete[] 時は ptr == p になってくれるので
そのまま free してしまえばいい
VC++ではこれが ptr != p になってくれないということだが、
もしかしたらVC++では要素数分のオフセットの扱いがGCCとは異なるのかもしれない
ptr と p をダンプして、4 か 8 くらいずれてたらビンゴだと思う
あと、配列 new/delete では問題はないだろうけど、
通常の new/delete でこれやろうとすると
map がメモリ確保を行った時に無限ループに陥ると思われる
new/delete を使わない allocator を map に指定してやるといい
って、ptr == p なのね
なら多分GCCとVC++は同じ挙動だと思う
(余分に確保する領域のサイズは異なるかもしれないけど)
GetHeapSize の p にならないのは
要素数を保持する領域のサイズ分ずれてるからだな
でも、ズレるかズレないかは型次第なので
new[]/delete[] の内部からは分からない
stdlib.hにある int system(const char*) ですが、これの実行は同期・非同期どちらなんでしょうか?
gcc,g+ですが、言い換えれば
func1();
err=system("ps");
func2();
のコードの時、func2()のコールはかならずsystem()の後であることが言語ライブラリ仕様で保障されているかどうかということです。
それから、system("sh -c ps")とシェル経由の時では、呼び出し元は同期するためにsystemコール・コマンドが完了復帰するまで待つのでしょうか。
バックグラウンド実行すれば非同期だな
まあ&つけなきゃ同期だろ
プログラムのreturnコードを返す仕様なんだし
>>885 大変参考になりました,まずはオーバーロード以外の方法を考えてみたいと思います
>>887 そう思ってたんですが、仕様では返却値はNULLのときはcmdが可能かどうかで、NULL以外はコンパイラ定義の値であってプログラム実行成否ではないみたいです。
&をつけるのもshell/cmd processerの問題なので言語ライブラリ仕様とは関係なく、system機能の仕様で同期なのか非同期なのかはやはり環境・コンパイラ依存なのでしょうか。
どちらかはっきりしないとsystem()を使ったコードはかなり煩雑になると思うんですが。
一応g++ですがbetter cとjava jniで使っているので本来はc99の環境が前提です。
#include <stdio.h>
int
main(void)
{
system("date");
printf("hello\n");
}
glibcのsystem関数は
__execve
を呼び出してるよ
windowsで頻出してくるDWORD型がunsigned longって分かりにくい
unsigned intだったら、いつも使ってるintのマイナス無し版ってわかるのに
わざわざlong選択してる意図がよくわからない
アライメントを基準にしてるからだよ
>>892 「DWORD は 32bit符号なし整数型」として決めたから long を使ったのでしょう。
int だと、処理系によってビット幅が変わるから。
>>892 WORD, DWORDはプラットフォーム非依存の16ビット、32ビット整数なんだけど、
16ビット時代のVC++ではshortとintが16ビット、longが32ビットだったから、
unsigned int で定義すると環境によってビット数が変わってしまう。
>>889 systemはセキュリティ上問題ある関数だから
普通は環境依存のもうちょい安全な関数を使うよ
そっちならもう少し環境に応じた保証があると思う
ググれ
>>889 >そう思ってたんですが、仕様では返却値はNULLのときはcmdが可能かどうかで、
返却値が NULL ?
system( ) の戻り値は int だぞ。
まじで、日本語の勉強からした方が良いレベルだと思う。
http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/system.3.html > エラーが発生した場合 (fork(2) に失敗した場合など)、-1 を返す。
> そうでなければ、コマンドのステータスを返す。
> command の値が NULL のときは、 system() はシェルが利用可能ならゼロ
> 以外の値を返し、利用不可ならゼロを返す。
あと、べつに system( ) にセキュリティの問題があるとか言ってるバカもいるが、
それは無視しても、セキュリティ上の問題を生じやすい関数なのは間違いないので、
可能なら避けたほうが良い。
>>899 他人の日本語を気にしてるようだけど自分の日本語には自信あるの?
無害化できなくはないが
扱いに重々注意が必要な時点で
セキュリティ上問題があるんだよ
意味不明
これを意味不明と思う奴がやらかすんだよなあ
何を?
>あと、べつに system( ) にセキュリティの問題があるとか言ってるバカもいるが、
それは無視しても、セキュリティ上の問題を生じやすい関数なのは間違いないので、
可能なら避けたほうが良い。
具体的にどういう問題があるのか具体例をあげてもらえますか?
> あと、べつに system( ) にセキュリティの問題があるとか言ってるバカもいるが、
この日本語がおかしいことにも気付かないとか、本当に日本人か?
顔真っ赤だなおまえw
911 :
デフォルトの名無しさん:2013/02/02(土) 12:38:11.20
age
const int* hage = &hoge;
これって使い道あるの?
>>886 Cの規格にはsystem()の動作は処理系が文書化することとなっています。
UNIX系ならman systemを読めばいいんじゃないでしょうか。
思ってたよりレベル低いなこのスレ
>>914 >> あと、{ 君 (
>>899) とは } べつに system( ) にセキュリティの問題があるとか言ってるバカもいるが、
マジで理解力がなかったんだ… チーン (w
その場合は「他に」を使うのが普通だと思うが
横からけど、
>>896 > systemはセキュリティ上問題ある関数だから
この表現が不適切なのは、間違いない。
>>918 「他に」でも噛み付いてくると思うけど?
なら、「べつに」にも噛み付くなよ。
まあ、そういうところしか噛み付けないんだろうけど (w
systemとか使うだけでコンパイラが文句いう事もある関数ですから
fopen( ) でも文句言う奴もあるんだぜ。
そりゃerrnoとか糞仕様ですし
いつまでもC++のやっつけ仕事ばかりをやってないで、Java,C#のどちかをちゃんと勉強して、現代的なプログラム・ソフトウェアの設計・手法といものを身につけた方がいいと思いますよ
928 :
デフォルトの名無しさん:2013/02/02(土) 14:33:03.87
反論できずに晒しあげとか、恥ずかしいね (w
>あと、べつに system( ) にセキュリティの問題があるとか言ってるバカもいるが、
>それは無視しても、セキュリティ上の問題を生じやすい関数なのは間違いないので、
>可能なら避けたほうが良い。
結局セキュリティの問題があるんじゃないか
>>930 問題を起こしやすいって言ってるだけで、あるとは言ってない。
保守を考えれば、起こしやすいだけで問題あると言っていいだろ
言葉遊びをするつもりはないけど、
system();そのものに問題があることと、system();の使い方によっては問題があることと、
切り分けて考えているんだけど、間違っているかな…。
気をつけて使えば大丈夫、と言っても、
本当に全ての人が気をつけられるか、
自分が居なくなっても安全性が保たれるか、という事まで考えるべき
ましてやもっと安全な代替物があるんだから、
強く「問題がある」と主張して使わせないようにするのが良い
>>933 どんなセキュリティーホールも悪用されない限りは安全って言ってるようなものじゃないか。
windows7 pro 64bit
開発環境VisualStudio 2012
C++についての質問をしようと思ったのですが、レスを書いているうちにハッと気付いて解決してしまいましたので、ここにご報告させて頂きます。
そこまで書くなら、どんな質問でどんな解決方法だったのかも書けよw
初心者ですが質問させてください。
c言語で、関数の引数に二次元配列を取りたいときはどのように書けばいいのでしょうか?
void check(int f[int n][int m], int x, int y, int depth)←これだとコンパイルエラーになってしまいます
配列の要素数が決まっていないとできないのでしょうか?
void check(int** f,
構造体ならわたせるね。構造体にいれとけばできるね
>>938 void foo(int(*f)[5], int x)
{
for (int i = 0; i < x; i++)
for (int j = 0; j < 5; j++)
f[i][j] = i * j;
}
int a[10][5];
foo(a, 10);
のように、普通にやる場合は最初の要素数以外が固定されてしまう
これを回避するには
void foo(int* f, int x, int y)
{
for (int i = 0; i < x; i++)
for (int j = 0; j < y; j++)
f[i * y + j] = i * j;
}
int a[10][5];
foo(&a[0][0], 10, 5);
のように自分でインデックスを計算するしかない
サイズが固定なら可能なんだがなぁ。
動的にしたいなら、他の人も書いてるようにポインタを扱って、添え字計算を自分で行うしかない
ちなみに二重ポインタでryというのは、記述を動的な二次元配列風にするのには使えるが、引数に二次元配列を渡す場合は違うぞ
C++使えって話だ
int func(int n, int a[][n])
C99で可能、C11はoptionのはず。
C++は98, 03, 11すべてで不可。
void check(int (*f)[], ...)
と書けなくもないが関数内でのアクセスがメンドイ
構造体とかサイズがどうとかクソなコトしなくても
#define N 10
#define M 5
typedef int ary[N][M];
int f(ary a){int r=0;for (int j=0;j<N;++j) for (int i=0;i<M;++i)r+=a[j][i];return r;}
配列のtypedefは悪魔的挙動を示すからあまり使わない方がいい
せいぜい配列ポインタの解説に使う程度で
Cで要素数1の配列をtypedefして
C#などの参照型みたいに扱えるように見せるテクニックはあるけど
正直悪魔的だと思う
>>947 標準ライブラリでも使われているテクニックなのに大袈裟すぎだろ
C++なら
template <size_t U0,size_t U2>int f(int&a[U0][U1]){...}
>>886,889
system()についてですが処理系依存なのは分かったのですが、質問はsystem()の動作についてではありません。
system()のsub shellと同期するのか非同期なのかですが、もっとわかりやすく言い換えれば、user code(呼び出し元)がsystem()の完了復帰までブロックされているのかどうかということです。
つまりfunc2()の時点でsystem(cmd)の呼び出しは、cmdはsubshellの実行し完了していて、しかもfunc2はそのcmd完了まで待機してる(つまりプロセス・スレッドとして同期)なのが、
言語仕様で保障されているのかブロックするかどうかすらも処理系依存なのかどうかとういことです。
なおjavaではjdk14までならRuntime.exec(cmd)ですが非同期処理で、execはcmdを完了するかに係わらずすぐ復帰し、runtimeはcmdを非同期(別スレッドなど)で実行します。
引き続きお願いします。
>>934 C とか C++ 使うの止めた方がいいんじゃね。
>>935 さすがにその解釈は無理があるだろ。
>>951 > 処理系依存なのは分かった
だったら、その処理系のスレに逝けよ。
C++でプロセスやスレッドを使える人(使っている人)はまずいないのでsystem()の議論は難しいでしょうね
>>951 あんたが聞いてるのはどう見てもsystem()の動作だよ。
955 :
デフォルトの名無しさん:2013/02/02(土) 22:50:28.72
自分の知ってるsystemは同期型だが。windowsだとどれもそうだろ。
javascriptなどから、外部コマンド呼びだそうとしてAPIのShellExecuteを使うと非同期になって
javascriptなのにプログラムが面倒になった経験がある。javascriptにはsystemがない。
957 :
デフォルトの名無しさん:2013/02/02(土) 22:57:51.51
systemに渡す引数が処理系依存するわけで、systemだけにこだわってもダメだろう。
いちおう、同期だと想定してやってみて不具合が出たら直したらいい。
これが非同期で動作するコンパイラは見たことがない。
>>951 上の方でも書いてあるコードを実際に自分で試せよ。同期か非同期かくらいわかるだろ
C/C++使いには「同期」とか「ブロック」とかスレッド関連の議論をするとかなり難しいし、ましてプロセス(システム)の話題も絡めるなると、質問自体が一体全体何の議論であるのかを理解できる人は一握りもいないんじゃないか。
960 :
デフォルトの名無しさん:2013/02/02(土) 23:14:35.72
マルチコアの時代では、非同期は一般的だろ。
教科書なんかには乗りにくいかもしれないが、概念は難しくはない。
ただしエラー修正やデバッグはしにくい。
system()についてですが、user code blockがブロックされるのかどうかまでも環境・処理系存となると、同期ようと非同期ようの2つ用意しないといけなくてかなり煩雑なんですよ。
最近だとvc++はもちろんgcc (g++)すらも使わないで、c99仕様で、dll,soを作れるようになってるので、vc++ (win sys), gcc (linux sys)など処理系べったりのc/c++コードはそろそろ卒業かなって。
Qtあたりでも使えばいいんじゃないでしょうかね
963 :
デフォルトの名無しさん:2013/02/02(土) 23:39:07.35
そしたらsystemが非同期だと仮定して、待ちをいれろ。その関数をsystem0とでもする。
>>961 なんで system( ) に固執しているんだろう?
そもそも使うのやめたほうが良いぞって言われてるんだが、人の話を聞かないタイプなんだろうな…
965 :
デフォルトの名無しさん:2013/02/02(土) 23:57:31.28
systemの引数が確実に環境依存
どういうのをsystem関数で動かそうとしてるのか、書かないから、もめるんだよ
例示してるのはどうみても環境依存ですから
それで汎用的な答えをもらおうとしてるところが...
system関数なんて使うなって言われてんのに・・・
OS依存になるだろうけど、元々systemの挙動自体環境依存なんだから
環境にあった実行関数使え
どうでもいい話に限って伸びるよな
わかりやすいとやぱ反応する人多いでしょ。
俺みたいにw
やっぱfork()でしょ。
環境非依存にこだわるのも必要なとき、必要な範囲だけでいいんだぞ。
徹底しても労力に見合わない。環境を決めてその範囲で安全を追求する現実的だし意義も大きいぞ。
そこは spawn() で
でっどりー
as3だとthis使いまくるんだけど、c++はas3のthisに相当する機能がなくて不便ですね
型が静的なんでそういう便利さはないね
>>973 c++ にも this は十分あると思うのですが、AcsionScript3 にはできて c++ にはできない this の使い方とはなんでしょうか?
>>975 C++の人はthis->filedName = "SSS";なんてやるの
普通やらないでしょ
this.が無いとフィールド or ローカル変数か判断がしにくいと思ったんだ。javaの人もthisよく使うって言ってたよ。
m_ ってするのもダサいしさ、そんだけ
C++にそんな機能は無いって言ったのは間違い
this 必須ならいいけど、必須じゃないから何の判断にもならない
たまに this-> って書く人がいるけど、命名で強制的に区別させろと
thisなんてラムダ使う時ぐらいしか使わんな
AS3とかjavaってthisは省略できないんだっけ?
ASはよく知らんが
Javaで省略できないわけがない
書き忘れてもコンパイル通るものを判断基準にできるわけがないし
そもそもthis->とか長過ぎてウザくてダサい
m_の方がよっぽど良いわ
生成コードに影響しなければ this-> ってやってしまうのは未熟者ですかねえ‥‥
メンバを表示するためにthis->で入力補完させる人はいる
最後に一括削除して欲しいが
IDEで色分けするから大体入力補完目的になるよな
同じクラスのを引数にとる時とかはthisをつけてるな
それ以外は全部省略、代わりちょっと冗長でも分かりやすい名前をつけるようにしてる
ローカル変数は使い捨てをいい事にかなり手抜きで命名をしてる
>>984 色分けされるIDEばかりじゃないから
当てにしない方がいい
コーディングの流儀に関する部分は言語の優劣ではありません。
うめ
>>989 80代からテンプレートが変、次代にはちゃんともとどおりにしておくように。
int **n = new int*[10];
delete[] n; // ←ここはnだけでいいんですか?
いいんです
そんなもん使うなよ
libgdbってどんなものなの?
libをとってみる
gdb
gdb を用いたデバッグ方法
gdb - GNU デバッガ