トップページ⇒tech
990コメント299KB

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001//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をチェック)
0002デフォルトの名無しさん2010/05/21(金) 10:44:31
tan=y/xとしててx=0の時は場合分けしないといけませんか?
x=0の時はどういう処理にすれば良いのですか?
0003デフォルトの名無しさん2010/05/21(金) 10:46:42
>>2
fabs(x)>fabs(y) のとき y/x
fabs(x)<fabs(y) のとき x/y で計算しておいて M_PI/2 から引く
0004デフォルトの名無しさん2010/05/21(金) 10:49:06
そんな貴方に atan2 じゃないの?
0005デフォルトの名無しさん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]=とわけて書かないといけないのでしょうか?
0006デフォルトの名無しさん2010/05/21(金) 13:31:48
すいません。4番目と5番目です
0007デフォルトの名無しさん2010/05/21(金) 14:30:03
x86のFPUのFPATAN命令もx=0の時を考慮している
0008デフォルトの名無しさん2010/05/21(金) 14:45:21
>わけて書かないといけないのでしょうか?
はい。

>上書きされてしまいますか?
その前にfoo[3]の時点で死ぬ。
初期化の時点で要素数指定しろ。
0009デフォルトの名無しさん2010/05/21(金) 14:45:52
配列や構造体のデータを{}を使った代入形式でまとめてセット出来るのは宣言時のみ。
宣言文と代入文は見た目は似ているけど、文法上は全く別要素に定義されている。
0010デフォルトの名無しさん2010/05/21(金) 14:49:39
そうですか…ありがとうございました
あばば
0011デフォルトの名無しさん2010/05/22(土) 17:57:59
デストラクタで親のデストラクタに行くと親のthisポインタがずれる・・・なんだこれは・・・
0012デフォルトの名無しさん2010/05/22(土) 18:02:20
デストラクタに限らず、基底クラスの関数を呼ぶときはそうでないと困るだろ
0013デフォルトの名無しさん2010/05/22(土) 18:06:50
アドレスのオフセットもコンパイラが勝手に調整してくれてるわけよ
ためしに適当に継承されてるクラス作ってstatic_castやってみればわかる
0014デフォルトの名無しさん2010/05/22(土) 18:18:33
な,なおった...
ありがとう
0015デフォルトの名無しさん2010/05/23(日) 02:27:51
マジキチ
3時間くらいぶっ通しで悩んでたら原因がif( = )だった…
エラー出ないのですか?
0016デフォルトの名無しさん2010/05/23(日) 02:32:11
文法的に正しけりゃエラーは出ない
0017デフォルトの名無しさん2010/05/23(日) 02:39:06
if(boolgata = true)
だったのですが文法的に正しいのですか?
0018デフォルトの名無しさん2010/05/23(日) 02:48:58
うん
0019デフォルトの名無しさん2010/05/23(日) 02:53:14

== true

こんなの書くなよ
0020デフォルトの名無しさん2010/05/23(日) 03:28:38
警告レベルによっては警告は出るかもしれない
まあ = true なんて不要というのは確実な話だが
今回はたまたまbool型だったに過ぎない話だな
0021デフォルトの名無しさん2010/05/23(日) 03:45:26
true == も書くし、0 == も書くぜ
0022デフォルトの名無しさん2010/05/23(日) 03:57:01
== true だろうが true == だろうが害悪にしかならない
if (islower(c) == true) { ... } とか書いてハマるタイプ
0023デフォルトの名無しさん2010/05/23(日) 04:05:31
false との比較なら問題ないとでも誰かが言い出しそうなんで念のためいっとくけど、
論理定数との比較がナンセンスなんだよ。
0024デフォルトの名無しさん2010/05/23(日) 04:19:56
え?TRUE ==とか普通に使ってるんだけどダメなの?
if (xxx) { ... } しか書いてない場合、意図通りに動くか不安なんだよな。。
0025デフォルトの名無しさん2010/05/23(日) 04:33:37
http://www.kouno.jp/home/c_faq/c9.html#2
0026デフォルトの名無しさん2010/05/23(日) 04:53:49
マジキチすぎて全俺が泣いた
if( fab(フトートの計算 )<=1/2)&&〜←バグ
if( fab(フトートの計算 )<=0.5f)&&〜←成功

何故ですか?
0027デフォルトの名無しさん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型なら安全だろうけど、癖になってると他の型の値でもやる事になるはずだ
0028デフォルトの名無しさん2010/05/23(日) 04:57:04
>>26
1/2 == 0

×fab
○fabs
×フトート
○float, フロート
0029デフォルトの名無しさん2010/05/23(日) 05:00:56
>>28
マジですか!?
フロートと整数の分数を比べたら小数点が全て切り捨てられるってことですか!?
全然知りませんでしたorz今気付けて良かったです。ありがとうございました
0030デフォルトの名無しさん2010/05/23(日) 05:02:57
1/2は分数じゃなくて整数演算。だから小数点以下は切り捨てられて、結果は0になる。
1.0/2.0なら浮動小数点数演算。結果は0.5になる。
0031デフォルトの名無しさん2010/05/23(日) 05:06:53
そうなんですか…全く知らなかった…
ほんとうにありがとうございました
0032デフォルトの名無しさん2010/05/23(日) 09:41:57
http://codepad.org/rUEMdrlH

これはひどい
0033デフォルトの名無しさん2010/05/23(日) 09:42:30
bool型を返さない関数コールして、bool値と比較するなら
バグ作ってるだけだべ
0034デフォルトの名無しさん2010/05/23(日) 09:51:26
falseとの比較は安全だが
== true の代わりに != false を使う事になって
二重否定でとても読みにくい
0035デフォルトの名無しさん2010/05/23(日) 09:53:35
>>23の予言が的中しました。まぁ、相当の高確率で当たる予想だけどねw
0036デフォルトの名無しさん2010/05/23(日) 09:58:32
>>23は「俺はfalseと比較してるから問題ないだろ!」という人に対するもので
>>34とは根本的に違う
0037デフォルトの名無しさん2010/05/23(日) 12:50:04
if(xxx) では文脈的にわかりにくいときだけ if(xxx != false) とする
0038デフォルトの名無しさん2010/05/23(日) 13:15:50
それならたまになくはないな
0039デフォルトの名無しさん2010/05/23(日) 16:42:53
std::stringのc_str()関数が返すポインタが有効なのはいつまでですか?
希望としてはそのインスタンスに対してなんらかの操作(結合とか)をするまでは有効だとうれしいんですが。
勝手にメモリが移動したりとかそんな挙動があったらイヤです。
0040デフォルトの名無しさん2010/05/23(日) 16:51:13
非constメンバ関数を呼ぶまでは有効と保証されてる
0041デフォルトの名無しさん2010/05/23(日) 17:01:00
かりに保証されててもレガシーコードに渡す一時的な値としての使い方以外はしない方が健全
0042デフォルトの名無しさん2010/05/23(日) 17:01:35
>>40-41
ありがとうございます!!!
0043デフォルトの名無しさん2010/05/23(日) 17:01:54
関数作る時引数全部 std::string にしてんのか?
流石にそりゃないだろう
0044デフォルトの名無しさん2010/05/23(日) 17:04:32
いいえ
0045デフォルトの名無しさん2010/05/23(日) 17:08:16
文字列リテラルやそれ入れただけの定数を渡す事もあるんだろうし
std::stringである事を特に利用しないなら
関数の引数はconst char*にした方がいいよ
std::stringである事を利用したいなら別だが
0046デフォルトの名無しさん2010/05/23(日) 21:10:01
c++でクラスで書かれたソースの関数を使いたいのですが
Cではヘッダをインクルードして関数名を書けば使えたと思うのですが
C++ではnewなどをしないと使えないのですか?
0047デフォルトの名無しさん2010/05/23(日) 21:15:36
関数はnewしなくても使えるよ。そもそも関数はnewできない。
0048デフォルトの名無しさん2010/05/23(日) 21:29:53
つまり
クラス::関数名();でも使えるってことですか?
newして 名前ー>関数()とするのとはどう違うんですか?
0049デフォルトの名無しさん2010/05/23(日) 21:48:22
>>48 試せ。ググれ。
0050デフォルトの名無しさん2010/05/23(日) 22:01:21
教えてください
0051デフォルトの名無しさん2010/05/23(日) 22:17:35
>>50
http://codepad.org/ ここで試せ。
http://www.google.co.jp/ ここでググれ。
0052デフォルトの名無しさん2010/05/23(日) 22:19:48
いやです
0053デフォルトの名無しさん2010/05/23(日) 22:22:46
試し方がわかりません
0054デフォルトの名無しさん2010/05/23(日) 22:28:16
>>48
入門書の1冊でも買って読んでください
0055デフォルトの名無しさん2010/05/23(日) 22:32:39
初心者ページもかなり読みましたよ
プログラミングは2年やってますし
0056デフォルトの名無しさん2010/05/23(日) 22:32:53
static メンバ関数
0057デフォルトの名無しさん2010/05/23(日) 22:48:53
ここで中途半端な知識を身につけたら
あとで正しく理解するのに苦労しそうだな
0058デフォルトの名無しさん2010/05/23(日) 22:48:54
読んだことも使ったこともあるけど、何をやってるのか、どう違うのかわからないっていう
0059デフォルトの名無しさん2010/05/23(日) 22:53:17
2年やってこんなことも分からないなんて、正直なところすごいかわいそうだと思った
0060デフォルトの名無しさん2010/05/23(日) 22:55:57
業務5年以上やっても、fopenシラン奴もいる
0061デフォルトの名無しさん2010/05/23(日) 22:56:00
だから聞いてるんじゃん
0062デフォルトの名無しさん2010/05/23(日) 22:58:57
>>60
給料泥棒すぎるだろそいつ…
0063デフォルトの名無しさん2010/05/23(日) 23:18:36
>>46
staticメンバならそのまま呼べる。そうでないならインスタンスを作成してから呼ぶ。
0064デフォルトの名無しさん2010/05/23(日) 23:30:50
>>60
普通API使うだろ。知らなくてよし
0065デフォルトの名無しさん2010/05/23(日) 23:46:50
「普通」っていうのはたいてい「俺は」って意味のところを大勢に見せたいだけだよね。
0066デフォルトの名無しさん2010/05/23(日) 23:49:12
標準で済む操作にOSのAPIを直で使って環境移行の手間を増やす馬鹿野郎は貴様か。
0067デフォルトの名無しさん2010/05/23(日) 23:49:14
普通はそうだね
0068デフォルトの名無しさん2010/05/24(月) 00:07:07
直APIだと、一般的にはパフォーマンスも落ちるわけだしね。

勘違いしてる初心者も多いけど
ラップ(バッファリング)することによって
システムコールの回数を減らす方が、
毎回呼び出すよりずっと処理が軽くなるから。
0069デフォルトの名無しさん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とかにも反応する。
さすがに、ローマ数字や漢数字はだめだったけど…
0070デフォルトの名無しさん2010/05/24(月) 10:27:23
>>68
モダンなOSなら自分でバッファリングしてるし
メモリマップトI/Oや非同期I/Oもある
標準ライブラリを使うのはパフォーマンスのためというのは間違いで、
単純に移植性のためだ

それと、Windowsではファイル名が固定の場合以外にfopen()使ってるプログラムは
全て糞と断定していい
0071デフォルトの名無しさん2010/05/24(月) 13:23:21
Aのcppのファイルでexternした構造体があってグローバルで宣言して凄い呼び出す関数の中で初期化される
Bのcppでグローバル位置で宣言するとA.objで既にあるので未解決のシンボルとエラーが出る
Bのcppの使う関数の中で宣言すると通る
なぜですか?それと、値はちゃんと入ってますか?
0072デフォルトの名無しさん2010/05/24(月) 13:28:30
>>71
宣言と定義を含め、externするとか初期化するとか、用語の使い方が胡散臭くてよくわからん。
意味をよく調べて言いなおすか、ソース貼ったほうがいいよ。
0073デフォルトの名無しさん2010/05/24(月) 13:40:40
ありがとうございました
全く同じ物を代入しようとしてたみたいです
それで未解決になったのかはわかりませんが。
0074デフォルトの名無しさん2010/05/24(月) 13:46:26
>>70
言いたいことは彼と一緒だと思うよ。直APIという言葉がうさんくさいけど、
その後を読めばAPI使ったほうが軽いといっているように見える
0075デフォルトの名無しさん2010/05/24(月) 15:43:53
>>70
「カーネルモードへの移行」が、
単純な関数呼び出しより重い処理だと言う話だ。
OSのキャッシュとかは全然関係ない。

メモリ確保等でも同様。
0076デフォルトの名無しさん2010/05/24(月) 15:46:24
常に非同期I/Oしか使わないとでもいうならともかくね。
0077デフォルトの名無しさん2010/05/24(月) 16:57:18
は?お前らアホじゃねーの?

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

stdio使うのは移植性だよ
0078デフォルトの名無しさん2010/05/24(月) 17:03:18
>>77
実測で差が有意だ と わかってるなら
0079デフォルトの名無しさん2010/05/24(月) 17:06:28
>>78
勿論有意だからこそ、本当にI/Oパフォーマンスが重要なところでは
誰もstdioなんぞ使わないんだよ

バッファリングしてるから速いって、アホか?
stdioバッファへの余分なコピーが「常に」発生するのがstdioだ
ポータブルなgetc()やらではマルチスレッド対応の排他制御までオマケつきだ
0080デフォルトの名無しさん2010/05/24(月) 17:09:33
つまり、「ふつー」のアプリではstdio使うのが当然と言うことですね。
ファイルI/Oなんかよりも遥かにのんびりしたヒューマンI/Oがあるんですから。
0081デフォルトの名無しさん2010/05/24(月) 17:10:27
それはそうと、
>それと、Windowsではファイル名が固定の場合以外にfopen()使ってるプログラムは
これの根拠を知りたい。
0082デフォルトの名無しさん2010/05/24(月) 17:18:22
>>80
Windowsではstdioは使っていいけどfopen()はダメ
>>81
ファイルシステムがUTF-16なのに、fopen()はUTF-16ファイル名を扱えないからだよ
0083デフォルトの名無しさん2010/05/24(月) 17:26:13
>>82
ってことは、ファイル名が固定でなくても制限できればいいんでないの?
つまり、「ユーザに任意のファイル名を扱わせたいのならfopen()はダメ」ってことじゃない?
0084デフォルトの名無しさん2010/05/24(月) 17:32:37
>>83
厳密に言えばそうなるかもしれんが、何かそこに重要な意味があるの?
0085デフォルトの名無しさん2010/05/24(月) 17:36:14
糞と断じるには根拠に乏しいかと。
「ユーザに任意のファイル名を選択させておいてfopen()を使っているプログラムは糞」なら兎も角。
最初からそう書いていれば、無用な反発も避けられるし>81が質問する必要もなかった。
0086デフォルトの名無しさん2010/05/24(月) 17:37:22
おまえら文字コードとかロケールとかどこで勉強してんの?
近所の大型書店走査しても参考書売ってねーんだけど
0087デフォルトの名無しさん2010/05/24(月) 17:44:12
>>85
面倒くさい奴だな…

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

後な、現実問題として、例えばユーザプロファイルディレクトリのような
ファイルシステム上重要なディレクトリも全てUTF-16で、
Windowsにおいて、それはプログラムが勝手に選べるものじゃないんだぞ?
Windowsでfopen()使ってるのは、Unix系のソフトウェアの手抜き移植か
オモチャだけだよ
0088デフォルトの名無しさん2010/05/24(月) 18:42:00
>>86
MSDNとかmanとかで勉強してみてはいかがか
0089デフォルトの名無しさん2010/05/24(月) 21:33:02
C++のクラスで
int hogehoge::createHash( char *p, int size )
{
//処理
}

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

見たいに、内部データのハッシュを返す関数と
オーバーロードして任意のハッシュを返す関数二つを公開してるんだが
これだとクラスが使われ方知ってない?とか言われた
こういう書き方って駄目?静的にすればいいのかな
0090デフォルトの名無しさん2010/05/24(月) 21:45:57
createHash(char*,size_t)はhogehogeの情報がいらないからメンバにしない
createHash(const hogehoge &)にする
staticかfriendにしなければ実装できなければそうするか、あるいはメンバcreateHash()にする

0091デフォルトの名無しさん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というものは書けない、
という事を知って詰まってしまいました。 何か別の手はあるのでしょうか?
0092デフォルトの名無しさん2010/05/25(火) 01:07:16
>>91 AA::instance() を static じゃなくて virtual にすればいいんじゃないの?
0093デフォルトの名無しさん2010/05/25(火) 01:51:03
>>92
AAのインスタンスが無い(もともとインスタンスを獲る為のメソッド)ので
virtualを呼ぶ為のオブジェクトがありません。
0094デフォルトの名無しさん2010/05/25(火) 01:52:17
>>93 だったら渡せよ。
0095デフォルトの名無しさん2010/05/25(火) 01:53:10
日本語で伝えられないならコードを書けばいいのに。
0096デフォルトの名無しさん2010/05/25(火) 02:34:37
B、Cのオブジェクト一つ一つがAのポインタを保持すればいいだけじゃないか
こう言うとメモリの事とかについて何か言い返してきそうだな
0097デフォルトの名無しさん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(); }

0098912010/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の質問でした.



0099デフォルトの名無しさん2010/05/25(火) 03:03:50
>>97 なんで CC::doA() に引数で渡さないの?
0100デフォルトの名無しさん2010/05/25(火) 03:05:47
>>98
じゃぁこれで。
template<class A> class CC { void doA() { A::doA(); } };
CC<AA> c;
CC<AAA> c;
0101912010/05/25(火) 03:22:52
>>99
CC::doA()が呼ばれる文脈でAAのインスタンスへの参照が無いからです.
ここで書いたmain()は省略した見本でして、実際の実行環境の制限事項を
反映してません。

>>100
出来ればCCは1つのライブラリで済まし、AAから派生したAAA1, AAA2, AAA3
に対して1つのバイナリで済ませたいなと思ってます。CCの機能はそれぞれの
AAA*に対して全く共通なので。
0102デフォルトの名無しさん2010/05/25(火) 03:40:31
>>97 できてるじゃん。
0103912010/05/25(火) 03:52:20
>>102
いや、出来てるんですけど、グローバルを使っていいのかな? もっとC++っぽい
やり方があるならば知りたいなと思いました。 
0104デフォルトの名無しさん2010/05/25(火) 03:57:07
>>103
既存のフレームワークとやらでメンバ変数経路は変更不能で、
呼ばれる文脈とやらも変更不能なんだろ?
そこに AA のインスタンスを渡す必要があるんだろ?

グローバル使う以外に何も見えてこないじゃないか。
0105912010/05/25(火) 04:00:40
>>104
ありがとうございます。 そうはっきり言って頂いてすっきりしました。
0106デフォルトの名無しさん2010/05/25(火) 08:21:14
C++で構造体を作ってクラスのprotectedのメンバに入れてクラスに他所のcppの関数中でその構造体にメンバが入るような関数を作った
のですが「.」を押してもメンバ変数がポップアップされません
これは上手く入ってないのでしょうか?
0107デフォルトの名無しさん2010/05/25(火) 09:42:04
>>90
有り難うございます。
内部のcreateHashはclass独自の物ですが、中々優秀で他でも流用したいが為に公開していました。
一々、hogehogeを作成しメンバ設定、その後にcreateHashでは面倒に思えるのですが。。
今はstaticを付けていますが、今後は別の方法を試すべきでしょうか?
0108デフォルトの名無しさん2010/05/25(火) 10:40:41
汎用ハッシャーを分離してモジュール化すればいいじゃない
0109デフォルトの名無しさん2010/05/25(火) 11:53:25
>>108
有り難うございます
皆さんだったら、どのように書きますか?
是非参考にさせて下さい。
0110デフォルトの名無しさん2010/05/25(火) 14:58:59
ウォッチしてる値がある値になった時にブレークさせるような方法はありますか?VC++2008EEです
0111デフォルトの名無しさん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
0112デフォルトの名無しさん2010/05/25(火) 15:34:41
>>111
ありがとうございました
0113デフォルトの名無しさん2010/05/25(火) 17:44:49
operator .* (obj, func)でobjをバインドしたfunctionを返せば
メンバ関数ポインタをエミュレートできるとおもったら.*はオーバーロードできねーのかよ
->*ならできるのにこの差別はひどい。がっかりだ
0114デフォルトの名無しさん2010/05/25(火) 17:45:58
日本語で喋れやカス
01151132010/05/25(火) 17:50:36
>>114
要約するとうるせーよ死ねカスってことです
0116デフォルトの名無しさん2010/05/25(火) 17:53:44
日本語も喋れない奴にプログラミングは無理
これ、豆知識なお坊ちゃん
0117デフォルトの名無しさん2010/05/25(火) 20:14:36
>>114
低脳は>>113は理解できない
>>113が何を言っているか解るか? なら日本語でお前がしゃべってくれ
0118デフォルトの名無しさん2010/05/25(火) 20:33:35
なんか必死な奴がいるな
0119デフォルトの名無しさん2010/05/25(火) 21:30:14
>>114
阿呆な奴は>>113の言ってることを理解できない
君は>>113が言ってることを理解できてるのかい?
理解できているなら君が日本語で話してくれ

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

ということじゃないの?
>>114は>>113を理解できていないのは明白なので、なぜ>>114に対してそういったのかは
俺にもわからん。
0121デフォルトの名無しさん2010/05/25(火) 22:19:54
そんなことよりMoreC++Idiomの日本語訳を早く埋めてくれ。英文読むのめんどくさい
0122デフォルトの名無しさん2010/05/25(火) 22:20:32
>>119-120
>>113を訳してくれ、低脳君
0123デフォルトの名無しさん2010/05/25(火) 22:44:18
>>122
自己紹介乙
0124デフォルトの名無しさん2010/05/25(火) 22:45:09
>>119-120
>>113の
>.*はオーバーロードできねーのかよ
出来ない理由を教えろ
0125デフォルトの名無しさん2010/05/25(火) 22:50:39
そういう仕様だから
0126デフォルトの名無しさん2010/05/25(火) 23:01:20
>>124
operator.をオーバーライド可能にするとメンバへのアクセス手段がなくなるから、とかじゃなかったっけ?
で、operator.*も同じ理由。
D&Eにそんなようなことが書いてあった気がする。
0127デフォルトの名無しさん2010/05/25(火) 23:05:43
. と ->
.* と ->*
こう見ると分かりやすいな
0128デフォルトの名無しさん2010/05/26(水) 06:34:03
ファイルの名前を取得したいのですがどうすれば良いですか?
0129デフォルトの名無しさん2010/05/26(水) 06:35:28
FindFirstFileですね。わかりました
0130デフォルトの名無しさん2010/05/26(水) 07:27:41
charの配列があるのですが改行で区切られてる間の文字列を取得したいのですが
getsかなと思って調べたら絶対に使うなとか書いてあるし、fgetsはファイルを扱う関数なのでどうすれば良いかわかりません
教えてください
0131デフォルトの名無しさん2010/05/26(水) 08:01:06
>>121
インポート依頼が処理されずに止まったままなんだ。
0132デフォルトの名無しさん2010/05/26(水) 09:04:24
>>130
fgets(...., stdin)
0133デフォルトの名無しさん2010/05/26(水) 09:11:35
>>132
ありがとうございます
fgetの一つ目の配列は取得した文字を入れる配列ですよね?
二つ目の引数のstdinは標準入力から取得すると見たように思うのですが、どうやって元の文字列の配列を選択するのでしょうか?
0134デフォルトの名無しさん2010/05/26(水) 09:35:37
>>133
日本語でOK。
文字列から文字列を分解したいのか、(gets()のように)標準入力から文字列を得たいのか、どっちなのかと。
後者ならchar buf[DesiredSize]; fgets(buf, sizeof(buf), stdin);とすればいいし、
前者ならsscanf()かsprintf()で切り張りすればいい。
0135デフォルトの名無しさん2010/05/26(水) 09:38:53
strtok(...,"\n")
ただし、元の配列の中身は破壊される
0136デフォルトの名無しさん2010/05/26(水) 09:42:50
>>134
>>135
ありがとうございます
strtokで\0を入れた後、それぞれを配列に入れる方法がわかりません
教えてください
0137デフォルトの名無しさん2010/05/26(水) 09:47:25
目的がよく判らんが、改行でばらす程度なら破壊型でスレッドセーフでない実装もあるstrtok()は要らん。
尤も、sscanf()をどうしても使いこなせないならstrtok()を使うことを止めはしないが。
0138デフォルトの名無しさん2010/05/26(水) 09:48:57
>>136
なんで自分がやりたいことの説明ができないの? 馬鹿なの? 日本人じゃないの?
0139デフォルトの名無しさん2010/05/26(水) 09:51:26
もしかしてsscanfで"%s \n %d \n",str1,str2とすれば良いだけですか?
0140デフォルトの名無しさん2010/05/26(水) 09:54:01
>>138
すません
やりたいことはchar 型の文字列があって\nがたくさんあって、ファイルで表示すれば1行ごとになるはずの文字列を取り出してそれぞれの行を違う配列に入れたいのです
0141デフォルトの名無しさん2010/05/26(水) 09:54:29
ダメだこいつ。
0142デフォルトの名無しさん2010/05/26(水) 09:56:14
できれば行が多くなった時に配列をたくさん作るのを避ける方法も教えて欲しいです
0143デフォルトの名無しさん2010/05/26(水) 10:19:02
めんどくせーから C++ で iostream と string で getline() 使えよ。
0144デフォルトの名無しさん2010/05/26(水) 10:43:00
まぁ、先ずは入出力をきちんと定義するところから始めようか。
入力は改行文字を多数含んだ文字列と言うことだが、それはいきなり渡されるということなのか?
要は、作ろうとしているのは関数なのかプログラムなのか、その辺りもはっきりさせてくれ。
0145デフォルトの名無しさん2010/05/26(水) 10:51:01
関数を作ってるのではありません。関数の中でグローバルの変数である配列に改行を含んだ文字列を入れまして
その配列から改行までの区間を何個か取り出して、違う配列に入れるなりして元の文字列のある行の文字の部分だけを新しい文字列として使いたいのです
0146デフォルトの名無しさん2010/05/26(水) 10:57:25
>>145
すでにでかい配列に読み込み済みなら gets() も fgets() も関係ないな。
そのままプログラム書けよ。

ひととおり書いて、 http://codepad.org/ に晒して、不満な箇所を具体的に
挙げるといいよ。
0147デフォルトの名無しさん2010/05/26(水) 11:00:42
>>146
なるほど、でかい配列を使いたくないのでfgetsなどでやるわけですね。
sscanfでできそうなので続けて見ます
0148デフォルトの名無しさん2010/05/26(水) 11:06:44
strchr()で改行文字を探して、一文字ずらして行頭のリストを作れば事が足りそうなんだが。
つーか、なんでグローバル変数なんかにテキスト入れるのかねぇ。
相変わらず説明下手だし。
0149デフォルトの名無しさん2010/05/26(水) 11:12:13
>>148
知識が無いので自分も何を伝えるべきなのかわからないのです
>strchr()で改行文字を探して、一文字ずらして行頭のリストを作れば事が足りそうなんだが。
>つーか、なんでグローバル変数なんかにテキスト入れるのかねぇ。
と当たり前のごとく言われても、どういう方法なのか、なぜグローバル変数にテキストを入れたらいけないか、普通はどうするのか、等、わからないのです。
0150デフォルトの名無しさん2010/05/26(水) 11:21:56
やりたいことをきちんと説明できないからこそ、
弄られることになるし
詳しく説明してもらえないし
見当違いのレスを読むことになるわけで。
心穏やかに他人になった積もりで>145を読んで、
それで何をしたいか判るかね。
0151デフォルトの名無しさん2010/05/26(水) 11:25:55
>>150
どこがわからないのですか?
自分は完璧に説明したつもりなのですが
そちらは知識が多すぎて混乱してしまうのかもしれませんが
0152デフォルトの名無しさん2010/05/26(水) 11:28:22
いいからプログラム書け。日本語はこの際あきらめろ。
0153デフォルトの名無しさん2010/05/26(水) 11:31:25
char str[]="fafafad\nfakfjak\nfakdfad\nfkajfk\nfjak"があって例えばnfakfjak\を取り出したいということなのですが
0154デフォルトの名無しさん2010/05/26(水) 11:33:35
「なのですが」?続きはどうした?
0155デフォルトの名無しさん2010/05/26(水) 11:37:42
これをchar str1[] = nfakfjak\;
の状態にしたいのです
0156デフォルトの名無しさん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');
:
:
}
}
0157デフォルトの名無しさん2010/05/26(水) 22:15:52
ウォッチを見ていると配列の後のほうまで意味不明の文字が入ってたりしますが
strcmpを使うとちゃんと一致したりします
あれはどうなっているのでしょうか?
0158デフォルトの名無しさん2010/05/26(水) 22:18:35
ナルまでを比較するので。
0159デフォルトの名無しさん2010/05/26(水) 22:21:51
ナルェ
0160デフォルトの名無しさん2010/05/26(水) 22:25:42
犠牲になったのだ
0161デフォルトの名無しさん2010/05/26(水) 23:13:46
マジキチ
defineの最後に;つけてたら一番最後の関数で)だの;}のエラーが出やがった
偶然気付かなきゃ一生やってるレベル
0162デフォルトの名無しさん2010/05/26(水) 23:21:49
一生やってろ
0163デフォルトの名無しさん2010/05/27(木) 00:05:19
>>157
デバッガの使い方はその開発環境のスレでどうぞ。つーか、Cの文字列の仕組みくらい勉強しましょう。
0164デフォルトの名無しさん2010/05/27(木) 11:34:42
LPCTRとかが良くわからないのですがキャストしたらエラーが取り合えず消えるので全部キャストでも問題ありませんか?
0165デフォルトの名無しさん2010/05/27(木) 11:49:37
LPCTRってなんだよ・・

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

これらを適当に組み合わせただけ
0166デフォルトの名無しさん2010/05/27(木) 13:48:26
わかりにくいからTSTRCLPにすればいいのに
0167デフォルトの名無しさん2010/05/27(木) 18:24:52
>>164
死ねばいいと思うよ
0168デフォルトの名無しさん2010/05/27(木) 20:09:14
>>164
問題尾大有りだ
0169デフォルトの名無しさん2010/05/27(木) 20:13:38
Windowsプログラムの場合は、適当にLPCSTRとか入れればいいよ
結構適当でも動く
0170デフォルトの名無しさん2010/05/27(木) 22:10:06
C++ができれば他の言語なんて楽勝とかいうけどVBAムズイじゃん。使っててすげー気持ち悪い

0171デフォルトの名無しさん2010/05/27(木) 22:11:20
変数のスコープを限定できない言語は難しい
0172デフォルトの名無しさん2010/05/27(木) 22:16:20
VBA使ってみて配列の下限が自由なのは一見便利そうに見えるけどコードが汚くなるだけだと気がついた
0173デフォルトの名無しさん2010/05/28(金) 09:15:30
FindFirstFileやfopen等、ファイル処理の勉強をしているのですが
ファイル名を変更するにはどうすれば良いのでしょうか?
ファイル名 変更 c++等とぐぐっても出てきません。方法を教えてください
0174デフォルトの名無しさん2010/05/28(金) 10:02:24
>>173
検索の仕方が間抜け過ぎだろ。
「ファイル名変更」「c」で検索して3番目によると、rename()を使えとある。
0175デフォルトの名無しさん2010/05/28(金) 10:46:14
循環参照を気にせず仕えるスマポってweak_ptrのようなカウンタを2重にもつ形式が一番手っ取り早いのでしょうか?
0176デフォルトの名無しさん2010/05/28(金) 13:39:53
コードのシンプルさではカウントがいいかな
newのオーバーヘッドを避けたいなら侵入型リストでもいい
0177デフォルトの名無しさん2010/05/28(金) 15:08:51
std::vector等を自分のソース内でVector等と置き換えて書きたいのですが
#define Vector std::vector
と書く以外でいい方法はありますか
0178デフォルトの名無しさん2010/05/28(金) 15:11:33
>>177
置き換えないのが一番いい
0179デフォルトの名無しさん2010/05/28(金) 15:11:55
継承したりメタ関数を使ったり
0180デフォルトの名無しさん2010/05/28(金) 15:25:03
>178
そのうち自作クラスと置き換えとか色々やってみたいので
差し替えが簡単なように書いておきたいのです

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

ありがとうございました
0181デフォルトの名無しさん2010/05/28(金) 16:09:35
>>177
using std::vector;
0182デフォルトの名無しさん2010/05/28(金) 16:57:29
クラスの所属するnamespaceじゃなくてstdにswapを追加するメリットってあるの?
using std::swapをしらなくてstd::swapにしちゃうカスが同僚にいても安心程度のメリットしかないように思えるんだけど…
0183デフォルトの名無しさん2010/05/28(金) 17:19:51
>>176
オーバーヘッドは気にならないからシンプルにいけるカウンタ方式がいいのだけど
weak_ptrと同様の実装をするとダングリングポインタの問題をどうにかしないといけないんですよねぇ・・・
0184デフォルトの名無しさん2010/05/28(金) 18:33:57
>>182
stdにswapを追加したことはないが、std::swapの特殊化を明示的に行うことは多々あるな
0185デフォルトの名無しさん2010/05/28(金) 20:31:12
>>182
boost::swapもあるよ
0186デフォルトの名無しさん2010/05/28(金) 20:33:23
繰り返し使うところは、stdつけたほうがいいな。他人も使うようなコードは。ライブラリ。
usingつかうと名前かぶる危険。
defineの置き換えもつかワン方が良い。
ただの置換のうえに、他のコードにも影響出る。

0187デフォルトの名無しさん2010/05/28(金) 21:16:32
>>182
ないだろうな
stdの中をいじるデメリットの方が大きいと思う
0188デフォルトの名無しさん2010/05/28(金) 21:39:50
特殊化するならメリットはある

テンプレートのライブラリで値を交換するとき
通常(?)はstd::swapを使うでしょ
特殊化されていれば効率とか、例外安全性があがる可能性がある
01891882010/05/28(金) 21:51:00
ごめん、質問ちゃんと読んでなかったわw
0190デフォルトの名無しさん2010/05/28(金) 21:58:26
>>188
通常はstd::swapを使うってのは無いな

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

オブジェクトの方がテンプレートでコードを書いてる時には分からない場合は
TMPでメンバのswapを検索してあればそれを明示的に使う
見つからなければusing std::swap;して修飾なしのswap
0191デフォルトの名無しさん2010/05/29(土) 00:10:33
メモリの確保量調べる方法はないですか。これはできないです。

char *A=new char [1000];
cout<<sizeof(A)<<endl;
0192デフォルトの名無しさん2010/05/29(土) 00:16:37
自己解決しました

_msize
ヒープに割り当てられたメモリ ブロックのサイズを返します。
0193デフォルトの名無しさん2010/05/29(土) 00:35:07
確保されているメモリ調べると[1000]でちょうど1000にはならないな。
わりといい加減に確保してくるな。
0194デフォルトの名無しさん2010/05/29(土) 01:08:53
>>190
そんな手間をかけなくて済む(かつ、バグの温床に)ならないようにstd::swapを特殊化するわけだが。。。
気にせずstd::swapでかけるようになるんだよ。
0195デフォルトの名無しさん2010/05/29(土) 01:15:38
>>194
関数テンプレートの部分特殊化ができれば全部それでもいいんだけどね
0196デフォルトの名無しさん2010/05/29(土) 01:32:51
>>191 std::vector 使え。
0197デフォルトの名無しさん2010/05/29(土) 03:18:09
>>195
浅はかな俺を許してくれ。
つまるところがんばって書き分けないとダメってことになるのかなorz
0198デフォルトの名無しさん2010/05/29(土) 07:44:15
>>190
std::swapを特殊化せずに、その検索をやってくれるのがusing boost::swap
0199デフォルトの名無しさん2010/05/29(土) 07:54:32
usingいらなくね?
boost::swap(lhs, rhs);
0200デフォルトの名無しさん2010/05/29(土) 08:10:55
それはなかでusingしてるし
0201デフォルトの名無しさん2010/05/29(土) 08:14:06
>>200
そこが便利なところ
0202デフォルトの名無しさん2010/05/29(土) 08:26:33
>>198
メンバは検索してくれないじゃん・・・
0203デフォルトの名無しさん2010/05/29(土) 19:03:04
>>202
普通メンバswapがあったらフリー関数swapも作るだろ常識的に考えて
0204デフォルトの名無しさん2010/05/30(日) 22:23:13
sin関数を使おうと#include <math.h>したのですが
デバッグでウォッチを見ると
「sin(0.0) CXX0017: エラーです: シンボル "sin" が見つかりません」
となってしまいます、動作自体はしっかりしているようなのですが
気になりますので教えてください
0205デフォルトの名無しさん2010/05/30(日) 22:24:06
たしかmathは何かのコンパイルオプションがいるはず
0206デフォルトの名無しさん2010/05/30(日) 22:26:09
-lmのことか
0207デフォルトの名無しさん2010/05/30(日) 22:55:12
>>205-206
ありがとうございます
恥ずかしながらコンパイルオプションの追加の仕方がわかりません...
プロパティ->リンカ->コマンドラインの追加のオプションで-lmとしてみたのですが検討外れのようです
visual C++ 2008 EEを使用しています、繰り返しお願いします
0208デフォルトの名無しさん2010/05/30(日) 22:58:57
ああ、デバッグのウォッチか
ウォッチに関数は使えないぞ
0209デフォルトの名無しさん2010/05/30(日) 23:04:27
>>208
なるほど、ありがとうございます!
0210デフォルトの名無しさん2010/05/30(日) 23:08:17
数学関数くらい使えるようになって欲しいとは思うんだけど
何で使えないのかねえ
0211デフォルトの名無しさん2010/05/30(日) 23:25:54
>>208
あれ? VC++ だといろんな式の評価ができたような?
そこに fopen() とか突っ込んで嵌ってたこともあったり。

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

静的リンクする場合は最終的にリンクされてる関数しか呼べないらしい
それでもsinはCXX0047だったけど
abort()とか{,,MSVCR100D.dll}abort()したら死んだ
printfも出来たよ
0213デフォルトの名無しさん2010/05/31(月) 15:16:05
公開されているライブラリは

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

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

自分はいつもスタティックリンクライブラリにしているので気になりました
0214デフォルトの名無しさん2010/05/31(月) 16:50:32
関連アプリを全部ビルドしなおすのがめんどいから。
あと関連アプリが全部ちょっとずつ大きくなるから。
0215デフォルトの名無しさん2010/05/31(月) 17:10:02
dllで公開する関数って引数にintとか使ったらintの長さが違うコンパイラだとまちがいが起こるかもってことだよな?
0216デフォルトの名無しさん2010/05/31(月) 17:21:13
コンストラクタで引数を取って
その引数と同一の値で生成されたインスタンスが既に存在する場合にはその参照を返すような
引数の値に対してインスタンスの数が必ず一つであるような仕組みをどう構築したらよいでしょうか?
0217デフォルトの名無しさん2010/05/31(月) 17:25:48
>>216
flyweight+handlebody
0218デフォルトの名無しさん2010/06/01(火) 10:29:53
ハンガリアンなんて今更、とおもいつつも
ポインタとメンバ変数と大域変数だけは気になってプリフィックス付けてしまうのだが
逆に中途半端で気持ち悪い気もする・・・

今後はプリフィックスをつかわなくても解りやすい命名に変えて言った方が良いのでしょうか?
0219デフォルトの名無しさん2010/06/01(火) 12:22:23
>>218
メンバ変数と大域変数は型の間違いと違って
コンパイラでの検出がされにくい場合があるのでつけるのもありという論がある

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

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

0220デフォルトの名無しさん2010/06/01(火) 19:34:47
VisualStudio2005を利用しています
C#でいう#regionを代用できるものはC++にありますか?
0221デフォルトの名無しさん2010/06/01(火) 19:47:26
>>220
http://msdn.microsoft.com/en-us/library/b6xkz944(VS.80).aspx
0222デフォルトの名無しさん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関数などを使わずうまくこなす方法はないでしょうか?
0223デフォルトの名無しさん2010/06/02(水) 01:22:43
>>222 何が「ダメ」なの?
0224デフォルトの名無しさん2010/06/02(水) 01:35:41
>>223
これをやろうとするとprivateメンバへのアクセスが出来ないとエラーをはきます
当たり前といえば当たり前なんですがうまく回避することは出来ないでしょうか・・・

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

質問するときはエラーが発生するコードとエラーメッセージを忘れるな。
0226デフォルトの名無しさん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> &)' : 関数テンプレートは既に定義されています
となってしまいました、どこで間違えたのでしょう・・・?
0227デフォルトの名無しさん2010/06/02(水) 02:07:25
>>226
friend はメンバ関数も指定できる。
0228デフォルトの名無しさん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;
};
0229デフォルトの名無しさん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は使えないのでしょうか・・・?
0230デフォルトの名無しさん2010/06/03(木) 22:57:38
>>229
すいません、自己解決しました

if (hoge1.end() != hoge2.find(a))
こんな感じのことになっていました・・
0231デフォルトの名無しさん2010/06/06(日) 11:37:36
http://www.dotup.org/uploda/www.dotup.org943706.jpg
画像のようなx,yを渡したら
角度θが帰ってくるような関数ってありますか
0232デフォルトの名無しさん2010/06/06(日) 11:39:38
tan2
多分
0233デフォルトの名無しさん2010/06/06(日) 11:44:56
>>231
あーたん
0234デフォルトの名無しさん2010/06/06(日) 11:46:14
>>232,233
atan2()ですね
ありがとうございました
0235デフォルトの名無しさん2010/06/06(日) 11:47:47
そうそう
0236デフォルトの名無しさん2010/06/06(日) 12:28:22
りゅうび
0237デフォルトの名無しさん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によらない)で積分するような場合です。

0238デフォルトの名無しさん2010/06/06(日) 13:18:30
hってどこから出てきたんだ?
0239デフォルトの名無しさん2010/06/06(日) 13:20:49
>>237
二重積分・多重積分の話ですか?
0240デフォルトの名無しさん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 も単なる係数なんだし

あと、ループが非常にあぶなっかしい
ループ変数は整数の変数にすること
数値誤差で端が入らない事がある
0241デフォルトの名無しさん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
>ループ変数は整数の変数にすること
>数値誤差で端が入らない事がある
そうなんですか、気をつけます
0242デフォルトの名無しさん2010/06/06(日) 14:25:20
>>239
そのfを使うのは無理やね
>>240にある通り、係数を分離して各項で係数以外の部分を積分するしかない
0243デフォルトの名無しさん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しないとメモリリークが発生するのでしょうか?
0244デフォルトの名無しさん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.
--
とあるね。
02452432010/06/07(月) 13:00:06
>244
返信ありがとうございます。
おかげですっきりしました。次はリファレンス読んでから質問することにします。
0246デフォルトの名無しさん2010/06/08(火) 13:12:22
スコープガード的な用途に使いたいんですが、生ポの所有権を無理やり奪えるタイプのスマポって標準かboostに在りますか?
0247デフォルトの名無しさん2010/06/08(火) 13:28:04
>>246 std::auto_ptr
0248デフォルトの名無しさん2010/06/09(水) 08:58:43
>>247
あ、説明足りませんでしたね
sumapo<int> s(new int);
int *p = std::move(s); // sの中の生ポがpに移動、sの中身はnullptrになる

こういう事がしたいんです
0249デフォルトの名無しさん2010/06/09(水) 09:14:49
>>248
std::auto_ptr<int> s(new int);
int *p = s.release(); // sの中の生ポがpに移動、sの中身はnullptrになる
0250デフォルトの名無しさん2010/06/09(水) 14:39:58
デストラクタ呼ばれるんじゃ?
0251デフォルトの名無しさん2010/06/09(水) 14:46:09
release()は所有権を放棄するだけでデストラクタは呼ばれない。
0252デフォルトの名無しさん2010/06/09(水) 15:06:55
まじかよ
めちゃくちゃ便利じゃねえか
0253デフォルトの名無しさん2010/06/09(水) 16:01:15
>>249
サンクスです。auto_ptrってめったに使わないからreleaseメソッドの存在に気づきませんでした
0254デフォルトの名無しさん2010/06/09(水) 22:46:41
>>252
さあ洗濯バサミとunique_ptrの有能さに気づくんだ
0255デフォルトの名無しさん2010/06/09(水) 22:49:11
unique_ptrは削除子が静的だから物足りない
0256デフォルトの名無しさん2010/06/10(木) 01:08:07
>>255 std::unique_ptr<T, std::function<void (T*)>> で動的にもできるんじゃね?
0257デフォルトの名無しさん2010/06/10(木) 02:11:29
なるほど
これはそう使うのか
0258デフォルトの名無しさん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; }
0259デフォルトの名無しさん2010/06/10(木) 23:08:38
fack
0260デフォルトの名無しさん2010/06/11(金) 06:35:57
>>258
まずいよ。
でもそれは boost::shared_ptr の動的削除子を使うときでも同じことでしょ。
0261デフォルトの名無しさん2010/06/11(金) 06:59:54
>>256
これってもしかしてshare_ptrに続くCRT境界越えてもおkなスマポじゃね?
http://codepad.org/Qix7z8cq
0262デフォルトの名無しさん2010/06/11(金) 12:20:26
shared_ptrはデリータのクローンに失敗してもちゃんと後始末してくれるよ
0263デフォルトの名無しさん2010/06/11(金) 12:33:45
>>261
それだとunique_ptr自体もエクスポートしないといけないんじゃないか。
0264デフォルトの名無しさん2010/06/11(金) 12:38:12
>>262
コンストラクタに入った後ならね。
ここで問題にされてるのはその前の、引数列の評価中〜実引数初期化中に発生する例外でしょ。
http://www.boost.org/libs/smart_ptr/shared_ptr.htm#BestPractices
0265デフォルトの名無しさん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)
0266デフォルトの名無しさん2010/06/11(金) 14:23:16
ほとんど関数かキャプチャなしのラムダでしょ
アロケータ内蔵するにしても大抵の場合staticか共有ポインタで所持する
機能的には有用だけどコピーで例外から逃れられないデリーターなんて存在するのか?
0267デフォルトの名無しさん2010/06/11(金) 16:12:03
C++のコピーコントラクタってfooクラスに、
foo(const foo&);

って宣言しておけば、

foo b;
b = a;

ってすればfooクラスに定義されているポインタオブジェクトもディープコピーされるの?
0268デフォルトの名無しさん2010/06/11(金) 16:14:45
いいえ
0269デフォルトの名無しさん2010/06/11(金) 16:53:55
>>266
メモリじゃないリソースを突っ込みたくなったときはcloseに失敗することもあるかもしれない
0270デフォルトの名無しさん2010/06/11(金) 16:54:16
>>268
ダメなんですか。ありがとうございました。
もっと調べてみます。
0271デフォルトの名無しさん2010/06/11(金) 16:55:57
あ、そういうことじゃなかった。
デリータのコピーに失敗することがあるかどうかだもんな
はずかちい
0272デフォルトの名無しさん2010/06/11(金) 19:15:28
DLLで関数を通じてPODの遣り取りをするとするじゃん
PODのアライメントとかを揃えるためにpragma pushをしろと言われたんだけど
pragmaって移植性ないじゃないですか
なのでpragma無しでPODの移植性を確保したいんですけどどうすればいいですかね?
0273デフォルトの名無しさん2010/06/11(金) 19:17:35
そのDLLはWindows以外でも動作するのかね?
0274デフォルトの名無しさん2010/06/11(金) 20:45:30
本当にpragma pushが要るのかね?
0275デフォルトの名無しさん2010/06/11(金) 22:40:07
スマポの削除子ってテンプレート関数ボインタでよくね?
って思ったんだけとクラスにしてるのは
何か理由あるの?インラインさせりため?
0276デフォルトの名無しさん2010/06/11(金) 22:42:10
DLL から OS Windows を想定すっけど
pragma pack で他環境(VB etc.)にも対応可能なアライメントで固定化汁という意図か?
0277デフォルトの名無しさん2010/06/11(金) 22:59:00
>>263
関数だけで大丈夫くさい
変数に入ってるアドレスをcallしてる
0278デフォルトの名無しさん2010/06/12(土) 09:53:19
>>275
デリーターが関数オブジェクトかもしれないから
0279デフォルトの名無しさん2010/06/12(土) 18:47:25
友達の代理で質問するんでよく分からんのですが

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

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

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

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

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

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

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

コンパイルは端末でgccを使ったそうです
02802792010/06/12(土) 18:49:37
すんません

リンク間違えました

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

http://www1.axfc.net/uploader/Sc/so/123050
0281デフォルトの名無しさん2010/06/12(土) 18:55:00
\nを入れて味噌
0282デフォルトの名無しさん2010/06/12(土) 19:10:51
画像で出てくると思わなかったよ
0283デフォルトの名無しさん2010/06/12(土) 20:15:26
>>281
伝えときました

>>282

友達に画像で渡されたので……
0284デフォルトの名無しさん2010/06/12(土) 20:20:24
今度はテキストで貰ってきてくれ、なの
0285デフォルトの名無しさん2010/06/12(土) 20:37:04
>>284

すんません。。。
0286デフォルトの名無しさん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")
とすると、引数に何を入力しても該当してしまいます。

どうすればいいでしょうか
0287デフォルトの名無しさん2010/06/12(土) 21:24:09
書き間違えました、
if(argv[1] != "A")
です
0288デフォルトの名無しさん2010/06/12(土) 21:26:46
>>287
それは文字列へのポインタの比較なんで文字列の中身の比較ではない。
文字列の中身の比較はstrcmpを使う
0289デフォルトの名無しさん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]))
0290デフォルトの名無しさん2010/06/12(土) 21:35:39
C++ならこうか
std::string a(argv[1]);
if((a!="A")&&(a!="B")&&(a!="C")&&(a!="D"))
{
}
0291デフォルトの名無しさん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')
02922862010/06/12(土) 22:05:20
皆さんありがとうございます。
"A"がポインタであること、'A'と"A"が違うということが分かっていませんでした。
0293デフォルトの名無しさん2010/06/12(土) 22:27:36
結局分かってないし何度もすみません・・
>>291で書くと、引数をAで実行しても該当するようです。どうしてでしょうか
0294デフォルトの名無しさん2010/06/12(土) 22:32:09
\0のところがいらないんじゃ…
間違ってたらスマソ
0295デフォルトの名無しさん2010/06/12(土) 23:04:03
なんだかんだ言ってエバーはやっぱ面白いなぁ
02962862010/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を使っています。
0297デフォルトの名無しさん2010/06/13(日) 01:03:52
今は高校で論理学ってやらないんだっけ?
0298デフォルトの名無しさん2010/06/13(日) 01:04:38
条件をよく見ろ
'A'以外 ま た は 'B'以外
だから何入力してもtrueに決まってる
0299デフォルトの名無しさん2010/06/13(日) 01:08:30
ぐはっ
ありがとうございます。失礼致しました;;
0300デフォルトの名無しさん2010/06/13(日) 21:38:09
DLLを作るのも使うのも全部WINDOWS→リトルエンディアン
って認識でいいの?
0301デフォルトの名無しさん2010/06/13(日) 22:26:26
>>300
今はintelだけなんでそうなる。
0302デフォルトの名無しさん2010/06/13(日) 23:42:46
>>301
AMDとVIAは星になったのかw
0303デフォルトの名無しさん2010/06/14(月) 06:50:37
>>302
俺もintelだけ、といわれるとなんか変な言い方だなぁとは思うけれど。
互換性があるという言い回しにした方がお気に召しますか?
0304デフォルトの名無しさん2010/06/14(月) 08:53:13
IA-32と言えば何も問題は無かったのに
0305デフォルトの名無しさん2010/06/14(月) 09:20:40
要するにDLL作るときにエンディアンも気にしないといけないんですか
0306デフォルトの名無しさん2010/06/14(月) 11:11:43
大丈夫、エンディアン以前にプラットフォームが違っていれば動かない。
0307デフォルトの名無しさん2010/06/14(月) 17:59:17
>>306
お前は何を問題としているかわかってない
0308デフォルトの名無しさん2010/06/14(月) 18:08:05
Windows上でエンディアンを気にしなきゃいけない状況って
・ネットワークを使う
・クロスプラットフォームを考慮(cygwin等)
・他ハードをエミュレーションする

くらいしか思いつかんが。
0309デフォルトの名無しさん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]?
....
で、なんでそうなるの?
0310デフォルトの名無しさん2010/06/15(火) 23:51:22
不思議なことにどれをやっても同じなんだよ
そういうふうにメモリ配置されてるから
0311デフォルトの名無しさん2010/06/15(火) 23:55:08
>>309
型はこれと一緒
&mulary[0]
0312デフォルトの名無しさん2010/06/16(水) 01:13:23
>>309
多次元でも関係ない。
array が &array[0] と同じように、 mulary は &mulary[0] と同じ。
0313デフォルトの名無しさん2010/06/17(木) 01:06:13
>>311-312
どもども。
何で配列名が&array[0] 、 &mulary[0]になるように決めたんですか?
0314デフォルトの名無しさん2010/06/17(木) 01:11:15
>>313
>>309 がそう決めたから
0315デフォルトの名無しさん2010/06/17(木) 04:28:55
>>313
便利だから
0316デフォルトの名無しさん2010/06/17(木) 06:32:10
>>313
printf(&"Hello World"[0]);
とか書きたいか?
0317デフォルトの名無しさん2010/06/17(木) 07:17:35
>>316
地味にヤだな、それw
0318デフォルトの名無しさん2010/06/18(金) 16:11:35
>>313
決めたっていうかその表現にある通り、単に配列要素の先頭のアドレス拾ってるから
同じになるってだけじゃね。意味わかれば別に悩む所じゃないぜ
0319デフォルトの名無しさん2010/06/18(金) 18:52:55
&*(array+0) と &array[0] が同じということを知れば
arrayが特殊でないことが分かるはず
0320デフォルトの名無しさん2010/06/21(月) 22:33:23
「クラス名::」で呼び出せるものは静的なもの、
「クラス名.」で呼び出せるものは動的なもの

ってことで、おk?
0321デフォルトの名無しさん2010/06/21(月) 22:59:52

クラス名::hoge
インスタンス.hoge
0322デフォルトの名無しさん2010/06/21(月) 23:11:31
class A
{
public:
 void func1() {}
 void func2() { A::func1(); }
 static void static_func() {}
};

A a;
a.static_func();
0323デフォルトの名無しさん2010/06/23(水) 02:18:51
ある変数(10桁)の
1の位:
10の位:
100の位:
1000の位:
  ・
  ・
  ・
ってな感じで出力する簡単な計算式教えてください
おねがいします
0324デフォルトの名無しさん2010/06/23(水) 02:29:24
10で割ったあまりを出力して、
変数を10で割ったものを変数に代入する

というのを繰り返す
0325デフォルトの名無しさん2010/06/23(水) 02:36:38
>>324
ありがとうございます
0326デフォルトの名無しさん2010/06/23(水) 23:04:41
排他処理ってどんなふうにやればいいんですか
0327デフォルトの名無しさん2010/06/23(水) 23:14:36
環境も書かずに排他処理とな?!(AAry
0328デフォルトの名無しさん2010/06/23(水) 23:14:50
セマフォ、ミューテックス、クリティカルセクションでぐぐれば解る
0329デフォルトの名無しさん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();
0330329,3262010/06/23(水) 23:41:06
途中で送信してしまいました
ググったら>>329のようなものが出てきたんですけど
これでいいんですか?
03313302010/06/23(水) 23:43:36
環境はWin7 VC++です
0332デフォルトの名無しさん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です。
0333デフォルトの名無しさん2010/06/24(木) 07:38:41
Windows APIの構造体のやつならSetRect関数
0334デフォルトの名無しさん2010/06/24(木) 14:03:02
配列の要素数を標準入力cinで入力することは出来ないでしょうか?

int num;
cin >> num;

int test[num];

「定数式が必要です」と出て失敗します
何故だ…
0335デフォルトの名無しさん2010/06/24(木) 14:10:43
>>334
配列の要素数に変数を使うことはできない
定数じゃないと
そういうときはnew使うとかvector使うとかしないと
0336デフォルトの名無しさん2010/06/24(木) 15:25:40
定数式が必要です、って言われて何故だとかメッセージを読む能力なさすぎだろ
0337デフォルトの名無しさん2010/06/24(木) 16:05:14
初心者歓迎って書いてるから、ま、あまり目くじら立てるなよ。
きっと、変数と定数の区別がまだつかないんだよ。
0338デフォルトの名無しさん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);
  ・・・・・・
}
0339デフォルトの名無しさん2010/06/24(木) 18:19:48
>>338の続きです

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

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

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

初心者なので凄くおかしなことを言っていたり、
説明不足で、これだけの文では分からないかもしれませんが、なにとぞご回答頂きたく存じます。
0340デフォルトの名無しさん2010/06/24(木) 18:28:20
>>338-339
それじゃコンパイル通らないだろ
コピペしろコピペ
ttp://codepad.org/
ついでにcsvもどっかにうpしろ
0341デフォルトの名無しさん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
0342デフォルトの名無しさん2010/06/24(木) 20:24:31
>>333
その名もズバリな関数があったんですね。調べ方が未熟でした。
無事綺麗なコードが書けました。
レスありがとうございました。
0343デフォルトの名無しさん2010/06/24(木) 22:54:33
>>341
csv読み込ませるとnum周りのスタックが破綻したって出たな
配列の大きさを大きくしたらとりあえずエラーは出なくなったけど…
ttp://codepad.org/dNFSlvxj
これはGUIで作った方が分かりやすい気がする
ちょっと文字数オーバーしたら落ちるし
C++あたり勉強してstd::stringとか使った方がいいんじゃないか
0344デフォルトの名無しさん2010/06/24(木) 23:50:44
c++の命名規則の例が詳しいサイトとかないでしょうか?
0345デフォルトの名無しさん2010/06/25(金) 00:00:40
>>343
細かく見ていただき大変ありがとうございます!!
色々と自分のプログラムの汚いところがスッキリしてて驚きがあって感動してます。

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

対処法も教えていただけましたし、色々手も加えていただいたので、winにあるものとしっかり見比べて、理屈の理解をしていこうと思います。
C++も勉強してみたいと思います!!
ありがとうございました!!!
0346デフォルトの名無しさん2010/06/25(金) 08:40:17
組み込みCでタスクの単体試験がしたい。
内部で状態が変わるようなタスクのテスト項目が思い付かない。
0347デフォルトの名無しさん2010/06/25(金) 08:44:13
単体試験は単体でするもの、組み込んでするのは別の試験。
内部で状態が変わっても影響ないならNOPにしとけ〜。
0348デフォルトの名無しさん2010/06/25(金) 10:32:33
別にcodepadに貼らなくても自分の所でgcc + MinGW4.5.0でコンパイル
すればいいやん

あ、ソースを晒すためか
0349デフォルトの名無しさん2010/06/25(金) 15:14:19
すいません int** aはどういうことでしょうか?
int* aならポインタ宣言と分かるのですけれど**が2個付くのは意味があるのでしょうか?
0350デフォルトの名無しさん2010/06/25(金) 15:29:18
ポインタのポインタってことだ
COMとかでインターフェースのポインタをもらうときとかに使うな
0351デフォルトの名無しさん2010/06/25(金) 15:29:48
>>349
ポインタのポインタ
int a;
int* b = &a;
int** c = &b;
といった感じでポインタ変数をさらに指し示せる。
関数から(戻り値以外の方法で)ポインタ値を返す時に使われるな。
0352デフォルトの名無しさん2010/06/25(金) 15:36:04
>>349>>350
慣れてないとややこしそうですな 精進します
ありがとうございました!
0353デフォルトの名無しさん2010/06/26(土) 19:42:40
引数なしローカル変数なしの再帰関数を作ったとしたら、これはどこまで再帰してもスタックオーバーフローを起こさないって考えていい?
0354デフォルトの名無しさん2010/06/26(土) 19:50:52
末尾再帰が最適化されたらそうなるだろう。
が、もし最適化されなかったらリターンアドレスを積みまくって死ぬから、
オーバーフローは起こると考えたほうが安全。
0355デフォルトの名無しさん2010/06/26(土) 19:51:31
>>353
戻ってくる場所をスタックに積むからいつかスタックオーバーフローを起こす
0356デフォルトの名無しさん2010/06/27(日) 00:07:01
サンクスです
おとなしくループ回すでござる・・・
0357デフォルトの名無しさん2010/06/27(日) 04:14:38
質問させてください。

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

ただこれではクラスを継承するたびにサブクラス側でもCreateと同等のメソッドを用意しなければならなくなってしまいました。
これが結構面倒に感じています。
何かスマートな実装方法はないでしょうか?
0358デフォルトの名無しさん2010/06/27(日) 05:02:19
>>357
CRTPパターン使うとか?
ttp://codepad.org/xnLk4KaL

まあ、ふつうはFactoryパターンでやるけど。
03593572010/06/27(日) 05:42:25
>>358
ありがとうございます。
リンク先のものが使えそうです。

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

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

0361デフォルトの名無しさん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」と置き換えようとしたのですが
エラーが発生しました。
0362デフォルトの名無しさん2010/06/27(日) 20:17:21
>>361
hoge[100]と宣言した配列で使えるのはhoge[0]からhoge[99]まで。
っていうのはともかく、代入したいのは文字列だから、strcpy()を使わないと
strcpy(okini[a - 1][0], "x");
0363デフォルトの名無しさん2010/06/27(日) 20:29:56
>>362
ありがとうございます。

大変申し訳ないのですが、strcpy()はまだ習っていません。
他に何か方法はありませんか・・・?
0364デフォルトの名無しさん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'; とか
0365デフォルトの名無しさん2010/06/27(日) 20:52:48
>>364
どうもありがとうございました。
そちらに行ってみます!
0366デフォルトの名無しさん2010/06/28(月) 22:48:49
「この文章の中に
1は□個、2は□個・・・9は□個ある」
というのをcで解こうと思ったのですが、なかなかうまくいきません
助言お願いします

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10759.txt
0367デフォルトの名無しさん2010/06/28(月) 23:15:51
恐ろしい物を見た気がする
何がやりたいのかはっきり言って分からない
0368デフォルトの名無しさん2010/06/28(月) 23:20:39
なんだこのインデントの数は
これはC以外の何かだ
0369デフォルトの名無しさん2010/06/28(月) 23:28:30
何なんだこれは
IOCCCにでも出すつもりか
0370デフォルトの名無しさん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 が未定義な環境だとはわかりましたが、
どう回避していいかわかりません。排他制御するにはどうしたらいいか教えてください。
0371デフォルトの名無しさん2010/06/28(月) 23:32:56
この文章の中にと書いてるが
何も文章を入力してないんだよな
これはなかなか歯ごたえがあるぜ
0372デフォルトの名無しさん2010/06/28(月) 23:35:00
>>370
環境書け環境
03733702010/06/28(月) 23:51:22
すいません、環境はFreeBSD 6.0です。
0374デフォルトの名無しさん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だけを取り出したいのですがどうしたら良いでしょうか?
助言お願いします
0375デフォルトの名無しさん2010/06/29(火) 00:56:03
Personクラスの定義ぐらい書けや
0376デフォルトの名無しさん2010/06/29(火) 01:08:09
すみません
http://upsurusuru.hp.infoseek.co.jp/cgi-bin/src/up5424.txt
0377デフォルトの名無しさん2010/06/29(火) 01:47:26
>>374
簡単に言うとprivate変数のdをいじくれないからメンバ関数serdata()から
dを引き出したいって事?

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

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

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

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

friendってそういう風に使うんだぜ
0379デフォルトの名無しさん2010/06/29(火) 02:03:51
>>378
それをやってみます。
回答ありがとうございます。
0380デフォルトの名無しさん2010/06/29(火) 06:43:47
うん
0381デフォルトの名無しさん2010/06/29(火) 08:59:10
friendよりstaticメンバー関数にしたほうがきもちいいと思うんだがどうか
0382デフォルトの名無しさん2010/06/29(火) 11:43:46
>>381
それだとthisが渡されないから個々のインスタンスのdをいじれないぞ
0383デフォルトの名無しさん2010/06/29(火) 12:12:36
txt[]で渡してるじゃん
0384デフォルトの名無しさん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で出力結果がソートされていないのも何故か分かりません。
ご教示ください。
0385デフォルトの名無しさん2010/06/29(火) 12:46:36
>>383
ああそういう事か
それならいいかもね

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

それより肝心のソースコードは?
03863842010/06/29(火) 13:13:36
>385
コードは>384の1行目です。
STLFiltはちょっと調べてみます。
0387デフォルトの名無しさん2010/06/29(火) 13:19:28
>>386
取り敢えず気が付いた事を一つだけ
ポインタをソートしてるよ
実体をソートしたいなら比較叙述関数を作るか関数オブジェクトにして与えないと
0388デフォルトの名無しさん2010/06/29(火) 13:21:42
>>384
ポインタの順序付けは実体の順序付けと関係ない。
実体の順序付けを使うように比較関数を作って渡せ。

あとは gcc じゃなくて g++ 使ってみな。
0389デフォルトの名無しさん2010/06/29(火) 13:24:54
取り敢えず応急処置だけどソートは出来てるっしょ

http://codepad.org/6do3erz8
0390デフォルトの名無しさん2010/06/29(火) 13:30:08
こういう時はBoost::lambdaとかC++0xのラムダ式がとても役に立つよな
03913842010/06/29(火) 13:43:54
確かにgccを使っていました。g++にしたらコンパイルできるようになりました。
http://codepad.org/mOjod85K
のコードでうまくソートできました。

ありがとうございました。
03923842010/06/29(火) 13:45:50
>389
>391のレスをしてから気付きました。
どうもありがとうございます。
0393デフォルトの名無しさん2010/06/29(火) 14:15:48
delete しとけよ。
0394デフォルトの名無しさん2010/06/29(火) 14:32:10
参照はがしできるなら剥がしてからファンクタに渡すラッパー作っとくと便利
0395デフォルトの名無しさん2010/06/30(水) 15:12:13
コマンドプロンプトで
関数に0個の引数を指定できません
fatal error U1077 : C:\Program Files\Microsoft Visual Studio 8\VC\BIN\cI..EXE : リターンコード0x2
と表示されたのですがどーゆーことでしょう?
もしスレ違いだったら申し訳ありません
0396デフォルトの名無しさん2010/06/30(水) 15:22:17
コマンドプロンプトでなにしたんですか
0397デフォルトの名無しさん2010/07/01(木) 10:02:20
環境非依存で整数型のビット長を調べるメタ関数は有りますか?
0398デフォルトの名無しさん2010/07/01(木) 10:14:45
sizeof(IntType) * CHAR_BIT
メタ関数は上式で自作しなさい。
0399デフォルトの名無しさん2010/07/01(木) 10:54:59
質問させてください。
c++プログラムの中で、既に存在する.exeファイルを実行して、
標準出力へ返ってくるはずの返り値をC++ソースの中で変数に格納したいのですが、
どのような書き方をすればよいでしょうか??

教えていただけると幸いです。
0400デフォルトの名無しさん2010/07/01(木) 11:02:20
>>399
環境に拠るが、popen()ではどうだろう。
0401デフォルトの名無しさん2010/07/01(木) 18:36:42
>>398
それが表現ビット長と一致するとは限らないんだぜ
std::numeric_limits<IntType>::digits + std::numeric_limits<IntType>::is_signed
が正しい
0402デフォルトの名無しさん2010/07/01(木) 19:17:11
整数型の実ビット長が表現ビット長と一致しない環境ってある?
そりゃ非PODだったら違ってくるだろうけど。
規格ではどうなってるんだろう。
0403デフォルトの名無しさん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
0404デフォルトの名無しさん2010/07/01(木) 22:53:36
>>403
ttp://www.geocities.jp/ky_webid/c/032.html
0405デフォルトの名無しさん2010/07/01(木) 23:26:50
>>404 どうもです。
14行目を } static Sub; とすることでリンカ通りました。(これでよいのかも今一分かりませんが…
0406デフォルトの名無しさん2010/07/01(木) 23:34:05
staticじゃSubの実体がいくつもできちまうじゃねえか。
だからグローバル変数はヘッダではextern宣言して
どれかcpp一つで実体を定義しろっつーの。
0407デフォルトの名無しさん2010/07/02(金) 07:10:29
>>398,402
sizeof(型名) * CHAR_BIT != 有効ビット幅
http://portable-c.jugem.jp/?eid=18
0408デフォルトの名無しさん2010/07/02(金) 18:25:01
>>407
>Intelのi686をターゲットとするGCCでは、long double型の有効ビット幅が80ビット
FPU に80bitで数値を渡す(スタックに積む)命令はあるのだろうか?
0409デフォルトの名無しさん2010/07/02(金) 21:44:35
tbyte ptrで行けない?
0410デフォルトの名無しさん2010/07/03(土) 13:02:24
AT&A記法ならfstpl
04114102010/07/03(土) 14:00:45
方向逆の上lじゃなくてtだった
fldt
0412デフォルトの名無しさん2010/07/03(土) 15:00:00
templateはコンパイル時に型が代わるってことでおk?
0413デフォルトの名無しさん2010/07/03(土) 16:40:54
型が変わるというか、"型ごと"(←重要)に生成される
バイナリが肥大化するから気をつけて
0414デフォルトの名無しさん2010/07/03(土) 16:47:44
さんくすっす
わかったっす
04154122010/07/03(土) 16:48:13
>>413
thx
0416デフォルトの名無しさん2010/07/03(土) 19:50:45
いえいえ
0417デフォルトの名無しさん2010/07/03(土) 23:22:12
ふと疑問に思ったので教えてください。
例えば、x=7,y=5,z=9のとき、
a=__min(__min(x,y),z);
と書いても実行可能で、aに5が代入されますか?
0418デフォルトの名無しさん2010/07/03(土) 23:24:09
>>417
__min の動作が分からない
0419デフォルトの名無しさん2010/07/03(土) 23:25:32
実際に試せない環境にでもいるのだろうか
0420デフォルトの名無しさん2010/07/03(土) 23:29:22
>>419
yes
0421デフォルトの名無しさん2010/07/03(土) 23:38:45
標準マクロのminでええやんと思う
代入されるかどうか、という話はyes
(__minがちゃんと定義されているならだが)
0422デフォルトの名無しさん2010/07/04(日) 00:07:15
>標準マクロのmin
えっ・・・?
0423デフォルトの名無しさん2010/07/04(日) 00:12:57
>>421
ありがとうございました。
超初心者ゆえに個人的な制約が色々あるわけです。
0424デフォルトの名無しさん2010/07/04(日) 01:52:36
windows.hやkernel.hに含まれてるmin/maxマクロはC/C++標準ではありませんよ…
0425デフォルトの名無しさん2010/07/04(日) 02:12:36
stdの方はマクロじゃないよな
0426デフォルトの名無しさん2010/07/04(日) 10:08:13
PNGといえばlibpngのように、
Bitmapの読み書きをするクロスプラットフォームな
デファクトスタンダード的なライブラリがあれば教えてください。
0427デフォルトの名無しさん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のアドレスを渡しているんですか
そもそも文法的に正しいのですか
普通に動くので困ってしまいました
0428デフォルトの名無しさん2010/07/04(日) 18:32:55
参照だもん正しいよ
0429デフォルトの名無しさん2010/07/04(日) 18:46:27
いや、本当はポインタ使いたかったんですが
気が付いたらこんなのになってしまいました
0430デフォルトの名無しさん2010/07/04(日) 20:09:37
ん、なんで動くんだ
0431デフォルトの名無しさん2010/07/04(日) 20:12:03
参照を渡している
内部的にはアドレスを渡しているかも知れないしそうじゃないかもしれない
とりあえず文法的には合ってる
0432デフォルトの名無しさん2010/07/04(日) 20:15:25
>>430
C++は初めてか?力抜けよ
04334302010/07/04(日) 20:19:33
参照を渡してたら、*po=*po*2としないと行けないんじゃないか?
0434デフォルトの名無しさん2010/07/04(日) 20:20:58
それはvoid calc(int *po);の場合。
0435デフォルトの名無しさん2010/07/04(日) 20:22:02
>>433
CじゃないC++だ。
C++では参照とポインタは別物
04364302010/07/04(日) 20:27:54
そうなのか、横からスマンかった。
0437デフォルトの名無しさん2010/07/04(日) 20:51:46
あれ、それじゃあこれはC++の文法ですか?
てっきりCのものかと
0438デフォルトの名無しさん2010/07/04(日) 20:56:00
C++が使える環境ならC++勉強したほうがメリットあるぞ。
0439デフォルトの名無しさん2010/07/05(月) 07:23:05
>>437
>>427はCでコンパイルエラーになるはずだが?
0440デフォルトの名無しさん2010/07/05(月) 13:30:44
C言語です

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

strの中身を"011A003F"としたいのですがどうすればよいのでしょうか
0441デフォルトの名無しさん2010/07/05(月) 13:33:47
sprintf(str, "%02X%02X%02X%02X", buff[0], buff[1], buff[2], buff[3]);
0442デフォルトの名無しさん2010/07/05(月) 13:41:24
strcpy(buff, "011A003F");
0443デフォルトの名無しさん2010/07/05(月) 13:41:32
>>441
ありがとうございました
sprintfの使い方は目からウロコが落ちました
0444デフォルトの名無しさん2010/07/05(月) 13:42:39
質問の仕方が悪かったみたいです
>>442さんには余計な手間を取らせて申し訳ない
0445デフォルトの名無しさん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
0446デフォルトの名無しさん2010/07/06(火) 02:15:54
派生クラスが初期設定で基底クラスに「*this」という値を渡していたのですが、
「this」なら派生クラスのアドレスですが「*」が付くと何になるのでしょうか・・・?
0447デフォルトの名無しさん2010/07/06(火) 02:24:49
CRTPかな?
値か参照だけど、多分参照。
0448デフォルトの名無しさん2010/07/06(火) 10:27:00
C言語でMySQLを制御したいのですが、どうしたら良いでしょうか
0449デフォルトの名無しさん2010/07/06(火) 10:30:47
>>448
てきとーにライブラリを探してください
0450デフォルトの名無しさん2010/07/06(火) 14:46:03
なんか変数へのアクセスはアクセサ関数を使って〜と杓子定規にいわれるけど
C#でいうところのプロパティ的なモノはpublic変数でも良いのかなと最近思うようになったが
アクセスレベルを設定できないからそれはどうかな?とも思う
やはりちょっと見た目が悪くなるけどアクセサを使うべきなのでしょうか?
0451デフォルトの名無しさん2010/07/06(火) 16:48:12
アクセス制限以外のアクセサ関数のメリットとして、
仮に内部実装が変わっても(例えばintだったのがdoubleになっても)
関数でラップしとけば呼び元に影響しない、とかもある

でも個人的には、よほどリスクがあるのでなければ
変数の方がすっきりしていい
0452デフォルトの名無しさん2010/07/06(火) 20:35:39
>>450
変数は隠蔽するのが基本。公開すると変数の使用方法が統一できずバグだらけになりやすい。
変数と1対1にアクセサを作った場合は変数を公開したのと変わらなくなるのでよろしくない。
0453デフォルトの名無しさん2010/07/06(火) 21:27:48
>>450
> なんか変数へのアクセスはアクセサ関数を使って〜と杓子定規にいわれるけど
いや今の時代は言わないよ。

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

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

まあ現実は納期とかあるからやむをえずクソ設計になっちゃうこともあるけど。
0454デフォルトの名無しさん2010/07/06(火) 22:06:34
>>453
構造体も使ってあげて
0455デフォルトの名無しさん2010/07/07(水) 02:25:40
>>450
先にクラスの外部インターフェースを考えろ。

メンバ変数ありきで関数を作ったりしてる限り、見た目がどうとか以前に糞クラス確定。
0456デフォルトの名無しさん2010/07/07(水) 08:41:00
要はケースバイケース

抽象化したい場合はメンバ関数経由にすればいいし
実装が固定なら直接アクセスすればいい
0457デフォルトの名無しさん2010/07/07(水) 23:36:26
設計不足の言い訳ですか?
0458デフォルトの名無しさん2010/07/08(木) 03:49:07
全てはインタフェースについて記述せよと、
かのエリック・ガンマ先生も言っておられてだな
0459デフォルトの名無しさん2010/07/09(金) 20:04:53
>>444
気にしないでくれ、俺優しいからさ
0460デフォルトの名無しさん2010/07/12(月) 22:56:30
存在しないメンバを呼ぼうとしたら見つかるまで暗黙変換してくれればプロクシ作りやすくて便利なのに
0461デフォルトの名無しさん2010/07/13(火) 21:44:29
#define Q_D(Class) Class##Private * const d = d_func()
こんなマクロがあったのですが、##Privateはどこから来ているのですか?
また、ClassってのはClass Tの省略形ってことでおk?
0462デフォルトの名無しさん2010/07/13(火) 21:59:39
>>461
入門書読もうな
0463デフォルトの名無しさん2010/07/13(火) 22:19:02
>>462は説明できないわけ
0464デフォルトの名無しさん2010/07/13(火) 22:30:18
トークン連結でググれ
04654612010/07/13(火) 22:57:35
>>464
thx
0466デフォルトの名無しさん2010/07/13(火) 23:59:19
ここまで俺の自演
0467デフォルトの名無しさん2010/07/15(木) 22:24:53
ヘッダファイルで変数は「m_」という名前から始まっている場合が多いですが、
GUIプログラミングの場合はボタンやラベルも「m_」から始めていますか?
0468デフォルトの名無しさん2010/07/15(木) 22:26:43
俺はm_btnAddとかやってるな
0469デフォルトの名無しさん2010/07/15(木) 23:25:54
>>467
「m_」は「クラスのメンバ変数」って意味だと思うぞ。
なので、ボタンやラベルを指す変数がクラスのメンバ変数ならやはりm_を使う。
0470デフォルトの名無しさん2010/07/15(木) 23:44:47
ちなみにメンバ変数にはうしろに _ をつけるという流儀もある
何にもつけないというやり方もある
0471デフォルトの名無しさん2010/07/16(金) 18:31:24
C/C++(C#が扱えればなお嬉しい)が使えるIDEで
UMPC(ATOM/メモリ512MB)程度のスペックのPCでも実用に耐えるようなモノはないでしょうか?
0472デフォルトの名無しさん2010/07/16(金) 18:32:25
VC6
0473デフォルトの名無しさん2010/07/16(金) 19:12:24
VC6っていま手に入ります・・・?
0474デフォルトの名無しさん2010/07/16(金) 19:56:40
VC6 は C++ じゃないので論外。
0475デフォルトの名無しさん2010/07/16(金) 20:30:23
>>471
VC8とか9は普通に使えたけど。
0476デフォルトの名無しさん2010/07/16(金) 21:02:32
メモリ512MBってのが厳しいな
EeePCのメモリ2Gに増設して使ってるが、コード書くだけならVS2005でもそこそこいけてるな
0477デフォルトの名無しさん2010/07/17(土) 00:47:13
>>475
ビルドとかしなければ使えそうですか?
それなら移動端末に買おうと思うのですが
0478デフォルトの名無しさん2010/07/17(土) 06:41:34
それだけの用途でなんでIDEが欲しいの?
C#が主目的なら分からなくもないけど、別に携帯のメモでいいじゃんって思っちゃう。
擬似コードメモるだけで十分だよ。
0479デフォルトの名無しさん2010/07/17(土) 07:09:07
入力補完が欲しいんでないの
0480デフォルトの名無しさん2010/07/17(土) 07:51:35
馬鹿は大変なんだね。
0481デフォルトの名無しさん2010/07/17(土) 18:04:31
externとグローバール変数の違いがよくわかりません
どのようにちがうのですか?
0482デフォルトの名無しさん2010/07/17(土) 18:14:15
externは他のソースコードに書かれたグローバル変数を使うためのおまじない
0483デフォルトの名無しさん2010/07/17(土) 18:18:04
>>481
変数におけるextern宣言は、その変数の定義が同一コンパイル単位内にないことの表明だね。
0484デフォルトの名無しさん2010/07/18(日) 09:15:46
>>474
VC6 は c++, MSC は c
0485デフォルトの名無しさん2010/07/18(日) 09:29:39
>>474
え?
0486デフォルトの名無しさん2010/07/18(日) 09:39:17
>>485
標準への準拠の度合いを言ってるんだと思うよ
0487デフォルトの名無しさん2010/07/18(日) 09:43:24
>>486
それなら確かに同意
0488デフォルトの名無しさん2010/07/18(日) 11:58:15
C++のコードを読んでいると、newが成功しているか調べているコードがよくある気がします
newってそんなに失敗しやすいんですか

それとも、ネットワーク/ディスプレイ/スレッドなどの明かにリソースが限られているものだけ、
newの失敗しやすいのでif文で調べていると考えてもいいのでしょうか
0489デフォルトの名無しさん2010/07/18(日) 12:19:53
>>488
newが失敗するって2通りあって、メモリが足りなかった場合と、クラスのコンストラクタが例外を投げた場合なんだけど、

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

後者は発生する可能性があるならちゃんとチェックしなくちゃいけない。
クラスのドキュメントを読んで、コンストラクタが失敗する場合があるかどうかをよく確認しましょう。
0490デフォルトの名無しさん2010/07/18(日) 12:20:13
>>488
>newが成功しているか調べているコードがよくある気がします
>newってそんなに失敗しやすいんですか

それ本当に newが成功してるかどうかを調べてるコード?
その処理単位に再入した時にヌルかどうかを調べてるとか、そういう実装都合とかじゃなくて
0491デフォルトの名無しさん2010/07/18(日) 12:20:44
>>488
失敗するかどうかの前にもしそのコードが下のように if で確認してたら100%意味がないことに注意ね
int* a = new int;
if (!a) {
    // エラー処理
}
理由は new は失敗すると例外を投げるから(new が nullptr を返すことは決してない)

new する以上失敗しうるし、そもそもどんな環境で実行されるかも事前に予期できないので、
失敗してもいいように備えてるだけじゃないかな強制終了されるなんてユーザは望んでないと思うし
0492デフォルトの名無しさん2010/07/18(日) 12:22:41
失敗しやすいかどうかはともかく
エラーチェックを怠るとデバッグに苦労するよ
0493デフォルトの名無しさん2010/07/18(日) 12:24:39
結論、今やnewの結果をチェックするコードは無意味。
寧ろ、適切に例外処理をしておくべし。
# MSVCならcatchじゃなくてCATCHを使うのかな?
0494デフォルトの名無しさん2010/07/18(日) 12:29:26
>>488
メモリ確保については環境によるだろうが、通常は失敗しない。
しかし、たとえばWindowsで目一杯メモリを使うと
仮想メモリが不足しているとか警告が出てくると思うが、
そういう状況では失敗するかもしれない。

それはそうと、newが失敗したときはデフォルトで例外を投げるので、
if文で失敗を調べるのは方法が間違っているかもしれない。
04954882010/07/18(日) 12:58:13
>newが失敗するって2通りあって、メモリが足りなかった場合と、クラスのコンストラクタが例外を投げた場合なんだけど、
コンストラクタでは例外が発生しないフレームワークを使っています
また、個人的にはコンストラクタの例外が嫌いなので作らないようにしたいと思います

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

0496デフォルトの名無しさん2010/07/18(日) 13:20:25
VC6の時代に作られた
0497デフォルトの名無しさん2010/07/18(日) 13:43:32
少なくともC++03とC++0xの規格ではnewでメモリ確保に失敗したときは
std::bad_allocを投げるよう定められている。
0498デフォルトの名無しさん2010/07/18(日) 14:49:10
bad allocはめどいから投げっぱなしにしてmainで取って終わりにしちゃうよね普通
0499デフォルトの名無しさん2010/07/18(日) 18:07:44
ああstd::bad_allocを投げるような場合はprintf()もまともに動くかどうか
わからん状態だからな
0500デフォルトの名無しさん2010/07/19(月) 02:07:17
win7 64bitでVisualStudio2005は問題なく動作します?
64bitアプリを作成するには専用コンパイラが必要というだけで普通に使う分には問題ないですよね?
0501デフォルトの名無しさん2010/07/19(月) 02:57:51
>>500
すべての機能が正常に動くかはわからんが、とりあえずこっちの64bitWin7では動いている。
32bitアプリも64bitアプリもビルドできる。
0502デフォルトの名無しさん2010/07/19(月) 09:39:54
>>495 何年前からタイムスリップしてきたんですか?
0503デフォルトの名無しさん2010/07/19(月) 11:23:40
煽りとか要らない
0504デフォルトの名無しさん2010/07/19(月) 14:28:18
>>501
ありがとう、これでPCの更新ができるわ
0505デフォルトの名無しさん2010/07/19(月) 20:03:34
>>504
http://www.microsoft.com/japan/msdn/vstudio/support/tools.aspx
0506デフォルトの名無しさん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;は使っていますが関係あるかどうか・・・
0507デフォルトの名無しさん2010/07/20(火) 18:37:30
>>506
friend class B;
と書くと、Bのメンバ関数からAのメンバにアクセスできるようになる。
そのソースではa.aaaaが書いてあるのはmain()
main()はBのメンバか?

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

errで意味ないことしてるのは渡すメンバーの中身を書き換えたりしない・・・みたいな意味合いです
0509デフォルトの名無しさん2010/07/21(水) 13:57:17
自作のヘッダやライブラリをまとめておく場所って定石みたいなものがありますか?
基本どこでもいいと思ってるんですけど、こうやっておくと便利、みたいなものがあれば教えて頂きたく。
OSはWindowsで、Visual Studioでの使用を想定してます。
0510デフォルトの名無しさん2010/07/21(水) 13:58:43
>>509
どこでも置いてもいい
インクルードパス指定すればおk
0511デフォルトの名無しさん2010/07/21(水) 18:24:57
>>510
どこへ置いてもあまりメリット・デメリットはないってことですかね。
適当な場所を決めてまとめるようにします。
ありがとうございました。
0512デフォルトの名無しさん2010/07/21(水) 19:47:19
/usr/includeとかってのはバカなのか?
0513デフォルトの名無しさん2010/07/21(水) 20:36:13
ホーム直下に俺様ライブラリフォルダを作ってる
ルート権限がない計算機で仕事することもあるし
0514デフォルトの名無しさん2010/07/21(水) 20:57:20
%HOME%\My Include
%HOME%\My Library
これに入れるとすごくWindowsっぽいですよ。

>>512 ないない。せめて/usr/local/include
0515デフォルトの名無しさん2010/07/22(木) 00:27:11
定期的に更新する5つのオブジェクトの内容を画面に表示するとき

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

どちらにした方がやりやすいでしょうか・・・?
0516デフォルトの名無しさん2010/07/22(木) 00:33:40
その5つのobjは互いに全然関係ないもの?
0517デフォルトの名無しさん2010/07/22(木) 00:41:05
ひとつのクラスもしくは多態的な関係です
0518デフォルトの名無しさん2010/07/22(木) 07:37:34
>>515
スレ違いっぽいね。
↓こっちでどうぞ。
http://pc12.2ch.net/test/read.cgi/tech/1187922645/
0519デフォルトの名無しさん2010/07/22(木) 20:58:57
new Test();とnew Test;は何か違う事はありますか?
0520デフォルトの名無しさん2010/07/22(木) 21:03:47
>>519
前者は引数無しコンストラクタを呼び出す
後者はデフォルトコンストラクタを呼び出す
0521デフォルトの名無しさん2010/07/22(木) 21:11:37
>>520
thx
0522デフォルトの名無しさん2010/07/22(木) 22:55:06
メンバ変数ってnewでインスタンス化する意味ってあるんですか?
0523デフォルトの名無しさん2010/07/22(木) 22:57:22
メンバ変数がポインタの場合とか
0524デフォルトの名無しさん2010/07/23(金) 01:25:56
>>519-521
てきとうなこといってんじゃねーよ。

後者は POD について値が不定となる。 POD じゃなければどちらも同じ。
0525デフォルトの名無しさん2010/07/23(金) 15:30:06
>>519-521
これはひどいwwww


>>522
すげー巨大だからヒープに確保しておきたいという事情がある時とか。
0526デフォルトの名無しさん2010/07/23(金) 15:43:02
>>522
配列を持つクラスを継承すると罠にハマる
0527デフォルトの名無しさん2010/07/24(土) 01:09:10
>>526 くわしく
0528デフォルトの名無しさん2010/07/24(土) 08:28:38
>>520 をさらし上げ
0529デフォルトの名無しさん2010/07/24(土) 15:17:51
>>526
それ、そのクラスかお前がバグってただけだろ。
0530デフォルトの名無しさん2010/07/24(土) 16:16:57
>>526
まさか配列の各要素がDeep copy されなくて云々なんて言わないよな?
そんな事で罠とか言わないよな?
0531デフォルトの名無しさん2010/07/24(土) 16:25:41
>524 も同じレベル。
>後者は POD について値が不定となる。 POD じゃなければどちらも同じ。
0532デフォルトの名無しさん2010/07/24(土) 16:38:36
間違ってると思うなら正しい答えを書こうぜ
0533デフォルトの名無しさん2010/07/24(土) 16:38:57
・・・つまり、何がちがうんだってばよ?
0534デフォルトの名無しさん2010/07/24(土) 17:06:43
試したけど>>524の正しいよな
http://codepad.org/QCtdPthw
0535デフォルトの名無しさん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;
0536デフォルトの名無しさん2010/07/24(土) 23:52:30
>>531
プッ
0537デフォルトの名無しさん2010/07/25(日) 00:00:05
>>524正しいじゃん
0538デフォルトの名無しさん2010/07/25(日) 03:50:53
いくつかの乱数を作るときに、全ての乱数の和が常に同じになるようにすることって出来ますかね?
例えば1〜5の範囲の乱数を3つ作って、その3つの乱数の和は常に10になる、みたいな

"同じ数"から乱数分引いていって、残った分を最後の乱数にすればいいかと思ったんですが
それだと上の例で5が2つ出たら最後は0になって範囲外になってしまいます
0539デフォルトの名無しさん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;
0540デフォルトの名無しさん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個目の切り上げ切り捨ての判断も
個々にではなく、それまでの累計を基にしないと
最後の数が(引き算で求めても)範囲外になる可能性が出てきちゃうね。
0541デフォルトの名無しさん2010/07/25(日) 12:56:05
>>538
割合を乱数で出したらダメなの?
例えば常に和が10と決まっていて乱数範囲が1〜5だと言うなら、
和に対して 0.5〜0.1 の乱数を一つと、
1.0 から 上の乱数を引いた物に対して、また 0.5〜0.1 の乱数を求めれば
0542デフォルトの名無しさん2010/07/25(日) 13:06:28
>>540 と >>541 は考え方は似てるけど、>>541 の方がスマート
0543デフォルトの名無しさん2010/07/25(日) 13:11:33
和が10になる組み合わせを列挙しておいて
乱数でいずれかの組み合わせを選択する
数値の出力順も乱数で決定する

この方法なら最初の組み合わせを限定する事で
特定の数値が出やすいとかいうのを排除しやすい
0544デフォルトの名無しさん2010/07/25(日) 13:27:33
和が1000で50個の値の組み合わせ、とかだった場合どうすんのそれw
0545デフォルトの名無しさん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 とすれば良いかと。
0546デフォルトの名無しさん2010/07/25(日) 13:42:56
>>539でいいじゃん
0547デフォルトの名無しさん2010/07/25(日) 13:51:23
>>546
1が2回出たら困るやん
0548デフォルトの名無しさん2010/07/25(日) 14:28:53
>>541でいいじゃん
0549デフォルトの名無しさん2010/07/25(日) 15:36:49
randが0吐いたら困るんじゃね
0550デフォルトの名無しさん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;
}
0551デフォルトの名無しさん2010/07/25(日) 15:55:29
まあ>>538を読めば、自身がわかってないことがわかるが
最後の数字(最後に限らないが)を、それまでに算出した数を元に決めるやり方というのは
「乱数」の性質を満たしておらず、最後の数字に偏りが出る。

ただ、それでも良いのかもしれないけどね。
0552デフォルトの名無しさん2010/07/25(日) 16:50:50
総和が決まっててそれを構成する複数の値を求めたいってのは、
幅が決まってる数直線上に、複数の区切り位置をランダムに決めてくのと同じ事なので、
>>541 の考え方がシンプルでいいかもしれない。割合のランダム
0553デフォルトの名無しさん2010/07/25(日) 18:56:01
文字列を暗号化して色々な事に使いたいのですが、
RSAとAESのライブラリがある所をご存知ないですか?
0554デフォルトの名無しさん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;は省略可能か、
それが規格上の言語仕様なのかコンパイラ依存なのか、
スレチな議論が延々と続いてるんで、引き取ってくれ。
0555デフォルトの名無しさん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節参照)
0556デフォルトの名無しさん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.
0557デフォルトの名無しさん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; は ×不要 ○省略可 ○各自で適切に記述
勝手に不要としないで下さい ><;
お前の存在こそ、このスレにとっては不要です ><;
0558デフォルトの名無しさん2010/07/25(日) 20:11:35
不要と省略可能がどう違うのか説明してもらわないと、わけがわからないな。
どうせくだらない思い込みだからどうでもいいんだけど。
0559デフォルトの名無しさん2010/07/25(日) 20:17:37
なかったらデフォルト値が使われるだけで不要な訳ではない
ということでしょう
0560デフォルトの名無しさん2010/07/25(日) 20:28:53
みんな目的語省略しすぎだな.
 プロセスローダ側から見てmainの返値は不要ではない
 return 0; の記述は省略可能
 retrun 0; を省略できる場合にわざわざ書く労力は不要
0561デフォルトの名無しさん2010/07/25(日) 21:15:58
政治的に正しい言語定義が必要だな
0562デフォルトの名無しさん2010/07/25(日) 23:26:38
記述が不要だって言ってるのに終了コード自体が不要だって言ってると勘違いした人が、
わざとなのか知らないが、誤解を埋めるための目的語を添えずにわめき続けている、と。
0563デフォルトの名無しさん2010/07/25(日) 23:50:26
もう放っておけばいいよ
0564デフォルトの名無しさん2010/07/26(月) 12:55:10
くだらない質問ですが、mapを使う際、変数名はどう命名するのが自然ですか?
たとえばこのような場合、address_map? store_map?

std::map<std::wstring, int> hoge;
hoge[店の名前] = 場所
0565デフォルトの名無しさん2010/07/26(月) 13:15:46
>>538です
多くの回答ありがとうございました
割合をランダムで出す方向で行きたいと思います
0566デフォルトの名無しさん2010/07/26(月) 17:36:50
>>564
冗長でいいなら、店の名前_場所_mapのようにするのが自然。
もうちょっと縮めたいなら、場所_mapの方が良好だと個人的に思う。
0567デフォルトの名無しさん2010/07/26(月) 22:57:34
>>566
ありがとうございます
普通の配列のように、値の方で命名するのも良さそうですね
0568デフォルトの名無しさん2010/07/27(火) 13:24:17
C++の型は静的であって、型を間違えたところでコンパイラに怒られるだけ
どのコンテナなのかもしくは配列なのか分からないんじゃ、扱い方が分からないんじゃないかと言われるかもしれないが
どのみちmapだとだけ分かってもどうせ格納してる型を知るには宣言に飛ぶ必要がある
コンテナの種類を載せることも冗長ではないか
0569デフォルトの名無しさん2010/07/27(火) 23:30:18
「場所マップ」、「場所リスト」とかなら分かるけど「場所」だけじゃ気持ち悪いじゃん
0570デフォルトの名無しさん2010/07/28(水) 01:00:04
場所[店] と書いて使うんならありじゃね?
0571デフォルトの名無しさん2010/07/28(水) 09:40:15
ユーザー定義の構造体やクラスを関数の返り値にするのってコストの面や
返り値が変更点になったときその影響範囲が広くて大変なことになりそうですが
普通にやって良いものなのでしょうか?

それでも2値以上返す場合はそうするしかないのでしょうか?
0572デフォルトの名無しさん2010/07/28(水) 21:19:52
const unsigned char s[] = "char";
const unsigned char *s = "char";

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

また、このとき構造体も基底部をインターフェイスとした方がいいでしょうか?
0574デフォルトの名無しさん2010/07/29(木) 00:04:06
>>572
上の"char"は{ 'c', 'h', 'a', 'r', '\0' }の構文糖。
下の"char"では無名のconst char[]が作られ、
const char*はconst unsigned char*に変換できないのでエラーになる。
0575デフォルトの名無しさん2010/07/29(木) 00:47:45
>>571
コストは実測してみろ。
影響範囲がどうのということは代替案はグローバル変数か?ありえん。

たいていは読みやすく書いておけばいい。
「返す」というなら素直に戻り値にするのがいいだろう。
0576デフォルトの名無しさん2010/07/29(木) 00:48:29
>>572 エラーメッセージ嫁。
0577デフォルトの名無しさん2010/07/29(木) 00:49:34
>>573
クラスが多態的なのと引数が多態的なのは関係ない。別々で考えて好きにすればいい。
0578デフォルトの名無しさん2010/07/29(木) 07:15:33
>>574
構文糖っての初めて見た。
たいてい糖衣構文って言わない?
0579デフォルトの名無しさん2010/07/29(木) 08:51:05
たいてい両方言う
0580デフォルトの名無しさん2010/07/29(木) 16:16:15
syntax sugar
05815722010/07/29(木) 21:54:54
>>574
なんとなく、雰囲気はつかむことができました

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

>>578
シンタックスシュガーとも言わない?
0582デフォルトの名無しさん2010/07/30(金) 00:42:39
まとめ

構文糖
糖衣構文
セイロガン糖衣A
syntax sugar
シンタックスシュガー
0583デフォルトの名無しさん2010/07/30(金) 01:08:43
>セイロガン糖衣A
てめえはコレを書きたかっただけだろw
0584デフォルトの名無しさん2010/07/30(金) 01:29:06
>>581 エラーメッセージの何がわからなかったの?
0585デフォルトの名無しさん2010/07/30(金) 03:41:40
>>582
ちっちゃな雪使いシュガーがないぞどういうことだ
0586デフォルトの名無しさん2010/07/30(金) 06:56:42
sugar baby loveを雪使いシュガーの主題歌だと思っていたら世間一般ではそうではないということに気づきました
0587デフォルトの名無しさん2010/07/30(金) 09:24:01
オリジナルもリメイクも古い曲だからな
0588デフォルトの名無しさん2010/07/30(金) 09:56:53
糖尿なのでシュガーカットでおながいしまつ
05895812010/07/30(金) 21:22:38
>>584
はい、そうです
0590デフォルトの名無しさん2010/07/30(金) 21:55:24
srd::queue<Data> data_que;
みたいな事をして、data_que内にいっぱいデータ詰めて、その後全部popしたんだけど、
メモリ使用量が減らないのは仕様なの?
再びやると、前回の確保量まではメモリ使用量が増えずに、確保分を超えたところからまた使用量が増えるんだけども。
どうすれば、いちいち解放してくれるだろうか。
0591デフォルトの名無しさん2010/07/30(金) 21:57:50
>>590
仕様
気に入らない場合は
OSから作らないといけなくなるかも
0592デフォルトの名無しさん2010/07/30(金) 22:03:36
>>591
OSレベルでの仕様ってことなのね。
アプリケーションが使用したことがある領域が割り当てられて、って感じなのかな。
一度に確保する数はたかが知れてるからこのままで行くことにするわ。
ありがとう。
0593デフォルトの名無しさん2010/07/30(金) 22:22:49
>OSから作らないと
寝ぼけたことを言わないように。


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

確実にOSに返すためには、
allocatorを自作して、OSから直接メモリを得て不要になったらOSに返すようなものを作る。
(ただし、例えばWin32のHeapAllocを使ってもOSと直接やり取りすることにはならない)
が、そこまでする必要があることは、まず無い。
0594デフォルトの名無しさん2010/07/30(金) 22:24:17
>>593
つまりどうすればいいの?
0595デフォルトの名無しさん2010/07/30(金) 22:40:44
いわゆるswap技法
allocatorを自作
0596デフォルトの名無しさん2010/07/30(金) 23:30:06
>>590 http://www.google.co.jp/search?q=protected+container_type+c
0597デフォルトの名無しさん2010/07/31(土) 09:34:19
>>590
いちいち開放すると遅くなるので、本当に開放が必要か検討してみれ
0598デフォルトの名無しさん2010/07/31(土) 09:43:57
>>597
入力履歴の記憶/再生だから流石に必要かな と思ったけど、実装的には別に開放しなくても大丈夫だな・・・。
うーん、考えてみる。

アロケータを自分で書くほどの必要性には迫られてないから、そっちは保留しとくわ
0599デフォルトの名無しさん2010/08/02(月) 06:55:30
すごく偏りの激しい乱数を作る方法でいいのがあれば教えてください
具体的には
1-10の範囲で100回乱数をとって集計すると大概は
1が30回, 4が21回, 5が6回・・・・とかになるような感じです(たまに平坦になったりするのもよいです)
そしてどれが多く出るのか、何回でるのかは毎回バラバラになるみたいな感じで
0600デフォルトの名無しさん2010/08/02(月) 07:05:20
>>599
乱数を加算する偏る
加算回数をランダムで決めたり、シャッフルしたりして加工する
0601デフォルトの名無しさん2010/08/02(月) 07:06:53
>>600
中心極限定理ですよね
それって一様分布から正規分布に近づくって話じゃなかったですか?
0602デフォルトの名無しさん2010/08/02(月) 07:34:53
>>601
ちょっと思いつかないなあ
結局、どういう風に偏ることを期待しているか、という問題に行き着くんじゃないのかね
非対称な確率分布の確率関数に突っ込めば、偏りのある数列は得られるだろう
しかし望みのものになるかは不明
0603デフォルトの名無しさん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;
}
0604デフォルトの名無しさん2010/08/02(月) 07:43:35
>>602
つまり>>600の説明では意味不明でしたか?

>対称な確率分布の確率関数に突っ込めば
>望みのものになるか不明
望みの物とは正反対になるような気が……
0605デフォルトの名無しさん2010/08/02(月) 07:51:42
いやそもそも乱数だと言ってるのがおかしかったかもしれません
乱数じゃないですし

>>603
なるほど
ありがとうございます
0606デフォルトの名無しさん2010/08/02(月) 23:54:29
クラスのインスタンスをファイルに書き出すってどうやればいいんでしょうか?
boostのserializeが使えない事例なので、どうすればいいか分かりません。
fwriteっていう話も聞きましたが・・・できればC++での方法が知りたいです。
0607デフォルトの名無しさん2010/08/03(火) 00:07:43
>>606
>>で書き出して<<で読み込めるようにすればストリームでシリアライズできるよ
06086062010/08/03(火) 00:26:20
>>や<<をオーバーロードして、ファイルの書き込み・読み込みを行え という意味で良いんでしょうか。
0609デフォルトの名無しさん2010/08/03(火) 00:50:32
>>608
・__vtbl
・エンディアン
・パディング
これらの単語にひとつでも見覚えがないものがあるなら諦めろ
ていうかboost::serializationが使えない事例ってどういう事例よ
0610デフォルトの名無しさん2010/08/03(火) 01:06:01
>>609
自分用のライブラリっぽいものを書いてるもんで、boost入ってるの前提なのはちょっと困るんです。使用環境がboost前提になってしまうので。
そしてその単語に見覚えはあるものの、意味は分からないので今回は諦めてメンバ一個一個を読み書きすることにします・・・。
0611デフォルトの名無しさん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*へ変換できません
とエラーを吐きます。

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

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

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

でした
0613デフォルトの名無しさん2010/08/03(火) 03:00:50
Baseのデストラクタをvirtualにする
0614デフォルトの名無しさん2010/08/03(火) 03:08:14
Sub1のデストラクタをvirtualにする
0615デフォルトの名無しさん2010/08/03(火) 08:47:08
派生クラスのデストラクタにもvirtual指定が必要だったようです。
無事コンパイルは通りましたけどどうしてなんだろ・・・
0616デフォルトの名無しさん2010/08/03(火) 20:52:13
fstreamの話なんですが、
ifstream ifs("filename");
と書けばスコープ外れた時にデストラクタでcloseされるのは良いのですが、
ifstream ifs;
ifs.open("filename");
と書いた場合にもデストラクタでcloseされるのでしょうか?
コンストラクタでopenした場合にはスコープ外れたときに〜という文脈で解説しているサイトがあって不安になりました。
0617デフォルトの名無しさん2010/08/03(火) 21:00:09
>>615
俺は派生クラスにもvirtualつけてる派だが、無くてもいけるはずだと思ってたが

まさか、VC6?
0618デフォルトの名無しさん2010/08/03(火) 21:01:54
>>616
されるんじゃないかな?
0619デフォルトの名無しさん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 を用いてファイル操作をするしか方法はないでしょうか?
よろしくお願いします。
0620デフォルトの名無しさん2010/08/04(水) 00:43:52
getlasterror
0621デフォルトの名無しさん2010/08/04(水) 00:54:14
つーか、それが「エラー」なのかどうか、確認してるか?

実際にファイルの内容があっても読み込めないんだろうが
現実的には、単に読み込もうとした結果がEOFだと判定されているだけじゃないのかね。
0を返した後、ferror()とfeof()でエラーであることを確認した上でなら、しょうがないとも思うけど。
0622デフォルトの名無しさん2010/08/04(水) 01:42:55
>>621
確認してみましたが、feof は 0 を返します。
念のため ferror も確認しましたが 0 以外を返しました。
エラーとは認識しているようですが…。

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

とりあえずは API を直に使ってみることにします…。ありがとうございます。
0623デフォルトの名無しさん2010/08/04(水) 23:10:57
クラスHogeは値A/B/C/Dを直列化するメソッドをもっているとします
直列化する値がA/B/C/D/e/fと増えたので派生クラスHogeHogeとしました

class Hoge
{
virtual std::string Serialize(/*〜*/){/*〜*/};
}

class HogeHoge :public Hoge
{
std::string Serialize (/*〜*/){/*〜*/};
}

このようなとき渡す値の変化にも対応できるようにするには、どのような設計を行えばよいでしょうか?
0624デフォルトの名無しさん2010/08/04(水) 23:16:20
class Hogeのメソッドfoo()はA・B・C・Dの4つの値を受けて処理しますが
派生クラスHogehogeではfoo()の処理する値をA/B/C/D/Eと増やしたいのです

こういう場合はどういう設計をしたらいいでしょうか?
0625デフォルトの名無しさん2010/08/04(水) 23:17:17
class Hogeのメソッドfoo()はA・B・C・Dの4つの値を受けて処理しますが
派生クラスHogehogeではfoo()の処理する値をA/B/C/D/Eと増やしたいのです

こういう場合はどういう設計をしたらいいでしょうか?
0626デフォルトの名無しさん2010/08/04(水) 23:18:23
うわ、多重投下失礼>>623-625
0627デフォルトの名無しさん2010/08/05(木) 01:22:55
>>623
「対応できるようにする」の意味がわからん。
その Serialize() をどうやって呼び出すつもりなのか、とか。
0628デフォルトの名無しさん2010/08/05(木) 01:24:04
>>624
引数増やせよ。それで何か不満か?
0629デフォルトの名無しさん2010/08/05(木) 10:30:14
状況次第だけど、SetE()関数を用意した上でdynamic_castはアリ?
0630デフォルトの名無しさん2010/08/05(木) 14:43:28
template<typename T1, typename T2>
T1 f(T2) {
return 248;
}

int main() {
int i = f<int>(1);
}
というものなんですが
template<typename T2, typename T1>
とするとエラーになります
なぜですか
0631デフォルトの名無しさん2010/08/05(木) 15:21:54
T1が推論できないからだろうね。
248といえど、整数型で4つで浮動小数型2つあるから、
人にとってどれが最適なんてコンパイラさんは推論できない。
0632デフォルトの名無しさん2010/08/05(木) 15:27:56
ありがとうございます
0633デフォルトの名無しさん2010/08/07(土) 00:48:42
>>630
基本的に戻り値から推論はできないよ。推論は引数からのみ。
最適とか整数型がどうとか関係ない。>>631は勘違いしてる
単に文法上問題があるからコンパイルできないだけ

明示的なテンプレート引数リストへの指定は左詰め。
template<typename T2, typename T1>
の場合<int>はT2に対する指定になって、T1は型が指定されていないからコンパイルエラー
戻り値からT1が推論されることはない

template<typename T1, typename T2>
の場合<int>はT1に対する指定になって、T2は引数1から推論されるからコンパイルできる

このあたりのことは「C++ Templates」読むといいよ。翻訳名は忘れたw
0634デフォルトの名無しさん2010/08/08(日) 10:44:30
RSA * RSA_generate_key(int num, unsigned long e, void (*callback)(int,int,void *), void *cb_arg);

>モジュラスサイズ num
> 1024より小さいと脆弱なキーとなるので,1024より大きくする.
>対数サイズ e
> 奇数であり,3,17,65537が良く使用されるらしい.

モジュラスサイズ = 何ビットで暗号化するかなのか?
対数サイズ って何よ?
0635デフォルトの名無しさん2010/08/08(日) 11:15:04
>malloc関数は確保したメモリー領域を初期化しない
>new演算子は整合性があり、初期化されたオブジェクトを作成する

mallocでとった領域を初期化するには、どのようにすればいいんですか
また、newで初期化されたオブジェクトを作成しないためには、
「Test *t = 0;」でおk?
0636デフォルトの名無しさん2010/08/08(日) 11:24:37
mallocはコンストラクタを呼ばない
newはコンストラクタを呼ぶ
それだけ
C++で作るつもりなら全部newで確保しとけ
06376352010/08/08(日) 11:29:38
>>636
つまり、malloc()はメンバ変数が何が入っているか分からないだけなんですね

ポインタを返す関数(C言語)があるのですが、それにはfree専用の関数があります
C++でその関数を使っているのですが、deleteじゃなくて専用の関数を使った方がいいんですかね?

Hoge *h = funcHoge();
freeHoge(h); ○
delete(h); ×
こんな感じ?
0638デフォルトの名無しさん2010/08/08(日) 11:38:28
>>637
それは専用の方がいいだろうな
0639デフォルトの名無しさん2010/08/08(日) 11:44:04
>>634
http://ja.wikipedia.org/wiki/RSA暗号
ここの概要のところだけでも眺めてみるといいよ。
06406372010/08/08(日) 11:48:10
>>638
thx
0641デフォルトの名無しさん2010/08/08(日) 11:59:20
>>639
>適当な正整数 e(通常は小さな数。65537 (=216+1) がよく使われる)を選択する
鍵ってこと?
0642デフォルトの名無しさん2010/08/08(日) 12:09:06
e と n が公開鍵で d が秘密鍵
鍵には違いないけど、どうせ公開するものであるし、そこまで慎重になることはない
よく使われるなどと言われてる数の中から好みで選べばよいです
0643デフォルトの名無しさん2010/08/08(日) 12:20:38
ブルース・シュナイアーも言ってるが、
実アプリで、暗号の低レベルな部分を素人が直接操作するのはお勧めしない
SSLとかを使うのが無難

もちろん勉強してみたいということなら、止めるつもりは全く無い
0644デフォルトの名無しさん2010/08/08(日) 12:36:16
まぁ、よくわかんないけど
公開するわけじゃないから別にいいや
06456442010/08/08(日) 12:39:11
でもさ、一つわかんない事があるから教えてくれ

>unsigned char *crypted_buf;
>crypted_buf = malloc(RSA_size(rsa));

なんで、charなのにmalloc(sizeof(char));じゃないの?
そして、これをC++で書くとどうなるのか教えてください
0646デフォルトの名無しさん2010/08/08(日) 12:47:27
例えばファイルの読み書きとかで10000バイトのバッファが欲しいとき、
char *buf = malloc(10000);
って書くでしょ? それと似たようなものです。
C++でもそのままmalloc使えばいいです。
06476442010/08/08(日) 12:53:26
>>646
レス、thx

>C++でもそのままmalloc使えばいいです。
mallocはC++では禁じ手という事になっているらしいのですが、
それでもmallocを使っちゃっていいんですか
0648デフォルトの名無しさん2010/08/08(日) 13:01:20
それは初心者のための方便です。
初心者がよく間違って使いそうな可能性がある場合にとりあえず禁止しておけば安心というわけです。
正しく使う限りは大丈夫です。
06496442010/08/08(日) 13:01:54
一応、こんな感じかな〜ってことで考えてみました
正しいか、間違っているか教えてください
new unsigned char[(RSA_size(key) / sizeof(char))];
0650デフォルトの名無しさん2010/08/08(日) 13:10:24
>>645
charじゃなくてchar*だろ?それにsizeof(char)だと1byteしか確保されないが・・・・・・
RSA暗号は暗号化するデータが鍵長の整数倍になるようにパッディングするから
おそらく「rsa」に暗号化する生データが入っていて,
パッディング後のサイズをRSA_size関数で計算しているんだとエスパー
0651デフォルトの名無しさん2010/08/08(日) 13:16:16
>>645
crypted_buf = malloc(sizeof(char)*RSA_size(rsa));
0652デフォルトの名無しさん2010/08/08(日) 13:19:22
>>649
間違ってはいないから正しいということになるのだろうか
/sizeof(char) はどうせ÷1なので別にあってもなくても良いのだけれど
コードが長くなるだけで無意味なのであまり書かないと思います
美的な意味があるという人もいるかもしれませんが、
そういうことであれば sizeof(unsigned char) の方がいいと思います
0653デフォルトの名無しさん2010/08/08(日) 13:27:43
>>649,652 そこは割り算自体が意味的に間違いだろ。 malloc じゃないんだから。
06546622010/08/08(日) 15:31:24
てけとーに書いたコード張ってみる。こういうこともできるよ的ななにか。

#include <new>
#include <memory.h>
#include <stdio.h>
#include <crtdbg.h> // vc only
class View{
    int NonUseedVariable;
public:
    View(){ printf("View Is Constructing!!\n");}
    virtual ~View(){printf("View is Destructing!!\n");}
    void DoSomething(){
        printf("Call the View::DoSomething();\n");
        NonUseedVariable = 0;
    }
};
int main(){
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF |_CRTDBG_DELAY_FREE_MEM_DF ); // vc only
    void* mem = malloc(sizeof(View));
    View* V = new(mem) View();
    V->DoSomething();
    V->~View();
    V= NULL;
    free(mem);
    mem = NULL;
    return 0;
}
0655デフォルトの名無しさん2010/08/08(日) 15:33:32
654だけど、名前欄の数字は何で付いたのかよくわからんので、無視してくだされ。
06566442010/08/08(日) 19:00:17
C++でもmallocをしても、全然黒魔術じゃないんですね
知らんかったよ

>>652
おとなしくmallocを使えということなんでしょ?
0657デフォルトの名無しさん2010/08/08(日) 20:21:47
>C++でもmallocをしても、全然黒魔術じゃない

ただ、ね、
もしCでは絶対に使われないコードで、malloc()と同じ動作を求めたいのなら
operator new()を使った方が良い。
こっちは、メモリ不足の時に例外を投げてくれるから。
06586442010/08/08(日) 21:01:21
>>657
thx
0659デフォルトの名無しさん2010/08/08(日) 22:32:27
unsigned charの配列の長さを求める方法を教えてください
0660デフォルトの名無しさん2010/08/08(日) 22:56:54
ヒント:sizeof
0661デフォルトの名無しさん2010/08/09(月) 00:36:57
たとえばファイルから長いバイト列のデータが与えられて、
動的確保したバッファにそのサイズ分コピーし、それを複数の構造体Aの並びとして順次取り出したいのですが
構造体Aに格納する途中でデータが終わってしまった場合を想定すると
1メンバ格納する前ごとに現在の読み込みサイズと総サイズを比較し続けなければなりません。
構造体Aもその都度動的確保するのですが、メンバに数値と文字列が混在しておりややこしいです。
こういう場合は、whileでループ回して1メンバ代入ごとにいちいちサイズ比較をすべなのでしょうか?
それとも他にいいやり方がありますでしょうか。
0662デフォルトの名無しさん2010/08/09(月) 01:37:47
すべきでしょう

与えられたデータの末尾にダミーの値をいくつか追加しておいて、
途中でいちいちチェックせずに構造体1個ぶん終わるところまで処理し、
最後に行き過ぎてしまったかどうかをチェックする方法もありますが、
最悪で何バイト行き過ぎるか、追加するダミーデータの量をきちんと計算しておかないと死にます
0663デフォルトの名無しさん2010/08/09(月) 02:52:52
>>662
ありがとうございます。
文字列メンバは長さ不定のためそのやり方は使えそうにないです。地道にチェックすることにします。
06646592010/08/09(月) 20:53:54
>>660
sizeof(array) / sizeof(array[0])ですね
ありがとうございます

array[0]ってのは少しダサいですが
0665デフォルトの名無しさん2010/08/10(火) 01:12:07
じゃあarray[1]にしとけ
実行中に吹っ飛んでも知らんぞ
0666デフォルトの名無しさん2010/08/10(火) 05:09:27
unsigned char なら別に割る必要はない
06676592010/08/10(火) 05:50:43
>>666
何故ですか
0668デフォルトの名無しさん2010/08/10(火) 06:56:14
>>667
規格によりchar の類は1バイトと決まってるから

>>665
いっそarray[777]とかにしちゃおうぜ
0669デフォルトの名無しさん2010/08/10(火) 11:21:32
sizeof(array) / sizeof(* array)
0670デフォルトの名無しさん2010/08/10(火) 12:05:27
ソースで
クラス:基底クラス
{
うんたらかんたら
bool hoge() const{処理}
};
とあったので、ヘッダと分けたいので
ヘッダ
クラス:基底クラス
{
うんたらかんたら
bool hoge() const;←ここがわからない
};
ソース
うんたらかんたら
bool クラス::hoge() const{処理};←ここがわからない
と言う風に分けたいのですが、どうすれば良いですか?
0671デフォルトの名無しさん2010/08/10(火) 12:13:34
ttp://www.geocities.jp/ky_webid/cpp/language/020.html

ここのconstメンバ関数というのを読むのだ
0672デフォルトの名無しさん2010/08/10(火) 12:15:35
書き換えないなら全然無視してオッケーじゃん
0673デフォルトの名無しさん2010/08/10(火) 13:49:07
最近C++を勉強しようと思ってます。
coutやnewのように、Cで代替の効く関数がありますが、
printfやmallocを使用するのと、どちらが一般的なのでしょうか?
0674デフォルトの名無しさん2010/08/10(火) 14:41:43
阿呆の真似をする本物の阿呆が
初心者になりすまして巫山戯た質問ばかりします。
あれはセロトニンレベルが異常になるような発作を
定期的に起こしているためと考えることはできますか?

特に、長期にわたって前述の行為を行っても芳しい反応を得られていないにも拘らず、
その行為をやめようとしないのは学習能力がないと思わざるを得ません。
あるいは人でなどなく、弱いAIのような存在なのでしょうか?
仮に人間だとしたら、奴さんの脳は考えることを停止したのだ、とか。

奴さんに比べたら、自己顕示欲が暴走して暴れているネット弁慶ニートのほうがまともだと思います。
0675デフォルトの名無しさん2010/08/10(火) 14:47:00
>>673
printfとnewとmallocを使ってる
0676デフォルトの名無しさん2010/08/10(火) 15:01:31
>>673
スピード重視ならprintf
クラスの入出力を多用するならcoutかboost::serialization

mallocは使うなnewを使え
06776672010/08/10(火) 19:47:12
>>668
thx
0678デフォルトの名無しさん2010/08/11(水) 01:17:21
std::mapの要素に構造体を持つとき
構造体のメンバすべてに値を代入する作業をするとして

hogemap[key].aのように毎回[]演算子で要素を指定してドット演算子でアクセスするよりも
find関数でキーを検索してイテレータを通じてアクセスした方が効率はよくなるのでしょうか?
0679デフォルトの名無しさん2010/08/11(水) 01:37:39
インデックサで毎回検索してるわけだから、それをポインタなどで短期間束縛すれば検索コストははぶけるだろう。
長期に持つと追加や削除時に構成が変わって危ないが。
0680デフォルトの名無しさん2010/08/11(水) 01:55:52
>>678
find() もイテレータも要らないだろ。普通に↓でいいんだから。
S& x = hogemap[key];
x.a = ...
x.b = ...
0681デフォルトの名無しさん2010/08/11(水) 12:06:50
初めまして、C言語のプログラミングというかコンパイルについて質問があります。
大学の実験のレポートにて、C言語で差分方程式を数値的に解くというプログラミングを作ったのですが

学校のPCではコマンドプロンプトでコンパイルという作業ができたのですが、
自分のPCでは、たとえば cc sample.c としても、

 'cc'は内部コマンドまたは外部コマンド、
 操作可能なプログラムまたはバッチファイルとして認識されていません。

と出て作業を続けることができません。
大学で作ったプログラム自体は間違っていないと思います。
大学のPCで動かしたときには結果のテキストファイルがちゃんと出ていたので。
今使っているPCのOSはwindows7 Home Premium です。

自分で少し調べてみたのですが、さっぱりわからない状態です。
よろしくお願いします。
0682デフォルトの名無しさん2010/08/11(水) 12:22:15
自分のPCにはコンパイラ(VCとかgccとか)はインストールしてあるの?
0683デフォルトの名無しさん2010/08/11(水) 12:59:18
ccってどのコンパイラだろう
gccかclしか普段使わないなあ
0684デフォルトの名無しさん2010/08/11(水) 13:06:19
多分gccのエイリアスだろう
06856812010/08/11(水) 13:09:10
大学では、そういったことを何も教わらずに機械的に差分方程式のプログラミングを作っただけなので、さっぱりです。

できないってことは入ってないのだとおもうのですが・・・
gccを検索してみたのですが、何をインストールすればいいのか
0686デフォルトの名無しさん2010/08/11(水) 13:34:19
>>685
windows環境でCをコンパイルするならcygwinとか。
KNOPPIXみたいにCDから起動するlinuxとか。
VisualC++とか。

どれにしても、教えてくれる人がいなかったらコンパイルまで
こぎつけるまで大変だと思うけど。
0687デフォルトの名無しさん2010/08/11(水) 13:37:22
windowsなら、borland Cコンパイラってなかったっけ?
0688デフォルトの名無しさん2010/08/11(水) 13:55:38
学校のとバージョン違ってたらあとで面倒なことになる
まず最初に学校のccのバージョンを調べてから
0689デフォルトの名無しさん2010/08/11(水) 14:41:42
というか担当の教官かヘルプの院生に聞いたほうがいいだろう
0690デフォルトの名無しさん2010/08/11(水) 15:05:01
ccってたんにbatファイルじゃないの?
先生に聞いてみたら
0691デフォルトの名無しさん2010/08/11(水) 15:10:35
先生も大変だな
0692デフォルトの名無しさん2010/08/11(水) 15:21:02
熱心な生徒は大事に扱うべき
0693デフォルトの名無しさん2010/08/11(水) 15:25:18
完全にではないけど自己解決しました。
MinGWというコンパイラ?をダウンロードしてやってみたら結果ファイルを出力できてました

急いで残りのをすませてみます。
コンパイルというものが必要だということを教えていただき有難うございました。
0694デフォルトの名無しさん2010/08/11(水) 15:37:46
釣りじゃなかったのか
0695デフォルトの名無しさん2010/08/11(水) 15:55:19
std::ofstreamで例えばstd::vector<int>の中身をファイルに書き出したいんだけど
int型のまま書き出すにはどうすればいいんでしょか
0696デフォルトの名無しさん2010/08/11(水) 15:59:29
>>695
何通りかあるよ。
バイナリで書き込むかテキストで書き込むかというのもあるし、
オペレータ定義して書き込むとか、forでまわして書き込むとか。
0697デフォルトの名無しさん2010/08/11(水) 16:02:05
int型のままって言ってるんだからバイナリじゃないの?
0698デフォルトの名無しさん2010/08/11(水) 16:04:45
あーそうかも。
0699デフォルトの名無しさん2010/08/11(水) 16:07:39
エンディアン対策ってたとえば整数だと

符号有りならを符号なしに再解釈キャスト
1byteごとに刻んで右シフトしてunsigned char配列に格納
unsigned char配列を書き込み

unsigned char配列を読み込み
1byteごとに左シフトしてもとの整数に格納
符号有りなら符号有りに再解釈キャスト

みたいな感じでいいの?
07006952010/08/11(水) 16:14:23
言葉足らずですんません、バイナリでした

>>699
そんな感じで

copyとostreambuf_iteratorみたいに
ポンっとやってくれるクラスがあれば知りたかったけど
ないなら作ってみますね
0701デフォルトの名無しさん2010/08/11(水) 16:27:44
std::vector<int> hogehoge;
ってそのまま
cout << hogehoge;
って出来ないのかな?
0702デフォルトの名無しさん2010/08/11(水) 17:17:37
boostが使えるなら boost::serialization という手もある
07036952010/08/11(水) 18:08:02
>>701
<<はコンテナ引数にとれませんでした
できれば楽なんですけどね

>>702
こりゃ便利!使わせてもらいます
どうもでした
0704デフォルトの名無しさん2010/08/11(水) 19:41:02
こういう感じのこともできるよ。的な何か。
#include <iostream>
#include <vector>
#include <fstream>
template<class T>
void WriteVector(std::ostream& os,const std::vector<T>& vec){
    os.write(reinterpret_cast<const char*>(&vec[0]),sizeof(T)*vec.size());//仮想関数があるとあんま良くない。
}
template<class T>
std::ostream& operator <<(std::ostream& os,const std::vector<T>& vec){
    for(size_t i=0;i<vec.size();i++){
        os<<vec[i];
    }
    return os;
}
int main(){
    std::vector<int> vec;
    vec.push_back(1);
    vec.push_back(3);
    vec.push_back(2);
    std::ofstream ofs("test.dat",std::ios::binary);
    WriteVector(ofs,vec);
    std::cout<<vec;
    return 0;
}
0705デフォルトの名無しさん2010/08/11(水) 19:43:51
ファイルを暗号化してみたいのですが、何かいい方法ありませんか?
0706デフォルトの名無しさん2010/08/11(水) 19:46:29
>>705
NTFS
0707デフォルトの名無しさん2010/08/11(水) 19:46:46
>>705
暗号化というのがどういうものかまず考えるんだ。
強い強度がほしいならそれなりに知識は必要だが。
0708デフォルトの名無しさん2010/08/11(水) 19:48:27
文字列と固定乱数でxorを取っていくといいですよ
0709デフォルトの名無しさん2010/08/11(水) 19:51:54
あるメソッドで返す値とエラーコード両方をわたしたいのですが
エラーの場合例外を投げて例外クラスのメッセージでエラーコードを渡す
エラーコードを返り値にして引数に参照やポインタをとってそこへ代入する
適当な構造体やstd::pairのようなものを利用する
どれが一般的な手法でしょおうか
0710デフォルトの名無しさん2010/08/11(水) 19:54:44
どれも一般的です
0711デフォルトの名無しさん2010/08/11(水) 20:04:15
>>707
why?
0712デフォルトの名無しさん2010/08/11(水) 20:07:20
>>711
足し算や引き算でも暗号化という行為はできるわけさ。
秘密鍵として、いくつ引いたかいくつ足したか保持してれば復号できるわけ。
ただ、数学的に妥当な強度の高い符号がほしいときはそれなりに知識がいる。
って感じだ。
0713デフォルトの名無しさん2010/08/11(水) 20:10:17
>>712
ライブラリを使えばいいだけの話じゃん
0714デフォルトの名無しさん2010/08/11(水) 20:12:22
少なくとも、ライブラリを使うだけの知識は必要だな。
例えば、秘密鍵や公開鍵が何かとかね。
0715デフォルトの名無しさん2010/08/11(水) 20:13:15
mallocはvoid*を返しますが、C++では何を使ってキャストすればいいんですか?
static_cast? dynamic_cast?
0716デフォルトの名無しさん2010/08/11(水) 20:15:17
>>714
>例えば、秘密鍵や公開鍵が何かとかね。
秘密鍵/公開鍵なんて知っていて、当たり前でしょ
0717デフォルトの名無しさん2010/08/11(水) 20:20:48
>>715
ttp://hibari.2ch.net/test/read.cgi/tech/1280914463/21
マルチすんな禿
0718デフォルトの名無しさん2010/08/11(水) 20:20:56
>>716
それは>>705に言って。

>>715
static_castでいいよ。dynamic_castはそれが必要なところ以外で使っちゃダメ。
0719デフォルトの名無しさん2010/08/11(水) 20:22:05
>>715
キャストではなくplacement newを使います
0720デフォルトの名無しさん2010/08/11(水) 20:33:42
>>717
ごめん、ごめん
昨日書き込んだ質問だったね、忘れてた

>>718
感謝
07217162010/08/11(水) 20:55:49
>>718
>>705はオイラ
面倒だったので、名前を省かせてももらった
0722デフォルトの名無しさん2010/08/12(木) 14:57:58
dequeはどうやってデータを保存してますか?
vectorはcapacityとかがあって満杯になると
一定数増やした配列をまた作ってそこにコピーしますが、
dequeはそのようなことをしないで増えていっている気がします。
具体的な実装方法を教えてください。
0723デフォルトの名無しさん2010/08/12(木) 15:31:26
>>722
http://pages.cpsc.ucalgary.ca/~kremer/STL/1024x768/deque.html

↑満杯になったらブロックを追加するんじゃないだろうか。
0724デフォルトの名無しさん2010/08/12(木) 15:32:45
>>723
ありがとうございます。
一つのブロックに何個はいるかわかりますか?
わからないのならいいです。
0725デフォルトの名無しさん2010/08/12(木) 15:33:25
ソース見ればいいじゃない
0726デフォルトの名無しさん2010/08/12(木) 15:51:00
std::dequeのoperator[]はプロキシクラスを使ってるんだろうね
0727デフォルトの名無しさん2010/08/12(木) 16:01:41
標準ライブラリーのソースは何でアンダーバーだらけなんですか?
0728デフォルトの名無しさん2010/08/12(木) 16:08:53
アンダーバーで始まる識別しはコンパイラ職人のおじさんたちのために予約されているからです
0729デフォルトの名無しさん2010/08/12(木) 16:25:24
>>724
さっき「deque 実装」でググったとき、各処理系のブロックの
サイズが書いてあるページをちらっと見たけど、今探したら
見つからない。
数百とか1024とかそのくらいなんじゃないの?

気になるなら、ググって上から見ていけば出てくると思う。
0730デフォルトの名無しさん2010/08/12(木) 16:36:20
双方向リスト
0731デフォルトの名無しさん2010/08/12(木) 16:48:54
dequeはブロックサイズを指定できたらなと思うことはたまにある。
VC9: 16 Bytes
STLport: 32*sizeof(void*) Bytes
のようだが他はどうだろう。
0732デフォルトの名無しさん2010/08/13(金) 02:16:48
右と左のボタン以外にいろんなボタンがついたマウスってありますよね?
で、マウスの設定したボタンが押されたらギミックを動かすってしたいんだけど
どうやってボタンの入力を感知すれば良いんでしょう?

クリックならWM_LBUTTONDOWN、WM_RBUTTONDOWNで対応できるんですが・・・
0733デフォルトの名無しさん2010/08/13(金) 03:15:47
>>732
WM_MBUTTONDOWNとかWM_XBUTTONDOWNとか
0734デフォルトの名無しさん2010/08/13(金) 12:35:43
void arrayCount(int *array) {
std::cout << sizeof(array) / sizeof(array[0]) << std::endl;
}

int main() {
int array[] = { 1, 2, 3, 4, 5};
arrayCount(array);

std::cout << sizeof(array) / sizeof(array[0]) << std::endl;

return 0;
}

なんで、出力された結果が違うのですか?
0735デフォルトの名無しさん2010/08/13(金) 12:36:53
>>734
ポインタだからだよアホが
0736デフォルトの名無しさん2010/08/13(金) 14:47:52
コンパイルしてないけど、こういう感じの方法もあるよ。

template<class T,size_t N>
size_t ArrayCount(T (&in)[N]){
    return N;
}
0737デフォルトの名無しさん2010/08/13(金) 15:00:18
この流れの場合
Nを書いたら負けだと思う
0738デフォルトの名無しさん2010/08/13(金) 15:02:48
なんで?
hairetunonagasaのほうがよかったか?
0739デフォルトの名無しさん2010/08/13(金) 15:05:27
配列のポインタへの成り下がりか、ややこしいよね
0740デフォルトの名無しさん2010/08/13(金) 15:10:13
std::vector でおk
0741デフォルトの名無しさん2010/08/14(土) 01:01:16
配列とポインタが同じものという誤解はよくあるな
0742デフォルトの名無しさん2010/08/14(土) 01:22:18
char array[ 100 ];
char *p;

p=array;//構文糖 p=&(array[0];と書くのが正統 でも頻発なので許容
//arrayは決してポインタではない
//array[3]は許されても*(array+3)は不法としてエラー
0743デフォルトの名無しさん2010/08/14(土) 01:25:06
p=(char*)( &(array[0]) );と書くのが正統

array[0] char 変数
&(array[0]) char 変数のアドレス値(整数)
(char*) アドレス値をchar *ポインタ型へ再解釈するキャスト演算子
0744デフォルトの名無しさん2010/08/14(土) 01:27:22
うそを書くな
0745デフォルトの名無しさん2010/08/14(土) 01:36:14
そう思うなら訂正すればいい
0746デフォルトの名無しさん2010/08/14(土) 02:51:02
>>742
エラーにはなりませんが何か?

#include <stdio.h>

int main(void)
{
char array[] = "abcdef";

printf("%c\n", *(array+3));

return 0;
}
0747デフォルトの名無しさん2010/08/14(土) 22:46:13
test
0748デフォルトの名無しさん2010/08/14(土) 23:56:00
JIS規格 JISX3010 プログラム言語C

6.5.2.1配列の添字付け
添字演算子[]は、E1[E2]が(*((E1)+(E2)))と等価であると定義する。

6.5.6 加減演算子
これらの演算子に関しては、配列の要素でないオブジェクトへのポインタは、
要素型としてそのオブジェクトの型をもつ長さ1の配列の最初の要素へのポインタと
同じ動作をする。

面倒なのでこれ以上の引用は避けるが、配列として定義した変数を添え字なしで使用したとき、
アドレス定数として解釈される。アドレス定数はある種のポインタである。

配列とポインタはそれぞれ定義が異なり、宣言時の区別は重要だが、演算をするにあたっては
規格で定義されている通り、特に区別が必要なわけではない。

> p=&(array[0];と書くのが正統
というのは、配列ととポインタの定義が同一ではないことにこだわるあまりに
初心者がはまりこむよくある勘違い
0749デフォルトの名無しさん2010/08/15(日) 02:14:52
JIS規格w
0750デフォルトの名無しさん2010/08/15(日) 02:22:55
実は
p=&0[array];
が正解
0751デフォルトの名無しさん2010/08/15(日) 08:04:55
>748
>配列として定義した変数を添え字なしで使用したとき、アドレス定数として解釈される。

此処は間違い。添え字付きの場合でも、ポインタに変換されてから添え字演算子のオペランド
になっている。

規格書は持っていないので、K&Rから。

A7.1
式あるいは部分式の型が、ある型Tについて、「Tの配列」であれば、その式の値は配列の中の最初のオブジェクトへのポインタであり、式の型は「Tへのポインタ」に変換される。
この式が単項の&演算子、あるいは++, --, sizeofの被演算数、あるいは代入演算子、あるいは.演算子の左演算数のモノであれば、この変換は行われない。

※それにしても訳がよくないね。2番目の文の「あるいは」がどこまでかかっているのか
全く不明だ。規格書の該当部分わかったら教えて欲しい。
0752デフォルトの名無しさん2010/08/15(日) 11:22:35
初心者が間違うのは
p=&array;
であって
p=array;
と
p=&array[0];
はどっちでもいい
0753デフォルトの名無しさん2010/08/17(火) 18:56:58
論文読んでもどうせわからないだろうから、公開されているBonanzaのソースを読めるようになるために、
昨日からニコニコ動画の0から覚えるC言語でC言語をC++入門でCプラプラの
学習を始めた。ソースを読むためである。
コンピュータ将棋のプロでさえ保木邦仁さんの論文と苦闘してくじけ、
ソースが公開されたら理解できる方々が激増したという現象を観てきたからである。

調べ=エディタ→NotePad++JP
調べ=コンパイラ→Visual C++ 2008 Express Edition
調べ=コンパイル+リンクの仕方→半日

C++入門
//hello1.cpp
#include <iostream>
using namespace std;

int main()
{
    cout << "Hey, men!!!" << endl;
}

0から覚えるC言語
#include <stdio.h>
void main()

{

    printf("Hey, \n");
    printf("Men!!! \n");
    printf("Welcome to C. \n");

}
0754デフォルトの名無しさん2010/08/17(火) 19:04:39
色々ツッコミが入りそうだな
0755デフォルトの名無しさん2010/08/18(水) 18:37:50
>>753
キリッを忘れてるぞ
0756デフォルトの名無しさん2010/08/21(土) 05:42:12
質問です。
Windows、C++でネットワークを利用するプログラムを書こうとした場合、Winsock2以外に選択肢はあるのでしょうか?
あるいは、Winsockはもう時代遅れで、新しいのが有るのでしょうか?
0757デフォルトの名無しさん2010/08/21(土) 11:59:38
ありあへん
0758デフォルトの名無しさん2010/08/21(土) 12:02:56
アリアハン?
0759デフォルトの名無しさん2010/08/21(土) 12:56:25
>>756
ない。
0760デフォルトの名無しさん2010/08/21(土) 12:59:05
boost::asio
0761デフォルトの名無しさん2010/08/21(土) 13:08:02
winsockのラッパじゃけん
0762デフォルトの名無しさん2010/08/21(土) 13:12:53
>>760
それだけはありえない
0763デフォルトの名無しさん2010/08/21(土) 13:30:52
>>756
Qt4
0764デフォルトの名無しさん2010/08/21(土) 15:42:34
::std::malloc(size)
::operator new (size)
::new char [size]

規格上、上記の3つとも「size以下のサイズをもつあらゆる型のアラインメントの倍数のアドレスを返す」、でおk?
0765デフォルトの名無しさん2010/08/21(土) 17:05:03
visual c++ 2008 express editionで開発してるのですが、自分のやってることがしてもいい方法なのか御指南ください
今タイマー機能を持ったクラスCTimerをつくっていて、仕組み的には単純にCTimer内のスタティックコールバックタイマープロシージャから
ある一律の名前の関数(TimerProcとか)を呼び出すことによってクラス独自のタイマーを仕込むことを実現しています
ただいままではあるクラス(nanikaクラスとか)のTimerProcを呼ぶためにはクラス型情報が必要で、CTimerクラスはテンプレートクラスにしてました
※イメージ(省スペースのためwarning的な処理を含んでいます)
template<typename X> class CTimer{
  X *m_x;
public: CTimer( X *x ): m_x( x ){}
  static CALLBACK CTimerProc( … ){ m_x->TimerProc( … ); }
}
class nanika{
  CTimer<nanika> m_ctimer;
public: nanika(): m_ctimer( this ){}
  void TimerProc( … ){ … }
}
これでうまく動いてたのですが、クラス名をわざわざ書かないといけないのが煩わしくて
どうにかCTimerを通常のクラスにしたいと思いこねくり回し、次のようになりました
class CTimer{
  struct VIRTUALTIMERPROC{ virtual void TimerProc( … ) = 0; } *m_x;
public:
  template<typename X> CTimer( X *x ): m_x( reinterpret_cast<VIRTUALTIMERPROC *>( x ) ){}・・・・・・・・・・・・(※)
  static CALLBACK CTimerProc( … ){ m_x->TimerProc( … ); }
}
class nanika{
  CTimer m_ctimer;
public: nanika(): m_ctimer( this ){}
  virtual void TimerProc( … ){ … }       ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・(※※)
}
これも今のところ問題なく動いているのですが、このコードにおいてはvirtualの意味がよくわからず
とりあえずエラーが出ずにうまく動くようにしたらこうなりました(virtualは全て必要、そもそもこれが継承なのかなんなのかわからない)
これはどんな仕組みなんでしょう?(※※)
またごく一部だけしか関連性がないのにポインタキャストをして目当てのメンバ関数を使ってもいいんでしょうか?(※)
0766デフォルトの名無しさん2010/08/21(土) 17:28:17
staticメンバ関数からメンバ変数のm_xにアクセスしようとするとコンパイルエラーじゃん?
まあそれは置いといて、そのreinterpret_castは間違いで危険なコードだから消す
そしてnanikaはVIRTUALTIMERPROCを継承している必要がある
0767デフォルトの名無しさん2010/08/21(土) 17:36:16
(※※)仕組みっていうか偶然動いてるだけです
(※)だめです
0768デフォルトの名無しさん2010/08/21(土) 17:55:21
どうもありがとうございます

>>766
すみません、間違ってました
static CALLBACK CTimerProc( … ){ m_x->TimerProc( … ); }
↓
static CALLBACK CTimerProc( … ){ pctimer->m_x->TimerProc( … ); }
※)pctimerはなんらかの方法でCTimer変数のポインタが代入されている

やはりこのキャストは無茶でしたか
しかしほとんど無関係なのにタイマーだけのために継承していいんでしょうか?
できれば任意のクラスにタイマー変数とそのプロシージャ関数だけ用意しさえすれば最低限使える
と言うようなものにしたいと思っているので、一応現在のが形的にはそれに近くなっています

>>767
なぜ動いてるのでしょう?
確かにnanikaのTimerProcからvirtualをとるとランタイムエラーが発生しましすから危ない橋は渡っていると思います
0769デフォルトの名無しさん2010/08/21(土) 19:33:09
継承を使いたくないなら型消去でググる
あるいはfunctionとbindを使う

なぜ動いてるのかは偶然だよ偶然
一般的に見てバグるところがたまたまうまく動いてるだけ
そういうことがC++にはよくあるんです
0770デフォルトの名無しさん2010/08/21(土) 19:52:11
>>769
おk、謎の力で動いてることが確認できたので全力で改善します
しかし他のところだと無自覚に謎の力に頼ってそうで怖い…

>型消去
なかなか面白そうですね、これは初耳です
他のやつも小耳に挟んだ程度なので勉強してみます
どうもありがとうございます
0771デフォルトの名無しさん2010/08/21(土) 20:05:26
c言語のstaticはprivateと同じ高価なんですか?
0772デフォルトの名無しさん2010/08/21(土) 20:10:42
>>771
違う。
staticは他の翻訳単位からは見えない。
privateは見える。
0773デフォルトの名無しさん2010/08/21(土) 21:06:01
010EDITORというバイナリエディタのCライクなスクリプト言語での質問です。

local int i;
LittleEndian();


for (i=0; i<=100; i++) {
  Printf("%6d",i);
}
これで0から指定数、この場合100まで1行に出力します。
これを、1行10列で改行して出力するにはどうしたらいいでしょうか?
07747712010/08/21(土) 21:11:35
>>772
なるほどね、そういうこと
つまりリフレクションができるかできないかの差なのね

ありがとうよ
0775デフォルトの名無しさん2010/08/21(土) 21:14:19
>>773
C/C++じゃ無いからスレ違い

if(i%10==0)cout<<endl;
に相当する文を追加しろ
0776デフォルトの名無しさん2010/08/22(日) 00:13:08
関数型マクロで質問なんですが、次のような複数命令かつ一時変数定義を含んだ関数型マクロ

#define MACROFUNC( x ) \
{ \
  int i = (x); \
  cout << "i = " << i << endl; \
}

を例えばif文において一行命令文の省略記述(?)で使った場合
1) if( … ) MACROFUNC( 3 ); else{} // エラー
2) if( … ) MACROFUNC( 3 ) else{} // ok
3) if( … ){ MACROFUNC( 3 ); } else{} // ok
という結果になります
今の内容を考えると1)でエラーになるのは当然なのですが2)は通常の関数から考えると少々不気味ですし
3)はそもそも省略記述でなくなってるのでどうにか書き方を工夫して1)が通るようにできないでしょうか
マクロじゃなければ問題ないんですが性質的にマクロ展開されないといけないものでして…
0777デフォルトの名無しさん2010/08/22(日) 00:20:24
>>776
http://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E8%A4%87%E6%96%87%E3%83%9E%E3%82%AF%E3%83%AD%28Multi-statement_Macro%29
0778デフォルトの名無しさん2010/08/22(日) 00:22:05
>>776
inline で我慢するとか…はダメなんかね
0779デフォルトの名無しさん2010/08/22(日) 00:22:55
inline関数はダメなのか?
0780デフォルトの名無しさん2010/08/22(日) 01:14:39
簡易タイマークラス作ってみた。Update()をメインループに突っ込めば使えるかもね。
書き捨て御免!

#include <time.h>

class EasyTimer{
    clock_t Cycle_;
    clock_t LastTime_;
public:
    EasyTimer(clock_t Cycle=1000){
        Cycle_ = Cycle;
        LastTime_ =clock();
    }
    bool Update(){
        bool IsCall=false;
        clock_t C = clock();
        if(((LastTime_ + Cycle_) - C) <= 0){
            TimeProc();
            LastTime_ = C;
            IsCall=true;
        }
        return IsCall;  
    }
protected:
    virtual void TimeProc()=0;
}
0781デフォルトの名無しさん2010/08/22(日) 03:21:02
>>764
3つ目にアライメントを期待するのはさすがに無理があるだろ。
「規格上」というなら対応する記述を探してこないとね。
0782デフォルトの名無しさん2010/08/22(日) 04:54:47
クラスの前方宣言とヘッダファイルのincludeの使い分けの基準というか方針はどうすればいいのでしょうか?
0783デフォルトの名無しさん2010/08/22(日) 05:07:31
>>782
俺はクラスはヘッダーに全部書く派だが、基本的には分けるのが普通なんだそうだ。
テンプレート系は分離できないからヘッダにべた書きしかないらしいが。
プリコンパイルヘッダを使ってるなら、なるべくそこにまとめるのがいいと思う。

何でそうするかって言うと、
実装が隠せることがライブラリにとって幸福であること。売り物だと特にね。
もう一個はコンパイル時間の短縮。

って感じじゃないかな?
0784デフォルトの名無しさん2010/08/22(日) 08:41:00
>>777
大変面白い情報をありがとうございます
まさにダイレクトな解法です

>>778-779
実はこのマクロはデバッグ用のものでして
特に__LINE__がその場に記述されていることになっていないと上手く動かないものです
ですから機械的な置換であるマクロでやっているのですがよく考えるとinlineも埋め込みですから
その場の展開になるんですかね?ちょっと実験してみます
どうもありがとうございました
0785デフォルトの名無しさん2010/08/22(日) 09:27:44
staticしか持っていないクラスがコンストラクターで値を受け取るという設計はまずいでしょうか?
こういうときこそシングルトンにするべき?
0786デフォルトの名無しさん2010/08/22(日) 11:05:03
monostateでいいよ
0787デフォルトの名無しさん2010/08/22(日) 11:32:46
>>782
前方宣言で済むときは原則として常に前方宣言。
クラスや構造体が多いときは予め前方宣言だけ書いたヘッダを用意しておく方法もある。
詳しくはEffective C++ 34項を参照。
0788デフォルトの名無しさん2010/08/22(日) 12:15:25
便乗で聞きたいんだけど引数と返り値は参照ポインタじゃなくても前方宣言でいいじゃん
これって活用してる?例えば

---func.h---
namespace std { template <class X, class Y> class pair; }
int func(int);
std::pair<int, int> func(std::pair<int, int>);

---func.cpp---
#include <utility>
int func(int) { /* --- */ }
std::pair<int, int> func(std::pair<int, int>) { /* --- */ }

---main1.cpp---// func(pair<int, int>)のほうを使いたい場合にはutilityのインクルードが必要
#include <utility>
#include "func.h"
int main() { func(5); func(std::make_pair(5, 5)); return 0; }

---main2.cpp---// func(int)しか使わないのならばutilityはいらない
#include "func.h"
int main() { func(5); return 0; }

確かにコンパイル依存性は減るんだけど、なんか少し気味が悪い
ここまで徹底してるひとっているのかな?
0789デフォルトの名無しさん2010/08/22(日) 14:09:16
常識とまでは言わないが別に普通かと

まあサードパーティのライブラリを使う場合に手動で宣言書いたりはしないが
namespace std { using OtherNamespace::pair; }
みたいな実装だったら多重宣言エラー出ることもあるし
0790デフォルトの名無しさん2010/08/22(日) 22:23:24
>>783
ユーザー定義のヘッダをプリコンパイルヘッダにまとめるのは、
コンパイル依存性を増大させるからおすすめできない。
自前のライブラリみたいな、滅多に更新しないヘッダなら最適だけど。
0791デフォルトの名無しさん2010/08/22(日) 22:37:41
>>788
本題とは関係ないんだろうけど、 namespace std 内の宣言は、既存のテンプレートの
特殊化以外、ユーザーが書いちゃダメなんだぜ。
0792デフォルトの名無しさん2010/08/22(日) 23:44:06
visual c++ 2008 express editionなのですが例えばデバッグ出力で
  .\ファイル名(行番号) : 表示内容
みたいな短縮的な書式での出力でもジャンプすることができるんですが
検索結果などでもこんなふうにパスを短縮することができないでしょうか?
無駄にフルパス表示で必要な表示部分がものすごく狭くなってしまいます
0793デフォルトの名無しさん2010/08/23(月) 01:44:11
>>792
ソフトの使い方はそのソフトのスレへどうぞ。
0794デフォルトの名無しさん2010/08/23(月) 09:15:05
>>793
それもそうですね、すみませんでした
0795デフォルトの名無しさん2010/08/23(月) 22:48:24
C++なんですが、あるcppファイルで宣言した関数(メンバ関数とかではない単独の関数)は、別のcppファイルでは呼び出せないんですか?
0796デフォルトの名無しさん2010/08/23(月) 22:56:56
>>795
ヘッダ書くとか別のcppファイルにプロトタイプ宣言書けば呼び出せる
0797デフォルトの名無しさん2010/08/23(月) 23:04:15
>>796
ありがとうございます!
そうか…プロトタイプ宣言はこういうときに使うんだったか…
0798デフォルトの名無しさん2010/08/23(月) 23:31:01
以前質問したものですが型消去(Type Erasure)で実現することができました
そして余談ですが>>765がいうなれば出来損ないの型消去もどきであると思いました
遥かに堅実になり、ヒントを下さった皆様に重ね重ねお礼を申し上げます
0799デフォルトの名無しさん2010/08/24(火) 09:41:03
>>797
実際に使ってみて初めて意味がわかるってことって多いよな、ほんと。
0800デフォルトの名無しさん2010/08/24(火) 09:53:14
int hoge(int);
とかだとプロトタイプ宣言無くても使えるんじゃなかったっけ
0801デフォルトの名無しさん2010/08/24(火) 10:06:39
test
0802デフォルトの名無しさん2010/08/24(火) 10:06:44
それはCだろ
0803デフォルトの名無しさん2010/08/24(火) 10:08:33
プロトタイプ宣言は省略可能
0804デフォルトの名無しさん2010/08/24(火) 18:17:29
古い規格で語るな
0805デフォルトの名無しさん2010/08/25(水) 01:23:45
C 言語では関数呼び出しを行うにあたってプロトタイプ宣言は必要ではありませんが、
C99 から最低でも関数宣言だけは必要になりました。
0806デフォルトの名無しさん2010/08/25(水) 07:33:00
で、そのC99の処理系ってどこにあるわけ?
0807デフォルトの名無しさん2010/08/25(水) 07:37:22
Solarisなら標準だし、Linuxでもオプション指定すれば。
まぁ、完全準拠ではないかもしれないがね。
0808デフォルトの名無しさん2010/08/25(水) 11:41:13
てゆーかcppつってんだからC++じゃないのか
0809デフォルトの名無しさん2010/08/25(水) 13:49:25
>>806
プッ
0810デフォルトの名無しさん2010/08/25(水) 13:59:16
>>806
つIntel C++
0811デフォルトの名無しさん2010/08/25(水) 21:10:15
最近ようやく構造化プログラミングが分かってきた気がする

public class Info {
public String s1;
public String 2;

public static viod InfoInit(Info i) { //Infoの初期化}
public static void InfoUpdate(Info i) {//Infoの更新}
public static void InfoFinal(Info i) {//Infoの処理終}
}

オブジェクト指向言語でC言語みたいに開発すると、こんな感じになるはず
おk?
0812デフォルトの名無しさん2010/08/25(水) 21:16:03
C言語でオブジェクト指向やるときは、
C++でいう、構造体にパブリックなメンバ変数と関数テーブルを持たせる。
でコンストラクタ的な、初期化関数から値を受け取って必要ならデストラクタ的な開放関数を用意する。
関数テーブルは基本的にバーチャル相当。

って感じじゃないかな。
0813デフォルトの名無しさん2010/08/25(水) 21:18:33
って逆か。
C++はCのアッパーコンパチだから、無理にクラスなどを使う必要はない。
思う存分構造化するがいいさ。
0814デフォルトの名無しさん2010/08/25(水) 21:22:52
構造化とオブジェクト指向は競合しない。両立する
無理せずともクラスは自然に使える
クラスも構造化もどんどん使え
08158112010/08/25(水) 21:24:20
>>812-814
お前ら優しいな
ありがとうよ
0816デフォルトの名無しさん2010/08/25(水) 22:09:24
ソフトを作るときに、FILE構造体 or ストリームの両方を使ってもいいと思う
片方に限定して使った方がいいかな?
0817デフォルトの名無しさん2010/08/25(水) 22:10:52
>>816
使い捨てならどっちでもいい
08188162010/08/25(水) 22:17:17
>>817
使い捨てじゃなくなる予定
0819デフォルトの名無しさん2010/08/25(水) 22:48:21
ヘッダーヘルが怖くないなら、統一しなくても管理できるだろう。
独自機能だったかもしれないけど、FILE*からfstreamに変換はできたと思う。@VC10
うろ覚えだけども。
0820デフォルトの名無しさん2010/08/26(木) 01:15:27
stringに入力された数字を抜き出す方法ってないですか?
使った人に数字を入力させたいんですが、
int a;
cin<<a;
を使ったときに、そこに入ってるのは数字とは限らないので、
例えば「ああああ」とか入力するとオーバーフローを起こしてしまうので、どうにかしたいんです。
0821デフォルトの名無しさん2010/08/26(木) 01:28:56
>>820
まず
> int a;
> cin<<a;
は
> cin >> a;
ね。
普通に
string s;
cin >> s;
で良いじゃん。

あとはlexical_castを勉強しておしまい、
0822デフォルトの名無しさん2010/08/26(木) 01:38:28
>>820
何を見て「オーバーフローを起こしてしまう」って言ってるの。
標準の動作なら何も起こらず failbit が立つだけのはずなんだが。
0823デフォルトの名無しさん2010/08/26(木) 14:35:21
ちょっと質問なのですが
経験者のみなさんは文字列取得関数は次のどのような形態で作っているでしょか?
(1)関数内では渡されたcharポインタに書き込み、戻り値は直接は関係ない(C関数でよくあるタイプ)
(2)関数内ではstatic char配列に書き込み、戻り値はそのアドレスを返す
(3)関数内では渡されたstring参照に書き込み、戻り値は直接は関係ない((1)のstringタイプ)
(4)関数内ではchar配列に書き込み、戻り値はその値をstringでコピーしたものを返す
(5)関数内ではchar配列に書き込み、戻り値はその値をstatic stringに代入しそのアドレスを返す
(6)その他

素人的に思い浮かぶ長所短所としては
・戻り値がアドレスや値返し(2)(4)(5)→その関数がそのまま戻り値型の変数として扱える
                     →str(←string変数) = strfunc();みたいなことができる
・stiringを使う、stringの値返し(4)(5)→コピーのコストが高そう(実際に自前テストしたところだいたい所要時間は(2)=1/5*(4)=1/3*(5)
                                      戻り値をstringに代入するところまで入れると(2)=2/5*(4)=1/2*(5))
・static変数を使う(2)(5)→前回関数使用時の値が残っておりまっさらではない
              →すべての場所で単一のアドレスを使っていることになる
              →stringなどで文字列をコピーしとかないと文字が変わる
・書き込む変数のアドレスを受け取る(1)(3)→ただの変数操作関数で(自分としては)少し不便

自分は現在ほとんどが(2)のようにしてさらに(1)のタイプを(2)のように処理するようにしているのですが
中の変数がどこでも使い回されるというのが少々不安なのでより良い方法ってあるのでしょうか?
0824デフォルトの名無しさん2010/08/26(木) 14:40:49
2はあまりおすすめしないな
マルチインスタンスとかで困るし
0825デフォルトの名無しさん2010/08/26(木) 14:45:16
>>823
普通は (1) (3)
ぎりぎり (4) (コスト大)
(6) Qt4 の QString とか良いよ
0826デフォルトの名無しさん2010/08/26(木) 19:26:00
俺は、返り値をstd::stringにするなー。生のポインタは触りたくない。
返却方法はmoveできるならmoveがいいな。
0827デフォルトの名無しさん2010/08/26(木) 19:37:07
>>823
>>826
>生のポインタは触りたくない。
(6) std::auto_ptr<> とか


戻り値をstd::stringにする人は
エラーは例外出すってこと?
0828デフォルトの名無しさん2010/08/26(木) 19:46:38
今時auto_ptrって……
0829デフォルトの名無しさん2010/08/26(木) 19:55:22
boost::shared_ptrが大げさで使い方がはっきりしてればstd::auto_ptrでもいいと思うけどなぁ
0830デフォルトの名無しさん2010/08/26(木) 19:57:23
VS2008SP1を入れていれば本来次期C++に導入されるshared_ptrを今からでも使うことができる
shared_ptrはstd::tr1名前空間にある
0831デフォルトの名無しさん2010/08/26(木) 19:58:47
おまいら漏れにも判るように話してくれ
0832デフォルトの名無しさん2010/08/26(木) 20:06:22
戻り値として生ポインタを渡したくない、って目的だけだったらauto_ptrが適任だろ。
別にshared_ptrでもいいんだけど、そこでshared_ptr使っちゃうような人はC#かJavaでも使った方がいいんじゃないかなと思う。
0833デフォルトの名無しさん2010/08/26(木) 20:23:23
auto_ptrはいまどきないだろ…
いつ消えるか分からんのに
0834デフォルトの名無しさん2010/08/26(木) 20:25:25
何十年後かには「auto_ptrは互換性のために残されています」なんてことになるんじゃないかな。
0835デフォルトの名無しさん2010/08/26(木) 20:30:29
>>831
unique_ptrの件を知らない人がいたというお話
0836デフォルトの名無しさん2010/08/26(木) 20:34:35
まー、auto_ptrのような用途はunique_ptrに置き換えられるから、auto_ptrは非推奨になってるはずだけど。
unique_ptrはコンテナにも入ります!

>>827
エラーの起こりにくいコード前提だな。例外は使ってないし。
08378362010/08/26(木) 20:37:09
おっと被った。
0838デフォルトの名無しさん2010/08/26(木) 20:53:40
過渡期なんだから初心者にはより多くの環境で使えるauto_ptrの方を薦めておくのは当然だと思うんだが
0839デフォルトの名無しさん2010/08/26(木) 20:55:41
グローバル変数にstaticをつけると、
オブジェクト指向言語のprivateなフィールド(プロパティ)になるってことでいいんですか?
0840デフォルトの名無しさん2010/08/26(木) 21:01:01
>>838
まーそうなんだけど、俺は初心者にはauto_ptrの存在自体を教えないと思う。
あぶなっかしいし、なくても何とかなる。
0841デフォルトの名無しさん2010/08/26(木) 21:01:30
非推奨になるもんを初心者に教えるなよ
0842デフォルトの名無しさん2010/08/26(木) 22:17:07
入門書にscanfが出てくるのと同じレベル
0843デフォルトの名無しさん2010/08/26(木) 22:40:48
ヘッダにポインタを宣言する時って、
class Pointer;のように前方宣言をしますが

これって、省略しても構わないんですか?
省略しているコードを見つけたもので
0844デフォルトの名無しさん2010/08/26(木) 22:43:08
>>843
省略可能な文脈では省略可能としか言いようがない。
勉強してくれ。
0845デフォルトの名無しさん2010/08/27(金) 00:08:13
>>843
そのような名前の何かがあるということがわからないと困る場合がある。
C++のコードは名前が一意だから、その宣言によってソースを検索できると便利な場合がある。人でも機会でも。
0846デフォルトの名無しさん2010/08/27(金) 02:19:49
>>824-827
どうもありがとうございます
staticはやはりグレーなんですか、一応シビアな使い方はまだしていないんですが早急に次善策を考える必要がありそうですね
それとQString(やQt4)もなかなか面白そうなので調べてみます
0847デフォルトの名無しさん2010/08/27(金) 02:28:47
>>846
関数内部のstatic変数ヘのポインタを返す関数だと、こういう使い方ができない。
std::cout << func() << func();
従ってこう書かざるを得ない。
std::string tmp1 = func();
std::string tmp2 = func();
std::cout << tmp1 << tmp2;
だとすれば、引き数渡しでも手間は大差ない。。
std::string tmp1, tmp2;
func(tmp1);
func(tmp2);
std::cout << tmp1 << tmp2;
0848デフォルトの名無しさん2010/08/27(金) 05:15:41
>>847
>std::cout << func() << func(); 
func()の実装が(2)だと、これが鼻から悪魔なんだっけ?
0849デフォルトの名無しさん2010/08/28(土) 20:15:35
>>848
意図した結果にならない可能性が高いってだけで、未定義動作じゃないよ。
0850デフォルトの名無しさん2010/08/28(土) 20:16:44
>>849
未定義じゃないの?
0851デフォルトの名無しさん2010/08/28(土) 20:32:02
未定義じゃない
0852デフォルトの名無しさん2010/08/28(土) 20:33:35
>>851
評価される順はどちらが先なの?
0853デフォルトの名無しさん2010/08/28(土) 20:34:44
>>852
どっちか分からないかどうかは未定義とは関係なくね?
0854デフォルトの名無しさん2010/08/28(土) 20:38:38
>>853
それを未定義動作というんじゃないかい?

仮に func の実装が
int func(void){
static int counter;
return ++counter;
}
であるとき
cout << func() << func();
の結果が
12
となるか
21
となるかが決められてないなら
未定義動作でしょ
0855デフォルトの名無しさん2010/08/28(土) 20:42:53
>>854
違うだろ・・・・・・
0856デフォルトの名無しさん2010/08/28(土) 20:54:04
>>854
その結果は 12 となるか 21 となるかは決まってないが、そのどちらかでなければ
ならないとは決まっている。

未定義動作は、何も決まっていない。
0857デフォルトの名無しさん2010/08/28(土) 20:55:24
>>854 http://www.kouno.jp/home/c_faq/c11.html#33
0858デフォルトの名無しさん2010/08/28(土) 20:57:01
printf("%d %d", func(), func());
は未定義であっても
cout << func() << func();
は未定義じゃないだろ。
0859デフォルトの名無しさん2010/08/28(土) 20:58:25
あー、違うかな。
<<の左右の評価順も規定されてないのかな。
0860デフォルトの名無しさん2010/08/28(土) 20:58:42
>>858
どちらも未定義ではない。 func() の評価順が不定という意味ではどちらも同じ。
0861デフォルトの名無しさん2010/08/28(土) 21:01:21
>>859
それはない
0862デフォルトの名無しさん2010/08/28(土) 21:02:43
>>861 じゃぁどう規定されてるのか言ってみろ。
0863デフォルトの名無しさん2010/08/28(土) 22:54:15
cout << func() << func();
で右が先に評価されるということは
本来は
(cout << func()) << func();
であるところが
cout << (func() << func());
をやってることになる
0864デフォルトの名無しさん2010/08/28(土) 22:58:42
operator<<(operator<<(cout,x),y);
こういうことですね
0865デフォルトの名無しさん2010/08/28(土) 23:04:33
>>863-864
T x = func();
T y = func();
cout << x << y
このように評価してもいいし、あるいは
cout << y << x
こんな結果になるかもしれない。
いずれも規格に反しない。
0866デフォルトの名無しさん2010/08/28(土) 23:22:23
しかしそんなのって実用上では通常言われる未定義と全く変わらん定義レベルだな
0867デフォルトの名無しさん2010/08/28(土) 23:28:55
馬鹿言っちゃいかん、鼻から悪魔が出ないことが保証されるんだぞ。
0868デフォルトの名無しさん2010/08/28(土) 23:31:04
未定義動作は状況によっては木星圏までの文明が崩壊するからね
0869デフォルトの名無しさん2010/08/29(日) 00:45:48
>>866
×実用上
○俺の経験上
×通常言われる
○俺の言う
0870デフォルトの名無しさん2010/08/29(日) 00:46:16
分かった積もりにさせられる催眠術みたいなのは困る、と茶々を入れておく
0871デフォルトの名無しさん2010/08/29(日) 01:52:19
>>869
スレ見てないのか?
0872デフォルトの名無しさん2010/08/29(日) 15:56:01
printf("%d", i++ * i++);
と
printf("%d", incI() * incI());
で、後者は副作用完了点があるから未定義の動作にならない
というのは正しい?
0873デフォルトの名無しさん2010/08/29(日) 18:42:41
>>872
* 演算子次第じゃろ
0874デフォルトの名無しさん2010/08/29(日) 20:22:15
static void Hoge( LPRECT* ppRect )
{
LPRect pRect = *ppSample ;
for( int i = 0; i < 10; i++ )
{
wcout << pRect[i].up << std::endl ;
}
}

static void Func( void )
{
RECT rect[10] ;
//rectに数値を入れる

//Hogeにrectを渡す←ここがわからないです
}
どうやったらHogeに構造体の配列rectを渡すことができますか?
08758742010/08/29(日) 20:24:16
間違えちゃった
3行目は
LPRECT pRect = *ppRect ;
でした
0876デフォルトの名無しさん2010/08/29(日) 20:27:23
static void Hoge( LPRECT* pRect )
{
for( int i = 0; i < 10; i++ )
{
wcout << pRect[i].up << std::endl ;
}
}

static void Func( void )
{
RECT rect[10] ;
//rectに数値を入れる

//Hogeにrectを渡す
Hoge(&rect[0]);
//Hoge(rect);でもOK
}
0877デフォルトの名無しさん2010/08/29(日) 20:39:36
>>876
1 番目の引数を 'RECT *' から 'LPRECT *' に変換できません。
って怒られます
Hoge側は提供されてる関数なので私では弄れません
単にLPRECT型で受け付けてくれれば&rectでいいんですが
ポインタのポインタ?になっているので
構造体の配列を渡す方法がわからないのです・・・
0878デフォルトの名無しさん2010/08/29(日) 20:43:13
ごめんよ。一行目は以下でよろしく。
static void Hoge( LPRECT pRect )
0879デフォルトの名無しさん2010/08/29(日) 22:29:13
ばいばいおさるさん
0880デフォルトの名無しさん2010/08/30(月) 01:33:00
Microsoft Visual C++ 2010 でApacheをコンパイルしたいのですが
何から手を付ければいいのかわかりません
初心者歓迎との事なので教えて貰えないでしょうか
0881デフォルトの名無しさん2010/08/30(月) 01:39:08
たしか出来ないはず
0882デフォルトの名無しさん2010/08/30(月) 02:50:24
WindowsでNIXアーキテクチャーの落とし子みたいなApacheを
使うことは推奨されないからこそ
PC-Linuxとかが流行ってい(た)るわけで...
WindowsではIISを使ってあげるのが正道
どうしてもというのであればVirtual PCでもDLして
その上にPC-Linuxをインスコしてというやり方(BuildもOK)
0883デフォルトの名無しさん2010/08/30(月) 09:19:09
Windowsでもapache使えるけど
それは本物のapacheではない
0884デフォルトの名無しさん2010/08/31(火) 07:08:49
double型の関数で、想定外の引数が渡されたときのプロっぽい書き方はどうすればいいですか?

double a(int data) {
 double res;
 if(0==data || 6<=data) {
  printf("値が適切でない");
  res=-10000000;
 } else {
  //色々な計算した後、結果をresに代入
 }
 return(res);
}
今は上記の様にして-10000000が返って来たら呼び出し元であるmainでreturn(-1);
としてますけど変ですよね。
0885デフォルトの名無しさん2010/08/31(火) 07:27:15
>>884
標準出力にエラーメッセージを出すのがプロっぽくないw
エラー値を生で書くのはどうにも不調法だから、せめて定数マクロに。
戻り値の値域が特定しにくい場合はNaNを返すと言う裏技を使うこともあり。
C++なら例外を使うのも手。Cなら引き数を増やす手も。
例えば、int a(int data, double * res)とかdouble a(int data, int * status)とか。
0886デフォルトの名無しさん2010/08/31(火) 07:36:20
>>884
色々ありえるが、どれも一長一短というところ

状況にもよる。例えば、入力が静的で不正な引数はバグ以外にありえない、
不正な引数があっても処理を続行する必要がないというなら
assertを書いておくだけで十分かもしれない

・エラーでプログラムを落とす
・関数では何もしない。その代わり、呼び出し側が引数の妥当性を保証する
・デフォルト値(例えば0.0)を返す
・NaNを使う
・引数に変数へのポインタを取り、それに成否を書き込む
・グローバル変数を使う
・構造体(へのポインタ)を返す
・例外を使う(C++の場合)
0887デフォルトの名無しさん2010/08/31(火) 08:17:52
プロっぽいと言うなら、グローバル変数を使う場合はマルチスレッドに注意だな
0888デフォルトの名無しさん2010/08/31(火) 08:46:33
つーか、グローバル変数が一番トーシロっぽいんだが。
0889デフォルトの名無しさん2010/08/31(火) 09:10:06
assert を書いた場合
中断する際はデストラクタは呼ばれるのでしょうか?
0890デフォルトの名無しさん2010/08/31(火) 09:26:58
>>889
呼ばれない
例外を投げるなら呼ばれる

CとC++での例外処理
ttp://msdn.microsoft.com/ja-jp/library/cc440194%28VS.71%29.aspx
末尾の「Rationale(論理的根拠)」を参照
0891デフォルトの名無しさん2010/08/31(火) 11:18:35
>>884
定数を左にもってきたりとか、returnにカッコがあったりとかが素人くさい。
0892デフォルトの名無しさん2010/08/31(火) 14:33:34
>>891
定数左辺だと何か問題があるのかい?
0893デフォルトの名無しさん2010/08/31(火) 14:56:46
定数左はともかく
returnにカッコがあったりってのは確かに素人らしい。

でもそんなの気にしないでとにかく他の人のソースとかも眺めるのが良いかと。
0894デフォルトの名無しさん2010/08/31(火) 15:22:32
>>892
定数左とかメリットはあってもデメリットは全く無いもんなのにな
0895デフォルトの名無しさん2010/08/31(火) 15:25:06
左定数は判定したい主体が見えにくいからだめ
0896デフォルトの名無しさん2010/08/31(火) 15:31:13
>>895
それは余りにも主観によるだろう
0897デフォルトの名無しさん2010/08/31(火) 16:03:24
たとえば
a < b < c
という範囲を調べたいときに
a < b and b < c
と書く人もいれば
b > a and c > b
と書く人もいるし
~(a >= b or b >= c)
と書く人もいるかもしれない
0898デフォルトの名無しさん2010/08/31(火) 16:05:01
この場合 b が主体だから
b > a and b < c
と書くべきだな
0899デフォルトの名無しさん2010/08/31(火) 16:07:46
不等号は常に数直線を意識して < か <= しか使わないという考え方もある
0900デフォルトの名無しさん2010/08/31(火) 16:09:43
俺は><が混ざってると分かりにくいから
a < b and b < cを使うな
好みの問題だと思うけど
0901デフォルトの名無しさん2010/08/31(火) 16:14:32
こういうとき不等式を単純化するような機能があれば便利だけど
そういう機能ってなぜか無いよね。
0902デフォルトの名無しさん2010/08/31(火) 16:52:43
数学的値域の表現を思考してて それを直接指示したいケース  a < b and b < c
被判定変数は b だ。 そして b の条件はこうだ思考         b > a and b < c
0903デフォルトの名無しさん2010/08/31(火) 16:55:27
>>902
たしかにそういう流派でわかれるかもね。
0904デフォルトの名無しさん2010/08/31(火) 17:07:54
>>903
さらに 前者の思考の場合には c > b and b > a や b < c and a < b はありえない
(記述の順=数直線上での位置 というイメージなので)

後者の場合には
b < c and b > a という記述もありえる
ショートサーキットを意識したうえで あえて入れ替えるケースもある(最適化されるかもしれんけどw)
0905デフォルトの名無しさん2010/08/31(火) 17:21:12
a+bとかはa足すbってことばあるけど
不等号にはそういうことばが無いのが分かりにくくしてるような気がするね。
外人の言葉は動詞が真ん中に来るから自然に分かりやすいのだろうけど
0906デフォルトの名無しさん2010/08/31(火) 17:38:34
型が変わるからありえないことなんだけど
a = b = cみたいにa < b < cとかオーバーロードできたらなあ
0907デフォルトの名無しさん2010/08/31(火) 18:14:40
めんどいけど出来るでしょ
0908デフォルトの名無しさん2010/08/31(火) 18:26:31
returnに括弧はK&Rの初版の影響だから素人クサイというよりは老害クサイ
0909デフォルトの名無しさん2010/08/31(火) 18:42:00
enumの定数を使うときにenumの名前を使わないでくださいという警告はなんのためにあるの?

enum EnumName {ENUM1};

コードでEnumName::ENUM1と書くと"EnumName::"は省略してくださいという警告が出る。
いやどこの所属か明確にした方が分かりやすいだろと
0910デフォルトの名無しさん2010/08/31(火) 18:54:57
その拡張はコンパイラ依存だからだろ、このカスが!
0911デフォルトの名無しさん2010/08/31(火) 19:04:11
>EnumName::ENUM1
こんな書き方できるのか初めて知った
0912デフォルトの名無しさん2010/08/31(火) 20:20:01
VCだとそれでインテリセンスで候補が出るので、大量の値があるとき便利なんだよなぁ。
0913デフォルトの名無しさん2010/08/31(火) 20:36:28
namespace e { enum E { val }; }
using e::E;
こうやってる
0914デフォルトの名無しさん2010/08/31(火) 23:59:51
>>892
まともな人はあんまりそういう変な工夫しないで、素直に書いてることが
多いから、素人くさく見える。
0915デフォルトの名無しさん2010/09/01(水) 00:45:48
ああ、==を=とタイポすると、コンパイルエラーになるっていうしょーもないあれか。
初心者ほど好んでやる傾向にあるね
まあ初心者のときしか役に立たないテクなんだけど
0916デフォルトの名無しさん2010/09/01(水) 01:04:20
= タイポはちょくちょくやってしまうけど
コンパイラが警告出すように設定してあるから
記述順序は気にしてないな
0917デフォルトの名無しさん2010/09/01(水) 01:31:44
なぜなるべく事故をなくそうとする方法論をけなすのかがわからない
まあ俺もぶっちゃけ上記のことは実行してないんだけどその考え方は合理的だし
俺が使わない理由はただ感情的な理由だけだからけなす理由(というか権利)は全くない
(当たり前だけどより優先する事項があるなら話は大きく変わる)
0918デフォルトの名無しさん2010/09/01(水) 01:41:54
・読み易さを軽視する理由はない
・比較対照が変数だとなんの効果もない
けなすには充分だ。
0919デフォルトの名無しさん2010/09/01(水) 01:57:48
>読み易さを軽視する理由はない
定数を左辺に書くぐらいは分かりにくいとは思わないから(すくなくともcでは)するなぁ
コンパイルエラーや警告が必ず出ると過信するのも危ないし

ただ0か非0かを判断するのに==0もしくは!=0を省略する書き方は許せない
0920デフォルトの名無しさん2010/09/01(水) 01:59:25
>>918
>・読み易さを軽視する理由はない
これはまあ見逃すとして

>・比較対照が変数だとなんの効果もない
今は定数に関する話だ
0921デフォルトの名無しさん2010/09/01(水) 02:19:09
>>919
省略しているんじゃないよ! むしろ==0や!=0が蛇足なんだよ!
0922デフォルトの名無しさん2010/09/01(水) 02:36:51
if (n) { 〜 }
if (n!=0) { 〜 }

if (!n) { 〜 }
if (n==0) { 〜 }
if (0==n) { 〜 }

どれが読みやすい?
どれが本来の意味を表している?
>>921じゃなくても答えてみ?
0923デフォルトの名無しさん2010/09/01(水) 02:41:38
圧倒的にif(n)とif(!n)なんだけど
0924デフォルトの名無しさん2010/09/01(水) 02:53:14
ワロタw
0925デフォルトの名無しさん2010/09/01(水) 02:56:56
if(n)とif(!n)は1行に表示できる文字数が限られていた時代の悪習だよなぁ
0926デフォルトの名無しさん2010/09/01(水) 03:01:05
んなこたない
0927デフォルトの名無しさん2010/09/01(水) 03:16:52
if (!n) { 〜 }の代わりにif (n) { ; } else { 〜 }てのはあり?
0928デフォルトの名無しさん2010/09/01(水) 05:06:32
ifの後なんだからやっぱり論理式にしないと
だってifだし
もしifの役目を他の記号か何かが担ってたなら別だけど、ifだもんな
0929デフォルトの名無しさん2010/09/01(水) 08:16:12
a = n ? t : f;

a = !n ? t : f;
0930デフォルトの名無しさん2010/09/01(水) 08:16:55
a = b = c ? t : f;
0931デフォルトの名無しさん2010/09/01(水) 10:20:13
>>922
cの場合n!=0の結果は0か1なのでif(n)とif(n!=0)は意味が違う
まともなコンパイラなら無駄を省いて同一視するが
0932デフォルトの名無しさん2010/09/01(水) 11:11:42
n == false
n != false
は
やってもいいけど
n == true
n != true
は
やってはいけないと
2ch のおっさんに聞いた
0933デフォルトの名無しさん2010/09/01(水) 12:07:13
偽は唯一0だけど真は0以外だからね
そりゃ真の特殊な場合であるtrue(=1)と比べるのはまずい
0934デフォルトの名無しさん2010/09/01(水) 12:39:25
>>932
if (success) …とか書くのがわかりやすい。
if (success != false) …だと「成功が偽でなくて」とか、判断するのに
負担がかかる。
0935デフォルトの名無しさん2010/09/01(水) 14:28:19
数値が0かどうかを判断するのに==や!=を省略するかって話だから
変数が真偽値(に準ずるもの)ならばそのまま条件式にすればいいのでは
0936デフォルトの名無しさん2010/09/01(水) 14:56:55
if(a != 7){〜}
if(a - 7 != 0){〜}
if(a - 7){〜}
どれがいいですか
0937デフォルトの名無しさん2010/09/01(水) 15:20:10
ぶっちゃけどうでもいい
0938デフォルトの名無しさん2010/09/01(水) 15:24:39
if(a^7){}
0939デフォルトの名無しさん2010/09/01(水) 15:27:36
aが符号付の場合a-7でアンダーフローの例外が発生する可能性がある点を考慮すべき
0940デフォルトの名無しさん2010/09/01(水) 15:30:01
アンダーフローではなく負方向のオーバーフローだった
0941デフォルトの名無しさん2010/09/01(水) 15:55:09
>>934
> if (success) …とか書くのがわかりやすい。
まあそれは言える。bool値ってそう言う物だし。

> if (success != false) …だと「成功が偽でなくて」とか、判断するのに
> 負担がかかる。
それは、見る人がってことだよね?
コンパイラが最適化するから実行時のオーバーヘッドにはならないだろう。
あくまで見る人がつらいってことだよね。
0942デフォルトの名無しさん2010/09/01(水) 17:35:59
見ずライト思ってしまうのはまだまだ頭が最適化されてないな
0943デフォルトの名無しさん2010/09/01(水) 18:02:37
0と1以外意味がわからない
0944デフォルトの名無しさん2010/09/01(水) 18:05:12
>>943
なんという二進法脳
0945デフォルトの名無しさん2010/09/01(水) 19:19:19
存在するのは 0 と !0 だけだろ
0946デフォルトの名無しさん2010/09/01(水) 20:17:29
C的には0と1じゃねーかwww
0947デフォルトの名無しさん2010/09/01(水) 21:08:19
>>941
> あくまで見る人がつらいってことだよね。

そりゃそうだよ。
こんなことパフォーマンスの観点で語るやついないだろ。
0948デフォルトの名無しさん2010/09/01(水) 21:45:58
>>947
> こんなことパフォーマンスの観点で語るやついないだろ。
それがたまにいるんだよ。
恐ろしいことに。
0949デフォルトの名無しさん2010/09/02(木) 21:02:38
貧民プログラミングですね。

それはそうと大貧民が一番楽しいよな、あのトランプゲーム。
0950デフォルトの名無しさん2010/09/03(金) 19:08:01
C/C++の関数の設計について。

複数のファイル名(パス)が代入された、配列 fileList[] があるとし、ここから1ファイルだけ読み込む関数 LoadFile() を用意します。
fileList[] にある複数のファイルを読み込むには、while 等で複数回 LoadFile() を呼び出します。

以上のような仕様の関数を作るとき、
 (a) ファイルを正しくオープンできたか?(ファイルがない、フォーマットがおかしい等)
 (b) fileList[] の最後まで読み込んだか?(最後でなければ読み込みループ継続)
というのは、どのように取得するのがスマートでしょうか?

Cなら
 (a)オープン成功か … 引数で成否を表す変数をポインタ渡し
 (b)  リスト終了か … 関数の戻り値
C++なら
 (a)オープン成功か … 失敗したら例外を投げる
 (b)  リスト終了か … 関数の戻り値
といった感じでしょうか?

また、関数の戻り値でリスト終了かどうかを検知する場合、どのような戻り値にするべきでしょう?
Cの標準関数を参考にしようと思ったのですが、(それぞれ機能が異なるため当然ですが)統一されていないように感じました。
0951デフォルトの名無しさん2010/09/03(金) 20:00:25
typedef struct _LoadFileInfo {
bool opened;
bool status;
FILE *fp;
char *filename;
} LoadFileInfo;

LoadFileInfo fileList[] = { {hoge}, {fuga}, {hage} };
0952デフォルトの名無しさん2010/09/03(金) 20:02:33
エスパーするとLoadFileの引数にfileListを与えないようにする。
09539502010/09/03(金) 20:20:17
ありがとうございます。


>>951
ファイル名リストの中に、各フラグも一緒に詰め込んでしまえってことね。
で、別途で配列を走査してエラーがあったかどうか調べると。


>>952
エスパーされすぎてよく分からないのですが、どういうことでしょうか。

関数の呼び出し側でfileListからファイル名を1つだけ抽出し、それを関数に渡すべしとも取れるのですが、
それをラップするのが今回用意する関数の目的です。
0954デフォルトの名無しさん2010/09/03(金) 20:22:34
っつーかクラス使えよ
0955デフォルトの名無しさん2010/09/03(金) 20:29:14
>>954
別途 fileLoader::err() みたいな関数なり、専用の変数なりを用意するってこと?
0956デフォルトの名無しさん2010/09/03(金) 20:39:13
>>953
エスパー失敗したようですごめんなさい。

複数のファイル読み込みがトータルで成功したか失敗したかだけではなく、
どのファイルで失敗したかを知りたい?
でもそれなら失敗したファイル名を返せばいいだけだと思うし。。
0957デフォルトの名無しさん2010/09/03(金) 20:46:54
>>956
どのファイルで失敗したか? もそうですが、
IOのコストが高い(と言っても数秒ですが)ので、1つでも失敗した瞬間にエラーが返ってきてほしいなあと。

まあ、それに関してはマルチスレッドしろよって話なんですけどね。
0958デフォルトの名無しさん2010/09/03(金) 21:53:46
なんかこの流れ、どっかで見たような…
0959デフォルトの名無しさん2010/09/04(土) 01:57:53
>>957
失敗したら抜ければいいんじゃないの
擬似コードだけど、こういう構造のどこに不満があるのかを書いたほうがいいかも。
foreach (filename in filelist){
 if (fileload(filename) is failed)
  return filename;
 return nullstring;
}
0960デフォルトの名無しさん2010/09/04(土) 09:05:37
>950>957
オープン正否と、リスト読み込み正否を区別する必要はある?
読み込み失敗時点で終了すればよいのだったら、配列だから0から順番に読むことにして、
処理できたindexと、成功/失敗(失敗要因)を返せばイイと思うが。

途中で失敗しても、一通り処理したいのであれば、fileListに対応した処理結果を格納する配列を
渡して、値をセットする方がいい。
>951のようにfileListそのものに処理結果を含める方法もあるが、fileListと処理結果メンバにした
構造体にする方がベターだと思う。
09619502010/09/04(土) 10:58:47
遅レスすみません。

・ファイル一覧の配列を用意する(fileList)
・1回の呼び出しで1つだけファイルを読み込む
多少の変更は問題ないですが、以上の2つの仕様は前提条件のつもりです。

>>959
ですので、全部まとめるわけにはいきません。
別途、一括ロード関数を用意するかもしれませんが。

>>960
オープン成否と、読み込み終了とを区別する必要はあります。
自分用ライブラリ的なものを想定しているので、その区別を認識するかどうかは呼び出し側のコード次第で。


オープン失敗ファイルのリスト化など、とりあえず方向性(は見えてきたので、色々試してみようと思います。
ありがとうございました。
0962デフォルトの名無しさん2010/09/04(土) 11:49:24
sine
0963デフォルトの名無しさん2010/09/04(土) 15:05:27
質問よろしいでしょうか?

構造体の配列の初期化で
A_St(構造体型名) A[10] = { 〜〜〜〜 };
とやると
最初のA[0]のみ{ 〜〜〜〜 }の間の値で初期化されるのでしょうか?
それともA[9]まで{ 〜〜〜〜 }の値で初期化されるのでしょうか?
0964デフォルトの名無しさん2010/09/04(土) 15:08:46
>>963
いえ、明示したもの以外は0を入れた感じでで初期化され

POD型の話だよね?
0965デフォルトの名無しさん2010/09/04(土) 18:28:52
関数のプロトタイプ宣言についてなんですがこれは引数の変数名も書いたほうがいいですか?
今は無意味にこだわって型名だけにしているんですがなにかセオリーとか各々にする理由とかありますか?
0966デフォルトの名無しさん2010/09/04(土) 18:32:42
いつも定義からコピペしてるからそんなこと考えたこともなかったな
0967デフォルトの名無しさん2010/09/04(土) 18:37:30
変数名は書かない方が良い
0968デフォルトの名無しさん2010/09/04(土) 18:37:40
>>965
名前がないと引数順序分からなくね?
名前つけてればヘッダ見るだけで引数の順序が分かってありがたい
インテリセンス使うと名前のありがたみがさらに倍
0969デフォルトの名無しさん2010/09/04(土) 18:45:30
>>966
いや、それも無視できない理由の一つだと思います
コピペすることによって手間を減らせるし(というか削除が手間)不整合がそもそも起きない
>>968
ああ、それもありますね
今思うと無駄に順序を考えて関数を使用することがあったと思います

どうもありがとうございます
というかよく考えるとなぜ変数名を消すようになったのかよく覚えてません
>>965の質問を変更してプロトタイプ宣言から変数名を消すメリットってありますか?
>>967
それはなぜでしょう?自分にはメリットが分からなくなってます
0970デフォルトの名無しさん2010/09/04(土) 18:46:30
>>961
>>959は「ファイル一覧」「1回の呼び出しでひとつだけファイルを読む関数」
を利用した、一括ロード処理をする擬似コードだよね。

オープン失敗ファイルをリスト化するってことは、失敗したら即エラーを返したいという
要求からずれているように思うよ。
0971デフォルトの名無しさん2010/09/04(土) 18:56:29
>>969
消すとプロトタイプ宣言がスッキリするとか、仮引数名を変更した時にずれにくいとか考えていたころがあったなぁ。
今は消さなくなったよ。
0972デフォルトの名無しさん2010/09/04(土) 19:08:40
>>965
仮引数名は書いた方がよい
プロトタイプ宣言を見ただけでだけでその関数の仕様が理解できるというのが理想
自分の作ったライブラリを他人が利用することを考えてみればいい。あるいはその逆も。

ちょっと極端な例だけど
data_copy( void*, void*, size_t );

だけだと、どっちのvoid*にソースとデスティネーションを渡せばいいか混乱するかもしれない

data_copy( void* dst, void *src, size_t size );

ならdstにsrcがコピーされるってのがすぐにわかるだろ?
0973デフォルトの名無しさん2010/09/04(土) 19:12:41
構造体(具体的にはtime.hの struct tm)のポインタについて
1: int main( void ) {
2:   struct tm *t_st;
3:   get_time( t_st );
4: }
5: void get_time( struct tm *t_st ) {
6:   time_t timer;
7:   time( &timer );
8:   t_st = localtime( &timer );
9: }

最初はこのようにやってみて全然うまくいかず、いろいろ試しているうちに
3:   get_time( &t_st );
5: void get_time( struct tm **t_st ) {
8:   *t_st = localtime( &timer );
とすることでうまくいくようになったのですが、仕組みがよくわからなくなってしまいました。
てっきりget_time( t_st );で*t_stのアドレスが関数に渡されてlocaltimeで*t_stに
値を代入することができると思ったのですがそうではないのですか?
まずt_stにはアドレスが入ってるという認識は間違ってませんか?その辺も自信がなくなってきました
0974デフォルトの名無しさん2010/09/04(土) 19:17:06
値渡しを理解しろ
0975デフォルトの名無しさん2010/09/04(土) 19:18:49
>>973
main() の t_st は初期化されていないポインタなので何が入ってるかわからない。
また、引数への代入は呼び出し元に影響しない。 C++ の参照型を使えば話は少し変わってくるけどね。
もちろん、引数への代入と、引数が指す先への代入も別。

localtime() が返すポインタはちょっと特殊なんで、それがどういうものかマニュアルを
確認するといい。
0976デフォルトの名無しさん2010/09/04(土) 19:19:45
>>971-972
やはり分かりやすさなどを見ると書いてあったほうがいいですよね
どうもありがとうございます

>>971
>消すとプロトタイプ宣言がスッキリする
もしかしたらこんな理由だった気がする
0977デフォルトの名無しさん2010/09/04(土) 19:26:42
>>973
最初の例だと、確かに *t_st に値を入れることはできる。
だが、今やりたいのは t_st に値を入れることで、それには下の例でないとできない。
0978デフォルトの名無しさん2010/09/04(土) 21:39:34
>>973
これはひどい
0979デフォルトの名無しさん2010/09/04(土) 22:40:07
>>970
>前半
ああ、勘違いしてました。
提示された擬似コード全体を1つの関数とみなす(つまり関数の中身を書いた)のかと思っていました。

擬似コードではforeachを使って、ファイル一覧から1要素取り出していますが、
この部分も関数の中に突っ込んでしまえたらスッキリしそうですよね。

>後半
即エラー云々については要求仕様ではないので、ささいな変更であるとしました。
0980デフォルトの名無しさん2010/09/05(日) 00:20:28
このひとなんか変だ
0981デフォルトの名無しさん2010/09/05(日) 01:58:51
質問のための質問を繰り返してるな
解決への意欲が感じられない
09829732010/09/05(日) 14:38:38
>>974-978
ありがとうございます。もっと簡単なコード書いてデバッグしてみたりしてだいぶ分かってきました。
ポインタをもっと勉強してきます
0983デフォルトの名無しさん2010/09/05(日) 15:07:26
基本的にファイルの操作って、1バイトごとなんですか?
FILE構造体とかフレームワーク使った時etc
0984デフォルトの名無しさん2010/09/05(日) 15:21:42
>>983
どの操作かいってくれないとあれなんだが
基本裏でうまいことバッファリングされてるのであまり気にしなくていいよ

でもそこそこまとまって読んだり書いたりする人が多いと思う
主観だけど
0985デフォルトの名無しさん2010/09/05(日) 15:36:53
>>983
ライブラリ内部の話なら、適当にブロック単位で読んで操作することが多い。
ユーザーコードの話なら、byte単位で処理できないと色々不便だ。
ブロック単位で処理するときは、文字列なら正則表現でばばっとやったりするが、バイナリだとそういう機構は自作だろう。
09869832010/09/05(日) 15:47:14
>>984
100MBのファイルを1MB * 100個に分割したいんですね

それで、qt4のqfileってのを使おうと思っているわけですが
seek()の単位がバイトごと?なので
FILE構造体でも同じなのかな〜と思ったわけです
0987デフォルトの名無しさん2010/09/05(日) 15:59:16
>>886
stdioのFILEなら、一番単純な方法で、
FILE変数を2つ用意して一個を読み込みオープンしてもう一個を書き込みオープンして初期化する。
で、1mbのバイト配列を用意して、読み込み用からfreadでブロックで呼んで、書き込み用にfwriteでブロックを書き込む。
書き込み用をクローズして別名で再オープンして上記を繰り返せばいいと思う。
09889872010/09/05(日) 16:00:52
げ、安価間違えた。>>986向け。
0989デフォルトの名無しさん2010/09/05(日) 16:11:17
>>986
ひょっとしてファイル操作とかでの最小単位の話をしてるんだろうか?
その手の扱いでバイト単位以外聞いたこと無いな
09909862010/09/05(日) 16:14:42
おまえら、ありがとうな
もうっちょっと、自分で調べる事にする
レス数が950を超えています。1000を超えると書き込みができなくなります。