【初心者歓迎】C/C++室 Ver.57【環境依存OK】 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
08/07/16 22:39:18
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.56【環境依存OK】
スレリンク(tech板)

【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)

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

2:デフォルトの名無しさん
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通すと#以降が消えるので
Wikipedia項目リンク

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
そうなのか。dクス

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++の話?


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

4676日前に更新/131 KB
担当:undef