【初心者歓迎】C/C++室 Ver.15【環境依存OK】

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
http://pc5.2ch.net/test/read.cgi/tech/1108924728/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

2デフォルトの名無しさん:05/03/19 20:29:02
にかな
3デフォルトの名無しさん:05/03/19 20:32:02
にかわ
4デフォルトの名無しさん:05/03/19 20:32:45
さんかな
5デフォルトの名無しさん:05/03/19 20:33:00
さかな
6デフォルトの名無しさん:05/03/19 20:33:08
よんかな
7デフォルトの名無しさん:05/03/19 20:33:52
よんさま!!!!!!!!!!!!!!!!
8デフォルトの名無しさん:05/03/19 20:34:03
ななだ!
9デフォルトの名無しさん:05/03/19 20:34:25
ていうか、テンプレまだぁ
10デフォルトの名無しさん:05/03/19 20:35:33
テンプラまだー
11デフォルトの名無しさん:05/03/19 20:37:24
今揚がりました
12デフォルトの名無しさん:05/03/19 20:37:51
テンプレは20レスの間に入れてほしい。でないと、でないと…
13デフォルトの名無しさん:05/03/19 20:39:26
∧_∧
( ´・ω・) みなさん、お茶が入りましたよ・・・・。
( つ旦O
と_)_) 旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦
14デフォルトの名無しさん:05/03/19 20:43:34
15デフォルトの名無しさん:05/03/19 20:47:27
【関連スレ(処理系別)】
★初心者にVisual C++を教えるスレ★ Part17
http://pc5.2ch.net/test/read.cgi/tech/1107926989/
■MFC相談室 mfc13d.dll■
http://pc5.2ch.net/test/read.cgi/tech/1110179996/
C++Builder相談室 Part13
http://pc5.2ch.net/test/read.cgi/tech/1108468718/
GCCについて part5
http://pc5.2ch.net/test/read.cgi/tech/1103057320/
cygwin + mingwn + gcc 相談室
http://pc5.2ch.net/test/read.cgi/tech/1058134693/
タダで使えるBorland C++ Part4
http://pc5.2ch.net/test/read.cgi/tech/1091066805/
タダで使えるVisual C++ $2
http://pc5.2ch.net/test/read.cgi/tech/1086287039/
Borland C++ BuilderX
http://pc5.2ch.net/test/read.cgi/tech/1065260556/
Turbo C++ 5.0 プログラミング
http://pc5.2ch.net/test/read.cgi/tech/1030878794/
16デフォルトの名無しさん:05/03/19 20:51:23
【関連スレ(その他)】
C言語なら俺に聞け! Part 105
http://pc5.2ch.net/test/read.cgi/tech/1111117094/
C++相談室 part39
http://pc5.2ch.net/test/read.cgi/tech/1106527792/
ぼるじょあがC/C++の宿題を片づけますYO! 41代目
http://pc5.2ch.net/test/read.cgi/tech/1109542053/
【C++】template 統合スレ -- Part6
http://pc5.2ch.net/test/read.cgi/tech/1101384692/
C++は難しすぎ 難易度:2
http://pc5.2ch.net/test/read.cgi/tech/1071697977/
C言語の第一歩
http://pc5.2ch.net/test/read.cgi/tech/1031374980/
プリプロセッサについて熱く語るスレ。
http://pc5.2ch.net/test/read.cgi/tech/1058203590/
C統合・質問スレッド
http://pc5.2ch.net/test/read.cgi/tech/1068359871/
C、C++の最適化について語るスレ
http://pc5.2ch.net/test/read.cgi/tech/1084676298/
17デフォルトの名無しさん:05/03/19 21:25:29
当方今Webの参考資料見ながらプログラム書いてるんですけれども。

そのプログラムの中で同じような処理(レジストリからAという値を抜く処理,Bという値を抜く処理等)がいくつか有るので、
同じような分野別にしてファイル分けて改造しやすくしてるんですが。
こうする事でプログラムが重くなるとかって有るんでしょうか?
まとめて一つのテキストの中に処理全て書いた方がいいんでしょうか。

判りづらい文で済みませんが、何方かご教授お願い致します。
18デフォルトの名無しさん:05/03/19 21:36:33
> 当方今Webの参考資料見ながらプログラム書いてるんですけれども。
初心者の特徴:なぜか質問をあいまいにする
19デフォルトの名無しさん:05/03/19 21:42:33
>>18
その行のどこが質問ですか?
20デフォルトの名無しさん:05/03/19 21:51:52
>>17
レジストリから〜っていうのはSHGetValueで十分じゃないか?
21デフォルトの名無しさん:05/03/19 21:56:35
モジュール化することを否定してはなりません。
22デフォルトの名無しさん:05/03/19 22:31:58
>>19
もう少し読解力を鍛えろ
23デフォルトの名無しさん:05/03/19 23:35:23
>>17
まとめると、
・ソースファイルが単数と複数の場合とで、
 プログラムの実行速度は変わるのか?
ということか?
知らん。
24デフォルトの名無しさん:05/03/20 00:39:12
>>22
あの行が質問を曖昧にしてるとでも?
25デフォルトの名無しさん:05/03/20 01:06:55
つまらないことでスレがのびそうな悪寒・・・
26デフォルトの名無しさん:05/03/20 01:28:51
>>24
もう一度言うね
もう少し読解力を鍛えろ
27デフォルトの名無しさん:05/03/20 01:52:20
時間がかかりそうだから、何がどのように曖昧にしてるか教えてよ
28デフォルトの名無しさん:05/03/20 01:53:22
読解力を鍛えろっていうやつって
そもそも理解してないよな
29デフォルトの名無しさん:05/03/20 01:56:19
かわいい^^
30デフォルトの名無しさん:05/03/20 02:43:39
コンパイラに任せとけ
31デフォルトの名無しさん:05/03/20 02:57:18
>>17
プログラムの実行速度はおそらく殆ど変わらない。
ビルドに要する時間は増加する。
ソースコードのメンテナンスは容易になる。
32デフォルトの名無しさん:05/03/20 13:44:22
エクスプローラでコピー、切り取りされたものを別アプリで貼り付けたいんだけど
クリップボードの情報からどうやって判断すればできるのかな?

C++Builderでのサンプルは見つけたんだけどVC++6のサンプルが見つからなくて
どうすればいいか悩み中。

環境:Windows2000Pro + VC++6SP5 + sdk

C++Builderでのサンプルのありか
http://sapporo.cool.ne.jp/tanomi/qanda/a055.html
33デフォルトの名無しさん:05/03/20 14:13:29
#define HOGE 35001

DWORD dwSize = 35002;

上記のようにした場合、(dwSize - HOGE) の値が 3 になってしまうのは
何故でしょうか。(35002 - 35001) = 1 を期待しているのですが…。

(環境)WinXP、BorlandC++
34デフォルトの名無しさん:05/03/20 14:17:14
おまえの書いたコードにミスがあるから
35デフォルトの名無しさん:05/03/20 14:19:14
>>32
MSDNで対応しそうな関数を調べてみた。
Clipboard()->HasFormat(CF_HDROP)
└→IsClipboardFormatAvailable(CF_HDROP)
かわりにGetClipboardDataがNULLを返すかどうか調べればいいような気がするけど。

HDROP hDrop = reinterpret_cast<HDROP>(Clipboard()->GetAsHandle(CF_HDROP));
└→HDROP hDrop = static_cast<HDROP>(GetClipboardData(CF_HDROP));
36デフォルトの名無しさん:05/03/20 14:22:11
>>33
デバッグして、(dwSize - HOGE)の演算をする直前の状態でも、dwSizeが35002、HOGEが35001になってる?
3733:05/03/20 14:23:07
>>34
char tmp[256];
wsprintf(tmp, "%d", (dwSize - HOGE));
MessageBox(NULL, tmp, "TEST", MB_OK);

このようにして確認しました。
間違いがあれば指摘していただけると助かります。。。
3833:05/03/20 14:24:24
訂正です。

wsprintf(tmp, "%d %d %d", dwSize, HOGE, (dwSize - HOGE));
MessageBox(NULL, tmp, "TEST", MB_OK);

この状態で「35002 35001 3」と表示されるのです。
39デフォルトの名無しさん:05/03/20 14:29:43
コンパイラの正確なバージョンは?
4033:05/03/20 14:35:16
BorlandC++ 5.51です。
41デフォルトの名無しさん:05/03/20 14:38:34
%ld
4232:05/03/20 14:54:26
>>35
GetClipboardDataを使うように変えてみたけどhDROPEFFECTにNULLが帰ってきちゃう。
今下のような状態だけどMSDN見ながら考え中。何がおかしいんだろう・・・

UINT CF_DROPEFFECT = RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT);
HGLOBAL hDROPEFFECT = static_cast<void*>(GetClipboardData(CF_DROPEFFECT));
DWORD* pdw = static_cast<DWORD*>(GlobalLock(hDROPEFFECT));
DWORD dwEffect = *pdw;
GlobalUnlock(hDROPEFFECT);
if (dwEffect & DROPEFFECT_COPY) {
//コピー
}
if (dwEffect & DROPEFFECT_MOVE) {
//切り取り
}
if (dwEffect & DROPEFFECT_LINK) {
//ショートカット
}
4333:05/03/20 14:57:55
>>41
「%ld」としてみましたが、同様でした。

試しに値を変更しているのですが、
dwSize=35001, HOGE=35001 → 2
dwSize=35002, HOGE=35001 → 3
dwSize=35003, HOGE=35001 → 4
となります。

しかし、(HOGE-dwSize)と逆にした場合
dwSize=35001, HOGE=35001 → 0
dwSize=35002, HOGE=35001 → -1
dwSize=35003, HOGE=35001 → -2
となり、この結果は正常だと思います。

#defineで定義したものをDWORDから引き算してはいけないのでしょうか?
44デフォルトの名無しさん:05/03/20 15:06:39
VisualStudioを使わないのがそもそものミス。
かって来い!
45デフォルトの名無しさん:05/03/20 15:09:21
>>43
再現しない。俺が試してみたコード。
ちなみにコンパイラもあわせてある。
とりあえず再現する最小限のコードを晒せ。
話はそれからだ。

#include <windows.h>
#include <stdio.h>

#define HOGE 35001

DWORD dwSize = 35002;

int main(void)
{
char tmp[256];
wsprintf(tmp, "%d %d %d", dwSize, HOGE, (dwSize - HOGE));
MessageBox(NULL, tmp, "TEST", MB_OK);
}
4633:05/03/20 15:35:34
33です。
すみません。大ボケでございました。

#define HOGE AA1 /* AAA=35001 */

のように定義されていたので、そのまま35001が入ると思っていましたが
#define AA1 35000+1
#define AA2 35000+2
#define AA3 35000+3
...
のように定義されていたので、実際には (dwSize - 35000 + 1) になっていました。
回答してくださった皆様、検証までしていただいた>>45氏、本当にありがとうございました。
そして、ごめんなさい。ああ…死にたい(;´Д`)
47デフォルトの名無しさん:05/03/20 15:54:05
#define HOGE AA1

#define AA1 35000+1

(dwSize - 35000 + 1)




は?
4845:05/03/20 15:57:41
>>46
よくあるマクロの副作用ってやつだな。
マクロ定義は取り合えずカッコで囲んどくのがデフォ。

っていうか最近の流儀だと定数定義は
int const AA1=35000+1;
みたいに const 使うのが良いとされてる。
4933:05/03/20 16:57:03
>>48
勉強になります。ありがとうございます。
50デフォルトの名無しさん:05/03/20 17:47:53
const int AA1じゃなかったか?
51デフォルトの名無しさん:05/03/20 18:11:32
>>48
Cではconstは定数扱いじゃないはず。

>>50
どっちでもいい。
52デフォルトの名無しさん:05/03/20 18:50:58
>>51
実質的に定数。
っていうか定数じゃなきゃならない理由は別にない。
53デフォルトの名無しさん:05/03/20 19:17:21
>>46
・・・まあみんな通ってきた道です。「死にたい」ではなく
「この事を生涯忘れず、後進が同様な事をしても『辞めろ』とか『死ね』とかは決していわないこととします」
といえばもっと格好イイヨ
5445:05/03/20 20:29:53
>>46
俺、さっきコンパイルエラーに20分くらい考えちゃったんだけど、
listview を listvirw とtypoしてた。

エラーメッセージに出てたのも listview に見えちゃったんだもんよ〜。
思い込みってこんなもんだ。
55デフォルトの名無しさん:05/03/20 20:32:06
エラーメッセージの内容で考えろ …
5645:05/03/20 21:09:58
>>55
そうなんだけど、この場合「定義されてない名前だ」って意味のエラーが出るわけで、
スペルが間違ってることに気づかなかったからヘッダファイルの依存関係とか変なところを疑ってしまったんだよ。
5717:05/03/20 22:14:21
遅レスですが皆様、わざわざ答えてくださりありがとうございます。
メンテが楽になる反面でビルドが遅くなるんですか…
どうも感謝です。
5833:05/03/20 22:22:11
>>53
いや、それとこれとは話が別ですよね?

あなたはご自分が糞質問しても罵倒されたくないからそんなことを言ってるんですよね?
59デフォルトの名無しさん:05/03/20 22:23:56
>>52
int a[CONST];
定数じゃねーとコレができねーじゃん。
60デフォルトの名無しさん:05/03/20 22:28:08
できるものもあるんだよ
61デフォルトの名無しさん:05/03/20 22:37:13
>>60
意味不明
62デフォルトの名無しさん:05/03/20 22:42:38
C99だと出来たような希ガス
63デフォルトの名無しさん:05/03/20 22:50:40
>>62
C99を改めてチャックしてみた。
たしかにできることになってる。
6453=41:05/03/20 23:05:49
>>58
違います。私が>>53みたいな事を言ったとて、糞質問しても罵倒されなくなるとは思えませんが。
>>53 が煽りにみえたのですか?
貴方の自責の記述が好ましく思えたので、本心を少し書いただけ。
信用できなければ「私はここで質問なぞしない」と自分に誓いましょう。
# もう少し本心を書くと「なぜその様に思うのかがわかりません」
6533:05/03/20 23:12:14
>>64
>お兄ちゃん大好きだよ!

まで読んだ
66デフォルトの名無しさん:05/03/20 23:49:29
どこかで見たような展開になりそうな悪寒
67デフォルトの名無しさん:05/03/20 23:51:37
>>66
愛してます
68デフォルトの名無しさん:05/03/20 23:52:54
69デフォルトの名無しさん:05/03/21 01:05:48
環境は、WindowsMe、BCCです。
str2(ポインタ)のバッファサイズの取得の仕方を教えてください。
下のプログラムだと、当然4と表示されてしまいます。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
char str[32], *str2;
str2 = (char *)malloc(sizeof(char) * 32);
printf("%d %d\n", sizeof(str), sizeof(str2));
free(str2);
return 0;
}
70デフォルトの名無しさん:05/03/21 01:13:29
>>69
ありません
自分で覚えておくように
71デフォルトの名無しさん:05/03/21 01:19:18
先生、ぼくの頭では、そんな細かい数字まで覚えてられません。
7269:05/03/21 01:26:45
>>70>>71
ありがとうございます。ないんですか。残念です。

http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200502/05020040.txt
の真ん中辺りに、以下のような事が書いてあったので、ずっと探してたんですが。
「ポインタだけではその先のバッファサイズを知ることは出来ませんので、
サイズも渡しているワケです。(Win32APIにもそのようなものがある)」
73デフォルトの名無しさん:05/03/21 01:32:32
リンク先は読むのやめたが
引用した部分の最初の行が読めないのか?
74デフォルトの名無しさん:05/03/21 01:43:09
ハンドルの取り扱い?が良くわからないので教えてください。BCC で、WinXP
IMEの状態が直接入力かそうでないかを判別したいです。

#include<windows.h>
#include<imm.h>

int WINAPI WinMain(
HINSTANCE hInstance ,
HINSTANCE hPrevInstance ,
LPSTR lpCmdLine ,
int nCmdShow )
{
HIMC hImc = ImmGetContext(hInstance);
BOOL bRet = ImmGetOpenStatus(hImc);
ImmReleaseContext(hInstance,hImc);
return bRet;
}

このコードでは 10行目と12行目で問題のあるポインタの変換という警告が出ます。
75デフォルトの名無しさん:05/03/21 01:45:17
void *から他のポインタ型の変数へは
Cなら警告なしで代入可能
C++は代入不可能
7674:05/03/21 01:51:38
>>75 Cとしてコンパイルすればいいということですか?
77デフォルトの名無しさん:05/03/21 02:43:47
>76
キャスト(static_cast)して代入
78デフォルトの名無しさん:05/03/21 02:48:56
>>74
HWND を渡すべきところに HINSTANCE を渡しているから、型が合わない。
ふつうにコードが間違っている可能性が高い。

Cでコンパイルすると、こういう間違ったコードでも警告だけで済んでしまうから、
なるべくC++にしとけ。
79デフォルトの名無しさん:2005/03/21(月) 04:32:30
class CListensoc : public CAsyncSocket {
public:
 CListensoc();
 virtual ~CListensoc();
 virtual void OnAccept(int nErrorCode);
 virtual void OnReceive(int nErrorCode);
};
void CListensoc::OnAccept(int nErrorCode) {
 CAsyncSocket::OnAccept(nErrorCode);
}
void CListensoc::OnReceive(int nErrorCode) {
 CAsyncSocket::OnReceive(nErrorCode);//呼ばれない
}
class hoge {
 CListensoc listen;
 hoge::hoge() {
  listen.Create(9000);
  listen.Listen();
 }
 hoge::test() {
  char msg[64];
  sprintf(msg, "%s", "test");
  int ret = listen.Send(msg, sizeof(msg));//戻り値は-1
 }
};
このような構成でhogeをnewしてtest()を実行しましたが、OnReceive()が呼ばれません。
環境はWindows2000sp4、VC++6.0sp5、目的はソケット通信の動作を理解するためのテストで、下記のサンプルプログラムを参考にサーバー側の処理を弄っています。
http://support.microsoft.com/default.aspx?scid=kb;ja;175668

サンプルのClient側のconnectに対してOnAccept()が動作しているので、同じようにCAsyncSocketのOnReceive()をオーバーライドすればいいかと思ったのですが・・・
間違っている箇所などを教えて頂けますでしょうか。よろしくお願いします。
80デフォルトの名無しさん:2005/03/21(月) 06:24:03
>>79
http://www.ne.jp/asahi/yamashita/programming/tips/socket.html
Listen するソケットとは別に、接続を受け入れ、データを送受信するソケットを用意する必要がある。
81デフォルトの名無しさん:2005/03/21(月) 07:11:39
>>72
Win32APIのHeap系関数ならHeapSize()がある。
(Global系とLocal系にもないわけではないけど)
82デフォルトの名無しさん:2005/03/21(月) 09:57:24
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdndeepc/htm/deep08032000.asp
これがスラスラ読めたら、余裕でプログラマになれますか?
真面目に質問です。
83デフォルトの名無しさん:2005/03/21(月) 10:21:08
読めない香具師はC++使えているとは言えないと思うが…
つかコンパイルも通らないコードの載せるのってどうよ>MS
84デフォルトの名無しさん:2005/03/21(月) 11:05:17
=== 演算子って何?
85デフォルトの名無しさん:2005/03/21(月) 11:14:39
>>83
すごいですね。尊敬します。
今難しい問題に取り組んでいるのですが、
これの答えはわかりますか?

(Q)これの実行結果を答えなさい。

multiset<int> ms;
for ( int i = 0; i < 3; ++i )
for ( int j = 0; j < 3; ++j )
ms.insert(j);
const int x = 1;
typedef multiset<int>::iterator iter;
pair<iter,iter> range;
range = ms.equal_range(x);
while ( range.first != range.second ) {
cout << *range.first << ' ';
++range.first;
}
86デフォルトの名無しさん:2005/03/21(月) 11:15:46
>>85
コードがあるなら試せばいいじゃない
87デフォルトの名無しさん:2005/03/21(月) 11:18:42
宿題だったりして
88デフォルトの名無しさん:2005/03/21(月) 11:21:53
実行せずに、どうやって動くのか想像しろと。
なんでも動かせばいいってもんじゃない。
89デフォルトの名無しさん:2005/03/21(月) 11:29:11
>読めない香具師はC++使えているとは言えないと思うが…

イタタ・・・
9069:2005/03/21(月) 12:11:14
ありがとうございます。

>>73
文章力がなくて申し訳ないです。

>>81
それでいけそうです。
91デフォルトの名無しさん:2005/03/21(月) 12:35:59
>>89
読めない奴こそ痛いよ、実際。
92デフォルトの名無しさん:2005/03/21(月) 12:39:42
>>84
C++ には === 演算子なんてない。

PHP にはあったな。意味合い的には boost::addressof(lhs) == boost::addressof(rhs)。
93デフォルトの名無しさん:2005/03/21(月) 12:46:42
>>85
それSTLだろ
94デフォルトの名無しさん:2005/03/21(月) 12:48:10
try 〜 catch は遅いって聞いたんだけど
どの程度遅くなるんでしょうか?
95デフォルトの名無しさん:2005/03/21(月) 12:59:48
>>94
環境による
96デフォルトの名無しさん:2005/03/21(月) 13:00:28
やっぱgotoだよね
97デフォルトの名無しさん:2005/03/21(月) 13:01:13
>>90
まさかとは思うが、mallocで確保したものをHeapSize()しようとしてないだろうな?
98デフォルトの名無しさん:2005/03/21(月) 13:02:39
例外ってそんなに頻繁に呼び出すもんじゃないだろ。
せいぜいループの外で使うぐらいだ。
9984:2005/03/21(月) 13:03:21
>>92
http://jbbs.livedoor.jp/bbs/read.cgi/computer/5651/1048756904/r45-47
を見て、知らない間に新しい演算子が追加されたのかと思ってました。
アリガトン
100デフォルトの名無しさん:2005/03/21(月) 13:03:27
ある人にC言語の質問をしたいのですが、何か面白いソースコードはないでしょうか?
101デフォルトの名無しさん:2005/03/21(月) 13:03:39
>>92
$a === $b 等しい $a が $b に等しく同じ型でである場合に TRUE。(PHP 4のみ)
102デフォルトの名無しさん:2005/03/21(月) 13:04:51
LPCTSTR str[] = {TEXT("アアア") ,TEXT("イイイ") }

str[0]>str[1] ってやった場合コンパイラは何を基準に比較すんの?
10392:2005/03/21(月) 13:05:10
>>101
あー、そうだった。
=== がアドレス比較演算子なのは、今俺が作ってる俺言語の仕様だ(゚Д゚;)
104デフォルトの名無しさん:2005/03/21(月) 13:06:57
嘘かもしれんがJavaScriptにもあったろ?
文字列比較とかで参照レベルで同じ値ならtrueじゃなかった?
105デフォルトの名無しさん:2005/03/21(月) 13:08:03
>>100
ぎゃふんと言わせたいからってこと?
自分で理解できないコード持ち出してどうする
106デフォルトの名無しさん:2005/03/21(月) 13:14:56
>>102
アドレス
107デフォルトの名無しさん:2005/03/21(月) 13:15:20
>100
GUIベースのプログラムを作ってみたいのですが、最初はどんなものを作ればいいですか?

とかと同類な質問ですね
108デフォルトの名無しさん:2005/03/21(月) 13:17:08
>>107
ラーメンタイマー(アナログ)
109デフォルトの名無しさん:2005/03/21(月) 13:17:40
は?アドレス?俺は配列の中身が昇順にソートするようにしてるけど
アドレスで比較してるなら全く変わらないけど微妙に変わったぞ
110デフォルトの名無しさん:2005/03/21(月) 13:20:05
オブジェクトのnullに対して hoge===null はtrueだっけか
どっかにnullというオブジェクトがひっそりと生きてるんだろうな
111デフォルトの名無しさん:2005/03/21(月) 13:22:29
今、俺はこれを勉強してる
http://www005.upp.so-net.ne.jp/episteme/html/stlprog/

今日にはマスターできる
俺に嫉妬するなよ(w
112デフォルトの名無しさん:2005/03/21(月) 13:23:49
std::vector<Hoge>::iteratorとHoge*ってどう違うん?
113デフォルトの名無しさん:2005/03/21(月) 13:43:00
>>112
vectorのiteratorに絞っての質問?
114デフォルトの名無しさん:2005/03/21(月) 13:45:11
>>113
そう。ランダムアクセスイテレータとポインタの違い
115デフォルトの名無しさん:2005/03/21(月) 14:14:26
>>98
例外を呼んだときにコストがかかるという認識で良いのですね?
呼ばなければ遅くはならないと。
11679:2005/03/21(月) 14:23:28
>>80
大変分かりやすい例をありがとうございました。
11733:2005/03/21(月) 14:28:51
>>115
throwしなくてもtry通るときにはコストがかかる
118デフォルトの名無しさん:2005/03/21(月) 14:31:56
>>114
vectorの各要素はメモリ上に連続して配置されることが保証されているけど、
ランダムアクセスイテレータを持つ連中がすべてそうなわけではない。
srd::string hoge = "fugafuga";
char* p = &hoge[0];
++p;
なんて時、p == &hoge[1]とは限らない。std::dequeもそう。

言うまでもなく、「連続したメモリ上を、型サイズを頼りに前後する」以外の
要素の舐め方が必要な場合、ポインタ演算ではどうしようもない。イテレータの出番。
んで、STLコンテナの中でvectorだけポインタでもデータを舐められるからといって、
こいつにだけiteratorを持たせないってのは都合が悪い。だから持っている。

std::vector<Hoge>::iteratorは、単にHoge*のtypedefである場合もあるね。
119デフォルトの名無しさん:2005/03/21(月) 14:43:04
> 要素の舐め方が必要な場合
コボラーの方でつか?
120デフォルトの名無しさん:2005/03/21(月) 14:46:51
JavaScriptで操作できるアプリケーション(Sleipnir)って結構あるけど、
どういうロジックなの?COMとかいうやつなのかな?
121デフォルトの名無しさん:2005/03/21(月) 17:57:27
とにかくコンテナ内データを操作したけりゃ、イテレータを使えばいいだけのこと。
122デフォルトの名無しさん:2005/03/21(月) 18:00:33
>>120その通り
123デフォルトの名無しさん:2005/03/21(月) 18:02:44
COMとDLLってなにがちがうん?

すまん、初心者質問で。
同じプラグインなものだとおもってた。
124デフォルトの名無しさん:2005/03/21(月) 18:04:27
>>109
str[0]はTEXT("アアア")へ、str[1]はTEXT("イイイ")へのアドレス値を保持してる。
TEXT("アアア")とTEXT("イイイ")は何処に確保されるかはコンパイラの勝手。
125デフォルトの名無しさん:2005/03/21(月) 18:11:13
>>117 それも、環境による。
126デフォルトの名無しさん:2005/03/21(月) 18:12:23
>>102
同じ配列上にないポインタに対する比較演算子の結果は不定。
127デフォルトの名無しさん:2005/03/21(月) 18:55:45
class Unko {
public:
 int *p;
};

const Unko a;
int *pp

*(a->p) = 1;  // Error?
p = pp;     // Error?

constなオブジェクト内のポインタって
const int* const p;
ということになってしまうのでしょうか?
ちょっとコンパイラによって挙動が変わっていたので、
C++の言語仕様的にはどうなんだろうと思ったんですが。。


PS. pc5鯖復活おめ
128デフォルトの名無しさん:2005/03/21(月) 18:58:22
>>127
a->p は int* const

Cの頃から変わってない。
これの挙動が変わるって、ひどいコンパイラだな。
コンパイラ(バージョン含む)晒せ。
129デフォルトの名無しさん:2005/03/21(月) 19:01:10
a->pじゃなくてa.pだよね?
130デフォルトの名無しさん:2005/03/21(月) 19:03:46
>>128
Cの頃から?
131128:2005/03/21(月) 19:10:54
>>129
ほんとだ。ごめん。

>>130
struct Unko { int* p; }
const struct Unko a;
*a.p = 0;
132デフォルトの名無しさん:2005/03/21(月) 19:11:16
構造体があるし
133デフォルトの名無しさん:2005/03/21(月) 19:18:56
>>131
constはC++が先
134デフォルトの名無しさん:2005/03/21(月) 19:26:32
 初心者、というより厨な質問です。識者の方のご助言・ご教示いただきたいと思います。
質問の要旨は、Linux(Red Hat 64ビット版)、CPUはx86_64、コンパイラはgccの3.4.3で、
あるプロセスの最大消費メモリの計測を行いたいのです。
 ちなみにSolaris8ではこんな感じで実装しています(一部略)。
-------------------------------------------------------------------------
prstatus_t status_proc;
sprintf(fnname, "/proc/%ld", (long)pid);
fd = open(fname, O_RDONLY);
(中略)
err = ioctl(fd, PIOCSTATUS, &status_proc) ;
if( err == -1) {
fprintf(stderr, "failed to measure memory size.\n")
close(fd);
return -1; /* error */
};
fprintf(stdout, "used memory %ld\n", status_proc.pr_brksize);
close(fd);
return 0; /* success */
--------------------------------------------------------------------------
 ざっと調べた限りでは、/proc/PID/statusの"VmSize:"の項に表示される値がプロセス
(プログラム)の使用メモリかと思ったのですが、どうも違うようです。なおPIDはモニタした
いプロセスIDを意味しています。
 Linuxでは他に使用メモリ値を取得する方法があるのでしょうか?よろしくお願いします。
135デフォルトの名無しさん:2005/03/21(月) 19:27:56
>>125
ちなみにWindowsXP + VC6だと?
136128:2005/03/21(月) 19:34:40
>>133
そうだな。
「ANSI C の頃から変わってない」ってことでいいか?
137デフォルトの名無しさん:2005/03/21(月) 19:36:11
>>135 VC++ の try は通るだけでコストがかかる。
138デフォルトの名無しさん:2005/03/21(月) 19:36:14
Cの頃ってなんだよタコ
139135:2005/03/21(月) 20:37:24
ありがと
140デフォルトの名無しさん:2005/03/21(月) 20:43:59
ふはは おい、俺の壮大なつりに誰も気づいてないぜ こりゃ笑えるwww
と全然関係ないスレで釣り宣言
141デフォルトの名無しさん:2005/03/22(火) 21:21:01
>>84
ちょい乗り遅れたが、verilog-HDLにもある。
不定、Hi-Zも一致。
142デフォルトの名無しさん:2005/03/22(火) 21:32:52
C++質問 :
Hoge hoge;
Hoge& r_hoge = hoge;
Hoge* p_hoge = &hoge;

r_hoge で hoge を指せるのに、 p_hoge を使うことってそんなにあるの?
(r_hoge では無理ってのもあるんだろうけれど)

自分は java からプログラミング始めたんで、
r_hoge はまぁわかるが、
*p_hoge めんどうなだけだと思うのだが。
143デフォルトの名無しさん:2005/03/22(火) 21:57:43
明確に使う理由は2つ
・NULLが代入できる
・別の対象を指すことが出来る
これらは、「C++の参照」が「他言語の参照」と異なる性格の概念であるため。

また、消極的な理由として
・Cプログラマが見ても理解しやすい
・->と.の違い(参照時のコスト)が明確になる
等もある。

なお、(*p_hoge).memberなどとして使う事は殆どない。
ポインタやメモリ配置について理解する気がないのなら
そのままJavaをやってれば良い。
144142:2005/03/22(火) 22:53:44
まず 143 ありがと。

[別の対象を指すことが出来る]ってのが分からない。
どゆこと? ポインタならできるってことだから、

Hoge& r_hoge = hoge1;
Hoge hoge2;
r_hoge = hoge2;

ではないんよね?

あとコスト。

r_hoge.member
p_hoge->member
(*p_hoge).member

で処理の差がでるってこと?

計算ライブラリ使うためにC,C++を始めたばかり。
ポインタならでは、な所を理解したく思ってる。

そのままJavaやってろなんて言わずに教えておくれ。
145デフォルトの名無しさん:2005/03/22(火) 23:02:13
>>144
ん、

>Hoge& r_hoge = hoge1;
>Hoge hoge2;
>r_hoge = hoge2;

これ何をしてるか分かってる?
146144:2005/03/22(火) 23:16:02
言われるまでわからんやった。
hoge1 に hoge2 をコピーしてるのね。
147144:2005/03/22(火) 23:22:32
ということで 143 の
別の対象を指すことが出来る
は、"ポインタでないと"を理解できた。
ありがと。
14874:2005/03/22(火) 23:36:26
追伸です。コンパイラをvc2003に変えてコードもちょっと変えたらコンパイル出来ました。
しかしメモ帳をアクティブにしてAutoHotKeyから呼び出してみた結果、IMEがON/OFF どっちでもbRetには0が返ってきます。
GetActiveWindow() でアクティブなハンドルが取得できてないようですが理由がわかりません。有識者の方原因がわかればお願いします。

#include "stdafx.h"
#include <windows.h>
#include <imm.h>

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
HWND hWND = GetActiveWindow();
HIMC hIMC = ImmGetContext(hWND);
BOOL bRet = ImmGetOpenStatus(hIMC);
ImmReleaseContext(hWND,hIMC);
return bRet;
}
149デフォルトの名無しさん:2005/03/22(火) 23:46:46
getchar()は一文字入力、putchar()は一文字出力なのに、
なんで一文字以上の入出力ができてしまうのですか?
150デフォルトの名無しさん:2005/03/22(火) 23:47:52
>>149
どうやって?
151デフォルトの名無しさん:2005/03/22(火) 23:49:59
>>144
コストについて。

>r_hoge.member
>p_hoge->member

VC++では参照はポインタとして実装されてるのでコストは変わらない。(と思う・・・)
でもぱっと見r_hogeが実体なのか参照なのか区別が付かないため
間接的にアクセスしてることを明確にするためにポインタを使うことがある。
ということを>>143は言いたかったのではないか?

また、

>p_hoge->member
>(*p_hoge).member

は同じ意味なので生成されるコードは変わらないはず。
152144:2005/03/22(火) 23:58:28
ありがと。
15374:2005/03/23(水) 00:01:40
GetActiveWindow のところを
GetForegroundWindow に変えてもハンドルが取れない… なぜ?
154デフォルトの名無しさん:2005/03/23(水) 00:14:52
>>153
スレ違いなんだよ。
前回はお茶目な回答者が回答しちゃったんでスルーしたけど、
これ以上はWinAPIすれに移動してくれ。
155デフォルトの名無しさん:2005/03/23(水) 00:24:01
>>1にWINAPIもOKとかいてある以上、スレ違いではないな。
ただWin32APIスレのほうがちゃんとした回答がくると思うが。
156デフォルトの名無しさん:2005/03/23(水) 08:06:43
現に求められている答えが帰ってきてないからな。
ああ、俺もわからない。
157デフォルトの名無しさん:2005/03/23(水) 08:57:41
スレ違いじゃないのに出てくる自治厨ってw
158デフォルトの名無しさん:2005/03/23(水) 08:59:36
math.h とか float.h とかで NAN が定義されていたり、
マクロで #define NAN (0.0/0.0) なんて定義されていたりするけど、
移植性を重視すると float/double の Not a Number は
どうやって表現するのがいいの?

nan() が正解?
159デフォルトの名無しさん:2005/03/23(水) 09:03:36
>>158
C++なら
std::numeric_limits<float>::signaling_NaN()
std::numeric_limits<double>::signaling_NaN()
160デフォルトの名無しさん:2005/03/23(水) 09:33:21
Array Valiant型の中身をchar型か、
AnsiString型に取り出したいのですが、
どうやったらできますか?
ぐぐっても配列バリアントが見つからない…
161デフォルトの名無しさん:2005/03/23(水) 10:03:14
>>160
BCBか?
Variantの配列は知らんがVariantにAnsiString演算子あるだろ
162デフォルトの名無しさん:2005/03/23(水) 10:17:06
>>161
BCBです。
VarToStrって関数を使って、
AnsiString IPAdress;
IPAdress = VarToStr(Result.Exec(PropertyGet("IPAdress")));
こんな感じで突っ込むと、
オートメーションオブジェクトをサポートしてませんってエラーでます
ほかのやつなんでしょうか?
163デフォルトの名無しさん:2005/03/23(水) 11:33:20
スレ違い。
BCBはこっち。

C++Builder相談室 Part13
http://pc8.2ch.net/test/read.cgi/tech/1108468718/l50
164デフォルトの名無しさん:2005/03/23(水) 12:52:50
EOFの値ってどうやって代入するの?
165デフォルトの名無しさん:2005/03/23(水) 12:54:50
>>164
EOFなんて値はありません
166デフォルトの名無しさん:2005/03/23(水) 13:01:24
>>164
普通に入れたいところに0x1A入れる。
167デフォルトの名無しさん:2005/03/23(水) 13:15:47
WIN32APIでスクリーンショットを取得できる関数を教えてください
168デフォルトの名無しさん:2005/03/23(水) 13:45:28
#include <stdio.h>
#include <stdlib.h>

int batcho(int tfloor,int tpos);

int main(void)
{
(中略)
return 0;
}

int batcho(int tfloor,int tpos)
{
int mongroup;
(中略)
return mongroup;
}

これだと2番目のint batchoと書いてある行でsyntax errorが出て、
tfloorとtposが宣言されていないことになるらしく、コンパイルできません。
環境はWinMeにLSI C-86です。
169デフォルトの名無しさん:2005/03/23(水) 13:46:34
sage消し忘れました。
スマソ。
170デフォルトの名無しさん:2005/03/23(水) 13:53:35
>>167
よく分からん。jpg読み込みたいってこと?
171デフォルトの名無しさん:2005/03/23(水) 13:56:56
>>170
馬鹿はでてこないでください
172デフォルトの名無しさん:2005/03/23(水) 13:57:43
>>167
デスクトップのデバイスコンテキストハンドル取ってこい
173デフォルトの名無しさん:2005/03/23(水) 14:21:07
Win32スレの方がふさわしい。
言語とAPIの区別がつかないんだろうか?
174デフォルトの名無しさん:2005/03/23(水) 14:29:10
>>172
ありがとうございます

>>173
すいません、スレ一覧をよく見てませんでした
175デフォルトの名無しさん:2005/03/23(水) 14:46:38
>>168
LSI C-86は知らんが、そのコードは問題ない。
(中略) の部分で何かミスしてると思われ。
176デフォルトの名無しさん:2005/03/23(水) 14:49:02
tfloor, tposのtってなんすか?
177168:2005/03/23(水) 16:22:19
>>175
サンクス。
もう少し自分で考えてみます。

>>176
漏れも忘れたw
178デフォルトの名無しさん:2005/03/23(水) 20:44:42
>>173
1も読めないバカは死んでください。

スレ違いといいたいだけならC++本スレに引っ込んでてください。
179デフォルトの名無しさん:2005/03/23(水) 20:51:03
>>173
はっきり言えばこのスレはその程度の区別もつけられない*初心者*のためのスレだ。
180デフォルトの名無しさん:2005/03/23(水) 21:40:07
>>179
だから適切なスレに誘導しているんじゃん。
ここは言語スレだよ。
181デフォルトの名無しさん:2005/03/23(水) 21:51:13
どっちでもいいじゃん
答えたいやつは答える
誘導するやつは誘導
好きにしろ
182デフォルトの名無しさん:2005/03/23(水) 23:55:47
>>177
int batcho(int,int);
183デフォルトの名無しさん:2005/03/24(木) 00:55:04
>>168
エラーメッセージはコピペしろ。
184デフォルトの名無しさん:2005/03/24(木) 01:00:33
>>168
手前に全角スペースでも入り込んでるんじゃないのか?
185デフォルトの名無しさん:2005/03/24(木) 01:11:13
つーか、初心者がLSI-C86なんて使うなや。
186デフォルトの名無しさん:2005/03/24(木) 01:17:56
雑誌の付録に付いてるからじゃない?
187デフォルトの名無しさん:2005/03/24(木) 01:31:05
何十年前の雑誌だよ……
188デフォルトの名無しさん:2005/03/24(木) 01:57:13
>>187
> 何十年前の雑誌だよ……
Cマガ
189デフォルトの名無しさん:2005/03/24(木) 03:11:32
>>188
ちょっと待て。昔のCマガについていたのは知っている。
問題は、最近でもついてくるのかどうかだ。
190デフォルトの名無しさん:2005/03/24(木) 08:52:19
>>163
環境依存OKなんで、いけると思ってました。
失礼しました。
191デフォルトの名無しさん:2005/03/24(木) 12:26:18
ニャホ・ニャホタマクロー♪が頭に流れてて消えないよ〜...orz
192デフォルトの名無しさん:2005/03/24(木) 15:28:52
よくゲームである一文字ずつ表示するプログラムが書けません。
取り合えず作ってみたのですが

TCHAR mes[100] = "あいうえおかきくけこさしすせそたちつてと";
int count = 0;
while(mes[count] != '\0')
{
 count += 2;
 TextOut(hdc, 0, 0, mes, count);
 Sleep(50);
}

これだとまず「あいうえおかきくけこさしすせ」までが一気に表示されて、
その後「そたちつてと」が一気に表示されるという不可思議なリズムになってしまいます。
どうすればいいでしょうか?
193デフォルトの名無しさん:2005/03/24(木) 16:06:21
Sleepは50ミリ秒でいいのか?
194デフォルトの名無しさん:2005/03/24(木) 22:33:27
Sleep(1)って本当に1ミリ秒?
195デフォルトの名無しさん:2005/03/24(木) 22:37:44
糞早いマシンならそうかもね
ナノ秒単位で求めだしたし
196デフォルトの名無しさん:2005/03/24(木) 22:44:03
Sleepは寝過ごすことがあるのであまり当てにしないように
197デフォルトの名無しさん:2005/03/24(木) 22:56:59
ギャバンとシャリバンの蒸着時間を語るスレはここですか?
198デフォルトの名無しさん:2005/03/24(木) 23:46:23
以前に聞いた者なのですが、もう一度お願いします。
#include<stdio.h>

main()
{
int a;

while((a=getchar())!=EOF)
{
putchar(a);
}

}

この時のEOFというのは、何の値のことなのでしょう?
199デフォルトの名無しさん:2005/03/24(木) 23:50:35
>>198
市ね無能
200デフォルトの名無しさん:2005/03/24(木) 23:51:38
End Of Streamとでも言いましょうか・・・
結局はデータが入ってないって事です。
< input.txtみたいなリダイレクトなら言葉どおりEOFだね
201デフォルトの名無しさん:2005/03/25(金) 00:01:02
とりあえず、int a より、char a のほうがいいとおもうよ。
202デフォルトの名無しさん:2005/03/25(金) 00:04:55
マクロを知らないとは言わせない
203デフォルトの名無しさん:2005/03/25(金) 00:08:34
>>201
文字コードはunsigned charでEOFは-1だからgetchar()はintで受けるんですが?
204デフォルトの名無しさん:2005/03/25(金) 00:50:38
>>201,203
ISO/IEC 9899:1999
6.4.4.4 Character constants
 -2
  An integer character constant is a sequence of one or more multibyte
  characters enclosed in single-quotes, as in 'x'.
 -10
  An integer character constant has type int.
7.19.7.6 The getchar function
 -1
  #include <stdio.h>
  int getchar(void);
205デフォルトの名無しさん:2005/03/25(金) 00:58:23
>>201
バカ丸出しワロス
206デフォルトの名無しさん:2005/03/25(金) 01:09:35
>>198
printf( "EOF=%d\n", EOF);
207デフォルトの名無しさん:2005/03/25(金) 04:38:37
MS-DOSでv-syncを待って描画したいのですがHDDが飛んでしまい
参考にしたソースや作成したソースが消えちゃいました。

やりたい事は、ワーヤーフレームを1/60秒で描画する事です。
どなたか教えてくださいまし・・・

よろしくお願いいたします・・・

環境はDOS/V、BC4
208デフォルトの名無しさん:2005/03/25(金) 04:42:01
>>207
追記、v-sync待ちの部分だけでいいです。
たしか、2-3行だった記憶が・・・
209デフォルトの名無しさん:2005/03/25(金) 05:38:19
>>207
inpで0x3DAを8でANDかな
210デフォルトの名無しさん:2005/03/25(金) 06:04:35
>>209
このbitを監視ですね。
ありがとうございました〜〜〜〜!!
211デフォルトの名無しさん:2005/03/25(金) 12:32:46
>>207
激しくスレ違いだろ。
212デフォルトの名無しさん:2005/03/25(金) 12:38:38
213デフォルトの名無しさん:2005/03/25(金) 12:44:16
WinAPIの質問は完全に別離してよろしいですかとお伺いを立てろ
そしててめぇでテンプレ修正しろ、な?
214デフォルトの名無しさん:2005/03/25(金) 12:57:29
なんで突然WinAPIの話が出てくるの?
215デフォルトの名無しさん:2005/03/25(金) 13:00:08
>>212
>>179に該当する人物が、v-syncを知っているとは思えない。
216デフォルトの名無しさん:2005/03/25(金) 13:43:34
はじめまして。
無料配布しているCGIを説明通りに書き換えて
使用できる程度の超初心者です。
C言語自体は理解していません。(すみません…)

複数画像をランダムに重複なく表示させたいと思い、
下記のサイトからCGIをダウンロードしたのですが…

http://chama.ne.jp/download/etc/randum/

とても便利なCGIで是非使いたかったのですが、
200×40pixelの画像を15個表示させると、
あまりの負荷に読み込み速度が
尋常じゃない程、遅くなってしまうんです。。。

複数の画像を重複なく表示できるCGIを
無料で配布しているサイトなどを知っている方がいましたら
教えて頂けると大変助かります。
(管理画面などで画像を増やせなくても良いです。)

または、何か良い方法はないものでしょうか?

超が付くほど初心者で…本当に申し訳ありません。
宜しくお願いいたします。
217デフォルトの名無しさん:2005/03/25(金) 13:49:00
すいませんついさっきCはじめたばかりの超初心者なんですが

scanfで変数に値を代入したあと(たとえばaに5、bに8)
c = a*b
としてからprintfでcを表示すると数値がおかしくなるんですが演算子の使い方間違えてますか?
scanfのあとaとbをprintfで表示するとここは正常に表示されます
コンパイルもできているので演算子の使い方だと思ったんですが・・・
調べてもよくわかりません
わかる人お願いします
218デフォルトの名無しさん:2005/03/25(金) 13:55:02
>>217
そう言うときはソースを晒せ。
初心者の「○○と書いたら」ほどあてにならんものはない。
219デフォルトの名無しさん:2005/03/25(金) 13:55:24
>>217
>数値がおかしくなる
を説明してくれ。
220デフォルトの名無しさん:2005/03/25(金) 13:57:12
>>216
思いっきりスペリングミスしたまま公開するような香具師がろくなものを書くわけがないよな。
221デフォルトの名無しさん:2005/03/25(金) 13:58:43
scanfのときa,bに&がない or printfのときcに&を付けた
222デフォルトの名無しさん:2005/03/25(金) 13:59:39
>>214
>213はWinAPIの話と勘違いしたんだろうよ。

>>215
だからと言って、適当なスレがないならここでもいいだろう。
223デフォルトの名無しさん:2005/03/25(金) 14:01:07
173へのレスだ気にするな
224217:2005/03/25(金) 14:11:28
すいません
ソースは↓です
ttp://up.isp.2ch.net/up/a2b51c5255f3.zip

これを実行して合計金額を出そうとすると必ず1245024になってしまいます

225デフォルトの名無しさん:2005/03/25(金) 14:14:16
printf("五つ目の商品の金額を入力してください\n");
scanf("%d",&s5);
printf("何個買いましたか?\n");
scanf("%d",&k5);
g1 = g1+s2*k2;

しかもprintfに&つけてるし・・・
226デフォルトの名無しさん:2005/03/25(金) 14:22:32
( ´д)ヒソ(´д`)ヒソ(д` )
227217:2005/03/25(金) 14:24:42
>>225
・・・
指摘ありがとうございます

なんか自分ではミスってわからないものだと実感した・・・
自分を過信しすぎていたようで

スレ汚しすいませんでした
本当にありがとうございます
228デフォルトの名無しさん:2005/03/25(金) 14:26:12
>>221
定番とは言えおみごとだったな。  と自画自賛。
229デフォルトの名無しさん:2005/03/25(金) 14:27:07
>221が正解か。
230デフォルトの名無しさん:2005/03/25(金) 14:58:53
質問です。
コンソール画面でパスワードなんかを入力させる時、
入力した文字を非表示もしくは代替文字で表示するには
どうすればいいですか?
231デフォルトの名無しさん:2005/03/25(金) 15:01:21
すいません、C言語初心者です。

C言語で「一定時間ウェイトを入れる」にはどうしたら良いですか?
2重ループとか必要ですか?
232デフォルトの名無しさん:2005/03/25(金) 15:07:10
>>230
実装依存。端末制御をする必要があるので、該当環境のスレへどうぞ。

>>231
実装依存。OSに後で起こしてもらう必要があるので、該当環境のスレへどうぞ。
233デフォルトの名無しさん:2005/03/25(金) 15:08:04
>>231
UNIX系ならsleep、WindowsならSleep。
forを使った空ループでのウェイトはCPUの無駄遣いだし
CPUの速さでウェイト秒数が変わるので無意味。
その上、空ループだとコンパイラの最適化でループそのものが
コードから消えてしまうかもしれない。
234デフォルトの名無しさん:2005/03/25(金) 15:08:54
WindousならSleep //Sはでっかい
Linux/UNIXはusleep //確かそんなのがあったはず

select( 0, NULL, NULL, NULL, &tv );
ってのを使うのが汎用的
235デフォルトの名無しさん:2005/03/25(金) 15:11:09
プ
236デフォルトの名無しさん:2005/03/25(金) 15:24:24
ためしに、下のようなプログラムを作ったのですが、
「定義されていない識別子です。」というエラーが出ました。
ちなみに、OSはWindows2000でMicrosoft Visual C++ 6.0を使っています。

#include "stdio.h"

int main(){
printf("Hello\n");
Sleep(1000);
printf("World\n");

return 0;
}
237デフォルトの名無しさん:2005/03/25(金) 15:29:24
>>236
#include <Windows.h>
を "stdio.h" の次の行に入れてごらん。
238デフォルトの名無しさん:2005/03/25(金) 15:30:32
#include <stdio.h>
#include <windows.h>

自作のものは""、既存のものは<>と今は覚えておこう
239デフォルトの名無しさん:2005/03/25(金) 15:33:12
>>236
printf()はバッファリングされるかもしれないので、最後に纏めて表示されるかもしれない。
実験目的ならfprintf(stderr, "Hello\n");などとした方がいいかもしれない。
240デフォルトの名無しさん:2005/03/25(金) 15:37:04
printfは必ずfflushされるでしょ?
241デフォルトの名無しさん:2005/03/25(金) 15:42:46
おぉ!できました。
ありがとうございました!
242デフォルトの名無しさん:2005/03/25(金) 15:50:34
>>240
反論するときは確証を得てからにしような。
243217:2005/03/25(金) 16:09:38
すいません先ほどの者です
さっきのはうまくできたんですが次にやっていることがまた・・・

今度はprintfで%dを使い計算結果を表示しようとしています
しかし計算結果が全て0になってしまい表示がうまくできません
(計算を書かないで数値だけだとうまく表示できる)
%dは小数点以下を四捨五入すると本には書いてあるので
計算に小数が入っていても問題ないですよね・・・?

ソースは↓です
ttp://up.isp.2ch.net/up/fe95391e1ee1.zip

またよろしくお願いします。。。
244デフォルトの名無しさん:2005/03/25(金) 16:14:30
>>243
ぼるじょあがC/C++の宿題を片づけますYO! 41代目
http://pc8.2ch.net/test/read.cgi/tech/1109542053/

こっちがオススメ。
245デフォルトの名無しさん:2005/03/25(金) 16:16:25
てかプログラム以前に四則演算ができてないな・・・
まあぼるじょあでどうぞ
246デフォルトの名無しさん:2005/03/25(金) 16:20:13
>>243
printf()は演算結果の型を使用者が保証しないといけない。
%dは整数値を表示しろという指示だが、実数演算を行なうとそのままでは実数値が渡されてしまう。
(int) (2000 + 250 * 1.05)などとして整数化すれば表示はできる。但し、キャストの段階で切り捨てられる。
実数値を四捨五入させたいのなら、%dではなく、%gを使用すればよい。但し、逆に2000ではなく2000.とする必要がある。

つーか、入門書でも読んでこいや。
247デフォルトの名無しさん:2005/03/25(金) 17:03:45
>>244
宿題でもないのに宿題スレに誘導するな。
248デフォルトの名無しさん:2005/03/25(金) 17:42:43
あぁ、春だなぁ…
ん?このスレを見ていったんじゃないよ
249デフォルトの名無しさん:2005/03/25(金) 17:48:45
ここは日記帳じゃないよね
250デフォルトの名無しさん:2005/03/25(金) 18:09:38
小規模のゲーム板で、プログラマ募集してるみたいだよ。
いそげ!陸、海〜なんとかっていうプロジェクト!
251デフォルトの名無しさん:2005/03/25(金) 18:32:48
単純なマクロの間違い(コピペミス?)ですた。
252217:2005/03/26(土) 01:36:29
すいませんレス遅れました

>>246
%dって実数を四捨五入して整数にするんじゃないんですか?
一応「C言語プログラミングの初歩の初歩」っていう本見ながらやってるんですが・・・
「カンマ以下の計算式で得られた計算結果を文字列中の%dの位置に整数として画面に表示させる
この方法では小数点以下は四捨五入されて表示されます」
って書いてあったんですがこれが間違ってます?
253デフォルトの名無しさん:2005/03/26(土) 01:42:35
小数点以下は切り捨て
254デフォルトの名無しさん:2005/03/26(土) 01:50:04
>>252
思いっきり間違っている。本当にそう本に書いてあるとしたら、とんでもないカスだな。
255デフォルトの名無しさん:2005/03/26(土) 03:30:52
double型の配列を0.0で初期化したいんですが、memsetを使うのはどうなんでしょう?
ループをまわすより速そうだし、素人目には問題なく見えるのですが。
256デフォルトの名無しさん:2005/03/26(土) 03:36:28
使用しているコンパイラがIEEE754に準拠した浮動小数処理をしているなら無問題
257デフォルトの名無しさん:2005/03/26(土) 03:41:05
>>255
実際に時間計ってみた?
258デフォルトの名無しさん:2005/03/26(土) 03:49:38
数行のサンプルプログラム自分で作って確認すれば解決する質問ばかりだな。
259デフォルトの名無しさん:2005/03/26(土) 03:52:44
偉そうな割に内容のないレスばかりだな。
260デフォルトの名無しさん:2005/03/26(土) 03:52:58
標準C/C++として問題があるかどうかは解決せんだろうが。
261255:2005/03/26(土) 04:20:45
時間は計ってないや
doubleとfloatの内部での表現は調べたけどね。
262デフォルトの名無しさん:2005/03/26(土) 05:59:42
バイナリでダンプすればすぐわかるじゃん。
263デフォルトの名無しさん:2005/03/26(土) 06:38:45
>>262
速度の話をしているのだよ。
264デフォルトの名無しさん:2005/03/26(土) 06:47:50
>>263
doubleとfloatの内部での表現の話をしているのだよ。
265デフォルトの名無しさん:2005/03/26(土) 06:53:48
試せばいいだけのネタじゃないか。
最適化オプションは付けるなよ。
266デフォルトの名無しさん:2005/03/26(土) 07:00:32
最適化しなくちゃ意味ないと思うが。
267デフォルトの名無しさん:2005/03/26(土) 07:04:55
うはっwwこのmemset何もしてねぇwww
ってコンパイラが余計なことしかねないじゃん
268デフォルトの名無しさん:2005/03/26(土) 07:08:57
>>267
どのような場合において?
269デフォルトの名無しさん:2005/03/26(土) 07:09:50
う〜む、なんで std::bad_alloc は std::exception を直接継承しているんだろう。
意味的には std::runtime_error から継承した方がいいのにな。
そうすりゃ what() メソッドも使えるのに。
270デフォルトの名無しさん:2005/03/26(土) 07:18:47
//こんな場合
//daryはmemset以外使われていない
hoge = timeGetTime();
for (i=0; i<MAX; i++) memset(dary,0,sizeof(dary));
hoge = timeGetTime() - hoge;
271デフォルトの名無しさん:2005/03/26(土) 07:43:54
つーか、基本的にmemsetの実装自体ループ回して代入してるだけだったりするけどな。
関数呼び出しが入る可能性があるだけ不利とも言える。
272デフォルトの名無しさん:2005/03/26(土) 07:44:24
>>270
で?余計なこととは?
273デフォルトの名無しさん:2005/03/26(土) 07:59:02
>>272
forをカットする
274デフォルトの名無しさん:2005/03/26(土) 08:06:52
ちなみにセキュリティ上の理由でメモリの開放前に0で埋めるようなコードを入れることがあるんだが、コンパイラが無駄なコードだと判断してそれを削除するという笑い話がある。
WindowsだとそれをさけるためにSecureZeroMemoryというものまである始末だ。
275デフォルトの名無しさん:2005/03/26(土) 09:20:06
いやだから、memset()が最適化で消えるよりもdoubleの0フィルループが最適化されないほうが問題だろ。
276デフォルトの名無しさん:2005/03/26(土) 10:41:51
Win2000、VC++6.0で作ってるんですが

struct A
{
  BITMAPINFOHEADER Z
  short Y
  long Z
}

こういう構造体を定義して使ってるんですが(メンバ名は適当に変えてます)
何度見ても&Yと&Zの値が、sizeof(short)分ではなくsizeof(long)分増えてることになってるんです
そのせいでオーバーアクセスが起きてるみたいなんですが
なんでshort型のメンバなのに、アドレスがlong分増えるんでしょうか
277デフォルトの名無しさん:2005/03/26(土) 10:42:58
すみません、↑の

BITMAPINFOHEADER Z



BITMAPINFOHEADER X

の間違いです_| ̄|○i|i
278デフォルトの名無しさん:2005/03/26(土) 10:51:26
>>276
VCのデフォルトではlongはlong幅の境界にしか置きませんから正常です。

オーバーアクセスって何のことだい?
現象を詳しく言ってみ?

それだけの情報では君のプログラムがおかしいとしか思えない。
279デフォルトの名無しさん:2005/03/26(土) 11:06:30
>>276
「アライメント パディング」でググってみるとよろし。
280デフォルトの名無しさん:2005/03/26(土) 11:33:41
なるほど、そういう理由だったんですか・・・

>>278
メンバZはlong型配列の先頭要素という位置付けでして、
実際のメモリ上のデータは、X、Y、Z[a]で構成されるとして、
構造体の定義時点では配列の要素数は確定しませんので
GlobalAllocで必要な領域を確保して構造体のポインタにキャストしてアクセスするようにしてます
で、memcpyで別の配列からZへ要素全部一気にコピーするんですが、
デバッグしてメモリーを見てると、その時に最後2バイトぐらい確保した領域からはみ出して書き込んでて
そのせいでWinMain抜けた後にエラーが出てたんです

>>279
ありがとうございます、調べて見ますです
281デフォルトの名無しさん:2005/03/26(土) 11:37:56
連続すみません
アライメント調べて見ました

ということは、↑の構造体の場合
Yをlongにするか、YとZの間にもう一つshort型を入れるかすればいいということですね
282デフォルトの名無しさん:2005/03/26(土) 11:41:27
Visual C++ 2005 Express Edition Betaを使ってCを勉強しています。
下記のサブルーチンを呼ぶだけのプログラムがコンパイルエラーに
なります。

********************
#include "stdafx.h"
#include <stdio.h>

main()
{
func1();
}
void func1()
{
printf("あいうえお");
}
**********************

単純なプログラムだけにどこがおかしいのか見当がつきません。
ちなみにエラーは次の2つです。
・error C3861: 'func1': identifier not found
・error C2365: 'func1' : redefinition; previous definition was 'formerly unknown identifier'

よろしくお願いします。
283デフォルトの名無しさん:2005/03/26(土) 11:44:59
>>282
プロトタイプ宣言するか、func1()をmain()より前に持ってくるかしないと・・・
284デフォルトの名無しさん:2005/03/26(土) 11:47:45
>>282
void func1();

main()
{
    func1();
}

void func1()
{
    printf("あいうえお");
}
コンパイラはソースコードを上から下へ順に読んでいるから、
関数を使うところより先に関数の存在を教えないといけない。
285デフォルトの名無しさん:2005/03/26(土) 11:53:45
>>283
>>284
ありがとうございます。
理解できました。

10年前が初版の独習Cを使っているのですが
そんなこと触れられていませんでした。
新しいのものにするべきなのでしょうか...。
286デフォルトの名無しさん:2005/03/26(土) 11:59:18
>>285
もしかしてC++としてコンパイルされているんじゃないか?
Cなら宣言なしで関数を呼べる。(多分警告は出るだろうが)
287デフォルトの名無しさん:2005/03/26(土) 11:59:33
>>285
C言語は当初プロトタイプ宣言は無かったから、
Cコンパイラならたぶんエラーにならないんじゃないかと思うが
使ってるのがVC++なうえに、たぶんそのソースファイル、拡張子がCPPになってんじゃないのかね?
288デフォルトの名無しさん:2005/03/26(土) 12:01:00
>>281
そんなことしなくても解決できるはずだが。
コピーするときのコピー先アドレスの求め方がおかしいだけジャマイカ。
289285:2005/03/26(土) 12:06:14
>>286
Visual C++を使っているのでそうかもしれません。
Cの後にそのままC++を勉強するつもりなもので。

>>287
おっしゃるとおり拡張子はCPPです。
C++のことを単純にCの上位互換と思っていたのですが、
そう簡単な話ではないのですね。
290デフォルトの名無しさん:2005/03/26(土) 12:17:30
ソースファイルの拡張子でCかC++か判断してるんじゃなかったっけな
file.cならC言語で、file.cppならC++だから
291デフォルトの名無しさん:2005/03/26(土) 12:18:52
>>288
A* pAとしてたとして
memcpy(&pA->Z, コピー元, コピーサイズ)
としてるんですが
292デフォルトの名無しさん:2005/03/26(土) 12:56:02
>>281
VC++なら#pragma packでアライメント調整すればいいと思うが。
つか、アライメントに依存した実装はあまりよろしくないかと。
293デフォルトの名無しさん:2005/03/26(土) 12:57:19
>>276
ところでそんなことするときはZは要素数1の配列にするのが常套手段。(C99なら要素数省略できるけど)
Z[0], Z[1], Z[2]とアクセスできる。
294デフォルトの名無しさん:2005/03/26(土) 13:07:03
>>292
調整して直るかも知れないが、あんまりどころか全然よろしくないだろ。

アライメントに関係なくコピー先アドレスとコピーサイズが正しければオーバーランなどしないんだから。
295デフォルトの名無しさん:2005/03/26(土) 13:08:16
>>292
ちゃんとpragmaで調整できるんですね・・・
調査不足ですみません

>>293
格納する値がlong値なので、long配列以外考えてもみませんでした・・・

色々勉強になりました
ありがとうございます
296デフォルトの名無しさん:2005/03/26(土) 13:37:09
>>276
にセミコロンが1つもないことに誰か突っ込めよ
297デフォルトの名無しさん:2005/03/26(土) 13:39:55
別に突っ込まない、
初心者に対してそんな重箱の隅を突っつくようなことはしない。
298デフォルトの名無しさん:2005/03/26(土) 13:40:33
そういうエラーの話じゃないのでめんどくさいと思って書かなかったんですが、セミコロン
さすがにそんな間違いなんてしませんよ
299デフォルトの名無しさん:2005/03/26(土) 14:40:47
>295
よく判らんがsizeof(struct A)を使え。
300デフォルトの名無しさん:2005/03/26(土) 14:43:11
sizeof(struct A) - sizeof(long)かな?
301デフォルトの名無しさん:2005/03/26(土) 15:32:57
>>295
BITMAPINFOにならってヘッダー部分を別の構造体にすれば絶対安全かな?
それとも、パディングでずれる余地はあるのかなあ?
領域確保は sizeof(struct Header) + データサイズ でスマートになるけど。
302デフォルトの名無しさん:2005/03/26(土) 16:00:36
>GlobalAllocで必要な領域を確保して

ここに間違いがありそう。どうゆう計算してんだろ?
303デフォルトの名無しさん:2005/03/26(土) 16:03:46
>>302
解決済み
304デフォルトの名無しさん:2005/03/26(土) 16:12:36
>>302
パディングのことを知らなかったので、
パディングの分の2バイトを計算せずにGlobalAllocしてたました
305デフォルトの名無しさん:2005/03/26(土) 17:00:29
ということはsizeof使わずに、メンバ変数のサイズを数えたのか?アホやな
306デフォルトの名無しさん:2005/03/26(土) 17:30:00
アホですみません(´・ω・`)
307デフォルトの名無しさん:2005/03/26(土) 17:36:47
>>276
セミコロンがないじゃないか!
308デフォルトの名無しさん:2005/03/26(土) 17:38:23
いいんだよ無くても
309デフォルトの名無しさん:2005/03/26(土) 23:49:47
Visual C++で勉強している者です。
次のプログラムのfunc1()をプロトタイプ宣言するには
どのようにすればよいでしょうか。
戻り値がreturnだけの場合はどの型にすればよいかわかりません。
よろしくお願いします。


/*******************/
#include "stdafx.h"
#include <stdio.h>


main()
{
func1();
}

func1()
{
printf("表示される");
return;
printf("表示されない");
}
/*******************/
310デフォルトの名無しさん:2005/03/26(土) 23:54:11
>>309
>>282と同一人物か?
まぁ別人でもどうでもいいが

returnは戻り値じゃない
returnはその関数をそこで終わらせて、必要なら戻り値を呼び出し元に渡す命令
returnの後に続けて変数や定数を書くことで初めて戻り値が有るということになる
returnだけ書いた場合は、そこで関数が終わるだけで、戻り値は無い
つまり関数の戻り値定義はvoid
よって↓になる

void func1();
311デフォルトの名無しさん:2005/03/27(日) 00:20:54
void func1(void);
312デフォルトの名無しさん:2005/03/27(日) 00:42:55
>>309
C言語の入門書を1冊ぐらいは読んだ方がいいと思う。
勉強始めて2ヶ月の俺が言ってみる。
313デフォルトの名無しさん:2005/03/27(日) 00:44:39
C,C++,VisualC++を勉強しようとしているものなのです。
マイクロソフトのVisualC++ Toolkit2003を使おうかとおもっているのですが
C,C++に使っても問題ないですよね?

なんか不都合とかあるんでしょうか?

もしくは、こっちのほうがいいよとかってありますか?
314デフォルトの名無しさん:2005/03/27(日) 00:54:03
>>313
学生さんですか?
お歳をききたい。
315デフォルトの名無しさん:2005/03/27(日) 00:55:15
VisualC++ Toolkitでは所謂VisualC++(MFC/ATL/WTL)のプログラミングが
できないことを理解しているなら、それでいいと思うけど。C++やるなら充分。
316デフォルトの名無しさん:2005/03/27(日) 00:55:41
年?   ・・・・21
317デフォルトの名無しさん:2005/03/27(日) 01:00:52
あ・・・VisualC++はできないんだ・・・
理解してなかった。 なんでこんなにややこしい名前ついてるんだろう。

まぁ、当座はC++やるんで、関係ないっちゃ関係ないですが
318デフォルトの名無しさん:2005/03/27(日) 01:06:40
>>317
アレはVC++の拡張用のコンパイラだった気がする
319デフォルトの名無しさん:2005/03/27(日) 01:09:19
プログラマもと(・∀・)なごに、只今質問中。
まだ返事は来ません。
まー、近いうちにくるでしょうが・・・。
問題が簡単すぎるので。

http://game10.2ch.net/test/read.cgi/ghard/1111741637/814
320デフォルトの名無しさん:2005/03/27(日) 01:13:19
>>319
ワロタ
そんなもの問題になるのかw
簡単ってレベルじゃねー
321デフォルトの名無しさん:2005/03/27(日) 01:17:46
>>319
俺でも、本ひぱりだしてきたら解けるな。
(素ではわからんあたりがかなしい)


>>314
年聞いて何がしたかったんだろう?
322デフォルトの名無しさん:2005/03/27(日) 01:19:32
クラスのプライベート変数で、かつconstにしたい場合はどうすればよいのでしょうか?
323デフォルトの名無しさん:2005/03/27(日) 01:23:10
>>322
コンストラクタでイニシャライザを使って初期化。
class hoge{
    const int i;
public:
    hoge(int x) i(x){}
//...
324デフォルトの名無しさん:2005/03/27(日) 01:24:02
>>322
こんな感じ
class Hoge
{
int const hoge ;
Hoge() : hoge( 10 ) {}
}
325デフォルトの名無しさん:2005/03/27(日) 02:05:51
>>322
おれもそれ知りたかったところ。
>>323, >>324 thx.

ついでにこれ↓の悪いところ教えてくれ。

class Hoge{
private:
static const int hoge = 10;
public:
...
}
326デフォルトの名無しさん:2005/03/27(日) 02:16:33
>>325
class Hoge{
private:
static const int hoge;
public:
...
}
static const int Hoge::hoge = 10;
327325:2005/03/27(日) 03:07:15
>>326 thx
328デフォルトの名無しさん:2005/03/27(日) 03:23:57
>325
>悪いところ
VC6
329325:2005/03/27(日) 03:40:52
>>328 VC6 ってなんだ?
330325:2005/03/27(日) 03:43:28
MSのやつか。使ってないよ。
331デフォルトの名無しさん:2005/03/27(日) 10:10:39
>>325
それはそれで正しい。
ただしhogeのアドレスが必要になる場合は>>326
332デフォルトの名無しさん:2005/03/27(日) 10:12:09
>>271
最近のCPUに対応していればループどころか
ブロック代入命令で一発だろ?
古のmovs系列の....



違うの?
333デフォルトの名無しさん:2005/03/27(日) 13:35:13
>>332
ある実装を見てみるとまずDWORDサイズでmovsして端数分はバイト単位にしてた。
334デフォルトの名無しさん:2005/03/27(日) 15:43:14
>>318
Platform SDKとかDirectX SDKと一緒に、普通に使ってるけど。
開発環境というか、ホントにコンパイルするためだけの一式というか。
335325:2005/03/27(日) 17:18:47
>>331 thx
336309:2005/03/27(日) 17:34:09
>>310
282と同一人物です。
void func1();
でエラーだったので質問してみたのですが
改めて試すとOKでした。
こちらの単純ミスだったようです。すいません。

>>311
こんな書き方もあるんですね。
勉強になります。

>>312
3、4年前に入門書は一通り勉強し、
ブランクがあるので復習がてら勉強しています。
ともかく、あまりに基本的な質問を連発してすいませんでした。
今後はもっと調べてから質問します。
337デフォルトの名無しさん:2005/03/27(日) 19:41:31
>>336
Cだとそれぞれ意味が違う。
void func1();にすると引数は不定ということを表す。(C++では下と同じ意味になる)
void func1(void);だと引数は無いということを表す。
338デフォルトの名無しさん:2005/03/28(月) 08:33:00
doubleをstringに変換する方法を教えてください
339デフォルトの名無しさん:2005/03/28(月) 08:47:59
double d;
string s = (string)d;
340デフォルトの名無しさん:2005/03/28(月) 09:15:35
>>338
std::stringstream
::sprintf
お好きな物どうぞ
341デフォルトの名無しさん:2005/03/28(月) 09:37:12
sprintf(s, "%f", d);
342デフォルトの名無しさん:2005/03/28(月) 11:27:42
>>338
boost::lexical_cast<>
343デフォルトの名無しさん:2005/03/28(月) 15:00:55
>>339
私の環境ではうまくいかないのですが・・・。
344デフォルトの名無しさん:2005/03/28(月) 15:16:29
環境も書かないで、自分の環境ではとか言われてもな
345デフォルトの名無しさん:2005/03/28(月) 16:08:15
>>344
gcc3.4.3
346デフォルトの名無しさん:2005/03/28(月) 16:22:54
環境とはコンパイラだけだと思ってるお方ですか・・・('A`)

まぁ>>341でも使っとけや
347デフォルトの名無しさん:2005/03/28(月) 16:37:02
ファイルからテキストファイルを読み込んで内容を
char *text;
に格納したとして、
text[n]で、nの最大値を知りたい時はどうすればいいのですか?
348デフォルトの名無しさん:2005/03/28(月) 16:59:59
>>347
元々確保したchar変数のサイズから分かるだろうそれくらい・・・
349デフォルトの名無しさん:2005/03/28(月) 17:17:56
VisualC6.0で開発しています。
別のプロジェクトのクラスで、同じ情報を参照したいのですが,
良い考えが思いつきません。どなたか、お知恵をお貸し願えないでしょうか。

とりあえず、
別のDLLのAクラス、Bクラスが参照できるように、新規でプロジェクトを
立ち上げ,以下のような宣言でクラスを作りました。また、そのクラスの静的な
オプジェクトを作りました。

***************************
<XXXXX.h>
class __declspec(dllexport) XXXXX
{
・・・
};

static XXXXX g_XXXXX
***************************
クラスの中身には、GetXXX, SetXXXのような関数が入っています。

Aクラス、Bクラスのソースファイルで<XXXXX.h>をインクルードし,
それぞれの情報を参照してみたところ,staticなオブジェクトで
ありながら、AクラスとBクラスでは別のアドレスを参照していました。

なにか、別の方法を使わないとだめだと思うのですが,思いつきません。
同じアドレスの同じ情報を参照したいのですが,可能なのでしょうか?
ご意見,お待ちしています。
350デフォルトの名無しさん:2005/03/28(月) 18:14:15
16進表記>floatの変換をしたいのですが(できれば相互変換)、
標準関数で対応可能なのでしょうか?
ネット検索していたところ、C99規格?では
strtofにて対応可能と言うようなことが書いてあったのですが
私の環境(VC6.0)では"stdlib.h"には、strtodしかなく
これも、単純に少数点付文字列>doubleを行うだけのようで
期待する結果が得られない状況です。
皆様のお知恵をお貸しください。
351デフォルトの名無しさん:2005/03/28(月) 18:17:35
本win32Appのグローバルに
std::vector<type> g_vec;
があってwin32DLLに&g_vecでアドレスを渡してDLL側でごにょごにょいじった後、本Appに戻って
g_vec->clear();
するとメモリ解放のところでハンドルされてない例外(@の場所)が発生します。
@free.c@void __cdecl _free_base (void * pBlock)
そもそもグローバルアドレスをDLLに渡していじくるのはいけない事なのでしょうか?
352デフォルトの名無しさん:2005/03/28(月) 18:26:33
Cの勉強をしようと参考書を買ってきたら本当に1から始める人用だったみたいで
乗っていなかったので質問なんですが、C言語にも「ここからここへ飛ぶ」みたいな
関数はあると思うんですがそれの書き方を教えていただきたいです。
While文の条件以外に定めた条件に触れた場合に後々共通する場所に飛ばしたいのですが
・・・
353デフォルトの名無しさん:2005/03/28(月) 18:27:16
sageてしまいました。すみません
354デフォルトの名無しさん:2005/03/28(月) 18:30:31
>>350
unionは?

>>352
ifなどでどうにかしろ
355デフォルトの名無しさん:2005/03/28(月) 18:44:48
>>351
EXE側とDLL側のstd::vectorの実装が同一ではないから
356デフォルトの名無しさん:2005/03/28(月) 18:49:46
>>354
なんと!!!
関数に頼ることばかり考えていて、まったく思いつきませんでした。
試したところうまく行きました。
ありがとうございました!
357デフォルトの名無しさん:2005/03/28(月) 18:50:18
↑unionの件です
358351:2005/03/28(月) 18:50:50
>>355
了解。有難う御座いました。
359デフォルトの名無しさん:2005/03/28(月) 18:55:28
C99の範囲でsetjmpとかlongjmpというのがあるらしいけど、
つかったことがない。
360デフォルトの名無しさん:2005/03/28(月) 20:02:44
試しに使ってみろ
もう使ったことないなんて言わせない!
361デフォルトの名無しさん:2005/03/28(月) 21:51:10
質問させてください。
少し上でも出ている事と似たようなことなのですが、DLL側で作ったクラスをアプリ側で使用する場合、
純粋仮想関数のみで構成しているクラスをインターフェイスとし、インスタンスの作成と破棄をDLL側で行えば
DLL側に実装を隠したままアプリにクラスの機能を提供できると思います。
ただしこの方法だと、DLL側とアプリ側のコンパイルの環境が違う場合、インターフェイスクラスをコンパイルしたものが
別物になる可能性があり、呼び出しの時に不正なアドレスを参照する恐れがあると思うのですが、どうでしょうか?

DLL側で作成したオブジェクトをアプリに提供する場合、クラスのまま安全に呼び出す方法は無いと考えているのですが、
これって間違いですか?
Win32APIのようにハンドルとラッパーAPI作って呼び出すしかないのでしょうか。
362デフォルトの名無しさん:2005/03/28(月) 21:53:52
>>361
COMについて調べてみては
363デフォルトの名無しさん:2005/03/28(月) 21:59:35
>>361
安全に受け渡しするためにあれこれ工夫するくらいなら、保証されている受け渡し方法を使うほうがよい。
364デフォルトの名無しさん:2005/03/28(月) 22:02:59
>>361
COMが作れる有名どころのコンパイラなら大丈夫だとは思うけどね。
365デフォルトの名無しさん:2005/03/28(月) 22:13:48
>>362
>>363
>>364
COMについては少し調べてみました。
あれは呼び出しとデータの受け渡し方法を特定の言語に依存しない形に決めちゃって、実装についてはなんでもいいというスタンスと理解してます。
そこだけ見れば要求に合うものなのですが、実際使うとなるとTLBを作ったりDLLをレジストリに登録したりと、通常のDLLに比べるとお手軽度が低く
敷居が高いような気がします。COMについては詳しくないので誤解があったらすいません。
C++のクラスをCOMのそれと同じ安全度で、且つ、CのDLLのようにお手軽に使える方法があれば・・・と思って質問させていただきました。

やはりCOMしかないのでしょうか。.NETはそのへん解決してるっぽいですが・・・
VCしか使わないから割り切って進むのもありかもしれないですね・・・
ありがとうございます。
366デフォルトの名無しさん:2005/03/28(月) 22:27:17
>実際使うとなるとTLBを作ったりDLLをレジストリに登録したりと
んなこたーない。
367デフォルトの名無しさん:2005/03/28(月) 22:31:17
>>365
COMインターフェイスだって(C++の場合)実体は純粋仮想関数を並べたクラスなんだから、361の方法で何も問題は起きるはずがない。
どうしても心配なら関数ポインタをメンバにした構造体を外部に公開すればいいんじゃない?(CでのCOMインターフェイスみたいに)
368デフォルトの名無しさん:2005/03/28(月) 22:35:55
v_ptrの標準化は禿が否定的だからなぁ
369デフォルトの名無しさん:2005/03/28(月) 22:49:53
じゃあその邪魔な禿殺して来いよ
370デフォルトの名無しさん:2005/03/28(月) 23:01:07
キミがヤってくりゃいいじゃん
371デフォルトの名無しさん:2005/03/28(月) 23:37:14
そうじゃないだろ、368に命令してんだよこの在日が
372デフォルトの名無しさん:2005/03/28(月) 23:48:58
意味不明
見てて痛いから急に尻込みしないように
373デフォルトの名無しさん:2005/03/28(月) 23:57:50
お前らと禿どっちが信用できる?
374デフォルトの名無しさん:2005/03/28(月) 23:58:33
禿
375デフォルトの名無しさん:2005/03/29(火) 00:30:50
禿
376デフォルトの名無しさん:2005/03/29(火) 01:19:08
禿
377デフォルトの名無しさん:2005/03/29(火) 01:25:59
378デフォルトの名無しさん:2005/03/29(火) 01:31:37
>>377
秀って誰だよ
379デフォルトの名無しさん:2005/03/29(火) 01:32:46
ビアッジ?
380デフォルトの名無しさん:2005/03/29(火) 04:26:44
>>379
誰だよw
381デフォルトの名無しさん:2005/03/29(火) 05:47:33
>>378
・C++
・標準化
・禿が否定的(=影響力を持つ禿)

ここまでキーワード出てるのに・・・
382デフォルトの名無しさん:2005/03/29(火) 08:59:15
Windowsプログラムで、自身のフルパスを取得する方法を教えて下さい。
383デフォルトの名無しさん:2005/03/29(火) 09:02:00
GetModuleFileName
384デフォルトの名無しさん:2005/03/29(火) 09:05:43
>>383
ありがとうございました
385デフォルトの名無しさん:2005/03/29(火) 09:08:24
UNIXプログラムで、自身のフルパスを取得する方法を教えて下さい。
386デフォルトの名無しさん:2005/03/29(火) 09:13:05
#include <stdio.h>
int main(int argc, char **argv)
{
return 0;
}

この時argv[0]にポインタが入っています
387デフォルトの名無しさん:2005/03/29(火) 09:17:14
>>386
何の?
388デフォルトの名無しさん:2005/03/29(火) 09:22:35
エロゲ
389デフォルトの名無しさん:2005/03/29(火) 09:39:11
Windowsプログラムでスクリーンショットを撮る方法を教えて下さい。
ググっても中々見つかりません・・・
390デフォルトの名無しさん:2005/03/29(火) 10:02:37
>>389
DC取得して、BITMAP取り出して、ファイルに保存
391デフォルトの名無しさん:2005/03/29(火) 10:04:49
UNIXプログラムでスクリーンショットを撮る方法を教えて下さい。 
ググっても中々見つかりません・・・ 
392デフォルトの名無しさん:2005/03/29(火) 10:05:37
>>391
ファイルにリダイレクト
393デフォルトの名無しさん:2005/03/29(火) 10:05:40
>>390さん
回答ありがとうございます。
すみません、参考になるようなサイトはないでしょうか
394デフォルトの名無しさん:2005/03/29(火) 10:11:40
>>393
ぐぐれ
395デフォルトの名無しさん:2005/03/29(火) 10:13:21
>>394
ttp://homepage1.nifty.com/nogue/wincho11.htm
こんな感じのサイトを見つけたんですが、全く分かりません・・
396デフォルトの名無しさん:2005/03/29(火) 10:19:54
>>395
どういう検索ワード使ったんだ‥‥(;´Д`)

デバイスコンテキストハンドルとデスクトップで検索かければ普通に出てくるだろうに
397デフォルトの名無しさん:2005/03/29(火) 10:26:50
>>396
C#でのサンプルは見つかったんですが、それ以外は見つかりませんでした・・すみません
398デフォルトの名無しさん:2005/03/29(火) 10:34:33
せめてC#をC++に読み解くくらいしろ
399デフォルトの名無しさん:2005/03/29(火) 10:36:08
了解しました。また問題が起きたら報告します。その時はよろしくお願いします
400デフォルトの名無しさん:2005/03/29(火) 10:53:34
400 C++
401デフォルトの名無しさん:2005/03/29(火) 11:11:23
401 C++
402デフォルトの名無しさん:2005/03/29(火) 11:18:56
Windowsプログラムで、999のパスを取得する方法を教えて下さい。
403デフォルトの名無しさん:2005/03/29(火) 11:19:58
>>402
ここまで意味不明な質問は久々に見た
404389:2005/03/29(火) 11:24:38
なんとかスクリーンサイズを取得する方法等は検索して見つかったんですが、
最後にビットマップをファイルに出力する方法が思いつきません。ご教授願います。

途中まで書いたソースです
http://www.uploda.org/file/uporg66026.txt
405デフォルトの名無しさん:2005/03/29(火) 11:31:04
>>404
if (SaveDialog1->Execute())
{
    bmp->SaveToFile(SaveDialog1->FileName);
}
406デフォルトの名無しさん:2005/03/29(火) 11:31:52
>>403
ぐぐれ
407デフォルトの名無しさん:2005/03/29(火) 11:32:36
>405
TFileStreamクラスとSaveToStreamメソッド使おうよ。
408389:2005/03/29(火) 11:37:40
>>405,407さん
回答ありがとうございます
MSDNで検索しても関係ないものばかりで、
ググってもVBやらDelphi関連のページしか出てきませんでした。

ちなみにコンパイラはBCCです。フリーの
409デフォルトの名無しさん:2005/03/29(火) 11:44:04
LPRECTって渡してどうするよ…
RECT構造体作ってそのアドレス渡さなきゃ
410389:2005/03/29(火) 11:48:36
>>409さん
すみません、全く意味が分かりません。
具体的にどのように修正すればいいかお教え下さい…
411デフォルトの名無しさん:2005/03/29(火) 11:49:14
つか、コレCとC++どっちを想定してる?
退屈だから、やってやろうと想ったがメモリの割り当てどっち使おうか迷うんだが
412389:2005/03/29(火) 11:50:52
>>411さん
ありがとうございます。
Cを想定しています。C++は勉強中です。すみません。
413デフォルトの名無しさん:2005/03/29(火) 11:52:11
どーでもいいがバカ正直にGetDCするだけだとマルチモニタ環境で破綻するからな。
414デフォルトの名無しさん:2005/03/29(火) 11:53:00
Visual C++ .NET Standard 2003を購入しよう思うんだけど
これって営利商用利用できますか?
415389:2005/03/29(火) 11:54:01
>>413さん
そうなんですか…奥深いですね
416デフォルトの名無しさん:2005/03/29(火) 11:58:25
>>389
取得からセーブまで

  HANDLE hWndAll;
  HANDLE hWndDC;
  Image1->Width = Screen->Width;
  Image1->Height = Screen->Height;
  hWndAll = GetDesktopWindow();
  hWndDC = GetDC(hWndAll);
  BitBlt(Image1->Canvas->Handle, 0, 0, Screen->Width, Screen->Height, hWndDC, 0, 0, SRCCOPY);
  if (SaveDialog1->Execute())
  { 
    Image1->Picture->SaveToFile(SaveDialog1->FileName);
  }
  ReleaseDC(hWndAll, hWndDC);
417デフォルトの名無しさん:2005/03/29(火) 11:58:57
>>408
ttp://www.sm.rim.or.jp/~shishido/

そのままbccでも動作するはずだけど。
418389:2005/03/29(火) 12:03:06
>>416
エラー E2451 3.c 9: 未定義のシンボル Image1(関数 main )
エラー E2451 3.c 9: 未定義のシンボル Screen(関数 main )
エラー E2451 3.c 16: 未定義のシンボル SaveDialog1(関数 main )

とか出ました。すみません
419デフォルトの名無しさん:2005/03/29(火) 12:10:41
>>402 >>403
年いくつ?
420389:2005/03/29(火) 12:12:50
>>417さん
ありがとうございます。
もしかして
http://www.sm.rim.or.jp/~shishido/wincap.html
これですか?
421デフォルトの名無しさん:2005/03/29(火) 12:15:05
>>416>>418はどっちが天然なんだ?
422416:2005/03/29(火) 12:27:18
>>389
プログラム作って三田
ソース+プログラム
参考にしてちょ
http://www.uploda.org/file/uporg66054.lzh.html
423389:2005/03/29(火) 12:35:02
>>422さん
ありがとうございます。参考にさせて頂きます
424411:2005/03/29(火) 12:45:14
もう、必要ないかもしれんが一応
http://www.uploda.org/file/uporg66065.txt.html
425389:2005/03/29(火) 12:46:07
>>424さん
うわぁ、凄いです!ありがとうございます!
426389:2005/03/29(火) 12:49:17
>>424
すみません、
>bcc32 test.c
でコンパイルしたらエラー出まくったんですが、
他の引数が足りませんか?
427411:2005/03/29(火) 13:00:33
半分寝ながら書いたからバグが数箇所あったな
とりあえず、修正
http://www.uploda.org/file/uporg66076.txt.html
428389:2005/03/29(火) 13:03:57
ありがとうございます。コンパイルも通って実行も出来ましたが
出力されたビットマップは真っ黒でした。こちらで修正してみます。
皆さんありがとうございました。
429デフォルトの名無しさん:2005/03/29(火) 13:04:38
#include <stdio.h>
#include <windows.h>

#define SRCCOPY 0xCC0020

int main(void)
{
    HWND    hWndDesktop;
    HDC     hDCDesktop, hDC;
    HBITMAP hBitmap;
    BITMAPFILEHEADER bmfh;
    BITMAPINFO* lpbmi;
    HGDIOBJ hOldBitmap;
    RECT  Rect;
    HANDLE hfile;
    DWORD t;
    void* lpbits;

    hWndDesktop = GetDesktopWindow();

    // スクリーンサイズ取得
    GetWindowRect(hWndDesktop, &Rect);

    hDCDesktop  = GetDC(hWndDesktop);
    hDC         = CreateCompatibleDC(hDCDesktop);
    hBitmap     = CreateCompatibleBitmap(hDCDesktop, Rect.right, Rect.bottom);
    
    BitBlt(hDC, 0, 0, Rect.right, Rect.bottom, hDCDesktop, 0, 0, SRCCOPY);
    
    SelectObject(hDC, hOldBitmap);
    
430デフォルトの名無しさん:2005/03/29(火) 13:05:26
    //Make BITMAPINFO
    lpbmi = malloc(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256);
    ZeroMemory(&lpbmi->bmiHeader,sizeof(BITMAPINFOHEADER));
    lpbmi->bmiHeader.biSize     = sizeof(BITMAPINFOHEADER);
    lpbmi->bmiHeader.biWidth    = Rect.right - Rect.left;
    lpbmi->bmiHeader.biHeight   = Rect.bottom - Rect.top;
    lpbmi->bmiHeader.biBitCount = GetDeviceCaps(hDCDesktop,BITSPIXEL);
    lpbmi->bmiHeader.biPlanes   = 1;
    lpbmi->bmiHeader.biSizeImage= (((lpbmi->bmiHeader.biWidth * lpbmi->bmiHeader.biBitCount+31) >> 3)&0xfffffffc)*lpbmi->bmiHeader.biHeight;

    //DDB -> DIB
    lpbits  = malloc(lpbmi->bmiHeader.biSizeImage);
    GetDIBits(hDCDesktop,hBitmap,0,lpbmi->bmiHeader.biHeight,lpbits,lpbmi,DIB_RGB_COLORS);

    //Make BITMAPFILEHEADER
    bmfh.bfType  = 'B'+('M'<<8);
    bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    if(lpbmi->bmiHeader.biBitCount <= 8){
        bmfh.bfOffBits += sizeof(COLORREF) * (1 << lpbmi->bmiHeader.biBitCount);
    }
    bmfh.bfSize = bmfh.bfOffBits + lpbmi->bmiHeader.biSizeImage;
431デフォルトの名無しさん:2005/03/29(火) 13:06:17

    //Save File
    hfile = CreateFile("test.bmp",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,0,NULL);
    WriteFile(hfile,&bmfh,sizeof(bmfh),&t,NULL);
    WriteFile(hfile,&lpbmi->bmiHeader,sizeof(BITMAPINFOHEADER),&t,NULL);
    if(lpbmi->bmiHeader.biBitCount <= 8)
        WriteFile(hfile,&lpbmi->bmiColors,sizeof(COLORREF) * (1 << lpbmi->bmiHeader.biBitCount),&t,NULL);
    SetFilePointer(hfile,bmfh.bfOffBits,NULL,FILE_BEGIN);
    WriteFile(hfile,lpbits,lpbmi->bmiHeader.biSizeImage,&t,NULL);

    free(lpbits);
    free(lpbmi);
    CloseHandle(hfile);
    DeleteDC(hDC);
    ReleaseDC(hWndDesktop, hDCDesktop);
    DeleteObject(hBitmap);
    
    return 0;
}
432デフォルトの名無しさん:2005/03/29(火) 13:13:57
>>402
まず機械伯爵を倒せ。
433デフォルトの名無しさん:2005/03/29(火) 15:28:13
>>432さん 
回答ありがとうございます 
MSDNで検索しても関係ないものばかりで、
434デフォルトの名無しさん:2005/03/29(火) 16:11:28
C++の入門サイトを見ているのですが、「値を戻す関数」というのがよくわかりません。
435デフォルトの名無しさん:2005/03/29(火) 16:13:40
値を戻す関数

int func1();
436デフォルトの名無しさん:2005/03/29(火) 16:30:57
>>435
そういうことじゃなくて、呼び出した場所に整数を戻すとか、どういうことなのかわからないのです。
437デフォルトの名無しさん:2005/03/29(火) 16:32:09
>>434
値を返すと同じ意味だと思う。
438デフォルトの名無しさん:2005/03/29(火) 16:33:40
>>436
情報を小出しにせずに。
439デフォルトの名無しさん:2005/03/29(火) 16:42:53
>>436
もっと日本語読み解けよ

戻り値って言うだろうが
440デフォルトの名無しさん:2005/03/29(火) 16:46:43
ん?もしかして、そこまで初心者だとは思わなかった。
関数が返り値を持つ事が不思議なの?
関数がどう言う意味か学校の数学で習わなかったの?
441デフォルトの名無しさん:2005/03/29(火) 16:47:50
いや、それ以前にC++って見たから、既にCの言語仕様は完全に知っているものと勘違いした。
442デフォルトの名無しさん:2005/03/29(火) 16:48:36
期待の新人現る。
443デフォルトの名無しさん:2005/03/29(火) 17:36:40
ルーキーオブジイヤー目指してがんばれよ。
444デフォルトの名無しさん:2005/03/29(火) 17:49:12
アップキャストしたクラスへのポインタから、代入ではなくmemcpyでコピーを作ると
発生先クラスの仮想関数が呼べてしまうんですが、こんな使い方って有りなんでしょうか?

class Obj {
public:virtual int func(int i) { return i; }
};
class NewObj : public Obj {
public:virtual int func(int i){ return mul3(i); }
private: int mul3(int i) { return i*3; }
};

void pri(Obj *obj)
{
Obj *obj1 = new Obj;
Obj *obj2 = new Obj;
(*obj1) = (*obj);
memcpy(obj2, obj, sizeof(Obj));
printf("%d, %d, %d\n", obj->func(2), obj1->func(2), obj2->func(2));
delete obj1; delete obj2;
}
int main(int argc, char* argv[])
{
NewObj newobj;
pri(&newobj);
return 0;
}
実行結果
6, 2, 6
445デフォルトの名無しさん:2005/03/29(火) 17:56:30
無し
446デフォルトの名無しさん:2005/03/29(火) 17:59:22
むしろmemcpy推薦
447デフォルトの名無しさん:2005/03/29(火) 19:46:29 ID:
>>339 マジですか?そんな便利な変換コンストラクタが定義されてるんですか?
448デフォルトの名無しさん:2005/03/29(火) 20:03:45 ID:
typedef struct _FILETIME {
 DWORD dwLowDateTime;
 DWORD dwHighDateTime;
} FILETIME, *PFILETIME;

上記構造体をunsigned __int64に変換したいのですが、
やはりmemcpyするしかないのでしょうか?
449デフォルトの名無しさん:2005/03/29(火) 20:04:11 ID:
>>447
標準仕様にはない
450デフォルトの名無しさん:2005/03/29(火) 20:16:12 ID:
なるべく高速なプログラムを書いてます。

template関数を使うと遅くなりますか?
マクロだから関係ないですよね?
451デフォルトの名無しさん:2005/03/29(火) 20:17:04 ID:
IDが…
452デフォルトの名無しさん:2005/03/29(火) 20:20:22
>>450
マクロではないです。
遅くなんてならないです。
453デフォルトの名無しさん:2005/03/29(火) 20:21:59
>>448
FILETIME ftime = {0,0};
unsigned __int64 u64 = (unsigned __int64)ftime.dwLowDateTime
| ((unsigned __int64)ftime.dwHighDateTime << 32);

こんなんでどう?
454448:2005/03/29(火) 20:24:24
>>453
できればキャストしたいなと思ってるんですがやっぱり無理か‥‥orz
MSDNはコピーしろって書いてあるし‥‥
455デフォルトの名無しさん:2005/03/29(火) 20:25:06
>>452
ありがとうございます。
マクロじゃなかったんですか。
勉強になりました。
456デフォルトの名無しさん:2005/03/29(火) 20:33:52
>>452
ここにマクロって書いてあるんですが、
http://www.iba.k.u-tokyo.ac.jp/~yanai/template_tips.html
これは解釈が違うってことでしょうか?
457デフォルトの名無しさん:2005/03/29(火) 20:36:13
とりあえず、似たようなもの、ってことでしょうかね。
458デフォルトの名無しさん:2005/03/29(火) 20:42:35
コンパイルタイムに決定されるという意味ではマクロと同じで、遅くもならない
ただ柔軟性は段違い
459デフォルトの名無しさん:2005/03/29(火) 20:47:08
>>456
それは正式な文書ではないので細かな部分で間違いを含んでいることがあると思います。
templateは静的ですが、マクロとは別物です。
460デフォルトの名無しさん:2005/03/29(火) 21:01:04
>>448
共用体にするのはダメですかね?
union UNION_DATATIME
{
FILETIME DataTime;
unsigned __int64 u64DataTime;
} utime;

utime.DataTime.dwLowDateTime = 0x33221100;
utime.DataTime.dwHighDateTime = 0x77665544;
printf("%016I64X\n", utime.u64DataTime);


こちらはunsigned __int64型に強引にキャスト。安全性は無保証ですが。
FILETIME ftime2 = {0xBBAA9988,0xFFEEDDCC};
unsigned __int64 u_64 = (((UINT)&ftime2.dwLowDateTime) == ((UINT)&ftime2.dwHighDateTime)-4) ? (*(unsigned __int64*)&ftime2.dwLowDateTime):-1;
printf("%016I64X\n", u_64);
461デフォルトの名無しさん:2005/03/29(火) 21:03:24
>>458-459
マクロではないけど、静的なので、速度には影響しないと言う解釈でいいでしょうか?
462デフォルトの名無しさん:2005/03/29(火) 21:05:40
違います
463デフォルトの名無しさん:2005/03/29(火) 21:30:23
>>448
unsigned __int64 u64 = *reinterpret_cast<unsigned __int64*>(&file_time);
でいけるはず。
464デフォルトの名無しさん:2005/03/29(火) 21:33:11
>>456
そんなウンコページ見るな。本買え
465デフォルトの名無しさん:2005/03/29(火) 22:59:33
CってWEBプログラミングで活用できるの?
Perlだとか、PHPだとか。
ちょっと詳しくおせーて。

あと、エスケープシーケンスの\tの使い方教えてくれ
466デフォルトの名無しさん:2005/03/29(火) 23:00:54
>>465
お前には無理だ
467デフォルトの名無しさん:2005/03/29(火) 23:25:16
>>465
Webでも活用はできるが、PHPの方がいい。
468デフォルトの名無しさん:2005/03/29(火) 23:57:09
Perlを虐めないで下さい><
469デフォルトの名無しさん:2005/03/29(火) 23:57:13
PHPの存在理由って何?
470デフォルトの名無しさん:2005/03/30(水) 00:02:45
>>469
PHPを馬鹿にするな!
いい教育関係の本をたくさんだしてるぞ。
471デフォルトの名無しさん:2005/03/30(水) 00:14:56
PHPってPHP研究所しか知らん
472デフォルトの名無しさん:2005/03/30(水) 00:17:27
PHP!PHP!
PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!
PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!
PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!
PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!
PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!
PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!
PHP!PHP!HP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!
PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!
PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!
PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!
PHP!PHP!HP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!P
HP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!PHP!HPHP!PHP!PHP!PHP!PHPPHP!PHP!PHP!PHP!!PHPPHP!PHP!PHP!PHP!!PHP!PHP!P!HP!PPHP!PHP!PHP!PHP!HP!
473デフォルトの名無しさん:2005/03/30(水) 00:18:16
Ruby>PHP>>>>>>>>>>>>>>>>>>>>>>>C>>>Java
474デフォルトの名無しさん:2005/03/30(水) 00:21:29
PHPはC言語ダメか。
じゃあRubyとかPerlは使えるの?
475デフォルトの名無しさん:2005/03/30(水) 00:23:02
>>474
別に言語はなんだっていい。
476デフォルトの名無しさん:2005/03/30(水) 01:22:56
PHPで構造化プログラミングしてる香具師は少ない
477デフォルトの名無しさん:2005/03/30(水) 03:08:39
>>444
PODでないクラスをmemcpyしちゃダメ。
478デフォルトの名無しさん:2005/03/30(水) 03:12:13
>>465
2chのread.cgiはC++で書かれている。
\tはタブ文字。
479デフォルトの名無しさん:2005/03/30(水) 03:31:27
C++じゃない。ただのC。
480デフォルトの名無しさん:2005/03/30(水) 05:14:59
質問。
とあるクラスのメンバ関数なんですが、
名前の通り線形検索して、リファレンスを返すようになっています。
ここで、問題なのは、見つからなかったときの処理で、例外を投げています。
こんな実装でいいモンなんでしょうか。
というのも、たとえば、operator[]をオーバーロードしたりして、頻繁に使う場合何度もtryブロックで囲まねばならず、不便です。
なんか、妙案ありませんでしょうか。

#define Width(pos,len) (pos%len)
#define Height(pos,len) ((pos-(pos%len))/len)
<------------------------------------->
template<class T,class Type>
 struct HashData{
        Type str;
        T data;
 };
HashData** data;
<------------------------------------->
T& Search(Type buf){
        bool find=false;
        for(int i=0;i<Width(use,dlen)+(Height(use,dlen)*dlen);i++){
            if(data[Height(i,dlen)][Width(i,dlen)].str == buf){
                find=true;
                break;
            }
        }
        if(!find)throw exception("CHash:Object Not Found!");
            return data[Height(i,dlen)][Width(i,dlen)].data;
    }
481デフォルトの名無しさん:2005/03/30(水) 05:31:34
いまどきコンテナライクなクラスでSTL非互換なインターフェースとかありえない。
482デフォルトの名無しさん:2005/03/30(水) 05:39:35
習作なんだから、勘弁してください。

>>481
参考までに聞きたいのですが、STL互換というのは、イテレータが使えるとかそういうことですか?
483480=482:2005/03/30(水) 05:49:09
妙案ありませんか?
484デフォルトの名無しさん:2005/03/30(水) 05:56:14
>>480
そこは例外を使うところではない。
boost::optionalかイタレータのどっちかを返すようにしろ。
485480:2005/03/30(水) 06:19:39
>>484
レスThx。
今から調べて見ます。
486デフォルトの名無しさん:2005/03/30(水) 06:33:35
取りあえず、クラス使おうぜ

今どきC++で、マクロや広域関数でデータ構造を作るのはちょっとあり得ない
Cならわからんでもないが、テンプレート使ってるしな……
487デフォルトの名無しさん:2005/03/30(水) 07:45:19
練習してる人間にそんなこと言うヤツなんて今時ありえない
488480:2005/03/30(水) 07:47:35
>>486
ああ、書いてある通り。
ハッシュクラスのメンバ関数です。

いま、boost::optionalを調べてるんですが、これいいですね。
それはそれとして、質問です。

その文献のなかで、unspecified-bool-typeというoperatorを見つけたので
嬉々として実験に走ったんですが、VC7.1だとパースエラーが出ます。
これはいったい何なんでしょうか?

ttp://boost.cppll.jp/HEAD/libs/optional/doc/optional.html#synopsis
489デフォルトの名無しさん:2005/03/30(水) 08:03:07
>>488
ソース内に unspecified-bool-type とは書けないよ。
bool 値が要求される文脈(if,for,?,...)に置いたときに
自動的に initialized() と同じ値に変換されるように用意されてる operator なんで、
明示的に呼び出すものじゃない。
490デフォルトの名無しさん:2005/03/30(水) 08:24:52
>>489
テストに使ったソースは以下の通りです。
エラー:条件式の型 'Test' が間違っています。それとパースエラー。

宣言すらできないのにどうやって使うんだろう。
initialized()とはいったい???


#include <iostream>
class Test{
public:
    Test():init(false){};
    virtual ~Test(){};
    int Init(){init=true; return 0;}
    int Destroy(){init=false; return 0;}
    operator unspecified-bool-type() const;
protected:
    bool init;
};
int main(int argc, char* argv[])
{
    Test T;
    if(T){
        std::cout<<"True"<<std::endl;
    }else{
        std::cout<<"False"<<std::endl;
    }
    return 0;
}
491デフォルトの名無しさん:2005/03/30(水) 08:34:36
>>490
よく読め。
「ソース内に unspecified-bool-type とは書けない」

同様の operator を持つクラスを実装したいなら、 boost のソースを読むといい。
492デフォルトの名無しさん:2005/03/30(水) 08:50:04
>>491
ほんっとに直接的ないみでかけないのですね。こりゃ参った。
boostのソースか、ちょっと躊躇してしまいます。
まあいいか。

レス、ホントに感謝。
493デフォルトの名無しさん:2005/03/30(水) 09:28:04
>>462
どうちがうんですか?
494デフォルトの名無しさん:2005/03/30(水) 10:35:55
>>492
つーか、ちょっと考えれば
型名にハイフン使えないことくらいわかるでしょうよ。
495デフォルトの名無しさん:2005/03/30(水) 10:50:06
型名どころか全ての名前に使えないだろ、演算子なんだから
496デフォルトの名無しさん:2005/03/30(水) 16:04:02
このテンプレート関数に関するCVの腐った仕様は、
http://homepage1.nifty.com/hjm/doc/visualc/memberFunctionTemplate_definition.html
VC7で直っていますか?
497デフォルトの名無しさん:2005/03/30(水) 16:05:45
枝葉末節だな。
498デフォルトの名無しさん:2005/03/30(水) 16:38:35
boost::container_facade 欲しい(゚Д゚)欲しい欲しい欲しい
499444:2005/03/30(水) 17:30:46
>>445 >>446 >>477
レス感謝です。
PODでググったところ、こちらの解説を見つける事が出来ました。
ttp://forums.belution.com/ja/cpp/000/031/09.shtml
疑問が解決してすっきりしました! 477様有難うございます。
500デフォルトの名無しさん:2005/03/30(水) 18:41:56
ヒープの語源を教えてください
501デフォルトの名無しさん:2005/03/30(水) 18:58:23
英和辞典で見れば?
502デフォルトの名無しさん:2005/03/30(水) 19:07:09
塵も積もればヒープとなる
503デフォルトの名無しさん:2005/03/30(水) 19:07:43
ぷひー
504デフォルトの名無しさん:2005/03/30(水) 19:08:53
>>500
そんな事は検索エンジンで”ヒープ””語源”でしらべてみそ
といいながら答えてみる

Heap:
英語の意味は積み重ねるとかたくさんなどの意味だが
もともとは、古期英語「大勢」の意

すぐ調べられることはなるべく自分でが鉄則ね
505デフォルトの名無しさん:2005/03/30(水) 22:49:24
そのヒープが、なぜ配列で実装された半順序木と言う意味を表すようになったのか、
言語学的な関心をよせずにはいられない。
506デフォルトの名無しさん:2005/03/30(水) 22:52:04
バランスのとれたツリーは積み重なったワラのように見えなくもないじゃないか
507デフォルトの名無しさん:2005/03/31(木) 00:18:50
#include <stdio.h>
main(){
a:
printf("ぬるぽ");
goto a;
}

これを実行するとどうなるんですか?
508デフォルトの名無しさん:2005/03/31(木) 00:20:34
>>507
いつまでそんなクソつまらん事やってるんだ
509デフォルトの名無しさん:2005/03/31(木) 00:22:15
いつまでも


510デフォルトの名無しさん:2005/03/31(木) 00:23:26
>>509
座布団0.5枚
511デフォルトの名無しさん:2005/03/31(木) 00:25:36
>>479
http://blog.livedoor.jp/hirox1492/archives/34791.html
ここで見かけたからC++なんだろうと思っていたんだけれども、違うの?
512デフォルトの名無しさん:2005/03/31(木) 01:50:05
>>507
実際やるとかなり笑えるね。
513デフォルトの名無しさん:2005/03/31(木) 11:02:41
特にgotoなんて使ってるところがね
514デフォルトの名無しさん:2005/03/31(木) 12:55:26
とあるソフトのプラグインdllのサンプルソースを頂いたのですが。
resource.hというファイルが無いとエラーが出てしまいます。

そのファイルを入手しないとビルド出来ないのでしょうか?
resource.hはダイアログボックスか何かの設定なんでしょうかね・・・?
515デフォルトの名無しさん:2005/03/31(木) 12:57:36
>>514
なぜここで訊く?
くれた奴に訊くべきだろうが。
俺らはエスパーじゃない。
516デフォルトの名無しさん:2005/03/31(木) 13:01:41
2chに落ちてた物なんで聞けないんっす。

resource.hは一般的なファイルじゃないって事ですね。
即レスありがとう御座いました。
517デフォルトの名無しさん:2005/03/31(木) 13:23:31
>>516 おまえ何いってんの?

> 2chに落ちてた物なんで聞けないんっす。

ハァ? だったらそのスレで訊けや

> resource.hは一般的なファイルじゃないって事ですね。 

電波か?俺はそんなこと言ってない
名前は十分一般的だ。しかし中身がどうとかは推測しかできない
518デフォルトの名無しさん:2005/03/31(木) 14:19:50
OKOK
519デフォルトの名無しさん:2005/03/31(木) 15:16:15
ほーけーほーけー
520デフォルトの名無しさん:2005/03/31(木) 15:31:17
>>514
まさしくリソース。<resource.h
VisualStudioならダイアログエディタが生成する。
つーか、どうするべきか該当スレで聞けって。
521デフォルトの名無しさん:2005/03/31(木) 16:24:47
有るのに見落としてるだけだったりしてな

VCのプロジェクトがもう有ってそれを開いてやってるだけだけど、
プロジェクト作ったヤツがファイルをプロジェクトに追加するの忘れてるとか
522デフォルトの名無しさん:2005/03/31(木) 16:26:07
静的でないメンバ関数の中で呼び出しが正しくありません
ってなんですか?
523デフォルトの名無しさん:2005/03/31(木) 16:33:37
書いてあるとおり呼び出しが不正だってんだろ

そんな情報だけで何が答えられるか・・・
524デフォルトの名無しさん:2005/03/31(木) 16:37:35
それぞれ独立したクラスで、XXX::YYYの呼び出しをしたら上のエラーでした。
やっぱり「それぞれ独立したクラス」だから呼び出せないと?それとも他に問題があるんでしょうか?
宣言を確認してください、とも言われました。引数の数などは合っています。
525デフォルトの名無しさん:2005/03/31(木) 16:42:03
>>524
ソースさらせ
526デフォルトの名無しさん:2005/03/31(木) 16:45:32
こんなもんで参考になるのかわかりませんが・・・・

BOOL DLG::Update()
{
/*諸処理*/
CtoWindow::hoge();
return TRUE;
}
527デフォルトの名無しさん:2005/03/31(木) 16:49:28
激しく説明不足と思われるので補足。
CtoWindowは無継承のクラス。hoge()は、引数なしの返り血void。
お互いに血縁はないです。
528デフォルトの名無しさん:2005/03/31(木) 16:50:28
CtoWindow::hogeは本当にstaticになってるん?
529デフォルトの名無しさん:2005/03/31(木) 16:54:25
>>526
CtoWindow().hoge();
530デフォルトの名無しさん:2005/03/31(木) 16:55:22
それが良くわからなくて・・・。
staticにすることによるメリットも、そもそもどうやってstaticにするのかもわからないのです。
531デフォルトの名無しさん:2005/03/31(木) 16:56:50
>>529
通った!え、なんでですか?CtoWindowってクラスじゃないのか!?
532デフォルトの名無しさん:2005/03/31(木) 17:03:15
>>530
class hoge
{
public:
 static int foo; //staticなメンバ
 int bar //staticじゃないメンバ
};
533デフォルトの名無しさん:2005/03/31(木) 17:03:28
>>531
CtoWindow()で一時無名オブジェクトが返されて
そのオブジェクトのhogeが呼ばれただけだろ

一度C++の基礎を勉強したら?
534デフォルトの名無しさん:2005/03/31(木) 17:09:56
>>533
教本に載ってねぇーーーーーーーー!!
とりあえず教本を破り捨てるところから勉強を始めようと思います・・・・。

クラス名を関数みたいな形で呼び出すと、一時的につかえる無名オブジェクトが返ってくるっておけですか?
535デフォルトの名無しさん:2005/03/31(木) 17:11:26
遅延評価しろよこの糞C++
536デフォルトの名無しさん:2005/03/31(木) 17:22:04
普通はクラスのインスタンスを作って呼び出すもんだろ・・・
537デフォルトの名無しさん:2005/03/31(木) 17:29:19
>536
それは勿論承知してます。そのような使い方があることを知らなかったもので。
ところでどうしてCtoWindow::hoge(); の形では通らなかったのでしょうか?
色々なサンプルを見てるとこういう形の方が一般的に思えるのですが・・・。
538デフォルトの名無しさん:2005/03/31(木) 17:35:07
>>537
hogeがstaticじゃないから
539デフォルトの名無しさん:2005/03/31(木) 17:41:49
なるほど・・・・わかりました。色々調べて見ます。ありがとうございました。
540デフォルトの名無しさん:2005/03/31(木) 17:43:57
>>534
一時無名オブジェクトのことは書いてない本も多いよ。
541デフォルトの名無しさん:2005/03/31(木) 17:45:40
何も特別な事じゃないと思うけど。オブジェクトってなぁに、って考えたら。
542デフォルトの名無しさん:2005/03/31(木) 18:11:07
C++によるオブジェクト指向によって速度が低下する事は考えられますか?
超高速(1周期が300Hz以上)のシミュレーションプログラムを作成する必要があり、
今は設計段階でオブジェクト指向にするか、しないかで迷っております。

クラスを継承したり、関数ポインタ使いまくったりっていう
オブジェクト指向は数値計算とは相性が悪いような気がしてなりません。

開発環境はwin2000、VisualC++6.0、GLUTです。
543デフォルトの名無しさん:2005/03/31(木) 18:22:47
>>537
DLGがCtoWindowからの派生クラスなら問題なかった
544デフォルトの名無しさん:2005/03/31(木) 18:32:12
>>542
vtable参照しまくるとそれなりの遅延は起きるだろう。
しかしそんな瑣末な遅延よりも、良いアルゴリズムで
プログラムを構築したほうが何倍も良い。
545デフォルトの名無しさん:2005/03/31(木) 18:34:57
>>544
ありがとうございます。オブジェクト指向での開発は止める事にします。
瑣末な遅延が無視できるシミュレーションならいんですが、
リアルタイムである事が必要条件なので、無視できないんです。
546デフォルトの名無しさん:2005/03/31(木) 18:43:25
オブジェクト指向で設計しても効率良く書けば実効速度はほとんど変わらない。
547デフォルトの名無しさん:2005/03/31(木) 19:01:13
>>542
オブジェクト指向で
虫取りや保守は楽になるだろうけど...
私は速度面だけでそこまでタイトにやった事ないからなあ
もし、同じ経験のある方は詳細を教えていただきたいものです
スレ違いですけど...
548デフォルトの名無しさん:2005/03/31(木) 19:07:41
開発環境がVC6って段階で終わってる気がする。
何打神田御託を並べる前にどの程度の処理が必要でどの程度の速度が要求されるか調べる方がよい。
実際仮想継承でもしない限り、オブジェクト指向で遅くなるとは考えにくい。
549デフォルトの名無しさん:2005/03/31(木) 19:07:46
遅延評価できればオブジェクト指向でも全く変わらない速度で実行できることが保証できるのに。
550デフォルトの名無しさん:2005/03/31(木) 19:40:27
真面目にレスすることないよ。
単に、オブジェクト指向という得体の知れないものを勉強するのが嫌、今までのスタイルを変えたくない、その言い訳を探しにきただけなんだから。
わずか20分、2レスで「ありがとうございます。オブジェクト指向での開発は止めます。」って、冗談としか思えない。
551デフォルトの名無しさん:2005/03/31(木) 19:44:18
>>542
> クラスを継承したり、関数ポインタ使いまくったりっていう
> オブジェクト指向は
ただ継承しただけで遅くなるわけじゃないし、
C++なら関数ポインタより関数オブジェクトを多く使うことになるわけで、
これは別に効率悪くないんじゃないの?
552デフォルトの名無しさん:2005/03/31(木) 19:50:41
中の人の能力次第だな
553デフォルトの名無しさん:2005/03/31(木) 20:48:20
>>542
同じ研究室の予感(´一`)ノ
引継ぎご苦労様です
554デフォルトの名無しさん:2005/03/31(木) 21:30:41
クラスのメンバ変数が
スタティックポインタの場合どう初期化すればいいですか?
555デフォルトの名無しさん:2005/03/31(木) 21:43:47
俺だったら設計を見直す
556デフォルトの名無しさん:2005/03/31(木) 21:48:46
>>554
とりあえず
class A
{
...
static int* pA;
...
};
なら

int* A::pA=NULL;(ソースファイルで初期化)
でいいと
557デフォルトの名無しさん:2005/03/31(木) 21:55:54
>>544
vptr経由の間接参照自体はたいしたコストじゃない。

問題は、多態バリバリのプログラムだと
仮想関数を呼び出すところで、分岐予測がはずれまくること。
こちらの方が、「遅くなる原因」としては大きい。

といっても、下2行に激しく同意だし
そもそもベンチマークをとらなきゃわからない程度の違いしかないだろうけど。
558デフォルトの名無しさん:2005/03/31(木) 21:58:02
>>554
俺の持ってるC++本の一説によると、
staticメンバの初期化はファイルスコープ中で行うこと
だそうだ
559デフォルトの名無しさん:2005/03/31(木) 22:31:07
高速化はプロファイリングしてから考えろ
560デフォルトの名無しさん:2005/03/31(木) 22:56:33
>>548
開発環境は何がいいの?
VC6ってそれほど悪くないと思うんだけど・・・
561デフォルトの名無しさん:2005/03/31(木) 23:00:20
>>560
Rubyがこの世で一番いいのだよ
562デフォルトの名無しさん:2005/03/31(木) 23:07:02
>>560
548じゃないが、少なくともテンプレ関係がうんこであることは疑う余地がない。
563542:2005/03/31(木) 23:07:55
>>547
そうなんですよ。
その魅力があるから、うだうだ悩んでるんです。
>>548
どの程度の処理って言われましてもねぇ・・・詳細はちょっと言えないんですよ。すいません。
行数で言えば1万行程度ですね。
そのうち周期的に動かす部分は6千行程度です。
またその中で超高速である必要があるのは、2000行程度になると思います。
(4000行の部分は約60Hzで実行します)
>>550
一応出来ますよ。ただ、大規模な物は作った事ないので、検討段階なんです。
>>551
値の参照はどうでしょう?
たとえば、〇->aと直接aを参照するのに速度の違いはありますか?
>>553
多分違うけど、内容は似てそうね・・・。
>>555
見直すべき設計が出来てない状態です。
564デフォルトの名無しさん:2005/03/31(木) 23:12:46
>>552
そもそも、他の OOPL に比較した時の C++ の利点って
「必要とあらば C と同等の実行速度が得られる」のと、
「それをプログラマが制御できる」所だしね。
565553:2005/03/31(木) 23:26:56
>>563
そういやうちのとはリフレッシュレートが違うな。
こちらはユーザインタフェース関係でつ。まあそんな話はさておき。

> 値の参照はどうでしょう?
> たとえば、〇->aと直接aを参照するのに速度の違いはありますか?
そんなくだらないことはプロファイリングしてから考えてください。
"まず実際に計測をすること。そこで本質が何かをつかむこと。十中八九、あなたの推測は間違っています"
―"リファクタリング プログラミングの体質改善テクニック"より
566デフォルトの名無しさん:2005/03/31(木) 23:29:51
箸の上げ下ろしを論うようなコードの効率を云々するより、
PCなどのハードウェアを更新する方がよっぽど建設的な悪寒。
まぁ>565も言ってるが、プロファイルも取らないであれこれ言っててもね。
567542:2005/03/31(木) 23:33:53
>>565
耳が痛いですね。聞く前に実験してみるべきでした。
もうちょっと詰めます。

同じような分野だと思いますよ。うちの他にやってる所1箇所知ってますし。
周波数は最低限が300Hzであって、目標は1000Hzです。
そちらも頑張ってください。
568542:2005/03/31(木) 23:38:32
>>566
ハードウェアは既にいいのを使っています。
勿論最高の物では無いでしょうけど、
デバイスの関係で一回構築しちゃったものを
変更するのはちょっと難しいんですよね。
569デフォルトの名無しさん:2005/03/31(木) 23:51:02
>>563
○.a と a では同じです
○->a と a はポインタ参照するひと手間が入りますね
でも、同じポインタを集中して参照するようにコーディングすれば
そんなに違いはないと思われます
それと、テンプレートなどをうまく使って
なるべくオーバーヘッドをなくすような設計をすれば
C++も結構捨てたものじゃないと思われますが
570デフォルトの名無しさん:2005/03/31(木) 23:53:23
hoge.aでもhogeが参照なら当然->と(ほとんどの場合)同じになってくる。
571デフォルトの名無しさん:2005/03/31(木) 23:54:52
計算機の性能をあげるのが建設的とか言っている奴、アホだろ?
アルゴリズムを変更すれば10倍速さが変わることだってあるのに。
572デフォルトの名無しさん:2005/03/31(木) 23:55:53
げっもうレスがこんなに付いていたとは
そんなくだらない事、箸の上げ下ろしを論うような事を
答えちゃってすみませんね
573デフォルトの名無しさん:皇紀2665/04/01(金) 00:19:14
察するに、C++によるどうでもいいようなボトルネックよりも
数値計算それ自体のほうが桁違いに重くなる分野だと思うのですが。

OOPで作られた60Hzで動くソフトってだけならそこらへんにいくらでもある。例えばゲーム。
プレステやゲーセンのゲームは、PCよりはるかに貧弱なハードで動いてますよ。

とにかく、何も考えずに富豪的プログラミングしてみれば?
俺は、9対1以上で何の問題も起きないほうに賭けるね。
それで遅くて、プロファイル取っても駄目そうならまたゼロから書き直せばいいだろう。
その程度の体力もないやつは真のプログラマじゃない。
574デフォルトの名無しさん:皇紀2665/04/01(金) 00:22:04
>>573 投稿日に異変が。
575デフォルトの名無しさん:皇紀2665/04/01(金) 00:26:35
どうなっとるんじゃ
576デフォルトの名無しさん:皇紀2665/04/01(金) 00:31:01 BE:63000645-###
エイプリルフールだけど意味不明♪
577デフォルトの名無しさん:皇紀2665/04/01(金) 00:31:40
さらにこんなことにも
http://www.2ch.net/
578デフォルトの名無しさん:皇紀2665/04/01(金) 01:49:29
デバッグライトが正しいかどうかは、
どうやったらデバッグできるのでしょうか?
579デフォルトの名無しさん:皇紀2665/04/01(金) 02:42:12
>>578
逆に問うぞ?
デバッグライトをデバッグしたとしてそれが正しいかどうかはどうやって調べるんだ?
580デフォルトの名無しさん:皇紀2665/04/01(金) 02:43:06
>>579
好き好き大好き
581デフォルトの名無しさん:皇紀2665/04/01(金) 02:44:02
>>579
デバッグライトをデバッグしたのをデバッグしてそれが正しいかどうかは(ry
582デフォルトの名無しさん:皇紀2665/04/01(金) 02:44:52
>>581
愛してます
583デフォルトの名無しさん:皇紀2665/04/01(金) 11:49:24
素人がファミコンのドラクエT程度のRPGをC++で作るとしたら、
どれくらいの期間、勉強すればできますかね?
独学です。本丸ごと1冊覚えるぐらい?もっとかな?
584デフォルトの名無しさん:皇紀2665/04/01(金) 11:55:02
テスト

日付かわっ録るかな
585デフォルトの名無しさん:皇紀2665/04/01(金) 12:00:16
>>583
素人でもセンスがあるならマニュアルだけで作れる。
センスがないなら本1冊では何も作れない。
586デフォルトの名無しさん:皇紀2665/04/01(金) 12:03:20
根気もあればネットで調べて作れる
587デフォルトの名無しさん:皇紀2665/04/01(金) 12:08:36
>>585
なるほど。わかんないようで、わかりやすいっす。

では、その「センス」が一般人並み、平均的なもの。だとどうでしょう・・
間をとって、本1冊ってとこですか?w


>>586
まじっすか。ネットで調べて作れるぐらい簡単って、とらえていい?
それとも、死ぬほどネットで調べ続けなきゃ無理。かな?
588デフォルトの名無しさん:皇紀2665/04/01(金) 12:11:15
>>583
勉強しながらの簡単な流れだ。
できるかできないかは、やってみてから考えろ。

〜プログラム〜
※やる気があればできるだろ。
1.簡単な絵を表示してみる。
2.マップを表示してみる。
3.キー入力してみる。
4.スクロールしてみる。
5.イベントを処理してみる。
6.戦闘をしてみる。
7.音を鳴らしてみる。
8.バランス調整をしてみる。

〜素材〜
※どうがんばっても、上手い人にはかなわないので妥協も必要。誰かに頼むとかね
1.キャラパターン作成
2.マップチップ作成
3.マップ作成
4.アイテム作成
5.モンス作成
6.イベント作成
7.SE、BGM作成
589デフォルトの名無しさん:皇紀2665/04/01(金) 12:15:22
> では、その「センス」が一般人並み、平均的なもの。だとどうでしょう・・
こんな質問をするような人間に(ry
590デフォルトの名無しさん:皇紀2665/04/01(金) 12:16:08
そんなキミはRPGツクー(ry
591デフォルトの名無しさん:皇紀2665/04/01(金) 12:17:54
>>590
ソレダm9(・∀・)ビシッ!!
592デフォルトの名無しさん:皇紀2665/04/01(金) 12:20:48
>>587
四の五の言う前にやれ。
その上で本が必要だと思ったら読め。
それでも解らなかったら聞け。
その時は優しく答えてやる。
593デフォルトの名無しさん:皇紀2665/04/01(金) 13:37:14
>>592
愛してます
594デフォルトの名無しさん:皇紀2665/04/01(金) 14:00:08
取り合えず学習書の代金だけで1万超えると思うよ
そんで学習期間が半年から1年
AMAZONとかの売れ行き順見れば良書が手に入るからそれで
595583:皇紀2665/04/01(金) 15:37:34
うおー。なんか反響でか!

>>588-594
>>589 ノー! 私センスあるアル
>>590 いや、そういう意味でドラクエTを例に出したワケでもないのでw
>>591 うっせ!ヒゲそれ!
>>592 それが、まず先ですよね。本の選び方は>>594さんのやり方で。
>>593 ワタシジャダメデスカ
>>594 了解です。売れてる本からチェックしてみます。

ありがとね〜。
なんかこのスレ、優しい人多いな!
596デフォルトの名無しさん:皇紀2665/04/01(金) 16:32:26
>>595
俺も>>586にどっちかっていうと賛成。
入門書は買って読んだらいいと思うけど、
一通りわかってきたらリファレンス系の書籍はあんまり必要無い。
っていうか書籍めくるよりぐぐる方がよっぽど楽。
機能からの逆引きもできるし、例も豊富。
俺等ごときがつまづくようなことはたいてい既に誰かが経験してる。
597デフォルトの名無しさん:皇紀2665/04/01(金) 16:54:46
ネットが便利なのは確かだが、書籍を否定するのもいかがなものか
ネットは常に使えるとは限らないからな
598デフォルトの名無しさん:皇紀2665/04/01(金) 17:10:34
ネットは堂々と嘘書いてることがあるから気を抜けない

まあ書籍も嘘書いてたりするが、ちゃんと本を選べば大体大丈夫だしな
599デフォルトの名無しさん:皇紀2665/04/01(金) 17:11:29
デバッグしたデバッグライトをデバッグして、
そのデバッグしたデバッグライトをデバッグして、
また、そのデバッグしたデバッグライトをデバッグして、
また、そのデバッグしたデバッグライトをデバッグして、
また、そのデバッグしたデバッグライトをデバッグして、
また、そのデバッグしたデバッグライトをデバッグして、、、

ってきりが無いのですが、どうしたらいいでしょうか?
600デフォルトの名無しさん:皇紀2665/04/01(金) 17:12:24
思い切ってあきらめる
601デフォルトの名無しさん:皇紀2665/04/01(金) 17:12:24
国松様のお通りだい!みたいだなw
602デフォルトの名無しさん:皇紀2665/04/01(金) 17:13:20
すごい!同時刻だ!はじめてみた
603デフォルトの名無しさん:皇紀2665/04/01(金) 17:13:28
最近だと、JTのCMのパターンか?
604デフォルトの名無しさん:皇紀2665/04/01(金) 17:13:57
さすが、皇紀のなせる業?
605デフォルトの名無しさん:皇紀2665/04/01(金) 18:16:50
>>599
最初のデバッグライトを信用すれば良い
簡単なことだ
606デフォルトの名無しさん:皇紀2665/04/01(金) 18:18:33
ちょっと前だと、角田信明が、徹子の部屋と、
似たようなNHKのトーク番組の両方に出ていたやつかな。
607デフォルトの名無しさん:int 2ch =05/04/01(金) 21:17:35
俺のことか
608デフォルトの名無しさん:int 2ch =05/04/01(金) 21:29:22
割り込みか。
609デフォルトの名無しさん:int 2ch =05/04/02(土) 07:04:24
'05/04/01(金) 21:29:22' はint型に変換できませんとエラーが出るんですが。
610デフォルトの名無しさん:int 2ch =05/04/02(土) 08:29:08
そもそもint 2chなんて宣言ができないことについて
611デフォルトの名無しさん:int 2ch =05/04/02(土) 08:36:59
だからC/C++じゃなくてアセンブラなんだよ。
DOSのシステムコールのint 2Chが時刻取得だってネタ。
612デフォルトの名無しさん:int 2ch =05/04/02(土) 08:40:56
Chになってねーじゃn
613デフォルトの名無しさん:int 2ch =05/04/02(土) 12:49:49
>>611
そのアセンブラで Shift-JIS の '=' がコメントならば完璧。
614デフォルトの名無しさん:int 2ch =5,2005/04/02(土) 14:44:24
ファイル名の付け方で、userManager.cpp か、UserManager.cpp か、usermanager.cppのどれがいいか迷っています。
どなたか、お勧めを教えて下さい。
あとメソッド名は、sendHoge()か、SendHoge()か、どっちがいいか教えて(´・ω・`)
615デフォルトの名無しさん:int 2ch =5,2005/04/02(土) 14:47:46
>>614
俺はUserManager.cppとSendHoge()にしている。
ファイル名の方はプログラミング始める前からこうだった。
(どうせWindowsではファイル名の大文字小文字は見かけだけだけど)
SendHoge()はWin32APIに合わせて。
616デフォルトの名無しさん:int 2ch =5年,2005/04/02(土) 15:07:41
>>615
レスサンクスこ。やっぱりその形式がメジャーですかね!
617デフォルトの名無しさん:int 2ch =5年,2005/04/02(土) 15:12:08
C/C++だとSendHogeかsend_hogeがメジャーだな。sendHogeだとJavaくさい。
618デフォルトの名無しさん:int 2ch =5年,2005/04/02(土) 15:26:16
ファイル名は user_manager.cpp か usermanager.cpp, 関数は send_hoge() かなぁ。
標準ライブラリがそうなってるし。

キャメルノーテーションも結構だが、Java だけでやってほしい。ウザいし、読みずらいよ。
619614:int 2ch =5年,2005/04/02(土) 15:29:06
>>617
sendHogeはJavaくさいんですか、なるほど。
どこかのスレで、大文字で始まる名前はイクナイみたいなレスがあったのですが、
その人はJava使いだったのかな。
620デフォルトの名無しさん:int 2ch =5年,2005/04/02(土) 16:02:27
なんと言われようと、私はsendHoge()派だ。
Java? んな言語、書いたことも見たこともましては喰ったこともない。
621デフォルトの名無しさん:int 2ch =5年,2005/04/02(土) 16:16:07
>>618
たしかに、標準ライブラリに合わせる意味では send_hoge() の方が良いね。
命名規則が混在してるソースなんか読みたくない…。

> キャメルノーテーションも結構だが、Java だけでやってほしい。ウザいし、読みずらいよ。
キャメル・ノーテーションは Java 以外でも結構見掛けるよ。読みずらいのには同意。
622デフォルトの名無しさん:int 2ch =5年,2005/04/02(土) 16:16:26
でも飲んだことはある。
623デフォルトの名無しさん:int 2ch =5年,2005/04/02(土) 16:24:55
ハンガリアン最強伝説
624デフォルトの名無しさん:int 2ch =5年,2005/04/02(土) 16:26:39
しかし今回はファイル名と関数名。
関数名にハンガリアンを付けられないわけじゃないけどさ。
625デフォルトの名無しさん:int 2ch =5年,2005/04/02(土) 16:27:12
ファイル名:すべて小文字
クラス名:大文字から
メンバ:小文字から
626デフォルトの名無しさん:int 2ch =5年,2005/04/02(土) 16:48:40
ファイル名:UNIX/Linuxでもなけりゃ個人の嗜好の問題
クラス名:使う人間が理解できない、分かりづらいなんてことが無ければ個人の嗜好の問題
メンバ名:同上
627デフォルトの名無しさん:2005/04/02(土) 17:54:55
なぜ下のようなコードを書くとwhile(1)内のcin.get(ch)を入力する前に終わってしまうのですか?
予想ではどこかで余分な'\n'が入力されてると思うのですが、どこで、なぜ入力されてしまうかわかりません。
解決方法を教えてください。
int main()
{
int option;
int key;
string text;
char ch;
char ch2[80];

do{
cout << "1:a." << endl;
cout << "2:b." << endl;
cout << "3:c." << endl;
cout << "Choose option(1-3): ";
cin >> option;
}while(option < 1 || option > 3);

if(option == 1 || 2)
{
do{
cout << "Type key value between -95 to 95:";
cin >> key;
}while(key < -95 || key > 95);
628627:2005/04/02(土) 17:55:26
cout << "Type a text: ";
text = "";

//fgets(ch2, 81, stdin );

while(1)
{
cin.get(ch);
if(ch == '\n')
break;
text += ch;
}


if(option == 1)
cout << 'a' << endl;
else if(option == 2)
cout << 'b' << endl;
cout << "Text is: " << endl << text << endl;

}
else if(option == 3)
{
cout << "help" << endl;
}
return 0;
}
629デフォルトの名無しさん:2005/04/02(土) 18:33:39
>>627
読んでないが、問題のcinより前のcinで改行コードを読み捨ててないのが原因だろう。
1行単位で読むようにするか、改行コードを読み捨てるのがいい。
630デフォルトの名無しさん:2005/04/02(土) 19:50:06
>>629
改行コードを読み捨てるのはどのようにすればいいのでしょうか?
631!629:2005/04/02(土) 19:57:10
改行コードを読んでから、何もしないで次の処理に進めばいい。
632デフォルトの名無しさん:2005/04/02(土) 20:00:17
>>628
そこwhileでループしなくてもstd::getline(cin, text);で済む。
633デフォルトの名無しさん:2005/04/03(日) 08:33:40
>>627
こういうときはflush使うんじゃなかったっけ?
634デフォルトの名無しさん:2005/04/03(日) 10:53:47
>>633
標準入力をflushしちゃいけません。
635プログラム始めたとです・・・:2005/04/03(日) 19:26:08
はじめまして。
今年の秋に、会社で試験があるため今日からC言語始めました。
勉強は、「C++BuilderX」ってのを使ってます。
で、早速ショボイ質問なんですが
------------------------------------------------------
#include <stdio.h>
#include <math.h>

main()
{
float a,b,c,s,area;

printf("Enter three lengths of the edges of a triangle.\n");
scanf("%f%f%f", &a,&b,&c);
s = (a+b+c)/2;
area = sqrt(s*(s-a)*(s-b)*(s-c));
printf("The area of the triangle is %f.\n",area);
return 0;
}
-------------------------------------------------------
このプログラムを実行したとき、
a,b,cの値を入力するまで、printfで文字が出力されません。
printf("Enter three lengths of the edges of a triangle.\n");
で、"Enter..."を表示してからscanf()が始まると思うのですが、なぜでしょうか?
なにとぞ知恵をお貸しください。
636デフォルトの名無しさん:2005/04/03(日) 19:49:33
俺んとこ、VC++でやってみたがEnter...表示されるぞ?
637プログラム始めたとです・・・:2005/04/03(日) 20:10:30
早くも頓挫したー!
ソフトの設定かなぁ?
638デフォルトの名無しさん:2005/04/03(日) 20:12:38
printf(〜 のあとに fflush(stdout);
639プログラム始めたとです・・・:2005/04/03(日) 20:16:28
うおおおおおお!できた!
ありがとう!
早速fflush(stdout);をググるとしよう。
640デフォルトの名無しさん:2005/04/03(日) 20:29:22
Cって規格じゃscanf等の前にstdoutをflushするようになってないの?
641デフォルトの名無しさん:2005/04/03(日) 20:43:13
慣れてきたらscanfは使わないようにしよう、な!
642プログラム始めたとです・・・:2005/04/03(日) 20:48:18
えッ!
scanfって使っちゃまずいの?

scanf使っちゃいけないとなると、
俺の使える関数が、3/4ぐらいになるとです・・・
643デフォルトの名無しさん:2005/04/03(日) 20:53:53
理解した上で使ってれば問題ないけど
fgetsを使った方が無難
644デフォルトの名無しさん:2005/04/03(日) 20:54:22
>>642
学校の宿題くらいでなら使ってもいいんじゃないか?
645デフォルトの名無しさん:2005/04/03(日) 20:59:14
>>642
4つが3つか。
大丈夫、代わりにfgets()とsscanf()を覚えればいい。

>>640
そんな阿呆な仕様があるかい。
たまたまstdoutをバッファリングしない糞環境があるだけだ。
646デフォルトの名無しさん:2005/04/03(日) 21:01:46
Windows最凶
647デフォルトの名無しさん:2005/04/03(日) 21:06:35
工作員乙
648デフォルトの名無しさん:2005/04/03(日) 22:46:39
プロセスを数秒間止まらせたい場合はどのように書けばよろしいのでしょうか
649デフォルトの名無しさん:2005/04/03(日) 22:49:02
Sleep
650デフォルトの名無しさん:2005/04/03(日) 22:52:03
>>649
すみません、それはWinAPI依存ですか?
651デフォルトの名無しさん:2005/04/03(日) 23:08:22
プロセスって時点で環境依存だと思うぞ…
ACEやboost::thread等を使えば移植性が少しは出来るけど
652デフォルトの名無しさん:2005/04/03(日) 23:12:58
そうなんですか、すみません。
Perlで言うsleepをしたかったんです。
これって環境依存なんですね。ありがとうございました。
653デフォルトの名無しさん:2005/04/04(月) 02:05:25
windowsの漢字変換を呼び出す事ってC++で出来ますか?
654デフォルトの名無しさん:2005/04/04(月) 02:14:57
>>653
「猫でも〜」の第280〜283章を参照
655デフォルトの名無しさん:2005/04/04(月) 08:56:20
>>652
そもそもPerlのsleepと「プロセスのSleep」は考え方が違う
656デフォルトの名無しさん:2005/04/04(月) 10:53:20
そういや Win32 の Sleep() は呼び出したスレッドしか止まらない。
657デフォルトの名無しさん:2005/04/04(月) 11:39:46
>>656
SetPriorityClass(hprocess, REALTIME_PRIORITY_CLASS);
を呼び出してから中でごにょごにょすると、他のプロセス(システムまで)が
止まるぞ^^;
658デフォルトの名無しさん:2005/04/04(月) 14:02:37
それは過負荷というんじゃないか…?
659デフォルトの名無しさん:2005/04/04(月) 14:38:13
REALTIME_PRIORITY_CLASSで無限ループすれば、これより低いスレッドは一切実行機会が回ってこない。
660デフォルトの名無しさん:2005/04/04(月) 15:52:02
だからそれは暴s(ry
661デフォルトの名無しさん:2005/04/04(月) 15:55:22
たしかにスリープしてることにゃ代わりはないけど
662デフォルトの名無しさん:2005/04/04(月) 17:52:28
>661
スリープではなく金縛り
663デフォルトの名無しさん:2005/04/04(月) 18:09:36
パソ暦6年主にネットサーフィン
仕様OS XP SP2
プログラム経験 大学の授業でCをさわりだけやる。
mule test.c
gcc test.c
a.out
こういう風になんか教えられました。
目標 MonaOSでなにやってるか分かるレベルになりたいです。
それで、まずうちのPCにどういうソフトを入れて環境を整えればいいですか?
664デフォルトの名無しさん:2005/04/04(月) 18:10:38
>>663
リヌクス gcc emacs プログラミング
665デフォルトの名無しさん:2005/04/04(月) 18:12:23
>>663
コンピュータサイエンス入門を読む。計算機プログラムの構造と解釈を読む。SchemeとHaskellを覚える。Cコンパイラを作ってみる。
666デフォルトの名無しさん:2005/04/04(月) 18:14:15
>>664
はい、たしかに大学のパソコンはリナックスが入ってました。
PCはXPなのでmule test.cの部分はメモ帳でもいいかなと思ったんですが、
gcc test.cの部分はWindowsだとどうなるんでしょうか?
667デフォルトの名無しさん:2005/04/04(月) 18:26:42
>>666
windowsは削除、もしくはパーティションを切り直してマルチブート、もしくは新しくHDDを買ってきてHDDをつなぎ変えてLinuxとWindows両方使えるようにする。
WindowsでLinuxと同じ環境を作ろうとすると不便だからやめた方がいい。
どうしてもっていうならcygwinというものがあるが、これも使いにくい。
668デフォルトの名無しさん:2005/04/04(月) 18:38:24
gccってのはコンパイルってことだったんですか。調べて少し賢くなりました。
コンパイラとは膨大にあり、Linuxに入ってたのがemacsってのですか。
>>667さんのいうとうりLinuxの環境にするのがベストなんでしょうが、資金がないので
Windowsで動くもの、これもまたいっぱいるんですが、どれにしましょう?
とか考えてるうちにC++の勉強の前にやることが多いなあと感じてきました。
これも勉強ですか?
669デフォルトの名無しさん:2005/04/04(月) 18:48:47
誰かお前には無理だって言ってやれよ
670デフォルトの名無しさん:2005/04/04(月) 18:48:52
用意する環境なんて何を作りたいのかでころころ変わる
671デフォルトの名無しさん:2005/04/04(月) 19:05:45
>>668=663

藻前には無理
672デフォルトの名無しさん:2005/04/04(月) 19:15:24
とりあえずgccにはWindows版もあることだけは書いておこう。
673デフォルトの名無しさん:2005/04/04(月) 19:21:11
>>668
マルチブートでLinux環境を作るのは無料で全てできる。
674デフォルトの名無しさん:2005/04/04(月) 19:22:28
>>668
自分で環境をそろえることは、ノートや鉛筆を買いそろえるのと同じ事。
初めから用意してあるのだったら(学校)問題ないが、家にはないんでしょ。
675デフォルトの名無しさん:2005/04/04(月) 19:23:10
そんなことくらい自分で出来なきゃ、プログラミングなんか無理、
676デフォルトの名無しさん:2005/04/04(月) 19:24:20
>>675
無理、 -> 無理。
677デフォルトの名無しさん:2005/04/04(月) 19:33:11
>>668
GCCはコンパイラ。コンパイラとはコンパイルするソフトウェア。
コンパイルとは抽象的なコードから具象的なコードに変換すること。
たとえば、C言語のコードから機械語に変換すること。

WindowsでCによるプログラミングがしたいのならVisualC++を買いなさい。
678デフォルトの名無しさん:2005/04/04(月) 20:50:09
別にVisual C++ 2003 Tool Kit +SDKで十分じゃないかなぁ
そろえるの面倒ならとりあえず、cygwin
DOS画面に抵抗ないなら…だけど
まぁ、学校がLinux環境つうなら、大して問題じゃないっしょ
679デフォルトの名無しさん:2005/04/04(月) 21:17:04
>>677-678
>>663からの流れとして読んだ方がいいよ
680デフォルトの名無しさん:2005/04/05(火) 01:55:24
STLのstringの質問です。
char* を引数にとる関数にstringオブジェクトを渡すときはどうすればよろしいでしょうか?

下ソースみたいな感じで先頭文字のアドレス &str[0] を渡してやっても動いたのですが、
なんだかスマートでないし、そもそも正しいやり方かどうか不明でして。
他にやり方があれば教えてくださいませ。
環境はVisualStudio.NETのVCです。よろしくお願いします。


void test(char* str) {
str[3] = 'o';
}

void main() {
string str("japan");
test(&str[0]);
cout << str << endl;
}
681デフォルトの名無しさん:2005/04/05(火) 02:06:35
その関数を窓から投げ捨てる
682680:2005/04/05(火) 02:10:44
やっぱ呼び出した関数先で文字列の長さを変更しても、stringオブジェクトのサイズ等の
メンバは更新されてない。うひー、使い方わかんねー。

void main() {
string str("japan");
str.reserve(255);
strcpy(&str[0], "01234567890");
cout << str << endl;
}
683デフォルトの名無しさん:2005/04/05(火) 02:10:49
>>680
まず最初に。
 string( basic_string )はSTLではない。

つぎに、&str[0]は激しく良くない。
constなポインタを取得するならbasic_string::c_str()があるが、
>>680のtest()には渡せない。
そもそも、basic_stringの管理する文字列をポインタ操作で
書き換えようとするのが激しく良くない。
684デフォルトの名無しさん:2005/04/05(火) 02:12:52
>>682
だから、basic_stringを書き換えたいならbasic_stringのメソッド使えって。
strcpyなんぞ使うなボケ。
685680:2005/04/05(火) 02:26:00
よくないというのは激しくわかるのですが、Win32APIを交えながら利用するとどうしても
char*を引数にとる場面が多々あるので。関数先で何を呼ばれるかは手を出しようがないです。
自作クラス作るかー。
686デフォルトの名無しさん:2005/04/05(火) 02:28:48
>>685
Use CString
687680:2005/04/05(火) 02:32:00
やっぱMFCかー('A`)
688デフォルトの名無しさん:2005/04/05(火) 02:50:36
string str;
size_t length = 0;
SomeApi(0,&length);
vector<char> tmp(length);
SomeApi(&tmp[0], &length);
str.assign(&tmp[0], length);

大体こんな感じ。
689デフォルトの名無しさん:2005/04/05(火) 08:21:36
>>683
> string( basic_string )はSTLではない。

初心者スレで得意げにいいかげんなこといってんじゃねーよ。
690デフォルトの名無しさん:2005/04/05(火) 08:37:46
string( basic_string )はSTLではない。フッ
691デフォルトの名無しさん:2005/04/05(火) 08:49:26
std::basic_stringがSTLに含まれると思ってる馬鹿がまだいたのか。
692デフォルトの名無しさん:2005/04/05(火) 08:52:33
#pragma once
class Choge;

class Cfoo
{
public:
(略)
Choge* bar();
Choge* abc();
};

こんな感じのソース(クラス宣言のヘッダー)を見かけたんですが、
この最初のclass Choge;みたいな形の書き方はどういう意味なのでしょうか?
他の場所で定義されているクラスなどを使う場合は、
それを宣言したヘッダなどをincludeするものだと思っていたのですが、
初めて見る書き方です。どういう事なのか教えて下さい。お願いします。
693デフォルトの名無しさん:2005/04/05(火) 09:15:41
>>691
STLに何が含まれて何が含まれないのかがわかる情報元ってあるの?
694デフォルトの名無しさん:2005/04/05(火) 09:16:41
>>692 前方宣言。
695デフォルトの名無しさん:2005/04/05(火) 09:40:15
>>693
いまでも"HP STL"あたりで検索すればまだ拡張子に.hとかついてる時代のSTLが見つかる。
696デフォルトの名無しさん:2005/04/05(火) 09:57:09
>>694
THX!
697デフォルトの名無しさん:2005/04/05(火) 11:24:16
>>692
実際のChogeの定義をCfooよりも後でする場合にそんなカンジにする。
クラスの相互参照がある場合等に使う。

因みにCfooの中ではChogeの実体をもつことは出来ない。参照のみ。
(少し考えれば当たり前なことだが。)
698デフォルトの名無しさん:2005/04/05(火) 12:29:18
>>692
関数を宣言するのに、その関数が使うクラスの定義は無用。
699デフォルトの名無しさん:2005/04/05(火) 12:41:40
class Hoge;

class Fuga {
  Hoge getHoge(); // 合法
  void putHoge(Hoge h); // 合法

  Hoge* a; // 合法
  Hoge b; // 違法
}
700デフォルトの名無しさん:2005/04/05(火) 15:26:18
>>685
P"C"STRかLP"C"STRならstd::stringのc_str()
PCTSTRやLPCTSTRはstd::basic_string<TCHAR>のc_str()
PCWSTRとLPCWSTRではstd::wstringのc_str()

>>687
CStringはATL使えばMFC抜きでも使える。
701デフォルトの名無しさん:2005/04/05(火) 17:30:58
CStringとAnsiStringではどちらのほうが使いやすいですか?
702デフォルトの名無しさん:2005/04/05(火) 17:40:37
使い易さなど問題ではない!!!
MSかそうでないかの違いが重要なのだ!!!!!
703デフォルトの名無しさん:2005/04/05(火) 17:50:01
そうそう、MSじゃなきゃ素直にstd::string使ってる。
704デフォルトの名無しさん:2005/04/06(水) 16:45:18
BCC5.1で、ビットマップファイルをexeファイル内に埋め込んで使用する方法を教えて下さい
705デフォルトの名無しさん:2005/04/06(水) 16:50:23
>>704
リソースファイルを書け。
706704:2005/04/06(水) 16:53:05
>>705
すみません、全く何の事か解りません。
ググり方が悪いのか参考になるページも中々見つかりません・・
707デフォルトの名無しさん:2005/04/06(水) 17:00:48
リソーススクリプトでぐぐれ
708704:2005/04/06(水) 17:10:31
>>707
ありがとうございます!良く解りました
709は@ c178.016.c3-net.ne.jp ◆cplnFO9T0I :2005/04/06(水) 17:17:22
// helloworld.cppの内容。
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello world";
    return 0;
}
// stdafx.h の内容。
#pragma once
#include <iostream>
#include <tchar.h>
//エラーの内容。
error C2065: 'cout' : 定義されていない識別子です。
//何でエラー吐くんだよ。
//猫わかのコードとほとんど同じだろ。
//VC++.netでやったところ変わるわけないんだから。
//もしかしてANSIC++をサポートしてないなんて言う落ち?
710デフォルトの名無しさん:2005/04/06(水) 17:20:08
デースケドガー(゚∀゚)
711デフォルトの名無しさん:2005/04/06(水) 17:23:15
>>709
ヒント:namespace
712デフォルトの名無しさん:2005/04/06(水) 17:23:27
std::cout
713デフォルトの名無しさん:2005/04/06(水) 17:25:54
>>709
http://www.kumei.ne.jp/c_lang/cpp/cpp_61.htm

using namespace std;はおすすめしないが。
714は@ c178.016.c3-net.ne.jp ◆cplnFO9T0I :2005/04/06(水) 17:31:46
>>711-713
そう言うわけだったんですか。
有り難うございました。
715デフォルトの名無しさん:2005/04/06(水) 18:01:13
#pragma onceなんて美しくないと思った春の夕暮れ
716デフォルトの名無しさん:2005/04/06(水) 20:33:18
#defineのほうが
717デフォルトの名無しさん:2005/04/07(木) 13:19:57
おしえてください。
オーバーライドってどういう意味ですか?
718デフォルトの名無しさん:2005/04/07(木) 13:20:47
具具って分かることを聞くな

「オーバーライド」
「オーバーロード」

でぐぐれ
719デフォルトの名無しさん:2005/04/07(木) 13:21:20
720デフォルトの名無しさん:2005/04/07(木) 13:27:32
>>717
「馬乗り」のこと
721デフォルトの名無しさん:2005/04/07(木) 13:28:02
>>719
ありがとうございます。
ところで、このオーバーライドした関数にVirtualをつけて仮想関数にすると何かかわるんですか?
722デフォルトの名無しさん:2005/04/07(木) 13:30:15
質問です。環境は XP、VC++ 6.0 です。

今、a.png b.png c.png の3つの png ファイルがあり、
libpng を使ってこれらの画像を読み込み描画するプログラムを作成しています。
ところが、ユーザに png ファイルがいくつあるかを知らせたくないため、
3つのファイルを統合した png.dat を作成し、
そこからデータを読み込もうと考えています。

これはどのように実装すればよいでしょうか。
思いついたのは、png.dat の中身を
【"a.png" [a.png のデータサイズ] [a.png の中身] "b.png" [b.png のデータサイズ] [b.png の中身] "c.png" [c.png のデータサイズ] [c.png の中身]】 とし、
たとえば b.png を読み込むには、"b.png" という文字列を探し、シークをその位置に移動し、
setLength() を用いて、データサイズ分だけ切り取る、という方法です。
しかしこれだと、b.png という文字列を探すのに手間取るおそれがあります。

こういった場合、普通はどのように実装するのでしょうか。



723デフォルトの名無しさん:2005/04/07(木) 13:38:15
データサイズ読んで fseek() すれば良いじゃないか。
724デフォルトの名無しさん:2005/04/07(木) 13:40:05
>>722
ファイル名とサイズの一覧をファイル先頭にまとめておく
要はヘッダを作る
725722:2005/04/07(木) 13:40:06
age てなかった……。

ぐぐろうと思っても、検索ワードすら思いつかない状況です。
ポイントとなる単語、もしくは詳しい書籍、既に実装済みのライブラリ、
などでも結構ですのでよろしくお願いします。
726722:2005/04/07(木) 13:40:47
>>724
あ、全くですね
その方針で進めてみます。ありがとうございます。
727デフォルトの名無しさん:2005/04/07(木) 13:41:09
>>721
変化はあるが、とりあえず君が気にする必要はない。
728デフォルトの名無しさん:2005/04/07(木) 15:03:10
つーかそれ、まんまアーカイバの実装なんだが。
或いは、mngにするという手もあるのでは?
729デフォルトの名無しさん:2005/04/07(木) 15:41:37
>>722
適当な画像処理ソフトでその三つを横に連結。
libpngで画像の一部を切り取ることは出来るよな。
画像の高さが違うなら無駄はできるがpngならたいして問題にならんだろ。
730デフォルトの名無しさん:2005/04/07(木) 17:00:23
XP、c++ builder4.0なんですけど
fwriteで構造体を書き込もうとすると
char a = 0x0A の部分が、書き終わったファイルの中を見ると
0x0D 0x0A(\n)に書き換わっててビットがずれてしまいます。
なにが原因なんでしょ?
731デフォルトの名無しさん:2005/04/07(木) 17:03:45
>>730
テキストモードで開いてるから
732デフォルトの名無しさん:2005/04/07(木) 17:39:43
Winの改行コードは0x0D0Aだからな
733デフォルトの名無しさん:2005/04/07(木) 18:04:28
C++でstringクラスを使用したいのですが、どのような例外処理をするべきでしょうか?
どんな例外が送られてくるか教えてほしいです。
734デフォルトの名無しさん:2005/04/07(木) 18:19:01
>>733
マニュアル読めよー
735デフォルトの名無しさん:2005/04/07(木) 18:28:15
初心者歓迎とは名ばかりのスレへようこそ!
736デフォルトの名無しさん:2005/04/07(木) 18:28:20
>>734
stringってSTLのマニュアルに載ってたんですね;知りませんでした;;
失礼しました。
737デフォルトの名無しさん:2005/04/07(木) 18:34:41
回答者が初心者だからw
738デフォルトの名無しさん:2005/04/07(木) 18:35:30
>>735 ぷっ ほんとだね
739733:2005/04/07(木) 18:36:56
やっぱり分からないんですけど・・・;
それとも例外発生しないのでしょうか?
740デフォルトの名無しさん:2005/04/07(木) 18:50:55
>>739
とりあえずstd::exceptionをcatchするようにすればいい。
これで標準ライブラリからは何を投げられても全部捕まえられる。
741733:2005/04/07(木) 19:02:05
>>740
ありがとうございます!

std::exceptionって聞き覚えあるなぁとおもって調べてみたらstd::bad_allocから継承してるクラスですね。
もしかしてcatchって継承クラスが投げられても基本クラスとしても捕まえられるのかな?
だとしたらものすごく勉強になりました!
ほんと感謝です!
742デフォルトの名無しさん:2005/04/07(木) 19:02:13
もうあれだ
catch (...) {
    std::cout << "ぬるぽ";
}
743デフォルトの名無しさん:2005/04/07(木) 19:02:52
fseek(fp, 0L, 0);
2番目の引数はlongらしいんですが0LのLってなんですか?

744デフォルトの名無しさん:2005/04/07(木) 19:05:21
0 -> int
0L -> long
0UL -> unsigned long
ぬるぽ
745デフォルトの名無しさん:2005/04/07(木) 19:06:51
>>741
参照で捕まえないと、スライシングされるだけ
ガッ
746デフォルトの名無しさん:2005/04/07(木) 19:10:52
>>740
MFCと一緒に使うと、CMemoryExceptionが飛んできたりする。
スレ違いだが。
747デフォルトの名無しさん:2005/04/07(木) 19:24:02
>744
じゃあ5Lだとlongで5バイト
実質20バイトってことですか?
748デフォルトの名無しさん:2005/04/07(木) 19:25:49
低脳の思考回路は理解出来ん
749デフォルトの名無しさん:2005/04/07(木) 19:26:59
>>747
Lはlong型の値だと言う事を表す接尾辞。
Uはungined型の 〃
750デフォルトの名無しさん:2005/04/07(木) 19:29:46
short が 2byte, long が 4byte ってのは規格で決まってるの?
751デフォルトの名無しさん:2005/04/07(木) 19:33:57
shortが2バイト、longが4バイトは決まり
intは環境依存
752デフォルトの名無しさん:2005/04/07(木) 19:34:38
>>741
std::stringは少なくともat()がstd::out_of_rangeを投げるし、
max_size()より文字列の長さが増えるときにはstd::length_errorを投げる。
やはりともにstd::exceptionから派生している。
http://www.microsoft.com/japan/developer/library/vclang/string2_basic_string.htm#out-of-range%20error
753デフォルトの名無しさん:2005/04/07(木) 19:41:13
(ry)えくせぷしょん
754デフォルトの名無しさん:2005/04/07(木) 19:42:28
>>751
嘘吐き
755デフォルトの名無しさん:2005/04/07(木) 20:03:00
>>751
>>754
どっちだよ
756デフォルトの名無しさん:2005/04/07(木) 20:03:20
>>751
longが8byteの処理系もある。
そもそもshortとintは-32767〜32767、longは-2147483647〜2147483647の範囲以上の整数を表せれば良いことになっている。
つまり1byte == 16bitの環境ではshortが1byteでも全然問題ない。
757デフォルトの名無しさん:2005/04/07(木) 20:09:34
1byteが16bit・・・
758デフォルトの名無しさん:2005/04/07(木) 20:16:45
規格上は、long>=int>=shortしか保証されてなかったような。
759デフォルトの名無しさん:2005/04/07(木) 20:16:54
そんな環境聞いたことないわい
760デフォルトの名無しさん:2005/04/07(木) 21:13:39
bccって環境変数:Includeで設定したフォルダって読みますか?
761デフォルトの名無しさん:2005/04/07(木) 21:21:25
読まない。
けれどbcc32.cfgをいじればそういう風にも出来る。
762デフォルトの名無しさん:2005/04/07(木) 21:38:13
>>759
PC-FXGAのビデオメモリは1byte12bitだった希ガス。
763デフォルトの名無しさん:2005/04/07(木) 21:41:53 BE:38820645-
>>759
DSPとかで、short==16bit、int==32bit、long==40bitというのがあったりする。
764デフォルトの名無しさん:2005/04/07(木) 23:05:17
俺今までbyteはbitの上位単位とだけ思っていたよ。
765デフォルトの名無しさん:2005/04/07(木) 23:09:43
まぁ1オクテットといっておけば間違いない
766デフォルトの名無しさん:2005/04/07(木) 23:17:07
short==16bit、int==32bit、long==32bitがスタンダード
767デフォルトの名無しさん:2005/04/07(木) 23:46:41
>>766
どこのスタンダードだ?全くもってくだらん
くだらん
768デフォルトの名無しさん:2005/04/07(木) 23:49:49
x86だろ
769デフォルトの名無しさん:2005/04/07(木) 23:54:17
IA-32だろ
770734:2005/04/08(金) 00:13:20
>>739
使うメンバ関数のところ調べたら、それが投げる例外くらい書いとるやろ
そのマニュアルがしょぼーんなんやったら、
ttp://www.cppreference.com/
とかでも見ればいいわけやし。
771デフォルトの名無しさん:2005/04/08(金) 01:00:42
リンクエラーが出ます。
Undefined "プログラム中に全く存在しない文字列"
っていうメッセージ付きで。


コメントアウトしまくって調べたら

define PI 3.14...結構長い
float x;
while(x>PI) x-=2.0;

この(x>PI)のところで変なことになっているみたいです。
while(1.0f) x-=2.0;
としたらリンクエラーがなくなりましたので。

何が原因か分かる方、いらっしゃいませんか?
宜しくお願いします。
772デフォルトの名無しさん:2005/04/08(金) 01:07:36
#define じゃないの?
x の宣言は大丈夫なの?
while (1.0f) とかバカじゃないの?
773771:2005/04/08(金) 01:27:47
そうそう#defineです。
ちなみに#defineは他のhファイルに書かれています。
while(1.0f)はどこのせいでエラーが出ているのか特定するために書き変えてみただけで。。。
774デフォルトの名無しさん:2005/04/08(金) 01:56:11
そのfloat xは、後でちゃんと初期化してるの?
他のヘッダファイルはちゃんとインクルードされてるの?
試しに同じファイル内でPIを定義してみたの?
775771、773:2005/04/08(金) 02:04:34
xもPIもwhile(x>PI)も同じ関数中に何度も出てきており、
if(x>PI)は残しておいても大丈夫、
while(x>PI)は全滅、という状況です。
PIを3.14...(長い)におきかえて
while(x>3.14...(長い))が大丈夫のところもあれば、
while(x>3.14...(長い))でもリンクエラー出すところもあり、
わけがわからない状態です。
776デフォルトの名無しさん:2005/04/08(金) 02:13:04
「Undefined "プログラム中に全く存在しない文字列"」って具体的に何?
777デフォルトの名無しさん:2005/04/08(金) 02:14:21
空白スペースが入ってましたってオチじゃないよね?
778デフォルトの名無しさん:2005/04/08(金) 02:15:24
空白スペースじゃないや。全角スペース。
779771、773、775:2005/04/08(金) 02:24:11
LinuxでgccではOKだったものを
Windowsの統合開発環境に持ってきたものです。
while(x>PI)を全てコメントアウトすれば動くことは動きます。
単純ミスではないと思っておりますが。。。

「Undefined "プログラム中に全く存在しない文字列"」
"_dbxxx"とか出ていた気がします。今家なんでわかんないです。
("_dbエクスエクスエクス"と表示されていたわけではないです)
while(x>PI)は全部で4箇所あるんですが、リンクエラーが4個でており、
xxxの部分はそれぞれ違っておりました、確か。。。
780デフォルトの名無しさん:2005/04/08(金) 03:26:30
途中で#undefされてたりしてな
781デフォルトの名無しさん:2005/04/08(金) 04:15:16
>>771
> Undefined "プログラム中に全く存在しない文字列"
そんなエラーメッセージ見たことないぞ。嘘をついているのか超マニアックなコンパイラを使ってるのかどっちなんですか
782デフォルトの名無しさん:2005/04/08(金) 04:22:56
>>781
あほ?
783デフォルトの名無しさん:2005/04/08(金) 04:46:43
int a[256];
int* p=a;
printf("%d",sizeof(a));

もしかして、sizeofって、ただの置換処理ですか?
プリプロセッサ処理というのは聞いたことがあるような。
sizeof p -> ポインタ -> 4Byte
sizeof a -> 配列 -> sizeof(int) * 256
sizeof p[0] -> int型データ -> sizeof(int)
784デフォルトの名無しさん:2005/04/08(金) 06:32:26
そうだよ
785デフォルトの名無しさん:2005/04/08(金) 08:51:42
>>779
Windowsの統合開発環境が何か判らないのだけど、
改行コードを変えたらどうなる?
#あ、関係ない気がしてきた。

ソース晒す方が早い悪寒。
786デフォルトの名無しさん:2005/04/08(金) 09:20:29
>>783 ちがうよ。 sizeof は演算子だよ。
787771、773、775、779:2005/04/08(金) 09:28:00
仕事場から。

リンクエラー: Undefined : "_dpfge"
Referenced from "関数名()" in main.cpp
リンクエラー: Undefined : "_dpfgt"
Referenced from "関数名()" in main.cpp
リンクエラー: Undefined : "_dpfle"
Referenced from "関数名()" in main.cpp
リンクエラー: Undefined : "_dpflt"
Referenced from "関数名()" in main.cpp
Link failed.

これ以上は出せないっす。
考えて下さったみなさんありがとう。

今日はもう書き込めません。
788デフォルトの名無しさん:2005/04/08(金) 09:49:11
>>787
後ろについてる ge,gt,le,lt は、それぞれ
greater than or equal to, greater than, less than or equal to, less than の略だろう。
そのコンパイラは浮動小数点数の比較に独自のライブラリ関数を使うみたいだな。

リンクオプションが怪しい、ぐらいしか言えんな。
マイナーなコンパイラなら、コンパイラベンダに問い合わせるのもいいだろう。
解決しました。
ありがとうございました。
double演算不可でfloatと明示してやらないとダメだったというものでした。
790デフォルトの名無しさん:2005/04/08(金) 11:38:38
>>771
浮動小数点数を直接比較することがそもそもの間違い。
791デフォルトの名無しさん:2005/04/08(金) 12:38:55
既に存在するクラス(標準ライブラリに含まれているようなもの)に、メンバ関数を追加する事ってできますか?

つまりhogeという自作クラスを作ったとします
hoge hage;
で、そのインスタンスがhageで、


ostreamに、operator << (hage)という関数を追加して、下のように書きたいんですけど、不可能でしょうか

cout << hage;
792デフォルトの名無しさん:2005/04/08(金) 12:50:57
>>791
元のクラスを書き換えずにメンバを追加ってのは無理。
そういうのは、非メンバ関数
ostream& operator<<(ostream& dst, const hoge& src)
{
  // 好きなように
  return dst;
}
を書く。
793デフォルトの名無しさん:2005/04/08(金) 13:20:18
>>792
やっぱダメなのか…。了解しました
サンクル
794デフォルトの名無しさん:2005/04/08(金) 13:40:43
>>793
それとも禁断のnamespace stdに追加するとか。
標準では禁止しているけどね。
795デフォルトの名無しさん:2005/04/08(金) 13:46:35
ってか、>>792で何が困るんだ?
796デフォルトの名無しさん:2005/04/08(金) 14:55:48
>>795
>>792はバカなんです。
797デフォルトの名無しさん:2005/04/08(金) 15:40:24
別に困るとかそういう意味で質問したのではないと思う。
好奇心では
798デフォルトの名無しさん:2005/04/08(金) 15:46:43
VARIANT型からの配列の取り出し方がよくわからない件について
799デフォルトの名無しさん:2005/04/08(金) 16:12:54
>>798
質問するつもりなら、もっと具体的に書かないと誰も回答できんよ。
ってかVARIANT型ってことは、該当する開発環境のスレに逝った方が
良かろう。
800デフォルトの名無しさん:2005/04/08(金) 16:42:24
>>799
解らないなら解らないって言えばいいのにw
801デフォルトの名無しさん:2005/04/08(金) 16:54:03
>>789,800
VBスレ行け
802デフォルトの名無しさん:2005/04/08(金) 16:58:06
>>801
VBならVariantって書くだろ。
typedef struct FARSTRUCT tagVARIANT VARIANT;
のことじゃねぇの?

どっちみち漏れはしらね。
803デフォルトの名無しさん:2005/04/08(金) 17:03:09
まぁ、確かにVARIANT型から配列を取り出すだけってんなら
開発環境云々は関係ないとおもわれ、、、

あ、漏れも知らんよ
804デフォルトの名無しさん:2005/04/08(金) 17:16:03
>>798
VARIANTのメンバvtにVT_ARRAYが含まれているか確認する。
さらにVT_BYREFも含まれていればpparrayから、そうでなければparrayの値を取り出す。

それをSafeArrayAccessData()に渡せば配列の先頭へのポインタが得られるから、
後はvtのメンバから型を識別して、配列の中身を読み取る。
終わったらSafeArrayUnaccessData()を呼ぶ必要がある。
805デフォルトの名無しさん:2005/04/08(金) 17:25:24
場合によっては使い終わった後、さらにSafeArrayDestroy()を呼ぶ必要があるかもしれない。
806デフォルトの名無しさん:2005/04/08(金) 20:45:50
関数で文字列の定数を返した場合、戻った先でその文字列は有効なのでしょうか?
スタックに割り当てたchar配列を返すとまずいのでしょうが、定数の場合は?

const char* get_error_message()
{
return "nullpo";
}

void main()
{
const char* msg = get_error_message();
printf(msg);
}
807デフォルトの名無しさん:2005/04/08(金) 20:51:36
>>806
ローカル変数への参照は戻してはいけない
定数・static変数はOK
808デフォルトの名無しさん:2005/04/08(金) 20:54:48
>>807
さんきゅーです。
定数は大丈夫か。ちと安心した。
809デフォルトの名無しさん:2005/04/08(金) 21:02:36
ちなみにこういう場合は関数ローカルの扱いなのですか?

const char* get_error_message()
{
const char* msg = "nullpo";
return msg;
}
810デフォルトの名無しさん:2005/04/08(金) 21:06:23
>>809
なぜローカル参照を戻してはいけないのか考えてみれ
811デフォルトの名無しさん:2005/04/08(金) 21:12:23

ファイルの中身を1行ずつ読むプログラム
ifstream fin(filelist,ios::in);
while(!fin.eof())
{
fin.getline(buffer, sizeof(buffer),'\n');

..........

}//while(!fin.eof())
fin.close();

で、filelist中にリターンのみの行(\nのみ)を省きたいんだけど、
どうすればよいのでしょうか??
教えてくだされ。
812デフォルトの名無しさん:2005/04/08(金) 21:17:58
>>810
auto変数の扱いになってスタック領域にメモリ確保されるからですよね。
文字列定数は別なメモリ領域に割り当てられているのかな?ちと調べちう。
813デフォルトの名無しさん:2005/04/08(金) 21:23:47
>>812
データ領域に割り当てられる
内容の変更やdeleteは未定義だけど、ポインタを返す分には問題ない
814809 812:2005/04/08(金) 21:26:56
分かったー(゚∀゚)
文字列定数は呼び出し専用の静的メモリに入ってるから、809みたいにその領域のアドレスを
返しても問題ないっていうことかー。

>文字列リテラルはstaticが暗黙の内についていて、必ず静的記憶領域に確保されます。
>だから、たとえ関数中で使われても、文字列リテラルの実体は静的記憶領域に確保されます。
815デフォルトの名無しさん:2005/04/08(金) 21:28:48
>>811
cの初期状態'\n'とし、

ループ
読み出した文字が、
 '\n'の場合、もしcが'\n'なら、なにもしない、そうでなければ、読み出した文字を出力
 それ以外の場合、読み出した文字を出力
cに読み出した文字を代入
繰り返し
816デフォルトの名無しさん:2005/04/08(金) 21:57:05
cの初期状態を'\n'にできない。。
strcpy(c, '\n');
で、invalid conversion from `char' to `const char*'
と。
817デフォルトの名無しさん:2005/04/08(金) 22:01:42
>>816
(゚Д゚)ハァ?
c はchar型変数なんだから
c = '\n';
でいいだろ
818デフォルトの名無しさん:2005/04/08(金) 22:02:43
>>816
おい c の型はなんだ?
819デフォルトの名無しさん:2005/04/08(金) 22:04:00
そもそも第二引数の '\n'って何よ?
池沼?
820デフォルトの名無しさん:2005/04/08(金) 22:04:53
英語も読めないのか>>816
821デフォルトの名無しさん:2005/04/08(金) 22:05:45
うむ。
char *str = "\n";
ででけた。
822デフォルトの名無しさん:2005/04/08(金) 22:08:18
要は、

--------test.txt--------
testa
testa

tests
testd
-----------------
というtest.txtの、空白の行を飛ばして出力したいわけなんだ!

そんでもっていまのところ、全部とんで真っ白なんだ。
823デフォルトの名無しさん:2005/04/08(金) 22:12:17
ちなみにプログラムは
const int BUFF = 128;
char buffer[BUFF];
char *str = "\n";
ifstream fin(filelist,ios::in);
while(!fin.eof())
{
fin.getline(buffer, sizeof(buffer),'\n');
if (!strcmp(buffer, str))
{
...........................
}
}//while(!fin.eof())
fin.close();

たつけて。。
824デフォルトの名無しさん:2005/04/08(金) 22:14:18
まず各処理が期待通りの動きをしてるか確認するところから始めようか。
825デフォルトの名無しさん:2005/04/08(金) 22:14:27
string使え
826デフォルトの名無しさん:2005/04/08(金) 22:20:33
>>823
str 使う必要あるのか?
827デフォルトの名無しさん:2005/04/08(金) 22:29:50
getlineしたら最後の改行消えるんじゃないの?

if (strlen(buf))
{
............
}

にしてみたら?
828デフォルトの名無しさん:2005/04/08(金) 22:37:28
>>823 難しく考えすぎ

std::string buf;
while ( std::getline( fin, buf ) )
{
 if ( !buf.empty() )
  //なんかする
}
829デフォルトの名無しさん:2005/04/08(金) 22:59:33
>>827
うまく行かなかった。。。
>>827
bufferはchar*でしたいんす。..
830デフォルトの名無しさん:2005/04/08(金) 23:01:21
あ、途中で
char buffer = char bufferで変換すればいい?
831デフォルトの名無しさん:2005/04/08(金) 23:04:49
>>829
なぜchar*にしたい?
必要な時だけc_strで変換するんじゃだめなの?
832デフォルトの名無しさん:2005/04/08(金) 23:10:31
char*を引数とする関数にわたしたいので。
function(buffer)
って感じです。うーむ。
833デフォルトの名無しさん:2005/04/08(金) 23:10:51
だからその時だけc_strでconst char*を取り出せばいいんじゃないの?
834デフォルトの名無しさん:2005/04/08(金) 23:14:17
constを消せればクリアのようです!
error: invalid conversion from `const char*' to `char*'
835デフォルトの名無しさん:2005/04/08(金) 23:15:23
>>834
その関数ではバッファの内容を変更するのか?
836デフォルトの名無しさん:2005/04/08(金) 23:17:24
いえ、変更しないんですが、この関数を使わなくてはならないので。
837デフォルトの名無しさん:2005/04/08(金) 23:17:59
変更しないなら、関数を
function(char*)
から
function(const char*)
にすればいい
838デフォルトの名無しさん:2005/04/08(金) 23:18:25
function ((char*)buffer.c_str());
でできやしたあぁぁぁx!

ありがとうございましたm(_霊_)m
839デフォルトの名無しさん:2005/04/08(金) 23:19:32
>>838
char*にキャストすな
なんでわざわざconst char*を返すのかを考えてみれ
840デフォルトの名無しさん:2005/04/08(金) 23:20:58
>>837
その関数に変更を加えると他にも膨大な変更が必要になってしまうことにはならないですかね?
841デフォルトの名無しさん:2005/04/08(金) 23:22:25
ちなみに、その関数はCで書かれたものなんです。OTL
そんでもって僕はC++をつかおうとしているんで。
842デフォルトの名無しさん:2005/04/08(金) 23:22:56
>>840
char*からconst char*への暗黙の変換は自動的にやってくれるから
char*を渡している部分を変更する必要はない
functionが与えられたバッファを変更しないことが条件だけど
843デフォルトの名無しさん:2005/04/08(金) 23:26:42
>>842
つまり、その関数の引数を修正して、コンパイルしなおして、ライブラリにするのが正しい解決方法ということなんですね?
844デフォルトの名無しさん:2005/04/08(金) 23:28:32
>>843
どうしても再コンパイルしたくなければ、必要な時にcharバッファを作って
そこにstring.c_str()からcopyして、そのバッファを渡すとか
845デフォルトの名無しさん:2005/04/08(金) 23:37:23
>>844
ぼくにとってそれが一番やさしそうです。やってみます。ありがとうございました。
846デフォルトの名無しさん:2005/04/08(金) 23:38:07
>>838
それは激しく良くない
char*でも>>828と同じだよ。

char* buf[256];
while ( fin.getline( buf, 256 ) )
{
 if ( strlen(buf) )
  //なんかする
}
847デフォルトの名無しさん:2005/04/08(金) 23:49:50
↑あいや
×char* buf[256];
○char buf[256];
848デフォルトの名無しさん:2005/04/09(土) 00:16:37
/*func.c*/
#include "func.h"
int max(int a, int b)
{
if(a>b)return a;
return b;
}
int min(int a, int b)
{
if(a<b)return a;
return b;
}
int avg(int a, int b)
{
return (a+b)/2;
}
/*func.h*/
#ifndef __FUNC_H__
#define __FUNC_H__
int max(int a, int b);
int min(int a, int b);
int avg(int a, int b);
#endif /*__FUNC_H__*/

func.hの中にある関数をdllファイルにして、
dllをいろいろなプログラムで使えるようにしたいのですが、
どうすればいいのでしょうか?
環境はvc++.netです。
849デフォルトの名無しさん:2005/04/09(土) 00:27:34
>>836
そんなときは const_cast と書いた上で、
関数がポインタの指す先を変更しないという根拠をコメントで書き添えると良い。
850デフォルトの名無しさん:2005/04/09(土) 00:40:44
>>848
その関数をDLLに入れてエクスポートする。
全然わからんのなら「DLL 作成」でぐぐってくれ。
851デフォルトの名無しさん:2005/04/09(土) 00:41:47
>>818
日本語で書いてるんだから型も糞もない。
自分で適当に推論してね。
852デフォルトの名無しさん:2005/04/09(土) 09:58:58
#defineっていうのは、関数内で定義したらどういう働きになりますか?
出来れば関数が終了したら破棄されるようにしたいです
853デフォルトの名無しさん:2005/04/09(土) 10:02:09
>>852
#defineはそれを書いた行の次からソースコードの終わりまで有効。
プリプロセッサはC/C++のブロックなどとは全くの無関係に働く。

const使え。
854デフォルトの名無しさん:2005/04/09(土) 10:04:54
#undefすりゃいいじゃん
855デフォルトの名無しさん:2005/04/09(土) 10:13:05
#define unko 10
int hoge(void)
{
return (unko);
}
#undef unko

ただ、他の場所で同じ宣言があるとそれも消えちまうんだよな
856デフォルトの名無しさん:2005/04/09(土) 10:16:31
他の場所で同じ宣言があったらそもそも二重定義だってエラー吐かないか?
857デフォルトの名無しさん:2005/04/09(土) 10:23:43
マクロの二重定義は警告じゃなかったっけ?
858デフォルトの名無しさん:2005/04/09(土) 10:27:48
内容が同じなら全然問題ない。
違えばエラーだったと思う。
859デフォルトの名無しさん:2005/04/09(土) 10:43:58
現在CからC++に移行中なのですが、defineはすべてconstに置き換えてしまってよいのでしょうか?
860デフォルトの名無しさん:2005/04/09(土) 10:58:31
>>859
もちろん必要に応じてだ。面倒ならそのまま放置しても構わんよ。
置き換えるなら、定数ならconstで変数宣言した方が良いだろうし、
マクロならinline関数に置き換えろ。
861デフォルトの名無しさん:2005/04/09(土) 11:03:39
使い分けた方が良いよ
最初から最後まで絶対に破棄しない定数なら
#defineの方が直感的に分かり易い
862デフォルトの名無しさん:2005/04/09(土) 11:09:11
>>861
(゚Д゚)ハァ?
863デフォルトの名無しさん:2005/04/09(土) 11:31:19
>>848
よけいなお世話だろうが一応つっこんどく
_ で始まる識別子は処理系で予約されてる
動作が未定義になるぞ

DLL の作り方は…>>850が答えてるな
864デフォルトの名無しさん:2005/04/09(土) 11:52:02
_ で始まるといってもその数が問題だがな
アンダーバー3つなら問題無い
865デフォルトの名無しさん:2005/04/09(土) 12:00:39
>>864
(゚Д゚)ハァ?
866デフォルトの名無しさん:2005/04/09(土) 12:02:49
俺ルールですか?
867デフォルトの名無しさん:2005/04/09(土) 12:10:08
>>861
随分アナクロな考え方のようですね。そんな直感捨てた方がいいと思いますよ。

>>859
私は文字列定数の場合はconst char * を返すインライン関数にするかな。
マクロはテンプレート関数にするのもいいだろうね。
868デフォルトの名無しさん:2005/04/09(土) 12:28:42
俺は文字列定数もインライン関数にはせず、const char *const HOGE = "HOGE";にしている。
869デフォルトの名無しさん:2005/04/09(土) 12:32:11
あほばっかり
870デフォルトの名無しさん:2005/04/09(土) 12:52:53
特に>>865-866あたりな
871デフォルトの名無しさん:2005/04/09(土) 13:01:24
マジレスすると、>861>864>867>868
872デフォルトの名無しさん:2005/04/09(土) 13:04:09
>>871
そんなに必死になるなよ
873デフォルトの名無しさん:2005/04/09(土) 13:04:24
マジレスなんて求めてないんで、そこんとこ宜しく。
874デフォルトの名無しさん:2005/04/09(土) 13:37:24
ここはネタスレではないのでマジレスオンリーです。
875デフォルトの名無しさん:2005/04/09(土) 13:37:46
俺も>861>864>867>868 はアホだと思う

あと 864=870=872 だと思う
876デフォルトの名無しさん:2005/04/09(土) 13:43:40
何故アホなのか、解説希望。
877デフォルトの名無しさん:2005/04/09(土) 13:47:07
アホって言う方がアホ
878デフォルトの名無しさん:2005/04/09(土) 13:47:18
>>861は俺もアホだと思う。
理由?
それはdefineで定義されたものがコンパイル時にマジックナンバーになってしまうからだよ。
ソース上では名前が付いていても、defineはコンパイル前に行われる単なる置き換えに過ぎないからね。
879デフォルトの名無しさん:2005/04/09(土) 13:47:37
レッテル貼り&同一人物断定キター
880デフォルトの名無しさん:2005/04/09(土) 14:45:51
>>868
メンバにできないのが難点。

>861はEffectiveC++でも読んで来い。
881デフォルトの名無しさん:2005/04/09(土) 14:48:00
constで定義するメリットは・・・
メモリの節約。defineは所詮コードの置換。変数の実態は複数になるからな。
重複定義の防止。コンパイラやリンカがエラーにしてくれるからな。
defineでは配列等の定義が困難。defineとconstと混在させるくらいなら、
constに統一した方が良かろうな。

それらを全部承知の上で「#defineまんせー」なら、
もはや何も言う事は無い。
882デフォルトの名無しさん:2005/04/09(土) 15:01:00
>変数の実態は複数になるからな。
環境によるし、変数じゃなくて定数な。
883デフォルトの名無しさん:2005/04/09(土) 15:07:58
constにしたらexternするのが面倒。
要するに宣言と定義を分けなきゃならない。
マクロならヘッダファイルに書いておけばOK。

constの方がよりよいとは思うけど、
どっちかに統一ってのは現実的でない。
884デフォルトの名無しさん:2005/04/09(土) 15:14:46
>>867-868
文字列リテラル != 文字列リテラルへのポインタ
885デフォルトの名無しさん:2005/04/09(土) 15:16:00
ハァ?
886デフォルトの名無しさん:2005/04/09(土) 15:17:36
ヒィ?
887デフォルトの名無しさん:2005/04/09(土) 15:19:00
>>884
そんなことどうでもいい。Javaだったら気にしないだろ。そんなこと気にしてんなよ。
888デフォルトの名無しさん:2005/04/09(土) 15:19:14
888(・∀・)ニヤニヤ
889デフォルトの名無しさん:2005/04/09(土) 15:19:50
>>887
ワロス
890デフォルトの名無しさん:2005/04/09(土) 15:19:58
やーやーやー
891デフォルトの名無しさん:2005/04/09(土) 15:21:04
完璧にネタスレだなここ。初心者が見たら混乱するぞ。
892デフォルトの名無しさん:2005/04/09(土) 15:46:00
defineで配列等の定義が困難って何言ってんだ・・・
893デフォルトの名無しさん:2005/04/09(土) 15:46:38
それじゃここで質問を。
#define のときはマクロ名を大文字にする習慣があるけど、
それを const にする場合も変数名を大文字でやった方がいいもんなの?
894デフォルトの名無しさん:2005/04/09(土) 15:47:09
俺は大文字にしてるけど
895デフォルトの名無しさん:2005/04/09(土) 15:49:19
>>893
そんなもん個人の自由だ
896デフォルトの名無しさん:2005/04/09(土) 15:59:56
int foo;
const int Foo = 1;
#define FOO 1
897 :2005/04/09(土) 16:25:30
古いソース見てたら
unsigned group : 8;
unsigned mark : 2;
とか出てきたけど : 8 とかの意味がわかりません。
教えてください。
898デフォルトの名無しさん:2005/04/09(土) 16:26:32
>>897
ビットフィールド(構造体にあらず)の一部だろう。
899デフォルトの名無しさん:2005/04/09(土) 17:31:08
 め こ コ  |        r  ∩       _/
 ! の イ  .|      r    ,rー'''''''ー-ケ--\
    マ ツ   |    ,...,....,rー/''"{;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;|
    ジ め  |   { '  ,r   `ー-----::::;;;;__|
    レ. !   |    ヽ〈_./   、    ,.     |
    ス      \     }  、rメヽ--- クー-rィ | 
           / ̄     (  イ| ,、}   /__  }.ゝ. |
______/  /\゚   ト }ヽゝ'" o ゝ┴'" {、.|
/       \   |    、`(""" ゝ--イ """i. |
           |  `ー'  、 ヽ `/ー--ヽ_,ノ__ノ-イ.|
 大 マ こ . |   っ  \\' ,,,,,..ト  ,,,,   i |
 王 . ジ の. |__ _  \\レ'' ̄ `ー'"/' ̄~`ヽ=\
 !. レ    /;;;;;/ ̄7;;..__ヽ、        }   `\___
.    ス   |;;;;;;;;;/;;;;/    人=------、‐イヽ  __ノ
.         |-;;:::l;;;;;/    〉 〈  ペ   \!  し
900デフォルトの名無しさん:2005/04/09(土) 19:11:35
アルファベットごとの個数をカウントしたいのですが、
下記のようにするとaの文字1字分しかカウントしてくれません。
どこが悪いのでしょうか?

while(1){
  ch = fgetc(fp);
  if(ch==EOF) break;
  arufa[ch-'a']++;
  *fp++;
}
901デフォルトの名無しさん:2005/04/09(土) 19:13:14
>>900
*fp++;ってなんだよw
そういうのはお前の脳内だけで勘弁な。
902デフォルトの名無しさん:2005/04/09(土) 19:15:01
今、俺の脳内で某特攻野郎Aチームのテーマが・・
903デフォルトの名無しさん:2005/04/09(土) 20:23:46
while((ch = fgetc(fp)!=EOF)){
  alpha[ch-'a']++;
}
これでいけ
904 :2005/04/09(土) 20:32:43
>>898
どうもありがとう!
905デフォルトの名無しさん:2005/04/09(土) 21:04:37
void *ってインクリメントすると何バイト移動するの?
906デフォルトの名無しさん:2005/04/09(土) 21:05:45
>>905
試してみろ。
907デフォルトの名無しさん:2005/04/09(土) 21:06:17
void*にポインタ演算はできん
908デフォルトの名無しさん:2005/04/09(土) 21:35:47
>>906-907
ありがとう
909デフォルトの名無しさん:2005/04/09(土) 23:47:19
VC++をつかってるんですが、今までGUIアプリを作るときは
メインウィンドウは普通にWinAPIで手書きして、
機能のメニューなんかはVCのリソースエディタでダイアログで作って
プロシジャでイベントを拾って…という感じでやってきたのですが、
スプリットバーがついてたりMDIだったり、もうすこし大規模でリッチな感じのアプリが作りたくなってきました。
普通だったらMFCでアプリケーションウィザードとか使うと思うのですが、
あれは(沢山ファイルができて「ここに何か書け」みたいなの)意味がわからないのでどうも好きになれません。
なので結局、手書きで作っていくしかなさそうなのですが、
GUIライブラリとかいうのを使えばAPI地下書きをするよりは少しはリッチなのが楽にできるんでしょうか?
今の所候補に上がってるのはWTLとwxWidgetsっていうやつなんですがお勧めなのがあったら(できれば理由も)教えてください。
アプリ全体をリソースエディタみたく部品をぺたぺた貼って作っていく方法ってのは無いんでしょうか?
910デフォルトの名無しさん:2005/04/09(土) 23:48:47
>>909
C++Builderとか
911909:2005/04/09(土) 23:56:46
>>910
DirectX使いたいのでBuilderだとそのまま使えないらしく、
ヘタレなので余計なところで躓きたくないので、できれば避けたいです。。
912デフォルトの名無しさん:2005/04/10(日) 00:03:12
>>911
MSにはC++のRADはない
DirectXが使えるMS製のRADはVB

builderでそのまま使えないと言っても、
http://clootie.narod.ru/cbuilder/index.html
からライブラリを持ってきて、パスを設定するだけなのだが。

http://www.nk.rim.or.jp/~m_iida/programming/directX/BCB_DX9.html
ここ見れば、簡単にできる

913デフォルトの名無しさん:2005/04/10(日) 00:14:32
tolower とか toupper とか isspace とかの関数の
引数は unsigned char へキャストして渡すのがいい
と聞いたのですが、何故でしょうか?
そのまま int に変換されては困ることがあるんでしょうか?
914デフォルトの名無しさん:2005/04/10(日) 00:18:45
> 引数は unsigned char へキャストして渡すのがいい

聞いた事無いな
915デフォルトの名無しさん:2005/04/10(日) 00:19:20
>>909
MFCやっとけ。
wxWidgetも、大差はないぞ。
結局、Document-Vew-DocTemplate 構成だし。
916909:2005/04/10(日) 00:19:28
>>912
BuilderはGUIアプリ作るのにいいって結構聞く気がしますが、
でもやっぱりBuilderも「ここに〜を書け」みたいなやつじゃないんでしょうか?
そういうのが何か気持ちわるくて。
そうするとやっぱり、ある程度APIをラッピングして簡略化してくれてるライブラリを使って
手書きって方が自分には向いてるのかも知れません。
処理は全部手書きで外観は全部エディタで作れるみたいなのがあったら一番いいのですが、
そんなのは無いんでしょうか。
917デフォルトの名無しさん:2005/04/10(日) 00:19:58
>>913
isspace等が配列のテーブル参照をする実装では、
EOFが渡されたら逝ってしまわれます。
918デフォルトの名無しさん:2005/04/10(日) 00:27:30
>>916
BCC form でダイアログリソース作ってそれ表示するか?
919デフォルトの名無しさん:2005/04/10(日) 00:29:03
>>916

言ってることがおかしいぞ。

>スプリットバーがついてたりMDIだったり、もうすこし大規模でリッチな感じのアプリが作りたくなってきました。

これを最小限の労力で実現できるようにwizardがあるわけだが、

>あれは(沢山ファイルができて「ここに何か書け」みたいなの)意味がわからないのでどうも好きになれません。

>でもやっぱりBuilderも「ここに〜を書け」みたいなやつじゃないんでしょうか?
>そういうのが何か気持ちわるくて。


なんだよこれ。
気持ち悪かったら、MFCなり、VCLなりの構造を勉強しろよ。

書き込み見ていると、一番向いてるのはVBとしか思えない。
920デフォルトの名無しさん:2005/04/10(日) 00:29:39
>>913
charで0x80がintにキャストすると0x00000080にならずに0xffffff80になるとか
そんなことか?
921デフォルトの名無しさん:2005/04/10(日) 00:43:10
>>913
そんなキャストは不要。全く問題ない
>>917>>920 が言っていることは見当違い

大文字小文字変換関数である tolower, toupper は
変換できない場合そのまま返す
よって EOF を渡したとしても無問題

文字種分類関数である isspace に EOF を渡しても 0 が返るだけ
無問題

もし問題が起きるようなら処理系が逝かれてる
922デフォルトの名無しさん:2005/04/10(日) 00:44:36
結局どっちよ?
923デフォルトの名無しさん:2005/04/10(日) 00:48:51
>>922
俺が正しい(ハズ)
>>917>>920 がどう見当違いなのか説明すれば信じてくれるかの?
924デフォルトの名無しさん:2005/04/10(日) 00:53:06
キャストは無意味で不要。
intへの変換は問題ない。
925デフォルトの名無しさん:2005/04/10(日) 00:55:27
実装依存の話だな。
規格では問題が起きる「可能性はある」が、まずそんなことはないだろう。
926デフォルトの名無しさん:2005/04/10(日) 00:58:39
>>925
どういう可能性だよw
927デフォルトの名無しさん:2005/04/10(日) 01:12:04
>>921
少なくとも C99 では、unsigned char で表現できない
値を渡した場合の動作は未定義 (但し、EOF を除く)。
928909:2005/04/10(日) 01:14:52
>>919
もちろんそれが一番楽なんだと思うんですが(慣れた人なら)
自分は気持ちが悪いんで、ウィザード使うより手間でもWINAPIじか書きよりはマシなら
なにかしらのGUIツール(ライブラリ)を使うことも考えています。
なおかつ、リソースエディタみたいな操作でアプリのウィンドウ全体をデザインできて、
勝手にソースとか生成しない感じのものがあれば理想なので何かそういうのは無いのでしょうか?
ということなんですが。
生成されたソースの上に自分でコードを書くウィザードみたいなものじゃなくて、
VCのリソースエディタのように.hと.rcなどを別個分離して作ってくれるような。
もちろんC++で。何かおかしいでしょうか?
929909:2005/04/10(日) 01:17:07
補足します。

>もちろんそれが一番楽なんだと思うんですが(慣れた人なら)

ウィザードを使うのが、ってことです。
すいません。
930デフォルトの名無しさん:2005/04/10(日) 01:20:38
そのままVCのリソースエディタ使ってればいいんじゃねーの?
931909:2005/04/10(日) 01:39:17
あれってあくまでダイアログ作る奴ですよね。
932デフォルトの名無しさん:2005/04/10(日) 01:43:48
>>927
未定義になるよりはキャストした方がいいってことか?
933デフォルトの名無しさん:2005/04/10(日) 01:59:26
>>909
MSもCもBorlandのCもだめなら、Windowsでのプログラムはあきらめた方がいい。
934909:2005/04/10(日) 02:03:06
何か質問すら読んでないでレスされるの困るんですけど。
935デフォルトの名無しさん:2005/04/10(日) 02:06:25
>>931
そのダイアログをメインウィンドウのクライアントに貼り付ければいいじゃない。
936デフォルトの名無しさん:2005/04/10(日) 02:47:55
>>928
そんな、気持ちの悪いやり方で作られたコードなど保守しづらいし、再利用性も悪い。
わるいこといわんから、標準に従っておけ。
937デフォルトの名無しさん:2005/04/10(日) 02:57:01
>>909
インテルのC++
938デフォルトの名無しさん:2005/04/10(日) 03:09:28
教えてください。
CMapのコピーってどうやってやるんですか?
CArray::Copy と同じようにしたいのですが。
939デフォルトの名無しさん:2005/04/10(日) 03:54:19
ヘッダファイルで、
#pragma once
#ifndef HOGE_H
#define HOGE_H
...
#endif
と、pragma と ifdef の両方でインクルードガード
してるのを良く見るのですが、何故でしょうか?
pragma の方がコンパイラに優しいからとかでしょうか?
940デフォルトの名無しさん:2005/04/10(日) 05:45:25
>>909
ぶっちゃけオマエさんの言い分は進歩しないヤツの典型

別の方法でできもしないのにあっちは気持ち悪いからと言って毛嫌いしてちゃ
何もできるようにはならんよ
無ければ自分で作るな世界で無いものねだりしてもどうにもならん


>>939
別にコンパイラにやさしいとか関係無いぞ
どっちも同じプリプロセッサだからよ
#pragma onceより#ifndef〜#define〜#enifの方が汎用性高いだけ
941デフォルトの名無しさん:2005/04/10(日) 05:53:54
>>940
それなら#ifndef...だけ書いた方が短くていいと
思うのですが、何故両方とも書かれるのでしょうか…?

滑り止めのようなもの…?
942デフォルトの名無しさん:2005/04/10(日) 06:40:14
さぁてね、俺は詳しい理由は知らんが
まぁキミの言うように#ifndef〜だけでやってる本もあるし

#pragma onceと#ifndefの併用は、MSVCなんかはデフォルトで吐くコードだけどね

たとえば、一回読み込んだ後で、他所で#undefされて、
それで#ifndefが無効になっても#pragma onceで防げるって寸法なんじゃないかね

環境依存だけど
943デフォルトの名無しさん:2005/04/10(日) 06:57:15
さぁてね
944デフォルトの名無しさん
>>941
pragma onceの方がコンパイラにやさしいから。

ifndefはそのヘッダを全てパースしなければならないが、
pragma onceはヘッダを一度しか読み込むな、という、
コンパイラへの明確な命令なので、それを省くことが出来る。