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

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

【初心者歓迎】C/C++室 Ver.73【環境依存OK】

1 ://:2010/05/21(金) 07:38:47
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.72【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1267775473/
【初心者歓迎】C/C++室 Ver.71【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1264774545/

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か  に置換すると見栄えだけはよくなります。

【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)

2 :デフォルトの名無しさん:2010/05/21(金) 10:44:31
tan=y/xとしててx=0の時は場合分けしないといけませんか?
x=0の時はどういう処理にすれば良いのですか?

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

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

5 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/05/21(金) 13:31:48
すいません。4番目と5番目です

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

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

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

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

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

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

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

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


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

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


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

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

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

19 :デフォルトの名無しさん:2010/05/23(日) 02:53:14

== true

こんなの書くなよ


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

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

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

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

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

25 :デフォルトの名無しさん:2010/05/23(日) 04:33:37
http://www.kouno.jp/home/c_faq/c9.html#2

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

何故ですか?

27 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/05/23(日) 04:57:04
>>26
1/2 == 0

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

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

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

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

32 :デフォルトの名無しさん:2010/05/23(日) 09:41:57
http://codepad.org/rUEMdrlH

これはひどい

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

メモリ確保等でも同様。

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

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

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

stdio使うのは移植性だよ

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

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

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


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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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



91 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/05/25(火) 01:07:16
>>91 AA::instance() を static じゃなくて virtual にすればいいんじゃないの?

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

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

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

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

97 :デフォルトの名無しさん:2010/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:2010/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 :デフォルトの名無しさん:2010/05/25(火) 03:03:50
>>97 なんで CC::doA() に引数で渡さないの?

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

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

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

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

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

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

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

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

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


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

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

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

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

111 :デフォルトの名無しさん:2010/05/25(火) 15:23:45
>>110
http://msdn.microsoft.com/ja-jp/library/7sye83ce.aspx
http://msdn.microsoft.com/ja-jp/library/350dyxd0(VS.80).aspx

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

ひととおり書いて、 http://codepad.org/ に晒して、不満な箇所を具体的に
挙げるといいよ。

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

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

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


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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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


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


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

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

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

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

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

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

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

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

ありがとうございました

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

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


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

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

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

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



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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

夢だったのかもしれん。

212 :デフォルトの名無しさん:2010/05/30(日) 23:51:32
関数は使えるよ
http://msdn.microsoft.com/en-us/library/0taedcee.aspx

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

221 :デフォルトの名無しさん:2010/06/01(火) 19:47:26
>>220
http://msdn.microsoft.com/en-us/library/b6xkz944(VS.80).aspx

222 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/06/02(水) 01:22:43
>>222 何が「ダメ」なの?

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



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

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

226 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/06/02(水) 02:07:25
>>226
friend はメンバ関数も指定できる。

228 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/06/03(木) 22:57:38
>>229
すいません、自己解決しました

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

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

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

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

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

235 :デフォルトの名無しさん:2010/06/06(日) 11:47:47
そうそう

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

237 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/06/06(日) 13:18:30
hってどこから出てきたんだ?

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

240 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/06/06(日) 14:25:20
>>239
そのfを使うのは無理やね
>>240にある通り、係数を分離して各項で係数以外の部分を積分するしかない

243 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/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:2010/06/07(月) 13:00:06
>244
返信ありがとうございます。
おかげですっきりしました。次はリファレンス読んでから質問することにします。

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

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

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

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

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

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

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

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

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

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

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

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

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

258 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/06/10(木) 23:08:38
fack

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

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

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

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

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

265 :デフォルトの名無しさん:2010/06/11(金) 12:39:38
>>262
それ以前に、 shared_ptr のデリータのコピーコンストラクタは例外を投げてはいけない
という制約がついてた。
http://www.boost.org/libs/smart_ptr/shared_ptr.htm#allocator_constructor
> 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 :デフォルトの名無しさん:2010/06/11(金) 14:23:16
ほとんど関数かキャプチャなしのラムダでしょ
アロケータ内蔵するにしても大抵の場合staticか共有ポインタで所持する
機能的には有用だけどコピーで例外から逃れられないデリーターなんて存在するのか?

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

って宣言しておけば、

foo b;
b = a;

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

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

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

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

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

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

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

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

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

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

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

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

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

http://www1.axfc.net/uploader/Sc/so123049

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

http://www1.axfc.net/uploader/Sc/so123050

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

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

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

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

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

280 :279:2010/06/12(土) 18:49:37
すんません

リンク間違えました

http://www1.axfc.net/uploader/Sc/so/123049

http://www1.axfc.net/uploader/Sc/so/123050

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

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

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

>>282

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

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

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

すんません。。。

286 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/06/12(土) 21:24:09
書き間違えました、
if(argv[1] != "A")
です

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

289 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/06/12(土) 21:35:39
C++ならこうか
std::string a(argv[1]);
if((a!="A")&&(a!="B")&&(a!="C")&&(a!="D"))
{
}

291 :デフォルトの名無しさん:2010/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:2010/06/12(土) 22:05:20
皆さんありがとうございます。
"A"がポインタであること、'A'と"A"が違うということが分かっていませんでした。

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

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

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

296 :286:2010/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 :デフォルトの名無しさん:2010/06/13(日) 01:03:52
今は高校で論理学ってやらないんだっけ?

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

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

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

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

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

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

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

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

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

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

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

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


309 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/06/15(火) 23:51:22
不思議なことにどれをやっても同じなんだよ
そういうふうにメモリ配置されてるから

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

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

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

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

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

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

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

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


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

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

ってことで、おk?

321 :デフォルトの名無しさん:2010/06/21(月) 22:59:52

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


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

A a;
a.static_func();

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

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

というのを繰り返す

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

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

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

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

329 :デフォルトの名無しさん:2010/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:2010/06/23(水) 23:41:06
途中で送信してしまいました
ググったら>>329のようなものが出てきたんですけど
これでいいんですか?

331 :330:2010/06/23(水) 23:43:36
環境はWin7 VC++です

332 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/06/24(木) 07:38:41
Windows APIの構造体のやつならSetRect関数

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

int num;
cin >> num;

int test[num];

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

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

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

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

338 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/06/24(木) 18:19:48
>>338の続きです

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

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

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

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

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

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

コピペ
http://codepad.org/ea8bb8jm
問題は730〜835行目の関数の特に811行目のループが始まってから起こるみたいです。

csvファイル
http://sugar310.dip.jp/cgi/upload/source/up24683.csv

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

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

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


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

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

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

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


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

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

あ、ソースを晒すためか

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

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

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

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


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


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

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

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

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

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

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

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

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

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

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

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

ttp://codepad.org/nwwgoygy
ttp://codepad.org/FA3LoEDN



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


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

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


364 :デフォルトの名無しさん:2010/06/27(日) 20:35:32
>>363
宿題なら↓へ
C/C++の宿題片付けます 137代目
http://pc12.2ch.net/test/read.cgi/tech/1276810079/

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

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

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


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

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10759.txt

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

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

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

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

http://www.geekpage.jp/programming/linux-network/book/07/7-41.php
ここのサンプルプログラムをコンパイルしたら、
pthread_mutexattr_setpsharedがないと怒られました。

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

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

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

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

374 :デフォルトの名無しさん:2010/06/29(火) 00:38:37
ここで質問させていただきます。
http://upsurusuru.hp.infoseek.co.jp/cgi-bin/src/up5422.txt
この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 :デフォルトの名無しさん:2010/06/29(火) 00:56:03
Personクラスの定義ぐらい書けや

376 :デフォルトの名無しさん:2010/06/29(火) 01:08:09
すみません
http://upsurusuru.hp.infoseek.co.jp/cgi-bin/src/up5424.txt

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

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

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

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

それは嫌なのかな?

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

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

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

380 :デフォルトの名無しさん:2010/06/29(火) 06:43:47
うん

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

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

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

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

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

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

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

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

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

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

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

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

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

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

http://codepad.org/6do3erz8

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

403 :デフォルトの名無しさん:2010/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 つ以上の複数回定義されているシンボルが見つかりました。
どこが間違っているのかご教示お願いします。 ttp://codepad.org/niRaaCvJ

404 :デフォルトの名無しさん:2010/07/01(木) 22:53:36
>>403
ttp://www.geocities.jp/ky_webid/c/032.html

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

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

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

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

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

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

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

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

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

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


415 :412:2010/07/03(土) 16:48:13
>>413
thx

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

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

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

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

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

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

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

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

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

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

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

427 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/07/04(日) 18:32:55
参照だもん正しいよ

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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


445 :デフォルトの名無しさん:2010/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 :デフォルトの名無しさん:2010/07/06(火) 02:15:54
派生クラスが初期設定で基底クラスに「*this」という値を渡していたのですが、
「this」なら派生クラスのアドレスですが「*」が付くと何になるのでしょうか・・・?

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

458 :デフォルトの名無しさん:2010/07/08(木) 03:49:07
全てはインタフェースについて記述せよと、
かのエリック・ガンマ先生も言っておられてだな


459 :デフォルトの名無しさん:2010/07/09(金) 20:04:53
>>444
気にしないでくれ、俺優しいからさ

460 :デフォルトの名無しさん:2010/07/12(月) 22:56:30
存在しないメンバを呼ぼうとしたら見つかるまで暗黙変換してくれればプロクシ作りやすくて便利なのに

461 :デフォルトの名無しさん:2010/07/13(火) 21:44:29
#define Q_D(Class) Class##Private * const d = d_func()
こんなマクロがあったのですが、##Privateはどこから来ているのですか?
また、ClassってのはClass Tの省略形ってことでおk?

462 :デフォルトの名無しさん:2010/07/13(火) 21:59:39
>>461
入門書読もうな

463 :デフォルトの名無しさん:2010/07/13(火) 22:19:02
>>462は説明できないわけ

464 :デフォルトの名無しさん:2010/07/13(火) 22:30:18
トークン連結でググれ

465 :461:2010/07/13(火) 22:57:35
>>464
thx

466 :デフォルトの名無しさん:2010/07/13(火) 23:59:19
ここまで俺の自演

467 :デフォルトの名無しさん:2010/07/15(木) 22:24:53
ヘッダファイルで変数は「m_」という名前から始まっている場合が多いですが、
GUIプログラミングの場合はボタンやラベルも「m_」から始めていますか?

468 :デフォルトの名無しさん:2010/07/15(木) 22:26:43
俺はm_btnAddとかやってるな

469 :デフォルトの名無しさん:2010/07/15(木) 23:25:54
>>467
「m_」は「クラスのメンバ変数」って意味だと思うぞ。
なので、ボタンやラベルを指す変数がクラスのメンバ変数ならやはりm_を使う。


470 :デフォルトの名無しさん:2010/07/15(木) 23:44:47
ちなみにメンバ変数にはうしろに _ をつけるという流儀もある
何にもつけないというやり方もある

471 :デフォルトの名無しさん:2010/07/16(金) 18:31:24
C/C++(C#が扱えればなお嬉しい)が使えるIDEで
UMPC(ATOM/メモリ512MB)程度のスペックのPCでも実用に耐えるようなモノはないでしょうか?

472 :デフォルトの名無しさん:2010/07/16(金) 18:32:25
VC6

473 :デフォルトの名無しさん:2010/07/16(金) 19:12:24
VC6っていま手に入ります・・・?

474 :デフォルトの名無しさん:2010/07/16(金) 19:56:40
VC6 は C++ じゃないので論外。

475 :デフォルトの名無しさん:2010/07/16(金) 20:30:23
>>471
VC8とか9は普通に使えたけど。

476 :デフォルトの名無しさん:2010/07/16(金) 21:02:32
メモリ512MBってのが厳しいな
EeePCのメモリ2Gに増設して使ってるが、コード書くだけならVS2005でもそこそこいけてるな

477 :デフォルトの名無しさん:2010/07/17(土) 00:47:13
>>475
ビルドとかしなければ使えそうですか?
それなら移動端末に買おうと思うのですが

478 :デフォルトの名無しさん:2010/07/17(土) 06:41:34
それだけの用途でなんでIDEが欲しいの?
C#が主目的なら分からなくもないけど、別に携帯のメモでいいじゃんって思っちゃう。
擬似コードメモるだけで十分だよ。

479 :デフォルトの名無しさん:2010/07/17(土) 07:09:07
入力補完が欲しいんでないの

480 :デフォルトの名無しさん:2010/07/17(土) 07:51:35
馬鹿は大変なんだね。

481 :デフォルトの名無しさん:2010/07/17(土) 18:04:31
externとグローバール変数の違いがよくわかりません
どのようにちがうのですか?

482 :デフォルトの名無しさん:2010/07/17(土) 18:14:15
externは他のソースコードに書かれたグローバル変数を使うためのおまじない

483 :デフォルトの名無しさん:2010/07/17(土) 18:18:04
>>481
変数におけるextern宣言は、その変数の定義が同一コンパイル単位内にないことの表明だね。

484 :デフォルトの名無しさん:2010/07/18(日) 09:15:46
>>474
VC6 は c++, MSC は c

485 :デフォルトの名無しさん:2010/07/18(日) 09:29:39
>>474
え?

486 :デフォルトの名無しさん:2010/07/18(日) 09:39:17
>>485
標準への準拠の度合いを言ってるんだと思うよ

487 :デフォルトの名無しさん:2010/07/18(日) 09:43:24
>>486
それなら確かに同意

488 :デフォルトの名無しさん:2010/07/18(日) 11:58:15
C++のコードを読んでいると、newが成功しているか調べているコードがよくある気がします
newってそんなに失敗しやすいんですか

それとも、ネットワーク/ディスプレイ/スレッドなどの明かにリソースが限られているものだけ、
newの失敗しやすいのでif文で調べていると考えてもいいのでしょうか

489 :デフォルトの名無しさん:2010/07/18(日) 12:19:53
>>488
newが失敗するって2通りあって、メモリが足りなかった場合と、クラスのコンストラクタが例外を投げた場合なんだけど、

前者は趣味で書く分にはほとんど気にしなくていい。
newできないほどメモリが逼迫していたらもうマトモにエラー処理ができないだろというのもある。

後者は発生する可能性があるならちゃんとチェックしなくちゃいけない。
クラスのドキュメントを読んで、コンストラクタが失敗する場合があるかどうかをよく確認しましょう。

490 :デフォルトの名無しさん:2010/07/18(日) 12:20:13
>>488
>newが成功しているか調べているコードがよくある気がします
>newってそんなに失敗しやすいんですか

それ本当に newが成功してるかどうかを調べてるコード?
その処理単位に再入した時にヌルかどうかを調べてるとか、そういう実装都合とかじゃなくて


491 :デフォルトの名無しさん:2010/07/18(日) 12:20:44
>>488
失敗するかどうかの前にもしそのコードが下のように if で確認してたら100%意味がないことに注意ね
int* a = new int;
if (!a) {
    // エラー処理
}
理由は new は失敗すると例外を投げるから(new が nullptr を返すことは決してない)

new する以上失敗しうるし、そもそもどんな環境で実行されるかも事前に予期できないので、
失敗してもいいように備えてるだけじゃないかな強制終了されるなんてユーザは望んでないと思うし

492 :デフォルトの名無しさん:2010/07/18(日) 12:22:41
失敗しやすいかどうかはともかく
エラーチェックを怠るとデバッグに苦労するよ

493 :デフォルトの名無しさん:2010/07/18(日) 12:24:39
結論、今やnewの結果をチェックするコードは無意味。
寧ろ、適切に例外処理をしておくべし。
# MSVCならcatchじゃなくてCATCHを使うのかな?

494 :デフォルトの名無しさん:2010/07/18(日) 12:29:26
>>488
メモリ確保については環境によるだろうが、通常は失敗しない。
しかし、たとえばWindowsで目一杯メモリを使うと
仮想メモリが不足しているとか警告が出てくると思うが、
そういう状況では失敗するかもしれない。

それはそうと、newが失敗したときはデフォルトで例外を投げるので、
if文で失敗を調べるのは方法が間違っているかもしれない。

495 :488:2010/07/18(日) 12:58:13
>newが失敗するって2通りあって、メモリが足りなかった場合と、クラスのコンストラクタが例外を投げた場合なんだけど、
コンストラクタでは例外が発生しないフレームワークを使っています
また、個人的にはコンストラクタの例外が嫌いなので作らないようにしたいと思います

>それはそうと、newが失敗したときはデフォルトで例外を投げるので、
これは、システムが保証している事なんですか



496 :デフォルトの名無しさん:2010/07/18(日) 13:20:25
VC6の時代に作られた

497 :デフォルトの名無しさん:2010/07/18(日) 13:43:32
少なくともC++03とC++0xの規格ではnewでメモリ確保に失敗したときは
std::bad_allocを投げるよう定められている。

498 :デフォルトの名無しさん:2010/07/18(日) 14:49:10
bad allocはめどいから投げっぱなしにしてmainで取って終わりにしちゃうよね普通

499 :デフォルトの名無しさん:2010/07/18(日) 18:07:44
ああstd::bad_allocを投げるような場合はprintf()もまともに動くかどうか
わからん状態だからな

500 :デフォルトの名無しさん:2010/07/19(月) 02:07:17
win7 64bitでVisualStudio2005は問題なく動作します?
64bitアプリを作成するには専用コンパイラが必要というだけで普通に使う分には問題ないですよね?

501 :デフォルトの名無しさん:2010/07/19(月) 02:57:51
>>500
すべての機能が正常に動くかはわからんが、とりあえずこっちの64bitWin7では動いている。
32bitアプリも64bitアプリもビルドできる。

502 :デフォルトの名無しさん:2010/07/19(月) 09:39:54
>>495 何年前からタイムスリップしてきたんですか?

503 :デフォルトの名無しさん:2010/07/19(月) 11:23:40
煽りとか要らない

504 :デフォルトの名無しさん:2010/07/19(月) 14:28:18
>>501
ありがとう、これでPCの更新ができるわ

505 :デフォルトの名無しさん:2010/07/19(月) 20:03:34
>>504
http://www.microsoft.com/japan/msdn/vstudio/support/tools.aspx

506 :デフォルトの名無しさん:2010/07/20(火) 18:32:31
frind classにしても「private メンバー にアクセスできません。」というエラーが出てしまいます

class A{
private:
int aaaa;
public:
friend class B;
};

class B{
public:
void err(int hoge){
hoge=30;
}
};

main(){
A a;
B b;
b.err(a.aaaa);
}

ソースを要約するとこんな感じです
ggってみて似たような質問があったのですが、それでは名前空間がどうたらという結果でしたがクラスA,Bは名前空間に入れていません
using namespace std;は使っていますが関係あるかどうか・・・

507 :デフォルトの名無しさん:2010/07/20(火) 18:37:30
>>506
friend class B;
と書くと、Bのメンバ関数からAのメンバにアクセスできるようになる。
そのソースではa.aaaaが書いてあるのはmain()
main()はBのメンバか?

B::err()の中身が気にはなるが、まぁ別の話。

508 :デフォルトの名無しさん:2010/07/20(火) 18:51:43
なるほど・・・そういうことでしたか
main関数の中身をなんらかのクラスを作って移住させれば動きました。ありがとうございます

errで意味ないことしてるのは渡すメンバーの中身を書き換えたりしない・・・みたいな意味合いです


509 :デフォルトの名無しさん:2010/07/21(水) 13:57:17
自作のヘッダやライブラリをまとめておく場所って定石みたいなものがありますか?
基本どこでもいいと思ってるんですけど、こうやっておくと便利、みたいなものがあれば教えて頂きたく。
OSはWindowsで、Visual Studioでの使用を想定してます。

510 :デフォルトの名無しさん:2010/07/21(水) 13:58:43
>>509
どこでも置いてもいい
インクルードパス指定すればおk

511 :デフォルトの名無しさん:2010/07/21(水) 18:24:57
>>510
どこへ置いてもあまりメリット・デメリットはないってことですかね。
適当な場所を決めてまとめるようにします。
ありがとうございました。

512 :デフォルトの名無しさん:2010/07/21(水) 19:47:19
/usr/includeとかってのはバカなのか?

513 :デフォルトの名無しさん:2010/07/21(水) 20:36:13
ホーム直下に俺様ライブラリフォルダを作ってる
ルート権限がない計算機で仕事することもあるし

514 :デフォルトの名無しさん:2010/07/21(水) 20:57:20
%HOME%\My Include
%HOME%\My Library
これに入れるとすごくWindowsっぽいですよ。

>>512 ないない。せめて/usr/local/include

515 :デフォルトの名無しさん:2010/07/22(木) 00:27:11
定期的に更新する5つのオブジェクトの内容を画面に表示するとき

・ひとつの表示クラスに5個のオブジェクトを所有させる
・表示領域を担当する表示クラスを5個作ってそれぞれを結びつける

どちらにした方がやりやすいでしょうか・・・?

516 :デフォルトの名無しさん:2010/07/22(木) 00:33:40
その5つのobjは互いに全然関係ないもの?

517 :デフォルトの名無しさん:2010/07/22(木) 00:41:05
ひとつのクラスもしくは多態的な関係です

518 :デフォルトの名無しさん:2010/07/22(木) 07:37:34
>>515
スレ違いっぽいね。
↓こっちでどうぞ。
http://pc12.2ch.net/test/read.cgi/tech/1187922645/

519 :デフォルトの名無しさん:2010/07/22(木) 20:58:57
new Test();とnew Test;は何か違う事はありますか?


520 :デフォルトの名無しさん:2010/07/22(木) 21:03:47
>>519
前者は引数無しコンストラクタを呼び出す
後者はデフォルトコンストラクタを呼び出す

521 :デフォルトの名無しさん:2010/07/22(木) 21:11:37
>>520
thx

522 :デフォルトの名無しさん:2010/07/22(木) 22:55:06
メンバ変数ってnewでインスタンス化する意味ってあるんですか?

523 :デフォルトの名無しさん:2010/07/22(木) 22:57:22
メンバ変数がポインタの場合とか

524 :デフォルトの名無しさん:2010/07/23(金) 01:25:56
>>519-521
てきとうなこといってんじゃねーよ。

後者は POD について値が不定となる。 POD じゃなければどちらも同じ。

525 :デフォルトの名無しさん:2010/07/23(金) 15:30:06
>>519-521
これはひどいwwww


>>522
すげー巨大だからヒープに確保しておきたいという事情がある時とか。


526 :デフォルトの名無しさん:2010/07/23(金) 15:43:02
>>522
配列を持つクラスを継承すると罠にハマる

527 :デフォルトの名無しさん:2010/07/24(土) 01:09:10
>>526 くわしく

528 :デフォルトの名無しさん:2010/07/24(土) 08:28:38
>>520 をさらし上げ

529 :デフォルトの名無しさん:2010/07/24(土) 15:17:51
>>526
それ、そのクラスかお前がバグってただけだろ。

530 :デフォルトの名無しさん:2010/07/24(土) 16:16:57
>>526
まさか配列の各要素がDeep copy されなくて云々なんて言わないよな?
そんな事で罠とか言わないよな?

531 :デフォルトの名無しさん:2010/07/24(土) 16:25:41
>524 も同じレベル。
>後者は POD について値が不定となる。 POD じゃなければどちらも同じ。


532 :デフォルトの名無しさん:2010/07/24(土) 16:38:36
間違ってると思うなら正しい答えを書こうぜ

533 :デフォルトの名無しさん:2010/07/24(土) 16:38:57
・・・つまり、何がちがうんだってばよ?

534 :デフォルトの名無しさん:2010/07/24(土) 17:06:43
試したけど>>524の正しいよな
http://codepad.org/QCtdPthw

535 :デフォルトの名無しさん:2010/07/24(土) 21:35:04
お前らこれで満足だろ
§5.3.4 New

15 A new-expression that creates an object of type T initializes that object as follows:
? If the new-initializer is omitted:
? If T is a (possibly cv-qualified) non-POD class type (or array thereof), the object is defaultinitialized
(8.5). If T is a const-qualified type, the underlying class type shall have a user-declared
default constructor.
? Otherwise, the object created has indeterminate value. If T is a const-qualified type, or a (possibly
cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of
const-qualified type, the program is ill-formed;

536 :デフォルトの名無しさん:2010/07/24(土) 23:52:30
>>531
プッ

537 :デフォルトの名無しさん:2010/07/25(日) 00:00:05
>>524正しいじゃん

538 :デフォルトの名無しさん:2010/07/25(日) 03:50:53
いくつかの乱数を作るときに、全ての乱数の和が常に同じになるようにすることって出来ますかね?
例えば1〜5の範囲の乱数を3つ作って、その3つの乱数の和は常に10になる、みたいな

"同じ数"から乱数分引いていって、残った分を最後の乱数にすればいいかと思ったんですが
それだと上の例で5が2つ出たら最後は0になって範囲外になってしまいます

539 :デフォルトの名無しさん:2010/07/25(日) 04:46:45
#define N 3
#define R 5
int r[N];
int left = 10;
int i, tmp;
for(i = 0; i < N - 1; ++i){
  tmp =  left - (N - i);
  r[i] = (rand() % (tmp < R - 1 ? tmp : R - 1)) + 1;
  left -= r[i];
}
r[N - 1] = left;

540 :デフォルトの名無しさん:2010/07/25(日) 04:57:55
適当に乱数を3つ出して、その比率に応じた数値に直せば良いんじゃないの。
もちろんそれをやると実数になっちゃうので、最後の微調整は必要だけど(あと0を除く処理とかも)。

例えばrand()を使って 23, 66, 70 の3つが得られたとすれば
23 + 66 + 70 = 159 から
それぞれ 10 * 23/159, 10 * 66/159, 10 * 70/159 にするとか。

まあ最後の要素は引き算にすべきで、さらに
2つ目からn-1個目の切り上げ切り捨ての判断も
個々にではなく、それまでの累計を基にしないと
最後の数が(引き算で求めても)範囲外になる可能性が出てきちゃうね。

541 :デフォルトの名無しさん:2010/07/25(日) 12:56:05
>>538
割合を乱数で出したらダメなの?
例えば常に和が10と決まっていて乱数範囲が1〜5だと言うなら、
和に対して 0.5〜0.1 の乱数を一つと、
1.0 から 上の乱数を引いた物に対して、また 0.5〜0.1 の乱数を求めれば

542 :デフォルトの名無しさん:2010/07/25(日) 13:06:28
>>540>>541 は考え方は似てるけど、>>541 の方がスマート


543 :デフォルトの名無しさん:2010/07/25(日) 13:11:33
和が10になる組み合わせを列挙しておいて
乱数でいずれかの組み合わせを選択する
数値の出力順も乱数で決定する

この方法なら最初の組み合わせを限定する事で
特定の数値が出やすいとかいうのを排除しやすい

544 :デフォルトの名無しさん:2010/07/25(日) 13:27:33
和が1000で50個の値の組み合わせ、とかだった場合どうすんのそれw


545 :デフォルトの名無しさん:2010/07/25(日) 13:35:09
いずれにしても 1, 1, 5 とかの順番で出ちゃったら破綻するな
最後は引き算にして、範囲外になったら最初から振り直すのが確実じゃね?

やり直しなしで求めるとした場合
出したい乱数の合計値をT、乱数の最大値・最小値をRmax・Rmin、
これまでに出た乱数の合計値をt、残りの乱数の個数をNと置いて
N>1の時は乱数の下限値を max(Rmin, T-t-(N-1)*Rmax)
上限値を max(Rmax, T-t-(N-1)*Rmin)
N=1(最後の一回)の時は r[n] = T-t とすれば良いかと。

546 :デフォルトの名無しさん:2010/07/25(日) 13:42:56
>>539でいいじゃん

547 :デフォルトの名無しさん:2010/07/25(日) 13:51:23
>>546
1が2回出たら困るやん

548 :デフォルトの名無しさん:2010/07/25(日) 14:28:53
>>541でいいじゃん

549 :デフォルトの名無しさん:2010/07/25(日) 15:36:49
randが0吐いたら困るんじゃね

550 :デフォルトの名無しさん:2010/07/25(日) 15:41:06
これで満足か?
#include<stdio.h>
#include<stdlib.h>

#define MAX_NUM 5
#define MIN_NUM 1
#define SUM_NUM 10
#define NUM_NUM 3
void swap(int *a, int *b){int c;c=*a;*a=*b;*b=c;}

int main(void){
int i, sum, rest, max_num, min_num;
int nums[NUM_NUM];

for(i=NUM_NUM-1,rest=SUM_NUM;i>=0;i--){
max_num=MAX_NUM;
min_num=MIN_NUM;
if(rest-(MAX_NUM*i)>MIN_NUM) min_num=rest-(MAX_NUM*i);
if(rest-(MIN_NUM*i)<MAX_NUM) max_num=rest-(MIN_NUM*i);
if(max_num<min_num) exit(1);
nums[i]=rand()%(max_num-min_num+1)+min_num;
rest-=nums[i];
}
for(i=0;i<NUM_NUM;i++) swap(&nums[i], &nums[rand()%(i+1)]);

for(i=0, sum=0;i<NUM_NUM;i++){
printf("%d\n", nums[i]);
sum+=nums[i];
}
printf("\nsum=%d\n", sum);
return 0;
}

551 :デフォルトの名無しさん:2010/07/25(日) 15:55:29
まあ>>538を読めば、自身がわかってないことがわかるが
最後の数字(最後に限らないが)を、それまでに算出した数を元に決めるやり方というのは
「乱数」の性質を満たしておらず、最後の数字に偏りが出る。

ただ、それでも良いのかもしれないけどね。

552 :デフォルトの名無しさん:2010/07/25(日) 16:50:50
総和が決まっててそれを構成する複数の値を求めたいってのは、
幅が決まってる数直線上に、複数の区切り位置をランダムに決めてくのと同じ事なので、
>>541 の考え方がシンプルでいいかもしれない。割合のランダム


553 :デフォルトの名無しさん:2010/07/25(日) 18:56:01
文字列を暗号化して色々な事に使いたいのですが、
RSAとAESのライブラリがある所をご存知ないですか?

554 :デフォルトの名無しさん:2010/07/25(日) 19:02:53
main関数のreturnについて質問。


C/C++の宿題片付けます 138代目
http://pc12.2ch.net/test/read.cgi/tech/1279286575/416

416以降main関数のreturn 0;は省略可能か、
それが規格上の言語仕様なのかコンパイラ依存なのか、
スレチな議論が延々と続いてるんで、引き取ってくれ。

555 :デフォルトの名無しさん:2010/07/25(日) 19:16:30
return文 wikipedia

return文に遭遇しないまま関数の終わりまでプログラムが実行された場合、
そこに式を省略したreturn;が行われたと見なされる。ただし、C99とC++98では、
main関数に限り、そのmain関数の戻り値の型がintであればreturn 0;が
あったと見なされる(X3010 9頁 5.1.2.2.3、X3014 35頁 3.6.1 5節参照)

556 :デフォルトの名無しさん:2010/07/25(日) 19:17:14
いつの版のか知らんが手元にあったやつ載せとく。これでいいだろ。
> 5.1.2.2.3 Program termination
> 1 If the return type of the main function is a type compatible with int, a return from the
> initial call to the main function is equivalent to calling the exit function with the value
> returned by the main function as its argument;9) reaching the } that terminates the main
> function returns a value of 0. If the return type is not compatible with int, the
> termination status returned to the host environment is unspecified.

557 :デフォルトの名無しさん:2010/07/25(日) 20:05:00
C/C++の宿題片付けます 138代目
http://pc12.2ch.net/test/read.cgi/tech/1279286575/551-553


551 名前:デフォルトの名無しさん[] 投稿日:2010/07/25(日) 19:40:48
>>1
> 気に入らない質問やその他の発言はスルーの方向で。
return 0; は ○省略可能 ×不要

552 名前:デフォルトの名無しさん[sage] 投稿日:2010/07/25(日) 19:41:43
【結論】

mainのreturn 0; は ○不要 ○有ってもいい △記述の省略は可

C99では、mainの } に達したら、0を返して終了する。
C++では、mainの最後に達したら、return 0; を実行する。

553 名前:デフォルトの名無しさん[] 投稿日:2010/07/25(日) 20:02:21
return 0; は ×不要 ○省略可 ○各自で適切に記述
勝手に不要としないで下さい ><;
お前の存在こそ、このスレにとっては不要です ><;

558 :デフォルトの名無しさん:2010/07/25(日) 20:11:35
不要と省略可能がどう違うのか説明してもらわないと、わけがわからないな。
どうせくだらない思い込みだからどうでもいいんだけど。

559 :デフォルトの名無しさん:2010/07/25(日) 20:17:37
なかったらデフォルト値が使われるだけで不要な訳ではない
ということでしょう

560 :デフォルトの名無しさん:2010/07/25(日) 20:28:53
みんな目的語省略しすぎだな.
 プロセスローダ側から見てmainの返値は不要ではない
 return 0; の記述は省略可能
 retrun 0; を省略できる場合にわざわざ書く労力は不要


561 :デフォルトの名無しさん:2010/07/25(日) 21:15:58
政治的に正しい言語定義が必要だな

562 :デフォルトの名無しさん:2010/07/25(日) 23:26:38
記述が不要だって言ってるのに終了コード自体が不要だって言ってると勘違いした人が、
わざとなのか知らないが、誤解を埋めるための目的語を添えずにわめき続けている、と。

563 :デフォルトの名無しさん:2010/07/25(日) 23:50:26
もう放っておけばいいよ

564 :デフォルトの名無しさん:2010/07/26(月) 12:55:10
くだらない質問ですが、mapを使う際、変数名はどう命名するのが自然ですか?
たとえばこのような場合、address_map? store_map?

std::map<std::wstring, int> hoge;
hoge[店の名前] = 場所

565 :デフォルトの名無しさん:2010/07/26(月) 13:15:46
>>538です
多くの回答ありがとうございました
割合をランダムで出す方向で行きたいと思います

566 :デフォルトの名無しさん:2010/07/26(月) 17:36:50
>>564
冗長でいいなら、店の名前_場所_mapのようにするのが自然。
もうちょっと縮めたいなら、場所_mapの方が良好だと個人的に思う。

567 :デフォルトの名無しさん:2010/07/26(月) 22:57:34
>>566
ありがとうございます
普通の配列のように、値の方で命名するのも良さそうですね

568 :デフォルトの名無しさん:2010/07/27(火) 13:24:17
C++の型は静的であって、型を間違えたところでコンパイラに怒られるだけ
どのコンテナなのかもしくは配列なのか分からないんじゃ、扱い方が分からないんじゃないかと言われるかもしれないが
どのみちmapだとだけ分かってもどうせ格納してる型を知るには宣言に飛ぶ必要がある
コンテナの種類を載せることも冗長ではないか

569 :デフォルトの名無しさん:2010/07/27(火) 23:30:18
「場所マップ」、「場所リスト」とかなら分かるけど「場所」だけじゃ気持ち悪いじゃん

570 :デフォルトの名無しさん:2010/07/28(水) 01:00:04
場所[店] と書いて使うんならありじゃね?

571 :デフォルトの名無しさん:2010/07/28(水) 09:40:15
ユーザー定義の構造体やクラスを関数の返り値にするのってコストの面や
返り値が変更点になったときその影響範囲が広くて大変なことになりそうですが
普通にやって良いものなのでしょうか?

それでも2値以上返す場合はそうするしかないのでしょうか?

572 :デフォルトの名無しさん:2010/07/28(水) 21:19:52
const unsigned char s[] = "char";
const unsigned char *s = "char";

下の書き方だとgccに怒られるのですが、なぜ怒られるんですか?


573 :デフォルトの名無しさん:2010/07/28(水) 23:18:30
あるクラスのメソッドで構造体を引数にとるとき
クラスが多態的になるとき引数の構造体も多態的に扱うというのは有りなのでしょうか?

また、このとき構造体も基底部をインターフェイスとした方がいいでしょうか?

574 :デフォルトの名無しさん:2010/07/29(木) 00:04:06
>>572
上の"char"は{ 'c', 'h', 'a', 'r', '\0' }の構文糖。
下の"char"では無名のconst char[]が作られ、
const char*はconst unsigned char*に変換できないのでエラーになる。

575 :デフォルトの名無しさん:2010/07/29(木) 00:47:45
>>571
コストは実測してみろ。
影響範囲がどうのということは代替案はグローバル変数か?ありえん。

たいていは読みやすく書いておけばいい。
「返す」というなら素直に戻り値にするのがいいだろう。

576 :デフォルトの名無しさん:2010/07/29(木) 00:48:29
>>572 エラーメッセージ嫁。

577 :デフォルトの名無しさん:2010/07/29(木) 00:49:34
>>573
クラスが多態的なのと引数が多態的なのは関係ない。別々で考えて好きにすればいい。

578 :デフォルトの名無しさん:2010/07/29(木) 07:15:33
>>574
構文糖っての初めて見た。
たいてい糖衣構文って言わない?

579 :デフォルトの名無しさん:2010/07/29(木) 08:51:05
たいてい両方言う


580 :デフォルトの名無しさん:2010/07/29(木) 16:16:15
syntax sugar

581 :572:2010/07/29(木) 21:54:54
>>574
なんとなく、雰囲気はつかむことができました

>>576
すみません、エラーメッセージを読んでもわかりません
もうすこし、kwsk説明してください

>>578
シンタックスシュガーとも言わない?

582 :デフォルトの名無しさん:2010/07/30(金) 00:42:39
まとめ

構文糖
糖衣構文
セイロガン糖衣A
syntax sugar
シンタックスシュガー

583 :デフォルトの名無しさん:2010/07/30(金) 01:08:43
>セイロガン糖衣A
てめえはコレを書きたかっただけだろw

584 :デフォルトの名無しさん:2010/07/30(金) 01:29:06
>>581 エラーメッセージの何がわからなかったの?

585 :デフォルトの名無しさん:2010/07/30(金) 03:41:40
>>582
ちっちゃな雪使いシュガーがないぞどういうことだ

586 :デフォルトの名無しさん:2010/07/30(金) 06:56:42
sugar baby loveを雪使いシュガーの主題歌だと思っていたら世間一般ではそうではないということに気づきました

587 :デフォルトの名無しさん:2010/07/30(金) 09:24:01
オリジナルもリメイクも古い曲だからな

588 :デフォルトの名無しさん:2010/07/30(金) 09:56:53
糖尿なのでシュガーカットでおながいしまつ

589 :581:2010/07/30(金) 21:22:38
>>584
はい、そうです

590 :デフォルトの名無しさん:2010/07/30(金) 21:55:24
srd::queue<Data> data_que;
みたいな事をして、data_que内にいっぱいデータ詰めて、その後全部popしたんだけど、
メモリ使用量が減らないのは仕様なの?
再びやると、前回の確保量まではメモリ使用量が増えずに、確保分を超えたところからまた使用量が増えるんだけども。
どうすれば、いちいち解放してくれるだろうか。

591 :デフォルトの名無しさん:2010/07/30(金) 21:57:50
>>590
仕様
気に入らない場合は
OSから作らないといけなくなるかも

592 :デフォルトの名無しさん:2010/07/30(金) 22:03:36
>>591
OSレベルでの仕様ってことなのね。
アプリケーションが使用したことがある領域が割り当てられて、って感じなのかな。
一度に確保する数はたかが知れてるからこのままで行くことにするわ。
ありがとう。

593 :デフォルトの名無しさん:2010/07/30(金) 22:22:49
>OSから作らないと
寝ぼけたことを言わないように。


まず、いわゆるswap技法により、ライブラリのアロケータに返すことは出来る。
ただし、ライブラリは、アプリケーション側からメモリを返却されても
OSには返さない場合も多い。

確実にOSに返すためには、
allocatorを自作して、OSから直接メモリを得て不要になったらOSに返すようなものを作る。
(ただし、例えばWin32のHeapAllocを使ってもOSと直接やり取りすることにはならない)
が、そこまでする必要があることは、まず無い。

594 :デフォルトの名無しさん:2010/07/30(金) 22:24:17
>>593
つまりどうすればいいの?

595 :デフォルトの名無しさん:2010/07/30(金) 22:40:44
いわゆるswap技法
allocatorを自作

596 :デフォルトの名無しさん:2010/07/30(金) 23:30:06
>>590 http://www.google.co.jp/search?q=protected+container_type+c

597 :デフォルトの名無しさん:2010/07/31(土) 09:34:19
>>590
いちいち開放すると遅くなるので、本当に開放が必要か検討してみれ

598 :デフォルトの名無しさん:2010/07/31(土) 09:43:57
>>597
入力履歴の記憶/再生だから流石に必要かな と思ったけど、実装的には別に開放しなくても大丈夫だな・・・。
うーん、考えてみる。

アロケータを自分で書くほどの必要性には迫られてないから、そっちは保留しとくわ

599 :デフォルトの名無しさん:2010/08/02(月) 06:55:30
すごく偏りの激しい乱数を作る方法でいいのがあれば教えてください
具体的には
1-10の範囲で100回乱数をとって集計すると大概は
1が30回, 4が21回, 5が6回・・・・とかになるような感じです(たまに平坦になったりするのもよいです)
そしてどれが多く出るのか、何回でるのかは毎回バラバラになるみたいな感じで

600 :デフォルトの名無しさん:2010/08/02(月) 07:05:20
>>599
乱数を加算する偏る
加算回数をランダムで決めたり、シャッフルしたりして加工する

601 :デフォルトの名無しさん:2010/08/02(月) 07:06:53
>>600
中心極限定理ですよね
それって一様分布から正規分布に近づくって話じゃなかったですか?

602 :デフォルトの名無しさん:2010/08/02(月) 07:34:53
>>601
ちょっと思いつかないなあ
結局、どういう風に偏ることを期待しているか、という問題に行き着くんじゃないのかね
非対称な確率分布の確率関数に突っ込めば、偏りのある数列は得られるだろう
しかし望みのものになるかは不明

603 :デフォルトの名無しさん:2010/08/02(月) 07:42:45
>>599
1.それぞれの目が出る回数を乱数で決める
2.1の回数どおりに配列に数値を代入
3.混ぜる
#include <stdio.h>
#include <stdlib.h>
void swap(int *a, int *b){int c; c=*a; *a=*b; *b=c; }
int main(void){
int result[100], count[10], sum, diff, index, i, j;
srand(time(NULL));
for(i=0,sum=0;i<10;i++){ // 1.ここから
count[i]=rand()%20;
sum+=count[i];
}
diff=sum-100;
while(diff){
index=rand()%10;
if(diff<0) count[index]++, diff++;
else if(count[index]>0) count[index]--, diff--;
} // 1.ここまで
for(i=0,index=0;i<10;i++){ // 2.
for(j=0;j<count[i];j++) result[index++]=i+1;
}
for(i=0;i<100;i++) swap(&result[i], &result[rand()%(i+1)]); // 3.

for(i=0;i<100;i++) printf("%d\n", result[i]);
for(i=0;i<10;i++) count[i]=0;
for(i=0;i<100;i++) count[result[i]-1]++;
for(i=0;i<10;i++) printf("%d : %d\n", i+1, count[i]);

return 0;
}

604 :デフォルトの名無しさん:2010/08/02(月) 07:43:35
>>602
つまり>>600の説明では意味不明でしたか?

>対称な確率分布の確率関数に突っ込めば
>望みのものになるか不明
望みの物とは正反対になるような気が……

605 :デフォルトの名無しさん:2010/08/02(月) 07:51:42
いやそもそも乱数だと言ってるのがおかしかったかもしれません
乱数じゃないですし

>>603
なるほど
ありがとうございます

606 :デフォルトの名無しさん:2010/08/02(月) 23:54:29
クラスのインスタンスをファイルに書き出すってどうやればいいんでしょうか?
boostのserializeが使えない事例なので、どうすればいいか分かりません。
fwriteっていう話も聞きましたが・・・できればC++での方法が知りたいです。

607 :デフォルトの名無しさん:2010/08/03(火) 00:07:43
>>606
>>で書き出して<<で読み込めるようにすればストリームでシリアライズできるよ

608 :606:2010/08/03(火) 00:26:20
>>や<<をオーバーロードして、ファイルの書き込み・読み込みを行え という意味で良いんでしょうか。

609 :デフォルトの名無しさん:2010/08/03(火) 00:50:32
>>608
・__vtbl
・エンディアン
・パディング
これらの単語にひとつでも見覚えがないものがあるなら諦めろ
ていうかboost::serializationが使えない事例ってどういう事例よ

610 :デフォルトの名無しさん:2010/08/03(火) 01:06:01
>>609
自分用のライブラリっぽいものを書いてるもんで、boost入ってるの前提なのはちょっと困るんです。使用環境がboost前提になってしまうので。
そしてその単語に見覚えはあるものの、意味は分からないので今回は諦めてメンバ一個一個を読み書きすることにします・・・。

611 :デフォルトの名無しさん:2010/08/03(火) 02:01:04
Baseクラスを継承したSubクラスがあり

void foo(Base* src){
Sub1* sub1 = dynamic_cast<Sub1>(src);
/*〜*/
};

この関数fooは自分が勘違いしなければかならずSub1を引数にとるようになっているのですが
念のためdynamic_castを試みると

error C2682: 'dynamic_cast' を使用して Base*からSub*へ変換できません
とエラーを吐きます。

こういうばあいどうしたらよいでしょうか



612 :デフォルトの名無しさん:2010/08/03(火) 02:02:10
訂正
Sub1* sub1 = dynamic_cast<Sub1*>(src);

error C2682: 'dynamic_cast' を使用して Base*からSub1*へ変換できません

でした

613 :デフォルトの名無しさん:2010/08/03(火) 03:00:50
Baseのデストラクタをvirtualにする

614 :デフォルトの名無しさん:2010/08/03(火) 03:08:14
Sub1のデストラクタをvirtualにする

615 :デフォルトの名無しさん:2010/08/03(火) 08:47:08
派生クラスのデストラクタにもvirtual指定が必要だったようです。
無事コンパイルは通りましたけどどうしてなんだろ・・・

616 :デフォルトの名無しさん:2010/08/03(火) 20:52:13
fstreamの話なんですが、
ifstream ifs("filename");
と書けばスコープ外れた時にデストラクタでcloseされるのは良いのですが、
ifstream ifs;
ifs.open("filename");
と書いた場合にもデストラクタでcloseされるのでしょうか?
コンストラクタでopenした場合にはスコープ外れたときに〜という文脈で解説しているサイトがあって不安になりました。

617 :デフォルトの名無しさん:2010/08/03(火) 21:00:09
>>615
俺は派生クラスにもvirtualつけてる派だが、無くてもいけるはずだと思ってたが

まさか、VC6?

618 :デフォルトの名無しさん:2010/08/03(火) 21:01:54
>>616
されるんじゃないかな?

619 :デフォルトの名無しさん:2010/08/04(水) 00:41:27
C か C++ か WinAPI スレかで迷ったのですが…
Windows XP、VS 2005、C++ で開発しています。

・fread のエラー内容を取得するにはどうしたらいいのでしょうか?

fopen で "wb" で開いたファイルに対して fread でデータを読もうとすると、当然読めないので 0 が返ってきます。
この時のエラーメッセージを取得したいのですが、_get_errno で取得した値が 0 になってしまいます。

調べたところ、POSIX?では errno を調べることで取得できるが、Win32 では保証されていない的な文が見つかりました。
確かに MSDN を調べたところ、パラメータが無効な場合は EINVAL を設定するとありますが、それ以外に errno を設定する記述はありません。

標準ライブラリを使わずに API を用いてファイル操作をするしか方法はないでしょうか?
よろしくお願いします。

620 :デフォルトの名無しさん:2010/08/04(水) 00:43:52
getlasterror

621 :デフォルトの名無しさん:2010/08/04(水) 00:54:14
つーか、それが「エラー」なのかどうか、確認してるか?

実際にファイルの内容があっても読み込めないんだろうが
現実的には、単に読み込もうとした結果がEOFだと判定されているだけじゃないのかね。
0を返した後、ferror()とfeof()でエラーであることを確認した上でなら、しょうがないとも思うけど。

622 :デフォルトの名無しさん:2010/08/04(水) 01:42:55
>>621
確認してみましたが、feof は 0 を返します。
念のため ferror も確認しましたが 0 以外を返しました。
エラーとは認識しているようですが…。

>>620
内部で API を呼んでいるとは予想できるので、GetLastError で取得できるという話は聞いたことがあります。
ただそれでも、パラメータ不正な場合など、API を呼ぶ前にエラーが起きている場合は GetLastError で取得できないとも聞きました。

とりあえずは API を直に使ってみることにします…。ありがとうございます。

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

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)