【初心者歓迎】C/C++室 Ver.57【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.57【環境依存OK】 - 暇つぶし2ch2:デフォルトの名無しさん
08/07/16 22:40:18
しまった。コピペしてそのままにしてしまってた・・・。
正しくはこうだな。

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

3:デフォルトの名無しさん
08/07/16 22:58:04
           

4:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/17 00:03:13
>>4
どこか、あなたの知らないところに作られています。
フルパスでファイルを作るか、カレントディレクトリを指定すると宜しいかと。

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

7:デフォルトの名無しさん
08/07/17 05:42:31
class Hoge
{
Hoge() { Init(); }
~Hoge();
Init();
}

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

8:デフォルトの名無しさん
08/07/17 05:48:51
ok

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

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

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


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

13:デフォルトの名無しさん
08/07/17 09:09:55
デバグ情報
最適化

14:デフォルトの名無しさん
08/07/17 09:23:44
本当のプロはデバッグモードは使わない。

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

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

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

18:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/17 14:28:20
lTempの値次第

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

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

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

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

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

24:23
08/07/17 16:25:59
すいません、この場合もextern "C"でいけるんですね。
スレ汚し失礼しました。

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

26:デフォルトの名無しさん
08/07/17 18:38:12
イミフ

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

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

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

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

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

30:デフォルトの名無しさん
08/07/17 21:03:00
Wallにしたらつらつらと出たりしてな。

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

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


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

32:デフォルトの名無しさん
08/07/17 21:47:12
void* memset(void*, int, size_t)

33:デフォルトの名無しさん
08/07/17 21:49:32
memsetはバイト単位でデータを埋めるのにしか使えない。

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

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

36:31
08/07/17 22:44:27
わかりました!どうも

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

38:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/17 23:26:03
何でコンストラクタから仮想関数を呼べるんですか?
どうせ誰も得しないんだろうからコンパイルエラーにしちゃえばいいのに。

40:デフォルトの名無しさん
08/07/17 23:26:40
>>39
呼べるようにしたほうが設計的に美しいんじゃね?

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

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

42:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/17 23:59:56
>>41
いや、これ自体に特に意味はないんだが。
環境依存のメモリリークとか発生しないかと思って。

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

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

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

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

48:42
08/07/18 00:03:33
>>44
WSACleanup()の後でも減ってませんでした

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

49:デフォルトの名無しさん
08/07/18 00:06:32
>>48
ExpressEditionならタダで手に入る…
ってか会社でExpressEdition!

50:デフォルトの名無しさん
08/07/18 00:10:50
>>38 >>47
Aからさらに継承しない限り問題無し

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

52:デフォルトの名無しさん
08/07/18 00:19:20
その無料のExpressEditionで数百万で売るもの作ってます^^

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

54:49
08/07/18 00:21:25
>>51
読んできた
URLリンク(www.microsoft.com)

勘違いしていたようだ

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

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

56:デフォルトの名無しさん
08/07/18 00:24:57
>>50
ありがと!

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

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

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

60:デフォルトの名無しさん
08/07/18 00:57:51
まぁループはsignedにしといたほうが無難だろうね

61:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/18 01:03:12
"A" → 'A'

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

64:デフォルトの名無しさん
08/07/18 01:05:09
char* abc(int number){}

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


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

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

68:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/18 01:42:33
ループカウンタはsignedが普通って事は、
int size = static_cast<int>(instance_of_vector.size());
for (int i = 0; i < size; ++i) ...;
ってやればいいの?

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

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

72:デフォルトの名無しさん
08/07/18 01:51:58
>>71
だから、OpenMPで警告が出るんだってばさ。

73:デフォルトの名無しさん
08/07/18 02:05:28
理解してるなら警告は無視していい

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

75:デフォルトの名無しさん
08/07/18 02:37:36
>>37
URLリンク(www.kouno.jp)

76:デフォルトの名無しさん
08/07/18 03:24:25
virtualな関数が増えると、ポリモーフのコストって増える?

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

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

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

80:デフォルトの名無しさん
08/07/18 05:25:33
GNUのコード使ったら、

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

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

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

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

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

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

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

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

86:デフォルトの名無しさん
08/07/18 10:06:58
>>83
鵜呑みしないで疑っているからここにいるわけで

87:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/18 16:52:11
誤爆しました・・・

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

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

92:デフォルトの名無しさん
08/07/18 21:59:32
unsignedだとオーバーフローで鼻からなんか発生しない。

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

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

94:デフォルトの名無しさん
08/07/19 00:40:43
>>92
鼻から牛乳がオーバーフローしました

95:デフォルトの名無しさん
08/07/19 15:30:21
>>91
境界チェックの比較が1回で済む

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

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

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


99:デフォルトの名無しさん
08/07/19 19:17:41
>>98 なんでコピーできないと思うの?

100:デフォルトの名無しさん
08/07/19 19:19:20
while(( *d++ = *s++) != 0)

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

102:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/19 20:28:05
CTestの実装による

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

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


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

105:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/19 23:33:41
それを見たくなるってのは、もしかして、
1つの関数に詰め込みすぎのサインだったりするんじゃないかな。

107:デフォルトの名無しさん
08/07/19 23:39:33
「そういうコードは書かない方がいい」じゃだめですか

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

109:デフォルトの名無しさん
08/07/19 23:53:22
VCにそんなオプション有った気が

110:デフォルトの名無しさん
08/07/19 23:53:26
>>108
思うだけにしておいたほうがいいと思います

111:デフォルトの名無しさん
08/07/20 00:06:57
>>108
闇雲にインライン展開しても速くならないんだな。

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

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

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

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

115:デフォルトの名無しさん
08/07/20 01:06:06
>>108
inlineじゃだめですか?

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

117:デフォルトの名無しさん
08/07/20 01:30:33
ファイルで分割しても二桁とか

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

119:デフォルトの名無しさん
08/07/20 01:43:24
誤爆

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

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

122:デフォルトの名無しさん
08/07/20 02:53:58
>>120
inlineにしなくてもインライン展開されることもあるしね。

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

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

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


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

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

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

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

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

129:デフォルトの名無しさん
08/07/20 08:55:06
>>112
そんな鉄則ねえよ。


130:デフォルトの名無しさん
08/07/20 12:25:29
あるよ。井戸の外には

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

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

冗談じゃねぇ。

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

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

135:デフォルトの名無しさん
08/07/20 13:56:38
A4一枚とかはよく見聞きする話

136:デフォルトの名無しさん
08/07/20 14:06:39
明日から7ptフォントで開発しとけよ。

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

138:デフォルトの名無しさん
08/07/20 14:14:15
マクロで質問です。

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

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

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

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

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

140:デフォルトの名無しさん
08/07/20 14:24:27
できないよ。

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

142:デフォルトの名無しさん
08/07/20 15:17:57
プラグマをマクロ化って。
誰が得するんだ…。

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

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

145:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/20 16:14:15
includeでやるのはどう?

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

148:デフォルトの名無しさん
08/07/20 16:39:11
>>130
井戸の中にしかないと思われ。

149:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/20 17:19:22
STLのstd::vector<int>とか使ったらいいとおもうよ。

151:デフォルトの名無しさん
08/07/20 17:22:06
m_Listは std::vector<Object> m_List;で宣言してあります。

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

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

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

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

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

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

157:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/20 22:23:27
wstringとか

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

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

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

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

162:デフォルトの名無しさん
08/07/20 22:47:14
サロゲートなんて捨ててOK

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

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

165:デフォルトの名無しさん
08/07/20 22:57:08
>>162
つUTF-8, UTF-32

166:デフォルトの名無しさん
08/07/20 22:59:55
>>163
そんなレガシー技術に頼るぐらいならUnicodeにしとけよ

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

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

167:デフォルトの名無しさん
08/07/20 23:00:00
>>165
つwchar_t

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

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

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

170:デフォルトの名無しさん
08/07/20 23:15:37
なんで文字コードごときの話でそんな偉そうにできるんですか?

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

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

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

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

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

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

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

177:176
08/07/20 23:53:11
もちろん、ICUなどで提供されている型や関数を使っている人は除く

178:デフォルトの名無しさん
08/07/21 02:42:01
どーでもいいよそんなの

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

※ime.nu通すと#以降が消えるので
URLリンク(ja.wikipedia.org)

180:デフォルトの名無しさん
08/07/21 14:04:39
printf("aaa\b\b\b");

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

181:デフォルトの名無しさん
08/07/21 14:20:49
次に書いた文字がaaaを上書きする。

182:180
08/07/21 14:40:00
>>181さんありがとうございます。

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

183:デフォルトの名無しさん
08/07/21 19:36:23
char *p;
char **pp = malloc(sizeof(char*) * 100);

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

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

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

185:デフォルトの名無しさん
08/07/21 22:34:01
>>184
同じ意味とは型が同じかという意味でした。

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


187:デフォルトの名無しさん
08/07/21 23:17:41
当たり前だ

188:デフォルトの名無しさん
08/07/22 04:22:32
そのための_TCHARだ。

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

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

191:デフォルトの名無しさん
08/07/22 14:28:47
>>190
WしかないAPIもある

192:デフォルトの名無しさん
08/07/22 14:34:56
>>191
そんな話はしていない

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

194:デフォルトの名無しさん
08/07/22 17:33:55
wchar_tの中身がUnicode系ではない環境もあるのでよろぴこ。


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

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




197:デフォルトの名無しさん
08/07/22 22:00:16
そうなのか。㌧クス

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

199:デフォルトの名無しさん
08/07/22 22:11:08
wchar_tマジ使えなさすぎワロタ
URLリンク(ml.tietew.jp)

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

201:デフォルトの名無しさん
08/07/22 22:55:17
gccのwchar_tは昔からうんこ
あまりにも有名すぎる話

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

203:デフォルトの名無しさん
08/07/23 01:49:03

*i |= 3;

はちゃんと

*i = *i | 3;

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


204:デフォルトの名無しさん
08/07/23 02:26:54
いいえ、前者と後者では意味が違います。

205:デフォルトの名無しさん
08/07/23 02:32:22
>>203
「展開される」の意味が分からない

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

206:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/23 10:07:15
ローカル変数とは定義された順にスタックに積まれるのですか?

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

209:デフォルトの名無しさん
08/07/23 10:13:50
>>206
> delete時にチェックする方法はあるんでしょうか?

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



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





211:デフォルトの名無しさん
08/07/23 10:25:16
>>208
どこでNULLをセットすればいいですか?

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

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

212:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/23 11:37:38
>>207
規格ではスタックが使われるのかすら決まってなかった気がする

214:デフォルトの名無しさん
08/07/23 12:39:32
>>211
string*ではなくstringをメンバに持たせる

215:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/23 16:35:26
>itr = foo0.getvar().begin();

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

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

218:デフォルトの名無しさん
08/07/23 20:39:07
HOGEという構造体がtypedefされているとします。


HOGE *hoge;と宣言します。


void function(HOGE *hoge){

}という関数に

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

219:デフォルトの名無しさん
08/07/23 20:42:42
>>218
それはC++でいうところの参照ではありません

220:デフォルトの名無しさん
08/07/23 20:44:26
アドレス私ですか?

221:デフォルトの名無しさん
08/07/23 20:46:44


222:デフォルトの名無しさん
08/07/23 20:47:38
アドレス渡しですか?の間違いです

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

224:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/23 21:40:34
foo(HOGE fuga)
foo(HOGE &fuga)

HOGE hoge;
foo(hoge);

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

226:デフォルトの名無しさん
08/07/23 21:43:00
>>225
自分でコンパイルしてみては?

227:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/23 21:44:44
もし環境依存だったら自分で試しただけでは分からないし

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

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


231:デフォルトの名無しさん
08/07/23 22:44:37
いつのg++の話?

232:デフォルトの名無しさん
08/07/23 23:54:09
>>224
225は自分じゃないです。

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

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

234:デフォルトの名無しさん
08/07/24 00:10:51
225は違う人だったのか…

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

235:デフォルトの名無しさん
08/07/24 00:21:32
クラスは参照型なのでゴニョゴニョ

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

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

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

238:デフォルトの名無しさん
08/07/24 09:04:36
>>235
嘘をつくな

239:デフォルトの名無しさん
08/07/24 13:36:21
あれ?
クラスもコピーコンストラクタ呼ばれて値渡しされるよね?

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

241:240
08/07/24 13:42:25
値渡しの話だよね?

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

243:240
08/07/24 13:44:40
あ、そっか、そうだね、失礼

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

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

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

246:デフォルトの名無しさん
08/07/24 13:53:44
それぞれ想定している状況が違っている悪寒。

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

248:デフォルトの名無しさん
08/07/24 14:17:41
URLリンク(www.boost.org)

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

249:デフォルトの名無しさん
08/07/24 14:39:09
darwinってmacのことだぞ

250:デフォルトの名無しさん
08/07/24 19:59:10

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

251:デフォルトの名無しさん
08/07/24 20:00:54
>>250
regex を二回呼べばいいんでは?

252:デフォルトの名無しさん
08/07/24 20:09:39

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


253:デフォルトの名無しさん
08/07/24 20:23:33
>>250
簡単な例をplz

254:デフォルトの名無しさん
08/07/24 20:29:02
${1}0でいけたような気がしたけど、どうだったかなあ

255:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/24 20:34:49
そういう意味か!

257:250
08/07/24 20:38:51
>>255
ありがとう!それでうまくいきました.

258:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/25 10:34:45
>>258
よくわからんが
ofstreamのかわりにcoutやsstreamを使えばいいだけなんじゃないの?

260:デフォルトの名無しさん
08/07/25 10:35:02
追記

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

261:デフォルトの名無しさん
08/07/25 10:36:58
トンクス これでいけました!

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

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

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

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

263:デフォルトの名無しさん
08/07/25 10:46:46
>>262
つ[stringstream]

264:デフォルトの名無しさん
08/07/25 10:50:32
トンクス

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

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

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

268:デフォルトの名無しさん
08/07/25 13:51:13
const char & を渡してどーすんだ

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

270:デフォルトの名無しさん
08/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
08/07/25 14:12:35
値渡しのコピーを省くためなら、参照でなくともポインタでできそうですけど、
それをわざと参照でやる理由はなんでしょう?
c++まだ勉強中で、ざっと見た感じ、以下のようなものしか有用性はないような気がしてます。
ポインタでの煩わしい明示を省ける、視覚的に区別する以外のメリットはあるのでしょうか?

int n;
int &func();

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

int &func()
{
    return n;
}

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

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

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

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

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


275:デフォルトの名無しさん
08/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
08/07/25 14:47:48
ふむふむ、なるほど。よく分かりません\(^o^)/
もう少し理解を深めてから出直したいと思います。

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

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

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

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

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

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

こんなん落ちないの?

282:デフォルトの名無しさん
08/07/25 15:01:25
落ちると思って良い。
ちなみに言語規約違反な。

283:デフォルトの名無しさん
08/07/25 15:04:08
間違った。規約じゃなくて規格。

284:デフォルトの名無しさん
08/07/25 15:08:09
C++でC言語のキャスト使うのやめれ

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

286:デフォルトの名無しさん
08/07/25 15:13:29
#define NULL reinterpret_cast<void*>(0)

287:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/25 17:22:52
>>287
ヘッダを変更しなければいいだけじゃないの?

289:デフォルトの名無しさん
08/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
08/07/25 17:34:42
全て打つ前に転送してしまいました・・
このプログラムの場合、aの中身とbの中身を同じにするにはどうすればいいでしょうか?

291:デフォルトの名無しさん
08/07/25 17:34:57
そんなはずがない。なんかの見間違いなんじゃないか

292:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/25 17:35:58
>>289>>290
んなこたぁーない
もう少しデバッグのステップ続けてみ

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

295:デフォルトの名無しさん
08/07/25 17:37:42

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

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

297:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/25 19:29:31
>>297
お前いい加減にしろよ。

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

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

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

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

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

303:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/25 20:42:20
それってただの関数ポインタじゃないか?

305:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/25 20:56:10
俺には解読不能な文字列が多すぎて、目眩がしそう。

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

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

309:デフォルトの名無しさん
08/07/25 21:27:34
>>308
JNIと相談してみてください。

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

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

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

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


314:デフォルトの名無しさん
08/07/25 23:04:42
>>313
スレリンク(tech板:919-921番)


315:デフォルトの名無しさん
08/07/25 23:18:23
>>312
>>308に言ってあげてください

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

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

318:デフォルトの名無しさん
08/07/26 09:23:35
str |= 0x20;
としか・・・

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

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

321:デフォルトの名無しさん
08/07/26 09:48:35
ソースが無くてトンカツが食えるか!

322:デフォルトの名無しさん
08/07/26 09:48:51


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

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

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

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

327:デフォルトの名無しさん
08/07/26 13:04:53
テキストファイルに書き込む→読み込む

328:デフォルトの名無しさん
08/07/26 13:06:25
自前でシリアル化して通信すれば

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

330:デフォルトの名無しさん
08/07/26 13:20:27
すみません誤爆しました。

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


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

333:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/26 14:56:34
for(i = 2; i <= 10; i+=2){
cout << i << "です\n";
}

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

336:デフォルトの名無しさん
08/07/26 14:59:02
>>334 335

ありがとうございます

337:デフォルトの名無しさん
08/07/26 14:59:38
cout << "2, 4, 6, 8, 10です\n";

338:デフォルトの名無しさん
08/07/26 15:01:39
ウケタw

339:デフォルトの名無しさん
08/07/26 15:07:52
そんなに面白くはない

340:デフォルトの名無しさん
08/07/26 15:08:35
↓次の方どうぞ

341:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/26 15:34:26
ひょっとしてそれはギャグで言っているのか?

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

344:デフォルトの名無しさん
08/07/26 15:36:47
>>341
cout << "☆\n☆☆\n☆☆☆\n☆☆☆☆\n☆☆☆☆☆";

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

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

347:デフォルトの名無しさん
08/07/26 15:44:04
少し考えるので時間ください

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

349:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/26 15:56:42
あってると思うけど
個人的に
for(i = 0; i < 5; i++){
for(j = 0; j < i; j++){
の方が好き

351:デフォルトの名無しさん
08/07/26 15:58:14
>>350
なるほど0からのカウントですか。

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

352:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/26 16:10:37
>>350 すいません、自分が指摘するのはあれなんですが

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

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

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

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

356:デフォルトの名無しさん
08/07/26 16:18:08
俺には j < i であってるように見える。

357:デフォルトの名無しさん
08/07/26 16:19:28
>>356
それで実行したら
-----------
改行

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

358:デフォルトの名無しさん
08/07/26 16:19:33
>>356>>353-354宛

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

360:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/26 17:00:18
('☆')←何この顔バカにしてるの?

363:デフォルトの名無しさん
08/07/26 17:09:26
>>362
なんだと

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

365:デフォルトの名無しさん
08/07/26 17:11:16
>>362
寄生獣ですね、わかります。

366:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/26 20:23:00
>>366
よくわからんが、ちゃんとサービスとしてSCMのデータベースに登録済みで、
SCMからサービスとして起動されたときにそういうエラーが出ているの?

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

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

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

369:デフォルトの名無しさん
08/07/26 22:05:40
問題の意味は出題者に訊くしかない

370:デフォルトの名無しさん
08/07/26 22:08:25
今から教授に電話して聞いてみます。

371:デフォルトの名無しさん
08/07/26 22:10:58
sprintf?
でもオーバーロードなんか必要ないしなぁ・・・

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

373:デフォルトの名無しさん
08/07/26 22:20:58
char型の固定小数で表せって事だろJK

374:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/26 22:33:26
オーバーロードを入れるとややこしくなりそうだな~

376:デフォルトの名無しさん
08/07/26 22:37:31
関数のオーバーロードをする必要性がわからん・・

377:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/26 23:19:47
>>377
inline なら定義が無いと意味無いし、定義は宣言を含むから、定義だけ書いとけばいいよ。

379:デフォルトの名無しさん
08/07/26 23:21:06
>>378 即レスありがとうございます!

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

templat <class T>

381:デフォルトの名無しさん
08/07/26 23:29:25
すいません誤爆で途中で投稿してしまいました。
スレ汚しすいません;;

382:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/26 23:43:04
>>382
無理です。使う時点で定義が読み込まれている必要があります。

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

385:デフォルトの名無しさん
08/07/26 23:44:31
>>382-383
っ export

386:デフォルトの名無しさん
08/07/26 23:52:22
>>385
つ現実

387:デフォルトの名無しさん
08/07/27 00:02:31
>>382
URLリンク(www.fides.dti.ne.jp)

388:デフォルトの名無しさん
08/07/27 00:06:47
>>387
馬鹿?

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

390:デフォルトの名無しさん
08/07/27 01:35:03
「aaaaiiiuuueooあああああいいいしてるるるる」
みたいに、

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

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

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

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

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


391:390
08/07/27 01:36:00
すまん矛盾してた

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


392:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/27 01:41:14
>>390
昇順に並んでるってのは、文字コードが昇順にならんでるってわけじゃないの?

394:デフォルトの名無しさん
08/07/27 01:46:54
>>392
おお!
なんだかよさそうだ。
ありがと!

>>393
そうです

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

396:デフォルトの名無しさん
08/07/27 01:50:47
>>395
ひらがなが先だっけ?
なら例が間違ってるわ。
すまん

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

398:デフォルトの名無しさん
08/07/27 10:26:24
>>397
そうでした

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

401:デフォルトの名無しさん
08/07/27 14:55:17
宿題スレに書かずにここに書く辺りが無駄。

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

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

404:デフォルトの名無しさん
08/07/27 15:05:10
>>402
指摘ありがとうございます。

405:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/27 18:01:19
<T, int>いらない

407:デフォルトの名無しさん
08/07/27 18:04:36
>>406
ありがとうさん

408:405
08/07/27 18:07:53
template<int I, int J>
void f()
{
}

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

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


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

ソースは以下。


410:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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
08/07/27 18:25:03
おお!
ありがとうございます m(_ _)m

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

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

414:413
08/07/27 18:41:51
間違えた
メンバ変数じゃなくてメンバ関数をポインタ型にすると
メンバ変数が定義されていないって出る

415:デフォルトの名無しさん
08/07/27 18:42:39
class hoge{


416:デフォルトの名無しさん
08/07/27 18:46:14
直感で
static付けたらどうでしょうと言ってみよう

417:デフォルトの名無しさん
08/07/27 18:48:36
メンバ関数をポインタ型?
メンバ変数をメンバ関数ポインタの型にするって事か?

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

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

ってなる

419:デフォルトの名無しさん
08/07/27 18:56:44
void* A::get_a()

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

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

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

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

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

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

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

425:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/27 20:29:50
>>426
sum = std::count( str.begin(), str.end(), c )



428:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/27 20:31:09
>>427
ありがとうございます!

430:デフォルトの名無しさん
08/07/27 20:37:12
>>428
特殊化

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

432:428
08/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:デフォルトの名無しさん
08/07/27 21:32:49
>>423-424
ありがとうございます、>>424さんが言われたとおり直前で数値をwcinにて
受け取ってます。それをコメントアウトしたらgetineのとこで処理が
止まりました。

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


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

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

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

437:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/27 23:13:07
nul終端文字列ってほんと頭悪い仕様だよな。色々非効率だし。

440:437
08/07/28 01:14:04

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

441:デフォルトの名無しさん
08/07/28 01:34:49
>>439
PASCAL stringを授けよう。

442:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/28 02:26:08
>>442
一文字だったら *(char*)wp == 'v' とかでどうなんだろう
あとメッセージボックスなんかでwpの中身確認してみたらどうだろうか

ついでにこっちの方が回答もらいやすいかもね
Win32API質問箱 Build68
スレリンク(tech板)

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

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

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


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