スレを勃てるまでもないC/C++の質問はここで 17at TECH
スレを勃てるまでもないC/C++の質問はここで 17 - 暇つぶし2ch2:デフォルトの名無しさん
10/09/22 09:33:51
なんかいっつも完走まで次スレが建たずに俺が立ててるような錯覚に陥ってきたぞ

3:デフォルトの名無しさん
10/09/22 09:58:25
書き込みてすと

4:デフォルトの名無しさん
10/09/22 10:31:12
>今からやるならCかC++どちらがいいですか?
>用途は秀丸エディタのマクロから利用するdllと変換モジュールの作成です
>知識はC#,Actionscript,javascriptです
>やりたい用途はDLL作成です
>用途は秀丸エディタのマクロから利用するdllと変換モジュールの作成です

前スレ988で質問した者です

C#で作成したDLLは呼び出し元のプログラムの間に中継するDLLが必要なため、
DLLのみCかC++で作成したいのですが今からやる分にはどちらがいいのでしょうか?


5:デフォルトの名無しさん
10/09/22 12:59:11
>>4
C++

6:デフォルトの名無しさん
10/09/22 20:43:08
vectorのswapについて質問いたします。

ファイルのパスと、ファイルのヘッダー部分だけを取り込んだ情報をvector FileListとしてもち、
ファイル名だけをListBoxに表示しているプログラムで、選択したファイルを上下に入れ替える
処理を書いてみました。

case IDC_BUTTON_UP:{
  int i = SendMessage(hList , LB_GETCURSEL , 0 , 0);  //リストボックスのカーソルに合わせる
  if( i== LB_ERR || i == 0 ) return (INT_PTR)TRUE;

  wchar_t file_name_buff[_MAX_PATH];        //リストボックスの入れ替え
  SendMessage(hList, LB_GETTEXT, i, (LPARAM)file_name_buff );
  SendMessage(hList, LB_DELETESTRING, i, NULL );
  SendMessage(hList, LB_INSERTSTRING, i-1, (LPARAM)file_name_buff );
  SendMessage(hList, LB_SETCURSEL, i-1, NULL );

  std::swap( FileList[i-1], FileList[i]);            //vectorのほうの入れ替え

  return (INT_PTR)TRUE;
}

リストボックスの表示はうまくいきましたが、動作確認のため

for(i=0;i<FileList.size();,i++){
  SendMessage(hDebugList, LB_ADDSTRING , 0 , (LPARAM)FileList[i].FileName.c_str());
}

のように列挙してみても、vector側の順番が変わっていません。
コンパイラからはエラーが出なかったのですがswapの書き方がまずいのでしょうか。
あるいはイテレータを使えば順番が換わっているのでしょうか。


7:デフォルトの名無しさん
10/09/22 21:21:11
>>6
URLリンク(codepad.org)

vectorの要素がstd::swapで交換できないということはないと思う。
本当にそのFileListは目標としてる操作対象なのかと、
FileListの要素の型がコピーコンストラクタを持っているかを確認してみて。

8:6
10/09/22 21:28:01
ほかにswapできるコンテナないですから、コンパイル通ってる時点でOKなはず。

class FileMemmber {
public:
   wchar_t    FilePath[_MAX_PATH];
   BITMAPFILEHEADER  BitFileHeader;
   BITMAPV5HEADER    BitFileInfo;
};
std::vector<FileMemmber> FileList;

こんな感じです。
コピーコンストラクタなんで作ってないですが、デフォルトであるものだと理解してましたが。


9:デフォルトの名無しさん
10/09/22 21:32:21
おかしーね。 それなら行けてるはずなんだけど。
他に考えられることは……どのタイミングでhDebugListに向けて列挙してる?

10:6
10/09/22 21:39:13
え~と、
ほか用に作ったボタン押したときに小窓作って表示してます。

  case IDC_Horizontal:{//未実装
    DialogBox(hInst, MAKEINTRESOURCE(IDD_DEBUGMSG), NULL, debugproc);
    return (INT_PTR)TRUE;
  }
で、

INT_PTR CALLBACK debugproc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

のWM_INITDIALOG内です。
あと、FileListはグローバルで定義してます。


11:デフォルトの名無しさん
10/09/22 21:43:10
FIleMemmberにShallow Copy不可なメンバが含まれているのと違う?

12:デフォルトの名無しさん
10/09/22 21:44:20
それだ
実はファイルパスをwchar_t[]じゃなくてwstringで持ってるでしょ
>>6のコードでc_str呼んでるじゃん

13:6
10/09/22 21:53:35
いろいろとお答えありがとうございます。
自分初心者なもんで、コンストラクタとか良く理解できていません。
Shallow Copyとかもはじめて聞いた状態でして、もう少し自分で勉強してみます。

クローンの場合Shallow Copyはできない、とかありましたからそれが原因かもしれません。
ドラッグアンドドロップでファイルを受け取って、ファイルストリームからBitFileHeaderを
read使ってバッファに読み込んでます。
で、ファイルメンバークラスもそこでバッファ用に定義してます。
ファイルリストにはそのバッファを代入しているのですが、それが原因でしょうか。

しかし、

FileList.push_back(file_memmber_buff);

とやってるんですが、別に問題あるように感じないし.....
う~~ん。


14:6
10/09/22 21:56:34
>>12

ああああああ
わかりました。
直してみます。

そうです、型勘違いしてました。


15:6
10/09/22 22:01:36
いや、違いました。

やっぱり、FileListはwchar_t[]で持ってました。
6でstirngになってるのは、デバグ用にヘッダの内容書き足して表示してるからでした。

orz


16:デフォルトの名無しさん
10/09/22 22:09:53
そろそろ言ってる事がイミフになってきたので実際のFileMemberをコピペして貼ってくれ
長いようならcodepad使っても。

17:6
10/09/22 22:24:46
プロジェクトまとめてアップロードしてみました。

URLリンク(ux.getuploader.com)

いろいろ動作確認してみたらほかにも挙動不審なところが見つかりました。
swapはうまくいってないのは確実。ほかにもドラッグアンドドロップされたファイルに
対する処理もうまくいってないのかも。


18:デフォルトの名無しさん
10/09/22 22:50:15
どう考えても入れ替わってるなあ

int main()
{
std::vector<FileMemmber> FileList;
FileMemmber fm;

std::swprintf(fm.FilePath, L"111");
FileList.push_back(fm);
std::swprintf(fm.FilePath, L"222");
FileList.push_back(fm);

std::swap(FileList[0], FileList[1]);

for (int i = 0; i < FileList.size(); i++)
std::wprintf(L"%ls\n", FileList[i].FilePath);
}

19:6
10/09/22 22:59:26
スミマセン

ListBoxのソートがtrueになってました.....orz


20:デフォルトの名無しさん
10/09/22 23:01:19
いろいろ、お手数おかけしたうえ、
くだらない理由で、ほんとスミマセンでした。


21:デフォルトの名無しさん
10/09/22 23:01:57
しゅぎょーがたりん!

22:デフォルトの名無しさん
10/09/22 23:31:30
externなどのファイルをまたいだ宣言?などについて説明している初心者向けのサイトはありますか?
main.cppから#includeするファイルが.cppの時と.hの時との違いがわかりません・・・


23:デフォルトの名無しさん
10/09/22 23:48:46
分割の定石 でググルと一番最初に来るとこなどではだめですか?


24:デフォルトの名無しさん
10/09/23 00:00:56
>>23
まさにそのサイトの通りです
ありがとうございました

25:デフォルトの名無しさん
10/09/23 07:24:10
printfとwriteはどちらが早いですか。printfはリダイレクトしてます。

26:デフォルトの名無しさん
10/09/23 09:33:02
>>25
どうみてもwriteの方が文字数が少なくて早そうに見えますが、実はprintfもそこそこ早く入力できるかと思います。
リダイレクト? はて、早いかどうかと何か関係があるのでしょうか。

27:デフォルトの名無しさん
10/09/23 11:11:46
関数中でstaticで宣言された変数ってどう思いますか?
滅多に使われている事がない気がするんですが


28:デフォルトの名無しさん
10/09/23 11:23:10
グローバル変数の代わりに使ったりする

29:デフォルトの名無しさん
10/09/23 11:36:48
面倒の原因なので、あんまり使わないほうがよいとされる(もちろん使ったほうがすっきりする場合もあるが)

30:デフォルトの名無しさん
10/09/23 12:37:21
inlineにする判断基準がいまいちはっきりしない

31:デフォルトの名無しさん
10/09/23 13:05:08
メンバ関数の中で使ってクラスのメンバの数を減らせるのに使ってる

32:デフォルトの名無しさん
10/09/23 13:13:29
おれはインターフェース境界以外仮想関数も含めて全部インライン

33:デフォルトの名無しさん
10/09/23 16:38:49
main.cpp

#include <iostream>

class Test
{
public:
Test() {}
~Test() {}

void output(){ std::cout << "output"; }
};

int main()
{
Test t;
t.output();
return 0;
}

このコードはインライン化されているんですか?

34:デフォルトの名無しさん
10/09/23 16:51:26
されるかもしれないね
実際にインライン展開されるかどうかは結局のところコンパイラの気分次第だが

35:デフォルトの名無しさん
10/09/23 17:06:03
const char * MY_NAME( "softWareName" );
C++でこんな書き方をしている人がいたのですが、
C++をわかっていないC言語ユーザが書いたってことでOKですかね

普通に考えたらstringとかを使うと思うんですが

36:デフォルトの名無しさん
10/09/23 17:17:56
必ずしもそうとはいえない
C++だからってstring使わなきゃいけないわけではないし、
C++標準のクラスや関数がみんなstringを受け付けてくれるわけでもないし
const char * を引数に取る関数に渡すんだったら、わざわざstringにするだけ無駄なわけで

37:デフォルトの名無しさん
10/09/23 18:56:13
ちょっとした文字列でもわざわざstringとか嫌すぎ

38:デフォルトの名無しさん
10/09/23 21:12:29
C言語のとある参考書の問題
switch_(i)_{
____case_1:
______a_=_1;
____case_2:
______a_=_2;
______break;
____case_3:
______a_=_3;
______break;
____case_4:
____case_5:
______a_=_5;
}
上記のコードにたいして
・iが1ならaの値はどうなるか。
・iが4ならaの値はどうなるか。
との問題なのですが、
本に記載されている解答が
iが1のときaは2
iが4のときaは5
となっています。
後者は分かりますが、前者の解答がいまいち(いや、全く。。)理解できません。
iが1のときaは1、だと思うのですが・・
WEB正誤表には記載がありません。
上記の解答が正しいのかどうか
ご教授下さい。

39:デフォルトの名無しさん
10/09/23 21:26:35
なぜ後者がわかって前者がわからんのだ
a = 1の後にbreakがないからa = 2されるだろ

40:デフォルトの名無しさん
10/09/23 22:19:49
>>39
実際組んでみることをせず、頭の中だけで考えてました。
breakに出会わない限り、以下条件を無視して実行していくのですか。
おかげで理解が進みました。
サンクスです。

41:デフォルトの名無しさん
10/09/23 22:29:33
vectorのresizeやreserveって中の配列の再確保が行われて要素へのアドレスって無効になりますよね?

42:デフォルトの名無しさん
10/09/23 23:52:46
>>41
そうだね

43:デフォルトの名無しさん
10/09/25 13:51:48
すみません。
「特定時刻 差分 現在時刻 時間カウントが1ループする時刻 の4変数で時差の経過を判定する処理」
を複数ソースファイルで共有したいのですが、
#defineで書く関数ではこういう処理を作る事はできるのでしょうか?
ヘッダーファイルに書ければ共有が楽そうなのですが・・
何か良い関数の共有方法があれば教えて頂けますと幸いです。

44:デフォルトの名無しさん
10/09/25 14:09:52
>>43
#define なら普通にヘッダに書けばいい
それでそれぞれのソースに展開されるだろ

45:デフォルトの名無しさん
10/09/25 19:38:02
>>43
もちろん、できる。
けど、C++だったら、inline関数の方をおすすめするけどね。

#defineでやるなら、
do { } while(0)
とかを使ってうまくやりなね。
結構とんでもないエラーに悩まされたりするからなw

46:デフォルトの名無しさん
10/09/25 20:04:34
>>45
どういう書き方閃けたら人生楽しいんだろうなー

47:デフォルトの名無しさん
10/09/25 20:05:30
ど→そ

48:45
10/09/25 20:38:47
>>46
別に俺が考えたわけじゃないけどね(当たり前だけど)

Linuxカーネルでよく使われている手法


49:デフォルトの名無しさん
10/09/25 20:45:58
ウイルスバスターを入れたときに、m$ vc++ runtimeを入れろって怒られた
なんで、C++なのにランタイムを入れないとダメなの?
MFCとかかな~

50:デフォルトの名無しさん
10/09/25 20:51:03
いや、Cにもランタイムはあるよ。
msvcrt.dllとかってのがそれ。
C++にも当然あるw

51:デフォルトの名無しさん
10/09/25 20:57:17
標準ライブラリをstatic linkすると空っぽのmainの場合でも
8kb -> 700kbぐらいになったな
でもある程度大きいやつなら元が4Mぐらいになるからこれぐらいの増加は別になんでもないのかも

52:49
10/09/25 21:02:58
>>50
vb6のランタイムの正体はランタイムだけど
vc++のランタイムの正体は、mfcとかのライブラリってことか

53:デフォルトの名無しさん
10/09/25 21:05:25
>>52
だけじゃないけどね。
STLの部分とか標準ライブラリの部分も含まれているはず。

54:デフォルトの名無しさん
10/09/25 21:07:16
ランタイムってランタイムライブラリの略じゃないの

55:49
10/09/25 21:15:52
>>53
stlとかも入っているのか
thx

>>54
jreとかだとライブラリというかフレームワクークじゃないかな
それに、ランタイムって実行環境って言う時もあるから
ランタイム = 仮想マシン/インタプリタってイメージがあるな

56:デフォルトの名無しさん
10/09/25 21:20:15
dllがexportしてる名前一覧できるやつあるんじゃん
あれで見てみればいい

57:デフォルトの名無しさん
10/09/25 21:22:09
dumpbinってまだあるのかね?

あれがあれば、

dumpbin /depends xxx.exe
とかで見れたはず。

58:43
10/09/25 23:10:08
>>44-48
ご助言ありがとうございます。 defineマクロの置き換えの危険性を、調べて改めて実感し
inline関数について調べてみてそちらで解決しました。感謝。

59:デフォルトの名無しさん
10/09/25 23:35:14
>>58
お役に立てたようで何よりw

60:デフォルトの名無しさん
10/09/26 10:25:44


61:デフォルトの名無しさん
10/09/26 11:15:09
って

62:デフォルトの名無しさん
10/09/26 18:32:08
コーディングルールでガチガチに縛るより、普段は適当にして
インターフェース境界だけルール守るってしたほうが生産性ググッと上がるよね

63:デフォルトの名無しさん
10/09/26 19:32:45
ヘッダファイルに#include <string>って書いてあるのに、
cppにも#include<string>って書きますか

また、フレームワークを使っていると暗黙的にヘッダが#includeされますが
それについても明示的に#includeしているか教えてください

64:デフォルトの名無しさん
10/09/26 20:19:58
>>63
意味ありません
インクルードガードで2回目以降はスキップされます
フレームワークについては中を良く見て見ないとわからない

65:63
10/09/26 20:38:35
>>64
納得しました
ありがとうございます

66:デフォルトの名無しさん
10/09/27 16:37:55
初歩的な質問すみません。
int a = 1024;  を
byte b[50]; の b[7] に入れたいのですが、
memcpy(&b[7], &a, 4); とやって値を移そうとする事は正しいのでしょうか?

また、その結果を確認しようとして
int c = (int)&b[7];
としてみたら全く違う値になっていました・・。 どっちで値が壊れてしまっているのでしょうか?
どう受け渡せば上手く行くのでしょうか・・orz

67:デフォルトの名無しさん
10/09/27 16:40:45
int c = (int)&b[7];

68:66
10/09/27 17:42:28
>>67
よく中身を見たら、memcpyは7に最下1バイト 8 9 10と逆順に入るんですね。
それを直で移すからバイトを逆順に辿るから変な値になる・・と。
データが逆バイト順にならない方法はないか調べてみようかと思います。ありがとうございました。

69:デフォルトの名無しさん
10/09/27 18:21:09
>>68
リトルエンディアンとか知らないのかこの馬鹿は

70:66
10/09/27 18:26:28
馬鹿って言う人も馬鹿なんだい(´・ω・`)

71:デフォルトの名無しさん
10/09/27 18:44:08
そういうことにはunion使うとすっきり書けるかもしれない
でも余計混乱するだけかもしれない

72:デフォルトの名無しさん
10/09/27 20:55:06
#include <stdio.h>

double root(double a)
{
double p1, p2, p3;
p1 = a;
p2 = (p1 + a / p1) / 2;
(p1 - p2 > 0) ? p3 = p1 - p2 : p3 = p2 - p1;
if (p2 < 0) p2 = -p2;
if (p3 <= 1.0 * 10e-10) return p2;
return root(p2);
}

int main(void)
{
double x;

scanf("%lf", &x);
printf("%f", root(x));

return 0;
}

1>sample.c(8): error C2106: '=' : 左のオペランドが、左辺値になっていません。

コレはどういう意味でしょうか

73:デフォルトの名無しさん
10/09/27 20:57:38
ようするに左のオペランドが、左辺値になってないってことだよ

74:デフォルトの名無しさん
10/09/27 20:59:10
なるほどわかりません
もう少しぃ分かりやすく

75:デフォルトの名無しさん
10/09/27 21:01:40
代入してはいけないものに代入してるからうんこ

76:デフォルトの名無しさん
10/09/27 21:16:38
>>72
(p1 - p2 > 0) ? p3 = p1 - p2 : p3
=
p2 - p1;
こう書けばわかるだろうか?
あなたは p2 - p1 を (p1 - p2 > 0) ? p3 = p1 - p2 : p3 に代入しようとしているんだ
演算子の優先順位を調べてみるといい

77:デフォルトの名無しさん
10/09/27 21:38:09


78:デフォルトの名無しさん
10/09/28 00:44:04
つーか、代入だけして値を利用しないのなら条件演算子なんか使わずに素直にifでいいだろ。

79:デフォルトの名無しさん
10/09/28 00:47:28
double p3 = p1 > p2 ? p1 - p2 : p2 - p1;

って、書いてて思ったんだけど、p1 = aの意味が判らん。

80:デフォルトの名無しさん
10/09/30 21:28:58
struct Ref
{
int & r;
Ref(int & r_) : r(r_) {}
};

void F(Ref const &ref)
{
ref.r += ref.r;
}

これコンパイルは通るんですけど合法なんですか?
constなRefのメンバだからrもconstなんじゃないの?って思うんですけど…

81:デフォルトの名無しさん
10/09/30 23:46:04
指す先まではconstにならないので
constになるのはRefそのものだけ

82:デフォルトの名無しさん
10/10/01 17:11:57
int foo[10]

int bar[10]
の中身が全て同一であることを確かめるのってどうやればいい?
for文で回す・直に全部書く以外で

83:デフォルトの名無しさん
10/10/01 17:13:23
>>82
memcmpすれば?

84:デフォルトの名無しさん
10/10/01 17:24:36
std::equal(&foo[0],&foo[10],&bar[0])

85:デフォルトの名無しさん
10/10/01 17:26:14
素直にforで回すのが正道
なんで変なことしたがるかな

86:デフォルトの名無しさん
10/10/01 17:28:10
C++だったらequalが正堂じゃないのかw

87:デフォルトの名無しさん
10/10/01 17:30:42
equalなんてあったのか thx

88:デフォルトの名無しさん
10/10/01 18:06:42
struct Vec
{
float x, y, z;
};

Vec v1, v2;

v1 = v2; // A

memcpy(&v1, &v2, sizeof(Vec)); // B


ぶっちゃけどっちが速いんですか?

89:デフォルトの名無しさん
10/10/01 18:11:44
同じだろ

90:デフォルトの名無しさん
10/10/01 18:14:58
>>88
ソース URLリンク(codepad.org)
コンパイルした結果 URLリンク(codepad.org)
同じじゃね?

91:デフォルトの名無しさん
10/10/01 19:49:21
>>88
構造体の代入にmemcpy()使うなよ。

何日かまえに、どっかのスレで「memcpy()は構造体の代入の関数版」とか
教えてるやつ見たけど、構造体の代入にmemcpy()使うやつはアホだろ。

92:デフォルトの名無しさん
10/10/01 21:36:17
PODなら別に

93:デフォルトの名無しさん
10/10/01 21:55:53
>>91
Cならおんなじでしょ

94:デフォルトの名無しさん
10/10/01 22:04:01
パディングの問題があるから同じじゃない

95:デフォルトの名無しさん
10/10/01 22:05:20
パディングコピーしても同じだろ
ダメなのはメモリブロックの比較だ

96:デフォルトの名無しさん
10/10/01 22:05:45
いや、阿呆だ。PODなら尚のこと、コンパイラに任せた方がいい。

97:デフォルトの名無しさん
10/10/01 22:15:03
同じでも、構造体の代入をmemcpy()でやってるやつはダメだろ。

98:デフォルトの名無しさん
10/10/01 22:15:48
なんでだよw 宗教的理由でもあるのか?

99:デフォルトの名無しさん
10/10/01 22:17:03
マヌケだから。

100:デフォルトの名無しさん
10/10/01 22:28:21
>>98
intの変数とかmemcpy()で代入してたらおかしいと思うだろ?

101:デフォルトの名無しさん
10/10/01 23:28:19
昔は構造体代入とか構造体引数がダメなコンパイラがあったのは事実だが・・・。
いまさらそんな心配するかね。

102:デフォルトの名無しさん
10/10/01 23:36:57
ウィットな一行にマトメろよ

103:デフォルトの名無しさん
10/10/01 23:43:17
、、ヒック、ウィット、、、オェー

104:デフォルトの名無しさん
10/10/01 23:49:20
IDが出ないせいで誰が誰だか

105:デフォルトの名無しさん
10/10/02 00:42:45
C++でプライベートな面罵関数のポインタを外部から取得する方法
ないでつか?

106:デフォルトの名無しさん
10/10/02 00:46:44
#define private public

107:デフォルトの名無しさん
10/10/02 01:12:55
friend

108:デフォルトの名無しさん
10/10/02 08:35:38
静的テーブルに関数ポインタを並べたいのでフレンド関数で取得って
出来ない気がするんですが旨い方法ありまつか?

const functbl[]={
{(void*)&Class1::func1,0,0},
{(void*)&Class2::func2,0,0},
、、、
};
g++ でこんなテーブルに並べたいのですが・・

109:デフォルトの名無しさん
10/10/02 08:47:42
>>108
それ、publicならうまくいくのか?
メンバー関数へのポインタをvoid*にキャストしても動かないだろ。

110:デフォルトの名無しさん
10/10/02 09:01:47
Class1::func1, Class2::func2 がstaticなら、
class Class1 {
friend class Z;
private:
static void func1();
};

class Class2 {
friend class Z;
private:
static void func2();
};

struct Z {
void (*pf)();
int a;
int b;

static const Z functbl[];
};

const Z Z::functbl[] = {
{ Class1::func1, 0, 0 },
{ Class2::func2, 0, 0 },
};


111:デフォルトの名無しさん
10/10/02 15:17:27
>>109 アドレスが欲しいだけなのです
>>110 うおおおおおすげぇぇぇぇ
ありがとうございますorz




112:デフォルトの名無しさん
10/10/02 15:17:56
class Class1 {
public:
void func1() { }
};
class Class2 {
public:
void func2() { }
};
class X {};

template<class T>
class Y : public X {
public:
T f;
Y(const T & p) {f = p;} };

int main()
{
Y<void (Class1::*)()> a(&Class1::func1);
Y<void (Class2::*)()> b(&Class2::func2);
X *array[2] = {&a, &b};
}

ってしてみるとか
冗談だけど
っていうかやるならBoost.Any使えばいいんだけど

113:デフォルトの名無しさん
10/10/02 15:18:39
なんだstaticだったのか

114:デフォルトの名無しさん
10/10/03 22:05:23
他のプロセスを起動して、終了するまで待つにはどうすればいいですか?
CreateProcessだとWindows上でしか動かないと思うので
マルチプラットフォームで動作するCreateProcessみたいなのがあればいいんですが

115:デフォルトの名無しさん
10/10/03 22:23:45
>>114
あの…その…えっと…

116:デフォルトの名無しさん
10/10/03 22:25:59
>>114

#if defined _WIN32
CreateProcess()
#elif defined __GNUC__
execvp()
#else

#endif


117:デフォルトの名無しさん
10/10/03 22:28:00
system
URLリンク(www11.plala.or.jp)

118:デフォルトの名無しさん
10/10/03 22:29:16
ぴゅっ_/ ̄\
. ==|  ^o^  | <これは しょうゆです
  .   ̄|\_._/|
      |    |
   .  |    |
     \_/

119:114
10/10/03 22:50:13
Windows以外ではsystemでやることにします
ありがとうございました

120:デフォルトの名無しさん
10/10/04 06:13:52
質問です
RAIIはどう発音するのでしょうか?

121:デフォルトの名無しさん
10/10/04 08:18:34
アルエツー

122:デフォルトの名無しさん
10/10/04 12:51:48
int n=100;
double *array;
array = (double *)malloc(sizeof(double)*n);
といった感じで作った配列の要素数を調べることはできないでしょうか?

通常の配列における
double array[10];
yousosuu = sizeof(array) / sizeof(array[0]);
といった操作をしたいのです。

環境はVC Express 2010を使っています。


123:デフォルトの名無しさん
10/10/04 13:07:09
できません
どこか別の変数に覚えておいてください

124:デフォルトの名無しさん
10/10/04 14:20:17
環境依存でいいのか?
HeapAllocで確保するようにして, HeapSize使うとか?
決しておすすめはしないが


125:デフォルトの名無しさん
10/10/04 14:41:07
vectorつかえばすべて解決

126:デフォルトの名無しさん
10/10/04 15:21:54
文字列みたいに終端の決まりごとさえあれば

127:デフォルトの名無しさん
10/10/04 15:44:53
std::array

128:108
10/10/04 23:52:52
>>110
他クラスファイルのクラスのプライベートメンバ関数をテーブルに並べてアドレスを獲るために↓のように
ヘッダとソースに分割したらエラーになってしまいました・・・どうすべorz
//----------------
<class1.cpp>

#include "mytbl.h"

class Class1 {
friend class Z;
private:
static void func1();
};
//-----------------
<mytbl.h>
struct Z {
void (*pf)();
int a;
int b;
static const Z functbl[];
};
//-------------------
<mytbl.cpp>
#include "mytbl.h"
const Z Z::functbl[] = { ←Z の名前がなんちゃら、、、のエラーorz
{ Class1::func1, 0, 0 },
{ Class2::func2, 0, 0 },
};

129:デフォルトの名無しさん
10/10/05 00:02:31
そもそもprivate関数を外部に渡そうという考えが邪道

list<void(*)(void)> FuncPtrRegister;

class Hoge
{
private:
static void Func(void) {}
public:
static void Register(void) { FuncPtrRegister.push_back(Func); }
};

130:デフォルトの名無しさん
10/10/05 19:15:26
newで生成したインスタンスがどこからも参照されなくなったときに、
他の多くの言語では暗黙にガベージコレクトの対象となるが、
C++では明示的にdeleteしなくてはいけないところを、
自動的にdeleteしてくれるようにしたものがスマートポインタである。

という解釈で正しいでしょうか……?

131:デフォルトの名無しさん
10/10/05 19:17:21
タスクはリスト形式じゃなくてコンポジットの方がいくらか良いよ

132:デフォルトの名無しさん
10/10/05 19:48:13
>>130
正しいよ。

ただし、わかってると思うけど
「スマートポインタ」って言っても、実装は1種類じゃないことに注意してね。

133:デフォルトの名無しさん
10/10/05 20:17:06
スコープに束縛されてるオブジェクトにポインタの管理を移譲しただけだよ

134:130
10/10/05 22:24:55
お返事ありがとうございます。
確認していただけて安心しました。

135:デフォルトの名無しさん
10/10/05 23:24:53
配列をメンバに持つとかそういうレベルじゃなくて
普通に配列として宣言して使う奇特な(半ば狂った)配列クラスとかあるんれすか?

136:デフォルトの名無しさん
10/10/05 23:34:28
何だって?

137:デフォルトの名無しさん
10/10/05 23:56:03
継承するクラスについて、その継承元が例えデストラクタ
処理が特に必要のない単純なデータクラスであっても
やはり仮想デストラクタを定義しておく必要はあるのでしょうか
あるとしたらその理由を教えていただければ

138:デフォルトの名無しさん
10/10/06 00:02:34
定義しておかないと継承先のデストラクタが呼ばれなくて困る

139:デフォルトの名無しさん
10/10/06 00:11:57
基底クラスの参照かポインタから呼ぶクラスじゃなければ別に仮想にしなくていいよ
無駄なオーバーヘッドだからね

140:デフォルトの名無しさん
10/10/06 00:19:18
>>137
class A{
} ;

class B : public A{
~B() ;
} ;

A *p = new B() ;
delete(p) ; // ←だとB::~Bは呼ばれない

class A{
virtual ~A()
} ;
としておけば親クラスのポインタから削除しても継承先のデストラクタが呼ばれる

141:デフォルトの名無しさん
10/10/06 00:36:05
どうも解答ありがとうございます

>>138
確かにそうなんですがC関数用の構造体を拡張する場合など少し疑問に思いまして
つまりそんな場合はそもそもデストラクタが必要となるような機能をつけるなということですね

>>139
オーバーヘッドも結構気になりますね
結構高速なループ中で使う予定なので

>>139-140
つまり継承し、かつデストラクタなしのクラスは
とりあえず通常の構造体的な使用にとどめておくべきということでいいでしょうか
なかなか全容が把握できずすみません

142:デフォルトの名無しさん
10/10/06 01:04:26
派生クラスの静的型情報を失うようなコードを書くって設計時からすでに解ってる時にvirtual dtorを書く
virtualを付けないのが基本でvirtualを付けるのはそういう特殊なケースだけということを忘れちゃいけない

143:デフォルトの名無しさん
10/10/06 01:08:51
>>141
データクラスとか構造的使い方とか関係ない
要は継承先のクラスの型をそのまま使うだけならなんの問題ない

class A{
public:
virtual void func()= 0 ;
} ;
class B : public A{
public:
~B(){}
void func(){}
} ;
class C : public A{
public:
~C(){}
void func(){}
} ;

B* b = new B() ;
C* c = new C() ;
b->func() ;
c->func() ;
delete b;
delete c ;// ↑子クラスをそのまま扱うだけなら問題ない

//↓例えば型の違う子クラスを親クラスのポインタ経由に一括に処理したいときなどに問題がおきる
A* a[2] = { new B(), new C() } ;
for ( int i = 0 ; i < 2 ; i++ ){
a[i]->func() ;
delete a[i] ;// ←継承先のデストラクタが呼ばれない
}

144:デフォルトの名無しさん
10/10/06 01:21:10
仮想関数とか継承のメリットを実感してないとその辺の話は解かりにくいんじゃないかなぁ?
ただなんとなく使ってる人だと「え?そんなことする必要あるの?」って感じだろうし

145:デフォルトの名無しさん
10/10/06 01:29:56
解決案:仮想デストラクタを放り投げてshared_ptrを使う

146:デフォルトの名無しさん
10/10/06 03:27:12
継承を使わない。使っても仮想化しない。

147:デフォルトの名無しさん
10/10/06 03:50:04
>継承を使わない。
コレは良いとして

>使っても仮想化しない。
これは違うだろ
仮想化しないことがマズいんだから

148:デフォルトの名無しさん
10/10/06 03:54:02
>>146
よく解かってないないなら黙ってればいいのに

149:デフォルトの名無しさん
10/10/06 07:41:14
>>145
それはそれでshared_ptrがなんでそうなるか理解して無いと罠にはまりそうだが

150:デフォルトの名無しさん
10/10/06 09:02:03
仮想化しないのは良いだろ
仮想化するひつようがないところではするべきではない

151:デフォルトの名無しさん
10/10/06 09:07:12
templateってプリプロセスな言語機能と考えていいんですか?

template<typename T>
void Func(T arg)
{
}
だと
Func<int>(10);
というのが見つかったら、
コンパイラが、
void Func(int arg)
{
}
という関数を仮想的に自動生成してコンパイルしている、という解釈でしょうか?

152:デフォルトの名無しさん
10/10/06 10:49:43
あまり細かいこと言わないならそれでいいぜ

153:デフォルトの名無しさん
10/10/06 18:54:51
かなり初歩的なことなのですが質問させてください
いままでデフォルトコンストラクタは通常のコンストラクタと同じような クラス名(){} みたいな関数だと思っていました
しかし次のA、Bの処理を行ったところ、所要時間に大きな差が見られました

class X1{ /*何も無し*/ }; for( UINT i = 0; i < 100000000; ++i ) X1(); // 処理A
class X2{ public: X2(){} }; for( UINT i = 0; i < 100000000; ++i ) X2(); // 処理B

もしかしてデフォルトコンストラクタが上記のような関数というのは大きな勘違いですか?

154:デフォルトの名無しさん
10/10/06 19:26:59
どっちが速かったの? 具体的な数値で

155:デフォルトの名無しさん
10/10/06 19:58:07
>>154
処理なしforループとABforループ10回の平均をとったら次のようになりました
for単体時間≒330[ms]前後
A処理時間≒330[ms]前後   実質処理時間≒0[ms]
B処理時間≒3450±150[ms]  実質処理時間≒3000[ms]強
一回のBループ処理では約0.03[um]となりますが積み重なると大きな差になりました

156:デフォルトの名無しさん
10/10/06 20:01:09
hppとcppで分けた?

157:デフォルトの名無しさん
10/10/06 20:25:48
C++の仕様は処理速度まで定めてないからな・・・ 特定の記述方法が早い遅いといったことはあるかもしれない
でもそのケースはただ単に最適化してないだけじゃないか

158:デフォルトの名無しさん
10/10/06 20:30:10
単純な処理なのでcpp一つでした
分けてやってみましたが傾向は特に変わらないようです

そして最適化は無効にしてあり(等価な最適化負荷方法がわからない)
そのまま最適化有効時の話にはできないんですが
有効だったとしても少なくともAよりBが速くなることはまずありえないですよね

159:デフォルトの名無しさん
10/10/06 21:09:39
>>157
・・・もしかして最適化すると無意味なコンストラクタは完璧に削除される、
というか一部を抜き出して処理時間を論じることはもはや無意味になるんでしょうか

自分は単純に最適化で実行速度などの全体的なスケールが縮小される
→一部要素であっても最低限比較時の傾向(比較的早いとか遅いとか)は保持されると思いこんでいました

しかしそれだと一部処理の最適化時の負荷評価はいったいどうしよう

160:デフォルトの名無しさん
10/10/06 21:11:58
X1はPODだけどX2はPODじゃないのが最適化に影響してるんじゃないの

161:デフォルトの名無しさん
10/10/06 21:58:32
>>152
よかったです
ありがとうございます

162:デフォルトの名無しさん
10/10/06 22:01:26
最適化を切ってるってことはたぶんVCのデバッグビルドかなんかだと思うけど、
それなら実行ファイルにデバッグ用の「現在の行位置」を埋め込まなくてはいけなくなるX2の方が遅くなりそうな気がする。

つーか最適化切った状態で比較してもなぁ……
あとさっきから言ってる一時処理の最適化時の負荷評価という意味が全く分からん
一時処理ってなんだ

163:デフォルトの名無しさん
10/10/06 23:09:49
もしかしたら、最適化がどういうものか判っていないんじゃないだろうか。

164:デフォルトの名無しさん
10/10/07 00:00:20
結局コンストラクタを書く場合とデフォルトコンストラクタに任せる場合の
オーバーヘッドの違いはどうなるんですか?

165:デフォルトの名無しさん
10/10/07 00:11:25
デフォルトコンストラクタはそもそも最適化した形で実装されている可能性がある。
自分でコンストラクタを書く以上は、それが空であったとしても、コールをするだろうし、
それを取り除けるのは最適化処理、
ということではないかな?
(ちなみにコールってのは結構負荷あるぞ)

試しに最適化を入れて測ってみなよ。
ほぼ同じになるかもよ?

166:デフォルトの名無しさん
10/10/07 01:58:48
というかよく考えると最適化とかあまり関係なくないですか?
>>153のようにしたら(最適化無効であろうと)デフォルトコンストラクタがあるはずの処理Aが
実際には比較にならないほど速く終わったその理由を伺っているわけですから

>>160
試しに両方にデストラクタや代入演算子を追加しても違いは埋まりませんでした
興味深いことに両方に仮想関数を追加したら処理時間は同じになりました
他クラスで無駄にvirtualしていたのを除去したら少なくとも同じテストでは大幅に速くなりました、ありがとうございます

>>165
残念ながら最適化してまともに試験できる方法を知らないです(無意味なfor処理はすっ飛ばされるので)
しかし自分としても仰っているように(ただし最適化に関わらず)デフォルトコンストラクタ(やその負荷)は
上述したような例外を除いて基本的にはそもそも影も形も存在しなかったんではないかと考えています

167:デフォルトの名無しさん
10/10/07 02:18:56
>>166
最適化がかかると、処理に関係しない部分は全く存在しない処理としてすっ飛ばされるので関係有る

168:デフォルトの名無しさん
10/10/07 04:51:56
>>167
後付で質問を修正することになり大変申し訳ないのですが
「少なくとも最適化無効時に、仮想関数を持たないクラスが、
コンストラクタの明示によってインスタンス化所要時間が大幅に変わる、
その明示的な理由はなんでしょうか?」


でも探してたらそれらしいの見つけた
URLリンク(www.informit.com)
どうやらデフォルトコンストラクタは確かに存在するけど
そもそもそれが生成されないようなクラスもあるのか

169:デフォルトの名無しさん
10/10/07 07:17:48
>>168
最適化を無効にするってことが如何に意味がないか判ってないな。
そもそも何のために所要時間を知りたいの?
わざわざ遅くしたいだけなら無意味にウェイトすればいいだけだし、
速くしたいのなら最適化するのが当然だし。

170:デフォルトの名無しさん
10/10/07 08:26:10
>>162読め

171:デフォルトの名無しさん
10/10/07 08:31:43
ていうか、いくら最適化OFFだからといっても、
コンパイラが暗黙のコンストラクタなんて価値のないものを呼び出す義理はねぇ

172:デフォルトの名無しさん
10/10/07 16:20:06
forループがなくなる事を恐れて最適化を切ってるのなら、
ループカウンタにvolatileつけるとなくならないかもしれない。
ためしてないからうまくいくかわからないけど

173:デフォルトの名無しさん
10/10/07 16:30:42
論理的に全く同じ内容でも
テストする順番を入れ替えたりするだけでも全然結果が違うことはあるよ
多分これは最適化の問題じゃないと思う
自分はよくわからない分野だけどキャッシュメモリとかハードのほうでなんか色々あるんだと思う

174:デフォルトの名無しさん
10/10/07 16:30:55
visual C++ 2010 Expを使ってシリアルポートの通信プログラムを
作っていて、BCD構造体という使いたいのですが、
BCDという識別子が認識されません。
これを使うにはどうしたらいいのでしょうか?
作成中のプログラムはwin32コンソールアプリケーションで
すべてC言語で書いています。
<stdio.h>、<stdlib.h>、<windows.h>をインクルードしています。
windowsでのプログラミングは初めてなんで見当違いな聞き方かもしれない
ですけどよろしくお願いします。

175:デフォルトの名無しさん
10/10/07 16:35:25
昔なんかの本で、コンパイラが自動生成する関数はそれが必要な時だけ作られる。
って感じの事が書かれてた気がする。
それが真実なら、先のクラスAはメンバがないし継承もしてないのでデフォルトコンストラクタ不要と判断され、自動生成されなかったのではないか
なければ当然コールされる事もないので、実行時に行われるのはスタックポインタの変更くらいだろうので高速
対してクラスBにはデフォルトコンストラクタがあり、最適化offの場合インライン展開もされずコールされる
関数コールは結構遅いので、それが差になったのではないだろうか
最適化onの場合は今回の場合恐らくインライン展開され、もともと中身がないので何も行われないので、クラスAとほとんど同じ速さになるのではないだろうか

176:デフォルトの名無しさん
10/10/07 16:39:48
昨今のIDEには出力されたのを逆アセンブルして表示する機能がついてると思うから、それでどんなふうに処理されてるかみてみたら?

177:デフォルトの名無しさん
10/10/07 16:47:43
>>174
マルチすんな糞が

178:デフォルトの名無しさん
10/10/07 16:48:43
ごめんなさい糞が

179:デフォルトの名無しさん
10/10/07 16:50:05
ゆるす糞が

180:デフォルトの名無しさん
10/10/08 08:13:26
>>174
BCDという構造体が必要なら、自分で定義してください。
Windouws APIにもC++の規約にも、.NET APIにもBCDなんて構造体はないですよ。

二進化十進変数が使いたいと言う事なら、C++の規約には無いので適当なライブラリを探してください。
C++ CLR使って良いなら、System.Decimalが二進化十進変数ですよ。

二進化十進変数の実装は言語依存なので、普通は通信にそのまま使うことはないですよ。


181:デフォルトの名無しさん
10/10/08 12:06:23
>>174
マルチしなけりゃ教えてやったんだけどな。残念だったな。

182:デフォルトの名無しさん
10/10/08 14:55:43
Cで、配列を引数にするすることがうまくできません。

このようなコードを書きました。
URLリンク(codepad.org)
引数を double array[][cols] のようにする方法もありますが、
N をグローバル変数もしくは define しなくてはならず
これが自分としては嫌だったので、double** array のようにしました。

これはうまく行かないのでしょうか?
1次元配列であればうまく行きましたが・・・。

183:デフォルトの名無しさん
10/10/08 15:28:48
>>182

void func( double *aray, const int rows, const int cols )
{
int r=0;
for( r=0; r<rows; ++r ){
int c=0;
for( c=0; c<cols; ++c ){
aray[r*cols+c] = (r+1)*10 + (c+1);
}
}
}

func( aray[0], rows, cols );

184:デフォルトの名無しさん
10/10/08 17:57:51
array[0]で渡さないといけないところが気持ち悪いよね
なんで次元問わずarrayで先頭のアドレスを返す仕様にしなかったんだか

185:デフォルトの名無しさん
10/10/08 18:10:05
array[0]が気持ち悪いなら
*arrayでもいいけど

186:デフォルトの名無しさん
10/10/08 18:28:47
これが最強

void func(int *p, size_t m, size_t n);

template <size_t M, size_t N> inline void func(int (&array)[M][N])
{
func(static_cast<T*>(array), M, N);
}

187:デフォルトの名無しさん
10/10/08 18:39:19
Cって書いてあるがな

188:デフォルトの名無しさん
10/10/08 18:40:38
じゃあCスレいけよカス

189:デフォルトの名無しさん
10/10/08 18:49:36
>>188
>C/C++の質問はここで
>C/C++の質問はここで
>C/C++の質問はここで

190:デフォルトの名無しさん
10/10/08 18:53:22
ぷぷぷ

191:デフォルトの名無しさん
10/10/08 18:57:21
>>186
あのーー、キャストって分らないんですが
>func(static_cast<T*>(array), M, N);
の場合はstatic_castが正しいのですか?reinterpretじゃ駄目なんですか?
で、その理由はなんなんですか?

192:デフォルトの名無しさん
10/10/08 20:17:17
static_castは型に静的関連性がある時に使う
reinterpret_castは値だけそのままで無理やりキャストしたい時に使うキャスト
reinterpret_castは取り扱い資格を持ったよく解ってる人がそれが正解と確信しているときにだけ使っていい
そうでない場合は最悪の場合死人が出るので法律で使用が禁じられている
だからここはstatic_castが正解

193:デフォルトの名無しさん
10/10/08 20:51:02
>>186
ところでこれって配列のサイズが自動で取得できる以外になんか利点ある?
まあそれが結構デカイんだけど

194:デフォルトの名無しさん
10/10/08 21:10:41
>>193
サイズがコンパイル時定数だからループとかを最適化しやすい

195:デフォルトの名無しさん
10/10/08 22:15:22
func(static_cast<T*>(array), M, N);
<T*>はtemplate引数にないんですけど、こうしないと駄目なの?
こうしないと
void func(int *p, size_t m, size_t n); を呼んでくれないの?

196:デフォルトの名無しさん
10/10/08 22:16:23
はいそうですよ

197:デフォルトの名無しさん
10/10/09 02:14:50
static_castは設計の勝利。絶対正義
reinterpret_castは怠慢。
dynamic_castは自殺願望あるいは設計の敗北。

198:デフォルトの名無しさん
10/10/09 02:18:08
Cスタイルでいいよ

199:デフォルトの名無しさん
10/10/09 02:19:12
Cスタイルでいいよ

200:デフォルトの名無しさん
10/10/09 02:20:19
Cスタイルでいいよ

201:デフォルトの名無しさん
10/10/09 13:11:55
externって何するの?

202:デフォルトの名無しさん
10/10/09 13:18:21
>>201
その識別子の定義が、そのコンパイル単位の外部にある、ということを宣言する

203:デフォルトの名無しさん
10/10/09 13:28:22
ならなんで関数にexternなしで他のソースに書いていいんですか?

204:デフォルトの名無しさん
10/10/09 13:30:13
何も書かないとexternって書いたことにしてくれるからだよ

205:デフォルトの名無しさん
10/10/09 13:33:23
んーと、まずCに限定した話をするとだな、
大抵のCコンパイラについては、externで宣言する必要はない。
普通に関数宣言があればいい。
Cでは識別子は完全に一意になるので、あとはリンカがつき合わせてくれる。

で、C++では、
extern "C" int hoge( void );
みたいな書き方が使われる。
これは、C++で書かれているhogeという関数を、Cのプログラムから呼び出したい
ときに必要になる。

206:デフォルトの名無しさん
10/10/09 13:36:23
externって変数に使うもんだろ。

207:デフォルトの名無しさん
10/10/09 13:37:04
統一感ないよね
staticを使ったのは間違いだった
これじゃ意味がハッキリしないし

208:デフォルトの名無しさん
10/10/09 13:38:46
>>205
>>206
>>204
なんで言ってることがバラバラなんだよw

209:デフォルトの名無しさん
10/10/09 13:39:36
別に全部矛盾してないよ

210:205
10/10/09 13:39:59
>>206
あ、まあ、そうね。
Cでも、翻訳単位をまたいで、グローバル変数を使うときには必要になるな。

211:デフォルトの名無しさん
10/10/09 13:45:12
ただのシンプルなグローバル変数なら
extern Type gFoo;
より
struct Foo
{
static Type variable;
};
Type Foo::variable;
のほうがクールだよね

212:デフォルトの名無しさん
10/10/09 13:46:37
名前空間でいいんじゃね?

213:デフォルトの名無しさん
10/10/09 13:52:36
>>211
URLリンク(www.pro.or.jp)

↑こういうテクニックとかあるけど、そっちのほうがいいな。

214:デフォルトの名無しさん
10/10/09 13:53:20
C++でPerlのハッシュと同じようなアクセスの仕方をしたいのですが
やり方おしえてください

215:デフォルトの名無しさん
10/10/09 13:54:41
template <class> struct Foo_
{
static int value;
};
template <class T> int Foo_<T>::value;
struct Foo : Foo_<void>
{
};

int main(void)
{
Foo::value = 100; cout << Foo::value << endl; return 0;
}

ヘッダだけで書けるから便利

216:デフォルトの名無しさん
10/10/09 14:02:11
>>214
std::mapを使え

217:デフォルトの名無しさん
10/10/09 18:46:59
ハッシュと言うからにはunordered_mapも知っておいてください。

218:デフォルトの名無しさん
10/10/09 19:21:48
此処で聞いてもいいことかどうか分からないのですが質問させていただきます。
RadStudio7.0にてStlportのコンパイルは出来るのでしょうか?
アプリケーションをダウンロードしたのですが「Stlport5.2.dllがありません」
とのエラーが出てdllを検索してみたのですが出てくる情報がどれもコンパイルする方法でした。
なのでソースをダウンロードしてみたのですがConfigureをみるとmsvcかIntel C++コンパイラでしか出来ないようでした。
HDDの容量の関係もあり、もともとインストールされているRadStudioでやりたいのですが・・・

長文になってしまいましたがどなたかご教示いただけると幸いです。

219:デフォルトの名無しさん
10/10/09 19:25:03
stl::mapがヒープ実装な処理系って存在するの?

220:デフォルトの名無しさん
10/10/09 20:06:27
なぜboostってマルチプラットフォームでも、同じように動くの?

221:デフォルトの名無しさん
10/10/09 20:44:49
魔法がかかってるから

222:デフォルトの名無しさん
10/10/09 20:58:40
>>220
コンパイラベンダが独自に定義しているマクロを見て条件ディレクティブで分岐コンパイルしてる

223:220
10/10/09 21:01:34
>>222
thx

224:デフォルトの名無しさん
10/10/10 13:43:15
>>213
なに、そのクソページ。管理できなくなるほどのグローバル変数を使用しない事が最優先。

URLリンク(www.pro.or.jp)
> プログラミング言語の本は、コンピュータ関連の本の中では寿命の長い方 ですが、
> それでも出版されてから5年程度が寿命です。いつ出版された本かは 必ず確認して買いましょう。

墓場行きのクソページいつまでも公開してるのは、自論と矛盾してるな。

225:デフォルトの名無しさん
10/10/10 13:47:47
5年経ったら販売するなとは言ってないから矛盾はしていない

226:デフォルトの名無しさん
10/10/10 13:55:12
しかしこれは読んどけって言われる本は古い本が多い事実

227:デフォルトの名無しさん
10/10/11 00:16:00
decltypeとかdeclspecってなんて読むんですか

228:デフォルトの名無しさん
10/10/11 00:18:34
デクルタイプ
デクルスペック

229:デフォルトの名無しさん
10/10/13 22:58:57
.netとwin32apiのがありますが
どっちを使っているソフトウェアが多いんですか?

230:デフォルトの名無しさん
10/10/13 23:03:20
スレチ

231:デフォルトの名無しさん
10/10/15 05:54:25
partial_sortの魅力ってなに?

232:デフォルトの名無しさん
10/10/15 10:45:00
上位3つだけ欲しいときとかに全体をソートするよりは速いんじゃない

233:デフォルトの名無しさん
10/10/15 12:02:58
遅延評価の真似事用ですか

234:デフォルトの名無しさん
10/10/15 14:33:46
いいえ、例えば最大値選択法のように一部だけソートした方が速いアルゴリズムで実装できるようにするためです。
その部分がソートされている必要さえないなら更に高速なnth_element()を使うこともできます。

235:デフォルトの名無しさん
10/10/15 16:21:02
質問させてください。
VC++2010Expでビットマップの編集ソフトを作ろうと考えています。
ファイルから読み込んだものを、ほかのDIBにコピーしたいのですが、
下記のようにプログラムしてもうまくいきませんでした。

UINT adjust4multiples(int i){
return (UINT)((i+3)/4)*4;
}
として、

HBITMAP from_file = (HBITMAP)LoadImage(NULL,FilePath,IMAGE_BITMAP,x,y, LR_CREATEDIBSECTION | LR_LOADFROMFILE );
DIBSECTION dibsection_info;
GetObjectW(from_file, sizeof(DIBSECTION), (LPVOID)&dibsection_info );

for(int i=1; i<=y; i++){
  int iymem = (y - i) * adjust4multiples(Width*3);
  int iyfile = (y - i) * adjust4multiples(x*3)
  CopyMemory(memBITMAP+iymem, dibsection_info.dsBm.bmBits+iyfile, x*3);
}

memBITMAPはあらかじめDIB用にメモリ確保してあり、問題ないのですが、bmBitsを使ってコピー元を表そうとしても、
コンパイラから、明確なオブジェクトをさすポインタでない、あるいはサイズが不明などといわれ、コンパイルできません。

CreateDIBsectionで作られたものであれば、ピクセルへのポインタがあらかじめ手に入るのですが、LoadImageの場合は
どうすればいいのでしょうか。
手直しすればこの方法で問題ないのか、そもそもLoadImageをつかって楽をしようとしたのが間違いなのか。
よろしくお願いします。



236:デフォルトの名無しさん
10/10/15 18:16:15
win32スレ行けよ

237:235
10/10/15 19:11:17
了解しました。
移動します。


238:デフォルトの名無しさん
10/10/15 19:44:12
>>234
あり^^

239:デフォルトの名無しさん
10/10/15 22:15:49
ある場所で処理を任意の時間まで(特定の変数の値が1になるまで、等)止めておきたい場合はどの関数を使えばいいのでしょうか?
ユーザーの入力を待ちたいのですが、コンソールアプリケーションではないためcinを使うことが出来ません。

240:デフォルトの名無しさん
10/10/15 22:17:38
スレッド

241:デフォルトの名無しさん
10/10/15 22:26:35
Rubyの実装の中に、

void func( a, b )
int a;
int b;
{
・・・
}

のような記述がCで成されていたのですが、
void func( int a, int b )
としていないのはなぜでしょうか?

また、これはC++では許されないようですが、
単純に 仕様 ということでしょうか?

242:デフォルトの名無しさん
10/10/15 22:28:54
昔々の話じゃ…

243:デフォルトの名無しさん
10/10/15 22:44:50
RubyにK&Rスタイルの宣言が残っている訳
「Rubyを作ってた当初はK&Rしか解釈できないコンパイラがまだ残っていたのと、
 私がANSIスタイルの引数括弧の長さが嫌いだというのが理由です。 」
URLリンク(www.rubyist.net)

仕様はどうか知らないがM$はこう言っている
「情報: 古い (K & R) のスタイルの宣言は C++ ではサポートされていません。」
URLリンク(support.microsoft.com)

244:デフォルトの名無しさん
10/10/15 22:47:48
なんでこの仕様なくしたんだろう
こっちの方が美しいのに

245:デフォルトの名無しさん
10/10/15 22:52:00
プロトタイプ宣言がコピペでできるから昔からANSIだったし

246:241
10/10/15 23:27:09
>>243
ありがとうございます。

K&Rスタイルなんですね。
全く知りませんでした。

私としては、今風(?)の書き方の方が、関数の宣言見たときに、
変数とその型がセットであるから見やすいと思ってしまいますが・・・。

247:デフォルトの名無しさん
10/10/15 23:45:13
かと思えばクラスの初期化子ですよ

248:デフォルトの名無しさん
10/10/15 23:48:16
C++のブサイクさは半端ねーからな
さっさとプチ整形しろよ

249:デフォルトの名無しさん
10/10/15 23:58:19
ダイナミックライブラリ作りたい
簡単に作る方法は?

いままでスタティックライブリ作っていたので
__declspec(dllexport)やdef定義作るの面倒です
環境:VS2008

250:デフォルトの名無しさん
10/10/16 00:01:21
VSだったらプロジェクト新規作成するときにDLL選べなかったっけ?

251:デフォルトの名無しさん
10/10/16 00:09:18
上司に
C++のスタティッククラスのコンストラクタに処理を書けば
何よりも早く呼ばれるからそこでLib全体の監視起動しろごるあ
ついでに終了処理をデストラクタに書けば
Libが存在する間ずっと動く処理が書けるだろ?簡単だろ?ごるあ
と言われたのですが、
そんなことできるんでしょうか?・・・orz

252:デフォルトの名無しさん
10/10/16 00:13:04
シュワルツカウンタというカッコいい名前のテクニックがあってな。たぶんそれのことでしょ

253:デフォルトの名無しさん
10/10/16 01:29:11
おお!

254:デフォルトの名無しさん
10/10/16 07:56:18
>>251
スタティック(静的)クラスなるものはC++にはない。Managed C++にはある。

255:デフォルトの名無しさん
10/10/16 08:17:00
>>252
カッコいいか? 少なくともやってる事はダサダサだぞ。

256:デフォルトの名無しさん
10/10/16 08:18:38
文盲乙

257:デフォルトの名無しさん
10/10/16 08:31:11
staticなstorage classって意味でなら出てくる
その時のクラスってのはいわゆるclassやstructのことじゃなくて、autoやstaticとかの話
普通のstatic変数の初期化はプログラムで最初に実行されるけど
クラスとかは最初に制御が移った時点で初期化される
なので、宣言と同時に定義もしてしまうこういうやり方で出来るってことじゃないかな

static class A{public: A(){printf("hoge");}} a;

258:デフォルトの名無しさん
10/10/16 08:35:01
って、俺全然スレの流れ読めてないな・・シュワルツカウンタなんてあるのか
レスした後で気づくとか

259:デフォルトの名無しさん
10/10/16 13:24:04
結論は

C++の静的クラスなるものは全メンバがstaticなクラスのことで
静的クラスはコンストラクタデストラクタを持てない

→ >>251 はGCCでは不可能

でOKでつか??

260:デフォルトの名無しさん
10/10/16 13:31:38
>>259
スタティッククラスってのは存在しないだろう。
仮に非スタティックメンバーが無くてもデフォルトコンストラクタは呼べるしnewもできる。

261:デフォルトの名無しさん
10/10/16 14:25:05
全てのメンバがデフォでstatic修飾されたクラスとか
constクラスとかあったら一部の人が大喜びするかもな

262:259
10/10/16 15:31:07
>>257
結論は>>252の方法を使えば、可能ってことでしょ
じゃなきゃ、C++ライブラリのcoutとかは処理系依存ってことになってしまう
259で説明したことは仕様書の6.7に書いてる。読み違えてなければ。

全メンバがスタティックなクラスでも
staticを付けてクラスを宣言してもコンストラクタ/デストラクタは持てる
後者は、コンストラクタがちゃんと動いたときのみデストラクタが走る

263:デフォルトの名無しさん
10/10/16 15:36:09
boost::randomを使っていて

 mt19937 gen(time(0));
 uniform_smallint<> dst(1, 6);
 variate_generator<mt19937&, uniform_smallint<> > rand(gen, dst);
 cout << rand() << endl;

のように書いている(実際には乱数を使って色々処理をする)のですが、
ここの分布関数を設定で切り替えて動かすようにしたいと考えています。

が、生成される rand() はみんな違うシグネチャを持つので、後段の
処理の部分だけ1つのコードにまとめることができず、C++でどう書くのが
普通なのか悩んでいます。

こういう場合、

 class wraprand {
 public:
  wraprand(boost::function<int()>) { ... }
  wraprand(boost::function<double()>) { ... }
  wraprand(boost::function<bool()>) { ... }
  double operator() () { ... }

のようにアダプタを書いて、rand を boost::function を介して
ラップして持ち回る以外に簡単な方法はないでしょうか?


264:デフォルトの名無しさん
10/10/16 15:42:01
>>262
お前、頭壊れてない?
>>259と正反対の事言いだすなら、取り消してから言い出せよ。

265:デフォルトの名無しさん
10/10/16 15:55:25
template <class R> void func(R rand)
{
cout << rand() << endl;
};
でいいんじゃないの?

266:デフォルトの名無しさん
10/10/16 16:58:31
うわーすんません、262は、名前欄が本来は257で
リンク先が259です。ケアレスミス。

267:デフォルトの名無しさん
10/10/16 18:13:26
よくバグを出す人と見ますた

268:デフォルトの名無しさん
10/10/16 18:32:22
はじめて投稿させていただきます初心者です。
今キーボードから入力した無数の数字の中から、
大きいものを順番に上から3つ表示するプログラムを作成中で、
インターネット上で同様のプログラムがあったので拾ってきました。
ここでif以降の処理の意味が理解できませんでした。
おそらく上から順番に次々と数字を代入している処理なのでしょうが・・
また最初に定義されていない「t」という変数の意味と、
t=a a=d d=tとループするような代入を繰り返していることの意味や、
なぜ同じ変数を指定しているのに処理が実行できるのかがわかりません。。
どなたかわかりやすく教えていただけないでしょうか

#include <stdio.h>
int main() { float a,b,c,d; int i; a=b=c=0;
for(i=0;i<10;i++){ scanf("%f",&d);
if(d>a){ float t=a; a=d; d =t; }
if(d>b){ float t=b; b=d;  d =t;}
if(d>c){ float t=c; c=d; d =t; }
}
printf("%.1f>%.1f>%.1f\n",a,b,c);
return 0;
}


269:デフォルトの名無しさん
10/10/16 18:42:36
>>268
いわゆるswap、入れ替えのコードだね。
変数xとyの値を入れ替えたいと思ったとき、
どんな代入文を書けばいいか想像してみよう。

270:デフォルトの名無しさん
10/10/16 19:10:47
>>267 その通りです生きていくのが辛い助けt

>>268 例えば、a=b;b=aでa,bが交換出来るか考えて見るといいよ

271:デフォルトの名無しさん
10/10/16 20:29:57
違う場所から書き込んでます>>268です。

>>269さん>>270さんありがとうございます。
直接代入する形だとa=bになって意味がなくなるので便宜上別の数を利用しているんですね
定義なしでも使える数があるということなのかな?少しわかった気がします
そう考えてみると、最初abcの値が0からスタートして、
仮に入力が1,2,3,4,5 と入力された場合は
0,0,0 => 1,0,0 => 2,1,0 => 3,2,1 => 4,3,2 => 5,4,3
と次々と大きい数字を入れていくってことですか?!
ぐぐぐなんかすごい感動してきたプログラムおもしろいなああ

272:デフォルトの名無しさん
10/10/16 21:14:39
なぜ2ちゃんねるは、技術的な事を質問すると
誰も答えてくれないのですか?

273:デフォルトの名無しさん
10/10/16 21:18:42
具体的でない質問は考えうるケースが多すぎてエスパーが必要になるからじゃね

274:デフォルトの名無しさん
10/10/16 22:44:05
あのスレの901が技術的な質問だというなら病院行った方がいい

275:デフォルトの名無しさん
10/10/16 23:40:08
ググっても答えが見つからない問題は、答えてもらえる可能性は低いわな。
そういう時に自分でなんとか出来るかどうかって所で、人は二種類に分けられるんだと思う。

276:デフォルトの名無しさん
10/10/16 23:40:43
いいや10種類に分けられるよ

277:デフォルトの名無しさん
10/10/17 00:43:26
はいはい死んでね

278:デフォルトの名無しさん
10/10/17 03:06:09
>>271
何か勘違いしてねぇか?
>268のコードではtもちゃんと定義しているぞ。
if(d>a){ float t=a; a=d; d =t; }
このコードは、こういう意味だ。
if (d > a) {
float t = a;
a = d;
d = t;
}
勿論、tはここでも定義されているし、他のif文の後のブロック内でも定義されている。
つまり、tはブロック内でのみ有効な変数として定義されているわけだ。
一応念の為に書き添えておくと、そのコードは所謂「ソート」の前哨戦だな。
ソートの世界は深くて楽しいぞw

279:デフォルトの名無しさん
10/10/17 14:22:35
簡単な質問ですが、よろしいでしょうか?

strcatで \ を連結する場合は
'\\'でエラーがでてしまうので"\\"にしたのですが
これであっていますでしょうか?

280:デフォルトの名無しさん
10/10/17 14:29:06
>>279
正しい。

281:デフォルトの名無しさん
10/10/17 14:30:01
ありがとうございます。

282:デフォルトの名無しさん
10/10/17 15:33:46
>>279
どうせその後ファイル名も連結する積もりなら、sprintf()を使った方が手っ取り早くないか?

283:デフォルトの名無しさん
10/10/17 15:37:33
char buf[256];
sprintf(buf, "%.174s\\%.80s", path, file);

284:デフォルトの名無しさん
10/10/17 16:19:43
>>278
あああなるほど!!!そういうことだったんですね
float t ってこの場所で定義していたのか・・・
ブロック内だけで定義するってこともできるんですね。すごい勉強になります
またお世話なるかもしれませんがよろしくお願いします
ありがとうございました!

285:デフォルトの名無しさん
10/10/17 19:51:32
大量の画像ファイルを扱うプログラムを作っているので
メモリ上にキャッシュし、キャッシュの容量が大きくなってきたら解放したいのですが、
どんな風にやればいいでしょうか

ファイル名から画像を取得できる連想配列と連結リストをそれぞれ用意して、
キャッシュの容量が一定値に達したら
リストの最初の画像を取得→連想配列からも削除

という方法を考えましたが、もっと良い方法があれば知りたいです

プログラムの殆どで参照カウントを使っているので、キャッシュから
画像を取得するときに必ずカウントを増やさなければいけないのも気になります

286:デフォルトの名無しさん
10/10/17 20:21:31
Javaにはそういうとき便利な連想配列と連結リストが合体したLinkedHashMapっていうのがあるんだけどな・・・

287:デフォルトの名無しさん
10/10/17 21:23:10
for(std::list<int>::iterator it = l.begin(),int i = 0;
i < 10; ++i) {
<iro iro>;
}
とやりたいのですが、FOR文の最初の項には文を一個しかかけないのでしょうか?


288:デフォルトの名無しさん
10/10/17 21:36:22
はい、残念ながら

289:デフォルトの名無しさん
10/10/17 21:40:05
>>287
,の後に宣言は書けないんじゃね?

290:デフォルトの名無しさん
10/10/17 21:41:22
それって不便な仕様だよね
{
list<int>::iterator it = l.begin();
int i = 0;
while(i < 10)
{
・・・
++i;
};
}
とか書けばほとんど同じといっていいけど不恰好だ

291:デフォルトの名無しさん
10/10/17 22:06:26
ループはint iに依存してるからそっちだけforに残したりする

292:デフォルトの名無しさん
10/10/17 22:08:13
for(pair<std::list<int>::iterator,int> it(l.begin(),0);it.second<10;++it.second){
//iroiro
}
すごく…不恰好です…
書いといていうのはあれですが…
こんなのは…嫌です…

293:デフォルトの名無しさん
10/10/17 22:09:28
std::list<int>::iterator it;
int i;
for(it = l.begin(),i = 0; i < 10; ++i) {
<iro iro>;
}
これならいけるけどね

294:デフォルトの名無しさん
10/10/17 22:12:34
思ったんだけと、287含め、誰もitインクリメントしてないよね
itを10進めながら処理するループだと思ってたけど、違うのかな?

295:デフォルトの名無しさん
10/10/17 22:40:00
if( int i = 1 )
 for( std::list<int>::iterator it = l.begin(); i <= 10; ++i ){
  <iro iro>;
 }

296:デフォルトの名無しさん
10/10/18 10:03:32
質問があります。
今、データを読み込んで整理しています。
手順としては
1、データを1行ずつ読み込む(行はたくさんあります)
2、読み込んだデータをif文で整理しています。

しかし、if文を用いているのですがすべて同じ結果になってしまいます。
何故か分かる方はいらっしゃいますか?
ちなみに先生に聞くと読み込むプログラムはあっていてif文が間違っていると言われました。
私が書いているのは以下のような具合です。
int a = s.b + s.c;(sのクラスは用意しています。)
if ( a = 1){
if ( s.nenn == 2 || s.nenn == 3 ) {
cout << s.kei << endl;
}
}
if ( a = 2){
if ( s.nenn == 2 || s.nenn == 3 ) {
cout << s.kei << endl;
}
}


297:デフォルトの名無しさん
10/10/18 10:07:34
とりあえずは = と == 間違えてるからかな

298:デフォルトの名無しさん
10/10/18 10:35:22
297の書き込みをしてくださった方ありがとうございます。
無事に出来ました。
本当にありがとうございました。

299:デフォルトの名無しさん
10/10/18 15:32:16
if文の際に例えば1のデータだけを持ってきたいときは
if ( a == 1){} 
等で示すのは分かるのですがデータが空欄のものを持ってきたいときは
どのようにすればよいのでしょうか?

300:デフォルトの名無しさん
10/10/18 15:37:07
if ( a == 0 ) {}

301:デフォルトの名無しさん
10/10/18 17:01:01
C言語より先に日本語

302:デフォルトの名無しさん
10/10/18 18:41:34
ローカル変数やメンバ変数が破棄される際、その順番は規格で決まっているのでしょうか?
決まっているなら、その順番を教えていただけないでしょうか。

303:デフォルトの名無しさん
10/10/18 18:45:09
書かれた順にコンストラクトされてその逆順にデストラクトされる

304:デフォルトの名無しさん
10/10/18 19:59:13
メンバ変数の場合、初期化リストに書いた順番でなく宣言に書かれた順番に従う。

305:302
10/10/18 22:35:42
>>303-304
勉強になります。
どうもありがとうございました。

306:デフォルトの名無しさん
10/10/18 22:43:40
初期化リストの構文がクソ。

307:デフォルトの名無しさん
10/10/19 10:47:14
インデントなどのスタイルを指定したらそれに合わせてコードを整形してくれるアプリって在りますか?
あるなら名前を教えてほしいのですがよろしいでしょうか?

308:デフォルトの名無しさん
10/10/19 10:56:19
>>307 indent

309:デフォルトの名無しさん
10/10/19 14:14:19
VisualStudio

310:デフォルトの名無しさん
10/10/19 22:16:38
質問です
ヒープ領域にメモリを取れる限界量というのは決まっているんでしょうか?
short int *array = new short int[200000];
という類の事をしたらコンパイルは通るものの、アプリケーションがフリーズしてしまいます

311:デフォルトの名無しさん
10/10/19 22:19:23
積んでるメモリとスワップ領域に相談してくれ

312:デフォルトの名無しさん
10/10/19 22:22:04
>>310
たったそんだけでフリーズするの?

313:310
10/10/19 22:34:08
>>311
メモリ4GBを積んでいるので、数MBのnewくらいなら大丈夫かと思ったんですが・・・

>>312
してしまいます・・・
デバッガで追いかけたところ、
short int *array = new short int[200000];
のarrayに-12851という値が入っているのみなので、配列の確保に失敗しているのかなと思った次第です

314:デフォルトの名無しさん
10/10/19 22:43:42
>>313
ちがう原因でフリーズしてんじゃないの?

315:デフォルトの名無しさん
10/10/19 22:47:38
>>314
大きいサイズの確保をし始めたら出てきた上にデバッガで追えないのでコレかと思ったのですが・・・
もうちょっと探してみます

316:デフォルトの名無しさん
10/10/20 09:33:10
>>313
アドレスに正負は関係ないだろ。
スタックやヒープを壊しているとかの落ちな予感。

317:デフォルトの名無しさん
10/10/20 09:46:39
C++で、全メンバが「=」で代入できる構造体は
その構造体自体も「=」で一発で代入できるのに、
比較って「==」で全メンバを比較してくれないんでしたっけ?

もちろん、自分で構造体にoperator==()を作ればできるでしょうけど。


318:デフォルトの名無しさん
10/10/20 11:21:39
してくれない

319:デフォルトの名無しさん
10/10/20 11:31:14
>>318
そうでしたか。面倒だな。
勝手に代入してくれるなら勝手に比較もしてほしかった。

320:デフォルトの名無しさん
10/10/20 12:43:20
>>319
eqとequalのどっちを期待してるか分かんないだろ。

321:デフォルトの名無しさん
10/10/20 15:40:20
普通の関数は
クラスの中でstatic関数にしておくのと
そのままの関数とするのと
どちらが良いですか?


322:デフォルトの名無しさん
10/10/20 17:06:09
時と場合によるのでその都度考えてください

323:デフォルトの名無しさん
10/10/20 18:07:04
>>321
馬鹿な事を聞くな。
クラスの中でsutatic関数にしたら、普通の関数じゃ無くなるだろ。
そのまま意外はあり得ない。

324:デフォルトの名無しさん
10/10/20 18:08:07
酢たちc

325:デフォルトの名無しさん
10/10/20 18:11:06
>>323
んなことない

が、そのクラスとまったく無関係の機能をクラスに押し込めるのもどうかと思うが

326:デフォルトの名無しさん
10/10/20 18:16:00
sutatic関数わらう。普段からローマ字生活なんだろうな。

327:デフォルトの名無しさん
10/10/20 18:31:09
>>321は「出刃包丁とアーミーナイフどっちがいいですか?」みたいな質問だろ。
そんなの用途によるに決まってる。

328:デフォルトの名無しさん
10/10/20 20:13:51
>>313
たった400MB位屁でもない筈だが。
まさかとは思うが、メモリが足りなくてswapしているなんてオチじゃないよな。


329:デフォルトの名無しさん
10/10/20 21:02:25
普通にスワップだと思うが。
メモリは前から順番に使うわけじゃない。分散して使っている。
10MB細切れの合計400MBだったらスワップせんかもしれんけどね。
連続した400MB?スワップして当然だろ。

330:デフォルトの名無しさん
10/10/20 21:11:33
それなんてへぼOS…

331:デフォルトの名無しさん
10/10/20 21:40:15
400MB・・?

> short int *array = new short int[200000];

俺には 400KB に見えるが・・・ まぁ最近視力落ちてるからな・・・

332:デフォルトの名無しさん
10/10/21 11:24:46
400KBだろ。だから>328で「たった」なんだろう。

333:デフォルトの名無しさん
10/10/21 16:52:18
01|struct A {
02|  struct P {
03|    template<typename _T>void foo(){}
04|  };
05|};
06|template<typename _A>struct B : _A {
07|  typedef typename _A::P P;
08|  void bar(){
09|    P p;
10|    p.foo<B>();
11|  }
12|};

g++ で 10 行目でエラーが出てしまうのですが
このような関数呼び出しをしたい場合はどのようにすればよいのでしょうか?

関数 foo の引数にダミーのポインタを渡す等をせず、型情報だけを渡したいです
B のテンプレートパラメタ _A には A を継承した様々なクラスが指定される感じです


334:デフォルトの名無しさん
10/10/21 16:58:25
p.foo<B<_A> >();
でどうよ

335:デフォルトの名無しさん
10/10/21 18:54:55
>>333
URLリンク(codepad.org)
こうかな

336:デフォルトの名無しさん
10/10/21 22:53:08
ポインタをどういうタイミングで使えばいいのかが、わかりません
ぶっちゃけ、C++では関数の戻り値がポインタ以外はポインタを使う意義がわかりません
私がポインタを必要とするプログラムを、書いたことが無いだけでしょうか?

337:デフォルトの名無しさん
10/10/21 22:55:22
>>336
データ構造とアルゴリズムを勉強しましょう
ポインタがもしなかったらこの世界が崩壊理由が理解できるでしょう

338:デフォルトの名無しさん
10/10/21 23:13:09
C++を長い間使ってる人が
ポインタなんでC++の入門書の最後で扱うべき、少なくともイテレータや参照よか後にしろ
とかこぼしてたみたことあるから、まぁ色々とあるんだろうなとか

339:デフォルトの名無しさん
10/10/21 23:20:25
STLを覚させて高級言語として使わせる
ポインタとか低レベルのものは後でいいという考え方もまあ理にかなってはいるけどね
業務・実践向けの教え方だとこっちの方がいいと思う

340:デフォルトの名無しさん
10/10/22 00:36:21
そして増える64bitプログラム。嵩張るポインタの運命やイカに!

341:デフォルトの名無しさん
10/10/22 01:27:17
ポインタ、配列関連の質問なのですが、

#include<stdio.h>

void main()
{
int i;
char a[20];
for (i=0;i<=9;i++) {
scanf("%c%*c",&a[i]);
a[i+1]='\0';
printf("%s\n",&a);

}
}

これのchar型配列をNULLで初期化する意味を教えてください。




342:デフォルトの名無しさん
10/10/22 01:38:06
C/C++には文字列型というものがなく
\0で文字列の終わりを表すため。
もし\0が無ければ、配列aを見ていって\0が見つかるまで表示する
なければ多分、バッファオーバーフローして\0が見つかるところまで表示する

343:デフォルトの名無しさん
10/10/22 01:45:56
>>342

ありがとうございます

344:デフォルトの名無しさん
10/10/22 02:17:28
いまいちどこで質問していいかわからなかったのですが、
パソコン上でなっている音の波形データをとってくる方法ってありますか?
itunesとかで再生している音を外部からとってくるイメージなんですけど
オーディオデバイスにアクセスしたりとかできるんですかね?

345:デフォルトの名無しさん
10/10/22 04:46:07
メモ帳のウィンドウプロシージャのアドレスが取得できないんだけど、誰か取得できたら教えて。
GetWindowLong(FindWindow("Notepad", NULL), GWL_WNDPROC)
がNULLになってる。
winmap使っても見えない。

346:デフォルトの名無しさん
10/10/22 10:20:52
はいはいスレ違い

347:デフォルトの名無しさん
10/10/22 10:29:49
フックしる

348:デフォルトの名無しさん
10/10/22 11:03:32
質問よろしいでしょうか?

c++の本でclassの中身の変数を、同じクラス同士で
a = b + cという感じに計算していたのですが、これはどのようにやるのでしょうか?

349:デフォルトの名無しさん
10/10/22 11:09:15
演算子オーバーロードでぐぐれ

350:デフォルトの名無しさん
10/10/22 13:00:13
関数の中でy=1等指定しても
メイン関数のほうではなかったことになりますが、
それを防ぐ方法はありますか?
できればコンソールアプリ内での知識でお願いします。

351:デフォルトの名無しさん
10/10/22 13:01:14
入門編スレへどうぞ

352:デフォルトの名無しさん
10/10/22 13:12:33
>>350
引数を「値渡し」しても関数内で宣言された別の変数に値がコピーされてるだけなので
いくら関数内で変更しても呼び出し元には影響ありません
C言語なら「ポインタ渡し」、C++なら「参照渡し」をしてください
具体的なやり方はggrks

353:デフォルトの名無しさん
10/10/22 14:03:46
誰かboostをCに移植してください><

354:デフォルトの名無しさん
10/10/22 14:09:31
ググれとか言ってる奴はスレタイ読めないの?

355:デフォルトの名無しさん
10/10/22 14:09:38
>>353
漏れなくC++コンパイラがついてきますがそれでよければ承ります。
つーか、なんでCに拘るねん。

>>350
それを防ぐことを考えるよりも、先ずはローカル変数は関数毎に独立していることに慣れること。
受け渡しの方法は、引き数や戻り値、或いは構造体というキーワードで調べれば判る。

>>348
「classの中身の変数」の意味がよく判らんが、class Foo bar, bazとして
bar + bazなどとしているということなら、>349。

356:デフォルトの名無しさん
10/10/22 14:11:40
>>354
質問の体を為してないんだもん。回答しようがないやな。

357:デフォルトの名無しさん
10/10/22 14:12:14
キーワード書いてもらったんだから幾らでも調べられるだろう

358:デフォルトの名無しさん
10/10/22 14:13:41
それはおまえらが初心者だからだろwww
応えられないならそう言えよwww

359:デフォルトの名無しさん
10/10/22 14:15:44
こんなアホな質問するやつにポインタの説明とかしたくないしなぁ

360:デフォルトの名無しさん
10/10/22 14:16:05
>>358
おう、こんだけ応えているってぇのに何が気にいらねぇんだ、表に出やがれ。

361:デフォルトの名無しさん
10/10/22 14:16:38
上級者気取り()

362:デフォルトの名無しさん
10/10/22 14:17:23
幾ら煽っても回答は出ませんよ

363:デフォルトの名無しさん
10/10/22 14:23:43
>>362さん
>>352です
>>354と358は私とは別人です
どうかご教授願いたいです
あとggrskもわかりませんでした
できればコンソールアプリ内での知識でお願いします

364:デフォルトの名無しさん
10/10/22 14:28:24
>コンソールアプリ内での知識

365:デフォルトの名無しさん
10/10/22 14:28:56
ggrks とは↓
URLリンク(d.hatena.ne.jp)

366:デフォルトの名無しさん
10/10/22 14:29:11
>352と>355を読んでも未だ教えろと言うのだったら、正直プログラミングは諦めた方がいい。
自分の番号さえ書き間違える(or勘違いする)くらいだしな。

367:デフォルトの名無しさん
10/10/22 14:53:28
何ビット目が立っているかを調べるうまい方法ありますか?
入力は1つのビットだけ立っているものして、それ以外の場合
出力は不定でかまいません。

入力 -> 出力
0001 -> 0
0010 -> 1
0100 -> 2
1000 -> 3

368:デフォルトの名無しさん
10/10/22 15:00:27
右シフト何回して0になったか調べるじゃだめなの?

369:デフォルトの名無しさん
10/10/22 15:06:03
>>367
int x = 4 ;
for ( int i = 0 ; i < sizeof(int)*8 ; i++ ){
if ( x&(1<<i)){
printf ("%dビット目が立ってる\n", i ) ;
}
}

370:デフォルトの名無しさん
10/10/22 15:07:43
int n = 0;
if (x >> 16) { n += 16; x >>= 16; }
if (x >> 8) { n += 8; x >>= 8; }
if (x >> 4) { n += 4; x >>= 4; }
if (x >> 2) { n += 2; x >>= 2; }
if (x >> 1) { n += 1; x >>= 1; }

371:デフォルトの名無しさん
10/10/22 15:12:03
>>367
URLリンク(aggregate.org)のLeading Zero Countかな。

372:デフォルトの名無しさん
10/10/22 15:17:57
>>351
>>352
なるほど、ポインタを使えば確かにできそうです。
本当にありがとうございました。

373:デフォルトの名無しさん
10/10/22 16:07:54
>>334
>>335

レスありがとうございます
335 で行けました

スコープ演算子の後に template を使えるのは知っていたのですが
アクセス演算子の後にも使えるのですね


374:デフォルトの名無しさん
10/10/22 18:00:27
>>368-371
ありがとうございます。
参考にさせてもらいます。


375:デフォルトの名無しさん
10/10/22 21:05:44
POD pod = POD();

これってpod = {0};と同じように0初期化保証されますか?

376:デフォルトの名無しさん
10/10/23 02:15:17
Cでは#defineを使うようなパターンでC++ではconstを使う気がするのですが
CとC++の仕様の違いでしょうか?

377:デフォルトの名無しさん
10/10/23 03:49:47
#defineは様々な問題があるのでなるべくconstにしたいところだが
Cではconstにしても定数として扱われないので#defineにせざるをえない

378:デフォルトの名無しさん
10/10/23 09:45:35
Windows 7 32bit で Visual Studio 2010 を使っています。
C++のプログラムの中でコードを書いてコンパイルすることが目的です。
Microsoft Visual Studio 10.0\VC\bin にのみパスを通しています。
今回問題としているのはプログラム上での一時的な環境変数の追加です。

ofstream により適当な test.cpp ファイルを作ります。その後、
system("vcvars32");
system("cl /EHsc test.cpp");
として、test.cppをコンパイルしたいのですが
cl.exe - システム エラー
コンピューターに mspdb100.dll がないため、プログラムを開始できません。
となり、コンパイルが実行されません。

cmd.exe上でtest.cppのあるディレクトリまで移動して
>vcvars32
>cl /EHsc test.cpp
とした場合はコンパイルが成功し、test.exeが作成されることを確認済みです。

つまり知りたいことは、cmd.exe上でvcvars32を読んだ場合はパスの設定が有効になるのに、
system関数を使った場合はそうならないのは何故か。
また、もしそうならばc++のプログラム上でどのように一時的にパスを追加するのかです。
よろしくお願いします。

コードのリンクを貼っておきます。
URLリンク(codepad.org)

379:デフォルトの名無しさん
10/10/23 10:10:42
cmd.exe上でvcvars32を実行
cmd.exeを新しく立ち上げてcl /EHsc test.cppを実行
という動作になっているから

一時的にパスを追加するのはC++じゃ無理なのでWinAPIを使う

380:デフォルトの名無しさん
10/10/23 11:40:06
>>379
ありがとうございます。
ExpandEnvironmentStrings と SetEnvironmentVariable を用いて
プログラム上で一時的に環境変数を追加することができました。
Visual Studio のパスが埋め込んであってちょっと汚いですが
上手くいったコードを載せておきます。
URLリンク(codepad.org)

しかし最終的にはこうしました。これは C++ の話ではないので余談ですが。
system("vcvars32 & cl /EHsc test.cpp");

381:デフォルトの名無しさん
10/10/23 11:58:27
>>377
よく分かりました。
どうもありがとう。

382:デフォルトの名無しさん
10/10/23 19:15:04
explicitを使っていますか?
あまり見たことがないんですけど

383:デフォルトの名無しさん
10/10/23 19:54:52
え~使いまくりですよ~

384:デフォルトの名無しさん
10/10/23 20:01:00
ヘッダファイルを見ると大体が、メンバ変数にポインタを使っています
メンバ変数はポインタを使った方が、動作が速いのでしょうか?/

385:デフォルトの名無しさん
10/10/23 20:34:55
age

386:デフォルトの名無しさん
10/10/23 20:49:13
遅くなったり早くなったりします

387:デフォルトの名無しさん
10/10/23 20:51:30
ポインタにするにはその理由があるだけでしょ
速さ目的でやることじゃない

388:384
10/10/23 20:55:13
>>386
>遅くなったり早くなったりします
ポインタはすごく速いイメージがあるのですが、何故遅くなったりするんですか?

389:デフォルトの名無しさん
10/10/23 20:55:47
LinuxのGTKについて聞きたいことあるけど、ここでいいのかな?
この板のスレッド検索したら、MacとWinのGTKは見つかったけど
Linuxがない。Linux板に行って聞くべき?

390:デフォルトの名無しさん
10/10/23 21:04:07
>>389
ここのスレでgtkの話は..

391:デフォルトの名無しさん
10/10/23 21:06:54
>>390
ダメなのか?では、別のとこ探してみます。
ありがとう。

392:デフォルトの名無しさん
10/10/23 21:14:36
>>391
ダメじゃないけど、このスレは「C++相談室」と比べると書き込み少ないよ
大体が文法の事だったりするし

393:デフォルトの名無しさん
10/10/23 21:41:07
そうかぁ。では、聞いてみる。
GTKで、テキストを表示させたい。
フォントを指定して色を変更したりサイズを変更したり。
そして、表示したテキストをコピー&ペーストしたい。
という条件に当てはまるウィジェット知りませんか?
cairoを使うと、色やサイズは変更できるけど、コピペができない。
devhelpを探してみたけど、今日の昼から探しつづけて力尽きた。
知ってる人がいたら、ウィジェットの名前でいいんで教えてください。

394:デフォルトの名無しさん
10/10/23 22:24:37
GtkLabelかGtkTextViewか

395:デフォルトの名無しさん
10/10/24 03:08:20
error: a label can only be part of a statement and a declaration is not a statement

gotoを利用したラベルを使ってみたところ以上のようなコンパイルエラーが。
gotoを使わずにifでやれば動くのですが・・・。
むやみに使ってはいけないとはいえ、何がだめなのかわからないので悲しいです
どなたかどんなエラーなのか教えてください

396:デフォルトの名無しさん
10/10/24 09:08:16
>>395
gotoのためのラベルの直後には必ず文がないといけない。 }とかだとそのエラーが出る。
単純にlabel:;と書けばよかった気がする。

397:デフォルトの名無しさん
10/10/24 09:09:25
あ、そのエラーだと変数宣言の前にラベル置いちゃった系かな。
Cならラベルの位置を変数宣言の後に移動させてください。

398:デフォルトの名無しさん
10/10/24 19:53:03
メンバがポインタばっかりなのはなんで?

399:デフォルトの名無しさん
10/10/24 19:55:29
ポインタ大好きな人が書いたから

400:デフォルトの名無しさん
10/10/24 21:08:36
>>394
ちょっくら調べてみる。ありがと。

401:デフォルトの名無しさん
10/10/24 21:50:35
すみません。
状況に応じてプログラムを2つ(のexe)に分けたり、分けずに1つのままにするプログラムを作ろうとしています。
その中で共通利用するクラス(プログラムを分ける場合それぞれに複製するクラス)に
100近い変数を抱える構造体を送りたいのですが、
プログラムA側とプログラムB側で同じ構造体を送ろうとすると、当然定義の段階で衝突してしまいます。
中身が完全に一致で名前が違う構造体を送る方法 もしくはこういう状況に適した技法が有れば
ご助言頂けませんでしょうか・・? 100個全部引数にするのが妥当なのでしょうか・・?


402:デフォルトの名無しさん
10/10/24 21:53:25
日本語の読解能力が試されるな

403:デフォルトの名無しさん
10/10/24 21:54:48
パス1

404:デフォルトの名無しさん
10/10/24 22:01:19
>>401
中身が完全に一致してて名前が違う事が問題なら
受け取った時にキャストしてやればそれだけで解決しそうだけど。

>100近い変数を抱える構造体を送りたいのですが
…これまずそうじゃね?
参照じゃなくて値で送るの?

405:デフォルトの名無しさん
10/10/24 22:56:18
std::auto_ptrって使っている人いますか?
deleteをしているのは普通に見ますが、スマポを使っているところは見たことがありません

406:401
10/10/24 23:18:53
>>404
今回は全て参照送りという形で処理してしまいました。
キャスト…メモしておき今後修正が必要になった際調べて利用させて頂こうと思います。
ありがとうございました。


407:デフォルトの名無しさん
10/10/24 23:45:09
>>406
参照送りでいいんじゃないの?
そんなでかい構造体、値送りで送ったらパフォーマンスに影響が出そう…

408:デフォルトの名無しさん
10/10/25 06:30:45
なんだその病院送りみたいな

409:デフォルトの名無しさん
10/10/25 10:30:34
>>395 >>396
ありがとうございます。
ラベルを使わない方法で作りましたが、ラベルありでも動くように直してみます

410:デフォルトの名無しさん
10/10/25 16:25:22
strchrで問題が発生

(1)
buf[0]='a';
buf[1]=-126;
buf[2]=10;
buf[3]=0;
(2)
buf[0]='a';
buf[1]='a';
buf[2]=10;
buf[3]=0;

(1)と(2)を同じように
strchr(buf,'\n');
としても同じ結果になりません
(1)はNULLになります
(2)はNULL以外です
なぜちがうんでしょうか?仕様?

411:デフォルトの名無しさん
10/10/25 16:29:21
やってみたが
URLリンク(codepad.org)
どっちも同じに見えるが

412:デフォルトの名無しさん
10/10/25 16:40:09
すみません関数がちょっと違いました
テスト環境はVc6.0です
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <tchar.h>

int main(int argc, char* argv[])
{
char buf[4];

buf[0]='a';
buf[1]=-126;
buf[2]=10;
buf[3]=0;
printf("%p\n", _tcschr(buf, '\n'));

buf[0]='a';
buf[1]='a';
buf[2]=10;
buf[3]=0;
printf("%p\n", _tcschr(buf, '\n'));

return 0;
}

413:デフォルトの名無しさん
10/10/25 16:45:55
_tcschr はマルチバイト文字対応なので buf[1] と buf[2] が合わさって1つの文字とみなされてるんじゃないかと思われ

414:デフォルトの名無しさん
10/10/25 16:46:41
>>408
ワラタw

415:デフォルトの名無しさん
10/10/25 16:52:36
>>412
VS2010だとchar buf[4]; を wchar_t buf[4]; にしたら同じになったよ
charのままだと曖昧エラーが出てコンパイルが通らない

416:412
10/10/25 16:57:16
ありがとうございます
やはりマルチバイト文字なのがだめなのですね
文字入力されたものをファイルに書き込んでそれを読んだときに
どうしても最後に改行コードがくっついて困ってます
上の例みたいに日本語を中途半端に書き込んでると
改行コードを消せなくなります…


417:デフォルトの名無しさん
10/10/25 16:57:59
マルチバイトでコンパイルするとおかしい
wchar_t buf[4];にしてUnicodeでコンパイルすれば正常
つかなんでわざわざ_tcschr?

418:デフォルトの名無しさん
10/10/25 16:58:20
>>416
strrchr()使ったら?

419:412
10/10/25 17:07:52
実際のプログラムは汎用テキスト?使ってるので
_tcschrにしてますがマルチバイトで\nさがしちゃだめってことがわかりました
strrchrつかって\n消すことにしました
ありがとうございました

420:デフォルトの名無しさん
10/10/25 17:35:54
たっかい金出してVS2010が重たい
もまえらどんなPCスペックなのよ

421:デフォルトの名無しさん
10/10/25 17:36:47
趣味だからフリーで十分

422:デフォルトの名無しさん
10/10/25 17:44:18
フリーでもおもてーよ

423:デフォルトの名無しさん
10/10/25 18:24:47
>>420
i7-920と6GBDDR3と牛SSDで今のところストレスフリー

424:デフォルトの名無しさん
10/10/25 18:28:14
MSはソフトを重くして新しいパソコン買わして
新しいパソコンにインストールするwindowsを買わせようとしているのだからね
すなおにGCC+ECLIPSEをつかえばいいのだよ。

425:デフォルトの名無しさん
10/10/25 18:30:33
>>424
gcc も結構重い by PenIII 1GHz x 2

426:デフォルトの名無しさん
10/10/25 18:34:03
gccが思いなんて聞いたこと無いぞwwwwwwwwwww
eclipseが重いなら他にソフトいくらでもあるしwwwwwww

427:デフォルトの名無しさん
10/10/25 19:07:16
>>423
そこまでの環境を用意しないとダメなのか、アホらしいな

428:デフォルトの名無しさん
10/10/25 19:09:56
Eclipseが重いなら.NETも重いだろ
そんな糞な環境やめろよ
言語の学習するだけでストレスになるなんて馬鹿らしいだろ

429:デフォルトの名無しさん
10/10/25 19:20:03
gccとvsを比べるんじゃないよ
比べるならclとだろwww

430:デフォルトの名無しさん
10/10/25 21:22:18
俺も、VSを買おうかと思ったけど、PCかいなおさなきゃいけないから
やめた。

Qtを試してみたら、色々コンポーネントとかあるし(Gridとかもある)MDI対応だから
Qtでしばらくいく。開発環境も軽いし。

431:デフォルトの名無しさん
10/10/25 23:17:56
newをあまり使わなくてもプログラミングをすることができますが、
スタックオーバーフローが発生すると思います

最近のコンピュータ(メモリ4GB)くらいだと、どのくらいスタックが確保されるのですか?
また、newを使った時のメリットを教えてください

432:デフォルトの名無しさん
10/10/25 23:26:32
スタックサイズは意外と小さいよ
Windowsは1MB、Linuxは8MBじゃないかな

433:デフォルトの名無しさん
10/10/25 23:33:03
>>431
普通1MB程度
VS2010ならプロパティシートのリンカ→システム→スタックサイズの設定

new/deleteはオブジェクト指向のキモだろ
ポインタで仮想関数をポリモーフィズムする
参照でも出来るがやりにくい
スタックサイズとは関係無いヒープ領域から取られる

434:デフォルトの名無しさん
10/10/26 07:55:26
class A{
 B b;
}
class B{
 A a;
}
みたいな感じで互いのclassの変数をクラスに持たせたいんだけど、どうすればできますか?
これだとclassAでBが宣言されていないってエラーがでる

435:デフォルトの名無しさん
10/10/26 07:58:29
ごめんなさい色々試してたら解決した
class B;
class A{
 B b;
};
class B{
 A a;
};
とすれば使えるのね

436:デフォルトの名無しさん
10/10/26 07:59:46
>>434
つかえねーよ馬鹿
ちょっと考えて見ればわかるだろうがそれ無限に続いちゃうから無理
class B;
class A{
 B *b;
};
class B{
 A a;
};



437:デフォルトの名無しさん
10/10/26 09:07:43
ああそっか。通ったのは実際に組んでたのは変数ポインタにしてたからか

438:デフォルトの名無しさん
10/10/26 09:39:40
>>435

それ別にC++のクラスでなくても構造体でも無理だよ

439:デフォルトの名無しさん
10/10/26 09:47:31
遅い
遅すぎるよ

440:デフォルトの名無しさん
10/10/26 10:35:35
>>439
遅いんじゃなくて今見た所なの
わかる?アホ

441:デフォルトの名無しさん
10/10/26 10:37:48
だから遅いんだよアホ


442:デフォルトの名無しさん
10/10/26 10:39:58
アホが一人

443:デフォルトの名無しさん
10/10/26 10:40:44
二人

444:デフォルトの名無しさん
10/10/26 10:49:50
三人

445:デフォルトの名無しさん
10/10/26 11:07:48
>>441
お前がアホ

446:デフォルトの名無しさん
10/10/26 11:12:31
俺がアホだ!

447:デフォルトの名無しさん
10/10/26 11:14:07
俺も俺もー

448:デフォルトの名無しさん
10/10/26 11:31:36
>>445
アホ


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