【初心者歓迎】C/C++室 Ver.73【環境依存OK】 at TECH
【初心者歓迎】C/C++室 Ver.73【環境依存OK】 - 暇つぶし2ch2:デフォルトの名無しさん
10/05/21 10:44:31
tan=y/xとしててx=0の時は場合分けしないといけませんか?
x=0の時はどういう処理にすれば良いのですか?

3:デフォルトの名無しさん
10/05/21 10:46:42
>>2
fabs(x)>fabs(y) のとき y/x
fabs(x)<fabs(y) のとき x/y で計算しておいて M_PI/2 から引く

4:デフォルトの名無しさん
10/05/21 10:49:06
そんな貴方に atan2 じゃないの?

5:デフォルトの名無しさん
10/05/21 13:31:06
構造体型 構造体名前[] = { {a,b,c},{e,f,g},{h,i,j},}としておいて
構造体名前 [] = {{k,l,m},{o,p,q},}とすると0番目の配列から上書きされてしまいますか?
3番目と4番目に入れたいのですが[3]=;[4]=とわけて書かないといけないのでしょうか?

6:デフォルトの名無しさん
10/05/21 13:31:48
すいません。4番目と5番目です

7:デフォルトの名無しさん
10/05/21 14:30:03
x86のFPUのFPATAN命令もx=0の時を考慮している

8:デフォルトの名無しさん
10/05/21 14:45:21
>わけて書かないといけないのでしょうか?
はい。

>上書きされてしまいますか?
その前にfoo[3]の時点で死ぬ。
初期化の時点で要素数指定しろ。

9:デフォルトの名無しさん
10/05/21 14:45:52
配列や構造体のデータを{}を使った代入形式でまとめてセット出来るのは宣言時のみ。
宣言文と代入文は見た目は似ているけど、文法上は全く別要素に定義されている。

10:デフォルトの名無しさん
10/05/21 14:49:39
そうですか…ありがとうございました
あばば

11:デフォルトの名無しさん
10/05/22 17:57:59
デストラクタで親のデストラクタに行くと親のthisポインタがずれる・・・なんだこれは・・・

12:デフォルトの名無しさん
10/05/22 18:02:20
デストラクタに限らず、基底クラスの関数を呼ぶときはそうでないと困るだろ

13:デフォルトの名無しさん
10/05/22 18:06:50
アドレスのオフセットもコンパイラが勝手に調整してくれてるわけよ
ためしに適当に継承されてるクラス作ってstatic_castやってみればわかる


14:デフォルトの名無しさん
10/05/22 18:18:33
な,なおった...
ありがとう

15:デフォルトの名無しさん
10/05/23 02:27:51
マジキチ
3時間くらいぶっ通しで悩んでたら原因がif( = )だった…
エラー出ないのですか?


16:デフォルトの名無しさん
10/05/23 02:32:11
文法的に正しけりゃエラーは出ない

17:デフォルトの名無しさん
10/05/23 02:39:06
if(boolgata = true)
だったのですが文法的に正しいのですか?

18:デフォルトの名無しさん
10/05/23 02:48:58
うん

19:デフォルトの名無しさん
10/05/23 02:53:14

== true

こんなの書くなよ


20:デフォルトの名無しさん
10/05/23 03:28:38
警告レベルによっては警告は出るかもしれない
まあ = true なんて不要というのは確実な話だが
今回はたまたまbool型だったに過ぎない話だな

21:デフォルトの名無しさん
10/05/23 03:45:26
true == も書くし、0 == も書くぜ

22:デフォルトの名無しさん
10/05/23 03:57:01
== true だろうが true == だろうが害悪にしかならない
if (islower(c) == true) { ... } とか書いてハマるタイプ

23:デフォルトの名無しさん
10/05/23 04:05:31
false との比較なら問題ないとでも誰かが言い出しそうなんで念のためいっとくけど、
論理定数との比較がナンセンスなんだよ。

24:デフォルトの名無しさん
10/05/23 04:19:56
え?TRUE ==とか普通に使ってるんだけどダメなの?
if (xxx) { ... } しか書いてない場合、意図通りに動くか不安なんだよな。。

25:デフォルトの名無しさん
10/05/23 04:33:37
URLリンク(www.kouno.jp)

26:デフォルトの名無しさん
10/05/23 04:53:49
マジキチすぎて全俺が泣いた
if( fab(フトートの計算 )<=1/2)&&~←バグ
if( fab(フトートの計算 )<=0.5f)&&~←成功

何故ですか?

27:デフォルトの名無しさん
10/05/23 04:55:59
0以外は全て真なのでTRUEやtrueとの比較は危険極まりない
is系関数はその最たるもので、
is系用の共通テーブル参照→ビット演算で目的のビットを取り出す
で実装される事があるので、真のときは1以外の値が返ってくるのが普通

Windows APIのBOOL型の値を返す関数も
MSDNには「正常な時には0以外の値を返す」のように、必ず1を返すとは書かれない
(GetMessageのような例外はあるが、あれはBOOLと言いつつ0,1,-1の3値を返す関数だから・・・)
1以外の値が返ってくる可能性は常に考えないといけない

真偽値と比較する癖を付ける1以外が返って来た時にハマる
危険極まりない

bool型なら安全だろうけど、癖になってると他の型の値でもやる事になるはずだ

28:デフォルトの名無しさん
10/05/23 04:57:04
>>26
1/2 == 0

×fab
○fabs
×フトート
○float, フロート

29:デフォルトの名無しさん
10/05/23 05:00:56
>>28
マジですか!?
フロートと整数の分数を比べたら小数点が全て切り捨てられるってことですか!?
全然知りませんでしたorz今気付けて良かったです。ありがとうございました

30:デフォルトの名無しさん
10/05/23 05:02:57
1/2は分数じゃなくて整数演算。だから小数点以下は切り捨てられて、結果は0になる。
1.0/2.0なら浮動小数点数演算。結果は0.5になる。

31:デフォルトの名無しさん
10/05/23 05:06:53
そうなんですか…全く知らなかった…
ほんとうにありがとうございました

32:デフォルトの名無しさん
10/05/23 09:41:57
URLリンク(codepad.org)

これはひどい

33:デフォルトの名無しさん
10/05/23 09:42:30
bool型を返さない関数コールして、bool値と比較するなら
バグ作ってるだけだべ

34:デフォルトの名無しさん
10/05/23 09:51:26
falseとの比較は安全だが
== true の代わりに != false を使う事になって
二重否定でとても読みにくい

35:デフォルトの名無しさん
10/05/23 09:53:35
>>23の予言が的中しました。まぁ、相当の高確率で当たる予想だけどねw

36:デフォルトの名無しさん
10/05/23 09:58:32
>>23は「俺はfalseと比較してるから問題ないだろ!」という人に対するもので
>>34とは根本的に違う

37:デフォルトの名無しさん
10/05/23 12:50:04
if(xxx) では文脈的にわかりにくいときだけ if(xxx != false) とする

38:デフォルトの名無しさん
10/05/23 13:15:50
それならたまになくはないな

39:デフォルトの名無しさん
10/05/23 16:42:53
std::stringのc_str()関数が返すポインタが有効なのはいつまでですか?
希望としてはそのインスタンスに対してなんらかの操作(結合とか)をするまでは有効だとうれしいんですが。
勝手にメモリが移動したりとかそんな挙動があったらイヤです。

40:デフォルトの名無しさん
10/05/23 16:51:13
非constメンバ関数を呼ぶまでは有効と保証されてる

41:デフォルトの名無しさん
10/05/23 17:01:00
かりに保証されててもレガシーコードに渡す一時的な値としての使い方以外はしない方が健全


42:デフォルトの名無しさん
10/05/23 17:01:35
>>40-41
ありがとうございます!!!

43:デフォルトの名無しさん
10/05/23 17:01:54
関数作る時引数全部 std::string にしてんのか?
流石にそりゃないだろう

44:デフォルトの名無しさん
10/05/23 17:04:32
いいえ

45:デフォルトの名無しさん
10/05/23 17:08:16
文字列リテラルやそれ入れただけの定数を渡す事もあるんだろうし
std::stringである事を特に利用しないなら
関数の引数はconst char*にした方がいいよ
std::stringである事を利用したいなら別だが

46:デフォルトの名無しさん
10/05/23 21:10:01
c++でクラスで書かれたソースの関数を使いたいのですが
Cではヘッダをインクルードして関数名を書けば使えたと思うのですが
C++ではnewなどをしないと使えないのですか?

47:デフォルトの名無しさん
10/05/23 21:15:36
関数はnewしなくても使えるよ。そもそも関数はnewできない。

48:デフォルトの名無しさん
10/05/23 21:29:53
つまり
クラス::関数名();でも使えるってことですか?
newして 名前ー>関数()とするのとはどう違うんですか?

49:デフォルトの名無しさん
10/05/23 21:48:22
>>48 試せ。ググれ。

50:デフォルトの名無しさん
10/05/23 22:01:21
教えてください

51:デフォルトの名無しさん
10/05/23 22:17:35
>>50
URLリンク(codepad.org) ここで試せ。
URLリンク(www.google.co.jp) ここでググれ。

52:デフォルトの名無しさん
10/05/23 22:19:48
いやです

53:デフォルトの名無しさん
10/05/23 22:22:46
試し方がわかりません

54:デフォルトの名無しさん
10/05/23 22:28:16
>>48
入門書の1冊でも買って読んでください

55:デフォルトの名無しさん
10/05/23 22:32:39
初心者ページもかなり読みましたよ
プログラミングは2年やってますし

56:デフォルトの名無しさん
10/05/23 22:32:53
static メンバ関数

57:デフォルトの名無しさん
10/05/23 22:48:53
ここで中途半端な知識を身につけたら
あとで正しく理解するのに苦労しそうだな

58:デフォルトの名無しさん
10/05/23 22:48:54
読んだことも使ったこともあるけど、何をやってるのか、どう違うのかわからないっていう

59:デフォルトの名無しさん
10/05/23 22:53:17
2年やってこんなことも分からないなんて、正直なところすごいかわいそうだと思った


60:デフォルトの名無しさん
10/05/23 22:55:57
業務5年以上やっても、fopenシラン奴もいる

61:デフォルトの名無しさん
10/05/23 22:56:00
だから聞いてるんじゃん

62:デフォルトの名無しさん
10/05/23 22:58:57
>>60
給料泥棒すぎるだろそいつ…

63:デフォルトの名無しさん
10/05/23 23:18:36
>>46
staticメンバならそのまま呼べる。そうでないならインスタンスを作成してから呼ぶ。

64:デフォルトの名無しさん
10/05/23 23:30:50
>>60
普通API使うだろ。知らなくてよし

65:デフォルトの名無しさん
10/05/23 23:46:50
「普通」っていうのはたいてい「俺は」って意味のところを大勢に見せたいだけだよね。

66:デフォルトの名無しさん
10/05/23 23:49:12
標準で済む操作にOSのAPIを直で使って環境移行の手間を増やす馬鹿野郎は貴様か。

67:デフォルトの名無しさん
10/05/23 23:49:14
普通はそうだね

68:デフォルトの名無しさん
10/05/24 00:07:07
直APIだと、一般的にはパフォーマンスも落ちるわけだしね。

勘違いしてる初心者も多いけど
ラップ(バッファリング)することによって
システムコールの回数を減らす方が、
毎回呼び出すよりずっと処理が軽くなるから。

69:デフォルトの名無しさん
10/05/24 01:24:28
激しく亀レスなんだが、前スレ857の
 int tolower(int c);
 これってなんでint型を使うんですか?charじゃダメなんですか?
なんだけどさ

VCではあらかじめロケールの設定をしておくとマルチバイト文字も変換できるようだ。

#include <cstdio>
#include <clocale>
#include <cctype>
using namespace std;
void main()
{
setlocale( LC_CTYPE, ".932" );
char str[] = "A";
int n = tolower( ((int)(unsigned char)str[0] << 8) | (int)(unsigned char)str[1] );
str[0] = (n >> 8) & 0xff;
str[1] = n & 0xff;
puts( str );
}

少なくとも、VC2005とVC2010でこれ動かすと、a と表示される。
だから、charでは不足する。
標準C的には、どうかは知らんが・・・

同様の手順を踏めば、 is系、たとえばisdigitも全角文字の1とかにも反応する。
さすがに、ローマ数字や漢数字はだめだったけど…

70:デフォルトの名無しさん
10/05/24 10:27:23
>>68
モダンなOSなら自分でバッファリングしてるし
メモリマップトI/Oや非同期I/Oもある
標準ライブラリを使うのはパフォーマンスのためというのは間違いで、
単純に移植性のためだ

それと、Windowsではファイル名が固定の場合以外にfopen()使ってるプログラムは
全て糞と断定していい

71:デフォルトの名無しさん
10/05/24 13:23:21
Aのcppのファイルでexternした構造体があってグローバルで宣言して凄い呼び出す関数の中で初期化される
Bのcppでグローバル位置で宣言するとA.objで既にあるので未解決のシンボルとエラーが出る
Bのcppの使う関数の中で宣言すると通る
なぜですか?それと、値はちゃんと入ってますか?

72:デフォルトの名無しさん
10/05/24 13:28:30
>>71
宣言と定義を含め、externするとか初期化するとか、用語の使い方が胡散臭くてよくわからん。
意味をよく調べて言いなおすか、ソース貼ったほうがいいよ。

73:デフォルトの名無しさん
10/05/24 13:40:40
ありがとうございました
全く同じ物を代入しようとしてたみたいです
それで未解決になったのかはわかりませんが。


74:デフォルトの名無しさん
10/05/24 13:46:26
>>70
言いたいことは彼と一緒だと思うよ。直APIという言葉がうさんくさいけど、
その後を読めばAPI使ったほうが軽いといっているように見える

75:デフォルトの名無しさん
10/05/24 15:43:53
>>70
「カーネルモードへの移行」が、
単純な関数呼び出しより重い処理だと言う話だ。
OSのキャッシュとかは全然関係ない。

メモリ確保等でも同様。

76:デフォルトの名無しさん
10/05/24 15:46:24
常に非同期I/Oしか使わないとでもいうならともかくね。

77:デフォルトの名無しさん
10/05/24 16:57:18
は?お前らアホじゃねーの?

パフォーマンスの話だろ?
パフォーマンスが重要なら、
mmap()やwritev()やreadv()、sendfile()のような物が使えるときはそれを使う
当たり前だろ
DBMSみたいなソフトウェアの実装でstdio使ってるとでも思ってるのか?
Berkeley DBのソースでもよめや

stdio使うのは移植性だよ

78:デフォルトの名無しさん
10/05/24 17:03:18
>>77
実測で差が有意だ と わかってるなら

79:デフォルトの名無しさん
10/05/24 17:06:28
>>78
勿論有意だからこそ、本当にI/Oパフォーマンスが重要なところでは
誰もstdioなんぞ使わないんだよ

バッファリングしてるから速いって、アホか?
stdioバッファへの余分なコピーが「常に」発生するのがstdioだ
ポータブルなgetc()やらではマルチスレッド対応の排他制御までオマケつきだ


80:デフォルトの名無しさん
10/05/24 17:09:33
つまり、「ふつー」のアプリではstdio使うのが当然と言うことですね。
ファイルI/Oなんかよりも遥かにのんびりしたヒューマンI/Oがあるんですから。

81:デフォルトの名無しさん
10/05/24 17:10:27
それはそうと、
>それと、Windowsではファイル名が固定の場合以外にfopen()使ってるプログラムは
これの根拠を知りたい。

82:デフォルトの名無しさん
10/05/24 17:18:22
>>80
Windowsではstdioは使っていいけどfopen()はダメ
>>81
ファイルシステムがUTF-16なのに、fopen()はUTF-16ファイル名を扱えないからだよ

83:デフォルトの名無しさん
10/05/24 17:26:13
>>82
ってことは、ファイル名が固定でなくても制限できればいいんでないの?
つまり、「ユーザに任意のファイル名を扱わせたいのならfopen()はダメ」ってことじゃない?

84:デフォルトの名無しさん
10/05/24 17:32:37
>>83
厳密に言えばそうなるかもしれんが、何かそこに重要な意味があるの?

85:デフォルトの名無しさん
10/05/24 17:36:14
糞と断じるには根拠に乏しいかと。
「ユーザに任意のファイル名を選択させておいてfopen()を使っているプログラムは糞」なら兎も角。
最初からそう書いていれば、無用な反発も避けられるし>81が質問する必要もなかった。

86:デフォルトの名無しさん
10/05/24 17:37:22
おまえら文字コードとかロケールとかどこで勉強してんの?
近所の大型書店走査しても参考書売ってねーんだけど


87:デフォルトの名無しさん
10/05/24 17:44:12
>>85
面倒くさい奴だな…

> Windowsではファイル名が固定の場合以外にfopen()使ってるプログラムは糞

> ユーザに任意のファイル名を選択させておいてfopen()を使っているプログラムは糞
は大した違いないだろ

後な、現実問題として、例えばユーザプロファイルディレクトリのような
ファイルシステム上重要なディレクトリも全てUTF-16で、
Windowsにおいて、それはプログラムが勝手に選べるものじゃないんだぞ?
Windowsでfopen()使ってるのは、Unix系のソフトウェアの手抜き移植か
オモチャだけだよ

88:デフォルトの名無しさん
10/05/24 18:42:00
>>86
MSDNとかmanとかで勉強してみてはいかがか

89:デフォルトの名無しさん
10/05/24 21:33:02
C++のクラスで
int hogehoge::createHash( char *p, int size )
{
//処理
}

int hogehoge::createHash( )
{
return createHash(data, size);
}

見たいに、内部データのハッシュを返す関数と
オーバーロードして任意のハッシュを返す関数二つを公開してるんだが
これだとクラスが使われ方知ってない?とか言われた
こういう書き方って駄目?静的にすればいいのかな

90:デフォルトの名無しさん
10/05/24 21:45:57
createHash(char*,size_t)はhogehogeの情報がいらないからメンバにしない
createHash(const hogehoge &)にする
staticかfriendにしなければ実装できなければそうするか、あるいはメンバcreateHash()にする



91:デフォルトの名無しさん
10/05/25 01:02:22
class A が class B のオブジェクトを作り、それがさらにclass Cのオブジェクトを
作るという関係があるとします。 これら、A,B,Cはフレームワークの提供する
クラスで変更はしたくありません。

ここでAを継承したAA, Cを継承したCCを作り、CCからそれを作ったAAの仮想メソッドを
呼びたいと思います。 AAは1つのインスタンスしか作らないので、AA::instance()という
スタティックメソッドを作り、それをCCのコンストラクタから呼ぶ様にしました。 
AA, CCは元のフレームワークを少々カスタマイズした階層という感じです。

さて、ここで実際のアプリを書く時に、さらにAAを継承したAAAを書き、
それを書けばCCはAAAの仮想メッソドを呼ぶ様にしたいと思ったのですが、
static methodってvirtualに出来ない、よってAAA::instanceというものは書けない、
という事を知って詰まってしまいました。 何か別の手はあるのでしょうか?

92:デフォルトの名無しさん
10/05/25 01:07:16
>>91 AA::instance() を static じゃなくて virtual にすればいいんじゃないの?

93:デフォルトの名無しさん
10/05/25 01:51:03
>>92
AAのインスタンスが無い(もともとインスタンスを獲る為のメソッド)ので
virtualを呼ぶ為のオブジェクトがありません。

94:デフォルトの名無しさん
10/05/25 01:52:17
>>93 だったら渡せよ。

95:デフォルトの名無しさん
10/05/25 01:53:10
日本語で伝えられないならコードを書けばいいのに。

96:デフォルトの名無しさん
10/05/25 02:34:37
B、Cのオブジェクト一つ一つがAのポインタを保持すればいいだけじゃないか
こう言うとメモリの事とかについて何か言い返してきそうだな

97:デフォルトの名無しさん
10/05/25 02:57:57
>>96
そう出来れば楽なのですが、制約事項としてB,Cは改変したくない。 
結局、グローバルでは出来るのかなと試して、一応希望の動作をしたのが以下のコードです。
AAがA,CCがCから派生というのは省略。

// AA.h
class AA {
 public:
  AA();
  virtual void doA(); };
extern AA *global;

// AA.cc
#include "AA.h"
AA *global;
AA::AA() { global = this; }
void AA::doA() { /* doA */ };

// CC.h
class CC { public: void doA(); }

//CC.cc
#include "AA.h"
#include "CC.h"
void CC::doA() { global->doA(); }



98:91
10/05/25 03:02:50
で、この2つのクラスがある状態で (#include 略)

main () {
 AA a; CC c;
 c.doA(); }

とするとAA::doA()が呼ばれる. さらに
class AAA : public AA {
 public: virtual void doA();
};

void AAA::doA() { /* doA */ }

main() {
 AAA a; CC c;
c.doA(); }

とするとAAA::doA()が呼ばれます. これでAA* と CCの間にクラスBを挟んだ
関係があっても無関係にAA*とCCが結びつけられた. というのをstatic method
で出来ないかと思ったのが91の質問でした.





99:デフォルトの名無しさん
10/05/25 03:03:50
>>97 なんで CC::doA() に引数で渡さないの?

100:デフォルトの名無しさん
10/05/25 03:05:47
>>98
じゃぁこれで。
template<class A> class CC { void doA() { A::doA(); } };
CC<AA> c;
CC<AAA> c;

101:91
10/05/25 03:22:52
>>99
CC::doA()が呼ばれる文脈でAAのインスタンスへの参照が無いからです.
ここで書いたmain()は省略した見本でして、実際の実行環境の制限事項を
反映してません。

>>100
出来ればCCは1つのライブラリで済まし、AAから派生したAAA1, AAA2, AAA3
に対して1つのバイナリで済ませたいなと思ってます。CCの機能はそれぞれの
AAA*に対して全く共通なので。

102:デフォルトの名無しさん
10/05/25 03:40:31
>>97 できてるじゃん。

103:91
10/05/25 03:52:20
>>102
いや、出来てるんですけど、グローバルを使っていいのかな? もっとC++っぽい
やり方があるならば知りたいなと思いました。 

104:デフォルトの名無しさん
10/05/25 03:57:07
>>103
既存のフレームワークとやらでメンバ変数経路は変更不能で、
呼ばれる文脈とやらも変更不能なんだろ?
そこに AA のインスタンスを渡す必要があるんだろ?

グローバル使う以外に何も見えてこないじゃないか。

105:91
10/05/25 04:00:40
>>104
ありがとうございます。 そうはっきり言って頂いてすっきりしました。

106:デフォルトの名無しさん
10/05/25 08:21:14
C++で構造体を作ってクラスのprotectedのメンバに入れてクラスに他所のcppの関数中でその構造体にメンバが入るような関数を作った
のですが「.」を押してもメンバ変数がポップアップされません
これは上手く入ってないのでしょうか?


107:デフォルトの名無しさん
10/05/25 09:42:04
>>90
有り難うございます。
内部のcreateHashはclass独自の物ですが、中々優秀で他でも流用したいが為に公開していました。
一々、hogehogeを作成しメンバ設定、その後にcreateHashでは面倒に思えるのですが。。
今はstaticを付けていますが、今後は別の方法を試すべきでしょうか?

108:デフォルトの名無しさん
10/05/25 10:40:41
汎用ハッシャーを分離してモジュール化すればいいじゃない

109:デフォルトの名無しさん
10/05/25 11:53:25
>>108
有り難うございます
皆さんだったら、どのように書きますか?
是非参考にさせて下さい。

110:デフォルトの名無しさん
10/05/25 14:58:59
ウォッチしてる値がある値になった時にブレークさせるような方法はありますか?VC++2008EEです

111:デフォルトの名無しさん
10/05/25 15:23:45
>>110
URLリンク(msdn.microsoft.com)
URLリンク(msdn.microsoft.com)(VS.80).aspx

112:デフォルトの名無しさん
10/05/25 15:34:41
>>111
ありがとうございました

113:デフォルトの名無しさん
10/05/25 17:44:49
operator .* (obj, func)でobjをバインドしたfunctionを返せば
メンバ関数ポインタをエミュレートできるとおもったら.*はオーバーロードできねーのかよ
->*ならできるのにこの差別はひどい。がっかりだ

114:デフォルトの名無しさん
10/05/25 17:45:58
日本語で喋れやカス

115:113
10/05/25 17:50:36
>>114
要約するとうるせーよ死ねカスってことです

116:デフォルトの名無しさん
10/05/25 17:53:44
日本語も喋れない奴にプログラミングは無理
これ、豆知識なお坊ちゃん

117:デフォルトの名無しさん
10/05/25 20:14:36
>>114
低脳は>>113は理解できない
>>113が何を言っているか解るか? なら日本語でお前がしゃべってくれ

118:デフォルトの名無しさん
10/05/25 20:33:35
なんか必死な奴がいるな

119:デフォルトの名無しさん
10/05/25 21:30:14
>>114
阿呆な奴は>>113の言ってることを理解できない
君は>>113が言ってることを理解できてるのかい?
理解できているなら君が日本語で話してくれ

駄目だ
117が何を言いたいのか分からん

120:デフォルトの名無しさん
10/05/25 21:47:12
>>113を理解するのは阿呆にはできない。しかも>>113は日本語になっていない。
もし>>114が阿呆でなく、理解できるのであれば、>>117>>113を理解できない阿呆であるので
>>114が日本語に翻訳してくれないだろうか。

ということじゃないの?
>>114>>113を理解できていないのは明白なので、なぜ>>114に対してそういったのかは
俺にもわからん。

121:デフォルトの名無しさん
10/05/25 22:19:54
そんなことよりMoreC++Idiomの日本語訳を早く埋めてくれ。英文読むのめんどくさい

122:デフォルトの名無しさん
10/05/25 22:20:32
>>119-120
>>113を訳してくれ、低脳君


123:デフォルトの名無しさん
10/05/25 22:44:18
>>122
自己紹介乙

124:デフォルトの名無しさん
10/05/25 22:45:09
>>119-120
>>113
>.*はオーバーロードできねーのかよ
出来ない理由を教えろ

125:デフォルトの名無しさん
10/05/25 22:50:39
そういう仕様だから

126:デフォルトの名無しさん
10/05/25 23:01:20
>>124
operator.をオーバーライド可能にするとメンバへのアクセス手段がなくなるから、とかじゃなかったっけ?
で、operator.*も同じ理由。
D&Eにそんなようなことが書いてあった気がする。

127:デフォルトの名無しさん
10/05/25 23:05:43
. と ->
.* と ->*
こう見ると分かりやすいな

128:デフォルトの名無しさん
10/05/26 06:34:03
ファイルの名前を取得したいのですがどうすれば良いですか?

129:デフォルトの名無しさん
10/05/26 06:35:28
FindFirstFileですね。わかりました

130:デフォルトの名無しさん
10/05/26 07:27:41
charの配列があるのですが改行で区切られてる間の文字列を取得したいのですが
getsかなと思って調べたら絶対に使うなとか書いてあるし、fgetsはファイルを扱う関数なのでどうすれば良いかわかりません
教えてください

131:デフォルトの名無しさん
10/05/26 08:01:06
>>121
インポート依頼が処理されずに止まったままなんだ。

132:デフォルトの名無しさん
10/05/26 09:04:24
>>130
fgets(...., stdin)


133:デフォルトの名無しさん
10/05/26 09:11:35
>>132
ありがとうございます
fgetの一つ目の配列は取得した文字を入れる配列ですよね?
二つ目の引数のstdinは標準入力から取得すると見たように思うのですが、どうやって元の文字列の配列を選択するのでしょうか?

134:デフォルトの名無しさん
10/05/26 09:35:37
>>133
日本語でOK。
文字列から文字列を分解したいのか、(gets()のように)標準入力から文字列を得たいのか、どっちなのかと。
後者ならchar buf[DesiredSize]; fgets(buf, sizeof(buf), stdin);とすればいいし、
前者ならsscanf()かsprintf()で切り張りすればいい。

135:デフォルトの名無しさん
10/05/26 09:38:53
strtok(...,"\n")
ただし、元の配列の中身は破壊される

136:デフォルトの名無しさん
10/05/26 09:42:50
>>134
>>135
ありがとうございます
strtokで\0を入れた後、それぞれを配列に入れる方法がわかりません
教えてください

137:デフォルトの名無しさん
10/05/26 09:47:25
目的がよく判らんが、改行でばらす程度なら破壊型でスレッドセーフでない実装もあるstrtok()は要らん。
尤も、sscanf()をどうしても使いこなせないならstrtok()を使うことを止めはしないが。

138:デフォルトの名無しさん
10/05/26 09:48:57
>>136
なんで自分がやりたいことの説明ができないの? 馬鹿なの? 日本人じゃないの?

139:デフォルトの名無しさん
10/05/26 09:51:26
もしかしてsscanfで"%s \n %d \n",str1,str2とすれば良いだけですか?

140:デフォルトの名無しさん
10/05/26 09:54:01
>>138
すません
やりたいことはchar 型の文字列があって\nがたくさんあって、ファイルで表示すれば1行ごとになるはずの文字列を取り出してそれぞれの行を違う配列に入れたいのです

141:デフォルトの名無しさん
10/05/26 09:54:29
ダメだこいつ。

142:デフォルトの名無しさん
10/05/26 09:56:14
できれば行が多くなった時に配列をたくさん作るのを避ける方法も教えて欲しいです

143:デフォルトの名無しさん
10/05/26 10:19:02
めんどくせーから C++ で iostream と string で getline() 使えよ。

144:デフォルトの名無しさん
10/05/26 10:43:00
まぁ、先ずは入出力をきちんと定義するところから始めようか。
入力は改行文字を多数含んだ文字列と言うことだが、それはいきなり渡されるということなのか?
要は、作ろうとしているのは関数なのかプログラムなのか、その辺りもはっきりさせてくれ。

145:デフォルトの名無しさん
10/05/26 10:51:01
関数を作ってるのではありません。関数の中でグローバルの変数である配列に改行を含んだ文字列を入れまして
その配列から改行までの区間を何個か取り出して、違う配列に入れるなりして元の文字列のある行の文字の部分だけを新しい文字列として使いたいのです

146:デフォルトの名無しさん
10/05/26 10:57:25
>>145
すでにでかい配列に読み込み済みなら gets() も fgets() も関係ないな。
そのままプログラム書けよ。

ひととおり書いて、 URLリンク(codepad.org) に晒して、不満な箇所を具体的に
挙げるといいよ。

147:デフォルトの名無しさん
10/05/26 11:00:42
>>146
なるほど、でかい配列を使いたくないのでfgetsなどでやるわけですね。
sscanfでできそうなので続けて見ます

148:デフォルトの名無しさん
10/05/26 11:06:44
strchr()で改行文字を探して、一文字ずらして行頭のリストを作れば事が足りそうなんだが。
つーか、なんでグローバル変数なんかにテキスト入れるのかねぇ。
相変わらず説明下手だし。

149:デフォルトの名無しさん
10/05/26 11:12:13
>>148
知識が無いので自分も何を伝えるべきなのかわからないのです
>strchr()で改行文字を探して、一文字ずらして行頭のリストを作れば事が足りそうなんだが。
>つーか、なんでグローバル変数なんかにテキスト入れるのかねぇ。
と当たり前のごとく言われても、どういう方法なのか、なぜグローバル変数にテキストを入れたらいけないか、普通はどうするのか、等、わからないのです。


150:デフォルトの名無しさん
10/05/26 11:21:56
やりたいことをきちんと説明できないからこそ、
弄られることになるし
詳しく説明してもらえないし
見当違いのレスを読むことになるわけで。
心穏やかに他人になった積もりで>145を読んで、
それで何をしたいか判るかね。

151:デフォルトの名無しさん
10/05/26 11:25:55
>>150
どこがわからないのですか?
自分は完璧に説明したつもりなのですが
そちらは知識が多すぎて混乱してしまうのかもしれませんが

152:デフォルトの名無しさん
10/05/26 11:28:22
いいからプログラム書け。日本語はこの際あきらめろ。

153:デフォルトの名無しさん
10/05/26 11:31:25
char str[]="fafafad\nfakfjak\nfakdfad\nfkajfk\nfjak"があって例えばnfakfjak\を取り出したいということなのですが


154:デフォルトの名無しさん
10/05/26 11:33:35
「なのですが」?続きはどうした?

155:デフォルトの名無しさん
10/05/26 11:37:42
これをchar str1[] = nfakfjak\;
の状態にしたいのです

156:デフォルトの名無しさん
10/05/26 11:52:42
char const * str0 = str;
char const * str1 = NULL;
char const * str2 = NULL;
char const * str3 = NULL;
:
:
str1 = strchr(str0, '\n');
if (str1) {
++str1;
str2 = strchr(str1, '\n');
if (str2) {
++str2;
str3 = strchr(str2, '\n');
:
:
}
}


157:デフォルトの名無しさん
10/05/26 22:15:52
ウォッチを見ていると配列の後のほうまで意味不明の文字が入ってたりしますが
strcmpを使うとちゃんと一致したりします
あれはどうなっているのでしょうか?

158:デフォルトの名無しさん
10/05/26 22:18:35
ナルまでを比較するので。

159:デフォルトの名無しさん
10/05/26 22:21:51
ナルェ

160:デフォルトの名無しさん
10/05/26 22:25:42
犠牲になったのだ

161:デフォルトの名無しさん
10/05/26 23:13:46
マジキチ
defineの最後に;つけてたら一番最後の関数で)だの;}のエラーが出やがった
偶然気付かなきゃ一生やってるレベル

162:デフォルトの名無しさん
10/05/26 23:21:49
一生やってろ

163:デフォルトの名無しさん
10/05/27 00:05:19
>>157
デバッガの使い方はその開発環境のスレでどうぞ。つーか、Cの文字列の仕組みくらい勉強しましょう。

164:デフォルトの名無しさん
10/05/27 11:34:42
LPCTRとかが良くわからないのですがキャストしたらエラーが取り合えず消えるので全部キャストでも問題ありませんか?

165:デフォルトの名無しさん
10/05/27 11:49:37
LPCTRってなんだよ・・

LP: LongPointer(16bit時代は32bitポインタをLongPointerと呼んだ)
C: Const
T: Tchar
STR: STRing

これらを適当に組み合わせただけ

166:デフォルトの名無しさん
10/05/27 13:48:26
わかりにくいからTSTRCLPにすればいいのに

167:デフォルトの名無しさん
10/05/27 18:24:52
>>164
死ねばいいと思うよ

168:デフォルトの名無しさん
10/05/27 20:09:14
>>164
問題尾大有りだ

169:デフォルトの名無しさん
10/05/27 20:13:38
Windowsプログラムの場合は、適当にLPCSTRとか入れればいいよ
結構適当でも動く

170:デフォルトの名無しさん
10/05/27 22:10:06
C++ができれば他の言語なんて楽勝とかいうけどVBAムズイじゃん。使っててすげー気持ち悪い



171:デフォルトの名無しさん
10/05/27 22:11:20
変数のスコープを限定できない言語は難しい

172:デフォルトの名無しさん
10/05/27 22:16:20
VBA使ってみて配列の下限が自由なのは一見便利そうに見えるけどコードが汚くなるだけだと気がついた


173:デフォルトの名無しさん
10/05/28 09:15:30
FindFirstFileやfopen等、ファイル処理の勉強をしているのですが
ファイル名を変更するにはどうすれば良いのでしょうか?
ファイル名 変更 c++等とぐぐっても出てきません。方法を教えてください


174:デフォルトの名無しさん
10/05/28 10:02:24
>>173
検索の仕方が間抜け過ぎだろ。
「ファイル名変更」「c」で検索して3番目によると、rename()を使えとある。

175:デフォルトの名無しさん
10/05/28 10:46:14
循環参照を気にせず仕えるスマポってweak_ptrのようなカウンタを2重にもつ形式が一番手っ取り早いのでしょうか?

176:デフォルトの名無しさん
10/05/28 13:39:53
コードのシンプルさではカウントがいいかな
newのオーバーヘッドを避けたいなら侵入型リストでもいい

177:デフォルトの名無しさん
10/05/28 15:08:51
std::vector等を自分のソース内でVector等と置き換えて書きたいのですが
#define Vector std::vector
と書く以外でいい方法はありますか

178:デフォルトの名無しさん
10/05/28 15:11:33
>>177
置き換えないのが一番いい

179:デフォルトの名無しさん
10/05/28 15:11:55
継承したりメタ関数を使ったり

180:デフォルトの名無しさん
10/05/28 15:25:03
>178
そのうち自作クラスと置き換えとか色々やってみたいので
差し替えが簡単なように書いておきたいのです

>179
メタ関数というのは初耳ですが調べて試してみます

ありがとうございました

181:デフォルトの名無しさん
10/05/28 16:09:35
>>177
using std::vector;

182:デフォルトの名無しさん
10/05/28 16:57:29
クラスの所属するnamespaceじゃなくてstdにswapを追加するメリットってあるの?
using std::swapをしらなくてstd::swapにしちゃうカスが同僚にいても安心程度のメリットしかないように思えるんだけど…


183:デフォルトの名無しさん
10/05/28 17:19:51
>>176
オーバーヘッドは気にならないからシンプルにいけるカウンタ方式がいいのだけど
weak_ptrと同様の実装をするとダングリングポインタの問題をどうにかしないといけないんですよねぇ・・・

184:デフォルトの名無しさん
10/05/28 18:33:57
>>182
stdにswapを追加したことはないが、std::swapの特殊化を明示的に行うことは多々あるな

185:デフォルトの名無しさん
10/05/28 20:31:12
>>182
boost::swapもあるよ

186:デフォルトの名無しさん
10/05/28 20:33:23
繰り返し使うところは、stdつけたほうがいいな。他人も使うようなコードは。ライブラリ。
usingつかうと名前かぶる危険。
defineの置き換えもつかワン方が良い。
ただの置換のうえに、他のコードにも影響出る。



187:デフォルトの名無しさん
10/05/28 21:16:32
>>182
ないだろうな
stdの中をいじるデメリットの方が大きいと思う

188:デフォルトの名無しさん
10/05/28 21:39:50
特殊化するならメリットはある

テンプレートのライブラリで値を交換するとき
通常(?)はstd::swapを使うでしょ
特殊化されていれば効率とか、例外安全性があがる可能性がある

189:188
10/05/28 21:51:00
ごめん、質問ちゃんと読んでなかったわw

190:デフォルトの名無しさん
10/05/28 21:58:26
>>188
通常はstd::swapを使うってのは無いな

オブジェクトの型がプログラマにわかってるならドキュメントなりヘッダを調べて
メンバのswap
同じ名前空間のswap
stdのswap
の順番に明示的に書く

オブジェクトの方がテンプレートでコードを書いてる時には分からない場合は
TMPでメンバのswapを検索してあればそれを明示的に使う
見つからなければusing std::swap;して修飾なしのswap


191:デフォルトの名無しさん
10/05/29 00:10:33
メモリの確保量調べる方法はないですか。これはできないです。

char *A=new char [1000];
cout<<sizeof(A)<<endl;

192:デフォルトの名無しさん
10/05/29 00:16:37
自己解決しました

_msize
ヒープに割り当てられたメモリ ブロックのサイズを返します。

193:デフォルトの名無しさん
10/05/29 00:35:07
確保されているメモリ調べると[1000]でちょうど1000にはならないな。
わりといい加減に確保してくるな。

194:デフォルトの名無しさん
10/05/29 01:08:53
>>190
そんな手間をかけなくて済む(かつ、バグの温床に)ならないようにstd::swapを特殊化するわけだが。。。
気にせずstd::swapでかけるようになるんだよ。

195:デフォルトの名無しさん
10/05/29 01:15:38
>>194
関数テンプレートの部分特殊化ができれば全部それでもいいんだけどね

196:デフォルトの名無しさん
10/05/29 01:32:51
>>191 std::vector 使え。

197:デフォルトの名無しさん
10/05/29 03:18:09
>>195
浅はかな俺を許してくれ。
つまるところがんばって書き分けないとダメってことになるのかなorz

198:デフォルトの名無しさん
10/05/29 07:44:15
>>190
std::swapを特殊化せずに、その検索をやってくれるのがusing boost::swap

199:デフォルトの名無しさん
10/05/29 07:54:32
usingいらなくね?
boost::swap(lhs, rhs);

200:デフォルトの名無しさん
10/05/29 08:10:55
それはなかでusingしてるし

201:デフォルトの名無しさん
10/05/29 08:14:06
>>200
そこが便利なところ

202:デフォルトの名無しさん
10/05/29 08:26:33
>>198
メンバは検索してくれないじゃん・・・

203:デフォルトの名無しさん
10/05/29 19:03:04
>>202
普通メンバswapがあったらフリー関数swapも作るだろ常識的に考えて

204:デフォルトの名無しさん
10/05/30 22:23:13
sin関数を使おうと#include <math.h>したのですが
デバッグでウォッチを見ると
「sin(0.0) CXX0017: エラーです: シンボル "sin" が見つかりません」
となってしまいます、動作自体はしっかりしているようなのですが
気になりますので教えてください

205:デフォルトの名無しさん
10/05/30 22:24:06
たしかmathは何かのコンパイルオプションがいるはず

206:デフォルトの名無しさん
10/05/30 22:26:09
-lmのことか

207:デフォルトの名無しさん
10/05/30 22:55:12
>>205-206
ありがとうございます
恥ずかしながらコンパイルオプションの追加の仕方がわかりません...
プロパティ->リンカ->コマンドラインの追加のオプションで-lmとしてみたのですが検討外れのようです
visual C++ 2008 EEを使用しています、繰り返しお願いします

208:デフォルトの名無しさん
10/05/30 22:58:57
ああ、デバッグのウォッチか
ウォッチに関数は使えないぞ

209:デフォルトの名無しさん
10/05/30 23:04:27
>>208
なるほど、ありがとうございます!


210:デフォルトの名無しさん
10/05/30 23:08:17
数学関数くらい使えるようになって欲しいとは思うんだけど
何で使えないのかねえ

211:デフォルトの名無しさん
10/05/30 23:25:54
>>208
あれ? VC++ だといろんな式の評価ができたような?
そこに fopen() とか突っ込んで嵌ってたこともあったり。

夢だったのかもしれん。

212:デフォルトの名無しさん
10/05/30 23:51:32
関数は使えるよ
URLリンク(msdn.microsoft.com)

静的リンクする場合は最終的にリンクされてる関数しか呼べないらしい
それでもsinはCXX0047だったけど
abort()とか{,,MSVCR100D.dll}abort()したら死んだ
printfも出来たよ

213:デフォルトの名無しさん
10/05/31 15:16:05
公開されているライブラリは

スタティックリンクライブラリ ではなく
ダイナミックリンクライブラリ(DLL) であることが多いいです、なぜ?

それぞれのメリット・デメリット教えて欲しいです

自分はいつもスタティックリンクライブラリにしているので気になりました

214:デフォルトの名無しさん
10/05/31 16:50:32
関連アプリを全部ビルドしなおすのがめんどいから。
あと関連アプリが全部ちょっとずつ大きくなるから。

215:デフォルトの名無しさん
10/05/31 17:10:02
dllで公開する関数って引数にintとか使ったらintの長さが違うコンパイラだとまちがいが起こるかもってことだよな?

216:デフォルトの名無しさん
10/05/31 17:21:13
コンストラクタで引数を取って
その引数と同一の値で生成されたインスタンスが既に存在する場合にはその参照を返すような
引数の値に対してインスタンスの数が必ず一つであるような仕組みをどう構築したらよいでしょうか?

217:デフォルトの名無しさん
10/05/31 17:25:48
>>216
flyweight+handlebody

218:デフォルトの名無しさん
10/06/01 10:29:53
ハンガリアンなんて今更、とおもいつつも
ポインタとメンバ変数と大域変数だけは気になってプリフィックス付けてしまうのだが
逆に中途半端で気持ち悪い気もする・・・

今後はプリフィックスをつかわなくても解りやすい命名に変えて言った方が良いのでしょうか?

219:デフォルトの名無しさん
10/06/01 12:22:23
>>218
メンバ変数と大域変数は型の間違いと違って
コンパイラでの検出がされにくい場合があるのでつけるのもありという論がある

ポインタの場合、ポインタとそうでないものを区別して認識しながら書かなきゃいけないって
やり方自体がそもそも、ミスの元といえる。これは理想論すぎるかもしれないが

>今後はプリフィックスをつかわなくても解りやすい命名に変えて言った方が良いのでしょうか?
もしこれが、g_の代わりにglobal_みたいにするとかいう意味なら
ハンガリアンが叩かれる意味を理解してないと思われる



220:デフォルトの名無しさん
10/06/01 19:34:47
VisualStudio2005を利用しています
C#でいう#regionを代用できるものはC++にありますか?

221:デフォルトの名無しさん
10/06/01 19:47:26
>>220
URLリンク(msdn.microsoft.com)(VS.80).aspx

222:デフォルトの名無しさん
10/06/02 01:17:30
template <typename T>class Hoge{
private:
int a;

public:
template<typename T2> void foo(Hoge<T2> &src){
a = src.a; //ダメ
}

}

この処理をaのGet関数などを使わずうまくこなす方法はないでしょうか?

223:デフォルトの名無しさん
10/06/02 01:22:43
>>222 何が「ダメ」なの?

224:デフォルトの名無しさん
10/06/02 01:35:41
>>223
これをやろうとするとprivateメンバへのアクセスが出来ないとエラーをはきます
当たり前といえば当たり前なんですがうまく回避することは出来ないでしょうか・・・



225:デフォルトの名無しさん
10/06/02 01:38:18
>>224
friend

質問するときはエラーが発生するコードとエラーメッセージを忘れるな。

226:デフォルトの名無しさん
10/06/02 01:59:16
>>225
friend関数にしてしまうと
this->a = src.a;
のような操作が出来ないのでは
自身を引数に渡すように引数を追加するしかないのかなぁ


とにかくやってみるとして

template<typename T2>friend void foo(Hoge<T2> &src){

としたら
error C2995: 'void foo(Hoge<T> &)' : 関数テンプレートは既に定義されています
となってしまいました、どこで間違えたのでしょう・・・?

227:デフォルトの名無しさん
10/06/02 02:07:25
>>226
friend はメンバ関数も指定できる。

228:デフォルトの名無しさん
10/06/02 07:57:45
template <class T> class Hoge
{
template <class> friend class Hoge;

public:
template <class U> void func(Hoge<U> & other)
{
x = other.x;
}

private:
int x;
};

229:デフォルトの名無しさん
10/06/03 22:51:00
質問です。
VS2008にて、setのfindを使い

if (hoge.end() != hoge.find(a))
とやると、STLのxtreeファイルの中で
map/set iterators incompatible
というエラーを出しASSERTされてしまいます(デバッグモードなので)

使い方が間違っているとは思えないのですが、VSのSETのfindは使えないのでしょうか・・・?

230:デフォルトの名無しさん
10/06/03 22:57:38
>>229
すいません、自己解決しました

if (hoge1.end() != hoge2.find(a))
こんな感じのことになっていました・・

231:デフォルトの名無しさん
10/06/06 11:37:36
URLリンク(www.dotup.org)
画像のようなx,yを渡したら
角度θが帰ってくるような関数ってありますか

232:デフォルトの名無しさん
10/06/06 11:39:38
tan2
多分

233:デフォルトの名無しさん
10/06/06 11:44:56
>>231
あーたん

234:デフォルトの名無しさん
10/06/06 11:46:14
>>232,233
atan2()ですね
ありがとうございました

235:デフォルトの名無しさん
10/06/06 11:47:47
そうそう

236:デフォルトの名無しさん
10/06/06 12:28:22
りゅうび

237:デフォルトの名無しさん
10/06/06 13:05:02
積分を行う関数を以下のように作りました。
double Integ( double (*f)(double),double a,double b){
int n = 10000;
double z ;
int X = 1;
double S1 = 0.0;
double S2 = 0.0;
for(z=a+(b-a)/(2.0*n); z<=b-(b-a)/(2.0*n); z+=(b-a)/(2.0*n){
if(X%2 == 1){
S1 += (*f)(z);
}
else{
S2 += (*f)(z);
}
X += 1;
}
I =(h/3.0)*( (*f)(a) + (*f)(b) + 4.0*S1 + 2.0*S2);
return I;

しかし、これはf(x)=1/xのような被積分関数の変数が一つの場合でしか動きません。
これを多変数の場合にも応用するにはどうすればいいでしょうか?
例えばf=2*x+x*y+zをx(y,zはxによらない)で積分するような場合です。



238:デフォルトの名無しさん
10/06/06 13:18:30
hってどこから出てきたんだ?

239:デフォルトの名無しさん
10/06/06 13:20:49
>>237
二重積分・多重積分の話ですか?

240:デフォルトの名無しさん
10/06/06 13:22:35
単に
f(x,y,z) = (2+y) g(x) + z h(x)
g(x) = x
h(x) = 1
と考えて、g と h を x で積分すればいいだけでしょ
(2+y) も z も単なる係数なんだし

あと、ループが非常にあぶなっかしい
ループ変数は整数の変数にすること
数値誤差で端が入らない事がある

241:デフォルトの名無しさん
10/06/06 14:01:06
>>238
h=(b-a)/(2.0*n)です。ごめんなさい
>>239
f=2*x+x*y+zだと
double f (double x,double y,double z){
return 2*x+x*y+z;
}
で引数の数が合わない状態になってしまうので、どうしたらいいのかと

>>240
>ループ変数は整数の変数にすること
>数値誤差で端が入らない事がある
そうなんですか、気をつけます

242:デフォルトの名無しさん
10/06/06 14:25:20
>>239
そのfを使うのは無理やね
>>240にある通り、係数を分離して各項で係数以外の部分を積分するしかない

243:デフォルトの名無しさん
10/06/07 11:45:20
GDI+について質問です。

Gdiplus::Graphics* g1 = Gdiplus::Graphics::FromHDC(hdc);
Gdiplus::Graphics* g2 = new Gdiplus::Graphics(hdc);
Gdiplus::GdiplusShutdown()
delete g1; //error
delete g2; //error

上記を実行しようとするとdelete部分でエラーが出てきます。
しかし、GdiplusShutdownの前にdeleteするときちんと解放されます。
これはdeleteしなくてもGdiplusShutdownがメモリを解放していると考えていいのでしょうか?
それともdeleteしないとメモリリークが発生するのでしょうか?

244:デフォルトの名無しさん
10/06/07 11:49:40
GdiplusShutdown()の説明に
--
You must call GdiplusStartup before you create any GDI+ objects, and you must delete all of your GDI+ objects (or have them go out of scope) before you call GdiplusShutdown.
--
とあるね。

245:243
10/06/07 13:00:06
>244
返信ありがとうございます。
おかげですっきりしました。次はリファレンス読んでから質問することにします。

246:デフォルトの名無しさん
10/06/08 13:12:22
スコープガード的な用途に使いたいんですが、生ポの所有権を無理やり奪えるタイプのスマポって標準かboostに在りますか?

247:デフォルトの名無しさん
10/06/08 13:28:04
>>246 std::auto_ptr

248:デフォルトの名無しさん
10/06/09 08:58:43
>>247
あ、説明足りませんでしたね
sumapo<int> s(new int);
int *p = std::move(s); // sの中の生ポがpに移動、sの中身はnullptrになる

こういう事がしたいんです

249:デフォルトの名無しさん
10/06/09 09:14:49
>>248
std::auto_ptr<int> s(new int);
int *p = s.release(); // sの中の生ポがpに移動、sの中身はnullptrになる

250:デフォルトの名無しさん
10/06/09 14:39:58
デストラクタ呼ばれるんじゃ?

251:デフォルトの名無しさん
10/06/09 14:46:09
release()は所有権を放棄するだけでデストラクタは呼ばれない。

252:デフォルトの名無しさん
10/06/09 15:06:55
まじかよ
めちゃくちゃ便利じゃねえか

253:デフォルトの名無しさん
10/06/09 16:01:15
>>249
サンクスです。auto_ptrってめったに使わないからreleaseメソッドの存在に気づきませんでした

254:デフォルトの名無しさん
10/06/09 22:46:41
>>252
さあ洗濯バサミとunique_ptrの有能さに気づくんだ

255:デフォルトの名無しさん
10/06/09 22:49:11
unique_ptrは削除子が静的だから物足りない

256:デフォルトの名無しさん
10/06/10 01:08:07
>>255 std::unique_ptr<T, std::function<void (T*)>> で動的にもできるんじゃね?

257:デフォルトの名無しさん
10/06/10 02:11:29
なるほど
これはそう使うのか

258:デフォルトの名無しさん
10/06/10 21:15:04
>>256
これって削除子のnewで例外出たときにまずくない?

#include <memory>
#include <functional>
#include <iostream>
#include <cstdlib>
#include <new>
void * operator new (std::size_t size)
{
std::cout << "op new" << std::endl;
static int count = 1;
if(count-- == 0){throw "fack!";}
return malloc(size);
}
void operator delete (void *p)
{
std::cout << "op delete" << std::endl;
free(p);
}
struct Hoge
{
Hoge(){std::cout << "Hoge()" << std::endl;}
~Hoge(){std::cout << "~Hoge()" << std::endl;}
};
int main(void)
{
try{std::unique_ptr<Hoge, std::function<void(Hoge*)>> p(new Hoge, [](Hoge *p){std::cout << "delete" << std::endl;
delete p;}); }catch(...){ std::cout << "oh..." << std::endl;} return 0; }

259:デフォルトの名無しさん
10/06/10 23:08:38
fack

260:デフォルトの名無しさん
10/06/11 06:35:57
>>258
まずいよ。
でもそれは boost::shared_ptr の動的削除子を使うときでも同じことでしょ。

261:デフォルトの名無しさん
10/06/11 06:59:54
>>256
これってもしかしてshare_ptrに続くCRT境界越えてもおkなスマポじゃね?
URLリンク(codepad.org)

262:デフォルトの名無しさん
10/06/11 12:20:26
shared_ptrはデリータのクローンに失敗してもちゃんと後始末してくれるよ

263:デフォルトの名無しさん
10/06/11 12:33:45
>>261
それだとunique_ptr自体もエクスポートしないといけないんじゃないか。

264:デフォルトの名無しさん
10/06/11 12:38:12
>>262
コンストラクタに入った後ならね。
ここで問題にされてるのはその前の、引数列の評価中~実引数初期化中に発生する例外でしょ。
URLリンク(www.boost.org)

265:デフォルトの名無しさん
10/06/11 12:39:38
>>262
それ以前に、 shared_ptr のデリータのコピーコンストラクタは例外を投げてはいけない
という制約がついてた。
URLリンク(www.boost.org)
> The copy constructor and destructor of D must not throw.
...
> The requirement that the copy constructor of D does not throw comes
> from the pass by value. If the copy constructor throws, the pointer is
> leaked. Removing the requirement requires a pass by (const) reference.

N3092 で unique_ptr のほうみたら、そっちにも同様の制限があった。 (20.9.10 p14)

266:デフォルトの名無しさん
10/06/11 14:23:16
ほとんど関数かキャプチャなしのラムダでしょ
アロケータ内蔵するにしても大抵の場合staticか共有ポインタで所持する
機能的には有用だけどコピーで例外から逃れられないデリーターなんて存在するのか?

267:デフォルトの名無しさん
10/06/11 16:12:03
C++のコピーコントラクタってfooクラスに、
foo(const foo&);

って宣言しておけば、

foo b;
b = a;

ってすればfooクラスに定義されているポインタオブジェクトもディープコピーされるの?

268:デフォルトの名無しさん
10/06/11 16:14:45
いいえ

269:デフォルトの名無しさん
10/06/11 16:53:55
>>266
メモリじゃないリソースを突っ込みたくなったときはcloseに失敗することもあるかもしれない

270:デフォルトの名無しさん
10/06/11 16:54:16
>>268
ダメなんですか。ありがとうございました。
もっと調べてみます。

271:デフォルトの名無しさん
10/06/11 16:55:57
あ、そういうことじゃなかった。
デリータのコピーに失敗することがあるかどうかだもんな
はずかちい

272:デフォルトの名無しさん
10/06/11 19:15:28
DLLで関数を通じてPODの遣り取りをするとするじゃん
PODのアライメントとかを揃えるためにpragma pushをしろと言われたんだけど
pragmaって移植性ないじゃないですか
なのでpragma無しでPODの移植性を確保したいんですけどどうすればいいですかね?

273:デフォルトの名無しさん
10/06/11 19:17:35
そのDLLはWindows以外でも動作するのかね?

274:デフォルトの名無しさん
10/06/11 20:45:30
本当にpragma pushが要るのかね?

275:デフォルトの名無しさん
10/06/11 22:40:07
スマポの削除子ってテンプレート関数ボインタでよくね?
って思ったんだけとクラスにしてるのは
何か理由あるの?インラインさせりため?

276:デフォルトの名無しさん
10/06/11 22:42:10
DLL から OS Windows を想定すっけど
pragma pack で他環境(VB etc.)にも対応可能なアライメントで固定化汁という意図か?

277:デフォルトの名無しさん
10/06/11 22:59:00
>>263
関数だけで大丈夫くさい
変数に入ってるアドレスをcallしてる

278:デフォルトの名無しさん
10/06/12 09:53:19
>>275
デリーターが関数オブジェクトかもしれないから

279:デフォルトの名無しさん
10/06/12 18:47:25
友達の代理で質問するんでよく分からんのですが

URLリンク(www1.axfc.net)

をコンパイルして実行したら

URLリンク(www1.axfc.net)

になってしまったそうです

最後の行だけなぜか表示されなかったということです

どこに原因があるんでしょうか?

OSはたぶんubuntuだと思います(ウィンドウの色からして

コンパイルは端末でgccを使ったそうです

280:279
10/06/12 18:49:37
すんません

リンク間違えました

URLリンク(www1.axfc.net)

URLリンク(www1.axfc.net)

281:デフォルトの名無しさん
10/06/12 18:55:00
\nを入れて味噌

282:デフォルトの名無しさん
10/06/12 19:10:51
画像で出てくると思わなかったよ

283:デフォルトの名無しさん
10/06/12 20:15:26
>>281
伝えときました

>>282

友達に画像で渡されたので……

284:デフォルトの名無しさん
10/06/12 20:20:24
今度はテキストで貰ってきてくれ、なの

285:デフォルトの名無しさん
10/06/12 20:37:04
>>284

すんません。。。

286:デフォルトの名無しさん
10/06/12 21:23:17
int main(int argc, char *argv[])

で、プログラムを実行するとき引数に英1文字AかBかCかDが指定できるとして、
A,B,C,D以外が入力されたときにエラーを表示するための
if文の条件文の書き方が分かりません。

if(argv[1] != "r")
とすると、引数に何を入力しても該当してしまいます。

どうすればいいでしょうか

287:デフォルトの名無しさん
10/06/12 21:24:09
書き間違えました、
if(argv[1] != "A")
です

288:デフォルトの名無しさん
10/06/12 21:26:46
>>287
それは文字列へのポインタの比較なんで文字列の中身の比較ではない。
文字列の中身の比較はstrcmpを使う

289:デフォルトの名無しさん
10/06/12 21:29:36
気持ち悪いけど
if (strcmp(argv[1],"A")&&strcmp(argv[1],"B")&&strcmp(argv[1],"C")&&strcmp(argv[1],"D"))
こっちも気持ち悪いけど
if (strchr("ABCD",argv[1][0]))


290:デフォルトの名無しさん
10/06/12 21:35:39
C++ならこうか
std::string a(argv[1]);
if((a!="A")&&(a!="B")&&(a!="C")&&(a!="D"))
{
}

291:デフォルトの名無しさん
10/06/12 21:37:54
>>289
前者はオプション文字列の長さが1である必要があるのに、
後者はオプション文字列の長さをチェックしていない。
いっそ、これでいいのでは?
if (argv[1][0] != 'A' || argv[1][0] != 'B' || argv[1][0] != 'C' || argv[1][0] != 'D' || argv[1][1] != '\0')

292:286
10/06/12 22:05:20
皆さんありがとうございます。
"A"がポインタであること、'A'と"A"が違うということが分かっていませんでした。

293:デフォルトの名無しさん
10/06/12 22:27:36
結局分かってないし何度もすみません・・
>>291で書くと、引数をAで実行しても該当するようです。どうしてでしょうか

294:デフォルトの名無しさん
10/06/12 22:32:09
\0のところがいらないんじゃ…
間違ってたらスマソ

295:デフォルトの名無しさん
10/06/12 23:04:03
なんだかんだ言ってエバーはやっぱ面白いなぁ

296:286
10/06/13 00:56:43
if (argv[1][0] != 'A' || argv[1][1] != '\0')
とすると、うまくいきます。'A'以外を入力すると実行されます。AAと入力した時も実行されます。

ですが
if (argv[1][0] != 'A' || argv[1][0] != 'B' )
とするともう何を入力しても実行されるようになってしまいます。

環境が悪いのでしょうか・・?orz
言語はCで、linuxでgccを使っています。

297:デフォルトの名無しさん
10/06/13 01:03:52
今は高校で論理学ってやらないんだっけ?

298:デフォルトの名無しさん
10/06/13 01:04:38
条件をよく見ろ
'A'以外 ま た は 'B'以外
だから何入力してもtrueに決まってる

299:デフォルトの名無しさん
10/06/13 01:08:30
ぐはっ
ありがとうございます。失礼致しました;;

300:デフォルトの名無しさん
10/06/13 21:38:09
DLLを作るのも使うのも全部WINDOWS→リトルエンディアン
って認識でいいの?

301:デフォルトの名無しさん
10/06/13 22:26:26
>>300
今はintelだけなんでそうなる。

302:デフォルトの名無しさん
10/06/13 23:42:46
>>301
AMDとVIAは星になったのかw

303:デフォルトの名無しさん
10/06/14 06:50:37
>>302
俺もintelだけ、といわれるとなんか変な言い方だなぁとは思うけれど。
互換性があるという言い回しにした方がお気に召しますか?

304:デフォルトの名無しさん
10/06/14 08:53:13
IA-32と言えば何も問題は無かったのに

305:デフォルトの名無しさん
10/06/14 09:20:40
要するにDLL作るときにエンディアンも気にしないといけないんですか

306:デフォルトの名無しさん
10/06/14 11:11:43
大丈夫、エンディアン以前にプラットフォームが違っていれば動かない。

307:デフォルトの名無しさん
10/06/14 17:59:17
>>306
お前は何を問題としているかわかってない

308:デフォルトの名無しさん
10/06/14 18:08:05
Windows上でエンディアンを気にしなきゃいけない状況って
・ネットワークを使う
・クロスプラットフォームを考慮(cygwin等)
・他ハードをエミュレーションする

くらいしか思いつかんが。


309:デフォルトの名無しさん
10/06/15 23:31:39
int array[N];
のarrayは&array[0]と同じって本に書いってあったんだけど
で、多重配列 int mulary[N][M][][]...[Z];
の時のmularyは何と同じになるの?
&mulary[0]?
&mulary[0][0][0]...[0]?
....
で、なんでそうなるの?

310:デフォルトの名無しさん
10/06/15 23:51:22
不思議なことにどれをやっても同じなんだよ
そういうふうにメモリ配置されてるから

311:デフォルトの名無しさん
10/06/15 23:55:08
>>309
型はこれと一緒
&mulary[0]

312:デフォルトの名無しさん
10/06/16 01:13:23
>>309
多次元でも関係ない。
array が &array[0] と同じように、 mulary は &mulary[0] と同じ。

313:デフォルトの名無しさん
10/06/17 01:06:13
>>311-312
どもども。
何で配列名が&array[0] 、 &mulary[0]になるように決めたんですか?

314:デフォルトの名無しさん
10/06/17 01:11:15
>>313
>>309 がそう決めたから

315:デフォルトの名無しさん
10/06/17 04:28:55
>>313
便利だから

316:デフォルトの名無しさん
10/06/17 06:32:10
>>313
printf(&"Hello World"[0]);
とか書きたいか?

317:デフォルトの名無しさん
10/06/17 07:17:35
>>316
地味にヤだな、それw

318:デフォルトの名無しさん
10/06/18 16:11:35
>>313
決めたっていうかその表現にある通り、単に配列要素の先頭のアドレス拾ってるから
同じになるってだけじゃね。意味わかれば別に悩む所じゃないぜ


319:デフォルトの名無しさん
10/06/18 18:52:55
&*(array+0) と &array[0] が同じということを知れば
arrayが特殊でないことが分かるはず

320:デフォルトの名無しさん
10/06/21 22:33:23
「クラス名::」で呼び出せるものは静的なもの、
「クラス名.」で呼び出せるものは動的なもの

ってことで、おk?

321:デフォルトの名無しさん
10/06/21 22:59:52

クラス名::hoge
インスタンス.hoge


322:デフォルトの名無しさん
10/06/21 23:11:31
class A
{
public:
 void func1() {}
 void func2() { A::func1(); }
 static void static_func() {}
};

A a;
a.static_func();

323:デフォルトの名無しさん
10/06/23 02:18:51
ある変数(10桁)の
1の位:
10の位:
100の位:
1000の位:
  ・
  ・
  ・
ってな感じで出力する簡単な計算式教えてください
おねがいします

324:デフォルトの名無しさん
10/06/23 02:29:24
10で割ったあまりを出力して、
変数を10で割ったものを変数に代入する

というのを繰り返す

325:デフォルトの名無しさん
10/06/23 02:36:38
>>324
ありがとうございます

326:デフォルトの名無しさん
10/06/23 23:04:41
排他処理ってどんなふうにやればいいんですか

327:デフォルトの名無しさん
10/06/23 23:14:36
環境も書かずに排他処理とな?!(AAry

328:デフォルトの名無しさん
10/06/23 23:14:50
セマフォ、ミューテックス、クリティカルセクションでぐぐれば解る

329:デフォルトの名無しさん
10/06/23 23:38:44
DWORD WINAPI ThreadFunc1(LPVOID lpParam) //スレッドの1
{
WaitForSingleObject(g_mutexTest, INFINITE); //所有権取得
//排他的な処理
SetCursorPos(def_x, def_y);
ReleaseMutex(g_mutexTest); //所有権放棄
return 0;
}

void CreateMutexTest()
{
g_mutexTest = CreateMutex( 0, FALSE, NULL);
hThread1 = CreateThread(NULL, 0, ThreadFunc1, NULL, 0, &ThreadID);
}

void CloseMutex()
{
if (g_mutexTest)
{
CloseHandle(g_mutexTest);
g_mutexTest = NULL;
}
}




CreateMutexTest();
CloseMutex();


330:329,326
10/06/23 23:41:06
途中で送信してしまいました
ググったら>>329のようなものが出てきたんですけど
これでいいんですか?

331:330
10/06/23 23:43:36
環境はWin7 VC++です

332:デフォルトの名無しさん
10/06/24 05:14:55
static RECT rect;
を計算して求めたleft, top, right, bottomで初期化したいのですが

rect.left=left;
rect.top=top;
rect.right=right;
rect.bottom=bottom;
は不恰好なので

rect = {left, top, right, bottom};
と試してみましたがコンパイルエラーになりました。

RECT tmp = {left, top, right, bottom};
rect = tmp;
そこでこうするとうまく動いたのですが、もっといい方法はありますか?

Win7 VC++ 2008です。

333:デフォルトの名無しさん
10/06/24 07:38:41
Windows APIの構造体のやつならSetRect関数

334:デフォルトの名無しさん
10/06/24 14:03:02
配列の要素数を標準入力cinで入力することは出来ないでしょうか?

int num;
cin >> num;

int test[num];

「定数式が必要です」と出て失敗します
何故だ…

335:デフォルトの名無しさん
10/06/24 14:10:43
>>334
配列の要素数に変数を使うことはできない
定数じゃないと
そういうときはnew使うとかvector使うとかしないと

336:デフォルトの名無しさん
10/06/24 15:25:40
定数式が必要です、って言われて何故だとかメッセージを読む能力なさすぎだろ

337:デフォルトの名無しさん
10/06/24 16:05:14
初心者歓迎って書いてるから、ま、あまり目くじら立てるなよ。
きっと、変数と定数の区別がまだつかないんだよ。

338:デフォルトの名無しさん
10/06/24 18:18:15
おしえてください!俺はC言語の初心者です。csvファイルのデータを要素ごとに構造体に格納するのを、

struct nakami{
  char name1[80];
  int num1:
  char comp_name[2][80];
  ・・・・・・
}nk[グローバル変数x];

みたいな構造体にして。csvファイルへの読み込みのポインタをfpという変数で持ってきて、

char str[80], num[4], trash[80];
int i;

for(i = 0; i < グローバル変数y; i++){
  fgets (str, 500, fp);
  strcpy (trash, strtok( str, ",¥n"));

  strcpy (nk[i].name1, strtok[NULL]);

  strcpy(num, strtok[NULL]);
  nk[i].num1 = atoi(num);
  ・・・・・・
}

339:デフォルトの名無しさん
10/06/24 18:19:48
>>338の続きです

といった感じで格納を続けていくようにしました。
グローバル変数yはcsvファイルの読み込む列の数についてで、先に取得しています。グローバル変数xは150とプログラムの一番最初にdefineで書いています。

これを実行すると途中でプログラムに問題が発生して強制終了してしまいました。

間あいだに、printfで構造体の中身を含め、ループ中をチェックをしていたのですが、
yが74あって、取得したいcsvの列が0から73までのとき、途中の列までは無事に格納されていたのですが、
iが57までループを繰り返し、インクリメントされた後、何故か1に戻っていました。
そのため、終端に来る前にcsvの方が終わってしまい、強制終了するのだと思います。ループが73列目の格納作業まで終えて、74列目を読み始めて強制終了するみたいです。

初心者なので凄くおかしなことを言っていたり、
説明不足で、これだけの文では分からないかもしれませんが、なにとぞご回答頂きたく存じます。

340:デフォルトの名無しさん
10/06/24 18:28:20
>>338-339
それじゃコンパイル通らないだろ
コピペしろコピペ
URLリンク(codepad.org)
ついでにcsvもどっかにうpしろ

341:デフォルトの名無しさん
10/06/24 19:19:39
>>340
了解です。
このプログラムは2chのとある企画のアイディア推敲の一助にと、慣れないC言語を使って作っていたものです。
わけのわからないcsvファイルですが、ご理解よろしくお願いします。
色々無茶苦茶で、半端な部分も多いです。初心者なので、読解にご迷惑をおかけするかもしれません。
一応コンパイル出来るはずです。

コピペ
URLリンク(codepad.org)
問題は730~835行目の関数の特に811行目のループが始まってから起こるみたいです。

csvファイル
URLリンク(sugar310.dip.jp)

342:デフォルトの名無しさん
10/06/24 20:24:31
>>333
その名もズバリな関数があったんですね。調べ方が未熟でした。
無事綺麗なコードが書けました。
レスありがとうございました。

343:デフォルトの名無しさん
10/06/24 22:54:33
>>341
csv読み込ませるとnum周りのスタックが破綻したって出たな
配列の大きさを大きくしたらとりあえずエラーは出なくなったけど…
URLリンク(codepad.org)
これはGUIで作った方が分かりやすい気がする
ちょっと文字数オーバーしたら落ちるし
C++あたり勉強してstd::stringとか使った方がいいんじゃないか

344:デフォルトの名無しさん
10/06/24 23:50:44
c++の命名規則の例が詳しいサイトとかないでしょうか?


345:デフォルトの名無しさん
10/06/25 00:00:40
>>343
細かく見ていただき大変ありがとうございます!!
色々と自分のプログラムの汚いところがスッキリしてて驚きがあって感動してます。

ただ、自分がwinでvisiual C++2008のコマンドプロンプトからclでコンパイルしていたものを、
ちょっとした都合でwinがネットに繋げられなかったでの、
人のmacのxcodeに送ってそれをURLリンク(codepad.org) にコピペしたためか、
今winでclでコンパイルすると色々とエラーが出てしまって・・・、上手くいってるか直ぐに分からないです。
すみません。

対処法も教えていただけましたし、色々手も加えていただいたので、winにあるものとしっかり見比べて、理屈の理解をしていこうと思います。
C++も勉強してみたいと思います!!
ありがとうございました!!!

346:デフォルトの名無しさん
10/06/25 08:40:17
組み込みCでタスクの単体試験がしたい。
内部で状態が変わるようなタスクのテスト項目が思い付かない。


347:デフォルトの名無しさん
10/06/25 08:44:13
単体試験は単体でするもの、組み込んでするのは別の試験。
内部で状態が変わっても影響ないならNOPにしとけ~。

348:デフォルトの名無しさん
10/06/25 10:32:33
別にcodepadに貼らなくても自分の所でgcc + MinGW4.5.0でコンパイル
すればいいやん

あ、ソースを晒すためか

349:デフォルトの名無しさん
10/06/25 15:14:19
すいません int** aはどういうことでしょうか?
int* aならポインタ宣言と分かるのですけれど**が2個付くのは意味があるのでしょうか?

350:デフォルトの名無しさん
10/06/25 15:29:18
ポインタのポインタってことだ
COMとかでインターフェースのポインタをもらうときとかに使うな

351:デフォルトの名無しさん
10/06/25 15:29:48
>>349
ポインタのポインタ
int a;
int* b = &a;
int** c = &b;
といった感じでポインタ変数をさらに指し示せる。
関数から(戻り値以外の方法で)ポインタ値を返す時に使われるな。

352:デフォルトの名無しさん
10/06/25 15:36:04
>>349>>350
慣れてないとややこしそうですな 精進します
ありがとうございました!


353:デフォルトの名無しさん
10/06/26 19:42:40
引数なしローカル変数なしの再帰関数を作ったとしたら、これはどこまで再帰してもスタックオーバーフローを起こさないって考えていい?


354:デフォルトの名無しさん
10/06/26 19:50:52
末尾再帰が最適化されたらそうなるだろう。
が、もし最適化されなかったらリターンアドレスを積みまくって死ぬから、
オーバーフローは起こると考えたほうが安全。

355:デフォルトの名無しさん
10/06/26 19:51:31
>>353
戻ってくる場所をスタックに積むからいつかスタックオーバーフローを起こす

356:デフォルトの名無しさん
10/06/27 00:07:01
サンクスです
おとなしくループ回すでござる・・・

357:デフォルトの名無しさん
10/06/27 04:14:38
質問させてください。

参照カウントで管理するオブジェクトを作ろうとしています。
これは自動変数として確保されたくないのでコンストラクタをprotectedにして、
staticなオブジェクト生成用のメソッド(Create)を作ってそこでnewしています。

ただこれではクラスを継承するたびにサブクラス側でもCreateと同等のメソッドを用意しなければならなくなってしまいました。
これが結構面倒に感じています。
何かスマートな実装方法はないでしょうか?

358:デフォルトの名無しさん
10/06/27 05:02:19
>>357
CRTPパターン使うとか?
URLリンク(codepad.org)

まあ、ふつうはFactoryパターンでやるけど。

359:357
10/06/27 05:42:25
>>358
ありがとうございます。
リンク先のものが使えそうです。

ちなみにFactoryパターンでググったらFactoryMethodとAbstractFactoryが出ましたがどちらでしょうか?

360:デフォルトの名無しさん
10/06/27 09:18:30
自動変数を封じるならデストラクタを弄るだけでもできる
コンストラクタは複数有るのに対してデストラクタはひとつだからこっち弄るほうが楽だと思う

URLリンク(codepad.org)
URLリンク(codepad.org)



361:デフォルトの名無しさん
10/06/27 20:03:30
初歩的な質問ですが、教えて下さい。

void S(char okini[SIZE][2][100])
{`
  int i;
  int a;
  for(i=0;i<SIZE;i++)
  {
   printf("URLを入力してください");
   scanf("%s", okini[i][0]);
   printf("タイトルを入力してください");
   scanf("%s",okini[i][1]);
  }
  printf("削除したい番号を入力してください");
  scanf("%s",&a);
  okini[a-1][0][100]=´x´;
  okini[a-1][1][100]=´x´;


お気に入りを削除する関数を作りたいのですが、
どうやって削除すればいいのですか?
削除したいやつを「x」と置き換えようとしたのですが
エラーが発生しました。

362:デフォルトの名無しさん
10/06/27 20:17:21
>>361
hoge[100]と宣言した配列で使えるのはhoge[0]からhoge[99]まで。
っていうのはともかく、代入したいのは文字列だから、strcpy()を使わないと
strcpy(okini[a - 1][0], "x");


363:デフォルトの名無しさん
10/06/27 20:29:56
>>362
ありがとうございます。

大変申し訳ないのですが、strcpy()はまだ習っていません。
他に何か方法はありませんか・・・?


364:デフォルトの名無しさん
10/06/27 20:35:32
>>363
宿題なら↓へ
C/C++の宿題片付けます 137代目
スレリンク(tech板)

テンプレをよく読んで守ること。

# okini[a-1][0][0]='\0'; とか

365:デフォルトの名無しさん
10/06/27 20:52:48
>>364
どうもありがとうございました。
そちらに行ってみます!


366:デフォルトの名無しさん
10/06/28 22:48:49
「この文章の中に
1は□個、2は□個・・・9は□個ある」
というのをcで解こうと思ったのですが、なかなかうまくいきません
助言お願いします

URLリンク(kansai2channeler.hp.infoseek.co.jp)

367:デフォルトの名無しさん
10/06/28 23:15:51
恐ろしい物を見た気がする
何がやりたいのかはっきり言って分からない

368:デフォルトの名無しさん
10/06/28 23:20:39
なんだこのインデントの数は
これはC以外の何かだ

369:デフォルトの名無しさん
10/06/28 23:28:30
何なんだこれは
IOCCCにでも出すつもりか

370:デフォルトの名無しさん
10/06/28 23:32:54
すいません、上のほうで出てたmutexで質問です。

URLリンク(www.geekpage.jp)
ここのサンプルプログラムをコンパイルしたら、
pthread_mutexattr_setpsharedがないと怒られました。

いろいろ調べた結果、_POSIX_THREAD_PROCESS_SHARED が未定義な環境だとはわかりましたが、
どう回避していいかわかりません。排他制御するにはどうしたらいいか教えてください。

371:デフォルトの名無しさん
10/06/28 23:32:56
この文章の中にと書いてるが
何も文章を入力してないんだよな
これはなかなか歯ごたえがあるぜ

372:デフォルトの名無しさん
10/06/28 23:35:00
>>370
環境書け環境

373:370
10/06/28 23:51:22
すいません、環境はFreeBSD 6.0です。

374:デフォルトの名無しさん
10/06/29 00:38:37
ここで質問させていただきます。
URLリンク(upsurusuru.hp.infoseek.co.jp)
このtxtにプログラムの一部を書いています。
このプログラム内で
for(int i=0; i<n; i++){
fin >> a >> b >> c >> d >> e;
txt[i].setdata(a ,b ,c ,d ,e);}
としたあと
double test(Person txt[], int n)
{int sum = 0;
double te;
for(int i=0;i<n;i++){
sum = sum+txt[i].setdata;}
te=sum/n;}
ここへtxt[i]を送り、txt[i]の中からdだけを取り出したいのですがどうしたら良いでしょうか?
助言お願いします


375:デフォルトの名無しさん
10/06/29 00:56:03
Personクラスの定義ぐらい書けや

376:デフォルトの名無しさん
10/06/29 01:08:09
すみません
URLリンク(upsurusuru.hp.infoseek.co.jp)

377:デフォルトの名無しさん
10/06/29 01:47:26
>>374
簡単に言うとprivate変数のdをいじくれないからメンバ関数serdata()から
dを引き出したいって事?

それはあまり綺麗な設計じゃないな

dだけアクセサ作ったら?

double Person::dvalue() const { return d; } みたいな

それは嫌なのかな?

378:デフォルトの名無しさん
10/06/29 01:49:35
もしアクセサを作ることでどこからでもdを参照できるようになるのが嫌なら、
関数test()をPersonのfriendにすればいいじゃない

friendってそういう風に使うんだぜ

379:デフォルトの名無しさん
10/06/29 02:03:51
>>378
それをやってみます。
回答ありがとうございます。

380:デフォルトの名無しさん
10/06/29 06:43:47
うん

381:デフォルトの名無しさん
10/06/29 08:59:10
friendよりstaticメンバー関数にしたほうがきもちいいと思うんだがどうか

382:デフォルトの名無しさん
10/06/29 11:43:46
>>381
それだとthisが渡されないから個々のインスタンスのdをいじれないぞ

383:デフォルトの名無しさん
10/06/29 12:12:36
txt[]で渡してるじゃん

384:デフォルトの名無しさん
10/06/29 12:21:34
URLリンク(codepad.org)
自作のクラスのインスタンスをpush_backしたvectorをソートしようとしています。
codepadではコンパイルエラーは無かったのですが、
自宅のPC(Gentoo Linux, g++ (Gentoo 4.4.3-r2 p1.2) 4.4.3)だと以下のようなエラーが出てしまいます。
URLリンク(kansai2channeler.hp.infoseek.co.jp)

コードのどこかが悪いのでしょうか?
それとも足りない環境があるのでしょうか?

codepadで出力結果がソートされていないのも何故か分かりません。
ご教示ください。

385:デフォルトの名無しさん
10/06/29 12:46:36
>>383
ああそういう事か
それならいいかもね

>>384
ちょwwSTL関係のエラーコード貼るな
貼るならSTLFiltとかで整形してから貼れ

それより肝心のソースコードは?

386:384
10/06/29 13:13:36
>385
コードは>384の1行目です。
STLFiltはちょっと調べてみます。

387:デフォルトの名無しさん
10/06/29 13:19:28
>>386
取り敢えず気が付いた事を一つだけ
ポインタをソートしてるよ
実体をソートしたいなら比較叙述関数を作るか関数オブジェクトにして与えないと

388:デフォルトの名無しさん
10/06/29 13:21:42
>>384
ポインタの順序付けは実体の順序付けと関係ない。
実体の順序付けを使うように比較関数を作って渡せ。

あとは gcc じゃなくて g++ 使ってみな。

389:デフォルトの名無しさん
10/06/29 13:24:54
取り敢えず応急処置だけどソートは出来てるっしょ

URLリンク(codepad.org)

390:デフォルトの名無しさん
10/06/29 13:30:08
こういう時はBoost::lambdaとかC++0xのラムダ式がとても役に立つよな

391:384
10/06/29 13:43:54
確かにgccを使っていました。g++にしたらコンパイルできるようになりました。
URLリンク(codepad.org)
のコードでうまくソートできました。

ありがとうございました。

392:384
10/06/29 13:45:50
>389
>391のレスをしてから気付きました。
どうもありがとうございます。

393:デフォルトの名無しさん
10/06/29 14:15:48
delete しとけよ。

394:デフォルトの名無しさん
10/06/29 14:32:10
参照はがしできるなら剥がしてからファンクタに渡すラッパー作っとくと便利

395:デフォルトの名無しさん
10/06/30 15:12:13
コマンドプロンプトで
関数に0個の引数を指定できません
fatal error U1077 : C:\Program Files\Microsoft Visual Studio 8\VC\BIN\cI..EXE : リターンコード0x2
と表示されたのですがどーゆーことでしょう?
もしスレ違いだったら申し訳ありません

396:デフォルトの名無しさん
10/06/30 15:22:17
コマンドプロンプトでなにしたんですか

397:デフォルトの名無しさん
10/07/01 10:02:20
環境非依存で整数型のビット長を調べるメタ関数は有りますか?

398:デフォルトの名無しさん
10/07/01 10:14:45
sizeof(IntType) * CHAR_BIT
メタ関数は上式で自作しなさい。

399:デフォルトの名無しさん
10/07/01 10:54:59
質問させてください。
c++プログラムの中で、既に存在する.exeファイルを実行して、
標準出力へ返ってくるはずの返り値をC++ソースの中で変数に格納したいのですが、
どのような書き方をすればよいでしょうか??

教えていただけると幸いです。

400:デフォルトの名無しさん
10/07/01 11:02:20
>>399
環境に拠るが、popen()ではどうだろう。

401:デフォルトの名無しさん
10/07/01 18:36:42
>>398
それが表現ビット長と一致するとは限らないんだぜ
std::numeric_limits<IntType>::digits + std::numeric_limits<IntType>::is_signed
が正しい

402:デフォルトの名無しさん
10/07/01 19:17:11
整数型の実ビット長が表現ビット長と一致しない環境ってある?
そりゃ非PODだったら違ってくるだろうけど。
規格ではどうなってるんだろう。

403:デフォルトの名無しさん
10/07/01 22:45:18
質問です。VC++2008EEですがソース分割の仕方がいまいち分かりません。簡単に組んでみたところエラーが出てしまいました。
>1>sub.obj : error LNK2005: "class c_Sub Sub" (?Sub@@3Vc_Sub@@A) は既に main.obj で定義されています。
>fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
どこが間違っているのかご教示お願いします。 URLリンク(codepad.org)

404:デフォルトの名無しさん
10/07/01 22:53:36
>>403
URLリンク(www.geocities.jp)

405:デフォルトの名無しさん
10/07/01 23:26:50
>>404 どうもです。
14行目を } static Sub; とすることでリンカ通りました。(これでよいのかも今一分かりませんが…

406:デフォルトの名無しさん
10/07/01 23:34:05
staticじゃSubの実体がいくつもできちまうじゃねえか。
だからグローバル変数はヘッダではextern宣言して
どれかcpp一つで実体を定義しろっつーの。

407:デフォルトの名無しさん
10/07/02 07:10:29
>>398,402
sizeof(型名) * CHAR_BIT != 有効ビット幅
URLリンク(portable-c.jugem.jp)

408:デフォルトの名無しさん
10/07/02 18:25:01
>>407
>Intelのi686をターゲットとするGCCでは、long double型の有効ビット幅が80ビット
FPU に80bitで数値を渡す(スタックに積む)命令はあるのだろうか?

409:デフォルトの名無しさん
10/07/02 21:44:35
tbyte ptrで行けない?

410:デフォルトの名無しさん
10/07/03 13:02:24
AT&A記法ならfstpl

411:410
10/07/03 14:00:45
方向逆の上lじゃなくてtだった
fldt

412:デフォルトの名無しさん
10/07/03 15:00:00
templateはコンパイル時に型が代わるってことでおk?

413:デフォルトの名無しさん
10/07/03 16:40:54
型が変わるというか、"型ごと"(←重要)に生成される
バイナリが肥大化するから気をつけて

414:デフォルトの名無しさん
10/07/03 16:47:44
さんくすっす
わかったっす


415:412
10/07/03 16:48:13
>>413
thx

416:デフォルトの名無しさん
10/07/03 19:50:45
いえいえ

417:デフォルトの名無しさん
10/07/03 23:22:12
ふと疑問に思ったので教えてください。
例えば、x=7,y=5,z=9のとき、
a=__min(__min(x,y),z);
と書いても実行可能で、aに5が代入されますか?

418:デフォルトの名無しさん
10/07/03 23:24:09
>>417
__min の動作が分からない

419:デフォルトの名無しさん
10/07/03 23:25:32
実際に試せない環境にでもいるのだろうか

420:デフォルトの名無しさん
10/07/03 23:29:22
>>419
yes

421:デフォルトの名無しさん
10/07/03 23:38:45
標準マクロのminでええやんと思う
代入されるかどうか、という話はyes
(__minがちゃんと定義されているならだが)

422:デフォルトの名無しさん
10/07/04 00:07:15
>標準マクロのmin
えっ・・・?

423:デフォルトの名無しさん
10/07/04 00:12:57
>>421
ありがとうございました。
超初心者ゆえに個人的な制約が色々あるわけです。

424:デフォルトの名無しさん
10/07/04 01:52:36
windows.hやkernel.hに含まれてるmin/maxマクロはC/C++標準ではありませんよ…

425:デフォルトの名無しさん
10/07/04 02:12:36
stdの方はマクロじゃないよな

426:デフォルトの名無しさん
10/07/04 10:08:13
PNGといえばlibpngのように、
Bitmapの読み書きをするクロスプラットフォームな
デファクトスタンダード的なライブラリがあれば教えてください。

427:デフォルトの名無しさん
10/07/04 18:16:05
初歩的な質問ですみません
#include<stdio.h>
void calc(int &po);
int main(void){
int miku=39;
calc(miku);
printf("%d\n",miku);
getchar();
return 0;
}
void calc(int &po){
po=po*2;
return;
}
これはcalc()関数にmikuを代入しているのですか
それともmikuのアドレスを渡しているんですか
そもそも文法的に正しいのですか
普通に動くので困ってしまいました

428:デフォルトの名無しさん
10/07/04 18:32:55
参照だもん正しいよ

429:デフォルトの名無しさん
10/07/04 18:46:27
いや、本当はポインタ使いたかったんですが
気が付いたらこんなのになってしまいました

430:デフォルトの名無しさん
10/07/04 20:09:37
ん、なんで動くんだ

431:デフォルトの名無しさん
10/07/04 20:12:03
参照を渡している
内部的にはアドレスを渡しているかも知れないしそうじゃないかもしれない
とりあえず文法的には合ってる

432:デフォルトの名無しさん
10/07/04 20:15:25
>>430
C++は初めてか?力抜けよ

433:430
10/07/04 20:19:33
参照を渡してたら、*po=*po*2としないと行けないんじゃないか?

434:デフォルトの名無しさん
10/07/04 20:20:58
それはvoid calc(int *po);の場合。

435:デフォルトの名無しさん
10/07/04 20:22:02
>>433
CじゃないC++だ。
C++では参照とポインタは別物

436:430
10/07/04 20:27:54
そうなのか、横からスマンかった。

437:デフォルトの名無しさん
10/07/04 20:51:46
あれ、それじゃあこれはC++の文法ですか?
てっきりCのものかと

438:デフォルトの名無しさん
10/07/04 20:56:00
C++が使える環境ならC++勉強したほうがメリットあるぞ。

439:デフォルトの名無しさん
10/07/05 07:23:05
>>437
>>427はCでコンパイルエラーになるはずだが?

440:デフォルトの名無しさん
10/07/05 13:30:44
C言語です

unsigned char buff[] = { 0x01, 0x1A, 0x00, 0x3F };
char str[256];

strの中身を"011A003F"としたいのですがどうすればよいのでしょうか


441:デフォルトの名無しさん
10/07/05 13:33:47
sprintf(str, "%02X%02X%02X%02X", buff[0], buff[1], buff[2], buff[3]);

442:デフォルトの名無しさん
10/07/05 13:41:24
strcpy(buff, "011A003F");

443:デフォルトの名無しさん
10/07/05 13:41:32
>>441
ありがとうございました
sprintfの使い方は目からウロコが落ちました

444:デフォルトの名無しさん
10/07/05 13:42:39
質問の仕方が悪かったみたいです
>>442さんには余計な手間を取らせて申し訳ない


445:デフォルトの名無しさん
10/07/05 14:22:21
#if 0
sprintf(buff, "%02X%02X%02X%02X", buff[0], buff[1], buff[2], buff[3]);
#elif 0
str[0] = '\0';
for (unsigned ic = 0; ic < sizeof(buff); ++ic) {
sprintf(strchr(str, '\0'), "%02X", buff[ic]);
}
#else
for (unsigned ic = 0; ic < sizeof(buff); ++ic) {
sprintf(& str[ic * 2], "%02X", buff[ic]);
}
#endif

446:デフォルトの名無しさん
10/07/06 02:15:54
派生クラスが初期設定で基底クラスに「*this」という値を渡していたのですが、
「this」なら派生クラスのアドレスですが「*」が付くと何になるのでしょうか・・・?

447:デフォルトの名無しさん
10/07/06 02:24:49
CRTPかな?
値か参照だけど、多分参照。

448:デフォルトの名無しさん
10/07/06 10:27:00
C言語でMySQLを制御したいのですが、どうしたら良いでしょうか

449:デフォルトの名無しさん
10/07/06 10:30:47
>>448
てきとーにライブラリを探してください

450:デフォルトの名無しさん
10/07/06 14:46:03
なんか変数へのアクセスはアクセサ関数を使って~と杓子定規にいわれるけど
C#でいうところのプロパティ的なモノはpublic変数でも良いのかなと最近思うようになったが
アクセスレベルを設定できないからそれはどうかな?とも思う
やはりちょっと見た目が悪くなるけどアクセサを使うべきなのでしょうか?

451:デフォルトの名無しさん
10/07/06 16:48:12
アクセス制限以外のアクセサ関数のメリットとして、
仮に内部実装が変わっても(例えばintだったのがdoubleになっても)
関数でラップしとけば呼び元に影響しない、とかもある

でも個人的には、よほどリスクがあるのでなければ
変数の方がすっきりしていい

452:デフォルトの名無しさん
10/07/06 20:35:39
>>450
変数は隠蔽するのが基本。公開すると変数の使用方法が統一できずバグだらけになりやすい。
変数と1対1にアクセサを作った場合は変数を公開したのと変わらなくなるのでよろしくない。

453:デフォルトの名無しさん
10/07/06 21:27:48
>>450
> なんか変数へのアクセスはアクセサ関数を使って~と杓子定規にいわれるけど
いや今の時代は言わないよ。

逆に、あるクラスのメンバを全部パブリックにするという
ノーガード戦法もあるが、それが有効なこともたまにある。
まあ単に変数をまとめたいだけの時だけどね。

普通は、クラスはちゃんとしたinterfaceとなるメンバ関数を持っていて、
使い方を知るのに内部構造を知らねばならないような
クラスはクソ設計と言われる。

まあ現実は納期とかあるからやむをえずクソ設計になっちゃうこともあるけど。


454:デフォルトの名無しさん
10/07/06 22:06:34
>>453
構造体も使ってあげて

455:デフォルトの名無しさん
10/07/07 02:25:40
>>450
先にクラスの外部インターフェースを考えろ。

メンバ変数ありきで関数を作ったりしてる限り、見た目がどうとか以前に糞クラス確定。

456:デフォルトの名無しさん
10/07/07 08:41:00
要はケースバイケース

抽象化したい場合はメンバ関数経由にすればいいし
実装が固定なら直接アクセスすればいい

457:デフォルトの名無しさん
10/07/07 23:36:26
設計不足の言い訳ですか?


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