【初心者歓迎】C/C++室 Ver.40【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/07/18(水) 09:10:30ただしその場合、質問者は必ず、環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.39【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1182740506/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2007/07/18(水) 09:59:030003デフォルトの名無しさん
2007/07/18(水) 10:25:22ユーティリティー関数というか特定のクラスに依存しない関数群ってクラスとしてコード書くよりもCの関数として書いた方がいいのかな?
関数をちょっと使いたい時に、わざわざクラスの実体作って関数呼び出しするのってなんかスマートじゃない様な気もするんだけど、C++なのに普通のCのコードが混ざるのもスマートじゃない様な気がするんだよなあ。
どっちがいいんだろう
0004デフォルトの名無しさん
2007/07/18(水) 11:10:29>わざわざクラスの実体作って関数呼び出しするのって
class A {
static void B();
};
A::B(); // インスタンス不要
まあ↑みたいなことするくらいなら、
名前空間に入れたグローバルな関数でいいんじゃないかと。
0005デフォルトの名無しさん
2007/07/18(水) 11:11:19そんなときはnamespaceで囲ってしまえばいいんでない?
#昔はstaticなメンバ関数しか持たないクラスを作るケースもあったけどね。
0006デフォルトの名無しさん
2007/07/18(水) 13:01:06>>5
サンクス。ネームスペースを使ってみるわ〜
0007デフォルトの名無しさん
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要素数のベクトルはスカラー変数に代入できないよ」
と解釈したのですが、実際どうなのでしょうか。
よろしくお願いします。
0008デフォルトの名無しさん
2007/07/18(水) 13:59:490009デフォルトの名無しさん
2007/07/18(水) 14:10:46char out_one_statement[9][32]={0};
と宣言して、
main関数外でchar型の変数を代入して、
main関数内でそれを先に説明したように操作しています。
環境はVC++2005です。
0010デフォルトの名無しさん
2007/07/18(水) 14:13:12具体的に何をどうやって代入したんだ。
もしくはデバッガで中身見てみようぜ
0011デフォルトの名無しさん
2007/07/18(水) 14:13:370012デフォルトの名無しさん
2007/07/18(水) 14:14:08本とか買って独学で学べば良いですか?
スクールとか行くべきですか?
0013デフォルトの名無しさん
2007/07/18(水) 14:16:54両方やるべし
0014デフォルトの名無しさん:7
2007/07/18(水) 14:54:21パターンを抽出するので、外部関数内で、入力(配列)からパターンを
見つけて、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]
のようにして右辺値に利用しています。
0015デフォルトの名無しさん
2007/07/18(水) 14:55:300016デフォルトの名無しさん:7
2007/07/18(水) 14:56:11外部関数が出です。
0017デフォルトの名無しさん:7
2007/07/18(水) 14:57:52[32]側です。代入操作後に代入状態をチェックしましたが、
それについては問題がないようです。
0018デフォルトの名無しさん
2007/07/18(水) 14:58:50・ atoi で 0 が帰ってくる時の out_one_statement[12] には何が入っているのか
0019デフォルトの名無しさん:7
2007/07/18(水) 15:04:18out_one_statement[0][12] == out_one_statement[0*index0 + 12]
== out_one_statement[[12]
として扱っているのですが、これに問題があるのですか?
>atoi で 0 が帰ってくる時の out_one_statement[12]
3 '□'です。
0020デフォルトの名無しさん:7
2007/07/18(水) 15:06:51out_one_statement[0(index0 = 0)][12] == out_one_statement[32*0 + 12]
でした。。。
0021デフォルトの名無しさん
2007/07/18(水) 15:18:47根本的に間違ってる。そんな等号は成立しない。
0022デフォルトの名無しさん
2007/07/18(水) 15:19:370023デフォルトの名無しさん
2007/07/18(水) 15:19:380024デフォルトの名無しさん:7
2007/07/18(水) 15:46:49atoi()にかかわらず、アドレス渡し時には”行”アドレスを渡すので、
int ctoi(char *char_var, char addr)
{
int i;
i = char_var[addr];
return i;
}
と関数作って変換することにしました。
0025デフォルトの名無しさん
2007/07/18(水) 15:49:27out_one_statement[12] == &out_one_statement[12][0] だよ。
out_one_statement[0][12]をアクセスしたいならout_one_statement[0][12]と書こうよ。
0026デフォルトの名無しさん:7
2007/07/18(水) 15:57:53間違いを教えていただけませんか。よろしくお願いします。
char *char_varの
*char_varはメモリ空間上、char_var[0]と等しく、
char_varはメモリ空間上、&char_var[0]と等しいと本で読んでいました。
二次元配列でも、先頭アドレスのchar_var[0][0]"のみ"を渡すのだとして
間違っていたようです。
>>18さんのご指摘はこの辺が絡んでいるのでしょうか?
0027デフォルトの名無しさん:7
2007/07/18(水) 16:04:17そうですね。きちんとインデックスを明示すれば問題なかったことですね。
今回のことで学習できました。ありがとうございます。
>out_one_statement[12] == &out_one_statement[12][0] だよ。
今回これが分かりました。また御厄介になるときがあると思うので、
その時よろしくお願いします。
#>>24で分かりましたが、この関数は使わないようにします。
ありがとうございました。
0028デフォルトの名無しさん
2007/07/18(水) 19:10:32二乗した数が小町数となるような自然数をすべて求めるプログラムを
作成し、その数と小町数の両方を出力せよ。例えば24441の二乗は
597362481であり、小町数となる。
全然手をつけられません。できる方いればお願いします。
0029ERP
2007/07/18(水) 19:12:20とMFCを使っていますが、外部の機械に入出力ポートからトリガー
パルスを出力したいとおもってます。昔のbasicとか古典的なCでは
そのような関数(oportのような?)が用意されていたように思い
ますが。最近のWIN32環境ではみあたりません。
どのようにしたらいいでしょうか?
0030デフォルトの名無しさん
2007/07/18(水) 19:15:230031デフォルトの名無しさん
2007/07/18(水) 19:20:48全ての小町数の平方根とっていけば求まりそうだなぁ
0032デフォルトの名無しさん
2007/07/18(水) 19:23:2011111から31427の二乗が小町数かどうかチェックした方が早い希ガス。
0033デフォルトの名無しさん
2007/07/18(水) 19:33:21デバイスドライバを呼ぶ。
0034デフォルトの名無しさん
2007/07/18(水) 19:35:19宿題は宿題スレへ。
現行のスレに同じ問題と答えが載っている。
0035なんだ。いいや、書いたから貼っておこう。
2007/07/18(水) 19:47:34#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;
}
0036デフォルトの名無しさん
2007/07/18(水) 22:02:56のLって標準と考えてもいいんでしょうか?
もしかしてWindowsだけですか?
0037デフォルトの名無しさん
2007/07/18(水) 22:08:24標準
0038デフォルトの名無しさん
2007/07/18(水) 22:24:58私だったら、シリアルポートのCTS/RTSとかで制御するけど。
それならWIN32APIで、CreateFileとDCB構造体を操作するAPIを使えばいい。
ややこしいけど、直接IOポートをたたきたくても無理だからね。
それにしても、メール晒すなんて勇気ある御仁ですな。
0039デフォルトの名無しさん
2007/07/18(水) 23:01:40それらの違いとは何なのでしょうか。あとコンパイラが違うとプログラムの書き方も変えないといけないのでしょうか。
くだらない質問ですいません。
0040デフォルトの名無しさん
2007/07/18(水) 23:06:530041デフォルトの名無しさん
2007/07/18(水) 23:15:580042デフォルトの名無しさん
2007/07/18(水) 23:16:00世界標準の規格としての部分があり、それに各社独自な部分を加えている、とでも言えばいいんだろうか。
書き方で注意を要するようになるのは、多分C++のクラスを勉強し始めてからになるんじゃないかと。
0043デフォルトの名無しさん
2007/07/18(水) 23:23:59Visual C++はMicrosoftが作っているし、Borland C++はBorlandが作っている。
それぞれ自分の製品を買ってもらおうと必死なんで、
プログラム作りを補助するツールやライブラリなどに独自色を打ち出している。
しかし、どれもC++処理系を名乗る以上、コンパイラと標準ライブラリなどの部分は、
ISOの国際標準に則っているので、そういう独自機能を使わない限りは、
どのコンパイラでも同じ書き方が通用する。
……というのが理想だが、現実は標準への対応具合や
標準が認めているコンパイラごとの挙動の違いなどがあるので、
時にどのコンパイラでも通用するプログラムを書くというのは難しいこともある。
C++はそれが比較的顕著なほうだが、そんなこと日常的に気にする必要があるのは、
基本的に良くも悪くも(周囲の環境か本人が)変態な場合だけなんで、
やっぱり普通はそんなこと気にする必要がない。
0044デフォルトの名無しさん
2007/07/18(水) 23:24:20どちらのほうが入門に適しているんでしょうか?
0045デフォルトの名無しさん
2007/07/18(水) 23:28:390046デフォルトの名無しさん
2007/07/18(水) 23:29:520047デフォルトの名無しさん
2007/07/18(水) 23:32:15Visual C++ 2005 Express でいいんじゃないの。
無料だし。
0048デフォルトの名無しさん
2007/07/18(水) 23:37:160049デフォルトの名無しさん
2007/07/18(水) 23:40:420050デフォルトの名無しさん
2007/07/18(水) 23:51:370051デフォルトの名無しさん
2007/07/18(水) 23:57:34何か良いライブラリってありますか?
0052デフォルトの名無しさん:7
2007/07/19(木) 00:06:36質問があります。以下のような関数を作ってファイル出力させてみたところ、
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;
}
いったん送信〜
0053デフォルトの名無しさん
2007/07/19(木) 00:11:47table[index0][index1]
ってなにさ?
0054デフォルトの名無しさん:7
2007/07/19(木) 00:15:45char table[TABLE_SIZE][LATTER_SIZE] = {0};
で出力もとデータを扱っています。
fputcは、他の関数も使った事がないので上記で出力させてできたら
移行しようと思っています。fputcは出力文字対象の整数を引数に
していますが、ファイル書き込み時にも整数(int)のまま書きこん
でいるのでしょうか?
普段使っているtex¬epadで出力したファイルを編集したいので、
上記関数をどう変更すればいいかわからないでいます。
よろしくお願いいたします。
0055デフォルトの名無しさん
2007/07/19(木) 00:25:23printf()での出力はどうなってる?
0056デフォルトの名無しさん:7
2007/07/19(木) 00:42:59int 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.フラグは適切にアサートされている
といったところです。
0057デフォルトの名無しさん
2007/07/19(木) 00:51:04printf("%d", char_lib)
となってるけど >>52 みたいに%cでやってみて
ちゃんとコンソールに出力されてなければテーブルの中身がおかしいのかな?
005844
2007/07/19(木) 00:52:530059デフォルトの名無しさん:7
2007/07/19(木) 01:24:49コンソールには適切に表示される文字とされない文字がありました。
特定列だけ正常に表示されています。
出力用配列への代入時のキャスティングに問題ありかなと思えました。
そこで、出力用配列を整数型に代えて、%dで表示してみると、
整数値としてきちんと10進数表示はできました。
問題は文字列表示です。。。
0060デフォルトの名無しさん
2007/07/19(木) 05:01:33コメントの少ない1000行くらいの物がなかなか読めません。
どうすればソースコードを読むのがうまくなるのでしょうか?
0061デフォルトの名無しさん
2007/07/19(木) 05:19:48まず大局から把握していく
書かれてる処理が何のアルゴリズムの実装かとか、
(クラス名→)関数名・グローバル変数名→ローカル変数名と見て行って
それぞれの役割とかに見当をつけて読む
理解した部分にコメントを付けながら読むといい
あと色んなコーディングスタイルのプログラムを読んで経験しておくのもいい
0062デフォルトの名無しさん
2007/07/19(木) 06:21:55中級者になるのでしょうか?
0063デフォルトの名無しさん
2007/07/19(木) 06:48:240064デフォルトの名無しさん
2007/07/19(木) 10:07:490065デフォルトの名無しさん
2007/07/19(木) 11:51:38MS VS2003 C++のGDI+なのですが、
Imageクラスのオブジェクトに画像が入っているとして、
1ドット目、座標 (0, 0) の色を取得するにはどうしたらよいでしょうか?
Image* img = new Image("pic.bmp");
Color aColor = image.getPixelColor(0, 0);
みたいにしたいのです。
よろしくおながいします。
0066デフォルトの名無しさん
2007/07/19(木) 13:57:13エラーメッセージやライブラリドキュメントをよく読めばよいです。
006765
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
0068デフォルトの名無しさん
2007/07/19(木) 14:42:06エスパー以外お断りなら先にそう言え。
0069デフォルトの名無しさん
2007/07/19(木) 14:43:15C#でWindowフォームプログラムを作成したのですが、
インストールが出来ないPCで稼動させねばならなくなりました。
(そのマシンには.NetFrameWorkが入っていない)
短いプログラムなので作成しなおしてもよいのですが、
C#から、インストーラを稼動させたりランタイムをインストールさせたりせずに
インストーラ不要のEXEプログラムを作成するのに一番良い方法はなんでしょうか?
環境が似ているVC++2005 ExpressEditionをDLしてみたのですが、
インストーラ不要のEXEプログラムの作成の方法がわかりません。
(作成できるかどうかもわかりません)
すみませんが、どうかご教示願います。
開発環境:WinXP
実行環境:Win2000、WinXP
0070デフォルトの名無しさん
2007/07/19(木) 14:50:54ほら、「エラーメッセージやライブラリドキュメントをよく読めばよいです。」
ってまたレスしなよ。
0071デフォルトの名無しさん
2007/07/19(木) 14:51:57エラーメッセージやライブラリドキュメントをよく読んで自己解決したならそれは
>>66のおかげw
0072デフォルトの名無しさん
2007/07/19(木) 14:54:55結局、最終的に動かしたいのはC#で作ったやつなのかC++なのか?
C++ならランタイム無しでシステム標準のDLLだけで動作するものは
作れるが、それとC#のプログラムとは何の関係もないぞ?
007372
2007/07/19(木) 14:57:30ということで、C++で作ることになるけど、かなり初歩からやらないとならんかもな。
MFCのスタティックリンク、が一番近いかなあ、、、
0074デフォルトの名無しさん
2007/07/19(木) 14:58:45そんなら、GraphicsからBitmap作成して、
Graphics::DrawImage()して、
そのBitmapからピクセル取得したほうがいいんじゃないかな。
007569
2007/07/19(木) 14:58:47ランタイムなしで作成できるならC++で作成したいです。
C#のコードを捨てるのは全く問題ないのですが、
ある程度慣れたVC++2005ExpressEditionで作成出来ればと思っています。
0076デフォルトの名無しさん
2007/07/19(木) 15:02:05CだろうがC++だろうが、ランタイムは(普通は)使うことになるが、
静的にリンクすることで、外部のDLLに依存するのではなくプログラムに
埋め込むことが出来る。
まあ、良し悪しなんだがな。
0077デフォルトの名無しさん
2007/07/19(木) 15:03:46EEだと、MFCも無いのでマウスで貼り付けるようなのは無いぞ。
まあテキストで全部できるし、リソースエディタを外部ツール使えばいいか。
0078デフォルトの名無しさん
2007/07/19(木) 15:06:02開発環境が 2005EE だと リソースエディタ と MFC は無いんじゃなかったっけ?
フォーム風のをフルスクラッチで書くのは泣ける希ガス
007969
2007/07/19(木) 15:06:29ありがとうございます!
>>76
EEだと、MFCも無いのでマウスで貼り付けるようなのは無いぞ。
まあテキストで全部できるし、リソースエディタを外部ツール使えばいいか。
その方法が知りたいのですが良く分かりません。
ご教示頂ければ幸いです。
0080デフォルトの名無しさん
2007/07/19(木) 15:09:230081デフォルトの名無しさん
2007/07/19(木) 15:10:33http://freepg.fc2web.com/cpp/topic_vce_001.html
http://www.microsoft.com/japan/msdn/vstudio/express/visualc/usingpsdk/
この辺読んでみて
自分はPro版持ってるからやったことないけど
0082デフォルトの名無しさん
2007/07/19(木) 15:13:52スタティックリンクできるっけ。
インストール不要なら検討の余地はあるね。
0083デフォルトの名無しさん
2007/07/19(木) 15:15:14ライセンスまで含めてマジメに考えるとどうなるか分からん
0084デフォルトの名無しさん
2007/07/19(木) 15:15:250085デフォルトの名無しさん
2007/07/19(木) 15:16:41インストールは不要だね
どうしても実行ファイルは大きめになるけど
0086デフォルトの名無しさん
2007/07/19(木) 15:37:07http://freepg.fc2web.com/cpp/topic_wx_vc.html
http://0xcc.net/pub/uu-2004-08/
http://www.geocities.co.jp/SiliconValley-Cupertino/8526/wxWindows/license.html
これもどうぞ
0087デフォルトの名無しさん
2007/07/19(木) 16:11:41読み出すとき値が壊れています・・・
for(k=0; k<100; k++) {
fp.write(( char * ) &k,sizeof(unsigned int ) );
fp.write(( char * ) &x[k],sizeof( float ) );
}
0088デフォルトの名無しさん
2007/07/19(木) 16:14:03すみません
バイナリモードで開いていませんでした
0089デフォルトの名無しさん
2007/07/19(木) 16:22:32というか…2行目の
fp.write((char *)&k, sizeof(unsigned int));
もうこの時点で何をしたいのかよく分からない。
変数kのアドレスを出力してるの?
何のために?
…俺が勘違いしてるのかな。
0090デフォルトの名無しさん
2007/07/19(木) 16:27:53> …俺が勘違いしてるのかな。
うん。
0091デフォルトの名無しさん
2007/07/19(木) 16:40:250092デフォルトの名無しさん
2007/07/19(木) 18:26:31template <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
どうよ?
0094デフォルトの名無しさん
2007/07/19(木) 22:56:36std::ofstream file("c:\\日本語ファイル名", std::ios::out | std::ios::binary | std::ios::trunc);
とするとファイル名が文字化けしていまいます、ofstreamでは日本語ファイル名が使えないのでしょうか?
プロジェクト設定をUnicode、マルチバイトどちらにしても結果は一緒でした
0095デフォルトの名無しさん
2007/07/19(木) 22:58:55だってさ
0096デフォルトの名無しさん
2007/07/19(木) 23:04:57ありがとうございます
setlocale(LC_ALL, "Japanese");
を呼ぶことで無事できました。
VCのバグっぽいですね
009794
2007/07/19(木) 23:07:460098デフォルトの名無しさん
2007/07/19(木) 23:43:15画像表示に関する質問です。
PictureBoxに複雑な画像を描写しました(Setピクセル)。
その画像に、Drawlineで線を描きました(マウスmove等を使用)。
この線を書き直したいのですが、線を消すために
DrawlineのWhitePenを使用すると、せっかく読み込んだ複雑な画像まで、
白抜きになってしまいます。
後から書き加えた線だけを消去したい場合は、
どのような方法で消去すればいいでしょうか?
ご指導お願いします。
複雑な画像を一旦保存しておけばいいのかなぁ
と思っているのですが・・・
よろしくお願いします。
0099デフォルトの名無しさん
2007/07/19(木) 23:45:05次からは、文字列には頑張って
TEXT("とりあえずTEXTつけときます")
ってしとこうな。
それがいやならリソースにしとくれ
それにしても、MBCSでも日本語きちんとコンパイルできるサービスパックを早くツクレカス>マイクロソフト
0100デフォルトの名無しさん
2007/07/19(木) 23:50:04いいかげん、海栗コードにしろよな。
0101デフォルトの名無しさん
2007/07/19(木) 23:51:13>複雑な画像を一旦保存しておけばいいのかなぁ
>と思っているのですが・・・
>よろしくお願いします。
うん。
原則として、OnDrawが呼ばれる度に操作と順番通りに書き込むのがウィンドウズの基本。
一回書く毎にピクセルを保存すると、UNDO限界回数と画像の大きさによっては
莫大なメモリが必要になるから。
010298
2007/07/20(金) 00:01:58ありがとうございます。
もしよろしければ、一旦保存する方法を教えて頂けますか?
キャプチャというのを使うのかと思ったのですが、
なかなかうまくいきません。
0104デフォルトの名無しさん
2007/07/20(金) 00:15:270105デフォルトの名無しさん
2007/07/20(金) 00:19:400106101
2007/07/20(金) 00:20:46一旦保存というのをちょっと勘違いしているかもしれない。
画像をピクセルで保存するのではなく、
白紙の状態からラインを引く関数の始点・終点・色を全て覚えさせておくのですよ。
だから、それを覚えさせるための仕組み(普通は構造体の配列とかリストなど)を作っておいて、
UNDOしたかったら、現在までの手順から1個引いたまでの手順をウインドウに書き込むということ。
例えば、ピクチャーのまま保存して、応用で10回までUNDOできるという作り方もできるが
それは↑の課題をクリアしてからじゃないかな。
今のマシンだったら、1000個程度のラインは一瞬で引けるよ。
話は変わるが、単に今の画像をキャプチャしたいのなら、Alt+PrintScreenキーでコピーして
ペイントか何かに貼り付ければいい。
残念だがPictureコントロールは使った事が無いのでプログラムでの操作は知らない。
0108デフォルトの名無しさん
2007/07/20(金) 02:05:22VCLが海栗コード対応しないんだもの(´・ω・`)
0109デフォルトの名無しさん
2007/07/20(金) 07:12:27enum 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)の部分はどのように置換されるのでしょうか?
0110デフォルトの名無しさん
2007/07/20(金) 07:20:58だから恐らく1000
0111デフォルトの名無しさん
2007/07/20(金) 07:52:49マクロってこんな事も出来たんですねぇ。
0112デフォルトの名無しさん
2007/07/20(金) 09:21:26普通は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の更新サイトでついてくる奴
使ってます。
0113デフォルトの名無しさん
2007/07/20(金) 09:34:40対象ユーザーどんだけニュータイプなんだよw
0114デフォルトの名無しさん
2007/07/20(金) 09:38:270115112
2007/07/20(金) 09:54:59ご回答thx
0116デフォルトの名無しさん
2007/07/20(金) 11:01:57その辺は微妙な話だと思う。
stdoutは端末に結び付けられている場合は行バッファリングされ、
そうでない場合はフルバッファリングされるのが伝統的実装のようだが、
規格でそうしろと決まっているわけでもないようだ。
stderrがバッファリングなしというのは決まっていたはずだが。
さらに、入力を行う際は、行バッファリングされている出力を
前もってフラッシュすることになっていたと思うが、よく分からん。
stdoutが行バッファリングされている場合に、>>112のような
コードで、改行なしのプロンプトを表示後に入力できるためには、
そうなっていなければならないのだが。
もしかしたら、>>112の環境ではstdoutがフルバッファリングされているのかもな。
確実に即座に出力を表示したい場合は、stderrを使うというのが一つの手だが、
いちいち fprintf(stderr, ...) と書きたくないのなら、
setvbuf()を使ってstdoutをバッファリングなしに設定するという方法もある。
stdoutはリダイレクトされることもあるのだから、できれば
isatty()などを用いて標準出力が端末かどうかを見たほうが良いのだが、
残念ながらこの方法は移植性があるとは言えないのが難点だ。
0117デフォルトの名無しさん
2007/07/20(金) 14:49:270118デフォルトの名無しさん
2007/07/20(金) 14:51:360119デフォルトの名無しさん
2007/07/20(金) 14:57:040120デフォルトの名無しさん
2007/07/20(金) 17:27:530121電通女 ◆v1Uy5WkQ7k
2007/07/20(金) 20:38:06struct complex{
double re,im;
};
この意味を教えてください。
0122デフォルトの名無しさん
2007/07/20(金) 20:43:17その次のダブルはその構造体の構成要素、だと思います
私はc言語暦1週間くらいなので当てにならないかもしてませんが
0123デフォルトの名無しさん
2007/07/20(金) 20:43:420124デフォルトの名無しさん
2007/07/20(金) 20:45:06構造体って習った?
0125電通女 ◆v1Uy5WkQ7k
2007/07/20(金) 20:47:290126デフォルトの名無しさん
2007/07/20(金) 20:49:57私にもわかるよww
0127電通女 ◆v1Uy5WkQ7k
2007/07/20(金) 20:53:360128デフォルトの名無しさん
2007/07/20(金) 20:57:50struct kozotai{
double a;
double b;
};
これが何か分かるならそれもわかるはず
0129デフォルトの名無しさん
2007/07/20(金) 20:58:40それだけ
0130デフォルトの名無しさん
2007/07/20(金) 21:04:39子宮で考えるんじゃない、脳で考えるんだ!!
0131デフォルトの名無しさん
2007/07/20(金) 23:26:39VC++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 が未解決です。
が発生します。
思い当たるところがあればお教えください。よろしくお願いします。
0132デフォルトの名無しさん
2007/07/20(金) 23:29:55"こんにちは、世界"でどうぞ
0133デフォルトの名無しさん
2007/07/20(金) 23:37:00別にその通りにやって普通にコンパイルできるけどな。
MSSDKをインストールしていて、そのlibディレクトリにlibcp.libとかいう
怪しいライブラリが入っていたりしない?
0134131
2007/07/20(金) 23:41:110135131
2007/07/20(金) 23:55:59誰てめえw
>>132
すいません、もう少し分かり易く・・・
"空のプロジェクト"のチェックをはずしても同様のエラーが出ました。
(そういう意味じゃなかったですか?)
>>133
確かにありました。しかしそのlibファイルをリネームしてみたり、
プロジェクトのプロパティからライブラリの無視リストに入れてみたり
しましたが変化なしでした。
133さんで問題なくビルドできるということは、自分の特有の環境が
原因ということなのでしょうか(MSSDKあたり?)。調べてみます。
0136デフォルトの名無しさん
2007/07/21(土) 00:01:04ふうん、変化なしか。
libcp.libはC++のランタイムで、本来はVC++に付属のものが使われるべきで
SDKになぜか入っていたりする怪しいのが優先参照されちゃうとマズかったりする。
てっきりそのせいかと思ったんだがな。
コマンドプロンプトからvcvars32.batを実行後に普通にcl.exeでコンパイル
するとどうなる?
0137デフォルトの名無しさん
2007/07/21(土) 00:35:42動きました!なぜ。
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++の設定の方でどこか変えてはいけない部分を
触っちゃって(かつ忘れて)いるといったところでしょうか。
0138デフォルトの名無しさん
2007/07/21(土) 00:41:58その警告はまぁオプション指定しないと普通に出るね。言われたとおりに
/EHscを指定すればよい。
後はまぁ、clで無オプションでコンパイルしたんならデバッグ版のライブラリ
じゃないから、IDEからリリースビルドでやってみるとか、
ツール→オプションでVC++ディレクトリの優先順位をチェックするとか、
プロジェクトファイルの中を見てみて、どうなってるかチェックするとか、
色々やってみるんだね。
0139デフォルトの名無しさん
2007/07/21(土) 00:52:24set CL=/EHsc /Ox /W4
程度を適当に入れとくべきだろ。
0140デフォルトの名無しさん
2007/07/21(土) 00:56:24一応動くようにはなったので、いろいろ試しつつ
何が原因だったのか調べてみようと思います。
0141デフォルトの名無しさん
2007/07/21(土) 11:34:54“Project S・K・Y” とか表記するともっとカコ(・∀・)イイ
0142デフォルトの名無しさん
2007/07/21(土) 11:35:500143デフォルトの名無しさん
2007/07/21(土) 11:36:000144デフォルトの名無しさん
2007/07/21(土) 11:37:050145デフォルトの名無しさん
2007/07/21(土) 17:22:050146デフォルトの名無しさん
2007/07/21(土) 17:26:58http://ja.wikipedia.org/wiki/%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF_%28%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%29
0148デフォルトの名無しさん
2007/07/21(土) 19:51:490149デフォルトの名無しさん
2007/07/21(土) 20:20:190150デフォルトの名無しさん
2007/07/21(土) 20:26:06No,a dolphin! Watch out!!
0151デフォルトの名無しさん
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);}
0152関数はこうなっています・・・
2007/07/21(土) 20:34:20機能 指定ファイルが UNZIP32.DLL に有効な書庫ファイルかどうか調べ、
有効であればオープンし、一意の数値(ハンドル)を返します。
以後の書庫ファイルへのアクセスはこのハンドルでおこないます。
アクセスを終了する時は UnZipCloseArchive 関数を呼ばなければなりません。
引数 hWnd UNZIP32.DLL を呼び出すアプリのウィンドウ・ハンドル。
szFileName 書庫ファイル名。
dwMode 処理モードを指定するフラグ。次の値を|(オア)で
組み合わせる。
戻り値 指定の書庫ファイルに対応したハンドル。エラー時は NULL を返します。
int WINAPI UnZipGetArcFileName(HARC hArc,LPCSTR lpBuffer,int nSize);
機能 書庫ファイル名を得ます。
引数 hArc UnZipOpenArchive() で返されたハンドル。
lpBuffer ファイル名を格納するバッファ。
nSize バッファのサイズ。
戻り値 正常終了時に0、異常時にはエラーコード(0以外)が返ります。
0153151
2007/07/21(土) 20:39:240154151
2007/07/21(土) 20:42:360155デフォルトの名無しさん
2007/07/21(土) 20:53:49現在Cのfopenやfreadなどを使っており、スコアデータはこのファイルのxx番目だからfseekで移動して読み込むといった形を取っています。
しかしこれだと、例えばDirectXのXファイルであればMeshNormalsの位置に移動して、必要な数だけ読み込むといった手段が取れません。
検索してもファイルの入出力の解説を扱っているサイト自体少なく、2行目の方法が中心で困っています。
どこか参考になるサイト、もしくは書籍はありませんでしょうか。
また、ExcelデータはC++で読み書き(データの追加・削除)はできるのでしょうか。
ファイルの入出力周りは私の持っている本ではほとんど書かれていませんでしたので放置していたのですが・・ここに来てツケがorz
0156151 本物
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);
}
0157デフォルトの名無しさん
2007/07/21(土) 20:59:2011000111101111100011
っていう文字列が与えられた時に、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がうまく反応してくれません
初歩的なミスがあると思うのですが、よろしくお願いします
0158デフォルトの名無しさん
2007/07/21(土) 21:03:180159デフォルトの名無しさん
2007/07/21(土) 21:04:560160デフォルトの名無しさん
2007/07/21(土) 21:06:230161151
2007/07/21(土) 21:09:20{
if ( buff[n] != '0' && buff[n] != '1' )
0162デフォルトの名無しさん
2007/07/21(土) 21:09:400163デフォルトの名無しさん
2007/07/21(土) 21:11:04Xファイルは知らないのでExcelだけ。
Excelのファイルは所詮ただのバイナリファイルなのだから、
C++で読み書きできないわけがない。
しかしWindows上ならプログラムからExcelを操作してやるのが楽。
データ形式を考える必要もなく、しかもオブジェクトという形で取り扱える。
ただ、その独特な仕組みに慣れる必要があるけど。
0164151
2007/07/21(土) 21:14:110165155
2007/07/21(土) 21:48:55ファイル操作関連の関数は先ほど上げたものぐらいしか知らなかったので、なんとか前進できそうです。
ツール周りをエクセルからデータを引っ張ってくるようにしようかと考えておりましたが
>>164で書かれているように拡張子を変えてやれば配布するデータにも加えれそうですね。
バイナリデータである以上、独自に形式を変えない限りユーザ側で改変するのは容易ですしね。
0166デフォルトの名無しさん
2007/07/21(土) 22:08:46サンクス!
for( n=0; buff[n] != '\0'; n++){
if ( buff[n] != '0' && buff[n] != '1' ){
printf("Error!\n");
goto endline;
}
こうだった
0167デフォルトの名無しさん
2007/07/21(土) 22:15:030168デフォルトの名無しさん
2007/07/21(土) 22:17:050169166
2007/07/21(土) 22:43:40んだば、かっこは解除させていただくの方針で
0170デフォルトの名無しさん
2007/07/21(土) 22:46:03使わないですむやつありますか
0171デフォルトの名無しさん
2007/07/21(土) 22:50:580172デフォルトの名無しさん
2007/07/21(土) 22:51:03日本語でおk
0173デフォルトの名無しさん
2007/07/22(日) 03:03:23bitset<1> a[1024];
bitset<1024> b;
cout<< sizeof(a)<<" "<<sizeof(b);
0174デフォルトの名無しさん
2007/07/22(日) 03:05:48そりゃそうだろ。でもサイズ自体は実装依存。
0175デフォルトの名無しさん
2007/07/22(日) 04:45:28int fnc(int a[10]){
a[]に対して処理をする
fnc(a);
};
0176デフォルトの名無しさん
2007/07/22(日) 05:08:33まあ、a はポインタだがな。
0177デフォルトの名無しさん
2007/07/22(日) 08:45:090で初期化されているのですか?
0178デフォルトの名無しさん
2007/07/22(日) 08:50:240179デフォルトの名無しさん
2007/07/22(日) 09:01:280180デフォルトの名無しさん
2007/07/22(日) 09:21:33おっそろしく古い太古のコンパイラとか
規格に準拠してないコンパイラとかなら知らんがな!
0181デフォルトの名無しさん
2007/07/22(日) 12:15:15K&Rのp.50
0182デフォルトの名無しさん
2007/07/22(日) 12:18:250183デフォルトの名無しさん
2007/07/22(日) 12:21:570184デフォルトの名無しさん
2007/07/22(日) 12:23:430185デフォルトの名無しさん
2007/07/22(日) 13:15:03かなり大雑把なくくりでいうと、その変数の値を変化させることができないということだ。
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 */
どっか間違ってたら訂正して
0186デフォルトの名無しさん
2007/07/22(日) 13:27:310187デフォルトの名無しさん
2007/07/22(日) 13:27:510で初期化されていることは分かりました。
これはメモリアドレスの0番地を指しているという理解で良いでしょうか。
また、この場合NULLとどこが違うのでしょうか?
自分はNULLはメモリアドレスの0番地を指していると理解していたのですが…
0188デフォルトの名無しさん
2007/07/22(日) 13:30:120189デフォルトの名無しさん
2007/07/22(日) 13:33:19それなのに0で初期化したほうがいいと推奨されているのは何故ですか?
0190デフォルトの名無しさん
2007/07/22(日) 13:36:38Express Edition ならタダ
0191デフォルトの名無しさん
2007/07/22(日) 13:40:02C++だと、関数に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を **つけることができる**
**付けなくてもコンパイルエラーにはならない。**
つまり、自分(や、保守のコーダー)に縛りを課すという意味合いがある。
0192デフォルトの名無しさん
2007/07/22(日) 13:42:130で初期化していないと
そのポインタを使って何かをしてしまったときに
予期せぬ動作をしてしまうからじゃないの?
0193デフォルトの名無しさん
2007/07/22(日) 13:42:29ポインタが 0 で初期化されるってのは、
ヌルポインタで初期化されるって意味だ。
static char* p;
は
static char* p = 0;
と同じってこと。
ポインタに 0 を代入するとヌルポインタとして扱われるから、
要するにヌルポインタで初期化されるということ。
0194デフォルトの名無しさん
2007/07/22(日) 13:43:12>>191
つまり保護のため?
0195デフォルトの名無しさん
2007/07/22(日) 13:43:24NULLで初期化するなって書いてあった?
0196デフォルトの名無しさん
2007/07/22(日) 13:51:23C++ ならこんな形で確認できる。
#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 でない同じ値が出力されると思う。
0197デフォルトの名無しさん
2007/07/22(日) 13:56:06とにかくNULLは使わない方がいいというのは解りました
ありがとうございます
0198デフォルトの名無しさん
2007/07/22(日) 13:57:530なんだが
0199デフォルトの名無しさん
2007/07/22(日) 14:02:460 になる環境もあるのかー。
0200デフォルトの名無しさん
2007/07/22(日) 14:06:160201デフォルトの名無しさん
2007/07/22(日) 14:06:27NULLは、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 が実用的に不便だったからかもしれない。
その辺はもっと詳しい人に
0202デフォルトの名無しさん
2007/07/22(日) 14:09:30あんま適当な事言わないで。
0203デフォルトの名無しさん
2007/07/22(日) 14:14:33遠慮なく訂正していいんだよ
0204デフォルトの名無しさん
2007/07/22(日) 14:14:550205デフォルトの名無しさん
2007/07/22(日) 14:19:42だというのに C で NULL を ((void*)0) と定義することが許されていたのは、
整数型へそのまま代入できてしまわないようにするためだ。
まあ警告止まりかもしれないが、ないよりゃマシだ。
何で C++ でその定義が許されなくなったかというと、
C では void ポインタから他のポインタへの暗黙のキャストが許されていたけど、
C++ ではそれを禁止するようになったからだ。
いちいち明示的なキャストが必要になるのでは困るので、
NULL は 0 と定義されるようになった。
そして、C でも C++ でも NULL が推奨されないなんて話は聞いたことがない。
ポインタを扱っているという目印になるわけで、プログラムを読みやすくする効果がある。
どんどん使えばいい。
0206デフォルトの名無しさん
2007/07/22(日) 14:30:56NULL にキャストが必要になるっつー状況がないわけではないことだ。
例えば C++ で NULL を可変個引数に渡す時とか。
そのままだと int 型の 0 が渡されてしまう。
ヌルポインタのビット表現が 0 でない環境だけじゃなく、
ポインタ型のサイズが 64 ビットで int 型のサイズが 32 ビットなんて環境(普通の 64 ビット環境)でも問題になる。
C++ においては NULL は単にプログラムを読みやすくするためだけに使われるもので、
NULL と書いたから安心だ、と思ってはいけない。
そういう意味で NULL には危険性はあるのかもしれないけど、
NULL を使わないと可読性が大きく犠牲になるから NULL を使った方がマシ。
0207デフォルトの名無しさん
2007/07/22(日) 14:51:390は単なる整数リテラルだからint型と決まっている。処理系の都合なんかではない。
C++で特別になったわけでもない。
0がポインタ型に変換できて、ヌルポインタになるのはCのときから変わっていない。
0208デフォルトの名無しさん
2007/07/22(日) 14:54:540209デフォルトの名無しさん
2007/07/22(日) 15:06:36つまり0である必要性はなく、例えばGCCでは#define NULL __nullとなっている。
__nullはポインタ型へは暗黙の変換が可能だが、整数型へ暗黙の変換を行うと警告になる独自拡張の定数。
あと、NULLではなく0でいいだろと言っているのはBjarne。
だからC++にはNULL使わない派もそれなりにいる。どれくらいいるのかは知らないけど。
少なくとも、俺もその内の1人。
0210デフォルトの名無しさん
2007/07/22(日) 15:09:31ttp://www.kouno.jp/home/c_faq/c5.html#0
0211デフォルトの名無しさん
2007/07/22(日) 15:22:00NULL使わない人もいるのか。
if(str!=NULL){
iVal = str->iHoge;
}
とかって場合でも使わないの?
ASSERT(str!=NULL);
とかも使わないの?
0212デフォルトの名無しさん
2007/07/22(日) 15:24:210213デフォルトの名無しさん
2007/07/22(日) 15:28:27つnullptr in C++/CLI
0214デフォルトの名無しさん
2007/07/22(日) 15:30:410215デフォルトの名無しさん
2007/07/22(日) 15:35:100216デフォルトの名無しさん
2007/07/22(日) 15:37:23スレ違い
0217デフォルトの名無しさん
2007/07/22(日) 15:53:320218デフォルトの名無しさん
2007/07/22(日) 15:55:150219デフォルトの名無しさん
2007/07/22(日) 16:09:04http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2214.pdf
0220デフォルトの名無しさん
2007/07/22(日) 18:12:270221デフォルトの名無しさん
2007/07/22(日) 20:19:03同じですか??
0222デフォルトの名無しさん
2007/07/22(日) 20:31:57抽象度が違う。
アドレス < ポインタ < イテレータ
アドレスはポインタとして使えるし、ポインタはイテレータとして使える。
0223デフォルトの名無しさん
2007/07/22(日) 20:33:450224デフォルトの名無しさん
2007/07/22(日) 20:41:34必要が出てきたとき、もっとも使われていないものを閉じて、新しく開く
というコードはどうやったらいいですかね???
0225デフォルトの名無しさん
2007/07/22(日) 20:53:162:新潟中越沖地震の救援基金に5万円振り込む
のどちらか
0226デフォルトの名無しさん
2007/07/22(日) 20:57:060227224
2007/07/22(日) 21:05:28使われた順に、ファイル名とポインタを整列させようとしたんですけど・・
ファイルポインタがコピー出来ません・・・
0228デフォルトの名無しさん
2007/07/22(日) 21:13:30前も誰か言ってたけど、0はCの頃から整数0ですよ。
必要なときにヌルポインタに暗黙のキャストされるだけですよ。
0229244
2007/07/22(日) 21:14:15ひらっきっぱなしにするとエラーになってしまいます・・・
互換性を保つため10個までにしたいのですが・・
いい方法ないですか??
0230デフォルトの名無しさん
2007/07/22(日) 21:26:42A::A(){ char *i = new char ; }
int main(){ A a* = new A; delete a ; return 0 ; }
こういった場合でもメモリは開放されるのでしょうか?
0231デフォルトの名無しさん
2007/07/22(日) 21:29:55i が行方不明になってメモリリークが発生する。
これは静的に A のインスタンスを作っていたとしても変わらない。
A のデストラクタの中で delete を呼び出すべき。
0232230
2007/07/22(日) 21:33:210233デフォルトの名無しさん
2007/07/22(日) 21:33:470234デフォルトの名無しさん
2007/07/22(日) 21:36:01>ファイルポインタがコピー出来ません
詳しく書いてみ?
0235デフォルトの名無しさん
2007/07/22(日) 21:36:100236デフォルトの名無しさん
2007/07/22(日) 22:19:290はCの頃からヌルポインタ定数ですよ。
0237デフォルトの名無しさん
2007/07/22(日) 22:21:240238デフォルトの名無しさん
2007/07/22(日) 22:24:150はヌルポインタ定数に変換できるというだけだろ。>>210
0239デフォルトの名無しさん
2007/07/22(日) 22:31:09その言い方はおかしい。
0 を含めて整数の 0 と評価される定数式(C 限定で、それを void* にキャストしたもの含む)が
ヌルポインタ定数。ヌルポインタ定数はポインタとして使われた場合にヌルポインタに変換される。
0240デフォルトの名無しさん
2007/07/22(日) 22:36:09とかをコンパイル時に計算して、4をコードに埋め込んでしまうコンパイラも
あるが、こういうのって定数式なのかしら?
0241デフォルトの名無しさん
2007/07/22(日) 22:40:010242デフォルトの名無しさん
2007/07/22(日) 22:41:47文字列を細切れにぶったぎって
それを再び結合したりするわけですが
しばしばその文字列はもとより長くなったりしますので
マジメにやろうとするとメモリ管理だの何だのが
とてもめんどうくさく、しかも適当にやると
ヘタをするとPerlのほうが速かったりするかと思います
効率よく楽なほうほうは何かありますか
ロープというデータ構造は結合が鬼のように早いと聞きますが
ロープに対して使える正規表現ライブラリなど寡聞にして知りません
え?C++を使え?実におっしゃるとおりですね
0243デフォルトの名無しさん
2007/07/22(日) 22:42:33ありがとう
ということは、そのようなものがコンパイラの最適化によってゼロに
化ける場合は、ヌルポ定数とは扱われない
ということかしら
0244デフォルトの名無しさん
2007/07/22(日) 23:01:22関数呼び出しは定数式に含まれないことになってる。
0245デフォルトの名無しさん
2007/07/23(月) 00:00:41じゃあ、引数不定個の関数で、0がintとして渡されるのは
なんででしょうねえ。
printf("%d %d %s", 0, 0, 0)
64bit環境向けにコンパイルすると
全部intの0として扱われてることが明白ですよ。
何か変ですか?それともあなたが変ですか?
0246デフォルトの名無しさん
2007/07/23(月) 00:09:040247デフォルトの名無しさん
2007/07/23(月) 00:55:180248デフォルトの名無しさん
2007/07/23(月) 01:03:410249デフォルトの名無しさん
2007/07/23(月) 01:38:560250デフォルトの名無しさん
2007/07/23(月) 01:43:25マクロ NULL を使うべきかどうかってんなら間違いなく宗教論争だけど。
0251デフォルトの名無しさん
2007/07/23(月) 02:06:460253デフォルトの名無しさん
2007/07/23(月) 13:48:26でも、規格票を読んでもこのことがどこに書いてあるのか見つかりません。
どこに書いてあるのかご存知の方はいますか?
0254デフォルトの名無しさん
2007/07/23(月) 13:55:250255デフォルトの名無しさん
2007/07/23(月) 13:56:110256デフォルトの名無しさん
2007/07/23(月) 14:02:020257デフォルトの名無しさん
2007/07/23(月) 16:07:430258デフォルトの名無しさん
2007/07/23(月) 16:28:49「〜は未定義である」って書いてあることもあるんだぞ?
0259デフォルトの名無しさん
2007/07/23(月) 16:38:210260デフォルトの名無しさん
2007/07/23(月) 17:18:480261デフォルトの名無しさん
2007/07/23(月) 17:24:04>>253は未定義も全部書いてあると思ってるみたいだし。
0262デフォルトの名無しさん
2007/07/23(月) 17:36:190263デフォルトの名無しさん
2007/07/23(月) 17:45:200264デフォルトの名無しさん
2007/07/23(月) 18:02:16一番関係ありそうなのが、3.8 オブジェクトの生存期間。
3節目の「この規格全体を通じて、オブジェクトの特性についての規定は、
生存期間中のオブジェクトに対してだけ適用される。」という一文を見付けたので精一杯。
0265デフォルトの名無しさん
2007/07/23(月) 18:09:070266デフォルトの名無しさん
2007/07/23(月) 18:44:02UTFがよめないです
なぜか全角と機械語みたいなのが入ります
どうすればいいんでしょうか
英数字のみのテキストなんですが
0267デフォルトの名無しさん
2007/07/23(月) 18:47:510268デフォルトの名無しさん
2007/07/23(月) 18:48:080269デフォルトの名無しさん
2007/07/23(月) 18:49:230270266
2007/07/23(月) 18:58:11これなんですが
UTF16でないと読めません
0271266
2007/07/23(月) 19:00:010272デフォルトの名無しさん
2007/07/23(月) 19:04:21DLLやSTLなどありませんか???
0273デフォルトの名無しさん
2007/07/23(月) 19:05:58見てないけどBOMじゃないかな?
0274デフォルトの名無しさん
2007/07/23(月) 19:08:05nkf32.dllを通す事にしました
http://www.vector.co.jp/soft/win95/util/se295331.html
0275デフォルトの名無しさん
2007/07/23(月) 19:11:310276デフォルトの名無しさん
2007/07/23(月) 19:13:51WTL使っていいんならCA2Wに渡すだけでおk
0277デフォルトの名無しさん
2007/07/23(月) 19:15:29なるほど・・・。
ヌルポインタを使った場合はオブジェクトが存在しないから、
メンバ関数呼び出しに関する規定はヌルポインタを使った場合には適用されない・・・と。
確かにそう考えることもできそうな感じではありますね。
0278デフォルトの名無しさん
2007/07/23(月) 19:21:10汎用性が良くなるため、MultiByteToWideCharでいきます
サンクス!
0279デフォルトの名無しさん
2007/07/23(月) 21:05:00自分で定義した構造体を送受信したいのですが
sendto()/recvfrom()関数はchar配列を送受信するための引数を持っています
どうすればできるのでしょうか
0280デフォルトの名無しさん
2007/07/23(月) 21:06:29自分で定義した構造体を送受信したいのですが
sendto()/recvfrom()関数はchar配列を送受信するための引数を持っています
どうすればできるのでしょうか
0281デフォルトの名無しさん
2007/07/23(月) 21:07:450282デフォルトの名無しさん
2007/07/23(月) 21:59:54http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232
0283デフォルトの名無しさん
2007/07/23(月) 22:15:28何でそういう質問をするのか、まずはっきりさせましょう。
キャストを使ってダメだったということ?
それとも(char *)型に直す方法が分からなかったってこと?つまり、キャストを知らなかったということ?
それとも(char *)に直せたけど、受け取り側で値が変になったということ?
0284wolf ◆8VH3XAqjlU
2007/07/23(月) 23:07:57>>229
LRUのサンプル
↓
http://blogs.yahoo.co.jp/mocchi_2003/34182175.html
0285デフォルトの名無しさん
2007/07/23(月) 23:26:11受信するときに実行時にエラーがでます。
受信するとき、受信されたデータはchar[]に入るようになっています。
char recvdata[1024];
recvfrom(socket, recvdata, sizeof(recvdata), 0, ......);
char*で宣言すると、実行時にエラーがでます。
0286デフォルトの名無しさん
2007/07/23(月) 23:29:41送信してから受信するまでの間に領域が開放されたりしてない?
0287デフォルトの名無しさん
2007/07/23(月) 23:43:12それはどういう意味ですか??
0288デフォルトの名無しさん
2007/07/23(月) 23:48:11まず、構造体のアライメントを調べたか?
送信側のマシン・・・アライメント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等でメモリを確保していれば。
0289デフォルトの名無しさん
2007/07/23(月) 23:51:07>>288が詳しそうなんでそっちにまかせた!
socketってのを使ったことがないんで憶測ですまん。
構造体をローカルのchar配列に入れてsendto呼んで、
送信関数終了時にchar配列が開放されて受信側があぼーん。
とかなのかな?って思ったんだが、sendtoの仕様次第じゃ問題ないな。
0290デフォルトの名無しさん
2007/07/24(火) 00:08:25構造体の大きさは同じでした。
mallocしたことでエラーはでなくなりましたが、値が変わってしまいます。
struct Test{
int a;
char c;
};
で、aに0をいれて送信すると、受信後は3801416となってしまいます
0291デフォルトの名無しさん
2007/07/24(火) 00:20:47で、第三引数に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の値が狂います
0292デフォルトの名無しさん
2007/07/24(火) 00:25:410293デフォルトの名無しさん
2007/07/24(火) 00:27:18buf->aの値は?
0294デフォルトの名無しさん
2007/07/24(火) 00:37:31ですが、もう一つ問題が浮かび上がってきました。
Test構造体の、aの値は狂わずに受信できてますが、cの値が変わってしまいます。
何を代入しても、送るとxになります。
0295デフォルトの名無しさん
2007/07/24(火) 00:39:120296デフォルトの名無しさん
2007/07/24(火) 00:39:200298デフォルトの名無しさん
2007/07/24(火) 00:46:38>288が居なくなってかなり心細いんだが、socket知ってる人いねぇの?w
構造体のアライメントが悪さしてるようにしか思えないんだけど、
それは大丈夫だったんだよね?
int a;
char c[4];
だったらどうなるの?
0299デフォルトの名無しさん
2007/07/24(火) 01:06:14ネットワークでの送受信に構造体を直接使うのは薦められないのだが、
それについては言わないことにする。
・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;
でよい。
0300299
2007/07/24(火) 01:18:28> testp = (Test*)data;
アーキテクチャによってはバスエラーになるな。
char[]で受け取りたいなら、
union {
data[sizeof(Test)];
Test test;
} u;
などとして、u.dataに受け取ってu.testを使うほうがよいだろう。
正確には規格準拠ではないが。
それを考えれば、やはりTest型で直接受けるほうがよい。
0301デフォルトの名無しさん
2007/07/24(火) 01:30:47スタックダンプって
「メモリのスタック領域に記憶された変数や関数のアドレスを
吐き出すことって」
であってます??
0302デフォルトの名無しさん
2007/07/24(火) 01:33:05吐き出されるのはそのアドレスのデータじゃないのか?
0303デフォルトの名無しさん
2007/07/24(火) 01:49:27ありがとうございました。えーと、吐き出されるのは
スタック領域のアドレス 呼ばれる関数名 呼ばれる関数のアドレス
てな感じですか?
0304デフォルトの名無しさん
2007/07/24(火) 01:52:34それを参考に辿ってみたら、こんな質問を発見しました。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#315
ここでは 9.3.1 で明確に未定義と述べられているとしていますが、
個人的には 9.3.1 は根拠とするには薄い気がします。
その後に書いてある左辺値→右辺値変換の方が明確な根拠に思えます。
p->f() は (*p).f() に変換され、. の左項は右辺値であることから、
左辺値から右辺値への変換(ヌルポインタの参照)が行われ、結果未定義動作となる、
という流れの方が自然なのかなあ、と。
情報ありがとうございました。
0305デフォルトの名無しさん
2007/07/24(火) 02:13:49スタックダンプって↓みたいなやつだよね?
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.........
一般的にスタックに詰まれるのはローカル変数、関数の引数・戻り値、関数の戻りアドレスとかかな?
とはいえ、最適化されたら何がどういう順番で詰まれるかなんてアセンブラ見ないとわかんなくなるよ。
0306デフォルトの名無しさん
2007/07/24(火) 04:22:18Javaとかのstacktraceとはまた違いそうだし。
で、sendtoのバッファのアドレスをわざわざchar*にキャストしてるのは何なんだいったい。
void*を受け取るんだから、そのまま渡せよ。
memsetする時にmemset((char*)data, 0, sizeof(data))とかするバカいないだろ。
0307デフォルトの名無しさん
2007/07/24(火) 10:21:35sendto(SOCKET, char*, int, ........)だよ sendtoはvoid*使わない
0308デフォルトの名無しさん
2007/07/24(火) 10:25:09void*が適切に使われていないから、いたるところで
(struct sockaddr*)とかやらないといけないし。
0309デフォルトの名無しさん
2007/07/24(火) 15:33:36マイクロソフトのVS2003.NET C++なのです。
VS2005のC#では
Debug.Print("debug");
というデバグ表示ができますが、これに相当するものはあるでしょうか?
知ってる方、ご教示願います。
0310デフォルトの名無しさん
2007/07/24(火) 15:42:340311デフォルトの名無しさん
2007/07/24(火) 15:45:05>>310のOutputDebugStringはAPIだからどこでも使えるけど
MFC使ってるならTRACEマクロが簡単。
0312309
2007/07/24(火) 16:26:49どうもありがとうございます。私とても助かたです。
MFCは使っていないためTRACEマクロは使用できませんでしたが、OutputDebugStringの
方は使うことができました。こちらを使用したいと思います。
OutputDebugString(_T("HOGE\n"));
0313デフォルトの名無しさん
2007/07/24(火) 16:27:450314デフォルトの名無しさん
2007/07/24(火) 17:54:01あるいは、
int foo;
namespace {
int foo;
}
のときグローバル、無名名前空間それぞれのfooを指定するために用いる構文が知りたいのです
0315デフォルトの名無しさん
2007/07/24(火) 19:03:07MFC とは無関係な _RPT0, _RPT1,_RPT2,_RPT3,_RPT4 というマクロもありますよ。
0316デフォルトの名無しさん
2007/07/24(火) 19:04:53ない。
そもそも、そんな同じ名前の変数をみだりに宣言するのはどうかと思う。
どうしても作りたいなら、も1つ名前空間作れ。
int foo;
namespace {
namespace Local {
int foo;
}
}
0317デフォルトの名無しさん
2007/07/24(火) 21:09:52\a(ビープ音)などのエスケープシーケンスを使ったとき、普通の動作をせず、
コンソールに□とだけ表示されるので、エスケープシーケンスを利用した
プログラムが上手く作れずに困っています。(何故か\nは上手くいく
ググったり、設定をいじくり回したり色々やってみたのですが、解決できません。
普通の動作をさせるようにできるんですか?もしできるなら教えてください。
0318デフォルトの名無しさん
2007/07/25(水) 00:32:110319デフォルトの名無しさん
2007/07/25(水) 00:33:04class CDialog {
public:
CDialog(): hDlg(0) {}
最後のところがわかりません。コンストラクタ? なんで空メソッド?
0320デフォルトの名無しさん
2007/07/25(水) 00:35:270321デフォルトの名無しさん
2007/07/25(水) 00:35:32http://www.freewebs.com/nicophoto/?/@
0322デフォルトの名無しさん
2007/07/25(水) 00:40:44なるほど。hDlgってのはHWND型なんでそうかもしれません。
しかし、こんな記述法あるんですか?
0323デフォルトの名無しさん
2007/07/25(水) 00:42:49あるよ。コンストラクタで入門サイトめぐってみては?
ところで、この書き方って一般的なの?俺は{}内に書くことが多いんだが。
0325デフォルトの名無しさん
2007/07/25(水) 00:48:47なるほど、コンストラクタ初期化子っていうんですね。初めて知りました。僕の見た限りでは初期化数はみんな( )内に書いてるようです。
0326デフォルトの名無しさん
2007/07/25(水) 00:49:04極めて一般的に使われる。
HWND(基を辿ればポインタ型)のような組込型ではどうでもいいが、
クラスオブジェクトの場合、こうでしか
非静的メンバのコンストラクタを呼び出せないので大変重要。
0327デフォルトの名無しさん
2007/07/25(水) 00:52:43全く出来ません
tring型をwchar_t に変換する方法教えてください
0328デフォルトの名無しさん
2007/07/25(水) 01:04:47http://hw001.gate01.com/eggplant/tcf/cpp/wchar_t_trap.html
おまけが参考になる。
http://hw001.gate01.com/eggplant/tcf/cpp/strcnv.hpp
0329デフォルトの名無しさん
2007/07/25(水) 01:14:510330デフォルトの名無しさん
2007/07/25(水) 01:16:400331デフォルトの名無しさん
2007/07/25(水) 01:25:05fork(),exec() @Unix
0332デフォルトの名無しさん
2007/07/25(水) 01:43:15スマン、いろいろ回ってみたがわからん部分が多々でてきたOTL
コンストラクタ初期化子を使う1つの理由としてデフォルトコンストラクタ以外を
使用してメンバ変数を初期化したい場合に必要ということでいいのかな?
あと、参照メンバ変数がコンストラクタ初期化子でしか初期化できないという
理由もよくわからんかった・・・まだまだ修行が足らんようです。
0333デフォルトの名無しさん
2007/07/25(水) 02:08:21全部参照先へのオブジェクトコピーになるから、
初期化後に参照先を変えることはできないってこと
0334デフォルトの名無しさん
2007/07/25(水) 02:22:35なるほど。
参照をポインタの延長として理解しようとするからダメなんだよな。
int *p = NULL;として初期化時は何も指していないポインタに後でアドレスを代入する
というのは参照では出来ない。
参照変数は宣言と同時に初期化する必要がある。
宣言時に初期化しなければいけない理由等が>333のとおり。
メンバ変数の場合は、その初期化にコンストラクタ初期化子を使用する。
というよりそこで初期化しなければならないし、そこでしか出来ない。
語弊があるかもしれんがこんな感じかな。
0335デフォルトの名無しさん
2007/07/25(水) 02:33:220336デフォルトの名無しさん
2007/07/25(水) 03:10:33array[8] = {0} は 初期化ができるのに
array[2][4] = {0} とすると、怒られる
2次元以上の時に初期化しようとすると
怒られるのはどうしてですか?
0337デフォルトの名無しさん
2007/07/25(水) 03:16:59エラーメッセージは何て言ってる?
0338デフォルトの名無しさん
2007/07/25(水) 03:23:30参照に限らず、メンバ変数の初期化はコンストラクタ初期化子でしかできない。
これを理解するためにも、まともに C++ を使い続けるためにも初期化と代入の区別を
しっかり理解する必要がある。
0339デフォルトの名無しさん
2007/07/25(水) 03:24:550340デフォルトの名無しさん
2007/07/25(水) 03:28:16それ、初期化じゃなくて代入してるんじゃね?
0341デフォルトの名無しさん
2007/07/25(水) 03:36:300342デフォルトの名無しさん
2007/07/25(水) 03:46:25こんどはちゃんとエラーメッセージもいっしょに持ってこようね。
0343デフォルトの名無しさん
2007/07/25(水) 06:04:20array[2][4] = {{0}, {0}};
0344デフォルトの名無しさん
2007/07/25(水) 06:20:34この場合
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 を付けるか/付けないかだけで、このように変化するのか分かりません…
0345デフォルトの名無しさん
2007/07/25(水) 06:29:40constは変更できないって意味だからでは
むしろrr=456でエラーがでそうだけど、
そんな後付け参照までフォローはしないのかな
0346344
2007/07/25(水) 06:33:35VC++とg++で試してみると、両者ともエラーになりました…
エラー内容は「int &rr = r; のところで const int & から int & にできない」という感じでした。
BCBだと
[C++ 警告] Unit1.cpp(12): W8028 'rr' を初期化するために一時変数を使用する
っていう警告が出ました。
BCBが特殊なのかな…
0347デフォルトの名無しさん
2007/07/25(水) 08:18:53Borland のが腐ってる。
0348317
2007/07/25(水) 08:59:52CDTに限ったことでは無いようです(OSの問題かな?)まあ色々分かったので
もうちょっと調べていこうと思います。cの問題では無かったですね;すみません。
0349デフォルトの名無しさん
2007/07/25(水) 09:00:190350デフォルトの名無しさん
2007/07/25(水) 09:06:13const int& r = 1;
といったことができるが、
この時はテンポラリオブジェクトが作られて、それへの参照が作られる。
昔は const なしでもこういうことができることがあった。
規格がまだ整理されてなかった時代だったからなのか、独自の拡張だったのかは知らんが。
ここではそれが起こってるんだろう。
0351デフォルトの名無しさん
2007/07/25(水) 12:16:56fopen_sってGCCみたいなVC以外の環境でも普及していて普通に使えるのでしょうか?
0352デフォルトの名無しさん
2007/07/25(水) 13:08:38ぜんぜん普及してないです。VC++だけ。
0353デフォルトの名無しさん
2007/07/25(水) 13:16:590354デフォルトの名無しさん
2007/07/25(水) 13:24:54また、標準規格に盛り込まれれば、glibc辺りにも実装されるだろう。
0355デフォルトの名無しさん
2007/07/25(水) 13:56:24本とかサイトとかで一人で勉強してもある程度身につくものでしょうか?
0356デフォルトの名無しさん
2007/07/25(水) 14:18:270357デフォルトの名無しさん
2007/07/25(水) 14:24:380358デフォルトの名無しさん
2007/07/25(水) 14:29:55char c[100];
string s;
sprintf(c,"%f",d);
s=(string)c;
0359デフォルトの名無しさん
2007/07/25(水) 14:32:30ありがとうございます。
やはりこの方法しか無いんですね。
itoa()みたいな便利なのあればいいなぁと思ってググったんですが
見つけられませんでした。
0360デフォルトの名無しさん
2007/07/25(水) 14:36:540361デフォルトの名無しさん
2007/07/25(水) 14:38:39これを先頭へコピペして仕え
0362デフォルトの名無しさん
2007/07/25(水) 14:40:55itoa()と違って小数点以下何桁、とか指定することが多いと予想されるからな
0363デフォルトの名無しさん
2007/07/25(水) 14:46:36そうなんですか
ありがとうございます
0364デフォルトの名無しさん
2007/07/25(水) 14:51:02つ std::stringstream
つ boost::lexical_cast
つ boost::format
0365デフォルトの名無しさん
2007/07/25(水) 14:58:19とのエラーで苦しんでいます。よろしければ助言お願いいたします。
==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
=================================================
↓続く
0366デフォルトの名無しさん
2007/07/25(水) 14:58:55namespace 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
=================================================
0367デフォルトの名無しさん
2007/07/25(水) 15:00:44error C2027: 認識できない型 'name::B' が使われています。
とのエラーが出てきてコンパイルできません。
どうか助言の方、よろしくお願いいたします。
0368デフォルトの名無しさん
2007/07/25(水) 15:02:58class A_Deriv : public A_Base
です、記述ミスですすみません。
0369デフォルトの名無しさん
2007/07/25(水) 15:09:31A.h を頭から順に読んでいったコンパイラさんは、
メソッド B::getA_Base() の存在を知ることができない。
0370デフォルトの名無しさん
2007/07/25(水) 15:16:33クラス定義の直後にinline付きで定義されたものとして扱われる。
つまりA_Derivはこう書いたのと同じに扱われる。
class A_Deriv : public A_Base
{
public:
void func();
};
inline void A_Deriv::func() { getB()->getA_Base(); }
ところが、この時点ではclass B;という前方宣言しかないため、
Bに関する具体的な情報がわからない。それで367のエラーになってしまう。
解決するには、A_Deriv::funcの定義をBの定義より後に回せばいい。
例えば、A.hとB.hをインクルードするcppファイルでA_Deriv::funcを定義したり、
A_BaseとBを同じヘッダで定義して、そのヘッダの一番下に
インラインでA_Deriv::funcを定義するなどの方法がある。
0371365
2007/07/25(水) 16:17:52>>370
早速の返答ありがとうございます。
かき方がとても悪かったです、A_Deriv::func()は実際はcppの方に実装してあります。
そして、A_Deriv::func()の実装したcppでのincludeをA.h B.hともにして通りました(A.hのみincludeしていた状態でした)
とてもバカなミスでした。お手数おかけしました。どうもありがとうございました!
0372デフォルトの名無しさん
2007/07/25(水) 18:01:38どこのGCCの話をしてるんだ?
Win以外じゃ主流なんだが・・・
0373デフォルトの名無しさん
2007/07/25(水) 18:05:11かわいそうな子に触らないで
0374353=372
2007/07/25(水) 18:22:020375デフォルトの名無しさん
2007/07/25(水) 19:01:38入らないといけないんですか?
0376デフォルトの名無しさん
2007/07/25(水) 19:05:270377デフォルトの名無しさん
2007/07/25(水) 19:08:49ぬるぽ
文字じゃなければ別に\0入ってなくていい。
文字列だと文字の終わりがわからんから。
文字表示するとき、1個ずつ文字を調べて'\0'まで描画するみらいなルールがあるの
0378デフォルトの名無しさん
2007/07/25(水) 19:19:540379デフォルトの名無しさん
2007/07/26(木) 10:13:100380デフォルトの名無しさん
2007/07/26(木) 11:42:25mkstemp()
が使いたいのですが、どうしたらいいでしょうか?
0381デフォルトの名無しさん
2007/07/26(木) 11:59:03それは諦めて、標準ライブラリ関数のtmpnamやtmpfileを使う。
0382デフォルトの名無しさん
2007/07/26(木) 12:02:020383デフォルトの名無しさん
2007/07/26(木) 12:12:44つCygwin
VC++で使えないだろうけどね。
0384デフォルトの名無しさん
2007/07/26(木) 15:14:57#include <windows.h>
#include <sys/stat.h>
#include <io.h>
int mkstemp(const char *templ) {
char *buffer;
DWORD length;
char filename[MAX_PATH];
length = ::GetTempPathA(0, NULL);
buffer = (char *)malloc(length);
GetTempPathA(length, buffer);
if (GetTempFileNameA(buffer, templ, 0, filename) == 0) {
free(buffer);
return -1;
}
free(buffer);
return open(filename, _S_IEXEC);
}
0385デフォルトの名無しさん
2007/07/26(木) 15:19:57その最高点と平均点を求めるプログラムを書いたのですが、なぜか平均点がうまく出ません・・・。
どこが悪いのでしょうか。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4757.txt
0386デフォルトの名無しさん
2007/07/26(木) 15:30:160387デフォルトの名無しさん
2007/07/26(木) 15:35:23・・・・・orz
すいませんホントありがとうございます・・・。自分ではなかなか気づかないものですね・・・。
0388デフォルトの名無しさん
2007/07/26(木) 15:39:47普通のコンパイラなら警告を出してくれると思うのだが。
0389デフォルトの名無しさん
2007/07/26(木) 15:40:140390デフォルトの名無しさん
2007/07/26(木) 15:42:47for (i=0; i<3; i++) {
switch (i) {
case 0 : printf("[国語]最高点 : %d\n", max[i]);
--
激しく間が抜けたコードだな。そこまでループに拘るなら文字列も動的に作ればいいものを。
0391デフォルトの名無しさん
2007/07/26(木) 15:43:53え? 今時出せないコンパイラなんてあったの?
すまん、私が物を知らないらしい。
0392デフォルトの名無しさん
2007/07/26(木) 15:44:51じゃあ、その出すコンパイラと出る例をあげてくれないか。
0393デフォルトの名無しさん
2007/07/26(木) 15:46:180394デフォルトの名無しさん
2007/07/26(木) 15:48:18この文字列が変数だったら検出できんのかね?
0395デフォルトの名無しさん
2007/07/26(木) 15:49:35for (ic = 0; ic < sizeof(subjs) / sizeof(* subjs); ++i) {
printf("[%s]最高点:%d\n", subjs[ic], ave[ic]);
}
とか? そこまで凝らなくても良さそうだが。
#でもそれならループにしなくてもって話になるか。
0396デフォルトの名無しさん
2007/07/26(木) 15:50:33puts()などに置換さえするが、gcc以外でそういうことをやる
コンパイラを俺は知らないな。
昔はそういうのはlintのやる仕事ということになっていた。
0397デフォルトの名無しさん
2007/07/26(木) 15:51:09iccも同じようなことしてきたよ。勿論変数なら検出できないだろうけど、フォーマット文字列を
動的生成する香具師もそうそういないから(いてもその場合どうせトリッキーだし)実質問題なかろう。
0398デフォルトの名無しさん
2007/07/26(木) 15:51:53文字列のリストなら、最後に番兵のNULLをつけるほうが俺は好き。
そのほうがコードが綺麗になるしリンケージを超えてもおk。
0399デフォルトの名無しさん
2007/07/26(木) 15:52:26stringオブジェクトに%sも出るのかなー、試してみるか。
0400デフォルトの名無しさん
2007/07/26(木) 15:53:27scanf()系だと、*の働きがprintf()と違うから、動的にフォーマット文字列を
生成したくなることは案外多い罠。
0401デフォルトの名無しさん
2007/07/26(木) 15:53:52僕も君が好きだよ
0402デフォルトの名無しさん
2007/07/26(木) 15:54:30その場合、配列要素数に使えない。
>395の方法なら、double ave[sizeof(subjs) / sizeof(* subjs)]という使い方もできる。
つまり、教科数に依存するマジックナンバーを全廃できるわけで。
#そこまで凝らなくても云々
0403デフォルトの名無しさん
2007/07/26(木) 18:00:41この例のような線形探索をするだけなら番兵で十分で、配列要素数は不要だし、
マジックナンバーも要らないって話でしょ
0404デフォルトの名無しさん
2007/07/26(木) 18:14:33open()の第二引数が抜けてるし、テンポラリファイルをclos()しても削除されない
んじゃないか
0405デフォルトの名無しさん
2007/07/26(木) 19:33:50sizeof subjs / sizeof *subjs - 1
0406デフォルトの名無しさん
2007/07/26(木) 19:35:160407デフォルトの名無しさん
2007/07/26(木) 19:56:22どうにか纏めたいんですがどう修正したらよいか迷ってます。
Singletonで状態を返すクラス作ろうかなとか思ったり
単に構造体に纏めようかなと思ったり。
みなさんはどうしてますか。
0408デフォルトの名無しさん
2007/07/26(木) 20:09:050409155
2007/07/26(木) 22:38:49なんとか辿り着いたのが
ttp://www.ujasiri.com/prglib/vc/excel/vc_excel.html
このサイトなのですが、時間が無く、サンプルのエラー外しで一杯一杯orz
私はDirectXのゲームに対しての作成サポートツールや、ゲーム自体のデータをExcel(のデータ形式)からやり取りしようと考えております。
他の手段で解説しているサイトが見つからないのですが、ここのサイトに書かれていることで宜しいのでしょうか。
Excelを持っていない人がゲームをしても問題ないかとか、読み込みが非常に重いとか心配しています。
0410デフォルトの名無しさん
2007/07/26(木) 22:46:09少なくともそこのエラーチェックだけはきちんとしておけ。
0411デフォルトの名無しさん
2007/07/26(木) 22:53:35ビットフィールド使えよ
0412155
2007/07/26(木) 22:58:41おろ、ということはユーザにExcelデータを読み込ますようなゲームは作るべきではないということでしょうか。
検索しても解説しているサイトが中々見当たらないのはそのためか・・orz
0413デフォルトの名無しさん
2007/07/26(木) 23:18:28CSVやテキストや独自バイナリでまず作っておけよ
0414デフォルトの名無しさん
2007/07/26(木) 23:19:08動作が鈍くなるだろ
0415デフォルトの名無しさん
2007/07/26(木) 23:22:40⊂⌒ヽ (⌒⊃
\ \ /⌒ヽ / /
⊂二二二( ^ω^)ニニ二⊃
\ \_∩_/ /
( (::)(::) )
ヽ_,*、_ノ ブーン
///
///
0416155
2007/07/26(木) 23:34:05パーツのステータス管理(耐久度とか説明文)をExcelを使えば編集がしやすいかと思って実装しようとしています。
なるほど、エクセルから独自形式へのコンバートをこちらでしてしまえば、
ユーザは独自形式を読み込むだけなのでExcelが無いと動かないような症状にはなりませんね。
0417デフォルトの名無しさん
2007/07/26(木) 23:37:11その「編集」をするのはユーザなのか、お前さんなのか、プログラムなのか、どれだ
ユーザに編集させるんなら、Excelがインストールされているのが当然前提になる
自分なら、CSVなりTSVなりプログラムで扱いやすい形式でセーブしてやれば
いいだろ
読み込む仕事はずっと楽で高速だ
プログラムが内部的に扱うだけなら、バイナリでもいい
0418デフォルトの名無しさん
2007/07/27(金) 01:16:53Excelからの読み込みようデータでテキスト(もしくはバイナリ)出力を
VBAで書いてもいいんじゃない?
セルの値をファイルに出力するくらいならVB未経験でも
ちょっと勉強すればできるようになると思うよ。
0419デフォルトの名無しさん
2007/07/27(金) 01:44:55xlsを書き出す必要がある時以外は使いたくないな
0420デフォルトの名無しさん
2007/07/27(金) 09:08:25一つのプロジェクト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をつけたいのです。
0421デフォルトの名無しさん
2007/07/27(金) 09:26:18共通のものを読まないと意味が無いんだよ。
stdafx.hの中で差があるものを別のヘッダかソースに入れてしまえば。
もしくはプリコンパイルヘッダーの使用をやめてstdafx.hのインクルード自体やめるとか
0422デフォルトの名無しさん
2007/07/27(金) 10:37:40C:\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
プリコンパイルヘッダーの知識がほとんどないので勉強してみます。
0423デフォルトの名無しさん
2007/07/27(金) 10:55:420424デフォルトの名無しさん
2007/07/27(金) 11:02:04http://www.linux.or.jp/JM/html/LDP_man-pages/man3/pow.3.html
0425デフォルトの名無しさん
2007/07/27(金) 11:03:06x**y
0426デフォルトの名無しさん
2007/07/27(金) 11:04:06yのx乗だった
y**x
0427デフォルトの名無しさん
2007/07/27(金) 11:08:010428デフォルトの名無しさん
2007/07/27(金) 11:09:490429デフォルトの名無しさん
2007/07/27(金) 11:10:220430デフォルトの名無しさん
2007/07/27(金) 11:19:25#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
0431デフォルトの名無しさん
2007/07/27(金) 11:21:27即レスありがとうございます。
mathが必要でしたか・・・for文でなんとかするかorz
>>425-426
ぷぎゃーwww
ちょっと信じかけた俺、涙目ノシ
0432デフォルトの名無しさん
2007/07/27(金) 11:29:50今はwhileでget使って1バイトずつ読み込んでるんだが、いかんせん時間がかかって仕方ない
もっと高速にやる方法って何かあるかな?
初心者なりに考えてみたけれどさっぱり思いつかない・・・
0433デフォルトの名無しさん
2007/07/27(金) 11:32:55CSVならまず1行ずつ読んでみては。
0434デフォルトの名無しさん
2007/07/27(金) 11:35:28csvなら1行ずつ読むだろ……常考
まさか読み込んだ結果も丸ごとオンメモリで保持してないよな。
メモリ量にも拠るが、場合によってはデータの持ち方の工夫も必要かもよ。
0435デフォルトの名無しさん
2007/07/27(金) 11:36:12ファイルに実際には書き込むことなく、希望の長さのファイルを作る方法はないでしょうか。
chsizeは拡張部分を0で埋めます。
seekg + fwrite でできるかもと思いましたが、長さ0の書き込みでは
ファイルが期待した長さになりません。
0436デフォルトの名無しさん
2007/07/27(金) 11:49:00文字列処理の部分も疑ってかかるべきだが、IOの部分で言うと
移植性を捨ててmmap()やCreateFileMappingの類を使うのが一番速い。
C++の標準ライブラリだけでやるなら、
・istreamではなくstreambufを使う。1文字読む版のget()に対応するのは
sbumpc()だ。
・streambuf::pubsetbuf()であらかじめ巨大なバッファを設定する
ことで多少はマシになるだろう
>>434
CSVってカラム内改行がLFで行末はCRLFだろ
少なくともstd::getline()は役に立たないんじゃないか
0437デフォルトの名無しさん
2007/07/27(金) 12:06:11CreateFile() -> SetFilePointer() -> SetEndOfFile()
で出来るはずだが、多分chsize()でも同じことをやっているはずで、
普通にやればゼロ埋めされると思う。
NTFSならいわゆるSparse Fileを作れた気もするがどうだったかな。
FAT32ではだめだろう。
0438デフォルトの名無しさん
2007/07/27(金) 12:26:22最近勉強はじめたんですけど本やらサイトなど見ながらやってます
で、プログラムの書き方なんですが
int main(void)
と
void main()
ってのがあるんですけどどう違うのでしょう?
一般的にどっちが使われてるのですか?
0439デフォルトの名無しさん
2007/07/27(金) 12:29:360440デフォルトの名無しさん
2007/07/27(金) 12:29:59csvファイルと聞いて、カラム内改行をサポートしたフォーマットを想定する香具師がどれだけいるだろうか。
普通は、1Row読めると考えていいんでない?
#大容量、速度優先と聞いた段階で1行=1Rowと想定した漏れ。
0441デフォルトの名無しさん
2007/07/27(金) 12:31:37ttp://www.rfc-editor.org/rfc/rfc4180.txt
0442デフォルトの名無しさん
2007/07/27(金) 12:35:24ありがとうございます
そっちでやってみます
でも結局意味は同じという事でしょうか?
0443デフォルトの名無しさん
2007/07/27(金) 12:37:46つまり、セル内改行はCRLFだということか。
何だ、fgets()でいいじゃん。
0444デフォルトの名無しさん
2007/07/27(金) 12:39:27いいえ。後者は規格不適合です。
0445デフォルトの名無しさん
2007/07/27(金) 12:40:16行末がCRLFで
セル内改行はCR「または」LFだ。よく読めよ。
0446現実見ない人は気楽でいいね
2007/07/27(金) 12:45:14#see TEXTDATA
それはそれとして、
>>445
CRやLFはDQUOTEで括らないといけないという記述はあるけど(see escaped)、
line breakがCRまたはLFだという記述はどこ?
0447デフォルトの名無しさん
2007/07/27(金) 12:46:14そーゆうことですか
ありがとうございます
0448445
2007/07/27(金) 12:55:53このRFCは2005年に出来た新米だからな、MSのOffice従っているわけがないw
セル内改行については、解釈方法をRFCでは規定してないっぽいな。
単にCRだのLFだのを入れられるがその場合はクオートしろってだけ。
0449デフォルトの名無しさん
2007/07/27(金) 12:57:20で、RFCでは「改行」は「CRLF」だと明記されている。
つまり、RFCを持ち出した御仁はRFCを「よく」読まずに偉そうな御託を並べてたわけね。ふーん。
0450デフォルトの名無しさん
2007/07/27(金) 12:57:330452現実見ない人は気楽でいいね
2007/07/27(金) 13:00:49#しかし、「csvはRFCに則ってください」なんて言われた日には涙目だな、こりゃ。
0453デフォルトの名無しさん
2007/07/27(金) 13:01:12これってなん文字?
0454デフォルトの名無しさん
2007/07/27(金) 13:05:00インクルードパスのサーチルールとプロジェクトは関係ない。
a.hにinclude "b.h"と書かれているのなら、a.h(にとって)のカレントからb.hを探すことになる。
0455445
2007/07/27(金) 13:05:12RFCの規定だと、実質日本語は使えないからなw
ま、元の質問者の意図はどうだか良くわからんし、これ以上言っても無駄だな。
セル内改行は要らないというんなら、それでいいんだろうし。
わざわざ「一文字読み」をしている理由を、俺はセル内改行の問題のためだと
推定したっつーだけのこと。
0456デフォルトの名無しさん
2007/07/27(金) 13:06:31Cのソース内で例えば"\r\n"と書けば2文字と解釈される。
#但し、ターミネート文字に注意。
テキストファイルに単純に書けば、4文字と解釈されるだろう。
0458432
2007/07/27(金) 13:19:511文字ずつってのは、これ課題なんだけどその際に「1文字ずつ読み込むように」って言われてたからなんだけれどその意図は聞いてないから答えられない・・・申し訳ない
とりあえず言われた方法を一通りやってみます
レス遅れてすまんかった、そしてありがとう
0459デフォルトの名無しさん
2007/07/27(金) 13:54:16""で指定した場合カレントのstdafx.hを使うみたいなので<>を使って解決しました。
ありがとうございました。
0460デフォルトの名無しさん
2007/07/27(金) 14:07:07エラー処理を書くってことだと思うんですけど
例外を使うのは単にエラー処理を用意するのと違って
どういったメリットなどがありますか?
簡単なサンプルだけではいまいちよくわからなくて
すっきりしません。
0461デフォルトの名無しさん
2007/07/27(金) 14:13:370462デフォルトの名無しさん
2007/07/27(金) 14:17:56エラーを検知するコードと、エラーを処理するコードを自然に分離できる。
典型的には、前者がライブラリで後者がアプリケーションの場合。
例外によるエラーの通知は無視したままプログラムの継続ができないことも
大きな特徴。エラーを無視したまま走り続けて不正な処理をすることを防げる。
あと↓ここ読んとけば?
http://pc11.2ch.net/test/read.cgi/tech/1142667446/
0463デフォルトの名無しさん
2007/07/27(金) 14:27:24Cのmallocなどなら戻り値のチェックは絶対に忘れてはいけないし、忘れたらバグの元になり後々面倒になるが、C++のnewなどなら戻り値のチェックは不要。
例外がthrowされ、catchしなければ異常終了する。上の例で、メモリの確保ができなければ、ほとんどの場合継続動作できないからそれで十分。
逆にCのreadのような、ディスクの読み取りエラーのような時は普通使わない。
0464デフォルトの名無しさん
2007/07/27(金) 14:33:18発生したところで異常終了するしかないなら、その場で
exit() なり abort() なりすればいいだろう。
細かい read() をいくつも組み合わせるようなプログラムのときは
例外使うと便利だよ。
0465デフォルトの名無しさん
2007/07/27(金) 14:38:11いっきにまとめてどっかーんなんて使い方ができるのも例外の魅力
0466デフォルトの名無しさん
2007/07/27(金) 14:51:36計算を繰り返すのですが、最初に数字を入れて次に、+、-、*、/、=を画面に出力
し、=が選ばれるまで計算を繰り返すプログラムです。=が選ばれれば、合計が出
てくるようにし、そしてまた次の計算をするようにしたいんです。どなたか教えて
いただけませんか?
0467デフォルトの名無しさん
2007/07/27(金) 14:54:18自分で作ってみたのを出してみて
0468デフォルトの名無しさん
2007/07/27(金) 14:58:040469デフォルトの名無しさん
2007/07/27(金) 14:59:30必要なだけ作ったらいいよ。まずは書いて動かせ。
0470デフォルトの名無しさん
2007/07/27(金) 15:01:18頑張ってやってみます。
0471デフォルトの名無しさん
2007/07/27(金) 15:01:37適当でいいよ。とりあえず作れ
0472デフォルトの名無しさん
2007/07/27(金) 15:08:04int 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(+)などの次が全くわかりません。
0473デフォルトの名無しさん
2007/07/27(金) 15:11:43まずは数字を入れたらそれを表示するだけのものを繰り返すものでも作っては。
0474デフォルトの名無しさん
2007/07/27(金) 15:14:13人に見せるときはなるべくコンパイルできるようにしとけよ。
で、 + とかが入力されたときの動作はスレ住人にはさっぱり
わからん。好きにしろ。それともエスパー募集か?
0475デフォルトの名無しさん
2007/07/27(金) 15:15:210476デフォルトの名無しさん
2007/07/27(金) 15:15:260477デフォルトの名無しさん
2007/07/27(金) 15:17:590478デフォルトの名無しさん
2007/07/27(金) 15:24:530479デフォルトの名無しさん
2007/07/27(金) 15:30:47まあそれは繰り返し(while 等)を覚えれば何とかなる。
計算のほうは仕様を明確にしてくれ。
0480デフォルトの名無しさん
2007/07/27(金) 16:07:03大体こんな感じにやりたいんでしょ?
#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);}
0481デフォルトの名無しさん
2007/07/27(金) 16:12:41read()が例外をスローしないのは、Cだからだ。
いまどきの例外機構をもった言語なら「ディスクの読み取りエラー」では
IOErrorのような例外がスローされるのが普通だ。
>エラーが発生したところで、どうしようもなく、ソフトを異常終了するしかない時に使う。
人に教えられるほど例外を理解していないぞ。
0482デフォルトの名無しさん
2007/07/27(金) 16:37:44463の説明からすると、例外なんて使わずexit()すべきということになる
まっ、知ったかに教えてやることなんてないけどな
0483デフォルトの名無しさん
2007/07/27(金) 16:48:280484デフォルトの名無しさん
2007/07/27(金) 17:50:14>エラーが発生したところで、どうしようもなく、ソフトを異常終了するしかない時に使う。
俺が例外覚えたての頃の思考と同じだわ。
例外を有効に使えてない。
0485デフォルトの名無しさん
2007/07/27(金) 17:55:000486デフォルトの名無しさん
2007/07/27(金) 17:56:090487デフォルトの名無しさん
2007/07/27(金) 18:00:380488デフォルトの名無しさん
2007/07/27(金) 18:05:03下の例外を上にまる投げ
0489デフォルトの名無しさん
2007/07/28(土) 00:24:44{
for(int i=0;i<100;i++)
{
if(条件式)
{
// 何かの処理
// ※ここでbreak;するのとreturn 0;するので動作が同じ場合、
// どちらを使うべきでしょうか?サイズや速さに関係ありますか?
}
}
return 0;
}
0490デフォルトの名無しさん
2007/07/28(土) 00:38:56サイズも速度も最適化が働けばそれほど気にするレベルじゃない。
俺個人はbreak派。別にreturnでもいいと思う。お好きなほうを
0491デフォルトの名無しさん
2007/07/28(土) 00:40:08サイズとか速さとか、正直どうでもいいレベル。
0492489
2007/07/28(土) 01:00:340493デフォルトの名無しさん
2007/07/28(土) 09:33:070494デフォルトの名無しさん
2007/07/28(土) 09:54:120495デフォルトの名無しさん
2007/07/28(土) 20:28:12Debugの時は上手くできて、Releaseの時には大量のリンクエラーがでます
何故だかわかる方いらっしゃいますか?
エラーメッセージはこんな感じです ↓
(なんだかよく解らない長い文字列)は***(ファイル名)で既に使用されています
0496デフォルトの名無しさん
2007/07/28(土) 20:41:54フルビルドしてみたか?
0497デフォルトの名無しさん
2007/07/28(土) 20:43:33ReleaseとDebugで設定が違うんじゃないかな。
VC++ならプロジェクトのプロパティで構成を変えればそれぞれの項目が変わってるか確認できるはず。
全ての構成にして空白になっているところがあれば怪しいと思われ、DebugとReleaseで違う項目だと空白になるから。
Debugでは指定しているファイル(ヘッダー)が無いReleaseでは無いとか初心者が陥る罠。
0498デフォルトの名無しさん
2007/07/28(土) 21:19:51同じ設定というか、DebugもReleaseもプリコンパイル済みヘッダーの部分と
追加のインクルードディレクトリ、追加のライブラリの部分以外はいじってません(デフォルトのままです)
何か設定を変えなきゃいけないところがあるのでしょうか?
あと、こういう警告もたくさん出ていました↓
warning C4727: 同じタイムスタンプを伴う、**.pch と名前指定された PCH が ***.obj で見つかりました。最初の PCH を使用します。
0499デフォルトの名無しさん
2007/07/28(土) 21:26:07プログラムの全体の最適化 の項目を「いいえ」にすると
違う警告が出るようになりましたが、エラーはなくなりました
他にも色々設定をいじってみます
>>496さん>>497さん ありがとうございました
0500デフォルトの名無しさん
2007/07/28(土) 23:42:06ところで今回のサザエさんはアナゴさん回なのにいつから始まるか分からない件
0501デフォルトの名無しさん
2007/07/28(土) 23:42:420502デフォルトの名無しさん
2007/07/28(土) 23:51:470503名無しさん@そうだ選挙に行こう
2007/07/29(日) 05:40:09単に読み書きだけじゃなく、コメントとかも付けようとしたら、やっぱり自前?
0504名無しさん@そうだ選挙に行こう
2007/07/29(日) 06:15:42必要なもの宣言してるとして、
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使って計算式までいかないようにしてるつもりなんですけど、
なぜエラーなのかわかりません。教えて下さらないでしょうか?
0505名無しさん@そうだ選挙に行こう
2007/07/29(日) 06:26:00( (o=='/'|| o=='%') && b=="0")
って書かなきゃダメだと思われ。
0506504
2007/07/29(日) 06:34:05そちらも試したのですがだめなのです。
おそらくif乗り越えての計算で不正終了、てな気がするんですけど。
この条件式でどこが駄目なのかさっぱり・・・。
0507名無しさん@そうだ選挙に行こう
2007/07/29(日) 06:38:25( (o=='/'|| o=='%') && b==0)
0508名無しさん@そうだ選挙に行こう
2007/07/29(日) 06:38:25ちょいソース全部貼ってみて(長いようなら、うpロダに上げて)
0509名無しさん@そうだ選挙に行こう
2007/07/29(日) 06:41:460510504
2007/07/29(日) 06:47:44うおっ!できました!
intをダブルクオーテーションで囲んでたのがミスだったのですか
ありがとうございます!
>>508
a,b,xはintで
oはcharにしてました。
intは「”」
不要だったんですね迂闊でした。
>>509
charとの比較ですかね?
とりあえず>>508で解決しました!
0511名無しさん@そうだ選挙に行こう
2007/07/29(日) 06:53:320512名無しさん@そうだ選挙に行こう
2007/07/29(日) 06:58:150513名無しさん@そうだ選挙に行こう
2007/07/29(日) 07:57:43get_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;
}
0514名無しさん@そうだ選挙に行こう
2007/07/29(日) 08:30:44typedef int (*func)(void);
func* get_num(void){
static func num[] = {zero, one, two};
return &num[0];
}
0515名無しさん@そうだ選挙に行こう
2007/07/29(日) 08:53:13できました。ありがとうございます。
0516名無しさん@そうだ選挙に行こう
2007/07/29(日) 09:20:590517名無しさん@そうだ選挙に行こう
2007/07/29(日) 10:06:10そうですね、使うときに0を指定する形で。
0518名無しさん@そうだ選挙に行こう
2007/07/29(日) 14:47:100519名無しさん@そうだ選挙に行こう
2007/07/29(日) 15:07:19&num[0] = num
なので、出来る限りシンプルなコードにするために後者にしたほうがいいとは思う
0520名無しさん@そうだ選挙に行こう
2007/07/29(日) 15:20:54可読性で前者を選ぶのも別にいいんじゃない?
先頭のアドレス渡してるってのがわかりやすいし。
0521名無しさん@そうだ選挙に行こう
2007/07/29(日) 16:05:39それぞれの利点は何でしょうか?
リスト版はかなり遅く、配列版のほうがかなり高速だと思うのですが。
ソートプログラムをリストで作る理由は何がありますか?
0522名無しさん@そうだ選挙に行こう
2007/07/29(日) 16:07:23勉強だから
0523名無しさん@そうだ選挙に行こう
2007/07/29(日) 16:08:540524名無しさん@そうだ選挙に行こう
2007/07/29(日) 16:36:05VC++で コマンドライン引数を加えて実行したいのですが
どうやればいいのでしょうか?
具体的には
-o 読み込みたいファイル名.c みたいな感じです
F5を押して、-o 〜 をいれて実行するといったことをしたいのです
0525名無しさん@そうだ選挙に行こう
2007/07/29(日) 16:40:240526名無しさん@そうだ選挙に行こう
2007/07/29(日) 16:50:44ありがとうございまする
0527デフォルトの名無しさん
2007/07/29(日) 23:43:320こういう仕様なんですか?
0528527
2007/07/29(日) 23:48:450char buf[64];なのに、strlen(buf)サイズ分受信していたのがいけませんでした
char buf[70];にして、64バイトずつにしたら直りました
0529527
2007/07/29(日) 23:50:330多めに要求して受信した方がいいんでしょうか?
結局、取れるサイズは返却されますから・・・回数が少ない方が負荷が少ないような気がします
0530デフォルトの名無しさん
2007/07/30(月) 00:00:550ちょwwwおまwwww
strlenてw
sizeof(buf)だろ。
0531527
2007/07/30(月) 00:03:44ちょwwwおまwwww
sizeof(buf)てw
何がいけないの?
0532デフォルトの名無しさん
2007/07/30(月) 00:08:020533デフォルトの名無しさん
2007/07/30(月) 00:34:260534デフォルトの名無しさん
2007/07/30(月) 01:20:47ベクターとかにあるアプリなどはc言語で作ったり出来るのでしょうか
0535デフォルトの名無しさん
2007/07/30(月) 01:22:53ゲームとか希望してるなら別言語いったほうが早いと思う。
0536デフォルトの名無しさん
2007/07/30(月) 01:28:49クラスが使えるって点だけでもC++は偉大だと思う
0537デフォルトの名無しさん
2007/07/30(月) 01:40:10んで不足が出たらC++なりVisual C++なりに行けばいいんじゃない?
0538デフォルトの名無しさん
2007/07/30(月) 01:44:260539デフォルトの名無しさん
2007/07/30(月) 01:45:05パソコンが好きで自分でいろいろなプログラムを作ってみたいと想い移植性が高いということでc言語を選んだんです
多少かじった程度の者が言うのも申し訳ありませんが
c言語を始めたのでまずc言語を満足に出来ると思えるようになった別の言語にも挑戦したいと思います。
プログラムによってこの言語が向いているというのはやっぱりあるのでしょうか?
長文すいません
0540デフォルトの名無しさん
2007/07/30(月) 01:48:26素BASICからプログラムに入った漏れは結構苦労したし。
将来的なこと考えて無理してでもC++薦めたい
0541デフォルトの名無しさん
2007/07/30(月) 01:48:330542デフォルトの名無しさん
2007/07/30(月) 01:48:35なでしこにでもしておきなさい
0543デフォルトの名無しさん
2007/07/30(月) 01:53:05Cが移植性が高いっつーのは、あくまでマシン語やアセンブリ言語に比べてのことだ。
後は、強いて言えば組込やメインフレームを含む大概の環境をターゲットとする
Cコンパイラ(クロスを含む)が存在するのも確かだが、本当にそういう環境で
プログラムを動かしたいのか?
WindowsやUnixやMacのようなメジャーな環境をターゲットとして
ポータブルなプログラムを書きたいのなら、Cよりずっと適した言語が
たくさんあるし、何しろCは何をやるにも面倒くさすぎて、やりたいことが
出来るようになるまでの道のりが遠い。
C++ならCよりずっと言語的に強力だがお世辞にも初心者向けとは
言いがたいので、とりあえず最初のうちはもっと手軽な言語を薦める。
0544デフォルトの名無しさん
2007/07/30(月) 01:54:36C++に移行すると幸せになれるかも
STLのおかげで連想配列も使えるようになるとかイイ!
classのおかげでいろんなものをラップできるとかイイ!
と思えるようになる
0545デフォルトの名無しさん
2007/07/30(月) 01:55:36メジャーだし
0546デフォルトの名無しさん
2007/07/30(月) 01:59:28>ポータブルなプログラムを書きたいのなら、Cよりずっと適した言語が
>たくさんあるし、
例えば何?
0547デフォルトの名無しさん
2007/07/30(月) 01:59:49最近はC#に乗っ取られとるし
組込みではまたC/C++が主流になってきとる
0548デフォルトの名無しさん
2007/07/30(月) 02:00:44J#
0549デフォルトの名無しさん
2007/07/30(月) 02:00:49書く量も少なくてすむし。
ただRubyから入ると他の言語がめんどくさく感じて移れない可能性はあるが。
0550デフォルトの名無しさん
2007/07/30(月) 02:01:09その後C/C++に進んだけど、ポインタもクラスもすんなり理解できた
0551デフォルトの名無しさん
2007/07/30(月) 02:02:020552デフォルトの名無しさん
2007/07/30(月) 02:02:45PerlでもJavaでもPythonでも、言語側でシステムを抽象化する層を設けていて
標準的なライブラリがリッチなものなら、何でもいい。
C++に手を出すのはそれらに不満を覚えてからでも遅くは無い。
そして、Cに手を出す必要は、多分無いだろう。
0553デフォルトの名無しさん
2007/07/30(月) 02:02:50Delphiは応用きくでそ。ポインタももともとあったし
0554デフォルトの名無しさん
2007/07/30(月) 02:03:40既に滅んだんじゃ
0555デフォルトの名無しさん
2007/07/30(月) 02:04:32C++から始めると挫折しそう
0556デフォルトの名無しさん
2007/07/30(月) 02:05:150557デフォルトの名無しさん
2007/07/30(月) 02:06:530558デフォルトの名無しさん
2007/07/30(月) 02:07:000559デフォルトの名無しさん
2007/07/30(月) 02:07:19Delphi良いんだけど
関連書籍が手に入りにくくて苦労した
0560デフォルトの名無しさん
2007/07/30(月) 02:07:190561デフォルトの名無しさん
2007/07/30(月) 02:08:430562デフォルトの名無しさん
2007/07/30(月) 02:10:10わからなければ調べりゃいいだけだし
0563デフォルトの名無しさん
2007/07/30(月) 02:12:21何をもって熟知と言うかによるが、コンパイラが書けるぐらいに複数の
言語に熟知してる人なんてそうはいないと思われ
まあ必要があれば仕様にあたればいいんだけどね
0564デフォルトの名無しさん
2007/07/30(月) 02:13:28熟知はしてないなぁ。ほとんど応用。
C++をBCBで覚えたから必然的にDelphi覚えて
VBはDelphiの応用でいけて
CGIもやりはじめたからPerlも覚えて、応用でPHPとか。
0565デフォルトの名無しさん
2007/07/30(月) 02:13:51言語は決まったとしても移植性を尊重するならGUIが問題だな
Win32以外のGUIツールキットは資料が少な目で入門は大変そう
0566デフォルトの名無しさん
2007/07/30(月) 02:15:20ああそういうの書きたいっつってんのか
移植性とは相反する要求だなw
両方追い求めると無駄に苦労するぞ
0567デフォルトの名無しさん
2007/07/30(月) 02:19:24Delphi、VB、BCB、VC++とかかなぁ
Delphi →滅びる寸前
VB →便利だけどランタイム必須
BCB →滅びてる?初心者向けな情報皆無
VC++ →GUIアプリ作るにはとっつきにくい
0568デフォルトの名無しさん
2007/07/30(月) 02:20:22覚えるのは難しそう
0569デフォルトの名無しさん
2007/07/30(月) 02:20:380570デフォルトの名無しさん
2007/07/30(月) 02:20:59んでもゲームとか言われるときついよなぁ。
0571デフォルトの名無しさん
2007/07/30(月) 02:21:42.NETなら言語はどれでも大差は無いが、やはりランタイムは必須
0572デフォルトの名無しさん
2007/07/30(月) 02:22:220573デフォルトの名無しさん
2007/07/30(月) 02:23:543Dでゴリゴリとか言わなきゃ良い
0574デフォルトの名無しさん
2007/07/30(月) 02:25:030575デフォルトの名無しさん
2007/07/30(月) 02:26:52C++ にする価値はあると思う。
0576デフォルトの名無しさん
2007/07/30(月) 02:29:18Cの気色悪いシンタクスで書かれた宣言がスラスラ読めるぐらいでないと
C++はキツいだろう
0577デフォルトの名無しさん
2007/07/30(月) 02:29:27つまづいてもだれか教えてくれるし。
0578デフォルトの名無しさん
2007/07/30(月) 02:34:050579デフォルトの名無しさん
2007/07/30(月) 02:37:200580デフォルトの名無しさん
2007/07/30(月) 02:37:440581デフォルトの名無しさん
2007/07/30(月) 02:38:06そりゃお前の思い込みだろw
0582デフォルトの名無しさん
2007/07/30(月) 02:38:310583デフォルトの名無しさん
2007/07/30(月) 02:38:56まじか!ソースきぼんぬ
0584デフォルトの名無しさん
2007/07/30(月) 02:39:350585デフォルトの名無しさん
2007/07/30(月) 02:40:58何をincludeすればいいんだぜ?
0586デフォルトの名無しさん
2007/07/30(月) 02:40:59いや、そうじゃないとC++のヘッダ読んでも意味不明だろ?
もっと奇怪なものが大量に増えているし、C++はそもそも宣言的な言語だ。
宣言が理解できないようでは話にならん。
Cの関数ポインタとか多重ポインタとか配列がらみの宣言程度が
分からないようじゃ、ダメだろう。
0587デフォルトの名無しさん
2007/07/30(月) 02:41:50C++ の次期ドラフトとか見ると、色々導入されてるね。
boost はそもそも将来標準に組み込まれることを前提として開発されてるものだからな。
0588デフォルトの名無しさん
2007/07/30(月) 02:42:55better C として使う分には、C++ は C より簡単。
それを越えると厄介な所が出てくるが。
0589デフォルトの名無しさん
2007/07/30(月) 02:43:380590デフォルトの名無しさん
2007/07/30(月) 02:44:43いわゆる叩き台ってやつだな。
その中で入れた方が良さそうなものを入れていく感じだ。
0591デフォルトの名無しさん
2007/07/30(月) 02:45:05better Cってのをどの程度に言ってるか分からんが、
ヘッダやマニュアル理解できないんじゃ、つらいだろ
Cヘッダだけしか使わないとか?
でも、std::basic_string<>やSTLすら使わないんじゃC++の魅力は
半減どころじゃないんじゃないか
0592デフォルトの名無しさん
2007/07/30(月) 02:47:55ポインタ関係は教科書にも載ってるからまだしもだが
確かに、テンプレート、マクロの類は慣れるまで大変だったな
0593デフォルトの名無しさん
2007/07/30(月) 02:48:41C よりゃマシ。
0594デフォルトの名無しさん
2007/07/30(月) 02:50:25参照を教える方がナンボか楽だな。
0595デフォルトの名無しさん
2007/07/30(月) 02:51:06クラスとオーバーロードだけでもかなり書きやすくなるんじゃね?
STL無しのC++が魅力半減ってとこは同意だけど。
0596デフォルトの名無しさん
2007/07/30(月) 02:51:24俺は別段Cを推奨する気は毛頭無いが、言語自体はシンプルだろ。
要素が絶対的に少ないんだから。結局はマクロ、関数、構造体、配列、
ポインタ、といったもので何でもやってしまうのがCで、欠点は
あまりに言語が貧弱なので、何をするにも面倒くさいというだけだ。
C++は言語がずっと強力だが、その分複雑だ。
俺はどっちも初心者に薦める気にはならん。
0597デフォルトの名無しさん
2007/07/30(月) 02:56:14C++の参照は単に関数での「参照渡し」だけじゃないからなあ。
参照やポインタを教えるには、結局は間接参照、左辺値、エイリアシングといった
ことについて教えることになる。ポインタには演算もあるが、些細なことだ。
ほとんど違いは無いと思うが。
>>595
演算子オーバーロードはコードを書きやすくするが読みにくくする。
0598デフォルトの名無しさん
2007/07/30(月) 02:58:00better C として使うなら、参照渡しだけ分かっとけば十分。
それ以上は不要。
あと、演算子オーバーロードの事なんて誰も言ってないように思えるが。
0599デフォルトの名無しさん
2007/07/30(月) 02:59:23いや、あんたの言う「better C」とやらが、つまり何なのか分からんからなw
0600デフォルトの名無しさん
2007/07/30(月) 03:00:11C でややこしい所を解決するためにだけ C++ の機能を使う、
という程度のこと。
0601デフォルトの名無しさん
2007/07/30(月) 03:02:19クラスは使ってもいいの?
0602デフォルトの名無しさん
2007/07/30(月) 03:03:280603デフォルトの名無しさん
2007/07/30(月) 03:10:12・ 関数のオーバーロード
・ プロトタイプ宣言なくても関数使えちゃうのを阻止
・ main で return 0; 省略
とか?
まあ、そんなに色々使わなくてもいいんだよ。
C より便利になる点が 1 つでもあれば。
0604デフォルトの名無しさん
2007/07/30(月) 03:13:54・ 変数をブロックの途中で宣言
・ for(int i = 0; ...
・ 初期化に関するいくつかの制限緩和
0605デフォルトの名無しさん
2007/07/30(月) 03:15:07そこまで制限してC++使おうと思ったこと無いからよくわからんが……。
Cプログラマが初見で本気で便利だと思うのって、標準ライブラリの強力さ、
それとクラス、特にデストラクタの存在じゃないか?
自動で後片付けしてくれるなんて、夢のような環境だろ。
逆に言うと、その辺が使えないんなら、ゴミのような違いでしかないように
思える。
0606デフォルトの名無しさん
2007/07/30(月) 03:18:18プログラミング初心者に薦めるならという話の流れだったはずだが。
0607デフォルトの名無しさん
2007/07/30(月) 03:19:56そもそも初心者なんだから
制限して使うっていうのはちょっと違う
0608デフォルトの名無しさん
2007/07/30(月) 03:20:400609デフォルトの名無しさん
2007/07/30(月) 08:50:280610デフォルトの名無しさん
2007/07/30(月) 08:58:590611デフォルトの名無しさん
2007/07/30(月) 13:30:25そこまでいくとBetter Cではなく、もうC++。
0612デフォルトの名無しさん
2007/07/30(月) 13:40:37馬鹿が「なんか自分が賢くなったような気分」で気軽に参加できる
絶妙なレベルだったんだろう。
0613デフォルトの名無しさん
2007/07/30(月) 14:44:250614デフォルトの名無しさん
2007/07/30(月) 15:07:200615デフォルトの名無しさん
2007/07/30(月) 15:43:12fopen テキストモードを使いたい。ANSI C上の移植性が欲しい。
CreateFile 非同期読み書きやメモリマップドファイルを使いたい。
0616デフォルトの名無しさん
2007/07/31(火) 16:06:50#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;
}
0617デフォルトの名無しさん
2007/07/31(火) 16:09:230618デフォルトの名無しさん
2007/07/31(火) 16:18:49は?
0619616
2007/07/31(火) 16:20:12コンパイルする際に使われているのですが、
これがSEGVになるお陰でワイド文字でboost::xpressiveが使えないという有様です。
0620デフォルトの名無しさん
2007/07/31(火) 16:33:090621616
2007/07/31(火) 16:37:03VC8.0はグローバルロケールを設定した際に標準出力が腐るのは知ってたんだけど……
(Cではグローバルなロケールしかないので回避方法も無い)
これは酷すぎる。と思った。サポート不備ではなく、ただのバグでしょう。
無論VS2003では何の問題も起きないコードです。数値として読み込めないものが
入っているから、intに読み込めずstreamの状態がfailになるのが正しいんですが。
0622デフォルトの名無しさん
2007/07/31(火) 16:37:52xlocaleの_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]);
}
と直せばとりあえず、動くようにはなる。
0623616
2007/07/31(火) 16:48:25ウホットンクスです。
とりあえずヘッダ修正してみた。
_Byte[]が2byteでいいのは「MS Windowsだからそう仮定して良い」てことですね。
しかしひでーバグだ。
修正したヘッダのコードなら正常に動くことを確認しました。感謝。
が、コンパイルオプションによっては、MSVCP80.DLLに入ってる特殊化バージョンが
リンクされてしまい、やはりバグってしまいますね。
勘弁して欲しい。
0624デフォルトの名無しさん
2007/07/31(火) 16:52:290626デフォルトの名無しさん
2007/07/31(火) 21:23:11実行時エラーになるのは既知の不具合ですか?
#include <memory>
int main() {
std::auto_ptr<int> i = new int(1);
}
g++ だと型の不一致できっちりコンパイルエラーになります。
0627デフォルトの名無しさん
2007/07/31(火) 21:26:430628デフォルトの名無しさん
2007/07/31(火) 21:53:19調べてみたらVS2003でも同じコードだった
すげー萎えた
0629デフォルトの名無しさん
2007/07/31(火) 22:04:030630デフォルトの名無しさん
2007/07/31(火) 23:02:03むむ。new int(10) でもエラーにならないですか?
0631627
2007/07/31(火) 23:08:21Visual C++ 2005 EE (SP1)
ところで、.NET 2003 (SP1)では
コンストラクタがexplicitと宣言されているからと言って、C2440のエラーになる。
0632デフォルトの名無しさん
2007/07/31(火) 23:23:00ビルドできるって、VS 2005 の memory の中身はどないなっとるんじゃ。
0633デフォルトの名無しさん
2007/07/31(火) 23:28:520634デフォルトの名無しさん
2007/08/01(水) 00:06:07#define A_NUM (20000)
class A : public B{
private:
static C < (unsigned long) A_NUM > list;
C++勉強し始めて日が浅くて申し訳ないのですが、上記ソースの一番下の行は
どういうことをしているのでしょうか?
0635デフォルトの名無しさん
2007/08/01(水) 00:08:00そのオブジェクト list を宣言
0636デフォルトの名無しさん
2007/08/01(水) 00:15:42さんくす。
クラステンプレートがよく分かってなかったので、
その箇所を詳しく調べることにします。
0637デフォルトの名無しさん
2007/08/01(水) 02:04:47int *x[3];
x[0]=(int *)malloc(3);
x[1]=(int *)malloc(4);
x[2]=(int *)malloc(5);
free(x);
上記のようにポインタの配列に各個mallocして、最後にfreeをすると
エラー(コンパイルは通る)がでてしまいます。
0638デフォルトの名無しさん
2007/08/01(水) 02:08:08free(x[0]);
free(x[1]);
free(x[2]);
0639637
2007/08/01(水) 02:13:50x[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]);
0640デフォルトの名無しさん
2007/08/01(水) 02:19:53x[0]=(int *)malloc(3*sizeof(int));
x[1]=(int *)malloc(4*sizeof(int));
x[2]=(int *)malloc(5*sizeof(int));
0642デフォルトの名無しさん
2007/08/01(水) 11:11:44クラスを継承させて使うときに基底クラスのprivateなメンバ変数を
publicではなく、privateの状態のまま継承させることはできないでしょうか?
0643デフォルトの名無しさん
2007/08/01(水) 11:26:45基底クラスの private 変数は派生クラスから見ても private じゃねーの?
0644デフォルトの名無しさん
2007/08/01(水) 11:43:310645デフォルトの名無しさん
2007/08/01(水) 11:46:320646デフォルトの名無しさん
2007/08/01(水) 11:52:23>>645の言うように派生クラスから基底クラスのprivate変数に
アクセスしたいって意味なら基底クラスを変更するしかないな。
他の選択肢はpublic、アクセッサの追加、friendとかかね
0647デフォルトの名無しさん
2007/08/01(水) 13:22:08Windowsのデスクトップ上のアイコンをデスクトップ設定の自動整列以外で移動するにはどうしたらいいでしょうか
例えば全体的に右にあるアイコン群を左によせたり上にあるのを下に〜等
よろしくお願いします
0648デフォルトの名無しさん
2007/08/01(水) 13:54:28Win32API質問箱 Build55
http://pc11.2ch.net/test/read.cgi/tech/1184853465/
0649デフォルトの名無しさん
2007/08/01(水) 14:03:560650デフォルトの名無しさん
2007/08/01(水) 21:39:29今日会社の VS2005 PE に SP1 を当てたけど、デバッグビルドで実行
すると、operator delete で落ちます。何が違うのかしら。
>>632
memory はたぶん問題なくて、最適化がからんでそうです。代入文が、
std::auto_ptr<int> i(std::auto_ptr_ref);
に変形していて、デストラクタで int の値を解放しにいって落ちると。
もぎゃー
0651デフォルトの名無しさん
2007/08/01(水) 21:47:540652もぎゃー
2007/08/01(水) 22:44:090653デフォルトの名無しさん
2007/08/02(木) 05:56:270654デフォルトの名無しさん
2007/08/02(木) 06:07:04void *型ならあるが。
0655デフォルトの名無しさん
2007/08/02(木) 06:48:250656デフォルトの名無しさん
2007/08/02(木) 07:45:14正の整数を二つ読み込んで、その乗算をシフト演算によって行いたいのですが、プログラムがうまく動きません。
強制終了されてしまいます。
(例) 53×25=53×(2^4+2^3+2~0)=(53を左に4ビットシフト)+(53を左に3ビットシフト)+(53を左に0ビットシフト)
どこが悪いのでしょうか・・・。
0657656
2007/08/02(木) 07:46:010658デフォルトの名無しさん
2007/08/02(木) 07:58:22エスパーすると、divideのkがmainのkに影響を及ぼすことはないよ。
0659デフォルトの名無しさん
2007/08/02(木) 08:00:340661デフォルトの名無しさん
2007/08/02(木) 08:29:170662デフォルトの名無しさん
2007/08/02(木) 08:37:18VC++なら/W4
bccなら-w
gccなら-Wall
0663656
2007/08/02(木) 08:56:45おお!そんなことができるのですね。ありがとうございます。
警告 W8013 test.c 26: 's' は、おそらく値が代入される前に使われている(関数 divide)
と出ました。どういう意味でしょうか・・・。
0664656
2007/08/02(木) 09:12:45ありがとうございます。kのアドレスをdevideに引き渡せばいいのですね。
そこは修正したのですが、まだダメみたいです・・・・。
0665デフォルトの名無しさん
2007/08/02(木) 09:48:280666デフォルトの名無しさん
2007/08/02(木) 09:52:07*k = 0;
while (no>0) {
count[*k] = analyze(no, s); ←初期化されてないsが使われてる
no -= (1<<count[(*k)++]);
}
0667656
2007/08/02(木) 09:53:38divide関数内で
*k++とかいう変なことをしてたみたいで・・・
*k += 1;
と書き換えたらできました。
ありがとうございます。
0668656
2007/08/02(木) 09:55:16ああなるほど、ポインタは括弧をつければよかったんですね・・・orz
sは初期化されてないからですか・・・わかりました、ありがとうございます。
0669デフォルトの名無しさん
2007/08/02(木) 10:03:19うん。
"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
0670656
2007/08/02(木) 10:03:24アホだ・・・orz
0671デフォルトの名無しさん
2007/08/02(木) 15:03:470672デフォルトの名無しさん
2007/08/02(木) 15:06:18�d
0673デフォルトの名無しさん
2007/08/02(木) 15:31:38std::vector<int>::size_typeって宣言するのではなく
変数名vを使って宣言したいのですがなんか良い方法無いですかね?
typeof(v)::size_typeとかboost::range_size< typeof(v) >::type (←勿論通りません><)
みたいにできたらめちゃ便利だと思うんですが
0674デフォルトの名無しさん
2007/08/02(木) 16:03:34いまんとこはできないね。
そういう場合は typedef しとくというくらいしか言えんなあ。
std::vector<int> v_t;
v_t v;
v_t::size_type i;
0675デフォルトの名無しさん
2007/08/02(木) 16:06:220676デフォルトの名無しさん
2007/08/02(木) 16:07:400677デフォルトの名無しさん
2007/08/02(木) 16:12:120678デフォルトの名無しさん
2007/08/02(木) 16:13:490679デフォルトの名無しさん
2007/08/02(木) 16:26:340680デフォルトの名無しさん
2007/08/02(木) 16:34:100681デフォルトの名無しさん
2007/08/02(木) 16:34:320682デフォルトの名無しさん
2007/08/02(木) 16:38:200683デフォルトの名無しさん
2007/08/02(木) 16:53:10void *型ってどんな型にも切れるただのメモリアドレスって考えれば良いのですか?
0684デフォルトの名無しさん
2007/08/02(木) 17:08:12礼儀知らずにも程がある
0685デフォルトの名無しさん
2007/08/02(木) 17:10:300686デフォルトの名無しさん
2007/08/02(木) 17:13:330687デフォルトの名無しさん
2007/08/02(木) 17:19:25なんという仕打ち。
0688デフォルトの名無しさん
2007/08/02(木) 17:19:49こう、「アタシは侍ザマス!」みたいな?
「void*型からunsigned long(*)(bstr_t const&, IDispatch**)型に斬ってしんぜるナリ!」みたいな?
0689デフォルトの名無しさん
2007/08/02(木) 17:22:55言葉の使い方は他人に通じるように
0690デフォルトの名無しさん
2007/08/02(木) 17:23:44今はdecltypeという名称になっている。
0691デフォルトの名無しさん
2007/08/02(木) 17:26:33同じ文体なんだから別人なら普通変えるだろ。バカかよ
0692デフォルトの名無しさん
2007/08/02(木) 17:27:250693デフォルトの名無しさん
2007/08/02(木) 17:31:110694デフォルトの名無しさん
2007/08/02(木) 17:35:58そのスレどこ?
0695デフォルトの名無しさん
2007/08/02(木) 17:58:27C++スレだけに
0696デフォルトの名無しさん
2007/08/02(木) 18:08:50http://pc11.2ch.net/test/read.cgi/tech/1184717430/653-654
>>695
誰がうまいこと言えと(ry
0697デフォルトの名無しさん
2007/08/02(木) 18:25:13別スレじゃなくてこのスレかよ
>>685
お前の言葉は本当だったな
0698デフォルトの名無しさん
2007/08/02(木) 19:16:35struct 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で明らかに計算方法が違うのはなぜなんでしょうか?
0699デフォルトの名無しさん
2007/08/02(木) 19:23:410700デフォルトの名無しさん
2007/08/02(木) 19:26:020701デフォルトの名無しさん
2007/08/02(木) 19:28:070702デフォルトの名無しさん
2007/08/02(木) 19:42:41http://www.g-ishihara.com/c_st_01.htm
を見て納得しました!
ありがとうございます。
0703デフォルトの名無しさん
2007/08/02(木) 19:50:02コンストラクター、デストラクターからstaticのメンバー変数にアクセするにはどのように記述したらよいでしょうか。
0704デフォルトの名無しさん
2007/08/02(木) 20:01:11普通に。
0705デフォルトの名無しさん
2007/08/02(木) 20:49:03解答としては不適切。
0706デフォルトの名無しさん
2007/08/02(木) 20:57:27不適切。
0707デフォルトの名無しさん
2007/08/02(木) 21:00:09それ以外に答えようが
0708デフォルトの名無しさん
2007/08/02(木) 21:00:16逆は問題ないよね?
0709デフォルトの名無しさん
2007/08/02(木) 21:17:000710デフォルトの名無しさん
2007/08/02(木) 21:23:30wfstreamともなるとアホみたいに遅いです。
0711デフォルトの名無しさん
2007/08/02(木) 21:25:320712デフォルトの名無しさん
2007/08/02(木) 21:27:530713デフォルトの名無しさん
2007/08/02(木) 21:44:25端末を変えるとfstreamが速くなるのですか?
>>712
機能的にはstdioより好ましいですし標準ですから、出来れば使いたいのですが。
wfstreamとgetline()を使って書かれた単にコピーするだけのC++プログラムが、
perlだのpythonだので書かれた、正規表現を用いてちょっと文字列を置換する
スクリプトよりも遅いので、呆れます(後者でもちゃんとエンコード変換を
行っているのにです)
0714デフォルトの名無しさん
2007/08/02(木) 21:54:44アタリマエだろ。
単にコピーするだけにgetlineを使うお前が悪い。
0715デフォルトの名無しさん
2007/08/02(木) 21:55:410716デフォルトの名無しさん
2007/08/02(木) 21:58:470717デフォルトの名無しさん
2007/08/02(木) 21:59:34ああ、説明不足でしたね。
行単位で下らない置換処理を行う下らないプログラムを色々な言語や
ライブラリを使って書いてみたのです。
ですので、例えばPerlで書いたものも、$/をundefせずに行単位で入力して
いますから、条件は対等のはずでしょう。
C++で書いたものがあまりに遅いので、試しに置換処理を抜いて
コピーだけにしたところ、その時点で他のスクリプト言語にさえ負けている
(wfstreamの場合は)ことが判明してしまいました。
0718703
2007/08/02(木) 22:04:32そうですか、普通にアクセス可能ですか。。。
現象としては「static int xxx」で宣言した変数がリンカーで次のようにエラーしてしまいます。(環境VC2005)
LNK2001: 外部シンボル ""public: static int PerfMonMgr::xxx" (?xxx@PerfMonMgr@@2HA)" は未解決です。」
宣言部にstaticを取って「int xxx」で宣言するとエラーは出ないんですが。
ちなみにこのコードはDLLのコードの一部なんですが関係ありませんでしょうか。
0719デフォルトの名無しさん
2007/08/02(木) 22:07:270720デフォルトの名無しさん
2007/08/02(木) 22:07:34perlとかはIO関連はC/C++の標準関数は使わずに独自にコントロールしてるんじゃなかったっけ?
PerlのIOはPerl向けにチューニングしてるからこそそうなるんであって、
何にもしない素でもC++なら速いと思ってるなら幻想だろう。
構造的な美しさをとるか泥臭くても速度をとるかでケースバイケースじゃないかなぁ。
0721デフォルトの名無しさん
2007/08/02(木) 22:09:230722デフォルトの名無しさん
2007/08/02(木) 22:10:24std::ofstream("out.bin", std::ios::binary) << std::ifstream("in.bin", std::ios::binary).rdbuf() ;
0723デフォルトの名無しさん
2007/08/02(木) 22:26:000724710
2007/08/02(木) 22:29:02http://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でただコピーするだけの版は、これらのどれよりも遅かったです。
0725710
2007/08/02(木) 22:35:40もともとPerlは速い印象でしたが、エンコード指定のopen()を使うと
それほどでもない
というか、意外にもPythonのほうが速かったです。
どっちもcygwinのもの(つまり遅い実装)を使ったのですが
それよりもVC++7.1でコンパイルしたネイティブのC++プログラムが遅いのは
流石にどうかと思いました
ちなみにC++のものは、std::basic_stringを戻り値として使わず
全て参照引数渡しで同じインスタンスを使いまわすとパフォーマンスの
改善が見られましたが、素直な書き方に比べて大きな違いが出るほどでは
ありませんでした。
0726デフォルトの名無しさん
2007/08/02(木) 22:41:30C単体ならDLLを使わなくていいんだから・・
時間が掛かるところは、読み込み、出力と置換する場所のサーチでしょ?
文書をバッファに蓄えておいて、置換作業と並列化してみ
0727710
2007/08/02(木) 22:46:34Cでも書こうかと思ったのですが、
char->wchar変換
置換1〜3
wchar->char変換
の5段ぐらいのフィルタ処理を行っており、文字列処理とメモリ管理が
あまりに面倒臭いのでやめましたw
CでやるならGCが欲しいです。
0728デフォルトの名無しさん
2007/08/02(木) 22:48:01キミのCのコードは訳が分からん(知識がない訳だが・・・)
もっと単純に書いてみ char型にして<<を探して置き換えるだけだろ??
そしたら速いかもよ
0729710
2007/08/02(木) 22:49:59Cでは書いていません。C++です。
拡張子cppのものは全てmain()を含むメインプログラムで、
全てのソースでfilter.hppをインクルードしています。
0730デフォルトの名無しさん
2007/08/02(木) 22:50:24726でCといったのはC++を含むわけだが・・・
単純に言って、一行読み込んで《・・》を書き換えるだけでしょ?
なぜ何工程も必要なんだよ???
0731710
2007/08/02(木) 22:52:11日本語を含む正規表現での置換処理ですので、wchar_tに変換しています。
置換を3段階行っているのは、もっと効率化できるかもしれませんが、
どの言語でもやっていることは同じです。
C++だけ特に遅くなるような書き方をしているつもりはありません。
0732デフォルトの名無しさん
2007/08/02(木) 22:52:15それはぐぐっても日本語英語問わず資料が少ないことからも想像が付く。
そして処理系の実装はバグ持ちで遅く、ますます誰も使わず、負の悪循環。
>>730
その処理を全部省いたとしても、ワイド文字ストリームという砦が待ち構えている。
0733デフォルトの名無しさん
2007/08/02(木) 22:53:54正規表現使わずに、例えばchar c[1000]; に読み込んで
if ( c[i]=='<' && c[i+1]=='<' ) とやった方が速いだろ
0734デフォルトの名無しさん
2007/08/02(木) 22:56:18他言語との比較でそんな抜け道はだめだろ。
0735デフォルトの名無しさん
2007/08/02(木) 22:59:27普通に考えると正規表現使わず<<だけ見つけた方が速いだろって事だ
0736デフォルトの名無しさん
2007/08/02(木) 23:00:29その文字コードに合わせて処理すればいいだけ。
0737710
2007/08/02(木) 23:02:44いいえ。違います。
速くしたいのなら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;
0738デフォルトの名無しさん
2007/08/02(木) 23:03:43速くなるようにチューニングする余地が用意されているというだけで、
素のままで速いとは限らない。正に今回はその好例。
0739デフォルトの名無しさん
2007/08/02(木) 23:04:18UCS-2だったらどうする
0740デフォルトの名無しさん
2007/08/02(木) 23:04:370741デフォルトの名無しさん
2007/08/02(木) 23:06:57普通の考えなんか価値なす。
大事なのは現実の速度。
0742710
2007/08/02(木) 23:07:40漢字《ふりがな》
といったパターンを捕まえて、変換しなければなりませんので、
文字クラスにUnicodeが使えると便利なのです。
それに、「全ての言語で」Unicodeの正規表現を使っています。
C++だけわざわざそうしているわけではありません。
0743デフォルトの名無しさん
2007/08/02(木) 23:09:53他の言語でも同じことやったら、またC++より速くなったりしてw
0744735
2007/08/02(木) 23:09:59もとのファイル354Kしかないから100倍 (35M) に増やして比較しようぜ!
そしたら速度差は歴然になるからさ
0745デフォルトの名無しさん
2007/08/02(木) 23:11:220746デフォルトの名無しさん
2007/08/02(木) 23:12:45》携帯からのtypoかと思ってた
0747デフォルトの名無しさん
2007/08/02(木) 23:12:520748735
2007/08/02(木) 23:16:300749デフォルトの名無しさん
2007/08/02(木) 23:18:52変換方法は何でもいいからさ。
0750デフォルトの名無しさん
2007/08/02(木) 23:20:50まず入力にはboost::spirit::file_iteratorを使う
デコード用のiteratorは自分で書くかboostの中から探す
つぎにxpressiveのregex_token_iteratorでトークンに分ける(cvsのでないと遅くなるので注意)
そのトークンに付け加えつつストリームに出力する
こうしてstd::stringどころかヒープさえほとんど使わないで出力する
これで世界最速のプログラムの完成である (完)
0751デフォルトの名無しさん
2007/08/02(木) 23:23:05ターゲットの文字コードは分かんないとあかんだろ?
0752デフォルトの名無しさん
2007/08/02(木) 23:25:290753デフォルトの名無しさん
2007/08/02(木) 23:32:510754デフォルトの名無しさん
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>を挿入して、漢字もつなげる
以下同様にやる
0755デフォルトの名無しさん
2007/08/03(金) 00:21:35コンパイラは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
0756710
2007/08/03(金) 00:24:26stdio版も意外に遅いですね。
time cygstart aozora.js ../input/20.txt
の結果はどうでしょうか?
(jsがwshext.dllに関連付けられているかどうか分かりませんが)
0757デフォルトの名無しさん
2007/08/03(金) 00:30:290758673
2007/08/03(金) 00:56:35VCのバグを使ってほぼ完全にGCCのtypeofをエミュレートできるようです
(しかし本当にtypeofという名前だったとは…^^;)
早速使って見ましたが意図したとおりに動いていい感じ
range_XXXとかのメタ関数やsmart_ptr,optionalのようなテンプレートと相性がよいようで、
変数から型の参照が文法の上で自在に行えるのは気持ち良いです
>>690
検索かけてみましたが0xではその名前になるようですね
Visual C++0x(仮)を楽しみに待ちます
0759デフォルトの名無しさん
2007/08/03(金) 01:00:35This 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
0760デフォルトの名無しさん
2007/08/03(金) 01:00:43動的な型は得られないということを分かりやすくしたのかね。
0761デフォルトの名無しさん
2007/08/03(金) 01:14:35(aozora.jsへの20.txtのD&Dでも)wshext.dllはどうやれば
使えるのかは判らずじまい
0762710
2007/08/03(金) 01:16:13わざわざ有難うございます。
JScriptは、cscript.exeやwscript.exeに実行させると私のところでも遅いです。
もしWindowsのレジストリ上でjsがwshext.dllに関連付けられている場合は、
>>756で書いたようにcygstartでaozora.jsを実行してみてください。
私のところでは、詐欺のような速さになっていました。
ともあれ、stdio版なら、PerlやJScriptよりはどうにか速くなる
といったところでしょうか。
0764デフォルトの名無しさん
2007/08/03(金) 01:23:06計測できるのはIPC(ファイルをexplorerに渡す)部分だけ、
みたいなオチはないよね?
0765710
2007/08/03(金) 01:27:50……んー。よく考えると、それ以前の問題として、cygstartで起動すると、
すぐに呼び出し側に制御が戻ってきてしまうので、timeで計測ができるはずは
ないですね。
失礼しましたm(_ _)m
0766710
2007/08/03(金) 01:49:44念のため書いておきますが、全くのデタラメでした。
自分も>>755さんと同じように、cygwinのbashのtimeでいい加減に計測していたのです。
jsだけは関連付けで起動させるために、cygstartで実行させていました。
cygstartで走らせたものの実行時間を計れるわけがないのに。大ボケです。
とりあえず、iostreamさえ捨てればC++でスクリプトに勝てると分かりました。
が、コードを書くのが格段に面倒くさいのに、大して差があるわけでもないのが
悩ましいですね。
自分でもっとずっと複雑な計算をするプログラムなら、当然比較にならない
ほどC/C++が優位でしょうけれども。
0767デフォルトの名無しさん
2007/08/03(金) 01:56:15MinGW の方がいい。
0768デフォルトの名無しさん
2007/08/03(金) 01:56:450769710
2007/08/03(金) 02:09:08C++のプログラムは全てVC++7.1でコンパイルしました。
cygwinのnewlibは、ロケール周りの実装があまりにショボいので、実質的に
ワイド文字の処理には使えないと思います。
(VC++にしても、いくつも地雷を踏みましたが。boostも、boost::regexは
バグがあってダメでした)
>>768
そうですね><
0770デフォルトの名無しさん
2007/08/03(金) 02:12:390771デフォルトの名無しさん
2007/08/03(金) 02:13:300772デフォルトの名無しさん
2007/08/03(金) 02:18:510774デフォルトの名無しさん
2007/08/03(金) 02:31:150775デフォルトの名無しさん
2007/08/03(金) 02:31:50動くコンパイラはあるわけだからね
0776デフォルトの名無しさん
2007/08/03(金) 02:38:020777710
2007/08/03(金) 02:41:17あれ、それと同じ問題なのかな?
実はそれを教えていただいた>>616は自分なんですよ。
ただ、>>616の場合はxpressiveの正規表現のコンパイル時にスタックが
壊れてSEGVになっていたのですが、
boost::regexの場合は、バックリファレンス含みの正規表現で検索すると、
SEGVではなく、boost::regexが例外をスローしていました。
0778デフォルトの名無しさん
2007/08/03(金) 02:49:13ttp://capslockabcjp.kitunebi.com/faq.html#boost-bug
0779デフォルトの名無しさん
2007/08/03(金) 02:51:500780710
2007/08/03(金) 02:54:02実はそれをboostスレに報告したのも自分なのです。
その正規表現の例を見ればモロバレでしょうが。
随分前にそれで「使い物にならん」と判断して放置していたのですが、
ここ数日、ふと思い立ってxpressiveで組みなおしてみたのです。
0781デフォルトの名無しさん
2007/08/03(金) 02:58:010782デフォルトの名無しさん
2007/08/03(金) 03:11:230783デフォルトの名無しさん
2007/08/03(金) 04:53:070784デフォルトの名無しさん
2007/08/03(金) 08:14:090785デフォルトの名無しさん
2007/08/03(金) 11:39:09比較すること自体バカらしい・・・
0786デフォルトの名無しさん
2007/08/03(金) 11:52:460787デフォルトの名無しさん
2007/08/03(金) 21:58:54protected:
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関数を呼び出す)ことってできないですかね?
0788デフォルトの名無しさん
2007/08/03(金) 22:00:090789デフォルトの名無しさん
2007/08/03(金) 22:13:27ありがとうございます
0790デフォルトの名無しさん
2007/08/03(金) 23:25:50Base * b = new Dev[10];
for( int i = 0; i < 10; ++i ){
b[i]->Test();
}
こういうようなことをやっているとループが何回か回った後で
メモリ外アクセス落ちちゃうんですが何が原因かかわかりませんか?
0791デフォルトの名無しさん
2007/08/03(金) 23:33:59つーかそれコンパイル通らないだろ
0792デフォルトの名無しさん
2007/08/03(金) 23:35:03for( int i = 0; i < 10; ++i ){
b[i].Test();
}
こうですた
0793デフォルトの名無しさん
2007/08/03(金) 23:40:53それをやりたいならポインタの配列とかでやるべき
0794デフォルトの名無しさん
2007/08/03(金) 23:49:00for( int i = 0; i < 10; ++i ){
b[i].Test();
}
ならおk?
0795デフォルトの名無しさん
2007/08/03(金) 23:49:38そうなんですか?
ポインタの配列というと、下のような感じでいいんでしょうか?
Base **b = new Dev*[10];
for( int i = 0; i < 10; ++i ){
b[i] = new Dev();
b[i].Test();
}
0796デフォルトの名無しさん
2007/08/03(金) 23:53:33これコンパイル通らないだろ。
0798デフォルトの名無しさん
2007/08/03(金) 23:56:310799デフォルトの名無しさん
2007/08/03(金) 23:57:42ねたじゃn
0800デフォルトの名無しさん
2007/08/03(金) 23:59:41Base **b = new Base*[10]; はいけましたが
Base **b = new Dev*[10]; はダメみたいです
0801デフォルトの名無しさん
2007/08/04(土) 00:12:01malloc久しぶりに使いますた
Base **b = (Base**)malloc(10 * sizeof(Dev*));
for( int i = 0; i < 10; ++i ){
b[i] = (Dev*)malloc(10 * sizeof(Dev));
b[i].Test();
}
0802デフォルトの名無しさん
2007/08/04(土) 00:13:52Base やら Dev やらは構造体なの?
0803デフォルトの名無しさん
2007/08/04(土) 00:14:46>>787のやつです
0804デフォルトの名無しさん
2007/08/04(土) 00:16:00Devを指すBase*の配列を作ればいいと思うよ、多分
0805デフォルトの名無しさん
2007/08/04(土) 00:27:19typedef 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使えとか言いたい。
0806デフォルトの名無しさん
2007/08/04(土) 00:28:110807デフォルトの名無しさん
2007/08/04(土) 00:33:47boost::indirect_iteratorでなんとかなる話?
0808デフォルトの名無しさん
2007/08/04(土) 00:39:590809デフォルトの名無しさん
2007/08/04(土) 00:42:20くやしく
0810デフォルトの名無しさん
2007/08/04(土) 00:42:590811デフォルトの名無しさん
2007/08/04(土) 00:49:08http://www.boost.org/libs/iterator/doc/indirect_iterator.html#example
value_typeがT*(一般に*演算子が使える型)なイテレータをラップして
value_typeがTであるイテレータにするアダプタ。
0812デフォルトの名無しさん
2007/08/04(土) 00:55:040813デフォルトの名無しさん
2007/08/04(土) 02:58:290814デフォルトの名無しさん
2007/08/04(土) 03:03:320815デフォルトの名無しさん
2007/08/04(土) 03:04:270816デフォルトの名無しさん
2007/08/04(土) 03:12:070817デフォルトの名無しさん
2007/08/04(土) 03:22:390818デフォルトの名無しさん
2007/08/04(土) 12:30:45みたいな定義で
type x;
f(x);
のようにして使いたいんですが(要はf<type>(x)とかするのがめどい)
何か良いアイデアありませんか?
0819デフォルトの名無しさん
2007/08/04(土) 12:53:480820デフォルトの名無しさん
2007/08/04(土) 12:54:110821デフォルトの名無しさん
2007/08/04(土) 12:55:27boost::call_traits<T>::param_typeは、
引数がクラス型ならconst T&、組込型ならTというように、引数に最適の型になる。
0823デフォルトの名無しさん
2007/08/04(土) 13:14:08#include <boost/call_traits.hpp>
template <typename T> void f(typename boost::call_traits<T>::param_type) {}
int main() {
int x;
f(x);
}
error C2783: 'void f(boost::call_traits<T>::param_type)' : テンプレート 引数を 'T' に対して減少できませんでした
'f' の宣言を確認してください。
oops。。。
0824デフォルトの名無しさん
2007/08/04(土) 13:24:07vc6だとboostの一部は使えないよ。
0825デフォルトの名無しさん
2007/08/04(土) 13:40:310826デフォルトの名無しさん
2007/08/04(土) 13:42:43あとGCC3.4でも試してみたが駄目ですた
型推論が上手く行かない為だと思うんですが、これはバグなのか
言語仕様上の限界なのかよくわかりません
0827デフォルトの名無しさん
2007/08/04(土) 14:14:16どうすればいいんでしょうか?
0828デフォルトの名無しさん
2007/08/04(土) 14:17:26変換する上で便利な関数はありますか?
atoiか何かで1文字づつ変換して入れてくしかないんでしょうか?
0829デフォルトの名無しさん
2007/08/04(土) 14:28:470830デフォルトの名無しさん
2007/08/04(土) 14:29:03解決しました
0831デフォルトの名無しさん
2007/08/04(土) 14:42:030832デフォルトの名無しさん
2007/08/04(土) 14:46:030833デフォルトの名無しさん
2007/08/04(土) 18:51:54ググったら上のほうにこんなのがあった。
http://lists.boost.org/Archives/boost/2005/09/94177.php
どうやらC++の仕様らしい。
0834デフォルトの名無しさん
2007/08/04(土) 19:17:57外部リンケージと内部リンケージどっちなんですか?
関数はstatic以外、外部リンケージつう説明を読むと外部リンケージですけど、
別のファイルから使うことなんて出来ないですよね?
てか、リンケージの説明が微妙によくわかりません。
なんか良い説明してるページってありますか。
0835デフォルトの名無しさん
2007/08/04(土) 19:46:560836デフォルトの名無しさん
2007/08/04(土) 19:58:55ああ・・・ああ・・・・なんてこったい。
で、入れ子関数はGCCだと内部リンケージになるらしいですね。
0837デフォルトの名無しさん
2007/08/04(土) 21:23:18struct nested_fn { void foo() { /* valid nested function */ } };
}
0838デフォルトの名無しさん
2007/08/04(土) 22:18:04簡単なGUI作っているのですが
GUI部分とメインロジックを接続するイベントモデルを
設計しているのですが、最近のトレンドだとどんな
感じで実装してるのですか?
関数ポインタ方式
シグナル-スロット方式
ターゲット/メッセージ方式
とかなのかな?
あと実際に実装してみようと思うと何かうまい資料とか
あると助かるのですが、みなさんは実装しようとしたとき
何を参考に実装しているの?
0839デフォルトの名無しさん
2007/08/05(日) 04:49:13でも組み込みじゃ無理か
0840デフォルトの名無しさん
2007/08/05(日) 05:08:02出来ればstaticを使用せずに実現したいのですが可能でしょうか。
具体的なコードや、参考HPのURLを示していただけると助かります。
よろしくお願いします。
0841デフォルトの名無しさん
2007/08/05(日) 05:22:370842デフォルトの名無しさん
2007/08/05(日) 05:25:150843デフォルトの名無しさん
2007/08/05(日) 05:27:560844デフォルトの名無しさん
2007/08/05(日) 05:30:46そのインスタンスへのポインタをグローバルに置く、
くらいが限界か。
全く意味がないけど。
0845デフォルトの名無しさん
2007/08/05(日) 06:05:06もっともファクトリにstaticが必要になるような気もするけどw
0846デフォルトの名無しさん
2007/08/05(日) 08:34:240847デフォルトの名無しさん
2007/08/05(日) 09:25:28これを使わない場合、どう書けばいいですか?エスパーさんよろしこ
0848エスパー
2007/08/05(日) 09:27:070849デフォルトの名無しさん
2007/08/05(日) 09:36:200850デフォルトの名無しさん
2007/08/05(日) 09:38:270851デフォルトの名無しさん
2007/08/05(日) 09:58:55はOKなのに、配列に対する
delete [] x,y,z;
で、うまくいかない理由を教えてください。
一文で各方法はないでしょうか?
0852デフォルトの名無しさん
2007/08/05(日) 10:04:14delete x,y,z;も全然良くない。
deleteとdelete[]演算子は1つしか演算対象を取らない。
また、カンマ演算子は最低の優先順位なので、こうは書ける。
delete x, delete y, delete z;
delete[] x, delete[] y, delete[] z;
1行に複数文を並べるのと大して変わりはないが。
0853デフォルトの名無しさん
2007/08/05(日) 10:07:540854デフォルトの名無しさん
2007/08/05(日) 10:08:33プリプロセッサとmplを組み合わせて、delete_(x, y, z,...);みたいな物作ろうぜ
既に誰かが作ってるかもしれないが
0855デフォルトの名無しさん
2007/08/05(日) 10:11:44deleteも生で使うのはダサい。
0856デフォルトの名無しさん
2007/08/05(日) 10:11:57ちょっと疑問に思っていまして・・・
0857デフォルトの名無しさん
2007/08/05(日) 10:14:13じゃあどうするの?
0858デフォルトの名無しさん
2007/08/05(日) 10:14:28気にするようなことではない。
0859デフォルトの名無しさん
2007/08/05(日) 10:15:490860デフォルトの名無しさん
2007/08/05(日) 10:16:11new[]→std::vectorあるいはもっと低水準のメモリ確保ルーチンへの二極化。
delete→boost::scoped_ptr, boost::shared_ptr
0861デフォルトの名無しさん
2007/08/05(日) 10:17:06そもそも世の中boost使えない場合が多いの
そんな限定していいの?
0864デフォルトの名無しさん
2007/08/05(日) 10:23:080865デフォルトの名無しさん
2007/08/05(日) 10:28:06ソフトウェアの立ち上げを早くするために
遅延ロードみたいなことをしたいってこと?
0866デフォルトの名無しさん
2007/08/05(日) 10:30:080867デフォルトの名無しさん
2007/08/05(日) 11:22:59生を安全なものにするには、ラップするか、使い方に厳密な決まりを作る、しか無いよ。
本質的には。
既存の膜がないなら、できる範囲で自作するのが一番いいと思うけど。
0868デフォルトの名無しさん
2007/08/05(日) 11:57:29自分で実装するのめんどい誰か実装して。
0869デフォルトの名無しさん
2007/08/05(日) 11:59:060870デフォルトの名無しさん
2007/08/05(日) 11:59:440871デフォルトの名無しさん
2007/08/05(日) 12:35:04他いらねーしshared_ptrだけ実装してくれよ
0872デフォルトの名無しさん
2007/08/05(日) 12:58:410873デフォルトの名無しさん
2007/08/05(日) 13:01:090874デフォルトの名無しさん
2007/08/05(日) 13:06:18boostからshared_ptrだけコピペして使えよ
0875デフォルトの名無しさん
2007/08/05(日) 13:06:460876デフォルトの名無しさん
2007/08/05(日) 14:17:520877デフォルトの名無しさん
2007/08/05(日) 14:50:05依存性を調べるのが面倒くさいからなー。
shared_ptr.hppひとつコピペしたら済む話じゃないでそ?
0878デフォルトの名無しさん
2007/08/05(日) 14:51:25std::tr1::shared_ptr
libstdc++くらいしかまだ実装していないと思うけど。
0879デフォルトの名無しさん
2007/08/05(日) 14:53:04こういう流れになるから std::auto_ptr も挙げるようにしようぜ。
0880デフォルトの名無しさん
2007/08/05(日) 15:03:11auto_ptrを挙げるならばその罠や制限についても説明しなければならないだろ
単純なshared_ptrまがいなら色々見たことがあるし
そもそも基本的な原理は単純そのものだが
とうぜんそれらはshared_ptrほど注意深く実装はされていない
>>877
プリプロセッサに食わせて出力をgrepするだけの話だが
そもそも取り込むファイルが環境依存だからな
0881デフォルトの名無しさん
2007/08/05(日) 15:10:22> auto_ptrを挙げるならばその罠や制限についても説明しなければならないだろ
shared_ptr を並べて挙げとけば十分だよ。
罠や制限があっても share_ptr よりコストは低いし標準だし、
単純な例外安全目的にはぴったりだ。
0882デフォルトの名無しさん
2007/08/05(日) 15:32:320883デフォルトの名無しさん
2007/08/05(日) 15:39:05単純な delete 強制のためだけに boost が要るなんて言われても
面倒なんだよ。
0884デフォルトの名無しさん
2007/08/05(日) 15:40:430885デフォルトの名無しさん
2007/08/05(日) 15:48:59コンテナに突っ込めるスマポが標準にないところも笑いどころ。
0886デフォルトの名無しさん
2007/08/05(日) 17:08:20それをコンパイルすることを試みているのですが、
エラーがいっぱい出て、うまいごとにコンパイルできません。
Borland社のbcc32というのを使ってます。
そのソースはこちらのウェブサイトに全部載ってます。
http://www.math.temple.edu/~wds/homepage/steiner-code.c
それから、コマンドプロンプトでコンパイルを試みた結果、
以下のようなエラーが出てきました。
そのエラーにあったようにデバッグを試みたが、
どこをどうデバッグすればいいかもわからなかったので、
どなたか分かる方がいれば本当に助かります。
0887886
2007/08/05(日) 17:09:16ner-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 )
0888886
2007/08/05(日) 17:10:32main )
エラー 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 ***
0889デフォルトの名無しさん
2007/08/05(日) 17:22:28上から順番につぶしていけば?
標準から大きくずれている&独自の書き方が多いでとても読解する気になれんw
取り合えずRANDMマクロは単に乱数欲しいだけみたいだからrand()にでも置き換えてみるとか?
0890デフォルトの名無しさん
2007/08/05(日) 17:24:051989年と書いてあるな・・・
0891886
2007/08/05(日) 17:32:28ありがとうございます。
RANDM()と書いているところをrand()に置き換えたらいいんでしょうか?
>>890
だとしたら、最近のコンパイラではコンパイルできないということでしょうか?
すみませんが、ご教授お願い致します。
0892デフォルトの名無しさん
2007/08/05(日) 18:00:100893デフォルトの名無しさん
2007/08/05(日) 18:03:24を加えて、以下の修正を
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. */
0894886
2007/08/05(日) 18:03:56なんの宿題か、というわけでもないのですが、
自分は数学関連の研究をしているもので、プログラミングに関しては
ほとんど知らないわけですが、たまたま自分の研究に関連する
プログラムをネットで見つけたので、それを使えるようにしたいと
思い、なんとかコンパイラをインストールするところまでには
至ったんですが。
0895デフォルトの名無しさん
2007/08/05(日) 18:04:320896デフォルトの名無しさん
2007/08/05(日) 18:05:56#define RANDM() (rand() / (RAND_MAX + 1.0)) /* uniform random deviates in (0,1) */
0897886
2007/08/05(日) 18:13:26親切にありがとうございます。早速実行してみましたが、こうなりました。
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 ***
0898デフォルトの名無しさん
2007/08/05(日) 18:15:49#define HUGE HUGE_VAL
#define exit() exit(EXIT_FAILURE)
を追加で少しましになった
まだ、drand48,srand48でエラーが出る
drand48,srand48ってUNIX Cの関数で標準のC関数じゃないのか?
0899デフォルトの名無しさん
2007/08/05(日) 18:16:260900デフォルトの名無しさん
2007/08/05(日) 18:18:510901デフォルトの名無しさん
2007/08/05(日) 18:20:010902デフォルトの名無しさん
2007/08/05(日) 18:20:26ttp://sund1.sakura.ne.jp/uploader/source/up9355.c
0903886
2007/08/05(日) 18:24:27わざわざアップまで親切にありがとうございます。エラーが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 ***
0904デフォルトの名無しさん
2007/08/05(日) 18:25:37RANDM(a) の a を削除
0905デフォルトの名無しさん
2007/08/05(日) 18:27:21main の最後の return 0; は不要みたいだな。
0906886
2007/08/05(日) 18:28:03それじゃあ他の只でダウンロードできるやつ、もしくはフリートライアル
のやつをインストールして、やってみた方がいいでしょうか?
>>901
大体何をしたいかはわかってます。後は試行錯誤です。
InputとOutputのサンプルが載っている論文が手元にあります。
0907デフォルトの名無しさん
2007/08/05(日) 18:36:180908デフォルトの名無しさん
2007/08/05(日) 18:42:08そのまま一生試行錯誤してればいいよ
0909デフォルトの名無しさん
2007/08/05(日) 18:48:14enum {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関数の呼び出しも出来ている
みたいなのですが、なぜこういう風に動くのでしょうか?
0910886
2007/08/05(日) 18:48:41説明するのが難しいのでとりあえず論文中にあった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はこれらすべての頂点を結ぶ木
(サイクルを作らないようなグラフ)の枝の総長を表わしています。
0911デフォルトの名無しさん
2007/08/05(日) 18:52:10そして2度目の scanf("%c",&ch); で改行が ch に入る。
0912デフォルトの名無しさん
2007/08/05(日) 18:55:22一様(いちよう)じゃなくて一応(いちおう)ね
一様は「違い・むらが無い」って意味
0913デフォルトの名無しさん
2007/08/05(日) 18:56:460914デフォルトの名無しさん
2007/08/05(日) 18:58:180915デフォルトの名無しさん
2007/08/05(日) 18:59:23>最初の scanf("%c",&ch); でその適当に入力した文字が ch に入る。
>そして2度目の scanf("%c",&ch); で改行が ch に入る。
成る程です。
ちなみに、2度目の関数呼び出しの際、1度めに使われた変数の中身はクリアされないんでしょうか?
0916デフォルトの名無しさん
2007/08/05(日) 19:01:02正20面体って正三角形が20個でしょ?
0917デフォルトの名無しさん
2007/08/05(日) 19:01:150918デフォルトの名無しさん
2007/08/05(日) 19:20:14>最初の scanf("%c",&ch); でその適当に入力した文字が ch に入る。
>そして2度目の scanf("%c",&ch); で改行が ch に入る。
すいません、何故勝手に改行が入力されるのでしょうか?
その辺のFAQってどこかにありませんでしょうか?
勉強したいので。
0919デフォルトの名無しさん
2007/08/05(日) 19:22:510920デフォルトの名無しさん
2007/08/05(日) 19:27:57scanfの仕様に則っただけだからキニスルナ
0921デフォルトの名無しさん
2007/08/05(日) 19:28:59FAQだけで簡単に済まそうとしているのが間違い。
もっと基礎的なことからちゃんと勉強したら?
基本を知らずにFAQだけ読んでも、得られるものは少ないと思う。
> エラー E2379 steiner-code.c 39: ステートメントにセミコロン(;)がない(関数 buil dtree )
こんなエラーすらを自分で解決できないのでは、先に進みようが無い。
0922デフォルトの名無しさん
2007/08/05(日) 19:39:28ごめんなさい、ごめんなさい
あのー、基礎的なことってどんなことですか?
何が基礎的なことなのか分からないのです(>_<)
0923デフォルトの名無しさん
2007/08/05(日) 19:40:270924デフォルトの名無しさん
2007/08/05(日) 19:44:240925デフォルトの名無しさん
2007/08/05(日) 19:46:270926デフォルトの名無しさん
2007/08/05(日) 19:47:19a=0;b=0;c=0;とするところを、a=b=c=0;としても同じでしょうか?
0927デフォルトの名無しさん
2007/08/05(日) 19:49:34同じ、それくらい入門書でも読んでくれ。
0928デフォルトの名無しさん
2007/08/05(日) 19:55:48a=0,b=0,c=0 順番なのですか?
それとも
a=0,b=a,c=a
0929デフォルトの名無しさん
2007/08/05(日) 20:01:360930デフォルトの名無しさん
2007/08/05(日) 20:04:08あれに右左も書いてあるべ
0931デフォルトの名無しさん
2007/08/05(日) 20:06:110933928
2007/08/05(日) 20:22:08a = (b = (c = 0));は
c=0,b=0,a=0 なのですか?
それとも
c=0,b=c,a=b
つまりb = (c = 0)の処理の場合、b=0、b=cどちらが実行されるのでしょうか?
>>930 優先順位表って何ですか
0934デフォルトの名無しさん
2007/08/05(日) 20:29:400935デフォルトの名無しさん
2007/08/05(日) 20:32:08試せよそんぐらい。
0937デフォルトの名無しさん
2007/08/05(日) 20:40:12なにか違いが?
0938デフォルトの名無しさん
2007/08/05(日) 20:45:330939デフォルトの名無しさん
2007/08/05(日) 20:47:20int a;
char b;
a = b = 12345;
printf("%d %d", a, b);
0940デフォルトの名無しさん
2007/08/05(日) 20:47:35cに0が代入される。
bに(c = 0)の式の値が代入される。この場合0なので0が代入される。
aに(b = (c = 0))の式の値が代入される。この場合0なので0が代入される。
0941840
2007/08/05(日) 22:23:56C/C++でstaticを使用する場合グローバルに変数の宣言が必要かと思いますが、
クラスの部品化の観点から、出来るだけグローバル変数の使用は避けたいと考えています。
で、記憶が曖昧なんですが、以前static_castなど(テンプレートを使用していたかもしれません)を使用して
GoFのSingletonパターンを実現している記事を見かけましてこちらで質問させていただきました。
何か情報御座いましたらよろしくお願い申します。
0942デフォルトの名無しさん
2007/08/05(日) 22:29:35グローバル変数は駄目でシングルトンならいいってのは、どういう理屈かね?
0943デフォルトの名無しさん
2007/08/05(日) 22:31:51>C/C++でstaticを使用する場合グローバルに変数の宣言が必要かと思いますが、
いや…、必要ないよ
class HOGE
{
public:
static HOGE& get_instance(){
static HOGE hoge;
return hoge;
}
private:
HOGE();
};
0944デフォルトの名無しさん
2007/08/05(日) 22:42:19libjingleではboostからshared_ptrだけとりだしてコピペしてる箇所があるって聞いたぞ。
そんなに面倒とも思わんけどなぁ
0945デフォルトの名無しさん
2007/08/05(日) 22:56:04依存関係の調査自体は bcp 使えば要らない。結果の膨大さにびびるだろうけど。
0946909
2007/08/05(日) 23:23:53>「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では無いですよ。
少なくともコンパイルエラーを直してから、質問します。
0947デフォルトの名無しさん
2007/08/05(日) 23:27:12例えstaticやグローバル変数を避けてシングルトンを実装したとしても、
目的を達成する手段が変わっただけで、本質的には何も変わっていない。
そう書いてから942の焼き直しだと気付いた。
0948デフォルトの名無しさん
2007/08/05(日) 23:28:01>もしかして標準入力の内容ってバッファみたいなところに貯められるんですか?
そのとおり。
標準入力に限らず入出力にはバッファを利用されることが多い。
0949909
2007/08/05(日) 23:42:42へぇ、知らなかったです。
そんなこと、本には書いてなかったので。
イメージとしては
入力した文字がメモリのどっかに
hogehugamoge
みたいに保存されて、
そこからscanfの引数の変数の型の分(今回はchar型)
コピーされるみたいな感じなんですかね?
0950デフォルトの名無しさん
2007/08/05(日) 23:58:44正常に動くケースは、1文字目が改行で2文字目がyで3文字目が改行でしょ。
3文字目は読まれずにバッファに残ったままプログラムが終了するだけ。
0951909
2007/08/06(月) 00:11:27んで、何文字バッファに保存されるかはOSの実装によると。
0952デフォルトの名無しさん
2007/08/06(月) 00:39:3910文字程度で満杯とかそんなことはまずない。
0953デフォルトの名無しさん
2007/08/06(月) 00:45:250954デフォルトの名無しさん
2007/08/06(月) 03:34:18txtファイルから、例えば40.123/42.591/43.569という文字列を読み込んで、
真中の42.591だけを数値として変数に格納したいのですが、
どうにも巧い方法が思いつきませんorz
何卒お力をお貸し頂けますようお願い致します。
0955909
2007/08/06(月) 03:35:24/ ( ( ( ) .) )\
/ ( ( / ̄ ̄ ̄”\ .) )
/ ( ( |. | ) )
( ( ( | \ハ/ | ) )
( ( ( | ゚ ̄ 〈 ゚ ̄ | ) )
( ( ( | > | ) )
(. ( ( | /へ) / ) )
\_/|\ ー //\/
/ ̄ ̄\ ゛ーー/ ̄ ̄\
./ \ ̄ ̄ ”/ \
| ●|・| ||/ |
| | ●|・| ||/ |
| \_ ●|・| ||/ |
.\ 》||つ【♪1076】___/
0956デフォルトの名無しさん
2007/08/06(月) 03:40:07C なのか C++ なのか、まずはそれからだ。
0957954
2007/08/06(月) 03:41:45後、sage禁止だったのですね。重ね重ねすみませんorz
0958デフォルトの名無しさん
2007/08/06(月) 03:49:30~~~~~~~~~~~~
寧ろage禁止
0959デフォルトの名無しさん
2007/08/06(月) 03:50:580960954
2007/08/06(月) 04:01:480961デフォルトの名無しさん
2007/08/06(月) 04:22:280962デフォルトの名無しさん
2007/08/06(月) 04:28:03いろいろ方法はある。
scanf 系関数を使うなら、
%*f のように書式に * を挟むことで
変数に格納しなくなるようにできるのを利用するとか。
あとは1行取得して、
それを strtok で "/" をデリミタにして処理した2番目の文字列を atof するとか。
strtok を使うのが気持ち悪いなら strchr を使ってもいいかもしんない。
0963957
2007/08/06(月) 04:48:30>>962
ご解答頂きありがとうございます。
教えていただいた通り、今回はstrtokを使ってみたいと思います。
%*fという表記は知らなかったので勉強になりました。
本当にどうもありがとうございましたm(_ _)m
また皆様のお力をお借りすることがあるかと思いますが、その時はどうぞよろしくお願い致します。
0964デフォルトの名無しさん
2007/08/06(月) 04:52:45scanf()でフォーマットを'%*f/%f/%*f"にしてはいけないのか?
0965957
2007/08/06(月) 05:55:20strtok()は癖が強いのですか。
strtok()を使ったことが無かったので使ってみようかと思ったのですが、
そういうことであれば素直に%*fを使ってみたいと思います。
アドバイスありがとうございましたm(_ _)m
0966デフォルトの名無しさん
2007/08/06(月) 05:56:200967デフォルトの名無しさん
2007/08/06(月) 08:26:44// 処理 ↑
for(int j=0;j<n2;j++) { ↑
if (a[j] == b) // 条件が成立したらループを抜けて↑
}
//処理
}
0968デフォルトの名無しさん
2007/08/06(月) 08:35:09つ[goto]
まぁ、アルゴリズムを見直してbreakだな。
0969デフォルトの名無しさん
2007/08/06(月) 10:36:46trueだったらcontinueとかね
0970デフォルトの名無しさん
2007/08/06(月) 12:31:43{
static char *theTxt;
strcpy(theTxt,"TEST¥n");
printf("%s",theTxt);
}
これってtheTxt;がstaticでnull初期化されているから
駄目なんですか?
0971デフォルトの名無しさん
2007/08/06(月) 12:38:10theTxtはポインタ。
strcpyはポインタの指すアドレスにデータをコピーする関数。
問題は、theTxtがどこも指していないこと。
mallocで確保するとか、配列にするとか、データの領域をまず用意
0972デフォルトの名無しさん
2007/08/06(月) 12:39:01まあ同じだけど。
0973デフォルトの名無しさん
2007/08/06(月) 12:41:58有り難うございます
0974デフォルトの名無しさん
2007/08/06(月) 13:35:12>アドレス0を指してる、とも言えるか。
いえない。
因みに、初期化されていないポインタは
「何処を指しているかわからない」
0975デフォルトの名無しさん
2007/08/06(月) 13:35:58staticがついてると0に初期化される
0976デフォルトの名無しさん
2007/08/06(月) 13:36:57ただ、アドレス 0 だとは限らない。
0977デフォルトの名無しさん
2007/08/06(月) 13:40:290978デフォルトの名無しさん
2007/08/06(月) 13:57:16「ぬるぽはどこも指していない話」じゃないのか?
0979デフォルトの名無しさん
2007/08/06(月) 14:04:280980デフォルトの名無しさん
2007/08/06(月) 15:01:18ぬるぽ! ぬるぽ! ぬるぽ!
ぬるぽ! ∩ ∩ ノ) ぬるぽ!
ぬるぽ! 川 ∩ 川彡'三つ ぬるぽ!
ぬるぽ! ⊂ミ∩、⊂ミ∩彡⊃ ぬるぽ!
ぬるぽ! ⊂三ミ( ゚∀゚)彡三彡三⊃ ぬるぽ!
ぬるぽ! ⊂彡川⊂彡川ミ⊃ ぬるぽ!
ぬるぽ! ⊂彡川∪⊃ U川彡⊃ ぬるぽ!
ぬるぽ! (ノ ∪ 川 ∪ミ) ぬるぽ!
ぬるぽ! ∪ ぬるぽ!
ぬるぽ! ぬるぽ! ぬるぽ!
ぬるぽ! ぬるぽ!
ぬるぽ!
0981デフォルトの名無しさん
2007/08/06(月) 21:47:18#define 0 NULL
0982デフォルトの名無しさん
2007/08/06(月) 22:40:13遠回しにAPIを呼んでたりするんですか?
0983デフォルトの名無しさん
2007/08/06(月) 22:47:34そこらのOS毎の差異を吸収するのも標準ライブラリの役目
0984デフォルトの名無しさん
2007/08/06(月) 22:48:240985デフォルトの名無しさん
2007/08/06(月) 22:51:22かなり単純なものでないとCのみでしょり出来ないからな
0986デフォルトの名無しさん
2007/08/06(月) 22:53:31○>>976
C言語の仕様によれば、staticな変数は『定数ゼロ』(K&R第2版)で初期化される。
だから
static char *theTxt;
は、
static char *theTxt = 0;
と置き換える。
ここで、定数ゼロは整数型に代入されれば整数0であり、ポインタに代入されればヌルポインタになる。
ヌルポインタは、(アドレス0を指す処理系もあるかもしれないが、)
『どこも指していないポインタ』が正解。実際のbit列がゼロの連続とも限らない。
従って、ヌルポインタはprintf()の引数として処理できない。
ちなみに、『ぬるぽ』はNullPointerExceptionの略で、ヌルポインタではない。
0987デフォルトの名無しさん
2007/08/06(月) 22:54:54#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;
}
何か問題はありますか?教えてください。
0988gotoです
2007/08/06(月) 22:55:51ほら、try-catch句がなかったあの頃を思い出してください・・・
0989デフォルトの名無しさん
2007/08/06(月) 22:58:45釣り?
0990デフォルトの名無しさん
2007/08/06(月) 23:02:370991デフォルトの名無しさん
2007/08/06(月) 23:03:22とりあえずmainの'{'に対応する'}'と、fcloseが足りない。
0992987
2007/08/06(月) 23:07:22ソースが長いので省略しています。
コンパイルエラーはないんですが
テキストファイルが読み込めないんです。
0993デフォルトの名無しさん
2007/08/06(月) 23:09:38実行方法は?
まさか、カレントディレクトリにファイルがないって落ちじゃないよな?
0994デフォルトの名無しさん
2007/08/06(月) 23:10:310995デフォルトの名無しさん
2007/08/06(月) 23:11:320996987
2007/08/06(月) 23:16:06今まで動いていたプログラムもファイルが開かなくなりました。
ライトファイルはできます。
0997デフォルトの名無しさん
2007/08/06(月) 23:18:07アプリケーションを全部終了するか、最悪OS再起動したら直るんじゃないかね。
0998987
2007/08/06(月) 23:19:450999デフォルトの名無しさん
2007/08/06(月) 23:22:171000デフォルトの名無しさん
2007/08/06(月) 23:26:49http://pc11.2ch.net/test/read.cgi/tech/1186410368/
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。