【初心者歓迎】C/C++室 Ver.49【環境依存OK】 at TECH
[2ch|▼Menu]
[前50を表示]
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
789d

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
コンパイラだけ手に入れるのは無理だが
コマンドラインでの利用はできるよ


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

4987日前に更新/243 KB
担当:undef