08/02/24 01:10:30
new/deleteを使うということは当然C++だよな?
じゃあ、なんでメモリ操作を隠蔽するクラスを作ろうとしないの?
IQ低いから?
525:デフォルトの名無しさん
08/02/24 01:10:53
>>522
みんなが何回も例を出しているのに・・・(T_T)
526:デフォルトの名無しさん
08/02/24 01:12:15
>>524
上のほうで最終的にCで書くと言っていたはず。
俺にはなんで今はnew[]使ってC++にするのか理解できないけど。
527:デフォルトの名無しさん
08/02/24 01:12:50
>>522
おまいがポインタについて知っている知識をすべて述べよ
528:デフォルトの名無しさん
08/02/24 01:12:53
>>522
何度か出てる正しく動く例が気に入らない理由はなぜかね
529:デフォルトの名無しさん
08/02/24 01:18:03
仮に、彼へC言語ポインタ完全制覇を与えたとしても、
それでわかってくれるかどうか不安になる。
530:デフォルトの名無しさん
08/02/24 01:19:41
>>522
皆が何言ってるかほとんど分からないC++素人だけど
一日ぐらい気分変えて犬の散歩にでも行ったら?
まあ、犬のウンコの処理しながら考えたりさ
その後で、また一から作ってみる
以外とできるかもよ
531:デフォルトの名無しさん
08/02/24 01:21:40
>>523
それだとうごきました サンクス
x.start = &p;
h(&x);
printf("%s", *x.start);
初めにメモリ上にchar*型が確保されないと受け取れないって事か
532:デフォルトの名無しさん
08/02/24 01:23:55
>>530
犬のウンコの処理を考えたり に見えて
delete unko;とか脳内で実行しそうになった
533:デフォルトの名無しさん
08/02/24 01:28:09
>>523
pを確保しなくても、これでもいいはずですよね
int main() {
bin x;
x.start = new char *;
h(&x);
printf("%s", *x.start);
}
534:デフォルトの名無しさん
08/02/24 01:28:52
newしたらdeleteしとけよ
535:デフォルトの名無しさん
08/02/24 01:35:57
>>533
newしたものはdeleteしないといけないのが面倒だから、
使わずに済むなら避けるべき。
536:デフォルトの名無しさん
08/02/24 01:48:50
だから、newを捨てるところからはじめろって。
537:デフォルトの名無しさん
08/02/24 01:53:19
C及びC++を使いゲームを作成された方へ質問です。
再帰関数って便利ですか?
もしよろしければ、メリットとデメリットを教えていただけないでしょうか?
自分の考えでは、 goto と同じ用に無理に使う必要はない機能だと思ってます。
538:デフォルトの名無しさん
08/02/24 01:54:37
再帰関数については色々思うところがあるのだが、ゲームを作っているわけではないからなぁ。
539:デフォルトの名無しさん
08/02/24 01:58:18
無理に使う必要は無いなぁ
メリットデメリットという問題でもない気がする
540:デフォルトの名無しさん
08/02/24 01:58:23
>>537
ポリゴン(ボーン)の操作で便利
でも、無理して使わなくてもおk
541:デフォルトの名無しさん
08/02/24 02:03:16
ボーン操作ってことは、データの読み込み時に便利ってことでしょうか?
542:デフォルトの名無しさん
08/02/24 02:09:18
【環境】 MS WinXP/gcc 3.4.4 on cygwin
【ソース】 URLリンク(kansai2channeler.hp.infoseek.co.jp)
【用途】 IRCクライアント(bot)
【起動方法】 $ ./a irc.tokyo.wide.ad.jp 6664
【動作の現状】
1.コマンドラインからサーバ名とポートを受け取り、ソケット作成、コネクション確立
2.サーバからのコネクションメッセージ受け取り
3.USER/NICKコマンドの送信
4.ウェルカムメッセージ、MOTDの受け取り
5.半角英数のチャンネル名へのJOIN ←ここで停止する
【質問】
・Telnetで同じように接続すると問題なく接続→終了することができる(ISO-2022-JPだから文字化けするが正常)
・送受信周りがかなりいい加減なのでJOIN出来ないのはそこに問題があるのではないか?
イレギュラーなことをやってますが、IRC板orスレというよりCネットワークプログラミング自体の問題かと考え
こちらに質問させていただきました。よろしくお願いいたします。
543:デフォルトの名無しさん
08/02/24 02:13:01
>>541
typedef struct _D3DXFRAME {
LPSTR Name;
D3DXMATRIX TransformationMatrix;
LPD3DXMESHCONTAINER pMeshContainer;
struct _D3DXFRAME *pFrameSibling;
struct _D3DXFRAME *pFrameFirstChild;
} D3DXFRAME, *LPD3DXFRAME;
座標系の上に座標系があって、
さらにその座標系の上に座標系が…
と繰り返すので、スタックを自前で管理するより
再帰処理にしたほうが楽というだけ
(体-上腕-腕-手-指 のように繋がっていくので)
544:デフォルトの名無しさん
08/02/24 02:17:35
>>542
カンなので外してたら無視してくれ
>for(i=0;i<=strlen(p);i++){
\0も送信してるが、いいのか?
i<strlen(p) なんじゃない?
545:デフォルトの名無しさん
08/02/24 02:37:36
>>543
for分で体のパーツ数回してデータを読み取ってるんですが、
今は無理してそれを崩してまで使う機能ではないってことですね。
よく機能を理解して使えば楽になる物、ということですね。
答えてくれた方ありがとうございました。
546:デフォルトの名無しさん
08/02/24 03:26:15
>>542
メッセージの終わりを\n → \r\n に変えてみたらいけるかも
547:デフォルトの名無しさん
08/02/24 03:33:50
>>530
俺はオナニーして発射した後、ティッシュで拭いてる時にコードが閃くよ。
548:546
08/02/24 03:56:01
あと、>>544と同じく\0の送信は不味いんでは?
\nでメッセージの終わりを判断してるとすると、サーバは次のメッセージの受信で
先頭に\0が入ってしまうんではないかと思う
(2回目のメッセージが、"\0JOIN #ircclidev\n"になるんじゃないかな)
549:デフォルトの名無しさん
08/02/24 04:06:10
>>544,>>548
i<strlen(p)で解決しました。初歩的ミスもいいところだ・・・。
もう一つ質問があるのですが、(どちらかというとこちらが本題ですが)
ISO-2022-JP(いわゆるJISコード)とShiftJISを相互変換するライブラリorサンプルを探しています。
検索してもなかなかしっくり来るものがなく、nkf経由だと上手くISO-2022-JPの制御コード
(KI/KO=0x1B 0x24 0x42/0x1B 0x28 0x42)を取ることが出来ません。
RFCには、特にマルチバイト環境の規定は定められていませんが、日本語IRCサーバは
ISO-2022-JPを使っているところが主流のようです。
550:デフォルトの名無しさん
08/02/24 04:12:53
>>542の修正版ソースです。一応日本語以外はちゃんと動く・・・はず
URLリンク(kansai2channeler.hp.infoseek.co.jp)
551:デフォルトの名無しさん
08/02/24 05:11:02
>>549
iconvじゃだめかい?
552:デフォルトの名無しさん
08/02/24 05:52:14
すんません。
VC++6.0からVisualStudio2008に移ったんですが、外観が変わりすぎててチンプンカンプン・・・
どこかVisualStudio2008 Exp の解説やってるページとかありませんか?
dllすら読み込めぬ・・・。orz
553:デフォルトの名無しさん
08/02/24 06:11:51
Visual Studio2008スレにGO
554:デフォルトの名無しさん
08/02/24 10:24:08
自分でクラスを定義するときに、ポインタに対する演算は、定義しなくてもよいのでしょうか?
つまり、ポインタでも、int*とか、char*とかの型がありますが、例えば
myclass*==int*
とかやるとコンパイルエラーになります。でも、myclass1*==myclass2*は、==演算子も
定義してないのに、コンパイルできるし、ちゃんと動きます。
これは、どういう理由でできるんですか?というか、ポインタの比較をする演算子って
どこで定義してるんでしょうか?
変な質問ですいません。
555:デフォルトの名無しさん
08/02/24 10:27:06
継承関係があるんじゃない?
556:デフォルトの名無しさん
08/02/24 10:54:10
>554
規格上で「できる」と決められている処理ははコンパイラが勝手に処理してくれる、というだけ。
myclass1*==myclass2* は >555 の言うとおり myclass1 と myclass2 に継承関係があるんだろう。
この場合、暗黙の型変換が発生して同じ型になり比較できる、と決まっている。
で、規格で決められている以上のポインタに対する演算を、自前で定義する必要があるケースはまずない。
557:デフォルトの名無しさん
08/02/24 10:55:39
>>554
違う型のポインタの比較はダメ
int* a;
double* b;
a == b
をやってみれば意味がわかるんじゃないかな?
558:デフォルトの名無しさん
08/02/24 12:50:04
C++で配列を関数の引数にできますか?
559:デフォルトの名無しさん
08/02/24 12:52:24
配列の参照か、配列のポインタか、配列要素のポインタならできます
配列自体は無理
560:デフォルトの名無しさん
08/02/24 12:52:27
ポインタじゃダメなのか?
561:デフォルトの名無しさん
08/02/24 12:53:21
>>558
できる
template <size_t n>
void func((&a)[n]) のように
562:デフォルトの名無しさん
08/02/24 12:53:39
型がねえ
563:デフォルトの名無しさん
08/02/24 12:58:42
すまん忘れた
564:デフォルトの名無しさん
08/02/24 13:14:21
>>559-563
ありがとうございます。
たしかにできませんでした。でも、
template <class T, int N>
int func(T a[N])
{
...
}
こういう様に書いても(func()の引数に&を付けても付けなくても)、aは参照扱いになるようです。
aに対して変更を加えると、func()の呼び出し側の元配列にも変更が反映されました。
565:デフォルトの名無しさん
08/02/24 13:20:12
そりゃaはポインタなんだから。
566:デフォルトの名無しさん
08/02/24 13:32:04
>>564
aは参照でなくてdecayされるからポインタだろ
567:デフォルトの名無しさん
08/02/24 13:36:59
>>565-566
そうか。ポインタですよね。
ポインタをコピーして、その先まで複製してくれるのはありえないですよね。
ありがとうございました。
568:デフォルトの名無しさん
08/02/24 13:50:24
構造体かクラスでラップしとけばいい。
boost::array を使うとか。
569:デフォルトの名無しさん
08/02/24 16:28:53
C++で乱数を扱う為のクラスとか関数はありますか?
rand/srand使うしかないですか?
rand/srand使うとしたら、シードによく現在時刻使いますが
現在時刻を取得する方法はtimeしかないですか?
++らしい方法があれば教えてください。
570:デフォルトの名無しさん
08/02/24 16:30:06
MT法のインラインアセンブラ版がどっかにころがってたきがする
571:デフォルトの名無しさん
08/02/24 16:31:57
boost使うか
URLリンク(www.math.sci.hiroshima-u.ac.jp)
ここから持っていけばいいんじゃね
572:デフォルトの名無しさん
08/02/24 16:32:08
>>569
Boost.Random
573:デフォルトの名無しさん
08/02/24 17:06:58
javascriptではalert("文字列"+123)
という風に文字列と数字を一緒にメッセージ表示出来ましたが、
C++で文字列と数字を一緒にメッセージ表示させるにはどうしたらいいでしょうか?
MessageBox(NULL, "文字列"+123, "test", NULL)
というのは出来ませんでした。
574:デフォルトの名無しさん
08/02/24 17:09:11
>>573
JavaScript同様、文字列を連結してから表示すればいい。
575:デフォルトの名無しさん
08/02/24 17:19:27
>>574
char msg[20] = "文字列";
char tmp[10];
itoa(123, tmp, 10);
strcat(msg, tmp);
MessageBox(NULL, msg, "test", NULL);
こんな感じですか?
メッセージ毎にこのコードを書くのも面倒臭いのと、
いつも "文字列"+数字 の組み合わせと言うわけでもなく
数字+"文字列"+数字+"文字列" という事もあるため
自作関数でmsgbox(char*, int){}という決め撃ちではやく、
文字列や数字を混同で表示できる方法はないかと考えています。
576:デフォルトの名無しさん
08/02/24 17:20:07
お願いします。C言語初心者なんですが、
ソース内に日本語を入れるとエラーになるんですが、
どこをどうすればいいのでしょうか?
超初心者です。よろしくお願いします。
577:デフォルトの名無しさん
08/02/24 17:21:41
× ああああ
○ //ああああ
578:デフォルトの名無しさん
08/02/24 17:22:14
ソースから日本語を消す
579:576
08/02/24 17:27:51
説明へたですいません。
/* hello02.c */
#include <stdio.h>
int main()
{
printf("今日はよい天気です。\n");
printf("明日もよい天気でしょう。 \n");
return 0;
}
これなんですけど…
580:デフォルトの名無しさん
08/02/24 17:30:51
>>576
どんなエラー?
581:デフォルトの名無しさん
08/02/24 17:34:42
>>570-572
ありがとうございます、Boost 試してみます。
手元の mingw にはなさそうなので、まずはgooって
Boost 環境揃えてみますね。
>>576
・ソースの文字コードを変えてみる
・処理系を変えてみる
582:576
08/02/24 17:36:23
本当にすいません。
普通に表示されました。
なんか間違ったやりかたしてたみたいです…
申し訳ないです。
583:デフォルトの名無しさん
08/02/24 17:41:12
>575
そのためのsprintf、とだけいっておくけど。
584:デフォルトの名無しさん
08/02/24 17:48:41
>>583
sprintfだとメッセージウィンドウは生成されないですよね?
外見としてはMessageBoxの中身に数字や文字列を表示している様な方法がいいんです。
585:デフォルトの名無しさん
08/02/24 17:54:21
sprintfのsは何の意味か知っているか、とだけ言っておくけど。
586:デフォルトの名無しさん
08/02/24 17:55:05
>>584
ならsprintfしてMessageboxにいれる処理の関数つくればよくね?
587:デフォルトの名無しさん
08/02/24 17:56:41
要はフォーマット→MessageBox()と
二段構えになるのが嫌、というだけの話とエスパー
vsprintf()使って自作ラッパー関数でも書くんだな
588:デフォルトの名無しさん
08/02/24 17:58:37
>>584
boost::lexical_cast
を使うと幸せになれると思う
589:デフォルトの名無しさん
08/02/24 18:04:51
>>585-588
失礼しました。printfと勘違いしてました。
sprintfだと文字列に格納できるんですね。
boostは自分にはまだ早そうなので(正規表現使えるのは魅力的ですが)、sprintfでやってみます。
ありがとうございました。
590:デフォルトの名無しさん
08/02/24 18:05:19
>>588
効率が悪いのが難点
591:デフォルトの名無しさん
08/02/24 18:07:23
>>588
俺も最初それ思いついたけど、連結する数値がたくさんあると見苦しくなるから
std::stringstreamに流し込んで取り出す方がいいんじゃないかなあ。
592:デフォルトの名無しさん
08/02/24 18:45:34
DLLの読み込みで、コンパイラによって失敗します
序数で指定しても動きません どのような理由でしょうか?
VC++だと動かないですが、BCCとDMCで動きます
593:デフォルトの名無しさん
08/02/24 18:47:43
HINSTANCE hd=LoadLibrary("*****.dll");
FN = (fnc) GetProcAddress(hd, (LPCSTR)4); //序数での指定
このような記述はWindowsXPなら万能ではないんでしょうか?
594:デフォルトの名無しさん
08/02/24 18:50:46
訂正
読み込みはしますが、実行時にエラーになります 序数がずれるのかも・・と思い全ての番号で試したのですがだめです
595:デフォルトの名無しさん
08/02/24 18:52:47
継承について教えてください
CFooから派生したCFooEx0、CFooEx1、CFooEx2、CFooEx3があるとします。
そして、それぞれCJissou0、CJissou1、CJissou2、CJissou3に派生してるとします。
その上、CJissou0、CJissou1はIHoge0を、CJissou2、CJissou3はIHoge1を実装しているとします。
図にするとこんな感じ。
CFoo─CFooEx0┬CJissou0
IHoge0┘
CFoo─CFooEx1┬CJissou1
IHoge0┘
CFoo─CFooEx2┬CJissou2
IHoge1┘
CFoo─CFooEx3┬CJissou3
IHoge1┘
CFooとCFooEx~は弄らないとして、IHoge~のインターフェイス関数をCJissou~に実装します。
で、マネージャー的な物例えば、std::vector<CFoo *> vecにそれぞれの実態を入れて、
CJissou~の関数を呼びたいのですが呼ぶ際には、
dyanamic_cast<CJissou0 *>(vec[0])->Test();見たいな事をしないといけないと思います。
でもそういう呼び出しだとIHoge~も意味が無くなってしまうし、数が多くなると厳しくなります。(IHoge~は数個)
だから、dyanamic_cast<IHoge0 *>(vec[0])->Test();//エラー
見たいな呼び方をしたいのですがどうすればいいのでしょうか?
596:デフォルトの名無しさん
08/02/24 18:59:37
>>595
そもそもそのような継承にしてる理由は?
597:デフォルトの名無しさん
08/02/24 18:59:59
>>595
CFoo のメンバ関数ならキャストは要らないはず。
IHoge~ に意味が無くなると言うが、こっちからしたら CFoo や vec の使い方も
ひっくるめて最初からその継承関係の意味がわからん。
598:595
08/02/24 19:06:57
えっと、まあ、CFooがMFCのCViewで、CFooEx~がCTreeViewとかCListViewなのでどうした物かと質問しました・・・。
599:デフォルトの名無しさん
08/02/24 19:10:28
なんでvector<IFoo>とかにしないわけ?
あるいは、virtual Test()をもつ何かインターフェースに。
600:デフォルトの名無しさん
08/02/24 19:18:44
CFooEx の状態で持てないのなら
ダウンキャストすることになるだろうな。
601:デフォルトの名無しさん
08/02/24 20:05:03
>>590
もう自前でパースしてるよ
602:592
08/02/24 20:05:24
最適化オプション関係でした
603:デフォルトの名無しさん
08/02/24 20:10:05
>>601
車輪の再発明
604:デフォルトの名無しさん
08/02/24 20:25:22
boostが?
605:デフォルトの名無しさん
08/02/24 20:29:54
ごめん勘違い
606:デフォルトの名無しさん
08/02/24 20:58:50
文字コード?jisコード?って覚えるべきもの?
607:デフォルトの名無しさん
08/02/24 21:06:12
必要になったときに表を見れば十分
608:デフォルトの名無しさん
08/02/24 21:06:13
>>606
全てのJIS漢字のJISコードなんて、そうそう覚えられるもんじゃないと思うが。
609:デフォルトの名無しさん
08/02/24 21:14:12
class Piyo{
~
};
class Hoge{
public:
void hoge(Piyo[][256]);
};
void Hoge::hoge(Piyo[][256] piyo){
~
}
こんな実装をした時に、Hoge::hogeのpiyoを書いておくと'Piyoは未定義のシンボル'と怒られてしまいます。
仮引数をPiyo[][256]だけにすればコンパイルは通りますが、どう使えというのか・・・といった感じです。
コンパイラはBCC5.5を使っています。クラスの2次元配列をできれば「参照」で渡したいのですが、
どうすればいいんでしょうか?
610:デフォルトの名無しさん
08/02/24 21:15:36
単に書き方がおかしいだけだ。
void Hoge::hoge(Piyo piyo[][256]) {
しかもこれいわゆる参照渡しの挙動をするが、
正確にはポインタ渡しだし。
611:609
08/02/24 21:29:18
うわ・・・。確かにおかしな書き方してた・・・。
自分でもドン引きです・・・。ありがとうございました
612:デフォルトの名無しさん
08/02/24 23:16:37
URLリンク(streaming.linux-magazin.de)
cmakeについてのリアルタイム講演が聞けるそうな
613:デフォルトの名無しさん
08/02/24 23:20:24
ReadFile(fp , &(buf[N]) , 1500 , &sz , NULL);
でエラーで止まります bufは十分にとってあります なぜでしょうか
614:デフォルトの名無しさん
08/02/24 23:24:57
>>613
bufの宣言がどうなっているかにも拠るが、&(buf[N])をbufにしてみろ。
それで巧くいくなら、お前は馬鹿だ。
615:デフォルトの名無しさん
08/02/24 23:31:32
位置を変えてループして読もうとしてるんです bufにすると上手くいきますが前のデータが消えます
原因不明ですが、変数の位置変えたらエラーでなくなり一応うごくようになりました
616:デフォルトの名無しさん
08/02/24 23:34:06
たまたま動いてるだけくさいな。
単純にバッファオーバーフローしてるだけじゃないのか?
617:デフォルトの名無しさん
08/02/24 23:36:56
メモリ関係のエラーみたいです また止まりました
別のところから変更しないと直りそうにありません
設計やり直してきます
618:デフォルトの名無しさん
08/02/24 23:48:58
coutやnewの多重定義ってどうやるのかわかりません できますか
619:デフォルトの名無しさん
08/02/24 23:51:19
>>613
char buf[NMAX*1500]
なら、&(buf[N*1500])
char buf[NMAX][1500];
なら、&(buf[N][0])
char *buf[NMAX]
for(...) buf[N] = malloc(sizeof(char) * 1500);
なら、buf[N]
620:デフォルトの名無しさん
08/02/24 23:52:38
cout の多重定義??
621:デフォルトの名無しさん
08/02/24 23:55:54
<<のオーバーロードに違いない
622:デフォルトの名無しさん
08/02/24 23:56:41
ostream& operator<<(ostream& ostr, const Hoge& hoge) {
ostr << hoge.str();
}
みたいなやつか。
623:デフォルトの名無しさん
08/02/25 00:07:21
stringは連続していますか? memcpyとかはできますか?
624:デフォルトの名無しさん
08/02/25 00:08:24
なんでstringにmemcpyしたがる人が多いんだろう。
625:デフォルトの名無しさん
08/02/25 00:09:43
stringにmemcpyはまずいんじゃね
626:デフォルトの名無しさん
08/02/25 00:10:45
string s="9999999999";
strcpy( &s[5], "000");
は正しいですか
627:デフォルトの名無しさん
08/02/25 00:14:03
詳しいことわすれたけど、s[i]で文字を取得できるならできるんじゃね?
やった後、stringオブジェクトは壊れるとおもうけど
628:デフォルトの名無しさん
08/02/25 00:15:06
この日本語不自由そうなとこが同一人物くさい
629:デフォルトの名無しさん
08/02/25 00:15:58
>>623
規格ではそんな保障はされていません。
630:デフォルトの名無しさん
08/02/25 00:17:13
>>627
あっ嘘、s[i]で取得できてもできないと思う
置き換えたいなら、replaceを使いなさい
631:デフォルトの名無しさん
08/02/25 00:17:23
>626
std::stringのことなら、正しくない。
632:デフォルトの名無しさん
08/02/25 00:21:59
これが動くのですが、stringはchar*の拡張であることは保証されていませんか?だめな例はありますか
int main(){
string str="9999999999";
char *pointer=&str[5];
memcpy( pointer, "000", 3);
str+=(string)"add";
cout<<str;
return 0;}
633:デフォルトの名無しさん
08/02/25 00:25:35
stringの制御情報はどこへ格納されていますか?
ユーザーは合法的でない方法を使ってもアクセスできませんか?
634:デフォルトの名無しさん
08/02/25 00:28:12
>632
必要のないポインタ操作はやめましょう。
動くか動かないかがプログラムの正しさの判定基準ではありません。
635:デフォルトの名無しさん
08/02/25 00:28:47
>>632
あるコンパイラのあるバージョンで動くとしても、規格で保証されていなければ、
他のコンパイラや同じコンパイラの別バージョンでは動かないかもしれない。
それでもいいなら、どうぞ?
今後ずっと同じコンパイラを使い続けて、決して変えないのなら、たぶん問題ないだろう
636:デフォルトの名無しさん
08/02/25 00:30:23
>>633
なんのためのクラスだと思う?
637:デフォルトの名無しさん
08/02/25 01:00:06
例外の使い方について
エラーの通知にはエラーメッセージより例外を使う方がいいと聞いたのですが
オリジナルな例外クラスを投げたり、charを投げまくる仕様にしていいのですか?
例外というと、これ以上の実行に支障が出るときに使うようなイメージがあるのですが実際の現場ではどうなのでしょうか?
638:デフォルトの名無しさん
08/02/25 01:01:51
例外処理を主要処理に書くと遅くなったりしませんか?
639:デフォルトの名無しさん
08/02/25 01:14:59
コンパイラによって例外処理用のコードが追加されるから
パフォーマンスは落ちる。禁止オプションもあるくらいだからな。
特に組み込みでは。。。。。。
640:デフォルトの名無しさん
08/02/25 01:17:11
クラスメンバー変数は、自動で0やNULLで初期化されますか?
641:デフォルトの名無しさん
08/02/25 01:20:04
>>637
好きなように使え。
ただ、エラーメッセージと例外では通知する相手が違うぞ。
エラーメッセージはエンドユーザ、例外はプログラマに通知するもんだ。
ユーザがいきなり「0x00d2345でlogic_error例外が発生しました」とか見せられても訳わからんだろ。
charも投げられるが、標準との整合を考えて投げるのはオリジナルも含めてstd::exception派生のクラスにしとけ。
642:デフォルトの名無しさん
08/02/25 01:21:41
>>640
static領域に配置したオブジェクトのメンバなら、コンストラクタで何もしていなければ0になります。
それ以外は不定です。
643:デフォルトの名無しさん
08/02/25 01:29:37
static つけたらクラスが消滅しても値が残るんですか?
クラスが消滅したらアクセスできなくなると思いますが
つけなくても自動でstaticになりますか
644:デフォルトの名無しさん
08/02/25 01:50:30
>>641
なるほど・・・
戻り値でエラーを知らせたり、NULLを返したりという方法もあるのでどういう方法が主流なのかなと思ってまして
自分はたいていの場合
何が起こったのか確認して、何事もなかったかのように受け流してさいごにエラーログを確認する
位のデバッグライト的な使いか確かしてないのですが・・・
645:デフォルトの名無しさん
08/02/25 01:59:21
>>644
どれが主流というのは無い。場面によって適切な方法があるだけ。
ライブラリとか、設計思想によりエラーの返し方がある程度統一されてたりすることもあるけどね。
とにかく作ってみなさい。できたものを自分なりに分析して、ここはこうした方がよかったとか、省みることで成長するんだから。
646:デフォルトの名無しさん
08/02/25 02:09:23
>>643
残ります、というかクラスを複数生成しても全部同じstaticメンバ変数をさすんですよ?
三行目がいまいちなに言ってるのかわからんstaticつけないとstaticにはならないよ
647:デフォルトの名無しさん
08/02/25 02:12:48
まずインスタンスという言葉を覚えようや
648:デフォルトの名無しさん
08/02/25 02:13:09
>>643
>static つけたらクラスが消滅しても値が残るんですか?
(クラスではなくインスタンスのことを言いたいのだと思うが…)
staticで宣言した変数は、main関数の開始前から終了後まで存在する。
破棄されるのがmain関数終了後だから通常はそれへのアクセスが問題になることはないが、
staticの変数が異なるファイルで定義されて、一方のデストラクタからもう一方を参照するような
処理があるとまずい。
意味が分からないようなら気にしなくていい。
>つけなくても自動でstaticになりますか
ならない。
649:648
08/02/25 02:14:21
ちょっと訂正
×staticの変数が
○2つのstaticの変数が
650:デフォルトの名無しさん
08/02/25 02:24:32
質問があるのですが、
include " "
include < >
" ", < > の違いを教えて頂けませんか?
651:デフォルトの名無しさん
08/02/25 02:30:32
>>650
コンパイラのマニュアルか入門書を読みなさい。
652:デフォルトの名無しさん
08/02/25 02:47:52
>>650
URLリンク(www.google.co.jp)
上から順に読んでいけばそのうち解説してるサイトにたどり着く
653:デフォルトの名無しさん
08/02/25 07:25:36
>>632
std::string の内部バッファの連続性は次の規格で保証されるようになる。
おそらく現状全ての実装でそうなっていることが、その規格変更を実現したんだろう。
だから一応そう言うことをしても問題は無いはずだが、
メンバ関数でできることはメンバ関数でやった方がいい。
replace 使うといい。
654:デフォルトの名無しさん
08/02/25 09:45:12
例外ねぇ、何も考えずにint型のエラーコードを投げちゃうなぁ
返り値でエラーコード返しちゃうと返り値の型が拘束されちゃうしメンドクサ
結局こういう使い方だと例外のありがたみを半分も得ていない気がする
655:デフォルトの名無しさん
08/02/25 10:00:21
例外はstd::exceptionみたいな基本クラスを決めとかないと
ありがたみが半減する。
656:デフォルトの名無しさん
08/02/25 11:44:36
ガベージコレクションは、標準のC++でつくれますか?ライブラリでは動作するのか不安です
自作したいです
あと、整数変数は、初期化なしでアクセスしてもエラーは出ませんか?
657:デフォルトの名無しさん
08/02/25 11:46:47
素人が自作した方が不安だと思うんだが
658:デフォルトの名無しさん
08/02/25 12:00:29
これ動かすとクラス変数は値がほぼ一定ですが理由はなぜですか?
#include <iostream>
using namespace std;
class cl{public: int i; cl(){cout<<"class "<<i;} };
int main(){
int n, a[100];
for(n=0; n<100; n++){
cl *x=new cl;
cout<<" arrey "<<a[n]<<"\n";
}
getchar();
}
659:デフォルトの名無しさん
08/02/25 12:09:11
動的確保による違いでした たぶんヒープ領域は値があまり変化しないことが原因かも・・・
#include <iostream>
using namespace std;
class cl{public: int i; };
int main(){
int n, a[100] ;
cl x[100];
for(n=0; n<10; n++){
cout<<"class="<<x[n].i<<" arrey="<<a[n]<<endl;
}
getchar();
}
660:デフォルトの名無しさん
08/02/25 12:12:41
>>656
整数変数を初期化しなくてもエラーは出ませんが、ローカルな場合に不定値なので初期化しましょう。
661:デフォルトの名無しさん
08/02/25 12:37:27
定数文字列は値渡しにして、動的な文字列は参照渡しにしたいのですが、これだとメモリリークしますよね
どうやれば直りますか?
#include <iostream>
using namespace std;
class cl{
char *str;
public:
cl(char* const& x){ str=x; }
template <size_t n> cl(char (&x)[n]) {
str=new char[n]; strcpy(str,x);}
};
main(){
cl str="rrrr";
str="oooo";
getchar();
}
662:デフォルトの名無しさん
08/02/25 12:42:21
値渡しされているかフラグを作って、されていれば解放する様にすればいいのですが、
初期化前にコンストラクタで代入されてしまうとフラグが確認できません
663:デフォルトの名無しさん
08/02/25 12:47:11
>>661は間違えました 定数式が期待する方へ行っていませんでした それもどうやれば直りますか
664:デフォルトの名無しさん
08/02/25 12:56:55
>>661
やりたいことがよくわからん。せめて、コンパイルできるソース(の断片)を貼ってくれ。
665:デフォルトの名無しさん
08/02/25 13:00:43
まとめるとテンプレート関数で、
定数文字列" "と
固定文字列char [n]と
可変文字列char *を
区別して、上の二つならメモリを確保して値渡しにしたいんです
値を書き換えたいため
666:デフォルトの名無しさん
08/02/25 13:01:40
最近ずっとこいつ出没してるな
667:デフォルトの名無しさん
08/02/25 13:02:01
それと、新たにメモリを確保するときに、以前確保したメモリを解放してメモリリークしないようにしたいです
668:デフォルトの名無しさん
08/02/25 13:06:38
>>667
要は、const char *でコンストラクトするときはメモリを確保して、char *でコンストラクトするときは確保しなければ委員でね?
それと、書き換えのときはconst char *でもchar *でも以前の状態に応じて解放しないといけないんでね?
669:デフォルトの名無しさん
08/02/25 13:07:20
簡略化すると関数の引数で、" "型と、char[]型と、char*型を区別したいって事です
670:デフォルトの名無しさん
08/02/25 13:17:48
>>668
constつけるだけでは無理です
#include <iostream>
using namespace std;
class cl{
char *str;
public:
cl(char const *x) { cout<<"文字列は定数です\n"; }
cl(char *x){ cout<<"文字列は可変長です\n"; }
};
main(){
cl str="xxx"; //定数で初期化
char ch[]="yyy"; str=ch; //固定配列の代入
str="zzz"; //定数の代入
getchar();
}
671:デフォルトの名無しさん
08/02/25 13:19:34
すまん、そもそも char ch[] = "yyy"は固定長でも書き換え可能な配列なんだが
それを定数として扱ってはいけない理由を教えてくれ。
672:デフォルトの名無しさん
08/02/25 13:22:36
あ、聞き方が変だ。
char ch[] = "yyy"は書き換え可能なんだから可変長と同一視すればいいし
const char ch[] = "zzz"は書き換え不可能なんだから定数と同一視すればいいのでは?
673:デフォルトの名無しさん
08/02/25 13:22:41
可変長文字列と {定数文字列、固定長文字列} ( ← 一緒でいいです)
を分類する方法教えてください
あと、すでにメモリが確保してあればそれを解放する方法教えてください
674:デフォルトの名無しさん
08/02/25 13:23:36
長さも書き換えられないといけません
675:デフォルトの名無しさん
08/02/25 13:24:19
こいつ日本人なのかなぁ
676:デフォルトの名無しさん
08/02/25 13:26:00
>あと、すでにメモリが確保してあればそれを解放する方法教えてください
これは簡単。コンストラクト時にメモリを確保したらフラグをセットしておいて、代入オペレータでそれをチェックすればいい。
勿論、代入オペレータも2種類用意して必要ならフラグをセットするのは当然として。
そのフラグはいずれにしてもデストラクト時に必要にナル死ね。
677:デフォルトの名無しさん
08/02/25 13:28:05
あー、ローカルな配列だとコンストラクト時にフラグが立ったら問題か。
ここは一つ、char配列は渡さないと言う運用でw
678:デフォルトの名無しさん
08/02/25 13:28:42
で、この馬鹿はなんで目的を説明できないんだろうなぁ。>675ってことなんだろうか。
679:デフォルトの名無しさん
08/02/25 13:43:23
目的は、参照渡しのできるstringを作りたいんです
現存するやつは値渡しです
680:デフォルトの名無しさん
08/02/25 13:45:33
いやだから、それを(態々)作る目的を聞いているのだが。
681:デフォルトの名無しさん
08/02/25 13:46:27
チャットじゃないんだから要旨をまとめてから書き込め。
682:デフォルトの名無しさん
08/02/25 13:46:53
>>676
クラスの確保と同時に代入されてしまうと、フラグが設定されていないので動作不明になりませんか?
683:デフォルトの名無しさん
08/02/25 13:50:39
>>681
可変長文字列は参照渡しにして、それ以外は値渡しにして、新たな文字列が渡されたら以前のを解放したいんです
684:デフォルトの名無しさん
08/02/25 13:52:58
>>683
>680
685:デフォルトの名無しさん
08/02/25 13:53:25
伸びてると思ったら、また例の日本語が不自由なヤツが現れたのか
686:デフォルトの名無しさん
08/02/25 13:56:58
何をしたいかと言うと
(バイナリ) 文字列 str , p , qに対して
replace(str, p, q) strの全文でpをqに置換する
という関数を作りたいんです
687:デフォルトの名無しさん
08/02/25 14:03:08
>>665
それぞれの型の応じて関数を振り分ければいいのか?
template<size_t N>
void g(const char (&a)[N]) {
cout << typeid(a).name() << endl;
}
template<size_t N>
void g(char (&a)[N]) {
cout << typeid(a).name() << endl;
}
void g(char *&p)
{
cout << typeid(p).name() << endl;
}
template<typename T>
void f(T& t)
{
g(t);
}
688:デフォルトの名無しさん
08/02/25 14:03:31
//テスト
int main()
{
f("abc");
char a[5];
f(a);
char *p;
f(p);
}
689:デフォルトの名無しさん
08/02/25 14:08:07
ぜんぶcです・・・・
#include <iostream>
#include<typeinfo>
using namespace std;
template<size_t N> void g(const char (&a)[N]) { cout << "a" << endl;}
template<size_t N> void g(char (&a)[N]) { cout << "b" << endl; }
void g(char *&p){ cout << "c" << endl; }
template<typename T> void f(T& t) { g(t); }
int main() {
f("abc");
char a[5]; f(a);
char *p; f(p);
}
690:デフォルトの名無しさん
08/02/25 14:12:45
>>689
そりゃコンパイラがだめなんだろうな。
g++ 4.2.3だとa b cになる。
691:デフォルトの名無しさん
08/02/25 14:12:57
>>686
これでいいのか?
#include <string>
#include <iostream>
using namespace std;
void replace(string& str, string p, string q)
{
int i = str.find(p);
while (i >= 0) {
str.replace(i, p.length(), q);
i = str.find(p, i + q.length());
}
}
int main()
{
string str = "abcdabcd";
replace(str, "bc", "BC");
cout << str << endl;
}
692:デフォルトの名無しさん
08/02/25 14:17:34
>>686
俺だったら、次のどっちかにする。だから、673のようなことをしたくなる理由が理解できない。
1. strは全く書き換えず、置換後の文字列は新しく確保したメモリに書き込んで戻り値に返す。
2. strは書き換えできるという前提でstrを書き換える。(書き換えできない
文字列をstrに渡したければ、書き換え可能な場所へコピーを作ってそれを渡す)
693:デフォルトの名無しさん
08/02/25 14:25:43
STR str="hogehogehogehogehoge"
replace(str, "geho", "(^_^)"); や、
int N=300*1024*1024;
char *ch=new char [N];
for(int n=0;n<N;n++)ch[n]=n; //巨大なバイナリ配列
STR str(ch,N);
replace(str, "geho", "(^_^)");
がしたいんです
694:デフォルトの名無しさん
08/02/25 14:29:10
巨大な配列を扱おうとすると、元のデータをコピーしたり、返却時に新規確保すると、
もとのデータと併せて領域が2倍必要になりますしコピー時間がかかります
>>691 バリナリデータも扱いたいです
695:デフォルトの名無しさん
08/02/25 14:32:38
>>693
できるぞ
>>694
バイナリデータも問題ない
#include <string>
#include <iostream>
using namespace std;
void replace(string& str, string p, string q)
{
int i = str.find(p);
while (i >= 0) {
str.replace(i, p.length(), q);
i = str.find(p, i + q.length());
}
}
int main()
{
string str="hogehogehogehogehoge";
replace(str, "geho", "(^_^)");
cout << str << endl;
int N=300*1024*1024;
char *ch=new char [N];
for(int n=0;n<N;n++)ch[n]=n; //巨大なバイナリ配列
string str2(ch,N);
replace(str2, "geho", "(^_^)");
cout << str2 << endl;
}
696:デフォルトの名無しさん
08/02/25 14:32:39
C++
開発環境 CentOS
コンパイラ g++
関数書き出しプログラムが機能せず。
どうしてでしょうか。
#include <iostream>
#include <fstream>
#include <cstring>
#include <string>
#define buffer_size 1000
using namespace std;
int main(int argc,char *argv[]){
string buffer;
int count=0;
char *p;
ifstream fin(argv[1]);
if(!fin)return 0;
while(fin>>buffer){
while(count!=1){
if((p=strchr(buffer.c_str(),'{'))!=NULL){
count++;
cout<<buffer;
}
}
while(count!=0){
if((p=strchr(buffer.c_str(),'{'))!=NULL)count++;
else if((p=strchr(buffer.c_str(),'}'))!=NULL)count--;
}
}
fin.close();
return 0;
}
697:デフォルトの名無しさん
08/02/25 14:35:18
>>694
置換前より後の文字列のほうが長い場合、
単純にその場で書き換えていくと、1ヶ所置換が行われる度に
置換部分以降をずらしたり、時にメモリの伸張をしたりで時間がかかる。
最近のOSはメモリの扱いも上手になっているし、
そもそもPCのメモリ搭載量も大きくなっているから、
新しいメモリに書き込んでいくも選択肢として捨てたものではない。
698:デフォルトの名無しさん
08/02/25 14:38:10
>>689
VC++ 2008でしか試してない。オーバーロード解決は規格に従って
いるんだが。コンパイラがテンプレート規則に対応していないのかね。
699:デフォルトの名無しさん
08/02/25 14:48:28
>>695 >>697
stringにコピーするのが一番なんですかね?
関数で作業領域を確保しようとするので 初めの3倍必要になります
コピー無しなら2倍ですみます 300メガとかだと動作に支障出ないですかね・・
>>698
うちのコンパイラだと全滅しました MinGWの最新版 、DMC、VC++6.0、bcc5.5.1
700:デフォルトの名無しさん
08/02/25 14:51:46
>>692
2番の方向で行こうとしているところだったんです
定数なら書き換え可能な領域を確保しようとしたら、その判別がコンパイラでできないのでここで質問していたんです
701:デフォルトの名無しさん
08/02/25 14:51:46
>>699
new char[]せずに最初からstringの中にデータを作ればコピーを減らせる
int N=300*1024*1024;
string str2;
str2.resize(N);
for(int n=0;n<N;n++)str2[n]=n; //巨大なバイナリ配列
replace(str2, "geho", "(^_^)");
702:デフォルトの名無しさん
08/02/25 14:57:26
わかりました
stringに直接挿入する方向で行こうと思います
巨大な入力があるのはファイルからなので、自作して直接stringに入れるようにします
703:デフォルトの名無しさん
08/02/25 15:00:35
>>699
>コピー無しなら2倍ですみます 300メガとかだと動作に支障出ないですかね・・
stringの操作云々よりも、その情報量をどう扱うかと言うアルゴリズムの方が問題になりそうな希ガス。
少なくとも、GiBオーダ未満のメモリくらい今時普通に扱えるよ。
>>696
どう、機能していないのさ。
704:デフォルトの名無しさん
08/02/25 15:01:19
ちゃんと目的を説明すれば、妥当な回答が手早く得られると言う好例だな。
705:692
08/02/25 15:03:09
>>700
俺の場合、その判別は自分でやる。
必要なら自分でメモリ確保してmemcpyか何かでコピーしてから置換する関数へ渡すと言うこと。
メモリ確保その他をstringに任せているという点が違うけど、695案と同系統のアイデア。
706:デフォルトの名無しさん
08/02/25 15:04:31
>>696
関数突入を探すwhileの条件がcount != 1だから、関数突入後に中括弧を見つけるとcountが2になって脱出できなくなる罠。
707:デフォルトの名無しさん
08/02/25 15:10:50
>>696
>706に加えて、内側のwhileは両方ともifでいいだろよ。
つまり、最初のwhileは if (count == 0)で、次のwhileはif (count > 0)。
んで、fin >> bufferだと単語単位でしか入力できないから工夫が必要。
# 行単位入力すればいいのかな? 仕様がわからんからなんとも言えんが。
708:デフォルトの名無しさん
08/02/25 15:13:01
初めはC言語のみで、作成しようとして最後まで作ったのですが
ポインタのポインタとかやっているうちに動かない場合があることに気づき修復不可能になりました
そしてC++で参照や型判定して作ろうとしたらこれも上手くいきませんでした
簡明なプログラムが大事ですね
709:デフォルトの名無しさん
08/02/25 15:20:04
ここできいたのを参考に変換関数を作ってたのですが、そしたら全体がややこしくなり回復無理になりました
#define strconv(q, p) _memconv(&q, &p, strlen(p))
#define memconv(q, p, n) _memconv(&q, &p, n)
#define strconstconv(q, p) _strconstconv(&q, p)
_memconv(strdata *q, char **p, int n){
char **chend =(char **)malloc(sizeof(char **));
q->start=p; *chend=&(*p)[n]; q->end = &(*chend);}
710:デフォルトの名無しさん
08/02/25 15:52:07
>>708,709
無理して難しく書いても、あとあとメンテナンスやデバッグのことを考えると、シンプルに書いた方がいい場合が多い
メモリを何MBか余計に使ったり、実行時間が何分か伸びたところで、なんだというんだ
ややこしいコードは書くのもデバッグも何日もかかる
それだけの価値があればやってもいいが、たいていは割に合わない
711:デフォルトの名無しさん
08/02/25 17:21:33
やさしいC++買って来た。
一日でマスターするのは無理なのかなぁ・・・
712:デフォルトの名無しさん
08/02/25 17:26:04
一週間くらいは覚悟しないといかんね
713:デフォルトの名無しさん
08/02/25 17:39:36
一年ぐらいは(ry
とか言いたいけど最低10年とかいう意見もあるし
やね某が何年か前に提唱した半年ぐらいで勘弁しておいてやろう
714:デフォルトの名無しさん
08/02/25 18:04:09
質問ですが、stringの+は、\0を特別視しませんよね?
"aa\0aa" + "bbbbb"はどのコンパイラでも、
"aa\0aabbbbb"ですよね?
715:デフォルトの名無しさん
08/02/25 18:38:41
いつからCは+演算子で文字連結できるようになったんだ
716:デフォルトの名無しさん
08/02/25 18:39:19
stringと書いてあるだろうがアホ
717:デフォルトの名無しさん
08/02/25 18:43:10
>>716
>>714はC++でもNGだろ。C文字列同士だぞ。
718:デフォルトの名無しさん
08/02/25 18:45:36
そこは中身がそうなっているstringインスタンスだと解釈してやろうぜ。
719:デフォルトの名無しさん
08/02/25 18:48:48
質問者はそういう中身のstringを造ろうとしてそこでつまりそうだが
720:デフォルトの名無しさん
08/02/25 19:21:16
>>718
アイアイ
721:デフォルトの名無しさん
08/02/25 19:30:23
std::auto_ptrって、ブロックを出ると自動的に開放されるポインタですよね?
これって、AUTO変数と比べてより便利な点ってあるのでしょうか?
722:デフォルトの名無しさん
08/02/25 19:36:53
×ブロックを出ると自動的に開放
○std::auto_ptrが破棄されたときインスタンスも自動的に開放
723:デフォルトの名無しさん
08/02/25 19:37:01
>>721
・スタックに置くには適さない巨大なデータも置ける
・最初はNULLにしておいて必要になってからnewできる
・ブロックを出るまで待たなくても好きなタイミングで削除できる
・releaseで手放せばブロックを出ても削除しないことも出来る
724:デフォルトの名無しさん
08/02/25 19:39:10
関数の戻り値にも使えるはず。
725:デフォルトの名無しさん
08/02/25 19:41:51
using namespace std;
string func1() {
string s = "Hello";
return s;
}
void func2(string s) {
cout << s << endl;
}
int main() {
func2(func1());
}
この渡し方って解放されなかったり破壊されたりしますか?
処理系によりけりですか?
726:デフォルトの名無しさん
08/02/25 19:43:39
>>725
しません。
どの処理系でも平気。
727:デフォルトの名無しさん
08/02/25 19:59:12
>>722-724
ありがとうです。
ところで、testは適当なクラスとして、
int main()
{
std::auto_ptr<test> tp(new test);
tp.release();
return 0;
}
とすると、メモリリークが検出されてしまうのですが、tp.release()をしないようにすると
大丈夫でした。これってrelease()の使い方が間違ってますか?
あと、最初にauto_ptr<test>だけ宣言しておいて、途中でnew testする方法もわかりません。
もうちょっとだけ教えてくださいな。
728:デフォルトの名無しさん
08/02/25 20:05:08
releaseは、以後、自分でメモリ管理するからauto_ptrはdeleteするなというもの。
729:デフォルトの名無しさん
08/02/25 20:14:08
>>728
最初は、
std::auto_ptr<test> tp(new test);
tp.release();
test* tp2 = tp.get();
delete tp2;
としていたのですが、以下のようにしなければならないということですね。
std::auto_ptr<test> tp(new test);
delete tp.release();
ありがとうございました。
730:デフォルトの名無しさん
08/02/25 20:27:13
>>729
tp.reset();
731:デフォルトの名無しさん
08/02/25 20:44:23
resetはVC6のauto_ptrには無いとか言い出すぜきっと。
732:デフォルトの名無しさん
08/02/25 20:52:38
resetもしないでデストラクタに任せればいい場面にまで
729のようなことをしていないか不安。
733:デフォルトの名無しさん
08/02/25 20:58:49
設計について色々調べていると(デザインパターン等々)これ無駄じゃね?みたいな部分に多々遭遇します
例えばコンストラクタとデストラクタで確保&解放を行う為に全体をそれに合わせたり
それの為にメソッドやクラスを用意したり等々
確かに見通しもよくなりますし、わかりやすくなるとは思うのですが、
それらを犠牲にすれば短く出来たりオーバーヘッドを減らせたり出来るんじゃないか?と考えてしまいます
つまりコード全体の見易さ、転じてメンテナンスが容易になるなどのメリットと
速度を犠牲にするというデメリットがあると思います
とはいえ後者は今時気にするほどでもなく、詳しくないのですがここを気にするのは組み込み系と呼ばれる分野くらいなのかなとも思います
実際はやはり見易さ等を気にした手法(なんていうんだろう?)を用いて設計を行うべきなんでしょうか?
うまく表現できなく、長くなってしまってすみません
734:デフォルトの名無しさん
08/02/25 21:01:16
Visual Studioって 何処にヘッダファイル置けば
735:デフォルトの名無しさん
08/02/25 21:04:18
Visual Studioって 何処にヘッダファイル置けば
フルパス指定しなくて読み込めるんですか?
C:\Program Files\Microsoft Visual Studio 8\VC\include
でOK?
736:デフォルトの名無しさん
08/02/25 21:06:29
>>735
ソースファイルと同じ場所なら
#include"hoge.h"
でおk
737:デフォルトの名無しさん
08/02/25 21:09:06
>>733
大丈夫
君よりコンパイラのほうが賢いから
738:デフォルトの名無しさん
08/02/25 21:09:18
速度犠牲とか偉そうに言うやつほど、ダメなプログラマ
739:デフォルトの名無しさん
08/02/25 21:10:01
普通の初心者質問には答えないんだなぁ
740:デフォルトの名無しさん
08/02/25 21:11:48
本当に遅くなることばかりじゃないしな。
std::sort が qsort より概して速くなる、というみたいに、
インライン化されると問題ないことも多い。
741:デフォルトの名無しさん
08/02/25 21:14:36
>>738
色んな分野があるって前提で考えてるんだろう?
お前は組み込み系とビジネスソフト開発が同じだと思っているのか?
それにプログラミングしてればみんなプログラマって思考が気持ち悪い
お前見たいのは答える側に回るな
742:デフォルトの名無しさん
08/02/25 21:14:59
プログラマではないです、ただいろんな分野があってそれに合ったプログラミングがあることくらいはわかっています
でもやっぱり速度は気にしちゃいけないところですか、無駄だと思ってしまうところから直す必要がありそうですね
コンパイラの最適化というのも知らない分野ですし、当分は見通しの良いプログラムを目指してみようと思います
743:デフォルトの名無しさん
08/02/25 21:18:54
まず動くプログラムを書く。
そして遅ければ改善する。
この順だな。
744:696
08/02/25 21:19:34
696です。
先ほどのプログラムを訂正したら、
一行ほどしか出力されませんでした。
どこが間違っているのでしょうか。
URLリンク(www.borujoa.org)
745:デフォルトの名無しさん
08/02/25 21:26:58
これをちょっと弄って横長から縦長にしたいのですが、
いまいち組み方がわかりません。環境はLinuxでコンパイラはgccです。
#includeは省略
#define max 50
using namespace std;
class hist{
private:
string buffer;
int count;
int mat[max],i,j;
public:
int func(char *argv[]);};
int hist::func(char *argv[]){
ifstream fin(argv[1]);
if(!fin)return 0;
for(i=0;i<max;i++)mat[i]=0;
while(fin>>buffer){
count=strlen(buffer.c_str());
for(i=1;i<max;i++){
if(i==count)mat[i]=mat[i]+1; }
}
for(i=1;i<max;i++){
cout<<i;
for(j=0;j<mat[i];j++)cout<<"*";
cout<<'\n'; }
return 0;}
int main(int argc,char *argv[]){
hist hoge;
hoge.func(argv);
return 0;
}
746:696
08/02/25 21:28:43
すみません、あげるの忘れてました。
どなたか教えてください。
747:デフォルトの名無しさん
08/02/25 21:32:49
GNU global使えていう話じゃなくて?
748:744
08/02/25 21:37:58
>>747
そんなソフトがあったんですかw
ありがとうございます。
しかしそれではコーディングトレーニングにならないので、
ソースコードでよろしくお願いいたします。
どう考えてもイメージがわかないもので質問した次第です。
749:デフォルトの名無しさん
08/02/25 21:44:30
はじめまして
C++でプログラミングをしようと思っているのですが
開発環境等をどうしようか迷っています
将来的には
■ゲームを動かすプログラム(同人やエロゲのアプリ程度)
■補助ソフトやパッチ
■データを暗号化して格納するプログラム
等を作りたいと思っています
何かアドバイスがあればお願いします
750:デフォルトの名無しさん
08/02/25 21:45:47
VC++ でいいっしょ
タダだし
751:744
08/02/25 21:48:04
>>749
「C++の勉強したいんだがどの本買って勉強したらいいんですか?」
って聞いてるのと一緒だべ?
752:デフォルトの名無しさん
08/02/25 21:50:19
デザインパターン信者
私にもそんな時期がありました(マジで)
753:デフォルトの名無しさん
08/02/25 21:51:50
80:20の原則があるしな。経験つめばどこがホットスポットなのかが見当つくから、
プロファイルとってそこだけしぼって最適化すればいい。
最初から保守性犠牲にしてまでパフォーマンスチューニングが必要な分野って
限られてると思うよ。
754:デフォルトの名無しさん
08/02/25 21:55:02
>>749
今からC++勉強するよりもおまいは吉里吉里勉強したほうが幸せになれると思う
755:744
08/02/25 22:06:01
マイヘッドがクラッシュしてしまいそうなんですが、
エニバディー、ティーチ ミーしてくれませんか?
756:デフォルトの名無しさん
08/02/25 22:16:44
>>752
理解できずに挫折したか。
757:デフォルトの名無しさん
08/02/25 22:16:59
トオルさん帰れよ
758:デフォルトの名無しさん
08/02/25 22:18:58
>>744
関係はないが、とりあえずバッファを buffer_size しか確保してないのに
fgets で filesize 読もうとしてるのはヤバい。
759:デフォルトの名無しさん
08/02/25 22:28:27
>>744
else if(count > 0)
760:744
08/02/25 22:29:05
>>758
bufferはstring型でいこうとおもったんですが、
fin>>buffer;でやると、単語読み込みで一行読み込みにはならないし、
fgets(buffer.c_str(),filesize,fin);はコンパイラに怒られるし、
どうしようもないんで駆け込み寺としてここにきました。
たぶんこれも慣れた人なら簡単に直せるんだとは思いますが、
いままでC言語ばっかりやってたもんで、変な癖ついてるんです。
761:デフォルトの名無しさん
08/02/25 22:30:58
getline を知らんのか?
762:744
08/02/25 22:32:36
>>761
K&Rにも載ってたんで知ってます。
763:デフォルトの名無しさん
08/02/25 22:32:53
>744
よくわからんが、
一行よむなら、std::.getline( fin, buffer );だが。むろん、finはifstream辺りの必要はある。
初めて"{"が存在する行をみつけたとき、上のifでcount++になって、
下のifも成立してでcount++で2になるんだが、そういうものなのかね?
764:デフォルトの名無しさん
08/02/25 22:33:42
どこのK&Rだ、どこのw
765:デフォルトの名無しさん
08/02/25 22:35:10
>>750
あと必要な物はやる気と根気ですかね?
>>751
"だべ"ってどういう意味ですか?
マルチリンガーじゃないので日本語以外わからないんです、本当にごめんなさい。
766:デフォルトの名無しさん
08/02/25 22:36:48
>>765
キモス
767:744
08/02/25 22:43:14
>>759
else ifですか。基本的なところ躓きました。
ありがとうございます。勉強になりました。
>>763
そんな関数があったんですか。
ちょっとgetlineの中をのぞいて使わせてもらいます。
>>764
Cアンサーブックのほうです。
バイブル本とか釣られてやってみたけど、
糞面白んないんで解くのやめました。
768:デフォルトの名無しさん
08/02/25 22:44:52
可変のchar *のバッファ用意したいとき
string buf (n, '\0' );
&buf0]; ← これはchar*のところへ入れられる
と使うと便利だ 自動で消滅するし
769:744
08/02/25 23:06:24
>>768
下のほうhtmlのタグみたいですね。
奥の手っぽいんでどうしようもないときに使ってみます。
ありがとうございました。
770:デフォルトの名無しさん
08/02/25 23:48:16
>>744
さっき、恐らくは想定したと思われる仕様を完璧に満たすソースを書いたんだが、
反応がなかったから会社に置いてきちゃった。次に会社に出るのは3日後なんで、
後で寝ちゃわなければ軽く再現してみるよ。
771:デフォルトの名無しさん
08/02/25 23:57:46
>>770
>次に会社に出るのは3日後なんで
何でだ?
772:デフォルトの名無しさん
08/02/26 00:01:47
なんか、「それを記すにはあまりにも2chの投稿制限は厳しい」みたいに
続きそうな文章だなw
773:デフォルトの名無しさん
08/02/26 00:08:58
>>749
本体 > VC++
開発用ユーティリティ > TurboC++ Exploer (BCB)
でいいんでないの?
VC++はGUIアプリの構築はそれなりに手間かかるし、BCBは紙芝居の開発じゃ全然VCLの長所が生かせない。
774:デフォルトの名無しさん
08/02/26 00:16:21
>>771
単に、明日明後日は客先直行直帰だから。
>>744
手直ししながら、「クラスにする必要ないじゃん」とか
「変数は極力局在化しろよな」とか「マクロシンボルは大文字だろ」とか
「入力にfgets()を使うなら出力はfputs()じゃないか」なんて乗りで
修正してたらこうなった。
#include <cstdio> #include <cstring>
#define BUFFER_SIZE 1000
int func(char *argv[]) {
FILE * fin = fopen(argv[1],"r");
if (fin == NULL) return 1;
unsigned count = 0;
char buffer[BUFFER_SIZE];
while(fgets(buffer, sizeof(buffer), fin)!=NULL) {
if (count == 0) {
if (strchr(buffer,'{') != NULL) {
fputs(buffer, stdout);
count++;
}
} else if (count > 0) {
if (strchr(buffer,'{') != NULL) count++;
if (strchr(buffer,'}') != NULL) count--;
fputs(buffer, stdout);
}
}
fclose(fin);
return 0;
}
int main(int argc,char *argv[]) {
return func(argv);
}
775:744
08/02/26 00:36:44
>>774
まぁ人には癖があるからね。
ありがとう。
人と自分のソースを比較するのが、
一番勉強になるよ。
776:デフォルトの名無しさん
08/02/26 00:45:12
>>775
>774は常套句の宝庫だと思うよ。fgets(buffer, sizeof(buffer), fin)とか。
>744のクラスは、変数をばら撒くだけでクラスとしては何もしない無意味な設計だったし。
後はあれだな、関数に渡すのはconst char *にしてmain()で予めargcのチェックと
argv[1]の抽出位しておくのが常套手段か。
777:744
08/02/26 00:57:36
>>776
途中で配列にしたら楽だろうなぁとかは思ったが、
配列だと途中でサイズの変更が利かないから。
ポインタだと動的メモリの割り当てで適当なサイズに
割り当てできるし、と思っただけです。
別に機能さえあってればどのやりかたでもいいんだけど、
個人的には
stdoutの使い方がいまいちわかんなかったから、
そこが勉強になったのと、マクロの名前が大文字ね。
それ完全に忘れてたから勉強になった。
ありがとうってのは主にそこかなぁ・・・。
クラスは再利用に機能を発揮するから今の段階では必要としていないけど、
あとあと拡張していくにあたって必要になってくるから残しておきました。
確かにこの辺は言わんとわからんかったかもしれない。
突っ込まれたんで補足しておきました。
778:デフォルトの名無しさん
08/02/26 05:08:28
>726
ありがとう、ちょっと不安だったんだ。
名前も無いまま渡されるオブジェクトってどうなるんだろ、って。
779:デフォルトの名無しさん
08/02/26 05:56:26
ある関数に引数として構造体のポインタを渡し、そこにアドレスをセットして
返してもらうにはどう書けばよいのでしょう?
BOOL hoge( HOGE *ptr )
{
…略
ptr = address;
return TRUE;
}
としても上手く動かないようです。
780:デフォルトの名無しさん
08/02/26 06:00:17
>>779
整数を受け取るには整数のポインタを渡す必要がある。
構造体を受け取るには構造体のポインタを渡す必要がある。
構造体のポインタを受け取るには構造体のポインタのポインタを渡す必要がある。
781:デフォルトの名無しさん
08/02/26 06:03:19
あ!なるほど。こんな感じでしょうか?
BOOL hoge( HOGE **ptr )
ちなみにC++なのですが、参照渡しを使ってこれは良いのでしょうか?
BOOL hoge( HOGE *&ptr )
一応コンパイルは通るのですが…
782:デフォルトの名無しさん
08/02/26 07:25:27
OK
783:デフォルトの名無しさん
08/02/26 11:34:24
同じクラスなら、別のインスタンスのprivateなデータも参照出来ますよね。継承関係が
ある場合には、親オブジェクトから子オブジェクトを通して親オブジェクトのprivateデータを
参照できたのですが、これってこういうもの?
#include <iostream>
using namespace std;
class test2;
class test {
public:
void func(const test2 &a);
private:
int p;
};
class test2 : public test {
public:
void func2(const test2 &a);
};
void test::func(const test2 &a) {
cout << a.p << endl;
}
test2 T2;
int main()
{
test t;
t.func(T2);
return 0;
}
784:デフォルトの名無しさん
08/02/26 11:37:48
そういうもの。
785:デフォルトの名無しさん
08/02/26 11:40:09
>>783
というか出来ないとまずいだろ。
コピーコンストラクタとか代入演算子の定義が出来なくなってしまうよ。
786:デフォルトの名無しさん
08/02/26 12:06:04
protectedじゃなくてもアクセス出来ちゃうの?
787:デフォルトの名無しさん
08/02/26 12:22:23
protectedにすると、さらにtest2からも参照できるようになる
788:デフォルトの名無しさん
08/02/26 13:01:03
プログラムにZIPを解凍する機能を盛り込みたいのですが、そのような
機能のスタティックリンクできるライブラリをご存じないでしょうか?
環境はVisualC++.net2003です。
789:デフォルトの名無しさん
08/02/26 13:07:03
>>788
zlib
790:デフォルトの名無しさん
08/02/26 13:30:25
>>783じゃないが試してみたけど
同じクラスのインスタンスへの参照やポインタを持つとアクセス権限ブッチぎれちゃうのか
なんかカプセル化とかそういう面で考えると気持ち悪いというかなんというか
仕様上出来ないと仕方ないと言うのも分かるのだが・・・
791:デフォルトの名無しさん
08/02/26 13:33:53
789㌧
792:デフォルトの名無しさん
08/02/26 13:34:46
C++のprivateはクラスプライベートであってインスタンスプライベートの意味ではない
793:デフォルトの名無しさん
08/02/26 14:02:36
>>782
すみません、寝てました。返答有難うございます。
ちなみに「ポインタ変数を参照で渡す」と言う意味ならむしろ
BOOL hoge( HOGE &*ptr )
のような気がするのですが、なんで*&ptrなのでしょう?
それが仕様と言われればそこまでですが。
794:デフォルトの名無しさん
08/02/26 14:24:18
>>793
URLリンク(kmaebashi.com)
これの応用。
ptrのほうからreference to pointer to HOGEと読める。
795:デフォルトの名無しさん
08/02/26 14:26:03
>>793
typedef HOGE * HOGE_PTRしてみれば判る。
796:デフォルトの名無しさん
08/02/26 14:37:54
>>794>>795
なるほど。正直きちんと理解できたかは自信ないですが、ちゃんと法則が
あってそうなっているのは分かりました。
どうも有難うございましたm(__)m
797:デフォルトの名無しさん
08/02/26 14:46:05
vc2008のコマンドラインコンパイラだけ手に入りますか
vc6でコンパイルしたいです
sp1で鈍いパソコンです
798:デフォルトの名無しさん
08/02/26 14:48:16
EEを入れてみたか?
799:デフォルトの名無しさん
08/02/26 14:49:23
>>797
コンパイラだけ手に入れるのは無理だが
コマンドラインでの利用はできるよ
800:デフォルトの名無しさん
08/02/26 14:56:40
sp1にインストールできますか
801:デフォルトの名無しさん
08/02/26 15:02:40
>>792
kwsk
according to standard
802:デフォルトの名無しさん
08/02/26 15:49:24
すみません
DOSの実行ファイルで、標準出力へは書き出されないメッセージを取得する方法ありませんか?
hoge.exe > log.txt
として取得できないやつです 画面には出ます
標準出力、標準エラーの取り方はわかります
803:デフォルトの名無しさん
08/02/26 16:09:38
>>802
それのどこがC/C++に関係があるの?
804:デフォルトの名無しさん
08/02/26 16:18:38
>>802
つ printscreen
805:デフォルトの名無しさん
08/02/26 16:34:10
>>803
標準出力はこれで受け取れますが、exeが返す実行結果がとれません
#include <windows.h>
main(){
HANDLE hFile = CreateFile("log.txt",GENERIC_WRITE,FILE_SHARE_WRITE, NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
SetStdHandle(STD_OUTPUT_HANDLE , hFile);
STARTUPINFO si; PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));ZeroMemory(&pi, sizeof(pi));
si.cb = sizeof(si);
si.hStdOutput =hFile ;
si.hStdError =hFile ;
si.wShowWindow = SW_HIDE;
CreateProcess(NULL, "HtoX32c.exe e:\\0.htm ", NULL, NULL, FALSE,0, NULL, NULL, &si, &pi);
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(hFile);
}
806:デフォルトの名無しさん
08/02/26 16:51:04
HtoX32とやらが標準エラー出力に出している可能性は無い?
そもそも、まさかHtoX32はWindowを持っているアプリケーションなのか?
だとしたら、メッセージフックなどの手段が必要になるよ。
つーか、HtoX32とやらが何ものかにも依るけど同等のプログラムを自分で書いた方が手っ取り早かったりしてね。
807:デフォルトの名無しさん
08/02/26 16:59:39
HTMLをテキストに変換するプログラムです
ソースが公開されていたり定番のライブラリとかありませんか?
808:デフォルトの名無しさん
08/02/26 17:03:03
正規表現での消し方のサンプルみながら自分でやってみます
809:デフォルトの名無しさん
08/02/26 17:11:51
>>805
URLリンク(support.microsoft.com)
810:デフォルトの名無しさん
08/02/26 17:15:43
popenを使えたら楽だな
あればだけど
811:デフォルトの名無しさん
08/02/26 17:44:11
>>805
そのコードだと、自プロセスの標準出力が hFile になるけど、子プロセ
スの HtoX32c.exe の標準出力はコンソールのままでは?
812:デフォルトの名無しさん
08/02/26 17:44:15
1つの関数に複数の構造体を渡すことって可能でしょうか?
suruct typedef{
int x,y;
}SAMPLE;
SAMPLE sample;
suruct typedef{
int x,y;
}SAMPLE2;
SAMPLE2 sample2;
void AA(??? *s){
int a = s->x;
int a = s->y;
}
void main(){
AA(&sample);
AA(&sample2);
}
こんな処理をしたいのですが、???の所がわかりません。
良い方法を教えていただきたいです。
仮の構造体を1つ作って、その変数に代入→渡すってやり方だとできましたが
激しく面倒くさい。
813:デフォルトの名無しさん
08/02/26 17:52:41
関数オーバーロード、もしくはテンプレート関数でぐぐれ。
814:デフォルトの名無しさん
08/02/26 17:54:43
>>812
typedef SAMPLE SAMPLE2;
815:デフォルトの名無しさん
08/02/26 18:02:57
>>813
>>814
情報ありがとうございます。
テンプレート関数が一番やりたかった事を解決してくれそうでした。
ありがとうございました。
816:デフォルトの名無しさん
08/02/26 18:10:58
構造体のメンバを決め打ちするようなテンプレート関数は感心しないな。
テンプレートを使うということはC++で良いので、それならメンバ関数にしてしまった方が良い。
817:デフォルトの名無しさん
08/02/26 18:22:32
ifstream::readって実際に何バイト読めたか検出できないんですか?
freadみたいにふつうに戻り値が来るのかと思いきや違うみたいですし…。
818:デフォルトの名無しさん
08/02/26 18:28:13
つ gcount
819:デフォルトの名無しさん
08/02/26 18:29:13
>>817
自己レス。failで少なくとも期待通りの
バイト数読めたかどうかは取得できるのね。
820:デフォルトの名無しさん
08/02/26 18:30:30
>>818 と思ったらそんなメソッドがあったか。サンクス
821:デフォルトの名無しさん
08/02/26 18:31:39
fstreamは重要なところでは使うべきではない
APIのほうがよい
822:デフォルトの名無しさん
08/02/26 18:55:55
んなこたーない
823:デフォルトの名無しさん
08/02/26 19:18:08
fstreamは一社の開発ではないがAPIはMS一社
どのコンパイラでも同じ動作になる
あと3000個とか開けない
824:デフォルトの名無しさん
08/02/26 19:18:50
if文って 文字列と文字列を比べることって出来ないですよね?
1 = あいうえお
2 = かきくけこ
3 = さしすせそ
4 = あいうえお
if (a = 1){
}
みたいなことをやりたいのですがどうしたら良いでしょうか?
825:デフォルトの名無しさん
08/02/26 19:19:44
stringはできる
826:デフォルトの名無しさん
08/02/26 19:20:33
> どのコンパイラでも同じ動作になる
コンパイラで差はないかもしれないが・・・
827:デフォルトの名無しさん
08/02/26 19:21:41
>>823
んなばかな
APIがMS一社で規定されてるなんて初めて知った
MSはついに世界を征服したのか
828:デフォルトの名無しさん
08/02/26 19:23:04
Windowsのファイル入出力APIのことを指す
829:デフォルトの名無しさん
08/02/26 19:55:08
>>824 strcmpしとけ
830:デフォルトの名無しさん
08/02/26 21:19:23
CreateProcessしたときに止まらなくなったら停止させたいんですけど
どうやったらいいですか?
831:デフォルトの名無しさん
08/02/26 21:22:25
ググって解決しました
832:デフォルトの名無しさん
08/02/26 21:58:13
マルチスレッドで動かしてる関数って_endthread()書かなくてもreturn;書いてたら
問題ない?
833:デフォルトの名無しさん
08/02/26 22:04:41
問題ない。
ところで_beginthreadは使うなよ。_beginthreadexにしろよ。
URLリンク(msdn2.microsoft.com)(VS.80).aspx
834:デフォルトの名無しさん
08/02/26 22:15:49
VC6.0です。
__declspec(dllimport) int __stdcall hoge( LPWORD, LPWORD, LPWORD );
という形の関数のアドレスが入る関数ポインタhageを作りたいのですが、
うまく宣言できません。
__declspec(dllimport) int __stdcall (*hage)(LPWORD, LPWORD, LPWORD );
などとやるとコンパイルエラーになってしまいます。
どうすれば宣言できるのでしょうか?
835:デフォルトの名無しさん
08/02/26 22:17:26
declspecは関係ないだろ
836:デフォルトの名無しさん
08/02/26 22:19:03
関係あるよ
837:デフォルトの名無しさん
08/02/26 22:19:32
関数ポインタで悩んだら、typedef
typedef __declspec(dllimport) int __stdcall hogetype( LPWORD, LPWORD, LPWORD );
hogetype hoge;
838:デフォルトの名無しさん
08/02/26 22:36:15
関数ポインタの便利さになれすぎてしまって
最近 if を見るたびにすぐ関数テーブル化してしまう。
間違い?
839:デフォルトの名無しさん
08/02/26 22:39:07
なるべくシンプルにかくのを推奨されますからね
840:デフォルトの名無しさん
08/02/26 22:43:09
関数テーブル間違いです
鈍いです
841:デフォルトの名無しさん
08/02/26 22:47:58
なんかCreateProcessすると不安定になる スレッドでsystemで実行してみる
CreateProcessを短期間に20回以上使うと動かなくなるエラーってありますか?
実行する側のexeのせいかもしれないですが
842:デフォルトの名無しさん
08/02/26 22:50:02
テーブルだめなのか・・
if の中にさらに if があるともうその地点でうわ・・って思ってしまう。
ちょっとソース見直してみます
843:デフォルトの名無しさん
08/02/26 22:50:41
>>833
ありがとう。今度からそうする
844:デフォルトの名無しさん
08/02/26 22:54:19
そこでBoost::functionとコールバックですよ。
845:デフォルトの名無しさん
08/02/26 22:59:28
>>842
無理して避けることもないよ。何事も程々が1番。
846:デフォルトの名無しさん
08/02/26 23:02:18
グローバル変数って絶対使わない方がいいんですかねえ
例えばゲームプログラムを作っていて、状態を管理するグローバル変数を使っているとする。
その変数には、ゲームの進行に合わせて、例えば
定数(TITLE=0, STAGE1, STAGE2, STAGE3, STAGE_CLEAR, GAME_OVER, ENDING)が入るとする。
処理は上の状態それぞれでモジュール化されているとすると、
どうしても状態管理変数はグローバル変数化してどの状態からでも
参照・設定できるようにせざるを得ないと思うのですが、何かいい手があるのでしょうか。
状態管理変数をファイル内static変数にしてセッターを使って書き換えるようにしたり、
状態管理変数とセッターをクラスにしてそのオブジェクトのスコープをグローバルにするもしくは状態管理変数とセッターを
staticにしてどのクラスからでも書き換えられるようにするくらいなら最初から状態管理変数をグローバルにしといた方が
シンプルだと思うのですがどうでしょうか。
847:デフォルトの名無しさん
08/02/26 23:03:57
数が多くなければOK、重要ならOK
848:デフォルトの名無しさん
08/02/26 23:05:38
>>846
静的なシングルトンもグローバル変数も似たようなもんだ
グローバル変数でいいんじゃね?
ただ、関数経由にしておけばデバッグするときに setter で引っ掛ければいいだけだから
ずいぶんと楽になる*かもしれない*
849:デフォルトの名無しさん
08/02/26 23:30:59
>>846
シングルタスクなら良いけど。
GUIでスレッド使って随時処理しながら入力待ちして、
入力はコールバックで処理、みたいのだと、
ゲッタやセッタ作った方が排他処理し易いかなぁ。
まぁケースバイケース?
850:デフォルトの名無しさん
08/02/26 23:32:07
ゲーム状態のインスタンスが1つだけなら、グローバル変数でいいと思う。
インスタンスが複数なら、
状態ごとの処理に、状態管理変数をクラス化したものを渡すとか、
もしくはstateパターンなんてのもいいかもしれない。
851:デフォルトの名無しさん
08/02/26 23:33:35
どうせグローバル変数的に使うとはいえ、
それゆえにどこから変更されてるかを追跡するためにも
>関数経由にしておけばデバッグするときに setter で引っ掛ければいいだけだから
というのは地味に大事
852:デフォルトの名無しさん
08/02/26 23:38:31
ゲーム状態も例えば、プレイヤキャラの他にAIキャラが裏で進行中なんてことになると、
グローバルだと破綻するよね。そんな場合はゲーム状態はキャラクタに依存する情報になるわけだけど。
853:デフォルトの名無しさん
08/02/26 23:46:14
シングルトンとグローバル変数は違う。
グローバル変数として使ってる間違ってる例が多いのが勘違いの原因かもしれない。
自分だったら>>846の場合、シーンマネージャクラスを作ってそいつに振る舞いを管理させる。
極力グローバル変数は使わない。
854:デフォルトの名無しさん
08/02/27 00:01:10
シングルトンは初期化のタイミングを選べるからグローバルとは大きく違う。
855:デフォルトの名無しさん
08/02/27 00:20:00
結局オブジェクト指向の導入でCにおけるグローバル変数使用の問題は解決できてないんじゃねえの
Cを極めればオブジェクト指向言語を使わなくても良いコードが書けるんじゃねえの結局クラスとか
オブジェクトとかデザインパターンとか複雑で分かりにくくするなだけじゃね
856:デフォルトの名無しさん
08/02/27 00:21:36
system は空白が改行のように扱われてしまいます
パラメータは渡せませんか?
857:デフォルトの名無しさん
08/02/27 00:22:49
>>855
んなこたーない
858:デフォルトの名無しさん
08/02/27 00:26:23
ファイルの読み込みについての質問です。
----
2008/02/20,01:00:00
2008/02/21,02:00:00
2008/02/26,03:00:00
…
----
と書かれたファイルを、
tmp[0] = 2008;
tmp[1] = 2;
tmp[2] = 20;
tmp[3] = 01;
といったように取り込みたいです。
スラッシュとカンマとコロンを区切りにしてうまく取り込む方法を教えてください。
もし、スラッシュしかなければstrtokとatoiでできたのですが、3種類あるので困っています。
よろしくお願いします。
859:デフォルトの名無しさん
08/02/27 00:28:04
>>856
どんな文字列を渡したとき?
860:デフォルトの名無しさん
08/02/27 00:28:08
見た感じフォーマットは固まってるだろうから
単純に先頭からパースするだけじゃね
861:デフォルトの名無しさん
08/02/27 00:29:09
string s;
s.substr(0,4);
s.substr(5,2);
s.substr(7,2);
とかでいいのでは?
862:デフォルトの名無しさん
08/02/27 00:31:49
>>858
fscanf(fp, "%d/%d/%d,%d:*[^\n]", &tmp[0], &tmp[1], &tmp[2], &tmp[3]);
863:デフォルトの名無しさん
08/02/27 00:31:50
>>859
自己解決しました 同名のexeがありそれが動いていたようです
864:デフォルトの名無しさん
08/02/27 00:34:11
862の訂正 *の前に%
fscanf(fp, "%d/%d/%d,%d:%*[^\n]", &tmp[0], &tmp[1], &tmp[2], &tmp[3]);
865:デフォルトの名無しさん
08/02/27 00:34:23
>>855
>Cを極めればオブジェクト指向言語を使わなくても良いコードが書けるんじゃねえの
これは当たり前なんだが、(といってもオブジェクト指向を使わないって意味じゃない、
Cでもオブジェクト指向は昔から存在する)
>結局クラスとかオブジェクトとかデザインパターンとか複雑で分かりにくくするなだけじゃね
何が複雑なんだ?
デザインパターンなんか当たり前の設計パターンに名前付けただけじゃないか。
866:デフォルトの名無しさん
08/02/27 00:36:27
変数へのアクセスを制限することで単純になるんだけどなぁ。
無制限に変数にアクセスできたほうが複雑だって、わかんないかなぁ。
867:デフォルトの名無しさん
08/02/27 00:48:26
Perlの文法が糞なのは間違いない。
868:858
08/02/27 01:12:38
>861
レスありがとうございます。
が、、私ではうまいこと使えませんでした。ごめんなさい。。
>860, 864
fscanfでできました。
どうもありがとうございました。
869:デフォルトの名無しさん
08/02/27 01:23:50
C++で配列のコピーってどうやりますか?
for()文で代入を回す?
870:デフォルトの名無しさん
08/02/27 01:24:40
memcpyが最速では
871:デフォルトの名無しさん
08/02/27 01:26:15
>866
何を以て「単純」とするかに依るんだろうな。
多分 >855 は言語の構造として単純であること、習得の容易さなどを見て言っているんだろうが
大きなコードを、そのまま扱うと中身はかなり複雑化する。
クラスや名前空間などを使って、大きなコードを小さな部品の集合体として考えて
それぞれの部品単位で扱うことで、ひとつひとつの部分は単純になる。
872:デフォルトの名無しさん
08/02/27 01:26:28
>>869 std::copy()
873:デフォルトの名無しさん
08/02/27 01:27:43
>>870 C++ で memcpy() は使わない。禿との約束だよ。
874:デフォルトの名無しさん
08/02/27 01:30:02
推奨されていなくても確保の仕方から
vectorでもstringで有効でしょう memcpy
875:デフォルトの名無しさん
08/02/27 01:31:12
memcpyより自分でアセンブラ書いた方がはやかったんだけど、そんなもん?
876:デフォルトの名無しさん
08/02/27 01:31:59
>>875 それはめずらしい。
877:デフォルトの名無しさん
08/02/27 01:39:54
memcpyより早いコードくれ
878:デフォルトの名無しさん
08/02/27 01:40:26
SSE使ったんだけどね
879:デフォルトの名無しさん
08/02/27 02:17:49
マイクロソフトのCHMファイルはなかなかいいんだけど
SJISしかコンパイルできなくて、サイズが20Mとかになるとコンパイルに失敗する
CHMをパクってWindowsの標準ヘルプ形式を作りたい
参加者募集中
圧縮接尾辞配列がいいと思う
ブロックーソーティングしたデータはそのまま全文検索できるとおもうがどうか?
880:デフォルトの名無しさん
08/02/27 02:27:20
複数のテキスト文書を圧縮できてかつ高速に全文検索できて
CHMのような普及率を目指したい
デスクトップサーチとは目的が違う 元のファイルが復元できてまとめられる点が大事
881:デフォルトの名無しさん
08/02/27 02:28:28
tarでいいじゃない
882:デフォルトの名無しさん
08/02/27 02:33:30
tarは全文検索できるように設計されてるの?
883:デフォルトの名無しさん
08/02/27 02:38:51
tarは圧縮しないからね。
884:デフォルトの名無しさん
08/02/27 02:40:51
>>875
アラインメントに縛りを入れれば早くはできると思う
885:デフォルトの名無しさん
08/02/27 02:46:44
半分にはならないとだめだな chmは全文検索できて元の半分になるよ
886:デフォルトの名無しさん
08/02/27 02:51:09
>>880
専ブラのログをまとめるのに便利そうだ
あてにせず期待してるよ
887:デフォルトの名無しさん
08/02/27 03:29:32
badc$の巡回データは
adc$b
dc$ba
c$bad
$badc
ソートすると
$badc
adc$b
badc$
c$bad
dc$ba
ブロックソートではcb$daというデータのみが与えられる
復元しようとするとここまでは直ぐわかる
$***c
a***b
b***$
c***d
d***a
c$、ba、、$b、dc、adと繋がっていることがわかる
たとえばdcというデータは何番目に出現するか求めるとすると末尾のcから調べていけば良さそうだが
888:デフォルトの名無しさん
08/02/27 03:41:52
std::string
のような STL クラスを前方宣言するにはどうしたらいいですか?
それともこういうクラスって前方宣言しないでヘッダーに直接 include
させても問題ないですか?
889:デフォルトの名無しさん
08/02/27 04:17:01
Visual C++ Express Edition を入手したので、簡単なプログラムを作ってみようと思ったのですが、
なぜかコンパイルできません。
コマンドラインで、 cl c:\source.cpp としても、
'cout' : 定義されていない識別子です。
'endl' : 定義されていない識別子です。
等とエラーが返ってきます。
ちなみに、ソースは以下のようなものです。
#include <iostream>
int main(void)
{
cout << "Hellow, World!" << endl;
return 0;
}
なぜエラーになるのか分かりません。お暇な方いましたら、どうかお知恵をお貸しください。
890:デフォルトの名無しさん
08/02/27 04:20:39
×cout << "Hellow, World!" << endl;
○std::cout << "Hello World!" << std::endl;
891:デフォルトの名無しさん
08/02/27 04:21:19
あんたが外国にいるんじゃなかったら、本を買って勉強しる。
とりあえず、
std::cout << "Hellow, World!" << std::endl;
としてやってみ。
もしくは、
using namespace std:
をinclude 文の下に書いておくとか。
まあがんばれ。
892:デフォルトの名無しさん
08/02/27 04:24:33
>>890
ありがとうございます。
using namespace std; を追加したらコンパイルできました・・・ ^ ^;
最初、#include <iostream.h> としていて、コンパイル時にそんなファイルは無いと言われ、
#include <iostream> に直したら今度は cout が定義されて無いと言われ・・・
完全に勉強不足ですね・・・・
893:デフォルトの名無しさん
08/02/27 04:48:08
>892
環境によっては
#include <iostream.h>
と書くと、using namespace std; を勝手にやってくれるんだわ。
多分、そういう環境を前提にしたコードだったんだろう。
894:デフォルトの名無しさん
08/02/27 08:20:07
ついでに勉強不足の俺に教えてください
#include <string.h>
#include <stdio.h>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
string a = "0908a89";
printf("%s\n", a);
getchar();
return 0;
}
aに0908a89が代入されて無いみたいなのですが、何処がまずいのでしょうか?
895:デフォルトの名無しさん
08/02/27 08:37:47
いろいろまずい。
というか、それVCならコンパイルとおるの?gcc 2.96だと少なくとも通らない。
・string.hってCの奴じゃないかな。#include <string>と書くべし
・その場合aってのはstring型なので、printfに%sで受けるのはよろしくない。
書くならprintf("%s\n",a.c_str());
・でも、せっかく#include <iostream>してるんだから
cout << a << endl;でいいじゃん。
・ところで最後のgetcharは何のために?
以上直すと、こっちでは代入されるよ。
896:デフォルトの名無しさん
08/02/27 09:02:30
>>895
ありがとー 出来ました。
コンパイルは出来てましたがNULLが表示されました。
getchar();しないと画面が速攻閉じてしまうので、画面確認用にです。
897:デフォルトの名無しさん
08/02/27 09:06:36
>>896
修正したソースを張ってみないと有効な回答は得られないと思うよ。
898:デフォルトの名無しさん
08/02/27 09:09:57
int* random_array(int n);
shared_ptr<int> p(random_array(100));
というように書けないのですが、shared_ptrの作成時って、必ずnew[100]とかって
やらないとだめなのですか?
899:デフォルトの名無しさん
08/02/27 09:30:04
>>898
arrayの共有にはshared_arrayな。
それとエラーメッセージ書かないとエスパーしか解答できない。
900:デフォルトの名無しさん
08/02/27 11:36:18
system("path %PATH%; C:\\hofe;");
が有効になりません・・・
なぜでしょう
901:デフォルトの名無しさん
08/02/27 11:59:17
>>900
環境変数はプロセスごとに別々だから
子プロセスを起動してPATHを設定させても自プロセスには影響しない
902:デフォルトの名無しさん
08/02/27 12:07:43
改行しても無理でした パスを直うちするか、そこへ移動するしかないですか?
APIでPath設定できるか調べてみます
system("path C:\\hofe; \n abc.exe");
903:デフォルトの名無しさん
08/02/27 12:20:15
pathを追加する方法教えてください わかりませんでした
904:デフォルトの名無しさん
08/02/27 12:24:10
SetEnvironmentVariable
905:デフォルトの名無しさん
08/02/27 12:30:25
サンクス
長い実行パスと、長いパラメータパスで困ってました
これで解決しそうです
906:デフォルトの名無しさん
08/02/27 13:29:07
#include "stdafx.h"
#include <string>
#include <stdio.h>
#include <iostream>
using namespace std;
略)
string x;
sprintf(x, "%02x%02x%02x%02x%02x\n", buf[0], buf[1], buf[2], buf[3], buf[4]);
これで、buf[0], buf[1], buf[2], buf[3], buf[4]の値をstring型 でx代入したいんですけど
xが定義されていないと怒られてしまいます。どうしたら良いのでしょうか?
907:デフォルトの名無しさん
08/02/27 13:39:20
string x(11,'\0');
sprintf(&x[0], "%02x%02x%02x%02x%02x\n", buf[0], buf[1], buf[2], buf[3], buf[4]);
これは無理?
908:デフォルトの名無しさん
08/02/27 13:51:44
>>907
テラThanks
909:デフォルトの名無しさん
08/02/27 13:57:03
まず間違いなく大丈夫ではあるものの一応標準外の仕様だと心にとどめておくといい
910:デフォルトの名無しさん
08/02/27 14:02:11
winsockを使うときエコーバックするのは普通ですか?
それとも負荷を下げるためにしませんか?
少量ずつデータ受け取ればミスしにくくなると思うんですけど
少しずつ受け取って確認無しでいいですか
911:デフォルトの名無しさん
08/02/27 14:02:13
次の改訂で標準になるけど、コンパイラの対応が普及するまで合わせると、
問題ないと言えるのは何年も先かなぁ。
912:デフォルトの名無しさん
08/02/27 14:09:00
http先のファイルのサイズやcrcを取得する方法教えてください
それみてデータが正常が判定したいです
913:デフォルトの名無しさん
08/02/27 14:23:32
>>910
何をどこにエコーバックするんだ
ミスって何のだ
>>912
ファイルサイズは全部受信すればわかるだろう
CRCの計算方法はこれ↓
URLリンク(en.wikipedia.org)
914:デフォルトの名無しさん
08/02/27 14:40:20
>>912
サイズはレスポンスヘッダのContent-Length (ない場合もある)
CRC は無理かと
915:907
08/02/27 14:46:39
もう一つ教えて下さい。
char str[100];
sprintf(str, "%02x%02x%02x%02x%02x\n", buf[0], buf[1], buf[2], buf[3], buf[4]);
char str0[100];
char str1[] = "01061719d0";
char str2[] = "0106171f34";
if (strcmp(str, str1) == 0){
printf("この番号は登録されています①\n番号%s\n",str);
}
else if (strcmp(str, str2) == 0){
printf("この番号は登録されています②\n番号%s\n",str);
}
else {
printf("この番号は登録されていません\n番号%s\n",str);
}
このようなif文にしたいのですが、登録したbuf[]を読み込んでも"この番号は登録されていません"
と表示されてしまいます。なぜでしょうか?
916:デフォルトの名無しさん
08/02/27 14:53:34
std::vectorとCStringでは、empty() (とEmpty()) の意味違うのね~
しばらく騙されてました。
917:デフォルトの名無しさん
08/02/27 14:54:36
stlのset使った方がいいんじゃない
918:デフォルトの名無しさん
08/02/27 15:03:58
>>915
strを表示させてみるんだ
919:デフォルトの名無しさん
08/02/27 15:06:37
>>914
GETでして送られてくるヘッダをみるんですよね?
2chのスレURLいれるとサイズ書いてないです
できる限りなんとか取得する方法無いですか?
920:デフォルトの名無しさん
08/02/27 15:08:28
送受信のデータです
GET スレリンク(livemarket2板) HTTP/1.0
HTTP/1.1 200 OK
Date: Wed, 27 Feb 2008 06:07:25 GMT
Server: Apache/2.0.59 (Unix) PHP/4.4.2 mod_ssl/2.0.59 OpenSSL/0.9.7e-p1
Vary: Accept-Encoding
Connection: close
Content-Type: text/html
921:デフォルトの名無しさん
08/02/27 15:12:53
動的に変化するから無理そうですね
通信切れで見られないHMLの取得を避けたいんですけどいい方法ありませんか
922:デフォルトの名無しさん
08/02/27 15:15:27
最後に </html> が無かったら途中で切れたと判断するとか
923:デフォルトの名無しさん
08/02/27 15:20:51
普通のテキストならどうしたらいいですか?
もともと不完全なHTMLならどうしたらいいですか?
サーバーのファイルと一致していてもエラーになります
924:915
08/02/27 15:23:30
>>918
str は 0106719d0 になっているようです><
なんでうまくいかないんだろう。。
925:デフォルトの名無しさん
08/02/27 15:25:54
>>922
HTML4では </html> は省略可能なので万能じゃない
>>920
Connection: close
って書いてあるから接続断まで読めばそれで全部。
あと、なるべくHTTP/1.1使え
手元で確認した限り、HTTP/1.1でアクセスすると
chunked で送ってくるので末尾がちゃんと確認できる
926:920
08/02/27 15:28:36
サンクス
927:デフォルトの名無しさん
08/02/27 15:34:26
>>924
sprinf で \n を付けているのに str1, str2 には付いていないぞ
928:デフォルトの名無しさん
08/02/27 15:35:55
HTMLパーサは↓程度はきちんと解析してくれないとねぇ‥‥
46 名前:デフォルトの名無しさん[sage] 投稿日:2008/01/27(日) 00:38:23
これだって正しいでっせ
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "URLリンク(www.w3.org)">
<title>テスト</>
<p><em/ほげほげ/
<p style=width:50px<strong>ふーばー</strong</p>
929:デフォルトの名無しさん
08/02/27 15:42:57
1.0から1.1にするとバットリクエストのエラーになります
書式が違うんでしょうか_
buf="GET " + path + " HTTP/1.1\r\n\r\n";
n=send(sock, buf.c_str(), buf.size(), 0);
930:デフォルトの名無しさん
08/02/27 15:44:16
1.1はHostヘッダの送信が必須
931:デフォルトの名無しさん
08/02/27 15:44:52
1.1だと、ユーザー情報も送信しないと無理になるんですか
932:デフォルトの名無しさん
08/02/27 15:54:08
なおらないです どうすればいいですか?
GET /test/read.cgi/livemarket2/1202634378/ HTTP/1.1
Accept: */*
Referer: URLリンク(live27.2ch.net)
Accept-Language: ja
Host: live27.2ch.net
Connection: Keep-Alive
HTTP/1.1 400 Bad Request
ソース
buf="GET " + ko+ " HTTP/1.1\r\n\r\n";
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
buf="Accept: */*\r\n\r\n";
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
buf="Referer: http://"+sev+"/"+"\r\n\r\n";;
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
buf="Accept-Language: ja\r\n\r\n";
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
buf="Host: "+sev+"\r\n\r\n";
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
buf="Connection: Keep-Alive\r\n\r\n";
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
933:デフォルトの名無しさん
08/02/27 15:58:54
改行大杉
934:デフォルトの名無しさん
08/02/27 16:01:24
2回改行するのは最後だけ
935:915
08/02/27 16:02:42
>>927
盲点でした。
やっと次の作業に進めそうです。本当にありがとうございます。
936:デフォルトの名無しさん
08/02/27 16:06:31
サンクス 改行削って上手くいきました
あと受け取るバッファを多くすると返却値を間違えるようなんです
どうやれば直りますか?
n = recv(sock, &buf[0], 128000, 0);
としてnまで表示するとデータ入ってないときがあります
937:デフォルトの名無しさん
08/02/27 17:05:30
めっちゃミジンコの質問させて下さい。
図書館で借りてきた本のページが抜けてて%cはどういう時に使うのか
わかりません;
%はぐぐれないみたいで困ってます。
938:デフォルトの名無しさん
08/02/27 17:08:24
>>937
URLリンク(www.linux.or.jp)
文字じゃね?