07/07/18 09:10:30
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.39【環境依存OK】
スレリンク(tech板)
【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)
2:デフォルトの名無しさん
07/07/18 09:59:03
おつ
3:デフォルトの名無しさん
07/07/18 10:25:22
Cはそこそこ使ってて、C++を使い始めて日が浅いんでよくわかってないんだけど、
ユーティリティー関数というか特定のクラスに依存しない関数群ってクラスとしてコード書くよりもCの関数として書いた方がいいのかな?
関数をちょっと使いたい時に、わざわざクラスの実体作って関数呼び出しするのってなんかスマートじゃない様な気もするんだけど、C++なのに普通のCのコードが混ざるのもスマートじゃない様な気がするんだよなあ。
どっちがいいんだろう
4:デフォルトの名無しさん
07/07/18 11:10:29
>>3
>わざわざクラスの実体作って関数呼び出しするのって
class A {
static void B();
};
A::B(); // インスタンス不要
まあ↑みたいなことするくらいなら、
名前空間に入れたグローバルな関数でいいんじゃないかと。
5:デフォルトの名無しさん
07/07/18 11:11:19
>>3
そんなときはnamespaceで囲ってしまえばいいんでない?
#昔はstaticなメンバ関数しか持たないクラスを作るケースもあったけどね。
6:デフォルトの名無しさん
07/07/18 13:01:06
>>4
>>5
サンクス。ネームスペースを使ってみるわ~
7:デフォルトの名無しさん
07/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要素数のベクトルはスカラー変数に代入できないよ」
と解釈したのですが、実際どうなのでしょうか。
よろしくお願いします。
8:デフォルトの名無しさん
07/07/18 13:59:49
out_one_statement[12] の中身も言わずに・・・
9:デフォルトの名無しさん
07/07/18 14:10:46
>>8
char out_one_statement[9][32]={0};
と宣言して、
main関数外でchar型の変数を代入して、
main関数内でそれを先に説明したように操作しています。
環境はVC++2005です。
10:デフォルトの名無しさん
07/07/18 14:13:12
>main関数外でchar型の変数を代入して、
具体的に何をどうやって代入したんだ。
もしくはデバッガで中身見てみようぜ
11:デフォルトの名無しさん
07/07/18 14:13:37
out_one_statement[0]からout_one_statement[8]までchar*型として使えるのだから、out_one_statement[12]は論外。
12:デフォルトの名無しさん
07/07/18 14:14:08
プログラム超初心者です。
本とか買って独学で学べば良いですか?
スクールとか行くべきですか?
13:デフォルトの名無しさん
07/07/18 14:16:54
>>12
両方やるべし
14:デフォルトの名無しさん:7
07/07/18 14:54:21
プログラムは端的に言ってパターンマッチングです。char型の文字列から
パターンを抽出するので、外部関数内で、入力(配列)からパターンを
見つけて、char型の変数でフラグを立てたり、抽出した文字列を
出力配列out_one_statement[9][32]の"列"へ代入させています。
利用側で扱う時は
char index0, index1 /* この値も代入対象 */
out_one_statement[index0][index1]
あるいは、
out_one_statement[32*index0 + index1]
out_one_statement[32*INDEX + index1]
のようにして右辺値に利用しています。
15:デフォルトの名無しさん
07/07/18 14:55:30
列ってどっちさ。
16:デフォルトの名無しさん:7
07/07/18 14:56:11
>/* この値も代入対象 */
外部関数が出です。
17:デフォルトの名無しさん:7
07/07/18 14:57:52
>>15
[32]側です。代入操作後に代入状態をチェックしましたが、
それについては問題がないようです。
18:デフォルトの名無しさん
07/07/18 14:58:50
・ char out_one_statement[9][32] なのに out_one_statement[12] という範囲外の要素を参照しているのはなぜか
・ atoi で 0 が帰ってくる時の out_one_statement[12] には何が入っているのか
19:デフォルトの名無しさん:7
07/07/18 15:04:18
>char out_one_statement[9][32] なのに out_one_statement[12]
out_one_statement[0][12] == out_one_statement[0*index0 + 12]
== out_one_statement[[12]
として扱っているのですが、これに問題があるのですか?
>atoi で 0 が帰ってくる時の out_one_statement[12]
3 '□'です。
20:デフォルトの名無しさん:7
07/07/18 15:06:51
>out_one_statement[0][12] == out_one_statement[0*index0 + 12]
out_one_statement[0(index0 = 0)][12] == out_one_statement[32*0 + 12]
でした。。。
21:デフォルトの名無しさん
07/07/18 15:18:47
>>19-20
根本的に間違ってる。そんな等号は成立しない。
22:デフォルトの名無しさん
07/07/18 15:19:37
実際には out_one_statement は char の一次元配列として定義してるの?
23:デフォルトの名無しさん
07/07/18 15:19:38
ちゃんとNULL終端になってるのか?
24:デフォルトの名無しさん:7
07/07/18 15:46:49
何となくわかりました。
atoi()にかかわらず、アドレス渡し時には”行”アドレスを渡すので、
int ctoi(char *char_var, char addr)
{
int i;
i = char_var[addr];
return i;
}
と関数作って変換することにしました。
25:デフォルトの名無しさん
07/07/18 15:49:27
char out_one_statement[9][32]なら、
out_one_statement[12] == &out_one_statement[12][0] だよ。
out_one_statement[0][12]をアクセスしたいならout_one_statement[0][12]と書こうよ。
26:デフォルトの名無しさん:7
07/07/18 15:57:53
>>21
間違いを教えていただけませんか。よろしくお願いします。
char *char_varの
*char_varはメモリ空間上、char_var[0]と等しく、
char_varはメモリ空間上、&char_var[0]と等しいと本で読んでいました。
二次元配列でも、先頭アドレスのchar_var[0][0]"のみ"を渡すのだとして
間違っていたようです。
>>18さんのご指摘はこの辺が絡んでいるのでしょうか?
27:デフォルトの名無しさん:7
07/07/18 16:04:17
>>25
そうですね。きちんとインデックスを明示すれば問題なかったことですね。
今回のことで学習できました。ありがとうございます。
>out_one_statement[12] == &out_one_statement[12][0] だよ。
今回これが分かりました。また御厄介になるときがあると思うので、
その時よろしくお願いします。
#>>24で分かりましたが、この関数は使わないようにします。
ありがとうございました。
28:デフォルトの名無しさん
07/07/18 19:10:32
1から9までの数字を1回ずつ使った9桁の数字を小町数という。
二乗した数が小町数となるような自然数をすべて求めるプログラムを
作成し、その数と小町数の両方を出力せよ。例えば24441の二乗は
597362481であり、小町数となる。
全然手をつけられません。できる方いればお願いします。
29:ERP
07/07/18 19:12:20
久しぶりにプログラムを書き始め、visual studio 2005でc++
とMFCを使っていますが、外部の機械に入出力ポートからトリガー
パルスを出力したいとおもってます。昔のbasicとか古典的なCでは
そのような関数(oportのような?)が用意されていたように思い
ますが。最近のWIN32環境ではみあたりません。
どのようにしたらいいでしょうか?
30:デフォルトの名無しさん
07/07/18 19:15:23
つ[インラインアセンブラ]
31:デフォルトの名無しさん
07/07/18 19:20:48
>>28
全ての小町数の平方根とっていけば求まりそうだなぁ
32:デフォルトの名無しさん
07/07/18 19:23:20
>>31
11111から31427の二乗が小町数かどうかチェックした方が早い希ガス。
33:デフォルトの名無しさん
07/07/18 19:33:21
>>29
デバイスドライバを呼ぶ。
34:デフォルトの名無しさん
07/07/18 19:35:19
>>28
宿題は宿題スレへ。
現行のスレに同じ問題と答えが載っている。
35:なんだ。いいや、書いたから貼っておこう。
07/07/18 19:47:34
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
static int compareChar(const void * l, const void * r)
{
const char * cl = (const char *) l;
const char * cr = (const char *) r;
if (* cl < * cr) return -1;
if (* cl > * cr) return 1;
return 0;
}
static bool isKomati(int val)
{
if (val < 123456789 || val > 987654321) return false;
char buf[10];
sprintf(buf, "%d", val);
if (strchr(buf, '0')) return false; // 小町数に0はない
qsort(buf, 9, 1, compareChar);
if (strcmp(buf, "123456789") != 0) return false;
return true;
}
int main()
{
for (int ic = 11111; ic * ic < 987654321; ++ic) {
if (ic % 3 != 0) continue; // 小町数は9の倍数なので、その平方根は3の倍数
if (isKomati(ic * ic)) {
printf("%d * %d = %d\n", ic, ic, ic * ic);
}
}
return 0;
}
36:デフォルトの名無しさん
07/07/18 22:02:56
wchar_t *p = L"Hello!";
のLって標準と考えてもいいんでしょうか?
もしかしてWindowsだけですか?
37:デフォルトの名無しさん
07/07/18 22:08:24
>>36
標準
38:デフォルトの名無しさん
07/07/18 22:24:58
>>29
私だったら、シリアルポートのCTS/RTSとかで制御するけど。
それならWIN32APIで、CreateFileとDCB構造体を操作するAPIを使えばいい。
ややこしいけど、直接IOポートをたたきたくても無理だからね。
それにしても、メール晒すなんて勇気ある御仁ですな。
39:デフォルトの名無しさん
07/07/18 23:01:40
最近Cをやり始めた者です、ふと疑問に思ったのですがVisualC++、BorlandC++などのコンパイラがありますが
それらの違いとは何なのでしょうか。あとコンパイラが違うとプログラムの書き方も変えないといけないのでしょうか。
くだらない質問ですいません。
40:デフォルトの名無しさん
07/07/18 23:06:53
標準ではない部分が違う
41:デフォルトの名無しさん
07/07/18 23:15:58
標準への準拠率も違う可能性が
42:デフォルトの名無しさん
07/07/18 23:16:00
>>39
世界標準の規格としての部分があり、それに各社独自な部分を加えている、とでも言えばいいんだろうか。
書き方で注意を要するようになるのは、多分C++のクラスを勉強し始めてからになるんじゃないかと。
43:デフォルトの名無しさん
07/07/18 23:23:59
作っているメーカーが違う。
Visual C++はMicrosoftが作っているし、Borland C++はBorlandが作っている。
それぞれ自分の製品を買ってもらおうと必死なんで、
プログラム作りを補助するツールやライブラリなどに独自色を打ち出している。
しかし、どれもC++処理系を名乗る以上、コンパイラと標準ライブラリなどの部分は、
ISOの国際標準に則っているので、そういう独自機能を使わない限りは、
どのコンパイラでも同じ書き方が通用する。
……というのが理想だが、現実は標準への対応具合や
標準が認めているコンパイラごとの挙動の違いなどがあるので、
時にどのコンパイラでも通用するプログラムを書くというのは難しいこともある。
C++はそれが比較的顕著なほうだが、そんなこと日常的に気にする必要があるのは、
基本的に良くも悪くも(周囲の環境か本人が)変態な場合だけなんで、
やっぱり普通はそんなこと気にする必要がない。
44:デフォルトの名無しさん
07/07/18 23:24:20
なるほど、あつかましいようですがVisualC++とBorlandC++
どちらのほうが入門に適しているんでしょうか?
45:デフォルトの名無しさん
07/07/18 23:28:39
VisualC++は入門には不必要な部分が多いが、慣れておくのも良い
46:デフォルトの名無しさん
07/07/18 23:29:52
すでにやり始めてるならそのまま続けろ
47:デフォルトの名無しさん
07/07/18 23:32:15
とりあえず言語の勉強だけなら
Visual C++ 2005 Express でいいんじゃないの。
無料だし。
48:デフォルトの名無しさん
07/07/18 23:37:16
BCも無料なんだけどパスってのが分からなかったりメモ帳しか使ったことがないってのなら>>47のVC++が良いよ。
49:デフォルトの名無しさん
07/07/18 23:40:42
BC はメルアド晒すことになるし・・・
50:デフォルトの名無しさん
07/07/18 23:51:37
そしてC++/CLIとごっちゃになって混乱する、と
51:デフォルトの名無しさん
07/07/18 23:57:34
URLエンコードされたものをデコードしたいんですけど
何か良いライブラリってありますか?
52:デフォルトの名無しさん:7
07/07/19 00:06:36
>>7です。
質問があります。以下のような関数を作ってファイル出力させてみたところ、
Windowsにあるノートパッドで、文字列を表示できません。。。
int output_dfg_to_file(){
FILE *fp;
char filename[64];
int state = 1,
index0,
index1;
int char_lib;
printf("OUTPUT >> DFG File Name: \n");
gets_s(filename);
if ((fp = fopen(filename, "w")) == NULL){
printf("ERROR: could not open file. \n");
state = 1;
goto exit;
}
for (index0=0; index0 < LIB_TABLE_SIZE; index0++){
for (index1=0; index1 < LATTER_SIZE; index1++){
char_lib = table[index0][index1];
printf("%c", char_lib);
fputc(char_lib, fp);
}
fputc('\n', fp);
}
fclose(fp);
exit:
return state;
}
いったん送信~
53:デフォルトの名無しさん
07/07/19 00:11:47
文字を出力していないのではないか?
table[index0][index1]
ってなにさ?
54:デフォルトの名無しさん:7
07/07/19 00:15:45
>>52
char table[TABLE_SIZE][LATTER_SIZE] = {0};
で出力もとデータを扱っています。
fputcは、他の関数も使った事がないので上記で出力させてできたら
移行しようと思っています。fputcは出力文字対象の整数を引数に
していますが、ファイル書き込み時にも整数(int)のまま書きこん
でいるのでしょうか?
普段使っているtex¬epadで出力したファイルを編集したいので、
上記関数をどう変更すればいいかわからないでいます。
よろしくお願いいたします。
55:デフォルトの名無しさん
07/07/19 00:25:23
>>54
printf()での出力はどうなってる?
56:デフォルトの名無しさん:7
07/07/19 00:42:59
>>55
int ctoi(char *char_var, char addr){
int i;
i = char_var[addr];
return i;
}
でもって、先のボディを
char_lib = ctoi(&table_logical_object[index0][0], index1);
printf("%d", char_lib);
fputc(char_lib, fp);
としてみますと、
1.改行がされない。
2.0で初期化しているので、0が混ざって出力される。
3.フラグは適切にアサートされている
といったところです。
57:デフォルトの名無しさん
07/07/19 00:51:04
>>56
printf("%d", char_lib)
となってるけど >>52 みたいに%cでやってみて
ちゃんとコンソールに出力されてなければテーブルの中身がおかしいのかな?
58:44
07/07/19 00:52:53
わざわざ答えてくださってありがとうございました。
59:デフォルトの名無しさん:7
07/07/19 01:24:49
>>57:%c表示
コンソールには適切に表示される文字とされない文字がありました。
特定列だけ正常に表示されています。
出力用配列への代入時のキャスティングに問題ありかなと思えました。
そこで、出力用配列を整数型に代えて、%dで表示してみると、
整数値としてきちんと10進数表示はできました。
問題は文字列表示です。。。
60:デフォルトの名無しさん
07/07/19 05:01:33
教科書のソースなら読めるのですが、
コメントの少ない1000行くらいの物がなかなか読めません。
どうすればソースコードを読むのがうまくなるのでしょうか?
61:デフォルトの名無しさん
07/07/19 05:19:48
>>60
まず大局から把握していく
書かれてる処理が何のアルゴリズムの実装かとか、
(クラス名→)関数名・グローバル変数名→ローカル変数名と見て行って
それぞれの役割とかに見当をつけて読む
理解した部分にコメントを付けながら読むといい
あと色んなコーディングスタイルのプログラムを読んで経験しておくのもいい
62:デフォルトの名無しさん
07/07/19 06:21:55
ちなみに何行くらいの物が読めると
中級者になるのでしょうか?
63:デフォルトの名無しさん
07/07/19 06:48:24
行ではないと思う。
64:デフォルトの名無しさん
07/07/19 10:07:49
てか関数にコメント付いてないソースは窓から投げ捨ててよし
65:デフォルトの名無しさん
07/07/19 11:51:38
質問があります。
MS VS2003 C++のGDI+なのですが、
Imageクラスのオブジェクトに画像が入っているとして、
1ドット目、座標 (0, 0) の色を取得するにはどうしたらよいでしょうか?
Image* img = new Image("pic.bmp");
Color aColor = image.getPixelColor(0, 0);
みたいにしたいのです。
よろしくおながいします。
66:デフォルトの名無しさん
07/07/19 13:57:13
>>65
エラーメッセージやライブラリドキュメントをよく読めばよいです。
67:65
07/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
68:デフォルトの名無しさん
07/07/19 14:42:06
>>67
エスパー以外お断りなら先にそう言え。
69:デフォルトの名無しさん
07/07/19 14:43:15
すみません。C++初心者です。
C#でWindowフォームプログラムを作成したのですが、
インストールが出来ないPCで稼動させねばならなくなりました。
(そのマシンには.NetFrameWorkが入っていない)
短いプログラムなので作成しなおしてもよいのですが、
C#から、インストーラを稼動させたりランタイムをインストールさせたりせずに
インストーラ不要のEXEプログラムを作成するのに一番良い方法はなんでしょうか?
環境が似ているVC++2005 ExpressEditionをDLしてみたのですが、
インストーラ不要のEXEプログラムの作成の方法がわかりません。
(作成できるかどうかもわかりません)
すみませんが、どうかご教示願います。
開発環境:WinXP
実行環境:Win2000、WinXP
70:デフォルトの名無しさん
07/07/19 14:50:54
>>68
ほら、「エラーメッセージやライブラリドキュメントをよく読めばよいです。」
ってまたレスしなよ。
71:デフォルトの名無しさん
07/07/19 14:51:57
>>67
エラーメッセージやライブラリドキュメントをよく読んで自己解決したならそれは
>>66のおかげw
72:デフォルトの名無しさん
07/07/19 14:54:55
>>69
結局、最終的に動かしたいのはC#で作ったやつなのかC++なのか?
C++ならランタイム無しでシステム標準のDLLだけで動作するものは
作れるが、それとC#のプログラムとは何の関係もないぞ?
73:72
07/07/19 14:57:30
C++でもフォームで作れるけど、それじゃ.NET環境必須だから意味ないよな
ということで、C++で作ることになるけど、かなり初歩からやらないとならんかもな。
MFCのスタティックリンク、が一番近いかなあ、、、
74:デフォルトの名無しさん
07/07/19 14:58:45
>>67
そんなら、GraphicsからBitmap作成して、
Graphics::DrawImage()して、
そのBitmapからピクセル取得したほうがいいんじゃないかな。
75:69
07/07/19 14:58:47
早速の回答ありがとうございます。
ランタイムなしで作成できるならC++で作成したいです。
C#のコードを捨てるのは全く問題ないのですが、
ある程度慣れたVC++2005ExpressEditionで作成出来ればと思っています。
76:デフォルトの名無しさん
07/07/19 15:02:05
>>75
CだろうがC++だろうが、ランタイムは(普通は)使うことになるが、
静的にリンクすることで、外部のDLLに依存するのではなくプログラムに
埋め込むことが出来る。
まあ、良し悪しなんだがな。
77:デフォルトの名無しさん
07/07/19 15:03:46
>>75
EEだと、MFCも無いのでマウスで貼り付けるようなのは無いぞ。
まあテキストで全部できるし、リソースエディタを外部ツール使えばいいか。
78:デフォルトの名無しさん
07/07/19 15:06:02
>>73
開発環境が 2005EE だと リソースエディタ と MFC は無いんじゃなかったっけ?
フォーム風のをフルスクラッチで書くのは泣ける希ガス
79:69
07/07/19 15:06:29
>>76,77
ありがとうございます!
>>76
EEだと、MFCも無いのでマウスで貼り付けるようなのは無いぞ。
まあテキストで全部できるし、リソースエディタを外部ツール使えばいいか。
その方法が知りたいのですが良く分かりません。
ご教示頂ければ幸いです。
80:デフォルトの名無しさん
07/07/19 15:09:23
wxWidgetとかQTとか使うといいんじゃね
81:デフォルトの名無しさん
07/07/19 15:10:33
>>79
URLリンク(freepg.fc2web.com)
URLリンク(www.microsoft.com)
この辺読んでみて
自分はPro版持ってるからやったことないけど
82:デフォルトの名無しさん
07/07/19 15:13:52
>>80
スタティックリンクできるっけ。
インストール不要なら検討の余地はあるね。
83:デフォルトの名無しさん
07/07/19 15:15:14
>>82
ライセンスまで含めてマジメに考えるとどうなるか分からん
84:デフォルトの名無しさん
07/07/19 15:15:25
てかC++Builder Explorerつかえばいいんじゃないか?
85:デフォルトの名無しさん
07/07/19 15:16:41
>>82
インストールは不要だね
どうしても実行ファイルは大きめになるけど
86:デフォルトの名無しさん
07/07/19 15:37:07
>>79
URLリンク(freepg.fc2web.com)
URLリンク(0xcc.net)
URLリンク(www.geocities.co.jp)
これもどうぞ
87:デフォルトの名無しさん
07/07/19 16:11:41
次のようにintとfloatが混在しているとファイルに正しく書き込めないんでしょうか?
読み出すとき値が壊れています・・・
for(k=0; k<100; k++) {
fp.write(( char * ) &k,sizeof(unsigned int ) );
fp.write(( char * ) &x[k],sizeof( float ) );
}
88:デフォルトの名無しさん
07/07/19 16:14:03
87です
すみません
バイナリモードで開いていませんでした
89:デフォルトの名無しさん
07/07/19 16:22:32
>>88
というか…2行目の
fp.write((char *)&k, sizeof(unsigned int));
もうこの時点で何をしたいのかよく分からない。
変数kのアドレスを出力してるの?
何のために?
…俺が勘違いしてるのかな。
90:デフォルトの名無しさん
07/07/19 16:27:53
>>89
> …俺が勘違いしてるのかな。
うん。
91:デフォルトの名無しさん
07/07/19 16:40:25
普通に見られる書きかただと思うけど、何と勘違いしたのだろう。
92:デフォルトの名無しさん
07/07/19 18:26:31
確かによく使われる書き方だけどキャストしまくりでソースが汚れるからこういうのを考えました
template <typename Rng, class OutStream>
OutStream& binWrite(Rng& rng, OutStream& os) {
using namespace boost::lambda;
using boost::addressof;
using boost::range_value;
boost::for_each(rng,
bind( &OutStream::write, &os,
ll_reinterpret_cast<char*>( bind( addressof<typename range_value<Rng>::type >, _1 ) ),
ll_static_cast<std::streamsize>( ll_sizeof( _1 ) )
)
);
return os;
}
使い方は
std::ofstream ofs("test.dat");
std::string a("abcdefg");
として
binWrite(a,ofs);だけでおk
どうよ?
93:92
07/07/19 18:40:35
すいません
横からserialization使えとか言われて気づいたので>>92は見なかったことにしてくだしあ><
94:デフォルトの名無しさん
07/07/19 22:56:36
VC++ 2005 Express で
std::ofstream file("c:\\日本語ファイル名", std::ios::out | std::ios::binary | std::ios::trunc);
とするとファイル名が文字化けしていまいます、ofstreamでは日本語ファイル名が使えないのでしょうか?
プロジェクト設定をUnicode、マルチバイトどちらにしても結果は一緒でした
95:デフォルトの名無しさん
07/07/19 22:58:55
>URLリンク(miyano.s53.xrea.com)
だってさ
96:デフォルトの名無しさん
07/07/19 23:04:57
>>95
ありがとうございます
setlocale(LC_ALL, "Japanese");
を呼ぶことで無事できました。
VCのバグっぽいですね
97:94
07/07/19 23:07:46
プロジェクト設定Unicodeでやってもだめだったのは L"ファイル名" としていなかったからでした
98:デフォルトの名無しさん
07/07/19 23:43:15
VC++ 2005 Expressを使用しています。
画像表示に関する質問です。
PictureBoxに複雑な画像を描写しました(Setピクセル)。
その画像に、Drawlineで線を描きました(マウスmove等を使用)。
この線を書き直したいのですが、線を消すために
DrawlineのWhitePenを使用すると、せっかく読み込んだ複雑な画像まで、
白抜きになってしまいます。
後から書き加えた線だけを消去したい場合は、
どのような方法で消去すればいいでしょうか?
ご指導お願いします。
複雑な画像を一旦保存しておけばいいのかなぁ
と思っているのですが・・・
よろしくお願いします。
99:デフォルトの名無しさん
07/07/19 23:45:05
>>94
次からは、文字列には頑張って
TEXT("とりあえずTEXTつけときます")
ってしとこうな。
それがいやならリソースにしとくれ
それにしても、MBCSでも日本語きちんとコンパイルできるサービスパックを早くツクレカス>マイクロソフト
100:デフォルトの名無しさん
07/07/19 23:50:04
おまいらよ、まだ、VS2005の文字セットMBCSしているのか?
いいかげん、海栗コードにしろよな。
101:デフォルトの名無しさん
07/07/19 23:51:13
>>98
>複雑な画像を一旦保存しておけばいいのかなぁ
>と思っているのですが・・・
>よろしくお願いします。
うん。
原則として、OnDrawが呼ばれる度に操作と順番通りに書き込むのがウィンドウズの基本。
一回書く毎にピクセルを保存すると、UNDO限界回数と画像の大きさによっては
莫大なメモリが必要になるから。
102:98
07/07/20 00:01:58
>>101
ありがとうございます。
もしよろしければ、一旦保存する方法を教えて頂けますか?
キャプチャというのを使うのかと思ったのですが、
なかなかうまくいきません。
103:94
07/07/20 00:07:46
>>99
テストコードだから抜けてた・・・
と、言い訳
104:デフォルトの名無しさん
07/07/20 00:15:27
string::find_first_of()で大文字小文字を区別して検索する方法ってある?
105:デフォルトの名無しさん
07/07/20 00:19:40
何も考えずにやったら区別されるはず
106:101
07/07/20 00:20:46
>>98
一旦保存というのをちょっと勘違いしているかもしれない。
画像をピクセルで保存するのではなく、
白紙の状態からラインを引く関数の始点・終点・色を全て覚えさせておくのですよ。
だから、それを覚えさせるための仕組み(普通は構造体の配列とかリストなど)を作っておいて、
UNDOしたかったら、現在までの手順から1個引いたまでの手順をウインドウに書き込むということ。
例えば、ピクチャーのまま保存して、応用で10回までUNDOできるという作り方もできるが
それは↑の課題をクリアしてからじゃないかな。
今のマシンだったら、1000個程度のラインは一瞬で引けるよ。
話は変わるが、単に今の画像をキャプチャしたいのなら、Alt+PrintScreenキーでコピーして
ペイントか何かに貼り付ければいい。
残念だがPictureコントロールは使った事が無いのでプログラムでの操作は知らない。
107:98
07/07/20 00:30:49
>>101
ありがとうございます。
一旦保存を勘違いしていたようです。
これから、再チャレンジしてみます。
ありがとうございました。
108:デフォルトの名無しさん
07/07/20 02:05:22
>>100
VCLが海栗コード対応しないんだもの(´・ω・`)
109:デフォルトの名無しさん
07/07/20 07:12:27
すいません、質問です。
enum Type{
UNDEF,
SYS
};
#define TYPE(t, nargs) ((t)*1000+(nargs))
enum keywords{
READ,
WRITE
};
struct s_keywords{
char *key
int type;
int i;
};
static struct s_keywords func[] = {
{"read" , TYPE(SYS, 0), READ}
省略
というマクロが有るんですが、
TYPE(SYS, 0)の部分はどのように置換されるのでしょうか?
110:デフォルトの名無しさん
07/07/20 07:20:58
(UNDEF+1) * 1000 + 0
だから恐らく1000
111:デフォルトの名無しさん
07/07/20 07:52:49
有り難うございます。
マクロってこんな事も出来たんですねぇ。
112:デフォルトの名無しさん
07/07/20 09:21:26
eclipse,CDTで開発しています。
普通はprintf("1"); scanf("%d",&num);とやれば1が表示された後入力を求められるのですが、
何故か私の環境では1が表示されずいきなり入力を求められ、
printf("1"); fflush(stdout); scanf("%d",&num); とやらないと正常に表示されません
何か出力ストリームの挙動がおかしいです。
ググってみたところfflush(stdout);をするとそれなりに処理時間がかかってしまうそうですし・・・
これってスピードを求められるcでは致命的ですよね?
ググると同じような現象が起こった方が数人居るようですが、解決方がfflush(stdout);
しか載っていません。fflush(stdout);以外の解決法教えてください。
コンパイラはMinGW5.0 + msys1.0 CDTはeclipse3.3の更新サイトでついてくる奴
使ってます。
113:デフォルトの名無しさん
07/07/20 09:34:40
ユーザー入出力にスピード求めるのか?
対象ユーザーどんだけニュータイプなんだよw
114:デフォルトの名無しさん
07/07/20 09:38:27
対象ユーザーじゃなく112がニュータイプ
115:112
07/07/20 09:54:59
そうですか。では普通にfflush(stdout);で解決しても無問題ということですね。
ご回答thx
116:デフォルトの名無しさん
07/07/20 11:01:57
>>112
その辺は微妙な話だと思う。
stdoutは端末に結び付けられている場合は行バッファリングされ、
そうでない場合はフルバッファリングされるのが伝統的実装のようだが、
規格でそうしろと決まっているわけでもないようだ。
stderrがバッファリングなしというのは決まっていたはずだが。
さらに、入力を行う際は、行バッファリングされている出力を
前もってフラッシュすることになっていたと思うが、よく分からん。
stdoutが行バッファリングされている場合に、>>112のような
コードで、改行なしのプロンプトを表示後に入力できるためには、
そうなっていなければならないのだが。
もしかしたら、>>112の環境ではstdoutがフルバッファリングされているのかもな。
確実に即座に出力を表示したい場合は、stderrを使うというのが一つの手だが、
いちいち fprintf(stderr, ...) と書きたくないのなら、
setvbuf()を使ってstdoutをバッファリングなしに設定するという方法もある。
stdoutはリダイレクトされることもあるのだから、できれば
isatty()などを用いて標準出力が端末かどうかを見たほうが良いのだが、
残念ながらこの方法は移植性があるとは言えないのが難点だ。
117:デフォルトの名無しさん
07/07/20 14:49:27
C++の認定試験てあるの?
118:デフォルトの名無しさん
07/07/20 14:51:36
ある。俺が創った。
119:デフォルトの名無しさん
07/07/20 14:57:04
そしてオレが認定。
120:デフォルトの名無しさん
07/07/20 17:27:53
そして俺が脱落
121:電通女 ◆v1Uy5WkQ7k
07/07/20 20:38:06
#include<stdio.h>
struct complex{
double re,im;
};
この意味を教えてください。
122:デフォルトの名無しさん
07/07/20 20:43:17
ストラクトは構造体、コンプレックスはそれにつけた名前(intとか、charとかに匹敵)
その次のダブルはその構造体の構成要素、だと思います
私はc言語暦1週間くらいなので当てにならないかもしてませんが
123:デフォルトの名無しさん
07/07/20 20:43:42
電通女 ◆v1Uy5WkQ7k に一致するページは見つかりませんでしたからダメです。
124:デフォルトの名無しさん
07/07/20 20:45:06
>>121
構造体って習った?
125:電通女 ◆v1Uy5WkQ7k
07/07/20 20:47:29
構造体で、"re"と"im"という変数を定義してるって事ですか?
126:デフォルトの名無しさん
07/07/20 20:49:57
それって複素数でそ?
私にもわかるよww
127:電通女 ◆v1Uy5WkQ7k
07/07/20 20:53:36
それは分かってるんですが、プログラムの意味がわからなくて。
128:デフォルトの名無しさん
07/07/20 20:57:50
>>121
struct kozotai{
double a;
double b;
};
これが何か分かるならそれもわかるはず
129:デフォルトの名無しさん
07/07/20 20:58:40
double型の変数reとimを含む構造体complexを宣言した。
それだけ
130:デフォルトの名無しさん
07/07/20 21:04:39
>>127
子宮で考えるんじゃない、脳で考えるんだ!!
131:デフォルトの名無しさん
07/07/20 23:26:39
あまりにも初心者すぎる質問ですが、お願いします。
VC++2005EEで新規作成->Win32コンソールアプリケーションを作成(オプションで
"空のプロジェクト"を選択)した後、
#include<iostream>
int main(){
std::cout << "hello";
return 0;
}
だけのmain.cppをソースファイルフォルダに作成し、これをビルドしようとすると
以下3つのエラー:
main.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall
std::ios_base::Init::Init(void)" (??0Init@ios_base@std@@QAE@XZ) が関数
"void __cdecl std::`dynamic initializer for '_Ios_init''(void)"
(??__E_Ios_init@std@@YAXXZ) で参照されました。
main.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall
std::ios_base::Init::~Init(void)" (??1Init@ios_base@std@@QAE@XZ) が関数
"void __cdecl std::`dynamic atexit destructor for '_Ios_init''(void)"
(??__F_Ios_init@std@@YAXXZ) で参照されました。
fatal error LNK1120: 外部参照 2 が未解決です。
が発生します。
思い当たるところがあればお教えください。よろしくお願いします。
132:デフォルトの名無しさん
07/07/20 23:29:55
"空のプロジェクト"がダメなんじゃ?
"こんにちは、世界"でどうぞ
133:デフォルトの名無しさん
07/07/20 23:37:00
>>131
別にその通りにやって普通にコンパイルできるけどな。
MSSDKをインストールしていて、そのlibディレクトリにlibcp.libとかいう
怪しいライブラリが入っていたりしない?
134:131
07/07/20 23:41:11
libcp.libより怪しい133が入ってますた!!
135:131
07/07/20 23:55:59
>>134
誰てめえw
>>132
すいません、もう少し分かり易く・・・
"空のプロジェクト"のチェックをはずしても同様のエラーが出ました。
(そういう意味じゃなかったですか?)
>>133
確かにありました。しかしそのlibファイルをリネームしてみたり、
プロジェクトのプロパティからライブラリの無視リストに入れてみたり
しましたが変化なしでした。
133さんで問題なくビルドできるということは、自分の特有の環境が
原因ということなのでしょうか(MSSDKあたり?)。調べてみます。
136:デフォルトの名無しさん
07/07/21 00:01:04
>>135
ふうん、変化なしか。
libcp.libはC++のランタイムで、本来はVC++に付属のものが使われるべきで
SDKになぜか入っていたりする怪しいのが優先参照されちゃうとマズかったりする。
てっきりそのせいかと思ったんだがな。
コマンドプロンプトからvcvars32.batを実行後に普通にcl.exeでコンパイル
するとどうなる?
137:デフォルトの名無しさん
07/07/21 00:35:42
>>136
動きました!なぜ。
cl.exeでmain.cppを直接コンパイルすると、下のような警告が大量に出ましたが
問題なく動きました。
C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE\ostream(751) :
warning C4530: C++ 例外処理を使っていますが、アンワインド セマンティ
クスは有効にはなりません。/EHsc を指定してください。
main.cpp(6) : コンパイルされたクラスの テンプレート のインスタンス化 'st
d::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::b
asic_ostream<_Elem,_Traits> &,const char *)' の参照を確認してください
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
これで動くということは、VC++の設定の方でどこか変えてはいけない部分を
触っちゃって(かつ忘れて)いるといったところでしょうか。
138:デフォルトの名無しさん
07/07/21 00:41:58
>>137
その警告はまぁオプション指定しないと普通に出るね。言われたとおりに
/EHscを指定すればよい。
後はまぁ、clで無オプションでコンパイルしたんならデバッグ版のライブラリ
じゃないから、IDEからリリースビルドでやってみるとか、
ツール→オプションでVC++ディレクトリの優先順位をチェックするとか、
プロジェクトファイルの中を見てみて、どうなってるかチェックするとか、
色々やってみるんだね。
139:デフォルトの名無しさん
07/07/21 00:52:24
まあ、vcvars32.bat内に
set CL=/EHsc /Ox /W4
程度を適当に入れとくべきだろ。
140:デフォルトの名無しさん
07/07/21 00:56:24
親切にありがとうございました。
一応動くようにはなったので、いろいろ試しつつ
何が原因だったのか調べてみようと思います。
141:デフォルトの名無しさん
07/07/21 11:34:54
今思ったんだが、「空のプロジェクト」ってなんかカッコよくね?
“Project S・K・Y” とか表記するともっとカコ(・∀・)イイ
142:デフォルトの名無しさん
07/07/21 11:35:50
から
143:デフォルトの名無しさん
07/07/21 11:36:00
「からのぷろじぇくと」としか読んだこと無い
144:デフォルトの名無しさん
07/07/21 11:37:05
empty project
145:デフォルトの名無しさん
07/07/21 17:22:05
ポインタって何ですか?
146:デフォルトの名無しさん
07/07/21 17:26:58
>>145
URLリンク(ja.wikipedia.org)
147:145
07/07/21 17:29:11
>>146
ありがとうございました。
148:デフォルトの名無しさん
07/07/21 19:51:49
HARC HWNDっておなじですか??HARCがエラーになります
149:デフォルトの名無しさん
07/07/21 20:20:19
HARC?
150:デフォルトの名無しさん
07/07/21 20:26:06
A SHARK?
No,a dolphin! Watch out!!
151:デフォルトの名無しさん
07/07/21 20:30:47
書庫のファイル名を取得したいんですけど・・・どうすればいいかわかりますか??
#include <windows.h>
#include <iostream>
using namespace std;
typedef HWND (__stdcall *FND)(const HWND ,LPCSTR , const DWORD );
typedef int (__stdcall *FNE)(const HWND , LPCSTR ,int );
main(){
char buf[128];
HINSTANCE hd = LoadLibrary("UNZIP32.DLL");
FND pd = (FND)GetProcAddress(hd,"UnZipOpenArchive");
FNE pe = (FNE)GetProcAddress(hd,"UnZipGetFileName");
HWND q=(*pd)((HWND)hd, "file.zip",0);
(*pe)(q , buf, 128);
cout<<buf<<endl;
FreeLibrary(hd);}
152:関数はこうなっています・・・
07/07/21 20:34:20
HARC WINAPI UnZipOpenArchive(const HWND hWnd,LPCSTR szFileName, const DWORD dwMode);
機能 指定ファイルが UNZIP32.DLL に有効な書庫ファイルかどうか調べ、
有効であればオープンし、一意の数値(ハンドル)を返します。
以後の書庫ファイルへのアクセスはこのハンドルでおこないます。
アクセスを終了する時は UnZipCloseArchive 関数を呼ばなければなりません。
引数 hWnd UNZIP32.DLL を呼び出すアプリのウィンドウ・ハンドル。
szFileName 書庫ファイル名。
dwMode 処理モードを指定するフラグ。次の値を|(オア)で
組み合わせる。
戻り値 指定の書庫ファイルに対応したハンドル。エラー時は NULL を返します。
int WINAPI UnZipGetArcFileName(HARC hArc,LPCSTR lpBuffer,int nSize);
機能 書庫ファイル名を得ます。
引数 hArc UnZipOpenArchive() で返されたハンドル。
lpBuffer ファイル名を格納するバッファ。
nSize バッファのサイズ。
戻り値 正常終了時に0、異常時にはエラーコード(0以外)が返ります。
153:151
07/07/21 20:39:24
自己解決するかもしれないです・・・
154:151
07/07/21 20:42:36
自己解決しました
155:デフォルトの名無しさん
07/07/21 20:53:49
C++(DirectX)でファイルを入出力する関数を作っています。
現在Cのfopenやfreadなどを使っており、スコアデータはこのファイルのxx番目だからfseekで移動して読み込むといった形を取っています。
しかしこれだと、例えばDirectXのXファイルであればMeshNormalsの位置に移動して、必要な数だけ読み込むといった手段が取れません。
検索してもファイルの入出力の解説を扱っているサイト自体少なく、2行目の方法が中心で困っています。
どこか参考になるサイト、もしくは書籍はありませんでしょうか。
また、ExcelデータはC++で読み書き(データの追加・削除)はできるのでしょうか。
ファイルの入出力周りは私の持っている本ではほとんど書かれていませんでしたので放置していたのですが・・ここに来てツケがorz
156:151 本物
07/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);
}
157:デフォルトの名無しさん
07/07/21 20:59:20
URLリンク(www3.uploader.jp)
11000111101111100011
っていう文字列が与えられた時に、1*2 0*3 1*4 ....
って簡易圧縮みたいなのをしたいわけです
で、文字列に 1と0以外のものが入ってた時に、とりあえずエラーを出したいんだけれど
char buff[1024];
scanf("%s",&buff);
for( n=0; buff[n] == '\0'; n++)
{
if ( buff[n] != '0' || buff[n] != '1' )
{
printf("Error!\n");
goto endline;
}
}
ここのifがうまく反応してくれません
初歩的なミスがあると思うのですが、よろしくお願いします
158:デフォルトの名無しさん
07/07/21 21:03:18
buff[n] == '\0'の条件を逆にしてみたら?
159:デフォルトの名無しさん
07/07/21 21:04:56
for( n=0; buff[n] != '\0'; n++)
160:デフォルトの名無しさん
07/07/21 21:06:23
ランレンクス圧縮?
161:151
07/07/21 21:09:20
for( n=0; buff[n] != '\0'; n++)
{
if ( buff[n] != '0' && buff[n] != '1' )
162:デフォルトの名無しさん
07/07/21 21:09:40
buff[n] != '0' && buff[n] != '1'
163:デフォルトの名無しさん
07/07/21 21:11:04
>>155
Xファイルは知らないのでExcelだけ。
Excelのファイルは所詮ただのバイナリファイルなのだから、
C++で読み書きできないわけがない。
しかしWindows上ならプログラムからExcelを操作してやるのが楽。
データ形式を考える必要もなく、しかもオブジェクトという形で取り扱える。
ただ、その独特な仕組みに慣れる必要があるけど。
164:151
07/07/21 21:14:11
CSVとかで出力してあとで変換すればいい
165:155
07/07/21 21:48:55
レスありがとうございます。
ファイル操作関連の関数は先ほど上げたものぐらいしか知らなかったので、なんとか前進できそうです。
ツール周りをエクセルからデータを引っ張ってくるようにしようかと考えておりましたが
>>164で書かれているように拡張子を変えてやれば配布するデータにも加えれそうですね。
バイナリデータである以上、独自に形式を変えない限りユーザ側で改変するのは容易ですしね。
166:デフォルトの名無しさん
07/07/21 22:08:46
(>>158),>>159. >>161,>>162
サンクス!
for( n=0; buff[n] != '\0'; n++){
if ( buff[n] != '0' && buff[n] != '1' ){
printf("Error!\n");
goto endline;
}
こうだった
167:デフォルトの名無しさん
07/07/21 22:15:03
なんであほの>>151が混ざってるんだ?
168:デフォルトの名無しさん
07/07/21 22:17:05
私には括弧がついてるよーww
169:166
07/07/21 22:43:40
あ、そういうことですか。「逆」って||と&&の話かと
んだば、かっこは解除させていただくの方針で
170:デフォルトの名無しさん
07/07/21 22:46:03
struct , typedef , class だとどれが一番いいとかありますか?
使わないですむやつありますか
171:デフォルトの名無しさん
07/07/21 22:50:58
なぜそこにtypedefが
172:デフォルトの名無しさん
07/07/21 22:51:03
>>170
日本語でおk
173:デフォルトの名無しさん
07/07/22 03:03:23
同じように見えて確保するサイズが全然違いますね
bitset<1> a[1024];
bitset<1024> b;
cout<< sizeof(a)<<" "<<sizeof(b);
174:デフォルトの名無しさん
07/07/22 03:05:48
>>173
そりゃそうだろ。でもサイズ自体は実装依存。
175:デフォルトの名無しさん
07/07/22 04:45:28
配列を引数にして再帰すると駄目なんでしょうか?やってみていませんが
int fnc(int a[10]){
a[]に対して処理をする
fnc(a);
};
176:デフォルトの名無しさん
07/07/22 05:08:33
何も問題ないが。
まあ、a はポインタだがな。
177:デフォルトの名無しさん
07/07/22 08:45:09
static charなポインタ変数って
0で初期化されているのですか?
178:デフォルトの名無しさん
07/07/22 08:50:24
されないから宣言時に0を代入するんだよ
179:デフォルトの名無しさん
07/07/22 09:01:28
staticな変数はゼロ初期化される。
180:デフォルトの名無しさん
07/07/22 09:21:33
>>179 が正解。
おっそろしく古い太古のコンパイラとか
規格に準拠してないコンパイラとかなら知らんがな!
181:デフォルトの名無しさん
07/07/22 12:15:15
>>177
K&Rのp.50
182:デフォルトの名無しさん
07/07/22 12:18:25
constって時々目にするけど、どういう意味があるの?
183:デフォルトの名無しさん
07/07/22 12:21:57
お前ら入門書読んでから質問しろw
184:デフォルトの名無しさん
07/07/22 12:23:43
まだはじめたばっかだから、気にしないで!
185:デフォルトの名無しさん
07/07/22 13:15:03
>>182
かなり大雑把なくくりでいうと、その変数の値を変化させることができないということだ。
const int a = 10;
a = 5; /* NG */
const int a[10] = {0};
a[5] = 1; /* NG */
int b = 10;
const int *a; /* constはポインタが指す値にかかる */
a = &b; /* OK ポインタを変更しているだけ */
*a = 7 /* NG */
b = 7 /* OK コンパイラはaの性質とbの性質の区別ができない*/
int b = 10;
int c = 100;
int * const a = &b; /* constはポインタにかかる */
*a = 5; /* OK */
a = &c; /* NG */
int b = 10;
int c = 100;
const int * const a = &b;
*a = 5; /* NG */
a = &c; /* NG */
どっか間違ってたら訂正して
186:デフォルトの名無しさん
07/07/22 13:27:31
VC++2005っていまいくら位でGETできます?
187:デフォルトの名無しさん
07/07/22 13:27:51
static charなポインタ変数が
0で初期化されていることは分かりました。
これはメモリアドレスの0番地を指しているという理解で良いでしょうか。
また、この場合NULLとどこが違うのでしょうか?
自分はNULLはメモリアドレスの0番地を指していると理解していたのですが…
188:デフォルトの名無しさん
07/07/22 13:30:12
NULLの定義による
189:デフォルトの名無しさん
07/07/22 13:33:19
#define NULL 0 だから NULLって書いても0って書いても同じですよね
それなのに0で初期化したほうがいいと推奨されているのは何故ですか?
190:デフォルトの名無しさん
07/07/22 13:36:38
>>186
Express Edition ならタダ
191:デフォルトの名無しさん
07/07/22 13:40:02
>>182
C++だと、関数にconstを付ける場合もある
いや、むしろ可能な限り積極的に付けて欲しい。
class Hoge {
public:
void foo_set(double d) { x = d; }
double foo_get() const { return x; }
private:
double x;
} hoge;
↑の例だと、void hoge.foo_set(double)関数は、メンバ変数 x を変える可能性がある。
同じクラス内のメンバ変数を変える可能性がある関数は、constにできない(コンパイルエラー)
double hoge.foo_get()関数は、xの中身を見るだけで、変更する可能性はゼロなので
constを **つけることができる**
**付けなくてもコンパイルエラーにはならない。**
つまり、自分(や、保守のコーダー)に縛りを課すという意味合いがある。
192:デフォルトの名無しさん
07/07/22 13:42:13
>>189
0で初期化していないと
そのポインタを使って何かをしてしまったときに
予期せぬ動作をしてしまうからじゃないの?
193:デフォルトの名無しさん
07/07/22 13:42:29
>>187
ポインタが 0 で初期化されるってのは、
ヌルポインタで初期化されるって意味だ。
static char* p;
は
static char* p = 0;
と同じってこと。
ポインタに 0 を代入するとヌルポインタとして扱われるから、
要するにヌルポインタで初期化されるということ。
194:デフォルトの名無しさん
07/07/22 13:43:12
>>185
>>191
つまり保護のため?
195:デフォルトの名無しさん
07/07/22 13:43:24
>>189
NULLで初期化するなって書いてあった?
196:デフォルトの名無しさん
07/07/22 13:51:23
静的な変数がビット表現 0 の値ではなくヌルポインタで初期化されるというのは、
C++ ならこんな形で確認できる。
#include <iostream>
using namespace std;
int main() {
class A;
static int A::*p;
static int A::*null = 0;
cout << (int&)p << endl;
cout << (int&)null << endl;
}
p と null はメンバ変数へのポインタってやつなんだが、
こいつのヌルポインタのビット表現は大抵の環境で 0 にはならない。
上のコードを実行すると、p と null とで 0 でない同じ値が出力されると思う。
197:デフォルトの名無しさん
07/07/22 13:56:06
なんだかよくわからないけど、
とにかくNULLは使わない方がいいというのは解りました
ありがとうございます
198:デフォルトの名無しさん
07/07/22 13:57:53
>>196
0なんだが
199:デフォルトの名無しさん
07/07/22 14:02:46
なんだってー。
0 になる環境もあるのかー。
200:デフォルトの名無しさん
07/07/22 14:06:16
g++ なら -1 になる。
201:デフォルトの名無しさん
07/07/22 14:06:27
>>189
NULLは、C言語では
#define NULL (void *)0
と定義されていた。(今のCは定義を見たことがないから分からない)
つまり、このC言語処理系では0はint型。
int *a;
a = 0; /* コンパイルエラーまたはウォーニング */
a = NULL; /* OK */
一方、C++では、0は特別な値に昇格した。
C++では、0はint型と(void *)型の両方の性質を持った。
つまり
#define NULL 0
と定義されているが、これはかつて、C++がCの上位互換性的要素が高かったため
このように定義してないと移植時に不便であったという意味合いが強い。
int *a;
a = 0; // OK(推奨)
a = NULL; // OK(互換性のため。推奨されず)
C++がなぜそうなったかは私には分からないが、
「ifならカッコの中が0であればif文は実行されない。それ以外は実行される」
という定義のように、C++の構造化の文法に不都合が無かった(むしろ定義上都合がよい)ことや
(void *)0 が実用的に不便だったからかもしれない。
その辺はもっと詳しい人に
202:デフォルトの名無しさん
07/07/22 14:09:30
>>201
あんま適当な事言わないで。
203:デフォルトの名無しさん
07/07/22 14:14:33
>>202
遠慮なく訂正していいんだよ
204:デフォルトの名無しさん
07/07/22 14:14:55
まあいいんじゃね。うそをうそと(ry
205:デフォルトの名無しさん
07/07/22 14:19:42
まず、C の時代から 0 はヌルポインタだ。
だというのに C で NULL を ((void*)0) と定義することが許されていたのは、
整数型へそのまま代入できてしまわないようにするためだ。
まあ警告止まりかもしれないが、ないよりゃマシだ。
何で C++ でその定義が許されなくなったかというと、
C では void ポインタから他のポインタへの暗黙のキャストが許されていたけど、
C++ ではそれを禁止するようになったからだ。
いちいち明示的なキャストが必要になるのでは困るので、
NULL は 0 と定義されるようになった。
そして、C でも C++ でも NULL が推奨されないなんて話は聞いたことがない。
ポインタを扱っているという目印になるわけで、プログラムを読みやすくする効果がある。
どんどん使えばいい。
206:デフォルトの名無しさん
07/07/22 14:30:56
注意する点があるとすれば、
NULL にキャストが必要になるっつー状況がないわけではないことだ。
例えば C++ で NULL を可変個引数に渡す時とか。
そのままだと int 型の 0 が渡されてしまう。
ヌルポインタのビット表現が 0 でない環境だけじゃなく、
ポインタ型のサイズが 64 ビットで int 型のサイズが 32 ビットなんて環境(普通の 64 ビット環境)でも問題になる。
C++ においては NULL は単にプログラムを読みやすくするためだけに使われるもので、
NULL と書いたから安心だ、と思ってはいけない。
そういう意味で NULL には危険性はあるのかもしれないけど、
NULL を使わないと可読性が大きく犠牲になるから NULL を使った方がマシ。
207:デフォルトの名無しさん
07/07/22 14:51:39
>>201
0は単なる整数リテラルだからint型と決まっている。処理系の都合なんかではない。
C++で特別になったわけでもない。
0がポインタ型に変換できて、ヌルポインタになるのはCのときから変わっていない。
208:デフォルトの名無しさん
07/07/22 14:54:54
int *p = (1 - 2 + 1); /* ヌルポインタ */
209:デフォルトの名無しさん
07/07/22 15:06:36
そもそも、規格でのNULLの定義は、C++の場合「処理系定義の空ポインタ定数」となっている。
つまり0である必要性はなく、例えばGCCでは#define NULL __nullとなっている。
__nullはポインタ型へは暗黙の変換が可能だが、整数型へ暗黙の変換を行うと警告になる独自拡張の定数。
あと、NULLではなく0でいいだろと言っているのはBjarne。
だからC++にはNULL使わない派もそれなりにいる。どれくらいいるのかは知らないけど。
少なくとも、俺もその内の1人。
210:デフォルトの名無しさん
07/07/22 15:09:31
FAQ くらい嫁、で済む話じゃね?
URLリンク(www.kouno.jp)
211:デフォルトの名無しさん
07/07/22 15:22:00
>>209
NULL使わない人もいるのか。
if(str!=NULL){
iVal = str->iHoge;
}
とかって場合でも使わないの?
ASSERT(str!=NULL);
とかも使わないの?
212:デフォルトの名無しさん
07/07/22 15:24:21
つか、もう NULL をキーワードにしてくれ。
213:デフォルトの名無しさん
07/07/22 15:28:27
>>212
つnullptr in C++/CLI
214:デフォルトの名無しさん
07/07/22 15:30:41
俺は usertype.dat に NULL 入れてるよ
215:デフォルトの名無しさん
07/07/22 15:35:10
それ色が変わるだk(ry
216:デフォルトの名無しさん
07/07/22 15:37:23
>>213
スレ違い
217:デフォルトの名無しさん
07/07/22 15:53:32
もういい加減しょうもない議論やめろ
218:デフォルトの名無しさん
07/07/22 15:55:15
誰か議論なんてしてたっけ?
219:デフォルトの名無しさん
07/07/22 16:09:04
A name for the null pointer: nullptr (revision 3)
URLリンク(www.open-std.org)
220:デフォルトの名無しさん
07/07/22 18:12:27
しかし久々にぬるぽ いんたーという言葉を聞いた気がする。
221:デフォルトの名無しさん
07/07/22 20:19:03
iteratorってポインタと同じようにアドレスを表すものですか??
同じですか??
222:デフォルトの名無しさん
07/07/22 20:31:57
>>221
抽象度が違う。
アドレス < ポインタ < イテレータ
アドレスはポインタとして使えるし、ポインタはイテレータとして使える。
223:デフォルトの名無しさん
07/07/22 20:33:45
サンクス
224:デフォルトの名無しさん
07/07/22 20:41:34
同時に10個のファイルを開いて置くとして、新しいファイルに書き込む
必要が出てきたとき、もっとも使われていないものを閉じて、新しく開く
というコードはどうやったらいいですかね???
225:デフォルトの名無しさん
07/07/22 20:53:16
1:日本赤十字に5万円振り込む
2:新潟中越沖地震の救援基金に5万円振り込む
のどちらか
226:デフォルトの名無しさん
07/07/22 20:57:06
すっきりとは解せないけどなんとなく分かるw
227:224
07/07/22 21:05:28
おねがいします
使われた順に、ファイル名とポインタを整列させようとしたんですけど・・
ファイルポインタがコピー出来ません・・・
228:デフォルトの名無しさん
07/07/22 21:13:30
>>205
前も誰か言ってたけど、0はCの頃から整数0ですよ。
必要なときにヌルポインタに暗黙のキャストされるだけですよ。
229:244
07/07/22 21:14:15
コンパイラや、機種によって同時に開けるファイル数に制限があるため
ひらっきっぱなしにするとエラーになってしまいます・・・
互換性を保つため10個までにしたいのですが・・
いい方法ないですか??
230:デフォルトの名無しさん
07/07/22 21:26:42
class A{ A(); };
A::A(){ char *i = new char ; }
int main(){ A a* = new A; delete a ; return 0 ; }
こういった場合でもメモリは開放されるのでしょうか?
231:デフォルトの名無しさん
07/07/22 21:29:55
されない。
i が行方不明になってメモリリークが発生する。
これは静的に A のインスタンスを作っていたとしても変わらない。
A のデストラクタの中で delete を呼び出すべき。
232:230
07/07/22 21:33:21
ありがとうございました。
233:デフォルトの名無しさん
07/07/22 21:33:47
現在時刻をミリ秒単位で取得する、移植性の高い方法ってありますか?
234:デフォルトの名無しさん
07/07/22 21:36:01
>>224
>ファイルポインタがコピー出来ません
詳しく書いてみ?
235:デフォルトの名無しさん
07/07/22 21:36:10
ない
236:デフォルトの名無しさん
07/07/22 22:19:29
>>228
0はCの頃からヌルポインタ定数ですよ。
237:デフォルトの名無しさん
07/07/22 22:21:24
0は0だろ
238:デフォルトの名無しさん
07/07/22 22:24:15
>>236
0はヌルポインタ定数に変換できるというだけだろ。>>210
239:デフォルトの名無しさん
07/07/22 22:31:09
>>238
その言い方はおかしい。
0 を含めて整数の 0 と評価される定数式(C 限定で、それを void* にキャストしたもの含む)が
ヌルポインタ定数。ヌルポインタ定数はポインタとして使われた場合にヌルポインタに変換される。
240:デフォルトの名無しさん
07/07/22 22:36:09
pow(2,2)
とかをコンパイル時に計算して、4をコードに埋め込んでしまうコンパイラも
あるが、こういうのって定数式なのかしら?
241:デフォルトの名無しさん
07/07/22 22:40:01
少なくともCとC++の構文上は定数式ではない。
242:デフォルトの名無しさん
07/07/22 22:41:47
Cで正規表現などをもちいて文字列を置換したりするときに、
文字列を細切れにぶったぎって
それを再び結合したりするわけですが
しばしばその文字列はもとより長くなったりしますので
マジメにやろうとするとメモリ管理だの何だのが
とてもめんどうくさく、しかも適当にやると
ヘタをするとPerlのほうが速かったりするかと思います
効率よく楽なほうほうは何かありますか
ロープというデータ構造は結合が鬼のように早いと聞きますが
ロープに対して使える正規表現ライブラリなど寡聞にして知りません
え?C++を使え?実におっしゃるとおりですね
243:デフォルトの名無しさん
07/07/22 22:42:33
>>241
ありがとう
ということは、そのようなものがコンパイラの最適化によってゼロに
化ける場合は、ヌルポ定数とは扱われない
ということかしら
244:デフォルトの名無しさん
07/07/22 23:01:22
>>243
関数呼び出しは定数式に含まれないことになってる。
245:デフォルトの名無しさん
07/07/23 00:00:41
>>236
じゃあ、引数不定個の関数で、0がintとして渡されるのは
なんででしょうねえ。
printf("%d %d %s", 0, 0, 0)
64bit環境向けにコンパイルすると
全部intの0として扱われてることが明白ですよ。
何か変ですか?それともあなたが変ですか?
246:デフォルトの名無しさん
07/07/23 00:09:04
URLリンク(www.kouno.jp)
247:デフォルトの名無しさん
07/07/23 00:55:18
いつまでゴチャゴチャ言いあってんだよ。
248:デフォルトの名無しさん
07/07/23 01:03:41
>>245 ポインタとして使われてないから。
249:デフォルトの名無しさん
07/07/23 01:38:56
またこの宗教論争やってんのかよwwww
250:デフォルトの名無しさん
07/07/23 01:43:25
規格に照らして正しさが確かめられるんなら、宗教論争とは言わんだろ。
マクロ NULL を使うべきかどうかってんなら間違いなく宗教論争だけど。
251:デフォルトの名無しさん
07/07/23 02:06:46
初心者の人、ちゃんとついてこれてます?
252:205
07/07/23 03:55:59
>>228 が正しいんだからもう終わりにしようぜ。
俺も言い方が悪かった。
253:デフォルトの名無しさん
07/07/23 13:48:26
ヌルポインタを使ってメンバ関数を呼ぶとどうなるかは未定義と聞いたことがあります。
でも、規格票を読んでもこのことがどこに書いてあるのか見つかりません。
どこに書いてあるのかご存知の方はいますか?
254:デフォルトの名無しさん
07/07/23 13:55:25
未定義って意味知ってるか
255:デフォルトの名無しさん
07/07/23 13:56:11
ワラタ
256:デフォルトの名無しさん
07/07/23 14:02:02
規格票に全く書いてない事か、あるいは規格票に未定義と明記されている仕様の事。
257:デフォルトの名無しさん
07/07/23 16:07:43
居ないなら居ないと返事しろ
258:デフォルトの名無しさん
07/07/23 16:28:49
規格票読んだ事ないのか?
「~は未定義である」って書いてあることもあるんだぞ?
259:デフォルトの名無しさん
07/07/23 16:38:21
規格票(?)もいいけど、>>256も読もうな
260:デフォルトの名無しさん
07/07/23 17:18:48
規格票にちゃんと書いてるかもしれないってことだろ。
261:デフォルトの名無しさん
07/07/23 17:24:04
だったら>>253に場所を教えてやれよ。
>>253は未定義も全部書いてあると思ってるみたいだし。
262:デフォルトの名無しさん
07/07/23 17:36:19
場所知らんもんよ。
263:デフォルトの名無しさん
07/07/23 17:45:20
居ないなら居ないと返事しろ
264:デフォルトの名無しさん
07/07/23 18:02:16
規格書を見てみたがたしかにヌルポインタの使用については見当たらないな。
一番関係ありそうなのが、3.8 オブジェクトの生存期間。
3節目の「この規格全体を通じて、オブジェクトの特性についての規定は、
生存期間中のオブジェクトに対してだけ適用される。」という一文を見付けたので精一杯。
265:デフォルトの名無しさん
07/07/23 18:09:07
今はこれが精一杯
266:デフォルトの名無しさん
07/07/23 18:44:02
日本語コードを判別して一行よみたいんですけど
UTFがよめないです
なぜか全角と機械語みたいなのが入ります
どうすればいいんでしょうか
英数字のみのテキストなんですが
267:デフォルトの名無しさん
07/07/23 18:47:51
英数字のみでも、UTFとそうでないコードで、文字種が変化するでしょうか??
268:デフォルトの名無しさん
07/07/23 18:48:08
どんなデータをどんなソースで読んだんだ
269:デフォルトの名無しさん
07/07/23 18:49:23
UTFだけ書かれても、その後ろに数字が続いてるし、それが何種類もあるんだぜ
270:266
07/07/23 18:58:11
URLリンク(kansai2channeler.hp.infoseek.co.jp)
これなんですが
UTF16でないと読めません
271:266
07/07/23 19:00:01
一行目の先頭に機械語みたいのが入っています・・・UTF16の特徴なんですか?
272:デフォルトの名無しさん
07/07/23 19:04:21
もしくは、ファイルの文字種を判別して、例えばシフトJISに変換する
DLLやSTLなどありませんか???
273:デフォルトの名無しさん
07/07/23 19:05:58
>>271
見てないけどBOMじゃないかな?
274:デフォルトの名無しさん
07/07/23 19:08:05
自己解決しました
nkf32.dllを通す事にしました
URLリンク(www.vector.co.jp)
275:デフォルトの名無しさん
07/07/23 19:11:31
ICUとか
276:デフォルトの名無しさん
07/07/23 19:13:51
WinでいいんならMultiByteToWideCharとか
WTL使っていいんならCA2Wに渡すだけでおk
277:デフォルトの名無しさん
07/07/23 19:15:29
>>264
なるほど・・・。
ヌルポインタを使った場合はオブジェクトが存在しないから、
メンバ関数呼び出しに関する規定はヌルポインタを使った場合には適用されない・・・と。
確かにそう考えることもできそうな感じではありますね。
278:デフォルトの名無しさん
07/07/23 19:21:10
>>276
汎用性が良くなるため、MultiByteToWideCharでいきます
サンクス!
279:デフォルトの名無しさん
07/07/23 21:05:00
socketを使用してのUDP通信で
自分で定義した構造体を送受信したいのですが
sendto()/recvfrom()関数はchar配列を送受信するための引数を持っています
どうすればできるのでしょうか
280:デフォルトの名無しさん
07/07/23 21:06:29
socketを使用してのUDP通信で
自分で定義した構造体を送受信したいのですが
sendto()/recvfrom()関数はchar配列を送受信するための引数を持っています
どうすればできるのでしょうか
281:デフォルトの名無しさん
07/07/23 21:07:45
2連投稿すいません。エラーですorz
282:デフォルトの名無しさん
07/07/23 21:59:54
>>253
URLリンク(www.open-std.org)
283:デフォルトの名無しさん
07/07/23 22:15:28
>>280
何でそういう質問をするのか、まずはっきりさせましょう。
キャストを使ってダメだったということ?
それとも(char *)型に直す方法が分からなかったってこと?つまり、キャストを知らなかったということ?
それとも(char *)に直せたけど、受け取り側で値が変になったということ?
284:wolf ◆8VH3XAqjlU
07/07/23 23:07:57
>>224
>>229
LRUのサンプル
↓
URLリンク(blogs.yahoo.co.jp)
285:デフォルトの名無しさん
07/07/23 23:26:11
キャストすることで送信することはできましたが、
受信するときに実行時にエラーがでます。
受信するとき、受信されたデータはchar[]に入るようになっています。
char recvdata[1024];
recvfrom(socket, recvdata, sizeof(recvdata), 0, ......);
char*で宣言すると、実行時にエラーがでます。
286:デフォルトの名無しさん
07/07/23 23:29:41
>>285
送信してから受信するまでの間に領域が開放されたりしてない?
287:デフォルトの名無しさん
07/07/23 23:43:12
>>286
それはどういう意味ですか??
288:デフォルトの名無しさん
07/07/23 23:48:11
>>280=285
まず、構造体のアライメントを調べたか?
送信側のマシン・・・アライメント4byte
struct X {
char a; // 1byte + 3byte(4byteになるよう調整)
long b; // 4byte
} x;
sizeof(x) = 8
受信側のマシン・・・アライメント2byte
struct X {
char a; // 1byte + 1byte
long b; // 4byte
} x;
sizeof(x) = 6
これでは受信側は混乱する。
(char *)で宣言するのは全く問題ない。malloc等でメモリを確保していれば。
289:デフォルトの名無しさん
07/07/23 23:51:07
>>287
>>288が詳しそうなんでそっちにまかせた!
socketってのを使ったことがないんで憶測ですまん。
構造体をローカルのchar配列に入れてsendto呼んで、
送信関数終了時にchar配列が開放されて受信側があぼーん。
とかなのかな?って思ったんだが、sendtoの仕様次第じゃ問題ないな。
290:デフォルトの名無しさん
07/07/24 00:08:25
>>285
構造体の大きさは同じでした。
mallocしたことでエラーはでなくなりましたが、値が変わってしまいます。
struct Test{
int a;
char c;
};
で、aに0をいれて送信すると、受信後は3801416となってしまいます
291:デフォルトの名無しさん
07/07/24 00:20:47
sendto(SOCKET s, const char *buf, int len, int flags, const sockaddr *to, int tolen);
で、第三引数にstrlen(data)を渡してたのが問題だったみたいです。
sizeof(Test)にしたら問題なく送信できました。
が、受信したあと、char*型に入ってる受信データをTest型の変数に代入できません。
dataがchar*型で、
((Test*)data)->a とするとちゃんと値を得ることができます。
Test t = (Test)*data;とすると、charをTestに変換できないとエラーがでます。
Test *buf = (Test*)data;
Test t = *buf;
とすると、tの値が狂います
292:デフォルトの名無しさん
07/07/24 00:25:41
memcpyでいいんじゃまいか?
293:デフォルトの名無しさん
07/07/24 00:27:18
>>291
buf->aの値は?
294:デフォルトの名無しさん
07/07/24 00:37:31
memcpyでできました!!
ですが、もう一つ問題が浮かび上がってきました。
Test構造体の、aの値は狂わずに受信できてますが、cの値が変わってしまいます。
何を代入しても、送るとxになります。
295:デフォルトの名無しさん
07/07/24 00:39:12
cout << ((Test*)data)->c;で表示しても同じでした
296:デフォルトの名無しさん
07/07/24 00:39:20
まてまて、どんな構造体かくらい示してくれ。
297:デフォルトの名無しさん
07/07/24 00:43:05
>>296
>>290でうpした
struct Test{
int a;
char c;
};
です
298:デフォルトの名無しさん
07/07/24 00:46:38
>>297
>288が居なくなってかなり心細いんだが、socket知ってる人いねぇの?w
構造体のアライメントが悪さしてるようにしか思えないんだけど、
それは大丈夫だったんだよね?
int a;
char c[4];
だったらどうなるの?
299:デフォルトの名無しさん
07/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;
でよい。
300:299
07/07/24 01:18:28
すまん。
> testp = (Test*)data;
アーキテクチャによってはバスエラーになるな。
char[]で受け取りたいなら、
union {
data[sizeof(Test)];
Test test;
} u;
などとして、u.dataに受け取ってu.testを使うほうがよいだろう。
正確には規格準拠ではないが。
それを考えれば、やはりTest型で直接受けるほうがよい。
301:デフォルトの名無しさん
07/07/24 01:30:47
しょうもない質問で申し訳ないのですが、
スタックダンプって
「メモリのスタック領域に記憶された変数や関数のアドレスを
吐き出すことって」
であってます??
302:デフォルトの名無しさん
07/07/24 01:33:05
アドレス吐き出しても意味なくね?ってかmapファイルじゃん。
吐き出されるのはそのアドレスのデータじゃないのか?
303:デフォルトの名無しさん
07/07/24 01:49:27
>>302
ありがとうございました。えーと、吐き出されるのは
スタック領域のアドレス 呼ばれる関数名 呼ばれる関数のアドレス
てな感じですか?
304:デフォルトの名無しさん
07/07/24 01:52:34
>>282
それを参考に辿ってみたら、こんな質問を発見しました。
URLリンク(www.open-std.org)
ここでは 9.3.1 で明確に未定義と述べられているとしていますが、
個人的には 9.3.1 は根拠とするには薄い気がします。
その後に書いてある左辺値→右辺値変換の方が明確な根拠に思えます。
p->f() は (*p).f() に変換され、. の左項は右辺値であることから、
左辺値から右辺値への変換(ヌルポインタの参照)が行われ、結果未定義動作となる、
という流れの方が自然なのかなあ、と。
情報ありがとうございました。
305:デフォルトの名無しさん
07/07/24 02:13:49
>>303
スタックダンプって↓みたいなやつだよね?
0241fb0c 5d b6 a0 03 f0 62 75 02 - d0 e7 3d 0a 00 6e 40 00 ]....bu...=..n@.
0241fb1c 00 00 00 00 24 fb 41 02 - 2e bf 98 03 00 00 00 00 ....$.A.........
一般的にスタックに詰まれるのはローカル変数、関数の引数・戻り値、関数の戻りアドレスとかかな?
とはいえ、最適化されたら何がどういう順番で詰まれるかなんてアセンブラ見ないとわかんなくなるよ。
306:デフォルトの名無しさん
07/07/24 04:22:18
スタックダンプという言葉を使った人に聞いてくれよな。
Javaとかのstacktraceとはまた違いそうだし。
で、sendtoのバッファのアドレスをわざわざchar*にキャストしてるのは何なんだいったい。
void*を受け取るんだから、そのまま渡せよ。
memsetする時にmemset((char*)data, 0, sizeof(data))とかするバカいないだろ。
307:デフォルトの名無しさん
07/07/24 10:21:35
>>306
sendto(SOCKET, char*, int, ........)だよ sendtoはvoid*使わない
308:デフォルトの名無しさん
07/07/24 10:25:09
socketインタフェースってデザインが古いんだよな。
void*が適切に使われていないから、いたるところで
(struct sockaddr*)とかやらないといけないし。
309:デフォルトの名無しさん
07/07/24 15:33:36
質問があります。
マイクロソフトのVS2003.NET C++なのです。
VS2005のC#では
Debug.Print("debug");
というデバグ表示ができますが、これに相当するものはあるでしょうか?
知ってる方、ご教示願います。
310:デフォルトの名無しさん
07/07/24 15:42:34
OutputDebugString
311:デフォルトの名無しさん
07/07/24 15:45:05
>>309
>>310のOutputDebugStringはAPIだからどこでも使えるけど
MFC使ってるならTRACEマクロが簡単。
312:309
07/07/24 16:26:49
>>310-311
どうもありがとうございます。私とても助かたです。
MFCは使っていないためTRACEマクロは使用できませんでしたが、OutputDebugStringの
方は使うことができました。こちらを使用したいと思います。
OutputDebugString(_T("HOGE\n"));
313:デフォルトの名無しさん
07/07/24 16:27:45
外人さん?
314:デフォルトの名無しさん
07/07/24 17:54:01
グローバルと無名名前空間に同一の名前があるときそれらを識別する方法にはどういう手段がありますか?
あるいは、
int foo;
namespace {
int foo;
}
のときグローバル、無名名前空間それぞれのfooを指定するために用いる構文が知りたいのです
315:デフォルトの名無しさん
07/07/24 19:03:07
>>312
MFC とは無関係な _RPT0, _RPT1,_RPT2,_RPT3,_RPT4 というマクロもありますよ。
316:デフォルトの名無しさん
07/07/24 19:04:53
>>314
ない。
そもそも、そんな同じ名前の変数をみだりに宣言するのはどうかと思う。
どうしても作りたいなら、も1つ名前空間作れ。
int foo;
namespace {
namespace Local {
int foo;
}
}
317:デフォルトの名無しさん
07/07/24 21:09:52
eclipse3.3の更新サイトでついてくるCDT,コンパイラはCygwin使っています。
\a(ビープ音)などのエスケープシーケンスを使ったとき、普通の動作をせず、
コンソールに□とだけ表示されるので、エスケープシーケンスを利用した
プログラムが上手く作れずに困っています。(何故か\nは上手くいく
ググったり、設定をいじくり回したり色々やってみたのですが、解決できません。
普通の動作をさせるようにできるんですか?もしできるなら教えてください。
318:デフォルトの名無しさん
07/07/25 00:32:11
string型をwchar_t に変換できませんか??
319:デフォルトの名無しさん
07/07/25 00:33:04
C++でこういうコードがあったんですが・・・・
class CDialog {
public:
CDialog(): hDlg(0) {}
最後のところがわかりません。コンストラクタ? なんで空メソッド?
320:デフォルトの名無しさん
07/07/25 00:35:27
hDlgを0で初期化してんじゃねえの
321:デフォルトの名無しさん
07/07/25 00:35:32
ニコフォトオールスター
URLリンク(www.freewebs.com)
322:デフォルトの名無しさん
07/07/25 00:40:44
>>320
なるほど。hDlgってのはHWND型なんでそうかもしれません。
しかし、こんな記述法あるんですか?
323:デフォルトの名無しさん
07/07/25 00:42:49
>>322
あるよ。コンストラクタで入門サイトめぐってみては?
ところで、この書き方って一般的なの?俺は{}内に書くことが多いんだが。
324:デフォルトの名無しさん
07/07/25 00:44:06 BE:268527762-2BP(30)
effective c++まじオススメ
325:デフォルトの名無しさん
07/07/25 00:48:47
>>323
なるほど、コンストラクタ初期化子っていうんですね。初めて知りました。僕の見た限りでは初期化数はみんな( )内に書いてるようです。
326:デフォルトの名無しさん
07/07/25 00:49:04
>>323
極めて一般的に使われる。
HWND(基を辿ればポインタ型)のような組込型ではどうでもいいが、
クラスオブジェクトの場合、こうでしか
非静的メンバのコンストラクタを呼び出せないので大変重要。
327:デフォルトの名無しさん
07/07/25 00:52:43
すみません
全く出来ません
tring型をwchar_t に変換する方法教えてください
328:デフォルトの名無しさん
07/07/25 01:04:47
標準C++ライブラリだけでやるならこのページの一番下の
URLリンク(hw001.gate01.com)
おまけが参考になる。
URLリンク(hw001.gate01.com)
329:デフォルトの名無しさん
07/07/25 01:14:51
あのexeファイルを実行するにはどうしたらいいんでしょうか
330:デフォルトの名無しさん
07/07/25 01:16:40
どのexeファイル?
331:デフォルトの名無しさん
07/07/25 01:25:05
CreateProcess() @Win32
fork(),exec() @Unix
332:デフォルトの名無しさん
07/07/25 01:43:15
>>326
スマン、いろいろ回ってみたがわからん部分が多々でてきたOTL
コンストラクタ初期化子を使う1つの理由としてデフォルトコンストラクタ以外を
使用してメンバ変数を初期化したい場合に必要ということでいいのかな?
あと、参照メンバ変数がコンストラクタ初期化子でしか初期化できないという
理由もよくわからんかった・・・まだまだ修行が足らんようです。
333:デフォルトの名無しさん
07/07/25 02:08:21
初期化後の参照変数へのoperator = は、
全部参照先へのオブジェクトコピーになるから、
初期化後に参照先を変えることはできないってこと
334:デフォルトの名無しさん
07/07/25 02:22:35
>>333
なるほど。
参照をポインタの延長として理解しようとするからダメなんだよな。
int *p = NULL;として初期化時は何も指していないポインタに後でアドレスを代入する
というのは参照では出来ない。
参照変数は宣言と同時に初期化する必要がある。
宣言時に初期化しなければいけない理由等が>333のとおり。
メンバ変数の場合は、その初期化にコンストラクタ初期化子を使用する。
というよりそこで初期化しなければならないし、そこでしか出来ない。
語弊があるかもしれんがこんな感じかな。
335:デフォルトの名無しさん
07/07/25 02:33:22
配列の初期化もやらせてくれるといいんだがなぁ…。
336:デフォルトの名無しさん
07/07/25 03:10:33
変数宣言時に
array[8] = {0} は 初期化ができるのに
array[2][4] = {0} とすると、怒られる
2次元以上の時に初期化しようとすると
怒られるのはどうしてですか?
337:デフォルトの名無しさん
07/07/25 03:16:59
>>336
エラーメッセージは何て言ってる?
338:デフォルトの名無しさん
07/07/25 03:23:30
>>334
参照に限らず、メンバ変数の初期化はコンストラクタ初期化子でしかできない。
これを理解するためにも、まともに C++ を使い続けるためにも初期化と代入の区別を
しっかり理解する必要がある。
339:デフォルトの名無しさん
07/07/25 03:24:55
代入エラー 的な文か 無効な演算子hoge だったかと思います gccで
340:デフォルトの名無しさん
07/07/25 03:28:16
>>339
それ、初期化じゃなくて代入してるんじゃね?
341:デフォルトの名無しさん
07/07/25 03:36:30
いやでも変数宣言時にそうしたら怒られてた気が・・・
342:デフォルトの名無しさん
07/07/25 03:46:25
>>341
こんどはちゃんとエラーメッセージもいっしょに持ってこようね。
343:デフォルトの名無しさん
07/07/25 06:04:20
>>336
array[2][4] = {{0}, {0}};
344:デフォルトの名無しさん
07/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 を付けるか/付けないかだけで、このように変化するのか分かりません…
345:デフォルトの名無しさん
07/07/25 06:29:40
>>344
constは変更できないって意味だからでは
むしろrr=456でエラーがでそうだけど、
そんな後付け参照までフォローはしないのかな
346:344
07/07/25 06:33:35
>>344の結果はBCBです。
VC++とg++で試してみると、両者ともエラーになりました…
エラー内容は「int &rr = r; のところで const int & から int & にできない」という感じでした。
BCBだと
[C++ 警告] Unit1.cpp(12): W8028 'rr' を初期化するために一時変数を使用する
っていう警告が出ました。
BCBが特殊なのかな…
347:デフォルトの名無しさん
07/07/25 08:18:53
>>346
Borland のが腐ってる。
348:317
07/07/25 08:59:52
あれから色々調べてみたんですが、特定のエスケープシーケンスの文字化けは
CDTに限ったことでは無いようです(OSの問題かな?)まあ色々分かったので
もうちょっと調べていこうと思います。cの問題では無かったですね;すみません。
349:デフォルトの名無しさん
07/07/25 09:00:19
だから BCB は腐ってるから使うなとあれほど・・・
350:デフォルトの名無しさん
07/07/25 09:06:13
const 参照を使うと
const int& r = 1;
といったことができるが、
この時はテンポラリオブジェクトが作られて、それへの参照が作られる。
昔は const なしでもこういうことができることがあった。
規格がまだ整理されてなかった時代だったからなのか、独自の拡張だったのかは知らんが。
ここではそれが起こってるんだろう。
351:デフォルトの名無しさん
07/07/25 12:16:56
質問です。
fopen_sってGCCみたいなVC以外の環境でも普及していて普通に使えるのでしょうか?
352:デフォルトの名無しさん
07/07/25 13:08:38
>>351
ぜんぜん普及してないです。VC++だけ。
353:デフォルトの名無しさん
07/07/25 13:16:59
だから GCC は終ってるから使うなとあれほど・・・
354:デフォルトの名無しさん
07/07/25 13:24:54
普及していないが、Open Watcomでも使える。
また、標準規格に盛り込まれれば、glibc辺りにも実装されるだろう。
355:デフォルトの名無しさん
07/07/25 13:56:24
今C言語勉強中なんですけど
本とかサイトとかで一人で勉強してもある程度身につくものでしょうか?
356:デフォルトの名無しさん
07/07/25 14:18:27
大多数の人は一人で勉強してます
357:デフォルトの名無しさん
07/07/25 14:24:38
double型をstirng型に変換する方法ありませんか?
358:デフォルトの名無しさん
07/07/25 14:29:55
double d;
char c[100];
string s;
sprintf(c,"%f",d);
s=(string)c;
359:デフォルトの名無しさん
07/07/25 14:32:30
>>358
ありがとうございます。
やはりこの方法しか無いんですね。
itoa()みたいな便利なのあればいいなぁと思ってググったんですが
見つけられませんでした。
360:デフォルトの名無しさん
07/07/25 14:36:54
sprintfの方が数倍便利だと思うが
361:デフォルトの名無しさん
07/07/25 14:38:39
string dtos(double d){ char c[200];sprintf(c,"%f",d);return (string)c;}
これを先頭へコピペして仕え
362:デフォルトの名無しさん
07/07/25 14:40:55
>>359
itoa()と違って小数点以下何桁、とか指定することが多いと予想されるからな
363:デフォルトの名無しさん
07/07/25 14:46:36
>>356
そうなんですか
ありがとうございます
364:デフォルトの名無しさん
07/07/25 14:51:02
とりあえずお約束で
つ std::stringstream
つ boost::lexical_cast
つ boost::format
365:デフォルトの名無しさん
07/07/25 14:58:19
error C2027: 認識できない型 'name::B' が使われています。
とのエラーで苦しんでいます。よろしければ助言お願いいたします。
==B.h file=========================================
#include A.h
namespace name {
class B
{
public:
A_Base* const getA_Base() const { return m_a; }
private:
A_Base* m_a;
};
} // name
=================================================
↓続く
366:デフォルトの名無しさん
07/07/25 14:58:55
==A.h file=========================================
namespace name {
class B;
class A_Base
{
protected:
B* const getB() const { return m_b; }
private:
B* m_b;
};
class A_Deriv
{
public:
void func() { getB()->getA_Base(); }
};
} // name
=================================================
367:デフォルトの名無しさん
07/07/25 15:00:44
A_Deriv::func()を実行すると
error C2027: 認識できない型 'name::B' が使われています。
とのエラーが出てきてコンパイルできません。
どうか助言の方、よろしくお願いいたします。
368:デフォルトの名無しさん
07/07/25 15:02:58
A_Derivは
class A_Deriv : public A_Base
です、記述ミスですすみません。
369:デフォルトの名無しさん
07/07/25 15:09:31
>>364-368
A.h を頭から順に読んでいったコンパイラさんは、
メソッド B::getA_Base() の存在を知ることができない。
370:デフォルトの名無しさん
07/07/25 15:16:33
クラス定義の中で関数を定義すると、
クラス定義の直後にinline付きで定義されたものとして扱われる。
つまりA_Derivはこう書いたのと同じに扱われる。
class A_Deriv : public A_Base
{
public:
void func();
};
inline void A_Deriv::func() { getB()->getA_Base(); }
ところが、この時点ではclass B;という前方宣言しかないため、
Bに関する具体的な情報がわからない。それで367のエラーになってしまう。
解決するには、A_Deriv::funcの定義をBの定義より後に回せばいい。
例えば、A.hとB.hをインクルードするcppファイルでA_Deriv::funcを定義したり、
A_BaseとBを同じヘッダで定義して、そのヘッダの一番下に
インラインでA_Deriv::funcを定義するなどの方法がある。
371:365
07/07/25 16:17:52
>>369
>>370
早速の返答ありがとうございます。
かき方がとても悪かったです、A_Deriv::func()は実際はcppの方に実装してあります。
そして、A_Deriv::func()の実装したcppでのincludeをA.h B.hともにして通りました(A.hのみincludeしていた状態でした)
とてもバカなミスでした。お手数おかけしました。どうもありがとうございました!
372:デフォルトの名無しさん
07/07/25 18:01:38
>>353
どこのGCCの話をしてるんだ?
Win以外じゃ主流なんだが・・・
373:デフォルトの名無しさん
07/07/25 18:05:11
>>372
かわいそうな子に触らないで
374:353=372
07/07/25 18:22:02
つまらん。もっと面白い突っ込みしろよ
375:デフォルトの名無しさん
07/07/25 19:01:38
質問なんですが、配列には最後の要素に必ずナル文字(\0)が
入らないといけないんですか?
376:デフォルトの名無しさん
07/07/25 19:05:27
文字列なら
377:デフォルトの名無しさん
07/07/25 19:08:49
>>375
ぬるぽ
文字じゃなければ別に\0入ってなくていい。
文字列だと文字の終わりがわからんから。
文字表示するとき、1個ずつ文字を調べて'\0'まで描画するみらいなルールがあるの
378:デフォルトの名無しさん
07/07/25 19:19:54
みらいなみらいなけーの
379:デフォルトの名無しさん
07/07/26 10:13:10
らめぇー
380:デフォルトの名無しさん
07/07/26 11:42:25
VC.NET2003で
mkstemp()
が使いたいのですが、どうしたらいいでしょうか?
381:デフォルトの名無しさん
07/07/26 11:59:03
>>380
それは諦めて、標準ライブラリ関数のtmpnamやtmpfileを使う。
382:デフォルトの名無しさん
07/07/26 12:02:02
探せばwin32版の実装も転がってるんじゃないのか
383:デフォルトの名無しさん
07/07/26 12:12:44
>>382
つCygwin
VC++で使えないだろうけどね。
384:デフォルトの名無しさん
07/07/26 15:14:57
エラーチェックが甘いけど、自作するならこんな感じかなぁ。
#include <windows.h>
#include <sys/stat.h>
#include <io.h>
int mkstemp(const char *templ) {
char *buffer;
DWORD length;
char filename[MAX_PATH];
length = ::GetTempPathA(0, NULL);
buffer = (char *)malloc(length);
GetTempPathA(length, buffer);
if (GetTempFileNameA(buffer, templ, 0, filename) == 0) {
free(buffer);
return -1;
}
free(buffer);
return open(filename, _S_IEXEC);
}
385:デフォルトの名無しさん
07/07/26 15:19:57
すいません、生徒5人で3科目(国語・数学・英語)の点数を2次元配列に読み込んで、
その最高点と平均点を求めるプログラムを書いたのですが、なぜか平均点がうまく出ません・・・。
どこが悪いのでしょうか。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
386:デフォルトの名無しさん
07/07/26 15:30:16
printf("[国語]平均点 : %d\n", ave[i]); ここの%d
387:デフォルトの名無しさん
07/07/26 15:35:23
>>386
・・・・・orz
すいませんホントありがとうございます・・・。自分ではなかなか気づかないものですね・・・。
388:デフォルトの名無しさん
07/07/26 15:39:47
>>387
普通のコンパイラなら警告を出してくれると思うのだが。
389:デフォルトの名無しさん
07/07/26 15:40:14
え?printfだぜ?
390:デフォルトの名無しさん
07/07/26 15:42:47
--
for (i=0; i<3; i++) {
switch (i) {
case 0 : printf("[国語]最高点 : %d\n", max[i]);
--
激しく間が抜けたコードだな。そこまでループに拘るなら文字列も動的に作ればいいものを。
391:デフォルトの名無しさん
07/07/26 15:43:53
>>389
え? 今時出せないコンパイラなんてあったの?
すまん、私が物を知らないらしい。
392:デフォルトの名無しさん
07/07/26 15:44:51
>>391
じゃあ、その出すコンパイラと出る例をあげてくれないか。
393:デフォルトの名無しさん
07/07/26 15:46:18
gcc -Wallで警告でるよ
394:デフォルトの名無しさん
07/07/26 15:48:18
gccはputsに置き換える件といい、余計なお世話が多いな。
この文字列が変数だったら検出できんのかね?
395:デフォルトの名無しさん
07/07/26 15:49:35
static char const * const subjs[] = {"国語", "数学", "英語",};
for (ic = 0; ic < sizeof(subjs) / sizeof(* subjs); ++i) {
printf("[%s]最高点:%d\n", subjs[ic], ave[ic]);
}
とか? そこまで凝らなくても良さそうだが。
#でもそれならループにしなくてもって話になるか。