【初心者歓迎】C/C++室 Ver.15【環境依存OK】
1 :
デフォルトの名無しさん :
05/03/19 20:26:18
にかな
にかわ
さんかな
さかな
よんかな
よんさま!!!!!!!!!!!!!!!!
ななだ!
ていうか、テンプレまだぁ
テンプラまだー
今揚がりました
テンプレは20レスの間に入れてほしい。でないと、でないと…
∧_∧ ( ´・ω・) みなさん、お茶が入りましたよ・・・・。 ( つ旦O と_)_) 旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦
当方今Webの参考資料見ながらプログラム書いてるんですけれども。 そのプログラムの中で同じような処理(レジストリからAという値を抜く処理,Bという値を抜く処理等)がいくつか有るので、 同じような分野別にしてファイル分けて改造しやすくしてるんですが。 こうする事でプログラムが重くなるとかって有るんでしょうか? まとめて一つのテキストの中に処理全て書いた方がいいんでしょうか。 判りづらい文で済みませんが、何方かご教授お願い致します。
> 当方今Webの参考資料見ながらプログラム書いてるんですけれども。 初心者の特徴:なぜか質問をあいまいにする
>>17 レジストリから〜っていうのはSHGetValueで十分じゃないか?
モジュール化することを否定してはなりません。
>>17 まとめると、
・ソースファイルが単数と複数の場合とで、
プログラムの実行速度は変わるのか?
ということか?
知らん。
つまらないことでスレがのびそうな悪寒・・・
時間がかかりそうだから、何がどのように曖昧にしてるか教えてよ
読解力を鍛えろっていうやつって そもそも理解してないよな
かわいい^^
コンパイラに任せとけ
>>17 プログラムの実行速度はおそらく殆ど変わらない。
ビルドに要する時間は増加する。
ソースコードのメンテナンスは容易になる。
32 :
デフォルトの名無しさん :05/03/20 13:44:22
33 :
デフォルトの名無しさん :05/03/20 14:13:29
#define HOGE 35001 DWORD dwSize = 35002; 上記のようにした場合、(dwSize - HOGE) の値が 3 になってしまうのは 何故でしょうか。(35002 - 35001) = 1 を期待しているのですが…。 (環境)WinXP、BorlandC++
おまえの書いたコードにミスがあるから
>>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));
>>33 デバッグして、(dwSize - HOGE)の演算をする直前の状態でも、dwSizeが35002、HOGEが35001になってる?
>>34 char tmp[256];
wsprintf(tmp, "%d", (dwSize - HOGE));
MessageBox(NULL, tmp, "TEST", MB_OK);
このようにして確認しました。
間違いがあれば指摘していただけると助かります。。。
訂正です。 wsprintf(tmp, "%d %d %d", dwSize, HOGE, (dwSize - HOGE)); MessageBox(NULL, tmp, "TEST", MB_OK); この状態で「35002 35001 3」と表示されるのです。
コンパイラの正確なバージョンは?
BorlandC++ 5.51です。
%ld
>>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) {
//ショートカット
}
>>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から引き算してはいけないのでしょうか?
VisualStudioを使わないのがそもそものミス。 かって来い!
>>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);
}
33です。
すみません。大ボケでございました。
#define HOGE AA1 /* AAA=35001 */
のように定義されていたので、そのまま35001が入ると思っていましたが
#define AA1 35000+1
#define AA2 35000+2
#define AA3 35000+3
...
のように定義されていたので、実際には (dwSize - 35000 + 1) になっていました。
回答してくださった皆様、検証までしていただいた
>>45 氏、本当にありがとうございました。
そして、ごめんなさい。ああ…死にたい(;´Д`)
#define HOGE AA1 #define AA1 35000+1 (dwSize - 35000 + 1) は?
>>46 よくあるマクロの副作用ってやつだな。
マクロ定義は取り合えずカッコで囲んどくのがデフォ。
っていうか最近の流儀だと定数定義は
int const AA1=35000+1;
みたいに const 使うのが良いとされてる。
const int AA1じゃなかったか?
>>51 実質的に定数。
っていうか定数じゃなきゃならない理由は別にない。
>>46 ・・・まあみんな通ってきた道です。「死にたい」ではなく
「この事を生涯忘れず、後進が同様な事をしても『辞めろ』とか『死ね』とかは決していわないこととします」
といえばもっと格好イイヨ
>>46 俺、さっきコンパイルエラーに20分くらい考えちゃったんだけど、
listview を listvirw とtypoしてた。
エラーメッセージに出てたのも listview に見えちゃったんだもんよ〜。
思い込みってこんなもんだ。
エラーメッセージの内容で考えろ …
>>55 そうなんだけど、この場合「定義されてない名前だ」って意味のエラーが出るわけで、
スペルが間違ってることに気づかなかったからヘッダファイルの依存関係とか変なところを疑ってしまったんだよ。
遅レスですが皆様、わざわざ答えてくださりありがとうございます。 メンテが楽になる反面でビルドが遅くなるんですか… どうも感謝です。
>>53 いや、それとこれとは話が別ですよね?
あなたはご自分が糞質問しても罵倒されたくないからそんなことを言ってるんですよね?
>>52 int a[CONST];
定数じゃねーとコレができねーじゃん。
できるものもあるんだよ
C99だと出来たような希ガス
>>62 C99を改めてチャックしてみた。
たしかにできることになってる。
>>58 違います。私が
>>53 みたいな事を言ったとて、糞質問しても罵倒されなくなるとは思えませんが。
>>53 が煽りにみえたのですか?
貴方の自責の記述が好ましく思えたので、本心を少し書いただけ。
信用できなければ「私はここで質問なぞしない」と自分に誓いましょう。
# もう少し本心を書くと「なぜその様に思うのかがわかりません」
どこかで見たような展開になりそうな悪寒
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; }
先生、ぼくの頭では、そんな細かい数字まで覚えてられません。
リンク先は読むのやめたが 引用した部分の最初の行が読めないのか?
ハンドルの取り扱い?が良くわからないので教えてください。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行目で問題のあるポインタの変換という警告が出ます。
void *から他のポインタ型の変数へは Cなら警告なしで代入可能 C++は代入不可能
>>75 Cとしてコンパイルすればいいということですか?
>76 キャスト(static_cast)して代入
>>74 HWND を渡すべきところに HINSTANCE を渡しているから、型が合わない。
ふつうにコードが間違っている可能性が高い。
Cでコンパイルすると、こういう間違ったコードでも警告だけで済んでしまうから、
なるべくC++にしとけ。
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()をオーバーライドすればいいかと思ったのですが・・・
間違っている箇所などを教えて頂けますでしょうか。よろしくお願いします。
>>72 Win32APIのHeap系関数ならHeapSize()がある。
(Global系とLocal系にもないわけではないけど)
読めない香具師はC++使えているとは言えないと思うが… つかコンパイルも通らないコードの載せるのってどうよ>MS
84 :
デフォルトの名無しさん :2005/03/21(月) 11:05:17
=== 演算子って何?
>>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;
}
宿題だったりして
実行せずに、どうやって動くのか想像しろと。 なんでも動かせばいいってもんじゃない。
>読めない香具師はC++使えているとは言えないと思うが… イタタ・・・
90 :
69 :2005/03/21(月) 12:11:14
ありがとうございます。
>>73 文章力がなくて申し訳ないです。
>>81 それでいけそうです。
>>84 C++ には === 演算子なんてない。
PHP にはあったな。意味合い的には boost::addressof(lhs) == boost::addressof(rhs)。
try 〜 catch は遅いって聞いたんだけど どの程度遅くなるんでしょうか?
やっぱgotoだよね
>>90 まさかとは思うが、mallocで確保したものをHeapSize()しようとしてないだろうな?
例外ってそんなに頻繁に呼び出すもんじゃないだろ。 せいぜいループの外で使うぐらいだ。
99 :
84 :2005/03/21(月) 13:03:21
ある人にC言語の質問をしたいのですが、何か面白いソースコードはないでしょうか?
>>92 $a === $b 等しい $a が $b に等しく同じ型でである場合に TRUE。(PHP 4のみ)
LPCTSTR str[] = {TEXT("アアア") ,TEXT("イイイ") } str[0]>str[1] ってやった場合コンパイラは何を基準に比較すんの?
103 :
92 :2005/03/21(月) 13:05:10
>>101 あー、そうだった。
=== がアドレス比較演算子なのは、今俺が作ってる俺言語の仕様だ(゚Д゚;)
嘘かもしれんがJavaScriptにもあったろ? 文字列比較とかで参照レベルで同じ値ならtrueじゃなかった?
>>100 ぎゃふんと言わせたいからってこと?
自分で理解できないコード持ち出してどうする
>100 GUIベースのプログラムを作ってみたいのですが、最初はどんなものを作ればいいですか? とかと同類な質問ですね
は?アドレス?俺は配列の中身が昇順にソートするようにしてるけど アドレスで比較してるなら全く変わらないけど微妙に変わったぞ
オブジェクトのnullに対して hoge===null はtrueだっけか どっかにnullというオブジェクトがひっそりと生きてるんだろうな
std::vector<Hoge>::iteratorとHoge*ってどう違うん?
>>112 vectorのiteratorに絞っての質問?
>>113 そう。ランダムアクセスイテレータとポインタの違い
>>98 例外を呼んだときにコストがかかるという認識で良いのですね?
呼ばなければ遅くはならないと。
116 :
79 :2005/03/21(月) 14:23:28
>>80 大変分かりやすい例をありがとうございました。
117 :
33 :2005/03/21(月) 14:28:51
>>115 throwしなくてもtry通るときにはコストがかかる
>>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である場合もあるね。
> 要素の舐め方が必要な場合 コボラーの方でつか?
JavaScriptで操作できるアプリケーション(Sleipnir)って結構あるけど、 どういうロジックなの?COMとかいうやつなのかな?
とにかくコンテナ内データを操作したけりゃ、イテレータを使えばいいだけのこと。
COMとDLLってなにがちがうん? すまん、初心者質問で。 同じプラグインなものだとおもってた。
>>109 str[0]はTEXT("アアア")へ、str[1]はTEXT("イイイ")へのアドレス値を保持してる。
TEXT("アアア")とTEXT("イイイ")は何処に確保されるかはコンパイラの勝手。
>>102 同じ配列上にないポインタに対する比較演算子の結果は不定。
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鯖復活おめ
>>127 a->p は int* const
Cの頃から変わってない。
これの挙動が変わるって、ひどいコンパイラだな。
コンパイラ(バージョン含む)晒せ。
a->pじゃなくてa.pだよね?
131 :
128 :2005/03/21(月) 19:10:54
>>129 ほんとだ。ごめん。
>>130 struct Unko { int* p; }
const struct Unko a;
*a.p = 0;
構造体があるし
初心者、というより厨な質問です。識者の方のご助言・ご教示いただきたいと思います。 質問の要旨は、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では他に使用メモリ値を取得する方法があるのでしょうか?よろしくお願いします。
>>125 ちなみにWindowsXP + VC6だと?
136 :
128 :2005/03/21(月) 19:34:40
>>133 そうだな。
「ANSI C の頃から変わってない」ってことでいいか?
>>135 VC++ の try は通るだけでコストがかかる。
Cの頃ってなんだよタコ
139 :
135 :2005/03/21(月) 20:37:24
ありがと
ふはは おい、俺の壮大なつりに誰も気づいてないぜ こりゃ笑えるwww と全然関係ないスレで釣り宣言
>>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 めんどうなだけだと思うのだが。
明確に使う理由は2つ ・NULLが代入できる ・別の対象を指すことが出来る これらは、「C++の参照」が「他言語の参照」と異なる性格の概念であるため。 また、消極的な理由として ・Cプログラマが見ても理解しやすい ・->と.の違い(参照時のコスト)が明確になる 等もある。 なお、(*p_hoge).memberなどとして使う事は殆どない。 ポインタやメモリ配置について理解する気がないのなら そのままJavaをやってれば良い。
144 :
142 :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やってろなんて言わずに教えておくれ。
>>144 ん、
>Hoge& r_hoge = hoge1;
>Hoge hoge2;
>r_hoge = hoge2;
これ何をしてるか分かってる?
146 :
144 :2005/03/22(火) 23:16:02
言われるまでわからんやった。 hoge1 に hoge2 をコピーしてるのね。
147 :
144 :2005/03/22(火) 23:22:32
ということで 143 の 別の対象を指すことが出来る は、"ポインタでないと"を理解できた。 ありがと。
148 :
74 :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()は一文字出力なのに、 なんで一文字以上の入出力ができてしまうのですか?
>>144 コストについて。
>r_hoge.member
>p_hoge->member
VC++では参照はポインタとして実装されてるのでコストは変わらない。(と思う・・・)
でもぱっと見r_hogeが実体なのか参照なのか区別が付かないため
間接的にアクセスしてることを明確にするためにポインタを使うことがある。
ということを
>>143 は言いたかったのではないか?
また、
>p_hoge->member
>(*p_hoge).member
は同じ意味なので生成されるコードは変わらないはず。
152 :
144 :2005/03/22(火) 23:58:28
ありがと。
153 :
74 :2005/03/23(水) 00:01:40
GetActiveWindow のところを GetForegroundWindow に変えてもハンドルが取れない… なぜ?
>>153 スレ違いなんだよ。
前回はお茶目な回答者が回答しちゃったんでスルーしたけど、
これ以上はWinAPIすれに移動してくれ。
155 :
デフォルトの名無しさん :2005/03/23(水) 00:24:01
>>1 にWINAPIもOKとかいてある以上、スレ違いではないな。
ただWin32APIスレのほうがちゃんとした回答がくると思うが。
現に求められている答えが帰ってきてないからな。 ああ、俺もわからない。
スレ違いじゃないのに出てくる自治厨って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() が正解?
>>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型に取り出したいのですが、 どうやったらできますか? ぐぐっても配列バリアントが見つからない…
>>160 BCBか?
Variantの配列は知らんがVariantにAnsiString演算子あるだろ
162 :
デフォルトの名無しさん :2005/03/23(水) 10:17:06
>>161 BCBです。
VarToStrって関数を使って、
AnsiString IPAdress;
IPAdress = VarToStr(Result.Exec(PropertyGet("IPAdress")));
こんな感じで突っ込むと、
オートメーションオブジェクトをサポートしてませんってエラーでます
ほかのやつなんでしょうか?
164 :
デフォルトの名無しさん :2005/03/23(水) 12:52:50
EOFの値ってどうやって代入するの?
>>164 普通に入れたいところに0x1A入れる。
167 :
デフォルトの名無しさん :2005/03/23(水) 13:15:47
WIN32APIでスクリーンショットを取得できる関数を教えてください
#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消し忘れました。 スマソ。
>>167 よく分からん。jpg読み込みたいってこと?
>>167 デスクトップのデバイスコンテキストハンドル取ってこい
Win32スレの方がふさわしい。 言語とAPIの区別がつかないんだろうか?
>>168 LSI C-86は知らんが、そのコードは問題ない。
(中略) の部分で何かミスしてると思われ。
tfloor, tposのtってなんすか?
177 :
168 :2005/03/23(水) 16:22:19
>>173 1も読めないバカは死んでください。
スレ違いといいたいだけならC++本スレに引っ込んでてください。
>>173 はっきり言えばこのスレはその程度の区別もつけられない*初心者*のためのスレだ。
>>179 だから適切なスレに誘導しているんじゃん。
ここは言語スレだよ。
どっちでもいいじゃん 答えたいやつは答える 誘導するやつは誘導 好きにしろ
>>177 int batcho(int,int);
>>168 手前に全角スペースでも入り込んでるんじゃないのか?
つーか、初心者がLSI-C86なんて使うなや。
雑誌の付録に付いてるからじゃない?
何十年前の雑誌だよ……
>>188 ちょっと待て。昔のCマガについていたのは知っている。
問題は、最近でもついてくるのかどうかだ。
190 :
デフォルトの名無しさん :2005/03/24(木) 08:52:19
>>163 環境依存OKなんで、いけると思ってました。
失礼しました。
ニャホ・ニャホタマクロー♪が頭に流れてて消えないよ〜...orz
よくゲームである一文字ずつ表示するプログラムが書けません。 取り合えず作ってみたのですが TCHAR mes[100] = "あいうえおかきくけこさしすせそたちつてと"; int count = 0; while(mes[count] != '\0') { count += 2; TextOut(hdc, 0, 0, mes, count); Sleep(50); } これだとまず「あいうえおかきくけこさしすせ」までが一気に表示されて、 その後「そたちつてと」が一気に表示されるという不可思議なリズムになってしまいます。 どうすればいいでしょうか?
Sleepは50ミリ秒でいいのか?
Sleep(1)って本当に1ミリ秒?
糞早いマシンならそうかもね ナノ秒単位で求めだしたし
Sleepは寝過ごすことがあるのであまり当てにしないように
ギャバンとシャリバンの蒸着時間を語るスレはここですか?
以前に聞いた者なのですが、もう一度お願いします。 #include<stdio.h> main() { int a; while((a=getchar())!=EOF) { putchar(a); } } この時のEOFというのは、何の値のことなのでしょう?
End Of Streamとでも言いましょうか・・・ 結局はデータが入ってないって事です。 < input.txtみたいなリダイレクトなら言葉どおりEOFだね
とりあえず、int a より、char a のほうがいいとおもうよ。
マクロを知らないとは言わせない
>>201 文字コードはunsigned charでEOFは-1だからgetchar()はintで受けるんですが?
>>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);
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
>>207 追記、v-sync待ちの部分だけでいいです。
たしか、2-3行だった記憶が・・・
>>209 このbitを監視ですね。
ありがとうございました〜〜〜〜!!
WinAPIの質問は完全に別離してよろしいですかとお伺いを立てろ そしててめぇでテンプレ修正しろ、な?
なんで突然WinAPIの話が出てくるの?
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で表示するとここは正常に表示されます コンパイルもできているので演算子の使い方だと思ったんですが・・・ 調べてもよくわかりません わかる人お願いします
>>217 そう言うときはソースを晒せ。
初心者の「○○と書いたら」ほどあてにならんものはない。
>>217 >数値がおかしくなる
を説明してくれ。
>>216 思いっきりスペリングミスしたまま公開するような香具師がろくなものを書くわけがないよな。
scanfのときa,bに&がない or printfのときcに&を付けた
>>214 >213はWinAPIの話と勘違いしたんだろうよ。
>>215 だからと言って、適当なスレがないならここでもいいだろう。
173へのレスだ気にするな
224 :
217 :2005/03/25(金) 14:11:28
printf("五つ目の商品の金額を入力してください\n"); scanf("%d",&s5); printf("何個買いましたか?\n"); scanf("%d",&k5); g1 = g1+s2*k2; しかもprintfに&つけてるし・・・
( ´д)ヒソ(´д`)ヒソ(д` )
227 :
217 :2005/03/25(金) 14:24:42
>>225 ・・・
指摘ありがとうございます
なんか自分ではミスってわからないものだと実感した・・・
自分を過信しすぎていたようで
スレ汚しすいませんでした
本当にありがとうございます
>>221 定番とは言えおみごとだったな。 と自画自賛。
>221が正解か。
230 :
デフォルトの名無しさん :2005/03/25(金) 14:58:53
質問です。 コンソール画面でパスワードなんかを入力させる時、 入力した文字を非表示もしくは代替文字で表示するには どうすればいいですか?
すいません、C言語初心者です。 C言語で「一定時間ウェイトを入れる」にはどうしたら良いですか? 2重ループとか必要ですか?
>>230 実装依存。端末制御をする必要があるので、該当環境のスレへどうぞ。
>>231 実装依存。OSに後で起こしてもらう必要があるので、該当環境のスレへどうぞ。
>>231 UNIX系ならsleep、WindowsならSleep。
forを使った空ループでのウェイトはCPUの無駄遣いだし
CPUの速さでウェイト秒数が変わるので無意味。
その上、空ループだとコンパイラの最適化でループそのものが
コードから消えてしまうかもしれない。
WindousならSleep //Sはでっかい Linux/UNIXはusleep //確かそんなのがあったはず select( 0, NULL, NULL, NULL, &tv ); ってのを使うのが汎用的
プ
ためしに、下のようなプログラムを作ったのですが、 「定義されていない識別子です。」というエラーが出ました。 ちなみに、OSはWindows2000でMicrosoft Visual C++ 6.0を使っています。 #include "stdio.h" int main(){ printf("Hello\n"); Sleep(1000); printf("World\n"); return 0; }
>>236 #include <Windows.h>
を "stdio.h" の次の行に入れてごらん。
#include <stdio.h> #include <windows.h> 自作のものは""、既存のものは<>と今は覚えておこう
>>236 printf()はバッファリングされるかもしれないので、最後に纏めて表示されるかもしれない。
実験目的ならfprintf(stderr, "Hello\n");などとした方がいいかもしれない。
printfは必ずfflushされるでしょ?
おぉ!できました。 ありがとうございました!
>>240 反論するときは確証を得てからにしような。
243 :
217 :2005/03/25(金) 16:09:38
すいません先ほどの者です
さっきのはうまくできたんですが次にやっていることがまた・・・
今度はprintfで%dを使い計算結果を表示しようとしています
しかし計算結果が全て0になってしまい表示がうまくできません
(計算を書かないで数値だけだとうまく表示できる)
%dは小数点以下を四捨五入すると本には書いてあるので
計算に小数が入っていても問題ないですよね・・・?
ソースは↓です
ttp://up.isp.2ch.net/up/fe95391e1ee1.zip またよろしくお願いします。。。
てかプログラム以前に四則演算ができてないな・・・ まあぼるじょあでどうぞ
>>243 printf()は演算結果の型を使用者が保証しないといけない。
%dは整数値を表示しろという指示だが、実数演算を行なうとそのままでは実数値が渡されてしまう。
(int) (2000 + 250 * 1.05)などとして整数化すれば表示はできる。但し、キャストの段階で切り捨てられる。
実数値を四捨五入させたいのなら、%dではなく、%gを使用すればよい。但し、逆に2000ではなく2000.とする必要がある。
つーか、入門書でも読んでこいや。
>>244 宿題でもないのに宿題スレに誘導するな。
248 :
デフォルトの名無しさん :2005/03/25(金) 17:42:43
あぁ、春だなぁ… ん?このスレを見ていったんじゃないよ
ここは日記帳じゃないよね
250 :
デフォルトの名無しさん :2005/03/25(金) 18:09:38
小規模のゲーム板で、プログラマ募集してるみたいだよ。 いそげ!陸、海〜なんとかっていうプロジェクト!
単純なマクロの間違い(コピペミス?)ですた。
252 :
217 :2005/03/26(土) 01:36:29
すいませんレス遅れました
>>246 %dって実数を四捨五入して整数にするんじゃないんですか?
一応「C言語プログラミングの初歩の初歩」っていう本見ながらやってるんですが・・・
「カンマ以下の計算式で得られた計算結果を文字列中の%dの位置に整数として画面に表示させる
この方法では小数点以下は四捨五入されて表示されます」
って書いてあったんですがこれが間違ってます?
小数点以下は切り捨て
>>252 思いっきり間違っている。本当にそう本に書いてあるとしたら、とんでもないカスだな。
255 :
デフォルトの名無しさん :2005/03/26(土) 03:30:52
double型の配列を0.0で初期化したいんですが、memsetを使うのはどうなんでしょう? ループをまわすより速そうだし、素人目には問題なく見えるのですが。
使用しているコンパイラがIEEE754に準拠した浮動小数処理をしているなら無問題
258 :
デフォルトの名無しさん :2005/03/26(土) 03:49:38
数行のサンプルプログラム自分で作って確認すれば解決する質問ばかりだな。
偉そうな割に内容のないレスばかりだな。
標準C/C++として問題があるかどうかは解決せんだろうが。
261 :
255 :2005/03/26(土) 04:20:45
時間は計ってないや doubleとfloatの内部での表現は調べたけどね。
262 :
デフォルトの名無しさん :2005/03/26(土) 05:59:42
バイナリでダンプすればすぐわかるじゃん。
>>263 doubleとfloatの内部での表現の話をしているのだよ。
試せばいいだけのネタじゃないか。 最適化オプションは付けるなよ。
最適化しなくちゃ意味ないと思うが。
うはっwwこのmemset何もしてねぇwww ってコンパイラが余計なことしかねないじゃん
269 :
デフォルトの名無しさん :2005/03/26(土) 07:09:50
う〜む、なんで std::bad_alloc は std::exception を直接継承しているんだろう。 意味的には std::runtime_error から継承した方がいいのにな。 そうすりゃ what() メソッドも使えるのに。
//こんな場合 //daryはmemset以外使われていない hoge = timeGetTime(); for (i=0; i<MAX; i++) memset(dary,0,sizeof(dary)); hoge = timeGetTime() - hoge;
つーか、基本的にmemsetの実装自体ループ回して代入してるだけだったりするけどな。 関数呼び出しが入る可能性があるだけ不利とも言える。
ちなみにセキュリティ上の理由でメモリの開放前に0で埋めるようなコードを入れることがあるんだが、コンパイラが無駄なコードだと判断してそれを削除するという笑い話がある。 WindowsだとそれをさけるためにSecureZeroMemoryというものまである始末だ。
いやだから、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分増えるんでしょうか
すみません、↑の BITMAPINFOHEADER Z は BITMAPINFOHEADER X の間違いです_| ̄|○i|i
>>276 VCのデフォルトではlongはlong幅の境界にしか置きませんから正常です。
オーバーアクセスって何のことだい?
現象を詳しく言ってみ?
それだけの情報では君のプログラムがおかしいとしか思えない。
>>276 「アライメント パディング」でググってみるとよろし。
なるほど、そういう理由だったんですか・・・
>>278 メンバZはlong型配列の先頭要素という位置付けでして、
実際のメモリ上のデータは、X、Y、Z[a]で構成されるとして、
構造体の定義時点では配列の要素数は確定しませんので
GlobalAllocで必要な領域を確保して構造体のポインタにキャストしてアクセスするようにしてます
で、memcpyで別の配列からZへ要素全部一気にコピーするんですが、
デバッグしてメモリーを見てると、その時に最後2バイトぐらい確保した領域からはみ出して書き込んでて
そのせいでWinMain抜けた後にエラーが出てたんです
>>279 ありがとうございます、調べて見ますです
連続すみません アライメント調べて見ました ということは、↑の構造体の場合 Yをlongにするか、YとZの間にもう一つshort型を入れるかすればいいということですね
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' よろしくお願いします。
>>282 プロトタイプ宣言するか、func1()をmain()より前に持ってくるかしないと・・・
>>282 void func1();
main()
{
func1();
}
void func1()
{
printf("あいうえお");
}
コンパイラはソースコードを上から下へ順に読んでいるから、
関数を使うところより先に関数の存在を教えないといけない。
>>283 >>284 ありがとうございます。
理解できました。
10年前が初版の独習Cを使っているのですが
そんなこと触れられていませんでした。
新しいのものにするべきなのでしょうか...。
>>285 もしかしてC++としてコンパイルされているんじゃないか?
Cなら宣言なしで関数を呼べる。(多分警告は出るだろうが)
>>285 C言語は当初プロトタイプ宣言は無かったから、
Cコンパイラならたぶんエラーにならないんじゃないかと思うが
使ってるのがVC++なうえに、たぶんそのソースファイル、拡張子がCPPになってんじゃないのかね?
>>281 そんなことしなくても解決できるはずだが。
コピーするときのコピー先アドレスの求め方がおかしいだけジャマイカ。
289 :
285 :2005/03/26(土) 12:06:14
>>286 Visual C++を使っているのでそうかもしれません。
Cの後にそのままC++を勉強するつもりなもので。
>>287 おっしゃるとおり拡張子はCPPです。
C++のことを単純にCの上位互換と思っていたのですが、
そう簡単な話ではないのですね。
ソースファイルの拡張子でCかC++か判断してるんじゃなかったっけな file.cならC言語で、file.cppならC++だから
>>288 A* pAとしてたとして
memcpy(&pA->Z, コピー元, コピーサイズ)
としてるんですが
>>281 VC++なら#pragma packでアライメント調整すればいいと思うが。
つか、アライメントに依存した実装はあまりよろしくないかと。
>>276 ところでそんなことするときはZは要素数1の配列にするのが常套手段。(C99なら要素数省略できるけど)
Z[0], Z[1], Z[2]とアクセスできる。
>>292 調整して直るかも知れないが、あんまりどころか全然よろしくないだろ。
アライメントに関係なくコピー先アドレスとコピーサイズが正しければオーバーランなどしないんだから。
>>292 ちゃんとpragmaで調整できるんですね・・・
調査不足ですみません
>>293 格納する値がlong値なので、long配列以外考えてもみませんでした・・・
色々勉強になりました
ありがとうございます
>>276 にセミコロンが1つもないことに誰か突っ込めよ
別に突っ込まない、 初心者に対してそんな重箱の隅を突っつくようなことはしない。
そういうエラーの話じゃないのでめんどくさいと思って書かなかったんですが、セミコロン さすがにそんな間違いなんてしませんよ
>295 よく判らんがsizeof(struct A)を使え。
sizeof(struct A) - sizeof(long)かな?
>>295 BITMAPINFOにならってヘッダー部分を別の構造体にすれば絶対安全かな?
それとも、パディングでずれる余地はあるのかなあ?
領域確保は sizeof(struct Header) + データサイズ でスマートになるけど。
>GlobalAllocで必要な領域を確保して ここに間違いがありそう。どうゆう計算してんだろ?
>>302 パディングのことを知らなかったので、
パディングの分の2バイトを計算せずにGlobalAllocしてたました
ということはsizeof使わずに、メンバ変数のサイズを数えたのか?アホやな
アホですみません(´・ω・`)
いいんだよ無くても
Visual C++で勉強している者です。 次のプログラムのfunc1()をプロトタイプ宣言するには どのようにすればよいでしょうか。 戻り値がreturnだけの場合はどの型にすればよいかわかりません。 よろしくお願いします。 /*******************/ #include "stdafx.h" #include <stdio.h> main() { func1(); } func1() { printf("表示される"); return; printf("表示されない"); } /*******************/
>>309 >>282 と同一人物か?
まぁ別人でもどうでもいいが
returnは戻り値じゃない
returnはその関数をそこで終わらせて、必要なら戻り値を呼び出し元に渡す命令
returnの後に続けて変数や定数を書くことで初めて戻り値が有るということになる
returnだけ書いた場合は、そこで関数が終わるだけで、戻り値は無い
つまり関数の戻り値定義はvoid
よって↓になる
void func1();
void func1(void);
>>309 C言語の入門書を1冊ぐらいは読んだ方がいいと思う。
勉強始めて2ヶ月の俺が言ってみる。
C,C++,VisualC++を勉強しようとしているものなのです。 マイクロソフトのVisualC++ Toolkit2003を使おうかとおもっているのですが C,C++に使っても問題ないですよね? なんか不都合とかあるんでしょうか? もしくは、こっちのほうがいいよとかってありますか?
VisualC++ Toolkitでは所謂VisualC++(MFC/ATL/WTL)のプログラミングが できないことを理解しているなら、それでいいと思うけど。C++やるなら充分。
年? ・・・・21
あ・・・VisualC++はできないんだ・・・ 理解してなかった。 なんでこんなにややこしい名前ついてるんだろう。 まぁ、当座はC++やるんで、関係ないっちゃ関係ないですが
>>317 アレはVC++の拡張用のコンパイラだった気がする
>>319 ワロタ
そんなもの問題になるのかw
簡単ってレベルじゃねー
>>319 俺でも、本ひぱりだしてきたら解けるな。
(素ではわからんあたりがかなしい)
>>314 年聞いて何がしたかったんだろう?
322 :
デフォルトの名無しさん :2005/03/27(日) 01:19:32
クラスのプライベート変数で、かつconstにしたい場合はどうすればよいのでしょうか?
>>322 コンストラクタでイニシャライザを使って初期化。
class hoge{
const int i;
public:
hoge(int x) i(x){}
//...
>>322 こんな感じ
class Hoge
{
int const hoge ;
Hoge() : hoge( 10 ) {}
}
>>322 おれもそれ知りたかったところ。
>>323 ,
>>324 thx.
ついでにこれ↓の悪いところ教えてくれ。
class Hoge{
private:
static const int hoge = 10;
public:
...
}
>>325 class Hoge{
private:
static const int hoge;
public:
...
}
static const int Hoge::hoge = 10;
327 :
325 :2005/03/27(日) 03:07:15
>325 >悪いところ VC6
329 :
325 :2005/03/27(日) 03:40:52
330 :
325 :2005/03/27(日) 03:43:28
MSのやつか。使ってないよ。
>>271 最近のCPUに対応していればループどころか
ブロック代入命令で一発だろ?
古のmovs系列の....
違うの?
>>332 ある実装を見てみるとまずDWORDサイズでmovsして端数分はバイト単位にしてた。
>>318 Platform SDKとかDirectX SDKと一緒に、普通に使ってるけど。
開発環境というか、ホントにコンパイルするためだけの一式というか。
335 :
325 :2005/03/27(日) 17:18:47
336 :
309 :2005/03/27(日) 17:34:09
>>310 282と同一人物です。
void func1();
でエラーだったので質問してみたのですが
改めて試すとOKでした。
こちらの単純ミスだったようです。すいません。
>>311 こんな書き方もあるんですね。
勉強になります。
>>312 3、4年前に入門書は一通り勉強し、
ブランクがあるので復習がてら勉強しています。
ともかく、あまりに基本的な質問を連発してすいませんでした。
今後はもっと調べてから質問します。
>>336 Cだとそれぞれ意味が違う。
void func1();にすると引数は不定ということを表す。(C++では下と同じ意味になる)
void func1(void);だと引数は無いということを表す。
338 :
デフォルトの名無しさん :2005/03/28(月) 08:33:00
doubleをstringに変換する方法を教えてください
double d; string s = (string)d;
>>338 std::stringstream
::sprintf
お好きな物どうぞ
sprintf(s, "%f", d);
>>338 boost::lexical_cast<>
343 :
デフォルトの名無しさん :2005/03/28(月) 15:00:55
>>339 私の環境ではうまくいかないのですが・・・。
環境も書かないで、自分の環境ではとか言われてもな
345 :
デフォルトの名無しさん :2005/03/28(月) 16:08:15
環境とはコンパイラだけだと思ってるお方ですか・・・('A`)
まぁ
>>341 でも使っとけや
ファイルからテキストファイルを読み込んで内容を char *text; に格納したとして、 text[n]で、nの最大値を知りたい時はどうすればいいのですか?
>>347 元々確保したchar変数のサイズから分かるだろうそれくらい・・・
VisualC6.0で開発しています。 別のプロジェクトのクラスで、同じ情報を参照したいのですが, 良い考えが思いつきません。どなたか、お知恵をお貸し願えないでしょうか。 とりあえず、 別のDLLのAクラス、Bクラスが参照できるように、新規でプロジェクトを 立ち上げ,以下のような宣言でクラスを作りました。また、そのクラスの静的な オプジェクトを作りました。 *************************** <XXXXX.h> class __declspec(dllexport) XXXXX { ・・・ }; static XXXXX g_XXXXX *************************** クラスの中身には、GetXXX, SetXXXのような関数が入っています。 Aクラス、Bクラスのソースファイルで<XXXXX.h>をインクルードし, それぞれの情報を参照してみたところ,staticなオブジェクトで ありながら、AクラスとBクラスでは別のアドレスを参照していました。 なにか、別の方法を使わないとだめだと思うのですが,思いつきません。 同じアドレスの同じ情報を参照したいのですが,可能なのでしょうか? ご意見,お待ちしています。
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に渡していじくるのはいけない事なのでしょうか?
Cの勉強をしようと参考書を買ってきたら本当に1から始める人用だったみたいで 乗っていなかったので質問なんですが、C言語にも「ここからここへ飛ぶ」みたいな 関数はあると思うんですがそれの書き方を教えていただきたいです。 While文の条件以外に定めた条件に触れた場合に後々共通する場所に飛ばしたいのですが ・・・
353 :
デフォルトの名無しさん :2005/03/28(月) 18:27:16
sageてしまいました。すみません
>>351 EXE側とDLL側のstd::vectorの実装が同一ではないから
>>354 なんと!!!
関数に頼ることばかり考えていて、まったく思いつきませんでした。
試したところうまく行きました。
ありがとうございました!
↑unionの件です
358 :
351 :2005/03/28(月) 18:50:50
C99の範囲でsetjmpとかlongjmpというのがあるらしいけど、 つかったことがない。
試しに使ってみろ もう使ったことないなんて言わせない!
質問させてください。 少し上でも出ている事と似たようなことなのですが、DLL側で作ったクラスをアプリ側で使用する場合、 純粋仮想関数のみで構成しているクラスをインターフェイスとし、インスタンスの作成と破棄をDLL側で行えば DLL側に実装を隠したままアプリにクラスの機能を提供できると思います。 ただしこの方法だと、DLL側とアプリ側のコンパイルの環境が違う場合、インターフェイスクラスをコンパイルしたものが 別物になる可能性があり、呼び出しの時に不正なアドレスを参照する恐れがあると思うのですが、どうでしょうか? DLL側で作成したオブジェクトをアプリに提供する場合、クラスのまま安全に呼び出す方法は無いと考えているのですが、 これって間違いですか? Win32APIのようにハンドルとラッパーAPI作って呼び出すしかないのでしょうか。
>>361 安全に受け渡しするためにあれこれ工夫するくらいなら、保証されている受け渡し方法を使うほうがよい。
>>361 COMが作れる有名どころのコンパイラなら大丈夫だとは思うけどね。
>>362 >>363 >>364 COMについては少し調べてみました。
あれは呼び出しとデータの受け渡し方法を特定の言語に依存しない形に決めちゃって、実装についてはなんでもいいというスタンスと理解してます。
そこだけ見れば要求に合うものなのですが、実際使うとなるとTLBを作ったりDLLをレジストリに登録したりと、通常のDLLに比べるとお手軽度が低く
敷居が高いような気がします。COMについては詳しくないので誤解があったらすいません。
C++のクラスをCOMのそれと同じ安全度で、且つ、CのDLLのようにお手軽に使える方法があれば・・・と思って質問させていただきました。
やはりCOMしかないのでしょうか。.NETはそのへん解決してるっぽいですが・・・
VCしか使わないから割り切って進むのもありかもしれないですね・・・
ありがとうございます。
>実際使うとなるとTLBを作ったりDLLをレジストリに登録したりと んなこたーない。
>>365 COMインターフェイスだって(C++の場合)実体は純粋仮想関数を並べたクラスなんだから、361の方法で何も問題は起きるはずがない。
どうしても心配なら関数ポインタをメンバにした構造体を外部に公開すればいいんじゃない?(CでのCOMインターフェイスみたいに)
v_ptrの標準化は禿が否定的だからなぁ
じゃあその邪魔な禿殺して来いよ
キミがヤってくりゃいいじゃん
そうじゃないだろ、368に命令してんだよこの在日が
意味不明 見てて痛いから急に尻込みしないように
お前らと禿どっちが信用できる?
禿
禿
禿
秀
ビアッジ?
>>378 ・C++
・標準化
・禿が否定的(=影響力を持つ禿)
ここまでキーワード出てるのに・・・
382 :
デフォルトの名無しさん :2005/03/29(火) 08:59:15
Windowsプログラムで、自身のフルパスを取得する方法を教えて下さい。
GetModuleFileName
384 :
デフォルトの名無しさん :2005/03/29(火) 09:05:43
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]にポインタが入っています
388 :
デフォルトの名無しさん :2005/03/29(火) 09:22:35
エロゲ
389 :
デフォルトの名無しさん :2005/03/29(火) 09:39:11
Windowsプログラムでスクリーンショットを撮る方法を教えて下さい。 ググっても中々見つかりません・・・
>>389 DC取得して、BITMAP取り出して、ファイルに保存
391 :
デフォルトの名無しさん :2005/03/29(火) 10:04:49
UNIXプログラムでスクリーンショットを撮る方法を教えて下さい。 ググっても中々見つかりません・・・
393 :
デフォルトの名無しさん :2005/03/29(火) 10:05:40
>>390 さん
回答ありがとうございます。
すみません、参考になるようなサイトはないでしょうか
395 :
デフォルトの名無しさん :2005/03/29(火) 10:13:21
>>395 どういう検索ワード使ったんだ‥‥(;´Д`)
デバイスコンテキストハンドルとデスクトップで検索かければ普通に出てくるだろうに
397 :
デフォルトの名無しさん :2005/03/29(火) 10:26:50
>>396 C#でのサンプルは見つかったんですが、それ以外は見つかりませんでした・・すみません
せめてC#をC++に読み解くくらいしろ
399 :
デフォルトの名無しさん :2005/03/29(火) 10:36:08
了解しました。また問題が起きたら報告します。その時はよろしくお願いします
400 C++
401 C++
402 :
デフォルトの名無しさん :2005/03/29(火) 11:18:56
Windowsプログラムで、999のパスを取得する方法を教えて下さい。
404 :
389 :2005/03/29(火) 11:24:38
405 :
デフォルトの名無しさん :2005/03/29(火) 11:31:04
>>404 if (SaveDialog1->Execute())
{
bmp->SaveToFile(SaveDialog1->FileName);
}
406 :
デフォルトの名無しさん :2005/03/29(火) 11:31:52
>405 TFileStreamクラスとSaveToStreamメソッド使おうよ。
408 :
389 :2005/03/29(火) 11:37:40
>>405 ,407さん
回答ありがとうございます
MSDNで検索しても関係ないものばかりで、
ググってもVBやらDelphi関連のページしか出てきませんでした。
ちなみにコンパイラはBCCです。フリーの
LPRECTって渡してどうするよ… RECT構造体作ってそのアドレス渡さなきゃ
410 :
389 :2005/03/29(火) 11:48:36
>>409 さん
すみません、全く意味が分かりません。
具体的にどのように修正すればいいかお教え下さい…
つか、コレCとC++どっちを想定してる? 退屈だから、やってやろうと想ったがメモリの割り当てどっち使おうか迷うんだが
412 :
389 :2005/03/29(火) 11:50:52
>>411 さん
ありがとうございます。
Cを想定しています。C++は勉強中です。すみません。
どーでもいいがバカ正直にGetDCするだけだとマルチモニタ環境で破綻するからな。
Visual C++ .NET Standard 2003を購入しよう思うんだけど これって営利商用利用できますか?
415 :
389 :2005/03/29(火) 11:54:01
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);
418 :
389 :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
420 :
389 :2005/03/29(火) 12:12:50
422 :
416 :2005/03/29(火) 12:27:18
423 :
389 :2005/03/29(火) 12:35:02
>>422 さん
ありがとうございます。参考にさせて頂きます
424 :
411 :2005/03/29(火) 12:45:14
425 :
389 :2005/03/29(火) 12:46:07
>>424 さん
うわぁ、凄いです!ありがとうございます!
426 :
389 :2005/03/29(火) 12:49:17
>>424 すみません、
>bcc32 test.c
でコンパイルしたらエラー出まくったんですが、
他の引数が足りませんか?
427 :
411 :2005/03/29(火) 13:00:33
428 :
389 :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
433 :
デフォルトの名無しさん :2005/03/29(火) 15:28:13
>>432 さん
回答ありがとうございます
MSDNで検索しても関係ないものばかりで、
434 :
デフォルトの名無しさん :2005/03/29(火) 16:11:28
C++の入門サイトを見ているのですが、「値を戻す関数」というのがよくわかりません。
値を戻す関数 int func1();
436 :
デフォルトの名無しさん :2005/03/29(火) 16:30:57
>>435 そういうことじゃなくて、呼び出した場所に整数を戻すとか、どういうことなのかわからないのです。
>>436 もっと日本語読み解けよ
戻り値って言うだろうが
ん?もしかして、そこまで初心者だとは思わなかった。 関数が返り値を持つ事が不思議なの? 関数がどう言う意味か学校の数学で習わなかったの?
いや、それ以前にC++って見たから、既にCの言語仕様は完全に知っているものと勘違いした。
期待の新人現る。
ルーキーオブジイヤー目指してがんばれよ。
アップキャストしたクラスへのポインタから、代入ではなく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
無し
むしろmemcpy推薦
447 :
デフォルトの名無しさん :2005/03/29(火) 19:46:29 ID:
>>339 マジですか?そんな便利な変換コンストラクタが定義されてるんですか?
typedef struct _FILETIME { DWORD dwLowDateTime; DWORD dwHighDateTime; } FILETIME, *PFILETIME; 上記構造体をunsigned __int64に変換したいのですが、 やはりmemcpyするしかないのでしょうか?
450 :
デフォルトの名無しさん :2005/03/29(火) 20:16:12 ID:
なるべく高速なプログラムを書いてます。 template関数を使うと遅くなりますか? マクロだから関係ないですよね?
IDが…
>>450 マクロではないです。
遅くなんてならないです。
>>448 FILETIME ftime = {0,0};
unsigned __int64 u64 = (unsigned __int64)ftime.dwLowDateTime
| ((unsigned __int64)ftime.dwHighDateTime << 32);
こんなんでどう?
454 :
448 :2005/03/29(火) 20:24:24
>>453 できればキャストしたいなと思ってるんですがやっぱり無理か‥‥orz
MSDNはコピーしろって書いてあるし‥‥
455 :
デフォルトの名無しさん :2005/03/29(火) 20:25:06
>>452 ありがとうございます。
マクロじゃなかったんですか。
勉強になりました。
456 :
デフォルトの名無しさん :2005/03/29(火) 20:33:52
457 :
デフォルトの名無しさん :2005/03/29(火) 20:36:13
とりあえず、似たようなもの、ってことでしょうかね。
コンパイルタイムに決定されるという意味ではマクロと同じで、遅くもならない ただ柔軟性は段違い
>>456 それは正式な文書ではないので細かな部分で間違いを含んでいることがあると思います。
templateは静的ですが、マクロとは別物です。
>>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 マクロではないけど、静的なので、速度には影響しないと言う解釈でいいでしょうか?
違います
>>448 unsigned __int64 u64 = *reinterpret_cast<unsigned __int64*>(&file_time);
でいけるはず。
CってWEBプログラミングで活用できるの? Perlだとか、PHPだとか。 ちょっと詳しくおせーて。 あと、エスケープシーケンスの\tの使い方教えてくれ
>>465 Webでも活用はできるが、PHPの方がいい。
468 :
デフォルトの名無しさん :2005/03/29(火) 23:57:09
Perlを虐めないで下さい><
PHPの存在理由って何?
>>469 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!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!
Ruby>PHP>>>>>>>>>>>>>>>>>>>>>>>C>>>Java
PHPはC言語ダメか。 じゃあRubyとかPerlは使えるの?
PHPで構造化プログラミングしてる香具師は少ない
>>444 PODでないクラスをmemcpyしちゃダメ。
>>465 2chのread.cgiはC++で書かれている。
\tはタブ文字。
C++じゃない。ただのC。
質問。 とあるクラスのメンバ関数なんですが、 名前の通り線形検索して、リファレンスを返すようになっています。 ここで、問題なのは、見つからなかったときの処理で、例外を投げています。 こんな実装でいいモンなんでしょうか。 というのも、たとえば、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; }
いまどきコンテナライクなクラスでSTL非互換なインターフェースとかありえない。
習作なんだから、勘弁してください。
>>481 参考までに聞きたいのですが、STL互換というのは、イテレータが使えるとかそういうことですか?
妙案ありませんか?
>>480 そこは例外を使うところではない。
boost::optionalかイタレータのどっちかを返すようにしろ。
485 :
480 :2005/03/30(水) 06:19:39
取りあえず、クラス使おうぜ 今どきC++で、マクロや広域関数でデータ構造を作るのはちょっとあり得ない Cならわからんでもないが、テンプレート使ってるしな……
練習してる人間にそんなこと言うヤツなんて今時ありえない
488 :
480 :2005/03/30(水) 07:47:35
>>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;
}
>>490 よく読め。
「ソース内に unspecified-bool-type とは書けない」
同様の operator を持つクラスを実装したいなら、 boost のソースを読むといい。
>>491 ほんっとに直接的ないみでかけないのですね。こりゃ参った。
boostのソースか、ちょっと躊躇してしまいます。
まあいいか。
レス、ホントに感謝。
>>492 つーか、ちょっと考えれば
型名にハイフン使えないことくらいわかるでしょうよ。
型名どころか全ての名前に使えないだろ、演算子なんだから
枝葉末節だな。
boost::container_facade 欲しい(゚Д゚)欲しい欲しい欲しい
499 :
444 :2005/03/30(水) 17:30:46
500 :
デフォルトの名無しさん :2005/03/30(水) 18:41:56
ヒープの語源を教えてください
英和辞典で見れば?
塵も積もればヒープとなる
ぷひー
504 :
デフォルトの名無しさん :2005/03/30(水) 19:08:53
>>500 そんな事は検索エンジンで”ヒープ””語源”でしらべてみそ
といいながら答えてみる
Heap:
英語の意味は積み重ねるとかたくさんなどの意味だが
もともとは、古期英語「大勢」の意
すぐ調べられることはなるべく自分でが鉄則ね
505 :
デフォルトの名無しさん :2005/03/30(水) 22:49:24
そのヒープが、なぜ配列で実装された半順序木と言う意味を表すようになったのか、 言語学的な関心をよせずにはいられない。
バランスのとれたツリーは積み重なったワラのように見えなくもないじゃないか
#include <stdio.h> main(){ a: printf("ぬるぽ"); goto a; } これを実行するとどうなるんですか?
>>507 いつまでそんなクソつまらん事やってるんだ
いつまでも だ
特にgotoなんて使ってるところがね
とあるソフトのプラグインdllのサンプルソースを頂いたのですが。 resource.hというファイルが無いとエラーが出てしまいます。 そのファイルを入手しないとビルド出来ないのでしょうか? resource.hはダイアログボックスか何かの設定なんでしょうかね・・・?
>>514 なぜここで訊く?
くれた奴に訊くべきだろうが。
俺らはエスパーじゃない。
2chに落ちてた物なんで聞けないんっす。 resource.hは一般的なファイルじゃないって事ですね。 即レスありがとう御座いました。
>>516 おまえ何いってんの?
> 2chに落ちてた物なんで聞けないんっす。
ハァ? だったらそのスレで訊けや
> resource.hは一般的なファイルじゃないって事ですね。
電波か?俺はそんなこと言ってない
名前は十分一般的だ。しかし中身がどうとかは推測しかできない
OKOK
ほーけーほーけー
>>514 まさしくリソース。<resource.h
VisualStudioならダイアログエディタが生成する。
つーか、どうするべきか該当スレで聞けって。
有るのに見落としてるだけだったりしてな VCのプロジェクトがもう有ってそれを開いてやってるだけだけど、 プロジェクト作ったヤツがファイルをプロジェクトに追加するの忘れてるとか
522 :
デフォルトの名無しさん :2005/03/31(木) 16:26:07
静的でないメンバ関数の中で呼び出しが正しくありません ってなんですか?
書いてあるとおり呼び出しが不正だってんだろ そんな情報だけで何が答えられるか・・・
それぞれ独立したクラスで、XXX::YYYの呼び出しをしたら上のエラーでした。 やっぱり「それぞれ独立したクラス」だから呼び出せないと?それとも他に問題があるんでしょうか? 宣言を確認してください、とも言われました。引数の数などは合っています。
こんなもんで参考になるのかわかりませんが・・・・ BOOL DLG::Update() { /*諸処理*/ CtoWindow::hoge(); return TRUE; }
激しく説明不足と思われるので補足。 CtoWindowは無継承のクラス。hoge()は、引数なしの返り血void。 お互いに血縁はないです。
CtoWindow::hogeは本当にstaticになってるん?
>>526 CtoWindow().hoge();
それが良くわからなくて・・・。 staticにすることによるメリットも、そもそもどうやってstaticにするのかもわからないのです。
>>529 通った!え、なんでですか?CtoWindowってクラスじゃないのか!?
>>530 class hoge
{
public:
static int foo; //staticなメンバ
int bar //staticじゃないメンバ
};
>>531 CtoWindow()で一時無名オブジェクトが返されて
そのオブジェクトのhogeが呼ばれただけだろ
一度C++の基礎を勉強したら?
>>533 教本に載ってねぇーーーーーーーー!!
とりあえず教本を破り捨てるところから勉強を始めようと思います・・・・。
クラス名を関数みたいな形で呼び出すと、一時的につかえる無名オブジェクトが返ってくるっておけですか?
遅延評価しろよこの糞C++
普通はクラスのインスタンスを作って呼び出すもんだろ・・・
>536 それは勿論承知してます。そのような使い方があることを知らなかったもので。 ところでどうしてCtoWindow::hoge(); の形では通らなかったのでしょうか? 色々なサンプルを見てるとこういう形の方が一般的に思えるのですが・・・。
なるほど・・・・わかりました。色々調べて見ます。ありがとうございました。
>>534 一時無名オブジェクトのことは書いてない本も多いよ。
何も特別な事じゃないと思うけど。オブジェクトってなぁに、って考えたら。
542 :
デフォルトの名無しさん :2005/03/31(木) 18:11:07
C++によるオブジェクト指向によって速度が低下する事は考えられますか? 超高速(1周期が300Hz以上)のシミュレーションプログラムを作成する必要があり、 今は設計段階でオブジェクト指向にするか、しないかで迷っております。 クラスを継承したり、関数ポインタ使いまくったりっていう オブジェクト指向は数値計算とは相性が悪いような気がしてなりません。 開発環境はwin2000、VisualC++6.0、GLUTです。
>>537 DLGがCtoWindowからの派生クラスなら問題なかった
544 :
デフォルトの名無しさん :2005/03/31(木) 18:32:12
>>542 vtable参照しまくるとそれなりの遅延は起きるだろう。
しかしそんな瑣末な遅延よりも、良いアルゴリズムで
プログラムを構築したほうが何倍も良い。
545 :
デフォルトの名無しさん :2005/03/31(木) 18:34:57
>>544 ありがとうございます。オブジェクト指向での開発は止める事にします。
瑣末な遅延が無視できるシミュレーションならいんですが、
リアルタイムである事が必要条件なので、無視できないんです。
オブジェクト指向で設計しても効率良く書けば実効速度はほとんど変わらない。
>>542 オブジェクト指向で
虫取りや保守は楽になるだろうけど...
私は速度面だけでそこまでタイトにやった事ないからなあ
もし、同じ経験のある方は詳細を教えていただきたいものです
スレ違いですけど...
開発環境がVC6って段階で終わってる気がする。 何打神田御託を並べる前にどの程度の処理が必要でどの程度の速度が要求されるか調べる方がよい。 実際仮想継承でもしない限り、オブジェクト指向で遅くなるとは考えにくい。
遅延評価できればオブジェクト指向でも全く変わらない速度で実行できることが保証できるのに。
真面目にレスすることないよ。 単に、オブジェクト指向という得体の知れないものを勉強するのが嫌、今までのスタイルを変えたくない、その言い訳を探しにきただけなんだから。 わずか20分、2レスで「ありがとうございます。オブジェクト指向での開発は止めます。」って、冗談としか思えない。
>>542 > クラスを継承したり、関数ポインタ使いまくったりっていう
> オブジェクト指向は
ただ継承しただけで遅くなるわけじゃないし、
C++なら関数ポインタより関数オブジェクトを多く使うことになるわけで、
これは別に効率悪くないんじゃないの?
中の人の能力次第だな
>>542 同じ研究室の予感(´一`)ノ
引継ぎご苦労様です
クラスのメンバ変数が スタティックポインタの場合どう初期化すればいいですか?
俺だったら設計を見直す
556 :
デフォルトの名無しさん :2005/03/31(木) 21:48:46
>>554 とりあえず
class A
{
...
static int* pA;
...
};
なら
int* A::pA=NULL;(ソースファイルで初期化)
でいいと
>>544 vptr経由の間接参照自体はたいしたコストじゃない。
問題は、多態バリバリのプログラムだと
仮想関数を呼び出すところで、分岐予測がはずれまくること。
こちらの方が、「遅くなる原因」としては大きい。
といっても、下2行に激しく同意だし
そもそもベンチマークをとらなきゃわからない程度の違いしかないだろうけど。
>>554 俺の持ってるC++本の一説によると、
staticメンバの初期化はファイルスコープ中で行うこと
だそうだ
高速化はプロファイリングしてから考えろ
560 :
デフォルトの名無しさん :2005/03/31(木) 22:56:33
>>548 開発環境は何がいいの?
VC6ってそれほど悪くないと思うんだけど・・・
>>560 548じゃないが、少なくともテンプレ関係がうんこであることは疑う余地がない。
563 :
542 :2005/03/31(木) 23:07:55
>>547 そうなんですよ。
その魅力があるから、うだうだ悩んでるんです。
>>548 どの程度の処理って言われましてもねぇ・・・詳細はちょっと言えないんですよ。すいません。
行数で言えば1万行程度ですね。
そのうち周期的に動かす部分は6千行程度です。
またその中で超高速である必要があるのは、2000行程度になると思います。
(4000行の部分は約60Hzで実行します)
>>550 一応出来ますよ。ただ、大規模な物は作った事ないので、検討段階なんです。
>>551 値の参照はどうでしょう?
たとえば、〇->aと直接aを参照するのに速度の違いはありますか?
>>553 多分違うけど、内容は似てそうね・・・。
>>555 見直すべき設計が出来てない状態です。
>>552 そもそも、他の OOPL に比較した時の C++ の利点って
「必要とあらば C と同等の実行速度が得られる」のと、
「それをプログラマが制御できる」所だしね。
565 :
553 :2005/03/31(木) 23:26:56
>>563 そういやうちのとはリフレッシュレートが違うな。
こちらはユーザインタフェース関係でつ。まあそんな話はさておき。
> 値の参照はどうでしょう?
> たとえば、〇->aと直接aを参照するのに速度の違いはありますか?
そんなくだらないことはプロファイリングしてから考えてください。
"まず実際に計測をすること。そこで本質が何かをつかむこと。十中八九、あなたの推測は間違っています"
―"リファクタリング プログラミングの体質改善テクニック"より
箸の上げ下ろしを論うようなコードの効率を云々するより、 PCなどのハードウェアを更新する方がよっぽど建設的な悪寒。 まぁ>565も言ってるが、プロファイルも取らないであれこれ言っててもね。
567 :
542 :2005/03/31(木) 23:33:53
>>565 耳が痛いですね。聞く前に実験してみるべきでした。
もうちょっと詰めます。
同じような分野だと思いますよ。うちの他にやってる所1箇所知ってますし。
周波数は最低限が300Hzであって、目標は1000Hzです。
そちらも頑張ってください。
568 :
542 :2005/03/31(木) 23:38:32
>>566 ハードウェアは既にいいのを使っています。
勿論最高の物では無いでしょうけど、
デバイスの関係で一回構築しちゃったものを
変更するのはちょっと難しいんですよね。
569 :
デフォルトの名無しさん :2005/03/31(木) 23:51:02
>>563 ○.a と a では同じです
○->a と a はポインタ参照するひと手間が入りますね
でも、同じポインタを集中して参照するようにコーディングすれば
そんなに違いはないと思われます
それと、テンプレートなどをうまく使って
なるべくオーバーヘッドをなくすような設計をすれば
C++も結構捨てたものじゃないと思われますが
hoge.aでもhogeが参照なら当然->と(ほとんどの場合)同じになってくる。
計算機の性能をあげるのが建設的とか言っている奴、アホだろ? アルゴリズムを変更すれば10倍速さが変わることだってあるのに。
げっもうレスがこんなに付いていたとは そんなくだらない事、箸の上げ下ろしを論うような事を 答えちゃってすみませんね
察するに、C++によるどうでもいいようなボトルネックよりも 数値計算それ自体のほうが桁違いに重くなる分野だと思うのですが。 OOPで作られた60Hzで動くソフトってだけならそこらへんにいくらでもある。例えばゲーム。 プレステやゲーセンのゲームは、PCよりはるかに貧弱なハードで動いてますよ。 とにかく、何も考えずに富豪的プログラミングしてみれば? 俺は、9対1以上で何の問題も起きないほうに賭けるね。 それで遅くて、プロファイル取っても駄目そうならまたゼロから書き直せばいいだろう。 その程度の体力もないやつは真のプログラマじゃない。
どうなっとるんじゃ
576 :
デフォルトの名無しさん :皇紀2665/04/01(金) 00:31:01 BE:63000645-###
エイプリルフールだけど意味不明♪
デバッグライトが正しいかどうかは、 どうやったらデバッグできるのでしょうか?
>>578 逆に問うぞ?
デバッグライトをデバッグしたとしてそれが正しいかどうかはどうやって調べるんだ?
>>579 デバッグライトをデバッグしたのをデバッグしてそれが正しいかどうかは(ry
素人がファミコンのドラクエT程度のRPGをC++で作るとしたら、 どれくらいの期間、勉強すればできますかね? 独学です。本丸ごと1冊覚えるぐらい?もっとかな?
テスト 日付かわっ録るかな
>>583 素人でもセンスがあるならマニュアルだけで作れる。
センスがないなら本1冊では何も作れない。
根気もあればネットで調べて作れる
>>585 なるほど。わかんないようで、わかりやすいっす。
では、その「センス」が一般人並み、平均的なもの。だとどうでしょう・・
間をとって、本1冊ってとこですか?w
>>586 まじっすか。ネットで調べて作れるぐらい簡単って、とらえていい?
それとも、死ぬほどネットで調べ続けなきゃ無理。かな?
>>583 勉強しながらの簡単な流れだ。
できるかできないかは、やってみてから考えろ。
〜プログラム〜
※やる気があればできるだろ。
1.簡単な絵を表示してみる。
2.マップを表示してみる。
3.キー入力してみる。
4.スクロールしてみる。
5.イベントを処理してみる。
6.戦闘をしてみる。
7.音を鳴らしてみる。
8.バランス調整をしてみる。
〜素材〜
※どうがんばっても、上手い人にはかなわないので妥協も必要。誰かに頼むとかね
1.キャラパターン作成
2.マップチップ作成
3.マップ作成
4.アイテム作成
5.モンス作成
6.イベント作成
7.SE、BGM作成
> では、その「センス」が一般人並み、平均的なもの。だとどうでしょう・・ こんな質問をするような人間に(ry
そんなキミはRPGツクー(ry
>>587 四の五の言う前にやれ。
その上で本が必要だと思ったら読め。
それでも解らなかったら聞け。
その時は優しく答えてやる。
取り合えず学習書の代金だけで1万超えると思うよ そんで学習期間が半年から1年 AMAZONとかの売れ行き順見れば良書が手に入るからそれで
595 :
583 :皇紀2665/04/01(金) 15:37:34
>>595 俺も
>>586 にどっちかっていうと賛成。
入門書は買って読んだらいいと思うけど、
一通りわかってきたらリファレンス系の書籍はあんまり必要無い。
っていうか書籍めくるよりぐぐる方がよっぽど楽。
機能からの逆引きもできるし、例も豊富。
俺等ごときがつまづくようなことはたいてい既に誰かが経験してる。
ネットが便利なのは確かだが、書籍を否定するのもいかがなものか ネットは常に使えるとは限らないからな
ネットは堂々と嘘書いてることがあるから気を抜けない まあ書籍も嘘書いてたりするが、ちゃんと本を選べば大体大丈夫だしな
599 :
デフォルトの名無しさん :皇紀2665/04/01(金) 17:11:29
デバッグしたデバッグライトをデバッグして、 そのデバッグしたデバッグライトをデバッグして、 また、そのデバッグしたデバッグライトをデバッグして、 また、そのデバッグしたデバッグライトをデバッグして、 また、そのデバッグしたデバッグライトをデバッグして、 また、そのデバッグしたデバッグライトをデバッグして、、、 ってきりが無いのですが、どうしたらいいでしょうか?
思い切ってあきらめる
国松様のお通りだい!みたいだなw
すごい!同時刻だ!はじめてみた
最近だと、JTのCMのパターンか?
さすが、皇紀のなせる業?
>>599 最初のデバッグライトを信用すれば良い
簡単なことだ
ちょっと前だと、角田信明が、徹子の部屋と、 似たようなNHKのトーク番組の両方に出ていたやつかな。
俺のことか
割り込みか。
'05/04/01(金) 21:29:22' はint型に変換できませんとエラーが出るんですが。
そもそもint 2chなんて宣言ができないことについて
だからC/C++じゃなくてアセンブラなんだよ。 DOSのシステムコールのint 2Chが時刻取得だってネタ。
Chになってねーじゃn
>>611 そのアセンブラで Shift-JIS の '=' がコメントならば完璧。
ファイル名の付け方で、userManager.cpp か、UserManager.cpp か、usermanager.cppのどれがいいか迷っています。 どなたか、お勧めを教えて下さい。 あとメソッド名は、sendHoge()か、SendHoge()か、どっちがいいか教えて(´・ω・`)
>>614 俺はUserManager.cppとSendHoge()にしている。
ファイル名の方はプログラミング始める前からこうだった。
(どうせWindowsではファイル名の大文字小文字は見かけだけだけど)
SendHoge()はWin32APIに合わせて。
>>615 レスサンクスこ。やっぱりその形式がメジャーですかね!
C/C++だとSendHogeかsend_hogeがメジャーだな。sendHogeだとJavaくさい。
ファイル名は user_manager.cpp か usermanager.cpp, 関数は send_hoge() かなぁ。 標準ライブラリがそうなってるし。 キャメルノーテーションも結構だが、Java だけでやってほしい。ウザいし、読みずらいよ。
619 :
614 :int 2ch =5年,2005/04/02(土) 15:29:06
>>617 sendHogeはJavaくさいんですか、なるほど。
どこかのスレで、大文字で始まる名前はイクナイみたいなレスがあったのですが、
その人はJava使いだったのかな。
なんと言われようと、私はsendHoge()派だ。 Java? んな言語、書いたことも見たこともましては喰ったこともない。
>>618 たしかに、標準ライブラリに合わせる意味では send_hoge() の方が良いね。
命名規則が混在してるソースなんか読みたくない…。
> キャメルノーテーションも結構だが、Java だけでやってほしい。ウザいし、読みずらいよ。
キャメル・ノーテーションは Java 以外でも結構見掛けるよ。読みずらいのには同意。
でも飲んだことはある。
ハンガリアン最強伝説
しかし今回はファイル名と関数名。 関数名にハンガリアンを付けられないわけじゃないけどさ。
ファイル名:すべて小文字 クラス名:大文字から メンバ:小文字から
ファイル名:UNIX/Linuxでもなけりゃ個人の嗜好の問題 クラス名:使う人間が理解できない、分かりづらいなんてことが無ければ個人の嗜好の問題 メンバ名:同上
なぜ下のようなコードを書くと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);
628 :
627 :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; }
>>627 読んでないが、問題のcinより前のcinで改行コードを読み捨ててないのが原因だろう。
1行単位で読むようにするか、改行コードを読み捨てるのがいい。
>>629 改行コードを読み捨てるのはどのようにすればいいのでしょうか?
改行コードを読んでから、何もしないで次の処理に進めばいい。
>>628 そこwhileでループしなくてもstd::getline(cin, text);で済む。
>>627 こういうときはflush使うんじゃなかったっけ?
>>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()が始まると思うのですが、なぜでしょうか? なにとぞ知恵をお貸しください。
俺んとこ、VC++でやってみたがEnter...表示されるぞ?
早くも頓挫したー! ソフトの設定かなぁ?
printf(〜 のあとに fflush(stdout);
うおおおおおお!できた! ありがとう! 早速fflush(stdout);をググるとしよう。
Cって規格じゃscanf等の前にstdoutをflushするようになってないの?
641 :
デフォルトの名無しさん :2005/04/03(日) 20:43:13
慣れてきたらscanfは使わないようにしよう、な!
えッ! scanfって使っちゃまずいの? scanf使っちゃいけないとなると、 俺の使える関数が、3/4ぐらいになるとです・・・
理解した上で使ってれば問題ないけど fgetsを使った方が無難
>>642 学校の宿題くらいでなら使ってもいいんじゃないか?
>>642 4つが3つか。
大丈夫、代わりにfgets()とsscanf()を覚えればいい。
>>640 そんな阿呆な仕様があるかい。
たまたまstdoutをバッファリングしない糞環境があるだけだ。
646 :
デフォルトの名無しさん :2005/04/03(日) 21:01:46
Windows最凶
工作員乙
648 :
デフォルトの名無しさん :2005/04/03(日) 22:46:39
プロセスを数秒間止まらせたい場合はどのように書けばよろしいのでしょうか
Sleep
650 :
デフォルトの名無しさん :2005/04/03(日) 22:52:03
>>649 すみません、それはWinAPI依存ですか?
プロセスって時点で環境依存だと思うぞ… ACEやboost::thread等を使えば移植性が少しは出来るけど
652 :
デフォルトの名無しさん :2005/04/03(日) 23:12:58
そうなんですか、すみません。 Perlで言うsleepをしたかったんです。 これって環境依存なんですね。ありがとうございました。
windowsの漢字変換を呼び出す事ってC++で出来ますか?
>>653 「猫でも〜」の第280〜283章を参照
>>652 そもそもPerlのsleepと「プロセスのSleep」は考え方が違う
そういや Win32 の Sleep() は呼び出したスレッドしか止まらない。
>>656 SetPriorityClass(hprocess, REALTIME_PRIORITY_CLASS);
を呼び出してから中でごにょごにょすると、他のプロセス(システムまで)が
止まるぞ^^;
それは過負荷というんじゃないか…?
REALTIME_PRIORITY_CLASSで無限ループすれば、これより低いスレッドは一切実行機会が回ってこない。
だからそれは暴s(ry
たしかにスリープしてることにゃ代わりはないけど
>661 スリープではなく金縛り
パソ暦6年主にネットサーフィン 仕様OS XP SP2 プログラム経験 大学の授業でCをさわりだけやる。 mule test.c gcc test.c a.out こういう風になんか教えられました。 目標 MonaOSでなにやってるか分かるレベルになりたいです。 それで、まずうちのPCにどういうソフトを入れて環境を整えればいいですか?
>>663 リヌクス gcc emacs プログラミング
>>663 コンピュータサイエンス入門を読む。計算機プログラムの構造と解釈を読む。SchemeとHaskellを覚える。Cコンパイラを作ってみる。
>>664 はい、たしかに大学のパソコンはリナックスが入ってました。
PCはXPなのでmule test.cの部分はメモ帳でもいいかなと思ったんですが、
gcc test.cの部分はWindowsだとどうなるんでしょうか?
>>666 windowsは削除、もしくはパーティションを切り直してマルチブート、もしくは新しくHDDを買ってきてHDDをつなぎ変えてLinuxとWindows両方使えるようにする。
WindowsでLinuxと同じ環境を作ろうとすると不便だからやめた方がいい。
どうしてもっていうならcygwinというものがあるが、これも使いにくい。
gccってのはコンパイルってことだったんですか。調べて少し賢くなりました。
コンパイラとは膨大にあり、Linuxに入ってたのがemacsってのですか。
>>667 さんのいうとうりLinuxの環境にするのがベストなんでしょうが、資金がないので
Windowsで動くもの、これもまたいっぱいるんですが、どれにしましょう?
とか考えてるうちにC++の勉強の前にやることが多いなあと感じてきました。
これも勉強ですか?
誰かお前には無理だって言ってやれよ
用意する環境なんて何を作りたいのかでころころ変わる
とりあえずgccにはWindows版もあることだけは書いておこう。
>>668 マルチブートでLinux環境を作るのは無料で全てできる。
>>668 自分で環境をそろえることは、ノートや鉛筆を買いそろえるのと同じ事。
初めから用意してあるのだったら(学校)問題ないが、家にはないんでしょ。
そんなことくらい自分で出来なきゃ、プログラミングなんか無理、
>>668 GCCはコンパイラ。コンパイラとはコンパイルするソフトウェア。
コンパイルとは抽象的なコードから具象的なコードに変換すること。
たとえば、C言語のコードから機械語に変換すること。
WindowsでCによるプログラミングがしたいのならVisualC++を買いなさい。
別にVisual C++ 2003 Tool Kit +SDKで十分じゃないかなぁ そろえるの面倒ならとりあえず、cygwin DOS画面に抵抗ないなら…だけど まぁ、学校がLinux環境つうなら、大して問題じゃないっしょ
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; }
その関数を窓から投げ捨てる
682 :
680 :2005/04/05(火) 02:10:44
やっぱ呼び出した関数先で文字列の長さを変更しても、stringオブジェクトのサイズ等の メンバは更新されてない。うひー、使い方わかんねー。 void main() { string str("japan"); str.reserve(255); strcpy(&str[0], "01234567890"); cout << str << endl; }
>>680 まず最初に。
string( basic_string )はSTLではない。
つぎに、&str[0]は激しく良くない。
constなポインタを取得するならbasic_string::c_str()があるが、
>>680 のtest()には渡せない。
そもそも、basic_stringの管理する文字列をポインタ操作で
書き換えようとするのが激しく良くない。
>>682 だから、basic_stringを書き換えたいならbasic_stringのメソッド使えって。
strcpyなんぞ使うなボケ。
685 :
680 :2005/04/05(火) 02:26:00
よくないというのは激しくわかるのですが、Win32APIを交えながら利用するとどうしても char*を引数にとる場面が多々あるので。関数先で何を呼ばれるかは手を出しようがないです。 自作クラス作るかー。
687 :
680 :2005/04/05(火) 02:32:00
やっぱMFCかー('A`)
string str; size_t length = 0; SomeApi(0,&length); vector<char> tmp(length); SomeApi(&tmp[0], &length); str.assign(&tmp[0], length); 大体こんな感じ。
>>683 > string( basic_string )はSTLではない。
初心者スレで得意げにいいかげんなこといってんじゃねーよ。
string( basic_string )はSTLではない。フッ
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するものだと思っていたのですが、 初めて見る書き方です。どういう事なのか教えて下さい。お願いします。
>>691 STLに何が含まれて何が含まれないのかがわかる情報元ってあるの?
>>693 いまでも"HP STL"あたりで検索すればまだ拡張子に.hとかついてる時代のSTLが見つかる。
>>692 実際のChogeの定義をCfooよりも後でする場合にそんなカンジにする。
クラスの相互参照がある場合等に使う。
因みにCfooの中ではChogeの実体をもつことは出来ない。参照のみ。
(少し考えれば当たり前なことだが。)
>>692 関数を宣言するのに、その関数が使うクラスの定義は無用。
class Hoge; class Fuga { Hoge getHoge(); // 合法 void putHoge(Hoge h); // 合法 Hoge* a; // 合法 Hoge b; // 違法 }
>>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抜きでも使える。
CStringとAnsiStringではどちらのほうが使いやすいですか?
使い易さなど問題ではない!!! MSかそうでないかの違いが重要なのだ!!!!!
そうそう、MSじゃなきゃ素直にstd::string使ってる。
704 :
デフォルトの名無しさん :2005/04/06(水) 16:45:18
BCC5.1で、ビットマップファイルをexeファイル内に埋め込んで使用する方法を教えて下さい
706 :
704 :2005/04/06(水) 16:53:05
>>705 すみません、全く何の事か解りません。
ググり方が悪いのか参考になるページも中々見つかりません・・
リソーススクリプトでぐぐれ
708 :
704 :2005/04/06(水) 17:10:31
// 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++をサポートしてないなんて言う落ち?
デースケドガー(゚∀゚)
std::cout
#pragma onceなんて美しくないと思った春の夕暮れ
#defineのほうが
717 :
デフォルトの名無しさん :2005/04/07(木) 13:19:57
おしえてください。 オーバーライドってどういう意味ですか?
具具って分かることを聞くな 「オーバーライド」 「オーバーロード」 でぐぐれ
721 :
デフォルトの名無しさん :2005/04/07(木) 13:28:02
>>719 ありがとうございます。
ところで、このオーバーライドした関数にVirtualをつけて仮想関数にすると何かかわるんですか?
質問です。環境は 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 という文字列を探すのに手間取るおそれがあります。 こういった場合、普通はどのように実装するのでしょうか。
データサイズ読んで fseek() すれば良いじゃないか。
>>722 ファイル名とサイズの一覧をファイル先頭にまとめておく
要はヘッダを作る
725 :
722 :2005/04/07(木) 13:40:06
age てなかった……。 ぐぐろうと思っても、検索ワードすら思いつかない状況です。 ポイントとなる単語、もしくは詳しい書籍、既に実装済みのライブラリ、 などでも結構ですのでよろしくお願いします。
726 :
722 :2005/04/07(木) 13:40:47
>>724 あ、全くですね
その方針で進めてみます。ありがとうございます。
>>721 変化はあるが、とりあえず君が気にする必要はない。
つーかそれ、まんまアーカイバの実装なんだが。 或いは、mngにするという手もあるのでは?
>>722 適当な画像処理ソフトでその三つを横に連結。
libpngで画像の一部を切り取ることは出来るよな。
画像の高さが違うなら無駄はできるがpngならたいして問題にならんだろ。
730 :
デフォルトの名無しさん :2005/04/07(木) 17:00:23
XP、c++ builder4.0なんですけど fwriteで構造体を書き込もうとすると char a = 0x0A の部分が、書き終わったファイルの中を見ると 0x0D 0x0A(\n)に書き換わっててビットがずれてしまいます。 なにが原因なんでしょ?
Winの改行コードは0x0D0Aだからな
733 :
デフォルトの名無しさん :2005/04/07(木) 18:04:28
C++でstringクラスを使用したいのですが、どのような例外処理をするべきでしょうか? どんな例外が送られてくるか教えてほしいです。
初心者歓迎とは名ばかりのスレへようこそ!
>>734 stringってSTLのマニュアルに載ってたんですね;知りませんでした;;
失礼しました。
回答者が初心者だからw
739 :
733 :2005/04/07(木) 18:36:56
やっぱり分からないんですけど・・・; それとも例外発生しないのでしょうか?
>>739 とりあえずstd::exceptionをcatchするようにすればいい。
これで標準ライブラリからは何を投げられても全部捕まえられる。
741 :
733 :2005/04/07(木) 19:02:05
>>740 ありがとうございます!
std::exceptionって聞き覚えあるなぁとおもって調べてみたらstd::bad_allocから継承してるクラスですね。
もしかしてcatchって継承クラスが投げられても基本クラスとしても捕まえられるのかな?
だとしたらものすごく勉強になりました!
ほんと感謝です!
もうあれだ catch (...) { std::cout << "ぬるぽ"; }
fseek(fp, 0L, 0); 2番目の引数はlongらしいんですが0LのLってなんですか?
0 -> int 0L -> long 0UL -> unsigned long ぬるぽ
>>741 参照で捕まえないと、スライシングされるだけ
ガッ
>>740 MFCと一緒に使うと、CMemoryExceptionが飛んできたりする。
スレ違いだが。
>744 じゃあ5Lだとlongで5バイト 実質20バイトってことですか?
低脳の思考回路は理解出来ん
>>747 Lはlong型の値だと言う事を表す接尾辞。
Uはungined型の 〃
short が 2byte, long が 4byte ってのは規格で決まってるの?
shortが2バイト、longが4バイトは決まり intは環境依存
(ry)えくせぷしょん
>>751 longが8byteの処理系もある。
そもそもshortとintは-32767〜32767、longは-2147483647〜2147483647の範囲以上の整数を表せれば良いことになっている。
つまり1byte == 16bitの環境ではshortが1byteでも全然問題ない。
1byteが16bit・・・
規格上は、long>=int>=shortしか保証されてなかったような。
そんな環境聞いたことないわい
bccって環境変数:Includeで設定したフォルダって読みますか?
読まない。 けれどbcc32.cfgをいじればそういう風にも出来る。
>>759 PC-FXGAのビデオメモリは1byte12bitだった希ガス。
>>759 DSPとかで、short==16bit、int==32bit、long==40bitというのがあったりする。
俺今までbyteはbitの上位単位とだけ思っていたよ。
まぁ1オクテットといっておけば間違いない
short==16bit、int==32bit、long==32bitがスタンダード
>>766 どこのスタンダードだ?全くもってくだらん
くだらん
x86だろ
IA-32だろ
770 :
734 :2005/04/08(金) 00:13:20
リンクエラーが出ます。 Undefined "プログラム中に全く存在しない文字列" っていうメッセージ付きで。 コメントアウトしまくって調べたら define PI 3.14...結構長い float x; while(x>PI) x-=2.0; この(x>PI)のところで変なことになっているみたいです。 while(1.0f) x-=2.0; としたらリンクエラーがなくなりましたので。 何が原因か分かる方、いらっしゃいませんか? 宜しくお願いします。
#define じゃないの? x の宣言は大丈夫なの? while (1.0f) とかバカじゃないの?
773 :
771 :2005/04/08(金) 01:27:47
そうそう#defineです。 ちなみに#defineは他のhファイルに書かれています。 while(1.0f)はどこのせいでエラーが出ているのか特定するために書き変えてみただけで。。。
そのfloat xは、後でちゃんと初期化してるの? 他のヘッダファイルはちゃんとインクルードされてるの? 試しに同じファイル内でPIを定義してみたの?
xもPIもwhile(x>PI)も同じ関数中に何度も出てきており、 if(x>PI)は残しておいても大丈夫、 while(x>PI)は全滅、という状況です。 PIを3.14...(長い)におきかえて while(x>3.14...(長い))が大丈夫のところもあれば、 while(x>3.14...(長い))でもリンクエラー出すところもあり、 わけがわからない状態です。
「Undefined "プログラム中に全く存在しない文字列"」って具体的に何?
空白スペースが入ってましたってオチじゃないよね?
空白スペースじゃないや。全角スペース。
LinuxでgccではOKだったものを Windowsの統合開発環境に持ってきたものです。 while(x>PI)を全てコメントアウトすれば動くことは動きます。 単純ミスではないと思っておりますが。。。 「Undefined "プログラム中に全く存在しない文字列"」 "_dbxxx"とか出ていた気がします。今家なんでわかんないです。 ("_dbエクスエクスエクス"と表示されていたわけではないです) while(x>PI)は全部で4箇所あるんですが、リンクエラーが4個でており、 xxxの部分はそれぞれ違っておりました、確か。。。
途中で#undefされてたりしてな
>>771 > Undefined "プログラム中に全く存在しない文字列"
そんなエラーメッセージ見たことないぞ。嘘をついているのか超マニアックなコンパイラを使ってるのかどっちなんですか
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)
そうだよ
>>779 Windowsの統合開発環境が何か判らないのだけど、
改行コードを変えたらどうなる?
#あ、関係ない気がしてきた。
ソース晒す方が早い悪寒。
>>783 ちがうよ。 sizeof は演算子だよ。
仕事場から。 リンクエラー: 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. これ以上は出せないっす。 考えて下さったみなさんありがとう。 今日はもう書き込めません。
>>787 後ろについてる ge,gt,le,lt は、それぞれ
greater than or equal to, greater than, less than or equal to, less than の略だろう。
そのコンパイラは浮動小数点数の比較に独自のライブラリ関数を使うみたいだな。
リンクオプションが怪しい、ぐらいしか言えんな。
マイナーなコンパイラなら、コンパイラベンダに問い合わせるのもいいだろう。
解決しました。 ありがとうございました。 double演算不可でfloatと明示してやらないとダメだったというものでした。
>>771 浮動小数点数を直接比較することがそもそもの間違い。
791 :
デフォルトの名無しさん :2005/04/08(金) 12:38:55
既に存在するクラス(標準ライブラリに含まれているようなもの)に、メンバ関数を追加する事ってできますか? つまりhogeという自作クラスを作ったとします hoge hage; で、そのインスタンスがhageで、 ostreamに、operator << (hage)という関数を追加して、下のように書きたいんですけど、不可能でしょうか ↓ cout << hage;
>>791 元のクラスを書き換えずにメンバを追加ってのは無理。
そういうのは、非メンバ関数
ostream& operator<<(ostream& dst, const hoge& src)
{
// 好きなように
return dst;
}
を書く。
>>792 やっぱダメなのか…。了解しました
サンクル
>>793 それとも禁断のnamespace stdに追加するとか。
標準では禁止しているけどね。
別に困るとかそういう意味で質問したのではないと思う。 好奇心では
VARIANT型からの配列の取り出し方がよくわからない件について
>>798 質問するつもりなら、もっと具体的に書かないと誰も回答できんよ。
ってかVARIANT型ってことは、該当する開発環境のスレに逝った方が
良かろう。
>>799 解らないなら解らないって言えばいいのにw
>>801 VBならVariantって書くだろ。
typedef struct FARSTRUCT tagVARIANT VARIANT;
のことじゃねぇの?
どっちみち漏れはしらね。
まぁ、確かにVARIANT型から配列を取り出すだけってんなら 開発環境云々は関係ないとおもわれ、、、 あ、漏れも知らんよ
>>798 VARIANTのメンバvtにVT_ARRAYが含まれているか確認する。
さらにVT_BYREFも含まれていればpparrayから、そうでなければparrayの値を取り出す。
それをSafeArrayAccessData()に渡せば配列の先頭へのポインタが得られるから、
後はvtのメンバから型を識別して、配列の中身を読み取る。
終わったらSafeArrayUnaccessData()を呼ぶ必要がある。
場合によっては使い終わった後、さらにSafeArrayDestroy()を呼ぶ必要があるかもしれない。
関数で文字列の定数を返した場合、戻った先でその文字列は有効なのでしょうか? スタックに割り当てたchar配列を返すとまずいのでしょうが、定数の場合は? const char* get_error_message() { return "nullpo"; } void main() { const char* msg = get_error_message(); printf(msg); }
>>806 ローカル変数への参照は戻してはいけない
定数・static変数はOK
>>807 さんきゅーです。
定数は大丈夫か。ちと安心した。
ちなみにこういう場合は関数ローカルの扱いなのですか? const char* get_error_message() { const char* msg = "nullpo"; return msg; }
>>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のみ)を省きたいんだけど、 どうすればよいのでしょうか?? 教えてくだされ。
>>810 auto変数の扱いになってスタック領域にメモリ確保されるからですよね。
文字列定数は別なメモリ領域に割り当てられているのかな?ちと調べちう。
>>812 データ領域に割り当てられる
内容の変更やdeleteは未定義だけど、ポインタを返す分には問題ない
分かったー(゚∀゚) 文字列定数は呼び出し専用の静的メモリに入ってるから、809みたいにその領域のアドレスを 返しても問題ないっていうことかー。 >文字列リテラルはstaticが暗黙の内についていて、必ず静的記憶領域に確保されます。 >だから、たとえ関数中で使われても、文字列リテラルの実体は静的記憶領域に確保されます。
>>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';
でいいだろ
そもそも第二引数の '\n'って何よ? 池沼?
820 :
デフォルトの名無しさん :2005/04/08(金) 22:04:53
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(); たつけて。。
まず各処理が期待通りの動きをしてるか確認するところから始めようか。
string使え
getlineしたら最後の改行消えるんじゃないの? if (strlen(buf)) { ............ } にしてみたら?
>>823 難しく考えすぎ
std::string buf;
while ( std::getline( fin, buf ) )
{
if ( !buf.empty() )
//なんかする
}
829 :
デフォルトの名無しさん :2005/04/08(金) 22:59:33
830 :
デフォルトの名無しさん :2005/04/08(金) 23:01:21
あ、途中で char buffer = char bufferで変換すればいい?
>>829 なぜchar*にしたい?
必要な時だけc_strで変換するんじゃだめなの?
832 :
デフォルトの名無しさん :2005/04/08(金) 23:10:31
char*を引数とする関数にわたしたいので。 function(buffer) って感じです。うーむ。
だからその時だけc_strでconst char*を取り出せばいいんじゃないの?
834 :
デフォルトの名無しさん :2005/04/08(金) 23:14:17
constを消せればクリアのようです! error: invalid conversion from `const char*' to `char*'
>>834 その関数ではバッファの内容を変更するのか?
836 :
デフォルトの名無しさん :2005/04/08(金) 23:17:24
いえ、変更しないんですが、この関数を使わなくてはならないので。
変更しないなら、関数を function(char*) から function(const char*) にすればいい
838 :
デフォルトの名無しさん :2005/04/08(金) 23:18:25
function ((char*)buffer.c_str()); でできやしたあぁぁぁx! ありがとうございましたm(_霊_)m
>>838 char*にキャストすな
なんでわざわざconst char*を返すのかを考えてみれ
840 :
デフォルトの名無しさん :2005/04/08(金) 23:20:58
>>837 その関数に変更を加えると他にも膨大な変更が必要になってしまうことにはならないですかね?
841 :
デフォルトの名無しさん :2005/04/08(金) 23:22:25
ちなみに、その関数はCで書かれたものなんです。OTL そんでもって僕はC++をつかおうとしているんで。
>>840 char*からconst char*への暗黙の変換は自動的にやってくれるから
char*を渡している部分を変更する必要はない
functionが与えられたバッファを変更しないことが条件だけど
843 :
デフォルトの名無しさん :2005/04/08(金) 23:26:42
>>842 つまり、その関数の引数を修正して、コンパイルしなおして、ライブラリにするのが正しい解決方法ということなんですね?
>>843 どうしても再コンパイルしたくなければ、必要な時にcharバッファを作って
そこにstring.c_str()からcopyして、そのバッファを渡すとか
>>844 ぼくにとってそれが一番やさしそうです。やってみます。ありがとうございました。
>>838 それは激しく良くない
char*でも
>>828 と同じだよ。
char* buf[256];
while ( fin.getline( buf, 256 ) )
{
if ( strlen(buf) )
//なんかする
}
↑あいや ×char* buf[256]; ○char buf[256];
/*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です。
>>836 そんなときは const_cast と書いた上で、
関数がポインタの指す先を変更しないという根拠をコメントで書き添えると良い。
>>848 その関数をDLLに入れてエクスポートする。
全然わからんのなら「DLL 作成」でぐぐってくれ。
>>818 日本語で書いてるんだから型も糞もない。
自分で適当に推論してね。
#defineっていうのは、関数内で定義したらどういう働きになりますか? 出来れば関数が終了したら破棄されるようにしたいです
>>852 #defineはそれを書いた行の次からソースコードの終わりまで有効。
プリプロセッサはC/C++のブロックなどとは全くの無関係に働く。
const使え。
#undefすりゃいいじゃん
#define unko 10 int hoge(void) { return (unko); } #undef unko ただ、他の場所で同じ宣言があるとそれも消えちまうんだよな
他の場所で同じ宣言があったらそもそも二重定義だってエラー吐かないか?
マクロの二重定義は警告じゃなかったっけ?
内容が同じなら全然問題ない。 違えばエラーだったと思う。
859 :
デフォルトの名無しさん :2005/04/09(土) 10:43:58
現在CからC++に移行中なのですが、defineはすべてconstに置き換えてしまってよいのでしょうか?
>>859 もちろん必要に応じてだ。面倒ならそのまま放置しても構わんよ。
置き換えるなら、定数ならconstで変数宣言した方が良いだろうし、
マクロならinline関数に置き換えろ。
使い分けた方が良いよ 最初から最後まで絶対に破棄しない定数なら #defineの方が直感的に分かり易い
>>848 よけいなお世話だろうが一応つっこんどく
_ で始まる識別子は処理系で予約されてる
動作が未定義になるぞ
DLL の作り方は…
>>850 が答えてるな
_ で始まるといってもその数が問題だがな アンダーバー3つなら問題無い
俺ルールですか?
>>861 随分アナクロな考え方のようですね。そんな直感捨てた方がいいと思いますよ。
>>859 私は文字列定数の場合はconst char * を返すインライン関数にするかな。
マクロはテンプレート関数にするのもいいだろうね。
俺は文字列定数もインライン関数にはせず、const char *const HOGE = "HOGE";にしている。
あほばっかり
マジレスすると、>861>864>867>868
873 :
デフォルトの名無しさん :2005/04/09(土) 13:04:24
マジレスなんて求めてないんで、そこんとこ宜しく。
ここはネタスレではないのでマジレスオンリーです。
俺も>861>864>867>868 はアホだと思う あと 864=870=872 だと思う
何故アホなのか、解説希望。
877 :
デフォルトの名無しさん :2005/04/09(土) 13:47:07
アホって言う方がアホ
>>861 は俺もアホだと思う。
理由?
それはdefineで定義されたものがコンパイル時にマジックナンバーになってしまうからだよ。
ソース上では名前が付いていても、defineはコンパイル前に行われる単なる置き換えに過ぎないからね。
レッテル貼り&同一人物断定キター
>>868 メンバにできないのが難点。
>861はEffectiveC++でも読んで来い。
constで定義するメリットは・・・ メモリの節約。defineは所詮コードの置換。変数の実態は複数になるからな。 重複定義の防止。コンパイラやリンカがエラーにしてくれるからな。 defineでは配列等の定義が困難。defineとconstと混在させるくらいなら、 constに統一した方が良かろうな。 それらを全部承知の上で「#defineまんせー」なら、 もはや何も言う事は無い。
882 :
デフォルトの名無しさん :2005/04/09(土) 15:01:00
>変数の実態は複数になるからな。 環境によるし、変数じゃなくて定数な。
constにしたらexternするのが面倒。 要するに宣言と定義を分けなきゃならない。 マクロならヘッダファイルに書いておけばOK。 constの方がよりよいとは思うけど、 どっちかに統一ってのは現実的でない。
884 :
デフォルトの名無しさん :2005/04/09(土) 15:14:46
ハァ?
ヒィ?
>>884 そんなことどうでもいい。Javaだったら気にしないだろ。そんなこと気にしてんなよ。
888(・∀・)ニヤニヤ
やーやーやー
完璧にネタスレだなここ。初心者が見たら混乱するぞ。
defineで配列等の定義が困難って何言ってんだ・・・
それじゃここで質問を。 #define のときはマクロ名を大文字にする習慣があるけど、 それを const にする場合も変数名を大文字でやった方がいいもんなの?
俺は大文字にしてるけど
int foo; const int Foo = 1; #define FOO 1
897 :
:2005/04/09(土) 16:25:30
古いソース見てたら unsigned group : 8; unsigned mark : 2; とか出てきたけど : 8 とかの意味がわかりません。 教えてください。
>>897 ビットフィールド(構造体にあらず)の一部だろう。
め こ コ | 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++; }
>>900 *fp++;ってなんだよw
そういうのはお前の脳内だけで勘弁な。
今、俺の脳内で某特攻野郎Aチームのテーマが・・
while((ch = fgetc(fp)!=EOF)){ alpha[ch-'a']++; } これでいけ
904 :
:2005/04/09(土) 20:32:43
905 :
デフォルトの名無しさん :2005/04/09(土) 21:04:37
void *ってインクリメントすると何バイト移動するの?
void*にポインタ演算はできん
908 :
デフォルトの名無しさん :2005/04/09(土) 21:35:47
909 :
デフォルトの名無しさん :2005/04/09(土) 23:47:19
VC++をつかってるんですが、今までGUIアプリを作るときは メインウィンドウは普通にWinAPIで手書きして、 機能のメニューなんかはVCのリソースエディタでダイアログで作って プロシジャでイベントを拾って…という感じでやってきたのですが、 スプリットバーがついてたりMDIだったり、もうすこし大規模でリッチな感じのアプリが作りたくなってきました。 普通だったらMFCでアプリケーションウィザードとか使うと思うのですが、 あれは(沢山ファイルができて「ここに何か書け」みたいなの)意味がわからないのでどうも好きになれません。 なので結局、手書きで作っていくしかなさそうなのですが、 GUIライブラリとかいうのを使えばAPI地下書きをするよりは少しはリッチなのが楽にできるんでしょうか? 今の所候補に上がってるのはWTLとwxWidgetsっていうやつなんですがお勧めなのがあったら(できれば理由も)教えてください。 アプリ全体をリソースエディタみたく部品をぺたぺた貼って作っていく方法ってのは無いんでしょうか?
910 :
デフォルトの名無しさん :2005/04/09(土) 23:48:47
911 :
909 :2005/04/09(土) 23:56:46
>>910 DirectX使いたいのでBuilderだとそのまま使えないらしく、
ヘタレなので余計なところで躓きたくないので、できれば避けたいです。。
912 :
デフォルトの名無しさん :2005/04/10(日) 00:03:12
tolower とか toupper とか isspace とかの関数の 引数は unsigned char へキャストして渡すのがいい と聞いたのですが、何故でしょうか? そのまま int に変換されては困ることがあるんでしょうか?
> 引数は unsigned char へキャストして渡すのがいい 聞いた事無いな
>>909 MFCやっとけ。
wxWidgetも、大差はないぞ。
結局、Document-Vew-DocTemplate 構成だし。
916 :
909 :2005/04/10(日) 00:19:28
>>912 BuilderはGUIアプリ作るのにいいって結構聞く気がしますが、
でもやっぱりBuilderも「ここに〜を書け」みたいなやつじゃないんでしょうか?
そういうのが何か気持ちわるくて。
そうするとやっぱり、ある程度APIをラッピングして簡略化してくれてるライブラリを使って
手書きって方が自分には向いてるのかも知れません。
処理は全部手書きで外観は全部エディタで作れるみたいなのがあったら一番いいのですが、
そんなのは無いんでしょうか。
>>913 isspace等が配列のテーブル参照をする実装では、
EOFが渡されたら逝ってしまわれます。
>>916 BCC form でダイアログリソース作ってそれ表示するか?
>>916 言ってることがおかしいぞ。
>スプリットバーがついてたりMDIだったり、もうすこし大規模でリッチな感じのアプリが作りたくなってきました。
これを最小限の労力で実現できるようにwizardがあるわけだが、
>あれは(沢山ファイルができて「ここに何か書け」みたいなの)意味がわからないのでどうも好きになれません。
>でもやっぱりBuilderも「ここに〜を書け」みたいなやつじゃないんでしょうか?
>そういうのが何か気持ちわるくて。
なんだよこれ。
気持ち悪かったら、MFCなり、VCLなりの構造を勉強しろよ。
書き込み見ていると、一番向いてるのはVBとしか思えない。
>>913 charで0x80がintにキャストすると0x00000080にならずに0xffffff80になるとか
そんなことか?
>>913 そんなキャストは不要。全く問題ない
>>917 >>920 が言っていることは見当違い
大文字小文字変換関数である tolower, toupper は
変換できない場合そのまま返す
よって EOF を渡したとしても無問題
文字種分類関数である isspace に EOF を渡しても 0 が返るだけ
無問題
もし問題が起きるようなら処理系が逝かれてる
結局どっちよ?
キャストは無意味で不要。 intへの変換は問題ない。
実装依存の話だな。 規格では問題が起きる「可能性はある」が、まずそんなことはないだろう。
>>921 少なくとも C99 では、unsigned char で表現できない
値を渡した場合の動作は未定義 (但し、EOF を除く)。
928 :
909 :2005/04/10(日) 01:14:52
>>919 もちろんそれが一番楽なんだと思うんですが(慣れた人なら)
自分は気持ちが悪いんで、ウィザード使うより手間でもWINAPIじか書きよりはマシなら
なにかしらのGUIツール(ライブラリ)を使うことも考えています。
なおかつ、リソースエディタみたいな操作でアプリのウィンドウ全体をデザインできて、
勝手にソースとか生成しない感じのものがあれば理想なので何かそういうのは無いのでしょうか?
ということなんですが。
生成されたソースの上に自分でコードを書くウィザードみたいなものじゃなくて、
VCのリソースエディタのように.hと.rcなどを別個分離して作ってくれるような。
もちろんC++で。何かおかしいでしょうか?
929 :
909 :2005/04/10(日) 01:17:07
補足します。 >もちろんそれが一番楽なんだと思うんですが(慣れた人なら) ウィザードを使うのが、ってことです。 すいません。
そのままVCのリソースエディタ使ってればいいんじゃねーの?
931 :
909 :2005/04/10(日) 01:39:17
あれってあくまでダイアログ作る奴ですよね。
>>927 未定義になるよりはキャストした方がいいってことか?
933 :
デフォルトの名無しさん :2005/04/10(日) 01:59:26
>>909 MSもCもBorlandのCもだめなら、Windowsでのプログラムはあきらめた方がいい。
934 :
909 :2005/04/10(日) 02:03:06
何か質問すら読んでないでレスされるの困るんですけど。
>>931 そのダイアログをメインウィンドウのクライアントに貼り付ければいいじゃない。
>>928 そんな、気持ちの悪いやり方で作られたコードなど保守しづらいし、再利用性も悪い。
わるいこといわんから、標準に従っておけ。
937 :
デフォルトの名無しさん :2005/04/10(日) 02:57:01
教えてください。 CMapのコピーってどうやってやるんですか? CArray::Copy と同じようにしたいのですが。
ヘッダファイルで、 #pragma once #ifndef HOGE_H #define HOGE_H ... #endif と、pragma と ifdef の両方でインクルードガード してるのを良く見るのですが、何故でしょうか? pragma の方がコンパイラに優しいからとかでしょうか?
>>909 ぶっちゃけオマエさんの言い分は進歩しないヤツの典型
別の方法でできもしないのにあっちは気持ち悪いからと言って毛嫌いしてちゃ
何もできるようにはならんよ
無ければ自分で作るな世界で無いものねだりしてもどうにもならん
>>939 別にコンパイラにやさしいとか関係無いぞ
どっちも同じプリプロセッサだからよ
#pragma onceより#ifndef〜#define〜#enifの方が汎用性高いだけ
>>940 それなら#ifndef...だけ書いた方が短くていいと
思うのですが、何故両方とも書かれるのでしょうか…?
滑り止めのようなもの…?
さぁてね、俺は詳しい理由は知らんが まぁキミの言うように#ifndef〜だけでやってる本もあるし #pragma onceと#ifndefの併用は、MSVCなんかはデフォルトで吐くコードだけどね たとえば、一回読み込んだ後で、他所で#undefされて、 それで#ifndefが無効になっても#pragma onceで防げるって寸法なんじゃないかね 環境依存だけど
さぁてね
>>941 pragma onceの方がコンパイラにやさしいから。
ifndefはそのヘッダを全てパースしなければならないが、
pragma onceはヘッダを一度しか読み込むな、という、
コンパイラへの明確な命令なので、それを省くことが出来る。