[表示 : 全て 最新50 1-99 101- 201- 301- 2chのread.cgiへ]
Update time : 02/14 10:29 / Filesize : 83 KB / Number-of Response : 315
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

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



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

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

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

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

232 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 21:54:00 ]
>>231
それも自分で納得できるように理解したいのですが
今のスキルじゃちょっときついのでC言語の本をもう一度読み返してからチャレンジしようと思います。
色々ありがとうございました。

233 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 21:57:13 ]
>>232
そうですか。

構造体へのポインタを使えば「データそのものを書き換えてくれ」と
委譲できるし、構造体を返すのは通常オーバーヘッドが大きいので
Cの流儀としてもあまりお勧めできない。

だから構造体へのポインタさえ理解すれば大抵の場合はそれでいいと思う。

234 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 22:03:45 ]
効率を無視してポインタを使わずに構造体そのものを返すという事になると
だいたい次のようなプログラムになると思う。
これが当初の『配列を関数から返す』に一番近い答えになるだろう。

#include <stdio.h>

struct Point {
double L1Point[2];
double L2Point[2];
double L1Slope;
double L2Slope;
double num[2];
};
struct Point lineIntersect(struct Point pt1);
struct Point pt = {{10, 20}, {20, 44}, 10, 3, {3, 20}};
int main(void)
{
struct Point ans = lineIntersect(pt);

printf("答えは(%f %fです\n", ans.num[0], ans.num[1]);

return 0;
}
struct Point lineIntersect(struct Point pt1)
{
pt1.num[0] = (pt1.L1Slope * pt1.L1Point[0] - pt1.L2Slope * pt1.L2Point[0] + pt1.L2Point[1] - pt1.L1Point[1]) / (pt1.L1Slope - pt1.L2Slope);
pt1.num[1] = pt1.L1Slope * (pt1.num[0] - pt1.L1Point[0]) + pt1.L1Point[1];
return pt1;
}

235 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 23:50:41 ]
catchで受け取る型をテンプレートにしたいのですが無理ですか?

//こんなの
template<class T>
} catch(T Obj) {
〜〜

236 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 23:58:59 ]
むりだお。 最低限共通の基底クラスから派生させるとかしないとだめ。
もう少し具体的に何がしたいのかを書けば誰か親切な人が考えてくれるかも。

237 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 12:14:24 ]
クラステンプレートか関数テンプレートの定義内で、テンプレート引数型でcatchすることは出来るんじゃない。
何がしたいのか分からないのでこれが解決になるのかは分からんが。

238 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:42:47 ]
class Base{};
class A:public Base{};
class B:public Base{};
みたいな感じで、
class A内で、Baseの値を変えたとき、
class BのBaseの値も変わっているようにするにはどうすればいいのでしょうか?

239 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:45:58 ]
>>238
そんなことをするくらいなら、class Bがclass Aを継承すればいいんじゃね?

240 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:48:58 ]
Baseが基底となる全クラスのインスタンスで値を共有したいならBaseの値をstaticにすればいい。



241 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 16:00:19 ]
>>238
宣言と実態をごっちゃにしていそうな気がするので、何をしたいのか詳しく。

242 名前:デフォルトの名無しさん [2008/08/15(金) 16:00:56 ]
>>238
メンバをすべてstaticにしたらかっこいいYO!

243 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 16:10:33 ]
>>242
シングルトンの方が見通しが良くね?

244 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 16:23:28 ]
無理しないでグローバルな構造体でいいじゃん^^;

245 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 16:30:15 ]
>>244
アクセッサは欲しい

246 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 18:35:18 ]
ソースコードの書かれたテキストを読んで、
使われている変数や関数を解析するパーサみたいなものが作りたいのですが、
こういうのって一行まるごと読んで正規表現で抜き出したりって方法でいいんでしょうか。

効率的といいますか、定石みたいなのがあれば教えてください。

247 名前:デフォルトの名無しさん [2008/08/15(金) 18:39:40 ]
一行づつで問題が発生しないならそれでいいんじゃね

248 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 18:40:17 ]
ひょっとしてCですか?

249 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 18:50:45 ]
ドラゴンブックに

250 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 18:59:10 ]
yaccとかbisonを使う方向の方が幸せになれそうだが



251 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 19:00:24 ]
>>246
プリプロセッサに通した後のファイルを読むようにすると随分と楽になる

252 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 19:05:00 ]
>>246
Cのソースコードを正規表現でパースすることは原理的に不可能であることがわかってる。
厳密でなくていいならどうとでも出来るけど、
そんなことを考えるより既存のライブラリやツールで処理した方がてっとりばやい。
ctags とかではいかんのか?

253 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 13:52:50 ]
配列のポインタから中身サイズを取得する方法ありますか?
sizeof()だとポインタそのもののサイズが取得される

254 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 13:53:34 ]
>>253
ないです。

255 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 13:57:02 ]
sizeofnakami()

256 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 13:57:18 ]
間違ってるかもしれないけど、
呼び出した関数の中とか、現在のスコープにおいてその配列の要素数が
わからない場所でsizeofを使ってもそのポインタのサイズしか得られない。
要素数はなんらかの方法で渡さなきゃならない


257 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 14:19:00 ]
>>253
環境依存でよければあるよ

258 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:05:41 ]
わたし環境依存それわからなーず

259 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:39:58 ]
環境依存・・・
それは標準の方法では決してできないことを平然とやってのける魔法の道具
しかし環境が変わると途端に動かなくなる諸刃の剣

260 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:40:35 ]
if( ! a=Test() )
代入かつ否定 はこれでおk?



261 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:47:01 ]
不安ならなんでも括弧つけとけ、損はしない

262 名前: [―{}@{}@{}-] デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:47:44 ]
>>260
ダメ。

代入をカッコで囲んでそれを否定する。


263 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:54:21 ]
把握

264 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 19:16:54 ]
関数へのポインタの配列を動的に確保するにはどうすればいい?
int size=10;
void(**ppfunc)(void);
ppfunc=new void(*)(void)[size];
とかだとコンパイルが通らない。typedefするしかないのかね

265 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 19:55:53 ]
>>264
C的に考えても、(void **) の意味がよくわからないのですが。(void *) でだめですか?

266 名前:265 mailto:sage [2008/08/16(土) 19:57:42 ]
ごめんなさい。勘違いしていました。


267 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 20:10:52 ]
これでコンパイル通ったよ

#include <iostream>

void func1();

int main()
{
void (**func)();

func = new (void (*[10])());
func[0] = func1;
(func[0])();
}

void func1()
{
std::cout << "func1()" << std::endl;
}

268 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 20:57:19 ]
>>267
new void(*[10])();が通らなかったので見逃してた。
なるほど、括弧で囲めばいいのか。ありがとう。

269 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 10:52:00 ]
読み辛いし、普通にtypedef使おうぜ・・・

270 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 14:45:50 ]
知っておくのも損は無いだろう。typedefで省略して良いのは基本を理解していてなぜtypedefが必要なのかを知っている者のみ。



271 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 16:09:51 ]
>>270
基本は new T[N] で、この書式に合わせるためには typedef が必要だとわかっている。
typedef を使わない書き方を知る必要は無いよ。

272 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 17:05:16 ]
typedefを使わないと理解出来ない馬鹿は去れ。

273 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 17:18:44 ]
そりゃtypedefを使わない奴は馬鹿だが関数宣言における他演算子と比べた時の優先順位を理解できない奴も馬鹿だろ

274 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 17:28:27 ]
人の事はどうでもいいから自分の恥を知れ。

275 名前:デフォルトの名無しさん [2008/08/17(日) 17:37:46 ]
初心者歓迎ってスレタイに書いてあるのに馬鹿は去れとか

276 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 17:38:24 ]
ageて言うほど悔しかったかワロスwwwwwwwww

277 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 17:39:14 ]
来るものは拒まず、馬鹿は去れ

278 名前:275 mailto:sage [2008/08/17(日) 17:39:44 ]
>>276
sageチェック外す癖が付いてたんだよ悪かったな

279 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 17:41:09 ]
馬鹿に限って煽りをスルーできないんだよな( ´ー`)y−~~

280 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 17:41:54 ]
( ゚Д゚ )y−~~



281 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 17:57:51 ]
>>272-280
なんという夏休み。

>>264
今日び配列newなんてやめておいた方が良い。
std::vectorか、boost::arrayあたりを。
それにC++的には関数ポインタより関数オブジェクトを。

282 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:05:15 ]
typedefがよくわかりません
教えてください
釣りではありません
本当です

283 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:06:12 ]
どう分からないんだ

284 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:07:51 ]
>>281
嫌だね。
人にプログラミング上の事まで強制される謂われはないし

285 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:09:09 ]
int a; //aという変数の宣言
typedef int a; //変数宣言の形にtypedef修飾子をつけるとaという型の宣言になる

286 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:12:11 ]
typedefのあとに変数宣言の形とか考えたこともなかった
そんな分かりにくい説明なんか読むんじゃありません

typedef 元の型 新しく宣言する型;

これで分からなかったらもうどうしようもない

287 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:22:05 ]
ちなみにtypedef修飾子は他の修飾子がそうである様に
元の型 typedef 新しく宣言する型;
という元の型の後の修飾でも有効

288 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 19:56:26 ]
typedefがわからんて…

289 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 20:44:19 ]
質問です。C++のクラスのメンバに、自身のクラスのメンバ関数ポインタ、
あるいは他のクラスのメンバ関数ポインタを保持させ、
呼び出すことは可能でしょうか?また、それはどのような方法でしょうか?

次レスに、実験したソースを付けます(インデントは全角スペース)。
プログラムの意図は、

・自身のメンバ関数ポインタによる自身のメンバ関数の呼び出し
・同じ変数による、他のクラスのメンバ関数ポインタによる他のクラスのメンバ関数の呼び出し

の二つです。
多少、形が変わっても構いません。
ご存知の方、よろしくお願いします。

290 名前:289 mailto:sage [2008/08/17(日) 20:45:42 ]
#include<stdio.h>
class object1{
public:
  void (object1::*PFunc)(void);
  void Func1(void);
};
class object2:public object1{
public:
  void Func2(void);
};
void object1::Func1(void)
{
  printf("1\n");
}
void object2::Func2(void)
{
  printf("2\n");
}
int main(void)
{
  object1 *Obj=new object1;

  Obj->PFunc = &object1::Func1;
  (Obj->*PFunc)();//error C2065: 'PFunc' : 定義されていない識別子です。

  Obj->PFunc = (void (__thiscall object1::* )(void))&object2::Func2;
  (Obj->*PFunc)();

  return 0;
}



291 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 21:17:24 ]
>>290
何がしたいのかいまいちわかんないけど、(Obj->*Obj->PFunc)();じゃね?

292 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 22:30:40 ]
->*が出てくるときはまず設計ミス

293 名前:289 mailto:sage [2008/08/17(日) 22:40:10 ]
>>291
動きました。ありがとうございます。
-> と ->* は全く違うんですね…。

>何がしたいのか
まず、あらかじめ別の型で動的確保した領域で、線形リストをクラスで組んでメンバ関数を使おうとしました。
しかし、その場合、仮想関数はなぜか使えませんでした。
仮想関数を呼び出すとコンパイラはエラーを出さないんですが、実行時に停止するんです。
そこで、関数ポインタを入れ替えることにし、このような形になりました。
かなり横着している気はしますが…。


294 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 22:47:11 ]
__thiscallとか移植性ないんだからやめろよ

295 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 22:48:29 ]
boost::ptr_funでも使ってポリモーフィズムすりゃいいんじゃね?

296 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 22:49:16 ]
boost::ptr_vectorだったorz

297 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 14:43:56 ]
#include <iostream>
void (**(**func)())();
void func3();
void func4();

int main()
{
void (**(func1()))();
void (**func2)();

func = new (void (**(*[1])())());
func[0] = func1;
func2 = func[0]();
func2[0]();
func2[1]();}
void (**(func1()))(){
void (**func)() = new (void (*[2])());
func[0] = func3;
func[1] = func4;
return func;
}
void func3(){
std::cout << "func3() " << std::endl;
}
void func4(){
std::cout << "func4() " << std::endl;
}

298 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 20:58:41 ]
>>297
これ何?

299 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:01:21 ]
自分で考えろカス

300 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:06:06 ]
いやそういう意味ではなくて、何の質問もないのに関数への
ポインタとか関数へのポインタを返す関数へのポインタとかの
ソースをいきなり貼られてるのは何の意味があるのかと思って。



301 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:19:30 ]
それなら「ない」

302 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:20:20 ]
>>297
なんか言えよ

303 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:22:36 ]
void (**(func1()))();

こんな関数のプロトタイプ宣言初めてみたぞ。
まあ書けばいくらでも複雑に書けるんだろうけど、
デザパタの生成パターンでもこんな書き方はしないし。

304 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:56:09 ]
何故括弧を一つ増やしたし

305 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 07:30:48 ]
c/c++で開発経験者にお聞きしたいのですが、
コボルみたいにコードインスペクションは現場でやりますか
また、ソースを読み上げたりハードコピーにマーカーでチェック、机上チェックなんかも
やったりしますか?

306 名前:デフォルトの名無しさん [2008/08/19(火) 07:33:51 ]
BSD socketでsendしてerrno:9が帰る場合考えられる原因ってなんなんでしょうか。
char *c;
strcpy(c,str);
printf("Sending:%s¥n",c);
int checker=send(socketID, c, strlen(c), 0);
if(checker == -1){
NSLog([NSString stringWithFormat:@"Send Error:%d",errno]);
return 2;
}
return 0;

307 名前:306 [2008/08/19(火) 07:37:57 ]
Obj-CのNSLog();使ってエラー表示させてるけどそこは気にしない方向でお願いします。
NSLog([NSString stringWithFormat:@"Send Error:%d",errno]);

printf("Send Error:%d¥n",errno);
とほぼ同じです。

308 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 07:44:27 ]
>>306
#define EBADF 9 /* Bad file number */
ならsocketIDが無効
socket( )の戻り値は確認してる?


309 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 07:54:04 ]
>>306
数値の意味がわからないなら文字列にすれば
NSLog([NSString stringWithFormat:@"Send Error:%s", strerror(errno)]);


310 名前:306 [2008/08/19(火) 08:15:49 ]
>>308
ありがとうございます。
socket()の戻り値は確認していて、connect()及びrecv()は問題なく行えています。
socketIDがガベージコレクションで解放されちゃったのかもしれないのでその辺りで探ってみます。

>>309
文字列にできたんですか。ありがとうございます。



311 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 09:07:33 ]
関係ないけど7bit asciiのみなら
NSLog(@"format",...);
って書けた気がする。

312 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 23:22:50 ]
>>305
プロジェクトの性質によって色々だとは思うが、
絶対ないと断言できるのは「読み上げ」だな。
やれるもんならやってみろ。

313 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 23:39:10 ]
>>305
>ソースを読み上げたりハードコピーにマーカーでチェック、机上チェック
そんなアナクロなこと、COBOLでだってやりませんよ。

314 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 23:53:35 ]
>>305
俺は「コードレビュー」はやったことはある
紙の無駄だけどプリントアウトしたソース使って

ただ、(若手の)教育と(協力会社さんなどの)スキル把握(もちろん
悪いところは直してもらう)が主な目的だったんで、約束事として
つねにやってたわけじゃない






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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