2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

スレを勃てるまでもないC/C++の質問はここで 17

1 :デフォルトの名無しさん:2010/09/22(水) 09:33:10
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ

01 http://pc11.2ch.net/test/read.cgi/tech/1167476845/
02 http://pc11.2ch.net/test/read.cgi/tech/1178503366/
03 http://pc11.2ch.net/test/read.cgi/tech/1187521676/
04 http://pc11.2ch.net/test/read.cgi/tech/1221633708/
05 http://pc11.2ch.net/test/read.cgi/tech/1230516307/
06 http://pc11.2ch.net/test/read.cgi/tech/1231564903/
07 http://pc11.2ch.net/test/read.cgi/tech/1232983248/
08 http://pc12.2ch.net/test/read.cgi/tech/1235921779/
09 http://pc12.2ch.net/test/read.cgi/tech/1240022781/
10 http://pc12.2ch.net/test/read.cgi/tech/1242300936/
11 http://pc12.2ch.net/test/read.cgi/tech/1245059383/
12 http://pc12.2ch.net/test/read.cgi/tech/1248010352/
13 http://pc12.2ch.net/test/read.cgi/tech/1260842197/
14 http://pc12.2ch.net/test/read.cgi/tech/1269273471/
15 http://pc12.2ch.net/test/read.cgi/tech/1273368706/
16 http://hibari.2ch.net/test/read.cgi/tech/1279285647/


2 :デフォルトの名無しさん:2010/09/22(水) 09:33:51
なんかいっつも完走まで次スレが建たずに俺が立ててるような錯覚に陥ってきたぞ

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

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

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

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


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

6 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/09/22(水) 21:21:11
>>6
http://codepad.org/VZu6F9Sr

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

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

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

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


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

10 :6:2010/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 :デフォルトの名無しさん:2010/09/22(水) 21:43:10
FIleMemmberにShallow Copy不可なメンバが含まれているのと違う?

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

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

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

しかし、

FileList.push_back(file_memmber_buff);

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


14 :6:2010/09/22(水) 21:56:34
>>12

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

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


15 :6:2010/09/22(水) 22:01:36
いや、違いました。

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

orz


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

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

http://ux.getuploader.com/tsubok/download/6/BITADD.zip

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


18 :デフォルトの名無しさん:2010/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:2010/09/22(水) 22:59:26
スミマセン

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


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


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

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


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


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

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

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

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


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

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

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

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

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

33 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/09/23(木) 16:51:26
されるかもしれないね
実際にインライン展開されるかどうかは結局のところコンパイラの気分次第だが

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

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

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

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

38 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/09/23(木) 21:26:35
なぜ後者がわかって前者がわからんのだ
a = 1の後にbreakがないからa = 2されるだろ

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

あれがあれば、

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

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

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

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


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

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

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

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

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

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

66 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/09/27(月) 16:40:45
int c = (int)&b[7];

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

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

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

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

72 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/09/27(月) 20:57:38
ようするに左のオペランドが、左辺値になってないってことだよ

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

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

76 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/09/27(月) 21:38:09
d

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

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

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

80 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/09/30(木) 23:46:04
指す先まではconstにならないので
constになるのはRefそのものだけ

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

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

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

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

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

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

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

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

Vec v1, v2;

v1 = v2; // A

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

110 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/10/02(土) 15:17:27
>>109 アドレスが欲しいだけなのです
>>110 うおおおおおすげぇぇぇぇ
ありがとうございますorz




112 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/10/02(土) 15:18:39
なんだstaticだったのか

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

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

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

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

#endif


117 :デフォルトの名無しさん:2010/10/03(日) 22:28:00
system
ttp://www11.plala.or.jp/studyhall/cpp/system.html

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

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

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

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

122 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/10/04(月) 13:07:09
できません
どこか別の変数に覚えておいてください

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

140 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/10/06(水) 00:36:05
どうも解答ありがとうございます

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

153 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/10/06(水) 19:26:59
どっちが速かったの? 具体的な数値で

155 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/10/06(水) 20:01:09
hppとcppで分けた?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


でも探してたらそれらしいの見つけた
http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=15
どうやらデフォルトコンストラクタは確かに存在するけど
そもそもそれが生成されないようなクラスもあるのか

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

186 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/10/08(金) 18:39:19
Cって書いてあるがな

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

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

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

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

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

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

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

195 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/10/08(金) 22:16:23
はいそうですよ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

213 :デフォルトの名無しさん:2010/10/09(土) 13:52:36
>>211
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.2.4.html

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

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

215 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/10/09(土) 14:02:11
>>214
std::mapを使え

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

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

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

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

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

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

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

223 :220:2010/10/09(土) 21:01:34
>>222
thx

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

http://www.pro.or.jp/~fuji/mybooks/cdiag/appendix.b.html
> プログラミング言語の本は、コンピュータ関連の本の中では寿命の長い方 ですが、
> それでも出版されてから5年程度が寿命です。いつ出版された本かは 必ず確認して買いましょう。

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

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

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

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

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

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

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

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

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

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

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

235 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/10/15(金) 18:16:15
win32スレ行けよ

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

→ >>251 はGCCでは不可能

でOKでつか??

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

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

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

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

263 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/10/16(土) 15:42:01
>>262
お前、頭壊れてない?
>>259と正反対の事言いだすなら、取り消してから言い出せよ。

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

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

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

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

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

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

271 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/10/16(土) 21:14:39
なぜ2ちゃんねるは、技術的な事を質問すると
誰も答えてくれないのですか?

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

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

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

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

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

278 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/10/17(日) 14:22:35
簡単な質問ですが、よろしいでしょうか?

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

296 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/10/18(月) 10:07:34
とりあえずは = と == 間違えてるからかな

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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


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

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

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

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

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

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

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

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


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

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

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

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

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

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

333 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/10/21(木) 16:58:25
p.foo<B<_A> >();
でどうよ

335 :デフォルトの名無しさん:2010/10/21(木) 18:54:55
>>333
http://codepad.org/gT96uQQj
こうかな

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

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

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

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

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

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

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

ありがとうございます

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

365 :デフォルトの名無しさん:2010/10/22(金) 14:28:56
ggrks とは↓
http://d.hatena.ne.jp/keyword/ggrks

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

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

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

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

369 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/10/22(金) 15:12:03
>>367
http://aggregate.org/MAGIC/のLeading Zero Countかな。

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

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

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

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


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


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

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

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

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

378 :デフォルトの名無しさん:2010/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++のプログラム上でどのように一時的にパスを追加するのかです。
よろしくお願いします。

コードのリンクを貼っておきます。
http://codepad.org/w74epWeu

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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


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

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

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

410 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/10/25(月) 16:29:21
やってみたが
http://codepad.org/k2J5s66M
どっちも同じに見えるが

412 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/10/25(月) 16:45:55
_tcschr はマルチバイト文字対応なので buf[1] と buf[2] が合わさって1つの文字とみなされてるんじゃないかと思われ

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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


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

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

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

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

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

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

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

449 :デフォルトの名無しさん:2010/10/26(火) 11:36:44
アホばっか

450 :デフォルトの名無しさん:2010/10/26(火) 12:07:04
>>448
とアホが申しております

451 :デフォルトの名無しさん:2010/10/26(火) 12:08:33
>>448
^^;

452 :デフォルトの名無しさん:2010/10/26(火) 13:07:26
A.V.アホ


453 :デフォルトの名無しさん:2010/10/26(火) 13:40:22
失せろカスども

454 :デフォルトの名無しさん:2010/10/26(火) 13:42:56
カスが一人


455 :デフォルトの名無しさん:2010/10/26(火) 13:54:47
↑カス

456 :デフォルトの名無しさん:2010/10/26(火) 16:41:26
stlのvectorでイテレータの直前(手前)に挿入ってどうやるのでしょうか?


457 :デフォルトの名無しさん:2010/10/26(火) 16:52:18
v.(it, foo);

458 :デフォルトの名無しさん:2010/10/26(火) 17:02:28
iterator insert( iterator itr, const T &value )
iterator insert( iterator itr, size_t num, const T &value )

459 :デフォルトの名無しさん:2010/10/26(火) 17:10:59
>457-458
ありがとうございます。


460 :デフォルトの名無しさん:2010/10/26(火) 17:14:13
すみませんがついでにもう一個しつもんです
find_ifの逆で最後に見つかった要素を返す関数はありますか?

461 :デフォルトの名無しさん:2010/10/26(火) 17:16:47
>>460
rbegin()とrend()を使ってfind_if()を適用する

462 :デフォルトの名無しさん:2010/10/26(火) 17:26:35
あーなるほど、

463 :デフォルトの名無しさん:2010/10/26(火) 17:37:27
但し逆反復子を使った場合はこういう感じで素直な結果じゃないので注意

class Value : public std::unary_function<int, bool> {
int val;
public:
Value(int i) : val(i) {}
bool operator()(int i) const {
return i == val;
}
};

int main()
{
int a[] = {10, 24, 21, 42, 63, 31, 73, 25, 12};
std::vector<int> vi;

for (int i = 0; i < static_cast<int>(sizeof(a) / sizeof(a[0])); i++)
vi.push_back(a[i]);

std::vector<int>::const_reverse_iterator vicr = std::find_if(vi.rbegin(), vi.rend(), Value(12));

std::cout << *vicr << std::endl;

std::vector<int>::const_iterator vic = vicr.base();

std::cout << *vic << std::endl;
std::cout << *(vic - 1) << std::endl;
}

464 :デフォルトの名無しさん:2010/10/26(火) 18:40:12
>>461,463
ありがとうございました。イテレータの理解が深まりました


465 :デフォルトの名無しさん:2010/10/26(火) 19:01:16
逆順イテレーターを戻すといっこズレるのって気持ち悪くね?
なんでこんな仕様なの?禿げはアホなの?

466 :デフォルトの名無しさん:2010/10/26(火) 19:01:45
慣れろ

467 :デフォルトの名無しさん:2010/10/26(火) 19:57:26
http://codepad.org/sXXIG3n2
ずれてたほうが自然に書けるだろ?

468 :デフォルトの名無しさん:2010/10/26(火) 20:04:32
baseは戻すではないよね、、、?

469 :431:2010/10/26(火) 20:36:37
>>432-433
thx

470 :デフォルトの名無しさん:2010/10/26(火) 21:29:33
実際>>463のプログラムでは *vic と逆参照している所はvectorの存在しない
場所の内容を呼び出すのでエラーなんだけどな

ポインタもイテレータも最後の要素の一つ先まで指せるが、逆反復子を使った場合
一番最後を指すのはありなん?配列は明らかにエラーだけど

471 :デフォルトの名無しさん:2010/10/26(火) 21:32:24
ああそうかわかった
そういうエラーを防ぐために逆反復子はわざと一個ずらした所をポイントするようにしてあるんだ
base()メンバ関数で元のイテレータに戻した時にこのエラーが出やすいのでわざとbase()なんて
メンバ関数を呼び出さないと変換出来ないようなややこしい仕組みになってるんだな

472 :デフォルトの名無しさん:2010/10/26(火) 21:38:32
>>468
普通のイテレータを逆順イテレータに変換する時はカッコで囲むだけでOK

vector<int>::iterator pos;
vector<int>::reverse_iterator rpos(pos);

しかし逆順イテレータを普通のイテレータに変換する時にはメンバ関数base()を
呼び出さなくてはならない

pos = rpos.base();

この時に>>470のようなエラーが起きやすいので注意をプログラマに促すために
わざとこのようなくどい方法を採っているのではないかと思う

473 :デフォルトの名無しさん:2010/10/26(火) 21:45:10
質問です。ポインタのリストをメンバに含むクラスをSTLのvectorなどに
載せる場合、コピーコンストラクタでリストごとコピーするように
しなければうごかないでしょうか。かなりめげてますorz

474 :デフォルトの名無しさん:2010/10/26(火) 21:53:05
unique_ptrとかに突っ込んどけばいいんじゃね

475 :デフォルトの名無しさん:2010/10/27(水) 08:22:34
そのリストの実装にコピーコンストラクタがあるなら
そのクラスのデフォルトコンストラクタがあるから
動きはするだろうよ
それでいいのかは知らんが
むしろきっとデストラクタの関係で駄目なんだろうけど

476 :デフォルトの名無しさん:2010/10/28(木) 15:21:32
//a.h
========
class A {
public:
A(void){};
~A(void){};
void foo(void);
void hoge(void);
};

//a_1.cpp
========
#include "a.h"
A::A(void) {}
A::~A(void) {}
void A::foo(void) { /* 普通のソース */ }

//a_2.cpp
========
#include "a.h"
void A::hoge(void) { /* 長いソース */ }

IDEはVisualStudio2008です。
このように分割コンパイルしたいのですが、a_2.cppでLNK2019が出てビルドできません。
externの使えないメンバ関数の定義を、(派生クラスにするのは無しで)
別のファイルに分けられる手法があれば、ご教授願えましたら幸いです。

477 :デフォルトの名無しさん:2010/10/28(木) 15:45:42
A(void){};
~A(void){};

{}はずせ

478 :デフォルトの名無しさん:2010/10/28(木) 15:52:36
すいません。そこは書き間違えました。

479 :デフォルトの名無しさん:2010/10/28(木) 16:04:14
てか、普通に何の問題もないでしょ
リンクエラーはソースを分割したことじゃないと思われ

480 :デフォルトの名無しさん:2010/10/28(木) 16:11:06
返答ありがとうございます。その方向で調べてみます。

481 :デフォルトの名無しさん:2010/10/28(木) 16:31:22
テンプレートクラスでも使ってるんじゃないの?
まあ次からはハイエナ低スキルに噛みつかれないよう気をつけなよ

482 :デフォルトの名無しさん:2010/10/28(木) 22:58:47
c++って本当に何でもできるよね〜
勉強しても勉強しても、知らない文法があるし

483 :デフォルトの名無しさん:2010/10/29(金) 00:25:52
>>473 です。>>474、475
どうもありがとうございます。unique_ptrですか。C++0x?勉強して
みます。結局、コピーコンストラクタを使わないようなテンプレート
クラスを作ったのですが、いつのまにか既存のクラスのコピー
コンストラクタを実装してました( ゚д゚)ポカーン 
いまおこったことをありのまま話すぜ(ポルナレフAA略

484 :デフォルトの名無しさん:2010/10/29(金) 19:03:24
c++では定数定義に#defineよりもconstを使うほうが型も決まっていいんですよね.
"const.h"みたいに一つのヘッダに定数をまとめて定義し,それを複数のファイルでインクルードしている場合は
"const.cpp"に定義を書いて,"const.h"ではexternで宣言するのがウェブでよく紹介されている方法でした.
しかし,この方法だと,リンク時にしか定数の値が各ファイルからは分からないので,
配列を定義するときの添字にはコンパイルエラーで使えません.
ヘッダでconst定数定義をし,それを配列定義の添字に使う方法はないのでしょうか.

485 :デフォルトの名無しさん:2010/10/29(金) 19:25:52
struct ArraySize
{
static int const value = 10000000000000000000000000;
};


int main(void)
{
int array[ArraySize::value]; // Oh. It's cool!!

return 0;
}

486 :デフォルトの名無しさん:2010/10/29(金) 20:44:31
ヘッダにconst int x = 10;
みたいに書いちゃえばいいだけの話じゃないのか
というかそんなアホな方法がよく紹介されてるってマジかよ

487 :デフォルトの名無しさん:2010/10/29(金) 20:55:13
>>485の方法いいね
俺はメモリ取られるのが気に入らないからenumにするけど


488 :デフォルトの名無しさん:2010/10/29(金) 21:07:16
ごめんgcc4.4.5で確認したら取られてなかった。不思議な文法だな。

489 :484:2010/10/29(金) 21:48:27
>>486
複数のファイルからインクルードされるヘッダなので、そのままだと多重定義になってしまいます。
複数の方が提案されてた方法ですし、アホではなく現実的だと思うのですが、
配列定義の添字には使えなくて困っていました。

>>485
ありがとうございます。試してみます。

490 :デフォルトの名無しさん:2010/10/29(金) 22:36:01
>>488
普通の質問なんですけど、
メモリ確保されていないことっていうのは
どうやって確認すればいいのですか?

491 :デフォルトの名無しさん:2010/10/29(金) 22:41:49
>>490
&ArraySize::valueがundefined referenceになったのでそう判断した。

492 :デフォルトの名無しさん:2010/10/29(金) 22:50:20
>>491
まじすか
VC2010で
cout << &ArraySize::value;
で普通にアドレスが出てしまいました
これはコンパイラによるということでしょうか・・・?

493 :デフォルトの名無しさん:2010/10/29(金) 23:03:37
規格書とか読まないので理由は知らない。codepadでも同様のエラー。
http://codepad.org/uAKp27IW

494 :デフォルトの名無しさん:2010/10/29(金) 23:12:25
>>493
なるほど・・・
ありがとうございました

495 :デフォルトの名無しさん:2010/10/30(土) 10:51:40
>>489
多重定義になるわけねーだろ馬鹿

496 :デフォルトの名無しさん:2010/10/30(土) 11:05:10
>>493
>>485
ttp://codepad.org/z10OwQef
根本的なことが間違ってる

497 :デフォルトの名無しさん:2010/10/30(土) 12:20:08
>>489
>ヘッダでconst定数定義をし,それを配列定義の添字に使う方法はないのでしょうか.
この要求に答えるのが
const int x = 10;
なんだが

static にしないと定数扱いにならないんだよ

498 :493:2010/10/30(土) 12:27:40
>>496
普通の書き方はそれだよね。それは知ってる。
ヘッダに書く方法を聞かれてて、そこに初期化を入れてた点がそんなことできるんだ、という点。
ヘッダにしか書かないので自動的に唯一のメモリが確保されてると思った。templateみたいに。
でもアドレスもなく右辺値としてだけ使用される点が不思議だな、と思ったというわけ。

どういうことなのか知っているなら、詳しく教えてくれると嬉しい。

499 :デフォルトの名無しさん:2010/10/30(土) 12:53:21
>>496
定義を別にしなきゃいけないのは非const の時じゃなかったか?


500 :デフォルトの名無しさん:2010/10/30(土) 13:38:42
static const で整数型メンバの場合宣言と同時に定義できる
C++0xなら整数型の制限は外れる

ネームスペーススコープで const int x = 10; と書いても static つけた時と同じ扱い

501 :デフォルトの名無しさん:2010/10/30(土) 13:46:38
TMPの基本だよね

502 :デフォルトの名無しさん:2010/10/30(土) 14:18:36
TMP関係なくね?

503 :デフォルトの名無しさん:2010/10/31(日) 09:33:41
C++のxxx_cast<>()ですが、横に長くなって困ります。

aaa = retnterpret_cast<image_header_section *>(static_cast<hoge_section>(bbb))
2重に重ねただけで、悪夢です。

aaa = retnterpret_cast<image_header_section *>(
static_cast<hoge_section>(bbb))
↑ ここで改行しても意味無しです。

みなさんどのように改行していますか?

504 :デフォルトの名無しさん:2010/10/31(日) 09:56:31
そんな複雑なcastを行わなければならない仕様にしない

505 :デフォルトの名無しさん:2010/10/31(日) 10:57:18
自分でdefineすればええやん

506 :デフォルトの名無しさん:2010/10/31(日) 12:29:20
defineが長くなるのもいやん。

507 :デフォルトの名無しさん:2010/10/31(日) 12:51:29
それぐらい我慢しろよ…
複数行のdefineとか、inlineの代わりに使ってる事結構あるぞ

508 :デフォルトの名無しさん:2010/10/31(日) 13:00:39
行幅が適切な複数行defineは許容範囲。
個人的な特性かもしれないけど、横に長いと視認性が極端に落ちるからいやん。

509 :デフォルトの名無しさん:2010/10/31(日) 13:04:22
現状では制御文をスマートに置換するには#defineしかないしな、BOOST_FOREACHとか
std::for_eachとラムダ式の組み合わせは正直キモイっす

510 :デフォルトの名無しさん:2010/10/31(日) 13:05:32
ハッカーになるとプログラム言語が小説のように読めるようになるから
改行する必要なくなる。
短い方が良いと思ってるうちはおこちゃまということだ。

511 :デフォルトの名無しさん:2010/10/31(日) 13:08:43
ハッカー(笑)

512 :デフォルトの名無しさん:2010/10/31(日) 13:15:36
マジレスした方がいいのかどうか分からない…

513 :デフォルトの名無しさん:2010/10/31(日) 13:19:15
俺が変わりにマジレスしよう。
ハッキングするひとをハッカーと思っている人はおこちゃま。

514 :デフォルトの名無しさん:2010/10/31(日) 13:20:16
hack-hacking
hacker

515 :デフォルトの名無しさん:2010/10/31(日) 13:20:44
書き捨てコードを書いて遊んでるだけの人も広義のハッカー

516 :デフォルトの名無しさん:2010/10/31(日) 13:29:22
だらだらハッカー話が続くのも嫌だからやっぱマジレスするわ

>>510
(笑)


517 :デフォルトの名無しさん:2010/10/31(日) 14:04:22
>>510
小説のように読むためにも、句読点と同じように改行をする必要があると思うのだけれど…

518 :デフォルトの名無しさん:2010/10/31(日) 14:32:10
お前のよく読む大好きな小説は句読点ごとに改行されている
ライトノベルというジャンルということを紹介してくれて有難うwww

519 :デフォルトの名無しさん:2010/10/31(日) 14:36:14
おっさん何歳だ

520 :デフォルトの名無しさん:2010/10/31(日) 14:38:29
いくらラノベだって句点のたびに改行してるわけじゃないぜ

521 :デフォルトの名無しさん:2010/10/31(日) 14:39:06
詩じゃあるまいし

522 :デフォルトの名無しさん:2010/10/31(日) 14:53:38
縦に長いコードは拒否反応が出るよ。
横に長いコードもイヤだけどまだ許せる。

523 :デフォルトの名無しさん:2010/10/31(日) 15:01:33
ヘタレプログラマやな

524 :デフォルトの名無しさん:2010/10/31(日) 15:02:26
>>522
逆じゃね?普通
エディタ何使ってる?

525 :デフォルトの名無しさん:2010/10/31(日) 15:02:58
あれだろ、ワードで縦書きにして書いてるんだろう。

526 :デフォルトの名無しさん:2010/10/31(日) 15:22:54
エディタは何でも使うけど、eclipse/VC/emacs/vim/サクラエディタとかかな

527 :デフォルトの名無しさん:2010/10/31(日) 15:33:24
IDE使ってて横に長いソース見るのってものすごく嫌じゃない?

528 :デフォルトの名無しさん:2010/10/31(日) 15:37:40
monoフォントもやめて、改行は段落ごとにして、
横の長さはエディタの自動改行に任せる
この自然言語風の書き方意外と読み易いけど誰も賛同してくれない

529 :デフォルトの名無しさん:2010/10/31(日) 15:40:59
最近はディスプレイの横の解像度が1920くらいあるから横に長いコード見てもイラっとしなくなった
これ以上解像度上げるとフォントが小さくなりすぎて見難くなるが

530 :デフォルトの名無しさん:2010/10/31(日) 15:50:13
>>527
さすがに全部はみ出てたらイヤだけどそんなのないし

531 :デフォルトの名無しさん:2010/10/31(日) 17:43:31
new Hoge(), new Hoge;は何が違うんですか?

532 :デフォルトの名無しさん:2010/10/31(日) 21:51:53
>>531
カッコ付きは非PODとPODで挙動が異なる

非POD・・・カッコ無しは不定値が入る、カッコありは0で初期化
POD・・・どちらも同じ意味

これもFAQになってきたな

533 :デフォルトの名無しさん:2010/10/31(日) 22:02:14
>>532
逆じゃないか?

534 :デフォルトの名無しさん:2010/10/31(日) 22:18:48
>>533
あ、ごめん逆だった

535 :デフォルトの名無しさん:2010/11/01(月) 12:18:39
>>531-534
検索用に書き直してまとめ。
--
new Hoge(), new Hoge;は何が違うんですか?

カッコ付きは非PODとPODで挙動が異なる

POD・・・カッコ無しは不定値が入る、カッコありは0で初期化
非POD・・・どちらも同じ意味

これもFAQになってきたな
--

536 :デフォルトの名無しさん:2010/11/01(月) 12:22:32
マージソートがわからん誰か教えて
void merge(int data1[], int n1, int data2[], int n2, int data3[]){
int index1, index2, index3, i;
index1 = index2 = index3 = 0;
printf("merge_sort\n");
while(index1 < n1 || index2 < n2){
if(index1 == n1){
for(i=0; i<n2-index2; i++){
data3[index3+i] = data2[index2+i];}
break;}
if(index2 == n2){
for(i=0; i<n1-index1; i++){
data3[index3+i] = data1[index1+i];}
break; }
// data3[index3] に値を代入したい//
for (i=0; i<(2*N) ;i++)
printf("%d,", data3[i]);
printf("\n");}


537 :デフォルトの名無しさん:2010/11/01(月) 12:38:46
もしソースだけ目にして分からないって思えるなら
なんか文章とか絵とかで解説されてるサイトを見るといいよ
マージソートは理屈がかなり簡単なソートだからすぐわかるだろう

538 :デフォルトの名無しさん:2010/11/01(月) 13:27:33
初歩的な質問なんですが
http://users.rcn.com/jcoplien/Patterns/C++Idioms/EuroPLoP98.html#PromoteAndAdd
上記のウェブサイトのソースコードでconst参照仮引数に代入しているように
みえるのですが良くわかりません。
ちなみにisA関数の意味もcomplexExemplarの意味もわかりません。
教えてください。

539 :デフォルトの名無しさん:2010/11/01(月) 13:39:14
マルチすんなカス

770 デフォルトの名無しさん [] 2010/10/31(日) 11:52:29 ID: Be:
初歩的な質問なんですが
http://users.rcn.com/jcoplien/Patterns/C++Idioms/EuroPLoP98.html#PromoteAndAdd
上記のウェブサイトのソースコードでconst参照仮引数に代入しているように
みえるのですが良くわかりません。
ちなみにisA関数の意味もcomplexExemplarの意味もわかりません。
教えてください。

540 :デフォルトの名無しさん:2010/11/01(月) 13:48:18
>>539
別人っす。

541 :デフォルトの名無しさん:2010/11/01(月) 13:53:17
そんな偶然の一致があってたまるか

542 :デフォルトの名無しさん:2010/11/01(月) 13:56:36
一致100%で言い逃れしようとするバカ初めて見たわ

543 :デフォルトの名無しさん:2010/11/01(月) 14:18:03
ん?投稿は別人という意味だが。

544 :デフォルトの名無しさん:2010/11/01(月) 14:24:25
mypaintっていうオープンソースのお絵かきソフトに
photoshopみたいな拡大縮小機能を付けたいけど
それをするのにはc++でおkですか?
OKならまず何が必要ですか?
参考書とかソフトとか何を買えばいいですか?
プログラムはプラスとかビジュアルの付いていないC言語で
ifやforとかで条件分岐させてぐるぐる回すとかの
プログラムの作り方の基本的な部分しか分かりません。
↓mypaintのコード概要
http://wiki.mypaint.info/index.php?title=Documentation/ForDevelopers

545 :デフォルトの名無しさん:2010/11/01(月) 14:27:43
>>537
ありがとうございます、解決しました

546 :デフォルトの名無しさん:2010/11/01(月) 14:49:14
>>544
>Mostly written in Python with PyGTK
と書いてあるんだから、Pythonだろ。
つーか、その程度の英語も読めないようなら無理だと思うぞ。
それとcanvasのzoom機能はあるらしいが、それでは不充分なのか?

547 :デフォルトの名無しさん:2010/11/01(月) 14:51:23
マルチってなんで嫌われるんだろう。。。

548 :デフォルトの名無しさん:2010/11/01(月) 14:57:18
>>547
http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%9D%E3%82%B9%E3%83%88#.E3.83.9E.E3.83.8A.E3.83.BC.E9.81.95.E5.8F.8D.E3.81.AE.E7.90.86.E7.94.B1

549 :デフォルトの名無しさん:2010/11/01(月) 14:59:28
同じ質問をあちこちにポストされると、俺らはその同じ質問を何度も目にすることになる
同じことを何度も何度も訊かれたら鬱陶しい

550 :デフォルトの名無しさん:2010/11/01(月) 15:07:42
単純明快である

551 :デフォルトの名無しさん:2010/11/01(月) 15:10:48
参照があちこちに散らばって管理が大変だから

552 :デフォルトの名無しさん:2010/11/01(月) 15:16:38
マルチは手段であって目的では無いんだよな。
なんでもマルチは悪いと考えるのは思考停止のなにものでもないよ。
投稿されてから一日たっているのや別スレでスルーされていいるのや別人がコピペしているのを考慮すると
これは許されるマルチだと思う。

553 :デフォルトの名無しさん:2010/11/01(月) 15:18:14
んなことない

554 :デフォルトの名無しさん:2010/11/01(月) 15:21:41
じゃあスルーされたり質問者が自己解決して答えが分からない場合はどうしたらいいの?

555 :デフォルトの名無しさん:2010/11/01(月) 15:21:44
>>553
君はプログラミングに向いてないよwww
他逝きなww

556 :デフォルトの名無しさん:2010/11/01(月) 15:22:52
許される許されないの問題じゃないから

557 :デフォルトの名無しさん:2010/11/01(月) 15:28:06
とりあえずスルーされてる原因を考えるよ
被害者面するな

558 :デフォルトの名無しさん:2010/11/01(月) 15:28:23
じゃあニュースは毎日同じことを何度も流すけど許されない犯罪だなwwww

559 :デフォルトの名無しさん:2010/11/01(月) 15:31:46
面白い話題が出てて他の質問スルーすることはよくある
そういう時はスレが落ち着いてから催促すればいいんじゃない
まあ俺はスレ遡ってまで回答しないけど

560 :デフォルトの名無しさん:2010/11/01(月) 15:33:57
>>558
人に聞く行為と人に知らせる行為を一緒にするなよ
頭おかしいの?

561 :デフォルトの名無しさん:2010/11/01(月) 15:35:57
「40歳ニートですけど総理大臣になるにはどうしたらいいですか?」なんて質問にだれも答えたくないだろ?

562 :デフォルトの名無しさん:2010/11/01(月) 15:40:33
無視される質問のみんながみんなそんな質問ではないだろ?

563 :デフォルトの名無しさん:2010/11/01(月) 15:41:57
悪意のあるやつが一番悪い
実生活のストレス解消の場として揚げ足取りを楽しんでいるのだろう

564 :デフォルトの名無しさん:2010/11/01(月) 15:42:25
みんながみんがそうではないってことは
いくらかそういう馬鹿げた質問してる自覚はあるんだ

565 :デフォルトの名無しさん:2010/11/01(月) 15:44:47
君は自分に反論する奴はみんな質問者だと思ってるんだ

566 :デフォルトの名無しさん:2010/11/01(月) 15:45:02
悪意なく嘘を教える奴が最も悪い。
そういう奴は正当な批判も揚げ足取りと思い込んで暴れる。

567 :デフォルトの名無しさん:2010/11/01(月) 15:46:37
>>565
質問者じゃなきゃこんな文句言わねーだろ

568 :デフォルトの名無しさん:2010/11/01(月) 15:48:35
俺の意見はみんなの意見だもんね

569 :デフォルトの名無しさん:2010/11/01(月) 15:49:31
俺はその「みんな」に含めないでくれ

570 :デフォルトの名無しさん:2010/11/01(月) 15:57:48
質問内容がアホだからマルチするなってのはおかしいだろ
それだと高等な質問ならマルチしてもいいってことになるぞ
どうしてマルチが嫌われるか分かってないのにマルチ叩くのもどうかと思うよ

571 :デフォルトの名無しさん:2010/11/01(月) 15:59:33
まともな質問をしかるべき場所ですれば
マルチするまでもなく普通に回答が返ってくるからじゃね?

572 :デフォルトの名無しさん:2010/11/01(月) 16:01:32
ウェブサイトが英語というのが気に障ったんだろうなwww
英語よめないからwwww

573 :デフォルトの名無しさん:2010/11/01(月) 16:11:17
だからスルーされてる原因を突き止めろよ
議論中なうじゃなかったら
スルー = 日本語が支離滅裂、質問内容が明晰でない
数レス上で同じ内容に答えている、態度が生意気、テンプレを使用していない
みたいな質問に答えたくなくなる何かがあるんだろうよ
それを、スルーするのが悪いんだろみたいに逆ギレされても困る
自分は質問者で回答者の顔色を伺ってる意識を持てよ
高飛車なやつに応えたいなんて思うやつは皆無

574 :デフォルトの名無しさん:2010/11/01(月) 16:15:37
>>559


575 :デフォルトの名無しさん:2010/11/01(月) 16:15:59
>>573
どこを縦読み?

576 :デフォルトの名無しさん:2010/11/01(月) 16:18:24
スルーされる原因を突き止められる人ならそのまま質問も自己解決できそうなもんだが

577 :デフォルトの名無しさん:2010/11/01(月) 16:21:02
>>571
アホな質問をする奴は自分の質問がアホな質問だなんて思ってないだろうから、
答えが返ってこなければ>>538みたいに平気でマルチするだろ
しっかりとマルチ=ダメというアホでも分かる境界線を引かないとダメ

578 :デフォルトの名無しさん:2010/11/01(月) 16:22:03
>>576
だから何?
馬鹿だから見逃せっての?
原因が突き止められない馬鹿だからマルチさせてくださいってこと?

579 :デフォルトの名無しさん:2010/11/01(月) 16:28:49
原因を突き止められる人は初めからマルチなんてしないだろ馬鹿ってこと
原因が突き止められない馬鹿に原因を突き止めなさいって長文レスするのが意味ある事だと思ってるの?

580 :デフォルトの名無しさん:2010/11/01(月) 16:33:14
喪舞ら餅付けって(笑)
喧嘩して無意味にスレを消費するより
1レス消費するだけでわかっていてもわざと教えない質問の
答えを書き込んだ方が得だぞ(核爆)

581 :デフォルトの名無しさん:2010/11/01(月) 16:34:09
>>579
原因を突き止めなさいっつてんじゃねーよ
原因突き止めるのが普通なんだからマルチすんなっつってんだよ

582 :デフォルトの名無しさん:2010/11/01(月) 16:35:39
>>580
誰がマルチにこたえるかバーカ^^

583 :デフォルトの名無しさん:2010/11/01(月) 16:44:24
そもそもマルチポストしないというのが一番の得だぞ
マルチポストしても何もいいことがないとわかっただろう
次からは気をつけろよ

584 :デフォルトの名無しさん:2010/11/01(月) 16:44:55
>>581
マルチすんなってのは同意だが、>>573はどうみても原因を突き止めろよと言ってます
わざわざ原因として考えられる要因まで列挙してる心優しいレスです

585 :デフォルトの名無しさん:2010/11/01(月) 16:49:33
俺はバレないようにこそこそマルチポストするやつより
堂々とマルチポストする奴の方が好きだ

586 :デフォルトの名無しさん:2010/11/01(月) 16:49:57
お前の好みは聞いてない

587 :デフォルトの名無しさん:2010/11/01(月) 16:56:57
>>538をかばってる人は、まず質問に答えるべきだ!

588 :デフォルトの名無しさん:2010/11/01(月) 17:06:32
いや、マルチする人はちょっと・・・

589 :デフォルトの名無しさん:2010/11/01(月) 17:10:59
プライドの高い人が多いようだね。
ネタではなく真面目に素直に難しすぎてわかりませんと言える
ような人こそ素晴らしいと思うんだよ。

590 :デフォルトの名無しさん:2010/11/01(月) 17:12:15
ほらな
マルチは悪びれる様子もなきゃ自覚もない

591 :デフォルトの名無しさん:2010/11/01(月) 17:22:18
わからないならレスしないでくださいって偉い人が言ってたから
素直にわかりませんと発言する人はいないと思うよ

592 :デフォルトの名無しさん:2010/11/01(月) 17:28:10
でも分からないということも答えだろ。
もしかしたらみんなわからなくて
未解決問題の一つかもしれないわけだし。

593 :デフォルトの名無しさん:2010/11/01(月) 17:41:23
文字通り誰にも分からない問題なら分かりませんって答えられるけど、
自分には分からないって程度だとわざわざ分かりませんとは書かないな
このスレではそんな問題にお目にかかったことはないが、
サードパーティのライブラリ系のスレとかだと稀によくある話だ

594 :デフォルトの名無しさん:2010/11/01(月) 18:03:31
operator= がconst で実装されてるぐらいしか思いつかないが

595 :デフォルトの名無しさん:2010/11/01(月) 18:07:35
>>538のサイトで紹介されているイディオムを全て教えてくれ

596 :デフォルトの名無しさん:2010/11/01(月) 18:35:13
ここ読めば全部分かるよ
ttp://users.rcn.com/jcoplien/Patterns/C++Idioms/EuroPLoP98.html#PromoteAndAdd

597 :531:2010/11/01(月) 20:51:08
>>532,535
thx

598 :484:2010/11/01(月) 21:01:05
>>486, >>495, >>497
皆さんの指摘を見て,よくよくソースを見直してみると,ちょっとしたtypoでおかしなエラーが出ていたことが原因でした.
修正すると,そのままconst int x = 10;で望み通りの結果が得られました.スレ汚しになってしまい,すみません.
こんな稚拙な質問にも丁寧に答えて頂いてありがとうございました.

599 :デフォルトの名無しさん:2010/11/01(月) 22:30:44
マルチはその掲示板の意向にもよるだろう
思考停止ダメゼッタイとか頭が凝り固まってるのを露呈してる
まあ2chでは基本ご法度ではあるだろうが

600 :デフォルトの名無しさん:2010/11/02(火) 00:13:48
>>546
うぉぉありがとうございます
pythonスレ行きます。
zoom機能じゃなくて画像を変形する感じの機能です。

601 :デフォルトの名無しさん:2010/11/02(火) 00:45:49
ファイル入出力について質問です。
以下のように、ファイル名を受け取って、fopenを使ってそのファイルを開き、その内容を配列にしまって出力する関数があったとします。

void hoge(char *file_name){
// ファイルオープン
fp = fopen(file_name, "rb");
// ファイルサイズの所得
fseek(fp, 0, SEEK_END);
sz = ftell(fp);
fseek(fp, 0, SEEK_SET);
// メモリを確保してファイル読み込み
myPtx = (char*)malloc(sz);
fread(myPtx, 1, sz, fp)
fclose(fp);
printf("%s\n", myPtx);
    free(myPtx);
}

これに対して別のテキストファイル名を指定して二階呼び出したところ、二回目の出力がおかしくなってしまいます。
具体的には、出力の最後に"数字の羅列(一回目のファイルの内容?)+文字化け文字"がくっついてしまいます。
サイズが大きいファイル→サイズが小さいファイルと呼び出せばこのようなエラーは起きません。
メモリ開放はしっかりやってるつもりなのですが、何がおかしいのでしょうか?

602 :デフォルトの名無しさん:2010/11/02(火) 01:42:52
>>601
myPtxの指す文字列に\0のヌル文字が格納されてるか確認してみてはどうだろう
char str[1000];とかにコピーすればデバッガで簡単に見れる

603 :デフォルトの名無しさん:2010/11/02(火) 01:48:31
>>601
テキストファイルの場合
ftellのサイズをfseek以外に使うのは未定義のはず
fgetposでやってみたら?

604 :デフォルトの名無しさん:2010/11/02(火) 10:23:30
>>601
読み込むのはサイズ指定していてナル終端文字列になっていないのだから、そのまま%sで出力しちゃダメ。
printf("%.*s\n", sz, myPtx)として味噌。

605 :デフォルトの名無しさん:2010/11/02(火) 23:13:01
5目並べのクリア条件ってどんな感じでやればいいんですか?

606 :デフォルトの名無しさん:2010/11/02(火) 23:20:26
縦か横か斜めに5つ並んでたらクリアって感じでやればいいのではないんですか?

607 :デフォルトの名無しさん:2010/11/02(火) 23:21:32
全部確認するか置かれた位置から調べるか迷ってます

608 :デフォルトの名無しさん:2010/11/02(火) 23:31:11
自分がプログラムを書きやすい方でいいと思います
試しにどっちかの方法で書いてみて、途中であーなんかこっちは難しそうだと思ったらもう片方にしてみるとかでもいいと思います

609 :デフォルトの名無しさん:2010/11/02(火) 23:34:07
再帰でやればいいんじゃね?

610 :デフォルトの名無しさん:2010/11/02(火) 23:37:21
五つ並んでるのをしらべるのに再帰いるのかね。

611 :デフォルトの名無しさん:2010/11/02(火) 23:41:24
てか最後に置いた石によって並ぶかもしれない5目を調べるだけじゃん?
最大で15通り、碁盤上下左右端付近ならそれ以下
たいした手間じゃないでしょ

612 :デフォルトの名無しさん:2010/11/03(水) 00:11:52
再帰でもループでも簡潔に書ける


613 :デフォルトの名無しさん:2010/11/03(水) 00:13:38
関数型言語ならむしろ再帰で書くのが自然。

614 :デフォルトの名無しさん:2010/11/03(水) 00:15:57
五つ並んでるの調べるのにどこから見たらいいかって話に「再帰で」って
答えも意味不明だな。

615 :デフォルトの名無しさん:2010/11/03(水) 00:20:40
そんなもん置かれた位置からに決まってる



616 :デフォルトの名無しさん:2010/11/03(水) 07:56:43
>>602, >>603, >>604
ありがとうございます
まずfgetposですが、ftellと同じ結果でした
次に配列を用意してデバッグ中に見てみると、szから少し進んだところにNULL文字がありました
szからNULLまでは文字化けした文字で埋められていました
szにはNULL文字が含まれないようです
なので、mallocのときにsz+1分だけ確保して、最後にNULL文字をいれることで解決しました
どうもありがとうございました

617 :デフォルトの名無しさん:2010/11/03(水) 22:54:50
c言語だと文字列の配列はchar *array[] = (ry で作れるけど、
c++でstringの配列はどうやって作るんですか?

618 :デフォルトの名無しさん:2010/11/03(水) 23:01:13
>>617
string array[];

619 :デフォルトの名無しさん:2010/11/03(水) 23:08:59
>>618
感謝

620 :デフォルトの名無しさん:2010/11/04(木) 03:39:27
http://tv.dee.cc/jlab-maru/s/maru1288784023362.jpg
このコードの解説をしていただけませんか?

621 :デフォルトの名無しさん:2010/11/04(木) 04:02:02
>>620
半径rの円を描く時のコード
角度0.02πラジアンごと点の座標を1回転分出力してる
っていうかこれコード間違っててコンパイルできねぇ

622 :デフォルトの名無しさん:2010/11/04(木) 04:08:46
>>620
・もし様々なことに目をつぶってどういうプログラムかを知りたいなら
→半径1の円周上のxy座標を角度0.02πradごとにx軸から画面表示する

・もし様々な突っ込みどころについてなら
→二行目の時点でコードを投げ捨てる

623 :デフォルトの名無しさん:2010/11/04(木) 05:53:01
>>620
2行目ワロタ

624 :デフォルトの名無しさん:2010/11/04(木) 06:02:48
すたじお☆えっち

つまりエロゲの開発コードだよ

625 :デフォルトの名無しさん:2010/11/04(木) 06:09:06
{}もねえな

626 :デフォルトの名無しさん:2010/11/04(木) 06:12:58
>>624
(´・ω`・)

627 :デフォルトの名無しさん:2010/11/04(木) 07:31:31
カウンタをfloatで実装するのは感心しない

というかコレスタッフが書いたのか?

628 :デフォルトの名無しさん:2010/11/04(木) 09:44:42
ring1.cという意味のないコメントも考慮して
全く分からない奴が、どっかから手動でコピペしたと考えるのが妥当だろうな
紙媒体から手打ちで写したんじゃないかしら


629 :デフォルトの名無しさん:2010/11/04(木) 10:16:04
>>616
そして敢え無く無視される>604。出力が目的なら、無駄に1バイト確保する必要なんてないのに。

630 :デフォルトの名無しさん:2010/11/04(木) 10:29:26
本人乙

631 :デフォルトの名無しさん:2010/11/04(木) 10:35:52
で?

632 :デフォルトの名無しさん:2010/11/04(木) 11:21:05
>>620
ttp://www.esa.c.u-tokyo.ac.jp/ujis2dir/200606_01.pdf

633 :デフォルトの名無しさん:2010/11/04(木) 14:11:19
>>620
コンパイルエラーわろたwww

634 :デフォルトの名無しさん:2010/11/04(木) 14:50:39
studio.hってテレビ局のスタッフがつい打っちまったんだろうな。

635 :デフォルトの名無しさん:2010/11/04(木) 15:02:20
マジレスすると、
コンパイル出来るかどうかなんて
どんなコンパイラーを使うかどうかが決まってないと意味無いと思う。
もっとマジレスするとテレビの背景として使うソースコードが
コンパイル出来るかどうかなんてどうでも良い。

636 :デフォルトの名無しさん:2010/11/04(木) 15:45:37
マジレスすると、
#include <studio.h>
そのコードで正常にコンパイルできるコンパイラは使いたくない

637 :デフォルトの名無しさん:2010/11/04(木) 15:58:12
copy stdio.h studio.h

638 :デフォルトの名無しさん:2010/11/04(木) 16:06:19
飾り鋲入出力

639 :デフォルトの名無しさん:2010/11/04(木) 17:07:33
実は遠まわしにインド人IT技術者を揶揄する意図で書かれたテロップだとしたら…

640 :デフォルトの名無しさん:2010/11/04(木) 17:23:20
だが待ってほしい、そもそもC/C++だというのが思い込みなのではないか

641 :デフォルトの名無しさん:2010/11/04(木) 18:59:44
最初のコメントに.cって書いてありますけど…

642 :デフォルトの名無しさん:2010/11/04(木) 19:18:51
拡張子.cのインド発新言語かもしれん

643 :デフォルトの名無しさん:2010/11/04(木) 19:21:06
カレー言語か

644 :デフォルトの名無しさん:2010/11/04(木) 20:31:35
>>620
番組スタッフが適当に作ったんだろうな。

645 :デフォルトの名無しさん:2010/11/04(木) 20:44:33
俺らだってゲームのマップ作るとき地質学とか建築学とか考えないで適当に作るだろ (考えて作ってる人いたらごめんなさい)
気にしたら負けだと思う

646 :デフォルトの名無しさん:2010/11/04(木) 20:48:09
ネットとかから適当にコピったりしたらまずいと思って、
わざわざ手打ちしたんだろうな。
ほほえましいタイポから考えると。

647 :デフォルトの名無しさん:2010/11/05(金) 03:16:48
てかマでも素でstdio.hをスタジオヘッダーって読んでる奴いるしな

648 :デフォルトの名無しさん:2010/11/05(金) 04:56:50
ス'タ'ジオの母音はどこいったのか感

649 :デフォルトの名無しさん:2010/11/05(金) 06:08:26
SCSI「呼んだ?」

650 :デフォルトの名無しさん:2010/11/05(金) 09:39:11
す・・・スクシー

651 :デフォルトの名無しさん:2010/11/05(金) 13:56:06
Cのヘッダー名もCP/M時代からの8文字の縛り(?)かもしれないし、
関数名に至っては開発当時の環境の貧弱さから6文字までしか
識別子は認識せず後は無視するようになっていた

そのためCの関数やヘッダーはあのような妙な短縮形が多いんだろう
特にstring.hの関数名の分かりにくさは最悪

652 :デフォルトの名無しさん:2010/11/05(金) 18:15:18
宿題についての相談です。
正の整数をキーボードから入力し、1からその整数までの和を計算し、出力するプログラムをfor文を用いて書け

というものなのですが、どのように書けばいいでしょうか。

653 :デフォルトの名無しさん:2010/11/05(金) 18:18:23
宿題スレいけばすでに答えが出てる

654 :デフォルトの名無しさん:2010/11/05(金) 18:51:23
int *p;
int* p;
書き方が違うだけで同じ意味でしょうか?

655 :デフォルトの名無しさん:2010/11/05(金) 18:53:27
同じ意味です

656 :デフォルトの名無しさん:2010/11/05(金) 18:54:49
int*p;
int * p;
などのように書いてもいいぞ

657 :デフォルトの名無しさん:2010/11/05(金) 18:57:40
identify<int *>::type p;
こう書くのが最も優秀です

658 :654:2010/11/05(金) 19:01:53
>>655-657
回答ありがとうございます
勉強になりました

659 :デフォルトの名無しさん:2010/11/05(金) 19:11:00
>>654
int *p; これは*pについて。*pはintを入れるんですよってこと
int* p; これはpについて。pはint*を入れるんですよってこと

int*p;
int * p;
これらは最初の2つのどちらとも取れる手抜き書き方
つまり、読み手に任せるよってこと。

660 :デフォルトの名無しさん:2010/11/05(金) 19:21:17
配列の中の値を入れ替えるにはどうすればいいのでしょうか?
例えば、配列の中の最小値を求めて、その最小値を配列の中の値の一つに上書きする
といった感じです。
お願いします。

661 :デフォルトの名無しさん:2010/11/05(金) 19:35:21
配列の中の最小値を求めるには、まず配列の最初の値を調べて変数に覚えます
それから配列の残りの値を順に見ていって、覚えた変数の値と今見てる配列の値の小さい方を変数に覚えます
それを配列の最後まで繰り返したら、覚えてる変数の値が配列の中の最小値ですので、
その最小値を配列の中に好きなように上書きすればいいです

662 :デフォルトの名無しさん:2010/11/05(金) 19:42:40
たとえば最小値を先頭と入れ替えるならこうだ
http://codepad.org/0AodnlXs

663 :デフォルトの名無しさん:2010/11/05(金) 19:42:43
それをC++で記述お願いします。

664 :デフォルトの名無しさん:2010/11/05(金) 19:48:54
ありがとうございます。そしてごめんなさい。
質問間違えましたorz

最小値を上書きするのではなく、その最小値に+1した値を、でした。
申し訳ないです。。。

665 :デフォルトの名無しさん:2010/11/05(金) 19:53:06
いつのまにか書き込みが!
規制で携帯から失礼してますorz


>>662
こんなページあるんですね。分かりやすいです。
ありがとうございます。

666 :デフォルトの名無しさん:2010/11/05(金) 20:19:10
>>659
嘘教えるな。その説明はint* p,q;で破綻する。

667 :デフォルトの名無しさん:2010/11/05(金) 21:39:21
すみません。
3KBのBYTE配列に (※4バイトずつ利用)
変数(int型とfloat型)5〜20個(毎回一定ではない個数)を1セット。
それを3〜30セット入れています。

毎回一定ではない個数なので、
あらゆる間仕切りに「特定の整数」を使いたいのですが、
floatがその「特定の整数」と同じビットの並びを起こさないかが不安でなりません。

また、同じ並びを検出する事はできるのですが、
下手にfloatの値を動かすと誤差では済まない事になったり、
別の「特定の整数」と化す恐れがないかという不安が・・

どなたか、何か良い回避方法があれば教えて頂けますと幸いです・・orz


668 :デフォルトの名無しさん:2010/11/05(金) 21:42:54
先頭に個数でも入れとけばいいんじゃないの

669 :デフォルトの名無しさん:2010/11/05(金) 21:45:19
データ種別をあらわす1バイトを先行させる。

670 :デフォルトの名無しさん:2010/11/05(金) 22:42:04
配列に入れる際にfloatが特定の整数と同じになったかどうかチェックして同じになってたら 1ulp ほどずらす ・・・あんまりいい方法じゃないと思うけど

671 :デフォルトの名無しさん:2010/11/05(金) 22:43:52
先頭にインデックステーブルを持つ

672 :デフォルトの名無しさん:2010/11/05(金) 22:57:51
>>667
intとfloatがグチャグチャに混在すんの?

673 :デフォルトの名無しさん:2010/11/05(金) 23:45:44
派生クラスの方でコンストラクタによる初期化を行うつもりのプログラムなのですが以下のようなエラーが出ます。
理由を考えてみたのですが良く分からなかったので初歩的な質問ですがお願いします。

エラー E2312 oko.cpp 20: 'Basic::height' は曖昧でない基本クラス 'Human' ではない(関数 Human::Human() )
エラー E2312 oko.cpp 20: 'Basic::weight' は曖昧でない基本クラス 'Human' ではない(関数 Human::Human() )

http://codepad.org/gxrFs0NE

674 :デフォルトの名無しさん:2010/11/05(金) 23:55:39
ttp://codepad.org/jztC5D5W
派生クラスのコンストラクタで基底クラスのメンバ変数は弄れません
基底の方のコンストラクタで設定するがよろし

675 :デフォルトの名無しさん:2010/11/06(土) 00:01:15
for文でループを

const int N=hoge;
for(int k=0;k<N;++k) {
cout << "a" << endl;
(中略)
cout << "b" << endl;
}

のように書いたときに,
「b」と出力したきりプログラムがフリーズするということが起きています.
中略部分は事情があって具体的にはここには書けませんが,少なくともカウンタkに手をつけるような処理はしていません.
おおまかには中略部分で反復計算をやって,条件をみたしたらbreak,Nを最大反復回数とする処理です.
色々と経過を吐かせると,もちろん脱出条件は満たしてはおらず,次反復への処理を終えて,
次のループに進もうとするまさにそのときにフリーズしてしまっています.
この場合,どのようにしてデバッグするのが良いでしょうか.

676 :デフォルトの名無しさん:2010/11/06(土) 00:02:00
>>674
基底クラスの方のコンストラクタで何もしないように定義して後から実行される派生クラスのコンストラクタで
メンバ変数を初期化しようとしていましたが良く分かりました。
ありがとうございました。

677 :675:2010/11/06(土) 00:04:33
書き忘れました.
コンパイラはGCC,Intelコンパイラ両方を試し,両方共全く同じ段階でストップします.
OSはLinux,最適化は-O0,-O1, -O2, -Osで再現します.

678 :デフォルトの名無しさん:2010/11/06(土) 00:05:09
>>675
bの後でフリーズするなら
そのあと1行ずつ実行すりゃわかるだろ

679 :デフォルトの名無しさん:2010/11/06(土) 00:07:07
(中略)にバグがあるとしか。バグ可能性はメモリー破壊

680 :デフォルトの名無しさん:2010/11/06(土) 00:08:27
gdb?

681 :デフォルトの名無しさん:2010/11/06(土) 00:46:37
>>676
何度も質問すみません。
もし派生クラスから基底クラスのメンバ変数を変更したいならば
派生クラスで初期化の関数を作る方法ぐらいなんでしょうか?

682 :デフォルトの名無しさん:2010/11/06(土) 00:56:37
代入すれば?

683 :デフォルトの名無しさん:2010/11/06(土) 00:58:49
>>682
そうですねw
出来たらコンストラクタみたいに実装したかったので

684 :デフォルトの名無しさん:2010/11/06(土) 01:00:34
ttp://codepad.org/eF9aYxGQ
コンストラクタで代入してもいいのよ

685 :デフォルトの名無しさん:2010/11/06(土) 01:06:35
>>684
初期化ばっかり考えてたので全く頭に浮かびませんでしたw
代入の場合は派生クラスのコンストラクタでも基底クラスの値は変更できるんですね。
回答ありがとうございました。

686 :デフォルトの名無しさん:2010/11/06(土) 02:31:23
>>673
http://codepad.org/HhGsSayU

基底クラスのメンバ変数をコンストラクタ形式で初期化する事はできない
引数付きのコンストラクタで初期化する事

687 :デフォルトの名無しさん:2010/11/06(土) 03:46:47
シリアルポートで通信するクラスで
すでにopenしてるポートを再度openしようとしたら例外もしくはassertしたいのですが
対象のポートが使用済みかどうかを判別する方法はないでしょうか?

688 :デフォルトの名無しさん:2010/11/06(土) 16:09:54
ダイナミックライブラリを作るときは
関数の前に
__declspec(dllexport)、__declspec(dllimport)
を付けて

スタティックライブラリのときは、消す必要がある?(消さないとそのライブラリを使った時リンクエラーがでた)

つまり#defineでダイナミックライブラリとスタティックライブラリを分ける必要がるの?

689 :デフォルトの名無しさん:2010/11/06(土) 16:10:01
double c[0][1]=1;
double x = 1;
if( tan(sita) * x == c[0][1] ){
printf("hoge");
}

tan(sita) は1になるようにしてあります。
実行してみると「hoge」と出力されません。
判定式には三角関数を使ってはいけないなどあるのでしょうか?

690 :デフォルトの名無しさん:2010/11/06(土) 16:19:26
>>689
そんなことはありませんが、 double 型の値には計算誤差が含まれるものですので
== で比較した場合は、ぴったり完全に誤差なく 1 が得られたときしか出力されません
double は 17 桁くらいの精度がありますから、
printf("%.17f\n", tan(sita) * x);
などとしていちど値を確認してみてください

あとどうでもいい話ですが、θは sita じゃなくて theta です

691 :デフォルトの名無しさん:2010/11/06(土) 16:30:39
>double c[0][1]=1;
double c[1][2];
c[0][1] = 1;
こうじゃなくて大丈夫なのか?

692 :デフォルトの名無しさん:2010/11/06(土) 16:55:29
>>688
はい

693 :デフォルトの名無しさん:2010/11/06(土) 16:58:59
>>688
生成物が変わるんだから宣言変えなきゃダメだろう。

694 :デフォルトの名無しさん:2010/11/06(土) 17:07:19
>>689
不動小数点の=比較は誤差を考えて、
if( abs(A-B) < 10^-6) とかやった記憶がある。

695 :デフォルトの名無しさん:2010/11/06(土) 18:36:21
>>694
ありがとうございます。
その方法で解決できました。

696 :デフォルトの名無しさん:2010/11/07(日) 11:19:50
lseekの頭の"l"って何の略ですか?

697 :デフォルトの名無しさん:2010/11/07(日) 11:36:19
long

698 :デフォルトの名無しさん:2010/11/07(日) 12:12:59
>>697
ありがとうございます。

699 :デフォルトの名無しさん:2010/11/07(日) 23:51:15
マウスイベントメッセージを使用せずにマウスクリックの情報を取得する方法はありますか?
WM_LBUTTONDOWNではなく、GetKeyStateのようなこちらから確認する方法です
お願いします。

700 :デフォルトの名無しさん:2010/11/07(日) 23:55:40
自分で書いてるじゃん

GetKeyState(VK_LBUTTON)

701 :デフォルトの名無しさん:2010/11/08(月) 00:25:28
>>700
ああ!それで大丈夫でしたか!
ありがとうございます。助かりました。

702 :デフォルトの名無しさん:2010/11/08(月) 00:26:10
>>700
おお!それで大丈夫でしたか!
ありがとうございます。助かりました。

703 :デフォルトの名無しさん:2010/11/08(月) 00:27:33
これはどう解釈したら良いのだろうか、

704 :デフォルトの名無しさん:2010/11/08(月) 00:58:27
これはどう解釈したら良いのだろうか、

705 :デフォルトの名無しさん:2010/11/08(月) 00:58:44
僕にはわからない

706 :デフォルトの名無しさん:2010/11/08(月) 01:04:20
僕にはわからない

707 :デフォルトの名無しさん:2010/11/08(月) 08:28:04
多分キーボードにしか使えないと思ってたんじゃないだろうか

708 :デフォルトの名無しさん:2010/11/08(月) 11:03:58
多分キーボードにしか使えないと思ってたんじゃないだろうか

709 :デフォルトの名無しさん:2010/11/08(月) 12:55:57
タグみたいなのあるじゃないですか。
それでタグみたいなやつを作るには
class A{};
static const int A=1;
typedef int A;
上記のうちのどれが最適ですか?
ちなみにtypedefはint Aとint Bはべつものになりますか?

710 :デフォルトの名無しさん:2010/11/08(月) 13:03:22
日本語でおk

711 :デフォルトの名無しさん:2010/11/08(月) 13:28:26
iterator_tag でも参考にしろ。

712 :デフォルトの名無しさん:2010/11/08(月) 16:25:51
for(i=1;i<10;i++)
{
if(no[i] < i_min)
{
i_min = no[i];
a = i;
}
no[a] = i_min+10;


これを10回繰り返したいのですが、どうすればいいんでしょうか?
具体的には配列の最小値を選び、その最小値に+10をして、もとの値に入れる

といった動作です
お願いいたします。

713 :デフォルトの名無しさん:2010/11/08(月) 16:45:50
forで括れよ

714 :デフォルトの名無しさん:2010/11/08(月) 16:50:35
>>712
int j;

for ( j=0 ; j<10 ; j++ ){
i_min = no[0] ;
a = 0 ;
for(i=1;i<10;i++)
{
if(no[i] < i_min)
{
i_min = no[i];
a = i;
}
}
no[a] = i_min+10;
}

715 :デフォルトの名無しさん:2010/11/10(水) 19:11:42
ビットフラグの定義を

#define A_ENABLE 0x00000001
#define B_ENABLE 0x00000002
#define C_ENABLE 0x00000004
#define D_ENABLE 0x00000008

みたいに書いている同僚がいたので


#define A_ENABLE (1 << 0)
#define B_ENABLE (1 << 1)
#define C_ENABLE (1 << 2)
#define D_ENABLE (1 << 3)

のほうがいいと思ったので指摘したんだけど、こんなものは会社によって
書き方のルールは違うからどっちでもいいみたいなことを言われました。

マイコン用のライブラリとかでは後者の書き方をよくみかけるし、
ビットフラグだということがわかりやすいので、後者で統一しようと
考えているんだけど、おかしいですかね。。。?



716 :デフォルトの名無しさん:2010/11/10(水) 19:14:15
>>715
どっちでもいいし、デバッガで見たときなどに計算しなくてすむぶん上の方がいいという考え方もありうる。

717 :デフォルトの名無しさん:2010/11/10(水) 19:28:40
ありがとうございます。

ただ、デバッガでみるときはビットがたっているか、いないかで確認するので
表示は16進表記じゃなく、2進数表記に切り替えると思いますがどうでしょうか?

やっぱりもともとビット単位で表現するものをわざわざ16進表記にするのは
余計な脳内変換が必要なのでそうする理由がよくわからないのですが、ほかに
デバッガでの表示が容易という点以外に何か利点はありますでしょうか?


718 :デフォルトの名無しさん:2010/11/10(水) 19:58:25
2、8、16進数の相互変換は見た瞬間出来るぐらいでちょうどいいよ

719 :デフォルトの名無しさん:2010/11/10(水) 21:41:06
A_ENABLEの定義を見ただけでフラグに何ビット使うかわかるとか

720 :デフォルトの名無しさん:2010/11/10(水) 22:54:07
>>15
1ビットだけ立つならそれでもいいが、複数立てる場合は前者が直感的にいい。
もちろん、頭の中で瞬時にビットのイメージがわくからね

721 :デフォルトの名無しさん:2010/11/10(水) 23:22:22
>>720
どういうこと?マクロの使用箇所は関係ないと思うが。

722 :デフォルトの名無しさん:2010/11/10(水) 23:42:21
>>715
そんなビミョーこと指摘しても認めるわけないだろ。

マニュアルに書いてあるようなことでも絶対認めないような
連中とかゴロゴロいるくらいだし。

「SQLでbetween禁止な。インデックスがきかないから」

「(各種証拠をみせて)インデックスききますよ」

「いままでずっとそうだから、とにかくbetwennは禁止だ」

みたいな。

723 :デフォルトの名無しさん:2010/11/10(水) 23:53:48
>>722
まあ指摘が細かいことはわかっているんだけど、こういう糞コードで
どんどん汚染されていくのを黙ってみてられないんだよね・・・


724 :デフォルトの名無しさん:2010/11/11(木) 00:23:30
>>723
bit立てるのにbit長キメウチは汎用性ないからな
でも、A_ENABLE ってのはちょっとセンスないな

#define BIT_0 (1 << 0)
#define BIT_1 (1 << 1)
#define BIT_2 (1 << 2)
#define BIT_3 (1 << 3)
....
とか位にしてくれ
BIT_0 || BIT_3 とかするときにどのbitが建っているか解りやすい

725 :デフォルトの名無しさん:2010/11/11(木) 00:26:57
BIT_0 | BIT_3 だった

726 :デフォルトの名無しさん:2010/11/11(木) 00:45:26
#define BIT(n) (1 << (n))

727 :デフォルトの名無しさん:2010/11/11(木) 00:48:04
#define A_ENABLE 0x100000000
#define B_ENABLE (1 << 32)

intが32ビット以下のときAはlong long等になるがBはint 0
シフトするなら環境依存の有効ビット幅を意識せずにはいられない

728 :デフォルトの名無しさん:2010/11/11(木) 01:03:21
>>722
だって日本ではドカタと呼ばれている底辺職種の人たちだよ
>>723 だから、細かいことはあまり気にするな

729 :デフォルトの名無しさん:2010/11/11(木) 01:05:11
情報産業がなければ何もかも回らなくなるのに土方とか言われてなんでこんな立場低いのかね

730 :デフォルトの名無しさん:2010/11/11(木) 01:22:59
>>729
プログラマに低脳多いから、立場が低いじゃないか
わが社の主業務は人貸しですってとこ多いし。売買の対象となる人の立場が高いなんてありえないよ。
自社製品を売って金を稼ぐ会社か元受に近い会社じゃないと、プログラマ==ドカタって扱いになるんじゃないか

731 :デフォルトの名無しさん:2010/11/11(木) 07:44:06
本物の土方だっていなくなれば大変だからな
いなくなれば困るなんてのは立場には関係ないわな

732 :デフォルトの名無しさん:2010/11/11(木) 12:54:09
プログラマーは30過ぎるとSEにジョブチェンジされるんだからいいじゃん。
土方は定年まで土方だよ。

733 :デフォルトの名無しさん:2010/11/11(木) 14:30:22
数千行のプログラムである処理を行うとき、
関数の引数としてポインタを利用する場合とグローバル変数を
用いる場合ではどのような違いがありますでしょうか?

734 :デフォルトの名無しさん:2010/11/11(木) 14:30:22
ひ、ひじかた…

735 :デフォルトの名無しさん:2010/11/11(木) 14:34:27
グローバル変数は極力使わないようにするべき

736 :デフォルトの名無しさん:2010/11/11(木) 15:14:44
グローバル変数を使うと悪意を持った同僚がバグを仕込む確率が高くなります

737 :デフォルトの名無しさん:2010/11/11(木) 15:28:41
関数コールの時にスタックに積まない分、グローバルの方が早いって事?

738 :デフォルトの名無しさん:2010/11/11(木) 15:40:55
>>733
仕様をいちいち客に問い合わせるか、
仕様書を見るかの違い。

739 :z:2010/11/11(木) 16:54:20
C言語で分からない問題があります。
{if-else文} 身長と体重のデータを読み込み、下の定義から体型を判定するプログラムを作成せよ。

定 義:身長h(cm),体重w(Kg)とすると

w < (h-95)*0.82 やせすぎ(SLIM)

w > (h-95)*1.10 ふとりすぎ(FAT)

その中間 正常(NORMAL)



740 :デフォルトの名無しさん:2010/11/11(木) 16:56:19
マルチしね

741 :デフォルトの名無しさん:2010/11/11(木) 17:41:13
>>737
誤差らしい

742 :デフォルトの名無しさん:2010/11/12(金) 11:29:00
>>737
最近のコンパイラはstaticな関数はどんどんインライン展開してしまうのでスタックに積むコストはなくなる場合が多くなります。
また、グローバル変数はCPUキャッシュの外にある場合があるので、アクセスコストが馬鹿にならない場合があります。

そんなことよりも、それが問題になるようなレベルの高速化をする前にやることは腐るほどあるので、保守性を上げる為に
どうしても必要がある場合以外はグローバル変数は禁止の方向で。まして、externで外部変数を参照するなんて以ての外。

743 :デフォルトの名無しさん:2010/11/12(金) 12:15:27
>>733
マルチスレッド化に際し、大きな障害になる。

744 :デフォルトの名無しさん:2010/11/12(金) 16:14:21
応用的なクラスを効率とか安全性考えて試行錯誤するんだけどstlとかboost使ってとりあえずでやっつけたほうが良いものが出来上がって悲しい

745 :デフォルトの名無しさん:2010/11/13(土) 08:38:18
>>744
俺たちの代わりに試行錯誤してくれたんだと考えれば悲しくない。

746 :デフォルトの名無しさん:2010/11/13(土) 19:14:16
DirectXでゲームを作ってます

外部ファイルで持たせてあるデータのロードに失敗した時に、
エラーメッセージを表示して強制終了したいのですが、
MessageBox()関数には引数として、hwndが必要です。

クラス設計を進めていくと、わざわざ全てのクラスのコンストラクタに
hwndを渡すのが煩わしいのですが、他の方法はないでしょうか?

hwndをグローバル変数で持たせる、という方法も思いついたのですが、
エラーメッセージのために、普通、そこまでするものでしょうか?

ちなみに、_ASSERT_EXPR()は、リリース時には動かないので、除外してください

747 :デフォルトの名無しさん:2010/11/13(土) 19:50:19
例外を投げてUIを扱えるところまで戻ったところでcatchする

748 :デフォルトの名無しさん:2010/11/13(土) 19:57:00
>>746
言わんとするところは分かるが根本的な設計が間違ってる

ウィンドウハンドルみたいなハード依存部分を
グローバルスコープで参照したり各クラスオブジェクトに渡すのは良くない
ハードに依存する部分としない部分はキッチリ分けないと再利用性が無くなる

あと、その言い方だとたぶん
各オブジェクトごとにファイルを読んでインスタンスを生成するような設計っぽいけど
それだと同じファイルを使うオブジェクトを複数生成するときに
オブジェクトの数だけ読み込みを行わなくならなくならないか?

やるべきことはデータロード部分と各クラスオブジェクトを分離すること
まずデータロードクラスなりを1つ作って
データ読み込みは全てコイツが行う
ウィンドウハンドルもこコイツだけが内部で知ってれば良くて
メッセージ表示等も全てコイツがやる

各クラスオブジェクトはこのデータロードクラスで
読み込んだデータを参照してインスタンスを生成し
それ自身はファイルの読み込みはしないようにする

749 :デフォルトの名無しさん:2010/11/13(土) 19:59:00
なるほど!

750 :デフォルトの名無しさん:2010/11/13(土) 20:11:08
>>748
便乗して質問してしまうが「データの参照」って具体的にどうやって書けばいいの?


751 :デフォルトの名無しさん:2010/11/13(土) 20:17:36
>>746
コンストラクタとか関数の引数全てにhwnd渡すぐらいなら、
グローバル変数の方がいい

どうしても気なるなら、staticな変数にhwndを覚えるようなクラスを作って、
メッセージボックス表示をそのクラスで行なうとか

752 :デフォルトの名無しさん:2010/11/13(土) 20:22:51
強制終了ならFatalExceptionとか作ってスローしてmainでキャッチすればいいじゃん

753 :デフォルトの名無しさん:2010/11/13(土) 21:41:33
>>746
けっこうみんな悩んでるからここで聞いて解決する問題じゃないと思う

754 :デフォルトの名無しさん:2010/11/14(日) 09:59:54
constってクラスをインスタンス化する時に、何度も初期化されるの?

755 :デフォルトの名無しさん:2010/11/14(日) 11:12:33
>>746
>クラス設計を進めていくと、わざわざ全てのクラスのコンストラクタに
>hwndを渡すのが煩わしいのですが、他の方法はないでしょうか?
エラー表示に使わないようなパラメータをコンストラクタで渡していくのは煩わしいし蔵設計がいびつになることは確かにある。

その手の問題は、エラー表示クラスを作って、そのクラスのプライベートstaticメンバー変数にアプリ初期時に
エラー表示に使うウインドウハンドルを設定して置くようにしている。
staticメンバー変数も結局はグローバルなんだけどプライベートstaticメンバー変数であれば、
初期化タイミングがはっきりするし変更不可にもできるし、ただのグローバルよりはマシ。

でもね、ひとつだけいえることはMessageBoxのhWndは0でもOKなんだよ

756 :デフォルトの名無しさん:2010/11/14(日) 20:25:59
うん。普通にNULLでいいじゃない。

757 :デフォルトの名無しさん:2010/11/14(日) 21:14:33
NULLで渡してフルスクリーンモードでメッセージボックスでて死ぬに1票

758 :デフォルトの名無しさん:2010/11/14(日) 21:28:12
解像度変更&フルスクリーンの上にコモンダイアログを表示するゲームとかあったな

759 :デフォルトの名無しさん:2010/11/14(日) 23:01:28
>>732
一応スーパープログラマ呼ばわりされてたけど、30過ぎたあたりでクラスチェンジすることなく燃え尽きた。
趣味でコーディングは、するけど…もうSEもプログラマも辞めた。
なにをもってスーパーなのか知らんが、そう呼ばれてた時期が長かったな
納期2週間を2時間、処理で20時間掛かるコードの最適化で6時間まで短縮
ひらめきプログラマなんで同じコードが書けないのが短所かw

760 :デフォルトの名無しさん:2010/11/14(日) 23:07:06
聞かれてもいないのに自分語り気持ち悪い


761 :デフォルトの名無しさん:2010/11/14(日) 23:10:01
プログラミングは得意だが一般常識もコミュ力も無いとかで
「スーパープログラマーくん(笑)」とか呼ばれてたんだろどうせ

762 :デフォルトの名無しさん:2010/11/14(日) 23:13:09
>>759の文章からはそんなスーパーとか言われるような知性を読み取ることはできないな

763 :デフォルトの名無しさん:2010/11/14(日) 23:13:15
スーパーを名乗るなら20時間が6分位じゃないと。

764 :デフォルトの名無しさん:2010/11/14(日) 23:30:40
自分語りすると叩かれる見本

765 :デフォルトの名無しさん:2010/11/14(日) 23:32:33
自分にとってどうでもいい短所を混ぜつつ譲れない点を自慢するのがミソ

766 :デフォルトの名無しさん:2010/11/14(日) 23:48:09

   \み会行きたくない…   orz   ……orz     /orzorzorzorzorzorzorzorzorzorz
. .: : : : : \  orz   orz  彼女にアニオタだってバレ/orzorzorzorzorzorzorzorzorzorz
. .: : : : : : : \ノジョにフられた……   orz  …    /orzorzorzorzorzorzorzorzorzorz
    . . : : : \  ……    orz     友達と喧嘩/ ■■■  ■ ■■ ■■■■■
   . . .... ..: : ::\orz   女の子のアドレス30件しか /■    ■  .■        ■
        Λ_\ ……orz   …orz     /  ■    ■ ■        ■
 リア充→ /:彡ミ゛ヽ;\ …     経験人数が一/  .■    .■ ■      ■
      / :::/:: ヽ、ヽ、\ … ∧∧∧∧∧   /    ■■■  .■     ■■■■■
      / :::/;;:   ヽ ヽ ::l\<     自  >/ orzorzorzorzorzorzorzorzorzorzorz
 ̄ ̄ ̄(_,ノ  ̄ ̄ ̄ヽ、_ノ ̄<      虐  > orzorzorzorzorzorzorzorzorzorzorz
                <      風  >orzorzorzorzorzorzorzorzorzorzorz
―――――――――――<  の   自  >――――――――――――
36 名前:学生さんは名前 <  予   慢  >   OTL  セックスしすぎて…
東大に入って、昨日の駒 <  感      > OTL  彼女が… orz
彼女に運ばれて、今日の <  !!       >     高学歴なのに… orz
                 /∨∨∨∨∨\ 友達が… OTL mixiで…
24 名前:学生さんは名前が/          \      合コンで… orz
彼女から着信あるとマジで/   リア充[ピーーー]よ!\´  OTL イケメンなのに…
連続ですごいかけてくる /∧_∧ ∩         \サークルが… orz
正直しんどいです…   /( ;´Д`)ノ______     \ orz 180cm65kgで…
              / (入   ⌒\つ  /|      \ 女の子が… OTL
427 名前:学生さんは/  ヾヽ  /\⌒)/   |       \  バイトの…
童貞に戻りたい…orz/   || ⌒| ̄ ̄ ̄|              \

767 :デフォルトの名無しさん:2010/11/15(月) 00:16:20
ミサワかよ

768 :デフォルトの名無しさん:2010/11/15(月) 12:06:53
20時間が6時間なら3倍強か。プログラムの種類にも拠るけど、
その位だとPC換えるか追加して終わりってレベルだから金にならない。
20時間が6分なら200倍だから、そこまでできるのなら金になる。
つーか、高速化で飯喰ってるけど3倍強はコンパイラのご機嫌伺いのレベルだよw

769 :デフォルトの名無しさん:2010/11/15(月) 13:30:56
ここはスーパープログラマの多いスレですね

770 :デフォルトの名無しさん:2010/11/15(月) 14:24:23
1から作りなおさないと20時間を6分に短縮なんて普通できないだろwww

771 :デフォルトの名無しさん:2010/11/15(月) 14:30:53
ヒント:妄想

772 :デフォルトの名無しさん:2010/11/15(月) 15:37:10
高速化で飯食ってるなら、まぁ普通なのかもしれんな
というか20時間掛かるプログラムを書いた奴が土方レベルなんだと思うがな
高速化はボトルネックの特定から始まるから面倒な作業だと思うよ。
1日〜2日目なんてtimeGetTimeあたりを仕込んでログとって終わりだろうからな
20時間を6分は無理だろう…(1から作っても設計的に無理だろw)
どっかにSleepでも仕込んであったんなら可能だがなw
昔だけどDBの仕事で故意にSleepが仕込まれていたケースがある。
次の受注でSleep取って高速化しました。とかしたり顔で言うつもりだったのか

773 :デフォルトの名無しさん:2010/11/15(月) 15:49:21
sleepワロタ

774 :デフォルトの名無しさん:2010/11/15(月) 15:58:35
なんか不具合があって
Sleep噛ませたら動いた!
ってなったからそのままという可能性も

775 :デフォルトの名無しさん:2010/11/15(月) 16:08:56
って書いて自分もSleep入れたことがあるのを思い出した。
他プロセスから完了の通知が来て、プログラム実行したのは良いけど
そのプロセスがファイルに処理結果を書き出し中で、それを読む俺は…
forで回しながらSleepして待った記憶あるわwww
100回やって駄目だったらタイムアウトとかだったかなぁ…
完了通知はファイル書き終わってから出せと言ったが、相手が韓国人で
通じねえwww

776 :デフォルトの名無しさん:2010/11/15(月) 17:10:06
REM WAIT
FOR I=0 TO 1000000:NEXT

777 :デフォルトの名無しさん:2010/11/15(月) 23:09:57
C++難しすぎ

778 :デフォルトの名無しさん:2010/11/15(月) 23:16:13
パールとかに比べればはるかに簡単でしょ



779 :デフォルトの名無しさん:2010/11/15(月) 23:32:55
( ゚Д゚)

780 :デフォルトの名無しさん:2010/11/16(火) 12:35:03
スクリプト系は俺も嫌いだな
コンパイラが無いから構文エラー特定してくれないし
(自分で作れって話もあるが)
tclとかやっててイライラしてくるわ

781 :デフォルトの名無しさん:2010/11/16(火) 13:58:43
>>768
高速化で時間70%削減は並みじゃないと思うぞ。
ここはC/C++スレだからどちらかの言語だと思うが、ハードを買いなおした方が安いってのは幻想
確かに最新PCを買ってそれで済むならハード交換のが安いが大規模な企業の場合は
ハード買いなおしたらインフラの人が動くしそこで金が動くと思われる。
トータルコストでソフトを改良した方が良いと判断されたのだろう
ハードは時期が着たら交換するだろうが、その時はさらに速度UPするだろうからな

782 :デフォルトの名無しさん:2010/11/16(火) 14:40:39
俺もスクリプトは嫌いだ

783 :デフォルトの名無しさん:2010/11/16(火) 18:35:54
そろそろハードの交換ではスピードアップは期待できないんじゃないかな。4GHz超で駆動している CPU は、まだない。

784 :デフォルトの名無しさん:2010/11/16(火) 22:24:36
>>783
あるよ

wikipediaより
>POWER6+は5.0GHzまでのクロックが可能で

785 :デフォルトの名無しさん:2010/11/17(水) 04:56:40
Visual Studio 2010 で C++ のプログラムを作っています。
double er[12], ei[12]; という配列に任意の値が入っているとします。
この2つの配列を使った値、i番目ならば
double lensq = er[i] * er[i] + ei[i] * ei[i];
を使ってlensqの降順にインデックスの番号を振った
int index[12]; という配列を作りたいです。
スマートな方法はないでしょうか?
Boostは使わないでください。

例えば配列の要素数は3だったとして
er[3] = { 1.0, -1.0, 2.0 }
ei[3] = { 0.0, 4.0, -1.0 }
だったとすると
index[3] = { 1, 2, 0 }
となって欲しいのです。

786 :デフォルトの名無しさん:2010/11/17(水) 11:44:10
普通に計算してソートする。

787 :デフォルトの名無しさん:2010/11/17(水) 11:59:37
普通に計算するのをスタート地点としてそこからスマートにするって話じゃないのか

788 :デフォルトの名無しさん:2010/11/17(水) 12:05:43
じゃあ、一つ思いついたからいうよ。
abs(er[i])<abs(er[j])&&(ei[i])<ei([j])ならi<j

789 :デフォルトの名無しさん:2010/11/17(水) 12:06:31
じゃあ、一つ思いついたからいうよ。
abs(er[i])<abs(er[j])&&abs(ei[i])<abs(ei([j])ならi<j

790 :デフォルトの名無しさん:2010/11/17(水) 13:28:31
>>2
もう挙げられてるけど
index[3] = { 0 1, 2 };
を用意して比較関数を与えてstd::sortをすればいいんじゃない?
お前の求めるスマートさが見た目をすっきりさせることならだが

791 :785:2010/11/17(水) 15:47:07
くだらなすぎて答えようがない質問でしたね。ごめんなさい。
普通にソートしました。

const int d = 3;
double er[d] = { 1.0, -1.0, 2.0 };
double ei[d] = { 0.0, 4.0, -1.0 };
int index[d];
for(int i = 0; i < d; i++)
index[i] = i;
std::sort(index, index + d,
[&](int l, int r)
{
return
(er[l]*er[l]+ei[l]*ei[l]) > (er[r]*er[r]+ei[r]*ei[r])
? true : false;
});
for(int i = 0; i < d; i++)
std::cout << index[i] << std::endl;

792 :デフォルトの名無しさん:2010/11/17(水) 22:17:55
Cで多重ループから一気に抜け出すのにgotoとlongjmpのどっちが良い?

793 :デフォルトの名無しさん:2010/11/17(水) 22:33:26
gotoが使えるならgotoのほうがいいに決まってるが

794 :デフォルトの名無しさん:2010/11/18(木) 00:46:31
Longjumpて使ったことない。
harmfulなんてもんじゃないと思うけど一体何に使うの?

795 :デフォルトの名無しさん:2010/11/18(木) 06:47:59
C++なら確実に要らない子だが、Cでまともなエラー処理をしようとすると避けては通れぬ道>longjmp
そもそも、いくらharmfulでもどんなharmか分かっていれば問題ないよねというのがC言語

796 :デフォルトの名無しさん:2010/11/18(木) 09:45:30
多重ループから抜け出すケースが複数ある場合にlongjmp使った方がすっきりかけるかなあと…
gotoは脱出先でも合流するために更にgotoつかうのがイヤだな。

switch (setjmp(env)) {
case 0:
for () {
for() {
if ()
longjmp(env, 1);
else if()
longjmp(env, 2);
}
if ()
longjmp(env, 3);
}
break;

case 1:
...
break;
case 2:
...
break;
case 3:
...
break;
}

797 :デフォルトの名無しさん:2010/11/18(木) 10:18:26
ねーよ
変数一個増やしてでもgoto後に分岐すべき。読みにくすぎる

798 :デフォルトの名無しさん:2010/11/18(木) 10:33:44
goto使うとこうだよね。goto l0がとても嫌だ。

for () {
for() {
if ()
goto l1;
else if()
goto l2;
}
if ()
goto l3;
}
goto l0

l1:
...
goto l0;
l2:
...
goto l0;
l3:
...
/*goto l0;*/

l0:


799 :デフォルトの名無しさん:2010/11/18(木) 10:56:38
こうだろ、普通は

int a = 0;
for () {
 for() {
  if ()
   a=1;
   goto loopEnd;
  else if()
   a=2;
   goto loopEnd;
  }
  if () {
   a=3;
   goto loopEnd;
  }
 }
}
switch(a) {
 case 1: break;
 case 2: break;
 case 3: break;
 default: break;
}

800 :デフォルトの名無しさん:2010/11/18(木) 10:57:42
switchの上にloopEnd:忘れたが脳内補完してくれ

801 :デフォルトの名無しさん:2010/11/18(木) 10:57:43
>>798
それもねーな

802 :デフォルトの名無しさん:2010/11/18(木) 11:21:00
aもloopEndも不要

for () {
 for() {
  if ()
   goto l1;
  else if()
   goto l2;
  }
  if () {
   goto l3;
  }
 }
}
switch(0) {
 default: break;
l1: break;
l2: break;
l3: break;
}


803 :デフォルトの名無しさん:2010/11/18(木) 11:25:04
>>802
ふざけんな

804 :デフォルトの名無しさん:2010/11/18(木) 11:29:39
ていうかそもそもgoto前に処理すればいい。ジャンプした後に別々の処理を行うという設計が意味不明。

805 :デフォルトの名無しさん:2010/11/18(木) 11:31:37
>>804
この形だけだからそう見えるけどエラー処理だから最後にまとめて記述する事自体は普通だろう
catchが複数並んでるようなもんで

806 :デフォルトの名無しさん:2010/11/18(木) 11:35:16
goto前に処理すればいいな

807 :デフォルトの名無しさん:2010/11/18(木) 11:36:19
>>805
for文抜けるだけなんじゃなかったか?
それだとなんで飛び先複数いるのかわからんが

808 :デフォルトの名無しさん:2010/11/18(木) 11:53:34
エラー処理ならなおさら分けることは望ましくない

809 :デフォルトの名無しさん:2010/11/18(木) 12:34:24
>>803
ふざけちゃいないが。

810 :デフォルトの名無しさん:2010/11/18(木) 12:36:43
>>809
じゃぁただの馬鹿か
goto文の使い方ぐらいじゃんと勉強しとけ

811 :デフォルトの名無しさん:2010/11/18(木) 12:56:34
>>810
どこが正しくないんだ?

812 :デフォルトの名無しさん:2010/11/18(木) 13:10:02
switch内に突撃しちゃだめなんじゃなかったか?

813 :デフォルトの名無しさん:2010/11/18(木) 13:13:10
defaultって一番上に書いていいの?

814 :デフォルトの名無しさん:2010/11/18(木) 13:15:08
それは何処に書いてあるのだ?

815 :デフォルトの名無しさん:2010/11/18(木) 13:16:20
>>813
最初でも途中でも、好きなところに書いていい。

816 :デフォルトの名無しさん:2010/11/18(木) 13:47:30
てゆーか>>802って動作すんの?
switch文のラベルに外部のgoto文で飛ぶんだよな?

817 :デフォルトの名無しさん:2010/11/18(木) 13:48:55
switch文のラベルじゃない

818 :デフォルトの名無しさん:2010/11/18(木) 13:59:25
defaultの中に書いてあるってことか

819 :デフォルトの名無しさん:2010/11/18(木) 14:04:24
>>816
全く正しい。>>810は正しくないとする根拠を示すように。

>>818
これでも構わない。
for () {
 for() {
  if ()
   goto l1;
  else if()
   goto l2;
  }
  if () {
   goto l3;
  }
 }
}
switch(0) {
l1: break;
l2: break;
l3: break;
 default: break;
}

820 :デフォルトの名無しさん:2010/11/18(木) 14:05:10
普通はあまり深い階層に入るようなら
関数化するとかで回避するのが堅実なんじゃないかな?
避けて通れないようなら仕方ないけどねぇ
いかに簡素化して書けるかが問われるとこだと思うけども

821 :デフォルトの名無しさん:2010/11/18(木) 14:14:25
>>818
defaultに中も外もないよ。
switchの中はどこでも同じ。

822 :デフォルトの名無しさん:2010/11/18(木) 14:24:30
配列の中にある値を変数に代入する場合
a=[0][0];
のような形でやってみたんですが上手くいかないのですが、どうすればいいのでしょうか?

823 :デフォルトの名無しさん:2010/11/18(木) 14:26:18
何がやりたいんだよ

824 :デフォルトの名無しさん:2010/11/18(木) 14:28:46
b = a[0][0];
a[0][0] = b;
のどっちかだろう

825 :デフォルトの名無しさん:2010/11/18(木) 14:38:56
>>819
正しいかどうかじゃねーだろ
そんな糞みたいな使い方してんじゃねーよ
gotoはあくまで入れ子の中から外に出すために使われるべきでif文やswitch文の外から中に飛ぶべきではない
間違ったgoto文の使用は正しいエラー処理をすっ飛ばし意図しない不具合が起こるしプロジェクト全体に迷惑をかける

826 :デフォルトの名無しさん:2010/11/18(木) 14:45:59
>>825
それを禁止するなら、ラベルのスコープを変数と同じくブロックにすればいい。
ところがCはそのようにしなかった。すなわち想定内の正しい使用法。

本当は>>802のような使い方知らなかったんだろ。

827 :デフォルトの名無しさん:2010/11/18(木) 14:50:49
Duff's Device に比べりゃどうってことない
でも switch(0) じゃなくて while(0) でいいんじゃない

828 :デフォルトの名無しさん:2010/11/18(木) 15:02:19
gotoって処理速度優先の時にはどんな用法でも認められるべきじゃないの?

829 :デフォルトの名無しさん:2010/11/18(木) 15:41:39
>>826
コンパイラの仕様は関係ないだろ 頭おかしいのか?
int[5]の配列の六番目にアクセスしても何ら文句は言われないがそれが正しいのか?

使い方知らない、とかそんな発想する時点でアセンブラも弄ったこと無いゆとり丸出しだな
一から勉強しなおせ

830 :デフォルトの名無しさん:2010/11/18(木) 15:52:25
>>827
>Duff's Device
見た目恐ろしいが凄いこと考えつく人がいるんだな

831 :デフォルトの名無しさん:2010/11/18(木) 16:32:06
>>829
全然関係ない例を引っ張り出して、頭の悪さがはっきりと出ていね。

832 :デフォルトの名無しさん:2010/11/18(木) 16:40:45
>>829
難しいで「アセンブラ」が真っ先に思い浮かぶなんて、貧困過ぎる。

833 :デフォルトの名無しさん:2010/11/18(木) 17:22:12
そういう小学生みたいな煽りは要らんから。

834 :デフォルトの名無しさん:2010/11/18(木) 17:28:46
せやなw

835 :デフォルトの名無しさん:2010/11/18(木) 17:40:39
>>833
小学生みたいっていうやつが小学生なんですぅ〜

836 :デフォルトの名無しさん:2010/11/18(木) 17:46:32
int[0]の配列のi番目(i>0)にアクセスするなんてしょっちゅうやってますが、なにか?

837 :デフォルトの名無しさん:2010/11/18(木) 20:51:29
>>825
じゃあこれなら文句無いだろ

while(1){
for(){
for(){
if()goto l1;
if()goto l2;
if()goto l3;
}
}
break;

l1:
break;
l2:
break;
l3:
break;

}



838 :デフォルトの名無しさん:2010/11/18(木) 20:57:01
なんで、わざわざgoto使うのかな?

839 :デフォルトの名無しさん:2010/11/18(木) 21:16:38
ラムダがあれば一発で解決する

840 :デフォルトの名無しさん:2010/11/18(木) 21:23:28
つまり、breakが使用できる制御構造は複数gotoの飛び先の合流に利用出来る。
外から飛び込むか、中に記述するかは好みの問題ってことでいいね。

841 :デフォルトの名無しさん:2010/11/18(木) 21:32:26
俺なら、エラーコード変数を作って、エラーコードでもどすけど。
gotoのほうが良い利点はステップ数が少ないだけ?

842 :デフォルトの名無しさん:2010/11/18(木) 22:01:15
俺なら多重ループの部分を関数化してリターンする


843 :デフォルトの名無しさん:2010/11/18(木) 22:12:34
>>842
820で言ってる。
ネストが深い構造はあまり作るべきではないよな

844 :デフォルトの名無しさん:2010/11/18(木) 22:25:55
俺なら関数化するね


845 :デフォルトの名無しさん:2010/11/18(木) 22:27:13
名前空間がstdは全てSTLなのですか?

846 :デフォルトの名無しさん:2010/11/18(木) 22:27:53
そもそも多重ループからジャンプしたくなるような設計にしない

847 :デフォルトの名無しさん:2010/11/18(木) 22:35:28
人のコーディングスタイルが気になったり、口出ししたくなるうちは、まだ半人前!

848 :デフォルトの名無しさん:2010/11/18(木) 22:39:51
template <int N> struct Tag
{
};

try
{
for(…)
{
for(…)
{
if(…) throw Tag<0>();
}
if(…) throw Tag<1>();
}
}
catch(Tag<0>)
{
//…
}
catch(Tag<1>)
{
//…
}

つーかC++なんだし、エラー処理なら例外使うのが正解
なんでこんなこともわからないのかね
正常フローでネストから抜けたいなら宗教論争だから好きにしろ


849 :デフォルトの名無しさん:2010/11/18(木) 22:41:28
キリッ

850 :デフォルトの名無しさん:2010/11/18(木) 22:44:17
元の質問者がCで、と前提を決めてるのに、それを無視しちゃうのか?

851 :デフォルトの名無しさん:2010/11/18(木) 22:50:57
ププ

852 :デフォルトの名無しさん:2010/11/18(木) 22:52:52
>>847
一理あるけど、あまりヒデーと口も出したくなるもんだw
規約上OKならいいのか?となるっしょ
俺の上司なんか元コボルだからほぼ全部グローバル変数だぞwww
直しといて、って気軽に渡されたけど訳わかねーよw
関数の引数は一切なかったwww(AccessVBAだったからスレチかもしれんが)

853 :デフォルトの名無しさん:2010/11/18(木) 22:55:49
たかが1関数の中の記述方法なんてどうでもいいじゃん
関数化してブラックボックスになったらバグってない限りもう永遠に触らないんだし
迷うのはもっとスケールの大きい選択にぶつかってからでいい


854 :デフォルトの名無しさん:2010/11/18(木) 23:31:15
まあそういうが、大きくなればなるほど一歩一歩の積み重ねも大事だ。

855 :デフォルトの名無しさん:2010/11/18(木) 23:34:31
>848
おまえは、マ板でやってる例外の議論を一万回読んでこい

856 :デフォルトの名無しさん:2010/11/18(木) 23:38:59
今日もC/C++スレでは低レベルと高レベルの話が交錯するのであった…
分けるべきかもね、スレ…

857 :デフォルトの名無しさん:2010/11/18(木) 23:43:15
>>856
自分には全部低レベルに見えるけど、いったいどのへんに高レベルな話があるんですか?


858 :デフォルトの名無しさん:2010/11/18(木) 23:58:02
あげ

859 :デフォルトの名無しさん:2010/11/19(金) 00:30:47


860 :デフォルトの名無しさん:2010/11/19(金) 00:49:56
だってさー>>369の方が馬鹿じゃんw

861 :デフォルトの名無しさん:2010/11/19(金) 09:57:43
>>853
でも>>852は"記述方法"の範疇外の問題だろw

グローバル変数のみ、引数なしってことは内部実装を知らないとパラメータが設定できないんだから

862 :デフォルトの名無しさん:2010/11/19(金) 10:40:40
int flag=LOOPi,i=ZEROi,j=ZEROj;
while(1){ switch(flag){
case LOOPiQ:/*〜*/; if(!i+=Xi<ENDVALUEi)break;
case LOOPi: /*〜*/; flag=LOOPj;
case LOOPj: /*〜*/; if()flag=L0;else if()flag=L1;else if(!j+=Xj<ENDVALUEj)j=ZEROj,flag=LOOPiQ; continue;
case L0: /*〜*/; break;
case L1: /*〜*/; break;
}flag=LOOPi,i=ZEROi,j=ZEROj;}

キリッ

863 :デフォルトの名無しさん:2010/11/19(金) 11:56:31
なにここ、すご……
http://studiokingyo.fc2web.com/

864 :デフォルトの名無しさん:2010/11/19(金) 16:22:09
それ見るの何回目だろうか

865 :デフォルトの名無しさん:2010/11/20(土) 08:54:07
http://up5.pandoravote.net/index.php?mode=pass&idd=00000221
ここにあるファイルをダウンロードするプログラムを組みたいのです
受信パスワードにdoujinと入力して受信ボタンを押すというプログラムはどのようにして組むのでしょうか?
簡単なサンプルがあるといいです
よろしくお願いします

866 :865:2010/11/20(土) 09:33:45
できやがりました
どうもすいませんでした(怒

867 :デフォルトの名無しさん:2010/11/20(土) 14:03:58
アホス

868 :デフォルトの名無しさん:2010/11/21(日) 10:00:55
*(pointer + 3)
なんて何に使うんですか?

869 :デフォルトの名無しさん:2010/11/21(日) 10:06:56
pointer + 3 の場所にアクセス

870 :デフォルトの名無しさん:2010/11/21(日) 10:19:55
pointer[3]とおなじです

871 :868:2010/11/21(日) 10:23:39
>>870
では、何のためにこの記法を使うのですか?

872 :デフォルトの名無しさん:2010/11/21(日) 10:31:58
*(pointer - 1)
と書いてもいいので便利ですね

873 :デフォルトの名無しさん:2010/11/21(日) 10:32:37
pointer[-1]とも書けますが。

874 :デフォルトの名無しさん:2010/11/21(日) 10:34:14
そんな書き方をすると正気を疑われますが、pointer-1ならそうなりません。よかったですね

875 :デフォルトの名無しさん:2010/11/21(日) 10:35:18
>>870じゃないけど
ポインターに演算してアクセスしているよ、の意思表示。(けっこう重要)
pointer[3]だと、配列だと間違う可能性もあるだろ。

876 :デフォルトの名無しさん:2010/11/21(日) 10:36:27
>>871
>868の方が速いと信じているか、>870とは意味が違うと勘違いしているか、何も考えていないのでしょう。

877 :868:2010/11/21(日) 10:36:57
なるほど、意味が違うんですね。
>>869-870>>872-875 ありがとうございました。

878 :デフォルトの名無しさん:2010/11/21(日) 10:37:26
なるほど、>874も>875も「意味が違うと勘違いしている」ようですねw

879 :868:2010/11/21(日) 10:39:14
リロードしてなかった…
>>876
では、速さも意味も同じでどっちを使おうと違いは無いんですか。

880 :デフォルトの名無しさん:2010/11/21(日) 10:40:28
>>878はぁ? ちょいむかつき

881 :デフォルトの名無しさん:2010/11/21(日) 10:51:00
コーディング規約でそう決めるとか、自分はそうするとか、ポリシーがあるのならそれ自体はいいことだと思います。
が、他人に「正気を疑われる」などと押し付けるほどの意味はありませんね。

ついでに言えば、配列と間違わないためには文字列を扱う関数内では[]が全く使えなくなります。
ForExample:
int sample(const char * str)
{
int len = 0;
while (* (str + len) != '\0') ++len;
return len;
}
--
私にはstr[len]の方が見易いのですが、どちらでも好きに書けばいいことでしょう。

882 :デフォルトの名無しさん:2010/11/21(日) 10:57:18
組み込み型の場合はp[n]は*(p+n)のただの糖衣構文ですが
イテレータクラスの場合はすこし状況が変わります
p[n]に比べて*(p+n)はテンポラリなイテレータの生成が含まれるので無駄なコストがかかります
*(p+n)のような使い方をすると予め分かっている場合は必ず[]をオーバーロードしてこちらを使うようにしましょう
そしてC++使いはイテレータに合わせて組み込み型のインクリメントを++itと書くように統一感を重視します
したがってただのポインタの場合でも*(p+n)とは書かずにp[n]と書くことが推奨されています
*(p-1)と書くのは間違いでp[-1]と書くのが普通なのです


883 :デフォルトの名無しさん:2010/11/21(日) 11:04:16
5行目までは正しい

884 :デフォルトの名無しさん:2010/11/21(日) 14:01:25
すぐに中身を参照するとは限らないのだから
その場では pointer+3 だけを計算してあとで *pointer したいかもしれない
pointer[3] だとそれができないじゃないか
いやまぁ & つければいいんだけどね
しかし pointer+3 を &pointer[3] と書くなんて、実にまわりくどい

885 :デフォルトの名無しさん:2010/11/22(月) 12:43:14
画像ライブラリ(libHello.so)を作っています。
libzとlibpng,libjpegを使うのですが、コンパイルの時に一緒にこれらのライブラリを
指定したほうがいいですか? 特に指定しなくてもあとで画像ライブラリを使うときに
リンクすればいいのでしなくてもいいし、した方がいいのかどっちでしょうか?


886 :デフォルトの名無しさん:2010/11/22(月) 12:53:59
.libの互換性が今後も保証されてるなら指定しなくていいんじゃない?
まぁ、コンパイラのバージョンが変わったときに
以前のコンパイラで作ったlibとリンクできません、なんてことがよくあるんだけど

887 :885:2010/11/22(月) 13:56:42
やっぱりよくわからない。念のためリンクしときます。御免なさい
libpngとかないとそもそも動かないのでおかしくはないはず。

888 :デフォルトの名無しさん:2010/11/22(月) 14:27:21
>>884
C++ならstd::vector<int> foo;に対して当たり前のように&*foo.begin()と書くから(回りくどいという意識は余りないので)大丈夫。
ポインタ演算できる保障が常にあるわけじゃないことに注意。

889 :デフォルトの名無しさん:2010/11/22(月) 20:10:05
>>827
Duff's Deviceにインスパイヤされて、こんなの思いついた
do{} while(0)バージョン
int x = -1;
switch (a) {
do {
case 0: x = 1; break;
case 1: x = 10; break;
case 2: x = 100; break;
} while(0);
printf("%d %d\n", a, x);
break;
}
ifバージョン(breakなし)
int x = -1;
switch (a) {
if (1)
case 0: x = 1;
else if (1)
case 1: x = 10;
else if (1)
case 2: x = 100;

printf("%d %d\n", a, x);
break;
}


890 :デフォルトの名無しさん:2010/11/22(月) 20:50:24
あるクラスが持っているコンテナに順にアクセスしたいのですが
その場合はイテレータを返せばいいのでしょうか?


891 :デフォルトの名無しさん:2010/11/22(月) 20:54:00
ハイ

892 :デフォルトの名無しさん:2010/11/23(火) 03:42:07
イテレータを返してるソース見たこと無い

893 :デフォルトの名無しさん:2010/11/23(火) 08:51:38
PHPでいう var_dump() のようなものは、C++にはありませんか?
標準では存在しないとしたら、類似の処理をライブラリで配布していたり、
サンプルコードを掲載しているサイトはありませんか?

894 :デフォルトの名無しさん:2010/11/23(火) 10:35:53
デバッガを使ってください

895 :885:2010/11/23(火) 12:55:43
ライブラリAをコンパイルするときにlibpngとlibjpegを指定しておくと、
あとでAを使うときにはlibpngとlibjpegをリンクする必要はないのな。
始めて知った。どのみち必要な事には変わりないけどすっきりしていい感じ。

896 :デフォルトの名無しさん:2010/11/23(火) 13:34:28
>>895
そうしちゃいけない例外もある。例えば特定のOSでのpthreadライブラリ。
pthread.soにスレッドバージョンのforkが含まれているので、ライブラリAが
pthreadを使うときは、実行ファイルのリンクの際にもpthreadをリンクする
必要がある。

897 :デフォルトの名無しさん:2010/11/24(水) 08:08:22
unsigned intは32ビットプロセッサ上でインクリメントすると65535までしか入らないんですか?

898 :デフォルトの名無しさん:2010/11/24(水) 09:40:08
intのサイズによる。

899 :デフォルトの名無しさん:2010/11/24(水) 09:59:04
VisualBasicのIntegerは何故か2バイトだったなあ

900 :デフォルトの名無しさん:2010/11/24(水) 12:49:02
javaもあと20年くらいしたら、なぜかintが32bitとか言われてるかもしれない。

901 :デフォルトの名無しさん:2010/11/25(木) 11:48:58
>>897
それはプロセッサの問題じゃなくてコンパイラの実装の問題
標準では最大値がそれ以上(2^16-1)ならよい事になっている
gccなら32bitプロセッサでも 2^32-1が最大値のはず

902 :デフォルトの名無しさん:2010/11/25(木) 15:38:07
ja.efreedom.comってサイトなんなの?

903 :デフォルトの名無しさん:2010/11/25(木) 17:03:28
ttp://ja.efreedom.com/About/
正確な翻訳とか書いてるけど確実に機械翻訳

904 :デフォルトの名無しさん:2010/11/25(木) 19:40:42
>>902
google先生でヒットするやつだろ
あれウザイよなjj

905 :デフォルトの名無しさん:2010/11/25(木) 19:43:09
すげーうざいよね

906 :デフォルトの名無しさん:2010/11/25(木) 21:12:18
-site:hogeをくっつけてgoogleにリダイレクトするサービス始めたら使う?

907 :デフォルトの名無しさん:2010/11/25(木) 21:28:07
無駄

908 :デフォルトの名無しさん:2010/11/25(木) 22:48:56
googleの検索設定に常に除外するサイトが欲しいわ

909 :デフォルトの名無しさん:2010/11/25(木) 22:58:56
自分でフィルターかませばいいじゃん


910 :デフォルトの名無しさん:2010/11/26(金) 21:13:59
POD型についてなんですが、
>>memcpyなどでメモリを直にいじってコピーしたりして問題のない オブジェクトのこと

とありますが、別に仮想関数テーブルさえなければコンストラクタを持っていても問題ないと思うのですが

911 :デフォルトの名無しさん:2010/11/26(金) 21:22:02
struct hoge
{
int id;
hoge(void) { id = getUniqID(); }
hoge(hoge const & other) { id = getUniqID(); }
hoge & operator = (hoge const & other) { return *this; }
};

これでmemcpyしたら死人がでてもおかしくないよ

912 :デフォルトの名無しさん:2010/11/27(土) 01:30:58
C++プログラマの皆さんは、今どきリスト内包表現のすら無い言語を使って恥ずかしくなったりしませんか?

913 :デフォルトの名無しさん:2010/11/27(土) 02:28:34
恥ずかしいとか恥ずかしくないなんていう得にも損にもならない理由で言語を選ぶ方が恥ずかしい

914 :デフォルトの名無しさん:2010/11/27(土) 04:47:29
>>912
恥ずかしくていつも下を向いている

915 :デフォルトの名無しさん:2010/11/27(土) 09:35:12
下を向いたら禿が丸見えになってもっと恥ずかしくなるだろ

916 :デフォルトの名無しさん:2010/11/27(土) 13:45:34
>>911
何が問題なのでしょうか?

917 :デフォルトの名無しさん:2010/11/27(土) 13:48:50
>>916
thisのアドレスが変わってしまうだろうが

918 :デフォルトの名無しさん:2010/11/27(土) 13:57:50
>>917
実装の問題では無いんですか?

919 :デフォルトの名無しさん:2010/11/27(土) 14:02:46
全く問題ないからmemcpy使っていいよ


920 :デフォルトの名無しさん:2010/11/27(土) 14:25:06
>>910
あんたの言うとおりなわけで、今度の規格改定(C++0x)でそこらへんの定義が変わって、
memcpyできるクラスの制限が緩くなる。

c++0x pod memcpyあたりでググってみればいい。

921 :デフォルトの名無しさん:2010/11/27(土) 14:57:57
PODの定義は変わるがmemcpyできるクラスの制限はとくに緩くはならない
別の言い方をするなら
「memcpyなどでメモリを直にいじってコピーしたりして問題のない オブジェクトのこと」
っていうのが不正確

922 :デフォルトの名無しさん:2010/11/27(土) 23:46:33
ぶっちゃけ余計な事はするな、と言いたいな。良く知らないけど。
オブジェクトはコピーするな。コピーは構造体まででいいじゃん。

923 :デフォルトの名無しさん:2010/11/27(土) 23:48:06
いやコピーしろよ

924 :デフォルトの名無しさん:2010/11/27(土) 23:51:58
 人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人
< オブジェクトのコピーはやめよう。とにかくコピーは構造体まででいいじゃん。 >
 YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

925 :デフォルトの名無しさん:2010/11/27(土) 23:59:00
いや、普通に代入するかstd::copyでいいだろ。オブジェクトだろうと構造体だろうと。

926 :デフォルトの名無しさん:2010/11/28(日) 00:10:13
VCでOutputDebugStringを使わずに、
デバッガ出力画面に文字列を出力する方法はありますか?

927 :926:2010/11/28(日) 00:11:25
あちこちで<windows.h>をinlcudeするのが嫌なのが理由です

928 :デフォルトの名無しさん:2010/11/28(日) 00:11:40
トレース

929 :デフォルトの名無しさん:2010/11/28(日) 00:12:36
ラップすれば良いじゃん

930 :926:2010/11/28(日) 00:20:59
>>929
ありがとうございます
あ、普通に考えてそうですよね
なんでこの考えにいたらなかったのか俺


931 :デフォルトの名無しさん:2010/11/29(月) 21:51:22
むしろリリースビルドでも出力しちゃう
OutputDebugStringさんをどうにかしたい

932 :デフォルトの名無しさん:2010/11/30(火) 18:23:22
ブレーク貼るのが不得手になるリリースビルドでバグったときに、表示が抑制されてたら困りそうだが。

933 :デフォルトの名無しさん:2010/11/30(火) 18:56:24
>>931
#ifdef _DEBUG
っつか普通TRACE

>>927
プリコンパイルドヘッダ

934 :デフォルトの名無しさん:2010/11/30(火) 20:13:33
ふとわき出た疑問なのですが、質問よろしいでしょうか?

現在C/C++などを勉強し始めたばかりの学生です。

最近ポインタ周りを勉強していてふと思ったのですが
ポインタは変数のアドレス先を保存すると書かれてそれで納得していたのですが、
何故(INT*)などのINTのように型の宣言が必要なのでしょうか?

当たり前な事なのかもしれないですが、よろしければご教授いただけないでしょうか?

935 :デフォルトの名無しさん:2010/11/30(火) 20:18:36
ああ、その質問は・・・

936 :デフォルトの名無しさん:2010/11/30(火) 20:20:10
宣言いらないんじゃないの?と思う理由がききたい

937 :デフォルトの名無しさん:2010/11/30(火) 20:23:14
そのポインターを使うとき型がわからないと困るじゃん

938 :デフォルトの名無しさん:2010/11/30(火) 20:30:00
ポインタは変数のアドレス先を保存する

だから、ポインターは変数を知っていると考えると。 *だけでいいと思う。
がきっと int* の疑問かな

ポインターはメモリー上のアドレス値を持つ。

と考えれば、ポインターに型情報はない。
だから、アクセスするための型情報を宣言する−>int*
実際これが正しい。

939 :デフォルトの名無しさん:2010/11/30(火) 20:37:46
ポインタはポインタ型じゃん

940 :デフォルトの名無しさん:2010/11/30(火) 20:46:25
機械の扱うデータは内部的に1と0の羅列でしかありません
なのでたとえば101010111101というデータがあったときに
これを整数と解釈するのか実数と解釈するのかあるいはほかの形式のデータと解釈するのか
機械はアホなので迷ってしまいます
そんなわけで型を機械に教えてあげないとだめなわけです



941 :デフォルトの名無しさん:2010/11/30(火) 20:47:06
>934
実際、『型を決めていないポインタ』として、[void*]という型があるよ。

[intだと分かってる場合]
int a=0, b=5;
int *p = &b;
a = *p + 3;

[型情報がない場合]
int a=0, b=5;
void *p = &b;
a = *(int*)p +3;

みたいにいちいちキャストしなきゃいけないのが面倒で、最初から型情報をもってたほうが簡単。

942 :デフォルトの名無しさん:2010/11/30(火) 23:52:12
>>934
int *a;
struct intx2 { int x, int y} *b;

とすると、コンパイラは、a++はint1個分、b++はint2個分アドレスを進めれば言いって分かる。

void *c;

だと、どれだけポインタを進めていいのか判らない。

943 :デフォルトの名無しさん:2010/12/01(水) 12:47:07
サイズ情報とvoid*を含むクラスを作ればいいんじゃないの?

944 :デフォルトの名無しさん:2010/12/01(水) 12:54:08
それを世間では車輪の再発明と言う

945 :デフォルトの名無しさん:2010/12/01(水) 12:54:40
boost::anyのソースコードでも見てみろよ

946 :デフォルトの名無しさん:2010/12/01(水) 17:02:34
素晴らしい流れだ。

947 :デフォルトの名無しさん:2010/12/01(水) 17:19:13
++にはどんな意味があるの?


948 :デフォルトの名無しさん:2010/12/01(水) 17:26:52
C++はCより1レベル進化してる

949 :デフォルトの名無しさん:2010/12/01(水) 17:28:10
1レベルどころか全く別の言語になっちまってる
Cの部分はほとんど残してるけどな

950 :デフォルトの名無しさん:2010/12/01(水) 17:49:38
Cから一歩進んだように見えて成果物はCで作るのとあんま変わらないという

951 :デフォルトの名無しさん:2010/12/01(水) 17:55:55
人もいる

952 :デフォルトの名無しさん:2010/12/01(水) 18:30:04
C++でも書けるけど旧式だから非推奨なソースコードを入門書で積極的に教えてほしい
型キャストをC式で書くのが非推奨だって知ったのはC++勉強しはじめてから何年も経ってからだった

953 :947:2010/12/02(木) 01:33:40
>>948-951
ありがとうございます、そういう意味だったのね
スッキリしました


954 :デフォルトの名無しさん:2010/12/02(木) 03:30:55
C++なんだから、評価時にはまだインクリメントされてないわけで、
C==C++

955 :デフォルトの名無しさん:2010/12/02(木) 03:49:33
>>952
stdio.hではなくcstdio
#ifdef __cplusplus を積極的に使う
mainのreturn 0;はいらない

956 :デフォルトの名無しさん:2010/12/02(木) 09:35:10
C++になって複雑になった割には、できる事がCから増えていない

957 :デフォルトの名無しさん:2010/12/02(木) 10:36:48
>>952
そういう常識的なことは Effective C++ に書いてあるんでは

958 :デフォルトの名無しさん:2010/12/02(木) 12:12:10
>>956
だが、同じことを楽に安全にできることは物凄く増えた

959 :デフォルトの名無しさん:2010/12/02(木) 12:24:55
覚えなければいけない常識が、それ以上に増えた。

960 :デフォルトの名無しさん:2010/12/02(木) 12:36:27
言語上可能だが、やらない方が良い事がものすごく増えた

961 :デフォルトの名無しさん:2010/12/02(木) 13:37:37
もうC言語でいいや

962 :デフォルトの名無しさん:2010/12/02(木) 13:48:36
>957
書いてあったけど、EffectiveC++を発見できるのはたまたま見つけた奴だけだろ……

963 :デフォルトの名無しさん:2010/12/02(木) 14:16:06
>>962
すごく有名な本だし、入門書読んで少しコーディングするようになったら
次に読む本って感じではない?俺はそういう印象持ってるけど
たまたま見つけるって程知られてないかなぁ

964 :デフォルトの名無しさん:2010/12/02(木) 14:21:20
その前にネットで学習してれば気づくだろ

965 :デフォルトの名無しさん:2010/12/02(木) 14:21:56
ネットで学習ねぇ

966 :デフォルトの名無しさん:2010/12/02(木) 20:23:21
クラスhogeがあるとして
vecotr<hoge*> *vec = new vector<hoge*>();
hoge hg1 = new hoge();
hoge hg2 = new hoge();
vec->puss_back(hg1);
vec->puss_back(hg2);

ってするとvecをclearしてもnewしたhogeがメモリリークするんだけど
vec側から全てのhogeを解放することってできる?

967 :デフォルトの名無しさん:2010/12/02(木) 20:24:43
ミスった
hoge hg1 = new hoge();
hoge hg2 = new hoge();
じゃなくて
hoge *hg1 = new hoge();
hoge *hg2 = new hoge();
ということで

968 :デフォルトの名無しさん:2010/12/02(木) 20:31:15
オレ、STLつかいはじめたど素人だけど、vectorに
つっこんだ時点ですべてコピーされてると思う。

969 :デフォルトの名無しさん:2010/12/02(木) 20:40:05
>>966
std::vectorの替わりにboost::ptr_vectorを使えば解決する

970 :デフォルトの名無しさん:2010/12/02(木) 22:30:15
>>966
for (int i = 0; i < (int)vec.size(); i++) {
 delete vec[i];
}
vec.clear();


971 :デフォルトの名無しさん:2010/12/03(金) 08:22:55
>>970
だから>>966はそれを手で書かず自動でやって欲しいと言っているのだが
今の所>>969がベスト

972 :デフォルトの名無しさん:2010/12/03(金) 08:39:01
そうは言ってないだろう
後出し厨だな

973 :デフォルトの名無しさん:2010/12/03(金) 08:56:52
フツーコンテナにぶち込むなら何かしらスマートポインタ使うだろ

974 :デフォルトの名無しさん:2010/12/03(金) 09:24:56
そんなことないでしょう

975 :デフォルトの名無しさん:2010/12/03(金) 10:12:48
スマポのが楽だけどいつもブルジョアマシンを使えるとはかぎらないし

976 :デフォルトの名無しさん:2010/12/03(金) 10:21:26
unique_ptrにでもぶちこんでおけ

977 :デフォルトの名無しさん:2010/12/03(金) 10:21:27
その辺に転がっているCore2のPC辺りでも普通にgcc4やiccが動くことを考えると、
スマートポインタを使うのに当たってブルジョアマシンは必要ないという事に成るな。

978 :デフォルトの名無しさん:2010/12/03(金) 12:29:46
>>977
975 はハードの話じゃないんじゃないかな
開発環境を自分が常に選べるわけじゃない

979 :デフォルトの名無しさん:2010/12/03(金) 13:05:04
STLコンテナ使ってスマポ使わない環境って何?

980 :デフォルトの名無しさん:2010/12/03(金) 13:12:14
すまんが国家機密情報なのでな

981 :デフォルトの名無しさん:2010/12/04(土) 16:01:05
この例でvector<vector<hoge>> *vec にしないのはなんでだ
理由はいろいろあるにしても

982 :デフォルトの名無しさん:2010/12/04(土) 16:51:28
class C{
public:
A a;
int B();
};
C::C(){
a = 代入;
}

これだと代入で例外で止まってしまいます。

class C{
public:
int B();
};
C::C(){
A a;
a = 代入;
}

これだと行けます。何が問題でしょうか。

983 :デフォルトの名無しさん:2010/12/04(土) 16:53:07
× C::C(){
○ C::B(){
まちがえました

984 :デフォルトの名無しさん:2010/12/04(土) 17:25:02
>>982-983
その説明でわかるやつは一人もいないと思うぞ
コード全部貼れ

985 :デフォルトの名無しさん:2010/12/04(土) 17:29:21
違いはAがメンバー変数かローカル変数かだけだが、
それで違いが出るはずはないので>>982の気づいてない何かがあるな。
というか例外メッセージぐらい張れ。


986 :デフォルトの名無しさん:2010/12/04(土) 19:38:15
>vtable.free = free;
このようなコードを見かけたのですが、関数に()を書かないと
関数のアドレスが渡されるのですか?

987 :デフォルトの名無しさん:2010/12/04(土) 19:53:19
はい

988 :デフォルトの名無しさん:2010/12/04(土) 19:55:35
>>987
thx

989 :982:2010/12/05(日) 07:12:22
#include <windows.h>
#include <mmsystem.h>

class C_OpenWave
{
public:
HMMIO hMmio; //ハンドル
MMIOINFO mmioInfo;
WAVEFORMATEX wFmt; //BufferDesk用

bool InitWave();
};
bool C_OpenWave::InitWave()
{
//ファイルオープン
memset( &mmioInfo, 0, sizeof(MMIOINFO) );
mmioInfo.pchBuffer = (HPSTR)ファイルへのポインタ;
mmioInfo.fccIOProc = FOURCC_MEM;
mmioInfo.cchBuffer = sizeof(ファイルのサイズ);
hMmio = mmioOpen(NULL, &mmioInfo, MMIO_ALLOCBUF | MMIO_READ);

return true;
}

990 :982:2010/12/05(日) 07:14:36
ファイルオープンの
memset( &mmioInfo, 0, sizeof(MMIOINFO) );
ないし、
hMmio = mmioOpen(NULL, &mmioInfo, MMIO_ALLOCBUF | MMIO_READ);

test.exe の 0x004114f5 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xcccccccc に書き込み中にアクセス違反が発生しました。
と出ます。

ちなみに
HMMIO hMmio;
MMIOINFO mmioInfo;
をローカル変数にするとエラーが出ません。

991 :デフォルトの名無しさん:2010/12/05(日) 10:17:56
エラーが再現する最低限のコードを全部貼れ。できればcodepad辺りに。

992 :デフォルトの名無しさん:2010/12/05(日) 11:04:10
MSVCのデバッグモードでコンパイルしたプログラムでは初期化していない
ローカル変数は0xccccccccになる。

993 :デフォルトの名無しさん:2010/12/05(日) 11:19:56
カタカナで書くと「フフフフフフフ」な

994 :デフォルトの名無しさん:2010/12/05(日) 11:22:07
ゴゴゴゴゴゴゴゴ

995 :982:2010/12/05(日) 11:27:47
変数はコンストラクタで初期化してあります。

996 :デフォルトの名無しさん:2010/12/05(日) 11:31:11
>>990
初期化されてないポインタ変数を渡してるんだろ

997 :デフォルトの名無しさん:2010/12/05(日) 11:46:14
どうせそんなところだ。

998 :デフォルトの名無しさん:2010/12/05(日) 11:50:11
>>995
エラーメッセージは未初期化のポインタを参照したといっている。

これ以上の質問は「未初期化のポインタをどこで使っているか分らないので、
ソースみて指摘してくれ」に他ならない。

それでも質問したいなら、全ソース何処かにうpしろ。

999 :デフォルトの名無しさん:2010/12/05(日) 15:34:37
コンテナに基底クラスのポインタ入れて使うときにダウンキャストするのは良くない設計?

1000 :デフォルトの名無しさん:2010/12/05(日) 15:37:28
キミ、ダウンキャストっていいたいだけでしょ。

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

215 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)