【初心者歓迎】C/C++室 Ver.30【環境依存OK】
2 :
デフォルトの名無しさん :2006/08/21(月) 16:35:51
また双子スレか
おもしろいな、専用ブラウザで
>>3 のリンクをクリック連打してっと行ったり着たりできる
相互再帰か
なにこのすれ
まあ向こうは後で再利用すればよいだろう。
どっちがどっちだかわからなくなってきた
そっくりくりくりくりっくり
削除人が困るぞw
どっちが何なんだか分かんねーよ
質問しづらいな
C言語に興味を持つ ↓ 解説書購入 ↓ printfやifを一通り使えるようになるレベル ←いまココ オセロは何段階くらい先?
ミラーリング阻止
人により1段階〜無限段階
人により1段階〜無限段階
ミラーリング阻止 したところでどちらを削除してよいかは分かるまい
わろす 俺もミラーリング参加する!
遅いほう削除するに決まってるだろ。
25 :
23 :2006/08/21(月) 22:48:33
俺としては削除して欲しくない。 正常に運営しつつ、「双子スレ」の記録を狙ってみては。
26 :
デフォルトの名無しさん :2006/08/21(月) 22:50:00
Turboスレでやれ
こっちは重複スレ
あほか
ミラーリングするとか言っている奴は相当暇なんだな
同期を取りました。
誰も言わないから俺が言ってやる まさに マルチスレッド
馬鹿じゃねぇの?
ミラーリング厨が都合の悪いレスだけ別の文にしてるwwwwww
>>34 次はメール欄もちゃんとミラーリングしろよ
リビルド不能です。 廃棄をおながいします。
こっちのスレだけ加速させればいいだけ
38 :
デフォルトの名無しさん :2006/08/21(月) 23:40:04
久しぶりにアホなスレに嗤ったw この話題で30も行くとこうなるのか。
どっかの馬鹿のせいでこんな流れか
ミラーリング厨が泣きながら去っていきます
よし次はストライピングだ
>>41 ああ、俺がちょうど書いてやろうと思ったのに。
微妙に改行が少ない件
44 :
953 :2006/08/22(火) 01:13:54
前のスレではみなさんにお世話になりました。
>>18 私はC++を勉強して4ヶ月目で、授業では一応教科書一冊の範囲(ポインタまで)も終わったんですが
ぜんぜん駄目でした。
45 :
デフォルトの名無しさん :2006/08/22(火) 01:18:13
strcmp関数とかのソースコードを見たいのですが、どこらへんにソースファイルがあるのでしょうか・・? OSはfreebsd4.11です。 #一応findしてみたところ/usr/includeにstring.hはあったのですが、 肝心のコードが書いてあるファイルが見つかりませんでした・・・
C++の参考書ってどれがいいんですか? Cは一通りわかってます。
これは双子スレ?ミラーリングされてるの?
おまえら、遊ぶのはせめて一桁までにしておけよ
おまえらマルチポストするなよ
なめんな
何このスレ
55 :
デフォルトの名無しさん :2006/08/22(火) 13:55:55
ぱやぱやC
printf関数の書式%pの出力形式を自分で制御できませんか? 自分の環境(bc++5.5.1)では16進数で表示されるのですが、これを10進数で表示したいです。
unsigned intにキャストするとかsprintfで16進にしたあとstrtolで整数に戻すとか。
ぱやぱやC
だっぽん
ぷにぷにC
62 :
デフォルトの名無しさん :2006/08/22(火) 15:39:02
ゲームとかで聞くアルゴリズムって何ですか?
最初数個が浮動小数点で、 残りが10個以下ではあるけど何個かわからない整数を 1行ずつ構造体の配列に読み込みたいのですが、 どうしたらいいもんでしょうか? 4.543 3.12 45.32 6 3 4 3 6 3.1 7.4 3.1 4 1 84.32 2.33 1.22 9 4 3 1 こんな感じのテキストファイルを tyepdef struct{ double a1; double a2; double a3; int b[10]; } Hoge みたいな構造体に入れていきたいのですが。 固定のものならfscanfで1行読み込んでたのですが、 何個かわからないものの読み込み方がわからないです。
構造体に個数も持てば?
>>65 sscanfで変換した個数が戻るから、それを利用する。
レスありがとうございます。
>>66 すいません、その個数の数え方がわかりません。
>>67 sscanfについて調べてみます。
69 :
デフォルトの名無しさん :2006/08/23(水) 14:42:27
・SUN4/20 ・Solaris2.5X 上記環境で動いているCのプログラムを移植する事になったのですが、この環境 でのintのバイト数は幾つになるのでしょうか?
70 :
仕様書無しさん :2006/08/23(水) 14:55:08
>69 sizeof(int)/sizeof(char)
SUN4/20 てなんだっけ。Sparcなら4、680X0なら2だろ。うちにあるSunOS4マシンは4だが ディスプレイがないので怖くて電源あげられねえorz
72 :
69 :2006/08/23(水) 15:12:33
>>70 そのマシンは触らせてもらえないので、テストPG等作れません。
>>71 資料には
・サーバー:SUN4/20
・CPU:SuperSparc
とあります。
>Sparcなら4
4バイトに該当するのでしょうか?
現行のシステムを作ったのは別の会社で、問合せ窓口が無く、
ユーザー側にもそこまで分かる方がいないので困ってます。
まず4で間違いない。しかし sizeof int がそんな気になるのかね?typedef int INT とかして プロジェクト始めりゃ大した問題出ないんじゃね?そうでなくても移植してりゃすぐ気づくだろ。
74 :
69 :2006/08/23(水) 15:26:55
>>73 ありがとうございます。
sizeof(int)の指定でintの値をバイナリのまま可変長レコードでファイルに読み書き
していて、そのファイルの解析も兼ねてintのサイズが知りたかったのです。
>>74 そのファイルは 相互環境で port するの?
sparc は big-endian だぞ。
77 :
デフォルトの名無しさん :2006/08/23(水) 15:37:30
一度貼り付けた画像を一回クリアするために画面を塗りつぶすのを なんて言うんでしたっけ。
78 :
69 :2006/08/23(水) 15:39:10
>>75 そのファイルは作成後に別の会社の別システムに転送しているので
そのまま使います。
79 :
69 :2006/08/23(水) 15:41:05
>>76 >sparc は big-endian だぞ。
と言う事はバイトの格納順位が逆になっていると言う事ですか?
移植先のマシンが little-endian ならな。
>>77 (゚Д゚)ハァ? なんのコミュニティの話だ?とりあえずOSを言ってみろ。
スレ違いなヤカン…
>>78 エンディアンとか含めて、仕様の sizeof(int) 自体が問題アリっぽくないか?
84 :
77 :2006/08/23(水) 15:58:26
>82 うぃんどうずです。 ゲームで一度貼り付けた画像クリアするんですけども、 画面を何か適当な色で塗りつぶすことでクリアとするじゃないですか。 それをなんと言うのか忘れてしまって。
85 :
82 :2006/08/23(水) 16:06:08
すまんな、しらん。思いつくコトバは WM_ERASEBKGND, Validate くらいだな。 DirectXXXとかならやったことねえ。
86 :
69 :2006/08/23(水) 16:09:55
>>80 >移植先のマシンが little-endian ならな。
すいません、書き漏れましたがWindowsに移植します。
リコンパイル+α程度で行けそうだったのですが、大変そうになってしまいました。
+αの範疇だろ。ただ、「なんとなくやな感じ」に対して工数をゲットできないのがつらいんだよな。
>>69 問題のファイルを出す喰う別会社の別システム は SUN4/20 のまま
自社のシステムが Windows
ってことか…
微妙に嫌なポーティング作業だね
Linuxにすればぁ?
元のプログラムに潜在的なバグがあって大ハマリに1レジスタウィンドウ
strlenの戻り値を変数の初期化に使う方法はありますか?
int len = strlen(arg); これは初期化と言うんじゃないかね。 配列の要素数のことを言ってるなら_
すみません、条件をいくつか書き忘れてしまいました。 static属性のついたsize_t型の変数を初期化します。
C++ なら static size_t len = strlen(arg); は許されるよな? arg が先に定義されてないといけないけど。
++なら、か・・・ ありがとうございます、導入を検討してみます
C99ならローカルな可変長配列も使える。
97 :
デフォルトの名無しさん :2006/08/24(木) 23:35:22
誰か助けて! ifstream f("test.txt", ios_base::binary | ios_base::in); ...... unsigned short n; f >> n; // f.read((char*) &n, 2); こんなソースを書いて、 f >> n だとエラーになるのに、 コメントのように read 関数を使うと、ちゃんと読めるのです。 原因はなんでしょうか。よろしくお願いします。
>> はバイナリを読み込む演算子じゃない
>>98 すいません、そちらに行きます。
>>99 と思ったら、お答えいただきました。
誠にありがとうございます。m(_ _)m
101 :
デフォルトの名無しさん :2006/08/27(日) 08:18:30
可変個機能が使えるva_listがありますが、 それ+個数、型がチェック出来る物が、 C、C++、ウィンドウズのどれかでないでしょうか。
>>101 個数がチェックできるのなら可変じゃないような。
printf()系みたいにフォーマット指定があってそれと比較すると言うことか?
C++なら類似機能をクラスで作れるとは思うが、やりたいことをもっと具体的に。
103 :
101 :2006/08/27(日) 08:50:28
>>102 kahenko(10); → 10と出力
kahenko(5, "15", '8'); → 5 15 8と出力
例えばこんな事がしたいです。
va_arg(ap, ***)だと、型が分からないし、個数も分かりません。
>>103 vector<boost::any>でも使ってコンテナに入れて渡せ。可変長引数の
代用になる物を考えろ。
105 :
101 :2006/08/27(日) 08:59:41
ありがとうございます。やってみます。
>>103 各引数の情報をprintf()の様に渡してやる必要がある。
個数、型共にわかる情報をな。
向こうがなにやら変なことになってるけど これは最悪板行きコースかね?
108 :
デフォルトの名無しさん :2006/08/31(木) 15:00:13
win98でも動くようにと思いながら作ってて試してみたら正常に動かなかったので、環境依存の問題として質問させてください。 値が変になったクラスは、APIとかmfcとか使ってなく、純粋な演算系のクラスなんですが、 __int64の演算と、__int64の変数をBYTEにキャストして1バイトずつ処理しているところがあります。 1.win98では、__int64は使えないのでしょうか。 2.int変数や、使えるなら__int64変数に確保される領域は、win98も32bitxpも同じと思って間違いないでしょうか。 3.int内のBYTEコードが逆順に並んでいるとかはwin98(dos/v intel)でも同じと思って間違いないでしょうか。
1,OS依存ではなくコンパイラ依存 2.コンパイラによる 3.エンディアンはCPU依存 そしてここは重複スレだ
110 :
デフォルトの名無しさん :2006/08/31(木) 15:43:53
みなさんこんにちわ(o*。_。)o お尋ねしたい事があり書き込みさせて頂きます。 色々なサイトでIDやPassを自動配信するシステムがありますよね? そのシステム方法を教えて頂けないでしょうか。 探してみて無料配布しているところなど探してみたのですが 見当たりませんでした。配布されているものじゃなく作る物なのでしょうか? もし、作る物であるのならわかる方に教えて頂きたく思います。 どうぞ宜しくお願い致します(*- -)(*_ _)
112 :
デフォルトの名無しさん :2006/08/31(木) 16:06:06
111さん、ありがとうございました(*- -)(*_ _) 誘導スレに書き込めば良いのですね!
bool値を反転させるのって皆さんどうしてます? bool flag = false; ..... flag = flag != true; 以外にありますかね?
flag = !flag; じゃいかんの?
>>114 ...orz
ありがとうございました……
釣りじゃなかったのか・・・
すいません。 2を乗算するのってどうしてますか? i=i*2; 以外にありますか? つりではないです。
i+=i でもいいよ。
i <<= 1;
i*=2 だろ。
どうせ現代コンパイラの最適化の前ではどれも同じさ。 自分が書きやすいように書けばいい。
すいません。 10倍するのってどうしてますか? i=i*10; 以外にありますか? つりではないです。
i = i * (2 + 8); i = i * 2 + i * 8; i = (i << 1) + (i << 3);
124 :
117 :2006/09/13(水) 13:07:40
>>122 は?
i=i+i+i+i+i+i+i+i+i+i;
でいいと思ってんの?アフォ?
i が int だと勝手に思い込んでる香具師ら
126 :
122 :2006/09/13(水) 13:55:21
iはdoubleです
doubleで加算を繰り返すと桁落ちする
strstream s; s << i << '0' >> i; かなり C++ 忘れたな・・・。
129 :
122 :2006/09/13(水) 15:34:45
< '0' >ニョー
i = pow(10, log(i) + 1);
i = (int)(pow(10, log(i)/log(10) + 1) + .5);
133 :
デフォルトの名無しさん :2006/09/14(木) 14:00:28
ウィンドウ上でDISABLEになっているコントロールの色(GRAYTEXTではなく)はdefineされていますか? もし無いならば、どこから持ってくればいいのでしょうか?
135 :
133 :2006/09/14(木) 14:17:20
>>134 GetSysteColror()等で持って来れないかな?と。
136 :
デフォルトの名無しさん :2006/09/14(木) 14:18:12
すみません。超初心者です。 この度、VC6からVC2005に変えて勉強しています。 質問ですが、VC2005はCreateWindow()は使えないのでしょうか? また、文字列を引数とする関数全てに 「LPCWSTRに変換できません」 というエラーになってしまいます。(MessageBox()など) LPCWSTRでキャストすれば通るのですが、文字列指定する関数には 毎回LPCWSTRでキャストしないといけないのでしょうか? 低レベルな質問で申し訳ないですが、よろしくお願いします。
すみません。スレ違いでしたね。 くだすれVisual C++(超初心者用)その3 で質問してきます。 お騒がせしました。
138 :
デフォルトの名無しさん :2006/09/15(金) 23:09:26
重複スレが1000逝ったから、こちらをageておくか。
139 :
デフォルトの名無しさん :2006/09/16(土) 04:27:41
Windowsのコンソールのウィンドウハンドルを取得したいのですが、 どのAPIを使えばいいのでしょうか。
>>139 GetConsoleWindow()
ちなみに、まず必要ないと思うけど、9xからコンソールのウインドウハンドルを取得したいなら、
SetConsoleTitle()で、コンソールのタイトルバーをユニークな文字列にして、
FindWindow()で行けた。
LFU式のキャッシュを作る良い方法はないですか? 参照数カウント式だとオーバーフローのときどうしよう とか困ってしまってわんわんわわん。
すいません。初歩的なことですが、 unsigned int x = -1; printf("%d" , x); これで -1 と出力されるのは何故ですか?
143 :
デフォルトの名無しさん :2006/09/16(土) 15:13:08
"%u"
144 :
デフォルトの名無しさん :2006/09/16(土) 15:14:07
ああちなみに"%d"で-1と表示される保証はどこにもないからね。 機種依存です。内部表現によります。
そういえば、どこぞの携帯で%sとか%dってメール書くと落ちるっての聞いてためしたんだけど printf("%d"); ってのはぬるぽを表示しようとしてるってことかな?
146 :
デフォルトの名無しさん :2006/09/16(土) 16:10:16
∧_∧
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/ ←
>>145 (_フ彡
147 :
139 :2006/09/16(土) 16:27:55
>>148 とりあえず、-1は
1 << (sizeof(int) * 8 - 1)
だから、同じビット表現のままunsigned型変数に入ったんだろうな。
そうすると表示された数は、intが32bitだと仮定すると2147483648じゃないか?
>>149 > とりあえず、-1は
> 1 << (sizeof(int) * 8 - 1)
そんな環境もあるのか。世界は広いな。
151 :
149 :2006/09/17(日) 00:02:54
俺はバカです。 -1 は ~0 の否定です。 表示されたと思われる数は4294967295です。
>>151 > -1 は ~0 の否定です。
~0 の否定って、 0 じゃね?
>>151 お前はバカじゃなくてただの無能だ
もう書くなクズ
154 :
149 :2006/09/17(日) 00:07:11
自分の行動に動揺しすぎてる。
>>152 その通りだな。
誰か訂正してやってください。
吊ってくるわ。
軽々しく吊るとか言うな。 首吊って自殺した友人に謝れ。
156 :
デフォルトの名無しさん :2006/09/17(日) 00:13:05
2の補数取れよ。~してから+1。
フフフ
1 の 2 の補数であって 0 の 2 の補数なわけじゃないだろ。
159 :
デフォルトの名無しさん :2006/09/17(日) 00:40:39
0ってどっから出てきたんだ?流れ読めってか?
負の数を符号無し型に変換する場合、 その型で表せる最大の値に1加えた数から、 元の負の数を加えたものが結果の値となる。 つまり142の場合、xは(UINT_MAX + 1) + -1、 つまりUINT_MAXで初期化されたことになる。 符合無し型から符号有り型への変換の場合、 元の値が変換先の型では範囲外となる場合、 その結果は処理系定義。
161 :
初心者ボーイ :2006/09/17(日) 01:40:36
環境:visual studio.NET 2003 visual C++ directX 9.0 2006 August 質問:directXとdirectshowを使ってプログラムをつくりたいのですが、 現在webカメラで画像を取り込みながらdirectxで3D表示をするプログラムをつくっています。 とりあえずコンパイルができません。どうすればいいのでしょうか?教えてください。 エラー内容: warning C4005: 'WIN_TYPES' : マクロが再定義されました。 error C2061: 構文エラー : 識別子 'LPDIRECT3D' error C2061: 構文エラー : 識別子 'LPDIRECT3DDEVICE' error C2061: 構文エラー : 識別子 'LPDIRECT3D' error C2061: 構文エラー : 識別子 'LPDIRECT3DDEVICE' error C2061: 構文エラー : 識別子 'LPDIRECT3D2' error C2061: 構文エラー : 識別子 'LPDIRECT3DDEVICE2' error C2061: 構文エラー : 識別子 'LPDIRECT3D' error C2061: 構文エラー : 識別子 'LPDIRECT3DDEVICE' error C2061: 構文エラー : 識別子 'LPDIRECT3D2' error C2061: 構文エラー : 識別子 'LPDIRECT3DDEVICE2' error C2061: 構文エラー : 識別子 'LPDIRECT3DVIEWPORT' error C2061: 構文エラー : 識別子 'LPDIRECT3DVIEWPORT' error C2061: 構文エラー : 識別子 'LPDIRECT3D' error C2061: 構文エラー : 識別子 'LPDIRECT3D2' error C2061: 構文エラー : 識別子 'LPDIRECT3D2' includeの順番:windows.h d3dx9.h dshow.h qedit.h stdio.h 補足:directshowにはISampleGrabberを使っているのでqeditをincludeしています。 qeditを外してincludeするとエラーが出ないため、qeditのところでエラーが出ているとは思います。
163 :
初心者ボーイ :2006/09/17(日) 01:51:46
directXのディレクトリを上にしているのですが、 無理なんです。はい。 あとplatform sdkのdirectshowをincludeするようにもしてみましたが、駄目でした
qedit.hはDirectX7以降のDirect3Dヘッダと互換が無い。 って書いてあるな。ヘルプに。 ISampleGrabberのインターフェース関係だけコピーして持ってくるのはどう?
質問です。 MESOって名前の8バイトの構造体を定義して、 struct MESO *masaru = (struct MESO *) 0x12345 for (i=0;i<1;i++){ masaru+1 } ってやったら、masaruは8バイトの構造体の変数だから、masaruはfor文で 1アドレスを進めてますけど、実際は0x12345+8のアドレスにになりますよね?
>>165 アドレスの進み方については、そう考えて問題ない。
どうもです!
まぁ、0x12345はまず無いがな。
169 :
デフォルトの名無しさん :2006/09/17(日) 21:25:18
質問です ファイルに以下のように書き込みたいんですが。 はじめの処理を行って、A、Bを書き込んで 次の処理が終わったら、C,Dを書き込んで・・・・ という風に、追記していきたいのですが どうすればいいのでしょうか? A,C,E,G・・・ B,D,F,H・・・ fprintfで何かコマンドとか、あるんでしょうか?
>>169 その都度fopen()するなら"a"でオープンすればいい。
但し処理系によっては最後にEOFコードを付加する環境があるので、
1バイト削って追記するなど工夫しないといけない場合あり。
>>170 ありがとうございます。
ちょっとやってみます!
c言語が必要になってきたので勉強したいのですが、どういった本がお勧めでしょうか? 柴田本が読みやすいと聞いたことがあって今日見てきたのですが、初心者のくせに細かい疑問が出てくる僕には合わなそうでした… 詳しく書いてあるんだけど、とっつき易い簡単な入門者向きの本はありますか? あれば是非教えてください、お願いします。
173 :
デフォルトの名無しさん :2006/09/17(日) 22:25:22
>>172 ある本をみてダメと思うんなら他人が教える本はほとんどダメだぞ
あと、本屋で身銭を切って損をして自分にあった情報収集の方法を知るってのも勉強だ
とりあえず、お前はJISの規格書でも買っとけ
>> 172 柴田本の入門書は読み始めはちときつかったけど(著者偉そうなのがとくに) 内容はかなり良かったと思います。 とりあえず、お前はJISの規格書と柴田でも買っとけ ゆっくりでもがんばりな。
>172 漢は黙ってK&R
>>170 もう少し>169を注意深く読んでくれ。
>>169 >170の方法では、常に最後に追加する形だから、>169の順番で書くには使えない。
ACEGの順番で書けるようにそれらを一旦メモリ上にキープするなどの対策が必要。
いっそ、何をしたいのか具体的に書いてみたら?
177 :
172 :2006/09/18(月) 00:41:00
実は今既に2冊もっているので、それにあわせて柴田本と規格書を買って頑張ってみようと思います。 K&Rは初めて聞きましたので検索してみたのですが、初心者向きではなさそうですがw また書店に行ってみます、皆様有難うございました。
男はもっと黙ってプログラム言語C++第三版。 黙ってというか、ぐうの音も出なくなるが。
>178 いや172が必要としてるのはCだから
>177 いや、俺は最初の本がK&Rだったぞ。20年前だが。
>>183 あ、その本なつかしー。
K&Rと併読した記憶があるな。
185 :
デフォルトの名無しさん :2006/09/18(月) 16:06:36
質問です。 環境:RedHat(pthread) 下記のようなスレッド生成エンジン部分を扱っています。 #define TH_GEN_MAX 10 int ret; pthread_t thid[TH_GEN_MAX]; int ret_th[TH_GEN_MAX]; int i; for(i=0;i!=TH_GEN_MAX;i++){ if((ret=pthread_create(thid[i], NULL, (void*)TH_MAIN(void*), (void*)TH_ARGV)) !=0){ ErrExit(); } } TH_MAINでは、iの値で処理をスイッチさせるようになっています。 前まで論理CPU1個の環境でこれを走らせていて、子スレッドが確実にiの値を 判別してうまく処理をスイッチ出来ていたのですが、ミューテクス使わないのはまずい だろと言われたので、mutex_lock/unlockを追加しようと思います。 思ったのですが、うまいタイミングが思いつきません。 感じ的には、生成するスレッドは生成直前にlock、生成後にunlock 生成されたスレッドは実行開始直後にlock、iの値を確実に取得した後unlock で問題ないかと思うんですが、どうでしょう。。。
>TH_MAINでは、iの値で処理をスイッチさせるようになっています。 どうやってんだか分からないのだが
TH_MAINは <<--- switch(i){ case(0): >>--- FUNC0; break; 以下略 } になってるだけです。 <<---でlock >>---でunlockかなと思ってます。
よくわかんないけど、ある変数を複数のスレッドで共有して、その内容で処理を 振り分けるのなら、その変数の読み書きの前後でロック・アンロックすればいい。 これは全てのスレッドで行う必要がある。
iで処理分けるなら普通スレッドに渡す関数を別にしないか?
というかiという変数名な癖にグローバル変数なのか? ローカルなら排他も糞もないだろうし。
それはないだろ。iはスレッド起動時に引数で渡してるはずさ・・・たぶん・・・
例だろ 実際のプログラムはもっとまともな名前・・・だといいな・・・
↓妄想 親:lock 親:i=0代入 親:スレッド0生成 親:unlock 子0:lock 子0:i==0で分岐 子0:unlock 親:lock 親:i=1代入 親:スレッド1生成 子1:lock ← unlock待ち 親:unlock 子1:i==1で分岐 子1:unlock ↓たいていこうなる 親:lock 親:i=0代入 親:スレッド0生成 親:unlock 親:lock 親:i=1代入 親:スレッド1生成 親:unlock 子0:lock 子0:i==1で分岐 ← wwwwwww 子0:unlock 子1:lock 子1:i==1で分岐 子1:unlock
よって子が親に変数 i を受け取ったことを通知する必要がある class Event { public: Event() { flag = false; } void notify(); void wait(); private: bool flag; pthread_mutex_t mutex; pthread_cond_t cond; }; void Event::notify() { pthread_mutex_lock(&mutex); flag = true; pthread_mutex_unlock(&mutex); pthread_cond_signal(&cond); } void Event::wait() { pthread_mutex_lock(&mutex); if (!flag) { pthread_cond_wait(&cond, &mutex); } pthread_mutex_unlock(&mutex); } 親はスレッドを作るたびに wait、子は i による分岐を終了した後に notify 間違っていても謝らない 細かいところは自分で直せ
一々グローバルなデータを使って排他制御に苦労するよりも スレッド起動時に引数で渡したほうが楽じゃね
i がローカル変数であっても pthread_createで渡されるのは i のポインタだぞ
↓要するにこのケースもある罠 親:lock 親:i=0代入 親:スレッド0生成 親:unlock 親:lock 親:i=1代入 親:スレッド1生成 親:unlock 親:スレッド終了 ← i がスタックから消える 子0:lock 子0:i で分岐 ← 実体が無い、テラヤバス 子0:unlock 子1:lock 子1:i==1で分岐 ← もうだめぽ 子1:unlock
いやこうじゃないか? i(){}
>>196 なぜわざわざポインタ経由で渡すw
値で渡せば問題ないでしょ
おまいら餅つけ。 処理の分岐はメインスレッドでと書いておるぞ。
処理の分岐はTH_MAINでやると書かれてるが。
さきほどCの本を読んで 今C++を使ってます。 コンパイラはBorland C++ 5.5.1 for Win32 です。 C標準ライブラリとC++標準ライブラリと名前空間に関することで 聞きたいのですが、 #include <stdio.h> でincludeすると、名前空間を指定しないで 識別子を参照でき、 #include <cstdio> でincludeすると std::printf(); のように使わないといけないと本で読みました。 しかし、std::をつけると Error E2451 test.c 5: Undefined symbol 'std' in function main Error E2379 test.c 5: Statement missing ; in function main となってしまいます。 cstdio.hをエディタで見てみても using std{} のような箇所は見当たらないのですが、 なぜですか?
間違えました。 using std{} ではなくて namespace std{・・・} です。
>>204 拡張子がcだからCのソースとしてコンパイルされている。
拡張子をcppなどにすればC++としてコンパイルされ、その本のとおりになる。
あと、<cstdio>をインクルードするからと言っても、
実際にcstdioやcstdio.hというファイルが存在しなければならないわけではない。(規格書にもそう明記されている)
Borland C++の場合はプリプロセッサが適当に処理している。
>>206 ありがとうございます。
解決しました。
>あと、<cstdio>をインクルードするからと言っても、 >実際にcstdioやcstdio.hというファイルが存在しなければならないわけではない。(規格書にもそう明記されている) そーだったのか。 知らなかった。
Cの関数は、cstdioなどでインクルードしても、std名前空間に 包まれているようで、実は漏れているしな。 std::を付けても付けなくてもエラーは出ない。
>Cの関数は、cstdioなどでインクルードしても、std名前空間に >包まれているようで、実は漏れているしな。 それ、漏れてるんじゃなくって互換性のために漏らしてるんじゃね? 少なくともVCとgccのそれは作為的だったはず。
コンパイラによっては漏れてなかったりするのかな。 てか、stdをつけることになってるから つければいいんでね? std くらいたいしたことない
>>211 1998年の規格では漏れてもいい事になってて、C++0xでは見直す方向に
ある。
std::printfとかstd::strlenと書くのはかなり違和感がある
class X{ int func(){return 1;} }; と class X{ int func(); } int X::func(){return 1;} を相互に変換できる定番のプログラムとかあったらおしえてください。
gcc 3.4.4をつかっています。
std::printf 特に抵抗ないけど。 Math.sin みたいで逆にいい感じ。 この際 std:printf でいいかなと思うけど。コロン1つね。
gotoラベルと見分けがつかない。
>>208 一応言っておくが、<stdio.h>や<iostream>とか全ての標準ライブラリのヘッダに当てはまるからな。
>>219 そーだったのか。
ますます知らなかった。
つーか普通にK&Rに書いてあるじゃん。
おらびっくりしただよ。
実際某処理系は、標準インクルードは全てプリコンパイルドヘッダを参照するようになっている。
某処理系って?
剃刀(某某な毛を処理できる)
^^;<帰ってください
225 :
デフォルトの名無しさん :2006/09/22(金) 00:04:16
#include <iostream> ry using namespace std; using namespace hoge; とあった時に、例えばmainの中で ::foo(); fooがstdとhogeの両方である関数としても、foo()は常に名前空間がstdの方で解釈されるのでしょうか?
構造体に構造体のサイズを持たせたものを良く見るんだけど あの情報っていったい何に使われているんでしょうか?
>>225 だったらどうやってグローバルなfooを参照するんだよカスが
どんだけ無能なんだ
>>225 いいえ。
::fooと限定してやると、グローバルな名前空間の中からしか名前を探さない。
usingディレクティブで指定された名前空間は探す対象にならない。(using宣言なら対象になるが)
仮にfooと書いてあったとして、stdとhoge両名前空間にfooという関数があったら、
曖昧ということでエラーになる。(ただし引数などが異なれば多重定義となり問題ない)
usingディレクティブは使うなと言われるのはこのため。
すいません。ちょっと手がかりがつかめないのでよろしくお願いします。 テキストファイルのデータ 0001 0002 0003 0004 0005 までのHit.txtがあります。 それを下の構文で std::fstream Fs("Hit.txt",std::ios::in | std::ios::out ); short readnum = 0; std::streampos post; Fs >> readnum; //Fs.tellp(); Fs << "tp" << flush; 実行してみたんですが、Fs.tellp()が無い場合はテキストの内容が全く変わらず Fs.tellp()を入れたら 0001tp0002 0003 のように変化します。 tellp()って現在位置を取るものですよね? どういう動きでこういう結果になってしまうのかご教授願えないでしょうか。
>>226 構造体を拡張した場合の互換性の為。
サイズが一種のバージョン情報になる。
>>231 環境というのは、VC++の設定のことでしょうか?
このプログラムはVCのWin32アプリケーションの空白の雛形に
コーディングしたものです。それ以外は特にいじってはいないつもりなんですが。
今ファイル入出力の勉強というかツール作りのためにやっているので
他はあまり触っていないです。
>>232 結論を先に言うと、tellp()の後書き込みを行ってテキストファイルの
内容が変化するとは標準では決められていない。
std::ios::in | std::ios::outのオープンモードは、対応するCのオープン
モードでは"r+"であり、読み←→書きを切り替える前にファイルポインタ
をシークしなければならない。
だから、Fs.seekg(std::ios::beg); 等を行えば、書き込みが可能になる。
なお、ご存じのようにC++では読み取り用と書き込み用のファイルポインタ
は別々であり、いきなりstd::ios::curを指定してもうまくいかない。
>>233 ご回答ありがとうございます。
ということは、つまり一度読み込みするたびに
seekgなどで位置を調整して書き込み再度位置を調整して読み込み
という処理を繰り返さなければいけないということになるのでしょうか。
あと
>ご存じのようにC++では読み取り用と書き込み用のファイルポインタ
>は別々であり
この件ですが、
ttp://www.kab-studio.biz/Programing/Codian/iostream/04.html こちらのサイトのほうでも勉強させていただいてるんですが
こちらでは、
『このように std::fstream では、読み取りポインタと書き込みポインタが同じように扱われます。
これは、単なるポインタではなく「ファイルポインタ」を操作しているからなのです。』
という風な説明がありましたもので、あまり意識せずにseekp,seekgを適当に使ってたんですが
どういう風に理解したらいいものでしょうか?
&演算について質問です。 あるコードがあって、 short型の変数hogeに0100 0000 1001 0010という値が入っていて、 1111 1111をアンドすると 0100 0000 1001 0010 & 1111 1111 ___________________________ 0100 0000 1001 0010 になりますが、この結果をchar型hugaに入れています。 これってhugaに1001 0010が入るのは分かるのですが、 変数から溢れたりしないのでしょうか? 2バイトの値に1バイトの値をアンドすると、アンドされなかった部分は無視されるのでしょうか?
>>234 >ということは、つまり一度読み込みするたびに
>seekgなどで位置を調整して書き込み再度位置を調整して読み込み
>という処理を繰り返さなければいけないということになるのでしょうか。
これはC言語も同じだったと思います。読み込み→書き込みの時は、
EOFにファイルポインタが達している時以外はfseek()もしくはrewind()、
書き込み→読み込みの時は常にfseek()またはrewind()の呼び出しが
必要でした。
std::fstreamがファイルポインタを一つしか持たないというのは私も
知りませんでした。std::stringstreamも同じようです。これは私のミスです。
済みません。
規格書を見ると、seekp(pos)もseekg(pos)もrdbuf->pubseekoff(pos)を
実行するように書いてあり(§27.6.1.3.38と§27.6.2.3.2)、確かに同じようです。
237 :
236 :2006/09/22(金) 01:56:52
私もちょっと混乱してきたので、この件についてはもう少し詳しく調べて みます。 但し、読み書きを切り替える時にシークが必要なのは間違いないです。
>>236 C言語の知識もあやふやなもので大変勉強になりました。
常にfseekという発想が持てなかった物で大変助かりました。
アドバイスをいただいた上で力づくですが
std::fstream Fs("Hit.txt",std::ios::in | std::ios::out );
short readnum = 0;
std::streampos post;
int cnt = 0;
#if 1
while( 1 )
{
if( Fs.eof())
//if( 1 )
{
Fs.seekp( 6*cnt,ios::beg );
Fs << setfill('0') << setw(4) << readnum*10 << endl;
break;
}
Fs >> readnum;
Fs.seekp( 6*cnt,ios::beg );
Fs << setfill('0') << setw(4) << readnum *10 << endl;
cnt++;
}
#endif
を実行しましたら
0010
|
0050
と反映されました。とりあえずこれでいこうかと思います。
>>238 うまくいってよかったですね。私も勉強になりました。
もしかしたらもっとスマートな書き方があるのかもしれませんが、
完全に分かるまで調べてみようと思います。
次のようなプログラムで実験したら、std::stringstreamはseekp()とseekg()は 別々に扱われるようです。seekp()とseekg()が同じなのはstd::fstreamだけの ようです。 std::stringstream s("00010002000300040005"); char buf[100]; std::cout << s.str() << std::endl; s.seekp(std::ios::beg); s.seekg(4, std::ios::beg); s.read(buf, 4); buf[4] = '\0'; std::cout << buf << std::endl; s.write("ffff", 4); s.seekg(std::ios::beg); s.read(buf, 4); buf[4] = '\0'; std::cout << buf << std::endl;
と言う事は、同じrdbuf()->pubseekpos()を呼び出しているのにクラスに よって結果が異なるというのは、pubseekpos()関数が仮想関数であり、 呼び出すクラスによって動作を切り替えているという事なのでしょう。 規格票にこの事が詳しく書かれていればいいのですが、今のところ 見つけられずにいます。もし詳しい方がいらっしゃったらぜひ教えて下さい。
なるんです? これは、アンドすることで、2バイトの変数の 下8ビットを切り分けている処理なんです。 で、不思議だなと思って。 たぶん、hugaが1バイトのポインタだから出来るんですかね?
ひとつ教えてあげる。
2進数の11111111、つまり16進数で0xFFというのは
2進数の0000000011111111のこと。
その上で、
>>235 をもう一度考えてみ。
まあ、その後にcharに代入してるなら、
この結果自体はあまり関係ないだろうけどね。
了解です。 0100 0000 1001 0010 & 0000 0000 1111 1111 ___________________________ 0000 0000 1001 0010 になるわけですね。 んで、char型のポインタに代入だから、1001 0010になると。 0100 0000 1001 0010 & 1111 1111 ___________________________ 0100 0000 1001 0010 上の自分が勘違いしてた奴でも、結局Char型のポインタに代入だから1001 0010 になるのは変わらないけれど、このコードの大事なところは、上8ビットが アンド演算で0000 0000にしている事だと。 なんで下8ケタだけはいるのかというと、 char型のポインタはMOV BYTEだから、上四桁は無視されると。
>>245 shortをcharに代入する時、型キャストしないと「変換後の精度が失われる」
のようなコンパイラ警告が表示されなかった?
すいません。ないです。 char型へのポインタはMOV BYTE [番地]だと習ったので、 メモリの中で 番地0 1001 0010 番地1 0100 0000 みたいな感じになって、番地が1バイト分読みとられる意味になってキャストの警告はでないと思っていました。 さらに質問なんですけれども、 0xFFが0000000011111111になって計算されると言うのは、 異なる型同士で演算すると、大きい方の型に合わせて演算されるという理由からでしょうか? それとも、0x00ffといちいち書くのが面倒だから、省略したのでしょうか?
「変数」を「ポインタ」と呼ぶのはやめた方がいい、じゃなくて絶対やめろ。 なまじアセンブラをかじってるから、 (レジスタではない)メモリ上の変数をそう呼びたくなるのかもしれないが アセンブラでも、変数は変数だ。 アドレスを保持する変数をC/C++ではポインタまたはポインタ変数と呼ぶだけ。 もし、*を使ったポインタで参照している中身のことを言っているのだとしても それはやはり変数(配列変数かもしれない)であって、ポインタではない。 もちろん、ポインタの配列等はあるが、それはでもchar型のポインタとは言わない。
>>247 算術変換を勉強するといい。
演算時のcharとshortはどちらもintに昇格されてから計算される。
警告が出るか出ないかはコンパイラ次第。規格にはないから。
大分用語的な間違いはあるけど概ねそれでいいかと。
質問です、現在DLLとEXE間でのクラスの受け渡しをしようとしています。 EXE側のソースコード #include <stdio.h> #include <windows.h> class TestP{ public: virtual ~TestP(){} virtual void Suicide() = 0; virtual void TestFunc() = 0; }; typedef TestP* (*PFunc)();
int main(){ HINSTANCE hLib; TestP* Temp = NULL; PFunc MyFunc = NULL; hLib = LoadLibrary("HOGE.dll"); if(hLib){ MyFunc = (PFunc)GetProcAddress(hLib, "CreateInstance"); } else{ printf("HOGE.dllの取得に失敗;\n"); } if(MyFunc){ Temp = MyFunc(); } else{ printf("CreateInstanceの取得に失敗;\n"); } if(Temp){ Temp->TestFunc(); Temp->Suicide(); } FreeLibrary(hLib); return(getchar()); }
DLL側のソースコード #include <stdio.h> #include <windows.h> class TestP{ public: virtual ~TestP(){} virtual void Suicide() = 0; virtual void TestFunc() = 0; }; class TestC : public TestP{ public: TestC(){ printf("こんすとらくた(TestC);\n"); } ~TestC(){ printf("ですとらくた(TestC);\n"); } void Suicide(){ printf("すいさいど(TestC);\n"); delete(this); } void TestFunc(){ printf("てすとふぁんく(TestC);\n"); } };
extern "C"{ __declspec(dllexport) TestP* WINAPI CreateInstance(){ return(new TestC); } } 上記のコードで、VS.NET2003ではDLLとEXE間のクラス受け渡しに成功しました。 ところが、BCCでDLLをコンパイルするとTestC::Suicide()のdelete(this)でエラーが発生します。 (アクセス違反です) 何故か、また回避する方法は存在するのでしょうか?どなたか、教えて頂ければとorz
EXEの本体もBCCでコンパイルした?
>251 していません、異なるコンパイラ間で動作させる為のテストなので。 delete(this)で引っ掛かるという事は、恐らくはメモリ配置等の問題なのでしょうけれど…。 解決策が分からないのですorz
異なるコンパイラ間でvtblの構造が一致している保証はどこにもない。
>>256 クラスを諦めてCの構造体同様のレガシーな構造体にするか、
いっそOCXにでもするしか、コンパイラの壁を越えることはできないかと。
Windows環境の場合、COMの関係でどこも同じような実装になってると思うけど、どうなんかな。 あと typedef TestP* (*PFunc)(); ↓ typedef TestP* (WINAPI *PFunc)();
あー、後メンバ関数も呼び出し規約を明記した方がいいと思うよ。 デフォの呼び出し規約が違うかも試練。
そう言えば異なるコンパイラでDLLとの受け渡しで、仮想関数を 使った事は一度もないな。いつもCの呼び出し規約に合わせていた。
>257 がはっ、そうでしたかorz delete(this)以外は正常に呼び出されているのですが、vtblの構造の差異によるアクセス違反とかが発生しているのでしょうか? >258 成る程です、異なるコンパイラ間でクラスは共有できないのですね。 という事は、クラスを諦めるかBCC等でのプラグイン作成を認めないか…後者の方が楽な選択ですねorz >259 実はその部分、DLL側のソースコードがVC++からのコピペでは一発で通らず、 慌てて貼り付けたので関数ポインタ側の修正を忘れていたりしたのですorz 御指摘、有難う御座います。 >260 そうですね、面倒ではありますがこれもバグ回避の為ですorz ついでに、もうひとつ質問させて頂きます。 同一コンパイラの同一ランタイムでクラスの受け渡しは可能ですが、異なるコンパイラでは不可能です。 しかし、VC++シリーズ(っていうのも変ですが)内では如何なのでしょうか? 6.0は論外としても、.NETと.NET2003と.NET2005位は共通しておいて欲しいのですが………。
とりあえず、2003と2005の互換性は確認出来ました….NETだけ分からないので、どなたか教えて頂ければとorz
デフォルトのアラインメントも違いそうだな。VC系は8でBCCは1だっけ?
265 :
デフォルトの名無しさん :2006/09/22(金) 15:58:02
>>248 ,249,250様。
ご指導ありがとうございます。
用語の使い方、気をつけます。
どうもありがとうございました。
単にnewとdeleteをクラス毎に多重定義すれば解決しそうな気がする。
気がするだけかい。実際に LoadLibrary & GetProcAddress した結果を教えてくれyo。 つーか >266 は virtual void Suicide() = 0; をインタフェースに含むんだったら互換性に問題ないよっていう意味だし。
269 :
デフォルトの名無しさん :2006/09/24(日) 00:27:51
char abc[3][16]; こういう文字の配列があったとして 別の関数でabc[a][b]というような使い方がしたいのですが このabcのアドレスを関数に渡して関数内で使用するには どうしたらいいでしょう 普段はabc[0]みたいな感じで渡していたのでabcだけの場合 型をどうしたらいいのかわからないです。
>269 void Hoge(char abc[]); abcは引数なので、名前は何でも良い。 ただし、配列の要素数は関数側で特定出来ない。よって、 void Hoge(int Num, char abc[]); のように、要素数も引数として渡すべし。
と、二次元か。失礼。 二次元の場合は、 void Hoge(char abc[][16]); といった感じで渡せばOK。 注意点としては、配列の「後ろの方」だけは要素数を書かなければならない点。
void func(char *v, int m, int n);
すみません混乱してまだよくわからないです 例えば char abc[64];のアドレスを渡して関数使う場合は hoge(char *abc) { abc } こんなので出来ますよね? それを char abc[10][64]; こういうの関数内で hoge(???????abc) { abc[1] } こういったように参照して使いたいのですが アドレスの渡し方がいまいちわからなくて
>>271 すみません今頃になってようやくわかりました。
配列のアドレス表示させるサンプル作って気がついたんですけど
文字列の場合勝手にポインタになると勘違いしてました。
だから要素数とか言ってたんですね
おかげで出来ましたありがとう
FILE *fp; if((fp == fopen(filename,mode)) == NULL) { printf("ファイルを開くことが出来ません:%s\n",filename); exit(-1); } //処理 fclose(fp); このファイルを開く時のエラー処理を毎回書くと行数無駄に増えて嫌なんですけど、 関数にするとしたらどんな感じしたらいいんでしょうか? なるべくFILE *fpと fclose(fp)って部分をいじりたくないのですが。 void FileOpen(FILE *fp,char filename[256], char mode[3]) { if((fp == fopen(filename,mode)) == NULL) { printf("ファイルを開くことが出来ません:%s\n",filename); exit(-1); } } というのを思いついたのですがこれだとFILE fp; FileOpen(&fp,"a.txt","r"); fclose(&fp); となってしまって汎用性がないもので・・・
FILE *fp; FileOpen(&fp,"a.txt","r"); fclose(fp); を受け取るように関数を書き換えるんだ
だからexit()に-1を渡すなと。
何でEXIT_FAILUREが定義されてるのに使わないんだ
283 :
277 :2006/09/24(日) 09:52:50
そんなの人の勝手じゃないか?
>>283 EXIT_FAILURE以外が渡った場合エラー終了扱いになるとは限らない。
EXIT_FAILURE定数は多くの場合1
286 :
277 :2006/09/24(日) 10:01:43
環境依存だからぶっちゃけOSがわからないと何ともいえん。
1を返そうが、2を返そうが、-1を返そうが、受け取る側も自分で書くなら自由。
ぶっちゃけWindowsのコマンドプロンプトでバッチファイルなどで 走らせると、1〜10程度の値を返して、それで処理を分岐させたりする。 EXIT_FAILUREは標準で定義されているが、それを使わなければならない 道理はどこにもない。
よくわからんが、それはつまり int *p=NULL; とするのも int *p=0; とするのも人の勝手ということ?
>>290 全然違う例えを引っ張ってこないように。
>>290 それは自由だったと思う。
NULLが0で置き換え可能なのは保証されてる。
>>289 「使わなければならない」と「使うべき」は違うだろ。
C++で主に(void*)0が0に置き換えられたのは、逆参照時に キャストしなければならない手間を防ぐためだしな。 Cではその点は問題ない。
EXIT_FAILUREを使わなくてもCは動く。 Cは、そんな仕様の言語だから。 でも互換性&可読性を考えれば、利用を推奨。 マジックナンバーは潰せ、って言うでしょ。 しかし重要なマクロだと個人的に思うけど、 何故stdio.hでなくstdlib.hなんだろう。
重要だとstdio.hに入り、 重要でないとstdlib.hに入るというわけではないのだが。
stdioが何の略かもわからんのだろうよ。
strlenってバイト数を見てヒープ領域を確保するんですよね 333AAA を 333AAA と全角で書いた場合は2倍になるという認識でいいんですよね?
>>297 領域の確保などしない。
全角を使ったときの長さはエンコーディング依存。
BCC Developer使ってHello World作ったんだけど
exe実行したら、一瞬Hello Worldってでてプログラムが強制終了される。
Developerの実行つかったら閉じる押すまで終了しないで正常なんだがなぜだろうか・・・
たぶん、プログラムじゃなくて漏れのPCが原因だと思うんだが・・
よかったら誰か教えてくれ・・・
http://www.uploda.org/uporg526158.zip.html
301 :
(^-^) ◆MONSOON/qo :2006/09/24(日) 17:29:07
>>299 printf("Hello World!\nキー押してね");
int a=getchar();
に変更してみて
>>301 なるほど!getchar関数を使うということですか。
実際にやってみるとできました。
アリガト!(´▽`)
>>300 コマンドラインから実行・・
漏れは初心者なのでその辺ぐぐったのですが分かりませんでした・・
よかったらおしえてくれます?
system("pause"); でも同じようなことができる コマンドラインは(すれ違い?) ファイル名を指定して実行 → cmd で出てくる画面だが知らんのなら 調べるより help コマンド使って自分で弄ったほうが多分理解が早い
>>302 プログラム → アクセサリ → コマンドプロンプト
実行ファイルがあるディレクトリへ移動して、実行
or
コマンドプロンプトの ウィンドウへ、 実行ファイルをドロップ
Enter
305 :
デフォルトの名無しさん :2006/09/24(日) 18:46:10
struct foo{ int i; std::string str; }; という構造体を宣言する時に、デフォルトの値として i=0, str = ""を入れておく、という事は出来ますか?
>>306 std::map <std::string, foo> hoge;
という形で、mapのvalueとしてfooを使おうと思っているので、
各keyに対してそれをやるとめんどくさくて。
hoge["fuga"].i++;
とやった時に"fuga"が登録されてなければhoge["fuga"].iの値が1になればいいんですが…
やっぱり
if(hoge.find("fuga") == hoge.end()){
hoge[fuga].i = 0;
}
という処理を入れるしかないんですかね?
>>308 コンストラクタで初期化すればいいじゃん
310 :
305 :2006/09/24(日) 19:43:53
>>309 すみません、具体的にはどう書けばいいんですか?
>>308 operator [] で作成される要素は foo() で初期化されたものが使われるから、
何もしなくてもいい。試してみたの?
>>310 std::mapとか使う前に、クラスの基本を勉強した方がいいよ。
>>311 struct foo{
int i;
std::string str;
};
int main(void)
{
std::map <std::string, foo> hoge;
hoge["fuga"].i++;
std::cout << hoge["fuga"].i << "\t" << hoge["fuga"].str << std::endl;
return 0;
}
こんなテストプログラム書いてみたら、1245009と表示されて、思うような結果にはなりませんでした。
>>312 すみません、時間がないもので…後で必ずやります。
mapのコンストラクタを再定義するって事ですか?
>>313 fooのコンストラクタだよ。311さんが言ってるfoo()もfooのコンストラクタってことだ。
コンストラクタの書き方がわからなかったら、それはちゃんと調べること。
あと、classとstructはほとんど同じ、ということも知っておいたほうがいい。
315 :
314 :2006/09/24(日) 20:41:01
ああ、なるほど!! struct fooを class foo{ public: foo(); ~foo(); int i; std::string str; }; foo::foo(){ i = 0; str = ""; } って感じで書き直せばいいんですね。 ありがとうございました。
>>315 別にstructのままでもコンストラクタは持てるよ。
318 :
305 :2006/09/24(日) 21:07:28
>>315 の名前間違ったorz
>>315 =
>>305 です。
>>316 そうなんですか。勉強になりました。
>>315 のように書き直したらうまくいきました。
皆さん、ご教示どうもありがとうございました。
>>317 Visual Studio .NET 2005 Professional です。
iが初期化されてなかったんで、変な値が入ったんですね。
319 :
317 :2006/09/24(日) 21:16:21
>>318 ありがとう。 VS2005 だな。覚えておく。
別にどんな処理系でも構わないだろ。 313の挙動は規格に則った動作だのはずだが俺の勘違いか?
>>320 C++ 2003 の改定で、 foo() で i も int() になるようになったはず。
value initialization という動作。
>>303 >>304 ♪♪♪ d(`Д´)b♪♪♪サンキュ
いろいろと教えてくれてどもっす
何とか理解できました
あれからいろいろコマンドプロントについて調べて
コマンドプロントについてよく勉強できました
Cはあまり触れたことがなかったのだが、、
これからがんがんプログラム作って生きたいと思う
>>307 動体視力がいいわけじゃない・・www
漏れのPCのスペック (((´・ω・`)しょぼいだけさ・・
処理オチのおかげでで見えた
連投スマソ いろいろ勉強できたっといったわりには コマンドプロンプトをコマンドプロントと書いてしまった・・・orz
>>324 大丈夫。
高校まで化学漬けだったおれは、
プログラムのグループのみんなの前で
コマンドプロトン
と言った。
むしろ哲学的だな。
コマンドプラトンとか。 そのうちコマンドフロイトとかちんことかまんことか言い出す奴が出るねんで。
stdio.h は「スタジオ ヘッダ」でした 今はboostのコンパイルが終わらなくて暇です
コマンドプロピレン
マジレスすると、「スタジオ」は「studio」。 「stdio」は「スタンダードアイオー」、つまり「標準入出力」だ罠。
ざわ・・・ ざわ・・・ この流れでマジレスっ・・・! ざわ・・・
マジレスすると,「マジレスすると」さえ付ければ許されると思ってるヤツはうんこ
何そのNever say never.
#include<studio.h>って書いてエラー出したことならあるな
カコワルイ
#include <kunio.h>
>>334 stdio.hファイルの方をリネームすればOK
338 :
デフォルトの名無しさん :2006/09/27(水) 11:46:09
VisualC++6.0とEasyLinkLibraryでDirectXを使って簡単なプログラムを作っています しかし、プログラムを実行する方法が VisualC++の開発画面上でコンパイルする方法しか解りません VisualC++がインストールされていないPCで 普通にアプリケーションとして起動させるにはどうすればいいのでしょうか? つまり 市販されているソフトなんかと同じような状態にしたいです 新しいPCにプログラムをインストールして実行という感じで
>>338 exe ファイルをコピーして実行すればいいんじゃね?
もう一度言う。
「やりたいこと」と「やったこと」と「どうなったのか」を全部
正確に書くように。
あと誘導されてきたんならその旨書くぐらいしとけ。
おそらく開発専用ランタイム依存のバイナリ吐いてんだろう
エクスプローラ等から起動するやり方も分からないように取れるが
VS.NET2005使ってます。ラジオボタンを作成して複数選択できるようにしますがそれを スタートボタンで実行できるようにするためにはどのようなコマンドを追加してスタートボタンに関連付ければいいでしょうか? 一応スタートボタンを押すと動く。という単純動作は出来ております。
プロジェクトの種類は何かくらい書け
>>338 ビルド設定に「Release」ってのないか?
>>342 意味がわからん。
>スタートボタンを押すと動く。という単純動作は出来ております
とあるのに、
>スタートボタンで実行できるようにするためには
>どのようなコマンドを追加してスタートボタンに関連付ければいいでしょうか
この質問が発生する理由がさっぱりわからん。
スタート メニューディレクトリをSHGetSpecialFolderPathあたりで取って、
exeへのショートカット放り込むだけじゃねーのか?
346 :
デフォルトの名無しさん :2006/09/27(水) 21:45:52
C言語を始めたばかりの超初心者です。 もの凄く素朴な疑問なんですけど、main関数なんかで、return 0とかreturn 1 とか返す場合って、あれはどういう意味があるんですか? 0は正常終了で、1は異常終了とか聞いたことがあるんですが、 そもそも、0とか1とかはどこで使ってるんですか? 初めから、0→正常とかってコンパイラ?が判断してくれるために書いてる?? たまにreturn -1とかもあるし..... 支離滅裂な質問だと思うんですけど、アドバイスお願いします<(_ _;;)>
>>346 コマンドラインで実行する場合などに、
戻り値を受け取って、結果によって挙動を変えたりできる。
exeを、ブラックボックスとして機能する一関数として見ればわかりやすい。
>>346 spawn()系の関数で子プロセスを呼び出した時に戻される値にもなる。
349 :
346 :2006/09/27(水) 21:56:04
>>347 普通の関数の場合、戻り値を受け取って、挙動を変えるってのは分かるのですが、
main関数ってreturnを受け取ると、そこでプログラムは終了しちゃいますよね。
それなのに戻り値を要求してるのが納得いかないというか.....
見当違いのことを言ってたらすみません.....
350 :
346 :2006/09/27(水) 21:57:19
>>348 すみません(^^;;
超初心者なので、おっしゃってる意味が......orz
皆さんありがとうございます。
>>349 プログラムが関数を呼んで戻り値を受け取るのと同じで、
OSがプログラムを呼んで、その戻り値を受け取ってるって考えるのはどうかな
>>346 例えば、TV録画ソフトがある。このソフトは指定された時間に起動し、
録画を終了したらアプリを終了する。
一方、録画管理ソフトがある。このソフトで、録画履歴を見られる。
この一覧で「録画成功」「録画失敗」などと表示するときはどうすればいいだろう?
そう、TV録画ソフトのmainのreturnで成功か失敗かを返せばいい。
まあ、そんな感じ。
353 :
346 :2006/09/27(水) 22:10:04
>>351 ,
>>352 なるほど!よく分かりました。どうもありがとうございました。
何度も申し訳ないですが、最後に一つだけ質問させて下さい。
stdio.hなどを初めにインクルードすると思うのですが、
どれがどの関数を含むのか分からないので(たまにエラーがでるので)、
適当に本に載ってたヘッダファイルを10個くらいコピペして、インクルードしてます。
これって何か問題あるのでしょうか?
というか、わざわざヘッダファイルを分割している意味がよく分からないです.....
>>353 わざわざファイルを分割しているのは、全部ひとつにまとめたら大きくなるからw
どれをインクルードすればいいか分からない場合は、その都度マニュアルを調べるべし。
慣れてくれば、よく使う関数がどのヘッダファイルを必要とするのか覚えるだろう。
>353 分割してない場合を考えてみよう。 全く使わんものまでどかんとインクルードされるわけだ。 ひょっとすると予想外のマクロや定数などを踏んでまずいことになるかもしれない。 また、シンボル名も衝突するかもしれない。 そうでなくても生成されるバイナリの量が増えたり、コンパイル時間が長くなったりする。 あと、どこに何があるか知らんなら「標準Cライブラリ」でぐぐれ。 Unix-likeな環境なら、man 3 printfなどとしてマニュアルを引くと載ってる。
356 :
346 :2006/09/27(水) 22:25:58
>>354 ,
>>355 詳しく教えてくださりありがとうございます。
そうですよね、慣れなきゃいけないですよね。
これからはその都度、調べるようにしてみます。
言われてみれば、確かに
>>355 のような危険性はありますよね。
皆さん、どうもありがとうございました!
>>355 /usr/bin/printf というコマンドがあった…
こんなコマンドあったのね><
man printfしたことなかったのか・・・
まんまんみてちんちんおっきおっき
koコマンドが無くてよかったね
361 :
デフォルトの名無しさん :2006/09/28(木) 22:41:16
100とか1000個のファイルパスやディレクトリへのパスが書かれたテキスト形式のリストがあり、 これを任意のデリミタで分割し、検索のためのデータ構造をつくりたいのですが、どんな構造が 適しているのでしょうか? Linux / Unix上で動作させたいと思います。
hashでいいんじゃね
363 :
361 :2006/09/28(木) 23:10:59
>>362 リストは、
/home/hoge/sample/xxxxx/
/home/hoge/sample/zzz/
/var/log/message/
/tmp/hoge/
/home/hoge2/ero/ura/
…
となっていて、検索対象の文字列もパス形式で与えられるような状態にし、
パスの構成要素を単位として前方一致の検索をかけたいのです。
trieかsuffix arrayなりを構築すればいんじゃね?
365 :
361 :2006/09/28(木) 23:34:21
ちょっとググってみた。trieだとメモリ結構食うみたいですね。 パトリシア木の方がいい感じかも。 サンプルコードはLISPばっかりでわからん。C言語でのサンプルがホスィ。 茶茎は読んでもどうなってるのかわかんねーや。
366 :
(^-^) ◆MONSOON/qo :2006/09/29(金) 00:00:07
>>365 第一階層
1=home
2=var
3=tmp
第二階層
1=hoge
2=log
3=hoge2
として/home/log/なら4進数21を対応させ、/home/なら4進数1を対応させる
/tmp/hoge/なら13とする
そして配列にリストの番号をふっておけば一発で求まる
367 :
(^-^) ◆MONSOON/qo :2006/09/29(金) 00:09:49
>>365 リストが次のものだけとする
/1/
/1/2/
/2/2/1/
/2/3/
/3/
/3/1/2/3/
このとき
a[1]=1
a[9]=2
a[26]=3
a[14]=4
a[3]=5
a[231]=6
その他は0とする
するとディレクトリのある場合は何番目か、ないかが決定できる
>>367 ホント、無駄なことに頭使うの好きだなぁ。
根っこの部分でアプローチ方法間違ってるよな。 誰か止めろよ。
delete[]について質問です 環境:VC6 次のプログラムで試行錯誤の結果 Cスタイルのキャストでは(void*)にキャストしてからdelete[]が可能なのに C++スタイルのキャストでは、無理でした これは仕様のせいなんでしょうか それともVC? あまり良くわかってないので、コンパイル通るコードも const_cast版はちゃんと動作してくれてるのか心配で 結局CスタイルのTCHAR*へのキャストでお茶を濁しています
#include <windows.h> int main(){ LPCTSTR str = new TCHAR[MAX_PATH]; str = "iyou"; //この3つはコンパイル可 delete[] const_cast<TCHAR*>(str); //delete[] (TCHAR*)str; //delete[] (void*)str; //以下全てエラー //delete[] str; //delete[] (const char*)str; //delete[] static_cast<TCHAR*>(str); //delete[] dynamic_cast<TCHAR*>(str); //delete[] reinterpret_cast<TCHAR*>(str); //delete[] static_cast<void*>(str); //delete[] dynamic_cast<void*>(str); //delete[] reinterpret_cast<void*>(str); //delete[] const_cast<void*>(str); return 0; }
>Cスタイルのキャストでは(void*)にキャストしてからdelete[]が可能なのに >C++スタイルのキャストでは、無理でした >これは仕様のせいなんでしょうか ちゃんと考えろ。 voidの配列って存在すると思うか? 出来なくて当然。 delete[] str が通らないのは、単にLPCTSTRが const char* ないしはconst wchar_t*でtypedefされているから。 ついでに、 LPCTSTR str = new TCHAR[MAX_PATH]; str = "iyou"; この時点でnewされた内容は失われている。 ぶっちゃけメモリリーク。 strの中身は文字列リテラルを指していて、delete[]した瞬間何が起きても不思議じゃない。 strへのコピーにはstrcpy()あたりを使え。 JavaとかSTLとかの知識がごっちゃになってないか? 一度落ち着いて整理した方がいいぞ。
>>372 えっと、voidの配列があったらサイズがわからないから
正しくdeleteできなさそうですね・・
そう言われてみたらむしろコンパイルが通るのが逆に不思議
仕様であろうとなかろうと使わないほうがよさげ・・かな
それにしても、これメモリリークだったとは^^;
いい勉強になりますた
そういうのがきちんとわかるように精進したいと思います
しかも、TCHAR 使ってるのに文字列リテラルは _T("") か TEXT("") 使えよ TCHAR って何か分かってるか?
「変数」と「値」の区別がついてない上、当然配列とポインタが理解できてない 初心者の典型的なコードだな。
TCHAR=tea茶
でもやさしく教える372にちょっと惚れた
>>371 C++スタイルのキャストでは const_cast 以外のキャストで定値性を消すことは出来ません。これはC++の仕様です。
ついでに delete や delete[] に渡す前にポインタの定値性を消す必要はありません。これもC++の仕様です。
重要なのは delete[] に渡すポインタの静的な型と new[] で指定した型が(const, volatile 修飾を除いて)
一致していない場合、動作未定義となることです。VC6〜8 の場合 delete[] に void* を渡すとデストラクタを
スルーして単なるメモリブロックの開放のみ行うため、メモリはリークしないのにその上に乗っかっている
リソースはリークするという厄介なバグの原因になります。
後アドバイスとして、月並みですが new[] ではなく std::vector や std::basic_string を使いましょう。
#include <windows.h>
#include <tchar.h>
#include <string>
typedef std::basic_string<TCHAR> tstring;
# べ、別に惚れたっていって欲しいんじゃないんだからねっ!
質問です、DLLとEXEが存在したとして EXE側でファイルのオープン/クローズを行います。 { FILE* stream = fopen("Hoge.txt", "wb"); } { fclose(stream); } で、それに対しDLL側ではFILE*を利用し読み書きを行います。 (FILE*は引数などで受け取ったものとします) { fwrite(略); }; このコードが同一バージョン違いコンパイラ、あるいは異種コンパイラで動作する保証はありますでしょうか? (要は、FILE構造体の構造ってどのコンパイラでも同一になる様にされているのかを窺いたく)
381 :
デフォルトの名無しさん :2006/09/30(土) 03:51:58
C++覚え立ての俺がメモリーリークを学んだぜ #include <iostream> #include <string> #include <cstdlib> #include <new> using std::string; using std::cout; using std::cerr; using std::nothrow; //文字列を操作するmyclassの定義 class myclass{ private: string str; char *pchar, *pwork, *pold; int len; myclass(){} myclass(const myclass &mobj){} myclass &operator=(const myclass &mobj){}
382 :
デフォルトの名無しさん :2006/09/30(土) 03:52:36
public: //1引数付きコンストラクタ myclass(const char *pstr) : str(pstr) { //char型の動的な配列を作成する const int size = static_cast<int>(str.length()); //sizeを指定して配列を割り当てる //nothrowで、newのメモリ割り当て時失敗してもbad_allocをなげずNULLを返す。 //pwork,pcharにそれぞれヒープからメモリを割り当てる pwork = pchar = new(nothrow) char[size + 1]; if(pchar == NULL){ cerr << "メモリ割り当てエラー"; exit(1); } //文字列をコピーする strcpy(pwork, str.c_str()); len = strlen(pwork); }
383 :
デフォルトの名無しさん :2006/09/30(土) 03:53:08
//メモリーリーク領域へのポインタを返す。 //領域再割り当てを行うメンバ関数 char *realloc(const char *pstr) { //メモリーリーク領域へのポインタを保存 pold = pchar; //strに文字列を代入しておく str = pstr; //char型の動的な配列を作成 const int size = strlen(pstr); //sizeを指定して配列を割り当てる pwork = pchar = new(nothrow) char[size + 1]; if(pchar == NULL){ cerr << "メモリ割り当てエラー"; exit(1); } //文字列をコピーする if(false == strcpy(pwork, pstr)){ cout << "文字列コピーエラー \n"; return NULL; }else{ len = strlen(pwork); } //メモリーリーク領域へのポインタを返す return pold; }
384 :
デフォルトの名無しさん :2006/09/30(土) 03:53:37
//動的に割り当てた領域の文字列へのポインタを返す const char *getstr(){ return pwork;} //デストラクタ ~myclass(){ cout << "デストラクタ \n"; delete [] pchar; } //c型文字列長さ int strlen(const char *cstr) { int i; for(i = 0; cstr[i]; i++) ; return i; } //c型文字列のコピー bool strcpy(char *out, const char *in) { if( strlen(out) < strlen(in)){ cout << "コピー無理 \n"; return false; }else{ while(*out++ = *in++) ; return true; } }
385 :
デフォルトの名無しさん :2006/09/30(土) 03:54:30
//アドレス表示 myclass *adress(myclass *mobj) { return mobj; } }; int main() { char *pchar = NULL; { myclass mcarray[] = {"今日も", "良い日で", "幸せで", "楽しく"}; const int size = sizeof mcarray / sizeof(myclass); int i; //mcarrayの要素を表示 for(i = 0; i < size; i++){ cout << mcarray[i].getstr() << ' ' << mcarray[i].adress(&mcarray[i]) << ' '; } cout << '\n';
「メモリーリーク領域へのポインタ」ってなんじゃそら
387 :
(^-^) ◆MONSOON/qo :2006/09/30(土) 03:57:09
メモリーリークってなんですか?
388 :
デフォルトの名無しさん :2006/09/30(土) 04:49:00
//メモリーリークを発生させる /* reallocメンバ関数で、新たに割り当てられた領域は 古い割り当て済みの領域を解放せずに新しい領域を新たに 割り当てる。そのため、delete演算子をつかってメモリを 解放するが、古い割り当てられたメモリが残っており メモリーリークがおこる。 */ if(NULL == (pchar = mcarray[0].realloc("明日も"))) cout << "再割り当て失敗 \n"; //mcarrayの要素を表示 for(i = 0; i < size; i++){ cout << mcarray[i].getstr() << ' ' << mcarray[i].adress(&mcarray[i]) << ' '; } cout << '\n'; } if(pchar == NULL){ cout << "とりあえず失敗 \n"; }else{ cout << "ブロックスコープを抜け出した \n"; cout << "すべてのオブジェクトは解放されているはず \n"; cout << "[メモリーリークとなった領域] : " << &pchar << pchar << '\n'; } return 0; }
ていうか、何が言いたいんだ?
390 :
デフォルトの名無しさん :2006/09/30(土) 09:32:36
c++ではjarの様にoファイルをまとめて実行形式のアーカイブにする事はできないんでしょうか
>>379 同一コンパイラ同一CRTでも、CRTがスタティックリンクだとダメなんじゃなかったっけ。
(; ゚Д゚)……
>>384 そのstrcpyはねえだろ。
たしかにoutには十分なメモリが確保してあるものの、
全て0埋めしてあったら、コピー無理になるだろ。
教える気ねえの?
何を?
>380>391 ありがとうございます、という事は関数でラップしなければならないのですねorz うわぁ、やな感じorz
397 :
デフォルトの名無しさん :2006/09/30(土) 13:44:05
ライブラリをリンクしたいのですがどうしたらいいのかわかりません リンクしたいのはComctl32です。 今は g++ -Comctl32 -o test.exe test.cpp です。
>>397 g++ -o test.exe test.cpp -lComctl32
comctl32.dllとリンクすることはできないんで内科医? 仮に、libsome.aなんてライブラリがあれば-lsomeでリンクできるが。 mingw使うことになるだろうし、検索してみたら?
>>399 最近のCygwinはMinGW相当も持っていて、
libcomctl32.aがあったりするんだな。
C++のコンソール入力であるていどプログラムが組めるようになって、いざGUI表示とVC++のMFCに挑戦しましたが、 ごく基本的な「画面に文字を表示する」部分でつまづいております。 どんな感じで操作すればいいのか、ざっと流れ的なのを説明していただければ幸いです。 (とりあえずHELLO WORLDとウィンドウに表示させるレベルまで) ちなみにVC++Net 2003、OSはXPです。
402 :
(^-^) ◆MONSOON/qo :2006/09/30(土) 16:10:11
>>401 サン
コンパイルの設定をWindowsアプリケーションにかえてから
次を実行してください
#include <windows.h>
int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hPreInst,
LPSTR pCmdLine,int nCmdShow)
{
MessageBox(NULL,"Hello, World","タイトル",MB_OK);
return 0;
}
ドピュドピュッ!
>>401 リソースエディタでStaticTextを貼り付けて、そこに件の文字を書くのではダメ?
>402のやり方はダイアログに出力するいちばん簡単な手順だけどMFCとはなんの関係もないコードだしね。
405 :
401 :2006/09/30(土) 17:46:47
すみません
>>402 >>404 とも当方の読解力が足らずよくわかりません。
テキストにはネットの入門サイト(猫含む)
あと秀和システムの逆引き大全使ってますが、
やはりちゃんとした本買わないと駄目ですかね・・・
406 :
338 です :2006/09/30(土) 18:03:03
本気でどうすればいいか 分からないです
ネットや書籍もかなり調べました
どなたか、どうかお願い致します
>>344 リリースビルドという物は仕様として存在するようなのですが
それが在るはずのダイアログで
「Project Win 32 el」としか表示されていません
>>339 exeファイルという意味もわからないくらいの初心者ですが
一応ファイルの構成はこうです
--単体のファイル--
・プロジェクトファイル(.dsp)
・プロジェクトワークスペース(.dsw)
・CPPソースファイル (.cpp)
・リソースファイル (.rc)
---複数のファイル--
・ヘッダーファイル (.h)
・WAVファイル (.wav)
・MIDIファイル (.midi)
407 :
デフォルトの名無しさん :2006/09/30(土) 18:04:09
コンパイルすればよくね?
>>405 文字を出力することにこだわらず、まともな入門書か入門サイトの通りにやれば?
少なくとも、>402も>404も理解できない人間が自己流だなんて虫が良すぎる。
>ネットや書籍もかなり調べました
>>339 このスレは質問者の幅が広いですねー
410 :
デフォルトの名無しさん :2006/09/30(土) 18:49:26
includeとjavaのimportには違いがあるのでしょうか
411 :
デフォルトの名無しさん :2006/09/30(土) 18:54:12
C++のオブジェクトファイルとjavaのクラスファイルはなにが違うの
402はプロジェクトの新規作成、から Windowsアプリケーションを選んでプロジェクトを作り、 .cppのソースをプロジェクトに加えてビルドするということ。
>>410 全然違う。ウンコしに行って帰ってきたほど違う。
338 VC6はこんな感じでできたと思う。 @アクティブな構成をRelaeseにする Aビルトする Bプロジェクトフォルダ下Releaseフォルダにあるxxxx.exe を対象のPCにコピー Cxxxx.exeを開く 401 MFCには「標準出力」「文字出力」はない。 対象のクラスよってに表示方法がちがう。たとえば CxxxxViewなら OnDraw()でTextOut()する。またはDrawText()する。
>>413 すみません、よくわからないです。
つまりincludeするファイルがウンコしに行って終わったら帰るって事ですか?
ウンコじゃなくてもっと解りやすいものに例えてほしいです。
そもそも言語が違うんだし、比べる事自体おかしいと思うが。
includeが物理的で、importが論理的。
418 :
デフォルトの名無しさん :2006/09/30(土) 20:09:40
419 :
はい :2006/09/30(土) 20:14:31
>>418 freeしたら用済みだから、それを返す必要は無い。
Mallocがうまくいかないのは、これがうまくいかないのと同じ理屈。
#include <stdio.h>
void hoge(int n)
{
n = 777;
}
int main(void)
{
int x = 666;
hoge(x);
printf("%d\n", x);
return 0;
}
>>418 char **strにして、*strにmallocの戻り値を代入したらうまく行く。
422 :
418 :2006/09/30(土) 20:29:22
みなさま、ありがとうございます。 理解しました。
423 :
デフォルトの名無しさん :2006/09/30(土) 20:32:18
初心者の質問だと思いますがお願いします。 class Test でメンバ変数 m_flag を宣言して if(条件) m_flag = 1; else m_flag = 0; と変数に値を代入しておきます。 これを別のクラス class Main で Test fg if(fg.m_flag == 1) 処理1; else 処理2; というふうに別のクラスで変更した値を見るにはどうすればいいですか? このままだとfgに何も入ってないので正しく動作しません。 メンバ変数をpublicで宣言してポインタを使うとできますか?
>>423 クラス共通変数にしたいのならstaticクラス変数を使えばどう?
425 :
423 :2006/09/30(土) 20:37:58
>>424 レスありがとうございます。
staticを使わずにやりたいのですが難しいですか?
>>423 Test に bool Flag() const { return m_flag; } でも足せば?
実際はもっと意味のある名前にしとけよ。
要するにコンポジションになってるクラスの変数を見たいわけでしょ。 コンストラクタでTest& fg として、元のクラスを参照で持たせておくか ポインタを持って初期化しないと意味ないよ。 クラスは金太郎飴だからね。 friend使ったりアクセサ(この場合はread専用)を使ったりする。
428 :
デフォルトの名無しさん :2006/09/30(土) 21:13:29
>>423 漏れなら、
class Main に Test *fg; を置き
Testクラスにm_flagをread onlyするパブリックメンバー関数を加える
429 :
423 :2006/09/30(土) 21:31:37
皆さんレスありがとうございます。 いろいろ知らない言葉があってぐぐったりしてみたんですが アクセサ、readonlyというのは いわゆるGet〜というような関数のことですか? 実際にコードを書いていただけると幸いです。 (できれば特にポインタを使う部分を)
>>429 未だに何がしたいのか良く分からんのだが。
>>423 の「変数に値を代入」はどこに書いてるんだ?
Test のコンストラクタで書いとけば、
>>423 の下のコードでも問題なさそう。
メンバ関数に書いてるんなら fg.m_flag を見る前に呼び出しとけばいい。
#include <iostream> class Test { bool m_flag; public: Test(bool b = false) : m_flag(b) {} void set_flg(bool b) { m_flag = b; } bool get_flg() { return m_flag; } }; class Main { Test& fg; public: Main(Test& f) : fg(f) {} void abc() { if (fg.get_flg()) std::cout << "flag is true" << std::endl; else std::cout << "flag is false" << std::endl; } }; int main() { Test t; Main m(t); std::cout << std::boolalpha << t.get_flg() << std::endl; m.abc(); }
432 :
デフォルトの名無しさん :2006/09/30(土) 21:44:33
Windowsで仮想ドライブを作るソフト (GMail DiskやPGP DiskやDaemon Toolsのようなもの) を作りたくてDDKをインストールしたんだが どのサンプル見るのがよさそう? なんか解説してくれてるありがたいサイトないかい?
お前には無理だ。あきらめろ。
とりあえずフィルタドライバを作るのがいいかも あとSoftICEとか使わないとデバッグが大変だと思う
SoftICEって販売終了したんじゃなかった?
スレ違いな知ったか乙。
void *func(void *arg); void* func(void* arg); void * func(void * arg); C でどれがスタンダード? スペースをタブに置き換えても見易いのはどれ?
>>439 一番上。
そこでタブを使う人はほとんどいないでしょう。(つまり、使うな)
C++だと真ん中が多いような
C++を始めて真ん中の書き方に慣れるために苦労していた時、つい int* ptr, ptr2; とやって、ptrがint型になってしまうのに気づかなくてエラー連発していた 頃が懐かしい。 かと言ってreturn* this; はやり過ぎだし。
俺も真ん中の書き方しかしないな。 変数側の属性だろって頭でわかってても、 ポインタ型って考えた方がしっくりくること多いからなー。 最後のは無いだろう。
void *func(void *arg); これでまだ戸惑うなら、未だに初心者じゃないかな?
きたな労外
446 :
デフォルトの名無しさん :2006/10/01(日) 00:12:13
ん?int型になるのはptr2の方だろ? さすがに、return* this;は見たこと無いというか、宣言でしかやらないだろ、普通。
void* func(void *arg); 今こうやってるけど真ん中に変えようかなと思ってる
今まで int* をイントピーって読んでて、(int型のポインタ)型だと思ってた俺ガイル (´・ω・)恥ずかしいス
上だろうが真ん中だろうがどっちでもいいけど、片方に統一してないと気持ち悪くないか?
void *func(void *arg); だなー。今更変える気も無いし。
まあ、どっちかだよな。 俺は真ん中だが、これそもそもやりだしっぺは誰なんだ?
一番下も結構見るんだが
int * hoge() は偶にあるな
そこでMSの LPVOIDですよ これで無問題
exeの中身みたくてvisualC++いれたんだけど意味不明 どうすればてっとりばやく中身みれますか?
ソースコードがみたいんです
>>458 ソースコードはEXEには普通書かれてません//
まったくの初心者なのでよくわかりません
とりあえず
>>457 さんの言っているPEフォーマットの仕様書とやらを見ればいいのでしょうか?
>>460 全くの初心者さんが、何を理由にしてVC突っ込んでEXEの中身見ようとしたのかわからんです
とりあえずあなたのやろうとしてることは、あなたにとって無理が大きすぎるのは確かなので諦めてください
それよりなぜ逆コンパイルしようとおもったのか書くといいかもしれません
うpろだにあったものにウイルス入りじゃないか調べたかったのです
ウィルスチェッカ使えばいいだろ それより初心者なのに自分でexeみてウィルスかどうかどうやって判断するんだよ
>>462 とりあえずアンチウィルスソフト使ってみて、何もなければ諦めることだね
きっとEXEの中身がどーのこーのを思いつくあなたでは、色々無理
わかりました 諦めます
ゲームのツールなんですが ウイルスじゃなくてゲーム内で勝手に喋ったりするものでした
void * func(void * arg); これも最近見慣れてきたけどなぁ 時々、自分もこう書いてしまうときがある
見たこと無いなあ。 誰が始めたスタイルなんだろう?
TOKYO STYLE
単純に、WM_TIMERにMessageBox(hWnd...)を置くと ウイルスみたいになってしまうからな。 エラーチェックの為に入れていたが、えらいことになった。
モーダルダイアログでも再入するパターンだな。 タスクトレイから操作するアプリも注意した方がいい。
void * func(void * arg); この表記は、 pthread.h だ! 俺の不確かな記憶抜粋
次のプログラムのような例だと、変数に代入しないと デストラクタを呼び出す方法ってないよな? struct leak{ static leak* get(){return new leak();} operator int(){return 1;} }; int main(){ int is_leak = *leak::get(); //上側:deleteできん。メモリリーク leak* no_leak = leak::get(); //下側:deleteできる。 delete no_leak; //メモリリークなし return 0; }
newした領域をいきなりintで持つ時点でおかしいだろ。
delete leak::get();
478 :
384 :2006/10/01(日) 13:40:39
遅レスですみません
>>393 さんが指摘下さった部分で
すべて0埋めしてあったらコピーが無理になるというのは
newでバッファを割り当てた時の中身が0で埋まってたら
(先頭アドレス内容じゃなくても途中でも0があったら)
無理ということで理解して良いでしょうか。
間違ってたら、すいませんが教えて下さい。
strcpy()じゃなくてmemcpy()使えよ。
>>478 たぶん
>>384 の
> if( strlen(out) < strlen(in))
がいけないかと
outが0埋めされてたら、strlen(out)は0になるよね
で、ifの中に入れなくてコピーもされない
漢ならstrdup()ぜよ
main()とmain(void)の意味の違いについてどなたか教えてください
>>482 C だと、前者は引数の型や数を指定しない宣言で、後者が引数なしを指定する宣言。
C++ ならどちらも同じで、 C での後者と同じ意味。
ANSI-Cが推奨するプログラムは #include<stdio.h> int main(void){ return (EXIT_SUCCESS); } である。 main(){ } のようにしない理由を答えよ。 これにどう答えていいのかさっぱりわからないのですが、どなたか 素人の僕にもわかるように教えてください
・省略するとintと解釈されちゃうよおにいちゃん ・プロセスは戻り値を明示的に返す方が好ましいよおにいちゃん
>>484 上のプログラムは正しくない。
- stdio.h のインクルードは必要ない
- stdlib.h のインクルードが必要 (EXIT_SUCCESS のため)
>>486 すみません、僕が間違えて書いてました。stdlib.hでした。
>>485 ごめんなさい、まだわからなくて本当にごめんなさい。
>>484 同じ質問を繰り返したら誰か答えてくれるとでも思ってるのか?
今までの反応を省みて質問を考え直すか、消えるかのどっちかにしろ。
どうみても宿題です
夜遅くにすみません… 今、VC++でプログラミングしてるんですが、 ダイアログボックスから変数を持って行きたい時はどうすればいいですか? 例えば ダイアログボックスで 次の数の二乗を算出します とか書いてユーザに入力を求めて、そしてユーザが入力したら その値を元に計算→出力 的な感じなんですが…
ていうか最近はこの板全体が荒らされてる
>>492 Javaスレとか、意味不明に酷いな。
>>490 >ダイアログボックスから変数を持って行きたい
日本語でおk
入力をどうやって、どこから得るのかとか、どこに出力するのか、とか
詳細がさっぱりわからないんだが、
GetDlgItemIntでぐぐってみるのはどうだろう。
494 :
デフォルトの名無しさん :2006/10/02(月) 12:53:14
>>494 何やら標準入力から10項目のcsvを取り込んで、tagIDごとにファイル出力しているようだが。
取り敢えずコマンドインタプリタで標準入力を取り込みたいcsvファイルにリダイレクトすればいいんじゃね?
#つーか、ここはソフトの使い方すれでもなければ環境の使い方スレでもないんだけどなぁ。
497 :
デフォルトの名無しさん :2006/10/02(月) 14:17:27
>>495 すいません!初心者なので、ぜんぜん分かりません。
リダイレクトとはどうやるのですか?
コマンドプロンプトに何を入力すれば、ファイルのグルーピングがされ
テキストが作成されるのですか?
>>496 正解です。
なんか文字だしたり計算してんのに飽きました ちょっとしたゲームみたいなの作りたいんだけどどうすればいいですか?
>>497 2688.txtをコンパイルしてできた実行モジュールが2688.exeならば、
2688 < recv_20550606162223.log
でOK。
>>498 手軽なところで、Hit&Blowなんてどうでしょう。
fgets()を使えてprintf()を使えるなら作れるでしょう。
501 :
デフォルトの名無しさん :2006/10/02(月) 21:50:15
おながい 標準入力で入力された最後5行を表示するプログラム コマンドから入力、列は固定で行は固定ではない
502 :
デフォルトの名無しさん :2006/10/02(月) 21:53:19
あ、ポインタを使ってで。二次元配列ではなく
自己解決しました
504 :
デフォルトの名無しさん :2006/10/02(月) 22:36:57
昔、変数のtrue/falseをifを使わず一行で切り替えるコードを見て感動したんですが どんなコードか忘れてしまいました。確かビット演算か何かしてたような気がするんですが わかる方いませんか?
ちなみに私は自己解決してませんよ〜 お願いします
hoge = !hoge; hoge = (hoge==false);
sage = sage ? false : true; sage ^= 1; // 微妙
>>488 そう言われて必死に色々参考書読みまくってたら解決しました。
510 :
501、2 :2006/10/02(月) 23:16:37
私も
>>509 さんと同じように頑張って自己解決します。
511 :
501 ◆8zHol6NAOo :2006/10/03(火) 00:46:04
512 :
デフォルトの名無しさん :2006/10/03(火) 00:52:46
Wrapperってなんですか?
クラス内でのみ通用する、constな変数を設定するにはどのようにしたらよいのでしょうか?
>>514 日本語でOK
コンストラクション時に値が決まって、以降内部でも値を動かさない変数が欲しいって話だろうか。
class A
{
const int cv;
...
みたいなことをしたいなら、コンストラクタの初期化子で初期化すれば大丈夫だぞ。
上の例なら
A::A():
cv(12345)
{}
みたいな。
514が欲しているのはprivateなstatic constな定数とも読み取れる。 (そうだとして)それが整数型でなければ、他の静的変数同様定義を書き、そこで初期化すればよい。
>>512 「ぐあい」ね、「具合」。
>>513 包み紙。対象物を直接利用せず、共通I/Fを与える目的などで間接的に利用することなど。
519 :
デフォルトの名無しさん :2006/10/03(火) 19:22:00
windows2000、VC++6で開発しているのですが、 一画面にコントロールを318個(うちスタティックテキストは72個)作りたいのですが、 途中で作れなくなってしまいます。 リソースエディタを使わずに直接rcファイルを書き換えると作れるのですが、 リソースエディタでコントロールをダブルクリックしても新規メンバを作れなくなってしまいます。 なんとか250個以上のコントロールをつくれないでしょうか? 本来は画面設計をしなおして画面を分ければいいので作ってみたのですが、 実際の操作盤と同じような見た目にしたいという強い要望なので、 それに答えられないかなぁと思い質問した次第です。 よろしくお願いします。
リソースエディタを使わずに直接rcファイルを書き換える
一次元の配列int a[5]を関数に受け渡す時引数で配列名を渡すと 仮引数にはint a[]とint *aと二通りに書けますが、 二次元配列int a[3[5]を関数に受け渡す時には引数に配列名を渡すと int a[][5]という書き方とは別にポインタっぽく書くとどう書いたら良いのでしょうか。 int *a[5]かと思ったのですが『問題のあるポインタの変換』と エラーになってよく分からないのでどなたか教えてください。
少し前にも同様の質問があったよな…
523 :
519 :2006/10/03(火) 20:24:40
>>520 そうですね。自分でそう言っていました。
コントロールを作る方法じゃなくて、
「リソースエディタでコントロールを作る方法」か
「rc直書きで作ったコントロールをリソースエディタでダブルクリックして関数を作る方法」
を聞きたかったんですが、
よくよく考えたら、クラスウィザードから作ればよかったんですね。
ありがとうございました。
>>524 うわぁあありがとうございますっ!!!
出来た、出来ました!!
昨日からずっと考えててポインタの本読んだりしてもint *a[5]
ってなると思ったらそういうことでしたか!
>>269 も見たのですが自分の知りたいポインタ風にするってことが分からなくて悩んでました。
出来てホントに嬉しいです!心からありがとうございます!(´;ω;`)ブワッ
>>525 まだ今はわからないかもしれないけど、ちょっとだけ説明しておく。
int *a[5]では、*演算子よりも[]演算子の優先度の方が高いので、
int *(a[5])と解釈される。これは大きさ5のint型へのポインタ配列と
なって意味が違ってしまう。
int (*a)[5]は、int型の大きさ5の配列へのポインタとなり、通常の
二次元配列 a[3][5]は、コンパイラ内部ではすぐにこの形に変換
され利用される。Cでは一番左側の次元以外の大きさを省略でき
ないのはこのためである。
>>526 宣言時に”演算子”を突っ込まない方がいいんでね?
実際演算子じゃないし
>>527 「宣言子演算子」という名の立派な演算子だが何か?
シンボル名って何ですか?
532 :
デフォルトの名無しさん :2006/10/04(水) 12:58:55
os:windows XP 言語はCでお願いします。 コマンドプロンプトを開きます。 C:\Documents and Settings\Owner>cd "\Program Files\TagLocator2005\Sample\bin" C:\Program Files\TagLocator2005\Sample\bin>LpsRecvSample /C:1 9876 1000 1 1 *** SPACEキー押下で受信開始/終了 *** _/*ここでスペースを押します。*/ *** 受信開始 *** _/*ここから1時間後にもう一度スペースを押す。*/ *** 受信終了 *** *** 平均受信0件/秒 *** 以上の操作をプログラムで自動的にやりたいです。
>>532 「以上の操作」のどれをプログラムでやりたいんだ?
まさか、プログラムでスペースキーを押したいだけか?
535 :
デフォルトの名無しさん :2006/10/04(水) 13:35:21
>>534 以下の操作すべてです。
@コマンドプロンプトを開く。
AC:\Documents and Settings\Owner>とでたら
Bcd "\Program Files\TagLocator2005\Sample\bin"と入力。
CC:\Program Files\TagLocator2005\Sample\bin>とでたら
DLpsRecvSample /C:1 9876 1000 1 1と入力。
E*** SPACEキー押下で受信開始/終了 *** とでたらスペース入力。
F1時間後にもう一度スペース入力。
このような操作です。
お願いします。
…(スペース入力が微妙だけど(リダイレクトで済めば)) バッチファイルでいけないか?
「自動的にやりたい」からなんだ? 何を「お願い」してるんだ?
DLLに関しての質問です、色々とgoogleで検索しても具体的な答えが見つからなかったので(汗 関数呼び出し規約に関してですが、__cdeclはC/C++の標準規約、__stdcallはWindowsAPIの標準規約とあります。 で、DLLから呼び出せるようにする関数は__stdcallにしておくべきとありますが、__cdeclでも問題はないのでしょうか? 勿論、C/C++から呼び出す事のみを前提にした場合の話ですが…どなたか、教えて頂ければと(礼
(汗 (礼 特にこの表現が気に食わない
540 :
デフォルトの名無しさん :2006/10/04(水) 17:07:15
速く死ねワロスwwwwwww
542 :
デフォルトの名無しさん :2006/10/04(水) 17:09:12
速く死ぬ姿を想像したら笑った
543 :
デフォルトの名無しさん :2006/10/04(水) 17:10:44
素早く、腹をかっ切るんだろうな。 ところで、おまえの神経質はキモイ。 早く死んでくれないか?
544 :
538 :2006/10/04(水) 17:10:57
>538 ありがとうございます >540 お前誰だよw
545 :
538 :2006/10/04(水) 17:11:29
訂正:>538→>539
>>538 呼び出される側がDLLをまたぐなら、__stdcallにしとけ、スタックがおかしくなるぞ。
DLL内なら、好きにしる。
547 :
デフォルトの名無しさん :2006/10/04(水) 17:12:14
いや、
>>538 の方がキモイ。
おまえ、もう初潮は来たか?
548 :
デフォルトの名無しさん :2006/10/04(水) 17:12:16
訂正しなくていいと思うよ
549 :
538 :2006/10/04(水) 17:15:04
>546 ありがとうございます、という事はDLLからの可変長引数な関数は呼び出し不可でしょうか? DLL・EXE側共にC/C++なら__cdeclで渡せると思ってましたorz >547 秘密です >548 勘違い防止用です
550 :
デフォルトの名無しさん :2006/10/04(水) 17:16:09
551 :
デフォルトの名無しさん :2006/10/04(水) 17:18:36
>>549 だから、お前はしつこいんだよ。
しつこいとまた神経質な奴が出て来るぞ!!
>>551 だから、お前はしつこいんだよ。
しつこいとまた神経質な奴が出て来るぞ!!
昨日からC++関連スレに在日朝鮮人と思われる粘着質が 出没しております。注意!!
555 :
538 :2006/10/04(水) 17:28:08
>>546 user32.dll に wsprintf(A/W) がいて __cdecl 呼び出しの export できていているのだが…
「呼び出される側がDLLをまたぐ」 ということが具体的にどういうことを指してる?
DLL側のコード生成時に前提している呼び出し規約と
DLL関数呼び出し側で把握している呼び出し規約とが一致してないなら
スタック壊しそうだけど
557 :
デフォルトの名無しさん :2006/10/04(水) 17:39:05
>>555 ここで質問するぐらい気にしているし、
お前はググッて調べたんじゃなかったのか?
後だしジャンケンは本当に嫌われるんだよなぁ。
ほんとキモイから、家で引きこもりやってろ!な!
558 :
デフォルトの名無しさん :2006/10/04(水) 17:44:34
559 :
デフォルトの名無しさん :2006/10/04(水) 17:46:45
お前ら迷惑なんだけど?
自作自演乙
cout と printf って使い分けるの。・?
562 :
デフォルトの名無しさん :2006/10/04(水) 18:18:00
すみません。 Borland C++ コンパイラ 5.5.1使っています。 テキストファイルを一括して変数に取り込みたいのですが、 よくわかりません。 何か便利な関数とかないでしょうか? 一行一行を読み込んで、配列に追加していくしかないのでしょうか? C言語2日目なので巧く質問になっていなかったらごめんなさい。
自分はC++かCかで使い分けている。 ただ、coutは可変個機能が無いので、 stdargを使って自前に作っているが。
564 :
デフォルトの名無しさん :2006/10/04(水) 18:47:44
while (何かの条件) { char string[256]; string = ・・・何かの処理・・・ ・・・以下略・・・ } こんな感じでwhileの中に配列の宣言を入れていると メモリをどんどんと食って行くのでしょうか?
行きません。
ループ毎にstringが確保、解放されていく 実際は最適化によって確保部分がループの外に出されて 使いまわされてるかもしれない
567 :
564 :2006/10/04(水) 18:56:06
わかりました。 回答をありがとうございます。
568 :
デフォルトの名無しさん :2006/10/04(水) 21:03:15
Borland のCコンパイラ 5.5.1を使っています。 char str[] = "我輩は猫である。"; とすると配列の長さをあわせてくれますが、 char *s; s = (char *)malloc(100); strcpy (s, "我輩は猫である"); この、文字列の長さに合わせて配列の長さを宣言したいのですが、 どうしたらよいでしょうか? char str[] = s; とか char str[strlen(s)+1]; とかしても 型が変換できないというエラーが出るものでわかりません。
>>568 配列のサイズはコンパイル時に定まっている必要がある。
変数sが指す文字列の長さはコンパイル時に分からないのだから無理。
(配列でないならmalloc(strlen(s)+1)とやればいい。)
570 :
568 :2006/10/04(水) 21:29:43
>>569 ありがとうございます。
配列の可変は無理なんですね。
C++ならば標準ライブラリにvectorというのを見つけて
良さそうだったのですが、ちょっと頭が追いついていません。
mallocやreallocを使ってポインタ操作でいきたいと思います。
回答をありがとうございました。
>>570 そこをなんとかがんばってvectorやstringを使うとかなり楽だyo。
gccみたいにC99の可変長配列をサポートしてるコンパイラだったら可能だけどね。
>>570 領域が足りなくなったらreallocというのも非効率だから、文字列長+1で毎回きっちり確保するのではなく
あらかじめ十分な大きさで確保するというのも良いよ。
それなら固定長配列で十分な大きさを用意しておくというのもある。
「十分な大きさ」というのが決められるような用途でないと使えないけど。
こうすれば楽にできるケースもある、というだけのことだから、
reallocが悪いと言ってるんではないので、念のため。
初めのうちは、勉強のためにいろいろなやり方をやってみるのもいいよ。
574 :
568 :2006/10/04(水) 22:18:53
>>571-573 ご助言をありがとうございます。
C言語をはじめて3日ですので、まずは動くものを作ってから
そのあとに新しいスキルを使って改良などをしていきたいと思います。
実はポインタも何となく理解はしたのですが、まだまだ
考え方が身についていませんので、そっちからやってみたいと
思います。
まだまだ、覚えなきゃいけない基本的な所が多くて大変です。w
575 :
568 :2006/10/04(水) 23:37:39
char *str = (char *)malloc(sizeof(char)*11); strcpy (str, "0123456789"); str = (char *)realloc(str, sizeof(char)*17); strcat (str, "ABCDEF"); printf ("%c\r\n", str[10]); mallocで領域を確保した変数は配列として使えたんだ。 なんだか、まだまだわからん事ばかりだ・・・。orz
>>575 printfなどで改行するつもりなら、\rは要らないぞ。
Cでは\nが改行を表す。
実際の改行コードが\nでない環境(Windowsなど)では、
外部との入出力時に変換がなされる(テキストモードのとき)。
577 :
デフォルトの名無しさん :2006/10/05(木) 02:11:11
質問させてください。 charの配列の中に、全角半角の英字数字漢字からなる文字列 char str{30] ="あ1いa2うA"; があったとき、この文字列の中から、 「全角半角英数字を取り出し、すべて半角英数字」にしたい #上記の例であったとき取り出したい文字列は、"1a2A"です。 チェックする文字列が、半角のみや全角のみであれば 文字コードで見れそうなのですが、 半角と全角がランダムに混じっている文字列をチェックする方法がわかりません。 そのようなことができるメソッドなどあれば、ご教授ください。
>>577 悪い、そんな便利なメソッドは標準には無い。
頭からスキャンして、半角か全角か判定した上で、
全角英数字をおもむろに手で変換してしまえ。
何、大した手間じゃない。
質問です。 クラス(あるいは構造体)においてコピーコンストラクタと代入演算子は定義せずともコンパイラが自動的に作成してくれます。 その際のコピーコンストラクタ及び代入演算子が、どのように作られるのかが分かりません。 色々と調べてみた結果、 コピーコンストラクタ ・メンバがクラスなら、クラスのコピーコンストラクタを使う ・それ以外(組み込み型)なら、ビットを全てコピーする とありました。代入演算子も、同じ考え方で良いのでしょうか?
代入演算子は ・メンバがクラスなら、クラスのoperator=を使う
581 :
デフォルトの名無しさん :2006/10/05(木) 12:23:39
Borland C++ 5.5.1を使っています。 正規表現のライブラリを使ってみようかと思って鬼車をダウンロードしたのですが、 コンパイルでエラーが出ます。 コンパイルの仕方はVCしか載っていないので、コマンドやオプションの違いから わけがわかりません。 BCCでコンパイルできた方の方法や、参考になるサイトなどを 教えてもらえないでしょうか? 色々なキーワードでぐぐってみましたが、お手上げ状態です。 よろしくお願いします。 cl -O2 -nologo /W3 -DHAVE_CONFIG_H -DNOT_RUBY -DEXPORT /I. /I.. /Foreggnu.obj / c reggnu.c process_begin: CreateProcess((null), cl -O2 -nologo /W3 -DHAVE_CONFIG_H -DNOT_RU BY -DEXPORT /I. /I.. /Foreggnu.obj /c reggnu.c, ...) failed. make (e=2): 指定されたファイルが見つかりません。 make: *** [reggnu.obj] Error 2
コマンドプロントを開いて、コンパイルしたいソースファイルがあるフォルダに移動して、 bcc32 hello.cとかやればできるよ。
初心者はコマンドプロント慣れてないと思うから、支援ソフト入れるか、VC使いな
クラスの設計の仕方について質問です 次の二つのクラスの定義で どちらが良い、あるいは使い分けなどあるのでしょうか class NotPointer{ private: MyClass hoge; //... }; ポインタを使わず直接hogeを宣言 hogeデストラクタが呼ばれるので、deleteを気にしないで済む class Pointer{ private: Myclass* hoge; //.. }; ポインタを使ってhogeを宣言 deleteを呼ばなければならない pimplパターンが使える hogeをstlコンテナに入れるならこっち? 下のほうが良いような気もするけど、どうもdeleteし忘れが・・
585 :
デフォルトの名無しさん :2006/10/05(木) 17:00:00
よく車輪の開発って聞くんですが、いったいなんなのでしょうか? 線形リストや双方向リスト、循環リストを作る事ですか? もしくわ、リストで使う構造体のメンバ変数の内容に応じた 関数を作ることですか? それとも全く違うもんなんでしょうか。 どなたか教えていただきたいです。
>>584 >どうもdeleteし忘れが・・
boost::sared_ptr
587 :
585 :2006/10/05(木) 17:03:00
間違えました 循環じゃなく環状リストでした。
>>586 ども、実は今ちょうどboostのインストール中です
基本的にポインタ版に書き換えようと思ってるんですが
shared_ptrなどを使うと
非ポインタ版の有利な点ってほとんどないんかなぁ
typedef void (*FP)( int = 0 ); void func( int ) { } int main() { FP fp = func; fp(); } このようにするとtypedefでエラーが発生してしまいます。 関数ポインタを使用するときはデフォルト引数を使用できないのでしょうか?
typedef void (*FP)( int a= 0 ); やりたいのはこういうこと? できない予感がするがどうだったっけ?
8.3.6-3-にそれっぽい事書いてある。 > This means that default arguments cannot appear, for example, > in declarations of pointers to functions, references to functions, > or typedef declarations.
>>591-592 ありがとうございます。
期待するのはfp();でfunc(0);が呼ばれることだったのですが
どうやらできないみたいですね。
ちなみにtypedefの行での変数名は書き忘れでした。
(書いてもエラーが発生しました)
>>589 >非ポインタ版の有利な点
newする必要がない(スタックに置ける)
595 :
デフォルトの名無しさん :2006/10/05(木) 23:22:27
/*
>>581 bcc32 regexp0.cpp (regexp0.exeは正規表現にマッチした行のみ表示する) */
#define SIZE 4196
#include <stdio.h>
#include <stdlib.h>
#include <regexp.h>
int main(int argc, char *argv[]) {
size_t sLength;
char *p;
char c[SIZE];
switch(argc) {
case 2:
break;
default:
fprintf(stderr, "regexp0 [rR].*p < regexp0.cpp");/* 入力をリダイレクト */
exit(EXIT_FAILURE);
}
TRegexp o(argv[1]);
for(;;) {
p=fgets(c, SIZE, stdin);
if(p==NULL)
break;
o.find(p, &sLength, 0);
if(sLength==0)
continue;
fputs(p, stdout);
}
return EXIT_SUCCESS;
}
596 :
589 :2006/10/05(木) 23:32:08
>>594 なるほど。スタックって早いんでしたっけ
とりあえずポインタを通さない分は早くなりそうですね
ただ、スタックだとヒープのように巨大なメモリは取れなさそうですが
軽い、大量に作成するようなクラス向けってカンジでしょうか
>>596 みたところ、君にはC/C++は向いてないよ。もう止めとけ。
>>597 みたところ、君にはこのスレは向いてないよ。もう止めとけ。
600 :
デフォルトの名無しさん :2006/10/06(金) 05:12:58
char c[] = "def"; std::string s = "abc" + (std::string)c; こんなキャストってやっていいんですかね? 何の問題も無く動くんですけど。
std::stringにはconst char*を取るコンストラクタがあり、暗黙の型変換があるからキャストできる。 さらに、std::string&を返すoperator+(const char*,const std::string&)もある
>>601 なるほど。
ところで、なんでstringには、string::to_int()みたいなメソッドってないのでしょうか?
何か実装する上で問題でもあるんでしょうか?
boost::lexical_cast
boost使えない人ならstd::stringstream
別にatoi()でいいじゃん。
atoiはエラー処理してくんないけどね。
strtol()なら検出できるけど。 #そこまでするならboost使うか。
初心者ですよろしくお願いします。 #include <stdio.h> int main(void) { FILE *fp; int a; a = 1; fp=fopen("test.txt","w"); fprintf(fp,"%d\n",a); fclose(fp); return 0; } ファイルが無い状態で test.txt を作り 1 を書き込めたのですが 繰り返し処理は勉強しますので、 fopenの 1.txtの部分を変数にして 1.txt 2.txt 3.txt ・・・とすることが出来ますか? aの数字と同じ名前のファイルを作りたいのです。 1.txt 内容 1 2.txt 内容 2 3.txt 内容 3 こんな感じです。 fopenって変数使えませんか?
#include <stdio.h> int main() { FILE *fp; int a; char fname[16]; for (i = 0; i < 3; i++) { sprintf(fname, "%d.txt", a); fp = fopen(fname, "w"); fprintf(fp, "%d\n", a); fclose(fp); } return 0; }
どうもありがとうございます。 #include <stdio.h> int main() { FILE *fp; int a,i; char fname[16]; a = 1; for (i = 1; i < 5; i++) { sprintf(fname, "%d.txt", a); fp = fopen(fname, "w"); fprintf(fp, "%d\n", a); fclose(fp); a++; } return 0; } これで1.txt〜4.txtまで書き込みできました。
#include <stdio.h> int main() { FILE *fp; int i; char fname[16]; for (i = 1; i < 5; i++) { sprintf(fname, "%d.txt", i); fp = fopen(fname, "w"); fprintf(fp, "%d\n", i); fclose(fp); } return 0; } でいいね。
>>610 それじゃ1.txtに4回書き込むことにならね?
教えてください。 Visual C++(3)はじめてのMFCプログラミング という書籍の例(VC++ 6)をVS2005上で実行しているのですが、 > m_Job.InsertString(-1, "プログラマ"); のようにしてもコンボボックスに項目が追加されません。 m_Jobはコンボボックスに割り付けたCComboboxクラスのメンバ変数です。 VS2005だと、何か他にすることが必要なのでしょうか?
m_Job.InsertString(-1, _T("プログラマ")); UNICODEのビルド設定の予感。
609さんのをそのままやりましたら
未定義のシンボル i と出まして
int に i を追加してやると
0.txt 内容 0 の1つだけ出来ましたので
a = 1; と a++; 入れたんですが
今 a++;を抜いても同じになりました。
いらないみたいですね。
>>611 ありがとうございます。
a 無くても出来たんですね。
>>614 ありがとうございます。
文字セットは設定なしでプログラミングするようにしています。
解決しました。 コンボボックスの展開したときの大きさが小さく、
項目が追加されていたのが見えないだけでした……。
お騒がせしました。
617 :
デフォルトの名無しさん :2006/10/06(金) 16:13:14
C++でダイアログベースでプログラムを作っています。 プリクリエイトウィンドウが動いていないみたいなのですが、ダイアログベースでは使えないのですか?
618 :
(^-^) ◆MONSOON/qo :2006/10/06(金) 17:08:10
すみません 初心者なんですがwindowsプログラムっていうのはどうやれば良いですか? メニュー出して処理したいんですが
出力結果の値が 1.#INDってなるんですがこれってどういう意味ですか?
622 :
620 :2006/10/06(金) 18:14:57
623 :
デフォルトの名無しさん :2006/10/06(金) 22:21:54
char *srting; while (何かの条件) { string = (char *)realloc(何かの計算); string = ・・・何かの処理・・・ ・・・以下略・・・ } こんな処理を続けていけば、メモリが細切れで使われて効率が 悪く、消費しているメモリがどんどん増えていくのでしょうか? Win95/98とWinNT系ではメモリの管理が違うと聞きますが、 それによって違いなどが出てくるでしょうか? 確かめる方法が思い浮かばないので、どなたかお教えください。
>>623 VC使ってるなら_CrtDumpMemoryLeaks
他は知らない
626 :
デフォルトの名無しさん :2006/10/06(金) 23:54:11
入門者で質問させていただきます。 MicrosoftのVisualStudioっていうものはコンパイルから実行までそれ一つで出来るんですか? ボーランド社のものとかっていうのは用意しなくてはいいんでしょうか?
>>627 MS社製のコンパイラも付属しているから安心して良いよ。
629 :
(^-^) ◆MONSOON/qo :2006/10/07(土) 02:11:23
>>627 ボーランドでもMicrosoftでもコンパイルすれば
ほとんどどのWindowsに持っていっても実行できるよ
まあ、素直にVC使っときなさい。 C、C++と一口に言うが、実作業の効率はIDEへの慣れなんかも含まれるもの。 ならば潰しの利くメジャーな環境を使うのが吉に決まってる。 VCなら、一部の例外除けば大体において最適化性能とかでもBCに勝ってるし、 当然ながら他のMicrosoftのSDK類との親和も高い。
631 :
(^-^) ◆MONSOON/qo :2006/10/07(土) 02:49:21
>>630 学習用にはボーランドがいいよ コンパイルが速いし
632 :
デフォルトの名無しさん :2006/10/07(土) 03:39:52
ずぶの素人です。 株取引のシステムを作るためにC#の学習を始めようと思います。 その前に、サンプルのシステムのプログラムを現時点でどう解釈しているか、 アップして添削してもらっていいですか???? 勉強のとっかかりがないもので…
634 :
(^-^) ◆MONSOON/qo :2006/10/07(土) 03:47:34
635 :
デフォルトの名無しさん :2006/10/07(土) 06:40:17
Visual C++ 2005 Express Editon でHELP希望です UNICODE関係なのですが、W32コンソールアプリです #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { #ifdef _UNICODE printf("_UNICODE defined\n"); #endif _tprintf(_T("あいうえお\n")); _tprintf(_T("abcde\n")); getchar(); return 0; } ----結果---- _UNICODE defined abcde -------- 「あいうえお」が表示されないです 解決方法知ってる人教えてください
正直C++のlocaleと、そのiostreamの仕様は腐っているとしか思えない。 あんなものなら、無いほうがまだまし。 というかなぜロケール外の文字は無効にするんだろう。 余計なお世話という気がしてならない。
SP1ベータで直ってるんじゃない?
639 :
至福 :2006/10/07(土) 10:03:58
はじめまして C言語で素数列挙プログラムをつくっているのですが 高速にするためには剰余計算を 足し算(もしくは引き算)で行うようにするといいと言われました いったいどのようなアルゴリズムで剰余計算を加算(or減算)で おこなえるのでしょうか?
マルチ乙
641 :
(^-^) ◆MONSOON/qo :2006/10/07(土) 10:43:57
50%7=50-7-7-7-・・引けなくなるまで続けた残り
642 :
(^-^) ◆MONSOON/qo :2006/10/07(土) 10:45:33
引き算だと繰り返して判定使うことになるから、50 - 7*(50/7)の方がいいとおもわれ
あんた馬鹿?
>>643 まぁまぁ。
俺には 641,642は見えないから、何が書いてあるのか解らないけど、もちつけ。
>>639 質問の後半は A%B よりも速い剰余計算ってことだよね。
余程の馬鹿コンパイラじゃない限り難しいんじゃないの?
"素数列挙"ってあるから普通のintとかじゃ無いのかも知れないけど。
質問の前半を見ると、あなたがやるべきことは剰余計算の速度アップ
では無い様に見えるが。
GC(ガベジコレクト)の特性についてはよく把握してないんだが、 Rubyをコンパイルするときに最適化の影響でオブジェクトが レジスタにのってメモリ上に存在しないようになると、 GCで回収されなくなるってきいた。 (だからGCCのコンパイルオプションを-O3にするとダメなんだと) 今、Bohem GCを使ったソフトをコンパイルしてるんだが、 最適化オプションは最強にしない方がいいんかな?
Visual Studio.2003 をつかっていてfloat型の256*256の配列をいくつか宣言して 実行時に強制終了するのは何故なんでしょう? 3個の場合は問題なくて5個のときは駄目でした。
スタックサイズの不足。動的確保するかstaticで宣言するかリンカオプションでスタックサイズを変更する。
>>647 スタックがあふれたんじゃね?
いまどきはそれほど気にするほどのものでないけど、
デカめの配列はヒープに確保するのが普通。
>> 648-649 ありがとうございます。動的確保をやってみます。
651 :
635 :2006/10/07(土) 23:38:42
>>636 とりあえず日本語表示できました。ありがとうございました。
652 :
(^-^) ◆MONSOON/qo :2006/10/08(日) 03:11:56
すみません 質問なんですが 数字のnビット目が1なら1を取り出すにはどうしたらいいですか? なるべく計算コストがかからないやつが良いです
X >> n & 1
>>652 「やりたいこと」はわかったから、「やったこと」と「どうなったのか」を頼む。
655 :
(^-^) ◆MONSOON/qo :2006/10/08(日) 03:19:43
656 :
デフォルトの名無しさん :2006/10/08(日) 04:42:25
g++って三項演算子をちゃんと扱えてない気がするんだけどどうですか? pc.reset(id == 0 ? new aaa(0, "Aaa"): id == 12 ? new aaa(12, "Aaa"): new bbb(id) ); みたいなかんじなの
>>656 new aaa と new bbb じゃ型が違うからダメなんだろ。
658 :
デフォルトの名無しさん :2006/10/08(日) 11:37:49
文字列から一行分を取り出すgets見たいな関数って標準でありますか?
660 :
デフォルトの名無しさん :2006/10/08(日) 11:47:13
>>659 速攻でのお答えありがとうございます。
説明不足で申し訳ありませんでした。
でも、ファイルからではなく文字列ポインタから取り出すような
関数ってないでしょうか?
sscanf(文字列, "%[^\n]", 取り出した文字列を格納する場所をさすポインタ);
>>660 strstreamに一旦入れればいいんでね?
findでいいじゃん。 #include<string> #include<algorithm> #include<iostream> using namespace std; int main(){ string s="Hello\nWorld"; string s2(s.begin(),find(s.begin(),s.end(),'\n')); cout<<s2<<endl; }
>>661-663 回答をありがとうございました。
勉強をはじめたばかりで、標準の関数ですっきりと
表記できないかと思い質問をしました。
勉強になりました。
strstreamよりstringstreamの方が新しいのでオススメ
VC2005を使用。 int foo; //...fooに対する演算 int bar[foo];//ここでコンパイルエラー 配列宣言の添え字には定数式が必要だと怒られてしまう。 任意の領域の分だけ確保したいんですが、どうすれば良いですか。
何と言うことだ・・・。 何となく書き込んだら666をgetしてしまった。 不吉極まりない。俺は間違いなく明日死ぬ。
new使えよ >666
いや配列なら vector だろ。
車があるから自転車はいらない。
そうだな、自転車あるから一輪車いらんしな
一輪車があるから足はいらない。
C/C++があるからアセンブラはいらない。
newがあるからHeapAllocはいらない
俺がいるからお前らいらない
何でvectorよりデフォルトでnewを使おうとするやつらが多いんだろ。不思議。
new hoge []なんて 最初にC++学ぶときに解説本のサンプルで使って以来 使わないな
今日があるから明日はいらない
ジャックハンマー乙
>679 scoped_array/shared_arrayに入れるのならまだ許せる。
STLがまともに使えない時代があったからねぇ。 MSDNは、未だに日本語マニュアル提供しないし。
686 :
685 :2006/10/08(日) 23:55:39
あっと環境はwindowsXPです。スレ違いかな?
エラーメッセージも書いてないようだしESPで回答。 構造体を宣言してるヘッダファイル、複数のファイルからインクルードされてない?
688 :
デフォルトの名無しさん :2006/10/09(月) 00:14:34
C++の勉強をしたいのですが、何の本を買ったらいいのでしょうか? 数年前にCをやったことがあります。 あまり覚えていませんけど。 環境はVisual Studio 2005 EE が入っています。 よろしくお願い致します。
プログラミング言語C++。 マジデ。
>>688 たくさん。取り敢えずEffective C++/More Effective C++とか、
独習C++とか。
>>688 Cでどの程度までやったかによる。
C++はCを包含してはいるが、その割合は思ったより小さいぞ。
Cのことなぞ忘れて最初っからC++に関して学べ。
Accelerated C++とか。 そういやC++ Primerが新しくなってたな。やっぱり厚いけど。
レスありがとうございます。
>>689 7000円位する分厚いやつですよね?
第3版の。
>>680 独習C++は結構評判がいいらしいですね。
見てみます。
>>691 結城浩氏の入門書を読んだ程度です。
それ以外は読んでいません。
Cが小さいというか、C++が巨大なんだよな。 以前このスレだかで出た話題では、独習〜系は好みが分かれる様子だった。 俺は個人的には嫌いだけど、合う人もいるのかもしれない。 C++のちゃんとした本っつーと、それこそ「プログラミング言語C++第三版」とかなんだが、 初学者向きとは言いがたい本でもある。 いずれ買うことにはなるとは思うけど。
いい加減、スレ違いだ どうして推薦図書スレに行かないのやら…┐( ̄ー ̄)┌
レスありがとうございます。
>>692 分厚くないのを紹介して頂きたいです。
読みやすいのでしたら、分厚くても構わないんですが。
697 :
685 :2006/10/09(月) 00:35:35
>>687 あ、すみませんエラーといったのは間違いです、コンパイルは通るんですが
実行時にGetOpenFileNameの戻り値がFALSEになっちゃうというわけです。
要はOPENFILENAME構造体のlStructSizeへの指定値がまずいのだと思います。
lStructSizeを直接76にしたらちゃんとファイルオープンダイアログが開きましたので。
ただどうして今までは開かなかったのだろう?と疑問に思った次第でして。
698 :
685 :2006/10/09(月) 00:36:38
今までは開かなかったのだろう? → 今までは開いていたのだろう?
699 :
デフォルトの名無しさん :2006/10/09(月) 00:37:37
ポインタと参照の違いを教えてください。 どうしても同じにしか見えないんです。
中身は同じ。 一番重要なポイントは参照は必ず初期化されなければならないってことかな。 NULLチェックが入らなくなるから重宝するかも。 あとはコードの見ための違いね。
>>699 見えないものをいくら説明したって見えるようにはならんよ。
「何も指さない参照」は存在しない、てことでいいのかな。 ポインタの場合はNULL。
704 :
699 :2006/10/09(月) 01:19:22
レスどうもです。 なんとなくわかったような・・・です。 ポインタを勉強し直した方が良さそうですね。 ありがとうございました。
あとは、参照は何を指すかが初期化時に決まってそれ以降は変更できないけど、 ポインタは何を指すかを好きなように変更できる。何も指さないのもあり。 ポインタの演算で、連続して配置された同じ型のデータをあれこれ指し示すことも可能。
706 :
デフォルトの名無しさん :2006/10/09(月) 01:38:11
>>684 過去(VC6のころ)は提供してた。
なんで英語になっちゃったんだろう?
>>697 今まではどこかで偶然_WIN32_WINNTが適当に定義されていたのでは?
ところでNT系専用のプログラムを作るのではない場合、
個人的には_WIN32_WINNTを0に定義するのがおすすめ。
>>706 つい最近までWebでも見れた(ググれば見つかった)のだが、とうとう消えてしまった。
>>706 まだ規格がきっちり決まっていない頃に実装されたSTLを元にしたマニュアルで、
古くなりすぎて切り捨てたのでは?
たしかにあそこにはドラフトを基にしていると書かれていた覚えがある。
今まで_itot_sのような関数のバッファ指定には _itot_s(774, args ,sizeof(args)); ってやっていたのですが、argsの型がcharからwchar_tになると 文字列長<関数に渡すバイト数 となってあぼんしてしまいます。 こういう関数へのバッファ指定というのは、変数の宣言した長さで直接 _itot_s(774, args, 260); とするのが普通なんでしょうか? 長ったらしくても sizeof(args) / sizeof(args[0]) とか指定するの普通?
711 :
デフォルトの名無しさん :2006/10/09(月) 16:12:38
ポインタは常に0がセットされていないことを確認することって、本に書いてあるがそれは、なぜ?
意味的にsizeof(args) / sizeof(args[0]の方が分かり易いと思う。 配列の要素数を求める関数テンプレートって、標準かboostになかったっけ?
713 :
デフォルトの名無しさん :2006/10/09(月) 16:24:01
>>710 >文字列長<関数に渡すバイト数 となってあぼんしてしまいます。
3引数を取る _itot_s の仕様をよく確認してみると隠者内科医?
まあそれはともかく
>_itot_s(774, args, 260); とするのが普通なんでしょうか?
数字を直書きは普通しない。BUF_SIZE みたいな識別子を使うのは普通。
sizeof/sizeof も普通。C++ だと template の推論機能で同じことが出来る。
C++版 _itot_s がバッファ長を必要としないのはこの機能を使っているから。
714 :
デフォルトの名無しさん :2006/10/09(月) 16:43:48
free() によって開放されたメモリ領域へ アクセスするバグを南斗言いますか?
>>712-713 なる。勉強になります。
確かに、標準関数だとバッファ長求めないものがありました。
WinAPIだと必須ですけどsizeof/sizeofも単純な
マクロかtemplateで書けるようなのでそっちにすべきですね。
>関数に渡すバイト数
渡すのは文字単位ダネ
オーバーラン (Overrun)?
AV!?Adult Video!(;´Д`)ハァハァハァハァ
Access Violation
723 :
デフォルトの名無しさん :2006/10/09(月) 23:10:10
関数ポインタの使用用途がわかりません。 教えてください。
>>723 qsort(), bsearch()のマニュアルページでも参照してください。
関数内でmallocで宣言した領域は関数が終わると freeを使わなくても開放されたと考えていいの?
727 :
デフォルトの名無しさん :2006/10/09(月) 23:22:03
HファイルとCppファイルに分ける意味がわからん。
>726 いいえ >727 そんな貴方におすすめのJava
731 :
726 :2006/10/09(月) 23:38:51
>>728-730 回答ありがとうございます。
そうだったんですか。
関数の返値に使っているんですが、どうしたらよいでしょうか?
最初に関数外で定義しておくべき?
>>731 場合による。
あらかじめ必要な容量がわからない場合にはその関数内で確保することも止む無し。
メモリの解放は呼び出し側で行うことをドキュメントに記載せよ。
733 :
726 :2006/10/09(月) 23:47:16
734 :
デフォルトの名無しさん :2006/10/09(月) 23:50:32
int (*(*p()))(int (*[])()); ってなんですか?
int (*(*p()))(int (*[])()); 戻り値がintで引数なしの関数ポインタの配列を引数に取る戻り値がintの関数のポインタのポインタを返す関数のプロトタイプ宣言
ちょっとした質問なんですが operator=をprivate宣言したクラスAがあったとして A a; A b = a; としたときbの初期化はコピーコンストラクタによって行われますよね?
おっとしまった。 戻り値がintで引数なしの関数ポインタの配列を引数に取る戻り値がintの関数のポインタのポインタを返す引数なしの関数のプロトタイプ宣言
日本語で説明してもらうより、int (*(*p()))(int (*[])());を直見した方が理解が容易い俺は脳内にCコンパイラが入ってるのだろうか。
そういやエディタに自動インデントも対応括弧強調も無かった頃のLISPプログラマってどうやってたんだろう
emcas使ってた
やっと理解できた。 #include <stdio.h> int (*(*p()))(int (*[])()); // p is function returning pointer to pointer to function with array of pointer to function returning int returning int int f(int (*[])()); int (*g)(int (*[])()) = f; int (**h)(int (*[])()) = &g; int x(); int y(); int (*a[])() = {x, y}; int main(void) { printf("%d\n", f(a)); printf("%d\n", (*g)(a)); return 0; } int (*(*p()))(int (*a[])()) { return h;} int f(int (*a[])()) { int i = a[0]() + a[1](); return i; } int x() { return 1; } int y() { return 2; }
あ、この方がいいな。 printf("%d\n", (**h)(a));
744 :
デフォルトの名無しさん :2006/10/10(火) 00:54:19
つか、そんなの理解できる必要は無い
ややこしい宣言を見ると、無理矢理動くプログラムにしたくなる俺は変態でつか?
そこでリファクタリングですよ
typedef int (*arg[])(void) ; typedef int (**ret)(arg) ; ret func(void) ; int (*( *p() )) ( int (*[])() ) ; int main() { std::cout << typeid(func).name() << std::endl ; std::cout << typeid(p).name() << std::endl ; } たまたまスレを見たばかりに、30分も暇つぶししてしまった。 なるほどなるほど。
class使わないでnamespaceだけで書いてる僕は、アホなんでしょうか?
>>748 関数のみを分類したいならそれでもいいでしょうが、
データを分類したくなると構造体を使いたくなりませんか?
構造体を用意したら、その構造体のメンバをアクセスする関数を作ってカプセル化したくなりませんか?
もし同意できないようでしたら阿呆ですが、同意できるかどうか判断できないのでしたら勉強不足ということですね。
Cを勉強中の初心者です。 ファイルのオープンに失敗したとかで、強制的にプログラムを終了させたいときに exitを使いますよね? 参考書によっては、exit(-1)だったりexit(1)だったり、 引数が違うんですけど、何か意味があるんでしょうか?
751 :
750 :2006/10/10(火) 04:11:23
あわわ…↑の方に書いてありましたね! スルーしてください。すいませんでした
ドンマイ
ファイルを任意の位置から指定した範囲だけ読み取りたいのですが、どうすれば良いんでしょうか。
任意の位置に移動してから、範囲を指定して読み取るしかあるまい。 特殊なオープンの仕方、とかは無いな。
fseek、ftellとかでね。
ftell()は要らんがな。
ファイル先頭よりバイト数ではない位置から バイト数ではない範囲 (読んでみないとわからないようなフォーマットでの勘定とか) とかだと 先頭から逐次読みながら必要かどうか判断しないといけないかも
759 :
デフォルトの名無しさん :2006/10/10(火) 21:21:55
最近C++の勉強を始めたんですが、 C++ではクラス名の前には必ず"C"をつけるものなんでしょうか? つけなくてもコンパイルは通るみたいなんですが。
構造体に_t付けるようなもの。 好きな名前付けるがよろし
キモイ命名法だなあ
昔Microsoftがそういう書き方を推奨してたってだけ ハンガリアン記法 でググルと吉
俺はつけない。
おれも前C付けてたことあったが、 クラスしか使ってないことに気づき、止めた
長いものには巻かれろってことで、俺は付けてるけどね。 マイクロソフトが長いものかどうかは賛否両論あるだろうが。
環境はVC++ .Net 2002版です。 char c[256]; int i; for(i=0;i<256;i++){ c[i]= i; } とした結果、c[]の0x81から0x9Fと 0xe0から 0xfcには0が入ってしまいます。 char型には代入できない値があるのでしょうか? 単純に指定した値0〜255を代入したいのですが。
767 :
(^-^) ◆MONSOON/qo :2006/10/10(火) 22:09:42
>>766 unsigned charを使おうぜ!
i とか dw とかは嫌いだけど、C、g は使うな。たまに p も。
770 :
デフォルトの名無しさん :2006/10/10(火) 22:21:48
将来に備えて、 char c[256]; を long long c[256]; にしる。
>>765 そのMicrosoftは.NET Frameworkからハンガリアン記法を捨てていますが。
766です。レスありがとうございます。 デバッガの変数ウィンドウで確認しているのですが unsigned charとしても同じでした。 いま組んでいるプログラムで大事な部分なのでショックなのです。
773 :
しょう :2006/10/10(火) 22:33:46
色々なサイトに入って行ったら、virtual DAEMON manager V3.47と言うパソコンの右下に出て来てしまい、パソコンを再起動してもデスクトップから消えません。どうすれば消せますか。
>>772 符号は全く関係ない。
> デバッガの変数ウィンドウで確認
これが怪しい。何を持って代入されてないと思っているのかが。
for(i=0;i<256;i++){
printf("02X\n,(unsigned)c[i]);
}
これでどう表示される?
>>773 OSを再インストールするかPCを買い換えればいいと思うよ
776 :
デフォルトの名無しさん :2006/10/10(火) 22:40:29
>>773 WWWWWwwwwwwwwwwwwwwwwwwww
>>773 こういうのって釣りだよなぁ。
うむぅ。
まずさ、 > 0x81から0x9Fと 0xe0から 0xfc これがさ、まんま Shift-JIS の半角文字コードじゃん あやしい
766です
CString str;
str.Format("%02X\n", c[0xe0]);
AfxMessageBox(str)
上記にて確認したところ、値0xE0は正常に入っていました。
デバッガでは値欄に0が入っていたので、悩んでました。
>>774 さん、ありがとうございます
780 :
デフォルトの名無しさん :2006/10/11(水) 00:25:43
文字列strから、一行毎を取り出してstr2に入れるルーチンを 考えたのですが、もっとエレガントにする方法はないでしょうか? 何となく面倒な方法をとっているような気がするのですが、 これ以外の方法が思いつきませんでした。 よろしくお願いします。 ----- ↓ テストしてみたソース ----- #include <stdio.h> #include <string.h> main() { char str[] = "ABCDEF\nGHIJK\nLMNO"; // 文字列の最後に改行がない可能性もあります char str2[16]; // 配列を16文字にしているのはこの場合は適当です。 char *s; while (sscanf (str, "%[^\n]", str2)) { printf ("%s\n", str2); // 内容確認のための表示です。 s = strstr (str, "\n"); if (s) { s++; strcpy (str, s); // strの内容は破壊されて大丈夫です。 } else break; } return 0; }
sopen(); sgets(); sclose();
>>780 取り敢えずいいんでない?
文字列処理にもっとなれてくればもっと手ごろな方法も思いつくだろうけど。
まぁ、strstr()はstrchr()で充分だね。
>>781 sgetsがあったら良いのにというのは見つけましたが・・・。
すみません、よくわかりませんでした。
>>782 ありがとうございます。
なにぶん、勉強をはじめて一週間ほどですので頭の回転が
追いついておりません。
関数はstrchr()を利用したいと思います。
収穫となるご助言をありがとうございました。
784 :
デフォルトの名無しさん :2006/10/11(水) 02:16:46
i=rand()/RAND_MAX,j=rand()/RAND_MAXで選ばれたi,jの2次元配列 grid[i][j]に隣接している配列(grid[i+1][j],grid[i-1][j],grid[i][j+1], grid[i-1])の最小値をgrid[i][j]に代入するプログラムを作りたいのですが どうすればよいでしょう? ちなみに上のは全体がループの中でi,jは毎回選ばれます。grid[i][j]が の中身が空の時のみくりかえし処理されます。
> i=rand()/RAND_MAX 0 しか入らないぞ >ちなみに上のは全体がループの中でi,jは毎回選ばれます。 日本語でおk >grid[i][j]がの中身が空の時のみくりかえし処理されます。 空ってなに int g0 = grid[i+1][j]; int g1 = grid[i-1][j]; int g2 = grid[i][j+1]; int g3 = grid[i][j-1]; grid[i][j] = min(g0, min(g1, min(g2, g3))); でええんちゃう 端のグリッド選んだときに注意な
ごめん、分かりにくく書いてしまった。つまり、このようなプログラムを書きたいのです。
#define grid[L][L]
clear_grid(i,j,label); //グリッド全部を0(空)にする関数。grid[i][j]=0
int i,j,n;
i=(int)((L-2)(double)rand()/RAND_MAX+1);//1からL-1までの乱数を用意。
j=(int)((L-2)(double)rand()/RAND_MAX+1);
label[i][j]=1; //最初のラベルは1
largest =1; //最大のラベル。。。最初は1
for(n=2;n<L*L;n++){
i=(int)((L-2)(double)rand()/RAND_MAX+1);//1からL-1までの乱数を用意。
j=(int)((L-2)(double)rand()/RAND_MAX+1);
if(label[i][j]=0){ //でたらめに選んだサイトが空の場合のみ実行
if(label[i+1][j]+label[i-1][j]+label[i][j+1]+label[i][j-1] ==0){//隣のサイトも空の場合
largest=largest+1; //最大ラベルを更新
label[i][j]=largest; //最大ラベルをそのサイトに付けます。
}else{ //近隣のサイトが空で無い場合
check_neighbor(...); //近隣サイトの最小ラベルをそのサイトのラベルにします。
}
}
という感じのプログラムで、check_neighbor(...)の関数の中身を作るのに
四苦八苦してました。
>>785 さん、ありがとう。最後のラインは考えつかなかったです。
>>785 さん、ありがと。
何とか、Percolationのシミュレーションが出来ました。
788 :
デフォルトの名無しさん :2006/10/11(水) 10:20:10
アホな質問で申し訳ないのですが、もし宜しければお答えください。 簡単なゲームを作るとして、メーン関数、描画関数、入力関数とファイル分割して 作成しようとし、描画関数と入力関数とで共用して使う変数Aは何処で どう宣言すればいいのでしょうか?
extern
printfで文字を表示するのですが、文字の色を指定するのを 簡単にする標準的な関数などはありますか?
>>790 環境依存である
ANSI標準だと全くないはず
792 :
デフォルトの名無しさん :2006/10/11(水) 10:54:23
Cのコンソールで日本語をキーボードから直接入力する方法はありませんか?
ありますよ
>>796 いや実行画面で
editboxに入力するような感じでできないかと
自分のプログラム上でIMEの制御をしたいというのならWinAPIスレへ。
自分で入力する文字列を日本語にしたいというならPC初心者板へ。
どう考えても
>>792 は後者だろ?
alt+漢字はダメダメのダメなの?
自作したい可能性も捨てきれないな
いや待て、Windows以外かもしれないぞ!
前者というかそれをコンソールで出来ないかと 入力したローマ字に応じてカナ文字に変えていく事になるんですか?
いまどき珍しいCUIだったりする?
何をしたいのかさっぱりわからない
BCCですがkbhit()とgetc()でローマ字は入力できますよね それを例えば配列に入れて先頭から'a'なら'あ'、 'k''a'なら'か'を出力みたいな事がもう少し楽にできないものかと
BCCですがkbhit()とgetch()×2回で日本語入力できます
コンソールへの日本語の入力方法がわからないなら
>>796
getsじゃダメなの?
もしかしたらかな漢字変換のアルゴリズムについて研究してるのかも
>>807 適切な板に誘導されてるんだから、誘導された板で聞いてみたら?
>>806 getch()2回なんてやり方があるんですか。調べてみます
ありがとうございました
>>807 getsから2つ取り込めばできるかもしれませんね・・・。どうもです
>>807 gets() を推奨するな。
fgets() にしとけ。
>>810 fgets(buf, 2, stdin)
813 :
788 :2006/10/11(水) 21:45:12
>>789 レス遅くなりましたが、有難う御座います。
814 :
デフォルトの名無しさん :2006/10/11(水) 23:58:35
prinfの中で""を使って ここは"東京"です。 という風にしたいのですが、どうしたらいいですか?
printf("ここは\"東京\"です。");
printf( "%5d",a); のようにaを5桁表示したい場合なんですが、 この「5」桁というのをマクロで定義しておいて、後から変えたいと思ってるんですが、 #define KETA 5 pritnf( "%KETAd",a); こんな感じでやったら %K と ETAd に分かれてしまって、うまくいきませんでした。 何か良い方法ありますか?
>>818 void prt(int KETA, int a){
char s="% d";
if(!(1<=KETA && KETA<=9)) return;
s[1]=KETA+'0';
printf(s,a);
}
ってできたっけ?
char s=..; ↓ char[] s=..;
>>818 #define KETA "5"
printf( "%"KETA"d",10);
#define KETA 5
printf( "%*d,KETA,10);
822 :
818 :2006/10/12(木) 00:49:48
>>819 関数にするんですか…なるほど
>>821 そういう方法もあるんですね。
試したらできました!
みなさんありがとうございました!
> 関数にするんですか おいおい
どちらに置いてもよい。 どっちかっつーとどっち側寄りどっち側所属なのかをよく考えて、 好きな方に置くとよい。 でもそもそも変数を共通で使いまわすやり方は、きょうびあまり流行らない。 C++なら、メーンのクラスを一っこ書いて、そこから描画と入力を呼び出すようにするとよい。 ファイルを分割した方がいいかは、書いたコードの量と相談して決めるとよい。 よいったらよいぞ。メーン。
ドウッ!コテッ!
先生!
>>826 君がツキやってます!
月に代わって……やめた。
ofstreamでファイルに出力する際に、小数点以下の出力する桁数を設定したいのですが、 setprecisionを使おうと fout<<setprecision(20); のようにすると、コンパイルできません。 どこのようにすればよいのでしょうか?
>>827 それではどこが悪いか判断しかねる。
エラーメッセージを張りなさい。
#include <iomanip>
iomanipをincludeしてないんじゃね?
831 :
827 :2006/10/12(木) 08:03:32
thx
832 :
デフォルトの名無しさん :2006/10/12(木) 08:30:51
visual C++ 5.0ではビルドできたソリューションやソースがVisual Studio 2005 Express ではビルドできないってことあるんでしょうか? visual C++ 5.0でかかれたオープンソースがマニュアルに従ってビルドしようと思ってもどうしてもできなくて困ってます. ヘッダファイルが足りないとかじゃなくて「';'が'&'の前にありません」とか,そういうソースの書き方に問題があるらしくエラーが出てしまうんです.
クラス名を変更せずに、継承して機能を追加することはできませんか?
>>833 ただ答を言うなら「できる」になるけど、あんたのそれはまず間違いなく
訊きたいことと訊いてることが一致していない。
>>833 裏側にありそうな話としては
・継承して機能を追加するには、クラス名を変更しなければならない
こういう考え方結構好き
837 :
デフォルトの名無しさん :2006/10/12(木) 09:28:02
>>834 visual C++ 6.0ならできたりするんでしょうか?
「初心者歓迎」っていっても程度があると思う >814とか>818とか,リファレンスを読めばすぐ解ることまで人に聞くのはいかがなものか
だと思うならスルーするべきだと思う 答える気もないのに提言をした気になって一人前のつもりになるのはいかがなものか
842 :
デフォルトの名無しさん :2006/10/12(木) 12:32:40
>>841 ですかー.
またなんとかやってみます.
どうもありがとうございました.
template <class Super> class Foo : public Super { }; みたいにやって Foo<Bar> a; // Barの機能を追加したFoo Foo<Baz> b; // Bazの機能を追加したFoo みたいにしたいんですが、SuperからFooのメンバにアクセスするにはどうすれば良いですか? (私は833とは別人です)
Super クラスに interface 用の virtual なメソッドが置いてないなら Super クラスの設計ミスっぽいが… 「this に対して dynamic_cast で 型チェックしながら回す?」のも そのコードを "Super クラス内で記述する" には、既に継承された子一覧がないと…ムリポ # Super* なポインタだけど、実体は Foo<Bar>, Foo<Baz> ならやりようはあるんじゃね?
VC2005を使用しています。 char配列を0xFFFFF確保しようとすると、異常終了してしまいます。 約1MBで異常終了なんですが、本当は15MBくらい必要なんです。 どうしたら良いですか。
template <template <class> class Super> class Foo : public Super<Foo> { }; としてSuperの中で static_cast<Foo>(*this) するといける。
訂正 template <template <class> class Super> class Foo : public Super<Foo> { }; template <class Derived> class Bar { void f(){ Derived& derived = *static_cast<Derived*>(this); // derivedのメソッドを呼び出す。 } }; これで Foo<Bar> hoge; hoge.f(); とするといけるはず。
848 :
844 :2006/10/12(木) 13:50:36
>>847 かなり複雑な template の使いまわし方だ orz
template<type> で type がさらに template になってるから ややこしいったらありゃしないw
>>843 の意図が微妙だな。
Super のメソッド内記述で Derived へアクセスしたいように見えるけど、
>>847 コードはダメだよね?
クラス内で複数のメソッドで共有できる定数を使いたいのですが、 どのように書けばよいのでしょうか?
851 :
847 :2006/10/12(木) 14:09:11
ごめん
>>847 のコードじゃ通らないやw
このコードは通るけど
#include <iostream>
#include <string>
using namespace std;
template <class Derived>
class Bar
{
public:
void f(){
Derived& derived = *static_cast<Derived*>(this);
cout << "call method of " << derived.name() << endl;
}
};
// ここのBarを決め打ちしたくない
class Foo : public Bar<Foo>
{
public:
string name(){
return string("Foo");
}
};
int main(){
Foo a;
a.f();
return 0;
}
う〜む。
char *str; str = (char *)malloc(4); strcpy (str, "ABC"); str++; printf ("%s", str); free (str); としたときに開放されるメモリはmallocで獲得した領域から? それとも+1された領域から開放されて、この場合は1バイトが ゴミとして残るのでしょうか? それとも開放されないのでしょうか? str--; printf ("%s", str); free (str); printf ("%s", str); をつなげたら次のように表示されました。 BCABC「@
してはいけない
何をしてはいけないかを教えてください。
するなといったらするな
非NULL で malloc の戻り値でない値に対しての free は動作未定義 ポインタ操作したいなら、ポインタのコピー取っとけ char* str; char* p; p = str = (char*)malloc(4); p++; とかポインタ操作 ...... free(str);
mallocの戻り値以外をfreeしてはいけない。 またfreeしても、使っていたメモリは(たいていは)そこにそのまま残っているが アクセスしてはいけない。
アブノーマルな思考ワロス
>>856-857 malloc の戻り値でない値に対しての free は動作未定義
という事でしてはいけないのを理解しました。
ありがとうございます。
>>858 喜んでいただけて何よりです。(笑)
動作未定義というのはな、何があってもシランという恐ろしい仕様だ。 OS道ズレで落ちる 〜 何もしない までバリエーションは色々
鼻から悪魔
文字列から数字の変換は i = atoi(str); のようにやるみたいなので、文字列の中の一部(必ず2文字目)から0〜9の一桁を取りたいと思い、 i= atoi(str[1]); とやるとcharからconst char *に変換できませんって言われます。 どうやれば一桁の数字だけを取れるんでしょうか?
str[1]-'0'
おお、なるほど。 0のアスキー番号を引けば、欲しい数字になるんですね。 ありがとうございました。
初心者なら初心者らしく素直に聞いとけと言いたいんだが、自分の意見を 出して反発する初心者には正直うんざりする。 こういう馬鹿が一番学びが遅い。
賛成しかねるな。
まぁ、該当者が絶対賛成したがらない意見だからな。
教えてもらったものを盲目的に受け入れててはいつまでたっても初心者だ。納得するまでいくらでも疑問をぶつけるべきだと思う。 ただし疑問をぶつける先はまずGoogleや書籍などであるべきだな。何でも人に聞こうとするやつはもっと成長しない。
後の869である。
871 :
デフォルトの名無しさん :2006/10/13(金) 00:03:29
宿題まだ?
残念ながらここは宿題スレではない
873 :
デフォルトの名無しさん :2006/10/13(金) 00:13:04
#include <stdio.h> int main(void); int main() { printf("質問まだー\n"); main(); return 0; }
875 :
デフォルトの名無しさん :2006/10/13(金) 00:20:28
うむ、スタックを消費しきって止まるな。
877 :
1/2 :2006/10/13(金) 00:51:37
設計について質問させてください 現在、再利用可能にしようと思い、ウィンドウをクラス化してます 次の状態で、ウィンドウA以下を再利用したいんですが まだ、ウィンドウメッセージのやり取りに関する知識が少なく どのようにすべきか悩んでいます メインウィンドウmain 子ウィンドウchildA (mainと同じサイズ) 子ウィンドウchildB (childAの左半分に配置) 自作コントロールCtrlA (childBと同じサイズ) 子ウィンドウchildC (childAの右半分に配置) 自作コントロールCtrlB (childCと同じサイズ) 現在、ウィンドウは配置したところまで出来ており main以下全てのクラスはそれぞれのウィンドウのプロシージャを持ってます
878 :
2/2 :2006/10/13(金) 00:53:09
childAのプロシージャにchildB&C,CtrlB&Cの関連を記述すれば childAを他プロジェクトでそのまま再利用できると思ったんですが 例えばCtrlキー+TabキーでCtrlA→CtrlBにフォーカス移動するという処理は フォーカスがあるCtrlAにウィンドウメッセージが行きますよね ChildAで情報を管理したいのに CtrlAにメッセージが行くのでどうやっていいかわからず 手が止まっています この場合、どうすればchildAでメッセージ処理できるのでしょうか 後言い忘れましたが環境はwindows2000,VC8です 長文ですいません
879 :
デフォルトの名無しさん :2006/10/13(金) 01:14:26
880 :
デフォルトの名無しさん :2006/10/13(金) 01:14:34
>>876 未だにCコンパイラは未到達コードの除去や末尾再帰のループ展開をしないのか?
882 :
デフォルトの名無しさん :2006/10/13(金) 01:19:57
こんなのもできないのかと 思われそうですがファイル名から拡張子を抜くような 処理を作りたいのですがどうすればよいでしょうか・・・ ahoaho.txt → ahoaho のようにです。
最後に見つかったピリオドを'\0'に置き換える。 WindowsならそれやってくれるAPIがある。
char abc[]にahoaho.txtが入っているとする。 *strchr(abc, '.') = '\0';
あ、見つからないとNULLを返すので char *p; if (p = strchr(abc, '.')) *p = '\0'; の方がいいか。
886 :
デフォルトの名無しさん :2006/10/13(金) 01:26:32
cygwinの更新インストールってそのまま何もいじらないでOK押していけばいいんだよね?
>884 strchrだと最初のを見るから hoge.tar.gzとかの扱いはどうなるだろう。 882がhoge.tar.gzからhogeにしたいのかhoge.tarにしたいのかよくわからんけど。
strrchrだっけ?
関数に纏めるとこうなるかな。 char * basename(const char * path) { if (path == NULL) return NULL; const char * dot = strrchr(path, '.'); if (dot == NULL || dot == path) return path; * dot = '\0'; return path; }
(゚Д゚;)
Iteratorが使いにくいです。 Javaの方がいいぞ。
>>891 そうですか
いい発見ができてよかったですね
893 :
デフォルトの名無しさん :2006/10/13(金) 02:19:08
894 :
デフォルトの名無しさん :2006/10/13(金) 03:22:04
質問です。nanosleepより短いスリープについてです。 環境:Linux(GCC) Linuxのタイマの分解能は10msecで、nanosleepの引数 timespecのtv_secに0、tv_nsecに10を入れても10msec+プロセス復帰のための 10msecで合計20msecがスリープの最短だと聞きました。 また同時に、この制限を取り払うハイレゾタイマというのを聞きました。 ぐぐったところclock_nanosleepというシステムコールとlibposixtime.soをリンク させれば良いらしいというところまでは分かりました。 このclock_nanosleepについて教えて下さい。 4つの引数のうち後半2個はnanosleepと同じだと思いますが、前半二個 特に1個目がどうにも分かりません。 友人はCLOCK_REALTIME_HRでと言ったのですが、未定義になります。 ぐぐるとCLOCK_REALTIMEかCLOCK_MONOTONICしか指定するなと 書いてある気がします。 二個目の引数も良く分かりませんが、二個目はTIMER_ABSTIMEで良いような気がします。 1個目と二個目について何が正しいのかご教授下さい。
CLOCK_REALTIME_HRは削除された模様。 代わりにCLOCK_MONOTONIC_HRを使用するよろし。 二個目はその通り。 TIMER_ABSTIMEを入れなされ。
上のfor文と下のwhile文で同じものを作ったつもりなのですが、コンパイルしたら違う値になってしまいました。 作ろうとしたのは0〜100までの偶数を表示するプログラムです。 どこが違うのか教えてください。 #include <stdio.h> int main<void> { int s; for(s=0;s<=100;s=s+2) { printf("%d\n",s); } printf("\n"); s=0; while(s <= 100) { s=s+2; printf("%d\n",s); } return 0; } Cは本当に始めたばかりの初心者です。お願いします。
for (初期化部; 継続条件; 更新部) { 複文 } と等価にするには、 初期化部 while (継続条件) { 複文 更新部 } とすればよい。つまり、 s = 0; while (s <= 100) { printf("%d\n", s); s += 2; } となる。
while(s <= 100) { printf("%d\n",s); s=s+2; } だと思う Cは本当に始めたばかりの初心者です。実はよく分かりません。
>int main<void> ?
ワロス
msvcrtd.lib;msvcprtd.libを無視すると randが使えなくなり 無視しないと、別のライブラリと衝突するのです どうしたらいいですか?
もるすあ マルチスレッドDLLをマルチスレッドにしたら良かったン 何故 VCのデフォルトは、マルチスレッドDLLですか?
ミリ秒時間から乱数を発生させるとか my_rand(int max) { return clock() % (max + 1); }
boost::random
>>897-898 ありがとうございます。できました。
>>899 ここはいつもvoidじゃないんですか?知らずにいつも入れていましたが…
( )と(void)の違いってなんですか?
丸括弧を使えってこった。タイプミスだろうけど。(というかコピペしろ) あといつもvoidなわけじゃない。コマンドライン等から引数を取るプログラムは int main(int argc, char *argv[]){ /* 略 */ } 等となる。
>>904 そんな君にお勧めな実装
int real_rand()
{
static int x = 0 ;
return x ;
}
もし、アルファ線や中性子線が、たまたまxの部分のメモリにぶつかれば、値が変わる。
これぞ真の乱数といえる。
頭が痛くなってきた
>>908 あほか
そんな強い放射線が当たったら、CPUやメモリやチップセットが全部壊れるわ
マルチスレッドDLLをマルチスレッドにしたら randつかえたんのんよ
913 :
912 :2006/10/13(金) 16:09:47
×宇宙船 ○宇宙線
914 :
デフォルトの名無しさん :2006/10/13(金) 16:36:47
#define TMP_SIZE 256 として、文中に int i = TMP_SIZE-1; とあった場合、コンパイルの時に“TMP_SIZE-1”の部分は “255”と最適化される“可能性”はあるのでしょうか? (コンパイラによりけりという話は置いておくとして) それとも、こういう時は“256-1”にしておかなければ いけないなどの決まりなどがあるのでしょうか? 常識なのかもしれませんが、勉強したてで解りません。 調べたサイトなどを見つける事がきませんでした。 すみませんがお教えください。
最適化も何も、定数の展開・計算はコンパイル時に普通に行われることだが・・
917 :
デフォルトの名無しさん :2006/10/13(金) 16:43:47
>>915 ありがとうございます。
気になっていたモヤモヤが取れました。
関数の呼び足しにぶつかったら できのわるい乱数になるなw
919 :
デフォルトの名無しさん :2006/10/13(金) 17:12:21
すみません 教えてください VC6.0+WINです struct info { info () { pBody = new char [255]; } int iType; char* pBody; } こんな感じで構造体を定義ていおいて void test (info* p) { strcpy (p->pBody,"kk"); } 関数内で使おうとすると例外エラーがでます これは どのように解決すればよいのでしょうか? おねがい いたします
struct info { char* pBody; info () { pBody = new char [255]; } int iType; } だと思う。 Cは本当に始めたばかりの初心者です。実はよく分かりません。
info*に実体が無いのでは?
>>919 構造体宣言の{}の最後に「;」がついてない
あとvoid test (info* p)じゃなくてvoid test (struct info* p)?じゃね?
あと構造体はちゃんとインスタンス化したか?
擬似乱数でいいならVCのCRTソースをパクってくればいいのに
925 :
923 :2006/10/13(金) 17:46:50
ごめん >あとvoid test (info* p)じゃなくてvoid test (struct info* p)?じゃね? これはいらなかった
926 :
919 :2006/10/13(金) 18:07:13
ありがとうございます 書式に関しましては申し訳ありません・・ void test (char* p) { p = new char [255]; } この形はできないのは承知してるのですが これに類する問題なのでしょうか? void test (char** p) { *p = new char [255]; }
>>919 info* p;
test(p);
上のようにしているならダウト。実体を用意しろ。
info infomation;
test(&infomation);
ここでは、926は関係ない。
あと、pBodyがきちんと解放されるように対策を講ずるべき。
ダウトって 「間違い」 じゃなくて 「疑惑」 って意味だよな?
929 :
919 :2006/10/13(金) 19:39:56
>>927 はい 実際はそのようにおこなってます
また、構造体のiTypeに与えてある値はきっちりとれます
開放はデストラクタで行っています
説明不足ですみません。
930 :
デフォルトの名無しさん :2006/10/13(金) 19:41:17
>>928 しーーーっ、ちょっとこちに来て、そんなこと、言っちゃだめよ、ヒソヒソ。
>>919 1.info(){printf("コンストラクタ");} とかしてみて本当にコンストラクタが実行されてるか確認する
2.本当にstrcpy実行時にエラーが出ているのか確認する
3.それだけの情報じゃエラー原因がわからないかもしれないので他の情報もここに書き込んでみる
cで FILE *a,*b,*c; a=fopen("hogehoge1.txt","r"); b=fopen("hogehoge2.txt","r"); c=fopen("hogehoge3.txt","w"); と3つのファイルを開きたいのですがhogehoge3.txtが開けません c==NULLです これはアクセスできるファイルの数に限りがあるということですか?
文字列をクイックソートで並べ替える関数です。 サンプルを移したものなんですが、ときどきバグって変な文字列を返してきます。 どこが悪いんでしょうか? char *quicksort(char *pa,int len){ char t; int i,j; if(len == 2){ if(*pa > *(pa+1)) swap(pa,pa+1); }else if(len > 2){ t = *(pa+len / 2); i = -1; j = len; while(i < j){ while (*(pa+(++i)) < t); while (*(pa+(--j)) > t); if (i < j ) swap(pa + i,pa + j); else if (i == j){ quicksort(pa,i); quicksort(pa+i+1,len-i-1); }else{ quicksort(pa,j+1); quicksort(pa+i,len-1); } } } return pa; }
>>933 トン。ほかにエラーがあるということですね、調べてみます
>>935 perror() とか使ってみるといいよ。
>>934 「ときどき」 って事は、正常に動作する場合もあるんだな?
どんな文字列を与えた時にバグるのか教えてくれ。
それとも、同じ文字列を与えてるのに動いたりバグったりするのか?
>>932 読み込み専用のhogehoge3.txtが存在しているとか。
>>934 ここじゃね?
quicksort(pa+i,len-1);
たぶん
quicksort(pa+i,len-j-1);
>>939 どうもありがとうございます。
ちゃんと動きました。
>>932 ディレクトリに書き込み権限がないとか。
「〜はダウト」って使う奴って、かなり昔にはやってたよな。 奴の流行では、時間は昔のまま進んでないんだろうな。
コード1 #include <stdio.h> int main(void) { int i,ia[6]={2,1,2,3,4,100},*pt=ia; for(i=0;i<5;i++)*++pt=*pt**pt; pt=ia; for(i=0;i<6;i++)printf("%d\n",*pt++); return 0; } 実行結果 2 1 4 9 16 10000
944 :
943 :2006/10/14(土) 01:04:31
コード2 #include <stdio.h> int main(void) { int i,ia[6]={2,1,2,3,4,100},*pt=ia; for(i=0;i<5;i++)*pt++=*pt**pt; pt=ia; for(i=0;i<6;i++)printf("%d\n",*pt++); return 0; } 実行結果 4 1 4 9 16 100
945 :
943 :2006/10/14(土) 01:05:53
コード3 #include <stdio.h> int main(void) { int i,ia[6]={2,1,2,3,4,100},*pt=ia; for(i=0;i<5;i++)printf("%d\n",*pt**++pt); return 0; } 実行結果 1 4 9 16 10000
946 :
943 :2006/10/14(土) 01:06:36
コード4 #include <stdio.h> int main(void) { int i,ia[6]={2,1,2,3,4,100},*pt=ia; for(i=0;i<5;i++)printf("%d\n",*pt**pt++); return 0; } 実行結果 2 2 6 12 400 Cを勉強し始めてもうすぐで1月になるものですが、質問させてください。 この4つのコードなのですが、ポインタと前置・後置インクリメントを理解するために 作成しました。 コード3までは自分の考え方と実行結果が一致したのですが、コード4の実行結果が 自分の考えと違いちょっと混乱しています。 自分の考えでは 5行目のprintf関数の引数となっている*pt**pt++の「*pt++」の部分が、今回の場合後置インクリメント なので、*pt * *ptの結果を%dに返した後でpt+1されると思っていましたが、実行結果を見てみると *pt * *(pt+1)となっているようです。(計算中にすでにpt++の部分が演算されているのかな?) この結果は前置インクリメントの場合とも違っていていったいどうなっているのかが理解できません。 (前置インクリメントの場合は*(pt+1) * *(pt+1)になると思ってます) このあたりに詳しい方、なぜこのようになるのかを教えてください。お願いします。
>>946 普通はそんなの悩まないで括弧をつける
前置インクリメントと単項*は左から右へ結合、同じ優先順位
後置インクリメントはそれよりも優先順位が高い右から左への結合
演算子の優先順位で調べてみな
VC8だと、
>>943 のケース4の最初の結果が4になった。
>>943 の使っているコンパイラの結果のほうが、個人的には分かりやすいのだけれど。
評価順序は、
(*pt) * (*(pt**))
こうだと思うけれどあっているかな。
乗算の左側と右側のどちらが先に評価されるかで、結果が変わると思うのだけれど、
この順序が未定義?
950 :
949 :2006/10/14(土) 01:46:43
インクリメント演算子typo
951 :
デフォルトの名無しさん :2006/10/14(土) 02:25:00
環境 Linux(gcc) fprintf(stdout, *****)の構文を見る限り、stdoutもある種のFILE*だと思うのですが、 fclose(stdout)って出来ますか? また、その後別のファイル名でstdout = fopen(別のファイル名,"w")とか出来ますか?
普通、stdoutとかの再割り当てにはfreopen()を使うような気がする
953 :
943 :2006/10/14(土) 04:14:57
>>948 ,949
レスありがとうございます。
>>948 一応カッコをつけなかったのはつけなかったときにどういう動作をするか見てみたかったからです。
優先順位と結合法則については手持ちの参考書に書いてあるのですが、
間接参照の*も++も--もすべて同じ優先順位で右→左の結合(右結合)とかかれていました。
(++と--は前置とか後置とか区別されてませんでした)
たとえばコード1の5行目のfor文*++pt=*pt**ptで考えてみると、
間接参照の*と前置インクリメントが優先順位が高くなりますよね。
で、二つとも右結合だから一番右端の*ptそして乗算*をはさんで左にある*pt、
最後に*++ptの順番に演算していくことになります。つまり
(*(pt+1))=(*pt)*(*pt)
配列のアドレスに直すと、
(*&ia[1])=(*&ia[0])*(*&ia[0])
になり、結果が合いません…。
おっしゃるように「前置インクリメントと間接参照の*は同じ優先順位で左結合
後置インクリメントが前者二つより優先順位が高く右結合」が正しく参考書が
間違えているぽいですね。ただ、同じようにコード1でやってみると、
*++pt=*pt**ptなので
参考書の考え方と同じく優先順位は間接参照の*と前置インクリメントが高くなります。
ただし結合法則が左結合になるため、まず++pt→*(++pt)→代入演算子の右にある*pt
→右端の*ptの順で演算していくとこになります。つまり
(*(pt+1))=(*(pt+1))*(*(pt+1))になって、配列の形にすると
(*&ia[1])=(*&ia[1])*(*&ia[1])になり、結果が合います。
ただこの場合は、式にカッコをつけて*++pt=(*pt)*(*pt)とした場合でも、
実行結果がカッコをつけなかった場合と同じになってしまいます…orz
もうわけがわかりません…
954 :
943 :2006/10/14(土) 04:16:10
>>949 (*pt)*(*(pt++))の場合
もし乗算演算子*の右側から評価されれば
(*(pt+1))*(*(pt+1))になって
乗算演算子*の左側から評価されれば
(*pt)*(*(pt+1))になるってことでしょうか?
そもそも後置インクリメントは式の値を返した後に代入するものだとおもってました。
>>953 演算子の優先順位と結合法則から、(*(++pt))=(*pt)*(*pt) となることについての理解は正しい。
>二つとも右結合だから一番右端の*ptそして乗算*をはさんで左にある*pt、
>最後に*++ptの順番に演算していくことになります。
これは正しくない。
右結合というのはたとえば a=b=c=d が a=(b=(c=d)) と右側から順に結合するということ。
2項(or3項)演算子の非演算子が、どれから順に評価されるかは(一部の例外を除き)未定義。
つまり、A=B*C という式のA, B, C それぞれの部分がどの順序で評価されるかは決まっていない。
++pt と *pt のどっちが先に評価されるかで、結果は変わる。
上で書いた一部の例外というのは &&, ||, ,(カンマ演算子)の3つ。
これらは非演算子が左、右の順で評価されることが決まっている。
>>954 これも、
>そもそも後置インクリメントは式の値を返した後に代入するものだとおもってました。
pt++ を評価するとその値は pt であり、pt自身はインクリメント(+1)される。
ただし、ptがインクリメントされるタイミングは、pt++の評価後であって、
式全体(*pt)*(*(pt++))の評価後ではない。
pt++が評価されるのが*ptより先かもしれないし、後かもしれない。
未規定 コンパイラの好きにしろ 未定義 HDD消されても知らんぞ とかの方がわかりやすいよね
未定義 ツンデレAI美少女がPCから出てきても知らんぞ
960 :
943 :2006/10/14(土) 16:57:33
>>955 >>956 レスありがとうございます。
お恥ずかしいことに色々と勘違いしていたようです。
>>955 なるほど、右結合や左結合の捉え方を誤っていたようですね。
よくわかりました。
皆様ご丁寧にありがとうございました。
class foo; class hoge { private: foo* mpFoo; public: (略) void set( int val) { if (mpFoo) mpFoo->set(val); } void set( double val) { if (mpFoo) mpFoo->set(val);} }; class fooはintとdoubleのどちらの型のデータを持っているか判る 数値情報を持つクラスです。 hoge::set()の場合は1行で書けますが、 他にもまったく同じ処理なのに、 引数の型が違うだけのメソッドがいます。 これをint,doubleで2回づつ書くのではなく、 1回で済ます方法は無いでしょうか?
質問です 自分のサイズよりも大きな構造体のポインタに対するキャストが うまく動くかどうかは実装依存でしょうか? 例えばこんなコードです #include<stdio.h> struct mydata{int a,b,c,d;}; int main(){ int *p; mydata da={1,2,3,4}; p = (int *)&da; printf("%d %d %d %d\n",((mydata*)p)->a,((mydata*)p)->b,((mydata*)p)->c,((mydata*)p)->d); return 0; }
それでうまくいかない処理系を知らない
966 :
961 :2006/10/14(土) 18:38:30
>>962 具体的にどう書けばいいんでしょうか?
プログラミング言語c++を読んでみたのですが、自分には書き方が判りませんでした。
>>963 やっぱり設計を変えたほうがいいですか。
int,doubleを受け取るんじゃなくて、fooのようなクラスfooArgを受け取るようにして、
hoge::set(1) が hoge::set( fooArg(1)) に自動変換するようにすればいいとか?
967 :
962 :2006/10/14(土) 18:50:48
>>966 class hoge {
private:
foo* mpFoo;
public:
template<class T>
void set(T val) { if (mpFoo!=NULL) mpFoo->set(val); }
};
968 :
961 :2006/10/14(土) 19:18:59
>>967 ありがとうございます。動きました。
class hogeの前にtemplate書いてみたり、メソッドの宣言は普通に型を指定して、
実体の方だけだけtemplateをつけて動かなかったのです…
969 :
964 :2006/10/14(土) 20:46:02
>>965 ありがとうございます
こういったコードが必要になったので悩んでいたのですが
気にせず使うことにしました
>>969 その例だとキャストする意味が分からん。
キャストしないで済ませられないか、よく考えてから使えよ。
>>970 >>964 は「自分のサイズよりも大きな構造体」
って書いてるから例が今ひとつなだけで、こういうことを言いたいのでは?
#include<stdio.h>
struct mydata{int a,b,c,d;};
struct mydata2{int a,b,c,d,e;}
int main(){
mydata2 *p;
mydata da={1,2,3,4};
p = (mydata2 *)&da;
printf("%d %d %d %d\n",p->a,p->b,p->c,p->d);
return 0;
}
まあWindowsではこれが出来なかったらメッセージのやり取りが出来ないけどな。
>>971 それは実装依存かな。少なくとも正しく動作する保証は無いだろう。
973 :
971 :2006/10/14(土) 21:20:57
>>972 PSなんかではアライントメントの関係でおかしくなる場合があるってfj.comp.lang.cで話題になったことがあったと思う。
>>973 アライメントが不正な場合に未定義動作となることは規格に明記されている。
975 :
971 :2006/10/14(土) 21:26:56
976 :
デフォルトの名無しさん :2006/10/14(土) 21:32:58
VC++.net、C言語にてUDPのプログラムを作っています。 現在、サーバ側がどうにかしてIPを調べクライアント側に伝え、 クライアントがサーバのIP・ポートを手入力して繋いています。 それをサーバ側がロビーサーバに登録し、クライアントがロビーサーバにアクセスしてクリックだけで接続できるようにしたいと考えています。 その際、サーバ側のグローバルIPをプログラムで取得してロビーサーバに保存させたいのですが、 どうすればグローバルIPを取得することが出来るのでしょうか。
971はわからないが、964は平気であるはず。 構造体へのポインタは先頭要素の型へのポインタにキャストして平気であるという規定があったはず。
>>977 964 はその規定にかかわらず、元の型に戻してから使ってるので問題ない。
979 :
964 :2006/10/14(土) 21:54:22
>>970-975 レスありがとうございます
すみません、例が悪かったですね
971さんの仰るとおりウィンドウメッセージ関連です
規格上は未定義なんですねorz
必要になった状況というのは
ユーザ定義メッセージを送るPostMessageの引数です
自作コントロールでWM_APP_HOGEHOGEを定義して
PostMessageの引数のLPARAMに受け渡すデータを
パックして送ろうとしたんですが
私の環境では、LPARAMはlong型なので
mydata(受け渡し用データ)のほうがかなりサイズが大きく、
こういったキャストを利用してよいものかと思い質問しました
WEBでWM_USERやWM_APPの使い方を調べても、
WPARAMやLPARAMにデータを入れて送っている例がなかなか見つからないので
直接キャストしてみたらとりあえずは動いているようです
けど不備があったら嫌だな^^;
もしかしてLPARAMがlongなのは、ポインタのサイズと関係があるんですかね
980 :
964 :2006/10/14(土) 21:59:17
>>977 >構造体へのポインタは先頭要素の型へのポインタにキャストして平気であるという規定があったはず。
なるほど、参考になります
(LPCREATESTRUCT)lParamといったコードがあるので
LPCREATESTRUCTについて調べてみたところ
tagCREATESTRUCTの最初の引数はLPVOID (void *)でした
ということは、データを受け渡しを考えた時は
構造体の最初のメンバに気を配らないとダメなのでしょうか?
981 :
964 :2006/10/14(土) 22:03:40
>>978 ということは大丈夫っぽいですね
色々ありがとうございました
982 :
デフォルトの名無しさん :2006/10/14(土) 23:00:01
>>979 LPARAMは単なる整数型だ。
ポインタ型をポインタ型以上の大きさを持つ整数型に変換して、また元のポインタ型に戻して使うのは問題ない。
現在LPARAMは、ポインタ型と同じ大きさを持つ符号有り整数型と定義されている。
984 :
976 :2006/10/14(土) 23:25:25
>>982 サーバA サーバB サーバになる人がロビーサーバで登録
登録↓ ↓登録
[ロビーサーバ] ロビーサーバがサーバのIP・ポートを保持し、クライアントに表示させる(名前+ボタンとか)
参照↑ ↑↑ ↑参照
クラA || クラD クライアントはロビーサーバにアクセスし、
クラB クラC 行きたいサーバのボタンを押して接続
ロビーサーバに聞くとしても、サーバ側のIPを受け取らないといけませんよね。
サーバ側のグローバルIPの取得方法がわからず、IPを渡すという作業が出来ずに詰まっていて躓いている状態です。
ロビーサーバがサーバA・Bから接続を受けた時点でグローバルIPは分かるだろ。
あ、サーバ登録時もUDP使ってるのか?
CもC++も全く関係ないな
989 :
デフォルトの名無しさん :2006/10/15(日) 01:40:18
『宣言が正しく終了していない』とエラーがでました。 #include <stdio.h> #include <time.h> #include <stdlib.h> #define SIZE 20 int Scores[SIZE]; /*グローバル変数宣言*/ int max(int a, int b) { if(a<b) return b;else return a; } int min(int a, int b){ if(a<b) return b;else return a; } int main(void){ int i;double ave,sum; srand(894u); for (i=0; i<SIZE; i++) Scores[i] = (int)(rand()/(RAND_MAX+1.0)*301)-100; for (i=0; i<SIZE; i++){ Scores[i]=min(Scores[i],0); Scores[i]=max(Scores[i],100);} for (i=0; i<SIZE; i++){ sum += (double)Scores[i];} ave =sum/SIZE; printf("Answer is %6.2f.\n",ave); return 0;} バクがわかりません。教えていただけないでしょうか?
ここまで堂々としたマルチもめずらしいな
max、minマクロは既に定義されてるのでエラーになる。 max、min関数を宣言する前に #undef max #undef min と追加するか、max関数とmin関数自体を削ると通るはず。(bcc5.5なら) しかしそのコーディングスタイルはなんかの苦行か?
gcc(オプション-Wall)で試したけどエラーでないよ。
>>991 の言うとおりbccで試したらエラー出たよ
#undef追加したらエラー出なくなったよ
994 :
デフォルトの名無しさん :2006/10/15(日) 02:12:31
>>991 有難うございました。
追加した所、通りました。
関数名を変えても通りました(^^)v
このコーディングは、掲示板が生み出したて感じですねw。
>> 驚きです(゜o゜)。
激しい電波をキャッチしました。
bccってそんなに腐っていたのか。 Windows.hをincludeすると、min, maxというマクロがあるのは知っていたが。 でも何故なんだろう。 STLならnamespaceに入っているはずだし。
997 :
デフォルトの名無しさん :2006/10/15(日) 04:29:00
質問です。 initされ、unlock状態のmutexをlockしようとするとプロセスが落ちるのですが、 理由は何が考えられるでしょうか。 siginfo.txtによると、SIGSEGV(BADADRS:0x00000000)です・・・
コードが間違ってる
h
1000 :
小倉優子 ◆en0rG2J.f6 :2006/10/15(日) 06:31:25
1000ならジュースでも飲むか
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。