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


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

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



1 名前:デフォルトの名無しさん [2007/06/03(日) 22:33:55 ]
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sage禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.37【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1178432985/l50
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm


185 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 19:37:02 ]
>>183
とりあえずnullmoji[2]に'\0'を入れてstrcmpをしたら正常に動作しました。
ありがとうございました。

>>184
そういう課題なんです・・・

186 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 19:42:50 ]
C++でクラスを書くとき、Javaの書き方に合わせようと思って、

#define Public public:
#define Private private:
#define Protected protected:

って定義して、んでヘッダファイルを

Public int getNum();
Public void setNum(int num);

みたいに書いてみたんだけど、これと似たようなことをやる人は多い?
それとも明らかにC++の常識からは外れた書き方?

187 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 19:46:56 ]
他言語を真似るマクロは愚の骨頂だと俺は思う

なにより読みにくいし、なら java でかけよと言いたい

188 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 19:52:34 ]
>>186
m9( ´,_‥`)プッ

189 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 19:56:46 ]
つか
Javaってpublicだのprivateだのの先頭、いつから大文字で書くようになったんだ

190 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 19:57:08 ]
>>186
PASCAL風に
#define BEGIN }
#define END }
なんてやられたソースをおまえは許せるんだな?

191 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 19:59:41 ]
Bourne shellの作者のSteve BourneがALGOL風のトンチキなマクロを定義して
シェルを書いたのは(勿論悪い意味で)有名

192 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 20:20:55 ]
>>187
関数一覧をカテゴリ別に並べて書きたくて……

>>188
(´・ω・`)

>>189
いや先頭が小文字のpublicとかは予約語なんで

>>190
……ええと、すいません

193 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 20:23:51 ]
マクロなんだから予約語も糞もないだろ



194 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 20:26:05 ]
#define for if(0); else for

とかできるんだぜ。

195 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 20:29:36 ]
>>186
やるな。
理由は色々あるが、一番実害があるのはこんなところか。

#define public public:

としたとして、

class A {
public void foo();
void bar();
};

の bar のアクセス指定がどうなるか考えてみよう。
これは public だ。

だが、見た目から直感的に感じるのは private だろう。
こういう齟齬が発生するから、してはいけない。

196 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 20:29:41 ]
>>192
あほすぎw

197 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 20:37:01 ]
>>194
for (int i=0; ...) {
 // スコープ1
}
// スコープ2

でi がスコープ2 まで有効な特殊系(VCだなっ) を回避する常套句ですな

198 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 20:41:40 ]
ふるっ

199 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 22:09:01 ]
特殊っていうか、昔はそれで仕様通りだったと思う。

200 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 23:01:19 ]
そういえばVisual C++で.NETアプリケーションのウィザードを使うと、
public: void Hoge()なんてコードを出していた気がする

201 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 23:03:36 ]
>>199
それが仕様だったかも知れないが、規格にはなっていない罠。

202 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 23:06:05 ]
ふるーい規格の話だけど、
それでもなってないの?

203 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 23:07:51 ]
ARMやドラフトを規格だと言うのなら
規格になっていたと言うがいい



204 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 23:26:13 ]
なるほど。ドラフト段階でしかこの仕様はなかったわけか。

205 名前:178 mailto:sage [2007/06/07(木) 23:43:26 ]
>>178です。とりあえずサンプルってことで
system("cd c:\\java");
system("java HelloWorld");
で実行したみたのですが、
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld
と出てしまいます。普通にコマンドプロンプトでcd c:\javaとjava HelloWorldを打ち込んだときは
正常に動作するのですが、何かsystemでやるときに特別に何かしなければいけない事があるのでしょうか?

206 名前:178 mailto:sage [2007/06/07(木) 23:49:32 ]
というよりも、system("cd c:\\java");のあとに
system("dir")を実行したら、javaディレクトリが表示されずに、
プロジェクトのディレクトリが表示されるのですが・・・

207 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 23:52:22 ]
system("java c:\\java\\HelloWorld");じゃ駄目なの?

208 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 23:52:57 ]
それぞれのsystem呼出は、細切れになるから
1度のsystem呼出で済ませるようにしろ
絶対パスで指定するとか、バッチファイルを作ってそれをsystemで呼ぶとか

209 名前:178 mailto:sage [2007/06/07(木) 23:56:35 ]
一回ごとに細切れなんですか・・・。結構面倒ですねw
とりあえずsystem("java c:\\java\\HelloWorld");で実行してみたのですが、やはり
Exception in thread "main" java.lang.NoClassDefFoundError: c:\java\HelloWorld
と出てしまいます。う〜ん・・・

210 名前:178 mailto:sage [2007/06/08(金) 00:06:01 ]
system("javac c:\\java\\HelloWorld.java");
は普通に実行できてるっぽいです。javaコマンドだけ何で出来ないのかな;;

211 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 00:12:18 ]
カレントに存在する必要があるのかな?
それとも区切り文字か。
ってことで、system("cd c:\\java; java HelloWord")とsystem("java c:/java/HelloWordl")を試して味噌。

212 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 00:21:01 ]
先にコマンドプロントにjava c:\java\HelloWorldに打ち込んでみれば?

213 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 09:35:51 ]
>>212
普通はそれを最初にやるわな



214 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 10:47:42 ]
C++の参照は、中身はポインタと同じで、参照先のアドレスがメモリに記憶されてるんですか?
(関数内で参照をいくつか用いると、それだけスタック使うことになりますか?)

215 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 10:55:06 ]
>(関数内で参照をいくつか用いると、それだけスタック使うことになりますか?)
質問の意図が読めんが…

関数の引数で
値渡しした場合には 値が持つ大きさ だけスタックに詰まれる
参照渡しした場合には ポインタが持つ大きさ だけスタックに詰まれる

216 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 11:34:37 ]
>>214
通常変数がスタックを消費する保証はない。
まして、参照変数がスタックを消費するかどうかはコンパイラ次第。

217 名前:178 mailto:sage [2007/06/08(金) 12:13:26 ]
>>212
おぉ・・・出来ませんでした・・・。何でだろう・・・。
javaコマンドはそのカレントディレクトリにあるファイルに対してしか実行できないとか・・・?

218 名前:178 mailto:sage [2007/06/08(金) 12:19:35 ]
>>211
system("cd c:\\java; java HelloWorld");
だと、指定されたパスが見つかりませんと出ます。
system("java c:/java/HelloWordl");
だと、Exception in thread "main" java.lang.NoClassDefFoundError: c:/java/HelloWorld
う〜ん・・・

219 名前:178 mailto:sage [2007/06/08(金) 12:23:46 ]
system("copy c:\\java\\HelloWorld.class c:\\java\\HelloWorld2.class");
などは正常に動作するようです。やはりjavaコマンドの仕様なのでしょうか・・・;;

220 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 12:32:11 ]
javaの仕様がわかってないな。
まあカレントディレクトリの移動などは、SetCurrentDirectory() 使えばいい

221 名前:178 mailto:sage [2007/06/08(金) 12:44:54 ]
>>220
ありがとうございます。どうやら僕の勉強不足のようですね。しかし、
SetCurrentDirectory((LPCWSTR)"c:\\JAVA");
としても、カレントディレクトリが変わったような動作はしないのですが・・・。
その後dirコマンドを打ったら、やはりプロジェクトのディレクトリが表示されます。

222 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 12:48:21 ]
まさかとは思うが、Dドライブで作業してたりして。

223 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 12:49:32 ]
>SetCurrentDirectory((LPCWSTR)"c:\\JAVA");

SetCurrentDirectory(L"c:\\JAVA");
じゃ…



224 名前:178 mailto:sage [2007/06/08(金) 12:53:25 ]
解決する事が出来ました。
とりあえずプロジェクトのプロパティの文字設定をUnicodeから設定なしに変更しました。
その後、SetCurrentDirectory((LPCWSTR)"c:\\JAVA");をSetCurrentDirectory("c:\\JAVA");
に変更し、system("dir")をしたところ、JAVAディレクトリが表示されました。
それを確かめた上で、system("java HelloWorld");を行ったら無事実行する事が出来ました。
原因がよく理解出来ないのですが、とりあえず動作できたのでいいのかな・・・。
ありがとうございました。

225 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 13:32:56 ]
SetCurrentDirectory(_T("c:\\JAVA")) なら、unicodeでも設定無しでも動くよ
エラーが出るからってとりあえずキャストすんのはやめとけ

226 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 13:42:37 ]
あともう一つ。
system("java c:/java/HelloWordl");
これだけど、
system("java -classpath c:/java HelloWordl");

これなら動くんじゃないか?
HelloWordl の綴りが気になるが

227 名前:178 mailto:sage [2007/06/08(金) 13:54:53 ]
>>225
丁寧にありがとうございます。キャストはあまりしないほうがいいみたいですね。
現在はchar型の変数にパスを入れて、SetCurrentDirectory(dirPass);のようにしているのですが、
やはりそれだと動作が微妙です。引数はcharじゃなくてLPCTSTR(?)じゃないといけないのかな
とか思いつつ奮闘しています。

>>226
一応-classpath(-cp)も使って実行してみたのですが、確か出来なかったです。
HelloWorldの綴りが>>211で間違ってるのにも実は気付いていて、ちゃんと綴りを直して実行しました。

228 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 13:56:31 ]
>>227
classpath の指定と HelloWordl の間にはスペースがあるんだけどわかってる?

229 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 14:00:32 ]
日本にもう一人いるのか、本人なのか。

www.google.co.jp/search?q=hellowordl&lr=lang_ja


230 名前:178 mailto:sage [2007/06/08(金) 14:04:28 ]
>>228
あ、大丈夫です。ちゃんと半角スペース入れています。

あと、どうやら>>227のSetCurrentDirectory()は引数の型とかの問題じゃなかったです。
むしろ何も問題は起きてませんでした・・・(´・ω・`)
どうやらstrncat(dirPass, &argv[0][0], point);を実行した後にsystemコマンドが使えないです。
system("dir");を実行しただけでエラーが・・・。

231 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 14:10:49 ]
>>230
ちゃんとコピペしてやってみたのかよ
そもそも、これがおかしいんだよ→ c:/java/HelloWordl
ここはファイルを指定するんじゃなくてクラス名を指定するの
パス名がクラスの階層を表してはいるけどな

>system("dir");を実行しただけでエラーが・・・。
ふーん

232 名前:178 mailto:sage [2007/06/08(金) 14:18:29 ]
>>231
ちゃんとコピペしてやりました。HelloWorldがクラス名なのも理解しています。

233 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 14:32:47 ]
わかった。もうキミには言うことは無い
うちでは動いてるけど、君のトコでは動かないんだね



234 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 14:44:31 ]
>>230
どこか壊してるんでしょう。
dirPassはちゃんと文字列を置ける所を指してる?
(argv[0]って自分の名前なんだけど、それで何するんだろ?)

235 名前:178 mailto:sage [2007/06/08(金) 15:16:42 ]
>>233
そういう次元でもないような・・・。

>>234
dirPassをprintfで表示させたらちゃんと目的のものを表示してくれました。
とりあえず手法を変えて、argv[0][point]に\0を入れてstrcpyしてみたらsystem("dir")が正常に動作しました。
一体何だったのでしょう・・・。argv[0]は最終的にはargv[1]に置換する予定ですw


236 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 15:18:42 ]
>>233の皮肉に気づけよ

237 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 15:19:58 ]
なんかさ、やろうとしてることがショートカット作る程度でできそうな事な感じなんだが
複数コマンドだとしてもバッチファイルで済むレベルの内容じゃないのか?
無理矢理Cで作ろうとするほうが疑問なんだが・・・


238 名前:178 mailto:sage [2007/06/08(金) 15:30:47 ]
>>236
ヤバイ・・・全然皮肉が伝わってなかったらしいです;;
言われても気付けない俺はバカかもしれない・・・
まぁ、逆に考えれば幸せな人なのかもしれないから良いか(`・ω・´)ふふふ

>>237
やろうとしていることは、D&Dで.javaを渡したらコンパイル、.classを渡したらそれを実行するプログラムです。
もしかしたらもっと簡単で楽な方法があるんですかね・・・。バッチファイルとか分からないので後でググッておきます。
JAVAを昨日から勉強しようと思ったのですが、いちいちコマンドプロンプトでディレクトリ移動したり
javaコマンド打ったりするのが面倒だと思って・・・。↑押せば前のコマンドは出てきますけど、それさえも面倒で・・・。
というか、コマンドプロンプトでコマンド打つのが嫌いなんです;;
そして、今大体プログラムは完成したっぽいです。

239 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 15:32:32 ]
strncpy()は鬼門。積極的に使う理由がないなら、sprintf()を使え。

240 名前:デフォルトの名無しさん [2007/06/08(金) 17:32:11 ]
したのようなプログラムで、今調べている位置を出力するにはどうしたら良いですか?
printf("%d\n", Fd)としたら値が変化しません・・・


struct ffblk Fd;
findfirst("*", &Fd, 55);
do {
printf("%s\n", Fd.ff_name);
}
while(!findnext(&Fd));

241 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 17:45:49 ]
>>240
何も分からない

242 名前:デフォルトの名無しさん [2007/06/08(金) 17:48:57 ]
>>241
再帰を使わずにディレクトリ内のファイルを出力したいのですが
ディレクトリを進めたときに上ディレクトリで何処まで読んだかを記録しておきたいんです

243 名前:デフォルトの名無しさん [2007/06/08(金) 17:50:47 ]
A_dir
B_dir
C_dir
というディレクトリがあったとき、B_dirを調べ終わったとき
次にC_dirを検索するにはどのデータを保存しておけば良いんですか??




244 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 17:59:58 ]
>>243
関数を再帰的に書けば良いじゃん

245 名前:デフォルトの名無しさん [2007/06/08(金) 18:05:38 ]
>>244
再帰を使いたくないんです・・・

246 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:07:08 ]
何故?

247 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:09:33 ]
Fdを保存しておけばいい

248 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:10:05 ]
末尾再帰型で書いてからループ化すれば?
ttp://ja.wikipedia.org/wiki/%E6%9C%AB%E5%B0%BE%E5%86%8D%E5%B8%B0

249 名前:デフォルトの名無しさん [2007/06/08(金) 18:13:57 ]
>>246 再帰は不安定になるんですよ

>>247 struct ffblk Fd , Fe; としてFe = Fdと記録してみましたがた゛めでした

250 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:19:05 ]
struct ffblk[MAX_DIR_DEPTH];

251 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:19:21 ]
再帰が不安定とは……

252 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:21:44 ]
普通にスタックに積めばいいじゃん。

253 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:23:20 ]
>>249
再帰で不安定になるのは、あなたの書いたプログラムの問題。
まあ再帰使わなくても>>250みたいなやり方でFA_DIRECでも調べれば可能かとは思うけど
100人中95人以上は、再帰の方がわかりやすく書きやすいと言うだろう。
速度なんか気にするケースじゃないしね。



254 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:28:29 ]
何が「再帰は不安定になるんですよ」だよ馬鹿もんが

255 名前:249 [2007/06/08(金) 18:29:22 ]
速度を上げる為に複数スレッドで読み込みたいんですよ
再帰だと出来ないんです・・・・

256 名前:デフォルトの名無しさん [2007/06/08(金) 18:31:38 ]
ここに複数スレッドでうごいているようなソフトがあるんですけど・・・
どうやればいいんですか???


フォルダサイズ調査  『 D-Usage.exe 』
hp.vector.co.jp/authors/VA032597/Software/DirMan.html

257 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:32:30 ]
ドライブ資源は1個なのに、複数スレッドでアクセスしたら、
かえって遅くなるような気がしないでもない

258 名前:デフォルトの名無しさん [2007/06/08(金) 18:35:07 ]
>>250
進める前に、ディレクトリ情報を取得しておいて
自分でそこのディレクトリを設定し直せばいいってことか
それでできそうかも

259 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:36:02 ]
(一般的には)無駄なシークが発生して、遅くなります。

260 名前:デフォルトの名無しさん [2007/06/08(金) 18:36:15 ]
>>257
実際にデータを読み込む訳ではないんですよ

261 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:37:02 ]
FindFirstFile()が返してきたハンドルをスタックとして
もっとけばいいだけじゃないの?
そのハンドル持っとけば、次にFindNextFile()呼んだらちゃんと
続きから返ってこないか?


262 名前:257 mailto:sage [2007/06/08(金) 18:39:04 ]
>>260
俺は >>259 のことを想定して書いた。 余計なシーク発生するから遅くなるんじゃね? ってこと

263 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:42:22 ]
>>256
そのアプリなら、2スレッドしか動かしていないよ。
恐らくは、GUIスレッドと調査スレッドか。
動きを見ていても、とても複数スレッドでやっているようには見えない。
調べもしないで想像で語る愚に填まったね。



264 名前:249 [2007/06/08(金) 18:46:10 ]
複数の方が早いですよ

複数スレッド
D-Usage. 36s
hp.vector.co.jp/authors/VA032597/Software/index.html

単一スレッド
VCDCASE 45s
www.hi-ho.ne.jp/hiro30/

265 名前:デフォルトの名無しさん [2007/06/08(金) 18:49:33 ]
C言語なんですが
自作関数で実引数で文字列を返す事は可能ですか?

266 名前:257 mailto:sage [2007/06/08(金) 18:49:52 ]
>>264
どうやって HDDアクセスが複数スレッドで走っているのを確認したのか教えて欲しい

267 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:50:33 ]
>>264
>263

268 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 18:54:11 ]
スレッド1個でも動くものができないのに

269 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 19:00:58 ]
しかし、どうでもいいけどD-Usageとかいうソフト、速いのかも知れないけど使い難いなぁ。
作者本人は悦に入っているようだから別にいいけど。

つーか、VCDCASEは目的が違うじゃん。違う目的のソフトを比較して速度云々って>249はどこまで阿呆を晒せば気が済むんだ?

270 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 19:09:05 ]
>>265
できます

271 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 20:52:54 ]
>>249
A_dir
 - file1
 - file2
B_dir
 - file3

とあった場合に欲しい結果は以下のどっち?
1) A_dir B_dir
2) A_dir file1 file2 B_dir file3

1)ならFdを保存すればOK。

272 名前:デフォルトの名無しさん [2007/06/09(土) 01:52:08 ]
windows環境でTCHARに対応した標準出力へのiostreamを使いわけるようにしたいわけですが
#ifdef UNICODE
#define tcout wcout
#define tcin wcin
#define tcerr wcerr
#define tclog wclog
#endif
#ifdef _MBCS
#define tcout cout
#define tcin wcin
#define tcerr wcerr
#define tclog wclog
#endif
のようにtc*を定義するのは良くないんでしょうか?
もしそうであるならば、大体案としてはどのようなものがありますか?

273 名前:デフォルトの名無しさん [2007/06/09(土) 01:55:20 ]
大体案は代替案のtypoですorz



274 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 01:56:39 ]
#ifdef _UNICODE
iostream& tcin = cin;
(ry

275 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 01:57:45 ]
>>272
とりあえず、_MBCS ブロック内のヤツは cin, cerr, clog にしたほうがいいと思うよ。

276 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 01:57:52 ]
>>272
おそらく、個人・環境等で意見は様々だと思う。
個人的には、4つや5つなら許せるが、こんなことしなくても問題ないようなモノにしたい。

で、その書き方なんだがUNICODEと_MBCSが万が一両方定義されていた場合のことも
考えて、#if-#else-#endifのほうがいいかと。
もしくは、両方定義されていたらコンパイルエラーにするとか。

277 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 02:01:44 ]
>>274
cin の型は iostream じゃなくて istream やね。
そして、_UNICODE の場合は wistream 。

278 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 02:05:01 ]
>>272
実際困っちゃうんだよね、それ。
自分も似たようなコトしてるし、多分大丈夫だと思いますよ。

279 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 02:29:52 ]
回答ありがとうございました。
皆様の意見を参考にこのようにしました。

#ifdef UNICODE
  #ifdef _MBCS
    #error define either only UNICODE or _MBCS.
  #else
    std::basic_istream<TCHAR, std::char_traits<TCHAR> >& Tcin = std::wcin;
    std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tcout = std::wcout;
    std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tcerr = std::wcerr;
    std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tclog = std::wclog;
  #endif
#else
  #ifdef _MBCS
    std::basic_istream<TCHAR, std::char_traits<TCHAR> >& Tcin = std::cin;
    std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tcout = std::cout;
    std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tcerr = std::cerr;
    std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tclog = std::clog;
  #else
    #error define either only UNICODE or _MBCS.
  #endif
#endif

軽く使っただけなんで不具合は分かりませんが、
iostreamやiosfwdでの定義から考えればこれでいけそうに思えます。
_INC_TCHARの定義を必要とするようにとかまだ色々付け加えるべきことはあるとはおもいますが

280 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 03:17:18 ]
fopen("test.txt", "w");
でファイルをオープンしようとしたのですが、どうやら実行ファイルの場所ではなく、
C:\C:\Documents and Settings\ユーザ名
のディレクトリが対象となっているっぽいです。どうにか対象を実行ファイルのある場所にしたいのですが、
どうすればいいのでしょうか?というよりも、普通実行ファイルの場所が対象になると思うのですが、、、

281 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 03:24:21 ]
>>280
>普通実行ファイルの場所が対象になると思うのですが、、、
そんな「普通」はあなたの脳内にしかありません。
大人しく絶対パス指定するなりユーザに設定してもらうなりインストーラで設定するなり
アプリケーションの在り処を検索するなりしてください。

282 名前:534 mailto:sage [2007/06/09(土) 03:49:25 ]
>>280
これ使ってください><
int getExecutedDirectory(const char* argv[], char* dest, size_t dest_sz) {
size_t i = 0;
size_t len;

len = strlen(argv[0]);
while (i < len) {
printf("argv[0][%d]:%c\n", len-i, argv[0][len-i]);
if (argv[0][len-i] == '\\')
break;
++i;
}
if (dest_sz < len-i +2)
return -1;
strncpy(dest, argv[0], len-i+1);
dest[len-i+1] = '\0';
return 0;
}
argvはmain(int argc, char* argv[])のargvで
destは出力先の文字列の先頭ポインタ
dest_szはsizeof(dest)です><
ちなみにこれC++のSTL使うと4行程でできちゃいます><

283 名前:534 mailto:sage [2007/06/09(土) 04:20:39 ]
改良しました><
// コマンドライン引数配列から実行されたディレクトリを取得する
int getExecutedDirectory(const char* argv[], char* dest, size_t dest_sz) {
size_t i;
size_t len;

i = len = strlen(argv[0]);
while (i > 0) {
if (argv[0][i-1] == '\\')
break;
--i;
}

if (dest_sz < i +2 || i == 0)
return -1;

strncpy_s(dest, dest_sz, argv[0], i);
dest[i] = '\0';
return (int)i;
}



284 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 04:36:26 ]
>>281
そんなアプリケーション見たことねえw

285 名前:534 mailto:sage [2007/06/09(土) 04:48:38 ]
まだ直すところありました(^^
// コマンドライン引数配列から実行されたディレクトリを取得する
size_t getExecutedDirectory(const char* argv[], char* dest, size_t dest_sz) {
size_t i;
size_t len;

i = len = strlen(argv[0]);
while (i > 0) {
if (argv[0][i-1] == '\\')
break;
--i;
}

if (dest_sz < i +1 || i == 0)
return -1;

strncpy_s(dest, dest_sz, argv[0], i);
dest[i] = '\0';
return i;
}






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

前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