[表示 : 全て 最新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


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;
}

286 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 05:58:26 ]
コマンドライン引き数から実行モジュールの場所が得られると思ったら大間違い。

287 名前:534 mailto:sage [2007/06/09(土) 06:31:11 ]
詳しく^^

288 名前:534 mailto:sage [2007/06/09(土) 06:49:51 ]
自己解決しました^^
フルパスじゃないと取得できないので
windowsだとGetModuleFileName()を使うのですね^^
この辺は環境依存になるので注意が必要ですね^^
勉強になりました^^^^;;

289 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 06:51:34 ]
system()関数って凄く謎なのですが・・・。
printf("aaa\n");をコメントアウトするだけで、エラーが出てしまいます。
これは俺が、system()で使う領域を侵してると考えていいのでしょうか?



290 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 06:51:36 ]
1.Unix系はarg[0]にパスが入らないんじゃなかったかな。
2.バッファオーバーランしかけたらエラー処理してくれ
3.Shift-JISだとそのコードはまずくね?「c:\ソ.exeとか」
4.const char* argv[]じゃなくてchar const *const argv[]な

291 名前:534 mailto:sage [2007/06/09(土) 08:06:37 ]
これでどうでしょう?
もうWindows特化ですが(というかUNIXの実行環境が無い(´・ω・`) )

// コマンドライン引数配列から実行されたディレクトリを取得する
size_t getExecutedDirectory(TCHAR* dest, size_t dest_sz) {
_locale_t loc;
size_t len;

// 実行ファイルのフルパスを取得
TCHAR fullpath[4096];
GetModuleFileName(NULL, fullpath, sizeof(fullpath));

// ロケール設定
loc =_create_locale(LC_CTYPE, "japanese");

// 最後の\を見つけて、コピー範囲[fullpath,len)が適用できるようなlenを生成
TCHAR* last_slash = _tcsrchr(fullpath, '\\');
len = last_slash - fullpath +1;

// 出力先の容量が不足ならエラーで-1を返す
if (len-1 == 0 || dest_sz < len) {
if (dest_sz > 0)
dest[0] = '\0';
return -1;
}

// コピーして終端に0
_tcsncpy_l(dest, fullpath, len, loc);
dest[len] = '\0';
return len-1;
}

292 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 08:17:05 ]
>>289
その周辺を晒してくれないとなんとも言えないのだが。

293 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 08:34:05 ]
>>279
std::basic_istream<TCHAR, std::char_traits<TCHAR> >& Tcin = std::wcin;
とかって、ここで TCHAR 使っても意味ない気が。
右辺が明らかに wistream 型だし、
wistream と書いた方がすっきりしていいと思うぜ。

294 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 09:21:55 ]
1.sizeof(fullpath) → sizeof fullpath / sizeof *fullpath
2._tcsrchr(fullpath, '\\')→ _T('\\')
3._tcsrchr(fullpath, '\\') _UNICDEかMBCSが定義されてないとShift-JISは問題起こす(たぶん)
4.dest[0] = '\0'→_T('\0')
5.return -1→return static_cast<size_t>(-1)とか

↓ これで我慢しろ。(UNCパスだと問題あるかも)
std::basic_string<TCHAR> getExePath()
{
TCHAR exe_path[MAX_PATH];
DWORD r = ::GetModuleFileName(NULL, exe_path, sizeof exe_path / sizeof *exe_path);
if( r == 0 || r == sizeof exe_path / sizeof *exe_path )
throw std::runtime_error("うぎゃあ");

TCHAR drive[_MAX_DRIVE], path[_MAX_PATH];
_tsplitpath(exe_path, drive, path, NULL, NULL);

return std::basic_string<TCHAR>(drive) + path;
}

295 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 09:27:16 ]
>>294
sizeof(fullpath)じゃなんであかんのんですか?

296 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 09:54:28 ]
>>294だけど、
GetModuleFileNameの第3引数はバイト単位のサイズでなく配列要素数を
指定する。Unicodeビルドの時はsizeof(TCHAR)が2なので、TCHAR buf[10]は
 sizeof buf = 20
 sizeof buf / sizeof *buf = 10

違ってたらごめん

297 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 10:05:43 ]
>>296
嘘つくな。氏ね

298 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 10:46:05 ]
>>297
ttp://msdn2.microsoft.com/en-us/library/ms683197.aspx
> The size of the lpFilename buffer, in TCHARs.
だから>>296であってる

299 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 17:45:36 ]
ヘッダーファイルで
class temp{
public:
int *func();
};
と書いた場合、funcの定義はどう書き始めればいいですか
int temp::*func()
int temp::(*func())
int *temp::func()



300 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 17:59:13 ]
一番下じゃないとVSのインテリセンスが効かなかったので一番下

301 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 18:05:51 ]
>>299
コンパイルできるのは一つだけしかないだろ?

302 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 18:16:44 ]
>>299
int* func();

303 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 19:58:45 ]
>>279
テンプレートデフォルト引数があるんだから
std::char_traits<TCHAR>まで律儀に指定しなくてもいいと思う

304 名前:デフォルトの名無しさん [2007/06/10(日) 00:26:59 ]
ちょっと相談。

CSV形式のテキストファイルを採用することになったんだけど、
エスケープの方法など、細かい仕様について悩んでる。
この辺の定番仕様ってどんな感じかな。
専用の入力ツールを用意しない場合、やっぱりExcelあたりに合わせるのがベターだろうか。

で、その定番仕様に対応したCまたはC++のライブラリがあればお願いします。

305 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 00:30:56 ]
csvってRFCできてなかったっけ

306 名前:304 mailto:sage [2007/06/10(日) 00:59:15 ]
RFCあるのか……ありがとう、ちょっと探してみる

307 名前:デフォルトの名無しさん [2007/06/10(日) 02:42:21 ]
C++で自分で作ったクラスのVectorを使ってVector aを宣言して
-aを使いたいのですがどのようにすればよいでしょうか
よろしくおねがいします

308 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 02:44:07 ]
>>307 まず服を脱ぎます。

309 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 02:46:32 ]
ええとよくわからんけど
-演算子をオーバーロード?



310 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 02:46:58 ]
単項演算子を使いたいってこと?
2次元ベクトルの例だと、Vectorのメンバに
Vector operator - () const {return Vector(-x, -y);}
みたいな感じか?

311 名前:307 mailto:sage [2007/06/10(日) 02:54:52 ]
解決しましたありがとうございました

312 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 04:01:52 ]
linuxで標準ライブラリをインストールしたいのですが
glibc-2.5.0-0exp1
glibc-2.5.0-0exp2
の違いってなんですか?

313 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 07:16:07 ]
1と2

314 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 11:47:50 ]
>>312
そのパッケージは Ubuntu にしか無いっぽいな、
俺はFedora使いだからよくわからん

Ubuntu系のスレにでも行ったほうがよさげだ


315 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 13:20:40 ]
ファイル情報の取得の仕方教えて。


316 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 13:24:06 ]
stat

317 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 13:30:01 ]
file

318 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 14:10:54 ]
Windows環境で,任意のファイルが変更された時に,
変更の種類(作成,更新,削除等)と,変更を与えたプロセスを
出力するプログラムを作成しようと思っています.

変更の検知とその種類に関しては,Win32APIのReadDirectoryChangesWで
取得できるのですが,変更を与えたプロセスの取得方法が
Win32APIや.NETを探しても分かりません.
何か方法があれば教えていただけませんか?

319 名前:318 mailto:sage [2007/06/10(日) 14:11:45 ]
すみません,
Windows環境 → WindowsXP環境
です



320 名前:デフォルトの名無しさん [2007/06/10(日) 14:56:21 ]
VB.NETとC#.NETで、大きく異なる点とは、どういうとこでしょう?
考えたかとか、コーディングの仕方で教えてください。

321 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 15:09:24 ]
元が VB か C/C++ か、の差

322 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 15:11:46 ]
#include <iostream>

struct A {
  A(){
     std::cout << "A" << std::endl;
   }
   ~A() {
     std::cout << "~A" << std::endl;
   }
   template<class T>
   static void func() {
     std::cout << "func" << std::endl;
   }
};

int main() {
   A().func<int>();
   return 0;
}

以上のプログラムを実行すると
vc, gccでは
A
func
~A
と出力され、bccでは
func
~A
と表示されました。
コンストラクタが呼ばれないのはbccのバグでしょうか?
ちなみにメンバ関数にtemplateを使わなかったりstaticでなければ問題なくコンストラクタは呼ばれるようです。

323 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 15:19:03 ]
>>322
バグだね。 bcc なんて使わなけりゃいい。

324 名前:320 [2007/06/10(日) 15:24:40 ]
メモリーの考え方とか、大きく違ったりしませんか?
定数、変数のきり方とか・・・・
インスタンスの方法とか、考え方とか・・・

単に、方言が違うだけ?

325 名前:322 mailto:sage [2007/06/10(日) 15:38:39 ]
>>323
レスどうもです。
やはりバグですか。
bccはコンパイル速度しか売りがないのかなと感じる今日この頃。

326 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 15:39:27 ]
>>324
.NETスレは他にあるだろ。なんでここで聞くんだ?

どのくらい違うかの位置関係はこんな感じで、
VB6−−−−−−VB.NET−C#
メモリーの考え方とかインスタンスの考え方はVB6から大きく変更になってる。

327 名前:320 [2007/06/10(日) 15:55:44 ]
ごめん。
C#スレと勘違いしてた。

328 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 18:12:08 ]
あれだけ#の種類を変えて頑張っているのにw

329 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 19:01:15 ]
構造体/クラスを関数に渡すときは、ポインタか参照が使われることが一般的のようですが、
戻り値が構造体/クラスなのは普通ですか?



330 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 19:08:14 ]
>>329
コピーが重い場合には避けられるけど、単純にポインタや参照にして
置き換えられないこともあるので、引数に比べれば使われる機会は多いでしょう。

331 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 19:21:23 ]
ttp://www.cs.bme.hu/~bodon/en/apriori/
↑のサイトのプログラムを落として
makeしてみたらエラーがでて、makeできませんでした。
どのようにしたらmakeできますか?

実行はCygwin上で行ってます。

エラー内容は
$ make
g++ Input_Output_Manager.o Apriori.o Trie.o Apriori_Trie.o main.o -o ../apriori

Input_Output_Manager.o: In function `_ZN20Input_Output_ManagerC2ERSt14basic_ifstreamIcSt11char_traitsIcEEPKc':
Input_Output_Manager.cpp:(.text+0x2f): undefined reference to `_ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E'
Input_Output_Manager.cpp:(.text+0x4a): undefined reference to `_ZNSt13basic_filebufIcSt11char_traitsIcEEC1Ev'



Input_Output_Manager.o:(.gnu.linkonce.r._ZTI20Input_Output_Manager+0x0): undefin
ed reference to `_ZTVN10__cxxabiv120__si_class_type_infoE'
Input_Output_Manager.o:(.gnu.linkonce.r._ZTI20Input_Output_Manager+0x8): undefin
ed reference to `_ZTISt14basic_ofstreamIcSt11char_traitsIcEE'
collect2: ld returned 1 exit status
make: *** [../apriori] Error 1

332 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 19:42:17 ]
>>331
うちとは環境が違うけど,Trie.cppの
bool Edge_point_less(const Edge edge, const itemtype label)
の閉じ括弧の後のセミコロン取り除いて
一度make cleanしたあとmakeしたら成功したよ


333 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 19:48:07 ]
>>329
小さい構造体/クラスならないこともない。
複雑なクラスだとあまりやらない。皆無ではないかもしれんが。

演算子オーバーロードの戻り値は例外で、状況により普通に使うが、
速度が欲しいとき用にそうでない関数を用意した方がいいと思う。

334 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 20:20:48 ]
>>332
成功しました。ありがとうございます。

335 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 20:23:04 ]
>>332
暇人乙

336 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 20:52:44 ]
>>335
暇潰しにもならんかったよ


337 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 20:54:11 ]
暇過ぎw

338 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 21:44:29 ]
続けて、質問すみません。
さっきの
ttp://www.cs.bme.hu/~bodon/en/apriori/
のやつなんですが、

kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4208.txt
↑のもっと長いようなデータ読み込ませようとすると

11 [sig] apriori 436 open_stackdumpfile: Dumping stack trace to apriori.exe.stackdump

ってでて、動きません。

動くようにするには、どの部分をどのようにすればいいですか?

339 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 23:51:01 ]
マルチーズ乙



340 名前:デフォルトの名無しさん [2007/06/11(月) 11:47:18 ]
g++で、Aというクラスを継承したBというクラスを作成し、
void func(B obj_arg) という関数を定義してBを渡すと、
Bのコピーコンストラクタは呼ばれるのですが、Aは通常のコンストラクタが
呼ばれます。(コピーコンストラクタではない、と言う意味です)
これは、なぜこのようになっているのでしょうか?
いまC++を勉強中ですが、この部分が納得できずにいます。
すみませんがどなたか理由を教えてもらえませんでしょうか?



341 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 12:26:40 ]
>>340
再現する最小限のソース貼って


342 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 12:29:24 ]
class A {
A(){}
A(int n){}
};

class B:A {
B(){}
B(int n){}
};

B b(1);

って書いたら、基底クラスAのコンストラクタはどっちが呼ばれる?
とESPしてみる

343 名前:デフォルトの名無しさん [2007/06/11(月) 12:46:26 ]
>>341
#include <iostream>
using namespace std;

class aaa {
public:
  aaa() {printf("%p: [%s]: %s called\n",this,"aaa","constructor");}
  aaa(const aaa &a) {printf("%p: [%s]: %s called\n",this,"aaa","copy constructor");}
  ~aaa() {printf("%p: [%s]: %s called\n", this, "aaa", "destructor");}
};

class bbb : public aaa {
public:
  bbb() {printf("%p: [%s]: %s called\n", this, "bbb", "constructor");}
  bbb(const bbb &b) {printf("%p: [%s]: %s called\n", this, "bbb", "copy constructor");}
  ~bbb() {printf("%p: [%s]: %s called\n", this, "bbb", "destructor");}
};

void func2(bbb x){return;}

int main()
{
    bbb x;
    func2(x);
    return 0;
}


344 名前:デフォルトの名無しさん [2007/06/11(月) 12:47:18 ]
>>343
改行が多すぎるといわれたので、わけました。

実行結果は以下のようになりました。
~/> g++ samp.cpp
~/> ./a.out
0xbfc07bee: [aaa]: constructor called
0xbfc07bee: [bbb]: constructor called
0xbfc07bef: [aaa]: constructor called
0xbfc07bef: [bbb]: copy constructor called
0xbfc07bef: [bbb]: destructor called
0xbfc07bef: [aaa]: destructor called
0xbfc07bee: [bbb]: destructor called
0xbfc07bee: [aaa]: destructor called



345 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 12:52:34 ]
>>344
class bbb : public aaa {
public:
bbb() {printf("%p: [%s]: %s called\n", this, "bbb", "constructor");}
- bbb(const bbb &b) {printf("%p: [%s]: %s called\n", this, "bbb", "copy constructor");}
+ bbb(const bbb &b): aaa (b) {printf("%p: [%s]: %s called\n", this, "bbb", "copy constructor");}
~bbb() {printf("%p: [%s]: %s called\n", this, "bbb", "destructor");}
};


346 名前:デフォルトの名無しさん [2007/06/11(月) 12:57:06 ]
>>345
すいません、理由は理解できてないのですが、書かれた通りに
したら、基底クラスのコピーコンストラクタが呼ばれました。

どうやら勉強不足のようです。
失礼しました。

ありがとうございました。


347 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 12:59:40 ]
エスパー342


348 名前:デフォルトの名無しさん [2007/06/11(月) 13:16:15 ]
>>342
>>347
なるほど、基底クラスの関数は、指定しなければ
引数がないものが呼ばれるということでしょうか?
今になって、342の書き込みの意味が少しわかりました。


349 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 13:19:25 ]
>>348
コピーする必要がなければコピーコンストラクタが呼ばれないのは蓋し当然。



350 名前:デフォルトの名無しさん [2007/06/11(月) 13:25:20 ]
>>349
でも、コピーコンストラクタが呼ぶ基底クラスの関数は
デフォルトでは、基底クラスのコピーコンストラクタになっている
のだろうと思っていました。
(はっきりと意識していたわけではないですが。)

351 名前:342 mailto:sage [2007/06/11(月) 13:48:27 ]
コンストラクタの呼び出し方は独学でやってると大抵詰まる。
>>342にしても、B(int) が自動的に A(int) を呼んでくれるものと
勝手に思い込んでたし(それもかなり長いこと)。
一度分かってしまえばなんてことはない話なんで、まあ頑張れ。

352 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 21:21:19 ]
string::find と string::find_first_of 、
string::rfind と string::find_last_of って、
どう違うの? 同じ?

353 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 21:23:36 ]
rの有無、firstかlastかの違い
begin側から探し始めるかeng側から探し始めるかの違い

354 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 21:52:19 ]
ごめん。左右の比較の話。

解説を穴が空くほど読んだら
全然違う関数と分かった。

355 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 14:27:03 ]
ostringstream って、flush も endl もしないで str 呼んだら
不完全なまま出力されることってあるの?

大丈夫だって保証があればいいんだけど。

356 名前:デフォルトの名無しさん [2007/06/12(火) 18:12:14 ]
VC.NETでビルドしたときに、そのビルドした日時をEXEファイルに
何らかの方法で埋め込みたいのだけれど、どうしたらいいかしら?

357 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 18:15:59 ]
__DATE__ と __TIME__

358 名前:デフォルトの名無しさん [2007/06/12(火) 18:23:26 ]
>357
感謝するわよ。


359 名前:デフォルトの名無しさん [2007/06/12(火) 18:34:03 ]
もう一つ教えてちょうだい。
Jun 12 2007
って出るのを、
2007年6月12日にするにはどうしたらいいかしら?



360 名前:デフォルトの名無しさん [2007/06/12(火) 20:18:53 ]
入力した自然数を4で割り、4つの変数に収めた後、
余りをランダムに割り振るプログラムを書いて見ました
#include<ctime>
#include<cstdlib>
#include<iostream>
using namespace std;

int main()
{
int a;//適当な大きさの変数を読み取らせるための変数
int c1;
int c2;
int c3;
int c4;//aを4で割り、余りをこの4つの数値にランダムに格納する

int b;
c1=c2=c3=c4=0;
scanf("%d",&a);
b=a % 4;
printf("%d,%d\n",a/4,b);
printf("%d,%d,%d,%d\n",c1,c2,c3,c4);

while(b>0)
{
srand(time(NULL));
int dice=rand() % 4;

361 名前:360 [2007/06/12(火) 20:20:06 ]
続きです
switch(dice)
{
case 0:
{
c1++;
c2+=0;
c3+=0;
c4+=0;
}
case 1:
{
c1+=0;
c2++;
c3+=0;
c4+=0;
}
case 2:
{
c1+=0;
c2+=0;
c3++;
c4+=0;
}
case 3:
{
c1+=0;
c2+=0;
c3+=0; c4++;
}
}

362 名前:360 [2007/06/12(火) 20:22:09 ]
printf("%d\n",dice);
//dice=0;
b--;
}

printf("分配計算後に\n");
printf("%d,%d,%d,%d\n",c1,c2,c3,c4);

c1+=(int)a/4;
c2+=(int)a/4;
c3+=(int)a/4;
c4+=(int)a/4;

printf("%d,%d,%d,%d\n",c1,c2,c3,c4);

scanf("%d",&c1);
return 0;
}

このように作ったのですが、余りが2になる場合に
どうしても余分な計算をしているようです。

srand(time(NULL));
int dice=rand() % 4;
に問題があるのか、case文がおかしいのか分からず迷っております

よろしくお願いします

363 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:25:30 ]
>>360
+=0て

364 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:26:45 ]
caseの後にbreakするんだ

365 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:29:49 ]
これさ、黙ってc1〜c4を配列にしちゃえばswitch自体が不要だわな
一番の原因は >>364 の指摘してるとおりだと思うが

366 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:37:55 ]
>>359
実行時に自分で変換すれば。

367 名前:MSX++ mailto:sage [2007/06/12(火) 20:42:32 ]
while(b--) {
*(int *)(((void *)(&c1))+(rand()&3))++;
}
ただし、c1からc4までが連続定義されているものとする。ANSI

環境依存なら。
int cx[4];
while(b--) {
cx[rand()&3]++;
}

かな?


368 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:42:47 ]
引数からファイルパスを取得し、同じ内容を別名で出力するプログラムに
関してですが、コマンドプロンプトなどで引数を与えると正常にo.txtが
出力されるのですが、ドラッグアンドドロップだと上手く動作しないです。
ご指南お願いします。
OSはWindowsです。

#include <iostream>
#include <fstream>
using namespace std;

int main(int argc,char **argv)
{
char buf[256];
ifstream ifs(argv[1]);
ofstream ofs("o.txt");

while( ifs.getline(buf,sizeof(buf)))
ofs << buf << endl;

return 0;
}

369 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:47:31 ]
よく意味がわからんけど
コマンドプロンプトにD&Dしてんの?

どういうオブジェクトをD&Dしてて、
どううまく動作しないのさ



370 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:49:25 ]
とりあえず引数を表示してみるとか

371 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:53:09 ]
o.txtをフルパスで書いたら?
なんか変なトコに出力してるだけだろ。

372 名前:360 mailto:sage [2007/06/12(火) 20:54:29 ]
>>364-365 など各位

皆様ありがとうございます。早速配列化と、breakを試してみます

373 名前:368 mailto:sage [2007/06/12(火) 20:55:45 ]
実行ファイルがtest.exeだとしたら、batファイルなどで
test.exe i.txtへの絶対パス
test.exe i.txt
両者ともファイルの書き出しに成功しますが、
エクスプローラー上でi.txtをtest.exeへD&Dするとファイルの書き出しが
行われません。
ちなみに引数を表示するプログラムを追加してみたところ、見た目は
batファイルとD&D両者とも同じ引数を受け取っているように見えます。

374 名前:368 mailto:sage [2007/06/12(火) 21:08:30 ]
>>371
なるほど、作業しているディレクトリ上位のディレクトリを見てみたら、
確かに変な位置に出力されてました。

んでコマンドライン第一引数から実行ファイルまでのパスを切り取って
output.txtに付け加えてあげたら、正常動作しました。

ありがとうございます。

375 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 21:13:46 ]
バッチファイルをダブルクリックした場合と、D&Dした場合じゃあ
カレントディレクトリの位置が違うんだよね。
よく分からん仕様ではあるよな

376 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:11:47 ]
a != '.'
これの右側(コンマ)の意味がわかりません。

377 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:14:35 ]
>>376
コンマなんてどこにあるんだ?

378 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:15:35 ]
>>376
右側にあるのはシングルクォーテーション「'」とピリオド「.」

379 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:17:00 ]
間違いました。ピリオドです。



380 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:18:29 ]
>>376
じゃあ、' の意味は分かるのか?

381 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 23:20:53 ]
>>376
aとか!=の意味は?






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

前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