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


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

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



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

381 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 09:42:53 ]
>>332
A内でfriend宣言しておかないとA.aのように参照した場合
もしaがprivateやprotectedだった場合エラーになる。

382 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 09:55:23 ]
>>381
この場合はstructで全部publicだから要らんと言われてただけでしょ

383 名前:378 mailto:sage [2007/07/02(月) 10:18:40 ]
378です。
シンプルなプログラムを別に作って、
new演算子でも大丈夫なこと確認しました。

それで、本物の方のプログラムの方をGUIの部品とか
1個ずつはずしていって、シンプルなプログラムに近づけていったところ。。。
(6時間後・・・)

void __fastcall TForm1::Button17Click(TObject *Sender)
{
//なにもしないボタンです。これから実装します。
}
ボタン17を削除して、またボタン作ったら
なぜか閉じるボタンで、ポインタエラーがでなくなりました。
ということで、new演算子で渡しても大丈夫みたいです。
ありがとうございました。

384 名前:デフォルトの名無しさん [2007/07/02(月) 13:07:16 ]
VC7でswitch内で

 switch (val)
 {
//コメント
 //コメント
 case 1:
  〜〜
  break;
 }

こんな感じでcaseの上に複数コメントがあるブロックが多いと、
デバッグの時のブレークポイントや、実行時の位置が
おかしくなることがあるみたいなんですが、どこかに詳細な
報告はありませんか?
検証が甘いですが、VC2005でも同じ現象が起こるみたいです。

385 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 14:12:08 ]
int (*a)[] = new int[10];

386 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 17:39:39 ]
質問です。

Foo::Foo() : m1(), m2(), m3() {}

このようなFooクラスのコンストラクタにおいてm2のコンストラクタが例外を投げたとき、
既に初期化が完了していたm1のデストラクタが呼ばれることは「C++の規格で保障」されているのでしょうか?

VC++2005で確認した限りではその通りの動作をするようですが…


387 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 17:44:42 ]
保証されてる。

Foo::Foo() try : m1(), m2(), m3() { } catch(...) { }

みたいにしてキャッチすることもできるけど、
例外は必ず再送出される。

388 名前:386 mailto:sage [2007/07/03(火) 17:51:16 ]
>>387
ありがとうございます。

> Foo::Foo() try : m1(), m2(), m3() { } catch(...) { }
そういえば function-try block なんて見たのは久々^^;


389 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:04:46 ]
コンストラクタが失敗して例外を投げたときって、
中途半端にコンストラクトされた状態だと思うんだけど、
デストラクタは呼ばれないわけだよね?
メモリリークの原因にならないのかな?



390 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:07:50 ]
if(pMem){ delete pMem; }
でおk

391 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:09:32 ]
>>389
ちゃんと自分で例外をキャッチして開放してくだちぃ。
それが嫌なら vector とかスマートポインタとか使ってデストラクタに任せてくだちぃ。

392 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:12:42 ]
>デストラクタは呼ばれないわけだよね?
catchしたら呼べばいいじゃん。

393 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:12:52 ]
>>390
deleteはNULL渡したら勝手に無視してくれなかったっけ?

394 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:13:12 ]
してくれる。

395 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:13:59 ]
仕様上は無視することになってるが、
昔の VC++ あたりはしてくれなかった記憶がある。

396 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:20:11 ]
そうだっけ?
もしそうなら、そのときはその仕様がまだなかったんじゃないか

397 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:21:03 ]
www.google.com/search?hl=ja&q=directx+if+delete+release&lr=lang_ja
なんてググると、DirectXあたりで
#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }
こんなマクロが出てきたりするからてっきり勘違いしていた。

398 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:24:56 ]
>>396
VC6 あたりまでそうだったと思う。
この仕様があるかどうか微妙な時代かもしれん。

399 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:20:22 ]
SAFE_DELETEの利点は変数にぬるぽを代入してくれる点

解放後にアクセスしようとすると素直に落ちてくれる



400 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:28:18 ]
ニートで暇だからプログラミングの練習でもするかとゲームを作り始めたのですが
いきなり挫折しました。かれこれ4時間ほど睨めっこしてるのですが
どこに間違いがあるのか検討つきません。ご教示お願いします。

環境はコンパイラはBoland C++ 5.5 + BolandDeveloper 1.221
WinアプリケーションでDXライブラリです。(多分環境は関係無いんでしょうが)

メッセージはint型はchar *型に変換出来ないと出ます。

一部抜粋
FILE *fp;
char *file_name="map1.txt",buf[99];
char* p;
char* q;

if((fp=fopen(file_name,"r"))==NULL)return-1;

このぎょうです。→ while((fgets(buf,sizeof(buf),fp))!=EOF){
j=0;
p=strtok(buf,",");
map_data[i][j]=atoi(p);
j++;
while(p!=NULL){
p=strtok(NULL,",");
if(p!=NULL){
map_data[i][j]=atoi(p);
j++;
}
}
i++;
}
fclose(fp);

401 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:32:58 ]
とりあえず、fgetsはEOFなんか返さないってば。

402 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:39:19 ]
>>401
ありがとうございます。
・・・orz

混乱していたから別ファイルで作ったのを
コピペ改変していました。

なんでこんなミスばっかりやらかすんだろな・・。俺は。

403 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:39:50 ]
だからニートなんだろ

404 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:38:48 ]
すみません。mallocって確保したメモリのポインタが返ってくるのですが、
このポインタって確保したメモリのどこを指しているのですか?
このポインタ指しているところの規定ってあるのですか?あればどんな規定?

405 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:42:38 ]
>>404
最初(0アドレス)を指してる。

406 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:47:07 ]
0アドレスって凄い誤解されそうな・・・。

407 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:49:05 ]
char *p = malloc(size); とすれば、

p[0] 〜 p[size - 1] のメモリをアクセスできることが保証され、
p + size が無効なアドレスにならないことが保証されている。

408 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:27:47 ]
何となく思ったことなんですが、
char *s = "hoge"; は
char s[] = "hoge"; と違って、中身を書き換えたりしたらダメなんですよね。じゃあ、最初から
const char *s = "hoge"; としておいた方が、間違って書き換えちゃったりしたらコンパイル時にエラーになって、
深夜のデバッグ作業突入を防げるような気がするんですが、これはいい考えですか?
それとも、気をつければいいだけですか?

409 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:30:13 BE:223773825-2BP(21)]
>>408
とてもいい考えアル
と、effective c++あたりに書いてあった希ガス



410 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:37:22 ]
>>408
char *s = "hoge";
char s2[] = "hage";
s = s2;
s[1] = 'i';

constをつけるとこれもできなくなる。やらないと思うけど。

411 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:43:50 ]
const char* const s ="hoge";

にすれば
s++
とかも防げるぜ!



以下修飾子の位置について終わりのない議論が始まります

412 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:45:27 ]
>>408
少なくとも自分は条件反射的にconstつけてる

413 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:46:11 ]
結論出たので終了

414 名前:デフォルトの名無しさん [2007/07/04(水) 01:05:17 ]
今日wstring型ってのを知ったのですが、
  wstring a[2];
  a[0] = L"あああああ";
  a[1] = L"いいいいい";

  wcout << a[0] << endl;
  wcout << a[1] << endl;

ってやっても何も出力されません。
なぜでしょうか?教えてください。
ググっても良い資料が見つからない、、、。

415 名前:デフォルトの名無しさん [2007/07/04(水) 01:06:39 ]
>>414です。
”何も”ではなく空白行が2行出力されます。

416 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:07:36 ]
wcout locale imbue
でググるんだ!

417 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:23:30 ]
string

418 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:25:59 ]
横レスだが、MacOSX GCC 4.0.1 だと locale に何渡しても runtime_error になるな。

419 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:53:39 ]
Javaの静的初期化メソッドみたいなもの、C++にありましたっけ?
たとえば、

class hoge {
static int num[100]; //この配列を0-99まで初期化したい
}
hoge::int num[100];

といったとき、どう書くのが一番スマートですか?
(num[100]={0, 1, 2...} とやるのはなしとして)
コンストラクタ内で初期化しようとすると
インスタンスを生成するたびに何度も同じ処理が
繰り返されることになるので無駄だし……
初期化処理が既に終わっているかどうかを示す
フラグを追加するとかでしょうか。



420 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:04:49 ]
今考えたけど、こういうゴリ押しができなくもないな。
friend しなくても通ったけど、これって規格的におkなの?

#include <iostream>

class hoge {
private:
static const int SIZE = 10;
private:
struct static_init {
static_init() {
for(int i = 0; i < SIZE; ++i) {
num[i] = i;
}
}
};
public:
static void show() {
for(int i = 0; i < SIZE; ++i) {
std::cout << num[i] << std::endl;
}
}
private:
static int num[SIZE];
static static_init static_init_;
};
int hoge::num[hoge::SIZE];
hoge::static_init hoge::static_init_;

int main() {
hoge::show();
}

421 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:17:42 ]
この程度で充分じゃね?
class hoge {
 static int num[100];
};
int hoge::num[100];
static int initialize() {
 for (....) {
  ...
 }
}
static int initializer = initialize();

ファイルスコープのstaticが嫌いならnamespace{}でも。

422 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:24:58 ]
関数を friend にする必要があるね。
個人的には戻り値 int が必要になるのが気持ち悪い。

423 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:36:10 ]
>>421
うわー、その手がありましたか。
絶対忘れないように今すぐそれ使って何か書いてきます。
ありがとうございました。

424 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:56:23 ]
class CStaticInt
{
public:
  CStaticInt(void)
  {
    for( int i = 0; i < 100; i++ )
       a[i] = 0;
  }
  ~CStaticInt(void){}

  static CStaticInt* GetInst( void ) {
    static CStaticInt obj;
    return &obj;
  }
  int a[100];
};

こういうのもどう?
んで、CStaticInt::GetInst()->a[0]でアクセスする
マクロ化すれば使用に耐えられなくも無い…かもしれん('A`)

425 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 12:45:31 ]
scanf("%s",str);
if(strcmp(str," ")==0)
printf("空白文字");
これで入力された文字が空白かどうか調べようとすると
strcmpが0とならずprintfが実行されません。
これってどこがダメなのでしょうか?


426 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 12:47:49 ]
>>425
入力が半角空白1文字じゃないんだろう。
else で puts(str) してみれば?

427 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:02:37 ]
>>426
う〜ん、なんか動かしてみると
scanfが空白文字を読み込んでないみたいな動作をするというか、
半角空白を入力すると入力が終了せず延々と入力を促すようになるのです。
だからif文の後もelse文も実行されない感じでしょうか。


428 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:11:21 ]
%s は空白を飛ばすから当然そうなる。

429 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:16:38 ]
>>428
そうなのですかorz
では文字列を入力するという処理で空白文字が入力されたか
というのを調べるには↓みたいにするしかないですか?

fgets(str,N-1,stdin);
if(str[0]==' ')
printf("空白文字");



430 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:20:54 ]
strstr()


431 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:42:00 ]
>>429
どういう仕様にしたいのかが今ひとつ分からんから何とも言えんなあ。
" hoge " とか "hoge hoge hoge" とか入力された場合どうしたいのかな?

432 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 14:08:13 ]
>>431

char str[N][N];
int i;
for(i=0;i<MAX;i++){
printf("文字列入力:");
fgets(str[i],N-1,stdin);
if(str[0]==' ') break;
}

こんな感じで空白文字が入力されたら入力を打ち切る仕様にしたいのです。
だから"hoge hoge hoge"の場合はそのまま文字列として格納です。

>>430
紛らわしいこと書いてすみません、仕様は上記のような感じでした。

433 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 14:10:00 ]
if(str[i][0]==' ') break;
でした。書き間違い。

434 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 14:12:14 ]
>>432
" hoge " はどうなの?

435 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 15:15:03 ]
>>434
それは考慮してなかった…。
コマンドラインでの入力が「半角スペース+Enter」の場合のみ
入力を打ち切るという仕様だと思います。


436 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 15:19:33 ]
>>435
あと、" hoge " と入力された時、
最初と最後の空白をどうするのかという問題もある。

437 名前:デフォルトの名無しさん [2007/07/04(水) 17:09:55 ]
TCHAR buf[100];
cin >> buf;
ってすると UNICODE 版でコンパイルするとエラーになるのですが、
cin の TCHAR バージョンってないのでしょうか?

438 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:13:46 ]
自分で作るしかなかったと思う。

#ifdef UNICODE_
wistream& tcin = wcin;
#else
istream& tcin = cin;
#endif

439 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:37:17 ]
>>404 から >>407 さんへ、有難うございました。
すいません
>>407
>p + size が無効なアドレスにならないことが保証されている。
これ意味の解らないのですが、p + sizeのアドレスって、
確保されたメモリの次アドレス(確保外)が無効なアドレスにならないてことですよね。
なぜ、確保外の次のアドレスを無効なアドレスにならないことを保証しなければならないのですか?



440 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:46:51 ]
ポインタ変数でループする際の終端として使えるようにするため。

441 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:48:26 ]
>>439の訂正
誤:これ意味の解らないのですが、
正:これの理由が解らないのですが、

442 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:55:36 ]
>>440
有難うございました。
つまり、これに使うためにってことですね。
for( char* ptr = p; p != ptr; ptr++){}

>>407 さんと >>440さんのおかげで少し賢くこうなりました、ぺこり

443 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 19:15:40 ]
それだといきなりループが終わるw
C++ やってりゃ分かると思うけど、
algorithm でやってるあーいう処理ね。

444 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 20:59:34 ]
あいやー、いきなりループが終わるんですか、ガクブル、どうすれば良いんですか

445 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:01:14 ]
こんな感じ

#include <stdio.h>
#include <stdlib.h>

void fill(int *begin, int *end, int first, int step) {
int *p;
int n = first;
for(p = begin; p != end; p++, n += step) {
*p = n;
}
}

int sum(int *begin, int *end) {
int *p;
int n = 0;
for(p = begin; p != end; p++) {
n += *p;
}
return n;
}

#define SIZE 5

int main() {
int *p = malloc(sizeof (int) * SIZE);
if(p == NULL) { return EXIT_FAILURE; }
fill(p, p + SIZE, 0, 1);
printf("%d\n", sum(p, p + SIZE));
free(p);
}

446 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:05:50 ]
c++で全角と半角を格納している配列から一文字ずつ読んで
標準出力させたいんですが、全角の1文字目と半角を区別することができません。

string str = "あイウ()";

for (int i = 0;i<=100;i++)
{
printf("%c",str[i]);
}

こうすると半角は正しく出力されますが、半角が出ません。
どうしたらいいですか?

447 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:12:41 ]
>>446
色々方法はある。
_mbclenを使うとか、wstringやUNICODEにするとか。

448 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:26:22 ]
> 半角は正しく出力されますが、半角が出ません

どっちなんだよ?

449 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:32:50 ]
>>445
有難うございます、あす、これとmallocの知識を引っさげて学校で自慢してきます



450 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:33:27 ]
>>449
他にこのスレ見てるやつもいるかもなw

451 名前:445 mailto:sage [2007/07/04(水) 21:34:47 ]
>>447
なるほど。書いてもらったやつで調べてみたら
できそうですね。ありがとうございます。

あと少し教えてください。
「_mbclen」のアンダーバーは何を意味しているんですか?

それとアンマネージドというのは.NETの機能を
使わなければいいんですよね?
MFC、ATL、SDK、WINDOWS APIとかその辺の区別が全く理解できなくて・・・。


452 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:35:45 ]
>>448
すいません。「全角が出ません」の間違いです。

453 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:44:47 ]
>>451
処理系オリジナルのものと言う証。
下線で始まる名前は、処理系のために予約されている。

454 名前:デフォルトの名無しさん [2007/07/04(水) 21:59:18 ]
C++初心者です。型変換のことで教えてください。
main(){ int iv; iv=int(3.14); }
この「int()」は何ですか?キャスト演算子ですよね?それとも値生成演算子?
また、
class T { int miv; public: T(int iv=0):miv(iv){} };
main(){ T oa; oa=T(2); }
このT(2)は、変換コンストラクタの呼び出しですよね?キャストとは呼ばない?
さらに、main()を次のように書き換えると、
main(){ T oa; oa=static_cast<T>(2); }
このstatic_cast<T>(2)はキャストだけど、実はT(2)と同じですよね。
じゃあ、T(2)もやはりキャストなのでしょうか?コンストラクタの呼び出しとは言わない?
ネットやいろんな本を見ても、このあたり、はっきり書いてないのです。

455 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:00:47 ]
>>453
わかりました。ありがとうございました。

456 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:06:07 ]
>>454
>この「int()」は何ですか?キャスト演算子ですよね?それとも値生成演算子?
int のコンストラクタの呼び出しによるテンポラリオブジェクトの作成。

>このT(2)は、変換コンストラクタの呼び出しですよね?キャストとは呼ばない?
T のコンストラクタの呼び出しによるテンポラリオブジェクトの作成。

>このstatic_cast<T>(2)はキャストだけど、実はT(2)と同じですよね。
多分同じ。

457 名前:454 mailto:sage [2007/07/04(水) 22:20:46 ]
>>456さん、早速ありがとうございます。
intのようなC言語からある型の場合も、コンストラクタ、オブジェクトという概念で
考えるのですかぁ。C++では、intなどの型もクラスのような感じ?

C++本やネットでは、int()は(C風の)キャストだという記述が多いですが、
「コンストラクタ呼び出しによるテンポラリオブジェクトの作成」は、
別な言い方をすれば「キャスト」と同じこと、という理解で良いのでしょうか?
static_cast<T>(2)はT(2)と規格上同じだし、(T)2、と書くことも出来るから考えると。



458 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:23:22 ]
キャストは引数を複数取れないから基本的には別のもの。
引数が 1 つの場合は同じようになるだけで。

459 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:27:09 ]
規格票の 5.2.3 明示的型変換(関数的記法) によれば、
この記法とキャストは同等だと書いてありますね。



460 名前:454 mailto:sage [2007/07/04(水) 22:40:00 ]
型がクラスの場合は、
引数1つだとキャストと同じ表記だけどキャストとは別もののコンストラクタ呼び出し、
というのは、納得です。

じゃあ、例えばintの場合、Cでは「 (int)3.14」はキャストですよね?
C++では、「(int)3.14」はコンストラクタ呼び出しであって、キャストではないということ?
それとも、「(int)3.14」はキャストだけど「int(3.14)」はコンストラクタ呼び出し?

と、ここで>>459さんもコメントどうもです。
とすると、意味合いとしてはキャストと、このコンストラクタ呼び出しは同じってこと?
それとも、記法としては同じであって、でも意味合いとしては別もの、ということ?


461 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:46:33 ]
同じものの違う表記法というだけみたいですね。

462 名前:デフォルトの名無しさん [2007/07/04(水) 22:47:33 ]
>>408
char *s = "hoge";
は、書き換えたりしない(書き換えられないとは違う)。
同じ文字列リテラル(ダブルクォーテーションで括った文字列)は、
コンパイラに特別指定しない限り同じ領域を指すポインタである。
深夜までデバッグしたくなければ書き換えるのはやめれ。

従って、("hoge"[2] == 'g')
は、真になる。参照する方はやりたい放題。

関数内での
char s[] = "hoge";
はありえないと思うのだが、検証した?

char s[]というのはポインタではなく、要素数を省略した配列なので、
まず、要素数が決まる `= { ... }' という構文が必要。
そして、この構文は静的変数(グローバル変数か、スタティック変数)にだけ許される。

例えば、static char s[] = { 'h', 'o', 'g', 'e', '\0' };
これなら別の値に自由に変更可。

例外として、引数がある
void hogege(char hoge[]);
これは
void hogege(char *hoge);
と全く同義なので自由に書き換えられる。
もちろん、呼び出し元の関数と調和をはかるように。


463 名前:454 mailto:sage [2007/07/04(水) 22:51:48 ]
昨日、本屋で「C++の設計と進化」を立ち読みしたです。
索引で見つけた「コンストラクタの表記」を引いてみると、
クラス型名(式)の表記によってコンストラクタを式中でも使えるようになった、
というようなことが書いてあり、さらには、この表記は、
キャストの表記と同じだ、とも書いてありました。
でも、コンストラクタの表記とキャストは同一だという説明はなく、
このあたりは、はっきりとは書かれていなかったです。

C++の本は、新しい4つのキャスト演算子については必ず説明がありますが、
オブジェクトの初期化とコピーコンストラクター以外の
コンストラクタの呼び出し(とテンポラリオブジェクトの作成)については、
ほとんど説明がないですねぇ。。



464 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:57:01 ]
正確な情報を知りたければ規格票を見るのが一番ですよ。
www.jisc.go.jp/app/JPS/JPSO0020.html
C++ の規格番号は X3014 です。

465 名前:454 mailto:sage [2007/07/04(水) 23:00:56 ]
>>464
はい、逝ってきます・・・

466 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:17:00 ]
>>460
459ではあれだけで終わっているが、
実際のところ、5.2.3には続きがあって、括弧の中の式の並びが複数ある場合、
コンストラクタを呼び出して一時オブジェクトを作ると規定されている。

歴史的には、コンストラクタを呼んでクラスの一時オブジェクトを作る構文として
導入されたのが最初で、後にそれを一般化して全ての型に対して使えるようになった。
(C++の設計と進化に書いてあるとおり)
その際、組込型では型変換演算子と同じ効力を持たせたという次第。

また、1つしか引数を取らないコンストラクタは、そのクラス型への型変換を提供する。
だから454でのstatic_cast<T>(2)は結局コンストラクタ呼出として機能する。
(あと型変換演算子の話もしたいが省略)

C++は、型変換を即ち新しいオブジェクトが作り出されることと捉えているように思われる。
すると、コンストラクタ呼出と型変換の境界が非常に曖昧になっているも納得がいく。


467 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:24:01 ]
(int*)p はできるけど int*(p) はできないってところとか、
本当に細かい文法的な違いはあるね。

468 名前:454 mailto:sage [2007/07/04(水) 23:34:42 ]
>>466
ちょっと判ったような気になりました。ありがとう。
ついでにもう一つ。これから変換関数、変換演算子を勉強しようとしているところですが、
この2つ、同じものですよね?呼び方が違うだけで。


>>467
そーですね。単一名称(単純名称)でないとだめ、という説明はよく見ます。
typedefすれば大丈夫、ともよく書いてある。

469 名前:454 mailto:sage [2007/07/04(水) 23:49:26 ]
いま、JIS3014を検索してみました。
「変換関数」はたくさん出てきます。
「変換演算子」というのは該当無しで、
「型変換演算子」は、dynamic_cast, static_cast, reinterpret_cast, const_cast
のことを指すのですね。
ネットでググると、変換関数の意味で「変換演算子」を使っているページが
たくさんヒットするんですが、これらはみんな間違ってるのかな。

というか、JIS3014、おもしろい。絶対的な信頼があるから、
間違いを疑う必要もないしね。



470 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:18:30 ]
間違いはないけど、コンパイラが対応してないこともw
export とかほとんど対応してないし。

471 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:35:03 ]
>>462
初心者騙して楽しいか?

> 同じ文字列リテラル(ダブルクォーテーションで括った文字列)は、
> コンパイラに特別指定しない限り同じ領域を指すポインタである。

そんなことは決まってない。

> そして、この構文は静的変数(グローバル変数か、スタティック変数)にだけ許される。

自動変数でも配列要素数の省略は使える。

472 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 04:58:00 ]
質問です。
Microsoft Visual C++ 2005 Express Editionにおいて、
C++のアプリケーションを作っています。

コンパイル後の.exeファイルのプロパティで
バージョン情報や会社名などが表示されるタブが出ません。

ソリューションエクスプローラ中にはAssemblyInfo.cppという、
AssemblyTitleAttributeなどが配置されたファイルが自動生成されています。
しかし、反映されません。(検索などではC#で作成され、csの場合のみ反映されるらしい)

対処法か代替案を持っていらっしゃる方はおりませんか?

473 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 05:13:07 ]
>>472
こっちで聞いた方がいいと思う

Visual Studio 2005スレ Part21
pc11.2ch.net/test/read.cgi/tech/1180692040/

474 名前:デフォルトの名無しさん [2007/07/05(木) 09:03:52 ]
実行環境はWindows環境、開発環境はVS6.0です。
メールを送りたいのですが一般的な既存ライブラリは存在しているのでしょうか?
イメージしているのはWinsockに依存したライブラリですが
普通はそのままSMTPを喋るものなのでしょうか?

受信は必要なく、OB25Pも問題ありません。

475 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 09:38:14 ]

Windowsで一般的といえばMAPIだろうな

俺は使いたくないけどw



476 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 09:42:20 ]
basp21.dll

477 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 10:46:02 ]
>>476
そういえばそんなのもあったね。

478 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 11:05:27 ]

ttp://www.hi-ho.ne.jp/babaq/basp21.html
2007年6月29日更新

タイムリーすぎてワロス
まさか自演じゃないだろうな


479 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 11:31:25 ]
Windowsで簡単に見た目もいけてるGUIを作るにはどんな方法があるでしょうか?

ちなみに過去にチャレンジしたこと

・C++/CLR
コントロールは豊富だが、OfficeとかVSにあるようなフローティングメニューが見つからないので中断
日本語の資料が少なくて困る
既存のリソース(DLLなど)と組み合わせるときに
DLLのほうの仕様を変えないとうまく動かないor非常にめんどくさいの2択になる
あと変な拡張構文がキモい

・MFC
デフォルトのコントロール数が貧弱だが、資料も多いし、
Win32APIをラッピングしてある程度のものが多くわかりやすい。
VS2005で作成するとManifestでうんぬんとうざいのでスタティックリンクできないプロジェクトだとだるい。

・C++Builder
GUIのデザインをするには最強だと思うが、本体が生きてるのか死んでるのかよくわからんのと
重い、謎のバグがいつまでも取れない、というのがネック。
未だに6を使ってる人が多い。
VCと一緒に入れるとデバッガが正常に動かない可能性がある?

・WTL
何がいいのかさっぱり




480 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 11:40:11 ]
CEGUI

481 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 11:56:50 ]
>>479
SWINGとかAWT継承すれば?
C++じゃなくなるけど






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

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

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