【初心者歓迎】C/C++室 Ver.22【環境依存OK】
2 :
デフォルトの名無しさん :2005/10/10(月) 00:46:11
1000 名前:デフォルトの名無しさん [sage] 投稿日:2005/10/10(月) 00:45:20 1000なら妹の下着うpする。
1000 名前:デフォルトの名無しさん[sage] 投稿日:2005/10/10(月) 00:45:20 1000なら妹の下着うpする。 1000 名前:デフォルトの名無しさん[sage] 投稿日:2005/10/10(月) 00:45:20 1000なら妹の下着うpする。 1000 名前:デフォルトの名無しさん[sage] 投稿日:2005/10/10(月) 00:45:20 1000なら妹の下着うpする。 1000 名前:デフォルトの名無しさん[sage] 投稿日:2005/10/10(月) 00:45:20 1000なら妹の下着うpする。 1000 名前:デフォルトの名無しさん[sage] 投稿日:2005/10/10(月) 00:45:20 1000なら妹の下着うpする。
STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない。 すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後氏ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> あと死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
12 :
デフォルトの名無しさん :2005/10/10(月) 01:49:32
前スレの949ですが以下が考えたプログラムです。 data.datというファイルから数値を入力し合計と平均を出すだけの プログラムだと思うのですが全く何も起こらなくて。 何がいけないんでしょう? #include<stdio.h> #include<stdlib.h> void main(void) {int val; int sum=0; int cnt; FILE *fp; if((fp=fopen("data.dat","r"))==NULL) { printf("File not found---\n"); exit(1); } for(cnt=0;;cnt++) {fscanf(fp,"%d",&val); if(val==0) {break; } sum+=val; } if(cnt>0) { printf("Sum=%d Ave=%f",sum,(double)sum/cnt); } fclose(fp); }
>>12 デバッガで一行ずつ追っていけばすぐ解決するお。
おそらく無限ループしてるんだろうな
>>15 fscanfでvalに読み込んだ値が0ならbreakするようになってる
0がなかったら無限ループになるだろうね
あと整数に変換できない文字列が途中にあっても無限ループするな
こういうのはfgetsとatoiを使うのがいいのかな?
>>16 fscanfが失敗したらbreakもいれておこう
とりあえずfscanfの返り値チェックするようにすればいいだろ
unsigned long int (64bit)が使えるフリーのコンパイラってないですかね、 教えて下さい。
(unsigned) long long intの間違いじゃないの? まあどっちにしろgccで使えるよ。
unsigned __int64 ならBCCでも使えるだろ。実際使うとなるといろいろ問題だが。
gccだとlong long int でも32ビットになってしまいます。 bccでも駄目でした・・・ かろうじてFTN95とg77がサポートしてましたが、符号なしは無理なようで・・
ちょっと軽い気持ちで聞くんだけど。 そういうCPUの桁数(ビット数)を超えちゃう計算ってC言語でどうやるの? 例えばハードディスクの容量の計算とかって余裕で足りないじゃん。 普通に足し算するにしても頭こんがらがるんだけど。
26 :
デフォルトの名無しさん :2005/10/10(月) 02:42:37
おい、下着は何処だ?
まずは妹をください そうすればパンツをご覧にみせます
>>25 同感です、FTN95で、922京あたりの素数が求められた時には感動しました。
セレロンだから遅いですけどw
>24 手元のcygwin/gcc v3.4.4で unsigned long long int hoge; printf("%d\n", sizeof(hoge)); とやったら 8 と出力されるけど。__int64に直してBCC5.5.1でやっても同様。
なるほど!bccでは宣言の仕方が違ったんですね、 これで心おきなく1844京辺りの素数が求められそうです、 ありがとうございました!
ご覧にみせます の検索結果のうち 日本語のページ 約 25 件中 1 - 21 件目 (0.45 秒)
#include<stdio.h> main(){ unsigned __int64 i,j,k; scanf("%d",&j); scanf("%d",&k); i=j*k; printf("%d %d",i); return 0; } i=4200000000,j=5とかやってみたら、いきなりあふれてしまった、 一筋縄ではいかないようですねw
%dじゃなくて%uじゃなかったけ? printfのところを//でコメントアウトして実行してみたら?
>>34 bcc32でやってるんなら、scanf()で__int64とかunsigned __int64を読み込む
書式は用意されてないよ。
自前で用意汁。これがさっき言っていた問題点。
>>36 んなこたぁない。
%I64dと、%I64uがある。from BCB6。BCC5.5.1でも同じじゃマカろーか。
ぉお、構想どうり動きそうです! ついでにソース晒してみます。 #include<stdio.h> #include<math.h> main(){ unsigned __int64 n,a=0,i,j,m=2,l; printf("Start number = "); scanf("%I64u",&l); printf("End Number = "); scanf("%I64u",&n); printf("[%10d] = %10d \n",1,2); for(i=l;i<=n;i+=2){ for(j=3;j<=__int64(sqrt(i));j+=2){ if(i%j==0){ a=1; break; } } if(a==0){ printf("[%10I64u] = %10I64u \n",m,i); m=m+1; }else{ a=0; } } return 0; }
ちなみにgccにも特殊な書式が必要なんですか?
%lld、%llu
つまり%Ld、%Luでもよい。
ぉお、もの凄い!参考書が必要じゃなくなりそうなページですね
>38のコードはStart numberに偶数を指定するとトンチキな結果を返すのでだめだめ。 あと1も素数と判定されてしまう。
#include<stdio.h> #include<math.h> main(){ unsigned __int64 n,a=0,i,j,m=2,l=1; printf("Start number = "); scanf("%I64u",&l); while(l%2==0 || l==1){ printf("Start number = "); scanf("%I64u",&l); } printf("End Number = "); scanf("%I64u",&n); for(i=l;i<=n;i+=2){ for(j=3;j<=__int64(sqrt(i));j+=2){ if(i%j==0){ a=1; break; } } if(a==0){ printf("[%5I64u] = %20I64u \n",m,i); m=m+1; }else{ a=0; } } return 0; }
OKですね
そういう直し方をされても困ってしまうのだが
#include<stdio.h> #include<math.h> main(){ unsigned __int64 n,a=0,i,j,m=1,l=1; printf("Start number = "); scanf("%I64u",&l); if(l==1L){ l=3L; } if(l%2==0){ l=l+1L; } printf("End Number = "); scanf("%I64u",&n); for(i=l;i<=n;i+=2){ for(j=3;j<=__int64(sqrt(i));j+=2){ if(i%j==0){ a=1; break; } } if(a==0){ printf("[%5I64u] = %20I64u \n",m,i); m=m+1; }else{ a=0; } } return 0; }
こういう感じですかね あと18446744073709549951が個人で求められる最終解っぽいですね
手元でちゃんと確認してからソース貼ってくれよ頼むから 今度は2から開始した時に2がカウントされないよ アルゴリズムの方を見直すという考えはないの
#include<stdio.h> #include<math.h> main(){ for(;;){ unsigned __int64 n,a=0,i,j,m=1,l=1; printf("Start number = "); scanf("%I64u",&l); if(l==1L){ l=3L; } if(l%2==0 && l!=2){ l=l+1L; } printf("End Number = "); scanf("%I64u",&n); if(l==2){ l=l+1; printf("[ 1] = 2\n"); m=2; } for(i=l;i<=n;i+=2){ for(j=3;j<=__int64(sqrt(i));j+=2){ if(i%j==0){ a=1; break; } } 略 これでOKっぽいですね、ありがとうございました。
そういうことを言いたいんじゃないんだがもういいや
>>51 そんなループwhile使えよ
かっこ悪い
なんちゅーか、やらされてる感がプンプンする、 言われたとこだけ直して、これでいいでしょ! とっとと終わらせたい、みたいな。
おかしいと思うならこう直せと言ってやれば良いじゃん 本人はとりあえず結果がでて満足してるんだし まさか、完璧なコード以外認めないとか言うんじゃなかろうな
認めない
57 :
51 :2005/10/10(月) 14:28:43
確かにwhile使った方がエレガントですね、 forで書くとbreakとcontinueがごっちゃになってバグりやすかったです。
この場合の修飾詞はエレガントじゃなくてスマートじゃないかな。 まあ本当に優雅に見えたのならそれで間違いじゃないし、スレとは全然関係ないけど。
59 :
デフォルトの名無しさん :2005/10/10(月) 15:16:42
第1引数で書く記号の種類、第2引数でそれをいくつ書く という関数を作りたく、以下のようにしたところ、 引数が少ない と、怒られました。2個であってる気がするのですが、 何故怒られるのでしょうか?ちなみに、SHARP を 2 に変えると引数少ないエラーは 消えます。 #include <stdio.h> #define HYPHEN 0; #define ASTERISK 1; #define SHARP 2; #define PLUS 3; void draw_symbol(int symbol, int count); int main(){ draw_symbol(SHARP, 10); }
60 :
sage :2005/10/10(月) 15:17:34
void draw_symbol(int symbol, int count); { int i; switch symbol { case HYPHEN: for(i=0; i > count; count++){ printf("-"); } break; case ASTERISK: for(i=0; i > count; count++){ printf("*"); } break; case SHARP: for(i=0; i > count; count++){ printf("#"); } break; case PLUS: for(i=0; i > count; count++){ printf("+"); } break; } }
61>> あああああ!! ありがとうございます。 とってみたらswitchで爆発しました。
defineにセミコロン書くなよ・・・
>>63 すいません。つい。
以下の内容で解決しました。
・switchにの条件式に()を付け忘れていた
・タグの先のforで比較対照(count)を++していた
ファイルを特定の行まで読みたいんですけど,どうも上手くいきません. どうすれば良いんでしょうか. istream_iteratorの使い方がおかしいのかな? std::vector<std::string> text; std::ifstream ifs("data.txt"); if(!ifs) std::exit(EXIT_FAILURE); std::istream_iterator<std::string> it1(ifs), it2, eof; it2 = std::find(it1, eof, "山田\n"); std::copy(it1, it2, std::back_inserter(text)); std::copy(text.begin(), text.end(), std::ostream_iterator<std::string>(std::cout)); data.txt 小林 田中 山田 大村
あぁぁぁコード見てすごくいらついた。 #define HYPHEN 0 のままテーブル(?もしくはswitch)でch拾うほうが いいかもしれんが。さらにくずコードですまん。 #include <stdio.h> #define HYPHEN '-' #define ASTERISK '*' #define SHARP '#' #define PLUS '+' void draw_symbol(int ch, int count) { while(count-- > 0){ putchar(ch); } } int main(void) { draw_symbol(SHARP, 10); }
(゚Д゚)ハァ?
年月日 時分秒のデータを秒だけのデータにしたくて以下のように書いたのですが 結果は 98年1月31日 23時59分59秒 ==> 888937199 98年2月1日 0時0分0秒 ==> 888678000 となってしまいます。 使い方が間違ってますか? #include<iostream> #include<time.h> using namespace std; main(){ time_t seconds; struct tm timeptr; timeptr.tm_mday = 31; timeptr.tm_mon = 1; timeptr.tm_year = 98; timeptr.tm_hour =23; timeptr.tm_min = 59; timeptr.tm_sec = 59; seconds = mktime(&timeptr); cout<<seconds<<endl; timeptr.tm_mday = 1; timeptr.tm_mon = 2; timeptr.tm_year = 98; timeptr.tm_hour =0; timeptr.tm_min = 0; timeptr.tm_sec = 0; seconds = mktime(&timeptr); cout<<seconds<<endl; return 0; }
>>69 mktime()かstruct tmの説明をよく読め。tm_monは1オリジンではない。
>>68 うち(WinXP, CodeWarrior8.3)じゃ
小林
しかtextに突っ込まれないのです
>>72 すいません.
私の質問は
>>71 の1行目,「ファイルを特定の行まで読みたい」と言うことです.
私のコードが間違っていて(私の意図とは異なっていて),コンパイル結果がC++としては正しい動作をしていることはわかります.
しかしながらその正しい動作は,私の意図した動作とは異なります.
私の書いたコードのどの部分がおかしくて,どう修正すれば意図した動作になるのか教えてくださればありがたいです.
>>65 istream_iterator は InputIterator で ForwardIterator じゃないから、1度しか値を取り出せないよ。
>>65 それと、STLの反復子は、「本当のend」を一つ通り過ぎた位置である
事に注意。
77 :
12 :2005/10/10(月) 20:49:33
レスどうもです forの条件文は省略してます。 ちょっとまだできないのでもいっかい考えてみます お騒がせしましたー
78 :
デフォルトの名無しさん :2005/10/10(月) 21:00:47
xのy乗を求める問題で、どこか間違ってるところありますか? include <stdio.h> #include <math.h> main() { double x,y,z; printf("x ="); scanf("%lf",&x); printf("y ="); scanf("%lf",&y); z = pow(x ,y); printf("x\ty = %lf", z); }
>>78 思い通りの動いてるなら、間違っていない。
思い通りに動いていないなら、間違ってる。
>>78 くだらない事でマルチをする君の行動と態度が間違っている
81 :
デフォルトの名無しさん :2005/10/10(月) 21:10:14
C++プログラミング Vol.1&Vol.2[ISBN4-89471-009-9, ISBN4-89471-024-2] (1997年) H.M.ダイテル+P.J.ダイテル著 学生時代趣味で始めようとして、結局読まずじまいだった本が出てきた。 社会人になってから8年、エクセルのVBAのfor文、if文しか使ったことか無かった俺だが、 2週間で読破し、用語や内容についても読んでいるだけでほぼ理解することができた。 俺の頭が良すぎるのか、テキストがすばらしいのか。とりあえず、おすすめしときます。 なんかサクサク理解できたからか、おもしろくなってきたので Visual C++.NET 2003 stdを買ってきた。 そして、各種VC++の本を買ってきてきては orz。また買ってきては、orz。 このままでは、合計3万5千円の損になる。C++については理解してると仮定して、 どなたか、良い本知りませんか。
>>83 VC++で何をしたいんだよ?コンソールアプリ作るのか、WebなのかそれともGUIなのか
GUIにしてもWin32APIを叩くのか、MFC使うのか
まぁ何が言いたいかっていうと ス レ 違 い って事なんだけどな
86 :
デフォルトの名無しさん :2005/10/10(月) 21:39:38
>>82 どんなエラーかがちょっとわからないんですけど、
確実にコンパイル通りません。
>>78 include <stdio.h>
#include <math.h>
include <stdio.h>
#include <math.h>
include <stdio.h>
#include <math.h>
include <stdio.h>
#include <math.h>
これが原因?
>>86 大事な質問のコツを教えてやる。
エラーメッセージはコピペしろ。
89 :
デフォルトの名無しさん :2005/10/10(月) 21:51:59
>>88 すみません、
エラーメッセージってなんですか?
>>89 まぁ、待て
includeの前に # つけてみ
ワロス
いやまだコピペミスという可能性も ないか・・・・・・
しかもマルチ?
こんな脳みそ足りない奴と同じ種族とは思いたくない。
95 :
65 :2005/10/10(月) 23:06:20
>>75-76 なるほど.意図した動作にならない理由が分かりました.
そうするとcopyでファイルの部分部分を一気に読み取る,というのは難しいですかね.
96 :
デフォルトの名無しさん :2005/10/10(月) 23:14:06
すみません、ちょっと教えていただけませんでしょうか! GAFREC* pGAFRecs; LAFREC* pLAFRecs; int j; intiNum = 3; floatfNum = 123.123F; for(j = 0; j < 20; j++ ) { pGAFRecs[j].nWL= iNum; pGAFRecs[j].fFactValue= fNum; pLAFRecs[j].nWL= iNum; pLAFRecs[j].fX= fNum; pLAFRecs[j].fY= fNum; pLAFRecs[j].fZ= fNum; iNum *= 3; fNum += 11.222F; } テストしたくて、このように値を入れてあげようかとやったんですけど、下記のエラーがでてしまいました。 &つけるなり、キャストなりとしてみたんですけど、わからずここにきました。 :\HIROEO&RYU\WriteFactorFiles\WriteFactorFilesDlg.cpp(189) : warning C4700: 値が割り当てられていないローカルな変数 'pGAFRecs' に対して参照が行われました。 C:\HIROEO&RYU\WriteFactorFiles\WriteFactorFilesDlg.cpp(191) : warning C4700: 値が割り当てられていないローカルな変数 'pLAFRecs' に対して参照が行われました。 リンク中... WriteFactorFiles.exe - エラー 0、警告 2 よろしくお願いします。
>>96 こちらこそよろしくお願いします。
∧_∧
( ・∀・)
( ∪ ∪
と__)__)
98 :
デフォルトの名無しさん :2005/10/10(月) 23:23:15
いえいえこちらこそ。。って教えて頂きませんか!
GAFRECって何か知らないけど、 newもしないで使えるポインタなんだ。 多分 pGAFRecs = new GAFREC[20]; pLAFRecs = new LAFREC[20]; っていうのがいるんじゃない?
100 :
デフォルトの名無しさん :2005/10/10(月) 23:35:32
GAFRECはこちらです↓ //GAFファイル書き込みデータレコード構造体 typedef struct _tagGAFREC { int nWL; //WL値 floatfFactValue; //f値 }GAFREC; //LAFファイル書き込みデータレコード構造体 typedef struct _tagLAFREC { intnWL;//WL値 floatfX;//x値 floatfY;//y値 floatfZ;//z値 }LAFREC; newは他の関数でして処理してます。
>>100 まて、 ほかの関数でって言ってるけど、
>>96 を見る限り、変数 pGAFRecs; は定義されてから一度もnewされてないじゃないか?
そりゃ、エラーも出るだろ。
102 :
デフォルトの名無しさん :2005/10/10(月) 23:44:29
ちょっとやってみます
ポインタをまったく理解してなかったというオチか・・・
多分
>>102 は、newした後delete忘れるんだろうなって思ってる。
105 :
デフォルトの名無しさん :2005/10/10(月) 23:53:50
ありがとうございます。うまく行ったのですが、 ファイルポインタの渡し方がわからずどうすればよろしいですか? 自分で行ったポインタの渡し方↓ WriteFactorFiles( "gaffile.csv", "laffaile.csv", 2,pGAFRecs,3,pLAFRecs ); プロトタイプ宣言↓ bool WriteFactorFiles( LPCTSTR lpszGAFName, LPCTSTR lpszLAFName, int nGAFRecCnt,GAFREC* pGAFRecs, int nLAFRecCnt,LAFREC* pLAFRecs ); って感じなんですけど、どうすればうまく渡せますか?
bccでコンパイルしてできた.exeを起動すると一瞬 画面が出てきて終わってしまいます。これは何がいけないんですか?
>106 コマンドプロンプトから起動しないから。あるいは入力待ち状態にならないから。
自己解決しました
こまんどぷろんぷと
>>105 bool WriteFactorFiles(
LPCTSTR lpszGAFName,
LPCTSTR lpszLAFName,
int nGAFRecCnt,
GAFREC* pGAFRecs,
int nLAFRecCnt,
LAFREC* pLAFRecs );
lpszGAFName にフルパスでファイル名渡すんなら、もらった後で
ファイル開けばいいだけだと思うんだけど……
それがいやなら、多分VC使ってると思うんで、 CFile&とかってやってみるか。
bool WriteFactorFiles(
CFile& gafFile,
CFile& lafFile,
int nGAFRecCnt,
GAFREC* pGAFRecs,
int nLAFRecCnt,
LAFREC* pLAFRecs );
こんな感じ?
111 :
デフォルトの名無しさん :2005/10/11(火) 00:09:51
コマンドプロントから起動しなくてもexeで一瞬で消えないようにすることはできなのでしょうか?
ちゃんとした日本語をしゃべってください。
理解力の差か・・・
115 :
デフォルトの名無しさん :2005/10/11(火) 00:48:52
エラーメッセージ書かない奴って何考えてんだ。
良いんじゃない、エラーメッセージ書かなくても教える奴居るし。
delete[]pGmem; delete pGmem;
すみませんしつも・・・
120 :
119 :2005/10/11(火) 01:04:59
自己解凍しました。
121 :
デフォルトの名無しさん :2005/10/11(火) 01:07:27
デバッグエラーって書いてあります。 なんかダイアログがでてきて、英語でわけのわからぬことが 書いてあります。
>>121 そのわけがわからないことは君にとって分からないことなのであって
普通のプログラマにとっては最も重要な情報の1つなのですよ
123 :
デフォルトの名無しさん :2005/10/11(火) 01:24:02
Debuf Error! Program C:\w\WriteFactorFiles.exe DAMAGE;after Normal block (#81)at 0x00346010
124 :
デフォルトの名無しさん :2005/10/11(火) 01:25:08
って書いてありました。 deleteするところで↑エラーしてしまいます。 考えられる原因はなんでしょうか?
>>124 ポインタと、メモリの確保を勉強しなおして来い。
できれば手で直接打たずにコピペしてください。
つーか、その程度もまともに手打ちできないようではプログラミングなんて 入力ミスとの戦いになるだけでおもしろくもなんともないだろうなぁ。
>>127 そんなの3ヶ月もすりゃ慣れるべ。
長い目でみてやれや。
129 :
長い目 :2005/10/11(火) 03:53:22
(───ω───)
>>115 freadがsizeof(int)とsizeof(float)なんじゃ?それだけかどうかは知らんけど。
エラーは"after Normal block"でググれば判る。
メッセージボックスで出てくるものをどーやってコピペせいっちゅーんじゃこいつは・・・
じゃあちゃんと間違えないで書き写してください
>>131 プリントスクリーンキーでとって画像うpしる!
(゚д゚)・・・
(゚д゚)ウッウー
案外メッセージボックスの類がCTRL+Cでコピーできることを知らない人が多い
知ってる人の方が少ないと思われるがの
そこで試そうとも思わないような香具師がプログラミングなんて笑わせるぜ。
>>115 //レコード値を書き込む
for(i = 0; i < nGAFRecCnt; i++)
{
//レコード値を読み込む
fread(&pGmem[i].nWL,sizeof(GAFREC),1,GLFP);
fread(&pGmem[i].fFactValue,sizeof(GAFREC),1,GLFP);
Ret = fprintf(GLFP,"%d,%f",pGmem[i].nWL,pGmem[i].fFactValue );
if(Ret == NULL)
{
delete [] pGmem;
fclose(GLFP);
return false;
}
}
って書いてあるけど、 ここでpGmemがdeleteされたときってもう一回
→→→→delete[]pGmem;←←←ここでエラーが起きてしまいます。
でdelete喰らうわけだよね。
その場合、二回deleteされるわけだけど、そういう時って何が起こってるの?
実行時にエラーになるだけ
144 :
デフォルトの名無しさん :2005/10/11(火) 18:49:23
C++とJavaってどっちが早いですか?
スレ違い
146 :
デフォルトの名無しさん :2005/10/11(火) 19:09:31
すいませんでした
許しません
148 :
デフォルトの名無しさん :2005/10/11(火) 21:51:46
クラス内でスレッドを作りたいんだけど、どうやるの
お仕置きです
>148 よくある質問だ。 キミは↓こんな事をしたかったが、できなかった。そうだね? class Thread { public: Thread() { fHandle = CreateThread( ThreadProc ); } DWORD WINAPI ThreadProc(void *) { return 0; } }; かわりに↓こうすればよい。 class Thread { public: Thread() { fHandle = CreateThread( StaticThreadProc, this ); } DWORD ThreadProc() { return 0; } static DWORD WINAPI StaticThreadProc(void *aParam) { return ((Thread*)aParam)->ThreadProc(); } }; CreateThread には (_beginthread(ex)にも) "パラメータ" を渡すところがあるね? そこに this を入れるのがコツだ。
初心者の質問 newについて main() { int *integer = new int[]; for (int i = 1; i <= 10; i++) cin >> integer[i]; return 0; } これは、コンパイル時にエラーにならないのですが、 メモリの内容壊してますか?
152 :
デフォルトの名無しさん :2005/10/11(火) 23:02:39
ありがとうございます でも、俺のやろうとしてる方法と違います。 class Thread{ public: DWORD __stdcall Thread1(PVOID); }; クラス内はこうなってます。 これを class Thread{ public: static DWORD __stdcall Thread1(PVOID); }; にするとコンパイル出来るんですが、private部分にある変数が使えません これはどうすれば??
>>151 明らかにシンタックスエラーじゃないか
どんな糞コンパイラだよ
>>151 あとC++じゃ関数の戻り値の型省略できない
>>152 もっと冷静に150を読むんだ。
ナゾナゾだ。150のクラス(下の方のヤシな)で、最終的に
スレッドとして実行される関数はどーれだ?
答え: DWORD ThreadProc()。
じゃあもう一つナゾナゾだ。
ThreadProc() の中で、privateな変数は使えないか?
157 :
デフォルトの名無しさん :2005/10/12(水) 01:45:03
何でクラス定義の中でメンバ関数を定義したらインライン化されるのですか? もしかして基本的に関数の定義より先に関数の宣言をしないと、インライン化されるのですか?
158 :
デフォルトの名無しさん :2005/10/12(水) 01:50:55
>>157 別にインライン化されるとは限らない。
明示的に"inline"指定してもインライン化されるとは限らない。
ただコンパイラに「可能ならそうしてね」とお願いするだけ。
以上は仕様で決まっている話。
コンパイラの都合上、インライン化するためにはクラス定義の中に 関数定義するのが一番楽なんじゃないの?
>>157 C++なら関数の前に宣言を書かないと規格違反
>何でクラス定義の中でメンバ関数を定義したらインライン化されるのですか?
規格でそう定義されてるから
162 :
161 :2005/10/12(水) 01:55:00
ああ絶対にじゃないよ
163 :
デフォルトの名無しさん :2005/10/12(水) 01:58:43
157だけどみんなありがとう
164 :
デフォルトの名無しさん :2005/10/12(水) 07:31:22
CreateWindowで作ったボタンを見えなくする方法は?
165 :
デフォルトの名無しさん :2005/10/12(水) 07:32:32
CreateWindowで作ったボタンを見えなくする方法は?
クラスと構造体の違いってアクセス制限できるかどうかでいいんですか?
>>167 違う
デフォルトのアクセス制限がpublicとprivateの違いしか、
構造体とクラスにはない。
別に構造体でもアクセス制限はできる。
>>168 そういや何で重複機能なのにclassとstructってあるんかな?
クラスのインターフェースたるpublic部分はクラス宣言の最初に来てる方が
見た目に分かりやすいしstructだけでも問題ないと思うんだけど
>>170 D&Eには書いてなかったと思うが
ARM当たるよ
環境に依存しないファイルロック方法はありませんか?
ない
174 :
151 :2005/10/12(水) 18:28:18
>>151 です。
>>154 VC++.NET 2003 stdでし
Win32 コンソールにて
勉強してて、ふと思って書いてみたらエラーにならんかったもんで。
と、いうことはVC++は、コンパイラとしてはあまり良くないんですか?
それともVC++は、あまりにバカバカしいエラーなんで、あきれたのか?
同じ環境でコンパイルしたら fatal error C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 こんなエラーでたよ。
176 :
174 :2005/10/12(水) 20:49:33
>>174-175 えぇ!?なぜ俺だけ?
ファイル−新規作成−プロジェクト−Win32−Win32コンソールプロジェクト
−−アプリケーションの設定−空のプロジェクト
でつくりました。スレ違いなのでこれ以上は書きませんが、なんでだろ?
177 :
デフォルトの名無しさん :2005/10/12(水) 20:58:32
変数や定数の型を調べるにはどうすればいいのですか?
>>177 んなこと言ってる時点で設計間違ってる。
RTTIについて勉強汁。
179 :
デフォルトの名無しさん :2005/10/12(水) 21:12:42
>>177 そういうプログラムが必要になる自分の設計能力を疑うのが先。
まあ一応やり方だけ。 C++なら #include <typeinfo> typeid(なんちゃら).name() で型名が返される、がどう返すかは処理系依存 #include <cstdio> #include <typeinfo> #include <string> using namespace std; class Hoge{}; int main() { int i; const double PI = 3.14159; Hoge hoge; printf("%s\n", typeid(i).name()); printf("%s\n", typeid(PI).name()); printf("%s\n", typeid(hoge).name()); printf("%s\n", typeid(string("hoge")).name()); // テンプレートクラスはテンプレートも展開されるのでたいへん return 0; }
>>175 #include <stdafx.h>
後氏ね。
>>182 #include "stdafx.h"
ちょっと聞きたいんですけど、 num = r1 if(r2 < num) num = r2; else if(r3 < num) num = r3; else if(r4 < num) num = r4; else if(r5 < num) num = r5; else print("hoge %d" , num); のようなソースがあったとして、 例えばr3までnumが更新されて、r4で条件を満たさなくなった場合 r5 r6 は判定されなくなりますよね? それをr2からr6まで判定して決めたいんですけど、どのように記述すればいいでしょうか?
>>184 無理にif - else if で繋がず、if を繰り返すだけで医院で内科医?
>>184 意味が分からん、とりあえずr1~r5の大小関係を書け
r1からr6の最小値を求めるってことでいいのか?
>>184 そのコードだとr2<numがtrueと判定された時点でr3からr5は判定されない
全部判定させたいなら
>>185
189 :
184 :2005/10/13(木) 00:41:16
>>185 >>188 ちょっとやってみます
>>186 r1〜r6はこの上で入力データーから計算で出すんですが
サンプルで順に(r1 r2 ・・・)
1100 850 850 1100 400 900
※このソースだとr2が出力されます。でもr5が欲しいです。
>>187 そういうことです。
>>189 最小値なら、こうすりゃいいんじゃまいか?
int min = r1;
if (r2 < min) min = r2;
if (r3 < min) min = r3;
略
if (r6 < min) min = r6;
r1〜r6が配列にでも入っててくれればもっとすっきりした実装できるんだがな
191 :
184 :2005/10/13(木) 01:04:44
物事はそう単純じゃないって気づきました。 実は問題を読み違えてて・・・ 最少数も出力しなきゃなりません。(;´Д`) num = r1; if(r2 < num) { num = r2; printf("hoge2 %d", num); } if(r3 < num){ num = r3; printf("hoge3 %d", num); } if(r4 < num) { num = r4; printf("hoge4 %d", num); } if(r5 < num) { num = r5; printf("hoge5 %d", num); } if(r6 < num) { num = r6; printf("hoge6 %d", num); } else printf("hoge1 %d", num); としたんですが、今度は条件を満たしたところすべてが出力されてしまいます・・。 しかもr1〜r6でprintfの内容が異なります。 どうすればいいでしょう・・・
192 :
184 :2005/10/13(木) 01:07:41
>>190 すいません、配列までまだ進んでません・・・。
>>191 struct min{
int num;
int name;
} min;
min.num = r1;
min.name = 1;
if (r2 < min.num) {
min.num = r2;
min.name = 2;
}
if (r3 < min.num) {
min.num = r3;
min.name = 3;
}
略
if (r6 < min.num) {
min.num = r6;
min.name = 6;
}
printf("hoge%d %d\n", min.name, min.num);
書いてから気づいたが、配列がまだなら当然構造体なんてやってないよな・・・
その場合は最初のstructで始まるブロック消して
int num, name;追加して、min.num, min.nameをそれぞれnum, nameに置換してくれ
194 :
184 :2005/10/13(木) 01:25:18
多分、俺が悪いんですけど
hoge1、hoge2とかはたまたま例として書いただけで数字を変えればいいって内容じゃないんです・・・。
個別にあります・・。それでelse ifを考えたんですけど
>>184 のザマです。
ループですみません;
>>194 名前が別についてるのか?
それならchar name[10];ぐらい宣言しといてstrcpyでって手もあるが配列やってないんだよな・・・
眠くて頭はたらんのでパス('A`)
宿題スレ行って、問題文全部晒した方が早い。
197 :
184 :2005/10/13(木) 02:27:17
配列使えないとちと苦しいな num = r1; v=1; if(r2 < num){ num = r2; V=2; } if(r3 < num){ num = r3; V=3; } if(r4 < num){ num = r4; V=4; } if(r5 < num){ num = r5; V=5; } if(r6 < num){ num = r6; V=6; } if(v==1){ printf("hoge1 %d", num); /* その他色々な処理 */ } if(v==2){ printf("hoge2 %d", num); /* その他色々な処理 */ } :
Linux上でkill -HUPをsignal関数で捕捉することは出来ないでしょうか?
できるんじゃない? KILLでもSTOPでもないんだし。
201 :
199 :2005/10/13(木) 11:26:37
>>200 ありがとうございます。もう少し詳しく教えていただけないでしょうか?
signal(SIGKILL,func)
とやっても、失敗(SIG_ERR)します。
KILLシグナルは捕まえられないだろう(多分)。
>>199 では HUPシグナルを捕まえたかったんじゃないのか?
203 :
199 :2005/10/13(木) 11:54:46
HUPシグナルを捕まえる場合、SIGKILLではなく何を指定すればよいのでしょうか?
( ゚д゚)カポーン
$ man 7 signal
qsort関数で構造体配列をソートするとき、double型の値で ソートできるんですが?
比較関数でdouble型での比較をすればいい。
できない
212 :
デフォルトの名無しさん :2005/10/14(金) 06:45:10
printf("%d",0L); この「L」って何なんですか? 普通の「0」とどんな違いがありますか?
定数値の型がlong型
214 :
213 :2005/10/14(金) 06:52:34
もとい、long int型
流れが読めない香具師だな
流れって何?お前の脳内流れか?ププ
218 :
デフォルトの名無しさん :2005/10/14(金) 07:30:34
219 :
デフォルトの名無しさん :2005/10/14(金) 07:39:42
ちなみに、基本的に数字定数はintみたいですが、intで表現できない大きな定数は勝手にlongとして扱ってくれるのですか?
>>220 説明もせずに、理解とかそういう言葉使うわけか。立派な詭弁ですね。
>219 C99でどうなったか追っかけてないが、手元のK&R C第2版にはこうある。 P45 2.3 定数 (略)大きすぎてintに収まりきれない整数もlongとして扱われる。(略) とはいえ、Cの仕様ではintの幅 = longの幅ということも許されるので intで収まらん数はlongでも収まらんという場合もある。 printf("%s", typeid(100000000000000).name()); ↑を各コンパイラに食わせてみたら、VC++.NET 2003とBCC5.5.1は__int64と返し、 g++は「error: integer constant is too large for "long" type」とコンパイルエラーとなった。
久しぶりに見たな、ここまで痛いヤツ 誰とは言わんが
>>223 そんなレスしたってまた痛いこと言い出すだけから、
このスレのためにもスルーが一番だと思うよ。
理解力も無いのに煽るなんて馬鹿だなって書こうとしたけど、 考えてみれば理解力が無いから煽ってるんであって、言うだけ無駄なんだよね。
226 :
デフォルトの名無しさん :2005/10/14(金) 09:35:42
数値を文字に変換するにはどうすればいいのでしょうか?
sprintf _itoa、_i64toa、_itow、_i64tow _ltoa、_ltow _ecvt _fcvt _gcvt stringstream strstream
>226 文字? 文字列じゃなくて?
229 :
デフォルトの名無しさん :2005/10/14(金) 09:50:51
文字列です。すみませんお願いします。
230 :
デフォルトの名無しさん :2005/10/14(金) 10:10:17
char*lpszFileName = "_GRAPHSPEC";//アクセスファイル名 char s[100]; sprintf(s,"%s",nTableNo); //FileNameを作成する lpszFileName = strcat(lpszFileName,s); なにか上手くいってないんですけど、なにか見落としてるところ ありますでしょうか?
231 :
デフォルトの名無しさん :2005/10/14(金) 10:11:38
↑nTableNo int nTableNo;
232 :
デフォルトの名無しさん :2005/10/14(金) 10:47:35
ANSI Cでは、文字列リテラル("GRAPHSPEC")を変更した時のふるまいは未定義になっているので lpszFileNameを書き換えてはいけません 書き換えたい場合は配列にするか動的にメモリを確保してください (わかりづらい説明で申し訳ない‥‥リテラル、メモリなどでググってみて) それとstrcatで文字列を連結しなくてもsprintfで連結できますよ あとsprintfの第2引数は%sではなくて%dね
233 :
デフォルトの名無しさん :2005/10/14(金) 11:02:28
char lpszFileName[100] = "_GRAPHSPEC"; //アクセスファイル名(_GRAPHSPECのみ) sprintf(lpszFileName,"%s%d",lpszFileName,nTableNo); ってやってみましたらOKです。ありがとうございます。みなさん感謝。
SendMessageでマウス制御するのにいいサンプルありませんか? 猫を見てもいまいち理解できなかったのですが、、、
235 :
デフォルトの名無しさん :2005/10/14(金) 11:05:27
誤爆には気づいたけどマルチっぽいからやめておいた。
日を改めて書き込むことにするよ
>>235 サンクス
237 :
デフォルトの名無しさん :2005/10/14(金) 11:36:38
>>233 sprintf(lpszFileName,"_GRAPHSPEC%d" TableNo);
_GRAPHSPEC固定ならこの方がいいかもしれません
理由はlpszFileNameを第1引数と第3引数の両方に指定しているから。
lpszFileNameから読み込んだ内容がlpszFileNameに書き込まれることになり、
その動作は保証されていなかったと思う。(でも、ちょっと自信がないので詳しい人フォローを‥‥)
まぁ趣味のプログラム程度なら問題ないんだけどね^^
こんなこともあるんだな程度に‥‥
>>236 誘導されてるんだから、移動する旨、誘導されてきた旨書き添えて書けば問題無いべ
240 :
デフォルトの名無しさん :2005/10/14(金) 17:23:44
すいません、初歩的な質問なんですがfopen関数で読み込むファイルは どこに置いておけばいいのでしょうか? 教えてください。
お好きにどーぞ。
どこでも
ファイル名だけで開きたいなら実行ファイルと同じ場所に置くのが無難
244 :
デフォルトの名無しさん :2005/10/14(金) 18:22:17
int i = 123; int i; void main(){} C++だとエラーになるんですが、Cだとエラーになりません。 何でですか。 明らかにint iの再定義でエラーだと思うんですが
245 :
デフォルトの名無しさん :2005/10/14(金) 22:41:02
-1を入力するとループを終了するようにしたいんだけど、 while( scanf("%d" , &x) != -1 ){ だと-1を入力しても終わらないんだが・・・
あっそ
ネタか。つまらん
>>243 おいおい。実行ファイルのある場所=cwdなんて環境の方が少ないことに気付きたまえ。
250 :
デフォルトの名無しさん :2005/10/15(土) 00:50:21
質問です。 PCの環境変数にPathとかあるじゃないですか? これって色んなアプリでとりあいになってるっぽいんですけど、 これってなんかうまい使い方あるんですかね? 何が問題かというとですね。 後から設定したものに始めに設定したものが消されてしまって、 始めに設定したアプリが動かなくなってしまうんですよ。
PATH=$PATH:/〜〜/〜〜〜 必要なものを付け足していけば良いだけ。区切子':'(コロン)
Windowsなら一箇所にパス通してそこにそれぞれのバッチファイル作っとけば
>>251 それってアプリインストールしたときに勝手にやってくれます?
>>252 えー。もしかして、そんな方法しかないんすか?
ショボーン。
つか、なんでこんな糞みたいなもん使うのか非常に疑問っす。
激しくウザイ。
なんでこんなもん使いたがるのか。>アプリ制作者
というかスレ違いでは?
デスクトップ上のアクティブウインドウに別のプログラムから キー入力を行うにはどうすればよいのでしょうか。 WIN APIとMFCをごっちゃで使っています。 HWND wh = ::GetForegroundWindow(); ::SendMessage(wh, WM_CHAR, 'a', 0); として、メモ帳をアクティブにしても何も表示されません。
あっそ
>>255 GetForegroundWindowで取れりゃ苦労せんわ
>>245 一応マジレス
scanf等の実行文そのものは数じゃないから演算子使っても無駄。
x != -1にしたいなら
while(x != -1){
scanf("%d", &x);
として次のwhile判定で弾く。もしくはbreakを使う。
>259 >scanf等の実行文そのものは数じゃない scanfの返り値はintだけど。 代入に成功した入力項目の数が返される。まあ-1になることはないから>245の例は無限ループだな。
クラスの宣言なのに「識別名の宣言」とか言われる ちゃんと定義してヘッダもインクルードしてるのにヽ(`Д´)ノ
>259 一応マジレス。 読み込み不一致の対策取っとけ。
配列ポインタの配列の領域を確保することは不可能ですか? p = new ((int*)[5])[ncount];
勘違いしてた。ポインタだから4だ..
>>263 typedef int (*ptr_to_array5_of_int)[5];
ptr_to_array5_of_int *p = new ptr_to_array5_of_int[ncount];
absの様な符号付き整数の絶対値を分岐等を使わずに、 intをintの範囲内で簡潔に求める事は出来ますでしょうか。 最上位ビットから論理演算だけでどうにか・・・は無理ですかね。
268 :
デフォルトの名無しさん :2005/10/16(日) 12:30:03
Linux でのはなし。 SIGTERM に自前のハンドラを設定しているプロセスが、stdin を fgets してブロックしています。 このプロセスに SIGTERM を送ると、ハンドラが実行されるのはいいのですが、 fgets が復帰してくれません。 他のI/Oでは signal が入るとEINTRで復帰すると思うのですが、fgets ではそうならないのでしょうか。 signal が入ったら fgets から復帰させるには、どうしたらよいのでしょうか。
>>266 int abs(int n){
int c = n >> 31;
return n+c^c;
}
intが32bitでシフト演算が算術シフトと仮定するとこんな感じ。
そうじゃなかったらint c = -(n<0);にしても同じ。
ようするにcは負数なら全ビットが1、そうでなければ0にすれば良い。
270 :
268 :2005/10/16(日) 12:49:23
自己解決したのかも。 シグナルハンドラの中で fclose(stdin) をしたら、fgets が復帰しました。 が、fgets してる最中に fclose してしまうのってどうなんですかね? 問題無いでしょうか?
>>269 試してみたら確かに結果は正しいのですが、何故なのか解らず、
16進で1ステップ毎にダンプしてみたら、負の数をシフトすると
シフトしたビットは埋まるのですね。 今まで知りませんですた。 orz
有り難うございました。
>>271 >269も書いているが、負の値の右シフトが算術シフトである保証はないので要注意。
274 :
デフォルトの名無しさん :2005/10/16(日) 17:09:32
VisualC++ 7.0 なんですが、環境変数 USERVARというのを想定し、 C++ の コード上から値を設定して、そのプログラムが動作時にその環境変数 をずっと有効(export)していたいのですが、どのようにすれば 良いでしょうか?
int が 36ビット、1の補数+符号ビットで表現されているなら、 int abs(int x) { return x & ~0377777777777; } C言語の定義内で、ポータブルな方法はない。
>>274 どういう形で作っているのか知らないけど、
ダイアログベースやSDI等のGUIベースなら、Appクラスなどにメンバ変数として
持たせるって言う手段があると思う。
>>266 abs() つかえよ。
分岐を使わずに効率よく実装できるなら、コンパイラがそうしてくれるだろう。
>>277 absてlibcだと思いますが、269をインラインかそのまま記述した場合と、
速度的に違い無いんですか?
>absてlibc んなもんコンパイラによる。 標準ヘッダのインクルードをただのスイッチとして扱う処理系だって存在しうる。
>>279 実は単純にif文で書くのが一番速いかも知れない。
パイプラインが深い最近のCPUじゃまずいだろ。
if文を書いたからといって、最適化で分岐が消えないとも限らない。
だれかアセンブラリストうp
(n>0?n:-1*n)
最適化の影響で、ある変数がある範囲内で変更されない事が確認されるとその範囲内ではconst扱いとしもう一段階最適化するコンパイラが存在する その結果 if(n>1){ 処理1 }else{ 処理2 } などと言う文が {処理1}goto out {処理2} out: このようなコードになる可能性がある その最適化を妨げるのがvolatile宣言
妨げるって・・・
288 :
270 :2005/10/17(月) 01:34:47
>>273 stdin は FILE* なので、select とは相性が良くないです。
fd から FILE* のバッファに読み込み済みだと、fread はすぐできても read はすぐできない状況となり、
select は返ってこなくなります。
というか、スレ違いでしたか。
うーん、困った
289 :
デフォルトの名無しさん :2005/10/17(月) 07:27:53
すごく初歩的な質問なんですが、 char * ptr = malloc(1024); の後で free(ptr); をするときにサイズを指定しなくてもきちんとmallocした分が開放されるのでしょうか? たとえmallocとfreeを別の関数の中で呼び出したとしても、ptrがキャストなどで違う型になっていても、いついかなるときでも大丈夫なのでしょうか?
292 :
デフォルトの名無しさん :2005/10/17(月) 09:49:22
先生、質問! printfは遅いと良くききますが、 なぜ遅いのでしょうか?どの程度遅いのでしょうか? printf("%c%c%c%c%c",a,b,c,d,e); と putc(a);putc(b);putc(c);putc(d);putc(e); では、どちらが速そうでしょうか? 文字数が変わると、どう変化してくるでしょうか?
これがゆとり世代と言う物なんだろうか。
294 :
デフォルトの名無しさん :2005/10/17(月) 12:03:07
fprintf()とsprintf()について質問があります。 たとえば、sprintf( string, "%c%c", c1, c2 )とした場合、 stringの三文字目は、必ず、\0になるのでしょうか? そういう仕様が決まっているでしょうか? fprintfについても同様でしょうか?
>>294 sprintfは文字列の最後にNULL文字を追加する仕様になっています。
fprintfは追加しません。
すみません。
>>291 は馬鹿みたいな質問ですが、何とか答えをいただけないでしょうか?
typedef struct aaa {
int x; char y;
} aaa;
として
aaa * ptr = malloc(1234);
のようなサイズで確保した場合でも
void * p = ptr;
free(p);
で正確に1234バイト開放されるのでしょうか?
>>297 ありがとうございます!
いったいどういう仕組でそんなことができるのか不思議ですが、今は信じておきます。
どんなコンパイラでも同様に処理してくれると考えてもよいでしょうか?
299 :
デフォルトの名無しさん :2005/10/17(月) 15:36:08
>>296 その場合の1234バイトが開放される事はYESだが、2つの領域(aバイト,bバイト)を開放した場合、次に(a+b)バイトの領域を確保できるかどうかは不明
型は関係無いのでな
>>298 規格に準拠したコンパイラであれば、そう処理してくれる。
>>299 そうなのですか。例え開放した後でもmallocの後には毎回NULLかどうかチェックしないとダメってことですね。
>>300 >>301 なるほど、納得しました。
しかし、コンパイラは動的確保したサイズは覚えててくれるのに、確保したかどうかや開放したかどうかは覚えててくれないのですね。
面倒ですが、サイズを管理しなくてすむ分は楽だと考えてfreeしまくります!
みなさん、どうもありがとうございました。
>>302 サイズを覚えているのはコンパイラじゃない。
ヒープマネージャが覚えている。
304 :
デフォルトの名無しさん :2005/10/17(月) 15:55:16
g++-2.95ではコンパイルが通らずg++-3.3では通るという現象が起きているのですが、どなたかわかりませんか? 1 #include <iostream> 2 #include <algorithm> 3 #include <functional> 4 #include <iterator> 5 using namespace std; 6 7 template <class T> 8 class MyFirstContainer { 9 public: 10 typedef T value_type; 11 typedef value_type *pointer; 12 typedef value_type &reference; 13 typedef size_t size_type; 14 typedef ptrdiff_t difference_type; 15 //typedef pointer iterator; 16 class MyIterator: public iterator <forward_iterator_tag, T> { 17 typename MyIterator::value_type *vp; 18 public: ... これで、 list4-4.cc:16: parse error before `<' ... のようになってしまいます。 よろしくお願いします。
新しいバージョンで通るなら、 コンパイラのバグが修正されたってことじゃね? とソースも読まずにレスしてみる
”このXは100です”と表示させようとしましたができません。 どこを修正したらいいですか? よろしくお願いします。 #include <stdio.h> int main(void) { char ch; int num; ch = 'X'; num = 100; printf("この %c は", ch); printf(" %d です", num); return 0; }
>306 ありがとうございます。 Xをxにしたらきちんと表示されました。 X(2バイト以上)を代入して表示させたい時はどうすればいいですか?
wchar_t
310 :
デフォルトの名無しさん :2005/10/17(月) 19:07:59
>>308 マルチバイト文字列を使うか、ワイド文字を使う
311 :
デフォルトの名無しさん :2005/10/17(月) 19:21:57
再帰処理はスタックを消費するんでしょうか? だとすると、いずれスタックオーバーフロー?
312 :
308 :2005/10/17(月) 19:30:34
>>309 >>310 ありがとうございます。
ググってみても使い方も分からずまだ理解不足ですが、ひとまずscanf()などの先のステップに進んでみます。
>>304 確かなことは言えないんだけど,
g++-2.95のときはクラステンプレート内のサブクラスの定義で
テンプレート使ったら理不尽なエラーが起こっていた.
あと,クラステンプレート内でメンバー関数テンプレートなんか
使うときもエラーの回避に苦労したような記憶がある.
315 :
デフォルトの名無しさん :2005/10/17(月) 19:57:24
質問です。 Cを想定していますが、別のアプローチがあるならC++でも構いません。 何らかの仕事をし、その結果が成功か失敗かを取得したいとします。 このとき戻り値はどのように設計するのが適切でしょうか? 状況次第というのはごもっともだと思いますが、参考としてだけでも。 私は、以下のように考えました。 (1)成功なら1、失敗なら0を返す (2)成功なら0、失敗ならエラーの内容により非0(正の数)を返す (3)成功なら0、失敗ならエラーの内容により非0(負の数)を返す 条件式に使用することを考えると(1)が楽っぽいのです。 この場合、関数名は IsHoge 等にするべきでしょうか? ただ、それだと値をチェックしてるだけで実際の仕事はしていないようにも見えてしまいます。 (2)や(3)だと、成功したら0なのか、失敗したら0なのかが分かり辛そうです。 (1)のように分かり易い命名法があれば別ですが…。 # 同じ質問をJavaでもしたかったりするのですが、 # さすがにスレ違いかマルチポストは避けられませんよね……
CならTRUEとFALSEを定義しておけばいいんじゃないか? C++ならboolを使うなりクラス内で静的定数でtrueとfalseを定義するとか。
>>315 (1)か(3)が一般的だろうね。
何かのハンドルを返す関数であれば、
失敗時にNULLを返すという意味で(1)にするのが適切だと思うけど
ただエラーコードを返すだけならば(3)でも構わないと思う。
if (DoSomething() < 0) { // error
のような仕様はよく見かけるし。
関数名は特にIsをつける必要はないかと。
>>315 時によりけり。
それだけでは決めかねる。
# とりあえず、IsHoge なんてネーミングはナンセンスだと思われ
319 :
315 :2005/10/17(月) 20:18:43
他のスレを見ているうちに早くもレスが!
ありがとうございます。
とりあえず分かったのは、
適切なコメントやドキュメントが大切ということでしょうか。
>>316 それって(1)と何か違うのでしょうか?
>>317-318 値をチェックするだけなら IsHoge でもOKってことですよね?
その値がHogeであるかどうか、ならIsHogeでいいと思うけど、 Isをつける場合はエラーコード等は返さず、trueかfalseのみを返した方が直感的。 エラーコードを返す場合は別の名前にした方がいいと思われ
>>319 >それって(1)と何か違うのでしょうか?
0を返すか1を返すかなんて内部仕様。
TRUEやFALSEを書いとけば動くコードにしとけば
後で気が変わっても今までのもちゃんと動く。
322 :
315 :2005/10/17(月) 21:53:08
なるほど、何度もありがとうございました。
323 :
デフォルトの名無しさん :2005/10/17(月) 21:58:57
微妙にスレ違いだったらすいません どこが適当かイマイチよくわからなくて… 「DirectXゲームグラフィックスプログラミング」という本で勉強しているのですが ヘッダファイルに #ifndef _Common_h_ #define _Common_h_ (中略) #endif // _Common_h_ とされているのですがコレらの意味はなんでしょうか? 重複して読み込まないため?とも思うのですがハッキリした答えがわかりません どなたかアドバイスお願いいたします
>>323 >重複して読み込まないため?とも思うのですが
そのとおり.
通称インクルードガード
>>324 ありがとうございます!
今まではCommon.hに全てのヘッダファイル読ませてましたのですが
それだと無駄なものまで読み込んでしまうので何か無いかと思ってたトコロでした
# インクルードガードってなんとなくカコイイ響きですね
326 :
315 :2005/10/17(月) 22:50:26
コンパイラによっては、#pragma でインクルードガードができたりするっぽい。 #ifndef は、既にどこかで定義されていたら読み込まない、という意味なので 1回目にヘッダを読み込んだとき (1) _Common_h_ が定義されていないので普通に読み込む (2) _Common_h_ を定義する (3) 本文を読み込む (4) ファイル末尾で読み込み終了 となるが、2回目以降は (1) _Common_h_ が定義されているので #endif まで飛ぶ (2) ファイル末尾で読み込み終了 となる。
*おおっと* 名前が残ったままだったぜ!
#pragma once だな VCのコンパイラとかこれが使える
個人的にはそんな環境依存なもの使わないけど
VC++前提のソースはよく#pragma onceとインクルードガードの 両方を使っている。 一体何がしたいんだろう……
VC++では#pragma onceでより高度にガードして、、 他のコンパイラではonceを無視してくれることを祈りつつ従来のガード?
>>330 #pragma onceだったらヘッダの読み込みをそこで中断できるから、
インクルードガードと比べて高速になるから。
ただ#pragma onceのない環境も考慮してインクルードガードもついでに付加してる......かな?
333 :
デフォルトの名無しさん :2005/10/18(火) 00:34:41
#ifndef _Common_h_ #include "Common.h" #endif
・グローバルスコープで_で始まる名前 ・_で始まりその次が大文字の名前 ・__を含む名前 は予約されてるから_Common_h_みたいなのはイクナイ
>334 Javaのパッケージ名はFQDNを逆にしたものが推奨されているようだけど (com.example.hoge など) C/C++でもそのようにしたほうがいいのかな? (#ifndef COM_EXAMPLE_HOGE_XXX.H みたいな感じ)
カレントディレクトリからインクルードされる前提なら ファイル名にヒネリを加えた名前でいいと思う。 その前提がない場合はUUIDを使うんじゃないかな。
>>331 VCが吐くpragma onceを入れたヘッダファイルは、
ちゃんとその前後をVCのコンパイラだということを判別する#ifdef〜#endifで囲んである
他コンパイラで読み込めばそこは飛ばされるだけ
>>335 ファイル名がhoge.hだったら
#ifndef ___HOGE_H_DEFINED_AND_INCLUDED_
ってしてる
こんな感じでちょっと捻っただけでええと思う
バカは質問に答えなくていいと思う
真の馬鹿とは自分が愚かだという事すら自覚していない馬鹿だ
数万個ある要素(std::string)の中から、ある文字列を含む要素を検索する 効率のいい方法って無いですかね? かなり高い頻度で検索するので、各要素を順番に_mbsstrで調べていくのは効率が悪いと思いました。
まぁなんだかんだ言って被った事は一度もないわけで。
>>342 std::set or std::map
>>344 それじゃ「ある文字列を含む」ではなく「ある文字列と一致する要素」しか探せない希ガス
347 :
342 :2005/10/18(火) 13:18:21
>>346 それはシーケンシャルに検索するのと変わらない気がするのですが・・・
>>342 メモリ消費にある程度融通が利くならSuffixArray(もしくはSuffixTree)を使うといいんじゃまいか?
文字列集合全体に対してSuffixArrayを作り、各インデックスとペアで所属するstringへのポインタなりを格納しておけば
全体で数千万文字あっても20〜30回程度の探索で含まれている部分を見つけることができるはず。
349 :
342 :2005/10/18(火) 13:26:14
>>348 良さそうですね。ちょっと調べてきます。
double型をint型にしたいのですが何箇所かでうまく出来ません。 どうすればいいのでしょうか? #include <stdio.h> int main(){ int i,j; double a; for(a=0.0,j=0; a<10.0; a+=0.1,j++) { i=(int)a; if(j==10){ printf("%f %d \n",a,i); j=0; } } return(0); }
353 :
デフォルトの名無しさん :2005/10/18(火) 14:55:38
>>351 double型は制御変数に使うべきでは有りません。
354 :
351 :2005/10/18(火) 16:35:16
こんな感じになってしまいます。
1.000000 0
2.000000 2
3.000000 3
4.000000 4
5.000000 4
6.000000 5
7.000000 6
8.000000 7
9.000000 8
10.000000 9
>>353 実際のプログラムでは使っていません。
状況を再現するのにやりやすかったので使いました。
コメントも何もついてないソース晒して問題となった「状況」とやらを 勝手に察しろというのがばかげてるって分かってる?
i=(int)a; → i=(int)(a+0.5);
358 :
デフォルトの名無しさん :2005/10/19(水) 00:41:20
プログラムを実行したら、起動中のテキストやワードなどに、指定しおいた文字や数字を 入力するプログラムを作りたいのですが、できますか?
できますよ
360 :
デフォルトの名無しさん :2005/10/19(水) 00:45:42
>>359 どのような 方法でやればいいのか教えてください
テキストやワードというのが何のOSで動いていてどんな動作をするアプリなのかわからんけど とりあえずその起動中のテキストやワードを作った人と連絡を取って プログラムからの入力方法を聞いたらどうかな winでならSendMessageとかで送りつければ出来るけど
>>360 VBでやれば5分もあれば作れる。ODEについてくる開発ガイドを読め。
どうしてもVCでやりたいと言うならまずMFCかATLの経験はあるか?
>>361 よく「テキスト」と「ワード」がアプリの名前だってわかったな。
オレには全然わからなかったぞい。
srand(0)とsrand(1)はおなじ結果を返すのでしょうか? srand(1)とsrand(2)は違う結果になるのですが、srand(0)とsrand(1)はおなじ系列を返します。 それともコンパイラのバグでしょうか?環境はgcc4.0.2、Suse Linux9.2です。
ワードはまぁ、MSWordか?って思うが、テキストってなんだ? MaxOSのシンプルテキストか?
MaxOSってなんだよ俺 MacOSだろ・・・
>>365 違う引き数で同じ系列を返してはいけないという仕様はなかったと思う。
srand()を呼ばない場合はsrand(1)と同じ系列を使う実装が多い筈なので、
srand(0)とsrand(1)が同じ系列になるのかもしれない。
「起動中のワード」→「起動中のMS Word」かな 「起動中のテキスト」→痛々しいな
370 :
デフォルトの名無しさん :2005/10/19(水) 13:10:01
やっべ脳内で勝手にテキスト→エクセル変換してた
テキストエディタ(メモ帳)だとおもってたけど・・・
変な人気を獲得した361
テキサスかと思った
#include<stdio.h> #include<string.h> main(){ char kekka[5]; char str[40]; printf("【おみくじ】"); getchar(); strcpy(kekka, "大吉"); strcpy(str, "充実した一日。いろいろな所に遊びに行こう"); printf("%s:%s" , kekka, str); return 0; } こんなプログラムを書いたのはいいものの、"大吉"が出力されない。 他の英数字ならできたんだけど、何が悪いんだろう。
ワイド文字とかマルチバイト文字専用の文字列コピー関数を使え。
>>374 とりあえずstrの領域が足りないな。
char str[41]
にしてみそ。
>>375 ,376
ありがとう、無事解決。これで毎朝、大吉しか出ない占いプログラムが鬱な俺を勇気付けてくれます。
毎日いろいろな所に遊びに行くのか
えらくネガティブな勇気付けだなおい・・・
he,he,he.....も、もう。さがさないで、ください。
C++相談室 part44 スレで質問したら、こちらに誘導されましたので こちらにコピペさせていだだきます。よろしくお願いします。 激しくレベルが低い質問でとても恥ずかしいのですが教えてください。 Linuxでアプリケーション作っているんですけど、そのアプリケーションの 設定ファイルをそれぞれの一般ユーザーのホームディレクトリに作りたいと 思っています。プログラム自身は/usr/local/binに置くつもりです。 ofstream fout("hogehoge.txt"); でファイルを作ると実行ファイルと同じ場所に出来てしまいます。 というか、/usr/local/binではパーミッションで作れません。 ホームディレクトリはどのように指定してやればいいのでしょうか。 教えてください。お願いします。 FedoraCore4でフルインストール、フルアップデートな状態です。
./hogehoge.txt
>>382 素早いレスありがとうございます。今試してみたのですが、
それだとカレントディレクトリにhogehoge.txtが出来てしまいます。
ごめん こんなこと聞くのはダメな証拠なのですが GUIのツール・ソフトウェアを作るのに、最適なツールとか開発ソフトってなんでしょうか おすすめなのを教えてください 小さなアプリとか、そういう類。で、どんなアプリやツールにはどの言語がいいかとかおながいしまつ
ああ、ホームディレクトリか。間違えた ../hogehoge.txt
あ、間違えた。これも違う気がしてきた。 つかわすれてしもた。タッチノ
環境変数HOMEを取得すりゃええんちゃう つman getenv
応えてくれませんよね…どういっていいのかわからないので スレ立てるまでもないにも質問いってきます
>>387 getenv("HOME") で取得出来ましたありがとうございました。
マルチすんなやクズ
すんまそん
こんばんは。質問させてくださいませ。 当方C++でGSLを使っておりまして、GSL_blasを使って、行列計算をしてみたのですが、 500×500の正方行列同士の積にかかる演算時間が1回当たり1.5〜1.7秒と芳しくありません。 GSLを用いずにfor文を用いて同じ演算をやらせても同じような結果が出てしまいます。 通常、このくらいのサイズの行列の演算にはどのくらいの時間を要するのでしょうか? 先ほど、Cの方の質問スレに載せてしまい、マルチになってしまうのですが、どうか教えてくださいませ。 よろしくお願いします。
>>392 質問が曖昧すぎ。
ハードウェアは何使ってるの?そのスペックは?コンパイラは?
395 :
392 :2005/10/20(木) 11:41:25
>>393 FreeBSDでCPUはathlonXP、コンパイラはG++で-O2をかけてあります。
ほかの事に関してはちょいと分からないかも・・・
longの範囲を越える値の四則演算ができるようなクラスってある?
398 :
デフォルトの名無しさん :2005/10/20(木) 13:12:37
#include<stdio.h> void mystrcpy(char *, char *); void main() { char cstr[50], str[]={"leafsaasin-"}; mystrcpy(cstr, str); printf("%s\n" "%s\n", str, cstr); } void mystrcpy(char *csp, char *sp) { int n=0; while(*(sp+n) != '\0'){ *(csp+n) = *(sp+n); n++; } *(csp+n) = '\0'; } 上記のプログラムのmystrcpy関数を一行で書けるというのですが どのようにすればいいでしょうか。
// はい、一行 void mystrcpy(char *csp, char *sp) {int n=0; while(*(sp+n) != '\0'){*(csp+n) = *(sp+n); n++;} *(csp+n) = '\0';}
>>399 while ( (*csp++ = *sp++) != '\0' );
でいいのかな
402 :
396 :2005/10/20(木) 13:54:55
403 :
394 :2005/10/20(木) 14:35:50
Linux 2.6.11 Pentium III (Coppermine) 853.308 Hz g++ (Debian 1:3.3.5-13) -O3 -march=pentium3 -msse -mfpmath=sse -fforce-addr -fomit-frame-pointer liboctave,atlas使って0.47089秒くらい
404 :
392 :2005/10/20(木) 14:37:10
>>398 すいません、計算回数の算出はどうすれば出来るのでしょうか?
406 :
デフォルトの名無しさん :2005/10/20(木) 14:59:33
>>404 for文使ってる方は何回回ってるか判るでしょ
O(N^3)ぐらいじゃね?
408 :
デフォルトの名無しさん :2005/10/20(木) 15:03:53
409 :
デフォルトの名無しさん :2005/10/20(木) 15:11:33
配列の内容をCSVで書き出すとき、下のように書いてるんですが、 もっと簡単にスマートに書く方法はありませんか? std::string* a = new std::string[3]; a[0] = "foo";a[1] = "bar";a[2] = "buz"; for (int i = 0; i < 3; i++) { if (i != 0) std::cout << ","; std::cout << a[i]; } std::cout << std::endl;
expression templateで効率化するんだ ・・・と内容読まずにレスってみる
>>409 3固定なら
cout << a[0] << "," << a[1] << "," << a[2] << endl;
n なら
if (n){
cout << a[0];
for(int i=1; i<n; ++i) cout << "," << a[i] ;
cout << endl;
}
てきとうだけど
412 :
409 :2005/10/20(木) 16:05:41
>>411 なるほど。
やっぱり最初の項目だけ特別扱いしないといけないんですか。
質問です。 とあるクラスAと、それを継承したBを作ったのですが class A{ void operator =(A&); }; class B : public A{ void operator =(A&); }; とやり、メインスレッドで B b1, b2; b1 = b2; とやったところ、何故かBのoperator=(A&)ではなく、Aのoperator=(A&)に飛んでしまいました。 これは何故なのでしょうか。
>>409 char *a[N] = { /* ... */ };
char *div = "";
int i;
for( i=0; i<N; i++,div="," )
{
printf( "%s%s", div, a[i] );
}
だったら const static char punct[] = ",,\n"; for (i = 0; ry { fprintf(stdout, "%s%c", a[i], punct[i]); } fflush(stdout);
>>409 aをvectorか配列のラッパテンプレートクラスにして,
std::copy(a.begin(), a.end() - 1, std::ostream_iterator<std::string>(std::cout, ","));
std::cout << *(a.end() - 1) << std::endl;
ってのは?
417 :
416 :2005/10/20(木) 17:25:51
オレはバカか.修正. std::copy(a.begin(), a.end() - 1, std::ostream_iterator<std::string>(std::cout, ",")); std::cout << a.back() << std::endl;
プロセスIDから、そのプロセスの実行ファイル名を知りたいのですが、うまく行きません。 ファイル名を知るには、どうしたらよいでしょうか。 OS:Windows Xp Pro SP2 コンパイラ:Borland C++ 5.5.1 #include <stdio.h> #include <windows.h> void main(void) { HANDLE hProcess; char fileName[1000]; /* 第三引数は、タスクマネージャで見つけた notepad.exe の PID */ hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 3644); GetModuleFileName(hProcess, fileName, 1000); printf("ハンドル:%d\n", hProcess); printf("ファイル名:%s\n", fileName); CloseHandle(hProcess); } ソースファイル名 getName.c コンパイル時のコマンド >bcc32 getName.c 実行結果 ハンドル:2000 ファイル名:タ・
420 :
418 :2005/10/20(木) 19:12:37
printf("GetMFN:%d\n", GetModuleFileName(hProcess, fileName, 1000)); 上記のように書き換えてみると、 GetMFN:0 と表示されました。 notepad.exeのファイル名の取得に失敗しているようです。 また、notepad.exe以外の実行ファイルのPIDを試したところ、 以下のような規則性がありました。 「プロセス」の「ユーザー名」が SYSTEM の場合 GetMFN:35 ハンドル:0 ファイル名:D:\mydata\C\新しいフォルダ\getName.exe 「プロセス」の「ユーザー名」が ログインユーザ名 の場合 GetMFN:0 ハンドル:2000 ファイル名:タ・ 管理者、制限ユーザ両方でログインしてみましたが、結果は同様です。
>>420 GetModuleFileNameが失敗する原因をGetLastErrorで調べてみた?
422 :
418 :2005/10/20(木) 20:12:14
以下の2つの処理それぞれの後ろに、FormatMessage(……GetLastError()……)を挿入しました。 hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 1472); 1箇所目…… GetModuleFileName(hProcess, fileName, 1000)); 2箇所目…… 「プロセス」の「ユーザー名」が SYSTEM の場合 アクセスが拒否されました。 この操作を正しく終了しました。 「プロセス」の「ユーザー名」が ログインユーザ名 の場合 指定されたプロシージャが見つかりません。 この操作を正しく終了しました。 OpenProcess()が失敗しているようです。 タスクマネージャで見たPIDをそのまま打ち込んではいけないのでしょうか。
423 :
399 :2005/10/20(木) 20:25:55
>>401 返答ありがとうございます
試してみます。
>>412 最後の項目を特別扱いすればいいじゃん。
for (int ic = 0; ic < cols; ++ic) {
std::cout << a[ic] << ic == cols - 1 ? '\n' : ',';
}
ポインタを戻り値とする関数で 特定の条件を満たさない場合はポインタを返さず エラーで終了させたい場合はどうやるのが一般的でしょうか? Test* func(int a) { if(a==5) return p; } だとビルド時に戻り値がないと警告がでてしまいます
0返したり例外投げたり
0を返して関数を呼ぶ時に処理をするというコトでしょうか? if(!func(4)) return ;
>>422 MSDN嫁。PROCESS_ALL_ACCESS権限で他プロセスのハンドルを得るには
SeDebugPrivilege特権を得ておく必要があると書いてある。
GetModuleFileName()にしかハンドルを使わないのなら、
PROCESS_QUERY_INFORMATION程度で十分なんじゃないか?
>>425 "エラーで終了させたい" って何をどのように終了させるんだか?
関数を終了(return)するだけなら、0(NULL,正常なポインタでない値)を
返して上位でエラー処理、とか、プログラム自体をここで強制終了
したいなら必要な終了処理を呼び出した後に、exit(1) とか?
一般的ったって、目的必要に応じてだから、質問下手すぎ。
>>425 Cなら単純にexit()してもいいかもしらん。
C++なら素直に例外を投げるのがよい。
>>425 どちらにしても、戻り値を返す関数は、戻り値を返さないわけにはいかない。
どの場合でも(exitなど制御を飛ばすものはともかく)表記上は必ず戻り値を
返すように記述する必要があるのは当然。
432 :
418 :2005/10/20(木) 22:37:28
433 :
392 :2005/10/20(木) 23:07:05
>>406-407 遅レス申し訳ないです。
>>407 さんのとおり、計算回数はO(N^3)(500^3)だと思います。
for文の中では掛け算を500^2回実行している事になります。
どうにかして、もうちょっと早く動かす事は出来ないのでしょうか?
多少ループをエンロールしてみるとか。
435 :
392 :2005/10/21(金) 00:49:35
>>434 ループの一部を関数として登録するという事でしょうか?>エンロール
アンロールじゃないのか。
>>435 for(i=0; i<MAX; i++){処理;}だと1回ごとにforの条件判定が来るがfor(i=0; i<MAX; i+=2){ 処理;処理; }だと2回に1回forの条件判定が来る
これをfor(i=0; i<MAX; i+=100){ 処理; ... 処理; }とするとforの条件判定が100回に1回になる
これがエンロール
unroll
>>437 そうやってCPUのキャッシュをだめにするのが速くする秘訣か。
それを言うならアンロールじゃないかと。
エンロールじゃないねアンロールだったすまそw
>>439 キャッシュのミスヒットが起きると性能落ちるから1次キャッシュいっぱいまで広げるのがミソ
キャッシュのアラインにあわせてループの展開回数を調整する必要があるがまあそこまでやらないでも条件判定が減るだけでもだいぶ違う
Pentium4用に最適化かけるのとXeon用に最適化かけるのとではコードサイズに差がでる
442 :
434 :2005/10/21(金) 01:25:35
すまん。エンロールとアンロールを素で間違えた。
そういうのは正直バッドノウハウだと思うんだ。
データキャッシュだけならそうかもしれないけど命令キャッシュの方忘れてない? 例えばPrescottだと命令キャッシュは実行トレースだからキャッシュに収まるように 工夫するのにμOP考えないといけないから無理だと思うよ。
>>443 ではグッドノウハウとやらをお願いします。
446 :
デフォルトの名無しさん :2005/10/21(金) 01:36:17
こんばんは とある駐車場の駐車料金の計算をするのにプログラム組みたいのですが 色々わからないとこあるので教えてほしいです。 まず、そこの駐車場は 1日の駐車料金の最大料金が 平日1500円 土日祝日1200円で当日最大ではなく毎日適用。 時間料金が曜日時間関わらず 15分100円(1時間400円) つまり、平日だと駐車時間が3時間30分を超えたあたりで1500円でそれ以上料金はあがらない。 という料金設定です。 で、組みたいのが 入庫時間(月日時分を続けて入力 例:10月21日1時30分なら 10210130) と出庫時間(上記同様) を入力すると駐車料金が表示されるのを作りたいのです。 コンパイラは MS Visual C++ 2003 一応、C++でコンソールアプリケーションとして作りたいのですが OSの時計機能から時分と取り込んだりして祝日などの判別もしてみたいのです。 どうふうにすればいいのか よろしくおねがいします。
そこまで言葉にできるならそのまま式立てるだけだと思うよ。
>>444 というか、条件判断のコードが出てこなくなるから単純にキャッシュのミスヒットや分岐予測をする必要が無くなり
その結果としてパイプラインのストールも減る
したがってNetBurstなんかでも有効
まあ、この辺は最近はコンパイラが最適化として考えてくれるんだっけ?
>445 そういうので処理速度を少しでも縮めようと可読性の低いコードを量産するよりも 律速になっている部位を特定してそこのアルゴリズムを改良する、あるいは設計を見直す これでいいですか
数値計算の世界では若干可読性が落ちても 本計算の際には計算時間が短くなるほうが良いコード いわゆる、通常アプリケーションとは少し考え方が違う
>413 b1 = b2; で呼ばれるのは暗黙のB::operator=(B&);
条件分岐で必ずストールするわけじゃないし、単純なfor文でのループなら ストールするのはほとんどの場合ループを抜ける時だけ。 むしろ実行トレースキャッシュに収まらなくて毎回トレースキャッシュミス起こす方が コストが高くつくと思うけど。
>>449 それは、今回のバッドノウハウと指摘した物に対比した場合、
グッドノウハウと呼べるほど具体的なものでは無いような気がしますけど。
俺の気のせいですかそうですか。
まぁいいんでない?それで満足なら。
>>452 どうなんだろうね?NetBurstにはV-Tune掛けろとしか言い様が無いな
VC++.NETについての質問です。 this->items(これはArray何とか型)->Clear(); でthisによってitemsという変数を引っ張って来るのは分かるのですが そこからArray何とか型(失念してしまいました)::Clear();となりitemsの中身が クリアされるのは何故なのか分かりません。 どういった処理がここでは行われているのでしょうか?
>どういった処理 itemsの中身をクリアする処理に決まってるじゃんか
457 :
デフォルトの名無しさん :2005/10/21(金) 07:09:36
すいません言葉足らずでした。 items(これはArray何とか型)->Clear(); の結果 Array何とか型(失念してしまいました)::Clear(); に何故なるのかという事です。申し訳ないです
下げ忘れました(涙 すいません
そのArray何とか型にClearってメソッドがあるんだろ。
定義したはずのクラスが定義されてないことになっていて 派生できないのですが、なぜかわかりますか? #ifndef COMMAND_WINDOW_H #define COMMAND_WINDOW_H #include <afxwin.h> class CCommandWindow { public: CCommandWindow() {} virtual void Main() = 0; void Draw(); }; #endif // COMMAND_WINDOW_H #ifndef GAME_SELECT_WINDOW_H #define GAME_SELECT_WINDOW_H #include <afxwin.h> #include "CommandWindow.h" class CGameSelectWindow : public CCommandWindow { // ここでエラー public: CGameSelectWindow() {} CGameSelectWindow(int x, int y); virtual void Main(); }; #endif // GAME_SELECT_WINDOW_H
>>455 itemsを仮にCitems型と仮定して
下二つの文のやってることは同じ
this->items->clear();
↓
Citems* items = this->items;
items->clear();
>>460 とりあえずヘッダ内の宣言だけはコンパイル通った。
void CGameSelectWindow::Main()
を定義してないものをコンパイルしようとした。
StdAfx.h,CommandWindow.cpp,CGameSelectWindow.cpp
その他の*.h,*.cppのインクルードファイルをミスった。
を予想。
>>460 Main()は派生クラスで定義してあります
ファイル名は何度も確認したので間違ってないと思います
空のプロジェクトで作ったのでstdafx.hはありません
今コンパイルしたら意味不明なエラーがいっぱい出てきた・・・
enum {
SPADE = 1, CLUB, HEART, DIAMOND, JOKER, BOTTOM
};
// error C2065: 'CLUB' : 定義されていない識別子です。
// error C2065: 'HEART' : 定義されていない識別子です。
// error C2065: 'DIAMOND' : 定義されていない識別子です。
// error C2065: 'JOKER' : 定義されていない識別子です。
// error C2065: 'BOTTOM' : 定義されていない識別子です。
(今定義してるのに)
// error C2143: 構文エラー : ';' が '{' の前にありません。
// error C2143: 構文エラー : ',' が '}' の前にありません。
(全ての{}にエラー出してるらしい)
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
// error C2275: 'UINT' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。
(使用してない)
こんな感じで140ほど
>>460 =463
派生クラスのMainからvirtualを取れ
466 :
デフォルトの名無しさん :2005/10/21(金) 13:26:26
IHTMLDocumentインターフェースを使いたいんですが、どうすればいいでしょうか 「未定義のシンボルIHTMLDocument」っていうコンパイルエラーが出ます C++Builder使ってます
467 :
466 :2005/10/21(金) 13:43:15
#include <mshtml.h> でした
新しくプロジェクトを作って最初からソースを書いたら
おかしなエラーは出てきませんでした。継承も問題無くできました
ソースの書き換えとコンパイルしかしていないのに、
突然
>>463 のように意味不明なエラーが大量に出てきました
ソースをエラーが出る前の状態に戻してもエラーは消えませんでした
もうコンパイラのバグとしか思えません
こういう症状に心当たりはありませんか?
winxphomeSP2、vc++.net2003です
470 :
463 :2005/10/22(土) 08:25:26
>>469 その新しいプロジェクトのファイル構成を全部挙げてみろ
どうしてもコンパイラのせいにしたがるんだよなぁ。 頭悪いとしか言いようがない。
エラー出て当たり前だな。 コンパイルの流れを追ってみろ。 まずMyMenu.cppをコンパイルする時にインクルードされる順番は MyMenu.h ・・・(1) StdAfx.h CommandWindow.h→Draw.h→MainFrame.h→CardGame.h→MyMenu.h ここでCardGame.hからMyMenu.hをインクルードして安心しているようだが (1)でインクルードガードが既に発動していて中身は読み飛ばされる。 しかも(1)でも内容は読み込まれる前。 コンパイラがCMyMenuを把握するタイミングなぞないよな?
>>473 キミたぶん、この新しいプロジェクトと前のプロジェクトは同じ構成と思ってるんだろう
そうでないと、コンパイラのバグとか思うわけもないからな
ハッキリ言う、同じ構成じゃない
前のプロジェクトは、必要なファイルが作られてなかった
だからエラーが出てるんだよ
476 :
463 :2005/10/22(土) 09:14:50
>>474 インクルード先の読み込みが終わったら
インクルード元に戻ってくるんじゃないんですか?
関数の呼び出しみたいに
MyMenu.hの最初の別ヘッダの読み込みが終わったら
下の内容が読み込まれるんじゃないんですか?
何もかも、バカすぎる 悪いことは言わん、もっとVC++でのプログラムの仕方を勉強してから出直せ 空プロジェクト作って1から自作するには早すぎる
stdafxの役目とか使い方とかプロジェクトの設定の仕方とかその他の構成の仕方とかまったくわかって無いなこいつ
なんか呆れてきたが
>>476 > インクルード先の読み込みが終わったら
> インクルード元に戻ってくるんじゃないんですか?
> 関数の呼び出しみたいに
読み込みじゃなくて一つのファイルに展開するようなモンなんだが。
MyMenu.hのインクルードより下の内容が読まれる前に
CardGame.hで未定義の識別子CMyMenuが出てくるでしょ?
CMyMenuが未定義になるのは、CardGame.hでMyMenu.hをインクルードしていても
そもそもCardGame.hがMyMenu.hからいつくかのヘッダーファイルを経由して
呼び出されているわけだから、既にMY_MENU_Hが定義されていて
その時のCardGame.hからはインクルードガードで中身が見えない。
~~~~~~~~~
処理系依存になっていいなら#pragma onceでも使え。
480 :
463 :2005/10/22(土) 09:39:40
原因がわかりました 確かに順番通り見ていくとCMyMenuの定義が済む前に使用してます #pragma onceでも使ってみます 教えてくれてありがとうございました
なんとなく、「納得はしてないが取り敢えず返事しておくか」という不承不承な感じのするレスだな。
そりゃまあ初心者歓迎を謳いながら、頭悪いとか馬鹿とか叩けばそうなるわな。
>>480 気にするなよ。
慣れないうちは誰でもそんなもんだ。
初心者と無能者を同列に考えるなよ
進めよさらば与えられん
bccでライブラリを作るにはどうすればいいですか
ぐぐれ、じゃだめ?
と試しもせずに言っている阿呆が居ります
filenoでfdは取れるけど、そもそもstdioみたいなバッファリングIOと selectは相性が良くないって話だろ 常識だぞ
int a = 123; sizeof(a); と int a = 123; sizeof(int); って全く等しいのですか
Yes
>>491 いいえ、前者と後者では括弧を省略できるかできないかの違いがあります。
>>493 それは「いいえ 'a' と 'int' が違います」と言うようなもんだろ。
と、答えられない奴がしゃしゃり出てきて無駄なレスをしましたとさ。
>>491 とにかくsizeofの結果は同じになる。
ちなみに構文上、sizeofに指定するのが型名でない場合はsizeof aと書ける。
C++のインライン関数についての質問です。 inline void func() { ... } という関数があり、何カ所からか利用され、ある程度インライン展開されているのは確認しています。 この関数を、さらに関数テーブルでのアクセスにも利用したいと考えております。 void (*pfunc)() = func; このようなコードを埋め込むと、その他の参照箇所のインライン化まで阻害してしまうのでしょうか? 別途funcの実体を用意し、その他のインライン展開に影響は与えないように最適化されるのでしょうか。 一般的なコンパイラの実装の場合で構いませんので、ご教授いただきたく(´・ω・`)
>>500-501 素早いレスありがとうございます。
かなり実行速度にシビアな環境なので、本来ならばマクロやらで強制展開させるべきなのでしょうが
可読性やその他もろもろを考えると、、、というところで悩んでいました。
とりあえずこのまま行けそうなことが分かり安心いたしました。
ありがとうございました。
「おそらく」で安心できるもんなの?
ふつー後者。
FILE*型が示しているファイルのサイズを知るにはどうすればいいのですか
>>505 標準の範囲でやろうとするならば
int size;
fseek(fp, 0, SEEK_END);
size = ftell(fp);
ただし確実ではないので、出来ることならシステム固有のAPIを使うべき。
>>505 ファイルサイズが2GBを超える場合、>506の手法は使えない場合が多いので念のため。
508 :
デフォルトの名無しさん :2005/10/25(火) 15:16:51
引数に構造体を含む関数を作るときに、 その引数をポインタにするか参照にするかでいつも迷うんですけど、 皆さんはそこら辺はどうしてるんですか?
>>508 基本的には参照。
NULLを渡す可能性がある場合はポインタ。
構造体はコピーできんかったっけか?
不必要なテンポラリを避けるためにも普通は参照かポインタで渡すなぁ
○ンポラリ
>>508 [in]パラメータは参照
[out]、[in,out]パラメータはポインタ
514 :
508 :2005/10/25(火) 16:19:55
[in]パラメータは一応constにしといた方がええんじゃね?
あるポインタから別のポインタまでのアドレスに格納されてる値を取り出すにはどうすればいい?
1BYTEずつ読めば?
普通に取り出せばいい。 何がわからないのかわからない。
あぁちなみに、その2つのポインタの間が確実に使用されているんじゃないならヤメテオケ
言葉足らずでした。 あるポインタから別のポインタまでのアドレスに格納されてる値の全てを配列に格納したのですがどうすればいいですか って事です。 繰り返し文使わないと駄目ですかね
したの? じゃあもういいんじゃね? したいの? じゃあmemcpyでも使えば?
>>521 ありがとビーム}!!!!!!!!!!111111111^^^^^^^
>>520 C++ならstd::copyとか使うほうが良いかもしれない。
ファイルに X Y Z X Y Z … X Y Z っていう座標があるんだけど、これを比較するのだけど 1行目読み込んでから、下の行全部比較して 次は2行目から下の行を比較っていうのやるにはどうすりゃいいのかな 行単位で指定して、数値型で読み込むのってどうやったらいいのかわかんなくて
>>524 全部メモリに読み込んでから処理したら?
それはテキストファイルなのか?
>>525 メモリが足りなくなるほどの行数なので
順次比較してメモリを消費しない方向でやりたいのです
>>526 テキストファイルです
ファイル操作で、何行目から読み込むとかそういう指定が出来ないのかと…
>>527 メモリが足りなくなるほどの行数ってどれくらいよ。
実際にやってみもしないうちから足りない足りない言うのは阿呆だよ。
100万〜1000万の行で、配列に入れようとしてメモリがぶっ飛びます
・・・・
1BYTEずつ読み出して、改行コード来たら停止すれば?
fgets使うってことですか? fgetsとかだと、1行単位で読み込んでも、文字型だし比較が出来ず 何行目を読み込むかという指定が出来ないと効率も悪いので 早い話が1個目の座標をがーっと最期の1000万まで比較して、 次の座標は、またはじめから比較するのはアフォくさいからそれより下の行から比較ってのをやりたいのです
んじゃあやっぱり一度にメモリに読み込め
自分でファイルフォーマットを設計できるんなら、固定長レコードの ファイルにするんだね。そうすればランダムアクセスできるから。 さらに高速化したいんなら、バイナリに汁。
だからオーバーフローするの 無理。何回もそれはやってるから 一時変数にはじめの座標格納して それ以下のは比較の変数に格納して、それを順次更新していけばメモリは食わないじゃん ただ、それをやるのに、行指定で数値型で格納する方法がわからなくて
一度数値を全部バイナリに変換したファイル作ればfseekで一発
オーバーフロー・・・(゚д゚;) 領域の取り方が悪いだけじゃ・・・
比較した結果はどうなるの?
そもそもそんなうん百Mなテキストデータなんか使うなよ・・・
ったく役にたたねぇなぁ…こんぐらいのこと答えれや
>>540 その位の事、自力でやれよ。
役に立たないヤシだなぁ…
超適当コード ----create.cpp(1000万行のテキストデータを作る)----- #include <fstream> using namespace std; int main(){ ofstream ost("hoge.txt"); for(int i=0; i<10000000; i++){ ost << i << " " << 255 << " " << 255 << endl; } ost.close(); return 0; }
543 :
542 :2005/10/26(水) 00:47:42
----search.cpp(1000万行のテキストデータをメモリに格納してランダムアクセス)----- #include <fstream> #include <iostream> #include <string> #include <vector> #include <ctime> using namespace std; int main(){ clock_t start = clock(), end; ifstream fin("hoge.txt"); string buf; vector<string> vstr; while(getline(fin, buf)) vstr.push_back(buf); end = clock(); cout << "elapsed time: " << (end-start) / CLOCKS_PER_SEC << endl; cout << vstr[5976367] << endl; //適当に抽出 return 0; } 手元のPCでは30秒ちょいかかった。オーバーフローはなし。 データの符号化に凝れないなら気の利いたPCでも調達すれば?
>>535 ソースがおかしいだけじゃないのか?
とりあえず、データ構造とアルゴリズムを見直せ。
後、やりたい事を箇条書きするなど、
考えをまとめてからコーディングする癖を付けておいた方がいいぞ
「オーバーフローする」ってのがよく分からない俺はだめ学生かも。 でかいテキストファイルだとfopenでは開けないの? fgetsしてsscanfするっていう方法しか考えつかなかった。……orz
546 :
545 :2005/10/26(水) 01:12:16
いや、俺の読みが正しいかもしれない。 fopenしたものを、全部配列に読み込もうとして失敗してる模様? 「100万〜1000万の行で、配列に入れようとしてメモリがぶっ飛びます 」 「fgetsとかだと、1行単位で読み込んでも、文字型だし比較が出来ず」 配列に読み込まず、fopenしたままfseekなりなんなり使えばいいんじゃなかろうか。 それとも、OSの都合で4ギガを超えるファイルを扱えないとか、 そういう方向の問題だろうか。
547 :
542 :2005/10/26(水) 01:19:05
>546 上のコードで実際に生成したけど161MB程度だったよ。
インデックスシーケンシャルファイルでSEEK位置を最初に保存して fscanf等でデータ取ってきて適当にatoi等で数値に変換 #俺ならデータベースを利用するけどな
>>546 fseek()とか使いたいんなら、ランダムアクセス可能なように
最初から固定長のファイルにしとけ、と。
なんか本人の自覚以上に初心者が激しく根拠のない理屈をこねてるだけだな。
>>524 ,etc
>行単位で指定して、数値型で読み込むのってどうやったらいいのかわかんなくて
>ファイル操作で、何行目から読み込むとかそういう指定が出来ないのかと…
ファイルの先頭に戻すか開きなおして必要な行まで読み飛ばせばいいだけだろが?
特殊な約束事が無い限り、行での指定は出来ない。自分で行を数える。
自分で行数数えながらその位置を覚えておけば(ftell)次回はそこまで
読み飛ばせるし。(fseek)
>fgetsとかだと、1行単位で読み込んでも、文字型だし比較が出来ず
カスか? 文字列から必要な数値を読み取るのは入門レベルの例題だろうに。
>何行目を読み込むかという指定が出来ないと効率も悪いので
入門者以下が足りない考えで効率云々するのは失笑ものかと。
>メモリが足りなくなるほどの行数なので
>だからオーバーフローするの
まさかメモリを確保できなくなるのを「オーバーフロー」と言って通じる
なんて思ってやしないよな??
1000万行としてint X,Y,Z でも sizeof(int)*3*10 MegaByte だから、
まあ効率云々能書きたれるなら、まあ今時充分利用可能な程度の
大きさだな。(仮想メモリででも)
551 :
545 :2005/10/26(水) 01:42:41
>>547 質問者が言ってる「オーバーフロー」は、
こんな感じのコードを書いたせいじゃないかと思った。
char buf[100][1000000]; /* 100万行 100MB */
for (i=0; i<1000000; i++) {
fgets(云々……
例えばボーランドの無料コンパイラだと、
配列とかスタックメモリ(?)が1MBを超えたらアウトだった(気がする)
……俺、すげー馬鹿なこと言ってるかも?
全然的外れだったら、誰か俺を止めて。
>>548 どーしても固定長にできないんなら、まあそうなるな
バカバカしいけど
553 :
545 :2005/10/26(水) 01:55:15
書き込む前にリロードしときゃ良かった。
なんか俺、すげー場違いかも。
俺より詳しい人が来たので、
>>524 はこのひとに訊いて下さい。
>>551 ええと、静的領域にではなく、関数内などスタック領域にとってしまったと?
それをスタックオーバーフローとでも表示する処理系でもあるのか?
まあ確かにそういった区別やmalloc()など理解してそうにもないなあ、
いぜれにせよ、入門者がわかったつもりでトンデモなのは今回に限らない。
そもそもデータ処理として、全データ1対1の総当り「比較(?)」というのが 激しく素人くさくて意味わかんね。 目的と応用性によって、もっと簡単な手順や、前処理がいくらでもあろうに。
1000万行で32ビットの値だとしても120MB程度でそ? スワップする事を考慮すれば、 よっぽど古いPCじゃない限りメモリが足りなくなることは無いんじゃないの? 総当りなら時間はめちゃかかるだろうけど。
Windowsでコマンドプロンプトの出力を取り込むためのUnixのpopenの様な関数はありませんか?
>
質問です。 newのオーバーライドなのですが、適用するソース範囲を制限することはできませんでしょうか。 例えば「このCPPファイルの中のnewのみオーバーライド」や「このクラスのメンバー関数の中でつかわれるnewのみオーバーライド」が欲しいのです。 最も外側でoperator newをオーバーライドすると、全てのnewが上書きされますよね。 とある組み込み機器の環境でこれに困っていまして、システム側が勝手にnewを使ってるっぽいのです。 オーバーライドしたnewの中身には、自前メモリー管理システムが入っているのに、その管理クラスの初期化前に呼ばれてエラーになってしまいます。 制限によって、システム側の勝手にnew呼び出しの前に処理を書くことができませんし、初期化時の値が保証されている変数も存在しません。(あればnewの中でそれをフラグにして分岐を行なうのですが) 例えばあるクラスの中で行なうnewのみをオーバーライドできるというのが理想です。 ・CPPファイルを分ければOKかと思ったのですが、リンクの段階で「すでに定義されています」エラー ・(自作)CAppクラスのCApp::operator newをオーバーライドすれば、CAppの中で使われているnewがオーバーライドされるのかと思ったら、new CAppがオーバーライドされるだけだった
>>560 自分で定義を与えることができるのはグローバルな new とクラスごとの new だけ。
望みの効果を実現する簡単な方法は無い。
static bool みたいな静的変数の初期化も保証されないタイミングで new が呼び出されてるの?
本当にそんなタイミングだとしたら、デフォルトの new すら動く保証がないはずだよ。
>>561 お返事ありがとうございます。
なんとその環境ではstatic変数が利用できないのです(つД`)
とここまで言うと環境がわかる人が出てきそうですが…。
とりあえず暮らすごとのnewをオーバーライドし、
new char; とかについては専用のクラス関数を用意することにします。
しかし、CPPファイルをまたいで影響を受けるとはかなり意外でした。
これ、他の人が公開しているライブラリ(cppファイルで公開)を利用したら、自前のnewオーバーライドと必ず衝突してしまいますよね?
new(nothrow)みたいに引数付きのoperator newを用意すれば?
>>562 なんとなく環境の想定がついたが、深くは突っ込まないでおこう。
呼び出し箇所を置き換えて回る覚悟があるなら
引数つき new (配置 new と呼ばれるもの)を作って
そちらを呼ぶようにすればいい。
new(customized) char とか書ける。
標準の nothrow_t nothrow を参考に。
まともな知識があれば、ライブラリの一部として
グローバルな new の置き換えを定義するようなことはしない。
やるにしてもオプション扱いだろう。
お返事ありがとうございます。 配置newというのは知りませんでした。 try/catchも無いような環境ですので不安ですが、これからテストしてみます。 本当に助かります。
やりました。配置newでいけました。 というわけでマクロ化して #define NEW(x) new(0) x とでもしておこうかと思います。 本当にありがとうございましたっ。まだ全機種チェックはできてませんが…。
567 :
デフォルトの名無しさん :2005/10/26(水) 17:07:49
現在DLLを使用したプログラムを書いています。
しかし、DLL_PROCESS_DETACHの際に、MessageBox関数を呼び出しても、メッセージボックスは作成されません。
環境は、 Windows2000 SP4 Borland C++ 5.5.1 SDK
具体的には、以下のようなプログラムを書いています。
//------------------------------------------------------------------//
BOOL WINAPI DllMain(HANDLE hInstance, DWORD what, LPVOID Notused)
{
switch(what) {
case DLL_PROCESS_ATTACH:
MessageBox(HWND_DESKTOP, "Process attaching DLL.", "DLL Action", MB_OK);
break;
case DLL_PROCESS_DETACH:
MessageBox(HWND_DESKTOP, "Process detaching DLL.", "DLL Action", MB_OK);
break;
case DLL_THREAD_ATTACH:
MessageBox(HWND_DESKTOP, "Thread attaching DLL.", "DLL Action", MB_OK);
break;
case DLL_THREAD_DETACH:
MessageBox(HWND_DESKTOP, "Thread detaching DLL.", "DLL Action", MB_OK);
break;
}
return 1;
}
//------------------------------------------------------------------//
参考:DLL_PROCESS_DETACH と MessageBox関数の問題例
ttp://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200212/02120053.txt DLL_PROCESS_DETACHの際に、MessageBox関数を使うのは不正なのでしょうか。
>>567 原則DllMainではkernel32.dllの関数しか使えないと思ったほうがいい。(Advanced Windowsに書いてある)
IDEを使っているのならOutputDebugStringなんかを使うようにしたらいいかと思う。
つーか普通、そこには何も書かないかと・・・
>>568 DLLのエントリポイントでできることには、重大な制限があります。
より複雑な初期化を行うには、DLLのための初期化ルーチンを作る必要があります。
と訳したけど、MessageBox関数が使えない理由になるのか分からなかった。
>>569 > 原則DllMainではkernel32.dllの関数しか使えないと思ったほうがいい。(Advanced Windowsに書いてある)
DLLにそんな制約があるとは知らなかった。勉強になりました。
OutputDebugStringを利用するようにしてみます。
長いこと悩んでいたけど、すっきりしました。ありがとうございます。
572 :
508 :2005/10/26(水) 19:08:16
#include <stdio.h> class foo { public: void put(){ puts("HogeHoge"); } }; void main() { foo *pfoo = NULL; pfoo->put(); } と書いて実行したら画面に HogeHoge と表示されてしまいました。 pfooは有効では無いはずなのに、何で表示されたんでしょうか?
うはw名前残ったまんまだったww
>>572 foo::put()がvirtualでなく、メンバにもさわってないから。
でも実装上たまたまうまくいっただけで、C++的には鼻から悪魔だと思う。
>>572 通常の処理系では、virtualでないメンバ関数は、thisを引数にとる
関数として実現される。よって、そのコードは、以下のコードと同じようにコンパイルされる。
void __foo_put(foo *this){ puts("HogeHoge"); }
void main()
{
foo *pfoo = NULL;
__foo_put(pfoo);
}
で、__foo_putはthisパラメタに触れていないから、NULLが渡されても問題なく振る舞う。
ただし正常に動作する保証がある訳ではないはず。
>>574 ,
>>572 なるほど。そう言う訳だったんですか。
C/C++の世界は深いですね…。
ありがとうございました。
C++の世界というかC++コンパイラの実装の世界というべきかもね。
X Y Z => R G B ?
579 :
デフォルトの名無しさん :2005/10/27(木) 17:21:17
とりあえずメンバ関数はすべてvirtualにしておいたほうが いいってことですか?
なんで?
>>579 どう見ても誤爆です。
本当にありがとうございました
582 :
デフォルトの名無しさん :2005/10/27(木) 19:37:54
今晩は、よろしくお願いします。 ポインタの質問です。 もし、vectorクラスのポインタを引数として渡し。 そこにデータを追加したいとき void watasu(vector<string> *data){ string moji = "sss"; data.push_back(moji); } このvector にも、メモリーを割り当てておく 必要があるのでしょうか。
素直に参照渡ししとけ!
584 :
デフォルトの名無しさん :2005/10/27(木) 19:39:49
>>582 です。
書き込んでから、私すごい誤解していますよね。
vector は、ひとつだけなんですから。
それはしなくていいということですね。
dataはポインタだろ? .じゃなくて->だと思うが。
>. ヽ(`Д´)ノ ミエネエヨ!
目を皿のようにすれば見える
588 :
デフォルトの名無しさん :2005/10/27(木) 22:05:37
初心者というより入門者なのですが、大学の課題で行き詰ってしまったので
アドバイスを頂きたいです。
OSはWindowsXP、コンパイラはVisualC++6.0で、課題の内容は
「1〜50人までの数学、英語の成績を入力して、それぞれの教科についての合計点、平均点、最高点、最低点を集計結果にまとめよ。尚、負の数が入力された時点で入力が終了したと判断し、直前の入力までを集計せよ」という内容です。
今現在の状況は
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1016.txt という所までで数学、英語それぞれについての合計がmt,et
平均がma,ea 最高点がmmax,emax 最低点がmmin,eminです。
入門書や教科書とにらめっこしてなんとかここまではできたのですが、
これを実行しても最高点しか正常に表示されない状況でして・・・。
どなたかアドバイスお願いできないでしょうか?
ちなみに変数宣言の所で0を代入しているのは配列の初期化やらよく分からなかったので
取り合えず全部初期化しておこうと思った次第です。長文失礼しました。
589 :
デフォルトの名無しさん :2005/10/27(木) 22:16:21
ATLでつくったServiceのCOMインタフェースにアクセスしたいのですが Serviceからならアクセス出来ましたが、一般のEXEからだと クラスのCoCreateInstanceで失敗してしまいます なんらかの権限の問題だと思いますが、わかる方いませんか?
>>588 minの初期値、配列の添え字をもう少し考えなさい。
scanfで入力した値と比較している値の添え字が違うよ。
592 :
588 :2005/10/27(木) 23:16:03
>>591 アドバイス有難うございます。
しばらく考えてみたのですが、minの初期値は満点の100を代入して
なんとか修正できたものの、配列の添え字については
n番目の負の値を集計から除くとn-1になると思うのですが
これはおかしいのでしょうか・・・・
未だに合計が修正できないので間違っている事は分かるのですがどう間違っているのかが分かりません。
>>592 おかしいのはscanfしてから出力する間の配列へのアクセス。
nに今回入力された値を格納しているようだけど、max、minの比較が何で前回入力した値(n-1)なの?
totalに足してる値が何で前回入力した値なの?
ずれてませんか?
初心者きわまりない質問で恐縮なんですけど、 VC++.NETでWindowsのプログラムを作るときに、 ダイアログエディタみたいなので 簡単にメインウィンドウにコントロールを配置することってできるんすか?
>>594 メインウィンドウ自体をダイアログにしてしまえばいい。
VC++2005では.NETFrameworkベースでそういう開発が出来るんだっけか。 managedC++限定なのかね
>>596 別にMFCでもダイアログベースで開発すれば済む話では内科医?
つか.NETだと基本はFormベースのポトペタ。何も考えずそれがデフォルト。
599 :
588 :2005/10/27(木) 23:56:03
>>594 言われている事が理解出来ていないかもしれませんが、
確かにn-1だと最初のループでm[-1],e[-1]とおかしい値になりますね・・・
最終的に負の値を入力する事が入力終了のフラグだったので
[n]だとその負の値が集計に入って合計と最小値が狂ってしまうと思って
n-1にしたのですがやはりおかしいですね。
集計に影響せず、かつ負の値を入力終了のフラグにするには
どうすればいいのか考えてみましたが思いつきません。
600 :
588 :2005/10/27(木) 23:56:54
もう588が言ってることが良く分からんから直したソース張る。 for(n=0;n<50;n=n+1){ printf("%2d番:",n+1); scanf("%d %d",&m[n],&e[n]); if(m[n]<0||e[n]<0){break;} if(m[n] > mmax){mmax = m[n];} if(e[n] > emax){emax = e[n];} if(m[n] < mmin){mmin = m[n];} if(e[n] < emin){emin = e[n];} mt += m[n]; et += e[n]; ma = mt/(n + 1); ea = et/(n + 1); printf("--- 集計結果 -------------------------\n"); printf("人数:%d\n",n+1); printf(" 数学英語\n"); printf("合計点: %f %f\n",mt,et); printf("平均点: %f %f\n",ma,ea); printf("最高点: %d%d\n",mmax,emax); printf("最低点: %d%d\n",mmin,emin); }
>>600 そもそもループ内で結果を出力しているのがおかしいと思うのだけど。
603 :
588 :2005/10/28(金) 00:08:39
>>601 どもです。
それを参考にしてもうちょっと考えてみる事にします(´・ω・`)
ていうかな。集計出すだけなら配列に入れる必要ないよ、これ。 こんな感じでいける。 #include <stdio.h> #include <limits.h> int main() { int e, m; int num = 0, msum = 0, esum = 0; int mmax = INT_MIN, emax = INT_MIN; int mmin = INT_MAX, emin = INT_MAX; for (; scanf("%d %d", &m, &e) == 2 && m > 0 && n > 0; ++num) { if (m > mmax) mmax = m; if (m < mmin) mmin = m; if (e > emax) emax = e; if (e < emin) emin = e; msum += m; esum += e; } printf("人数: %d人\n", num); printf(" 数学 英語\n"); printf("合計 %5d %5d\n", msum, esum); printf("平均 %5.1f %5.1f\n", (double)msum/num, (double)esum/num); printf("最高 %5d %5d\n", mmax, emax); printf("最低 %5d %5d\n", mmin, emin); return 0; }
605 :
604 :2005/10/28(金) 00:18:03
あ、すまん。これだと零点が入れられないな。
if文の
m > 0 && n > 0
は
m >= 0 && n >= 0
に直してくれ。
で、
>>588 は今後こういうのは宿題スレに持ち込むように。
>602がスルーされた件について。
どうでもいいよ
608 :
デフォルトの名無しさん :2005/10/28(金) 10:30:30
>>604 作って終わりのプログラムならな
実際は配列をベースに(ry
単に生成した単一画像データをWeb上のcgiにポストするだけのプログラム書いてるはずなのにmultipart/mixedとかいらん機能載せてクラスが肥大化してきた俺が来ましたy(ry
質問です。 Object obj = NULL; という宣言をすると(Objectは自作クラスです)、 error C2440: 'initializing' : 'const int' から 'class Object' に変換することはできません。 というエラーが出ます。 ですがObjectは void operator=(void*); がオーバーロードしてあり、実際 Object obj; obj = NULL; はコンパイルが問題無くとおります。 initializingという単語から考えて、変数の宣言と同一時の=は通常の=とは別扱いなのでしょうか? なるべくなら Object obj = NULL; という宣言方法で書きたいのですが、できないものでしょうか。
Object* obj = NULL; インスタンスそのものをNULLにしようとしてどうするんだおまいさん?
>>611-612 お返事ありがとうございます。
>>611 そこは「わざと」なんで気にしないで下さい。
私の例が誤解を招くような例でした。
確かにObject* obj = NULL; を勘違いしているように見えますね。すいません。
>>612 確認できました。
なるほど
Object obj = NULL;
は
Object obj(NULL);
と解釈されるんですね。ありがとうございました。
老婆心ながら、 Object obj; obj = NULL; なら大丈夫だろ? #気色悪い設計だと思うが。
>がオーバーロードしてあり、実際 >Object obj; >obj = NULL; >はコンパイルが問題無くとおります。
>>614 斯くの如く、初期化と代入は違うのだよ。
>>610 もっと根本的にObjectなんてクラスは本当に必要?
>>595 おぉ、なるほど。
ありがとうございます
低レベルな質問で申し訳ないですが あるテキスト(テキスト形式のメール本文とか)の中に URLがあった場合、そのURLに自動的にリンクを張ろうとしています URLのある場所とかがわかればそこにタグを追加するだけなんですが URLをどうやって検出するかというところで悩んでいます。 どなたかアドバイス・ヒント等いただければよろしくお願いします
>>620 通常、プロトコル(例えばhttp)を検出する。問題は、どこで終端するかだが。
>>621 すいません、
>>620 じゃ全然情報足りないですね
現在はhttpで開始点を検出することはできてるんですが
おっしゃるとおりどこまでをURLか、という部分で悩んでいます
URL の正しい構成を RFC から拾ってきて正規表現でマッチさせるのが多分王道。
但し、ピリオドも正しい構成要素なのでこの方法では
The URL is
http://foo/bar.html. のように文章のピリオドも構成要素として見なしてしまうのが難点。
>>622 空白の前まで。httpの前が開き括弧なら、空白の前の対になる閉じ括弧は無視。
2バイト文字を無視するかどうかは主義主張に則ってどうぞ。
尚、元来'?'や'&'は含まれない筈だがcgiの呼び出しなどで当たり前に使われてしまっているので要注意で。
625 :
620 :2005/10/28(金) 20:38:43
626 :
デフォルトの名無しさん :2005/10/28(金) 21:15:41
>>626 >C++はメジャーなプログラミング言語(C言語のスーパーセット)ですが、入門書の数はそれなりにあるのに、ほかの種類の書籍に恵まれてきませんでした。
腐るほど出てると思うんだが
初版のコメントまんまなんじゃないの
>>595 これを見て思ったんだけど、
ダイアログをベースにしたプログラムってどうするんですか?
VC++.NETでWin32のプログラムです。
>>629 WinMainの中でいきなりDialogBoxやCreateDialogを呼べばいい。
ところでダイアログボックスにはウィンドウクラスを指定できるから、
自分でRegisterClassEx()して(ダイアログプロシージャではなく)ウィンドウプロシージャを書くこともできる。
632 :
デフォルトの名無しさん :2005/10/29(土) 14:43:46
質問です。XP、.NET です。 先ほど他スレに投稿したのですが、スレ違いと判断して、誘導の後こちらに引っ越させていただきました。 関数ポインタについてです。 CHoge hoge { public: bool (*pFunc)(); bool Func(); void test(); } CHoge::test() { pFunc = Func; } 上記のコードをコンパイルした結果、関数へのポインタへの代入に失敗しました。 Func() の型は bool (*)(CHoge*) のため(CHoge* は暗黙の引数 this を受け取る)、 bool (*)() 型の pFunc には代入できなかった、という理解でよろしいのでしょうか? また、上記問題を解決するため、 bool (*pFunc)(CHoge* pHoge); static bool Func(CHoge* pHoge); というように、Func を静的にし、メンバを呼ぶためオブジェクトのアドレスを渡すようにしたのですが、 これでは、Func() の記述内に pHoge-> が散乱してしまい、格好悪くなってしまいます。 何かいい解決法はないでしょうか。 よろしくお願いします。
これ何言語?
634 :
632 :2005/10/29(土) 14:50:44
C++ のつもりでしたが・・・、不備がありましたでしょうか。 CHoge::test() → void CHoge::test() です。
>>632 メンバ関数ポインタを使いなさい。
説明はメンドイんでググレ
C++で通るように書くと class CHoge { public: bool (CHoge::*pFunc)(); bool Func() { return false; }; void test(); }; void CHoge::test() { pFunc = Func; } こんな感じだが… あまりに低脳なミスが多すぎてやる気なくす
637 :
632 :2005/10/29(土) 14:58:27
>>635 ぐぐったら詳しいページが見つかりました。ありがとうございます。
>>636 納得・・・お恥ずかしい限りです。
>>632 大体そんな認識でいいけど、Funcの型はbool (hoge::*)();
メンバへのポインタを使うとこうなる。
class CHoge {
public:
typedef bool (hoge::*FuncType)();
FuncType pFunc;
bool Func();
void test();
};
void CHoge::test() {
pFunc = &CHoge::Func;
}
これを使うときには
CHoge obj;
obj.test();
FuncType pfn = obj.pFunc;
(obj.*pfn)();
下2行は勿論(obj.*obj.pFunc)();とまとめられる。
あるいはboost::mem_funとboost::functionなどを使うとするとこうなる。
class CHoge {
public:
boost::function<bool ()> Func1;
bool Func();
void test();
};
void CHoge::test() {
Func1 = boost::bind(&CHoge::Func, this);
}
これだとobj.Func1()と呼べる。
639 :
デフォルトの名無しさん :2005/10/29(土) 17:22:26
コンストラクタとデストラクタを集中的に勉強したいのですが、 どこかいいサイトがあったら教えてください。
>>639 Effective C++辺り読むのがオススメ
どっちにしろ必読書だし
641 :
デフォルトの名無しさん :2005/10/29(土) 22:27:17
WindowsXP SP2 MFC使用 VC++ .Net 2003です。 Aという基本クラスを作り、Aクラスを派生したクラスを100個ほど作ります。 その際、派生クラスの名前をA_00, A_01, A_02....A_99というふうに、基本クラス名の後に2ケタの数字がつくようにします。 そしてそのAの派生クラス達をあるクラスで生成し、それぞれの呼ぶのですが、 その生成の個所が以下のようになってしまいます。 pA[0] = new A_00(); pA[1] = new A_01(); : : pA[99] = new A_99(); で、質問なのですが、クラス名の文字列から、クラスオブジェクトを生成できないでしょうか? それができると生成の個所が for( int i = 0; i < 100; i++ ) { CString className; className.Format( "A_%02d", i ); pA[i] = (A*)new XXXX( className ); ←これが不明 } というふうに簡素化できるのですが…。
>>641 名前にはきちんとした意味を持たせろ。話はそれからだ。
>>641 100個となると少々設計に問題がある気がするけど、
boost::preprocessorがそういったループ展開可能なマクロを提供しているから
それを使えば簡潔に書くことはできると思う。
644 :
629 :2005/10/30(日) 00:09:21
>>630 説明書て、ダイナミックヘルプのこと?
>>631 #include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
char szClassName[] = "main01"; //ウィンドウクラス
int WINAPI WinMain(/*略*/)
{
BOOL bRet; //メッセージループで使う
MSG msg;
WNDCLASSEX wc;
//ウィンドウクラスの登録
wc.cbSize = sizeof(WNDCLASSEX);
//以下略
if (RegisterClassEx(&wc) == 0)
return FALSE;
DialogBox(hCurInst, "Top01", (HWND)wc,(DLGPROC)WndProc); //ダイアログリソースは"Top01"で扱った
//メッセージループ
//(略)
}
こんな感じにすれば良いんですか?
いや、動かないんで間違ってるんですけど…(--;
>>644 いいや。
RegisterClassEx云々はそうもできると言う話であって、今回の話とは別個。
普通にRegisterClassExしないで、DialogBoxを使いな。
646 :
デフォルトの名無しさん :2005/10/30(日) 00:26:48
pthreadをC++(UNIX系)で使ってるんですが、 void func(MyClass *myclass) を pthread_t t[10]; int res,i; MyClass myclass[10]; for(i=0;i<10;i++) res = pthread_create(&t[i],NULL,(void *)func,&myclass[i]); とするとエラーがでてコンパイルが通りません。 何がいけないのか教えてくれませんか?
>>646 pthreadが許可する関数エントリはvoid*を受け取りvoid*を返すように決められているから、
funcをキャストするなら(void *)ではなく(void *(*)(void *))にキャストする必要がある。
実際のところ、 void *func(void *arg) としておいて、内部で
MyClass *myclass = (MyClass *)arg;
とするのがいいんじゃまいか。
そうすればpthread_createの無駄なキャストが消えて
pthread_create(&t[1], NULL, func, &myclass[i]);
と出来るかと
仕事でプログラムやってる方に質問。 納期が近くなって数時間を争う状況になったとき、 @納期後のメンテナンス性を考えたコーディング→ある程度改修が必要で時間がかかる Aべた書きのスパゲッティコード→すぐ書けるがメンテナンス性皆無 のどちらかの方向を選ばなくてはならなくなったら@,Aのどちらの道をとるのが ベターなんですか?
>>648 みんな(2)を選ぶから保守が大変なんだろうて。
>>644 おとなしくVB/VC#/Delphi/BCB/VC++.net(Windows.Form)のどれかを使う。
>>648 納期が数時間単位でヤバイなんて時期になって、
@かAかを選択する余地は普通無いと思うが。
それに、@を選択するのなら、最初からそういう設計になっているべき。
ということで、そういう状況になるとすればほぼAを選択することになる。
というか、そういう選択を迫られる状況にならないように、
出来る限り先回りで対応する事と、今日出来ることを明日に延期しない心がけが大切。
明日できることを今日やらないで済むようにスケジューリングするものです。
>>648 > 納期が近くなって数時間を争う状況
でまだ「コーディング」をやっている、というのがそもそも論外。
仕事でって… まあ作業の内容にもよるだろうが(!?)、その段階で1,2という 選択どころか「コーディング」自体に意味が無い。 たとえテストやデバグ改修にしてもなあ… (実態はともかくか?)設問自体が意味をなさない(はずだが)。
00 int *num: 10 num = new int; 20 num = new int; という風にnewで動的に確保したメモリのアドレスを、ひとつのポインタに 入れちゃうと10行で確保したメモリはdeleteできなくなっちゃうんですかね? それとも delete[] num; でdeleteできるんですか?
>>655 delete できない。いわゆるメモリリークってやつ。
その行番号、 BASIC みたいだな。
>648 B自動実行できるテスト と リファクタリング で後の事は気にするまでもない だな ちなみにそんな切羽詰まった状況なら確実にA’←Aでもテストを実行するコードは付けとく きれいだが動かないプログラムは意味がない。 汚くても動くプログラムとテストコードがあれば、後になって救える。
658 :
デフォルトの名無しさん :2005/10/30(日) 11:39:35
>>647 感謝です。
動きました。でも自分で理解できてないのが悔しい・・・
>>658 単純な話で、任意のポインタからvoid *への変換は許可されているけど、逆は不可(キャストが必要)
>>646 のように書いてしまうと
(void *(*)(MyClass *))を(void *)にキャスト // ここはOK
(void *)を(void *(*)(void *))に変換しようとする // ここでエラー
となっているだけ。
660 :
デフォルトの名無しさん :2005/10/30(日) 12:26:56
>>659 う〜ん、少なくとも俺には十分難しいです。
引数のオブジェクトにアクセスできん・・・
>660 状況いまいちつかめないけど、 C++規則として、 ・派生クラスから基本クラスへはキャスト無しでいけるが、逆はキャストしないと不可。(Javaだと逆になる) ・参照の変数に代入する時の右辺値は変数で無ければならない、またこれは、関数の引数が参照の時も同じで、 参照の引数を採る関数には、その引数に変数を介さなければ値を渡せない。 というところで。
失礼、Javaでも同じでした。
void swap(int *a,int *b) { int t; t = *a; *a = *b; *b = t; } int GCD(int *a, int *b) { if(*b>*a) swap(a,b); while(*b != 0){ *a = *a % *b; swap(a,b); } return(*a); } int LCM(int a, int b) { if( a==0 || b==0) return(0); return((a/GCD(a,b))*b); } 上記のような関数で最大公約数と最小公倍数出そうとしたのですが どうしても最小公倍数が0になってしまいます。 どこが間違っているのかご教授ください
664 :
663 :2005/10/30(日) 16:40:14
GCD(a,b)じゃなくGCD(&a,&b)です。 それでもできない・・・うーん
>>663 GCDにLCMのaとbのポインタを渡してるから、
LCMから戻ったときにはaとbの値が変わってる。
具体的には、bが0になってる。
>>663 ポインタを受け取るようなGCD()が蛸。
>>665 まじ素早いレスありがとう
ホントですね。GCDでbが0になっちゃってる。
ポインタ使わずにGCD作っとこ。
ありがとうございました
>>666 バグを探せ、という課題だったのですが
GCDがポインタ扱ってるのが問題だったのですね。
GCDはちゃんと出るからずっとLCMに問題があるかとおもって必死に試行してました(汗
宿題かよ
670 :
デフォルトの名無しさん :2005/10/31(月) 03:51:29
質問です。XP、.NET です。 STL の list のソートを使っています。 list<CHoge*> hogeList; のように、ポインタのリストを作成すると、 hogeList.sort(); としても、オブジェクトのアドレス順にソートされてしまい、 当然、CHoge クラスに "<" 演算子を定義しても意味がありません。 好みの順にソートさせるには、"<" 演算子ではなく、ソート用の関数を作成して渡すか、 list<CHoge> hogeList; とできるよう設計しなおすしかないでしょうか。 よろしくお願いします。
その通りです
672 :
670 :2005/10/31(月) 04:39:19
VC7.1で、 //foo.h template <typename T> class foo { public : void bar(void) ; } ; //foo.cpp #include "hoge.h" template<typename T> void foo<T>::bar(void) {} //main.cpp #include "hoge.h" int main() { foo<int> hoge ; hoge.bar() ; } LNK2019: 未解決の外部シンボル "public: void __thiscall foo<int>::bar(void)" (?bar@?$foo@H@@QAEXXZ) が関数 _main で参照されました。 なぜかリンクできないのですが、どうすればいいのでしょうか?
>>673 テンプレート関数やクラステンプレートのメンバ関数は、ヘッダファイルに定義を書くか、
exportキーワードを付けてcppファイルに定義を書く必要がある。
ただし、VC7.1はexportキーワードに対応していない。
>>673 テンプレートクラスはコンパイル時に型ごとに別の実体を生成します。実装はヘッダに書きましょう。
676 :
673 :2005/10/31(月) 11:04:36
exportキーワードってそういう風に使うものだったんですか。 存在だけは知っていたんですが。 今、exportをサポートしているコンパイラってあるのでしょうか?
VC6使えば?
質問です。 CやC++で、一度も使っていないローカル変数は 「一度も使われていません」と警告がでるわけですが、 「この変数は使って無くても、使われたことにする」ための記述方があったかと思います。 int a; a = 0; など代入をするのではなく、またpragmaなどで警告を非表示するわけでもありません。 use a; こんな感じ?だったかと思うのですが…。
その変数に対して積極的な最適化をしない、という意味の、 volatile int a ; のこと?
>>679 単に a; とだけすればいい。
SDKにそんなマクロがあったような気がするが、名前忘れた。
>>682 それだと参照されね?
実行速度もったいない。
最適化で取り除かれるかと
>>679 Windowsならこのあたりですね。
・UNREFERENCED_PARAMETER
・DBG_UNREFERENCED_PARAMETER
・DBG_UNREFERENCED_LOCAL_VARIABLE
下2個はヘッダを見てはじめて存在を知った。
>>682 最適化はともかく、それじゃ普通別の警告になる罠。
皆様ありがとうございます。
意外とメジャーじゃないもんですね。Google使っても全然ひっかからなかったのでそうかなとは思ってたのですが…。
>>685 マクロなんですね。C/C++の標準機能だと思ってました。
つーか、使われてねぇんだからコメントアウトでもしときゃいいだろ? なんでわざわざ使われても無い変数を残しときたがるんだか・・・
実行時に読み込むDLLや、別のプロセスが書き換えるのかもしれないぞ。
>>688 システム側からコールされるお定まり型の関数が、使わない(使い道あるんでしょうけど)変数まで引数にしてるんです。
そりゃしかたないな
引数の変数はその時点で使ってるから使ってないなんて警告されないぞ?
693 :
デフォルトの名無しさん :2005/10/31(月) 17:35:51
>>692 コールバックの中身を書いてるんじゃないの?
WinMainの二番目の引数みたいなものだろ。 もちろん、実際には使うのかもしれないが。 すくなくともコード中で使うことはありえない。
だから使わないからって引数が警告になること無いって
696 :
デフォルトの名無しさん :2005/10/31(月) 17:44:54
exeファイルを実行して、デバッグしてみると DLL initialization Failed という出力が出てくるのですが、これはどういったものなのでしょうか? exeファイルを実行しても何も起こらないのは、これが原因だと思う のですが。
必要なDLLが読み込める場所に無いんじゃね?
>>695 多分コンパイラによるんだと思いますよ。
WindowsのVS6.0のコンパイラは出さないみたいですね。
>>695 C++では引数に名前を与えないことができるから、
親切なコンパイラは警告してくる。
あの、生きる意味がわからないヒキコモリなのですが、どうすれば良いでしょう? 高卒で国立医療系に入ったのは良いけど中退しました。特技は特にないです。 漢検と英検が学生の頃に両方とも二級があります。後、車くらい。 それと友達に誘われて自分は興味は無いけど色彩二級があります。 これが自分の持ってる全部の資格です。学生ならまだしも、 社会人になっては意味のない資格しか無いので路頭に迷っていますorz プログラムは5年前から興味を持っていて、本も何冊か買っていますが、 実際には組んだことはありません。Eclipseも入れたけど2のままです。 誰か助けて、鬱が止まらないです。どうしたら良いんだろう。
5年も興味があるのに組まないってことは、興味が無いんでしょ。 何か別のことはじめた方が良いと思われ。 ちなみに、本は買うだけじゃ、ソフトは入れるだけじゃ何の役にも立たない。
コピペにマジレスすんなよ
マジレスもコピ(ry
------------------------------------------------ ここまでコピペ
>>690 たとえばその関数がint hoge(int foo, int bar) {}だとして、
barを使わないのならint hoge(int foo, int) {}と書けば、
引数を受け取るけど使わないと言う意思表示になりコンパイラも警告しなくなる。
>>694 というわけでこうすればいい。
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE, PSTR pszCmdLine, int nCmdShow) {}
706 :
デフォルトの名無しさん :2005/10/31(月) 22:08:31
ものすごい初心者なんですけど PSTR型はいつでもLPSTR型と同一なの?
>>706 昔のWin16では違ったのだが、今のWin32/64ではそのとおりで全く同じ。
708 :
デフォルトの名無しさん :2005/10/31(月) 22:32:32
Effective C++ってそんなにいい本なのですか? 持ってないともぐりと言われそうで、買った方がいいのかなぁ。
>>709 基本的に、C++を使うならば知っておかなければいけない内容が書いてある。
もちろんEffectiveC++で全てを網羅してあるわけじゃない。
ネットで同じ内容をかき集めることは可能だけど、
俺個人としては紙媒体でまとまった情報を持っていた方がいいと思うので
目次を立ち読みして知らない・分からない内容があったら買ってもいいと思う。
>>709 参考になるかは判らんが、C上級者がC++を始めて半年間あれこれ試行錯誤して判ったことが、
全てEffectiveC++に書かれていた。
>>679 一般的には (void)a; じゃないのか?
親切なコンパイラなら警告も出なくなるし
最適化されてコードも生成されないはず。
714 :
デフォルトの名無しさん :2005/11/01(火) 05:03:59
while (TRUE) { GetMessage(&msg , NULL , 0 , 0); if (msg.message == WM_LBUTTONUP) break; DispatchMessage(&msg); } これってDispatchMessage(&msg);が意味なくないですか? GetMessageでメッセージを取得してDispatchMessageで送出してからbreakする方がいいと思うのですが。
つーか、なにがしたいのか分からん。
普通はウインドウプロシージャでやるべきことだ。 そもそもその方法だと、マウスクリックが発生せずにウインドウが閉じられた場合、どうするつもりだ?
GetMessageの位置とか、足りて無いAPIとか、色々とバカなループだな
>>698 VC++6.0のデフォルトの警告レベルが低すぎるので警告が出ないだけだったかと。
質問させてくれ。 例えば CHoge p = new CHoge(); p->hoge(); とすれば ・メモリーが割り当てられ ・コンストラクタが呼ばれ ・その後hoge()が呼ばれる で、 CHoge p = malloc(sizeof(CHoge)); p->hoge(); とした場合どうなるのだろうか? コンストラクタが呼ばれないのは知っているのだが、hogeは(標準仕様上)正しく呼ばれることは保証されるのだろうか?
>>719 hogeがvirtualだったりすると、仮想関数テーブルが初期化されてないから落ちるな。
そうでなくても、コンストラクタが呼ばれてないオブジェクトに対して操作するのは鼻から悪魔が(ry
つーか CHoge p じゃなくて CHoge* p だろうと。
>>720 *は書き忘れです。ごめん(;´Д`)
やっぱりキモいかー…。うし。初期化周り書き直すよ。ありがとう!
そもそもmallocすること自体鼻から悪魔が(ry
やってんのかい!
せめてoperator newで
operator new の中に自前メモリープールを作ってるのよ。 で、そのメモリープールを管理するクラスはMALLOCで確保しなきゃいけないんで(´・ω・`)
CHoge::operator new、CHoge::operator deleteを作ればいい話じゃね。
>>727 mallocで確保すること自体は大丈夫だよ。
その確保した領域に配置newでオブジェクトを構築すれば無問題。
>>726 それだ!!なんで気づかなかったんだろう。・゚・(ノД`)・゚・。
ありがとう!!!
>>727 環境のせいでmallocしかないんYO!
いや、すまん、悪かった、許せ
Accelerated C++を読んでいるのですが、119ページのソースで vector<hoge> hage() { vector<hoge> hogehoge; return hogehoge; } このように関数内で宣言したオブジェクトを返していますが この場合はint型のようにコピーが返されるのでしょうか?
vectorの仕様を勉強してください
735 :
デフォルトの名無しさん :2005/11/02(水) 13:39:23
ある構造のバッファを使い構造体のメンバを設定出来る様にする場合 memsetなどを使うよりoperator=を構造体に作った方が良いらしいのですが 具体的にはどうすればいいのか少し迷っています。 operator=(const Buffer* buf) を構造体内で実装しバッファをそれぞれのメンバの型に変換し代入すればよいのでしょうか?
>>736 なるほど、これでコピーすればよいのですね。
ありがとうござ
>>738 ちがうんですか?よくわからんとです・・・。
ヒロシです・・
つ[operator=(const Buffer & buf)]
744 :
デフォルトの名無しさん :2005/11/03(木) 17:18:32
質問です。XP、.NET です。 STL の deque から、ある条件を満たす要素を全て削除する良い方法はないでしょうか。 // イテレータを使った場合 deque<CHoge> que; deque<CHoge>::iterator itr; for(itr=que.begin(); itr!=que.end(); i++) { if ( /* 好きな条件 */ ) que.erase(i); } こうすると、erase した時点で i の指すものが不定になり、 i++ が上手く動作しません。 // operator[]() を使った場合 deque<CHoge> que; for(int i=0; i<que.size(); i++) { if ( /* 好きな条件 */ ) { deque<CHoge>::iterator itr == ( /* i 番目の要素のイテレータ */ ) que.erase(i); // } } operator[] を使ってループを整数でまわそうにも、 n 番目の要素のイテレータを返す操作が見つからず、うまくいきません。 よろしくお願いします。
>>744 n番目の要素のイテレータは
que.begin() + n
std::removeを使うという手もある。
>>744 まだSTLやってないからdequeがどんなのか分かってないが
読み進めてるAccelerateC++に乗ってた奴から
remove_if(que.begin(), que.end(), hoge());
hoge()は好きな条件の時にTrueを返す
>>746 それでは、削除しないものを前に集めるだけで、消去までされない。
que.erase(std::remove_if(que.begin(), que.end(), hoge()), que.end());
>>747 すまない、後でiter以降をごっそり消すってのを書き忘れてた・・・
所でAcceleratedC++読んでて思ったが、C++って無茶苦茶楽しいな
Cでちまちまやってたのがアホらしい_| ̄|○
749 :
744 :2005/11/03(木) 18:05:19
>>745-747 ++ ができてなぜ +n が思いつかなかったか謎ですorz
remove については詳細を調べてみます。
ありがとうございました。
C++に関する質問です。環境はvisual C++6.0 WindowsXPです。 int *num = new int[0]; と書くと0個の配列を確保したことになるんでしょうか? そして delete[] num; と書けば開放できるんでしょうか?
752 :
750 :2005/11/03(木) 22:24:33
>>750 コンパイル通ったんだけど(VC7.1)、
staticな要素数0の配列を禁止しといて
動的な要素数0の配列を禁止しない理由
って何かあるんですか?
>>753 malloc(0)もできるからnew T[0]もできるようにしたというところだと思う。
malloc(0)というのもなんか不自然だな… 使い道あるのだろうか。それともこれを許すと 何かがうまくいくのかな?
ただしreallocの最初の引数はヌルポインタでも良いのだけどな。
>>749 erase() が返す iterator の意味を調べると吉。
関数の戻り値とコンストラクタについて質問です。 以下のようなコードを実行したところ class A { int m_n; public: A::A(int n) :m_n(n){ cout << "コンストラクタ" << endl; } A::A(const A& a):m_n(a.m_n){ cout << "コピーコンストラクタ" << endl; } A::~A() { cout << "デストラクタ"<< endl; } }; A func() { return A(10); } int main() { A a(func()); return 0; } Borland C++ では コンストラクタ コピーコンストラクタ デストラクタ デストラクタ Visual C++ 6.0では コンストラクタ デストラクタ となりました。なぜ、違った結果になるのかわかりません。 どちらも最適化はOFFにしてあります。どなたか助けてください。
>>759 どこからどこまでを最適化というかは処理系依存。
一般に最適化をオフにしても定数部分の処理は勝手にやってしまう場合が多い。
func()が定数を引数に取るクラスを返すと考えるか、
返すクラスを定数と考えるかって所で変わってるんじゃないかな?
>>759 VCのように一時オブジェクトの作成をしなくても良いと規格で定められている。
なんでclass A{}宣言内にA::AとかA::~Aとか書いてんねん・・・
>>760 >>761 なるほど。コンパイラ側で自動でやってくれる処理だったんですね。
ありがとうございました。
RVO(Return Value Optimization)と言うやつだな
VC6でもRVO効くんだな
とっても初歩的な話かも知れなくて申し訳ないのですが、 double型などの浮動小数で、 指数だけをぐりぐり動かす事ってできるんですか? 例えば、 3.14159265e-010があったとして、 それを3.14159265e000とか、3.14159265e008とかに変換したいんです。 言って位置で変換するなら、*=1e10とか、1e18とかすれば良さげなんですけど、 持ってくる数値によって、動かす指数の幅を変えたいとき、 1eXとかにできないものですから…
>>766 環境非依存の内容を要求しているのならば、* pow(10, x)とするしか
ないんじゃないかな。そもそも内部では仮数も指数も2進数で保持して
いるのが普通なんだし、正確には計算できないでしょ。今のx86のCPU
なら指数部(2進)と仮数部(2進)を分離する命令(FXTRACT)があるけど。
>>766 標準関数だけならfrexpとlrexpがある。
769 :
デフォルトの名無しさん :2005/11/05(土) 13:28:03
あるソケットが既に接続済みか調べる関数みたいなのありますか? winsock2です
770 :
デフォルトの名無しさん :2005/11/05(土) 14:03:28
質問です。XP、.NET です。 // Hoge.h class CHoge { public: enum EHOGE { HOGE }; EHOGE func(); }; // Hoge.cpp EHOGE CHoge::func() { return HOGE; } 上記のようなコードのコンパイルが通りません。 Hoge.cpp(12): error C2143: 構文エラー : ';' が 'CHoge::func' の前にありません。 Hoge.cpp(13): error C2371: 'CHoge::func' : 再定義されています。異なる基本型です。 Hoge.h(10) : 'CHoge::func' の宣言を確認してください。 Hoge.cpp(12): error C2501: 'EHOGE' : 識別名を宣言するのに、型が指定されていません。 Hoge.cpp(13): error C2556: 'int CHoge::func(void)' : オーバーロード関数の戻り値は異なっていますが、引数リストは同一です。 列挙型は int 値ということで、戻り値を int 型にすれば確かにコンパイルは通りますが、どうも釈然としません。 列挙型を明示的に戻り値とすることはできないのでしょうか? よろしくお願いします。
>>770 CHoge::EHOGE CHoge::func();
でないけ
773 :
770 :2005/11/05(土) 14:10:24
>>772 俺って・・・orz
ありがとうございました。
774 :
デフォルトの名無しさん :2005/11/05(土) 17:36:18
読む努力すらせんのか
776 :
デフォルトの名無しさん :2005/11/05(土) 17:44:02
じゃ、わからないままっつー事で
努力する気が無いなら失せろ
779 :
デフォルトの名無しさん :2005/11/05(土) 18:08:26
女子高生なので教えてください(^o^;)
女子高生ならなおさら失せろ。 中学生以下か、女子大生なら歓迎だが。
781 :
デフォルトの名無しさん :2005/11/05(土) 18:20:47
779の妹の絵美(12歳)でーす 馬鹿姉のためにお願いしまーす☆
782 :
デフォルトの名無しさん :2005/11/05(土) 18:25:27
もういいです。すいませんでした
女子高生なんてウザイだけだし
女子小学生なら俺が手取り足取り教えt(ry
小学生なら個人授業したいけどな♪
>>785 今日、銭湯行ったら女子小学生(幼女)が3人ぐらいいた。
>>786 ちゃんとwinsock2教えてきたか?
>>787 一番下の子がトイレにいくのが面倒だったらしく放尿して、親父に軽くしかられてたからそれどころじゃなかったw
私も昔銭湯で女の子が放尿して、 その子の父に「ばかやろう、汚いだろうが」叱られているのを見たことがあるが、 既にある程度ロリが開花していた私は、 「何もそこまで起こらなくても、むしろ私が飲んであげたい」とか思ったものだ。 うは、変態www テラヤバスwww
おしっこ飲むのはいいがウンチなめるのはやっぱ異常だろ お風呂上りの肛門なめるのは問題ないが
( ・ω・)・・・
( ・ω・)・・・・
( ・ω・)・・・・・
( ・ω・)・・・・
( ・ω・)・・・
( ・ω・)・・
( ・ω・)・
( ・ω・)
( ・ω・
( ・ω
( ・
( ・ω・)・・・・・ 阻止。
そんな殺生な
( 無視
無
(´ω`*)モキュキュキュ
自分が正常なのか異常なのかここにいるとわからなくなる(笑 ちなみに私の正常と異常のラインは「幼女のおしりを舐められるか否か」です。 舐められる人は異常、舐められずおしっこを飲むくらいまでの人は正常。 私はおしっこを飲むくらいまではできると思いますけど、おしりはどう足掻いてもダメですね。
811 :
デフォルトの名無しさん :2005/11/06(日) 13:20:13
何この気持ち悪い流れ
>>811 みたいなことを言う方が気持ち悪い。
嫌なら見なければ良いだけ。
と、いうか板違い
うわあ出た「嫌なら見るな」理論! 公共の場を異常な言動で占有した挙句、文句言われたら「見るな」とチョーゴーマン理論展開。 つーか見たから嫌なんだっつーの!順序が逆だっつーの! 何かしら無理しないと見れない場所ならともかく、誰でも見れる場所でそんな屁理屈通用しないっての。 こういう輩って国立公園でアナルオナニーした挙句、とっ捕まっても同じ台詞言えるんでしょうかね?
コピペ乙
>>812 C/C++のスレでロリコン共がスカトロ談義なんぞしてるなんてことが事前に予想できれば最初から見に来ねえよ
マジキモい
↓↓↓気を取り直して質問どうぞ↓↓↓
ロリータ指向プログラミングやってる人は居ますか?
820 :
デフォルトの名無しさん :2005/11/07(月) 17:58:58
C言語なんですけど変数の宣言の時に変数は確保されるのですか 例えば変数を宣言するだけでそれを全く使用しないプログラムでも、その変数は確保されるのですか
>>820 確保というのはスタック領域に確保するという意味かな?
だとしたら処理系による。
最適化の具合にもよる。
一切使用されていないと、コンパイラの最適化で取り除かれるな
823 :
デフォルトの名無しさん :2005/11/07(月) 18:06:25
じゃあ、ウィンドウプロシージャでstatic宣言なしに変数の宣言をすると、 毎回毎回(その変数を全く使用しない場合でも)確保されて、returnに達すると開放されるのですか? かなり無駄な感じがするのですが
釣り(・A・)イクナイ!
ウィンドウプロシージャに限らず、staticの付いてないものはそうだよ
使わない変数なら宣言しなければいいのに。
>>823 一般的に言って、スタック上のメモリ確保はものすごく速い。
827 :
デフォルトの名無しさん :2005/11/07(月) 18:11:21
828 :
デフォルトの名無しさん :2005/11/07(月) 18:17:04
例えばint型変数の宣言のように、初期値を省略すると0を当てられるもの。 これは宣言時にメモリ上に実体ができている。 ポインタ変数の宣言は、逆にメモリ上に実体ができていず、名前が作られただけ。 更に、staticの場合は、プログラムの最初にメモリが確保される。 すなはちプログラム開始>static変数メモリ確保(場合によっては初期化も)>mainの開始
ポインタ変数の宣言は、逆にメモリ上に実体ができていず、名前が作られただけ。 というのは、もっと明確に言うと、名前はあるけど、値を入れるメモリアドレス無し(入れ物なし、メモリ未確保)。
>>828-
>>831 めちゃくちゃおもしれぇなこのスレ。
この辺がダウト。 >int型変数の宣言のように、初期値を省略すると0を当てられるもの >宣言時にメモリ上に実体ができている >プログラム開始>static変数メモリ確保(場合によっては初期化も) >ポインタ変数の宣言は、逆にメモリ上に実体ができていず、名前が作られただけ >名前はある >入れ物なし >メモリ未確保
事故解決しました。
そうか、大人しく家庭裁判所行ってこい
836 :
デフォルトの名無しさん :2005/11/07(月) 19:54:49
:仕様書無しさん :2005/11/07(月) 19:47:39
http://homepage1.nifty.com/rucio/main/VBdotNet/AboutVB/WhatsVBdotNet.htm Visual Basic.NETではどのようなアプリケーションが作れるのか
Visual Basic.NETではWindows上、Web上、モバイル上で動作するさまざまな種類のアプリケーションが作成できます。
ユーティリティやちょっとしたツール、データベースを操作するアプリケーション、ゲームなどアイディアしだいでさまざまなものが作れます。DirectXと連動して3Dやポリゴンを利用したゲームを作ることもできます。
ただし、プレイステーションなどの家庭用ゲーム機のゲームのほとんどはC++という言語で開発されていることに注意してください。このような本格的なゲームプログラマを目指している方はC++を勉強してください。
けれどVBに熟達すればC++にも通じるようになります。(とはいえC++が目的ならはじめからC++を勉強した方が早いです。)
>>828 >>830 ポインタ変数だって変数であることに違いはないのだから、ポインタ変数自体の実体がある。
>>837 ゴミが入っているから、そこに値とか格納すると危なかったような。
下手するとフリーズやシステムを壊しかねない。
参照先のアドレスは値とは言わないの?
鰻には山椒。
ポインタ変数はアドレスを格納する変数 当然、ポインタ変数を宣言(正しくは定義)したときに そのアドレスを格納する領域がメモリ上に確保される ただし、宣言(正しくは定義)したポインタ変数に 適切な値(もちろんアドレスだ)を代入しない限り そのポインタを逆参照することはできない
>>838 それが「適切なアドレスが格納されてないポインタ変数を逆参照しようとした」ってこと
基本的に対応する必要がないのは分かっているんですが、 _gcvt関数のようなもので、LPTSTR型にも対応できるようなものってあるんですかね? そもそもLPTSTRとchar* で混ぜて使ってかまわないんでしょうか。 (そこら辺がどうもはっきりしなくて。Unicodeとかwchar_tとか)
LPTSTRなら、TCHAR[]使えばいいとおもうが。
>>844 TCHARは_UNICODEの指定があればwcharになり、なければcharになる
>>844 UNICODEが定義されている/されていないに関わらず動作するコードにしたい
ならば、当然変換すべき。
そのための変換マクロその他がVC++には多数用意されてる。
ATLのCT2A他を使うなり、_bstr_tに頼るなり、まあ方法は色々あるが
好きにしる。
WCHAR*とCHAR*の相互変換をするためだけにatlbase.hをインクルードするのって微妙かな?
ポインタの説明をするのに、アドレスを持ち出すのは初心者の証拠
850 :
デフォルトの名無しさん :2005/11/07(月) 23:25:14
上級者らしい説明期待age
852 :
デフォルトの名無しさん :2005/11/07(月) 23:26:46
C++ の記述で、 変数の後に&があるケースは どういう意味で解釈すればよいでしょうか? アドレス? 変数の実体? 例:func(A& ,B&);
コンパイルエラー
>>852 そりゃ変数の後じゃなくて型の後だ
で、それは参照
855 :
デフォルトの名無しさん :2005/11/07(月) 23:45:58
>> 854 勉強不足ですいません。 &は参照型を意味するでよいでしょうか。
型名&って書いてあったらな
変数の後に&があった場合はビット演算子の&かな?
&変数名ならアドレス演算子 こいうところがC++のややこしいところだなw
>>845 >>846 >>847 なるほど。やっぱりTCHARの方が良いのか…
そこで、
double型をLPTSTR(TCHAR *)の文字列に変換する関数ってありますか?
ところで
>>848 はどうなんですか?なんか他にスマートな方法ってあります?
_bstr_tならATLはいらんよ
int n = 1; int& r = n; int* pn = &n; int* pr = &r ; (pn == pr) == trueですか?
if((a && b) || (!a && !b))を短くしたく、if(a ^ !b)と書いてしまっていた。 if(!!a ^ !b)としないといかん。 文字列に文字や文字列を追加したく、 sprintf(str, "%s%c", str, 'a');としてしまっっていた。 VCではOKだが、BCCだと後ろの文字のみになってしまう。 多次元配列は、一応右の様に初期化するべし。hoge[5][5] = {0};
865 :
デフォルトの名無しさん :2005/11/08(火) 07:25:38
>> 856 587 858 教えていただきありがとうございました。
>>864 >if((a && b) || (!a && !b))を短くしたく、if(a ^ !b)と書いてしまっていた。
>if(!!a ^ !b)としないといかん。
そのように書き直しても、厳密には未だ等価ではない。
>多次元配列は、一応右の様に初期化するべし
そうとも限らん。
>sprintf(str, "%s%c", str, 'a');
例えばこう書けばいい。
sprintf(strchr(str, '\0'), "%c", 'a');
慣れりゃどーってことないけど、もうちょっと別の方法もあったかもしれないね。 といった程度かと。
>>863 そだよ。それが参照およびポインタ変数。
872 :
デフォルトの名無しさん :2005/11/08(火) 12:05:17
こんなに保守のことを考えずに、コーディングしてるヤシが多いとは。 絶対に一緒に仕事したくねー。
>>863 難解だと思ったら、そんな書き方やめりゃーいいじゃん。
>>862 そんな便利そうなものがあったのか
キャストだけでどっちにも対応できるってのは良いな
質問になります。 Windowsでこんな処理がある時、 while(1){ printf("HelloWorld\n"); } 速度が落ちても良いのでCPU使用率を下げる為に while(1){ printf("HelloWorld\n"); sleep(1); } こんな事をしています。 これをLinuxでやろうとするとsleepの単位が秒でした。 さすがに1秒は待てないのですが、なにか良い代案はないでしょうか。
877 :
デフォルトの名無しさん :2005/11/08(火) 16:48:51
つusleep
WinのSleepみたいに、sleep(0)とやると 残りのタイムスライスを他のプロセスに譲るようにはならないのか?
>>877 調べてみました、うまくいきそうです。
ありがとうございます。
>>878 sleep(0)試してみました。
こちらもうまくいきました。
両方単純なプログラムで試してみたところ、
sleep(0)の方がCPU使用率5%位でかなり早い。
usleep(1)or(0)だと、CPU使用率がほとんど0%で遅い。sleep(0)の1/50位かなぁ。
用途に合わせて洗濯してみます。
ありがとうございました。
じゃぶじゃぶと。
綺麗好きはいいことよ
あぁ洗濯になってるのか。 コンパイルエラーでなかったよ。
new 演算子と delete 演算子 使うメリットは?
スコープ解決演算って何?
>>884 int+ nullpo;
int main()
{
int* nullpo;
nullpo = 0;
::nullpo = 0; /* こういうの */
return *nullpo;
}
class Hoge { public: int func(int a) { return a-::func(a); // こういうの } } int func(int a) { return a+5; }
コンパイルできない? #include<stdio.h> int+ nullpo; int main() { int* nullpo; nullpo = 0; ::nullpo = 0; /* こういうの */ return *nullpo; } ↑これじゃだめなの?
コンパイルできないならエラーが出てるだろ そのエラー見て直せ そして帰れ
>>883 コンストラクタ・デストラクタが呼ばれる。
型安全。(new intとするとint *型で返してくれるのでmalloc()などと違いキャスト不要)
>>867 採点してくれてサンクス。
勉強になった。
>>871 分かった。
>>872 個人製作だから、それは大丈夫だけど、
エラーチェックは特に気をつけるようにする。
二次変数ってどうやるの? #include<stdio.h> void main(void) { int x[5.5]; x[0.2]=2; printf ("%d\n",x[0.2]); } ↑勘で作った・・・動かん!
2次変数なんて聞いたことも無い
>>891 勘で直した。
#include <stdio.h>
int main(void)
{
int x[5][5];
x[0][2]=2;
printf("%d\n", x[0][2]);
}
894 :
デフォルトの名無しさん :2005/11/08(火) 22:31:55
すみません、質問があります。 最近、Borland C++Compiler + Cpad環境で Cを始めたのですが、 #include <stdio.h> main() { printf("あいうえお"); return 0; } というプログラムを実行すると、Cpadではうまくいくのですが windwsのdos窓からコマンドラインでコンパイル指示すると Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland test.c: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland と出力され、命令した文字が表示されません。 これはどういう事なのでしょうか? 自分なりに調べてはみたのですが結局わかりませんでした。
>>894 コンパイルは機械語への翻訳でしかない。
出来たexeファイルを実行しろ。
IDEって便利だよね。
>893 thx
899 :
894 :2005/11/08(火) 22:41:02
>>895 そういう事なのですね。解決しました。
本当にありがとうございました!
だれも言わないようなので俺が変わりに言っておく
>>894 ←お前馬鹿だろ?プログラムとかそういうの以前にw
>>860 すまんです。 言葉足らずでした。
その関数はなんという名前でどういうものですか?
MSDNで調べても巧くヒットしなくて
>>900 いやね、全くの初心者がサイトの情報だけではじめるとこうなっちゃうんだよ
それは仕方がない
だからちゃんとした入門書買えと繰り返し言うことになるんだが
質問です。 #define INPUT_MAX 19 があるとして、これを printf()の文字幅(と言うのかな?)の指定に当てたいのですが、 ""内に入れると、そのままINPUT_MAXが出力されてしまいます。 こういった場合はdefineは使えないのでしょうか?
>>904 プリプロセッサを駆使すればなんとか出来る。
#include<stdio.h>
#define T(S) #S
#define TT(S) T(S)
#define INPUT_MAX 19
int main(){
int x=10;
/*
Tを直接呼び出した場合、"INPUT_MAX"と展開されるので
二重に展開するためにTTを使う。
*/
printf("x = %"TT(INPUT_MAX)"d",x);
return 0;
}
>>905 回答ありがとうございます。
知識が追いつかないので、今回はdefineを使わずに行こうと思います。
907 :
デフォルトの名無しさん :2005/11/09(水) 11:19:02
printf("x = %*d\n", INPUT_MAX, x);
じゃあ、もっと簡単に理解そうな方法を。 printf の第一引数(たぶんchar*)に渡す文字列を、配列なりにしてあらかじめ用意しておく。 これならsprintfとかで INPUT_MAX の値を埋め込むことも出来る。 で、printf ( string , x ) とかすれば。 効率悪い? 速度遅い? ソースが汚い? 知るかボケ
>>906 sprintf(a, "\%%dd", INPUT_MAX);
printf(a, ...);
printf系の書式指定はあくまで文字列
何もその場で""で囲んだリテラルを指定しなきゃいけないわけじゃないことを忘れるな
910 :
初心者 :2005/11/09(水) 11:39:23
VC6.0がgraphcis.hのheadfileのincludeできないでしょうか?? できなければこのheadfileついているプログラムはどうやってビルトしますか?? 是非教えてください
>>909 最後2行には同意だが、なんだそのイッちゃったプログラム・・・
>>910 そのheadfileをおまえのVC6.0がファイル検索できるディレクトリに入れりゃいいだろ
>>910 はもはや日本語じゃないな。
ゆとり教育の弊害って奴か。
そもそもgraphcis.hってなんだ?
ぐぐったら、もしかしてgraphics.hと指摘されたが、
DOS時代の、Turbo C++付属のライブラリのヘッダのことか?
まさかいまどき、そんなはずはないし。
>>909 printf("%*d", INPUT_MAX, ...
>>907 >>914 こんな簡単な事だったんですね。
自分の書き方が悪かったばかりに、
皆さんに難しく考えさせてしまって申し訳ないです。
916 :
デフォルトの名無しさん :2005/11/09(水) 15:13:21
>>910 は昔のゲームプログラミングの本で勉強している可能性があるな
むしろやさしく教えてあげるべき。俺はしらん
何その怪しいべき論
>917の言ってることが正しいとしよう >910には「その本捨てろウンコタレ」とレスしてあげるべきだな
なんとくなクラスが分かったぞー 構造体の進化版なんだろー! ハッハッハ リスト構造わかんねー ハッハッハッハッハ
>>921 クラス使うのヤメレ。というかやめてくれ。
その理解でクラス使うと絶対に後悔する。
ハッハッハッハ!
質問です。 C++のテンプレートに興味を持ち色々試行錯誤しているのですが template<class T> void test(){ printf("%d\n", sizeof(T)); } void main(){ test<int>(); test<char>(); } とやると、testのprintfで両方とも 1 が出力されてしまいます。 私は 4 1 と表示されることを期待していたのですが、異なった引数を持たない場合関数が上書きされてしまうのでしょうか? testの引数に test(T tmp)としたら期待通りの動きになりましたが…。
template <class T> void test(T x) { printf("%d\n", sizeof(x)); } void main() { int a; char b; test(a); test(b); } やるならこうだろ テンプレートクラスじゃねぇんだぞ?
なるほど。やはり引数が同一になってしまうとそうなるわけですね。 テンプレートクラスのstatic関数にするという手もありますし、検討してみます。
>>925 コンパイラのバグかと。
手元のg++では
4
1
と表示された。
>>925 2003では期待通りの出力がされた。
VC6だったらコンパイラがヘタレなので投げ捨てろ。
質問。 void* operator new[](size_t t); でtの値を調べていたところ、 intやcharならそのままのサイズ。つまり4*x個や1*x個のバイト数になり クラスだとさらに+4バイトだけかかることに気づいた。 この余分な4バイトは何なんでしょうか?
>>928-929 VC6です(つД`)
まぁテンプレートクラスのstatic関数にしたらうまくいったので、こっち使います。
932 :
930 :2005/11/10(木) 14:07:52
補足説明。 new int [8]; // 4*8=32バイト new char [4]: // 1*4=4バイト new CHoge[4]; // sizeof(CHoge) * 4 + 4バイト になります。
>>930 コンパイラの実装しだい。
どのコンパイラのどのプラットフォームなのかもわからないけど、
thisじゃないのかな?
>>930 多分配列の要素数。
クラスの場合 delete [] 時にデストラクタを呼ぶ必要があるので要素数が必要になる。
VCでは先頭アドレス-4の所に要素数が格納されているようだが、実装依存なんで気にするな。
>>933-934 ありがとう。
助言をもとに返されるアドレスから4バイトさかのぼってintに変換してみたところ、わけのわからん数字が…。
[1] だと 4
[2] だと 5
[3] だと 5
[4] だと 6
[5] だと 11
うーむ、謎。まぁ実装依存ということで。
要素数だとしたら、intやcharの時も入ってないと変じゃないか?
その4バイト遡るってどうやって計算したんだ
>>936 デストラクタが必要ないから要素数は必要ない。
>>937 単純に
*(int*)((byte*)p - 4)
しただけなんだけど、間違ってたかな?
>>939 これじゃだめなのかな。
*((int *)(p) -1)
クラスでもデストラクタが無くPODなら領域を解放するだけなので要素数は無かった。(VC2003)
>>940 sizeof(CHoge)バイト戻るのでダメ。
943 :
942 :2005/11/10(木) 14:26:11
間違った。忘れてくれ。
>>939 デバッグでちゃんと4バイトだけ戻されてるの確認した?
>>903 なるほど。TCHARを直接引数に定義してあるのばかり探してました…
こうやって、臨機応変にcharとwchar_tで使い分けられればよいわけですね?
int DtoS(char *buffer, double value) {
return sprintf(*buffer, "%.18G", value);
}
int DtoS(wchar_t *buffer, double value) {
return swprintf(*buffer, "%.18G", value);
}
や、
#ifdef UNICODE
#define DtoS(buffer, value) swprintf(buffer, "%18G", value)
#else
#define DtoS(buffer, value) sprintf(buffer, "%18G", value)
#endif
みたいなかんじで。
>>945 ??
後者を自動的にやってくれるのが、_stprintfですよね。
一度ヘッダを見てみることをオススメします。
UNICODEなんてCOMでしか使わないだろw つーかIWebBrowser2を使ってるときになんでわざわざ WideCharToMultiByteを使ってSJISに変換しないといけないんだと・・
const型を付けて受け取ったポインタを、const無しの同型ポインタに代入(or変換)する事は可能ですか? コンパイル時にエラーになると思うのですが、constを外す事以外で回避できる書き方でもあるのでしょうか? char *func(const char *a) { char *b; b = a; return b; }
>const型を付けて受け取ったポインタを、const無しの同型ポインタに代入(or変換)する事は可能ですか? 可能。 char *b = (char *)a; >コンパイル時にエラーになると思うのですが、constを外す事以外で回避できる書き方でもあるのでしょうか? 質問の意味がわからんので、説明してくれるか?
>>948 const_castを使う。
char *func(const char *a)
{
char *b;
b = const_cast<char *>(a);
return b;
}
>>947 いずれすべて、UNICODEになるさ。
NTカーネルでは、ANSIのAPIは、ワイド文字に変換して、丸投げだからな。
でもなぜXPでもGetAddrInfoW()がないんだろう……。
>>949 ,951
普通にキャストできたんですね。ただの勘違いでした。
ありがとうございました。
VB.NETになると強制UNICODEだからな
>948 エラーになるのは訳があるわけだが、ちゃんと理解してるのか? const_castが必要というのは、基本的に設計が悪い。
自分じゃなくライブラリの設計が悪いことも多いがな。、
958 :
948 :2005/11/10(木) 17:07:22
>>956 constをポインタに付けると、そのポインタを介した値を書き換えようとした時にコンパイラが警告を出す、で正しいでしょうか。
確かに設計に問題があると思ったので既に改善しましたが、気になったので質問させていただきました。
>>946 あ、ホントだ…
全然、全く、知りませんでした…orz
ところで、また根本的な質問なんですけど、 TCHAR と _TCHAR では基本的に同じものと考えて良いのですか?
どう定義されてるか見ればいいだろ。
質問です。 operator new と operator new[] をオーバーライドしているのですが、 char *p = new char [4]; が とあるクラスの中ではoperator new に飛び、 とあるクラスの中ではoperator new[] に飛びます。 特に不具合は起きていないのですが、なんとも気味が悪いです。 原因の心当たりがある方はいらっしゃいませんでしょうか。 charの配列のため、生成しようとしているもののoperator newがオーバーロードされているわけでもありませんし…。 この現象が起こるのはVC6.0です。 友達の環境(すいません、聞きそびれました)では両方new []に飛んだそうです。
>>962 直ちにVC6.0を使うのを止めて下さい。
なんつーか、VC6ってアホなバグが多いよな
サービスパックが6まで出てて、バグフィックスされてないの?
もれはvc6からvc7.1に最近入れ替えたんだが コンパイラの最適化の度合いが全然違うぞw 換えてよかったと思ってる 不満点はvc7.1のintellisenseが循環参照してる定義があるとフリーズすることぐらいだよ
何その糞定義
>>961 同じwchar_tですね。
ええ。同じだと分かりました。
>>960 TCHARは<Windows.h>の中の中でインクルードされる<WinNT.h>の中で
UNICODEが定義されているかどうかでcharかwchar_tからtypedefされる。
_TCHARは<tchar.h>の中で_UNICODEが定義されているかどうかでcharかwchar_tからtypedefされる。
ところどころでUNICODEが定義されていれば_UNICODEを定義し、
_UNICODEを定義が定義されていればUNICODEを定義するように書かれているから両者はごっちゃにしても差し支えない。
実質的にTCHARと_TCHARも同一視して良いと思われる。
>>969 え?
>>970 なるほど。一応別物なんですね。
取りあえずごっちゃにしても大丈夫そうだということなのは分かりました(笑)
どうもありがとうございます。
どこをどうしたら別物になるのか・・・
>>972 ありゃ?
どこでtypedefされてるかで違うんじゃないんですか?
>>970 さんが言っているのは、
どこでUNICODEが定義されているかの違いがあるが、
別々(charとwchar_t)のものを指すことはないから同じと見て問題がない
という意味だと思ったのですけど。
…んまぁ 同じなのか。
難しく考えないようにします。(そんなに考えられるような知恵無いしw)
命令一覧表とかってどっかないの?
>>973 UNICODE/_UNICODEを定義するのは自身。
ソースコードでは#ifdefなどで切り分けているだけ。
>>974 C/C++に命令などありませんがなにか。
printf とかって命令じゃないの?
それは関数
へ〜
>>795 命令っていう言葉を辞書で100回調べて来てからその発言をしろ
preprocessor directiveはあるけど他に命令なんてあったっけ?
これって合法?駄目なケースとかある? class Base { public: Base(); virtual ~Base(); }; class Derived : public Base { public: Derived(); virtual ~Derived(); }; void foo(Derived& arg) { Base local(arg); }
983 :
デフォルトの名無しさん :2005/11/11(金) 03:59:12
C++の例外処理には3種類あると聞き、困惑しています。 (catch(Exception *e){}) が当然だと思っていたのですが ポインタで受ける(catch(Exception *e){}) コピーして受ける(catch(Exception e){}) 参照で受ける(catch(Exception &e){}) の3種があると聞きました…。 この3つの使い分けって何でしょうか? また、どれを使用するのが望ましいのでしょうか。 初心者房ですみませんがよろしくお願いします。
>>983 効率の問題。
ポインタで受けるには、アドレスを投げる必要があるので面倒。
実体で受けると、例外オブジェクトが大きい場合、コピーコンストラクタの
処理が重くなる。
従って、参照で受けると良い。例外オブジェクトの変更の必要がなければ、
const参照で受ける。
アドレスというか、newしたオブジェクトをポインタで受けるわけだ。 だから、catch節で、deleteしないといけないし。
次のようなお馬鹿なコードは見たことがないが、deleteの必要がない。それだけ。 #include <iostream> #include <exception> #include <memory> class A { public: static char* what() { return "class A"; } }; int main() { try { throw std::auto_ptr<A>(new A); } catch (std::auto_ptr<A> a) { std::cout << a->what() << std::endl; } }
>>985 アドレスを投げるのが面倒って、バカじゃねーの?
VS 2005のExpress Editionは事実上,無償提供へ って本当ですか? これ、仕事にも使っても大丈夫ですよね?
VCTKの時みたいに、最適化コンパイラのままであって欲しいねぇ。
>>990 うわーいと言いたいところだけど、最近2003買ったばっかりなんだよね(´・ω・`)
994 :
デフォルトの名無しさん :2005/11/11(金) 13:00:38
float fp; fp = new float [5]; のようにfloat型へのポインタに5つの配列を宣言しました この時はfp[0]...fp[4]まで初期化しないとおかしな数値が入っているのでしょうか? printf("%f", fp[i]);のようにforでまわしてみたところ-44556.0000みたいになっておりました。 それとも値の参照の仕方が違うのでしょうか?
995 :
994 :2005/11/11(金) 13:01:54
最初の行は float *fp; でした
・領域確保時の値内容はプラットフォーム依存だろ ・参照の仕方はそれでいい まぁ、確保時に明示的に0で埋めておくのが一番安全だろう
997 :
994 :2005/11/11(金) 14:12:14
ありがとうございます! 初期化って大切ですね(´・ω・`) これに気づかず数時間も悩んでました
>>997 vectorがおすすめ
994相当のことをして100で初期化するとすると
vector <float> fp (5, 100);
///
printf("%f", fp[i]);
こんな感じ
999 :
994 :2005/11/11(金) 15:02:01
ウホッ!いい初期化! ありがとうございます vector使うだけで見た目も量もいいですねぇ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。