【初心者歓迎】C/C++室 Ver.24【環境依存OK】
2 :
デフォルトの名無しさん :2005/12/29(木) 12:56:09
4 :
デフォルトの名無しさん :2005/12/29(木) 13:58:30
どこでメモリリークしてるか検知したいときってどうする?
6 :
5 :2005/12/29(木) 14:00:52
誤爆スマソ
7 :
6 :2005/12/29(木) 14:01:42
誤爆スマソ
>>4 そんな便利なものあるなら知りたい。
根性で探すしかないよ
無いわけではない。
>>4 (仕事などでそれが使えるなら)メモリリークを検出するツールを使う。
そうでないならメモリリークを起こしそうなところのコードを読み直すか、
メモリリークの状況を再現できるように維持しつつコードを削って絞り込むか、
アクセス回数を記録できるmalloc()/free()などのダミールーチンで追い込む。
要は根性
_CrtSetDbgFlag
ツールはあっても結局最後は根性。 人間にしかリークと判定できないケースもままあるしね
根性って・・・
ツールでリーク全部取れると思ってるの?
void*xmalloc(size_t sz){ void*p = malloc(sz); FILE*fp = fopen("log.txt","a"); fprintf(fp,"new %p %p\n",(&sz)[-1],p); fclose(fp); return p; } void xfree(void*p){ FILE*fp=fopen("log.txt","a"); fprintf(fp,"delete %p\n",p); free(p); fclose(fp); } #define malloc xmalloc #define free xfree 自分はこんな感じに呼び出し元のアドレスと確保したアドレスのペアをログに吐き出して、 開放してないメモリの呼び出し元をmapファイルを元に探し出すことが多いかな。
単に開放し忘れなら簡単な部類。ツールでも上のやり方でも 見つけられる。厄介なのはそうじゃない場合。
環境すら書かない奴は放っておく
バイナリで提供された他人の作ったライブラリがリークってたり。
環境云々ではなくリークの一般論でも話はできるな。
>>17 開放わすれでないやつって
確保領域外のアクセス とか 解放後のポインタをそのまま使ってたり とかの部類?
>>20 >>4 が何を望んでるかわからんだろ?
汎用的な物なのか、環境依存の物なのか。
あれもこれも網羅するのは無駄すぎ。
ひとつのネタなんだからいいんだよ。それで話を 膨らませて無駄話をするも一興
Win32なら #include <crtdbg.h> _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF); で、解決だな。 しかし、どうも配列の開放忘れが検出できてない希ガス。 char *unko = new char[1024]; delete unko;//←delete [] unko;とやらなければならないけどメモリリークにならない。 な。
>>21 それはまた話が違う。「解放後のポインタをそのまま使ってたり」
ってのは単に不正アクセス。
アプリとしては要らなくなったデータなのにリストにぶら下げっぱなしに
しているような場合を考えてみれば、機械的に不要かどうかは
判定が難しいでしょ?
26 :
21 :2005/12/29(木) 17:14:18
>>25 アプリ終了時に開放されることは確認できてるけど、
ある作業スパンで見た時に不要になったにも関わらず、開放されず浮遊してるやつ って認識でオケ?
判定も難しいし、ガベージコレクションの分野だねぇ (これはこれで色々ありそうだが…
>>26 そうそう。アプリ終了時に開放されても仕方がない。アプリが
動いてる時に不要なんだから。
プログラムからいつでも使える状態で忘れてしまっていると、
ガベコレの対象にも出来ない。だからJava使えばリーク問題と
無縁とか思ってるのも間違い。
一番厄介なリークはガベコレがあっても結局は人間がつぶす
しかないんよん。
>24 デストラクタがないオブジェクトは、要素の数を知る必要がないから deleteもdelete[]も実装が一緒でも不思議ではない。
質問です。 入力待ちしているscanfを終了させる方法ありますか? WIN32 int taskA(void) { char buf[1024]; scanf("%s",buf); // ←★ここで入力待ち // タスク終了時の処理 xxx(); } int main(void) { //スレッド生成 HANDLE h = ::CreateThread(,,taskA,,,); //何かの条件が発生したらスレッド終了 // ★ここで何か処理を入れて、scanfから戻したい ::WaitForSingleObject(h,60*1000); ::CloseHandle(h); }
ターミネート
WriteConsoleInput で何とかできないかな?
(´ー`)おれにまかせろ
34 :
デフォルトの名無しさん :2005/12/31(土) 10:43:33
mingwでコンパイルする時 Cファイルに関数を宣言してるだけでHファイルで宣言してないのに 他Cファイルからその関数を呼び出せてしまいます ローカル関数として使いたいのですが…どうしたらよいでしょうか?
36 :
34 :2005/12/31(土) 10:50:00
>>35 解決しました・・こんな簡単だとは
ありがとうございます
で static の使い方を勘違いしたまま大人になるんだな
別に、使い方合ってると思うが?
39 :
デフォルトの名無しさん :2005/12/31(土) 17:19:02
質問です。XP、.NET です。 CreateWindow にてウィンドウを作成したのですが、 ウィンドウのキャプション部分?(メニューではなく、Windows デフォルトで、ウィンドウタイトルなどが表示される青い部分)が反応しません。 つまり、キャプションを D&D してもウィンドウが動かず、[×] ボタンをクリックしてもボタンがへこむ様子もありません。 (つまり、全く反応がありません。) 考えられる原因はないでしょうか。 ツールバーから「閉じる」を選んだり、Alt+F4 での処理は受け付けれています。 また、[×] をクリックしたとき、WM_LBUTTONCLICK は飛んできているようです。 原因に見等が全くつかないので、どこの部分のソースをさらせばいいのかも分かりませんが、 とりあえずウィンドウの構築部分だけでも示しておきます。 蛇足かもしれませんが、ウィンドウ自体をクラス化しており、 ウィンドウプロシージャはそのクラスの static なメンバ関数です。 このクラスを継承したクラスにてウィンドウを作成したりしているので、 メッセージの処理がうまくいっていない可能性もあります。 よろしくお願いします。 (続く)
40 :
39 :2005/12/31(土) 17:19:37
// ウィンドウクラスの設定 WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)HogeProcPre wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = GetInstance(); // インスタンスを取得するグローバル関数 wc.hIcon = NULL; wc.hIconSm = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = NULL; wc.lpszClassName = "hogewindow"; if (!RegisterClassEx(&wc)) return false; // ウィンドウの構築 hWnd = CreateWindow(wc.lpszClassName, "Hoge Window", WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, GetInstance(), this); if (hWnd == NULL) return false; return true;
43 :
デフォルトの名無しさん :2006/01/01(日) 18:35:09
gccでグローバル変数が初期化されないんですけど…なんででしょうか?
状況分からなさ杉。 どうせ別の変数で初期化しようとして、 変数の初期化順が不定なもんだから 変になってるだけだとは思うが。
グローバルが初期化されない状況って言うと、 組み込み系か? ならそういうケースもあるよ。
>>44 すいません、今度から関連するコードは出します。。
>>45 ズバリ組み込みです。有り得るケースなのですか。しょうがないので関数内で初期化します
ありがとー
つーかグローバルなんて、mainの最初できっちり処理するもんだと思ってたんだが
大域変数にしろ静的変数にしろ初期化する癖はつけておいたほうが良いと思うなあ 特に理由は無いけども
しっかりしたOS上のC++じゃないなら、グローバルの初期化は スタートアップがサポートしていない場合もある(ほとんどか) 組み込み系ならmain内で配置new使うのがお手軽だねえ
新年とかかっているのか!
51 :
デフォルトの名無しさん :2006/01/02(月) 18:56:28
#include<stdio.h> #include<string.h> int main() { char *a="aiueo"; char *b; int c,d,e; c=strlen(a); e=c-1; for(d=0;e!=-1;d++){ *(b+d)=*(a+e); e--; } *(b+d)='\0'; printf("%s\n",b); return 0; } Windows98系では動きますが、Windows2000では動きませんでした。 おそらくunicode関係だと思うのですが、Windows2000でも 動くようにするにはどうすればいいのでしょう?ワイド文字?(VCToolKitです)
>>51 unicodeとか関係ねー
bが未初期化。
適当な配列を宣言してその先頭アドレスを代入するか、動的確保してください
char *a="aiueo"; とかやってる時点でおわっとる
>>53 別にそれ自体は問題ないがな
読み取り専用の文字列を作るのに普通に使うし
57 :
デフォルトの名無しさん :2006/01/02(月) 22:35:20
IEコンポーネントを使ってブラウザを作っているのですが、 JavaScriptの"Window.open()"とかで新しくウィンドウが開いたときに IEが開いてしまって、それにセッションが引き継がれないようで、 SSL通信を行っている場合に正常に通信できなくなってしまいます。 何かいい対処方法は、無いでしょうか。 また、実装方法について参考になるサイトとかありましたら教えてください。
古いC時代の慣習を未だに引きずっているオールドタイプな>54-56がいるスレはここですか。
いったい何人の
>>54-56 タイプがソフト会社に関わってるのやら・・・恐ろしい・・・
どっちも、何がどう問題なのか指摘しないのが笑えるw
多分constを付けなかった時の危険性を語れと言ってるのではないかと
constを付けない危険性なんて変数名をaとかにするのに比べれば…
別にこのぐらいのプログラムだったら大して問題ない
メモリ中にある"aiueo"を逆順に並べ替えて"oeuia"にせよ、 という宿題かもしれない。その場合const不要。 char *a = "aiueo"; char *b; int i,l,n; l=strlen(a); n = l -1; for(i=0; i < (l >> 1); i++){ a[i] ^= a[n-i]; a[n-i] ^= a[i]; a[i] ^= a[n-i]; }
67 :
66 :2006/01/03(火) 03:43:28
とか書きながら char * const a = "aiueo"; これもありか。
>>66 仕様的にどうこうってのはわからないけど。
確保していない(ように見える)メモリを書き換えるのが違和感を覚える。
なんかイヤだ。
>66 鼻から悪(ry
>>66 なんでXORでスワップできるのか分からん・・・
どこかに説明されてるページ無い?
>>70 1 ビットで交換できるか試せばいいじゃん。
引き算でも似たことができる。
ただ、はっきり言って変数使った方がいい場合が多い。
>>66 文字列リテラルの書き換えは鼻から悪(ry
>>71 いや、交換できるか否かは紙とペンで試したから分かってるんだが
原理が分からない・・・
>>72 例えば、a = 0x50、 b = 0x80と仮定する
a ^= b; → a = 0xD0、b = 0x80
b ^= a; → a = 0xD0、b = 0x50
a ^= b; → a = 0x80、b = 0x50
となる
これでわかるよな?
>>72 aとbをXORして求められる値に、元のaかbのどちらかをXORすれば、もう片方の値になる
あとは自分で考えなされ
>>73 理解した。dクス
要は同じ奴でXOR×2すれば元のに戻るってのを利用してるわけだな
楽しいじゃまいか(*゚Д゚) ムホムホ
>>73 それをVSでASM表示させてみたが、Temporary使うときよりコード増えてるな・・・
>>77 読み出し演算書き込みやってんだから、abともにレジスタ
でもない限りはそう有利にもならないよ。
素直にテンポラリ使えってこった
こんばんわ 使っている処理系はBCC5.5.1です fopenのオープンモードに関してなんですけど [temp.txtの中身] こんばんわ こんにちは といったテキストファイルがあるとします。 そこでfopen()とfprintf()、fseek()を用いて [temp.txtの中身] おはよう こんばんわ こんにちは 0から"ごきげんよう\n"と追加して 以前あった"こんばんわ\nこんにちは"の値をごきげんよう\nの後ろに持ってきたいのです。 ですが a 及び a+ ではfseek関数によりファイルポインタは移動できませんし w 及び w+ ではファイルは破棄されてしまいます 残される所 r+ モードしかないのですが更新モードですので、 [temp.txtの中身] おはようわ こんにちは となってしまう筈です(一応ですが確認しました ... そこで、上記のような処理を実装するモードは(APIを除く) C(又はC++のofstreamも含めていいです)レベルで容易されていますでしょうか
すみません誤植ありましたorz 誤 0から"ごきげんよう\n"と追加して 以前あった"こんばんわ\nこんにちは"の値をごきげんよう\nの後ろに持ってきたいのです。 正 0から"おはよう\n"と追加して 以前あった"こんばんわ\nこんにちは"の値をおはよう\nの後ろに持ってきたいのです。
81 :
79 :2006/01/03(火) 20:45:11
まだあった(´・ω・`) 誤 レベルで容易されていますでしょうか 正 レベルで用意されていますでしょうか
>>79 ない。
やるとしたらいったんファイルの中身を全てメモリに読み込んで,
temp.txtに"おはよう"を書き出し,その後に続けて
読み込んでおいた元のファイルの内容を書き出していくことになる。
標準関数だけでは無理だね。 system("echo おはよう > foo ; cat temp.txt >> foo ; mv foo temp.txt"); とか。
あらかじめ余分な空間を取っておけばそこに書き込めばいいわけだけど、 この手が使える状況ってのは限られてるね。
86 :
sage :2006/01/04(水) 20:27:55
void test() { string s1; string s2; } すいません質問です。この関数を抜ける時、 s2, s1 の順でローカル変数が開放される事は 保証されているのでしょうか?
>>86 局所変数の開放順は保証されてなかった気がする
>>87 そすか、気がするで十分です
どうも助かりました
保証されてるだろ? 大域変数はダメだけど。
コンストラクタが実行された逆順でデストラクタが実行されるんじゃなかったっけ?
やっとあった >6 Statements >6.6 Jump statements >6.6.2 >On exit from a scope (however accomplished), >destructors (12.4) are called for all constructed objects >with automatic storage duration (3.7.2) (named objects or temporaries) >that are declared in that scope, in the reverse order of their declaration.
92 :
86 :2006/01/04(水) 21:58:03
>>91 お、お手数かけます
すこぶる確実ならそれに依存したコードをちと書きたかったもので。
ちとソースなり探してみます
class A{
A();
virtual ~A();
};
class B : public A{
B();
virtual ~B();
};
class C : public C{
C();
virtual ~C();
};
void foo(){
C c;
}
このときに
コンストラクタ:A()→B()→C()
デストラクタ:~C()→~B()→~A()
っていうだけでしょ。
>>86 のs1,s2の順は言語的には保証されてない(処理系依存)。
>>93 string s1;
foo();
string s2;
の場合はどうよ?
で、
string s1;
string s2;
の場合は?
boost::mutex とかはこの挙動を前提にしていると思うんだけど
そんな開放順なんて気にするプログラム書いてる時点で素質無し。 逝って良し。
int p = new int[0]; ってどうなりますか?
100 :
98 :2006/01/05(木) 07:15:27
じゃあ p = new int[t]; でt=0のときはどうなりますか?
コンパイルエラー
つーか、tなんぞ関係なくコンパイルエラー
103 :
98 :2006/01/05(木) 08:09:56
あの、すみません、間違えました・・・ int *p = new int[t]; でした
sizeof(int) × ( t + 1 )の領域が確保される
106 :
98 :2006/01/05(木) 10:42:58
で、あの、 int *p = new int[t]; t=0のときはどうなるんでしょうか・・・ *pは不定値?NULL?それとも確保されない?
>>106 t が 0 のとき、 p はヌルではなく、ユニークな(他の int を指さない)ポインタの値になる。
それでも *p の値を参照すると未定義動作を引き起こす。
When the value of the expression in a direct-new-declarator is zero,
the allocation function is called to allocate an array with no elements.
The pointer returned by the new-expression is non-null.
[Note: If the library allocation function is called, the pointer returned is distinct from the pointer to any other object. ]
108 :
107 :2006/01/05(木) 10:55:05
あ、後半は規格(FDIS)から 5.3.4.7 の引用ね。
109 :
98 :2006/01/05(木) 11:05:00
>>107 ありがとうございます。つまり0になっては都合が悪いということですね
>>109 ちがうよバカ。
都合が悪いかどうかはプログラムによって決まること。
111 :
98 :2006/01/05(木) 11:22:27
都合の悪くない使い方の例を教えていただけませんか?
>>111 都合の悪い使い方の例を教えていただけませんか?
113 :
98 :2006/01/05(木) 11:29:35
>>112 *p の値を参照すると都合が悪いんですよね?
>>113 要素数 0 なのに要素を参照するのはプログラムが間違ってると思わないか?
115 :
98 :2006/01/05(木) 11:33:12
つまりすべての場合で都合が悪いということですよね?
>>115 ちがうよバカ。
正しいプログラムでは問題にならない。
117 :
98 :2006/01/05(木) 11:44:42
では重ね重ねすみませんが要素数0のpの使い道を教えていただけませんか?
>>117 ヌルではないから、配列が確保されたかどうかの判別には使える。
他のポインタと違う値になるから、 std::map など連想配列のキーにも使える。
119 :
98 :2006/01/05(木) 11:56:59
なるほど・・・そのような使い道があったのですね。参考になりました
「使い道がわからない=都合が悪い」もしくは 「都合が悪くない=使い道がある」とかいう思考回路もなんとかしとけよバカ。
121 :
98 :2006/01/05(木) 12:18:01
思考回路というより、言い方が不味かったですすみません
C++で、"オブジェクトをファイルに保存して、また後でそのオブジェクトを使う" というのはできますか?? ポインタをください。 環境は Debian で、gcc のバージョンは、3.3.5です。 オブジェクトの中身をStringにおとして、テキストでファイルに書き込んで、 それをまたよみこんで、オブジェクトを初期化するのは、どんくさいように思いました。
うん、どんくさい。おまいがな。
>>123 できない。というか、言語側では面倒を見てくれない。
C、C++は自分で全部やるか他の人が作ったライブラリを
使うかしかない。
ちなみに、インスタンスの構造はメンバだけじゃないから、
オブジェクトをべたで書き出して後で読み込んだら
吹っ飛ぶかもしれないよ(仮想関数テーブルへのポインタとかね)
>>123 boost:serialization
127 :
デフォルトの名無しさん :2006/01/05(木) 16:11:56
物理計算の勉強のため、C/C++ Linux/XWindow環境下でのグラフィックライブラリnxgraph
を導入したいのですがうまくいかないため、ご教授願います。
入手元、マニュアル:
ttp://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/nxgraph.html 環境はLinux,Fedora Core4 FullInstall デスクトップ環境:GNOMEです。
デスクトップ上にフォルダを作成しマニュアルの指示通り nxgraphライブラリ、
nxgraph.h,nxgraph.doc,elib.cc,elib.h,flib.cc,flib.cc,flib.h,gccx,gccxe,
gccxf を保存しました。
Xlinbのありかの調査、ですが、
Xlib.h は /usr/X11R6/include/X11/ に
libX11.so は /usr/X11R6/lib/ にありました。
次の操作の.cshrc などに上記ディレクトリ名を環境変数に記述するという作業はよくわからず、
ファイル検索にて csh.cshrc と言うファイルを見付けたのでその末尾に加えました。
その後サンプルプログラムもnxgraphライブラリを入れたデスクトップ上のフォルダに保存し、
gccx flower.cc など端末でそのディレクトリの位置で行いましたが
bash: gccx: command not found と出てコンパイルされません。
Linuxはここ数日に導入したもので基本操作が身についていないため導入できなかったのかも
しれませんが、どうしてもやり方が分からず途方にくれています。
>>127 リンク先はオールドタイプだな
あんまり勧めたくないところだけど
>次の操作の.cshrc などに上記ディレクトリ名を環境変数に記述するという作業はよくわからず、
>ファイル検索にて csh.cshrc と言うファイルを見付けたのでその末尾に加えました。
たぶんあなたはbashを使っているだろから
あなたのホームディレクトリにある
.bashrcに
exoprt XINCDIR='/usr/X11R6/include/X11'
export XLIBDIR='/usr/X11R6/lib'
を加えてください.
コンパイルする際のgccx,gccxe,gccxfは./gccx,./gccxe,./gccxfとするとうまくいくでしょう.
以下のように
./gccx sample.cc
130 :
デフォルトの名無しさん :2006/01/05(木) 17:04:55
>>129 解答ありがとうございます。
ただ、
./gccx sample.cc
と言うように入力したところ、
bash: ./gccx: 許可がありません
と応答されコンパイルされませんでした。root権限でも同様です。
どうすれば許可を得られるのでしょうか。
また、
>リンク先はオールドタイプだな
>あんまり勧めたくないところだけど
とありますが、お薦めがあれば教えてもらえると嬉しいです。
>>130 >bash: ./gccx: 許可がありません
chmod u+x gccx
chmod u+x gccxe
chmod u+x gccxf
The UNIX Super Textでも読んで
まず基本的なことを身に着けた方が良いよ
>>130 gccxなどのファイルパーミッションはちゃんと実行許可を立てていますか?
つーか、鼬害なのでとっとと犬板か海胆板にお帰りください。
133 :
デフォルトの名無しさん :2006/01/05(木) 17:41:39
Cです。連番のファイルを処理したいとき、(例えば01.dat 02.dat...) forループで処理するとしてfopenでファイル名で どのようにループの変数を設定すればよいのでしょうか?
sprintf
135 :
デフォルトの名無しさん :2006/01/05(木) 18:05:27
>131 >132 解答ありがとうございました。 確かに、 .bashrcに >exoprt XINCDIR='/usr/X11R6/include/X11' >export XLIBDIR='/usr/X11R6/lib' (上のexoprt をexportに書き直しました) と書き入れ、>131の方法で、許可を与え同様に実行しましたが、 XINCDIR: 定義されていない変数です。 と応答されまたもコンパイル不能でした。 基本操作だそうなので追加の解答は期待せず調べてみますね。
>>135 typoごめんね
>XINCDIR: 定義されていない変数です。
$ export
とうつと今設定されている環境変数が表示されます
XINCDIRは設定されてる?
137 :
デフォルトの名無しさん :2006/01/05(木) 18:22:12
質問させて下さい。 for(i=0 ; i !=1 && i !=2 ; ){ printf("put 1 or 2\n"); scanf("%d", &i); if(i !=1 && i!=2){ scanf("%d", &i); } こうすると、数字を入力したときは 正常に再入力に戻ってくれるのですが 英字(aなど)を入力すると入力メッセージ が無限ループしてしまいます。 英字を入れたときも正常に再入力 にするにはどうすればいいですか?
環境はVisual C++です。 よろしくお願いします。
>>136 あんまり甘やかすなや。
>>137 scanf()を使うのを諦め、fgets()とsscanf()を組み合わせて使う。
実例は、このスレか過去スレ、或いは宿題スレで見つかると思う。
>>139 ありがとうございましたm(__)m
なんとかなりそうです。
141 :
デフォルトの名無しさん :2006/01/05(木) 19:43:29
>>136 返信ありがとうございます。
ちょっと挙動に混乱したため(rootでLogin後、端末で一般<>rootとすると応答が違う、など)
一度LogOutし、root,一般でLoginしてそれぞれexport,./gccx を試しました。
始めにrootでLoginした場合、exportで上記環境変数は設定されず。
(これは.bashrcを設定したホームディレクトリ位置から当り前ですね。この状況での
>>135 応答だったようです)
始めに一般でLoginした場合、exportで上記環境変数は設定されていて、./gccxでの応答が
実行させたプログラムにより変わりました。(su root でrootになっても環境変数設定確認)
ttp://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/HIGH/SRC/project.cc 例えばこの放物線運動 のソースの場合、
nxgraph.h: In function ‘void NXRotateWindow(int, int, double)’:
nxgraph.h:1657: error: ‘cos’ was not declared in this scope
nxgraph.h:1658: error: ‘sin’ was not declared in this scope
とエラーが表示されました。
Dirac方程式による水素原子の動経波動関数
ttp://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CIP/raddirac.html の場合、cip.hのヘッダファイルは予め作業フォルダに保存した上で、
In function `NXError(char const*)':
raddirac.cc: warning: `sys_errlist' is deprecated; use `strerror' or `strerror_r' instead
/tmp/ccVFDneo.o(.text+0x1934): In function `NXRotateWindow(int, int, double)':
(長いので略)
とエラーが表示されました。
nxgraph.hがきちんと導入されていないような様子ですね。ちなみにnxgraph.hも
ソースファイル、gccxらとともに作業フォルダに保存してあります。
あまりに初歩的な質問でお手数お掛けして申し訳ありません。
142 :
デフォルトの名無しさん :2006/01/05(木) 19:51:51
はじめまして。 C++を始めようと思うんですが、C++.netってコンパイルされた後の コードが機械語じゃなく、半分翻訳された中間体のような物だとと聞きました。 過去のOSなどで使えるソフトが作れるような、機械語コードを吐き出す C++は現在売られているのでしょうか? よろしくお願いします。
もんだいない。ネイティブC++は健在
>>142 現在の主流の処理系は機械語を生成する。たぶんおまえが言ってるC++.netはmanaged C++のこと。
売られてる最新のVC++.NET使ってるけど出力されるのは普通の機械語ですが何か?
146 :
デフォルトの名無しさん :2006/01/05(木) 19:56:55
windowsxpなんですが、コマンドプロンプトでプログラム*.cを実行しようとすると 'gcc' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。 と表示されます。 どうしたら実行できるようになるんですか?
まぁ、VisualC++.NETとかって売られてる本でも、Managedとか断りも無く、普通に.NET Frameworkで書いてあるだろうけどな
冬休みだなぁ・・
>>146 まずはPCを窓から投げ捨てろ
話はそれからだ
>>146 GCCはインストールした?
したなら、環境変数PATHの値にgcc.exeのパスが含まれてる?
*.cは実行できません。実行できるのは*.exeとか
>>147 そーか? VC++.NET本ってネイティブが主のが多いんじゃね。
おれの立ち読み感からするとだが
153 :
146 :2006/01/05(木) 20:02:15
すいません。gccインストールしてません。 いつもは学校でlinuxのターミナルでやってるので家のものは使い勝手が違いよくわかってないんですが、 他のやり方で作ったプログラムが機能してるかどうかテストできる方法ありませんか?
gcc入れたら?
>>153 WindowsでGCCを使うにはインストールが必要。
Mingwあたりを調べれ。
そんなくらい自分で調べろや・・・
学校いけよ
大学生・・・だよなぁ?
159 :
146 :2006/01/05(木) 20:05:11
失礼しました。一通りググってからもう一回来ます。
161 :
デフォルトの名無しさん :2006/01/05(木) 20:09:38
>>134 ありがとうございます。sprintfを調べて作ってみたのですが、
int main(void)
{
FILE *fin, *fout;
char infile[80], outfile[80];
for(z=1;z<=2;z++){
sprintf(infile,"%02d.dat", z);
if ((fin=fopen(infile,"r")) == NULL){
printf("Can't open file!\n");
exit(1);
}
sprintf(outfile,"%02dg.dat", z);
fout=fopen(outfile,"w");
これ以下処理....
}
とやってみたもののopenに失敗してしまいます。
どこがわるいのでしょうか?
自己解決しました。
ファイルが無いんじゃないの?
こんないちいち聞かないと進められないくらいなら、プログラムなんかやめちまえ。
165 :
161 :2006/01/05(木) 20:26:39
ファイルはちゃんと同じフォルダにあります もうちょっとしらべてみますね
自己解決したんじゃないのか?
162は私ではないです 一応とりつけときます
ちゃんとclose()してる?
>>161 エラー出力を perror("Can't open file!"); に変えてみよう。
170 :
デフォルトの名無しさん :2006/01/06(金) 14:18:23
派生クラスに対して、 派生クラスのインスタンスを被演算数とするオペレータを 定義することを義務付けるような基底クラスというのは どのように書けばいいのでしょうか…。 template <class T> class hoge{ public: virtual T& operator+=(T&) = 0; }; こんな感じに書くしかないのでしょうか。 また、この基底クラスの仮想オペレータを呼び出すことで、 継承クラス先のオペレータの処理を抽象化しながら、 何らかの処理をするクラスを作りたいのですが、 template <class T> class piyo{ public: void excute(hoge<T>* phoge){} }; のように書いても、リンク時に外部シンボルが参照できないという エラーが出てしまいます。 どう書けば、基底クラスのインターフェイスだけで、 派生クラスごとのオペレータを呼び出せるのでしょうか…。
171 :
デフォルトの名無しさん :2006/01/06(金) 15:10:58
LinuxでSIGSEGVやSIGFPEを無視する(あるいはエラー処理をしてプログラムを続行する)にはどうすればよいのでしょうか? シグナルを無視すると無限ループになるし。。。
173 :
171 :2006/01/06(金) 16:33:10
>>172 わかりました。そちらで質問しなおします。ありがとうございました。
>170 何をしたいのかよく解らん。 オペレータって何だ?関数のことか?
つーか、派生とテンプレートを混乱している悪寒。
変数zをグローバルでdouble型にしていたのが問題だったようです。 皆さんどうもありがとうございました
>>170 タイプリストを使って間接的にテンプレートを扱ってみては?
/// @file CBase.h
template <class T> struct TypeList
{
typedef T MyType;
};
template <class MyType> class CBase
{
public:
CBase(){}
virtual ~CBase(){}
virtual MyType& operator += (MyType& rhs) = 0;
};
///
>>176 「z」がグローバルなのは関係ない。
double なのは大いに関係有りだが。
# %d 指定に double 渡すなボケ!
179 :
170 :2006/01/07(土) 04:12:26
解決しました。
テンプレートクラスのメソッドは、
独立したcppソースには書いてはいけないんでした…。
何度もはまったことなのに、今回気付くのに10時間以上かかりました…。orz
これがVC++7やBCC5.5に限った話なのかはわかりませんが…。
>>174 基底クラスのなかに、それを継承したら継承先のインスタンス同士の
演算子も絶対に定義させるような仕組みを作りたかったんです。
ポリモフィズムで何とかできるか考えていたのですが、
思い浮かばなかったので、テンプレートを使うことにしました。
>>175 かもしれないです…。
相反する概念であることは理解しているつもりなのですが、
実装するときにはなかなかうまくいきません。。
>>177 ありがとうございます。
そういうテンプレートの使い方があったんですね。勉強になります。
>>179 いい勉強になったな。ではComeau C++でも(ry
export 実装処理系キタ━━━━(゚∀゚)━━━━!!
182 :
デフォルトの名無しさん :2006/01/08(日) 22:06:21
つか、ギコナビでこのスレみつかんなくなったage
アホか
今どきC++な僕らがアホなんだ。アホ。
187 :
デフォルトの名無しさん :2006/01/09(月) 12:54:07
質問です C++ってコンストラクタからコンストラクタを呼び出すって出来ますか? 例) class Foo { private: int i; char c; public: Foo(int i, char c) { this->i = i; this->c = c; } Foo() { Foo(0, '\0'); } };
なぜ試さない・・・
>>187 コンストラクタから呼び出すコンストラクタは、一時オブジェクトになる。
つまり、それに操作を施しても結果が残らない。
>>188 色々試してダメだったのよ
Foo() : Foo(0, '\0') {} もできなかった
>>189 複数のインターフェイスをもつ、
複雑なコンストラクタを持ちたい場合は、
実処理をprivateかprotectedな別関数に持たした方が良さそうですね。
>>188-189 ありがとうございました。
例ならデフォルト引数で良さそうにも見えるけど… だめなん? class Foo { public: Foo(int i=0, char c='\0'); };
>>191 ありがとうございます。
でも、実際はこんな感じなんです
class Foo {
private: construct_(int a, PFUNC pfunc, char* ini_file);
public:
Foo(int a=DEF_VAL, PFUNC pfunc=DEF_FUNC, char* ini_file=DEF_INI_FILE) { construct_(a, pfunc, ini_file); }
Foo(PFUNC pfunc=DEF_FUNC) { construct_(DEF_VAL, pfunc, DEF_INI_FILE); }
Foo(char* ini_file) { construct_(DEF_VAL, DEF_FUNC, ini_file); }
};
なので、コンストラクタとは別に実コンストラクタを持つ方がいいかなぁと。
>>192 そういうのだと、分離したほうがすっきりしそうだね。
ついでに実デストラクタ(?) もセットにしておけば、スマートに見える(かも)
194 :
デフォルトの名無しさん :2006/01/09(月) 16:08:34
VC6.0でプログラムしてるんですが プロジェクトフォルダ以外にインクルードファイルだけまとめたフォルダがあるんですが 参照したいインクルードファイルのフォルダの追加ってどこで設定できるんですか? とりあえずプロジェクトの設定だいあろぐを出して色々みてるんですが どこにあるかわかりません
オプション(O)画面も出せない君はスレ違い
スレ違いでしたようでどうもすいません。 おかげさまで解決しました。ありがとうございます。
197 :
デフォルトの名無しさん :2006/01/09(月) 16:40:47
お前ら最高に素敵だ!
198 :
デフォルトの名無しさん :2006/01/09(月) 17:01:15
スレ違いかもしれませんがどうしてもわからないので教えて下さい。 今C言語勉強用にコマンドラインでオセロを作成しているのですが、今盤面のすべての所に石がおける状態です。それと挟んだ石をひっくり返す判定がどうしてもわかりません。 どうか教えていただけないでしょうか。 ソースを下記に記載します。(初心者なので突っ込み所満載のソースだと思いますがどうかあまりつっこまないで下さい><) #include<stdio.h> ///石の種類/// #define no "・" // 0 #define bl "●" // 1 #define wh "○" // 2 ///盤面8*8/// int banmen[10][10]; //枠を1マス分多く取っています。 //////////////配列の初期化//////////// void syoki(){ int i, j; for ( i = 1; i <= 8; i++){ for ( j = 1; j <= 8; j++){ banmen[i][j] = 0; } } banmen[4][4] = banmen[5][5] = 1; banmen[5][4] = banmen[4][5] = 2; }//////////////////////////////////////
199 :
デフォルトの名無しさん :2006/01/09(月) 17:02:39
///////////石をひっくり返す判定/////////// /* int hantei (int x, int y){ if ( h, bnmen[h][v] == 0, h++) */ /////////////////////盤面の入出力/////////////////////////// void othello(){ int i, j, k, l, h, v; for ( k = 1; k < 60; k++){ //オセロは最多60手なので60手で終了。 ///盤面の表示/// printf (" 1 2 3 4 5 6 7 8\n +----------------+\n"); for ( i = 1; i <= 8; i++){ printf ("%d|",i); for ( j = 1; j <= 8; j++){ switch ( banmen[i][j]){ case 0: printf(no); break; case 1: printf(bl); break; case 2: printf(wh); break; } } printf("|\n"); } printf (" +----------------+\n");
>>198 どんなところに石が置けるのか、挟むとはどんなことなのかを日本語で書き出せ。
そしてそれをCで表現するにはどうしたらいいか考えろ。
201 :
続き :2006/01/09(月) 17:04:39
///石の入力/// l = k % 2; //白の番か黒の番かの判断。(lの値が0なら白、1なら黒) printf ("行を指定して下さい(1〜8):"); scanf ("%d",&h); printf ("列を指定して下さい(1〜8):"); scanf ("%d",&v); if ( ((h >= 1) && (h <= 8)) && ((v >= 1) && (v <= 8)) ){ switch ( banmen[h][v]){ case 0: switch (l){ case 0: //白の番 banmen[h][v] = 2; break; case 1: //黒の番 banmen[h][v] = 1; break; } break;
202 :
続き :2006/01/09(月) 17:07:26
case 1: printf ("\n\nError : そこには石を置けません。\n\n"); k = k - 1; break; case 2: printf ("\n\nError : そこには石を置けません。\n\n"); k = k - 1; break; } } else if ( h == 0 && v == 0 ){ // ユーザーが0,0と入力した場合は"k"に"60"を代入してゲームを強制終了 k = 60; } else{ //ユーザーが盤面の外を指定した時の処理 printf ("\n\nError : 正しい値を入力して下さい。(1〜8)\n\n"); k = k - 1; } } }//////////////////////////////////////////////////////////////// int main(){ syoki(); othello(); }
203 :
198 :2006/01/09(月) 17:10:58
>>200 さん
ぼくなりに考えたのですが
石を置いた時に、隣を見て自分と反対の色の石があり、なおかつ延長線上に自分の石がある時におけると思いました。
それを8方向調べる。
上記に当てはまらないばあいは置けない。
こんな感じだと思うんですがどうしてもC言語で表現する方法が思い浮かびません><
だめだな 思いつかないならまだ早いと言うことだ
205 :
198 :2006/01/09(月) 17:33:29
そんなぁ>< まだ独学ではじめて1ヶ月くらいなんです。。。 先生がいないから教えてほしいのです><
>石を置いた時に、隣を見て自分と反対の色の石があり、 まずはここから。これができたら、隣りの隣りを見て、隣りの隣りの隣りを見て...まぁがんばれやと。
207 :
198 :2006/01/09(月) 17:45:50
一度にあれこれ考えすぎてるんだろうな
自分が実際にオセロやって裏返すときに考える過程をひとつずつ思い出して それをそのままコーディングすればいいじゃない
C言語塾とかやったら成り立つだろうか?
211 :
198 :2006/01/09(月) 18:32:58
だめだスパゲッティになってきて頭が混乱してきた>< ふぅ少し休憩・・・
212 :
デフォルトの名無しさん :2006/01/09(月) 18:38:11
始めまして、VC++を学ぼうと思うのですが いまいちどれを購入したらいいかわからないです。 とりあえず探してみたものなのですが Microsoft Visual Studio .NETてのは、C++はいってるんですか? ちなみに学生なので購入はできそうなのですが・・・・ あと、お勧めとかあったらおしえてください。
つ アカデミパック
214 :
212 :2006/01/09(月) 18:47:40
すみません、書き足りない部分が・・・・ Microsoft Visual Studio .NETの説明をみていると 複数の言語が入っているようなとらえ方をしてしまっているのですが それであっているのでしょうか?? そうなると、C++でも使えなくなる命令語とかでてきるのでしょうか? 初歩の初歩だと思いますがどうか回答お願いします^^;
215 :
212 :2006/01/09(月) 18:49:38
Microsoft Visual Studio .NETは、C++のアカデミパックってとこですか?
>>212 学生ならVisual Studio.net 2003 theSpokeを購入するのが安上がり。C++入ってる。
今は購入して登録するとVisual Studi.net2005 Proを無償でDL出来るキャンペーンみたいなこともやってる。
スレ違いだけどな
218 :
212 :2006/01/09(月) 22:05:58
無料DLみたいなのできました^^ いろいろ、ありがとうございました。
220 :
デフォルトの名無しさん :2006/01/09(月) 23:17:52
221 :
219 :2006/01/10(火) 00:13:33
>>220 さん
回答ありがとうです
バカちんこたんなおいらでも分かりそうな気配がするので読んでみます
ありがとうございました
222 :
デフォルトの名無しさん :2006/01/10(火) 01:26:25
C++ で、数値(int or long) を16進文字列に変換する方法を教えてください。 sprintf を利用するのはなしでお願いします。 16 のx 乗の余りをswitch-case で文字連結していくのはダサイですよね。。。
>>222 std::ostringstream oss;
int n = 0x12345;
oss << std::hex << n;
std::cout << oss.str() << std::endl;
224 :
222 :2006/01/10(火) 01:40:33
>>223 あぁーん、そんなやり方があるんですね。
ありがとうございます。
>>222 Cだけど
unsigned longn = 0x123456;
charbuf[100],*p;
p = buf+100;
*--p=0;
while( n ) {
*--p = "0123456789ABCDEF"[n&0xF];
n>>=4;
}
226 :
デフォルトの名無しさん :2006/01/10(火) 03:02:23
Visual Basic なんだけど、 Sub ex2() Dim x As Integer, s As Integer s = 0 For x = 1 To 100 s = s + x Next x If x Mod 2 Then End If MsgBox "合計=" & s End Sub ってのに奇数だけの和を求められるようにするにはどう変形すればよいですか?
つーかマルチだ
はわわー
230 :
デフォルトの名無しさん :2006/01/10(火) 12:06:40
ウィンドウズアプリケーションを作っていますが、 他のアプリケーションを起動させる関数が分からなくて困っています。 自分のアプリケーションでヘルプボタンを押したら ヘルプ用に作成してあるHTMLファイルをIE等で開きたいのです。 検索したもののキーワードが悪いのか、 いくらでも出てきそうなのに出てきません。 よろしくお願い致します。 環境: WinXP(SP2) BCC5.5.1
ShellExecute() Win32スレに逝った方がいいよ。
232 :
230 :2006/01/10(火) 12:32:02
233 :
ちょっと教えてください :2006/01/10(火) 12:54:48
eclipseでc/c++をコンパイルして実行したいのですがいまいちうまく
いきません。cdtとcygwinをいれました。で、このサイトを
http://www2.atwiki.jp/ccw/pages/18.html 参考にmakefileをつくりビルドしましたが実行ファイルができません
今はhello01をビルドしてもコンソールに何もメッセージは出ていません。
どうすればc言語をコンパイル実行できますか?
>>233 まずは、コマンドラインでコンパイルできるか試してみたら?
その手のIDEはコンパイラが適切にインストールされていることが前提なのだし。
235 :
ちょっと教えてください :2006/01/10(火) 13:16:43
>>234 コマンドラインからはきちんとコンパイルできてa.exeができて実行できます
>>235 makeは?
つーか、その辺になるとEclipseスレか。
#あるのか知らんが。
237 :
ちょっと教えてください :2006/01/10(火) 14:01:25
make? Makefile 作りました。 こんな内容です helloworldのプログラムを書きました。でファイル名はhello01.cで 参考サイトにはhello03って書いてあったのでmakefileにはhello03にしています hello01にしても同じ結果でした。 TAEGET = hello03 CFLAGS = -g OBJS = hello03.o all : $(TARGET) clean : rm -f $(TARGET).exe $(OBJS)
こまっています・・・ Win2000SP4で権限チェックするモジュールがあります。 これは、NetUserGetLocalGroups()でログインしているユーザが所属しているローカルグループを 一覧して、「Administrators」グループに所属しているか確認しています。 ある特定の端末(数台)で、一覧されるユーザが「Users」権限のみになってしいます。 正常な端末では、「Users」と「Administrators」グループが取れます・・・ このAPIは端末の設定か何かで動作が変るものでしょうか??
Getメソッドによく const char* getName() const; の表記が見られますが、関数getName()の後ろにまで const を付ける意味が知りたいです。 const char* はgetNameの戻り値がconstである事を表しているのだと思いますが 後ろの const の役割がわかりません・・・
メンバ変数を変更しない
>>241 なるほど、クラス内のメンバ変数も変更されないという事ですね。どうもです。
あらゆる代入などの変更処理をしない
名前: デフォルトの名無しさん E-mail: sage 内容: コマンドの引き数として<実数><演算子><実数>の形で与えられた 四則演算を計算し、結果を出力するプログラムを書いたのですが、 引数が2個あたえられた場合にエラーを出力させる所が良くわかりません・・・ 下のプログラムに書き足すとしたらどうしたら良いでしょうか?
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { double operand1, operand2, result; char op; operand1 = atof(argv[1]); operand2 = atof(argv[3]); sscanf(argv[2], "%c", &op); switch(op){ case '+': result = operand1 + operand2; break; case '-': result = operand1 - operand2; break; case '*': result = operand1 * operand2; break; case '/': result = operand1 / operand2; break; default: printf("error"); break; } printf("%lf\n", result); return 0; }
誤爆スマソ
そもそもTAEGET
コンテナの中から、ある条件を満たした要素だけを削除する関数release()を 作成したいのですが、イテレータを使って削除していくと実装手順によっては メモリ保護違反で強制終了されてしまいます。 以下に、落ちる場合の2パターンと、落ちない1パターンを記載させて頂きます。 なぜ落ちるのか、教えて頂けたら幸いです。お願いします。 なお処理系はwindows2000 + BCC5.5 or VC++7です。 ------------------------------------------------------------------------- // クラス1(#の部分で必ず落ちる) class HogeSet { std::deque<hoge *> hoge_set; // コンテナのインスタンスを集約 public: void release(void){ std::deque<hoge *>::iterator current_it; current_it = this->hoge_set.begin(); // 先頭要素のイテレータを取得 for(; current_it != this->hoge_set.end() ; current_it++){ if( *current_itがある条件を満たすなら ){ // # delete (*current_it); // 要素のメモリ解放 this->hoge_set.erase(current_it); // コンテナから消去 } } } }; ------------------------------------------------------------------------- これはコンテナから削除済みの要素へのイテレータがインクリメントされてしまうので、 落ちるのは当然なのかもしれません。そこで、次のように書き直してみました。
// 下のようにrelease()を書き換えても#の部分で落ちます。 void release(void){ std::deque<hoge *>::iterator current_it,next_it; current_it = this->hoge_set.begin(); // 先頭要素のイテレータを取得 while( current_it != this->hoge_set.end() ){ next_it = current_it+1; // 次の要素のイテレータを取得 if( *current_itがある条件を満たすなら ){ // # delete (*current_it); // 要素のメモリ解放 this->hoge_set.erase(current_it); // コンテナから消去 } current_it = next_it; // 次の要素のイテレータを戻す } } ------------------------------------------------------------------------- コードは汚いもののこれなら無難かなと思ったのですが、これでも落ちました。 コンテナに存在する要素の数以上にループが回ってるようです。 ------------------------------------------------------------------------- // こうすると落ちません。 void release(void){ std::deque<hoge *>::iterator current_it; current_it = this->hoge_set.begin(); // 先頭要素のイテレータを取得 while( current_it != this->hoge_set.end() ){ if( *current_itがある条件を満たすなら ){ delete (*current_it); // 要素のメモリ解放 current_it = this->hoge_set.erase(current_it); // コンテナから消去。次の要素のイテレータも取得 } else current_it++; // 条件を満たさない場合は普通にインクリメント } } ------------------------------------------------------------------------- こう書き換えると落ちることなく正常に処理されます。 処理的には2番目のものと何ら変わっていないように思えるのですが…。
>>250 erase()したら、イテレータが無効になる。二番目のものは、erase()
が返す、次の要素を指すイテレータを改めて取得しているので落ちない。
>>251 なるほど。
next_it = current_it+1;
としてても、current_itがerase()されたらnext_itも無効になるんですね。
ありがとうございました。
コンテナの要素をいじくりまわすときは、 for文は使わずに、algorithm使った方がいいよ。 for文は危険だし、遅い。
>>253 remove_if()でも使え、って事かな?
この場合は、後ろ側に集められた不要な要素をまとめてerase()する事になるね。
ん、やっぱりremove_if()はだめだな。「削除した要素」は、「削除されなかった 要素」で上書きされる」ってあるから、上のようなオブジェクトをポインタが指す 例では、メモリリークが起きる。 for_each()を使っても、要素を「詰める」事はできないし、どのアルゴリズムを 使えばすっきりする?
deque<hoge*>::iterator current_it(hoge_set.begin(); for(;current_it!=hoge_set.end();++current_it) if(hoge(*current_it)) {delete (*current_it); *current_it = static_cast<hoge*>(0);} といったん消して、ゼロをセットする。 hoge_set.erase(remove(hoge_set.begin(),hoge_set.end(),static_cast<hoge*>(0)),hoge_set.end()); でもってゼロのやつだけまとめて消すってんでダメか?
そこでスマートポインタですよ
この場合はやっぱり普通にfor文で回して、boost::ptr_vectorかboost::scoped_ptr を使うべきだな。 erase()はEffective STLを見ればわかるように、返り値を次のイテレータとすれば 全く問題ない。
何でboost::ptr_deque<>ではダメなの?
それはそうだが、メモリの再配置が起きるんで一括して消すにこしたことはない、 ともEffective STLには書いてあったぞ。
261 :
デフォルトの名無しさん :2006/01/11(水) 02:10:06
AccessViolationのような例外?はC++ではcatchできないんでしょうか?
catch(...) で catch できない?
263 :
261 :2006/01/11(水) 02:18:10
作ればいいじゃん。 class access_violation_error : runtime_error { access_violation_error(int errnum,msg) : runtime_error(msg) ,m_errnum {} int m_errnum; int errno() const { return m_errnum;} const string what() const { otringstream ost; ost << "errnum : " << m_errnum; return ost.str();} }; try{ if(is_Access_Violation_Error(...)) // throw access_violation_error(GET_Access_Violation_Error_Number(),"hogehoge error"); }catch(access_violation_error_number& err){ cout << err.what() << endl; }
>>259 う・・・・そういうのもあったのか。勉強不足ですた。スマソ
>>260 std::remove()が、消すべき要素を後ろ側に集めてくれるのなら
それも使えるが、現実問題、
>>256 のようにするしかないし。
うわぁ、boost::ptr_listやboost::ptr_set、boost::mapなどもある。
>>265 std::partitionが消すべき要素を後ろに集めるよ。
268 :
267 :2006/01/11(水) 09:52:36
あ、そうだ。忘れてた。 std::partition は安定してないから順番も保持したいなら std::stable_partition その辺は臨機応変に
269 :
デフォルトの名無しさん :2006/01/11(水) 12:40:58
externの使いかたを猫でもわかるように説明してください。
>>269 にゃぁ、にゃにゃにゃん、にゃ。
ぎゃーにゃ!
>>269 とにかく付けとけば良い。コンパイラに怒られたら外す
externって意味が違う使いかたがあるよね
CとC++ではexternの意味が違う。どちらの事を聞いているのかはっきり言え。
274 :
269 :2006/01/11(水) 16:00:13
>>273 そうなんですか。
ではCでお願いします。
275 :
1 ◆HSRZfxFrgo :2006/01/11(水) 16:17:08
C言語でGIFのデータをメモリに展開し、 LCDに表示したいと思っております。 そこで、GIFの展開ルーチンのCソースコードを 誰か教えていただけないでしょうか? 紹介しているHPでも結構です。 C++だとできなかったので、Cのソースコードでお願いいたします。 よろしくお願いいたします。
どこの1だよこのカス 帰れ
変数宣言ではグローバル変数を意味する。初期化子があると定義になる。関数では無いのと同じ。
278 :
aaa ◆HSRZfxFrgo :2006/01/11(水) 16:23:36
>>276 すいません、間違えました。
でも、非常に困っているので、誰かお願いいたします。
>>278 >C++だとできなかったので
できない訳無いやん。
>>278 別にお前が困ろうと死のうと俺らには関係ないから消えろ
281 :
aaa ◆HSRZfxFrgo :2006/01/11(水) 16:33:43
C++は今の開発環境では使わないので困っております。 Cを使っています。 よろしくお願いいたします。
C++のソースをCに書き直せばよいだけ。
283 :
aaa ◆HSRZfxFrgo :2006/01/11(水) 16:40:46
>>282 回答ありがとうございます。
C++からCに直すのは簡単でしょうか?
場合による
gifフォーマットって、なんか躓くようなややこしいところあったっけ? 単純な画像形式でしょ。
ダメだこいつ
チン子
289 :
デフォルトの名無しさん :2006/01/11(水) 22:00:36
290 :
デフォルトの名無しさん :2006/01/11(水) 23:37:46
windowsにて ファイルオープンのプログラムを組んだとき、 ファイルはどのフォルダに入れておいたらいいんですか?
291 :
デフォルトの名無しさん :2006/01/11(水) 23:42:39
‖Y .:::::.:.:.:.:.: : : ::l、|| | ‖ ‖ | ‖/.:::.:.:.:.:.:.:. :. _ i || | ‖ ‖ | l '.::''::::::.:.::/Y / r-、 _ i;. | ‖ ‖ | l :: :: .:: :: 7:::ヽ /V::::/ /::t__Y, ‖ __ ,l: l l l:/:/`' 7::::く /:t-i::/ ./ ̄____:::::/ l .l: l: l:i/ /::/ヽ' ヽ;:`'/  ̄,-, // l: l: l: l: l,/ ,i' /:/i;;'`‐- /:/ ` /.:l: .:l :i: / `' i: `':i |‖| l: : l :.i : : l;: ii;-:、 l;: ,-' |‖| i;. ;: i: :::::::l: i、 `‐、 l;: / |‖| ||:`;i i; _ .:l: i ,l:-' | ,‐-='γ',:;:;ヽl; , = " r'ヾ:, `‐ '丿=、 ,. = '"`t,- 、 i'i / 'i, ` i;.:.:.:.:` '' '`:.:.:.:.:.,- '‐- y'"`= , | |/ `-, `-、;;: ; : :;; :; :';..;.:.:/:.:.;.:.:.:.`y-':.:.:. =-ヽ, ,. - `-、;;.:.:.:.:.:.:.:.:. ,-'ヽ, ,.= ' ,=' '' "i`=-‐,=':.:.:.:.:.:.:.,i`'"'=‐-‐=" `= ' `'=-.:.:.:.:.:.:,-='
質問です。 linuxでスレッドを複数経てたプログラムで forkしてプログラムの複製を作った場合、スレッドも複製されるのでしょうか? たとえば、スレッドを2つのプログラムをforkしたら 子プロセスもスレッドが2つ走ってる状態になりますか?
>>290 そもそもファイルオープンのダイアログでは最初に表示されるフォルダを指定できる。
294 :
デフォルトの名無しさん :2006/01/12(木) 04:31:42
C言語のプログラムで質問があります #include<stdio.h> char *mp; FILE *fp; intmain(void) { mp = (char *)malloc(2); fp = fopen("test.txt", "rb"); fread(mp, 2, 1, fp);//test.txtから printf("%X",*mp);//一文字読み込んで16進数表示させる fclose(fp); return 0; } 上のプログラムはtest.txtから一バイト読み込んで文字を16進数させるプログラムですが test.txtの最初の文字が”A”だったとすると”41”と表示されるのですが 全角日本語の”こ”だったりすると必ず”FFFFFF82”となり”FFFFFF”の六文字がくっついてきます ”FFFFFF”を表示させないようにするにはどうしたらいいのか、教えてください。
unsigned char
296 :
デフォルトの名無しさん :2006/01/12(木) 04:42:44
>>295 早速の返事ありがとうございました。
unsigned char *mpにすると解決できました。
>>291 って何の絵?
メメタアと書いてあるように見えるが
まんまメメタアの絵
【環境】 WindowsXP SP2 / VC.NET 2003 / C言語 【質問】 画面消去の方法は?
つ デビッド・カッパーフィールド
>>299 デスクトップのプロパティ → スクリーン セーバー → 電源 → モニタの電源を切るを一分にしてOK → 一分待つ
>>301 黒で塗りつぶしたウィンドウを全面に表示する。ついでに、プログラムの切り替えを無効にする。
しかし、それでも他のプログラムから割り込まれる可能性はあるので、画面消去というのは難しい。
もっとも確実な方法は、画面そのものをユーザーの目に触れないところに移動することだけど、
残念ながら、Cではその処理を行うことは出来ない。
反物質をモニタに接触させれば対消滅するよ。
>>299 DirectXで真っ黒なビットマップをフルスクリーン表示だ!
>>303 > 画面そのものをユーザーの目に触れないところに移動することだけど、
ディスプレイ自体と画面は明確に分けるべきだな。
つまり、CRTディスプレイならブラウン管を、
液晶ディスプレイなら液晶を取り外すのが正しいはずだ。
>>299 もうちょっと何がしたいのか書いたほうがいいよ(笑)
いちいちそんな事しなくても、目を瞑ればいいじゃないか!
>>311 それは見ないだけであって消去することにはならない。
投げ捨てればいいと思うよ
結論としては、Cでは「画面を消去」することはできないということですね。
エスパー募集中の方が自己完結しますた。
Microsoft Visual Studio.NETの2003を使っています。 新規作成でVisualC++のWindowsフォームアプリケーションを選択し、 プログラムを作成したいと思います。何かいい参考書はないでしょうか? この間中身をよく確かめずに買ったテキストはMFCしか扱ってませんでした…
318 :
299 :2006/01/13(金) 15:04:14
コマンドラインの文字を全消去です。 猫でもわかるだと、\x1b[2Jで できるはずなのですができないのです。
コンソールの文字とちゃうの。 curses使うとか。
そうです、コンソールでした。 その、cursesとは?
318 Win9xならできるがNTでは16ビットプログラムでしかできない。
>>320 状況がまるで分からん。そもそもそんなことをする必要性は?
手段を検討する以前のスキルだと思われるから、自分で考えた
手段を聞くより、総合的に何をしたいか聞くほうがいいと思う。
C++でファイルを読み込む前にサイズを知る方法を教えてください。 環境はWindowsなのでAPI使えば良いのは分かっているのですが出来れば環境非依存で標準の範囲で行いたいのです。 よろしくお願いします。
無い。
327 :
デフォルトの名無しさん :2006/01/14(土) 07:11:18
fseekとftellくみあわせたらサイズ収得できるよ
>>326 標準に無いってのはC++使う範囲だと必要無いって事ですかね。
あっても良さそうなもんですが……。そう言われれば納得です。
>>327 調べてみましたがSEEK_END指定してftellですね。
参考にさせていただきます。
ありがとうございました。
>>328 必要ないのじゃなく、標準の想定外。
ファイルサイズの概念がないOSだってあるのだから。
入力した数値を自分の指定した数字&文字の組み合わせに変換することって出来るんですか? 例えば、入力値『110002』→出力値『1B0C2A』みたいに、 1が2つ続くから1B、0が3つ続くから0C、2が1つだから2Bというようにしたいんですけど。 何かやりかたがわかりません。 色々な本とか見て、進数を他の進数に変換するのとかは見つけられたんですけど、 自分で上みたいに指定して数字を変換ことが出来なくて。
331 :
330 :2006/01/14(土) 09:18:13
ちなみにソフトのバージョンはVisual Basic6.0です。
スレ違い。
>>331 ええぇぇ
ここVisual Basicのスレではないよ。
334 :
330 :2006/01/14(土) 09:33:12
あぁ〜間違いましたC++6.0です。
335 :
330 :2006/01/14(土) 09:34:30
何度もすみません、 Visual J++6.0でした。
336 :
330 :2006/01/14(土) 09:37:24
ヒント:ランレングス圧縮
ファイル出力について質問なのですが ofstream out( "test.bin", ios::binary ); この条件で for( int i = 0; i < 1000; ++i ) out.write( (char*)&i, sizeof(int) ); は VC++のエディタで開くと 000000 00 00 00 00 と表示されて いかにもバイナリっぽいんですが for( 略 ) out << i; となると 123456・・・となって バイナリっぽくないんですが、もしかしてバイナリデータでは ないんでしょうか? といのは
340 :
339 :2006/01/14(土) 22:45:29
WriteFile( HANDLE ・・・ ); に対して今まで sprintf( str, "%f\r\n", f ); の str を渡していました、それをVCのエディタで開くと 0.00000 と表示されて 000000 00 00 00 といった具合になってなかったもので もしや、いままでバイナリデータで保存していなかったのか と思った次第であります。
342 :
339 :2006/01/14(土) 23:05:28
>>341 100000までの数字を出力してみたところ
out << i の方が out.write() よりサイズが
大きかったということは
out << i は
バイナリの皮をかぶったテキストだったのか・・・!!
アフォか。てきとうなバイナリエディタ使って自分で確認しろよ。
>>342 ios::binaryフラグの意味を誤解してる。
それはROWモードで開くか、COOKEDモードで開くかを決めるだけ。
それもWindowsにしか意味がなく、UNIXやLinuxではどちらも同じ。
std::ostream::put()でも使う事だな。
えーと、 知ったかぶって、理解して無いくせにrawとcookedという用語を使うのは ちょっとみっともないと思います。
>>345 ぐぐりもせずに私見を述べて優越感に浸っているバカはこいつですか?
>>344 ,346
少なくとも C++ の規格では名前どおりの "binary mode", "text mode" が使われてるのに
ここで"ROW"だの"COOCKED"だのを持ち出しているのはおかしい。
おかしいのに口調が偉そうなのは、確かにみっともない。
用語をスペルミスしといて、偉そうにぐぐれとか言うのも大変みっともない。
>>347 スペルミスではなく、OS側から見た視点だけの事。
そういう些細な事で揚げ足を取りたがるのは、自信がない証拠。
ミスを認めないのは厨房の証拠。
どうしてもミスという事にしたいのが貴方の要望なのですね。 残念ながらその手には乗りませんのであしからず。
ミスというか、無知だな。
OS側から見ると raw が row になるのか。テラオソロシス
いや、デバイスのraw,cookedと ライブラリが'\n'をCR+LFに変換するという動作とは 全く何の関係も無いよ。 知ったかぶってる人がいるみたいだけど。
>ここで"ROW"だの"COOCKED"だのを持ち出しているのはおかしい。 coocked?
cock-a-doole-do
356 :
339 :2006/01/15(日) 00:56:08
風呂にいっとる間に凄い事になっとりますな rawとcookedなんぞ初めて聞きました ググッてみると・・・わからん 奥が深い・・・! で、 out << i を in.readで読み込むと 読めない!(85892741・・・こんな感じ) で、独習C++によると "<<演算子で操作するファイルは、書式設定された テキストを含むファイルなので" どう見ても バイナリの皮をかぶったテキストファイルです 本当に有難うございました。 数々のレスどうもでした。
>>356 だから、被るも何も、改行コードが違うだけだってばさ。
何度みても
>>347 の「少なくとも」が笑える
意気揚々と出てきて1ターンで逃げるなよw
(・∀・)ニヤニヤ
まんこ
特定のクラスからしかインスタンスが作れないクラスを作るには どうやったらいいのでしょうか。 できればコンストラクタも第三者(クラス)から見えないようにしたいのですが。
interface
コンストラクタをprivateにしたクラスを作って 「特定のクラス」をフレンドクラスにしてやるってのじゃだめ?
純粋仮想クラス
インナークラスにするとか。 わかりにくくなるけどな。
367 :
362 :2006/01/15(日) 23:50:54
class A{ protected: A(){} public: virtual void f() = 0; }; class B{ private: class C : public A{ public: C(){/*具体的な処理*/} f(){/*具体的な処理*/} public: A* createA(){return new C(10);} }; int main() { B b; A *a = b.createA(); a->f(); A *c = new B::C(); //<-エラー } こんな感じですか?
368 :
362 :2006/01/15(日) 23:53:15
A* createA(){return new C(10);} の10は不要です。
369 :
デフォルトの名無しさん :2006/01/16(月) 02:04:58
gccでテンプレート展開後のC++コードを出力させる方法はないでしょうか?
>>369 とりあえず、無い。
念のため言っておくが、 template はプリプロセッサじゃないから、
「展開」なんて処理は行われていない可能性が高い。
>>369 インラインテンプレート関数は最適化で痕跡さえ消えるし、アセンブリ出力を読むしか。
templateってC++言語のソースに埋め込むスクリプト言語みたいだよね。 HTMLに埋め込むPHPみたいな感じ。
全然チゲー
>>373 メタプログラミングの視点でみると
>>372 の言うことはある意味間違いではないかと。
実際boost::mplのように
templateをひとつのプログラミング言語として見るライブラリも存在しますし。
とは言ってもスクリプト言語としては可読性最悪ですけどw
375 :
デフォルトの名無しさん :2006/01/22(日) 14:48:02
あるソースに、 #ifdef _DEBUG #define HOGE hoge #else #define HOGE NULL #endif ・・・ HOGE(); というような関数呼び出しの記述があって、 _DEBUGマクロが定義されていないときは NULL()ということになってしまいます。 自分の環境(WinXP + Visual C++ 6.0)で試したところ、 コンパイルしてもNULL()の部分はオブジェクトファイルには 含まれていないようなので問題ないのですが、 これは環境依存でしょうか?それともC言語、C++ともに 仕様で認められている記述なのでしょうか?
376 :
B言語 :2006/01/22(日) 14:51:44
C言語で作ったプログラムってふつうのプログラムみたいにダブルクリックしただけで使えるんですか?それともコンパイラしなきゃだめですか?
∩_∩ ( ・(ェ)・) あ、お構いなく ( ∪ ∪ と__)__)
>>375 ちょっと考えただけだと NULL(); という文はコンパイルできないはず。
>>376 いろいろ誤解しているようだがとりあえず、
C言語で書いたプログラムはコンパイルしないと実行ファイルにならない。
>>376 普通のプログラムの大半はC言語で書かれています
381 :
B言語 :2006/01/22(日) 15:04:58
でもコンパイルしてできたexeファイルを実行しても何も起きないんだけど…
382 :
375 :2006/01/22(日) 15:12:20
>>378 自分の環境だと
C言語としてコンパイルすると
「関数ポインタとして評価されない式を使って、関数を呼び出そうとしました。」
というエラーが発生しますが、
C++としてコンパイルすると問題ない
(
>>375 のような結果になる)ようです。
気持ち悪いので自分では使わないようにします。
>>381 どうせ、一瞬で終わっただけだろ。
GUIプログラムならダイアログでも出せばいいし、そうでないならコマンドインタプリタから実行すればいい。
>>381 それで何か答えてもらえるとでも思うのか?
ここに居る奴らはエスパーじゃないぞ。
具体的な答えが欲しいなら、具体的な情報をまとめてよこせ。
386 :
B言語 :2006/01/22(日) 15:24:27
1つのプログラムをコンパイルしたら .C .EXE .obj .tds とかいう4つのファイルが出てきてそのうちのexeをクリックしても 何も起きずに一瞬で消える現象について解明したいってわけ
まずは質問の仕方についてお勉強して来い そして答えは>383
>>386 「消える」ってことは何か見えてるんだろ?
「何も起きない」とは全然違うじゃねーか。
389 :
B言語 :2006/01/22(日) 15:33:27
失せろクソオタク どーせお前らはパソコンがなけりゃただの安月給の貧乏人だよ負け犬ども
パソコンがある現代では高月給の大富豪で勝ち組です。
>>386 mainのreturn直前にsystem("pause");でも入れ溶けクズ
わはは、なんだこいつ。キレるのはえーな。おまえが失せろよ。
393 :
B言語 :2006/01/22(日) 15:41:32
#include <stdio.h> int main (void) { printf("おはよう\n"); return 0; }
394 :
B言語 :2006/01/22(日) 15:42:34
大富豪さん、大貧民のルールはわかりますか? だったらeME−RU
395 :
B言語 :2006/01/22(日) 15:47:50
すいませんすいません まだ中2なんですぐカッかしちゃううんですよー ぎゃははーーー うひゃひゃ いひゃひゃフォー
396 :
B言語 :2006/01/22(日) 15:50:06
>>391 さんありがとー!!
C言語は一瞬で消えるから今日ヨーカドーで2500円のVsual Basic パーフェクトマスター
買っちゃったー
ぐはわわわわわピー
芸が細かいな。ちゃんと目欄も0に統一してある。 で、中身は何人いるんだい? 便乗荒らしはよくないぞ。 まさか一人って事は無いんだろう? まさかなぁ、はははは、は、は、、、、はぁ。
2500円「仕方ないなあ」 Vsual Basic「だってえ」 2500円「どお?これが2500円よ」 Vsual Basic「ウィンドウが!ウィンドウが!」 一瞬で消えるから「パケット消失」 2500円「まいどあり」 Vsual Basic「Vista・・・」
>>382 つまり、_DEBUG定義時にHOGE関数が必要で、それ以外の時にはそもそも必要無いのだろ?
だったらそんな不確実な書き方せんと、
HOGE()の所を↓にしとけよ
#ifdef _DEBUG
hoge();
#endif
400 :
B言語 :2006/01/22(日) 16:05:26
しかも買ってから気付いた事 Visual Basic でプログラミングするには金がかかる ギャーハハハハ
401 :
B言語 :2006/01/22(日) 16:06:27
そーゆーことはちゃんと前書きにかいときなさぁぁぁぁぁい!
402 :
B言語 :2006/01/22(日) 16:07:11
こっちは数少ないこづかいでヤリクリしとんじゃいボケッ!””
むしろこずかいが無い方がおまえさんのタメになるかと。 ここに書くヒマがあったらネット検索で勉強しなさいナ。
404 :
B言語 :2006/01/22(日) 16:12:47
おーいらーのーあーーたまーはーつーるっぱげー がってんだ! ボリショイサーカス
0100:0101:0001:0110:1001:0101:0101:0000:0100:1010:1010:01011:1101:01010:1011:0101:0101:0101:0100:1111:1000:1011:0001:0100:0001
ていのうだなのまおどえらばかだろねあいにえしてんだぼけさわんあjふぃ!母は母八は母はhhッははhhっはっははははははははっははははhっははっははhhh
4人ぐらい?
5人じゃね?
6人だお
>399 それだと何カ所もある場合めんどくさいじゃん。 #ifdef _DEBUG #define HOGE() hoge() #else #define HOGE() #endif
411 :
しろうと :2006/01/22(日) 17:25:22
Visual Studio C++でご質問があります。 クラスを使用して、戻り値の配列を返したいのですが どうすればよいでしょうか? ご指導お願いいたします。 #include "stdafx.h" #include "iostream" #include "string" using namespace std; class TEST{ public: string test[10](string work[10]) { return(work); } }; main(){ TEST T; string a[10]={"1","2","3"}; for(int i=0;i<3;i++){ cout << a[i] << endl; cout << T.test[i](a) << endl; } }
412 :
>411 :2006/01/22(日) 17:26:52
すみません訂正します。 クラスを使用して、戻り値の配列を返したいのですが ー> クラスを使用して、戻り値に配列を返したいのですが
413 :
B言語 :2006/01/22(日) 17:27:17
てめえらひまだなオタッキー
乗り遅れカコワルイ
>>411 配列は戻り値にも引き数としても直接受け渡し出来ない
416 :
デフォルトの名無しさん :2006/01/22(日) 17:33:27
初心者でもお気楽にWin32APIを呼び出せるように ライブラリ化したコードとか提供されていないのデツカ?
(°Д°)ハァ?
>>411 配列は戻り値にできない。そこでどうするかというと、
単純な方法ではnew []して動的メモリを返したり、
戻り値の代わりにポインタとその要素数を引数にしたり、
或いは要素数が固定なら配列の参照を引数にしたり。
しかしstd::vectorとかboost::arrayのような配列の代わりにクラス(・構造体)を返す方法がよりよいと思う。
>>418 ますますお気楽とは正反対の方向だと思うけど。
>>416 Win32API自身もライブラリだよ、お気楽かどうかはともかく。
ゴキゲン
ナナメ
パンパンパーン ∴ _, ,_ ∩ , ・,‘ ( ゚Д゚)彡☆ ⊂彡☆))Д´) .∴∴☆ . ∴
424 :
しろうと :2006/01/22(日) 18:18:26
ご返事ありがとうございます。 どうも感嘆にはできないのかー。 逃げ道はあるようですがなんか難しそうですね。
425 :
しろうと :2006/01/22(日) 19:53:23
VisualStudioC++を使用しています。 string s[100]={"a","b"}; 配列の要素数を求める関数教えてください。
>>425 sizeof(s) / sizeof(s[0])
「関数」だそうだぞ。
template <typename T, std::size_t N> inline std::size_t lengthof(const T (&)[N]) { return N; } lengthof(s);
>>425 template <typename T>
inline int sizeofarray(const T& a) {
return sizeof(a) / sizeof(a[0]);
}
(゚Д゚)ハァ?
列挙型の設定ファイルに書き出し/読み込みをしたいのですが、コンパイラの警告無視の強引なキャストまたはswitchによる物量作戦以外のスマートな解決方法はないでしょうか?
>>431 >列挙型の設定ファイルに
「列挙型を」って言いたいのか?
別に値のまま書き出せばいいじゃん
それとも設定は人が書くようなもんなの?
>>431 reinterpret_castを使うのなら強引だと言えるが、
列挙型から整数型へは昇格があるし、逆もstatic_castで十分だし、強引なことは何も必要ないと思うのだが。
434 :
431 :2006/01/22(日) 21:46:37
うへ、暗黙のキャストでやってたorz
435 :
デフォルトの名無しさん :2006/01/22(日) 22:18:17
これからC言語を始めようと思っているのですが、 いい参考書ありますか?? 文字ばっかり羅列しているより例題みたいなとかが 載ってるのがいいのですが......
437 :
デフォルトの名無しさん :2006/01/22(日) 22:42:02
>>431 列挙体型のサイズは処理系依存なんで、
キャスト後のサイズと違うことがあって問題になる可能性がある。
例えば、含まれる値が SHRT_MAX 以下なら
short int のサイズになる処理系があってもいいわけだが、
そういう場合、int が 32 ビットなら、
int と仮定して処理しようとするとおかしくなる。
DirectX 関係の列挙体に一見余計な 0xFFFFFFFF という値が入ってるのは、
そういう処理系でも列挙体のサイズが 32 ビットになるようにするため。
一番いいのは、void* を引数に取って、サイズを指定して読み書きする関数を使うこと。
これならキャスト絡みの問題も列挙体まわりの問題も回避できる。
439 :
デフォルトの名無しさん :2006/01/23(月) 07:56:59
すみませんスレ違いかもしれませんがどこが適切か分からないので
質問させてください。
lame_enc.dllについてお聞きしたいのですが、
lame_enc.dllは色々ダウンロードできるサイトがいくつもありますけど、
例えば
http://www.mp3-tech.org/encoders_win.html http://www.rarewares.org/mp3.html もしくはWinamp5以降のFULLバージョンでインストールした場合のプラグインフォルダ内とか…
すべて名称はlame_enc.dllなのですがファイルの大きさがそれぞれ違います。
lame_enc.dllによって性能の違いとかはあるのでしょうか?
私の場合ネットラジオでの音声配信でMP3エンコードするためにlame_enc.dllを使用していますが
音質改善のためにもし、lame_enc.dllに性能の違いがあればより良いものを選びたいと思っています。
スレ違いかもしれませんが、どなたか分かる方いらっしゃいましたらよろしくお願いします。
尚、いくつか違うlame_enc.dllを試してみたのですが、配信される音質が微妙に違うような気もしました。
スレ違い
441 :
デフォルトの名無しさん :2006/01/23(月) 08:01:12
>>440 じゃぁどこがいいですかね?
教えていただけると助かります。
自分で探せよバカ
443 :
デフォルトの名無しさん :2006/01/23(月) 08:04:13
>>442 どうせ知らないんだろw
知ったかぶり乙
つーか鼬害。
なんでこんなバカがム板に来たんだろね・・・
>>445 バカじゃ無い奴は、大抵の問題を自分で解決できるから。
自演乙w
>>439 耳に頼るんじゃなく、差分取って確認しる。
C++について質問です。 基底クラスB(メンバ関数はvirtualで宣言)を継承したクラスAのポインタを Bにキャストして、そのメンバ関数を扱うのは安全なのでしょうか?
B“のポインタ”にキャストするならば安全。 というか、それこそが多態性というものでは。
>>450 ありがとうございます。
これで心置きなく使えます。
別にキャストしてもしなくても同じじゃないの?
>>452 同じじゃあない。
#include <iostream>
using namespace std;
class super{
public:
void foo(){ cout << "super" << endl; }
};
class sub : public super{
public:
void foo(){ cout << "sub" << endl; }
void bar(){ cout << "hogehoge" << endl; }
};
int main(){
sub* pSub = new sub();
super* pSuper = pSub;
pSuper->foo(); // "super"
((sub*)pSuper)->foo(); // "sub"
pSub->foo(); // "sub"
pSub->bar(); // "hogehoge"
//pSuper->bar(); // error
return 0;
}
455 :
453 :2006/01/25(水) 00:27:29
>454 ごめんなさい。
456 :
デフォルトの名無しさん :2006/01/26(木) 19:43:10
C言語を使ったCGIで自分の掲示板を作ってみたいので、 作り方のヒントになるような書籍やサイトがあったら教えてください。 基本的なHTMLの知識や、ファイル操作のやり方は分かるのですが、 win98環境でオフラインテストをする方法から分からないので、 よろしくお願いします。
>>456 まずは「CGIとは何か?」から調べた方がよさそうだな。
>>456 オフラインでテストならフリーのサーバーソフトが必要
459 :
456 :2006/01/26(木) 23:16:35
>>457 CGIはサーバ上で動作するプログラムというように解釈しています。
掲示板をつくりには、HTMLで記載したフォームからプログラムへ、
データを送信して、処理を行わせ、実行結果を返すことが必要かと…
違っていたらゴメンナサイ。教えていただけると、助かります。
>>458 アパッチなどのことでしょうか?
サイトの説明を見たのですがよく分からなかったので、
その辺りを分かりやすく解説してある書籍かサイトを、
紹介していただけると、助かります。
よろしくお願いします。
教えてクン乙
461 :
459 :2006/01/26(木) 23:30:07
ゴメンナサイ。別のソフト、AN HTTPDの方で調べていったら、 何とか分かりそうなサイトが見つかりました。 こちらで勉強してみます。失礼しました。
462 :
デフォルトの名無しさん :2006/01/26(木) 23:40:24
CreateGame〜陸海空オンライン〜開発始動! 有志によるMMOというジャンルのゲーム製作です。 参加資格:力ある者
>>462 プロデューサーが最悪と言うことはよく解った
整数 n (>0) をキーボードより読み込み、それを以下の様に 因数分解するプログラムを作れ。 54=2.3.3.3. 306=2.3.3.17. #include <stdio.h> main(){ long d,n; printf("n=?"); scanf("%ld",&n); d=2; /* 以下d でnを順に割って行く*/ while(1){ if (n==1) 【 A 】 if (n%d==0) { printf("%ld.",d); n=【 B 】;} else d=【 C 】; } printf("\n"); } これがわかりません、教えてください
宿題は宿題スレいけ
失礼した
質問です。 ガベコレが便利とかいう話はそりゃ組むだけの奴の勝手な理論であって、 メモリの確保/解放が明示的にできてないプログラムって可読性悪いよなってことでFAでいいでしょうか?
ふぁ?
ほぇ?
用途による
可読性は関係ないんじゃないか? 明示的な確保/解放を追いたいときは別だろうが、 そんなときにガベコレ使うバカは50%くらいしかおらんだろうし。
問題は用途だな。 ガベコレに頼ろうとする奴は確保と解放を同じクラス内で 完結させようとはしないだろうからな。 あっちのクラスで用意したインスタンスを こっちのクラスで解放するなんてこと普通にやってた環境なら ガベコレなんぞ使ったら可読性は悪いな。
>>461 CGIのプログラミングの前に、
HTTPのプロトコルの仕組みや、CGIの動作概要を覚えておくべき。
それが分かれば、
>>456 の様な質問は出なかったはず。
勉強の順番を間違っちゃいかんよ?
#include <iostream> int main() { std::cout << "Content-Type: text/html" << "\r\n\r\n"; std::cout << "<html><title>Test of CGI</title><body><p>test.</html>" }
その前に、「Cじゃないやん!」ってつっこんであげようよ
そこをあえて黙っておくのがオトナの対応
LANでTCP/IP(つーかソケット)を使った簡単なファイル転送プログラムを作ってみたいのですが、 ソケット通信周りの手頃なサンプルはないもんでしょうかね。 ファイル転送と言ってもファイル名やらタイムスタンプやらは後でどうとでもなるので、 単に中身だけが転送されればいいのだけれど。 探してみても、簡単すぎて固定長のKB以内のデータしか転送してなかったり、 逆にftpばりに高機能だったりで…… #Solaris/Linux/Cygwin(OrPSDK)で動かしたいというのもサンプル見つける障碍だったり。
>>478 十分なサンプルだと思うけど?
何が不足していると思うわけ?
マルチプラットホームの部分?
[開始文字] (データの情報)データ [終了文字] を相手に送りつければ良いんじゃねえの?
481 :
478 :2006/01/29(日) 17:49:19
>>480 終端文字まで受信することにすると、終端文字を含むファイルを送れない可能性が出てきてしまうので巧くないと思われ。
予めデータサイズを送れば(先頭に付加するなどして)よさそうだけど、サイズ分(例えば8バイト?)がパケット分割される可能性は?
また、途中でデータの流れが滞ったらタイムアウト処理しなければいけない?
など考えなきゃいけないことが多そうで、その辺りを反映したロジックが転がっていないかなぁと。
>>479 確かに、SolarisとLinux(orCygwin)とWinAPI(Winsock)の微妙な違いもよく判らない。
Linux用のサンプルがSolarisやWinsockだとそのままでは動かなかったりね。
単にネットワークプログラミングの知識が不足してるだけと思うんだが ECHOサーバ以外になんか作ったか?
>>481 制御用とデータ用の2セッション持ってば?
それか、TFTPの規格でも参考にしたらどうよ?
485 :
478 :2006/01/30(月) 01:02:51
>>482 あはは、ばればれっすな。
ECHOサーバ以外には簡単な送受信プログラムをメンテナンスしたことくらいしかありません。
>>484 TFTPですか。調べてみます。
……なんだ、やりたいことはほぼこれですね。サーバはSolarisかLinuxだからtftpdを使えば
tftpクライアントを実装するだけな気が……
>>485 既製でいいなら、TFTPクライアントをインストールすればいいジャマイカ
VSC++2005EE落としてこれからC言語覚えようと思い、 なにか本でも買おうかと思うのですが、 CができないとC++覚えるのはきついでしょうか。 あとWin32APIについても別に本を買って覚えた方がいいんでしょうか。
>>487 とりあえず本読め
後のことはそれから考える。
Express Editionか、Enterprize Editionかと一瞬思ってびびった
もとい、Enterprise
>>487 C++からいきなり覚えてもよいと俺は言いたいのだが、
世の中の大半のC++の入門書はCができることを前提にしているから仕方がない。
そこでAccelarated C++ですよ。
493 :
492 :2006/01/31(火) 22:06:55
訂正。Accelerated C++
Cに対応した正規表現パッケージはありませんか?
相対パスを格納した文字列から 絶対パスを格納した文字列を得るポータブルな方法はありますでしょうか? Visual C++ だと _fullpath() という関数があるのですが、 他の環境でも使えるような方法があれば教えてください。
497 :
デフォルトの名無しさん :2006/02/01(水) 08:01:54
Visual C++ では ANSI 標準関数には _ なしの名前が、 ANSI非標準の関数には _ 付きの名前が割り当てられています。 これは POSIX 関数には _ 付きの名前が割り当てられる ということを意味しますか?例えば MSDN Library では getcwd の代わりに _getcwd を使うよう推奨しています。 しかしこうすると同じコードを UNIX/Linux などに 持って行ったときに修正が大変です。 Visual C++ / cygwin / Linux でポータブルなプログラムを 書きたい私は getcwd と _getcwd のいずれを使うべきでしょうか?
・どっかからポータブルなライブラリを拾ってくる。 ・自分で作ってそこに環境依存な処理を隠蔽する。
499 :
デフォルトの名無しさん :2006/02/01(水) 08:45:52
MSDN Library を呼んでいると、 「Visual C++ 2005 では、この POSIX 関数は使用しないでください。 代わりに ISO C++ 準拠の _getcwd を使用してください。」 と書いてあるのですが、 _getcwd って ISO C++ 準拠なんでしょうか?
501 :
デフォルトの名無しさん :2006/02/01(水) 10:28:24
やっぱマクロ使って表記統一ですか。 皆様ありがとうございました。 ちなみに余談ですが、プラットフォーム間パスの表記の違いは boost::filesystem::path で切り抜けることにしました。
int_ntop,inet_ptonはスレッドセーフなのでしょうか? 環境は以下の通りです。 Redhat Linux カーネルver 2.4.21 gcc 3.2.3
Windowsの編集ボックスでIMEの変換をすると、 1単語変換するごとに100KBほどメモリリークするようなのですが、 これは何とかならないのですか? 同じ単語を変換してもメモリ使用量は増えないので、キャッシュと見ることもできますが、 それでも、何千単語も変換されるうちにメモリ使用量が数百MB増えてしまいます>< 根本的な解決にならなくてもいいので、何か回避策を教えてください。
>>503 C/C++と何の関係があるのか?と小一時間(ry
>>503 ついでに、おまえは実際何千単語も変換してメモリ使用量の変移を確認したのか?と小一時間(ry
506 :
503 :2006/02/01(水) 18:29:47
プログラムを最小化したらなぜか開放されました。
その線で探ってみます。
>>505 いやまじです。新しい単語を次々変換していくと、本当に100KB程度ずつメモリ使用量が増えていきます。
だから実際に何千単語もやったんかと
メモリー使用量なんぞでメモリーリークを検出できると思ってる馬鹿はほっとけ。
ていうか、最小化で解放されてるんだからリークではないわな。
510 :
503 :2006/02/01(水) 19:00:26
どうやらWindowsのWorkingSetという仕組みが絡んでるようでした。
なぜか必要なメモリの数倍のメモリを確保して、必要なくなってもすぐに開放しないと。
SetProcessWorkingSetSizeで強制的に全て開放させられるのですが、必要なメモリもスワップされちゃうので、
もうちょっとましなやり方がないか探してみます。
>>508 必要ないメモリを開放しないこと=メモリリークと思ってましたが微妙に違うようですね><
>>509 最小化しないアプリを作ってるんです><
というか定期的に最小化するアプリを作るわけにはいかないので・・・。
リークではないけど、他のプロセスがメモリを使いたくても使えなかったり、
システム自体が重くなるので、無駄なメモリの使用は避けたいのです。
たとえリークでも、一度プロセス終了して起動しなおせば開放されますけどね・・・。
>>511 「無駄なメモリーの使用」かどうかは君が判断することじゃない。
513 :
503 :2006/02/01(水) 19:41:41
>>512 どうしてもWindows用の高効率アプリを作りたいので、自分で判断したいのです><
予約してるメモリだけを開放する関数はないのだろうか・・・。
一時的に巨大なメモリを割り当てて故意にスワップを起こさせたら メモリの空きが増えるかも(メモリクリーナの動作原理らしい) でもCPU使用率が上がるから効率悪いがwwww
515 :
503 :2006/02/01(水) 20:23:34
>>514 SetProcessWorkingSetSizeで使用量をほとんど0にできるのですが、
負荷が大きすぎるし、必要なメモリまでスワップされてスローダウンするので、
予約してるメモリだけ開放できる方法がないか探してます。
>>514 そんなことしたら、別のプロセスで必要なメモリがスワップに追いやられたり、
仮想メモリと物理メモリのアドレスのキャッシュも消えたりして、いいことなんてまったくないと思うが。
>>515 IMEと同じものを、自分で実装したまえ。
そこまで気にする貴方なら、
さぞかしすばらしくメモリ効率のいいものを、実装できるはずだ。
>リークではないけど、他のプロセスがメモリを使いたくても使えなかったり、 >システム自体が重くなるので、無駄なメモリの使用は避けたいのです。 そのへんはOSがよきにはからってくれるので気にするな。 >なぜか必要なメモリの数倍のメモリを確保して、必要なくなってもすぐに開放しないと。 メモリを1バイト単位で管理してるわけじゃないからね。 ページサイズ分はどうやっても確保されるんじゃね
>>487 氏ではないけど、Express Edition落としてVC始めようと思ってるんだけど、
誰かVC#2005EEとVC++2005EE、どっちがどう違うのか教えてくれ(´д`υ
MS-DOS上でMSCv6扱ってたことはあるんだが、Win+VCとなると使ったこと無いので差が判らんなりよ。。
教えてクンは氏ね
520 :
デフォルトの名無しさん :2006/02/01(水) 21:59:55
>>518 どの言語かもわからんやつが来る場所ではない
初心者以前じゃ
522 :
503 :2006/02/01(水) 22:22:21
>>516 激しくめんどくさそうですが、IMEを自作すれば色々とメリットがあるので、
その線で検討してみます。
523 :
503 :2006/02/01(水) 22:45:34
IMEを自作するくらいなら編集ボックスを自作した方が簡単そうなので、 こっちにします。 文字列変換が必要になったら別プロセスを立ち上げ、変換が終わったらそのプロセスを終了する。 これで無駄なメモリ使用とおさらばできるはずです。
524 :
503 :2006/02/01(水) 22:53:27
プロセスの起動と終了を繰り返すのも効率が悪いから、 文字列変換用のヘルパープロセスは起動しっぱなしで、 変換が終わったらSetProcessWorkingSetSizeでメモリ開放した方が効率いいかな。
つ[チラシの裏]
ちょっと待ちなさい。 あなたのような潔癖症の人間は、OSから作った方がよいと思われます。
というか、釣りでなければ、思考が80年代だぞ。
メモリの容量や用途は、時代とともに変わっていくもので、
MSの、Windoesのメモリマネージャ開発者もそのことは十分承知している。
Windows95などでは、使われなくなったメモリは、
かなり早い時点でスワップに退避させるような設計になっていると思う。
あの頃はメモリ数十MBだったから。
でも今は、1, 2GBのメモリをつんでいる人も珍しくないので、
必要になるまで、物理メモリを割り当てたまま放置するような設計になっていると思う。
やはり
>>503 は、OSから自作すべきだと思うよ。
528 :
503 :2006/02/01(水) 23:12:59
>>527 「必要になるまで、物理メモリを割り当てたまま放置するような設計」
というのは理解できるのですが、
いざ必要になったときの処理がものすごく適当なので、その設計には頼りたくないのです。
というかOSの設計者はメモリが不足したときのことをぜんぜん考えてない気がします。
XPあたりで一番物理メモリくわえ込んでるのはファイルキャッシュだったりするがな。 おかげでウィルスキャッシュとかGoogle DesktopみたいにHDDスキャンするアプリがキャッシュ無効せずに走ると一気にメモリが枯渇する
>>529 あるある、
DVD焼いたりしたりすると、起動中のアプリとか、どんどんスワップアウトしていきやがる。
ほんとアレ何とかならんのかね?
531 :
503 :2006/02/01(水) 23:28:13
>>530 64bit版のOSにしてHDDの数倍のサイズのメモリを積んどけばいいのでは?
532 :
503 :2006/02/01(水) 23:31:08
すいません冗談です>< ディスクキャッシュのサイズを制限するか無効化すれば良いと思います。 XPでどうやるのか知りませんが。
Itaniumなんか使ってられっか!
>>532 結局のところスワップアウトが嫌なら、ページファイル無効にしとけばいいんじゃないの?
>>503 さっきから訳の解らないこと行ってるんじゃネェヨ!
てめぇの言っている現象はリークじゃねぇ、
と皆さんが言っているのに、何故聞き入れないのだ?
536 :
503 :2006/02/02(木) 00:24:27
混沌としてるなー・・・。
>503はLinux使うと虫唾が走るんじゃなかろうかw
なんでそこまでメモリ使用量にこだわるかな・・・
503は病気なんです、皆さん温かい目で見守ってください
540 :
503 :2006/02/02(木) 00:36:42
スレが荒れてしまってすいません><
マジレスすると、ATOK2004はDOS窓でメモリリークするバグがあったはず。 ATOK2005にしてからは直っている。もうすぐ2006も出るし、FEP変えるとか。
542 :
503 :2006/02/02(木) 00:42:31
543 :
デフォルトの名無しさん :2006/02/02(木) 04:54:06
いったいなんて言うツールでメモリ使用量見てるのさ。
>>503 が「メモリ消費」っていってるのは、おそらく
>>503 が脳内でイメージしているメモリ消費とは違うと思うんだが。
>>541 > FEP
最近ではIMEが正しいらしいよ
# 漏れもFEPの方がしっくりくるが。
546 :
503 :2006/02/02(木) 23:19:30
SetProcessWorkingSetSizeの最小と最大に、 GetProcessMemoryInfoで取得したページファイル使用サイズ(こっちが本当に必要なメモリサイズらしい)を指定したら、 不要なメモリだけ開放できたっぽいのでこっちでいきます。 うまく動作しなかったら、またヘルパープロセスでIMEを操作するやり方にしますが。 簡単な解決策が見つかって良かった><
ポインタが指すオブジェクトの存在を 確認する事は出来るんでしょうか int *pa, *pb; pa = new int; *pa = 5; pb = pa; delete pa; pa = NULL; if( pb ) cout << "在るでよ。" << endl; ポインタが指す delete C++ -java とググッてもなかなか見つからない。 やはり無いのでしょうか。
>>547 やはり環境依存のコードを書くしかないんじゃないかな。
Windows限定で言うと、
実際にアクセスしてみて、問題なければ存在している。
メモリが割り当ててなければ、AVが飛んでくるから、
構造化例外で受けて、何事もなかったかのように実行再開
よほど特殊な事情がない限りお勧めできない
(大量のメモリを予約だけしてコミットしない、必要な部分だけコミットする。)
>>548 それだとdeleteがOSにメモリを返さずにプールする実装だと死ぬなw
>>547 C++ならboost::weak_ptrとboost::shared_ptrの併用で良いんじゃないの
550 :
547 :2006/02/04(土) 20:10:58
レス有難うございます。
>>548 Win環境だけならアクセスして、ポインタ先を見るのですな。
>>549 boost::shared_ptr初めて見ましたのでググッてみました
なるほど。参照の状況によって適切にdeleteなんぞしてくれるのですな。
スバラスィ
どの様な環境にも耐えられるように
>>549 案でチャレンジしてみます。
有難うございました。
551 :
547 :2006/02/04(土) 20:15:59
boost C++ Libraries 英語が読めんとです・・・ ここは自分でポインタを しっかり管理するしかないですな ひと段落したら boost をやっちみます
554 :
547 :2006/02/04(土) 20:47:19
>>552-553 おお!日本語サイトですか有難うございます
しかしながら
ラインセスは英語で小難しいとです・・・
エキサイトにぶち込んでみたところ
無料で提供します。
版権情報と注意書きはちゃんと書いてください。
という事でいいんでしょうか。
わからないのが”ライセンス交付金”という奴なのですが
boostのライセンスに、特に気にするような部分なんてあったかな。 商用でもOKで、ソース公開の義務もないし、 boostを手本にして書いたコードは、勝手に自分独自のライセンスにしてOKだったはず。
556 :
547 :2006/02/04(土) 21:11:48
>>555 そうだったのですか。
小難しく考えすぎました。
557 :
547 :2006/02/05(日) 00:13:50
boostの威力を堪能 おかげさまで、コードが綺麗になりました 数々の情報有難うございました。
558 :
デフォルトの名無しさん :2006/02/06(月) 06:59:13
GNUのindentみたいなソース整形ツールの、 GUI風に使えるソフトがありましたら教えてください。
559 :
デフォルトの名無しさん :2006/02/06(月) 09:38:37
Windows XP & Borland C++ 5.02Jでデータ処理アプリケーションを作っていますが、 バッファを確保しようとするとAccess violationエラーが発生します。 unsigned* pBuf = new unsigned[150000]; // ここでエラー発生 . . delete [] pBuf; 1GもRAMを搭載しているのに60万バイトのメモリブロックすら確保できないのは なぜでしょうか。
561 :
デフォルトの名無しさん :2006/02/06(月) 09:54:18
32ビットモードでコンパイル・実行しています。 念のためコンパイラのオプションでヒープサイズを変えられないか調べてみましたが、 それらしい設定項目は見当たりませんでした。 ひょっとして.defファイルの中でヒープに関する設定をする必要があるのでしょうか。
>>559 マジレスすると、確保できる量はだいたいOSと、コミットできるメモリ量で決まる。
WindowsXPなら、何もいじらなければおおよそ2GBまで確保できる(スワップ
ファイルを含む)
俺も5.02Jを使っていた事があるけど、その程度ではビクともしないはず。
試しに、newでなくて、staticでどれだけ確保できるか試してみそ。
それと、5.02Jは古いC++なので、bad_allocを返さないので、pBufが
0だったら確保に失敗しているよ。
.DEFのHEAPSIZEは、省略時は4096、つまり4Mバイト。 今は 4 × 150000 = 600000 バイト必要なんだから、HEAPSIZEを 1000000 くらいに設定してみてはどうか。
久しぶりに5.02Jの分厚いマニュアルを出して来たので、頭が混乱してる。 600000バイトって600Kバイトだから、デフォルトで足りそうなんだが・・・・
int Complex::im(){ return imaginary; } int Complex::re(){ return real; } .... //非メンバ関数 ostream& operator<<(ostream &out, const Complex &cNumber){ out<<"Complex:"<<cNumber.re()<<"+i "<<cNumber.im(); return out; } というような感じの関数があるのですが、これをコンパイルすると 「error: passing 'const Complex' as 'this' argument of 'int Complex::re()' discards qualifiers」 というメッセージが出てくるのですが、 re()の中でも im()の中でもメンバーには手をつけてないのにこのエラーが出るのはなぜなのでしょうか?
566 :
デフォルトの名無しさん :2006/02/06(月) 11:11:58
関数間でデータを受け渡す場合これでいいんでしょうか? char* test(){ return "koredeiinokana"; //←本当はデータを取得するから大きなデータ } void main(){ printf(test()); } ポインタを直接渡していいのかいまいち自信がありません。
>>566 test()が返す文字列の中に書式指定文字列があると、
変な事になるぞ。
568 :
599 :2006/02/06(月) 11:19:20
レス、どうもです。
>>562 unsigned* pBuf = new unsigned[150000]; // ここでエラー発生
を
static unsigned pBuf[1000000]; // 4M byte
としたらエラーは発生しませんでした。
>>563 私も原因はそれかなと思い、バッファサイズを10000byteに減らして見ましたが、
やはり確保に失敗しました。
ちなみに
>>559 のトラブルはメインウィンドウを作成せずにバッチ処理だけを実行
するアプリケーションで発生しました。メインウィンドウを作成するアプリで同
サイズのメモリブロックを取得・解放する場合にはエラーは発生しません。
うーん訳わからん。原因追求するよりは素直にC++Builderあたりに移行した
方が速いのかも。
>>568 変ですねえ。コマンドラインであっても、GUIベースであっても、
基本的には同じはずなんですが。
staticで確保できるって事は、ヒープ領域は問題なさそうですね。
5.02Jインストールしてあるマシンが手元にないので、はっきりした
事は言えないのですが、記憶では、何もしなくてもそのまま動作
したような記憶があります。
>>568 アプリによって動作が変わるんなら、エラーの出るほうでヒープをぶっ壊してるんだろう。
>>565 int Complex::im() だと this の型は Complex* になる。
この場合は Complex const* を受け取るようにメンバ関数の宣言(定義)を変えればいい。
int Complex::im() const ...
int Complex::re() const ...
>>571 なるほど… constを関数宣言の最後につけるんですね。
新しい文法をまた学びました、ありがとうございます。
現在大学の研究用にプログラムを書いているのですが、 newで確保した三次元配列をdeleteで開放してもメモリ使用量が変わりません。 とりあえず次のような簡単なプログラムで確認をしているのですが、 繰り返すたびにメモリの使用量が増えていきます。 おかしいところはあるでしょうか?ご指導よろしくお願いします。 #include<fstream.h> #include<math.h> double ***test; main(){ int i,o,t,n,m; while(1){ cin>>i>>o>>t; test=new double**[i]; for(n=0;n<i;n++){ test[n]=new double*[o]; for(m=0;m<o;m++){ test[n][m]=new double[t]; } } for(i=0;i<3;i++)cin>>test[0][0][i]; for(i=0;i<3;i++)cout<<test[0][0][i]<<endl; for(n=0;n<i;n++){ for(m=0;m<o;m++){ delete[] test[n][m]; } delete[] test[n]; } delete[]test; test=NULL; cout<<"END test"<<endl; } }
574 :
573 :2006/02/06(月) 15:18:01
忘れてましたがコンパイラはborlandの物を使っています。
>>574 この部分でi書き換えてるからループの回数がおかしくなったんだよ
for(i=0;i<3;i++)cin>>test[0][0][i];
for(i=0;i<3;i++)cout<<test[0][0][i]<<endl;
576 :
575 :2006/02/06(月) 15:23:28
つまりこの部分のiが狂ってるってことな for(n=0;n<i;n++){
577 :
573 :2006/02/06(月) 15:31:40
レスありがとうございます。 うかつでした・・・ しかし、書き換えてみたのですがやはりメモリが増え続けてしまいます。 グローバルでの宣言が駄目なのでしょうか?
>>577 どう書き換えたの?
こっちではその部分の書き換えでリークは無くなったけど。
あと無理してnewしなくてもstd::vector使ったほうが良いと思うよ
タスクマネージャのメモリー使用量で確認してる痛い子ってだけだろ?
580 :
デフォルトの名無しさん :2006/02/06(月) 16:19:11
int main(){ print }
581 :
573 :2006/02/06(月) 16:26:36
とりあえずその部分のiをnに変えてやってみました。 std::vecterを試してみます。
>>581 vectorでそれと等価になるように書けばこんな感じ
#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
vector<vector<vector<double> > >test;
int main(){
int i,o,t,n,m;
while(1){
cin>>i>>o>>t;
test.assign(i,vector<vector<double> >(o,vector<double>(t)));
for(n=0;n<3;n++)cin>>test[0][0][n];
for(n=0;n<3;n++)cout<<test[0][0][n]<<endl;
cout<<"END test"<<endl;
}
}
>>559 Windowsでそんなに大量のメモリを確保するのなら、
直接VirtualAllocを呼ぶほうがよい。
584 :
599 :2006/02/07(火) 11:55:48
>>583 さん
レス有り難うございます。
VirtualAllocについては初めて知りました。ただ件のアプリの場合は、同じコードを
コマンドラインで実行するとエラーになり、GUIではならないことから
>>570 さんの
ご指摘の通りどこかで不正な処理を行っていると思われます。もっとも特定は
かなり難しそう。と思っていたら、あれれ、おかしいぞ
int *p = new[1000000];
delete [] p;
この二行をコードの随所で実行してどこでエラーが生じるか調べていたんですが、
配列の長さを即値で渡しているときにはエラーにならないのに、
int len = 1000000;
int *p = new int[len];
と配列長を変数で渡すとエラー発生。はて?
ヒント:intが2バイト
Borland C++ 5.02Jのintは4byteだった希ガス。 16bitコード吐けたっけ?
>>585 559 に「Windows XP & Borland C++ 5.02J」とあるから、さすがにそれは無いと思うよ。
>>586 16bitコード吐けるけど、デフォルトは32bitだよ。
デバッガ走らせてCPUウィンドゥを開けばすぐわかる。
589 :
559 :2006/02/07(火) 13:32:50
原因判明(多分) int XXX(const string& param) { // paramの保持する文字列から", "で区切られたトークンを逐次取り出す char* pchBuf = new char[param.length()]; strcpy(pchBuf, param.c_str()); char* p = strchr(pchBuf, '=') + 1; for(p = strtok(p, ", "); p; p = strtok(0, ", ")) { . . } delete [] pchBuf; } これを実行すると 1.最後のトークンの語尾に不正な文字が付け加えられる。 2.直後にnewでメモリブロックを確保しようとするとエラーが発生。 char* pchBuf = new char[param.length()]; を char* pchBuf = new char[param.length() + 2]; として余分なスペースを確保してやるとエラーは発生しなくなりました。 一見関係なさそうだったので気づくのが遅れ、どうもお騒がせしました。 それにしてもヒープ管理にまで支障をきたすとは、strtokは使い方を間違うと大変ですね。
>>589 お前馬鹿か?
strtok以前にここで問題に気づけ。
char* pchBuf = new char[param.length()];
strcpy(pchBuf, param.c_str());
#といっても俺もこのミスたまにやるんだよなぁ
いい加減Cの文字列処理関数はまとめて捨てろ。
ヌルターミネータの領域を考慮する癖は 絶対につけておかねばな。
char* pchBuf = new char[param.length() + 1]; param.copy(pchBuf, std::string::npos); pchBuf[param.length()] = 0; が正解かな なんか長くてうっとうしいな
char* pchBuf = strcpy(new char[param.length()+1],param.c_str());
strdup は奨めちゃいかんな
>>595 strdupが定義されて無い環境では自分で定義する。という条件付なら良いんじゃない?
ほんの数行だし
char*strdup(char*p){
size_t len = strlen(p);
char*r=malloc(len+1);
if(r)memcpy(r,p,len+1)
return r;
}
>>589 =559
始めから、そのコードを晒しておけば、すぐに解決したものを…
どうして問題が再現する最小のコードを貼らないのか…
いや、freeとdelete[]が変わるというのと bad_allocを投げない(要NULLチェック)というのもあるし。 特に前者は忘れがちだし。 newを使ってbad_allocを投げる関数を自分で作ればよいだけなんだけどね。
あーなるほど。自分は元の定義を尊重して、 mallocにしてたけどC++だと逆に余計なお世話だな 確かにnew[]したほうが良いか。
ええ、あなた程度でも思いつくような事はさすがにやってます^^;;;
601 :
デフォルトの名無しさん :2006/02/07(火) 22:12:58
はじめまして 半年前からCの勉強をしていてひと段落したのでC++に進もうと思っております オブジェクト、クラスなどのことがわかりやすく書いてある参考書などおありましたあ教えていただけないでしょうか? よろしくお願いいたします
スレ違い。書籍スレ行け
604 :
デフォルトの名無しさん :2006/02/07(火) 22:24:37
605 :
デフォルトの名無しさん :2006/02/08(水) 13:02:53
とあるサンプルコードをながめているのですが、 STDMETHOD(hoge)(THIS_ LPCSTR foo); の、STDMETHODとTHIS_ってのはどういう意味でしょうか? 文法的にも、型の前に更になんかくっついているのははじめてみたのですが、 ググってみてもこれらを当然のように使っているサンプルコードとかしか引っかかりません。 なるべく平易に教えていただけると嬉しいです。
・質問者は必ず、環境を書きましょう。 ・ぐぐった?
607 :
605 :2006/02/08(水) 13:13:23
環境はVC++6です。
COMインターフェースのメソッド 定義はヘッダファイルあると思う。
>>605 おそらくCOM/OLE関係のマクロで手元のVC++7.1だとObjBase.hで定義されてるものだろう。
基本的にはCとC++でCOM/OLEのインターフェイス定義を共有するための小細工。
詳しく知りたければCOM/OLE関係の解説書でも読め(Inside OLEとか)
はじめまして 本日からC++をはじめた。初心者PGです。 さっそくお伺いしたいのですが。 javaで書く data.java ---------------------- 1|class data { 2| 3| public string data; 4| public string data2; 5|} =================================== test.java ---------------------- 1|import data; 2| 3|class test { 4| 5| MethodTest(data pData) { 6| 7| string strPara; 8| strPara = pData.data2; 9| } 10|} はどのようにC++でどのように表現すればいいのでしょうか? 現在、C++でDLLを生成し VBで生成したDLLを使用する処理を作っているのですが。 DLLの呼び出し関数の引数と戻り値に 構造体を使用したいのです。 よろしくお願いします。
611 :
605 :2006/02/08(水) 14:02:03
VC++6.0のコンボボックスについて質問です コンボボックスで選んだ文字列を取得する場合 char str[128]; *初期化略 int no = SendMessage( GetDlgItem( hDlg, IDC_COMBO1), CB_GETCURSEL, 0, 0); SendMessage( GetDlgItem(hDlg, IDC_COMBO1), CB_GETLBTEXT, (WPARAM)no, (LPARAM)str); と GetDlgItemText(hDlg, IDC_COMBO1, str, 127); のどちらでもできると思うのですが、 わざわざ前者を使う意味があるのでしょうか?
>>613 SendMessage → Win32API
GetDlgItemText → MFC
>>614 スッキリしました
ありがとうございます
open関数で開いたファイルがeofであるかどうか調べるにはどうしたらいいですか?
>>617 Windows上のようですが、UNIXの場合どうしたらいいですか?
>>618 lseek(SEEK_END)で返ってくるバイト数が
直前に呼んだlseekに渡したバイト数以下ならeof。
>614 GetDlgItemTextはAPIにもあるよ。
SendMessageに比べて引数が省略される代わりに 関数名に入っている感じかな。
>>610 //data.h
#include <string>
class data {
public:
std::string data;
std::string data2;
};
//test.cpp
#include <string>
#include "data.h"
class test {
MethodTest(data Data) {
std::string strPara = Data.data2;
}
};
もっともVB相手にstd::stringは使えないけどね。
プロンプトでプログラム実行すると、 目にも止まらぬ速さで窓が自動的に閉じてしまいます。 解決するにはどうすればよいのでしょうか? ちなみにC++です。
>>624 まず、キーボードを良く見よう。
そう、あるはずだ。
PrintScreenと書かれたキーが。
あとは分かるな?
628 :
デフォルトの名無しさん :2006/02/09(木) 03:21:45
>>625-627 ワラタ
他にはreturnの前にgetchar();もしくはコマンドプロンプトでその
フォルダに移動してから、コマンドプロンプトで実行
>>623 ありがとうございました。
VBからの引数はchar*で宣言を行い。
623さんの、やり方を行ったところうまくいきました。
631 :
デフォルトの名無しさん :2006/02/09(木) 10:56:53
IDE からなら Ctrl + F5 とかどうよ。
632 :
デフォルトの名無しさん :2006/02/09(木) 14:20:19
inlineって、プロトタイプに付ければいいんですか? それとも、関数本体に付ければいいんですか?
おでこに付けるといいよ。
インリンって、、、
635 :
デフォルトの名無しさん :2006/02/12(日) 04:41:47
Javaではclass1がclass2を含み、class2がclass1を含むことができましたが、 C++で同じようなことをやるとコンパイルする時点でどちらかがもう片方をタイプ名だと認識してくれません。 例えば、 //World.h #include "People.h" #ifndef h_Wrld #define h_Wrld class World{ ... People* array_of_population; }; #endif //People.h #include "World.h" #ifndef h_Ppl #define h_Ppl class People{ ... void interact(World thisWorld); }; #endif とやったあと g++ World.cpp People.cpp Tester.cpp -o Test.out World.h内でPeopleを型だと認識しないと言う旨のエラーが出てきます。 たぶんJavaではBytecodeをクラスごとに作成して動的に全てをリンクしていたために 上記のようなことが可能だったと思うのですが、C++では可能なのでしょうか?
可能です。
>>636 可能だということが分かったのでEssential C++とThinking in C++を
もう1回隅々まで読んでヒントを探してみます。
ありがとうございます。
ヒント:ポインタや参照は、それを使って実際に参照を行うコードが出てくるまでは、不完全型でも良い
639 :
デフォルトの名無しさん :2006/02/12(日) 06:17:28
#define h_Wrld class People; // Peopleクラスの宣言 class World{ 中略 }; class People { // Peopleクラスの定義 以下略
640 :
デフォルトの名無しさん :2006/02/12(日) 11:06:23
質問です。XP、.NET 2003 です。 エディットコントロール上で Enter キーを押したときに、 エディットコントロール上、もしくは親ダイアログ上で特殊な処理を行うには、どうすればよいでしょうか。 Tab キーも同様ですが、IsDialogMessage でダイアログにメッセージを振り分けても、 Tab の場合は次のコントロールにフォーカスを移動するなど、デフォルトの処理が呼び出されるだけで、 ダイアログのやエディットのプロシージャには、WM_KEYDOWN すら飛んできません。 現在は、メッセージループ上で、WM_KEYDOWN を検知してかつ uMsg.wParam == VK_RETURN のときに 独自のメッセージ (WM_APP+xxx) を uMsg.hwnd に送り、 エディットコントロールのプロシージャで WM_APP+xxx を受け取っています。 何かスマートな方法があればよろしくお願いします。
サブクラス化
642 :
デフォルトの名無しさん :2006/02/12(日) 12:32:50
すいません、初心者なんですが。最近C言語の勉強を始めました。 本を見ながら学んでいるのですが、char型変数は漢字を表現できるのでしょうか? コンパイルしても、文字化けするのですが。教えてください、よろしくお願いします。
>>642 charは無理。char*なら環境依存。wchar_tなら確実。
さっそくありがとうございます。たぶん本が間違っているのだと思います。 もう一冊の本にはできないと書いてありました。ダウンロードしたファイルも 間違っているのみたいですね・・・本選びからはじめます。ありがとうございました。
>>644 漢字はどの漢字コードでも最低2バイト。
char型はsizeofすればわかるけど1バイト。
入るわけがない。
char[]やchar*な文字列は2文字分にまたがって格納できるからOK。
あと間違っても
char str[16];
str = "漢";とかstr = '漢';などとやらないように。
>>645 すいません、全くわからないです。まだ始めたばかりで、char*というのは
なんでしょうか?この本のは
char moji1='本';
という感じなんですけど。環境がいけないのでしょうか?
これは酷い。 始めたばかりで分からないのは当然。 しばらく進めてから質問汁
>>646 本当にそのまんま書いてあるならそのファイル作った香具師殴り殺していい。
実はJavaの本だと予想してみる
C言語の本なんですが。もう少し勉強してみます。すいませんでした
まず本のタイトルを晒してみようか
652 :
デフォルトの名無しさん :2006/02/12(日) 14:16:44
「図解入門 よくわかる最新C言語の基本と仕組み」です。
653 :
デフォルトの名無しさん :2006/02/12(日) 14:24:46
独習Cの方が良くないか?猫でも〜よりはましだと思うが、まっ個人の自由だけどな
654 :
デフォルトの名無しさん :2006/02/12(日) 14:26:18
まず壁紙用に時計つくればいいよ。
655 :
644です :2006/02/12(日) 14:32:12
XPで Borland C++ Compiler 5.5 です。 char moji2='本' printf("%c",moji2); というやり方ではできないですよね?なんどもすいません
char moji2='h';
657 :
デフォルトの名無しさん :2006/02/12(日) 14:58:35
本も間違ってるし、サンプルも間違い
>>655 日本語だのやりたいなら、char*がなんなのか分かるようになってからだ
本には char moji2='A' printf("%c",moji2); とかって書いてあるのに 644が勝手に2バイト文字を突っ込んで動かないってほざいてるだけだろ、たぶん
660 :
644です。 :2006/02/12(日) 15:50:18
本には char moji2='言'; と書いてあります。 確かに漢字が使われており、「c言語」と表示しようとしています。 うそではないです。ご迷惑をかけてすいません。勉強します。
いくらなんでもそんな無能が本書くわけないだろw 数学の計算ミスとかそんなレベルでなく、それがネタでなくて ガチだったら池沼もいいとこ。
char str[] = { 'h', 'e', 'l', 'l', 'o' }; と初期化すれば6バイト割り当てられておまけに最後に'\0'で初期化されると書いてあった 「はじめてのC++」並にひどいな
663 :
デフォルトの名無しさん :2006/02/12(日) 16:02:57
ネットでもサンプルおとせますよ。本当にうそではないです。
凄いな。そんな本があるんだ。 折角買った本でも、時間を無駄にして役に立たない知識をつけるより ずっといいよ。
666 :
デフォルトの名無しさん :2006/02/12(日) 16:16:57
ありがとうございます。違う本で勉強します。読み始めたばっかで 間違いに気づいて良かったです。サンプルも間違えていて、信じていただけて うれしいです。ありがとうございました。
667 :
デフォルトの名無しさん :2006/02/12(日) 16:30:30
一体なんて言う本ナンダ?
図解入門 よくわかる最新C言語の基本と仕組み―標準C言語プログラミング教本 How‐nual Visual Guide Book 秀和システム2002/03 横田 一輝 の検索結果 Illustrator文書作成術 住所録のデータを年賀状ソフトに変換できる本 しっかりわかるコントロールパネル―Windows98/98SE編 事例引き Access「クエリ」ハンドブック PCサーバのしくみ 入門ビジュアル・コンピューティング あとJAVA,C#本が数冊
いくらなんでも糞過ぎるだろ 詐欺じゃね?
なんかアプリの本とJava本ばかりだな。 最近はC#の本を出してる。 Cの本はこれ以外にないから、あまり期待できんな。 京都造形芸術大学の講師らしい。
そもそも畑違いの人間かよ
あの意味不明なCM流してる所か 糞っぽい大学だなと思ってたらやっぱり中の人も同レベルか
676 :
デフォルトの名無しさん :2006/02/12(日) 17:12:10
専門学校のバイト講師以外じゃねぇか
横田が京都を中心に運営してるらしい会社(?)
http://www.f-site.com/ ■代表者プロフィール
横田 一輝(よこた かずき)
1965年大阪府生まれ名古屋育ち
通産省情報処理試験対策の教員としてコンピュータ専門学校に勤務後、SEとしてメーカーの社内システム構築などに従事。
現在は関西フリーサイト代表として、大学,専門学校講師、パソコン関連本の執筆活動、システム開発など様々な分野で活動中。
・中高教員免許(社会)
・情報処理T種技術者
旧I種ってFEの方か?あんなのプロフィールに書くほどの物じゃねーだろ
>>678 旧I種別は今のSWに対応しているようだ。
>>680 あぁFEは旧II種の方か
しかしこんな奴が取れるとはな
>>679 char01.cのサンプルさらしとく
#include <stdio.h>//stdio.hファイルの宣言
int main()
{
char x;
char moji1='C';
char moji2='言';
char moji3='語';
x='a';
printf("変数xの中身は %c\n",x);
printf("変数moji1からmoji3を表示します %c",moji1);
printf("%c",moji2);
printf("%c",moji3);
}
>>679 から見つけた。char01.c。
#include <stdio.h>//stdio.hファイルの宣言
int main()
{
char x;
char moji1='C';
char moji2='言';
char moji3='語';
x='a';
printf("変数xの中身は %c\n",x);
printf("変数moji1からmoji3を表示します %c",moji1);
printf("%c",moji2);
printf("%c",moji3);
}
ひでぶ!!
ありえねぇ・・・ しかもreturnしてねぇし・・・ こんなヤツがよくI種取ったりSEやったりできたな・・・
>>679 の圧縮ファイルのホストOSが、MS-DOSになっているんだが……。
コンパイラはLSI-Cか……。
とても2002年に書かれた本とは思えない。
ポインタと配列のことについて質問なのですが、C++で void test(char hoge[128][256]){ for(int i=0; hoge[i][0] != NULL; i++) //処理 } の関数に、 char szStrs[128][256]; test(szStr) とやっても参照渡しになるってのはわかるのですが、 引数をポインタにした場合の void test(char **hoge) { for(int i=0; hoge[i][0] != NULL ; i++) //処理 } の関数に、szStrsを渡すにはどうやればいいんでしょうか?
何回同じ質問を見たか・・・
初心者歓迎って書いてたもので聞いてみたのですが、 何度同じ質問見たかしりませんが、この程度のことは答えるまでもなく、 実質初心者歓迎のスレではどうやらないみたいなので、 もうちょっとあれこれいじくってみます。
質問です 構造体で struct hito{ char name[20]; int nenrei; }; hito human[2]; をファイルにテキスト形式で下記のように書き出したり読み込んだりしたいのですが "namae1";15 "namae2";16 どのようにすればいいのでしょうか? "と;を追加するのと、読み込みのときの識別の仕方がわかりません
>>687 ,689
せめて、自分はどうやったらいいと思ったのか、
そしてやってみたらどんなエラーが出たのか、
これぐらいは用意してから質問してくれ。
692 :
644です。 :2006/02/12(日) 19:07:35
みなさんありがとうございました。 これからは、よく調べてから本を買います。 質問しなかったら、えらいことになってました。 ご迷惑かけてすいませんでした。
>>687 根本的な勘違いをしている。
参照渡しにはならん。
char a ;
a ;//この型はchar
char ary[10]
ary[0] ; //この型はchar
ary ; //この型はchar *
char hoge[128][256] ;
hoge[0][0] ; //この型は、char
hoge[0] ; //じゃあ、この型は?
hoge ; //この型は?
&hoge ; //この型は?
694 :
693 :2006/02/12(日) 19:23:06
書き忘れてた。 &ary ; //この型は、char (*)[10]
個別のメンバ関数の解説ってヘッダファイルに書くのが普通? それともcppファイルに書くのが普通?
ヘッダファイル
>>687 「二次元配列」と「1次元配列へのポインタの配列」の違いを考えろ
256x128要素の二次元配列は、32768個のデータが隙間なく並んでいる。
128要素の1次元配列への256要素のポインタ配列は、
・128個のデータが隙間なく詰まった配列が
・どこだか分からないけど合計で256個あって
・それぞれの配列の先頭アドレスが
・256個のポインタが隙間なく詰まった配列に記録されていて
・そのポインタ配列の先頭アドレスがchar** hogeとなる
ってこと。
>>687 char *pszStars[128];
for( int i = 0 ; i < 128 ; ++i ){
pszStars[i] = szStars[i];
}
test(pszStars);
>>645 別にcharが16bit以上あるような環境があってもおかしくないが。
誰がbitの話してるよ?
bitとbyteを混同すんなや
704 :
690 :2006/02/13(月) 00:17:17
>>697 ありがと、しかしわからなかったので
strtokとかいうの使ってできました。
手持ちの本どれにもこの関数は載ってなかった
K&R C第2版でも買っとけというのは言い過ぎになってしまうのだろうか。
そもそも1byte=8bitと決め付けること自体が間違い。
そうだね。だから入門書でchar型に16bit入れたっていいよね。
708 :
デフォルトの名無しさん :2006/02/13(月) 07:57:56
横田一輝ってすげーこのスレ向きの奴だな。
実は C# だったり。
訂正どうだすかな
711 :
デフォルトの名無しさん :2006/02/13(月) 12:29:58
はじめて2chを使う者です。 既出だったりスレ違いだったら申し訳ありません。 初歩的なことだと思うのですが、 C++で、 class A{ B* b; }; class B{ A* a; }; みたいな事をしたい場合どうすればいいのでしょうか。 コンパイルするとB*って何?みたいなエラーが帰ってきてしまいます。
>>711 class B;
class A{
B* b;
};
class B{
A* a;
};
713 :
デフォルトの名無しさん :2006/02/13(月) 12:33:34
どうもありがとうございます
>>711 激しく既出だが、やさしい人がいてよかったな。
>>711 ただ、こういう構造になってしまうのは、設計でなにかがまずいんだ。
こういうの普通に考えてありえないでしょ?
他人のプログラムの改変とかで、こっちのが楽だっていうならいいが、
これが新規で作って出てきたクラスだとしたら、あまりにもセンスが無いw
>715 んなこたーない
>>716 そうだってw
こんなチグハグな設計になるわけないだろw
自分が馬鹿なの自慢しにくるなよw
ケースバイケースって言葉しらないんだろうな
>>711 のまんまならおかしいけど
色んな要素がある中で
そういう循環参照になるのは
ありがちだよ
そういうこともしないで
ムダな関数処理してるプログラマのがバカ
>>717 あんたが構造体やテンプレートのArrayやListで済むような単純なデータしか
扱っていないからだろ。
720 :
デフォルトの名無しさん :2006/02/13(月) 21:34:37
>>719 それで済むようにできるのが俺のプログラムの上手さだと思ってる。
業界でもっとも複雑であろうゲームを作ってきた俺が必要なかったのに、
業務でアホなコード組んでるお前が複雑なデータなんて扱う必要があるわけない。
無理だというならそれがお前の限界。
>>720 うむ。同意だが、ageてると説得力半減だ。
2行目で笑いをとるためにageたに決まってるだろ。察してやれよ。
語尾にwを多用するやつの説得力は通常の半分以下
724 :
デフォルトの名無しさん :2006/02/13(月) 23:32:04
ハイハイw そんな糞設計してて自分が正しいと思ってんのねw オブジェクト指向は現実にある構成をそのままプログラムに反映できる設計よ。 この世にそんな構造のもんなんて存在しないでしょ? 自分が間違えてるのわかりそうなもんだけど。 まあ、馬鹿だからしょうがないかw 技術なんて人に評価されたことないから間違ってても気がつかないんでしょ。 悲しいねぇw
>>724 > この世にそんな構造のもんなんて存在しないでしょ?
世の中、人間の知っている事より知らない事の方が多いのに、
よく恥ずかしげも無くそんな事言えるね。
> 技術なんて人に評価されたことないから間違ってても気がつかないんでしょ。
自己紹介乙
>>726 はぁ?反論しようとするのはいいけど、自分の話をどう進めるかぐらいはできるようにしてくれよ。
てか、お前、俺のレスにどこに噛み付いて、どう否定したくて、自分はどう考えてるか?すら伝わってこねぇぞ。
頭悪すぎだろ。つか、日常生活で人とまともに会話できてる?
最近、
>>726 みたいなのって多くなったな。
なんか、宇宙人みたい。これがゆとり教育の弊害か?
張り切って釣りしようと思ってきたのに日本語しゃべれないんじゃしょうがない。さらば!
本読めよ!数学頑張れ!
反論しようとしてないだろw ただ煽ってるだけ見える。
>>724 は各センテンスのつながりがおかしいように思う。
プログラムもいいけど、たまには小説でも読もう。
730 :
デフォルトの名無しさん :2006/02/14(火) 00:17:41
読んでも無駄な希ガス
>>727 よく、こんな狭い視野してPG出来るなぁ…。
同じゲームプログラマとして恥ずかしいよ。
ゲームプログラマはみんな恥ずかしいだろ。
まぁなぁ。技術がありそうで無く、精神的に余裕に至っては皆無。 そんなヒビの入った歯車みたいな奴が多数だし。
737 :
デフォルトの名無しさん :2006/02/14(火) 08:51:06
相互参照や循環参照くらい時々なら出てくると思うが。 まぁなんとかそれを解消させようとするんだけど、無理な場合も。 修論で知識ベースからの推論やってたときに、結構泣いた。
自分ひとりで全部やるなら、そういう自信も持てるだろうが、 人が作ったものを利用しつつ、作ったものをまた人に利用させるような場合 そういいきれるものでは無いのだよ
僕は君を知ってる。 君は僕を知ってる。 循環参照。
740 :
デフォルトの名無しさん :2006/02/14(火) 13:20:42
だよな。 かたっぽだけだと、ストーカーだよな。
741 :
デフォルトの名無しさん :2006/02/14(火) 13:21:19
リファレンスカウントされてるオブジェクトって、 「もう、ほっといてくれよ」とか 一瞬でも思ったりしないんだろうか。
windowsアプリをつくっています。 タスクトレイにアイコンを表示して常駐するソフトを作成中です。 タスクトレイにアイコンは表示できたのですが、ウィンドウの透明化ができなくて 困っています。 ウィンドウの透明化はどのように行うのが一般的ですか?
おれはCWnd::ShowWindow() つかってっけど
744 :
742 :2006/02/14(火) 15:36:15
>>743 レスありがとうございます。
もう少し詳しく教えてください!
MSDNで調べろよ
InitInstanceの中で、MainFrameが作成されたらそれに対して ShowWindow(SW_HIDE) と思ったら、自分のコードではそれに加えて MainFrameのPreCreateの中で cs.style &= ~WS_VISIBLE; cs.dwExStyle &= ~WS_EX_CLIENTEDGE; cs.lpszClass = AfxRegisterWndClass(0); こんなことやってるなあ、、、どれが効いてるんだっけ。
とりあえず、
>>743 のCWndは忘れろ
ShowWindowだけ調べとけ
748 :
742 :2006/02/14(火) 16:02:31
みなさんありがとうございます。 ShowWindowの引数にSW_HIDEを入れたらできました。
749 :
デフォルトの名無しさん :2006/02/15(水) 00:54:38
>>739 それはオブジェクトなのか?
そもそも、オブジェクト指向が理解できてないな。
あくまで「物」が主体なんだよ。
循環参照ができてしまうなんてのは未熟の証明でしかない。
そもそも現実にそんな物体が存在するのか?この世にそんな物体が存在できるのか?
物体Aの構成要素に物体Aがあるってことだぞ。
すでに破綻してる。
こんな脳みそでプログラムなんて組んだら破綻するのも当然。
オブジェクト指向をちゃんと勉強しろ。
>>749 プ!
オブジェクトが物って誰が決めたんだよ。おまえの脳内理解のレベルが
その程度ってことだけは、よ〜く判ったよ。
752 :
デフォルトの名無しさん :2006/02/15(水) 01:13:13
初心者なんですが、業務用ソフト等のプロテクト解除を教えてほしいのですが。
>>752 ローカルルールより
> ウイルス、ハッキング・クラッキングを求めるような発言は禁止です。
>>750 お前こそわかってねぇな。
こうやって作れば絶対に破綻しないんだよ。
現実にない構成をむりやり構築しようとするから複雑になってしまうのさ。
>循環参照ができてしまうなんてのは未熟の証明でしかない。 >そもそも現実にそんな物体が存在するのか?この世にそんな物体が存在できるのか? AさんはBさんの電話番号を知ってる。BさんはAさんの電話番号を知ってる。 互いに相手に電話をかけてメッセージを送ったり何か仕事してもらったりできる。 たまに「おかけになった電話番号が使われておりません」ってことになるかも。 普通だな。
>>756 ちがう。
そもそも電話番号なんてクラスになりえない。
オブジェクト指向でいえば電話番号なんて物じゃない。
クラスにしたとしても最適化のためだったり設計に結びつくようなものにはならない。
てめーはホントに頭悪いんだな。
class ニワトリ { class タマゴ* 自分が出てきたタマゴ; }; class タマゴ { class ニワトリ* 自分を産んだニワトリ; };
> 循環参照ができてしまうなんてのは未熟の証明でしかない。 > そもそも現実にそんな物体が存在するのか? > この世にそんな物体が存在できるのか? GNU is Not UNIX
>>749 >物体Aの構成要素に物体Aがあるってことだぞ。
class ノード
{
リンク* 右;
リンク* 左;
};
class リンク
{
ノード* 右;
ノード* 左;
};
>>757 お前さんは本当に頭が悪くていらっしゃる。
ついでだからPHP Hypertext Preprocessorも置いておく
変数のポインタに1を足したらその変数の型のサイズ分だけ進むそうですが int *i; i++; じゃ関数のポインタは? int *(unko)(); unko++; この場合int分進むの?ってことはこのintの部分は別にcharでもdoubleでも好きなの勝手に入れていいの? それともunkoに指させる予定の関数の返り血の型にあわせとく必要があるの?もしそうならなんのため?ですか?
ああ宣言しただけで値代入してないや。気にしないでください
>>764 どうでもいいが、
int (*p)() だろ
もちろんそれは、変数の型( int (*)(void) )のサイズだけ進む。
具体的に言うと、
sizeof(p) == sizeof(int (*)(void)) == //処理系依存
MSVCなら、ポインタはすべて4バイト
>>766 ・char型が1バイト、int型が4バイトの処理系で
・0xaa 0xbb 0xcc 0xdd 0xee ・・・ってなってるint型を返す関数hogeがあるとして
char (*c)();
int (*i)();
c = hoge;
i = hoge;
c++;
i++;
これで c は0xbbを、i は0xeeを指すって理解でおkですか?
768 :
デフォルトの名無しさん :2006/02/15(水) 06:42:00
>>758-767 はぁ?なんの話してんだ?お前等?
まともな思考回路脳みそにねーの?
プログラムなんて組むだけ無駄だから止めちまえ。
770 :
デフォルトの名無しさん :2006/02/15(水) 08:02:45
>>768 反論できないけど黙ってるのも悔しいからとりあえず火病、
という追い込まれた状況はよく理解できたから、もう来なくてもいいですよ。
PHP (PHP: Hypertext Preprocessor)を無限ループにせずに展開する方法をおしえてくだしあ
>>757 >> AさんはBさんの電話番号を知ってる。BさんはAさんの電話番号を知ってる。
>> 互いに相手に電話をかけてメッセージを送ったり何か仕事してもらったりできる。
>> たまに「おかけになった電話番号が使われておりません」ってことになるかも。
>
> そもそも電話番号なんてクラスになりえない。
> オブジェクト指向でいえば電話番号なんて物じゃない。
確かに、電話番号のクラスはなり得ないかもしれない。
しかし、「Aさん」「Bさん」はオブジェクトだろ?
「Aさん」「Bさん」は現実に存在するものなのだから。
そして、「Aさん」「Bさん」はお互いの事を知っている、
と言う事は、現実にあり得る事だ。
何かにたとえてる奴ってアフォなの? どんな禁じ手だって、強引にたとえればいくらでもたとえられるだろw
# 739 :デフォルトの名無しさん :2006/02/14(火) 13:15:33
# 僕は君を知ってる。
# 君は僕を知ってる。
# 循環参照。
#
# 749 :デフォルトの名無しさん :2006/02/15(水) 00:54:38
#
>>739 # それはオブジェクトなのか?
# そもそも、オブジェクト指向が理解できてないな。
# あくまで「物」が主体なんだよ。
「君」や「僕」はオブジェクトだと思うが…。
そうか、
>>749 はこの世に存在しないのか!
GUIで子ウィジットが親ウィジットのハンドル(もちろん逆も)を持つなんてのはよく見るケースだよ
776 :
デフォルトの名無しさん :2006/02/15(水) 09:58:57
メタファによって理解が深まることはよくあることだよ。 あるいはメタファなしにはなにも理解できないと言っても過言ではない。 コンピュータ関連の用語はほとんどそれ以外の世界の言葉の借用であることからも 何と無く類推できよう。
>>773 無能は例え話しかできないんだよ。語録不足だから。
>>773 何か存在しないとか言い切ってる奴ってアフォなの?
どんな有用な構造だって、強引に否定すればいくらでも無視できるだろw
日本語でおk
どこで、質問して良いのか判らなかったので、こちらに失礼します。 現在、Visual C++ 6.0を用いて、あるアプリケーション用のプラグインを作成しています。 その際アプリケーション側のAPIから取得できる情報を、 RSS2.0、もしくはRDF形式で、保存する必要が発生しました。 そこで、質問です。 Visual C++6.0 でも使用可能な、RSSもしくはRDF形式のファイルを書き出せるクラスライブラリで、 フリーの物は、存在するのでしょうか? ググッてみても、Readは沢山見当たるのですが、Writeが見当たりません。 やはり、自作するしかないのでしょうか? ちなみに .Netや、2005には、アプリケーションのAPIが対応していないので、 移行できないのです・・・orz よろしくおねがいします。
>>780 Unmanagedな奴なら従来のとほとんど互換性有ると思うがそれでもダメなのか?
782 :
デフォルトの名無しさん :2006/02/15(水) 12:11:10
XML DOMいじるライブラリなら C++ の物がいくつもあるから それを使うっていうてもあるし、C++/CLI で .NET Framework の中の類似のクラスを使うっていうてもある。 とはいえ俺も自分じゃ XML ほとんど使ってないから 口だけだけど。アプリの設定ファイルとかにXML つかってるけど XML 読み書きできるシリアライザ呼び出してるだけだし。
レスありがとうございます。
>>781 Unmanaged で一向に構いませんので、
参考書籍やURL等紹介していただけると、助かるのですが。
>>782 VC++6.0 から、.Net Framework って、使えるのでしょうか?
ご指摘の方法、もう少し調べてみます。
784 :
デフォルトの名無しさん :2006/02/15(水) 14:56:33
>>783 >VC++6.0 から、.Net Framework って、使えるのでしょうか?
混乱させてしまったようで済みません。使えません。
VC++ 6.0 についているのは C++ コンパイラだからです。
VC++ 2005 についている C++/CLI コンパイラなら使えます。
785 :
デフォルトの名無しさん :2006/02/15(水) 18:08:58
win2k vc++6.0という環境です。 書籍サンプルで、ソース中に「CoInitializeEx」を使用している、libを作るプロジェクトがあります。 これをそのままコンパイルした場合、普通に成功してlibができます。 しかし、このソースをwin32アプリを作るプロジェクトのなかにもってきてコンパイルすると (もちろんwin32アプリとしての体裁を整えた上で)↓のようなエラーが出ます。 error C2065: 'CoInitializeEx' : undeclared identifier. ググってみて↓のような文を付け加えたりしてみたらコンパイルできるようになったのですが、 libの場合とwin32アプリでコンパイルした場合でなぜ結果に違いが出るのか、理屈が分かりません。 どなたか教えてください。お願いします。 これとか。 #define _WIN32_WINNT 0x0400 #include <ole2.h> これなど。 #define _WIN32_DCOM #include <objbase.h>
>>785 MSDN嫁
Windows NT/2000/XP: Requires Windows NT 4.0 or later.
Windows 95/98: Requires Windows 98 (or Windows 95 with DCOM).
Header: Declared in objbase.h.
Library: Use ole32.lib.
787 :
デフォルトの名無しさん :2006/02/15(水) 19:01:11
>>786 つまりそのコンパイルするのにヘッダとかが必要なのは分かるのですが、
ではぜlibのプロジェクトでコンパイルする時には必要ないのか?
という理屈が分からないのです。
つーかRSSの読み込みならともかく書き出しぐらい自分でやれよ。大した手間でもねーだろ。
>>787 libのプロジェクトからwin32アプリに持っていった時に、
設定が変わっているからじゃないの?
790 :
デフォルトの名無しさん :2006/02/15(水) 19:25:24
>>789 ども。リンクの設定かなとか思ったんですけど、
libのプロジェクトの方はそもそもリンクの設定するところがないみたいです。
ライブラリとかインクルードファイルの設定はプロジェクトが変わっても一定ですし。。
他にどこか設定する所ってのはおもいうかびませんです。すいません。
791 :
デフォルトの名無しさん :2006/02/15(水) 19:28:36
>>774 はぁ?
「知っている」状態を表すのにどうしてオブジェクト自体を内包するの?
そもそも素質ねーんだよお前。
例えば、「俺」オブジェクトと「お前」オブジェクトがあったとして
「俺」が存在することで「お前」のプログラム自体に直接影響を与えちまうのはそもそもおかしい話なんじゃねーか?
こういう頭が無いってところですでにオブジェクト指向を理解できる見込みが全く無い。
さっさとプログラマなんて辞めちまえ。
>>749 >あくまで「物」が主体なんだよ。
>
>循環参照ができてしまうなんてのは未熟の証明でしかない。
>そもそも現実にそんな物体が存在するのか?この世にそんな物体が存在できるのか?
つまり、オブジェクト指向プログラミングでは
現実に存在する「もの」しかプログラミング対象に
ならない、と・・・
いやぁ。実に斬新な説だな。
そもそも最初の話題はオブジェクトを内包じゃなくて互いのポインタをメンバとして持つだけの話だったよね。 >712辺り。
794 :
デフォルトの名無しさん :2006/02/15(水) 20:10:45
>>791 内包するなんて言ってないじゃん。
参照って言ってるのに・・・・
抽象概念なのに、現時世界に存在するものでしか考えられないのはナンセンスというか低レベル。
StateパターンのContextとWindowって循環参照の関係にならないか? あとはVisitorとか。
一般に、オブジェクトのインターフェースと 実装方法の分離という理念を しっかり体得出来ていない人が、 「参照を持っている->他のオブジェクトを包含する」 という安直な発想に陥りやすい。
そういったデザパタでも、インタフェース継承等を使って、いるから直接的には コード上は互いを参照しているようには見えない。 それをもって、「循環参照していない」と勘違いしている未熟者がいるのかもしれないけどな。
>790 コンパイルエラーなんだろ? ならリンクは関係ない。 インクルード関係にどこか違いがあるはず。
800 :
デフォルトの名無しさん :2006/02/15(水) 20:47:35
>>794 はぁ?ちゃんと読めよ。
俺はそもそも「お前」オブジェクトを「俺」オブジェクトに
合わせてソースを書き換える必要があること自体おかしいって言ってんの。
ポインタとしてもつのも設計としておかしいって言ってるの。わかったか馬鹿。
そもそもお前の書くソースは100人居たら「俺」に対する「お前」、「お前」対する「俺」のコード、
つまり、100X100の一万件分ソースを書くということか?
苦労だけ一丁前で全然金にならないなw
すっげ馬鹿が変に噛み付いてくる予防線として書いておくけど
ここでvoid*もしくはそれに近いものを使って、とっかえひっかえポインタ使いまわしても
(そもそもひとつのポインタを使いまわして複数のインスタンスを出し入れするなんて危険なことした時点でそいつはいらない)
俺は同じくそいつに「プログラマ辞めろ」という。
>>800 >はぁ?ちゃんと読めよ。
>俺はそもそも「お前」オブジェクトを「俺」オブジェクトに
>合わせてソースを書き換える必要があること自体おかしいって言ってんの。
>ポインタとしてもつのも設計としておかしいって言ってるの。わかったか馬鹿。
いやぁ、いくら読んでも
やっぱり判らないや(w
802 :
デフォルトの名無しさん :2006/02/15(水) 20:55:03
>>800 >俺はそもそも「お前」オブジェクトを「俺」オブジェクトに
>合わせてソースを書き換える必要があること自体おかしいって言ってんの。
>ポインタとしてもつのも設計としておかしいって言ってるの。わかったか馬鹿。
何でいちいちソース書き換える必要あるの?
双方のクラスの共通の基底クラスへのポインタを使えば住む話じゃん。
803 :
デフォルトの名無しさん :2006/02/15(水) 20:56:11
class A : protected B { }
どうでもいけど、C++だとオブジェクトじゃなくて、クラスかインスタンスって書いたほうがよくないか? 俺オブジェクトとお前オブジェクト云々ってのは、インスタンスじゃないよね? クラスという意味でオブジェクトって言葉使っているのなら、ちょっとアレだ。
805 :
デフォルトの名無しさん :2006/02/15(水) 21:03:53
class A : protected B { 中略 }; protected で継承した B の public メソッドの一部だけ、 A の public メソッドとして外から見えるようにするには どうすればいいですか? 同名のメソッドを作ってスルーするしかありませんか? void A::foo() { B::foo(); } みたいに。
>>805 一部だけを見えるようにする言語仕様はありません。
書いているようにするのが一番単純な方法。
>>800 >そもそもお前の書くソースは100人居たら「俺」に対する「お前」、「お前」対する「俺」のコード、
>つまり、100X100の一万件分ソースを書くということか?
>苦労だけ一丁前で全然金にならないなw
C++にはtemplateがあるって知ってるかい?
templateを使えば「俺」に対するX、「お前」に対するYのコード、
つまり100*2のソースで十分だ。
事実STLは、データ構造の件数*アルゴリズムの件数の定義があるんじゃなくて、
templateを使い、データ構造の件数+アルゴリズムの件数しか定義せずに済ましている。
君のように阿呆みたいなコード量の爆発は起きない。
808 :
デフォルトの名無しさん :2006/02/15(水) 21:11:00
>>806 そうですか、ありがとうございます。
たまに std::vector<T> を継承してちょっぴり
付加機能を付けたコンテナクラスを作ることがあるんですが、
使わないメソッドは隠蔽しておこうとして protected/private
継承すると、結局使いたい一部のメソッドも見えないよなぁ、
って悩んでました。
inline にしたらオーバーヘッドも少なそうだし、
あとはコンパイラの最適化を信じることにします。
>>807 >君のように阿呆みたいなコード量の爆発は起きない。
STL はコンパイルすると、実質的なコード量が爆発するんだが・・・
>>808 それは継承じゃなくて、集約にしたほうがいい。
811 :
デフォルトの名無しさん :2006/02/15(水) 21:15:34
>>810 private なデータメンバとして
コンテナを保持しとけってことですか?
>>805 struct A{void fn(){}};
class B:protected A{
public:
using A::fn;
};
813 :
デフォルトの名無しさん :2006/02/15(水) 21:20:18
>>812 げ、 using キーワードってそんなことにも使えたんですか。
using namespace OreNo::Kuukan;
しか使ったことなかった・・・
正解は、非メンバ関数にすることだな
std::vectorって継承して平気なんだっけ?
>810 オブジェクト指向的?にはそうかもしれないけど、 それだと>812みたいに出来ないからなぁ。 まあインライン関数をずらずら並べるのとあまり違いはない気もするが。 >816 いやその理屈はおかしい。
>>816 そんな事態を起こさないためのprotected/private継承。
クラス内だけ気を付ければよくなる。
>>816 publicならともかく元の質問はprivate/protectedだろ?
基底クラスのポインタにそもそもキャストできんよ。
だから、その問題はこれとは関係ない。
まぁprotected継承しなくても集約で良いやん的な気分なのは俺もだが
821 :
デフォルトの名無しさん :2006/02/15(水) 21:42:15
>仮想デストラクタのないクラスを継承してはいけない そんな馬鹿な・・・ 盲目的にそう信じるのは馬鹿だと思うぞ。 特にデータメンバに変更が無く、 便利なメソッドを追加するような継承では全く問題がない。
822 :
デフォルトの名無しさん :2006/02/15(水) 21:44:07
データメンバに変更が無く→追加が無く
プリミティブなメンバを増やすだけでもダメ?
何書いてんのかと思ってたら・・・
>>821 ワロス
どうしてこういう無能がホームページなんか作っちゃうんだろうねぇ
825 :
デフォルトの名無しさん :2006/02/15(水) 22:15:07
まあまあ、821は仮想関数というのを使ったことがないということで 許してやってくれ。
双方向リストとかツリーとかあるじゃねーか。 これらが相互参照じゃなく自己参照だと言い張るのはかまわんが、 グラフとかもあるしな。 ジェネティックとかになるとどこがどうつながってるのかは 人には判断できねーよ。
ログ更新してから書き込もうな。
>>821 正確にはこう。
「publicな非仮想デストラクタを持つクラスから継承してはならない」
それ自体はインスタンスを作らない、派生クラスのための
Mix-inベースクラスとかは、protectedな非仮想デストラクタを持たせる。
>>821-823 C++ FDIS 5.3.5/3 より引用。
"if the static type of the operand is different from its dynamic type, the static type shall be a base class of the operand's dynamic type and the static type shall have a virtual destructor or the behavior is undefined."
つまりデータメンバに追加が無くても、
デストラクタが virtual でない基底クラスへのポインタを
delete したとき、実際の型が基底クラスと違えば
問答無用で未定義動作。
問題が起こらない処理系が多いのが誤解の元だろう。
>>829 「問題の起こらない処理系」などない。
問題が起こる場面では、どんな処理系でも問題が起こる。
struct Base
{
~Base{}
};
struct Derived : public Base
{
Derived() : Base(){
1GBのメモリを確保;
}
~Derived(){
1GBのメモリを開放;
}
};
Base* base = new Derived();
delete base;
どんな処理系でも、これで1GBのメモリリークが発生する。
>>831 は?「問題が起こらない場面」があるから誤解の元になるんだろ?
>>832 それは「問題はあるが実害が無い」場面が多いだけで
「デストラクタが実行されない」というバグは厳然として存在する。
お前みたいなバカがバグを量産してるんだな。
>>833 ごめんよ。
君の頭の中で問題と実害が明確に区別されているなんて知らなかったんだ。
835 :
デフォルトの名無しさん :2006/02/16(木) 02:09:45
ちょっと質問です。 もし、仕事でCを使うことになった時、どの程度までできれば役に立てますか? また、GUIプログラミングもできないとやっぱりキツイんでしょうか・・・?
>>835 それはCでなんの仕事をするかで、変わるものと思われます
>831 >つまりデータメンバに追加が無くても、
まあ、CRect は RECT を継承してるんだけどな。
RECT* rect = new CRect; ... delete rect; とかやらんでしょ
840 :
デフォルトの名無しさん :2006/02/16(木) 05:07:26
>>802 >何でいちいちソース書き換える必要あるの?
>双方のクラスの共通の基底クラスへのポインタを使えば住む話じゃん。
はぁ?底無しの馬鹿だな。
基底が同じもんしか循環させないのか?
841 :
デフォルトの名無しさん :2006/02/16(木) 05:10:01
>>807 お前はプログラマ辞めるどころか、もう死んじゃっていいと思うよw
テンプレートの話なんて誰もしてないよ。
だいたい、設計でテンプレートの話なんて出てくる時点で頭おかしい。
みんな他人より自分が頭良いって思ってるんだなって事だけは はっきりわかるスレですね。 うまいとか,うまくねえとか,他人(ひと)のやってるのをきいて, そういうことを言うについちゃァ,別にモノサシがあるわけじゃァありませんが, まァ,他人のはなしィきてみて,「こいつァ,オレよりまずいな」と思ったら, まず自分と同じくらいの芸ですよ。人間にゃ誰だって, 多少のうぬぼれがありますからね。 「オレと同じくれえかな」と思うときは,向こうのほうがちょいと上で, 「こいつァ,オレより,たしかにうめえや」と感心した日にゃァ, それゃァ,もう格段のひらきがあるもんですよ。
843 :
デフォルトの名無しさん :2006/02/16(木) 06:04:17
>>842 技術で勝てないと知ると別の手段にでるところとか或る意味プログラマ向きだと思うよw
>>842 おまいが某氏の blog に出入りしているところまで読んだ
まぁどう考えてもこの中じゃ俺が一番頭良いな。
オレが2番目だな
じゃあ俺は4番目で良いよ。
848 :
デフォルトの名無しさん :2006/02/16(木) 10:25:02
俺は最下位でいいよ。
ラッキー! 俺3番
このスレは5人しかいないのか
遅レス失礼
>>788 おっしゃる通りでして、私も最初は自前クラスで書き出してしまおうと思ったのですが、
RSSのバージョン変化への対応等、将来のメンテナンス性や、拡張性等を鑑みて、
何らかの標準的な物が有るならば、それに乗っておいた方が良いかなと思い、調べていた次第です。
今回は、VC++6.0用に、自前でサックリと書き出しルーチンを作っておいて、
将来APIが、.NETなり、2005なりに対応した時点で、
置き換えられる様にコーディングするつもりです。
レスありがとうございました。>各位
852 :
デフォルトの名無しさん :2006/02/16(木) 14:13:08
9×9の数独の問題を再起呼び出しを使って解くプログラムを作ってるんだけど、誰か指針をお願いします。
854 :
デフォルトの名無しさん :2006/02/16(木) 14:29:55
>>852 その手のパズルは自分で解く事に意味がある。
いやいや、パズルを手で解く楽しみとパズルを解くプログラムを作る楽しみは両立可能だよ? まあプログラムに問題を解かす作業は特に楽しくないけどな。
Visual Studio C++で質問です。 xは150 yは50 [xとyの和は 200][差は 100][積は 7500][商は 3][余は 0] はどうしたら、表示されますか?
>>857 puts("xは150\n"
"yは50\n"
"[xとyの和は 200][差は 100][積は 7500][商は 3][余は 0]\n");
マネージ拡張のC++でwindowsプログラムを作ってるんですが、 #include <ddeml.h> とすると大量にエラー出て使えません。 どうしたら良いでしょうか。
860 :
デフォルトの名無しさん :2006/02/16(木) 21:00:34
だからManaged C++はやめろと C++/CLIの方がいいと思います
>>859 ここはManagedのスレではありません
862 :
デフォルトの名無しさん :2006/02/16(木) 21:35:43
unsigned short型の配列に入ってるデータを そのままunsigned short型でファイルに出力するにはどうすればいいですか? fwrite(配列名,sizeof(unsigned short),配列のサイズ,fpw); ↑こうやったら何か正しく出力されなかったんですが・・
863 :
デフォルトの名無しさん :2006/02/16(木) 21:43:33
Windows には バイナリモードとテキストモードの区別がある
初歩的な質問ですみません。 別ファイルでも使えるグローバル変数を作りたいんですが 方法を教えてください。
ファイルローカルにして、アクセス関数で参照、変更させろ。
867 :
864 :2006/02/17(金) 01:05:21
Visual studio .netのコマンドプロンプトを起動して メモ帳に書いたものを.cppになおしてからファイル名.exeってやってるのに 「内部コマンドまたは外部コマンド操作可能なプログラム またはバッチファイルとして認識されていません」 ってでるんだけどなんで? VSを普通に起動して手順通りに進めばできるんだけど 上のやり方で手軽にやる方法はどうしたらいいの?
\\_ :三ニ=:::::::ヽ :ヽ.ニ=::て.>廴_ ポカーン 三.ヽ= (⌒ヽ;:;:;,.二) ニ=-ヽ:ヽ、,∠.^^ぅ 〃,べ= ̄ニ二 ̄ /;:ィリ ノノ ,.へヽ ;:ヘ/ ̄ ̄ ̄Vヽヽ ソ ├┤|
これはひどい
インターネッコですね
Borland C++コンパイラとbccdevelopperの無料環境でメールチェッカーを作っています。 nMail.dllというDLLを使っているのですが、メイク時に Error: 外部シンボル 'NMailInitializeWinSock' が未解決(C:\〜\CHECKIT.OBJ が参照) Error: 外部シンボル 'NMailPop3Connect' が未解決(C:\〜\CHECKIT.OBJ が参照) Error: 外部シンボル 'NMailPop3Authenticate' が未解決(C:\〜\CHECKIT.OBJ が参照) Error: 外部シンボル 'NMailPop3Close' が未解決(C:\〜\CHECKIT.OBJ が参照) Error: 外部シンボル 'NMailEndWinSock' が未解決(C:\〜\CHECKIT.OBJ が参照) となってしまいます。nMail.hというヘッダファイルをプロジェクトに追加しているのですが… リンクの仕方にどこか如何わしいところがあるのでしょうか?
>>873 implib.exeでインポートライブラリ作ってリンクするかLoadLibrary&GetProcAddressしる
インポートライブラリはついてこなかったの?
>>874 ありがとうございます!libファイルをバッチで作るものがあるとは知りませんでした。
>>875 VisualCなどのlibはついてたのですが、それだとうまくメイクできなくて…。
作ったlibをメイク環境に追加したらできました。
ありがとう!
実行ファイルの大きいアイコン(デスクトップなどに表示されるアイコン)は どこで指定していますか? WNDCLASSというhIconというところですか?
>>877 というよりEXEファイルのリソース。
WNDCLASS::hIconはそのリソースを使うところ。
WNDCLASS::hIconの中身がEXEのアイコンになるのではなくて、
EXEのアイコンをWNDCLASS::hIconに指定している。
879 :
877 :2006/02/20(月) 00:45:38
>>878 では、exeのアイコンを替えればいいということでしょうか?
リソースで書けばいいんですよね?
880 :
デフォルトの名無しさん :2006/02/20(月) 09:47:29
static な関数にも const 指定できればいいのに。 class A { static int i; static void Set(const int given_i) {i = given_i;} static void Get() const // この const 指定で怒られる {return i;} }; コンパイラは Visual C++ 2005
>>880 そのconstにどんな意味を持たせたいの?
>>880 static ではないメンバ関数では this の型が A* から A const* になるわけだが、
this を持たない static 関数で、どんな効果を期待してるの?
883 :
デフォルトの名無しさん :2006/02/20(月) 10:02:45
>>881-882 static なメンバ変数を変更しない事を明示したいです。
不用意にいじっってるコードがあれば指摘して欲しいです。
無理
>>883 Get() の中で Set() を呼び出した場合とか、
関数ポインタ &A::Get の型をどうするか?とか、
規格化するにあたって問題が多そう。
>883 staticな部分をクラス化して、そのクラスのインスタンスをstaticメンバ変数にでもしたら?
配列の初期化ってfor文でやるしかないですか? たとえば、 char str[100]; //初期化 for (i=0; i<100; i++) { str[i] = NULL; } というふうにです。100回もループを回すのはなんかもったいない気がして。
>>887 char str[100] = {'\0'};
残りは自動的に '\0' が入る。
というか char に NULL 代入するなよ・・・・
>>888 ありがとうございます!
charにNULL代入するのはおかしいですか?
\nは終了コードですよね?
・・・・・
改行(\n)したっていいじゃない 人間だもの
あ、\0でしたすみません。 NULLと\0の違いがよく分かってないんです。 このあたりを書いてあるWEBページもあんまりないみたいで…。
一番いいのは規格書を読む事なんだがな。 いい加減な本やサイトが多いし。 しかし個人で規格書を買うと高く付く。学校においてあるPDFを 閲覧するとかすればよい。 JISなら日本語でも読める。
あ、間違ったごめん。JISの日本語版なら無料で誰でも閲覧できる。 (後はごにょごにょ
やりたいことの意味が通じればよし。 で、やりたいことは charの配列にヌルポインタを代入したいのか、0で初期化したいのかと言う話だ。
ちょっと調べてみた #ifdef __cplusplus #define NULL 0 ←C++の時 #else #define NULL ((void *)0) ←Cの時 #endif あるじゃな〜い NULLは ただのゼロ \0は ヌル文字 \0は”改行コード”で調べるといっぱい出るぞ
897 :
896 :2006/02/20(月) 15:45:18
>\0は”改行コード”・・・ 間違えたが反省しない
ただのゼロだからといって、ゼロの代わりにNULLを書くのはバカ
>893 K&R C第2版読め じゃダメなんかな
>>896 NULLはヌルポインタ用。
C++ではvoid*型から他のポインタ型へ暗黙の変換ができないからそうなっているだけ。
ちなみに規格によるとNULLは「処理系定義の空ポインタ定数」となっている。
ポインタであろうがなんであろうが 0 を入れておけばよさそうな…。
902 :
896 :2006/02/20(月) 16:56:19
一応、俺は887じゃないぜ
>>887 必ずサイズの分かってる配列ならmemsetでもしてろ
>>896 で、おまいさんの調べたのはWindowsってオチだろ?
NULL = 0なのは代表的な処理系でそうなってるだけで、
NULL = 0とC++が規定してるわけじゃない
904 :
デフォルトの名無しさん :2006/02/20(月) 18:28:20
>>892 > NULLと\0の違いがよく分かってないんです。
\0 → 文字定数or文字列定数中に整数値0を記述するためのエスケープ文字
NULL → 何のオブジェクトも指していない事を示す特別なポインタ値
Windows xp home irvine1.1.2 のメニューとダイアログが文字化けします。 助けてください。お願いしますッ。
>>903 >NULL = 0とC++が規定してるわけじゃない
4.10の1によると、null pointer constant(空ポインタ定数)とは0に評価される整定数式のことだから、
実質的に0だといえるんじゃないか?
#define NULL (1 - sizeof 'h')
みたいなのも許されると思うけど。
>>905 ソフトウェアについての質問はソフトウェア板でどうぞ。
>>906 NULL==0は確かに全ての規格合致処理系において保証されてるが
その内部符号は未定義だからそこは分けておいた方がいいだろう
908 :
デフォルトの名無しさん :2006/02/20(月) 20:14:02
>>906 それは、Cソース上で「0」がポインタとして解釈される時、
NULLとして扱われるという事だね。
# つまり、「if( NULL )」が偽となる
>>903 が言いたいのは、実行時にNULLのビットパターンが、
「All bit 0であると言う保証はない」と言う事だろう。
>>908 必要条件と十分条件が入れ替わってる希ガス
ぬるぽインター
質問させてください。 よく、メッセンジャやスカイプで、新着通知に下からポップアップウィンドが上がってきますが、あれはどうやって実装しているのでしょうか? まさか全部自作? 環境は、VC6.0のXPです。よろしくお願いします。
自作以外に何があると?
ヒント:ウィンドスタイル
915 :
デフォルトの名無しさん :2006/02/21(火) 08:49:37
南南東の風、風力4
916 :
デフォルトの名無しさん :2006/02/21(火) 08:50:26
南の風 風力3 っていう名前のラブホがあったよね。
今は無いの?
918 :
デフォルトの名無しさん :2006/02/21(火) 14:10:49
今もあるよ、チェーン店だし。
919 :
デフォルトの名無しさん :2006/02/21(火) 15:22:08
基本クラスAから,クラスB,クラスC が派生しているとします. クラスBに vector<int> m_vHoge; クラスCに vector<double> m_vHoge; がそれぞれメンバとして定義されているものとします. このとき,基本クラスAに,m_vHoge に対して, vector としての操作をするような関数を 定義するようなことはできますか? できるならどのようにしたらいいのでしょうか?
921 :
919 :2006/02/21(火) 15:53:51
>>920 すいません
愚かな私にいま少し具体的に示唆していただければ幸いです
プログラムの勉強についての質問ですが、 柴田望洋のC言語 入門編を読んで勉強をしているのですが、 全てのリストを写して実行した方がいいのでしょうか。 演習だけやれば身に付くものなのでしょうか。 他の本にも言えることだと思うので、アドバイスお願いします。
923 :
デフォルトの名無しさん :2006/02/21(火) 16:08:09
class A にその操作をするための関数のインターフェイスだけ書いておく。 もちろん vertual で =0 な純粋仮想関数として。 で、 class B と class C でその関数の中身をを実装する。 忘れないように class A のデストラクタも仮想デストラクタにしよう。
924 :
デフォルトの名無しさん :2006/02/21(火) 16:08:56
>>922 コンパイル、リンク、実行
どんなサンプルでもやってみるのがいいよ。
その本に限らずに。
「わかる」と「できる」は違う。
まあその本はあきらめて次を探すほうがいいけどなw
>>924 そうですか。じゃあ頑張ってみます。
有り難うございました。
927 :
919 :2006/02/21(火) 16:29:16
>>923 ロジックがまったく同じで,
型だけが違う,という場合はどうしますか?
>>927 vectorの要素の型だけ違っていればいい、というのであれば、テンプレートかな。
template <typename T>
class Hoge
{
std::vector<T> m_vHoge ;
public:
void func() ;//処理
} ;
template <typename T>
void foo( Hoge<T> &h)
{
h.func() ;
}
int main()
{
Hoge<int> hoge_int ;
Hoge<double> hoge_double ;
foo(hoge_int) ;
foo(hoge_double) ;
}
929 :
デフォルトの名無しさん :2006/02/21(火) 17:18:27
質問です。どなたかご教示いただければうれしいです。 例えば、 ifstream ifs; ifs.exceptions(ios_base::failbit); try { ifs.open("fuga.dat"); } catch(ios_base::failure){ cout << "dame jan!" << endl; return(-1); } なんてして、open()の際のExceptionをキャッチしたいとします。 その後、上記が成功した場合は以下を実行しようとします。 char hoge[128]; while( ifs >> hoge) cout << hoge << endl; するとどうも、eofを取ってくれないらしく、ファイルの最終行 に達しているのにwhileから抜けず、実行中にアボートしてしまいます。 仕方無いので、上記のwhileループの前に ifs.exceptions((_Ios_Iostate)0); なんて入れたりしてexceptionを無効にするとOKになるのですが、 これは正しい手法でしょうか?
>>929 それ、前に悩んだことがある。
operator>> の中で eof に達した場合、まず eofbit がセットされ、
入力が途切れることによって直後に failbit がセットされる。
つまり eof() && !fail() という状態を見ることが無い。
operator>>(istream&, char*) は1文字も入力できなかった場合に
failbit がセットされる。これはやっぱり eof に達したときに発生する。
なんでこんな仕様になってるのか理解できないが、たぶんどうしようもない。
> ifs.exceptions((_Ios_Iostate)0);
こんなキモイコード書くぐらいなら badbit だけ設定して、
is_open(), eof(), good() を明示的に書いたほうがいい。
どうせ入力のチェックは要るんだし。
入力では使えないが、 ostream には failbit も使えるだろう。
あと
- catch(ios_base::failure){
+ catch(ios::failure const&){
- ifs.exceptions((_Ios_Iostate)0);
+ ifs.exceptions(ios::iostate(0))
char array[9]; unsigned int i; i = 123; sprintf(array,"%s%d\0","UserName",&i); ってすれば、 array[0] →U array[1] →s array[2] →e … array[8] →123 array[9] →\0 になっていますか?
934 :
931 :2006/02/22(水) 00:48:34
>>932 &iじゃなくてiですか?
>>933 いまコンパイラが使えないところにいるので…。
カフェでCの宿題しています。
ふざけてるのか?
>>934 > カフェでCの宿題しています。
これ無理。
Delphiで言うところのValueExist()のような関数が欲しくて悪戦苦闘しています。 GetPrivateProfileString("Test1","Test2","Default",str,100,buffer2)) としたとき、iniファイルにこれに該当するキーが無い場合にはこの関数は "Default"を返すと思うのですが、 if (GetPrivateProfileString("Test1","Test2","Default",str,100,buffer2)) != "Default"){ } とすると、"符号付き値と符号なし値の比較"といって怒られます。 GetPrivateProfileStringの第3引数はいったいどのようなものですか?
>>937 ネタじゃないなら、文字列操作について勉強してきなさい。
引き数の問題ではなく、コンパイラの言う通り比較の仕方が問題なのだから。
939 :
931 :2006/02/22(水) 07:21:57
array[8] →123 とかどう見てもネタです、本当にありがとうございました
>>937 何のための4番目、5番目の引数だと思ってるんだ。
で
#include<IniFiles.hpp>
TIniFile* ini = new TIniFile(buffer2);
if (ini->ReadString("Test1", "Test2", "Default") != "Default") {
//
}
こうすればいいとおもうお(;^ω^)
941 :
デフォルトの名無しさん :2006/02/22(水) 09:19:46
>>931 # 「&i」の値が「0x11111111」とした場合
array[0] → 'U'
array[1] → 's'
array[2] → 'e'
…
array[7] → 'e'
array[8] → '2'
array[9] → '8'
array[10] → '6'
array[11] → '3'
array[12] → '3'
array[13] → '1'
array[14] → '1'
array[15] → '5'
array[16] → '3'
array[17] → '\0'
942 :
デフォルトの名無しさん :2006/02/22(水) 11:34:29
基本クラスで定義したテンプレート関数を 派生クラスの中で使ったら, リンク時に 未解決の外部シンボル… となるのですが,なぜでしょうか?
>>942 テンプレートの実装はヘッダファイルに書かなきゃダメよ
テンプレート関数の定義をソースファイルからヘッダファイル内に移しましょう
946 :
デフォルトの名無しさん :2006/02/23(木) 09:24:27
C++で,テンプレートかつ仮想関数というのはできますか?
やってみればいいだろ
C++のtemplateに関する質問です。 template <class T> void hoge(T& n) { T temp = 100; // 初期化可能? temp = 200; // 書き換え可能? } このような関数を作ったとして、 const int n = 100; hoge(n); とすると、T = const int となり、temp = 200;でコンパイルエラーになるのは納得がいくのですが、 template <class T> void hoge(T n); のように、値渡しとすると、コンパイルエラーが発生しません。 この挙動の違いに戸惑っております。 値渡しの際には、テンプレート仮引数のconst性は無視されると考えてよいのでしょうか?
hoge<const int>(n); ではなく hoge<int>(n); にマッチするようになってるから。 そうじゃないとhoge(100)とかもエラーになって困る。
>948 コンパイラ何? VC.NET2003ではその通りになるけど bcc5.5.1ではどっちもコンパイルエラーになる。
レスありがとうございます。
>>949 なるほど、組み込み型の値渡しはconst性が無視される仕様である、ということで納得しました。
> そうじゃないとhoge(100)とかもエラーになって困る。
ここがいまいちよく分かっておりません…
(組み込み型の値渡しにconstは無意味である、という問題は無視して考えれば、)
100の型がintであろうがconst intであろうが、どちらでマッチしても問題ないように思えてしまいます。
>>950 VC.net 2005とgcc 3.4.4で確認しました。
定数は const int
>>952 申し訳ありません(;´Д`)
「100という定数値が、テンプレートでint、const intどちらでマッチしても、」の間違いです…
値渡しはconst性が無視されるのか、とか、 値 渡 し っ て 何 か わ か っ て ま す か
ええ、あなた程度でも知っているような事はさすがに理解しています^^;;;
>>954 constが無意味なのはこの際無視するって書いてあるだろ
テンプレートパラメータの類推が引数部を参考に行われるのか、
呼び出し元の型に準拠するのかが知りたいだけだと思われ
ふぁびょーん
958 :
デフォルトの名無しさん :2006/02/23(木) 22:07:38
VBスレかここかで迷ったんですが、こっちに書きます。 VBでは扱えないハードウェアがありまして、CでDLLを作成して そのDLLをVBで使うようにしたいんですが 普通のCとかで使うDLLと同じように書いても、VBで扱えるのでしょうか? コールバック関数を登録したりしたいので、ポインタの受け渡しが必要になったりするのですが・・・・。 VBの事良く分からないので、的外れな事書いてるかも知れませんが、よろしくお願いします。
MSNメッセンジャーの タスクバーに出るポップアップウィンドウって、 どうやって出すんですか??
>>958 VBというのがver.6以前のことか.net以降のことか分かりませんが、
どちらにせよ、可能です。
VBで直接APIが呼べるということ(そのための宣言構文)から類推できそうなもんだけどな
>>963 AddressOfでDLLに渡せるんじゃなかったっけ?
渡せりゃいいってもんでもない
>>958 公開(エクスポート)する関数もコールバック関数も全てstdcallを使うこと。
WinXPでCPU温度を読みたいのですが, 何から手をつければよいかわかりません. ACPIを使うのだと思うのですが, 参考になるドキュメントなどあるでしょうか?
ACPIでググって、日本語英語問わず片っ端から読む。
何の助言にもなってないな
ドキュメント渡しても絶対作れないに100%
今回は凄く分かりやすかったな
974 :
967 :2006/02/25(土) 17:47:46
1バイトと3バイトのデータがあり、この二つのデータを1つの4バイトの変数に入れるにはどうしたらいいですか?
981 :
デフォルトの名無しさん :2006/02/26(日) 22:03:03
質問です。XP、2005 です。 フォントのビットデータを取得しようとしています。 以下のコードは、まずデータ取得に必要なサイズを調べているところですが、 GetGlyphOutline に失敗します。 UINT uChar = 'a'; GLYPHMETRICS gm; uChar &= 0x0000ffff; MAT2 mat = {{0,1}, {0,0}, {0,0}, {0,1}}; // フォントを取得 HDC hDC = CreateCompatibleDC(0); DWORD size = GetGlyphOutline(hDC, uChar, GGO_GRAY8_BITMAP, &gm, 0, NULL, &mat); if (size == GDI_ERROR) return false; // ここで失敗 GetGlyphOutline を呼び出す直前に各変数の値を調べてみましたが、特に異常な値は見当たりません。 にも関わらず、GetGlyphOutline がエラーを返してくれます。 何が原因か分からないでしょうか。 よろしくお願いします。
982 :
デフォルトの名無しさん :2006/02/26(日) 22:06:35
教えて下さい。 C++Builder、VisualC++、VisualC#などがありますが、最も応用範囲が広いのはどれでしょうか? ドライバ開発、アプリケーション開発、計測制御など、幅広く使える環境を探しています。
C++Builder:開発元が売りに出しているC++開発環境 VisualC#:C++ではない言語の開発環境、ネイティブコードは得られない 何をしたいか知らんが、自ずと明らかかと
馬鹿が釣れたw
社会人とは思えない発言だな・・・
>>982 Windowsを使うと言う前提では、最も範囲が広いのはVisual C++かと。
自分にとって都合のいい条件をつけて回答する痛い
>>986 妄想書き込んでんじゃねーよ
ドライバ開発が前提になっている以上選択肢なんぞねーと思うが。
989 :
デフォルトの名無しさん :2006/02/26(日) 22:21:36
990 :
981 :2006/02/26(日) 22:46:55
分からない・・・。 Win32API スレに行くべきでしょうか?
991 :
デフォルトの名無しさん :2006/02/26(日) 22:51:07 BE:640974997-
パワーポインターで作ったスライドってホームページに貼り付けられるの?
993 :
981 :2006/02/26(日) 22:54:51
API スレに行ってきます。ありがとうございました。
994 :
982 :2006/02/26(日) 23:00:33
早速の回答、有難う御座います。 当方の開発環境を書き忘れました申し訳ありません。 開発環境はWindowsです。 やはり、融通が効くという意味ではVC++という選択になるのでしょうか。 同じC++でも、BCBではどのような点が不利になるのでしょうか。 ご教示願います。
995 :
982 :2006/02/26(日) 23:03:58
調べたら詳しく書いてあるサイトを見つけました。
申し訳ありませんが、
>>994 は無かった事にしてください。
お手数お掛け致しました。
この板は強制IDじゃないんですね。 995は私ではありませんので。
997 :
982 :2006/02/26(日) 23:13:51
>>996 何でそういう事をするのですか?
やめて頂けませんか?
998
999
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。