12/11/29 00:38:12.09
clangはいつになったらWindowsで普通に使えるようになりますか?
3:デフォルトの名無しさん
12/11/29 00:58:14.12
Hoge
4:デフォルトの名無しさん
12/11/29 07:25:31.64
foobar, foo, bar, baz, qux, quux, corge, grault, garply, waldo, fred, plugh, xyzzy, thud
5: ◆QZaw55cn4c
12/11/29 07:41:25.03
>>2
cygwin にはすでにはいっている。
6:デフォルトの名無しさん
12/11/29 08:02:30.96
前スレ>>1000のAAに吹いたw
7:デフォルトの名無しさん
12/11/29 10:19:29.46
DMC8.55が出てるが更新履歴が見当たらない
何が変わったか分かるエスパーいますか?
8:デフォルトの名無しさん
12/11/29 17:45:28.14
質問ですが、以下のリンカエラーが多発してしまいます。
multiple definition of 'error'
で、私は error という関数を定義していません。
/usr/include/c++/4.4/new:101でかち合ってるみたいですが
何が何やらサッパリです。
何から確認すればいいでしょうか。お願いします。
9:デフォルトの名無しさん
12/11/29 18:25:10.29
ここはエスパースレじゃないぞ
10:デフォルトの名無しさん
12/11/29 19:10:05.65
>>8
多重定義しているんでしょう。
まずは、自分の作ったヘッダファイル全ての1行目に
#pragma once
を書いてリビルドしてみたらいかがでしょう。
それでもダメなら別の原因。
11:デフォルトの名無しさん
12/11/29 19:20:34.85
int main(void) { return 0; }
これだけでエラーになるならコンパイラが壊れている
#include でも何でも、どうしたら再現する不具合なのかを突き止めれ
12:デフォルトの名無しさん
12/11/30 02:03:53.21
マルチスレッドの排他処理のミューテックスって重いんすか?
10スレッド動かして各スレッドが60fpsでループ、その1スレッドの1フレーム間でロックとアンロック合計200回とかきついっすかね?
10スレッドあるのでそれだけで2000回、他の諸々入れるとそのアプリ全体で毎フレーム2200回いく予定なんすけどね
2.4GHzのデュアルコアで他に重いものは動かさない前提っす
今の設計だと上記状態になるんで、無理なら開発を進める前にまた頑張って考えて設計を変更しなきゃいけないんす
13:デフォルトの名無しさん
12/11/30 02:49:01.97
>>12
・Cの質問でない
・ミューテックスの重さはOSによる。もっと言えば実装による。
・そもそも組み込みで無いOSが動いているなら、そのOS自体の重さを考慮する必要があるだろう。
組み込みなら2,4GHzのデュアルコアとか神レベルの速さ。
いずれにせよハイレベルの3Dゲームでも作るんじゃなければ気にする必要はない。
・ミューテックスの一般的な実装をイメージするならそこまで重く無いだろう。
ディスパッチした時は負荷がかかるだろうが、常識的な作りなら1スレッドの実行で数回発生するくらいでは。
・1スレッドごとに200回のロック・アンロック。という設計思想が良く分からない。
ロック->アンロック->ロック->アンロック->の繰り返し?それなら効率が悪いからまとめてロックしとけ。
ロック->ロック->ロック->アンロック->アンロック->アンロック?200回とか階層深すぎじゃないの?
・全てのスレッドを60fpsで動かす必要が本当にあるのだろうか。同じスレッドをたくさん起動するのだろうか。
14:デフォルトの名無しさん
12/11/30 02:59:18.23
Windowsならクリティカルセクションとかインターロックの方が早いかも知れない?
URLリンク(www.isus.jp)
15:デフォルトの名無しさん
12/11/30 07:56:16.97
それ、ミューテックスが重いかどうかよりそんなに同期が必要になる時点で設計がおかしいよ。
16:デフォルトの名無しさん
12/11/30 11:10:53.29
うんだ。設計がおかしい。
大方、画面中のオブジェクト1個ずつに対してスレッドを割り当てて
それぞれが排他しないとまずいタイミングでロックかけようとしてる
んだと思うけど、設計が頭悪すぎる。
17:デフォルトの名無しさん
12/11/30 11:25:07.73
あとなんか>>12の書き方から察するに業務用アーケード基板(TAITOのとか)
くさいニオイがぷんぷんするんだけど、こんなところで質問する前に会社の
上司とか同僚に聞いたほうが早いぞ。
スレッドに分ければオーバーヘッドが減るってものではない。
18:デフォルトの名無しさん
12/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を大量に送り込んできたじゃないっすか
その助成金もなくなった今、反撃のチャンスだと思ってるんす
そしてそれで稼いでニート脱出するっす
とりあえず設計しなおします
19:デフォルトの名無しさん
12/11/30 13:50:45.57
ROエミュのAEGISでも参考にすれば
20:デフォルトの名無しさん
12/11/30 23:37:55.67
>業務用アーケード基板
近からずといえど遠からずだったなw
21:デフォルトの名無しさん
12/12/01 00:14:23.33
>>18
・60fpsというのは基本的に画面表示用スレッドの周期。
画面表示の無いサーバなら60fpsで処理する意味は無い。
・普通に考えると受信スレッドとゲームスレッドの2つで良い。
・受信スレッドは常時受信を行い、各ユーザーからの通信メッセージを受けてリストにする
・ゲームスレッドは常にループしていて、各ユーザーの通信メッセージを順次処理していく。
通信メッセージごとにサーバ上のゲームデータを更新し、必要に応じて通信メッセージを送信する。
・MMOの作り方みたいな本があるはずだから読んだ方が良いかも
22:デフォルトの名無しさん
12/12/01 01:52:26.18
>>21
その本は買ったがプログラム初歩習得ゲームはド素人みたいな人向けに
基本のキの部分しか解説してなかった。役に立つかと言えば微妙。
23:デフォルトの名無しさん
12/12/01 11:00:47.81
>>18
便所の落書きや知恵遅れで質問するなら趣味のプログラミングは辞めたほうがいい。
24:デフォルトの名無しさん
12/12/01 15:44:33.95
質問です。
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つを提供するのとではどちらがより一般的なのでしょうか?
25:デフォルトの名無しさん
12/12/01 15:46:36.33
struct POINT {
int x;
int y;
};
class PointTest : public POINT
26:デフォルトの名無しさん
12/12/01 15:55:05.36
>>24
両方いれたらいいじゃん
でもよく見るのは各成分getかな
27:デフォルトの名無しさん
12/12/01 16:06:04.13
各成分getが多いけど
別に作りたけりゃ両方作ってもいいのよ
28:デフォルトの名無しさん
12/12/01 17:58:53.19
メンバ変数をpublicにするのはこの場合適切ではないだろ。
29:デフォルトの名無しさん
12/12/01 18:04:33.86
>>28
変数間で保つべき不変条件でも無けりゃ private にする意味ないでしょ。
点の x, y 座標間に何かそんな関係があるか?
30:デフォルトの名無しさん
12/12/01 18:07:10.58
元の>>24でprivateにする意図を示しているのに
publicにしたら質問の意味がなくなるだろう。
馬鹿じゃないの?
31:デフォルトの名無しさん
12/12/01 18:10:08.47
他のクラスのメンバで
void SetPoint(const PointTest& pt);
PointTest GetPoint();
ならまだ理解できるんだが
32:デフォルトの名無しさん
12/12/01 18:59:14.90
privateにするのは不変条件のためだけの話じゃないぞ
ブレークはったりデバッグコード仕込んだりできるのも重要
33:デフォルトの名無しさん
12/12/01 19:13:04.66
やっぱこれだろ。
get、setは余りたくさん書きたくないからx,yくらいなら構造体でまとめる。
struct Point {
int x;
int y;
};
class PointTest {
private:
Point point_;
public:
void setPoint(Point &point);
Point getPoint(void);
};
34:デフォルトの名無しさん
12/12/01 20:00:07.53
プロパティってなかったっけ?
35:デフォルトの名無しさん
12/12/01 20:19:17.73
しかしpointごときはprivateにする必要もないと思う
36:デフォルトの名無しさん
12/12/01 20:50:07.77
>>24
getterが
> void Get(int &x, int &y) として1つで済ませるのと
この形の一つだけっていうのならそれは間違いなく駄目な設計
そういうクラスを実際に使うとわかるが値の取得に変数が必要ってのは明らかに使い勝手が悪い
37:デフォルトの名無しさん
12/12/01 22:12:03.43
同時性にこだわる俺っち、別に潔癖症とは思ってない
C++ の const は性的だし♡
38:デフォルトの名無しさん
12/12/02 00:33:52.24
有用を悩む程度のメンバアクセスにはアクセス専用の一時クラス通すんだよ
39:デフォルトの名無しさん
12/12/02 01:39:40.75
適当な型を扱う時に
デバッグ用にブレーク貼れるようにする
クラステンプレート作ってるわ
40:デフォルトの名無しさん
12/12/02 02:03:49.04
const Point& GetPoint() const;のがいいきがする
41:デフォルトの名無しさん
12/12/02 02:59:51.42
山椒がピリリと引き立つわけですか
42:デフォルトの名無しさん
12/12/04 16:01:02.06
Pointぐらいならpublicにしてもいい気はするけど、あとで何か処理が追加されるかもしれない事を考えてgetter,setterを用意するほうが良い
43:デフォルトの名無しさん
12/12/05 05:01:08.51
C++初心者です
cout/wcout/printf/wprintf 全てを共存する一般的な方法はありますか?
44:デフォルトの名無しさん
12/12/05 11:26:48.91
ラップ
45:デフォルトの名無しさん
12/12/05 12:41:34.33
書き込むごとにフラッシュして使い分けるだけだろ
46:デフォルトの名無しさん
12/12/05 17:07:57.34
Print()を作ってパラッパラッパー♪
47:デフォルトの名無しさん
12/12/05 19:18:22.53
>>43
そもそも「共存」ってどういう意味なんだ? そこがはっきりしないと答えようがない。
48:43
12/12/05 21:34:40.59
説明するより見てもらったほうが早そうなのでコードを提示します。
URLリンク(ideone.com)
URLリンク(ideone.com)
URLリンク(ideone.com)
URLリンク(ideone.com)
URLリンク(ideone.com)
URLリンク(ideone.com)
URLリンク(ideone.com)
URLリンク(ideone.com)
こんな結果です。
msvcならバッファのflushに注意すれば大丈夫な気もしますが
gccでは諦めるしか無い?
49:デフォルトの名無しさん
12/12/06 00:01:47.15
printfとwprintfは_tprintf
std::coutとstd::wcoutは共存しない
50:デフォルトの名無しさん
12/12/06 01:20:44.81
>>43
仕様上はstreamにはorientationという概念があってnarrowとwideのI/Oを
同一のストリームに混在させられないことになってる
MSVCだと一見平気で混ぜられるけど、_O_U8TEXTみたいなモードは
orientationに基づいてるみたいで、その場合は混ぜられないよ
51:43
12/12/06 01:58:51.49
>>50
解説したブログが見つかり納得するまでにはいかないけど
理解することは出来ました。
reopenするとかで何とか出来そうなこともなさそうだけど
コストが高そうなので諦めます。
ありがとう。
52:デフォルトの名無しさん
12/12/06 02:00:00.98
>>50
orientationなる単語で検索したところ //←コピペミスで抜けてました。
解説したブログが見つかり納得するまでにはいかないけど
理解することは出来ました。
reopenするとかで何とか出来そうなこともなさそうだけど
コストが高そうなので諦めます。
ありがとう。
53:デフォルトの名無しさん
12/12/10 04:03:55.42
イクリメント、デクリメントの後置きってどういう動作になってるんですか?
>後置きの場合にはインクリメント演算子による演算以外の処理を先に行います。
ググるとこんな感じの事が書いてあるし、自分でもそうだと思ってたんですが
最後に後置きのイクリメント、デクリメントの処理がされると思ってるとなんかおかしい事になります
環境はwindows7でVC++2010Expressです
54:デフォルトの名無しさん
12/12/10 07:24:30.05
>>53
×イクリメント
○インクリメント
例えば、j = i++はj = i, i = i + 1と等価だと考えればいい。
55:デフォルトの名無しさん
12/12/10 07:34:30.28
>>52
普通はずっと片方を使い続ける
56:デフォルトの名無しさん
12/12/10 09:54:07.71
副作用完了点(sequence point)で調べな
57:デフォルトの名無しさん
12/12/10 15:15:31.43
しれっとstdout/stderrに出力するオープンソースのライブラリは結構あるので
そういうの使う時はorientationには要注意
そういうライブラリはまず間違いなくnarrowで出力していると思うが
58:デフォルトの名無しさん
12/12/10 15:30:38.44
MC68000上で開発された名残がそこかしこに。
59:デフォルトの名無しさん
12/12/10 19:28:12.01
インクリメントでした。恥ずかしい・・・
訂正ありがとうございます
副作用完了点でググったら一つの式で一つのオブジェクトの値の変更は一回しかできない、とありました
自分がやろうとしてたのは一つの式で一つのオブジェクトの値の変更が二回になっていたのでたぶんそのせいですね
ありがとうございました
60:デフォルトの名無しさん
12/12/11 01:15:15.61
>>50
このような手当てが必要な理由はなんでしょうか?
61:デフォルトの名無しさん
12/12/13 23:08:54.71
tcharの、charの前のtは何から来ているの?
あと L"あ"の時のLは何から来ているの?
wide文字だよって示すならwprintf見たいに、w"あ"って感じにしたほうがいいような
62:デフォルトの名無しさん
12/12/13 23:14:44.08
Lはlong
tはtext
wにしなかったのは、多分整数と合わせたんじゃないのかな
63:デフォルトの名無しさん
12/12/13 23:30:37.50
LPCTSTR lpszText;
64:デフォルトの名無しさん
12/12/13 23:35:00.03
long pointer constant text string long pointer string zero-terminated text
65:デフォルトの名無しさん
12/12/14 01:25:53.08
long pointer ってなんですか?
66:デフォルトの名無しさん
12/12/14 01:31:06.42
長いポインタです
67:デフォルトの名無しさん
12/12/14 02:43:29.19
>>65
32ビットのポインタ。従来の16ビットポインタより長いという意味。
昔、16ビットと32ビットのポインタを混在して区別する必要があった時代のなごり。
今じゃ(少なくともWindowsやLinuxでは)サイズの異なるポインタが混在することはないから気にするな。
68:デフォルトの名無しさん
12/12/14 02:51:37.77
>>67
far とは違うものなの?
69:デフォルトの名無しさん
12/12/14 07:14:47.65
>>68
同じ
70:デフォルトの名無しさん
12/12/14 08:47:17.38
>>68
違う。あっちはセグメント。
71:デフォルトの名無しさん
12/12/14 09:02:03.02
どっちなの?
72:デフォルトの名無しさん
12/12/14 09:12:48.84
URLリンク(msdn.microsoft.com)
P は "ポインター (pointer)"、LP は "ロング ポインター (long pointer)"
の略として使われてきました。ロング ポインターはファー ポインター (far
pointer) とも呼ばれますが、16 ビット Windows の名残で、現在のセグメント
の外にあるメモリ範囲をアドレス指定するのに使用されていました。LP プレ
フィックスは、16 ビットのコードを 32 ビット Windows に簡単に移植できる
よう、予約されていました。現在ではこの区別は存在せず、単にポインターと
呼ばれています。
73:デフォルトの名無しさん
12/12/14 09:14:13.28
>>71
far pointerはsegment16bit * 16 + offset16bitで20bit(1MB)のメモリ空間を表すもの。
74: ◆QZaw55cn4c
12/12/14 09:40:06.25
>>73
しかしリアルモードではCPU 自身がセグメントを16ビット、オフセットを16ビットと持ち、12ビット分を重ねるのはCPU内
したがって記述レベル、たとえばアセンブリ言語で記述するときもセグメント、オフセットそれぞれに word=16bit の領域を準備することが多い
大概のC処理系でもそう。(sizeof(void far *) = 32)
75:デフォルトの名無しさん
12/12/14 10:11:41.90
>>74
同じことしか言ってないように見える
最後4だし
76:デフォルトの名無しさん
12/12/15 08:37:43.76
>>73
long pointer は FAR で定義されている
FAR を far で定義するか空定義にするかは環境次第
77:デフォルトの名無しさん
12/12/15 09:09:59.58
farなんていうのは16bit x86(16bit プロテクトモードを含む)の
化石だよね。だから>>74がリアルモードに限定しているのは間違い。
16bit x86の設計は8bitCPU8080のコードをポーティングしやすくする
ためにアドレス空間も8080と同じ64KBを基本とした。
この範囲のプログラムはポインタも16bitで良かった。
だが時代が進みコードサイズが爆発的に増えた結果、オフセット
だけでは不足してきたので、セグメントとペアで扱うことにした。
だがC言語的にはポインタはポインタでしかないので、ポインタが
アドレス可能な範囲は実装依存だった。
でもオフセットのみのポインタとセグメントとペアのポインタは区別して
扱わないと開発上問題になる。そこで予約語farを定義して、farがつく
ポインタはセグメントとペア、それ以外はオフセットのみと定義すること
にした。
一般的にはfarのつくポインタだけをセグメントとペアのもの、つかない
ポインタはオフセットのみという認識だが、あえて両者を区別しやすく
するという意味でオフセットのみのポインタを「nearポインタ」と呼ぶ場合
もある。でも今となっては用済みのテクノロジでどうでもいいヨタ話。
78:74 ◆QZaw55cn4c
12/12/15 09:12:44.43
>>77
概ね同意です。
79:デフォルトの名無しさん
12/12/15 09:29:44.69
ヨタついでにもう1つ。
昔の16bit x86用Cコンパイラには「メモリモデル」なるものが存在した。
詳しい話は英文だけど
URLリンク(www.c-jump.com)
このへんを参照。
んで、開発を始める前にプログラム規模をまず見積もり、メモリモデル
のどれを採用するかを慎重に決める必要があった。なぜなら途中から
メモリモデルを変更するとコード全体に波及する可能性があったから。
大抵のプログラムでは単一コードセグメント、単一データセグメントで
間に合うものだったが、後々の保険にということで複数セグメント前提
にしてポインタを全部farにする、なんていう「大は小を兼ねる」判断も
行われていた。
80:デフォルトの名無しさん
12/12/15 09:47:22.53
MS-DOS陣営と違い意外に知られていないが、Mac-OSも680x0の時代は
32KBのコードリソースに入るサイズで切り分ける必要があった。
コードリソースと言う制約自体はMac-OSをベースにしていたPalmOSにも受け継がれた。
81:デフォルトの名無しさん
12/12/15 09:51:36.83
32KBのコードリソースっていうのはおそらくMC680x0における
ショートジャンプ(PC相対とかレジスタ相対ジャンプ)の範囲で
おさめるための策だと思われる。
時代背景から考えて現実的とは言えるけど、単なるウィンドウ
システム側の制約なだけ。MC680x0はリニアなアドレス空間で
16MBまでアクセスできた。
82:デフォルトの名無しさん
12/12/15 10:41:58.36
LPは16-bit時代の遺産だからな
farポインタの存在する環境であればfarポインタになるのだが
32-bit環境以上なら普通のポインタと同じ
83:デフォルトの名無しさん
12/12/15 11:26:29.81
コードリソースの32kBというサイズはPC相対アドレッシングの制約からきたものかも
知れないが、セグメント間はA5相対JSRでアクセスするようコンパイラが判断するから、
関数ポインタを使いたいような場面でもない限りプログラマが意識する必要はなかったな。
84:デフォルトの名無しさん
12/12/15 21:29:59.09
昔のコンパイラは
switchがショートジャンプなので
延々と処理を書くと
適当なとこにジャンプしてた
85:デフォルトの名無しさん
12/12/15 21:35:23.60
>>84
「適当」って「適切」じゃなくて「いい加減」という意味ですか?
怖いですね。
86:デフォルトの名無しさん
12/12/15 22:08:15.49
昔のコンパイラと言うかそのコンパイラが手抜k
87:デフォルトの名無しさん
12/12/15 22:40:53.85
飛べねーぞごらぁ って言うのは見たことあるけど、変なとこに飛ぶコードを吐く奴は
さすがに見たことない。
88:デフォルトの名無しさん
12/12/16 02:35:18.51
質問させてください。
URLリンク(www.geocities.jp)
上記の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に代入されるポインタはすでに使えないものになっているのではないのでしょうか?
理屈がよくわからないのですが、教えて頂けると嬉しいです。
89:デフォルトの名無しさん
12/12/16 02:53:01.82
newで作成したインスタンスはスコープを抜けても勝手にデストラクトされない
90:74 ◆QZaw55cn4c
12/12/16 02:53:57.65
>>88
new で得たポインタはdeleteしない限り無効にはならない
new で得たポインタは関数を超えても生き残り続ける
new したものはdeleteせよ、という宗教もここからきているかと
91:デフォルトの名無しさん
12/12/16 03:32:27.84
C#だとnewばっかで滅多に削除を明示しない
92:デフォルトの名無しさん
12/12/16 03:36:33.83
なるほど!
ありがとうございますm(__)m