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


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

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



1 名前:デフォルトの名無しさん [2007/09/27(木) 11:39:04 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.42【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1188748806/l50
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm


232 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 23:19:59 ]
>>230
自分でメモリマップを実装するのは困難だろうけど使うだけなら簡単
#include<windows.h>
#include<stdio.h>

#define IS_PARENT // ←この行の有りと無しでコンパイルする
#define MEMMAP_ID "maptest"

int main(void){
HANDLE hmap;
char *ptr;

#ifdef IS_PARENT
hmap=CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 256, MEMMAP_ID);
if(hmap!=NULL && GetLastError()==ERROR_ALREADY_EXISTS){
CloseHandle(hmap);
return 1;
}
ptr=MapViewOfFile(hmap, FILE_MAP_WRITE, 0, 0, 256);
ptr[0]='\0';
while(scanf("%255s", ptr)==1) ;
#else
hmap=OpenFileMapping(FILE_MAP_WRITE, FALSE, MEMMAP_ID);
if(hmap==NULL) return 1;
ptr=MapViewOfFile(hmap, FILE_MAP_WRITE, 0, 0, 256);
while(getchar()!=EOF) printf("%s", ptr);
#endif
UnmapViewOfFile(ptr);
CloseHandle(hmap);
return 0;
}

233 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 23:20:05 ]
>>230
size_tのような64ビットと32ビットで大きさの違うデータ型を読み書きしようとしない限り問題ない。
32ビットプロセス同士でやるのと同じ。

234 名前:202 [2007/10/04(木) 00:24:19 ]
>>232, 233
ご返信ありがとうございます。
今メモリ共有を行いたいのは、unsigned char型の配列です。
この場合も普通に232さんの教えくださったサンプルで問題ない
という認識でよろしいでしょうか?

235 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 00:30:36 ]
>>234
なぜ、やってみないのでしょうか?

>>232 はただの動作確認のためだけのサンプルです
サンプルで問題がないかどうかは使い方によります
使用しているAPIについて*自分で*調べて下さい

236 名前:202 [2007/10/04(木) 00:35:11 ]
>>235
ご返信ありがとうございます。おっしゃるとおりです。
自分で調べずにすぐに質問してしまいました。
実装にトライします。
ありがとうございました。

237 名前:デフォルトの名無しさん [2007/10/04(木) 01:12:29 ]
>>103
enable_if 使う初心者w



238 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 10:11:51 ]
そんなこと言われても、mplなんて使いこなせないんで…

239 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 10:42:45 ]
stdのcoutやcinはヘッダを見るとextern宣言されてますが、定義はどこで行われているんでしょうか?

240 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 11:02:01 ]
>>239
標準ライブラリのソース内でしょう。



241 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 11:11:59 ]
C++はヘッダファイルではなくヘッダをインクルードしますが
ヘッダファイルとヘッダの違いって何ですか?
ヘッダの中でヘッダファイルがインクルードされてる?

242 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 11:18:39 ]
>>241
ほとんどのコンパイラの実装ではヘッダといえばそれに対応するファイルが
用意されているので、ほとんど同義。ただしコンパイラは <stdio.h> というヘッダを
ファイルとして実装する必要はなく、規定された動作さえすればいい。これは
C でも C++ でも同じ。

で、一般的にヘッダファイルといえばヘッダのように動作するユーザー作成の
ファイルも含む。

243 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 11:34:30 ]
>>242 ものすげえわかり易くてワロスw

244 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:10:53 ]
<iostream>ってヘッダファイルぢゃないの?

245 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:13:19 ]
>>244
C++ の標準ヘッダではあるけど、ファイルであるかどうかはコンパイラの実装しだい。

246 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:17:38 ]
>>242
なるほど。ということはユーザー定義のヘッダファイルを
#include "hoge.h" とした場合でも、規格上はhoge.hの実装
がファイルでなくてもよいということですか?

247 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:19:34 ]
>>245
例えばファイルではないヘッダを使っているシステムってあるのですか?
LinuxとかWindowsのコンパイラの場合、OSがファイルシステムを持っているから
事実上はファイルとして実装されてるということになるのですかね?

248 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:20:31 ]
>>246
いいんじゃねーの。
実際プリコンパイルドヘッダが用いられるときなんかはhoge.h以外の
とこから情報取ってきてるわけだし

249 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:23:16 ]
privateな仮想関数って意味ありますか?
派生クラスで上書きしても呼び出せないのに。

250 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:25:05 ]
>>248
プリコンパイルドヘッダというのはコンパイル済みヘッダということだと
思うので、バイナリファイルを覗きに行くのですかね?



251 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:25:12 ]
delphiのinterface節/impliments節ってよくできてると思う

252 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:27:47 ]
>>249
Non virtual interface と呼ばれる手法で使われる。
似たような話でデザインパターンの Template method とか。

253 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:32:52 ]
>>250
ただのファイルにするかDBにするかインターネットからとってくるかは、
コンパイラ作成者の自由なんじゃないの?規格も神も制限してないんだから。

そんなの俺に聞いてどう答えて欲しいの?

254 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:39:36 ]
>>249
派生クラスから呼び出せなくても、基本クラスから上書きバージョンを呼び出すことは出来る。

255 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 15:37:19 ]
>>252
>>254
class B
{
public:
void mf(){ privmf(); }
private:
virtual void privmf();
};

class D : public B
{
private:
void privmf();
}

int main()
{
D objd;
objd.mf();

return 0;
}

このプログラムでobjd.mf() 内で呼び出される関数がB::privmf()ではなく、
D::privmf()になるのですがなぜですか?
ポインタか参照に対して呼び出されたときにポリモルフィズム機構
が働くと思うのですが。
void mf(){ privmf(); }はvoid mf(){ this->privmf(); }と同じことですが、
このthisポインタが指している実際のオブジェクトの型がクラスDの
場合(上のプログラムの場合)はD::privmf()が呼ばれるということで
しょうか?

256 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 15:59:23 ]
そのとおり

257 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 16:11:28 ]
>>256
ポインタthisに対する多態性ということですか。
objd.mf() を実質 mf(&objd)と考えて this と &objd
が等しいものを表すため、クラスDの仮想関数
テーブルが参照され、そこに登録されている
D::privmf()が呼ばれるということで納得できました。


258 名前:BOLT [2007/10/04(木) 18:19:42 ]
自分、C++の初心者です。以後お世話になると思いますがよろしくお願いします。
ccplus.blog121.fc2.com/ちなみにプログラミング系のブログやってます。
よろしければ見に来てください。

259 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 18:22:29 ]
クソショボイブログだなw
誰も見ないしとっとと閉鎖しろよ

260 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 18:42:04 ]
誰も見てくれないからこそ続けるんだ
最低1年くらいは毎週更新できるように努力しる



261 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 19:31:14 ]
C++が全角なのが気にくわない

262 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 19:58:05 ]
「全角ってなんですか?」
「"いわゆる全角"のことではないでしょうか」

263 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 20:40:46 ]
いいえ、焼き肉屋のことです。

264 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 20:56:58 ]
おまえら向上心のある奴はやさしくしてやれよ

265 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 21:34:20 ]
どこぞのかわいがりよりはずっとやさしい。

266 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 22:32:21 ]
可愛がってやらないと強くならないぞ!

267 名前:デフォルトの名無しさん [2007/10/04(木) 22:37:51 ]
C++でCSVからデータを読み込もうとしています。
普通は1文字ずつ変数に入れていくと思うのですが、
プログラム側で #define FILENAME "a.txt" と定義しておき、
CSVに記述された FILENAME を "a.txt" として読むことはできるのでしょうか。
よろしければお力添えをお願いいたします。

268 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 22:45:46 ]
"FILENAME"があったら適当に置換でもしとけばいいじゃん

269 名前:267 [2007/10/04(木) 23:04:23 ]
返信ありがとうございます。説明が不足していました。
defineが他にも多数あり、今後外部ファイルに定義を移して
defineの名前も変更できるようにするため、いい方法がないかと思っています。
FILENAME 1個だけなら置換で問題ないですね。

270 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 23:06:54 ]
CreateProcessでWindows Services for UNIXのunzipコマンドを使うのは可能ですか?



271 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 23:07:08 ]
>>269
よくわからんけど、私的なツールなら cppでプリプロセスすればいいんじゃない?


272 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 23:19:35 ]
>>270
createprocess 外部コマンド
で検索するぐらいしてから来れば?


273 名前:267 mailto:sage [2007/10/04(木) 23:28:39 ]
>>271
すみません、cppでプリプロセスの理解ができませんでした。
私的ではなく会社で使います。今日はこれ以上つなげないので調べてからまた来ます。

274 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 23:29:59 ]
クラスのメンバ変数に参照型を追加した場合の初期化の
方法はこれが正しい書き方でしょうか?

class Hoge{
private:
int &Test;
public:
Hoge(int &T):Test(T){}
~Hoge(){}
}

275 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 23:32:00 ]
いえす
一番最後にセミコロン無いけど

276 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 23:35:30 ]
>>267
その程度のこと会社で聞けよ
きみの会社の客はかわいそうだな


277 名前:275 mailto:sage [2007/10/04(木) 23:38:58 ]
>>275
どうも。
参考書にもググっても全く見つからなかったので不安が解消できました。

278 名前:274 mailto:sage [2007/10/04(木) 23:39:49 ]
>>277 は名前ミス。失礼。

279 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 07:21:23 ]
質問です。

pure virtual な関数て、基底クラスで

class ClassA
{
public:
virtual void Test(void) = 0;
};

こんな感じに定義するのは普通なのですが、さっき間違って

class ClassA
{
public:
virtual void Test(void) = 0
{
}
};

と、中身を定義したら、コンパイルが通りました。気になったので、派生させてみて、
派生先の Test 関数で、ClassA::Test を呼んだら、呼べました。

pure virtual な関数は、実体を作れないと思いこんでいたのですが、それは間違いなのでしょうか?

vc++8.0 sp1
xp sp2

280 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 07:49:32 ]
>>279
それは間違いです。

でもその書き方ってできないんじゃなかったっけ。
class ClassA{
public: virtual void Test(void) = 0;
};
void ClassA::Test(void) { }
って書く必要があったような・・・
記憶違いかね。



281 名前:デフォルトの名無しさん [2007/10/05(金) 12:29:52 ]
>>280
VC++はそういう書き方ができるんじゃなかったか。
pure virtualなデストラクタの定義を書くのを楽にするための、MSの配慮というか
お節介だったと思うが。


282 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 21:29:19 ]
まあ勘違いしやすい所だよな
×pure virtual な関数は、実体を作れない
○pure virtual な関数を持つクラスは、実体を作れない

283 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 22:32:31 ]
printf 系で "%10s" と指定している箇所が全て 12 に変更されることになって
数値を定数化してフォーマットに埋め込めないものかと思っているんですが、
#define した定数がそのまま表示されたりと期待した動作が得られません。

どなたか知恵を貸して頂けませんか。
(そもそも文字列終端を付けられたらこんな苦労もなかったんですけど・・・)

284 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 22:35:09 ]
#define FMT "%12s"

printf(FMT,"hogehoge");

じゃダメなの?

285 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 22:39:10 ]
こんな書き方も出来るかもー!!
printf("%*s", 10, "hogehoge");
printf("%*s", 12, "hogehoge");


286 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 22:40:16 ]
#define FMT "12"
printf("%" FMT "s", "hogehoge");

とか

287 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 22:47:38 ]
std::mapでキーワードを予め指定しておいた予約語以外は受け付けないように出来ますか?


"hoge""hage""hoji""haji" // 何らかの方法で指定した予約語

std::map<std::string , std::string> strmap

strmap["hoge"] = "これは成功する";

strmap["miss"] = "これは失敗する";


こんな感じで

288 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 22:49:15 ]
C++で下みたいな方法ってよろしくないですかね・・・
配列に入れた座標データを,オペレータオーバーライドを使って計算したいんですが
要素毎にコンストラクタ呼び出しは冗長になるので
問題点が判らないので指摘をお願いします

#include <stdio.h>

float data[] = {1., 2., 3., 4., 5., 6.};

class Data
{
public: // use default ctor
 float x, y, z;
 Data& operator+=(const Data &right)
....省略...
};

int
main()
{
 Data *ptr;

 ptr = reinterpret_cast<Data*>(data);

 printf("%f %f %f\n", ptr[0].x, ptr[0].y, ptr[0].z);
 printf("%f %f %f\n", ptr[1].x, ptr[1].y, ptr[1].z);

 return 0;
}


289 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 22:53:53 ]
>>287
勝手に追加されちゃうから無理じゃね?

std::mapを包含したクラス作ってインデクサの中で例外投げるとかしか思いつかない

290 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 23:00:43 ]
>>289
stringの方をラッピングするのもアリじゃね?
書く量としてはその方が少なくなりそう。



291 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 23:00:58 ]
>>289
そうですか、残念
ありがとうございました

292 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 23:15:10 ]
>>288
>コンストラクタ呼び出しは冗長
といってもinlineであれば実質気にするほど変わらない気がする。

Dataがfloatピッタリ3つ分で収まるという保証があるのだろうか?データメンバーが後から追加されたりする可能性は?
virtualな関数をもつとサイズが変わったりする様だし、危険を伴う気がします。

293 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 23:36:17 ]
assert(sizeof(Data) == sizeof(float[3])); を書いとくとか

294 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 23:43:21 ]
>>292,293
Thx
対象がRAWなベタデータなので簡素に出来ないかと思ったのですが
素直な書き方をした方がよさげですね



295 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 03:46:16 ]
>>284-286
フォーマットって普通に文字列なんだな。
>>285の方法は知らなかった。参考にさせて貰います。
色々試してみたけど、やりたいこともこれで出来そう。 ありがとね。

296 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 03:51:51 ]
>>288
× オーバーライド
○ オーバーロード

297 名前:デフォルトの名無しさん [2007/10/06(土) 16:19:13 ]
wcout はバグがありますか?
wcout を使うのは避けてますか?

WindowsXP Home + BCC

298 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 17:10:25 ]
char *hogehoge(){
return "hogehoge";
}

文字列リテラルの場合、変数と違って関数を抜けても有効なままなんでしょうか?

299 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 17:11:10 ]
有効なままです

300 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 17:11:56 ]
リテラル返すならconst char*にした方がいいかも



301 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 18:41:45 ]
inline const char *&

302 名前:デフォルトの名無しさん [2007/10/06(土) 18:45:41 ]
&はイラネーだろ
なんか違うのか?

303 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 18:47:11 ]
inline const const char *&

304 名前:デフォルトの名無しさん [2007/10/06(土) 18:52:50 ]
C++超初心者です。
今まで動いていたのに、今日コンパイルすると、
(1029) invalid format string conversion
と表示されてしまいます。

原因が分からず、どのように変えたらよいのかも分かりません。
ご教授宜しくお願いいたします。
すごく長いプログラムなので、関係してそうなところだけ書き込んでます。


FILE *ottq;
ottq = fopen("ottq.dat", "w");
double chir,l
l=20.05e-3;
chir=0.0e-5;
fprintf(ottq, "l(m)=\t%le\t\n",l);
fprintf(ottq, "chir(%)=\t%le\t\n",chir*100.0);  ←1029行目ここです。
fclose(ottq);

305 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 18:54:02 ]
%→%%

306 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 18:54:48 ]
>>304
エラーメッセージのまんまだろ。

307 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 19:02:37 ]
こえぇ
お前みたいなのが扱うもんじゃねぇだろ

308 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 19:09:25 ]
変数名きめぇwwwww






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

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

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