【初心者歓迎】C/C++室 Ver.54【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/05/14(水) 01:00:02ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.53【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1208989385/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0496デフォルトの名無しさん
2008/06/01(日) 01:50:230497デフォルトの名無しさん
2008/06/01(日) 08:52:50その変換って、クラスAにクラスBの参照を引数に取るコンストラクタがあるってこと?だったらそのまま渡される。
でなくて、その変換がクラスBにクラスAへの変換の演算子が定義されてるって意味なら、戻りのオブジェクトがaになるかコピーされるかはコンパイラによるんじゃないか。戻り値の最適化(RVO)でググるべし
0498デフォルトの名無しさん
2008/06/01(日) 10:03:41一応ググってみたんですけど、要注意な文字は
ttp://www2d.biglobe.ne.jp/~msyk/software/libiconv-1.9.2-cp932-patch.html
にある表で全部ですか?
0499デフォルトの名無しさん
2008/06/01(日) 10:44:35493に「クラスAに〜」ってあるから前者かな?
もうちょいソースが必要かな。
0500デフォルトの名無しさん
2008/06/01(日) 10:47:59>>495の通り、変換できないときにはエラーになるなら、
「〜」とかに加えて、ASCIIと日本語以外の文字全部じゃね?
0501デフォルトの名無しさん
2008/06/01(日) 10:50:26たぶん動くw
0502デフォルトの名無しさん
2008/06/01(日) 11:03:23B::operator A()
じゃないかな。
0503デフォルトの名無しさん
2008/06/01(日) 13:41:06どういう意図なのでしょうか?
char* c
c = (char*)NULL;
NULLをポインタに入れるときにあえてその型にキャストする必要はあるのでしょうか?
c = NULL;
ではまずいのでしょうか?
0504デフォルトの名無しさん
2008/06/01(日) 13:58:39のようなソフトはどのようにしてIEと連系を取っているのでしょうか?
OLEやCOMといったようなインタフェース?が関係しているように思っているのですが
よく分かりません。
perlでは、youtube等から動画を保存するモジュールなどがあるようですが、
例えば、上記のようなツールはどこかのサーバに接続してperlスクリプトを走らせた
結果を入力して、URLなどを取得したりしているのでしょうか?
ご教示願います
0505デフォルトの名無しさん
2008/06/01(日) 14:07:50単独で取得できるよ
ブラウザアクセスの履歴を眺めて、それをエミュレートすれば良いだけ
基本のGETアクセスだけで出来る
irvineスレ言ったら、解析済みのコードが見られる。
0506デフォルトの名無しさん
2008/06/01(日) 14:07:58このへん読めばわかるんじゃない?たぶん
http://msdn.microsoft.com/en-us/library/aa753589(VS.85).aspx
0507506
2008/06/01(日) 14:14:240508デフォルトの名無しさん
2008/06/01(日) 14:16:08>>506
ありがとうございます。GETコマンドについて調べてみます。
右クリックメニューは、レジストリキーいじってたんですね。
0509デフォルトの名無しさん
2008/06/01(日) 14:21:490510デフォルトの名無しさん
2008/06/01(日) 14:34:52NULLが(void *)0と定義されていれば暗黙の型変換ができると思うけど
そうじゃなければ型指定しないとだめとかじゃないっけか?
0511デフォルトの名無しさん
2008/06/01(日) 14:36:320512デフォルトの名無しさん
2008/06/01(日) 14:37:510513503
2008/06/01(日) 14:48:45>>511
なるほど。#define NULL (void*)0
しているところばかりじゃないということですね。
ありがとうございます。
0514デフォルトの名無しさん
2008/06/01(日) 15:59:33いや、C++では #define NULL 0 で、その場合もc = NULLでOKと思うよ。
c = (char*)NULL にする必要性あるのかな。詳しい人よろしく。
0515デフォルトの名無しさん
2008/06/01(日) 16:01:430516デフォルトの名無しさん
2008/06/01(日) 16:01:54c = (char*)NULL; とせざるを得ない。
0517デフォルトの名無しさん
2008/06/01(日) 16:02:44昔は違ったかもしれないが、少なくともC89以降、0やNULLはどのポインタ型へも
暗黙の変換ができることになっている。
NULLを(void*)0と定義するのは、
誤ってポインタ以外に使おうとしたときにエラーにさせることが主目的。
規格に沿えば、単に0などという定義でも全く問題ない。
0518デフォルトの名無しさん
2008/06/01(日) 16:05:41ANSI Cが制定される前のCでは、キャストが必要な処理系があった。
その時代のコードならNULLやmallocの戻り値をキャストしてるコードはよくある。
0519513
2008/06/01(日) 16:06:14NULLを(void*)0にするとc=(char*)NULLと
書かないといけなくなるから0にしたという話だったと思う。
0はC/C++どちらでもキャストしないでいいはず。(int* p = 0とか大丈夫でしょ)
いずれにしてもc=(char*)NULLと書く必要はない気がする。
0520513
2008/06/01(日) 16:08:540521デフォルトの名無しさん
2008/06/01(日) 16:20:05そんな簡単に騙されるなよ・・・
0522デフォルトの名無しさん
2008/06/01(日) 16:20:41助かる場合には意味があるかもなぁ。
0523デフォルトの名無しさん
2008/06/01(日) 18:42:010 とは限らなくて、処理系独自のキーワードで定義されていることもある。
C でも C99 で処理系定義になった。
0524デフォルトの名無しさん
2008/06/01(日) 18:43:54C でも void* から別のポインタ型への暗黙のキャストをしようとすると警告出すコンパイラもある。
そういうコンパイラを黙らせるには明示的にキャストをしないといけない。
そういうことなんじゃないの?
0525デフォルトの名無しさん
2008/06/01(日) 20:45:22ただし、可変長引数の末尾には、(char *)NULL と書いておきなさい、という説があるみたいです。
0526デフォルトの名無しさん
2008/06/01(日) 20:47:11末尾に限らず可変長引数の途中でヌルポインタを渡したいときはキャストが必要。
同様に、実引数から型を推測するような関数テンプレートにもヌルポインタを渡す
ためにはキャストなどの注意が必要。
0527デフォルトの名無しさん
2008/06/01(日) 21:10:23NULL終端文字列として扱えるからな。
0528デフォルトの名無しさん
2008/06/01(日) 21:19:040529デフォルトの名無しさん
2008/06/01(日) 21:26:04NULLとだけ書くと整数のゼロを渡してしまうかもしれないからだろ
intとポインタのサイズが同じかつNULLのビット表現がintの0と一致するという限られた環境の下ではたまたま動くかもしれないが
0530デフォルトの名無しさん
2008/06/01(日) 21:35:210531デフォルトの名無しさん
2008/06/01(日) 21:37:01なんか斬新だな
dequeでいいんじゃないか
0532デフォルトの名無しさん
2008/06/01(日) 21:46:370533デフォルトの名無しさん
2008/06/01(日) 22:26:520534デフォルトの名無しさん
2008/06/01(日) 22:56:37boost/circular_buffer
0535デフォルトの名無しさん
2008/06/01(日) 23:40:50void Hoge() throw (HogeException){
}
として、VC++にてビルドすると
C++ の例外の指定は無視されます。
関数が __declspec(nothrow) でないことのみ表示されます。
という警告が出ます、
メソッドの例外型制限は VC++ 以外の環境でもサポート外なのでしょうか
よろしくお願い致します。
0536デフォルトの名無しさん
2008/06/01(日) 23:46:100537デフォルトの名無しさん
2008/06/01(日) 23:46:16gccでは使える
でもそれほど役に立たない機能だぞ
0538デフォルトの名無しさん
2008/06/02(月) 00:25:17>>537
ありがとうございます。
スローする例外を明示したかったのですが、
http://msdn.microsoft.com/ja-jp/library/sa28fef8(VS.80).aspx
を見た感じ、将来ではサポートする事を匂わせてますね。
0539デフォルトの名無しさん
2008/06/02(月) 00:29:090540デフォルトの名無しさん
2008/06/02(月) 01:16:350541デフォルトの名無しさん
2008/06/02(月) 01:20:31int a[] = { 0,1,2,3,4,5,6,7,8,9 }
みたいな組み込み型の配列を関数に引数として渡すにはどうしたらいいんでしょう?
vectorならそのまま参照でもコピーでもできるんですけど組み込み型はどうにもうまくいかなくて。
0542デフォルトの名無しさん
2008/06/02(月) 01:30:23{
...
}
int main()
{
int a[] = {0,1,2,3...};
func(a);
return 0;
}
もし関数内で配列を弄らないなら
void func(const int *a);
と宣言しとけばいい
0543デフォルトの名無しさん
2008/06/02(月) 01:38:58#define ELEMOF(array) (sizeof (array) / sizeof (array)[0])
void func(const int *a, size_t n) { ... }
func(a, ELEMOF(a));
0544デフォルトの名無しさん
2008/06/02(月) 02:06:16どもです。
やっぱり組み込み型はサイズを自動的には受け渡せないんですね。
vector では受け取った関数内で size を確認できるのに
組み込み型は sizeof の結果が変わってしまうので困ってました。
0545デフォルトの名無しさん
2008/06/02(月) 02:55:32テンプレートという手もありだよ。
template<typename T>
void func(T const& a) //中身を書き換えるなら当然T&で
{
...
}
これなら関数内ではsizeof a / sizeof a[0]もできる。
以下蛇足。Boost.Rangeを使ってboost::size(a)などと書けば、
組込配列も渡せるし、std::vectorも渡せるようにできる。
0546デフォルトの名無しさん
2008/06/02(月) 07:11:14void func(const int* begin, const int* end) { ... }
0547デフォルトの名無しさん
2008/06/02(月) 11:10:55valarray va(10);
log(va);
とか出来ますが、これは、自分で作ったクラスに対してlogとかsinとかを適用できるようにすることが
できるということだと思うのですが、どうやればよいですか?
valarrayのソースを見てみたけどよくわからんかったス
0548デフォルトの名無しさん
2008/06/02(月) 12:41:38普通に
Hoge log(Hoge x){ ... }
っていう関数を新たに定義すればいいのでは?
0549デフォルトの名無しさん
2008/06/02(月) 12:44:25csvファイルからデータを読み込むときに、一行目を飛ばして二行目から読み込みを始めたいと思い、
以下のようにプログラムを書きました。
/**** データ読み込み ****/
fscanf(fl,"\n"); //一行目(V1とか書いてあるところ)とばす
for(n = 0; n < P; n++){
以下配列に読み込み
fscanf(fl,"\n"); のところで一行飛ばしてから、for文で読み込んでいこうと思ったのですが、
うまくいきませんでした。
自分なりに調べてみたのですがうまくいきませんでした。ご教授よろしくお願いいたしますm(_ _)m
0550デフォルトの名無しさん
2008/06/02(月) 12:47:17たしかにそれでも出来ますが、valarrayのソース内にはそういう関数定義はないみたいなんですが、
やっぱり普通に定義しないとだめですよね?
0551デフォルトの名無しさん
2008/06/02(月) 12:51:26>fscanf(fl, "\n");
そのように書いても、一行飛ばすという意味にならない。
なぜこれで一行飛ばせると思ったのか?
教科書やリファレンスにそう書いてあったか?
カンでプログラミングしないこと。
while (fgetc(fl) != '\n') ;
などとすれば次の行まで読み飛ばせる (本当は EOF もチェックした方がいいけど)
0552デフォルトの名無しさん
2008/06/02(月) 12:56:32どの処理系か知らないけど、うちの C:\Program Files\Microsoft Visual Studio 8\VC\include\valarray には
>template<class _Ty> inline
>valarray<_Ty> log(const valarray<_Ty>& _Left)
>{ // apply log to each element of valarray
>_VALOP(_Ty, _Left.size(), ::log(_Left[_Idx]));
>}
って書いてあるよ
0553デフォルトの名無しさん
2008/06/02(月) 13:03:28レスありがとうございます。
fscanf(fl,"\n");
と書いて一行飛ばせると思ったのは、\nは改行を示しているために、
一行飛ばせると思ってしまいました。。もっと勉強します。
本当にありがとうございました。
0554デフォルトの名無しさん
2008/06/02(月) 13:09:430555デフォルトの名無しさん
2008/06/02(月) 13:16:13fscanf(fl,"%*[^\n]"); /* 改行以外の文字を読み飛ばしてから */
fscanf(fl,"%*c"); /* 次の一文字(=改行)を読み飛ばす */
とかになる
fscanf(fl, "%*[^\n]%*c");
と一見書けそうに思えるが、いきなり改行が来るとジャムるのでダメ
ま、scanf()系って理解すればそんなに難しいものではないけど
初心者には鬼門だな
0556デフォルトの名無しさん
2008/06/02(月) 15:41:22コール元をVCで作成してるいんですが、
「test.obj : error LNK2019: 未解決の外部シンボル __imp__CareerDataRead が関数 _main で参照されました。」
がでます。testはDLL用テストプロジェクトです。
下記はtest用DLLソースです。
extern "C" __declspec (dllimport) int CareerDataRead(char *chrFileName);
int main()
{
CareerDataRead("test.c");
}
なにが足りないのでしょうか?
0557デフォルトの名無しさん
2008/06/02(月) 15:57:340558デフォルトの名無しさん
2008/06/02(月) 15:58:33DLLをビルドしたときに出来たインポートライブラリをコール元にリンクする
0559556
2008/06/02(月) 16:05:54>>558
即レスありがとうございます。
インポートライブラリのリンクとのことですが、
�@プロパティページの「Frameworkと参照」の「参照」にて当該libファイルを設定する
�A同プロパティページの「リンカ」「入力」「追加の依存ファイル」にて当該libファイルを設定する
と2通りのやり方を調べあげました。どちらもやっても結果が変わりません。
申し遅れましたがVC++2008 Expressにて開発しております。
0560デフォルトの名無しさん
2008/06/02(月) 16:16:51プロジェクトのプロパティのリンカの入力に設定するか、
ソースに #pragma comment(lib, "xxxxxx.lib")
を追加する。
0561デフォルトの名無しさん
2008/06/02(月) 16:18:43そのDLLの関数はCリンケージでexportしてるね?
0562556
2008/06/02(月) 16:38:47>>560さんの指摘は�Aとお見受けしまた。pragmaの方は試してないのですが、なぜ前者の
方でうまくいかないのか謎です。
>>561
ソリューションは以下の構成下にあります。
ExcelVBA
Debug ←ここにlibファイルがあります。
ExcelVBA
Debug
test
よってリンカの「入力」「追加の依存ファイル」より「ExcelVBA.lib」を設定してあります。
また、リンカの「全般」に「追加のライブラリディレクトリ」というのがあったので
上記のライブラリがあるパスをフルパスで設定しました。
が、あいかわらず未解決がでます。
>>561
DLLのエクスポートですが
#define DllExport extern "C" __declspec (dllexport)
DllExport int WINAPI CareerDataRead(char *chrFileName);
を先頭につけており、同関数の中身を return 128;
でExcelから呼び出した場合128が却ってきたことを確認しています。
なお、これから複雑な処理を書くためVBAから結果のみみてデバッグは危険かと思い
ダミーコールプログラムをVC++で書いてる次第でございます。
0563556
2008/06/02(月) 16:43:54/OUT:"C:\Documents and Settings\xxxx\My Documents\Visual Studio 2008\Projects\ExcelVBA\Debug\test.exe"
/INCREMENTAL /NOLOGO /LIBPATH:"C:\Documents and Settings\xxxx\My Documents\Visual Studio 2008\Projects\ExcelVBA\Debug"
/MANIFEST /MANIFESTFILE:"Debug\test.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'"
/DEBUG /PDB:"C:\Documents and Settings\xxxx\My Documents\Visual Studio 2008\Projects\ExcelVBA\Debug\test.pdb" /
SUBSYSTEM:CONSOLE /DYNAMICBASE /NXCOMPAT /MACHINE:X86
/ERRORREPORT:PROMPT excelvba.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
0564デフォルトの名無しさん
2008/06/02(月) 16:52:00windows.h のインクルードもね
0565デフォルトの名無しさん
2008/06/02(月) 16:56:39export側では呼び出し規約がWINAPI
import側はWINAPIが抜けてる(んでcdeclを仮定している)
正しい方に統一汁
dumpbin.exeやバイナリエディタでDLLやlibの中身をのぞいたりすることも
してみると良い
呼び出し規約が違えばライブラリに埋め込まれるリンカ用の名前も変わるから
見りゃすぐ分かるよ
0566556
2008/06/02(月) 17:06:12ちなみに下記のように修正しました。
#include <windows.h>
// extern "C" __declspec (dllimport) int WINAPI CareerDataRead(char *chrFileName);
#define DllImport extern "C" __declspec (dllimport)
DllImport int WINAPI CareerDataRead(char *chrFileName);
int main()
{
CareerDataRead("test.c");
}
0567556
2008/06/02(月) 19:03:10↑の実際の処理手法を調べていました。
処理内容はファイル(テキストファイルで行ごとにタブ区切り)を読み込んで、ある一部分を集計するように
したいのですが、ファイルを読み込む方法として
�@fopen fget等C言語を使用する。
�Aifstreamを使用する。
�BCreateFile ReadFile等 Win32を使用する。
�CMFCの利用(すいません、調べきれてません)
などなどやり方が多くありどれが最適かよくわかりません。
元々VBAでやっていた集計が遅いとのことなのでスピードアップが目的なのですがどのやり方がよいか、
こんなのが一般的だなどアドバイスお願いします。
0568デフォルトの名無しさん
2008/06/02(月) 19:10:35MFCは除外するとして、WinAPIは行単位の読み込み関数がないから敷居が高いんでない?
ifstreamを使うかfopenを使うかは習熟度次第。
読み込むファイルが数値だけの書かれたテキストファイルならどっちでもいいでしょ。
処で、なんでExcel自身に処理させないの?
tsvを読み込むのも集計するのもExcelでできると思うのだけど。
0569566
2008/06/02(月) 19:18:49レスありがとうございます。
ifstreamがC++っぽいらしいのでそれで挑戦します。
ちなみにExcelVBAで処理を行うと1ファイル500行ほどで5万ファイルほど集計をかけなければならないため
(この5万ファイル中で項目によりベスト5、ワースト5等を決めます)
表示を切ったりセルに書き込む処理を抑制しても、処理に15分から20分ほどかかってしまいます。
VBAでいろいろな努力をした結果、1ファイルの処理をDLLで計算させると速いと聞いたのでいま苦戦中です;;
0570デフォルトの名無しさん
2008/06/02(月) 19:19:01場合によっては awk でも実用的な速度になるかもしれない
興味があれば「gawk」でググれば見つかると思う
# こんな感じ
BEGIN{FS="\t"}
{if(NF>=3) sum+=$3} // 3番目のレコードの総和
END{print sum}
0571568
2008/06/02(月) 19:25:27なるほど、ちょっとした量だな。
できれば、DLLにするよりも単体のプログラムにした方がらくだとは思うのだけれど……
あぁそうか、DLL作成のノウハウは(ここで)得ているのか。
0572デフォルトの名無しさん
2008/06/02(月) 19:26:420573デフォルトの名無しさん
2008/06/02(月) 19:32:39サンプルデータを用意してくれれば挑戦してみたい
どんな入力(サンプルデータ)に対してどんな値を返せばいいのかを教えてくれれば
C言語でやってみます
要するに関数プロトタイプとサンプルデータ下さいって事です
0574デフォルトの名無しさん
2008/06/02(月) 19:35:000575デフォルトの名無しさん
2008/06/02(月) 19:45:55そして車輪の再生産ですね?わかります。
0576デフォルトの名無しさん
2008/06/02(月) 19:47:37生産性重視なら他の言語でもいいが、C++にはパフォでは絶対勝てないな
0577デフォルトの名無しさん
2008/06/02(月) 19:49:05awkは以前Unixの処理系でやりましたが挫折しました。
>>571
初心者ですがこれも経験だと思ってチャレンジします。
>>572
集計結果が表やグラフで表示するため保存形式やドキュメントの流用性を考えるとExcelが有効だと考え
ました。
>>573
タブ区切りのデータが8個あり最終は改行です。
1 コメント 300 400 500 600 800 900
2 コメント 200 200 30 6 800 90000
3 コメント 350 100 450 600 20 500
:
(500行ほどあります)
↑このファイルが5万ほどありますが、ファイル指定は親のVBAからします。つまりファイル名を入力として
最終データの最高値、最小値、平均の3つを返せればそれを利用して他の処理もできると考えてます。
0578566
2008/06/02(月) 19:49:550579568
2008/06/02(月) 19:54:56VBAでファイルを読み込んで、VBAでExcel関数を使って集計するのは試した?
ファイル数が多いから微妙だけど、VBAを使いこなせていればそれなりの時間で処理できそうだけど。
0580デフォルトの名無しさん
2008/06/02(月) 19:56:425万ファイルはxlsじゃなくてtsvファイルってこと?
んで、集計結果もエクセルで扱いやすい形式であればよい?
0581デフォルトの名無しさん
2008/06/02(月) 19:59:496種の項目すべてについて最高値・最小値・平均を求めるとして
返すのは一番左の数値?それとも最高値・最小値?
int CarrerDataRead(const char *filename, long *max0, ... , long *max5, long *min0, ... , long *min5, long *ave0, ... , long *ave5);
こんなん?引数の数が半端無いよw
0582デフォルトの名無しさん
2008/06/02(月) 20:01:190583デフォルトの名無しさん
2008/06/02(月) 20:04:39VBAからの呼び出し時に配列を ByRef で渡す方法があれば簡単になるんだけど
その方法を知らないんだ
0584デフォルトの名無しさん
2008/06/02(月) 20:05:00ご指摘の内容はWorksheetFunctionのことだと思われます。が合計、平均等の処理は
当該処理を利用させてもらいました。おそらくダイエット可能な場所はほとんどやり尽く
した感があったためDLL化とうい道を選択しました。
実際算出しなければいけないデータは平均、最高値、最低値だけでないためExcel関数
の範疇を超えております。
0585デフォルトの名無しさん
2008/06/02(月) 20:05:10速度も、安定性もアップする。
なんか開けるすうに制限あるし、不安定な動作することがある c++
0586566
2008/06/02(月) 20:05:540587デフォルトの名無しさん
2008/06/02(月) 20:07:34そりゃぁ、バッファリングしないAPIなら速いでしょうね。早くはありませんが。
つーか、ハンドル閉じ損ねても100や200じゃ問題出ませんもんね。
0588デフォルトの名無しさん
2008/06/02(月) 20:09:09なに、その地雷コードw
0589デフォルトの名無しさん
2008/06/02(月) 20:09:200590デフォルトの名無しさん
2008/06/02(月) 20:09:510591デフォルトの名無しさん
2008/06/02(月) 20:10:29ファイルクローズはデストラクタ任せ
0592デフォルトの名無しさん
2008/06/02(月) 20:10:550593566
2008/06/02(月) 20:10:56データは各行の8項目の最終データのみ対象です。返すのは3つのデータです。(最高、最低、平均)
int CarrerDataRead("ファイル名"、結果の配列)
がベストと考えてます。ただVBAの方で受けられる型とかの検証はまだしてません。すいません。
0594デフォルトの名無しさん
2008/06/02(月) 20:12:14つまり、最終カラム?
0595デフォルトの名無しさん
2008/06/02(月) 20:17:24#include<stdio.h>
#include<stdlib.h>
int main(void){
int i, j, k;
FILE *fp;
char filename[FILENAME_MAX];
for(i=0;i<500;i++){ // とりあえず50000じゃなくて500
sprintf(filename, "temp/dat%05d", i+1); // tempというディレクトリは予め作っておいて下さい
printf("%s\n", filename);
if((fp=fopen(filename, "w"))==NULL) exit(1);
for(j=0;j<500;j++){
fprintf(fp, "%d\tコメント", j+1);
for(k=0;k<6;k++) fprintf(fp, "\t%d", rand());
fprintf(fp, "\n");
}
fclose(fp);
}
return 0;
}
■ このスレッドは過去ログ倉庫に格納されています