【初心者歓迎】C/C++室 Ver.59【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.59【環境依存OK】 - 暇つぶし2ch357:デフォルトの名無しさん
08/04/04 20:28:22
初心者はまずこれを読んで
ポインタを理解すること

URLリンク(builder.japan.zdnet.com)


これができない奴はC/C++いじるの辞めろ
適正が0かマイナスだ

358:デフォルトの名無しさん
08/04/04 20:58:48
>>94

359:デフォルトの名無しさん
08/04/04 21:22:45
それ1週間前のネタ

360:デフォルトの名無しさん
08/04/04 21:50:48
C++にポインタ排卵だろ

361:デフォルトの名無しさん
08/04/04 21:57:43
まあ大部分は排除できるな。

362:デフォルトの名無しさん
08/04/04 22:21:10
constメソッドからでもポインタ型メンバの参照先なら操作し放題とか駄目活用している

363:238
08/04/04 22:32:21
protectedでstaticな独自クラスの配列の参照の初期化で他のクラスのメンバ変数を与えたいんですが
無理ですよね・・・?
もし他のクラスのstatic変数なら大丈夫でしょうか?

364:デフォルトの名無しさん
08/04/04 22:36:38
RTTIは実際にどういう場面で使われるんですか?

template<typename T> void hoge(const T &a) {
  if (typeid(a) == typeid(int)) { ... }
}

とかやるんですかね

365:デフォルトの名無しさん
08/04/04 22:37:35
クラスのインスタンス自身への参照ならいくらでも可能だと思うが、
その中のメンバ変数と言われると難しいというか、
そもそもそんな怪しい事しようとしている事にまず疑問を持たざるを得ない。

366:デフォルトの名無しさん
08/04/04 22:38:45
>>364
dynamic_cast も RTTI を利用してる。
typeid はあまり使う事は無いな。

367:デフォルトの名無しさん
08/04/04 22:54:27
dynamic_castなら、よくこういう状況で使いたくなる。
1. ライブラリの用意した基底クラスBから派生した自作クラスDを作る。
2. Dのインスタンスをライブラリに渡す。
3. ライブラリからのコールバックで2で渡したものがB型への参照・ポインタで与えられる。
この例だと結局boost::polymorphic_downcastにするんだけどね。

>>364
その例だったら特殊化で十分。

368:デフォルトの名無しさん
08/04/04 23:00:11
配列の参照のスタティックなクラス変数のクラス定義外での宣言って
Hoge Piyo::(&foo)[][100];
じゃないの・・・?

369:デフォルトの名無しさん
08/04/04 23:05:51
とりあえずコンパイルの通るコードを頼む

370:デフォルトの名無しさん
08/04/04 23:09:04
>>360

多態とか

371:デフォルトの名無しさん
08/04/04 23:09:50
スマートポインタでいい。

372:デフォルトの名無しさん
08/04/04 23:58:47
でいいというか、ポインタ使えないなら、ポインタもどきを使うしかない。
クラスがメンバに参照を持つとコンテナに突っ込めなくなってしまうので、
嫌でもポインタ使わなきゃならないと思うんだけど。



373:デフォルトの名無しさん
08/04/05 00:07:58
大体ポインタを理解できないならスマートポインタも理解できないかと
360は何を言いたかったのだろう

374:デフォルトの名無しさん
08/04/05 00:08:53
スマートポインタはアドレス演算とかやらないから
scoped_ptr くらいなら何とかなるんじゃね?

375:デフォルトの名無しさん
08/04/05 00:15:57
ダメな奴は、やり方が言語仕様に引っ張られる。

376:デフォルトの名無しさん
08/04/05 00:17:42
いやイテレータ使うならアドレス演算と大して変わらないんじゃないか
ポインタわからないようではC++できないというのは真実だと思うけど

377:デフォルトの名無しさん
08/04/05 01:24:51
排卵日

378:デフォルトの名無しさん
08/04/05 03:16:18
メンバ変数の文字列の一部を新しい文字列として返したいんですが
どういう方法がありますか?

こういうのです

class Test {
private:
 char data[256];
public:
 char * getStr()
 {
  char *ret = new char[3];
  ret[0] = data[0];
  ret[1] = data[1];
  ret[2] = data[2];
  
  return ret;
 }
};

これを

std::string str = getStr();

このように使った場合retのデリートができないので
メモリリークしますよね?何かいい方法ありませんか?

379:デフォルトの名無しさん
08/04/05 04:35:02
const std::string getData() const { return std::string( data ); }

380:デフォルトの名無しさん
08/04/05 06:48:36
終端に '\0' を追加するのも忘れずに

381:デフォルトの名無しさん
08/04/05 08:04:56
クラスがメンバに参照を持つとコンテナに突っ込めなくなってしまうので、

382:デフォルトの名無しさん
08/04/05 08:49:39
void getStr(std::string& str) const {
 str.assign(data, 3);
}
std::string getStr() const {
 return std::string(data, 3);
}

後者は代入する時にコピーが発生するので場合によっては効率悪いが
(初期化の場合は大抵のコンパイラなら戻り値最適化してくれるので大抵コピーは発生しない)、
かといって前者は必ず変数用意しないといけない。

どっちにするか、あるいは両方用意するかはお好きなように。


まあ、string にどんなメンバがあるかくらい見とけ。
URLリンク(www.wakhok.ac.jp)

383:デフォルトの名無しさん
08/04/05 10:43:49
>>381
参照のようなconstなメンバー変数を持つとコピーコンストラクタが書けない
一方ほとんどのコンテナはメモリ確保を自動でするからコピーが発生する
常識だと思ってたんだけどどこかおかしいのか

384:デフォルトの名無しさん
08/04/05 10:53:24
デフォルトコンストラクタが書けないと言った方が正しいか

385:デフォルトの名無しさん
08/04/05 11:06:11
コピコンは書けるだろ?
書けないのは代入演算子。

386:デフォルトの名無しさん
08/04/05 12:09:51
終了文字の\0って入れなきゃいけないんでしょうか。
サンプルで\0を使っているコードを\0消しても正常に動作するんですが。

387:デフォルトの名無しさん
08/04/05 12:14:40
BCCで「異なる ~型へのポインタが混在している」って出るんですが、
これってどうすれば解決できるんでしょう?
箇所は
vsprintf(unsigned char*,const char*,va_list);
って使ってるところなんですが、unsignedのポインタからsignedのポインタにはキャストできないって言われたし・・・

388:デフォルトの名無しさん
08/04/05 12:14:41
>>386
コードによる。サンプル晒せ。
実はどこかで\0が付いているだけかもしれない。

389:386
08/04/05 12:28:09
>>388
これです。
int CreateSave() {
HANDLE hFile;
SYSTEMTIME st;
TCHAR szTime[128];
TCHAR *lpszBuf;
DWORD dwAccBytes;
DWORD dwSize = 0L;
       HGLOBAL hMem;
DWORD dwLen;

GetLocalTime(&st);
wsprintf(szTime,_T("\r\nファイル作成時: %d年%02d月%02d日%02d時%02d分%02d秒"),
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);

dwLen = (DWORD)lstrlen(szTime);


390:386
08/04/05 12:28:48
続き

hFile = CreateFile(_T("ファイルログ.txt"),GENERIC_READ, 0, NULL, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
dwSize = GetFileSize(hFile, NULL) + dwLen;

hMem = GlobalAlloc(GHND, sizeof(TCHAR) * dwSize + 1);
lpszBuf = (TCHAR*)GlobalLock(hMem);
ReadFile(hFile, lpszBuf, dwSize, &dwAccBytes, NULL);
CloseHandle(hFile);
lstrcat(lpszBuf, szTime);
lpszBuf[dwSize] = '\0';
hFile = CreateFile(_T("ファイルログ.txt"), GENERIC_WRITE, 0,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hFile, lpszBuf, (DWORD)lstrlen(lpszBuf), &dwAccBytes, NULL);
CloseHandle(hFile);
GlobalUnlock(hMem);
GlobalFree(hMem);

return -1;
}

391:デフォルトの名無しさん
08/04/05 12:30:09
>>387
(const signed char *)にキャスト

392:デフォルトの名無しさん
08/04/05 12:50:12
>>390
よく読んでないけどstrcat(lpszBuf, szTime);この時点で¥0がついてると思われ

393:デフォルトの名無しさん
08/04/05 12:58:53
>>391
constってことは第2引数にですよね?やったら同じエラーが2個に増えたんですけど・・・

394:デフォルトの名無しさん
08/04/05 12:59:59
constを破るキャストがあるんですが、あれがあったらconstの意味なくないですか?

395:デフォルトの名無しさん
08/04/05 13:04:11
constは破るためにある
だから const const charがあるだろ

396:デフォルトの名無しさん
08/04/05 14:33:43
>>390
lpszBuf = (TCHAR*)GlobalLock(hMem);
ReadFile(hFile, lpszBuf, dwSize, &dwAccBytes, NULL);
CloseHandle(hFile);
lstrcat(lpszBuf, szTime);
lpszBuf[dwSize] = '\0';

このあたりか。
何か無茶苦茶危険なコードに見えるんだけど。

hMem = GlobalAlloc(GHND, sizeof(TCHAR) * dwSize + 1);  ← dwSize 文字分のメモリを確保してるつもりのようだが、+1 の位置がおかしい(TCHAR が2バイトの時に領域が足りない)
lpszBuf = (TCHAR*)GlobalLock(hMem);
ReadFile(hFile, lpszBuf, dwSize, &dwAccBytes, NULL);  ← dwSize 読み込む
CloseHandle(hFile);
lstrcat(lpszBuf, szTime); ← '\0' を付けないまま lstrcat は危険というか、szTime の文字数分領域がさらに必要なんだけどその領域を確保すらしていない
lpszBuf[dwSize] = '\0'; ← lstrcat の前に行う

397:デフォルトの名無しさん
08/04/05 14:35:01
しかも、lpszBuf[dwSize] = '\0'; じゃなくて lpszBuf[dwAccBytes] = '\0'; だな。

398:デフォルトの名無しさん
08/04/05 14:41:08
Unicodeビルドかどうかで、ファイルの文字コードまで
影響を受けるというのは良くない場合のほうが多いと思うけど、
それはいいのか?

399:デフォルトの名無しさん
08/04/05 15:57:43
何もひねらずに考えるとこうですが

if( n % 2 )
  printf( "奇数です\n" );
else
  printf( "偶数です\n" );

奇数か偶数か調べるもっともスマートなコードってどんなんですかね?


400:デフォルトの名無しさん
08/04/05 15:59:38
int isOdd(int n){ return n % 2; }

if( isOdd(n) )
  printf( "奇数です\n" );
else
  printf( "偶数です\n" );

401:デフォルトの名無しさん
08/04/05 16:00:21
スマートってのが読みやすいって意味ならそれでいいんじゃね?
スマートが短いって意味なら、いろいろあるだろうけど。

402:デフォルトの名無しさん
08/04/05 16:00:43
inline bool isOdd(int n) { return n % 2 != 0; }

403:デフォルトの名無しさん
08/04/05 16:07:03
下位1bitでも調べればいいんじゃね
スマートといえるかわからんけど

404:デフォルトの名無しさん
08/04/05 16:08:36
最下位ビット調べて0なら偶数

405:デフォルトの名無しさん
08/04/05 16:09:05
かぶった><

406:デフォルトの名無しさん
08/04/05 16:10:52
この程度なら最適化されないのかな?

407:デフォルトの名無しさん
08/04/05 16:23:00
まともなコンパイラならするよ。

408:デフォルトの名無しさん
08/04/05 17:00:52
std::string のfind()とfind_first_of()の違いって何ですか?
どちらも最初の位置を返すと思うんですが

409:デフォルトの名無しさん
08/04/05 17:04:02
findはコンテナから特定の要素を見つける。
find_first_ofはコンテナから特定のコンテナの要素を見つける。

410:デフォルトの名無しさん
08/04/05 17:21:25
std::string str("hogefugapiyo");
std::string::size_type find = str.find_first_of("abc");

"abc"のうち一番最初に見つかった要素の位置を返す
コンパイルが通るかは試してないのでわからん

411:デフォルトの名無しさん
08/04/05 18:17:44
質問です。
以下のような二つのコードの時間を計ってみたら、
コードBの方が早く、コードAはすさまじく重くなりました。
なぜでしょうか?
あと、コードAの方で、変数aをデバッグで値を見ると、
1.731e-040#DEN のように表示されます。
#DENとは何なんでしょうか?
よろしくお願いします。

環境はVisual c++ 2005です。

//コードA
for(int i =0; i< 5000; i++){
float a = 1.731e-040f;
float b = 1.731e-040f;
float the_test = a*b;
}

//コードB
for(int i =0; i< 5000; i++){
float a = 0.1f;
float b = 0.1f;
float the_test = a*b;
}

412:デフォルトの名無しさん
08/04/05 18:31:22
>>411
DENormal number (非正規化数)

FPUによっては非正規化数の演算をサポートしてなくて、
これをソフトウェア側でエミュレートしてる場合がある。
すると、パフォーマンスが落ちる原因になる。

413:じじ
08/04/05 18:57:43
MFCをつかったマルチスレッドプログラミングを仕事で要求されているの
ですが、APPクラスの子レッドとしておくのがいいのでしょうか?

414:デフォルトの名無しさん
08/04/05 19:17:30
enum は ビットマスクしてもいいですか?

415:デフォルトの名無しさん
08/04/05 20:03:42
どうやったらうまくコーディングできるんだろう?
すぱげってぃーなコードになってしまう。やっぱり慣れるしかない?

以下サンプル

void binary_search(double x,double y,double *z)
{
int i;
double c,j;
j = 0.0000001;

for(i=0;y*y - 2 > j;i++)
{

if(x*x - 2 < 0 && y*y - 2 > 0)
{
c = (x+y)/2;
if(c*c - 2 > 0) y = c; else x = c;
}
binary_search(x,y,z);
}

*z = x;

}

再帰しまくりでサーセン。でもどうやったら再帰せずに実現できるだろう?
考えるのが面倒&考えても良く分からないので再帰に走る今日この頃。

416:デフォルトの名無しさん
08/04/05 20:04:37
無理に再帰を使わない方がスパゲティ化する。

417:デフォルトの名無しさん
08/04/05 20:11:04
再帰はスタックで実現している。

418:デフォルトの名無しさん
08/04/05 20:12:39
>>415
何がしたいんだよ?

binary_search(x,y,z);

//binary_search(x,y,z);

419:デフォルトの名無しさん
08/04/05 20:21:12
バイナリサーチをバイナリデータのサーチと勘違いしてたりして
変数一文字でコメントもなくて通じると思ってるんだろうか

420:デフォルトの名無しさん
08/04/05 20:29:23
binary search じゃなくて bisection method の間違いだったわ
恥ずかしい。。。。鬱だしのう orz

421:デフォルトの名無しさん
08/04/05 22:55:05
これが日本のITレベルだ


スレリンク(prog板:43-44番)

くずばっかw

422:デフォルトの名無しさん
08/04/05 23:05:51
>>421
すまん、記事のコメントと同じ事をいいたいのか
それとも、2ページ目の解説についていいたいのか
さっぱり分からないから、ちゃんと説明してくれないか?


423:デフォルトの名無しさん
08/04/05 23:06:44
x 日本
o IBM

424:デフォルトの名無しさん
08/04/05 23:37:02
内部に二次元配列をもつクラスから、instance[0][0]みたいな書き方で値を取得したいと思ってます。
double operator[][](int x, int y)
のような書き方は出来ないみたいなので、(コンパイル失敗しました)、
この場合どうすればいいでしょうか?



425:デフォルトの名無しさん
08/04/05 23:47:13
要素数が100万くらいあるvectorを半分にして50万要素のvector2つにしたいのですが、
50万番目のiteratorを取得するのにiterator++ を50万回呼ぶ以外の方法はないのでしょうか。
vector<int>::iterator it=vec.begin()+vec.size()/2
とかいう感じだと演算子+は定義されていない、とかでダメなもんで。
この辺がポインタとの違いかなとは思うのですが。

426:デフォルトの名無しさん
08/04/05 23:50:06
επιστημη ってこんなところにも出没するんだな

427:デフォルトの名無しさん
08/04/05 23:54:19
>>425
std::advance

というか、+ は定義されているはずなのだが、
どんなコンパイラ使ってるの?

428:デフォルトの名無しさん
08/04/05 23:54:52
>>425
コンパイラ何使ってるの?
vector のイテレータはランダムアクセスイテレータのはずだから、
コンパイラの実装がおかしいだろ、それは。

429:デフォルトの名無しさん
08/04/05 23:55:08
>>425
vector<int>::iterator it= &vec[vec.size()/2];
みたいな感じでできないか?

430:デフォルトの名無しさん
08/04/06 00:01:24
>>429 それはダメ。ポインタとごっちゃになってる。

431:デフォルトの名無しさん
08/04/06 00:08:31
PCSX2というソフトをコンパイルしたいんですがやり方がわかりません。
プログラムについての知識0です。
勉強したいとかではなくこのソフトがほしいだけです。

Microsoft Visual C++ 2008をとりあえずインストールしましたがやり方がまったくわかりません。
サルにも判るように教えてくれる方がいれば幸いです。

URLリンク(www.pcsx2.net)

URLリンク(pcsx2.svn.sourceforge.net)

432:425
08/04/06 00:10:23
すみません。できました。どこかで間違った思い込みしてたみたいです。

433:デフォルトの名無しさん
08/04/06 00:23:40
>>430
ランダムアクセスイテレータはポインタ互換だと勘違いしてた
そういう実装が多いだけか

434:デフォルトの名無しさん
08/04/06 00:25:07
>>433
使用可能な演算子はポインタと同じだが、
ポインタとの間で相互変換することはできない。

435:デフォルトの名無しさん
08/04/06 00:26:14
ただし、ポインタもランダムアクセスイテレータの一種だけどね。

436:デフォルトの名無しさん
08/04/06 01:01:40
>>424
プロキシクラスを返す。
class A
{
public:
class Proxy
{
public:
double operator[](int y);
};
Proxy operator[](int x);
};

437:デフォルトの名無しさん
08/04/06 01:06:20
ポインタ返せるならそれでいいと思う。
範囲チェックしたければ何かクラス返すことになると思うけど。

438:デフォルトの名無しさん
08/04/06 10:48:56
>>431
スレ違いだということ、サルでも分かるかな?

439:411
08/04/06 12:00:53
>412
回答ありがとうございます。
遅くなる原因がわかり、勉強になりました。

ありがとうございました。

440:デフォルトの名無しさん
08/04/06 12:57:53
>>436-437
ありがとうございます。
以下のような実装でいいですか? (あまりスッキリしてないような、、)
class test {
public:
test(int arg_size);
struct Proxy {
Proxy(int arg_size) : size(arg_size) {
vec.assign(size, 0.0);
}
double &operator[](int y) {
return vec[y];
}
std::vector<double> vec;
int size;
};
Proxy &operator[](int x) {
return proc_vec[x];
}
std::vector<Proxy> proc_vec;
int size;
};



441:デフォルトの名無しさん
08/04/06 13:36:20
ていうかよっぽどの理由が無いなら()演算子のでいいじゃん

442:デフォルトの名無しさん
08/04/06 14:08:59
クラスの中身の先頭にusing namespace ~;は書けないの?

443:デフォルトの名無しさん
08/04/06 14:11:20
>>441
なるほど、たしかに全然すっきり書けますね。
メンテもしやすそうだし、こっちにします。
ありがとうございます。

class Matrix {
public:
Matrix(int arg_size) : size(arg_size) {
vec.assign(size, std::vector<double>(size));
}
std::vector< std::vector<double> > vec;
int size;
double &operator()(int x, int y) {
return vec[x][y];
}
};



444:デフォルトの名無しさん
08/04/06 14:18:34
>>443
440でもそうだったけど、size変数って不要じゃね?

445:デフォルトの名無しさん
08/04/06 15:13:16
>>443
更にで何だけど、要素数のパターンが少なくて、定数でしか使わないなら要素数テンプレートにしちゃうと
ベクターも使わずに済むが・・・
用途分からんからしらね

446:デフォルトの名無しさん
08/04/06 15:15:45
エラー 1 error LNK2001: 外部シンボル ""private: static int Forms::Application::nCmdShow" (?nCmdShow@Application@Forms@@0HA)" は未解決です。 main.obj
ってどういう意味のエラーですか?

447:デフォルトの名無しさん
08/04/06 15:21:22
>>446
宣言だけされてて関数が定義されていない。


448:デフォルトの名無しさん
08/04/06 15:34:25
>>445
どうやるんですか?
要素は、二次元ベクトルなんですが、1000×1000要素くらいです。



449:デフォルトの名無しさん
08/04/06 15:36:35
>>446
プロジェクトのリンクするライブラリの設定で
必要な関数入ったLIBファイルを設定しわすれてるんじゃない

450:デフォルトの名無しさん
08/04/06 15:37:08
>>444
その通りですね。
size変数は消します。

451:デフォルトの名無しさん
08/04/06 15:46:43
>>448
vectorの要素数って変わるの?

452:デフォルトの名無しさん
08/04/06 16:25:26
>>448
横レスだが、こういうことだと思う。
template<int size_x, int size_y> class Matrix {
public:
double& operator()(int x, int y) { return v_[x][y]; }
private:
double v_[size_x][size_y];
};

1000×1000は大きいので、スタックには置けないけど。

453:デフォルトの名無しさん
08/04/06 16:43:03
よくみるLPクラス名って、そのクラスのポインタ型って事?

454:デフォルトの名無しさん
08/04/06 17:00:20
>>453 そういう名前付けの規則が昔はやってたんだよ。

455:デフォルトの名無しさん
08/04/06 17:02:13
ある天気予報サイトの三重県の天気情報の文字列だけを抽出して自分のホームページに乗せるプログラムを書きたいのですが、どういったことを勉強すれば良いのかご教示願えないでしょうか。宜しくお願いします。

456:デフォルトの名無しさん
08/04/06 17:13:54
>>455
・サイトにアクセスしてページを入手する
・ページを加工する
・自サイトに貼り付ける
WebProg板へどうぞ。

457:デフォルトの名無しさん
08/04/06 17:32:48
エラー 1 error C2143: 構文エラー : ';' が 'Forms::Application::frm' の前にありません。 application.cpp 7
エラー 2 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません application.cpp 7
エラー 3 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません application.cpp 7
エラー 4 error C2371: 'frm' : 再定義されています。異なる基本型です。 application.cpp 7
>>449
>>447
解決しました。
が、今度はこんなエラーが。
定義はしたんですが、今度は定義した場所でエラー吐くようになりました。

458:デフォルトの名無しさん
08/04/06 17:52:08
>>457

>>54-

459:デフォルトの名無しさん
08/04/06 19:44:31
ありがとうございました。
名前空間をちゃんと指定してなかったのが原因でした。

460:デフォルトの名無しさん
08/04/07 02:21:47
ヘッダに定義とか書けちゃうんだけど、
分けた方がええの?

分ける理由ってなんですか?

461:デフォルトの名無しさん
08/04/07 02:41:53
>>460
定義のほうをあらかじめコンパイルしてオブジェクトにしとける
小さいなら定義も一緒でいいだろ
boostとかにもそういうのあるよ

462:デフォルトの名無しさん
08/04/07 02:46:51
>>460
プログラムサイズが増えたり重複オブジェクトができたりコンパイルが通らなかったりする

463:デフォルトの名無しさん
08/04/07 02:49:17
ヘッダに関数書くならstaticつけるかファンクタにするかテンプレートにしとけよ。

464:デフォルトの名無しさん
08/04/07 02:54:18
こういう質問をする人のレベルだと、一番掴みやすいのはコンパイル時間の問題かなぁ。

>>460
たとえば、計10万行くらいあるソースファイル群のすべてが
直接or間接的にhoge.hppというヘッダファイルをincludeしているとして、
hoge.hppが実装まで全部書いてあるモノだったとすると、
その実装部分をほんの1行変更しただけで、10万行のソースファイル群が
すべて再コンパイルされることになる。
定義を別ファイルにしておけば、変更したときに再コンパイルするのはそのファイルだけで済む。

465:デフォルトの名無しさん
08/04/07 04:53:14
LinuxにおいてHDDの容量を取得したいのですがどの様にすればよいのでしょうか?

466:デフォルトの名無しさん
08/04/07 04:59:01
ただのグローバル変数とstaticをつけたグローバル変数って同違うんですか?

467:デフォルトの名無しさん
08/04/07 06:43:59
>>465
Linux板へどうぞ。ulimitでできるでしょ。

>>466
前者は文字通りGlobal。後者はファイルスコープなので違う翻訳単位からは見えない。
どちらにしても、可能な限り使わないに越したことはない。

468:デフォルトの名無しさん
08/04/07 07:14:53
>>464
>>463
>>462
>>461
ありがとう。
なんとなくわかった。

469:デフォルトの名無しさん
08/04/07 07:45:15
>>463
ヘッダに関数書くときに、static付けたり、ファンクタにしたり、テンプレートにしたりすると、
どういう点でいいですか?全然考えてませんでした。



470:デフォルトの名無しさん
08/04/07 07:59:53
関数が複数実体化されることを抑制できる。

471:デフォルトの名無しさん
08/04/07 12:23:30
★ 今世紀最大の大祭り!聖火を巡る障害物リレー 日本イベント来たる! ★

【目的】
 街中をオニが駆け巡ります。
 オニは聖火を持って移動します。これを消すのが目的です。

 ただし、今回は参加者が多いため難易度がはね上がりました。
 今回のみ、オニは壁役に守られながら走ります。
 壁役を突破して聖火を消せばゲームクリアとなります。

【ルール】
~勝ち~
 オニが持っている聖火を消すとその時点でゲームクリアとなります。
~負け~
 オニが若里公園まで逃げ切るとその時点でゲームオーバーとなります。

【日時    】 2008年4月26日(土)8:30スタート
【場所    】 長野県長野市
【ルート地図】 URLリンク(www.city.nagano.nagano.jp)
【詳細情報 】 URLリンク(www.joc.or.jp)
-------------------------------------------------------------
イギリスで行われたイベントの様子
URLリンク(jp.youtube.com)
フランスで行われたイベントの様子(1分30秒から)
URLリンク(jp.youtube.com)

『2ch大規模OFF会場』
スレリンク(offmatrix板)
スレリンク(offmatrix板)

『各国の競技結果』
URLリンク(ja.uncyclopedia.info)

472:デフォルトの名無しさん
08/04/07 18:43:10
四則演算ってさ、
char でも int でも double でもしてくれるが、
それってコンパイル時に適切にマシン語に変換してくれてるんですか?

CPUが持ってる算術演算の機能を使えるように
置き換えてるのであってCPUが int なのか char なのか判断して
処理してるわけではないですよね?

473:デフォルトの名無しさん
08/04/07 18:51:06
>>472
そうだよ
ないです

474:デフォルトの名無しさん
08/04/07 19:12:35
ただし格上げされて計算されるので種別はそんなに多くないです。

475:デフォルトの名無しさん
08/04/07 20:03:56
格上げ、というか汎整数拡張あたりじゃないのかな

476:デフォルトの名無しさん
08/04/07 22:26:22
とりあえず宿題スレの方で提出が終わったので、
自分なりに作ろうと思っているのですが、いきなり行き詰ってしまいました;
整数の場合8桁、負数の場合9桁、エラー仕様など、問題が山積みですが、
どうかご教授お願いします。
URLリンク(kansai2channeler.hp.infoseek.co.jp)

477:476
08/04/07 22:28:20
#define buffersize 10ですね;

478:デフォルトの名無しさん
08/04/07 22:41:06
>>476
何がしたいんだ?宿題をといて自分なりに課題を拡張して勉強しようとしたのか?
そのテキストファイルを見せられても、課題を丸投げされているようにしか見えないが。

とりあえずバッファオーバーフローしてたり、いろいろまずいぞ。

479:デフォルトの名無しさん
08/04/08 10:55:17
URLリンク(www.nicovideo.jp)

この動画でやっている、画像ファイルをテキスト(AA)に変換は
どのようにやっているのですか?

480:デフォルトの名無しさん
08/04/08 11:03:12
動画にコード出てるじゃないか……

481:デフォルトの名無しさん
08/04/08 11:08:11
画像の輪郭抽出→予めこのパターンにはこの文字を使うというデータを登録しておく→
画像の上から順にパターン解析と文字割り当てを行う。

って感じしか思い浮かばん

482:デフォルトの名無しさん
08/04/08 11:08:35
>>480
初心者なもので・・・
画像を読み込んで、テキストに変換してさらにそれの色を判別してつけるのは
どの辺のコードを見たら良いのでしょうか?

483:デフォルトの名無しさん
08/04/08 11:19:20
今動画見てきたぜ。想像してたのと違ったぜ。とりあえずBMPを配列にするとこからはじめたら?
BMPのフォーマット↓凄く簡単だからすぐできるはず。
URLリンク(www.kk.iij4u.or.jp)
後は色に合わせて<font color="色">■</font>をひたすら出力すればできるだろ。
中級入門くらいじゃね?動かしたいならJavaScriptの解説かじればおk


484:デフォルトの名無しさん
08/04/08 12:38:37
>>476
とりあえず、どのあたりで困ってるのかな。?

mainに全部書くのではなく関数を作ってみよう。
引数をまとめれば、何をするべきかわかるんじゃないかな。


485:デフォルトの名無しさん
08/04/08 12:43:09
昔、先輩が「コンストラクタではnew使うな」と言っていたのを思い出したのだけど、
これってどういう意図なのでしょう。
一般的なルールなのか、特定の状況で有効な話だったのか……。

486:デフォルトの名無しさん
08/04/08 12:47:03
>>485
コンストラクタ内で例外が発生すると、デストラクタは呼ばれない (仕様)
→ new でコケたらリーク!

じゃね?
コンストラクタ内の例外は漏れなくコンストラクタ内で処置すれば無問題。

487:デフォルトの名無しさん
08/04/08 13:04:20
>>479
お絵かきとかでもあるネタだけど、むしろどうやって動画にしてる
のかの方が気になる。コーディング中ずっと録画してあとで編集
してるんだろうが…根性あるなw

488:デフォルトの名無しさん
08/04/08 13:17:33
コーディング中のキータイプを記録、編集

動画を取りながら記録したキータイプをマクロで動かす

(`゚'Д`゚')

489:デフォルトの名無しさん
08/04/08 13:24:03
>>479
画像を読み込んで表示するところから始めたらいい
結構親切っぽいから彼のサイトの掲示板で聞いてみれば
講座の方はかなり酷いスパゲティコードだからお勧めしないw

490:デフォルトの名無しさん
08/04/08 16:01:19
この講座、どんな感じ?

URLリンク(weblearningplaza.jst.go.jp)

491:デフォルトの名無しさん
08/04/08 18:21:58
cinからdoubleを1つまたは複数入力させます。入力されたのが1個なのか、複数なのか判定したいのですが、
以下のコードでよいですか?Macだとうごくのですが、windowsでもこれでいいのかわかりません。
double a;
std::cin >> a;
if (std::cin.peek() == '\n') {
// 数字は一個だった
}
else {
// 一個じゃなかった。
}


492:デフォルトの名無しさん
08/04/08 18:48:09
>>491
やってみりゃいいじゃない。

493:デフォルトの名無しさん
08/04/08 19:06:50
>>492
ありがとうございます。今手元にwindowsがないのです。
また、自分のところのwindowsでやってみて動いても、ほかの人のwindowsでは
どうなるかわからないし…
その、規格的に入力の文字列末判定はこれでいいのかどうか、知り痛いです。

494:デフォルトの名無しさん
08/04/08 19:10:04
>>485
VC8で大量にメモリの確保しているとコンストラクタの中のnewで「メモリが不足しています。」とエラーがでる。
理由が分からずallocにしたら問題なかった。
というか今も原因が掴みきれない件。

495:デフォルトの名無しさん
08/04/08 19:20:20
使う型がある程度限定できるテンプレートだったら
MyTemplate<型名>をtypedefしてしまえば良いような気がするけど
これってありなんですかね?


496:デフォルトの名無しさん
08/04/08 19:38:16
まさにstringとwstring

497:デフォルトの名無しさん
08/04/08 20:08:28
>>493
つボラギノール

498:デフォルトの名無しさん
08/04/08 21:56:33
>>495
あり。

499:デフォルトの名無しさん
08/04/08 21:59:56
ありあり。

500:デフォルトの名無しさん
08/04/08 22:04:32
ありありありあり。

501:デフォルトの名無しさん
08/04/08 22:05:12
ありが十匹で

502:デフォルトの名無しさん
08/04/08 22:14:19
さよならだ

503:デフォルトの名無しさん
08/04/08 22:23:50
アリーヴェデルチ

504:476
08/04/08 22:28:39
>>478
ですよね、失礼しました;

>>484
エラー仕様を作ろうとしたのですが、
【整数の場合最大8桁までを有効とし、9桁以降を無視する。
 負数の場合は、最大9桁までを有効とし、10桁目以降は無視する。】とあり、
【『-』のみ、または改行のみ入力されたらエラーメッセージを表示し、終了】
というのもあるので、
エラーとしては if(a[0]=='\n')  if(a[1]=='-' && a[0]=='\n')
みたいなのを使えばいいのかなぁ、程度で考えてるのですが、
どこに入れればいいのかなどイマイチ判らないのです;

505:デフォルトの名無しさん
08/04/08 22:34:19
ひょっとしてその数え方だと、「-1」は2桁なのか?

506:476
08/04/08 22:53:28
>>505
私的にはそういう風に考えてます;

507:デフォルトの名無しさん
08/04/08 22:54:05
>>486
なるほどー例外ですか。それは思い浮かばなかった。
newしたときの初期化の処理が無駄だったりするのかとか当時考えたのを思い出した。

508:デフォルトの名無しさん
08/04/08 23:02:41
>>504
whileを抜けて
>if(a[0]=='\n')  if(a[1]=='-' && a[0]=='\n')
の場合にreturnで終わればOK
returnの前にprintfで適当にエラー出せば目的のものになるだろ。
>どこに入れればいいのかなどイマイチ判らないのです;
どこに入れてダメだったんだ?

509:デフォルトの名無しさん
08/04/08 23:09:47
classのなかにnamespaceは作れますか?

510:デフォルトの名無しさん
08/04/08 23:19:28
muri

511:デフォルトの名無しさん
08/04/09 03:14:20
質問なのですが、(VC++ 2008 EE を使用しています。)

以下のコード。

COORD coord;
HANDLE hConsoleStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hConsoleStdOut, coord);

は、<windows.h>をインクルードして使える、というのは判断できますが、
これはwindowsプログラミングなのでしょうか?
WinMain()関数も無いし、DOSで表示されるのですが、
こういったコードの総称は何と呼ばれているのですか?

説明下手で申し訳ないです。

512:デフォルトの名無しさん
08/04/09 03:17:27
WindowsのAPIに依存してるならどう考えてもWindowsプログラミングだと思うが…。

513:デフォルトの名無しさん
08/04/09 03:39:45
WindowSystem(≒GUI)プログラミングではないが、
(MS-)Windowsプログラミングだな。
ついでに言えば、コンソールウィンドウはDOSではない。

514:デフォルトの名無しさん
08/04/09 04:02:03
>>512
>>513

ありがとうございます。
この「COORD coord;」や「HANDLE」の意味が解らず、
じゃあ総称が判ればネットで検索できる、と思い至ったのですが、
ネットを見ても、C言語による(MS-)Windowsプログラミングが掲載されていないんですよね。
はぁ。。。

515:デフォルトの名無しさん
08/04/09 05:19:59
>>514
日本語訳は無いけどMSDNに載ってるよ。

516:Alexander The Great WAS ALBANIAN, the PROOF by Flamuri
08/04/09 06:53:32
URLリンク(www.youtube.com)

517:デフォルトの名無しさん
08/04/09 07:30:25
>>507
ちゃんと delete すれば問題ない。
例外を一旦コンストラクタ内でキャッチして delete するのもいいが、
スマートポインタに入れておけばあとはデストラクタが勝手に何とかしてくれる。

コンストラクタ内で例外が発生した場合に呼ばれないデストラクタは
構築中のオブジェクトのデストラクタだけだからね。
既に構築されたオブジェクトのデストラクタは全て呼ばれる。
例えば基底クラスのデストラクタとか
構築されたメンバ変数のデストラクタとかは全て呼ばれる。

new に関して気をつける必要があるのは事実だけど、
使っていけないってことはあり得ない。
まあ、初心者は使わない方が無難ってこと程度の話じゃないのかな。

518:デフォルトの名無しさん
08/04/09 09:01:29
いいえ、newを生で使っている人はちゃんとスキンをつけるようにしてください。

519:デフォルトの名無しさん
08/04/09 09:26:43
newに限らず例外を投げる可能性のある関数をコンストラクタ内で
呼び出すときはstack unwindを考えて対応する。

520:デフォルトの名無しさん
08/04/09 09:32:36
コンストラクタ内でnewが例外吐いたのをキャッチしたとして、
そのあと何をすれば良いのですか?

521:デフォルトの名無しさん
08/04/09 09:38:26
>>520
ケースバイケース
スワップが頻発してるなどメモリ不足でシステムがヤバイ状態なら
終了してシステム全体のシステムの再考。
そのエラーを無視してでも少しでも長く生き続ける必要が条件なら
ログにでも吐いて続行。

522:デフォルトの名無しさん
08/04/09 11:47:43
VC++2008EE
ListBoxの1行削除ができたので、今度は削除前に
メッセージボックスを出して見ようとしたのですが、
エラーがものすごい数出てしまいました。

System::Windows::Forms::DialogResult result;
result = MessageBox::Show("削除しますか?","DELETE CHECK",MessageBoxButtons::YesNo);
Debug::WriteLine(result);
if(result != System::Windows::Forms::DialogResult::Yes)){
return;
}
if文全体を削除すると問題なく動作し、
また、出力ではYes,No確認できるので、
if文のSystem::Windows::Forms::DialogResult::Yesが、
問題なのかと思い、"Yes"とかにしてみたのですがやはりエラーが出てしまいます。
これはなぜエラーが出てしまうのでしょうか

523:デフォルトの名無しさん
08/04/09 11:56:41
>>519
それコンストラクタ関係ないだろ。

524:デフォルトの名無しさん
08/04/09 12:00:08
>>522
それ.netじゃん
AfxMessageBoxかAPIのMessageBox使うべし

525:デフォルトの名無しさん
08/04/09 12:03:48
>>520
コンストラクタ内で catch なんて書かないでいいように RAII を徹底したほうがいい。

526:デフォルトの名無しさん
08/04/09 12:14:47
>>524
ひと目でわかる Microsoft Visual C++ 2008 アプリケーション開発入門
という本を読みながらやっていて、
本書はC++/CLIで書いてある。とあるので、たぶん.netというやつだとおもいます。

この本の通りにやるとエラーが出てしまい、
エラーの内容見てもよく分からなくて、
いろいろ試してたのですが、結局原因が分からず聞いてみました。

この本で使っているMessageBoxにはなにか問題があったりするんでしょうか

527:デフォルトの名無しさん
08/04/09 12:21:41
>>526
C++/CLIてのはC++でなんとか.net使いましょうよ・・・っていう仕様
.netだけならC#の方がいいし、速度的にC++ならC++/CLIしないでMFCかAPI使った方がいい

528:522
08/04/09 12:30:18
申し訳ありません。もの凄く下らないミスでした。
if(result != System::Windows::Forms::DialogResult::Yes)){
かっこが一つ多かったです・・・スレ汚しすみませんでした。

>>527
うう、本まで買って気合い入れてしまったため再スタートは辛いです。
とりあえずこの道進んで、あとから徐々に方向転換してみます。
ありがとうございました。

529:デフォルトの名無しさん
08/04/09 12:33:15
>>528
C++/CLIなら↓の方で聞いた方がいいよ

C++/CLI part3
スレリンク(tech板)

530:デフォルトの名無しさん
08/04/09 15:29:32
>>528
甘いな。俺は最初どの本買ったらいいかわかんなくて結局3冊目まで買ったぞ

531:デフォルトの名無しさん
08/04/09 15:36:05
MFCってまだ使われてるのか?

532:デフォルトの名無しさん
08/04/09 15:44:23
>>531
きみのPCのMFC関連のDLL等を全て削除して使用してみればきみの環境での依存度が分かる

533:デフォルトの名無しさん
08/04/09 15:46:40
>>532
滑ってるよ

534:デフォルトの名無しさん
08/04/09 15:52:50
マジレス

535:デフォルトの名無しさん
08/04/09 17:07:16
MFC関連のDLL、スタティックリンクするから無くても動いちゃうよ
(俺のアプリは)

536:デフォルトの名無しさん
08/04/09 17:14:37
CString m_combo = "notepad.exe";
WinExec((LPCSTR)(LPCTSTR)m_combo,SW_SHOW);
これアプリが起動しないんですけどなんでですか


537:デフォルトの名無しさん
08/04/09 17:23:00
LPCTSTRをLPCSTRに変換しているのが限り無く怪しい。
LPCTSTRを引数に取るShellExecuteか何かを使え。

538:デフォルトの名無しさん
08/04/09 17:30:01
WinExecが好きなんですけど変換は不可能ですか?

539:デフォルトの名無しさん
08/04/09 17:33:34
なら(LPCSTR)(CStringA)m_comboでどうだ。
あと、引数の少なさなら<tchar.h>の_tsystemがいいぞ。

540:デフォルトの名無しさん
08/04/09 17:35:33
っていうかWinExecはdeprecatedな扱いのAPIのような気がする。

541:デフォルトの名無しさん
08/04/09 17:37:24
struct hoge_a{
int a;
int b;
};

struct hoge_b : public a{
int c;
int d;
};

としたとき、hoge_aのメンバのメモリ上の並び順はabとなるのは保証(規定)されていると
どこかで見た記憶があるのですが、hoge_bの場合、abcdとなることは保証されるのでしょうか?

542:デフォルトの名無しさん
08/04/09 17:54:09
>>539
動いたwお前すごいわ
どこにも乗ってなかったぞこんなの

543:デフォルトの名無しさん
08/04/09 18:27:43
srandのseedが同じ場合、マシンやOSが変わっても同じ乱数を発生させることができるのでしょうか?

544:デフォルトの名無しさん
08/04/09 18:32:25
>>543
No

545:デフォルトの名無しさん
08/04/09 18:42:27
そうすると何に依存するのでしょうか?
コンパイラですか?それともOSですか?
AMDとintelのようにCPUが変わっただけでもダメですか?

546:デフォルトの名無しさん
08/04/09 18:44:58
libcの実装次第?
時間と空間を使えばかなりランダムになりそうだけどなぁ。

547:デフォルトの名無しさん
08/04/09 19:10:37
>>543
移植性を考えるなら同じ種で同じ乱数列の出力を保証するにはライブラリに頼らず乱数発生器も実装してしまう

548:デフォルトの名無しさん
08/04/09 19:46:10
C++について質問なのですが、
オブジェクトを作らずにメンバ関数を呼び出すことは可能でしょうか。

549:デフォルトの名無しさん
08/04/09 19:49:19
静的メンバ関数なら。

550:デフォルトの名無しさん
08/04/09 19:54:24
>>548
できる。

struct a{ void f(){} };
reinterpret_cast<a*>(NULL)->f();

551:デフォルトの名無しさん
08/04/09 20:06:20
なるほど。勉強になりました。
レスありがとうございました。
#include <stdio.h>

class A
{
public:
static A* make_obj(void);
void my_puts(void){ puts("Hello\n"); }
};

A* A::make_obj(void){
A* a = new A;
return a;
}

int main()
{
A* a = A::make_obj();
a->my_puts();
return 0;
}

552:デフォルトの名無しさん
08/04/09 20:12:24
>>550
やめなさい

553:デフォルトの名無しさん
08/04/09 20:36:54
>>551
わかってると思うけど生ポではなくスマポに入れて返しとけよ

554:デフォルトの名無しさん
08/04/09 21:09:35
using namespace ~;
は取り消せますか?

555:デフォルトの名無しさん
08/04/09 21:16:28
永遠に取り消す事が出来ない呪いです。
using は計画的に。

556:デフォルトの名無しさん
08/04/09 21:24:07
namespaceをusingすると、そのnamespace内のusingまで見えてしまうのには泣く。意味ねーじゃん


557:デフォルトの名無しさん
08/04/09 21:27:35
だからヘッダにusing書いちゃ駄目ってママ言ったでしょ

558:デフォルトの名無しさん
08/04/09 21:30:57
>>550
staticメンバ関数が無い時代の苦肉の策ですなあ。
ただ非静的メンバーは参照できない。

559:デフォルトの名無しさん
08/04/09 21:31:50
turboPascalのusing見たいな使い方したかったのに。

560:デフォルトの名無しさん
08/04/10 00:22:01
VC++ 2008 EE でWindowsアプリケーションを作成したいのですが、
そのまま<windows.h>をインクルードしてもエラー表示なので、
どのような設定が必要なんですか?

561:デフォルトの名無しさん
08/04/10 00:24:06
>>548
なんのためのメンバ関数なんだか。

562:デフォルトの名無しさん
08/04/10 00:33:29
>>561
いや、他人の書いたコードを解読してるんだ。。

563:デフォルトの名無しさん
08/04/10 00:39:03
>>560
[ファイル]-[追加]-[新しいプロジェクト]
[Visual C++]-[Win32]-[Win32プロジェクト]-[プロジェクト名]-[OK]
[次へ]-[Windowsアプリケーション]-[■空のプロジェクト]-[完了]
[ソースファイル]-[追加]-[新しい項目]
[Visual C++]-[コード]-[C++ファイル]-[ファイル名]-[追加]

564:デフォルトの名無しさん
08/04/10 01:46:59
>>563
ありがとうございます。3行目まではうまく設定できたのですが、
4行目の「ソースファイル」?が何を指しているのかわからず、
そのまま5行目の作成を行いました。
結果はやはりビルドエラーです。
コードは以下です。

LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);

/* アプリケーションエントリーポイント */
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR CmdLine,
int CmdShow)
{
   //処理

return ;

}

/* ウインドウプロシージャ */
LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
//処理
}
return DefWindowProc(hwnd,message,wparam,lparam);
}

565:デフォルトの名無しさん
08/04/10 01:50:01
エラーの内容は?

566:デフォルトの名無しさん
08/04/10 01:54:31
ファーストへの悪送球。

567:デフォルトの名無しさん
08/04/10 01:54:45
1>------ ビルド開始: プロジェクト: C800, 構成: Debug Win32 ------
1>コンパイルしています...
1>MJ_1.cpp
1>.\MJ_1.cpp(26) : error C2440: '=' : 'const char [6]' から 'LPCWSTR' に変換できません。
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>.\MJ_1.cpp(41) : error C2664: 'CreateWindowExW' : 2 番目の引数を 'const char [6]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>C800.cpp
1>.\C800.cpp(28) : error C2440: '=' : 'const char [6]' から 'LPCWSTR' に変換できません。
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>.\C800.cpp(43) : error C2664: 'CreateWindowExW' : 2 番目の引数を 'const char [6]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>コードを生成中...
1>ビルドログは "file://d:\My Documents\Visual Studio 2008\Projects\C800\C800\Debug\BuildLog.htm" に保存されました。
1>C800 - エラー 4、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

です。

568:デフォルトの名無しさん
08/04/10 02:02:15
>>567
なぜコンパイルエラーの部分を省略する。
ググればいろいろ見つかる。
URLリンク(www.google.co.jp)

569:デフォルトの名無しさん
08/04/10 02:21:14
>>568
ありがとうございます。
文字変換だったのですね。
しかしググっても出てこないので最後に嘆きます。

1>------ ビルド開始: プロジェクト: GAME, 構成: Debug Win32 ------
1>マニフェストを埋め込んでいます...
1>.\Debug\GAME.exe.intermediate.manifest : general error c1010070: Failed to load and parse the manifest. U_U!$kLdK
1>~[
1>ビルドログは "file://d:\My Documents\Visual Studio 2008\Projects\C800\GAME\Debug\BuildLog.htm" に保存されました。
1>GAME - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

なるエラーが出るのですが、まったく意味不明です。

570:569
08/04/10 18:46:06
申し訳ないです。
自己解決しました。
ありがとうございます。

571:デフォルトの名無しさん
08/04/10 21:45:49
VC++2005で、ADOでSQLSERVER2005に接続して、binary型のフィールドに
1000byte程のバイナリデータを保存したいのですが、
long型の配列にデータをmemcpyし、それをrs->Updateしようとすると、
コンパイルで「bool値に変換します」というような警告がでて、データを転送できません。
バイナリデータを転送するにはどのようにすればいいのでしょうか?
(配列には正常にデータがコピーされていることはファイル出力で確認できております)


572:デフォルトの名無しさん
08/04/11 00:26:01
>>571
URLリンク(support.microsoft.com)

573:デフォルトの名無しさん
08/04/11 06:15:26
vector〈基底クラス*〉に数種類の派生クラスをプッシュバックしてオーバーライドした関数を実行するようなことはできますか?

574:デフォルトの名無しさん
08/04/11 06:18:09
>>573
virtualなメンバ関数を実行ということなら、可能です。

575:デフォルトの名無しさん
08/04/11 06:33:22
もちろん仮想関数にしてあります
&の付け忘れでした

解決できましたありがとうございます

576:デフォルトの名無しさん
08/04/11 06:38:48
>>573=>>574=>>575

577:デフォルトの名無しさん
08/04/11 06:50:20
573=574=575=576

578:デフォルトの名無しさん
08/04/11 07:17:15
>>575
メモリリークに気をつけような。
boost::ptr_vector の使用も検討してみるといい。

579:デフォルトの名無しさん
08/04/11 12:34:50
動的に二次元配列を確保するにはどうすればよいですか?
int x=10; int y=10;
double a[x][y];
という風に書くのは、xyが小さい間は出来たのですが、newで確保しようとすると
yを変数にできません。vectorを使わずに上記のようなことができるでしょうか?
よろしくお願いします。


580:デフォルトの名無しさん
08/04/11 12:37:06
double **a;

*a = new double[x]

for( int i = 0; i < x; ++i )
 a[x] = new double[y]

こんなん

581:デフォルトの名無しさん
08/04/11 12:47:33
boost::multi_arrayオススメ。

582:デフォルトの名無しさん
08/04/11 12:52:43
>>580
ありがとうございます。
確保した二次元配列をほかの関数に渡すにはどうすればよいですか?

あと、boost::multi_arrayは速いですか?
今書いているのは、std::vectorもあまり知らない人に見せるためなので、
boostなんてとてもだめです。


583:デフォルトの名無しさん
08/04/11 12:57:05
アセンブリ言語のコンパイラのCソースプログラムを持っているのですが、
アセンブリ言語をコンパイルするには、このソースをコンパイルしてから
どうすればいいのでしょうか?

584:デフォルトの名無しさん
08/04/11 12:58:11
void func( int **a );
これでわたせるんじゃね、多分

585:デフォルトの名無しさん
08/04/11 13:06:03
>>582
そういう初心者には、素直に一次元配列を仮想化して使う方がいい。
こんな関数でも用意すればアクセスするのも割と簡単だ。
static unsigned offset(unsigned x, unsigned y, unsigned w)
{
return x + y * w;
}
勿論、メモリ確保はこうなる。
double * a = new double[w * h];
あー、ついでに言えば>580はバグだらけだから要注意で。
つーか、>584もかすだわ。

586:デフォルトの名無しさん
08/04/11 13:06:38
>>583
Cソースをコンパイルしてできた実行ファイルを実行してアセンブルすれ
ばいいのでは。



587:デフォルトの名無しさん
08/04/11 13:19:33
>アセンブリ言語のコンパイラ
有り得ない間違いだな。

588:デフォルトの名無しさん
08/04/11 13:29:33
>>580
これは酷い。

589:デフォルトの名無しさん
08/04/11 13:34:19
mbscmp
wcscmp
などの違いがわからない・・・・
あと、lstrcmp とか strcmp みたいなのもあったような気がするけど気のせい?
誰か、これらの関数の違いについて分かり易く教えてください。

590:デフォルトの名無しさん
08/04/11 13:40:56
文字として wchar_t を使うとき -> wcscmp
文字として char で mbcs を使うとき mbscmp
文字として char で sbcs を使うとき strcmp
文字として TCHAR を使うとき lstrcmp

ドキュメント読まずにまず2chで聞くという態度では、わからなくて当たり前。


591:デフォルトの名無しさん
08/04/11 13:49:11
>>590
すみません。それがいまいちよくわからないんです。
charを使うときとか、tcharを使うときと言われても抽象的すぎて???
具体的に、どういう処理をするときにmbscmp や strcmp などを使い分けるのでしょうか?
同じ文字列比較でも、mbscmp を使っていたり、 strcmp を使っていたりと、訳が分りません。

592:デフォルトの名無しさん
08/04/11 13:52:17
>>587
確かに…ご指摘ありがとうございます
アセンブリ言語を実行するものの意味で使いました

593:デフォルトの名無しさん
08/04/11 13:52:50
>>591
それは抽象的だからわからないんじゃなくて、勉強しないからわからないのです。
mbcs と sbcs の違いなんか、Google で 「mbcs と sbcs の違い」を(カッコははずして)
検索すればいくつもそれらしい説明のページが出てくるのです。

もし手抜きじゃなくてホントのホントに何もしないで知識が身に付くと思ってるのなら、
そもそもバカなので勉強しても無駄なので止めるべきです。

594:デフォルトの名無しさん
08/04/11 14:04:17
>>592
それは普通、アセンブラと呼ばれる。
いや、厳密に言えば「アセンブリ言語を翻訳するもの」だが。

595:デフォルトの名無しさん
08/04/11 14:05:02
>>593
なんか嫌なことでもあったのか?

596:デフォルトの名無しさん
08/04/11 14:05:03
なんとなく分ったような分らないような・・・・

同じ英数字からなる文字列比較でもプログラムによって使っている関数が違うのは
書き手(プログラマー)の意識の違いによる?
さらにワイド文字とマルチバイト文字の違いがよく分らん。。。。

出直してきます。スレ汚してすみません。

597:デフォルトの名無しさん
08/04/11 14:06:53
すまん
*a = new double[x]
じゃなくて
a = new double*[x]


598:デフォルトの名無しさん
08/04/11 14:20:42
>>597
それだけじゃねーだろ。

599:デフォルトの名無しさん
08/04/11 15:19:15
>>595
593じゃないけど、あえて言うなら「投げっぱなしの馬鹿を見てしまったこと」が
「嫌なこと」なんだろう。

600:デフォルトの名無しさん
08/04/11 20:21:49
deleteで落ちちゃうんだけど、原因わかりません><
このコードで落ちます・・・。

int i;
char *lpary[4];

for (i = 0; i < 4; i++){
lpary[i] = new char[256];
}

for (i = 0; i < 4; i++){
delete [] lpary[i];
}

誰か教えてください。

601:デフォルトの名無しさん
08/04/11 20:23:53
落ちる要素は特に見当たらないが・・・。
多分、他で色々やってる部分でマズいことやってんじゃないかと。

602:デフォルトの名無しさん
08/04/11 20:24:46

for (i = 0; i < 4; i++){
delete lpary[i]
}

delete[] lpary;

603:デフォルトの名無しさん
08/04/11 20:25:53
>>602
おいおい^^;

604:デフォルトの名無しさん
08/04/11 20:26:53
よく見てなかった
すまん忘れてくれ

605:600
08/04/11 20:29:44
すいません。原因わかりました。
newとdeleteの間でやってる処理で確保したポインタに別のポインタ
渡してしまってた・・・。

まじごめん;;

606:デフォルトの名無しさん
08/04/11 20:30:25
悪い事いわないから、vector 使え。

607:デフォルトの名無しさん
08/04/11 23:28:52
>>596
>さらにワイド文字とマルチバイト文字の違いがよく分らん
それを調べるのが先だということに気づかないの?

608:デフォルトの名無しさん
08/04/11 23:30:06
出直してくるって言ってるんだからほっとけよ

609:デフォルトの名無しさん
08/04/12 00:33:20
変数をStringだとかChar型で指定することってできますか?

610:デフォルトの名無しさん
08/04/12 00:34:10
????????

611:デフォルトの名無しさん
08/04/12 00:56:30
静的なメモリを確保をしたクラス内に動的に確保したクラスがあるとします
この場合exit(0)が実行された時に正しく破棄が行われますでしょうか?

612:デフォルトの名無しさん
08/04/12 00:59:02
>>611
だいたいOSがうまく解放してくれる・・・かもね。
そんな保障はどこにもない。ちゃんと解放するかJava等に移行しましょう。

613:デフォルトの名無しさん
08/04/12 01:14:07
ぬるぽ

614:デフォルトの名無しさん
08/04/12 01:15:38
>>611
ライブラリの仕様によるけど、
・静的なオブジェクトのデストラクタ⇒呼ばれる
・main()から辿ってその時点までのスタック上にあるオブジェクトのデストラクタ⇒呼ばれない
つまりスタックの巻き戻しは行われないが通常のクリーンアップルーチンは呼ばれる、
が一般的なのでは。何か重要な後処理が必要なら atexit でも書いとくべきだな。

615:デフォルトの名無しさん
08/04/12 01:34:05
atexitを使うことにします
ありがとうございます

616:デフォルトの名無しさん
08/04/12 02:10:32
constポインタpDataのメンバstd::deque<Log> LogDataを参照するpastLog

const std::deque<Log>& pastLog = pData->LogData

を上のように作ってそのiteratorを使用したいのですが
const std::deque<M3Log>::iterator itr = pastLog.begin();
とすると

左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。

と怒られます

何処をどうしていいのかわかりません、アドバイスをいただけないでしょうか

617:616
08/04/12 02:12:31
訂正
const std::deque<M3Log>::iterator itr = pastLog.begin();

const std::deque<Log>::iterator itr = pastLog.begin();

618:デフォルトの名無しさん
08/04/12 02:12:40
c++ は良く知らないけど、
std::deque<Log>::const_iterator itr = pastLog.begin();
じゃないの?

619:デフォルトの名無しさん
08/04/12 02:19:58
>>618
ありがとうございます
無事コードがコンパイルを通るようになりました

const_iteratorなんてあったのか・・・

620:デフォルトの名無しさん
08/04/12 03:41:33
>>619
>const_iteratorなんてあったのか・・・
超ワロタじゃないかよ


621:デフォルトの名無しさん
08/04/12 04:19:52
静的確保と動的確保でプライベートメンバ関数の実行に違いが出るようなことは有るでしょうか?

622:デフォルトの名無しさん
08/04/12 09:55:51
外から借りない限り終了すれば仮想プロセス空間ごと消滅するかと。

623:デフォルトの名無しさん
08/04/12 11:01:31
さあて。delete thisするんでない限りは、まー無いんでないかね。

624:デフォルトの名無しさん
08/04/12 12:57:40
#define sucide delete this

625:デフォルトの名無しさん
08/04/12 14:40:30
suicide

626:デフォルトの名無しさん
08/04/12 14:49:06
oh misu superu

627:デフォルトの名無しさん
08/04/12 14:50:30
ifの条件部で変数を宣言したい時に、boolとして評価できない型だとコンパイルエラーになりますよね

std::set::const_iterator it = hoge.find(....);
if (it != hoge.end()) {
// ここで it を使う
}
のようなことをするときにifのブロック内にitのスコープを限定して
if ((std::set::const_iterator it = hoge.find(...)) != hoge.end()) {
のようなことをしたいんですけど無理ですか?


628:デフォルトの名無しさん
08/04/12 15:23:43
無理

629:デフォルトの名無しさん
08/04/12 15:39:39
for ( std...it = hoge.find(...); it != hoge.end(); ) {
 break;
}

おすすめはしない

630:デフォルトの名無しさん
08/04/12 15:40:03
{ std::set::const_iterator it; if(...){...} }

631:デフォルトの名無しさん
08/04/12 15:40:50
あるいは空スコープを使うとか。

{
 std...it = ...:
 if(){
 }
}


632:デフォルトの名無しさん
08/04/12 15:54:26
無理やり
template<typename T, template<class> class Comp> class eval_lapper
{
public:
    eval_lapper( std::pair<T, T> rhs ) : obj_(rhs.first), target_(rhs.second) {}
    operator bool() const { return Comp<T>()(obj_, target_); }
    T& obj() { return obj_; }
    const T& obj() const { return obj_; }

private:
    T obj_;
    T target_;
};

int main()
{
    std::set<int> s;
    //s.insert(123);
    if( eval_lapper<std::set<int>::const_iterator, std::not_equal_to > it = std::make_pair( s.find(123), s.end() ) )
        std::cout << *(it.obj()) << std::endl;
    return 0;
}

633:デフォルトの名無しさん
08/04/12 15:57:33
ifの評価部分ってboolのオーバーロードがあったらちゃんとboolとして評価してくれるの?

634:デフォルトの名無しさん
08/04/12 15:58:44
してくれるが、if 文以外の所でも本当に bool 値として解釈されて欲しい場合でなければ bool のオーバーロードはすべきじゃない。

635:デフォルトの名無しさん
08/04/12 16:00:12
if 文だけでそう解釈されて欲しい場合は、
普通には使われないようなポインタへのキャスト演算子を
オーバーロードするのが一般的。
メンバポインタとか。

636:デフォルトの名無しさん
08/04/12 16:41:51
>>632
面白いなやり方だな
でも、lapper => wrapper じゃね

637:デフォルトの名無しさん
08/04/12 16:53:02
//test.h
struct test{
 int a;
 test(int a_) : a(a_){}
};

//instance.cpp
#include "test.h"
test obj(1024);

//program.cpp
#include <iostream>
#include "test.h"
extern test obj;

int main(){
 std::cout << obj.a << std::endl;
 return 0;
}

別々の翻訳単位に型testが定義されてるけど、同一の型として認識されるの?
VC8ではコンパイル通った。

638:デフォルトの名無しさん
08/04/12 17:01:05
そりゃ通るだろ

同じヘッダインクルードしてるんだし

639:デフォルトの名無しさん
08/04/12 17:01:59
メンバ変数が一部が#ifdefあたりで囲んであると
場合によっては非常に愉快な話になるけどね

640:デフォルトの名無しさん
08/04/12 17:09:35
愉快なというかバグな話だろ

641:デフォルトの名無しさん
08/04/12 22:59:36
中々原因が掴めず笑うしかないとかそういうアレだろう
鼻から悪魔が出たらもっと愉快だな

642:デフォルトの名無しさん
08/04/13 22:40:49
String name;

String^ name;
の違いはなんですか?ハンドルの意味がわかりません

643:デフォルトの名無しさん
08/04/13 22:48:53
>>642
C++/CLI はスレ違いなのです。

C++/CLI part3
スレリンク(tech板)

644:デフォルトの名無しさん
08/04/13 22:50:41
>>642
とりあえず「C++/CLI ハンドル 自動変数」でググったら説明が見つかると思う。
それで分からなかったら、もう一度おいで。

# CLIってちょい過疎気味の本スレしか無いのな

645:デフォルトの名無しさん
08/04/14 01:32:44
コピーコンスタクタ辺りで質問です。

template <bool M> struct P {
int* _p;

P(int* v=NULL) : _p(v) {}
P(P& v) : _p(v.release()) {} // (1)
~P() { if(M && _p) delete _p; }

void reset(int* v=NULL)
{ if(M && _p && _p != v) delete _p; _p = v; }

int* release()
{ int* temp = _p; _p = NULL; return temp; }
};

P<true> pf(int n) { return P<true>(new int(n)); }

int main() { P<true> a = pf(3); }

上記だと
error: no matching function for call to ‘P<true>::P(P<true>)’
とコンパイルエラーがでます。 しかし (1) を

template <bool _M> P(P<_M>& v) : _p(v.release()) {}

にするとエラーにならずにコンパイルできるようになります。なぜコンパイルエラーがでなくなるのでしょうか? コンパイラは gcc version 4.0.1 (Apple Inc. build 5465) です。


646:デフォルトの名無しさん
08/04/14 01:43:50
>>645
コピーコンストラクタをテンプレート関数にして異なるテンプレート引数の型でも受け取れられるれりれるようにしたから。

647:デフォルトの名無しさん
08/04/14 01:46:07
>>645
よく分からんけど、VC8だとどちらもコンパイル通ったぞ

648:デフォルトの名無しさん
08/04/14 01:49:12
>>647
エスパーすると645は(1)をP(P& v) : _p(v.release()) {}とした上でソースコードのどこかで
P<false> oldObj;
P<true> newObj(oldObj);
とでもしているんだろう。

649:645
08/04/14 01:52:20
>>646
テンプレート引数の型は書き変える前も後も true しか扱わないのに異なる型を受け取れるようにしないと
いけない理由が分かりません。
途中で P<false> に変換されているのも確認できませんでした。

>>647
gcc だけで起きる問題なんでしょうか…

>>647
いやしてないのです。上記のソースのみです。

650:デフォルトの名無しさん
08/04/14 02:17:53
質問です。4桁の乱数を取得する関数なのですが
if(num[i] == num[j])以降のdowhileで必ずループに入ってしまうのですが
原因を教えていただけませんか?
void random::gt(){
srand((unsigned) time(NULL));
num[0] = rand() % 10;
if(num[0] <= 0){
do{
num[0] = rand() % 10;
}while(num[0] <= 1);
}
//その他乱数取得
for(i=0;i<4;i++){
if(i <= 4){
for(j=1;j<4;j++){
num[j] = rand() % 10;
if(num[i] == num[j]){
do{
num[j] = rand() % 10;
system("PAUSE");
}while(num[i] != num[j]);
}
};
}
};
}

651:デフォルトの名無しさん
08/04/14 02:47:43
>>649
Pは接頭語みたいなもので一部の例外を除いて単独では使えない
この場合だとP<true>とP<false>が型
たとえばP<true>を定義したとき、もしP(P&)の記述が許されると
コピーコンストラクタP(P<true>)か
引数付きのコピーじゃないコンストラクタP(P<false>)か曖昧になる

652:>650
08/04/14 03:22:48
日本語でおk

dowhileは必ず1回はループ内の処理を実行するが?
あと、その貼ったソースはそのままか?変更して貼ってない?



653:645
08/04/14 03:33:40
>>651
あーなるほど。コピーコンストラクタかコンストラクタが曖昧になるんですね。
P<true> -> P<false> の変換がされると嫌で書き方に困っていたのですが

P<true> -> P<true> OK
P<true> -> P<false> OK
P<false> -> P<false> OK
P<false> -> P<true> NG
の時に

template <bool M>
struct P {
template <bool _M> P(P<_M>& v);
...
};

template <> template <> P<true>::P(P<true>& v) : _p(v.release()) {}
//template <> template <> P<true>::P(P<false>& v); // NG
template <> template <> P<false>::P(P<false>& v) : _p(v._p) {}
template <> template <> P<false>::P(P<true>& v) : _p(v._p) {}

みたいにもできるってことですね!ありがとうございました。


654:デフォルトの名無しさん
08/04/14 03:33:47
あああ、すいません

if(num[i] == num[j]){のところで
変数num[i]とnum[j]が違っていても処理をしてしまう原因

を知りたかったのです
ソースは特に変えてないと思うのですが
どこかおかしいでしょうか

655:645
08/04/14 03:36:18
違った。P<false> -> P<true> が嫌だった。です。


656:650
08/04/14 03:39:19
またもすいません
>>654は>.650です・・・

657:デフォルトの名無しさん
08/04/14 09:29:44
>>650
i が 0 から 3 をとりながら動き、
そのループのなかで j が 0 から 3 をとりながら動くんですよね。
すると, i = j ならば, num[i] == num[j] となって、system("pause") がかならず
実行されることになります。

なさりたいことは、こんなのでしょうか?
(確認環境 WindowsXP, 処理系 cygwin(gcc 3.4.4)
URLリンク(kansai2channeler.hp.infoseek.co.jp)

658:650
08/04/14 11:06:42
>>657
まさにそんな感じです
ありがとうございます

659:657
08/04/14 11:24:42
>>658
バグってました。
URLリンク(kansai2channeler.hp.infoseek.co.jp)

660:デフォルトの名無しさん
08/04/14 14:51:59
set<Class> a, b;とあってaからbに含まれていない要素を取り除きたいときに
remove_ifなんかのアルゴリズムでスマートに書けますか?

661:デフォルトの名無しさん
08/04/14 15:06:05
operator^

662:デフォルトの名無しさん
08/04/14 16:59:15
>>660

#include <iostream>
#include <algorithm>
#include <set>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>

int main() {
  namespace bll=boost::lambda;
  std::set<int> a,b;
  a.insert(1);
  a.insert(2);
  a.insert(3);
  b.insert(2);
  b.insert(3);

  std::remove_copy_if(a.begin(), a.end(),
                      std::ostream_iterator<int>(std::cout),
                      bll::bind(std::find<std::set<int>::iterator, int>,
                                b.begin(),
                                b.end(),
                                bll::_1 ) == b.end());

  return EXIT_SUCCESS;
}

uu-n...

663:デフォルトの名無しさん
08/04/14 17:49:02
huninnkidearuboost::egg::lazywotukattemitayo

#include <iostream>
#include <algorithm>
#include <set>
#include <boost/lambda/lambda.hpp>
#include <boost/egg/lazy.hpp>
#include <boost/lambda/bind.hpp>
#include <boost/assign/std/set.hpp>
struct base {
  template< class Myself, class Arg0, class Arg1, class Arg2 >
  struct apply {
    typedef Arg0 type; };
  template< class Result, class Arg0, class Arg1, class Arg2 >
  Result call(Arg0 begin, Arg1 end, Arg2 value) const {
    return std::find(begin, end, value);
  } };
typedef boost::egg::function<base> op;
boost::egg::result_of_lazy<op>::type
  const find_lazy = BOOST_EGG_LAZY({});
int main() {
  namespace bll=boost::lambda;
  using boost::assign::operator+=;
  std::set<int> a,b;
  a+=1,2,3; b+=2,3;
  std::remove_copy_if(a.begin(), a.end(),
                      std::ostream_iterator<int>(std::cout),
                      find_lazy(b.begin(), b.end(), bll::_1) == b.end());
}

uuu-nnn...

664:デフォルトの名無しさん
08/04/14 17:52:02
p_stade乙

665:デフォルトの名無しさん
08/04/14 18:01:20
>>660
a = bはだめなの?
だめだから聞いているんだろうけど。

666:デフォルトの名無しさん
08/04/14 18:06:40
>>665
横からだけど

a : 10,20,30,40
b : 20,50

この場合多分望む結果は

a : 20

だろうけど、>>665だと間違った結果を返す。

667:デフォルトの名無しさん
08/04/14 18:37:09
vectorやらlistで

vector<int>の要素が

1 2 (空白) 3 4 (空白) 
の様に途中に空白をいれることはできるのでしょうか?


668:デフォルトの名無しさん
08/04/14 18:46:45
VC++でPC情報を取得するPGを作成します。
プロジェクト作成は(Win32とか)どれを選ぶのが
適当でしょうか?

669:デフォルトの名無しさん
08/04/14 19:40:07
>>668
Linux+GCCがお勧め

670:デフォルトの名無しさん
08/04/14 19:42:55
.exe が出来るならどれでもいいと思う。

671:デフォルトの名無しさん
08/04/14 20:02:18
とあるクラスに関数を一個追加しようとしたところ

.hファイルに関数の本体を書き出すと正常にコンパイルが通るのに
.cppファイルに書き出すと
C2039 'foo' : 'hoge' のメンバではありません。

となってしまいます
これはどういう事でしょうか・・・

672:デフォルトの名無しさん
08/04/14 20:05:04
ソースを見せれ

673:デフォルトの名無しさん
08/04/14 20:10:42
      f´'´      ノ     ヽ  l  、 \!
       l /  / //  ,.ィ´   !', ト、 ヽ. ヽ
.      レ′, / //_,..イ// ,|   l |lλぃ  い. ',
      } / { ‐7Ζ_∠!イ 〃  /リ,}/┤!」l 小 !
     ノ i| 八//'゛ -`l 〃 /ノ'´  j ! |l/| iイ/
     ヽ|l//イ ャ''Tェ歹''`y゙/  'ヾ歹¨リ`イ!ノ//   まさか、ロリコンじゃないわね・・・
      ) 〃A ``''''"´ '^ r;   `'''"´/クK/
      Y/ !トヘ. ////    //// /.ィi| ;|
        |i( l|`Ti\,___  '⌒)   ,∠lj_|iリ
       {い ヾLr┤:.:.:.:.`:、__,,..イ;:.::.:./勹_」!
       ``ァ;=<´ ̄``ヽ:ヽ;‐-/;/``Tr-.、



674:デフォルトの名無しさん
08/04/14 20:13:11
>>671
>.cppファイルに
しか書いてなかったとかいうオチだったら、君が泣くまで殴るのをやめない。

675:デフォルトの名無しさん
08/04/14 20:14:56
>>672
仕事でのデータが含まれてるのでちょっとソースは公開できないですorz

>>674
インテリセンスで関数宣言を確認してから中身を書いてるのでそれはないと思います

676:デフォルトの名無しさん
08/04/14 20:25:23
問題が再現するコードを作ってそれを貼ればいいじゃん。

677:デフォルトの名無しさん
08/04/14 20:27:54
テンプレート関数だったらお前の殴る

678:デフォルトの名無しさん
08/04/14 20:39:03
hppで解決♪

679:デフォルトの名無しさん
08/04/14 20:58:05
リビルドし直したら通った・・・
これはどういう事??

680:デフォルトの名無しさん
08/04/14 21:22:35
VCではよくあること

681:デフォルトの名無しさん
08/04/14 21:53:28
そしてインテリセンスが延々と更新されないことも

682:デフォルトの名無しさん
08/04/14 21:58:23
インテリセンスが嘘つくのも。

683:デフォルトの名無しさん
08/04/14 21:58:43
>>667
vector<int>に整数以外のものは入れられません。
仮に、負値を例外として扱ってよいなら空白の代わりに-1を入れておくと言う手もなくはありませんが、
boost::optionalを使ってみてはどうでしょう。

684:デフォルトの名無しさん
08/04/14 22:18:55
メモリが断片化している場合、ポインタに+1した場合はきちんと断片先に飛んでくれるんですか?
それとも型サイズ分だけ強引にアドレスが+1されるんですか?


685:デフォルトの名無しさん
08/04/14 22:21:43
断片化?
どういう状況を言ってるんだ?

686:デフォルトの名無しさん
08/04/14 22:22:45
vectorではなくdequeの実装を言っているのかもw

687:デフォルトの名無しさん
08/04/14 22:25:23
deque のことなら、イテレータに +1 したら断片化先に飛ぶけどポインタは当然無理だな。

688:デフォルトの名無しさん
08/04/14 22:26:51
>>685
1つのデータがメモリに書き込まれる時は必ず連番のアドレスに配置されるんですか?

689:デフォルトの名無しさん
08/04/14 22:27:37
>>688
少なくとも仮想アドレスは連番だが。
物理アドレスは知らんがな。

690:デフォルトの名無しさん
08/04/14 22:28:51
STLとかboostみたいので
RECTとかSIZEを包んだクラスはありますか?

691:デフォルトの名無しさん
08/04/14 22:31:41
CRectならMFCにあるけどな…

692:デフォルトの名無しさん
08/04/14 22:31:51
WTLにも

693:デフォルトの名無しさん
08/04/14 22:32:58
>>689
つまり&で表示されるアドレスは仮想でWindowsが物理メモリの番地とリンクを取って隙間に埋め込んでるから考えなくていいってことですね
ありがとうございました。

694:デフォルトの名無しさん
08/04/14 22:38:39
>>693
それでいいのか?
本当にそれでいいのか?w

695:デフォルトの名無しさん
08/04/14 22:43:16
C++でプロパティー的なものを表現する場合
getとsetはつけたほうがいいの?それともOR?

696:デフォルトの名無しさん
08/04/14 23:04:14
漢は黙ってpublic:

697:デフォルトの名無しさん
08/04/14 23:06:53
それだとブレークポイントはれないじゃん・・・。

698:デフォルトの名無しさん
08/04/14 23:15:52
__declspec(property(get=getHoge, put=setHoge))
int Hoge;


699:デフォルトの名無しさん
08/04/14 23:43:26
winsockのsock関数の第一引数にAF_BTHを指定すると、AF_BTHが定義されていないとエラーがでます。
winsock2.hはインクルードしてるんですが、ほかになにかインクルードしなければいけないんでしょうか?

700:デフォルトの名無しさん
08/04/14 23:55:47
grepかけたらws2bth.hででてきたけど。

701:デフォルトの名無しさん
08/04/15 00:24:06
std::list<int> iListの参照を作りたいのですがこの場合

std::list<int>& refList = iList;
で良いのでしょうか?

702:デフォルトの名無しさん
08/04/15 00:31:23
アドレスを比べてみたらいいと思うよ

703:デフォルトの名無しさん
08/04/15 00:39:51
>>702
簡単に試してみたけど
大丈夫そうな気がしました

704:デフォルトの名無しさん
08/04/15 00:54:33
C言語での構造体の初期化について質問です。

typedef struct Foo_tag{
 int a;
 int b;
 int c;
} Foo;

というような構造体があったときに、

Foo foo = {0};

という初期化を行っているコードをたまに見かけますが、これは何を行っているのでしょうか?
一応MinGW環境で同様のコードを書いてテストしてみましたが、{0} で初期化した構造体はゼロクリアされており、
初期化しなかった構造体にはゴミが入っていました。
ということは、上記のコードは構造体をゼロクリアするという認識でいいのでしょうか?

それと、標準Cの規格でこういう初期化は許されていますか?
構造体のゼロクリア処理は memset() などを利用して行っているコードが多いことを考えると、標準規格ではなさそうな
気がするんですが…。

705:デフォルトの名無しさん
08/04/15 01:00:36
メンバを途中まで初期化すると
残りは0で初期化されるってヤツだったと思う。
標準Cでどうなのかは知らん。

706:デフォルトの名無しさん
08/04/15 01:04:31
Foo foo = {1};でa=1,b=0,c=0になるのが保証されてる

707:デフォルトの名無しさん
08/04/15 01:12:58
>>705-706
ありがとうございます。途中まで初期化ということができるんですね。
それなら構造体をゼロクリアするときはこれを使うと楽かもしれないですね。
(先頭にネストした構造体があったりするとどうなるのかよくわからないので、汎用ではないのかもしれないですが)

708:デフォルトの名無しさん
08/04/15 01:13:32
>>704
初期化時のみOK

709:デフォルトの名無しさん
08/04/15 01:18:46
memsetだとパディングも初期化できるのが利点だったかな
普通の使い方で初期化する必要があるのかどうかは知らないが

710:デフォルトの名無しさん
08/04/15 01:36:11
>>709
ものすごく行儀の悪いコーディングだけど構造体同士を memcmp で比較できる

711:デフォルトの名無しさん
08/04/15 01:58:11
>>710
あくまで「普通の使い方」の話な
キャストしたりすればいろいろ問題も出てくるだろうよ

712:デフォルトの名無しさん
08/04/15 01:59:59
>>704
標準規格です。

713:デフォルトの名無しさん
08/04/15 02:01:05
>>704
昔のコンパイラだと 0 で初期化されません

714:デフォルトの名無しさん
08/04/15 03:28:46
>>660
template<typename Class>
void assign_intersection(std::set<Class>& a, std::set<Class> const& b)
{
  std::set<Class> result;
  std::set_intersection(a.begin(), a.end(), b.begin(), b.end()
    , std::inserter(result, result.end()));
  a.swap(result);
}

715:デフォルトの名無しさん
08/04/15 08:00:05
*
**
***
****
...
みたいな感じの出力を得たいのですが、***を出力する部分は、なにか特別な書き方とかないですか?
関数を作るしかないですか?


716:デフォルトの名無しさん
08/04/15 08:06:55
>>715
MFCならスタティックテキストの表示を*に変えるという機能(設定)があったり。
自前でもキー入力(KeyDownとか)→別の変数に格納→その文字数だけ*を表示で簡単に出来る。

717:デフォルトの名無しさん
08/04/15 10:30:07
// * を n 個出力する関数
void f(int n){
for(int i = 0; i < n; i++) std::cout << '*';
std::cout << std::endl;
}

void g(int n){
for(int i = 0; i < n; i++) f(i);
}

718:デフォルトの名無しさん
08/04/15 14:19:49
std::string s(length, '*');
std::cout << s << '\n';

719:デフォルトの名無しさん
08/04/15 20:41:31
#include <iostream>
#include <iomanip>

int main()
{
    for (int i = 0; i < 10; ++i)
        std::cout << std::setw(i) << std::setfill('*') << "" << std::endl;
}
ところでC++でいいんだよね?

720:デフォルトの名無しさん
08/04/15 22:13:39
C言語ならこんなもんか
void f1()
{
    int n, i;
    for(n = 1; n <= 10; n ++) {
        for(i = 0; i < n; i ++) putchar('*');
        putchar('\n');
    }
}

void f2()
{
    int n;
    for(n = 1; n <= 10; n ++)
        puts("**********" + 10 - n);
}

void f3()
{
    int n;
    for(n = 1; n <= 10; n ++)
        printf("%.*s\n", n, "**********");
}

721:デフォルトの名無しさん
08/04/16 00:27:56
printfの書式でもっと簡単にできなかったっけ?
イメージ>>720のf3()が近いんだけど・・・使う機会が少ないとすぐにわすれちゃうな・・・

722:デフォルトの名無しさん
08/04/16 00:38:10
>puts("**********" + 10 - n);

このやり方はじめて見た。目から鱗やわ

723:デフォルトの名無しさん
08/04/16 00:42:59
>>722
その鱗はつけておいた方がいいw

724:デフォルトの名無しさん
08/04/16 02:36:32
課題でc++のbasic_stringの様なstringクラスを作っています。
その中でstr >> coutはクラス内でoperator>>を用意することで
動くようになったのですが、cout << strは「二項演算子<<はクラス
strをサポートしていません」と言われてしまいます。
これはどのようにしたらcout << strが出来るようになるのでしょうか?

またお恥ずかしながら、str = "aaa"は作れたのですが、str ="aaa"+"bbb"は
作ることが出来ませんでした。これはどの様に作ったらいいのでしょうか?

どうかよろしくお願いします。

725:デフォルトの名無しさん
08/04/16 02:46:22
なんか物凄く基本的なことのような気がしますが
C言語で、unsigned char から signed char に代入、もしくはその逆を行った場合、ビットバターンは常に保存されますか?

726:デフォルトの名無しさん
08/04/16 02:55:53
>>725
いいえ。

727:デフォルトの名無しさん
08/04/16 03:01:40
>>724
上:strをサポートする二項演算子を書く。
basic_ostream<foobar> & operator <<(basic_ostream<foobar> & os, str & st);
下:無理。

728:デフォルトの名無しさん
08/04/16 03:02:50
>>726
ありがとうございます。そうなると char* を適宜 unsigned char* にキャストしたりしないとダメですね。
一部バイナリが混ざってるファイルを読む必要があったので助かりました。

729:デフォルトの名無しさん
08/04/16 03:58:13
>>728
K&R2 A6.1 (promotion) を参照してください。
char/unsigned char は先に int に変換される点、特に要注意です。

730:デフォルトの名無しさん
08/04/16 04:09:29
>>729 promotion は関係ないだろ。

731:729
08/04/16 04:57:02
>>730
char c = 0x81;
if (c == 0x81)
printf("=\n");
else
printf("!=\n");

の結果って、あれ~?!ってなりませんか?

732:デフォルトの名無しさん
08/04/16 11:52:33
>>731
char が符号付きで最大値が 127 の場合の話なら、
char c = 0x81 の時点で未定義動作。
問題は promotion じゃなくてオーバーフロー。

733:デフォルトの名無しさん
08/04/16 12:09:54
0x81がunsigned charじゃないじゃん

734:732
08/04/16 12:20:21
> char c = 0x81 の時点で未定義動作。
ごめん。間違い。オーバーフローが問題なのは違いないけど、型変換での
オーバーフローは未定義動作じゃなくて、値が処理系定義のものになるか、
処理系定義のシグナルが発生する、らしい。

735:729
08/04/16 20:42:23
>>732 >>734
了解いたしました。

char buffer[N];
...
while (fgets(buffer, N, fp) != NULL) {
if (buffer[i] == ...)
...
}
などと安易に考えると、(たとえば漢字コードの判別など)わからなくなってしまった経験がありました。
unsigned char buffer[N];
とすれば、問題ないのではありますが。

ご指摘ありがとうございました。 またひとつ賢くなりました。

736:デフォルトの名無しさん
08/04/16 20:49:18
>>735
漢字コードをいろいろ扱うなら >>735 だと unicode の時に困るんじゃなかろうか?
(文字列に \0 が含まれる可能性が高いから)

737:デフォルトの名無しさん
08/04/16 21:04:51
C++では以下のように大丈夫そうですけど。
signed char と unsigned char は同表現と書いている
読み間違い?

A char, a signed char, and an unsigned char occupy the same amount of storage and have the same alignment
requirements (3.9); that is, they have the same object representation. For character types, all bits of
the object representation participate in the value representation. For unsigned character types, all possible
bit patterns of the value representation represent numbers.

738:デフォルトの名無しさん
08/04/17 01:47:49
>>737
読みには自信ないのですが、
単に、
1) char/unsigned char/signed char のいずれも同じ量のメモリを占有する。
2) char/unsigned char/signed char のアラインメント(配置位置、偶数バイトを先頭にする、アドレスが4 の倍数のバイトを先頭にする、など)が同一である。
という意味でのみ same としているだけではないでしょうか。
char / unsigned char / signed char の表現がまったく同一であるというのは不可能と思われますのですが。

後続の文では、
char のすべてのビットが数をあらわしているわけではない(単に関係するといっているだけ、符号の場合もありますよ、ということでしょうか。)
unsigned char はすべてのビットが数を構成する要素となる。
と読めます。


739:デフォルトの名無しさん
08/04/17 07:16:24
template <class T>
template <typename T>
この2つはちがいがありますか?


740:デフォルトの名無しさん
08/04/17 07:21:28
違いは無い

741:デフォルトの名無しさん
08/04/17 08:20:34
class じゃないのも使うよなーとか思っていつも typename にする俺

742:デフォルトの名無しさん
08/04/17 08:26:55
俺もある時期から、typenameが手癖になってしまった。
別にこだわるわけじゃないから、もし仮にclassと書いてくれと職場で言われたら
二つ返事でclassにするけど。

743:デフォルトの名無しさん
08/04/17 08:30:00
なんとなく表明の意味で使い分けるかも。
その後しっかり中でstatic_assertするけどね。

744:デフォルトの名無しさん
08/04/17 10:03:28
クラス配列をnewで生成する時に呼ばれるコンストラクタを指定できますか?

745:デフォルトの名無しさん
08/04/17 10:06:12
残念ながらできない。

746:デフォルトの名無しさん
08/04/17 11:04:06
strcatを使わずに
char src[ ] = "seikima"
char dest[4] = "tsu"
という文字列を結合し、表示させることが出来ますか?

747:デフォルトの名無しさん
08/04/17 11:10:49
>>746
char result[11];
sprintf(result, "%s%s", src, dest);
printf("%s\n", result);

748:746
08/04/17 11:14:54
746です。言葉足らずでした。
sprintfも使わずにforを使って何とか表示させたいのですが
いかがでしょうか?

749:デフォルトの名無しさん
08/04/17 11:25:24
>>747じゃないがやっつけ仕事なんで間違ってたらごめん


char ret[11];

for(int i =0 ; i < strlen(src) ; i++)
{
ret[i]= src[i];
}
for(int i=0 ; i <strlen(dest) ; i++)
{
ret[i+strlen(src)}=dest[i];
}
printf("%s\n",ret);

750:746
08/04/17 11:27:20
>>749

>>746に書いたんですが、今回string.hに関するものは使っちゃいけないので
strlenも使用出来ない感じです。

751:デフォルトの名無しさん
08/04/17 11:34:17
>>746にそんなこと書いてNEEEEEEEwwwww

strlen()をsizeof()-1に変えれば同じ動作だ

752:デフォルトの名無しさん
08/04/17 11:37:17
>>746
条件後だししすぎ

char result[20], *p, *q;

for(p=result,q=src;*p++=*q++;);
for(p--,q=dest;*p++=*q++;);

753:746
08/04/17 11:46:22
重ね重ね、申し訳ないです。

ポインタも使ってはいけないようです。

754:デフォルトの名無しさん
08/04/17 11:50:24
宿題かよ。消えろ。

755:デフォルトの名無しさん
08/04/17 11:51:00
ついでに、その出題者はぶん殴っていい。

756:デフォルトの名無しさん
08/04/17 11:55:25
宿題なら学習内容に沿ってるはずだから
テキストでも目を通した方が早いんじゃないの?

何の項目についての課題か分からないんじゃ答えようがないわ

757:デフォルトの名無しさん
08/04/17 11:57:30
入念な釣りだなあ。

次は「 [] 演算子も使えません 」とか?

758:746
08/04/17 11:59:26
一旦、整理してみます。

課題:配列について
内容:char src[ ] = "seikima";
char dest[4] = "tsu";
と配列を用意し、destの中身をsrcに結合させる。
ただし、for文を使うこと・ポインタ、string.hは使ってはならない。

759:デフォルトの名無しさん
08/04/17 12:03:12
>>758
宿題は宿題スレへ。

C/C++の宿題を片付けます 105代目
スレリンク(tech板)

760:746
08/04/17 12:03:56
>>759

誘導ありがとうございます。ご迷惑をおかけしました。

761:デフォルトの名無しさん
08/04/17 12:06:07
連結するための容量は確保しなくていいのか、とか
dest を書き換えずに src に書き込むのか、とか、
宿題にしてもクソすぎるだろ。学校名晒してくんない?

762:デフォルトの名無しさん
08/04/17 12:12:22
746の時点で明らかに宿題じゃないか。なにを今更

763:デフォルトの名無しさん
08/04/17 12:21:40
printfの様な、引数の数が一定しない関数を作るにはどう定義し
中でどう読めば良いのでしょか。

764:デフォルトの名無しさん
08/04/17 12:25:31
Cで標準ライブラリが用意されてない環境なら、自動的に>>758の条件に
近くなると思うけど、ポインタも駄目てのは解らん。

765:デフォルトの名無しさん
08/04/17 12:30:14
>>763
関数のオーバーロードとかでできんじゃね

766:デフォルトの名無しさん
08/04/17 12:30:41
可変長引数でぐぐる

767:デフォルトの名無しさん
08/04/17 12:30:53
>>763
URLリンク(wisdom.sakura.ne.jp)

768:デフォルトの名無しさん
08/04/17 12:31:06
>>763
可変長引数とかva_argsなんかでググるといいと思うよ。

769:デフォルトの名無しさん
08/04/17 12:31:25
>>763
可変引数または可変個引数でぐぐる

770:デフォルトの名無しさん
08/04/17 12:34:09
重婚もいいところだな

771:763
08/04/17 12:37:07
有り難うございます。
stdarg.hなんてヘッダ、目にした事すらありませんでした。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch