【初心者歓迎】C/C++室 Ver.73【環境依存OK】
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001//
2010/05/21(金) 07:38:47ただしその場合、質問者は必ず環境を書きましょう。
※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:31x=0の時はどういう処理にすれば良いのですか?
0003デフォルトの名無しさん
2010/05/21(金) 10:46:42fabs(x)>fabs(y) のとき y/x
fabs(x)<fabs(y) のとき x/y で計算しておいて M_PI/2 から引く
0004デフォルトの名無しさん
2010/05/21(金) 10:49:060005デフォルトの名無しさん
2010/05/21(金) 13:31:06構造体名前 [] = {{k,l,m},{o,p,q},}とすると0番目の配列から上書きされてしまいますか?
3番目と4番目に入れたいのですが[3]=;[4]=とわけて書かないといけないのでしょうか?
0006デフォルトの名無しさん
2010/05/21(金) 13:31:480007デフォルトの名無しさん
2010/05/21(金) 14:30:030008デフォルトの名無しさん
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:590012デフォルトの名無しさん
2010/05/22(土) 18:02:200013デフォルトの名無しさん
2010/05/22(土) 18:06:50ためしに適当に継承されてるクラス作ってstatic_castやってみればわかる
0014デフォルトの名無しさん
2010/05/22(土) 18:18:33ありがとう
0015デフォルトの名無しさん
2010/05/23(日) 02:27:513時間くらいぶっ通しで悩んでたら原因がif( = )だった…
エラー出ないのですか?
0016デフォルトの名無しさん
2010/05/23(日) 02:32:110017デフォルトの名無しさん
2010/05/23(日) 02:39:06だったのですが文法的に正しいのですか?
0018デフォルトの名無しさん
2010/05/23(日) 02:48:580019デフォルトの名無しさん
2010/05/23(日) 02:53:14== true
こんなの書くなよ
0020デフォルトの名無しさん
2010/05/23(日) 03:28:38まあ = true なんて不要というのは確実な話だが
今回はたまたまbool型だったに過ぎない話だな
0021デフォルトの名無しさん
2010/05/23(日) 03:45:260022デフォルトの名無しさん
2010/05/23(日) 03:57:01if (islower(c) == true) { ... } とか書いてハマるタイプ
0023デフォルトの名無しさん
2010/05/23(日) 04:05:31論理定数との比較がナンセンスなんだよ。
0024デフォルトの名無しさん
2010/05/23(日) 04:19:56if (xxx) { ... } しか書いてない場合、意図通りに動くか不安なんだよな。。
0025デフォルトの名無しさん
2010/05/23(日) 04:33:370026デフォルトの名無しさん
2010/05/23(日) 04:53:49if( fab(フトートの計算 )<=1/2)&&〜←バグ
if( fab(フトートの計算 )<=0.5f)&&〜←成功
何故ですか?
0027デフォルトの名無しさん
2010/05/23(日) 04:55:59is系関数はその最たるもので、
is系用の共通テーブル参照→ビット演算で目的のビットを取り出す
で実装される事があるので、真のときは1以外の値が返ってくるのが普通
Windows APIのBOOL型の値を返す関数も
MSDNには「正常な時には0以外の値を返す」のように、必ず1を返すとは書かれない
(GetMessageのような例外はあるが、あれはBOOLと言いつつ0,1,-1の3値を返す関数だから・・・)
1以外の値が返ってくる可能性は常に考えないといけない
真偽値と比較する癖を付ける1以外が返って来た時にハマる
危険極まりない
bool型なら安全だろうけど、癖になってると他の型の値でもやる事になるはずだ
0028デフォルトの名無しさん
2010/05/23(日) 04:57:041/2 == 0
×fab
○fabs
×フトート
○float, フロート
0029デフォルトの名無しさん
2010/05/23(日) 05:00:56マジですか!?
フロートと整数の分数を比べたら小数点が全て切り捨てられるってことですか!?
全然知りませんでしたorz今気付けて良かったです。ありがとうございました
0030デフォルトの名無しさん
2010/05/23(日) 05:02:571.0/2.0なら浮動小数点数演算。結果は0.5になる。
0031デフォルトの名無しさん
2010/05/23(日) 05:06:53ほんとうにありがとうございました
0032デフォルトの名無しさん
2010/05/23(日) 09:41:57これはひどい
0033デフォルトの名無しさん
2010/05/23(日) 09:42:30バグ作ってるだけだべ
0034デフォルトの名無しさん
2010/05/23(日) 09:51:26== true の代わりに != false を使う事になって
二重否定でとても読みにくい
0035デフォルトの名無しさん
2010/05/23(日) 09:53:350036デフォルトの名無しさん
2010/05/23(日) 09:58:32>>34とは根本的に違う
0037デフォルトの名無しさん
2010/05/23(日) 12:50:040038デフォルトの名無しさん
2010/05/23(日) 13:15:500039デフォルトの名無しさん
2010/05/23(日) 16:42:53希望としてはそのインスタンスに対してなんらかの操作(結合とか)をするまでは有効だとうれしいんですが。
勝手にメモリが移動したりとかそんな挙動があったらイヤです。
0040デフォルトの名無しさん
2010/05/23(日) 16:51:130041デフォルトの名無しさん
2010/05/23(日) 17:01:000042デフォルトの名無しさん
2010/05/23(日) 17:01:35ありがとうございます!!!
0043デフォルトの名無しさん
2010/05/23(日) 17:01:54流石にそりゃないだろう
0044デフォルトの名無しさん
2010/05/23(日) 17:04:320045デフォルトの名無しさん
2010/05/23(日) 17:08:16std::stringである事を特に利用しないなら
関数の引数はconst char*にした方がいいよ
std::stringである事を利用したいなら別だが
0046デフォルトの名無しさん
2010/05/23(日) 21:10:01Cではヘッダをインクルードして関数名を書けば使えたと思うのですが
C++ではnewなどをしないと使えないのですか?
0047デフォルトの名無しさん
2010/05/23(日) 21:15:360048デフォルトの名無しさん
2010/05/23(日) 21:29:53クラス::関数名();でも使えるってことですか?
newして 名前ー>関数()とするのとはどう違うんですか?
0049デフォルトの名無しさん
2010/05/23(日) 21:48:220050デフォルトの名無しさん
2010/05/23(日) 22:01:210051デフォルトの名無しさん
2010/05/23(日) 22:17:35http://codepad.org/ ここで試せ。
http://www.google.co.jp/ ここでググれ。
0052デフォルトの名無しさん
2010/05/23(日) 22:19:480053デフォルトの名無しさん
2010/05/23(日) 22:22:460054デフォルトの名無しさん
2010/05/23(日) 22:28:16入門書の1冊でも買って読んでください
0055デフォルトの名無しさん
2010/05/23(日) 22:32:39プログラミングは2年やってますし
0056デフォルトの名無しさん
2010/05/23(日) 22:32:530057デフォルトの名無しさん
2010/05/23(日) 22:48:53あとで正しく理解するのに苦労しそうだな
0058デフォルトの名無しさん
2010/05/23(日) 22:48:540059デフォルトの名無しさん
2010/05/23(日) 22:53:170060デフォルトの名無しさん
2010/05/23(日) 22:55:570061デフォルトの名無しさん
2010/05/23(日) 22:56:000062デフォルトの名無しさん
2010/05/23(日) 22:58:57給料泥棒すぎるだろそいつ…
0063デフォルトの名無しさん
2010/05/23(日) 23:18:36staticメンバならそのまま呼べる。そうでないならインスタンスを作成してから呼ぶ。
0064デフォルトの名無しさん
2010/05/23(日) 23:30:50普通API使うだろ。知らなくてよし
0065デフォルトの名無しさん
2010/05/23(日) 23:46:500066デフォルトの名無しさん
2010/05/23(日) 23:49:120067デフォルトの名無しさん
2010/05/23(日) 23:49:140068デフォルトの名無しさん
2010/05/24(月) 00:07:07勘違いしてる初心者も多いけど
ラップ(バッファリング)することによって
システムコールの回数を減らす方が、
毎回呼び出すよりずっと処理が軽くなるから。
0069デフォルトの名無しさん
2010/05/24(月) 01:24:28int 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モダンなOSなら自分でバッファリングしてるし
メモリマップトI/Oや非同期I/Oもある
標準ライブラリを使うのはパフォーマンスのためというのは間違いで、
単純に移植性のためだ
それと、Windowsではファイル名が固定の場合以外にfopen()使ってるプログラムは
全て糞と断定していい
0071デフォルトの名無しさん
2010/05/24(月) 13:23:21Bのcppでグローバル位置で宣言するとA.objで既にあるので未解決のシンボルとエラーが出る
Bのcppの使う関数の中で宣言すると通る
なぜですか?それと、値はちゃんと入ってますか?
0072デフォルトの名無しさん
2010/05/24(月) 13:28:30宣言と定義を含め、externするとか初期化するとか、用語の使い方が胡散臭くてよくわからん。
意味をよく調べて言いなおすか、ソース貼ったほうがいいよ。
0073デフォルトの名無しさん
2010/05/24(月) 13:40:40全く同じ物を代入しようとしてたみたいです
それで未解決になったのかはわかりませんが。
0074デフォルトの名無しさん
2010/05/24(月) 13:46:26言いたいことは彼と一緒だと思うよ。直APIという言葉がうさんくさいけど、
その後を読めばAPI使ったほうが軽いといっているように見える
0075デフォルトの名無しさん
2010/05/24(月) 15:43:53「カーネルモードへの移行」が、
単純な関数呼び出しより重い処理だと言う話だ。
OSのキャッシュとかは全然関係ない。
メモリ確保等でも同様。
0076デフォルトの名無しさん
2010/05/24(月) 15:46:240077デフォルトの名無しさん
2010/05/24(月) 16:57:18パフォーマンスの話だろ?
パフォーマンスが重要なら、
mmap()やwritev()やreadv()、sendfile()のような物が使えるときはそれを使う
当たり前だろ
DBMSみたいなソフトウェアの実装でstdio使ってるとでも思ってるのか?
Berkeley DBのソースでもよめや
stdio使うのは移植性だよ
0078デフォルトの名無しさん
2010/05/24(月) 17:03:18実測で差が有意だ と わかってるなら
0079デフォルトの名無しさん
2010/05/24(月) 17:06:28勿論有意だからこそ、本当にI/Oパフォーマンスが重要なところでは
誰もstdioなんぞ使わないんだよ
バッファリングしてるから速いって、アホか?
stdioバッファへの余分なコピーが「常に」発生するのがstdioだ
ポータブルなgetc()やらではマルチスレッド対応の排他制御までオマケつきだ
0080デフォルトの名無しさん
2010/05/24(月) 17:09:33ファイルI/Oなんかよりも遥かにのんびりしたヒューマンI/Oがあるんですから。
0081デフォルトの名無しさん
2010/05/24(月) 17:10:27>それと、Windowsではファイル名が固定の場合以外にfopen()使ってるプログラムは
これの根拠を知りたい。
0082デフォルトの名無しさん
2010/05/24(月) 17:18:22Windowsではstdioは使っていいけどfopen()はダメ
>>81
ファイルシステムがUTF-16なのに、fopen()はUTF-16ファイル名を扱えないからだよ
0083デフォルトの名無しさん
2010/05/24(月) 17:26:13ってことは、ファイル名が固定でなくても制限できればいいんでないの?
つまり、「ユーザに任意のファイル名を扱わせたいのならfopen()はダメ」ってことじゃない?
0084デフォルトの名無しさん
2010/05/24(月) 17:32:37厳密に言えばそうなるかもしれんが、何かそこに重要な意味があるの?
0085デフォルトの名無しさん
2010/05/24(月) 17:36:14「ユーザに任意のファイル名を選択させておいてfopen()を使っているプログラムは糞」なら兎も角。
最初からそう書いていれば、無用な反発も避けられるし>81が質問する必要もなかった。
0086デフォルトの名無しさん
2010/05/24(月) 17:37:22近所の大型書店走査しても参考書売ってねーんだけど
0087デフォルトの名無しさん
2010/05/24(月) 17:44:12面倒くさい奴だな…
> Windowsではファイル名が固定の場合以外にfopen()使ってるプログラムは糞
と
> ユーザに任意のファイル名を選択させておいてfopen()を使っているプログラムは糞
は大した違いないだろ
後な、現実問題として、例えばユーザプロファイルディレクトリのような
ファイルシステム上重要なディレクトリも全てUTF-16で、
Windowsにおいて、それはプログラムが勝手に選べるものじゃないんだぞ?
Windowsでfopen()使ってるのは、Unix系のソフトウェアの手抜き移植か
オモチャだけだよ
0088デフォルトの名無しさん
2010/05/24(月) 18:42:00MSDNとかmanとかで勉強してみてはいかがか
0089デフォルトの名無しさん
2010/05/24(月) 21:33:02int hogehoge::createHash( char *p, int size )
{
//処理
}
int hogehoge::createHash( )
{
return createHash(data, size);
}
見たいに、内部データのハッシュを返す関数と
オーバーロードして任意のハッシュを返す関数二つを公開してるんだが
これだとクラスが使われ方知ってない?とか言われた
こういう書き方って駄目?静的にすればいいのかな
0090デフォルトの名無しさん
2010/05/24(月) 21:45:57createHash(const hogehoge &)にする
staticかfriendにしなければ実装できなければそうするか、あるいはメンバcreateHash()にする
0091デフォルトの名無しさん
2010/05/25(火) 01:02:22作るという関係があるとします。 これら、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:160093デフォルトの名無しさん
2010/05/25(火) 01:51:03AAのインスタンスが無い(もともとインスタンスを獲る為のメソッド)ので
virtualを呼ぶ為のオブジェクトがありません。
0094デフォルトの名無しさん
2010/05/25(火) 01:52:170095デフォルトの名無しさん
2010/05/25(火) 01:53:100096デフォルトの名無しさん
2010/05/25(火) 02:34:37こう言うとメモリの事とかについて何か言い返してきそうだな
0097デフォルトの名無しさん
2010/05/25(火) 02:57:57そう出来れば楽なのですが、制約事項として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(); }
009891
2010/05/25(火) 03:02:50main () {
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:500100デフォルトの名無しさん
2010/05/25(火) 03:05:47じゃぁこれで。
template<class A> class CC { void doA() { A::doA(); } };
CC<AA> c;
CC<AAA> c;
010191
2010/05/25(火) 03:22:52CC::doA()が呼ばれる文脈でAAのインスタンスへの参照が無いからです.
ここで書いたmain()は省略した見本でして、実際の実行環境の制限事項を
反映してません。
>>100
出来ればCCは1つのライブラリで済まし、AAから派生したAAA1, AAA2, AAA3
に対して1つのバイナリで済ませたいなと思ってます。CCの機能はそれぞれの
AAA*に対して全く共通なので。
0102デフォルトの名無しさん
2010/05/25(火) 03:40:310104デフォルトの名無しさん
2010/05/25(火) 03:57:07既存のフレームワークとやらでメンバ変数経路は変更不能で、
呼ばれる文脈とやらも変更不能なんだろ?
そこに AA のインスタンスを渡す必要があるんだろ?
グローバル使う以外に何も見えてこないじゃないか。
0106デフォルトの名無しさん
2010/05/25(火) 08:21:14のですが「.」を押してもメンバ変数がポップアップされません
これは上手く入ってないのでしょうか?
0107デフォルトの名無しさん
2010/05/25(火) 09:42:04有り難うございます。
内部のcreateHashはclass独自の物ですが、中々優秀で他でも流用したいが為に公開していました。
一々、hogehogeを作成しメンバ設定、その後にcreateHashでは面倒に思えるのですが。。
今はstaticを付けていますが、今後は別の方法を試すべきでしょうか?
0108デフォルトの名無しさん
2010/05/25(火) 10:40:410109デフォルトの名無しさん
2010/05/25(火) 11:53:25有り難うございます
皆さんだったら、どのように書きますか?
是非参考にさせて下さい。
0110デフォルトの名無しさん
2010/05/25(火) 14:58:590111デフォルトの名無しさん
2010/05/25(火) 15:23:45http://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ありがとうございました
0113デフォルトの名無しさん
2010/05/25(火) 17:44:49メンバ関数ポインタをエミュレートできるとおもったら.*はオーバーロードできねーのかよ
->*ならできるのにこの差別はひどい。がっかりだ
0114デフォルトの名無しさん
2010/05/25(火) 17:45:580116デフォルトの名無しさん
2010/05/25(火) 17:53:44これ、豆知識なお坊ちゃん
0117デフォルトの名無しさん
2010/05/25(火) 20:14:36低脳は>>113は理解できない
>>113が何を言っているか解るか? なら日本語でお前がしゃべってくれ
0118デフォルトの名無しさん
2010/05/25(火) 20:33:350119デフォルトの名無しさん
2010/05/25(火) 21:30:14阿呆な奴は>>113の言ってることを理解できない
君は>>113が言ってることを理解できてるのかい?
理解できているなら君が日本語で話してくれ
駄目だ
117が何を言いたいのか分からん
0120デフォルトの名無しさん
2010/05/25(火) 21:47:12もし>>114が阿呆でなく、理解できるのであれば、>>117は>>113を理解できない阿呆であるので
>>114が日本語に翻訳してくれないだろうか。
ということじゃないの?
>>114は>>113を理解できていないのは明白なので、なぜ>>114に対してそういったのかは
俺にもわからん。
0121デフォルトの名無しさん
2010/05/25(火) 22:19:540122デフォルトの名無しさん
2010/05/25(火) 22:20:32>>113を訳してくれ、低脳君
0123デフォルトの名無しさん
2010/05/25(火) 22:44:18自己紹介乙
0124デフォルトの名無しさん
2010/05/25(火) 22:45:09>>113の
>.*はオーバーロードできねーのかよ
出来ない理由を教えろ
0125デフォルトの名無しさん
2010/05/25(火) 22:50:390126デフォルトの名無しさん
2010/05/25(火) 23:01:20operator.をオーバーライド可能にするとメンバへのアクセス手段がなくなるから、とかじゃなかったっけ?
で、operator.*も同じ理由。
D&Eにそんなようなことが書いてあった気がする。
0127デフォルトの名無しさん
2010/05/25(火) 23:05:43.* と ->*
こう見ると分かりやすいな
0128デフォルトの名無しさん
2010/05/26(水) 06:34:030129デフォルトの名無しさん
2010/05/26(水) 06:35:280130デフォルトの名無しさん
2010/05/26(水) 07:27:41getsかなと思って調べたら絶対に使うなとか書いてあるし、fgetsはファイルを扱う関数なのでどうすれば良いかわかりません
教えてください
0131デフォルトの名無しさん
2010/05/26(水) 08:01:06インポート依頼が処理されずに止まったままなんだ。
0132デフォルトの名無しさん
2010/05/26(水) 09:04:24fgets(...., stdin)
0133デフォルトの名無しさん
2010/05/26(水) 09:11:35ありがとうございます
fgetの一つ目の配列は取得した文字を入れる配列ですよね?
二つ目の引数のstdinは標準入力から取得すると見たように思うのですが、どうやって元の文字列の配列を選択するのでしょうか?
0134デフォルトの名無しさん
2010/05/26(水) 09:35:37日本語でOK。
文字列から文字列を分解したいのか、(gets()のように)標準入力から文字列を得たいのか、どっちなのかと。
後者ならchar buf[DesiredSize]; fgets(buf, sizeof(buf), stdin);とすればいいし、
前者ならsscanf()かsprintf()で切り張りすればいい。
0135デフォルトの名無しさん
2010/05/26(水) 09:38:53ただし、元の配列の中身は破壊される
0136デフォルトの名無しさん
2010/05/26(水) 09:42:50>>135
ありがとうございます
strtokで\0を入れた後、それぞれを配列に入れる方法がわかりません
教えてください
0137デフォルトの名無しさん
2010/05/26(水) 09:47:25尤も、sscanf()をどうしても使いこなせないならstrtok()を使うことを止めはしないが。
0138デフォルトの名無しさん
2010/05/26(水) 09:48:57なんで自分がやりたいことの説明ができないの? 馬鹿なの? 日本人じゃないの?
0139デフォルトの名無しさん
2010/05/26(水) 09:51:260140デフォルトの名無しさん
2010/05/26(水) 09:54:01すません
やりたいことはchar 型の文字列があって\nがたくさんあって、ファイルで表示すれば1行ごとになるはずの文字列を取り出してそれぞれの行を違う配列に入れたいのです
0141デフォルトの名無しさん
2010/05/26(水) 09:54:290142デフォルトの名無しさん
2010/05/26(水) 09:56:140143デフォルトの名無しさん
2010/05/26(水) 10:19:020144デフォルトの名無しさん
2010/05/26(水) 10:43:00入力は改行文字を多数含んだ文字列と言うことだが、それはいきなり渡されるということなのか?
要は、作ろうとしているのは関数なのかプログラムなのか、その辺りもはっきりさせてくれ。
0145デフォルトの名無しさん
2010/05/26(水) 10:51:01その配列から改行までの区間を何個か取り出して、違う配列に入れるなりして元の文字列のある行の文字の部分だけを新しい文字列として使いたいのです
0146デフォルトの名無しさん
2010/05/26(水) 10:57:25すでにでかい配列に読み込み済みなら gets() も fgets() も関係ないな。
そのままプログラム書けよ。
ひととおり書いて、 http://codepad.org/ に晒して、不満な箇所を具体的に
挙げるといいよ。
0147デフォルトの名無しさん
2010/05/26(水) 11:00:42なるほど、でかい配列を使いたくないのでfgetsなどでやるわけですね。
sscanfでできそうなので続けて見ます
0148デフォルトの名無しさん
2010/05/26(水) 11:06:44つーか、なんでグローバル変数なんかにテキスト入れるのかねぇ。
相変わらず説明下手だし。
0149デフォルトの名無しさん
2010/05/26(水) 11:12:13知識が無いので自分も何を伝えるべきなのかわからないのです
>strchr()で改行文字を探して、一文字ずらして行頭のリストを作れば事が足りそうなんだが。
>つーか、なんでグローバル変数なんかにテキスト入れるのかねぇ。
と当たり前のごとく言われても、どういう方法なのか、なぜグローバル変数にテキストを入れたらいけないか、普通はどうするのか、等、わからないのです。
0150デフォルトの名無しさん
2010/05/26(水) 11:21:56弄られることになるし
詳しく説明してもらえないし
見当違いのレスを読むことになるわけで。
心穏やかに他人になった積もりで>145を読んで、
それで何をしたいか判るかね。
0151デフォルトの名無しさん
2010/05/26(水) 11:25:55どこがわからないのですか?
自分は完璧に説明したつもりなのですが
そちらは知識が多すぎて混乱してしまうのかもしれませんが
0152デフォルトの名無しさん
2010/05/26(水) 11:28:220153デフォルトの名無しさん
2010/05/26(水) 11:31:250154デフォルトの名無しさん
2010/05/26(水) 11:33:350155デフォルトの名無しさん
2010/05/26(水) 11:37:42の状態にしたいのです
0156デフォルトの名無しさん
2010/05/26(水) 11:52:42char 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:52strcmpを使うとちゃんと一致したりします
あれはどうなっているのでしょうか?
0158デフォルトの名無しさん
2010/05/26(水) 22:18:350159デフォルトの名無しさん
2010/05/26(水) 22:21:510160デフォルトの名無しさん
2010/05/26(水) 22:25:420161デフォルトの名無しさん
2010/05/26(水) 23:13:46defineの最後に;つけてたら一番最後の関数で)だの;}のエラーが出やがった
偶然気付かなきゃ一生やってるレベル
0162デフォルトの名無しさん
2010/05/26(水) 23:21:490163デフォルトの名無しさん
2010/05/27(木) 00:05:19デバッガの使い方はその開発環境のスレでどうぞ。つーか、Cの文字列の仕組みくらい勉強しましょう。
0164デフォルトの名無しさん
2010/05/27(木) 11:34:420165デフォルトの名無しさん
2010/05/27(木) 11:49:37LP: LongPointer(16bit時代は32bitポインタをLongPointerと呼んだ)
C: Const
T: Tchar
STR: STRing
これらを適当に組み合わせただけ
0166デフォルトの名無しさん
2010/05/27(木) 13:48:260167デフォルトの名無しさん
2010/05/27(木) 18:24:52死ねばいいと思うよ
0168デフォルトの名無しさん
2010/05/27(木) 20:09:14問題尾大有りだ
0169デフォルトの名無しさん
2010/05/27(木) 20:13:38結構適当でも動く
0170デフォルトの名無しさん
2010/05/27(木) 22:10:060171デフォルトの名無しさん
2010/05/27(木) 22:11:200172デフォルトの名無しさん
2010/05/27(木) 22:16:200173デフォルトの名無しさん
2010/05/28(金) 09:15:30ファイル名を変更するにはどうすれば良いのでしょうか?
ファイル名 変更 c++等とぐぐっても出てきません。方法を教えてください
0174デフォルトの名無しさん
2010/05/28(金) 10:02:24検索の仕方が間抜け過ぎだろ。
「ファイル名変更」「c」で検索して3番目によると、rename()を使えとある。
0175デフォルトの名無しさん
2010/05/28(金) 10:46:140176デフォルトの名無しさん
2010/05/28(金) 13:39:53newのオーバーヘッドを避けたいなら侵入型リストでもいい
0177デフォルトの名無しさん
2010/05/28(金) 15:08:51#define Vector std::vector
と書く以外でいい方法はありますか
0178デフォルトの名無しさん
2010/05/28(金) 15:11:33置き換えないのが一番いい
0179デフォルトの名無しさん
2010/05/28(金) 15:11:550180デフォルトの名無しさん
2010/05/28(金) 15:25:03そのうち自作クラスと置き換えとか色々やってみたいので
差し替えが簡単なように書いておきたいのです
>179
メタ関数というのは初耳ですが調べて試してみます
ありがとうございました
0181デフォルトの名無しさん
2010/05/28(金) 16:09:35using std::vector;
0182デフォルトの名無しさん
2010/05/28(金) 16:57:29using std::swapをしらなくてstd::swapにしちゃうカスが同僚にいても安心程度のメリットしかないように思えるんだけど…
0183デフォルトの名無しさん
2010/05/28(金) 17:19:51オーバーヘッドは気にならないからシンプルにいけるカウンタ方式がいいのだけど
weak_ptrと同様の実装をするとダングリングポインタの問題をどうにかしないといけないんですよねぇ・・・
0184デフォルトの名無しさん
2010/05/28(金) 18:33:57stdにswapを追加したことはないが、std::swapの特殊化を明示的に行うことは多々あるな
0185デフォルトの名無しさん
2010/05/28(金) 20:31:12boost::swapもあるよ
0186デフォルトの名無しさん
2010/05/28(金) 20:33:23usingつかうと名前かぶる危険。
defineの置き換えもつかワン方が良い。
ただの置換のうえに、他のコードにも影響出る。
0187デフォルトの名無しさん
2010/05/28(金) 21:16:32ないだろうな
stdの中をいじるデメリットの方が大きいと思う
0188デフォルトの名無しさん
2010/05/28(金) 21:39:50テンプレートのライブラリで値を交換するとき
通常(?)はstd::swapを使うでしょ
特殊化されていれば効率とか、例外安全性があがる可能性がある
0189188
2010/05/28(金) 21:51:000190デフォルトの名無しさん
2010/05/28(金) 21:58:26通常はstd::swapを使うってのは無いな
オブジェクトの型がプログラマにわかってるならドキュメントなりヘッダを調べて
メンバのswap
同じ名前空間のswap
stdのswap
の順番に明示的に書く
オブジェクトの方がテンプレートでコードを書いてる時には分からない場合は
TMPでメンバのswapを検索してあればそれを明示的に使う
見つからなければusing std::swap;して修飾なしのswap
0191デフォルトの名無しさん
2010/05/29(土) 00:10:33char *A=new char [1000];
cout<<sizeof(A)<<endl;
0192デフォルトの名無しさん
2010/05/29(土) 00:16:37_msize
ヒープに割り当てられたメモリ ブロックのサイズを返します。
0193デフォルトの名無しさん
2010/05/29(土) 00:35:07わりといい加減に確保してくるな。
0194デフォルトの名無しさん
2010/05/29(土) 01:08:53そんな手間をかけなくて済む(かつ、バグの温床に)ならないようにstd::swapを特殊化するわけだが。。。
気にせずstd::swapでかけるようになるんだよ。
0195デフォルトの名無しさん
2010/05/29(土) 01:15:38関数テンプレートの部分特殊化ができれば全部それでもいいんだけどね
0196デフォルトの名無しさん
2010/05/29(土) 01:32:510197デフォルトの名無しさん
2010/05/29(土) 03:18:09浅はかな俺を許してくれ。
つまるところがんばって書き分けないとダメってことになるのかなorz
0198デフォルトの名無しさん
2010/05/29(土) 07:44:15std::swapを特殊化せずに、その検索をやってくれるのがusing boost::swap
0199デフォルトの名無しさん
2010/05/29(土) 07:54:32boost::swap(lhs, rhs);
0200デフォルトの名無しさん
2010/05/29(土) 08:10:550201デフォルトの名無しさん
2010/05/29(土) 08:14:06そこが便利なところ
0202デフォルトの名無しさん
2010/05/29(土) 08:26:33メンバは検索してくれないじゃん・・・
0203デフォルトの名無しさん
2010/05/29(土) 19:03:04普通メンバswapがあったらフリー関数swapも作るだろ常識的に考えて
0204デフォルトの名無しさん
2010/05/30(日) 22:23:13デバッグでウォッチを見ると
「sin(0.0) CXX0017: エラーです: シンボル "sin" が見つかりません」
となってしまいます、動作自体はしっかりしているようなのですが
気になりますので教えてください
0205デフォルトの名無しさん
2010/05/30(日) 22:24:060206デフォルトの名無しさん
2010/05/30(日) 22:26:090207デフォルトの名無しさん
2010/05/30(日) 22:55:12ありがとうございます
恥ずかしながらコンパイルオプションの追加の仕方がわかりません...
プロパティ->リンカ->コマンドラインの追加のオプションで-lmとしてみたのですが検討外れのようです
visual C++ 2008 EEを使用しています、繰り返しお願いします
0208デフォルトの名無しさん
2010/05/30(日) 22:58:57ウォッチに関数は使えないぞ
0209デフォルトの名無しさん
2010/05/30(日) 23:04:27なるほど、ありがとうございます!
0210デフォルトの名無しさん
2010/05/30(日) 23:08:17何で使えないのかねえ
0211デフォルトの名無しさん
2010/05/30(日) 23:25:54あれ? VC++ だといろんな式の評価ができたような?
そこに fopen() とか突っ込んで嵌ってたこともあったり。
夢だったのかもしれん。
0212デフォルトの名無しさん
2010/05/30(日) 23:51:32http://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:020216デフォルトの名無しさん
2010/05/31(月) 17:21:13その引数と同一の値で生成されたインスタンスが既に存在する場合にはその参照を返すような
引数の値に対してインスタンスの数が必ず一つであるような仕組みをどう構築したらよいでしょうか?
0217デフォルトの名無しさん
2010/05/31(月) 17:25:48flyweight+handlebody
0218デフォルトの名無しさん
2010/06/01(火) 10:29:53ポインタとメンバ変数と大域変数だけは気になってプリフィックス付けてしまうのだが
逆に中途半端で気持ち悪い気もする・・・
今後はプリフィックスをつかわなくても解りやすい命名に変えて言った方が良いのでしょうか?
0219デフォルトの名無しさん
2010/06/01(火) 12:22:23メンバ変数と大域変数は型の間違いと違って
コンパイラでの検出がされにくい場合があるのでつけるのもありという論がある
ポインタの場合、ポインタとそうでないものを区別して認識しながら書かなきゃいけないって
やり方自体がそもそも、ミスの元といえる。これは理想論すぎるかもしれないが
>今後はプリフィックスをつかわなくても解りやすい命名に変えて言った方が良いのでしょうか?
もしこれが、g_の代わりにglobal_みたいにするとかいう意味なら
ハンガリアンが叩かれる意味を理解してないと思われる
0220デフォルトの名無しさん
2010/06/01(火) 19:34:47C#でいう#regionを代用できるものはC++にありますか?
0221デフォルトの名無しさん
2010/06/01(火) 19:47:26http://msdn.microsoft.com/en-us/library/b6xkz944(VS.80).aspx
0222デフォルトの名無しさん
2010/06/02(水) 01:17:30private:
int a;
public:
template<typename T2> void foo(Hoge<T2> &src){
a = src.a; //ダメ
}
}
この処理をaのGet関数などを使わずうまくこなす方法はないでしょうか?
0223デフォルトの名無しさん
2010/06/02(水) 01:22:430224デフォルトの名無しさん
2010/06/02(水) 01:35:41これをやろうとするとprivateメンバへのアクセスが出来ないとエラーをはきます
当たり前といえば当たり前なんですがうまく回避することは出来ないでしょうか・・・
0225デフォルトの名無しさん
2010/06/02(水) 01:38:18friend
質問するときはエラーが発生するコードとエラーメッセージを忘れるな。
0226デフォルトの名無しさん
2010/06/02(水) 01:59:16friend関数にしてしまうと
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:25friend はメンバ関数も指定できる。
0228デフォルトの名無しさん
2010/06/02(水) 07:57:45{
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:00VS2008にて、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すいません、自己解決しました
if (hoge1.end() != hoge2.find(a))
こんな感じのことになっていました・・
0231デフォルトの名無しさん
2010/06/06(日) 11:37:36画像のようなx,yを渡したら
角度θが帰ってくるような関数ってありますか
0232デフォルトの名無しさん
2010/06/06(日) 11:39:38多分
0233デフォルトの名無しさん
2010/06/06(日) 11:44:56あーたん
0234デフォルトの名無しさん
2010/06/06(日) 11:46:14atan2()ですね
ありがとうございました
0235デフォルトの名無しさん
2010/06/06(日) 11:47:470236デフォルトの名無しさん
2010/06/06(日) 12:28:220237デフォルトの名無しさん
2010/06/06(日) 13:05:02double 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:300239デフォルトの名無しさん
2010/06/06(日) 13:20:49二重積分・多重積分の話ですか?
0240デフォルトの名無しさん
2010/06/06(日) 13:22:35f(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:06h=(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そのfを使うのは無理やね
>>240にある通り、係数を分離して各項で係数以外の部分を積分するしかない
0243デフォルトの名無しさん
2010/06/07(月) 11:45:20Gdiplus::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--
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.
--
とあるね。
0245243
2010/06/07(月) 13:00:06返信ありがとうございます。
おかげですっきりしました。次はリファレンス読んでから質問することにします。
0246デフォルトの名無しさん
2010/06/08(火) 13:12:220247デフォルトの名無しさん
2010/06/08(火) 13:28:040248デフォルトの名無しさん
2010/06/09(水) 08:58:43あ、説明足りませんでしたね
sumapo<int> s(new int);
int *p = std::move(s); // sの中の生ポがpに移動、sの中身はnullptrになる
こういう事がしたいんです
0249デフォルトの名無しさん
2010/06/09(水) 09:14:49std::auto_ptr<int> s(new int);
int *p = s.release(); // sの中の生ポがpに移動、sの中身はnullptrになる
0250デフォルトの名無しさん
2010/06/09(水) 14:39:580251デフォルトの名無しさん
2010/06/09(水) 14:46:090252デフォルトの名無しさん
2010/06/09(水) 15:06:55めちゃくちゃ便利じゃねえか
0253デフォルトの名無しさん
2010/06/09(水) 16:01:15サンクスです。auto_ptrってめったに使わないからreleaseメソッドの存在に気づきませんでした
0254デフォルトの名無しさん
2010/06/09(水) 22:46:41さあ洗濯バサミとunique_ptrの有能さに気づくんだ
0255デフォルトの名無しさん
2010/06/09(水) 22:49:110256デフォルトの名無しさん
2010/06/10(木) 01:08:070257デフォルトの名無しさん
2010/06/10(木) 02:11:29これはそう使うのか
0258デフォルトの名無しさん
2010/06/10(木) 21:15:04これって削除子の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:380260デフォルトの名無しさん
2010/06/11(金) 06:35:57まずいよ。
でもそれは boost::shared_ptr の動的削除子を使うときでも同じことでしょ。
0261デフォルトの名無しさん
2010/06/11(金) 06:59:54これってもしかしてshare_ptrに続くCRT境界越えてもおkなスマポじゃね?
http://codepad.org/Qix7z8cq
0262デフォルトの名無しさん
2010/06/11(金) 12:20:260263デフォルトの名無しさん
2010/06/11(金) 12:33:45それだとunique_ptr自体もエクスポートしないといけないんじゃないか。
0264デフォルトの名無しさん
2010/06/11(金) 12:38:12コンストラクタに入った後ならね。
ここで問題にされてるのはその前の、引数列の評価中〜実引数初期化中に発生する例外でしょ。
http://www.boost.org/libs/smart_ptr/shared_ptr.htm#BestPractices
0265デフォルトの名無しさん
2010/06/11(金) 12:39:38それ以前に、 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:03foo(const foo&);
って宣言しておけば、
foo b;
b = a;
ってすればfooクラスに定義されているポインタオブジェクトもディープコピーされるの?
0268デフォルトの名無しさん
2010/06/11(金) 16:14:450269デフォルトの名無しさん
2010/06/11(金) 16:53:55メモリじゃないリソースを突っ込みたくなったときはcloseに失敗することもあるかもしれない
0270デフォルトの名無しさん
2010/06/11(金) 16:54:16ダメなんですか。ありがとうございました。
もっと調べてみます。
0271デフォルトの名無しさん
2010/06/11(金) 16:55:57デリータのコピーに失敗することがあるかどうかだもんな
はずかちい
0272デフォルトの名無しさん
2010/06/11(金) 19:15:28PODのアライメントとかを揃えるためにpragma pushをしろと言われたんだけど
pragmaって移植性ないじゃないですか
なのでpragma無しでPODの移植性を確保したいんですけどどうすればいいですかね?
0273デフォルトの名無しさん
2010/06/11(金) 19:17:350274デフォルトの名無しさん
2010/06/11(金) 20:45:300275デフォルトの名無しさん
2010/06/11(金) 22:40:07って思ったんだけとクラスにしてるのは
何か理由あるの?インラインさせりため?
0276デフォルトの名無しさん
2010/06/11(金) 22:42:10pragma pack で他環境(VB etc.)にも対応可能なアライメントで固定化汁という意図か?
0277デフォルトの名無しさん
2010/06/11(金) 22:59:00関数だけで大丈夫くさい
変数に入ってるアドレスをcallしてる
0278デフォルトの名無しさん
2010/06/12(土) 09:53:19デリーターが関数オブジェクトかもしれないから
0279デフォルトの名無しさん
2010/06/12(土) 18:47:25http://www1.axfc.net/uploader/Sc/so123049
をコンパイルして実行したら
http://www1.axfc.net/uploader/Sc/so123050
になってしまったそうです
最後の行だけなぜか表示されなかったということです
どこに原因があるんでしょうか?
OSはたぶんubuntuだと思います(ウィンドウの色からして
コンパイルは端末でgccを使ったそうです
0280279
2010/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:000282デフォルトの名無しさん
2010/06/12(土) 19:10:510283デフォルトの名無しさん
2010/06/12(土) 20:15:26伝えときました
>>282
友達に画像で渡されたので……
0284デフォルトの名無しさん
2010/06/12(土) 20:20:240285デフォルトの名無しさん
2010/06/12(土) 20:37:04すんません。。。
0286デフォルトの名無しさん
2010/06/12(土) 21:23:17で、プログラムを実行するとき引数に英1文字AかBかCかDが指定できるとして、
A,B,C,D以外が入力されたときにエラーを表示するための
if文の条件文の書き方が分かりません。
if(argv[1] != "r")
とすると、引数に何を入力しても該当してしまいます。
どうすればいいでしょうか
0287デフォルトの名無しさん
2010/06/12(土) 21:24:09if(argv[1] != "A")
です
0288デフォルトの名無しさん
2010/06/12(土) 21:26:46それは文字列へのポインタの比較なんで文字列の中身の比較ではない。
文字列の中身の比較はstrcmpを使う
0289デフォルトの名無しさん
2010/06/12(土) 21:29:36if (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:39std::string a(argv[1]);
if((a!="A")&&(a!="B")&&(a!="C")&&(a!="D"))
{
}
0291デフォルトの名無しさん
2010/06/12(土) 21:37:54前者はオプション文字列の長さが1である必要があるのに、
後者はオプション文字列の長さをチェックしていない。
いっそ、これでいいのでは?
if (argv[1][0] != 'A' || argv[1][0] != 'B' || argv[1][0] != 'C' || argv[1][0] != 'D' || argv[1][1] != '\0')
0292286
2010/06/12(土) 22:05:20"A"がポインタであること、'A'と"A"が違うということが分かっていませんでした。
0293デフォルトの名無しさん
2010/06/12(土) 22:27:36>>291で書くと、引数をAで実行しても該当するようです。どうしてでしょうか
0294デフォルトの名無しさん
2010/06/12(土) 22:32:09間違ってたらスマソ
0295デフォルトの名無しさん
2010/06/12(土) 23:04:030296286
2010/06/13(日) 00:56:43とすると、うまくいきます。'A'以外を入力すると実行されます。AAと入力した時も実行されます。
ですが
if (argv[1][0] != 'A' || argv[1][0] != 'B' )
とするともう何を入力しても実行されるようになってしまいます。
環境が悪いのでしょうか・・?orz
言語はCで、linuxでgccを使っています。
0297デフォルトの名無しさん
2010/06/13(日) 01:03:520298デフォルトの名無しさん
2010/06/13(日) 01:04:38'A'以外 ま た は 'B'以外
だから何入力してもtrueに決まってる
0299デフォルトの名無しさん
2010/06/13(日) 01:08:30ありがとうございます。失礼致しました;;
0300デフォルトの名無しさん
2010/06/13(日) 21:38:09って認識でいいの?
0301デフォルトの名無しさん
2010/06/13(日) 22:26:26今はintelだけなんでそうなる。
0302デフォルトの名無しさん
2010/06/13(日) 23:42:46AMDとVIAは星になったのかw
0303デフォルトの名無しさん
2010/06/14(月) 06:50:37俺もintelだけ、といわれるとなんか変な言い方だなぁとは思うけれど。
互換性があるという言い回しにした方がお気に召しますか?
0304デフォルトの名無しさん
2010/06/14(月) 08:53:130305デフォルトの名無しさん
2010/06/14(月) 09:20:400306デフォルトの名無しさん
2010/06/14(月) 11:11:430307デフォルトの名無しさん
2010/06/14(月) 17:59:17お前は何を問題としているかわかってない
0308デフォルトの名無しさん
2010/06/14(月) 18:08:05・ネットワークを使う
・クロスプラットフォームを考慮(cygwin等)
・他ハードをエミュレーションする
くらいしか思いつかんが。
0309デフォルトの名無しさん
2010/06/15(火) 23:31:39の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型はこれと一緒
&mulary[0]
0312デフォルトの名無しさん
2010/06/16(水) 01:13:23多次元でも関係ない。
array が &array[0] と同じように、 mulary は &mulary[0] と同じ。
0313デフォルトの名無しさん
2010/06/17(木) 01:06:13どもども。
何で配列名が&array[0] 、 &mulary[0]になるように決めたんですか?
0314デフォルトの名無しさん
2010/06/17(木) 01:11:15>>309 がそう決めたから
0315デフォルトの名無しさん
2010/06/17(木) 04:28:55便利だから
0316デフォルトの名無しさん
2010/06/17(木) 06:32:10printf(&"Hello World"[0]);
とか書きたいか?
0317デフォルトの名無しさん
2010/06/17(木) 07:17:35地味にヤだな、それw
0318デフォルトの名無しさん
2010/06/18(金) 16:11:35決めたっていうかその表現にある通り、単に配列要素の先頭のアドレス拾ってるから
同じになるってだけじゃね。意味わかれば別に悩む所じゃないぜ
0319デフォルトの名無しさん
2010/06/18(金) 18:52:55arrayが特殊でないことが分かるはず
0320デフォルトの名無しさん
2010/06/21(月) 22:33:23「クラス名.」で呼び出せるものは動的なもの
ってことで、おk?
0321デフォルトの名無しさん
2010/06/21(月) 22:59:52クラス名::hoge
インスタンス.hoge
0322デフォルトの名無しさん
2010/06/21(月) 23:11:31{
public:
void func1() {}
void func2() { A::func1(); }
static void static_func() {}
};
A a;
a.static_func();
0323デフォルトの名無しさん
2010/06/23(水) 02:18:511の位:
10の位:
100の位:
1000の位:
・
・
・
ってな感じで出力する簡単な計算式教えてください
おねがいします
0324デフォルトの名無しさん
2010/06/23(水) 02:29:24変数を10で割ったものを変数に代入する
というのを繰り返す
0325デフォルトの名無しさん
2010/06/23(水) 02:36:38ありがとうございます
0326デフォルトの名無しさん
2010/06/23(水) 23:04:410327デフォルトの名無しさん
2010/06/23(水) 23:14:360328デフォルトの名無しさん
2010/06/23(水) 23:14:500329デフォルトの名無しさん
2010/06/23(水) 23:38:44{
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();
0331330
2010/06/23(水) 23:43:360332デフォルトの名無しさん
2010/06/24(木) 05:14:55を計算して求めた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:410334デフォルトの名無しさん
2010/06/24(木) 14:03:02int num;
cin >> num;
int test[num];
「定数式が必要です」と出て失敗します
何故だ…
0335デフォルトの名無しさん
2010/06/24(木) 14:10:43配列の要素数に変数を使うことはできない
定数じゃないと
そういうときはnew使うとかvector使うとかしないと
0336デフォルトの名無しさん
2010/06/24(木) 15:25:400337デフォルトの名無しさん
2010/06/24(木) 16:05:14きっと、変数と定数の区別がまだつかないんだよ。
0338デフォルトの名無しさん
2010/06/24(木) 18:18:15struct 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といった感じで格納を続けていくようにしました。
グローバル変数yはcsvファイルの読み込む列の数についてで、先に取得しています。グローバル変数xは150とプログラムの一番最初にdefineで書いています。
これを実行すると途中でプログラムに問題が発生して強制終了してしまいました。
間あいだに、printfで構造体の中身を含め、ループ中をチェックをしていたのですが、
yが74あって、取得したいcsvの列が0から73までのとき、途中の列までは無事に格納されていたのですが、
iが57までループを繰り返し、インクリメントされた後、何故か1に戻っていました。
そのため、終端に来る前にcsvの方が終わってしまい、強制終了するのだと思います。ループが73列目の格納作業まで終えて、74列目を読み始めて強制終了するみたいです。
初心者なので凄くおかしなことを言っていたり、
説明不足で、これだけの文では分からないかもしれませんが、なにとぞご回答頂きたく存じます。
0340デフォルトの名無しさん
2010/06/24(木) 18:28:20それじゃコンパイル通らないだろ
コピペしろコピペ
ttp://codepad.org/
ついでにcsvもどっかにうpしろ
0341デフォルトの名無しさん
2010/06/24(木) 19:19:39了解です。
このプログラムは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その名もズバリな関数があったんですね。調べ方が未熟でした。
無事綺麗なコードが書けました。
レスありがとうございました。
0343デフォルトの名無しさん
2010/06/24(木) 22:54:33csv読み込ませるとnum周りのスタックが破綻したって出たな
配列の大きさを大きくしたらとりあえずエラーは出なくなったけど…
ttp://codepad.org/dNFSlvxj
これはGUIで作った方が分かりやすい気がする
ちょっと文字数オーバーしたら落ちるし
C++あたり勉強してstd::stringとか使った方がいいんじゃないか
0344デフォルトの名無しさん
2010/06/24(木) 23:50:440345デフォルトの名無しさん
2010/06/25(金) 00:00:40細かく見ていただき大変ありがとうございます!!
色々と自分のプログラムの汚いところがスッキリしてて驚きがあって感動してます。
ただ、自分がwinでvisiual C++2008のコマンドプロンプトからclでコンパイルしていたものを、
ちょっとした都合でwinがネットに繋げられなかったでの、
人のmacのxcodeに送ってそれをttp://codepad.org/ にコピペしたためか、
今winでclでコンパイルすると色々とエラーが出てしまって・・・、上手くいってるか直ぐに分からないです。
すみません。
対処法も教えていただけましたし、色々手も加えていただいたので、winにあるものとしっかり見比べて、理屈の理解をしていこうと思います。
C++も勉強してみたいと思います!!
ありがとうございました!!!
0346デフォルトの名無しさん
2010/06/25(金) 08:40:17内部で状態が変わるようなタスクのテスト項目が思い付かない。
0347デフォルトの名無しさん
2010/06/25(金) 08:44:13内部で状態が変わっても影響ないならNOPにしとけ〜。
0348デフォルトの名無しさん
2010/06/25(金) 10:32:33すればいいやん
あ、ソースを晒すためか
0349デフォルトの名無しさん
2010/06/25(金) 15:14:19int* aならポインタ宣言と分かるのですけれど**が2個付くのは意味があるのでしょうか?
0350デフォルトの名無しさん
2010/06/25(金) 15:29:18COMとかでインターフェースのポインタをもらうときとかに使うな
0351デフォルトの名無しさん
2010/06/25(金) 15:29:48ポインタのポインタ
int a;
int* b = &a;
int** c = &b;
といった感じでポインタ変数をさらに指し示せる。
関数から(戻り値以外の方法で)ポインタ値を返す時に使われるな。
0352デフォルトの名無しさん
2010/06/25(金) 15:36:04慣れてないとややこしそうですな 精進します
ありがとうございました!
0353デフォルトの名無しさん
2010/06/26(土) 19:42:400354デフォルトの名無しさん
2010/06/26(土) 19:50:52が、もし最適化されなかったらリターンアドレスを積みまくって死ぬから、
オーバーフローは起こると考えたほうが安全。
0355デフォルトの名無しさん
2010/06/26(土) 19:51:31戻ってくる場所をスタックに積むからいつかスタックオーバーフローを起こす
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:19CRTPパターン使うとか?
ttp://codepad.org/xnLk4KaL
まあ、ふつうはFactoryパターンでやるけど。
0359357
2010/06/27(日) 05:42:25ありがとうございます。
リンク先のものが使えそうです。
ちなみにFactoryパターンでググったらFactoryMethodとAbstractFactoryが出ましたがどちらでしょうか?
0360デフォルトの名無しさん
2010/06/27(日) 09:18:30コンストラクタは複数有るのに対してデストラクタはひとつだからこっち弄るほうが楽だと思う
ttp://codepad.org/nwwgoygy
ttp://codepad.org/FA3LoEDN
0361デフォルトの名無しさん
2010/06/27(日) 20:03:30void 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:21hoge[100]と宣言した配列で使えるのはhoge[0]からhoge[99]まで。
っていうのはともかく、代入したいのは文字列だから、strcpy()を使わないと
strcpy(okini[a - 1][0], "x");
0363デフォルトの名無しさん
2010/06/27(日) 20:29:56ありがとうございます。
大変申し訳ないのですが、strcpy()はまだ習っていません。
他に何か方法はありませんか・・・?
0364デフォルトの名無しさん
2010/06/27(日) 20:35:32宿題なら↓へ
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どうもありがとうございました。
そちらに行ってみます!
0366デフォルトの名無しさん
2010/06/28(月) 22:48:491は□個、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:30IOCCCにでも出すつもりか
0370デフォルトの名無しさん
2010/06/28(月) 23:32:54http://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環境書け環境
0373370
2010/06/28(月) 23:51:220374デフォルトの名無しさん
2010/06/29(火) 00:38:37http://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:030376デフォルトの名無しさん
2010/06/29(火) 01:08:09http://upsurusuru.hp.infoseek.co.jp/cgi-bin/src/up5424.txt
0377デフォルトの名無しさん
2010/06/29(火) 01:47:26簡単に言うとprivate変数のdをいじくれないからメンバ関数serdata()から
dを引き出したいって事?
それはあまり綺麗な設計じゃないな
dだけアクセサ作ったら?
double Person::dvalue() const { return d; } みたいな
それは嫌なのかな?
0378デフォルトの名無しさん
2010/06/29(火) 01:49:35関数test()をPersonのfriendにすればいいじゃない
friendってそういう風に使うんだぜ
0379デフォルトの名無しさん
2010/06/29(火) 02:03:51それをやってみます。
回答ありがとうございます。
0380デフォルトの名無しさん
2010/06/29(火) 06:43:470381デフォルトの名無しさん
2010/06/29(火) 08:59:100382デフォルトの名無しさん
2010/06/29(火) 11:43:46それだとthisが渡されないから個々のインスタンスのdをいじれないぞ
0383デフォルトの名無しさん
2010/06/29(火) 12:12:360384デフォルトの名無しさん
2010/06/29(火) 12:21:34自作のクラスのインスタンスを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ああそういう事か
それならいいかもね
>>384
ちょwwSTL関係のエラーコード貼るな
貼るならSTLFiltとかで整形してから貼れ
それより肝心のソースコードは?
0386384
2010/06/29(火) 13:13:36コードは>384の1行目です。
STLFiltはちょっと調べてみます。
0387デフォルトの名無しさん
2010/06/29(火) 13:19:28取り敢えず気が付いた事を一つだけ
ポインタをソートしてるよ
実体をソートしたいなら比較叙述関数を作るか関数オブジェクトにして与えないと
0388デフォルトの名無しさん
2010/06/29(火) 13:21:42ポインタの順序付けは実体の順序付けと関係ない。
実体の順序付けを使うように比較関数を作って渡せ。
あとは gcc じゃなくて g++ 使ってみな。
0389デフォルトの名無しさん
2010/06/29(火) 13:24:54http://codepad.org/6do3erz8
0390デフォルトの名無しさん
2010/06/29(火) 13:30:080391384
2010/06/29(火) 13:43:54http://codepad.org/mOjod85K
のコードでうまくソートできました。
ありがとうございました。
0392384
2010/06/29(火) 13:45:50>391のレスをしてから気付きました。
どうもありがとうございます。
0393デフォルトの名無しさん
2010/06/29(火) 14:15:480394デフォルトの名無しさん
2010/06/29(火) 14:32:100395デフォルトの名無しさん
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:170397デフォルトの名無しさん
2010/07/01(木) 10:02:200398デフォルトの名無しさん
2010/07/01(木) 10:14:45メタ関数は上式で自作しなさい。
0399デフォルトの名無しさん
2010/07/01(木) 10:54:59c++プログラムの中で、既に存在する.exeファイルを実行して、
標準出力へ返ってくるはずの返り値をC++ソースの中で変数に格納したいのですが、
どのような書き方をすればよいでしょうか??
教えていただけると幸いです。
0400デフォルトの名無しさん
2010/07/01(木) 11:02:20環境に拠るが、popen()ではどうだろう。
0401デフォルトの名無しさん
2010/07/01(木) 18:36:42それが表現ビット長と一致するとは限らないんだぜ
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>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:36ttp://www.geocities.jp/ky_webid/c/032.html
0405デフォルトの名無しさん
2010/07/01(木) 23:26:5014行目を } static Sub; とすることでリンカ通りました。(これでよいのかも今一分かりませんが…
0406デフォルトの名無しさん
2010/07/01(木) 23:34:05だからグローバル変数はヘッダではextern宣言して
どれかcpp一つで実体を定義しろっつーの。
0407デフォルトの名無しさん
2010/07/02(金) 07:10:29sizeof(型名) * CHAR_BIT != 有効ビット幅
http://portable-c.jugem.jp/?eid=18
0408デフォルトの名無しさん
2010/07/02(金) 18:25:01>Intelのi686をターゲットとするGCCでは、long double型の有効ビット幅が80ビット
FPU に80bitで数値を渡す(スタックに積む)命令はあるのだろうか?
0409デフォルトの名無しさん
2010/07/02(金) 21:44:350410デフォルトの名無しさん
2010/07/03(土) 13:02:240411410
2010/07/03(土) 14:00:45fldt
0412デフォルトの名無しさん
2010/07/03(土) 15:00:000413デフォルトの名無しさん
2010/07/03(土) 16:40:54バイナリが肥大化するから気をつけて
0414デフォルトの名無しさん
2010/07/03(土) 16:47:44わかったっす
0416デフォルトの名無しさん
2010/07/03(土) 19:50:450417デフォルトの名無しさん
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__min の動作が分からない
0419デフォルトの名無しさん
2010/07/03(土) 23:25:320420デフォルトの名無しさん
2010/07/03(土) 23:29:22yes
0421デフォルトの名無しさん
2010/07/03(土) 23:38:45代入されるかどうか、という話はyes
(__minがちゃんと定義されているならだが)
0422デフォルトの名無しさん
2010/07/04(日) 00:07:15えっ・・・?
0423デフォルトの名無しさん
2010/07/04(日) 00:12:57ありがとうございました。
超初心者ゆえに個人的な制約が色々あるわけです。
0424デフォルトの名無しさん
2010/07/04(日) 01:52:360425デフォルトの名無しさん
2010/07/04(日) 02:12:360426デフォルトの名無しさん
2010/07/04(日) 10:08:13Bitmapの読み書きをするクロスプラットフォームな
デファクトスタンダード的なライブラリがあれば教えてください。
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:550429デフォルトの名無しさん
2010/07/04(日) 18:46:27気が付いたらこんなのになってしまいました
0430デフォルトの名無しさん
2010/07/04(日) 20:09:370431デフォルトの名無しさん
2010/07/04(日) 20:12:03内部的にはアドレスを渡しているかも知れないしそうじゃないかもしれない
とりあえず文法的には合ってる
0432デフォルトの名無しさん
2010/07/04(日) 20:15:25C++は初めてか?力抜けよ
0433430
2010/07/04(日) 20:19:330434デフォルトの名無しさん
2010/07/04(日) 20:20:580435デフォルトの名無しさん
2010/07/04(日) 20:22:02CじゃないC++だ。
C++では参照とポインタは別物
0436430
2010/07/04(日) 20:27:540437デフォルトの名無しさん
2010/07/04(日) 20:51:46てっきりCのものかと
0438デフォルトの名無しさん
2010/07/04(日) 20:56:000440デフォルトの名無しさん
2010/07/05(月) 13:30:44unsigned char buff[] = { 0x01, 0x1A, 0x00, 0x3F };
char str[256];
strの中身を"011A003F"としたいのですがどうすればよいのでしょうか
0441デフォルトの名無しさん
2010/07/05(月) 13:33:470442デフォルトの名無しさん
2010/07/05(月) 13:41:240443デフォルトの名無しさん
2010/07/05(月) 13:41:32ありがとうございました
sprintfの使い方は目からウロコが落ちました
0444デフォルトの名無しさん
2010/07/05(月) 13:42:39>>442さんには余計な手間を取らせて申し訳ない
0445デフォルトの名無しさん
2010/07/05(月) 14:22:21sprintf(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」なら派生クラスのアドレスですが「*」が付くと何になるのでしょうか・・・?
0447デフォルトの名無しさん
2010/07/06(火) 02:24:49値か参照だけど、多分参照。
0448デフォルトの名無しさん
2010/07/06(火) 10:27:000449デフォルトの名無しさん
2010/07/06(火) 10:30:47てきとーにライブラリを探してください
0450デフォルトの名無しさん
2010/07/06(火) 14:46:03C#でいうところのプロパティ的なモノはpublic変数でも良いのかなと最近思うようになったが
アクセスレベルを設定できないからそれはどうかな?とも思う
やはりちょっと見た目が悪くなるけどアクセサを使うべきなのでしょうか?
0451デフォルトの名無しさん
2010/07/06(火) 16:48:12仮に内部実装が変わっても(例えばintだったのがdoubleになっても)
関数でラップしとけば呼び元に影響しない、とかもある
でも個人的には、よほどリスクがあるのでなければ
変数の方がすっきりしていい
0452デフォルトの名無しさん
2010/07/06(火) 20:35:39変数は隠蔽するのが基本。公開すると変数の使用方法が統一できずバグだらけになりやすい。
変数と1対1にアクセサを作った場合は変数を公開したのと変わらなくなるのでよろしくない。
0453デフォルトの名無しさん
2010/07/06(火) 21:27:48> なんか変数へのアクセスはアクセサ関数を使って〜と杓子定規にいわれるけど
いや今の時代は言わないよ。
逆に、あるクラスのメンバを全部パブリックにするという
ノーガード戦法もあるが、それが有効なこともたまにある。
まあ単に変数をまとめたいだけの時だけどね。
普通は、クラスはちゃんとしたinterfaceとなるメンバ関数を持っていて、
使い方を知るのに内部構造を知らねばならないような
クラスはクソ設計と言われる。
まあ現実は納期とかあるからやむをえずクソ設計になっちゃうこともあるけど。
0454デフォルトの名無しさん
2010/07/06(火) 22:06:34構造体も使ってあげて
0455デフォルトの名無しさん
2010/07/07(水) 02:25:40先にクラスの外部インターフェースを考えろ。
メンバ変数ありきで関数を作ったりしてる限り、見た目がどうとか以前に糞クラス確定。
0456デフォルトの名無しさん
2010/07/07(水) 08:41:00抽象化したい場合はメンバ関数経由にすればいいし
実装が固定なら直接アクセスすればいい
0457デフォルトの名無しさん
2010/07/07(水) 23:36:260458デフォルトの名無しさん
2010/07/08(木) 03:49:07かのエリック・ガンマ先生も言っておられてだな
0459デフォルトの名無しさん
2010/07/09(金) 20:04:53気にしないでくれ、俺優しいからさ
0460デフォルトの名無しさん
2010/07/12(月) 22:56:300461デフォルトの名無しさん
2010/07/13(火) 21:44:29こんなマクロがあったのですが、##Privateはどこから来ているのですか?
また、ClassってのはClass Tの省略形ってことでおk?
0462デフォルトの名無しさん
2010/07/13(火) 21:59:39入門書読もうな
0463デフォルトの名無しさん
2010/07/13(火) 22:19:020464デフォルトの名無しさん
2010/07/13(火) 22:30:180466デフォルトの名無しさん
2010/07/13(火) 23:59:190467デフォルトの名無しさん
2010/07/15(木) 22:24:53GUIプログラミングの場合はボタンやラベルも「m_」から始めていますか?
0468デフォルトの名無しさん
2010/07/15(木) 22:26:430469デフォルトの名無しさん
2010/07/15(木) 23:25:54「m_」は「クラスのメンバ変数」って意味だと思うぞ。
なので、ボタンやラベルを指す変数がクラスのメンバ変数ならやはりm_を使う。
0470デフォルトの名無しさん
2010/07/15(木) 23:44:47何にもつけないというやり方もある
0471デフォルトの名無しさん
2010/07/16(金) 18:31:24UMPC(ATOM/メモリ512MB)程度のスペックのPCでも実用に耐えるようなモノはないでしょうか?
0472デフォルトの名無しさん
2010/07/16(金) 18:32:250473デフォルトの名無しさん
2010/07/16(金) 19:12:240474デフォルトの名無しさん
2010/07/16(金) 19:56:400475デフォルトの名無しさん
2010/07/16(金) 20:30:23VC8とか9は普通に使えたけど。
0476デフォルトの名無しさん
2010/07/16(金) 21:02:32EeePCのメモリ2Gに増設して使ってるが、コード書くだけならVS2005でもそこそこいけてるな
0477デフォルトの名無しさん
2010/07/17(土) 00:47:13ビルドとかしなければ使えそうですか?
それなら移動端末に買おうと思うのですが
0478デフォルトの名無しさん
2010/07/17(土) 06:41:34C#が主目的なら分からなくもないけど、別に携帯のメモでいいじゃんって思っちゃう。
擬似コードメモるだけで十分だよ。
0479デフォルトの名無しさん
2010/07/17(土) 07:09:070480デフォルトの名無しさん
2010/07/17(土) 07:51:350481デフォルトの名無しさん
2010/07/17(土) 18:04:31どのようにちがうのですか?
0482デフォルトの名無しさん
2010/07/17(土) 18:14:150483デフォルトの名無しさん
2010/07/17(土) 18:18:04変数におけるextern宣言は、その変数の定義が同一コンパイル単位内にないことの表明だね。
0484デフォルトの名無しさん
2010/07/18(日) 09:15:46VC6 は c++, MSC は c
0485デフォルトの名無しさん
2010/07/18(日) 09:29:39え?
0486デフォルトの名無しさん
2010/07/18(日) 09:39:17標準への準拠の度合いを言ってるんだと思うよ
0487デフォルトの名無しさん
2010/07/18(日) 09:43:24それなら確かに同意
0488デフォルトの名無しさん
2010/07/18(日) 11:58:15newってそんなに失敗しやすいんですか
それとも、ネットワーク/ディスプレイ/スレッドなどの明かにリソースが限られているものだけ、
newの失敗しやすいのでif文で調べていると考えてもいいのでしょうか
0489デフォルトの名無しさん
2010/07/18(日) 12:19:53newが失敗するって2通りあって、メモリが足りなかった場合と、クラスのコンストラクタが例外を投げた場合なんだけど、
前者は趣味で書く分にはほとんど気にしなくていい。
newできないほどメモリが逼迫していたらもうマトモにエラー処理ができないだろというのもある。
後者は発生する可能性があるならちゃんとチェックしなくちゃいけない。
クラスのドキュメントを読んで、コンストラクタが失敗する場合があるかどうかをよく確認しましょう。
0490デフォルトの名無しさん
2010/07/18(日) 12:20:13>newが成功しているか調べているコードがよくある気がします
>newってそんなに失敗しやすいんですか
それ本当に newが成功してるかどうかを調べてるコード?
その処理単位に再入した時にヌルかどうかを調べてるとか、そういう実装都合とかじゃなくて
0491デフォルトの名無しさん
2010/07/18(日) 12:20:44失敗するかどうかの前にもしそのコードが下のように 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寧ろ、適切に例外処理をしておくべし。
# MSVCならcatchじゃなくてCATCHを使うのかな?
0494デフォルトの名無しさん
2010/07/18(日) 12:29:26メモリ確保については環境によるだろうが、通常は失敗しない。
しかし、たとえばWindowsで目一杯メモリを使うと
仮想メモリが不足しているとか警告が出てくると思うが、
そういう状況では失敗するかもしれない。
それはそうと、newが失敗したときはデフォルトで例外を投げるので、
if文で失敗を調べるのは方法が間違っているかもしれない。
0495488
2010/07/18(日) 12:58:13コンストラクタでは例外が発生しないフレームワークを使っています
また、個人的にはコンストラクタの例外が嫌いなので作らないようにしたいと思います
>それはそうと、newが失敗したときはデフォルトで例外を投げるので、
これは、システムが保証している事なんですか
0496デフォルトの名無しさん
2010/07/18(日) 13:20:250497デフォルトの名無しさん
2010/07/18(日) 13:43:32std::bad_allocを投げるよう定められている。
0498デフォルトの名無しさん
2010/07/18(日) 14:49:100499デフォルトの名無しさん
2010/07/18(日) 18:07:44わからん状態だからな
0500デフォルトの名無しさん
2010/07/19(月) 02:07:1764bitアプリを作成するには専用コンパイラが必要というだけで普通に使う分には問題ないですよね?
0501デフォルトの名無しさん
2010/07/19(月) 02:57:51すべての機能が正常に動くかはわからんが、とりあえずこっちの64bitWin7では動いている。
32bitアプリも64bitアプリもビルドできる。
0502デフォルトの名無しさん
2010/07/19(月) 09:39:540503デフォルトの名無しさん
2010/07/19(月) 11:23:400504デフォルトの名無しさん
2010/07/19(月) 14:28:18ありがとう、これでPCの更新ができるわ
0505デフォルトの名無しさん
2010/07/19(月) 20:03:34http://www.microsoft.com/japan/msdn/vstudio/support/tools.aspx
0506デフォルトの名無しさん
2010/07/20(火) 18:32:31class 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:30friend class B;
と書くと、Bのメンバ関数からAのメンバにアクセスできるようになる。
そのソースではa.aaaaが書いてあるのはmain()
main()はBのメンバか?
B::err()の中身が気にはなるが、まぁ別の話。
0508デフォルトの名無しさん
2010/07/20(火) 18:51:43main関数の中身をなんらかのクラスを作って移住させれば動きました。ありがとうございます
errで意味ないことしてるのは渡すメンバーの中身を書き換えたりしない・・・みたいな意味合いです
0509デフォルトの名無しさん
2010/07/21(水) 13:57:17基本どこでもいいと思ってるんですけど、こうやっておくと便利、みたいなものがあれば教えて頂きたく。
OSはWindowsで、Visual Studioでの使用を想定してます。
0510デフォルトの名無しさん
2010/07/21(水) 13:58:43どこでも置いてもいい
インクルードパス指定すればおk
0511デフォルトの名無しさん
2010/07/21(水) 18:24:57どこへ置いてもあまりメリット・デメリットはないってことですかね。
適当な場所を決めてまとめるようにします。
ありがとうございました。
0512デフォルトの名無しさん
2010/07/21(水) 19:47:190513デフォルトの名無しさん
2010/07/21(水) 20:36:13ルート権限がない計算機で仕事することもあるし
0514デフォルトの名無しさん
2010/07/21(水) 20:57:20%HOME%\My Library
これに入れるとすごくWindowsっぽいですよ。
>>512 ないない。せめて/usr/local/include
0515デフォルトの名無しさん
2010/07/22(木) 00:27:11・ひとつの表示クラスに5個のオブジェクトを所有させる
・表示領域を担当する表示クラスを5個作ってそれぞれを結びつける
どちらにした方がやりやすいでしょうか・・・?
0516デフォルトの名無しさん
2010/07/22(木) 00:33:400517デフォルトの名無しさん
2010/07/22(木) 00:41:050518デフォルトの名無しさん
2010/07/22(木) 07:37:34スレ違いっぽいね。
↓こっちでどうぞ。
http://pc12.2ch.net/test/read.cgi/tech/1187922645/
0519デフォルトの名無しさん
2010/07/22(木) 20:58:570520デフォルトの名無しさん
2010/07/22(木) 21:03:47前者は引数無しコンストラクタを呼び出す
後者はデフォルトコンストラクタを呼び出す
0521デフォルトの名無しさん
2010/07/22(木) 21:11:37thx
0522デフォルトの名無しさん
2010/07/22(木) 22:55:060523デフォルトの名無しさん
2010/07/22(木) 22:57:220524デフォルトの名無しさん
2010/07/23(金) 01:25:56てきとうなこといってんじゃねーよ。
後者は POD について値が不定となる。 POD じゃなければどちらも同じ。
0525デフォルトの名無しさん
2010/07/23(金) 15:30:06これはひどいwwww
>>522
すげー巨大だからヒープに確保しておきたいという事情がある時とか。
0526デフォルトの名無しさん
2010/07/23(金) 15:43:02配列を持つクラスを継承すると罠にハマる
0527デフォルトの名無しさん
2010/07/24(土) 01:09:100528デフォルトの名無しさん
2010/07/24(土) 08:28:380529デフォルトの名無しさん
2010/07/24(土) 15:17:51それ、そのクラスかお前がバグってただけだろ。
0530デフォルトの名無しさん
2010/07/24(土) 16:16:57まさか配列の各要素がDeep copy されなくて云々なんて言わないよな?
そんな事で罠とか言わないよな?
0531デフォルトの名無しさん
2010/07/24(土) 16:25:41>後者は POD について値が不定となる。 POD じゃなければどちらも同じ。
0532デフォルトの名無しさん
2010/07/24(土) 16:38:360533デフォルトの名無しさん
2010/07/24(土) 16:38:570534デフォルトの名無しさん
2010/07/24(土) 17:06:43http://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プッ
0537デフォルトの名無しさん
2010/07/25(日) 00:00:050538デフォルトの名無しさん
2010/07/25(日) 03:50:53例えば1〜5の範囲の乱数を3つ作って、その3つの乱数の和は常に10になる、みたいな
"同じ数"から乱数分引いていって、残った分を最後の乱数にすればいいかと思ったんですが
それだと上の例で5が2つ出たら最後は0になって範囲外になってしまいます
0539デフォルトの名無しさん
2010/07/25(日) 04:46:45#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もちろんそれをやると実数になっちゃうので、最後の微調整は必要だけど(あと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割合を乱数で出したらダメなの?
例えば常に和が10と決まっていて乱数範囲が1〜5だと言うなら、
和に対して 0.5〜0.1 の乱数を一つと、
1.0 から 上の乱数を引いた物に対して、また 0.5〜0.1 の乱数を求めれば
0542デフォルトの名無しさん
2010/07/25(日) 13:06:280543デフォルトの名無しさん
2010/07/25(日) 13:11:33乱数でいずれかの組み合わせを選択する
数値の出力順も乱数で決定する
この方法なら最初の組み合わせを限定する事で
特定の数値が出やすいとかいうのを排除しやすい
0544デフォルトの名無しさん
2010/07/25(日) 13:27:330545デフォルトの名無しさん
2010/07/25(日) 13:35:09最後は引き算にして、範囲外になったら最初から振り直すのが確実じゃね?
やり直しなしで求めるとした場合
出したい乱数の合計値を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:560547デフォルトの名無しさん
2010/07/25(日) 13:51:231が2回出たら困るやん
0548デフォルトの名無しさん
2010/07/25(日) 14:28:530549デフォルトの名無しさん
2010/07/25(日) 15:36:490550デフォルトの名無しさん
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最後の数字(最後に限らないが)を、それまでに算出した数を元に決めるやり方というのは
「乱数」の性質を満たしておらず、最後の数字に偏りが出る。
ただ、それでも良いのかもしれないけどね。
0552デフォルトの名無しさん
2010/07/25(日) 16:50:50幅が決まってる数直線上に、複数の区切り位置をランダムに決めてくのと同じ事なので、
>>541 の考え方がシンプルでいいかもしれない。割合のランダム
0553デフォルトの名無しさん
2010/07/25(日) 18:56:01RSAとAESのライブラリがある所をご存知ないですか?
0554デフォルトの名無しさん
2010/07/25(日) 19:02:53C/C++の宿題片付けます 138代目
http://pc12.2ch.net/test/read.cgi/tech/1279286575/416
416以降main関数のreturn 0;は省略可能か、
それが規格上の言語仕様なのかコンパイラ依存なのか、
スレチな議論が延々と続いてるんで、引き取ってくれ。
0555デフォルトの名無しさん
2010/07/25(日) 19:16:30return文に遭遇しないまま関数の終わりまでプログラムが実行された場合、
そこに式を省略した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:00http://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:580562デフォルトの名無しさん
2010/07/25(日) 23:26:38わざとなのか知らないが、誤解を埋めるための目的語を添えずにわめき続けている、と。
0563デフォルトの名無しさん
2010/07/25(日) 23:50:260564デフォルトの名無しさん
2010/07/26(月) 12:55:10たとえばこのような場合、address_map? store_map?
std::map<std::wstring, int> hoge;
hoge[店の名前] = 場所
0565デフォルトの名無しさん
2010/07/26(月) 13:15:46多くの回答ありがとうございました
割合をランダムで出す方向で行きたいと思います
0566デフォルトの名無しさん
2010/07/26(月) 17:36:50冗長でいいなら、店の名前_場所_mapのようにするのが自然。
もうちょっと縮めたいなら、場所_mapの方が良好だと個人的に思う。
0567デフォルトの名無しさん
2010/07/26(月) 22:57:34ありがとうございます
普通の配列のように、値の方で命名するのも良さそうですね
0568デフォルトの名無しさん
2010/07/27(火) 13:24:17どのコンテナなのかもしくは配列なのか分からないんじゃ、扱い方が分からないんじゃないかと言われるかもしれないが
どのみちmapだとだけ分かってもどうせ格納してる型を知るには宣言に飛ぶ必要がある
コンテナの種類を載せることも冗長ではないか
0569デフォルトの名無しさん
2010/07/27(火) 23:30:180570デフォルトの名無しさん
2010/07/28(水) 01:00:040571デフォルトの名無しさん
2010/07/28(水) 09:40:15返り値が変更点になったときその影響範囲が広くて大変なことになりそうですが
普通にやって良いものなのでしょうか?
それでも2値以上返す場合はそうするしかないのでしょうか?
0572デフォルトの名無しさん
2010/07/28(水) 21:19:52const unsigned char *s = "char";
下の書き方だとgccに怒られるのですが、なぜ怒られるんですか?
0573デフォルトの名無しさん
2010/07/28(水) 23:18:30クラスが多態的になるとき引数の構造体も多態的に扱うというのは有りなのでしょうか?
また、このとき構造体も基底部をインターフェイスとした方がいいでしょうか?
0574デフォルトの名無しさん
2010/07/29(木) 00:04:06上の"char"は{ 'c', 'h', 'a', 'r', '\0' }の構文糖。
下の"char"では無名のconst char[]が作られ、
const char*はconst unsigned char*に変換できないのでエラーになる。
0575デフォルトの名無しさん
2010/07/29(木) 00:47:45コストは実測してみろ。
影響範囲がどうのということは代替案はグローバル変数か?ありえん。
たいていは読みやすく書いておけばいい。
「返す」というなら素直に戻り値にするのがいいだろう。
0576デフォルトの名無しさん
2010/07/29(木) 00:48:290577デフォルトの名無しさん
2010/07/29(木) 00:49:34クラスが多態的なのと引数が多態的なのは関係ない。別々で考えて好きにすればいい。
0578デフォルトの名無しさん
2010/07/29(木) 07:15:33構文糖っての初めて見た。
たいてい糖衣構文って言わない?
0579デフォルトの名無しさん
2010/07/29(木) 08:51:050580デフォルトの名無しさん
2010/07/29(木) 16:16:150581572
2010/07/29(木) 21:54:54なんとなく、雰囲気はつかむことができました
>>576
すみません、エラーメッセージを読んでもわかりません
もうすこし、kwsk説明してください
>>578
シンタックスシュガーとも言わない?
0582デフォルトの名無しさん
2010/07/30(金) 00:42:39構文糖
糖衣構文
セイロガン糖衣A
syntax sugar
シンタックスシュガー
0583デフォルトの名無しさん
2010/07/30(金) 01:08:43てめえはコレを書きたかっただけだろw
0584デフォルトの名無しさん
2010/07/30(金) 01:29:060585デフォルトの名無しさん
2010/07/30(金) 03:41:40ちっちゃな雪使いシュガーがないぞどういうことだ
0586デフォルトの名無しさん
2010/07/30(金) 06:56:420587デフォルトの名無しさん
2010/07/30(金) 09:24:010588デフォルトの名無しさん
2010/07/30(金) 09:56:530590デフォルトの名無しさん
2010/07/30(金) 21:55:24みたいな事をして、data_que内にいっぱいデータ詰めて、その後全部popしたんだけど、
メモリ使用量が減らないのは仕様なの?
再びやると、前回の確保量まではメモリ使用量が増えずに、確保分を超えたところからまた使用量が増えるんだけども。
どうすれば、いちいち解放してくれるだろうか。
0591デフォルトの名無しさん
2010/07/30(金) 21:57:50仕様
気に入らない場合は
OSから作らないといけなくなるかも
0592デフォルトの名無しさん
2010/07/30(金) 22:03:36OSレベルでの仕様ってことなのね。
アプリケーションが使用したことがある領域が割り当てられて、って感じなのかな。
一度に確保する数はたかが知れてるからこのままで行くことにするわ。
ありがとう。
0593デフォルトの名無しさん
2010/07/30(金) 22:22:49寝ぼけたことを言わないように。
まず、いわゆるswap技法により、ライブラリのアロケータに返すことは出来る。
ただし、ライブラリは、アプリケーション側からメモリを返却されても
OSには返さない場合も多い。
確実にOSに返すためには、
allocatorを自作して、OSから直接メモリを得て不要になったらOSに返すようなものを作る。
(ただし、例えばWin32のHeapAllocを使ってもOSと直接やり取りすることにはならない)
が、そこまでする必要があることは、まず無い。
0594デフォルトの名無しさん
2010/07/30(金) 22:24:17つまりどうすればいいの?
0595デフォルトの名無しさん
2010/07/30(金) 22:40:44allocatorを自作
0596デフォルトの名無しさん
2010/07/30(金) 23:30:060597デフォルトの名無しさん
2010/07/31(土) 09:34:19いちいち開放すると遅くなるので、本当に開放が必要か検討してみれ
0598デフォルトの名無しさん
2010/07/31(土) 09:43:57入力履歴の記憶/再生だから流石に必要かな と思ったけど、実装的には別に開放しなくても大丈夫だな・・・。
うーん、考えてみる。
アロケータを自分で書くほどの必要性には迫られてないから、そっちは保留しとくわ
0599デフォルトの名無しさん
2010/08/02(月) 06:55:30具体的には
1-10の範囲で100回乱数をとって集計すると大概は
1が30回, 4が21回, 5が6回・・・・とかになるような感じです(たまに平坦になったりするのもよいです)
そしてどれが多く出るのか、何回でるのかは毎回バラバラになるみたいな感じで
0600デフォルトの名無しさん
2010/08/02(月) 07:05:20乱数を加算する偏る
加算回数をランダムで決めたり、シャッフルしたりして加工する
0601デフォルトの名無しさん
2010/08/02(月) 07:06:53中心極限定理ですよね
それって一様分布から正規分布に近づくって話じゃなかったですか?
0602デフォルトの名無しさん
2010/08/02(月) 07:34:53ちょっと思いつかないなあ
結局、どういう風に偏ることを期待しているか、という問題に行き着くんじゃないのかね
非対称な確率分布の確率関数に突っ込めば、偏りのある数列は得られるだろう
しかし望みのものになるかは不明
0603デフォルトの名無しさん
2010/08/02(月) 07:42:451.それぞれの目が出る回数を乱数で決める
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つまり>>600の説明では意味不明でしたか?
>対称な確率分布の確率関数に突っ込めば
>望みのものになるか不明
望みの物とは正反対になるような気が……
0605デフォルトの名無しさん
2010/08/02(月) 07:51:42乱数じゃないですし
>>603
なるほど
ありがとうございます
0606デフォルトの名無しさん
2010/08/02(月) 23:54:29boostのserializeが使えない事例なので、どうすればいいか分かりません。
fwriteっていう話も聞きましたが・・・できればC++での方法が知りたいです。
0607デフォルトの名無しさん
2010/08/03(火) 00:07:43>>で書き出して<<で読み込めるようにすればストリームでシリアライズできるよ
0608606
2010/08/03(火) 00:26:200609デフォルトの名無しさん
2010/08/03(火) 00:50:32・__vtbl
・エンディアン
・パディング
これらの単語にひとつでも見覚えがないものがあるなら諦めろ
ていうかboost::serializationが使えない事例ってどういう事例よ
0610デフォルトの名無しさん
2010/08/03(火) 01:06:01自分用のライブラリっぽいものを書いてるもんで、boost入ってるの前提なのはちょっと困るんです。使用環境がboost前提になってしまうので。
そしてその単語に見覚えはあるものの、意味は分からないので今回は諦めてメンバ一個一個を読み書きすることにします・・・。
0611デフォルトの名無しさん
2010/08/03(火) 02:01:04void 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:10Sub1* sub1 = dynamic_cast<Sub1*>(src);
error C2682: 'dynamic_cast' を使用して Base*からSub1*へ変換できません
でした
0613デフォルトの名無しさん
2010/08/03(火) 03:00:500614デフォルトの名無しさん
2010/08/03(火) 03:08:140615デフォルトの名無しさん
2010/08/03(火) 08:47:08無事コンパイルは通りましたけどどうしてなんだろ・・・
0616デフォルトの名無しさん
2010/08/03(火) 20:52:13ifstream ifs("filename");
と書けばスコープ外れた時にデストラクタでcloseされるのは良いのですが、
ifstream ifs;
ifs.open("filename");
と書いた場合にもデストラクタでcloseされるのでしょうか?
コンストラクタでopenした場合にはスコープ外れたときに〜という文脈で解説しているサイトがあって不安になりました。
0617デフォルトの名無しさん
2010/08/03(火) 21:00:09俺は派生クラスにもvirtualつけてる派だが、無くてもいけるはずだと思ってたが
まさか、VC6?
0618デフォルトの名無しさん
2010/08/03(火) 21:01:54されるんじゃないかな?
0619デフォルトの名無しさん
2010/08/04(水) 00:41:27Windows 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:520621デフォルトの名無しさん
2010/08/04(水) 00:54:14実際にファイルの内容があっても読み込めないんだろうが
現実的には、単に読み込もうとした結果がEOFだと判定されているだけじゃないのかね。
0を返した後、ferror()とfeof()でエラーであることを確認した上でなら、しょうがないとも思うけど。
0622デフォルトの名無しさん
2010/08/04(水) 01:42:55確認してみましたが、feof は 0 を返します。
念のため ferror も確認しましたが 0 以外を返しました。
エラーとは認識しているようですが…。
>>620
内部で API を呼んでいるとは予想できるので、GetLastError で取得できるという話は聞いたことがあります。
ただそれでも、パラメータ不正な場合など、API を呼ぶ前にエラーが起きている場合は GetLastError で取得できないとも聞きました。
とりあえずは API を直に使ってみることにします…。ありがとうございます。
0623デフォルトの名無しさん
2010/08/04(水) 23:10:57直列化する値が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派生クラスHogehogeではfoo()の処理する値をA/B/C/D/Eと増やしたいのです
こういう場合はどういう設計をしたらいいでしょうか?
0625デフォルトの名無しさん
2010/08/04(水) 23:17:17派生クラスHogehogeではfoo()の処理する値をA/B/C/D/Eと増やしたいのです
こういう場合はどういう設計をしたらいいでしょうか?
0626デフォルトの名無しさん
2010/08/04(水) 23:18:230627デフォルトの名無しさん
2010/08/05(木) 01:22:55「対応できるようにする」の意味がわからん。
その Serialize() をどうやって呼び出すつもりなのか、とか。
0628デフォルトの名無しさん
2010/08/05(木) 01:24:04引数増やせよ。それで何か不満か?
0629デフォルトの名無しさん
2010/08/05(木) 10:30:140630デフォルトの名無しさん
2010/08/05(木) 14:43:28T1 f(T2) {
return 248;
}
int main() {
int i = f<int>(1);
}
というものなんですが
template<typename T2, typename T1>
とするとエラーになります
なぜですか
0631デフォルトの名無しさん
2010/08/05(木) 15:21:54248といえど、整数型で4つで浮動小数型2つあるから、
人にとってどれが最適なんてコンパイラさんは推論できない。
0632デフォルトの名無しさん
2010/08/05(木) 15:27:560633デフォルトの名無しさん
2010/08/07(土) 00:48:42基本的に戻り値から推論はできないよ。推論は引数からのみ。
最適とか整数型がどうとか関係ない。>>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>モジュラスサイズ num
> 1024より小さいと脆弱なキーとなるので,1024より大きくする.
>対数サイズ e
> 奇数であり,3,17,65537が良く使用されるらしい.
モジュラスサイズ = 何ビットで暗号化するかなのか?
対数サイズ って何よ?
0635デフォルトの名無しさん
2010/08/08(日) 11:15:04>new演算子は整合性があり、初期化されたオブジェクトを作成する
mallocでとった領域を初期化するには、どのようにすればいいんですか
また、newで初期化されたオブジェクトを作成しないためには、
「Test *t = 0;」でおk?
0636デフォルトの名無しさん
2010/08/08(日) 11:24:37newはコンストラクタを呼ぶ
それだけ
C++で作るつもりなら全部newで確保しとけ
0637635
2010/08/08(日) 11:29:38つまり、malloc()はメンバ変数が何が入っているか分からないだけなんですね
ポインタを返す関数(C言語)があるのですが、それにはfree専用の関数があります
C++でその関数を使っているのですが、deleteじゃなくて専用の関数を使った方がいいんですかね?
Hoge *h = funcHoge();
freeHoge(h); ○
delete(h); ×
こんな感じ?
0638デフォルトの名無しさん
2010/08/08(日) 11:38:28それは専用の方がいいだろうな
0639デフォルトの名無しさん
2010/08/08(日) 11:44:04http://ja.wikipedia.org/wiki/RSA暗号
ここの概要のところだけでも眺めてみるといいよ。
0641デフォルトの名無しさん
2010/08/08(日) 11:59:20>適当な正整数 e(通常は小さな数。65537 (=216+1) がよく使われる)を選択する
鍵ってこと?
0642デフォルトの名無しさん
2010/08/08(日) 12:09:06鍵には違いないけど、どうせ公開するものであるし、そこまで慎重になることはない
よく使われるなどと言われてる数の中から好みで選べばよいです
0643デフォルトの名無しさん
2010/08/08(日) 12:20:38実アプリで、暗号の低レベルな部分を素人が直接操作するのはお勧めしない
SSLとかを使うのが無難
もちろん勉強してみたいということなら、止めるつもりは全く無い
0644デフォルトの名無しさん
2010/08/08(日) 12:36:16公開するわけじゃないから別にいいや
0645644
2010/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:27char *buf = malloc(10000);
って書くでしょ? それと似たようなものです。
C++でもそのままmalloc使えばいいです。
0647644
2010/08/08(日) 12:53:26レス、thx
>C++でもそのままmalloc使えばいいです。
mallocはC++では禁じ手という事になっているらしいのですが、
それでもmallocを使っちゃっていいんですか
0648デフォルトの名無しさん
2010/08/08(日) 13:01:20初心者がよく間違って使いそうな可能性がある場合にとりあえず禁止しておけば安心というわけです。
正しく使う限りは大丈夫です。
0649644
2010/08/08(日) 13:01:54正しいか、間違っているか教えてください
new unsigned char[(RSA_size(key) / sizeof(char))];
0650デフォルトの名無しさん
2010/08/08(日) 13:10:24charじゃなくてchar*だろ?それにsizeof(char)だと1byteしか確保されないが・・・・・・
RSA暗号は暗号化するデータが鍵長の整数倍になるようにパッディングするから
おそらく「rsa」に暗号化する生データが入っていて,
パッディング後のサイズをRSA_size関数で計算しているんだとエスパー
0651デフォルトの名無しさん
2010/08/08(日) 13:16:16crypted_buf = malloc(sizeof(char)*RSA_size(rsa));
0652デフォルトの名無しさん
2010/08/08(日) 13:19:22間違ってはいないから正しいということになるのだろうか
/sizeof(char) はどうせ÷1なので別にあってもなくても良いのだけれど
コードが長くなるだけで無意味なのであまり書かないと思います
美的な意味があるという人もいるかもしれませんが、
そういうことであれば sizeof(unsigned char) の方がいいと思います
0653デフォルトの名無しさん
2010/08/08(日) 13:27:430654662
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;
}
0655デフォルトの名無しさん
2010/08/08(日) 15:33:320657デフォルトの名無しさん
2010/08/08(日) 20:21:47ただ、ね、
もしCでは絶対に使われないコードで、malloc()と同じ動作を求めたいのなら
operator new()を使った方が良い。
こっちは、メモリ不足の時に例外を投げてくれるから。
0659デフォルトの名無しさん
2010/08/08(日) 22:32:270660デフォルトの名無しさん
2010/08/08(日) 22:56:540661デフォルトの名無しさん
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ありがとうございます。
文字列メンバは長さ不定のためそのやり方は使えそうにないです。地道にチェックすることにします。
0664659
2010/08/09(月) 20:53:54sizeof(array) / sizeof(array[0])ですね
ありがとうございます
array[0]ってのは少しダサいですが
0665デフォルトの名無しさん
2010/08/10(火) 01:12:07実行中に吹っ飛んでも知らんぞ
0666デフォルトの名無しさん
2010/08/10(火) 05:09:270668デフォルトの名無しさん
2010/08/10(火) 06:56:14規格によりchar の類は1バイトと決まってるから
>>665
いっそarray[777]とかにしちゃおうぜ
0669デフォルトの名無しさん
2010/08/10(火) 11:21:320670デフォルトの名無しさん
2010/08/10(火) 12:05:27クラス:基底クラス
{
うんたらかんたら
bool hoge() const{処理}
};
とあったので、ヘッダと分けたいので
ヘッダ
クラス:基底クラス
{
うんたらかんたら
bool hoge() const;←ここがわからない
};
ソース
うんたらかんたら
bool クラス::hoge() const{処理};←ここがわからない
と言う風に分けたいのですが、どうすれば良いですか?
0671デフォルトの名無しさん
2010/08/10(火) 12:13:34ここのconstメンバ関数というのを読むのだ
0672デフォルトの名無しさん
2010/08/10(火) 12:15:350673デフォルトの名無しさん
2010/08/10(火) 13:49:07coutやnewのように、Cで代替の効く関数がありますが、
printfやmallocを使用するのと、どちらが一般的なのでしょうか?
0674デフォルトの名無しさん
2010/08/10(火) 14:41:43初心者になりすまして巫山戯た質問ばかりします。
あれはセロトニンレベルが異常になるような発作を
定期的に起こしているためと考えることはできますか?
特に、長期にわたって前述の行為を行っても芳しい反応を得られていないにも拘らず、
その行為をやめようとしないのは学習能力がないと思わざるを得ません。
あるいは人でなどなく、弱いAIのような存在なのでしょうか?
仮に人間だとしたら、奴さんの脳は考えることを停止したのだ、とか。
奴さんに比べたら、自己顕示欲が暴走して暴れているネット弁慶ニートのほうがまともだと思います。
0675デフォルトの名無しさん
2010/08/10(火) 14:47:00printfとnewとmallocを使ってる
0676デフォルトの名無しさん
2010/08/10(火) 15:01:31スピード重視ならprintf
クラスの入出力を多用するならcoutかboost::serialization
mallocは使うなnewを使え
0678デフォルトの名無しさん
2010/08/11(水) 01:17:21構造体のメンバすべてに値を代入する作業をするとして
hogemap[key].aのように毎回[]演算子で要素を指定してドット演算子でアクセスするよりも
find関数でキーを検索してイテレータを通じてアクセスした方が効率はよくなるのでしょうか?
0679デフォルトの名無しさん
2010/08/11(水) 01:37:39長期に持つと追加や削除時に構成が変わって危ないが。
0680デフォルトの名無しさん
2010/08/11(水) 01:55:52find() もイテレータも要らないだろ。普通に↓でいいんだから。
S& x = hogemap[key];
x.a = ...
x.b = ...
0681デフォルトの名無しさん
2010/08/11(水) 12:06:50大学の実験のレポートにて、C言語で差分方程式を数値的に解くというプログラミングを作ったのですが
学校のPCではコマンドプロンプトでコンパイルという作業ができたのですが、
自分のPCでは、たとえば cc sample.c としても、
'cc'は内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチファイルとして認識されていません。
と出て作業を続けることができません。
大学で作ったプログラム自体は間違っていないと思います。
大学のPCで動かしたときには結果のテキストファイルがちゃんと出ていたので。
今使っているPCのOSはwindows7 Home Premium です。
自分で少し調べてみたのですが、さっぱりわからない状態です。
よろしくお願いします。
0682デフォルトの名無しさん
2010/08/11(水) 12:22:150683デフォルトの名無しさん
2010/08/11(水) 12:59:18gccかclしか普段使わないなあ
0684デフォルトの名無しさん
2010/08/11(水) 13:06:190685681
2010/08/11(水) 13:09:10できないってことは入ってないのだとおもうのですが・・・
gccを検索してみたのですが、何をインストールすればいいのか
0686デフォルトの名無しさん
2010/08/11(水) 13:34:19windows環境でCをコンパイルするならcygwinとか。
KNOPPIXみたいにCDから起動するlinuxとか。
VisualC++とか。
どれにしても、教えてくれる人がいなかったらコンパイルまで
こぎつけるまで大変だと思うけど。
0687デフォルトの名無しさん
2010/08/11(水) 13:37:220688デフォルトの名無しさん
2010/08/11(水) 13:55:38まず最初に学校のccのバージョンを調べてから
0689デフォルトの名無しさん
2010/08/11(水) 14:41:420690デフォルトの名無しさん
2010/08/11(水) 15:05:01先生に聞いてみたら
0691デフォルトの名無しさん
2010/08/11(水) 15:10:350692デフォルトの名無しさん
2010/08/11(水) 15:21:020693デフォルトの名無しさん
2010/08/11(水) 15:25:18MinGWというコンパイラ?をダウンロードしてやってみたら結果ファイルを出力できてました
急いで残りのをすませてみます。
コンパイルというものが必要だということを教えていただき有難うございました。
0694デフォルトの名無しさん
2010/08/11(水) 15:37:460695デフォルトの名無しさん
2010/08/11(水) 15:55:19int型のまま書き出すにはどうすればいいんでしょか
0696デフォルトの名無しさん
2010/08/11(水) 15:59:29何通りかあるよ。
バイナリで書き込むかテキストで書き込むかというのもあるし、
オペレータ定義して書き込むとか、forでまわして書き込むとか。
0697デフォルトの名無しさん
2010/08/11(水) 16:02:050698デフォルトの名無しさん
2010/08/11(水) 16:04:450699デフォルトの名無しさん
2010/08/11(水) 16:07:39符号有りならを符号なしに再解釈キャスト
1byteごとに刻んで右シフトしてunsigned char配列に格納
unsigned char配列を書き込み
unsigned char配列を読み込み
1byteごとに左シフトしてもとの整数に格納
符号有りなら符号有りに再解釈キャスト
みたいな感じでいいの?
0700695
2010/08/11(水) 16:14:23>>699
そんな感じで
copyとostreambuf_iteratorみたいに
ポンっとやってくれるクラスがあれば知りたかったけど
ないなら作ってみますね
0701デフォルトの名無しさん
2010/08/11(水) 16:27:44ってそのまま
cout << hogehoge;
って出来ないのかな?
0702デフォルトの名無しさん
2010/08/11(水) 17:17:370704デフォルトの名無しさん
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:510706デフォルトの名無しさん
2010/08/11(水) 19:46:29NTFS
0707デフォルトの名無しさん
2010/08/11(水) 19:46:46暗号化というのがどういうものかまず考えるんだ。
強い強度がほしいならそれなりに知識は必要だが。
0708デフォルトの名無しさん
2010/08/11(水) 19:48:270709デフォルトの名無しさん
2010/08/11(水) 19:51:54エラーの場合例外を投げて例外クラスのメッセージでエラーコードを渡す
エラーコードを返り値にして引数に参照やポインタをとってそこへ代入する
適当な構造体やstd::pairのようなものを利用する
どれが一般的な手法でしょおうか
0710デフォルトの名無しさん
2010/08/11(水) 19:54:440711デフォルトの名無しさん
2010/08/11(水) 20:04:15why?
0712デフォルトの名無しさん
2010/08/11(水) 20:07:20足し算や引き算でも暗号化という行為はできるわけさ。
秘密鍵として、いくつ引いたかいくつ足したか保持してれば復号できるわけ。
ただ、数学的に妥当な強度の高い符号がほしいときはそれなりに知識がいる。
って感じだ。
0713デフォルトの名無しさん
2010/08/11(水) 20:10:17ライブラリを使えばいいだけの話じゃん
0714デフォルトの名無しさん
2010/08/11(水) 20:12:22例えば、秘密鍵や公開鍵が何かとかね。
0715デフォルトの名無しさん
2010/08/11(水) 20:13:15static_cast? dynamic_cast?
0716デフォルトの名無しさん
2010/08/11(水) 20:15:17>例えば、秘密鍵や公開鍵が何かとかね。
秘密鍵/公開鍵なんて知っていて、当たり前でしょ
0717デフォルトの名無しさん
2010/08/11(水) 20:20:48ttp://hibari.2ch.net/test/read.cgi/tech/1280914463/21
マルチすんな禿
0718デフォルトの名無しさん
2010/08/11(水) 20:20:56それは>>705に言って。
>>715
static_castでいいよ。dynamic_castはそれが必要なところ以外で使っちゃダメ。
0719デフォルトの名無しさん
2010/08/11(水) 20:22:05キャストではなくplacement newを使います
0720デフォルトの名無しさん
2010/08/11(水) 20:33:42ごめん、ごめん
昨日書き込んだ質問だったね、忘れてた
>>718
感謝
0722デフォルトの名無しさん
2010/08/12(木) 14:57:58vectorはcapacityとかがあって満杯になると
一定数増やした配列をまた作ってそこにコピーしますが、
dequeはそのようなことをしないで増えていっている気がします。
具体的な実装方法を教えてください。
0723デフォルトの名無しさん
2010/08/12(木) 15:31:26http://pages.cpsc.ucalgary.ca/~kremer/STL/1024x768/deque.html
↑満杯になったらブロックを追加するんじゃないだろうか。
0724デフォルトの名無しさん
2010/08/12(木) 15:32:45ありがとうございます。
一つのブロックに何個はいるかわかりますか?
わからないのならいいです。
0725デフォルトの名無しさん
2010/08/12(木) 15:33:250726デフォルトの名無しさん
2010/08/12(木) 15:51:000727デフォルトの名無しさん
2010/08/12(木) 16:01:410728デフォルトの名無しさん
2010/08/12(木) 16:08:530729デフォルトの名無しさん
2010/08/12(木) 16:25:24さっき「deque 実装」でググったとき、各処理系のブロックの
サイズが書いてあるページをちらっと見たけど、今探したら
見つからない。
数百とか1024とかそのくらいなんじゃないの?
気になるなら、ググって上から見ていけば出てくると思う。
0730デフォルトの名無しさん
2010/08/12(木) 16:36:200731デフォルトの名無しさん
2010/08/12(木) 16:48:54VC9: 16 Bytes
STLport: 32*sizeof(void*) Bytes
のようだが他はどうだろう。
0732デフォルトの名無しさん
2010/08/13(金) 02:16:48で、マウスの設定したボタンが押されたらギミックを動かすってしたいんだけど
どうやってボタンの入力を感知すれば良いんでしょう?
クリックならWM_LBUTTONDOWN、WM_RBUTTONDOWNで対応できるんですが・・・
0733デフォルトの名無しさん
2010/08/13(金) 03:15:47WM_MBUTTONDOWNとかWM_XBUTTONDOWNとか
0734デフォルトの名無しさん
2010/08/13(金) 12:35:43std::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ポインタだからだよアホが
0736デフォルトの名無しさん
2010/08/13(金) 14:47:52template<class T,size_t N>
size_t ArrayCount(T (&in)[N]){
return N;
}
0737デフォルトの名無しさん
2010/08/13(金) 15:00:18Nを書いたら負けだと思う
0738デフォルトの名無しさん
2010/08/13(金) 15:02:48hairetunonagasaのほうがよかったか?
0739デフォルトの名無しさん
2010/08/13(金) 15:05:270740デフォルトの名無しさん
2010/08/13(金) 15:10:130741デフォルトの名無しさん
2010/08/14(土) 01:01:160742デフォルトの名無しさん
2010/08/14(土) 01:22:18char *p;
p=array;//構文糖 p=&(array[0];と書くのが正統 でも頻発なので許容
//arrayは決してポインタではない
//array[3]は許されても*(array+3)は不法としてエラー
0743デフォルトの名無しさん
2010/08/14(土) 01:25:06array[0] char 変数
&(array[0]) char 変数のアドレス値(整数)
(char*) アドレス値をchar *ポインタ型へ再解釈するキャスト演算子
0744デフォルトの名無しさん
2010/08/14(土) 01:27:220745デフォルトの名無しさん
2010/08/14(土) 01:36:140746デフォルトの名無しさん
2010/08/14(土) 02:51:02エラーにはなりませんが何か?
#include <stdio.h>
int main(void)
{
char array[] = "abcdef";
printf("%c\n", *(array+3));
return 0;
}
0747デフォルトの名無しさん
2010/08/14(土) 22:46:130748デフォルトの名無しさん
2010/08/14(土) 23:56:006.5.2.1配列の添字付け
添字演算子[]は、E1[E2]が(*((E1)+(E2)))と等価であると定義する。
6.5.6 加減演算子
これらの演算子に関しては、配列の要素でないオブジェクトへのポインタは、
要素型としてそのオブジェクトの型をもつ長さ1の配列の最初の要素へのポインタと
同じ動作をする。
面倒なのでこれ以上の引用は避けるが、配列として定義した変数を添え字なしで使用したとき、
アドレス定数として解釈される。アドレス定数はある種のポインタである。
配列とポインタはそれぞれ定義が異なり、宣言時の区別は重要だが、演算をするにあたっては
規格で定義されている通り、特に区別が必要なわけではない。
> p=&(array[0];と書くのが正統
というのは、配列ととポインタの定義が同一ではないことにこだわるあまりに
初心者がはまりこむよくある勘違い
0749デフォルトの名無しさん
2010/08/15(日) 02:14:520750デフォルトの名無しさん
2010/08/15(日) 02:22:55p=&0[array];
が正解
0751デフォルトの名無しさん
2010/08/15(日) 08:04:55>配列として定義した変数を添え字なしで使用したとき、アドレス定数として解釈される。
此処は間違い。添え字付きの場合でも、ポインタに変換されてから添え字演算子のオペランド
になっている。
規格書は持っていないので、K&Rから。
A7.1
式あるいは部分式の型が、ある型Tについて、「Tの配列」であれば、その式の値は配列の中の最初のオブジェクトへのポインタであり、式の型は「Tへのポインタ」に変換される。
この式が単項の&演算子、あるいは++, --, sizeofの被演算数、あるいは代入演算子、あるいは.演算子の左演算数のモノであれば、この変換は行われない。
※それにしても訳がよくないね。2番目の文の「あるいは」がどこまでかかっているのか
全く不明だ。規格書の該当部分わかったら教えて欲しい。
0752デフォルトの名無しさん
2010/08/15(日) 11:22:35p=&array;
であって
p=array;
と
p=&array[0];
はどっちでもいい
0753デフォルトの名無しさん
2010/08/17(火) 18:56:58昨日からニコニコ動画の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:390755デフォルトの名無しさん
2010/08/18(水) 18:37:50キリッを忘れてるぞ
0756デフォルトの名無しさん
2010/08/21(土) 05:42:12Windows、C++でネットワークを利用するプログラムを書こうとした場合、Winsock2以外に選択肢はあるのでしょうか?
あるいは、Winsockはもう時代遅れで、新しいのが有るのでしょうか?
0757デフォルトの名無しさん
2010/08/21(土) 11:59:380758デフォルトの名無しさん
2010/08/21(土) 12:02:560759デフォルトの名無しさん
2010/08/21(土) 12:56:25ない。
0760デフォルトの名無しさん
2010/08/21(土) 12:59:050761デフォルトの名無しさん
2010/08/21(土) 13:08:020762デフォルトの名無しさん
2010/08/21(土) 13:12:53それだけはありえない
0763デフォルトの名無しさん
2010/08/21(土) 13:30:52Qt4
0764デフォルトの名無しさん
2010/08/21(土) 15:42:34::operator new (size)
::new char [size]
規格上、上記の3つとも「size以下のサイズをもつあらゆる型のアラインメントの倍数のアドレスを返す」、でおk?
0765デフォルトの名無しさん
2010/08/21(土) 17:05:03今タイマー機能を持ったクラス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まあそれは置いといて、その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おk、謎の力で動いてることが確認できたので全力で改善します
しかし他のところだと無自覚に謎の力に頼ってそうで怖い…
>型消去
なかなか面白そうですね、これは初耳です
他のやつも小耳に挟んだ程度なので勉強してみます
どうもありがとうございます
0771デフォルトの名無しさん
2010/08/21(土) 20:05:260772デフォルトの名無しさん
2010/08/21(土) 20:10:42違う。
staticは他の翻訳単位からは見えない。
privateは見える。
0773デフォルトの名無しさん
2010/08/21(土) 21:06:01local int i;
LittleEndian();
for (i=0; i<=100; i++) {
Printf("%6d",i);
}
これで0から指定数、この場合100まで1行に出力します。
これを、1行10列で改行して出力するにはどうしたらいいでしょうか?
0775デフォルトの名無しさん
2010/08/21(土) 21:14:19C/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:24http://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:05inline で我慢するとか…はダメなんかね
0779デフォルトの名無しさん
2010/08/22(日) 00:22:550780デフォルトの名無しさん
2010/08/22(日) 01:14:39書き捨て御免!
#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:023つ目にアライメントを期待するのはさすがに無理があるだろ。
「規格上」というなら対応する記述を探してこないとね。
0782デフォルトの名無しさん
2010/08/22(日) 04:54:470783デフォルトの名無しさん
2010/08/22(日) 05:07:31俺はクラスはヘッダーに全部書く派だが、基本的には分けるのが普通なんだそうだ。
テンプレート系は分離できないからヘッダにべた書きしかないらしいが。
プリコンパイルヘッダを使ってるなら、なるべくそこにまとめるのがいいと思う。
何でそうするかって言うと、
実装が隠せることがライブラリにとって幸福であること。売り物だと特にね。
もう一個はコンパイル時間の短縮。
って感じじゃないかな?
0784デフォルトの名無しさん
2010/08/22(日) 08:41:00大変面白い情報をありがとうございます
まさにダイレクトな解法です
>>778-779
実はこのマクロはデバッグ用のものでして
特に__LINE__がその場に記述されていることになっていないと上手く動かないものです
ですから機械的な置換であるマクロでやっているのですがよく考えるとinlineも埋め込みですから
その場の展開になるんですかね?ちょっと実験してみます
どうもありがとうございました
0785デフォルトの名無しさん
2010/08/22(日) 09:27:44こういうときこそシングルトンにするべき?
0786デフォルトの名無しさん
2010/08/22(日) 11:05:030787デフォルトの名無しさん
2010/08/22(日) 11:32:46前方宣言で済むときは原則として常に前方宣言。
クラスや構造体が多いときは予め前方宣言だけ書いたヘッダを用意しておく方法もある。
詳しくは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ユーザー定義のヘッダをプリコンパイルヘッダにまとめるのは、
コンパイル依存性を増大させるからおすすめできない。
自前のライブラリみたいな、滅多に更新しないヘッダなら最適だけど。
0791デフォルトの名無しさん
2010/08/22(日) 22:37:41本題とは関係ないんだろうけど、 namespace std 内の宣言は、既存のテンプレートの
特殊化以外、ユーザーが書いちゃダメなんだぜ。
0792デフォルトの名無しさん
2010/08/22(日) 23:44:06.\ファイル名(行番号) : 表示内容
みたいな短縮的な書式での出力でもジャンプすることができるんですが
検索結果などでもこんなふうにパスを短縮することができないでしょうか?
無駄にフルパス表示で必要な表示部分がものすごく狭くなってしまいます
0793デフォルトの名無しさん
2010/08/23(月) 01:44:11ソフトの使い方はそのソフトのスレへどうぞ。
0794デフォルトの名無しさん
2010/08/23(月) 09:15:05それもそうですね、すみませんでした
0795デフォルトの名無しさん
2010/08/23(月) 22:48:240796デフォルトの名無しさん
2010/08/23(月) 22:56:56ヘッダ書くとか別のcppファイルにプロトタイプ宣言書けば呼び出せる
0797デフォルトの名無しさん
2010/08/23(月) 23:04:15ありがとうございます!
そうか…プロトタイプ宣言はこういうときに使うんだったか…
0798デフォルトの名無しさん
2010/08/23(月) 23:31:01そして余談ですが>>765がいうなれば出来損ないの型消去もどきであると思いました
遥かに堅実になり、ヒントを下さった皆様に重ね重ねお礼を申し上げます
0799デフォルトの名無しさん
2010/08/24(火) 09:41:03実際に使ってみて初めて意味がわかるってことって多いよな、ほんと。
0800デフォルトの名無しさん
2010/08/24(火) 09:53:14とかだとプロトタイプ宣言無くても使えるんじゃなかったっけ
0801デフォルトの名無しさん
2010/08/24(火) 10:06:390802デフォルトの名無しさん
2010/08/24(火) 10:06:440803デフォルトの名無しさん
2010/08/24(火) 10:08:330804デフォルトの名無しさん
2010/08/24(火) 18:17:290805デフォルトの名無しさん
2010/08/25(水) 01:23:45C99 から最低でも関数宣言だけは必要になりました。
0806デフォルトの名無しさん
2010/08/25(水) 07:33:000807デフォルトの名無しさん
2010/08/25(水) 07:37:22まぁ、完全準拠ではないかもしれないがね。
0808デフォルトの名無しさん
2010/08/25(水) 11:41:130809デフォルトの名無しさん
2010/08/25(水) 13:49:25プッ
0810デフォルトの名無しさん
2010/08/25(水) 13:59:16つIntel C++
0811デフォルトの名無しさん
2010/08/25(水) 21:10:15public 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:03C++でいう、構造体にパブリックなメンバ変数と関数テーブルを持たせる。
でコンストラクタ的な、初期化関数から値を受け取って必要ならデストラクタ的な開放関数を用意する。
関数テーブルは基本的にバーチャル相当。
って感じじゃないかな。
0813デフォルトの名無しさん
2010/08/25(水) 21:18:33C++はCのアッパーコンパチだから、無理にクラスなどを使う必要はない。
思う存分構造化するがいいさ。
0814デフォルトの名無しさん
2010/08/25(水) 21:22:52無理せずともクラスは自然に使える
クラスも構造化もどんどん使え
0816デフォルトの名無しさん
2010/08/25(水) 22:09:24片方に限定して使った方がいいかな?
0817デフォルトの名無しさん
2010/08/25(水) 22:10:52使い捨てならどっちでもいい
0819デフォルトの名無しさん
2010/08/25(水) 22:48:21独自機能だったかもしれないけど、FILE*からfstreamに変換はできたと思う。@VC10
うろ覚えだけども。
0820デフォルトの名無しさん
2010/08/26(木) 01:15:27使った人に数字を入力させたいんですが、
int a;
cin<<a;
を使ったときに、そこに入ってるのは数字とは限らないので、
例えば「ああああ」とか入力するとオーバーフローを起こしてしまうので、どうにかしたいんです。
0821デフォルトの名無しさん
2010/08/26(木) 01:28:56まず
> int a;
> cin<<a;
は
> cin >> a;
ね。
普通に
string s;
cin >> s;
で良いじゃん。
あとはlexical_castを勉強しておしまい、
0822デフォルトの名無しさん
2010/08/26(木) 01:38:28何を見て「オーバーフローを起こしてしまう」って言ってるの。
標準の動作なら何も起こらず 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マルチインスタンスとかで困るし
0825デフォルトの名無しさん
2010/08/26(木) 14:45:16普通は (1) (3)
ぎりぎり (4) (コスト大)
(6) Qt4 の QString とか良いよ
0826デフォルトの名無しさん
2010/08/26(木) 19:26:00返却方法はmoveできるならmoveがいいな。
0827デフォルトの名無しさん
2010/08/26(木) 19:37:07>>826
>生のポインタは触りたくない。
(6) std::auto_ptr<> とか
戻り値をstd::stringにする人は
エラーは例外出すってこと?
0828デフォルトの名無しさん
2010/08/26(木) 19:46:380829デフォルトの名無しさん
2010/08/26(木) 19:55:220830デフォルトの名無しさん
2010/08/26(木) 19:57:23shared_ptrはstd::tr1名前空間にある
0831デフォルトの名無しさん
2010/08/26(木) 19:58:470832デフォルトの名無しさん
2010/08/26(木) 20:06:22別にshared_ptrでもいいんだけど、そこでshared_ptr使っちゃうような人はC#かJavaでも使った方がいいんじゃないかなと思う。
0833デフォルトの名無しさん
2010/08/26(木) 20:23:23いつ消えるか分からんのに
0834デフォルトの名無しさん
2010/08/26(木) 20:25:250835デフォルトの名無しさん
2010/08/26(木) 20:30:29unique_ptrの件を知らない人がいたというお話
0836デフォルトの名無しさん
2010/08/26(木) 20:34:35unique_ptrはコンテナにも入ります!
>>827
エラーの起こりにくいコード前提だな。例外は使ってないし。
0837836
2010/08/26(木) 20:37:090838デフォルトの名無しさん
2010/08/26(木) 20:53:400839デフォルトの名無しさん
2010/08/26(木) 20:55:41オブジェクト指向言語のprivateなフィールド(プロパティ)になるってことでいいんですか?
0840デフォルトの名無しさん
2010/08/26(木) 21:01:01まーそうなんだけど、俺は初心者にはauto_ptrの存在自体を教えないと思う。
あぶなっかしいし、なくても何とかなる。
0841デフォルトの名無しさん
2010/08/26(木) 21:01:300842デフォルトの名無しさん
2010/08/26(木) 22:17:070843デフォルトの名無しさん
2010/08/26(木) 22:40:48class Pointer;のように前方宣言をしますが
これって、省略しても構わないんですか?
省略しているコードを見つけたもので
0844デフォルトの名無しさん
2010/08/26(木) 22:43:08省略可能な文脈では省略可能としか言いようがない。
勉強してくれ。
0845デフォルトの名無しさん
2010/08/27(金) 00:08:13そのような名前の何かがあるということがわからないと困る場合がある。
C++のコードは名前が一意だから、その宣言によってソースを検索できると便利な場合がある。人でも機会でも。
0846デフォルトの名無しさん
2010/08/27(金) 02:19:49どうもありがとうございます
staticはやはりグレーなんですか、一応シビアな使い方はまだしていないんですが早急に次善策を考える必要がありそうですね
それとQString(やQt4)もなかなか面白そうなので調べてみます
0847デフォルトの名無しさん
2010/08/27(金) 02:28:47関数内部の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>std::cout << func() << func();
func()の実装が(2)だと、これが鼻から悪魔なんだっけ?
0849デフォルトの名無しさん
2010/08/28(土) 20:15:35意図した結果にならない可能性が高いってだけで、未定義動作じゃないよ。
0850デフォルトの名無しさん
2010/08/28(土) 20:16:44未定義じゃないの?
0851デフォルトの名無しさん
2010/08/28(土) 20:32:020852デフォルトの名無しさん
2010/08/28(土) 20:33:35評価される順はどちらが先なの?
0853デフォルトの名無しさん
2010/08/28(土) 20:34:44どっちか分からないかどうかは未定義とは関係なくね?
0854デフォルトの名無しさん
2010/08/28(土) 20:38:38それを未定義動作というんじゃないかい?
仮に func の実装が
int func(void){
static int counter;
return ++counter;
}
であるとき
cout << func() << func();
の結果が
12
となるか
21
となるかが決められてないなら
未定義動作でしょ
0855デフォルトの名無しさん
2010/08/28(土) 20:42:53違うだろ・・・・・・
0856デフォルトの名無しさん
2010/08/28(土) 20:54:04その結果は 12 となるか 21 となるかは決まってないが、そのどちらかでなければ
ならないとは決まっている。
未定義動作は、何も決まっていない。
0857デフォルトの名無しさん
2010/08/28(土) 20:55:240858デフォルトの名無しさん
2010/08/28(土) 20:57:01は未定義であっても
cout << func() << func();
は未定義じゃないだろ。
0859デフォルトの名無しさん
2010/08/28(土) 20:58:25<<の左右の評価順も規定されてないのかな。
0860デフォルトの名無しさん
2010/08/28(土) 20:58:42どちらも未定義ではない。 func() の評価順が不定という意味ではどちらも同じ。
0861デフォルトの名無しさん
2010/08/28(土) 21:01:21それはない
0862デフォルトの名無しさん
2010/08/28(土) 21:02:430863デフォルトの名無しさん
2010/08/28(土) 22:54:15で右が先に評価されるということは
本来は
(cout << func()) << func();
であるところが
cout << (func() << func());
をやってることになる
0864デフォルトの名無しさん
2010/08/28(土) 22:58:42こういうことですね
0865デフォルトの名無しさん
2010/08/28(土) 23:04:33T x = func();
T y = func();
cout << x << y
このように評価してもいいし、あるいは
cout << y << x
こんな結果になるかもしれない。
いずれも規格に反しない。
0866デフォルトの名無しさん
2010/08/28(土) 23:22:230867デフォルトの名無しさん
2010/08/28(土) 23:28:550868デフォルトの名無しさん
2010/08/28(土) 23:31:040869デフォルトの名無しさん
2010/08/29(日) 00:45:48×実用上
○俺の経験上
×通常言われる
○俺の言う
0870デフォルトの名無しさん
2010/08/29(日) 00:46:160871デフォルトの名無しさん
2010/08/29(日) 01:52:19スレ見てないのか?
0872デフォルトの名無しさん
2010/08/29(日) 15:56:01と
printf("%d", incI() * incI());
で、後者は副作用完了点があるから未定義の動作にならない
というのは正しい?
0873デフォルトの名無しさん
2010/08/29(日) 18:42:41* 演算子次第じゃろ
0874デフォルトの名無しさん
2010/08/29(日) 20:22:15{
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を渡すことができますか?
0875874
2010/08/29(日) 20:24:163行目は
LPRECT pRect = *ppRect ;
でした
0876デフォルトの名無しさん
2010/08/29(日) 20:27:23{
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:361 番目の引数を 'RECT *' から 'LPRECT *' に変換できません。
って怒られます
Hoge側は提供されてる関数なので私では弄れません
単にLPRECT型で受け付けてくれれば&rectでいいんですが
ポインタのポインタ?になっているので
構造体の配列を渡す方法がわからないのです・・・
0878デフォルトの名無しさん
2010/08/29(日) 20:43:13static void Hoge( LPRECT pRect )
0879デフォルトの名無しさん
2010/08/29(日) 22:29:130880デフォルトの名無しさん
2010/08/30(月) 01:33:00何から手を付ければいいのかわかりません
初心者歓迎との事なので教えて貰えないでしょうか
0881デフォルトの名無しさん
2010/08/30(月) 01:39:080882デフォルトの名無しさん
2010/08/30(月) 02:50:24使うことは推奨されないからこそ
PC-Linuxとかが流行ってい(た)るわけで...
WindowsではIISを使ってあげるのが正道
どうしてもというのであればVirtual PCでもDLして
その上にPC-Linuxをインスコしてというやり方(BuildもOK)
0883デフォルトの名無しさん
2010/08/30(月) 09:19:09それは本物のapacheではない
0884デフォルトの名無しさん
2010/08/31(火) 07:08:49double 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標準出力にエラーメッセージを出すのがプロっぽくないw
エラー値を生で書くのはどうにも不調法だから、せめて定数マクロに。
戻り値の値域が特定しにくい場合はNaNを返すと言う裏技を使うこともあり。
C++なら例外を使うのも手。Cなら引き数を増やす手も。
例えば、int a(int data, double * res)とかdouble a(int data, int * status)とか。
0886デフォルトの名無しさん
2010/08/31(火) 07:36:20色々ありえるが、どれも一長一短というところ
状況にもよる。例えば、入力が静的で不正な引数はバグ以外にありえない、
不正な引数があっても処理を続行する必要がないというなら
assertを書いておくだけで十分かもしれない
・エラーでプログラムを落とす
・関数では何もしない。その代わり、呼び出し側が引数の妥当性を保証する
・デフォルト値(例えば0.0)を返す
・NaNを使う
・引数に変数へのポインタを取り、それに成否を書き込む
・グローバル変数を使う
・構造体(へのポインタ)を返す
・例外を使う(C++の場合)
0887デフォルトの名無しさん
2010/08/31(火) 08:17:520888デフォルトの名無しさん
2010/08/31(火) 08:46:330889デフォルトの名無しさん
2010/08/31(火) 09:10:06中断する際はデストラクタは呼ばれるのでしょうか?
0890デフォルトの名無しさん
2010/08/31(火) 09:26:58呼ばれない
例外を投げるなら呼ばれる
CとC++での例外処理
ttp://msdn.microsoft.com/ja-jp/library/cc440194%28VS.71%29.aspx
末尾の「Rationale(論理的根拠)」を参照
0891デフォルトの名無しさん
2010/08/31(火) 11:18:35定数を左にもってきたりとか、returnにカッコがあったりとかが素人くさい。
0892デフォルトの名無しさん
2010/08/31(火) 14:33:34定数左辺だと何か問題があるのかい?
0893デフォルトの名無しさん
2010/08/31(火) 14:56:46returnにカッコがあったりってのは確かに素人らしい。
でもそんなの気にしないでとにかく他の人のソースとかも眺めるのが良いかと。
0894デフォルトの名無しさん
2010/08/31(火) 15:22:32定数左とかメリットはあってもデメリットは全く無いもんなのにな
0895デフォルトの名無しさん
2010/08/31(火) 15:25:060896デフォルトの名無しさん
2010/08/31(火) 15:31:13それは余りにも主観によるだろう
0897デフォルトの名無しさん
2010/08/31(火) 16:03:24a < b < c
という範囲を調べたいときに
a < b and b < c
と書く人もいれば
b > a and c > b
と書く人もいるし
~(a >= b or b >= c)
と書く人もいるかもしれない
0898デフォルトの名無しさん
2010/08/31(火) 16:05:01b > a and b < c
と書くべきだな
0899デフォルトの名無しさん
2010/08/31(火) 16:07:460900デフォルトの名無しさん
2010/08/31(火) 16:09:43a < b and b < cを使うな
好みの問題だと思うけど
0901デフォルトの名無しさん
2010/08/31(火) 16:14:32そういう機能ってなぜか無いよね。
0902デフォルトの名無しさん
2010/08/31(火) 16:52:43被判定変数は b だ。 そして b の条件はこうだ思考 b > a and b < c
0903デフォルトの名無しさん
2010/08/31(火) 16:55:27たしかにそういう流派でわかれるかもね。
0904デフォルトの名無しさん
2010/08/31(火) 17:07:54さらに 前者の思考の場合には c > b and b > a や b < c and a < b はありえない
(記述の順=数直線上での位置 というイメージなので)
後者の場合には
b < c and b > a という記述もありえる
ショートサーキットを意識したうえで あえて入れ替えるケースもある(最適化されるかもしれんけどw)
0905デフォルトの名無しさん
2010/08/31(火) 17:21:12不等号にはそういうことばが無いのが分かりにくくしてるような気がするね。
外人の言葉は動詞が真ん中に来るから自然に分かりやすいのだろうけど
0906デフォルトの名無しさん
2010/08/31(火) 17:38:34a = b = cみたいにa < b < cとかオーバーロードできたらなあ
0907デフォルトの名無しさん
2010/08/31(火) 18:14:400908デフォルトの名無しさん
2010/08/31(火) 18:26:310909デフォルトの名無しさん
2010/08/31(火) 18:42:00enum EnumName {ENUM1};
コードでEnumName::ENUM1と書くと"EnumName::"は省略してくださいという警告が出る。
いやどこの所属か明確にした方が分かりやすいだろと
0910デフォルトの名無しさん
2010/08/31(火) 18:54:570911デフォルトの名無しさん
2010/08/31(火) 19:04:11こんな書き方できるのか初めて知った
0912デフォルトの名無しさん
2010/08/31(火) 20:20:010913デフォルトの名無しさん
2010/08/31(火) 20:36:28using e::E;
こうやってる
0914デフォルトの名無しさん
2010/08/31(火) 23:59:51まともな人はあんまりそういう変な工夫しないで、素直に書いてることが
多いから、素人くさく見える。
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>・読み易さを軽視する理由はない
これはまあ見逃すとして
>・比較対照が変数だとなんの効果もない
今は定数に関する話だ
0921デフォルトの名無しさん
2010/09/01(水) 02:19:09省略しているんじゃないよ! むしろ==0や!=0が蛇足なんだよ!
0922デフォルトの名無しさん
2010/09/01(水) 02:36:51if (n!=0) { 〜 }
if (!n) { 〜 }
if (n==0) { 〜 }
if (0==n) { 〜 }
どれが読みやすい?
どれが本来の意味を表している?
>>921じゃなくても答えてみ?
0923デフォルトの名無しさん
2010/09/01(水) 02:41:380924デフォルトの名無しさん
2010/09/01(水) 02:53:140925デフォルトの名無しさん
2010/09/01(水) 02:56:560926デフォルトの名無しさん
2010/09/01(水) 03:01:050927デフォルトの名無しさん
2010/09/01(水) 03:16:520928デフォルトの名無しさん
2010/09/01(水) 05:06:32だってifだし
もしifの役目を他の記号か何かが担ってたなら別だけど、ifだもんな
0929デフォルトの名無しさん
2010/09/01(水) 08:16:12a = !n ? t : f;
0930デフォルトの名無しさん
2010/09/01(水) 08:16:550931デフォルトの名無しさん
2010/09/01(水) 10:20:13cの場合n!=0の結果は0か1なのでif(n)とif(n!=0)は意味が違う
まともなコンパイラなら無駄を省いて同一視するが
0932デフォルトの名無しさん
2010/09/01(水) 11:11:42n != false
は
やってもいいけど
n == true
n != true
は
やってはいけないと
2ch のおっさんに聞いた
0933デフォルトの名無しさん
2010/09/01(水) 12:07:13そりゃ真の特殊な場合であるtrue(=1)と比べるのはまずい
0934デフォルトの名無しさん
2010/09/01(水) 12:39:25if (success) …とか書くのがわかりやすい。
if (success != false) …だと「成功が偽でなくて」とか、判断するのに
負担がかかる。
0935デフォルトの名無しさん
2010/09/01(水) 14:28:19変数が真偽値(に準ずるもの)ならばそのまま条件式にすればいいのでは
0936デフォルトの名無しさん
2010/09/01(水) 14:56:55if(a - 7 != 0){〜}
if(a - 7){〜}
どれがいいですか
0937デフォルトの名無しさん
2010/09/01(水) 15:20:100938デフォルトの名無しさん
2010/09/01(水) 15:24:390939デフォルトの名無しさん
2010/09/01(水) 15:27:360940デフォルトの名無しさん
2010/09/01(水) 15:30:010941デフォルトの名無しさん
2010/09/01(水) 15:55:09> if (success) …とか書くのがわかりやすい。
まあそれは言える。bool値ってそう言う物だし。
> if (success != false) …だと「成功が偽でなくて」とか、判断するのに
> 負担がかかる。
それは、見る人がってことだよね?
コンパイラが最適化するから実行時のオーバーヘッドにはならないだろう。
あくまで見る人がつらいってことだよね。
0942デフォルトの名無しさん
2010/09/01(水) 17:35:590943デフォルトの名無しさん
2010/09/01(水) 18:02:370944デフォルトの名無しさん
2010/09/01(水) 18:05:12なんという二進法脳
0945デフォルトの名無しさん
2010/09/01(水) 19:19:190946デフォルトの名無しさん
2010/09/01(水) 20:17:290947デフォルトの名無しさん
2010/09/01(水) 21:08:19> あくまで見る人がつらいってことだよね。
そりゃそうだよ。
こんなことパフォーマンスの観点で語るやついないだろ。
0948デフォルトの名無しさん
2010/09/01(水) 21:45:58> こんなことパフォーマンスの観点で語るやついないだろ。
それがたまにいるんだよ。
恐ろしいことに。
0949デフォルトの名無しさん
2010/09/02(木) 21:02:38それはそうと大貧民が一番楽しいよな、あのトランプゲーム。
0950デフォルトの名無しさん
2010/09/03(金) 19:08:01複数のファイル名(パス)が代入された、配列 fileList[] があるとし、ここから1ファイルだけ読み込む関数 LoadFile() を用意します。
fileList[] にある複数のファイルを読み込むには、while 等で複数回 LoadFile() を呼び出します。
以上のような仕様の関数を作るとき、
(a) ファイルを正しくオープンできたか?(ファイルがない、フォーマットがおかしい等)
(b) fileList[] の最後まで読み込んだか?(最後でなければ読み込みループ継続)
というのは、どのように取得するのがスマートでしょうか?
Cなら
(a)オープン成功か … 引数で成否を表す変数をポインタ渡し
(b) リスト終了か … 関数の戻り値
C++なら
(a)オープン成功か … 失敗したら例外を投げる
(b) リスト終了か … 関数の戻り値
といった感じでしょうか?
また、関数の戻り値でリスト終了かどうかを検知する場合、どのような戻り値にするべきでしょう?
Cの標準関数を参考にしようと思ったのですが、(それぞれ機能が異なるため当然ですが)統一されていないように感じました。
0951デフォルトの名無しさん
2010/09/03(金) 20:00:25bool opened;
bool status;
FILE *fp;
char *filename;
} LoadFileInfo;
LoadFileInfo fileList[] = { {hoge}, {fuga}, {hage} };
0952デフォルトの名無しさん
2010/09/03(金) 20:02:330953950
2010/09/03(金) 20:20:17>>951
ファイル名リストの中に、各フラグも一緒に詰め込んでしまえってことね。
で、別途で配列を走査してエラーがあったかどうか調べると。
>>952
エスパーされすぎてよく分からないのですが、どういうことでしょうか。
関数の呼び出し側でfileListからファイル名を1つだけ抽出し、それを関数に渡すべしとも取れるのですが、
それをラップするのが今回用意する関数の目的です。
0954デフォルトの名無しさん
2010/09/03(金) 20:22:340955デフォルトの名無しさん
2010/09/03(金) 20:29:14別途 fileLoader::err() みたいな関数なり、専用の変数なりを用意するってこと?
0956デフォルトの名無しさん
2010/09/03(金) 20:39:13エスパー失敗したようですごめんなさい。
複数のファイル読み込みがトータルで成功したか失敗したかだけではなく、
どのファイルで失敗したかを知りたい?
でもそれなら失敗したファイル名を返せばいいだけだと思うし。。
0957デフォルトの名無しさん
2010/09/03(金) 20:46:54どのファイルで失敗したか? もそうですが、
IOのコストが高い(と言っても数秒ですが)ので、1つでも失敗した瞬間にエラーが返ってきてほしいなあと。
まあ、それに関してはマルチスレッドしろよって話なんですけどね。
0958デフォルトの名無しさん
2010/09/03(金) 21:53:460959デフォルトの名無しさん
2010/09/04(土) 01:57:53失敗したら抜ければいいんじゃないの
擬似コードだけど、こういう構造のどこに不満があるのかを書いたほうがいいかも。
foreach (filename in filelist){
if (fileload(filename) is failed)
return filename;
return nullstring;
}
0960デフォルトの名無しさん
2010/09/04(土) 09:05:37オープン正否と、リスト読み込み正否を区別する必要はある?
読み込み失敗時点で終了すればよいのだったら、配列だから0から順番に読むことにして、
処理できたindexと、成功/失敗(失敗要因)を返せばイイと思うが。
途中で失敗しても、一通り処理したいのであれば、fileListに対応した処理結果を格納する配列を
渡して、値をセットする方がいい。
>951のようにfileListそのものに処理結果を含める方法もあるが、fileListと処理結果メンバにした
構造体にする方がベターだと思う。
0961950
2010/09/04(土) 10:58:47・ファイル一覧の配列を用意する(fileList)
・1回の呼び出しで1つだけファイルを読み込む
多少の変更は問題ないですが、以上の2つの仕様は前提条件のつもりです。
>>959
ですので、全部まとめるわけにはいきません。
別途、一括ロード関数を用意するかもしれませんが。
>>960
オープン成否と、読み込み終了とを区別する必要はあります。
自分用ライブラリ的なものを想定しているので、その区別を認識するかどうかは呼び出し側のコード次第で。
オープン失敗ファイルのリスト化など、とりあえず方向性(は見えてきたので、色々試してみようと思います。
ありがとうございました。
0962デフォルトの名無しさん
2010/09/04(土) 11:49:240963デフォルトの名無しさん
2010/09/04(土) 15:05:27構造体の配列の初期化で
A_St(構造体型名) A[10] = { 〜〜〜〜 };
とやると
最初のA[0]のみ{ 〜〜〜〜 }の間の値で初期化されるのでしょうか?
それともA[9]まで{ 〜〜〜〜 }の値で初期化されるのでしょうか?
0964デフォルトの名無しさん
2010/09/04(土) 15:08:46いえ、明示したもの以外は0を入れた感じでで初期化され
POD型の話だよね?
0965デフォルトの名無しさん
2010/09/04(土) 18:28:52今は無意味にこだわって型名だけにしているんですがなにかセオリーとか各々にする理由とかありますか?
0966デフォルトの名無しさん
2010/09/04(土) 18:32:420967デフォルトの名無しさん
2010/09/04(土) 18:37:300968デフォルトの名無しさん
2010/09/04(土) 18:37:40名前がないと引数順序分からなくね?
名前つけてればヘッダ見るだけで引数の順序が分かってありがたい
インテリセンス使うと名前のありがたみがさらに倍
0969デフォルトの名無しさん
2010/09/04(土) 18:45:30いや、それも無視できない理由の一つだと思います
コピペすることによって手間を減らせるし(というか削除が手間)不整合がそもそも起きない
>>968
ああ、それもありますね
今思うと無駄に順序を考えて関数を使用することがあったと思います
どうもありがとうございます
というかよく考えるとなぜ変数名を消すようになったのかよく覚えてません
>>965の質問を変更してプロトタイプ宣言から変数名を消すメリットってありますか?
>>967
それはなぜでしょう?自分にはメリットが分からなくなってます
0970デフォルトの名無しさん
2010/09/04(土) 18:46:30>>959は「ファイル一覧」「1回の呼び出しでひとつだけファイルを読む関数」
を利用した、一括ロード処理をする擬似コードだよね。
オープン失敗ファイルをリスト化するってことは、失敗したら即エラーを返したいという
要求からずれているように思うよ。
0971デフォルトの名無しさん
2010/09/04(土) 18:56:29消すとプロトタイプ宣言がスッキリするとか、仮引数名を変更した時にずれにくいとか考えていたころがあったなぁ。
今は消さなくなったよ。
0972デフォルトの名無しさん
2010/09/04(土) 19:08:40仮引数名は書いた方がよい
プロトタイプ宣言を見ただけでだけでその関数の仕様が理解できるというのが理想
自分の作ったライブラリを他人が利用することを考えてみればいい。あるいはその逆も。
ちょっと極端な例だけど
data_copy( void*, void*, size_t );
だけだと、どっちのvoid*にソースとデスティネーションを渡せばいいか混乱するかもしれない
data_copy( void* dst, void *src, size_t size );
ならdstにsrcがコピーされるってのがすぐにわかるだろ?
0973デフォルトの名無しさん
2010/09/04(土) 19:12:411: 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:060975デフォルトの名無しさん
2010/09/04(土) 19:18:49main() の t_st は初期化されていないポインタなので何が入ってるかわからない。
また、引数への代入は呼び出し元に影響しない。 C++ の参照型を使えば話は少し変わってくるけどね。
もちろん、引数への代入と、引数が指す先への代入も別。
localtime() が返すポインタはちょっと特殊なんで、それがどういうものかマニュアルを
確認するといい。
0976デフォルトの名無しさん
2010/09/04(土) 19:19:45やはり分かりやすさなどを見ると書いてあったほうがいいですよね
どうもありがとうございます
>>971
>消すとプロトタイプ宣言がスッキリする
もしかしたらこんな理由だった気がする
0977デフォルトの名無しさん
2010/09/04(土) 19:26:42最初の例だと、確かに *t_st に値を入れることはできる。
だが、今やりたいのは t_st に値を入れることで、それには下の例でないとできない。
0978デフォルトの名無しさん
2010/09/04(土) 21:39:34これはひどい
0979デフォルトの名無しさん
2010/09/04(土) 22:40:07>前半
ああ、勘違いしてました。
提示された擬似コード全体を1つの関数とみなす(つまり関数の中身を書いた)のかと思っていました。
擬似コードではforeachを使って、ファイル一覧から1要素取り出していますが、
この部分も関数の中に突っ込んでしまえたらスッキリしそうですよね。
>後半
即エラー云々については要求仕様ではないので、ささいな変更であるとしました。
0980デフォルトの名無しさん
2010/09/05(日) 00:20:280981デフォルトの名無しさん
2010/09/05(日) 01:58:51解決への意欲が感じられない
0982973
2010/09/05(日) 14:38:38ありがとうございます。もっと簡単なコード書いてデバッグしてみたりしてだいぶ分かってきました。
ポインタをもっと勉強してきます
0983デフォルトの名無しさん
2010/09/05(日) 15:07:26FILE構造体とかフレームワーク使った時etc
0984デフォルトの名無しさん
2010/09/05(日) 15:21:42どの操作かいってくれないとあれなんだが
基本裏でうまいことバッファリングされてるのであまり気にしなくていいよ
でもそこそこまとまって読んだり書いたりする人が多いと思う
主観だけど
0985デフォルトの名無しさん
2010/09/05(日) 15:36:53ライブラリ内部の話なら、適当にブロック単位で読んで操作することが多い。
ユーザーコードの話なら、byte単位で処理できないと色々不便だ。
ブロック単位で処理するときは、文字列なら正則表現でばばっとやったりするが、バイナリだとそういう機構は自作だろう。
0986983
2010/09/05(日) 15:47:14100MBのファイルを1MB * 100個に分割したいんですね
それで、qt4のqfileってのを使おうと思っているわけですが
seek()の単位がバイトごと?なので
FILE構造体でも同じなのかな〜と思ったわけです
0987デフォルトの名無しさん
2010/09/05(日) 15:59:16stdioのFILEなら、一番単純な方法で、
FILE変数を2つ用意して一個を読み込みオープンしてもう一個を書き込みオープンして初期化する。
で、1mbのバイト配列を用意して、読み込み用からfreadでブロックで呼んで、書き込み用にfwriteでブロックを書き込む。
書き込み用をクローズして別名で再オープンして上記を繰り返せばいいと思う。
0989デフォルトの名無しさん
2010/09/05(日) 16:11:17ひょっとしてファイル操作とかでの最小単位の話をしてるんだろうか?
その手の扱いでバイト単位以外聞いたこと無いな
0990986
2010/09/05(日) 16:14:42もうっちょっと、自分で調べる事にする
レス数が950を超えています。1000を超えると書き込みができなくなります。