【初心者歓迎】C/C++室 Ver.5【環境依存OK】
4
5 :
デフォルトの名無しさん :04/02/18 20:25
perlのcrypt関数と同じ動作をC++でもさせたいのですが、 unistd.hが無いのでその関数が使えません。 どうにかしてC++でcrypt関数を使う事は出来ないでしょうか?
環境書けよバカ 「C++で使いたい」じゃなくて「Windowsで使いたい」だろうが C++で使いたいならLinuxでも入れとけ
windowsです
>>6 > 「C++で使いたい」じゃなくて「Windowsで使いたい」だろうが
それがわかるってことは
>>5 の書き方でも十分だろ。
cout,endlって・・・ CとC++って全然違うじゃん・・・
下記のコードの場合、INIファイルに保持しているウィンドゥハンドルに対し 正しくコマンドライン引数をメッセージとして送信するのですが //OK:「INIファイルのリード」→「COPYDATASTRUCTを設定」 if ( ParamCount() > 0 ) { AnsiString FilePath = ExtractFilePath(Application->ExeName) + "Sample.ini"; TMemIniFile *Ini = new TMemIniFile( FilePath ); int i = Ini->ReadInteger( "SECTION1" , "WindHand", 0 ); delete Ini; COPYDATASTRUCT cds; cds.dwData = 1; cds.cbData = ParamStr(1).Length(); cds.lpData = (LPVOID)(ParamStr(1).c_str());//コマンドライン引数 SendMessage((HWND)i,WM_COPYDATA,(WPARAM)Application->Handle,(LPARAM)&cds); }
下記のコードの場合はcds.lpDataがAnsiString FilePathを示すポインタに 書き換わってしまいます。 //NG:「COPYDATASTRUCTを設定」→「INIファイルのリード」 if ( ParamCount() > 0 ) { COPYDATASTRUCT cds; cds.dwData = 1; cds.cbData = ParamStr(1).Length(); cds.lpData = (LPVOID)(ParamStr(1).c_str());//コマンドライン引数 AnsiString FilePath = ExtractFilePath(Application->ExeName) + "Sample.ini"; TMemIniFile *Ini = new TMemIniFile( FilePath ); int i = Ini->ReadInteger( "SECTION1" , "WindHand", 0 ); delete Ini; SendMessage((HWND)i,WM_COPYDATA,(WPARAM)Application->Handle,(LPARAM)&cds); AnsiString n = AnsiString((char*)cds.lpData); ShowMessage(n); →"c:\Documents a・・・"を表示 } 影響ないと思うんですが、なんででしょうか?
AnsiStringということは、BCBだな? 「AnsiString c_str 注意」とかで検索してみな
ParamStrが返すAnsiStringをどこでも受け取ってないから すぐ消えちゃうって事だな。なのにc_str()で使おうとしてる。
>>13 へ〜結構ヒットしました、じっくり読んで見ます。
そういう検索方法もあるんですね、ありがとうございます^^
>>14 ParamStr(1)は壊れてないです。
(・(ェ)・)
> ParamStr(1)は壊れてないです。 どうやって確かめたの?
まあまあ、初心者が知ったかぶりするのはよくあることさ。 本人が壊れてないって言ってるんだから。 ParamStr関数置いてあるコード領域は壊れてないんだろう。
単純にSendMessageの後にShowMessage( ParamStr(1) )
で確認しまた。
>>18 >ParamStr関数置いてあるコード領域は壊れてないんだろう。
コード領域?
質問 どなたかMFCのCArrayの使い方を教えていただけませんでしょうか。 「Collect」というサンプルを参考に、int型変数を要素として持つ配列を 作ろうとしているのですが、MFCで作られる全くのSDIスケルトンに、 CArray<int,int> m_iArg; などとやってもコンパイルが通りません。 試しに、サンプルである「Collect」と同じ宣言で、 CArray<CPoint, CPoint> m_ptArray; などとやっても全く同じエラーが出ます。ですが、同じマシンで「Collect」を コンパイルすると通ります。何かincludeでも加えてやれば通るようになるのでしょうか? ご存じの方がおられましたらご教授ください。
>>19 それは、毎回「別なAnsiStringの実体」が返されてるだけですが。
もちろん文字列の内容は同じですが。
>>20 最低限、どういうエラーが出たかも書かずに回答が帰ってくると思ってるのか?
>>21 う〜ん、どういう事なのか理解できない・・・
修行が足りないようです(w
>>11 >>19 AnsiStringもstd::stringも、c_str()はその場限りの寿命なんだよ。
c_str()の返すポインタを他の変数に記録して後で使うってのは
どの入門書を見てもダメと書いてあるはずだ。
意味がわからなかったら cds.lpData の値とShowMessage後の
ParamStr(1).c_str()の値を比較してごらん。
>>23 そもそもポインタが分かってないみたいだな
億劫がらずに入門書をよく読み返してごらん
>>20 afxtempl.h を include
stdafx.h の中でいい
>>20 ただの配列が使いたいなら、std::vectorを使って欲しい。
C言語をはじめました(windows2000)。ボーランドのフリーのコンパイラで実行すると、 C:\cprog>bcc32 hello.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland hello.c: 警告 W8070 hello.c 5: 関数は値を返すべき(関数 main ) Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland となります。 プログラムは、 #include <stdio.h> main() { printf("hello ,world\n"); } 警告 W8070 hello.c 5: 関数は値を返すべき(関数 main )はなにでしょうか。 一応実行はできました。
>>29 入門書よく読んでね
main関数は戻り値を省略するとint型になる
return 0;を追加しとき
32 :
デフォルトの名無しさん :04/02/19 00:00
大量のデータを処理するプログラムを作ったので、 少しでも処理を早くしようとベンチを取っています。 コードを見やすくするためにユーザー関数を使っていたのですが それを使わないほうが早くなると思ったのですが、 ベンチを取るたびCPUの動き具合で数秒のズレがあり、 どちらが早いか分からないです。 ユーザー関数は呼び出さないほうが早いのでしょうか?
釣りだな
釣りではないです。 ユーザー関数を呼び出さないほうが早いとは思うのですが一応教えていただけないでしょうか?
35 :
デフォルトの名無しさん :04/02/19 00:26
>32 ユーザー関数使うと速くなるらしいけど。 | 具体的には、普通に BASIC を起動した後、起動したいディスクを入れ | defusr=&h180:u=usr(0):defusr=&h400:u=usr(0) | と実行するだけです。 | ROM ソフトも後差しすればこの方法で高速モード起動可能らしいです。
dmrが泣いている。
DEF USR0=&HE000
どなたかご教授お願いします、、
ユーザ関数っていうのが何を指したいのか不明だが、C/C++の関数呼び出しには それなりにコストがかかる。 C++ならinline関数によってある程度カバーできるが。 template+functor+inline、これ最強。
>>39 のでcrypt_r()があるでしょ。
一般的に、末尾に_rがつくのは、staticなバッファを返す標準的な関数を
リエントラントにするために、バッファを渡す形式に変更するもの。
まあ、はにゃーんの作者さんがそう思って名付けただろうと想像するだけで 俺は試してないけどね。
>>42 うーんとね、
>>5 氏は別のスレで同じ質問して
>>39 のソースについても
ちゃんとレスをもらってるのよ。
それを知ってて
>>39 のレスしたのかと思ったの
いや、それも知ってるし、C++相談室に書いてるのも知ってるし、 perlしか知らない初心者君が「tripが欲しいわけじゃない」とほざいてるのも知ってるし。 いい加減うざいからさ。
3次元配列として,全ての要素数を変数で定義する方法をご教授ください int x[a][b][x]; a=10; b=4; c=5; といった感じで,入力に応じて配列の要素数を変えたいと考えています。 処理の途中で変数を変える処理を行なうため,マクロは用いることができません。 コンパイラはボーランドの5.5です。 初心者丸出しの質問で申し訳ありませんが,ぜひともよろしくお願いします。
malloc(sizeof(int) * a * b *x)とか?
無理です。 2次元配列すら、実行時に変更することは出来ません。 もちろん、一次元配列でも要素数を変更することは出来ませんが。
素直に
>>47 の方式で自分でかけ算するか、
ポインタのポインタの配列作ってがんがるか、しなさい
>>46 ,48
int (*x)[4][3];
int nx = 5;
x = calloc(nx * 4* 3, sizeof(int) );
で x[nx][4][3] のように最も高い次元は、要素数定義が可能(参考文献:望洋 実践編)
ほかは出来るのかもしれんがよく知らん
んーとね、それはね malloc()で確保したメモリを、ポインタを介して 「あたかも配列のように」扱ってるだけなの。 単純な1次元のmalloc()でも同じ。 C99だと2次元以上でも変数が使えるのかな。
皆さんどうもありがとうございます。 初心者の自分にはかなり難しい話になりそうですが,なんとかやってみます。
>>46 配列に見えるだけで良いのなら、こんな感じ
int ***x ;
int i, j, k, a = 10, b = 4, c = 5 ;
x = ( int *** ) calloc ( a, sizeof ( x[0] ) ) ;
for ( i = 0 ; i < a ; i++ )
{
x[i] = ( int ** ) calloc ( b, sizeof ( x[0][0] ) ) ;
for ( j = 0 ; j < b ; j++ )
{
x[i][j] = ( int * ) calloc ( c, sizeof ( x[0][0][0] ) ) ;
for ( k = 0 ; k < c ; k++ )
{
x[i][j][k] = i * 100 + j * 10 + k ;
}
}
}
printf ( "%d\n", x[5][3][4] ) ;
56 :
デフォルトの名無しさん :04/02/19 06:37
お、来た来たヒステリー
57 :
デフォルトの名無しさん :04/02/19 06:47
晒しage
逆ギレというのは、質(ry
unistd.h のuniがunixのuniだということはわかってんのかね
いちおー書いとく。
>>5 氏
元のスレで解決しているはずなのだが、君が勘違いしてて理解できなかっただけ。
その君の勘違いを
>>42 氏が正してくれている。
同じ言語のスレならアクティブな回答者はたいてい重複しているから、
中途半端にスレを移動するのは意味がないし、無用な混乱を起こしやすい。
気をつけてくれ。
>27 >28殿 早速のお答えありがとうございます。解決できました。
また質問です。 複数のモードレスダイアログボックスにWM_PAINTなどのメッセージを送ろうと 考えています。今、親となるCWndにポインタ配列をメンバ関数として持たせ、 ここに登録したCDialogへのポインタに一つずつメッセージを送っていますが、 いまいち美しい方法とはいえないと思います。 SendMessageToDescendantsを使えばすべての子孫ウインドウに対してメッセージを 送ることができるようなことが書いてあったのでやってみましたが、いまいち うまくいきません。何かよい方法はないでしょうか?
#include <stdio.h> int main (void) { printf ("(′・ω・)<ショボーン\n"); return 0; } とやるとコマンドがナンタラカンタラといわれまつ(普通に表示はする) コンパイラはbcpadとか言う奴でつ
>64 申し訳ない。移動します。
linux 上で pthread を使ったプログラムをしてみたくて、
http://www-6.ibm.com/jp/developerworks/linux/001222/j_posix2-index.html を見ながら試してたんだけど、その中の thread3.c が思った動作をしてくれません。
o..o..o.o..o..o.o.o.o.o..o..o..o.ooooooo のような結果のはずが、
....................oooooooooooooooooooo になってしまいスレッドの意味がなく
なってしまいます。
thread_function()中の sleep(1); を pthread_mutex_unlock(&mymutex); の下に
持って来ると期待した結果になりますが、記事を読んだかぎりは、sleep の位置に関係
なく並行して動作しそうなんです。
main()の方のスレッドは、thread_function()中の unlock を待ってて、unlock され
たら main()のスレッドが動くと思ってたんですが、どうして下のような結果になって
しまうんでしょう?
引数に配列を使う場合とポインタを使う場合って何か違いはありますか? また、引数が構造体の場合と構造体のポインタの場合との違いはありますか?
70 :
デフォルトの名無しさん :04/02/21 00:00
linux g++ です。 % g++ -v gcc バージョン 3.3.3 20040214 (prerelease) (Debian) 以下のソースですが、 #include <vector> int main() { std::vector< int > tbl1( 10 ) ; return 0 ; } % g++ aa.cpp % LeakCheck ./a.out でコンパイルしてメモリリークチェック付きで実行すると、 # from new @ | size # Pointer Addr L 0x400a90db 1600 # 0x8049f78 # total allocation requests: 1 ; max. mem used 1 kBytes # leak 1600 Bytes :-( のようにメモリリークが見付かります。 tbl1( 10 ) の 10 を 1024 に変えると、メモリリークが出ません。 そういうものなんでしょうか??
(【初心者歓迎】C/C++室 Ver.4【環境依存OK】)を見てもらえばわかりますが・・・) その緑色の所に初期配置のコマを置いて、そのコマを緑色のマスにだけ1マスずつ 動かせるようにしたいのですが、どのようにしたらいいでしょうか。(チェッカー というゲーム)コマを動かせるようにするには、WM_PAINTの中に書いたらマズい ですか?コマの配置は次の通りです。 □●□●□●□● ●□●□●□●□ □●□●□●□● ■□■□■□■□ □■□■□■□■ ●□●□●□●□ □●□●□●□● ●□●□●□●□ それと、対コンピュータにするのはどういう方法がありますか?(これについては もう少しあとでもいいです。)
軽い処理ならコールバックに 書いてしまってもそれほど問題はないよ。 思考ルーチンはきちんと別のスレッドでやる。
>>71 人対人なら
1.WM_LBUTTONDOWN メッセージあたりを拾う
2.マウスの座標がプレイヤーのコマに含まれているか判定(移動元)
3.次のWM_LBUTTONDOWN メッセージを拾う
4.動かせる場所かどうか判定(移動先)
5.動かす(表示)
6.プレーヤーの交代
以下繰り返し
という感じか?
75 :
デフォルトの名無しさん :04/02/21 03:45
どなたか簡単な方法しってましたら教えて。 二本のラインの角度をー180〜180で表記したいのですが。。。 atan2(x,y)だと一本のラインですよね。 単純に引き算したら-180〜180になってくれないんですよね。
>>75 引いた後に -180〜180 に直せばいいじゃん。
struct a { int i[4]; short s; }; gccでこの構造体のサイズを18にする方法を教えて下さい。
#pragma pack(1) __attribute__ ((packed)) すぐ見つかりました。これでできるみたいでした。
ラジアンと角度という落とし穴もあるな
常識かもしれないが、C++のBoostって何?
>>81 ようするに色々便利なプログラムがごちゃまぜになったライブラリって事?
その中のどれかが便利だと感じたら導入するって事で良いのかな?
83 :
デフォルトの名無しさん :04/02/21 08:27
>>75 2本の直線の方向ベクトルをそれぞれ(x1, y1), (x2, y2)として
2本の直線のなす角度は
atan2(x1 * y2 - x2 * y1, x1 * x2 + y1 * y2);
けっ、マルチかよ。
(x1, y1, 0) × (x2, y2, 0) = (0, 0, x1 y2 - x2 y1) = (0, 0, 1) r1 r2 sin theta (x1, y1, 0) ・ (x2, y2, 0) = x1 x2 + y1 y2 = r1 r2 cos theta ∴ theta = Tan^-1 [(x1 y2 - x2 y1) / (x1 x2 + y1 y2)]
>>11 cds.lpData = (LPVOID)(ParamStr(1).c_str());
問題はParamStr関数が引数をワーク領域にコピーして
そのアドレスを返すようで、そのため壊れてしまうようです。
AnsiString as = ParamStr(1);
cds.lpData = (LPVOID)(as.c_str());
AnsiString FilePath = ExtractFilePath(Application->ExeName) + "Sample.ini";
TMemIniFile *Ini = new TMemIniFile( FilePath );
int i = Ini->ReadInteger( "SECTION1" , "WindHand", 0 );
delete Ini;
SendMessage((HWND)i,WM_COPYDATA,(WPARAM)Application->Handle,(LPARAM)&cds);
とすると問題ありません。
>>24 氏の言っている「c_str()はその場限りの寿命」というのは
c_str()の認識が間違っているようです。
------------以下 Borland Tipsサイトからのコピペ------------
c_str関数は、AnsiStringクラスの文字列領域へのポインタを返す関数です。
>>86 >c_str()の認識云々
アフォ顔洗って出直せ
AnsiStringクラスの文字列領域が常に不変だと思っているのか?
>>86 >問題はParamStr関数が引数をワーク領域にコピーして
>そのアドレスを返すようで、そのため壊れてしまうようです
意味不明なんだが?
入門書もう一辺読み直したほうがいいよ。
念のため言うておくとParamStrが返すのはAnsiString型のインスタンス
だからぁ しったかぶりしたがるバカ初心者は無視しろって。
「もしかして釣り?」と思ってしまった。 っつーか 確 実 に 釣 り だ ろ
91 :
デフォルトの名無しさん :04/02/21 09:53
ここにいるのは役に立たないクズばかりですね。 もういいです。
>>87 明示的にdeleteしなかれば、不変だろ
じゃなっから、何時変わるって言うんだ?
>>91 二度と来るなクソ
ParamStr が返すのが AnsiString なら ParamStr(1) の返すオブジェクトの寿命は それの含まれてる文の終わりまでだな。
>>88 訂正
問題はParamStr(1).c_str()が引数をワーク領域にコピーして
結局わけわかめ
>>92 2重に間違い
1:クラスインスタンスに対しdeleteは無用、つか、したらいかん。
2:C++の文字列クラスは領域を自分で再確保する可能性がある。
>>94 だから、引数って、意味しってる?
c_str()は引数取らないよ?
悪いことは言わんから冷静になりや。
んで、C++の入門書きっちり読み。
やっちゃいけないプログラムの例。 #include <iostream> #include <string> int main() { const char* p = std::string("aaa").c_str(); const char* q = std::string("bbb").c_str(); std::cout << p << std::endl; std::cout << q << std::endl; }
>>96 コマンドライン引数な
たしかに冷静になる必要がある
あーむかつく
俺は無視かよ。
お前らいい加減にシル! こっちは、紅茶吹いて、キーボード1枚の損害なんだぞ!
>>98 うーん、"引数"を"コマンドライン引数"に置換してもやっぱり変だぞ。>86
このスレの住民は口は悪いが、おかしなところを「おかしい」と指摘してくれているんで
それはすなおに聞く耳もたな。
「C++の基礎をきちんと勉強したほうがいい」というアドバイスに対してもね。
>>100 そんなに紅茶が気に入らなかったんなら
次は十六茶を吹け。
まぁ、「冷静になる必要がある」なんて書きながら 「あーむかつく」なんて書いているようじゃ聞く耳なんて持ってないだろ。
>>102 いや寧ろ、問題は>100の使っているキーボードが紅茶に弱いってことだろ。
と言うわけで、>100は紅茶耐性の高いキーボードを使うようにシル。
>>101 もしかして、テンポラリオブジェクトを作るから
壊れるという主張なのかな。
それなら正しいことを言ってるな。
ワーク領域って言葉は普通こういう風には使わないと思うけど。
>>105 それは
>>11 に対して散々指摘されていたことなんだが・・・
どうも ParamStr(1).c_str() が、AnsiString型テンポラリオブジェクトのメンバ関数を
呼び出しているという点が飲み込めてないように見えるのだが? はて?
>>67 スケジューラが・・、ってことで linux のカーネルを 2.6 から 2.4 にしてみたら
期待どおりの動きになった・・。
違和感が残るので誘導先に行ってみます。
質問です メモリの動的確保、newを多用するのはよくないんですか? 教えてください
よくないって、どういう意味で?
>>108 だめも何も、使わなきゃいけないときは使わないといけない。
それとな、初心者スレだからこんなコトいうのもなんだけど、
「多用しすぎる」ってなにさ?
プログラムって日本語とかの自然言語と違って、
ちゃんとしたルールの下に構築されてるんだから、
「最大xxまで」「最低xxは許される」というのが決められている。
まずそういうあやふやなことに惑わされる姿勢を何とかした方がいいよ。
.net C++で簡単にマネージ型からアンマネージ型 マネージ型からアンマネージ型の変換を楽にする方法を教えてください BYTE[]からbyte[]へのコピーとか
C言語の超基礎を終了します(本で言えば入門編)。 次にどこに向かえばよいでしょうか。 最終的には簡単なフリーソフト(windows)を動かしたいです。
簡単なの作ってみると、どこに向かえばいいかもわかる。
>>82 遅レスだが
boostは、標準から漏れた内容を次期標準とすることを
目標としたものだったと思う。
Cで入力を促すメッセイジを表示させたあとにscanfを使用しているのですが、 キーボードで入力する前に値が入力された扱いになってしまうのですが どうしてなのでしょうか。
へるぷ…
ノ~~~ヽ ( ´ {}`)のいぽー l|l|l|l|l|l| ( ) ||| (__)_)
>>118 vector<int> v;
v.reserve(10);
でもだめ?
>>116 直前に入力された文字列をscanfが読み残しているから。
fgetsを使って1行づつ読んで、数値への変換はsscanfを使えばいい。
>>103 むかついているから冷静になる必要があるんだよ
わかんねーのかよバ〜カ
で、全然(冷静になることに)成功してないと。
んな事に神経使うより勉強しろ。 最低限の基礎さえ身につけた上で書き込んでいれば ああまで煽られたりはしない。
ま、こいつには無理だろう。 知能も精神も小学生レベルだからな、どう見ても。
だからぁ、こんなところでむかつくのを表明して悦に入っている辺りが餓鬼だっての。 そもそもこの程度でむかつくくらいなら2chなんかに来なきゃいいだろ。 で、ちっとはAnsiStringについて理解できたのかね。 まぁ、むかつく暇はあってもまともに理解しようと勤める暇はないんだろうがな。 なーに、態度さえ変えればここの連中はちゃんと教えてくれるよ。
Cマガジンありますよね。 あの雑誌はどのくらいのスキルがつけば読み始めたらいいのでしょうか。
>>128 あれってJavaの本じゃなかったっけ?
CもJAVAも載っていますね。読んでも良くわからないです。 Cがメインみたいですけど。
>>128 別にどんなスキルでも。
読んでみて読む価値があると思ったら読めばいい。
全ての記事を読む必要もないし、全ての記事を理解する必要もない。
入門系連載記事に価値を求めるやつもいるかもしれないし、特集記事で
色々なトピックを知りたいだけのやつもいるかもしれない。
後は、それが価格に見合うかどうかだけじゃないかと。
特集記事については今は興味なかったり分からなかったりしても後から
役に立つことはあるかもしれない。
つまり俺が言いたいのは、そんなこと人に聞いてどうするつもりだ?ってこった。
>>129 今は C マガの C は Computer の C らしい。
ヘェ〜
134 :
デフォルトの名無しさん :04/02/22 12:10
class CParent { public: virtual void vTextOut() { cout << "CParent vTextOut()" << endl; } }; class CExtend : public CParent { public: virtual void vTextOut() { cout << "CExtend vTextOut()" << endl; } }; void main() { CExtend Obj; CParent *pObj = &Obj; } こういうソースがあったときに、pObjを使って、 CParent::vTextOut() をコールすることはできますか?
>>134 pObj->CParent::vTextOut();
136 :
デフォルトの名無しさん :04/02/22 12:29
Windowsの業務アプリをMS, Borland, Metrowerks以外の コンパイラで開発する事ってありますか?
137 :
デフォルトの名無しさん :04/02/22 12:35
黒色の所に初期配置のコマを置いて、そのコマを黒色のマスにだけ1マスずつ
動かせるようにしたいのですが、どのようにしたらいいでしょうか。(チェッカー
というゲーム)動かせるコマを初期のコマに設定ようにするには、WM_PAINTの中に
描いたらいいですか?コマの配置は次の通りです。(●の所も盤の色は■です)
□●□●□●□●
●□●□●□●□
□●□●□●□●
■□■□■□■□
□■□■□■□■
●□●□●□●□
□●□●□●□●
●□●□●□●□
>>73 WM_LBUTTONDOWN の中に初期のコマを描くように設定するのですか?
だとするとどんな風に書くのですか?
とりあえず、実行した時に初期のコマを設定する(オセロだったら真ん中に4つ
のコマを描く)にはどうしたらいいか、お分かりになる方はよろしかったら教え
ていただきたいのですが。
>>138 2次元の配列を2つか、3次元の配列を使う。
盤の配置パターンと駒の現在位置
>>138 まず、2次元の配列、 a[8][8] を用意して
その内容が0ならマスだけ、1なら白い駒を2なら黒い駒を
_PAINTのハンドラ内で描く、というのをとりあえずやってみな
あら、Enterで書き込みチェックがいつの間にか入ってた、スマソ
>>141 それだと盤の配色が無い。
0x100 だと黒いマスに駒なし。
0x101 だと黒いマスに白い駒。
0x110 だと黒いマスに黒い駒。
0x000 だと白いマスに駒なし。
0x001 だと白いマスに白い駒。
0x010 だと白いマスに黒い駒。
>>144 いやあまり複雑にするとついてこれないかと思ってさ
>>145 いやあbitで処理しようとしてる時点でネタなんだけどね。
質問者に理解できないネタは空振りになると思うが。
それを言うと配列を理解できてるかどうかも怪しい。 ビットマップの座標範囲と条件文だけで実装したら ある意味凄いかも?
なんか難しそうですね。
盤のソースは前のスレで教えてもらいましたが、それに上記のようにコマ(動か せるコマ)を設定したいのです。どんなソースを加えればいいでしょうか。 まだ大漁ではありません。
>>151 オレに20万円で発注しないか? 格安だぞ。
金の話は一切しておりません。
>>151 じゃ、漏れ様が10万円で個人教師をしてやろうじゃないか。
何がわからないんだかわからん Cやアルゴリズムの本で勉強くらいはしてるのか?
宿題スレ20に書き込んでる。 っていうか、そのうち「デバイスコンテキストって何ですか」とでも 聞きそうな感じだな。
キングにするには? とか、 連続飛びをするには? という質問も来そう さっきチェッカーのルールをぐぐったw
チェッカーのソースなんてその辺に落ちてるだろ。
>>156 【初心者歓迎】C/C++室 Ver.4【環境依存OK】のかなり下の方にある。
>>160 これ以外に、Win32APIのソースがおちている所は無い?
>>164 日本語のサイトはあまりいいのは無いけど、英語は英語で難しい。
しかも、VC++じゃなかったり。MFCだったり。
すいません。c++のfopenでファイルを追加上書きするのに、 ファイルの末尾に行を足すモードはありますが、 ファイルの先頭に行を足すにはどうしたらいいんでしょうか? よろしくお願いします。
ファイルシステムの実装上、無理です
>>167 ファイルAの先頭に行を足したい場合
ファイルBをwrite openしてAの先頭に入れたかった内容を書く
Aをread openしてファイルBの末尾に(Aの)内容を追加する
(closeなどの後始末して)最後にファイル名を交換する
>>169 ありがとうございます。
それでいけそうです。
基本的なことかもしれないのですが、 typedefの有効範囲ってどこになるのでしょうか? グローバル?モジュール内(ファイル内)? 各場所によってはclassのアクセス範囲(privateやpublic)にも 影響を受ける??
別に変数と変わらんが。
>>171 関数や変数の宣言と同様。
当然、「書く場所によってはclassのアクセス範囲(privateやpublic)にも影響を受ける」。
↑かぶりやした
Aというクラスの中でAというクラスを宣言して使うことはできますか? クラスないで自クラスを使いたいのですが… こんな設計は無茶ですか?
>>176 メンバ変数として使いたいなら、ポインタにして実行時に動的に確保するようにすればいいんでない?
>>177 コンストラクタでnew A;して、newされたインスタンスが
コンストラクタでnew A;して、またnewされたインスタンスが
コンストラクタでnew A;して、そのnewされたインスタンスが
コンストラクタでnew A;して…
vc++6.0でダイアログのコンストラクタに引数をつけたい時 CDialogXXX::CDialogXXX(int lintUser, CWnd* pParent /*=NULL*/) : CDialog(CDialogXXX::IDD, pParent) と最後に「 : CDialog(CDialogXXX::IDD, pParent)」を書かなければ上手くいかなかったんですけど 「 : CDialog(CDialogXXX::IDD, pParent)」の部分は具体的に何をしてるんでしょう? リソースIDと親ウィンドウのハンドルをどこかに渡してるのだろうと想像してるのですが コンストラクタの中に「CDialog::CDialog(CDialogAll::IDD, pParent);」と書くのとはまた違うみたいですし・・・ よろしくお願いします
3桁の引数を 3つ値にわけて戻すにはどうしたらよいでしょうか。 例えば 123なら → 1,2,3 ただし、引数は1桁のときもあってそのときは、残りの2つは0とします。 例えば 1なら → 1,0,0 よろしくお願いします。
>>181 こんなのでいいなら
int src = 123;
int x1,x2,x3;
x3 = src / 100;
src %= 100;
x2 = src / 10;
x1 = src % 10;
printf("%d %d %d ",x3, x2, x1);
>>180 基本クラス(この場合CDialog)のコンストラクタを呼び出してる
>>181 >例えば 1なら → 1,0,0
100 → 1, 0, 0
とどう区別するの?
>>182 ,184
即レスありがとうございます。
大変申し訳ありませんが、いくつか複雑な条件が判明しました。
引数をNo,分解した3つの数値をFirst、Second、Third とします。
※ 引数は 1 〜 1110まで。
※ First、Second、Thirdは、0〜10の値。
※ 2桁以上では,First、Second は 0になってはいけない。
※ 2桁以下の数値では、 No = Third*100 + Second*10 + First
※ 3桁の数値のときは、 No = First*100 + Second*10 + Third
例)
00 , 0, 0
1〜101 ,0,0 〜 10,0,0
111 , 1, 0
201 ,10, 0
1231 , 2, 3
2001 , 9,10
3012 ,10, 1
111010,10,10
ちなみに、C++初心者本を2冊読見終えたところです。。。
これがわからないのはやはりまずいでしょうか。
耳から煙りが出そうです。
たびたび失礼します。 条件の追加と例の補正。 ※ Secondが0でないときはFirstは0になってはいけない。 ※ Thirdが0でないときはFirst、Secondは0になってはいけない。 0 →0 , 0, 0 1〜10→1 ,0,0 〜 10,0,0 11 →1 , 1, 0 20 →1 ,10, 0 123 →1 , 2, 3 200 →1 , 9,10 301 →2 ,10, 1 1110 →10,10,10
>>185 おそらく、この条件は間違っている
正しい条件をきちんと整理して書かないとどうにもならない
そもそも「桁」ってなにを指すの?
かぶったか。
>>186 を追加してもおかしいようだ。全部整理しなおして改めて書き込むべし
なお、
「C++初心者本を2冊読見終えた」
入門書は載ってるサンプルコードを全て打ち込みで走らせてみな。
そんぐらいやらないと意味がない。
20 → 10, 1, 0 じゃないの?
わけわからんw
>>183 やっぱコンストラクタを呼び出してるのですか。
コンストラクタの中で呼び出さないのは、生成のタイミングとかなんですかね。
どうもありがとうございました
↑ごめんなさい、誤爆です
>>187-190 。。
。 。 + ヽヽ
゜ 。・ 。 +゜ 。・゚ (;゚`Дフ。< また来ます、うわぁぁぁん
ノ( /
/ >
>>191 おい、ちょっとまて。
>コンストラクタの中で呼び出さないのは、生成のタイミングとかなんですかね。
派生クラスのコンストラクタは基底クラスのコンストラクタをコンストラクタ初期化子
で呼び出すって、基本の基本だじょ。きちっと勉強せい。
>>181 bool cond(int n,int f,int s,int t){
if(n/10 && (!f || !s)) return false;
if(!(n/100) && n!=t*100+s*10+f) return false;
if(n/100 && n!=f*100+s*10+t) return false;
if(s && !f) return false;
if(t && (!f || !s)) return false;
return true;
}
void sep(int n){
int f,s,t;
for(f=0;f<=10;f++)for(s=0;s<=10;s++)for(t=0;t<=10;t++)
if(cond(n,f,s,t))
std::cout<<n<<":"<<f<<","<<s<<","<<t<<std::endl;
return;
}
力技やね
>191 呼び出さないんじゃなくて、その書き方でしか呼び出せないの。
>>195 >>198 レスどうもです。あれからちょっと調べてみて何となくわかりました
ありがとうございます
なんとなくかよ!!!!!!
class Base { private: void privateFunc() {} protected: void protectedFunc() {} public: static void foo() { Base().privateFunc(); //この行でコンパイルエラーにならず } }; class Ext : public Base { public: static void var() { Base().protectedFunc(); // この行でコンパイルエラーになっちゃう。 } }; のはなんで?
すでにnewで確保されているものをさらにnewすることは 駄目なのですか?
fgetsで標準入力を得ようと思うのですが二回fgetsを使用すると一つめのfgets のあまりが勝手に二つ目に入力されてしまうのはどうすれば良いのでしょうか?
>>202 意味わかんない。
普通複数回newされればそれは別物だが・・・
A* a = new A();
new(a) A();
こういうことか?
>>203 fflush( stdin );
をfgets()の直前に。
>>203 >fgetsで標準入力を得ようと思うのですが
fgets() では標準入力そのものは得られない訳だが
>>201 ×Base().protectedFunc();
○Ext().protectedFunc();
protectedのメンバにアクセスできるのは自分自身と同じ型のオブジェクトを参照しているときのみ。
>>204 char *test = new char[14];
クラスのコンストラクタ等でこうなっている部分ですが
char[14]をchar[20]にしなければならなくなった場合は
いったん
delete[] test;
としてから
char *test = new char[20]
としなければならないのですか?
それとも
Delete[] testは抜きで、いきなりchar *test = new char[20]をやっても
問題ないのですか?
>>209 newは新しい領域を作ってそのアドレスを返すから、古い領域が大きくなるわけじゃない。
というわけで一度deleteしないとリークする。
そのうち、いちいちdeleteするのが面倒になってスマートポインタやSTLコンテナを 覚えて堕落するわけだが。
>>205 未定義。鼻から悪魔が出てきても知らないぞ。
で、
>>203 はどういう結果が得られれば嬉しいの?
こんなのでどう? /* nを超えた分は読み捨てるfgets char *fgets_skip(char *dest, int n, FILE *stream) { int c; while(--n) { c = getc(stream); if(c == EOF) return NULL; if(c == '\n') break; *dest++ = c; } *dest = '\0'; for(; c != '\n'; c = getc(stream)) if(c == EOF) return NULL; return dest; }
>>216 文明の進歩とは即ち堕落が目的だ。楽をするために努力してるんだから。
219 :
デフォルトの名無しさん :04/02/26 23:03
>>218 > for(;friendCount<FRIEND_PARTY&&enemyCount<ENEMY_PARTY;)
whileを使え
220 :
デフォルトの名無しさん :04/02/26 23:10
>>218 HandleChangeParty関数に関して、friendCountとenemyCountは本当にポインタで受ける必要があるのか?
ありがとうございます。
>>219 あっそうですね。癖で使っていました。
単純に永久ループさせたいときはそちらの方がよいですね。
>>220 必要ないです。
たしか前はそこで++を行っていてそれが残っていたようです。
今はHandleZenmetu関数で行っていますので。
>>218 突っ込みどころ満載だが面倒なので省略。
強いてあげれば、indentかcbなどのツールを一度使ってみるといい。
あー、ついでに言えば、英語の勉強もかな。
↑このまったく役に立たない文章はやっぱオナニー目的で書かれたのだろうか? :)
>>217 STLは表面を触って遊んでいるうちなら楽をしていると言えるんだがなぁ・・・
スマートポインタも内部の実装詳細をある程度把握してないとたまにひどい事に・・・
環境依存とは何のことですか?OSのことですか?
全部
>>223 あんたみたいな読解力のない香具師を釣るためだろ。
>>227 なるほど、やはり無内容なオナニーでしたか :)
>>222 ありがとうございます。
インデントと英語(関数名のつけ方など)ですね。
今回は意識しませんでしたが、勉強せねばとずっと思っていました。
後できれば、面倒だった部分もお願いします。
>>214 二回目の変数に勝手に代入されなきゃ嬉しいの。
しょうがないから他の方法で済ませました。
233 :
デフォルトの名無しさん :04/02/27 21:59
おぃ、うみがめ! 釣りの餌としか思えないようなコーディングだぞ。 ネタなのか?
>>232 void InitChara(Chara*chara)
{
int i;
chara->enum_=0;
strcpy(chara->name,"");
chara->mhp=0;
chara->mmp=0;
chara->pow=0;
chara->def=0;
chara->smt=0;
chara->spd=0;
chara->luc=0;
for(i=0;i<CHARA_ITEM;i++)chara->itemEnum[i]=0;
}
↓
void InitChara(Chara *chara)
{
ZeroMemory(chara, sizeof(chara));
}
ありがとうございます。
>>232 参考にさせていただきます。
>>233 そんなにダメですか?自分では精一杯なのですが。
>>234 わざわざ1個1個入れなくても構造体も一括でできたんですね。
配列とかでは確かmemsetとか使った事があったのですが。
絵が動くようにしてくれ
>>237 私に対してですよね?
できるだけ簡単に作るという方向で作ったので、その機能は無いです。
今作っているのができたら作りましょうか?
でも相変わらず醜いコードになると思いますが。
>>236 >そんなにダメですか?自分では精一杯なのですが。
そ、そうなのか・・・
漏れの会社の新人プログラマーとしてどうか入社しませんように。ナムナム (AA略
>>238 >でも相変わらず醜いコードになると思いますが。
なんだ、自覚症状があるのか?
やっぱ釣りだなー。
>>239 ひそかにまだプログラマーになりたいと思っていましたがダメですか。
なれなくても将棋ソフトで大会に出るという夢もあるのですが。
>>240 いいえ、皆さんがそう仰っていたからです。
もし作るなら完成までに少しでもLVUPしようと思いますが。
>>230 スタイルはまぁいいとして、気になるのは複文({})の使い方。
関数の名前の付け方もまぁいいとして、スペリングミスはいただけない。
で、個別の指摘は(相変わらず)面倒だから省略するが、
breakに頼りすぎているような気がする。
それと、関数の切り分けの仕方辺りかな。
>うみがめ氏 まず数をこなしなさい。ゲームならゲームできちんと動作するものを沢山作りなさい。 それから洗練されたコードを沢山読みなさい。 定評のある書籍に載ったサンプルとかライブラリのソースとか参考になるものはいくらでもある。 それらを十分にこなしてから他人に自分のソースの評価を求めなさい。 今の段階じゃ「経験不足」という答え以外ない。
>>243 >それから洗練されたコードを沢山読みなさい。
そう言えば、バレンタインの頃に洗練されたコードが
大量に流出したよなぁ。。。
とりあえずスペルミスを直して、変な日本語の変数名を英語に直すだけでだいぶ見栄えは良くなる。
>>242 ありがとうございます。
>複合括弧
if()
{oo;oo;}
とか
if() {oo;oo;}
とかですかね。気をつけます。
>スペルミス
和英辞典で調べながらやっているんですがね。気をつけます。
>breakに頼りすぎ 関数の切り分けの仕方
どこら辺か分からないのでもう一度見てみます。
>>スペルミス >和英辞典で調べながらやっているんですがね。気をつけます。 リア厨?
ありがとうございます。
>>243 暦は5年以上になるんですがね(^^;)。精進します。
>>245 分かりました。
int StrWoComnd(int*item,int*spot) こういうポインタ引数の定義のスタイルは何処にのってた? こうだろ? int StrWoComnd(int *item, int *spot) { *item = hoge; C++ なら参照渡しで int StrWoComnd(int &item, int &spot) { item = hoge;
>>244 一瞬何のことかと思ったけどw
メモ帳如きでかなり複雑なコードだったらしいがどんなんなのか
気になるな
>>246 242では無いが。
for でループさせてるのに break で抜けている。
つまりループの出口が2つある。
>>249 本によっては
int* item、int *itemの2通りがある。
俺は後者だけど。
おそらくSPがはっきりしてなかったんじゃないか?
そういうのもあるし
>>250 メモ帳如きはうみがめレベルの雑魚が作っているから仕方が無い。
カーネルに近づくほど洗練されたコードになる。
デ○ク軍団のはカナーリ洗練されたコードだと思う。
>>252 int* item, item2; とした場合、
int* item;
int* item2;
と見まちがえる恐れがあるので
int *item, item2; とする方が良いらしい。
>>249 スペースのことですよね?スペースを空けないスタイルにしてから、
そこもコンパイルで通るからとスペースを空けなくなりました。
>>255 それを見づらいと思わない感性がダメダメ。
それから、2項演算子の前後、"," の後はスペースくらい空けないと。
for の初期化部分に沢山文を詰め込まないこと。
>>247 20代前半です(^^;。英語(国語)はまったくダメだったんで。
>>251 結構ありますね。それは例えば10ある要素からひとつでも○○であるか
調べるとき、ひとつあった地点でbreakで抜けています。
この場合はどうすればよいでしょうか。
>>257 スペースを空けないのは、VCで色が付く機能で見やすくなるからかもしれません。
メモ帳で見たときかなり見難いですが。
forで初期値を与えるのは、forで使うんだよという意味で詰め込みました。
"Oll" って "All" の事なのか?
悪いことは言わないから、プログラミングなんて無駄なことはやめて 国語の勉強と英語の勉強をしなさい。 きっと役に立つから。
>>260 そうです・・。今までずっと気づきませんでした。
ここ数年ずっとOllでやっていそう。はずかしすぎ・・。
これではネタと思われてもしょうがないです。
つづりの分からない英語をめんどくさがって調べないでローマ字で書いていたので、
混じることによっていつのまにか間違った使い方をしていたようです。
「はずかしい」というレベルじゃないような
リア厨ならともかく二十歳過ぎの大人がこれじゃ
>>261 だな
\ ∩─ー、 ==== \/ ● 、_ `ヽ ====== / \( ● ● |つ | X_入__ノ ミ そんな餌で俺様がクマ――! 、 (_/ ノ /⌒l /\___ノ゙_/ / ===== 〈 __ノ ==== \ \_ \ \___) \ ====== (´⌒ \ ___ \__ (´⌒;;(´⌒;; \___)___)(´;;⌒ (´⌒;; ズザザザ (´⌒; (´⌒;;
>>264 シェークスピアはOllって書いてたの?
>>263 基本的に体育会系なんでと言い訳してみる・・。
バイトも肉体労働系だから、苦労することは無かったのですが。
プログラマーとなるとコーディングはもちろん、
企画とかもありますし、あきらめた方がいいのかな。
電子メール ⇒ E-meile インターネット ⇒ Intanet ホームページ ⇒ Homu Pege 2ch ⇒ 2 chunnele
プログラマーに企画なんてねーよ。
>>267 >企画とかもありますし、あきらめた方がいいのかな。
Yes, I don't.
>>208 >protectedのメンバにアクセスできるのは自分自身と同じ型のオブジェクトを参照しているときのみ。
ってのが、具体的にどういう事なんだかよくわからんが、
とにかくありがとう。
>>268 英語以外のヨーロッパ語で、そんな感じで綴る言語がありそう
>>271 継承するってことは、全ての基底クラスのメンバは派生クラスに入るだろ。
継承した時点でそれはもう派生クラスのメンバであって、基底クラスとは別物だ、ということかと。
>>272 上の2つは本当にこう書いたヤシが居る。w
>>270 これは中2ででてきましたっけ。確か否定文の疑問文のときの答え方。
>>272 ぐぐって見た。あるもんだな。
E-meile 534件
Intanet 3590件
Homu Pege 103件
2 chunnele 2件
>>277 > 2 chunnele 2件
ほんと?
アンテンドゥー
インストロール
>>278 ほんっとうにわかんないです。
> protectedのメンバにアクセスできるのは自分自身と同じ型のオブジェクトを参照しているときのみ。
「自分自身」って言うのが何かわからない
「自分自身と同じ型のオブジェクトを参照している時」
って言うのが、どういうときなのかわからない。
>>201 の例だと、
Base().protectedFunc()と書いたとき
--- 自分自身と同じ型のオブジェクトを参照していない
Ext().protectedFunc()と書いたとき
--- 自分自身と同じ型のオブジェクトを参照している
ってことなんだろうけど....全く飲み込めないです。
>>273 protectedメンバってのは、「それが宣言されたクラスと、その派生クラス」
からアクセスできるってのが特徴でしょ。
>>282 Ext::var()において、
>Base().protectedFunc()と書いたとき
>--- 自分自身と同じ型のオブジェクトを参照していない
>Ext().protectedFunc()と書いたとき
>--- 自分自身と同じ型のオブジェクトを参照している
以上はまったく明らかなことと思っていたのだが、分からないといわれて正直呆然(w
>protectedメンバってのは、「それが宣言されたクラスと、その派生クラス」
>からアクセスできるってのが特徴でしょ
ちゃんとアクセスしてるじゃん(w
ちなみに、
class Ext : public Base {
public:
void no_static_var() {
protectedFunc();
}
};
これは、this->protectedFunc()を呼び出しているのと同じなので、
結局「自分自身と同じ型のオブジェクトを参照している」ことになる。
↑アップした後で思いついたんだが、ひょっとして Ext().protectedFunc() これがExt型のテンポラリオブジェクトのメンバ関数を呼び出しているということが 分かってないのだろうか? これが分からなくて散々暴れたやつがいたな(w
>>285 Ext().protectedFunc()が、Ext()の一時オブジェクトのメンバ呼び出しだってのは、わかる。
えっと、わかんないのは
「Base().protectedFunc()が、Baseのサブクラスからなぜ呼び出せないのか」
ってことです。
>>284 で
> >protectedメンバってのは、「それが宣言されたクラスと、その派生クラス」
> >からアクセスできるってのが特徴でしょ
> ちゃんとアクセスしてるじゃん(w
とかゆってるから、
protectedメンバを、そのメンバを宣言したクラスの派生クラスから
呼び出せる、って事は間違ってないと思うんだけど。
>>286 「Base().protectedFunc()が、Baseのサブクラスからなぜ呼び出せないのか」
仕様です。
はじめに書いたように
「protectedメンバは自分自身と同じ型のオブジェクトを参照しているときしかアクセスできない」
つまりprivateと同じだ。
>r 解決したみたいだけど、 static_cast<Ext &>(Base()).protectedFunc(); これなら通せる。(よい子は真似しちゃいけません) ようするに「Extの一部としてのBase」としてのみアクセスできる。ってとこか。
>>290 すでに余談だけど(w
禿本によると、
>>287 は、同じ基底クラスから派生した複数のクラス間で、
相手のprotectedメンバへのアクセスを認めないというのが趣旨らしい。
基底クラスと1つの派生クラスだけで見ていると
「派生クラスから基底クラスならアクセスできてもかまわないじゃん?」
と思いがちだが、別の派生クラスの存在を念頭に置くと、やはりそれも不味かろう。
>>276 余談だが
Yesには必ず肯定文が、Noには必ず否定文が続く。
よって
>>270 の文は文法的に破綻している。やっぱり
英語の勉強すれ。
余談の多いインターネットはここですか?
そういや I have no money. を「私はハブ(?)の物真似がうまい」とかいった香具師がいたな。 今思えば釣りなのか、真性なのか確認しようにももうあの香具師は・・
To be to be ten made to be. 訳「飛べ飛べ天まで飛べ」
>>296 I have no money.
⇒ 私はお金で無い物を持っている。
俺、ハブ飲まねえ。
Nobody is here. ノーバディさんはここです。
ノバの人は腹が減っている
I/Oストリームで、stdioのsprintfのようなことをさせるには どの関数を使えばいいのでしょう?
>>303 #include <sstream>
ostringstream tstr;
tstr << "ABC";
cout << tstr.str() << endl;
fopenでテキスト形式のファイルをmainの引数として開いて書き込むつもりですが、 bmpファイルが引数でもエラーが出ずに通ってしまいました。 テキスト以外のファイルをエラーとする方法はありますか?
>>306 ファイル名の最後の4文字が".txt"かどうかを調べる
>>307 ありがとうございます
では、ファイル名の比較はどのようにすればできるでしょうか?
strcmp
「テキスト形式」なんて人間が勝手にそう決めてるだけで、 コンピュータにとってはどんなファイルもさしたる違いはない。
int型を文字列に変換したいのですが どんな関数使えば良いのでしょうか? かなりがんばって検索したつもりなのですがわかりませんでした
俺俺に聞け→勉強するぞ から誘導されてきました。ちょいと教えとくれ。 #include <stdio.h> /* #define GLOBAL */ #ifdef GLOBAL const int DragonKiller=15000,AngelRobe=3000,DragonShield=3500; struct _item{ char *name; int price; }ItemList[]={ {"ドラゴンキラー", DragonKiller}, {"天使のローブ", AngelRobe}, {"ドラゴンシールド",DragonShield}, }; #endif int main(void) { #ifndef GLOBAL const int DragonKiller=15000,AngelRobe=3000,DragonShield=3500; struct _item{ char *name; int price; }ItemList[]={ {"ドラゴンキラー", DragonKiller}, {"天使のローブ", AngelRobe}, {"ドラゴンシールド",DragonShield}, }; #endif return 0; } GCC 3.3.1 で、GLOBAL無効だとOKなんだけど、 GLOBAL有効だとコンパイルエラーになるんだ。なんで?
sprintfでも使っとけ
>>312 #include <sstream>
#include <string>
using namespace std;
int x;
ostringstream oss;
oss << x;
string temp = oss.str();
これでtempに得られる。もしくはboost::lexical_cast<>を使うとすっきりしていい。
GLOBAL無効(エラー無し) T:\>gcc g.c GLOBAL有効 T:\>gcc g.c g.c:7: error: initializer element is not constant g.c:7: error: (near initialization for `ItemList[0].price') g.c:7: error: initializer element is not constant g.c:7: error: (near initialization for `ItemList[0]') g.c:8: error: initializer element is not constant g.c:8: error: (near initialization for `ItemList[1].price') g.c:8: error: initializer element is not constant g.c:8: error: (near initialization for `ItemList[1]') g.c:9: error: initializer element is not constant g.c:9: error: (near initialization for `ItemList[2].price') g.c:9: error: initializer element is not constant g.c:9: error: (near initialization for `ItemList[2]')
>>313 Cでコンパイルしてるからだな。
Cではconst intは「定数式」に使えない。
C++なら使える。
グローバルでのそれとローカルで違うのはどうしてでつか?
本人は他人の10倍の能力があると言ってますが、本当の実力はどれほどの ものでしょうか? 私はプログラムが書けないのでよくわかりませんです。 117 : ◆Rb.XJ8VXow :04/02/15 23:34 ID:L0+olNsX ちなみに下記は三菱製作所へ納品したソースの一部だ。 このソース1300ステップで250万円の値が付いた優れものである。 もちろん、コボラー様でも読めるように配慮している。 void MAIN_SUB() { char sStr[256]; int i,iSw,iCnt; CreWorkA_SUB(); /* 展開WorkA作成 */ CreWorkB_SUB(); /* 展開WorkB作成 */ CreStrf0_SUB(); /* 出力 合作振向F作成 */ strcpy(P_Strf0,getenv("WORKDIR")); strcat( P_Strf0, "/STRF.txt" ); F_Strf0 = fopen( P_Strf0, "r" ); if( F_Strf0 == NULL ){ fprintf(stdout,PROG); fprintf(stdout,": (MAIN_SUB)STRF.txt open Error!\n"); exit(-1); }
322 :
321のつづき :04/03/02 17:33
/*----------------------*/ /* 自動/手動 分割処理 */ /*----------------------*/ iSw=0;iCnt=0; for(J_Strf0.cnt = 0; J_Strf0.cnt < J_Strf0.max; J_Strf0.cnt++){ fseek(F_Strf0, J_Strf0.cnt * J_Strf0.size, SEEK_SET); if( fread(&R_Strf0,J_Strf0.size,1,F_Strf0) != 1 ) AccessErr("001"); if( strncmp(R_Strf0.ORDER_ARANGE_NO,"#" ,1) == 0 ) { /* fseek( F_Strf1, J_Strf1.cnt * J_Strf1.size, SEEK_SET ); /* */ fwrite( &R_Strf0, J_Strf1.size, 1,F_Strf1 ); J_Strf1.cnt++; } else { /* fseek( F_Strf2, J_Strf2.cnt * J_Strf2.size, SEEK_SET ); /* */ fwrite( &R_Strf0, J_Strf2.size, 1,F_Strf2 ); J_Strf2.cnt++; } } J_Strf1.max=J_Strf1.cnt; /* 最大件数記憶 */ J_Strf2.max=J_Strf2.cnt; /* 最大件数記憶 */ fclose(F_Strf0); }
∧ ヨミニク マンドクセ ヤッテランネ ∠'A`> |∧|
C ++で、次のような犬と猫のクラスを作りました。 これをNo.1,2の入力によって、1のときは犬に名前をつけてなかせ、2のときは猫を泣かせたいです。 これをテンプレートを使って行うにはどうしたらよいでしょうか。。 class dog{ string name; public: void setname(string n){name = n;} void naku(){cout <<"U・(エ)・U{"<< name <<"だワン!)"<<endl;} }; class cat{ string name; public: void setname(string n){name = n;} void naku(){cout <<"(=^エ^=){"<< name <<"だニャ〜)"<<endl;} };
>>324 テンプレートはそういう実行時の多態性の表現に向いていない。
>>324 テンプレートよりも抽象基底クラス使った方が
すっきりさっぱりする気がするのだが。
>>325 ,326
ありがとうごさいます。
抽象基底クラスというのが何を指すのかよくわからないのですが、仮想関数でポインタを使う方法などは試してうまくいきました。
実は、テンプレートの使い方がよくわからなかったので、簡単な例題を知りたいと思った次第です。
1、2という振り分けでなくてもかまいわないのですが・・・。
すっきりするというか,これに抽象基底クラスを使わないほうが不思議だがw class animal{ string name; public: void setname(string n){name = n;} virtual void naku() = 0; }; >324 このクラスをdogとcatの基底クラスにしてdogとcatのnameとsetnameを削除する.
>>327 なんかテンプレートというものを誤解しているような
ヽ(`Д´)ノ ウワァァン!! >327 抽象基底クラスというのは仮想関数を持っているクラスのことだYO!
>>330 普通は純粋仮想関数を持っているクラスのことじゃね?
>>327 テンプレートっていうのは基本的にはコードを書くときに楽するためのものだと思えば良い.
int max(int a, int b){
return a > b ? a : b;
}
double max(double a, double b){
return a > b ? a : b;
}
・・・
こういうのをいちいち全部書くより
template<typename T>
T max(T a, T b){
return a > b ? a : b;
}
って書けばこれだけで済むでしょ?って話.
(inlineにしろとか参照で渡せとか突っ込むのはなしでw)
>331
その定義の方が一般的なんですかね?俺勘違いしてたかな?
抽象というからにはインスタンス化できたらまずいから、 少なくとも1つは純粋仮想関数を持たねばならないのでは? 仮想関数 virtual void func() { } 純粋仮想関数 virtual void func = 0; だよね。仮想関数はインスタンス化できちまう。
>>333 純粋仮想関数 virtual void func() = 0;
ですた。俺は使ったこと無いけど。
>>328-331 失礼しました。
今確認したら、「純粋仮想関数を持つクラスを抽象クラスといいます」とありました。
>>332 すみません return a > b ? a : b; のような記述は初めてみたので咀嚼するのに時間をください。
ただ使い方を勘違いしていたことはわかりました。ありがとうございました。
(条件式) ? a : b これは3項演算子で、条件式が真の場合は a を、 偽の場合は b を返す式です。 return a>b ? a : b; の場合、 a>b だったら、 return a; そうじゃなければ return b; という意味です。
>>336 おぉわざわざありがとうございます。勉強になります。
今読んでる本のテンプレートの例題がよく理解できなかったので、
無理矢理自分がわかる簡単なコードに置き換えようとしてしまいました。
もっと他の本も読んでみます。
ガンガレ。良書を複数読むと、深い理解が得られるよ。 漏れはCからC++に移行するのに、C++の本を6冊読んだ。
無駄にあれこれ読んでも仕方がない。 Cでプログラミングの知識があるなら禿本をきちんと読めばいい。 まぁ普通の本の2,3冊分のボリュームはあるが。
340 :
デフォルトの名無しさん :04/03/02 21:22
すいません、質問なんですが、HTML文書の中に含まれている <b><a href="?page101">2</a></b> <b><a href="?page201">3</a></b> <b><a href="?page301">4</a></b> <b><a href="?page401">5</a></b> ↑こういう形の部分を全部消去したいんです。 で、パターンマッチングっていうんですか? 連番の部分の文字列をオールマイティ文字?で表す方法がわからなくて困ってます。 AnsiString Pattern =" <b><a href=\"?page" + "\\***"+"\">"+"\*"+"</a></b>"; StringReplace(HogeHTML, Pattern , "", TReplaceFlags() << rfReplaceAll); なんか無茶苦茶テキトーですがこんな↑感じでやるんですよね? 環境はBCB6です。 よろしくおねがいします。
ふつー、そういう場合は正規表現を使う。boost::regexとか。
>>340 FILE * fp = popen("sed -e 's;<b><a href="\?page[1-4]01">[2-5]</a></b>;;g' some.html", "r");
>>340 どうも正規表現の使い方を聞いてるようだが、
そもそもStringReplaceは正規表現には対応してない。
VCLにも正規表現を扱うオブジェクトはあるが、
その辺は専用スレで聞いたほうがよかろう。
>>344 人様に見てもらうなら、他人が見て一目で分かるようなファイル構成にしろ。
構造体・関数・マクロ他のアウトラインをまとめたドキュメントをつけろ。
そういうところに気が回らない時点ですでにオマエは能無し。ヴォケバカカス。
>>346 ファイルの先頭にどんなファイルか書いていただけなので、
仰るとおりだと思います。そこまで気が回りませんでした。
ありがとうございました。
>>337 たしかにtemplateでも多態性のように異なるオブジェクト間で
共通のメソッドを利用したプログラムの共通化が図れるけど、
そもそもの利用の目的は分けて考えるべき。
templateの使い方・考え方という意味では、「C++再考」を一読
することをお勧めします。
http://www.amazon.co.jp/exec/obidos/ASIN/489471776X/249-8101483-3161126 template関連の書籍は「STLの使い方」のような完全に利用者側の立場
がほとんどで、開発者向けのものとしては「Modern C++ Design」の様な
一気に高度な応用編のようなものくらいしかないですが、この本はSTL
が成立した考え方などを順を追って解説しているので、読み物としても
面白いです。
あとはおなじみEffective C++の41項位かな。
>>344 ドキュメント書くなら doxygen 使ってみー。無料だよ。
>>338 ,339
プログラミングは完全な初心者です。
現在は、
本を読む→理解できたと思ったら本を見ずにコードを記述 →
→ 失敗したらもう一度読み直し → 成功すれば(゚Д゚)ウマー
という流れで進めていますが、もっとおすすめの本や勉強法などありますか?
>>348 実は今その本の訳者が書いた「これならわかるC++」を読んでいます。
本人のHPで中級書として「C++再考」をすすめていました。
是非読んでみます。
>>350 それでいいから、最後まで通読すること。これが一番大事。
その後は自分で実際にプログラムを組んでみること。
ある程度経験を積んだら「プログラミング言語C++ 3rd」を読むべし。
他の本は要らん(開発環境の参考書は除く)。
その後は、OOP、デザパタ、ジェネ、ULM、なんでも好きな方面に展開すると。
先は長いぞ(w
353 :
デフォルトの名無しさん :04/03/03 16:54
ひじょーに基本的な話で恐縮なんですが、 32bitのLONG型 0xAABBCCDDをファイルに格納すると ファイルの先頭から DD CC BB AA と格納されるのか AA BB CC DD と格納されるのか、どちらなんでしょう?
>>355 環境によってはBB AA DD CCという場合もあるそうだ。
357 :
デフォルトの名無しさん :04/03/03 17:33
>>355 バイトオーダーについて調べてみるといい
エスケープシーケンスの話しなんですけど、 printf("0x1b[4;31m"); と記述しても リターンキーの記号[4;31m としかでないんですけどどうしてなんでしょうか・・・。 XPです
printf("0x1b[4;31m"); と書いて、 0x1b[4;31m と出ない処理系って?
>>360 間違えた・・・。
printf("\x1b[4;31m");
でした
エスケープシーケンスって32bitのDOS窓でも使えるの?
ansi.sys入れれば使えるんでないかい?
C:\WINDOWS\system32\CONFIG.NT に devicehigh=%SystemRoot%\system32\ansi.sys してみたらどうだろう
だれか答えてもらえないでしょうか・・・お願いします
W2Kのコンソールで確認したが やはりリターン記号になった。
printf("x1b[4;31m"); これだとそのまま表示された。
printf("0x"); printf("1b[4;31m"); printf("\n"); 結果↓ 0x1b[4;31m Press any key to continue これで駄目? Win2K+Consoleです。
>>366 無理っていうのは環境的に無理ってことなのでしょうか?
ならあきらめます。
>>369 やってみましたデフォルトの白文字で
0x1b[4;31m
が出力されただけでした・・・。
>>371 >>363 ,364は自分への返信だったんですか・・・。
で、C:\WINDOWS\system32\CONFIG.NT まではいったんですが、
CONFIG.NTが開けないです・・使うアプリケーションわからないんです。
スレ違いですが教えてください
ん? エスケープシーケンスを有効にしたいの?
そうです
ふつうのテキストファイルだから、メモ帳で。 関係ない行いじってこわすなよ
>>375 メモ帳でひらいて一番したに加えるだけですよね?
やってみたんですけどやっぱり無理でした。
ありがとうございました
(´-`).。oO(再起動はしたのだろうか?)
いろいろ検索してみたが、むりっぽいという意見が多い。 16ビットアプリだったらいける可能性があるんだが。 32ビットの場合はWindowsAPIを使うしかないということかな。
Vine Linux2.6使用しています。 C言語で プログラムに外部のプログラムを立ち上げさせるプログラムを作りたいんですが、 (たとえばキーボード入力があったときにemacsが立ち上がるとか) どのようにすればできるかがわかりません。 どなたか教えていただけないでしょうか?
doxygenでhtmlの表示上で改行させるためのコマンドがあるなら教えてください。 戻り値の@return、@retvalとかは分かったのですが。
まったく見当がつかないので、お願いします #include <iostream> #include <string> using namespace std; int myfind_first_r_of(const string &strob, const char *pch) { int klen = strlen(pch) / 2; int i, pos = 0, ppos; char ch[3]; if(klen == 0 || strlen(pch)%2 ) { cout << "指定が違います\n"; return 0; } for(i=0; i<klen; i++) { // なぜか1度しかループしない // cout << "klen = " << klen << '\n'; // for()の中でklenを使うと解消する strncpy(ch, pch, 2); ch[3] = '\0'; pch += 2; ppos = strob.rfind(ch); if(pos <= ppos) pos = ppos; } // この時点で klen が 0 になっている return pos; }
int main() { // "012345678901234567" string ob("あいうえおえういあ"); char str[] = "いあ"; cout << myfind_first_r_of(ob, str) << endl; return 0; }
>383 char ch[4];
むしろ ch[2] = '\0'; かな。
>>359 なんでエスケープシーケンスを使いたいんだ?
Win32 だと Console API で画面の色とかは設定するんだが。
>385 ch[4]にしても期待通りの16にならないんですが。
>385 >386 できました。きづきませんでした。 ありがとうございます。
すいません。@**コマンドでは無く、<br>でできました。 //! @par 機能: //! タイマー <br> //! 登録可能数は16まで(関数内のpiece定数で変えられる) //! //! @par 使用例: //! for ( i = 0 ; i < 10 ; ) <br> //! if ( Timer ( 1000 , "1秒毎に" ) ) <br> //! printf ( "%d\n" , ++i ) ; //! //! @retval 正 時間がたった 登録の破棄も行われる //! @retval 0 時間が経っていない 初登録時 //! @retval 負 引数が不正 タイマーをたくさん使っていて登録できない
>>390 で、それのどこがC/C++の話題なんだい?
いい加減に引っ込んでろ。
人並みのソースが書けるようになるまでは出入り無用。
>>382 ありがとうございました。
もうすこしsystemについてお聞きしたいのですが、
たとえば
char *eth = "eth0";
system("ifconfig %s", eth);
このような受渡しはできなかったのですが、
こういう事はできないのでしょうか?
sprintf使え
>>393 たびたび申し訳ありません。
system関数では%sでの受渡しはできないようなので、
お聞きしたのですが、sprintfで解決する問題なのでしょうか?
>>394 君が真面目に勉強すればすぐに解決する
自分で調べることを覚えなさい
396 :
デフォルトの名無しさん :04/03/06 15:58
エクスプローラで右クリックしたときのメニューに機能を追加したいのですが どのあたりのお話を調べたらよろしいでしょうか?
>396 シェルエクステンション?
すみません、環境はVC++ 6.0使ってます。 イメージとしては、対象のファイルを(例えば圧縮のような)加工するアプリに 引き渡すようなことを考えてます。
>398 その程度ならレジストリに書き込むだけだ。
>394 まぁまぁ、もう少しヒントをあげればいいぢゃん。 >380よ char cmd[] = "ifconfig eth0"; system(cmd); ってのは理解OK? char *eth = "eth0"; char cmd[256]; sprintf(cmd, "ifconfig %s", eth); ってのは理解OK? ...ヒントあげすぎ?
すみません。質問です。 VC++6.0使用してDLL読み込みのプログラムを作成したのですが。 いざDLLを作成して起動しようとするとランタイムエラーとなって起動できませんでした。 そこで、デバッグをかけてみるのですがデバッグ上では正常に起動しています。 これは何が原因で起こっているのでしょうか? 因みにDLLは旧バージョンがもう一つあり、それだと正常に起動しています。 なのに新しく作り直したバージョンのものは上手く起動できません。 デバッグのしようがなくて大変困っております。 どなたか御教授願えませんでしょうか。
>>401 そら新バージョンのDLLにバグがあるか仕様が変更されているか
要求するランタイムのバージョンがあがっているかだろ。
これ以上はソース見なきゃ誰も何も分からん。
質問お願いします。 ns2というネットワークシミュレータを使っているものです。 オープンソースでC++で書かれているシミュレータです。 質問したいのは、timeout関数というものがあり、 定期的にパケットを送る関数があるのですが、これに、受信処理を行う関数 recv()関数が存在して、そこで受信するごとに受信パケット数をカウントし、 それを送信側に定期的に送りたいのですが、定期的に送信する関数は、 タイマーがあり、ある時間がたつごとにループしています。 このループの中で、カウントが更新されていく変数received_packetを 呼び出したいのですが、更新された値が呼び出せないのですが、 何かいい方法がありましたら教えてください。 timeout(){ : : printf("%d\n",received_packet); timer.reschedule(inteval); // interval時間ごとに呼ばれる } recv(){ received_packet++; } 上のようなプログラムになっています。 説明不足ならご指摘いただければまた書き込みます。 よろしくお願いいたします。
>>402 ソース見せたいのは山々なのですが
バグとなっているDLLのソースはめちゃくちゃ長いんですよ。
何が原因か特定出来次第お見せしたいのですが・・・
何度もデバッグかけてるのですがそれらしいバグに
一切引っかからなくてほとほと困り果てました。
本体の方はまだ仕様変更してませんのでランタイムのバージョンを
上げる必要ないのですが・・なぜなんでしょう?
>>403 すまん、意味不明だわ。
質問は日本語でしてくれないか?
>>404 いや、だから、DLLがランタイムを必要としてる可能性があるでしょ。
つかDLLのソースがあるならDLLにデバッガかければいいやン。
意味不明の箇所を指摘しようにも文全体がわけわからん。 関数間の関係をグラフで書いてもらった方がいいかね……。 あとライブラリの利用に関する質問は どこまでがライブラリの部分でどこからが自分で書いた部分なのかも書いてほしい
>>406 それはもちろんDLLソースにデバッグかけています。
DLLにバグがあるのは分かっていましたので。
しかし、何も反応ないんですよ。
でも、アプリケーションから実行するとエラーとなってはじかれてしまいます。
>>407 本体もDLLも自作のものです。
エラーは自作DLLがわにある模様なのですが、どこがエラーなのか
デバッガかけても分かりません。
>>403 受信側の関数が持っているデータを送信側の関数に引き渡したいという話……なのかなあ
しかし、その変数が
1 recieved_packetは受信関数ローカルな(静的)変数なのか、
2 グローバル変数なのか
3 送信側にあって受信側に(参照で)渡しているのか
書かれていないので指針も立てられない。
ある程度複雑な処理の場合は
変数や関数の関係を簡潔に書いてくれ。
そもそも状況説明で「呼び出せない」とだけ書かれても
呼び出すコーディング方法がわからんのか
コーディングはしたがテスト段階で予想と違った振る舞いをするのか
もしくは並列に動作する環境でもって上手く動かないという話なのか
情報不足でまるでわからん。
それと不適切な指示語や言い換えや省略は
もうキリがないんで技術系MLの質問作法を一度当たってくれ。
>>408 >>403 みたいな国語力がナガシマシゲオなやつも困るが、
こいつみたいな必要な情報を自分からは提示しようとせずに
「ご教示下さい」ってヤシも困りもんだな。
>>410 ソース以外に必要な情報がありましたらいくらでも。
ただ、
>>402 >>406 のような原因でのバグではないようなんです。
どこがおかしいのか皆目検討付かないもので質問させてもらいました。
>>401 >>408 >いざDLLを作成して起動しようとするとランタイムエラーとなって起動できませんでした。
>そこで、デバッグをかけてみるのですがデバッグ上では正常に起動しています。
>これは何が原因で起こっているのでしょうか?
>それはもちろんDLLソースにデバッグかけています。
>DLLにバグがあるのは分かっていましたので。
>しかし、何も反応ないんですよ。
>でも、アプリケーションから実行するとエラーとなってはじかれてしまいます。
単にパス内にDLLがないだけということはないよな?
>>412 バグが起こった時最初はそれだと思って確認したのですが。正常でした。
デバッグ用にDLL読み込みチェック関数を作成して確認してみたのですが、 DLLが正常に読み込まれていました。ということは、DLLのソース内でランタイムエラーの 原因があるようですね。でも何でデバッグに引っかからないんだろう・・・不思議だなあ。
>>414 >でも何でデバッグに引っかからないんだろう
(´-`).。oO(単にデバッガの使い方を知らないんじゃ……)
417 :
デフォルトの名無しさん :04/03/06 21:49
技術系のMLのスレッドってどこにあるの?
>>417 スレじゃなくてサイト
ぐぐればすぐ見つかる
>>414 DLL に渡す領域不足なども考えられるぞ。
旧 Ver でも起こり得る潜在バグの可能性もありだな。
DLL はどうやってデバッグしてるんだ?
まさか、デバッグ用の DLL 呼び出し exe を別に作ってないだろうな?
>>419 >DLL に渡す領域不足なども考えられるぞ。
>旧 Ver でも起こり得る潜在バグの可能性もありだな。
いまいちイメージわきませんが。検討してみます。
>DLL はどうやってデバッグしてるんだ?
>まさか、デバッグ用の DLL 呼び出し exe を別に作ってないだろうな?
普通にデバッガかけてますんので、自然とそうなるのではないでしょうか?
呼出し用のexeないとデバッゲ出来ませんし。
皆様ご回答いただきありがとうございました。
421 :
デフォルトの名無しさん :04/03/07 01:22
ここで聞いていいものか分かりませんが、AU用にファイル(mmf)のDLを するためのタグなんですけど、「ダウンロードデータが正しく ありません」とエラーになってしまいます。 これはやはりファイルに問題があるのでしょうか? ちなみにメールで送信するとちゃんと聴けます。 どこかおかしいところありますか? <P>VoVoTau:nude</P> <P><object data="ファイル位置" type="application/x-smaf" copyright="no" standby="DL"> <param name="disposition" value="devm39z" valuetype="data" /> <param name="size" value="98626" valuetype="data" /> <param name="title" value="Nude" valuetype="data" /> </object><BR>
>>420 呼出し用のexeじゃなく、問題となってるexeを使えよ。
両方をデバッグしないと問題が出ないだろ。
>>DLL に渡す領域不足なども考えられるぞ。
>いまいちイメージわきませんが。
文字列末尾の'\0'分の領域が確保されていない、
とかその手のパターンだ。
>>423 ありがとうございます。
今後そちらの方面に重点を置き慎重にデバッガをかけてみます。
環境依存OKってことなので… .NET Framework SDKをC++から使うことはできますか?
>>425 managed C++ なら可能だけど。
428 :
デフォルトの名無しさん :04/03/08 00:29
cin.get と cin.getline の違いがいまいちよくわかりません。 一時間悩みましたがだめです。 もう寝ます。
>>428 おやすみなさい
きちんとしたドキュメントor参考書があれば5分で分かるんだけどね
そういうところには投資を惜しんではいかんよ。
430 :
デフォルトの名無しさん :04/03/08 23:50
#include <iostream.h> と #include <iostream> の違いはなんですか?
<iostream.h> → 非推奨(deprecated) <iostream> → 標準
432 :
デフォルトの名無しさん :04/03/09 00:06
ウホッ それっていつからなんですか? C99?
433 :
デフォルトの名無しさん :04/03/09 00:11
>>430 #include <iostream>だとnamespace stdを指定しないとならない
>>434 その言い方だと、「<iostream.h>だと、stdいらなくてイイ。」みたいで嫌だな。
>>434 別にstd::付いてもいいと思うけど。
質問というより、相談です。 LonghornではWinFXが出てきて、将来的にはWin32APIは 互換性のためにエミュレータ上にのみ残され動作するように なると聞いたことがあります。 今まで環境非依存のC++を勉強してきて、やっと最近 WindowsプログラミングをWin32APIで勉強し始めたのですが、 普通にWin32APIを使えるようになった頃にはもうWin32APIは 使われていないということになりそうな気もします。 MSの動きを見ていると、Windowsプログラミングの新しい スタイルを確立しようと、MFCを作り、.NETを作り、ついには (C or C++)&(Win32API or MFC)主流のスタイルそのものを 捨て去り独自の言語(C#)を作り出して、結局はそれによって プログラマ側はウィンドウズのシェアの高さに仕方なく新しい 言語の習得を強いられているのが現状だと思います。未だ C#では他OSでまともなGUIアプリケーションを作ることもできず、 将来的にも、C#のみを習得してしまったらWindowsでしか プログラミングできないということになりかねない気がします。 だからといってかなりのレベルまでに両方をスキルアップ するのも荷が重過ぎる気がします。managed C++というものも ありますが、結局過渡期・移行期間の為に用意したとしか 思えないという部分があります。そもそもC#を作ったこと自体、 Windowsプログラマの確保によるWindowsシェアの確保の ための策略である気がします。 今はWindowsプログラミングの転換点であると思います。 この時勢に、初心者である私は今から1からWin32APIを 勉強するよりもMSの策略に乗ってC#で.NETの勉強を始めた 方がいいでしょうか?それともまだまだC++でWin32APIを 勉強する価値はありますか? 主観的な意見でも構いませんので、皆様のご意見を聞きたいと思い、 投稿いたしました。よろしくお願いいたします。
>>437 お前が何をしたいかだろ?
MSの策略も何も、Windows上で動くアプリが作りたいんだったら、
C++でがんばるなりC#に移行するなりすりゃいい。
MSの姿勢が気に食わんというのなら、とっととLinuxなりMacなりに
移行すりゃいい。
でもな、何のためにプログラム言語を覚えようとしてるんだ?
なにか作りだしたいものがあるからだろ?
ごちゃごちゃ愚痴書いてないで、とにかくなにか作ってみろ。
文句言うのはそれからだ。
439 :
デフォルトの名無しさん :04/03/09 08:30
>>435 <iostream.h> だと
Visual C++ 6.0 ではコンパイルエラーになります。
440 :
デフォルトの名無しさん :04/03/09 08:30
std:: をつけたら です
>>435 そういうつもりは無いよ。
>>430 みたいな質問には、これを真っ先にいうとかなアカンでしょ。
どうせnamespaceなんか知らないんだろうから。
>>436 ヴォケ。質問からちゃんと読め。
何かどっかであえてdeleteを使わず高速化する香具師がいるって聞いたんですけど 私もそういうレベルに達してみたいんですが… 使い分けのノウハウを教えてください
>>442 >あえてdeleteを使わず高速化する
ただの邪道
delete を遅延することはあるかもね。
標準C++の基礎知識 実践編という本に C++の定数の定義は従来の#defineで定義する方法以外に const intなどで定義することができると書かれていたのですが 皆さんはどちらの方法を使ってますか?
enum
以外にっつーか定数のための #define なんて捨てろ。
>>446 #define じゃなく、 const int を使えというのは
stroustrup も言ってたと思うんだけども、
複数のソースで使われる定数に対して
const int を使うと、同じヘッダが使えずに不便だった
記憶がある。
そういうときはふつーstatic const intだろ。若しくはenum
static いる?
const int 定数はデフォルトで static だぞ(C++)。
これからはC++の定数にはconst intを使います ありがとうございました
質問させていただきます。 VC++6.0 でソフト開発しているのですが、アニメーションカーソルを作って LoadImage() をする際、LR_LOADFROMFILE でファイル指定では問題無く 動作するのですが、リソース読み込みにした場合 NT系=正常動作。 95系=LoadImage() がNULLを返して終了 と言うように上手く動作しません。同じ様な現象で、はまった方いらっしゃい ますか?出来ればリソース読みの形にしたいのですが、何か解決方法は あるでしょうか。
>>454 おそらくクラスの静的メンバ定数(っていうのか?)の場合も考慮しての発言だと思われる
>>456 GetLastError()はなんと言っているのか?
>>455 とにかく、Effective C++をお勧めします。
あなたくらいのレベルの方なら、200ページまるまる身になると思います。
>>458 エラー出ませんね。LoadImageの返りが0なので、直後に
GetLastErrorを取ってみると、やはりこちらも0です。
正常終了しているかの様です。
結局、どうしても動かしたい部分だけ自力で差し替えアニメさせて 怪しいアニメーションカーソルは使わない事になりました。 何だか負けた気分。。。(´・ω・`)
>>461 考えられるのは
・リソースの追加方法がおかしい
・LoadImage()の引数の指定がおかしい(インスタンス、イメージの種類、リソースIDの指定など)
と言った辺りですが、その辺はどうよ?
っていうか、LoadCursor()じゃダメなのか?
なあ。 class C { static bool flag; public: static void foo() { while( flag ) sleep(1); } static void setFlag( bool f ) { flag = f; } }; な、静的なメンバばっかりのクラスがあるとき、 C::foo()を実行するスレッドとC::setFlag()を実行スレッドが違うとして。 foo()は、setFlag()でのflagの値の変更に、反応できますか? flagに、volatile修飾子は必要?
sleep(1)が外部関数の呼び出しであれば、おそらく反応できると思います。 コンパイラは、sleep(1)の呼出しによってflagの値が変わらないとは判断できないでしょう 。 でも、そのコードで別スレッドからの操作に反応するのは良くないと思います。 flagにvolatile付けるか、while( static_cast< bool volatile& >( flag ) ) とか、別スレッドからの操作に反応することをコード上で表現することをお勧めします。
>>464 あ、反応できちゃうんだ...
ショボン
つか、会社でそのコードを見つけて、
そのコードをかいた先輩に「これ、ヤバくないですか?」
って突っ込んじゃったんだよな。
んまあいいや、ありがと!
>>465 コード直したくないなら、アセンブリ吐かせて確認するのを忘れるなよ。
VC++でプログラミングしているのですが。 例えばcalss A を継承した class B をnewで領域確保して、 それをclass Aでキャストして扱う場合、キャスト後のdelete は正常に行われているのでしょうか?
>>467 ポインタにキャストしたときの話だよな、もちろん?
class A のデストラクタが仮想ならBのデストラクタが呼ばれる。基本事項だけど。
int func() { return 12; } class A { public: A(int a = ::func()) // <---(1) { } void hoge(int a = ::func()) // <---(2) { } }; A a; a.hoge(); VC++6.0 SP5 上記の(1)の所で error C2039: '`global namespace'' : '`global namespace'' のメンバではありません。 と出ます。(1)の::を取るとコンパイルが通ります。 なぜエラーが出るのか、なぜ(2)の::は取らなくていいのか謎です。 これはコンパイラのバグなんですか?
gcc-mingwでもok
どうやらVCのバグみたいですね。 ありがとうございました。
VC6 は色々問題あるからね。 さっさと .net 2003 買った方が幸せかも。
VC++ だけでいいなら、アカデミックで 8000 円程度だぜ。
#include <functional> template <typename T> struct foo: public std::unary_function<T, bool> { result_type f; // (1) result_type operator()(const argument_type & arg) {} // (2) }; g++ 3.3.2 で、上記のコードをコンパイルすると、(1)、(2)の所で、 warning: `foo<T>::result_type' is implicitly a typename warning: implicit typename is deprecated, please see the documentation for details と、警告が出ます。なので、(1)、(2)の行を以下の様に書き替えてから typename result_type f; // (1) typename result_type operator()(const typename argument_type & arg) {} // (2) コンパイルし直すと、以下の様なエラーが出ます。 尚、(1)、(2)の行は、下のメッセージの5、6行目に相当します。 typename.cc:5: error: parse error before `;' token typename.cc:6: error: parse error before `operator' typename.cc:6: error: missing ';' before right brace これは、私の書き方が間違っているのか、コンパイラのバグか、何が原因なんでしょうか?
std::unary_function<T,bool>::result_type f; std::unary_function<T,bool>::result_type operator()( const std::unary_function<T,bool)::argument_type & arg){} すなおに、bool f; bool operator()(const T & arg) {} に汁
>>477 確かにそうすればコンパイルの通るコードになります。
ただ、私が聞いているのはそういうことではなくて、typename result_typeを使うように修正した
コードは間違っているのか、それとも規格の上では正しく、将来的にこのコードがコンパイルされる
ことが期待出来るのか、ということなのですが。
>>477 の書き方が正解。
コンパイラの動作をよく考えて見ろ。
std::unary_function<T,bool> は不完全型だから、実体化されるまで result_type が
本当に typename かはもちろんわからない。
……ここまでなら typename キーワードで解決しそうだが、
その基底型の内部で定義されている依存型かどうかすらコンパイラに伝わっていないだろ。
すいません、流れ読まずに質問です。 CreateWindow( "BUTTON", "BUTTON", WS_CHILD | WS_VISIBLE , 0, 0, 80, 20, hwnd, (HMENU)1, (HINSTANCE)GetWindowLong(hwnd, lParam), NULL ); このボタンのキャプションを変えるにはどうすればいいでしょうか? ヒントさえ教えてくれれば後はなんとかします。 環境:VC6.0 WinXP
SetWindowTextだったっけな
あぁ・・・すいません。
こんな簡単なことだとは知らず、お手数かけました。_| ̄|○
おかげで助かりました。
>>481 様
>>479 result_typeは何も修飾されていないので、foo内部で定義されていなかったとき、
次に探しに行くスコープを決定出来ないということでしょうか。
なんとなくではありますが納得出来ました。ありがとうございました。
std::unary_function<T, bool>::result_typeと書く方法は、同じことを2度書くことになるので、
std::unary_functionの中のtypedefをfooの中に持ってくることにします。
std::unary_functionを継承する目的は単純にtypedefだけなので、今回に限ってはこの方法でも
問題ないかと思います。
>>479 | 14.6 Name resolution
| 1 Three kinds of names can be used within a template definition:
| ? The name of the template itself, and names declared within the template itself.
| ? Names dependent on a template parameter(14.6.2).
| ? Names from scopes which are visible within the template definition.
テンプレートの定義内で使用可能な名前は以下の 3 種類である。
・テンプレートの名前自身、およびテンプレート自身の内部で宣言された名前
・テンプレートパラメータに依存した名前
・テンプレート定義時点で可視のスコープ内の名前
result_type はこれらのいずれでもないので使用不可能。
で、
>>477 みたいにテンプレートパラメータに依存した名前にしてやれば使用可能。
…ってことで OK ですか?
>>483 そういうこと。
少し補うと、unary_function に対して与える引数が完全型であれば
(そもそも template でなければ)その記法で問題なく参照できるはず。
それとその種の再宣言には using declaration を使う。
同名の typedef でも構わないけれど。
細かいことだが
>>477 も本来必要な typename キーワードが抜けている罠。
ちと訂正。テンプレート引数が完全型かって言い方は本質的じゃないし誤り含んでるね。
まあ要するに基底のクラステンプレートがその時点で実体化可能なら
その内部で定義されている名前も暗に利用できる、と。
>>484 お、リファレンスサンクス。
蛇足を書くと今の規格では
その時点で型名であることが不明瞭な場合は "typename" が必要と。
#ちなみに依存名について他のたいていの情報は明示的に指示することなく
#利用できるせいで良くも悪くも面白いことになるわけだが……
便乗して試してみたらこんな結果になりました。うーむ。
>>485 using declaration を使う場合ってどうなるんでしょうか。
#include <functional>
template <typename T>
// 1 - gcc 3.3.1 ok / BCC 5.5.1 ok
struct foo: public std::unary_function<T, bool> {
typedef typename std::unary_function<T, bool>::result_type result_type;
typedef typename std::unary_function<T, bool>::argument_type argument_type;
result_type f;
result_type operator()(const argument_type & arg) { return f; }
};
// 2 - gcc 3.3.1 ok / BCC 5.5.1 error
template <typename T>
struct foo2: public std::unary_function<T, bool> {
typename foo2::result_type f;
typename foo2::result_type operator()(const typename foo2::argument_type & arg) { return f; }
};
// 3 - gcc 3.3.1 error / BCC 5.5.1 error
template <typename T>
struct foo3: public std::unary_function<T, bool> {
using typename std::unary_function<T, bool>::result_type;
using typename std::unary_function<T, bool>::argument_type;
result_type f;
result_type operator()(const argument_type & arg) { return f; }
};
分割コンパイルでのクラステンプレートの書き方に関して質問なんですが // test.h ここからヘッダファイル export template <class T> class X { private: int kosuu; T* ptr; public: X(); // コンストラクタ ~X(); // デストラクタ void show(); // 表示関数 }; // ここまでヘッダファイル // test.cpp ここから定義ファイル #include <iostream> using namespace std; #include "test.h" template <class T> X<T>::X(int a) { … } template <class T> X<T>::~X() { … } template <class T> void X<T>::show() { … } // ここまで定義ファイル
// main.cpp ここからmainファイル #include <iostream> using namespace std; #include "test.h" int main() { X<double> x; x.show(); return 0; } // ここまでmainファイル 上記の三つのファイルに対して (1)これらをmake&コンパイルすると次のようなエラーが出る Error: 外部シンボル 'X<double>::~X<double>()' が未解決 Error: 外部シンボル 'X<double>::X<double>(int)' が未解決 Error: 外部シンボル 'X<double>::show()' が未解決 (2)テンプレートにせずに具体的な型を指定(例えばint型の配列とする) してやれば正常にmake&コンパイル出来る (3)三つのファイルを一つにまとめてしまえば(もちろん余分な#include <…>は消して) 正常にコンパイル出来る という状況です。(2),(3)から分割コンパイルにおけるテンプレートの文法のみが おかしいのだとわかるのですが、どこを修正すれば良いのかわかりません。 どなたかご指導おねがいいたします。
すいません、環境を書くのを忘れてました。 Borland C++ Compiler を使用しています。
>>488 2番目はなんか1番目と宣言の仕方が違ってないか? それじゃスコープ解決演算子付ける意味ないぞ。
3番目は……依存型の場合に using declaration で済ませると implicitly typename になっちゃうな。勘違いしてた。すまん。
>>490 bcc は export 命令に対応するようになったのか?
対応していなければヘッダに定義まで書いておいて inlucde するより他はない。
多重定義の問題はコンパイラ側が解決してくれる。
レスどうもです。 exportがサポートされていないコンパイラでは このような分割は無理ということでしょうか。 そうするとコンパイラを変えるか ヘッダファイルにまとめて書くしかないのですね。 どうもありがとうございました。
export をサポートしているコンパイラは未だに稀少なので、 export は使わないのがいいかと。
exportないと,どうしても循環依存せざるを得ないときに ソースコードがとても汚くなるんですよね. こういうとき皆さんどうしてます?(特にヘッダの宣言部分と実装部分の分け方)
1. 宣言部と実装部の間でインクルードする。 2. 1つのヘッダに書く。 のどちらかやね。
やっぱそれしかないんですね.ありがとうございます. 実装のヘッダーを別ファイルに分けている方って居ますかね? boostでたまに.ippって拡張子を目にしたりするんですが・・・
>>493 > 2番目はなんか1番目と宣言の仕方が違ってないか? それじゃスコープ解決演算子付ける意味ないぞ。
foo2 は foo2<T> と同じなのでつければ依存型になって、名前の解決がインスタンス化時点になり、
基底クラスまで見に行くんじゃないかなーと思って試してみました。
| 14.6 6
| (略)
| The keyword typename shall always be specified when the member is referred to using a qualified name,
| even if the qualifier is simply the class template name.
ってなってて、Examples でも typename は必要だとなってますし。
C++ Builder 5を使っています。 ListView1にはvsReportでNUM,NAME,PATHの順にアイテムが入っているのですが、 ListView1->OnSelectItemイベントでサブアイテムの値にアクセスする方法がわかりません。 下のようにやってみたんですが、Strings[n]に何を入れてもNUMが帰ってきてしまいます。 何か勘違いしているでしょうか? void __fastcall TForm1::ListView1SelectItem(TObject *Sender, TListItem *Item, bool Selected) { Label1->Caption=Item->SubItems->Strings[1]; }
504 :
デフォルトの名無しさん :04/03/21 19:20
保守
505 :
デフォルトの名無しさん :04/03/22 16:42
任意に与えられた自然数nに対して、n個のint型変数x[i]と正のint型の定数M[i] (0≦i≦n-1) を用意して、各変数x[i]が0≦x[i]≦Max[i]を動くときの処理を考えたいのですが どのように記述すれば良いのかわからず困っています。 例えばn=2ならば for(int x[0]=0; x[0]<=Max[0]; x[0]++){ for(int x[1]=0; x[1]<=Max[1]; x[1]++){ f(x[0],x[1]); // ←処理を関数fで表した。 }} ということです。n=3ならばfor文は三つになります。 これをnを初めに固定せずに書きたいのですが そのときのforの入れ子(ネスト)の部分の書き方がわからないのです。 cin>>n; int* ptr_x=new int [n]; int* ptr_Max=new int [n]; for(int i=0; i<n; i++){ cin>>ptr_Max[i]; } // ここにforの処理を書きたい。 すみませんがどなたか教えていただけないでしょうか。 よろしくお願いします。
506 :
デフォルトの名無しさん :04/03/22 16:43
あっちのそれで開けばオッケー。 ゆでたまごに気をつけろ。 明日はきっと暴落するよ。洗面所が。
>>505 #include <iostream>
bool increment_counter(int n, int *counters, int *limits)
{
for(int i = 0; i < n; i++)
if(counters[i] < limits[i] - 1) {
counters[i]++;
return true;
}
else
counters[i] = 0;
return false;
}
bool initialize_counter(int n, int *counters)
{
for(int i = 0; i < n; i++)
counters[i] = 0;
return n != 0;
}
int main()
{
int n;
std::cin >> n;
int *ptr_x = new int[n];
int *ptr_Max = new int[n];
for(int i = 0; i < n; i++) std::cin >> ptr_Max[i];
for(bool cond = initialize_counter(n, ptr_x); cond; cond = increment_counter(n, ptr_x, ptr_Max))
;// use ptr_x
}
>>508 ありがとうございます!
コンパイルしたら希望通りの結果になりました!
といっても実は内容はまだ理解できていないので
これからがんばろうと思います。
本当に助かりました。ありがとうございました。
win32のRGNDATA構造体のメンバBufferには 何をどう入れればよいのでしょうか? 「Specifies an arbitrary-size buffer that contains the RECT structures that make up the region.」 と説明があるので、RECTのことだとは思うんですが、 それをメンバの char Buffer[1]; に直す方法が分かりません。
COBOLしか分からないC初心者なんですが、 CとC++って、どっちを先に覚えるのが良いでしょうか?
>>510 この先プログラミングをみっちりとやっていくなら
Cからじっくり行ったほうが効率がいいと思います。
間違えて自分を諭してしまった・・。
>>511 どっちでも。
俺はC++を先にやるべきだと思うが、
>>512 のような意見も多い。
これだけ意見が割れるのは、どっちでも大差がない証拠かも試練。
515 :
デフォルトの名無しさん :04/03/22 20:17
>512 正しいようで正しくない。 OOPを学びながら進めていくべきだと思う。
むしろ、 大丈夫な奴は、どんな学び方をしても大丈夫 だめな奴は、どんなやり方をしてもだめ な証拠。 ここで「学び方」を質問するような奴は、間違いなく後者。
>>510 環境依存 OK だから構わないけど、API スレで聞いたほうが回答でやすいんじゃない?
…と思ったが、むしろこっち向きかもしれない。
実は RGNDATA 使ったことないんだけどな。
おそらく不定長のデータを扱うときによく使われる方法だと思われ。arbitrary-size って不定長だし。
Buffer に何か値を設定するわけじゃないはず。
ttp://www.catnet.ne.jp/kouno/c_faq/c2.html#6 /* ↓のように余分な領域を確保しておいて… */
DWORD dwSize = sizeof(RGNDATAHEADER)+sizeof(RECT)*5;
RGNDATA *prgn = malloc(dwSize)
GetRegionData(hrgn, dwSize, prgn);
/* ↓のように Buffer を通してアクセスする */
for(i = 0; i < 5; i++) {
RECT *prc = (RECT*)&prgn->Buffer[sizeof(RECT)*i];
/* 適当に処理 */
}
実際には、dwSize の値は GetRegionData(hrgn, 0, NULL) で取得するらしい。
ttp://techtips.belution.com/ja/vc/0039/
518 :
デフォルトの名無しさん :04/03/22 22:12
配列でない変数 a0, a1, a2・・・ を printfで表示したいのですが 配列を for ( i = 0; i < 3; i++ ){ printf ( "%d\n", a[i] ); } とするように ループで一気に表示する方法はありますでしょうか?
>518 そもそもどうして配列じゃダメなの?
>>518 無理。
変数の名前自体が似てようが1文字違いだろうが関係ない。
a, hoge, zzz を printf で(以下略)って言ってるのと変わらない。
>518 ちなみに俺なら配列を表示するプログラムを書くプログラムを書いて、それをコピペするね。 それじゃダメ?
523 :
デフォルトの名無しさん :04/03/22 22:19
すまそ、意味わからんかった。 その変数を用いて書くプログラムをCで書いて それの実行結果をソースにコピペするって意味なんだけどわかる? まさかa0〜a10程度じゃないよな。 それくらい普通に書けよな。
525 :
デフォルトの名無しさん :04/03/22 22:23
ないのですね。 ありがとうございました。 配列で実行します。
526 :
デフォルトの名無しさん :04/03/22 22:41
すいません。 もひとつCの質問です。 D\test0.text, D\test1.text 〜 D\test4.text というテキストファイルがあります。 for ( i = 0; i < 5; i++ ){ fp[i] = fopen ( "D\\test[i].text", "w" ); } という風に一気にファイルを開く方法はありますでしょうか? エクセルのVBAですと " & i & " で出来たので こっちはありそうな気がするのですが、どうでしょうか。
sprintf
528 :
デフォルトの名無しさん :04/03/22 23:35
文字列(半角10文字以下・dogなど)を10回入力、アルファベット順に表示させるものですが、これからどう作ればいいですか?読み込みとかが良く分からないです /*読み込み*/ for(tate=0;tate<=kaisu;tate++){ for(yoko=0;yoko<=MAX;yoko++){ gets(moji); moji[tate][yoko]=atoi(moji); } } for(tate=0;tate<kaisu;tate++){ for(yoko=0;yoko<MAX;yoko++){ printf("%s",moji[yoko][tate]); printf("\n"); } } } /*ソート*/ for(i=0;i<kaisu;i++){ for(j=i+1;j<kaisu;j++){ if(moji[i]>moji[j]){ temp=moji[i]; moji[i]=moji[j]; moji[j]=temp; } } } /*表示*/ for(i=0;i<kaisu;i++){ printf("%s\n",moji[i]); } return(0); }
>>517 どひゃ〜〜できました!助かりました。
GetRegionData()なんて知りませんでした。
丁寧な解説及びリンク、本当にありがとうございました。
530 :
デフォルトの名無しさん :04/03/23 12:32
>526 直接fopenじゃなくて 一度ファイル名を文字列にしてから それをfopenで開くとうまくいくよ
>>526 >D\test0.text, D\test1.text 〜 D\test4.text
>というテキストファイルがあります。
>一気にファイルを開く方法はありますでしょうか?
ない。
for ( i = 0; i < 5; i++ )
{
sprintf( filename, "D\\test%d.text", i );
fp[i] = fopen ( filename, "w" );
}
と、ちまちまやれ。
532 :
デフォルトの名無しさん :04/03/23 13:04
ollydbg1.06か1.07がDLできるサイト教えて
533 :
デフォルトの名無しさん :04/03/23 13:20
C初心者です、最後の三行が表示されません、どうすればいいですか #include<stdio.h> struct syain { int num[2],sur[2]; char nam[2],hyo[2]; }sya; int main(void) { int i; for (i = 0 ; i < 3 ; i++) { printf("no >"); scanf("%d",&sya.num[i]); printf("name >"); scanf("%s",&sya.nam[i]); printf("salary >"); scanf("%d",&sya.sur[i]); printf("point >"); scanf("%s",&sya.hyo[i]); printf("\n"); } printf("no name salary point"); printf("\n"); for (i = 0 ; i < 3 ; i++) { printf("%d %s %d %s", sya.num[i],sya.nam[i],sya.sur[i],sya.hyo[i]); printf("\n"); } return 0; }
すいません533は自己解決しました スルーで
535 :
デフォルトの名無しさん :04/03/23 16:39
どなたかご教授ください。 VC++6.0 で作成したアプリにて、LoadImage()を用いてDLLファイルからIconを取得しています。 Logを解析すると、あるタイミングからNULLが返ってきてしまいアイコンハンドルが取れないそうです。 再現しないためGetLastErrorの内容を取得することもできません。 ちなみに動作環境はXPです。 メモリリーク、リソースリークを起こしていない事はリリース前に確認しました。 どのような要因が考えられるか分かる方いましたらお願いします。
>メモリリーク、リソースリークを起こしていない事はリリース前に確認しました。 これがどれだけ信用できるのかね。 それはともかく、メモリ破壊してない?
>>536 メモリ破壊してないとは断言できないです・・・。
VC++6で、コンパイルして作ったDOS実行ファイルをクリックすると一瞬で終わっちゃう。 cout << "何か入力すると終了します。\n"; cin >> a; 以外で、実行結果を見た後終了する方法ないですか? VC++6の!ボタンを押して確認する以外の方法で
>>538 1.コマンドプロンプトから実行する
2.cin>>a;じゃなくてcin.ignore();を使う
>527, >536, >531 どうもありがとうございました。
542 :
デフォルトの名無しさん :04/03/24 01:30
別スレでこちらで質問したら?と誘導されてきました。 windowsで、 外部からある一定の音量を感知したら任意のプログラムをキックする ようなプログラム ってどうやって作ったらいいですか? バックグラウンドで動いてて必要なら別アプリを起動する、とか あるポートにメッセージを送るとかを行いたいんですが。
>>542 「一定の音量を感知」するのはどうやってやるんだ?
マイクを監視すればいいんじゃない? 方法は知らないが、 DirectX のマニュアルでも読めば分かるんでないかい?
>>543 ,544
>「一定の音量を感知」するのはどうやってやるんだ?
>マイクを監視すればいいんじゃない?
>方法は知らないが、
そうです。まさにそこが分からないところなんです。
つまり肝心なところがさっぱりで・・・。
とりあえずDirectXのマニュアルを読んでみます。
もう少し広い範囲でやりたいなら低レベルオーディオAPIを使うとか
>>545 そんな用途ならMMEの方が単純で扱い易いかも。
waveInほにゃららで、全サンプル値をチェック。
ちょっと聞きたいんですけど、 VC++.NETで、別ファイルにinline関数を書くことはできませんか? //function_hoge.cpp inline void hoge(void) { //処理 } //main.cpp inline void hoge(void); int main(void) { hoge(); } 外部参照が解決されてないとか言われます。
>548 inlineの意味、解ってる?
>>548 外部リンケージとinlineの組み合わせは文法違反です。
後は
>>549 さんの言われる通り。
但しinline関数はアドレスを取る事ができます。考えて
みれば奇妙な仕様だな。
>>549 こういうことですか?
//hoge.h
inline void hoge(void);
//hoge.cpp
void hoge(void)
{/*処理*/}
>>550 いちいちコードを呼び出すのではなく、
呼び出されているところに、コードを直接埋め込んでしまうんですよね?
>>551 すみません。ちょっと意味が分かりません。
別ファイルのインライン関数を呼び出せないということ?
>但しinline関数はアドレスを取る事ができます。
えっ、じゃあ、コレが合法?
inline void hoge(void)
{/*処理*/}
int main(void)
{
void (*Phoge)(void);
Phoge = hoge;
Phoge();
}
コードはコンパイル時に生成される。 コンパイル時に実体が無いものをどうやって埋め込めと? Effective C++読め。
レスを下さった方、ありがとうございます。 続きですが、ツールを用いて ハンドル数・スレッド数・GDIオブジェクト数の数が一定の処理の前後でリークしないことは確認しました。 その他、確認すべき点ありますか? また、メモリ破壊についてですが、どのように発見できますでしょうか? どなたかご教授お願いします。
>>552 別ファイルのインライン関数は呼び出せないのが基本。但し
多くのコンパイラはinlineにexternがついているとinline化を
やめてしまって通常の関数として扱い、表面上は通って動く
のでややこしい。
上のサンプルのインライン関数のアドレスを取っているのは
内部リンケージを持つ場合は秘かに関数の実体を作ってそ
れを呼び出す。外部リンケージの場合は上記のようにコンパ
イラによって挙動が異なるが原則的に禁止。
>>552 C++FAQ第2版に次のような記述を見つけた。(P189)
「inline関数が使われているソースファイルには、そのinline関数
の定義が含まれなくてはいけない。」
つまり基本的には他ファイルのinline関数を呼び出す必要は
なくなるはずなのだ。
>>557 ええ。正確にいいますとエンベデット版で必須コンポーネントのみで構築したXPなんです。
それも現象が発生したのは一度(exeを終了するまでは何度も)きりで再現してくれないんですよ。
ですからLoadImageでNullが返ってきてしまうような状況に陥る要因が教えていただけたらなと思った次第です。
560 :
デフォルトの名無しさん :04/03/29 14:32
復活記念あげ
とんだログいる? 591まで保存してある
別に議論してるわけでもないし、問題ないと思うな。 質問(or回答)が消えたやしは再質問すればいいかと。
んじゃ、そういうことで
564 :
デフォルトの名無しさん :04/03/29 17:25
コールバック関数処理中に 同じコールバック関数を呼び出すイベントが発生した場合というのは 前回呼び出された際の処理が完了していなくても コールバック関数の処理は走ってしまうんでしょうか?
565 :
デフォルトの名無しさん :04/03/29 17:42
すみません、C/C++ に限ったことじゃないのですがわかる方お教えください。 fgetc() で読み出すのと fputc() で書き込むのではかかる時間は同じでしょうか? HDD 上の大きいサイズのファイルを扱う場合、読み出しと書き込みの速さに差はないものですか? 同じサイズでも書き換えるよりも単純に読み出すだけの方が速いように思うんですが。
>>565 クラスタサイズやOSやハードディスクに大きく依存するが、通常
は書き込みの方がコストが高いと思われ。ファイルサイズが増大
する可能性があるし、その結果ファイルが分断される可能性もあ
る。
シーケンシャルアクセスとランダムアクセスとでも大きく差が出る。
ランダムアクセスは読み書きにほとんど差がないかもしれない。
567 :
デフォルトの名無しさん :04/03/29 18:09
質問です。 今までVC++で開発を行って居たのですが 急遽Linuxで開発を行わなければならなくなりました。 それで、全くmakeファイルとか書けないので手も足も出ない状態なのですが 自動的に作成してくれるAutoconfと言うツールを知りました。 それで、 autoscan autoconf ./configure までやったのですが、makeファイルが作成されません。 ちなみに、makeしたい対象のファイルは main.cpp、NET_SET.cpp、header.h、NET_SET.h です。 どうかご教授ください。
>>566 お答えありがとうございます。
ファイルサイズを知る簡単な方法として
while (fgetc(fp) != EOF) l ++;
が現実的かどうか疑問に思ったんです。
質問させてください。 c言語でlong以上の数を扱うにはどうしたらよいのですか? 1024bitや4096bit超の数をあつかいたいんです。 「bit 自由に設定 c言語」「bit 自分で決める c言語」などを キーワードとしてぐぐったのですが、 出てきたサイトでは問題が解決しませんでした。 あと、べき乗をするときは^ではだめなのですか? こちらは、math.hとpowで解決しましたが、 ^が駄目な理由がわかりません。 よろしくおねがいします。
>>569 処理系に大きく依存。_int64とか_INT64とかlong long int(C99)
が使えないか?
べき乗に^が使えない理由?それは^がCではビット毎のXOR
演算子と定義されているからです。
おっとっと。1024bitや4096bitか。そいつはCでは扱いにくいな。 C++で多倍長クラスを使うと楽。ぐぐったらいっぱい落ちてる。
>>569 CならGMPっていうライブラリがある。ぐぐってみれ。
>>569 ちょっと検索の仕方が経たみたいなのでアドバイス
やりたいことは非常に大きな整数を扱うことだと思います
bitを自由に設定するというのはその解決方法の一例に過ぎません
こういうときは具体的な解決策で検索するのではなく、
やりたいことで検索すればいいと思います
ちなみに「C言語」と検索するよりも「C」のほうがいいと思います
模範検索例
「C 非常に大きな整数」
・ここで「RubyはCと違って組込みの多倍長整数機能があるので,非常に大きな整
数の演算も可能」という情報を入手
自分の求めている機能の名前が「多倍長整数機能」であることを知る
「c 多倍長整数」
・いろんなライブラリにヒット
>>568 最初の質問の内容とやりたいことが激しく一致してないと思われ
とりあえず言えることは「そんな方法は現実的ではない」
ファイルサイズが2Gとかだったらどうするんだ?
調べようとしているファイルの格納先がFDDだったり
ネットワークドライブだったりしたら?
>>568 fseek(fp,0,SEEK_END);
filesize = ftell(fp);
2G超えるのにも対応したいならシステムコール使え。
>>574 ご指摘ごもっとも。
ローカル HDD 上のファイルを暗号化することを想定していました。
>>575 それ簡単でいいですね。2G はさすがに超えないと思います。
ありがとうございます。
577 :
デフォルトの名無しさん :04/03/29 21:25
>>577 向こうで「環境書け」と言われてるだろ。書け。
aaa, Windowsでよろしくおながいします
君、おもしろいね
>>577 よくわかんないけど、伝えられなかったら意味ないな。
みなさんありがとうございました。 「多倍長クラス gmp」で検索してHPを見ていったら問題が解決しました。 また、疑問が出てきたら質問させてください。 お世話になりました。
>>567 GUI 使うとしたら、kdevelop とかかな。
autoscan とかやってみたけど、手直ししないと無理だと思う。分かりません。
ファイルが 4 つとかなら、autoconf 覚えるよりも、Makefile 書いたほうが楽。
------
target : main.obj NET_SET.obj
g++ -Wall main.obj NET_SET.obj -o target
main.obj : main.cpp header.h
g++ -Wall -c main.cpp -o main.obj
@mkdir -p old/`date +"%y%m%d%k%M"` 2>/dev/null
@cp main.cpp header.h old/`date +"%y%m%d%k%M"/
NET_SET.obj : NET_SET.cpp NET_SET.h
g++ -Wall -c NET_SET.cpp -o NET_SET.obj
@mkdir -p old/`date +"%y%m%d%k%M"` 2>/dev/null
@cp NET_SET.cpp NET_SET.h old/`date +"%y%m%d%k%M"/
clean :
rm -f main.obj NET_SET.obj
------
cpp と、include してる h を一緒に書く。コマンドの行(g++,@ ,rm の行)の先頭はタブ
@ で始まってる行はバックアップつくってるだけ。コンパイル作業とはあまり関係ない。
ちゃんと書こうと思ったら、
ttp://www.oreilly.co.jp/BOOK/make/ とかいいと思う。
>>576 >ローカル HDD 上のファイルを暗号化することを想定していました。
>2G はさすがに超えないと思います。
明からに越える可能性ありだろ。
585 :
デフォルトの名無しさん :04/03/30 00:37
>>583 THXです。
ただ、
g++ -Wall main.obj NET_SET.obj -o target
g++: main.obj: No such file or directory
g++: NET_SET.obj: No such file or directory
g++: No input files specified
*** Error code 1
という感じでエラーが出ました。
コードのコンパイルは成功してるっぽいんですが・・・・
ちなみに、そのディレクトリにmain.objもNET_SET.objも出来上がってます。
>>586 え〜と、
makeファイルのobjを全てoに変えてみたんですが
それでも同じエラーが出ました。
一部だけ変えるんでしょうか?
>>576 典型的 C Programmer's Diseaseハケーン!!
最大値勝手に決めるのハゲシクイクナイ!!!
590 :
デフォルトの名無しさん :04/03/30 01:59
う〜ん、、、 やっぱり変えてみても g++ -Wall -c main.cpp -o main.o g++ -Wall main.o NET_SET.o -o target g++: main.o: No such file or directory *** Error code 1 こうなりますね。
>>590 いったん、make clean するか、手動で obj ファイル削除してから、
手動で
g++ -Wall -c NET_SET.cpp -o NET_SET.obj
g++ -Wall -c main.cpp -o main.obj
g++ -Wall main.obj NET_SET.obj -o target
やるとどう? どこでエラーがでる?
それと、適当に書いちゃったけど、
main.cpp と header.h , NET_SET.cpp と NET_SET.h って組合せでいいの?
あと、ファイルとかディレクトリの書き込み権限とか、基本的なことはわかってます?
ls -l と、ls -d . の出力で確認。
わかってなかったら、
http://pc3.2ch.net/test/read.cgi/linux/1079676217/1
>>591 手動でやると、何故か上手く行きました。
組み合わせもあってます。
あと、権限はmakeの時だけ一時的にsuユーザーになってるので問題ないはずです。
593 :
デフォルトの名無しさん :04/03/30 02:17
CXX=g++ CXXFLAGS=-Wall LDFLAGS= all: build build: main.o NET_SET.o $(CXX) $(CXXFLAGS) $(LDFLAGS) -o target main.o: main.cpp header.h $(CXX) $(CXXFLAGS) -c -o main.o main.cpp NET_SET.o: NET_SET.cpp header.h $(CXX) $(CXXFLAGS) -c -o NET_SET.o NET_SET.cpp
594 :
デフォルトの名無しさん :04/03/30 02:19
NET_SET.o: NET_SET.cpp header.h じゃなくて NET_SET.o: NET_SET.cpp NET_SET.h
オブジェクトファイルとヘッダファイルの依存関係は makedepend を使ったほうが楽じゃないかな。
>>592 とりあえず、おめでとう。
make -n で処理のコマンドが表示されるから、
>>591 と見比べたりとかして、Makefile の書いてみて下さい。
info コマンドで make を調べたり、ネットや本で調べたり
>>593-594 みたいなレスもついてるし。(build: の下の行…)
あと、root 権限での make は危険なのでなるべくやらないほうがいい。
make install とか、そういった絶対に権限が必要な時だけに。
@rm -rf / とか書いてあったりすると、システムごと…
やらなきゃならない時でも、必ず make -n で確認すること。
>>595 makedepend つかったほうが楽なんだろうけど、
とりあえず、いちばん簡単な Makefile の書き方を覚えたほうがいいかと。
まだ、依存関係を把握できなくなるほどのファイル数でもないし。
597 :
デフォルトの名無しさん :04/03/30 08:20
>>596 今になって気づいた。
オブジェクトファイルが指定されていないなw
>>584 , 589
ご指摘ありがとうございます。
素直に stat() 使っときます。
599 :
デフォルトの名無しさん :04/03/31 03:26
はじめまして。まったくの初心者です。これからC言語勉強しようと思うのですが初心者に向いてるソフトってあるでしょうか?あったら教えてください!本格的なものがいいです。
本格的じゃないCのコンパイラというのはどんなコンパイラだろうか…
組み込み系とかのシンプルな奴じゃねーの
というか開発環境について聞いてるような気がする。 まさかと思うが、タイピングソフトのノリで C言語学習ソフトみたいなものを期待してるか?
まったくの初心者ならひまわりとかからはじめてみたら?
605 :
デフォルトの名無しさん :04/03/31 15:53
#include <windows.h> int main(void) { while(1) { Sleep(100); //if(kbhit())getch();//バッファにたまらないように 入れても音はなる } return 0; } 上のプログラムで、ただキーを押しただけでジーっと音が鳴ってしまいます。 scanfやfgetsなどの時に、入力のためにキーを押している時も同じ音が鳴ります。 いろんなサイトに乗っている、入力を受け、それを表示するような簡単な ウィンドウズアプリケーションでは音はなりません。 scanfやfgetsの時は入力したものが使われているのでまだ分かるのですが、 上のプログラムは特に使われていないのに音がなるのがわかりません。 ならなくなる方法があったら教えてください。又はなぜなってしまうのでしょうか。 今まで気づかなかったのですが、パソコンを修理して音が静かになり気づきました。
>>596 レスありがとうございます。
色々やってみたんですが
どうやら、出来上がったファイルが
main.o?とか?が付いちゃうのが原因みたいです。
なので、makefileのリンクする場所でmain.o?とやる事で解決出来ました。
ただ、なんだか気持ち悪いのは確かです。
それと出来上がったtargetも?が付いてます。
改行部分をLF(UNIX形式)にすることで解決しました。 なんで、今まで気付かなかったんでしょうか(笑 では、どうもありがとうございました。
>>605 >ジーっと音が鳴る
これはノイズなの?それともBEEP音(懐かしい…)なの?
>>605 「ジ〜」とか鳴るのかな。
なんにせよあなたのハードウェア固有の現象と思われ。
ちなみにうちのノートはUSBに一定以上の電圧がかかると電源周りが「ジ〜」と鳴く。
int main(void)
{
while(1)
;
return 0;
}
何の音なんでしょう。BEEP音ではないけど、
>>610 さんの電圧音かな。
上のプログラムでも同じ音が鳴るから、CPU率が高いとかが原因なのかも。
>>612 うーん、パソコンが壊れているのかな・・。
パソコン2台あるのですが、起動音が大きいデスクトップのは聞こえないが、
静かなノートのは聞こえるので、どのパソコンでもその音はなっているが、
静かなパソコンで無いと聞こえないと思ったり。
テキストベースのゲームをコンソールアプリケーションで作るのですが、
この音が気になってわざわざウインアプリで作らないといけないと思うと
夜も眠れません。
>>613 だったら、getch より低レベルの関数を作ればよい。
実際、昔はそうやっていた。
どこから「ジ〜」と音が鳴るのかが重要だと思われ ディスプレイ?スピーカー?CPUファン?電源FAN? コンソールアプリのみで鳴ると言うことを考えると以下の可能性が考えられる コンソールで画面を最大化していて、 コンソールの解像度やリフレッシュレートが特殊で、 ディスプレイから音が漏れる っていうか、もうちょっと詳しくレポートしないと解決できんぞ コマンドプロンプトとMS-DOSで動作の違いが出るかとか、 WindowsとLinuxで比較してみるとか、いろいろあるんだが名
これは便利な仕様ですね!! 何の命令も打たずに勝手に音がなるなんて!!
>>614 インアセとかでやるのかな。探してみます。
>>615 音が鳴る位置は、どこかはうまく説明できないけど、
普通の起動音が鳴る位置と同じです。
コンソールアプリケーションを実行したとき、MS-DOSを実行したとき
共に動作は同じで、通常サイズ、フルスクリーン時も共に同じです。
マシンによるのは、ウィンしか持っていないので分からない。
>>616 ワラタ
>>605 念のため複数のマシンで試したけどどれも音せず
君のマシンはマザーボードがちゃちで、音源ボード/チップがノイズがを拾ってるんでしょ
夜も寝られないくらいならPC買い替えな
かつてこれほど環境依存な質問があったろうか…
環境依存ではあるけど、よくある話。 プログラムを走らせるとCPUとかバスのノイズを どっかで拾って音が出てしまうだけ。 熟練するとその音で何のプログラムが走っているかを判断できるとかいう ジョークだかなんだかもあった。
>>620 大昔のFM-77でそういう現象があったな。
共有メモリにアクセスすると「ギューギャー」と鳴いた。
MSX使ってたリアル厨房のころは カセットテープのピーガー音でMLOADかCLOADかLOADかを 聞き分けてたなぁ。
>>617 >インアセとかでやるのかな。探してみます。
アセンブラなぞ使わずとも、ポートを叩くだけで済む筈。
適当にポートをいじれば Windows が勝手にエミュレーション
してくれると思う。
私のPCはUSBのラインがサウンドのラインと交錯してたので マウスを動かすとぎゅもぎゅも音が鳴ってた。 今はラインを整理してシールドしてやったので静か。
復活お疲れ様。
>君のマシンはマザーボードがちゃちで、音源ボード/チップがノイズがを拾ってるんでしょ
音が静かで説はまったくの的外れだったのですね。
>夜も寝られないくらいならPC買い替えな
ぐっすり寝ちゃってましたw。
何回も故障しているマシンでもあるから、ホント買い換えたいんですけど。
>>619 ワラ
>>623 勉強になります。探してみます。
>今はラインを整理してシールドしてやったので静か。
うちのでもできるかな。探してみます。
基本的にちゃんとしたマシンなら鳴らないみたいなので、
我慢してそのまま制作を続けます。
お答えいただいた方、ありがとうございました。
626 :
デフォルトの名無しさん :04/04/02 05:50
質問です。 FreeBSDでg++で開発を行ってるんですが >implicit declaration of function `int close(...)' って出るんですが、close()ってどれをインクルードすれば良いんでしたっけ?
>>626 man close で出てこない?
Linux だけど、unistd.h って出てきた。
# 昔 BSD インストールしたけど挫折した。(笑)
>>627 おお!THX!です。
unistd.hでした。
>>626 find /usr/include -name '*.h'|xargs grep -wl close /dev/null
close()だとコメントにもマッチしそうだけど、結構この手は使ってる。
630 :
デフォルトの名無しさん :04/04/02 10:07
初心者的質問で申し訳ありません。 日本語のコードについて調べていたら、 MSDNのヘルプは「unicode」=「ワイド文字」、「シフトJIS」=「マルチバイト文字」と言い替えてます。 MSは勝手だ。と思っていたらLinuxのマニュアルでもこのような言い替えをしているんです。 素直に「これはunicodeだ」とか「シフトJISだ」とか呼べば良いのに、意味が分かりません。 それからunicodeからシフトJISには WideCharToMultiByte()とwcstombs()の2種類があるのですが、 なぜ2種類もあるのですか? よろしくお願いします。
631 :
デフォルトの名無しさん :04/04/02 10:29
>>630 >MSDNのヘルプは「unicode」=「ワイド文字」、「シフトJIS」=「マルチバイト文字」と言い替えてます。
>MSは勝手だ。
MSが付けたもんじゃねぇだろ。
もっとよく調べろ!タコ!
ワイド文字 → コード長固定
マルチバイト文字 → コード長1バイト以上
と言う違いがある。
ちなみに、
>「unicode」=「ワイド文字」、「シフトJIS」=「マルチバイト文字」
と言う方程式ではなく、それぞれの代表的なコード体系と言うだけの事。
ワイド文字⊃unicode マルチバイト文字⊃シフトJIS
633 :
デフォルトの名無しさん :04/04/02 10:45
なるほど、シフトJISとJISはマルチバイト文字の仲間で、 unicodeはワイド文字だけど、ほかに有名なコードが今のところない。 ということなのですね。 MSは勝手だと最初思い込んだのはいろんな人が悪口ばかり言ってるからです…
634 :
デフォルトの名無しさん :04/04/02 11:36
すいません初歩的な事で恐縮ですが CPPファイルのトップのほうでヘッダーと共に 定義されている#ifdef_DEBUG の行って何の為にあるんでしょうか?消したらまずいですか? デバッグできなくなる とか?
635 :
デフォルトの名無しさん :04/04/02 11:50
>>634 >定義されている#ifdef_DEBUG
>の行って何の為にあるんでしょうか?消したらまずいですか?
そのソースを書いたヤツに聞け。
# ソースに書いてあるのは、何らかの意図を持って人が書いたもの。
# 真偽のほどは書いた人にしかわからない。
## 恐らく、デバッグ用とリリース用を分けるためのものだろうがな。
636 :
デフォルトの名無しさん :04/04/02 12:40
>>635 書いた人ってのが僕なんすよ
つかスケルトンで勝手にかかれちゃうみたいです
要はあってもなくてもOKっていうことですねえ
コメントにしても問題なくコンパイルとデバッグできてます
637 :
デフォルトの名無しさん :04/04/02 12:41
638 :
デフォルトの名無しさん :04/04/02 12:47
プリプロセッサとは?
もしもボックスのようなもの。
640 :
デフォルトの名無しさん :04/04/02 13:03
>>639 では そこにコードかけば
原因不明の解析不能メモリリークもいっぱつ解決ですね
どんなに便利なアイテムものび太が使えば大失敗。
642 :
デフォルトの名無しさん :04/04/02 15:26
俺はのび太君でおまいらはドラえもん 困ったときは便利な頭脳でたすけてくーれるー 不思議なネットでたすけてくーれるー あんあんあん とっても大好き 2ちゃんねらー
643 :
デフォルトの名無しさん :04/04/02 16:23
>>631 C/C++スレとしてすれ違いに成ってしまうが、スマン、漏れにも教えてくれ。
コード長固定ってなんですか?
unicodeって文字のバイトが平仮名で2バイト、漢字で3バイトになったり
可変長ってきいたんだけど
Unicodeにしろマルチバイト文字にしろ2byte長固定じゃないのか?
ちがいます
>>643 unicodeを内部表現として扱いたいときは、固定長で扱うと便利。
MSでは2バイトで扱うucs2というのが標準的。
4バイトのucs4というのもある。
外部に出力するために長さを圧縮したいときは、
utf-8というフォーマットに変換して可変長にすることが多い。
(日本語が主体だと逆に大きくなることもあるけど)
>>643 可変長だとワイドキャラクタにはなりえないので、
その場合は、マルチバイトとして扱うしかないです。
ワイドキャラクタは必ず固定長で、一文字の大きさは環境依存です。
VCでは2バイトです。
ワイドキャラクタで使うキャラクタセットは環境依存です。
VCでは、2バイトユニコードです。
648 :
デフォルトの名無しさん :04/04/02 18:28
#include <stdio.h> int main(void) { printf("\160,%c",128); return 0; } 8進法の160と10進法の128は同じですよね?しかしこの場合、違う値が表示されるのはなぜですか? ご指導お願いします。
>>648 >printf("\160,%c",128);
printf("%d, %d", 0160, 128);
のつもりか?
160 (8進) = 8^2 * 1 + 8^1 * 6 + 8^0 * 0 = 64 + 48 = 112
651 :
デフォルトの名無しさん :04/04/02 18:41
>>650 さんありがとうございます。112ですたね!!うっかりしてました。
>>649 なに言ってんのおまえ?氏ねよ。
652 :
デフォルトの名無しさん :04/04/02 18:51
これからプログラミングをしたいのですが、C#でやろうと思ってます。 オススメな参考書があったら教えてください。
確かに
>>649 の言ってることは頓珍漢だが
>>651 の態度は人間としてどうかと思う。
こういうのを見ると、2chなら何でもありだと思ってる馬鹿が増えたとづくづく感じるなあ。
#include <stdio.h> int main(void) { printf("\160,%c",128); return 0; } 8進法の160と10進法の128は同じですよね?しかしこの場合、違う値が表示されるのはなぜですか? ご指導お願いします。
>>651 128を"%c"で表示させるという発想が理解できなかったから
つい頓珍漢な事を言ってしまった.スマソ.
>>656 いいから氏ねよクズ
二度と書き込むな。
\ ∩─ー、 ==== \/ ● 、_ `ヽ ====== / \( ● ● |つ | X_入__ノ ミ そんなエサで俺様がクマ――!! 、 (_/ ノ /⌒l /\___ノ゙_/ / ===== 〈 __ノ ==== \ \_ \ \___) \ ====== (´⌒ \ ___ \__ (´⌒;;(´⌒;; \___)___)(´;;⌒ (´⌒;; ズザザザ (´⌒; (´⌒;;;
>>654 >printf("\160,%c",128);
printf("%d, %d", 0160, 128);
のつもりか?
660 :
デフォルトの名無しさん :04/04/03 00:03
質問です。 LSI C-86 試食版使用。windowsXP #include <stdio.h> #include <math.h> void main(void); void main(void) { double x,y; x = 1.44; y = sqrt(x); printf("%f",y); } これを実行しようとしてもundefine symbol sqrt_と出て実行できないのは 何がいけないんですか?
C初心者だけどメイン関数にプロトタイプ宣言いるの?
いらない。 分かりやすいように書いただけです。
663 :
デフォルトの名無しさん :04/04/03 00:07
>>661 いらない。
他から呼び出されないから。
なんか、ワロタw sqrt()って、あれ使わなきゃいけないんじゃなかった?
665 :
デフォルトの名無しさん :04/04/03 00:10
>>660 sqrtが入っているライブラリをリンクさせる。
>>665 リンクは自動的になると書いてあるのですが
#include <stdio.h> int main(void) { printf("\160,%c",128); return 0; } 8進法の160と10進法の128は同じですよね?しかしこの場合、違う値が表示されるのはなぜですか? ご指導お願いします。
>>666 もしかして_lcc.defに-intlib.libなんて書いてない?
>>666 じゃね、逆だ、-lmathlib.lib が抜け落ちているとか。
672 :
デフォルトの名無しさん :04/04/03 05:33
FreeBSDでtime()関数を使いたいんですが time_t *nowtime; time(nowtime); printf("time---%d\n", nowtime) って感じで書いたのですが 常にnowtimeは0になってます。 どうすれば今の時間を取得出来るのでしょうか?
673 :
デフォルトの名無しさん :04/04/03 05:36
printf()のところ*nowtime ね
>>672 time_t nowtime;
nowtime = time(NULL);
printf("time---%d\n", nowtime);
time()以前に、ポインタについて理解していないのが・・・
676 :
デフォルトの名無しさん :04/04/03 06:18
>>672 つーかよく落ちなかったな。
あと%dで表示するならnowtimeはintにキャストして渡せよ。
>>677 >スマソ
>
>>673 は俺です。
>書いてるコードではちゃんとやってますw
いや、君、ポインタをまったく理解してないw
>677 全然理解してないから xxx = time(NULL); ではなく time(xxx); という形式で取得できないんだよ。
単純ににtime()の返す仕様を理解してないだけじゃないの?
ポインタを返すかどうか知らなきゃポインタ理解してても
>>672 見たいな事するでしょ
ん? time()のプロトタイプってどんなんだっけ? 戻り値も、time(HOGE)のHOGEも同じだと俺は思ってたが・・・ どうやら違うようだな っていうか、
>>678 いや、ポインタに関してはあってるだろ
問題は、値の入る場所 だ
念のため
>>678 が勘違いしてるとアレなので説明しとくが
time()の()の中はポインタの値ではなく、ポインタが入るんだぞ?
>>672 の一行目が
time_t t, *nowtime = &t;
みたいになってたら、ちゃんとわかっていると言えるが
その場合「*nowtimeが常に0」とはならず、こんな質問をするわけがない。
timeのプロトタイプは time_t time(time_t *timer);
ポインタの値とポインタの区別がつきません!
>>672-673 を見る所
time()の()の中にアドレスを指定すれば時間を入れてくれると勘違いしたと思われ
で
time_t *nowtime;//ポインタ宣言して
time(nowtime); //ここでアドレスに時間入って
printf("time---%d\n", *nowtime); //アスタリスクつけて値を表示
って考えたんだろ
もし万が一
>>687 の通りなら、
理解していないのは「ポインタ」ではなく「呼び出し規約(値渡し)」だな。
もちろん、これもどんな入門書にも書いてある。
>>683 モチツケ
落ち着いて自分の文章見ると凄く面白い事書いてる事に気づくと思うぞ。
俺は俺だ くらいのノリだ
と書いてはみたものの、これも意外によくわかってない人もいる。 char *p;に対して p = malloc(...); p++; free(p); などとしてみたり、 delete p; でpがクリアされると思ったり、pという変数が無効になると思ってしまったり。
time_t *nowtime; time(nowtime); printf("time---%d\n", *nowtime); と time_t nowtime; time(&nowtime); printf("time---%d\n", nowtime); を同じだと思ってると見たw まぁ、俺が大昔勉強し始めた時に2番目にやった間違いなのだがな
>>691 折角だから1番目と3番目がなんだったのか白状し給え。
>>691 これが正解なんだが、こんなのは
>>672 を見れば一目で分かるはず。
えらくレベルの低い連中が集まってるな。
これも春のせいか?
とりあえずまとめてあげたほうがいいかな?
諸悪の根源はtime_t *nowtime;が何も指し示していないこと(正確には何を指しているのか不定)
つまりtime_tの実体をどこかで宣言しなければならないってこと。
もう一つ、Cの関数の引数の渡され方が分かっていないという考え方も出来る。
両方とも間違っているので、どちらがより分かっていないかでアドバイスの内容が変化する。
>>675 =679
関数の値渡しについての言及
>>678 おそらくポインタを宣言しただけでは実体は存在しないと言うことを言いたいのだと思われる
>>682 >>678 の発言を「関数の値渡し」という点からみてあっていると判断
実際は
>>678 といっていることは同じ(ポインタが指しているところが不定という言及)
>>684 実態が存在しないことについての言及
>>691 総まとめ
漏れの視点からだとここに挙げていないレスをしている人たちは
言葉の言い回しから微妙に理解できていない部分があると思われる
ああそうか、たまたまnowtimeにNULLが入っていたから大丈夫だったのか。
697 :
デフォルトの名無しさん :04/04/03 22:43
#include <stdio.h> int convert(void); int doll,pond; int main(void) { printf("換算する数値[ドル]を入力してください: "); scanf("%d", &doll); convert(); printf("%d ドルは, doll"); printf("%d ポンドです, pond"); return 0; } int convert(void) { pond = doll/2; return pond; } 1ポンド2ドルと仮定したときの為替換算プログラムを作りたいのですが、 うまく動作しません。 間違えの指摘よろしく。
>>697 >間違えの指摘よろしく。
基本も何も、全然勉強せずにソースを書こうとするのが大間違い。
変数、関数、引数、戻値
これらをきっちり勉強すること。
ソースを手直しすることは簡単なんだが、
手直しするのがものすごく虚しいのよ(w
>>697 printf("ドルは=%d",doll);
zyanaika?
学校の授業でLinuxのgccでC歴1年、
C++は林晴比古の本読んで文法が
判るようになったぐらい。
一昨日買ったVC.net2003で
ヘッダファイルをincludeしようとしたら、
どのファイルであろうと「ファイル内で
予期しないEOFが云々…」て怒られる。
なんで?
識者の方、解説きぼん。
>>698 勉強のためにソースを書いているんでつが・・・(´・ω・`)
おっしゃる通り、まだまだ勉強が足りてないでつが。
ちなみに独習C第一章の練習問題でつ。
>>699 指摘サンクス。解決しました。
>>699 stdafx.hを一番上にインクルードしてみ
>>697 どうでもいいけど
せめて、printf()の文字列リテラルには改行コード入れようぜ
\nな
>>703 printf("%d ドルは, doll");
printf("%d ポンドです, pond"); を
printf("%d ドルは, doll\n");
printf("%d ポンドです, pond");に汁!!ってこと?
エスケープ文字は数十ページ先で扱われているので、
697を書いた時点では当然知りませんでした。
っていうレベル。
>>704 ぉぃぉぃ・・・
それはおかしいだろw
,dollとか変数まで文字列リテラルの中に入れてどうすんのw
本を見ながら苦悩して悩みなさいよ…。
ってか、キチンと読んでないんでしょ。 文字列リテラルも分からんようだし。 意地悪言うつもりはないぞ。>697 うまく行かないと思ったら、問題点が分かるまで何度も読み返すんだ。 それが勉強だ。
× 間違えの指摘よろしく。 ○ 間違いの指摘よろしく。
>>699 何もincludeしなければビルドできるの?
>>705 printf("%d ドルは\n", doll);
printf("%d ポンドです", pond);
で桶?だよな…
一応、
>>697 は修正→コンパイル→動作確認しますた。
>>706 (・∀・)ノシ
…でも、頭の頭痛がしまつ。
>>707 今度からはそっちのスレも覗いてみまつ。dクス。
>>708 一応全てのサンプルコードを打ち直ししてコンパイルしてはいるんだけど。
まあ、同じ間違いを2度も繰り返したらそう思われても仕方ない罠。
プログラミングにおいては、ささいなミスも命取りになるし、
今後はさらに注意をはらいたいと思いまつ。
>>709 …どうも。
712 :
デフォルトの名無しさん :04/04/04 02:51
class a { double *p; int N; public: a(int i){ N=i; p = new double[N]}; }; とかコンストラクターでメモリーを当てた時deleteしなくてもプログラム 終了時メモリーは解放されますか?
>>712 うだうだ考えずにデストラクタでdeleteしておきなさい。
>>712 ついでにコピーコンストラクタも忘れずに定義しておけ。
>>712 激しく処理系依存の香りがするが、
WindowsではOKだと言うことは確実だ
だがクラスでそういうことするのは止めておけ
たとえプロセス中にインスタンスが一つしかなかったとしてもだ
おまえら意地悪だな。 誰かつっこんでやれよ。 dollars, pounds
>716 別にどーでもいいだろ、名前なんて(w
>>716 それに類する間違いを仕事で見つけたから指摘したことがあるのだが、
余計なお世話だと罵倒されて依頼鼻で笑って放置することにしてるんだよ。
鼻で笑って放置? 俺ならあえて何度でも繰り返し言うな 「あぁなるほど、この人形(?)を半分にすれば、池(?)になる、というわけでつね。」 「で、この人形(?)や池(?)が表示されないのはなぜか、と?」
残念ながら漏れのところには リファクタリングツールがない。 あれば 変な変数名も変えやすくなるんだが、面倒くさすぎ
soudatta. で、eclipseのCDTって使い物になるの? ぐぐってみたら JDTではリファクタリングできるけど それ以外じゃ無理 みたいな情報があったんだけど
つか、妙な変数名つけられたコードのデバッグが廻ってきたら困らない?
>723 別に。木になるならなおすだけ
m_と付くグローバル変数が廻って来た事がこの前あった どういうつもりで書いたのか理解に苦しむ
>>725 どうせ、元々メンバ変数だったのを何らかの事情でグローバルへ持ってきた。
んで、名前直すのが面倒だったからそのままにした
ってとこだろ
クラス内ではグローバルだが?
いや、だからもう一つ外側をクラスでつつめば...
sounddataのtypo?とか突っ込みそうなった
綴りの間違った関数を呼び出すたびにため息がでる。 つい正しい綴りで書いてしまって、コンパイルエラーが出るたびに、また溜め息。 探すは serch じゃないぞ。ぼけ。 のろわれろ>creat()って名づけたやつ。
つねにこぴぺ、で無問題
>>731 識別子なんか作った奴が適当に決めた短縮名もいっぱいあるから、いちいち綴りがどうとか気にしてもしょうがないと思う。
>>732 の方法で充分だろ。
「日次処理」が「diary_process」と書いてあった時にはちょっと悶絶した。
735 :
デフォルトの名無しさん :04/04/05 01:36
通りすがりだけど
>>691 って一緒じゃなかったんだ・・・
え〜と、出来れば解説お願いします。
アドレス指定するのって同じに見えるんですが・・・
>>735 ポインタ変数を宣言したら、必ず実体を作らなければならない。
C++だったら
time_t *nowtime;
nowtime=new time_t;
こんな感じで・・・
Cだったら、malloc()とかだな。 char型のポインタ型だったら、宣言した時に文字列リテラルを代入して初期化するってのもアリだ。 ちなみに、char str[5]; は char *(str+5); と同等だ。
あと、 宣言の時と関数内での[]は全く別物なので 間違いがないように
740 :
デフォルトの名無しさん :04/04/05 02:14
>>737 char str[6];として、str[5];と*(str+5);は同じ。
と書け。
741 :
デフォルトの名無しさん :04/04/05 03:52
質問です。 newで確保した領域をdeleteすると、そのものがなくなってしまうのでしょうか? deleteした後、同じ変数をnewしたりしたいのですが・・・ というのも、 test(プロセス名) in free(): warning: chunk is already free とFreeBSDが画面に表示するんで・・・
環境依存だと思われ。
>>742 え〜と、FreeBSDの場合
その一度newした変数を初期化したい場合はどうすれば良いのでしょうか?
今までは一旦deleteしてからnewしてたんですが・・・
747 :
デフォルトの名無しさん :04/04/05 04:59
SYSTEM_SET::SYSTEM_SET() { pchannel_db = new CHANNEL_DB; _pchannel_db = new CHANNEL_DB; } SYSTEM_SET::~SYSTEM_SET() { delete pchannel_db; delete _pchannel_db; } こんな感じで別にnewしたポインタ変数の指すアドレスが何故か一緒になります。 どうすれば良いのでしょうか?
>>747 ありえない。何か勘違いしているか、別のところに問題があるか。
自己解決しました。 別の場所で、原因はSTLのイテレーターの使用ミスでした。 どうもです。
750 :
デフォルトの名無しさん :04/04/05 06:05
質問です。 イテレーターは、insert()すると、どこも指さなくなるのでしょうか? 再びbegin()で指定しないと、Busエラーになりました。
>>750 Iteratorの賞味期限を過ぎてるな。
>>751 普通にラベル貼り替えやってますが何か?
>>750 何も入ってないリストでbegin()の位置にinsert()して、イテレーターが1つ後ろにずれ込んだと思われる。
何も入ってないコンテナのbegin()って0返さなかったっけ?
返すのはend()
Iteratorに0という値は定義されていないよ。
質問です。 STLのlistなんですが begin()の位置にinsert()すると、今までその位置にあったデータは自動的に後ろ側に下がってくれますか?
>>757 リスト構造において「後ろに下がる」という表現が妥当かどうかはなはだ疑問だが、
答はイエスと言って差し支えなかろう。
何でこんな持って回った表現になるのか疑問に思ったら、リスト構造がどういうものか
勉強してくれ。
STLの基本的なイディオムがまだ飲み込めてないみたいだね。
そういう時は億劫がらず本を読んで基本をきっちり押さえておいた方がいいよ。
759 :
デフォルトの名無しさん :04/04/06 05:13
>>758 THXです。
なるほど、もう少し勉強してみます。
あと、分からないのですが、erase()すると、そこに入れてある変数を
deleteはしなくて良いのでしょうか?
newで作ったものなんですが・・・
>>759 リストに入っているのはポインタかい?
それなら「ポインタが破棄されてもそれが指すインスタンスは破棄されない」。
インスタンスを破棄するなら当然deleteすべし。
vectorが真にその力を発揮するのは、 C言語の関数として提供された様々なAPIを使う時であるといえる。 また、ポインタのvectorをソートする場合は、C標準のqsort()が威力を発揮する。 というより、algorithmのsort()が使い物にならんし、 その他のアルゴリズムもポインタコンテナでは無力なんだよなぁ。 そんなわけでインスタンスを確保するコンテナ(非vectorでも可)と、 ポインタコンテナ(vector)の2つを併用するのが最強ではないかと思う。
> また、ポインタのvectorをソートする場合は、C標準のqsort()が威力を発揮する。 > というより、algorithmのsort()が使い物にならんし、 > その他のアルゴリズムもポインタコンテナでは無力なんだよなぁ。 なんで? vectorの中身がポインタでも、sortもその他のアルゴリズムも問題なく使えるでしょ?
じぇねりっくぷろぐらみんぐがわかってないとおもわれ。
>>761 はファンクタを知らないに32std::binary_functor。
boost:shared_ptr を使ったほうがいいと思うよポインタのコンテナ作るなら
>>761 は結局何がしたかったの?俺様用メモとか言っちゃって。痛々しいな。
770 :
デフォルトの名無しさん :04/04/06 12:34
どなたかVIDEを使ってる方いらっしゃいませんか?
VIDE
http://www.objectcentral.com/vide.htm VIDEでSDIアプリを作ろうと思ったんですが、
Canvasは1つしか表示できないのでしょうか?
少なくともTextCanvasとTextEditorの両方を表示したいの
ですが。
フリーのツールをインストールしたんですが、例が少なくて
かえってむずかしい。。。
773 :
デフォルトの名無しさん :04/04/06 19:06
int* ptr=new int [3]; このようにint型ポインタを宣言したときに 変数ptrから3という個数を得るにはどうしたらいいでしょうか? つまりvectorにおけるsize関数に相当するものです。
774 :
デフォルトの名無しさん :04/04/06 19:08
ICU2.8をCygwin(MinGW XPHOME)でコンパイルしようとしています。 ### $ ./runConfigureICU CygWin --enable-threads=yes ### でConfigureした後にmakeするわけですが、 二日間、ずっとビルドできずに悩んでいます。 ########## $ make rm -rf config/icu-config /usr/bin/install -c -m 644 ./config/icu-config-top config/icu-config process_begin: CreateProcess((null), /usr/bin/install -c -m 644 ./config/icu-config-top config/icu-config, ...) failed. make (e=3): 指定されたパスが見つかりません。 c:\MinGW\bin\mingw32-make.exe: *** [config/icu-config] Error 3 ### MSYSでのビルドが無理そうなので(ビルド中にUnreferenced Errorの嵐) Cygwinもインストールしたのですが、 CreateProcessがうまくいってないのはわかりそうなものの どう対策していいものかわかりません。ネットでいろいろ調べる限り CygWinでのコンパイルは特に問題なさそうな気がしているため 何か解決策はあると思うのですが、いかんせん自分の知恵が限界です。 どなたかヘルプお願いします。
>>773 int (*p)[3]=reinterpret_cast<int (*)[3]>(new int[3]);
sizeof(p)はsizeof(int)*3なので、sizeof(p)/sizeof(int)で3が求められる
こんなのじゃだめっすか?複雑っすね…
776 :
デフォルトの名無しさん :04/04/06 20:26
777 :
デフォルトの名無しさん :04/04/06 20:34
int main() { char moji[10]; moji[0] = "0"; return 0; } C言語初心者です。 これをビルドすると 「error C2440: '=' : 'char [2]' から 'char' に変換できません。」 とerrorが出るのですがどこを直せば分かりません。 環境はVisualStudio.NETのVC++のWin32アプリケーションです。 どこが悪いのか教えてもらえると助かります。
778 :
デフォルトの名無しさん :04/04/06 20:37
0の周りのダブルクォーとをはずせ。
"0"は'0'と'\0'(いわゆるヌル文字)を要素とする配列なので、 '0'とすれば解決するでしょう。 "〜"とすると末尾に暗黙的に'\0'が付きます。
charの場合はシングルクォートでしたね。 ありがとうございました。
もしかしたらシングルクォートかもしれない
782 :
デフォルトの名無しさん :04/04/06 20:49
linuxのCでSJIS日本語文字列を全角->半角するに適したライブラリって ありますでしょうか。
>>782 たくさんありますが、どれを使ってもセキュリティーホールになるのでお勧めできません。
自前で作ったほうがまだましと思われます。
c++でgotoxy()のような動作をする関数はありますか?
785 :
デフォルトの名無しさん :04/04/07 04:38
質問です。 Win32APIだけを使って、iniファイルの読み書きは出来ないでしょうか?
>>785 GetPrivateProfileうんちゃらとか、WritePrivateProfileうんちゃら。
788 :
デフォルトの名無しさん :04/04/07 12:05
整数の配列の中のあるデータを文字列に変換して 別の文字列の尻に合体させたいのですが、 どうも上手くいかないので助けてください。 Bufにはなにか適当な文字列が入ってるものとしてみてください。 おねがします。 char Buf[1024],d[10],str[10]; int data[10]={0,1,0,0,1,2,3,0,1,0}; str=sprintf(d,"%d",data[4]);//とりあえず適当に5番目 strcat(Buf,str);
>>788 コンパイル時に警告出ないか?
sprintf()の戻り値が何かちゃんと調べれ。
>>788 整数の配列を文字列に変換するというのが、具体的にどういった操作なのか判らないので答えようがない。
コードを見る限り、問題を引き起こしているのはsprintfの戻り値を配列に代入しようとしているところだろう。
配列型の変数には代入演算子で直接代入することは出来ない。sprintfの結果は第一引数(この場合はd)に
書き込まれるので、Bufの後ろにdを繋げてやればいい。
>>788 char buf1[256] = "hoge", buf2[256];
int data[10]={0,1,0,0,1,2,3,0,1,0};
sprintf( buf2, "%s%d", buf1, data[4]);
>>789-792 あ、、なんか変なことしてたみたいです。
おかげさまで上手くいきました。
申し訳ないです。。。orz
ちょっと
>>791 の表現が適切でないと思われるので791では無いですが勝手に修正しますよ
コードを見る限り、問題を引き起こしているのはsprintfの戻り値を
配列の先頭要素へのポインタに代入しようとしているところだろう。
配列の先頭要素へのポインタは左辺値ではないので代入演算子で代入することは出来ない。
仮に左辺値でなかったとしてもstrの型はchar *であり、sprintf関数の戻り値はint型だ。
sprintf関数はその文字列に変換した処理結果を一引数(この場合はd)が指す領域に
書き込むので、Bufの後ろにdを繋げてやればいい。
>>791 よすまんな、勝手にフォローさせてもらった
「配列の先頭要素へのポインタ」という表現は完全に誤り
>>791 の方が正解に近い
>>795 >>794 じゃありませんけど質問です。
>「配列の先頭要素へのポインタ」という表現は完全に誤り
ということは、正しくはどう表現すればよいのでしょうか。
春満開かよ
すまん、おいらの理解が間違っていたよ。
「ポインタ」と言えば、「ポインタ変数」の意味かと思ったが
「アドレス値」という意味でも使われるようだ。
配列名は、「配列の先頭要素へのポインタ」であり、
>>794 の表現が正しい。
配列名は、「配列の先頭要素へのポインタ定数」とかね。。。
「ポインタ定数のように扱える配列全体を表す名前」 の方がよくないか?
配列全体として扱われるのはsizeof()の時だけだし、全体は言いすぎかと。
803 :
デフォルトの名無しさん :04/04/07 19:54
プリコンパイル済みヘッダーの検索中に予期しないEOFを検出しました っていうコンパイルエラーで躓いてるのですが これはそうやったらなおるでしょうか 拡張子が CPPではなくCのファイルのみこの事象が発生してます
自己かいケツ 要は追加したファイルに対して プリコンパイラを使用するなと
>>800-802 あくまで配列型は配列型であって、場合によってはポインタに変換される、
って考えるほうが、わかりやすくないか?
名前そのものとは限らないから、「配列名」という表現も不自然な気がする。
806 :
デフォルトの名無しさん :04/04/07 20:37
WindowsのBorlandC++ですが DOSのコンソール画面でBASICのLOCATEのような、 カーソルを移動させる方法ってあるのでしょうか? また、文字に色を付ける方法はあるのでしょうか? よろしくお願いします。
「配列の先頭要素へのポインタ定数」だと ┌──┐. ┌──┬──┬──┬──┬──┐ │ ・───→│ │ │ │ │ │ └──┘. └──┴──┴──┴──┴──┘ な感じがして、違和感を感じる。
>>806 DOS エスケープシーケンス
でぐぐれ。ただしWin9x系しか使えないそうだ。
>>808 まじっすか。書き込む前にぐぐって、どうもうまくいかないんで
書いたんですけど・・・
Win9x系しか使えないとは・・・。こりゃこまった。
皆様こんにちは。C/C++を始めてまだ2日目の素人です。 素人故、つまらない所で躓いています。どうか助けてください。 【 OS 】 WindowsXP HomeEdition SP1 【 コンパイラ 】 Borland C++ Compiler 5.5 【 エディタ 】 BCC Developer 【 内容 】 WinMain()内にてメインウィンドウのハンドルはhwnd、エディットはEdithWndに格納してあります。 エディットの文字数制限を100にしようと思い、SendMessageを投げつけました。 コンパイルも通り、期待した通りに表示されたのですが、 エディットの入力可能な文字数はいくらやってもエディットの右端までなのです。(全角で約17文字) どこか間違えているのでしょうか。 EdithWnd=CreateWindow( "EDIT", "", WS_CHILDWINDOW | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 10, 10, 300, 24, hwnd, (HMENU)NULL, hInstance, 0); SendMessage(EdithWnd,EM_SETLIMITTEXT,100,0); v=SendMessage(EdithWnd,EM_GETLIMITTEXT,0,0);// vは int v; と宣言してあります if(v==100){MessageBox(NULL,"MAMKO","TYMPO",MB_OK);} // ここ以降にShowWindowやメッセージループを記述しています。 // ちなみに、メッセージループ内はWM_DESTROYのチェックをさせているだけです。
>いや、まさしくそれだろう これって笑うところ?
>811 エディットコントロールをスクロール可にしないと ウィンドウサイズ分しか入力できない。 WS_CHILDWINDOW | WS_VISIBLE | WS_BORDER | WS_TABSTOP に | ES_AUTOHSCROLL を追加しる。
>>814 早速のご回答、ありがとうございます。
情報が小出しにならないように自分なりに気を付けていたつもりだったんですが
>>814 さんに言われて気が付いた事がありました。
エディットなのですが、「複数行」ではなく「1行エディット」のつもりで書いていました。
ただ「エディット」ではなくて「1行エディット」みたいに書けばよかったですね。
折角ご回答下さったのに申し訳ありませんでした。
>>812 は
char* p = "abcdefg";
と
char a[] = "abcdefg";
が同じだと思っているんじゃなかろか?
>>816 おいおいおいおいおいおい、そんな違いは知っててあたりまえ
で、その後pとaはすべての文脈において混同されるのよ
void foo(char *a);と宣言されていたとして、
foo(a);とすれば、
コンパイラは配列の先頭要素のポインタの定数をfoo関数の引数とするわけ
つまり、暗黙のうちに無名のchar *const型の変数が生成され、それが引数として渡されるわけ
結局、pの型はchar *型だし、aの型はchar[]なのだが、
以降、単独でaと書かれるとそれはchar *constなわけ(sizeofが例外と書いたほうが分かりやすい?)
(正確に言えばc++の場合pの型はconst char*なのだが、まあこれはこの話題には関係無しか)
通りすがりだけど
>>816 って違うの?
誰か説明お願いします。
>>820 THX!
[]つけると、その場所から任意の数の分だけ領域を確保し
*だと、どこかわからない領域を指すアドレスを格納するって事ですね。
春の所為かな、懇々と説明しておいて自分の底の浅さを晒す>818みたいなのが沸くのは。
>>818 >コンパイラは配列の先頭要素のポインタの定数をfoo関数の引数とするわけ
>つまり、暗黙のうちに無名のchar *const型の変数が生成され、それが引数として渡されるわけ
この辺からポインタを理解してないということが感じられる。
>>823 ちょっと言い換える。
ポインタとアドレスを混同していると感じられる。
>>823 すまんが教えてくれ、どこが違うのかさっぱり分からん
char str[10]; と宣言されているとき、
式の中では、pは「先頭要素へのポインタ」に読み換えられる。
つまり、pは&p[0]に置き換えられる。&p[0]の型はchar *constだよな?
ちなみに例外は、sizeof演算子のオペランド、文字列リテラルの初期化時、
& 演算子のオペランドの式に出てきたときだ。
この説明が間違っているというやつらは
文字列リテラルの初期化の例外を挙げているが、
それこそ理解していない証拠だろう。
俺の理解が間違っているのならいいんだけど、(むしろスキルを伸ばす絶好の機会だ)
間違っていると言うのなら論拠を出して欲しいものだ。
ISO/IEC 9899:1999からその論拠となる部分を探そうとしたが、
すまんが時間が無くて探せなかった。また今度時間があるときにな。
先に訂正「pは左辺値ではない」は「pは変更可能な左辺値ではない」の間違い 左辺値=変更可能なオブジェクトだと思っていたのが間違いだった 論拠を見つけたのでここに記載する ISO/IEC 9899:1999 6.3.2.1の3より転載 Except when it is the operand of the sizeof operator or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array object and is not an lvalue. If the array object has register storage class, the behavior is undefined.
× char str[10]; と宣言されているとき、 ○ char p[10]; と宣言されているとき、 だよね?
>>825 もう判っているかもしれないが、おまいさんはconstと右辺値を混同していると思われる。
&p[0]の型はchar *constではなくて、char *だ。
このときchar *const(あるいはchar *)型の変数が生成されるわけではなく、
単にchar *型の値(右辺値)が生成されるだけだ。
&&p[0]がエラーになることからもこれが判るだろう。
>>824 Cではアドレスのことを「ポインタ型の値」とも言うと思うが。
>>829 そういうことですか、分かりました。
ところで、値のうち、左辺値ではないものはすべて右辺値と考えてよいのでしょうか?
左辺値は「Locator value」つまり「オブジェクトを指し示す値」と解釈したのですが、
右辺値は「value of an expression」、つまり「式の値」なわけですよね?
変更可能な左辺値は左辺値のうち配列型でないもの、不完全型でないもの、
const修飾子のないもの、構造体か共用体の場合はそのメンバにもconst修飾子無いもの。
つまり、char p[10];が例外によって置き換えられなかったら変更不可能な左辺値であって、
置き換えられた場合は右辺値になる。という解釈でよいですか?
sizeof(p); // pは変更不可能な左辺値、sizeof(p)は右辺値
strlen(p); // pは右辺値、ついでにstrlen(p)も右辺値
アセンブラ出力を見ると 同じシンタックスであっても、配列とポインタでは意味が全く違うのがよくわかる。 ローカル変数だとわかりにくい場合があるので グローバルに確保した配列要素とポインタ変数経由での出力を比較してみるといい。 char s1[] = "ABCDE"; char *s2 = "ABCDE"; char f1(int n) { return s1[n]; } char f2(int n) { return s2[n]; }
C言語とメモ帳とコンパイラで、たとえばwindowsのメモ帳のようなアプリケーションを作るには、 どのような本を読めばいいですか?
>>832 あまりにも基礎的な質問すんな。以下に、模範ソースを示す。
これ以外は一切ありえない。謹んで参考にするように。
#include <stdlib.h>
void main()
{
system("notepad.exe");
}
>>830 >>829 じゃないけど。
>ところで、値のうち、左辺値ではないものはすべて右辺値と考えてよいのでしょうか?
基本的にはそれで良いと思います。
ただ、規格を厳密に解釈しようとすると微妙になってくるかも。
そもそも、C の規格上では右辺値は注釈(と索引)にしかでてきませんが、
「式の値」として記述されると書いてある一方で、左辺値は「式」であると
書いてあります。
従って、全ての「値」は右辺値であり、(右辺)値を生み出す式の中に左辺値となる
ものがある(また、6.3.2.1-2 より特定の文脈以外では(右辺)値に変換される)、
という解釈が可能です。
もっとも、6.5.2.3-3,4 には
>The value is that of the named members (...), and is an lvalue
と、値は左辺値である、みたいな表現があるんでなお混乱を呼びますが。
とりあえず、C の範囲内ではオブジェクトを参照しているか否かで左辺値と
右辺値を区別可能でしょう。
ref.
ttp://www.embedded.com/story/OEG20010518S0071 なお、C++ では右辺値も規格で定義されており、式は左辺値か右辺値のいずれかだ
となっています。
ところで、ISO/IEC 9899:1999 の変更点のところに
>conversion of array to pointer not limited to lvalues
こんなんがあるんで、旧規格を持ってる人は調べてくれると嬉しいっす。
>>836 よ、も前のやっている事は「起動する」だ。
>>832 の要求は「作る」だ。
...ちなみにもれのマシンでnotopad.exeを実行するとEmEditor(free)が起動するのはナイショだ。
>notopad.exeを実行するとEmEditor(free)が起動する ^^^^^^^^^^^^^
notopad.exeにリネームしてるんだろ
>>839 能登パッドってフリーのソフトでも使ってるとか?
fsutil hardlink create notepad.exe emeditor なんてな。
>>836 しかし、いつの時代にも例外というものがある。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char buf[256];
sprintf(buf, "copy C:\\windows\\notepad.exe %s.exe", argv[1]);
system(buf);
return 0;
}
>>843 君の実装の方が、仕様を忠実に満たしており、機能面で優れている。
私の負けである事を率直に認めたい。
さて、↓では
>>843 のソフトウェアのセキュリティーホールをつく極秘のコマンドが公開されます
みんな、極秘の超ウルテクだぞう!メモの容易を忘れずにネ!
>843のプログラムの引き数に、c:\windows\explorer.exeを指定すると面白そうだ。
>>843 は、バッファオーバフローによるエクスプロイトの問題が発生しうるが、
それでも
>>836 の実装より機能が洗練されている。
私の完全な負けだ・・・。_| ̄|○
c:\winnt\だったらどうする?
%WINDIR%\explorer
普通パス通ってるだろ。
いつのまにネタスレになったんだ。
この流れは、
>>832 の素朴な質問が発端か。
いい加減にしろよ、お前らw
俺のせいですみません。
ごめんですんだら警察はイラン。 ...仕様書も議事録もイラン。
ごめんですんだ警察はイラク。 ...仕様書よ議事録よイラク。
あのー、コンパイルしたいのですがコマンドプロンプトの使い方がわかりません。 探したのですがいい説明サイトが見つかりません。 どこか知りませんか。ファイルのある場所に移動すらできません。 Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. C:\Documents and Settings\3> _| ̄|○ cドライブのcというフォルダのtest.cに行きたいです。
857 :
デフォルトの名無しさん :04/04/14 06:08
ダイアログBOXを作成し リストビューコントロールを貼り付けて、レポートに設定した後 LVITEM lvi; int iItem; ZeroMemory(&lvi, sizeof(lvi)); lvi.mask = LVIF_TEXT; lvi.iItem = 0; lvi.iSubItem = 0; lvi.pszText = "テキスト"; iItem = SendMessage(hDlg, LVM_INSERTITEM, 0, (LPARAM) &lvi); lvi.mask = LVIF_TEXT; lvi.iItem = iItem; lvi.iSubItem = 1; lvi.pszText = "テキスト2"; SendMessage(hDlg, LVM_SETITEM, 0, (LPARAM) &lvi); をcase WM_INITDIALOG:に書いたのですが 追加された文字が表示されません。 何故でしょうか?
>>855 コマンドプロンプトの使い方で、ググッたら一番上にそれなり分かりやすいサイトきたが?
おまいは、本当に探したのかと子一時間・・・
つーかどうやって検索したんだ?
まぁ、窓の手とか使うと、コマンドプロンプトが簡単に使えるようになって便利だぞ。
>>857 BOOL ListView_RedrawItems( HWND hwnd, int iFirst, int iLast);
つか、単にLVM_REDRAWITEMS飛ばすマクロだが・・・
てーか、これでリドロウかけても表示されないんなら、他のとこまちがってるんじゃね?
まぁ、大抵はリドロウしなくても表示されるんだが・・・。
WP_PAINTでBeginPaint,EndPaint書いてみるとか・・・。
>>857 LVS_NOCOLUMNHEADERかListView_InsertColumnってとこかな。
>>855 cd c:\c [enter]
というかネタだよな!?
ネタじゃないです。普通、コマンドプロンプトとか使うんですかねー。 おいらはコマンドプロンプトが何のためにあるのか分からないんので勉強してきます。 C言語の手前でつまずいちゃったよ(´・ω・`)
俺はコマンドプロンプトよく使うよ。 バッチでだけど。
VS買えば見ないで済むよ 貧乏人の味方、コマンドプロンプト
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\shell\cmd\command] @="cmd.exe /k \"cd %L\"" [HKEY_CLASSES_ROOT\Drive\shell\cmd\command] @="cmd.exe /k \"cd %L\""
質問です。 WindowsXPでLSI-c86 3.30cをつかってます。 コンパイルしたときに"snytax errror near 'end of file'" と出るんですけどこれは何がいけないんですか? バイナリファイルを使ったプログラムを作ったら毎回でます。 本を見てプログラムをうつしたので間違ってはいないとおもいます。 教えてください。
>>867 「error」もまともに綴れないのか?
>>867 オレの予想
・ 本には「この1つ上の行までがプログラムのソースです」って意味で
「end of file」と書いてある
・
>>876 は「end of file」もソースの一部だと思ってる
s/876/867/ ね
>>870 コンパイラが'end of file'を一続きの言葉として見るはずはないだろ。
プログラムのソースです。 #include <stdio.h> int main(int argc,char *argv[]){ FILE *fp; char ch; if(argc != 2){ printf("パラメータの数が違います。\n"); return 1; } fp = fopen(argc[1],"r"); if(fp == NULL){ printf("ファイルをオープンできませんでした。\n"); return 1; } while((ch = fgetc(fp)) != EOF){ putchar(ch); } fclose(fp); return 0; } なにがいけないいんですかわかりますか?
>>867 プログラムの最後の1、2行を見直してみろ。
あるいは括弧や引用符の釣り合いを確認しろ。
それでも分からなければソースをさらせ。
>>867 >バイナリファイルを使ったプログラムを作ったら
どう使ったのだろう?
>>873 argc[1]をargv[1]にして、最後に改行を入れてみてもだめ?
なんで、argcでfopenやってるんだ? 引数の数で開いてどうすんだw
#include <stdio.h> #define NUM 5 int main(void){ FILE *fp; int test[NUM]; int i,j; fp = fopen("test1.bin","rb"); if(fp == NULL){ printf("ファイルをオープンできませんでした。\n"); return 1; } for(i=0;i<NUM;i++){ fread(&test[i],sizeof(int),1,fp); } for(j=0;j<NUM;j++){ printf("%d\n",test[j]); } fclose(fp); return 0; } これも同じエラーがでます。test1.binはちゃんとあります。
つーか開けません
>>860 リソースエディタでコントロールを配置する形でやってるんで
プロパティーのNoColumHeaderをTrueにしてみましたが
全く表示されません。
>>859 やっぱり表示されません・・・
test1.bin をフルパスにしてもだめなのかい?
883 :
デフォルトの名無しさん :04/04/14 18:15
>>882 だめでした。
わざと間違ったコードをかいてみたんですが、
はじめのエラー以外指摘されもしません。
>>867 とりあえず、出たエラーはそのままコピペしろ。
>
>>884 snytax error near 'end of file'
だけです。
>>885 コンパイルエラーかリンクエラーなどを示す文字列や行番号などもあるだろ?
あと、「snytax」じゃなくて「syntax」だ。
>>test3.c 1:syntax error near'end of file'
です。
test3.cは
>>878 のファイル名です。
1行目で構文エラーということは #include <stdio.h> int main(void) { return 0; } これだけでも出るってことだな。
>>888 >>878 はtest3.cをコピペしたもの?
改めて打ち直したものじゃ意味無いよ。
と念のため言ってみる。
ご迷惑かけました。謎がとけました。 アドバイスくれたかたどうもです。
迷惑かけたと思うなら、話のタネにどんな謎だったか残していってくれ
ファイルの文字コードがANSIからUnicodeに変わってたため 読み込めなかったみたいです。
894 :
デフォルトの名無しさん :04/04/14 22:48
ファイルポインタが既に fopen() や fclose() されているか否かを知る方法はありませんか? 異常終了時に念のため全てのファイルを閉じるつもりで fopen() 前のファイルを fclose() するとエラーが出ます。 これを回避する良い方法があればお教えください。
>>894 C++ならクラスでラップする。
Cなら構造体でラップする。
>>895 Cで考えてます。
つまり構造体のメンバに開いているか否かを表すフラグを設けるということですか?
お答えありがとうございました。
ファイル開いていないときは常にNULL入れるようにするだけじゃダメなのか?
>>897 宣言と同時にNULLを代入するんですよね。
それも考えたんですがひょっとしたら自分の知らない別の方法があるかと思って。
ちなみに閉じるためにこんな関数を用意しました。
void _fclose(FILE ** fp)
{
if (*fp) {
fclose(*fp);
*fp = NULL;
}
}
これを調子に乗って fopen() 前に使ったらエラーになって困ってたんです。
>>898 > これを調子に乗って fopen() 前に使ったらエラーになって困ってたんです。
そういうことする時は、普通
FILE *fp = NULL;
ってやると思うが...。
(fopen() の前って、ファイル開いてない時だし...。)
確かに…短慮でした。 お手数おかけしました。m(_ _)m
>>881 ListView_InsertColumnはやってみた?
レポートモードはカラム設定してやらんと出ないかもなー
というわけで書いておいたんだが。
>>893 >ファイルの文字コードがANSIから
どんな文字コードよ?
>>901 やってみました。
でもダメでした。
あの、疑問なんですが
その貼り付けたコントロールの名称を指定せずにどうやってそのコントロールにメッセージ送ってるのでしょうか?
ダイアログに複数リストコントロールを貼り付けたらどっちに行くかわかりませんし・・・
指定してるのはWindowハンドルだけですし・・・・
何か指定しないとダメなのでしょうか?
>>903 HWND コントロールのハンドル = ::GetDlgItem( ダイアログのハンドル, コントロールID );
>>904 THXです。
でもやっぱりダメでした。。。
何ででしょう・・・
>>905 悪いことは言わない、プログラマになるのは諦めたほうがいいぞ、きっと・・・。
趣味なら別なもんみつけとけ・・・。
最近は 「式は lvalue または rvalue を持つ」と考えるのが普通ですか? 昔は、「lvalue, rvalue の両方を持つ式とrvalueしか持たない式がある」という ふうに考えたものですが。 ++x は lvalue, rvalue の両方を持つ。 x++ は rvalue しか持たない。 lvalue を持つ式は = の左に現れることができる。 lvalue を持つ式は & の被演算子となることができる。
>>907 私は
>>837 なのですが、
>昔は、「lvalue, rvalue の両方を持つ式とrvalueしか持たない式がある」という
>ふうに考えたものですが。
本来、私もこっち派です。
なので、右辺値⊃左辺値みたいなことを書こうとしたのですが言い回しが…。
また C++ だと
|ISO/IEC 14882:2003 (1998 でも同じ)
|3.10 Lvalues and rvalues
|1 Every expression is either an lvalue or an rvalue.
と、なってましたのでトーンダウンしてしまいました。
「右辺値(左辺値)を持つ式」という表現はいい感じですね。
オブジェクト(代入先)を指す左辺値と、値自体を表す右辺値の二重性をうまく
表現できていると思います。
C++ の場合でも 4.1 Lvalue-to-rvalue conversion 等による左辺値→右辺値の
変換を含めて考えれば、「lvalue, rvalue の両方を持つ式とrvalueしか持たない式がある」
という言い方はできそうです。
>lvalue を持つ式は = の左に現れることができる。
>>826 も書いている通り正確には変更可能な左辺値ですね。
>>906 そういうならお前は原因わかるんだな?
同じように何故かわからないんだったら、お前も一緒だぞ?
ちなみに じゃあお前わかるのか? とか言われそうだから先に言っとくが
俺もわからん。
910 :
デフォルトの名無しさん :04/04/16 08:56
909 何がどうだめなのか、何も書いてないしな。
911 :
デフォルトの名無しさん :04/04/16 08:58
2ちゃん名物 逆ギレ 粘着
>>905 LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 既定の言語
(LPTSTR) &lpMsgBuf,
0,
NULL );
// lpMsgBuf 内のすべての挿入シーケンスを処理する。
// ...
// 文字列を表示する。
MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION);
// バッファを解放する。
LocalFree(lpMsgBuf);
エラーがでてるならこれで分かる。エラーないなら、猫でも分かるをコピペしてできるかどうか確かめるべし。
>>909 まぁ、どっかにソース(プロジェクト?)でもUPってもらわんかぎり、わかんねーよ。
913 :
デフォルトの名無しさん :04/04/16 09:45
Cのエディターって、例えばマイクロソフトのVisualC++とか、できたらフリーのエディターがいいんですが 自動メンバ表示みたいな機能ある? 宣言または参照されてる構造体のメンバをタグ名を入力したら選択できるように表示されるとか 参照するヘッダーで定義されている関数や、自分で定義した関数など 「関数名+(」を入力したら引数の型や数が表示されるような機能。 インテリセンスって奴ですけど、もしご存知でしたら教えてください。 お願いします。
>>913 >Cのエディターって、例えばマイクロソフトのVisualC++
「VisualC++」はエディタじゃない。
まずは「エディタとは何か?」から調べ直せ。
>>909 せっかくだから俺も粘着。
>
>>906 >そういうならお前は原因わかるんだな?
>同じように何故かわからないんだったら、お前も一緒だぞ?
著しく論理的思考能力に欠ける人みたいですね。
もしあなたが10代ならしゃべり場に出演されてみてはいかがでしょうか。
番組のレギュラーメンバーと同レベルだと思われますので。
>>905 LVM_INSERTCOLUMNで適当なColumn追加。
918 :
デフォルトの名無しさん :04/04/16 17:03
現在、linuxにてプログラムしているのですが、スタックオーバーフローになります。 そこで、質問ですが、たとえば、プログラム中に不要なヘッダファイルが includeされている場合、その定義をはずすと、メモリやスタックの容量が減るいうことは あるのでしょうか? ご存知の方がいらっしゃいましたら、ご教授ください。
>>918 ヘッダファイルの中でよほど邪悪なことをしていない限りそういうことはない。
>>918 ローカルででかい配列でも使ってるんじゃないの?
921 :
913です :04/04/16 18:02
つりじゃないけど
>>914 VisualC++とかについてるエディターって意味でした、すみませぬ。
どのスレに書いたらいいか分からなくて
宜しくお願いします
Vimでもインテリセンスができるプラグインとかあるが、あまりオススメできない。 インテリセンスが必要なら素直にVCで開発しとけ。
>>921 Dev-c++は構造体のメンバの補完ができる。
ここで聞いて良いのか分からないのですが・・・ 今日 Microsoft Visual C++.NET Standard Version2003アカデミック を買ってきて、Service Pack4をダウンロードしたのですが、 ここからどうすれば良いのか分かりません。 ファイルを開くと、 インストールされているWindowsのバージョンは、インストールしようとしている更新に一致しません。 と出ます。 誰か教えてください。
すいません、どうやら勘違いしてました.
そろそろ、次を立てたほうがいいのでは?
ここで聞いて良いのか分からないのですが・・・ 今日 Microsoft Visual Studio.NET 2003 をダウンロードしたのですが、 ここからどうすれば良いのか分かりません。 誰か教えて下さい。
釣りですか、そうですか
すいません、どうやら勘違いしてました.
>>922 ドモデス。
VC++がいいでしょうか。
インテリセンスって関数の引数なんかもパッと表示されますか?
自分はVBAの経験しかないです。
今cもはじめた所で、入門の本を二冊読みました。
ボーランドのフリーコンパイラを使っていますが、メモ帳で書いてますので
結構めんどくさいというか、ちょっとミスでコンパイラエラーになってしまって。
エディタさえフリーでいいの有ればなあと思ってたんですが・・・
ご返事ありがとうござります。
>>930 入門書を読んでるレベルなら、インテリセンス/入力補完機能はいらないから
普通にC/C++対応のエディタをvectorあたりで探して使えばいい。
開発環境を購入するのは入門レベルを脱してからで十分。
>結構めんどくさいというか、ちょっとミスでコンパイラエラーになってしまって。
ちときついこと言わせてもらうと、それならVBAだけやってたら?
入門書のサンプルコードぐらい直打で全部走らせてみる根性がなければ
どうせ身につかないよ。
>>931 >入門書を読んでるレベルなら、インテリセンス/入力補完機能はいらないから
いる/いらないを判断するのは
>>913 だと思うが。
>ちときついこと言わせてもらうと、それならVBAだけやってたら?
>入門書のサンプルコードぐらい直打で全部走らせてみる根性がなければ
>どうせ身につかないよ。
お前はそうかもしれないが、自信満々に断言することじゃないだろ。
俺は個人的には入門レベルでの無駄な努力は排するべきだと思う。
C++のoperator演算子の継承について教えてください。 スパークラスに書いたoperator演算子のオーバーライドは 継承クラスでは、明示的に定義しないと使用できないのでしょうか? 例〜 class A { public: int a; void operator = (int b){ a = b; } }; class B : public A { public: int dummy; }; [実行] B clsb; clsb = 5; //←この処理はclassAのoparetorが動かないの? *((A *)&clsb) = 5; //←こんな事すれば呼ばれますがさすがに・・
代入演算子とあと何かは継承されない。 でも、他の演算子は大体継承されるよ。
>>934 そうなんですか・・・
継承されるのとされないのがあるんですね orz
本当はoperator newやdeleteの継承なんですけど、
これも継承してないって事はダメっぽいんですね・・
レスありがとうっす〜
ああ・・どうしよう(鬱
>>935 をいをい、new/deleteを継承?
コンストラクタ/デストラクタでなく?
>>936 少し説明が足りませんでしたか・・・
でも、operator newって書いたから分かるかと思って・・
さっきの例を改造するなら、
例〜
class A
{
public:
void *p;
void *operator new (size_t size){ p = new(size);return p; }
};
class B : public A
{
public:
int dummy;
};
っていう意味です・・
>>937 operatorが抜けてた・・orz
void *operator new (size_t size){ p = ::operator new(size);return p; }
訂正しときます。
まぁ、例なんで、どうでもいいけど(;´∀`)
>>938 >void *p;
>void *operator new (size_t size){ p = new(size);return p; }
void* operator new(size_t size) { void* p = ::operator new(size); return p; }
じゃだめかな
>>937-938 >少し説明が足りませんでしたか・・・
説明が足りないっつーか用語の使い方を間違ってる
>でも、operator newって書いたから分かるかと思って・・
エスパーの存在を期待しない方がよい
>まぁ、例なんで、どうでもいいけど(;´∀`)
どうでもよくない。一番重要。
>>939 カンペキでつ!
むしろ、publicにvoid *pなんて書いたおいらは良くてワーニング
悪くてエラーっぽいんで、逝ってきまつ・・
>>940 申し訳ないorz
つう訳で、質問するときは最初から、”その”ソースを晒してくれると話が早いわけだ。
ほんとどうでもいい事かも知れないが、 coutとcinの語源ってなに? 1年Cを勉強してきたが、C++もおもしろそうだな・・。
c(onsole)in
>>944 あ、なるほど。
coutは(out)出力って事かw
サンクス!
946 :
デフォルトの名無しさん :04/04/16 23:51
>>931 >>932 まあ、おっしゃる通りなんだけど
マダはじめたばかりで、手動でコンパイルやデバッグ(デバッグといっても多くて50行くらいだし)することには
別に苦じゃないんだ。
ただうっかりミスや自動メンバ表示みたいな機能があったらいいのになぁと思って・・
ベクターでは探してみたんですけど、3つくらいしかなくて紹介だけではあんまりよく分からない。
で、誰かいいの知ってる人いたら教えてもらいたかっただけなんです。
自分がc使いこなせるかどうか分からないし、vc++買って無駄になったらもったいないし
フリーで試してみたかっただけです。
ごめんなさいです。
>>946 >ただうっかりミスや自動メンバ表示
「自動メンバ表示」はわかる。「ただうっかりミス」とはどんな機能なんだ?
>>946 >ベクターでは探してみたんですけど、3つくらいしかなくて
>紹介だけではあんまりよく分からない。
使ってみれば分かるんじゃない?
void func(int cnt) { for (int i = 0; i < cnt; ++i) { #ifdef BAR ClassB foo; #else ClassA foo; #endif foo.put(); //だとかなんだか、諸々の処理 } } 概ねこげな関数がある。 今はマクロでClassA/ClassBを使い分けてるが、 これをbool barを引き数として渡して動的に使い分けるようにしたい。 なんかいい手はないもんだろか。
>>950 ClassAとClassBの関係は?
っていうか、素直にオブジェクトを見直したら?
静的に解決する場合もマクロよりテンプレート使った方がいいと思うがそれはともかく。 classAとclassBの間に継承関係はある? あるのならもちろん仮想関数で解決できる。 今ない場合も共通のインターフェイスを継承するようにすれば解決できる。 これが一番言語的なサポートを受けられて簡単かな。 フリー関数でラップしてそのポインタを利用する。 より高度な枠組みとして簡単な deligate 風の仕組みを作る方法もあるが。
>>951 、
>>952 早速の回答THX。
元のソースがcで、ClassAは既存構造体と関数をクラスにまとめたもの。
で、ClassBはそれとI/Fが同じになるように実装した。
となると、>952の共通のI/Fを継承するって線かな。
>>950 class Base {
public:
virtual void put() = 0;
};
class A: public class Base {
void put();
};
class B: public class Base {
void put();
};
Base *p = bar ? new classB : new classA;
p->put();
delete p;
俺も
>>954 と全く同じソース書いてたんだが
条件演算子内の異なる new 式は
それぞれの記述部分で基底クラスのポインタにキャストしないと gcc-3.2 で警告が出た。
あとは本物のコードで put が例外投げることを気にするなら std::auto_ptr あたりでラップ、だな。
おおお、漏れが頭捻ってる間にすぐにも使えるサンプルキター♪
>>954 感謝♪
>>955 こちらにも感謝。
今回は元がcのコードなのでput()が例外投げるなんて事もないけど、
今後のためにstd::auto_ptrも調べてみるよ。
958 :
デフォルトの名無しさん :04/04/17 00:59
>>948 えーと、例えば行末のセミコロンの付け忘れとか、引数の型が違ったり
全角スペースみたいなのがあったり、
コマンドからコンパイルの命令してるから、エディタでフォーカスが外れるときに
チェックしてくれるとか、改行するときにおかしな所を知らせてくれるとか。
VBAにあるような感じのエディタ
>>958 >コマンドからコンパイルの命令してるから、エディタでフォーカスが外れるときに
>チェックしてくれるとか
意味不明
>>958 エディタのウィンドウが非アクティブになったとき
またはソース編集中に改行したとき、
・ セミコロンのつけ忘れ
・ 引数の型
・ 文字列リテラル以外の全角スペース
をチェックして警告してくれるエディタ
ってこと?
プログラミングもいいけどコミュニケーションの練習もしたほうがいいね。
961 :
デフォルトの名無しさん :04/04/17 02:38
このスレで聞くべき内容ではないのかもしれませんが 一応C++で書いているのでここで質問させてください。 質問 完成させたプログラムを他人に見せる・説明する・提出する場合に どのように体裁を整えるべきでしょうか。 状況としては ・面識の無い他人に説明する ・相手にする人数は数人か、多くとも10人未満 ・双方に取って金銭的な利益・不利益は一切生じない ・結果だけではなく(プログラミングの)過程に関しても説明する いい例かわかりませんが、例えば大学の卒業論文や修士論文などを 提出・発表する際には、論文の他にアブストラクト(要約書)を用意し、 また論文の中身については表紙、目次、はじめに、などを加えるのが 普通だと思います。 あるいはフリーソフトではHelpとread meファイルは大抵付いていると思います。 このようにプログラムのソース以外の部分についての常識といいますか 最低限これだけは付加しておくべき、という項目のようなものがありましたら 是非教えていただけないでしょうか。
マ板ネタかな
>>961 質問,ツッコミが入りそうなところをまとめておいたほうがいいと思う。
どんなプログラムかわからないから、不要、無関係なものもあるだろうけど。
・プログラムの目的、予想される結果、実際の結果
・結果としてデータとか出力するものなら、それの説明と考察
・実行時に与えるコマンドライン引数、もしくは実行中に与える入力例
何か数値を与えるなら想定してる範囲と、範囲外のときの処理
・プログラムのフローチャートみたいなもの
・利用,作成した 関数,変数,クラスなど の(おおまかな)説明
・実行,コンパイルできる環境 (OSとかコンパイラーとか)
・なぜその言語や、出力手段(グラフとかグラフィックとかいったプレゼンの方法)を
選択したのか
・(あっちゃいけないのかもしれないけど、)改善できそうな点
説明とかで↑の内容が抜けてたら、私は質問すると思う。
>>961 完成までに要した時間(期間)とか人数なんかも気になる。
>・結果だけではなく(プログラミングの)過程に関しても説明する
ってのに含まれるのかな
>・プログラムのフローチャートみたいなもの これ要らない。スレ違いの議論回避のため、理由は割愛。
966 :
デフォルトの名無しさん :04/04/17 11:30
マネージドC++での質問なのですが .NETフォームのWindowハンドルを取得するにはどうすれば良いのでしょうか? メッセージでのやり取りをしたいので・・・
>>962 言われてみれば確かに板違いの内容だったかもしれません。
以後気をつけたいと思います。どうもすみませんでした。
>>963-965 大変参考になりました。
フローチャートは用意する予定だったのですが、必ずしもそれが
良い行為であるとは限らないという感じでしょうか。
ただこれ以上はみなさんの迷惑になりそうなので、後は何とか
自分なりにまとめてみようと思います。
みなさんどうもありがとうございました。
新スレ作るの早過ぎないか? 埋めるぞ
Last-Modified: Sat, 14 Feb 2004 12:41:31 GMT 少なくとも2004年2月14日(土)12時41分31秒には既に存在していたらしいな
GMTか。日本時間午後9時?
>>976 JST の方が 9 時間早いんだからあってるんじゃないの?
Windowsプログラムを作成したいと考えています。 コンパイラはbcc5.5でOSはWinXPです。 'Winmain'が未解決というエラーを無くすには、どのようにすればよいのでしょうか。
>>981 WinMain関数が定義されていないので定義してやればいい。
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
) {
return 0;
}
ありがとうございます。 もう一つ質問してもいいですか? PSDKをインストールしたのですが、 これをbccで使うにはどうすればよいのでしょうか。
>>983 最新のAPIを使うのでなければ、BCC付属のモノを使った方が楽。
ヘッダファイルはともかく、インポートライブラリをcoff2omfとかで変換したり、
作成したりするのはかなりの手間。
>>981 コンパイラ bcc32 に -wc オプションをつけてコンパイルする
IDEを使っているなら、ターゲットを
「Windowsアプリケーション (-w)」
から
「コンソールアプリケーション (-wc)」
に変更する
>>983 なるほど、凄い量ですしね。
簡単にインポートできるようなソフトでもない限り、
bcc付属のやつを使ったほうがよさそうですね。
ありがとうございました。
すみません、間違いました。
986は
>>984 へのレスです。
>>985 なるほど、オプションを変えてみるのも手ですね。
やってみます。
偶数であって奇数でない物はナンですか?
すべての偶数
そろそろ、1000取り合戦の始まりか?
このまま地味にいくのも趣があっていいなぁ
ちゅるーん
ちゅるるーん
しゃーない、一人でちゅるんするもんね。
ちゅるりん
997 :
デフォルトの名無しさん :04/04/23 17:42
でろりん☆
埋めるの? 埋めないの?
1000まで少しだね
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。