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


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

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



1 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 22:39:18 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.56【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1215278693/

【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。

396 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 01:50:47 ]
>>395
ひらがなが先だっけ?
なら例が間違ってるわ。
すまん

397 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 01:53:16 ]
>>396
いや、アルファベットをローマ字で昇順に並べても、文字コード順にはならんよ。

398 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 10:26:24 ]
>>397
そうでした

399 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 14:51:23 ]
#include <iostream>
using namespace std;

//関数addの宣言

void add(int *px, int *py, int *pz);

//点数を加算するプログラム

int main()
{
int x1;
int x2;
int a;

cout << "2科目の点数を入力してください\n";

cin >> x1 >> x2;

cout << "加算する点数を入力してください\n";

cin >> a;

add(&x1, &x2, &a);

cout << "科目1は" << x1 << "点です\n";
cout << "科目2は" << x2 << "点です\n";
return 0;}
//関数addの定義
void add(int *px, int *py, int *pz){
*px += *pz;
*py += *pz;}

400 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 14:53:22 ]
2科目のテストの点数(x1,x2)にa点を加算する関数add()を、ポインタを使って定義しなさい。
という宿題が出たのですが、これで実行したら成功したのですが。
これは無駄過ぎるという所はありませんか?
あったら指摘お願いします

401 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 14:55:17 ]
宿題スレに書かずにここに書く辺りが無駄。

402 名前:デフォルトの名無しさん [2008/07/27(日) 15:00:46 ]
>>400
まあパッと見pzはポインタにする必要はまったくないな。

403 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 15:01:49 ]
宿題スレは〜のコード書いてくださいとかだと勝手に解釈してたので
こっちの方に書き込んでしまいました。
ご迷惑おかけして大変申し訳ございませんでした。
この場を借りて謝罪いたします。

404 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 15:05:10 ]
>>402
指摘ありがとうございます。



405 名前:デフォルトの名無しさん [2008/07/27(日) 17:59:33 ]
template<class T, class U>
void f(T t, U u)
{
  ...
}

template<class T>
void f<T, int>(T t, int u)
{
  ...
}

こういうことってできないんだっけ?
error C2768: 'f' : 明示的なテンプレート引数を使用することはできません。
って出るんだが。

406 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:01:19 ]
<T, int>いらない

407 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:04:36 ]
>>406
ありがとうさん

408 名前:405 mailto:sage [2008/07/27(日) 18:07:53 ]
template<int I, int J>
void f()
{
}

template<int I>
void f<I, 0>()
{
}

これは無理?
J=0の場合のみ特殊化。


409 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:11:11 ]
テンプレート使った際の演算子オーバーロードで悩んでいます。
コンパイルエラーは以下のように出ます。
-------------------------
Test.cpp:13: error: expected constructor, destructor,
or type conversion before ‘Test’
-------------------------
このエラーを理解できないため、デバグできません。
どうしたらいいのでしょうか?
教えてください。

ソースは以下。


410 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:12:25 ]
// Test.cpp
#include<iostream>
using namespace std;

template<typename T>
class Test{
 public:
  T value;
  Test(){};
  Test operator+(const Test& t);
};

template<typename T>
Test Test<T>::operator+(const Test<T>& t) //←13行目
{
 Test tmp;
 tmp.value = value + t.value;
 return tmp;
}

int main()
{
 Test<int> test1, test2;
 test1.value=100;
 test2.value=200;
 Test<int> test3 = test1 + test2;
 return 0;
}
-------------------------

411 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:15:34 ]
Test<T> Test<T>::operator+(const Test<T>& t)
じゃない?

const Test<T> Test<T>::operator+(const Test<T>& t)
このほうがいいかな

412 名前:410 mailto:sage [2008/07/27(日) 18:25:03 ]
おお!
ありがとうございます m(_ _)m

続けて質問して申し訳ないのですが、
const をつけると付けないとではどのようなちがいがあるのでしょうか?

413 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:34:16 ]
クラスのメンバ変数をポインタ型にすると
メンバ変数が定義されていないとか言うんだけど
何これ…

414 名前:413 mailto:sage [2008/07/27(日) 18:41:51 ]
間違えた
メンバ変数じゃなくてメンバ関数をポインタ型にすると
メンバ変数が定義されていないって出る



415 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:42:39 ]
class hoge{


416 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:46:14 ]
直感で
static付けたらどうでしょうと言ってみよう

417 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:48:36 ]
メンバ関数をポインタ型?
メンバ変数をメンバ関数ポインタの型にするって事か?

418 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:54:38 ]
>>417
class A{
    praivate:
     int *a;
    public:
     void *get_a();
}
void A::*get_a()
{
  return a;
}

aが定義されていない識別子です

ってなる

419 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:56:44 ]
void* A::get_a()

420 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:58:56 ]
voidじゃなくてintだった…
>>419
解決した。ありがとう!

421 名前:デフォルトの名無しさん [2008/07/27(日) 18:59:27 ]
すみません。。。お尋ねしたいのですが、
GDBでUTF-8の内容を表示させるにはどうすればよいのでしょうか?
ご存知の方がいらっしゃいましたら何卒ご教授下さい。
よろしくお願いいたします。

422 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 19:37:58 ]
TCHAR pString[64] ;
std::wcin.getline(pString, 64) ;

が入力を待たずに終わってしまいます。
プロジェクトを別に作って試したんですが他ではちゃんと入力を待ってます。

どういう状況の時だと処理を待たずに終了してしまうのでしょうか?

423 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 19:52:06 ]
>>422
現象とは関係ないけど、それ、wchar_tかWCHARを使ったほうがいいよ。

424 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 20:15:58 ]
>>422
直前で数値や文字列を入力したときに改行が残ったままになってるとか



425 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 20:25:08 ]
文字列に指定した文字がいくつあるか調べる関数を作成して、実際にキーボードから文字を入力して文字の個数を調べるコードを書いたのですが。
include <iostream>
#include <string>
using namespace std;

//関数countの宣言
int count(char str[], char ch);

//指定した文字数を調べるプログラム

int main()
{
char str[256]; //入力する文字列
char c; //調べる文字
int sum; //文字数

cout << "文字列を入力してください\n";
cin >> str;

cout << "探したい文字を入力してください\n";
cin >> c;

sum = count(str, c);

cout << str << "の中に" << c << "は" << sum << "個あります\n";
return 0;
}

426 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 20:26:14 ]
//関数countの定義
int count(char str[], char ch){
int j; //文字列の文字数
int i;
int num = 0; //カウントする変数

j = strlen(str);

for(i = 0; i < j; i++){
if(str[i] == ch){
num++;
}
}
return num;
}

これで実行してちゃんとカウントできたのですが、無駄過ぎる文はありませんか?
指摘お願いします。
連投すいません;; 

427 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 20:29:50 ]
>>426
sum = std::count( str.begin(), str.end(), c )



428 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 20:30:22 ]

 std::string と std;;wstring で template を使って関数を共通化したいんだけど,
文字列リテラル ( "hoge" と L"hoge") や,文字型の違い ( 'a' と L'a') を吸収するには
どうやったらいいの?

 例えば,バックスラッシュを付け足す場合とか.

template <typename string_type>
string_type& AddBackSlash(string_type& str)
{
  return str += '\\';//← wstring の場合は L'\\' にしたい,
}

429 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 20:31:09 ]
>>427
ありがとうございます!

430 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 20:37:12 ]
>>428
特殊化

431 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 20:58:44 ]
おすすめのエディタ教えてください!
今までC言語を始めよう!というフリーソフトを使ってきました

432 名前:428 mailto:sage [2008/07/27(日) 21:13:16 ]

>>430 ありがとうございます.特殊化するということはコピペして,wstring に置換して, L を付ける作業をするしかないですかね…

template <typename string_type>
string_type& AddHoge(string_type& str)
{
  string_type strInternal = "foo";
  return str += "Hoge";
}

//特殊化
template<>
std::wstring& AddHoge<std::wstring>(std::wstring& str)
{
  std::wstring strInternal = L"foo";
  return str += L"Hoge";
}

433 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 21:32:49 ]
>>423-424
ありがとうございます、>>424さんが言われたとおり直前で数値をwcinにて
受け取ってます。それをコメントアウトしたらgetineのとこで処理が
止まりました。

原因はわかったのですがどうやって回避してよいのでしょうか?^^;


434 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 21:41:25 ]
std::vector<double> v(100);
このとき確保されるメモリは実装しだい?



435 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 21:56:05 ]
はい。sizeof(double)*100かもしれませんし、*128かもしれません。

436 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 21:57:02 ]
>>431
結局は好みだから使ってみて気にいったのを使えよ。
因みに俺はemacs使ってる。

437 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 22:03:18 ]
>>426

 strlen(str) で文字列の末尾まで '\0' を検索した後に,
再び文字を検索するのが無駄と言えば無駄かも.


int count(const char str[], const char ch)
{
  int num = 0; //カウントする変数

  while( *str != '\0' ) if( *str++ == ch ) num++;

  return num;
}

438 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 22:08:45 ]
int count(const char * const str, const char ch)
{
unsigned num = 0;
for (char const * p = str; (p = strchr(p, ch)) != NULL; ++p) ++num;
return num;
}

439 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 23:13:07 ]
nul終端文字列ってほんと頭悪い仕様だよな。色々非効率だし。

440 名前:437 mailto:sage [2008/07/28(月) 01:14:04 ]

>>438 そんなに変わらないだろうと思ってたけど,ずいぶん速いな

441 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 01:34:49 ]
>>439
PASCAL stringを授けよう。

442 名前:デフォルトの名無しさん [2008/07/28(月) 02:20:14 ]
メッセージプロシジャでWM_CHARが送られてきた時、
OnKeyDownという関数にwpとlpをそのまま渡しています。
そして、押されたキーが"v"だった時だけ処理をしたいのでstrcmpを使ってみたのですが
そこで強制終了してしまいます。正しくはどう書いたらよいのでしょうか?
教えてください。お願いします。

OnKeyDown(WPARAM wp, LPARAM lp)
{
switch(wp)
{
case VK_RETURN:
break;



default:
if(strcmp((char*)wp,"v") == 0)
{
//キーがvだった時の処理
}
}


443 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 02:26:08 ]
>>442
一文字だったら *(char*)wp == 'v' とかでどうなんだろう
あとメッセージボックスなんかでwpの中身確認してみたらどうだろうか

ついでにこっちの方が回答もらいやすいかもね
Win32API質問箱 Build68
pc11.2ch.net/test/read.cgi/tech/1215348804/

444 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 02:31:31 ]
>>443
MessageBoxに表示させようと
wpをchar*にキャストしたら同じように落ちました・・・
とりあえずそっちで聞いてきます。
ありがとうございました。



445 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 11:16:35 ]
初心者ですがC言語を覚えるには数学ができないと駄目ですか?

446 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 11:19:21 ]
C言語だけなら算数が出来れば十分
3Dやら暗号やら圧縮やらを扱いたいなら数学が必要になってくるかも

447 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 11:21:27 ]
446さんありがとうございます。

448 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 11:29:53 ]
C言語で仮に3Dアクションゲームを造るとすると最低限高校1年の数学と物理が理解できればチャレンジしても無謀ではないですか?
数学:sin cos tan(三角関数?)等
物理:ベクトル等

449 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 11:34:01 ]
うん、あと行列がわかってれば
物理演算しようってわけじゃないんだから、完全な理解も必要なし

450 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 11:39:08 ]
ライブラリ使えば自分で計算する必要ももちろんないしね

451 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 13:18:58 ]
まぁ行列分かってれば中学生でもできるよ。

452 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:03:08 ]
まぁそれをいったら
ベクトルが分かっててプログラミングができるなら小学生にもできるよ、って話だけどな

453 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:04:41 ]
ベクトルも行列もプログラミングも分からない大学生にはできないといいたい訳だな

454 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:13:46 ]
分からなきゃ勉強するまでさ。
今までだってそうやってきただろ?



455 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:15:05 ]
>>454
>>453 に例示されるような人はおそらく勉強しないでしょう

456 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:27:06 ]
スレ違いだと思いますが流れ的に質問させてください。
CとC++とwindowsプログラミングを一通り勉強したので
次にDirectXの勉強をしようと思っているのですが、勉強する前に三角関数・ベクトル・行列を復習してから(曖昧なので)
DirectXの勉強をしたほうが理解が深まると思うのですがどう思いますか?

先輩方アドバイスよろしくお願いします。

457 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:29:49 ]
先にDirectXのチュートリアルでもやった方が良い

458 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:30:12 ]
>>456
目的にもよりますが Direct3D を勉強しながら分からないところを調べるほうがオススメ

459 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:30:21 ]
DirectX進めながら解らないところが出るたびに数学の教科書を見るのでも別に構わんとは思う

460 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:33:25 ]
1からやるわけでもないしな。
思い出すのなら必要なことが出てからでも、今やってることが止まることも無いでしょう。

461 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:37:48 ]
DirectX=3Dじゃないと思うんだけど

462 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:38:01 ]
>>457 >>458 >>459 >>460
アドバイスありがとうございます。
この夏休みでDirectXの基本をマスターして3Dゲームが作れるようにがんばります。

463 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:38:45 ]
>>461
そうなんですか?
勘違いしていたみたいです・・。
もう少し調べてみます。

464 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:43:38 ]
>>461
DirectXの描画は基本3Dじゃなかったっけ



465 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:47:03 ]
Drawが葬られたからね。

466 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:48:25 ]
実はDirectSoundだけ使いたい・・・なんてことはないか

467 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:49:42 ]
>>464-465
そうだった
昔2D描画用のがあったんだけどもうなくなったんだね
あれ結構評判良かったのに

468 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 16:02:03 ]
今でもDirectDrawは使えるし、地味にアップデートもされてる(もうされないだろうけど)
ドキュメントが無くなったけどな

469 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 16:38:04 ]
引数←読み方インスウだと思ってたけど
ヒキスウって最近知った

470 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 16:48:16 ]
returnされる値は
カエリチ?ヘンチ?

471 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 16:48:56 ]
返り血

472 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 16:53:39 ]
>>469
どーぞくハケーン

473 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 16:54:36 ]
独学でやってたってことかな
授業とかでやったら確実に発音するでしょ

474 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 16:58:05 ]
>>470
俺はモドリチ



475 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 17:00:15 ]
普通、戻り値だよな

476 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 17:03:54 ]
オレも返り値は返り血に聞こえるから戻り値

477 名前:デフォルトの名無しさん [2008/07/28(月) 17:05:45 ]
リターンチだろ

478 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 17:07:41 ]
どれも同じだ

479 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 17:12:31 ]
スタックの血を浴びて 〜社会不適応者のデスマーチ奮闘記〜

480 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 17:37:50 ]
新ジャンル:仕事人間サスペンスホラー

481 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 20:39:33 ]
ああ、よく考えたら俺も戻り血だったわ。

482 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 20:52:11 ]
オレは「戻り値として0を返す」とかいう。
でも「返り値として0を戻す」はいったことないな。

483 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 21:21:23 ]
俺は「返り値として」には違和感がある
返り値を使うなら「返り値をaに戻す/返す/当てる」とかは言う
返り値の値に言及する時は思いつかない

484 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 00:56:44 ]
const std::string& GeRefOfFuncStaticString(int n)
{
  static std::string str = boost::lexical_cast<std::string>(n);
  return str;
}

const std::string g_strNotFound("NotFound");

const std::string& GeRefOfFuncStaticString2(int n)
{
  static std::map<int,std::string> mapStr;
  if( mapStr.empty() )
  {
    mapStr.insert( std::make_pair(100, "100") );
    mapStr.insert( std::make_pair(101, "101") );
  }

  std::map<int,std::string>::const_iterator itrFound = mapStr.find(n);
  return itrFound != mapStr.end() ? itrFound->second : g_strNotFound;
}

int _tmain(int argc, _TCHAR* argv[])
{
  std::cout << GeRefOfFuncStaticString( 100 ) << std::endl; // 表示: 100
  std::cout << GeRefOfFuncStaticString( 101 ) << std::endl; // 表示: 100 ← 関数内の static 変数の参照を取り出せない
  std::cout << GeRefOfFuncStaticString2( 100 ) << std::endl; // 表示: 100
  std::cout << GeRefOfFuncStaticString2( 101 ) << std::endl; // 表示: 101
  return 0;
}

 map を使った場合の GeRefOfFuncStaticString2( ) は意図した動作になるんですが,たまたまでしょうか?



485 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 01:24:05 ]
>std::cout << GeRefOfFuncStaticString( 101 ) << std::endl; // 表示: 100 ← 関数内の static 変数の参照を取り出せない

関数内のstatic変数の参照を取り出してますよ。

486 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 01:43:11 ]
>>485 解答ありがとうございます.恥ずかしながら static に関してすごい勘違いをしていたようです.
 初期化が一度しか行われないんですね.以下のようにして GeRefOfFuncStaticString() でも望みどおりの
動作が出来るようになりました.
 有難うございました.

const std::string& GeRefOfFuncStaticString(int n)
{
  static std::string str;
  str = boost::lexical_cast<std::string>(n);
  return str;
}


487 名前:デフォルトの名無しさん [2008/07/29(火) 03:24:06 ]
a

488 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 07:50:00 ]
static変数が緊急対応以外で必要になったときは設計ミス。

489 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 08:06:38 ]
何故static変数にいちいち保存しているのかが謎。

490 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 09:24:49 ]
便乗質問なんだけど

const std::string& GeRefOfFuncStaticString(int n)
{
  static std::string str = boost::lexical_cast<std::string>(n);
  return str;
}

これ static のところ、いつ初期化されるんだ? 今までプログラム
起動時(main以前)だと思ってたんだが、nが関数の呼び出し時に
決まるじゃん。

内部で
if(関数の初回呼び出しなら){
  str = boost::lexical_cast<std::string>(n);
}

みたいなコードにコンパイルされるわけ?
>>484の挙動見ているとそう見えるんだが…

491 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 09:36:58 ]
>>490
それであってる。
ちなみに初期化についてスレッドセーフである保証は無いので、
マルチスレッドのプログラムで排他せずにstatic変数使ったら、
いつ異常動作してもおかしくない。

492 名前:デフォルトの名無しさん [2008/07/29(火) 10:07:55 ]
標準ライブラリのメンバ関数までが詳細に載ってるページってありますか?
探したけど俺の目が悪いんだろうか、見つかりません;;
だれか教えてください

もしくは、この質問に答えてください。

istringstreamのオブジェクトに、文字列を代入(?)するとき、
istringstream is(string("abc"));
のように初期化ではなくて、あとから代入することはできますか?
やり方を教えてください。

493 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 10:18:55 ]
>>491
いつの間にそうなったんだ…

関数呼び出し時に初回判定が入るんじゃあパフォーマンス
に悪影響があるだろうが。

func(){
static int a = 100;
}

は昔どおり初回判定なんか入らないよな?

494 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 10:34:42 ]
>>493
昔から変わってないよ。その int の例でも、関数内で値の変更があったり、
ポインタや参照を外に渡してしまっている場合は初回判定が必要になるでしょ。



495 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 10:35:44 ]
昔どおりも何も、単に最適化で判定が消えてるだけだろ

496 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 10:37:38 ]
>>495>>493

497 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 10:38:57 ]
>>492
istringstream ではなくて stringstream を使ってみては?

498 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 10:41:57 ]
>>492
www.cppreference.com/
www.cppll.jp/cppreference/
msdn.microsoft.com/ja-jp/library/cscc687y.aspx

is.str("abc");

499 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 10:42:21 ]
定数での初期化なら、初回実行時でなくmainの前にされたりするよ。
その辺の最適化は処理系定義。

引数で初期化したら、まず確実に判定が入る。

500 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 11:07:28 ]
std::wofstreamを使ってテキストに書き込む時自動的にファイルの
頭にBOMを追加してくるみたいなものって存在しますか?

自分で先に書くのが普通でしょうか?

自分でFF FE をファイルと開いて書き込んでから
wofstreamを使うと先に書き込んだ2バイトが消されてしまい途方にくれて
おります・・・・

501 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 11:09:44 ]
自分で先に書くのが普通。

502 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 11:22:18 ]
std:ios::app だっけ?

503 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 11:22:48 ]
>>499
つまり、関数内のstatic変数の初期値が定数じゃない限り、初回確認用のフラグもstatic領域に用意されるわけだな。

504 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 11:36:53 ]
>>501-502
std:ios::appでBOMが残せましたmありがとうございます!



505 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 11:43:28 ]
>>494
一連のレスは理解できるのだが、

> int の例でも、関数内で値の変更があったり、
>ポインタや参照を外に渡してしまっている場合は初回判定が必要

これが分からん。

プログラムロード時にaが100になるでしょ。それで、関数内で
値の変更があったり、 ポインタや参照を外に渡してしまっている
場合はどうして初回判定が必要になるの?

506 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 11:48:26 ]
>>505
例えばこんなケース。

int func(int n)
{
static int a = n;
return a;
}

int main()
{
for (int a = 2; a <= 5; ++a) {
printf("%d, %d\n", a, func(a));
}
return 0;
}

507 名前:494 mailto:sage [2008/07/29(火) 12:23:54 ]
>>505
変数宣言通過時に初期化されるんなら初回判定が必要かと思ったんだけど、
プログラム起動時に初期化してもいいみたい。

ってことで >494 は間違いで、初回判定が必要になるのは初期値が定数式じゃないときね。


ごめんよ >>506

508 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 14:13:54 ]
横から失礼します
ファイル中のN個の値で、配列a[N]を作りたいんですが
うまいやり方が思いつかないので、どなたか教えていただけませんか?

509 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 14:15:51 ]
>>508
mallocの使い方を聞いてるのか?

510 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 14:19:20 ]
malloc( new? ) を使えば出来るんですね。やってみます。


511 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 16:37:39 ]
std::vector<型> a(N);でもよいぞ

512 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 18:48:40 ]
ワイマール憲法を構造体で記述せよ
という夏休みの課題が出たのですが、何から始めていいかさっぱりわかりません・・・・。
だれか御助けを・・・・。

513 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 18:49:31 ]
イクイク、ワイマール憲法

514 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 19:32:11 ]
struct kenpoo {
int Y;
int O;
};



515 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 20:45:26 ]
>>512
残念ですが、その課題を出した先生は脳に異常をきたしています・・・。
まともな対話は不可能でしょう。課題の提出は諦めるほかないでしょう。

516 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 21:39:36 ]
みんなイクイク、ベルサイユ条約

517 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 22:07:51 ]
ああ、1919か

518 名前:デフォルトの名無しさん [2008/07/29(火) 22:26:11 ]
class hoge{
private:
std::list<int> foo;
public:
void setfoo(std::list<int> foo){
this->foo.clear();
std::list<int>::iterator itr;
for(itr=foo.begin();itr!=foo.end();itr++)
this->foo.push_back(*itr);
}
std::list<int> getfoo() const{
return foo;
}
};

int main(){
hoge hoge0;
std::list<hoge> hogehoge;

std::list<int> tmp;
tmp.push_back(1);
tmp.push_back(2);
hoge0.setfoo(tmp);
std::list<int>::iterator tmpitr = hoge0.getfoo().begin();
hogehoge.push_back(hoge0);
std::list<int>::iterator itr = (*hogehoge.begin()).getfoo().begin();
std::cout << *itr << "," << *(++itr);
}
このコードで、最後に"1,2"と表示されて欲しいところが、"0,0"となってしまいます。
どこが悪いのかがわからず困っています。よろしければ教えていただけないでしょうか…。

519 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 22:30:32 ]
ほう、それがワイマール憲法か。なるほど

520 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 22:34:42 ]
getfooの戻り値であるhoge::fooの一時コピーが次の文に移る間までに破棄されてしまうからと、
ひとつの式の中でitrを代入と参照の両方してるから

521 名前:518 [2008/07/29(火) 23:03:49 ]
>>520
ありがとうございます。
最後にcoutするところで、itrが無効化してしまってるということでしょうか。
一時コピーが破棄されるタイミングがイマイチわかりません。
たびたびすいません…。

522 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 23:15:52 ]
>>521
完全式の終わりで破棄される

523 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 23:39:25 ]
だれか、C++のえろい人
百聞は一見にしかずだから
>>518のコードを希望通りに動くように修正汁!

すまん、俺C++わからんから><

524 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 23:44:32 ]
getfoo()の戻り値を参照型に換えたら?



525 名前:デフォルトの名無しさん [2008/07/30(水) 00:02:27 ]
C言語勉強のためにプログラムを作成しました。
が、printf("hello")の時点で壁にぶちあたりました。
正しくコードを入れたはずですが、実行して表示されるのは、
2chアップローダ:www-2ch.net:8080/up/download/1217343270379299.ZNkHRl
です。exeと、badが同時に出現するのは何故?さらHELLOが表示されていないのは何故?
「苦しんで覚えるC言語」を参考にやってみたのですが、いきなり苦しいです。
神様助けてください。。。
コンパイラ:Borland C++ Compiler
エディタ:CPad for Borland C++Compiler

526 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:17:17 ]
さらに
std::cout << *itr << ",";
std::cout << *++itr;
と二行に分けると動く。

その理由は、((std::cout.operator<<(*itr)).operator<<(",")).operator<<(*++itr)
というようにちょっと考えるとインクリメント演算子は後から適用されるように思えるが、
インクリメント演算子は副作用完了点に達するまでのどの段階で働いても
構わない事になっているからである。

もっと言えば>>518の動作は未定義である。

527 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:18:11 ]
>>525
なんで start ってするの?compile したのは a.exe とかじゃない?

ところでその本には int main(void) 推奨なの?

528 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:19:57 ]
start.cをコンパイルしたからstart.exeなんじゃないの

529 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:21:51 ]
start.cなんだからbcc32ならstart.exe吐いてくれるはず

まあたぶん./startってやったら動くんじゃない

530 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:24:31 ]
例えば

#include <iostream>
int main()
{
int i = 1;
std::cout << i << ' ' << ++i << std::endl;
}

のようなプログラムは "1 2" と出力しそうであるが、実際は未定義動作であり、
無理矢理動かすと大抵のコンパイラでは直感に反して"2 2"と表示されるのも
同じ理由による。

531 名前:デフォルトの名無しさん [2008/07/30(水) 00:25:04 ]
読み返して言葉足らずでした。補います。
printf("hello");では上記URLのようにexeと、badが同時に出現し、また何も表記が無い状態でしたが
printf("hello\n");では「HELLO」が改行ありで表記されました。
また、printf("%d",100); printf("円\n");では改行ありで「100円」が表記されました。
私の見解では、ただ単に参考にした構文が間違っている(\nが必要だが書かれていなかっただけ)
のだと思いますが。。。意見を聞かせてください。

532 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:26:06 ]
コマンドプロンプトにstartってコマンドあるから
start.exeはまずくない?

533 名前:デフォルトの名無しさん [2008/07/30(水) 00:26:14 ]
>>531
printfのあとに
fflush();つけたらどうなるかな?

534 名前:533 mailto:sage [2008/07/30(水) 00:27:06 ]
いろいろ間違えたごめん忘れてください



535 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:27:24 ]
(なぁなぁ、badって何?)

536 名前:デフォルトの名無しさん [2008/07/30(水) 00:32:52 ]
あ、startじゃぁまずいですか^^;
aに変えました。そしたらbatのみになりました。
参考元URL:homepage3.nifty.com/mmgames/c_guide/index.html
しかも、printf("hello");で改行なし「hello」が表示されました。
お騒がせ申し訳ありません。m(--)m参考元さんも申し訳ありません。m(--)m


537 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:42:51 ]
unixでtestという実行ファイルを作ってハマった当時の俺

538 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:44:24 ]
あるある
うん。あるある

539 名前:デフォルトの名無しさん [2008/07/30(水) 00:44:46 ]
batやらbadやら恥ずかしいことばかり書き込んでしまいました。
セキュリティーホールがあれば入りたいです。
startをaに変更すると、
www-2ch.net:8080/up/download/1217345861729515.WpasSs
な感じになりました。これで夜も安心して眠れます。

>>527 startにしたのは無知だからでした。「手始めにスタート」のつもりでした。
この本というかサイトではそうでした。他のサイトを見てみると他の記述もありましたが、
最初に見たこのサイトの記述で貫こうと思います。

>>532 決定的な回答ありがとうございます。小鳥の1歩ほど前進することができました。
終わりなきC言語を心ゆくまで堪能したいと思います。親切にしてくださってありがとうございます。

>>534 いっしょにセキュリティーホールに入りませんか。

>>535 完全に撃ち間違いです。申し訳ありま栓。



540 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:16:56 ]
すいません質問です。
ソラリスでは使えてたのですが、Linuxだとエラーが出てしまってgoogle検索したのですがいい対応策が見つかりません。

newとdeleteは演算子なのですが、

string * aaa;
というのを.hで宣言し
.ccにて
コンストラクタでNULLクリア
main処理にて値を入れる場合と入れない場合があるのですが、
値を入れない場合に、
デストiラクタでaaaをdeleteしようとすると、落ちてしまいます。
SolarisからLinuxに入れ替えようとしているので、Solarisでは通るのにLinuxでは通らないという事はあるのでしょうか。
簡単にプログラムの例を
classで、
string * aaa;  を宣言しておき、

コンストラクタで、aaaをNULL初期化します。
mainルーチンで、aaaにファイルから文字列を取得するのですが、
該当しない場合はaaaはNULLのままとなっています。
デストラクタで、
if(aaa){
delete aaa;
}
とやっているのですが、そこで落ちてしまいます。
よろしければアドバイスお願いします。







541 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:19:23 ]
コンパイラはgccです

542 名前:デフォルトの名無しさん [2008/07/30(水) 02:19:37 ]
VC++を使用しているのですが、
char ItemObject[1024];
ItemObject = "TEST";
listBox->Items->Add(ItemObject);
とするとコンパイルできません。
プログラミング初心者で、どうすればいいのか分からず困っています。
どなたか、助けて下さい。よろしくお願いします。


543 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:20:01 ]
delete演算子は対象のポインタが 0 の時は何もしないで
戻るようになっている。

従って if文は不要。原因は他の所にあるのではないか。

544 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:23:19 ]
>>542
listBox->Items->Add( gcnew System::String(ItemObject) )

はじめから System::Stringを使え。
それより、このスレはC++/CLIはOKなのかな?C++/CLIはC++とは別物だから明記しておくように。



545 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:28:22 ]
>>543
>>delete演算子は対象のポインタが 0 の時は何もしないで
>>戻るようになっている。
これは知ってはいたのですが、チェックしてしまうクセがついてしまっています。

>>従って if文は不要。原因は他の所にあるのではないか。
やはり原因は他にあるのですかね。
Soralisで通っててLinuxでは通らないので、規格の違いかと思い質問させてもらいました。
(LinuxはSoralisと比べて厳しいので
もうちょっと調べてみます。

アドバイスありがとうございます。


546 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:29:17 ]
>>540
クラスも無いのにコンストラクタとか言ってるのがおかしい。ソース晒せ。

547 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:33:41 ]
memsetでクリアしてたりする?

548 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:39:30 ]
>>546
class hoge{
string * aaa;
}

mainでaaaに文字列を取得
(ない場合は取得しない

hoge::hogeでaaaにはNULLを設定

oge::~hogeで
if(aaa){
delete aaa;
}

としています。

>>547
>>memsetでクリアしてたりする?
memsetはやっていないですね。

文字列取得にはc_str()を使用しています。


549 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:42:52 ]
>>548
hoge にデストラクタもコンストラクタもねーじゃねーか。
ソースを省くな。問題が再現する完全なコードを貼れ。

550 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:51:20 ]
>>549
すいません、完全なコードを張る事ができないので省略してました。
何かしらヒントでもあればと思い質問しました。
SoralisとLinuxの互換性がまだ完全に把握できていないので
分かる人がいればと思い。

もうちょっと自分で調べてみます。解決したら役に立つかわかりませんが書き込みます。

551 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:59:06 ]
>>550
問題が再現する最小のコードを作ってもらわないと、エスパーでもなけりゃわからない。
OS間の互換性に原因があると思ってるようだが、どうせ違う。

そういうコード作るのは相談のためでもあるが、基本的な調査の方法でもあるんで、
たいていは作ってる間に自分で気づくんだけどな。

552 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 03:10:02 ]
全くのあてずっぽうだが、
hogeが意図せずコピーコンストラクタでコピーされてて、
2箇所でaaaがdeleteされているとかないだろうか。
deleteしたばかりで領域が再利用されていない場合に
2回目のdeleteでもエラーにならない処理系は存在する。
Soralisが落ちない処理系で、linuxが落ちる処理系だとすると・・

553 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 03:19:04 ]
>>552
一応gdbでも処理追ってみたのでコンストラクタが2度通ってる事はないみたいです。


554 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 03:23:12 ]
privateでコピーコンストラクタをきってみたら?
デフォルトのコピーコンストラクタが使われているなら、
普通のコンストラクタは通らないよ。

stringがstl::stringだったらポインタで持つ意味があるのかは検討したほうがいいな。



555 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 03:26:42 ]
>>554
なるほどprivateもありですね。試してみます。
stringはstd::stringです。


556 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 03:49:12 ]
OSが違ったら通らないではなくて、Solarisではたまたまエラーが
出なくてLinuxではしっかりチェックされて落ちるってオチだろうな。

多分ソースにバグがある。

557 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 03:58:01 ]
>>556
その可能性大ですね。
Solarisはチェックが甘いからたまたま通ってただけな気がします。
時間あるから作り直そうかな。他にもありそうですし。

元々作った人が逃げて改修まかされて困ったもんです。



558 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 03:58:37 ]
Solarisはdeleteした領域を触っても落ちないからね。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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