[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 06/02 12:18 / Filesize : 258 KB / Number-of Response : 992
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 00:25:51 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.63【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1231499251/

【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。


752 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 23:33:24 ]
談合必要論か

753 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 23:36:38 ]
誤爆乙

754 名前:デフォルトの名無しさん [2009/04/02(木) 23:56:14 ]
shared_ptrのスマポをNULLで初期化できますか?


755 名前:デフォルトの名無しさん [2009/04/02(木) 23:57:21 ]
boost::shared_ptr<MyClass> m_MyClass =
boost::shared_ptr<MyClass>(reinterpret_cast<MyClass*>(0));
とやってできました。


756 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 00:03:38 ]
>>754-755
単にboost::shared_ptr<MyClass> m_MyClass;ではだめなの?

757 名前:デフォルトの名無しさん [2009/04/03(金) 00:19:11 ]
>>756
そうやって作成したスマポが、中身が入ってるかゼロなのか、NULLと比較しても
いいのですか?


758 名前:デフォルトの名無しさん [2009/04/03(金) 01:23:15 ]
すいません、初心者じゃない(つもり)なんですが、初心の質問させてください。
char data[100];
というデータがあるとき、
unsigned int func1(int i)
{
unsigned char* p = reinterpret_cast<unsigned char*>(data);
unsigned int r = p[i];
r |= p[i + 1] << 8;
r |= p[i + 2] << 16;
r |= p[i + 3] << 24;
return r;
}

unsigned int func2(int i)
{
unsigned int ret = data[i];
ret += data[i+1] << 8;
ret += data[i+2] << 16;
ret += data[i+3] << 24;
return ret;
}
この2つの関数の出力が違う場合があるのですが、(たとえばこうやって初期化した場合)
for (int i = 0; i < 100; ++i)
{
data[i] = 129;
}
どうしてでしょうか?


759 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 01:30:10 ]
>>757
デフォルトコンストラクタはこうなってる
shared_ptr(): px(0), pn() // never throws in 1.30+
{
}
px は内部に持つ生のポインタ

760 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 01:35:56 ]
>>758
129 が CHAR_MAX より大きい可能性が高いな。



761 名前:デフォルトの名無しさん [2009/04/03(金) 05:59:03 ]
ありがとうです。CHAR_MAXは127でした。
色々と理由を考えてたのですが、
(1) unsigned char a = 0xff;
(2) char a = 0xff;
cout << static_cast<int>(a<<8) << endl;
(1)のように書くと0xff00と出力され、
(2)のように書くと0xffffff00と出力されます。
unsigned charとcharではシフトの方法が違うんでしょうか?


762 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 06:23:45 ]
>>761
その場合は符号拡張の話だな
int にキャストした段階で違いが起こってる



763 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 07:45:19 ]
(1) unsigned char a = 0xff;
a = 0xff (255) を int 型にすると 0x000000ff (255)
※符号拡張の際、unsigned int 型を経由

(2) char a = 0xff;
a = 0xff (-1) を int 型にすると 0xffffffff (-1)

まあ大抵の場合、char 型で文字を扱うとき unsigned char にしといた方が
いちいちキャストしたりとか面倒なことをせずに済む

764 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 08:12:15 ]
>>761
そもそも CHAR_MAX が 127 なら char a = 0xff でも char a = 129 でも値は実装依存になる。
コンパイラやそのバージョンやコンパイルオプションの違いで変わってくるかもしれない。

一般的には、符号付 char の表現は 2 の補数で、収まらないビットは切り捨てられるだけ
だから、以下 >763

765 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 09:13:17 ]
char を unsigned int に型変換するときは
int に符号拡張してから unsigned int に変換される

char a に -1 (0xff) が入ってる場合は一旦 int 型 -1 (0xffffffff) に符号拡張され
unsigned int 4,294,967,295 (0xffffffff) に変換される

766 名前:デフォルトの名無しさん [2009/04/03(金) 10:56:18 ]
while(!(ret_cd = fetch_data())){
:
(フェッチしたレコードに関する処理部)
:
}
--------------------------
関数
int fetch_data(void)
{
:
(レコードデータ取得部)
:
return(0)
}
-------------------------
上記のようなプログラムで
while文の条件文の意味がよくわかりません。

全体の流れが「レコードが存在する間、処理を繰り返す」ような
処理ということはわかるのですが、
!(ret_cd=fetch_data())ときいている意味が
はっきりわからないのでどなたかお願いします。

767 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 11:03:57 ]
>>766
> !(ret_cd=fetch_data())ときいている意味
「レコードが存在」しているかどうか,という意味なんじゃない?

768 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 11:44:08 ]
fetch_data() は、レコードが存在すると 0、レコードが存在しないと 0 以外(たとえば -1)
を返すのだろう

レコードが存在する !(0) → 真となり、処理継続
レコードが存在しない !(-1) → 偽となり、処理終了

ぱっと見に分かりづらいから
while(!(ret_cd = fetch_data())){
  ↓
while((ret_cd = fetch_data()) == 0){
と書き換えてもいいかもしらん

769 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 12:02:29 ]
技術的な面以外で..
「〜をする意味」は有効な回答が付きづらい
概して「考えれば分かる」とか言われるのが落ち

質問の仕方が分からなくて,適当に取って着けたように「〜とはどういう意味でしょうか?」と聞いてしまうよりは,
必要な用語とか,質問に至るまでの状況とかをしっかり書いておくほうが無難

770 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 12:06:14 ]
単に、代入と検査を一緒にやってるだけだろ



771 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 12:29:49 ]
まあ>>768の通りだが、
おそらく、 ! が見た目通りに否定の意味に感じるので
直感的に理解しづらいということだろう。

!strcmp() などもそうだが、
==0 の意図で ! を使う人は結構居る。俺は極力 ==0 を使うが。
慣れればどうということは無いのだろうが、読むときに一瞬考えるので。

772 名前:デフォルトの名無しさん [2009/04/03(金) 14:14:14 ]
766です。
質問の仕方も曖昧ですみません。
レスいただきありがとうございます。
しかしまだ消化不足…といいますか、流れについて
いけてないです。現在修正中のプログラムが下記のような流れです。

@カーソルセット
EXEC SQL DECLARE cur_TEST CURSOR FOR
SELECT・・・
FROM・・・
WHERE・・・

EXEC SQL OPEN cur_TEST;

773 名前:デフォルトの名無しさん [2009/04/03(金) 14:15:05 ]
Aフェッチしながら項目セット
while(!(ret_cd=fetch_data())){

 /* 中間ファイル構造体の各項目に値セット */
 sprintf(・・・)
 sprintf(・・・)

 /* 中間ファイルに出力 */
 if(temp_write(Ofp, &out)){
 fclose ( Ofp );
 strcat( Errmsg, "temp_write:write_error" );
 AB_sjmsg( Errmsg );
 putenv( Errmsg );
 return(-1);
 }
}

中間ファイルクローズ
fclose(Ofp)

return(ret_cd);

774 名前:デフォルトの名無しさん [2009/04/03(金) 14:15:48 ]
(出力関数)
int temp_write( FILE *Ofp, struct TEST *dat )
{
int ret;

ret = fprintf(Ofp, "%-1.1s" , dat->AAA ) > -1;
ret = ret && fprintf(Ofp, "%-5.5s" , dat->BBB ) > -1;
ret = ret && fprintf(Ofp, "%-8.8s" , dat->CCC ) > -1;

return(ret ? 0 : -1);
}


775 名前:デフォルトの名無しさん [2009/04/03(金) 14:16:34 ]
実は今回このwhile(!(ret_cd=fetch_data()))の中で
もうひとつテーブルを読み、そこで抽出したレコード(複数件)が
なくなるまで繰り返す・・・という入れ子の処理を追加しないといけなくなりました。

単純にやり方を真似てfetch_data2という関数をつくり、
while(!(ret_cd=fetch_data()))の中で
while(!(ret_cd=fetch_data2()))と記述して、やろうとしてるのですが
エラーが出るため、今まで曖昧だったwhile(!(ret_cd=fetch_data()))部の
意味をはっきりさせようと思った次第です。

776 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 14:16:45 ]
で?

777 名前:デフォルトの名無しさん [2009/04/03(金) 15:04:11 ]
>>776
死ね

778 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 15:30:31 ]
で、どこまで理解できて、どこが理解できなくて、
どんなエラーが出るの?

779 名前:デフォルトの名無しさん [2009/04/03(金) 15:40:55 ]
途中で止まっており失礼しました。
わからない点は、!(ret_cd=fetch_data())の部分で、
ret_cdになんの値がセットされているかです。
int型で定義されてはいますが、これに値がセットされるところを
探しても見つけきれないので。
fetch_data関数は、「if(sqlca.splcode==1403)(抽出データが終了したら)
return(1)」という処理が入っているので、セットされる値の変わり目が
はっきりとわかります。
なんだかどうしようもない質問をしてしまったみたいで申し訳ないです。
もう少し詮索してみます。

780 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 15:42:44 ]
>>779
何の値、って、fetch_data() 関数の戻り値でしょ。

デバッガで一行ずつ追ってみれば? もしくは、printf とかで。



781 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 15:59:14 ]
>>779
ret_cd=fetch_data()
のところでret_cdには0か1がセットされる

782 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 17:23:37 ]
もうクビになっちゃえば

783 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 18:00:59 ]
>>766から>>779までの5時間を
本なりサイトなりを使った「基礎からのCの勉強」に充てていれば、
今頃は普通に理解できるようになってたと思うw

784 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 19:46:00 ]
C++言語でファイルのサイズや更新日時を取得する機能を持つクラスを、
#include <stdio.h>
FILE *fopen(const char *, const char *);
int fileno(FILE *);
int fclose(FILE *);
#include <sys\stat.h>
int fstat(int handle, struct stat *statbuf);
の関数や構造体を使って作ったものの、あまり良くないようだ。
大量のファイルを調べると、遅くてハードディスクへのアクセスが、かなりのものだ。
VBでFileLen()やFileDateTime()関数使ったプログラムのほうが速いし、ハードディスクに
ほとんどアクセスしなくて済んでる。
ファイルを開かなくて取得できんのかな。いい方法ないもんか。

785 名前:デフォルトの名無しさん [2009/04/03(金) 19:51:09 ]
まあそういうなよ。
おれたちも、766みたいな頃を経てきたわけだろ。
なんとなく、766はできないプログラマになりそうな気もするけど

786 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 19:54:54 ]
fstat の実装がどうなってるか知らないけど、GetFileSize() やら GetFileTime() やらを
使った方が速いのかもね。

787 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 19:57:55 ]
じゃあ _stat(const char *, struct _stat *) とか
FindFirstFile/FindNextFileでもつかっとけよ。
Windowsならディレクトリエントリだけの話になるから。

788 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 20:00:43 ]
そいや、ファイルハンドルが必要なやつは遅い、って話を聞いたことがあるな。
実際の値が必要なときは、これを使わざるを得ないんだけど。

789 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 20:21:42 ]
windowの関数を勉強しないとならんな
低レベルなプログラム書けるように勉強しないとならんな

790 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 20:32:15 ]
代入と評価を同時にしたら、読みにくくなるだろう。
横着やな。



791 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 20:51:09 ]
いやWinしらてとのAPIとか20年前に頭に入っていて当然なんだが

792 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 20:55:16 ]
日本語

793 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 20:56:58 ]
どこの方言か知らんけど意味わからん


794 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 21:00:19 ]
しらてと?

795 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 21:03:05 ]
すなみ
はにりいと
とんとかいも

796 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 21:07:14 ]
女の我侭は異常

おいら『パソコン買ったから遊びに来る?ゲームも出来るよ!』
彼女 『うん!』
おいら『ほら!(得意げに)』
彼女 『何これ?PC98じゃない!幻滅!』
おいら『え、だってみんなPC98が普通だし....』
彼女 『普通X68000でしょ?何このねずみ色の本体・・・最低。
    大体、ゲームだってショボイRPGやシミュレーションばかりでしょ?
    シューティングは?まともなシューティングはあるの?ないでしょ?』
おいら『...』
彼女 『大体、256色ってなに?しかもデフォルト16色のゲームまであるしw
    こんなので満足できるの?しょぼいエロゲならこの色数でいいのかも知れないけどさw
    スーファミじゃないんだからさ。分かるでしょ?』
おいら『...』
彼女 『うわー音が汚いwなにこれ?FM音源?だけなの?
    PCMは?MIDIは?使ってないの?』
おいら『....』
彼女 『動きが汚ーい!遅ーい!最低ー!
    スプライトもないのに多重スクロールなんて見栄張って馬鹿じゃないの?
    なにこのカクカクスクロールは?ファミコン以下じゃん!』
おいら 『....』
彼女 『しょうがないからうちでX68000で遊ぶ?
    出たなTwinBee!やファイナルファイトの2Pプレイとか楽しいよ?』
おいら『うん...』

以上実話です。


797 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 21:13:35 ]
1989年のWinしらてとて、386 2.1か。
WinしらてとてのAPIどころか、Winしらてとて自体知る人は限られてただろう。

798 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 21:15:58 ]
間違えた。
WinしらてとのAPIどころか、Winしらてと自体(以下略)

799 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 21:23:15 ]
うちにある最古のAPI本ですらMSC7/VC1.0のリファレンス(93年)だぞ
20年前ってどうよ

800 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 22:17:03 ]
>>796
悔しいがワラタ



801 名前:デフォルトの名無しさん [2009/04/03(金) 22:35:23 ]
女の我侭は異常

おいら『パソコン買ったから遊びに来る?ゲームも出来るよ!』
彼女 『うん!』
おいら『ちょっと待って!俺がゲームのためにこれ買ったと思ってんの?』
彼女 『うん!』
おいら『違うよ、世の中のコンピュータを上手く繋げるソフトを開発するためなんだ
よ(得意げに)』
彼女 『何それ?ニフティとかのこと?幻滅!』
おいら『いや、そんなんじゃないよ。これからは世界中のコンピュータが繋がる
ようになるんだよ。いま目の前にあるコンピュータと、たとえばアメリカのどこかに
あるコンピュータとが繋がって、互いに自由にやり取りができるようになるんだよ。』
彼女 『でも、そんなの電話料金が大変でしょ?何このねずみ色の本体・・・最低。
    大体、ゲームだってショボイRPGやシミュレーションばかりでしょ?
    シューティングは?まともなシューティングはあるの?ないでしょ?』
おいら『だからゲームなんか興味ないんだって。とりあえずフィンランドの人が作った
基本ソフトを移植してみようと思ってるんだ。そのあと、相手のコンピュータの中の
情報をもっと見やすいように表示できるソフトを開発して(注:頭の中には初期のネスケ
のようなソフトのイメージ)、、、あと沢山のコンピュータが繋がるようになってくる
と、外部からコンピュータを勝手に操作されないようにするソフトも需要があると思う
し、、』


802 名前:デフォルトの名無しさん [2009/04/03(金) 22:38:38 ]
彼女 『大体、256色ってなに?しかもデフォルト16色のゲームまであるしw
こんなので満足できるの?しょぼいエロゲならこの色数でいいのかも知れないけどさw
スーファミじゃないんだからさ。分かるでしょ?だいたいアメリカと日本って時差が
あるのよ、どうやって寝てる人とやり取りすんのよ?それに外部から操作なんて、画面
もみないでどうやって操作すんのよ?あんたおかしいんじゃない?』
おいら『...』
彼女 『うわー音が汚いwなにこれ?FM音源?だけなの?
    PCMは?MIDIは?使ってないの?』
おいら『...そうだ、C++のコンパイラからまず作らないとだめだな。。。.』
彼女 『動きが汚ーい!遅ーい!最低ー!
    スプライトもないのに多重スクロールなんて見栄張って馬鹿じゃないの?
    なにこのカクカクスクロールは?ファミコン以下じゃん!』
おいら 『...俺の話も聞いてくれよ。ほんとにいいアイデアなんだって!当たったらデカイよ?』
彼女 『しょうがないからうちでX68000で遊ぶ?
    出たなTwinBee!やファイナルファイトの2Pプレイとか楽しいよ?』
おいら『うん...(今まで誰もおいらの話をまともに聞いてくれないんだよな。どっか間違ってんのかな。。)』


803 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 22:39:50 ]
女の我侭は異常

おいら『パソコン買ったから遊びに来る?ゲームも出来るよ!』
おんな『シネよキモデブ。二度と話しかけんな』

804 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 23:40:26 ]
>803
ついでに此処へも書き込みしないでいいよ。

805 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 23:42:50 ]
コピペとしてはまだまだいけてないな
もっとブラッシュアップしてくれ

806 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 23:48:07 ]
ヘルプです。環境は「mingw32,gtk,fc10+rawhide,wine」
やりたいことは「stdin(fd=0)からCALLBACK関数」で、
順次データを読み出すだけなんですが、私の環境ではうまく動かないです。
止まったり、データがなくなったり。Fedoraの板でサワイでたんですが、
もう諦めモードにはいってきたTT;mingw32環境ある方、試してもらえないでしょうか?
よろしくお願いします。以下、サンプルソース
#include <unistd.h>
#include <stdio.h>
#include <gtk/gtk.h>
int main(int argc,char **argv);
gboolean inputcb(GIOChannel *source,GIOCondition condition,gpointer data);
GIOChannel *gio;
int main(int argc,char **argv){
gtk_set_locale();
gtk_init(&argc,&argv);
gio = g_io_channel_unix_new(0);
fprintf(stderr,"gio(%d,%d)\n",(int)gio,G_IO_IN);
g_io_add_watch(gio,G_IO_IN,(GIOFunc)inputcb,NULL);
gtk_main();
return 0;
}
gboolean inputcb(GIOChannel *source,GIOCondition condition,gpointer data){
char temp;
fprintf(stderr,"gio(%d,%d,%d)\n",(int)source,condition,(int)data);fflush(stderr);
read(0,&temp,1);
fprintf(stderr,"temp(%d)\n",temp);fflush(stderr);
return TRUE;
}

807 名前:デフォルトの名無しさん [2009/04/04(土) 11:28:40 ]
スマポで質問があります。

class MainClass;
class SubClass {
public:
void func2(MainClass* mc) {}
};
class MainClass {
public:
MainClass() : m_SubClass(new SubClass()) {}
~MainClass() {}
void func1() {
m_SubClass->func2(this); // このthisをスマポ(shared_ptr)にする方法はありますか?
}
private:
boost::shared_ptr<SubClass> m_SubClass;
};
int main() {
MainClass m;
m.func1();
return 0;
}

どうかよろしくお願いします。


808 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:31:52 ]
お前どう見てもスマポの使い方判ってないからやめとけ

809 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:39:33 ]
scoped_ptrでいいじゃん

810 名前:デフォルトの名無しさん [2009/04/04(土) 11:39:47 ]
>>808
どうしてですか?
private:でshared_ptrにしたからですか?
なんとか使えるようになりたいんです。
どうかお願いします。




811 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:39:49 ]
>>808
なんつー的確な指摘w

812 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:40:58 ]
どっちかとういうとthisがまったくわかってないじゃないか?

813 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:46:52 ]
なんつーか、『オムレツ作りたいんです! 教えてください!』と言って来た奴が
材料として卵とチェーンソーと蚊取り線香を持ってきたような感じ。
ただ判ってないだけじゃなくて、判ってないままあらぬ方向に突き進んでいる。

814 名前:デフォルトの名無しさん [2009/04/04(土) 11:49:53 ]
色々返事くれてありがとう。
void func2(MainClass* mc) {}
ここなんですが、最初は
void func2(boost::shared_ptr<MainClass>& mc) {}
こう書いてました。でもこれだと呼び出し元でthisを引数にしたとき
コンパイルが通りませんでした。スマポの使い方として、生のポインタは
基本的に全部スマポで置き換えるのが正しいと思うのですが、そうすると
thisはどうやって渡せばいいかわからなかったので。。。

815 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:50:37 ]
オムレツ作りたいんです!
はいいけど、君それ、手に持ってるのゆで卵だよね?

みたいな。

816 名前:デフォルトの名無しさん [2009/04/04(土) 11:51:37 ]
>>813
なにか肝心なもの(フライパン)が抜けてるということですか?


817 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:59:38 ]
とりあえずconst

818 名前:デフォルトの名無しさん [2009/04/04(土) 12:08:37 ]
m_SubClass->func2(boost::shared_ptr<MainClass>(this));
こう書くとAssertionに引っかかるし、、、
これって循環参照になってるから?


819 名前:デフォルトの名無しさん [2009/04/04(土) 12:26:50 ]
プログラム中に可変で動的にメモリ確保をしたいのですが
Animationset m_animset;
という構造体があり、m_anim->GetAnimset();
というメソッドで個数が取得できます
m_animsetを最初から配列で100個くらい作っておけば問題ないのですが
可変で作る場合はどうすればいいのですか?

820 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 12:28:59 ]
>>819
vectorつかう



821 名前:デフォルトの名無しさん [2009/04/04(土) 12:29:56 ]
>>820
ありがとうございますvectorについて調べてみます

822 名前:デフォルトの名無しさん [2009/04/04(土) 12:36:32 ]
ダブルポインタでいいだろ

Animationset **m_animset;

823 名前:デフォルトの名無しさん [2009/04/04(土) 12:57:52 ]
vector<AnimationSet> m_animset;

for(DWORD i = 0; i < m_animectrl->GetNumAnimationSets(); i++) {
m_animset.push_back(i);
m_animectrl->GetAnimationSet(i, &m_animset[i].pAnimSet);
}

という風にしたのですが
'std::vector<_Ty>::push_back' : 1 番目の引数を 'DWORD' から 'const AnimationSet &' に変換できません
とエラーが出ます

メモリを確保するにはどうすればいいのでしょうか・・・・

824 名前:823 [2009/04/04(土) 13:05:05 ]
for(DWORD i = 0; i < m_animectrl->GetNumAnimationSets(); i++) {
AnimationSet anim;
m_animset.push_back(anim);
m_animectrl->GetAnimationSet(i, &m_animset[i].pAnimSet);
}

という風にしたらできました

825 名前:デフォルトの名無しさん [2009/04/04(土) 13:39:00 ]
何が出来たの?

826 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 13:50:42 ]
>>807
enable_shared_from_this使えばいいんでないの?

827 名前:デフォルトの名無しさん [2009/04/04(土) 13:55:39 ]
>>825
欲しい分だけメモリ確保です

828 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 14:20:58 ]
コピコンあるのね把握した

829 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 17:57:33 ]
>>822
ダブルポインタって、ただのポインタのポインタとなにが違うんですか?

830 名前:>>829 [2009/04/04(土) 18:37:39 ]
Ragnarok **m_ragna;



831 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 18:39:38 ]
>>829
その言葉を使う人間ができるプログラマかどうか。

832 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 20:14:39 ]
ダブルポインタ、なんて変な言葉使う人間こそプログラマじゃないだろうな

833 名前:デフォルトの名無しさん [2009/04/04(土) 20:35:11 ]
>>826
enable_shared_from_thisを使ってみましたが、コンパイルは通るけど実行すると
Boostが例外を投げます。

class MainClass;
class SubClass {
public:
template <class T>
void func2(boost::shared_ptr<T>& mc) {}
};
class MainClass : public boost::enable_shared_from_this<MainClass>
{
public:
MainClass() : m_SubClass(new SubClass()) {}
~MainClass() {}
void func1() {
m_SubClass->func2(shared_from_this());
}
private:
boost::scoped_ptr<SubClass> m_SubClass;
};
int main() {
MainClass m;
m.func1();
return 0;
}

834 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 20:42:29 ]
>>833
ああごめん。大元のm自体をshared_ptrに格納するようにしないとshared_from_this()も使えないよ。

835 名前:デフォルトの名無しさん [2009/04/04(土) 20:54:19 ]
>>834
ありがとうございます。
>大元のm自体をshared_ptrに格納する
というのは、
boost::scoped_ptr<SubClass> m_SubClass;

boost::scoped_ptr<SubClass> m_SubClass;
とするということですよね?
そうしてもBoostから例外を投げられます。聞いてばかりですいません。。

836 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 20:59:29 ]
>>835
違う違う、こっち。
int main() {
boost::shared_ptr<MainClass> pm(new MainClass);
pm->func1();
return 0;
}


837 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 21:09:54 ]
>>832
俺、ポッぽインタって言っている
で、3つはぽっぽっぽインタだな

838 名前:デフォルトの名無しさん [2009/04/04(土) 21:10:23 ]
>>836
なるほど、動きました!
thisがboost::shared_ptr<MainClass>でなければならなかったということですね。
本当にありがとうございました。

839 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 21:17:04 ]
C++再考 という本のサンプルコードの一部です、コンパイルすると、下記のエラーが出ます
何処がおかしいのでしょうか?

VS2005 pro SP1
winXP SP3

#include <iostream>

using namespace std;

class Expr_node {
  friend ostream& operator<<(ostream&, const Expr&);
  friend class Expr;

  int use;
protected:
  Expr_node():use(1){}
  virtual void print(ostream&) const = 0;
  virtual ~Expr_node(){}
};

error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません

error C2143: 構文エラー : ',' が '&' の前にありません。

840 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 21:22:15 ]
>>839
friend ostream& operator<<(ostream&, const Expr_node&);
Exprなんて型ないからExprを変数名だと推定してる



841 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 21:28:37 ]
>>839
なぜエラー行を抜いた
class Expr;を前方宣言か?

842 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:05:38 ]
>>814
> スマポの使い方として、生のポインタは
> 基本的に全部スマポで置き換えるのが正しい

どこからそんなアホな理屈が出てきたんだ?

843 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:10:59 ]
全部が全部正しいとは思わないが
C++ Coding Standardsでは「できれば」スマポを使うべきだとしているし
Googleコーディング標準でもスマポがいいねって書いてあるから
まぁ初心者はそのくらいの気持ちでもいいかも。

ただ、だからといってboostを使うのではなく
一度は自前で参照カウンタつきのスマポを設計してみる必要があるんじゃないだろうか。
ちんぽちんぽ。

844 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:16:10 ]
Accelerated C++でもネタになってるな>スマポの自作

845 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:17:31 ]
>>843
貴方の自前の参照カウンタつきのスマポ見せて、まんこ、まんこ

846 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:30:40 ]
>>843
>807 の例は参照に置き換えれば済むだろう。

所有権の移動や共有のためのポインタ引数なんてそんなに多いとは思わない。

847 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:33:15 ]
>>846
ああなるほど。
確かに、参照が使えるところには
ポインタよりも参照を使うべきだというのには同意。

848 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:33:25 ]
もうね、スマポ

849 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 23:01:56 ]
>>840
>>841
スマンカッタ
大きな勘違いというか、錯誤していた
前方参照も、後方参照もあったもんじゃない、一つのincludeファイルに、全てのクラスを書いて、混乱してしもうた
もちついて、1ファイル、1クラスに書き直して、本の順番でヘッダーを書いて、規則通り読み込ませたら
スコーンと一発でコンパイルできてもうた、全部晒してもいいが、長くて迷惑になるので、止めておくが
多少の誤植や、ミススペルは、このクラスの本になると、いたしかないかなと、思う最近なのですが、丁寧に〜.h、〜.cppはこれです
なんて書いてないので、仕方ないかなと思ったりする、内容は良い本なのだけどね

850 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 23:13:03 ]
今写経していた、C++再考 第8章 オブジェクト指向プログラムにもスマートポインタの原型のような、技法が載っていたよ
コピーコンストラクタで、カウンタを1増やし、デストラクタで-1してカウンタが0になったら、
オブジェクトを破棄するという、実に巧妙な仕組みだね



851 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 00:35:28 ]
コピーコンストラクタ....ってなんだっけ。忘れちゃったよ、だめぽ

852 名前:デフォルトの名無しさん [2009/04/05(日) 02:50:30 ]
関数にクラスを値渡しするときに呼ばれるやつ






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<258KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef