【初心者歓迎】C/C++室 Ver.73【環境依存OK】
1 :
// :
2010/05/21(金) 07:38:47
2 :
デフォルトの名無しさん :2010/05/21(金) 10:44:31
tan=y/xとしててx=0の時は場合分けしないといけませんか? x=0の時はどういう処理にすれば良いのですか?
>>2 fabs(x)>fabs(y) のとき y/x
fabs(x)<fabs(y) のとき x/y で計算しておいて M_PI/2 から引く
そんな貴方に atan2 じゃないの?
5 :
デフォルトの名無しさん :2010/05/21(金) 13:31:06
構造体型 構造体名前[] = { {a,b,c},{e,f,g},{h,i,j},}としておいて 構造体名前 [] = {{k,l,m},{o,p,q},}とすると0番目の配列から上書きされてしまいますか? 3番目と4番目に入れたいのですが[3]=;[4]=とわけて書かないといけないのでしょうか?
6 :
デフォルトの名無しさん :2010/05/21(金) 13:31:48
すいません。4番目と5番目です
x86のFPUのFPATAN命令もx=0の時を考慮している
>わけて書かないといけないのでしょうか? はい。 >上書きされてしまいますか? その前にfoo[3]の時点で死ぬ。 初期化の時点で要素数指定しろ。
配列や構造体のデータを{}を使った代入形式でまとめてセット出来るのは宣言時のみ。 宣言文と代入文は見た目は似ているけど、文法上は全く別要素に定義されている。
10 :
デフォルトの名無しさん :2010/05/21(金) 14:49:39
そうですか…ありがとうございました あばば
デストラクタで親のデストラクタに行くと親のthisポインタがずれる・・・なんだこれは・・・
デストラクタに限らず、基底クラスの関数を呼ぶときはそうでないと困るだろ
アドレスのオフセットもコンパイラが勝手に調整してくれてるわけよ ためしに適当に継承されてるクラス作ってstatic_castやってみればわかる
な,なおった... ありがとう
15 :
デフォルトの名無しさん :2010/05/23(日) 02:27:51
マジキチ 3時間くらいぶっ通しで悩んでたら原因がif( = )だった… エラー出ないのですか?
文法的に正しけりゃエラーは出ない
17 :
デフォルトの名無しさん :2010/05/23(日) 02:39:06
if(boolgata = true) だったのですが文法的に正しいのですか?
うん
== true こんなの書くなよ
警告レベルによっては警告は出るかもしれない まあ = true なんて不要というのは確実な話だが 今回はたまたまbool型だったに過ぎない話だな
21 :
デフォルトの名無しさん :2010/05/23(日) 03:45:26
true == も書くし、0 == も書くぜ
== true だろうが true == だろうが害悪にしかならない if (islower(c) == true) { ... } とか書いてハマるタイプ
false との比較なら問題ないとでも誰かが言い出しそうなんで念のためいっとくけど、 論理定数との比較がナンセンスなんだよ。
え?TRUE ==とか普通に使ってるんだけどダメなの? if (xxx) { ... } しか書いてない場合、意図通りに動くか不安なんだよな。。
26 :
デフォルトの名無しさん :2010/05/23(日) 04:53:49
マジキチすぎて全俺が泣いた if( fab(フトートの計算 )<=1/2)&&〜←バグ if( fab(フトートの計算 )<=0.5f)&&〜←成功 何故ですか?
0以外は全て真なのでTRUEやtrueとの比較は危険極まりない is系関数はその最たるもので、 is系用の共通テーブル参照→ビット演算で目的のビットを取り出す で実装される事があるので、真のときは1以外の値が返ってくるのが普通 Windows APIのBOOL型の値を返す関数も MSDNには「正常な時には0以外の値を返す」のように、必ず1を返すとは書かれない (GetMessageのような例外はあるが、あれはBOOLと言いつつ0,1,-1の3値を返す関数だから・・・) 1以外の値が返ってくる可能性は常に考えないといけない 真偽値と比較する癖を付ける1以外が返って来た時にハマる 危険極まりない bool型なら安全だろうけど、癖になってると他の型の値でもやる事になるはずだ
>>26 1/2 == 0
×fab
○fabs
×フトート
○float, フロート
29 :
デフォルトの名無しさん :2010/05/23(日) 05:00:56
>>28 マジですか!?
フロートと整数の分数を比べたら小数点が全て切り捨てられるってことですか!?
全然知りませんでしたorz今気付けて良かったです。ありがとうございました
1/2は分数じゃなくて整数演算。だから小数点以下は切り捨てられて、結果は0になる。 1.0/2.0なら浮動小数点数演算。結果は0.5になる。
31 :
デフォルトの名無しさん :2010/05/23(日) 05:06:53
そうなんですか…全く知らなかった… ほんとうにありがとうございました
33 :
デフォルトの名無しさん :2010/05/23(日) 09:42:30
bool型を返さない関数コールして、bool値と比較するなら バグ作ってるだけだべ
falseとの比較は安全だが == true の代わりに != false を使う事になって 二重否定でとても読みにくい
>>23 の予言が的中しました。まぁ、相当の高確率で当たる予想だけどねw
>>23 は「俺はfalseと比較してるから問題ないだろ!」という人に対するもので
>>34 とは根本的に違う
if(xxx) では文脈的にわかりにくいときだけ if(xxx != false) とする
それならたまになくはないな
39 :
デフォルトの名無しさん :2010/05/23(日) 16:42:53
std::stringのc_str()関数が返すポインタが有効なのはいつまでですか? 希望としてはそのインスタンスに対してなんらかの操作(結合とか)をするまでは有効だとうれしいんですが。 勝手にメモリが移動したりとかそんな挙動があったらイヤです。
非constメンバ関数を呼ぶまでは有効と保証されてる
かりに保証されててもレガシーコードに渡す一時的な値としての使い方以外はしない方が健全
関数作る時引数全部 std::string にしてんのか? 流石にそりゃないだろう
いいえ
文字列リテラルやそれ入れただけの定数を渡す事もあるんだろうし std::stringである事を特に利用しないなら 関数の引数はconst char*にした方がいいよ std::stringである事を利用したいなら別だが
46 :
デフォルトの名無しさん :2010/05/23(日) 21:10:01
c++でクラスで書かれたソースの関数を使いたいのですが Cではヘッダをインクルードして関数名を書けば使えたと思うのですが C++ではnewなどをしないと使えないのですか?
関数はnewしなくても使えるよ。そもそも関数はnewできない。
48 :
デフォルトの名無しさん :2010/05/23(日) 21:29:53
つまり クラス::関数名();でも使えるってことですか? newして 名前ー>関数()とするのとはどう違うんですか?
50 :
デフォルトの名無しさん :2010/05/23(日) 22:01:21
教えてください
いやです
53 :
デフォルトの名無しさん :2010/05/23(日) 22:22:46
試し方がわかりません
55 :
デフォルトの名無しさん :2010/05/23(日) 22:32:39
初心者ページもかなり読みましたよ プログラミングは2年やってますし
56 :
デフォルトの名無しさん :2010/05/23(日) 22:32:53
static メンバ関数
ここで中途半端な知識を身につけたら あとで正しく理解するのに苦労しそうだな
58 :
デフォルトの名無しさん :2010/05/23(日) 22:48:54
読んだことも使ったこともあるけど、何をやってるのか、どう違うのかわからないっていう
2年やってこんなことも分からないなんて、正直なところすごいかわいそうだと思った
60 :
デフォルトの名無しさん :2010/05/23(日) 22:55:57
業務5年以上やっても、fopenシラン奴もいる
61 :
デフォルトの名無しさん :2010/05/23(日) 22:56:00
だから聞いてるんじゃん
>>46 staticメンバならそのまま呼べる。そうでないならインスタンスを作成してから呼ぶ。
「普通」っていうのはたいてい「俺は」って意味のところを大勢に見せたいだけだよね。
標準で済む操作にOSのAPIを直で使って環境移行の手間を増やす馬鹿野郎は貴様か。
普通はそうだね
直APIだと、一般的にはパフォーマンスも落ちるわけだしね。 勘違いしてる初心者も多いけど ラップ(バッファリング)することによって システムコールの回数を減らす方が、 毎回呼び出すよりずっと処理が軽くなるから。
激しく亀レスなんだが、前スレ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とかにも反応する。 さすがに、ローマ数字や漢数字はだめだったけど…
>>68 モダンなOSなら自分でバッファリングしてるし
メモリマップトI/Oや非同期I/Oもある
標準ライブラリを使うのはパフォーマンスのためというのは間違いで、
単純に移植性のためだ
それと、Windowsではファイル名が固定の場合以外にfopen()使ってるプログラムは
全て糞と断定していい
71 :
デフォルトの名無しさん :2010/05/24(月) 13:23:21
Aのcppのファイルでexternした構造体があってグローバルで宣言して凄い呼び出す関数の中で初期化される Bのcppでグローバル位置で宣言するとA.objで既にあるので未解決のシンボルとエラーが出る Bのcppの使う関数の中で宣言すると通る なぜですか?それと、値はちゃんと入ってますか?
>>71 宣言と定義を含め、externするとか初期化するとか、用語の使い方が胡散臭くてよくわからん。
意味をよく調べて言いなおすか、ソース貼ったほうがいいよ。
73 :
デフォルトの名無しさん :2010/05/24(月) 13:40:40
ありがとうございました 全く同じ物を代入しようとしてたみたいです それで未解決になったのかはわかりませんが。
>>70 言いたいことは彼と一緒だと思うよ。直APIという言葉がうさんくさいけど、
その後を読めばAPI使ったほうが軽いといっているように見える
75 :
デフォルトの名無しさん :2010/05/24(月) 15:43:53
>>70 「カーネルモードへの移行」が、
単純な関数呼び出しより重い処理だと言う話だ。
OSのキャッシュとかは全然関係ない。
メモリ確保等でも同様。
76 :
デフォルトの名無しさん :2010/05/24(月) 15:46:24
常に非同期I/Oしか使わないとでもいうならともかくね。
は?お前らアホじゃねーの? パフォーマンスの話だろ? パフォーマンスが重要なら、 mmap()やwritev()やreadv()、sendfile()のような物が使えるときはそれを使う 当たり前だろ DBMSみたいなソフトウェアの実装でstdio使ってるとでも思ってるのか? Berkeley DBのソースでもよめや stdio使うのは移植性だよ
>>78 勿論有意だからこそ、本当にI/Oパフォーマンスが重要なところでは
誰もstdioなんぞ使わないんだよ
バッファリングしてるから速いって、アホか?
stdioバッファへの余分なコピーが「常に」発生するのがstdioだ
ポータブルなgetc()やらではマルチスレッド対応の排他制御までオマケつきだ
つまり、「ふつー」のアプリではstdio使うのが当然と言うことですね。 ファイルI/Oなんかよりも遥かにのんびりしたヒューマンI/Oがあるんですから。
それはそうと、 >それと、Windowsではファイル名が固定の場合以外にfopen()使ってるプログラムは これの根拠を知りたい。
>>80 Windowsではstdioは使っていいけどfopen()はダメ
>>81 ファイルシステムがUTF-16なのに、fopen()はUTF-16ファイル名を扱えないからだよ
>>82 ってことは、ファイル名が固定でなくても制限できればいいんでないの?
つまり、「ユーザに任意のファイル名を扱わせたいのならfopen()はダメ」ってことじゃない?
>>83 厳密に言えばそうなるかもしれんが、何かそこに重要な意味があるの?
糞と断じるには根拠に乏しいかと。 「ユーザに任意のファイル名を選択させておいてfopen()を使っているプログラムは糞」なら兎も角。 最初からそう書いていれば、無用な反発も避けられるし>81が質問する必要もなかった。
おまえら文字コードとかロケールとかどこで勉強してんの? 近所の大型書店走査しても参考書売ってねーんだけど
>>85 面倒くさい奴だな…
> Windowsではファイル名が固定の場合以外にfopen()使ってるプログラムは糞
と
> ユーザに任意のファイル名を選択させておいてfopen()を使っているプログラムは糞
は大した違いないだろ
後な、現実問題として、例えばユーザプロファイルディレクトリのような
ファイルシステム上重要なディレクトリも全てUTF-16で、
Windowsにおいて、それはプログラムが勝手に選べるものじゃないんだぞ?
Windowsでfopen()使ってるのは、Unix系のソフトウェアの手抜き移植か
オモチャだけだよ
>>86 MSDNとかmanとかで勉強してみてはいかがか
C++のクラスで int hogehoge::createHash( char *p, int size ) { //処理 } int hogehoge::createHash( ) { return createHash(data, size); } 見たいに、内部データのハッシュを返す関数と オーバーロードして任意のハッシュを返す関数二つを公開してるんだが これだとクラスが使われ方知ってない?とか言われた こういう書き方って駄目?静的にすればいいのかな
createHash(char*,size_t)はhogehogeの情報がいらないからメンバにしない createHash(const hogehoge &)にする staticかfriendにしなければ実装できなければそうするか、あるいはメンバcreateHash()にする
91 :
デフォルトの名無しさん :2010/05/25(火) 01:02:22
class A が class B のオブジェクトを作り、それがさらにclass Cのオブジェクトを 作るという関係があるとします。 これら、A,B,Cはフレームワークの提供する クラスで変更はしたくありません。 ここでAを継承したAA, Cを継承したCCを作り、CCからそれを作ったAAの仮想メソッドを 呼びたいと思います。 AAは1つのインスタンスしか作らないので、AA::instance()という スタティックメソッドを作り、それをCCのコンストラクタから呼ぶ様にしました。 AA, CCは元のフレームワークを少々カスタマイズした階層という感じです。 さて、ここで実際のアプリを書く時に、さらにAAを継承したAAAを書き、 それを書けばCCはAAAの仮想メッソドを呼ぶ様にしたいと思ったのですが、 static methodってvirtualに出来ない、よってAAA::instanceというものは書けない、 という事を知って詰まってしまいました。 何か別の手はあるのでしょうか?
>>91 AA::instance() を static じゃなくて virtual にすればいいんじゃないの?
93 :
デフォルトの名無しさん :2010/05/25(火) 01:51:03
>>92 AAのインスタンスが無い(もともとインスタンスを獲る為のメソッド)ので
virtualを呼ぶ為のオブジェクトがありません。
日本語で伝えられないならコードを書けばいいのに。
B、Cのオブジェクト一つ一つがAのポインタを保持すればいいだけじゃないか こう言うとメモリの事とかについて何か言い返してきそうだな
>>96 そう出来れば楽なのですが、制約事項としてB,Cは改変したくない。
結局、グローバルでは出来るのかなと試して、一応希望の動作をしたのが以下のコードです。
AAがA,CCがCから派生というのは省略。
// AA.h
class AA {
public:
AA();
virtual void doA(); };
extern AA *global;
// AA.cc
#include "AA.h"
AA *global;
AA::AA() { global = this; }
void AA::doA() { /* doA */ };
// CC.h
class CC { public: void doA(); }
//CC.cc
#include "AA.h"
#include "CC.h"
void CC::doA() { global->doA(); }
98 :
91 :2010/05/25(火) 03:02:50
で、この2つのクラスがある状態で (#include 略) main () { AA a; CC c; c.doA(); } とするとAA::doA()が呼ばれる. さらに class AAA : public AA { public: virtual void doA(); }; void AAA::doA() { /* doA */ } main() { AAA a; CC c; c.doA(); } とするとAAA::doA()が呼ばれます. これでAA* と CCの間にクラスBを挟んだ 関係があっても無関係にAA*とCCが結びつけられた. というのをstatic method で出来ないかと思ったのが91の質問でした.
>>97 なんで CC::doA() に引数で渡さないの?
>>98 じゃぁこれで。
template<class A> class CC { void doA() { A::doA(); } };
CC<AA> c;
CC<AAA> c;
101 :
91 :2010/05/25(火) 03:22:52
>>99 CC::doA()が呼ばれる文脈でAAのインスタンスへの参照が無いからです.
ここで書いたmain()は省略した見本でして、実際の実行環境の制限事項を
反映してません。
>>100 出来ればCCは1つのライブラリで済まし、AAから派生したAAA1, AAA2, AAA3
に対して1つのバイナリで済ませたいなと思ってます。CCの機能はそれぞれの
AAA*に対して全く共通なので。
103 :
91 :2010/05/25(火) 03:52:20
>>102 いや、出来てるんですけど、グローバルを使っていいのかな? もっとC++っぽい
やり方があるならば知りたいなと思いました。
>>103 既存のフレームワークとやらでメンバ変数経路は変更不能で、
呼ばれる文脈とやらも変更不能なんだろ?
そこに AA のインスタンスを渡す必要があるんだろ?
グローバル使う以外に何も見えてこないじゃないか。
105 :
91 :2010/05/25(火) 04:00:40
>>104 ありがとうございます。 そうはっきり言って頂いてすっきりしました。
106 :
デフォルトの名無しさん :2010/05/25(火) 08:21:14
C++で構造体を作ってクラスのprotectedのメンバに入れてクラスに他所のcppの関数中でその構造体にメンバが入るような関数を作った のですが「.」を押してもメンバ変数がポップアップされません これは上手く入ってないのでしょうか?
>>90 有り難うございます。
内部のcreateHashはclass独自の物ですが、中々優秀で他でも流用したいが為に公開していました。
一々、hogehogeを作成しメンバ設定、その後にcreateHashでは面倒に思えるのですが。。
今はstaticを付けていますが、今後は別の方法を試すべきでしょうか?
汎用ハッシャーを分離してモジュール化すればいいじゃない
>>108 有り難うございます
皆さんだったら、どのように書きますか?
是非参考にさせて下さい。
110 :
デフォルトの名無しさん :2010/05/25(火) 14:58:59
ウォッチしてる値がある値になった時にブレークさせるような方法はありますか?VC++2008EEです
112 :
デフォルトの名無しさん :2010/05/25(火) 15:34:41
operator .* (obj, func)でobjをバインドしたfunctionを返せば メンバ関数ポインタをエミュレートできるとおもったら.*はオーバーロードできねーのかよ ->*ならできるのにこの差別はひどい。がっかりだ
114 :
デフォルトの名無しさん :2010/05/25(火) 17:45:58
日本語で喋れやカス
115 :
113 :2010/05/25(火) 17:50:36
>>114 要約するとうるせーよ死ねカスってことです
116 :
デフォルトの名無しさん :2010/05/25(火) 17:53:44
日本語も喋れない奴にプログラミングは無理 これ、豆知識なお坊ちゃん
なんか必死な奴がいるな
>>114 阿呆な奴は
>>113 の言ってることを理解できない
君は
>>113 が言ってることを理解できてるのかい?
理解できているなら君が日本語で話してくれ
駄目だ
117が何を言いたいのか分からん
そんなことよりMoreC++Idiomの日本語訳を早く埋めてくれ。英文読むのめんどくさい
そういう仕様だから
>>124 operator.をオーバーライド可能にするとメンバへのアクセス手段がなくなるから、とかじゃなかったっけ?
で、operator.*も同じ理由。
D&Eにそんなようなことが書いてあった気がする。
. と -> .* と ->* こう見ると分かりやすいな
128 :
デフォルトの名無しさん :2010/05/26(水) 06:34:03
ファイルの名前を取得したいのですがどうすれば良いですか?
129 :
デフォルトの名無しさん :2010/05/26(水) 06:35:28
FindFirstFileですね。わかりました
130 :
デフォルトの名無しさん :2010/05/26(水) 07:27:41
charの配列があるのですが改行で区切られてる間の文字列を取得したいのですが getsかなと思って調べたら絶対に使うなとか書いてあるし、fgetsはファイルを扱う関数なのでどうすれば良いかわかりません 教えてください
>>121 インポート依頼が処理されずに止まったままなんだ。
133 :
デフォルトの名無しさん :2010/05/26(水) 09:11:35
>>132 ありがとうございます
fgetの一つ目の配列は取得した文字を入れる配列ですよね?
二つ目の引数のstdinは標準入力から取得すると見たように思うのですが、どうやって元の文字列の配列を選択するのでしょうか?
>>133 日本語でOK。
文字列から文字列を分解したいのか、(gets()のように)標準入力から文字列を得たいのか、どっちなのかと。
後者ならchar buf[DesiredSize]; fgets(buf, sizeof(buf), stdin);とすればいいし、
前者ならsscanf()かsprintf()で切り張りすればいい。
strtok(...,"\n") ただし、元の配列の中身は破壊される
136 :
デフォルトの名無しさん :2010/05/26(水) 09:42:50
>>134 >>135 ありがとうございます
strtokで\0を入れた後、それぞれを配列に入れる方法がわかりません
教えてください
目的がよく判らんが、改行でばらす程度なら破壊型でスレッドセーフでない実装もあるstrtok()は要らん。 尤も、sscanf()をどうしても使いこなせないならstrtok()を使うことを止めはしないが。
>>136 なんで自分がやりたいことの説明ができないの? 馬鹿なの? 日本人じゃないの?
139 :
デフォルトの名無しさん :2010/05/26(水) 09:51:26
もしかしてsscanfで"%s \n %d \n",str1,str2とすれば良いだけですか?
140 :
デフォルトの名無しさん :2010/05/26(水) 09:54:01
>>138 すません
やりたいことはchar 型の文字列があって\nがたくさんあって、ファイルで表示すれば1行ごとになるはずの文字列を取り出してそれぞれの行を違う配列に入れたいのです
ダメだこいつ。
142 :
デフォルトの名無しさん :2010/05/26(水) 09:56:14
できれば行が多くなった時に配列をたくさん作るのを避ける方法も教えて欲しいです
めんどくせーから C++ で iostream と string で getline() 使えよ。
まぁ、先ずは入出力をきちんと定義するところから始めようか。 入力は改行文字を多数含んだ文字列と言うことだが、それはいきなり渡されるということなのか? 要は、作ろうとしているのは関数なのかプログラムなのか、その辺りもはっきりさせてくれ。
145 :
デフォルトの名無しさん :2010/05/26(水) 10:51:01
関数を作ってるのではありません。関数の中でグローバルの変数である配列に改行を含んだ文字列を入れまして その配列から改行までの区間を何個か取り出して、違う配列に入れるなりして元の文字列のある行の文字の部分だけを新しい文字列として使いたいのです
147 :
デフォルトの名無しさん :2010/05/26(水) 11:00:42
>>146 なるほど、でかい配列を使いたくないのでfgetsなどでやるわけですね。
sscanfでできそうなので続けて見ます
strchr()で改行文字を探して、一文字ずらして行頭のリストを作れば事が足りそうなんだが。 つーか、なんでグローバル変数なんかにテキスト入れるのかねぇ。 相変わらず説明下手だし。
149 :
デフォルトの名無しさん :2010/05/26(水) 11:12:13
>>148 知識が無いので自分も何を伝えるべきなのかわからないのです
>strchr()で改行文字を探して、一文字ずらして行頭のリストを作れば事が足りそうなんだが。
>つーか、なんでグローバル変数なんかにテキスト入れるのかねぇ。
と当たり前のごとく言われても、どういう方法なのか、なぜグローバル変数にテキストを入れたらいけないか、普通はどうするのか、等、わからないのです。
やりたいことをきちんと説明できないからこそ、 弄られることになるし 詳しく説明してもらえないし 見当違いのレスを読むことになるわけで。 心穏やかに他人になった積もりで>145を読んで、 それで何をしたいか判るかね。
151 :
デフォルトの名無しさん :2010/05/26(水) 11:25:55
>>150 どこがわからないのですか?
自分は完璧に説明したつもりなのですが
そちらは知識が多すぎて混乱してしまうのかもしれませんが
いいからプログラム書け。日本語はこの際あきらめろ。
153 :
デフォルトの名無しさん :2010/05/26(水) 11:31:25
char str[]="fafafad\nfakfjak\nfakdfad\nfkajfk\nfjak"があって例えばnfakfjak\を取り出したいということなのですが
「なのですが」?続きはどうした?
155 :
デフォルトの名無しさん :2010/05/26(水) 11:37:42
これをchar str1[] = nfakfjak\; の状態にしたいのです
char const * str0 = str; char const * str1 = NULL; char const * str2 = NULL; char const * str3 = NULL; : : str1 = strchr(str0, '\n'); if (str1) { ++str1; str2 = strchr(str1, '\n'); if (str2) { ++str2; str3 = strchr(str2, '\n'); : : } }
157 :
デフォルトの名無しさん :2010/05/26(水) 22:15:52
ウォッチを見ていると配列の後のほうまで意味不明の文字が入ってたりしますが strcmpを使うとちゃんと一致したりします あれはどうなっているのでしょうか?
ナルまでを比較するので。
ナルェ
160 :
デフォルトの名無しさん :2010/05/26(水) 22:25:42
犠牲になったのだ
161 :
デフォルトの名無しさん :2010/05/26(水) 23:13:46
マジキチ defineの最後に;つけてたら一番最後の関数で)だの;}のエラーが出やがった 偶然気付かなきゃ一生やってるレベル
一生やってろ
>>157 デバッガの使い方はその開発環境のスレでどうぞ。つーか、Cの文字列の仕組みくらい勉強しましょう。
164 :
デフォルトの名無しさん :2010/05/27(木) 11:34:42
LPCTRとかが良くわからないのですがキャストしたらエラーが取り合えず消えるので全部キャストでも問題ありませんか?
LPCTRってなんだよ・・ LP: LongPointer(16bit時代は32bitポインタをLongPointerと呼んだ) C: Const T: Tchar STR: STRing これらを適当に組み合わせただけ
わかりにくいからTSTRCLPにすればいいのに
Windowsプログラムの場合は、適当にLPCSTRとか入れればいいよ 結構適当でも動く
C++ができれば他の言語なんて楽勝とかいうけどVBAムズイじゃん。使っててすげー気持ち悪い
変数のスコープを限定できない言語は難しい
VBA使ってみて配列の下限が自由なのは一見便利そうに見えるけどコードが汚くなるだけだと気がついた
173 :
デフォルトの名無しさん :2010/05/28(金) 09:15:30
FindFirstFileやfopen等、ファイル処理の勉強をしているのですが ファイル名を変更するにはどうすれば良いのでしょうか? ファイル名 変更 c++等とぐぐっても出てきません。方法を教えてください
>>173 検索の仕方が間抜け過ぎだろ。
「ファイル名変更」「c」で検索して3番目によると、rename()を使えとある。
循環参照を気にせず仕えるスマポってweak_ptrのようなカウンタを2重にもつ形式が一番手っ取り早いのでしょうか?
コードのシンプルさではカウントがいいかな newのオーバーヘッドを避けたいなら侵入型リストでもいい
std::vector等を自分のソース内でVector等と置き換えて書きたいのですが #define Vector std::vector と書く以外でいい方法はありますか
継承したりメタ関数を使ったり
>178 そのうち自作クラスと置き換えとか色々やってみたいので 差し替えが簡単なように書いておきたいのです >179 メタ関数というのは初耳ですが調べて試してみます ありがとうございました
クラスの所属するnamespaceじゃなくてstdにswapを追加するメリットってあるの? using std::swapをしらなくてstd::swapにしちゃうカスが同僚にいても安心程度のメリットしかないように思えるんだけど…
>>176 オーバーヘッドは気にならないからシンプルにいけるカウンタ方式がいいのだけど
weak_ptrと同様の実装をするとダングリングポインタの問題をどうにかしないといけないんですよねぇ・・・
>>182 stdにswapを追加したことはないが、std::swapの特殊化を明示的に行うことは多々あるな
繰り返し使うところは、stdつけたほうがいいな。他人も使うようなコードは。ライブラリ。 usingつかうと名前かぶる危険。 defineの置き換えもつかワン方が良い。 ただの置換のうえに、他のコードにも影響出る。
>>182 ないだろうな
stdの中をいじるデメリットの方が大きいと思う
特殊化するならメリットはある テンプレートのライブラリで値を交換するとき 通常(?)はstd::swapを使うでしょ 特殊化されていれば効率とか、例外安全性があがる可能性がある
189 :
188 :2010/05/28(金) 21:51:00
ごめん、質問ちゃんと読んでなかったわw
>>188 通常はstd::swapを使うってのは無いな
オブジェクトの型がプログラマにわかってるならドキュメントなりヘッダを調べて
メンバのswap
同じ名前空間のswap
stdのswap
の順番に明示的に書く
オブジェクトの方がテンプレートでコードを書いてる時には分からない場合は
TMPでメンバのswapを検索してあればそれを明示的に使う
見つからなければusing std::swap;して修飾なしのswap
メモリの確保量調べる方法はないですか。これはできないです。 char *A=new char [1000]; cout<<sizeof(A)<<endl;
自己解決しました _msize ヒープに割り当てられたメモリ ブロックのサイズを返します。
確保されているメモリ調べると[1000]でちょうど1000にはならないな。 わりといい加減に確保してくるな。
>>190 そんな手間をかけなくて済む(かつ、バグの温床に)ならないようにstd::swapを特殊化するわけだが。。。
気にせずstd::swapでかけるようになるんだよ。
>>194 関数テンプレートの部分特殊化ができれば全部それでもいいんだけどね
>>195 浅はかな俺を許してくれ。
つまるところがんばって書き分けないとダメってことになるのかなorz
>>190 std::swapを特殊化せずに、その検索をやってくれるのがusing boost::swap
usingいらなくね? boost::swap(lhs, rhs);
それはなかでusingしてるし
>>202 普通メンバswapがあったらフリー関数swapも作るだろ常識的に考えて
sin関数を使おうと#include <math.h>したのですが デバッグでウォッチを見ると 「sin(0.0) CXX0017: エラーです: シンボル "sin" が見つかりません」 となってしまいます、動作自体はしっかりしているようなのですが 気になりますので教えてください
たしかmathは何かのコンパイルオプションがいるはず
-lmのことか
>>205-206 ありがとうございます
恥ずかしながらコンパイルオプションの追加の仕方がわかりません...
プロパティ->リンカ->コマンドラインの追加のオプションで-lmとしてみたのですが検討外れのようです
visual C++ 2008 EEを使用しています、繰り返しお願いします
ああ、デバッグのウォッチか ウォッチに関数は使えないぞ
数学関数くらい使えるようになって欲しいとは思うんだけど 何で使えないのかねえ
>>208 あれ? VC++ だといろんな式の評価ができたような?
そこに fopen() とか突っ込んで嵌ってたこともあったり。
夢だったのかもしれん。
公開されているライブラリは スタティックリンクライブラリ ではなく ダイナミックリンクライブラリ(DLL) であることが多いいです、なぜ? それぞれのメリット・デメリット教えて欲しいです 自分はいつもスタティックリンクライブラリにしているので気になりました
関連アプリを全部ビルドしなおすのがめんどいから。 あと関連アプリが全部ちょっとずつ大きくなるから。
dllで公開する関数って引数にintとか使ったらintの長さが違うコンパイラだとまちがいが起こるかもってことだよな?
コンストラクタで引数を取って その引数と同一の値で生成されたインスタンスが既に存在する場合にはその参照を返すような 引数の値に対してインスタンスの数が必ず一つであるような仕組みをどう構築したらよいでしょうか?
>>216 flyweight+handlebody
ハンガリアンなんて今更、とおもいつつも ポインタとメンバ変数と大域変数だけは気になってプリフィックス付けてしまうのだが 逆に中途半端で気持ち悪い気もする・・・ 今後はプリフィックスをつかわなくても解りやすい命名に変えて言った方が良いのでしょうか?
>>218 メンバ変数と大域変数は型の間違いと違って
コンパイラでの検出がされにくい場合があるのでつけるのもありという論がある
ポインタの場合、ポインタとそうでないものを区別して認識しながら書かなきゃいけないって
やり方自体がそもそも、ミスの元といえる。これは理想論すぎるかもしれないが
>今後はプリフィックスをつかわなくても解りやすい命名に変えて言った方が良いのでしょうか?
もしこれが、g_の代わりにglobal_みたいにするとかいう意味なら
ハンガリアンが叩かれる意味を理解してないと思われる
VisualStudio2005を利用しています C#でいう#regionを代用できるものはC++にありますか?
template <typename T>class Hoge{ private: int a; public: template<typename T2> void foo(Hoge<T2> &src){ a = src.a; //ダメ } } この処理をaのGet関数などを使わずうまくこなす方法はないでしょうか?
>>223 これをやろうとするとprivateメンバへのアクセスが出来ないとエラーをはきます
当たり前といえば当たり前なんですがうまく回避することは出来ないでしょうか・・・
>>224 friend
質問するときはエラーが発生するコードとエラーメッセージを忘れるな。
>>225 friend関数にしてしまうと
this->a = src.a;
のような操作が出来ないのでは
自身を引数に渡すように引数を追加するしかないのかなぁ
とにかくやってみるとして
template<typename T2>friend void foo(Hoge<T2> &src){
としたら
error C2995: 'void foo(Hoge<T> &)' : 関数テンプレートは既に定義されています
となってしまいました、どこで間違えたのでしょう・・・?
>>226 friend はメンバ関数も指定できる。
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; };
質問です。 VS2008にて、setのfindを使い if (hoge.end() != hoge.find(a)) とやると、STLのxtreeファイルの中で map/set iterators incompatible というエラーを出しASSERTされてしまいます(デバッグモードなので) 使い方が間違っているとは思えないのですが、VSのSETのfindは使えないのでしょうか・・・?
>>229 すいません、自己解決しました
if (hoge1.end() != hoge2.find(a))
こんな感じのことになっていました・・
tan2 多分
>>232 ,233
atan2()ですね
ありがとうございました
そうそう
りゅうび
積分を行う関数を以下のように作りました。 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によらない)で積分するような場合です。
hってどこから出てきたんだ?
単に f(x,y,z) = (2+y) g(x) + z h(x) g(x) = x h(x) = 1 と考えて、g と h を x で積分すればいいだけでしょ (2+y) も z も単なる係数なんだし あと、ループが非常にあぶなっかしい ループ変数は整数の変数にすること 数値誤差で端が入らない事がある
>>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 >ループ変数は整数の変数にすること
>数値誤差で端が入らない事がある
そうなんですか、気をつけます
>>239 そのfを使うのは無理やね
>>240 にある通り、係数を分離して各項で係数以外の部分を積分するしかない
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しないとメモリリークが発生するのでしょうか?
GdiplusShutdown()の説明に -- You must call GdiplusStartup before you create any GDI+ objects, and you must delete all of your GDI+ objects (or have them go out of scope) before you call GdiplusShutdown. -- とあるね。
245 :
243 :2010/06/07(月) 13:00:06
>244 返信ありがとうございます。 おかげですっきりしました。次はリファレンス読んでから質問することにします。
スコープガード的な用途に使いたいんですが、生ポの所有権を無理やり奪えるタイプのスマポって標準かboostに在りますか?
>>247 あ、説明足りませんでしたね
sumapo<int> s(new int);
int *p = std::move(s); // sの中の生ポがpに移動、sの中身はnullptrになる
こういう事がしたいんです
>>248 std::auto_ptr<int> s(new int);
int *p = s.release(); // sの中の生ポがpに移動、sの中身はnullptrになる
デストラクタ呼ばれるんじゃ?
release()は所有権を放棄するだけでデストラクタは呼ばれない。
まじかよ めちゃくちゃ便利じゃねえか
>>249 サンクスです。auto_ptrってめったに使わないからreleaseメソッドの存在に気づきませんでした
>>252 さあ洗濯バサミとunique_ptrの有能さに気づくんだ
unique_ptrは削除子が静的だから物足りない
>>255 std::unique_ptr<T, std::function<void (T*)>> で動的にもできるんじゃね?
なるほど これはそう使うのか
>>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; }
fack
>>258 まずいよ。
でもそれは boost::shared_ptr の動的削除子を使うときでも同じことでしょ。
shared_ptrはデリータのクローンに失敗してもちゃんと後始末してくれるよ
>>261 それだとunique_ptr自体もエクスポートしないといけないんじゃないか。
>>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)
ほとんど関数かキャプチャなしのラムダでしょ アロケータ内蔵するにしても大抵の場合staticか共有ポインタで所持する 機能的には有用だけどコピーで例外から逃れられないデリーターなんて存在するのか?
C++のコピーコントラクタってfooクラスに、 foo(const foo&); って宣言しておけば、 foo b; b = a; ってすればfooクラスに定義されているポインタオブジェクトもディープコピーされるの?
いいえ
>>266 メモリじゃないリソースを突っ込みたくなったときはcloseに失敗することもあるかもしれない
>>268 ダメなんですか。ありがとうございました。
もっと調べてみます。
あ、そういうことじゃなかった。 デリータのコピーに失敗することがあるかどうかだもんな はずかちい
DLLで関数を通じてPODの遣り取りをするとするじゃん PODのアライメントとかを揃えるためにpragma pushをしろと言われたんだけど pragmaって移植性ないじゃないですか なのでpragma無しでPODの移植性を確保したいんですけどどうすればいいですかね?
そのDLLはWindows以外でも動作するのかね?
本当にpragma pushが要るのかね?
スマポの削除子ってテンプレート関数ボインタでよくね? って思ったんだけとクラスにしてるのは 何か理由あるの?インラインさせりため?
DLL から OS Windows を想定すっけど pragma pack で他環境(VB etc.)にも対応可能なアライメントで固定化汁という意図か?
>>263 関数だけで大丈夫くさい
変数に入ってるアドレスをcallしてる
>>275 デリーターが関数オブジェクトかもしれないから
280 :
279 :2010/06/12(土) 18:49:37
\nを入れて味噌
画像で出てくると思わなかったよ
今度はテキストで貰ってきてくれ、なの
int main(int argc, char *argv[]) で、プログラムを実行するとき引数に英1文字AかBかCかDが指定できるとして、 A,B,C,D以外が入力されたときにエラーを表示するための if文の条件文の書き方が分かりません。 if(argv[1] != "r") とすると、引数に何を入力しても該当してしまいます。 どうすればいいでしょうか
書き間違えました、 if(argv[1] != "A") です
>>287 それは文字列へのポインタの比較なんで文字列の中身の比較ではない。
文字列の中身の比較はstrcmpを使う
気持ち悪いけど if (strcmp(argv[1],"A")&&strcmp(argv[1],"B")&&strcmp(argv[1],"C")&&strcmp(argv[1],"D")) こっちも気持ち悪いけど if (strchr("ABCD",argv[1][0]))
C++ならこうか std::string a(argv[1]); if((a!="A")&&(a!="B")&&(a!="C")&&(a!="D")) { }
>>289 前者はオプション文字列の長さが1である必要があるのに、
後者はオプション文字列の長さをチェックしていない。
いっそ、これでいいのでは?
if (argv[1][0] != 'A' || argv[1][0] != 'B' || argv[1][0] != 'C' || argv[1][0] != 'D' || argv[1][1] != '\0')
292 :
286 :2010/06/12(土) 22:05:20
皆さんありがとうございます。 "A"がポインタであること、'A'と"A"が違うということが分かっていませんでした。
結局分かってないし何度もすみません・・
>>291 で書くと、引数をAで実行しても該当するようです。どうしてでしょうか
\0のところがいらないんじゃ… 間違ってたらスマソ
なんだかんだ言ってエバーはやっぱ面白いなぁ
296 :
286 :2010/06/13(日) 00:56:43
if (argv[1][0] != 'A' || argv[1][1] != '\0') とすると、うまくいきます。'A'以外を入力すると実行されます。AAと入力した時も実行されます。 ですが if (argv[1][0] != 'A' || argv[1][0] != 'B' ) とするともう何を入力しても実行されるようになってしまいます。 環境が悪いのでしょうか・・?orz 言語はCで、linuxでgccを使っています。
今は高校で論理学ってやらないんだっけ?
条件をよく見ろ 'A'以外 ま た は 'B'以外 だから何入力してもtrueに決まってる
ぐはっ ありがとうございます。失礼致しました;;
DLLを作るのも使うのも全部WINDOWS→リトルエンディアン って認識でいいの?
>>302 俺もintelだけ、といわれるとなんか変な言い方だなぁとは思うけれど。
互換性があるという言い回しにした方がお気に召しますか?
IA-32と言えば何も問題は無かったのに
要するにDLL作るときにエンディアンも気にしないといけないんですか
大丈夫、エンディアン以前にプラットフォームが違っていれば動かない。
>>306 お前は何を問題としているかわかってない
Windows上でエンディアンを気にしなきゃいけない状況って ・ネットワークを使う ・クロスプラットフォームを考慮(cygwin等) ・他ハードをエミュレーションする くらいしか思いつかんが。
int array[N]; のarrayは&array[0]と同じって本に書いってあったんだけど で、多重配列 int mulary[N][M][][]...[Z]; の時のmularyは何と同じになるの? &mulary[0]? &mulary[0][0][0]...[0]? .... で、なんでそうなるの?
不思議なことにどれをやっても同じなんだよ そういうふうにメモリ配置されてるから
>>309 多次元でも関係ない。
array が &array[0] と同じように、 mulary は &mulary[0] と同じ。
>>311-312 どもども。
何で配列名が&array[0] 、 &mulary[0]になるように決めたんですか?
>>313 printf(&"Hello World"[0]);
とか書きたいか?
>>313 決めたっていうかその表現にある通り、単に配列要素の先頭のアドレス拾ってるから
同じになるってだけじゃね。意味わかれば別に悩む所じゃないぜ
&*(array+0) と &array[0] が同じということを知れば arrayが特殊でないことが分かるはず
「クラス名::」で呼び出せるものは静的なもの、 「クラス名.」で呼び出せるものは動的なもの ってことで、おk?
クラス名::hoge インスタンス.hoge
class A { public: void func1() {} void func2() { A::func1(); } static void static_func() {} }; A a; a.static_func();
323 :
デフォルトの名無しさん :2010/06/23(水) 02:18:51
ある変数(10桁)の 1の位: 10の位: 100の位: 1000の位: ・ ・ ・ ってな感じで出力する簡単な計算式教えてください おねがいします
10で割ったあまりを出力して、 変数を10で割ったものを変数に代入する というのを繰り返す
325 :
デフォルトの名無しさん :2010/06/23(水) 02:36:38
排他処理ってどんなふうにやればいいんですか
環境も書かずに排他処理とな?!(AAry
セマフォ、ミューテックス、クリティカルセクションでぐぐれば解る
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();
途中で送信してしまいました
ググったら
>>329 のようなものが出てきたんですけど
これでいいんですか?
331 :
330 :2010/06/23(水) 23:43:36
環境はWin7 VC++です
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です。
Windows APIの構造体のやつならSetRect関数
配列の要素数を標準入力cinで入力することは出来ないでしょうか? int num; cin >> num; int test[num]; 「定数式が必要です」と出て失敗します 何故だ…
>>334 配列の要素数に変数を使うことはできない
定数じゃないと
そういうときはnew使うとかvector使うとかしないと
定数式が必要です、って言われて何故だとかメッセージを読む能力なさすぎだろ
初心者歓迎って書いてるから、ま、あまり目くじら立てるなよ。 きっと、変数と定数の区別がまだつかないんだよ。
おしえてください!俺は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); ・・・・・・ }
>>338 の続きです
といった感じで格納を続けていくようにしました。
グローバル変数yはcsvファイルの読み込む列の数についてで、先に取得しています。グローバル変数xは150とプログラムの一番最初にdefineで書いています。
これを実行すると途中でプログラムに問題が発生して強制終了してしまいました。
間あいだに、printfで構造体の中身を含め、ループ中をチェックをしていたのですが、
yが74あって、取得したいcsvの列が0から73までのとき、途中の列までは無事に格納されていたのですが、
iが57までループを繰り返し、インクリメントされた後、何故か1に戻っていました。
そのため、終端に来る前にcsvの方が終わってしまい、強制終了するのだと思います。ループが73列目の格納作業まで終えて、74列目を読み始めて強制終了するみたいです。
初心者なので凄くおかしなことを言っていたり、
説明不足で、これだけの文では分からないかもしれませんが、なにとぞご回答頂きたく存じます。
>>333 その名もズバリな関数があったんですね。調べ方が未熟でした。
無事綺麗なコードが書けました。
レスありがとうございました。
>>341 csv読み込ませるとnum周りのスタックが破綻したって出たな
配列の大きさを大きくしたらとりあえずエラーは出なくなったけど…
ttp://codepad.org/dNFSlvxj これはGUIで作った方が分かりやすい気がする
ちょっと文字数オーバーしたら落ちるし
C++あたり勉強してstd::stringとか使った方がいいんじゃないか
c++の命名規則の例が詳しいサイトとかないでしょうか?
>>343 細かく見ていただき大変ありがとうございます!!
色々と自分のプログラムの汚いところがスッキリしてて驚きがあって感動してます。
ただ、自分がwinでvisiual C++2008のコマンドプロンプトからclでコンパイルしていたものを、
ちょっとした都合でwinがネットに繋げられなかったでの、
人のmacのxcodeに送ってそれを
ttp://codepad.org/ にコピペしたためか、
今winでclでコンパイルすると色々とエラーが出てしまって・・・、上手くいってるか直ぐに分からないです。
すみません。
対処法も教えていただけましたし、色々手も加えていただいたので、winにあるものとしっかり見比べて、理屈の理解をしていこうと思います。
C++も勉強してみたいと思います!!
ありがとうございました!!!
組み込みCでタスクの単体試験がしたい。 内部で状態が変わるようなタスクのテスト項目が思い付かない。
単体試験は単体でするもの、組み込んでするのは別の試験。 内部で状態が変わっても影響ないならNOPにしとけ〜。
別にcodepadに貼らなくても自分の所でgcc + MinGW4.5.0でコンパイル すればいいやん あ、ソースを晒すためか
すいません int** aはどういうことでしょうか? int* aならポインタ宣言と分かるのですけれど**が2個付くのは意味があるのでしょうか?
ポインタのポインタってことだ COMとかでインターフェースのポインタをもらうときとかに使うな
>>349 ポインタのポインタ
int a;
int* b = &a;
int** c = &b;
といった感じでポインタ変数をさらに指し示せる。
関数から(戻り値以外の方法で)ポインタ値を返す時に使われるな。
引数なしローカル変数なしの再帰関数を作ったとしたら、これはどこまで再帰してもスタックオーバーフローを起こさないって考えていい?
末尾再帰が最適化されたらそうなるだろう。 が、もし最適化されなかったらリターンアドレスを積みまくって死ぬから、 オーバーフローは起こると考えたほうが安全。
>>353 戻ってくる場所をスタックに積むからいつかスタックオーバーフローを起こす
サンクスです おとなしくループ回すでござる・・・
質問させてください。 参照カウントで管理するオブジェクトを作ろうとしています。 これは自動変数として確保されたくないのでコンストラクタをprotectedにして、 staticなオブジェクト生成用のメソッド(Create)を作ってそこでnewしています。 ただこれではクラスを継承するたびにサブクラス側でもCreateと同等のメソッドを用意しなければならなくなってしまいました。 これが結構面倒に感じています。 何かスマートな実装方法はないでしょうか?
359 :
357 :2010/06/27(日) 05:42:25
>>358 ありがとうございます。
リンク先のものが使えそうです。
ちなみにFactoryパターンでググったらFactoryMethodとAbstractFactoryが出ましたがどちらでしょうか?
初歩的な質問ですが、教えて下さい。 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」と置き換えようとしたのですが エラーが発生しました。
>>361 hoge[100]と宣言した配列で使えるのはhoge[0]からhoge[99]まで。
っていうのはともかく、代入したいのは文字列だから、strcpy()を使わないと
strcpy(okini[a - 1][0], "x");
>>362 ありがとうございます。
大変申し訳ないのですが、strcpy()はまだ習っていません。
他に何か方法はありませんか・・・?
>>364 どうもありがとうございました。
そちらに行ってみます!
恐ろしい物を見た気がする 何がやりたいのかはっきり言って分からない
なんだこのインデントの数は これはC以外の何かだ
何なんだこれは IOCCCにでも出すつもりか
この文章の中にと書いてるが 何も文章を入力してないんだよな これはなかなか歯ごたえがあるぜ
373 :
370 :2010/06/28(月) 23:51:22
すいません、環境はFreeBSD 6.0です。
374 :
デフォルトの名無しさん :2010/06/29(火) 00:38:37
ここで質問させていただきます。
http://upsurusuru.hp.infoseek.co.jp/cgi-bin/src/up5422.txt このtxtにプログラムの一部を書いています。
このプログラム内で
for(int i=0; i<n; i++){
fin >> a >> b >> c >> d >> e;
txt[i].setdata(a ,b ,c ,d ,e);}
としたあと
double test(Person txt[], int n)
{int sum = 0;
double te;
for(int i=0;i<n;i++){
sum = sum+txt[i].setdata;}
te=sum/n;}
ここへtxt[i]を送り、txt[i]の中からdだけを取り出したいのですがどうしたら良いでしょうか?
助言お願いします
Personクラスの定義ぐらい書けや
376 :
デフォルトの名無しさん :2010/06/29(火) 01:08:09
>>374 簡単に言うとprivate変数のdをいじくれないからメンバ関数serdata()から
dを引き出したいって事?
それはあまり綺麗な設計じゃないな
dだけアクセサ作ったら?
double Person::dvalue() const { return d; } みたいな
それは嫌なのかな?
もしアクセサを作ることでどこからでもdを参照できるようになるのが嫌なら、 関数test()をPersonのfriendにすればいいじゃない friendってそういう風に使うんだぜ
379 :
デフォルトの名無しさん :2010/06/29(火) 02:03:51
>>378 それをやってみます。
回答ありがとうございます。
うん
friendよりstaticメンバー関数にしたほうがきもちいいと思うんだがどうか
>>381 それだとthisが渡されないから個々のインスタンスのdをいじれないぞ
txt[]で渡してるじゃん
384 :
デフォルトの名無しさん :2010/06/29(火) 12:21:34
>>383 ああそういう事か
それならいいかもね
>>384 ちょwwSTL関係のエラーコード貼るな
貼るならSTLFiltとかで整形してから貼れ
それより肝心のソースコードは?
386 :
384 :2010/06/29(火) 13:13:36
>385 コードは>384の1行目です。 STLFiltはちょっと調べてみます。
>>386 取り敢えず気が付いた事を一つだけ
ポインタをソートしてるよ
実体をソートしたいなら比較叙述関数を作るか関数オブジェクトにして与えないと
>>384 ポインタの順序付けは実体の順序付けと関係ない。
実体の順序付けを使うように比較関数を作って渡せ。
あとは gcc じゃなくて g++ 使ってみな。
こういう時はBoost::lambdaとかC++0xのラムダ式がとても役に立つよな
391 :
384 :2010/06/29(火) 13:43:54
392 :
384 :2010/06/29(火) 13:45:50
>389 >391のレスをしてから気付きました。 どうもありがとうございます。
delete しとけよ。
参照はがしできるなら剥がしてからファンクタに渡すラッパー作っとくと便利
コマンドプロンプトで 関数に0個の引数を指定できません fatal error U1077 : C:\Program Files\Microsoft Visual Studio 8\VC\BIN\cI..EXE : リターンコード0x2 と表示されたのですがどーゆーことでしょう? もしスレ違いだったら申し訳ありません
コマンドプロンプトでなにしたんですか
環境非依存で整数型のビット長を調べるメタ関数は有りますか?
sizeof(IntType) * CHAR_BIT メタ関数は上式で自作しなさい。
質問させてください。 c++プログラムの中で、既に存在する.exeファイルを実行して、 標準出力へ返ってくるはずの返り値をC++ソースの中で変数に格納したいのですが、 どのような書き方をすればよいでしょうか?? 教えていただけると幸いです。
>>399 環境に拠るが、popen()ではどうだろう。
>>398 それが表現ビット長と一致するとは限らないんだぜ
std::numeric_limits<IntType>::digits + std::numeric_limits<IntType>::is_signed
が正しい
整数型の実ビット長が表現ビット長と一致しない環境ってある? そりゃ非PODだったら違ってくるだろうけど。 規格ではどうなってるんだろう。
質問です。VC++2008EEですがソース分割の仕方がいまいち分かりません。簡単に組んでみたところエラーが出てしまいました。
>1>sub.obj : error LNK2005: "class c_Sub Sub" (?Sub@@3Vc_Sub@@A) は既に main.obj で定義されています。
>fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
どこが間違っているのかご教示お願いします。
ttp://codepad.org/niRaaCvJ
>>404 どうもです。
14行目を } static Sub; とすることでリンカ通りました。(これでよいのかも今一分かりませんが…
staticじゃSubの実体がいくつもできちまうじゃねえか。 だからグローバル変数はヘッダではextern宣言して どれかcpp一つで実体を定義しろっつーの。
>>407 >Intelのi686をターゲットとするGCCでは、long double型の有効ビット幅が80ビット
FPU に80bitで数値を渡す(スタックに積む)命令はあるのだろうか?
tbyte ptrで行けない?
AT&A記法ならfstpl
411 :
410 :2010/07/03(土) 14:00:45
方向逆の上lじゃなくてtだった fldt
412 :
デフォルトの名無しさん :2010/07/03(土) 15:00:00
templateはコンパイル時に型が代わるってことでおk?
型が変わるというか、"型ごと"(←重要)に生成される バイナリが肥大化するから気をつけて
さんくすっす わかったっす
415 :
412 :2010/07/03(土) 16:48:13
いえいえ
ふと疑問に思ったので教えてください。 例えば、x=7,y=5,z=9のとき、 a=__min(__min(x,y),z); と書いても実行可能で、aに5が代入されますか?
実際に試せない環境にでもいるのだろうか
標準マクロのminでええやんと思う 代入されるかどうか、という話はyes (__minがちゃんと定義されているならだが)
>標準マクロのmin えっ・・・?
>>421 ありがとうございました。
超初心者ゆえに個人的な制約が色々あるわけです。
windows.hやkernel.hに含まれてるmin/maxマクロはC/C++標準ではありませんよ…
stdの方はマクロじゃないよな
PNGといえばlibpngのように、 Bitmapの読み書きをするクロスプラットフォームな デファクトスタンダード的なライブラリがあれば教えてください。
初歩的な質問ですみません #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のアドレスを渡しているんですか そもそも文法的に正しいのですか 普通に動くので困ってしまいました
参照だもん正しいよ
いや、本当はポインタ使いたかったんですが 気が付いたらこんなのになってしまいました
ん、なんで動くんだ
参照を渡している 内部的にはアドレスを渡しているかも知れないしそうじゃないかもしれない とりあえず文法的には合ってる
433 :
430 :2010/07/04(日) 20:19:33
参照を渡してたら、*po=*po*2としないと行けないんじゃないか?
それはvoid calc(int *po);の場合。
>>433 CじゃないC++だ。
C++では参照とポインタは別物
436 :
430 :2010/07/04(日) 20:27:54
そうなのか、横からスマンかった。
あれ、それじゃあこれはC++の文法ですか? てっきりCのものかと
C++が使える環境ならC++勉強したほうがメリットあるぞ。
439 :
デフォルトの名無しさん :2010/07/05(月) 07:23:05
440 :
デフォルトの名無しさん :2010/07/05(月) 13:30:44
C言語です unsigned char buff[] = { 0x01, 0x1A, 0x00, 0x3F }; char str[256]; strの中身を"011A003F"としたいのですがどうすればよいのでしょうか
sprintf(str, "%02X%02X%02X%02X", buff[0], buff[1], buff[2], buff[3]);
strcpy(buff, "011A003F");
>>441 ありがとうございました
sprintfの使い方は目からウロコが落ちました
質問の仕方が悪かったみたいです
>>442 さんには余計な手間を取らせて申し訳ない
#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
派生クラスが初期設定で基底クラスに「*this」という値を渡していたのですが、 「this」なら派生クラスのアドレスですが「*」が付くと何になるのでしょうか・・・?
CRTPかな? 値か参照だけど、多分参照。
C言語でMySQLを制御したいのですが、どうしたら良いでしょうか
なんか変数へのアクセスはアクセサ関数を使って〜と杓子定規にいわれるけど C#でいうところのプロパティ的なモノはpublic変数でも良いのかなと最近思うようになったが アクセスレベルを設定できないからそれはどうかな?とも思う やはりちょっと見た目が悪くなるけどアクセサを使うべきなのでしょうか?
アクセス制限以外のアクセサ関数のメリットとして、 仮に内部実装が変わっても(例えばintだったのがdoubleになっても) 関数でラップしとけば呼び元に影響しない、とかもある でも個人的には、よほどリスクがあるのでなければ 変数の方がすっきりしていい
>>450 変数は隠蔽するのが基本。公開すると変数の使用方法が統一できずバグだらけになりやすい。
変数と1対1にアクセサを作った場合は変数を公開したのと変わらなくなるのでよろしくない。
>>450 > なんか変数へのアクセスはアクセサ関数を使って〜と杓子定規にいわれるけど
いや今の時代は言わないよ。
逆に、あるクラスのメンバを全部パブリックにするという
ノーガード戦法もあるが、それが有効なこともたまにある。
まあ単に変数をまとめたいだけの時だけどね。
普通は、クラスはちゃんとしたinterfaceとなるメンバ関数を持っていて、
使い方を知るのに内部構造を知らねばならないような
クラスはクソ設計と言われる。
まあ現実は納期とかあるからやむをえずクソ設計になっちゃうこともあるけど。
>>450 先にクラスの外部インターフェースを考えろ。
メンバ変数ありきで関数を作ったりしてる限り、見た目がどうとか以前に糞クラス確定。
要はケースバイケース 抽象化したい場合はメンバ関数経由にすればいいし 実装が固定なら直接アクセスすればいい
設計不足の言い訳ですか?
全てはインタフェースについて記述せよと、 かのエリック・ガンマ先生も言っておられてだな
存在しないメンバを呼ぼうとしたら見つかるまで暗黙変換してくれればプロクシ作りやすくて便利なのに
#define Q_D(Class) Class##Private * const d = d_func() こんなマクロがあったのですが、##Privateはどこから来ているのですか? また、ClassってのはClass Tの省略形ってことでおk?
トークン連結でググれ
465 :
461 :2010/07/13(火) 22:57:35
ここまで俺の自演
ヘッダファイルで変数は「m_」という名前から始まっている場合が多いですが、 GUIプログラミングの場合はボタンやラベルも「m_」から始めていますか?
俺はm_btnAddとかやってるな
>>467 「m_」は「クラスのメンバ変数」って意味だと思うぞ。
なので、ボタンやラベルを指す変数がクラスのメンバ変数ならやはりm_を使う。
ちなみにメンバ変数にはうしろに _ をつけるという流儀もある 何にもつけないというやり方もある
C/C++(C#が扱えればなお嬉しい)が使えるIDEで UMPC(ATOM/メモリ512MB)程度のスペックのPCでも実用に耐えるようなモノはないでしょうか?
VC6
VC6っていま手に入ります・・・?
VC6 は C++ じゃないので論外。
メモリ512MBってのが厳しいな EeePCのメモリ2Gに増設して使ってるが、コード書くだけならVS2005でもそこそこいけてるな
>>475 ビルドとかしなければ使えそうですか?
それなら移動端末に買おうと思うのですが
それだけの用途でなんでIDEが欲しいの? C#が主目的なら分からなくもないけど、別に携帯のメモでいいじゃんって思っちゃう。 擬似コードメモるだけで十分だよ。
入力補完が欲しいんでないの
馬鹿は大変なんだね。
externとグローバール変数の違いがよくわかりません どのようにちがうのですか?
externは他のソースコードに書かれたグローバル変数を使うためのおまじない
>>481 変数におけるextern宣言は、その変数の定義が同一コンパイル単位内にないことの表明だね。
>>485 標準への準拠の度合いを言ってるんだと思うよ
C++のコードを読んでいると、newが成功しているか調べているコードがよくある気がします newってそんなに失敗しやすいんですか それとも、ネットワーク/ディスプレイ/スレッドなどの明かにリソースが限られているものだけ、 newの失敗しやすいのでif文で調べていると考えてもいいのでしょうか
>>488 newが失敗するって2通りあって、メモリが足りなかった場合と、クラスのコンストラクタが例外を投げた場合なんだけど、
前者は趣味で書く分にはほとんど気にしなくていい。
newできないほどメモリが逼迫していたらもうマトモにエラー処理ができないだろというのもある。
後者は発生する可能性があるならちゃんとチェックしなくちゃいけない。
クラスのドキュメントを読んで、コンストラクタが失敗する場合があるかどうかをよく確認しましょう。
>>488 >newが成功しているか調べているコードがよくある気がします
>newってそんなに失敗しやすいんですか
それ本当に newが成功してるかどうかを調べてるコード?
その処理単位に再入した時にヌルかどうかを調べてるとか、そういう実装都合とかじゃなくて
>>488 失敗するかどうかの前にもしそのコードが下のように if で確認してたら100%意味がないことに注意ね
int* a = new int;
if (!a) {
// エラー処理
}
理由は new は失敗すると例外を投げるから(new が nullptr を返すことは決してない)
new する以上失敗しうるし、そもそもどんな環境で実行されるかも事前に予期できないので、
失敗してもいいように備えてるだけじゃないかな強制終了されるなんてユーザは望んでないと思うし
失敗しやすいかどうかはともかく エラーチェックを怠るとデバッグに苦労するよ
結論、今やnewの結果をチェックするコードは無意味。 寧ろ、適切に例外処理をしておくべし。 # MSVCならcatchじゃなくてCATCHを使うのかな?
>>488 メモリ確保については環境によるだろうが、通常は失敗しない。
しかし、たとえばWindowsで目一杯メモリを使うと
仮想メモリが不足しているとか警告が出てくると思うが、
そういう状況では失敗するかもしれない。
それはそうと、newが失敗したときはデフォルトで例外を投げるので、
if文で失敗を調べるのは方法が間違っているかもしれない。
495 :
488 :2010/07/18(日) 12:58:13
>newが失敗するって2通りあって、メモリが足りなかった場合と、クラスのコンストラクタが例外を投げた場合なんだけど、 コンストラクタでは例外が発生しないフレームワークを使っています また、個人的にはコンストラクタの例外が嫌いなので作らないようにしたいと思います >それはそうと、newが失敗したときはデフォルトで例外を投げるので、 これは、システムが保証している事なんですか
VC6の時代に作られた
少なくともC++03とC++0xの規格ではnewでメモリ確保に失敗したときは std::bad_allocを投げるよう定められている。
bad allocはめどいから投げっぱなしにしてmainで取って終わりにしちゃうよね普通
ああstd::bad_allocを投げるような場合はprintf()もまともに動くかどうか わからん状態だからな
win7 64bitでVisualStudio2005は問題なく動作します? 64bitアプリを作成するには専用コンパイラが必要というだけで普通に使う分には問題ないですよね?
>>500 すべての機能が正常に動くかはわからんが、とりあえずこっちの64bitWin7では動いている。
32bitアプリも64bitアプリもビルドできる。
>>495 何年前からタイムスリップしてきたんですか?
煽りとか要らない
>>501 ありがとう、これでPCの更新ができるわ
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;は使っていますが関係あるかどうか・・・
>>506 friend class B;
と書くと、Bのメンバ関数からAのメンバにアクセスできるようになる。
そのソースではa.aaaaが書いてあるのはmain()
main()はBのメンバか?
B::err()の中身が気にはなるが、まぁ別の話。
なるほど・・・そういうことでしたか main関数の中身をなんらかのクラスを作って移住させれば動きました。ありがとうございます errで意味ないことしてるのは渡すメンバーの中身を書き換えたりしない・・・みたいな意味合いです
自作のヘッダやライブラリをまとめておく場所って定石みたいなものがありますか? 基本どこでもいいと思ってるんですけど、こうやっておくと便利、みたいなものがあれば教えて頂きたく。 OSはWindowsで、Visual Studioでの使用を想定してます。
>>509 どこでも置いてもいい
インクルードパス指定すればおk
>>510 どこへ置いてもあまりメリット・デメリットはないってことですかね。
適当な場所を決めてまとめるようにします。
ありがとうございました。
/usr/includeとかってのはバカなのか?
ホーム直下に俺様ライブラリフォルダを作ってる ルート権限がない計算機で仕事することもあるし
%HOME%\My Include
%HOME%\My Library
これに入れるとすごくWindowsっぽいですよ。
>>512 ないない。せめて/usr/local/include
定期的に更新する5つのオブジェクトの内容を画面に表示するとき ・ひとつの表示クラスに5個のオブジェクトを所有させる ・表示領域を担当する表示クラスを5個作ってそれぞれを結びつける どちらにした方がやりやすいでしょうか・・・?
その5つのobjは互いに全然関係ないもの?
ひとつのクラスもしくは多態的な関係です
new Test();とnew Test;は何か違う事はありますか?
>>519 前者は引数無しコンストラクタを呼び出す
後者はデフォルトコンストラクタを呼び出す
メンバ変数ってnewでインスタンス化する意味ってあるんですか?
メンバ変数がポインタの場合とか
>>519-521 てきとうなこといってんじゃねーよ。
後者は POD について値が不定となる。 POD じゃなければどちらも同じ。
>>522 配列を持つクラスを継承すると罠にハマる
528 :
デフォルトの名無しさん :2010/07/24(土) 08:28:38
>>526 それ、そのクラスかお前がバグってただけだろ。
>>526 まさか配列の各要素がDeep copy されなくて云々なんて言わないよな?
そんな事で罠とか言わないよな?
>524 も同じレベル。 >後者は POD について値が不定となる。 POD じゃなければどちらも同じ。
間違ってると思うなら正しい答えを書こうぜ
・・・つまり、何がちがうんだってばよ?
お前らこれで満足だろ §5.3.4 New 15 A new-expression that creates an object of type T initializes that object as follows: ? If the new-initializer is omitted: ? If T is a (possibly cv-qualified) non-POD class type (or array thereof), the object is defaultinitialized (8.5). If T is a const-qualified type, the underlying class type shall have a user-declared default constructor. ? Otherwise, the object created has indeterminate value. If T is a const-qualified type, or a (possibly cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of const-qualified type, the program is ill-formed;
536 :
デフォルトの名無しさん :2010/07/24(土) 23:52:30
いくつかの乱数を作るときに、全ての乱数の和が常に同じになるようにすることって出来ますかね? 例えば1〜5の範囲の乱数を3つ作って、その3つの乱数の和は常に10になる、みたいな "同じ数"から乱数分引いていって、残った分を最後の乱数にすればいいかと思ったんですが それだと上の例で5が2つ出たら最後は0になって範囲外になってしまいます
#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;
適当に乱数を3つ出して、その比率に応じた数値に直せば良いんじゃないの。 もちろんそれをやると実数になっちゃうので、最後の微調整は必要だけど(あと0を除く処理とかも)。 例えばrand()を使って 23, 66, 70 の3つが得られたとすれば 23 + 66 + 70 = 159 から それぞれ 10 * 23/159, 10 * 66/159, 10 * 70/159 にするとか。 まあ最後の要素は引き算にすべきで、さらに 2つ目からn-1個目の切り上げ切り捨ての判断も 個々にではなく、それまでの累計を基にしないと 最後の数が(引き算で求めても)範囲外になる可能性が出てきちゃうね。
>>538 割合を乱数で出したらダメなの?
例えば常に和が10と決まっていて乱数範囲が1〜5だと言うなら、
和に対して 0.5〜0.1 の乱数を一つと、
1.0 から 上の乱数を引いた物に対して、また 0.5〜0.1 の乱数を求めれば
和が10になる組み合わせを列挙しておいて 乱数でいずれかの組み合わせを選択する 数値の出力順も乱数で決定する この方法なら最初の組み合わせを限定する事で 特定の数値が出やすいとかいうのを排除しやすい
和が1000で50個の値の組み合わせ、とかだった場合どうすんのそれw
いずれにしても 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 とすれば良いかと。
randが0吐いたら困るんじゃね
これで満足か? #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; }
まあ
>>538 を読めば、自身がわかってないことがわかるが
最後の数字(最後に限らないが)を、それまでに算出した数を元に決めるやり方というのは
「乱数」の性質を満たしておらず、最後の数字に偏りが出る。
ただ、それでも良いのかもしれないけどね。
総和が決まっててそれを構成する複数の値を求めたいってのは、
幅が決まってる数直線上に、複数の区切り位置をランダムに決めてくのと同じ事なので、
>>541 の考え方がシンプルでいいかもしれない。割合のランダム
文字列を暗号化して色々な事に使いたいのですが、 RSAとAESのライブラリがある所をご存知ないですか?
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節参照)
いつの版のか知らんが手元にあったやつ載せとく。これでいいだろ。 > 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.
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; は ×不要 ○省略可 ○各自で適切に記述
勝手に不要としないで下さい ><;
お前の存在こそ、このスレにとっては不要です ><;
不要と省略可能がどう違うのか説明してもらわないと、わけがわからないな。 どうせくだらない思い込みだからどうでもいいんだけど。
なかったらデフォルト値が使われるだけで不要な訳ではない ということでしょう
みんな目的語省略しすぎだな. プロセスローダ側から見てmainの返値は不要ではない return 0; の記述は省略可能 retrun 0; を省略できる場合にわざわざ書く労力は不要
政治的に正しい言語定義が必要だな
記述が不要だって言ってるのに終了コード自体が不要だって言ってると勘違いした人が、 わざとなのか知らないが、誤解を埋めるための目的語を添えずにわめき続けている、と。
もう放っておけばいいよ
くだらない質問ですが、mapを使う際、変数名はどう命名するのが自然ですか? たとえばこのような場合、address_map? store_map? std::map<std::wstring, int> hoge; hoge[店の名前] = 場所
>>538 です
多くの回答ありがとうございました
割合をランダムで出す方向で行きたいと思います
>>564 冗長でいいなら、店の名前_場所_mapのようにするのが自然。
もうちょっと縮めたいなら、場所_mapの方が良好だと個人的に思う。
>>566 ありがとうございます
普通の配列のように、値の方で命名するのも良さそうですね
C++の型は静的であって、型を間違えたところでコンパイラに怒られるだけ どのコンテナなのかもしくは配列なのか分からないんじゃ、扱い方が分からないんじゃないかと言われるかもしれないが どのみちmapだとだけ分かってもどうせ格納してる型を知るには宣言に飛ぶ必要がある コンテナの種類を載せることも冗長ではないか
「場所マップ」、「場所リスト」とかなら分かるけど「場所」だけじゃ気持ち悪いじゃん
場所[店] と書いて使うんならありじゃね?
ユーザー定義の構造体やクラスを関数の返り値にするのってコストの面や 返り値が変更点になったときその影響範囲が広くて大変なことになりそうですが 普通にやって良いものなのでしょうか? それでも2値以上返す場合はそうするしかないのでしょうか?
const unsigned char s[] = "char"; const unsigned char *s = "char"; 下の書き方だとgccに怒られるのですが、なぜ怒られるんですか?
あるクラスのメソッドで構造体を引数にとるとき クラスが多態的になるとき引数の構造体も多態的に扱うというのは有りなのでしょうか? また、このとき構造体も基底部をインターフェイスとした方がいいでしょうか?
>>572 上の"char"は{ 'c', 'h', 'a', 'r', '\0' }の構文糖。
下の"char"では無名のconst char[]が作られ、
const char*はconst unsigned char*に変換できないのでエラーになる。
>>571 コストは実測してみろ。
影響範囲がどうのということは代替案はグローバル変数か?ありえん。
たいていは読みやすく書いておけばいい。
「返す」というなら素直に戻り値にするのがいいだろう。
>>573 クラスが多態的なのと引数が多態的なのは関係ない。別々で考えて好きにすればいい。
>>574 構文糖っての初めて見た。
たいてい糖衣構文って言わない?
たいてい両方言う
syntax sugar
581 :
572 :2010/07/29(木) 21:54:54
>>574 なんとなく、雰囲気はつかむことができました
>>576 すみません、エラーメッセージを読んでもわかりません
もうすこし、kwsk説明してください
>>578 シンタックスシュガーとも言わない?
まとめ 構文糖 糖衣構文 セイロガン糖衣A syntax sugar シンタックスシュガー
>セイロガン糖衣A てめえはコレを書きたかっただけだろw
>>581 エラーメッセージの何がわからなかったの?
>>582 ちっちゃな雪使いシュガーがないぞどういうことだ
sugar baby loveを雪使いシュガーの主題歌だと思っていたら世間一般ではそうではないということに気づきました
オリジナルもリメイクも古い曲だからな
糖尿なのでシュガーカットでおながいしまつ
589 :
581 :2010/07/30(金) 21:22:38
srd::queue<Data> data_que; みたいな事をして、data_que内にいっぱいデータ詰めて、その後全部popしたんだけど、 メモリ使用量が減らないのは仕様なの? 再びやると、前回の確保量まではメモリ使用量が増えずに、確保分を超えたところからまた使用量が増えるんだけども。 どうすれば、いちいち解放してくれるだろうか。
>>590 仕様
気に入らない場合は
OSから作らないといけなくなるかも
>>591 OSレベルでの仕様ってことなのね。
アプリケーションが使用したことがある領域が割り当てられて、って感じなのかな。
一度に確保する数はたかが知れてるからこのままで行くことにするわ。
ありがとう。
>OSから作らないと 寝ぼけたことを言わないように。 まず、いわゆるswap技法により、ライブラリのアロケータに返すことは出来る。 ただし、ライブラリは、アプリケーション側からメモリを返却されても OSには返さない場合も多い。 確実にOSに返すためには、 allocatorを自作して、OSから直接メモリを得て不要になったらOSに返すようなものを作る。 (ただし、例えばWin32のHeapAllocを使ってもOSと直接やり取りすることにはならない) が、そこまでする必要があることは、まず無い。
いわゆるswap技法 allocatorを自作
>>590 いちいち開放すると遅くなるので、本当に開放が必要か検討してみれ
>>597 入力履歴の記憶/再生だから流石に必要かな と思ったけど、実装的には別に開放しなくても大丈夫だな・・・。
うーん、考えてみる。
アロケータを自分で書くほどの必要性には迫られてないから、そっちは保留しとくわ
すごく偏りの激しい乱数を作る方法でいいのがあれば教えてください 具体的には 1-10の範囲で100回乱数をとって集計すると大概は 1が30回, 4が21回, 5が6回・・・・とかになるような感じです(たまに平坦になったりするのもよいです) そしてどれが多く出るのか、何回でるのかは毎回バラバラになるみたいな感じで
>>599 乱数を加算する偏る
加算回数をランダムで決めたり、シャッフルしたりして加工する
>>600 中心極限定理ですよね
それって一様分布から正規分布に近づくって話じゃなかったですか?
>>601 ちょっと思いつかないなあ
結局、どういう風に偏ることを期待しているか、という問題に行き着くんじゃないのかね
非対称な確率分布の確率関数に突っ込めば、偏りのある数列は得られるだろう
しかし望みのものになるかは不明
>>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;
}
>>602 つまり
>>600 の説明では意味不明でしたか?
>対称な確率分布の確率関数に突っ込めば
>望みのものになるか不明
望みの物とは正反対になるような気が……
いやそもそも乱数だと言ってるのがおかしかったかもしれません
乱数じゃないですし
>>603 なるほど
ありがとうございます
クラスのインスタンスをファイルに書き出すってどうやればいいんでしょうか? boostのserializeが使えない事例なので、どうすればいいか分かりません。 fwriteっていう話も聞きましたが・・・できればC++での方法が知りたいです。
>>606 >>で書き出して<<で読み込めるようにすればストリームでシリアライズできるよ
608 :
606 :2010/08/03(火) 00:26:20
>>や<<をオーバーロードして、ファイルの書き込み・読み込みを行え という意味で良いんでしょうか。
>>608 ・__vtbl
・エンディアン
・パディング
これらの単語にひとつでも見覚えがないものがあるなら諦めろ
ていうかboost::serializationが使えない事例ってどういう事例よ
>>609 自分用のライブラリっぽいものを書いてるもんで、boost入ってるの前提なのはちょっと困るんです。使用環境がboost前提になってしまうので。
そしてその単語に見覚えはあるものの、意味は分からないので今回は諦めてメンバ一個一個を読み書きすることにします・・・。
Baseクラスを継承したSubクラスがあり void foo(Base* src){ Sub1* sub1 = dynamic_cast<Sub1>(src); /*〜*/ }; この関数fooは自分が勘違いしなければかならずSub1を引数にとるようになっているのですが 念のためdynamic_castを試みると error C2682: 'dynamic_cast' を使用して Base*からSub*へ変換できません とエラーを吐きます。 こういうばあいどうしたらよいでしょうか
訂正 Sub1* sub1 = dynamic_cast<Sub1*>(src); error C2682: 'dynamic_cast' を使用して Base*からSub1*へ変換できません でした
Baseのデストラクタをvirtualにする
Sub1のデストラクタをvirtualにする
派生クラスのデストラクタにもvirtual指定が必要だったようです。 無事コンパイルは通りましたけどどうしてなんだろ・・・
fstreamの話なんですが、 ifstream ifs("filename"); と書けばスコープ外れた時にデストラクタでcloseされるのは良いのですが、 ifstream ifs; ifs.open("filename"); と書いた場合にもデストラクタでcloseされるのでしょうか? コンストラクタでopenした場合にはスコープ外れたときに〜という文脈で解説しているサイトがあって不安になりました。
>>615 俺は派生クラスにもvirtualつけてる派だが、無くてもいけるはずだと思ってたが
まさか、VC6?
C か C++ か WinAPI スレかで迷ったのですが… Windows XP、VS 2005、C++ で開発しています。 ・fread のエラー内容を取得するにはどうしたらいいのでしょうか? fopen で "wb" で開いたファイルに対して fread でデータを読もうとすると、当然読めないので 0 が返ってきます。 この時のエラーメッセージを取得したいのですが、_get_errno で取得した値が 0 になってしまいます。 調べたところ、POSIX?では errno を調べることで取得できるが、Win32 では保証されていない的な文が見つかりました。 確かに MSDN を調べたところ、パラメータが無効な場合は EINVAL を設定するとありますが、それ以外に errno を設定する記述はありません。 標準ライブラリを使わずに API を用いてファイル操作をするしか方法はないでしょうか? よろしくお願いします。
getlasterror
つーか、それが「エラー」なのかどうか、確認してるか? 実際にファイルの内容があっても読み込めないんだろうが 現実的には、単に読み込もうとした結果がEOFだと判定されているだけじゃないのかね。 0を返した後、ferror()とfeof()でエラーであることを確認した上でなら、しょうがないとも思うけど。
>>621 確認してみましたが、feof は 0 を返します。
念のため ferror も確認しましたが 0 以外を返しました。
エラーとは認識しているようですが…。
>>620 内部で API を呼んでいるとは予想できるので、GetLastError で取得できるという話は聞いたことがあります。
ただそれでも、パラメータ不正な場合など、API を呼ぶ前にエラーが起きている場合は GetLastError で取得できないとも聞きました。
とりあえずは API を直に使ってみることにします…。ありがとうございます。
クラス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 (/*〜*/){/*〜*/}; } このようなとき渡す値の変化にも対応できるようにするには、どのような設計を行えばよいでしょうか?
class Hogeのメソッドfoo()はA・B・C・Dの4つの値を受けて処理しますが 派生クラスHogehogeではfoo()の処理する値をA/B/C/D/Eと増やしたいのです こういう場合はどういう設計をしたらいいでしょうか?
class Hogeのメソッドfoo()はA・B・C・Dの4つの値を受けて処理しますが 派生クラスHogehogeではfoo()の処理する値をA/B/C/D/Eと増やしたいのです こういう場合はどういう設計をしたらいいでしょうか?
>>623 「対応できるようにする」の意味がわからん。
その Serialize() をどうやって呼び出すつもりなのか、とか。
状況次第だけど、SetE()関数を用意した上でdynamic_castはアリ?
template<typename T1, typename T2> T1 f(T2) { return 248; } int main() { int i = f<int>(1); } というものなんですが template<typename T2, typename T1> とするとエラーになります なぜですか
T1が推論できないからだろうね。 248といえど、整数型で4つで浮動小数型2つあるから、 人にとってどれが最適なんてコンパイラさんは推論できない。
ありがとうございます
>>630 基本的に戻り値から推論はできないよ。推論は引数からのみ。
最適とか整数型がどうとか関係ない。
>>631 は勘違いしてる
単に文法上問題があるからコンパイルできないだけ
明示的なテンプレート引数リストへの指定は左詰め。
template<typename T2, typename T1>
の場合<int>はT2に対する指定になって、T1は型が指定されていないからコンパイルエラー
戻り値からT1が推論されることはない
template<typename T1, typename T2>
の場合<int>はT1に対する指定になって、T2は引数1から推論されるからコンパイルできる
このあたりのことは「C++ Templates」読むといいよ。翻訳名は忘れたw
RSA * RSA_generate_key(int num, unsigned long e, void (*callback)(int,int,void *), void *cb_arg); >モジュラスサイズ num > 1024より小さいと脆弱なキーとなるので,1024より大きくする. >対数サイズ e > 奇数であり,3,17,65537が良く使用されるらしい. モジュラスサイズ = 何ビットで暗号化するかなのか? 対数サイズ って何よ?
>malloc関数は確保したメモリー領域を初期化しない >new演算子は整合性があり、初期化されたオブジェクトを作成する mallocでとった領域を初期化するには、どのようにすればいいんですか また、newで初期化されたオブジェクトを作成しないためには、 「Test *t = 0;」でおk?
mallocはコンストラクタを呼ばない newはコンストラクタを呼ぶ それだけ C++で作るつもりなら全部newで確保しとけ
637 :
635 :2010/08/08(日) 11:29:38
>>636 つまり、malloc()はメンバ変数が何が入っているか分からないだけなんですね
ポインタを返す関数(C言語)があるのですが、それにはfree専用の関数があります
C++でその関数を使っているのですが、deleteじゃなくて専用の関数を使った方がいいんですかね?
Hoge *h = funcHoge();
freeHoge(h); ○
delete(h); ×
こんな感じ?
640 :
637 :2010/08/08(日) 11:48:10
>>639 >適当な正整数 e(通常は小さな数。65537 (=216+1) がよく使われる)を選択する
鍵ってこと?
e と n が公開鍵で d が秘密鍵 鍵には違いないけど、どうせ公開するものであるし、そこまで慎重になることはない よく使われるなどと言われてる数の中から好みで選べばよいです
ブルース・シュナイアーも言ってるが、 実アプリで、暗号の低レベルな部分を素人が直接操作するのはお勧めしない SSLとかを使うのが無難 もちろん勉強してみたいということなら、止めるつもりは全く無い
まぁ、よくわかんないけど 公開するわけじゃないから別にいいや
645 :
644 :2010/08/08(日) 12:39:11
でもさ、一つわかんない事があるから教えてくれ >unsigned char *crypted_buf; >crypted_buf = malloc(RSA_size(rsa)); なんで、charなのにmalloc(sizeof(char));じゃないの? そして、これをC++で書くとどうなるのか教えてください
例えばファイルの読み書きとかで10000バイトのバッファが欲しいとき、 char *buf = malloc(10000); って書くでしょ? それと似たようなものです。 C++でもそのままmalloc使えばいいです。
647 :
644 :2010/08/08(日) 12:53:26
>>646 レス、thx
>C++でもそのままmalloc使えばいいです。
mallocはC++では禁じ手という事になっているらしいのですが、
それでもmallocを使っちゃっていいんですか
それは初心者のための方便です。 初心者がよく間違って使いそうな可能性がある場合にとりあえず禁止しておけば安心というわけです。 正しく使う限りは大丈夫です。
649 :
644 :2010/08/08(日) 13:01:54
一応、こんな感じかな〜ってことで考えてみました 正しいか、間違っているか教えてください new unsigned char[(RSA_size(key) / sizeof(char))];
650 :
デフォルトの名無しさん :2010/08/08(日) 13:10:24
>>645 charじゃなくてchar*だろ?それにsizeof(char)だと1byteしか確保されないが・・・・・・
RSA暗号は暗号化するデータが鍵長の整数倍になるようにパッディングするから
おそらく「rsa」に暗号化する生データが入っていて,
パッディング後のサイズをRSA_size関数で計算しているんだとエスパー
>>645 crypted_buf = malloc(sizeof(char)*RSA_size(rsa));
>>649 間違ってはいないから正しいということになるのだろうか
/sizeof(char) はどうせ÷1なので別にあってもなくても良いのだけれど
コードが長くなるだけで無意味なのであまり書かないと思います
美的な意味があるという人もいるかもしれませんが、
そういうことであれば sizeof(unsigned char) の方がいいと思います
>>649 ,652 そこは割り算自体が意味的に間違いだろ。 malloc じゃないんだから。
654 :
662 :2010/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; }
654だけど、名前欄の数字は何で付いたのかよくわからんので、無視してくだされ。
656 :
644 :2010/08/08(日) 19:00:17
C++でもmallocをしても、全然黒魔術じゃないんですね
知らんかったよ
>>652 おとなしくmallocを使えということなんでしょ?
>C++でもmallocをしても、全然黒魔術じゃない ただ、ね、 もしCでは絶対に使われないコードで、malloc()と同じ動作を求めたいのなら operator new()を使った方が良い。 こっちは、メモリ不足の時に例外を投げてくれるから。
658 :
644 :2010/08/08(日) 21:01:21
unsigned charの配列の長さを求める方法を教えてください
ヒント:sizeof
たとえばファイルから長いバイト列のデータが与えられて、 動的確保したバッファにそのサイズ分コピーし、それを複数の構造体Aの並びとして順次取り出したいのですが 構造体Aに格納する途中でデータが終わってしまった場合を想定すると 1メンバ格納する前ごとに現在の読み込みサイズと総サイズを比較し続けなければなりません。 構造体Aもその都度動的確保するのですが、メンバに数値と文字列が混在しておりややこしいです。 こういう場合は、whileでループ回して1メンバ代入ごとにいちいちサイズ比較をすべなのでしょうか? それとも他にいいやり方がありますでしょうか。
すべきでしょう 与えられたデータの末尾にダミーの値をいくつか追加しておいて、 途中でいちいちチェックせずに構造体1個ぶん終わるところまで処理し、 最後に行き過ぎてしまったかどうかをチェックする方法もありますが、 最悪で何バイト行き過ぎるか、追加するダミーデータの量をきちんと計算しておかないと死にます
>>662 ありがとうございます。
文字列メンバは長さ不定のためそのやり方は使えそうにないです。地道にチェックすることにします。
664 :
659 :2010/08/09(月) 20:53:54
>>660 sizeof(array) / sizeof(array[0])ですね
ありがとうございます
array[0]ってのは少しダサいですが
じゃあarray[1]にしとけ 実行中に吹っ飛んでも知らんぞ
unsigned char なら別に割る必要はない
667 :
659 :2010/08/10(火) 05:50:43
>>667 規格によりchar の類は1バイトと決まってるから
>>665 いっそarray[777]とかにしちゃおうぜ
sizeof(array) / sizeof(* array)
670 :
デフォルトの名無しさん :2010/08/10(火) 12:05:27
ソースで クラス:基底クラス { うんたらかんたら bool hoge() const{処理} }; とあったので、ヘッダと分けたいので ヘッダ クラス:基底クラス { うんたらかんたら bool hoge() const;←ここがわからない }; ソース うんたらかんたら bool クラス::hoge() const{処理};←ここがわからない と言う風に分けたいのですが、どうすれば良いですか?
672 :
デフォルトの名無しさん :2010/08/10(火) 12:15:35
書き換えないなら全然無視してオッケーじゃん
673 :
デフォルトの名無しさん :2010/08/10(火) 13:49:07
最近C++を勉強しようと思ってます。 coutやnewのように、Cで代替の効く関数がありますが、 printfやmallocを使用するのと、どちらが一般的なのでしょうか?
阿呆の真似をする本物の阿呆が 初心者になりすまして巫山戯た質問ばかりします。 あれはセロトニンレベルが異常になるような発作を 定期的に起こしているためと考えることはできますか? 特に、長期にわたって前述の行為を行っても芳しい反応を得られていないにも拘らず、 その行為をやめようとしないのは学習能力がないと思わざるを得ません。 あるいは人でなどなく、弱いAIのような存在なのでしょうか? 仮に人間だとしたら、奴さんの脳は考えることを停止したのだ、とか。 奴さんに比べたら、自己顕示欲が暴走して暴れているネット弁慶ニートのほうがまともだと思います。
>>673 printfとnewとmallocを使ってる
>>673 スピード重視ならprintf
クラスの入出力を多用するならcoutかboost::serialization
mallocは使うなnewを使え
677 :
667 :2010/08/10(火) 19:47:12
std::mapの要素に構造体を持つとき 構造体のメンバすべてに値を代入する作業をするとして hogemap[key].aのように毎回[]演算子で要素を指定してドット演算子でアクセスするよりも find関数でキーを検索してイテレータを通じてアクセスした方が効率はよくなるのでしょうか?
インデックサで毎回検索してるわけだから、それをポインタなどで短期間束縛すれば検索コストははぶけるだろう。 長期に持つと追加や削除時に構成が変わって危ないが。
>>678 find() もイテレータも要らないだろ。普通に↓でいいんだから。
S& x = hogemap[key];
x.a = ...
x.b = ...
681 :
デフォルトの名無しさん :2010/08/11(水) 12:06:50
初めまして、C言語のプログラミングというかコンパイルについて質問があります。 大学の実験のレポートにて、C言語で差分方程式を数値的に解くというプログラミングを作ったのですが 学校のPCではコマンドプロンプトでコンパイルという作業ができたのですが、 自分のPCでは、たとえば cc sample.c としても、 'cc'は内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチファイルとして認識されていません。 と出て作業を続けることができません。 大学で作ったプログラム自体は間違っていないと思います。 大学のPCで動かしたときには結果のテキストファイルがちゃんと出ていたので。 今使っているPCのOSはwindows7 Home Premium です。 自分で少し調べてみたのですが、さっぱりわからない状態です。 よろしくお願いします。
自分のPCにはコンパイラ(VCとかgccとか)はインストールしてあるの?
ccってどのコンパイラだろう gccかclしか普段使わないなあ
多分gccのエイリアスだろう
685 :
681 :2010/08/11(水) 13:09:10
大学では、そういったことを何も教わらずに機械的に差分方程式のプログラミングを作っただけなので、さっぱりです。 できないってことは入ってないのだとおもうのですが・・・ gccを検索してみたのですが、何をインストールすればいいのか
>>685 windows環境でCをコンパイルするならcygwinとか。
KNOPPIXみたいにCDから起動するlinuxとか。
VisualC++とか。
どれにしても、教えてくれる人がいなかったらコンパイルまで
こぎつけるまで大変だと思うけど。
windowsなら、borland Cコンパイラってなかったっけ?
学校のとバージョン違ってたらあとで面倒なことになる まず最初に学校のccのバージョンを調べてから
というか担当の教官かヘルプの院生に聞いたほうがいいだろう
690 :
デフォルトの名無しさん :2010/08/11(水) 15:05:01
ccってたんにbatファイルじゃないの? 先生に聞いてみたら
先生も大変だな
熱心な生徒は大事に扱うべき
完全にではないけど自己解決しました。 MinGWというコンパイラ?をダウンロードしてやってみたら結果ファイルを出力できてました 急いで残りのをすませてみます。 コンパイルというものが必要だということを教えていただき有難うございました。
釣りじゃなかったのか
std::ofstreamで例えばstd::vector<int>の中身をファイルに書き出したいんだけど int型のまま書き出すにはどうすればいいんでしょか
>>695 何通りかあるよ。
バイナリで書き込むかテキストで書き込むかというのもあるし、
オペレータ定義して書き込むとか、forでまわして書き込むとか。
int型のままって言ってるんだからバイナリじゃないの?
あーそうかも。
エンディアン対策ってたとえば整数だと 符号有りならを符号なしに再解釈キャスト 1byteごとに刻んで右シフトしてunsigned char配列に格納 unsigned char配列を書き込み unsigned char配列を読み込み 1byteごとに左シフトしてもとの整数に格納 符号有りなら符号有りに再解釈キャスト みたいな感じでいいの?
700 :
695 :2010/08/11(水) 16:14:23
言葉足らずですんません、バイナリでした
>>699 そんな感じで
copyとostreambuf_iteratorみたいに
ポンっとやってくれるクラスがあれば知りたかったけど
ないなら作ってみますね
std::vector<int> hogehoge; ってそのまま cout << hogehoge; って出来ないのかな?
boostが使えるなら boost::serialization という手もある
703 :
695 :2010/08/11(水) 18:08:02
>>701 <<はコンテナ引数にとれませんでした
できれば楽なんですけどね
>>702 こりゃ便利!使わせてもらいます
どうもでした
こういう感じのこともできるよ。的な何か。 #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; }
ファイルを暗号化してみたいのですが、何かいい方法ありませんか?
>>705 暗号化というのがどういうものかまず考えるんだ。
強い強度がほしいならそれなりに知識は必要だが。
文字列と固定乱数でxorを取っていくといいですよ
あるメソッドで返す値とエラーコード両方をわたしたいのですが エラーの場合例外を投げて例外クラスのメッセージでエラーコードを渡す エラーコードを返り値にして引数に参照やポインタをとってそこへ代入する 適当な構造体やstd::pairのようなものを利用する どれが一般的な手法でしょおうか
どれも一般的です
>>711 足し算や引き算でも暗号化という行為はできるわけさ。
秘密鍵として、いくつ引いたかいくつ足したか保持してれば復号できるわけ。
ただ、数学的に妥当な強度の高い符号がほしいときはそれなりに知識がいる。
って感じだ。
少なくとも、ライブラリを使うだけの知識は必要だな。 例えば、秘密鍵や公開鍵が何かとかね。
mallocはvoid*を返しますが、C++では何を使ってキャストすればいいんですか? static_cast? dynamic_cast?
>>714 >例えば、秘密鍵や公開鍵が何かとかね。
秘密鍵/公開鍵なんて知っていて、当たり前でしょ
>>715 キャストではなくplacement newを使います
721 :
716 :2010/08/11(水) 20:55:49
722 :
デフォルトの名無しさん :2010/08/12(木) 14:57:58
dequeはどうやってデータを保存してますか? vectorはcapacityとかがあって満杯になると 一定数増やした配列をまた作ってそこにコピーしますが、 dequeはそのようなことをしないで増えていっている気がします。 具体的な実装方法を教えてください。
>>723 ありがとうございます。
一つのブロックに何個はいるかわかりますか?
わからないのならいいです。
ソース見ればいいじゃない
std::dequeのoperator[]はプロキシクラスを使ってるんだろうね
標準ライブラリーのソースは何でアンダーバーだらけなんですか?
アンダーバーで始まる識別しはコンパイラ職人のおじさんたちのために予約されているからです
>>724 さっき「deque 実装」でググったとき、各処理系のブロックの
サイズが書いてあるページをちらっと見たけど、今探したら
見つからない。
数百とか1024とかそのくらいなんじゃないの?
気になるなら、ググって上から見ていけば出てくると思う。
双方向リスト
dequeはブロックサイズを指定できたらなと思うことはたまにある。 VC9: 16 Bytes STLport: 32*sizeof(void*) Bytes のようだが他はどうだろう。
右と左のボタン以外にいろんなボタンがついたマウスってありますよね? で、マウスの設定したボタンが押されたらギミックを動かすってしたいんだけど どうやってボタンの入力を感知すれば良いんでしょう? クリックならWM_LBUTTONDOWN、WM_RBUTTONDOWNで対応できるんですが・・・
>>732 WM_MBUTTONDOWNとかWM_XBUTTONDOWNとか
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; } なんで、出力された結果が違うのですか?
コンパイルしてないけど、こういう感じの方法もあるよ。 template<class T,size_t N> size_t ArrayCount(T (&in)[N]){ return N; }
この流れの場合 Nを書いたら負けだと思う
なんで? hairetunonagasaのほうがよかったか?
配列のポインタへの成り下がりか、ややこしいよね
std::vector でおk
配列とポインタが同じものという誤解はよくあるな
char array[ 100 ]; char *p; p=array;//構文糖 p=&(array[0];と書くのが正統 でも頻発なので許容 //arrayは決してポインタではない //array[3]は許されても*(array+3)は不法としてエラー
p=(char*)( &(array[0]) );と書くのが正統 array[0] char 変数 &(array[0]) char 変数のアドレス値(整数) (char*) アドレス値をchar *ポインタ型へ再解釈するキャスト演算子
うそを書くな
そう思うなら訂正すればいい
>>742 エラーにはなりませんが何か?
#include <stdio.h>
int main(void)
{
char array[] = "abcdef";
printf("%c\n", *(array+3));
return 0;
}
test
JIS規格 JISX3010 プログラム言語C 6.5.2.1配列の添字付け 添字演算子[]は、E1[E2]が(*((E1)+(E2)))と等価であると定義する。 6.5.6 加減演算子 これらの演算子に関しては、配列の要素でないオブジェクトへのポインタは、 要素型としてそのオブジェクトの型をもつ長さ1の配列の最初の要素へのポインタと 同じ動作をする。 面倒なのでこれ以上の引用は避けるが、配列として定義した変数を添え字なしで使用したとき、 アドレス定数として解釈される。アドレス定数はある種のポインタである。 配列とポインタはそれぞれ定義が異なり、宣言時の区別は重要だが、演算をするにあたっては 規格で定義されている通り、特に区別が必要なわけではない。 > p=&(array[0];と書くのが正統 というのは、配列ととポインタの定義が同一ではないことにこだわるあまりに 初心者がはまりこむよくある勘違い
JIS規格w
実は p=&0[array]; が正解
>748 >配列として定義した変数を添え字なしで使用したとき、アドレス定数として解釈される。 此処は間違い。添え字付きの場合でも、ポインタに変換されてから添え字演算子のオペランド になっている。 規格書は持っていないので、K&Rから。 A7.1 式あるいは部分式の型が、ある型Tについて、「Tの配列」であれば、その式の値は配列の中の最初のオブジェクトへのポインタであり、式の型は「Tへのポインタ」に変換される。 この式が単項の&演算子、あるいは++, --, sizeofの被演算数、あるいは代入演算子、あるいは.演算子の左演算数のモノであれば、この変換は行われない。 ※それにしても訳がよくないね。2番目の文の「あるいは」がどこまでかかっているのか 全く不明だ。規格書の該当部分わかったら教えて欲しい。
初心者が間違うのは p=&array; であって p=array; と p=&array[0]; はどっちでもいい
論文読んでもどうせわからないだろうから、公開されている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"); }
色々ツッコミが入りそうだな
質問です。 Windows、C++でネットワークを利用するプログラムを書こうとした場合、Winsock2以外に選択肢はあるのでしょうか? あるいは、Winsockはもう時代遅れで、新しいのが有るのでしょうか?
ありあへん
アリアハン?
boost::asio
winsockのラッパじゃけん
::std::malloc(size) ::operator new (size) ::new char [size] 規格上、上記の3つとも「size以下のサイズをもつあらゆる型のアラインメントの倍数のアドレスを返す」、でおk?
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は全て必要、そもそもこれが継承なのかなんなのかわからない) これはどんな仕組みなんでしょう?(※※) またごく一部だけしか関連性がないのにポインタキャストをして目当てのメンバ関数を使ってもいいんでしょうか?(※)
staticメンバ関数からメンバ変数のm_xにアクセスしようとするとコンパイルエラーじゃん? まあそれは置いといて、そのreinterpret_castは間違いで危険なコードだから消す そしてnanikaはVIRTUALTIMERPROCを継承している必要がある
(※※)仕組みっていうか偶然動いてるだけです (※)だめです
どうもありがとうございます
>>766 すみません、間違ってました
static CALLBACK CTimerProc( … ){ m_x->TimerProc( … ); }
↓
static CALLBACK CTimerProc( … ){ pctimer->m_x->TimerProc( … ); }
※)pctimerはなんらかの方法でCTimer変数のポインタが代入されている
やはりこのキャストは無茶でしたか
しかしほとんど無関係なのにタイマーだけのために継承していいんでしょうか?
できれば任意のクラスにタイマー変数とそのプロシージャ関数だけ用意しさえすれば最低限使える
と言うようなものにしたいと思っているので、一応現在のが形的にはそれに近くなっています
>>767 なぜ動いてるのでしょう?
確かにnanikaのTimerProcからvirtualをとるとランタイムエラーが発生しましすから危ない橋は渡っていると思います
継承を使いたくないなら型消去でググる あるいはfunctionとbindを使う なぜ動いてるのかは偶然だよ偶然 一般的に見てバグるところがたまたまうまく動いてるだけ そういうことがC++にはよくあるんです
>>769 おk、謎の力で動いてることが確認できたので全力で改善します
しかし他のところだと無自覚に謎の力に頼ってそうで怖い…
>型消去
なかなか面白そうですね、これは初耳です
他のやつも小耳に挟んだ程度なので勉強してみます
どうもありがとうございます
c言語のstaticはprivateと同じ高価なんですか?
>>771 違う。
staticは他の翻訳単位からは見えない。
privateは見える。
010EDITORというバイナリエディタのCライクなスクリプト言語での質問です。 local int i; LittleEndian(); for (i=0; i<=100; i++) { Printf("%6d",i); } これで0から指定数、この場合100まで1行に出力します。 これを、1行10列で改行して出力するにはどうしたらいいでしょうか?
774 :
771 :2010/08/21(土) 21:11:35
>>772 なるほどね、そういうこと
つまりリフレクションができるかできないかの差なのね
ありがとうよ
>>773 C/C++じゃ無いからスレ違い
if(i%10==0)cout<<endl;
に相当する文を追加しろ
関数型マクロで質問なんですが、次のような複数命令かつ一時変数定義を含んだ関数型マクロ #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)が通るようにできないでしょうか マクロじゃなければ問題ないんですが性質的にマクロ展開されないといけないものでして…
>>776 inline で我慢するとか…はダメなんかね
inline関数はダメなのか?
簡易タイマークラス作ってみた。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; }
>>764 3つ目にアライメントを期待するのはさすがに無理があるだろ。
「規格上」というなら対応する記述を探してこないとね。
クラスの前方宣言とヘッダファイルのincludeの使い分けの基準というか方針はどうすればいいのでしょうか?
>>782 俺はクラスはヘッダーに全部書く派だが、基本的には分けるのが普通なんだそうだ。
テンプレート系は分離できないからヘッダにべた書きしかないらしいが。
プリコンパイルヘッダを使ってるなら、なるべくそこにまとめるのがいいと思う。
何でそうするかって言うと、
実装が隠せることがライブラリにとって幸福であること。売り物だと特にね。
もう一個はコンパイル時間の短縮。
って感じじゃないかな?
>>777 大変面白い情報をありがとうございます
まさにダイレクトな解法です
>>778-779 実はこのマクロはデバッグ用のものでして
特に__LINE__がその場に記述されていることになっていないと上手く動かないものです
ですから機械的な置換であるマクロでやっているのですがよく考えるとinlineも埋め込みですから
その場の展開になるんですかね?ちょっと実験してみます
どうもありがとうございました
staticしか持っていないクラスがコンストラクターで値を受け取るという設計はまずいでしょうか? こういうときこそシングルトンにするべき?
monostateでいいよ
>>782 前方宣言で済むときは原則として常に前方宣言。
クラスや構造体が多いときは予め前方宣言だけ書いたヘッダを用意しておく方法もある。
詳しくはEffective C++ 34項を参照。
便乗で聞きたいんだけど引数と返り値は参照ポインタじゃなくても前方宣言でいいじゃん これって活用してる?例えば ---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; } 確かにコンパイル依存性は減るんだけど、なんか少し気味が悪い ここまで徹底してるひとっているのかな?
常識とまでは言わないが別に普通かと まあサードパーティのライブラリを使う場合に手動で宣言書いたりはしないが namespace std { using OtherNamespace::pair; } みたいな実装だったら多重宣言エラー出ることもあるし
>>783 ユーザー定義のヘッダをプリコンパイルヘッダにまとめるのは、
コンパイル依存性を増大させるからおすすめできない。
自前のライブラリみたいな、滅多に更新しないヘッダなら最適だけど。
>>788 本題とは関係ないんだろうけど、 namespace std 内の宣言は、既存のテンプレートの
特殊化以外、ユーザーが書いちゃダメなんだぜ。
visual c++ 2008 express editionなのですが例えばデバッグ出力で .\ファイル名(行番号) : 表示内容 みたいな短縮的な書式での出力でもジャンプすることができるんですが 検索結果などでもこんなふうにパスを短縮することができないでしょうか? 無駄にフルパス表示で必要な表示部分がものすごく狭くなってしまいます
>>792 ソフトの使い方はそのソフトのスレへどうぞ。
C++なんですが、あるcppファイルで宣言した関数(メンバ関数とかではない単独の関数)は、別のcppファイルでは呼び出せないんですか?
>>795 ヘッダ書くとか別のcppファイルにプロトタイプ宣言書けば呼び出せる
>>796 ありがとうございます!
そうか…プロトタイプ宣言はこういうときに使うんだったか…
以前質問したものですが型消去(Type Erasure)で実現することができました
そして余談ですが
>>765 がいうなれば出来損ないの型消去もどきであると思いました
遥かに堅実になり、ヒントを下さった皆様に重ね重ねお礼を申し上げます
>>797 実際に使ってみて初めて意味がわかるってことって多いよな、ほんと。
int hoge(int); とかだとプロトタイプ宣言無くても使えるんじゃなかったっけ
test
それはCだろ
プロトタイプ宣言は省略可能
古い規格で語るな
C 言語では関数呼び出しを行うにあたってプロトタイプ宣言は必要ではありませんが、 C99 から最低でも関数宣言だけは必要になりました。
で、そのC99の処理系ってどこにあるわけ?
Solarisなら標準だし、Linuxでもオプション指定すれば。 まぁ、完全準拠ではないかもしれないがね。
てゆーかcppつってんだからC++じゃないのか
最近ようやく構造化プログラミングが分かってきた気がする 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?
C言語でオブジェクト指向やるときは、 C++でいう、構造体にパブリックなメンバ変数と関数テーブルを持たせる。 でコンストラクタ的な、初期化関数から値を受け取って必要ならデストラクタ的な開放関数を用意する。 関数テーブルは基本的にバーチャル相当。 って感じじゃないかな。
って逆か。 C++はCのアッパーコンパチだから、無理にクラスなどを使う必要はない。 思う存分構造化するがいいさ。
構造化とオブジェクト指向は競合しない。両立する 無理せずともクラスは自然に使える クラスも構造化もどんどん使え
815 :
811 :2010/08/25(水) 21:24:20
ソフトを作るときに、FILE構造体 or ストリームの両方を使ってもいいと思う 片方に限定して使った方がいいかな?
818 :
816 :2010/08/25(水) 22:17:17
ヘッダーヘルが怖くないなら、統一しなくても管理できるだろう。 独自機能だったかもしれないけど、FILE*からfstreamに変換はできたと思う。@VC10 うろ覚えだけども。
stringに入力された数字を抜き出す方法ってないですか? 使った人に数字を入力させたいんですが、 int a; cin<<a; を使ったときに、そこに入ってるのは数字とは限らないので、 例えば「ああああ」とか入力するとオーバーフローを起こしてしまうので、どうにかしたいんです。
>>820 まず
> int a;
> cin<<a;
は
> cin >> a;
ね。
普通に
string s;
cin >> s;
で良いじゃん。
あとはlexical_castを勉強しておしまい、
>>820 何を見て「オーバーフローを起こしてしまう」って言ってるの。
標準の動作なら何も起こらず failbit が立つだけのはずなんだが。
ちょっと質問なのですが 経験者のみなさんは文字列取得関数は次のどのような形態で作っているでしょか? (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)のように処理するようにしているのですが 中の変数がどこでも使い回されるというのが少々不安なのでより良い方法ってあるのでしょうか?
2はあまりおすすめしないな マルチインスタンスとかで困るし
>>823 普通は (1) (3)
ぎりぎり (4) (コスト大)
(6) Qt4 の QString とか良いよ
俺は、返り値をstd::stringにするなー。生のポインタは触りたくない。 返却方法はmoveできるならmoveがいいな。
>>823 >>826 >生のポインタは触りたくない。
(6) std::auto_ptr<> とか
戻り値をstd::stringにする人は
エラーは例外出すってこと?
今時auto_ptrって……
boost::shared_ptrが大げさで使い方がはっきりしてればstd::auto_ptrでもいいと思うけどなぁ
VS2008SP1を入れていれば本来次期C++に導入されるshared_ptrを今からでも使うことができる shared_ptrはstd::tr1名前空間にある
おまいら漏れにも判るように話してくれ
戻り値として生ポインタを渡したくない、って目的だけだったらauto_ptrが適任だろ。 別にshared_ptrでもいいんだけど、そこでshared_ptr使っちゃうような人はC#かJavaでも使った方がいいんじゃないかなと思う。
auto_ptrはいまどきないだろ… いつ消えるか分からんのに
何十年後かには「auto_ptrは互換性のために残されています」なんてことになるんじゃないかな。
>>831 unique_ptrの件を知らない人がいたというお話
まー、auto_ptrのような用途はunique_ptrに置き換えられるから、auto_ptrは非推奨になってるはずだけど。
unique_ptrはコンテナにも入ります!
>>827 エラーの起こりにくいコード前提だな。例外は使ってないし。
837 :
836 :2010/08/26(木) 20:37:09
おっと被った。
過渡期なんだから初心者にはより多くの環境で使えるauto_ptrの方を薦めておくのは当然だと思うんだが
グローバル変数にstaticをつけると、 オブジェクト指向言語のprivateなフィールド(プロパティ)になるってことでいいんですか?
>>838 まーそうなんだけど、俺は初心者にはauto_ptrの存在自体を教えないと思う。
あぶなっかしいし、なくても何とかなる。
非推奨になるもんを初心者に教えるなよ
入門書にscanfが出てくるのと同じレベル
ヘッダにポインタを宣言する時って、 class Pointer;のように前方宣言をしますが これって、省略しても構わないんですか? 省略しているコードを見つけたもので
>>843 省略可能な文脈では省略可能としか言いようがない。
勉強してくれ。
>>843 そのような名前の何かがあるということがわからないと困る場合がある。
C++のコードは名前が一意だから、その宣言によってソースを検索できると便利な場合がある。人でも機会でも。
>>824-827 どうもありがとうございます
staticはやはりグレーなんですか、一応シビアな使い方はまだしていないんですが早急に次善策を考える必要がありそうですね
それとQString(やQt4)もなかなか面白そうなので調べてみます
>>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;
>>847 >std::cout << func() << func();
func()の実装が(2)だと、これが鼻から悪魔なんだっけ?
>>848 意図した結果にならない可能性が高いってだけで、未定義動作じゃないよ。
未定義じゃない
>>852 どっちか分からないかどうかは未定義とは関係なくね?
>>853 それを未定義動作というんじゃないかい?
仮に func の実装が
int func(void){
static int counter;
return ++counter;
}
であるとき
cout << func() << func();
の結果が
12
となるか
21
となるかが決められてないなら
未定義動作でしょ
>>854 その結果は 12 となるか 21 となるかは決まってないが、そのどちらかでなければ
ならないとは決まっている。
未定義動作は、何も決まっていない。
printf("%d %d", func(), func()); は未定義であっても cout << func() << func(); は未定義じゃないだろ。
あー、違うかな。 <<の左右の評価順も規定されてないのかな。
>>858 どちらも未定義ではない。 func() の評価順が不定という意味ではどちらも同じ。
>>861 じゃぁどう規定されてるのか言ってみろ。
cout << func() << func(); で右が先に評価されるということは 本来は (cout << func()) << func(); であるところが cout << (func() << func()); をやってることになる
operator<<(operator<<(cout,x),y); こういうことですね
>>863-864 T x = func();
T y = func();
cout << x << y
このように評価してもいいし、あるいは
cout << y << x
こんな結果になるかもしれない。
いずれも規格に反しない。
しかしそんなのって実用上では通常言われる未定義と全く変わらん定義レベルだな
馬鹿言っちゃいかん、鼻から悪魔が出ないことが保証されるんだぞ。
未定義動作は状況によっては木星圏までの文明が崩壊するからね
>>866 ×実用上
○俺の経験上
×通常言われる
○俺の言う
分かった積もりにさせられる催眠術みたいなのは困る、と茶々を入れておく
printf("%d", i++ * i++); と printf("%d", incI() * incI()); で、後者は副作用完了点があるから未定義の動作にならない というのは正しい?
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を渡すことができますか?
875 :
874 :2010/08/29(日) 20:24:16
間違えちゃった 3行目は LPRECT pRect = *ppRect ; でした
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 }
>>876 1 番目の引数を 'RECT *' から 'LPRECT *' に変換できません。
って怒られます
Hoge側は提供されてる関数なので私では弄れません
単にLPRECT型で受け付けてくれれば&rectでいいんですが
ポインタのポインタ?になっているので
構造体の配列を渡す方法がわからないのです・・・
ごめんよ。一行目は以下でよろしく。 static void Hoge( LPRECT pRect )
ばいばいおさるさん
Microsoft Visual C++ 2010 でApacheをコンパイルしたいのですが 何から手を付ければいいのかわかりません 初心者歓迎との事なので教えて貰えないでしょうか
たしか出来ないはず
WindowsでNIXアーキテクチャーの落とし子みたいなApacheを 使うことは推奨されないからこそ PC-Linuxとかが流行ってい(た)るわけで... WindowsではIISを使ってあげるのが正道 どうしてもというのであればVirtual PCでもDLして その上にPC-Linuxをインスコしてというやり方(BuildもOK)
Windowsでもapache使えるけど それは本物のapacheではない
double型の関数で、想定外の引数が渡されたときのプロっぽい書き方はどうすればいいですか? double a(int data) { double res; if(0==data || 6<=data) { printf("値が適切でない"); res=-10000000; } else { //色々な計算した後、結果をresに代入 } return(res); } 今は上記の様にして-10000000が返って来たら呼び出し元であるmainでreturn(-1); としてますけど変ですよね。
>>884 標準出力にエラーメッセージを出すのがプロっぽくないw
エラー値を生で書くのはどうにも不調法だから、せめて定数マクロに。
戻り値の値域が特定しにくい場合はNaNを返すと言う裏技を使うこともあり。
C++なら例外を使うのも手。Cなら引き数を増やす手も。
例えば、int a(int data, double * res)とかdouble a(int data, int * status)とか。
>>884 色々ありえるが、どれも一長一短というところ
状況にもよる。例えば、入力が静的で不正な引数はバグ以外にありえない、
不正な引数があっても処理を続行する必要がないというなら
assertを書いておくだけで十分かもしれない
・エラーでプログラムを落とす
・関数では何もしない。その代わり、呼び出し側が引数の妥当性を保証する
・デフォルト値(例えば0.0)を返す
・NaNを使う
・引数に変数へのポインタを取り、それに成否を書き込む
・グローバル変数を使う
・構造体(へのポインタ)を返す
・例外を使う(C++の場合)
プロっぽいと言うなら、グローバル変数を使う場合はマルチスレッドに注意だな
つーか、グローバル変数が一番トーシロっぽいんだが。
assert を書いた場合 中断する際はデストラクタは呼ばれるのでしょうか?
>>884 定数を左にもってきたりとか、returnにカッコがあったりとかが素人くさい。
892 :
デフォルトの名無しさん :2010/08/31(火) 14:33:34
定数左はともかく returnにカッコがあったりってのは確かに素人らしい。 でもそんなの気にしないでとにかく他の人のソースとかも眺めるのが良いかと。
>>892 定数左とかメリットはあってもデメリットは全く無いもんなのにな
左定数は判定したい主体が見えにくいからだめ
たとえば a < b < c という範囲を調べたいときに a < b and b < c と書く人もいれば b > a and c > b と書く人もいるし ~(a >= b or b >= c) と書く人もいるかもしれない
この場合 b が主体だから b > a and b < c と書くべきだな
不等号は常に数直線を意識して < か <= しか使わないという考え方もある
俺は><が混ざってると分かりにくいから a < b and b < cを使うな 好みの問題だと思うけど
こういうとき不等式を単純化するような機能があれば便利だけど そういう機能ってなぜか無いよね。
数学的値域の表現を思考してて それを直接指示したいケース a < b and b < c 被判定変数は b だ。 そして b の条件はこうだ思考 b > a and b < c
903 :
デフォルトの名無しさん :2010/08/31(火) 16:55:27
>>902 たしかにそういう流派でわかれるかもね。
>>903 さらに 前者の思考の場合には c > b and b > a や b < c and a < b はありえない
(記述の順=数直線上での位置 というイメージなので)
後者の場合には
b < c and b > a という記述もありえる
ショートサーキットを意識したうえで あえて入れ替えるケースもある(最適化されるかもしれんけどw)
a+bとかはa足すbってことばあるけど 不等号にはそういうことばが無いのが分かりにくくしてるような気がするね。 外人の言葉は動詞が真ん中に来るから自然に分かりやすいのだろうけど
型が変わるからありえないことなんだけど a = b = cみたいにa < b < cとかオーバーロードできたらなあ
めんどいけど出来るでしょ
returnに括弧はK&Rの初版の影響だから素人クサイというよりは老害クサイ
enumの定数を使うときにenumの名前を使わないでくださいという警告はなんのためにあるの? enum EnumName {ENUM1}; コードでEnumName::ENUM1と書くと"EnumName::"は省略してくださいという警告が出る。 いやどこの所属か明確にした方が分かりやすいだろと
910 :
デフォルトの名無しさん :2010/08/31(火) 18:54:57
その拡張はコンパイラ依存だからだろ、このカスが!
>EnumName::ENUM1 こんな書き方できるのか初めて知った
VCだとそれでインテリセンスで候補が出るので、大量の値があるとき便利なんだよなぁ。
namespace e { enum E { val }; } using e::E; こうやってる
>>892 まともな人はあんまりそういう変な工夫しないで、素直に書いてることが
多いから、素人くさく見える。
ああ、==を=とタイポすると、コンパイルエラーになるっていうしょーもないあれか。 初心者ほど好んでやる傾向にあるね まあ初心者のときしか役に立たないテクなんだけど
= タイポはちょくちょくやってしまうけど コンパイラが警告出すように設定してあるから 記述順序は気にしてないな
なぜなるべく事故をなくそうとする方法論をけなすのかがわからない まあ俺もぶっちゃけ上記のことは実行してないんだけどその考え方は合理的だし 俺が使わない理由はただ感情的な理由だけだからけなす理由(というか権利)は全くない (当たり前だけどより優先する事項があるなら話は大きく変わる)
・読み易さを軽視する理由はない ・比較対照が変数だとなんの効果もない けなすには充分だ。
919 :
デフォルトの名無しさん :2010/09/01(水) 01:57:48
>読み易さを軽視する理由はない 定数を左辺に書くぐらいは分かりにくいとは思わないから(すくなくともcでは)するなぁ コンパイルエラーや警告が必ず出ると過信するのも危ないし ただ0か非0かを判断するのに==0もしくは!=0を省略する書き方は許せない
>>918 >・読み易さを軽視する理由はない
これはまあ見逃すとして
>・比較対照が変数だとなんの効果もない
今は定数に関する話だ
>>919 省略しているんじゃないよ! むしろ==0や!=0が蛇足なんだよ!
922 :
デフォルトの名無しさん :2010/09/01(水) 02:36:51
if (n) { 〜 }
if (n!=0) { 〜 }
if (!n) { 〜 }
if (n==0) { 〜 }
if (0==n) { 〜 }
どれが読みやすい?
どれが本来の意味を表している?
>>921 じゃなくても答えてみ?
圧倒的にif(n)とif(!n)なんだけど
ワロタw
925 :
デフォルトの名無しさん :2010/09/01(水) 02:56:56
if(n)とif(!n)は1行に表示できる文字数が限られていた時代の悪習だよなぁ
んなこたない
if (!n) { 〜 }の代わりにif (n) { ; } else { 〜 }てのはあり?
ifの後なんだからやっぱり論理式にしないと だってifだし もしifの役目を他の記号か何かが担ってたなら別だけど、ifだもんな
929 :
デフォルトの名無しさん :2010/09/01(水) 08:16:12
a = n ? t : f; a = !n ? t : f;
930 :
デフォルトの名無しさん :2010/09/01(水) 08:16:55
a = b = c ? t : f;
>>922 cの場合n!=0の結果は0か1なのでif(n)とif(n!=0)は意味が違う
まともなコンパイラなら無駄を省いて同一視するが
n == false n != false は やってもいいけど n == true n != true は やってはいけないと 2ch のおっさんに聞いた
偽は唯一0だけど真は0以外だからね そりゃ真の特殊な場合であるtrue(=1)と比べるのはまずい
>>932 if (success) …とか書くのがわかりやすい。
if (success != false) …だと「成功が偽でなくて」とか、判断するのに
負担がかかる。
935 :
デフォルトの名無しさん :2010/09/01(水) 14:28:19
数値が0かどうかを判断するのに==や!=を省略するかって話だから 変数が真偽値(に準ずるもの)ならばそのまま条件式にすればいいのでは
if(a != 7){〜} if(a - 7 != 0){〜} if(a - 7){〜} どれがいいですか
ぶっちゃけどうでもいい
if(a^7){}
aが符号付の場合a-7でアンダーフローの例外が発生する可能性がある点を考慮すべき
アンダーフローではなく負方向のオーバーフローだった
>>934 > if (success) …とか書くのがわかりやすい。
まあそれは言える。bool値ってそう言う物だし。
> if (success != false) …だと「成功が偽でなくて」とか、判断するのに
> 負担がかかる。
それは、見る人がってことだよね?
コンパイラが最適化するから実行時のオーバーヘッドにはならないだろう。
あくまで見る人がつらいってことだよね。
見ずライト思ってしまうのはまだまだ頭が最適化されてないな
0と1以外意味がわからない
存在するのは 0 と !0 だけだろ
C的には0と1じゃねーかwww
>>941 > あくまで見る人がつらいってことだよね。
そりゃそうだよ。
こんなことパフォーマンスの観点で語るやついないだろ。
>>947 > こんなことパフォーマンスの観点で語るやついないだろ。
それがたまにいるんだよ。
恐ろしいことに。
貧民プログラミングですね。 それはそうと大貧民が一番楽しいよな、あのトランプゲーム。
950 :
デフォルトの名無しさん :2010/09/03(金) 19:08:01
C/C++の関数の設計について。 複数のファイル名(パス)が代入された、配列 fileList[] があるとし、ここから1ファイルだけ読み込む関数 LoadFile() を用意します。 fileList[] にある複数のファイルを読み込むには、while 等で複数回 LoadFile() を呼び出します。 以上のような仕様の関数を作るとき、 (a) ファイルを正しくオープンできたか?(ファイルがない、フォーマットがおかしい等) (b) fileList[] の最後まで読み込んだか?(最後でなければ読み込みループ継続) というのは、どのように取得するのがスマートでしょうか? Cなら (a)オープン成功か … 引数で成否を表す変数をポインタ渡し (b) リスト終了か … 関数の戻り値 C++なら (a)オープン成功か … 失敗したら例外を投げる (b) リスト終了か … 関数の戻り値 といった感じでしょうか? また、関数の戻り値でリスト終了かどうかを検知する場合、どのような戻り値にするべきでしょう? Cの標準関数を参考にしようと思ったのですが、(それぞれ機能が異なるため当然ですが)統一されていないように感じました。
typedef struct _LoadFileInfo { bool opened; bool status; FILE *fp; char *filename; } LoadFileInfo; LoadFileInfo fileList[] = { {hoge}, {fuga}, {hage} };
エスパーするとLoadFileの引数にfileListを与えないようにする。
953 :
950 :2010/09/03(金) 20:20:17
ありがとうございます。
>>951 ファイル名リストの中に、各フラグも一緒に詰め込んでしまえってことね。
で、別途で配列を走査してエラーがあったかどうか調べると。
>>952 エスパーされすぎてよく分からないのですが、どういうことでしょうか。
関数の呼び出し側でfileListからファイル名を1つだけ抽出し、それを関数に渡すべしとも取れるのですが、
それをラップするのが今回用意する関数の目的です。
っつーかクラス使えよ
>>954 別途 fileLoader::err() みたいな関数なり、専用の変数なりを用意するってこと?
>>953 エスパー失敗したようですごめんなさい。
複数のファイル読み込みがトータルで成功したか失敗したかだけではなく、
どのファイルで失敗したかを知りたい?
でもそれなら失敗したファイル名を返せばいいだけだと思うし。。
>>956 どのファイルで失敗したか? もそうですが、
IOのコストが高い(と言っても数秒ですが)ので、1つでも失敗した瞬間にエラーが返ってきてほしいなあと。
まあ、それに関してはマルチスレッドしろよって話なんですけどね。
なんかこの流れ、どっかで見たような…
>>957 失敗したら抜ければいいんじゃないの
擬似コードだけど、こういう構造のどこに不満があるのかを書いたほうがいいかも。
foreach (filename in filelist){
if (fileload(filename) is failed)
return filename;
return nullstring;
}
>950>957 オープン正否と、リスト読み込み正否を区別する必要はある? 読み込み失敗時点で終了すればよいのだったら、配列だから0から順番に読むことにして、 処理できたindexと、成功/失敗(失敗要因)を返せばイイと思うが。 途中で失敗しても、一通り処理したいのであれば、fileListに対応した処理結果を格納する配列を 渡して、値をセットする方がいい。 >951のようにfileListそのものに処理結果を含める方法もあるが、fileListと処理結果メンバにした 構造体にする方がベターだと思う。
961 :
950 :2010/09/04(土) 10:58:47
遅レスすみません。
・ファイル一覧の配列を用意する(fileList)
・1回の呼び出しで1つだけファイルを読み込む
多少の変更は問題ないですが、以上の2つの仕様は前提条件のつもりです。
>>959 ですので、全部まとめるわけにはいきません。
別途、一括ロード関数を用意するかもしれませんが。
>>960 オープン成否と、読み込み終了とを区別する必要はあります。
自分用ライブラリ的なものを想定しているので、その区別を認識するかどうかは呼び出し側のコード次第で。
オープン失敗ファイルのリスト化など、とりあえず方向性(は見えてきたので、色々試してみようと思います。
ありがとうございました。
sine
質問よろしいでしょうか? 構造体の配列の初期化で A_St(構造体型名) A[10] = { 〜〜〜〜 }; とやると 最初のA[0]のみ{ 〜〜〜〜 }の間の値で初期化されるのでしょうか? それともA[9]まで{ 〜〜〜〜 }の値で初期化されるのでしょうか?
>>963 いえ、明示したもの以外は0を入れた感じでで初期化され
POD型の話だよね?
関数のプロトタイプ宣言についてなんですがこれは引数の変数名も書いたほうがいいですか? 今は無意味にこだわって型名だけにしているんですがなにかセオリーとか各々にする理由とかありますか?
いつも定義からコピペしてるからそんなこと考えたこともなかったな
変数名は書かない方が良い
>>965 名前がないと引数順序分からなくね?
名前つけてればヘッダ見るだけで引数の順序が分かってありがたい
インテリセンス使うと名前のありがたみがさらに倍
>>966 いや、それも無視できない理由の一つだと思います
コピペすることによって手間を減らせるし(というか削除が手間)不整合がそもそも起きない
>>968 ああ、それもありますね
今思うと無駄に順序を考えて関数を使用することがあったと思います
どうもありがとうございます
というかよく考えるとなぜ変数名を消すようになったのかよく覚えてません
>>965 の質問を変更してプロトタイプ宣言から変数名を消すメリットってありますか?
>>967 それはなぜでしょう?自分にはメリットが分からなくなってます
>>961 >>959 は「ファイル一覧」「1回の呼び出しでひとつだけファイルを読む関数」
を利用した、一括ロード処理をする擬似コードだよね。
オープン失敗ファイルをリスト化するってことは、失敗したら即エラーを返したいという
要求からずれているように思うよ。
>>969 消すとプロトタイプ宣言がスッキリするとか、仮引数名を変更した時にずれにくいとか考えていたころがあったなぁ。
今は消さなくなったよ。
>>965 仮引数名は書いた方がよい
プロトタイプ宣言を見ただけでだけでその関数の仕様が理解できるというのが理想
自分の作ったライブラリを他人が利用することを考えてみればいい。あるいはその逆も。
ちょっと極端な例だけど
data_copy( void*, void*, size_t );
だけだと、どっちのvoid*にソースとデスティネーションを渡せばいいか混乱するかもしれない
data_copy( void* dst, void *src, size_t size );
ならdstにsrcがコピーされるってのがすぐにわかるだろ?
構造体(具体的には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にはアドレスが入ってるという認識は間違ってませんか?その辺も自信がなくなってきました
値渡しを理解しろ
>>973 main() の t_st は初期化されていないポインタなので何が入ってるかわからない。
また、引数への代入は呼び出し元に影響しない。 C++ の参照型を使えば話は少し変わってくるけどね。
もちろん、引数への代入と、引数が指す先への代入も別。
localtime() が返すポインタはちょっと特殊なんで、それがどういうものかマニュアルを
確認するといい。
>>971-972 やはり分かりやすさなどを見ると書いてあったほうがいいですよね
どうもありがとうございます
>>971 >消すとプロトタイプ宣言がスッキリする
もしかしたらこんな理由だった気がする
>>973 最初の例だと、確かに *t_st に値を入れることはできる。
だが、今やりたいのは t_st に値を入れることで、それには下の例でないとできない。
>>970 >前半
ああ、勘違いしてました。
提示された擬似コード全体を1つの関数とみなす(つまり関数の中身を書いた)のかと思っていました。
擬似コードではforeachを使って、ファイル一覧から1要素取り出していますが、
この部分も関数の中に突っ込んでしまえたらスッキリしそうですよね。
>後半
即エラー云々については要求仕様ではないので、ささいな変更であるとしました。
このひとなんか変だ
質問のための質問を繰り返してるな 解決への意欲が感じられない
982 :
973 :2010/09/05(日) 14:38:38
>>974-978 ありがとうございます。もっと簡単なコード書いてデバッグしてみたりしてだいぶ分かってきました。
ポインタをもっと勉強してきます
基本的にファイルの操作って、1バイトごとなんですか? FILE構造体とかフレームワーク使った時etc
>>983 どの操作かいってくれないとあれなんだが
基本裏でうまいことバッファリングされてるのであまり気にしなくていいよ
でもそこそこまとまって読んだり書いたりする人が多いと思う
主観だけど
>>983 ライブラリ内部の話なら、適当にブロック単位で読んで操作することが多い。
ユーザーコードの話なら、byte単位で処理できないと色々不便だ。
ブロック単位で処理するときは、文字列なら正則表現でばばっとやったりするが、バイナリだとそういう機構は自作だろう。
986 :
983 :2010/09/05(日) 15:47:14
>>984 100MBのファイルを1MB * 100個に分割したいんですね
それで、qt4のqfileってのを使おうと思っているわけですが
seek()の単位がバイトごと?なので
FILE構造体でも同じなのかな〜と思ったわけです
>>886 stdioのFILEなら、一番単純な方法で、
FILE変数を2つ用意して一個を読み込みオープンしてもう一個を書き込みオープンして初期化する。
で、1mbのバイト配列を用意して、読み込み用からfreadでブロックで呼んで、書き込み用にfwriteでブロックを書き込む。
書き込み用をクローズして別名で再オープンして上記を繰り返せばいいと思う。
988 :
987 :2010/09/05(日) 16:00:52
>>986 ひょっとしてファイル操作とかでの最小単位の話をしてるんだろうか?
その手の扱いでバイト単位以外聞いたこと無いな
990 :
986 :
2010/09/05(日) 16:14:42 おまえら、ありがとうな もうっちょっと、自分で調べる事にする