【初心者歓迎】C/C++室 Ver.40【環境依存OK】
おつ
3 :
デフォルトの名無しさん :2007/07/18(水) 10:25:22
Cはそこそこ使ってて、C++を使い始めて日が浅いんでよくわかってないんだけど、 ユーティリティー関数というか特定のクラスに依存しない関数群ってクラスとしてコード書くよりもCの関数として書いた方がいいのかな? 関数をちょっと使いたい時に、わざわざクラスの実体作って関数呼び出しするのってなんかスマートじゃない様な気もするんだけど、C++なのに普通のCのコードが混ざるのもスマートじゃない様な気がするんだよなあ。 どっちがいいんだろう
>>3 >わざわざクラスの実体作って関数呼び出しするのって
class A {
static void B();
};
A::B(); // インスタンス不要
まあ↑みたいなことするくらいなら、
名前空間に入れたグローバルな関数でいいんじゃないかと。
>>3 そんなときはnamespaceで囲ってしまえばいいんでない?
#昔はstaticなメンバ関数しか持たないクラスを作るケースもあったけどね。
7 :
デフォルトの名無しさん :2007/07/18(水) 13:58:34
こんにちは。 キャストについて質問があります。 グローバル宣言をしたchar型2次元配列の要素をatoi()で、 int_var = atoi(out_one_statement[12]); で整数に変換しようとするとゼロが帰るのです。 (int_var = atoi(&out_one_statement[12]);はエラー) また、char型の変数にその配列の要素を代入しようとすると、 「error C2440: '=' : 'char [32]' から 'char' に変換できません。」 となります。このメッセージはchar[4][32]とかで宣言したその配列の 「char[i][0:31]の32要素数のベクトルはスカラー変数に代入できないよ」 と解釈したのですが、実際どうなのでしょうか。 よろしくお願いします。
out_one_statement[12] の中身も言わずに・・・
9 :
デフォルトの名無しさん :2007/07/18(水) 14:10:46
>>8 char out_one_statement[9][32]={0};
と宣言して、
main関数外でchar型の変数を代入して、
main関数内でそれを先に説明したように操作しています。
環境はVC++2005です。
>main関数外でchar型の変数を代入して、 具体的に何をどうやって代入したんだ。 もしくはデバッガで中身見てみようぜ
out_one_statement[0]からout_one_statement[8]までchar*型として使えるのだから、out_one_statement[12]は論外。
12 :
デフォルトの名無しさん :2007/07/18(水) 14:14:08
プログラム超初心者です。 本とか買って独学で学べば良いですか? スクールとか行くべきですか?
14 :
デフォルトの名無しさん:7 :2007/07/18(水) 14:54:21
プログラムは端的に言ってパターンマッチングです。char型の文字列から パターンを抽出するので、外部関数内で、入力(配列)からパターンを 見つけて、char型の変数でフラグを立てたり、抽出した文字列を 出力配列out_one_statement[9][32]の"列"へ代入させています。 利用側で扱う時は char index0, index1 /* この値も代入対象 */ out_one_statement[index0][index1] あるいは、 out_one_statement[32*index0 + index1] out_one_statement[32*INDEX + index1] のようにして右辺値に利用しています。
列ってどっちさ。
16 :
デフォルトの名無しさん:7 :2007/07/18(水) 14:56:11
>/* この値も代入対象 */ 外部関数が出です。
17 :
デフォルトの名無しさん:7 :2007/07/18(水) 14:57:52
>>15 [32]側です。代入操作後に代入状態をチェックしましたが、
それについては問題がないようです。
・ char out_one_statement[9][32] なのに out_one_statement[12] という範囲外の要素を参照しているのはなぜか ・ atoi で 0 が帰ってくる時の out_one_statement[12] には何が入っているのか
19 :
デフォルトの名無しさん:7 :2007/07/18(水) 15:04:18
>char out_one_statement[9][32] なのに out_one_statement[12] out_one_statement[0][12] == out_one_statement[0*index0 + 12] == out_one_statement[[12] として扱っているのですが、これに問題があるのですか? >atoi で 0 が帰ってくる時の out_one_statement[12] 3 '□'です。
20 :
デフォルトの名無しさん:7 :2007/07/18(水) 15:06:51
>out_one_statement[0][12] == out_one_statement[0*index0 + 12] out_one_statement[0(index0 = 0)][12] == out_one_statement[32*0 + 12] でした。。。
実際には out_one_statement は char の一次元配列として定義してるの?
ちゃんとNULL終端になってるのか?
24 :
デフォルトの名無しさん:7 :2007/07/18(水) 15:46:49
何となくわかりました。 atoi()にかかわらず、アドレス渡し時には”行”アドレスを渡すので、 int ctoi(char *char_var, char addr) { int i; i = char_var[addr]; return i; } と関数作って変換することにしました。
char out_one_statement[9][32]なら、 out_one_statement[12] == &out_one_statement[12][0] だよ。 out_one_statement[0][12]をアクセスしたいならout_one_statement[0][12]と書こうよ。
26 :
デフォルトの名無しさん:7 :2007/07/18(水) 15:57:53
>>21 間違いを教えていただけませんか。よろしくお願いします。
char *char_varの
*char_varはメモリ空間上、char_var[0]と等しく、
char_varはメモリ空間上、&char_var[0]と等しいと本で読んでいました。
二次元配列でも、先頭アドレスのchar_var[0][0]"のみ"を渡すのだとして
間違っていたようです。
>>18 さんのご指摘はこの辺が絡んでいるのでしょうか?
27 :
デフォルトの名無しさん:7 :2007/07/18(水) 16:04:17
>>25 そうですね。きちんとインデックスを明示すれば問題なかったことですね。
今回のことで学習できました。ありがとうございます。
>out_one_statement[12] == &out_one_statement[12][0] だよ。
今回これが分かりました。また御厄介になるときがあると思うので、
その時よろしくお願いします。
#
>>24 で分かりましたが、この関数は使わないようにします。
ありがとうございました。
28 :
デフォルトの名無しさん :2007/07/18(水) 19:10:32
1から9までの数字を1回ずつ使った9桁の数字を小町数という。 二乗した数が小町数となるような自然数をすべて求めるプログラムを 作成し、その数と小町数の両方を出力せよ。例えば24441の二乗は 597362481であり、小町数となる。 全然手をつけられません。できる方いればお願いします。
29 :
ERP :2007/07/18(水) 19:12:20
久しぶりにプログラムを書き始め、visual studio 2005でc++ とMFCを使っていますが、外部の機械に入出力ポートからトリガー パルスを出力したいとおもってます。昔のbasicとか古典的なCでは そのような関数(oportのような?)が用意されていたように思い ますが。最近のWIN32環境ではみあたりません。 どのようにしたらいいでしょうか?
つ[インラインアセンブラ]
>>28 全ての小町数の平方根とっていけば求まりそうだなぁ
>>31 11111から31427の二乗が小町数かどうかチェックした方が早い希ガス。
>>28 宿題は宿題スレへ。
現行のスレに同じ問題と答えが載っている。
#include <stdio.h> #include <stdbool.h> #include <stdlib.h> #include <string.h> static int compareChar(const void * l, const void * r) { const char * cl = (const char *) l; const char * cr = (const char *) r; if (* cl < * cr) return -1; if (* cl > * cr) return 1; return 0; } static bool isKomati(int val) { if (val < 123456789 || val > 987654321) return false; char buf[10]; sprintf(buf, "%d", val); if (strchr(buf, '0')) return false; // 小町数に0はない qsort(buf, 9, 1, compareChar); if (strcmp(buf, "123456789") != 0) return false; return true; } int main() { for (int ic = 11111; ic * ic < 987654321; ++ic) { if (ic % 3 != 0) continue; // 小町数は9の倍数なので、その平方根は3の倍数 if (isKomati(ic * ic)) { printf("%d * %d = %d\n", ic, ic, ic * ic); } } return 0; }
36 :
デフォルトの名無しさん :2007/07/18(水) 22:02:56
wchar_t *p = L"Hello!"; のLって標準と考えてもいいんでしょうか? もしかしてWindowsだけですか?
>>29 私だったら、シリアルポートのCTS/RTSとかで制御するけど。
それならWIN32APIで、CreateFileとDCB構造体を操作するAPIを使えばいい。
ややこしいけど、直接IOポートをたたきたくても無理だからね。
それにしても、メール晒すなんて勇気ある御仁ですな。
39 :
デフォルトの名無しさん :2007/07/18(水) 23:01:40
最近Cをやり始めた者です、ふと疑問に思ったのですがVisualC++、BorlandC++などのコンパイラがありますが それらの違いとは何なのでしょうか。あとコンパイラが違うとプログラムの書き方も変えないといけないのでしょうか。 くだらない質問ですいません。
標準ではない部分が違う
標準への準拠率も違う可能性が
>>39 世界標準の規格としての部分があり、それに各社独自な部分を加えている、とでも言えばいいんだろうか。
書き方で注意を要するようになるのは、多分C++のクラスを勉強し始めてからになるんじゃないかと。
作っているメーカーが違う。 Visual C++はMicrosoftが作っているし、Borland C++はBorlandが作っている。 それぞれ自分の製品を買ってもらおうと必死なんで、 プログラム作りを補助するツールやライブラリなどに独自色を打ち出している。 しかし、どれもC++処理系を名乗る以上、コンパイラと標準ライブラリなどの部分は、 ISOの国際標準に則っているので、そういう独自機能を使わない限りは、 どのコンパイラでも同じ書き方が通用する。 ……というのが理想だが、現実は標準への対応具合や 標準が認めているコンパイラごとの挙動の違いなどがあるので、 時にどのコンパイラでも通用するプログラムを書くというのは難しいこともある。 C++はそれが比較的顕著なほうだが、そんなこと日常的に気にする必要があるのは、 基本的に良くも悪くも(周囲の環境か本人が)変態な場合だけなんで、 やっぱり普通はそんなこと気にする必要がない。
なるほど、あつかましいようですがVisualC++とBorlandC++ どちらのほうが入門に適しているんでしょうか?
VisualC++は入門には不必要な部分が多いが、慣れておくのも良い
すでにやり始めてるならそのまま続けろ
47 :
デフォルトの名無しさん :2007/07/18(水) 23:32:15
とりあえず言語の勉強だけなら Visual C++ 2005 Express でいいんじゃないの。 無料だし。
BCも無料なんだけどパスってのが分からなかったりメモ帳しか使ったことがないってのなら
>>47 のVC++が良いよ。
BC はメルアド晒すことになるし・・・
そしてC++/CLIとごっちゃになって混乱する、と
URLエンコードされたものをデコードしたいんですけど 何か良いライブラリってありますか?
52 :
デフォルトの名無しさん:7 :2007/07/19(木) 00:06:36
>>7 です。
質問があります。以下のような関数を作ってファイル出力させてみたところ、
Windowsにあるノートパッドで、文字列を表示できません。。。
int output_dfg_to_file(){
FILE *fp;
char filename[64];
int state = 1,
index0,
index1;
int char_lib;
printf("OUTPUT >> DFG File Name: \n");
gets_s(filename);
if ((fp = fopen(filename, "w")) == NULL){
printf("ERROR: could not open file. \n");
state = 1;
goto exit;
}
for (index0=0; index0 < LIB_TABLE_SIZE; index0++){
for (index1=0; index1 < LATTER_SIZE; index1++){
char_lib = table[index0][index1];
printf("%c", char_lib);
fputc(char_lib, fp);
}
fputc('\n', fp);
}
fclose(fp);
exit:
return state;
}
いったん送信〜
文字を出力していないのではないか? table[index0][index1] ってなにさ?
54 :
デフォルトの名無しさん:7 :2007/07/19(木) 00:15:45
>>52 char table[TABLE_SIZE][LATTER_SIZE] = {0};
で出力もとデータを扱っています。
fputcは、他の関数も使った事がないので上記で出力させてできたら
移行しようと思っています。fputcは出力文字対象の整数を引数に
していますが、ファイル書き込み時にも整数(int)のまま書きこん
でいるのでしょうか?
普段使っているtex¬epadで出力したファイルを編集したいので、
上記関数をどう変更すればいいかわからないでいます。
よろしくお願いいたします。
>>54 printf()での出力はどうなってる?
56 :
デフォルトの名無しさん:7 :2007/07/19(木) 00:42:59
>>55 int ctoi(char *char_var, char addr){
int i;
i = char_var[addr];
return i;
}
でもって、先のボディを
char_lib = ctoi(&table_logical_object[index0][0], index1);
printf("%d", char_lib);
fputc(char_lib, fp);
としてみますと、
1.改行がされない。
2.0で初期化しているので、0が混ざって出力される。
3.フラグは適切にアサートされている
といったところです。
57 :
デフォルトの名無しさん :2007/07/19(木) 00:51:04
>>56 printf("%d", char_lib)
となってるけど
>>52 みたいに%cでやってみて
ちゃんとコンソールに出力されてなければテーブルの中身がおかしいのかな?
58 :
44 :2007/07/19(木) 00:52:53
わざわざ答えてくださってありがとうございました。
59 :
デフォルトの名無しさん:7 :2007/07/19(木) 01:24:49
>>57 :%c表示
コンソールには適切に表示される文字とされない文字がありました。
特定列だけ正常に表示されています。
出力用配列への代入時のキャスティングに問題ありかなと思えました。
そこで、出力用配列を整数型に代えて、%dで表示してみると、
整数値としてきちんと10進数表示はできました。
問題は文字列表示です。。。
教科書のソースなら読めるのですが、 コメントの少ない1000行くらいの物がなかなか読めません。 どうすればソースコードを読むのがうまくなるのでしょうか?
>>60 まず大局から把握していく
書かれてる処理が何のアルゴリズムの実装かとか、
(クラス名→)関数名・グローバル変数名→ローカル変数名と見て行って
それぞれの役割とかに見当をつけて読む
理解した部分にコメントを付けながら読むといい
あと色んなコーディングスタイルのプログラムを読んで経験しておくのもいい
ちなみに何行くらいの物が読めると 中級者になるのでしょうか?
行ではないと思う。
てか関数にコメント付いてないソースは窓から投げ捨ててよし
65 :
デフォルトの名無しさん :2007/07/19(木) 11:51:38
質問があります。 MS VS2003 C++のGDI+なのですが、 Imageクラスのオブジェクトに画像が入っているとして、 1ドット目、座標 (0, 0) の色を取得するにはどうしたらよいでしょうか? Image* img = new Image("pic.bmp"); Color aColor = image.getPixelColor(0, 0); みたいにしたいのです。 よろしくおながいします。
>>65 エラーメッセージやライブラリドキュメントをよく読めばよいです。
67 :
65 :2007/07/19(木) 14:25:24
はぁ…。
誰も回答してくれなかったけど自己解決したので一応載せておきます。
ストリーム経由しているので最適な方法とは思えませんが。
Image* orgImg;
:
:
// ストリーム用意
CLSID clsid;
GetEncoderClsid(L"image/bmp", &clsid);
IStream *stream;
::CreateStreamOnHGlobal(NULL, true, static_cast<IStream **>(&stream));
// ストリームに保存
orgImg->Save(stream, &clsid);
// ビットマップ読み込み
Bitmap bmp(stream);
// 始点の色取得
Color color(0, 0, 0);
bmp.GetPixel(0, 0, &color);
>>66 わっかんねーならすっこんでろやカス野郎w
死ね!!www
69 :
デフォルトの名無しさん :2007/07/19(木) 14:43:15
すみません。C++初心者です。 C#でWindowフォームプログラムを作成したのですが、 インストールが出来ないPCで稼動させねばならなくなりました。 (そのマシンには.NetFrameWorkが入っていない) 短いプログラムなので作成しなおしてもよいのですが、 C#から、インストーラを稼動させたりランタイムをインストールさせたりせずに インストーラ不要のEXEプログラムを作成するのに一番良い方法はなんでしょうか? 環境が似ているVC++2005 ExpressEditionをDLしてみたのですが、 インストーラ不要のEXEプログラムの作成の方法がわかりません。 (作成できるかどうかもわかりません) すみませんが、どうかご教示願います。 開発環境:WinXP 実行環境:Win2000、WinXP
>>68 ほら、「エラーメッセージやライブラリドキュメントをよく読めばよいです。」
ってまたレスしなよ。
>>67 エラーメッセージやライブラリドキュメントをよく読んで自己解決したならそれは
>>66 のおかげw
>>69 結局、最終的に動かしたいのはC#で作ったやつなのかC++なのか?
C++ならランタイム無しでシステム標準のDLLだけで動作するものは
作れるが、それとC#のプログラムとは何の関係もないぞ?
73 :
72 :2007/07/19(木) 14:57:30
C++でもフォームで作れるけど、それじゃ.NET環境必須だから意味ないよな ということで、C++で作ることになるけど、かなり初歩からやらないとならんかもな。 MFCのスタティックリンク、が一番近いかなあ、、、
>>67 そんなら、GraphicsからBitmap作成して、
Graphics::DrawImage()して、
そのBitmapからピクセル取得したほうがいいんじゃないかな。
75 :
69 :2007/07/19(木) 14:58:47
早速の回答ありがとうございます。 ランタイムなしで作成できるならC++で作成したいです。 C#のコードを捨てるのは全く問題ないのですが、 ある程度慣れたVC++2005ExpressEditionで作成出来ればと思っています。
>>75 CだろうがC++だろうが、ランタイムは(普通は)使うことになるが、
静的にリンクすることで、外部のDLLに依存するのではなくプログラムに
埋め込むことが出来る。
まあ、良し悪しなんだがな。
>>75 EEだと、MFCも無いのでマウスで貼り付けるようなのは無いぞ。
まあテキストで全部できるし、リソースエディタを外部ツール使えばいいか。
>>73 開発環境が 2005EE だと リソースエディタ と MFC は無いんじゃなかったっけ?
フォーム風のをフルスクラッチで書くのは泣ける希ガス
79 :
69 :2007/07/19(木) 15:06:29
>>76 ,77
ありがとうございます!
>>76 EEだと、MFCも無いのでマウスで貼り付けるようなのは無いぞ。
まあテキストで全部できるし、リソースエディタを外部ツール使えばいいか。
その方法が知りたいのですが良く分かりません。
ご教示頂ければ幸いです。
wxWidgetとかQTとか使うといいんじゃね
>>80 スタティックリンクできるっけ。
インストール不要なら検討の余地はあるね。
>>82 ライセンスまで含めてマジメに考えるとどうなるか分からん
てかC++Builder Explorerつかえばいいんじゃないか?
>>82 インストールは不要だね
どうしても実行ファイルは大きめになるけど
87 :
デフォルトの名無しさん :2007/07/19(木) 16:11:41
次のようにintとfloatが混在しているとファイルに正しく書き込めないんでしょうか? 読み出すとき値が壊れています・・・ for(k=0; k<100; k++) { fp.write(( char * ) &k,sizeof(unsigned int ) ); fp.write(( char * ) &x[k],sizeof( float ) ); }
88 :
デフォルトの名無しさん :2007/07/19(木) 16:14:03
87です すみません バイナリモードで開いていませんでした
>>88 というか…2行目の
fp.write((char *)&k, sizeof(unsigned int));
もうこの時点で何をしたいのかよく分からない。
変数kのアドレスを出力してるの?
何のために?
…俺が勘違いしてるのかな。
普通に見られる書きかただと思うけど、何と勘違いしたのだろう。
確かによく使われる書き方だけどキャストしまくりでソースが汚れるからこういうのを考えました template <typename Rng, class OutStream> OutStream& binWrite(Rng& rng, OutStream& os) { using namespace boost::lambda; using boost::addressof; using boost::range_value; boost::for_each(rng, bind( &OutStream::write, &os, ll_reinterpret_cast<char*>( bind( addressof<typename range_value<Rng>::type >, _1 ) ), ll_static_cast<std::streamsize>( ll_sizeof( _1 ) ) ) ); return os; } 使い方は std::ofstream ofs("test.dat"); std::string a("abcdefg"); として binWrite(a,ofs);だけでおk どうよ?
93 :
92 :2007/07/19(木) 18:40:35
すいません
横からserialization使えとか言われて気づいたので
>>92 は見なかったことにしてくだしあ><
94 :
デフォルトの名無しさん :2007/07/19(木) 22:56:36
VC++ 2005 Express で std::ofstream file("c:\\日本語ファイル名", std::ios::out | std::ios::binary | std::ios::trunc); とするとファイル名が文字化けしていまいます、ofstreamでは日本語ファイル名が使えないのでしょうか? プロジェクト設定をUnicode、マルチバイトどちらにしても結果は一緒でした
>>95 ありがとうございます
setlocale(LC_ALL, "Japanese");
を呼ぶことで無事できました。
VCのバグっぽいですね
97 :
94 :2007/07/19(木) 23:07:46
プロジェクト設定Unicodeでやってもだめだったのは L"ファイル名" としていなかったからでした
98 :
デフォルトの名無しさん :2007/07/19(木) 23:43:15
VC++ 2005 Expressを使用しています。 画像表示に関する質問です。 PictureBoxに複雑な画像を描写しました(Setピクセル)。 その画像に、Drawlineで線を描きました(マウスmove等を使用)。 この線を書き直したいのですが、線を消すために DrawlineのWhitePenを使用すると、せっかく読み込んだ複雑な画像まで、 白抜きになってしまいます。 後から書き加えた線だけを消去したい場合は、 どのような方法で消去すればいいでしょうか? ご指導お願いします。 複雑な画像を一旦保存しておけばいいのかなぁ と思っているのですが・・・ よろしくお願いします。
>>94 次からは、文字列には頑張って
TEXT("とりあえずTEXTつけときます")
ってしとこうな。
それがいやならリソースにしとくれ
それにしても、MBCSでも日本語きちんとコンパイルできるサービスパックを早くツクレカス>マイクロソフト
おまいらよ、まだ、VS2005の文字セットMBCSしているのか? いいかげん、海栗コードにしろよな。
>>98 >複雑な画像を一旦保存しておけばいいのかなぁ
>と思っているのですが・・・
>よろしくお願いします。
うん。
原則として、OnDrawが呼ばれる度に操作と順番通りに書き込むのがウィンドウズの基本。
一回書く毎にピクセルを保存すると、UNDO限界回数と画像の大きさによっては
莫大なメモリが必要になるから。
102 :
98 :2007/07/20(金) 00:01:58
>>101 ありがとうございます。
もしよろしければ、一旦保存する方法を教えて頂けますか?
キャプチャというのを使うのかと思ったのですが、
なかなかうまくいきません。
103 :
94 :2007/07/20(金) 00:07:46
>>99 テストコードだから抜けてた・・・
と、言い訳
104 :
デフォルトの名無しさん :2007/07/20(金) 00:15:27
string::find_first_of()で大文字小文字を区別して検索する方法ってある?
何も考えずにやったら区別されるはず
106 :
101 :2007/07/20(金) 00:20:46
>>98 一旦保存というのをちょっと勘違いしているかもしれない。
画像をピクセルで保存するのではなく、
白紙の状態からラインを引く関数の始点・終点・色を全て覚えさせておくのですよ。
だから、それを覚えさせるための仕組み(普通は構造体の配列とかリストなど)を作っておいて、
UNDOしたかったら、現在までの手順から1個引いたまでの手順をウインドウに書き込むということ。
例えば、ピクチャーのまま保存して、応用で10回までUNDOできるという作り方もできるが
それは↑の課題をクリアしてからじゃないかな。
今のマシンだったら、1000個程度のラインは一瞬で引けるよ。
話は変わるが、単に今の画像をキャプチャしたいのなら、Alt+PrintScreenキーでコピーして
ペイントか何かに貼り付ければいい。
残念だがPictureコントロールは使った事が無いのでプログラムでの操作は知らない。
107 :
98 :2007/07/20(金) 00:30:49
>>101 ありがとうございます。
一旦保存を勘違いしていたようです。
これから、再チャレンジしてみます。
ありがとうございました。
>>100 VCLが海栗コード対応しないんだもの(´・ω・`)
すいません、質問です。 enum Type{ UNDEF, SYS }; #define TYPE(t, nargs) ((t)*1000+(nargs)) enum keywords{ READ, WRITE }; struct s_keywords{ char *key int type; int i; }; static struct s_keywords func[] = { {"read" , TYPE(SYS, 0), READ} 省略 というマクロが有るんですが、 TYPE(SYS, 0)の部分はどのように置換されるのでしょうか?
(UNDEF+1) * 1000 + 0 だから恐らく1000
有り難うございます。 マクロってこんな事も出来たんですねぇ。
eclipse,CDTで開発しています。 普通はprintf("1"); scanf("%d",&num);とやれば1が表示された後入力を求められるのですが、 何故か私の環境では1が表示されずいきなり入力を求められ、 printf("1"); fflush(stdout); scanf("%d",&num); とやらないと正常に表示されません 何か出力ストリームの挙動がおかしいです。 ググってみたところfflush(stdout);をするとそれなりに処理時間がかかってしまうそうですし・・・ これってスピードを求められるcでは致命的ですよね? ググると同じような現象が起こった方が数人居るようですが、解決方がfflush(stdout); しか載っていません。fflush(stdout);以外の解決法教えてください。 コンパイラはMinGW5.0 + msys1.0 CDTはeclipse3.3の更新サイトでついてくる奴 使ってます。
ユーザー入出力にスピード求めるのか? 対象ユーザーどんだけニュータイプなんだよw
対象ユーザーじゃなく112がニュータイプ
115 :
112 :2007/07/20(金) 09:54:59
そうですか。では普通にfflush(stdout);で解決しても無問題ということですね。 ご回答thx
>>112 その辺は微妙な話だと思う。
stdoutは端末に結び付けられている場合は行バッファリングされ、
そうでない場合はフルバッファリングされるのが伝統的実装のようだが、
規格でそうしろと決まっているわけでもないようだ。
stderrがバッファリングなしというのは決まっていたはずだが。
さらに、入力を行う際は、行バッファリングされている出力を
前もってフラッシュすることになっていたと思うが、よく分からん。
stdoutが行バッファリングされている場合に、
>>112 のような
コードで、改行なしのプロンプトを表示後に入力できるためには、
そうなっていなければならないのだが。
もしかしたら、
>>112 の環境ではstdoutがフルバッファリングされているのかもな。
確実に即座に出力を表示したい場合は、stderrを使うというのが一つの手だが、
いちいち fprintf(stderr, ...) と書きたくないのなら、
setvbuf()を使ってstdoutをバッファリングなしに設定するという方法もある。
stdoutはリダイレクトされることもあるのだから、できれば
isatty()などを用いて標準出力が端末かどうかを見たほうが良いのだが、
残念ながらこの方法は移植性があるとは言えないのが難点だ。
117 :
デフォルトの名無しさん :2007/07/20(金) 14:49:27
C++の認定試験てあるの?
ある。俺が創った。
そしてオレが認定。
そして俺が脱落
#include<stdio.h> struct complex{ double re,im; }; この意味を教えてください。
ストラクトは構造体、コンプレックスはそれにつけた名前(intとか、charとかに匹敵) その次のダブルはその構造体の構成要素、だと思います 私はc言語暦1週間くらいなので当てにならないかもしてませんが
電通女 ◆v1Uy5WkQ7k に一致するページは見つかりませんでしたからダメです。
構造体で、"re"と"im"という変数を定義してるって事ですか?
それって複素数でそ? 私にもわかるよww
それは分かってるんですが、プログラムの意味がわからなくて。
>>121 struct kozotai{
double a;
double b;
};
これが何か分かるならそれもわかるはず
double型の変数reとimを含む構造体complexを宣言した。 それだけ
>>127 子宮で考えるんじゃない、脳で考えるんだ!!
あまりにも初心者すぎる質問ですが、お願いします。 VC++2005EEで新規作成->Win32コンソールアプリケーションを作成(オプションで "空のプロジェクト"を選択)した後、 #include<iostream> int main(){ std::cout << "hello"; return 0; } だけのmain.cppをソースファイルフォルダに作成し、これをビルドしようとすると 以下3つのエラー: main.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall std::ios_base::Init::Init(void)" (??0Init@ios_base@std@@QAE@XZ) が関数 "void __cdecl std::`dynamic initializer for '_Ios_init''(void)" (??__E_Ios_init@std@@YAXXZ) で参照されました。 main.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall std::ios_base::Init::~Init(void)" (??1Init@ios_base@std@@QAE@XZ) が関数 "void __cdecl std::`dynamic atexit destructor for '_Ios_init''(void)" (??__F_Ios_init@std@@YAXXZ) で参照されました。 fatal error LNK1120: 外部参照 2 が未解決です。 が発生します。 思い当たるところがあればお教えください。よろしくお願いします。
"空のプロジェクト"がダメなんじゃ? "こんにちは、世界"でどうぞ
>>131 別にその通りにやって普通にコンパイルできるけどな。
MSSDKをインストールしていて、そのlibディレクトリにlibcp.libとかいう
怪しいライブラリが入っていたりしない?
134 :
131 :2007/07/20(金) 23:41:11
libcp.libより怪しい133が入ってますた!!
135 :
131 :2007/07/20(金) 23:55:59
>>134 誰てめえw
>>132 すいません、もう少し分かり易く・・・
"空のプロジェクト"のチェックをはずしても同様のエラーが出ました。
(そういう意味じゃなかったですか?)
>>133 確かにありました。しかしそのlibファイルをリネームしてみたり、
プロジェクトのプロパティからライブラリの無視リストに入れてみたり
しましたが変化なしでした。
133さんで問題なくビルドできるということは、自分の特有の環境が
原因ということなのでしょうか(MSSDKあたり?)。調べてみます。
>>135 ふうん、変化なしか。
libcp.libはC++のランタイムで、本来はVC++に付属のものが使われるべきで
SDKになぜか入っていたりする怪しいのが優先参照されちゃうとマズかったりする。
てっきりそのせいかと思ったんだがな。
コマンドプロンプトからvcvars32.batを実行後に普通にcl.exeでコンパイル
するとどうなる?
>>136 動きました!なぜ。
cl.exeでmain.cppを直接コンパイルすると、下のような警告が大量に出ましたが
問題なく動きました。
C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE\ostream(751) :
warning C4530: C++ 例外処理を使っていますが、アンワインド セマンティ
クスは有効にはなりません。/EHsc を指定してください。
main.cpp(6) : コンパイルされたクラスの テンプレート のインスタンス化 'st
d::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::b
asic_ostream<_Elem,_Traits> &,const char *)' の参照を確認してください
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
これで動くということは、VC++の設定の方でどこか変えてはいけない部分を
触っちゃって(かつ忘れて)いるといったところでしょうか。
>>137 その警告はまぁオプション指定しないと普通に出るね。言われたとおりに
/EHscを指定すればよい。
後はまぁ、clで無オプションでコンパイルしたんならデバッグ版のライブラリ
じゃないから、IDEからリリースビルドでやってみるとか、
ツール→オプションでVC++ディレクトリの優先順位をチェックするとか、
プロジェクトファイルの中を見てみて、どうなってるかチェックするとか、
色々やってみるんだね。
まあ、vcvars32.bat内に set CL=/EHsc /Ox /W4 程度を適当に入れとくべきだろ。
親切にありがとうございました。 一応動くようにはなったので、いろいろ試しつつ 何が原因だったのか調べてみようと思います。
今思ったんだが、「空のプロジェクト」ってなんかカッコよくね? “Project S・K・Y” とか表記するともっとカコ(・∀・)イイ
から
「からのぷろじぇくと」としか読んだこと無い
empty project
ポインタって何ですか?
147 :
145 :2007/07/21(土) 17:29:11
148 :
デフォルトの名無しさん :2007/07/21(土) 19:51:49
HARC HWNDっておなじですか??HARCがエラーになります
HARC?
A SHARK? No,a dolphin! Watch out!!
151 :
デフォルトの名無しさん :2007/07/21(土) 20:30:47
書庫のファイル名を取得したいんですけど・・・どうすればいいかわかりますか?? #include <windows.h> #include <iostream> using namespace std; typedef HWND (__stdcall *FND)(const HWND ,LPCSTR , const DWORD ); typedef int (__stdcall *FNE)(const HWND , LPCSTR ,int ); main(){ char buf[128]; HINSTANCE hd = LoadLibrary("UNZIP32.DLL"); FND pd = (FND)GetProcAddress(hd,"UnZipOpenArchive"); FNE pe = (FNE)GetProcAddress(hd,"UnZipGetFileName"); HWND q=(*pd)((HWND)hd, "file.zip",0); (*pe)(q , buf, 128); cout<<buf<<endl; FreeLibrary(hd);}
152 :
関数はこうなっています・・・ :2007/07/21(土) 20:34:20
HARC WINAPI UnZipOpenArchive(const HWND hWnd,LPCSTR szFileName, const DWORD dwMode); 機能 指定ファイルが UNZIP32.DLL に有効な書庫ファイルかどうか調べ、 有効であればオープンし、一意の数値(ハンドル)を返します。 以後の書庫ファイルへのアクセスはこのハンドルでおこないます。 アクセスを終了する時は UnZipCloseArchive 関数を呼ばなければなりません。 引数 hWnd UNZIP32.DLL を呼び出すアプリのウィンドウ・ハンドル。 szFileName 書庫ファイル名。 dwMode 処理モードを指定するフラグ。次の値を|(オア)で 組み合わせる。 戻り値 指定の書庫ファイルに対応したハンドル。エラー時は NULL を返します。 int WINAPI UnZipGetArcFileName(HARC hArc,LPCSTR lpBuffer,int nSize); 機能 書庫ファイル名を得ます。 引数 hArc UnZipOpenArchive() で返されたハンドル。 lpBuffer ファイル名を格納するバッファ。 nSize バッファのサイズ。 戻り値 正常終了時に0、異常時にはエラーコード(0以外)が返ります。
153 :
151 :2007/07/21(土) 20:39:24
自己解決するかもしれないです・・・
154 :
151 :2007/07/21(土) 20:42:36
自己解決しました
C++(DirectX)でファイルを入出力する関数を作っています。 現在Cのfopenやfreadなどを使っており、スコアデータはこのファイルのxx番目だからfseekで移動して読み込むといった形を取っています。 しかしこれだと、例えばDirectXのXファイルであればMeshNormalsの位置に移動して、必要な数だけ読み込むといった手段が取れません。 検索してもファイルの入出力の解説を扱っているサイト自体少なく、2行目の方法が中心で困っています。 どこか参考になるサイト、もしくは書籍はありませんでしょうか。 また、ExcelデータはC++で読み書き(データの追加・削除)はできるのでしょうか。 ファイルの入出力周りは私の持っている本ではほとんど書かれていませんでしたので放置していたのですが・・ここに来てツケがorz
156 :
151 本物 :2007/07/21(土) 20:57:49
自己解決しました #include <windows.h> #include <iostream> using namespace std; typedef HWND (__stdcall *FND)(const HWND ,LPCSTR , const DWORD ); typedef int (__stdcall *FNE)(const HWND , LPCSTR ,int ); main(){ char buf[128]; HINSTANCE hd = LoadLibrary("UNZIP32.DLL"); FND pd = (FND)GetProcAddress(hd,"UnZipOpenArchive"); FNE pe = (FNE)GetProcAddress(hd,"UnZipGetFileName"); FNE pf = (FNE)GetProcAddress(hd,"UnZipFindFirst"); HWND q=(*pd)((HWND)hd, "file.zip",0); (*pf)(q , "*", NULL); (*pe)(q , buf, 128); cout<<buf<<endl; FreeLibrary(hd); }
http://www3.uploader.jp/user/mol/images/mol_uljp00012.txt 11000111101111100011
っていう文字列が与えられた時に、1*2 0*3 1*4 ....
って簡易圧縮みたいなのをしたいわけです
で、文字列に 1と0以外のものが入ってた時に、とりあえずエラーを出したいんだけれど
char buff[1024];
scanf("%s",&buff);
for( n=0; buff[n] == '\0'; n++)
{
if ( buff[n] != '0' || buff[n] != '1' )
{
printf("Error!\n");
goto endline;
}
}
ここのifがうまく反応してくれません
初歩的なミスがあると思うのですが、よろしくお願いします
buff[n] == '\0'の条件を逆にしてみたら?
for( n=0; buff[n] != '\0'; n++)
ランレンクス圧縮?
161 :
151 :2007/07/21(土) 21:09:20
for( n=0; buff[n] != '\0'; n++) { if ( buff[n] != '0' && buff[n] != '1' )
buff[n] != '0' && buff[n] != '1'
>>155 Xファイルは知らないのでExcelだけ。
Excelのファイルは所詮ただのバイナリファイルなのだから、
C++で読み書きできないわけがない。
しかしWindows上ならプログラムからExcelを操作してやるのが楽。
データ形式を考える必要もなく、しかもオブジェクトという形で取り扱える。
ただ、その独特な仕組みに慣れる必要があるけど。
164 :
151 :2007/07/21(土) 21:14:11
CSVとかで出力してあとで変換すればいい
165 :
155 :2007/07/21(土) 21:48:55
レスありがとうございます。
ファイル操作関連の関数は先ほど上げたものぐらいしか知らなかったので、なんとか前進できそうです。
ツール周りをエクセルからデータを引っ張ってくるようにしようかと考えておりましたが
>>164 で書かれているように拡張子を変えてやれば配布するデータにも加えれそうですね。
バイナリデータである以上、独自に形式を変えない限りユーザ側で改変するのは容易ですしね。
(
>>158 ),
>>159 .
>>161 ,
>>162 サンクス!
for( n=0; buff[n] != '\0'; n++){
if ( buff[n] != '0' && buff[n] != '1' ){
printf("Error!\n");
goto endline;
}
こうだった
私には括弧がついてるよーww
169 :
166 :2007/07/21(土) 22:43:40
あ、そういうことですか。「逆」って||と&&の話かと んだば、かっこは解除させていただくの方針で
170 :
デフォルトの名無しさん :2007/07/21(土) 22:46:03
struct , typedef , class だとどれが一番いいとかありますか? 使わないですむやつありますか
なぜそこにtypedefが
173 :
デフォルトの名無しさん :2007/07/22(日) 03:03:23
同じように見えて確保するサイズが全然違いますね bitset<1> a[1024]; bitset<1024> b; cout<< sizeof(a)<<" "<<sizeof(b);
>>173 そりゃそうだろ。でもサイズ自体は実装依存。
175 :
デフォルトの名無しさん :2007/07/22(日) 04:45:28
配列を引数にして再帰すると駄目なんでしょうか?やってみていませんが int fnc(int a[10]){ a[]に対して処理をする fnc(a); };
何も問題ないが。 まあ、a はポインタだがな。
static charなポインタ変数って 0で初期化されているのですか?
されないから宣言時に0を代入するんだよ
staticな変数はゼロ初期化される。
>>179 が正解。
おっそろしく古い太古のコンパイラとか
規格に準拠してないコンパイラとかなら知らんがな!
constって時々目にするけど、どういう意味があるの?
お前ら入門書読んでから質問しろw
まだはじめたばっかだから、気にしないで!
>>182 かなり大雑把なくくりでいうと、その変数の値を変化させることができないということだ。
const int a = 10;
a = 5; /* NG */
const int a[10] = {0};
a[5] = 1; /* NG */
int b = 10;
const int *a; /* constはポインタが指す値にかかる */
a = &b; /* OK ポインタを変更しているだけ */
*a = 7 /* NG */
b = 7 /* OK コンパイラはaの性質とbの性質の区別ができない*/
int b = 10;
int c = 100;
int * const a = &b; /* constはポインタにかかる */
*a = 5; /* OK */
a = &c; /* NG */
int b = 10;
int c = 100;
const int * const a = &b;
*a = 5; /* NG */
a = &c; /* NG */
どっか間違ってたら訂正して
186 :
デフォルトの名無しさん :2007/07/22(日) 13:27:31
VC++2005っていまいくら位でGETできます?
static charなポインタ変数が 0で初期化されていることは分かりました。 これはメモリアドレスの0番地を指しているという理解で良いでしょうか。 また、この場合NULLとどこが違うのでしょうか? 自分はNULLはメモリアドレスの0番地を指していると理解していたのですが…
NULLの定義による
189 :
デフォルトの名無しさん :2007/07/22(日) 13:33:19
#define NULL 0 だから NULLって書いても0って書いても同じですよね それなのに0で初期化したほうがいいと推奨されているのは何故ですか?
>>186 Express Edition ならタダ
>>182 C++だと、関数にconstを付ける場合もある
いや、むしろ可能な限り積極的に付けて欲しい。
class Hoge {
public:
void foo_set(double d) { x = d; }
double foo_get() const { return x; }
private:
double x;
} hoge;
↑の例だと、void hoge.foo_set(double)関数は、メンバ変数 x を変える可能性がある。
同じクラス内のメンバ変数を変える可能性がある関数は、constにできない(コンパイルエラー)
double hoge.foo_get()関数は、xの中身を見るだけで、変更する可能性はゼロなので
constを **つけることができる**
**付けなくてもコンパイルエラーにはならない。**
つまり、自分(や、保守のコーダー)に縛りを課すという意味合いがある。
192 :
デフォルトの名無しさん :2007/07/22(日) 13:42:13
>>189 0で初期化していないと
そのポインタを使って何かをしてしまったときに
予期せぬ動作をしてしまうからじゃないの?
>>187 ポインタが 0 で初期化されるってのは、
ヌルポインタで初期化されるって意味だ。
static char* p;
は
static char* p = 0;
と同じってこと。
ポインタに 0 を代入するとヌルポインタとして扱われるから、
要するにヌルポインタで初期化されるということ。
>>189 NULLで初期化するなって書いてあった?
静的な変数がビット表現 0 の値ではなくヌルポインタで初期化されるというのは、 C++ ならこんな形で確認できる。 #include <iostream> using namespace std; int main() { class A; static int A::*p; static int A::*null = 0; cout << (int&)p << endl; cout << (int&)null << endl; } p と null はメンバ変数へのポインタってやつなんだが、 こいつのヌルポインタのビット表現は大抵の環境で 0 にはならない。 上のコードを実行すると、p と null とで 0 でない同じ値が出力されると思う。
なんだかよくわからないけど、 とにかくNULLは使わない方がいいというのは解りました ありがとうございます
なんだってー。 0 になる環境もあるのかー。
g++ なら -1 になる。
>>189 NULLは、C言語では
#define NULL (void *)0
と定義されていた。(今のCは定義を見たことがないから分からない)
つまり、このC言語処理系では0はint型。
int *a;
a = 0; /* コンパイルエラーまたはウォーニング */
a = NULL; /* OK */
一方、C++では、0は特別な値に昇格した。
C++では、0はint型と(void *)型の両方の性質を持った。
つまり
#define NULL 0
と定義されているが、これはかつて、C++がCの上位互換性的要素が高かったため
このように定義してないと移植時に不便であったという意味合いが強い。
int *a;
a = 0; // OK(推奨)
a = NULL; // OK(互換性のため。推奨されず)
C++がなぜそうなったかは私には分からないが、
「ifならカッコの中が0であればif文は実行されない。それ以外は実行される」
という定義のように、C++の構造化の文法に不都合が無かった(むしろ定義上都合がよい)ことや
(void *)0 が実用的に不便だったからかもしれない。
その辺はもっと詳しい人に
まあいいんじゃね。うそをうそと(ry
まず、C の時代から 0 はヌルポインタだ。 だというのに C で NULL を ((void*)0) と定義することが許されていたのは、 整数型へそのまま代入できてしまわないようにするためだ。 まあ警告止まりかもしれないが、ないよりゃマシだ。 何で C++ でその定義が許されなくなったかというと、 C では void ポインタから他のポインタへの暗黙のキャストが許されていたけど、 C++ ではそれを禁止するようになったからだ。 いちいち明示的なキャストが必要になるのでは困るので、 NULL は 0 と定義されるようになった。 そして、C でも C++ でも NULL が推奨されないなんて話は聞いたことがない。 ポインタを扱っているという目印になるわけで、プログラムを読みやすくする効果がある。 どんどん使えばいい。
注意する点があるとすれば、 NULL にキャストが必要になるっつー状況がないわけではないことだ。 例えば C++ で NULL を可変個引数に渡す時とか。 そのままだと int 型の 0 が渡されてしまう。 ヌルポインタのビット表現が 0 でない環境だけじゃなく、 ポインタ型のサイズが 64 ビットで int 型のサイズが 32 ビットなんて環境(普通の 64 ビット環境)でも問題になる。 C++ においては NULL は単にプログラムを読みやすくするためだけに使われるもので、 NULL と書いたから安心だ、と思ってはいけない。 そういう意味で NULL には危険性はあるのかもしれないけど、 NULL を使わないと可読性が大きく犠牲になるから NULL を使った方がマシ。
>>201 0は単なる整数リテラルだからint型と決まっている。処理系の都合なんかではない。
C++で特別になったわけでもない。
0がポインタ型に変換できて、ヌルポインタになるのはCのときから変わっていない。
int *p = (1 - 2 + 1); /* ヌルポインタ */
そもそも、規格でのNULLの定義は、C++の場合「処理系定義の空ポインタ定数」となっている。 つまり0である必要性はなく、例えばGCCでは#define NULL __nullとなっている。 __nullはポインタ型へは暗黙の変換が可能だが、整数型へ暗黙の変換を行うと警告になる独自拡張の定数。 あと、NULLではなく0でいいだろと言っているのはBjarne。 だからC++にはNULL使わない派もそれなりにいる。どれくらいいるのかは知らないけど。 少なくとも、俺もその内の1人。
>>209 NULL使わない人もいるのか。
if(str!=NULL){
iVal = str->iHoge;
}
とかって場合でも使わないの?
ASSERT(str!=NULL);
とかも使わないの?
つか、もう NULL をキーワードにしてくれ。
>>212 つnullptr in C++/CLI
俺は usertype.dat に NULL 入れてるよ
それ色が変わるだk(ry
もういい加減しょうもない議論やめろ
誰か議論なんてしてたっけ?
しかし久々にぬるぽ いんたーという言葉を聞いた気がする。
221 :
デフォルトの名無しさん :2007/07/22(日) 20:19:03
iteratorってポインタと同じようにアドレスを表すものですか?? 同じですか??
>>221 抽象度が違う。
アドレス < ポインタ < イテレータ
アドレスはポインタとして使えるし、ポインタはイテレータとして使える。
223 :
デフォルトの名無しさん :2007/07/22(日) 20:33:45
サンクス
224 :
デフォルトの名無しさん :2007/07/22(日) 20:41:34
同時に10個のファイルを開いて置くとして、新しいファイルに書き込む 必要が出てきたとき、もっとも使われていないものを閉じて、新しく開く というコードはどうやったらいいですかね???
225 :
デフォルトの名無しさん :2007/07/22(日) 20:53:16
1:日本赤十字に5万円振り込む 2:新潟中越沖地震の救援基金に5万円振り込む のどちらか
すっきりとは解せないけどなんとなく分かるw
227 :
224 :2007/07/22(日) 21:05:28
おねがいします 使われた順に、ファイル名とポインタを整列させようとしたんですけど・・ ファイルポインタがコピー出来ません・・・
>>205 前も誰か言ってたけど、0はCの頃から整数0ですよ。
必要なときにヌルポインタに暗黙のキャストされるだけですよ。
229 :
244 :2007/07/22(日) 21:14:15
コンパイラや、機種によって同時に開けるファイル数に制限があるため ひらっきっぱなしにするとエラーになってしまいます・・・ 互換性を保つため10個までにしたいのですが・・ いい方法ないですか??
230 :
デフォルトの名無しさん :2007/07/22(日) 21:26:42
class A{ A(); }; A::A(){ char *i = new char ; } int main(){ A a* = new A; delete a ; return 0 ; } こういった場合でもメモリは開放されるのでしょうか?
されない。 i が行方不明になってメモリリークが発生する。 これは静的に A のインスタンスを作っていたとしても変わらない。 A のデストラクタの中で delete を呼び出すべき。
232 :
230 :2007/07/22(日) 21:33:21
ありがとうございました。
233 :
デフォルトの名無しさん :2007/07/22(日) 21:33:47
現在時刻をミリ秒単位で取得する、移植性の高い方法ってありますか?
>>224 >ファイルポインタがコピー出来ません
詳しく書いてみ?
ない
>>228 0はCの頃からヌルポインタ定数ですよ。
0は0だろ
>>238 その言い方はおかしい。
0 を含めて整数の 0 と評価される定数式(C 限定で、それを void* にキャストしたもの含む)が
ヌルポインタ定数。ヌルポインタ定数はポインタとして使われた場合にヌルポインタに変換される。
pow(2,2) とかをコンパイル時に計算して、4をコードに埋め込んでしまうコンパイラも あるが、こういうのって定数式なのかしら?
少なくともCとC++の構文上は定数式ではない。
Cで正規表現などをもちいて文字列を置換したりするときに、 文字列を細切れにぶったぎって それを再び結合したりするわけですが しばしばその文字列はもとより長くなったりしますので マジメにやろうとするとメモリ管理だの何だのが とてもめんどうくさく、しかも適当にやると ヘタをするとPerlのほうが速かったりするかと思います 効率よく楽なほうほうは何かありますか ロープというデータ構造は結合が鬼のように早いと聞きますが ロープに対して使える正規表現ライブラリなど寡聞にして知りません え?C++を使え?実におっしゃるとおりですね
>>241 ありがとう
ということは、そのようなものがコンパイラの最適化によってゼロに
化ける場合は、ヌルポ定数とは扱われない
ということかしら
>>243 関数呼び出しは定数式に含まれないことになってる。
>>236 じゃあ、引数不定個の関数で、0がintとして渡されるのは
なんででしょうねえ。
printf("%d %d %s", 0, 0, 0)
64bit環境向けにコンパイルすると
全部intの0として扱われてることが明白ですよ。
何か変ですか?それともあなたが変ですか?
いつまでゴチャゴチャ言いあってんだよ。
またこの宗教論争やってんのかよwwww
規格に照らして正しさが確かめられるんなら、宗教論争とは言わんだろ。 マクロ NULL を使うべきかどうかってんなら間違いなく宗教論争だけど。
初心者の人、ちゃんとついてこれてます?
252 :
205 :2007/07/23(月) 03:55:59
>>228 が正しいんだからもう終わりにしようぜ。
俺も言い方が悪かった。
ヌルポインタを使ってメンバ関数を呼ぶとどうなるかは未定義と聞いたことがあります。 でも、規格票を読んでもこのことがどこに書いてあるのか見つかりません。 どこに書いてあるのかご存知の方はいますか?
未定義って意味知ってるか
ワラタ
規格票に全く書いてない事か、あるいは規格票に未定義と明記されている仕様の事。
居ないなら居ないと返事しろ
規格票読んだ事ないのか? 「〜は未定義である」って書いてあることもあるんだぞ?
規格票にちゃんと書いてるかもしれないってことだろ。
場所知らんもんよ。
居ないなら居ないと返事しろ
規格書を見てみたがたしかにヌルポインタの使用については見当たらないな。 一番関係ありそうなのが、3.8 オブジェクトの生存期間。 3節目の「この規格全体を通じて、オブジェクトの特性についての規定は、 生存期間中のオブジェクトに対してだけ適用される。」という一文を見付けたので精一杯。
今はこれが精一杯
266 :
デフォルトの名無しさん :2007/07/23(月) 18:44:02
日本語コードを判別して一行よみたいんですけど UTFがよめないです なぜか全角と機械語みたいなのが入ります どうすればいいんでしょうか 英数字のみのテキストなんですが
267 :
デフォルトの名無しさん :2007/07/23(月) 18:47:51
英数字のみでも、UTFとそうでないコードで、文字種が変化するでしょうか??
どんなデータをどんなソースで読んだんだ
UTFだけ書かれても、その後ろに数字が続いてるし、それが何種類もあるんだぜ
270 :
266 :2007/07/23(月) 18:58:11
271 :
266 :2007/07/23(月) 19:00:01
一行目の先頭に機械語みたいのが入っています・・・UTF16の特徴なんですか?
272 :
デフォルトの名無しさん :2007/07/23(月) 19:04:21
もしくは、ファイルの文字種を判別して、例えばシフトJISに変換する DLLやSTLなどありませんか???
274 :
デフォルトの名無しさん :2007/07/23(月) 19:08:05
ICUとか
WinでいいんならMultiByteToWideCharとか WTL使っていいんならCA2Wに渡すだけでおk
>>264 なるほど・・・。
ヌルポインタを使った場合はオブジェクトが存在しないから、
メンバ関数呼び出しに関する規定はヌルポインタを使った場合には適用されない・・・と。
確かにそう考えることもできそうな感じではありますね。
278 :
デフォルトの名無しさん :2007/07/23(月) 19:21:10
>>276 汎用性が良くなるため、MultiByteToWideCharでいきます
サンクス!
279 :
デフォルトの名無しさん :2007/07/23(月) 21:05:00
socketを使用してのUDP通信で 自分で定義した構造体を送受信したいのですが sendto()/recvfrom()関数はchar配列を送受信するための引数を持っています どうすればできるのでしょうか
280 :
デフォルトの名無しさん :2007/07/23(月) 21:06:29
socketを使用してのUDP通信で 自分で定義した構造体を送受信したいのですが sendto()/recvfrom()関数はchar配列を送受信するための引数を持っています どうすればできるのでしょうか
281 :
デフォルトの名無しさん :2007/07/23(月) 21:07:45
2連投稿すいません。エラーですorz
>>280 何でそういう質問をするのか、まずはっきりさせましょう。
キャストを使ってダメだったということ?
それとも(char *)型に直す方法が分からなかったってこと?つまり、キャストを知らなかったということ?
それとも(char *)に直せたけど、受け取り側で値が変になったということ?
285 :
デフォルトの名無しさん :2007/07/23(月) 23:26:11
キャストすることで送信することはできましたが、 受信するときに実行時にエラーがでます。 受信するとき、受信されたデータはchar[]に入るようになっています。 char recvdata[1024]; recvfrom(socket, recvdata, sizeof(recvdata), 0, ......); char*で宣言すると、実行時にエラーがでます。
>>285 送信してから受信するまでの間に領域が開放されたりしてない?
287 :
デフォルトの名無しさん :2007/07/23(月) 23:43:12
>>280 =285
まず、構造体のアライメントを調べたか?
送信側のマシン・・・アライメント4byte
struct X {
char a; // 1byte + 3byte(4byteになるよう調整)
long b; // 4byte
} x;
sizeof(x) = 8
受信側のマシン・・・アライメント2byte
struct X {
char a; // 1byte + 1byte
long b; // 4byte
} x;
sizeof(x) = 6
これでは受信側は混乱する。
(char *)で宣言するのは全く問題ない。malloc等でメモリを確保していれば。
>>287 >>288 が詳しそうなんでそっちにまかせた!
socketってのを使ったことがないんで憶測ですまん。
構造体をローカルのchar配列に入れてsendto呼んで、
送信関数終了時にchar配列が開放されて受信側があぼーん。
とかなのかな?って思ったんだが、sendtoの仕様次第じゃ問題ないな。
290 :
デフォルトの名無しさん :2007/07/24(火) 00:08:25
>>285 構造体の大きさは同じでした。
mallocしたことでエラーはでなくなりましたが、値が変わってしまいます。
struct Test{
int a;
char c;
};
で、aに0をいれて送信すると、受信後は3801416となってしまいます
291 :
デフォルトの名無しさん :2007/07/24(火) 00:20:47
sendto(SOCKET s, const char *buf, int len, int flags, const sockaddr *to, int tolen); で、第三引数にstrlen(data)を渡してたのが問題だったみたいです。 sizeof(Test)にしたら問題なく送信できました。 が、受信したあと、char*型に入ってる受信データをTest型の変数に代入できません。 dataがchar*型で、 ((Test*)data)->a とするとちゃんと値を得ることができます。 Test t = (Test)*data;とすると、charをTestに変換できないとエラーがでます。 Test *buf = (Test*)data; Test t = *buf; とすると、tの値が狂います
memcpyでいいんじゃまいか?
294 :
デフォルトの名無しさん :2007/07/24(火) 00:37:31
memcpyでできました!! ですが、もう一つ問題が浮かび上がってきました。 Test構造体の、aの値は狂わずに受信できてますが、cの値が変わってしまいます。 何を代入しても、送るとxになります。
295 :
デフォルトの名無しさん :2007/07/24(火) 00:39:12
cout << ((Test*)data)->c;で表示しても同じでした
まてまて、どんな構造体かくらい示してくれ。
297 :
デフォルトの名無しさん :2007/07/24(火) 00:43:05
>>296 >>290 でうpした
struct Test{
int a;
char c;
};
です
>>297 >288が居なくなってかなり心細いんだが、socket知ってる人いねぇの?w
構造体のアライメントが悪さしてるようにしか思えないんだけど、
それは大丈夫だったんだよね?
int a;
char c[4];
だったらどうなるの?
アーキテクチャやコンパイラの違いなどを考慮すると、基本的に ネットワークでの送受信に構造体を直接使うのは薦められないのだが、 それについては言わないことにする。 ・recvfrom()の第3引数(len)はsizeof(Test)になっているか? ・同じく、memcpy()の第3引数はsizeof(Test)になっているか? ちなみにmemcpy()は無駄だ。 Test test; recvfrom(s, (char*)&test, sizeof(test), 0, &addr, &addrlen); のような感じで良い。 char data[sizeof test]; に受け取った場合は、 Test *testp; testp = (Test*)data; でよい。
300 :
299 :2007/07/24(火) 01:18:28
すまん。 > testp = (Test*)data; アーキテクチャによってはバスエラーになるな。 char[]で受け取りたいなら、 union { data[sizeof(Test)]; Test test; } u; などとして、u.dataに受け取ってu.testを使うほうがよいだろう。 正確には規格準拠ではないが。 それを考えれば、やはりTest型で直接受けるほうがよい。
301 :
デフォルトの名無しさん :2007/07/24(火) 01:30:47
しょうもない質問で申し訳ないのですが、 スタックダンプって 「メモリのスタック領域に記憶された変数や関数のアドレスを 吐き出すことって」 であってます??
アドレス吐き出しても意味なくね?ってかmapファイルじゃん。 吐き出されるのはそのアドレスのデータじゃないのか?
303 :
デフォルトの名無しさん :2007/07/24(火) 01:49:27
>>302 ありがとうございました。えーと、吐き出されるのは
スタック領域のアドレス 呼ばれる関数名 呼ばれる関数のアドレス
てな感じですか?
>>303 スタックダンプって↓みたいなやつだよね?
0241fb0c 5d b6 a0 03 f0 62 75 02 - d0 e7 3d 0a 00 6e 40 00 ]....bu...=..n@.
0241fb1c 00 00 00 00 24 fb 41 02 - 2e bf 98 03 00 00 00 00 ....$.A.........
一般的にスタックに詰まれるのはローカル変数、関数の引数・戻り値、関数の戻りアドレスとかかな?
とはいえ、最適化されたら何がどういう順番で詰まれるかなんてアセンブラ見ないとわかんなくなるよ。
スタックダンプという言葉を使った人に聞いてくれよな。 Javaとかのstacktraceとはまた違いそうだし。 で、sendtoのバッファのアドレスをわざわざchar*にキャストしてるのは何なんだいったい。 void*を受け取るんだから、そのまま渡せよ。 memsetする時にmemset((char*)data, 0, sizeof(data))とかするバカいないだろ。
307 :
デフォルトの名無しさん :2007/07/24(火) 10:21:35
>>306 sendto(SOCKET, char*, int, ........)だよ sendtoはvoid*使わない
socketインタフェースってデザインが古いんだよな。 void*が適切に使われていないから、いたるところで (struct sockaddr*)とかやらないといけないし。
309 :
デフォルトの名無しさん :2007/07/24(火) 15:33:36
質問があります。 マイクロソフトのVS2003.NET C++なのです。 VS2005のC#では Debug.Print("debug"); というデバグ表示ができますが、これに相当するものはあるでしょうか? 知ってる方、ご教示願います。
OutputDebugString
>>309 >>310 のOutputDebugStringはAPIだからどこでも使えるけど
MFC使ってるならTRACEマクロが簡単。
312 :
309 :2007/07/24(火) 16:26:49
>>310-311 どうもありがとうございます。私とても助かたです。
MFCは使っていないためTRACEマクロは使用できませんでしたが、OutputDebugStringの
方は使うことができました。こちらを使用したいと思います。
OutputDebugString(_T("HOGE\n"));
外人さん?
グローバルと無名名前空間に同一の名前があるときそれらを識別する方法にはどういう手段がありますか? あるいは、 int foo; namespace { int foo; } のときグローバル、無名名前空間それぞれのfooを指定するために用いる構文が知りたいのです
>>312 MFC とは無関係な _RPT0, _RPT1,_RPT2,_RPT3,_RPT4 というマクロもありますよ。
>>314 ない。
そもそも、そんな同じ名前の変数をみだりに宣言するのはどうかと思う。
どうしても作りたいなら、も1つ名前空間作れ。
int foo;
namespace {
namespace Local {
int foo;
}
}
eclipse3.3の更新サイトでついてくるCDT,コンパイラはCygwin使っています。 \a(ビープ音)などのエスケープシーケンスを使ったとき、普通の動作をせず、 コンソールに□とだけ表示されるので、エスケープシーケンスを利用した プログラムが上手く作れずに困っています。(何故か\nは上手くいく ググったり、設定をいじくり回したり色々やってみたのですが、解決できません。 普通の動作をさせるようにできるんですか?もしできるなら教えてください。
318 :
デフォルトの名無しさん :2007/07/25(水) 00:32:11
string型をwchar_t に変換できませんか??
319 :
デフォルトの名無しさん :2007/07/25(水) 00:33:04
C++でこういうコードがあったんですが・・・・ class CDialog { public: CDialog(): hDlg(0) {} 最後のところがわかりません。コンストラクタ? なんで空メソッド?
hDlgを0で初期化してんじゃねえの
322 :
デフォルトの名無しさん :2007/07/25(水) 00:40:44
>>320 なるほど。hDlgってのはHWND型なんでそうかもしれません。
しかし、こんな記述法あるんですか?
>>322 あるよ。コンストラクタで入門サイトめぐってみては?
ところで、この書き方って一般的なの?俺は{}内に書くことが多いんだが。
effective c++まじオススメ
325 :
デフォルトの名無しさん :2007/07/25(水) 00:48:47
>>323 なるほど、コンストラクタ初期化子っていうんですね。初めて知りました。僕の見た限りでは初期化数はみんな( )内に書いてるようです。
>>323 極めて一般的に使われる。
HWND(基を辿ればポインタ型)のような組込型ではどうでもいいが、
クラスオブジェクトの場合、こうでしか
非静的メンバのコンストラクタを呼び出せないので大変重要。
327 :
デフォルトの名無しさん :2007/07/25(水) 00:52:43
すみません 全く出来ません tring型をwchar_t に変換する方法教えてください
329 :
デフォルトの名無しさん :2007/07/25(水) 01:14:51
あのexeファイルを実行するにはどうしたらいいんでしょうか
どのexeファイル?
CreateProcess() @Win32 fork(),exec() @Unix
>>326 スマン、いろいろ回ってみたがわからん部分が多々でてきたOTL
コンストラクタ初期化子を使う1つの理由としてデフォルトコンストラクタ以外を
使用してメンバ変数を初期化したい場合に必要ということでいいのかな?
あと、参照メンバ変数がコンストラクタ初期化子でしか初期化できないという
理由もよくわからんかった・・・まだまだ修行が足らんようです。
初期化後の参照変数へのoperator = は、 全部参照先へのオブジェクトコピーになるから、 初期化後に参照先を変えることはできないってこと
>>333 なるほど。
参照をポインタの延長として理解しようとするからダメなんだよな。
int *p = NULL;として初期化時は何も指していないポインタに後でアドレスを代入する
というのは参照では出来ない。
参照変数は宣言と同時に初期化する必要がある。
宣言時に初期化しなければいけない理由等が>333のとおり。
メンバ変数の場合は、その初期化にコンストラクタ初期化子を使用する。
というよりそこで初期化しなければならないし、そこでしか出来ない。
語弊があるかもしれんがこんな感じかな。
配列の初期化もやらせてくれるといいんだがなぁ…。
変数宣言時に array[8] = {0} は 初期化ができるのに array[2][4] = {0} とすると、怒られる 2次元以上の時に初期化しようとすると 怒られるのはどうしてですか?
>>334 参照に限らず、メンバ変数の初期化はコンストラクタ初期化子でしかできない。
これを理解するためにも、まともに C++ を使い続けるためにも初期化と代入の区別を
しっかり理解する必要がある。
代入エラー 的な文か 無効な演算子hoge だったかと思います gccで
>>339 それ、初期化じゃなくて代入してるんじゃね?
いやでも変数宣言時にそうしたら怒られてた気が・・・
>>341 こんどはちゃんとエラーメッセージもいっしょに持ってこようね。
>>336 array[2][4] = {{0}, {0}};
参照をいろんな感じで使ってみたんですが、よく分からないことがありました。 この場合 int i = 123; int &r = i; int &rr = r; rr = 456; std::cout << i; 自分が考えていた通りに「456」が表示されますが、以下のようにconstを付けると int i = 123; const int &r = i; int &rr = r; rr = 456; std::cout << i; 「123」が表示されます。 自分は int &rr = r; の行でエラーにでもなるのかなと思ってたんですが。 なぜ const を付けるか/付けないかだけで、このように変化するのか分かりません…
345 :
デフォルトの名無しさん :2007/07/25(水) 06:29:40
>>344 constは変更できないって意味だからでは
むしろrr=456でエラーがでそうだけど、
そんな後付け参照までフォローはしないのかな
346 :
344 :2007/07/25(水) 06:33:35
>>344 の結果はBCBです。
VC++とg++で試してみると、両者ともエラーになりました…
エラー内容は「int &rr = r; のところで const int & から int & にできない」という感じでした。
BCBだと
[C++ 警告] Unit1.cpp(12): W8028 'rr' を初期化するために一時変数を使用する
っていう警告が出ました。
BCBが特殊なのかな…
348 :
317 :2007/07/25(水) 08:59:52
あれから色々調べてみたんですが、特定のエスケープシーケンスの文字化けは CDTに限ったことでは無いようです(OSの問題かな?)まあ色々分かったので もうちょっと調べていこうと思います。cの問題では無かったですね;すみません。
だから BCB は腐ってるから使うなとあれほど・・・
const 参照を使うと const int& r = 1; といったことができるが、 この時はテンポラリオブジェクトが作られて、それへの参照が作られる。 昔は const なしでもこういうことができることがあった。 規格がまだ整理されてなかった時代だったからなのか、独自の拡張だったのかは知らんが。 ここではそれが起こってるんだろう。
質問です。 fopen_sってGCCみたいなVC以外の環境でも普及していて普通に使えるのでしょうか?
>>351 ぜんぜん普及してないです。VC++だけ。
だから GCC は終ってるから使うなとあれほど・・・
普及していないが、Open Watcomでも使える。 また、標準規格に盛り込まれれば、glibc辺りにも実装されるだろう。
今C言語勉強中なんですけど 本とかサイトとかで一人で勉強してもある程度身につくものでしょうか?
大多数の人は一人で勉強してます
357 :
デフォルトの名無しさん :2007/07/25(水) 14:24:38
double型をstirng型に変換する方法ありませんか?
358 :
デフォルトの名無しさん :2007/07/25(水) 14:29:55
double d; char c[100]; string s; sprintf(c,"%f",d); s=(string)c;
359 :
デフォルトの名無しさん :2007/07/25(水) 14:32:30
>>358 ありがとうございます。
やはりこの方法しか無いんですね。
itoa()みたいな便利なのあればいいなぁと思ってググったんですが
見つけられませんでした。
sprintfの方が数倍便利だと思うが
361 :
デフォルトの名無しさん :2007/07/25(水) 14:38:39
string dtos(double d){ char c[200];sprintf(c,"%f",d);return (string)c;} これを先頭へコピペして仕え
>>359 itoa()と違って小数点以下何桁、とか指定することが多いと予想されるからな
とりあえずお約束で つ std::stringstream つ boost::lexical_cast つ boost::format
error C2027: 認識できない型 'name::B' が使われています。 とのエラーで苦しんでいます。よろしければ助言お願いいたします。 ==B.h file========================================= #include A.h namespace name { class B { public: A_Base* const getA_Base() const { return m_a; } private: A_Base* m_a; }; } // name ================================================= ↓続く
==A.h file========================================= namespace name { class B; class A_Base { protected: B* const getB() const { return m_b; } private: B* m_b; }; class A_Deriv { public: void func() { getB()->getA_Base(); } }; } // name =================================================
A_Deriv::func()を実行すると error C2027: 認識できない型 'name::B' が使われています。 とのエラーが出てきてコンパイルできません。 どうか助言の方、よろしくお願いいたします。
A_Derivは class A_Deriv : public A_Base です、記述ミスですすみません。
>>364-368 A.h を頭から順に読んでいったコンパイラさんは、
メソッド B::getA_Base() の存在を知ることができない。
クラス定義の中で関数を定義すると、 クラス定義の直後に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 :2007/07/25(水) 16:17:52
>>369 >>370 早速の返答ありがとうございます。
かき方がとても悪かったです、A_Deriv::func()は実際はcppの方に実装してあります。
そして、A_Deriv::func()の実装したcppでのincludeをA.h B.hともにして通りました(A.hのみincludeしていた状態でした)
とてもバカなミスでした。お手数おかけしました。どうもありがとうございました!
>>353 どこのGCCの話をしてるんだ?
Win以外じゃ主流なんだが・・・
つまらん。もっと面白い突っ込みしろよ
質問なんですが、配列には最後の要素に必ずナル文字(\0)が 入らないといけないんですか?
文字列なら
>>375 ぬるぽ
文字じゃなければ別に\0入ってなくていい。
文字列だと文字の終わりがわからんから。
文字表示するとき、1個ずつ文字を調べて'\0'まで描画するみらいなルールがあるの
みらいなみらいなけーの
らめぇー
380 :
デフォルトの名無しさん :2007/07/26(木) 11:42:25
VC.NET2003で mkstemp() が使いたいのですが、どうしたらいいでしょうか?
>>380 それは諦めて、標準ライブラリ関数のtmpnamやtmpfileを使う。
探せばwin32版の実装も転がってるんじゃないのか
>>382 つCygwin
VC++で使えないだろうけどね。
エラーチェックが甘いけど、自作するならこんな感じかなぁ。 #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); }
printf("[国語]平均点 : %d\n", ave[i]); ここの%d
>>386 ・・・・・orz
すいませんホントありがとうございます・・・。自分ではなかなか気づかないものですね・・・。
>>387 普通のコンパイラなら警告を出してくれると思うのだが。
え?printfだぜ?
-- for (i=0; i<3; i++) { switch (i) { case 0 : printf("[国語]最高点 : %d\n", max[i]); -- 激しく間が抜けたコードだな。そこまでループに拘るなら文字列も動的に作ればいいものを。
>>389 え? 今時出せないコンパイラなんてあったの?
すまん、私が物を知らないらしい。
>>391 じゃあ、その出すコンパイラと出る例をあげてくれないか。
gcc -Wallで警告でるよ
gccはputsに置き換える件といい、余計なお世話が多いな。 この文字列が変数だったら検出できんのかね?
static char const * const subjs[] = {"国語", "数学", "英語",}; for (ic = 0; ic < sizeof(subjs) / sizeof(* subjs); ++i) { printf("[%s]最高点:%d\n", subjs[ic], ave[ic]); } とか? そこまで凝らなくても良さそうだが。 #でもそれならループにしなくてもって話になるか。
gccはprintf()を知っているから、警告を出すし、場合によっては puts()などに置換さえするが、gcc以外でそういうことをやる コンパイラを俺は知らないな。 昔はそういうのはlintのやる仕事ということになっていた。
>>394 iccも同じようなことしてきたよ。勿論変数なら検出できないだろうけど、フォーマット文字列を
動的生成する香具師もそうそういないから(いてもその場合どうせトリッキーだし)実質問題なかろう。
>>395 文字列のリストなら、最後に番兵のNULLをつけるほうが俺は好き。
そのほうがコードが綺麗になるしリンケージを超えてもおk。
なるほど、gccは出るんだね。 stringオブジェクトに%sも出るのかなー、試してみるか。
>>397 scanf()系だと、*の働きがprintf()と違うから、動的にフォーマット文字列を
生成したくなることは案外多い罠。
>>398 その場合、配列要素数に使えない。
>395の方法なら、double ave[sizeof(subjs) / sizeof(* subjs)]という使い方もできる。
つまり、教科数に依存するマジックナンバーを全廃できるわけで。
#そこまで凝らなくても云々
>>402 この例のような線形探索をするだけなら番兵で十分で、配列要素数は不要だし、
マジックナンバーも要らないって話でしょ
>>384 open()の第二引数が抜けてるし、テンポラリファイルをclos()しても削除されない
んじゃないか
>>402 sizeof subjs / sizeof *subjs - 1
って、リンケージの問題もあったのか。
グローバル変数のフラグが沢山あるんですが、 どうにか纏めたいんですがどう修正したらよいか迷ってます。 Singletonで状態を返すクラス作ろうかなとか思ったり 単に構造体に纏めようかなと思ったり。 みなさんはどうしてますか。
unsigned int とかの変数一つに詰め込んで、ビットシフトのマクロで取り出す
409 :
155 :2007/07/26(木) 22:38:49
C++でExcelが使えるかどうか質問していた者です。
なんとか辿り着いたのが
ttp://www.ujasiri.com/prglib/vc/excel/vc_excel.html このサイトなのですが、時間が無く、サンプルのエラー外しで一杯一杯orz
私はDirectXのゲームに対しての作成サポートツールや、ゲーム自体のデータをExcel(のデータ形式)からやり取りしようと考えております。
他の手段で解説しているサイトが見つからないのですが、ここのサイトに書かれていることで宜しいのでしょうか。
Excelを持っていない人がゲームをしても問題ないかとか、読み込みが非常に重いとか心配しています。
ExcelがインストールされていないPCだとCreateInstanceが失敗する。 少なくともそこのエラーチェックだけはきちんとしておけ。
412 :
155 :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
なぜエクセルにこだわるのかがわからない 動作が鈍くなるだろ
おかげで騒ぎまくったお ⊂⌒ヽ (⌒⊃ \ \ /⌒ヽ / / ⊂二二二( ^ω^)ニニ二⊃ \ \_∩_/ / ( (::)(::) ) ヽ_,*、_ノ ブーン /// ///
416 :
155 :2007/07/26(木) 23:34:05
>>413-414 パーツのステータス管理(耐久度とか説明文)をExcelを使えば編集がしやすいかと思って実装しようとしています。
なるほど、エクセルから独自形式へのコンバートをこちらでしてしまえば、
ユーザは独自形式を読み込むだけなのでExcelが無いと動かないような症状にはなりませんね。
>>416 その「編集」をするのはユーザなのか、お前さんなのか、プログラムなのか、どれだ
ユーザに編集させるんなら、Excelがインストールされているのが当然前提になる
自分なら、CSVなりTSVなりプログラムで扱いやすい形式でセーブしてやれば
いいだろ
読み込む仕事はずっと楽で高速だ
プログラムが内部的に扱うだけなら、バイナリでもいい
>>416 Excelからの読み込みようデータでテキスト(もしくはバイナリ)出力を
VBAで書いてもいいんじゃない?
セルの値をファイルに出力するくらいならVB未経験でも
ちょっと勉強すればできるようになると思うよ。
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をつけたいのです。
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乗」って式を書く場合どうすればいいですか?
ネタ回答で訂正レス入れる奴カッコワルイ
ワロタ
ウッサイ
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
ちょっと信じかけた俺、涙目ノシ
C++で大容量CSVファイル(1GBくらいのでっかいやつ)を読み込みたいのだが、 今はwhileでget使って1バイトずつ読み込んでるんだが、いかんせん時間がかかって仕方ない もっと高速にやる方法って何かあるかな? 初心者なりに考えてみたけれどさっぱり思いつかない・・・
1GBなんて素で読んでも時間かかると思うが、getって何かな? CSVならまず1行ずつ読んでみては。
>>432 csvなら1行ずつ読むだろ……常考
まさか読み込んだ結果も丸ごとオンメモリで保持してないよな。
メモリ量にも拠るが、場合によってはデータの持ち方の工夫も必要かもよ。
435 :
デフォルトの名無しさん :2007/07/27(金) 11:36:12
WindowsXP + BCB5 + FAT32です。 ファイルに実際には書き込むことなく、希望の長さのファイルを作る方法はないでしょうか。 chsizeは拡張部分を0で埋めます。 seekg + fwrite でできるかもと思いましたが、長さ0の書き込みでは ファイルが期待した長さになりません。
>>432 文字列処理の部分も疑ってかかるべきだが、IOの部分で言うと
移植性を捨ててmmap()やCreateFileMappingの類を使うのが一番速い。
C++の標準ライブラリだけでやるなら、
・istreamではなくstreambufを使う。1文字読む版のget()に対応するのは
sbumpc()だ。
・streambuf::pubsetbuf()であらかじめ巨大なバッファを設定する
ことで多少はマシになるだろう
>>434 CSVってカラム内改行がLFで行末はCRLFだろ
少なくともstd::getline()は役に立たないんじゃないか
>>435 CreateFile() -> SetFilePointer() -> SetEndOfFile()
で出来るはずだが、多分chsize()でも同じことをやっているはずで、
普通にやればゼロ埋めされると思う。
NTFSならいわゆるSparse Fileを作れた気もするがどうだったかな。
FAT32ではだめだろう。
質問です 最近勉強はじめたんですけど本やらサイトなど見ながらやってます で、プログラムの書き方なんですが int main(void) と void main() ってのがあるんですけどどう違うのでしょう? 一般的にどっちが使われてるのですか?
intのほう
>>436 csvファイルと聞いて、カラム内改行をサポートしたフォーマットを想定する香具師がどれだけいるだろうか。
普通は、1Row読めると考えていいんでない?
#大容量、速度優先と聞いた段階で1行=1Rowと想定した漏れ。
>>439 ありがとうございます
そっちでやってみます
でも結局意味は同じという事でしょうか?
>>441 つまり、セル内改行はCRLFだということか。
何だ、fgets()でいいじゃん。
>>443 行末がCRLFで
セル内改行はCR「または」LFだ。よく読めよ。
なるほど、MSExcelやOpenOfficeCalcではRFC勧告に則っていないファイルを出力しているわけだ。
#see TEXTDATA
それはそれとして、
>>445 CRやLFはDQUOTEで括らないといけないという記述はあるけど(see escaped)、
line breakがCRまたはLFだという記述はどこ?
>>444 そーゆうことですか
ありがとうございます
448 :
445 :2007/07/27(金) 12:55:53
>>446 このRFCは2005年に出来た新米だからな、MSのOffice従っているわけがないw
セル内改行については、解釈方法をRFCでは規定してないっぽいな。
単にCRだのLFだのを入れられるがその場合はクオートしろってだけ。
へー、Excelだとフィールド内での改行(そう言えばなんで「カラム内改行」なんだろw)はLFなんだ。 で、RFCでは「改行」は「CRLF」だと明記されている。 つまり、RFCを持ち出した御仁はRFCを「よく」読まずに偉そうな御託を並べてたわけね。ふーん。
450 :
デフォルトの名無しさん :2007/07/27(金) 12:57:33
451 :
445 :2007/07/27(金) 12:58:49
>>449 すまんね。その通りだ。良く読んでなかったのを認めよう。
で、std::getline()は役に立ちそうかい?
結論としては、csvと一言で言っても解釈がまちまちってことかい。まぁ、この業界じゃぁ在りがちだがね。 #しかし、「csvはRFCに則ってください」なんて言われた日には涙目だな、こりゃ。
\r\n これってなん文字?
>>422 インクルードパスのサーチルールとプロジェクトは関係ない。
a.hにinclude "b.h"と書かれているのなら、a.h(にとって)のカレントからb.hを探すことになる。
455 :
445 :2007/07/27(金) 13:05:12
>>452 RFCの規定だと、実質日本語は使えないからなw
ま、元の質問者の意図はどうだか良くわからんし、これ以上言っても無駄だな。
セル内改行は要らないというんなら、それでいいんだろうし。
わざわざ「一文字読み」をしている理由を、俺はセル内改行の問題のためだと
推定したっつーだけのこと。
>>453 Cのソース内で例えば"\r\n"と書けば2文字と解釈される。
#但し、ターミネート文字に注意。
テキストファイルに単純に書けば、4文字と解釈されるだろう。
>>455 >俺はセル内改行の問題のためだと推定したっつーだけのこと。
理解した。こちらも言い過ぎ失敬。
458 :
432 :2007/07/27(金) 13:19:51
なんか荒らしちゃったみたいで申し訳ない 1文字ずつってのは、これ課題なんだけどその際に「1文字ずつ読み込むように」って言われてたからなんだけれどその意図は聞いてないから答えられない・・・申し訳ない とりあえず言われた方法を一通りやってみます レス遅れてすまんかった、そしてありがとう
>>454 ""で指定した場合カレントのstdafx.hを使うみたいなので<>を使って解決しました。
ありがとうございました。
460 :
デフォルトの名無しさん :2007/07/27(金) 14:07:07
例外処理というのは結局エラーになりそうなところで エラー処理を書くってことだと思うんですけど 例外を使うのは単にエラー処理を用意するのと違って どういったメリットなどがありますか? 簡単なサンプルだけではいまいちよくわからなくて すっきりしません。
win32 apiの例外処理ならadvanced windows の例外処理の章をよむといいかも
エラーが発生したところで、どうしようもなく、ソフトを異常終了するしかない時に使う。 Cのmallocなどなら戻り値のチェックは絶対に忘れてはいけないし、忘れたらバグの元になり後々面倒になるが、C++のnewなどなら戻り値のチェックは不要。 例外がthrowされ、catchしなければ異常終了する。上の例で、メモリの確保ができなければ、ほとんどの場合継続動作できないからそれで十分。 逆にCのreadのような、ディスクの読み取りエラーのような時は普通使わない。
>>463 発生したところで異常終了するしかないなら、その場で
exit() なり abort() なりすればいいだろう。
細かい read() をいくつも組み合わせるようなプログラムのときは
例外使うと便利だよ。
いちいちexitやabort書くのも面倒だよ いっきにまとめてどっかーんなんて使い方ができるのも例外の魅力
466 :
デフォルトの名無しさん :2007/07/27(金) 14:51:36
すいません。C言語初心者なんんですが、プログラムの作り方がわかりません。 計算を繰り返すのですが、最初に数字を入れて次に、+、-、*、/、=を画面に出力 し、=が選ばれるまで計算を繰り返すプログラムです。=が選ばれれば、合計が出 てくるようにし、そしてまた次の計算をするようにしたいんです。どなたか教えて いただけませんか?
468 :
デフォルトの名無しさん :2007/07/27(金) 14:58:04
どのぐらいの数の変数を宣言したらいいのかわからないんです。
>>468 必要なだけ作ったらいいよ。まずは書いて動かせ。
470 :
デフォルトの名無しさん :2007/07/27(金) 15:01:18
ありがとうございます。 頑張ってやってみます。
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(+)などの次が全くわかりません。
つまり電卓みたいにしたいのか。 まずは数字を入れたらそれを表示するだけのものを繰り返すものでも作っては。
>>472 人に見せるときはなるべくコンパイルできるようにしとけよ。
で、 + とかが入力されたときの動作はスレ住人にはさっぱり
わからん。好きにしろ。それともエスパー募集か?
475 :
デフォルトの名無しさん :2007/07/27(金) 15:15:21
単純に一度だけ+、*などの計算をし、表示はできたのですが・・・。
最初の数値一個と + だけで何を計算するんだろうな?
478 :
デフォルトの名無しさん :2007/07/27(金) 15:24:53
+、-、*、/を選んだらまたscanfを使って=が入力されるまで計算したいんです。
>>478 まあそれは繰り返し(while 等)を覚えれば何とかなる。
計算のほうは仕様を明確にしてくれ。
>>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);}
>>463 read()が例外をスローしないのは、Cだからだ。
いまどきの例外機構をもった言語なら「ディスクの読み取りエラー」では
IOErrorのような例外がスローされるのが普通だ。
>エラーが発生したところで、どうしようもなく、ソフトを異常終了するしかない時に使う。
人に教えられるほど例外を理解していないぞ。
例外はエラーじゃないし、ソフトを異常終了するしかない時も正しくない 463の説明からすると、例外なんて使わずexit()すべきということになる まっ、知ったかに教えてやることなんてないけどな
最近のIVってなんなの〜?
>>463 >エラーが発生したところで、どうしようもなく、ソフトを異常終了するしかない時に使う。
俺が例外覚えたての頃の思考と同じだわ。
例外を有効に使えてない。
今はどういう思考?
低脳に、エラーが発生したところで、どうしようもなく、ソフトを異常終了するしかない時に使う。 と教える思考
を、俺が例外覚えたての頃の思考と同じだわ。 例外を有効に使えてない。と言う思考
エラーを考慮しなくていい中間の関数が便利だな 下の例外を上にまる投げ
int main(void) { for(int i=0;i<100;i++) { if(条件式) { // 何かの処理 // ※ここでbreak;するのとreturn 0;するので動作が同じ場合、 // どちらを使うべきでしょうか?サイズや速さに関係ありますか? } } return 0; }
>>489 サイズも速度も最適化が働けばそれほど気にするレベルじゃない。
俺個人はbreak派。別にreturnでもいいと思う。お好きなほうを
break; のが意味的にはいいんじゃないかな。 サイズとか速さとか、正直どうでもいいレベル。
492 :
489 :2007/07/28(土) 01:00:34
どうもありがとうございました。
気になるならアセンブリ出力させて比較すればいいじゃない
1度しか実行されないものでそんなこと気にしても・・・。
プリコンパイル済みヘッダーを設定したくて調べてやってみたんですが Debugの時は上手くできて、Releaseの時には大量のリンクエラーがでます 何故だかわかる方いらっしゃいますか? エラーメッセージはこんな感じです ↓ (なんだかよく解らない長い文字列)は***(ファイル名)で既に使用されています
デバッグとリリースで同じ設定にしてるか? フルビルドしてみたか?
>>495 ReleaseとDebugで設定が違うんじゃないかな。
VC++ならプロジェクトのプロパティで構成を変えればそれぞれの項目が変わってるか確認できるはず。
全ての構成にして空白になっているところがあれば怪しいと思われ、DebugとReleaseで違う項目だと空白になるから。
Debugでは指定しているファイル(ヘッダー)が無いReleaseでは無いとか初心者が陥る罠。
>>496 >>497 同じ設定というか、DebugもReleaseもプリコンパイル済みヘッダーの部分と
追加のインクルードディレクトリ、追加のライブラリの部分以外はいじってません(デフォルトのままです)
何か設定を変えなきゃいけないところがあるのでしょうか?
あと、こういう警告もたくさん出ていました↓
warning C4727: 同じタイムスタンプを伴う、**.pch と名前指定された PCH が ***.obj で見つかりました。最初の PCH を使用します。
>>495 です
プログラムの全体の最適化 の項目を「いいえ」にすると
違う警告が出るようになりましたが、エラーはなくなりました
他にも色々設定をいじってみます
>>496 さん
>>497 さん ありがとうございました
小野坂とかアナゴさんとかチワとかレナとか色々でてるな。 ところで今回のサザエさんはアナゴさん回なのにいつから始まるか分からない件
そうだな
アニメスレと間違えたぜ
503 :
名無しさん@そうだ選挙に行こう :2007/07/29(日) 05:40:09
Windowsのiniファイルなんだけども、 単に読み書きだけじゃなく、コメントとかも付けようとしたら、やっぱり自前?
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使って計算式までいかないようにしてるつもりなんですけど、 なぜエラーなのかわかりません。教えて下さらないでしょうか?
|| より && の方が優先順位が高いから if 文の中身は ( (o=='/'|| o=='%') && b=="0") って書かなきゃダメだと思われ。
506 :
504 :2007/07/29(日) 06:34:05
>>505 そちらも試したのですがだめなのです。
おそらくif乗り越えての計算で不正終了、てな気がするんですけど。
この条件式でどこが駄目なのかさっぱり・・・。
んではこれで。 ( (o=='/'|| o=='%') && b==0)
マテ。bはintだろ。b=="0"ってのはおかしいだろ。コピペミス? ちょいソース全部貼ってみて(長いようなら、うpロダに上げて)
文字列定数と比較してるせいだと思うけど。
510 :
504 :2007/07/29(日) 06:47:44
>>507 うおっ!できました!
intをダブルクオーテーションで囲んでたのがミスだったのですか
ありがとうございます!
>>508 a,b,xはintで
oはcharにしてました。
intは「”」
不要だったんですね迂闊でした。
>>509 charとの比較ですかね?
とりあえず
>>508 で解決しました!
"0"との比較だよカス
コンパイラエラー吐かないの?
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; }
こう? typedef int (*func)(void); func* get_num(void){ static func num[] = {zero, one, two}; return &num[0]; }
&num[0] なんてしなくても num でいいんじゃないの?
>>516 そうですね、使うときに0を指定する形で。
いや先頭のアドレスを渡すだけでいいってことじゃないのか?
上記のプログラムだと &num[0] = num なので、出来る限りシンプルなコードにするために後者にしたほうがいいとは思う
等号なのか代入なのか一瞬迷った 可読性で前者を選ぶのも別にいいんじゃない? 先頭のアドレス渡してるってのがわかりやすいし。
C言語でソートプログラムを配列・連結リストを使って作りました。 それぞれの利点は何でしょうか? リスト版はかなり遅く、配列版のほうがかなり高速だと思うのですが。 ソートプログラムをリストで作る理由は何がありますか?
>ソートプログラムをリストで作る理由は何がありますか? 勉強だから
リストは動的にできる
すいません VC++で コマンドライン引数を加えて実行したいのですが どうやればいいのでしょうか? 具体的には -o 読み込みたいファイル名.c みたいな感じです F5を押して、-o 〜 をいれて実行するといったことをしたいのです
スレ違いだが、プロジェクト→プロパティ→構成プロパティ→デバッグ
ここですか ありがとうございまする
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
相手側の負荷の少ないのは、 多めに要求して受信した方がいいんでしょうか? 結局、取れるサイズは返却されますから・・・回数が少ない方が負荷が少ないような気がします
>>528 ちょwwwおまwwww
strlenてw
sizeof(buf)だろ。
531 :
527 :2007/07/30(月) 00:03:44
>>530 ちょwwwおまwwww
sizeof(buf)てw
何がいけないの?
strlenじゃ何文字かは分かるが、大きさは分からないだろ
buf[0]が\0だったら永遠に受信終わらないんじゃない?
c言語入門の本を見ながら学習しているのですがいまいちプログラムという実感がわきません ベクターとかにあるアプリなどはc言語で作ったり出来るのでしょうか
Cじゃちょっときついもんもあるだろうな。 ゲームとか希望してるなら別言語いったほうが早いと思う。
プログラム大きくなってくるとCだと面倒だろうね。 クラスが使えるって点だけでもC++は偉大だと思う
>>534 はCよりも先にHSPなりsystem4.0なりを勉強した方がいい気がする。
んで不足が出たらC++なりVisual C++なりに行けばいいんじゃない?
(笑)
回答ありがとうございます。 パソコンが好きで自分でいろいろなプログラムを作ってみたいと想い移植性が高いということでc言語を選んだんです 多少かじった程度の者が言うのも申し訳ありませんが c言語を始めたのでまずc言語を満足に出来ると思えるようになった別の言語にも挑戦したいと思います。 プログラムによってこの言語が向いているというのはやっぱりあるのでしょうか? 長文すいません
はじめがHSPじゃ応用が利かなそう。。 素BASICからプログラムに入った漏れは結構苦労したし。 将来的なこと考えて無理してでもC++薦めたい
移植性!?
実感がわかないってのはすんなり理解できてないからだろきっと なでしこにでもしておきなさい
>>539 Cが移植性が高いっつーのは、あくまでマシン語やアセンブリ言語に比べてのことだ。
後は、強いて言えば組込やメインフレームを含む大概の環境をターゲットとする
Cコンパイラ(クロスを含む)が存在するのも確かだが、本当にそういう環境で
プログラムを動かしたいのか?
WindowsやUnixやMacのようなメジャーな環境をターゲットとして
ポータブルなプログラムを書きたいのなら、Cよりずっと適した言語が
たくさんあるし、何しろCは何をやるにも面倒くさすぎて、やりたいことが
出来るようになるまでの道のりが遠い。
C++ならCよりずっと言語的に強力だがお世辞にも初心者向けとは
言いがたいので、とりあえず最初のうちはもっと手軽な言語を薦める。
C言語から始めてC言語の限界を知って C++に移行すると幸せになれるかも STLのおかげで連想配列も使えるようになるとかイイ! classのおかげでいろんなものをラップできるとかイイ! と思えるようになる
移植性を重視するならJavaがいいんじゃない メジャーだし
>WindowsやUnixやMacのようなメジャーな環境をターゲットとして >ポータブルなプログラムを書きたいのなら、Cよりずっと適した言語が >たくさんあるし、 例えば何?
仕事でやってるとJavaに将来性を感じないな。 最近はC#に乗っ取られとるし 組込みではまたC/C++が主流になってきとる
インタープリタなRubyから入るってのもいいかも。 書く量も少なくてすむし。 ただRubyから入ると他の言語がめんどくさく感じて移れない可能性はあるが。
俺は最初Delphiを数年 その後C/C++に進んだけど、ポインタもクラスもすんなり理解できた
Javaってメジャーなの?そりゃもっとマイナーなものがあるけどさ。
>>546 PerlでもJavaでもPythonでも、言語側でシステムを抽象化する層を設けていて
標準的なライブラリがリッチなものなら、何でもいい。
C++に手を出すのはそれらに不満を覚えてからでも遅くは無い。
そして、Cに手を出す必要は、多分無いだろう。
>>550 Delphiは応用きくでそ。ポインタももともとあったし
ベクターにあるようなアプリを作りたいなら、DelphiかC#だな C++から始めると挫折しそう
Delphiに手を出すにはちょい時期が遅いかも
DelphiはVBに乗っ取られました
じゃあVCL使ってBCBは?
>>550 Delphi良いんだけど
関連書籍が手に入りにくくて苦労した
BCBは情報無さ杉www
実際プログラムを作っている方々は複数の言語を熟知しているのでしょうか。
熟知する必要なんかないでしょ わからなければ調べりゃいいだけだし
>>561 何をもって熟知と言うかによるが、コンパイラが書けるぐらいに複数の
言語に熟知してる人なんてそうはいないと思われ
まあ必要があれば仕様にあたればいいんだけどね
>>561 熟知はしてないなぁ。ほとんど応用。
C++をBCBで覚えたから必然的にDelphi覚えて
VBはDelphiの応用でいけて
CGIもやりはじめたからPerlも覚えて、応用でPHPとか。
ベクターにあるアプリと言ってるあたりCUIは無いだろうから 言語は決まったとしても移植性を尊重するならGUIが問題だな Win32以外のGUIツールキットは資料が少な目で入門は大変そう
> ベクターにあるアプリ ああそういうの書きたいっつってんのか 移植性とは相反する要求だなw 両方追い求めると無駄に苦労するぞ
GUIだと Delphi、VB、BCB、VC++とかかなぁ Delphi →滅びる寸前 VB →便利だけどランタイム必須 BCB →滅びてる?初心者向けな情報皆無 VC++ →GUIアプリ作るにはとっつきにくい
こんなことが出来るアプリを作りたいっていう具体的な目標が無いと 覚えるのは難しそう
GUIで移植性も考えるならwxWidgets使うとかすれば
電卓とかそういうのでいいならMFCが楽? んでもゲームとか言われるときついよなぁ。
VBも.NET以外は絶滅だろ .NETなら言語はどれでも大差は無いが、やはりランタイムは必須
テキスト形式のアドベンテャーでいいよもう
パズルとかな 3Dでゴリゴリとか言わなきゃ良い
Delphiもエディタが使いやすければ、ほんとあれで十分なんだけどね。。
better C として使うだけでも C++ にする価値はあると思う。
>>575 Cの気色悪いシンタクスで書かれた宣言がスラスラ読めるぐらいでないと
C++はキツいだろう
まぁVC++だろうね。情報もいっぱいあるから つまづいてもだれか教えてくれるし。
難しいんだろうなっていう先入観が無ければどんなもんでもいけるよ多分
参照があるだけで随分分かりやすくなると思うが。
C++はそろそろboostが標準になるだろうから使いやすくなるはず。
0x はいつから使えるようになるんじゃー
今ひどい釣られ方を見た。
EffectiveC++に「std::tr1::shared_ptrはイイヨ〜」と書いてあったんだが、 何をincludeすればいいんだぜ?
>>581 いや、そうじゃないとC++のヘッダ読んでも意味不明だろ?
もっと奇怪なものが大量に増えているし、C++はそもそも宣言的な言語だ。
宣言が理解できないようでは話にならん。
Cの関数ポインタとか多重ポインタとか配列がらみの宣言程度が
分からないようじゃ、ダメだろう。
>>583 C++ の次期ドラフトとか見ると、色々導入されてるね。
boost はそもそも将来標準に組み込まれることを前提として開発されてるものだからな。
>>586 better C として使う分には、C++ は C より簡単。
それを越えると厄介な所が出てくるが。
そもそも将来標準に組み込まれることを前提として開発されてるものでいったいいくつ消えていったのか
>>589 いわゆる叩き台ってやつだな。
その中で入れた方が良さそうなものを入れていく感じだ。
>>588 better Cってのをどの程度に言ってるか分からんが、
ヘッダやマニュアル理解できないんじゃ、つらいだろ
Cヘッダだけしか使わないとか?
でも、std::basic_string<>やSTLすら使わないんじゃC++の魅力は
半減どころじゃないんじゃないか
>>586 ポインタ関係は教科書にも載ってるからまだしもだが
確かに、テンプレート、マクロの類は慣れるまで大変だったな
参照の用途としてポインタを使う方法を教えるよりは 参照を教える方がナンボか楽だな。
>>591 クラスとオーバーロードだけでもかなり書きやすくなるんじゃね?
STL無しのC++が魅力半減ってとこは同意だけど。
>>593 俺は別段Cを推奨する気は毛頭無いが、言語自体はシンプルだろ。
要素が絶対的に少ないんだから。結局はマクロ、関数、構造体、配列、
ポインタ、といったもので何でもやってしまうのがCで、欠点は
あまりに言語が貧弱なので、何をするにも面倒くさいというだけだ。
C++は言語がずっと強力だが、その分複雑だ。
俺はどっちも初心者に薦める気にはならん。
>>594 C++の参照は単に関数での「参照渡し」だけじゃないからなあ。
参照やポインタを教えるには、結局は間接参照、左辺値、エイリアシングといった
ことについて教えることになる。ポインタには演算もあるが、些細なことだ。
ほとんど違いは無いと思うが。
>>595 演算子オーバーロードはコードを書きやすくするが読みにくくする。
>>597 better C として使うなら、参照渡しだけ分かっとけば十分。
それ以上は不要。
あと、演算子オーバーロードの事なんて誰も言ってないように思えるが。
>>598 いや、あんたの言う「better C」とやらが、つまり何なのか分からんからなw
better C というと、 C でややこしい所を解決するためにだけ C++ の機能を使う、 という程度のこと。
で、リファレンス渡し以外には何が増えるんだ? クラスは使ってもいいの?
newしないでクラス使えば間接参照もしなくていいしw
C99 は今は考えないとして・・・ ・ 関数のオーバーロード ・ プロトタイプ宣言なくても関数使えちゃうのを阻止 ・ main で return 0; 省略 とか? まあ、そんなに色々使わなくてもいいんだよ。 C より便利になる点が 1 つでもあれば。
ああ、そうだ。こいつらもだな。 ・ 変数をブロックの途中で宣言 ・ for(int i = 0; ... ・ 初期化に関するいくつかの制限緩和
それそんなに便利かなぁ。 そこまで制限してC++使おうと思ったこと無いからよくわからんが……。 Cプログラマが初見で本気で便利だと思うのって、標準ライブラリの強力さ、 それとクラス、特にデストラクタの存在じゃないか? 自動で後片付けしてくれるなんて、夢のような環境だろ。 逆に言うと、その辺が使えないんなら、ゴミのような違いでしかないように 思える。
別に C プログラマに教えるという話じゃなくて、 プログラミング初心者に薦めるならという話の流れだったはずだが。
>>605 そもそも初心者なんだから
制限して使うっていうのはちょっと違う
むしろ C にある無駄な制限を取っ払うわけで
質問1つでここまで伸びるなんて久々に見た
ほとんど俺の自演だけどな
>>605 そこまでいくとBetter Cではなく、もうC++。
>>609 馬鹿が「なんか自分が賢くなったような気分」で気軽に参加できる
絶妙なレベルだったんだろう。
ReadFile() vs fopen()
CreateFile()の間違いじゃないのか
なんにせよ適材適所、時と場合によって使い分けるだけ。 fopen テキストモードを使いたい。ANSI C上の移植性が欲しい。 CreateFile 非同期読み書きやメモリマップドファイルを使いたい。
このコードが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; }
nはいくつよ?
619 :
616 :2007/07/31(火) 16:20:12
ちなみにこれとほぼ同じコードがboost::xpressiveで正規表現を コンパイルする際に使われているのですが、 これがSEGVになるお陰でワイド文字でboost::xpressiveが使えないという有様です。
ワイド文字は色んなコンパイラでサポート不完全だよな。
621 :
616 :2007/07/31(火) 16:37:03
>>620 VC8.0はグローバルロケールを設定した際に標準出力が腐るのは知ってたんだけど……
(Cではグローバルなロケールしかないので回避方法も無い)
これは酷すぎる。と思った。サポート不備ではなく、ただのバグでしょう。
無論VS2003では何の問題も起きないコードです。数値として読み込めないものが
入っているから、intに読み込めずstreamの状態がfailになるのが正しいんですが。
>>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 :2007/07/31(火) 16:48:25
>>622 ウホットンクスです。
とりあえずヘッダ修正してみた。
_Byte[]が2byteでいいのは「MS Windowsだからそう仮定して良い」てことですね。
しかしひでーバグだ。
修正したヘッダのコードなら正常に動くことを確認しました。感謝。
が、コンパイルオプションによっては、MSVCP80.DLLに入ってる特殊化バージョンが
リンクされてしまい、やはりバグってしまいますね。
勘弁して欲しい。
勘弁して欲しいのはお前の方だ
625 :
616 :2007/07/31(火) 16:54:11
>>624 あ、もしかしてこれって有名なバグだったんですか?
それは失礼。
VS 2005 で↓が警告最大でも普通にビルドでき、しかも、デストラクタで 実行時エラーになるのは既知の不具合ですか? #include <memory> int main() { std::auto_ptr<int> i = new int(1); } g++ だと型の不一致できっちりコンパイルエラーになります。
確かにコンパイルできたけど、実行時エラーにはならなかったよ。
>>622 調べてみたらVS2003でも同じコードだった
すげー萎えた
おっきした
>>627 むむ。new int(10) でもエラーにならないですか?
631 :
627 :2007/07/31(火) 23:08:21
それでもエラーにならなかったよ。 Visual C++ 2005 EE (SP1) ところで、.NET 2003 (SP1)では コンストラクタがexplicitと宣言されているからと言って、C2440のエラーになる。
規格では explicit になってるから、
>>626 はエラーじゃないとマズいな。
ビルドできるって、VS 2005 の memory の中身はどないなっとるんじゃ。
ひ・み・つ♪
634 :
デフォルトの名無しさん :2007/08/01(水) 00:06:07
ソース解析中分からないところがあり質問させてください。 #define A_NUM (20000) class A : public B{ private: static C < (unsigned long) A_NUM > list; C++勉強し始めて日が浅くて申し訳ないのですが、上記ソースの一番下の行は どういうことをしているのでしょうか?
C というクラステンプレートのテンプレート引数に A_NUM を指定して、 そのオブジェクト list を宣言
>>635 さんくす。
クラステンプレートがよく分かってなかったので、
その箇所を詳しく調べることにします。
初心者的質問ですが、お願いします int *x[3]; x[0]=(int *)malloc(3); x[1]=(int *)malloc(4); x[2]=(int *)malloc(5); free(x); 上記のようにポインタの配列に各個mallocして、最後にfreeをすると エラー(コンパイルは通る)がでてしまいます。
>>637 free(x[0]);
free(x[1]);
free(x[2]);
639 :
637 :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]);
>>639 x[0]=(int *)malloc(3*sizeof(int));
x[1]=(int *)malloc(4*sizeof(int));
x[2]=(int *)malloc(5*sizeof(int));
641 :
637 :2007/08/01(水) 02:26:02
>>640 おお、上手く通りました。
ありがとう&&多謝
質問です クラスを継承させて使うときに基底クラスのprivateなメンバ変数を publicではなく、privateの状態のまま継承させることはできないでしょうか?
意味がよく分からん。 基底クラスの private 変数は派生クラスから見ても private じゃねーの?
てか、派生クラスから見えないし。
派生クラスで使いたいならprotectedにするだろうしねぇ……
>>642 >>645 の言うように派生クラスから基底クラスのprivate変数に
アクセスしたいって意味なら基底クラスを変更するしかないな。
他の選択肢はpublic、アクセッサの追加、friendとかかね
VC++ 2005 Expressを使用しています。 Windowsのデスクトップ上のアイコンをデスクトップ設定の自動整列以外で移動するにはどうしたらいいでしょうか 例えば全体的に右にあるアイコン群を左によせたり上にあるのを下に〜等 よろしくお願いします
あとは、、、SysListView32 デスクトップ アイコン 移動 でググるとか
>>631 今日会社の VS2005 PE に SP1 を当てたけど、デバッグビルドで実行
すると、operator delete で落ちます。何が違うのかしら。
>>632 memory はたぶん問題なくて、最適化がからんでそうです。代入文が、
std::auto_ptr<int> i(std::auto_ptr_ref);
に変形していて、デストラクタで int の値を解放しにいって落ちると。
もぎゃー
もぎゃーってなに?
なんかはやらそうと狙ってる予感。
void型って、どんな型にも切れるただのメモリアドレスって考えれば良いのですか?
void型なんて変数は存在せんぞ。 void *型ならあるが。
std::auto_ptrみたいな不良品つかわずにboost::scoped_ptr使えばいいのに
657 :
656 :2007/08/02(木) 07:46:01
あ、2^0です。
mainのkが未使用変数の使用であるとかって警告でなかった? エスパーすると、divideのkがmainのkに影響を及ぼすことはないよ。
おっと、未使用変数->未初期化変数、または、値の割り当てられていない変数
660 :
656 :2007/08/02(木) 08:13:08
>>658 はい、警告とかは出てないんですよ・・・。
どこをどう直せばいいでしょうか。
ヒント:ポインタ アドレス渡し
まずはコンパイラの警告レベルを最大にすることだな。 VC++なら/W4 bccなら-w gccなら-Wall
663 :
656 :2007/08/02(木) 08:56:45
>>662 おお!そんなことができるのですね。ありがとうございます。
警告 W8013 test.c 26: 's' は、おそらく値が代入される前に使われている(関数 divide)
と出ました。どういう意味でしょうか・・・。
664 :
656 :2007/08/02(木) 09:12:45
>>661 ありがとうございます。kのアドレスをdevideに引き渡せばいいのですね。
そこは修正したのですが、まだダメみたいです・・・・。
void* と char* のビット表現は等しいんだっけ?
int s; *k = 0; while (no>0) { count[*k] = analyze(no, s); ←初期化されてないsが使われてる no -= (1<<count[(*k)++]); }
667 :
656 :2007/08/02(木) 09:53:38
すいません、できました。 divide関数内で *k++とかいう変なことをしてたみたいで・・・ *k += 1; と書き換えたらできました。 ありがとうございます。
668 :
656 :2007/08/02(木) 09:55:16
>>666 ああなるほど、ポインタは括弧をつければよかったんですね・・・orz
sは初期化されてないからですか・・・わかりました、ありがとうございます。
>>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 :2007/08/02(木) 10:03:24
というか、sを戻り値として返すなら、divide関数でsはいらないですね・・・。 アホだ・・・orz
Wallにしたら標準ライブラリでさえゴルァされるから使い物にならんと思うんだけど
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 (←勿論通りません><) みたいにできたらめちゃ便利だと思うんですが
typeof は提案されたこともあるみたいだけどねえ。 いまんとこはできないね。 そういう場合は typedef しとくというくらいしか言えんなあ。 std::vector<int> v_t; v_t v; v_t::size_type i;
typedef が抜けてた。まあいいや。
><;
<>;
×;
◇;
チョー!
BASIC スレにでも迷い込んだのかと思った
CLS
すいません。 void *型ってどんな型にも切れるただのメモリアドレスって考えれば良いのですか?
お前別スレで質問してきちんとした回答貰ってるだろうが 礼儀知らずにも程がある
ええ〜、してないですYo!
死ね
一方的に決めつけられて、死ねといわれる始末。 なんという仕打ち。
「切れる」っていうのが、なんかアクロバティックな用法だなあ。 こう、「アタシは侍ザマス!」みたいな? 「void*型からunsigned long(*)(bstr_t const&, IDispatch**)型に斬ってしんぜるナリ!」みたいな?
>>687 同じ文体なんだから別人なら普通変えるだろ。バカかよ
不毛
><;
構造体のサイズを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で明らかに計算方法が違うのはなぜなんでしょうか?
「パティング 構造体」でググると幸せになれるよ
パディングじゃね?
そして、なぜパディングが入るかというと、境界調整のため。
703 :
デフォルトの名無しさん :2007/08/02(木) 19:50:02
すいません、おじゃまします。 コンストラクター、デストラクターからstaticのメンバー変数にアクセするにはどのように記述したらよいでしょうか。
静的メンバからのアクセスは制限あるけど 逆は問題ないよね?
うん
fstreamが遅いんですが何とかなりませんか。 wfstreamともなるとアホみたいに遅いです。
端末変えろ
fstream捨てたら。
>>711 端末を変えるとfstreamが速くなるのですか?
>>712 機能的にはstdioより好ましいですし標準ですから、出来れば使いたいのですが。
wfstreamとgetline()を使って書かれた単にコピーするだけのC++プログラムが、
perlだのpythonだので書かれた、正規表現を用いてちょっと文字列を置換する
スクリプトよりも遅いので、呆れます(後者でもちゃんとエンコード変換を
行っているのにです)
>>713 アタリマエだろ。
単にコピーするだけにgetlineを使うお前が悪い。
単にコピーするなら read して write だろう・・・。
その処理にgetlineを使おうとする発想にまず驚いた
>>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のコードの一部なんですが関係ありませんでしょうか。
変数の実体作ってないんでしょ。
>>717 perlとかはIO関連はC/C++の標準関数は使わずに独自にコントロールしてるんじゃなかったっけ?
PerlのIOはPerl向けにチューニングしてるからこそそうなるんであって、
何にもしない素でもC++なら速いと思ってるなら幻想だろう。
構造的な美しさをとるか泥臭くても速度をとるかでケースバイケースじゃないかなぁ。
なかなか興味深い結果だな。
ちょっと話題がそれるが、C++でファイルのコピーだけならこんなカンジでいいんじゃね? std::ofstream("out.bin", std::ios::binary) << std::ifstream("in.bin", std::ios::binary).rdbuf() ;
OSネイティブの入出力APIを使うストリームバッファを自分で書いたりしてみたらどう?
724 :
710 :2007/08/02(木) 22:29:02
↓実験に使ったソースです
http://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 :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 :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 :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 :2007/08/02(木) 22:52:11
>>730 日本語を含む正規表現での置換処理ですので、wchar_tに変換しています。
置換を3段階行っているのは、もっと効率化できるかもしれませんが、
どの言語でもやっていることは同じです。
C++だけ特に遅くなるような書き方をしているつもりはありません。
C++のlocale周りを理解している人間なんて本当に少ない。おれもよくわかんないし。
それはぐぐっても日本語英語問わず資料が少ないことからも想像が付く。
そして処理系の実装はバグ持ちで遅く、ますます誰も使わず、負の悪循環。
>>730 その処理を全部省いたとしても、ワイド文字ストリームという砦が待ち構えている。
733 :
デフォルトの名無しさん :2007/08/02(木) 22:53:54
>>731 正規表現使わずに、例えばchar c[1000]; に読み込んで
if ( c[i]=='<' && c[i+1]=='<' ) とやった方が速いだろ
>>733 他言語との比較でそんな抜け道はだめだろ。
735 :
デフォルトの名無しさん :2007/08/02(木) 22:59:27
速く変換したいという目的なんでしょ?そのためにどれが速いか検討していると 普通に考えると正規表現使わず<<だけ見つけた方が速いだろって事だ
wchar_t なんかに変換する必要ないじゃん。 その文字コードに合わせて処理すればいいだけ。
737 :
710 :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;
C++ならなんでも速いというのは幻想。 速くなるようにチューニングする余地が用意されているというだけで、 素のままで速いとは限らない。正に今回はその好例。
文字コードが何かもわからないのに
>>733 はないだろ
UCS-2だったらどうする
740 :
デフォルトの名無しさん :2007/08/02(木) 23:04:37
どのコードでも、《》の配置は換わらないのでは???
>>735 普通の考えなんか価値なす。
大事なのは現実の速度。
742 :
710 :2007/08/02(木) 23:07:40
>>740 漢字《ふりがな》
といったパターンを捕まえて、変換しなければなりませんので、
文字クラスにUnicodeが使えると便利なのです。
それに、「全ての言語で」Unicodeの正規表現を使っています。
C++だけわざわざそうしているわけではありません。
>>735 他の言語でも同じことやったら、またC++より速くなったりしてw
744 :
735 :2007/08/02(木) 23:09:59
>>710 、ちょっとまってて いま書くから
もとのファイル354Kしかないから100倍 (35M) に増やして比較しようぜ!
そしたら速度差は歴然になるからさ
思わずどっちの方向に歴然とした差が生まれるのかwって言いたくなる。
ソース見てなかった 》携帯からのtypoかと思ってた
じゃあ俺はHSPで書く!!
748 :
735 :2007/08/02(木) 23:16:30
ちなみに漢字コードは元々のシフトJISに限定するけどいい??
ついでだからwchar_tに変換するものも書いてよ。 変換方法は何でもいいからさ。
>>731 まず入力にはboost::spirit::file_iteratorを使う
デコード用のiteratorは自分で書くかboostの中から探す
つぎにxpressiveのregex_token_iteratorでトークンに分ける(cvsのでないと遅くなるので注意)
そのトークンに付け加えつつストリームに出力する
こうしてstd::stringどころかヒープさえほとんど使わないで出力する
これで世界最速のプログラムの完成である (完)
そもそも、Perl だろうが何だろうが、 ターゲットの文字コードは分かんないとあかんだろ?
752 :
デフォルトの名無しさん :2007/08/02(木) 23:25:29
文字コードを統一する部分を持っていればよい
標準ではないけど、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>を挿入して、漢字もつなげる 以下同様にやる
とりあえず、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 :2007/08/03(金) 00:24:26
>>755 stdio版も意外に遅いですね。
time cygstart aozora.js ../input/20.txt
の結果はどうでしょうか?
(jsがwshext.dllに関連付けられているかどうか分かりませんが)
710死ね
758 :
673 :2007/08/03(金) 00:56:35
どうやらBOOST_TYPEOFというのがあるらしいですね
VCのバグを使ってほぼ完全にGCCのtypeofをエミュレートできるようです
(しかし本当にtypeofという名前だったとは…^^;)
早速使って見ましたが意図したとおりに動いていい感じ
range_XXXとかのメタ関数やsmart_ptr,optionalのようなテンプレートと相性がよいようで、
変数から型の参照が文法の上で自在に行えるのは気持ち良いです
>>690 検索かけてみましたが0xではその名前になるようですね
Visual C++0x(仮)を楽しみに待ちます
bash-3.1$ perl -v
This is perl, v5.8.8 built for MSWin32-x86-multi-thread
Binary build 820 [274739] provided by ActiveState
http://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
decltype という名前にしたのは、 動的な型は得られないということを分かりやすくしたのかね。
ちなみに、当方ではどうやってもcscriptかwscriptが起動し、 (aozora.jsへの20.txtのD&Dでも)wshext.dllはどうやれば 使えるのかは判らずじまい
762 :
710 :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 :2007/08/03(金) 01:19:46
>>761 レスを読んでいませんでした。
自分も特別に何かしたわけではないので、分からない……
wshext.dllって、実行がexplorerのスレッド内だったりして、 計測できるのはIPC(ファイルをexplorerに渡す)部分だけ、 みたいなオチはないよね?
765 :
710 :2007/08/03(金) 01:27:50
>>764 ……んー。よく考えると、それ以前の問題として、cygstartで起動すると、
すぐに呼び出し側に制御が戻ってきてしまうので、timeで計測ができるはずは
ないですね。
失礼しましたm(_ _)m
766 :
710 :2007/08/03(金) 01:49:44
wshext.dllがバカみたいに速いらしいぞ、と勘違いする人がいるかもしれないので
念のため書いておきますが、全くのデタラメでした。
自分も
>>755 さんと同じように、cygwinのbashのtimeでいい加減に計測していたのです。
jsだけは関連付けで起動させるために、cygstartで実行させていました。
cygstartで走らせたものの実行時間を計れるわけがないのに。大ボケです。
とりあえず、iostreamさえ捨てればC++でスクリプトに勝てると分かりました。
が、コードを書くのが格段に面倒くさいのに、大して差があるわけでもないのが
悩ましいですね。
自分でもっとずっと複雑な計算をするプログラムなら、当然比較にならない
ほどC/C++が優位でしょうけれども。
cygwin の GCC って遅かった気がする。 MinGW の方がいい。
勘違いするのはお前くらい
769 :
710 :2007/08/03(金) 02:09:08
>>767 C++のプログラムは全てVC++7.1でコンパイルしました。
cygwinのnewlibは、ロケール周りの実装があまりにショボいので、実質的に
ワイド文字の処理には使えないと思います。
(VC++にしても、いくつも地雷を踏みましたが。boostも、boost::regexは
バグがあってダメでした)
>>768 そうですね><
><
xlocaleをちょっと弄ったらboost::regexも落ちないようになるらしいけど詳細は忘れた
そうですね><
773 :
710 :2007/08/03(金) 02:22:31
>>771 xlocaleてことは、boost::regexのバグではなくVC++のバグってことですかね。
勘違いするのはお前くらい
ライブラリのバグかコンパイラのバグか知らんけど 動くコンパイラはあるわけだからね
777 :
710 :2007/08/03(金) 02:41:17
>>776 あれ、それと同じ問題なのかな?
実はそれを教えていただいた
>>616 は自分なんですよ。
ただ、
>>616 の場合はxpressiveの正規表現のコンパイル時にスタックが
壊れてSEGVになっていたのですが、
boost::regexの場合は、バックリファレンス含みの正規表現で検索すると、
SEGVではなく、boost::regexが例外をスローしていました。
バグってるのはお前くらい
780 :
710 :2007/08/03(金) 02:54:02
>>778 実はそれをboostスレに報告したのも自分なのです。
その正規表現の例を見ればモロバレでしょうが。
随分前にそれで「使い物にならん」と判断して放置していたのですが、
ここ数日、ふと思い立ってxpressiveで組みなおしてみたのです。
781 :
デフォルトの名無しさん :2007/08/03(金) 02:58:01
使い物にならんのはお前くらい
この流れは酷いな。
filter.hppってなんじゃらほい
STLportとかApache C++ Standard Libraryとかはどう?
script言語はC/C++で書いてある 比較すること自体バカらしい・・・
cpythonよりIronPythonのが速いっつー話もあるけどな
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関数を呼び出す)ことってできないですかね?
virtual
お、できました ありがとうございます
もう一つ質問です Base * b = new Dev[10]; for( int i = 0; i < 10; ++i ){ b[i]->Test(); } こういうようなことをやっているとループが何回か回った後で メモリ外アクセス落ちちゃうんですが何が原因かかわかりませんか?
Base * b = new Dev[10]; for( int i = 0; i < 10; ++i ){ b[i].Test(); } こうですた
配列をポリモルフィックに扱ってはいけない それをやりたいならポインタの配列とかでやるべき
boost::scoped_array<Base> b( new Dev[10] ); for( int i = 0; i < 10; ++i ){ b[i].Test(); } ならおk?
>>793 そうなんですか?
ポインタの配列というと、下のような感じでいいんでしょうか?
Base **b = new Dev*[10];
for( int i = 0; i < 10; ++i ){
b[i] = new Dev();
b[i].Test();
}
>Base **b = new Dev*[10]; これコンパイル通らないだろ。
797 :
793 :2007/08/03(金) 23:55:00
>>795 ソースはMore Effective C++の第三項。ぜひ一読を
>>796 Base **b = new Base*[10]; はいけましたが
Base **b = new Dev*[10]; はダメみたいです
ポインタの配列調べてきました、こんなんでいいんですか? 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(); }
>>801 Base やら Dev やらは構造体なの?
mallocじゃコンストラクタが走らないだろう・・ Devを指すBase*の配列を作ればいいと思うよ、多分
こうか? 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使えとか言いたい。
ptr_vectorはalgorithmが使えないから・・・
>>806 boost::indirect_iteratorでなんとかなる話?
違う、アルゴリズム体操の話。
なんだあほか
>>805 さんの方法で上手くいきました、ありがとうございます
こういうこんがらかるようなソースは嫌い
こんがりコーン
普通に一個一個newすればいいのに
newが現れた。newが現れた。・・・おや?new達の揚子江が・・・・・!?
兆候って言えよ
template <typename T> void f( typename boost::call_traits<T>::param_type x); みたいな定義で type x; f(x); のようにして使いたいんですが(要はf<type>(x)とかするのがめどい) 何か良いアイデアありませんか?
template <typename T> void f(T x)ならそのままf(x)できるけどboost::call_traitsってなんだっけ?
f(x)で呼べるだろ。
>>819 boost::call_traits<T>::param_typeは、
引数がクラス型ならconst T&、組込型ならTというように、引数に最適の型になる。
822 :
819 :2007/08/04(土) 12:56:31
普通に考えればそうなるはずなんですが、結果は #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。。。
コンパイラは何? vc6だとboostの一部は使えないよ。
工工工工工工エエエエエエ(´д`)エエエエエエ工工工工工工
VC8です あとGCC3.4でも試してみたが駄目ですた 型推論が上手く行かない為だと思うんですが、これはバグなのか 言語仕様上の限界なのかよくわかりません
2.5 というのをファイルから読み込んだんですが、これを小数(Float)に変換するには どうすればいいんでしょうか?
↑質問をちょっと訂正です 変換する上で便利な関数はありますか? atoiか何かで1文字づつ変換して入れてくしかないんでしょうか?
atof(), strtod()
ありゃまatofなんて関数があったんですね 解決しました
あとふ
acof
関数ブロック内で定義した関数って、 外部リンケージと内部リンケージどっちなんですか? 関数はstatic以外、外部リンケージつう説明を読むと外部リンケージですけど、 別のファイルから使うことなんて出来ないですよね? てか、リンケージの説明が微妙によくわかりません。 なんか良い説明してるページってありますか。
warning: ISO C forbids nested functions
>>835 ああ・・・ああ・・・・なんてこったい。
で、入れ子関数はGCCだと内部リンケージになるらしいですね。
void hoge() { struct nested_fn { void foo() { /* valid nested function */ } }; }
ちょっと組込み系で 簡単なGUI作っているのですが GUI部分とメインロジックを接続するイベントモデルを 設計しているのですが、最近のトレンドだとどんな 感じで実装してるのですか? 関数ポインタ方式 シグナル-スロット方式 ターゲット/メッセージ方式 とかなのかな? あと実際に実装してみようと思うと何かうまい資料とか あると助かるのですが、みなさんは実装しようとしたとき 何を参考に実装しているの?
XMLResourceかね、XULみたいな でも組み込みじゃ無理か
840 :
デフォルトの名無しさん :2007/08/05(日) 05:08:02
C++でSingletonなClassを実装したいのですが、staticを使う方法しか思いつきません。 出来ればstaticを使用せずに実現したいのですが可能でしょうか。 具体的なコードや、参考HPのURLを示していただけると助かります。 よろしくお願いします。
static 使わずに Singleton なんて無謀
extern
なんでstaticを使いたくないんだろうか?
インスタンス取得関数を friend 関数で作り、 そのインスタンスへのポインタをグローバルに置く、 くらいが限界か。 全く意味がないけど。
ファクトリ用のクラスを作ってそこでインスタンスを管理するとか。 もっともファクトリにstaticが必要になるような気もするけどw
C++以外の言語でもstatic相当のものを使わないと無理だよな。
うまく説明できないんですが、BCBで何も考えずに__closure使ってます。 これを使わない場合、どう書けばいいですか?エスパーさんよろしこ
死ね
説明できないならソースで説明してくれ
しょうゅdeも11お
delete x,y,z; はOKなのに、配列に対する delete [] x,y,z; で、うまくいかない理由を教えてください。 一文で各方法はないでしょうか?
>>851 delete x,y,z;も全然良くない。
deleteとdelete[]演算子は1つしか演算対象を取らない。
また、カンマ演算子は最低の優先順位なので、こうは書ける。
delete x, delete y, delete z;
delete[] x, delete[] y, delete[] z;
1行に複数文を並べるのと大して変わりはないが。
マクロ
配列と通常のやつのdeleteが異なるってことが気にくわねぇなら プリプロセッサとmplを組み合わせて、delete_(x, y, z,...);みたいな物作ろうぜ 既に誰かが作ってるかもしれないが
そもそも配列new[]は使わないし、 deleteも生で使うのはダサい。
初心者なんですが、fopenってファイルを開くだけでメモリに乗せるわけではないですよね? ちょっと疑問に思っていまして・・・
裏でバッファリングを始めている可能性はあるが、 気にするようなことではない。
生ポだろがスマポだろうがお構い無しに意味上での構築破壊が出来る構文が必要ということか
>>857 new[]→std::vectorあるいはもっと低水準のメモリ確保ルーチンへの二極化。
delete→boost::scoped_ptr, boost::shared_ptr
>>860 そもそも世の中boost使えない場合が多いの
そんな限定していいの?
862 :
858 :2007/08/05(日) 10:19:13
>>858 うーん、TB級のファイルをfopenで開くことって出来ますかね・・・
ほほえましいな
>>840 ソフトウェアの立ち上げを早くするために
遅延ロードみたいなことをしたいってこと?
はい
>>861 生を安全なものにするには、ラップするか、使い方に厳密な決まりを作る、しか無いよ。
本質的には。
既存の膜がないなら、できる範囲で自作するのが一番いいと思うけど。
boost::shared_ptr 自分で実装するのめんどい誰か実装して。
すでに実装済み
めんどいから誰かが実装してくれたのが boost じゃないの
あんなでかいライブラリ使いたくねー 他いらねーしshared_ptrだけ実装してくれよ
既に実装済み
じゃあフリーで使える単体のshared_ptrだけ作ってくれよ
>>873 boostからshared_ptrだけコピペして使えよ
既存
テンプレートライブラリがどういうものか分かってないんじゃね
boostのshared_ptrもいろいろincludeしてたりして、 依存性を調べるのが面倒くさいからなー。 shared_ptr.hppひとつコピペしたら済む話じゃないでそ?
>>868 std::tr1::shared_ptr
libstdc++くらいしかまだ実装していないと思うけど。
>>860 こういう流れになるから std::auto_ptr も挙げるようにしようぜ。
>>879 auto_ptrを挙げるならばその罠や制限についても説明しなければならないだろ
単純なshared_ptrまがいなら色々見たことがあるし
そもそも基本的な原理は単純そのものだが
とうぜんそれらはshared_ptrほど注意深く実装はされていない
>>877 プリプロセッサに食わせて出力をgrepするだけの話だが
そもそも取り込むファイルが環境依存だからな
>>880 > auto_ptrを挙げるならばその罠や制限についても説明しなければならないだろ
shared_ptr を並べて挙げとけば十分だよ。
罠や制限があっても share_ptr よりコストは低いし標準だし、
単純な例外安全目的にはぴったりだ。
コンテナに突っ込めない出来損ないのスマポが標準だ?笑わせてくれる
誰が笑おうがコンテナに突っ込めなかろうが、標準は標準。 単純な delete 強制のためだけに boost が要るなんて言われても 面倒なんだよ。
笑うのはいいこと、もっと笑おう
>>882 コンテナに突っ込めるスマポが標準にないところも笑いどころ。
886 :
デフォルトの名無しさん :2007/08/05(日) 17:08:20
今、ある数学のプログラムをネット上で見つけたので、
それをコンパイルすることを試みているのですが、
エラーがいっぱい出て、うまいごとにコンパイルできません。
Borland社のbcc32というのを使ってます。
そのソースはこちらのウェブサイトに全部載ってます。
http://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 ***
>>886 上から順番につぶしていけば?
標準から大きくずれている&独自の書き方が多いでとても読解する気になれんw
取り合えずRANDMマクロは単に乱数欲しいだけみたいだからrand()にでも置き換えてみるとか?
昔のソースなんだろ。 1989年と書いてあるな・・・
891 :
886 :2007/08/05(日) 17:32:28
>>889 ありがとうございます。
RANDM()と書いているところをrand()に置き換えたらいいんでしょうか?
>>890 だとしたら、最近のコンパイラではコンパイルできないということでしょうか?
すみませんが、ご教授お願い致します。
何の宿題かぐらいはちゃんと書けよ。
#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 なんの宿題か、というわけでもないのですが、
自分は数学関連の研究をしているもので、プログラミングに関しては
ほとんど知らないわけですが、たまたま自分の研究に関連する
プログラムをネットで見つけたので、それを使えるようにしたいと
思い、なんとかコンパイラをインストールするところまでには
至ったんですが。
-AKオプションつけるとどうなる?
ごめん。[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 ***
#include <stdlib.h> #define HUGE HUGE_VAL #define exit() exit(EXIT_FAILURE) を追加で少しましになった まだ、drand48,srand48でエラーが出る drand48,srand48ってUNIX Cの関数で標準のC関数じゃないのか?
rand48 は UNIX/Linux の関数だね。
900 :
デフォルトの名無しさん :2007/08/05(日) 18:18:51
BCCなんて糞コンパイラ使ってるからだよm9(^Д^)プギャー
しかし886よ、そのプログラムをなんとか動かせたとして、使い方は判ってるのか。
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 ***
あ、間違えた。 RANDM(a) の a を削除
何かこのプログラム永遠に終了しないみたいなんで、 main の最後の return 0; は不要みたいだな。
906 :
886 :2007/08/05(日) 18:28:03
>>900 それじゃあ他の只でダウンロードできるやつ、もしくはフリートライアル
のやつをインストールして、やってみた方がいいでしょうか?
>>901 大体何をしたいかはわかってます。後は試行錯誤です。
InputとOutputのサンプルが載っている論文が手元にあります。
>>902 で一様buildできたが、何をするんだこれ?
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はこれらすべての頂点を結ぶ木
(サイクルを作らないようなグラフ)の枝の総長を表わしています。
最初の scanf("%c",&ch); でその適当に入力した文字が ch に入る。 そして2度目の scanf("%c",&ch); で改行が ch に入る。
>>907 一様(いちよう)じゃなくて一応(いちおう)ね
一様は「違い・むらが無い」って意味
なんかお子様多いな
お前が一番お子様なのにね
>>911 >最初の scanf("%c",&ch); でその適当に入力した文字が ch に入る。
>そして2度目の scanf("%c",&ch); で改行が ch に入る。
成る程です。
ちなみに、2度目の関数呼び出しの際、1度めに使われた変数の中身はクリアされないんでしょうか?
>>910 正20面体って正三角形が20個でしょ?
そもそも関数を抜けた時点で ch の中身は保証されなくなる。
>>911 >最初の scanf("%c",&ch); でその適当に入力した文字が ch に入る。
>そして2度目の scanf("%c",&ch); で改行が ch に入る。
すいません、何故勝手に改行が入力されるのでしょうか?
その辺のFAQってどこかにありませんでしょうか?
勉強したいので。
「y」と「改行」を入力したでしょう。別に勝手に入るわけじゃない。
>>918 scanfの仕様に則っただけだからキニスルナ
>>918 FAQだけで簡単に済まそうとしているのが間違い。
もっと基礎的なことからちゃんと勉強したら?
基本を知らずにFAQだけ読んでも、得られるものは少ないと思う。
> エラー E2379 steiner-code.c 39: ステートメントにセミコロン(;)がない(関数 buil dtree )
こんなエラーすらを自分で解決できないのでは、先に進みようが無い。
>>921 ごめんなさい、ごめんなさい
あのー、基礎的なことってどんなことですか?
何が基礎的なことなのか分からないのです(>_<)
基礎的なこと=何が基礎的なことなのか分からないこと
C言語を真面目に勉強しろってさ
HelloWorldは書いたかい?
a,b,cはint型です。 a=0;b=0;c=0;とするところを、a=b=c=0;としても同じでしょうか?
>>926 同じ、それくらい入門書でも読んでくれ。
a=b=c=0;この場合の代入の順序はどうなんですか? a=0,b=0,c=0 順番なのですか? それとも a=0,b=a,c=a
=(a, =(b, =(c,0) ) );
優先順位表見てる? あれに右左も書いてあるべ
a = (b = (c = 0)); ということ
932 :
926 :2007/08/05(日) 20:12:50
933 :
928 :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 優先順位表って何ですか
わざわざ1つの式にまとめて書いといて、順序もクソも無いもんだ。
936 :
928 :2007/08/05(日) 20:34:37
>>935 どうやってどちらが実行されてるか試すのですか?
> つまりb = (c = 0)の処理の場合、b=0、b=cどちらが実行されるのでしょうか? なにか違いが?
c=0の評価値は0だ
>>936 int a;
char b;
a = b = 12345;
printf("%d %d", a, b);
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パターンを実現している記事を見かけましてこちらで質問させていただきました。 何か情報御座いましたらよろしくお願い申します。
>>941 グローバル変数は駄目でシングルトンならいいってのは、どういう理屈かね?
>>941 >C/C++でstaticを使用する場合グローバルに変数の宣言が必要かと思いますが、
いや…、必要ないよ
class HOGE
{
public:
static HOGE& get_instance(){
static HOGE hoge;
return hoge;
}
private:
HOGE();
};
>>877 libjingleではboostからshared_ptrだけとりだしてコピペしてる箇所があるって聞いたぞ。
そんなに面倒とも思わんけどなぁ
>>877 依存関係の調査自体は bcp 使えば要らない。結果の膨大さにびびるだろうけど。
946 :
909 :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では無いですよ。
少なくともコンパイルエラーを直してから、質問します。
>>941 例えstaticやグローバル変数を避けてシングルトンを実装したとしても、
目的を達成する手段が変わっただけで、本質的には何も変わっていない。
そう書いてから942の焼き直しだと気付いた。
>>946 >もしかして標準入力の内容ってバッファみたいなところに貯められるんですか?
そのとおり。
標準入力に限らず入出力にはバッファを利用されることが多い。
949 :
909 :2007/08/05(日) 23:42:42
>>948 へぇ、知らなかったです。
そんなこと、本には書いてなかったので。
イメージとしては
入力した文字がメモリのどっかに
hogehugamoge
みたいに保存されて、
そこからscanfの引数の変数の型の分(今回はchar型)
コピーされるみたいな感じなんですかね?
そう。 正常に動くケースは、1文字目が改行で2文字目がyで3文字目が改行でしょ。 3文字目は読まれずにバッファに残ったままプログラムが終了するだけ。
951 :
909 :2007/08/06(月) 00:11:27
ありがとうです。 んで、何文字バッファに保存されるかはOSの実装によると。
普通の使い方なら充分なくらいのバッファはあるはず・・・ 10文字程度で満杯とかそんなことはまずない。
ストリーム入出力ってのは、バッファリングされる入出力のことだ。
すみません質問させてください。 txtファイルから、例えば40.123/42.591/43.569という文字列を読み込んで、 真中の42.591だけを数値として変数に格納したいのですが、 どうにも巧い方法が思いつきませんorz 何卒お力をお貸し頂けますようお願い致します。
955 :
909 :2007/08/06(月) 03:35:24
/ ̄ ̄ ̄ ̄\ / ( ( ( ) .) )\ / ( ( / ̄ ̄ ̄”\ .) ) / ( ( |. | ) ) ( ( ( | \ハ/ | ) ) ( ( ( | ゚ ̄ 〈 ゚ ̄ | ) ) ( ( ( | > | ) ) (. ( ( | /へ) / ) ) \_/|\ ー //\/ / ̄ ̄\ ゛ーー/ ̄ ̄\ ./ \ ̄ ̄ ”/ \ | ●|・| ||/ | | | ●|・| ||/ | | \_ ●|・| ||/ | .\ 》||つ【♪1076】___/
>>954 C なのか C++ なのか、まずはそれからだ。
957 :
954 :2007/08/06(月) 03:41:45
ごめんなさい、Cでお願いします。 後、sage禁止だったのですね。重ね重ねすみませんorz
自己判断で ~~~~~~~~~~~~ 寧ろage禁止
sage禁止とはなんという斬新なルールなのか
960 :
954 :2007/08/06(月) 04:01:48
すみません、以後下げるようにしますorz
どっちでもいいよ。自分で判断しる。
>>957 いろいろ方法はある。
scanf 系関数を使うなら、
%*f のように書式に * を挟むことで
変数に格納しなくなるようにできるのを利用するとか。
あとは1行取得して、
それを strtok で "/" をデリミタにして処理した2番目の文字列を atof するとか。
strtok を使うのが気持ち悪いなら strchr を使ってもいいかもしんない。
963 :
957 :2007/08/06(月) 04:48:30
了解です、状況で判断しますorz
>>962 ご解答頂きありがとうございます。
教えていただいた通り、今回はstrtokを使ってみたいと思います。
%*fという表記は知らなかったので勉強になりました。
本当にどうもありがとうございましたm(_ _)m
また皆様のお力をお借りすることがあるかと思いますが、その時はどうぞよろしくお願い致します。
strtok()は癖が強すぎるのでお勧めしない。 scanf()でフォーマットを'%*f/%f/%*f"にしてはいけないのか?
965 :
957 :2007/08/06(月) 05:55:20
>>964 strtok()は癖が強いのですか。
strtok()を使ったことが無かったので使ってみようかと思ったのですが、
そういうことであれば素直に%*fを使ってみたいと思います。
アドバイスありがとうございましたm(_ _)m
test
for(int i=0;i<n1;i++) { ←ここに飛びたい場合どうするのが一般的でしょうか? // 処理 ↑ for(int j=0;j<n2;j++) { ↑ if (a[j] == b) // 条件が成立したらループを抜けて↑ } //処理 }
>>967 つ[goto]
まぁ、アルゴリズムを見直してbreakだな。
中のループをboolを返す関数にしてしまって trueだったらcontinueとかね
void f() { static char *theTxt; strcpy(theTxt,"TEST¥n"); printf("%s",theTxt); } これってtheTxt;がstaticでnull初期化されているから 駄目なんですか?
>>970 theTxtはポインタ。
strcpyはポインタの指すアドレスにデータをコピーする関数。
問題は、theTxtがどこも指していないこと。
mallocで確保するとか、配列にするとか、データの領域をまず用意
どこも指してない、つーかNULLで初期化されてっからアドレス0を指してる、とも言えるか。 まあ同じだけど。
理解出来ました。 有り難うございます
>>972 >アドレス0を指してる、とも言えるか。
いえない。
因みに、初期化されていないポインタは
「何処を指しているかわからない」
>>974 staticがついてると0に初期化される
static だから = 0 で初期化されている。 ただ、アドレス 0 だとは限らない。
もうヌルポインタが0じゃない話はいいから
>>977 「ぬるぽはどこも指していない話」じゃないのか?
NULLが0なんじゃない、0がNULLなんだよ。
ぬるぽ! ぬるぽ! ぬるぽ! ぬるぽ! ぬるぽ! ぬるぽ! ∩ ∩ ノ) ぬるぽ! ぬるぽ! 川 ∩ 川彡'三つ ぬるぽ! ぬるぽ! ⊂ミ∩、⊂ミ∩彡⊃ ぬるぽ! ぬるぽ! ⊂三ミ( ゚∀゚)彡三彡三⊃ ぬるぽ! ぬるぽ! ⊂彡川⊂彡川ミ⊃ ぬるぽ! ぬるぽ! ⊂彡川∪⊃ U川彡⊃ ぬるぽ! ぬるぽ! (ノ ∪ 川 ∪ミ) ぬるぽ! ぬるぽ! ∪ ぬるぽ! ぬるぽ! ぬるぽ! ぬるぽ! ぬるぽ! ぬるぽ! ぬるぽ!
981 :
デフォルトの名無しさん :2007/08/06(月) 21:47:18
#define NULL ぬるぽ #define 0 NULL
fopenやifstreamがどういう処理をしているか気になります。 遠回しにAPIを呼んでたりするんですか?
そりゃシステムコール呼ばないとファイル開けまへんがな(´・ω・`) そこらのOS毎の差異を吸収するのも標準ライブラリの役目
そう。 遠まわしに、WindowsならCreateFileとかのAPIを呼んでる。
985 :
デフォルトの名無しさん :2007/08/06(月) 22:51:22
まー結局、細部まで一致しないからWINDOWS API使うのが賢い かなり単純なものでないとCのみでしょり出来ないからな
×
>>972 ,
>>974 ○
>>976 C言語の仕様によれば、staticな変数は『定数ゼロ』(K&R第2版)で初期化される。
だから
static char *theTxt;
は、
static char *theTxt = 0;
と置き換える。
ここで、定数ゼロは整数型に代入されれば整数0であり、ポインタに代入されればヌルポインタになる。
ヌルポインタは、(アドレス0を指す処理系もあるかもしれないが、)
『どこも指していないポインタ』が正解。実際のbit列がゼロの連続とも限らない。
従って、ヌルポインタはprintf()の引数として処理できない。
ちなみに、『ぬるぽ』はNullPointerExceptionの略で、ヌルポインタではない。
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; } 何か問題はありますか?教えてください。
たまには私を思い出してください。 ほら、try-catch句がなかったあの頃を思い出してください・・・
マジです
>>987 とりあえずmainの'{'に対応する'}'と、fcloseが足りない。
992 :
987 :2007/08/06(月) 23:07:22
すみません。 ソースが長いので省略しています。 コンパイルエラーはないんですが テキストファイルが読み込めないんです。
>>993 実行方法は?
まさか、カレントディレクトリにファイルがないって落ちじゃないよな?
horse.txtが無いんじゃね?
995 :
デフォルトの名無しさん :2007/08/06(月) 23:11:32
errno調べてみ
996 :
987 :2007/08/06(月) 23:16:06
horse.txtはあります。 今まで動いていたプログラムもファイルが開かなくなりました。 ライトファイルはできます。
どっか別のアプリケーションがファイルを開いてるんじゃない? アプリケーションを全部終了するか、最悪OS再起動したら直るんじゃないかね。
998 :
987 :2007/08/06(月) 23:19:45
と思って再起動したんですが直りませんでした。
errno !!!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。