【初心者歓迎】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
0458デフォルトの名無しさん
2008/05/31(土) 09:03:11自分でドライバ書いてCPU占有すれば出来るかも。
カーネルモードならスケジューラに邪魔されずに処理できるから。
ただ、占有中は当然、キーボードもマウスも利かず、画面描画もされないから
ハングアップ同然の状態になるけど。
周期動作に関しては、自分でループして処理する。
QueryPerformanceFrequencey()とQueryPerformanceCounter()で
1GHzのCPUなら 1/1G秒=0.000001ミリ秒の精度で時間を計測出来る。
0459デフォルトの名無しさん
2008/05/31(土) 09:06:08QueryPerformanceFrequency()とQueryPerformanceCounter()ね。
0460デフォルトの名無しさん
2008/05/31(土) 13:07:380461デフォルトの名無しさん
2008/05/31(土) 13:08:08CPU周波数が動的に変わったときちゃんと動かないとか
0462デフォルトの名無しさん
2008/05/31(土) 13:09:04試してみればわかるんじゃ?
0463デフォルトの名無しさん
2008/05/31(土) 13:09:29そうですね、試してみます。
0464デフォルトの名無しさん
2008/05/31(土) 17:50:35一時期CPUクロックだったこともあったけど、
今はだいたいACPIタイマで、周波数は3579545Hz
0465デフォルトの名無しさん
2008/05/31(土) 19:05:27if(str="ABC")をやろうとすると
error C2678: 二項演算子 '==' : 型 'std::string' の左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。
1> 'ビルトイン C++ 演算子==(const char [15], const char [15])' の可能性があります
ってなるんですが何か変わったのですか?
VC++2008です。
0466465
2008/05/31(土) 19:16:03#include<string>にしたら動作しますた
0467デフォルトの名無しさん
2008/05/31(土) 19:56:47を実行させたいです、どうすればいいですか?
0468デフォルトの名無しさん
2008/05/31(土) 19:59:15スマートポインタに包んでおく
etc
0469デフォルトの名無しさん
2008/05/31(土) 20:02:540470デフォルトの名無しさん
2008/05/31(土) 20:14:160471デフォルトの名無しさん
2008/05/31(土) 20:15:37というか普通、何もしなくてもデストラクタ実行されるけど、
どういう終了のさせかたしてる?
0472デフォルトの名無しさん
2008/05/31(土) 20:21:010473デフォルトの名無しさん
2008/05/31(土) 21:10:01環境はWindows VS2005 C++及びLinux g++
0474デフォルトの名無しさん
2008/05/31(土) 21:19:020475デフォルトの名無しさん
2008/05/31(土) 21:27:030476デフォルトの名無しさん
2008/05/31(土) 21:38:570477デフォルトの名無しさん
2008/05/31(土) 22:01:550478デフォルトの名無しさん
2008/05/31(土) 23:04:03ローケルを日本語圏に設定してこれで波ダッシュが出るはずなんですが、何も表示されないみたいです。
更にstd::endlも出力されておらず、これを一般プログラムに使いまわすとそのプログラムが落ちてしまいます。
このような出力すると落ちる文字が書いてある表なんてものは存在するんでしょうか?何とかしたいです。
0479デフォルトの名無しさん
2008/05/31(土) 23:06:37ましてや、intをwchar_tにキャストしてそれをあたかも文字であったかのように扱うなんてとんでもない。
0480デフォルトの名無しさん
2008/05/31(土) 23:15:09環境はvc8です。他の文字はコードをちゃんと設定すればこれで表示されます。
とりあえずUTF-16が内部で使われているみたいなので、その場合に限っての話で進めてもらえませんか?
0481デフォルトの名無しさん
2008/05/31(土) 23:22:300482デフォルトの名無しさん
2008/05/31(土) 23:24:25とにかくデバッグ情報が出力できないので先に進まないです。
聞きたいこと :
コマンドプロンプトで表示が不可能なUTF-16の文字
0483デフォルトの名無しさん
2008/05/31(土) 23:28:170484デフォルトの名無しさん
2008/05/31(土) 23:49:330485デフォルトの名無しさん
2008/05/31(土) 23:55:030486デフォルトの名無しさん
2008/05/31(土) 23:57:43メモ帳にU+307Cの波ダッシュを入力し、ANSIで保存(日本語なのでコードページ932)、
それを開くと?になっていた。
つまり、Windowsの持っているCP932変換では波ダッシュからの変換が存在しないということ。
(全角チルダ0x8160への変換になっていない)
VCもWindowsの変換ルーチンを使っているので、
やはり正しく表示されないことの説明がつく。
Windows APIを使ってUTF-16を直接出力するか(これもフォントの都合でうまく表示されないかもしれないが)、
U+301CをCP932の0x8160にするように自分で予め変換しておくかだな。
0487デフォルトの名無しさん
2008/06/01(日) 00:02:340488デフォルトの名無しさん
2008/06/01(日) 00:13:41MSのCP932では、〜を>>483が書いてるようにU+FF5Eにマップするんだよ
こういう要注意な文字は他にもある
0489デフォルトの名無しさん
2008/06/01(日) 00:38:14上下逆の〜になるんだよね
0490デフォルトの名無しさん
2008/06/01(日) 00:58:24出力出来なくなるってのは何でなんだ?
昔作ったツール経由でコンソールだしたら、
普通にU+307Cだけ?になって、後の出力は問題なく出たんだけど。
0491489
2008/06/01(日) 00:59:29○U+301C
0492490-491
2008/06/01(日) 01:00:130493デフォルトの名無しさん
2008/06/01(日) 01:05:08B b;
A a = b;
って、したとき、
型変換でbの一時オブジェクトが出来て、コピーコンストラクタでaが構築されるのか?
それとも、型変換だけでaが構築されちゃう?
0494デフォルトの名無しさん
2008/06/01(日) 01:07:480495デフォルトの名無しさん
2008/06/01(日) 01:14:23なんで?に置き換わると思うんだ?
そんなもんは変換層の仕様/実装次第だろ
iostreamのエンコード変換に使われるcodecvt<>は、正常に変換できないときには
エラーにする仕様ってだけじゃまいか
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:34■ このスレッドは過去ログ倉庫に格納されています