[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 12/22 20:21 / Filesize : 245 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.50【環境依存OK】



1 名前:デフォルトの名無しさん [2008/02/28(木) 00:01:39 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.49【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1203478421/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

313 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 16:53:01 ]
unsigned char String[9] = "S2KTI2G7";
unsigned char KeyTable[11] = "0123456789";
char *id = "0";
int i;

for(i = 0; i < 8; i++)
  String[i] ^= *id;

このプログラムの動作がよくわかりません
たとえばString[0]はSのアスキーコードが83、0のアスキーコードが48なので
String[0] = 83^48になるのかと思ったのですが、実際は99になっているようです。
どうして99になるのでしょうか?

314 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 16:53:46 ]
>>310
>*** 2 errors in Compail ***
恥ずかしいからちゃんとコピペしようね。

315 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 16:56:05 ]
>>313
Cではハット(^)はビット毎の排他論理和演算子なので、83^48はちゃんと99になる。

316 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 16:58:09 ]
>>313
83^48
=1010011^0110000
=1100011
=99

317 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 17:01:12 ]
>>315-316
なるほど
ここしばらく他の言語しかやってなかったのですっかり忘れてました
すばやい回答ありがとうございます

318 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 17:01:17 ]
>>310
こんな感じじゃないかなたぶん

return( 1 ); /* 表示 */ 
}; <----- ここテンプレートの最後にセミコロンが必要

template char show_array..... → template<> char show_array.....
template int show_array..... → template<> int show_array.....

show_array( pages, 5 ); → show_array<char>( pages, 5 );
show_array( price, 3 ) → show_array<int>( price, 3 )
show_array( price, 0 ) → show_array<int>( price, 0 )

319 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 17:02:30 ]
>>310
そのテンプレート関数の目的が意味不明なんだが、取り敢えず「所謂」全角空白が見えるエディタを使おう。

320 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 17:05:25 ]
>>310
多分、テンプレート関数では配列の一部を出力してその有無を返すだけと判断して勝手に修正してみた。
--
#include <iostream>
using namespace std;

template<class T> bool show_array(T array[], int N)
{
for (unsigned ic = 0; ic < N; ++ic) {
cout << array[ic] << ' ';
}
return N != 0;
}

int main( void )
{
int pages[] = { 100, 200, 300, 400, 500 };
float price[] = { 10.05, 20.10, 30.15 };

/* int型の配列 */
show_array( pages, 5 );
cout << '\n';

/* float型の配列 */
cout << show_array( price, 3 ) << endl;
cout << show_array( price, 0 ) << endl;
cout << '\n';

return 0;
}

321 名前:320 mailto:sage [2008/03/04(火) 17:09:21 ]
いかん、配列の要素数を勝手に取得するバージョンの名残で引き数Nが大文字だw
ついでなんで、そのバージョンも貼っておこう。
--
template<class T, size_t N> bool show_array(T (& array)[N])
{
for (unsigned ic = 0; ic < N; ++ic) {
cout << array[ic] << ' ';
}
return N != 0;
}
--
これだと、show_array(price)で使える。でも戻り値の意味がないw



322 名前:306 mailto:sage [2008/03/04(火) 17:33:00 ]
なるほど。
レスくださった方々、わかりやすい説明ありがとうございましたm(_ _)m

323 名前:310 mailto:sage [2008/03/04(火) 17:34:28 ]
レスありがとうございます!

314 >> あ、aが余分でした (;ω;`)


318 >>
テンプレートの最後にセミコロン付加
templateの後に<>付加
show_arrayの後に<型>付加
をやってみましたが、エラー内容は変わりませんでした・・

319 >>
練習用に色々やってみた感じで作りました。
エディタはさくらエディタ使ってます。

320 >>
> 多分、テンプレート関数では配列の一部を出力してその有無を返すだけと判断して
させたい動作はその通りです。
320さんのソース読んできます。


324 名前:310 mailto:sage [2008/03/04(火) 17:36:39 ]
アンカーの付け方まちがえたぁぁ〜

325 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 17:47:39 ]
>>324
全角空白を見えるようにしろって言うのは、>320に全角空白が入っているからなんだが。
# 勿論、後から追加したであろう★印のところ以外にね。

326 名前:325 mailto:sage [2008/03/04(火) 17:48:15 ]
いや、全角空白が入っているのは>320じゃなくて>310だった_/ ̄|○

327 名前:310 mailto:sage [2008/03/04(火) 17:57:39 ]
>>320さんのソースを元に、自分との違いを考えて
>>311-312
のソースの★の記述を削除し、
>>318さんの変更を加えたら、コンパイル通りました〜。

ソースの書き方がコテコテ素人なんで、
>>320さんのソース見て勉強します。

>>318さんの追加が無い場合はエラーが出るのですが、内容読んでも
show_array<char>( pages, 5 ); の<char>が何で必要か
わからんです、ヒントお願いできないでしょうか。
エラー内容は↓です。
エラー2285 show_array<T,T1,t2>(int *, int)に一致するものが見当たらない


328 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 18:00:40 ]
>>327
template<class T, class T1, class T2> T show_array( T1 *array, T2 count )
というテンプレートがあるので、show_array( pages, 5 ); は
show_array<char, int*, int> かもしれんし
show_array<int, int*, int> かもしれんし
show_array<long, int*, int> かもしれんし
T1とT2は引数見ればわかるけどTの型は決定できないので

329 名前:310 mailto:sage [2008/03/04(火) 18:03:50 ]
>>326
!? お
template<class T, class T1, class T2>と
T show_array( T1 *array, T2 count )
の間に全角空白が!!!!!!

コピペした後に入れちゃったみたいです。('A`)
ご指摘ありがとうございます。

330 名前:310 mailto:sage [2008/03/04(火) 18:13:08 ]
>> 328
なるほど!
分かりやすいご説明ありがとうございます。

試しに
<char>show_array( pages, 5 );
してみたら、構文エラーでしまた。
show_array<char>( pages, 5 );
って書き方なんですね。


ご回答下さった皆様、ありがとうございました(。。)゛


331 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 19:37:21 ]
oprator void *() const
{ if (state&(badbit|failbit)) return 0; return (void *) this; }

のopratorはここではどういう意味で使われているのでしょうか?
この位置にあるのを初めて見まして、よくわからないんです。



332 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 19:41:08 ]
>>331
型変換の演算子。

333 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 20:00:13 ]
>>331
例えば
class Foo {
public:
 operator int() { return 42; }
};
main() {
 Foo foo;
 int x = foo; // <-- ここ
 cout << x;
}
というふうに、クラスを別の型に変換するときに呼ばれる。

334 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 21:54:20 ]
ちなみに、このvoid*への変換演算子は
if (str)のように条件式で用いるために用意されている。

なぜoperator boolでないかというと、boolでは整数へ変換できてしまうから。
int x = str;のような想定外の変換を行わせないためである。

335 名前:デフォルトの名無しさん [2008/03/04(火) 23:21:45 ]
C#で開発したプログラムを、事情で一部C++.Netで書き直さないといけなくなったのですが
[C#]
List<int[]> foo;
の書式が、C++.Netではどう直せばいいのかわかりません。
intの配列ではテンプレートを適応できないのでしょうか?

336 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 23:24:05 ]
>>335
List<array<int>^>^ foo;

337 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 23:24:19 ]
vene.wankuma.com/ecma372/24_cli_array.aspx
これ?

338 名前:335 [2008/03/04(火) 23:25:39 ]
>>336
ありがとうございます。私の4時間が返ってきた。
これで作業が続きます。

339 名前:336 mailto:sage [2008/03/04(火) 23:40:27 ]
>>338
ちなみにあなたが書いてるのはC++/CLIなので
分らないことがあったらC++/CLIスレに行くと幸せになれるかも。

340 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 23:56:55 ]
List<array<int>^>^ foo;

笑ってるように見えて何かムズムズするw

341 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 00:36:11 ]
List<List<List<array<int>^>^>^>^ foo = gcnew List<List<List<array<int>^>^>^>();



342 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 00:37:46 ]
積年の疑問なんですが、スタックサイズはいつどうやって決まるんでしょうか。
1. コンパイル時に
2. リンク時に
3. 実行時に
a. 自動的に(コンパイラとかが自動変数の使用状況などを見て)
b. 固定的に
多分、どれかに当てはまると思うんですが。

343 名前:デフォルトの名無しさん [2008/03/05(水) 00:40:00 ]
コンパイルしたら

344 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 00:48:12 ]
>>342
環境依存。

Windowsはリンク時に実行ファイルのヘッダにサイズが書かれるんだった
かな。子スレッドのスタックは実行時。


345 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 00:48:49 ]
>>342
Windowsではexeにスタックサイズが書かれるので、リンク時以前
組み込みなんかでリセットベクタもコンパイルする必要がある場合は、コンパイル時
と思う。

346 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 01:31:09 ]
組み込みで開発してたときはスタックサイズのチェックしてたな
どこまで上ってきてるか心配だったから。
あのときはコンパイル時だな。

347 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 01:34:24 ]
うちもスタックポインタのチェックやってる。んでも、リンク時だと思う。
リンク時にスタックポインタの開始アドレスとかグローバル変数の確保領域アドレスとかの設定ファイルを使うから。

348 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 01:52:00 ]
>>347
そうだな。何とか形式のファイルのサマリーを
出してくれるツールがあったな。

349 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 02:57:13 ]
よく、C++ における class と struct の違いはデフォルトで private か
public かの差しかないって言うけど、本当?
class だと継承やらの情報を管理するための暗黙のメンバが最初にくっつかない?

class C {int a;}
struct S{int a;}
C c;
S s;

を実行してデバッガで c と s の中身見てみるとメンバ違わない?



350 名前:デフォルトの名無しさん [2008/03/05(水) 03:10:19 ]
クラスはメンバ関数や、オーバーロードが使えるだろ
構造体の拡張だろう

351 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 03:14:17 ]
本とかだと、class と struct はデフォルトの可視範囲が異なるだけで、
コンパイラレベルでは全く同一ですと書いてある。



352 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 03:16:08 ]
>>349
structも継承できるのに何でそこが違うとおもったんだ?

353 名前:デフォルトの名無しさん [2008/03/05(水) 03:16:27 ]
細かいことは気にするな 使う側として同じなら構わないだろう

354 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 03:17:46 ]
>>349
大抵の実装では、仮想関数を持つクラス・構造体は、
仮想関数呼出のためのテーブル (vtbl)へのポインタを隠し持っているが、
これもクラス・構造体どちらでも同じ。

規格でも構造体とクラスは完全に同一視され、
構造体について何か独立した規定は存在しない。
全てクラスとしてまとめられている。

355 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 04:19:31 ]
full bokko

356 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 07:17:09 ]
そして大抵の実装では
仮想関数を持たないクラス・構造体は
vtbl へのポインタを持っていない。

357 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 07:38:19 ]
>>347
H8やSHでは#pragma stacksize XXX というのがあるので、
スタックサイズはコンパイル時、スタックアドレスはリンク時ということかな。

358 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 08:45:07 ]
struct S{ int m_a; int m_b}

として m_b に代入しようとして

void hoge(void *s){
 int offset = sizeof(int);
 unsgiend char * p = (unsgiend char *)s;
 int * m_b = p[offset];
 *m_b = 1234
}

みたいなコードが書いてあると位置がずれて死ぬ訳か

359 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 09:23:24 ]
>>358
いいえ、環境依存です。

360 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 09:30:41 ]
struct S {
 int a;
 int b;

 void clear() {
  ZeroMemory(this, sizeof(*this));
 };
}

こういうのもマズイ?

361 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 09:32:20 ]
>>360
いつか POD の規則から外れる変更を加えたときに忘れずに修正する覚悟が必要。



362 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 09:42:56 ]
vectorとか追加した場合ですね。
上のほうで出てた、仮想関数を持つクラスを継承して
vtbl へのポインタを持ってる場合は>360で問題無しですか?

363 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 10:42:35 ]
>>362
仮想関数を持ったものも POD から外れる。

364 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 10:45:50 ]
>>357
HEWでそれやってたな。てかconfig入力画面でメモリセクションのカスタマイズできた。

365 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 10:47:58 ]
struct S {
 std::vector m_v;
} s;



ZeroMemory(&s, sizeof(S));

ってやって死んだ事がある



366 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 11:46:02 ]
コンパイラBCC55
class PPP{
public:
union{
  struct{
    int n;
    struct{
      enum Hoge hoge;
      int x;
    }aa[32][32];
    LPCWSTR name[256];
  }a;
  struct{
    int p;
    char i;
    float y;
    Hoge *o;
  }b;
  struct{}c;
}data;
};
こんな共用体がクラス変数になってる時に
PPP ppp;
とするとそこでプログラムが例外も吐かずに落ちてしまいます。
しかし、PPPを他のクラスのクラス変数として宣言しておけば落ちません。
class Hoka{
PPP p;
};
分かる人おながいしまつ・・・。

367 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 11:47:00 ]
ちなみにenum HogeはPPPの中で定義されてます。すいません

368 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 12:21:18 ]
現象が再現する最小限のソースうp

369 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 14:39:59 ]
今更ですが>>290のことで

vector<int> num;
num[i*j]=a;

でnum.size()が不定のとき(i*jより小さいときもある)場合
先にnum[i*j]を確保して、num[i*j]=aを入れればよいのでしょうか

確保の仕方を教えてください

370 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 14:46:08 ]
>>369
num.resize(100) とかで好きなサイズに変更する

371 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 15:20:53 ]
num.resize(i*j)っていうのも可能ってことでしょうか?




372 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 15:28:07 ]
>>368最小限が分かりづらいのでエラーの出ないnewで代用しました。

373 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 15:58:15 ]
>>371
可能だが resize(i*j) ではサイズが足りないと思うぞ

374 名前:デフォルトの名無しさん [2008/03/05(水) 16:14:35 ]
もっとも使われていないバッファを解放したいのですがSTLなどで良いライブラリはありますか?

375 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 16:53:00 ]
>>374
せめてもうちょっと具体的に言わないとどうにもならないと思うよ

376 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 16:57:59 ]
LRUを実装するのに適したコンテナはどれでしょうかってことだとエスパーしてみる
JavaのLinkedHashMapみたいなやつ?
STLにそれはないから、mapとlistを組み合わせるのかな・・

377 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 18:39:44 ]
3次元配列(texture)を動的に確保しようと

if( (int)texture.size() < ( temp[0] + temp[1]*maxValue[0] + temp[2]*maxValue[0]*maxValue[1] ) )
texture.resize(temp[0] + temp[1]*maxValue[0] + temp[2]*maxValue[0]*maxValue[1]);

texture[temp[0] + temp[1]*maxValue[0] + temp[2]*maxValue[0]*maxValue[1]] = num;

こうしたら、格納されません。

現在の3次元配列の幅よりも、大きいのが出てきたら値を取り直して、入るべき所にぶち込む
ってことをやりたいだけなのですが

378 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 18:58:40 ]
>>377
サイズが 10 だったら、有効なインデックスは 0〜9 だ
サイズが temp[0] + .... *maxValue[1] だったら、
有効なインデックスは 0 〜 temp[0] + .... *maxValue[1] - 1 までだ

379 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 19:07:20 ]
>>378
ありがとうございます、それが抜けていました

ただ 0 0 0 があったときに格納できないというエラーが出てきて
後少しなのに

380 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 19:20:23 ]
class Aを例外として投げるとき

throw new A;
のようにnewで生成して投げるのと
throw A();
と投げるのはどっちが良いのでしょうか?


381 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 19:25:04 ]
自プロセスのHWNDを取るにはどうしたらいいのでしょうか?



382 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 19:25:10 ]
むかーしどっかで見たのですが、3次元以上の配列は使わない方が良いってどういうことでしょうか?
ソースがどこだったか覚えてないのですが、そのときの記憶があり3次元以上はなるたけ使わないようにしてる原状です

383 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 19:27:31 ]
あんま多いと気づかずやらかす類のバグが増えるかも…しれないけど決定的な理由じゃねえよな

384 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 19:37:17 ]
>>380
Javaと一緒にすんな

385 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 19:57:35 ]
>>382
その配列が表すモノが本質的に3次元以上のモノなら3次元配列で良いけど
構造体やクラス等で表すべきモノを配列にしてしまうのは避けるべき

386 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 20:47:36 ]
数値計算で添字3つ以上の行列とか扱わない限り、
まず必要になることはないと思うけどね。

387 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 20:52:58 ]
>>380
newするとどこかでdeleteせんといかんよ。

388 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 21:29:17 ]
>>380
new はしない。

389 名前:デフォルトの名無しさん [2008/03/05(水) 22:04:19 ]
#define SAFE_DELETE(p) {delete (p); (p)=NULL;}
を定義して、
SAFE_DELETE(ptr);
とすると「構文エラー : ';' が〜の前にありません」のエラーになってしまいます。
delete ptr;なら普通にコンパイルできるのですが、
どこが悪いのでしょうか。

390 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:06:01 ]
ちょっと行き詰まってしまったので質問させて下さい。
VC2005、WinXP64で以下のようなプログラムを作ったのですが、うまく動いてくれません。

DWORD WINAPI ThreadPrc(LPVOID lpParameter)
{
while (!ThreadTerminated){
//要求があるまで待機
WaitForSingleObject(hEventHandle,INFINITE);
if (ThreadTerminated) break;

//共有オブジェクトの排他アクセス
WaitForSingleObject(hMutexHandle,INFINITE);
//適当に処理
ReleaseMutex(hMutexHandle);

//処理が終わると相手に通知
//ここがおかしい
SetEvent(hDoneEventHandle);
}
return 0;
}

普段はDelphiでやってますが、64ビットでビルドする必要があったので、Delphiで作ったものをC++に移植しました。
プロセス間通信でいろいろやってるわけなのですが、同じところでいつもタイムアウトしてしまいます。
もちろんINFINITEにするとそのまま固まってしまいます。
32ビットプロセスでSetEventして、64ビットプロセスでWaitForするのは成功するのですが、その逆がうまくいかないのです。
VC固有の問題なのか、64ビットの問題なのか、関係ありそうなのは調べましたが全く原因が分かりません。
この部分さえうまくいけば完成なのですが・・・。
どなたか分かる方いましたらアドバイスお願いします(o*。_。)o


391 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:09:05 ]
>>389
SAFE_DELETE(ptr);

{delete (p); (p)=NULL;};
に展開される。
} の後に ; があるのがポイント。
これで何か起こってんじゃね?



392 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:12:09 ]
>>389
問題の起こる最小のコードをplz!

393 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:17:54 ]
>>389
うちの環境だと普通に動いてしまったよー。
周りを疑ってみるべき

394 名前:331 mailto:sage [2008/03/05(水) 22:18:39 ]
なるほど!
分かりやすい説明ありがとうございましたm(_ _)m

395 名前:389 mailto:sage [2008/03/05(水) 22:20:21 ]
周りを少し抜き出すとこんな感じです。

-----SystemMacro.h----------
#ifndef SYSTEMMACRO_H
#define SYSTEMMACRO_H
#define SAFE_DELETE(p) {delete (p); (p)=NULL;}
#endif

------List.h----------
#include <windows.h>
#include "../system/SystemMacro.h"
template <class T> class List {
public:
virtual ~List(){
if(!_tempFlg) {
WORD i;
for(i=0; i<_ct; i++) {
delete _arr[i];
}
}
SAFE_DELETE(_arr); //←ここをdelete _arr;にするとコンパイル通る
}
};
※Listのメンバ変数は省略してます。

396 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:21:28 ]
template <typename T>
void SafeDelete(T *& p) { delete p; p = NULL; }

397 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:23:00 ]
なんか怪しげなコードだが
_arrの型は?


398 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:24:06 ]
どーでもいいけど _ は変数名の前につける習慣は良くない。
つけるなら後ろに。

399 名前:389 mailto:sage [2008/03/05(水) 22:25:12 ]
あ、_arrがテンプレートの、T**型なのですが、
それが悪いのでしょうか。

400 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:29:21 ]
fmtflags setf(fmtflags flg, fmtflags mask);
関数の説明で、この関数は

flags((flags() & ~mask) | (flag & mask));

のような処理をしている、と書いてあったのですが、

flags((flags() & ~mask) | flag);

でも同じではないでしょうか?
なぜわざわざ(flag & mask)と書いてあるのでしょうか。

401 名前:389 mailto:sage [2008/03/05(水) 22:37:45 ]
>>396
ありがとうございます。

>>397
template <class T>のT**型です。

>>398
とあるJavaのソースでクラスのメンバ変数の先頭に_をつけてたのを真似してます。
C言語はまだ初めたばかりな上、グーグルと2chで全て学んだので、
基礎がなってないのですが、先頭_はなんで不味いんでしょうか。

上のListクラスの機能は、たぶんstd::vectorとほぼ同じです。
標準ライブラリというのを知らなくて、作ってしまいました。



402 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:38:32 ]
>>400
> 同じではないでしょうか?

いや、同じじゃないから。

403 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:43:14 ]
だれか>>391に突っ込んでやれよw

>>401
「_」始まりの単語はシステム予約される可能性があるから。



404 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:45:19 ]
pは何処から出てきた?
でいいのかな。

405 名前:389 mailto:sage [2008/03/05(水) 22:49:40 ]
>>403
ありがとうございます。

}の後ろに;をつけても、うちの環境では動きました。

406 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 23:06:52 ]
レスありがとうございます。

fmtflags setf(ios::hex, ios::basefield);
で、
ios::hex が 0x0800
ios::bsaefield が0x0e00
とすると、

ios::hex & ios::basefield

で、
0000 1000 0000 0000

0000 1110 0000 0000

の論理積なので、

0000 1000 0000 0000

で、結局
ios::hex(0000 1000 0000 0000)
そのものと変わらないじゃんと思ったのですが、どこかで勘違いしているのでしょうか。

407 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 23:08:47 ]
>>406
> 論理積なので、

いや、違うから。

408 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 23:14:46 ]
とりあえず

SAFE_DELETE(_arr);



{delete (_arr); (_arr)=NULL;};

に置き換えてコンパイルが通るかどうか。

あと、コンパイラは何?

409 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 23:16:54 ]
>>400
flgは立てたいビット、maskはflgの属するフィールドを指定するが、
flgがmaskのフィールドに属さなかった場合に、
余計なフィールドのビットを立ててしまうのを防ぐため。

410 名前:デフォルトの名無しさん [2008/03/05(水) 23:24:26 ]
質問させて頂きたいのですが、
このように宣言しましたが、

char a[] = "1234";
char b[] = "4567";

char* abc[2][255]={
a,
b
};

*abc[1]で値が取り出せません。
こういうやり方は無理でしょうか?

411 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 23:30:23 ]
>>410
abcはポインタが二次元に並んだ配列だが、それでいいのか?
やりたいのは、ポインタの一次元配列のように見えるが。
つまり、こう。
char* abc[2] = {a,b};
そうしたら、
*abc[0]は'1'
になる。



412 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 23:47:55 ]
>399
>あ、_arrがテンプレートの、T**型なのですが

>395を見ると delete _arr[i]; とあるから、_attrは new[] で確保したアドレスを前提としていないか?
それなら delete ではなく delete[] とすべき。
コンパイルエラーの件とは無関係だが。


413 名前:デフォルトの名無しさん [2008/03/05(水) 23:55:17 ]
411>
おっしゃるとおり二次元配列のポインタですね。
全然気がつきませんでした。
ありがとうございます。







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<245KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef