【初心者歓迎】C/C++室 Ver.12【環境依存OK】
1 :
デフォルトの名無しさん :
04/11/22 14:07:11
テンプレはらないの
一桁(6辺り?)ゲットずさー(AA略) 書いてから言うのもなんだけど、fgetc()の仕様忘れてるから適当に書いちゃったよw
7 :
デフォルトの名無しさん :04/11/22 16:33:29
>>1 にsageは禁止と書かれているのにsageばかり。
そもそもなんでsage禁止?
9 :
デフォルトの名無しさん :04/11/22 19:25:17
gcc 3.3.1 (cygming special) + cygwin 1.5.5 (0.94/3/2) + Windows XP Professional (SP2適用済、RAMは768 MB)で質問です。 -- #define PARAMETER_NUMBER 162905984 #include <stdio.h> char parameter[PARAMETER_NUMBER]; int main(void) { printf("%d\n", sizeof(parameter)); } -- 上記プログラム(といえるほどのものではありませんが)をgccでコンパイルして実行したところ 正常にsizeofの結果を表示してくれるのですが、 #define行を #define PARAMETER_NUMBER 162905985 とするとコンパイルできるものの実行してもsizeofの結果を返してくれません。 この問題を回避する方法、つまり グローバル変数領域を確保し、かつ正常にプログラムを実行する方法を 教えていただけませんでしょうか。 メモリは不足していない(と思います)し、また同じプログラムをlinuxやsolarisでコンパイルした場合は 同様の現象は再現できません。
そんな時はmallocなどで動的に作る
LinuxやSolarisではそれが実行できるのか・・・さすがだな。
155MBか
Windowsでも出来るが
このソースで何がしたいんだろう こっちの方が気になって仕方が無い
cygwinの虫取りを依頼されてまつ
Cはじめようと思うんですけど、推薦と書のとこを見ても数が多くてどれがいいか分かりません。 どのような組み合わせで買うのがいいですか? 一応大学の理系学部生です。
>>16 日本語喋れ
>>17 実際に見てみて自分に合うやつを一冊買ってそれ仕上げればいいんじゃないか?
>>16 >>17 初心者用の本ならどれも内容はだいたい同じ。書いてあるコードもどんな環境でも通るもののはず。気に入ったものでよいのでは?
定番の本(CならいまだにK&R?)は読んで損はないと思うが、最初からそれだけで理解しやすいかはかなり疑問。
最終的にGUIプロミングがやりたいのであっても、楽をしようとして、いきなりwindowsプログラミングや
C++の本だけ買うのは、おすすめしない。たぶん挫折するし、楽がしたければVB等を覚える方ががマシだと思う
20 :
デフォルトの名無しさん :04/11/23 08:10:56
ファイルから検索しようとすると、~.ncbを開けませんと出て検索できません。 ncbを1度消してビルドしなおしてもだめでした。 どうすれば検索できるようになりますか?
>>9 MinGW(gcc3.4.2)でも動いた
char parameter[PARAMETER_NUMBER] = { 1 }; で初期化したら
巨大な .exe が生成されたがそれでも 162905985 が出力された
>>20 .ncb は VC でプロジェクトを開いている間じゅうロックされるので、
検索することはできないと思いますよ。
プロジェクトを閉じれば検索できるでしょう。
(.ncb がどういうファイルなのか知ることのほうが先かも)
まだ始めたばっかりなので、質問内容に不備がありましたら予め失礼申し上げます
ttp://v.isp.2ch.net/up/3cc2006c584d.txt ↑のプログラムをコンパイルしたら
エラー E2206 report-b.c 29: 不正な文字 ' ' (0x8140)(関数 main )
エラー E2206 report-b.c 29: 不正な文字 ' ' (0x8140)(関数 main )
エラー E2379 report-b.c 34: ステートメントにセミコロン(;)がない(関数 main )
エラー E2379 report-b.c 35: ステートメントにセミコロン(;)がない(関数 main )
と、エラーがでて困っています。
しかし、素人目で見て何が間違っているのか、というより合っているはずなのに…と
なって先に進めず、どうすればいいのかがわかりません。
申し訳ありませんが、ここがおかしいからこのエラーが出ると指摘してもらえませんでしょうか?
お願いしますm(_ _)m
ちなみにOSはXP homeでエディタにはAOKさんのC言語を始めよう!というのを使用させて
貰ってます。
>>18 >>19 ありがとうございます。
とりあえず、自分に合いそうなダイテルとK&Rを買うつもりでヨドバシまで行ってきます。
>>23 29行目に全角のスペースを使ってるのと、
C言語では
2sin(s)のような直感的な書き方は出来ず、
r / (2*sin(s))と書かなきゃいけない
>>25 素早い返答ありがとうございます!
おかげさまでちゃんとコンパイルすることができました。
これで続きを書くことが出来ます。本当にありがとうございましたm(_ _)m
>>26 そのエディタに2バイト空白を見せる機能がないなら捨てることをお勧めしておく。
ついでに言えば、タブ文字や改行文字も見えるほうがいい。
>>27 メモ帳ってどうやって棄てればいいですか?
>>27 VisualStudioのエディタもデフォルトでは表示してくれないわけだが(´・ω・`)
system32のnotepadを消す
それは「空白を見せる機能がない」というのか?
32 :
デフォルトの名無しさん :04/11/23 13:36:18
>>30 .txt っていうファイルを開くとエラーが出てくるようになりました
r;ァ'N;:::::::::::::,ィ/ >::::::::::ヽ . 〃 ヽル1'´ ∠:::::::::::::::::i i′ ___, - ,. = -一  ̄l:::::::::::::::l . ! , -==、´r' l::::::/,ニ.ヽ l _,, -‐''二ゝ l::::l f゙ヽ |、 世の中、メモ帳だけじゃねえんだ レー-- 、ヽヾニ-ァ,ニ;=、_ !:::l ) } ト ヾ¨'7"ry、` ー゙='ニ,,,` }::ヽ(ノ 適当なエディタにでも乗り換えろ :ーゝヽ、 !´ " ̄ 'l,;;;;,,,.、 ,i:::::::ミ ::::::::::::::::ヽ.-‐ ト、 r'_{ __)`ニゝ、 ,,iリ::::::::ミ ::::::::::::::::::::Vi/l:::V'´;ッ`ニ´ー-ッ-,、:::::`"::::::::::::::;゙ , な! :::::::::::::::::::::::::N. ゙、::::ヾ,.`二ニ´∠,,.i::::::::::::::::::::/// :::::::::::::::::::::::::::::l ヽ;:::::::::::::::::::::::::::::::::::::::::::/ / ::::::::::::::::::::::::::::::! :|.\;::::::::::::::::::::::::::::::/ /
35 :
デフォルトの名無しさん :04/11/23 13:39:35
メモ帳で日誌をつくろう!! 1.ドキュメントの 1 行目の左余白に、次の拡張子を入力します。ピリオドを忘れないでください。 .LOG 2.[ファイル] メニューの [名前を付けて保存] をクリックします。 注 このドキュメントを開くたびに、コンピュータの内部時計の日付と時刻がドキュメントの最後に書き込まれます
>>34 オスキナモノ ドウゾ
(=゚ω゚)っ[ edlin, ed ]
38 :
デフォルトの名無しさん :04/11/23 13:44:03
39 :
デフォルトの名無しさん :04/11/23 13:44:54
>>35 ありがとうございます。
便利だからこれからもメモ帳使うことにしますた
2バイト空白ってすごいネーミングだな
エディタならサクラエディタかPeggyPADがオススメ。 (Windowsなら)
43 :
デフォルトの名無しさん :04/11/23 16:04:04
c++で使われている"?"という文字の意味が分かりません。 どのような意味があるか教えてください。 例 li.push_back(line.length() > 80 ? line.substr(0, 80) : line);
三項演算子 A ? B : C Aを評価し、真ならBを、偽ならCを評価する。
>>43 > 例
> li.push_back(line.length() > 80 ? line.substr(0, 80) : line);
li.push_backに渡される引数が、line.length() > 80の評価結果によって
変化する。
line.length() > 80がTRUEであれば、line.substr(0, 80)
line.length() > 80がFALSEであれば、lineが引数として渡される。
って、丁寧に説明書いて手気づいたのだが、これって、
最近そこらにマルチされてるテキスト行長によるソートの
課題の一部なのでは、、、、
部分的な質問を投げてるなら、自力でやる気があるんだろうから、結構な事じゃないか。
テスト
>>47 なるほど、、
ずいぶん前に答えは出とるのね、、、、
# ただ、この処理だと、”同じ長さの行は入力順"てのを
# 満たせない気もしないではないが、、、
222 :デフォルトの名無しさん :04/11/23 21:20:54 >118 ちょと解読&考えてみた。 ・作業用に最大80個のファイルを作成する ・文字の数によって、1~80の作業ファイルのいずれかに追記する。 何文字の行があるのか0と1で表す配列で持つ(領域80個) ・行数の少ないところから、作業用ファイルの最初から、順に出力する これ、メモリほとんど使わないYo!
vectorに入れてstable_sort使えばいい。
>>49 list<>.sort()は安定的。
23.2.2.4 list operations -31
Notes: Stable: the relative order of the equivalent elements is preserved.
std::list に stable_sort がないのが前から疑問だったけど、 std::list::sort 自体が stable だったのか にゃんにゃん
>>53 つー事は多分内部的にはマージソートだにゃ
つ が差し出す手に見えてしまう・・・
57 :
デフォルトの名無しさん :04/11/24 16:47:58
STLで、vector A の途中の要素を削除する時は その要素の番号をiteratorで指さなきゃならないと思うのですが、 今、別のint型のvector B に、削除したいVector Aの要素の番号が 何個か入っているとしたら、どんな感じで書けばよいのでしょうか。 vectorBの内容はvectorAのサイズ内の数値が (5,2,4,8)等のように適当に入っています。
vector<int>::iterator it = B.begin(); vector<int>::iterator end = B.end(); for (; it != end; ++it) A.erase(A.begin() + *it);
>>58 それ先頭から削除されるたびにインデックスがズレてバグらないか
Bを先に降順にソートしないと駄目だな 効率悪いけど
%dが整数などを表示する物だってことをかじる程度に知っているのですが、%5dというのはどういうものなのでしょうか。
関係ないんですが ちょっと違うことで質問があります 今メモ帳を使ってプログラム書いてるのですが 誤字や;の付け忘れなどがあった時 コンパイル前にその誤字の部分が赤く又は色がついて表示される エディタって無いものでしょうか?
>>61 もう少しかじれ
>>62 画面のプロパティ→デザイン→ウインドウの文字 を赤にする
>>61 はマルチ
>>62 メモ帳ではなく、統合開発環境を使え。エディタの問題ではない。
>>64 >>65 サンクス
BCC Devを使ったりしてるんだけど
何かいまいちなのよね
Visual C++.netは使いやすいです?
BCCDevはクリックしたところに無条件でカーソルが移動するのがウザい…
>>65 なんで?
使いやすいエディタ使えばいいじゃん。
>>69 シンタックスエラーを色分け表示してくれるエディタなんてあるの?
>>71 コンパイル前に、だからエディタでの話でしょ。
しかし、「;付け忘れ」を判定するのは難しそうだが。そういうエディタは実際あるんですか?
;付ける間まで注意表示みたいなのをいちいち出されるのもウザそう。
たとえば WM_PAINT: としようとして WM_PAIMT: にしてしまったら Mもところだけ色がつくとか そういう機能がついている物 なさそう?
.NETの開発環境でシンタックスエラーらしき個所に波線が 付いたような。VS 2005だけだっけか?
>>71 ,73
emacsやその派生ならできるでしょ。
マクロを書く必要はあるけど。
ただ、
>>62 に使いこなせないのは間違いない。
もちろん俺にも使いこなせない。
>>74 そういう場合にMのところだけに色ってのは難しいと思うけど、
あらかじめ登録した語の色を変える機能がついたエディタは多いから、
主要なメッセージ名や構造体名は登録しておいたらいいんでは?
>>75 VS.NET2002、2003でもVC#では出るんじゃないかな
>74はスペルチェッカーの領分だな。英文ワープロソフトなら大抵ついてる機能だ。 後は辞書をカスタマイズすれば無問題。
79 :
デフォルトの名無しさん :04/11/25 04:41:06
a[0]=0 a[1]=1 a[2]=2 a[3]=3 という配列があるとします この配列のa[1]=1がいらなくなったので a[0]=0 a[1]=2 a[2]=3 のように効率よく変換できる方法ってないのでしょうか? 頻繁にこういう操作を繰り返さないとだめなんで…
realloc C++なら問答無用でstd::list
>>80 ご返答有り難うございます
std::listを調べてみます
82 :
デフォルトの名無しさん :04/11/25 05:14:20
アルゴリズムがほとんど理解できてないのに言語を 勉強するのは無理ですかね?
84 :
デフォルトの名無しさん :04/11/25 05:21:58
>83 今クラスである語が終盤を迎えていて来週から言語なんですが、 さっぱり分からずって感じです。独学でならそのようにできると思うのですが・・・ とりあえずある語を完璧に理解することは必要ということですよね?
アルゴリズムなんて全く理解する必要ないよ。
86 :
デフォルトの名無しさん :04/11/25 05:31:42
それはないでしょw
アルゴリズムなんてのはどっかの数学者が勝手に考えて どっかの低級PGが勝手に実装してくれるもの 自分は使い方だけ知ってりゃいい。
技術は陳腐化するが物の考え方は永遠である
89 :
デフォルトの名無しさん :04/11/25 05:38:41
>88 結局ある語的思想がないと言語は扱えないってことですよね?
91 :
デフォルトの名無しさん :04/11/25 05:43:06
流れ図てやつです。完成図をもとに流れ図を描くのです。 学生身分に答えていただいてすいません
べつにいわれたとおりのものつくれりゃいいよ
フローチャート如きでアルゴリズムを語るとは片腹痛いわ。
フローチャートで表現できないアルゴリズムの例を挙げてみて
95 :
デフォルトの名無しさん :04/11/25 12:40:01
gammaという変数はつかえないのですか
97 :
デフォルトの名無しさん :04/11/25 12:59:03
superという変数はつかえないのですか!(怒
101 :
デフォルトの名無しさん :04/11/25 13:10:15
>>84 なんだかアルゴリズムの意味自体よく分かってなさそうだが
お前の言うアルゴリズムはプログラマにとって絶対必要なものではないかもしれない。
けれどお前がテスト通るためには必要なんだろ。だったらあきらめて勉強しろ
>>103 辞書の内容を覚えていなくてもいい
辞書のひき方を覚えていればいいのだ
って言葉を思い出した
学生のころは辞書の内容を理解することに努め 社会人になったらその辞書をすぐに引き出せるようにしてればいい みたいなのだよね 話は戻って、アルゴリズムは快適になるための道具 プログラムを組むには必須ではないけど、あれば便利 なので、プログラムになれてきたらその必要性を感じて来るんジャマイカ?
そうだよな。だから辞書ソフトをパソコンにインストールしてある。
MS-IMEの辞書ならインストールしてあるぞ。
108 :
デフォルトの名無しさん :04/11/25 21:33:25
コンパイルしたら、再宣言の型が一致しないとでましたが、どういうことが考えられるでしょうか
int以外の関数を、宣言せずに使用した これが原因でなくても(勉強中は特に)、 コンパイラのオプションで、警告は最大にしておくこと。
111 :
デフォルトの名無しさん :04/11/25 22:25:09
ファイルから5個の数字を読み取り、それらを表示させる のにはどうすればいいんですか?
112 :
デフォルトの名無しさん :04/11/25 22:25:57
↑ 抽象的ですいません。 Cでfprint等を使ったやつです。
114 :
デフォルトの名無しさん :04/11/25 22:38:25
>>113 遅くなりました。
#include <stdio.h>
#define N 5
main()
{
float data[N];
int i,ndata=N;
char filename[100];
FILE *fp;
printf("input filename =");
scanf("%s",filename);
fscanf(fp,"%5d\n",&ndata);
printf("%5d\n",ndata);
for(i=0;i<ndata;i++){
fscanf(fp,"%f %f",&data[i]);
printf("%5.1f %5.1f\n",data[i]);
}
fclose(fp);
}
>114 微妙すぎるw ・fp いつオープンする? ・scanf() %5dの5は必要? ・%f%f なにがしたいの?
ワラタ
117 :
デフォルトの名無しさん :04/11/26 15:09:26
>>114 とりあえず突っ込むところ多すぎ。初心者用の本を読み直しましょう。
それと、読み取るファイルの内容や、どのように表示したいかも書かないと答えにくいよ。
学校の宿題なら専用スレへどうぞ
118 :
デフォルトの名無しさん :04/11/26 15:16:24
書籍の質問ですが ポインタの書籍で柴田さんと前橋さんの書籍がありますが どちらの方がおすすめですか?
VC++.netを2万だして買って来たよ なかなか使いやすいじゃない コンパイルエラーのところダブルクリックするとそこに飛んでくれるし Ctrl+F5でテストランが出来るのがすげぇ メモ帳+コマンドプロンプトでやってたときがバカばかしいな・・・
ネタで埋めないと、このスレももたなくなった?
ただの自慢か日記書き込みだろうと推測してみる
>>120 それが喪前にとってのVC++.netの価値なわけだな。
マクロエディタと同程度か。
関係ないが、.NETってC++を使う利点がどんどん無くなっていくみたいで、なんだか嫌いだ
C#のために作られたような言語だからな。当然の流れだな。
128 :
デフォルトの名無しさん :04/11/26 20:28:25
いやVBのためだろ (w そのうちWINではC++覚える利点が全く無くなったりしてな。 ま、俺は当分MFCとCOMでやっていくつもり。
VB好きのM$がC/C++を絶滅させるために作った
C#はMSがJavaともめたからできた言語なんだが。
131 :
デフォルトの名無しさん :04/11/26 23:10:59
mainの中でスレッドを作って、そのスレッドをmainから殺したくて、 pthread_killを使いたいのですが、その生成したスレッドだけでなく、 mainまで死にます。 mainは生かしたままで、そのスレッドのみ殺すにはどうすればいいでしょうか。
スレッドをどうやって作ったの?
133 :
デフォルトの名無しさん :04/11/26 23:37:15
pthread_t th; pthread_create(&th, ...); です。 pthread_kill(th, 9); で、mainまで落ちます。
windows+VC環境で while(!kbhit()); と等価なLINUX+gccのコードを教えてくだされ。
C言語ってなんですか?
>>134 int kbhitForLinux(void);
while (!kbhitForLinux());
/* ここにkbhitForLinux()の実装を書こうとしたが余白が足りないので割愛 */
>135 C programming language
C言語やってる人は ローマ字だけでオナニーできるって聞いたんですが 本当なんですか?
>>141 @
/(x)/
y
| |
これで抜けます。
@ /(x)/ y | |
ローマ字じゃねぇyp 私的解釈として 変数名や関数名にローマ字で宣言してるソースを見て ナニってるということにしますた(`・ω・´)
>>144 ローマ字以外の何で宣言するの?
アンダーバーと数字だけ?
英単語
もしかして、ローマ字とローマ字綴りを混同しているのかな?
そもそもローマ字ってなんだ?
ソースの文字列をローマ字という表現では不十分なので(記号もあるので) ローマ字=ローマ字綴りと私的解釈をしたわけで…(´・ω・`)
150 :
デフォルトの名無しさん :04/11/27 22:53:27
はじめまして。Cで、数学の関数などをグラフ化したいのですが、やり方がわかりません。 いろいろ検索してみたのですが、どうもやり方の書いてあるところを発見できませんでした。 教えてください! OSはXPで、BCCを使っています。
>>150 Windows プログラミングを勉強しないとだめかな。
簡単なライブラリならそこらへんに落ちてるかもしれませんが。
>>150 手っ取り早くグラフを書きたいだけならテキストでデータを吐き出して
グラフィックはグラフソフト(Excel gnuplot R)に任せるとか?
Excelみたいにウィンドウにグラフを表示したいんならこれじゃだめだけど
154 :
デフォルトの名無しさん :04/11/27 23:43:16
親切に教えていただいてありがとうございます。 まだ全くの初心者なので、とりあえず、Windowsプログラミングを勉強してみます!
Windowsプログラミングを「ついでに」勉強する神キター
別にWindowsプログラミングなんて「ついで」でよいのではない? どうせすぐに変わるものなんだから。 本質でもないし。
アフォはスルー白
数字の2にすごい興奮する
VC++.NETでGUIプログラミングをしたいんですけど、 SDKとMFCと.net Frameworkのどれがいいんでしょうか? 楽なほうがいいんだけど。
>>159 一番楽なのは .net Framework だろう。
その次に MFC で、最後に SDK。
WTL というものもあるが。
161 :
デフォルトの名無しさん :04/11/28 08:12:16
二次元配列の要領で、vectorの要素としてint型のsetを持たせたいのですが、 そういうのが可能だとしたら、どうやって宣言を書けばよいでしょうか。
std::vector<std::set<int> >
163 :
161 :04/11/28 09:00:52
>>162 ありがとうございます。VC6++使ってるんですが、
std::vector<std::set<int> >
↑のスペースって必要なんでしょうか?
ただの「決まり」ってことで覚えればよいですか?
スペース入れないとコンパイルエラー、
入れると警告が沢山出るもののエラーはでません。
>>163 スペース入れないとコンパイルエラーになるのは、>> 演算子と解釈されるから
どうしてもスペースを開けるのが嫌ならtypedef使え。 typedef std::set<int> set_int; std::vector<set_int>
>>164 >>165 なるほど勉強になりました。ありがとうございました。
あと、警告は#pragma warning (disable:4786)で黙らせる事ができました。
167 :
デフォルトの名無しさん :04/11/28 11:01:17
質問です。VC++ 6.0 を使っています。 SetTimer(1, 10, 0) として、10ミリ秒ごとに OnTimer を実行させているのですが、 計測したところ1秒間に64回ほどしか実行されていませんでした。 これはPCの処理能力の問題なのでしょうか? それとも SetTimer の精度の問題でしょうか? WM_TIMER メッセージがメッセージキューにたまっているようには見えませんでした。 また、これを解決して確実に1秒間に100回処理を行なわせる方法はないでしょうか?
168 :
デフォルトの名無しさん :04/11/28 11:47:43
はじめまして、redwolfといいます。 皆様に助けてもらいたいのですが、今,VC++6.0 MFCでプログラム を作成しています。 VC++6.0 MFCの月間予定表を使用し、日付を選択させれたら テキストに年と週番号を表示するプログラムを作成しています。 ですが、どうしても、選択した日付が表示されません。 ソースは SYSTEMTIME tm; CString strYear; // 表示用文字列 CTime t; // 時間を扱うクラス t = m_month.GetCurSel(&tm); strYear = t.Format("%Y%U");// m_ed1.SetWindowText(strYear); // 表示 を実行すると例えば2004年11月26日を選択しても1970と表示されます。 休日ですがみなさんのお力を私に貸してください。 お願いします。
知っているがお前の名前が気に食わないっつってんだよ。マルチが。
>167 精度の問題、そもそもWM_TIMERメッセージの優先度も低い。 精度の高い処理を行いたいなら、TimeGetTimeなりを使うと良いよ
>>168 なんだそれ?
よくそこまででたらめに作れるな。
関数の仕様ぐらい嫁
>>172 なんだそれ?
よくマルチにレス出来るな。
板の仕様ぐらい嫁
>>160 .net frameworkが一番楽なのはいいけれど
覚えやすさで言えば次はsdkだろ。ひたすら細かい処理書かないといけないから面倒なだけで
使い方自体は覚えやすいと思うぞ
それよりもMFCの方がクラスライブラリの仕様とか理解するのが初心者には面倒だと思う。
意味も分からず、こう書けって説明するなら楽だが。
>>171 ありがとうございます、timeGetTime() を使ってうまくいきました。
176 :
デフォルトの名無しさん :04/11/29 11:10:21
Windowsでコマンドラインプログラムをコマンドプロンプトを表示させずに実行させる方法を教えてください。 できれば、コマンドプロンプトで実行した時に表示される内容も取り込めるとよいのですが。
ウイルスでも作るの?
178 :
デフォルトの名無しさん :04/11/29 12:04:53
jpeg2psのフロントエンドを作りたいのです
説明面倒なんで「SetStdHandle CreateProcess」でググれ。
そういえばCDexからLameとか外部エンコーダ呼ぶときに DOS窓非表示の設定があるな オープンソースだしソース見ればわかるだろう
>>180 ソース=ドキュメントですね(`・ω・´)
182 :
デフォルトの名無しさん :04/11/29 12:30:55
176の親です。ありがとうございました。
183 :
デフォルトの名無しさん :04/11/29 12:53:47
VC++で計算した数値を引数で表示したいんですが、printfで表示されません。だからMessageBoxを使って表示したいんですがエラーがでます。どうしたらいいんでしょうか?どなたか分かる人教えてください。
char str[10]; wsprintf(str, "%d",num); MessageBox(hwnd,str,"suuji",MB_OK);
MessageBoxの解決する前にすることあるだろ
187 :
183 :04/11/29 13:13:59
何ですか?教えてください
188 :
デフォルトの名無しさん :04/11/29 13:34:52
マルチはだめでちゅよ
>>186 そこだけじゃなく、あちこち書いているっぽい。
>>183 >188も言うようにマルチはダメ。
VC++でもコンソールアプリにしておけば普通にprintf()も使える。
GUIでやりたいのかCUIでやりたいのか、そこをはっきりさせた方がいい。
190 :
デフォルトの名無しさん :04/11/29 15:41:23
Windowsのメインの音量を変更するにはどうしたらよいでしょうか?
te
はじめまして、C++の初心者です。 mainとファンクションを5つほどつくりました。 mainではファンクション1だけを呼び出します。 ファンクション1の中で必要に応じてファンクション2~5を呼び出したいのですが、 全部実行されてしまいます。 どのようにすれば個別のファンクションだけ呼び出せますか? 今はこんな感じです。 main {Function1()} Function1() {int chose; if(chose =2) Function2() if(chose=3) Function3() ・・・・・ それぞれのファンクションではテキストファイルを読み込み それをブラウザに表示させる動作を行います。 テキストファイルを表示語はファンクション1にもどりたいです。 上手く説明できなくて申し訳ありませんが、どなたか解決方法を教えてください。 環境はDevC++のバージョン4.0です。
「変数chooseが3ならば」は、「if (choose==3)」と表す。「choose=3」は代入。 初心者がよくやる間違い。
申し訳ありません、訂正です。 void Function1() 今はこのようになってます。 {int chose; これで2を入力するとファンクション2にいけるのですが if(chose =2) 3を入力してもファンクション2にいってしまいます。 {Function2()} なぜなのかわかりません。 elseif(chose=3) {Function3()} ファンクション1~5はすべてvoidです。
だーかーらー、「chose=2」は「choseに2を代入」と言う意味。 「if (chose = 2) ~」は「chose = 2; if (chose) ~」と同じ意味。 「if (2) ~」は「if (true) ~」と同じ意味。よって「~」は常に実行される。 君、いくら何でも素質ないよ?
>195さま 変えてみましたが変化がありません、もう少し詳しく書いてみます。 main{ Function1()} void Function1() {int chose =0; cin >> chose; if(chose =2) {Function2();} こんな感じです。 else if(chose =3) それともう一つ質問ですが、 {Function3()} Function2~5からFunction1に帰りたいのですが そのような場合はどうすればいいのでしょうか? return Function1();をFunction2()にいれて見ましたが反応してません。
199 :
デフォルトの名無しさん :04/11/29 18:47:35
もはや釣りとしか思えない
>197 素質がないのはわかってます。 ご指摘どうも。 やりたくなくてもやらなくてはならないのでやってます。 switchつかったほうがめんどくさくないですかね?
>>199 本気です。
プログラムなんてちんぷんかんぷんです。
本読んでも理解できません。
関わりたくないですがやらなければなりません。
202 :
デフォルトの名無しさん :04/11/29 18:49:48
if(chose=2) のところを if(chose==2) に変えろ ↑ ↑ =がひとつ!! =がふたつ!!!!!!!
>>198 いいかげんにしる!
=は代入だっつってるだろ
int main(void) {
Function1();
return 0;
}
void Function1(void) {
int chose = 0;
cin >> chose;
if(chose == 2) Function2();
else if(chose == 3) Function3();
}
ネタなんだろうけどちょっとかわいいな。 クリックリしたい・・・。
>>176 stdout, in, errをパイプで繋ぐ。
何気に CreateFile っていろんな機能が詰まってるよな。
RS232Cの制御とかな。すれ違いだけど。
ヘッダファイルの命名についてですが、ファイル名に何らかのプレフィックスを付けた方が良いですか? #include "io.h" /* or -I/path/to/src <io.h> */ #inlcude "utils.h" #include "private.h" と #include "xyz_io.h" #include "xyz_utils.h" #include "xyz_private.h" のどちらが好ましいか、と聞きたくなったのです。 それとも src/ *.c ソースファイル include/ include/xyz/ *.h ヘッダファイル のようなディレクトリ構成にして #include <xyz/private.h> /* -I/path/to/include */ の用にした方がよいでしょうか?
>>208 好みで決めればいいんじゃない?
大きめのプロジェクトなら後者が多い気はするけど。
>>209 後者ってのはディレクトリで分ける方な!
>>203 ありがとうございます。
できました^@^!
お手数かけてもうしわけありませんでした。
>>194 >>211 ところで main に型書かなくても動くのか?
あと、初心者だから仕方ないけど、
インデントとか空白も意識しような。
色々なパターンがあってどれがいいとは言えないけど、
ひとつのプロジェクト内では統一するに越したことはない。
>>212 関数の戻り値の方なら書かなくても動く。
がしかし、>194はそれ以前にプログラムとしては省略しすぎなので評価する意味がない。
STLの ofstreamで クラスオブジェクトを丸ごとバイナリファイルに保存したいんですが、 そのクラスにvectorのメンバ変数が存在します。 このままだと普通に保存できないんですが、どうしたらいいんでしょうか? このvector変数はprivateになってます。 STLのスレに書いたんですが誰も来ないのでこっちにしました
その短気さが身を滅ぼす
>>216 もう滅ぼされてます;; なので助けてください
もう少し向うで我慢してたら良かったのに。 おいらが回答しようかと思ってたんだが… マルチポストしたから、もう回答してやんない。残念でした。
220 :
デフォルトの名無しさん :04/12/01 01:59:04
Cによる四則演算の練習をしています。 演算結果に 1.#QNB と出るのですが何を意味しているのでしょうか? とんでもなく大きな数字にでもなってしまったとかですか? コンパイラVisual C++ 6.0を使っています。
コード書け
222 :
デフォルトの名無しさん :04/12/01 02:53:57
int型の配列aがあったとして、a["A"+1]はどういう意味になるんですか? "A"のASCIIコード+1番目の配列ということでしょうか?
"A"はどっかに確保された文字列"A"へのポインタ。 それに+1なのでAのあとの\0を指すポインタが[]内の式の結果。 式全体の意味は無茶苦茶。多分単なるバグ。
ただのエラーになる
(-"A"-) 寝ている赤ちゃん
ちょっと無理が
(-"u"-) こっちのほうがいい
スレの流れが読めん香具師が多いな。 "A"のことを語っているのに 必死で反論しているのは恥ずかしいぜ
( Д ) ゚ ゚
オール・フォー・A
Aのアスキーコードにしたけりゃシングルクォーテーション a[ 'A' + 1 ]
('A')
236 :
デフォルトの名無しさん :04/12/03 18:52:27
テンプレートで少々つまづいているのですが どなたかご教授願います. template <class T> class Hoge { public: T *GetNext(void); private: T *abc; } T *Hoge<class T>::GetNext(void) { return abc->GetNext();//不可能? } GetNext()を実装した型をTとして渡しても こういった使い方は出来ないものなんでしょうか?
abcにはなに入れてんだ? あと void は消せ
return this->GetNext(); にするか、 T *abc; の private: を public: にするか、 どっちかだろ?
m9['A']
ドーン
241 :
236 :04/12/03 19:19:54
すみません、ドキドキしながら書き込んだら全然違うこと書いてました 書き直したので何卒もう一度お願いします。 class HogeNode { public: void SetNext(HogeNode *next) {this->next = next;} private: HogeNode *next; } template <class T> class HogeList { public: void Add(T *t); private: T *first; T *last; } void Hoge<class T>::Add(T *t) { last->SetNext(t);//不可能? last = t; } こんな感じで匿名(?)のTのメンバ関数を呼ぶことは不可能なのでしょうか?
void Hoge<class T>::Add(T *t) ではなく void HogeList<class T>::Add(T *t) でした... すみません
>こんな感じで匿名(?)のTのメンバ関数を呼ぶことは不可能なのでしょうか?
可能
>>242 >void HogeList<class T>::Add(T *t)
void HogeList<T>::Add(T *t)
だよ
>>243 <T>に変えてみたのですがコンパイルで蹴られてしまいます
error C2027: 認識できない型 'T' が使われています。
もしかして別の問題なのでしょうか?
ちなみにコンパイラはVC7.1です
>>244 これでどうだ?
class HogeNode
{
public:
void SetNext(HogeNode *next) {this->next = next;}
private:
HogeNode *next;
};
template <class T> class HogeList
{
public:
void Add(T *t);
private:
T *first;
T *last;
};
template <class T>
void HogeList<T>::Add(T *t)
{
last->SetNext(t);//不可能?
last = t;
}
>>245 すると今度はリンクできないようです.
error LNK2019: 未解決の外部シンボル
ますます別の問題のような気がしてきました...
>>246 >ますます別の問題のような気がしてきました...
そう思う
>error LNK2019: 未解決の外部シンボル
のあとは?
ちなみに呼び出し元では hogeList = new HogeList<HogeNode>(); という風に書いています.
>>247 続きはこんな感じです.
Test error LNK2019: 未解決の外部シンボル "public: __thiscall HogeList<class HogeNode>::HogeList<class HogeNode>(void)" (??0?$HogeList@VHogeNode@@@@QAE@XZ) が関数 "public: __thiscall Test::Test(void)" (??0Test@@QAE@XZ) で参照されました。
>>249 >public: __thiscall HogeList<class HogeNode>::HogeList<class HogeNode>(void)
これはHogeListのコンストラクタだよね
Test::Test(void)の実装が書かれたファイル名と245の内容が書かれたファイル名は?
それと
> template <class T>
> void HogeList<T>::Add(T *t)
> {
> last->SetNext(t);//不可能?
> last = t;
> }
は
template <class T>
inline
void HogeList<T>::Add(T *t)
{
last->SetNext(t);//不可能?
last = t;
}
に
>>250 HogeListに書いていたコンストラクタを消して
コンパイラに自動生成してもらったらビルドできました
ということはコンストラクタの書き方が間違ってたっぽいです
この場合コンストラクタはどう書けばいいのでしょうか?
> それと
> > template <class T>
> > void HogeList<T>::Add(T *t)
> > {
> > last->SetNext(t);//不可能?
> > last = t;
> > }
> は
> template <class T>
> inline
> void HogeList<T>::Add(T *t)
> {
> last->SetNext(t);//不可能?
> last = t;
> }
> に
EfficientC++にもinline書いてました
付け忘れてはいけませんね
>>251 こんな感じ
template <class T>
class HogeList
{
public:
void Add(T *t);
HogeList ();
private:
T *first;
T *last;
};
template <class T>
inline
HogeList<T>::HogeList ()
{
}
>>252 別段普通ですよね...
それなのになぜかリンクできないorz
ここまでくれば何かの見落としだと思うのであとは自力で頑張ってみます
色々と勉強になりました
ありがとうございました
gcc3.4.2で通った template <typename T> class HogeList { public: void Add(HogeList<T>* t) { this->first = t; } HogeList(); private: HogeList<T>* first; HogeList<T>* last; }; template <typename T> inline HogeList<T>::HogeList() {} int main() { HogeList<int> hl; hl.Add(new HogeList<int>()); }
うほっいい流れ
236です その後、悪戦苦闘したのですが、 どうやらテンプレートの場合は関数の定義を ヘッダファイルの中に書かないといけないのですね。 リンク時にコンストラクタがどうしても見つからない理由が やっとわかりました。
今日の格言 「テンプレートは高機能マクロと思え」 ※マクロよりはるかに便利だけど
>>256 250で
>Test::Test(void)の実装が書かれたファイル名と245の内容が書かれたファイル名は?
と書いたのはそれ疑ってたんだけどね
>どうやらテンプレートの場合は関数の定義を
>ヘッダファイルの中に書かないといけないのですね。
基本的にはそうなんだけど
明示的に実体化しておけばその限りでないです
明示的な実体化は
例えばHogeListに渡すテンプレートパラメータが予め
HogeNodeとHageNodeしかないのなら
メンバ関数を定義した実装ファイル(.cpp)の最後で
template class HogeList<HogeNode>;
template class HogeList<HageNode>;
みたいにやります
>>258 明示的な実体化のときにはtemplateは書かない気がする。
260 :
デフォルトの名無しさん :04/12/03 23:46:50
Windowsプログラムで system("iexplore.exe"); とやるとDOS窓が開いてしまうのがかっこ悪いです。 DOS窓が開かない方法を知りたいのですが win32APIとかで別プログラムを起動させる方法ってありますか?
>>259 付けるのが正解のような気がする
規格の14.7.2
>>261 自分では見つけられませんでした。
検索しますんでキーワードおしえてください。
>>260 CreateProcess() や ShellExecute()
typedef int *INTPTR; const INTPTR p; は int * const p; だったなんて! MSがLP~なんて余計なもの作るから悪いんだ!
268 :
デフォルトの名無しさん :04/12/04 00:15:32
すみませんが教えてください Visual C++ 6.0 で以下のソースをビルドしても、rand() で生成される乱数が 常に 41 にしかならないようなんですが、何か間違ってますか? #include <iostream> #include <cstdlib> using namespace std; int main(void) { int magic; // 乱数を格 納 int guess; // ユーザの予想を格納 magic = rand(); // 乱数を生成、格納 cout << "Enter yout guess:"; cin >> guess; if ( guess == magic ) { cout << "*** Right ***"; } cout << magic; // 実際に生成された乱数を確認 return 0; }
俺はMだがSを付けろ
srand
273 :
デフォルトの名無しさん :04/12/04 00:24:24
srand ですか、調べてみます
274 :
デフォルトの名無しさん :04/12/04 00:34:31
わかりました MSDN libraryの rand の項目も見てたんですが、 ちゃんと読んでなくて、 「srand 関数を使って疑似乱数ジェネレータを初期化してから、rand 関数を呼び出してください。」 と書いてるのを見てませんでした ごめんなさい ハーバート・シルトの標準講座 C++ のサンプルだったんですが、 ちょっとぐらい説明がほしかったなぁ・・・
毎回同じ結果が欲しいこともあるので、逆に便利な機能ってことに なってる。<rand、srand
276 :
デフォルトの名無しさん :04/12/04 01:03:01
エスパー養成プログラムですから。
278 :
デフォルトの名無しさん :04/12/04 01:44:00
どなたか、ご存知でしたら教えていただきたいのですが、 C++ で Java のリフレクションに近いような機能を実装することは できるのでしょうか? 例えば int function() { ・・・ // この関数の中で "function" という文字列を取得したいです。 }
C++は知ってるクラスしか相手できない。 間にクラスを1個挟めばリフレクションまがいのことはできそうだけど、 あまり意味はなさげ。
VC++7.1には__FUNCTION__なんてマクロがあったりするがな。
ポータブルに BOOST_CURRENT_FUNCTION
関数のローカルスコープ内で関数名を知ることができるのと リフレクションは全然違うと思うんだけど。
>>284 >>278 >int function() {
> ・・・ // この関数の中で "function" という文字列を取得したいです。
>}
>>285 リフレクションとか関係ないですか、そうですか。
288 :
278 :04/12/04 02:34:21
すいません、それができれば間に合うので 最小限しか書いていませんでした。 やりたいことはあるクラスからメソッド名を抜いてきて テストコードとドキュメントを生成したいと考えています。
クラスからメンバ関数名を取得する場合、上記のやり方だと できなさそうだがな。
>>288 無理。ソース読んで生成するしかない。
河童とDoxygenは知ってるか?
291 :
278 :04/12/04 03:06:20
>>290 ありがとうございます。
DoxyGen にはかなりお世話になっております。
河童は知らなかったのでダウンロードしてみました。
すごく使えそうなので使ってみたいと思います。
あと、しつこくて申し訳ないのですが、
__FUNCTION__ もしくは __func__ が実装されていない
コンパイラ(ARM7)を使用している場合、
関数中で関数名を抜くことはできますでしょうか?
すいません、よろしくお願いします。
>>291 直書きしろ。いや、関数名取ろうとなんて考えるな。
293 :
278 :04/12/04 03:50:27
294 :
デフォルトの名無しさん :04/12/04 08:27:02
ruby以外の言語は糞
void set_callback(void (*func)()); のような関数に、メンバ関数を渡したいんですがうまい方法はないでしょうか? class A { public: void callback() {...} }; A a; void callback_wrapper(){ a.callback(); } main() { set_callback(a.callback); //エラー set_callback(callback_wrapper);//ださい set_callback(mem_fun_pointer_to_global_fun_pointer<A>(a,callback));//できることなら }
>>295 staticなメンバ関数しか出来ないような希ガス。
メンバ関数へのポインタってアドレス取っても変なアドレスになるしな。
仮想関数ならなおさら。
>>295 template <class T>
void set_callback(T* pthis, void (T::* func)()) {
// 保持
// 使う
(pthis.*func)();
}
#include <iostream> class Test { static int i; public: Test() {} static void print() { std::cout << "i = " << i << std::endl; } static void set(int j) { i = j; } }; int Test::i; int main() { Test t; t.set(10); t.print(); void ((*func)()) = static_cast<void ((*)())>(&t.print); func(); }
300 :
デフォルトの名無しさん :04/12/04 11:27:32
int* sumArrays(int* a, int* b, int N){ int* c = new int[N]; for (int i = 0; i < N; ++i) c[i] = a[i] + b[i]; return c; } これってコンパイルとラン可能ですよね? 自分でやってみたら、動いたんですけど。。。 でもエラーとか不利点とか、あるみたいで、それがいまいち、よく分からないんですが。。。 ポインターって、関数で、&パス(リファレンス)できないですよね? なんでですか?
>>300 おいおいdeleteは?
それから&*ってすればポインタのリファレンス取れるぞ。
>>296 最終的にはそうなるんだけど、なんとかその処理を自動化できないかと思いまして。
set_callback(mem_fun_pointer_to_global_fun_pointer<A>(a,callback));
↓なんか変態的な処理
//どっかグローバルな場所
void generated_wrapper() {
a.callback();
}
//関数内
set_callback(generated_callback);
みたいな。
>>298 のようにset_callback側のラッパを書くにしても、最終的に
set_callbackにvoid (*)()を渡してやらねばならないのでコマル
>>302 だから標準C++の仕様ではどうあがいても(ry
>>302 class A {
int i;
public:
explicit A(int n) : i(n) {}
void callback() { std::cout << "num : " << i << std::endl; }
};
template <class T>
class myCallback {
typedef void (T::* cbFunc)();
T* _obj;
cbFunc _func;
public:
myCallback(T* obj, cbFunc func) : _obj(obj), _func(func) {}
void exec() { (_obj->*_func)(); }
};
int main()
{
A a(10);
myCallback<A> cb(&a, &A::callback);
cb.exec();
}
こんなんじゃダメか?
>>304 あースマソ
グローバル関数ポインタを要求する既成のライブラリがあって、
それをどうにかしたいんですよ。
でも冷静に考えるとかなり複雑な処理をする必要がある……
これはあきらめたほうがいいかもわからんね。
>>305 サンクという方法もあるが、素直にラッパー書いたほうが簡単かもね。
>>305 WindowsAPIのコールバック関数みたいにユーザー定義の値を別に渡せないのか?
>>305 「既存の」じゃなければ関数オブジェクトをお奨めするところだが。
「プログラミング作法」p.136-139のコードを見ていて思ったのですが、 reallocした返り値のアドレスが元のアドレスとは異なる可能性があることを 考慮していないのはマズイのではないでしょうか? つまり、char *buffer が仮に"ABCDEFGH"を指しているとして、 char *p1 = buffer + 1; /* *p1 == 'A' */ char *p2 = buffer + 2; /* *p2 == 'B' */ char *p3 = buffer + 3; /* *p3 == 'C' */ char *temp = realloc(buffer, size_hoge); if (temp == NULL) { /* blah */ } buffer = temp; bufferがreallocで別の所に飛ばされればp1, p2, p3はもう無効ですよね? それを避けるためにはint p1, p2, p3のようにオフセットで管理するよう変更しなければならないですよね?
>>311 確かにそのコードはマズイね。
reallocに成功した時点でbufferはdeallocateされてるから
p1,p2,p3を再割り当てするかオフセット管理しないと…
313 :
デフォルトの名無しさん :04/12/05 04:07:18
>>311 どれに対するレス?
「プログラミング作法」ではそんなコーディングしてないよね?
314 :
デフォルトの名無しさん :04/12/05 08:59:34
#include<stdio.h> int main(void){ int a[2]; int *p; int cnt; a[0]=1; a[1]=2; a[2]=3; *p=a; for(cnt=0; cnt<3; cnt++ ) { printf("Input data %d\n",*p[cnt]); } return 0; 上のプログラムをコンパイルしたらエラーが出ました。ポインターの部分というのは分かるのですが すいませんご指導お願いします。 ex.c:12: warning: assignment makes integer from pointer without a cast ex.c:16: invalid type argument of `unary *'
*pの型はint pの型はint*
316 :
デフォルトの名無しさん :04/12/05 09:30:47
*p=a; はint*ではないのですか?
>>316 *p=a; は代入式に決まっておろうが、という突っ込みはさておき。
int *p;
これで宣言/定義されたint型ポインタは p だよ。
int* p;
上と同じだが、この方が判りやすいかも。
318 :
デフォルトの名無しさん :04/12/05 09:56:26
int *p;はint型ポインタは p という意味で、 *p=a;そのポインタpにaを代入・・・つまり、先ほどのプログラムを実行するには *p=a[2]とすればいいのですかね?
319 :
デフォルトの名無しさん :04/12/05 10:00:08
printf("Input data %d\n",*p[cnt]);がダメって言われました。何ででしょう? invalid type argument of `unary *'
320 :
デフォルトの名無しさん :04/12/05 10:01:25
printf("Input data %d\n",*p[cnt]);がダメって言われました。何ででしょう? invalid type argument of `unary *'
int *p; p=1←pに1を代入 *p=1←*p(=pが指しているint変数)に1を代入
>>318 違う。
p = aでいい。
pに配列aの最初のアドレスを代入。
配列の添え字を省略した場合、最初の添え字のアドレスを指すのは理解してるよね。
あとint a[2]と定義してるのにa[2]に代入するのは危険。
定義時の添え字は全体の個数、実際に使うのは添え字0からの数。
printfのところは*p[cnt]ではなく、p[cnt]でいい。
#include<stdio.h>
int main(void)
{
int a[3];
int cnt;
a[0] = 1;
a[1] = 2;
a[2] = 3;
p = a;
for( cnt=0 ; cnt<3 ; cnt++ ) {
printf("Input data %d\n", p[cnt]);
}
return 0;
}
↑ int *p; が抜けてた。 ポインタは難しいけど、理解すればカンタンだよ
324 :
デフォルトの名無しさん :04/12/05 10:22:52
もし、*p[cnt]とした場合、プログラムの意味的にはどういう意味になるのですか? すいませんたびたび
どっちの優先順位が高いのか忘れた。 *(p[cnt]) あるいは (*p)[cnt] プログラム的にはどっちもエラーだな。
classのprivate:で宣言した変数int *pA;をGet_A()などで値渡ししないで変えられないようにする方法はありますか? #include <stdio.h> class PIYO{ private: int *A; public: const int *Get_A( void ){ return A; } PIYO( void ){ A = new int; *A = 6; } }; int main( void ){ class NEKO Hoge; int *B = ( int * )Hoge.Get_A(); //かえられてしまう *B = 3; const int *C = Hoge.Get_A(); printf( "%d" , *C ); return 0; }
>>327 >>328 に激しく同意
そんなこといったらどんなprivateメンバだって((void *)&Hoge)[1]とかやれば変えられてしまう。たぶん
330 :
デフォルトの名無しさん :04/12/05 10:44:13
つまり、優先順位を気をつけて、printf("Input data %d\n", *(p[cnt])); こんな感じでしょうか? でもエラーなんですか・・・
331 :
デフォルトの名無しさん :04/12/05 10:47:14
>>327 なんでconst int *Bにしないの?
わざわざ小難しく考える事ない。できるだけシンプルに。 配列とポインタは似て非なる物。
>>330 #include<stdio.h>
int main(void)
{
int a[3];
int cnt;
int *p;
a[0] = 1;
a[1] = 2;
a[2] = 3;
p = a;
for(cnt=0 ; cnt<3 ; cnt++) {
printf("Input data %d\n", p[cnt]);
}
return 0;
p[cnt]は、pが指してるアドレス(ここではa[0])からcnt分だけアドレスを進めた場所にある内容を指す。 *(p[cnt])だと、内容の内容になってわけわかめ。 ポインタの本一冊買って勉強するといいよ。特にメモリの事詳しく説明してる本。
>>330 こうすれば問題なく動く。
#include<stdio.h>
int main(void)
{
int a[3];
int cnt;
int (*p)[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
p = &a;
for(cnt=0 ; cnt<3 ; cnt++) {
printf("Input data %d\n", (*p)[cnt]);
}
return 0;
}
336 :
デフォルトの名無しさん :04/12/05 11:09:31
>334 なるほど!わっかりました!すいません日曜の朝にこれからも精進していきます
インスタンスメソッドのポインタを 関数ポインタに格納することはできるのでしょうか? class class1{ public: void (*proc)(); void method(); }c1; c1.proc = c1.method; 6行目 error C2440: '=' : 'void' から 'void (__cdecl *)(void)' に変換できません。
338 :
デフォルトの名無しさん :04/12/05 11:19:30
>>337 c1.proc=class1::method
class class1 { public: void (class1::*proc)(); void method(); } c1; c1.proc = c1::method;
*(p[cnt])だと、p[cnt]で示されるアドレスの部分の値を読もうとするのかもナ。
342 :
デフォルトの名無しさん :04/12/05 21:48:46
標準C++の基礎知識(柏原正三 著:ASCII)を読んでC++を勉強しているのですが、 そのP.135に書いてある以下のサンプルコードがコンパイルできません。 どなたかアドバイスをお願いします。 【ソースコード】 #include <iostream> #include <string> using namespace std; class MyClass { static string class_string; public: static void SetString(string str) { class_string = str; } static string Show() { return class_string; } }; static MyClass::class_string = "MyString"; int main() { cout << MyClass::Show() << endl; MyClass::SetString("Changed!"); cout << MyClass::Show() << endl; return 0; }
【エラー内容】 list6-3.cxx:29: error: ISO C++ forbids declaration of `class_string' with no type list6-3.cxx:29: error: `static' may not be used when defining (as opposed to declaring) a static data member list6-3.cxx:29: error: conflicting types for `int MyClass::class_string' list6-3.cxx:14: error: previous declaration as `std::string MyClass::class_string' list6-3.cxx:29: error: invalid conversion from `const char*' to `int' 【動作環境】 OS: FedoraCore 1 コンパイラ: gcc 3.3.2-1 よろしくお願いします。
- static MyClass::class_string = "MyString"; + string MyClass::class_string = "MyString";
static MyClass::class_string = "MyString"; → string MyClass::class_string = "MyString";
orz
あと通常 inline からは static データメンバに正常にアクセス出来ないからな 何読んでるか知らんが窓から投げ捨てておけ
348 :
デフォルトの名無しさん :04/12/05 21:57:18
> 何読んでるか知らんが 標準C++の基礎知識(柏原正三 著:ASCII)と書いてあるが。
道を歩いていたらマンションの二階のガキが嘗めていたあめ玉を吐きだしたのが直撃して 頭を縫うハメになったことがあるから窓からものを投げ捨てるのは良くないと思うのです。
Rubyならこんなまだるっこしい事しなくて済むのにね。
353 :
デフォルトの名無しさん :04/12/05 21:59:30
>>344-345 ありがとうございます。
inlineからstaticなデータメンバには正常にアクセスできないんですか。
知りませんでした。
ありがとうございました。
やっぱり時代はrubyに向けて流れていると言える。 Ruby最強!
>>348 その本持ってるから見てみた。P135じゃなくて134だと思うが
string MyClass::class_string = "MyString";
になってた。
MinGWではdrand48()は使えないんですか?
マルチ
>>347 > あと通常 inline からは static データメンバに正常にアクセス出来ない
聞いたこと無いな。ほんとか?
361 :
デフォルトの名無しさん :04/12/05 23:06:11
警告 W8017 c:\Borland\Bcc55\include\stdlib.h 117: マクロ 'abc' の重複定義 とコンパイルすると警告出ますが、対応教えてくださいませませ。
363 :
デフォルトの名無しさん :04/12/05 23:13:18
ご指摘とおり、absでした。
>>359 俺も聞いたこと無い。
思いつくキーワードで手当たり次第ぐぐってみたけど見つからないんだけど
ほんとなのかな?
>>359 わしも聞いたことない。
普通に考えてそんなことあり得ないと思うんだけど。
inlineがstaticデータメンバにアクセスできない?知ったか君、いい加減にしなさい。
アクセスできない、じゃなくてinlineでアクセスしてはいけない、だよ。 知らない癖になんで偉そうなんだ?無知を誇るな。いい加減にしなさい。
情報のソースを示してくれ。 少なくとも俺はそんなの聞いたこと無い。
>>369 みたいなのはほっといて、漏れも理由が知りたい
>>369 ソースを示してからそのセリフ吐きなよ。
ドラフトのどこにそんな事が書いてあるんだ?知ったか君。
ばかだなぁ。ドラフトじゃなきゃ意味ないだろ。
楽天にドラフトでいきたい
>>375 正式な規格書じゃなくて、なんで草案(ドラフト)のほうなのさ?
ばかだなぁ。ドラフトじゃなきゃ面白くないだろ。
おまえら正式な規格書読んで喜んでるのか?ケッ、はやりじゃねぇんだよ。
どっちが知ったか君なんだ。知ったか君って言いたかっただけか。
そういや暗黙の inline は問題なくても 明示的な inline で怒られるのってなんで? 普通にソース書く分ではエラーは出ないけど 実際その関数を呼び出すとなるとエラーなんだよね…(´・ω・`) ついでだからおせーてちょ
#include <iostream> //ここから hoge.h class Hoge{ private: inta; public: Hoge(){ a = 10; } void hage(); }; //ここから hoge.cpp inline void Hoge::Mage(){ a = 100; std::cout << a << std::endl; } //ここから main.cpp int main(int argc, char *argv[]){ Hogehoge; hoge.Mage(); returnEXIT_SUCCESS; } 言われて書いてみた。で、新たに不思議なことが。 ↑のソースをmain.cpp内に全て書いたら問題なかったんだけど クラス宣言を hoge.h, メンバ関数を hoge.cpp で書いた時は Hoge error LNK2019: 未解決の外部シンボル "public: void __thiscall Hoge::hage(void)" (?hage@Hoge@@QAEXXZ) が関数 _main で参照されました。が出るよ… もちろんファイル分けたときはインクルード個別にしてるし、インクルードガードもちゃんとしてます 最初に確認したのはVC6.0だったけど、今はこれ VC7.1 です
あ、エラー文の hage は Mage に置き換えてください 結構お馬鹿な疑問(?)でしょうが、よろしくおねがいします
気になったんで調べてみた。 確かにC++ FAQsの FAQ 16.04 Can inline functions safely access static data members? で、「No!」ってはっきり書いてあるね。
>>383 inline関数の定義はその関数を使用するすべてのコンパイル単位に必要。
あう すいません、なんかめちゃくちゃになってますね… #include <iostream> //#include "hoge.h" class Hoge{ private: inta; public: Hoge(){ a = 10; } void hage(); }; inline void Hoge::hage(){ a = 100; std::cout << a << std::endl; } int main(int argc, char *argv[]){ Hogehoge; hoge.hage(); returnEXIT_SUCCESS; } これで上記のエラーが出ます 何度もすみません。・°・(ノД`)・°・。
>>386 上記で言うと具体的にどこでどのように書くのでしょう?
ミス続きなのでごめんなさい(´・ω・`)
>>390 class Hoge の定義と同じファイルに書いてしまう。
>>383 インライン関数はコンパイル時に展開処理されるので、
関数呼び出し位置から、その関数の定義が見えていなければならない。
非インライン関数はリンカで最終的に結合されるため、
コンパイル段階では宣言のみが見えていればいい。
>>390 ヘッダファイルに定義を書く
>>390 , 391
なるほど
つーことは明示的 inline と 暗黙の inline は
読みやすさに気を配る人は前者、
特に気にしない人は後者みたいな認識でいいのかな?
付き合ってくれてありが㌧
もうだめ…
×
>>390 ,,391
○
>>391 ,392
社会人になるまでに直さなきゃ
今日はとっとと寝ときます
>>389 意訳になるけど、
ユーザー定義型のstaticデータメンバが初期化されるのが保証されているのは
staticメンバの定義があるのと同じコンパイル単位の、non-inline関数が呼び出される前だから、
もし別のコンパイル単位からnon-inline関数を呼び出す前にinline関数を呼び出してしまうと
初期化される前にstaticメンバを利用してしまう可能性がある
らしい。日本語版は売り切れてて持ってないから間違ってるかもしれない(´・ω・`)
サンプルソースを引用すると
// Hoge.hpp
class Hoge {
public:
static void f() throw();
static string g() throw();
private:
string s_;
};
inline string Hoge::g() throw() { cout << s_; return s_; }
// Hoge.cpp
#include "Hoge.hpp"
string Hoge::s_ = "Hello";
void Hoge::f() throw() { cout << s_; } // OK 初期化は保証されている
// main.cpp
#include "Hoge.hpp"
int main() { Hoge::g(); } // s_は初期化されているか?
- string s_; + static string s_;
>>397 __declspec(selectany)使ってヘッダにstaticメンバを書いたらどうなるんだろう
>>397 その理由が問題にしているのはこれだろう。
3.6.2/3 から引用。
"If the initialization is deferred to some point in time after the first statement of main,
it shall occur before the first use of any function or object defined in the same translation unit as the object to be initialized."
簡単に訳すと、
「初期化がmainの最初の文よりも後に遅らされるとすれば、
同じ翻訳単位で定義されているどの関数、オブジェクトの
最初の使用よりも前で無ければならない。」
(最後の"as the object to be initialized"がよくわからない)
397の意訳では、
「関数、オブジェクトの使用」を「non-inline関数の呼び出し」に限ってしまっているのが、
規格の意図とは違うと言えるだろう。
>>400 なるほど… 原文では
Static data members are guaranteed to be initialized
before the first call to any non-inline function within
the same source file as the static data's definition.
となってたもんで。
ところで、ドラフトな知ったか君はドコいった?
お願いします。。VC++6.0を使っているのですが、ウォッチウィンドウでAという関数の返り値を調べたいのです。 ソース内で、Aという関数の引数にBという関数の戻り値を使っています。B(C)がエラーとして-1を返した時に、A(-1);となるので、 そのばあいA関数内でexit(-1);が呼び出されるようにしているのですが、ウォッチウィンドウにA(B(C))と打って、 Bの返り値が-1だった時に、VC++が異常終了してしまいます。(以降.dswを削除しないと起動しません。) ウォッチウィンドウでBの返り値が-1だった時にA()を呼び出さないようにするにはどうしたらいいのでしょうか。。 ちなみにA((B(C)!=-1)?B(C):999)では動きませんでした。。(999はとりあえずの例です。) 長文すみません。。
お願いします。。VC++6.0を使っているのですが、ウォッチウィンドウでAという関数の返り値を調べたいのです。 ソース内で、Aという関数の引数にBという関数の戻り値を使っています。B(C)がエラーとして-1を返した時に、A(-1);となるので、 そのばあいA関数内でexit(-1);が呼び出されるようにしているのですが、ウォッチウィンドウにA(B(C))と打って、 Bの返り値が-1だった時に、VC++が異常終了してしまいます。(以降.dswを削除しないと起動しません。) ウォッチウィンドウでBの返り値が-1だった時にA()を呼び出さないようにするにはどうしたらいいのでしょうか。。 ちなみにA((B(C)!=-1)?B(C):999)では動きませんでした。。(999はとりあえずの例です。) 長文すみません。。
しかも2重すいません・・・orz
406 :
デフォルトの名無しさん :04/12/06 22:11:29
407 :
デフォルトの名無しさん :04/12/07 00:43:02
more Effective C++ を読んでいるのですが、自作クラスのoperator をprivateで隠蔽する、っていうのは皆さんやってるんでしょうか? ベテランの人の意見をお聞かせ願いますか? 隠蔽したいときは隠蔽する、的な解はいりません
>>407 >隠蔽したいときは隠蔽する
これ以外の回答は有り得ないのだが?
つまり解はいりませんのです。
よっしゃっ、おじさんが回答しちゃる。 隠蔽する必要があれば隠蔽する これだな。
おあとがよろしいようで。さんくす。
412 :
デフォルトの名無しさん :04/12/07 01:58:59
Cで、計算したデータをファイルに書き出したいんですけど、 例えばdata_on_001_times.dat、data_on_002_times.dat ・・・ みたいに、何回目のデータかわかるように名前をつける (ファイル名に変数を使う?)ことってできるんでしょうか? できるならやり方を教えて欲しいです。
今まで何度同じ質問が出てきたことか…( -ω-)y-~~
すみません・・・ ありがとうございます。
初心者歓迎じゃないのかYO!
同じ質問のデジャブは初心者スレでは仕方がないな。 だれかがFAQをまとめてくれるとみんながハッピー。
418 :
デフォルトの名無しさん :04/12/07 02:41:28
bcbにて ボタンを押してる間ずっと数値が増えるようなプログラムを作りたいです ご指導ご鞭撻をお願い致します
>>418 一番簡単に済ませるにはOnMouseDown/OnMouseUpで
Threadを動かすといいね。
--- Unit1.cpp
IncrementThread* itp;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
itp = new IncrementThread(false); // Labelをインクリメントする
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1MouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
itp->Terminate();
delete itp;
}
--- Unit2.cpp __fastcall IncrementThread::IncrementThread(bool CreateSuspended) : TThread(CreateSuspended) { } //--------------------------------------------------------------------------- void __fastcall IncrementThread::Execute() { while (!Terminated) Synchronize(IncrementLabel); } //--------------------------------------------------------------------------- void __fastcall IncrementThread::IncrementLabel() { int i; i = Form1->Label1->Caption.ToIntDef(0) + 1; Form1->Label1->Caption = AnsiString(i); }
カウントアップする速度はSleep()か何かでExecute()内のループを 制御する。上のプログラムは省略してあるが。
423 :
デフォルトの名無しさん :04/12/07 13:35:46
今、ウィンドウを作成してるのですがリサイズできるようにするには どうしたらいいですか?ご教授お願いします。
せめてOSとコンパイラの名前ぐらい書いとけ。
425 :
デフォルトの名無しさん :04/12/07 13:40:37
すいません。windows2000で.NETC++でやってます。
>>425 MFCでデザインしているならダイアログのプロパティ。
427 :
デフォルトの名無しさん :04/12/07 16:45:19
File I/Oでなんだけど、 ofstream outStream; ousStream.open("file.txt",ios::app) このios::appって、なに?
ここ一年C#だったんでC++のこと忘れぽ。おまいら教えてください。 class hoge { public: int i; }; class mage { public: void * h; }; class Visitor { public: virtual void visit (hoge* X) { } virtual void visit (mage* X) { } }; class DerivedVisitor : public Visitor { public: void f (hoge * X) { visit (X); } void visit(mage * X) { } }; っていうコードがあったとき、DerivedVisitor::f() の中からの visit 呼び出しでエラーになるっす。 (続く)
----------- > gcc testmain.cpp testmain.cpp: In member function `void DerivedVisitor::f(hoge*)': testmain.cpp:14: error: no matching function for call to `DerivedVisitor::visit (hoge*&)' testmain.cpp:15: error: candidates are: virtual void DerivedVisitor::visit(mage*) ----------- VC↓ ----------- ...\testmain.cpp(14) : error C2664: 'DerivedVisitor::visit' : 1 番目の引数を 'hoge *' から 'mage *' に変換できません。 指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。 ----------- Visitor::visit ってやれば回避できるのは解るんだけど、知りたいのはそういうことじゃなくて、なんでここで仮想関数呼び出しじゃなくて、ふつうのメソッド呼び出しになっちゃうんだ?っていうのが疑問。 Visitor を継承した時点で、visit(mage *) は vftable に登録されるんじゃ無いのかとかそういうC++の言語構造がわかんなくなった。 どうなってるん?
----------- > gcc testmain.cpp testmain.cpp: In member function `void DerivedVisitor::f(hoge*)': testmain.cpp:14: error: no matching function for call to `DerivedVisitor::visit (hoge*&)' testmain.cpp:15: error: candidates are: virtual void DerivedVisitor::visit(mage*) ----------- VC↓ ----------- ...\testmain.cpp(14) : error C2664: 'DerivedVisitor::visit' : 1 番目の引数を 'hoge *' から 'mage *' に変換できません。 指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。 ----------- Visitor::visit ってやれば回避できるのは解るんだけど、知りたいのはそういうことじゃなくて、なんでここで仮想関数呼び出しじゃなくて、ふつうのメソッド呼び出しになっちゃうんだ?っていうのが疑問。 Visitor を継承した時点で、visit(mage *) は vftable に登録されるんじゃ無いのかとかそういうC++の言語構造がわかんなくなった。 どうなってるん?
>>431 仮想関数に関数の多重定義解決を混ぜるな。
ほぼ間違いなく意図通りの動作をしない。
今の例で言うと、'DerivedVisitor::visit(mage *)が仮想関数 'Visitor::visit(hoge *)を
隠蔽しているため、DerivedVisitor::visit(mage *)は仮想関数として処理されない。
virtualを付けても無駄です。
仕様だね。 俗に言う(本当に言われてるかは知らん) 「名前が隠される」状態。
仕様かー。なら仕方ない。とりあえず、こうしてみた。 ------- class Visitor; class base { public: virtual void accept(Visitor * v) = 0; }; class hoge : public base{ public: void accept(Visitor * v); }; class mage : public base{ public: void accept(Visitor * v); }; class Visitor { public: void visit (base* X) { X->accept(this); } virtual void visitHoge(hoge* X) { /* default action */} virtual void visitMage(mage * X) { /* default action */} }; class DerivedVisitor : public Visitor { public: void f (hoge * X) { visit (X); } void visitMage(mage * X) { } }; void hoge::accept(Visitor * v) { v->visitHoge(this); } void mage::accept(Visitor * v) { v->visitMage(this); } ------- visitHoge とか、visitMage とか妙な感じだ。マクロとかテンプレート(ここで使えるのか?)とか使いたくないから、これで我慢するしかないのかな? ありがとう、432,433。
434、一行目。 仕様かー を 隠蔽かー に読み替えてくれるとありがたい。 だからどうしたって感じだけど。
どうしても
>>429 の形式にしたいのなら、
Derivedの中に、
using Visitor::visit;
の行を入れればよい。
Visitor::のvisitという名前が、現在の名前照合空間に含まれるようになる。
437 :
デフォルトの名無しさん :04/12/07 18:19:23
Visual C++ 6.0とWindows2000で以下のようなプログラムを作っています。 1.5秒ごとに特定フォルダをチェック。 ↓ 2.そこへホストからファイルがftp転送(PUT)されてくる。 ↓ 3.転送されたファイルを見つけたら、別の場所へコピーする。 ↓ 4.1へ戻る。 しかし、3の段階でファイルが転送中にもかかわらず、ファイルをコピーしようとして失敗します。 これはftp転送の仕様上、ファイルが少しずつ出来上がっていくからだと思いますが、 転送が完全に終わるまでコピーしない(転送が終わったかどうか判断する)方法をご教授ください。
>>437 ダウンロード終了(してプログラムがファイルを閉じる)まではCreateFileのdwShareを0にするとオープンできないはずだから、
それを使ったらどうだ?オープンできたら、ついでにReadFile/WriteFileあたりを使って自分でコピーしたらどうだ。
thx, 436
cmd.exeをWindowを表示させずに起動させたい場合はどうすればよいですか? CreateProcessではSW_HIDEで指定しても無理だということになってるのでよろしくお願いします。
コマンドプロンプトで動くソフトの出力をPipeを使って取り込もうとしています。 でもプロンプトがでてしまうのでどうにかならないかと思い質問しました。
ちょ(ry
>>442 それならCreateProcessでDERACHED_PROCESSを指定すればいいだけ。
>444 ありがとうございました。やってみます。
446 :
デフォルトの名無しさん :04/12/08 10:29:24
Dateっていうクラスがあって、 ostream& operator << (ostream& os, const Date& d){ os << d.month << d.day << d.year; return 0; } この関数もあるわけなんだけど、このostreamをintとかvoidみたいに使っているのが いまいち、よくわからないんです。 osっていうのが、ファイルだから、それを受け渡しするときに使うってこと? でも、なんでosをreturnする必要あるんですか? ファイルは、存在するわけだから、またメインなり、どこかで、開けばいいんじゃないんですか?
>なんでosをreturnする必要あるんですか? return 0;
>.446 マジレスすると、 std::cout << foo << bar << std::endl; のようにosを返しておくと便利。 ついでに言えば、ostreamはファイルそのものじゃない。 まぁ、C++の入門書でも読んでらっしゃい。
>>446 そもそもcoutとか使ったことあるのか?
451 :
デフォルトの名無しさん :04/12/08 14:33:25
Localeまわりその他SEで追加された部分は禿のサイトからPDFで落とせたはずだが。
>>452-453 お、これと errata と 3rd があればOKのようですね。
情報ありがとうございます。
455 :
デフォルトの名無しさん :04/12/08 17:17:33
すいません教えてください。 charの比較をしたいのです。 char c; の中は0~9まで、A~Cまで。 とチェックしたいのですが、どうしたらよいでしょうか?
456 :
デフォルトの名無しさん :04/12/08 17:20:51
ちぇけらっちょ
457 :
デフォルトの名無しさん :04/12/08 17:22:27
>>455 ('0' <= c && c <= '9') || ('A' <= c && c <= 'C')
>>455 if (isdigit(c) || toupper(c) - 'A' < 'C' - 'A')
なんたら;
else
ほげ;
0-9とA-Fならisxdigitが使える。
HSPでRPG作りたいんですが、正直難しいと思います。 でもやりたいんです!!僕はHSPでブロック崩し(アルカノイド) ぐらいなら作ったことあります。 今のところ、オープニングまで作ったのですが、どなたか僕に HSPの基礎からすべてを叩き込んでくれませんか?? お願いします。
>>460 お前に人生のうまい渡り方を教えてやりたいよ。
基礎からすべてをたたき込めなんて大仕事をタダで引き受けさせようとする
お前の根性を叩き直してやりたい。
463 :
デフォルトの名無しさん :04/12/08 17:40:15
465 :
デフォルトの名無しさん :04/12/08 18:39:45
パーティクルを飛ばすためのプログラムを組めといわれたのだが正直判らんのでだれか教えてください。 開発環境は.NETの2003アカデミック番でGSLIBってのを使ってるっす
>>465 僕もわかりません。
学校の先生に聞いてください。
>458 >459 ありがとうございました。 >457 すいません、今そっちも勉強中です。
質問ですunsorted list(ソートされないリスト)で ┏━┳━┳━┳━┳━┳━┓ ┃10┃53┃24┃35┃ ┃ ┃ ┗━┻━┻━┻━┻━┻━┛ と配列が渡されたとき、「75」を挿入すると ┏━┳━┳━┳━┳━┳━┓ ┃10┃53┃24┃35┃75┃ ┃ ┗━┻━┻━┻━┻━┻━┛ となるので正しいですか?? また、 ┏━┳━┳━┳━┳━┳━┓ ┃10┃53┃24┃35┃ ┃ ┃ ┗━┻━┻━┻━┻━┻━┛ から53を削除した場合、リストはどの様に並びますか? よろしくおねがいしますm(_ _"m)
>>468 これ以上マルチするとアク禁要望出す?かもなー
要するに答えられないわけですね。 【初心者歓迎】なんてスレだから質問してみたのですが、 カキコした自分が馬鹿でした。 頼りにならない人しかいないなんて知らなかった。
>>471 ┏━┳━┳━┳━┳━┳━┓
┃10┃53┃24┃35┃75┃ ┃
┗━┻━┻━┻━┻━┻━┛
で合ってる
53削除するとこうなる
┏━┳━┳━┳━┳━┳━┓
┃10┃ ┃24┃35┃ ┃ ┃
┗━┻━┻━┻━┻━┻━┛
これでいいか?分かったら帰れ
>>468 >>471 は最初に質問した奴じゃないだろ。
面白がってあちこちにコピペ貼りしているだけ。
釣り釣られ~
476 :
デフォルトの名無しさん :04/12/08 20:40:21
HSPでRPG作りたいんですが、正直難しいと思います。 でもやりたいんです!!僕はHSPでブロック崩し(アルカノイド) ぐらいなら作ったことあります。 今のところ、オープニングまで作ったのですが、どなたか僕に HSPの基礎からすべてを叩き込んでくれませんか?? お願いします。 全裸で
とりあえずオープニング見せてよ 全裸で
オープニングはあとで作れよ
私は見た事無いですYO
すみません、初歩的なことだと思うのですが… C++で、あるクラスへのポインタの配列を格納する場所を newするにはどう書けばよいのでしょうか?とりあえず TEST **ppTest; ppTest = new (TEST*)[100]; のように書いてみたらエラーが出ます。正しい書き方を教 えてもらえないでしょうか。
new TEST*[100];
C++ では生ポインタも配列も使いません。 std::auto_ptr や std::vector, deque 等の使用を考えましょう
まあオレならboost::shared_array<Test>とかstd::vector<boost::shared_ptr<Test> >とか 使うけどね
>>486 それ使うとstd::mem_funが動かなくなるから嫌だ。
boost::mem_fn使えばいいけど。
>>482 ppTest = new TEST*[100];
なにこのスレ
1・2のアッホ!! 言ってみたかっただけ。 誰もしらんだろうな…。
なんだか「コン・タロウ」だとか「監督」だとか、妙な単語が頭に浮かぶのだが…
496 :
デフォルトの名無しさん :04/12/09 03:48:19
バイナリ配布する自作のlibXXXに、libstdc++の中から必要なものを 入れておく方法はないでしょうか? 実行形式ならスタティックリンクできるんですが、 libXXXだとどうやったらいいのやらわかりません。
497 :
デフォルトの名無しさん :04/12/09 04:18:30
.netのVC++で、gprofのような解析を行うソフトはありますか?
質問です。 OS:FreeBSD コンパイラ: cc という環境で、次のように定義します。 int i; char msg0[255],msg1[255],msg2[255]; msg0 = "message 0"; msg1 = "message 1"; msg2 = "message 2"; このように定義したmsg0~2をforループのなかで順に呼び出したいとき、 つまり変数名の一部としてiを展開するにはどうすればいいのでしょうか? msgiでは別の変数名になってしまいます。 for (i=0;i<3;i++){ printf("%s",msg???); }
>500 私は大真面目ですが、無知です。 言語使用上、不可能ということでしょうか? ほかにうまいやり方は無いものですかね?
言語使用上→言語仕様上
>msg0 = "message 0"; Cではこんな書き方は許されてない(動くけど)。 自分が何をやっているのかも理解できてない。 とりあえず君にCは無理なので、2,3年BASICで 勉強してきた方が良いと思われ。
>>499 二次元配列にすればいいだけじゃないか。
char msg[3][256];
それが無理ならポインタを使え。
char *pMsg[3] = {msg0, msg1, msg2};
>503 定数の文字列の定義は、次の形が推奨されると了解しました。 (K&R百回読んで逝って来ます) const char msg0[]="hoge"; >504 ポインタを使う方法で望む動作ができました。 ありがとうございました。もっと勉強します!
>>499 釣りなんだろうが、つまらないしウザイのでマジレスしとく
初心者用の本の配列のところでも読め
そして自分の馬鹿さが分かったら、プログラミングなんてあきらめろ
わからないので続けます。
>>msg0 = "message 0"; >Cではこんな書き方は許されてない(動くけど)。 動かねぇよ! >char msg0[255],msg1[255],msg2[255]; >msg0 = "message 0"; 配列名への値の代入なんて出来る処理系があるならうp汁。
511 :
デフォルトの名無しさん :04/12/09 15:46:50
>>499 新しいCの本買ったら?
あなたにはK&Rは向いてないよ。
最近2CHのやりすぎで、 >('0' <= c && c <= '9') || ('A' <= c && c <= 'C') これが顔文字をつかったAAに見えてしかたありません。もうそろそろ足を洗ったほうがいいでしょうか?(Cから)
>>513 他の言語でも大して変わらんと思うが。
精々 'A' が "A" になるくらい。
('A`)
("A")
int m9['A'];
毎度同じネタでうざい
おまえに言われちゃおしまいだな
char ch = 1["A"];
orz=3
warota
524 :
デフォルトの名無しさん :04/12/12 23:02:50
あ
526 :
デフォルトの名無しさん :04/12/13 00:25:34
なぜ、アドレス渡しをすると戻り値はないのでしょうか?教えてください
アドレス渡しをして戻り値のある関数は幾らでも有るが
528 :
デフォルトの名無しさん :04/12/13 00:40:12
たとえば #include<string.h> #difine NAME_MAX 19 #difine BUF 256 { printf("Input Name : "); scanf("%s",&buf[0]); if(strlen(&buf[0]) <= NAME_MA { strcpy(&data.name[0],&buf break; } printf("\n Sorry"); } twice_no(&data); display_data(data); return 0; } void twice_no(Person *pdata) { pdata->no *= 2; return; }
次の方どうぞ
530 :
デフォルトの名無しさん :04/12/13 00:55:29
C++が++Cと命名されなかった理由は何ですか?
531 :
デフォルトの名無しさん :04/12/13 00:58:29
前処理、後処理考えれ
C++Primeの問題にあったな… 解答編持って無くて未だに模範解答を知らない
考えたらC++の方が自然だろうに
すま++Cな
535 :
デフォルトの名無しさん :04/12/13 01:33:42
まったり
"++C"は"Cをインクリメントしたもの" "C++"はCを"インクリメントしたもの" と解釈するのはどうか つまり前者はCとは別物の値であり 後者はCに付加価値を与えたもの いまいち伝わらないか… まぁでもこういう話はいくらでも出てるんだろうな
___ クルッ… / || ̄ ̄|| <⌒ヽ )) | ||__|| < 丿 | ̄ ̄\三⊂/ ̄ ̄ ̄/ | | ( ./ /
>>537 伝わる伝わらない以前に完全に意味不明だ
++CはC自体をインクリメントするけど C++でインクリメントした奴とは別にCを置き去りにしてきましたとか…
C++ってセミコロンうってないでしょ だからまだインクリメントされていない、不完全なわけよ 作者の言い訳のために後置なのよ
作者だビョーン
C++ ↑↑ 袋竿
最初のC++コンパイラはCのソースを吐き出していたって言うじゃん。 逆に言えば最初のコンパイラがアセンブリ言語や機械語を直接吐き出すものだったら++Cになっていたと思うよ。
オブジェクトの特定のパブリックメンバ変数に対してstd::findをしたいのですが その特定のパブリックメンバはオブジェクトの値というほどのものではなく、operator==を定義するのは無理があります。 std::pairのsecondのようなかんじです。 ファンクタを作ってfind_ifするのも大げさな感じです。 boostのラムダ以外でさらりと実装する方法はありますでしょうか? プライベートメンバ変数でgetterがあればboost::bindでさらりとかけるようですが。。。
546 :
545 :04/12/13 14:08:06
ageマース
C++でreallocを使ったらいけないんですか?
>>547 いけなくはないが、newしたものをreallocするとかは駄目だよ。
renewってあったっけ?
ない。そんなことするぐらいだったらstd::vector<>使え
551 :
デフォルトの名無しさん :04/12/13 18:55:12
552 :
デフォルトの名無しさん :04/12/13 19:12:16
なぜ.jpg
553 :
デフォルトの名無しさん :04/12/13 19:18:23
>>552 あぷろだがJPGじゃないと対応して無いので。
拡張子を変えただけなので中身はテキストです。
ビューアでも一応見れますが整形されていません。
IEならキチンと見れます。
VCだと何の問題もない。 コンパイルに失敗したとき何かメッセージは出ないの?
今時LISI-Cなんか使うなよ。 どうせ最終行に改行がないとかそんなのだろ。
>>551 俺もLSI Cでコンパイル&実行できた。
インクルードフォルダとかの設定がまずいんじゃないか?
>>554-
>>556 改行入れたらできた・・・
わけがわからん。
どうもありがとうございました。
LSIC以外を検討します。
出たメッセージも読めないのか
Rubyist! →何コイツ
Rubyは採鉱言語
>>557 LSI-Cはコンパイラオプションによっては最終行に改行がないと正しくコンパイルできなくなる。
コードパーサの問題ではなく、コードジェネレータの問題なのでエラーが起きず、
実行して初めて異常動作に気付くケースもある。
#気付けばいいほうか。
ウォーニングの事か?
そのネタはいいから。
ちゃんとISO Cでもソースは改行で終わっていなければならないって書いてある。
C/C++でメールの読み書きを行うライブラリは既存の定評あるものが存在しますか?
メールの読み上げと代筆してくれるのかと思った。
OpenMail
569 :
デフォルトの名無しさん :04/12/14 14:25:56
ふと思ったのですが、動的に確保した配列の数値のみ変更を許す事は出来ますか? つまりポインタの参照先は固定で、参照先の数値のみ書換可能ということ。 *const宣言だと動的確保が出来なくなっちゃうのでconst_cast使うしかないですかね?
>>569 宣言と同時に初期化しろ。
int *const p = new int[n];
571 :
デフォルトの名無しさん :04/12/14 15:09:07
>>570 それは考えたのですが、そのポインタをクラスのメンバとして宣言し、
特定のメソッドが呼ばれた時に任意の領域を確保しようとした場合に
どうすりゃいいのかな?と(コンストラクタが呼ばれた時点では
サイズが不明)。説明不足で申し訳ありません。
例えば画像を扱うクラスで、画像データをロードする関数が呼ばれた
時に、その画像のサイズの大きさのメモリを確保したりとかです。
ポインタをprivateにして、publicな関数で参照渡しにすればいける
とは思うのですが、func()[x][y]みたいな書き方はスマートじゃ
無いかなと思ったもので。
privateなポインタとpublicなポインタの両方を用意しておけば、
publicの方の参照先を変更されても最悪メモリリークは防げるけれど
他に方法はありませんかね?
スマートポインタ。つか、単にお前のクラス設計がだめなだけだとおも。
横槍ですまんけど ちったあ改行してよ・・・
改行して行と行の間を空けて ってことね
>>570 あのう、横槍スマンが、
int* const p = new int(n);
と書きたかったのですか?
576 :
デフォルトの名無しさん :04/12/14 15:35:45
>>572 むぉっ、スマートポインタの存在を忘れてました…。
クラス設計にツッコまれると何も言えないです・・・。もっと勉強します。
577 :
デフォルトの名無しさん :04/12/14 16:08:14
>>572 自己解決というかクラス設計を見直した結果、添え字の演算子をオーバーロード
することで全て解決しました。やっぱダメな設計でした。
ありがとうございました。
開発途中はmingw/msys/gccで作業してリリースにvcでやる人の意図はなんでしょうか?
580 :
デフォルトの名無しさん :04/12/14 20:20:23
教えて下さい! 参照って何 具体的な使用例とか、詳しいサンプルとかほしいなぁ お勧めのホームページとか、あったら教えて欲しいし お願いしますね
int n; int *p = &n; *p = 1; cout << n; ↓ int n; int& r = n; r = 1; cout << n;
>>580 お前なめてんのか?
なにマルチポストしてんだよ。
583 :
デフォルトの名無しさん :04/12/14 21:09:56
失礼します。 ↓この3行がどういう処理をしているのか教えて下さいです。 if(sum & 0x80000000){ sum = (sum & 0xffff) + (sum >> 16); }
sumが32ビット非負整数とすれば sumの最上位ビットが立っていたら、sumの値を (sumの下位16ビット) + (sumの上位16ビット) にする
やってることはわかるが、何がやりたいのかがわからんな。
586 :
デフォルトの名無しさん :04/12/14 21:33:37
質問お願いします。 LINUX環境でCプログラム中の各関数が何クロック使ったのか調べたいのですが、 クロック数を調べるためのコマンドってありますか? gprofを使ってやってみたのですが、単位が秒なので正確にわかりませんでした。
>>584 なんとなくですが分かった気がします。
ありがとうございました。
588 :
デフォルトの名無しさん :04/12/14 21:48:44
キーボードから2つの整数を入力し、その加算、減算、乗算、除算を計算し結果を 画面に出力するプログラムを作成せよ。 但し各処理ごとに加算:add 減算:sub 乗算:mul 除算:divとして関数を作成すること。 (除算の結果は実数で) C言語についてです。わかりません
宿題スレへ
591 :
588 :04/12/14 21:53:33
宿題スレへ行ってくる
>>585 TCP/IPヘッダのチェックサム部分の計算じゃないかな
593 :
デフォルトの名無しさん :04/12/14 21:56:55
2次元配列を用いて九九の結果を画面に出力するプログラムを作成せよ。 但し掛け算の計算はmulとして関数を作成すること。 おしえてくだされ
>>586 TSCでいいのならLinuxだと
#include <asm/msr.h>
unsigned long long hoge;
rdtscll (hoge);
みたいに取れるけど...
>Cプログラム中の各関数が何クロック使ったのか
とはちょっと違う
LONG64 mul(UINT a,UINT b){ return a*b; } main(){ for(UINT i=1;i<10;i++){ for(UINT j=1;j<=10;j++) if(j<10) printf("%d, ",(int)mul(i,j)); else printf("\n"); } }
mul()って'*'を使っちゃ意味無いんじゃね?
2次元配列使ってないし。
601 :
デフォルトの名無しさん :04/12/16 16:12:18
VS.NET&C言語で、 あるフォルダ(ファイルの数は不定)からファイルを ランダムに1つづつ取り出す(同じのが選ばれないように)。 という事がしたい時、 動的な配列に格納して乱数かなんかで1つづつ取り出す という方針でよいのでしょうか?
×あるフォルダ(ファイルの数は不定)からファイルを ○あるフォルダ(ファイルの数は不定)からファイル名を
603 :
デフォルトの名無しさん :04/12/16 16:42:45
for(int i=0; i<10; i++){ a+=i; } などとやったとき、iの寿命はどこまでになるのでしょうか。
605 :
デフォルトの名無しさん :04/12/16 16:44:38
forのな。
iの寿命は儚くて
でも、 for(int i=0; i<10; i++){ a+=i; } printf("%d\n",i); とやるとエラーもなくちゃんと表示できるんです これってiはまだ生きてるって事なんですよね?
>>608 たぶんVisual C++6.0使ってるんだと思うけど、単にコンパイラが規格に準じてないだけ。
いい加減VC6なんか捨ててしまえ。
めるぽ
入力した文字を逆に表示するプログラムを作りたいんですけどどこがおかしいんでしょうか…? #include <stdio.h> void reverse(char *s) { char *p,c[100]; p=&c; p = s; for(;*p;)*p++; *p--; for(;*s;)*s++ = *p--; } main() { char s[100]; printf("文字列を逆から表示します."); scanf("%s",s); reverse(&s); printf("%s",s); }
すいませんこちらより宿題を片づけるスレの方があってる気がしました。 スレ違いでした。
char *p,c[100]; p=&c;
('A`)
すいませんそこをどう直せばいいかおしえてください!
617 :
デフォルトの名無しさん :04/12/16 17:23:16
素朴な疑問です。入門書ではなく実用書には詳しく書いてあるかもしれませんが。 int a[4] = {1, 2, 3, 4}; int *p; int **pp; の時、a は配列 a[4] の先頭アドレスを示すという事でした。 p = a; などです。 では &a は一体何になるんでしょうか?? p = &a; pp = &a; など試してみましたがいずれも warning: assignment from incompatible pointer type になります。しかし printf("%p %p", a, &a); などとすると、内容は同じようです。 &a の正体は一体なんなんですか…?? こんな構文がないなら、構文エラーになってもおかしくないと思うんですが…。
char * reverse(char *string) { char *h, *t; if (*string == '\0') return string; h = string; t = string + strlen (string) - 1; while (h < t) { char c; c = *h; *h = *t; h++; *t = c; t--; } return string; }
int a[4]; int (*p)[4] = a;
>>612 #include <stdio.h>
#include <string.h>
int main(void)
{
char s[100];
printf("文字列を逆から表示します.");
scanf("%s",s);
strrev(s);
printf("%s",s);
return 0;
}
>>618 その通りやったらできました!
でも中身理解するのに時間かかりそうです…。
ありがとうございます!
>>620 おお!確かにできます!!
こんな簡単にできるもんなんですね!
でもreverseって逆にする関数を別に作らないとダメっぽいので…。
ありがとうございました。
>>619 わかりました!これは…、そのまんま文字通り「配列へのポインタ」ですよね。
(タイプミスでたぶん int (*p)[4] = &a; ですね)
なんだかちょっと混乱してきましたが。「配列へのポインタ」は多次元配列専用のものではないという事か(?)。
とにかく疑問解決しましたありがとうございます。
>>612 そうやって他人のソースの流用ばかりして
ポインタの理解できていないまま次へ次へと進んでも前進とは言えない
624 :
デフォルトの名無しさん :04/12/16 18:33:34
関数の引数で、ポインタ(*)を使う場合と参照(&)を使う場合の違いはなんでしょうか? また、どういう時に使い分けたらいいのですか?
626 :
デフォルトの名無しさん :04/12/16 18:49:26
ポインタにできて参照にできないことって何かありますか? また、その逆もありますか?
ポインタはNULLが渡せる。 無効な値を取る場合があるときはポインタ.。
ポインタと参照のどっちが萌えですか?
ポインタは古いです。参照の方が萌えだと思います。
参照は狙いすぎ。萎え。 ポインタこそ王道。
634 :
デフォルトの名無しさん :04/12/16 22:06:45
参照っていうと別なものと紛らわしいな リファレンスだろ
日本語か英語かの違いだけ…
オブジェクトを値渡しで渡し隊
639 :
デフォルトの名無しさん :04/12/16 23:13:14
char buf[10][100] の10を動的配列にしたいんだけど Cで、どうやって書けば良いですか?
char *buf[100]; buf[0]=new char[要素0のサイズ]; buf[1]=new char[要素1のサイズ]; .... buf[99]=new char[要素99のサイズ];
違った。newじゃなくてmallocだorz
char buf = malloc(10); char buf2 = malloc(10*1000); int i; for(i = 0; i <10; i++) buf[i] = bu2[i * 1000];
Cには多次元配列なんてものは存在しないってことを覚えておけ。
ヘッダしだいだろうけどsize_tってアーキテクトで最良のパフォーマンスを 出せる最大のバイトで宣言されてるの? これって慣習、それとも何かの規約で保証されてる? std::size_tも同じ?
646 :
639 :04/12/16 23:55:21
勉強になりました。 ありがとうございました。
647 :
デフォルトの名無しさん :04/12/17 00:52:12
Windows/Linux環境で、標準入出力を横取りする方法を知りたいです。 あるプログラム(A)から、他のプログラム(B)を呼び出すプログラムを組んでいます。 ・Bは簡単なCUIのコンパイラです。引数に指定されたファイルを読み、 文法に問題がなければファイルを出力し、エラーならば各種エラーメッセージを表示します。 ・Aは、BのGUIフロントエンドです。裏でBを呼び出し、その結果を利用します。 AからBの呼び出しはsystem関数を使えばいいのですが、そうすると Bが標準入出力やエラー出力に流したメッセージが、コマンドプロンプトに垂れ流しに なってしまいます。 これらのメッセージをAが受け取り、解釈したいのですが、どのようにすればいいのか わかりません・・・・ できれば標準C/C++の範囲内に収まるようなやり方があればいいのですが・・・
>できれば標準C/C++の範囲内に収まるようなやり方 さすがにこれは無理
>>647 >標準C/C++の範囲内に収まるようなやり方があればいいのですが・・・
ない
UNIX環境についてはpipe exec forkで検索
Windows/Linux環境の差異を吸収するようなライブラリは???
popen@POSIX.2
結果をファイルに書き出してAがそのファイルを読むとか。
標準入力に垂れ流すことは有り得ないからpopen("B", "r")だろうな。
653 :
デフォルトの名無しさん :04/12/17 04:09:34
char a[10]; a[0] = 'a'; a[1] = 'b'; a[2] = 'c'; a[3] = '\0'; とした場合、a[4]以降にはメモリ上どんな値が入ってるのでしょうか? \0(NULL)ではないのでしょうか?
なるほどそうでしたか。 ありがとうございます。勉強になりました。
char a[10]; a[9] = '\0'; printf("%s",a);
>>653 不定
おせっかいなコンパイラは0(\0)を入れてくれることもある
VCのDebugは逆にccccccccを入れたりする
>>644 ただ単にsizeofの結果の符号無し整数型としか書かれていない。
662 :
デフォルトの名無しさん :04/12/17 15:19:37
ふてーやろうだ
663 :
デフォルトの名無しさん :04/12/17 15:24:27
CPU の architecture 次第だろうけど size_t ってその architecture で 最良の performance を出せる 最大の unsigned int で宣言されてるの? これって慣習? それとも何かの規約で保証されてる?
CPU の architecture 次第だろうけど unsigned int ってその architecture で 最良の performance を出せる 最大の bit で宣言されてるの? これって慣習? それとも何かの規約で保証されてる?
#include <stdio.h> #include <string.h> struct x{ int num; char *str; }; void disp(struct x data){ printf("%d, %s\n", data.num, data.str); } void main(){ char str[] = "abcde"; struct x data1 = { 1, str }; struct x data2; data2 = data1; disp(data1); disp(data2); *(data1.str) = 'A'; disp(data1); disp(data2); } ポインタはコピー元とコピー先で同じアドレスを指しますので、 どちらか一方のポインタの指すデータを書き換えた場合は、 もう一方のデータも書き換えられることになります。 だそうです。いろいろ試したんですが、なぜか作動しません。
ちなみに15行目の struct x data1 = { 1, str }; のstrを"他の文字"に変えると無事にコンパイルができました。
>>665 文字列リテラルを書き換えた場合の動作結果は不定だよ。
>>665 こうしろ
struct x data1 = {1};
struct x data2;
data1.str = str;
>>668 コンパイルできました、感動です。ありがとうございます。
うっせばーか。礼なんかいちいちいらねーんだよ。
↑素直に感情を表現できないカワイイ人
テキストファイルを扱うfin_textという関数があるのですが、 fopenを使ってファイルを開いておいて 引数としてファイルポインタを与えたほうがいいのでしょうか? それとも、ファイル名を文字列として与えて、 関数内でfopenを行ったほうがいいのでしょうか?
673 :
デフォルトの名無しさん :04/12/18 17:46:45
Winsockで画像ファイルを送信したいのですが、受信したファイルが正常に表示されません。 16KBずつ読み込んでそれを送信しているのですが、正しく表示されるのは最初の16KBの部分だけ(多分)で、 それ以降の部分は原型がないくらいに乱れています。 オフセット辺りが問題かと思って色々変えてみたのですが解決しません。 よろしくお願いします。 該当部分のソースです。
/* * 変数は全てローカル変数。送信ファイルのフォルダと受信ファイルのフォルダは別です。 */ //送信部分 hFile=CreateFile(FileName,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); memset(&buf,'\0',sizeof(buf)); SetFilePointer(hFile,0,0,FILE_BEGIN); ReadFile(hFile,buf,sizeof(buf),&read_size,NULL); while(read_size){ send(socket_c,buf,read_size,0); memset(&buf,'\0',sizeof(buf)); SetFilePointer(hFile,read_size,0,FILE_CURRENT); ReadFile(hFile,buf,sizeof(buf),&read_size,NULL); } CloseHandle(hFile); //受信部分 hFile=CreateFile(FileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); memset(&buf,'\0',sizeof(buf)); SetFilePointer(hFile,0,0,FILE_BEGIN); bl=recv(socket_c,buf,sizeof(buf),0); while(bl){ WriteFile(hFile,buf,bl,&write_size,NULL); memset(&buf,'\0',sizeof(buf)); SetFilePointer(hFile,bl,0,FILE_CURRENT); bl=recv(socket_c,buf,sizeof(buf),0); } CloseHandle(hFile);
>>672 テキストファイルそのものを操作するならファイル名。
中身しか興味が無いならファイルポインタ。
ファイル名を渡せばそれをremoveしたり出来るし、
ファイルポインタならファイルを途中から渡したりstdinを渡したり
出来るからな。
自己解決しました。 送信・受信のファイル読み込み時にSetFilePointerを使っていたのが問題だったようです。 SetFilePointerを使わなくてもポインタは自動的に移動するということが分かりました。 俺のソースだとそこからさらに移動させていたことになります。 お騒がせしました。
>>675 さんありがとうございます。
テキストファイルしか操作しませんので、
ファイル名を渡そうと思います。
remodeとかはよく分かりませんので調べてみます。
ありがとうございました。
678 :
デフォルトの名無しさん :04/12/19 00:27:19
STLのコンテナにMyClass *myClassを入れたいのですが const MyClass &でないといけないとコンパイラに怒られてしまいます こういうのは普通どうするのでしょうか?キャスト?
>>678 どんなコード書いてるのか知らんが、お前の書き方が悪いだけだよ
680 :
678 :04/12/19 00:57:13
>>679 えぇぇ、stl::listになんらかの変数のポインタを入れたいことって無いですか?
入れられるって。試しにエラーが出たコードを貼ってごらん?
>>680 入れられるんだよ。入れられないのはお前の書き方が悪いだけだって言ったんだよ。
683 :
678 :04/12/19 01:11:29
こんな感じなんですが・・・ list<MyClass> *myClassList = new list<MyClass>; MyClass *myClass = new MyClass(); myClassList()->push_back(myClass);
684 :
デフォルトの名無しさん :04/12/19 01:12:27
>>683 ×list<MyClass>
○list<MyClass*>
おおおお、できました! なるほどそういう問題だったんですね!
>>677 逆じゃない?ファイル名を渡すってことはファイル名を使った
APIを使いたいときにかぎるっていうことを
>>675 を言ってるんだと
思う。だから、ファイルポインタを渡すべきだと思う。
メンバポインタについて質問させてください。 以下のソースで、int型のメンバポインタは作れるのですが、 void型のメンバポインタを作ろうとすると、エラーが出てしまいます。 汎用のメンバポインタというものは作れないのでしょうか? class A{ }; int A::*ptr_int; void A::*ptr_void; //エラー2182 int main() { }
void * は総称ポインタだけど void 自体に汎用とか総称の意味はないのでは…?
>>687 ISOの8.3.3 pointer to membersより
A pointer to member shall not point to a static member of a class (9.4),
a member with reference type, or "cv void".
~~~~~~~~~~~~
C++ではvoid型ポインタはあまり推奨されないイメージがあるな。 継承によるポリモーフィズムを使う方向が正解では。
というかメンバポインタって関数以外にはあまり使わないイメージがある…
692 :
デフォルトの名無しさん :04/12/19 22:22:15
前から気になっていたのですが exit関数の引数に入れる数字 例えばexit(0)の 0に当たるところです。 そこに入れる数字に何か意味はあるのですか 教えてください。
>>693 は厳しいようでいて実は優しい人(・∀・)イイ!!
695 :
デフォルトの名無しさん :04/12/20 00:04:46
>>693 ありがとうございます とりあえずまとめてみます exit(0)または、exit(EXIT_SUCCESS)は、正常終了時 その他は、異常終了 このEXIT_SUCCESS,(EXIT_FAILURE)はstdlib.hにマクロ定義されている
696 :
695 :04/12/20 00:11:16
実行してみたら EXIT_SUCCESSの中身は、0でした EXIT_FAILUREの中身は、1でした とりあえず、0が成功、1が失敗と覚えます
>> 688, 689, 690, 691 ありがとうございました。 よく分からなかったのですが、void型は使えないということで納得します。 ソースを見直したら、int型のメンバポインタで問題なさそうだったので、 それでやってみることにしました。
新しいクラス作るときに //hoge.hpp class Hoge { public: hoge() {...} int fuga(){ ... } hage() { ... } }; ってヘッダ内に全部書いてるんだけど、後でこの実装部分を.cppに移そうとすると 非常に面倒で困るわけです。 なにかこのへんを補助してくれるツールなどご存知ありませんか?
699 :
デフォルトの名無しさん :04/12/20 12:27:35
列挙型とそれを使う関数を定義します。 enum Value{a=1, b, c}; void func(Value val) { //hogehoge } プログラム中でfuncを使おうとすると、 //エラー func(a); gccは「Valueとintに互換性がないよ」といったエラーを吐きます。 func((Value)a);とすればコンパイルは通るのですが、 これってgccでは普通なんでしょうか?MSのclでは問題はでないようなんですが・・・
>>699 VS.net2003ではエラーになったYO
たぶんVC6.0が糞なだけだYO
>>699 ,700
えっ!?
通るのが普通なんじゃないんですか?
うちのg++(3.3.4)は警告なしで通るんですが
>>701 ちょっと待ておまえさっきはgccで通らずVCで通るとか言ってただろ。
コンパイラのバージョンとオプションくらい書いとけ
>>702 699とは別人です
ついでに報告するとg++(3.3.4)は701に書いた通りで
gcc(3.3.4)だと通りません
enumってC++だけだったんだっけ?
Cでは enum Value { a=1, b, c }; なら void func(enum Value val) じゃないといかんかと。それが嫌であれば typedef enum _Value { a=1, b, c} Value; とか。 C++ではenumもstructも特に書かなくても使える
>>704 >void func(enum Value val)
>C++ではenumもstructも特に書かなくても使える
おお
そうでしたそうでした
どうもありがとう
どういたしまして。
ここは礼儀正しいインターネッツですね
どういたしまして。
709 :
デフォルトの名無しさん :04/12/20 23:51:43
いえいえこちらこそ
710 :
デフォルトの名無しさん :04/12/20 23:53:38
このスレはsage禁止
なんでやねん
712 :
デフォルトの名無しさん :04/12/20 23:58:39
雰囲気が良いからですよぉ~
713 :
デフォルトの名無しさん :04/12/21 00:00:02
00:00
質問させてください 例えば、 struct Foo { int hoge[2][2]; }; Foo foo[2][2]; Foo *p = foo; こんなとき、p を使って foo[1][1] の hoge[1][1] にアクセスしたいときは どう書けばいいんですか?
そもそもFoo *p = foo;ができない。
>>715 即レスどうもです。
でもFoo *p = foo;はできたと思うんですが…(ちなみにBCC)
わかり易くしようと思ってstructにしたんですけどclassの場合どう
でしょうか?
クラスでもダメ
>>717 あっ間違えましたFoo *p = (Foo*)foo;です。
何度もスイマセン…
>>714 struct Foo { int hoge[2][2]; };
Foo foo[2][2];
Foo (*p)[2] = foo;
int hage = p[1][1].hoge[1][1];
実は前々から聞きたかったのだけどFooってどういう意味なんですか?・・・。
子供好きの合言葉
>>719 なるほど…
初心者なものでちょっと難しいですが後は自分で考えてみます
即レス助かりました。ありがとうございます!
セマンティックス的に破壊的なキャストはするなボケ
Foo* foo = &foo[0][0];
>>715 一次配列の時と勘違いしているのでは
>>718 強引にキャストしているから代入できているようにみえるだけ。
アプリケーション間で、変数の値の受け渡しは可能なのでしょうか? 例えば、コンパイラをCUIで作って、エディタをGUIで作って、コンパイラからエラーメッセージをエディタに受け渡す様なそんな感じで。
>>727 ええ可能です
お使いの開発環境はそうなっていませんか?
>728 なってますが、それをどうやってC++で実装すれば良いのやら……… ファイルに書き出して読み込むという方法は直ぐに思いつくのですが、 もっとスマートな方法があると思うので……例えば、プロセス間の通信とかは不可能なのでしょうか?
>>729 Win32ならパイプ(NT系のみ)とか。メールスロットとか。
プロセス間通信で調べれば一発のような。。。
メモリファイルでも出来る。 あと、メッセージのやり取りでも。 アプリ間のプロトコルを自分で決めちゃえば かなりのことが出来るはず。
WM_COPYってメッセージって使えるんしたっけ?
>>729 の中の人、調べてみたら?
WM_COPYDATAなら適当にWindowsがメモリマップトファイル使っていい感じで処理してくれるが。
>>730 名無しさんなら9xでもパイプは使えるよ。
CUIアプリが、仕事が終わったら終了するという仕様なら、 GetExitCodeProcess で終了コードを取得できないか?
誰にもレスされずに涙目の漏れが来ましたよ
>>738 適当なエディタでマクロでも組んだら?
インクルードファイルの関数定義をコピーしてクラス名追加してインデントを整えるのと、
インクルードファイルの方は関数本体をセミコロンに変えるだけでしょ。
もう一度質問させてください。 配列の配列 int array[N][N]; は式の中では配列へのポインタに成る、 というのはわかったんですがこれがポインタのポインタにならない というのは違和感を感じます。 後ろの[N]は配列を配列として扱っているということなんでしょうか? あと int (*p)[2] のカッコは必要なんですか?よろしくお願いします
>>740 int *p[2];だと「『intへのポインタ』の配列[要素数2]」になる。int *(p[2]);と同じ。
int (*p)[2];は「『intの配列[要素数2]』へのポインタ」になる。
違和感は慣れるしかない。
>>740 Tの配列はTへのポインタになる。
∴配列の配列は配列へのポインタになる。
c言語で五目並べのソースファイルが見れる所どこかにありませんか? 対コンピュータの思考ルーチンをどうしていいか全くわからないので。
UNICODEビルドする可能性がある場合 'a'のような1文字も_T('a')と書いた方がいいんでしょうか?
>>744 そう。
…って俺も理由を深く考えたことなかったんだけど
_T('ア') とかの場合に特に意味があるんだよね、きっと?
>>744 TCHARならそうしろ。
char/CHARなら_Tはつけるな。
個人的にはCランタイムはUnicodeにする意味はないと思う。
どうせ内部でShiftJISに戻していたりするんだろうし。
俺はWin32APIが絡んでくるときだけ_Tとかを使っている。
>>741 ,742
レスどうもです。なんかわかってきました
int *p[2];は配列でint (*p)[2];はポインタというのがミソですね
ここは親切さんが多くて助かります。ありがとうございました
本当に初歩的で申し訳ないのですが指南を頂きたく思います。 C言語で(表示はDOSの真っ暗に〇× 0は空欄4は―で何もないという意味) 簡単な〇Xゲームを作ろうとしているんですが 下記のようにC配列で判定、S配列で表示しようと考えたのですが 結局ifでc[i][j]=???でprintfで表示するしかないんじゃあS配列いらんなあ(汗 という考えになったんですけど どうにかなりませんでしょうか? int c [5][5]={ {0,1,2,3}, {1,4,4,4}, {2,4,4,4}, {3,4,4,4} }; //0123 456で-〇Xの判定 char s [8][15]={ " ", "1", "2", "3", "-",//4 "〇",//5 "×",//6 };
>>748 たしかにsは要らなさそうだ。
それよりその1文字変数名はやめろ。
S配列を無理やり使う理由は?
それよりもテーブル引き(c[i][j][s])用の配列を作ったほうがいいんじゃないか? char *s[] = { " ", "○", "×", "-", };
>>749 >>750 2次元配列の勉強をしていまして
1つは判定というか内部的な処理
2つ目の配列はそれに対応する反応ってな具合にできるんじゃないだろうか?
と素人考えになったんであえて2つ使ってます。
発展させれば0のときはこの画像、1の時は別の画像出す
みたいなのにも応用できる物が出来そうだな・・・と
変数名はscanとかに変えておいたほうがいいですね。申し訳ない
>>748 何をしようとしてるのか良く分からんのでコード書いてくれ。
>結局ifでc[i][j]=???でprintfで表示するしかないんじゃあS配列いらんなあ(汗 ??? やりたい事は printf("%s",s[c[i][j]]) ではないのか?
>>753 余計分からなくなるに
1gotoかける
よろしくお願いします。 func( int*& a ); とある場合にどのように、引数を渡せばいいのでしょうか?
>>756 int*&はintへのポインタへの参照。
意味としてはtypedef int *PINT; func(PINT& a);と同じで、これならわかるよな。
>>757 さん
早速のレスありがとうございます。
ということで、
int* a;
func(a);
なのですね。
もうすこし、参照とポインタについて調べてみます。
ありがとうございましたm(__)m
756ではないんだけど、ポインタを参照で受け取る理由ってあるんですか?
>>759 例えばこういうことができる。(戻り値を使えとかそういうツッコミはするな)
void func(int*& a)
{
a = new int;
}
M糞のマクロが気に入らないときとか #define SAFE_RELEASE(p) { p->Release(); p = 0; } template <class T> void safe_release(T*& p) { p->Release(); p = 0; }
>>761 どうでもいいけどそれはIUnknwon*&でいいんじゃないか?
全部そこから継承されているんだし。
>>763 I???* から IUnknown* に暗黙の変換が行われたとして、
変換結果のポインタはテンポラリだから IUnknown*& には渡せないかもしれない。
765 :
デフォルトの名無しさん :04/12/26 01:09:52
読み込んだファイルのバイト数を知りたいんですが while(!feof(fp)){ file_length++; } のようにfeof関数を使うと正しくバイト数が 分かりません。 どのように書けばいいですか?
767 :
デフォルトの名無しさん :04/12/26 01:18:26
>>766 省略しましたが、ファイルの内容は読んでます。
バイトが0x1Aの地点でfeofによりwhile文を抜ける
んですけど、どう書けば正しいですか?
宜しくお願いします。
>>767 読んでるなら、読んだ時に読んだサイズを足していけ。
fseek()とftel()使え
Easy Link Libraryというライブラリを使って、ゲームを作っているのですが、 Easy Link Libraryの質問掲示板や、専用スレなどは無いでしょうか? 公式HPが無くなってしまったため、困っています。 もしご存知の方いらっしゃいましたら、教えてください。
>>771 もし初心者から一歩前へ進みたいと思うなら、そのライブラリとは極力かかわらない方が
良いですよ。
そうですか。ところで int *ptr と int* ptr はどちらも同じ意味なのでしょうか?
774 :
773 :04/12/27 22:46:28
一応ageます、だれか宜しくお願いします。
>>773 はい、同じ意味です。
ところで、int *ptr;もしくはint* ptr;で宣言された変数ptrは何型になるか
解かりますか?
実は、これはint*型なのです。
ですから、意味としてはint* ptr;の方がわかりやすいですね。
ちなみに*ptrは、ptrが指すアドレスに記録されているint型の値のことですね。
int* foo,bar;
しかし int* ptr, n; とか書くと混乱するわけだが。
関数の戻り値がポインタの時も int *foo() と書くか int* foo() と書くかで悩むなぁ。
>>775 *がMSN検索でかからなかったんです、すいません。
>>776 丁寧な回答ありがとうござます、やはり同じ意味でしたか。
>>776 俺はint *p; int *func();派
「式の中で*pと書くとint型の値が得られる」と読む。funcも当然同様。
関数へのポインタがint (*func)();だから、 念のため混同しないように関数だけint* func();にしてる。 変数はint *p; やっぱり統一した方がいいんでしょうか?
>>783 スタイルを統一するのは読みやすいコード作りの第一歩。
C++のクラスにも構造体のアライメントのようなもの ってあるんですか?
あります。
>>783 そんなときのtypedef
typedef int *PINT;
PINT func();
>>783 そんなときのtypedef
typedef int *PINT;
PINT func();
>>787 アフォか。構造体へのポインタ使うたびに typedef するつもりかよ。
個人開発してる内は好きなようにtypedef使いまくれば良いさ 共同開発するときはちょっとばかし気をつけたほうが良いけど
OCamlにした方が遥かに生産性高そうだね。
Enter のみを押すまで入力を繰り返すプログラムを書きたいのですが、 if の条件をどうすればよいのかわかりません。 ヒントだけでもお願いします。 int n = 0; char data[64]; while(1){ printf("data[%d]=", n++); scanf("%s", data); if(data == '\0'){ break; } }
ものすごく初心者な質問ですみません・・ 家でBorlandのCコンパイラをダウンロードしてコマンドプロンプトを開いてみたのですが、 C:\Documents and Settings\user> ってなってて、どうも学校のとは違います。 terapad等をしても 「'terapad'は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 と出て何もできません。 C:>にするにはどうすればよいのでしょうか?
cd c:\と打てば、C:\>になります。 terapadはパスが通ってないからじゃない? terapad.exeまでのフルパスを打つか、パスを通せば OK パスの通し方は検索すれば見つかります。
>>794 C:\>になりました。ありがとうございました!
これからパスの通し方を勉強してきます
>792 data[0] >793 コマンドプロンプトを開くショートカットのプロパティで、ディレクトリを設定する。 Terapadは、ぐぐってインストールし、pathを設定する。
>>792 こういう事か?
#include <stdio.h>
#include <string.h>
int main(void)
{
char data[64];
while (1) {
fgets(data, sizeof(data), stdin);
data[strlen(data) - 1] = '\0';
if (*data == '\0')
break;
else
printf("data = %s\n", data);
}
return 0;
}
あ、パスはダウンロードした時にマニュアル通り 環境変数のPATHを編集で「;C:\BORLAND\BCC55\BIN」と追加したのですが、やはり 「'terapad'は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 と出ます。 どうすればいいのでしょうか・・・ 「;C:\BORLAND\BCC55\BIN」を付け加える前の部分に問題があるのでしょうか?
>>798 それはBCCへのパスであってterapadへのパスではない。
>>798 WindowsXPか?マイコンピュータを右クリック→プロパティ→詳細設定→環境変数で、ユーザの
環境変数のPATHに追加して、再起動してみな。
>>797 バッチリです!
でも、ちょっとコードの意味わかめなんで勉強してきます!
>>799-801 レスありがとうございました。
terapadをダウンロードして再起動して
terapadへのパスの通し方は「C:\Program Files\TeraPad\TeraPad.exe "%1"」と打てばできるそうなのでやってみたのですが、
「'Program'は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
と出てきてしまい、またダメでした・・
C:\> のところで、 C:\>"C:\Program Files\TeraPad\TeraPad.exe" test.c とすれば、test.cが編集できる。 これを C:\>TeraPad test.c で出来るようにしたいなら、"C:\Program Files\TeraPad"にPATHを通す。
>>804 ありがとうございました。
上のは理解できたのですが、下の、"C:\Program Files\TeraPad"はどこで設定するのですか?
いろんな窓が開いててちょっと混乱気味です・・すみません・・
terapadの「表示」→「オプション」→ブラウザのパス設定とかは違いますよね?
>>797 scanf や fgets で入力された文字列の最後に'\0'が入るのではなく、
data[64]='\0' で、あとは未定義(?)ということでしょうか?
あと、fgets を scanf に入れ替えるとうまく動きませんが、
両者の違いは何ですか?
>805 C:\BORLAND\....と同じように。 >806 fgetsは、最後に改行文字が入るから
再び再起動してからやってみたらできました!ありがとうございました! 朝からお騒がせしてすみませんでした・・・
>>806 普通scanfで中止する時は 戻り値がEOFか調べる
すみません、コマンド プロンプトからterapadでファイルを読み込む際の、 読み込み先のファイルの変更はどうすればいいのでしょうか?
>>810 鼬害。
terapadの使い方くらいterapadに同梱されてるだろ。
もはやC/C++とは何の関係もない、ただの教えてクン養成スレになりつつあるな。 関係ない質問に答えていた俺にも原因の一端はあるのだが。
読んでもよくわかりませんでした・・ 荒らしてしまってすみませんでした。 もう時間なのでここで消えます。失礼しました・・
ま、家庭教師ってなわけじゃないからさ。
>>806 char data[64];と宣言しているのにdata[64]に代入するとは何事。
>>815 相手のレベルを考えてから言えよな
ほっとけ
ちなみに HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\ でパス通せたりする
>>817 普通環境変数のPathに設定するかと…?
>>817 ちょとまて。そこに書いたってパスは通らないんじゃないか?
>821 [] でないなら BASIC なんだが...
2進数で考えて、引数の数だけ下位からビットが立った数を 返すマクロって書けるでしょうか? hoge(3)が7(2進数で00000111)を返すような感じです。 関数になってしまうような長いのなら書けるのですが、コンパイ ル(プリプロセス?)時に定数になるものは書けるでしょうか?
>>823 #define hoge(n) ((1ul<<(n))-1)
>>823 #define hoge1 0x01
#define hoge2 0x03
#define hoge3 0x07
#define hoge4 0x0F
#define hoge5 0x1F
#define hoge6 0x3F
#define hoge7 0x7F
#define hoge8 0xFF
>>824 ありがとうございました!
一応逆アセンブルして確かめてみましたが、きっちり定数に
なっていました。これですっきりできます。
>>823 #define hoge(n) ((n == 1) ? 0x01 : (n == 2 ? 0x03 : (n == 3 ? 0x07 : (n == 4 ? 0x0F : (n == 5 ? 0x1F : (n == 6 ? 0x3F : (n == 7 ? 0x7F : (n == 8 ? 0xFF : 0)))))))
824で答え出てんのに何でわざわざ…
>>830 三項演算子を使うと難しいことをやっているように見えるから。
832 :
デフォルトの名無しさん :04/12/31 00:53:35
2~100の素数を求めるプログラムなんですが、 下のプログラムでは間違ってると思うのですがどこが違うか教えて頂けませんか? 自分の考え方は、素数は素数未満の2以上の数では割り切れないので if((i>j)&&(i%j==0))で、素数以外の数を表しているつもりです・・。 初心者なので、根本的に間違っていたらすみません・・。よろしくお願いします。 #include <stdio.h> main() { int i,j; for(i=2;i<101;i++) for(j=2;j<101;j++) { if((i>j)&&(i%j==0)) ; else printf("%d\n",i); } }
#include <stdio.h> main() { int i,j; for(i=2;i<=100;i++) { for(j=2;j<=i;j++){if(i%j==0) break;} if (i==j) printf("%d\n",i); } }
834 :
832 :04/12/31 01:25:35
>>833 ありがとうございます。833さんのは余りが0の時にbreakでif (i==j)に行くという事ですかね…。なんか答えが、
#include <stdio.h>
main()
{
int i,j,prime;
for(i=2;i<100;i++)
{
prime=1;
for(j=2;j<=i/2;j++)
if(!(i%j)) prime=0;
if(prime) printf("%d\n",i);
}
}
となっていたので、真似して
#include <stdio.h>
main()
{
int i,j,prime;
for(i=2;i<101;i++)
{
prime=1;
for(j=2;j<101;j++)
if((i>j)&&(i%j==0)) prime=0;
if(prime) printf("%d\n",i);
}
}
としてみてたらできました。primeの意味が良く分かりませんが…。
835 :
832 :04/12/31 01:29:57
あとプログラムの実行で、3からしか表示されないのですが、 たぶん上に2が表示されていると思うのですが、2も表示させるにはどう設定を変更したら 良いのでしょうか?良かったら教えて下さい・・。
改行しまくってはみ出てるんならprintf("%4d", i);にすればいい。
質問があります。既出でしたらすいません。 C++でのoperatorの挙動についてです。 使用する環境は以下のとおりです。 【コンパイラ・環境】 gcc(2.9.5、3.1、3.3.2)とVS.NET 【質問内容】 myclassクラスのメンバ関数として myclass operator + (myclass & ao) { myclass ret; ret.i = i + ao.i; return ret; } とし、main関数内でmyclassのオブジェクトa,b,c,dを作成した状態で、 d=a+b+c; は当然問題なくできますが、 d=a+(b+c); などとしますと、コンパイラがgccの場合、(b+c)が参照として渡せないとしてエラーがはかれます。 解決策としては、メンバ関数の引数にconstを書けばいいのですが、VS.NETではconstを記述しなくても コンパイルされます。 このあたりの挙動がよくわかりません。 尚、VS.NETでは、retを返すと、(b+c)に対し新たにmyclassの一時 オブジェクトが生成されるようですが、gccでは、d=a+(b+c)の演算が終了するまで 返されたretのオブジェクトが保持されるようです(ここがconst?)。
変換が必要なオブジェクトや定数やテンポラリは非const参照には渡せません(値が書き換えられるかもしれないので)
841 :
839 :04/12/31 20:46:15
>840 ご回答ありがとうございます。 参照を引数にしているので、その値を書き換えられるのを避けるために constを書くのは分かるのですが、それをコンパイル時に「警告」ではなく 「エラー」にしてしまうのが分からないのです。 また、+演算子のオーバーロードを行う場合、引数に渡したオブジェクト (当然参照されている状態)を変更したいという稀な場合もないともいえないと 思います(それが組み込み型などの演算と挙動が違う悪い書き方だとしても)。
>>841 例えば文字列リテラル(const char*)の書き換えを
警告で済ましていい事だと思うか?
そもそもoperator+の返値の型をconst myclassにすべきかと
>842 設問ありがとうございます。 よくないんですか(よくないとしたらどこが)?
>>841 const「に出来る」のではなく、const「でなければならない」のです。テンポラリ
オブジェクトはその式の実行が終わった時点で消滅するので変更を加える
ことにまったく意味がないからです。どうしても関数内で変更を加えたければ、
右辺を参照ではなく値渡しで受け取ればよいでしょう?
846 :
839 :04/12/31 21:17:52
>842 文字列リテラルは書き換え不可な領域に格納されているはずなので、 エラーが出てしかるべきだとは思います。 ですが、今回の+演算子の引数に参照を持たせているというだけで、 それをconstにしなければならないわけではないと思います。 実際、constを引数に記述しなくてもd=a+b+cはできるわけですし。 挙動が.NETとgccで違うところを見ると、ANSIの規格とは別の 独自拡張がどちらかになされているのかと思ってしまいます。
つまり、gccが正しい。
>>846 テンポラリオブジェクトを受け取るためにconst参照にするのです
849 :
839 :04/12/31 21:55:45
うーん、、、さらに混乱してきました。 今.NETとVC++6.0で以下のプログラムをコンパイルしようとしたらエラーでした。 #include <iostream> using namespace std; class myclass { public: int i; myclass( int ai = 0 ){ i = ai; } const myclass operator + (const myclass & ao); }; const myclass myclass::operator + (const myclass & ao) { myclass ret; ret.i = i + ao.i; return ret; } int main() { myclass ob1( 1 ), ob2( 2 ), ob3( 3 ), ob4( 4 ); ob3 = ob1 + ob2 + ob4;//エラー! ob3 = ob1 + (ob2 + ob4);//できる! cout<<ob3.i<<endl; return 0; }
良くも悪くも基本的にgccは仕様に忠実。
>const myclass operator + (const myclass & ao); だから だろ?
試してないけど const myclass operator + (const myclass & ao) const ってしてないからじゃないの? ってか return myclass(i + ao.i); ってしないとRVO効かないぞ
854 :
839 :04/12/31 22:14:06
>851 ですが、 ob3 = ob1 + (ob2 + ob4); ↑これできるんですよね。はじめ(ob2 + ob4)で、ob4はmyclassなんですが、const myclassの参照として 引数に渡され、テンポラリなconst myclassオブジェクトが返されると。 その後、ob1+テンポラリオブジェクトなわけですが、引数はconst myclassのテンポラリオブジェクトが 渡され、結果がまたconst myclassなテンポラリオブジェクトとして返される。 このイメージでいるんですが、それならob3 = ob1 + ob2 + ob4;もできるような 気がするんですよね。 あ、ちなみにgccでもできませんでした。
855 :
839 :04/12/31 22:20:40
>853 const myclass operator + (const myclass & ao) const ですが、戻す型がconst myclassってだけで、const関数にする必要はないと思うのですが。 return myclass(i + ao.i); としても、しないでも結果は変わりませんでした。
ob1+ob2が先に評価される場合は (const tmp).operator+(ob4); だけど、operator+がc指定されてないからダメなんじゃないの?
>>855 RVOは今回の話と関係ないので忘れてくれ
(気になるんだったらEffective C++ か More Effective C++ の
どちらかに書いてあったと思うんでそれ参照)
858 :
839 :04/12/31 22:46:17
>856 const myclass operator + (const myclass & ao) const って、つまりoperator+自身をconst指定するってことですね。 これやったらちゃんとできました。 まだconstに関して混乱してますが、あともう少しといった感じです。 ありがとうございます!
整数や文字列など 複数の値を一辺に画面に表示できる関数を、 _DEBUGが定義されていれば実行する。定義されていなければ実行しない というように切り替えたいと考えています。 そこで以下のように考えました。 void func( const char *hoge, ... ) という可変引数を引数に持つ関数があります。 引数にしたものを 画面に表示する printfと同様の処理を行います。 _DEBUGが定義されていなければこれは実行されません。 上記のように 実装するにはどうしたらいいんでしょうか? #define func( const char *hoge, ... ) とできればいいんですが、できないので 何か解決方法があれば教えてください。
>>859 #ifdef _DEBUG
#define FUNC func
#else
#define FUNC
#endif
と別名定義してFUNCを使えばいいだけじゃねーの?
>>859 #ifdef _DEBUG
#define dprintf printf
#else
inline void dprintf(...) {}
#endif
>>861 #define FUNC func の部分
引数の部分はあえて省略してかいているんですか?
この引数は可変引数なので マクロに登録できないんですよ
>> 862 関数の名前の部分だけの マクロ登録ってやっていいかどうか 自分では判断しかねたんですが、これしか方法がないようですので 使うことにします。 ありがとうございました。
>>865 いや本当にそれが使えたら不満ないんですが
VCコンパイラでは使えないんですよ
>>859 MFCのTRACEでは
#define FUNC 1 ? (void)0 : func
ってやってる。
最適化の段階で消されるんだろう。
868 :
デフォルトの名無しさん :05/01/03 00:48:16
全然関係ないけど、他人のソースよく読んだりコード管理するとき どんなツール使ってますか?私は、会社で使ったことある人がいるから、 C++仕様書工房ってソフト使ってますがどうにもなれません。何かいいソフト ありますか?100万ステップ目視管理はさすがに辛いというか自分には無理です。
>>859 すみません。MFCはできるだけ避けたいと思っていますので。
それと実行してみてわからないことがあったんですが
#ifdef _DEBUG
#define dprintf printf
#else
inline void dprintf(...) {}
#endif
で、デバッグ用の処理ができたんですが、この部分をdprintf.lib というstatic library にして、
また別のプログラムを作ります(以下のプログラム)
[ヘッダ部分]
#pragma comment( lib, "dprintf.lib" );
#include "dprintf.h"
void func();
[ソース部分]
void func() {
dprintf( "test\n" );
}
↑をstatic library 化して func.lib とする。
「つづき」
>>870 また違うプログラムAから func() を呼び出すとき、
そのプログラムAがデバッグで実行しようが、リリースで実行しようが
funclib の中には dprintfの結果がもうすでに書き込まれているので
変化はないんでしょうか。
func.lib がデバッグで作られたか、リリースで作られたかによって
プログラムAでの表示に違いがでると考えていいんでしょうか。
とすると、func.lib と dprintf.lib 各一つずつ用意して、プログラムAで
デバッグ文字を表示するときと、しないときにわけるようにはできないんでしょうか。
どなたか解決策を教えてください。
>>870 そもそも、そのdprintf.libは意味をなしてない事に気がつかないか?
>>871 VCなら単純にデバッグ版func.lib(func_d.libとでもしといて)とリリース版func.lib
をプログラムAのコンパイラオプションで選択すりゃいいし、
#ifdef _DEBUG
#pragma comment(lib, "func_d.lib")
#else
#pragma comment(lib, "func.lib")
#endif
と書いてもいいだろうし、どちらにせよデバッグ版とリリース版1つずつ用意して
どちらをリンクするかを決めりゃいい
>>872 dprintf では printfを実行してますけど、実際は 可変引数の関数を実行するもので
printfとは違う処理を行ってます。
>>873 やっぱり 2つ用意するしかないんですか><;;
ありがとうございました。
このdprintfがいろんな場所でinline展開されれば、きっと時間とお金の浪費癖が付くよ。
それにFormatMessage,OutputDebugString,wsprintf APIも知らないとは。何を参考にしてるんだ? #defineの仕組みも知らない素人が作る枠組みは確実に失敗するよ。
877 :
デフォルトの名無しさん :05/01/03 11:02:08
age
879 :
839 :05/01/03 16:01:12
遅いですが、constに関して一応分かったことをご報告。 gccでは ・テンポラリオブジェクトを自動でconst扱い ・constオブジェクトで非constメンバ関数が使用できてしまう(warningは出る。constはずし?) です。 VC++では自動的にconstにしてしまうとかないので、ANSI規格というか仕様にちゃんと準拠な感じです。 gccの勝手な(?)独自拡張が混乱のもとでした。
881 :
839 :05/01/03 16:05:20
あ、あとgccでは const myclass operator + (const myclass & ao)const { cout<<"operator+の呼び出し"<<endl; myclass ret; ret.i = i + ao.i;//iはmyclassメンバ return ret; } とやると、return myclass(i+ao.i);と記述したと同様にRVOが働くみたいです。 コピーコンストラクタは呼ばれませんでした。VC++ではちゃんとreturn myclass(i+ao.i);と書かないとRVOは働きません。
882 :
デフォルトの名無しさん :05/01/03 16:06:21
g++の間違い
883 :
839 :05/01/03 16:07:47
すいません。gccをGNU コンパイラコレクション というつもりで言っています。 g++はコンパイラコレクションの一部ということで。
>>879 テンポラリであることと const であることは無関係。
型 T のテンポラリも、型 T const のテンポラリも存在する。
型 T のテンポラリに対しては非 const メンバ関数を呼び出すことができる。
言語の規格では、型 T のテンポラリは T& を初期化することができない。
型 T のテンポラリで T& を初期化できるのは VC++ の挙動がおかしい。
VC++ の挙動がおかしいのは歴史的な事情による。
885 :
839 :05/01/03 16:14:00
>884 myclass ob1,ob2,ob3,ob4 というのがある場合(初期化は省略しました)、 ob3=ob1+ob2+ob4 という演算を行う際、operator+関数のオーバーロードを用意しますが、 その型(戻り型、operator+関数の呼び出し元オブジェクトの型、引数の型) をどうするのかということで悩んでいました。 ob1+ob2を評価し、そのテンポラリオブジェクトを戻し、 テンポラリオブジェクト+ob4という流れになるかと思いますが、 その際、gcc(g++)ではconst扱いになるようで、VCでは戻り型に忠実でした。
>>885 何を調べて「const扱いになる」とか、「戻り型に忠実」とか言ってんの?
887 :
839 :05/01/03 16:22:36
>886 typeidではconstかどうかまでは当然分かりませんので、実際に プログラムを書いてみて、エラーやwarningとしてはかれていることからです。 環境はXcode(gcc3.3)とVS.NET2003です。 忠実は言い過ぎかもしれませんが、そのままの挙動をしていたので。
>>887 エラーや警告を「そのまま」貼れ。ソースも一緒にな。
typeid で const ってわかんなかったっけ?
889 :
デフォルトの名無しさん :05/01/03 16:27:03
typeidは環境依存
VCはconstかどうかも分かるけどね
typeidでconstがわからないのは正しい。(5.2.8 -5-)
892 :
839 :05/01/03 16:30:53
以下ソースです。constははずしてあります。 class myclass { public: int i; myclass( int ai = 0 ){ i = ai; cout<<"コンストラクタの呼び出し"<<endl;}//コンストラクタ myclass(const myclass & ob){ i = ob.i; cout<<"コピーコンストラクタの呼び出し"<<endl;}//コピーコンストラクタ ~myclass(){cout<<"デストラクタの呼び出し"<<endl;}//デストラクタ myclass operator + (myclass & ao); }; myclass myclass::operator + (myclass & ao) { cout<<"operator+の呼び出し"<<endl; //myclass ret; //ret.i = i + ao.i; //return ret; return myclass(i+ao.i); } int main() { myclass ob1( 1 ), ob2( 2 ), ob3( 3 ), ob4( 4 ); const myclass ob5(100); ob3 = ob1 + ob2 + ob4; cout<<ob3.i<<endl; //ob3 = ob1 + (ob2 + ob4);//このままだとVCではOK。g++ではエラー。 cout<<ob3.i<<endl; return 0; } main関数内でob1~ob5までをいろいろ組み合わせて足してみています。 typeidではオブジェクトの型は分かると思いますが、修飾子の判断までは どうなんでしょう。
893 :
839 :05/01/03 16:36:12
//ob3 = ob1 + (ob2 + ob4); をXcode1.5(gcc3.3)で実行すると以下のようなエラーが出ます。 error: candidates are: myclass myclass::operator+(myclass&) error: no match for `myclass& + myclass' operator 当然、operatorの引数にconstをつければ問題ないんですが。 これはob2+ob4のテンポラリオブジェクトがg++においてconst扱いに なるからかと思うのですが、どうなんでしょうか?
894 :
デフォルトの名無しさん :05/01/03 17:15:49
できることとやってもいいことは違う。仮引数のconstは何のためにあるんだ?
継承についてわかりやすく解説してるサイトを知りませんか?
896 :
839 :05/01/03 17:24:18
>894 できるからやるといった話ではなく、単にgcc(g++)の仕様が 把握できずに、戸惑っているんです。 例えば、(仮に正しいとした上で)演算中のテンポラリオブジェクトが 自動でconst扱いされるのは、そのオブジェクトが不可変であるべきだと いうことからそうなったのであれば、なぜconstオブジェクトが非const メンバ関数を呼び出すことを許すのかといったことです(実際はwarning 出ますが、c++の仕様では禁止されているはずです)。 gccでの挙動がc++の仕様ではなく、独自の拡張であるのなら、 様々な環境下で、それぞれにあわせたコーディングを考えないといけない ので、厄介だーと思ったのです。
897 :
デフォルトの名無しさん :05/01/03 17:34:28
g++で指定できる無数の起動オプションを参照することw
>>898 つまりテンポラリオブジェクトが自動でconstになるのは正しいのかどうか?
ということじゃないんか?
900 :
839 :05/01/03 17:42:19
>898 納得してます.constとテンポラリ,それぞれが無関係であることは. >899 そういうことです.補足すいません. 正しいかどうかと言いますか,gcc(g++)はそうじゃないのですか, と書いたところ,少し話がずれてきてしまいまして. gccはそういう仕様だから,そうなる. ということがはっきりすれば良いだけなんです.
//ob3 = ob1 + (ob2 + ob4);//このままだとVCではOK。g++ではエラー。 これはgccの方が正しいのであって、VCの方が独自拡張だぞぃ。
>>868 あんたの立場と何がしたいのかをもっと具体的に。
>868だけじゃ、他人のソースを読むのに手頃なツールが欲しいのか、
C++仕様書工房を使いこなしたいのか、コード管理ツールが欲しいのか、
愚痴を言いたいのか判らん。
>>901 839ではないですが、同じ疑問がある者です。
その式は
ob1.operator+( ob2.operator+(ob4) );
と解釈されると思いますが、ob2.operator+(ob4)から返されるのはmyclassのオブジェクトですから
ob1.operator+に渡してエラーになる、というのがどうも納得いきません。
constを明示的に指定しなくてもテンポラリオブジェクトはconstと解釈されるため、
myclass&を引数に取るob1.operator+には渡せない、ということでしょうか?
テンポラリは自動でconstになったりしない。 これは規格にも書かれているはずだし、g++も正しく実装している。 単に、非const参照を非constテンポラリで初期化できないだけだ。
>>904 なるほど、納得しました。
const参照を非constテンポラリで初期化 ならばOKなわけですね
907 :
839 :05/01/03 18:25:02
>904 すいません!そういうことだったんですね! 今度はちゃんと理解しました. 非const参照を非constテンポラリで初期化できないのはC++の仕様である ということですね. で,ob1+ob2ができるということは 非const参照は(非)constオブジェクト(テンポラリじゃない)で初期化は できるってことですかね.
>>907 そりゃ普通のオブジェクトで参照を初期化できなかったら
参照渡しができなくなるかと…
909 :
839 :05/01/03 18:36:08
非const参照を非constテンポラリで初期化できない... const参照ならできる・・・.記憶領域の関係で?コンパイラの最適化の関係で? 理由はわかりませんけど,そういう仕様ならそれに従うしかないですね. ありがとうございました!
910 :
839 :05/01/03 18:46:33
っと,忘れてました. >型 T のテンポラリに対しては非 const メンバ関数を呼び出すことができる。 に関連してですが,g++が 型 T const(テンポラリ)オブジェクトに対して非 const メンバ関数を呼び出すことができる。 ということができてしまうのは,よろしくないですよね.
△ 非const参照を非constテンポラリで初期化できない ○ 非const参照をテンポラリで初期化できない
913 :
デフォルトの名無しさん :05/01/03 19:04:37
初心者歓迎、とのことなので、恥を忍んで…。 自分のバカさ加減にあきれ気味です…。 #include<stdio.h> int main(void) { double r; scanf("%f\n",&r); printf("r=%fです\n",r); return 0; } 単純に「5」と入力したら、「r=5です」 と表示させたいだけなのですが…。 ナニがおかしいのでしょうか…?
scanf("%lf",&r);
915 :
デフォルトの名無しさん :05/01/03 19:08:29
scanfの引数に\nがある。 Enterキー押していない?
>>913 float : %f
double : %lf
long double : %Lf
>911 非const参照をconstテンポラリで初期化できないのはそのままですね. >912 できねーんですよ.そうなんです,できないはずなんです. でもXcodeで実行するとエラーではなくwarningはくだけでコンパイルされるんです. constが無効化するのかもしれませんが.
918 :
デフォルトの名無しさん :05/01/03 19:16:14
g++はconstを無効にするオプションがある。
919 :
デフォルトの名無しさん :05/01/03 19:20:04
>>915-916 ありがとうございました。
無事、表示できました。
もう少し自分のバカ脳味噌とつき合ってみます。
なるほど.それでできてしまうんですね.
>>917 エラーや警告を「そのまま」貼れ。ソースも一緒にな。
>>918 聞いた事無いな。どんなの?
まさか -Dconst= とか?
>921
警告はですね
passing `const myclass' as `this' argument of `myclass myclass::operator+(myclass&)' discards qualifiers
となっています.
ソースは
>>892 です.その中でob3=ob5+ob2とやってみると,constなob5が非constメンバ関数operatorを呼び出せてしまいます.
g++3.3.3ではエラーになるんだけどな
>>922 それ、エラーになってないか?
警告ならメッセージの先頭に warning と書いてあるはずだぞ。
>923-924 そうですか.いやXcode1.5(gcc3.3)でやるとそうなるんですよね. Darwin(BSD?)版のgccだとよろしくないかもしれません. linux等でエラーになるのなら,それはそれで問題ないですね.
XCodeはどんなオプションでコンパイルしてるんだ…
>>925 > いやXcode1.5(gcc3.3)でやるとそうなるんですよね
だったら先にそう書けこのバ
す,すいません.
>>917 に書いたつもりだったんですが.
deque<char *> dp;に文字列を格納する時に char buf[100]; strcpy(buf, "abc"); dp.push_back(buf); とするとうまく格納されるのですが、 char buf[100]; buf[0] = 'a'; buf[1] = 'b'; buf[2] = 'c'; buf[3] = '\0'; dp.push_back(buf); とするとdp[0]dp[1]と呼び出した時に 何も表示されなかったり、全て最後に格納した内容が表示されたりするんです 何が原因でしょうか?
>>929 君が言っている「うまく格納される」は、1つの関数の中にdpもbufも
入っているときに過ぎない。ある関数の中で
int hoge(){
char buf[100];
...
としていたとして、この関数を抜けたところでbufそのものが消滅して
いるから、dpがこの関数の外にスコープを持っていた場合、bufの
先頭アドレスを持っているdpの内容も当然破綻する。
int main() { char s1[]="Hello",s2[]="World",s3[20]; cout << strcat(s1,s2) << endl; cout << s1 << endl //下のプログラムと違う箇所 << strcpy(s3,s1) << endl; return 0; } これをコンパイルして実行すると HelloWorld HelloWorld HelloWorld と出力されるのですが、 int main() { char s1[]="Hello",s2[]="World",s3[20]; cout << strcat(s1,s2) << endl << s1 << endl //上のプログラムと違う箇所 << strcpy(s3,s1) << endl; return 0; } これをコンパイルして実行すると HelloWorld HelloWorld Hello となるのです。 二つのプログラムの相違点が、このような出力の違いを生み出しているのは分かるのですが、 何故このような違いが現れるのか、御教授お願いします。 ちなみにコンパイラはBCC5.5.1です。
>>strcat(s1,s2) 何やってんのよ… ポインタや配列を一から勉強し直してください
>>932 ああ、本当だ。
ここは、s1[15]="Hello"のように十分な配列を確保しておかなければならなかったorz
ダメだorz
s1の配列を十分に確保したけど、それでも
>>931 と同じ結果になるorz
>>934 副作用完了点 または シーケンスポイント でググれ。
一応その場合について言っておくと、
strcpy(s3,s1)がstrcat(s1,s2)より先に呼ばれたからそうなっただけ
>>934 ポインタの配列のの問題ではない。関数の引数の評価順序の問題。
cout << strcat(s1, s2) << s1 << strcpy(s3, s1);は、operator<<()を書き下すと
operator<<(operator<<(operator<<(cout, strcat(s1, s2)), s1), strcpy(s3, s1));ということ。
途中でostream& std::operator<<(ostream&, const char*);が呼び出されるわけだが、
関数の引数の評価順序は規格により未定義。
例えば、関数の引数が右から評価されるような処理系において、最初にstrcpy(s3, s1)が
実行される。当然s3は"Hello"となる。つまり、君の環境でそのコードをコンパイルしたら、
たまたま右から引数が評価されたわけだ。
当然左からでも中央からでも不規則でもかまわない。よってそのコードは環境によって
動作が変わる。
以上のことから関数の引数の評価順序に依存するようなコードは、一般的には書いては
ならないとされている。初心者がほぼ必ず一度ははまる罠。
そこでJavaですよ
まあ右再帰で還元されるから、右から左へ評価されるのが 一番素直な実装ではあるんだが。
>>935-938 丁寧な解説、感謝します。
この場合、問題解決の方法としては、
>>931 の下のプログラムのように、
cout << (文1) << endl;
cout << (文2) << endl;
という風にすれば、処理系に依存しないプログラムになるということですね。
strcat 等の戻り値を変数に保存しておけば何回も書かずにすむ
構造体配列を関数に渡して関数の中でメンバの二次元配列の値を代入したいのですが St->menba[0][0]=1;と書くと大丈夫なのですが int i; i=0; St->menba[0][i]=1と項番に変数を入れると値が変更されていません。 なぜなんでしょうか。
自己解決しました。ありがとうございました。
私は自己解決全然してないので、どなたかお願いします。
for(cnt=0;cnt<10;cnt++) { for(cntA=0;cntA<10;cntA++) { for(cntB=0;cntB<10;cntB++) { (St+cnt)->menba[cntA][cntB]=1; } } } だいたいこんな感じです。cntA,cntBを使わずに数字を直でいれれば値が変わるのですが そうしてしまうと、ソースが無駄に長くなってしまうので悩んでいます。
>>946 値が変わったかどうかは何で確認したの?
948 :
デフォルトの名無しさん :05/01/04 14:31:54
>>946 配列の範囲外をアクセスしている悪寒。
構造体の定義を晒してみ。
徹夜で眠くて寝てしまいました。 もう少し自分でやって出来なかったらもう一回質問に来ます。
覚めた頭でやってみたら出来ました。 やっぱり範囲外にアクセスしていたみたいです。 書き込みしてくれた皆様、ありがとうございました。
梅
馬
map<string, int>でmap<"1234">に すでに何かデータが入っているかを調べるにはどうすればいいですか? データが存在しないのにアクセスするとエラーになるし・・・
>>955 >map<"1234">
なんだその表現は。
map::findで調べればいいじゃない
メンバ関数の find, count, lower_bound等 Effective STL くらいは読んでおくと後が楽だよ
エラーだっけか? 確か初期値が返ったと思うのだが (禿本にもそう書いてなかったっけ?)
初期値が返る事は規格で保証されてるよ
VC6+STLPortについてですが、stlport付属のiostreamライブラリは使うべきですか?
961 :
デフォルトの名無しさん :05/01/05 11:46:34
>960 何をしようとしてる?
960ではないがリコンパイルしたもの使っているけど別に問題ないな。 処理速度とかバグとかは検証して使ってないけど。
dllを添付するのがめんどくさい、とかじゃないかな。
>>963 makeで必要ファイルをアーカイブするところまで作っておくと楽だよ。
VCのプロジェクトファイルとかでそれが出来るかどうかはしらないけど、
多分できるんじゃない?
965 :
デフォルトの名無しさん :05/01/05 18:25:22
システム実行中に時間を計測したいのですがどうすればうまく計測できますか?
>>965 処理の前後でタイマの数値取って差分出せばいいだけだろ
968 :
デフォルトの名無しさん :05/01/05 18:46:23
>1-1001 ありが㌧
969 :
デフォルトの名無しさん :05/01/05 20:21:17
すいません先ほどのスレでご意見いただけませんのでやってきました。。 WindowsSDKで、RICHEDITをCreateWindowExで作成しているのですが、親ウィンドウから、 どの文字(英数字のみ)が入力されたかを知るにはどうしたらいいのでしょうか。 メッセージキューに何が入るのかがわからないのです・・・コントロールは始めて使いますので (というかどうやったら入るのかもわからないのですが・・・たぶん入っている・・・みたいな_no)
970 :
デフォルトの名無しさん :05/01/05 20:32:22
GetTickCountトカ?マサカナ
971 :
デフォルトの名無しさん :05/01/05 20:47:44
>969 case WM_CHAR:の処理を加工して規定の処理をしたいデータをDefWin~Procに渡せば、文字の制限など簡単。Beep参照
オブジェクトを宣言する場合 値型 class1 c1; ポインタ型 class1 *c1 = new c1; どっちが適しているんですか?
>>973 場合によりますー ポインタの方が良く使うかもしれませんが…
あまり使いたくありませんね…^^; にゃんにゃん
C++のサンプルコードではよく値型を使っていますが C#ではC++のポインタ型に似た式です 一人で書いたと思われるソースで 値型とポインタ型を使い分けていた人がいたので 気になったのですが
こう言いましょうかー。 ポインタを使うしかないときだけポインタをつかいましょうー にゃんにゃん
>>978 >ポインタを使うしかないとき
っていうのは派生クラスのオブジェクトで
基本クラスのメンバ関数を呼び出すときとかのことですよね?
ありがとうございました
スタックとヒープの使いわけ。
982 :
969 :05/01/06 11:38:16
>>971 さん
どうもありがとうございます。ただ、WM_CHARにブレークポイントを設定しても
引っかかってくれません。Spy++で見ると、たしかにWM_CHARは送られているのですが・・・
親ウィンドウでWM_CHARを取得するのに、何かをSendMessageしたりとかしないと
いけないのかなぁと思ったのですが・・・m(_ _)m
983 :
デフォルトの名無しさん :05/01/06 11:41:41
>982 その前にRICHEDITのサブクラス化は?
984 :
969 :05/01/06 11:51:39
そういえばパナウェーブってどうなったの?
雪に埋もれてるんじゃない?
いきなり何の話だ
スカラー波の波動を計算するプログラムを作ってくれ、って意味じゃない?
989 :
デフォルトの名無しさん :05/01/06 17:16:52
>988 ... #include<math.h> ... double i,j; for(i=0;i<20;i+=1){ for(j=0;j<15+15*sin(2*i*M_PI/20);j+=1)putchar(' ');printf("*\n"); }
ワロタ
スカラー波の不変条件は?
パナウェーブに聞いてください