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

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

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

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

2:デフォルトの名無しさん
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は使えないのでしょうか・・・?


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

4796日前に更新/130 KB
担当:undef