【初心者歓迎】C/C++室 Ver.2【環境依存OK】
1 :
デフォルトの名無しさん :
03/10/27 02:30
2 :
デフォルトの名無しさん :03/10/27 03:44
乙
お、立ったか。 >1乙
6 :
デフォルトの名無しさん :03/10/27 23:49
自作のフリーソフトをバイナリのみ公開する場合、 ヘタに最適化しちゃうとソフトの開発環境以外じゃ 遅くなったりするんでしょうか? とりあえずgccとbccとvc++ではどのくらいの最適化が ベターなのか教えてください。
8 :
デフォルトの名無しさん :03/10/28 11:45
今時、P5もないだろ。P6で十分
c言語の文法はだいたいおぼえたのですが自由にプログラムが組めません "習うより慣れろ"らしいですが、何も作れないのになにを作って慣れろと言うのでしょうか?
>>9 アルゴリズム、設計なども学んで下さい。
文法だけではプログラムは組めません。
何も作れないってことはないだろ。 漠然と夢見てる「ものすごいぷろぐらむ」は当然まだ作れないだろうけど。
>>11 参考になるコードのある場所教えてくれ
>>10 アルゴリズムは一応学んだよ
>>12 ファイルに書き込むとかデータの並び替えとか、その程度です
14 :
デフォルトの名無しさん :03/10/28 15:31
delete [] 配列名; で、なんかエラーが出るので、 配列名 = NULL; こうしてみたのですが、 このやりかたで、メモリ解放できているのでしょうか?
>>14 ( д ) ゚ ゚
できてるわけないだろうが
16 :
デフォルトの名無しさん :03/10/28 15:35
じゃあ、どうして delete [] 配列名; のときに、エラーが出るんでしょうか? ちょっと関数付け足したら、いきなりエラーがでて困ってます。
>>16 ・newに失敗してる(bad_alloc例外が発生)
・途中でそのポインタになにか代入してる
18 :
デフォルトの名無しさん :03/10/28 15:42
・途中でそのポインタになにか代入してる というのは、どういうことですか?
>>18 char *sage = new char[16];
sage = "sage";
delete [] sage;
というかソース晒してくれ
20 :
デフォルトの名無しさん :03/10/28 15:53
たぶんソース晒しても意味ないと思いますが。一応。 unsigned char* pimageBGR24 = new unsigned char[ image.iCols * image.iRows * 3 ]; if( ::flycaptureConvertToBGR24( &image, pimageBGR24 ) == FLYCAPTURE_OK ) { //↓この関数を付け足すと、エラーが出る。 ::flycaptureStippledToBGR24(context,&image,pimageBGR24); ::flycaptureInplaceWhiteBalance(context,pimageBGR24,image.iRows,image.iCols); ::flycaptureWritePPM(pimageBGR24,image.iRows,image.iCols,"image.ppm"); } delete [] pimageBGR24; //error原因 各関数の定義とかは、ソースがないのでわかりません。 (ライブラリとかになってる。)
十分な領域確保してないとかじゃねぇだろーな
22 :
デフォルトの名無しさん :03/10/28 16:01
エラーメッセージはこうです。 Debug Error! Program:C:\WINDOWS\system32\java.exe DAMAGE:after Normal block (#41) at 0x0B360040. JNI使っているので、system32\java.exeという場所が出てきます。
ちなみに、 //↓この関数を付け足すと、エラーが出る。 ::flycaptureStippledToBGR24(context,&image,pimageBGR24); を付け足すと、出力画像がカラーになります。(消すと白黒)
いやもう、必要なサイズちゃんと確保してるのかとか、 そもそもiCols、iRowsの設定値を確認するとかしろよ。
画像サイズは1024,768で、ppmには1画素3バイトで書き込みます。 で、 printf("%d",image.iCols); printf(" %d",image.iRows); したら、1024 768と出力されたので、サイズは大丈夫です。 画像はちゃんとしてものが、出力されてるし。
new直後とdelete直前のpimageBGR24の値は同じ?
printf("%X\n", pimageBGR24);
unsigned char* pimageBGR24 = new unsigned char[ image.iCols * image.iRows * 3 ]; を unsigned char* pimageBGR24 = new unsigned char[ image.iCols * image.iRows * 4 ]; にしたらエラーなくなりました。 これは、メモリ確保は多めにとるけど、 解放できるっていうことでいいですか? 一応動けば、メモリ多めにとってもいいですよね?
その一連の関数の仕様によるだろう、マニュアル嫁よ。 何かパラメータの設定間違ってるとかじゃないのか?
>>30 多めに取るのは別に問題ない。
が、それで本当に必要なサイズ確保しているか保証が無いのは問題なのでは?
気にしないというなら勝手にしてくれと。
>>31 すいません。
英語で面倒だし、いつもJava使ってるのでC++わからないし、
って感じだったので、マニュアルほとんど読んでません。
お騒がせしました。
また何かあったら助けてください。
33に追加ですけど、 1024,768サイズで、キャプ画像が2305KBなので、 unsigned char* pimageBGR24 = new unsigned char[ image.iCols * image.iRows * 4 ]; で、十分ではないのでしょうか? その辺、よくわからないので教えてください。
いや…そのへんの仕様はドキュメントに書いてあるんだろ、読めよ。
少なくともバッファは iCols * iRows * 3 バイト必要と書いてあるだけでした。
37 :
デフォルトの名無しさん :03/10/28 17:31
Windowsだと標準Cライブラリ使うと遅かったりサイズが 大きくなったりすると聞きましたが本当でしょうか。 それでWin32APIだけで行くとすると ・printf系の書式指定で%fや%eや%gが使えない というあたりが違うのかなと思ったのですが、 他にもなにか違いがあるでしょうか。
>>1 標準Cライブラリを使うと、使った標準Cライブラリの分だけコードサイズは大きくなります。
また、標準Cライブラリの関数を呼び出すと、呼び出された関数が処理を行う分だけ処理時間が
かかります。。。。。てか、これどんなOSでも同じ。
Win32 API だけで処理を行う場合には、主として:
・文字は char ではなく TCHAR を使う
・fopen 系のバッファ付きファイル I/O は無いので、ファイルを細かい単位で多数回読むなど
不適切なコーディングをすると遅くなる。
あたりに気をつければ良いと思います。
wsprintfのbufに上限がある、というのは陥りやすいワナだな。
サイズが大きいのは正しいが遅いのは間違いだろ。
>>9 なんかデジャブを感じる質問だが、はて?
それはさておき、一応マジレスしておく。
>c言語の文法はだいたいおぼえたのですが自由にプログラムが組めません
当たり前。自由に作れるようになるにはかなりの経験が必要。
1年や2年勉強したぐらいじゃとうてい無理。そんなの常識で判るだろ?
>"習うより慣れろ"らしいですが、何も作れないのになにを作って慣れろと言うのでしょうか?
サンプルコードなんざWEBを漁ればいくらでもある。入門書を買ってくるのでもいい。
んなところですねてる暇に、行動しろや。
それから、具体的な回答がほしかったら自分の環境を具体的に晒せ。単にC言語じゃ幅が広すぎ。
>>38-40 なるほど、どうもありがとうございました。
wsprintfのバッファ上限が1024?バイトというのは知っていましたが、
バッファつきI/Oには気がつきませんでした。
勉強になります。
>>41 >1年や2年勉強したぐらいじゃとうてい無理。そんなの常識で判るだろ?
出来ましたよ。常識と経験談の区別を付けましょう。
どの段階で自分の思い通りの振る舞いをとるプログラムを 思い通りのコードで書けるようになったって思うかっていう判断の問題
教えてください。 class CDerived : CBase { public: CDerived(); ~CDerived(); protected: CEdit *pEdit; } CDerived::CDerived() :pEdit(NULL) { } というソースがあったのですが : pEdit(NULL) のところがわかりません。 継承でもないし…
初期化リスト
>>45 プロパティの初期化はそこでするんだよ。
古い本だと中カッコの中でやってるのもあるけどね。
ちゃんとした入門書を一冊手元に置いときましよ。
ありがとうございました。 私の持ってる本には書いてなかったもので…
49 :
デフォルトの名無しさん :03/10/29 20:42
ものすごく基本的な質問なんですが、教えてください。 bcc55を使ってコンパイルしようとすると インクルードファイル 'iostream' をオープンできない と怒られます。 Pathの設定もしたし、bcc32.cfg,ilink32.cfg ファイルも設定しました。 というか1週間前まではコンパイルできたファイルも同じエラーになってしまいます。 ぼすけてください。
50 :
デフォルトの名無しさん :03/10/29 21:06
VC++6.0です。 class Cwin { public : LRESULT (Cwin::*pfunc)(hwnd,msg,wp,lp); LRESULT func1(hwnd,msg,wp,lp); LRESULT func2(hwnd,msg,wp,lp); } という自分のメンバ関数へのポインタを持っている APIラッパークラスを作っています。しかしこれを使おうとしたら LRESULT gulobalfunc(Cwin* cw,hwnd,msg,wp,lp){ LRESULT res; res = (cw->*(cw->pProc))(hwnd,msg,wp,lp);///←ココ return res; } 矢印の部分でエラーが出ていたので上のように修正したら コンパイルは通るのですが、制御が返らず落ちるようになりました。 どうなっているのでしょうか?
例外処理 (初回) は APIRap.exe (KERNEL32.DLL) にあります: 0xC00000FD: Stack Overflow。 ↑のエラーがでていました。
gulobal? グローバル?
すいません。解決しましたm(_ _)m
>>49 その一週間でなんか変わったんでしょ。
もう一度pathやら*.cfgやらの設定を確認してごらん。
あと、インクルードファイルが存在するかどうかもね。
56 :
デフォルトの名無しさん :03/10/29 23:33
include<stdio.h> main(){ int a[5]={3,8,2,4,9}; int i,j; int min; int temp; printf("配列「"); for(i=0;i<5;i++) printf("%d,",a[i]); printf("」を昇順に並び替えると「"); for(i=0;i<5;i++){ min=i; for(j=i+1;j<5;j++) if(a[j]<a[min]) min=j; temp=a[i]; a[i]=a[min]; a[min]=temp; } for(i=0;i<5;i++) printf("%d,",a[i]); printf("」になります\n"); } このforの部分をwhileに置き換えてください。
58 :
デフォルトの名無しさん :03/10/29 23:52
>56 エディタなんかで置換すれば一発じゃん。
while(i=0;i<5;i++)
>>56 #include<stdio.h>
main(){
printf("配列「3,8,2,4,9,」を昇順に並び替えると「2,3,4,8,9,」になります\n");
while (0);
}
62 :
デフォルトの名無しさん :03/10/30 00:21
すいません、前スレで少し教えて頂いたんですが、上手くいかないので質問させてください。 1)フォルダを検索してリストビューに高速で表示したい。システムイメージリストから抜いたアイコン付きで。 2)でもファイルが見つかるたびにSHGetFileInfoしてアイコンのインデクス値調べてたら 表示が遅くなることこの上ない。 3)では拡張子とそれに対応するアイコンのインデクス値をどこかに登録してしまおう。 一度調べた拡張子は即座にインデクス値だけ返してくれればいいや。 ※以下がコードです。 class IndexMap { std::map<AnsiString, int> index_map; public: int operator()( const AnsiString& ext ) { if ( index_map.find(ext) == index_map.end() ) {//この拡張子名ですでにインデクス値が登録されているか調べる //登録がないようなので拡張子に対応するインデクス値を調べる SHFILEINFO fileinfo; ::SHGetFileInfo( ext.c_str(), NULL, &fileinfo, sizeof(fileinfo),SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SMALLICON ); int const index = fileinfo.iIcon; index_map[ext] = index;//拡張子名をそのまま使ったグローバル変数?を作ってインデクス値を登録 } return index_map[ext]; } }; 一応アイコンのインデクス値はちゃんと返ってきます。 しかし、拡張子名(ext)を使った登録に失敗してるようで全部ifの中身が実行されてしまいます。 よろしければ正しいやり方をお教え願えないでしょうか…
AnsiStringにoperator<()って定義されてたっけ?
64 :
デフォルトの名無しさん :03/10/30 00:31
>>62 コントロールかなんかでそんなのなかったっけ?
>>62 IndexMap のインスタンスはちゃんと保持しているよね。
毎回新しく作ってたら意味無いよ。
てか static にしとけって行ったのに。。
>>62 //引数はパス付きファイル名
int operator()( const AnsiString& filename ) {
if ( index_map.find( ExtractFileExt(filename).LowerCase() ) == index_map.end() ) {//この拡張子名ですでにインデクス値が登録されているか調べる
//略
index_map[ExtractFileExt(filename).LowerCase()] = index;//拡張子名をそのまま使ったグローバル変数?を作ってインデクス値を登録
}
return index_map[ext];
}
};
引き続いた質問を複数のスレに上げるのはマナー違反だよ。情報が分散されてしまう。
だいたい、スレが変わってもどうせ回答者は同じだからね(w
おまけ。STLのお薦めサイト
ttp://www005.upp.so-net.ne.jp/episteme/html/stlprog/index.html わたしゃ、この単行本でSTLを勉強しました。今じゃWEBでタダで読める。
ttp://www.wakhok.ac.jp/~sumi/stl/ お手軽リファレンス。実用度は高い。
↑ 書換え忘れ return index_map[ext]; return index_map[ExtractFileExt(filename).LowerCase()]; なお、staticにするに必然性はない。
>>67 システムイメージリストはシステムにひとつしかないから、
アイコンインデックスとアイコンの対応は常に一意。
67 の推奨するコーディングスタイルでは、こういった一意性を
どう記述するの?別途設計書にでも書いておく?
ああ、何か中学の時学校さぼってゲーセン行ってたら先生に見つかった気分だ(;´Д`) 情報が分散されないように出来るだけ新たな要点をしぼってわかりやすく書くことを心がけてるんですが、 スミマセン。でも質問するたびに得るものがあって本当に助かってます! で、やはり今度も、、、出来ませんw ああ…(;´Д`) 同じようにアイコンのインデクス値はきちんと返ってくるんですが、やはり登録が上手くいってないようで、 すべてifの中身が実行されてしまいます。 例えば239個のファイルでifの中を通るたびにカウントしたら、。カウント結果はやはり239。 65さんの > IndexMap のインスタンスはちゃんと保持しているよね。 > 毎回新しく作ってたら意味無いよ。 というのが核心をついてるんでしょうか…。 あにはからんやそのインスタンスの保持とやらの仕方がわからないんですが…。
>>69 だからFormのメンバとしてに1つ持たすんだって。前スレで出てるでしょ。
こういうふうに情報が分散すると自分が困るんだよ(w
例えばこういうこと。 void foo() { for (...) { IndexMap m; // <- 毎回新しい IndexMap (が作られる) int index = m("bmp"); // <- 毎回 SHGetFileInfo 等が呼ばれる } } void bar() { IndexMap m; for (...) { int index = m("bmp"); // <- 初回だけ SHGetFileInfo 等が呼ばれる } }
フォームを閉じるたびに記憶喪失を起こして構わないなら,70 が適切だと思います。
できた!!!速!!!リストビュー表示、劇的に早くなりました!
マジでヤムチャがスーパーサイヤ人化した勢いです!!
ありがとうございます!
>>63 引数に拡張子飛ばしただけでもいけたのでオーケーなんではないでしょうか。
>>66 お薦めサイト。
検索かけても上手くまとまってるところがあまり見つからなかったので、
ありがとうです!
>>70 前スレでもFormのメンバとして使うってのがよくわからなかったんですが、おかげですっきりしました。
class内の関数呼ぶと値は保持されずに呼ばれるたびに生成されちゃうんですね。
オナニーで例えるなら、クラスは単に右手で作ったワッカの形のようなもので、
実際にせんずりこくには小脇にエロ本がなければならない、と。そういうことですね。
しかし.cppの頭の方にクラスと同じ名前で(今回の場合は)IndexMap m;と書いていれば
そっちの方にガンガン転写してくれるなんて思ったより簡単だ。
>>72 あ、アプリケーション閉じても値を保持させとくことが出来るんですね。
また参考にさせていただきます。
みなさんどうもありがとうございました。
74 :
デフォルトの名無しさん :03/10/30 02:46
文字配列を a[1000][1000][3] と定義したとき、 printf( " %s " , a[500][500] ); とすると、3文字以上表示されることがあるのですがなぜでしょう・・・ printf( " %c " , a[500][500][5] ); でも文字が表示できてしまいます・・
printf("%s", "ABC"); で3文字表示されるのはなぜでしょう? printf("%s", "ABCDE"); で5文字表示されるのはなぜでしょう? printf("%c", "ABCDE"[3]); でDと表示されるのはなぜでしょう?
>>74 3文字目に'\0'が入ってない時3文字以上表示されるだろ。
それから[500][500][5]==[500][501][2]だから表示されて当たり前。
海外にフリーのウイルス対策ソフトがあるのに日本には無い! ということで2ちゃんねるで作りませんか? 最初はただ検索してウイルス居るよってことだけわかるソフトで そのうち駆除とか隔離とかつけていきませんか? まずは設計しましょうよ。 スレ立てれないんです。ごめんなさい。
78 :
デフォルトの名無しさん :03/10/30 08:07
>>77 君がウイルス居るよ!まで作れ。
そうでないなら、海外のソースコードフリーの検索エンジン
を探してきなさい。
話はそれからだ。
79 :
c言語入門3ヶ月目 :03/10/30 08:20
cで数値計算しようとおもってプログラムを書いたんですが配列の要素が多くなるとsegmenntation fault を表示してプログラムが動きません配列の数が小さいときは正常に動くのですがどうしてでしょうか。 ちなみにメモリ512M、osはredhat、コンパイラはgccを使っていてプログラムは下のような形です。 どうぞよろしくおねがいします。 #include <stdio.h> int l=50; main(){ int a[l][l][l][l]; int i,j,k,l; for(i=0;i<=l+1;i++){ for(j=0;j<=l+1;j++){ for(k=0;k<=l+1;k++){ for(l=0;l<=l+1;l++){ a[i][j][k][l]=1.0; } } } } }
>>79 3ヶ月もやってりゃ分かるだろ?
それとも釣り?
81 :
デフォルトの名無しさん :03/10/30 08:53
>>79 まず蛆虫の糞のような4重ループの初期化を関数に括り出して名前を付けろ。
低脳が好き好んで使う一文字の変数名を人類のために意味あるものに変えろ。
特にlをもっと分かり易い名前に変えろ。極めて不愉快だ。
それが終わったらsegmenntation faultの文字列と
for文の説明とその汚らしいコードとを交互に10万回見直せ。
そして房にマジレスして懇切丁寧に教えてやった俺様に感謝しろ。
82 :
c言語入門3ヶ月目 :03/10/30 08:54
>>80 今までそんなに大きな配列を必要としなかったので今回のエラーの原因が
さっぱりわかりません。済みませんがレスお願いします。
>>82 //これが正解だ。
int length = 2;
int a[length];
for (i=0; i < length; i++) {
a[i] = 1.0;
}
//これは大間違いだ。
int length = 2;
int a[length];
for (i=0; i <= length+1; i++) {
a[i] = 1.0;
}
//理解したか?
>>79 lの値が mainのなかの int i,j,k,l; の宣言で初期宣言の50とは違う値になってる。
85 :
c?????R????? :03/10/30 09:29
レスありがとうございます。 81での指摘の通りループをくくり出してみました。綺麗な修正の仕方を教えていただけたら うれしいのですが。それとこのプログラムでもまだsegmenntation faultが出ます。 配列のサイズを修正しましたがどうしてでしょうか? #include <stdio.h> int latticesize=50; main(){ int spin[latticesize+2][latticesize+2][latticesize+2][latticesize+2]; void coldstart(int [][][][]); coldstart(spin); printf("%d",spin[1][3][2][1]); } void coldstart(int spin[][latticesize+2][latticesize+2][latticesize+2]){ int i,j,k,l; for(i=0;i<=latticesize+1;i++){ for(j=0;j<=latticesize+1;j++){ for(k=0;k<=latticesize+1;k++){ for(l=0;l<=latticesize+1;l++){ spin[i][j][k][l]=1; } } } } }
>>85 スタックオーバーフローだろ
4バイト*50*50*50 = 25,000,000
25メガもスタックに確保しようとしたら落ちて当然
解決方法はmallocかnewで確保すること
とりあえず動けばなんでもいいならグローバル変数か、関数内スタティック変数にしろ
あと、
int length=10;
int a[length];
はgcc以外では大抵コンパイルエラーだ
const int length=10;
int a[length];
のように定数を使う必要がある。
87 :
デフォルトの名無しさん :03/10/30 09:48
>>83 を一千万回読め。ディスプレイが焦げ付くほどにな。
C99から定数でなくてもよくなったんだっけ?
>>88 BCC5.6.4とMSC++13.10.3077は定数じゃないとエラー出る
90 :
c?????R????? :03/10/30 10:02
>>86 どうもありがとうございました。早速いじってみます。
91 :
デフォルトの名無しさん :03/10/30 10:33
a
92 :
デフォルトの名無しさん :03/10/31 02:32
char *noum[100]; //1.ポインタ+配列 char noum[100][100]; //2.100x100配列を定義 int i=0; while(!fin.eof()){ fin.getline(noum[i], 100); cout << noum[i] << endl; i++; } 上のように,2つの配列定義があります. 1番のポインタ+配列の場合Segmentation faultになります. 2番の場合は大丈夫なんですが,理由がわかりません. 1番でも100x100配列が実現できていると思うんですが.
> 1番でも100x100配列が実現できていると思う どこで?
>>92 1.要素数100個のポインタ配列
2.要素数100x100個のchar配列
なので1.のほうは高々ポインタを100個格納するスペースしかありません。
まして、そのポインタがどこを指しているかは何の保障もありません。
char *argv[] だと argv[0] [] [] []... argv[1] [] [] []... argv[2] [] [] []... . . . のような配列になっているから char *noum[100] でも行けると思ったんですが, 何か勘違いしてるのか...
>>95 はい、勘違いしてます。もう一遍勉強しなおしましょう。
>>96 了解っす。
でも俺には合ってるとしか思えない・・・
みなさん回答ありがとうでした。
だからサ、ポインタってのはインスタンスに対するハンドルな訳よ。 ポインタをつくっただけで、対応するインスタンスが生成される訳では全くない。 実体は別に確保しなきゃ。 argvは既に存在する領域へのポインタだよ。一緒にしちゃダメ。
>//1.ポインタ+配列 >//2.100x100配列を定義 これ見ただけでポインタ配列を理解できてないことは分かるね。
>>99 それどころか、配列もよくわかってなさそうだぞ。
101 :
デフォルトの名無しさん :03/11/01 00:30
漏れは92じゃ無いんだけど92にちょっと関連した質問なんですが char *[2];と宣言した場合はchar型のポインタが2つ確保されるだけだけど char *a[2] = {"anc","defg"}; とした時は 実体の文字列”abc""defg"がメモリ上のどこかに確保されてその先頭アドレスが それぞれアドレスa[0],a[1]に設定されるんですよね?
>>101 そういうこと。
但し、正確にはcharではないし、初期化するなら要素数の指定は無粋。
なのでたとえばこうなる。
char const * a[] = {"anc", "defg", };
>102 サンクスコ
104 :
デフォルトの名無しさん :03/11/01 17:18
漏れのコードには、VCのマイクロソフト固有の組み込みマクロを使った #ifdef _CPPRTTI (_MT, _CPPUNWIND,,,) などの記述があるんですが、 それに相当するBCC上での組み込みマクロの情報が無くて困っております。 どなたか教えてください。 よろしくお願いします。
105 :
デフォルトの名無しさん :03/11/01 20:04
↑ STLport のソース呼んでたら発見しました。 自レスですみませぬ。
106 :
デフォルトの名無しさん :03/11/01 22:24
どうして typedef struct A{ int i,j; }AA; とかやったりするんですか? struct AA{ int i,j; }; じゃ駄目ですか?
>>106 1つの理由は(後々のことを含め)異なった環境に対応するため。
ある環境では
typedef A AA;
別の環境では
typedef a AA;
別の理由は↓を参照。
>>106 C++では後者で充分なんだが、Cでは後者でやると構造体変数の宣言でいちいち
struct AA aa;
みたいな宣言する必要があって面倒だから。
>>106 構造体だということを隠蔽する意味も含まれてるかもね。
凄く親切にありがとうございます。 C++なら別に下でもいいんですね。分かりました。
>>106 C++の構造体は全メンバがpublicになっているクラスになる。
当然、コンストラクタやメソッドも定義できる。
112 :
デフォルトの名無しさん :03/11/01 23:30
参考書に載ってた素因数分解をするプログラム #include <stdio.h> main() { int a, b; printf("2 以上の自然数を入力して下さい : "); while(1) {/* 無限ループ */ scanf("%d", &b); if (b > 1) { break; /* 中断 */ } printf("%d は2以下なので、\n", b); printf("もう一度入力して下さい : "); } printf("%d = ", b); for (a = 2; b > 1; ++a) { while(b % a == 0) { printf(" %d ", a); b /= a; } } printf("\n"); } についてなんですが、17行目の printf("%d = ", b); からの実際に処理をする内容がよく解りません。 for文やwhile文の中身、b/=aは何を表わしているのでしょうか? 長くなってしまいましたがよろしくお願いします。
>>112 b/=a は b=b/a と同じ。つか、こんなの初歩の初歩だろ。
その参考書をよく読め。(;´Д`)ハァ
>>114 初歩的な質問はヲケなんだが、本があるのにそれを読まんというのはアカンぞよ。
読んでも判らんかったら仕方がないけど。
初歩的な質問でも向学心が伺えれば誰かしら相手にしてくれるもんだ。
>112氏もこれに懲りずにガンガって勉強するだ。
>>113-115 ホントすみません。独学で1ヶ月ほど前から始めた超初心者なので・・・
答えていただいてありがとうございました。
a=a+1 → a+=1 という略し方は知ってたんですが、同じく略してるとは気付きませんでした。
もっと本腰入れて勉強したいと思います。
>>115 その点はそのとおり。
だったら、
>>113 はもうちょっと別の言い方があったんじゃないのかと。
>117 ハァがもう一個足りなかったってことだな (;´Д`)ハァハァ
i++と++iの違いは ・演算子の優先順位 ・実行速度(?) の2つなんでしょうか。今ひとつ良く分かりません。 よろしくお願いします。
機能が似ているだけの別演算子
121 :
デフォルトの名無しさん :03/11/02 03:51
f(i++); <=> f(i); i = i + 1; f(++i) <=> i= i + 1; f(i); これで合ってますか?
違います
>>119 戻り値の違いがある。
例えば、n=1; printf("%d", ++n);は2を表示するし、n=1; printf("%d", n++);は1を表示する。
もう一つ、C++での話になるが、iがクラス型で、演算子がオーバーロードされていた場合。
前置の方は、値をインクリメントしてから*thisへの参照を返せば済むが、
後置の方は、インクリメントする前の値を保存しておいて、その値を返す必要が(慣習に従うなら)ある。
++i はiを1増やして、増やした後のiの値を返す i++は増やす前の値を返す ってことですか?
1 増やすとは限らない 2 i++はiのコピーを返し、その後に処理を行う
>>125 >1 増やすとは限らない
char型で0xFFをインクリメントしたら0x00になるとかそういう類の話でしょうか?
>>123 Cをやってるのでクラスの話はちょっとわかりません…
char => unsigned char
>>126 Cならその理解で問題ないと思うよ
ただ、ポインタの場合は増やすのが1とは限らないけどね
ありがとうございました。 今後も精進します。
>>128 ポインタとアドレス値の区別が出来ていないんじゃないか?
>>128 アセンブラ上がりの香具師に多い間違いだが、
アドレス値はsize分増えるがポインタは1しか増えない。
ってことを言いたいんでしょ?>130
ポインタとアドレスなんて区別する必要あるの?
こんにちは。はじめまして。
超初心者です。
>>112 の素因数分解ですが、
for (a = 2; b > 1; ++a) {
while(b % a == 0) {
printf(" %d ", a);
b /= a;
}
}
で、何故素因数に分解できるのかイマイチ理解できません。
C言語というより、数学っぽいので、板違いでしょうか?
>>133 漠然と問いを投げかけられてもね。
b に適当な値を当てはめて、自分で処理の流れを追いかけてみ。
それでも分からなければ、どこが分からないのか詳しく質問してくれ。
数学板に行くほどのもんでもないじゃん。捻りも何にもないし。 ・対象を2で割り切れなくなるまで割り続ける ・対象を3で割り切れなくなるまで割り続ける ・以下同様に対象が1になるまで繰り返す
>>136 素数でない値で割るっていうのは捻りにならんのか?
アルゴリズムの本でも読めば ユークリッド互除法とかと一緒にのってるだろ
141 :
デフォルトの名無しさん :03/11/02 17:36
>>137 まあwhile文以降が帳消しにしてるのでw
char *word; と char* word; にはどういう違いがあるんですか?
すいません、単純な質問です。 関数の戻り値としてint型とAnsiString型の二つの値を渡す場合はどうのように書くのが良いんですか? return文で書こうとしたんですが、出来ませんでした。 return a , b ; //aとbを返す。 出来るだけ簡単なコードで済ませたいので面倒ならどっちかの型にキャストしてもいいんですが。 また呼び元はどのような形でその二つの値を受け取ればいいんでしょうか? どうかよろしくお願いします。
特に効果は変わらない。 気持ちの持ちようが現れてるだけかと。
>>143 それらを構造体にして呼び出し側で構造体のアドレスをその関数に渡すか、参照を渡す
乱暴でもいいんなら pair<int, AnsiString>を返すとかな
>>144 そうなんですか…。ありがとうございます。
>>143 構造体やらなにやら使って一つの型に収めないといけないんだよ。
>>145 >>146 >>147 >>149 大変ありがとうございます。
重いループ処理の中で毎回一時的に使うだけなので、出来るだけ素早い処理をと考え、
結局一つはreturnで返し、もう一つはグローバル変数を一個書き換えることにしました。
不細工ですが、まぁこれが一番簡単で速しのではと…。
どうもありがとうございます。
>>150 それでいいのならそれでいいけど。
他のより速いかどうかは…
152 :
デフォルトの名無しさん :03/11/02 19:49
関数の中で int func(){ static int i=10; return i; } みたいに記述したら、 繰り返しfunc()関数を呼び出したとき そのたびstaticの部分は初期化されますか?
と、いうわけで試してみました。 あ〜、staticの部分は一回初期化されると もう一回通っても実行されないんですね?
目の前で結論が出てるのならここで答えを聞かなくても…
>>155 なんのためにstaticがあるのか考えてみると自ずと分かる
158 :
デフォルトの名無しさん :03/11/02 20:34
ダイレクトXを勉強し始めた超初心者です
ダイレクトX初心者用の参考書に付録でついているCDにサンプルプログラム
がついているんですがを開いてビルドしてみるとなぜかエラーが出ちゃって困ってます
ウィンドウを作るだけの単純なプログラムだしCDに入ってたサンプルプログラム
なんで構文エラーとかはありえないと思うんですが
何が原因なのか全く特定できなくてとても困ってます
SDKは7と8と9をインストールしています
コンパイラはC++.netでOSは2000です
以下はエラー文です
Base error LNK2019: 未解決の外部シンボル _Direct3DCreate9@4 が関数 _WinMain@16 で参照されました。
Base fatal error LNK1120: 外部参照 1 が未解決です。
一応そのサンプルプログラムもうpしときます
ttp://venus.aez.jp/uploda/dat/upload1170.zip
詳しいことは分からぬがリンクさせるライブラリが足りないのでは?
d3d9.libとかそういったのをリンクしろ
161 :
デフォルトの名無しさん :03/11/02 21:16
解決できたんですが ライブラリをリンクさせるのって プロジェクトを作るたびに毎回設定しなきゃいけないんですか? だとするとものすごくめんどくさいんですが 何かいい方法ありませんか?
うーんと、プロジェクトにライブラリを追加してプロジェクトを保存してもダメって事?
サンプルにプロジェクトが含まれているのなら はじめから設定されてるんじゃないの? そうでないならいちいち自分で指定するべし もしくは適当なソースに#pragma入れておくか
ごめんなさい勘違いでしたw いちいち設定しなくてもいいみたいですね 初心者なものでどうもすいません・・・
初心者と言う言葉は免罪符にはならないから気をつけてね
167 :
デフォルトの名無しさん :03/11/02 21:57
( 0 < 10 ) が 1 になるのはC/C++の仕様で決まっていますか? それとも環境によっては1以外になることがありえますか?
わーいやったー
>仕様で決まっていますか? Cではそう。C++は…どうだっけw 真偽値の話はフレームの元なので詳しい話はビビリな漏れにはできません。
ありがとうございました。 a,b,cのうち2つだけ50以上、というのを判定するのに if( (a > 50) + (b > 50) + (c > 50) == 2) ってのを書いたのですが、それは環境によっちゃ正しく動かん、と物言いが入ったもので。 もっと良い判定法があればご教授ください。
>>171 正しく動くので物言いを入れたやつを馬鹿にしてやってください。
どうしてもそいつに逆らえないなら
各項を(a>50?1:0)にしれ
ありがとうございました。 火曜に早速馬鹿にしてきたいと思います。 …惨敗の暁には三項演算子の方向で。
>150 > 一時的に使うだけ のものに > グローバル変数を 使うのは可能な限り避けるべき。 intを返し、引数でAnsiStringの参照かポインタを受け取って、それを変更。
>>168 >>170 Cにしては珍しく曖昧にせずきちんと決められているんだよな。
1と決めたところで汎用性が低下することはないからかな。
>>170 bool->int が 1 or 0 になるように規定されてるようだ。
>>175 多分ビットごとの論理演算子が非短絡論理演算子として機能するようにするためだと思う。
構造体配列のフリーの仕方で質問です。 long WINAPI Func_Get(Struct_A **lppstStruct_A); long WINAPI Func_Free(Struct_A *lpstStruct_A); の関数があり、Func_Getはdll内でnewしているため、Func_Freeを呼んでもらって 領域をフリーしてもらおうと考えています。 どのように書くのでしょうか? for(i;i<Count;i++){ delete [] (lpstStruct_A+i)->xxxx; //@ } delete[] lpstStruct_A; このように書いてみたのですが、@でおちます。 なぜ落ちてしまうのかわからないのですが・・・
>177 確保している部分のソースも晒すべし。
>for(i;i<Count;i++){ iが初期化されてないからマイナスの値になってるとか
>>177 それらの関数は何の為にlongを戻しているの?
Func_Getはnewした領域の先頭へのポインタを戻すのが普通だと思うよ。
失敗、または成功コードじゃねーの?COMのHRESULTのような
改行で引っかかるので2回にわけます。 long WINAPI Func_Get(Struct_A **lppstStruct_A) { longCount_struct //define値; *lppstStruct_A = new Struct_A[Count_struct]; Func_xxxxGet(*lppstStruct_A,Count_struct); return Error_Result; } HRESULT Func_xxxxGet(Struct_A *lppstStruct_A,long Count_struct) { HRESULTresult= S_OK; //省略 for( i = 0; i<Count_struct; i++ ) { int nSize; nSize = strTemp1.GetLength(); lppstStruct_A[i].xxxx = new char(nSize+1); strcpy(lppstStruct_A[i].xxxx, strTemp1); //省略 } //省略 }
183 :
デフォルトの名無しさん :03/11/03 18:37
宇津田篠羽
>>178 これがGetでの確保部分です。
>>179 i=0は記述してます。というかfor省いて
delete [] (lpstStruct_A)->xxxx;
だけでも落ちます。
>>180 >>Func_Getはnewした領域の先頭へのポインタを戻すのが普通だと思うよ。
そうなんですか・・・あまりセオリーとかよくわからなくって。
戻り値はエラーコード用にと思っていました。
先頭ポインタを返したとして、どのように解決できるのでしょうか?
根本的に落ちている原因を把握していないので、解決方法が思い浮かばないんです。
185 :
デフォルトの名無しさん :03/11/03 18:41
delete [] (lpstStruct_A+i)->xxxx; の部分はStruct_Aのデストラクタにやらせればいいのに。
186 :
デフォルトの名無しさん :03/11/03 18:44
>lppstStruct_A[i].xxxx = new char(nSize+1); なんだこれ lppstStruct_A[i].xxxx = new char[nSize+1];
Freeの方がね
>>186 なんでやねん。メモリ確保に失敗したら失敗するだろ。
>>188 >Func_Getはnewした領域の先頭へのポインタを戻すのが普通だと思うよ。
何一点のかわかんね
>>190 ああ、言い忘れたが俺は180じゃない。
>>191 俺も>177じゃないから真意はわかんねーけどさ、
インターフェイスってのは対称性、統一性があったほうがキレイだとおもわないか?
それにNULLとか不正な値渡されたら失敗する時もあるだろ
>>192 NULL以外の不正な値は検知できないのでは?
>>193 newしたアドレスを覚えとけば可能だろ?
>>194 どうやってその覚えておいたアドレスと照合するの?
こういう関数(Func_Free)は呼び出し側が責任を持って適切な値を渡すべきだと思うけど。Cのfreeみたいに。
>>195 環境によってはmallocで確保しておいた領域を記憶してfreeでチェックしてくれるが。
198 :
デフォルトの名無しさん :03/11/03 19:08
キューとかスタックとかツリーってなんですか
>>195 >どうやってその覚えておいたアドレスと照合するの?
そんなことも分かんないの?
>こういう関数(Func_Free)は呼び出し側が責任を持って適切な値を渡すべきだと思うけど。Cのfreeみたいに。
不適切な値を誤って渡した時黙ってメモリ解放市内より、デバックしやすいから、あったほうがいいじゃん
>>197 言い方が悪かった。
要するに
> どうやってその覚えておいたアドレスと照合するの?
は別に難しいことじゃないよって事。
>>199 Func_Getの中で作ったもののリストをつくっておくというアホなことくらいしか思い浮かばない。
アホだな
>>201 ハッシュテーブル等用いればちょーはやくできるけど。そんなことも思いつかないの?
>>203 そんなことのためにハッシュテーブル等を持ち出すなんてアホだと言っているんだが。
206 :
デフォルトの名無しさん :03/11/03 19:16
キーはどうするんだろう?
とりあえずC++の標準で std::set<void *> list; 登録 p=new char[100]; list.insert(p); 探す std::set<void *>::iterator it=list.find(p); if(it!=list.end())
数バイト多めに確保してその前数バイトにマジックナンバーを書き込んでおけば 開放時にかなりの確率でチェックできる。
>>205 アホはお前だよ。黙ってればいいのに。
つーかFreeが絶対に失敗しないっての反証をしてるだけなのになんでこんなアホが絡んでくるのかね?わけわからん
どんな関数でもスタックオーバーフローで失敗し得ます。 もっとも、そんな状況じゃエラーコード返せないだろうけど。
失敗の意味合いが違うからこじれているんだね。 strcpyは失敗しないことになっているけど、きちんと領域を確保しておかないと失敗するかもね。
ちなみにCOMが絶対失敗しないだろうという関数でもHRESULTを返すのは ネットワークの向こうに要るオブジェクトの可能性があり、ネットワークのエラーを返す時があるから。
>>211 当時は間違ったアドレス渡すようなアホPGはいなかったんだろうね・・・。
>>213 もうおまえ本当にキチガイだな。今も昔も間違ったアドレス渡す奴はいる。
お前は絶対にバグをいれないPGなのか?
>>214 お前のいうキチガイってのは俺のことじゃないのか?
216 :
デフォルトの名無しさん :03/11/03 21:01
殺伐としてるナァ・・
さっつばっつ(・∀・)ウヒッ
218 :
デフォルトの名無しさん :03/11/03 22:30
質問があります。 ディスクの種類がベーシックディスクかダイナミックディスクかを判断する方法を探しています。 それを外部モジュールを使わずに、プログラム上から取得できるような方法をご存知ないでしょうか?
IOCTLを使う。 IOCTL_DISK_GET_DRIVE_LAYOUTか、 IOCTL_DISK_GET_PARTITION_INFOを投げる。 PARTITION_INFORMATIONのPartitionType が PARTITION_LDMなら、Dynamic Diskのはず。
で、とにかく>182のバグの原因は >187の指摘部分でFAなのか?>177
責任の所在を明確にしないと破綻します。
222 :
デフォルトの名無しさん :03/11/04 13:25
Cで_や$を識別子に使えるっぽいことを発見したのですが、 使用すると何か問題がありますか? int $ = 3, _ = 0; 例えばライブラリなどで他言語からの利用が出来なくなるとか…
発見… '_'で開始される識別子はシステム予約、ってのはあるけど、 $にもその手の制約・お約束ってあったっけ?
なんかperlとかで困りそう>$ そんなアレな名前の外だしにするヴァカはいないと思うが… あと検索するのにエスケープする必要があるかな
225 :
デフォルトの名無しさん :03/11/04 13:54
>>222 処理系によっては$が使えるらしい
でも使うべきではない
とりあえずbcc5.5.1じゃエラー吐いた>$ gcc3.3.1はOK VC++6もOK
誰か教えてください。 VC6で、ファイルをロックする関数flock関数が使いたいけど、 sys/file.hがないって言われます。 どうすれば、このヘッダファイルをインストールできますか?
>>227 そんな関数VCには付いてません。
ライブラリ提供元に問い合わせてください。
>>227 ヘルプ見ながらファイルロックする関数探す。
ちなみにBCB6だとlockingなる関数が見つかった
UNIXでもOSが提供するものであってライブラリが提供するものじゃないしな。
C++とwin32APIと言う物について学びたいのですが、 お勧めの書籍やWebでの講座などあったら教えて下さい。 また、これらを学び使いこなすのに必要な知識は他にどういった物があるでしょうか? C++を学ぶならメモリ等のハードの事も学ぶべきでしょうか。
>>232 メモリ等のハードについて学ぶのは時代遅れ
>>232 C++でWinアプリ組むならすなおにVCかBCBを購入。
つか、WinAPIを使うのにC++の知識はいらない。
C++をつかうならオブジェクト指向の知識が必要。
とりあえずお薦め書籍
>C++
「プログラミング言語 C++」
通称「禿」。これは手元においとかなしゃぁない。
なお、これを読む準備として何でもいいからC++の入門書を一冊仕上げること。
>WinAPI
「Windows2000プログラミング標準講座」
一冊本としては一番まとまりが良くて判りやすい。
>オブジェクト指向
「憂鬱なプログラマのためのオブジェクト指向開発講座」
今となっては内容が古くなってしまったけど、入門書としては未だにぴか一。
ちょっと待て 「禿」は「プログラミング言語C++」の原著者を指す言葉であって 「プログラミング言語C++」のことではない。 「プログラミング言語C++」は禿本と呼ぶ。
236 :
デフォルトの名無しさん :03/11/05 02:07
a = f() ? g() : h(); って書いたとき g()とh()は必ずどちらか一方しか呼ばれませんか? 両方呼ばれて片方の戻り値無視、って可能性はゼロですか?
仕様上は、「評価される」ことがないから可能性はゼロ。 だけど、どっかのスレで話題になってたけど 3項演算子は扱いが微妙に違ったりバグがあったりで、、、 Cなら問題ないけど C++でオブジェクトを3項演算子で扱うのは避けた方が無難らしい。
>>237 初心者にいいかげんな情報を吹き込むなよ。
正確な情報を教えてください。
240 :
デフォルトの名無しさん :03/11/05 02:51
質問です、 当方VC++6.0の環境で サーバーアプリケーションをコンソールアプリとして作成していました。 これを、サービスアプリケーションとして書き換えたいのですが 具体的にはどのようにすれば良いのでしょうか?
ログの流れが速いですね。
>>136 >>113 >>112 2で割り切れなくなるって、1度割れたらインクリメントしちゃいません?
って、実行結果と脳無の計算が合わない私がアホウ?
b=8のとき
まず「8=」と記述
次にaの2でbの8が割って割り切れるから「2」と記述し、
bをb/=aの4とする。
aをインクリメントして3にしてbの4が割り切れないから何もしない
aをインクリメントして4にしてbの4が割り切れるから「4」と記述し、
bをb/=aの1とする。
b=1だから改行して終わり。
結果表示は「8=24」
となる。
と、脳無では言っているのですが(泣
>>245 2重ループになっておろうが。aがインクリメントされるのは内側のwhileを抜けたときじゃ。
>>246 可能性はゼロ。余計なゴタクなし。おしまい。
可能性は必ず ゼロじゃない筈 You will survive… 信じるなら♪
現実にはゼロじゃないって話じゃないのかな。 C++を名乗っていても正式な規格に100%準拠しているコンパイラなんて無いわけだし。
244がリンク張ってるじゃん
どこが「いいかげんな情報」なんだろう
ただ煽りたかっただけ。
>>Cなら問題ないけど >>C++でオブジェクトを3項演算子で扱うのは避けた方が無難らしい。 この変いいかげんだと思う。書いてる本人もあやふやだと思ってるようだし。 gcc のどのバージョンで、とか、VC++ のどれで、みたいなソースもないし。 てかぶっちゃけ VC++ (..net 2003 の) で __int64 の四則演算すると簡単な 加算でもバグありコード出すわけだけれども、だから "C++ では __int64 は使わない方がいい" と一般化するのって変でそ?
複数のコンパイラでコンパイルされる可能性のあるコードは はじめからそういった危険な書き方を排除するべきだし 普段から危険な書き方をしていたら別な環境でそれにはまり 悩むことになるから普段から気をつけるべきだって思うんだが。
だってC++に__int64なんて無いし。
というわけで "C++ では __int64 などという仕様上決まってないものは 使わない方がいい" という当たり前の結論になりました。
259 :
デフォルトの名無しさん :03/11/05 18:47
配列についての質問なんですが、よろしくお願いします。 例えば整数型の変数を5個用意する場合 int n[5]; とするわけですけど、この[ ]に入る個数を 予め数字で決定するのではなく、キーボードから入力して 決定させる方法はないでしょうか。 つまり気分的には cin>>k; int n[k] というような感じです。 ようするに初めから変数の個数を決定させずに 状況に応じて個数を決定させたいわけです。 ご指南よろしくです。
まあ、C++みたいだし、vector使えってこった。
すいません、その「C99」というのを知りません・・・
しかし回答から想像するに、
>>259 のようなことは一般には無理ということでしょうか。
今現在の環境はBorland C++Compiler 5.5とbcpadです。
「vector」というのを使えば良いのでしょうか。 早速検索してみます。 ありがとうございました。
264 :
デフォルトの名無しさん :03/11/05 18:56
cin >> k; std::auto_ptr<int*> n( new int[k] );
cin >> k; boost::scoped_array<int> n(new int[k]);
質問です。 consoleアプリをWindowsアプリへ移植したいのですが main()をWinMain()へ変更したんですが コード中でargcを使います。 Windowsアプリでは代用となるものは何なんでしょうか?
std::vector<int> n; cin >> k; n.resize(k);
>>256 256は三項演算子が「そういう危険な書き方」だと思いますか?
なんか粘着しちゃってるかな。。。
>>269 WinMainの第3引数かGetCommandLine()
cin >> k; vector<int> v(k); int *const n = &v[0];
printf と cout を両方使うようなソースって見苦しいすか? scanf と cinとか
チョーヤバイ
>>271 自分で判断せず、256の判断を問うのは何故だ?
>>275 でもたとえば
printf( " ( x , y )=( %d , %d ) です ", x , y ) ;
をcoutで表すのって面倒じゃないすか?
素人なんで便利な書き方知らないだけかもだけど
boost::format
279 :
デフォルトの名無しさん :03/11/05 19:54
>>277 じゃあ中でcoutで出力してくれる
printfを自分で定義すれば?
可変引数はC++では使わない方が良かったはず。 という事でやっぱりboost::format。
>>281 環境依存OKなスレってあたりからしても、
そこらへんの純潔をあまり頑張って保ちつつレス書く必要は
ないんじゃない?
どうせ次期C++ではboostは標準だろ。
すんません、昨日からCを勉強し始めたんですが・・・ テキストは独習Cなんですが、付いてきたコンパイラではコンパイル出来ませんでした。 なんか、そのディレクトリはサポートしてませんとかなんとか出てくるんですが・・・ それは置いといて。 この際、総合開発環境の、要するに有料のコンパイラを買ってしまおうと思います。 ボーランドのビルダー6と、マイクロソフトのビジュアルC++、どっちが買いでしょうか? ちなみに、OSはXP、ノートパソで、増設した外付けハードディスクにインストールする予定なんですが・・・ なんか無料の奴だと、自動でCドライブにインストールされちゃった・・・
285 :
デフォルトの名無しさん :03/11/05 20:52
289 :
デフォルトの名無しさん :03/11/05 20:58
灯台離散ならそれくらい自分で考えろ
あー。私、大学生ですが東大生じゃないです・・・・ それじゃ、消えます。
>>284 いまんとこ英語版しかC++BuilderXとかDEVC++とかタダでそれなりに
使える環境はいくらでもある。
ま、GUIアプリの構築とかにはむかんが。
294 :
デフォルトの名無しさん :03/11/05 23:01
Class NN { ・・・ operator NN*() { return this; } }; の意味が分かりません。どういうことですか? 戻り値もないですし。
NN*が戻り値
>>294 キャスト演算子。それを定義すると暗黙的に他の型にキャストされる。
その例でいくと
NN nn;
NN *p=nn;
これが通る
しかし、気持ち悪い書き方だな。
>>298 //相手をFuck!
Me >> You;
//1引くよ。本当に引いてるよ。
Me++;
まぁ、演算子オーバーロードが危険と言われる所以だな。
レスありがとうございます。 でもなんかまだしっくり来ないんですが、 上の例でoperator NN*()の本体を外で定義するときは どうやって書けばいいんですか?
NN::operator NN*(){ return this; }
あ〜そうやってやるんですね。 どうもありがとうございます。 こんなやり方は自分の参考書にはありませんでした。
303 :
デフォルトの名無しさん :03/11/06 00:51
ManegedC++ではない普通のC++では.NetFrameworkは使用できませんよね。 ではなぜ普通のC++でGDI+を使用することが出来るのでしょうか? GDI+は.NetFrameworkではないのでしょうか? でもSystem.Drawing名前空間のクラスが使えるようになりますよね。 気になって眠れません。
304 :
デフォルトの名無しさん :03/11/06 01:22
#define foreach(x) for(x::itelator_type itr = x.begin(); itr != x.end(); ++itr) hogehoge<int> list(10); foreach(list) { itr = 0; } みたいなことをしたいんですが何か良い方法がありますでしょうか。
>>303 Microsoft Windows GDI+ exposes a flat application programming interface (API) that consists of about 600 functions, which are implemented in Gdiplus.dll and declared in Gdiplusflat.h.
307 :
デフォルトの名無しさん :03/11/06 04:33
宿題スレよりアドバイスを頂き、ご指導頂きましたが
環境依存とのことですので、こちらに参りました。
以下ご参照宜しくお願い致します。
前回の質問を再度貼り付けさせて頂きます。
http://pc2.2ch.net/test/read.cgi/tech/1067175933/244 ----------------------------------------------------------
行いたいことは、以下のようなcsvファイルを区切り文字 ','で分割し、
Excelの任意セル位置(たとえば "B3")より順に貼り付けたく思います。
csvのデータ取得の段階にて
* ただのブランク(""のみ)もデータとして扱う
* かつ改行文字を判別させ lineをカウントする
* データの ""を取り除く
という3つの条件を満たすコードが思いつきません。
-- input.csv --------------------------
"test", "1", "Japan"
"test2", "2", "Japan", "Tokyo"
"test3", "" , "" , "Osaka", "1111"
---------------------------------------
* 区切り文字は ','
* すべての文字列に "" がつく。
* データは可変長で構造化できない。
* 空白も1つのデータとしてカウントする。
---------------------------------------------------------
流れは getline で'\n'までの line を取得し、その中でExcelのColumn を決める変数をインクリメントし
値を取得しておき、再度そこから strtokなどで '"'までを分割を行い、
Excelに貼り付けて行けばいいと思われるのですが、私の力不足の為、上記要素を満たすことができません。
そこでどうか皆様のお力をお借りしたいと思います。
長文で申し訳ありませんがご指導宜しくお願い致します。
308 :
デフォルトの名無しさん :03/11/06 06:44
ある計算中に、n回目の処理が終了した時点で結果を表示するように しようと思っているのですが、その際にL1[y],L2[y],L3[y]…など続く 配列をL(n+1)[y]などとできないのでしょうか? for(y=0;y<half;y++) printf("%x",L(n1)[y]); 添字をつけられた値が配列でもポインタでもありません と警告されてしまいます。
#include <stdio.h> void main(void) { int x[3],; for(x[0]=1; x[0]<=3; x[0]++) { for(x[1]=1; x[1]<=3; x[1]++) { for(x[2]=1; x[2]<=3; x[2]++) { printf("(%d,%d)\n",x[0],x[1]); } } } } これをx[i]というように添え字を上手く使って 何度も同じこと書かずに済ますにはどうしたらいい?
int x[3];
for (int i = 0; i < 3; i++) { これ }
#include <stdio.h> void main(void) { int x[3]; for(int i=0; i<=2; i++) { for(x[i]=1; x[i]<=3; x[i]++) { printf("(%d,%d,%d)\n",x[0],x[1],x[2]); } } } こう書いたら表示される数字が滅茶苦茶になりますた
>308 変数名に数字を使ってもそれはただの識別子の一部で、あくまで名前です。 二次元配列にでもしなさい。 >309 パズルか何かですか? for (i = 0;i < 3*3*3;i++) { printf("(%d,%d)\n",i/9+1,i%9/3+1); } うーん、添え字を上手く使えなかった
>>307 環境依存と言われたのなら、自分の環境書いてや。
開発環境は何使ってるの?
BCBやVCならCSVを読込めるクラスがあると思うけど。
315 :
デフォルトの名無しさん :03/11/06 17:17
template<typename H, typename T> struct TypeList { typedef H Head; typedef T Tail; }; これの意味が分からないんですけど何に使うんですか?
>>317 TypeList理解するにはModern読むしかないだろ
319 :
デフォルトの名無しさん :03/11/06 17:58
書き込むところ間違っていると思いますけどどこに書き込んでいいのか わからなかったのでここに書き込ませてもらいます。 逆アセンブラを勉強したいのですが、どこで知識を学べばいいのか わからないのでよいサイトなんかありますか?? ゲームなんかを作るほどまでじゃなく 逆アセンブラしてどこがどうなってるのか、知る程度の知識でいいです
320 :
デフォルトの名無しさん :03/11/06 18:04
>>319 そのまえにアセンブラを勉強したか?
それを知らないと逆も何もないのだが?
321 :
デフォルトの名無しさん :03/11/06 18:05
322 :
デフォルトの名無しさん :03/11/06 18:09
>>320 いえ勉強してません..
>>321 さん有難うございます
まずアセンブラ勉強してみます検索すればひっかかりますかね??
324 :
デフォルトの名無しさん :03/11/06 21:23
テキストファイルを読み込んで、その中から「AAA」、「BBB」という単語を含む 文を抜き出すコードってどう書けばいいですか?
314さんレスありがとうございます。307です。 亀レスで申し訳ありません。 環境はWindows2000上のVC6.0です。Excelは2000を使用しています。 Excelにデータを送るところは VC SampleのCOMEXCEL等を見て、 大体わかるのですが、分割のロジックをご指導頂けましたらと思います。 宜しくお願い致します。
別スレで質問してきます。
質問です。 コンソールで製作されたサーバーソフトを タスクトレイに仕舞えるようにラッピング(?)するようなソフトを作りたいのですが 具体的にどのようにすれば良いのでしょうか? どこかでWin版のApacheをラッピングするソフトが公開されてましたが ああいうのを作りたいのです。
>>328 Shell_NotifyIconとShellExecuteExとWaitForSingleObject
330 :
デフォルトの名無しさん :03/11/06 23:34
ファイル操作でfgetcを使い、コンマ区切りでの読み込み方を教えてください。
普通にExcelでcsvファイルを読み込んで、 範囲選択してマウスで好きな位置に移動すればいいのでは? と思ったのはオレだけか?
Excelってマクロついてなかったっけ?
VBAならついてた気が
質問です。 C++を勉強したいのですが、どのようにしたら良いのでしょうか。 持っているソフトはVisualC++.netです。 本にコンパイルの仕方は載っていたのですが、 どのような環境でプログラムを記述すれば良いのかが分かりません。 プログラムについてではないのですがよろしくお願いします。
>>329 すみません。
具体的な方法を教えていただけませんでしょうか?
ShellExecuteExで最小化状態でコンソールアプリを起動し
WaitForSingleObjectで起動するのを待ってから
Shell_NotifyIconでトレイに収納 という事でしょうか?
>>338 即レスありがとうございます。
早速明日本屋に行って来ます。
ペゾルト本は薦めなくていいの?
禿本の値段、分かってるのかな?
342 :
デフォルトの名無しさん :03/11/07 03:48
関数の引数で文字列を受け取る場合どうすればいいんでしょうか? 整数ならint,文字ならchar、文字列なら・・? main() { hoge("abcdef"); } void hoge( ? ) { }
343 :
デフォルトの名無しさん :03/11/07 03:55
これでいいんでしょうか? main() { hoge("abcdef"); } void hoge( char *str ) { }
>>342 void hoge( char* )
void hoge( std::string )
void hoge( その他開発環境提供の文字列型 )
つか、参考書ちゃんと買おうね。その方が結局楽よ。
歯も磨けよ。
磨き過ぎて黒くなれ
348 :
デフォルトの名無しさん :03/11/07 10:05
C言語のプラグラム上で2進数を使う方法を教えてください。
350 :
デフォルトの名無しさん :03/11/07 11:54
10進数を2進数にするサンプルプログラムをお願いします
>343,344 だーかーらー 文字列定数を受けるときは const char * にしろと、いつも言っとろーが。
>>350 10進数文字列を2進数文字列に変換するのか?
10進数値を2進数文字列に変換するのか?
10進数文字列を2進数値に変換するのか?
10進数値を2進数値に変換するのか?
353 :
デフォルトの名無しさん :03/11/07 13:00
>>352 10進数値を2進数値に変換するプログラムです
なんだ、寝た加代…
数値なら進数関係ないだろうに。
sed -e 's/10進数値/2進数値/g'
ネットでいろいろCを勉強しているんですが、関数をつくる ところでいきなり「戻り値」という言葉が出てきて、しかも あまり詳しく説明されていませんでした。 よろしければ 教えてもらえないでしょうか。また、詳しく書かれてるサイト がありましたらおしえてください。
入門書を買いましょう
ネットだけで勉強するのは無理なんでしょうか・・・
無理だったからこんなところに聞きに来たんじゃないの?
え、じゃあ教えてもらえますか?
362 :
デフォルトの名無しさん :03/11/07 16:17
>>357 return val;のvalが戻り値
>>357 あたしは「チャット式C言語入門」ってサイトで
お勉強しまつた。ググったらすぐ出てくるよ。
みなさんありがとうございます。勉強してみます。
>>365 #include <iostream>
using namespace std;
int Add(int src, int val)
{
return src + val;
}
void main()
{
int outValue;
outValue = Add(1, 1); //1+1
cout << "1+1の答えは" << outValue << endl;
}
>>366 で、どれが戻り値なんでしょうか
で、一番下は一体・・・
>>367 君みたいなやつは「教えて君」と言って非常に嫌われるタイプ。
さっさと入門書買って自分で勉強しろ。
CPAD+bcc環境でC言語始めようとしたんですが・・・ Cpadからprintf関数つかって文字列出力してコンパイル→実行としようとしても コマンドプロンフトが一瞬で閉じてしまって何出力してるかも確認できませぬ コマンドプロンフトから実行ファイルを実行したら表示できるのですが・・・ どっか設定いじらなきゃだめでしょうか?
>>369 ソースの最後に
getc(stdin);
なり
system("pause");
を入れる
質問です。 まず、100人分5教科の点数をデータにしました。G[101][5]としてあります。 それを読み込んできて、全員の各教科ごとの偏差値を出し、ファイルに書き込みたいのです。 偏差値計算に必要なものは、各教科の平均点、標準偏差です。 3つfloatを使ってやるというヒントはもらったのですが、さっぱりです。 ヨロシクお願いします。
372 :
デフォルトの名無しさん :03/11/07 18:55
番兵君じゃないのかな。
378 :
デフォルトの名無しさん :03/11/07 22:47
現在勉強中なのですが、 いまのところ、クラス内で宣言する変数、メソッド全てが、インスタンスに付随するものしかわかりません。 ひょっとして、クラスに付随する変数、メソッドはないのでしょうか。
staticつけるの
380 :
デフォルトの名無しさん :03/11/08 03:16
std::wstring str; str += 'あ'; std::wcout << str << std::endl; vc7.1でコンパイルは通ったんですが、実行すると何も表示されません。 wchar_tやwstringの使い方を教えてください(お手本コード下さいませ)
381 :
デフォルトの名無しさん :03/11/08 03:29
382 :
デフォルトの名無しさん :03/11/08 03:29
あとLOCALEの設定とか
>>371 だからfloatは使うなとあれほど・・・(以下略
384 :
デフォルトの名無しさん :03/11/08 04:00
#include <iostream> #include <fstream> int main(){ ofstream ofs("test.txt"); ofs << "test"; return 0; } このコードのプログラムを、コマンドラインから実行した時や コマンドラインから引数を与えて実行した時はtest.txtが出力されるんですが 実行ファイルにフォルダをドラッグした時にはtest.txtが出力されません。 ドラッグされたフォルダの中身をtest.txtに出力したいのですが 何か方法はありませんか?教えてください。
>>384 1つ目、カレントディレクトリを見直せ。
2つ目、とりあえずmainの引数にargc/argvを追加しとけ。
>>385 ありがとうございます。
一つ目的中でした。出力されてないわけじゃなかったんですね。
お手数おかけしました。
>>381 だめでした。
>>382 コンパイルは通るのですが、実行すると強制終了します
std::wstring str;
str += L'あ';
std::wcout.imbue(std::locale("ja_JP.sjis"));
std::wcout << str << std::endl;
std::locale("japanese"); は無理?
あぁ、それとVC付属のやSTLportとかはワイド文字周りがまともにサポートされて無いから自分で書かないとダメだったりするよ。
>>387 強制終了っていうか例外が投げられてるな。"bad locale name"って
つーか
>ja_JP.sjis
ってなに?絶対sjisでは無いだろ。
jp でok
×jp でok ○ja でok
japaneseやjaでOKでした。有難うございます。 L'あ'のLも必要なようです。
393 :
デフォルトの名無しさん :03/11/08 12:15
Classname *cls; cls=new Classname[5]; とやったとき、cls[0]〜cls[4]はデフォルトコンストラクタで呼ばれた値が 入ってしまうのですが 何か引数を持たせて初期化するにはどうしたら良いですか?
>>393 ClassName* cls[5];
cls[0] = new ClassName( ... );
:
:
あっ、配列の大きさは動的に決められる感じで int num=10; Classname *cls; cls=new Classname[num]; っぽくやりつつ引数を持たせて初期化したいです。
>>393 int num=10;
ClassName** cls;
cls = new Classname*[num];
cls[0] = new ClassName( ... );
:
:
素直にstd::vector<Classname*>でも使った方が、、、
素直に std::vector <Classname>でも使ったほうが…
重いよ
401 :
デフォルトの名無しさん :03/11/08 22:29
0x0000 とかどういう意味ですか?
16進数表記
403 :
デフォルトの名無しさん :03/11/08 22:39
関数を定義するとき int Hoge() と int Hoge(void) の違いって何ですか?上のやつだと呼び出した行で 「プロトタイプ宣言のない関数の呼び出し'Hoge'の呼び出し」って警告が出るのですが、 今一つ差がわかりません。
404 :
デフォルトの名無しさん :03/11/08 22:40
>>403 Cなら上は引数チェックなし
C++なら両方とも同じ
405 :
デフォルトの名無しさん :03/11/08 22:42
VC++で for(int i = 0; i < N; i++){} for(int i = 0; i < N; i++){} ってやると i が再定義になっちゃって 激しくうざいと思ったんで解決策を検索してみると #define for if(0); else for このようなマクロを定義すればfor文が一段押し込まれて if(0); else for(int i = 0; i < N; i++){} になるってのを見てなるほどと思ったんですけど #define for if(1) for だと何かまずいんでしょうか?
Cのマクロで「何故?」と思ったらelse対応だと思え
#define for if(0); else for とか #define XXX do { } while (0) とか、こういうイディオムをまとめたサイトって無いすかねぇ…
今そんなマクロの使い方をしても許されるのはそれぐらいしかねぇよ
411 :
デフォルトの名無しさん :03/11/09 11:24
以下のコードを実行するとどうにも開放されたようで、全然開放してないように思えるのですが、 一体なにが起きているのでしょうか。 #include <stdio.h> class AAA { public: int a; AAA(int b){a = b;} ~AAA(void){printf("AAAは開放されたかも\n");} }; class TestClass { public: AAA aaa; TestClass(int b) : aaa(b){} ~TestClass(void){printf("TestClassは開放されたかも\n");} }; AAA *test(void) { AAA *aaa; TestClass tc(8); aaa = &tc.aaa; return aaa; } void main(void) { AAA *z; z = test(); printf("z=%d\n", (*z).a); }
412 :
デフォルトの名無しさん :03/11/09 11:35
何を期待して結果がどうだったのか書きなさい
コンパイル時にエラーが出るか、 実行時にエラーが出るか、 もしくはムチャクチャな数字が出ることを期待していました。 実行結果は以下のとおりです。 TestClassは開放されたかも AAAは開放されたかも z=8
>>411 とりあえずこの関数が
AAA *test(void)
{
AAA *aaa; TestClass tc(8); aaa = &tc.aaa; return aaa;
}
ローカル変数へのポインタを返してるところがダメだ
>>413 ローカル変数が解放されたからって、そこのメモリの値にすぐに別のものが入るわけじゃない。残骸が残ってる。
なるほど。わかりました。 ローカル変数へのポインタは返してはならないにつきるのですね。
>>411 「何がおきるかわからない」と言うことは、
「何かまともなことが起きる」可能性も含んでいますね。
取り敢えず、コンパイラの警告Lvは高くして注意深くメッセージを読むことをお勧めします。
418 :
デフォルトの名無しさん :03/11/09 13:37
>>416 返された直後に使うだけなら
いいんじゃない?
419 :
デフォルトの名無しさん :03/11/09 13:39
ええっ
420 :
デフォルトの名無しさん :03/11/09 13:41
クラスの中にクラスが入ってるのってアリですか?
421 :
デフォルトの名無しさん :03/11/09 13:44
はい
ありです
425 :
デフォルトの名無しさん :03/11/09 15:11
>>418 テンポラリーオブジェクトの寿命なら正解
char a[6] = "ABCDE"; と char b[6] = {'A','B','C','D','E','\0'}; って同じ意味なんですか? 初歩的な質問でスマソ・・・
そのとーり
429 :
デフォルトの名無しさん :03/11/09 16:40
>>418 保証されてないから、直後ってのもNGだろ
まともに動くかもしれないけど
>>427 嘘は書くなよ。
>>426 変数名が違うと言う点を除けば同じ。
ちなみに、6は書かない方が無難。
#つーか、わざわざ人間が数えるまでも無くコンパイラに数えさせるべき。
431 :
デフォルトの名無しさん :03/11/09 16:56
C++(コンパイラーBCC)で、 int a; cin >> a; if (!cin){ cin.clear(); cin.ignore(INT_MAX,'\n'); } というプログラムがあった場合、変数aにyyyや、yt4とか入力したらしっかりcinのエラーを取り除く処理をしてくれるのですが、 5teraというような最初の文字がint型のデータを入力すると、エラーの処理をしてくれません。どうしたら解決できますか?
>>432 何を期待していて、何をエラーとみなしているか書いてください。
>>433 int型の変数にchar型のデータなどを入れてしまうとcinにエラーが記録されるじゃないですか。
期待していることは、最初の文字がint型でも、あとがint型でないのなら、しっかりエラーの処理をしてほしいということです。
>>434 例えば
int a;
cin >> a;
というコードがあって、入力が
5tera
の場合、aには5が入り、cinには"tera"が残されている。
ここまでで、何も失敗した処理はないので、cinはgood状態である
次の文字がintにふさわしいか否かは読み込んでみてはじめて分かる。
>>435 ありがとうございます。ちょっと補足があります。
私は今、日付から曜日を計算するプログラムを作っています。
156sなどのデータが入力されたときに、これは正しい入力ではない
という判定をしたいのですが、どうすればよいですか?
>>436 必要性に疑問を感じるが、
int data1, data2;
cin >> data1;
if(!cin){/* エラー処理 */}
cin >> data2;
if(!cin || !cin.eof()){/* エラー処理 */}
でどうだろう。
>>436 「正しい入力」を正確に定義すること。そっちが先。
日付であれば「12日」とか「03/12」のような入力を「正しい」と見なすかどうかはプログラマの責任。
>>437 解決しました!
ありがとうございます!
$date_binのオブジェクトからsrcフォルダのソースを持ってくるにはどうしたら良いでsか?
ウインドウのサイズは変えられるけど サイズの上限を設定するにはどうしたらよいですか?
>>441 C/C++の話じゃないな。
環境くらいは書け。
M$のWindowsなら「WM_GETMINMAXINFO」メッセージを処理汁。
>442 441じゃないが、こんなメッセージがあったのか。今までWM_SIZINGで処理してた。
444 :
デフォルトの名無しさん :03/11/10 00:31
444
445 :
デフォルトの名無しさん :03/11/10 01:53
環境はVC++でした。
>>442 貴重な情報サンクスハァハァ
447 :
デフォルトの名無しさん :03/11/10 09:12
関数ポインタならぬ、クラスポインタというのはないのでしょうか。 クラスのインスタンスへのポインタではなく、クラスへのポインタです。 クラスを配列に入れて、条件に見合う場合にそのクラスのインスタンスを作成するという処理を想定しています。
>>447 そのインスタンスを作る関数のポインタを使うのが普通です。
449 :
デフォルトの名無しさん :03/11/10 09:33
それらのクラスのスーパークラスに「clone()」純粋仮想関数を置き、 具象クラスではそれを自分自身のコピーを返すように実装する。 配列には、具象クラスのインスタンスヘのポインタを置く。 これで解決しそうかな。
p2pのコードの書き方教えて下さい
>>445 そうか、そっちのウィンドウもあったな(w
452 :
デフォルトの名無しさん :03/11/10 13:28
#include <iostream.h> を書くと、 fatal error C1083: include ファイルを開けません。'iostream.h':No such file or directory というエラーが発生します。 この場合、私はどうすればエラーをなくせますか? 環境はVC++ ver7です。 初心者なもんで、こんな簡単な質問ですがお願いします。
453 :
デフォルトの名無しさん :03/11/10 13:41
>>452 #include <iostream>
454 :
デフォルトの名無しさん :03/11/10 13:44
>>453 #include <iostream>
はすでに試してみたが、エラーが増える。
455 :
デフォルトの名無しさん :03/11/10 13:48
>>454 using namespace std;
456 :
デフォルトの名無しさん :03/11/10 13:49
>>455 の意味がわからないです。
どういうことですか?
457 :
デフォルトの名無しさん :03/11/10 13:51
>>456 どうせ
#include <iostream>
int main()
{
cout << "hello world" << endl;
こうやっているんだろ?
459 :
デフォルトの名無しさん :03/11/10 13:53
#include <iostream.h> こういう風に書くと、 fatal error C1083: include ファイルを開けません。'iostream.h':No such file or directory が出て困っているんです。 #include <iostream> のようには書いていません。
ところでVC++.NETじゃなくて.NET Framework SDK付属のcl.exe使ってるってオチじゃないだろうな?
461 :
デフォルトの名無しさん :03/11/10 13:55
すいません。
>>460 の意味がわかりません。
でもたぶん、VC++.NETです。
462 :
デフォルトの名無しさん :03/11/10 13:56
>>461 ↓これなら通るだろ?
#include <iostream>
using namespace std;
int main()
{
cout << "Hello world" << endl;
return 0;
}
463 :
デフォルトの名無しさん :03/11/10 13:59
>>462 通りました。
でも、
#include <iostream.h>
だと、何がいけないんですか?
こっちを使う方法はないですか?
464 :
デフォルトの名無しさん :03/11/10 14:00
>>463 それがインストールされていない以上しかたない。
それにそれは時代遅れ。
465 :
デフォルトの名無しさん :03/11/10 14:05
>>464 <iostream>は時代遅れなんですか?
466 :
デフォルトの名無しさん :03/11/10 14:07
467 :
デフォルトの名無しさん :03/11/10 14:10
>>466 #include <iostream.h>
こっちがですか?
468 :
デフォルトの名無しさん :03/11/10 14:13
469 :
デフォルトの名無しさん :03/11/10 14:17
じゃあ、時代遅れなものは使わないようにします。 普段はJavaを使うので、C++のことはよくわかりませんでした。 本当にありがとうございました。
470 :
デフォルトの名無しさん :03/11/10 15:27
超くだらない質問ですが、 double data[3]; と定義したものは、 delete[] data; すべきですか? 私の場合、これを実行できないんですが?
double * data; data = new double[3]; delete [] data;
472 :
デフォルトの名無しさん :03/11/10 15:35
double data[3]; と定義したものは、メモリ開放しないのでしょうか?
スコープの終わりで解放されるだろ。
474 :
デフォルトの名無しさん :03/11/10 15:38
スコープって何?
消えろ
476 :
デフォルトの名無しさん :03/11/10 15:41
教えてくださいよ、社長。
おまいは double d; の後 delete d; ってするのか?
478 :
デフォルトの名無しさん :03/11/10 15:45
480 :
デフォルトの名無しさん :03/11/10 16:00
基本的な質問ですが、ある配列をそのまま別の配列にいれるには どうすればよいでしょうか? for(i=0;i<10;i++) a[i]=b[i]; こんな風にしてますが、もっと簡単にできないでしょうか?
481 :
デフォルトの名無しさん :03/11/10 16:04
memcpy()
>>384 です。
日本語のワイド文字(列)の操作と普通の文字(列)の操作との違いは、
・wstring や wcout 等を使う
・文字(列)定数の前に「L」をつける。
・ロケールをナニして、文字列処理の後、元に戻す。
だと自分なりに理解しました。間違いがあれば指摘してください。
>>389 うわぁ、本当ですか?それは聞くからに大変そうですね。
とりあえず今の知識で、vc7.1でfind()やreplace()等は使えたので、
ひとまず終わります。有難うございました。
すいません、教科書(独習C)に載ってなかったのですが・・・ printf("1:フィートからメートルへ、 2:メートルからフィートへ\n"); 最後の\nってのは、コンソールでの改行指示だけでしょうか? それ以外には何も機能が無いのでしょうか? htmlタグで言うと、<br>と同等の物ですか? アドバイスよろしくお願いします。
独習Cなら乗ってるだろ
\nは処理系依存。Windowsは\r\n。
リダイレクトしたときに困る・
ありがとうございます。 確かに載ってはいましたが、\r\nって何でしょう? こっちを使ったほうが無難、って事ですか?
Windowsだと改行文字は\rと\nの2つなんだけど、\nだけでいいよ
うい、ありがとうございました。すっきりしたっす。
>>488 >>491 おまいらややこしい話するなよ。
Windowsで\r\n ってかいたら0D 0D 0A になっちまうじゃねーか。
俺は\nだけでいい、と言ってるよ
>>494 >>491 は「Windowsだと改行文字は\rと\nの2つなんだけど」がおかしい。
\rは復帰で\nは復帰改行
>>495 \nが0x0D 0x0Aじゃないってことがあるの?具体的に教えてくれ。
cygwinのバイナリマウントは抜きにしろよ。ややこしくなるから。
>>497 MessageBox他多数は\n=0x0Aでは?
499 :
デフォルトの名無しさん :03/11/11 00:50
windows visual studio .netで、プログラム作ってデバッグボタン押したんですけど、 何かデバッグメンバーに登録されてませんとか何とか出てできないんですが。 どうすりゃいいか教えてくだせ〜・・・
むしろ、C言語レベルでは0x0Aでしかない訳だが。
>>497 \nが0x0D 0x0AになるC/C++の処理系は聞いたことがない。
テキストモード入出力時に\n<->\r\nの変換が行われるけど。
503 :
デフォルトの名無しさん :03/11/11 00:53
ライブラリを処理系に含めるかどうかということ?
ファイルからビットマップを読み込もうと色々と試行錯誤しているのですが なかなかうまくいきません、loadimageを使っているのですが、どうしたら 良いでしょうか?本当に初心者でloadimageの使い方すらままならない状態 です・・・。お願いします。
>>504 初心者でいきなりビットマップファイルを扱おうと言うのが間違っている。
難しい分野なのですか???課題で出されてわからなくまいっているところです・・・。
はい。508さんは詳しいのですか???
loadimageの第2引数は何をいれたらよいのですか?色々よんでもいまいち わからないです。もし良かったら教えていただけるとありがたいです。
>>509 VCでMFC使ってもいいなら、CHtmlViewを規定クラスにすれば、
プロジェクト名入力する以外はマウス操作だけで出来上がり。
BorlandC++でBMPをいじるアプリケーション作ってます。 大体完成のめどはついています。 29歳です。 これ持って就職活動したら、東京あたりで誰かアルバイトで雇ってくれますか? あとJAVAも覚えるつもりです。(シューティングゲームとか作れるレベルまで) どうでしょうか?雇ってくれそうですか? アルバイトでいいんです。
>>512 確かに環境依存の質問だが、ちょっと答えかねる。
「覚えるつもりです」のあたりがかなり怪しい。
もしオレが雇う立場なら雇いたくないな。 # 「覚えるつもりです」辺りがイタイ
はじめまして。VCの初心者です☆ビットマップをファイルからメモリに読み込みたいのですが、うまくいきません。「loadimage」って関数を使っているのですが、この関数は難しいのですか?よろしくお願いします。
>>516 loadimageはprintfみたいに単品で使えますか??
>>512 雇ってもいいよ。但し、最初の一週間給料なしね。
あ、それから、「JAVAも覚えるつもりです」は
具体的に何をしようとしているのか、もう少し具体的に書いてみてね。
#まさかJavaの言語規約を全部覚える積りじゃないでしょ。
>>515 あなたには難しいでしょうが、一般的にはその限りではありません。
>>515 fopen()を使ってバイナリモードでファイルを開き、
fread()を使えばメモリに読み込めます。
VS.Net 2003(C++)において、 新しいプロジェクト->Win32プロジェクトを作成し、 警告レベルをレベル4にするとでるこの警告を無くす方法はありますか? no warningのようにすれば警告はなくなるのですが、 このような実装は嫌いです。 この警告は必要の無い警告ですよね? int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // TODO: ここにコードを挿入してください。 short a = 3; short b = 5; a = a + b;// no warning a += b;// warning C4244: '+=' : 'int' から 'short' に変換しました。データが失われているかもしれません。 // hogehoge.... return (int) msg.wParam; }
1 脳内フィルタ 2 あきらめる 3 #pragma warning(disable: 4244)
523 :
デフォルトの名無しさん :03/11/12 18:23
VC++.NET 2003でビルド毎にProductVersionを更新してくれる機能はありませんか? VBとC#にはあるようですが。
マクロ書け
さんだと他の正しい警告が表示されなくてヽ( ´・ω・)ノ そうだshortをclassにして 代入演算子をoperator overloadingしてしまえ。 まんこ。
Borland C++ 5.5.1を使って課題プログラムを作成しコンパイルできましたが、 実行すると途中で強制終了になってしまいます。 下のプログラムの不味い点の指摘、お願いできますか? 散々調べましたが、わからないのでお願いします。 #include <stdio.h> int main(void) { int i; char members[5][10]={"Aaaa","Bbb","Cccc","Dddd","eeee"}; char **name[3]; *name[i]=&members[i][0]; printf("1番目 : %s\n",*name[0]); printf("2番目 : %s\n",*name[1]); printf("4番目 : %s\n",*name[3]); return 0 ; } 条件:char members[5][10]={"Aaaa","Bbb","Cccc","Dddd","eeee"}と**name[3]は使う。
>>526 **name[3]は*name[3]の間違いじゃネーノ?
char *name[5]; for(i=0; i<5; i++) name[i]=members[i]; printf("1番目 : %s\n",name[0]); printf("2番目 : %s\n",name[1]); printf("4番目 : %s\n",name[3]);
iを宣言してから代入してないから >*name[i]=&members[i][0]; でなにもできないじゃん
>>576-529 ありがとうございました。
>>529 で無事問題解決しました。
**name[3]は配布された紙に書いてあったので…
出題ミスかもしれません(汁
ありがとうございました。
>525 そこまでするなら a = a + b;で妥協した方がいいんでないの? あと、レベル4で必要な警告ってどんなの? 一度やってみたけど、テンプレートクラスで「使ってないinlineを削除しました」 が出まくって、鬱陶しいが消しようがないので即戻した。
533 :
デフォルトの名無しさん :03/11/13 06:31
ローカル変数をshortにしたい場面って、どんなのがあるかなぁ?
I/Oとかの入出力くらいだな
VCのLv4で重宝する警告は色々あるから、たまにLv4でビルドする。 で、邪魔な警告が出ないようにpragma warningでいくつも無効にしている。 VC使いならそのくらい当然だろ? 工夫もしないで否定するだけが能じゃないだろうに。 #スレ違いなので詳細は省略。
VCのLv4はboostとSTLが警告吐きまくるので嫌
windows.hも警告出さない?
出すね。<windows.h そんなときはpragma warning(push, 2)ですよ。 で、標準ライブラリ全部include終わったらpragma warning(pop)と。
>>539 templateだとそれさえ効かないからboostやSTL使うならLv4は無理。
541 :
デフォルトの名無しさん :03/11/13 19:30
>>535 ローカル変数をshortにするのと何の関係が?
説明のためにローカル変数にしましたが、 本来はメンバ変数の配列ですがなにか? > レベル4で必要な警告ってどんなの? どうしてこの警告がでたのかをたどることにより、 知識を手にいれることができるので、すべての警告です。
なんで説明の為のコードをWinMainで始めたのか、という疑問は残る・・・
>>542 > 本来はメンバ変数の配列
それなら、妥当な警告にも見える。
a=a+bで出ないってのが不思議。
C/C++ Mingw で MySqlに繋ぐのはどうすりゃ・・。 VC+DAOとかは使いたくないしなぁ
>>546 Thanksです。ちょっと無理そう。とりあえずはやってみます。
548 :
デフォルトの名無しさん :03/11/15 11:21
今日からC++をはじめようと思います。 cygwinで柴田望洋のC++例解演習を試してみました。 #include <iostream.h> int main(void) { cout << "初めてのC++プログラム。\n"; cout << "画面に対して出力を行っています。\n"; return (0); } を $ cc hello.cpp でコンパイルすると In file included from /usr/include/c++/3.3.1/backward/iostream.h:31, from helloworld.cpp:1: /usr/include/c++/3.3.1/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider usin g one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <s stream> instead of the deprecated header <strstream.h>. To disable this warning use -Wno-deprecated. /ccQfcHB6.o(.text+0x6f):helloworld.cpp: undefined reference to `std::cout' /ccQfcHB6.o(.text+0x74):helloworld.cpp: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)' /ccQfcHB6.o(.text+0x83):helloworld.cpp: undefined reference to `std::cout' /ccQfcHB6.o(.text+0x88):helloworld.cpp: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<ch ar> >&, char const*)' /ccQfcHB6.o(.text+0xb1):helloworld.cpp: undefined reference to `std::ios_base::Init::Init[in-charge]()' /ccQfcHB6.o(.text+0xcc):helloworld.cpp: undefined reference to `std::ios_base::Init::~Init [in-charge]()' collect2: ld returned 1 exit status とエラーが出てオブジェクトが作られません。どこがいけないのでしょうか?
-lstdc++
$ cc hello.cpp -lstdc++ とやったら上手くいきました。ありがとうございました。 何処に書いてありますか?
ここでは無い何処か
C言語始めたばかりの初心者なんですがコンパイル、ラン、アウトプット(学校の恐ろしく古いの違っているかも知れません)が出来るいいソフトがあったら教えて下さい。 それとC++が出来ると書いてある奴はCも出来るんでしょうか? 文章が下手ですいません。
>>549 あるいは cc の代わりに c++, g++ を使う.
>>550 gcc の info とか specs とかか?
>>552 とりあえずBorland C++をあげておこう
あとは適当に解説サイトで調べて
555 :
デフォルトの名無しさん :03/11/15 13:24
こんにちは。早速質問させてください。 今までVC++を三年やってきました。 急にC++(LINUX)で開発を行なう事になりました。 そこで質問なのですが、LINUXでアプリを作る場合 VCのような統合開発環境って何があるのでしょうか? また、ウインドウハンドルなんかをとるSDKとかって用意されてるのでしょうか?
>>555 しいていうならEclipseとか?<IDE
まぁ、なしで頑張るのが基本かと。
ウィンドウハンドル云々に関しては、
WinAPIとは思想が全く異なるので
経験は全く役に立たないと心得よ。
>>555 KDE とかだと,いちおう IDE あるみたい.
ただ基本的には,エディタで書いて gdb でデバッグってな感じになる.gdb を
GUI 的に使うプログラムがいくつか存在する (xxgdb とか) から,慣れるまでは
それを使うのもいい.
ウィンドウハンドル云々は,使用するライブラリによって全然違ってくる.Win32
と違って X はほんとーに低レベルの機能しか提供しておらず,ボタンやテキスト
コントロール相当のものは
o 自分で作る
o 別の GUI ツールキットライブラリを使う
いずれかの方法になる.一昔前だとツールキットとして Xaw, Motif なんつーのが
よく使われてたけど,今時だと GTk や Qt なのかね.
>>555 死滅寸前のBorland Kylixとか
560 :
デフォルトの名無しさん :03/11/15 14:46
>>557-559 レス有難うございます。
予想以上に難しそうですね。
安易に出来ますと返事してしまったのですが、
まだ、一ヶ月ありそうなので、それらの書籍などを
読み漁ってみたいと思います。
有難うございました。
tcl/tkでつくっちまえ。
C++じゃないじゃん
563 :
デフォルトの名無しさん :03/11/15 20:51
n = f() + g( h() , i () ) ; って文があったとして、各関数が呼ばれる順は h()とi()は少なくともg()より先に呼ばれるって以外は全く不明、という解釈は正しいですか? f() より g() が先とか h() は i() より先という保証は無い、という意味で。
だろうね。
565 :
デフォルトの名無しさん :03/11/15 21:01
今、画像検索データベースを作ろうとしています。windows用です。 左側に200pixX200pixくらいの画像(クリックすると別窓で拡大)、その右に画像の簡単な説明文。 これがワンセット。 で、検索機能でお目当ての画像に近い物を縦一列に数十セットくらい並べる。 それで質問なんですが、このワンセットを表示するのにコンポーネントはどういったものを使えばよいのかと…。 もともとwebデザ専門なんで、 htmlだとテーブルの左の列に画像を突っ込んで右の列にキャプションをいれてけばいいかなー、 と簡単に考えてしまうんですが、C++で同じことをやろうと思えばどうすれば簡単なんでしょうか。 BCB6を使ってます。どうかよろしくお願いします。
面倒くさいならブラウザコンポーネント使うとイイよ。
567 :
デフォルトの名無しさん :03/11/15 21:26
C言語の勉強をしようと思ってVisualStudio.NETを買ったのですが、ひょっとしてこれにC言語はついていないのでしょうか?
568 :
デフォルトの名無しさん :03/11/15 21:27
>>568 回線切って首吊って氏ね
>>567 VisualC++.NET起動しる
もっとも、そのレベルだとエディタでソース書いてコンソールから"cl test.c"とかやった方が早そうだが‥‥
コンパイラはついているが言語はついていない
>>565 オーソドックスに行くなら、TListViewだろ
まぁ、根性があれば自分で全部コードを書けばいいが、
面倒くさかったら、人様が作ったコンポーネントを流用すれば楽チンだな。
画像一覧コンポーネントならWEBを漁ればすぐ見つかるだろう。
どうもです。 買っといてなんですが、VisualStudio.NETは難しすぎるのであきらめます。 これから勉強をはじめるにあたって最適な環境にするにはどんなソフトがいるのでしょうか? Cは俺に聞けにあるGCCのサイトも行ったのですが、何が何やらさっぱりわかりませんでした。 フリーや有料問わず教えてください。 また、このスレやサイトを見ておくといいよというのがあれば、よろしければそれもお願いします。
>>573 ちゅーか 569 の意味がわからないのなら cygwin は使えんだろう、
cygwin が使えなければ gcc は使えんよ。
>>573 vs.net 使っているなら、まずコマンドプロンプトをだす、これが判らなかったらプログラマは諦める。
つづいて、なにも考えずにインストールしているなら
"c:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\vsvars32.bat"
を実行する。ちなみに、ただのvs.netなら 2003 の部分はない。
そしたら cl が使えるようになる。
notepad test.c
ってタイプすればエディターが開くから、
#include <stdio.h>
int main() { printf( "test\n" ) ; return 0 ; }
とか書いて、
cl test.c
って打ち込めば test って印刷するプログラムができる。
>>574 内容読んでないけど、コマンドプロンプト解らなくてもプログラマ諦める必要はない
やっていくうちに血式は付く
cygwin検索しましたが、英語のサイトなんですね。 やっぱり英語は基本なんでしょうか。 プロンプトはDOS時代に少しなら経験あります。
ねんきと実力は違うの?
>>577 適当に cygwin 入門 使い方 コンパイル とかでgoogle検索したら
日本語の説明もたくさん出てくるよ。
楽だと思うんだけどね。
初心者ならMinGWにしとけ。
とりあえずVisualStudio.NETは自分が持っていても意味がないどころか混乱する原因にしかならないことは理解しました。 自分みたいなのは、要するに必要最低限であるべきなんでしょうね。 linaxでemacsってのを使ったのですが、あれは勝手に改行などをしてくれるので便利でした。 英語は苦痛でしたが。
>>571 ありがとうございます。
ああ、TListViewのreport表示ですか。キャプションの表示が一列で物足りなくなってしまいますが、
なるほど。確かにこういう時にも使えますね。
画像一覧コンポもすぐにサンプルが見つかるとのことですが、
自分的には、
>>566 さんが教えてくれたブラウザコンポーネントというのが
おもしろそうなので、とりあえずこっちでやってみます。
みなさんどうもありがとうございました。
>>582 勉強って意味なら、コンパイラやリンカに直接触れておいて損じゃないとおもうよ。
それからVisualStudioに慣れていってもいいんでは。
可能。そのあたりは2chブラウザが詳しい。
587 :
デフォルトの名無しさん :03/11/16 12:39
age
588 :
デフォルトの名無しさん :03/11/16 13:06
演算子の結合性ってのがいまいち理解できません。 [ ]が左とか間接演算子の*が右ってのはなんとなくわかるのですが == や2項の+が左と結合するというのはどういうことでしょうか?
== や ++ は左の為にあると思われ
a + b + c => ((a + b) + c) これがもし a + b + c => (a + (b + c)) となったら泣いちゃうモン
592 :
デフォルトの名無しさん :03/11/16 15:13
すいません、TCppWebBrowser関連で質問です。 新たなタブを開いて窓を開く処理をOnNewWindow2()に書いたんですが、以下のコードでエラーが出ます。 void __fastcall TForm1::CppWebBrowser1NewWindow2(TObject *Sender, LPDISPATCH *ppDisp, VARIANT_BOOL *Cancel) { TTabSheet *TabSheet = new TTabSheet( PageControl1 ); TabSheet->PageControl = PageControl1; TabSheet->Caption = "追加"; TCppWebBrowser *CppWebBrowser = new TCppWebBrowser(this); CppWebBrowser->Align=alClient; CppWebBrowser->Parent = TabSheet; //ここでエラー } [C++ エラー] hoge.cpp(33): E2034 'TTabSheet *' 型は '_di_IDispatch' 型に変換できない で、ためしに、CppWebBrowser->Parent = TabSheet;をコメントアウトしてみたんですが、 どうもnew TCppWebBrowser(this);での新規作成自体も行われていないようで どこにも新規のCppWebBrowserが表示されません。 どうかアドバイスよろしくお願いします。
ありがとうございます。
概ねわかりましたが
>>590 の例は何が問題なのかがわかりません。
結果の型ですか?
CppWebBrowser->TOleControl::Parent = TabSheet;
>>593 a - b - cのほうが分かりやすいか?
右結合の場合だと
a = b = cとか。
>>593 a, b, c の値によっては,演算順序によって overflow するか否か,浮動小数点数だと
制度を保てるか否かが変わってくる可能性があるので,左結合にせよ右結合にせよ,
どちらかに決まっていないと困る.
あとは二項演算子の -, / (これは結合順序を変更すると数学的にも意味が変わって
しまう) と合わせたんじゃないの?
よくわかりました。 ありがとうございました。
>>555 この質問にC++BuilderXと答える人が誰もいないのが
知名度の低さを物語っているねぇ。
>>594 ありがとうございます。できました。
CppWebBrowser内の右クリック「新しいウィンドウで開く」で指定URLに別タブジャンプさせたかったんです。
これで、別タブと新規CppWebBrowserの作成は出来たんですが、肝心のURLが渡せません…。
開いた先は空っぽでした。
一応
*Cancel=TRUE;
でIEが立ち上がってくるのを防いでいるんですが、これがいけないんでしょうか。
あるいはそもそもOnNewWindow2()に書くというのが間違いなのか…。
ご存じな方どうかよろしくお願いします。
あ、*ppDispをセットしないと駄目なだけですね。 で、 *ppDisp = CppWebBrowser->Application_; とやると今度は 「Application_はCppWebBrowserのメンバーではない」 というエラーが…。 スミマセン。最後の最後でつまづきました。 よろしければお力添えお願いします。
VC7でMFCアプリを作成するとmfc7を使うようになるのが普通ですが mfc42を使うように組むことはできますか?
自己解決。 最後のアンダーバーが不必要だったようです。 *ppDisp = CppWebBrowser->Application; でできました。 どうもありがとうございます。
>>602 そうしたい理由は?
mfc7.dllを配布するのがいやならスタティックリンクしちゃえばいいだろうし。
605 :
デフォルトの名無しさん :03/11/16 23:47
SHA-1のハッシュ値を生成するフリーのライブラリはどんなものがありますか? VC++6.0を使っています。
ライブラリじゃねーじゃん
609 :
デフォルトの名無しさん :03/11/17 00:35
dirent.hがない場合、フォルダ内のファイル一覧を取得するにはどうすればいいでしょうか?
>608 どのあたりがライブラリでないと判断するわけ?
>>609 環境依存なんだから、環境かけよ。でなきゃ、誰にも答えられるはずもなし。
>>609 WindowsならFindFirstFile / FindNextFile
614 :
デフォルトの名無しさん :03/11/18 17:08
以下のサイトのプログラムを実行したいのですがCFLAGS
の指定がおかしいらしくエラーが発生します。自分の環境で
はどのライブラリを指定すればいいのかどなたか教えてください。
http://www.aso.ecei.tohoku.ac.jp/~myn/research/research.html 環境
Debian GNU/Linux woody
アーキテクチャ i386
実行結果
$ make
g++ -lnetpbm sample_main.cpp Cell.o Plane.o Layer.o LearningSSP.o -o SampleNC
/tmp/ccXjtKff.o: In function `main':
/tmp/ccXjtKff.o(.text+0x17e): undefined reference to `pgm_init(int *, char **)'
/tmp/ccXjtKff.o: In function `set_inputdata(char *, int *, int *, unsigned int *, double **)':
/tmp/ccXjtKff.o(.text+0x1421): undefined reference to `pgm_readpgm(_IO_FILE *, int *, int *, unsigned int *)'
/tmp/ccXjtKff.o(.text+0x1526): undefined reference to `pm_freearray(char **, int)'
collect2: ld returned 1 exit status
make: *** [SampleNC] エラー 1
615 :
デフォルトの名無しさん :03/11/18 17:12
C++ならCXXFLAGSじゃないの。
CFLAGSをCXXFLAGSに変更してmakeしましたが無理でした。
pgm.hが、extern "C"を考慮していないのではないか?
C++でマクロツールを作ろうと思ってるのですが、 参考文献、参考URL等を教えてください。 Googleで検索しても見つからなかったので・・・。
fgets(str,sizeof(str),stdin); これでstrのサイズを超える文字列を入力すると次のfgets()が無視されてしまうんですが、これを回避するにはどうしたら良いんでしょうか。
stdinのバッファに残るとか、その解決法(一番に見つけたのは scanf("%*[^\n]%*c"); か)も見つけました。 失礼しました。
>>619 レスありがとうございます。
「コンパイラとは」でググって見ましたが、ちょっと違うようでした。
ロケットマウスやFree Macro!のようなツールを作りたいのですが。
主な使用目的はネットゲームの作業の自動化等です。
do{ printf("アルファベットの一文字を入力して下さい:"); ch = getchar(); } while(ch!='a' && ch!='s' && ch!='m' && ch!='d'); っていう独習Cの例題を解いてたんですが、asmd以外の値を入れた際に、何故か 「アルファベットの云々」が2回実行されます。 コンソールで見ると アルファベットの一文字を入力して下さい:z アルファベットの一文字を入力して下さい:アルファベットの一文字を入力して下さい: って具合になります。 何故なんでしょう?
>>623 zを入力した後に恐らく入力しているであろう改行コードを処理した分。
なるほどわかったっす。 ありがとうございました。 ・・・・解決法ってあるんですかね・・・・
628 :
デフォルトの名無しさん :03/11/18 23:35
C++で質問です。 1つのプロジェクト内で全ての「○○.cpp」間で共通する変数を使いたいのですが、どうすればよいのでしょう? ご指導お願いします。
629 :
デフォルトの名無しさん :03/11/18 23:39
main()のプロトタイプ宣言ってやっちゃいけないって本当ですか?
int main(int argc, const char *argv){ ... ってやって痛い目にあったことがある。なんでconstじゃないんだよ。書き換えてもええんか?あ?
>>633 元の文字列より多くなると駄目かと思われる。
すみません、Cしか分かりません…
main() はプロトタイプ宣言をする必要は無いんじゃないかな? もしくは他の関数から main を呼び出したいの?
>> 624 g++ sample_main.cpp Cell.o Plane.o Layer.o LearningSSP.o -o SampleNC -lnetpbm とすればいいんですか? makeを実行した結果は変わりませんでした。
きちんと見てみたらリンカエラーじゃないか。 じゃあLDFLAGSじゃん。
必要なライブラリがインストールされていないだけのような気がする。
>>633 類似ネタを最近この板で見たな。ちゃんと理由もあったよ。
>>633 のはtypoがあるが、つまりは**のときにいろいろ不都合が(ry
>>634 つまらん。縦読みもできん。
644 :
デフォルトの名無しさん :03/11/19 01:45
>>641 書いてはいけないわけではないけれど、他の関数から呼び出されることはないから書く必要はないね。
>>644 プロトタイプ宣言につて認識の違いがあるよっかん
VCなんだが #include <stdio.h> int main(); static int i = 10; void prints (char *s) { printf ("%s", s); if (i--) main(); } int main() { prints ("hello\n"); return 0; } は動いたぞ
普通main関数をユーザーが呼び出すことは無いんだからプロトタイプ宣言しても無意味。
648 :
デフォルトの名無しさん :03/11/19 08:58
scanfとかgetcharとかは使っちゃならぬと聞いたのですがどうですか?
getsのほうじゃないのか?
というか、どっかの質問スレでダメだとか言ってた人がいたね
652 :
デフォルトの名無しさん :03/11/19 09:31
質問です。 printf関数で printf("Hoge:%d\n"); というふうに 引数なしで print 表示した場合は、 スタックポインターのアドレスがずれて これ以後の処理がおかしくなるといったことは あるのでしょか?
653 :
デフォルトの名無しさん :03/11/19 09:34
>>652 そういう意味ではおかしくならない。
可変個の場合は普通呼び出し元が後かたづけするから。
>>652 以後の処理というより printf のところでバグが起こって止まるかそのまま動き続けるかじゃないかな
>>653 呼び出し元が後片付けをするって?…
>654 >655 stdio.h を見たところ printf 関数は、__cdecl 定義で動作しているので スタックはクリアしているようですね。 どうもありがとうございました。
657 :
デフォルトの名無しさん :03/11/19 13:11
Visual C++で、かつnmakeでビルドを自動化して(つまりコマンドラインで)、 DLLとそのインポートライブラリを作成しようと試みています。 さらに、「__declspec(dllexport)」みたいなヘンテコな呪文をソースコードに 入れないで済ませたいのです。 linkやlibやdumpbinといったコマンドのマニュアルは一通り読んだのですが、 なかなかうまくいきません。 上記の要望を叶えるお知恵を拝借いたしたいと思います。
名前: 歩歩歩#randy51 E-mail: fusianasan 内容: 質問があります。今、BorlandC++でBMP画像を編集するアプリケーションを製作しているのですが、 adobeとかのソフトによくある「ダイアログにタブコントロール」をやりたいんですが出来ません。 モーダレスダイアログにタブコントロールを貼り付けるまではできたんですが、タブをクリックするごとにボタンなどのコントロールの表示の切り替えができません。 やり方は複数あると思うのですが、モーダレスダイアログに子ウインドウを貼り付けるにはどうしたらいいですか? できればやり方も教えてほしいんですが、sample.cppとsample.rccとsample.hをアップしてくれるとありがたいです。 一通り調べても見たんですが、MFCのCDailog::createを使う奴しか見つかりませんでした。 当方初心者なためここで1週間足止めを食らっております。よろしくお願いします。
あ、、。 トリップ変えま〜す。
660 :
デフォルトの名無しさん :03/11/19 16:19
基本的な質問でスミマセソなんですが、Visual C++6.0の va_list について質問です。マクロなのでstdarg.hの定義をみると typedef char * va_list; #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) #define va_end(ap) ( ap = (va_list)0 ) このようになってます。それで _INTSIZEOF(n) の定義部分の 意味がよくわからんのですが、 A & ~B って何やってんでしょう? 機能的には _INTSIZEOF(n) は sizeof(n) に置き換えても va_start マクロなどは正常に動作するようなのですが。 説明不要かも知れませんが、このマクロは例えば va_start ( pArg, szText) とすると、 pArg に szText の すぐ後ろのアドレスが代入されるマクロです。
>>660 ちょっと補足ですが
va_start(pArg, szText) で代入される値は
szText の32bits後ろってことかな・・・たぶん。
_INTSIZEOF(n)はsizeof(n)の値をsizeof(int)の倍数にしてる。 sizeof(int)が4な環境の場合、sizeof(n)が1〜4なら4、5〜8なら8、となる。
663 :
デフォルトの名無しさん :03/11/19 21:57
C言語でGUIも開発できるの?
664 :
デフォルトの名無しさん :03/11/19 22:26
Cでおもにどんなソフトが作れるわけ?
667 :
デフォルトの名無しさん :03/11/19 23:10
>>657 cl.exeでコンパイルしてlink.exe /DLLでリンクするだけ。
__declspecを使わないならDEFファイルを用意してlink.exeに/DEFで渡すだけ。
プログラムに興味を持ったリア厨なんですが、C言語講座のサイトを見てhellow,worldの文字を 表示させるためにコンパイラが必要になって、フリーのBorland C++ Compiler 5.5ってのを 落として入れて見たんですが、使い方がサッパリ分かりません。 どこをどうすればコンパイルできるのでしょうか?
670 :
nanasi :03/11/20 00:35
質問があります #include <stdio.h> int add(int n); void main(void) { int i= 1; printf("1st time ; i=%d,address=%x\n",i,&i); i = add(i); printf("2nd time ; i=%d,address=%x\n",i,&i); i = add(i); printf("3rd time ; i=%d,address=%x\n",i,&i); } int add(int n) { int i=0; printf("add function; i=%d,address=%x\n",i,&i); i+=n;←なんでここにnを代入するのかわかりません教えてください・・ほんとに・ ここにnを代入する必要があるのでしょうか? nを代入する意味が知りたいのです このプログラムの意味は1つの引数を与えて加算する関数ですちなみに自動変数です return i;
672 :
デフォルトの名無しさん :03/11/20 00:40
自己解決できました。ありがとうございました。
675 :
デフォルトの名無しさん :03/11/20 12:48
>>668 ありがとうございます。
でも、DEFファイルだけだとグローバル変数のエクスポートがうまくいかなくて困っています。
EXPORTS
hoge = hoge @1 DATA
といった感じで変数のエクスポートはできるようで、DLLとインポートライブラリの作成はうまくいきました。
しかし、そのインポートライブラリと実行ファイルをリンクしようとすると、
「_fugafugaが未解決のシンボル _hoge を参照しています」のようなエラーが出てしまいます。
変数のエクスポートはDEFファイルだけではできないのでしょうか?
はっきりいってCを学んでいる間は 普通のアプリケーションのような ウィンドウを表示したりウィンドウにボタンを作ったり ということはできないの?
>>676 ていうかC言語だけでは表示はおろかI/Oポートを叩く事すらできない。
それらはOSやライブラリを呼ぶ事でできる。
ライブラリも結局は最終的にOSを呼んでる。
>>677 >ていうかC言語だけでは表示はおろかI/Oポートを叩く事すらできない。
メモリマップドI/Oなら叩けるかもしれない。
と言ってみるテスト。
君の持っているBorlandC++があれば、何でも作れるよ。 ダイレクトXの最新版とかは対応してなかったかなぁ。7くらいまでだったら流用できたと思うが,,,。 でもOpenGLがあるからいいじゃないか。
>>676 多分、Windows環境でGUIアプリを作成したいってことだと思うのでそのつもりで回答。
可能。しかしかなり面倒くさい。
>>680 面倒だと思うと面倒になるよぉ。
俺も思うけど
682 :
デフォルトの名無しさん :03/11/20 16:10
質問ですが、 1GBぐらいのファイルを作ろうとしているのですが、 mallocから抜けてきません。 どなたか、解決策を教えてください。 よろしくお願いします。
メニューが表示できるようになれば後はスラスラ行くよ。
>>682 1GBメモリ確保して一気に書き込もうとしてるの?
かなり恵まれた環境じゃないとスワップしまくりだ。
適当なサイズで分割して、少しづつ処理してけ。
>>682 藻前はメモリを何GB積んでいるのか?と問いたい。
686 :
デフォルトの名無しさん :03/11/20 17:47
cryptファイルが含まれているのはunistd.hで正しいですか? 当方Borlandのフリーコンパイラを使っているのですが、 "インクルードファイル unistd.hをオープンできない" といったメッセージが出てきてしまいます。
unistd.hはunix系しかないでしょ。 crypt()が含まれてるとは思えないけど。
688 :
デフォルトの名無しさん :03/11/20 18:00
>>687 ありがとうございます。
windows環境でcrypt()を使うことは無理なのでしょうか?
助言をくれた方々、ありがとうございます。 分割して、作成したらうまくいきました。
どっかからソース拾えばcryptも使える。
691 :
デフォルトの名無しさん :03/11/20 19:05
すいません、どうしても解けない問題があります。教えてください。 PIC16F628を用いパソコンからデータをRS−232経由で入力し文字だったらパソコンにその文字を表示し、それ以外ならば、パソコンにSONOTAを表示する。 また、データ入力が5秒間なかったらパソコンに入力を促すメッセージを表示する。 なお、RS232のプリプロセッサは #USE RS232(BAUD=9600,XMIT=PIN_B2,RCV=PIN_B1,PARITY=N,BITS=8) delayは #USE delay(CLACK=10000000)とし メインプログラム上に kbhit() と getc() 関数を使用する。 開発環境はマイクロチップ社製のMPLABです。
>>690 ありがとうございます。そうすることにしました。
>>691 とりあえず、向こうのスレからの紹介で来たって言ったほうが「マルチやめれ」とか言われないですむよ
inline staticと修飾すると、コンパイラはどのように処理するのでしょうか? 速度重視コンパイルならinlineを、サイズ重視コンパイルならstaticを有効にして 排他された要素は無視されるということでしょうか?
staticの意味を調べるように。
696 :
デフォルトの名無しさん :03/11/20 20:29
>>695 分ってて矛盾してるから聞いてるだけど?
分かってないし矛盾もしてない
初心者回答者歓迎スレかよ
C++でWindows環境でGUIアプリ作成できまつか?
>>700 C で OS 組めるのに、C++ で Windows GUI 組めなかったらおかしいだろ。
>>697 ・関数に対するstaticはそれが内部リンケージであることを示す。
・inline関数は自動的に内部リンケージを持つ。
何か矛盾してるか?
>691 で、結局、 ・PC側ソフトと、PICのソフトの両方を造るの? ・PC側のOSは何? ・PICのピンアサインはどう決めてるのか ・動作仕様はこっちと向こうで分割しろよ というあたりか
>>702 >・inline関数は自動的に内部リンケージを持つ。
これはほんと?
extern inline は?
>>704 extern inlineは禁止されている。
>>705 工エエェェ(´д`)ェェエエ工
>ISO C++ 7.1.2-3 79)
>The inline keyword has no effect on the linkage of a function.
>ISO C++ 7.1.2-4
>(前略)
>An inline function with external linkage shall have the same
>address in all translation units. A static local variable in
>an extern inline function always refers to the same object.
>A string literal in an extern inline function is the same
>object in different translation units.
707 :
デフォルトの名無しさん :03/11/21 00:04
>703 ほんとにすいません。PICほんとに解らないもので… 今回はPC側のソフトはハイパーターミナルを使うので PIC側のソフトを教えてほしいのです。 PCのOSはWIN2000です。 ピンアサインはRB1を受信 RB2を送信ピンにしています。 PC側のcom1ポートのストレートケーブルをPICのRB1とRB2に接続しています。
708 :
デフォルトの名無しさん :03/11/21 01:18
>707 ところでPIC16F628じたいkbhitやgetcってつかえたっけ?
というか、PICでCで書けるの?AVRとかだとやれるみたいだけど。
書店でPICのC本あったよ。
あんな変態命令セットでコンパイラがコード吐けるってのはちょっと感動した。
俺は変態だが、だからといってPICではない。
713 :
デフォルトの名無しさん :03/11/21 01:35
どうやってもできないんですよ〜 解らないんですよ〜 ところでAVRて、何ですか? ほんと初心者でスマソ
714 :
デフォルトの名無しさん :03/11/21 01:38
でもPICのC本って基本的な事しかのってないよな
ソースコードをどっかのうpろだに上げたら?
716 :
デフォルトの名無しさん :03/11/21 03:45
while(a[i++] != HOGE) hogehoge( a[i] ); こんな感じのコードがあったとして、i++の副作用が収まるのは「最初のセミコロンまで保証されない」から hogehoge()に意図したa[i]が渡るとは限らない、と言われたのですが、本当でしょうか。
while (a[i] != HOGE) hogehoge(a[++i]); と同じ。
718 :
デフォルトの名無しさん :03/11/21 04:05
>>716 そんな事いったら
for(int i=0; i < 10; i++) hogehoge(a[i]);
も保証されなくなってしまう
>>716 そいつは信用しない方が良い。
それにここで質問せすとも、自分でサンプル作って確かめたら分かるだろ。
>>719 規格上保証されているか否かを自分でサンプル作って確かめる方法があるなら教えてくれ。
何ぐちぐち言ってんの?規格書読めば?
皆さんありがとうございました。 しょっちゅうアレな事を言う先輩がいて、正直対処に困ってます。 たまに正しい事も言うし無視するわけにもいかないですよね…
俺は、規格上保証されているか否かなんてことは 自分でサンプル作って確認しろ、なんてことは書いてないぞ。 質問する前に動作確認ぐらいしろ、と書いてるんだが。 なんかおかしいか?
それに、規格上保証されているかどうかは、規格書読めば良いだろ。
自分でサンプル作って確認してもそれがC++として正しいかどうかの判断には 何の役にも立たないだろうが。 最終的に規格読めつーならサンプル作るのは無意味だろう。
s/企画書/規格書/
>>716 を読んでるか?
そのコードで未定義の部分は無いんだぞ?
自分で試してみれば、必ず
>>716 の先輩とやらの言ってることは違うって確認出来る。
それでも自分があっているか分からなければ、規格書読めば良いんだよ。
>>729 お前未定義の意味を勘違いしていないか?
どうなってもおかしくないということだぞ。
i=0;
i=i++;
こういうコードがあったとして、iは0になると思っていたとしよう。
そして先輩に0になるとは限らないとつっこまれた。
だが動作確認してみたら0になった。
これで未定義ではないと証明されたと言えるか?
> 規格書読めば良いんだよ。
それを720に言うのはおかしいと言っているんだよ。
規格書読めというのはむしろお前らに言いたいよ。
>>716 を読め。
>>731 読んでどうしろと?(^_^;)
誰も
>>716 のコードに未定義の部分があるなんて言っていないぞ。
int i = 0; while(i++ < 10) printf("%d\n", i); とした時、一番初めに出力される数字は 1 以外有り得ないだろ。
>>716 そいつは信用しない方が良い。
それにここで質問せずとも、自分で規格書を読んで確かめたら分かるだろ。
こう言えばよかったってことだよ。
・・・ということでいいんだよな?>720
ようやく収束したか
ってか規格書仕様書読めなんて回答、大抵の質問に当てはまるよな・・・。
741 :
デフォルトの名無しさん :03/11/21 06:19
「猫でもわかる」のサイトで、子ウィンドウの出し方と、 スクロールバーの出し方と、ステータスバーの出し方は分かりました。 目標はこの3つを併せ持つ必要最小限の状態なのですが、 まずスクロールバーとステータスバーの組み合わせで分からなくなりました。 単純に重複しないソースを組み合わせると、 | | ___|_| 處▼| ↑このようにステータスバーがスクロールバー分短くなります。 |_| ___|▼| 處 ↑このようにステータスバーで一番下を突っ切りたいんです。 ちなみに、スクロールバーは画面の変形に合わせて変化するやつで、 ウィンドウが十分に大きいと消えるやつです。 何か留意点等ありますでしょうか? BCC Developerを使っています。 むかついたので合成する実験ソースは消してしまいました。
>>741 親ウィンドウを用意してそこにスクロールバーを貼り付ける。
次にその親ウィンドウにスクロールバーを持つ子ウィンドウを貼り付ける。
サイズ変更時なんかの処理は……まぁ、がんばれ。
743 :
デフォルトの名無しさん :03/11/21 07:34
>>742 もしかして、同じウィンドウにステータスバーとスクロールバーを
両方持たせると、ステータスバーの方が内側に来るということでしょうか?
ということは、いわゆるSDIウィンドウというのは、
親に見える枠の部分だけで2重構造になってるということでしょうか?
>>743 ウィンドウスタイルを設定することによって表示されるスクロールバーは
ウィンドウの非クライアント領域にある。
一方、ステータスバーはウィンドウのクライアント領域に貼り付けられる
子ウィンドウだ。
まぁ、もうひとつの解として、同じウィンドウにコモンコントロールとしての
スクロールバーとステータスバーを貼り付ける方法もあるが。
745 :
satoo :03/11/21 09:39
>>713 俺の友達にこんなプログラム作ってたけど
こんなんか?
#byte PORTA = 5
void main()
{
char cmd;
set_tris_a(0x02);
PORTA=0;
while(1)
{
printf("BIG");
delay_us(500);
output_high(PIN_A0);
delay_us(500);
printf("CTS= %2X\n\r",PIN_A1);
delay_us(500);
cmd = getc();
putc(cmd);
if ((cmd >= '0') && (cmd <= '9')){
printf("number\n\r");
output_low(PIN_A0);
delay_ms(500);
}
else
putc(0xD);
}
}
俺が思うには、動作しない気がするが・・・
746 :
satoo :03/11/21 10:32
補足入れますね #byte PORTA = 5//PORTAを5番地に指定 set_tris_a(0x02);//PORTAの入出力設定RA1だけ入力 PORTA=0;//PORTAに0を出力 while(1)//無限ループ output_high(PIN_A0);//PIN_A0に1を出力 cmd = getc();//1文字取り込み putc(cmd);//エコー出力 if ((cmd >= '0') && (cmd <= '9')){//もし取り込みが数字だったら output_low(PIN_A0);//PIN_A0に0を出力 こんなとこかな
747 :
デフォルトの名無しさん :03/11/21 10:50
C++の勉強をしていて、参考書通りに記入してるのにコンパイルできません。 何処が間違ってるのかいくら考えてもわからないので教えてください。 BCCを使っています。 #include <iostream> #include <string> using namespace std; class Company { char name[20]; int sales , profit; public: Company(char* p = "", int x = 0, y = 0) { strcpy(name,p); sales = x; profit = y; } void print() { cout<<"社名:" <<name <<endl; cout<<"売上:" <<sales <<"億円"<<endl; cout<<"利益:" <<profit <<"億円" <<endl; } }; 改行が多いと怒られたので続きは↓に書きます。
748 :
デフォルトの名無しさん :03/11/21 10:50
int main() { Company a("日本(株)",500,32); a.print(); } エラー内容 エラー E2303 002.cpp 9: 型名が必要 エラー E2040 002.cpp 22: 宣言が正しく終了していない エラー E2190 002.cpp 22: 不要な } エラー E2190 002.cpp 22: 不要な } エラー E2034 002.cpp 26: 'char *' 型は 'Company' 型に変換できない(関数 main() ) エラー E2293 002.cpp 26: ) が必要(関数 main() ) エラー E2316 002.cpp 27: 'print' は 'Company' のメンバーではない(関数 main() ) 警告 W8004 002.cpp 28: 'a' に代入した値は使われていない(関数 main() ) *** 7 errors in Compile *** よろしくお願いします。
とりあえず >Company(char* p = "", int x = 0, y = 0) を <Company(char* p = "", int x = 0, int y = 0) に。
>>749 ありがとうございました。
早くプログラミングに慣れようと自分なりに工夫(?)しようとしたのが仇になってたんですね。
どうもでした。
>>752 ∧ ∧
(CωC)<オマモナー
( )
|_)_)
>>747 参考書通りに記入してないじゃん。
質問は正確に書けよ。
755 :
デフォルトの名無しさん :03/11/21 17:11
C++学びたきゃCから学べよ、と言われたのですが、 自分としてはWindows環境でGUIアプリ作成したいので、 C学んでいる間はハッキリ言って自分のしたいことが 出来なくてつまらないと思います。 C++から学べる良い書籍を紹介してください。
C++を学んでる間もやりたいことが出来なくてつまらないと思います
なんだ、Cをかじってるわけじゃないんだな。 やってもないのに言ってるわけか・・・。
>>755 C++でGUIアプリ作りたい->MFC使ってみる->C++がわからないとちんぷんかんぷん
C++でGUIアプリ作りたい->SDKで作ってみる->Cがわからないとちんぷんかんぷん
760 :
デフォルトの名無しさん :03/11/21 17:48
CからC++へ移行しようとしている者です。 classに関しての質問。 classって関数値として返せますか? string piyo(void) { string str = "piyopiyo"; return str; }
C++を知らないものだけど classは新しい型を作るわけだから、関数ではないよ。 メンバ関数って言うなら返せると思うよ
関数の返値の型としてclassは適用できるか、を問うているように見える。 全うなclassなら返値としても使える。
>>760 コピーコンストラクタを定義していないか、
アクセス可能なコピーコンストラクタがあればyes
つーか、たいていのクラスは大丈夫で、stringもおk
>>760 返せる返せないかは別として、
string str のスコープを考えてみ。
766 :
デフォルトの名無しさん :03/11/21 18:09
>>764 それは分かるのですが、
string str;
のとき、strはポインタではなく、実態ですよね?
で、言いたいのはその実態を返せるのかということです。
>>762 さんのいうようなことで。
アセンブラ的な考えでは、レジスタより大きいサイズは返せないので
返せないと思ったのですが、コンパイルしてもエラーが出ないようなので、
↑の関数を、
string ret = piyo();
とすると、retへpiyoで定義したstringがコピーされるのかなと疑問を持ったのです。
767 :
デフォルトの名無しさん :03/11/21 18:13
>>763 どうもです。
普通は無理だけど、=の挙動か何かを変えるようにクラスを作れば
OKということでよいでしょうか?
>>767 違う。
普通は可能だけど、特別な意図を持って禁止しているクラスもあり得る、ということ。
C++でのクラスの内、具象型と呼ばれるもの(string, vector ,complex, etc...
は、組み込み型(int, double, ...)と同じように扱ってもよいように設計されている。
だから、stringは、代入も、コピーも、値渡しもできる。
てか、Cでも構造体は返せるだろ。
>>769 どうもです。
>>770 はい、そうですが、心配なので一応聞いてみました。
クラスってのは、構造体に関数ポインタを入れて、自分自身のアドレスを
標準で受け取れるようにしたよな物ですよね?
>>771 ちょっと違う。
仮想関数がある場合のみ、関数テーブルへのポインタを持つ。
virtualでないメンバ関数呼び出しはコンパイル時に解決できるから
ポインタを持つ必要はない。
773 デフォルトの名無しさん sage 03/11/21 18:54
>>771 >クラスってのは、構造体に関数ポインタを入れて、自分自身のアドレスを
>標準で受け取れるようにしたよな物ですよね?
C++のclassならそんなもんだ。クラスという概念はそんな小手先のものじゃない。
774 デフォルトの名無しさん sage 03/11/21 17:09
>>773 ここはC/C++のスレですが、何か?
>>772 ,
>>773 どうもです。
コンパイラが賢いのですね。
なら、構造体とはメモリ上の配置が違いますよね?
クラスのアドレスを参照して、その中を弄ったりはしないほうがよいのでしょうか?(先頭からのオフセット指定で)
これは、オブジェクト指向の考えに反しているのでやるべきでないとは思いますが、一応。
>>774 何を言ってるんだ?
関数から返されたものは呼び出し元の変数に「コピー」されるといっとるんだ。
>>774 C++ の struct は、メンバへのアクセスがデフォルトで public なだけで
class と同じ。
やりたければ
struct Hoge {
private:
// struct のプライベートメンバ
int p;
public:
// struct のコンストラクタ
Hoge() : p(0) {}
// struct のメンバ関数
unsigned long offs() { return offsetof(Hoge, p); }
};
とも書けるし、
Hoge h;
int *p = (int *)(((char *)h) + h.offs());
*p = 0;
ってのも出来る。
ただ、メンバ p のオフセットが +0 になるかどうかは…すまん、知らん。
777 :
デフォルトの名無しさん :03/11/21 20:18
分割コンパイルについて、つまづいている事があります。 環境はMFC7.0です。 「myMFC.h」というファイルを作って template<class T> void Test(T tem); と記述し、もう一つ「myMFC.cpp」というファイルを作って template<class T> void Test(T tem){}; と記述します。 そしてその関数テンプレートを他のファイルから 使おうとします。その時、 #include "myMFC.cpp" と記述してからその関数を使うことはできるのですが、 #include "myMFC.h" と記述してその関数を使おうとすると 未解決の外部シンボル "void __cdecl Test(int)" (?Test@@YAXH@Z) を 使おうとしたというような主旨のエラーが出てしまいます。 ヘッダファイルを記述してライブラリを使うのが普通だと思うのですが なぜかエラーになってしまんです。 しかし直接cppファイルを読み込めばエラーにならないのです。 ちなみにテンプレートではなく、普通の関数ならどちらとも エラーになりません。 原因に検討が付く方がいらしたら、なんらかのアドバイスをお願 いたします。
778 :
デフォルトの名無しさん :03/11/21 20:30
XPを使っているのですが レジストリをじるのはどうすれば いいのでしょうか?
超初心者な質問ですみませんが、教えて下さい。 C言語をこれから始めるつもりなのですが コンパイルなどをするのにソフトが必要なんですよね?? これは、無料版がある様なのですが、検索したところ、種類が沢山あって どれを選んだらいいのかがよくわかりません。 初心者にも使いやすいものがあったら是非教えて頂きたいのですが。。。 ぶしつけな質問で申し訳ありませんが、宜しくお願いします。
>>777 myMFC.cpp のなかで Test() が使われて
いなければ、コンパイル時に
>template<class T> void Test(T tem){};
これは無視される。なんでかっつーと
インスタンス化されてないから。
詳細は、「テンプレート関数 明示的 インスタンス化」で
ググるよろし。
>>778 WriteProfileInt()
WriteProfileString()
WriteProfileSection()
>>779 BorlandC++でぐぐれ
なぜかエロサイトに_| ̄|○
C++BuilderXの日本語Personal版が出ればそれ勧めるんだが。 重い上に余り高機能でもないが。
>>782 さんありがとうございます。
確かにエロサイトありました(゚Д゚;)w
エロじゃない方では、学生版?とゆうのがありましたが、それでいいのでしょうか?
>>783 さん、ありがとうございます。
ぐぐった所、本の会社が移転業務で暫く閉鎖みたいです(25日まで)。
日本語版がなければ、オススメして頂いたのはやめておいた方がいいですか?
重ねての質問ですみませんが、宜しく御願いします。
>>780 なんとそうだったのですか!!
明快に理由を教えていただき、ありがとうございました。
・・しかしながら・・これには解決方法はるのでしょうか?
ググって調べてみたんですが、いまいち分かりません・・。
ようは、テンプレートを使ったライブラリを作りたいんですが、
そういう場合、どうするのが普通なんですか?
ひょっとして
「クラステンプレートなら問題がなく、そうするのが普通」
なのでしょうか?
>>785 一応標準C++的にはexportというのがあるんだが、実際にはそんなものが使える
処理系は皆無(0ではない)ので普通はtemplateライブラリの実装は全部ヘッダに書く。
>>786 なるほど、そうなんですか・・。
あっそっかっ!
インスタンス化されないから多重定義の問題も起こらない
という訳ですね。
ご教授ありがとうございました!
C++を、勉強してたんですが、クラスの必要性が、分かりません。 関数で、良いんじゃないか?と思うのですが・・・ クラスの必要性って、ありますか?
>>787 > あっそっかっ!
> インスタンス化されないから多重定義の問題も起こらない
> という訳ですね。
ちょっと違う。
複数のソースファイルに #inlcude してそこでインスタンス化されたら多重定義が発生しちゃうよね?
なので、コンパイラやリンカで色々と工夫がされていたりする。
>>786 export 初めて知りました。勉強になりまつ。
790 :
デフォルトの名無しさん :03/11/22 00:12
sin cos exp を使いたいのだけどエラーが出てしまいます。 #include<math.h>だけじゃだめなの?
791 :
デフォルトの名無しさん :03/11/22 00:14
>>744 ありがとうございました。
どっちがコンパイル後のファイル容量小さいか調べようかとも思いましたが、
あとで調べたら「猫でもわかる」の「MDI」の章では2重構造になってましたので、
とりあえず初心者としてはそっちが普通かなあということでそっちにします。
792 :
デフォルトの名無しさん :03/11/22 00:19
>>790 環境によるがコンパイル時にリンクするライブラリを指定
gcc hoge.c -lm
794 :
デフォルトの名無しさん :03/11/22 00:28
795 :
デフォルトの名無しさん :03/11/22 00:41
最新のC/C++の仕様書?ですか、言語仕様がまとまっている奴ですが、 あれは何処で入手出来るのでしょう?取り敢えずANSIのサイトを のぞいてみたんですが、見つかりませんでした。 もうANSIではやってないのでしょうか? もちろん英語で書かれていてもOKですし、有料でも構わないのですが。。 どこで発行しているんでしょう?御存じですか?
ISO
最新ならISOだな 以前のCの規格なら日本語訳がJISのサイトで読めるけど。
>>788 ある。しかしそれが分からないうちは関数だけ書いてればいい。
クラスの必要性って、大きなプログラム作った時、 関数より、分かり易いとかだったりしますか?
>>799 それ以前の問題として,構造体の必要性は感じてるか?
クラスと関数は同列で比べられる物じゃないよ
たとえばBCBみたいなRADを使ってWindowsアプリを作成するときは、コンポーネント を適当にポトリペタリして必要な(イベントハンドラという)関数を書くだけでそれなりの ものが出来てしまう。 厳密に言えば、そのポトリペタリが新しいクラスを定義していることになるのだが、 プログラミング初心者はそんなこと一切意識しないし、意識しないでもすんでしまう。 だから「クラスの必要性が分からんうちは関数だけ書いていろ」と。 そのうちスキルアップして欲が出てくれば、自然にコンポーネントの拡張や独自クラスの 構築に目が向くようになる。 ただ、そのときには、C++つうかオブジェクト指向的な分析手法を理解しているかどうかが 禿しく問われるが。
>>803 真面目に書くときはきちんと「激しく」と書こうね。
>>799 数百行のコードなら、書いていて気がつかないかも知れないが、
数千行のコードになると、変数や関数の管理が大変になる。
その変数や関数の管理場所としてクラスがあると考えておけば良いかも。
・・というか、クラスは使うときにオブジェクト化するだろ!
オブジェクト化を名前を変えて複数回行うことにより、クラス内で
定義した変数や関数を複製できるというメリットは分かるはず。
構造化プログラミングは機械寄り。 OOPは人間寄り。 だからこそ、
TStringsに入った値を保持したいのでフォームのメンバにして使ってます。 で、deleteとかしてないんですが、これってやっぱ問題ありますか? もし問題あるならTStringsではなくAnsiStringをフォームのメンバにして、 一時的にTStringsを使った後は一度全部まとめて一つのAnsiStringにする方法で 値を保持しようかなと思うんですが。 まぁラインが全部繋がっちゃいますけど。
>>801 まとめて管理したいデータをまとめる、これが構造体の利点。
例えば、人名録を作るっていうなら名前、年齢、性別みたいな情報は一まとめにしたいよね。
で、C++におけるクラスはさらにこの考え方を進めて、データとそのデータに対する処理(関数)
を一まとめにしている。
まずはこのあたりの理解でいいんじゃないかな?
実際には継承という考え方でさらに別のまとめ方ができるんだけどそのあたりはおいおいってことで。
>>806 揚げ足取りだけど関数は複製されないと思ふ。
関数は全てのメンバ関数は共有してる class A A a a.hoge() とやっても b.hoge()とやっても同じ関数を呼ぶ プログラムが色々操作してるんじゃなくて、コンパイラの部分で操作してる
リンカーじゃないの?
812 :
デフォルトの名無しさん :03/11/22 13:50
すいません、条件制御文の中で、大文字小文字の処理を以下のように書くのが面倒なのですが、 何か良い方法はありますか? 一応hogeはAnsiStiringです。 if( hoge=="TEST" || hoge=="test" || hoge="Test" )
813 :
デフォルトの名無しさん :03/11/22 13:52
>>812 AnsiStringにCスタイル文字列を返す関数があれば、それをstrcasecmpやらstricmpやらにかけるとか。
>>812 if (hoge.AnsiCompareIC("test") == 0)
>>808 TStringsのインスタンスは生成できないのでTStringListだよな?
フォームのメンバにしたのが、TStrings*で
TStrings* hoge; //フォームのメンバ
hoge = new TStringList; //コンストラクタかどこか
ってことか?
もちっと正確に書いてくれ意味不明だ。
newしたものはdeleteが必要だが、フォームのデストラクタかOnCloseあたりですればすむ。
わざわざAnsiStringに移し変える必要はないだろう。
ちなみにTStrings->Textを使えばAnsiStringと相互に代入できるけど。
>>817 すいません、説明不足でした。
TStrings *Global_hoge = new TStringList();//フォームのメンバ
というふうに丸ごとフォームのメンバにして、
あちこちの関数でGlobal_hogeの中の項目をいじってます。
>フォームのデストラクタかOnCloseあたりですればすむ。
あぁ、そうなんですか。よくわかりました。
OnCloseでやることにします。
どうもありがとうございました。
819 :
デフォルトの名無しさん :03/11/22 18:33
VS2003 の VC++ を使っています。 ちょっと古め(VC++5.0)の入門書をつかって勉強しているの ですが、昔の CDC クラスは、今の CPaintDC と同じものだと 思っているのですが、そう考えて間違いないでしょうか? よかったら教えてください。 VisualStudio2003Pro WinXP SP1
822 :
デフォルトの名無しさん :03/11/22 20:44
質問です。 C:\Documents and Settings\デスクトップ\a.gif C:\Documents and Settings\デスクトップ\b.jpg という場所にある二つの形式の画像の各幅と高さの情報を欲しい時は どのようにして取得すれば良いんでしょうか? 特に画像を表示したりはしなくて、その画像のピクセルの幅、高さの情報が欲しいだけなので 出来るだけ簡潔にやりたいのですが。 gifは何かライセンス的に問題があるようですが(?)個人利用なので問題ないと思います。 BCB6。WinXPです。
823 :
デフォルトの名無しさん :03/11/22 21:05
>>822 個人利用とかそういう問題じゃないんだが・・・・
しかし! 高さや幅を調べるだけならおそらくヘッダーを調べるだけだから問題なし。
824 :
デフォルトの名無しさん :03/11/22 21:11
825 :
デフォルトの名無しさん :03/11/22 21:18
>>823 gifはフォーマット自体に版権が主張されているのだからそれを問題視するなら
ヘッダー情報を解析するだけでも問題があると思うが?
#圧縮技術だけの問題じゃない。
>>826 GIFのファイルフォーマット自体は(C) CompuServeであって、
それはちゃんと表示いれとけばOK。
問題はGIFで使われている圧縮アルゴリズムに関する特許。
>>827 GIFの圧縮アルゴリズムに関する特許はその権利をユニシス社が持っているのであって、
それはちゃんと使用許可を取って使用料を払えばOK。
日本でのGIFの特許切れって来年の6月くらいだよな
>>824 >>825 ご親切にどうもありがとうございます。
一応二つとも目を通させて頂きました。
しかし経験の浅い自分には何が何やらチンプンカンプンで…。
もしかして、10行も20行も書かないと無理なのでしょうか?
2、3行ちょこちょこ書いてたら出来るものと考えていたんですが…。
Image->Heightみたいな感じで
831 :
すいません :03/11/22 22:00
トピずれ承知で質問しますが、基本情報技術者試験の参考書って何を 買えばいいか教えて下さいませんか?
>>830 それなりに複雑なフォーマットなんで自力でやるのが面倒ならなんらかの
ライブラリに頼るしかない。
JPEGならlibjpegとか。
>>830 ぶっちゃけファイル先頭から7バイト目からshort型で幅、高さの順に格納されてるだけ。
詳しくはGIFのヘッダについて書いてあるドキュメントでも読め
>>830 JpegはTJPEGImage使えばよろし。
GIFはBCBのライブラリにはないから自力でなんとかするか
どっかからフリーのコンポーネントを見つけてくるよろし
うわ、>824にあった情報取得サンプル見たら山ほどエラーが出てきてしまった [C++ エラー] hoge.cpp(192): E2268 未定義の関数 'AnalyzeHeader' を呼び出した [C++ エラー] hoge.cpp(198): E2268 未定義の関数 'AnalyzeLSD_GCT' を呼び出した [C++ エラー] hoge.cpp(202): E2268 未定義の関数 'GetByte' を呼び出した [C++ エラー] hoge.cpp(206): E2451 未定義のシンボル ID_EXTENSION [C++ エラー] hoge.cpp(210): E2451 未定義のシンボル EX_APPLICATION [C++ エラー] hoge.cpp(212): E2268 未定義の関数 'AnalyzeAE' を呼び出した [C++ エラー] hoge.cpp(217): E2451 未定義のシンボル EX_GRAPHICCTL [C++ エラー] hoge.cpp(217): E2172 case が重複している [C++ エラー] hoge.cpp(219): E2268 未定義の関数 'AnalyzeGCE' を呼び出した [C++ エラー] hoge.cpp(224): E2451 未定義のシンボル EX_COMMENT [C++ エラー] hoge.cpp(224): E2172 case が重複している [C++ エラー] hoge.cpp(226): E2268 未定義の関数 'AnalyzeCE' を呼び出した [C++ エラー] hoge.cpp(230): E2451 未定義のシンボル EX_PLAINTEXT [C++ エラー] hoge.cpp(230): E2172 case が重複している [C++ エラー] hoge.cpp(232): E2268 未定義の関数 'AnalyzePTE' を呼び出した [C++ エラー] hoge.cpp(239): E2268 未定義の関数 'DisplayMemo' を呼び出した [C++ エラー] hoge.cpp(240): E2268 未定義の関数 'AnalyzeUE' を呼び出した [C++ エラー] hoge.cpp(246): E2451 未定義のシンボル ID_IMAGE [C++ エラー] hoge.cpp(249): E2268 未定義の関数 'AnalyzeID_LCT' を呼び出した [C++ エラー] hoge.cpp(253): E2268 未定義の関数 'AnalyzeImageData' を呼び出した [C++ エラー] hoge.cpp(256): E2451 未定義のシンボル ID_TRAILER Gifは無理ですぅ、あきらめました(;´Д`) jpgで結構なんで幅と高さの情報を取得するだけのライブラリなりサンプルが落ちてそうなサイトを お教え願えませんでしょうか…。 これが出来なければ今までやってきたことが水泡に帰してしまうです(;´Д`) とほほ
>>834 あ、TJPEGImageですか、新たな言葉の響き。
とりあえずそいつでいっちょ検索して何とか
C:\Documents and Settings\デスクトップ\b.jpg
の幅と高さを取得出来るように格闘してみます。
日曜趣味プログラマなので今月中には…。
ifGIF2.spi
>>822 WinならAPIでいけるんじゃないかな
#include <stdio.h> #include <iostream> using namespace std; void main(int argc, void *argv[]) { string filename; short width, height; if (argc == 2) filename = (char *)argv[1]; cout << filename << endl; FILE *fp = fopen(filename.c_str(), "rb"); fseek(fp, 6, SEEK_SET); fread(&width, sizeof(width), 1, fp); fread(&height, sizeof(height), 1, fp); fclose(fp); cout << filename << " size is" << endl; cout << "Width: " << width; cout << " Height: " << height; cout << endl; }
別にprintfでええやん、、
>>840 お前テケトーすぎ。ストリーム系はCとC++の混在だし、mainの戻り値はおろかargvまでvoidかよ見たことねーよ
とりあえずJpgできましたー
TJPEGImage* Img = new TJPEGImage;
Img->LoadFromFile("C:\\Documents and Settings\\デスクトップ\\b.jpg");
int ImgWidth = Img->Width;
int ImgHeight = Img->Height;
みなさんのおかげです。
なかなか意欲が出てきたので、ついでにgifもやっちゃおうと思い、
839さんのリンク先から該当箇所と思われるところを見たんですが、
http://www.geocities.co.jp/SiliconValley/3453/gif_info/spec/GIF89MJ3.htm#論理画面記述部 みなさん、こんなのでわかるんですねぇ、すごいなぁ。
なんかここで
>7バイト目からshort型で幅、高さの順に格納されてるだけ
とか決定的な情報をくれている方もいらっしゃるんですが、そもそも
gifファイルのヘッダから情報を取り出すことがわからんというか…。
メソッドとかプロパティとかがわかんないです。
google先生に 「ヘッダを調べる」「c++」とかでリクエストしても出てきませんでした。
むうう。
> gifファイルのヘッダから情報を取り出すこと string filename; short width, height; if (argc == 2) filename = (char *)argv[1]; cout << filename << endl; FILE *fp = fopen(filename.c_str(), "rb"); fseek(fp, 6, SEEK_SET); fread(&width, sizeof(width), 1, fp); fread(&height, sizeof(height), 1, fp); fclose(fp);
>>844 あ、ありがとうございます。
わざわざ書いて頂いて筆舌に尽くしがたい喜びを感じています。
そちらのコードを適用させていただこうかと思います。
どうもありがとうございました。
846 :
デフォルトの名無しさん :03/11/23 03:06
847 :
デフォルトの名無しさん :03/11/23 03:31
VBでは以下のような列挙型を使ったクラスを作ると、 そのクラスを使う時に、その引数の位置にカーソルが来ると 値候補がプルダウンで出てくるようになります。 BCC用でそのような機能の付いたエディタはないでしょうか? ↓MyClassクラス ------------------------------------------- VERSION 1.0 CLASS Attribute VB_Name = "MyClass" Enum MyMethodAlignment 左 = 1 右 = 2 End Enum Sub MyMethod(Expression As String, Alignment As MyMethodAlignment) Select Case Alignment Case 左 Case 右 End Select End Sub ------------------------------------------- ↓どこかのプロシージャ ------------------------------------------- Dim Mc As New MyClass Mc.MyMethod "hoge", |左 | |右 | |中央| -------------------------------------------
>>847 間違えました。この例では「中央」はありません。
849 :
デフォルトの名無しさん :03/11/23 03:34
>>847 VisualStudio(もちろんVBも含まれる)でいうIntelliSenseか?
850 :
デフォルトの名無しさん :03/11/23 03:41
>>849 IntelliSenseというのは何でしょうか?
とりあえずVC++はそのまま触ってみましたが、
列挙型の名前が表示されるだけで、値候補は出ませんでした。
(あと我侭な話ですが、同じソースでもBCCなら47KBのexeが
VC++だと150KBになっちゃったりするので、できればBCC用がいいです…)
>>850 オフとぴだけど、BCCなら47KBのexeがVC++だと150KBの具体的なコードをしりたい
これの予感〜〜
28 :デフォルトの名無しさん :03/11/05 12:02
STLつかうと一気に実行ファイルサイズが10倍に?!
29 :デフォルトの名無しさん :03/11/05 12:04
>>28 環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
30 :デフォルトの名無しさん :03/11/05 12:06
>>29 すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
>>852 ただ単に親ウィンドウの中に子ウィンドウを1個表示しただけの、
cppファイル1個だけの130行ほどのソースです。
(他には閉じるときに確認ダイアログが出てきます。)
インクルードは「windows.h」だけです。
VC++では空のプロジェクトにコピーしたのですが、「外部依存関係」
というところになぜか「basetsd.h」というファイルがリンクされてます。
でもその1個しかないcppファイルにはそれはインクルードされていません。
いや、きっとVC++ではデバッグコードをつけてビルドしたな。
>>854 VC++でビルドするときにReleaseにした?
>>855 Releaseにすると24KBになりました。。
デバッグモードでMFCはDLLにするよりも、 リリースモードでMFCをスタティックリンクした方が小さくなる罠。 #ある程度以上のアプリの場合。
お世話になっております。 Mes(hwnd,"hello World!"); でHello World!と表示させたいんですが、どうやったらいいですか? BOOL Mes(HWND hdwnd,char b) { str[]; sprintf(str,....... ); textout(hdwnd,str,strlen(str)....); .....???? } お願いします。
>>858 // つい最近似たようなことしたくてこんなの書いた
void Mes(CDC *pDC, int center, int top, CString & str)
{
pDC->SetTextAlign(TA_CENTER);
pDC->TextOut(center, top, str, str.GetLength());
pDC->SeteTextAlign(TA_LEFT);
}
// それはさておき、charだけしか渡さなかったら文字列は描けるわけないじゃん
hwndで指定したウインドウに表示させたいです。座標はとりあえず固定でx=0,y=0です。 具体的に知りたいのは文字列の受け渡しです。 Mes(hwnd,"hello World!"); このような関数で 結果が Hello World! になるようにしたいです。 >860 pDC? デバイスコンテキストのポインタですか? GetDC(hdwnd); ReleaseDC(hdwnd); をはさめば良いんではないですか?
そういえば僕の環境はBCCです。
>>861 よく分からんがとりあえず下記の突込みへのコメントは?
BOOL Mes(HWND hdwnd,char b)
それでな直るんかも知れんしそれからだ。
そういえば、HSPのSDKに似たようなのがあったような、、、。 というかそのものズバリかなぁ、、、、 お願いします。
ウィンドウに何か描画したければGetDC()〜ReleaseDC()。 しかしそれでは他のウィンドウに隠されてしまうと消えてしまう。 そこで少年はWM_PAINTの処理中に描画を行うことを知る。 しかし、ある程度複雑な描画を行うようになってくるとそれでは非効率だと思い始める。 そこで少年は”ダブルバッファリング”について勉強することになる。 つぅか入門書読め。
説明不足でした。 デバック用のウインドウなので0.1secごとにWM_TIMERが来て更新するよう になっています。 最終的にチェックする数値の数が膨大になるのでまとめてWM_PAINTで更新 するようにするつもりですが、、、、、。
ダブルバッファリング? そ、、、それは、、、、、
868 :
デフォルトの名無しさん :03/11/23 12:18
ダブルバッファリングとはッ! PGを目指すものならば誰もが通る道ッ! 今尚廃れぬッ! 全ての基本ッ! そのシンプルな「美」に酔いしれよッ!! 少年ッ!!!
歩歩歩> 君の質問を見てる奴は君の実力など知る由も無い。 ポインタさえ知らない超初心者なのか、ウインドウプロシージャを知らない 初心者なのか、あるいは俺より上級者なのか。 866を見た時点で初めてどの程度かある程度の想像がつく。 質問する時点で問題点を単純化して明確に示さないと、駄レスがどんどん 伸びて迷惑し、君の欲しい回答は得られないぞ。それがわからないうちは掲 示板で質問するな。後、独り言ならよそでやれ。
メール欄ふしあなさん
つぅか、単に文字列表示したいだけならエディットコントロールとかはっつけて そこにSetWindowTextとかしたほうが楽だよな。クリップボードも使えるし。
>>865 ダブルバッファリングよりオフスクリーンの方が適切で内科医?
>869 すいません。軽い気持ちで書き込んでしまいました。 >871 それも少し考えましたが、rcファイルはいじりたくないんです。気分的に面倒だから。 正確な変数の数が現時点でどれくらいになるかわからないし、、、、、。 HSPのmesみたいなかんじにできれば、よろしいんですが、、、。
ウインドウを作るのもマンドクセなら、デスクトップ(というかスクリーン)に 描画するという手抜きな手段もあるな。
>>873 普通のウィンドウにコントロールはりつけるのにリソースいじる必要なんかないが。
モーダレスダイアログに表示することを前提としています。 現在製作中のアプリケーションはフォトショップタイプ見た目です。 HSPのmesの実装がしたいんですが、、、、。
static作ってそれに投げれば?
リソースいじるのが面倒だとかがたがたいうなら普通のウィンドウで 適当なスタイル指定して背景色変えとけばいいと思うが。 モーダルならともかく。
複数のウィンドウで作成するの?
880 :
デフォルトの名無しさん :03/11/23 13:48
質問です。 これからWindowsプログラミングを始めるとするならVC++のMFC、Managed C++、 どちらを学んだほうが得でしょうか? 個人的にManaged C++というのがすっきりして見えたので、 それをやってみようと思っていますが、「それはやめとけ」的な意見があればよろしくお願いします。 選択肢が2つなのは、バイト先でVC++使ってプログラムを作れと言われたからです。 MFCかManagedかについては、好きにしていいと言われたので迷っています。 #当方、一応CとC++を少しは分かっているつもりですがUnix環境以外で書いたことがありません。
MFCを使わずWin32APIを直接叩く手法を覚えておくことは Windowsプログラミングにおける基本に繋がる。 Managed C++をやるぐらいなら素直にC#にしたほうがいい気がするが、 まぁ、基本的にどちらも期待されてないみたいだから好きにすれば?
>>880 >MFCかManagedかについては、好きにしていいと言われたので迷っています。
いい加減なオーダだなと思った。
これからどちらの仕事が増えそうでしょうか?
どうせするなら続ける意味があるほうをと思っています。
ちょっと調べてみた感じでは、MFCはそのうち無くなるという意見と、
Managed C++はやる意味が無い、
>>881 さんのようにC#がよい、
それについての情報が少ない(=使っている人が少ない?)、等等見ました。
Win32APIを使える、またはそれを使うDLLを使えるのなら、Managedでもいいかなとか思ってます。
.NET FrameworkがWindows以外のOSでも動く時代が来ることは期待できないでしょうか?
>>883 最終行のみ。
動いてると言えば動いてるが、ない。
>>876 目先のことに捕らわれ過ぎで本質が全く見えていない。
>860の実装と自分の関数宣言の何が違うのかよく見ろ。
そしてそれは>863にも指摘されている。
886 :
デフォルトの名無しさん :03/11/23 15:19
当方まったくのC言語系初心者ですが、 C、C++、C#のどれからはじめるのがいいでしょうか。 (この3つの違いすらあまり把握してませんが) 一応Javaを多少やったことがあります。 プログラムはこんな感じというのは 多少は分かる方と思います。 もし参考書籍などあればそちらの方もお願いいたします。
887 :
デフォルトの名無しさん :03/11/23 15:21
>>886 の自己レス
一応私の環境はWinXpでC言語使うためのソフトすら
まだ導入してません。
VisualC系にしようかとは思ってます。
再度見直してみましたが、なにせ不慣れなもので、、、、。 まず見たことがないものが複数あったので潜在意識でしかとしてしまいました。 void Mes(CDC *pDC, int center, int top, CString & str) { pDC->SetTextAlign(TA_CENTER); pDC->TextOut(center, top, str, str.GetLength()); pDC->SeteTextAlign(TA_LEFT); } まず、なぜかこれはMFCか何かを使っているように見えるんですが 気のせいでしょうか? CString & strってなんですか?
>>888 使ってるかも知れないね。
最終行は文字列を扱うであろうクラスへの参照。
誤解を恐れずに言うとポインタの機能制限版みたいなもんだな。
>>847 についてご存知の方がいらしゃったらお願いします。
もう少し細かく言うと、
・右クリックしなくても入力候補が出る
・メンバ以外の無関係な入力候補は出ない
・列挙型の場合は値候補が出る
です。ちなみに、貧乏なのでできるだけ安いエディタでお願いします。
892 :
デフォルトの名無しさん :03/11/23 18:20
質問なんですが、 VBで作ったプログラムを動かすためにはランタイムが必要ですよね。 たしかこれはOS自体には標準で組み込まれていないため、別にインストール する必要があったと思います。 また、VC++のMFCで作ったプログラムはMFCのランタイムのようなものが 必要で、VBとは違ってOSに標準で組み込まれていたと思います。 で、そこで疑問なんですが、MFC自体にもおそらくいくつかのバージョンがあると 思うのですが、とすると最新のMFCを利用して作ったプログラムは 場合によってはWin95,98のような古いWin系OSで動かないということもありえますか? 根本的に考え方が間違っているかもしれませんが、よろしくお願いします。
>>892 スタティックリンクすればDLLはいらない
>>893 「スタティックリンク」調べました。
VBばかりやってたので全然知りませんでした。ありがとうございます。
895 :
デフォルトの名無しさん :03/11/24 00:56
C/C++をやっているとよく出てくるこの矢印みたいな'->'ってどんな役割を持っているんですか? 色々ありすぎる場合は代表的なものだけの説明で結構です。
a->b (*a).b
>>896 初心者なもんでよくわからないんですが、どういうことですか?
ほんとすいません。。。
ポインターから構造体やクラスのメンバーにアクセスするための方法
あー、マジな話、きちんとした入門書読んだ方がいいよ。それが一番の早道。 クラスのメンバにアクセスする場合、たとえば class Hogeの public void hogetta()を呼び出したければ、 Hoge hoge; hoge.hogetta(); Hoge* ptr_hoge = new Hoge; ptr_hoge->hogetta(); これでわからんかったら、これ以上ここで発言しないで(吊し上げくらうだけ)、 さっさと入門書を買ってくるべし。
#include <stdio.h> struct x { int y; int z; }; int main (void) { struct x A; struct x* B = &A; A.y =123; B->z =456; printf("%d %d\n",(*B).y, A.z); return 0; }
>>898-899 あっ、(*a).bってクラスだったんですか。何か私の知らないものかと思いました。
入門書ならもっているので、わかります。ありがとうございました。
↑多分、分かってないと思う(w
903 :
デフォルトの名無しさん :03/11/24 02:23
すいません。IDispatch' 型を 'AnsiStringにキャストしたり、その逆ってできますか? よろしくお願いします。
そういうキャストで合法なものはほとんどないんじゃねーかな。 いや、IDispathとAnsiStringを多重継承していたりするなら 話は別かもしれないが。 よって、「できない」
なるほど、多重継承とかはよくわからないのでやめときます。 ありがとうございます。 もしかして間に他の型を経由したりすると出来たりするのかな…
やめておきますありがとうと書きながら、答えて欲しさ満々ですな。
多重継承とかは、ってことじゃないの?
あるファイルをひらいて、それを行単位で(改行文字が出てくるまで)よみこんで 1行ごとに配列に代入する、というプログラムを作りたいのですが どうすればいいのかさっぱりです。どんな関数を使えばいいかだけでも 教えていただけないでしょうか?
>>911 fopen(), fgets(), fclose() だけでいけると思うけど?
1回の fgets() で読めないくらい長い行を考えるならもうちょい工夫が必要だろうが。
malloc(), realloc() も必要でしょうな。
>>913 そこまで書いたら、free()も書いておけ。
こういうの見てると、string, vector マンセーと言いたくなる。
>>910 >なんでTStrings使わないの?
抽象クラスだからですが。
917 :
デフォルトの名無しさん :03/11/24 11:51
放置してたスパゲティからカビ生えてキタ━━━━━(゚∀゚)━━━━━!!!! (゚ε゚)キニシナイ!!(゚ε゚)キニシナイ!!(゚ε゚)キニシナイ!!
激しく誤爆シテタ━━━━━・・・・・・・・・・(´・ω・`)
919 :
デフォルトの名無しさん :03/11/24 12:21
∧_∧ ( ´∀`)
>>917 スパゲィ状になったコードを放置してたらカビ(バグ)が出たー
と深読みしてみる
>>920 誰でも考えつくことを書き込んでしまう恥ずかしい人ですね。
誰でも考えつくことじゃないよ。 その証拠に2つしかレスが付いてない。
この状況を予見するかの様に穏やかに微笑む
>>919
/\___/ヽ ( こ / ::::::::::::::::\ . | ,,-‐‐ ‐‐-、 .:::| ┼'っ | '"⌒` ,: '"⌒` :::| l . | , 、_:< __,、 .::| \ /\i_i_i_/ヽ ::/ l | /`ー‐--‐‐―´\ ノ
>>912 fgetsでやろうとすると、空白ごとに区切られるのですが
%sでは駄目なんでしょうか?
fgets() は書式など指定できない。
馬鹿でした、scanfのこといってました。申し訳ない。 試してみます。
できました。ありがとうございました。
931 :
デフォルトの名無しさん :03/11/24 15:22
ちょっとJavaが関連しますが、お願いします。 int* data = new int[BGR24_IMAGE_MAX_SIZE / 4]; jintArray jdata = env->NewIntArray(BGR24_IMAGE_MAX_SIZE / 4); env->SetIntArrayRegion(jdata,0,BGR24_IMAGE_MAX_SIZE / 4,data); delete [] data; return jdata; としたとき、jdataのメモリを明示的に開放する必要はありますか?
たびたびすいません。 ファイルの表示はできるのですが 配列に1行ごと入ってないようなんです。 ソースさらします。 #include<stdio.h> #define MAX 100 main(void) { char buff[MAX]; FILE *infp, *outfp; if((infp = fopen("r.c" ,"r")) == NULL){ printf("file not found\n"); exit(1); } while(fgets(buff,MAX,infp) != NULL){ printf("%s",buff[0]); } fclose(infp); return (0); } 何か根本的に違う気がするんですが。 教えていただけるとありがたいです。
printf("%s",buff[0]); printf("%s",buff);
もしくは printf("%s",&buff[0]);
>>934 printf("%s",&buff[6])としたときに
main(void)と表示したいのですが(表示してるのはこのプログラム自体)
実際は
de <stdio.h>
de <stdio.h>
e MAX 100
e MAX 100
oid)
oid)
buff[MAX];
*infp, *outfp;
*infp, *outfp;
nfp = fopen("r.c" ,"r")) == NULL){
tf("file not found\n");
(1);
(1);
(1);
(fgets(buff,MAX,infp) != NULL){
tf("%s",&buff[6]);
tf("%s",&buff[6]);
e(infp);
n (0);
n (0);
n (0);
と表示されてしまいます。
プログラム自体おかしいんですかね?
>>935 printf("%s",&buff[6])は各行の6文字目から表示してるんだからその出力で合ってるだろ
×6文字目 ○7文字目
>>936 そうなってますね。
だから、1行ごとに配列に入れるにはどうしたらいいのか
教えていただけませんか?
>>939 すいません、ページ数なんか書いていませんね。章でした。
>>938 各行全部取り込みたいってこと?
それだったら各行を入れる空間をmalloc()などで確保して最後にfree()する必要がある。
1行あたりバイト数も1ファイル辺り行数も制限つけていいなら、
char buff[MAX];
を
#define MAXLINE 1000
char buff[MAXLINE][MAX];
とでもして、
int lineNO = 0;
while (fgets(buff[lineNo], MAX, infp) != NULL) {
printf("%s", buff[lineNo]);
++lineNo;
}
とでもすればいい。
>>939 プログラミングの問題じゃなくて、単純な算数の問題だろ?
下2桁なら100で割った余りを得ればいい。
まともな本なら「剰余演算子」で索引に載っているはずだ。
>>942 調子に乗って確認もしないで書くのはやめろ。
>>943 そうですよね、まったく気づきませんでした。。。
まだ中2なんでこれから数学のセンスも磨き頑張りたいと思います。ありがとうございました。
>>945 普通のプログラミングに数学のセンスはいりません
>>945 ただ単に桁区切り記号付けたいだけならitoaなりsprintfで文字列に変換した後に記号付けたほうが楽だぞ。
桁区切り記号付けるのってどうやるの? 自前?
>>941 ありがとうございます。できました。
分かりやすくやっていただけてうれしいです。
また、よろしくお願いします。
952 :
デフォルトの名無しさん :03/11/24 20:10
つい最近Cをやり始めました。 参考書をもとに作りましたが文字判定がうまくいきません。 なにかまずい所があるでしょうか? よろしくお願いします。 OSは2000、ハイパーターミナル(COM1)使用です。 #include <16f873.h> #fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP #use delay(CLOCK=20000000) #use rs232(BOUD=9600, XMIT=PIN_C6, RCV=PIN_C7) int timed_getc() { long timeout; timeout=0; while (!kbhit() && (++timeout < 50000)) delay_us(100) if (kbhit()) return(getc()); else return(0xFF); } 続きは下に
953 :
デフォルトの名無しさん :03/11/24 20:10
void main() { char cmd; while(1) { cmd=timed_getc(); if(cmd==0xFF) printf("TIME OUT\n\r"); else { putc(cmd); switch (cmd) { case 'a': printf("GET A"); break; case 'b'; printf("GET B"); break; case 'c'; printf("GET C"); break; default ; printf("SONOTA"); break; } } } }
954 :
デフォルトの名無しさん :03/11/24 20:28
BCCをインスコする時にファイルをいじるのが結構難しいと聞きました。 それで、簡単にセットアップできるソフトにSETBCCとBCC Developerがあるみたいなんですが、 BCC Developerはあまりよくないという噂と、フリーとは思えないいい出来だという噂と 二分していてどうしたものかと悩んでいます。 どちらを選択したらいいでしょうか? (因みに当方プログラミングの知識は皆無のド初心者です。)
>>954 BCC DeveloperってBCCの設定はしてくんないんじゃなかったけ?
BCC Developerは開発環境であり、設定ソフトではないと思う。
SET BCCはよくわかんなかったけど、C言語を始めよう!というやつで俺は設定した。
で、BCC Developerは開発環境としてはとってもよいとおもうけど。ほんと、フリーとは思えない。
同じ作者が作っているJmEditorというものもテキストエディターとしてとても使いやすいから使ってみたら?
>>954 インストールしたらreadme.txtを読む。
書いてあるとおり、bcc32.cfgとilink32.cfgを作成するだけ。
簡単です。
>>956 簡単だよねえ?
なんであれでわからない奴がいるんだか、マジでわからん・・・。
subscripted value is neither array nor pointer っていうエラーがでたんですがどういう意味なんでしょうか?
>>955 レスありがとうございます。
あれ?設定はしてくれないんですか?>デベロッパー
他のサイトで勧められたのですが、信じ込んでしまっていました(汗
C言語は始めよう!は簡単にできますでしょうか?
プログラム関係の知識が皆無と書いたのはセットアップ時にわからなくなったりすると
大変困るらしいので、初心者でも失敗なくインストールできる方法をとりたいからなんです。
ちょうどエディタの話がでているのでついでにもうヒトツ質問なんですが、
XPのメモ帳を使ってやるのはやめた方がいいのでしょうか?
避けた方がいいのであれば、オススメして下さったエディタを使ってみたいと思います。
>>956-957 レスありがとうございます。
>bcc32.cfgとilink32.cfgを作成するだけ
ダイアログみたいのが出てきて次へ次へと進めていけばそれで作れる感じですか??
>>961 ごめんなさい。セットアップ前に聞きたいんです。
セットアップ中断したくないので。
963 :
デフォルトの名無しさん :03/11/24 20:55
>>958 文字通りの意味だろ?
辞書引いたら?
具体的なことを聞きたいなら、該当ソースを晒したら?
正しくない書きかたしているはずだから。
967 :
デフォルトの名無しさん :03/11/24 21:49
外部で定義してあるメンバ関数内(staticではない)でstatic変数(メンバではなく関数内だけの)を使うと 全てのインスタンスは同じその変数を共有してしまうんでしょうか?お願いします。
>>967 そのためのstatic変数なわけだが。
>>967 インスタンス間で別の値を持ちたいなら素直にメンバ変数を使えばいいじゃん。
いや、メンバ変数にします。
1行ごとに入れるやり方を聞いた者です。 1行ごとに取り出して、それを辞書順に並べ替えようとしてるのですが そこでまた躓いてしまっています。 for(i=0;i<5;i++){ for(j=1+i;j<6;j++){ if(strcmp(buff[i],buff[j]) > 0){ temp = *buff[i]; *buff[i] = *buff[j]; *buff[j] = temp; } } } for(k=0;k<5;k++){ if(buff[k] != NULL){ printf("%s\n",buff[k]); } } どなたかご教授ください。
973 :
デフォルトの名無しさん :03/11/24 22:31
今までコンストラクタは宣言の段階でしか呼び出せないと思い込んでいたのですが、 コンストラクタを明示的に呼び出すこのやり方↓は他のコンパイラでも通じるんでしょうか? ちなみに自分の環境はVC7.1です。 Object obj; obj.Object::Object();
974 :
デフォルトの名無しさん :03/11/24 22:59
すいません、TPageControlで複数のタブがある時、 右クリックした位置のタブをアクティブにしたいんですがうまくいきません。 一応TTabsheetのOnMouseDownイベントに PageControl1->ActivePage=this; とか書いてみたんですが*const は*TTabSheet型に変換できないとエラーが出ます。 TTabSheet *TabSheet = PageControl1->Pages[?];//ページのインデックス値がわからない PageControl1->ActivePage=TabSheet; とでも書けばいいんでしょうが、動的にぽっぽこタブを生成してるもんで、 ページのインデクス値がわかりません。 どういう方法で解決するのが良いのでしょうか。
ウィンドウズを騙せばいいんだよ。 右クリックが押された -> 左クリックが押されたとメッセージを送る
>>972 おまいさんがやりたいのは文字列の入れ替えだろ?
*buff[i] なんてことしたら文字になっちゃうじゃねーか。
で、結局上のコードみたいに 2 次元配列で確保したんだったら入れ替えはちょっと面倒くさい。
一度ポインタ配列に入れてから入れ替えるのがいいかも。
char *line[MAXLINE], *temp;
for(i=0;i<MAXLINE;i++) line[i]=buff[i];
で、入れ替えとか後の処理は buff じゃなくて line を使う。
temp = line[i]; line[i]=line[j]; line[j]=temp;
>>974 //TTagSheetのOnMouseDownイベントハンドラ
PageControl1->ActivePage = dynamic_cast<TTabSheet*>(Sender);
ところで、普通はOnMouseUpじゃないかな?
↑あー、安全を期すると if ( dynamic_cast<TTabSheet*>(Sender) { } でくくった方がいいな。
>>974 さいさいスマン。
このスレは環境依存ヲケだが、環境は明示するようにしてくれ。
TPageControlとあればVCL使いはすぐに理解するのだが、そうでないシトも見ているので。
そういや人間が最後の使徒だったな。
>>976 for(i=0;i<MAXLINE;i++){
line[i]=buff[i];
}
for(i=0;j<5;i++){
for(j=1+j;k<6;j++){
if(strcmp(line[j],line[k]) > 0){
temp = line[j];
line[j]=line[k];
line[k]=temp;
}
}
}
for(l=0;l<5;l++){
if(line[l] != NULL){
printf("%s\n",line[l]);
}
}
エラーがでて入れかえてくれません…
>>982 自己レスです。
変数変え忘れてました。
変えたら何とかエラーは起こらないのですがうまくいかないです。
(データファイルの内容)
jjhi
rrcju
kbsw
puxdu
byekm
(実行結果)
jjhi
rrcju
kbsw
puxdu
byekm
rrcju
kbsw
puxdu
jjhi
>>981 ム板の基本:「エラーメッセージを書く」
>>983 ノンノン
質問する人の基本中の基本:「エラーメッセージを省略せずきちんと書く」
985 :
デフォルトの名無しさん :03/11/25 00:14
>>977 駄目ですー。タブ上で右クリックしても、その位置のタブがやっぱりアクティブになりません。
というか全てのタブが非アクティブ状態になってしまいます。
気になったのはTTabSheetのイベントハンドラに書いても何も変化しなかったことです。
しょうがないのでTPageControlのオブジェクトインスペクタ上で
OnMouseDownの部分にさっき作った「TabSheet1MouseDown」を設定したんですが、
上記のような現象が起きました。
TTabSheetのイベントハンドラに設定しても動かず、TPageControlのイベントハンドラに設定すると
動くようになる、というのは実は以前も何回かあったんですが…。
どういうことなんでしょうか。
>>979 失礼しました。
BCB6 WindowsXPです。
質問です。 class C1{ ... virtual ~C1(); }; class C2 : public C1{ ... virtual ~C2(); }; C1 *pc1 = new C2; delete pc1; これってきちんとC2オブジェクトとしてメモリ解放されるんでしょうか?
>>985 あー、そうか。タブ部分はTPageControl領域だ。
んじゃTPageControlのOnMouseDown内で処理するしかないな。
PageControl1->ActivePageIndex = PageControl1->IndexOfTabAt(X,Y);
これでいけるはず。
>>988 ありがとうございます!できました!
一人じゃなかなか思いつかんかったです。
どうもありがとうございました。
>>986 >これってきちんとC2オブジェクトとしてメモリ解放されるんでしょうか?
そうする為にデストラクタを virtual にしてるわけで。
991 :
デフォルトの名無しさん :03/11/25 04:02
質問です。 c言語でgetoptを使用したいんですが、unistd.hヘッダがないというエラーが出たので、 unistd.hをダウンしてインクルードファイルに入れヘッダを定義したのですが、 プロトタイプ宣言にないgetoptの使用とエラーがでました。 そこで同じようにgetopt.hをダウンしインクルードファイルに入れ定義したのですが 入れる前と同じエラーが出てコンパイルできませんでした。 使用環境はwindowsXPでBorland C++を使用しています。 同じプログラムをUNIX上でコンパイルすると成功するのですが、 windows上ではunistdは使用できないのでしょうか? それとも、何か他に作業が必要なのでしょうか?
constメンバ関数内でメンバ変数をいじるにはどうすればよいんでしょうか?
immutable
mutableだYO!
記念カキコ v(^-^=)
あ、こんな修飾子あったんですね。 さんくす
終
わ
り
。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。