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


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

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



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

369 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 15:09:31 ]
>>364-368
A.h を頭から順に読んでいったコンパイラさんは、
メソッド B::getA_Base() の存在を知ることができない。



370 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 15:16:33 ]
クラス定義の中で関数を定義すると、
クラス定義の直後にinline付きで定義されたものとして扱われる。
つまりA_Derivはこう書いたのと同じに扱われる。
class A_Deriv : public A_Base
{
public:
void func();
};
inline void A_Deriv::func() { getB()->getA_Base(); }
ところが、この時点ではclass B;という前方宣言しかないため、
Bに関する具体的な情報がわからない。それで367のエラーになってしまう。

解決するには、A_Deriv::funcの定義をBの定義より後に回せばいい。
例えば、A.hとB.hをインクルードするcppファイルでA_Deriv::funcを定義したり、
A_BaseとBを同じヘッダで定義して、そのヘッダの一番下に
インラインでA_Deriv::funcを定義するなどの方法がある。

371 名前:365 mailto:sage [2007/07/25(水) 16:17:52 ]
>>369
>>370
早速の返答ありがとうございます。

かき方がとても悪かったです、A_Deriv::func()は実際はcppの方に実装してあります。

そして、A_Deriv::func()の実装したcppでのincludeをA.h B.hともにして通りました(A.hのみincludeしていた状態でした)

とてもバカなミスでした。お手数おかけしました。どうもありがとうございました!


372 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 18:01:38 ]
>>353
どこのGCCの話をしてるんだ?
Win以外じゃ主流なんだが・・・


373 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 18:05:11 ]
>>372
かわいそうな子に触らないで

374 名前:353=372 mailto:sage [2007/07/25(水) 18:22:02 ]
つまらん。もっと面白い突っ込みしろよ

375 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 19:01:38 ]
質問なんですが、配列には最後の要素に必ずナル文字(\0)が
入らないといけないんですか?

376 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 19:05:27 ]
文字列なら

377 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 19:08:49 ]
>>375
ぬるぽ


文字じゃなければ別に\0入ってなくていい。

文字列だと文字の終わりがわからんから。

文字表示するとき、1個ずつ文字を調べて'\0'まで描画するみらいなルールがあるの




378 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 19:19:54 ]
みらいなみらいなけーの

379 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 10:13:10 ]
らめぇー

380 名前:デフォルトの名無しさん [2007/07/26(木) 11:42:25 ]
VC.NET2003で

mkstemp()

が使いたいのですが、どうしたらいいでしょうか?

381 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 11:59:03 ]
>>380
それは諦めて、標準ライブラリ関数のtmpnamやtmpfileを使う。

382 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 12:02:02 ]
探せばwin32版の実装も転がってるんじゃないのか

383 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 12:12:44 ]
>>382
つCygwin
VC++で使えないだろうけどね。

384 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:14:57 ]
エラーチェックが甘いけど、自作するならこんな感じかなぁ。

#include <windows.h>
#include <sys/stat.h>
#include <io.h>

int mkstemp(const char *templ) {
 char *buffer;
 DWORD length;
 char filename[MAX_PATH];

 length = ::GetTempPathA(0, NULL);
 buffer = (char *)malloc(length);
 GetTempPathA(length, buffer);

 if (GetTempFileNameA(buffer, templ, 0, filename) == 0) {
  free(buffer);
  return -1;
 }

 free(buffer);
 return open(filename, _S_IEXEC);
}

385 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:19:57 ]
すいません、生徒5人で3科目(国語・数学・英語)の点数を2次元配列に読み込んで、
その最高点と平均点を求めるプログラムを書いたのですが、なぜか平均点がうまく出ません・・・。

どこが悪いのでしょうか。

kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4757.txt

386 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:30:16 ]
printf("[国語]平均点 : %d\n", ave[i]); ここの%d

387 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:35:23 ]
>>386
・・・・・orz

すいませんホントありがとうございます・・・。自分ではなかなか気づかないものですね・・・。



388 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:39:47 ]
>>387
普通のコンパイラなら警告を出してくれると思うのだが。

389 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:40:14 ]
え?printfだぜ?

390 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:42:47 ]
--
for (i=0; i<3; i++) {
switch (i) {
case 0 : printf("[国語]最高点 : %d\n", max[i]);
--
激しく間が抜けたコードだな。そこまでループに拘るなら文字列も動的に作ればいいものを。

391 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:43:53 ]
>>389
え? 今時出せないコンパイラなんてあったの?
すまん、私が物を知らないらしい。

392 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:44:51 ]
>>391
じゃあ、その出すコンパイラと出る例をあげてくれないか。

393 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:46:18 ]
gcc -Wallで警告でるよ

394 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:48:18 ]
gccはputsに置き換える件といい、余計なお世話が多いな。
この文字列が変数だったら検出できんのかね?

395 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:49:35 ]
static char const * const subjs[] = {"国語", "数学", "英語",};
for (ic = 0; ic < sizeof(subjs) / sizeof(* subjs); ++i) {
printf("[%s]最高点:%d\n", subjs[ic], ave[ic]);
}
とか? そこまで凝らなくても良さそうだが。
#でもそれならループにしなくてもって話になるか。

396 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:50:33 ]
gccはprintf()を知っているから、警告を出すし、場合によっては
puts()などに置換さえするが、gcc以外でそういうことをやる
コンパイラを俺は知らないな。
昔はそういうのはlintのやる仕事ということになっていた。

397 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:51:09 ]
>>394
iccも同じようなことしてきたよ。勿論変数なら検出できないだろうけど、フォーマット文字列を
動的生成する香具師もそうそういないから(いてもその場合どうせトリッキーだし)実質問題なかろう。



398 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:51:53 ]
>>395
文字列のリストなら、最後に番兵のNULLをつけるほうが俺は好き。
そのほうがコードが綺麗になるしリンケージを超えてもおk。

399 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:52:26 ]
なるほど、gccは出るんだね。
stringオブジェクトに%sも出るのかなー、試してみるか。

400 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:53:27 ]
>>397
scanf()系だと、*の働きがprintf()と違うから、動的にフォーマット文字列を
生成したくなることは案外多い罠。

401 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:53:52 ]
>>398
僕も君が好きだよ

402 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:54:30 ]
>>398
その場合、配列要素数に使えない。
>395の方法なら、double ave[sizeof(subjs) / sizeof(* subjs)]という使い方もできる。
つまり、教科数に依存するマジックナンバーを全廃できるわけで。
#そこまで凝らなくても云々

403 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 18:00:41 ]
>>402
この例のような線形探索をするだけなら番兵で十分で、配列要素数は不要だし、
マジックナンバーも要らないって話でしょ

404 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 18:14:33 ]
>>384
open()の第二引数が抜けてるし、テンポラリファイルをclos()しても削除されない
んじゃないか

405 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 19:33:50 ]
>>402
sizeof subjs / sizeof *subjs - 1

406 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 19:35:16 ]
って、リンケージの問題もあったのか。

407 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 19:56:22 ]
グローバル変数のフラグが沢山あるんですが、
どうにか纏めたいんですがどう修正したらよいか迷ってます。
Singletonで状態を返すクラス作ろうかなとか思ったり
単に構造体に纏めようかなと思ったり。

みなさんはどうしてますか。



408 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 20:09:05 ]
unsigned int とかの変数一つに詰め込んで、ビットシフトのマクロで取り出す

409 名前:155 mailto:sage [2007/07/26(木) 22:38:49 ]
C++でExcelが使えるかどうか質問していた者です。
なんとか辿り着いたのが
ttp://www.ujasiri.com/prglib/vc/excel/vc_excel.html
このサイトなのですが、時間が無く、サンプルのエラー外しで一杯一杯orz
私はDirectXのゲームに対しての作成サポートツールや、ゲーム自体のデータをExcel(のデータ形式)からやり取りしようと考えております。
他の手段で解説しているサイトが見つからないのですが、ここのサイトに書かれていることで宜しいのでしょうか。
Excelを持っていない人がゲームをしても問題ないかとか、読み込みが非常に重いとか心配しています。


410 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 22:46:09 ]
ExcelがインストールされていないPCだとCreateInstanceが失敗する。
少なくともそこのエラーチェックだけはきちんとしておけ。

411 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 22:53:35 ]
>>408
ビットフィールド使えよ

412 名前:155 mailto:sage [2007/07/26(木) 22:58:41 ]
>>410
おろ、ということはユーザにExcelデータを読み込ますようなゲームは作るべきではないということでしょうか。
検索しても解説しているサイトが中々見当たらないのはそのためか・・orz

413 名前:デフォルトの名無しさん [2007/07/26(木) 23:18:28 ]
412
CSVやテキストや独自バイナリでまず作っておけよ

414 名前:デフォルトの名無しさん [2007/07/26(木) 23:19:08 ]
なぜエクセルにこだわるのかがわからない
動作が鈍くなるだろ

415 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 23:22:40 ]
 おかげで騒ぎまくったお

⊂⌒ヽ          (⌒⊃
  \ \  /⌒ヽ  / /
 ⊂二二二( ^ω^)ニニ二⊃
     \ \_∩_/ /
      (  (::)(::)  )
       ヽ_,*、_ノ  ブーン
   ///
 ///

416 名前:155 mailto:sage [2007/07/26(木) 23:34:05 ]
>>413-414
パーツのステータス管理(耐久度とか説明文)をExcelを使えば編集がしやすいかと思って実装しようとしています。
なるほど、エクセルから独自形式へのコンバートをこちらでしてしまえば、
ユーザは独自形式を読み込むだけなのでExcelが無いと動かないような症状にはなりませんね。


417 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 23:37:11 ]
>>416
その「編集」をするのはユーザなのか、お前さんなのか、プログラムなのか、どれだ

ユーザに編集させるんなら、Excelがインストールされているのが当然前提になる
自分なら、CSVなりTSVなりプログラムで扱いやすい形式でセーブしてやれば
いいだろ
読み込む仕事はずっと楽で高速だ

プログラムが内部的に扱うだけなら、バイナリでもいい



418 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 01:16:53 ]
>>416
Excelからの読み込みようデータでテキスト(もしくはバイナリ)出力を
VBAで書いてもいいんじゃない?
セルの値をファイルに出力するくらいならVB未経験でも
ちょっと勉強すればできるようになると思うよ。

419 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 01:44:55 ]
Excelのバージョンで動き違うし改ページ周り操作したら落ちるしデータ転送遅いし
xlsを書き出す必要がある時以外は使いたくないな

420 名前:デフォルトの名無しさん [2007/07/27(金) 09:08:25 ]
VC2005 Expressを使っています。
一つのプロジェクトxでa.c, a.hを作成してそれらは同一フォルダのstdafx.hを読み込んでいます。
このa.cとa.hをそのままに、プロジェクトyでつかいたかったのでプロジェクトyにドラッグアンドドロップしてプロジェクトに追加して、
プロジェクトy特有のstdafx.hを作成してビルドすれば、
プロジェクトxではプロジェクトx内のstdafx.hを利用して、プロジェクトyではプロジェクトy内のstdafx.hを利用すると夢を見たのですが、
どちらのプロジェクトのa.cもプロジェクトxのstdafx.hを読んでいるようです。
include文に相対パスを書いておけば上のような利用法ができるとおもっていたのですが何とかする方法を教えてもらえないでしょうか。
a.cとa.hに手を加えずに双方のプロジェクトで使えるようにしたいのです。
具体的にはプロジェクトxはダイナミックリンクライブラリのプロジェクトなので#define DLLEXPORT __declspec(dllexport)をつけたくて、
プロジェクトyはスタティックリンクライブラリのプロジェクトなので、#define DLLEXPORT __noopをつけたいのです。

421 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 09:26:18 ]
stdafx.hはプリコンパイルヘッダーのためにあるんだから
共通のものを読まないと意味が無いんだよ。
stdafx.hの中で差があるものを別のヘッダかソースに入れてしまえば。
もしくはプリコンパイルヘッダーの使用をやめてstdafx.hのインクルード自体やめるとか

422 名前:デフォルトの名無しさん [2007/07/27(金) 10:37:40 ]
えと、↑420は、
C:\projectXXX\a.cがあって、C:\projectXXX\a.hでインクルードしているC:\projectXXX\b.hがあり、
プロジェクトxで利用されているとプロジェクトxではb.hはC:\projectXXX\b.hが読み込まれ、
projectXXX
 ソースファイル
  a.c(C:\projectXXX\a.c)
 ヘッダーファイル
  a.h(C:\projectXXX\a.h)
  b.h(C:\projectXXX\b.h)
プロジェクトyではC:\projectXXX\a.cと、C:\projectXXX\a.hを利用し、
別途C:\projectYYY\b.hを用意しておけばプロジェクトとしての相対パスだからb.hはC:\projectYYY\b.hが読み込まれると思ってたんですが
projectYYY
 ソースファイル
  a.c(C:\projectXXX\a.c)
 ヘッダーファイル
  a.h(C:\projectXXX\a.h)
  b.h(C:\projectYYY\b.h)
コンパイル時、b.hはC:\projectXXX\b.hが読み込まれています。
includeはプロジェクトに入れているファイルから読んでくれるとおもっていたら
ファイルシステムの相対パスでプロジェクトにいれていないファイルを読んでいるので
これをプロジェクトに入れているファイルを使ってほしいという意味です。

>>421
プリコンパイルヘッダーの知識がほとんどないので勉強してみます。

423 名前:デフォルトの名無しさん [2007/07/27(金) 10:55:42 ]
C言語で「yのx乗」って式を書く場合どうすればいいですか?

424 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:02:04 ]
>>423
www.linux.or.jp/JM/html/LDP_man-pages/man3/pow.3.html

425 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:03:06 ]
>>423
x**y

426 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:04:06 ]
>>425
yのx乗だった
y**x

427 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:08:01 ]
ネタ回答で訂正レス入れる奴カッコワルイ



428 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:09:49 ]
ワロタ

429 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:10:22 ]
ウッサイ

430 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:19:25 ]
C++ならこれで
#include <cstdio>
#include <cmath>

class Double {
double val;
public:
Double(const double foo) : val(foo) {}
double operator^(const double foo) const {return pow(val, foo);}
};
こう書けるのだが。
std::cout << (Double(2.56) ^ 0.5);
#演算子の優先順位の都合で括弧が必要なのが切ないw


431 名前:デフォルトの名無しさん [2007/07/27(金) 11:21:27 ]
>>424
即レスありがとうございます。
mathが必要でしたか・・・for文でなんとかするかorz
>>425-426
ぷぎゃーwww
ちょっと信じかけた俺、涙目ノシ

432 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:29:50 ]
C++で大容量CSVファイル(1GBくらいのでっかいやつ)を読み込みたいのだが、
今はwhileでget使って1バイトずつ読み込んでるんだが、いかんせん時間がかかって仕方ない
もっと高速にやる方法って何かあるかな?
初心者なりに考えてみたけれどさっぱり思いつかない・・・

433 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:32:55 ]
1GBなんて素で読んでも時間かかると思うが、getって何かな?
CSVならまず1行ずつ読んでみては。

434 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:35:28 ]
>>432
csvなら1行ずつ読むだろ……常考
まさか読み込んだ結果も丸ごとオンメモリで保持してないよな。
メモリ量にも拠るが、場合によってはデータの持ち方の工夫も必要かもよ。

435 名前:デフォルトの名無しさん [2007/07/27(金) 11:36:12 ]
WindowsXP + BCB5 + FAT32です。

ファイルに実際には書き込むことなく、希望の長さのファイルを作る方法はないでしょうか。

chsizeは拡張部分を0で埋めます。
seekg + fwrite でできるかもと思いましたが、長さ0の書き込みでは
ファイルが期待した長さになりません。

436 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:49:00 ]
>>432
文字列処理の部分も疑ってかかるべきだが、IOの部分で言うと
移植性を捨ててmmap()やCreateFileMappingの類を使うのが一番速い。
C++の標準ライブラリだけでやるなら、
・istreamではなくstreambufを使う。1文字読む版のget()に対応するのは
 sbumpc()だ。
・streambuf::pubsetbuf()であらかじめ巨大なバッファを設定する
ことで多少はマシになるだろう

>>434
CSVってカラム内改行がLFで行末はCRLFだろ
少なくともstd::getline()は役に立たないんじゃないか

437 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:06:11 ]
>>435
CreateFile() -> SetFilePointer() -> SetEndOfFile()
で出来るはずだが、多分chsize()でも同じことをやっているはずで、
普通にやればゼロ埋めされると思う。
NTFSならいわゆるSparse Fileを作れた気もするがどうだったかな。
FAT32ではだめだろう。



438 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:26:22 ]
質問です
最近勉強はじめたんですけど本やらサイトなど見ながらやってます
で、プログラムの書き方なんですが
int main(void)

void main()
ってのがあるんですけどどう違うのでしょう?
一般的にどっちが使われてるのですか?

439 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:29:36 ]
intのほう

440 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:29:59 ]
>>436
csvファイルと聞いて、カラム内改行をサポートしたフォーマットを想定する香具師がどれだけいるだろうか。
普通は、1Row読めると考えていいんでない?
#大容量、速度優先と聞いた段階で1行=1Rowと想定した漏れ。

441 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:31:37 ]
>>440
ttp://www.rfc-editor.org/rfc/rfc4180.txt

442 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:35:24 ]
>>439
ありがとうございます
そっちでやってみます
でも結局意味は同じという事でしょうか?

443 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:37:46 ]
>>441
つまり、セル内改行はCRLFだということか。
何だ、fgets()でいいじゃん。

444 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:39:27 ]
>>442
いいえ。後者は規格不適合です。

445 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:40:16 ]
>>443
行末がCRLFで
セル内改行はCR「または」LFだ。よく読めよ。

446 名前:現実見ない人は気楽でいいね mailto:sage [2007/07/27(金) 12:45:14 ]
なるほど、MSExcelやOpenOfficeCalcではRFC勧告に則っていないファイルを出力しているわけだ。
#see TEXTDATA

それはそれとして、
>>445
CRやLFはDQUOTEで括らないといけないという記述はあるけど(see escaped)、
line breakがCRまたはLFだという記述はどこ?

447 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:46:14 ]
>>444
そーゆうことですか
ありがとうございます




448 名前:445 mailto:sage [2007/07/27(金) 12:55:53 ]
>>446
このRFCは2005年に出来た新米だからな、MSのOffice従っているわけがないw

セル内改行については、解釈方法をRFCでは規定してないっぽいな。
単にCRだのLFだのを入れられるがその場合はクオートしろってだけ。

449 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:57:20 ]
へー、Excelだとフィールド内での改行(そう言えばなんで「カラム内改行」なんだろw)はLFなんだ。
で、RFCでは「改行」は「CRLF」だと明記されている。
つまり、RFCを持ち出した御仁はRFCを「よく」読まずに偉そうな御託を並べてたわけね。ふーん。

450 名前:デフォルトの名無しさん [2007/07/27(金) 12:57:33 ]
どなたか >>422 のお相手をお願いします

451 名前:445 mailto:sage [2007/07/27(金) 12:58:49 ]
>>449
すまんね。その通りだ。良く読んでなかったのを認めよう。
で、std::getline()は役に立ちそうかい?

452 名前:現実見ない人は気楽でいいね mailto:sage [2007/07/27(金) 13:00:49 ]
結論としては、csvと一言で言っても解釈がまちまちってことかい。まぁ、この業界じゃぁ在りがちだがね。
#しかし、「csvはRFCに則ってください」なんて言われた日には涙目だな、こりゃ。

453 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 13:01:12 ]
\r\n
これってなん文字?

454 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 13:05:00 ]
>>422
インクルードパスのサーチルールとプロジェクトは関係ない。
a.hにinclude "b.h"と書かれているのなら、a.h(にとって)のカレントからb.hを探すことになる。

455 名前:445 mailto:sage [2007/07/27(金) 13:05:12 ]
>>452
RFCの規定だと、実質日本語は使えないからなw

ま、元の質問者の意図はどうだか良くわからんし、これ以上言っても無駄だな。
セル内改行は要らないというんなら、それでいいんだろうし。
わざわざ「一文字読み」をしている理由を、俺はセル内改行の問題のためだと
推定したっつーだけのこと。

456 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 13:06:31 ]
>>453
Cのソース内で例えば"\r\n"と書けば2文字と解釈される。
#但し、ターミネート文字に注意。
テキストファイルに単純に書けば、4文字と解釈されるだろう。

457 名前:449=443 mailto:sage [2007/07/27(金) 13:14:58 ]
>>455
>俺はセル内改行の問題のためだと推定したっつーだけのこと。
理解した。こちらも言い過ぎ失敬。



458 名前:432 mailto:sage [2007/07/27(金) 13:19:51 ]
なんか荒らしちゃったみたいで申し訳ない
1文字ずつってのは、これ課題なんだけどその際に「1文字ずつ読み込むように」って言われてたからなんだけれどその意図は聞いてないから答えられない・・・申し訳ない
とりあえず言われた方法を一通りやってみます
レス遅れてすまんかった、そしてありがとう

459 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 13:54:16 ]
>>454
""で指定した場合カレントのstdafx.hを使うみたいなので<>を使って解決しました。
ありがとうございました。

460 名前:デフォルトの名無しさん [2007/07/27(金) 14:07:07 ]
例外処理というのは結局エラーになりそうなところで
エラー処理を書くってことだと思うんですけど
例外を使うのは単にエラー処理を用意するのと違って
どういったメリットなどがありますか?
簡単なサンプルだけではいまいちよくわからなくて
すっきりしません。

461 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 14:13:37 ]
win32 apiの例外処理ならadvanced windows の例外処理の章をよむといいかも

462 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 14:17:56 ]
>>460
エラーを検知するコードと、エラーを処理するコードを自然に分離できる。
典型的には、前者がライブラリで後者がアプリケーションの場合。

例外によるエラーの通知は無視したままプログラムの継続ができないことも
大きな特徴。エラーを無視したまま走り続けて不正な処理をすることを防げる。

あと↓ここ読んとけば?
pc11.2ch.net/test/read.cgi/tech/1142667446/

463 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 14:27:24 ]
エラーが発生したところで、どうしようもなく、ソフトを異常終了するしかない時に使う。
Cのmallocなどなら戻り値のチェックは絶対に忘れてはいけないし、忘れたらバグの元になり後々面倒になるが、C++のnewなどなら戻り値のチェックは不要。
例外がthrowされ、catchしなければ異常終了する。上の例で、メモリの確保ができなければ、ほとんどの場合継続動作できないからそれで十分。
逆にCのreadのような、ディスクの読み取りエラーのような時は普通使わない。

464 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 14:33:18 ]
>>463
発生したところで異常終了するしかないなら、その場で
exit() なり abort() なりすればいいだろう。

細かい read() をいくつも組み合わせるようなプログラムのときは
例外使うと便利だよ。

465 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 14:38:11 ]
いちいちexitやabort書くのも面倒だよ
いっきにまとめてどっかーんなんて使い方ができるのも例外の魅力

466 名前:デフォルトの名無しさん [2007/07/27(金) 14:51:36 ]
すいません。C言語初心者なんんですが、プログラムの作り方がわかりません。
計算を繰り返すのですが、最初に数字を入れて次に、+、-、*、/、=を画面に出力
し、=が選ばれるまで計算を繰り返すプログラムです。=が選ばれれば、合計が出
てくるようにし、そしてまた次の計算をするようにしたいんです。どなたか教えて
いただけませんか?

467 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 14:54:18 ]
>>466
自分で作ってみたのを出してみて



468 名前:デフォルトの名無しさん [2007/07/27(金) 14:58:04 ]
どのぐらいの数の変数を宣言したらいいのかわからないんです。

469 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 14:59:30 ]
>>468
必要なだけ作ったらいいよ。まずは書いて動かせ。

470 名前:デフォルトの名無しさん [2007/07/27(金) 15:01:18 ]
ありがとうございます。
頑張ってやってみます。

471 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 15:01:37 ]
>>468
適当でいいよ。とりあえず作れ

472 名前:デフォルトの名無しさん [2007/07/27(金) 15:08:04 ]
#include"stdio.h"
int main(void)
{int a,b,c;
char d="+,-,*,/,=";
scanf("%d",&a);
printf("\n");
printf("%s\n",d);
d=getchar();
switch(d){
case('+'):


case("-"):

case("*")

case("/")

case("=")

}
このcase(+)などの次が全くわかりません。


473 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 15:11:43 ]
つまり電卓みたいにしたいのか。
まずは数字を入れたらそれを表示するだけのものを繰り返すものでも作っては。

474 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 15:14:13 ]
>>472
人に見せるときはなるべくコンパイルできるようにしとけよ。

で、 + とかが入力されたときの動作はスレ住人にはさっぱり
わからん。好きにしろ。それともエスパー募集か?

475 名前:デフォルトの名無しさん [2007/07/27(金) 15:15:21 ]
単純に一度だけ+、*などの計算をし、表示はできたのですが・・・。

476 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 15:15:26 ]
>>474が見えない

477 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 15:17:59 ]
最初の数値一個と + だけで何を計算するんだろうな?



478 名前:デフォルトの名無しさん [2007/07/27(金) 15:24:53 ]
+、-、*、/を選んだらまたscanfを使って=が入力されるまで計算したいんです。

479 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 15:30:47 ]
>>478
まあそれは繰り返し(while 等)を覚えれば何とかなる。
計算のほうは仕様を明確にしてくれ。

480 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 16:07:03 ]
>>466
大体こんな感じにやりたいんでしょ?

#include<stdio.h>
main(){int a,b=0;char c='+';for(;c!='=';){printf("数値");scanf("%d",&a);if(c=='+')b+=a;else if(c=='-')b-=a;else if(c=='*')b*=a;else if(c=='/')b/=a;printf("演算子");scanf(" %c",&c);}printf("%d\n",b);}


481 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 16:12:41 ]
>>463
read()が例外をスローしないのは、Cだからだ。

いまどきの例外機構をもった言語なら「ディスクの読み取りエラー」では
IOErrorのような例外がスローされるのが普通だ。

>エラーが発生したところで、どうしようもなく、ソフトを異常終了するしかない時に使う。
人に教えられるほど例外を理解していないぞ。

482 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 16:37:44 ]
例外はエラーじゃないし、ソフトを異常終了するしかない時も正しくない
463の説明からすると、例外なんて使わずexit()すべきということになる
まっ、知ったかに教えてやることなんてないけどな

483 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 16:48:28 ]
最近のIVってなんなの〜?

484 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 17:50:14 ]
>>463
>エラーが発生したところで、どうしようもなく、ソフトを異常終了するしかない時に使う。

俺が例外覚えたての頃の思考と同じだわ。
例外を有効に使えてない。

485 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 17:55:00 ]
今はどういう思考?

486 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 17:56:09 ]
低脳に、エラーが発生したところで、どうしようもなく、ソフトを異常終了するしかない時に使う。 と教える思考

487 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 18:00:38 ]
を、俺が例外覚えたての頃の思考と同じだわ。 例外を有効に使えてない。と言う思考



488 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 18:05:03 ]
エラーを考慮しなくていい中間の関数が便利だな
下の例外を上にまる投げ

489 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:24:44 ]
int main(void)
{
   for(int i=0;i<100;i++)
   {
      if(条件式)
      {
         // 何かの処理
         // ※ここでbreak;するのとreturn 0;するので動作が同じ場合、
         // どちらを使うべきでしょうか?サイズや速さに関係ありますか?
      }
   }
   return 0;
}

490 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:38:56 ]
>>489
サイズも速度も最適化が働けばそれほど気にするレベルじゃない。
俺個人はbreak派。別にreturnでもいいと思う。お好きなほうを

491 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:40:08 ]
break; のが意味的にはいいんじゃないかな。
サイズとか速さとか、正直どうでもいいレベル。

492 名前:489 mailto:sage [2007/07/28(土) 01:00:34 ]
どうもありがとうございました。

493 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 09:33:07 ]
気になるならアセンブリ出力させて比較すればいいじゃない

494 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 09:54:12 ]
1度しか実行されないものでそんなこと気にしても・・・。

495 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 20:28:12 ]
プリコンパイル済みヘッダーを設定したくて調べてやってみたんですが
Debugの時は上手くできて、Releaseの時には大量のリンクエラーがでます
何故だかわかる方いらっしゃいますか?

エラーメッセージはこんな感じです ↓
(なんだかよく解らない長い文字列)は***(ファイル名)で既に使用されています


496 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 20:41:54 ]
デバッグとリリースで同じ設定にしてるか?
フルビルドしてみたか?

497 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 20:43:33 ]
>>495
ReleaseとDebugで設定が違うんじゃないかな。
VC++ならプロジェクトのプロパティで構成を変えればそれぞれの項目が変わってるか確認できるはず。
全ての構成にして空白になっているところがあれば怪しいと思われ、DebugとReleaseで違う項目だと空白になるから。
Debugでは指定しているファイル(ヘッダー)が無いReleaseでは無いとか初心者が陥る罠。



498 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 21:19:51 ]
>>496 >>497
同じ設定というか、DebugもReleaseもプリコンパイル済みヘッダーの部分と
追加のインクルードディレクトリ、追加のライブラリの部分以外はいじってません(デフォルトのままです)
何か設定を変えなきゃいけないところがあるのでしょうか?

あと、こういう警告もたくさん出ていました↓
warning C4727: 同じタイムスタンプを伴う、**.pch と名前指定された PCH が ***.obj で見つかりました。最初の PCH を使用します。

499 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 21:26:07 ]
>>495です
プログラムの全体の最適化 の項目を「いいえ」にすると
違う警告が出るようになりましたが、エラーはなくなりました
他にも色々設定をいじってみます

>>496さん>>497さん ありがとうございました


500 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 23:42:06 ]
小野坂とかアナゴさんとかチワとかレナとか色々でてるな。
ところで今回のサザエさんはアナゴさん回なのにいつから始まるか分からない件

501 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 23:42:42 ]
そうだな

502 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 23:51:47 ]
アニメスレと間違えたぜ

503 名前:名無しさん@そうだ選挙に行こう [2007/07/29(日) 05:40:09 ]
Windowsのiniファイルなんだけども、
単に読み書きだけじゃなく、コメントとかも付けようとしたら、やっぱり自前?

504 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 06:15:42 ]
C言語で、0で割る計算エラーなんだけど
必要なもの宣言してるとして、


scanf("%d",&a);//前数
scanf("%d",&b);//後ろ数
printf("演算子の入力");
fflush(stdin);
o = getchar();

if(o=='/'|| o=='%' && b=="0"){
printf("エラーです。数値、演算子をお確かめください。\n");
}

とここまでやってelseで
x=a%b; や x=a/b; すると異常終了しちゃう。

演算子が「/」または「%」、かつ割数が「0」なら
if使って計算式までいかないようにしてるつもりなんですけど、
なぜエラーなのかわかりません。教えて下さらないでしょうか?

505 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 06:26:00 ]
|| より && の方が優先順位が高いから if 文の中身は
( (o=='/'|| o=='%') && b=="0")
って書かなきゃダメだと思われ。

506 名前:504 mailto:sage [2007/07/29(日) 06:34:05 ]
>>505
そちらも試したのですがだめなのです。

おそらくif乗り越えての計算で不正終了、てな気がするんですけど。
この条件式でどこが駄目なのかさっぱり・・・。

507 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 06:38:25 ]
んではこれで。
( (o=='/'|| o=='%') && b==0)



508 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 06:38:25 ]
マテ。bはintだろ。b=="0"ってのはおかしいだろ。コピペミス?
ちょいソース全部貼ってみて(長いようなら、うpロダに上げて)

509 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 06:41:46 ]
文字列定数と比較してるせいだと思うけど。

510 名前:504 mailto:sage [2007/07/29(日) 06:47:44 ]
>>507
うおっ!できました!
intをダブルクオーテーションで囲んでたのがミスだったのですか
ありがとうございます!
>>508
a,b,xはintで
oはcharにしてました。
intは「”」
不要だったんですね迂闊でした。
>>509
charとの比較ですかね?
とりあえず>>508で解決しました!

511 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 06:53:32 ]
"0"との比較だよカス

512 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 06:58:15 ]
コンパイラエラー吐かないの?

513 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 07:57:43 ]
main関数にある関数のポインタを返す関数
get_numを使いたいんですが、宣言はどうすればいいでしょうか。

#include <stdio.h>

int zero(void){return 0;}
int one(void){return 1;}
int two(void){return 2;}

int (*(*get_num))(void)
{
static int (*num[3])(void) = {zero, one, two};
return num;
}

int main(void)
{
int (*num[3])(void) = {zero, one, two};
printf("%d\n", (*num[0])());
return 0;
}

514 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 08:30:44 ]
こう?
typedef int (*func)(void);

func* get_num(void){
static func num[] = {zero, one, two};
return &num[0];
}

515 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 08:53:13 ]
>>514
できました。ありがとうございます。

516 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 09:20:59 ]
&num[0] なんてしなくても num でいいんじゃないの?

517 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 10:06:10 ]
>>516
そうですね、使うときに0を指定する形で。



518 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 14:47:10 ]
いや先頭のアドレスを渡すだけでいいってことじゃないのか?

519 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 15:07:19 ]
上記のプログラムだと
&num[0]  = num
なので、出来る限りシンプルなコードにするために後者にしたほうがいいとは思う

520 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 15:20:54 ]
等号なのか代入なのか一瞬迷った

可読性で前者を選ぶのも別にいいんじゃない?
先頭のアドレス渡してるってのがわかりやすいし。

521 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 16:05:39 ]
C言語でソートプログラムを配列・連結リストを使って作りました。
それぞれの利点は何でしょうか?
リスト版はかなり遅く、配列版のほうがかなり高速だと思うのですが。
ソートプログラムをリストで作る理由は何がありますか?

522 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 16:07:23 ]
>ソートプログラムをリストで作る理由は何がありますか?
勉強だから

523 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 16:08:54 ]
リストは動的にできる

524 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 16:36:05 ]
すいません
VC++で コマンドライン引数を加えて実行したいのですが
どうやればいいのでしょうか?

具体的には
-o 読み込みたいファイル名.c みたいな感じです

F5を押して、-o 〜 をいれて実行するといったことをしたいのです


525 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 16:40:24 ]
スレ違いだが、プロジェクト→プロパティ→構成プロパティ→デバッグ

526 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 16:50:44 ]
ここですか
ありがとうございまする

527 名前:デフォルトの名無しさん [2007/07/29(日) 23:43:32 0]
winsock2なんですけど、テキストを受信したとき最後にバイナリが付くんですけど
こういう仕様なんですか?



528 名前:527 [2007/07/29(日) 23:48:45 0]
自己解決しました

char buf[64];なのに、strlen(buf)サイズ分受信していたのがいけませんでした

char buf[70];にして、64バイトずつにしたら直りました

529 名前:527 [2007/07/29(日) 23:50:33 0]
相手側の負荷の少ないのは、
多めに要求して受信した方がいいんでしょうか?
結局、取れるサイズは返却されますから・・・回数が少ない方が負荷が少ないような気がします

530 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 00:00:55 0]
>>528
ちょwwwおまwwww
strlenてw
sizeof(buf)だろ。

531 名前:527 [2007/07/30(月) 00:03:44 ]
>>530
ちょwwwおまwwww
sizeof(buf)てw
何がいけないの?

532 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 00:08:02 ]
strlenじゃ何文字かは分かるが、大きさは分からないだろ

533 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 00:34:26 ]
buf[0]が\0だったら永遠に受信終わらないんじゃない?

534 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:20:47 ]
c言語入門の本を見ながら学習しているのですがいまいちプログラムという実感がわきません
ベクターとかにあるアプリなどはc言語で作ったり出来るのでしょうか


535 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:22:53 ]
Cじゃちょっときついもんもあるだろうな。
ゲームとか希望してるなら別言語いったほうが早いと思う。

536 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:28:49 ]
プログラム大きくなってくるとCだと面倒だろうね。
クラスが使えるって点だけでもC++は偉大だと思う

537 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:40:10 ]
>>534はCよりも先にHSPなりsystem4.0なりを勉強した方がいい気がする。
んで不足が出たらC++なりVisual C++なりに行けばいいんじゃない?



538 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:44:26 ]
(笑)

539 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:45:05 ]
回答ありがとうございます。
パソコンが好きで自分でいろいろなプログラムを作ってみたいと想い移植性が高いということでc言語を選んだんです
多少かじった程度の者が言うのも申し訳ありませんが
c言語を始めたのでまずc言語を満足に出来ると思えるようになった別の言語にも挑戦したいと思います。
プログラムによってこの言語が向いているというのはやっぱりあるのでしょうか?

                                                   長文すいません

540 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:48:26 ]
はじめがHSPじゃ応用が利かなそう。。
素BASICからプログラムに入った漏れは結構苦労したし。
将来的なこと考えて無理してでもC++薦めたい

541 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:48:33 ]
移植性!?

542 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:48:35 ]
実感がわかないってのはすんなり理解できてないからだろきっと
なでしこにでもしておきなさい

543 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:53:05 ]
>>539
Cが移植性が高いっつーのは、あくまでマシン語やアセンブリ言語に比べてのことだ。
後は、強いて言えば組込やメインフレームを含む大概の環境をターゲットとする
Cコンパイラ(クロスを含む)が存在するのも確かだが、本当にそういう環境で
プログラムを動かしたいのか?

WindowsやUnixやMacのようなメジャーな環境をターゲットとして
ポータブルなプログラムを書きたいのなら、Cよりずっと適した言語が
たくさんあるし、何しろCは何をやるにも面倒くさすぎて、やりたいことが
出来るようになるまでの道のりが遠い。
C++ならCよりずっと言語的に強力だがお世辞にも初心者向けとは
言いがたいので、とりあえず最初のうちはもっと手軽な言語を薦める。

544 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:54:36 ]
C言語から始めてC言語の限界を知って
C++に移行すると幸せになれるかも

STLのおかげで連想配列も使えるようになるとかイイ!
classのおかげでいろんなものをラップできるとかイイ!
と思えるようになる

545 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:55:36 ]
移植性を重視するならJavaがいいんじゃない
メジャーだし

546 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:59:28 ]
>WindowsやUnixやMacのようなメジャーな環境をターゲットとして
>ポータブルなプログラムを書きたいのなら、Cよりずっと適した言語が
>たくさんあるし、
例えば何?

547 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:59:49 ]
仕事でやってるとJavaに将来性を感じないな。
最近はC#に乗っ取られとるし
組込みではまたC/C++が主流になってきとる



548 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:00:44 ]
>>546
J#

549 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:00:49 ]
インタープリタなRubyから入るってのもいいかも。
書く量も少なくてすむし。
ただRubyから入ると他の言語がめんどくさく感じて移れない可能性はあるが。

550 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:01:09 ]
俺は最初Delphiを数年
その後C/C++に進んだけど、ポインタもクラスもすんなり理解できた

551 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:02:02 ]
Javaってメジャーなの?そりゃもっとマイナーなものがあるけどさ。

552 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:02:45 ]
>>546
PerlでもJavaでもPythonでも、言語側でシステムを抽象化する層を設けていて
標準的なライブラリがリッチなものなら、何でもいい。

C++に手を出すのはそれらに不満を覚えてからでも遅くは無い。
そして、Cに手を出す必要は、多分無いだろう。

553 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:02:50 ]
>>550
Delphiは応用きくでそ。ポインタももともとあったし

554 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:03:40 ]
>>548
既に滅んだんじゃ

555 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:04:32 ]
ベクターにあるようなアプリを作りたいなら、DelphiかC#だな
C++から始めると挫折しそう

556 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:05:15 ]
Delphiに手を出すにはちょい時期が遅いかも

557 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:06:53 ]
DelphiはVBに乗っ取られました



558 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:07:00 ]
じゃあVCL使ってBCBは?

559 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:07:19 ]
>>550
Delphi良いんだけど
関連書籍が手に入りにくくて苦労した

560 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:07:19 ]
BCBは情報無さ杉www

561 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:08:43 ]
実際プログラムを作っている方々は複数の言語を熟知しているのでしょうか。

562 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:10:10 ]
熟知する必要なんかないでしょ
わからなければ調べりゃいいだけだし

563 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:12:21 ]
>>561
何をもって熟知と言うかによるが、コンパイラが書けるぐらいに複数の
言語に熟知してる人なんてそうはいないと思われ

まあ必要があれば仕様にあたればいいんだけどね

564 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:13:28 ]
>>561
熟知はしてないなぁ。ほとんど応用。
C++をBCBで覚えたから必然的にDelphi覚えて
VBはDelphiの応用でいけて
CGIもやりはじめたからPerlも覚えて、応用でPHPとか。

565 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:13:51 ]
ベクターにあるアプリと言ってるあたりCUIは無いだろうから
言語は決まったとしても移植性を尊重するならGUIが問題だな
Win32以外のGUIツールキットは資料が少な目で入門は大変そう

566 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:15:20 ]
> ベクターにあるアプリ
ああそういうの書きたいっつってんのか
移植性とは相反する要求だなw

両方追い求めると無駄に苦労するぞ

567 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:19:24 ]
GUIだと
Delphi、VB、BCB、VC++とかかなぁ

Delphi →滅びる寸前
VB →便利だけどランタイム必須
BCB →滅びてる?初心者向けな情報皆無
VC++ →GUIアプリ作るにはとっつきにくい



568 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:20:22 ]
こんなことが出来るアプリを作りたいっていう具体的な目標が無いと
覚えるのは難しそう

569 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:20:38 ]
GUIで移植性も考えるならwxWidgets使うとかすれば

570 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:20:59 ]
電卓とかそういうのでいいならMFCが楽?
んでもゲームとか言われるときついよなぁ。

571 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:21:42 ]
VBも.NET以外は絶滅だろ
.NETなら言語はどれでも大差は無いが、やはりランタイムは必須

572 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:22:22 ]
テキスト形式のアドベンテャーでいいよもう

573 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:23:54 ]
パズルとかな
3Dでゴリゴリとか言わなきゃ良い

574 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:25:03 ]
Delphiもエディタが使いやすければ、ほんとあれで十分なんだけどね。。

575 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:26:52 ]
better C として使うだけでも
C++ にする価値はあると思う。

576 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:29:18 ]
>>575
Cの気色悪いシンタクスで書かれた宣言がスラスラ読めるぐらいでないと
C++はキツいだろう

577 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:29:27 ]
まぁVC++だろうね。情報もいっぱいあるから
つまづいてもだれか教えてくれるし。



578 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:34:05 ]
難しいんだろうなっていう先入観が無ければどんなもんでもいけるよ多分

579 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:37:20 ]
参照があるだけで随分分かりやすくなると思うが。

580 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:37:44 ]
C++はそろそろboostが標準になるだろうから使いやすくなるはず。

581 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:38:06 ]
>>576
そりゃお前の思い込みだろw

582 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:38:31 ]
0x はいつから使えるようになるんじゃー

583 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:38:56 ]
>>580
まじか!ソースきぼんぬ

584 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:39:35 ]
今ひどい釣られ方を見た。

585 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:40:58 ]
EffectiveC++に「std::tr1::shared_ptrはイイヨ〜」と書いてあったんだが、
何をincludeすればいいんだぜ?

586 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:40:59 ]
>>581
いや、そうじゃないとC++のヘッダ読んでも意味不明だろ?
もっと奇怪なものが大量に増えているし、C++はそもそも宣言的な言語だ。
宣言が理解できないようでは話にならん。

Cの関数ポインタとか多重ポインタとか配列がらみの宣言程度が
分からないようじゃ、ダメだろう。

587 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:41:50 ]
>>583
C++ の次期ドラフトとか見ると、色々導入されてるね。
boost はそもそも将来標準に組み込まれることを前提として開発されてるものだからな。



588 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:42:55 ]
>>586
better C として使う分には、C++ は C より簡単。
それを越えると厄介な所が出てくるが。

589 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:43:38 ]
そもそも将来標準に組み込まれることを前提として開発されてるものでいったいいくつ消えていったのか

590 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:44:43 ]
>>589
いわゆる叩き台ってやつだな。
その中で入れた方が良さそうなものを入れていく感じだ。

591 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:45:05 ]
>>588
better Cってのをどの程度に言ってるか分からんが、
ヘッダやマニュアル理解できないんじゃ、つらいだろ

Cヘッダだけしか使わないとか?
でも、std::basic_string<>やSTLすら使わないんじゃC++の魅力は
半減どころじゃないんじゃないか

592 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:47:55 ]
>>586
ポインタ関係は教科書にも載ってるからまだしもだが
確かに、テンプレート、マクロの類は慣れるまで大変だったな

593 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:48:41 ]
>>591
C よりゃマシ。

594 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:50:25 ]
参照の用途としてポインタを使う方法を教えるよりは
参照を教える方がナンボか楽だな。

595 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:51:06 ]
>>591
クラスとオーバーロードだけでもかなり書きやすくなるんじゃね?
STL無しのC++が魅力半減ってとこは同意だけど。

596 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:51:24 ]
>>593
俺は別段Cを推奨する気は毛頭無いが、言語自体はシンプルだろ。
要素が絶対的に少ないんだから。結局はマクロ、関数、構造体、配列、
ポインタ、といったもので何でもやってしまうのがCで、欠点は
あまりに言語が貧弱なので、何をするにも面倒くさいというだけだ。

C++は言語がずっと強力だが、その分複雑だ。

俺はどっちも初心者に薦める気にはならん。

597 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:56:14 ]
>>594
C++の参照は単に関数での「参照渡し」だけじゃないからなあ。
参照やポインタを教えるには、結局は間接参照、左辺値、エイリアシングといった
ことについて教えることになる。ポインタには演算もあるが、些細なことだ。
ほとんど違いは無いと思うが。

>>595
演算子オーバーロードはコードを書きやすくするが読みにくくする。



598 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:58:00 ]
>>597
better C として使うなら、参照渡しだけ分かっとけば十分。
それ以上は不要。

あと、演算子オーバーロードの事なんて誰も言ってないように思えるが。

599 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:59:23 ]
>>598
いや、あんたの言う「better C」とやらが、つまり何なのか分からんからなw

600 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 03:00:11 ]
better C というと、
C でややこしい所を解決するためにだけ C++ の機能を使う、
という程度のこと。

601 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 03:02:19 ]
で、リファレンス渡し以外には何が増えるんだ?
クラスは使ってもいいの?

602 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 03:03:28 ]
newしないでクラス使えば間接参照もしなくていいしw

603 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 03:10:12 ]
C99 は今は考えないとして・・・

・ 関数のオーバーロード
・ プロトタイプ宣言なくても関数使えちゃうのを阻止
・ main で return 0; 省略

とか?
まあ、そんなに色々使わなくてもいいんだよ。
C より便利になる点が 1 つでもあれば。

604 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 03:13:54 ]
ああ、そうだ。こいつらもだな。

・ 変数をブロックの途中で宣言
・ for(int i = 0; ...
・ 初期化に関するいくつかの制限緩和

605 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 03:15:07 ]
それそんなに便利かなぁ。
そこまで制限してC++使おうと思ったこと無いからよくわからんが……。

Cプログラマが初見で本気で便利だと思うのって、標準ライブラリの強力さ、
それとクラス、特にデストラクタの存在じゃないか?
自動で後片付けしてくれるなんて、夢のような環境だろ。

逆に言うと、その辺が使えないんなら、ゴミのような違いでしかないように
思える。

606 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 03:18:18 ]
別に C プログラマに教えるという話じゃなくて、
プログラミング初心者に薦めるならという話の流れだったはずだが。

607 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 03:19:56 ]
>>605
そもそも初心者なんだから
制限して使うっていうのはちょっと違う



608 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 03:20:40 ]
むしろ C にある無駄な制限を取っ払うわけで

609 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 08:50:28 ]
質問1つでここまで伸びるなんて久々に見た

610 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 08:58:59 ]
ほとんど俺の自演だけどな

611 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 13:30:25 ]
>>605
そこまでいくとBetter Cではなく、もうC++。

612 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 13:40:37 ]
>>609
馬鹿が「なんか自分が賢くなったような気分」で気軽に参加できる
絶妙なレベルだったんだろう。

613 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 14:44:25 ]
ReadFile() vs fopen()


614 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 15:07:20 ]
CreateFile()の間違いじゃないのか

615 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 15:43:12 ]
なんにせよ適材適所、時と場合によって使い分けるだけ。

fopen テキストモードを使いたい。ANSI C上の移植性が欲しい。
CreateFile 非同期読み書きやメモリマップドファイルを使いたい。

616 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 16:06:50 ]
このコードがVS2005 SP1でSEGVになるんだけど、俺んとこだけですかね

#include <iostream>
#include <sstream>
#include <locale>
int main()
{
    std::wstringstream ss;
    std::locale myloc("japanese");
    ss.imbue(myloc);
    ss.put(L'「');
    int n;
    if (ss >> n) // <--- SEGV
        std::cout << n << std::endl;
}

617 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 16:09:23 ]
nはいくつよ?



618 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 16:18:49 ]
>>617
は?

619 名前:616 mailto:sage [2007/07/31(火) 16:20:12 ]
ちなみにこれとほぼ同じコードがboost::xpressiveで正規表現を
コンパイルする際に使われているのですが、
これがSEGVになるお陰でワイド文字でboost::xpressiveが使えないという有様です。

620 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 16:33:09 ]
ワイド文字は色んなコンパイラでサポート不完全だよな。

621 名前:616 mailto:sage [2007/07/31(火) 16:37:03 ]
>>620
VC8.0はグローバルロケールを設定した際に標準出力が腐るのは知ってたんだけど……
(Cではグローバルなロケールしかないので回避方法も無い)
これは酷すぎる。と思った。サポート不備ではなく、ただのバグでしょう。

無論VS2003では何の問題も起きないコードです。数値として読み込めないものが
入っているから、intに読み込めずstreamの状態がfailになるのが正しいんですが。

622 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 16:37:52 ]
>>616
xlocaleの_Maklocbyte<wchar_t>がバグっちょる。

template<> inline
  char __CRTDECL _Maklocbyte(wchar_t _Char,
  const _Locinfo::_Cvtvec& _Cvt)
 { // convert wchar_t to char using _Cvtvec
- char _Byte = '\0';
+ char _Byte[2] = {'\0'};
 _Mbstinit(_Mbst1);
- _Wcrtomb(&_Byte, _Char, &_Mbst1, &_Cvt);
- return (_Byte);
+ _Wcrtomb(_Byte, _Char, &_Mbst1, &_Cvt);
+ return (_Byte[0]);
 }

と直せばとりあえず、動くようにはなる。

623 名前:616 mailto:sage [2007/07/31(火) 16:48:25 ]
>>622
ウホットンクスです。
とりあえずヘッダ修正してみた。
_Byte[]が2byteでいいのは「MS Windowsだからそう仮定して良い」てことですね。
しかしひでーバグだ。

修正したヘッダのコードなら正常に動くことを確認しました。感謝。
が、コンパイルオプションによっては、MSVCP80.DLLに入ってる特殊化バージョンが
リンクされてしまい、やはりバグってしまいますね。
勘弁して欲しい。

624 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 16:52:29 ]
勘弁して欲しいのはお前の方だ

625 名前:616 mailto:sage [2007/07/31(火) 16:54:11 ]
>>624
あ、もしかしてこれって有名なバグだったんですか?
それは失礼。

626 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 21:23:11 ]
VS 2005 で↓が警告最大でも普通にビルドでき、しかも、デストラクタで
実行時エラーになるのは既知の不具合ですか?

#include <memory>
int main() {
std::auto_ptr<int> i = new int(1);
}

g++ だと型の不一致できっちりコンパイルエラーになります。

627 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 21:26:43 ]
確かにコンパイルできたけど、実行時エラーにはならなかったよ。



628 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 21:53:19 ]
>>622
調べてみたらVS2003でも同じコードだった


すげー萎えた

629 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 22:04:03 ]
おっきした

630 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 23:02:03 ]
>>627
むむ。new int(10) でもエラーにならないですか?

631 名前:627 mailto:sage [2007/07/31(火) 23:08:21 ]
それでもエラーにならなかったよ。
Visual C++ 2005 EE (SP1)

ところで、.NET 2003 (SP1)では
コンストラクタがexplicitと宣言されているからと言って、C2440のエラーになる。

632 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 23:23:00 ]
規格では explicit になってるから、>>626 はエラーじゃないとマズいな。
ビルドできるって、VS 2005 の memory の中身はどないなっとるんじゃ。

633 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 23:28:52 ]
ひ・み・つ♪

634 名前:デフォルトの名無しさん [2007/08/01(水) 00:06:07 ]
ソース解析中分からないところがあり質問させてください。

#define A_NUM (20000)
class A : public B{
private:
static C < (unsigned long) A_NUM > list;

C++勉強し始めて日が浅くて申し訳ないのですが、上記ソースの一番下の行は
どういうことをしているのでしょうか?


635 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 00:08:00 ]
C というクラステンプレートのテンプレート引数に A_NUM を指定して、
そのオブジェクト list を宣言

636 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 00:15:42 ]
>>635
さんくす。
クラステンプレートがよく分かってなかったので、
その箇所を詳しく調べることにします。

637 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 02:04:47 ]
初心者的質問ですが、お願いします

int *x[3];
x[0]=(int *)malloc(3);
x[1]=(int *)malloc(4);
x[2]=(int *)malloc(5);

free(x);


上記のようにポインタの配列に各個mallocして、最後にfreeをすると
エラー(コンパイルは通る)がでてしまいます。



638 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 02:08:08 ]
>>637
free(x[0]);
free(x[1]);
free(x[2]);

639 名前:637 mailto:sage [2007/08/01(水) 02:13:50 ]
>>637のソースが抜けておりました・・・申し訳ございません・・・


x[0]=(int *)malloc(3);
x[1]=(int *)malloc(4);
x[2]=(int *)malloc(5);

for(i=0;i<3;i++)x[0][i]=i;
for(i=0;i<4;i++)x[1][i]=i*3;
for(i=0;i<5;i++)x[2][i]=i*10;

free(x[0]);
free(x[1]);
free(x[2]);

640 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 02:19:53 ]
>>639
x[0]=(int *)malloc(3*sizeof(int));
x[1]=(int *)malloc(4*sizeof(int));
x[2]=(int *)malloc(5*sizeof(int));

641 名前:637 mailto:sage [2007/08/01(水) 02:26:02 ]
>>640
おお、上手く通りました。
ありがとう&&多謝

642 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 11:11:44 ]
質問です
クラスを継承させて使うときに基底クラスのprivateなメンバ変数を
publicではなく、privateの状態のまま継承させることはできないでしょうか?

643 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 11:26:45 ]
意味がよく分からん。
基底クラスの private 変数は派生クラスから見ても private じゃねーの?

644 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 11:43:31 ]
てか、派生クラスから見えないし。

645 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 11:46:32 ]
派生クラスで使いたいならprotectedにするだろうしねぇ……

646 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 11:52:23 ]
>>642
>>645の言うように派生クラスから基底クラスのprivate変数に
アクセスしたいって意味なら基底クラスを変更するしかないな。
他の選択肢はpublic、アクセッサの追加、friendとかかね

647 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 13:22:08 ]
VC++ 2005 Expressを使用しています。
Windowsのデスクトップ上のアイコンをデスクトップ設定の自動整列以外で移動するにはどうしたらいいでしょうか
例えば全体的に右にあるアイコン群を左によせたり上にあるのを下に〜等
よろしくお願いします



648 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 13:54:28 ]
こっちのスレに行くか、Windows板に行くかのどっちかだと思う
Win32API質問箱 Build55
pc11.2ch.net/test/read.cgi/tech/1184853465/


649 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 14:03:56 ]
あとは、、、SysListView32 デスクトップ アイコン 移動 でググるとか

650 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 21:39:29 ]
>>631
今日会社の VS2005 PE に SP1 を当てたけど、デバッグビルドで実行
すると、operator delete で落ちます。何が違うのかしら。

>>632
memory はたぶん問題なくて、最適化がからんでそうです。代入文が、
std::auto_ptr<int> i(std::auto_ptr_ref);
に変形していて、デストラクタで int の値を解放しにいって落ちると。
もぎゃー

651 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 21:47:54 ]
もぎゃーってなに?

652 名前:もぎゃー mailto:sage [2007/08/01(水) 22:44:09 ]
なんかはやらそうと狙ってる予感。

653 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 05:56:27 ]
void型って、どんな型にも切れるただのメモリアドレスって考えれば良いのですか?

654 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 06:07:04 ]
void型なんて変数は存在せんぞ。
void *型ならあるが。

655 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 06:48:25 ]
std::auto_ptrみたいな不良品つかわずにboost::scoped_ptr使えばいいのに

656 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 07:45:14 ]
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4803.txt

正の整数を二つ読み込んで、その乗算をシフト演算によって行いたいのですが、プログラムがうまく動きません。
強制終了されてしまいます。

(例) 53×25=53×(2^4+2^3+2~0)=(53を左に4ビットシフト)+(53を左に3ビットシフト)+(53を左に0ビットシフト)

どこが悪いのでしょうか・・・。

657 名前:656 mailto:sage [2007/08/02(木) 07:46:01 ]
あ、2^0です。



658 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 07:58:22 ]
mainのkが未使用変数の使用であるとかって警告でなかった?
エスパーすると、divideのkがmainのkに影響を及ぼすことはないよ。

659 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 08:00:34 ]
おっと、未使用変数->未初期化変数、または、値の割り当てられていない変数

660 名前:656 mailto:sage [2007/08/02(木) 08:13:08 ]
>>658
はい、警告とかは出てないんですよ・・・。
どこをどう直せばいいでしょうか。

661 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 08:29:17 ]
ヒント:ポインタ アドレス渡し

662 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 08:37:18 ]
まずはコンパイラの警告レベルを最大にすることだな。
VC++なら/W4
bccなら-w
gccなら-Wall

663 名前:656 mailto:sage [2007/08/02(木) 08:56:45 ]
>>662
おお!そんなことができるのですね。ありがとうございます。

警告 W8013 test.c 26: 's' は、おそらく値が代入される前に使われている(関数 divide)

と出ました。どういう意味でしょうか・・・。

664 名前:656 mailto:sage [2007/08/02(木) 09:12:45 ]
>>661
ありがとうございます。kのアドレスをdevideに引き渡せばいいのですね。
そこは修正したのですが、まだダメみたいです・・・・。

665 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 09:48:28 ]
void* と char* のビット表現は等しいんだっけ?

666 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 09:52:07 ]
int s;

*k = 0;
while (no>0) {
 count[*k] = analyze(no, s); ←初期化されてないsが使われてる
 no -= (1<<count[(*k)++]);
}

667 名前:656 mailto:sage [2007/08/02(木) 09:53:38 ]
すいません、できました。
divide関数内で
*k++とかいう変なことをしてたみたいで・・・

*k += 1;

と書き換えたらできました。
ありがとうございます。



668 名前:656 mailto:sage [2007/08/02(木) 09:55:16 ]
>>666
ああなるほど、ポインタは括弧をつければよかったんですね・・・orz

sは初期化されてないからですか・・・わかりました、ありがとうございます。

669 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 10:03:19 ]
>>665
うん。

"A pointer to void shall have the same representation and alignment requirements as a pointer to a character type."
ISO C 6.2.5 Types p26

670 名前:656 mailto:sage [2007/08/02(木) 10:03:24 ]
というか、sを戻り値として返すなら、divide関数でsはいらないですね・・・。
アホだ・・・orz

671 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 15:03:47 ]
Wallにしたら標準ライブラリでさえゴルァされるから使い物にならんと思うんだけど

672 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 15:06:18 ]
>>669
d

673 名前:デフォルトの名無しさん [2007/08/02(木) 15:31:38 ]
std::vector<int> v;って宣言したときにこれのサイズを保持する型を
std::vector<int>::size_typeって宣言するのではなく
変数名vを使って宣言したいのですがなんか良い方法無いですかね?

typeof(v)::size_typeとかboost::range_size< typeof(v) >::type (←勿論通りません><)
みたいにできたらめちゃ便利だと思うんですが

674 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 16:03:34 ]
typeof は提案されたこともあるみたいだけどねえ。
いまんとこはできないね。

そういう場合は typedef しとくというくらいしか言えんなあ。

std::vector<int> v_t;
v_t v;
v_t::size_type i;

675 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 16:06:22 ]
typedef が抜けてた。まあいいや。

676 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 16:07:40 ]
><;

677 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 16:12:12 ]
<>;



678 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 16:13:49 ]
×;

679 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 16:26:34 ]
◇;

680 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 16:34:10 ]
チョー!

681 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 16:34:32 ]
BASIC スレにでも迷い込んだのかと思った

682 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 16:38:20 ]
CLS

683 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 16:53:10 ]
すいません。
void *型ってどんな型にも切れるただのメモリアドレスって考えれば良いのですか?


684 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:08:12 ]
お前別スレで質問してきちんとした回答貰ってるだろうが
礼儀知らずにも程がある

685 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:10:30 ]
ええ〜、してないですYo!

686 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:13:33 ]
死ね

687 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:19:25 ]
一方的に決めつけられて、死ねといわれる始末。
なんという仕打ち。



688 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:19:49 ]
「切れる」っていうのが、なんかアクロバティックな用法だなあ。
こう、「アタシは侍ザマス!」みたいな?
「void*型からunsigned long(*)(bstr_t const&, IDispatch**)型に斬ってしんぜるナリ!」みたいな?

689 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:22:55 ]
>>683
言葉の使い方は他人に通じるように

690 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:23:44 ]
>>673-674
今はdecltypeという名称になっている。

691 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:26:33 ]
>>687
同じ文体なんだから別人なら普通変えるだろ。バカかよ

692 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:27:25 ]
不毛

693 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:31:11 ]
><;

694 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:35:58 ]
>>684
そのスレどこ?

695 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:58:27 ]
>>692
C++スレだけに

696 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 18:08:50 ]
>>694
pc11.2ch.net/test/read.cgi/tech/1184717430/653-654

>>695
誰がうまいこと言えと(ry

697 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 18:25:13 ]
>>684
別スレじゃなくてこのスレかよ
>>685
お前の言葉は本当だったな



698 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 19:16:35 ]
構造体のサイズをsizeofで取るとなんか不思議な結果が返ってくる。

struct TEST {
char chr[3];
};
printf("%d\n", sizeof(TEST));

結果:3

struct TEST2 {
long lng;
char chr[3];
};
printf("%d\n", sizeof(TEST2));

結果:8

TESTとTEST2で明らかに計算方法が違うのはなぜなんでしょうか?

699 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 19:23:41 ]
「パティング 構造体」でググると幸せになれるよ

700 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 19:26:02 ]
パディングじゃね?

701 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 19:28:07 ]
そして、なぜパディングが入るかというと、境界調整のため。

702 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 19:42:41 ]
>>699-701
www.g-ishihara.com/c_st_01.htm
を見て納得しました!
ありがとうございます。


703 名前:デフォルトの名無しさん [2007/08/02(木) 19:50:02 ]
すいません、おじゃまします。
コンストラクター、デストラクターからstaticのメンバー変数にアクセするにはどのように記述したらよいでしょうか。


704 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 20:01:11 ]
>>703
普通に。

705 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 20:49:03 ]
>>704
解答としては不適切。


706 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 20:57:27 ]
>>703
不適切。

707 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:00:09 ]
>>705
それ以外に答えようが



708 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:00:16 ]
静的メンバからのアクセスは制限あるけど
逆は問題ないよね?

709 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:17:00 ]
うん

710 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:23:30 ]
fstreamが遅いんですが何とかなりませんか。
wfstreamともなるとアホみたいに遅いです。

711 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:25:32 ]
端末変えろ

712 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:27:53 ]
fstream捨てたら。

713 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:44:25 ]
>>711
端末を変えるとfstreamが速くなるのですか?
>>712
機能的にはstdioより好ましいですし標準ですから、出来れば使いたいのですが。
wfstreamとgetline()を使って書かれた単にコピーするだけのC++プログラムが、
perlだのpythonだので書かれた、正規表現を用いてちょっと文字列を置換する
スクリプトよりも遅いので、呆れます(後者でもちゃんとエンコード変換を
行っているのにです)

714 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:54:44 ]
>>713
アタリマエだろ。
単にコピーするだけにgetlineを使うお前が悪い。

715 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:55:41 ]
単にコピーするなら read して write だろう・・・。

716 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:58:47 ]
その処理にgetlineを使おうとする発想にまず驚いた

717 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:59:34 ]
>>714
ああ、説明不足でしたね。
行単位で下らない置換処理を行う下らないプログラムを色々な言語や
ライブラリを使って書いてみたのです。
ですので、例えばPerlで書いたものも、$/をundefせずに行単位で入力して
いますから、条件は対等のはずでしょう。

C++で書いたものがあまりに遅いので、試しに置換処理を抜いて
コピーだけにしたところ、その時点で他のスクリプト言語にさえ負けている
(wfstreamの場合は)ことが判明してしまいました。



718 名前:703 [2007/08/02(木) 22:04:32 ]
RESありがとう御座います。
そうですか、普通にアクセス可能ですか。。。
現象としては「static int xxx」で宣言した変数がリンカーで次のようにエラーしてしまいます。(環境VC2005)
LNK2001: 外部シンボル ""public: static int PerfMonMgr::xxx" (?xxx@PerfMonMgr@@2HA)" は未解決です。」
宣言部にstaticを取って「int xxx」で宣言するとエラーは出ないんですが。
ちなみにこのコードはDLLのコードの一部なんですが関係ありませんでしょうか。


719 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:07:27 ]
変数の実体作ってないんでしょ。

720 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:07:34 ]
>>717
perlとかはIO関連はC/C++の標準関数は使わずに独自にコントロールしてるんじゃなかったっけ?
PerlのIOはPerl向けにチューニングしてるからこそそうなるんであって、
何にもしない素でもC++なら速いと思ってるなら幻想だろう。
構造的な美しさをとるか泥臭くても速度をとるかでケースバイケースじゃないかなぁ。

721 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:09:23 ]
なかなか興味深い結果だな。

722 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:10:24 ]
ちょっと話題がそれるが、C++でファイルのコピーだけならこんなカンジでいいんじゃね?

std::ofstream("out.bin", std::ios::binary) << std::ifstream("in.bin", std::ios::binary).rdbuf() ;

723 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:26:00 ]
OSネイティブの入出力APIを使うストリームバッファを自分で書いたりしてみたらどう?

724 名前:710 mailto:sage [2007/08/02(木) 22:29:02 ]
↓実験に使ったソースです
tonosiki.mbnsk.net/uploader/src/up1564.zip

青空文庫のテキスト形式の小説を読み込んで、<ruby>タグを適当に
挿入するだけの下らないプログラムです。
サンプル入力として夏目漱石の三四郎を入れてあります。

C++のものは、Boost(Xpressive)、ICU、COM(VBScriptのRegexエンジン)
を用いたものと、単にコピーするだけのもの3種(wchar_tに変換しない版、
自前で変換する版、wfstreamに任せる版)
スクリプトはJScript(WSH用)、perl, python
それとC#のものがあります。

C++で無変換なものが無論最速でしたが、次に速いのはJScript + wshext.dll
でした(cscript.exeなどから明示的に起動するとずっと遅い)
C++ではICUがなかなか健闘しましたが、boost版はPythonやPerlに勝てず、
wfstreamでただコピーするだけの版は、これらのどれよりも遅かったです。


725 名前:710 mailto:sage [2007/08/02(木) 22:35:40 ]
>>720
もともとPerlは速い印象でしたが、エンコード指定のopen()を使うと
それほどでもない
というか、意外にもPythonのほうが速かったです。

どっちもcygwinのもの(つまり遅い実装)を使ったのですが
それよりもVC++7.1でコンパイルしたネイティブのC++プログラムが遅いのは
流石にどうかと思いました

ちなみにC++のものは、std::basic_stringを戻り値として使わず
全て参照引数渡しで同じインスタンスを使いまわすとパフォーマンスの
改善が見られましたが、素直な書き方に比べて大きな違いが出るほどでは
ありませんでした。

726 名前:デフォルトの名無しさん [2007/08/02(木) 22:41:30 ]
Cが最速なのは間違いがないよ
C単体ならDLLを使わなくていいんだから・・
時間が掛かるところは、読み込み、出力と置換する場所のサーチでしょ?
文書をバッファに蓄えておいて、置換作業と並列化してみ

727 名前:710 mailto:sage [2007/08/02(木) 22:46:34 ]
>>726
Cでも書こうかと思ったのですが、
char->wchar変換
置換1〜3
wchar->char変換
の5段ぐらいのフィルタ処理を行っており、文字列処理とメモリ管理が
あまりに面倒臭いのでやめましたw

CでやるならGCが欲しいです。



728 名前:デフォルトの名無しさん [2007/08/02(木) 22:48:01 ]
>>724
キミのCのコードは訳が分からん(知識がない訳だが・・・)
もっと単純に書いてみ char型にして<<を探して置き換えるだけだろ??
そしたら速いかもよ

729 名前:710 mailto:sage [2007/08/02(木) 22:49:59 ]
>>728
Cでは書いていません。C++です。

拡張子cppのものは全てmain()を含むメインプログラムで、
全てのソースでfilter.hppをインクルードしています。


730 名前:デフォルトの名無しさん [2007/08/02(木) 22:50:24 ]
>>727
726でCといったのはC++を含むわけだが・・・
単純に言って、一行読み込んで《・・》を書き換えるだけでしょ?
なぜ何工程も必要なんだよ???

731 名前:710 mailto:sage [2007/08/02(木) 22:52:11 ]
>>730
日本語を含む正規表現での置換処理ですので、wchar_tに変換しています。
置換を3段階行っているのは、もっと効率化できるかもしれませんが、
どの言語でもやっていることは同じです。

C++だけ特に遅くなるような書き方をしているつもりはありません。

732 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:52:15 ]
C++のlocale周りを理解している人間なんて本当に少ない。おれもよくわかんないし。
それはぐぐっても日本語英語問わず資料が少ないことからも想像が付く。
そして処理系の実装はバグ持ちで遅く、ますます誰も使わず、負の悪循環。

>>730
その処理を全部省いたとしても、ワイド文字ストリームという砦が待ち構えている。


733 名前:デフォルトの名無しさん [2007/08/02(木) 22:53:54 ]
>>731
正規表現使わずに、例えばchar c[1000]; に読み込んで
if ( c[i]=='<' && c[i+1]=='<' ) とやった方が速いだろ

734 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:56:18 ]
>>733
他言語との比較でそんな抜け道はだめだろ。

735 名前:デフォルトの名無しさん [2007/08/02(木) 22:59:27 ]
速く変換したいという目的なんでしょ?そのためにどれが速いか検討していると
普通に考えると正規表現使わず<<だけ見つけた方が速いだろって事だ

736 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:00:29 ]
wchar_t なんかに変換する必要ないじゃん。
その文字コードに合わせて処理すればいいだけ。

737 名前:710 mailto:sage [2007/08/02(木) 23:02:44 ]
>>735
いいえ。違います。
速くしたいのならmmap()でも使いますが、Perlで以下の3行で済む下らない
仕事に一体何行費やすつもりですか。
試しにCのコードを書いてみてください。可変長の文字列を使う時点で既に
Cでは面倒くさいです。

$s =~ s{(.+)[#「\1」に傍点]}{
        sprintf('<ruby>%s<rt>%s</ruby>', $1, 'ヽ' x length($1))}ego;

$s =~ s/|?([々\x{4E00}-\x{9FFF}\x{F900}-\x{FAFF}]+)《(.+?)》/<ruby>$1<rt>$2<\/ruby>/go;

$s =~ s{([||〔\s])([^|〔《》\s]+)《(.+?)》}{sprintf(
    '%s<ruby>%s<rt>%s</ruby>', ($1 eq '|') ? "" : $1, $2, $3)}ego;



738 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:03:43 ]
C++ならなんでも速いというのは幻想。
速くなるようにチューニングする余地が用意されているというだけで、
素のままで速いとは限らない。正に今回はその好例。

739 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:04:18 ]
文字コードが何かもわからないのに>>733はないだろ
UCS-2だったらどうする


740 名前:デフォルトの名無しさん [2007/08/02(木) 23:04:37 ]
どのコードでも、《》の配置は換わらないのでは???

741 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:06:57 ]
>>735
普通の考えなんか価値なす。
大事なのは現実の速度。


742 名前:710 mailto:sage [2007/08/02(木) 23:07:40 ]
>>740
漢字《ふりがな》
といったパターンを捕まえて、変換しなければなりませんので、
文字クラスにUnicodeが使えると便利なのです。

それに、「全ての言語で」Unicodeの正規表現を使っています。
C++だけわざわざそうしているわけではありません。

743 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:09:53 ]
>>735
他の言語でも同じことやったら、またC++より速くなったりしてw

744 名前:735 [2007/08/02(木) 23:09:59 ]
>>710、ちょっとまってて いま書くから
もとのファイル354Kしかないから100倍 (35M) に増やして比較しようぜ!
そしたら速度差は歴然になるからさ

745 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:11:22 ]
思わずどっちの方向に歴然とした差が生まれるのかwって言いたくなる。

746 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:12:45 ]
ソース見てなかった
》携帯からのtypoかと思ってた

747 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:12:52 ]
じゃあ俺はHSPで書く!!



748 名前:735 [2007/08/02(木) 23:16:30 ]
ちなみに漢字コードは元々のシフトJISに限定するけどいい??

749 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:18:52 ]
ついでだからwchar_tに変換するものも書いてよ。
変換方法は何でもいいからさ。

750 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:20:50 ]
>>731
まず入力にはboost::spirit::file_iteratorを使う
デコード用のiteratorは自分で書くかboostの中から探す
つぎにxpressiveのregex_token_iteratorでトークンに分ける(cvsのでないと遅くなるので注意)
そのトークンに付け加えつつストリームに出力する
こうしてstd::stringどころかヒープさえほとんど使わないで出力する
これで世界最速のプログラムの完成である (完)

751 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:23:05 ]
そもそも、Perl だろうが何だろうが、
ターゲットの文字コードは分かんないとあかんだろ?

752 名前:デフォルトの名無しさん [2007/08/02(木) 23:25:29 ]
文字コードを統一する部分を持っていればよい

753 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:32:51 ]
標準ではないけど、mbs系の関数使えば?

754 名前:デフォルトの名無しさん [2007/08/03(金) 00:02:30 ]
やっぱ面倒になった
方針だけ書いておく

e[2]="《";
f[2]="》";

strに一行読み込み

str[n] str[n+1]がeと一致するものを探して
k=n-2、n-4・・・を調べて
(c[k]>134 && c[k]<160) || (c[k]>223 && c[k]<254)でないもの(漢字でない)を見つける
そのあとに<ruby>を挿入して、漢字もつなげる
以下同様にやる

755 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:21:35 ]
とりあえず、boostをベースに、iostreamをstdioにしてみた。
コンパイラはVC2005。対象は、SANSHIRO.txtを20回繰り返した7MBのテキスト
測定は面倒だったから、cygwinのbashのtimeで。

boost$ time ./boost ../input/20.txt
real 0m9.324s
user 0m0.031s
sys 0m0.015s

stdio$ time ./boost ../input/20.txt
real 0m7.356s
user 0m0.031s
sys 0m0.015s

756 名前:710 mailto:sage [2007/08/03(金) 00:24:26 ]
>>755
stdio版も意外に遅いですね。
time cygstart aozora.js ../input/20.txt
の結果はどうでしょうか?
(jsがwshext.dllに関連付けられているかどうか分かりませんが)

757 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:30:29 ]
710死ね



758 名前:673 mailto:sage [2007/08/03(金) 00:56:35 ]
どうやらBOOST_TYPEOFというのがあるらしいですね
VCのバグを使ってほぼ完全にGCCのtypeofをエミュレートできるようです
(しかし本当にtypeofという名前だったとは…^^;)

早速使って見ましたが意図したとおりに動いていい感じ
range_XXXとかのメタ関数やsmart_ptr,optionalのようなテンプレートと相性がよいようで、
変数から型の参照が文法の上で自在に行えるのは気持ち良いです

>>690
検索かけてみましたが0xではその名前になるようですね
Visual C++0x(仮)を楽しみに待ちます

759 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:00:35 ]
bash-3.1$ perl -v
This is perl, v5.8.8 built for MSWin32-x86-multi-thread
Binary build 820 [274739] provided by ActiveState www.ActiveState.com(ry

bash-3.1$ time perl aozora.pl ../input/20.txt
real 0m7.738s
user 0m0.015s
sys 0m0.031s

bash-3.1$ time cscript aozora.js ../input/20.txt
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

real 0m7.637s
user 0m0.015s
sys 0m0.031s

760 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:00:43 ]
decltype という名前にしたのは、
動的な型は得られないということを分かりやすくしたのかね。

761 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:14:35 ]
ちなみに、当方ではどうやってもcscriptかwscriptが起動し、
(aozora.jsへの20.txtのD&Dでも)wshext.dllはどうやれば
使えるのかは判らずじまい

762 名前:710 mailto:sage [2007/08/03(金) 01:16:13 ]
>>759
わざわざ有難うございます。
JScriptは、cscript.exeやwscript.exeに実行させると私のところでも遅いです。
もしWindowsのレジストリ上でjsがwshext.dllに関連付けられている場合は、
>>756で書いたようにcygstartでaozora.jsを実行してみてください。
私のところでは、詐欺のような速さになっていました。

ともあれ、stdio版なら、PerlやJScriptよりはどうにか速くなる
といったところでしょうか。

763 名前:710 mailto:sage [2007/08/03(金) 01:19:46 ]
>>761
レスを読んでいませんでした。
自分も特別に何かしたわけではないので、分からない……

764 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:23:06 ]
wshext.dllって、実行がexplorerのスレッド内だったりして、
計測できるのはIPC(ファイルをexplorerに渡す)部分だけ、
みたいなオチはないよね?

765 名前:710 mailto:sage [2007/08/03(金) 01:27:50 ]
>>764
……んー。よく考えると、それ以前の問題として、cygstartで起動すると、
すぐに呼び出し側に制御が戻ってきてしまうので、timeで計測ができるはずは
ないですね。

失礼しましたm(_ _)m

766 名前:710 mailto:sage [2007/08/03(金) 01:49:44 ]
wshext.dllがバカみたいに速いらしいぞ、と勘違いする人がいるかもしれないので
念のため書いておきますが、全くのデタラメでした。
自分も>>755さんと同じように、cygwinのbashのtimeでいい加減に計測していたのです。
jsだけは関連付けで起動させるために、cygstartで実行させていました。
cygstartで走らせたものの実行時間を計れるわけがないのに。大ボケです。

とりあえず、iostreamさえ捨てればC++でスクリプトに勝てると分かりました。
が、コードを書くのが格段に面倒くさいのに、大して差があるわけでもないのが
悩ましいですね。
自分でもっとずっと複雑な計算をするプログラムなら、当然比較にならない
ほどC/C++が優位でしょうけれども。

767 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:56:15 ]
cygwin の GCC って遅かった気がする。
MinGW の方がいい。



768 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:56:45 ]
勘違いするのはお前くらい

769 名前:710 mailto:sage [2007/08/03(金) 02:09:08 ]
>>767
C++のプログラムは全てVC++7.1でコンパイルしました。
cygwinのnewlibは、ロケール周りの実装があまりにショボいので、実質的に
ワイド文字の処理には使えないと思います。
(VC++にしても、いくつも地雷を踏みましたが。boostも、boost::regexは
バグがあってダメでした)

>>768
そうですね><

770 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:12:39 ]
><

771 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:13:30 ]
xlocaleをちょっと弄ったらboost::regexも落ちないようになるらしいけど詳細は忘れた

772 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:18:51 ]
そうですね><

773 名前:710 mailto:sage [2007/08/03(金) 02:22:31 ]
>>771
xlocaleてことは、boost::regexのバグではなくVC++のバグってことですかね。

774 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:31:15 ]
勘違いするのはお前くらい

775 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:31:50 ]
ライブラリのバグかコンパイラのバグか知らんけど
動くコンパイラはあるわけだからね

776 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:38:02 ]
このスレの>>622に解決法あるじゃん


777 名前:710 mailto:sage [2007/08/03(金) 02:41:17 ]
>>776
あれ、それと同じ問題なのかな?
実はそれを教えていただいた>>616は自分なんですよ。

ただ、>>616の場合はxpressiveの正規表現のコンパイル時にスタックが
壊れてSEGVになっていたのですが、
boost::regexの場合は、バックリファレンス含みの正規表現で検索すると、
SEGVではなく、boost::regexが例外をスローしていました。



778 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:49:13 ]
じゃあこれかな
ttp://capslockabcjp.kitunebi.com/faq.html#boost-bug

779 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:51:50 ]
バグってるのはお前くらい

780 名前:710 mailto:sage [2007/08/03(金) 02:54:02 ]
>>778
実はそれをboostスレに報告したのも自分なのです。
その正規表現の例を見ればモロバレでしょうが。

随分前にそれで「使い物にならん」と判断して放置していたのですが、
ここ数日、ふと思い立ってxpressiveで組みなおしてみたのです。

781 名前:デフォルトの名無しさん [2007/08/03(金) 02:58:01 ]
使い物にならんのはお前くらい

782 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:11:23 ]
この流れは酷いな。

783 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 04:53:07 ]
filter.hppってなんじゃらほい

784 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 08:14:09 ]
STLportとかApache C++ Standard Libraryとかはどう?

785 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:39:09 ]
script言語はC/C++で書いてある
比較すること自体バカらしい・・・

786 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:52:46 ]
cpythonよりIronPythonのが速いっつー話もあるけどな

787 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 21:58:54 ]
class Base{
protected:
  int a = 0;
public:
  int Test(){
   return ++a;
  }
}

class Dev : public Base{
public :
   int Test(){
    a += 2;
    return a;
   }
}

int main ()
{
  Base * b = new Dev();
  printf ( "%d", b->Test() );
}

こうやると 1 と表示されます
これを2と表示させる(Devクラスの方のTest関数を呼び出す)ことってできないですかね?



788 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 22:00:09 ]
virtual

789 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 22:13:27 ]
お、できました
ありがとうございます

790 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:25:50 ]
もう一つ質問です

Base * b = new Dev[10];

for( int i = 0; i < 10; ++i ){
  b[i]->Test();
}

こういうようなことをやっているとループが何回か回った後で
メモリ外アクセス落ちちゃうんですが何が原因かかわかりませんか?

791 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:33:59 ]
>>790
つーかそれコンパイル通らないだろ

792 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:35:03 ]
Base * b = new Dev[10];

for( int i = 0; i < 10; ++i ){
  b[i].Test();
}

こうですた

793 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:40:53 ]
配列をポリモルフィックに扱ってはいけない
それをやりたいならポインタの配列とかでやるべき

794 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:49:00 ]
boost::scoped_array<Base> b( new Dev[10] );

for( int i = 0; i < 10; ++i ){
  b[i].Test();
}
ならおk?

795 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:49:38 ]
>>793
そうなんですか?

ポインタの配列というと、下のような感じでいいんでしょうか?

Base **b = new Dev*[10];

for( int i = 0; i < 10; ++i ){
  b[i] = new Dev();
  b[i].Test();
}

796 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:53:33 ]
>Base **b = new Dev*[10];

これコンパイル通らないだろ。

797 名前:793 mailto:sage [2007/08/03(金) 23:55:00 ]
>>795 ソースはMore Effective C++の第三項。ぜひ一読を



798 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:56:31 ]
>>794 同じこと。

799 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:57:42 ]
>>795
ねたじゃn

800 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:59:41 ]
>>796
Base **b = new Base*[10]; はいけましたが
Base **b = new Dev*[10]; はダメみたいです

801 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:12:01 ]
ポインタの配列調べてきました、こんなんでいいんですか?
malloc久しぶりに使いますた

Base **b = (Base**)malloc(10 * sizeof(Dev*));

for( int i = 0; i < 10; ++i ){
  b[i] = (Dev*)malloc(10 * sizeof(Dev));
  b[i].Test();
}


802 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:13:52 ]
>>801
Base やら Dev やらは構造体なの?

803 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:14:46 ]
>>802
>>787のやつです

804 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:16:00 ]
mallocじゃコンストラクタが走らないだろう・・

Devを指すBase*の配列を作ればいいと思うよ、多分

805 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:27:19 ]
こうか?
typedef Base* PBase;

std::size_t n = 10;
PBase** b = new PBase[n];
for (std::size_t i = 0; i < n; ++i) {
  b[i] = new Dev;
  b[i]->Test();
}
いい加減boost::ptr_vector使えとか言いたい。

806 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:28:11 ]
ptr_vectorはalgorithmが使えないから・・・

807 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:33:47 ]
>>806
boost::indirect_iteratorでなんとかなる話?



808 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:39:59 ]
違う、アルゴリズム体操の話。

809 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:42:20 ]
>>807
くやしく

810 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:42:59 ]
なんだあほか

811 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:49:08 ]
>>809
www.boost.org/libs/iterator/doc/indirect_iterator.html#example
value_typeがT*(一般に*演算子が使える型)なイテレータをラップして
value_typeがTであるイテレータにするアダプタ。

812 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:55:04 ]
>>805さんの方法で上手くいきました、ありがとうございます

813 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 02:58:29 ]
こういうこんがらかるようなソースは嫌い

814 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 03:03:32 ]
こんがりコーン

815 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 03:04:27 ]
普通に一個一個newすればいいのに

816 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 03:12:07 ]
newが現れた。newが現れた。・・・おや?new達の揚子江が・・・・・!?

817 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 03:22:39 ]
兆候って言えよ



818 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 12:30:45 ]
template <typename T> void f( typename boost::call_traits<T>::param_type x);
みたいな定義で
type x;
f(x);
のようにして使いたいんですが(要はf<type>(x)とかするのがめどい)
何か良いアイデアありませんか?

819 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 12:53:48 ]
template <typename T> void f(T x)ならそのままf(x)できるけどboost::call_traitsってなんだっけ?

820 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 12:54:11 ]
f(x)で呼べるだろ。

821 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 12:55:27 ]
>>819
boost::call_traits<T>::param_typeは、
引数がクラス型ならconst T&、組込型ならTというように、引数に最適の型になる。

822 名前:819 mailto:sage [2007/08/04(土) 12:56:31 ]
>>821
だったら>820。

823 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 13:14:08 ]
普通に考えればそうなるはずなんですが、結果は

#include <boost/call_traits.hpp>

template <typename T> void f(typename boost::call_traits<T>::param_type) {}

int main() {
int x;
f(x);
}

error C2783: 'void f(boost::call_traits<T>::param_type)' : テンプレート 引数を 'T' に対して減少できませんでした
'f' の宣言を確認してください。

oops。。。

824 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 13:24:07 ]
コンパイラは何?
vc6だとboostの一部は使えないよ。

825 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 13:40:31 ]
工工工工工工エエエエエエ(´д`)エエエエエエ工工工工工工

826 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 13:42:43 ]
VC8です
あとGCC3.4でも試してみたが駄目ですた
型推論が上手く行かない為だと思うんですが、これはバグなのか
言語仕様上の限界なのかよくわかりません

827 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:14:16 ]
2.5 というのをファイルから読み込んだんですが、これを小数(Float)に変換するには
どうすればいいんでしょうか?



828 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:17:26 ]
↑質問をちょっと訂正です
変換する上で便利な関数はありますか?
atoiか何かで1文字づつ変換して入れてくしかないんでしょうか?

829 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:28:47 ]
atof(), strtod()

830 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:29:03 ]
ありゃまatofなんて関数があったんですね
解決しました

831 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:42:03 ]
あとふ

832 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:46:03 ]
acof

833 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 18:51:54 ]
>>826
ググったら上のほうにこんなのがあった。
lists.boost.org/Archives/boost/2005/09/94177.php
どうやらC++の仕様らしい。

834 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 19:17:57 ]
関数ブロック内で定義した関数って、
外部リンケージと内部リンケージどっちなんですか?

関数はstatic以外、外部リンケージつう説明を読むと外部リンケージですけど、
別のファイルから使うことなんて出来ないですよね?

てか、リンケージの説明が微妙によくわかりません。
なんか良い説明してるページってありますか。

835 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 19:46:56 ]
warning: ISO C forbids nested functions

836 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 19:58:55 ]
>>835
ああ・・・ああ・・・・なんてこったい。
で、入れ子関数はGCCだと内部リンケージになるらしいですね。

837 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 21:23:18 ]
void hoge() {
 struct nested_fn { void foo() { /* valid nested function */ } };
}



838 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 22:18:04 ]
ちょっと組込み系で
簡単なGUI作っているのですが

GUI部分とメインロジックを接続するイベントモデルを
設計しているのですが、最近のトレンドだとどんな
感じで実装してるのですか?

関数ポインタ方式
シグナル-スロット方式
ターゲット/メッセージ方式
とかなのかな?

あと実際に実装してみようと思うと何かうまい資料とか
あると助かるのですが、みなさんは実装しようとしたとき
何を参考に実装しているの?

839 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 04:49:13 ]
XMLResourceかね、XULみたいな
でも組み込みじゃ無理か

840 名前:デフォルトの名無しさん [2007/08/05(日) 05:08:02 ]
C++でSingletonなClassを実装したいのですが、staticを使う方法しか思いつきません。
出来ればstaticを使用せずに実現したいのですが可能でしょうか。
具体的なコードや、参考HPのURLを示していただけると助かります。
よろしくお願いします。


841 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 05:22:37 ]
static 使わずに Singleton なんて無謀

842 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 05:25:15 ]
extern

843 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 05:27:56 ]
なんでstaticを使いたくないんだろうか?

844 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 05:30:46 ]
インスタンス取得関数を friend 関数で作り、
そのインスタンスへのポインタをグローバルに置く、
くらいが限界か。
全く意味がないけど。

845 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 06:05:06 ]
ファクトリ用のクラスを作ってそこでインスタンスを管理するとか。
もっともファクトリにstaticが必要になるような気もするけどw

846 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 08:34:24 ]
C++以外の言語でもstatic相当のものを使わないと無理だよな。

847 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 09:25:28 ]
うまく説明できないんですが、BCBで何も考えずに__closure使ってます。
これを使わない場合、どう書けばいいですか?エスパーさんよろしこ



848 名前:エスパー mailto:sage [2007/08/05(日) 09:27:07 ]
死ね

849 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 09:36:20 ]
説明できないならソースで説明してくれ

850 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 09:38:27 ]
しょうゅdeも11お

851 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 09:58:55 ]
delete x,y,z;
はOKなのに、配列に対する
delete [] x,y,z;
で、うまくいかない理由を教えてください。
一文で各方法はないでしょうか?


852 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:04:14 ]
>>851
delete x,y,z;も全然良くない。
deleteとdelete[]演算子は1つしか演算対象を取らない。
また、カンマ演算子は最低の優先順位なので、こうは書ける。
delete x, delete y, delete z;
delete[] x, delete[] y, delete[] z;
1行に複数文を並べるのと大して変わりはないが。

853 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:07:54 ]
マクロ

854 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:08:33 ]
配列と通常のやつのdeleteが異なるってことが気にくわねぇなら
プリプロセッサとmplを組み合わせて、delete_(x, y, z,...);みたいな物作ろうぜ
既に誰かが作ってるかもしれないが

855 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:11:44 ]
そもそも配列new[]は使わないし、
deleteも生で使うのはダサい。

856 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:11:57 ]
初心者なんですが、fopenってファイルを開くだけでメモリに乗せるわけではないですよね?
ちょっと疑問に思っていまして・・・

857 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:14:13 ]
>>855
じゃあどうするの?



858 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:14:28 ]
裏でバッファリングを始めている可能性はあるが、
気にするようなことではない。

859 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:15:49 ]
生ポだろがスマポだろうがお構い無しに意味上での構築破壊が出来る構文が必要ということか

860 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:16:11 ]
>>857
new[]→std::vectorあるいはもっと低水準のメモリ確保ルーチンへの二極化。
delete→boost::scoped_ptr, boost::shared_ptr

861 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:17:06 ]
>>860
そもそも世の中boost使えない場合が多いの
そんな限定していいの?

862 名前:858 mailto:sage [2007/08/05(日) 10:19:13 ]
>>858
うーん、TB級のファイルをfopenで開くことって出来ますかね・・・

863 名前:856(訂正) mailto:sage [2007/08/05(日) 10:20:32 ]
>>858
間違えましたorz

864 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:23:08 ]
ほほえましいな

865 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:28:06 ]
>>840
ソフトウェアの立ち上げを早くするために
遅延ロードみたいなことをしたいってこと?

866 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:30:08 ]
はい

867 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 11:22:59 ]
>>861
生を安全なものにするには、ラップするか、使い方に厳密な決まりを作る、しか無いよ。
本質的には。
既存の膜がないなら、できる範囲で自作するのが一番いいと思うけど。



868 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 11:57:29 ]
boost::shared_ptr
自分で実装するのめんどい誰か実装して。

869 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 11:59:06 ]
すでに実装済み

870 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 11:59:44 ]
めんどいから誰かが実装してくれたのが boost じゃないの

871 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 12:35:04 ]
あんなでかいライブラリ使いたくねー
他いらねーしshared_ptrだけ実装してくれよ

872 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 12:58:41 ]
既に実装済み

873 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 13:01:09 ]
じゃあフリーで使える単体のshared_ptrだけ作ってくれよ

874 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 13:06:18 ]
>>873
boostからshared_ptrだけコピペして使えよ

875 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 13:06:46 ]
既存

876 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 14:17:52 ]
テンプレートライブラリがどういうものか分かってないんじゃね

877 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 14:50:05 ]
boostのshared_ptrもいろいろincludeしてたりして、
依存性を調べるのが面倒くさいからなー。
shared_ptr.hppひとつコピペしたら済む話じゃないでそ?



878 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 14:51:25 ]
>>868
std::tr1::shared_ptr
libstdc++くらいしかまだ実装していないと思うけど。

879 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 14:53:04 ]
>>860
こういう流れになるから std::auto_ptr も挙げるようにしようぜ。

880 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 15:03:11 ]
>>879
auto_ptrを挙げるならばその罠や制限についても説明しなければならないだろ
単純なshared_ptrまがいなら色々見たことがあるし
そもそも基本的な原理は単純そのものだが
とうぜんそれらはshared_ptrほど注意深く実装はされていない

>>877
プリプロセッサに食わせて出力をgrepするだけの話だが
そもそも取り込むファイルが環境依存だからな

881 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 15:10:22 ]
>>880
> auto_ptrを挙げるならばその罠や制限についても説明しなければならないだろ

shared_ptr を並べて挙げとけば十分だよ。

罠や制限があっても share_ptr よりコストは低いし標準だし、
単純な例外安全目的にはぴったりだ。

882 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 15:32:32 ]
コンテナに突っ込めない出来損ないのスマポが標準だ?笑わせてくれる

883 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 15:39:05 ]
誰が笑おうがコンテナに突っ込めなかろうが、標準は標準。

単純な delete 強制のためだけに boost が要るなんて言われても
面倒なんだよ。

884 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 15:40:43 ]
笑うのはいいこと、もっと笑おう

885 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 15:48:59 ]
>>882
コンテナに突っ込めるスマポが標準にないところも笑いどころ。

886 名前:デフォルトの名無しさん [2007/08/05(日) 17:08:20 ]
今、ある数学のプログラムをネット上で見つけたので、
それをコンパイルすることを試みているのですが、
エラーがいっぱい出て、うまいごとにコンパイルできません。
Borland社のbcc32というのを使ってます。

そのソースはこちらのウェブサイトに全部載ってます。

www.math.temple.edu/~wds/homepage/steiner-code.c

それから、コマンドプロンプトでコンパイルを試みた結果、
以下のようなエラーが出てきました。
そのエラーにあったようにデバッグを試みたが、
どこをどうデバッグすればいいかもわからなかったので、
どなたか分かる方がいれば本当に助かります。

887 名前:886 [2007/08/05(日) 17:09:16 ]
C:\Documents and Settings\Math\デスクトップ\steiner code>bcc32 stei
ner-code.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
steiner-code.c:
エラー E2219 steiner-code.c 39: マクロ 'RANDM' の呼び出しにおける引数の個数が誤
っている(関数 buildtree )
エラー E2188 steiner-code.c 39: 式の構文エラー(関数 buildtree )
エラー E2219 steiner-code.c 52: マクロ 'RANDM' の呼び出しにおける引数の個数が誤
っている(関数 buildtree )
エラー E2188 steiner-code.c 52: 式の構文エラー(関数 buildtree )
警告 W8065 steiner-code.c 183: プロトタイプ宣言のない関数 'srand48' の呼び出し(
関数 main )
警告 W8065 steiner-code.c 188: プロトタイプ宣言のない関数 'exit' の呼び出し(関数
main )
警告 W8065 steiner-code.c 192: プロトタイプ宣言のない関数 'exit' の呼び出し(関数
main )
警告 W8065 steiner-code.c 207: プロトタイプ宣言のない関数 'buildtree' の呼び出し
(関数 main )
警告 W8065 steiner-code.c 208: プロトタイプ宣言のない関数 'length' の呼び出し(関
数 main )
警告 W8065 steiner-code.c 208: プロトタイプ宣言のない関数 'error' の呼び出し(関
数 main )
警告 W8065 steiner-code.c 209: プロトタイプ宣言のない関数 'optimize' の呼び出し(
関数 main )
警告 W8065 steiner-code.c 211: プロトタイプ宣言のない関数 'output_tree' の呼び出
し(関数 main )



888 名前:886 [2007/08/05(日) 17:10:32 ]
警告 W8065 steiner-code.c 212: プロトタイプ宣言のない関数 'exit' の呼び出し(関数
main )
エラー E2451 steiner-code.c 218: 未定義のシンボル HUGE(関数 main )
警告 W8065 steiner-code.c 225: プロトタイプ宣言のない関数 'buildtree' の呼び出し
(関数 main )
警告 W8065 steiner-code.c 227: プロトタイプ宣言のない関数 'length' の呼び出し(関
数 main )
警告 W8065 steiner-code.c 228: プロトタイプ宣言のない関数 'error' の呼び出し(関
数 main )
警告 W8065 steiner-code.c 230: プロトタイプ宣言のない関数 'optimize' の呼び出し(
関数 main )
警告 W8065 steiner-code.c 232: プロトタイプ宣言のない関数 'optimize' の呼び出し(
関数 main )
警告 W8065 steiner-code.c 232: プロトタイプ宣言のない関数 'length' の呼び出し(関
数 main )
警告 W8065 steiner-code.c 232: プロトタイプ宣言のない関数 'error' の呼び出し(関
数 main )
警告 W8065 steiner-code.c 237: プロトタイプ宣言のない関数 'output_tree' の呼び出
し(関数 main )
*** 5 errors in Compile ***

889 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 17:22:28 ]
>>886
上から順番につぶしていけば?
標準から大きくずれている&独自の書き方が多いでとても読解する気になれんw
取り合えずRANDMマクロは単に乱数欲しいだけみたいだからrand()にでも置き換えてみるとか?


890 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 17:24:05 ]
昔のソースなんだろ。
1989年と書いてあるな・・・

891 名前:886 [2007/08/05(日) 17:32:28 ]
>>889

ありがとうございます。
RANDM()と書いているところをrand()に置き換えたらいいんでしょうか?

>>890

だとしたら、最近のコンパイラではコンパイルできないということでしょうか?

すみませんが、ご教授お願い致します。

892 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:00:10 ]
何の宿題かぐらいはちゃんと書けよ。


893 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:03:24 ]
#include <stdlib.h>
を加えて、以下の修正を

typedef double REAL;
#define RANDM() (rand() / (double)RAND_MAX) /* uniform random deviates in (0,1) */
#define INITRAND() (srand(57731))

void buildtree(int k, int topvec[])
REAL length(void)
void optimize(REAL tol) /* a small positive number */
REAL error(void)
void output_tree(void)

int main(){ /* Inputs NUMSITES, DIMENSION, sites; outputs successive best Steiner
  :
  :
  :
return 0;
} /* End of Steiner tree program. */

894 名前:886 [2007/08/05(日) 18:03:56 ]
>>892

なんの宿題か、というわけでもないのですが、
自分は数学関連の研究をしているもので、プログラミングに関しては
ほとんど知らないわけですが、たまたま自分の研究に関連する
プログラムをネットで見つけたので、それを使えるようにしたいと
思い、なんとかコンパイラをインストールするところまでには
至ったんですが。

895 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:04:32 ]
-AKオプションつけるとどうなる?

896 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:05:56 ]
ごめん。[0, 1] じゃなくて [0, 1) みたいだからこうだな。

#define RANDM() (rand() / (RAND_MAX + 1.0)) /* uniform random deviates in (0,1) */

897 名前:886 [2007/08/05(日) 18:13:26 ]
>>893 >>896さん

親切にありがとうございます。早速実行してみましたが、こうなりました。

C:\Documents and Settings\Math\デスクトップ\Lenny's File\steiner code>bcc32 stei
ner-code.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
steiner-code.c:
エラー E2379 steiner-code.c 39: ステートメントにセミコロン(;)がない(関数 buil
dtree )
エラー E2379 steiner-code.c 52: ステートメントにセミコロン(;)がない(関数 buil
dtree )
エラー E2379 steiner-code.c 182: ステートメントにセミコロン(;)がない(関数 mai
n )
エラー E2193 steiner-code.c 187: 呼び出し時のパラメータが足りない:exit(関数 mai
n )
エラー E2193 steiner-code.c 191: 呼び出し時のパラメータが足りない:exit(関数 mai
n )
エラー E2193 steiner-code.c 211: 呼び出し時のパラメータが足りない:exit(関数 mai
n )
エラー E2451 steiner-code.c 217: 未定義のシンボル HUGE(関数 main )
警告 W8066 steiner-code.c 260: 実行されないコード(関数 main )
*** 7 errors in Compile ***



898 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:15:49 ]
#include <stdlib.h>
#define HUGE HUGE_VAL
#define exit() exit(EXIT_FAILURE)
を追加で少しましになった

まだ、drand48,srand48でエラーが出る
drand48,srand48ってUNIX Cの関数で標準のC関数じゃないのか?

899 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:16:26 ]
rand48 は UNIX/Linux の関数だね。

900 名前:デフォルトの名無しさん [2007/08/05(日) 18:18:51 ]
BCCなんて糞コンパイラ使ってるからだよm9(^Д^)プギャー

901 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:20:01 ]
しかし886よ、そのプログラムをなんとか動かせたとして、使い方は判ってるのか。

902 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:20:26 ]
これでどう?
ttp://sund1.sakura.ne.jp/uploader/source/up9355.c

903 名前:886 [2007/08/05(日) 18:24:27 ]
>>902

わざわざアップまで親切にありがとうございます。エラーが4つになりました。
迷惑をお掛けしました。

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
steiner.c:
エラー E2219 steiner.c 40: マクロ 'RANDM' の呼び出しにおける引数の個数が誤ってい
る(関数 buildtree )
エラー E2188 steiner.c 40: 式の構文エラー(関数 buildtree )
エラー E2219 steiner.c 53: マクロ 'RANDM' の呼び出しにおける引数の個数が誤ってい
る(関数 buildtree )
エラー E2188 steiner.c 53: 式の構文エラー(関数 buildtree )
警告 W8066 steiner.c 261: 実行されないコード(関数 main )
*** 4 errors in Compile ***

904 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:25:37 ]
あ、間違えた。

RANDM(a) の a を削除

905 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:27:21 ]
何かこのプログラム永遠に終了しないみたいなんで、
main の最後の return 0; は不要みたいだな。

906 名前:886 [2007/08/05(日) 18:28:03 ]
>>900

それじゃあ他の只でダウンロードできるやつ、もしくはフリートライアル
のやつをインストールして、やってみた方がいいでしょうか?

>>901

大体何をしたいかはわかってます。後は試行錯誤です。
InputとOutputのサンプルが載っている論文が手元にあります。

907 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:36:18 ]
>>902 で一様buildできたが、何をするんだこれ?



908 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:42:08 ]
>>906
そのまま一生試行錯誤してればいいよ

909 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:48:14 ]
enum {MSG_OK,MSG_YESNO};
enum {ID_OK,ID_YES,ID_NO};
int Message(char* msg ,int type){
char ch;
switch(type){
case MSG_OK:
printf("%s¥tPush Enter>",msg);
scanf("%c",&ch);
return ID_OK;
case MSG_YESNO:
printf("%s y/n>",msg);
scanf("%c",&ch);
return (ch == 'y' ? ID_YES:ID_NO);
}
return 0;
}
int main(){
Message("question",MSG_OK);
if(Message("How do you do?",MSG_YESNO) == ID_YES)
printf("good¥n");
return 0;
}
というプログラムで、わざとPush Enterと出た時に、Enterを押さないで適当なキーを押すと
huga$ ./a.out
question Push Enter>y
How do you do? y/nhuga$
と表示されます。
フォールスルーでもないし、ちゃんと2度目のMessage関数の呼び出しも出来ている
みたいなのですが、なぜこういう風に動くのでしょうか?

910 名前:886 [2007/08/05(日) 18:48:41 ]
>>907

説明するのが難しいのでとりあえず論文中にあったInputのサンプルです。

1 2 3
1 0 1.6180339887
0 1.6180339887 1
1.6180339887 1 0
-1 0 1.6180339887
0 1.6180339887 -1
1.6180339887 -1 0
1 0 1.6180339887
0 1.6180339887 1
-1.6180339887 1 0
-1 0 -1.6180339887
0 -1.6180339887 -1
-1.6180339887 -1 0

上のようなInputを与えると、(実際どのような手順で与えるかは
試行錯誤しないとわからないのですが)

new record length 18.5529
topology-describing vector
2 3 7 6 7 6 14
.........................

というOutputが出てくるはずです。
Inputは正20面体のすべての頂点の座標で、Outputはこれらすべての頂点を結ぶ木
(サイクルを作らないようなグラフ)の枝の総長を表わしています。

911 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:52:10 ]
最初の scanf("%c",&ch); でその適当に入力した文字が ch に入る。
そして2度目の scanf("%c",&ch); で改行が ch に入る。

912 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:55:22 ]
>>907
一様(いちよう)じゃなくて一応(いちおう)ね
一様は「違い・むらが無い」って意味

913 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:56:46 ]
なんかお子様多いな

914 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:58:18 ]
お前が一番お子様なのにね

915 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:59:23 ]
>>911
>最初の scanf("%c",&ch); でその適当に入力した文字が ch に入る。
>そして2度目の scanf("%c",&ch); で改行が ch に入る。
成る程です。
ちなみに、2度目の関数呼び出しの際、1度めに使われた変数の中身はクリアされないんでしょうか?

916 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:01:02 ]
>>910
正20面体って正三角形が20個でしょ?

917 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:01:15 ]
そもそも関数を抜けた時点で ch の中身は保証されなくなる。



918 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:20:14 ]
>>911
>最初の scanf("%c",&ch); でその適当に入力した文字が ch に入る。
>そして2度目の scanf("%c",&ch); で改行が ch に入る。
すいません、何故勝手に改行が入力されるのでしょうか?
その辺のFAQってどこかにありませんでしょうか?
勉強したいので。

919 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:22:51 ]
「y」と「改行」を入力したでしょう。別に勝手に入るわけじゃない。

920 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:27:57 ]
>>918
scanfの仕様に則っただけだからキニスルナ

921 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:28:59 ]
>>918
FAQだけで簡単に済まそうとしているのが間違い。
もっと基礎的なことからちゃんと勉強したら?
基本を知らずにFAQだけ読んでも、得られるものは少ないと思う。

> エラー E2379 steiner-code.c 39: ステートメントにセミコロン(;)がない(関数 buil dtree )

こんなエラーすらを自分で解決できないのでは、先に進みようが無い。

922 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:39:28 ]
>>921
ごめんなさい、ごめんなさい
あのー、基礎的なことってどんなことですか?
何が基礎的なことなのか分からないのです(>_<)

923 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:40:27 ]
基礎的なこと=何が基礎的なことなのか分からないこと

924 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:44:24 ]
C言語を真面目に勉強しろってさ

925 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:46:27 ]
HelloWorldは書いたかい?

926 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:47:19 ]
a,b,cはint型です。
a=0;b=0;c=0;とするところを、a=b=c=0;としても同じでしょうか?

927 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:49:34 ]
>>926
同じ、それくらい入門書でも読んでくれ。



928 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:55:48 ]
a=b=c=0;この場合の代入の順序はどうなんですか?
a=0,b=0,c=0 順番なのですか?
それとも
a=0,b=a,c=a

929 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 20:01:36 ]
=(a, =(b, =(c,0) ) );

930 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 20:04:08 ]
優先順位表見てる?
あれに右左も書いてあるべ

931 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 20:06:11 ]
a = (b = (c = 0)); ということ

932 名前:926 mailto:sage [2007/08/05(日) 20:12:50 ]
>>928
アフォか俺でも分かるわ

933 名前:928 mailto:sage [2007/08/05(日) 20:22:08 ]
>>931 しつこくすみません、低能なもんで
a = (b = (c = 0));は
c=0,b=0,a=0 なのですか?
それとも
c=0,b=c,a=b
つまりb = (c = 0)の処理の場合、b=0、b=cどちらが実行されるのでしょうか?

>>930 優先順位表って何ですか

934 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 20:29:40 ]
わざわざ1つの式にまとめて書いといて、順序もクソも無いもんだ。

935 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 20:32:08 ]
>>933
試せよそんぐらい。

936 名前:928 mailto:sage [2007/08/05(日) 20:34:37 ]
>>935
どうやってどちらが実行されてるか試すのですか?

937 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 20:40:12 ]
> つまりb = (c = 0)の処理の場合、b=0、b=cどちらが実行されるのでしょうか?

なにか違いが?



938 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 20:45:33 ]
c=0の評価値は0だ

939 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 20:47:20 ]
>>936
int a;
char b;
a = b = 12345;
printf("%d %d", a, b);

940 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 20:47:35 ]
a = (b = (c = 0));

cに0が代入される。
bに(c = 0)の式の値が代入される。この場合0なので0が代入される。
aに(b = (c = 0))の式の値が代入される。この場合0なので0が代入される。

941 名前:840 [2007/08/05(日) 22:23:56 ]
説明不足で申し訳ありません。
C/C++でstaticを使用する場合グローバルに変数の宣言が必要かと思いますが、
クラスの部品化の観点から、出来るだけグローバル変数の使用は避けたいと考えています。
で、記憶が曖昧なんですが、以前static_castなど(テンプレートを使用していたかもしれません)を使用して
GoFのSingletonパターンを実現している記事を見かけましてこちらで質問させていただきました。
何か情報御座いましたらよろしくお願い申します。


942 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 22:29:35 ]
>>941
グローバル変数は駄目でシングルトンならいいってのは、どういう理屈かね?

943 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 22:31:51 ]
>>941
>C/C++でstaticを使用する場合グローバルに変数の宣言が必要かと思いますが、
いや…、必要ないよ

class HOGE
{
public:
 static HOGE& get_instance(){
  static HOGE hoge;
  return hoge;
 }
private:
 HOGE();
};


944 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 22:42:19 ]
>>877
libjingleではboostからshared_ptrだけとりだしてコピペしてる箇所があるって聞いたぞ。
そんなに面倒とも思わんけどなぁ

945 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 22:56:04 ]
>>877
依存関係の調査自体は bcp 使えば要らない。結果の膨大さにびびるだろうけど。

946 名前:909 mailto:sage [2007/08/05(日) 23:23:53 ]
>>919
>「y」と「改行」を入力したでしょう。別に勝手に入るわけじゃない。
え、でもscanfで1文字標準入力を取得した後、
returnでmain関数に戻って、もう一度ifでMesssage関数を呼び出してるから
たとえ、改行文字があっても無視されるんじゃないんですか?
それにこのプログラムが意図したと売りに動く場合の、
一度目にenterおしてifでMessage関数呼び出して、2度目のifでMesssage関数
を呼び出してyを入力した場合、
huga$ ./a.out
question Push Enter>
How do you do? y/n>y
good
の場合はHow do you do? y/nでyとenterを押しているのに
なんで正確に動くんですか?
もしかして標準入力の内容ってバッファみたいなところに貯められるんですか?
>>921
自分は886では無いですよ。
少なくともコンパイルエラーを直してから、質問します。

947 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 23:27:12 ]
>>941
例えstaticやグローバル変数を避けてシングルトンを実装したとしても、
目的を達成する手段が変わっただけで、本質的には何も変わっていない。

そう書いてから942の焼き直しだと気付いた。



948 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 23:28:01 ]
>>946
>もしかして標準入力の内容ってバッファみたいなところに貯められるんですか?
そのとおり。
標準入力に限らず入出力にはバッファを利用されることが多い。

949 名前:909 mailto:sage [2007/08/05(日) 23:42:42 ]
>>948
へぇ、知らなかったです。
そんなこと、本には書いてなかったので。
イメージとしては
入力した文字がメモリのどっかに
hogehugamoge
みたいに保存されて、
そこからscanfの引数の変数の型の分(今回はchar型)
コピーされるみたいな感じなんですかね?


950 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 23:58:44 ]
そう。
正常に動くケースは、1文字目が改行で2文字目がyで3文字目が改行でしょ。
3文字目は読まれずにバッファに残ったままプログラムが終了するだけ。

951 名前:909 mailto:sage [2007/08/06(月) 00:11:27 ]
ありがとうです。
んで、何文字バッファに保存されるかはOSの実装によると。

952 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 00:39:39 ]
普通の使い方なら充分なくらいのバッファはあるはず・・・
10文字程度で満杯とかそんなことはまずない。

953 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 00:45:25 ]
ストリーム入出力ってのは、バッファリングされる入出力のことだ。

954 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 03:34:18 ]
すみません質問させてください。
txtファイルから、例えば40.123/42.591/43.569という文字列を読み込んで、
真中の42.591だけを数値として変数に格納したいのですが、
どうにも巧い方法が思いつきませんorz
何卒お力をお貸し頂けますようお願い致します。

955 名前:909 mailto:sage [2007/08/06(月) 03:35:24 ]
     / ̄ ̄ ̄ ̄\
   / ( ( (  ) .) )\
  / ( ( / ̄ ̄ ̄”\ .) )
  / ( ( |.        | ) )
  ( ( (  |   \ハ/ | ) )
  ( ( (  |  ゚ ̄ 〈 ゚ ̄ | ) )
  ( ( (  |      >   | ) )
  (. ( (  |    /へ)  /  ) )
  \_/|\   ー //\/
  / ̄ ̄\ ゛ーー/ ̄ ̄\
./     \ ̄ ̄ ”/     \
|       ●|・|  ||/       |
|   |    ●|・|  ||/       |
|   \_ ●|・|   ||/       |
.\   》||つ【♪1076】___/

956 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 03:40:07 ]
>>954
C なのか C++ なのか、まずはそれからだ。

957 名前:954 [2007/08/06(月) 03:41:45 ]
ごめんなさい、Cでお願いします。
後、sage禁止だったのですね。重ね重ねすみませんorz



958 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 03:49:30 ]
自己判断で
~~~~~~~~~~~~
寧ろage禁止

959 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 03:50:58 ]
sage禁止とはなんという斬新なルールなのか

960 名前:954 mailto:sage [2007/08/06(月) 04:01:48 ]
すみません、以後下げるようにしますorz

961 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 04:22:28 ]
どっちでもいいよ。自分で判断しる。

962 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 04:28:03 ]
>>957
いろいろ方法はある。

scanf 系関数を使うなら、
%*f のように書式に * を挟むことで
変数に格納しなくなるようにできるのを利用するとか。

あとは1行取得して、
それを strtok で "/" をデリミタにして処理した2番目の文字列を atof するとか。
strtok を使うのが気持ち悪いなら strchr を使ってもいいかもしんない。

963 名前:957 mailto:sage [2007/08/06(月) 04:48:30 ]
了解です、状況で判断しますorz

>>962
ご解答頂きありがとうございます。
教えていただいた通り、今回はstrtokを使ってみたいと思います。
%*fという表記は知らなかったので勉強になりました。
本当にどうもありがとうございましたm(_ _)m
また皆様のお力をお借りすることがあるかと思いますが、その時はどうぞよろしくお願い致します。

964 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 04:52:45 ]
strtok()は癖が強すぎるのでお勧めしない。
scanf()でフォーマットを'%*f/%f/%*f"にしてはいけないのか?

965 名前:957 mailto:sage [2007/08/06(月) 05:55:20 ]
>>964
strtok()は癖が強いのですか。
strtok()を使ったことが無かったので使ってみようかと思ったのですが、
そういうことであれば素直に%*fを使ってみたいと思います。
アドバイスありがとうございましたm(_ _)m

966 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 05:56:20 ]
test

967 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 08:26:44 ]
for(int i=0;i<n1;i++) {                          ←ここに飛びたい場合どうするのが一般的でしょうか?
  // 処理                            ↑
    for(int j=0;j<n2;j++) {                      ↑
        if (a[j] == b)    // 条件が成立したらループを抜けて↑
    }
    //処理
}



968 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 08:35:09 ]
>>967
つ[goto]

まぁ、アルゴリズムを見直してbreakだな。

969 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 10:36:46 ]
中のループをboolを返す関数にしてしまって
trueだったらcontinueとかね

970 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 12:31:43 ]
void f()
{
static char *theTxt;

strcpy(theTxt,"TEST¥n");
printf("%s",theTxt);
}
これってtheTxt;がstaticでnull初期化されているから
駄目なんですか?


971 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 12:38:10 ]
>>970
theTxtはポインタ。
strcpyはポインタの指すアドレスにデータをコピーする関数。

問題は、theTxtがどこも指していないこと。
mallocで確保するとか、配列にするとか、データの領域をまず用意

972 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 12:39:01 ]
どこも指してない、つーかNULLで初期化されてっからアドレス0を指してる、とも言えるか。
まあ同じだけど。

973 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 12:41:58 ]
理解出来ました。
有り難うございます

974 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 13:35:12 ]
>>972
>アドレス0を指してる、とも言えるか。
いえない。
因みに、初期化されていないポインタは
「何処を指しているかわからない」

975 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 13:35:58 ]
>>974
staticがついてると0に初期化される

976 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 13:36:57 ]
static だから = 0 で初期化されている。
ただ、アドレス 0 だとは限らない。

977 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 13:40:29 ]
もうヌルポインタが0じゃない話はいいから



978 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 13:57:16 ]
>>977
「ぬるぽはどこも指していない話」じゃないのか?

979 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 14:04:28 ]
NULLが0なんじゃない、0がNULLなんだよ。

980 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 15:01:18 ]
        ぬるぽ! ぬるぽ!
    ぬるぽ! ぬるぽ!  ぬるぽ!
  ぬるぽ!  ∩   ∩ ノ)   ぬるぽ!
 ぬるぽ!   川 ∩ 川彡'三つ  ぬるぽ!
ぬるぽ!  ⊂ミ∩、⊂ミ∩彡⊃    ぬるぽ!
ぬるぽ! ⊂三ミ( ゚∀゚)彡三彡三⊃ ぬるぽ!
ぬるぽ!  ⊂彡川⊂彡川ミ⊃    ぬるぽ!
ぬるぽ! ⊂彡川∪⊃ U川彡⊃   ぬるぽ!
 ぬるぽ!  (ノ ∪  川 ∪ミ)  ぬるぽ!
  ぬるぽ!       ∪     ぬるぽ!
    ぬるぽ!  ぬるぽ!  ぬるぽ!
       ぬるぽ!  ぬるぽ!
           ぬるぽ!

981 名前:デフォルトの名無しさん [2007/08/06(月) 21:47:18 ]
#define NULL ぬるぽ
#define 0 NULL

982 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 22:40:13 ]
fopenやifstreamがどういう処理をしているか気になります。
遠回しにAPIを呼んでたりするんですか?

983 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 22:47:34 ]
そりゃシステムコール呼ばないとファイル開けまへんがな(´・ω・`)
そこらのOS毎の差異を吸収するのも標準ライブラリの役目

984 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 22:48:24 ]
そう。 遠まわしに、WindowsならCreateFileとかのAPIを呼んでる。

985 名前:デフォルトの名無しさん [2007/08/06(月) 22:51:22 ]
まー結局、細部まで一致しないからWINDOWS API使うのが賢い
かなり単純なものでないとCのみでしょり出来ないからな

986 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 22:53:31 ]
×>>972,>>974
>>976

C言語の仕様によれば、staticな変数は『定数ゼロ』(K&R第2版)で初期化される。
だから
static char *theTxt;
は、
static char *theTxt = 0;
と置き換える。
ここで、定数ゼロは整数型に代入されれば整数0であり、ポインタに代入されればヌルポインタになる。
ヌルポインタは、(アドレス0を指す処理系もあるかもしれないが、)
『どこも指していないポインタ』が正解。実際のbit列がゼロの連続とも限らない。

従って、ヌルポインタはprintf()の引数として処理できない。

ちなみに、『ぬるぽ』はNullPointerExceptionの略で、ヌルポインタではない。

987 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 22:54:54 ]
BCCで書いているのですが、突然ファイルオープンができなくなりました。
#include<stdio.h>

main(void){
int i,j,k,t;
int No1,No2;
int Rs[3500][20],Hn[3500]={0};
double u,x,y;
double Odds[3500][20],Poll[3500][20],Poll_S[3500][20],Poll_T[3500][20];
FILE *fpr,*fpw;
fpr=fopen("horse.txt","r");
fpw=fopen("r.txt","w");
while(fscanf(fpr,"%d %d %lf %d",&No1,&No2,&u,&k)!=EOF){
Odds[No1][No2-1]=u;
Rs[No1][No2-1]=k;
Poll[No1][No2-1]=0.788/(u-1.0);
Hn[No1]++;
Poll_T[No1][No2]=0;
Poll_S[No1][No2]=0;
}
何か問題はありますか?教えてください。



988 名前:gotoです mailto:sage [2007/08/06(月) 22:55:51 ]
たまには私を思い出してください。
ほら、try-catch句がなかったあの頃を思い出してください・・・

989 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 22:58:45 ]
>>987
釣り?

990 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 23:02:37 ]
マジです

991 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 23:03:22 ]
>>987
とりあえずmainの'{'に対応する'}'と、fcloseが足りない。

992 名前:987 mailto:sage [2007/08/06(月) 23:07:22 ]
すみません。
ソースが長いので省略しています。
コンパイルエラーはないんですが
テキストファイルが読み込めないんです。


993 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 23:09:38 ]
>>993
実行方法は?
まさか、カレントディレクトリにファイルがないって落ちじゃないよな?

994 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 23:10:31 ]
horse.txtが無いんじゃね?

995 名前:デフォルトの名無しさん [2007/08/06(月) 23:11:32 ]
errno調べてみ

996 名前:987 mailto:sage [2007/08/06(月) 23:16:06 ]
horse.txtはあります。
今まで動いていたプログラムもファイルが開かなくなりました。
ライトファイルはできます。

997 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 23:18:07 ]
どっか別のアプリケーションがファイルを開いてるんじゃない?
アプリケーションを全部終了するか、最悪OS再起動したら直るんじゃないかね。



998 名前:987 mailto:sage [2007/08/06(月) 23:19:45 ]
と思って再起動したんですが直りませんでした。

999 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 23:22:17 ]
errno !!!

1000 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 23:26:49 ]
次スレ!!!
pc11.2ch.net/test/read.cgi/tech/1186410368/

1001 名前:1001 [Over 1000 Thread]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






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

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

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