[表示 : 全て 最新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でのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。

2 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 22:40:18 ]
しまった。コピペしてそのままにしてしまってた・・・。
正しくはこうだな。

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

3 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 22:58:04 ]
           

4 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 23:58:32 ]
int main(int argc, char *argv[])
{
  FILE *fp;

  if(fopen_s(&fp, "hoge.txt", "w")) exit(1);
  fwrite("hoge", 4, 1, fp);
  fclose(fp);

  return 0;
}

これを普通に実行するとちゃんとファイルが作成されるのですが、アイコンにファイルをドロップして始めるとファイルが作成されません。
なにか制約でもあるのでしょうか?

5 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 00:03:13 ]
>>4
どこか、あなたの知らないところに作られています。
フルパスでファイルを作るか、カレントディレクトリを指定すると宜しいかと。

6 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 00:09:10 ]
>>5
ありがとうございます。わけの分からないところに作られていました。
デフォルトでカレントディレクトリに作られると勘違いしていました。

7 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 05:42:31 ]
class Hoge
{
Hoge() { Init(); }
~Hoge();
Init();
}

このようにコンストラクタ時に
初期化用のメンバ関数を用意して使うことはokなのでしょうか。

8 名前:デフォルトの名無しさん [2008/07/17(木) 05:48:51 ]
ok

9 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 05:57:10 ]
ありがとうございました。
これで長々と書かずに済みます。

10 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 08:00:28 ]
>>7
Initはvirtualにしないことだけ気をつけて。



11 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 08:19:59 ]
>>6
いや、カレントディレクトリに作られているはずだよ。
カレントディレクトリが予想外な場所になっているだけで。


12 名前:デフォルトの名無しさん [2008/07/17(木) 08:43:07 ]
オープンソースのdllなんかを改造して
自分でコンパイルする時
デバッグモードでやるのとリリースモードでやるのでは
どういった違いがでるのでしょうか?

13 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 09:09:55 ]
デバグ情報
最適化

14 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 09:23:44 ]
本当のプロはデバッグモードは使わない。

15 名前:12 [2008/07/17(木) 09:34:57 ]
デバッグ情報っていうのは、どういう場面発生して、どうしたら使えるんでしょうか?

16 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 09:40:29 ]
デバッグ情報がある場合:
gdbとか使ってると、Segmentation Falutなんかが出たときに、
その場所をソースコードの行番号で教えてくれる。

17 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 10:37:12 ]
動的解析ツールでも、デバッグ情報があれば行単位で結果を出せるね。
そうでないと、アセンブラのインストラクション単位になってしまう。

18 名前:デフォルトの名無しさん [2008/07/17(木) 14:23:26 ]
VC++ 6で作成したものをVC++2005で開いてビルドすると
 long lTemp = timeStamp.ulSeconds;
 char* pszTemp = ::ctime( &lTemp );
のところで
 error C2664: 'ctime' : 1 番目の引数を 'long *' から 'const time_t *' に変換できません。(新しい機能 ; ヘルプを参照)
 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
とでてしまいました。
それで
 char* pszTemp = ::ctime((time_t *) &lTemp );
と書き替えたらビルドは通ったのですが、これで問題ないのでしょうか?


19 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 14:28:20 ]
lTempの値次第

20 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 14:54:24 ]
>>10
virtualにしてもコンストラクタ内からだと無視されなかったっけ?



21 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 14:59:10 ]
>>18
time_t の大きさ確認してみ。最悪変なところ書き換えるかも。
VC2005から、時間関係がデフォで64bitになってる。
32bitにするのはなんかマクロがあった。

22 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 15:24:47 ]
>>18
要は、lTempをtime_tにしておけってこった。但し、tieStamp.ulSecondsの仕様に注意な。

>21はどうやらconstが目に入らなかったらしいが。

23 名前:デフォルトの名無しさん [2008/07/17(木) 16:21:55 ]
C言語のソースからC++で定義されている関数を呼びたいのですが
やはり無理でしょうか?

24 名前:23 mailto:sage [2008/07/17(木) 16:25:59 ]
すいません、この場合もextern "C"でいけるんですね。
スレ汚し失礼しました。

25 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 18:15:38 ]
インテリジェントエージェントが動的コードスニペットでバグを起こしそうなコマンドや
構文にチェックをする。その段階でメタレベル構文にデバッグ情報が埋め込まれ、メモリリーク
や例外のときに情報がセットされる。
君が使うのはまだ難しいと思うよ。
怪しい変数をprintfで表示させるところから初めてはどうだろう?

26 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 18:38:12 ]
イミフ

27 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 20:05:54 ]
DEBUGでデバッグしたコードをRELEASEしたらクラッシュしてひどい目にあって以来
RELEASE以外でビルドしてない
出来上がるのは別のプログラムだからDEBUGでDEBUGしても何の意味もないよ
アホらしいけど

28 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 20:11:50 ]
>>27
直接関与はしてないけど
大学の研究室にそういうコードは存在した

なんかコード領域を実行時に書き換えてる風な挙動だった
初期化してないポインタでも使ってるような感じ

初代が作ったものを毎年手を入れていくものだから
何年目でそういうことになったのか不明
初代のコードはすっきりしてたのに、最新版は複雑怪奇w

29 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 20:48:11 ]
>>27
たまたまreleaseビルドで動いてるだけだったりしてな。
VSのバージョン上げてプロジェクト変換したら止まったり、
別のPCでexe動かしたら止まったりw

30 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 21:03:00 ]
Wallにしたらつらつらと出たりしてな。



31 名前:デフォルトの名無しさん [2008/07/17(木) 21:36:18 ]
double hoge[100];

memset(hoge,0.0,sizeof(hoge));


これをするとdoubleからintへの変換っておこられるんですが、何がいけないんですか

32 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 21:47:12 ]
void* memset(void*, int, size_t)

33 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 21:49:32 ]
memsetはバイト単位でデータを埋めるのにしか使えない。

34 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 21:58:58 ]
double hoge[100] = {0.0};
これで全部0.0が入るんじゃね?

35 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 22:13:30 ]
>>31
第二パラメータを0にすればコンパイル自体はできますが、0.0で埋めたことになる保証はありません。
大人しく>34の手を使うかC++のstd::fill()を使うか自分でループを回しましょう。

36 名前:31 [2008/07/17(木) 22:44:27 ]
わかりました!どうも

37 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 23:19:18 ]
>>34
それ[0]は0.0だけど、[1]以降は0で埋めたことになるんじゃないか?
まぁ0.0も0も同じことだと思うけど

38 名前:デフォルトの名無しさん [2008/07/17(木) 23:23:45 ]
子クラスにメンバ変数もデストラクタもない場合ときに、
public継承する場合は親クラスのデストラクタは
virtualにしないとまずい?

class Base
{
public:
  Base(int a, int b);
  ~Base();
private:
  int m_a;
  int m_b;
};

class A : public Base
{
public:
  A(int a);
};

これはまずい?
やりたいことは、
「親クラスのコンストラクタを制限したバージョン」
を作りたいんだが。


39 名前:デフォルトの名無しさん [2008/07/17(木) 23:26:03 ]
何でコンストラクタから仮想関数を呼べるんですか?
どうせ誰も得しないんだろうからコンパイルエラーにしちゃえばいいのに。

40 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 23:26:40 ]
>>39
呼べるようにしたほうが設計的に美しいんじゃね?



41 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 23:46:44 ]
>>38
>「親クラスのコンストラクタを制限したバージョン」
>を作りたいんだが。

それの理由を書いた方が良いかと。

42 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 23:53:25 ]
WSAStartup(MAKEWORD(2,0), &wsd);
SOCKET sd = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
closesocket(sd);
WSACleanup();

それぞれ関数の後ろでGetProcessHandleCount()で
プロセスが開いているハンドル数を調べると、
WSASocket()で10個ハンドルが開き、closesocketしても減りません。

この10個のハンドルを閉じる方法はないんでしょうか?

WindowsXP Pro SP2、VisualStudio 2008 ExpressEditionです。

スレ違い?

43 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 23:59:56 ]
>>41
いや、これ自体に特に意味はないんだが。
環境依存のメモリリークとか発生しないかと思って。

44 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 00:00:34 ]
再利用するとかで内部的に完全には解放されてないだけじゃね?
WSACleanup()でも消えない?

45 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 00:01:09 ]
>>38
基底クラスのデストラクタを virtual にする必要があるのは、派生クラスの
インスタンスを基底クラスのポインタ経由で delete する場合。基底クラスの
デストラクタが virtual でないと、派生クラスのデストラクタが呼ばれない。
Base* b = new Derived();
...
delete b; // Derived::~Derived を呼ぶために、Base::~Base を virtual に!!!
RAII でインスタンスを破棄するなら、virtual である必要はない。

46 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 00:02:02 ]
>>42
WSASocket(); closesocket(); を交互に繰り返したら増えつづける?

47 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 00:03:28 ]
>>45
それはわかるんだが、
「子クラスにメンバ変数もデストラクタもない場合」
にどうなるのかってのが知りたかった。

48 名前:42 mailto:sage [2008/07/18(金) 00:03:33 ]
>>44
WSACleanup()の後でも減ってませんでした

>>46
会社にしか環境ないので
明日それをやってみます。

49 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 00:06:32 ]
>>48
ExpressEditionならタダで手に入る…
ってか会社でExpressEdition!

50 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 00:10:50 ]
>>38 >>47
Aからさらに継承しない限り問題無し



51 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 00:15:40 ]
>>49
会社でExpressEditionは別にいいだろ
商用利用可だし、IDEはともかくコンパイラが無料なのが重要なわけだから

52 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 00:19:20 ]
その無料のExpressEditionで数百万で売るもの作ってます^^

53 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 00:21:11 ]
>>38
それなら FactoryMethod でも使えば。
Base* CreateBase(int a);

54 名前:49 mailto:sage [2008/07/18(金) 00:21:25 ]
>>51
読んできた
www.microsoft.com/japan/msdn/vstudio/express/feature/2008/#visualc

勘違いしていたようだ

55 名前:デフォルトの名無しさん [2008/07/18(金) 00:23:00 ]
gcc4.2でopenMP使ってforループ並列化しようとすると、
「ループカウンタがunsignedです」って警告される。

ループカウンタってsigned使うのが普通なの?
vectorとかsize_typeは大体unsignedだと思うんだけど。

56 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 00:24:57 ]
>>50
ありがと!

57 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 00:35:03 ]
>>55
実装上の都合だとでも思ってください。
0スタートのループを、逆条件にしても大丈夫なようにってことかもね。

58 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 00:54:32 ]
signedとunsignedの違いが問題になるような回数のループをやろうとすること自体に問題がある

59 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 00:56:35 ]
>>58
通常は size_type (unsigned) に合わせないとコンパイラが警告してくれちゃう

60 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 00:57:51 ]
まぁループはsignedにしといたほうが無難だろうね



61 名前:デフォルトの名無しさん [2008/07/18(金) 00:58:50 ]
整数値を引数として与えその数値によって文字列を返す関数を作ったのですがうまくいきません
const char [2]' から 'charへの変換とかでます。どうしたらよいですか?

char abc(int number){

switch( number )
{
case 0:
return "A";
break;
case 1:
return "B";
break;

       ・
       ・


62 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 01:03:12 ]
"A" → 'A'

63 名前:デフォルトの名無しさん [2008/07/18(金) 01:04:50 ]
2文字以上の場合もあるんですよ

64 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 01:05:09 ]
char* abc(int number){}

65 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 01:05:53 ]
まちがい
const char* abc(int number){}


66 名前:デフォルトの名無しさん [2008/07/18(金) 01:08:52 ]
constがなぜいるんですか??

67 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 01:22:43 ]
文字列リテラルを書き換えてはイケナイ以上、
constを付けて防禦を計っておくべき、みたいな

68 名前:デフォルトの名無しさん [2008/07/18(金) 01:23:05 ]
>>61
#include <stdio.h>
#include <stdlib.h>
char * abc(int number){
int rank = 1;
int num = number;
char *numarray;
while(num){
num /= 10;
rank++;
};
numarray = (char *)malloc(sizeof(char)*(rank+1));
sprintf(numarray,"%d",number);
return numarray;
}
int main()
{
char * ans = abc(123);
printf("%s \n",ans);
free(ans);
return 0;
}

69 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 01:42:33 ]
ループカウンタはsignedが普通って事は、
int size = static_cast<int>(instance_of_vector.size());
for (int i = 0; i < size; ++i) ...;
ってやればいいの?

70 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 01:45:15 ]
それだとINT_MAXを超えた値が返ってきたらsizeは-になるぞ。
いやまぁ2億を超える要素なんてないだろうけどw



71 名前:デフォルトの名無しさん [2008/07/18(金) 01:49:37 ]
>>69
要はさ
for(unsigned int i = 10; i > 0; i -= 2)
みたいなことやっちゃったら無限ループになるから
ちゃんと解ってるならunsignedでも良いでしょう

72 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 01:51:58 ]
>>71
だから、OpenMPで警告が出るんだってばさ。

73 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 02:05:28 ]
理解してるなら警告は無視していい

74 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 02:24:29 ]
>>47
そんな条件は関係ない。デストラクタに virtual が付いてない基底クラスへのポインタが
実際には派生クラスを指している場合、 delete すると未定義動作になる。

75 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 02:37:36 ]
>>37
www.kouno.jp/home/c_faq/c1.html#30

76 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 03:24:25 ]
virtualな関数が増えると、ポリモーフのコストって増える?

77 名前:デフォルトの名無しさん [2008/07/18(金) 04:49:34 ]
GNUのライブラリを使って、ソフトやライブラリを作ったら
元のGNUのソースを同封しないといけませんか??

78 名前:デフォルトの名無しさん [2008/07/18(金) 04:52:32 ]
元のソースに手を加える改良の場合は変更後のソースを入れないと駄目なんですよね
改変せず利用するだけならば、入れなくて良いですか?
GNUのライブラリを使用していると明記する必要ありますか?

79 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 05:03:49 ]
>>77-78 ライセンス嫁。あと GPL なら GPL FAQ 日本語訳とか。

80 名前:デフォルトの名無しさん [2008/07/18(金) 05:25:33 ]
GNUのコード使ったら、



81 名前:デフォルトの名無しさん [2008/07/18(金) 05:29:24 ]
GNUを利用したら、改変のある無しに関わらず、ソースコードもうpせよ
ってことでOK?
具体的には、GNUコードから、WindowsのスタティックリンクかDLLを作って
それを自分のソフトで使用した場合は、自分のプログラムのコードをうpするって事?

82 名前:デフォルトの名無しさん [2008/07/18(金) 08:47:02 ]
初心者質問てここでいいのですかね?
もしスレ違いなら誘導お願いします。
private継承について質問なのですが、親から継承したメンバはすべてprivateになり
子クラスからアクセスできないものと思っておりますが、違うのでしょうか。
実際コードを書いて確認してみたところ、アクセスできないぽいのですが
サイトによってアクセスは可能と書いているところもあるので混乱しています。
アクセスする方法があれば教えていただきたいです。
それと、private継承を調べると「実装の継承」という言葉がたいてい出てくるのですが、
これの意味がよくわかりません。
「実装の継承」の実際の使い方など教えていただけませんか。

83 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 09:06:13 ]
書物はまだしも、サイトの記事なんて鵜呑みにする方がどうかしている。

84 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 09:24:31 ]
getHoge(),setHoge()のような関数(アクセサ)を継承元で書かないとアクセスできないよ。

private継承、実装の継承というのは、基底クラスで定義された関数など「実装」のみを継承し、
インターフェイスや性格については基底クラスと同じものを持たなくて良い
=基底クラスのオブジェクトではあれができたから継承先でも出来るだろうという期待が出来ない継承のことかな。
逆にpublic継承というのは、DerivedクラスはBaseクラスの一種であるとみなして操作できなければならなくて、
BaseがCry()と言う関数を持ってたらDerivedも持っていなくてはいけないし(鳴き声は違うにしても)同じような動作をしなくてはいけない。

…という話がEffective C++に詳しく書いてあるので読んでおこう。

85 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 10:02:33 ]
>>77,78
LGPLかGPLで扱いが変わって来るはず。
glibcとリンクしただけで全てのプログラムが公開されなければいけないなら、
Unix系で商用ソフトなんて作れなくなるよ。

>>81
再配布条件と利用条件は区別して考えてる?
作ったプログラムを公開しないのであれば、何もUPする必要は無いよ。

86 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 10:06:58 ]
>>83
鵜呑みしないで疑っているからここにいるわけで

87 名前:デフォルトの名無しさん [2008/07/18(金) 16:33:35 ]
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):

配列の要素を昇順にソートしたときの、添え字の順番を配列に記憶するプログラムを書け。

data = {2,6,3,1,2} なら, index = {3,0,4,2,1}である。

元の配列は書き換えてはならない。

qsortなどのライブラリを用いて構わない。

[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C C++
[4] 期限: 明日

88 名前:デフォルトの名無しさん [2008/07/18(金) 16:52:11 ]
誤爆しました・・・

89 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 18:11:05 ]
そいじゃ、誤爆で
int [] data = { 2, 6, 3, 1, 2 };
int [] index = data.Select((a, i) => new { a, i }).OrderBy(x => x.a).Select(x => x.i).ToArray();


90 名前:デフォルトの名無しさん [2008/07/18(金) 20:53:48 ]
>>84
回答ありがとうございます
実装への直接的なアクセスをできないようにすることで
実装については変更させず、他の部分のみ変更可能にする
ということなのですかね
Effective C++も探して読んでみます



91 名前:デフォルトの名無しさん [2008/07/18(金) 21:44:50 ]
>>71
だなあ。
結局unsignedのメリットって1bit表現範囲が広がるくらい?

92 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 21:59:32 ]
unsignedだとオーバーフローで鼻からなんか発生しない。

93 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 22:25:54 ]
>>91
signedな整数は符号拡張がウザいこともあるし
ビット演算や何かとの相性も良くない

まあ、適材適所で使い分けろ

94 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 00:40:43 ]
>>92
鼻から牛乳がオーバーフローしました

95 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 15:30:21 ]
>>91
境界チェックの比較が1回で済む

96 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 17:14:33 ]
いつ誰がsignedに書き換えるかわからないんだからそこはちゃんと比較しとけよ
本当にunsignedなら最適化してくれる

97 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 17:16:03 ]
そうですよね
いつ誰が構造体に書き換えるかわからないですもんね

98 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 19:10:21 ]
なんでこれで
while( *d++ = *s++ )
文字列コピーできるんですか?


99 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 19:17:41 ]
>>98 なんでコピーできないと思うの?

100 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 19:19:20 ]
while(( *d++ = *s++) != 0)



101 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 19:37:45 ]
演算子の優先度が分からないのか、ポインタのインクリメントの意味が分からないのか

102 名前:デフォルトの名無しさん [2008/07/19(土) 20:21:47 ]
std::vector<CTest> hoge;
void testFunc()
{
for(int i=0; i<10;i++){
CTest test;
test.i = i;
hoge.push_back(test);
}
}

int main(){
testFunc();
for(int i=0; i<hoge.size();i++){ printf("%d\n",hoge[i].i);
}
こんなことしても問題ありませんか?一応表示はされたのですが。
std::vector<int>とかはそのまま数値いれてますけど、
std::vector<クラス>の時もnewしないで入れても平気なのかなって思いまして。

103 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 20:28:05 ]
CTestの実装による

push_back内でnewしてコピーしてるのでnewはいらない
で、そのコピーのときにCTestのコピーコンストラクタでメンバのコピーがされる

デフォルトコピーコンストラクタでも問題ないなら特にコーディングしてなくてもおk
デフォルトコピーコンストラクタじゃだめなら自分で書く必要あり


104 名前:デフォルトの名無しさん [2008/07/19(土) 20:38:08 ]
なるほど。ありがとうございました。

105 名前:デフォルトの名無しさん [2008/07/19(土) 21:04:33 ]
Cを書いてるとエディターの機能で色分けしてくれて表示
されるのは便利なのですが、さらに進んで
ある行にカーソルを置くとどういう階層のとこに
いるかって機能がついたエディタとかってありますか?

main()
{
if(a==1)
{
while(b>1)
{

 if(c==0)
{
ここ
}
}
}
}

「ここ」にカーソルを置くと
main()->if(b==1)->while(b>1)->if(c==0)

みたいに表示されるやつ

106 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 23:33:41 ]
それを見たくなるってのは、もしかして、
1つの関数に詰め込みすぎのサインだったりするんじゃないかな。

107 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 23:39:33 ]
「そういうコードは書かない方がいい」じゃだめですか

108 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 23:52:23 ]
関数の形でかかれているものを問答無用でインラインに展開する方法があればいいな、と思うのですが。

109 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 23:53:22 ]
VCにそんなオプション有った気が

110 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 23:53:26 ]
>>108
思うだけにしておいたほうがいいと思います



111 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 00:06:57 ]
>>108
闇雲にインライン展開しても速くならないんだな。

112 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 00:09:33 ]
>>105
1画面に収まらない関数は書かないのが鉄則ですう

113 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 01:01:24 ]
そんなこといっても行数が増えてくると
関数呼び出しだけでも一画面におさまんなくなって
便利な機能な気がするけど…
ウィンドウプロシージャとかでかい関数はどうしてもできるわ(´・ω・`)
一つのファイルにいっぱい関数詰め込むととか
あとアルゴリズムを激しく書く人はいる気がする。
何千行ものコードを一画面に収まるくらいに
分けたら関数出来過ぎ君だわ

なんかおれ必死な感じだけど、便利な気がするけど…
ないってことは作るしかないんかな。

114 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 01:04:08 ]
ウィンドウプロシージャをCで書くならメッセージクラッカ必須だろ。

115 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 01:06:06 ]
>>108
inlineじゃだめですか?

116 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 01:27:26 ]
>ウィンドウプロシージャとかでかい関数はどうしてもできるわ
出来ねぇよ、関数分けろ

117 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 01:30:33 ]
ファイルで分割しても二桁とか

118 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 01:42:52 ]
>>713
OK,読み間違えてた
ダイビング土下座しながら吊ってくる

119 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 01:43:24 ]
誤爆

120 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 02:42:46 ]
>>115
inlineにしててもインライン展開しないこともあるんだったよな確か?



121 名前:デフォルトの名無しさん [2008/07/20(日) 02:50:40 ]
なるべく最新版のやつで最適化するしかないよ
マクロにすれば確実にインラインになるけど、デバッグが困る

122 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 02:53:58 ]
>>120
inlineにしなくてもインライン展開されることもあるしね。

123 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 03:01:41 ]
クラッカ使ってないな
そういうのあるんだ
古い人だから#defineとか
いっぱい使うとわかんなくなるから
カーニハンとリッチーだっけ?
あれの本だとcはシンプルで
なんとかってのってたけど
いいねそれ。
ただ今の時代では違うのかもだけど。

とりあえず今1万7千行くらい
switchcase文がいっぱいあるわ。
c標準のデータ型以外は
最低限のやつしかwindows.h系のは
使ってない。

でも昔よりは関数で分けるようになったかも


124 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 03:31:34 ]
>分けたら関数出来過ぎ君だわ
それくらいがむしろ普通

125 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 03:51:00 ]
ウィンドウプロシージャには
関数分けするためのマクロが用意されているくらいなのにな。

126 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 05:22:05 ]
VCでマルチバイトというとUTF-8、UNICODEというUTF-16ですよね?
SJISで作ったテキストファイルも普通に読み込んでいると思うのですが何故でしょう?

127 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 05:30:13 ]
マルチバイトというと(一般的な日本語Windows環境では)CP932だと思うが。

128 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 05:42:54 ]
CP932、ググるSJISの拡張ということで互換性あるのかな
どうもUTF-8だと思ってたのは勘違いのようですね
文字コードってユーザーとして意識したことないから難しい...

129 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 08:55:06 ]
>>112
そんな鉄則ねえよ。


130 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 12:25:29 ]
あるよ。井戸の外には



131 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 12:30:20 ]
「愚かな一貫性は小人物に憑いたおばけである」
という言葉があってのう

132 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 13:45:18 ]
1画面なんて言われたら、250桁×100行でも許容しろってことかよ。

冗談じゃねぇ。

133 名前:デフォルトの名無しさん [2008/07/20(日) 13:49:48 ]
分かり易ければ1画面に収まる必要まったくなし
こだわってるやつはたいてい頭悪い

134 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 13:54:50 ]
>>132
1600x1200?w
寧ろ、3分割して80桁x300行とか嫌そうだw

135 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 13:56:38 ]
A4一枚とかはよく見聞きする話

136 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 14:06:39 ]
明日から7ptフォントで開発しとけよ。

137 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 14:10:04 ]
初心者には一画面以内 must で教える
上達したら一画面越えてもいいよと教える

138 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 14:14:15 ]
マクロで質問です。

#pragma message("hogehoge") をマクロにしたいんですが...

次のやり方でコンパイラが怒ります...。

#define _message( str ) #pragma message( str )

どう登録すれば良いんでしょうか?

139 名前:デフォルトの名無しさん [2008/07/20(日) 14:22:41 ]
プラグマをマクロにした例はみたことないなぁ
できないんじゃないの?

140 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 14:24:27 ]
できないよ。



141 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 14:53:05 ]
だからC99で_Pragmaが追加された。
VC++も2008から__pragmaという名称で同じ機能を用意している。

142 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 15:17:57 ]
プラグマをマクロ化って。
誰が得するんだ…。

143 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 15:22:58 ]
>>142
処理系によってプラグマの書き方が異なる場合

144 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 15:37:54 ]
>>143
いや理論的にはそんなんだけど、俺の未熟な経験からは
使った方が便利だってケースが思い当たらない。
そんで誰が得するのかな、と。

145 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 16:06:04 ]
>>144
処理系A #pragma align packed
処理系B #pragma pack(1)
だとすると、構造体の定義のたびに、

#if defined(_IMPL_A)
#pragma align packed
#elif defined(_IMPL_B)
#pragma pack(1)
#endif
struct S {...}
#if...さらにアライメントを元に戻すpragma

と書かないといけない。

さらに処理系C #pragma options align=packed
を追加したくなったら、もううんざりだ。

146 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 16:14:15 ]
includeでやるのはどう?

147 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 16:17:04 ]
>>146
うん。実際そうやってた。
でも美しくないんだよねえ。構文的に

148 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 16:39:11 ]
>>130
井戸の中にしかないと思われ。

149 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 17:16:25 ]
VC++2005EEで作成しています。
有る関数の中でループを毎に乱数を発生させ、配列に値を保存させようとしたのですが
実行画面では同じ数値に成ってしまいました。デバックをしてみたところ

@1から見ていくと、配列にちゃんと違う数値が入っていき、ループを抜けた
@2までみても違う数値が保存されていました。

@2にブレークポイントを設定し、そこで値を確かめるとListの値には
同じ数値が配列に保存されていました。

全て値がう値が保存されている様にしたいのですが、何が問題になっているのか見当がつきません。
何か対策とかあるのでしょうか

srand( (Uint32)time(NULL) );
m_Tmp = new Object();
@1
for ( Uint32 i=0; i<MAX; ++i )
{
m_List.push_back( *m_Tmp );
m_List[i].SetNum( rand() % 10 );
}
@2
※SetNumは与えられた値を保存させるだけのメソッドです。

150 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 17:19:22 ]
STLのstd::vector<int>とか使ったらいいとおもうよ。



151 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 17:22:06 ]
m_Listは std::vector<Object> m_List;で宣言してあります。

152 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 17:26:02 ]
Object()のコピーコンストラクタとか、どっか実装がおかしいんじゃね?

153 名前:デフォルトの名無しさん [2008/07/20(日) 17:27:51 ]
>>149
ちょwww
これはだめでしょ
Object は最初に1回 new しただけでしょ?
そこに値をどんどん入れて行ったら、当然同じインスタンスに値をどんどん突っ込むわけで、
最後には、一番最後に代入した値ばっかりのリストになるよwww

154 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 17:28:56 ]
>>149
Object の定義が怪しい。 SetNum の値をポインタの先に保存してて、 Object のコピーでは
ポインタがコピーされてるとか。

>>153 push_back(*m_Temp) だから、そこが問題じゃないでしょ。

155 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 17:29:38 ]
済みません。事故解決しました。
SetNumで違う変数に値を保存してました。お騒がせしました orz

156 名前:149 [2008/07/20(日) 17:30:23 ]
そっか、push_back でコピ^コンストラクタが動くのか、
じゃあ152が正しいか。

157 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 22:22:03 ]
現在自作ゲームで文字の時間差表示をしようとしているのですが、
string script="abcde";
string strbuf="";
int moji=0;

for(int i=0;i<script.size();i++){
strbuf+=script[moji];
//ここでstrbufの内容を表示
//ここにwait処理が入る
moji++;
}

strbuf="";
moji=0;

scriptの中身が1バイト文字だと正常に表示されるんですが、
2バイト文字だと文字の背後に・(黒点?)が表示されてしまいます
stringは2バイト文字は使えないんでしょうか?

158 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 22:23:27 ]
wstringとか

159 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 22:32:17 ]
マルチバイト文字列用のルーチン使って文字を切り出すか、UTF-16をつかう。

おそらくstd::stringで1バイトづつ出力させてるんだろうけど、それやっちゃうと2バイト文字は半分ちぎれたりするから正常に表示できない。
ちゃんと2バイト文字は2バイトづつ出力させるか、2バイト固定のUTF-16使えばOK。
荒技としては逆に1バイト文字を使わないという手もある。(全角数字、全角アルファベット、全角記号で代用)

160 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 22:35:47 ]
なるほど、要はscript[moji*2]とかループを1/2回にするなり
数字は全角で書くなりすれば良いわけですね
ありがとうございます



161 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 22:44:30 ]
>>159
UTF-16だから2バイト固定なんてことが許される時代はもう終わっているよ。

162 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 22:47:14 ]
サロゲートなんて捨ててOK

163 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 22:52:10 ]
C/C++って、マルチバイト文字の、先頭か二番目以降かって判定する関数なかったっけ?
標準でなくても、それぞれのプラットホームには必ずあると思うけど。

164 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 22:52:40 ]
[゛], [゜] も捨ててかまわないってことで。

165 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 22:57:08 ]
>>162
つUTF-8, UTF-32

166 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 22:59:55 ]
>>163
そんなレガシー技術に頼るぐらいならUnicodeにしとけよ

UTF-8では先頭バイトと後続バイトはMSB側の2bitを見るだけで簡単に区別できるし
先頭バイトだけで後続バイト数は判断できるし
後続バイトがASCII文字と重なるようなこともない

マルチバイト処理は必要だが、レガシーなエンコーディングスキームよりは
ずっといい性質を持っている

167 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 23:00:00 ]
>>165
つwchar_t

168 名前:166 mailto:sage [2008/07/20(日) 23:04:30 ]
補足。
euc-jpやiso2022系では、「lead byteかどうか」は特定の2バイトを見ただけでは
判断できない。
行頭なり何なりから順番に舐めるしかないはずだよ。

>>163の言っているような"iskanji"風のレガシーなクソマクロは、特定の条件でしか
役に立たないものだ。

169 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 23:09:52 ]
>>168
先頭から見ないとわからないってのは、EUCのほうじゃなくてShift JISのほうでは?

170 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 23:15:37 ]
なんで文字コードごときの話でそんな偉そうにできるんですか?



171 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 23:18:27 ]
>>170
皆、思い思いに書いてるだけだよ。
偉そうに見えるのはおそらく・・・

172 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 23:23:01 ]
>>169
EUCで簡単なのは1byteコードと2byteのコードの識別だけで、
lead byteとtrail byteの識別は難しいのでは?

173 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 23:31:16 ]
入出力(ファイル、パイプ)はともかく、
内部コードにUTF-8, UCS2, UTF-16, UTF-32以外を使うのは止めておけ。
マジで。

174 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 23:40:52 ]
wchar_tはC/C++の定義上1文字なので、
固定サイズであるUCS2/UTF-32と考えるのはそれほど問題でないが、
可変サイズであるUTF-8/UTF-16として扱うのは完全にNG

175 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 23:43:05 ]
VC++で、ソースコードをUTF-8で保存してコンパイルしたら、"文字列" がUTF-8になってくれればいいんだけどね

176 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 23:50:50 ]
VC++(UCS2)/gcc(UTF-32)での可搬性を考えると、
wchar_t=UCS2と想定するのが良い

UTF-16、UTF-32はC++0xが出てくるまで我慢

177 名前:176 mailto:sage [2008/07/20(日) 23:53:11 ]
もちろん、ICUなどで提供されている型や関数を使っている人は除く

178 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 02:42:01 ]
どーでもいいよそんなの

179 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 08:10:43 ]
>>175
C++0xでUTF-8リテラルが追加される。u8"文字列"

※ime.nu通すと#以降が消えるので
ttp://ja.wikipedia.org/wiki/C%2B%2B0x#.E6.96.B0.E3.81.9F.E3.81.AA.E6.96.87.E5.AD.97.E5.88.97.E3.83.AA.E3.83.86.E3.83.A9.E3.83.AB

180 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 14:04:39 ]
printf("aaa\b\b\b");

とかやってるコードを見かけたのですが、
\b\b\bはどういう意図でやっているのでしょうか?
\bはバックスペースのようですが…



181 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 14:20:49 ]
次に書いた文字がaaaを上書きする。

182 名前:180 mailto:sage [2008/07/21(月) 14:40:00 ]
>>181さんありがとうございます。

ファイルコピーの進捗状態をコンソール上の同じ位置で
パーセント表示する際などに
使うわけですね。なるほど。

183 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 19:36:23 ]
char *p;
char **pp = malloc(sizeof(char*) * 100);

という式はcharのポインタのポインタを100確保したという意味でいいのですか?
pp[0]はpと同じ意味ですか?

184 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 19:42:56 ]
char*を100個格納できるエリアへのポインタを返していて、そのポインタをppに入れている
あくまでも指定されたサイズのエリアを確保しているだけで、ポインタを確保している訳ではありません。

上記コード上ではpとpp[0]には何の関連もないけど、
p = pp[0];ができる?という意味なら、できる。

185 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 22:34:01 ]
>>184
同じ意味とは型が同じかという意味でした。

186 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 23:08:32 ]
VCで作ってタソーすをgccでコンパイルしようとすると
tchar.hがないってエラーになるんだが、
Linuxでは何てヘッダを読み込めば_TCHARとか_T()とか使える?
自分で定義するしかない?


187 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 23:17:41 ]
当たり前だ

188 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 04:22:32 ]
そのための_TCHARだ。

189 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 04:24:17 ]
gcc だと何と定義すりゃいいんだろうな。
wchar_t が UCS4 だったりすることもあるんじゃないのか。

190 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 14:21:02 ]
そもそもAPIにAとWの区別もないのに何の意味があるんだろう。



191 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 14:28:47 ]
>>190
WしかないAPIもある

192 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 14:34:56 ]
>>191
そんな話はしていない

193 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 16:50:58 ]
>>189
UCS2でも4でも動くように書くしかないかと
あるいはライブラリを使うか

194 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 17:33:55 ]
wchar_tの中身がUnicode系ではない環境もあるのでよろぴこ。


195 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 20:54:18 ]
>>194
その処理系の名前教えて。
いや、煽りとかじゃなくて普通に知りたいので。

196 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 21:25:07 ]
>>195
Linux以外のほぼすべてのUNIX。
すくなくとも、Solaris FreeBSD NetBSDはUnicodeではなかったはず。




197 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 22:00:16 ]
そうなのか。dクス

198 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 22:02:46 ]
LinuxをUNIXと言うと基地外が来襲するので
ちゃんとUNIXライクOSと言いましょう

199 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 22:11:08 ]
wchar_tマジ使えなさすぎワロタ
ml.tietew.jp/cppll/cppll/article/862

200 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 22:40:13 ]
その辺に載ってる話はさすがに古くねえか?
gcc 2.xだろ?



201 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 22:55:17 ]
gccのwchar_tは昔からうんこ
あまりにも有名すぎる話

202 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 23:37:26 ]
>>201
いやその、今のgccはinput-charsetだのexec-charsetだのwide-exec-charsetだの
指定できるだろ?

203 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 01:49:03 ]

*i |= 3;

はちゃんと

*i = *i | 3;

に展開されるのでしょうか?


204 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 02:26:54 ]
いいえ、前者と後者では意味が違います。

205 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 02:32:22 ]
>>203
「展開される」の意味が分からない

Cだと結果は動作は等しくなる
C++だとoperatorのオーバーロードがあるのでなんともいえない

206 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:02:00 ]
class test {
string* p;
public:
test() { p = new string; }
~test() { delete p;}
}

main() {
test obj1;
test obj2 = obj1;
}

2度目のdeleteにてセグメンテーション違反で落ちるコードです
教科書ではコピーコンストラクタを上書きして
ポインタの指す先までコピーするようにしてるのですが
delete時にチェックする方法はあるんでしょうか?
実用性は考えていませんが、興味があります

環境:
Linux kernel 2.6-686
GNU C++ compiler 4.1.1

207 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:07:15 ]
ローカル変数とは定義された順にスタックに積まれるのですか?

208 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:13:42 ]
>>206
obj2.pはobj1.pと同じだから落ちて当たり前。
何がしたいのか分からないけど、ポインタにNULLポインタを入れておけば
それがdeleteされても問題なく動く。

209 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:13:50 ]
>>206
> delete時にチェックする方法はあるんでしょうか?

参照カウンタをどこかに持つとか。



210 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:18:20 ]
あー、参照カウンタにしても、けっきょくコピーコンストラクタをオー
バーライドしなきゃいけないか。







211 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:25:16 ]
>>208
どこでNULLをセットすればいいですか?

>>209
なるべく簡単な方法がいいんですよね

catchしちゃえばいいのかな
このアドレスは使っちゃ駄目みたいなのは
カーネルに聞けば教えてくれるのかなと思ったんですが

212 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:33:33 ]
>>206
あくまでチェックしたいってことなら、方法は無い。
ヌルをセットするとかして、とにかく落ちないようにするなら auto_ptr でも使っとくのが簡単。

#include <memory>
#include <string>
using std::string;
using std::auto_ptr;

class test {
auto_ptr<string> p;
public:
test() : p(new string) {}
};

int main() {
test obj1;
test obj2 = obj1;
}

213 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 11:37:38 ]
>>207
規格ではスタックが使われるのかすら決まってなかった気がする

214 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 12:39:32 ]
>>211
string*ではなくstringをメンバに持たせる

215 名前:デフォルトの名無しさん [2008/07/23(水) 16:25:27 ]
class hoge{
private:
int fuga;
public:
void setfuga(int a){ fuga = a; }
int getfuga(){ return fuga; }
};

class foo{
private:
std::vector<hoge> var;
public:
void sethoge(hoge hage){ var.push_back(hage); }
std::vector<hoge> getvar(){ return var; }
};

int main(){
foo foo0;
hoge hoge0;
hoge0.setfuga(1);
foo0.sethoge(hoge0);

std::vector<hoge>::iterator itr;
itr = foo0.getvar().begin();
std::cout << foo0.getvar().at(0).getfuga() << std::endl;
std::cout << (*itr).getfuga();
return 0;
}
これを実行すると、一つ目のcoutは正常に出力(1)されますが、二つ目はでたらめな値が出ます。
itr = foo0.getvar().begin()はfoo0.getvar().at(0)を指すiteratorだと思うので、同じ結果になると
思っているのですが…。どなたかお教えいただけると助かります。

216 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 16:35:26 ]
>itr = foo0.getvar().begin();

getvarの戻り値はfoo0.varそのものではなくfoo0.varの一時的なコピーで、次の文に移る前には破棄される
getvarはfoo0.varのコピーを返すのではなくfoo0.varへの参照を返す必要がある

217 名前:デフォルトの名無しさん [2008/07/23(水) 16:38:55 ]
>>216
その通りでした。ちょうど思いついたところでした。
すみません、どうもありがとうございます。

218 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:39:07 ]
HOGEという構造体がtypedefされているとします。


HOGE *hoge;と宣言します。


void function(HOGE *hoge){

}という関数に

function(hoge)と渡すと参照渡しになってますか?

219 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:42:42 ]
>>218
それはC++でいうところの参照ではありません

220 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:44:26 ]
アドレス私ですか?



221 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:46:44 ]


222 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:47:38 ]
アドレス渡しですか?の間違いです

223 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:01:10 ]
「自分宛のレスですか?」という意味だと勘違いしたのは、
俺だけじゃないはず。

224 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:33:45 ]
foo(HOGE fuga){ }
bar(HOGE* pFuga){ }
baz(HOGE& fuga){ }

func()
{
HOGE hoge;
HOGE *pHoge;

// 値渡し
foo(hoge);
// ポインタ渡し(アドレス渡し)
bar(pHoge);
// 参照渡し
baz(hoge);
}


225 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:40:34 ]
foo(HOGE fuga)
foo(HOGE &fuga)

HOGE hoge;
foo(hoge);

この場合どっちが優先されますか?

226 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:43:00 ]
>>225
自分でコンパイルしてみては?

227 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:44:40 ]
自分で試してください。

俺は試しました。VC++2005EE

XXX.cpp(19) : error C2668: 'foo' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照)
XXX.cpp(11): 'void foo(HOGE &)' の可能性があります。
XXX.cpp(7): または 'void foo(HOGE)'
引数リスト '(HOGE)' を一致させようとしているとき

228 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:44:44 ]
もし環境依存だったら自分で試しただけでは分からないし

229 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:50:02 ]
それは試してうまくいった後に質問すべきこと。

230 名前:デフォルトの名無しさん [2008/07/23(水) 22:08:24 ]
g++でプリコンパイル済みヘッダが使えないって聞いたんだが、
stdafx.hみたいに一つのヘッダファイルでSTLやboostとかのヘッダ
全部読み込むのはやめたほうがいい?




231 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 22:44:37 ]
いつのg++の話?

232 名前:デフォルトの名無しさん [2008/07/23(水) 23:54:09 ]
>>224
225は自分じゃないです。

ポインタ渡しした場合はbar関数の中で値を書き換えても、元には影響ないんですか?

233 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 00:03:05 ]
>>232
ポインタを引数に指定しないとだめか、そうでないかの違いで、影響あることには変わりないよ

234 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 00:10:51 ]
225は違う人だったのか…

ポインタ渡しは影響する
参照渡しも影響する
値渡しだけは影響しない

235 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 00:21:32 ]
クラスは参照型なのでゴニョゴニョ

236 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 00:23:12 ]
>>232
bar(HOGE* pFuga){
  *pFuga = ...; //影響する
  pFuga = ...; //影響しない
}

237 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 02:02:44 ]
>>230
そういう理由もあるだろうし、依存関係は最小限にしたほうがいいと思うよ。

g++ でもプリコンパイル済みヘッダ自体は使えたような気がする。使い方が
全然違ったはずだけど。

238 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 09:04:36 ]
>>235
嘘をつくな

239 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 13:36:21 ]
あれ?
クラスもコピーコンストラクタ呼ばれて値渡しされるよね?

240 名前:デフォルトの名無しさん [2008/07/24(木) 13:39:58 ]
コピーコンストラクタ呼ばれて値渡しされるし、逆にコピーコンストラクタが定義されていないと
コンパイルできないはず



241 名前:240 [2008/07/24(木) 13:42:25 ]
値渡しの話だよね?

242 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 13:43:59 ]
コピーコンストラクタがなければ勝手に丸ごとコピーします。
でないと、struct A a, b; a = b;というC由来のコードがコンパイルできなくなってしまう。

243 名前:240 [2008/07/24(木) 13:44:40 ]
あ、そっか、そうだね、失礼

244 名前:240 [2008/07/24(木) 13:47:05 ]
あ、よくがんがえたら、クラスのメンバーに、コピーコンストラクタが定義されていないオブジェクトが含まれている時と
勘違いしてた。
自分がよくコンパイルエラー出すもんで。。w

245 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 13:52:09 ]
実際
中間インスタンス生成+コピーコンストラクタ呼んだ後は 参照でわたしてる?

呼び出し元のインスタンスには影響を与えないけど、スタックに実体を積んでいるわけではない
みたいな構造

246 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 13:53:44 ]
それぞれ想定している状況が違っている悪寒。

247 名前:デフォルトの名無しさん [2008/07/24(木) 13:55:27 ]
VC2008 VC6 BCC MinGW
でboostいれたいんですけど
バイナリ配布しているVC2008しか成功しません
1.35のそれぞれのバイナリ置いてある所無いですか?

248 名前:デフォルトの名無しさん [2008/07/24(木) 14:17:41 ]
www.boost.org/development/tests/release-1_35_0/developer/summary.html

boostてdrwinとvc7以上で主に動くんですね borlandはかなり駄目ですね

249 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 14:39:09 ]
darwinってmacのことだぞ

250 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 19:59:10 ]

 boost::regex で,置換する時に置換フォーマットが $10 だと 10 番目のキャプチャ要素に置換されるんだけれど,
これを一番目のキャプチャ要素 $1 + 0 にするにはどうしたらいいの?



251 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:00:54 ]
>>250
regex を二回呼べばいいんでは?

252 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:09:39 ]

すいません 2 回呼ぶと言うのはどういう意味でしょうか?


253 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:23:33 ]
>>250
簡単な例をplz

254 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:29:02 ]
${1}0でいけたような気がしたけど、どうだったかなあ

255 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:31:59 ]
1.35のregexでいまためしてみた。
"\\10"で大丈夫。sed format string syntaxってやつだ。
"${1}0"はだめ。

#include <iostream>
#include <string>
#include <boost/regex.hpp>
int main()
{
    boost::regex re("(.)(.)(.)(.)(.)(.)(.)(.)(.)(.).*");
    std::string s ="abcdefghijklmn";
    std::cout << boost::regex_replace(s, re, "\\10") << std::endl;
    return 0;
}

256 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:34:49 ]
そういう意味か!

257 名前:250 mailto:sage [2008/07/24(木) 20:38:51 ]
>>255
ありがとう!それでうまくいきました.

258 名前:デフォルトの名無しさん [2008/07/25(金) 10:23:37 ]
boost_serializationを画面やメモリに出力したいのですが教えて下さい
test_classは別に定義してあるとします。これだとファイル出力です

#include <fstream>
#include <string>

int main()
{
std::ofstream fp("XXX.xml");
boost::archive::xml_oarchive oarchive(fp);

test_class Z;
Z.a = 22; Z.b = 7;

oarchive << boost::serialization::make_nvp("Root", Z);

}



259 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 10:34:45 ]
>>258
よくわからんが
ofstreamのかわりにcoutやsstreamを使えばいいだけなんじゃないの?

260 名前:デフォルトの名無しさん [2008/07/25(金) 10:35:02 ]
追記

型 const boost::serialization::nvp<T>の出力方法がわかればいいのですが



261 名前:デフォルトの名無しさん [2008/07/25(金) 10:36:58 ]
トンクス これでいけました!

xml_oarchive oarchive(fp); → xml_oarchive oarchive(cout);

262 名前:デフォルトの名無しさん [2008/07/25(金) 10:41:06 ]
メモリに格納したいのでstringにしたらエラーでました。 メモリに入れる良い方法ありませんか?

string s;
boost::archive::xml_oarchive oarchive(s);

1番目の引数を 'std::string' から 'std::ostream &' に変換できません。

263 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 10:46:46 ]
>>262
つ[stringstream]

264 名前:デフォルトの名無しさん [2008/07/25(金) 10:50:32 ]
トンクス

265 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 13:06:02 ]
参照を使うべきかポインタを使うべきか悩んでいるのですが、
参照なんて使わない!もしくはできる限り全て参照を使う!って方いますか?
どうもポインタと参照の違いが分かりません(使いどころとして)

266 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 13:46:14 ]
>>265
C++では、ポインタを使わないといけないケース以外はポインタを使わない。
使うとしても、大抵はイテレータと言う形で使っている。
必要に迫られれば、ポインタを使うこと自体は吝かではない。

267 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 13:50:08 ]
C++だと関数にヌル終端文字列を渡すときも、const char * とか使わず、
全て const char & とか const std::string & を使うの?

268 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 13:51:13 ]
const char & を渡してどーすんだ

269 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 13:58:18 ]
俺は、参照を使わざるを得ないときと、値渡しの代わりとしてコピーのコストを抑えるためにしか、参照を使ってないな
それ以外はポインタ

270 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:08:14 ]
void test(const char& s){
  if(&s==NULL){
    std::cout << "(NULL)" << std::endl;
  }
  else{
    std::cout << &s << std::endl;
  }
}
int main(){
  test(*"aaa");
  test(*static_cast<const char*>(NULL));
  return 0;
}
--結果---
aaa
(NULL)


扱えないことはない。
でもまぁ正直言って、これはないw



271 名前:265 mailto:sage [2008/07/25(金) 14:12:35 ]
値渡しのコピーを省くためなら、参照でなくともポインタでできそうですけど、
それをわざと参照でやる理由はなんでしょう?
c++まだ勉強中で、ざっと見た感じ、以下のようなものしか有用性はないような気がしてます。
ポインタでの煩わしい明示を省ける、視覚的に区別する以外のメリットはあるのでしょうか?

int n;
int &func();

void main()
{
    int i = 0;
    func() = i;
}

int &func()
{
    return n;
}

272 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:29:06 ]
ポインタは参照と違ってNULLを渡すことができるらしいよ。
参照はポインタと違っていい一般保護例外を起こすようなアドレスを排除できるらしいよ。

273 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:35:22 ]
>>271
少なくともread-onlyな引数を、効率のためにconst参照渡しがしたいケースなら、
素直にreference使ったほうが便利だよ

>>272の言うような問題もないし、呼ぶ側としても
ただの値渡しと同じように記述できて、型変換や何かが必要な場合もコンパイラが面倒
見てくれるからな

ユーザ定義演算子などでは、意図した記法を実現したければ、
事実上参照以外に選択肢が無いこともある

274 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:36:21 ]
>>272
やってやれんことはないな
void hoge(double &d) { }
hoge(*(double *)NULL);
hoge(*(double *)123);


275 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:37:23 ]
>>271
const参照になるけど、
・良いかどうかは別にして、コンストラクタの暗黙呼び出しが使える。
・一時オブジェクトが渡せる。
という利点はある。

struct IntX {
  int n;
  IntX():n(0){}
  IntX(int argn):n(argn){}
};
void test(const IntX& a){
  std::cout << a.n << std::endl;
}
void test2(const IntX* a){
  std::cout << a->n << std::endl;
}
int main(){
  test(IntX());
  test(10);
  //test2(&IntX(20)); //左辺値でないのでコンパイル不可
  return 0;
}

あと、>>272がツッコミ入れてくれた通り、
>>270で書いた *static_cast<const char*>(NULL) みたいなネタは
実際のプログラムでやったら(無効な参照を作ったら)駄目だからね。

276 名前:265 mailto:sage [2008/07/25(金) 14:47:48 ]
ふむふむ、なるほど。よく分かりません\(^o^)/
もう少し理解を深めてから出直したいと思います。

277 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:48:21 ]
このスレか別のスレかわからないが最近同じネタをやってて、
参照が追加になったのは演算子のオーバーロードやコピーコンストラクタで
必要に迫られたからということらしい。
通常では戻り値はいいとして引数で使うと変数の変化が追いにくくなるので
多用はしないということだった。

278 名前:265 mailto:sage [2008/07/25(金) 14:55:17 ]
C++の機能拡張に合わせて追加された、ということでしょうか。
同じネタが上がるということは、同じ疑問を持つ人がいるということですかね。
オーバーロードやコピーコンストラクタのあたりも見直してみます。

279 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:56:12 ]
>>274
その場合は呼び出し元に問題があることが確定するのが、参照にしとく利点になるかな?
ポインタだと、渡された側でヌルチェックすべきかどうか気になってしまう。

280 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:57:23 ]
>>276
まだ勉強中って書いてあったね、ごめん。
慣れるまで、参照でなければならない箇所以外は
ポインタで良いと思うよ。

たぶん、経験が自然に教えてくれる。



281 名前:デフォルトの名無しさん [2008/07/25(金) 14:57:42 ]
hoge(*(double *)NULL);

こんなん落ちないの?

282 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 15:01:25 ]
落ちると思って良い。
ちなみに言語規約違反な。

283 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 15:04:08 ]
間違った。規約じゃなくて規格。

284 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 15:08:09 ]
C++でC言語のキャスト使うのやめれ

285 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 15:08:49 ]
そういうときは未定義動作っていうんだ。コンパイルはできちゃうからね。

286 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 15:13:29 ]
#define NULL reinterpret_cast<void*>(0)

287 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 17:21:06 ]
BCCでの質問です。
ファイル間のインクルードの関係が以下の時、変更してないファイルも毎回コンパイルされるんですが回避策ってありますか?

A.h
B.h(include A.h)
A.cpp(include A.h)
B.cpp(include A.h,B.h)

オナがいします。

288 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 17:22:52 ]
>>287
ヘッダを変更しなければいいだけじゃないの?

289 名前:デフォルトの名無しさん [2008/07/25(金) 17:31:40 ]
C言語勉強中なのですが、理由が知りたいです。
簡単なプログラムなのですが、回答よろしくお願いします

void hogefunc(char *);

void main()
{
char a[256] = "abc 0001";

hogefunc(a);
}

void hogefunc(char *tmp)
{
char b[256];

strcpy(b,tmp);

}
//////////////
デバッグを行うと、bの中身が"abc"のみでaの中身"abc 0001"が文字列コピーできていません。
予想だと、aの中身とbの中身は同じになると思ってました。なぜ0001が切られたのでしょうか?
よろしくお願いします

290 名前:289 mailto:sage [2008/07/25(金) 17:34:42 ]
全て打つ前に転送してしまいました・・
このプログラムの場合、aの中身とbの中身を同じにするにはどうすればいいでしょうか?



291 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 17:34:57 ]
そんなはずがない。なんかの見間違いなんじゃないか

292 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 17:35:57 ]
void hogefunc(char *);

void main()
{
char a[256] = "abc 0001";

hogefunc(a);
}

void hogefunc(char *tmp)
{
char b[256];

strcpy(b,tmp);

printf("%s",b);

}

で試したけどちゃんと表示されてました

293 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 17:35:58 ]
>>289>>290
んなこたぁーない
もう少しデバッグのステップ続けてみ

294 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 17:36:21 ]
>>287
どうやってコンパイルしてる?
make 使ってるのなら makefile 見せてみ

295 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 17:37:42 ]

"abc 0001"
   ^ 実はこれが\0というオチを予想

296 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 19:01:40 ]
>>288,294
どうやらファイル名が長すぎるのが原因のようでした。
最小限の再現作ってたらincludeのみのヘッダファイルが二個だけになったので^^;

297 名前:デフォルトの名無しさん [2008/07/25(金) 19:11:07 ]
一様乱数を生成する関数のソースについて質問があります。y=1/sqrt(2)*exp(-1/2*x*x)の計算で
In function `GaussRandom':: undefined reference to 'sqrt’と In function `GaussRandom':
: undefined reference to `exp'というエラーがでて実行できません。もちろん<math.h>は定義しました。
レポート課題なのでマジで困ってます。是非教えてください。ソースを下に載せておきます。
ちなみにxが一様乱数で、yが正規乱数です。

double GaussRandom()
{
double x;
double y;

x=UniformRandom();
y=1/sqrt(2)*exp(-1/2*x*x);
return y;
}

double UniformRandom()
{
double x;
int r=1;

r=1229*r+351750;
x=r/1664501;

return x;
}


298 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 19:29:31 ]
>>297
お前いい加減にしろよ。

299 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 19:53:42 ]
>>289
変数寿命が切れてるから上書きされているんじゃないの?

300 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:23:03 ]
クラス内の関数ポインタでつまづいた。
分からない、全然分からない。
どこが分からないのかすら分からない。



301 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:28:50 ]
普通の関数ポインタはわかるのか?
じゃあメンバ関数ポインタでぐぐるんだ

302 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:35:00 ]
ええ、それで調べているんですけど、どうしてこんなに難解なのかと小一時間(ry
関数ポインタをメンバに含めると初期化できませんよね?こんな風に
void (*pf[])() = {hoge, piyo, foo};

もう普通に関数にした方がいいのかな……。

303 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:39:47 ]
オーバーロード演算子関数のポインタって取れないんですか?

X (*f)(X &, X &) = +;
X (*f)(X &, X &) = &+;
X (*f)(X &, X &) = ::+;
X (*f)(X &, X &) = &::+;
X (*f)(X &, X &) = *::+;
X (*f)(X &, X &) = operator +;
X (*f)(X &, X &) = &operator +;
X (*f)(X &, X &) = &::operator +;

とか色々試したんですが「;が足りません」だの「operatorの位置が不正です」だのなんだの
構文に文句付けられて通りません
取り方があれば教えて下さい

304 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:42:20 ]
それってただの関数ポインタじゃないか?

305 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:46:28 ]
>>303
これでいけたぞ
#include <stdio.h>
struct X{}x;
X operator+(X&, X&){printf("x");return X();}
int main(){
X (*f)(X&, X&) = operator+;
f(x,x);
}

306 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:53:37 ]
>>302
#include <stdio.h>
class A{
static void (A::*pf[])();
public:
void hoge(){ printf("hoge"); }
void piyo(){ printf("piyo"); }
void foo(){ printf("foo"); }
void call(){ for(int i = 0; i < 3; i++) (this->*pf[i])(); }
};
void (A::*A::pf[])() = { &A::hoge, &A::piyo, &A::foo };
int main() {
A().call();
}

307 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:56:10 ]
俺には解読不能な文字列が多すぎて、目眩がしそう。

308 名前:デフォルトの名無しさん [2008/07/25(金) 21:24:13 ]
質問があるんですが,C++プログラムの変数の中に入っているデータをJAVAで取得することは可能なんでしょうか?

データベースやファイルに書き込むなどの方法を取らずに、出来る方法があれば是非知りたいです。

309 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 21:27:34 ]
>>308
JNIと相談してみてください。

310 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 21:29:00 ]
Javaって他のJavaプログラムの変数の中のデータを取得することできるの?



311 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 21:30:24 ]
>>306
ありがとうございます。
あとはゆっくり中身を理解したいと思います。

312 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 22:25:34 ]
>>310
普通にclassファイルがあれば、望みは全て叶うでしょう。
実行中のプログラムとかCORBAとかその他みたいなプロセス間通信の事を言っているのなら、そういうインターフェースを自分で作ってください。

313 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 22:52:23 ]
>>297
#include <math.h> と書いてありますか?
手元のコンパイラで試しますので、全文をどこかにアップロードしていただけますか?


314 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 23:04:42 ]
>>313
pc11.2ch.net/test/read.cgi/tech/1215568848/919-921


315 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 23:18:23 ]
>>312
>>308に言ってあげてください

316 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:16:53 ]
ビット演算で文字列中の大文字を小文字にしようとしてるのですが一文字目は出来ますがふた文字目以降ができません。
この場合ってループで回して一文字ずつ処理するしかないんですかね?

317 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:19:56 ]
>ビット演算で文字列中の大文字を小文字にしようとしてる
言ってる意味が分からないのでソースで。

318 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:23:35 ]
str |= 0x20;
としか・・・

319 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:44:13 ]
OK、では次はこれをソースで。
>のですが一文字目は出来ますがふた文字目以降ができません。

320 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:45:24 ]
OKってようするに、わからないなら答えなくっていいです。
ソースだせソースだせってわからないだけでしょ?それをソースだせって馬鹿なの?



321 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:48:35 ]
ソースが無くてトンカツが食えるか!

322 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:48:51 ]


323 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:52:29 ]
1レス目でソース出してれば1レスで問題点が返ってくるレベルと予想

324 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:56:49 ]
文字列がマルチバイトを含まないことを祈るばかりです。

325 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 12:29:55 ]
一文字目は出来てる>>316さんがマルチバイト文字くらいで困るわけ無いじゃないか

326 名前:デフォルトの名無しさん [2008/07/26(土) 12:59:33 ]
>>309
JNIを調べて試してみましたが,自分の場合は使えなさそうです.
JAVAソースを書いて→ヘッダー作成→C++ソース作成
という順序のようですが,今の状態ではC++ソースとJAVAソースが全然別のアプリケーションとして完成していて,
C++アプリで使っているデータをJAVAで扱いたいという事なんですが…。
C++でデータを自分自身のIPに送って,JAVAでそれを取得するというのを今考えているんですが….

327 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 13:04:53 ]
テキストファイルに書き込む→読み込む

328 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 13:06:25 ]
自前でシリアル化して通信すれば

329 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 13:19:36 ]
>>10
(2)だと、クッキーの設定はちゃんとしてるのに書き込み確認画面のまま止まってる。
つまりクッキーの設定がうまくいってないみたいなんだが、デバッガで文字列を確認してみても正常だし
そのデバッガで確認した文字列を手動で書いて送信するとうまくいく。

330 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 13:20:27 ]
すみません誤爆しました。



331 名前:デフォルトの名無しさん [2008/07/26(土) 14:00:26 ]
>>327
それでも一応可能なんですが,
取得したデータに対応した動きみたいなモノを作らないといけない為,
JAVA側でテキストファイルをずっと参照し続け,更新があった場合○○する.
といった風な感じになってずっと参照し続けるというのが気持ち悪いから避けたいんです.


332 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 14:01:00 ]
>>326
プロセス間通信とか、XMLでシリアライズしたのを渡すとか。

333 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 14:55:33 ]
1〜10までの偶数を書き出すプログラムでもっと簡単なコードがあったら教えてください。
自分で書いたのは↓です。
#include <iostream>
using namespace std;

int main()
{
int i;

cout << "1〜10までの偶数を出力します\n";

for(i = 1; i <= 10; i++){
if(i % 2 == 1){
continue;
}
cout << i << "です\n";
}
return 0;
}

334 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 14:56:34 ]
for(i = 2; i <= 10; i+=2){
cout << i << "です\n";
}

335 名前:デフォルトの名無しさん [2008/07/26(土) 14:58:06 ]
for(i = 1; i <= 5; i++) cout << 2*i << "です\n";

336 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 14:59:02 ]
>>334 335

ありがとうございます

337 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 14:59:38 ]
cout << "2, 4, 6, 8, 10です\n";

338 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:01:39 ]
ウケタw

339 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:07:52 ]
そんなに面白くはない

340 名前:デフォルトの名無しさん [2008/07/26(土) 15:08:35 ]
↓次の方どうぞ



341 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:31:54 ]
繰り返し文を利用して

☆☆
☆☆☆
☆☆☆☆
☆☆☆☆☆
と表示させるコードを書いてみたのですが、もっと簡単に書く方法ありませんか?

#include <iostream>
using namespace std;

int main()
{
int i;

for(i = 1; i <= 5; i++){
if(i == 1){
cout << "☆\n";
} else if (i == 2){
cout << "☆☆\n";
} else if (i == 3){
cout << "☆☆☆\n";
} else if (i == 4){
cout << "☆☆☆☆\n";
} else if (i == 5){
cout << "☆☆☆☆☆\n"; }
}
return 0;
}

342 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:34:26 ]
ひょっとしてそれはギャグで言っているのか?

343 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:35:55 ]
普通の小学生ならカウンタの値と☆の数に関連性を見出せる筈

344 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:36:47 ]
>>341
cout << "☆\n☆☆\n☆☆☆\n☆☆☆☆\n☆☆☆☆☆";

345 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:41:25 ]
>>341
そこはif文じゃなくて、switchで場合分けするべきだと思うんだ。

346 名前:デフォルトの名無しさん [2008/07/26(土) 15:42:47 ]
>>345
いやswitchにしてもまだおかしいだろwwww

347 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:44:04 ]
少し考えるので時間ください

348 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:46:10 ]
hoshiHyouji(size_t nannko)という関数を作ればいいんじゃに

349 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:53:45 ]
関数はまだ習ってないのでわからないです。

#include <iostream>
using namespace std;

int main()
{
int i;
int j;

for(i = 1; i <= 5; i++){
for(j = 1; j <= i; j++){
cout << "☆";
}
cout << '\n';
}
return 0;
}

これでも同じように表示されたましたけど 考え方はあってますか? それとも、もっと簡単な方法があるのでしょうか?

350 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:56:42 ]
あってると思うけど
個人的に
for(i = 0; i < 5; i++){
for(j = 0; j < i; j++){
の方が好き



351 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:58:14 ]
>>350
なるほど0からのカウントですか。

もっと分かりやすいコードが書けるように頑張ってみます。

352 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:58:55 ]
>>349
そこは繰り返しじゃなくて再帰を使うべきだな。

void print_hosi(int num);
void print_hosi(int num)
{
    if ( num <= 0 ) { return; }
    for ( int i = 0; i < num; i++ ) { cout << "☆"; }
    cout << endl;
    print_hosi( num - 1 );
}

353 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 16:10:37 ]
>>350 すいません、自分が指摘するのはあれなんですが

☆☆
☆☆☆
☆☆☆☆
☆☆☆☆☆
と表示させるなら

for(i = 0; i < 5; i++){
for(j = 0; j <= i; j++){
だと思います。

354 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 16:14:39 ]
俺なら
for(i = 0; i < 5; i++){
for(j = 0; j < i+1; j++){
にするかな、気分の問題だけど

355 名前:デフォルトの名無しさん [2008/07/26(土) 16:17:28 ]
for(i = 1; i <= 5; i++)
for(j = 0; j < j; j++)

356 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 16:18:08 ]
俺には j < i であってるように見える。

357 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 16:19:28 ]
>>356
それで実行したら
-----------
改行

☆☆
☆☆☆
☆☆☆☆
-----------
でした。

358 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 16:19:33 ]
>>356>>353-354

359 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 16:29:21 ]
まぁ
for(i = 0; i < 5; i++){ cout << "☆";
for(j = 0; j < i; j++){ cout << "☆";
}
cout << "\n";
}
でも出来るけど、>>355が正解だろうな。

360 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 16:45:24 ]
でもこの手のはCSVやURLクエリのように区切りが出てきて
for(int i=0; i<5; i++){
 std::cout << "☆";
 for(int j=0; j<i; j++){
  std::cout << ",";
  std::cout << "☆";
 }
 std::cout << "\n";
}
みたいな感じに落ち着くことも多い。



361 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 16:47:44 ]
#include <iostream>
#include <iomanip>

int main() {
int i, j;
std::cout.fill('☆');
for(i = 1; i <= 5; i++)
std::cout<<std::setiosflags(std::ios::right)<<std::setw(i)<<""<<std::endl;
return 0;
}


362 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 17:00:18 ]
('☆')←何この顔バカにしてるの?

363 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 17:09:26 ]
>>362
なんだと

364 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 17:09:38 ]
std::string str;
for(int i=0; i < 5; i++) {
 str += "☆";
 std::cout << str;
}
std::cout << "\n";

365 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 17:11:16 ]
>>362
寄生獣ですね、わかります。

366 名前:デフォルトの名無しさん [2008/07/26(土) 19:54:58 ]
サービスとして動くプログラムのサンプルをやってるんですが上手くいきません
StartServiceCtrlDispatcher()で失敗します
GetLastError()で1063が取れるんですけど、どうすればいいんでしょうか?
環境はxp sp2、vc++2005でやってます

void ErrorHandler( char *s, DWORD err )
{
std::cout << s << std::endl;
std::cout << "Error number: " << err << std::endl;
ExitProcess( err );
}

void WINAPI ServiceMain( DWORD argc, LPTSTR *argv )
{
// 空
}

void main()
{
char *SERVICE_NAME = "BeepService";

SERVICE_TABLE_ENTRY serviceTable[] = {
{ SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
{ NULL, NULL }
};

// SCMで登録する
BOOL success = StartServiceCtrlDispatcher( serviceTable );
if( !success )
ErrorHandler( "In StartServiceCtrlDispatcher", GetLastError() );
}

367 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 20:23:00 ]
>>366
よくわからんが、ちゃんとサービスとしてSCMのデータベースに登録済みで、
SCMからサービスとして起動されたときにそういうエラーが出ているの?

ただのコンソールアプリとして普通にキックしたときに
StartServiceCtrlDispatcher()が失敗するのはただの仕様なんじゃないの

368 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 22:02:45 ]
double型の変数を文字型の変数に疑似変換するプログラムを書けと教授に言われたのですが、
全く方法が解りません・・・。
誰か助けてください。
その際関数のオーバーロードを必ず使用する事、と言われました。

実は問題の意味があまり分かってなかったり。疑似変換とは・・・?

369 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 22:05:40 ]
問題の意味は出題者に訊くしかない

370 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 22:08:25 ]
今から教授に電話して聞いてみます。



371 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 22:10:58 ]
sprintf?
でもオーバーロードなんか必要ないしなぁ・・・

372 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 22:13:17 ]
留守電だったので諦めました。
とりあえず考えられる事をいくつかプログラムしてみます。
疑似変換・・・・か。

373 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 22:20:58 ]
char型の固定小数で表せって事だろJK

374 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 22:22:31 ]
>>368
こんなん?
真夜中の電話、不吉な感じがイヤン

#include<iostream>
#include<string>

//ここでオペレータをほげほげ

int main(void){
double x=1.2345;
std::string str;

str=x;
std::cout << str << std::endl;

return 0;
}

375 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 22:33:26 ]
オーバーロードを入れるとややこしくなりそうだな〜

376 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 22:37:31 ]
関数のオーバーロードをする必要性がわからん・・

377 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 23:15:40 ]
inline関数を使う場合は関数の宣言と関数の定義で2回記述しないといけないんですか?
#include <iostream>
using namespace std;
//関数の宣言
inline int square(int x);
inline double square(double x);
int main()
{
int i;
double j;

cout << "整数を入力してください\n";
cin >> i;
int sum1 = square(i);
cout << i << "の二乗は" << sum1 << "です\n";

cout << "小数を入力してください\n";
cin >> j;
double sum2 = square(j);
cout << j << "の二乗は" << sum2 << "です\n";

return 0;
}
//関数の定義
inline int square(int x){
int num1;
num1 = x * x;
return num1;
}inline double square(double x){
double mum1;
mum1 = x * x;
return mum1;}

378 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 23:19:47 ]
>>377
inline なら定義が無いと意味無いし、定義は宣言を含むから、定義だけ書いとけばいいよ。

379 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 23:21:06 ]
>>378 即レスありがとうございます!

380 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 23:28:40 ]
すいませんもう1つだけ質問です。
テンプレート関数は

templat <class T>



381 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 23:29:25 ]
すいません誤爆で途中で投稿してしまいました。
スレ汚しすいません;;

382 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 23:34:20 ]
すいませんテンプレート関数は
template <class T>
T square(T x){
処理
}
と記述できると書いてあったんですが
宣言と定義みたいに分けて記述することはできないんですか?
試しに
//宣言
template <class T>
T square(T x);

main関数

return 0;
//定義
T square(T x){
処理
}
とやったのですがエラーが出ました。要するに無理ってことでしょうか?

383 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 23:43:04 ]
>>382
無理です。使う時点で定義が読み込まれている必要があります。

384 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 23:44:15 ]
>>383
ありがとうございます。
不思議に思っていたことが解決しました。

385 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 23:44:31 ]
>>382-383
っ export

386 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 23:52:22 ]
>>385
つ現実

387 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 00:02:31 ]
>>382
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-template-3.html

388 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 00:06:47 ]
>>387
馬鹿?

389 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 00:08:34 ]
>>382
分けて書くこと自体は可能。その感じだと、たぶん定義のほうに template <class T> が足りないだけ。

390 名前:デフォルトの名無しさん [2008/07/27(日) 01:35:03 ]
「aaaaiiiuuueooあああああいいいしてるるるる」
みたいに、

・昇順で並んでいる
・同じ文字がたくさん入ってる
・あとから変更されることはない
・wchar_t
・一文字あたりの繰り返しは少ない(5個くらいまで)
・長い文字列もある(10MBytesくらい)

という文字列を扱うんだが、

・「N番目の文字」を高速に取り出せる
・「N種類目の文字と個数」を高速に取り出せる

条件を満たすデータ構造ってどんなのがある?
配列を2つ用意するしかない?

てかこのスレでよかった?




391 名前:390 mailto:sage [2008/07/27(日) 01:36:00 ]
すまん矛盾してた

> ・同じ文字がたくさん入ってる
これは無視してくれ。


392 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 01:41:12 ]
>>390
struct { int start; wchar_t c; } を start でソートした配列、でいいんじゃないかな?
その例だと {{0, L'a'}, {4, L'i'}, {7, L'u'}, {10, L'e'}, {11, L'o'}, {13, L'あ'}, ...} って感じで。

393 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 01:41:14 ]
>>390
昇順に並んでるってのは、文字コードが昇順にならんでるってわけじゃないの?

394 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 01:46:54 ]
>>392
おお!
なんだかよさそうだ。
ありがと!

>>393
そうです

395 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 01:48:28 ]
>>394
例にでてる文字列が文字コード順に並んでないけど、それは例が間違いってことだな。

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