【初心者歓迎】C/C++室 Ver.26【環境依存OK】

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.25【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1140963340/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2デフォルトの名無しさん:2006/03/29(水) 12:54:28
新スレおめでとうございます
3デフォルトの名無しさん:2006/03/29(水) 13:36:07
>1
おつ
4デフォルトの名無しさん:2006/03/29(水) 16:13:06
ポインコが4ゲツ
5デフォルトの名無しさん:2006/03/29(水) 18:53:53
>1

>前1000
GJ
6デフォルトの名無しさん:2006/03/29(水) 20:42:48
otu
7デフォルトの名無しさん:2006/03/30(木) 22:02:04
VisualC++6.0でGUI作るのって…めんどくさすぎない?
当方VC6.0しか環境が無く。どうにか、これでRAD的に簡単にGUI組んでいく方法ない?
8デフォルトの名無しさん:2006/03/30(木) 22:09:05
VC++Expressを入れてみるとか
9デフォルトの名無しさん:2006/03/30(木) 22:16:55
IEコンポーネントはっつけてGUIデザインはHTMLで。
10デフォルトの名無しさん:2006/03/30(木) 22:50:35
>>8
ごめん。せっかくだけどSP2入れれないから、俺無理だった。。。

>>9
そんなことが出来るのか。

思ったんだけど、EcllipseにGUIエディタ入れて、C++のも入れて編集したりとかできないかな
つか、VCでのGUIの組み方を親切丁寧に教えてくれてるサイトって無いものか
11デフォルトの名無しさん:2006/03/30(木) 23:51:49
>>7
ツールバーとかつけるだけでも大変だけど、
それを簡単に作れるようにマイルーチンを鍛えていくのが楽しい。
12デフォルトの名無しさん:2006/03/30(木) 23:59:12
>>7
ダイアログエディタはそんなに使いづらかった?
13デフォルトの名無しさん:2006/03/31(金) 00:50:35
WideStudioってどうだっけ?
14デフォルトの名無しさん:2006/03/31(金) 11:04:04
>>12
メニュー付きで編集できるなら良かったのだけど(ダイアログ
画像(BMP〜PSDくらいまで)を単純にファイル選択ウィンドウから開いて
加工して、プレビューで見せて任意形式で保存するようなアプリにしたいのだけど
15デフォルトの名無しさん:2006/03/31(金) 13:37:34
>>14
つ[ImageMagick]
16デフォルトの名無しさん:2006/03/31(金) 21:46:15
14だけど、結局窓を開かないで
初めからダイアログボックスにメニューをつけて画像開くようにしようとおもう
ところでピクチャボックスにファイル開いて画像の表示って出来るかな

>>14
やりたいことがあるから既存のソフトウェアは。。。
17デフォルトの名無しさん:2006/03/32(土) 01:56:01
基本クラスオブジェクトへのポインタを通じて派生クラスへアクセスする事があるから、
デストラクタはvirtual宣言しておくべきだと言えるのですか?
18デフォルトの名無しさん:2006/03/32(土) 02:09:28
日本語でおk
1916:2006/03/32(土) 02:20:53
ブロークン日本語ですかね?
2017:2006/03/32(土) 02:21:42
16じゃなかた。(*´J`)
21デフォルトの名無しさん:2006/03/32(土) 02:33:51
class A{
void make_obj_b;
};

void A::make_obj_b;(){
obj_b B;
]

class B{
}

void

int main (){
obj_a A;
obj_a::make_obj_b;
// <-ココ
return;
}

とした場合、コメントの場所でobj_bは破棄されてしまいます。
obj_aが生きている間はobj_bを保持する方法などはありますか?

22デフォルトの名無しさん:2006/03/32(土) 02:37:25
>>21
集約の関係にする。
お前はOOPのなんたるかを勉強し直せ
23デフォルトの名無しさん:2006/03/32(土) 02:43:17
>>22
thx.
2417:2006/03/32(土) 03:51:45
何故デストラクタを出来る限りvirtualにした方が良いかというと、
それは、基本クラスオブジェクトへのポインタを通じて派生クラスオブジェクトへアクセスする事例を考慮しての事ですか?
25デフォルトの名無しさん:2006/03/32(土) 03:53:35
日本語でおk
26デフォルトの名無しさん:2006/03/32(土) 03:54:18
意味がよくわからんが、アップキャストされてるポインタをdeleteしたときに
サブクラスのデストラクタを呼ぶため
2717:2006/03/32(土) 04:17:28
日本語に自信が無くなりました。。。
2817:2006/03/32(土) 04:19:40
基本クラスオブジェクトへのポインタを通じて派生クラスオブジェクトへアクセスする事を
アップキャストと言うのですね。
勉強になりました^^
2917:2006/03/32(土) 04:20:52
基本クラスオブジェクトへのポインタを通じて派生クラスオブジェクトへアクセスする事を
アップキャストと言うのですね。
勉強になりました^^
独習C++では教えてくれませんでした><
30デフォルトの名無しさん:2006/03/32(土) 04:27:07
>>29
アップキャストは「アクセスすること」じゃなくて、
アクセスするためにポインタや参照を変換することを言う。
31デフォルトの名無しさん:2006/03/32(土) 05:54:40
なんで派生クラスのポインタを基本クラスのポインタにキャストしたのに、
そこから仮想関数呼んだらまだ派生クラスの関数の方を呼ぶんですか?
32デフォルトの名無しさん:2006/03/32(土) 05:57:23
そういうことをするために仮想関数が存在する
この動作が気に食わないならvirtualせずにオーバーライドしとけ
33デフォルトの名無しさん:2006/03/32(土) 06:03:27
実行時にどちらを指してるか判断して、それようの方を呼ぶ機構がvirtualによるオーバーライドなのではないのですか?
今は基本クラスのオブジェクトを指してる筈だから、基本クラスのvirtualついた方を呼ぶべきだと思います><
34デフォルトの名無しさん:2006/03/32(土) 06:08:21
>>33
日本語でおk
35デフォルトの名無しさん:2006/03/32(土) 06:12:49
ムキー!#><#
36デフォルトの名無しさん:2006/03/32(土) 06:14:16
ポリモーフィッククラスがマスターできません><
37デフォルトの名無しさん:2006/03/32(土) 06:26:31
>>36
日本語でおk
38デフォルトの名無しさん:2006/03/32(土) 06:29:47
>>37
どうせあんたなんか朝生でも見て暇を持て余してたんでしょ!
で、変なの居るから適当にいじめてやろうって魂胆でしょ!?><
39デフォルトの名無しさん:2006/03/32(土) 06:53:55
あれ?virtualせずにオーバーライド?

もうvirtualの存在意義とか混乱して分からなくなりました><
40デフォルトの名無しさん:2006/03/32(土) 07:19:23
virtualをつけるとアップキャストした場合でも、ダウンキャストした場合でも、継承クラスの方を使うという認識でいいですか?

んで、ダウンキャストしたら基本クラスの方を使いたいなら
virtual無しオーバーライドにすると。
41デフォルトの名無しさん:2006/03/32(土) 07:21:29
>>33
>呼ぶべきだと思います><
派生クラスの関数を呼ぶためにvirtual にしてるんだから何もおかしくないだろ
42デフォルトの名無しさん:2006/03/32(土) 07:26:55
そうか!virtualだからこそ、できるだけ呼び出しはリアルの方にするという事か!
43デフォルトの名無しさん:2006/03/32(土) 07:32:25
ダウンキャストしても継承クラスのデータが残ってるのが気持悪いです。
キャストの仕組みが理解できてないのだと思います。
44デフォルトの名無しさん:2006/03/32(土) 07:47:25
とりあえず、修飾子virtualをつけてない場合のオーバーライドの動作を理解しろ
45デフォルトの名無しさん:2006/03/32(土) 08:05:47
理解しました。
vitualつけてないと、ダイナミックキャストで継承クラスのポインタを得たりしない限り
アップキャストしても基本クラスの関数呼び出しです。
継承クラスのオブジェクトのポインタからダイナミックにダウンキャストした場合でも
基本クラスの関数を呼び出します。

vitualをつけると、キャストがアップダウン関わらずvirtualがついてない方を呼び出すよう努力します。
46デフォルトの名無しさん:2006/03/32(土) 09:16:06
Visual C++ .NET 逆引き大全 500の極意を読んで
C++の学習をしています、クラスライブラリを作って見たいのですが
どういうライブラリを製作していいか思いつきません
皆さんがC++を学んだ当初どのようなライブラリを作られましたか?
題材のヒントをもらえないでしょうか
47デフォルトの名無しさん:2006/03/32(土) 09:37:07
何桁でも計算できるライブラリ
48デフォルトの名無しさん:2006/03/32(土) 12:49:58
内部でint配列使ってどうこうやるってやつ?
49デフォルトの名無しさん:2006/03/32(土) 12:59:10
GNU ncursesで日本語表示をするやり方を教えてください。
環境はcygwinです。
configure --enable-widecの後makeしたncursesを使っています。
コンパイルはgcc test.c -lncurseswです。。
printwもaddwstrも文字化けしてしまいします。
コンソールプログラムのprintf("こんにちは");は正常に表示されています。
50デフォルトの名無しさん:2006/03/32(土) 18:27:51
普通のキャストとstatic_castの違いが分かりません><
51デフォルトの名無しさん:2006/03/32(土) 18:34:26
static_cast=性的なキャスト=(;´Д`)ハァハァ
52デフォルトの名無しさん:2006/03/32(土) 18:34:28
C++で、
A(char *x){.....}
B(){char x[]=(..);....A(x)...}
としたら、'char *' 型は 'char[]' 型に変換できない エラーになりました
どうしたらいいですか
53デフォルトの名無しさん:2006/03/32(土) 18:39:25
せめてC++で書けよ・・何でそんなに頭悪いんだよ・・・・・・
54初心者:2006/03/32(土) 18:41:17
>>52
char x[]

char* x[]
にしたら良いんじゃないの?
55デフォルトの名無しさん:2006/03/32(土) 18:49:03
>>50
とりあえずstatic_cast。
それで駄目ならreinterpret_castかconst_cast。
C形式のキャストは出番無し。
56dynamic_cast:2006/03/32(土) 18:53:51
(´・ω・`)ショボーン
57初心者:2006/03/32(土) 19:07:38
違うな
>>52
A(char **x){.................}
だとどうかな?

char x[]=(.........)のxはポインタポインタのレベル?だから
入れる方も**にしてポインタポインタにしないといけないんじゃないかな?
5850:2006/03/32(土) 19:08:13
>>55
intをただunsignedにするだけでもわざわざstatic_castするんですか?
59デフォルトの名無しさん:2006/03/32(土) 19:30:55
>>58
するよ。
60デフォルトの名無しさん:2006/03/32(土) 19:47:11
>54,57
帰れ
6150:2006/03/32(土) 19:53:22
>>59
あり^^
6252:2006/03/32(土) 20:02:44
あの、エイプリルフールでしたっけ?
63デフォルトの名無しさん:2006/03/32(土) 20:24:41
コンテナはコンテナを格納できないのですか?
代わりにコンテナへのポインタを格納するようにするのですか?
64デフォルトの名無しさん:2006/03/32(土) 20:25:34
>>63
vector<vector<int> > vv;
とかそういう事?
6563:2006/03/32(土) 20:27:30
はい
66デフォルトの名無しさん:2006/03/32(土) 20:35:47
>>65
で、>>64のような書き方ではコンパイルエラーが出るの?
ポインタを入れたいのはなぜ?
67デフォルトの名無しさん:2006/03/32(土) 20:36:06
>>52
略し過ぎ。
さっぱり分からん。
68デフォルトの名無しさん:2006/03/32(土) 20:36:40
vector<vector<int>> vv; と書いてるに一票。
69デフォルトの名無しさん:2006/03/32(土) 20:45:19
>>60
俺も最初そう思った。しかしコンパイルエラーを晒してくれないので
さっぱり原因がわからん。
70初心者(今までのは全部間違い、すまそ):2006/03/32(土) 20:46:19
>>52
// test.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

void name(char* s){
cout << s << "\n";//(s:文字列の先頭を指すポインタ)を入れるとcoutが文字列にして全部表示してくれる
cout << &s << "\n";//(&s:文字列の先頭を指すポインタの中身)
cout << s[14] <<"\n";//(s[14]:15番目のポインタ)をcoutが文字にして表示してれる

}

int _tmain(int argc, _TCHAR* argv[])
{
char s[]= "2chnerehayaku sine";
name(s);
return 0;
}



>>52
ゴメン、今までの全部なしにして
>>52の通りで普通に出来たけど
何か駄目なのか?
7163:2006/03/32(土) 20:47:59
>>66
なんだかエラーが出たような気がしないでもないから苦肉策としてです。

僕も自然な表記で済むならそうしたいです。
7263:2006/03/32(土) 20:51:18
>>68-69
調べて参ります。
73デフォルトの名無しさん:2006/03/32(土) 20:51:26
そりゃ仕様です。
気になるならvector< vector<int> >とかやればいいんでないの。
これでも気になるなら他の手段使えばいいよ。
74初心者:2006/03/32(土) 21:00:51
すまん、また間違えたよ

cout << &s << "\n";//(&s:文字列の先頭を指すポインタの中身)

cout << *s << "\n";//(*s:文字列の先頭を指すポインタの中身)
に変更

上のはポインター自体のアドレスだがや
75初心者:2006/03/32(土) 21:15:55
cout << s[14] <<"\n";//(s[14]:15番目のポインタ)をcoutが文字にして表示してれる
ていうのも違うな

cout << s[14] <<"\n";//(s[14]:15番目の文字)をcoutが文字にして表示してれる
15番目の文字って意味だな

(ポインタともいえるのかもしれないけど、一応 *s[14] って出来ないから文字だな)
76初心者:2006/03/32(土) 21:22:53
まとめると
cout << s << "\n";//(s:文字列の先頭を指すポインタ)を入れるとcoutが文字列にして全部表示してくれる
cout << s + 14 << "\n";//(s:文字列の先頭を指すポインタ)を入れるとcoutが15番目の文字から文字列にして最後まで表示してくれる
cout << *s << "\n";//(*s:文字列の先頭を指すポインタの中身 )
cout << &s << "\n";//(&s:文字列の先頭を指すポインタのアドレス)
cout << s[14] <<"\n";//(s[14]:15番目の文字)をcoutが文字にして表示してれる

俺、全然駄目だな・・・
77デフォルトの名無しさん:2006/03/32(土) 21:37:31
式中のchar, shortは自動的にintに格上げされますが、
floatは必ずしもdoubleにされるわけじゃないですよね?
K&R1版にはdoubleに格上げされるとあるようですが、
古い仕様ですよね?
78デフォルトの名無しさん:2006/03/32(土) 22:01:54
>>77
その通り
7977:2006/03/32(土) 22:07:09
どうもです
80初心者:2006/03/32(土) 22:32:20
すまん、s[14] みたいなのは文字とか文字列の事か
81デフォルトの名無しさん:2006/03/32(土) 22:57:45
配列のことや。
82初心者:2006/03/32(土) 23:12:27
char* s1[3]={"東京","大阪","名古屋"};
としたとき

東京の”京”の字だけ出すにはどう配列を書いたら良いの?
83初心者:2006/03/32(土) 23:25:07
ああ、この場合はs[0]
ポインタの配列か
84デフォルトの名無しさん:2006/03/32(土) 23:40:08
>>82
#include <stdio.h>
#include <wchar.h>

wchar_t const* s1[3] = {L"東京",L"大阪",L"名古屋"};
fputwc(s1[0][1], stdout);
85デフォルトの名無しさん:2006/03/32(土) 23:45:22
"京"の文字だけ出すっていう出すの意味がわからんというか
何をしたいのかわからんが、"京"は2バイト文字なので、
s1[0][2]とs1[0][3]のchar型2つ分の内容で"京"1文字を表す。
86デフォルトの名無しさん:2006/03/32(土) 23:48:03
>>85
いい加減なこと言うなや
87初心者:2006/03/32(土) 23:49:34
>>84
ありがとう
やっぱ
他の関数使わないと無理なのな
8885:2006/03/32(土) 23:53:58
>>86
え?どっかいい加減だった?
89デフォルトの名無しさん:2006/03/32(土) 23:55:56
文字コードによって全角文字のバイト数は異なる違う
例えばEUCだと3バイト文字がある
90デフォルトの名無しさん:2006/03/32(土) 23:59:54
そういう文字コードは、wchar_tが2バイトの処理系では
扱えないっちゅうことか?
91デフォルトの名無しさん:2006/04/02(日) 00:04:29
wchar_tってそういう文字コードを突っ込む型じゃないだろ!
92初心者:2006/04/02(日) 00:20:06
char* s1[3]={"tokyo","oosaka","nagoya"};
の時

s1[0]+1
s1[0][1]

は同じ事なのかな?
93デフォルトの名無しさん:2006/04/02(日) 00:41:52
>>92
*(s1[0]+1)

s1[0][1]
が同じ。
94デフォルトの名無しさん:2006/04/02(日) 00:48:59
>>92
前者はchar *型、
後者はchar型

s1 : char *[3]型
s1[0] : char *型
s1[[0][0] : char型

こうするとわかりやすい。

std::cout << typeid(s1[0] +1).name() << std::endl ;
std::cout << typeid(s1[0][1]).name() << std::endl ;

9563:2006/04/02(日) 00:50:35
調べて参りました。
コンテナはコンテナを格納出来ます。
96初心者:2006/04/02(日) 01:11:41
>>93
>>94
つまり
s1[0][1]って
はchar型なのな

だから
&s1[0][1]ってやると
okyoになるのか
結局、普通の配列なのか
97デフォルトの名無しさん:2006/04/02(日) 01:29:15
>>95
うん、できるってばよ
すぐに>>64で示されとるだろうが

結局なにがわからなくて質問しにきたんだろう・・・
98デフォルトの名無しさん:2006/04/02(日) 01:46:29
>>91
wchar_tのエンコーディングは何も規定されてないよ、規格上は。

Unicodeを使うのが最近では一般的だけど
そうでない実装も普通にある/あった。
99デフォルトの名無しさん:2006/04/02(日) 02:16:51
cout << でコンソールに出力したら超遅くない?
Cでprintfなら一瞬なのに、C++のやり方だと一文字ずつズラーっと並ぶ感じ。
100デフォルトの名無しさん:2006/04/02(日) 02:28:22
>>99
それはそれでカッコいいじゃん
101デフォルトの名無しさん:2006/04/02(日) 02:39:46
ちょっと流れ切るようで申し訳ないのですが
PhotoShopで作成したアルファを適応したPNGファイルが読み込みたいので
ttp://www.topposystem.co.jp/GDIp/GDIp/gdi_flat_api.htm
にあるGDI+FlatsAPIsの関数を使用しファイルの読み込みに
336 GpStatus WINGDIPAPI GdipCreateBitmapFromFile(GDIPCONST WCHAR* filename, GpBitmap **bitmap);
でGpBitmapを作成し
344 GpStatus WINGDIPAPI GdipCreateHBITMAPFromBitmap(GpBitmap* bitmap, HBITMAP* hbmReturn, ARGB background); 
でhBitmapに変換しそれをUpdateLayeredWindowで表示させようと思ってるのですが
GpStatus GdipCreateBitmapFromFile("ファイル", GpBitmap **bitmap);の形で書くと
初期化子の数が多いと言われ、上のリストと引数が違い詳細がわからず困っています。
環境はVC++.NET2003で作成しています。

この方法でアルファが抜けた状態でウィンドウを表示する事は可能なのでしょうか?
普通のBitmapやアルファの付きのBMP等の表示は成功しています。
どなたか教えて頂けないでしょうか?よろしくお願いします。
102デフォルトの名無しさん:2006/04/02(日) 02:41:41
まじprintfの方が10倍は速い。
こんなんじゃJavaにすら負けそう
103初心者:2006/04/02(日) 02:55:44
char a[3][10]
は最大の大きさ[10]をあらかじめ決めないといけないけど

char* a[]
は自動でぴったり確保される
よね?

char a[3][10]の方は使わない部分は空白で埋まるわけ?
104デフォルトの名無しさん:2006/04/02(日) 02:59:38
>>103
配列が静的なものか、定義するときに初期化子をつけていれば、初期値の無い部分は 0 で埋まる。
あと、文字列リテラルには書き込みできないから気をつけろ。
105デフォルトの名無しさん:2006/04/02(日) 03:02:50
C言語でスクリーンセーバーを作れますか?
コンパイラはBCCです。
106デフォルトの名無しさん:2006/04/02(日) 03:03:29
>>105 作れますよ。
107デフォルトの名無しさん:2006/04/02(日) 03:18:14
>>106
ありがとうございます。
どこかでBCCでは作れないと聞いたので安心しました。
108デフォルトの名無しさん:2006/04/02(日) 03:29:01
>>102
最適化をかければ10倍ってことはないような気がするけど。

まあ確かに C++ のストリームではフォーマッティングがやりにくいとは思う
printf流のフォーマッティングも型安全でないところとかが気に入らないけど
使いやすさでいえば確かに使いやすいしな
109デフォルトの名無しさん:2006/04/02(日) 03:53:53
>>71
それってエラーじゃなくて、
デバッグ文字列が255文字を・・・とかいう警告じゃない?
#pragma で消せるはず。
110デフォルトの名無しさん:2006/04/02(日) 03:58:18
>>107
>どこかでBCCでは作れないと聞いたので安心しました。

お前が心配だ。
111デフォルトの名無しさん:2006/04/02(日) 04:46:22
汎用関数の型制限なんてできますか?
intとfloatとdoubleのみ可能みたいな。
112デフォルトの名無しさん:2006/04/02(日) 04:49:27
>>111
汎用関数って何だ?Templeteか?
せいぜいその3種類のみに特化させて、他は何も無しぐらいしかないんじゃね?

間違ってるかも知れんからあくまで参考程度にとどめてくれ
113デフォルトの名無しさん:2006/04/02(日) 04:54:01
テンプレート書いて、intとfloatとdoubleだけ特殊化して
その他の場合はコンパイル時にエラー起こすようにしたらいい

エラー起こす手段は適当にstatic assertでぐぐってくれ
114デフォルトの名無しさん:2006/04/02(日) 07:21:10
>>112-113
サンキュウエニウェイ
11552:2006/04/02(日) 07:54:23
http://pc8.2ch.net/test/read.cgi/tech/1141363718/44
が元のソースです。BCCの問題かもしれません
116デフォルトの名無しさん:2006/04/02(日) 08:01:41
>>115
VC++Expressのcl.exeだと/EHscオプションつければ警告も無くコンパイル成功
117デフォルトの名無しさん:2006/04/02(日) 10:21:02
>>111
こんな方法もある。

//hoge.h
template <typename T>
int hoge(T t) ;


//hoge.cpp
template <typename T>
int hoge(T t)
{
//適当に実装
}

template int hoge(int) ;
template int hoge(float) ;
template int hoge(double) ;


//main.cpp
int main()
{
118デフォルトの名無しさん:2006/04/02(日) 10:23:05
//途中で書き込んでしまったorz
//main.cpp
#include "binary.h"

int main()
{
hoge(0) ; //hoge<int>
hoge(0.1) ;//double
hoge("hoge") ;//エラー
}
119117:2006/04/02(日) 10:25:18
なんかへんなヘッダが混じったけど無視してOrz
C++ Template Metaprogramming読んで適当に試している最中だったんだ。
120デフォルトの名無しさん:2006/04/02(日) 13:35:03
>>110
いや、お前が心配だ。
BCCはscrnsave.lidが無いから無理。
121デフォルトの名無しさん:2006/04/02(日) 13:42:18
>>120
scrnsave.libはスクリーンセーバを書くときのお約束をまとめただけのもので必須ではない。
もし使いたいならmingwプロジェクトのscrnsave.cを使えばいいし。
122デフォルトの名無しさん:2006/04/02(日) 13:47:06
>>120
それ猫(ryに書いてあった!

*Borland C++ Compilerにはscrnsave.lidが付属していないため、
本章(スクリーンセーバーを作る章)のサンプルコードをコンパイルすることはできません。
123デフォルトの名無しさん:2006/04/02(日) 16:02:58
IEnumPStoreItems : IUnknown
{
HRESULT Next (unsigned long celt,LPWSTR * rgelt,unsigned long * pceltFetched );
HRESULT Skip (unsigned long celt );
HRESULT Reset ( );
HRESULT Clone (struct IEnumPStoreItems * * ppenum );

virtual HRESULT __stdcall raw_Next (unsigned long celt,LPWSTR * rgelt,unsigned long * pceltFetched ) = 0;
virtual HRESULT __stdcall raw_Skip (unsigned long celt ) = 0;
virtual HRESULT __stdcall raw_Reset ( ) = 0;
virtual HRESULT __stdcall raw_Clone (struct IEnumPStoreItems * * ppenum ) = 0;
};

@
IEnumPStoreItems : IUnknown
はクラスの定義でよろしか

A
HRESULTというのはエラー定義ですよね?
HRESULT Next (unsigned long celt,LPWSTR * rgelt,unsigned long * pceltFetched );
とは変数Nextにunsigned long celt,LPWSTR * rgelt,unsigned long * pceltFetchedを
引数として一緒に返す関数ってことですか。また、

B
virtual HRESULT
はどのように理解したらよろしか
オナガイシマス
124デフォルトの名無しさん:2006/04/02(日) 17:33:04
1.
IUnknownクラスを継承したIEnumPStoreItemsクラスの宣言

2.
HRESULTというのはtypedefされた型名
(unsigned long celt, LPWSTR * rgelt, unsigned long * pceltFetched) を引数として渡して
HRESULTを返すNextという名前の関数

引数として一緒に返すってなんやねん

3.
戻り値の型がHRESULT型の仮想関数の宣言
この場合は =0; があるので純粋仮想関数
125デフォルトの名無しさん:2006/04/02(日) 18:18:42
>>124
>IUnknownクラスを継承したIEnumPStoreItemsクラスの宣言

先頭に class なり struct なりクラスキーが付いてないんだから「クラス宣言」といってしまうのはちょっと
JIS 的には、クラスキーを除いた「クラス先頭部」ってところだが……

# 定義=宣言ではあっても、メンバ定義が付いているやつを「クラス宣言」と呼びたくはないなあ


126デフォルトの名無しさん:2006/04/02(日) 19:30:36
>>124
>>125
サンクス
123です
2
は戻り値を返すで良いですよね?

127デフォルトの名無しさん:2006/04/02(日) 21:05:10
ちょっと質問よろしいでしょうか。

クラスAにクラスB・C・Dをそれぞれ保持させています。
そのクラスB・C・Dでそれぞれクラスxの機能を使用したいのですが
それぞれにクラスxを保持させる以外にいい方法はないでしょうか。

アドバイスをお願いします。
128127:2006/04/02(日) 21:06:30
sage禁止らしいですね。すいませんでした
129デフォルトの名無しさん:2006/04/02(日) 21:45:31
>>127
それで問題ないならそれがいいだろう。何が不満なんだ?
130デフォルトの名無しさん:2006/04/02(日) 21:53:32
>>127
AがXを保持し、B/C/Dはそこへの参照を保持するようにしたらどう?
131127:2006/04/02(日) 22:01:33
>>129
クラスBCD以外にも今後xを使うクラスが増える予定であるのと
クラスAも一つじゃなくて複数なのであまり効率的でないのかなとおもったので・・・・

>>130
参照を保持する・・・具体的にどう記述してよいものか判らないので簡単な例を挙げていただけないでしょうか。
132デフォルトの名無しさん:2006/04/02(日) 22:30:55
すいません。
学校でプログラムを習っている学生なのですが、
上手くならなくて悩んでいます。

授業では、プログラムソースを1回づつ写すことを繰り返していて、
それを動作させるのは出来ていたのですが、
その後、急に「こういう物を作れ」「ソートを作れ」とだけ問題が出され、
全く分かりませんでした。

普通の人は、その1回で自分の物に出来てしまうのでしょうか?
写す練習を続けていても、どうせ写せても分かるようにならないんだ!
という気分になり、身が入りません・・・
133デフォルトの名無しさん:2006/04/02(日) 22:36:35
>>132
プログラムソースを本当に「写す」ことだけを繰り返してたんなら、
あんたプログラム向いてないよ。辞めときな。

普通は写してる途中で考える。
「ここはどういう意味か?」
「ここをちょっと変えたらどうなるのか?」
学校でプログラムを写させる時には、たぶんそういうのを期待している。

そういう考えができないなら本当にプログラムは辞めたほうがいい。
134132:2006/04/02(日) 22:38:36
>>133
なるほど・・・納得です。
確かに、ifとかを記号的に扱えれば上手くなるのかな・・・と、思うのですが、
いざ白紙の画面を見ると、何もできないんです・・・。
難しいですね。レスありがとうございます。
135デフォルトの名無しさん:2006/04/02(日) 22:43:16
http://www.amazon.co.jp/exec/obidos/ASIN/4774112399/249-1362202-1853150
そういうのってこれ読んだらいいんじゃないの?
136デフォルトの名無しさん:2006/04/02(日) 22:46:08
137132:2006/04/02(日) 22:52:22
>>135>>136
お勧めありがとうございます。書店で見てみます。

もう少し頑張ってみます。
ありがとうございました!
138デフォルトの名無しさん:2006/04/02(日) 23:01:17
VBからC++への移行しようとしているのですがまったくわかりません。
MONAOSのプログラミングに貢献したいと思っているので教えていただきたいです。
139デフォルトの名無しさん:2006/04/02(日) 23:02:59
配列の定義の際に、要素を全部0にするやり方として
int array[40] = {};
は邪道ですか?普通?
140デフォルトの名無しさん:2006/04/02(日) 23:04:01
>>138
何を聞きたい?
141デフォルトの名無しさん:2006/04/02(日) 23:11:59
>>139
それ、 C だとコンパイルできないから、 = {0} にするのが一般。
142139:2006/04/02(日) 23:26:28
>>141
なるほろ。どうも。
143132:2006/04/02(日) 23:48:17
配列って、何も入れないと0になるんですね・・・
参考になります・・・
144デフォルトの名無しさん:2006/04/02(日) 23:49:19
>>143
ならない
145132:2006/04/02(日) 23:51:28
>>144
えっ・・・では>>139さんや>>141さんの書き込みは・・・
146デフォルトの名無しさん:2006/04/03(月) 00:02:16
>>145
初期化子の不足分には 0 が埋められる。初期化しないときは不定。
静的記憶域の変数なら初期化しないときも 0 になる。
147デフォルトの名無しさん:2006/04/03(月) 00:41:20
>>141の話が出ると、勘違いする初心者が多くて困る
148132:2006/04/03(月) 01:52:46
なるほど・・・どうもです
149デフォルトの名無しさん :2006/04/03(月) 02:32:44
2次元だろうが3次元だろうが配列の初期化は{0}でOK
150デフォルトの名無しさん:2006/04/03(月) 03:20:52
C言語に3次元配列ってあるのか?
151デフォルトの名無しさん:2006/04/03(月) 03:22:00
hairetsu[z][y][x];
152デフォルトの名無しさん:2006/04/03(月) 03:32:43
int a[10][10] = {{0}};
int b[10][10][10] = {{{0}}};
153デフォルトの名無しさん:2006/04/03(月) 09:16:39
>>152
ぶっちゃけどちらも{0}でいいんじゃ・・・
15449(ncursesで日本語表示):2006/04/03(月) 10:40:11
Windows Service for Unix3.5 使うと日本語表示できました
155デフォルトの名無しさん:2006/04/03(月) 14:00:53
初心者から中級者を目指す為に勉強していますが、
わからないことがありますので教えてください。

strcpy(stackinfo, phost->h_name) ; の

  ->  とゆう表記はなんでしょうか?
 
代入?変数?よくわかりません。よくプロの人が
使う技なんでしょうか?
ちなみに初心者の書籍には一切書かれて無かったので、
中級以上の方が使うものだと思われます。
わかる方、よろしくお願いします。
156デフォルトの名無しさん:2006/04/03(月) 14:03:22
>>155
アロー演算子でググレ
157デフォルトの名無しさん:2006/04/03(月) 14:03:38
今時の初級者用の参考書はポインタも解説してらっしゃらないんですか?
158デフォルトの名無しさん:2006/04/03(月) 14:04:15
>>156
ありがとうございます。早速しらべてみます。
159デフォルトの名無しさん:2006/04/03(月) 14:05:11
>>155
なんという書籍なのか非常に気になる。

ポインタを解説しないCの書籍なんてあるのだろうか。
160デフォルトの名無しさん:2006/04/03(月) 14:26:11
どうせうすっぺらな知識しかない作者が書いたいまどきの書籍なのでしょう。
161質問:2006/04/03(月) 15:23:44
質問なんですが、
C言語の質問ではないのですが適切なスレがどこなのかわからないのでここに書いてみました。
Q1.Visual Studio 2003でC++でダイアログプログラムを記述しているのですが
メインダイアログを表示するのにリソースビューからたどって何度かクリックしないといけないのですが、簡単に表示させることはできますか?
Q2.ダイアログでプログラム作成時に常にグリッド表示にしたいのですが、「グリッド」に設定して保存しても、サイドプロジェクトを開くと「ガイドの設定」が「ルーラーとガイド」に戻って
しまいます。ガイドの設定をグリッドに固定することは可能でしょうか?
よろしくお願いします。
162デフォルトの名無しさん:2006/04/03(月) 15:51:44
A1.できません。プロジェクトを閉じるとだめだけど、開きっぱなしでいいなら代わりにダイアログエディタのビューを閉じないでタブ切り替えで我慢するとか。
A2.しりません。やってみたけどできないね。
163質問の母:2006/04/03(月) 16:13:36
>162 さん。よくわかりました。つまりできなそうですね。他の方でできるという人がいたら情報お願いします。
164デフォルトの名無しさん:2006/04/03(月) 16:22:10
C++からプログラミングを始めたいと思って今、これならわかるC++ っていう本を読んで
CUI環境でのC++プログラム(と言えない程の物)をちょろちょろ作ってるんですけど、
皆さんは初めてプログラミングを始めようと思ったときどんな事から始めましたか?どんな本を読みましたか?どんな学校でどんな事から学びましたか?
教えていただけるとうれしいす。


初心者歓迎ってこういう事じゃなかったりスレ違いだったりした場合誘導お願いします∧||∧
165ヒッキー☆:2006/04/03(月) 16:56:17
http://hp25.0zero.jp/473/BzLIVEGYM/
↑このHPの日記にて
「暇だよなネラー爆笑
 見ててウケるしワラ〜
 自分を相手への中傷でしか表現できなぃ(笑)
 頑張ろうね
 なんか能力低いっつうか人として低いなって思う(笑)」

↑ようするに
ニートだけならまだしもPCやってる全ての人間を馬鹿にしてるんですよ

あなたは許せますか??
166デフォルトの名無しさん:2006/04/03(月) 17:02:33
実話じゃん
167デフォルトの名無しさん:2006/04/03(月) 17:17:11
>>165
>ニートだけならまだしもPCやってる全ての人間を馬鹿にしてるんですよ
その内容からそういう判断をするお前が人を馬鹿にしているんだよ。
若しくは、お前自身が馬鹿。
168デフォルトの名無しさん:2006/04/03(月) 18:43:46
>>164
マ板向きの内容だと思うのでここらへんでどうぞ

スレッドを立てるまでもない質問雑談スレ23
http://pc8.2ch.net/test/read.cgi/prog/1139729337/l50

【ルールは】超初心者が質問するスレ【守れ】
http://pc8.2ch.net/test/read.cgi/prog/1093770642/l50
169164:2006/04/03(月) 20:51:52
>>168
誘導サンクスです。<(_ _)>
お邪魔しました〜
170デフォルトの名無しさん:2006/04/04(火) 07:41:51
#define x(arg1) なんか展開する
#define y(arg2) x(arg2)を使って展開する

こんな感じでマクロの中で他のマクロを
多重に使えるんでしょうか?
そのとき評価順序はどうなるんでしょう?
171デフォルトの名無しさん:2006/04/04(火) 08:29:17
#define x(arg1) X##arg1##X
#define y(arg2) x(arg2)
#define z(arg3) Z z(arg3) Z
x(xxx)
y(yyy)
z(zzz)

    ↓展開結果 by gcc -E

XxxxX
XyyyX
Z z(zzz) Z
172デフォルトの名無しさん:2006/04/04(火) 08:31:50
これはまぁ分かるんだけど、次の例はどういうこと?

#define z(arg3) Z##z(arg3)##Z
z(zzz)

    ↓ 展開結果 by gcc -E

test.c:2:1: pasting ")" and "Z" does not give a valid preprocessing token
Zz(zzz)Z
173デフォルトの名無しさん:2006/04/04(火) 08:44:43
>>172 エラーメッセージ嫁
174デフォルトの名無しさん:2006/04/04(火) 08:47:00
>>173 いや、だからなぜ二個目のZが単なるリテラル
として連接されずに、展開対象になっているのかと。
gcc の 2.9.x から 3.x で挙動が変わった?
175デフォルトの名無しさん:2006/04/04(火) 08:49:18
うーん、こういうこともあるみたいだし、あんまり変な事するなってことか?
http://blog.tcp-ip.or.jp/ar/syuichi/index.php?mode=show&date=20050112
176デフォルトの名無しさん:2006/04/04(火) 08:52:06
ごまん、激しくかんちがいしてた。
鬱だしのう
177デフォルトの名無しさん:2006/04/04(火) 09:08:40
>>174 どこにリテラルがある?
178デフォルトの名無しさん:2006/04/04(火) 10:58:14
これはひどい
179デフォルトの名無しさん:2006/04/04(火) 11:29:13
インターネッコ
180デフォルトの名無しさん:2006/04/04(火) 12:01:29
複雑なファイルはCでは
どう読みこめば?
あかさたなはまやら
というファイルから
かさた、まや
だけ読み込んでcharに
置き換えるにはどうすればいいのでしょう?
181デフォルトの名無しさん:2006/04/04(火) 12:38:23
>>170
>そのとき評価順序はどうなるんでしょう?
#define x(a) {a}
#define y(a) <x(a)>
とすると、y(foo)の展開は次のように進む。引数の展開の細かいところは省略した。
矢印は「着目しているトークン」を指す。
→y(foo)
/* マクロyの呼び出しを認識。引数の対応は a -> foo */
/* 引数fooを展開。結果はfoo */
/* yの呼び出しを定義本体で置き換える */
→<x(foo)>
/* <はマクロではないのでそのまま出力 */
<→x(foo)>
/* マクロxの呼び出しを認識。引数の対応は a -> foo */
/* 引数fooを展開。結果はfoo */
/* xの呼び出しを定義本体で置き換える */
<→{foo}>
/* {はマクロではないのでそのまま出力 */
<{→foo}>
/* 以下同様。これ以降マクロの呼び出しはなく、結果は<{foo}>。 */
182デフォルトの名無しさん:2006/04/04(火) 12:44:00
>>180
どういう条件で

 かさた、まや

だけが抜き出されるのか?
をコンピュータに説明すればいい。
183デフォルトの名無しさん:2006/04/04(火) 12:51:18
そういやマルチバイト文字1文字を表すときどうやんの?
char ch ='あ';だとコンパイルエラーだし
184デフォルトの名無しさん:2006/04/04(火) 12:59:01
マルチバイトって時点で一文字とかそういうの超越してる。
185デフォルトの名無しさん:2006/04/04(火) 13:42:56
そういえばおれもロケールの扱い方はイマイチだ・・・orz

5冊C++の本あるのにstd::localeのこととか、どれにもほとんど載ってねー
買う本間違ったかな・・・、それとも足りないかな・・・
まあ、ぐぐればそれなりに出てくるみたいだけど

以上チラシの裏
186デフォルトの名無しさん:2006/04/04(火) 13:52:00
>>182
それが難しくて出来ないんです
単にfscanfを利用してもできませんし…
187デフォルトの名無しさん:2006/04/04(火) 14:14:16
>>186
ワイド文字を含むテキストファイルから、例えば任意のn番目にある文字を知りたい
みたいな感じ?
188デフォルトの名無しさん:2006/04/04(火) 15:04:47
勉強し始めのド低脳な質問かもしれないけど
お願いします。

金額を入力して、割引した額を表示させるプログラム
を作ったのですが
printf("一割引の場合\n%d円\n",(int)(a*0.9));
この行の(int)(a*0.9))の(int)がなぜ必要なのでしょう?
実際無くしてやってみたら全部計算結果が0になってしまった
のですが。
189デフォルトの名無しさん:2006/04/04(火) 15:07:39
int型の整数(この場合a)に小数点ありの実数(0.9)を掛けると
int型は自動的にdouble型やfloat型などの浮動小数点型に”格上げ”されてしまうため、
(int)でint型にキャストして表示してる
190デフォルトの名無しさん:2006/04/04(火) 15:12:15
>>189
ということは、5とか6とか掛けるなら
このintはいらない、ってことですね。
アリガトウございました。
191デフォルトの名無しさん:2006/04/04(火) 15:42:49
>>183
       、--‐冖'⌒ ̄ ̄`ー-、
     /⌒`         三ミヽー-ヘ,_
   __,{ ;;,,             ミミ   i ´Z,
   ゝ   ''〃//,,,      ,,..`ミミ、_ノリ}j; f彡
  _)        〃///, ,;彡'rffッ、ィ彡'ノ从iノ彡
  >';;,,       ノ丿川j !川|;  :.`7ラ公 '>了  なにジョジョ? マルチバイト文字一文字が表せない?
 _く彡川f゙ノ'ノノ ノ_ノノノイシノ| }.: '〈八ミ、、;.)
  ヽ.:.:.:.:.:.;=、彡/‐-ニ''_ー<、{_,ノ -一ヾ`~;.;.;)  ジョジョ それは「一文字」と考えるからだよ
  く .:.:.:.:.:!ハ.Yイ  ぇ'无テ,`ヽ}}}ィt于 `|ィ"~
   ):.:.:.:.:|.Y }: :!    `二´/' ; |丶ニ  ノノ    逆に考えるんだ
    ) :.: ト、リ: :!ヾ:、   丶 ; | ゙  イ:} 
   { .:.: l {: : }  `    ,.__(__,}   /ノ   「2バイトだから文字列だ」と
    ヽ !  `'゙!       ,.,,.`三'゙、,_  /´   
    ,/´{  ミ l    /゙,:-…-〜、 ) |       考えるんだ
  ,r{   \ ミ  \   `' '≡≡' " ノ  
__ノ  ヽ   \  ヽ\    彡  ,イ_
      \   \ ヽ 丶.     ノ!|ヽ`ヽ、
         \   \ヽ `¨¨¨¨´/ |l ト、 `'ー-、__
            \  `'ー-、  // /:.:.}       `'ー、_
192デフォルトの名無しさん:2006/04/04(火) 15:51:09
>>191
UTF-32だったら4バイトだよ
193デフォルトの名無しさん:2006/04/04(火) 19:01:40
L なしで UTF-32 はねーよ。UTF-8 なら分かるが。

SJIS にしろ EUC にしろ UTF-8 にしろ、
どちらにしろ文字列だな。
194デフォルトの名無しさん:2006/04/04(火) 21:07:08
>>183
Shift-JIS環境などでは通る。

>>186
> それが難しくて出来ないんです

まず、条件をまとめろ。
話はそれからだ。

そもそも、人に説明できない事を、
コンピュータに命令出来ると思ってるのか?

抜き出したい各文字がどういう条件で抜き出されるのか、
もう一度よく整理するこったな。
195デフォルトの名無しさん:2006/04/04(火) 21:34:19
wchar.hっていつできたの?
最近のC言語の本でも載ってないのけっこうある。
標準だよね?
196デフォルトの名無しさん:2006/04/04(火) 21:37:28
C95からだからもう10年以上前に。

ttp://ja.wikipedia.org/wiki/C99
197デフォルトの名無しさん:2006/04/04(火) 21:52:39
それってwchar_t型の話では?
stddef.hの・・・
198デフォルトの名無しさん:2006/04/04(火) 21:58:08
wchar_tはC89からあるだろ。
199デフォルトの名無しさん:2006/04/04(火) 22:17:10
http://www.kumei.ne.jp/c_lang/intro/no_35.htm
>int *ptr();とするとint型へのポインタを返すptr関数という意味になります。
これってどういう意味なんですか?
サンプルソースとか誰か書いてくれませんかね?
200デフォルトの名無しさん:2006/04/04(火) 22:22:39
>>199
int* ptr();
こう書いたらわかるか。
201デフォルトの名無しさん:2006/04/04(火) 22:23:10
>>199
int *ptr(); /* 宣言 */

int *ptr() { return NULL; } /* 定義 */
202デフォルトの名無しさん:2006/04/04(火) 22:27:12
int * ptr()
{
static int forex = 10;
return & forex;//int へのポインタ
}
203デフォルトの名無しさん:2006/04/04(火) 22:28:28
>>199
ついでに言えば、
int * ptr() = NULL;
はエラー。
int (* ptr) () = NULL;
は合法。
204デフォルトの名無しさん:2006/04/04(火) 22:36:15
分かりました。
どうもありがてれう。
205デフォルトの名無しさん:2006/04/04(火) 23:12:39
 for (i=0,encstring+=6;*encstring;encstring+=2,i++) {
  val = MyStrSearch( nRnd, *encstring, *(encstring+1) );
  decstring[i] = (unsigned char)val;
 }
たぶん2重に条件つけてるんだろうけど
for($i=0;なんたら〜;$i++){

}
と展開してくれないかな?
206デフォルトの名無しさん:2006/04/04(火) 23:27:00
for(A;B;C) {

}



A
while(B){

C
}
207デフォルトの名無しさん:2006/04/04(火) 23:29:47
>>205
それ、山田オルタの宇宙語デコーダだろ?
208デフォルトの名無しさん:2006/04/05(水) 04:03:51
CInternetSessionでとってきたソースがEUCで書かれているのですが、
これをCStringに読めるようにする方法、ありますか?
VC++.NET MFC SDIです。宜しくお願いします。
209デフォルトの名無しさん:2006/04/05(水) 04:44:58
ありますよ
210デフォルトの名無しさん:2006/04/05(水) 07:37:00
ConvertINetMultiByteToUnicode
211デフォルトの名無しさん:2006/04/05(水) 08:50:25
質問です
 
while(1){
printf("hello\n");
}

というプログラムを実行すると
hello
hello
.....と続くじゃないですか、
一回一回のループでコマンドプロンプトに出力された結果を消去したいんですが・・
つまり hello が一回だけ出力されるようにしたいんですが・・

while使うなって思うかもしれませんがどうしてもwhileはまわしたいんです。
誰か、教えてくださいお願いします
212デフォルトの名無しさん:2006/04/05(水) 08:52:55
#ifdef WIN32_
system("cls");
#else
system("clear");
#endif
213デフォルトの名無しさん:2006/04/05(水) 08:59:00
>>212さん

助かりました。ありがとうございます
214デフォルトの名無しさん:2006/04/05(水) 09:24:07
>>211
1行だけしか出力しないなら\rって手もある
printf("hello\r")にすればカーソル位置がhに戻るから上書きされる
進捗度表示するのとかに使えるな
215デフォルトの名無しさん:2006/04/05(水) 11:31:48
ま、長くなって改行すると破綻するけどね。
216デフォルトの名無しさん:2006/04/05(水) 11:34:04
>183 デフォルトの名無しさん 2006/04/04(火) 12:51:18
> そういやマルチバイト文字1文字を表すときどうやんの?
> char ch ='あ';だとコンパイルエラーだし

>194 デフォルトの名無しさん 2006/04/04(火) 21:07:08
> >>183
> Shift-JIS環境などでは通る。
217デフォルトの名無しさん:2006/04/05(水) 11:34:38
文字列の配列(char**)を動的に確保したいんだけど、
どうしても下の箇所でエラーが出る
よくよく考えればサイズの分からないものを確保しようとして失敗してるってわかるんだけど、どうにかならないかな
ファイルから文字列を読み込み、rand()%numで文字列配列内の要素にランダムにアクセスしてそれを出力するプログラムです

ReadFile(char**& urllist, int& num)
{
/*・・・・・・・・・・・・・・・・・・*/
 strlist = new char*[num];
/*・・・・・・・・・・・・・・・・・・*/
}
218デフォルトの名無しさん:2006/04/05(水) 11:36:41
219デフォルトの名無しさん:2006/04/05(水) 11:38:19
>>217
・std::vectorを使う。
・関数I/Fを見直す。
・newを使うという発想の愚かさに気づく。
220デフォルトの名無しさん:2006/04/05(水) 11:44:33
>>219
オーケー
マロクってくる
221デフォルトの名無しさん:2006/04/05(水) 11:51:32
>>220
ー^)ъ GJ!
222デフォルトの名無しさん:2006/04/05(水) 12:02:04
まったくの初心者なのですが、つい最近からC言語を勉強しようと思って
コンパイルをDLしたのですが、MS-DOS窓というのがどこにあるのかまったくわかりません。
C言語の初心者サイトなどを一応見てみたのですが書いていなくて、くだらない質問だとは思いますが教えてください。


223デフォルトの名無しさん:2006/04/05(水) 12:07:03
スタート->ファイル名を指定して実行に「cmd」って入れて出る窓のことをDos窓と言う
コマンドプロンプト。
224デフォルトの名無しさん:2006/04/05(水) 12:12:33
C言語でさっき、char型の変数に0x80をしまい
printf("%d");で中身を確認した所-128と言う値が出力されました
0x70で1120 0x01で10が出力されたのですが、なんでですか?
単純に変数の型と%dの形式があってないからそのような出力がされただけで
実際に変数の中身は代入された値がしまわれているのでしょうか?
225デフォルトの名無しさん:2006/04/05(水) 12:17:08
あなたの環境ではcharは2の補数の符号付整数だから。
226デフォルトの名無しさん:2006/04/05(水) 12:22:33
>>225
御回答ありがとうございます。
じゃあunsigned charにすれば問題ないですね
227デフォルトの名無しさん:2006/04/05(水) 12:32:14
>>223
教えていただいてありがとうございます。
cmdでいいならなんでDOS窓なんて言うんでしょうね・・・。ずっと探してましたよ・・・。


228デフォルトの名無しさん:2006/04/05(水) 12:34:56
>>227
プログラムの前に、コンピュータの一般的な基礎知識から勉強しろよ。
229デフォルトの名無しさん:2006/04/05(水) 12:47:20
>>218 良くそこまで沢山見つけてきたな。
230デフォルトの名無しさん:2006/04/05(水) 13:41:54
>>227
ここはPG初心者歓迎であってPC初心者は受け付けてないのだぜ
とっとと帰るんだぜ
231デフォルトの名無しさん:2006/04/05(水) 13:48:13
command.com と cmd.exe は違うと、
嫁が言ってました。
232デフォルトの名無しさん:2006/04/05(水) 13:59:48
int func(){
  for(int i=0;i<20;i++){
    hoge(i);
  }
  return;
}

iの寿命がfunc関数内ではなく、for内だけにする設定って、VC++6.0ではどうやるんですか?
233デフォルトの名無しさん:2006/04/05(水) 14:02:08
forの中で宣言したものはforの中でしか使えない
234デフォルトの名無しさん:2006/04/05(水) 14:04:31
VC6だとその設定はできなかったような。
235デフォルトの名無しさん:2006/04/05(水) 14:04:45
>>232
#define for if(0); else for
236デフォルトの名無しさん:2006/04/05(水) 14:11:40
>>233 いつの頃から、そうなったなぁ・・・・
237デフォルトの名無しさん:2006/04/05(水) 14:12:09
>>236
VC6がそもそもおかしかった。
238デフォルトの名無しさん:2006/04/05(水) 14:13:32
>>237 VC6が、というか、標準化の中で
そういう風に明確に規定されるようになったんじゃないかな。
239デフォルトの名無しさん:2006/04/05(水) 15:17:44
VC6が出たのは98年のC++標準が出た直後だったと思うが
ドラフト無視して作っただけじゃないかな
240デフォルトの名無しさん:2006/04/05(水) 15:24:12
いや、一応VC++6.0にもifのスコープを標準準拠にするってオプションあるはずだが。
大量にコンパイルエラーになるコードがあるから標準ではOFFってだけじゃなかったか。
241デフォルトの名無しさん:2006/04/05(水) 15:29:29
/Zc:forScope (for ループのスコープの強制準拠)
http://msdn2.microsoft.com/ja-JP/library/84wcsx8x.aspx

Visual C++ 6 および 7.1 では /Zc:forScope オフがデフォルト
Visual C++ 8 では オンがデフォルトのようです。
242デフォルトの名無しさん:2006/04/05(水) 15:45:19
だから VC++ 6.0 にそんなオプションないってば
243デフォルトの名無しさん:2006/04/05(水) 15:56:48
C++標準前に作ってたんだから、VC6にそんなオプションあるわけないじゃん。
だから、VC7でオプション作って、互換性のためにデフォルトでオフにしたんとちゃうん?
244デフォルトの名無しさん:2006/04/05(水) 16:05:43
つーか初期化子はforループの外に書けwそれで解決www
245デフォルトの名無しさん:2006/04/05(水) 16:41:33
>>235 で問題ないだろ。
246232:2006/04/05(水) 16:59:25
235でやってみます。
247デフォルトの名無しさん:2006/04/05(水) 17:04:11
いいぞ、やれ、もっとやれ。
248デフォルトの名無しさん:2006/04/05(水) 17:28:08
>243
/Za
ただし、Windows.hでエラーが出るようになるが(w
249デフォルトの名無しさん:2006/04/05(水) 18:48:29
VC++6.0だとMS拡張を全部切らないと無理だよな。
250デフォルトの名無しさん:2006/04/05(水) 22:31:35
USBに接続するタイプのゲームコントローラで操作できるプログラムを作っているんですが、
肝心のコントローラからの入力をどうやって処理したらいいかわかりません。
ウインドウメッセージで WM_DEVICECHANGE というのがあったので検知できるかと思ったのですが
コントローラのボタンを押しても wParam に何も入りません。
USBとかからの情報を扱えるウインドウメッセージは他にありませんか?
251デフォルトの名無しさん:2006/04/05(水) 22:54:57
252デフォルトの名無しさん:2006/04/06(木) 02:04:31
仮想関数をオーバライドする際、基底クラスのpublicな仮想関数を
派生クラスではprivate関数としてオーバライドできるって、
何かおかしくないですか?オーバライドする際、アクセス指定は
一致させる必要ないですよね?
そうすると基底クラスのポインタ経由で派生クラスのprivateな関数
呼び出せちまいますよね。継承自体がprivate継承なら基底のポインタに
派生のポインタ代入するとコンパイルエラーになるようですが。。。

(それともこれって標準規格では違うの?俺のコンパイラだけ?)
253デフォルトの名無しさん:2006/04/06(木) 02:05:59
>>252
実際にやってみてから書いてるの?
254デフォルトの名無しさん:2006/04/06(木) 02:10:33
>>252
その動作で規格どおり。そんな規格になってる理由は知らない。
255デフォルトの名無しさん:2006/04/06(木) 02:14:22
>>252
おかしい。
おかしいので仮想関数はpublicにすべきではない
ということになっている
256デフォルトの名無しさん:2006/04/06(木) 02:17:12
>>255 んなこたーない
257デフォルトの名無しさん:2006/04/06(木) 02:26:53
NVIがgotwに載ったのがなんと5年前だ
5年間一冊も本を読んでいない>>256のような
上司あるいは同僚は本当にいるのだ
258デフォルトの名無しさん:2006/04/06(木) 02:39:03
>>257
NVI を否定してるんじゃない。
>>252 が NVI の根拠じゃないだろってこと。
259デフォルトの名無しさん:2006/04/06(木) 03:42:40
>>252
継承自体いい加減な機能なんだからほどほどにしとけw
260デフォルトの名無しさん:2006/04/06(木) 09:16:09
>>252
逆に考えてみろ。
基本クラスでpublic公開されてるものをオーバーライドする訳だから
派生でprivateする事の方がおかしい。
261252:2006/04/06(木) 09:24:15
レスどうもです。
そうですか・・・わかりました、ほどほどにしておきます。
262デフォルトの名無しさん:2006/04/06(木) 11:12:04
>>260
おかしいことをしてるのにコンパイルエラーも警告も出ないのはどうなんだってことでしょ
263デフォルトの名無しさん :2006/04/06(木) 12:16:08
>>262
コンパイラなんてそんなもんだよ
264デフォルトの名無しさん:2006/04/06(木) 12:32:28
文法的には問題ないからな。
265デフォルトの名無しさん:2006/04/06(木) 14:08:49
>>262
そこはlintの範疇だろ
266デフォルトの名無しさん:2006/04/06(木) 15:33:06
あ?
ある人間が今までホームページでタダで公開していたエロ画像があったとしよう。
しかしそのホームページの管理者の考えが変わりエロ画像が有料化してプライベートになることはよくあることだ。
なにもおかしなことではない。
267デフォルトの名無しさん:2006/04/06(木) 16:27:56
>>266
その例えなら
アクセス方法によっては依然ただで見放題ってのが問題なわけで
そこを塞いでないのは何か意図した使い道があるのか?ってことではないかと
268デフォルトの名無しさん:2006/04/06(木) 16:48:24
>>267
ユーザーの良心を信じるってことじゃね?

できるのとやるのはちがうのではなかろーかと。
普通、virtualな関数のアクセスを変更したりしないと思われ。




269デフォルトの名無しさん:2006/04/06(木) 16:58:02
>>268
>普通、virtualな関数のアクセスを変更したりしないと思われ。
そういうプログラマのミスにエラー出すなり警告出すなりするのがコンパイラの仕事なのでは?
なんかこれを利用したテクニックがあったりするのかな?
270デフォルトの名無しさん:2006/04/06(木) 21:06:53
>>269
文法誤りや規格書でダメと規定されてる事にエラーや警告を出すのは
コンパイラの仕事だが、そうでないことにまで警告を出す義務はない
そこはLintの仕事
271デフォルトの名無しさん:2006/04/06(木) 21:25:56
goto 254;
272デフォルトの名無しさん:2006/04/06(木) 21:28:54
>>254
>そんな規格になってる理由は知らない。
ようするにこれが知りたいのさ
273デフォルトの名無しさん:2006/04/06(木) 22:13:22
D&Eのどっかに書いてあるんじゃね?
探すの面倒だけど。
274デフォルトの名無しさん:2006/04/06(木) 22:20:32
昔はvirtualがなかった
派生後のクラスでオーバーライドした関数にアクセスさせたくなかった
ダウンキャスト後のことまではしらね
以上

275デフォルトの名無しさん:2006/04/06(木) 22:20:44
>>272
Stroustrupに聞いてみたらいいんじゃね?幸いまだご存命中なんだし
276デフォルトの名無しさん:2006/04/06(木) 22:51:10
質問
こんな↓感じでクラスの中に構造体を入れてみたんだが
問題ないですよね?
また、このD3DSPRITEVERTEX構造体は
「このクラスの関数内でしか、定義できない構造体である」
と言う認識で良いのでしょうか?

class HOGE{
//略
public:
struct D3DSPRITEVERTEX {
float x, y, z;
float rhw;
DWORD color;
float tu0, tv0;

enum { FVF = D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1 } ;
   };

};
277デフォルトの名無しさん:2006/04/06(木) 23:17:02
>>276
>「このクラスの関数内でしか、定義できない構造体である」
の意味がわからんが、publicだからHOGE外でも
HOGE::D3DSPRITEVERTEX aaa;
と使うことが出来る。
278デフォルトの名無しさん:2006/04/06(木) 23:22:03
>>277
なるほど。
じゃあ、privateなら、完全に隠蔽できること?
279デフォルトの名無しさん:2006/04/06(木) 23:24:42
いえすきりすと
280デフォルトの名無しさん:2006/04/06(木) 23:26:20
>>279
おお。ありがd
28152:2006/04/06(木) 23:59:59
BCCに詳しいかた>>115をどうしたらコンパイルできますか
282デフォルトの名無しさん:2006/04/07(金) 00:34:37
>>281
ソース修正したらコンパイルできたよー。
これって+の中に数字が入るの?
何のプログラム?
283デフォルトの名無しさん:2006/04/07(金) 00:44:37
すっごく基本的なんですが…

char *a = new char(0xff);
char *a = new char [100];

これをドッキングさせたいんですが、どうやればいいですか?

引数付きコンストラクタしかないクラスを
大きさが変わる配列にしたいのにどうやってもエラーが… orz...
284デフォルトの名無しさん:2006/04/07(金) 00:48:53
>>283
無理。std::vectorやplacement newやstd::uninitialized_fillを使うべし。
285デフォルトの名無しさん:2006/04/07(金) 00:51:00
>>283
> 引数付きコンストラクタしかないクラスを大きさが変わる配列に

std::vector<boost::shared_ptr<Hoge> >
boost::ptr_vector<Hoge>
など
286デフォルトの名無しさん:2006/04/07(金) 01:16:38
つまり、配列のポインタを作って一つづつnewするって事ですか
aa[i].bb(); って感じで書いちゃってるから置換せずやりたかったんですが…

ピリオドをオーバーライドした方が簡単?
287デフォルトの名無しさん:2006/04/07(金) 01:19:03
>ピリオドをオーバーライド
>ピリオドをオーバーライド
>ピリオドをオーバーライド
>ピリオドをオーバーライド
>ピリオドをオーバーライド
288デフォルトの名無しさん:2006/04/07(金) 01:22:43
自己レス…

ごめんなさい、忘れてください…orz...
コンパイルせずに一気に書くなんてアフォな真似はやめよう…
289デフォルトの名無しさん:2006/04/07(金) 20:22:50
managed C++なんですけれども、クラス配列の作り方がわかりません。

__gc class Data{
String* name;
};
main(){
Data* dat __gc[] = new Data* __gc[10]
dat[0]->name = "test";
}
だと「オブジェクト参照がインスタンスに設定されてない」と出ます。
どうすればできるのでしょうか?
290デフォルトの名無しさん:2006/04/07(金) 20:23:44
どうしても Managed C++ じゃないとだめ?
C++/CLI じゃだめ?
291デフォルトの名無しさん:2006/04/07(金) 20:27:09
>>290
当方、VC++ .NET 2003を使っておりますので・・・
managed では無理でしょうか?
292デフォルトの名無しさん:2006/04/07(金) 21:34:18
>>289
datはDataへのポインタの配列だから
各要素もnewでオブジェクトを作ってやらないといけないと思う。
たぶんこんな感じ。
Data* dat __gc[] = new Data* __gc[10]
dat[0] = new Data;
dat[0]->name = "test";
293デフォルトの名無しさん:2006/04/07(金) 23:51:09
C言語で長さ制限無しで一行入力するイディオムってありますか?
294デフォルトの名無しさん:2006/04/07(金) 23:54:07
C言語で、長さの制限無しに
標準入力から一行入力するイディオムはありますか?
295デフォルトの名無しさん:2006/04/07(金) 23:55:59
先生!イディオムってなんですか!
296デフォルトの名無しさん:2006/04/08(土) 00:28:15
慣用句
297デフォルトの名無しさん:2006/04/08(土) 02:32:59
scanf("%s", str);
制限はない。オーバーしても知ったこっちゃないが。
298デフォルトの名無しさん:2006/04/08(土) 03:02:23
スペースランナウエィ
299289:2006/04/08(土) 08:31:12
>>292
できました!
ありがとうございました。
300デフォルトの名無しさん:2006/04/08(土) 12:55:06
boost の質問はここでよろしいでしょうか?
環境は XP、2005 です。

shared_ptr に、NULL のようなものを持たせるには、どのようにするのが一般的でしょうか。
以下のようなものを作りたいです。

shared_ptr<CHoge> F()
{
 if (〜)
  return NULL;

 shared_ptr<CHoge> p(new CHoge);
 return p;
}


return NULL;

の部分を、

return shared_ptr<CHoge>( reinterpret_cast<CHoge *>NULL );

とすれば正常には動作したのですが、もっと素直な書きかたがありそうです。
よろしくお願いします。
301デフォルトの名無しさん:2006/04/08(土) 13:01:21
>>300
boost/shared_ptr.hppより
shared_ptr::shared_ptr(): px(0), pn() {}
302デフォルトの名無しさん:2006/04/08(土) 13:27:11
すみません、インラインアセンブラを書く場合
コンパイラによって描き方が違うらしいのですが
ボーランドのBCC5.5の場合どのようにすればいいのですか?

あと、コンパイラごとにインラインアセンブラを描きたいのですが
なにを
#if defined
すればいいのでしょうか?
303デフォルトの名無しさん:2006/04/08(土) 13:38:10
>>302
asmで括れ。
BCC -> __BORLANDC__
VC  ->_MSC_VER
GCC ->__GNUC__
304デフォルトの名無しさん:2006/04/08(土) 13:40:49
インラインアセンブラってことは組み込み系ですかね?
だとしたら

#if defined(_SH)
#pragma inline_asm(関数名)
#endif

とかあるでよ。
305300:2006/04/08(土) 14:54:16
>>301
ありがとうございます、解決です。ってそりゃそうだわなorz
306デフォルトの名無しさん:2006/04/08(土) 15:06:22
>>297
オーバーしないように
数万バイト確保したchar配列に読む
…くらいは思い付きましたが

それって無駄な領域食い過ぎの気がして。
多分mallocやrealloc使うんだろうなぁ
…くらいは判るんですが
どうにも良いやり方が分からなくて相談しました。

うーん、とりあえず適当にやってみるか…
307デフォルトの名無しさん:2006/04/08(土) 15:17:44
>306
数万バイト確保しても
数万バイトより大きい入力をつっこまれたら溢れる

まあ素直に

#include <stdio.h>
char buf[BUFSIZ]; /* BUFSIZで足りないようなら適宜変えるか設計を見直す */
fgets(buf, sizeof(buf), stdin);

308デフォルトの名無しさん:2006/04/08(土) 15:18:16
>>294
mallocで適当な大きさのバッファを確保して、
足りなくなるたびにk倍(普通は二倍)の大きさにreallocする、という手がある。
あるいは、固定長の文字列を要素とするリンクリストを作りながら読みこみ、
読み終わったところで全体を別の場所にコピーする、という方法もある。
309デフォルトの名無しさん:2006/04/08(土) 16:02:41
C言語とC++で、文字定数(例えば'a')のサイズをsizeofではかると、
C言語ではint型サイズに、C++ではchar型サイズになるようですが、
サイズ自体が変わったのでしょうか?
それともC言語の場合は、sizeofが適用される前に、int型へ格上げ
されてるというような(あるかないかわかりませんが)、仕様の違いでしょうか?
310デフォルトの名無しさん:2006/04/08(土) 16:06:58
>>309
文字定数の型が変わった。
Cではint
C++ではchar
311デフォルトの名無しさん:2006/04/08(土) 16:13:11
そもそもなんでchar が文字定数の方じゃなかったんだろうなぁ。
312デフォルトの名無しさん:2006/04/08(土) 17:35:42
Cにsigned/unsigne char, signed/unsigned shortの右辺値は存在しないから文字定数の型はintになった。
C++では多重定義するとき、文字定数がcharでないと不便だから、上記の型の右辺値も存在することになった。

D&Eには、文字定数がintではcout << 'a';というコードが
画面にaの文字コードを出力することになってしまうので文字定数をchar型にした、という話が載っている。
313デフォルトの名無しさん:2006/04/08(土) 17:46:55
ではC++では、charからintへの格上げってされないの?
314デフォルトの名無しさん:2006/04/08(土) 17:51:00
>>313
されるよ。格上げ以前の値を使うこともできるだけ。
315デフォルトの名無しさん:2006/04/08(土) 17:53:55
>>307-308
う〜ん…色々試してみます。ありがとうございます。
316デフォルトの名無しさん:2006/04/09(日) 11:31:54
質問です。XP、.NET です。

basic_string<wchar_t> で与えられたファイル名のファイルをオープンしようと思います。
ファイルの操作に、boost::filesystem を利用しようとしたのですが、
boost::filesystem::path が Unicode に対応していないっぽいです。
wchar_t -> char に変換する方法を調べたのですが(std::locale、mbtowc など)、色々と複雑っぽいです。

どのようにするのが一般的でしょう?
よろしくお願いします。
317デフォルトの名無しさん:2006/04/09(日) 11:55:39
ttp://msdn2.microsoft.com/ja-JP/library/ms235631.aspx
ググってすぐに見つかるここに書いてあるじゃねーか
318316:2006/04/09(日) 12:12:26
>>317
あれ・・・検索ワードが悪かったようです。ありがとうございました。
319デフォルトの名無しさん:2006/04/09(日) 23:07:46
template <???? T>
の????は、classとtypenameと、どっちが主流なんですか?
タイピングの楽さはclassだけど、意味的にはtypenameのような
感じですが・・・。
320デフォルトの名無しさん:2006/04/09(日) 23:18:16
禿も好きにしろ、どっちでもいいってんだから好きなほう使え。
321デフォルトの名無しさん:2006/04/09(日) 23:36:32
だから禿てないって
322デフォルトの名無しさん:2006/04/09(日) 23:38:16
えっ?
禿げてるよ?
323デフォルトの名無しさん:2006/04/10(月) 01:42:23
簡単なDLLの読み込みするものを作って実行したら、
下の、MessageBox(hDlg,DLL_buf,"Success!", MB_ICONWARNING);の部分と、終了時に
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. 
This is usually a result of calling a function declared with one calling convention
 with a function pointer declared with a different calling convention.
とエラーが出ます。

強行するとちゃんと動作するんですけど…いまいちどこら辺がマズいのかがわからないです。

DLL部分
LPTSTR WINAPI ReturnString(int i, LPTSTR str){
 _stprintf(str, "%d", i);
 lstrcmp(str, "が入力されました。");
 return str;
}

読み込み側
typedef LPTSTR (*TFUNC)(int, LPTSTR);
〜中略
 HINSTANCE hDLL;
 TFUNC fncDLL01;
 TCHAR DLL_buf[128];
 if( !(hDLL = LoadLibrary("CE60_def.dll")) ){
  MessageBox(hDlg,"ERROR!\nDLLが見つからない。","エラー", MB_ICONWARNING);
 }else if( !(fncDLL01 = (TFUNC)GetProcAddress(hDLL, "ReturnString")) ){
  FreeLibrary(hDLL);
  MessageBox(hDlg,"ERROR!\n関数が見つからない。","エラー", MB_ICONWARNING);
 }else{
  fncDLL01(10,DLL_buf);
  MessageBox(hDlg,DLL_buf,"Success!", MB_ICONWARNING);
  FreeLibrary(hDLL);
以下略
324323:2006/04/10(月) 01:53:13
一応環境はWin32ですけど、

コンソールアプリケーションで同じ事やっても同じエラーが出ます。
325デフォルトの名無しさん:2006/04/10(月) 02:04:57
>>323
TFUNCを確認すること。
typeid(TFUNC).name()を試してみればいい。

正しい型は次のようになるはず

//マルチバイト
char * (__stdcall*)(int,char *)

//UnicodeVC7.1の場合
unsigned short * (__stdcall*)(int,unsigned short *)

エラーメッセージから察するに、__cedcl規約で呼び出していそうだが。



//試してみて気づいたんだが、VC7.1では、typeid(wchar_t).nameが、unsigned shortになるんだな。
326デフォルトの名無しさん:2006/04/10(月) 02:17:37
>>323
後そのコード、何のためにLPTSTRを使っているのか、さっぱりわからない。
MessageBoxの第三引数に、確実にマルチバイトを渡してしまっているから。
327325-326:2006/04/10(月) 02:25:33
ごめん。
/Zc::wchar_tを指定してなかったOrz
328デフォルトの名無しさん:2006/04/10(月) 03:00:38
>>325
なるほど…
確かに、WINAPI修飾子だと__stdcallの設定なのに、
TFUNCが__cedclになってます。


typedef LPTSTR (*TFUNC)(int, LPTSTR); 
をどのように変更すれば、_stdcallにできるのですか?


LPTSTRを使っているのは特に何も考えていないです…
最初は普通にchar *使っていたんですが、
読んでいた本と助言でLPTSTRを使えといわれて、こちらを使っているだけです。
一応Unicodeになったときのことも考えておけとのことで(あんまりよくわかってないんですけれども)。
329328:2006/04/10(月) 03:03:35
typedef LPTSTR (WINAPI *TFUNC)(int, LPTSTR);  
こんな感じで大丈夫ですか?
330325:2006/04/10(月) 03:14:10
>>328
もしその本が、マルチバイト文字とワイド文字を考慮しろといいながら、
文字列を_TEXT()とか_T()マクロなど包んでいないなら、読む価値はない。

関数ポインタのtypedefはそれでいい。

あと、関数ポインタの宣言がややこしかったら、こんな方法もあるにはある。

typedef LPTSTR WINAPI FuncType(int, LPTSTR) ;
typedef FuncType *FuncPtr ;
331デフォルトの名無しさん:2006/04/10(月) 21:16:01
>>330
元の文字がそれぞれの文字コードに対応させてなければ意味がないんですね…
全然そんなこと考えてませんでしたil|i

typedefがどうなっているのか分かっていなかったので、助かりました。

ご教授して頂き、どうもありがとうございました。
332デフォルトの名無しさん:2006/04/10(月) 22:00:20
//ProcessManager.h
#ifndef _PROCESSMANAGER_H_
#define _PROCESSMANAGER_H_

#include <windows.h>
#include <tlhelp32.h>
#include <list>

class CProcessManager
{
private:
 list<PROCESSENTRY32> m_List;
public:
 HRESULT Update();
};

#endif

list<PROCESSENTRY32> m_List;の行で「error C2143: 構文エラー : ';' が '<' の前にありません。」が出る。
PROCESSENTRY32構造体をintに変更してやってみてもエラー。クラス内でlistは使えないの?
333デフォルトの名無しさん:2006/04/10(月) 22:02:53
恐ろしいことに気づいた。
using namespace std;してない。
334デフォルトの名無しさん:2006/04/10(月) 22:41:11
main()
{
char *str ="abc";
printf("%s\n",str);
}

これってどこか問題有りですか?
335デフォルトの名無しさん:2006/04/10(月) 22:44:10
>>334
あまり誉められた書き方とは言えないが、
それをコンパイルして作られたプログラムは問題なく実行できる。
336デフォルトの名無しさん:2006/04/10(月) 22:44:44
>>334
問題ない。
337デフォルトの名無しさん:2006/04/10(月) 23:01:57
>>335
>>336
ありがとう。

main()
{
char *str;
str = "abc":
printf("%s\n",str);
}

これだと危険になるんですか?
338デフォルトの名無しさん:2006/04/10(月) 23:04:18
>>337
ほぼ確実に落ちる
339デフォルトの名無しさん:2006/04/10(月) 23:06:23
は?
340デフォルトの名無しさん:2006/04/10(月) 23:14:34
>>337
それも>>335
341338:2006/04/10(月) 23:47:49
ごめん。ほんと。俺が悪かった。ごめん。
342デフォルトの名無しさん:2006/04/10(月) 23:50:10
>>337
危険じゃないが、
main()
{
char str[4];
str = "abc":
printf("%s\n",str);
}
とか
main()
{
char str[] = "abc":
printf("%s\n",str);
}
の方がいいんじゃないかなぁ。
343デフォルトの名無しさん:2006/04/10(月) 23:55:29
>>342
落ち着け特に前半。
344デフォルトの名無しさん:2006/04/10(月) 23:56:45
>>342
main()
{
char str[4];
str = "abc":
printf("%s\n",str);
}
345デフォルトの名無しさん:2006/04/10(月) 23:58:20
>>342>>344
セミコロンがコロンになっているのをスルーしているのはわざとなのか?
346デフォルトの名無しさん:2006/04/11(火) 00:24:35
つーかconst使えよ
347デフォルトの名無しさん:2006/04/11(火) 00:28:59
int main()
{
const char *str = "abc";
printf("%s\n",str);
return 0;
}
348デフォルトの名無しさん:2006/04/11(火) 00:45:29
つーかstatic使えよ
349デフォルトの名無しさん:2006/04/11(火) 00:47:16
int main()
{
puts("abc");
return 0;
}
350デフォルトの名無しさん:2006/04/11(火) 01:13:27
>>333
ヘッダで using namespace するやつは腹を切って死ぬべきである。
351337:2006/04/11(火) 07:14:03
参考になりました。
ありがとうございました。
352デフォルトの名無しさん:2006/04/11(火) 10:32:56
>>344はstrcpyを使うべきですか?
353デフォルトの名無しさん:2006/04/11(火) 11:10:31
char str[] = "abc";

char str[4];
strcpy(str, "abc");

どっちでも、同じといっちゃ同じだが前者のほうがはるかに良い
354デフォルトの名無しさん:2006/04/11(火) 11:17:46
>>352
うん。
まああの例だと、わざわざコピーする意味もないけど。
355デフォルトの名無しさん:2006/04/11(火) 13:52:47
ヘッダで using namespaceしないやつは時代遅れ
356デフォルトの名無しさん:2006/04/11(火) 14:01:51
なんだ、基地外か
357デフォルトの名無しさん:2006/04/11(火) 14:04:06
>>355
本物の基地外は決して自分を基地外とは思わないって知ってるか?
358デフォルトの名無しさん:2006/04/11(火) 14:10:02
まぁ using namespace もいいとおもうけど、
ピンポイントで using mynamespace::myclass;
みたに爆撃するのもいいと思うよ。
359デフォルトの名無しさん:2006/04/11(火) 14:17:03
namespace kitigai
{
>>355
}
360デフォルトの名無しさん:2006/04/11(火) 15:30:03
using namespace kitigai;
361デフォルトの名無しさん:2006/04/11(火) 15:35:59
namespace
{
 namespace kitigai
 {
  >>355;
 }
}
362デフォルトの名無しさん:2006/04/11(火) 17:38:59
ヘッダで using namespace なんてするなよw
363デフォルトの名無しさん:2006/04/11(火) 18:09:54
漢ならC++標準のヘッダを書き換えろ
364デフォルトの名無しさん:2006/04/11(火) 18:18:29
なんか sin とかってグローバルな名前空間で
宣言されている気がするのは俺だけ?
365デフォルトの名無しさん:2006/04/11(火) 18:42:30
math.hのsin関数か?
366デフォルトの名無しさん:2006/04/11(火) 18:47:20
Visual C++なんかの<c〜>は規格での規定とは逆に、
<〜.h>をインクルードして、std名前空間の中で、using ::hoge;のようなことをしている。
367デフォルトの名無しさん:2006/04/11(火) 19:06:00
#include <cmath> ってしてるのに
グローバルな sin() 関数が見えるのは規格違反?
>>366 みたいに using ::hoge; なんてやると、
グローバルにも hoge は見えてるんだよね・・・
368デフォルトの名無しさん:2006/04/11(火) 23:19:29
C、Winのユーザー関数の引数の順番を
決めるいい方法は無いですかね。
もちろん、どんな順番でも可変個引数以外なら
問題ないんですけど、関数名と同じく迷ってしまいます。
何か、法則みたいなのがあるといいんですが。
369デフォルトの名無しさん:2006/04/11(火) 23:27:20
>>368 「Winのユーザー関数」って?
370デフォルトの名無しさん:2006/04/11(火) 23:28:35
>>368
Winって言うから、__fastcall使うとして。
そうすると、レジスタ渡ししたいモノを先頭(だったかな)にまとめるといいかもな。
371368:2006/04/11(火) 23:30:19
そんな難しい意味じゃないです。
ただ、環境がWindowsって意味です。
372デフォルトの名無しさん:2006/04/11(火) 23:39:21
>>368
俺はとりあえず次の2つを守っている。
入力の引数同士、出力の引数同士は混ぜない。
ハンドルなどのように、クラスだったら(呼んだ関数の先で)thisに相当するような引数は第1引数に持ってくる。
373デフォルトの名無しさん:2006/04/11(火) 23:44:50
俺は自分で作った関数でも間違えて引数を渡してしまったりする。
たとえば学生番号と年齢を与えるようなときに、
どちらも整数だから void func(const int age, const int number);
なんてプロトタイプ宣言していると間違えても気づかないことが多い。

なので、 BOOST_STRONG_TYPEDEF (とそれを自分で改造したマクロ)で
紛らわしいものは型付けしてミスを防ぐようにしてる。
374デフォルトの名無しさん:2006/04/11(火) 23:51:46
>>367
Cのヘッダを非推奨にしたのはやりすぎだったと標準化委員会も反省しているようだ。
375368:2006/04/11(火) 23:53:38
ありがとうございます。

ある程度、ライブラリ関数に似た用途のがあると
それに似せる事が出来て楽なんですけど。
例えば、ビットマップを透過して表示するユーザー関数なら、
BitBltをベースにして、その先画像、元画像の後に
マスク画像を同じような感じに続けています。

その教えていただいた方法も、ライブラリ関数の形に
何となく合致している部分がありますね。
一つ目にHDCとかが来ることが多いですし、
入力、出力ではないけど、先画像、元画像とまとまっていますし、
それによって、引数の型の並びの所々違う型が入る事で、
引数の識別するアクセントになりますし。
376デフォルトの名無しさん:2006/04/11(火) 23:54:38
>>368
buf1にbuf2をxサイズ分コピー   memcpy(buf1, buf2, size)
処理の内容を言葉に置き換えればいい
377368:2006/04/12(水) 00:09:24
>>376
ありがとうございます。
引数が少ない場合はシンプルでいいと思うんですけど。
ただ、多い場合でも、迷った場合は、そのシンプルベースで
始めに決めてしまったやり方で行くのも手かもしれません。
378355:2006/04/12(水) 02:14:19
>>356 - >>362
釣れた釣れた
やってみるもんだな
ヘッダで using namespaceするわけないじゃん
ば〜〜〜〜〜〜〜か
379デフォルトの名無しさん:2006/04/12(水) 02:22:11
>>378
え? やっちゃだめなのか? 何で?
380デフォルトの名無しさん:2006/04/12(水) 02:23:09
>>379 namespace が何のために使われるのか知っていればほとんど自明。
381デフォルトの名無しさん:2006/04/12(水) 02:24:10
まぁヘッダの中で、あるネームスペースの中で
別のネームスペースを using するんなら有りだろうけどなぁ。

namespace NS1 {
   using namespace OtherNS;

}

みたいにさ。
382デフォルトの名無しさん:2006/04/12(水) 02:50:03
ヘッダでusing namespaceするのは良くないと思うが、
やったからといって名前空間の利点がなくなる訳じゃないだろ。
383デフォルトの名無しさん:2006/04/12(水) 03:08:36
namespace は閉じていない。あとでいくらでも宣言を追加できる。
そのため、将来の変更やヘッダの組み合わせによっては曖昧な名前を生み出す可能性が有る。
それでも、 using namespace が原因だとわかったら削除すればいいんだが、
ヘッダでやられると問題が発生したときにユーザー側で回避する手段が無い。

しかも using namespace が本当に必要に迫られることは決して無い。
フルで修辞すればいいんだから。

確実な回避策があるのに、深刻な問題を起こす可能性をヘッダに埋める道理は無い。
384315:2006/04/12(水) 04:37:56
>>308
制限なし一行入力の質問をした者です。
バッファを2倍にしていく…を自分なりに考えたのですが
こんな感じで良いのでしょうか?

char *str;
char *tmp;
int strsize;
int tmpsize;
strsize = 1;
str = (char *)malloc(strsize); if(str==NULL) exit(1);
str[0] = '\0';
tmpsize = 8;
tmp = (char *)malloc(tmpsize); if(tmp==NULL) { free(str); exit(1); }
for(;;) {
 char ch;
 tmpsize = tmpsize * 2;
 tmp = (char *)realloc(tmp, tmpsize); if(tmp==NULL) { free(tmp); free(str); exit(1); }
 fgets(tmp, tmpsize, stdin); if(tmp==NULL) { free(tmp); free(str); exit(2); }
 strsize = strlen(str) + tmpsize;
 str = (char *)realloc(str, strsize); if(str==NULL) { free(tmp); free(str); exit(1); }
 strcat(str, tmp);
 ch = str[strlen(str)-1];
 if(ch=='\0' || ch=='\n') break;
}
free(tmp);
printf("%s\n", str);
free(str);
385デフォルトの名無しさん:2006/04/12(水) 07:47:49
冗長すぎ。これで十分
int strsize = 1,strpos=0;
char *str = NULL;
do{
    char *tmp = (char *)realloc(str, strsize *= 2);
    if(tmp==NULL) { free(str); exit(1); }
    str = tmp;
    if(fgets(str+strpos, strsize-strpos, stdin) == NULL)break;
    strpos += strlen(str+strpos);
}while(str[strpos-1] != '\n');
puts(str);
free(str);
386デフォルトの名無しさん:2006/04/12(水) 19:32:13
C99でint32_tなどのサイズ固定の整数が定義されましたが、
floatについてはこのようなものはないのでしょうか?
387デフォルトの名無しさん:2006/04/12(水) 20:09:08
クラスBはクラスAを継承していて、Aの仮想関数func()をオーバーライドします。
このとき、Bのfunc()の中でAのfunc()(オーバーライドされてないもの)を
呼び出したいのですが、どう書けばいいですか?
388デフォルトの名無しさん:2006/04/12(水) 20:12:25
A::func()
389デフォルトの名無しさん:2006/04/12(水) 20:27:19
>>388
うまくいきました。ありがとう。
390384:2006/04/12(水) 21:32:50
>>385
fgetsの第一引数に加算すると
文字列の途中から追加出来るのですね。
びっくりしました。感謝です。

という事は、*tmp使わなくても実装出来てしまう?
と思ったので、色々試してみます。
391デフォルトの名無しさん:2006/04/13(木) 07:41:14
異なるファイルに記述したテンプレートクラスの呼び出し方がわかりません。
以下のようなコードだとリンクエラーがでます。
全部同じファイルに記述するとコンパイル通るんだけど、なんででしょ?
コンパイラはVC++6.0です。以下ソース

// main.cpp ==============================//
#include "foo.h"
int main( void ){
foo<int> obj;
return 0;
}

// foo.cpp ===============================//
#include"foo.h"
template <class Type> foo<Type>::foo(){;}

// foo.h =================================//
template <class Type> class foo{
public:
foo<Type>();
};
392デフォルトの名無しさん:2006/04/13(木) 07:52:25
>>391 テンプレートの定義はほとんどヘッダでやる必要がある。超 FAQ だから適当に探せ。
393デフォルトの名無しさん:2006/04/13(木) 07:54:33
394デフォルトの名無しさん:2006/04/13(木) 08:02:05
foo.cpp のテンプレートの定義は、単なる定義で、
テンプレートインスタンス=コードが生成されていないから。
main.cpp は int で特殊化された foo のインスタンスがリンクされることを期待している。
395デフォルトの名無しさん:2006/04/13(木) 09:27:56
export使えるコンパイラってある?
396デフォルトの名無しさん:2006/04/13(木) 09:32:50
397デフォルトの名無しさん:2006/04/13(木) 09:34:36
>>391
まあ、翻訳単位が違っても、コンパイルできるようにするキーワードは、規格にはあるんだが。
実際、サポートしているコンパイラは少ない。

特にVC6でテンプレートなんてお察し

明示的にインスタンス化するという方法はある。

//=============foo.cpp==============
template class foo<int> ;
template class foo<short> ;
//以下、インスタンス化するすべての型について、明示的にインスタンス化していく。

実際、コピペの必要ない、文法上安全なマクロという気しかしないが。
インスタンス化できる型を制限したいときとかもいいのかな。
398デフォルトの名無しさん:2006/04/13(木) 10:04:45
>まあ、翻訳単位が違っても、コンパイルできるようにする
>キーワードは、規格にはあるんだが。

あれ、そんなのあったんですか。
399デフォルトの名無しさん:2006/04/13(木) 10:11:17
export
400デフォルトの名無しさん:2006/04/13(木) 10:25:41
ああ、 >>395 ってその話だったのか・・・
extern って空目してて、
「なに extern とかほざいてんだこいつwww」
とか思ってた、スマソ
401デフォルトの名無しさん:2006/04/13(木) 12:03:26
質問があります。

SYSTEMTIME構造体の startTime という変数があり、
そこには何かの処理の開始日時がセットされています。
DWORD型の lateSecという変数があって、
そこには処理にかかる予想時間が秒を単位としてセットされています。
その場合の処理の終了日時を求めたいのですが、
どのようなやりかたがスマートでしょうか?

lateSecを日、時、分、秒の各単位にしてstartTimeの各メンバ変数に足すだけでは、
秒や分の部分が59を超えたり、時の部分が23を超えたりしてしまいます。
日の部分も、その月ではありえない日になってしまうかもしれません。
この問題を考えていたら、解決方法が全然見えなくなってしまいました。

簡単に言えば
void func(
OUT LPSYSTEMTIME lpEndDateTime, /* 終了予想日時 */
IN LPSYSTEMTIME lpStartDateTime, /* 開始日時 */
IN DWORD dwLateTime /* 処理予測時間[sec] */
);
のような関数をつくりたいということになります。

よろしくおながいします
402デフォルトの名無しさん:2006/04/13(木) 12:17:06
1.SystemTimeToFileTimeでFILETIMEに変換
2.FILETIMEに対して演算
3.FileTimeToSystemTimeでSYSTEMTIMEに戻す
403デフォルトの名無しさん:2006/04/13(木) 12:31:16
エラー処理を無視するとこんな感じ?

void func(
OUT LPSYSTEMTIME lpEndDateTime, /* 終了予想日時 */
IN LPSYSTEMTIME lpStartDateTime, /* 開始日時 */
IN DWORD dwLateTime /* 処理予測時間[sec] */
)
{
 FILETIME ft;
 SystemTimeToFileTime(lpStartDateTime, &ft);

 unsigned __int64 et = (((unsigned __int64)ft.dwHighDateTime) << 32) + ft.dwLowDateTime;
 et += (unsigned __int64)dwLateTime * 10 * 1000 * 1000;

 ft.dwHighDateTime = (DWORD)(et >> 32);
 ft.dwLowDateTime = (DWORD)(et & 0xFFFFFFFF);

 FileTimeToSystemTime(&ft, lpEndDateTime);
}
404391:2006/04/13(木) 12:57:24
>>392-397
多謝。
405デフォルトの名無しさん:2006/04/13(木) 14:55:50
>>401
標準だとmktime()とlocaltime()じゃないかな。
値の範囲が正しくない場合 mktime() は正規化するって
規格で読んだ気がする。
406デフォルトの名無しさん:2006/04/13(木) 15:45:43
>>402-403
どうもありがとうございました。
これの動作確認ができました。
閏年の2/28や2/29に関しても、日をまたぐようにしてテストをして
みましたが問題ありませんでした。
どうもありがとうございました。
407デフォルトの名無しさん:2006/04/13(木) 19:01:18
>403
__int64 ft=0;
SystemTimeToFileTime( (FILETIME*)&ft);
ft += dwLateTime * __int64(10*1000*1000);
(略)
でいいきもする。
408デフォルトの名無しさん:2006/04/13(木) 19:23:55
> __int64(10*1000*1000)
10ll * 1000 * 1000でいいと思う。
10llがだめなら10i64で。
409デフォルトの名無しさん:2006/04/13(木) 20:21:13
ヘタに凝ったことをするよりは、>>403>>407の書き方が無難で分かりやすいと思うけどな。
410デフォルトの名無しさん:2006/04/13(木) 20:23:10
ポータビリティを考えると、__int64はint64_tとかでtypedefできるけど、
サフィックスのllとかi64はtypedefで解決できないからだめ。
411デフォルトの名無しさん:2006/04/13(木) 22:33:24
ならキャストを使えばよい。
412デフォルトの名無しさん:2006/04/13(木) 23:47:59
403->407->408->410の流れ
413デフォルトの名無しさん:2006/04/14(金) 02:37:46
エディタの検索機能に正規表現の機能を付けようと考えています。
後ろから(下から上)検索させる所で躓きました。良い方法があれば教えてください。

現在、考えている方法としては・・・
1) .NET frameworkのRegexクラスにRightToLeftのオプションを付けて使用(ラッパーとなるDLLを作成?)
2) Boost.Regexや、IRegExp(VBScript)を用いて・・・
  i) ヒットするまで後ろから前へ開始位置をずらしていく
  ii) 文字列,パターンを反転させる
3) 諦めて前から後ろのみの検索とする

1の方法が最有力候補なのですが、.NET frameworkを使うことで
動作環境が狭まるなどの問題点がありまして・・・。
414デフォルトの名無しさん:2006/04/14(金) 02:42:51
まず全文に対してマッチを行い、ヒットしたものを列挙。
その結果に対し、現在地点の直前に当たるものを結果とする。
415デフォルトの名無しさん:2006/04/14(金) 03:13:45
OPENFILEダイアログを使うと何故か仮想画面からの
コピーが機能しなくなるんだが原因がわかる人いる?
416デフォルトの名無しさん:2006/04/14(金) 03:23:16
仮想画面ってなんのだ?
というか、もっと環境とか詳しく書かないと返答もらえにくいんじゃね?
417デフォルトの名無しさん:2006/04/14(金) 03:30:35
いじめないで! ぼく わるいC++じゃないよ!
418デフォルトの名無しさん:2006/04/14(金) 03:32:02
スーファミのDQは65816のアセンブラで書かれていたって本当か?
PS/PS2版はさすがにgccらしいけど。
419デフォルトの名無しさん:2006/04/14(金) 03:35:28
どこの誤爆だ?
420デフォルトの名無しさん:2006/04/14(金) 07:27:39
>>414
回答ありがとうございます。
検討してみます。
421デフォルトの名無しさん:2006/04/14(金) 08:58:17
>>414
全文はまずいのでは?
現在位置までのデータで列挙しないと。
422デフォルトの名無しさん:2006/04/14(金) 11:54:03
>>411
*(__int64 *)&ft += (__int64)dwLateTime * 10 * 1000 * 1000;

こうですか?わかりません><
423デフォルトの名無しさん:2006/04/14(金) 14:38:28
>>420
え? 414でいいのか?
414みたいなやり方じゃ遅くなるから413の質問になるんじゃないのか?
424デフォルトの名無しさん:2006/04/14(金) 19:48:28
質問です。
WinMainで、ウィンドウの作成後にSetHWnd(HWND hWnd){s_hWnd = hWnd;};
を使ってウィンドウハンドルを獲得し、別のヘッダで宣言した
int MakeMessageWindow(LPCTSTR MessageText, LPCTSTR WindowText, UINT MessageForm)
{return(MessageBox(s_hWnd, MessageText, WindowText, MessageForm));};
でメッセージボックスを作るプログラムなのですが、
WinMain(WinMain.cpp)以外のヘッダ(B.h)で宣言した関数の中で
MakeMessageWindow()を呼び出すと、MessageBoxの引数hWndがNULLになってしまいます
値渡しなのでhWndは変わらないと思っていたのですが、
この場合なぜhWndがNULLになってしまうのでしょうか?
425デフォルトの名無しさん:2006/04/14(金) 20:25:14
>>424
s_hWndは何かのクラスメンバなの?
426デフォルトの名無しさん:2006/04/14(金) 21:00:34
>>425
MakeMessageWindowを宣言しているヘッダ(C.h)のクラスのprivateメンバです
427デフォルトの名無しさん:2006/04/14(金) 21:09:14
MakeMessageWindowはそのクラスのメンバ関数なの?
428デフォルトの名無しさん:2006/04/14(金) 21:09:58
つーか、何がどのクラスのメンバなのかさっぱりわからん。
429デフォルトの名無しさん:2006/04/14(金) 21:20:48
>>427-428
C.hにs_hWnd、MakeMessageWindow()、SetHWnd()が有ります
s_hWndはSetHWnd()を使って、WinMainのウィンドウ作成後にHWNDを値渡ししています
WinMain.cppとB.hからMakeMessageWindow()を呼び出そうとすると、
WinMain.cppから呼び出した場合はs_hWndに作成したウィンドウのHWNDが
入っていますが、B.hから呼び出した場合だとs_hWndにNULLが入ってしまいます
430デフォルトの名無しさん:2006/04/14(金) 21:26:25
ソース
431デフォルトの名無しさん:2006/04/14(金) 21:27:23
醤油
432デフォルトの名無しさん:2006/04/14(金) 21:30:58
マヨネーズ
433デフォルトの名無しさん:2006/04/14(金) 21:35:40
>>429
s_hWnd, MakeMessageWindow(), SetHWnd()
は同じクラスに属しているの?
434デフォルトの名無しさん:2006/04/14(金) 21:39:56
>>433
同じクラスです
s_hWndはprivate、二つの関数の方はpublicで宣言しています
435デフォルトの名無しさん:2006/04/14(金) 21:40:57
WinMain.cppとB.hでは同じインスタンスに対して操作してるのか?
436デフォルトの名無しさん:2006/04/14(金) 21:51:06
>>435
s_hWndは値渡しですので変わらないと思います
その他の3つはそれぞれ、メッセージボックスに表示する文章、ウィンドウに表示される文章
作るメッセージボックスの形式(それぞれ、OKのみ、はい/いいえ)が変化しています
437デフォルトの名無しさん:2006/04/14(金) 21:57:33
いやそういう意味じゃなくて。

class A
{
public:
void Set(int i) { value = i; }
private:
int value;
};

A a1, a2;

a1.Set(10);
a2.Set(30);

とした場合、a1.value は10のままなのは理解できてる?
438デフォルトの名無しさん:2006/04/14(金) 22:07:08
>>437
すいません、今知りました
この場合私の言っていたs_hWndはWinMain.cppに対してだけの物で、B.hで使用するにはB.h、
もしくはB.cppの中でSetHWndをする必要があるという事でよろしいでしょうか?
439デフォルトの名無しさん:2006/04/14(金) 22:13:28
さぁ、ケースバイケースじゃね?
WinMain.cppとB.hで同じインスタンスに対して操作したいなら
グローバル変数にするとか。
440デフォルトの名無しさん:2006/04/14(金) 22:14:05
s_が付いてたからstaticだと思ってた俺。
441デフォルトの名無しさん:2006/04/14(金) 22:26:52
>>439
グローバル変数だと大丈夫でしたか
皆様ありがとう御座いました。やってみます
442デフォルトの名無しさん:2006/04/14(金) 22:34:38
>>423
そうなんですよね。それで前述の通り、今、検討している内容の中で
.NET frameworkを用いるのが、動作としては一番好ましいのですが。
現在設定してある動作環境(Win98〜 or Win95 + IE4〜)に当てはまる
人の中で動作しない人が出るのは・・・という状況です。
443デフォルトの名無しさん:2006/04/14(金) 22:41:33
>>441
その前にC/C++の基礎からやり直した方がいいと思うぞ。
444デフォルトの名無しさん:2006/04/15(土) 13:32:17
C++の標準例外クラスにout_of_rangeとrange_errorがありますが、
これの違いがいまいちわからんのですが、runtime_errorとlogic_errorの
違いってだけなんでしょうか。
445デフォルトの名無しさん:2006/04/15(土) 13:50:16
>>444 じつはそのへん、良く悩むんですよ、俺も。
C では assert していたところで代わりに例外使おうと思うんですが、
意味からすると assert の代わりは logic_error かその派生クラスを
投げるべきですよね。だけど果たしてこの例外が
runtime_error にふさわしいのか logic_error にふさわしいのか、
結構悩むケースもあります。

http://www.geocities.jp/ky_webid/cpp/library/027.html
http://www.02.246.ne.jp/~torutk/cxx/exception/stdexceptions.html
http://cppemb.blog17.fc2.com/blog-entry-6.html


関連スレ?(DAT落ち)
http://pc5.2ch.net/test/read.cgi/tech/1051690231/
446デフォルトの名無しさん:2006/04/15(土) 16:06:29
ファイル出力する名前に変数iの数字を入れたいのですがどうすればいいのでしょうか?

for( int i; i < 10; i++){
 ofstream fout("sample" (ここに変数iの数字を入れたい) ".txt");
 fout << "hoge\n";
 fout.close();
}
 
447デフォルトの名無しさん:2006/04/15(土) 16:22:26
stringstreamとかsprintfを使ってファイル名を成形
448デフォルトの名無しさん:2006/04/15(土) 16:24:32
>>446
boost::lexical_cast <string> (i)
449446:2006/04/15(土) 16:59:25
>>447-448
ありがとう〜
やっぱりVBとかperlとかのように繋げられないのか〜
450デフォルトの名無しさん:2006/04/15(土) 17:44:53
("sample" + i + ".txt")
451444:2006/04/15(土) 19:15:00
>>445
レスどうもです。
やっぱり微妙ですか。
自分で好きなほう使えばいいってレベルですよね。
クラス名が違うだけって話で。
452デフォルトの名無しさん:2006/04/15(土) 19:58:30
環境依存の質問をしてもいいでしょうか?
今度HP-UXで動くソケット通信のプログラムを作ることになったのですが、
ソケット通信に使うライブラリとかってBSDと同じなのでしょうか?

環境によってライブラリの内部は違ってもインクルートするヘッダーとか
リンクするライブラリ名は同じで、プログラムの実装方法は一緒と考えてもいいでしょうか?
453デフォルトの名無しさん:2006/04/15(土) 20:32:56
独習C++の次は何読んだらいいんだ?
Cマガジンが出してる奴か?
あれ結構まともな感じしたんだが。
454デフォルトの名無しさん:2006/04/15(土) 20:53:05
>>453
好きなもん嫁
455デフォルトの名無しさん:2006/04/15(土) 21:02:00
>>452
こんな奴が実装したプログラムなんて使いたくないな
456デフォルトの名無しさん:2006/04/15(土) 21:11:21
Cを勉強しようと思ってる人には何て本が分かりやすくてお薦め?
457デフォルトの名無しさん:2006/04/15(土) 21:15:55
>>456
図書スレ池
458デフォルトの名無しさん:2006/04/15(土) 21:45:54
MSペイントに塗りつぶし機能がありますが、
あれはどういうアルゴリズムで実装しているのでしょうか。

自分のやり方は、データの全マスを何回か調べて、
広げられる位置をチェックしていくやり方ですが、すごく遅いです。

環境は、C言語、BCC、9x系です。
459デフォルトの名無しさん:2006/04/15(土) 21:52:29
>>455
わからないならグダグダいわないで、わかりません、だろ?
460デフォルトの名無しさん:2006/04/15(土) 21:56:43
>>458
画像処理 その6
http://pc8.2ch.net/test/read.cgi/tech/1140510670/

こういうスレもあるが、その程度ならここでもいいか

ペイントがどうやってるかしらないけど、とりあえず全体を調べる必要はないね
画像処理だかはさっぱり知らないけど、俺が考えたやり方だと
クリックしたマスと、その上下左右のマスが同じ色かどうかを調べる
同じ色だったら、そのマスに対して上下左右のマスが同じかどうかを調べる
ってのを再帰的に繰り返して同じ色のマスだけ塗りつぶす
もちろん、一度調べたマスにはなんらかのフラグを立ててもう一度調べることが無いようにする
461デフォルトの名無しさん:2006/04/15(土) 22:06:45
string型にlong型の数字を入れられるのでしょうか?
462デフォルトの名無しさん:2006/04/15(土) 22:13:48
>>461 そりゃ、文字列化したら入れられる。たとえば
int i=199;
std::ostringstream os;
os << i;
std::string s = os.str();
463デフォルトの名無しさん:2006/04/15(土) 22:20:13
464458:2006/04/15(土) 22:36:58
>>460
ありがとうございます。
その方法を試してみます。
465デフォルトの名無しさん:2006/04/15(土) 23:01:03
>>458
API呼んでるだけじゃね?
466デフォルトの名無しさん:2006/04/15(土) 23:07:22
全くの初心者です。
少し前(一年くらい?)に買ったC++入門書を引っ張りだしてきました。
この本だと
#include <iostream.h>
と書かれているんですが、ネットの初心者向けサイトを見ると
#include <iostream>
using namespace std;
となってます。
これは本が古いからでしょうか?
それとも色んなやり方があってどっちでも良いんでしょうか?
467デフォルトの名無しさん:2006/04/15(土) 23:13:26
本が古いから。
468466:2006/04/15(土) 23:29:22
そうでしたか。
そんじゃ明日本屋に行ってみます。どうもです。
469デフォルトの名無しさん:2006/04/15(土) 23:59:02
>>458
「閉領域 フィル アルゴリズム」あたりでググってみろ。
470458:2006/04/16(日) 02:12:37
自分のやり方は、まだチェックしていないマスの回りのマスを調べて、
ひとつでもチェックしたマスがあるならそのマスをチェックするやり方でした。

調べる位置の順番は、クリックした位置を中心ではなく、
普通にxとyの2次元フォーで調べていきます。
始めは左上から右下、次は右下から左上に進めていきます。
図形が複雑な場合は、左上から、右下からを何回か行います。

その回りの位置を調べる関数へのオーバーヘッドが遅いのか、
左上から、右下からが1回ずつの場合でもかなり遅いです。

>>465
なるほど。APIを探してみます。

>>469
そのキーワードで良さそうな所を見つけられました。
「C言語 for アルゴリズム 塗りつぶし」
とかで見ていたんですけど、書籍ばっか出てきてダメでした。
471458:2006/04/16(日) 02:26:44
新たに編み出した方法も書きます。

同じように全マスを順番にチェックするタイプです。
今度はカウンタが進む方向が4パターンあり、
左上から、左上から(x, yを逆にカウンタを進める)、
右下から、右下から(x, yを逆にカウンタを進める)です。

チェックした位置が見つかると(始めの位置は当然クリックした位置)、
別の色が現れるまで、カウンタを進める方向にチェックし続けます。

円とか長方形とかシンプルな図形を塗る場合、
カウンタを進める方向の1回目では、下方向に直線が引かれた形、
2回目では左下方向が塗られた形、3回目では、右下方向も塗られた形、
4回目で全部塗られた形になります。

この方法だと結構早いです。メモリが128Mで、画像のデータサイズ
(2次元ポインタ)は400×400なんですけど大丈夫です。

弱点は画像が複雑な場合です。
特に細長く斜め方向に伸びた図形だと、
チェック回数をかなり多くしないといけません。
472デフォルトの名無しさん:2006/04/16(日) 07:25:25
>>471
というかシードフィルでいいんじゃ
473デフォルトの名無しさん:2006/04/16(日) 08:31:37
普通は画像データが水平方向に連続しているので、ペイントアルゴリズムでは
一般的に水平線を埋める形で実装されている。
474デフォルトの名無しさん:2006/04/16(日) 12:40:19
externについての質問です。
とある書籍で、次のようなコードが使われていました。

extern void func()
{
  // 関数の実装
}

私の理解では、externを関数に修飾した場合、ただ単に「外部のどこかで宣言されている」ことを明示しているだけに過ぎず、
本来は関数宣言にのみ使うべきものだと考えておりましたので、例のような関数定義への修飾は意図が分からず戸惑ってしまいます。
このように関数定義そのものにexternを修飾することに、どのような意味があるのでしょうか?
475474:2006/04/16(日) 12:41:11
外部のどこかで宣言 ではなく 外部のどこかで定義 でした orz
476デフォルトの名無しさん:2006/04/16(日) 12:45:45
>>474
関数宣言(定義も含む)に付けられたexternは無意味。
あえて言うと、staticでないことを明示している。
477デフォルトの名無しさん:2006/04/16(日) 12:58:07
>>474
関数宣言・定義に修飾がなされていないときは
規格に従ってextern修飾がなされていると判断される

明示することでわかりやすくなるから全く意味がないとは言えない
478474:2006/04/16(日) 13:37:16
>>476-477
素早い返答ありがとうございます。

非staticであることを明示する、というのは考えが及びませんでした。
モヤモヤが晴れ、スッキリ読み続けられそうです。
ありがとうございました。
479デフォルトの名無しさん:2006/04/16(日) 13:40:05
>>478
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756116396/249-5821739-0535563
とりあえずこれでも読んでみたらいいんじゃないか?
面白いし、結構ためになる
480デフォルトの名無しさん:2006/04/16(日) 15:44:42
アプリケーションを終了するときのタイミングが、WM_DESTROYを捕まえた時にPostQuitMessage()を送る、と言う動作だけコーディングした場合に、
さらにWM_CREATEを捕まえた時に、-1を返す、としたら、ウインドウは生成されないけど、WM_DESTRORYが発生する事は無いから、
アプリは結局の所、PCの電源を切るとか低水準な事をしない限り終了しないって事?
481デフォルトの名無しさん:2006/04/16(日) 16:07:43
ofstreamでファイル出力するときに
tempフォルダや自分自身のexeがあるフォルダに出力するには
どんなパスを入れればいいのでしょうか?
482デフォルトの名無しさん:2006/04/16(日) 16:22:59
>>481
きっとtempフォルダや自分自身のexeがあるフォルダだよ。
483デフォルトの名無しさん:2006/04/16(日) 16:23:35
>>480 日本語でおk
484デフォルトの名無しさん:2006/04/16(日) 16:25:05
>>480
別の方法でWM_DESTRORYを送れば終了する。
485デフォルトの名無しさん:2006/04/16(日) 16:26:51
>>484
それは「低水準な事」に含まれないのか?
486デフォルトの名無しさん:2006/04/16(日) 16:29:25
>>481
環境異存。
WindowsならGetModuleFileNameを使って自分自身のファイル名を取得可能。
tempフォルダはgetenvで環境変数から取得できる。
tmpfile関数を使った方が良い場合もある。
487デフォルトの名無しさん:2006/04/16(日) 16:32:25
tmp ファイルは、環境依存を回避するために
boost 使うって言う手もある。
488名無しさん:2006/04/16(日) 16:39:19
linux g++とlibstdc++の依存関係の質問です。
g++ v3.2ではlibstdc++.5.soが、v3.4では .6.soが
リンクされますが、v3.4でも .5.soをリンクさせる方法は
ありますか?環境がばらばらなので、libstdc++について
古い環境に合わせたいのですが。よろしくお願いします。
489481:2006/04/16(日) 16:46:12
>>482>>486-487
THXです
boostってよく出てきますけど、便利そうですね
勉強してみます
490デフォルトの名無しさん:2006/04/16(日) 21:35:06
板違いなら誘導お願いします。

マトリクスのプログラムを作っています。
[A] * [x] = -[B] で[x]を求めるのですが
[B]の前にある-は、どう処理すればよいですか?
491デフォルトの名無しさん:2006/04/16(日) 22:00:48
[B]に-1をかけるだけじゃないのか?
492デフォルトの名無しさん:2006/04/16(日) 22:10:22
>>491
レスありがとう。
[B]の全要素の符合を入れ替えれば
良いのでしょうか?
[0]、[-1]がイメージ出来ません。
493デフォルトの名無しさん:2006/04/16(日) 22:13:41
>>492 そうだぞ、行列の勉強しる
494デフォルトの名無しさん:2006/04/16(日) 22:14:30
せめて高校くらいでるか、もしくは行列のあまりに
基本的なことくらいは本読んで勉強するかのどちらかにしろよ
495デフォルトの名無しさん:2006/04/16(日) 22:24:18
線形代数の基礎・・・・
496デフォルトの名無しさん:2006/04/16(日) 22:25:34
ありがとうございます。
勉強します。
497デフォルトの名無しさん:2006/04/16(日) 22:42:15
>>494 いまの高卒、文系とかだと行列やらんぞ
498デフォルトの名無しさん:2006/04/16(日) 23:07:13
>>497
そもそも文系がプログラミングしようというのが間違ってるじゃないだろうか?
499デフォルトの名無しさん:2006/04/16(日) 23:10:45
>>490 和を取るときも本当は値が落ちてしまわないように
順番も考慮した方がいいんだけどな。
500デフォルトの名無しさん:2006/04/17(月) 16:36:19
ちがうな彼はもっと高度なモノを作ってる
世界を構築してるんだ
501デフォルトの名無しさん:2006/04/17(月) 16:56:37
おお!
理想郷を作ろうとしているのか!
凄いぞ!がむばれ!
502デフォルトの名無しさん:2006/04/17(月) 18:41:04
template<class T, char SEP, char *STR1>
void lines<T, SEP, *STR1>::read2(istream& is){
...
};

class problem: public <problem, '2', "Error">{
...
};

class solution: public <solution, '3', "Error">{
...
};

このコードをコンパイルすると、

   syntax error : '<'     ← <problem, '2', "Error"> の <

と出てしまうのですが、何がいけないんでしょうか?

   class problem: public lines<problem, '2', "Error">

としても

   invalid template argument for 'STR1', constant expression expected

と出てしまいます。
テンプレートに関して授業でほとんど習っていないのに、いきなり課題で出されて困っています。
どなたか教えてください。
503デフォルトの名無しさん:2006/04/17(月) 18:51:25
>>502
templateを使うには当然後者のようにlinesを指定しないといけない。
でないと、どのテンプレートなのかコンパイラには分からない。
但し、後者のエラーメッセージを読めば分かる通りテンプレート引き数であるSTR1が間違っている。
504デフォルトの名無しさん:2006/04/17(月) 19:35:45
>>480
DefWindowProc呼んでるなら終了しね?
505デフォルトの名無しさん:2006/04/17(月) 19:42:50
>>503
解決しました。ありがとうございました(´∀`)
506502:2006/04/18(火) 00:29:22
>>502です。
どうやって各クラスのクラスポインタを宣言すればよいのでしょうか?
また、各クラスのインスタンスをnewを使って生成したいのですが、それもやり方がわかりませんorz
どなたか教えて下さい。
507デフォルトの名無しさん:2006/04/18(火) 01:48:00
なんかこう、>503が虚しく見えるな。
508デフォルトの名無しさん:2006/04/18(火) 01:50:12
そうか?
509デフォルトの名無しさん:2006/04/18(火) 01:51:27
なんつーか、テンプレートどころの騒ぎじゃないじゃん。
510デフォルトの名無しさん:2006/04/18(火) 01:57:57
ふっ、俺の手にかかればそんな問題しゅんさつだぜ
511デフォルトの名無しさん:2006/04/18(火) 03:43:53
>>506
ちょっとは自分で調べてから聞けよ。
512デフォルトの名無しさん:2006/04/18(火) 10:33:30
宿題は宿題スレでやって欲しいなあ
教えたことができるようになってんのはあたりまえだろ
教えてない部分はまともな本で読んで補え
って意味の課題なのわかんないのかね
513デフォルトの名無しさん:2006/04/19(水) 00:22:06
ヒント:ゆとり世代
514デフォルトの名無しさん:2006/04/20(木) 06:49:07
規格では、組み込み型の整数のサイズは、何も決められていないのでしょうか。
char <= short <= int <= long
であれば、いいのでしょうか?

すると、これも規格上いいのでしょうか?
char <= short <= int <= long = 1
515デフォルトの名無しさん:2006/04/20(木) 07:02:01
6.3.1 Arithmetic operands
6.3.1.1 Boolean, characters, and integers
1 Every integer type has an integer conversion rank defined as follows:
. No two signed integer types shall have the same rank, even if they hav e the same
representation.
. The rank of a signed integer type shall be greater than the rank of any signed integer
type with less precision.
. The rank of long long int shall be greater than the rank of long int, which
shall be greater than the rank of int, which shall be greater than the rank of short
int, which shall be greater than the rank of signed char.
. The rank of any unsigned integer type shall equal the rank of the corresponding
signed integer type, if any.
. The rank of any standard integer type shall be greater than the rank of any extended
integer type with the same width.
. The rank of char shall equal the rank of signed char and unsigned char.
. The rank of _Bool shall be less than the rank of all other standard integer types.
. The rank of any enumerated type shall equal the rank of the compatible integer type
(see 6.7.2.2).
. The rank of any extended signed integer type relative to another extended signed
integer type with the same precision is implementation-defined, but still subject to the
other rules for determining the integer conversion rank.
. For all integer types T1, T2, and T3, if T1 has greater rank than T2 and T2 has
greater rank than T3, then T1 has greater rank than T3.
516デフォルトの名無しさん:2006/04/20(木) 07:03:10
じゃなかったごめん。これは型変換だ。吊ってくる
517デフォルトの名無しさん:2006/04/20(木) 07:13:40
>514
手元のK&R C第2版には

>ハードウェアに合わせて、適当なサイズを自由に選んでよいが、守るべき唯一の条件は、
>shortとintは少なくとも16ビット、longは少なくとも32ビット、shortはintより長くてはならず、
>intはlongより長くてはいけないということである。

「唯一」のくせにいくつか書かれているが、こういうことらしい。
C99でどうなってるかは知らん。
あと、charは1バイト(バイトが何ビットであるかも正確には機種依存ではあるが)。
518デフォルトの名無しさん:2006/04/20(木) 07:22:34
>>517
C99の規格票を眺めていると、引用すべき箇所が多くて貼らない方が
いいだろうが、long long int と unsigned long long intが増えただけで、
後は limits.h内の***_MIN〜***_MAXを少なくとも保持できる大きさ
でなければならない、と書いてある。基本的にはANSI-C89と同じようだ。
519デフォルトの名無しさん:2006/04/20(木) 07:29:39
>>517
ありがとうございます。

C99にint32_tなどがあるのは知っていたのですが、
ANSI Cなどは、何の規定もないのかと疑問に思ったもので。

boostに、SFINAEとsizeofのトリックを利用するため、char型と違うサイズの型を指定するのに、
こんな風なコードが書いてあったので。

typedef char yes_type;
struct no_type
{
char padding[8];
};

K&Rを読んでおくべきでした。
わざわざすみません。
520デフォルトの名無しさん:2006/04/20(木) 19:18:25
int hoge(char *file, int flag, const char *format,...)

こんなソースを見たのですが、
この三連ピリオドはなんですか?
初めてみたんですが、意味を教えてください。
521デフォルトの名無しさん:2006/04/20(木) 19:26:31
可変長引数
522デフォルトの名無しさん:2006/04/20(木) 19:27:33
>>520
see stdio.h.
523デフォルトの名無しさん:2006/04/20(木) 19:27:50
>>521
あった。サンクス。
524デフォルトの名無しさん:2006/04/20(木) 19:28:24
>>522
サンクス
525デフォルトの名無しさん:2006/04/21(金) 16:29:10
typedef enum {
err1 = 0x1,
err2 = 0x2,
...
} HOGE;

として

HOGE a;
a |= e1;

というのをCではよく使ってたんだけど
C++でコンパイルすると
|=のところで演算子定義エラーになるんですが、
C++のenumでは代入しかつかえないんですか?
またenumを再定義してビット演算も使えるように
することってできますか?
526デフォルトの名無しさん:2006/04/21(金) 16:45:50
C++で、互いが互いを参照するようなクラスがあるのですが、
これを2つのヘッダファイルに分け、互いにインクルードするようにすると、
#ifndef #defineを使って多重インクルードを防止した場合は片方がインクルードされず、
これを使用しなかった場合は多重インクルードのループが発生してしまいます。
片方のヘッダのインクルード行の前に、クラスの仮宣言(?)を置くか、
2つのクラスをひとつのヘッダにまとめる事で解決できるのですが、好ましくない気がします。
ほかに効果的な解決方法はありませんでしょうか。

現在の状況:ほかのソースにc_dmanager.hをインクルードして使用
c_dmanager.h
#ifndef __C_DMANAGER_H__
#define __C_DMANAGER_H__
//ここに class C_DManager; と記述する事で、エラーは回避できる
#include "c_data.h"
class C_DManager{/*内部略*/};//このクラス内部でC_Dataにアクセス
#endif

c_data.h
#ifndef __C_DATA_H__
#define __C_DATA_H__
#include "c_dmanager.h"
class C_Data{/*内部略*/};//このクラスからC_DManagerにアクセス
#endif
527デフォルトの名無しさん:2006/04/21(金) 16:54:12
そこのエロイ人にききたいのだけども。
C++.NETとC++2005の主な違いはなんですか?
C言語で書かれたAPIのコードをコピーしても
C++2005で動作するもんでしょうか?
C++2005にはspy++は付属していますか?
よろしくお願いします。
528デフォルトの名無しさん:2006/04/21(金) 16:55:30
>>526
----- A.h -----
#ifndef __A_H__
#define __A_H__
class B;
class A {

};
#endif

----- B.h -----
#ifndef __B_H__
#define __B_H__
class A;
class B {

};
#endif

----- A.cpp -----
#include "A.h"
#include "B.h"

----- B.cpp -----
#include "B.h"
#include "A.h"

529デフォルトの名無しさん:2006/04/21(金) 17:00:38
>C++.NETとC++2005の主な違いはなんですか?
C++.netのはC++ Managed拡張
C++2005はC++/CLI(ECMA-372)

>C言語で書かれたAPIのコードをコピーしても
>C++2005で動作するもんでしょうか?
基本的には動く。とゆうか動かなきゃ話にならん

>C++2005にはspy++は付属していますか?
付いてなきゃ話にry
530デフォルトの名無しさん:2006/04/21(金) 17:29:51
>>529
教えてくれてどうもサンクスです♪
531526:2006/04/21(金) 17:34:04
>>528
早レスありがとうございます。
規模の小さいクラスだったので、ヘッダで完結させていたのですが、
CPP側に処理を書いたほうがスッキリしそうなので試してみます。
532デフォルトの名無しさん:2006/04/21(金) 17:44:25
>>525
C(gcc 3.3.5)でもそれ通んないんだけど...

bitsetと組み合わせて以下のようなのはどう?
#include <iostream>
#include <bitset>
using namespace std;
namespace HOGE {enum {err1, err2, size};}
typedef bitset <HOGE::size> HOGE_SET;
int main ()
{
using namespace HOGE;
HOGE_SET a;
a.set (err1);
if (a.test (err1)) cout << "err1" << endl;
return 0;
}
533デフォルトの名無しさん:2006/04/21(金) 17:49:47
つーか、enumをビット演算しようという時点で間違いだ罠。
534デフォルトの名無しさん:2006/04/21(金) 19:03:07
>>525
「列挙」型
535デフォルトの名無しさん:2006/04/21(金) 19:05:03
pascalの列挙型がこんな感じで使えるとか
昔他スレで教えてもらった
536デフォルトの名無しさん:2006/04/21(金) 21:33:39
>>525
列挙型は整数型とは違うからそのままでは |= 演算子を使えない。
そもそも列挙型に対する | 演算子も整数型に格上げして演算されているので要注意。

だから自分で|演算子や|=演算子を定義すればよい。
inline HOGE operator |(HOGE l, HOGE r) throw()
{
    return static_cast<HOGE>(l | r);
}

inline HOGE& operator |=(HOGE& l, HOGE r) throw()
{
    l = l | r;
    return l;
}
537525:2006/04/22(土) 01:28:13
みなさんレスありがとうございます。

>> 532
gcc 3.3.2では通ってました。ターゲットはarm-elfでしたけど、関係ないですよね…
今cygwinのgcc 3.4.4で試してみても通りました。

# ADSではtemplateつかえないみたいです…orz

>> 533, 525
普段はADSというarmの純正開発環境を使っていてarmのデバッガだと
HOGE a = err1;
a |= err2;
とかで
err1 | err2
と識別子情報を拾って表示してくれて見やすいので多用してました。
gdbだと拾ってくれないみたいですね。

Cでenumはintで実装されると思ってたんですけど
実装依存なんですかね?
規格とか持ってないんで判んないんですけど。

>> 536
// return static_cast<HOGE>(l | r); // コンパイル通らなかった
// return static_cast<HOGE>(static_cast<int>l | static_cast<int>r); // コンパイル通らなかった
return static_cast<HOGE>((int)l | (int)r);

なぜか↑のようにしないとコンパイル通りませんでしたけど、これでいけそうです。
enum自身にも演算子再定義できるとは知りませんでした。
538デフォルトの名無しさん:2006/04/22(土) 01:40:58
>>537
intでなくてenumを使ってるのはなぜですか?
539525:2006/04/22(土) 01:43:43
>>538
> 普段はADSというarmの純正開発環境を使っていてarmのデバッガだと
> 識別子情報を拾って表示してくれて見やすいので多用してました。
という理由です。
540デフォルトの名無しさん:2006/04/22(土) 01:54:11
>539
const int ONE = 1;

という風に代替するんじゃダメなん?
541540:2006/04/22(土) 01:55:44
あ、すまん537見落としてたんでスルーしてくれ。
542デフォルトの名無しさん:2006/04/22(土) 03:00:38
VC++2005の本が異様すくないのはなぜですか?
543デフォルトの名無しさん:2006/04/22(土) 03:06:48
製品版が発売されてからまだ間もないからです
続々と新刊が発売されている最中です
544デフォルトの名無しさん:2006/04/22(土) 03:09:39
 もう結構たってません2005年から?
545デフォルトの名無しさん:2006/04/22(土) 03:14:02
C99についての本も異様に少ないはずです
1999年から結構経っていますがそんなもんです
546デフォルトの名無しさん:2006/04/22(土) 03:54:04
>>545
それ以前にC99に完全準拠したまともな処理系は数えるしかなく、
メジャーなベンダーメーカーはC99を捨てているのが現状です。

規格だけが先走り、現物が出てこない悲運のC99。
547デフォルトの名無しさん:2006/04/22(土) 04:15:16
>>537
> static_cast<HOGE>(l | r)

l, r が両方 enum HOGE だとして、これはコンパイルできないとおかしいぞ。
エラーメッセージなんて言われた?

> static_cast<HOGE>(static_cast<int>l | static_cast<int>r)

こっちは
 static_cast<HOGE>(static_cast<int>(l) | static_cast<int>(r))
これで通るはず 〜_cast<T> には括弧が必須。
548525:2006/04/22(土) 08:09:23
>> 547
> これで通るはず 〜_cast<T> には括弧が必須。
これでいけました。

> エラーメッセージなんて言われた?
すいません、これに関しては実行時のエラーでした。
↓こんなかんじ

GNU gdb 6.3.50_2004-12-28-cvs (cygwin-special)
...
(gdb) br main
Breakpoint 1 at 0x401075: file enumtest.cpp, line 23.
(gdb) run
Starting program: /cygdrive/c/nogu/test/enumtest.exe

Breakpoint 1, main () at enumtest.cpp:23
23 {
(gdb) n
24 HOGE a = err1;
(gdb) n
25 HOGE b = err2;
(gdb) n
26 a |= err2;
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
0x004013fb in operator| (l=err1, r=err2) at enumtest.cpp:11
11 return static_cast<HOGE>(l | r); // SIGSEGV
(gdb)
549デフォルトの名無しさん:2006/04/22(土) 08:14:02
>>546
Sunはメジャーじゃないの?
550デフォルトの名無しさん:2006/04/22(土) 09:11:42
ボーランドのコンパイラがインストールされているのですが、

Z:\MyDocuments>bcc32 teat01.c
'bcc32' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

と出てコンパイルできません。どうしたらよいでしょうか?
551デフォルトの名無しさん:2006/04/22(土) 09:16:33
>>550
インストールした香具師に聞け。
それがあんた自身なら、ダウンロードした香具師に聞け。
それがあんた自身なら、ダウンロードしたサイト周辺を探せ。
552デフォルトの名無しさん:2006/04/22(土) 09:24:17
bcc path で ググって「pathを通す」という概念を理解しよう
553550:2006/04/22(土) 09:32:26
>>551-552
環境変数を自分で設定しないといけないんですね。
愛媛大学のメディアセンターのパソコンは今日開いていないので、
月曜日にやってみます。
554デフォルトの名無しさん:2006/04/22(土) 09:42:11
何故愛媛を強調
555デフォルトの名無しさん:2006/04/22(土) 12:03:30
2000ByteのI:\file.binの0x1500-0x1510までのアドレスに00 01 02 03 04 05 06 07 08 09を出力したいのですが
どの様に実装すればいいのでしょうか
556デフォルトの名無しさん:2006/04/22(土) 13:12:54
>>555
つ[fopen(), fseek(), fwrite(), fclose()]
557デフォルトの名無しさん:2006/04/22(土) 13:29:12
0x1500って5376バイト目なわけだが
558デフォルトの名無しさん:2006/04/22(土) 13:30:24
別に問題なくね?
559デフォルトの名無しさん:2006/04/22(土) 14:01:10
すみません、constと#defineとenumについてお聞きします。

普遍の値として10という数字を使う際に
constと#defineとenumのメリットデメリットや使い方例などありますか?

560デフォルトの名無しさん:2006/04/22(土) 14:06:51
#define FUHEN (10)
const int fuhen = 10;
enum {Fuhen = 10};

それが個数などを表す数値であるなら意味的には整数型を使うべき。
序列、番号付けの目的ならenumがいいだろう。
どちらの手段も使えないなら仕方なくマクロにしようか。
561デフォルトの名無しさん:2006/04/22(土) 14:08:39
自分はenumを進める
言語で標準サポートされてるし
562デフォルトの名無しさん:2006/04/22(土) 15:07:38
>>561
いや、マクロやconstもサポートされていますが何か。
563デフォルトの名無しさん:2006/04/22(土) 15:26:17
defineはプリプロセッサ
constはわざわざ使う必要は無いと思った
564デフォルトの名無しさん:2006/04/22(土) 15:36:07
>>563
浮動小数点型の定数が欲しい時どうするんだ?
整数型の定数だけenumにして、その他はdefineかconstなんていう不統一なスタイルにするのか?
565デフォルトの名無しさん:2006/04/22(土) 15:41:46
きっと浮動小数点数を暗算で16進数に変換できる人なんだよ。
566デフォルトの名無しさん:2006/04/22(土) 15:47:40
つーかむしろenumは特定の数値を表すものとしては使うべきではないと思うが。
567デフォルトの名無しさん:2006/04/22(土) 15:53:58
>>566
使うべきかどうかは別として、最初に導入された理由が
「マクロよりもマシな記号定数が必要だったから」だしな。
使い方として完全に間違っているわけではないかと。
568デフォルトの名無しさん:2006/04/22(土) 16:10:51
cout <<
printf
後者の方が10倍くらい出力速い気がする
569デフォルトの名無しさん:2006/04/22(土) 16:19:01
>>568
Cの方が速いのは当たり前
570デフォルトの名無しさん:2006/04/22(土) 16:30:17
速度が気になるほどprintfしまくったらえらいことになるし
571デフォルトの名無しさん:2006/04/22(土) 16:34:06
俺の心にprintfしてください
572デフォルトの名無しさん:2006/04/22(土) 16:34:20
C++2005にwebフォームは作れないって書いてあったけど。
webフォームとwebアプリケーションは違いますよね?
webフォームとは具体的になんですか?
573デフォルトの名無しさん:2006/04/22(土) 16:52:28
talk_something > /dev/null

独り言
574デフォルトの名無しさん:2006/04/22(土) 19:01:13
GCCでプログラミングをしていて、壁に当たりました。
なんとか、getch()を使える環境にしたのですが、うまくいきません。
コンパイルは普通に通り、実行ファイルも吐き出されます。
しかし、実行時にセグメンテーション違反が出ます。
どうすればいいでしょうか。
ご教授いただければうれしいです。
575デフォルトの名無しさん:2006/04/22(土) 19:21:47
>>574
getchar使うとか
576デフォルトの名無しさん:2006/04/22(土) 19:23:52
>>575
はい、そうするのが無難なのですが。
例えば、タイピングのゲームを作りたいと考えた時に、getcharでは実現できないと思うのです。
577デフォルトの名無しさん:2006/04/22(土) 19:25:32
ご教授いた〜って言う奴に何故かいらいらくる
普通に教えて下さい程度で十分だと思う
ここは教授するような高尚な知識を授ける程のレベルのスレでもない
578デフォルトの名無しさん:2006/04/22(土) 19:29:43
>>577
なら来るなよカス。
579デフォルトの名無しさん:2006/04/22(土) 19:31:51
>576
curses使えばリアルタイムに取れる
580デフォルトの名無しさん:2006/04/22(土) 19:34:42
>>579
レスありがとうございます。
よければそれについて、詳しく教えてください。
有用な情報が載っているWebページなどでも結構です。
581デフォルトの名無しさん:2006/04/22(土) 19:38:54
>>577
元々「教授する」なんて言葉自体が誤用なんだから目鯨立てなさんな。
582デフォルトの名無しさん:2006/04/22(土) 19:40:00
>580
man 3 curses

ttp://www.h7.dion.ne.jp/~matsu/feature/c-language/curses/basic.html
↑にサンプルコードやらなんやら
足りんかったら適当にぐぐれ
583デフォルトの名無しさん:2006/04/22(土) 19:43:20
initscr
してないとか
584デフォルトの名無しさん:2006/04/22(土) 19:43:30
>>580
ぐぐれ。そして挫折しろ。
585577:2006/04/22(土) 20:13:33
>>578
おならプー
586デフォルトの名無しさん:2006/04/22(土) 20:52:12
ところで、正しい日本語は

     「教示」

です。
587デフォルトの名無しさん:2006/04/22(土) 20:56:35
三省堂提供「大辞林 第二版」より
きょうじゅ【教授】

(名)スル
児童・生徒に知識・技能を与え、そこからさらに知識への興味を呼び起こすこと。
専門的な学問・技芸を教えること。
「国文学を―する」「書道―」
588デフォルトの名無しさん:2006/04/22(土) 20:58:19
三省堂提供「大辞林 第二版」より
きょうじ 【教示】

(名)スル
〔「きょうし」とも〕おしえしめすこと。示教。
「御―を賜りたく」
実験・調査で、研究者の意図する行動を被験者にとらせるための指示
589デフォルトの名無しさん:2006/04/22(土) 20:59:48
どっちかってーと、間違ってないか > 教示
590デフォルトの名無しさん:2006/04/22(土) 21:18:18
この場合は教授で正解だな。
591デフォルトの名無しさん:2006/04/22(土) 23:09:11
はい! わかりましたそこの教授!
592デフォルトの名無しさん :2006/04/22(土) 23:52:19
このよく見るgetch()って関数は何?
putch()ってのもあるの?
GCC特有の関数?
593デフォルトの名無しさん:2006/04/22(土) 23:59:38
conio.hに定義されている標準入力から一文字読み込む関数
ヘッダファイルの名のとおりコンソール専用
594デフォルトの名無しさん:2006/04/23(日) 02:21:49
超初心者の質問でスマ。
borland C++を導入して
BinにPATHを通しても
includeとlibを読み込んで
くれません。
こんなことで悩んでいるぽっくんは
バカ?
なんせプログラム組むのは
10年ぶりでWindowsは初めてなもので。
教えて偉い人。

595デフォルトの名無しさん:2006/04/23(日) 02:24:46
INCLUDEとLIBにも通せばいいんじゃないか?
596デフォルトの名無しさん:2006/04/23(日) 02:28:35
setbccでぐぐると幸せになれるかも。なれないかも。
597デフォルトの名無しさん:2006/04/23(日) 02:28:39
下手な釣りだな。
598デフォルトの名無しさん:2006/04/23(日) 02:34:25
INCLUDEとLIBにも
PATH通したんですけど、
ダメなんですよーーー(;_;
599デフォルトの名無しさん:2006/04/23(日) 02:36:02
ちゃんと
bcc32.cfgとilink32.cfgファイルは
作りました。
どうやらそれを無視している
ようです。
600デフォルトの名無しさん:2006/04/23(日) 02:46:20
setbccを使うと良いらしいんですけど、
なんでダウンロード出来ない神!
601デフォルトの名無しさん:2006/04/23(日) 03:16:53
GCCのライブラリにisleadbyte()ってありましたっけ?
602デフォルトの名無しさん:2006/04/23(日) 03:20:14
>>594
CPadっていうフリーのIDEだと環境変数自動で設定してくれる。
それだと駄目か?
603デフォルトの名無しさん:2006/04/23(日) 03:36:38
>>601
あるよ。
604デフォルトの名無しさん:2006/04/23(日) 03:40:11
bcc.exeを削除したら、立ち上がらなくなりました。なぜでしょうか?
どうしてもわかりません?????
605デフォルトの名無しさん:2006/04/23(日) 04:19:31
ども>>594です
どうやらTeraPadの保存で
余計な拡張子がついていたようです
無事コンパイル出来ました。
お騒がせしました。
606デフォルトの名無しさん:2006/04/23(日) 05:48:18
すみません>>594です。
こんどはリンカで
Illegal option -Gn
とかでてEXEファイルを生成
出来ない様です。
こまりました。
607デフォルトの名無しさん:2006/04/23(日) 08:25:35
>>606
翻訳サイトにその文章をかけてみな。たぶん正しくないオプション-Gnみたいな文章になると思うから。
ilink32.cfgに-Gnって書いてあったら消すといいと思うよ。
608デフォルトの名無しさん:2006/04/23(日) 09:20:17
エラーメッセージくらい嫁よ
609デフォルトの名無しさん:2006/04/23(日) 09:56:15
>>603
何ていうヘッダで定義されてますか?
BCCに通るコードでも未定義エラーで弾かれちまいます。
610デフォルトの名無しさん:2006/04/23(日) 10:03:38
>>609
自分の環境だとmingwのctype.hとwctype.hにしかないな。
611デフォルトの名無しさん:2006/04/23(日) 10:07:12
isleadbyte って ISO で定義されてる?
手持ちの資料では見当たらないんだが。
612デフォルトの名無しさん:2006/04/23(日) 11:04:09
>>609
mingwのctype.h
613デフォルトの名無しさん:2006/04/23(日) 12:31:32
>>607
ilink32.cfgで、-Gの指定がありません。
なぜ-Gのエラーが出るのか判りません。。
614デフォルトの名無しさん:2006/04/23(日) 12:36:52
>>613です。
とりあえずEXEファイルは生成出来ました。
しかし実行すると、有効なwin32アプリケーション
ではありません。と出てエラーになってしまいます。
ただhello worldと出すだけのプログラムなんですけど。
615デフォルトの名無しさん:2006/04/23(日) 12:45:03
>>614
いい加減に汁。
コンパイラ/リンカの使い方位ググって調べろ。

ここは、ソフトの使い方を聞くスレじゃねぇ!
616デフォルトの名無しさん:2006/04/23(日) 13:13:55
どうもすみません。
617デフォルトの名無しさん:2006/04/23(日) 13:55:00
setbccはどう?
618デフォルトの名無しさん:2006/04/23(日) 14:40:57
>>610 >>612
ctype.hをインクルードしてますが、「isleadbyteへの参照が未定義」とエラーされました。意味がさっぱりっす。環境はcygwin。
引値はintらしいけど、BCCだとcharが通りました。これも訳わからんです。
619デフォルトの名無しさん:2006/04/23(日) 14:44:41
ヘッダファイル

リンクするライブラリ
があっているか?
620デフォルトの名無しさん:2006/04/23(日) 14:50:32
>>618
cygwin でエラーメッセージに日本語でるの?
621デフォルトの名無しさん:2006/04/23(日) 15:14:04
>>620
いや、英語でした。
リンカも1 exit statusなるものを返してきてるらしいですが…。

>>619
<ctype.h>じゃ駄目ですか?
622デフォルトの名無しさん:2006/04/23(日) 15:31:51
>>621
やったこととエラーメッセージを「正確に」伝えろバカ。
623デフォルトの名無しさん:2006/04/23(日) 15:33:29
>>621
終了ステータスが0以外=何かエラーが発生した


つーかこんなのC言語以前のレベルだろうが、氏ね
624デフォルトの名無しさん:2006/04/23(日) 16:49:41
じゃいいや
BCCでします。
625デフォルトの名無しさん:2006/04/23(日) 17:08:36
Blind Carbon Copy
626デフォルトの名無しさん:2006/04/23(日) 17:16:32
Coconut Boys
627デフォルトの名無しさん:2006/04/23(日) 20:18:54
>>621
わざわざmingwだと言ってるのに。頭悪杉。
628デフォルトの名無しさん:2006/04/23(日) 22:49:05
代入演算子は継承されないってことらしいですが、
試しに基底クラスで代入演算子をオーバーロードして、
その基底クラスから派生させたクラスを1つつくって
派生クラス同士で代入を行ったら、基底クラスでオーバーロードした
代入演算子が呼び出されているようなんですが・・・
これって継承されてるのと違うんですか?それとも意味が違う?
629デフォルトの名無しさん:2006/04/24(月) 00:11:46
>>628
>13.5.3 代入
>代入演算子は,1個の仮引数をもつ非静的メンバ関数として実装しなければならない。代入演算子が
>利用者によって宣言されていない(12.8参照)場合,コピー代入演算子operator=が,クラスごとに暗黙に宣言さ
>れるので,基底クラスの代入演算子は,常に派生クラスのコピー代入演算子によって隠ぺいされる。
630628:2006/04/25(火) 02:25:17
class A{
public:
A& operator =(const A& rhs){ cout << "A" << endl; return *this; }
};

class B : public A{

};

int main( void )
{
class B b1, b2;

b1 = b2;
}

これを実行すると
A
と表示されるのですが・・・おかしいですよね?
631デフォルトの名無しさん:2006/04/25(火) 03:05:41
>>630
「継承されません」というのは、派生クラスで自前で代入演算子を定義
した時、基底クラスの代入演算子が無視されてしまう事を言う。

今のケースではBのデフォルトの代入演算子が使われるので、継承とか
は関係無しに基底クラスの代入演算子も呼ばれる。

試しにBに代入演算子を定義してみな。自分でA::operator=()を呼び
出さないと呼び出されない。隠蔽されてしまうからだ。

規格のどの辺かな?§12.8、§13.5.3あたりだと思うんだが。
632デフォルトの名無しさん:2006/04/25(火) 08:24:31
>>629
その定義だと、全てのメンバ関数にあてはまってしまわない?
633デフォルトの名無しさん:2006/04/25(火) 09:18:53
>>630
暗黙に定義される B::operator=() は A::operator=() を呼び出す。
そうじゃないと困るだろ?べつにおかしくない。
634デフォルトの名無しさん:2006/04/25(火) 09:19:57
>>632
代入演算子は暗黙の宣言があるので必ず隠される。
他のメンバ関数はそうはならない。
635デフォルトの名無しさん:2006/04/25(火) 09:29:27
つまりこういう事か。

暗黙に定義されるB::operator=()は、Bに固有のメンバのみビットコピーした
後にA::operator=()を呼び出す、と。

確かにそういうバイナリ吐いてるな。
636デフォルトの名無しさん:2006/04/25(火) 09:48:06
>>635
ビットコピーではなく代入だよ。
637デフォルトの名無しさん:2006/04/25(火) 09:54:08
>>635
違う。

B のメンバはそれぞれに対して代入を行う( operator=() を呼び出す)。
また、順番は A::operator=() が最初でメンバは宣言順になる。
638デフォルトの名無しさん:2006/04/25(火) 09:55:58
難しひ・・・・
639デフォルトの名無しさん:2006/04/25(火) 10:03:04
そうか?単純にメンバに再帰してるだけで、自然だと思うけど。
640デフォルトの名無しさん:2006/04/25(火) 10:09:54
shallow copy と deep copy で言うと、shallow copyの方がデフォルトの
代入演算子の動作だったような・・・・
641デフォルトの名無しさん:2006/04/25(火) 10:09:56
Cの構造体のコピーと事情は一緒だと思うが。
・メンバを先頭から順番に代入する。
・継承している場合は継承元が先。
たったこれだけだろ。
642デフォルトの名無しさん:2006/04/25(火) 10:13:39
>>635,640
自信が無いなら規格読めよ。
643デフォルトの名無しさん:2006/04/25(火) 10:19:24
Bの内容が

class B : public A {
 int* i;
};

のような状態で、iがnewされた領域を指していた場合、デフォルトの
B::operator=()じゃダメだろ。
644デフォルトの名無しさん:2006/04/25(火) 10:30:53
>>643
大抵ダメだろうねぇ。そのような場合、適切な代入オペレータを用意するのはクラス設計者の責任だろうけど。
645デフォルトの名無しさん:2006/04/28(金) 12:45:44
質問です。

可能な限り高速に、エクセル形式のファイルを動的配列に格納したいです。
調べたところ、ODBCというものを使う、という手段を発見しましたが、下記サイトによるとタイムラグが発生するとのこと。
他に手段はありますか?

ttp://sato-si.at.webry.info/200503/article_11.html
646645:2006/04/28(金) 12:51:35
age忘れ。
失礼しました。
647645:2006/04/28(金) 12:54:21
環境忘れ。失礼しました。

環境 : VC.NET2003, WinXP SP2, 標準STL
648デフォルトの名無しさん:2006/04/28(金) 12:55:19
>>645
自前でフォーマットを調べて読み込みルーチンを書く

ttp://www.wotsit.org/download.asp?f=excel
649デフォルトの名無しさん:2006/04/28(金) 14:42:40
wcharをfputsで出力すると、勝手に改行が付いてきます。
wcharをfputsで出力するのはダメなんでしょうか?

環境はWinCE5.0です。
650デフォルトの名無しさん:2006/04/28(金) 14:46:13
>>649
fputws
651デフォルトの名無しさん:2006/04/28(金) 17:05:43
>>650
あああ!ありがとうございます。そんなものがあるなんて思ってませんでした。
652デフォルトの名無しさん:2006/04/28(金) 22:52:53
エクセルのファイルフォーマットは公表されてないでしょ。
マイクロソフトの気分しだいで簡単に変更されちゃうのでは?
653デフォルトの名無しさん:2006/04/28(金) 22:57:58
変更されたら自作ライブラリも更新すればよかろう。
654デフォルトの名無しさん:2006/04/28(金) 22:58:23
openofficeの資料みれば poifsとか
次はxmlベースらしいから解析は楽そうだけど
655ふーん:2006/04/28(金) 23:05:45
 
【IT/政治】日本政府、「世界最高水準のセキュリティー」の次世代OS開発着手へ
:Winny被害に対応[06/04/29]
http://news19.2ch.net/test/read.cgi/newsplus/1146231538/l50
656645:2006/04/29(土) 03:49:52
odbc以外は難しそうですね。
ありがとうございました。
657デフォルトの名無しさん:2006/04/29(土) 08:48:27
エクセルファイルを読みたいだけならExcelのオートメーションでもできた気がする。
658デフォルトの名無しさん:2006/04/29(土) 10:02:41
オートメーションもアウトプロセスCOMだから遅いお。
659デフォルトの名無しさん:2006/04/29(土) 10:46:08
クラスのメンバ関数をinlineにする場合で、関数定義をクラスボディの外で
する場合、宣言と定義にinline指定、宣言のみにinline指定、定義のみに
inline指定、いずれもinlineになると思っていいの?
660デフォルトの名無しさん:2006/04/29(土) 11:26:59
>>659
いいけど、定義だけにつけたときは
使う側が定義を取り込むように注意して配置しろよ。
661デフォルトの名無しさん:2006/04/29(土) 17:07:15
逆にいえば、余計なことを考えずに宣言につけとけって話だな。
662デフォルトの名無しさん:2006/04/29(土) 17:51:45
他の翻訳単位にあっても、コードがinlineに展開される事ってあるの?
663デフォルトの名無しさん:2006/04/29(土) 17:55:17
ない
664デフォルトの名無しさん:2006/04/29(土) 18:56:17
コンパイラとリンカによる。
たとえばVC++にはプログラム全体の最適化というリンク時に行う最適化がある。
それどころかDLL内の関数すらインライン展開する機能もある
665デフォルトの名無しさん:2006/04/29(土) 23:12:01
構造体の配列は宣言した段階で領域が確保されるの?
666デフォルトの名無しさん:2006/04/29(土) 23:32:11
いいえ
667デフォルトの名無しさん:2006/04/29(土) 23:37:42
動画編集に手を出したいんだが
お勧めのライブラリってある?
検索の仕方が悪いのかいまいちヒットしない。
668デフォルトの名無しさん:2006/04/29(土) 23:46:41
やってみたけど、構造体自体もできてない。
構造体の中身の配列に関しては、値を入れた配列要素から
1つづつ形成されていた。
配列オンリーなら宣言時というよりも、すでにstatic領域(静的領域)でできてるけど。
669デフォルトの名無しさん:2006/04/30(日) 12:18:23
>>668
どうやって調べてるの
670デフォルトの名無しさん:2006/04/30(日) 12:23:37
>>668
>構造体の中身の配列に関しては、値を入れた配列要素から
>1つづつ形成されていた。
どういう意味?構造体の配列にvectorでも使っているの?
671デフォルトの名無しさん:2006/04/30(日) 18:16:26
>>669-670
>>668誤り
構造体自体もアドレス確保されてるし、構造体の中に配列作ったとしても、
その配列も他変数同様確保されてるし、
static領域ではないし、
ただ、Cでやったんだけど、
Cの場合、C++と違って、「宣言は最初に持ってこないといけない(関数内の中間じゃ×)」
であって、例えば、
int a=1;
int b=2;
とやるも、先にaとbがまとめて確保されて、次にa=1となり次にb=2となる。
ここを誤った。
672デフォルトの名無しさん:2006/04/30(日) 18:22:29
結局、宣言時に全部確保されてた。
673デフォルトの名無しさん:2006/04/30(日) 18:58:31
>>671
新しい規格ではブロックの先頭じゃなくてもいいんじゃなかったっけ?
674デフォルトの名無しさん:2006/04/30(日) 19:01:56
「宣言」「定義」「確保」の意味が曖昧で話がわからん。
675デフォルトの名無しさん:2006/04/30(日) 19:05:55
正確に言うなら
int a=1;
は定義である
これが関数内に記述されているなら関数が実行されるときに
スタック上に領域が確保される かもしれない
676デフォルトの名無しさん:2006/04/30(日) 19:07:43
宣言と定義ぐらいは規格上の意味に則ってほしいなぁ。
677デフォルトの名無しさん:2006/04/30(日) 19:14:26
#include <iostream>
using namespace std;
char a[255];
void set(){
a="abc";
}
void main()
{
set();
cout <<a;

getchar();
}

どうすればいいんだYO
678デフォルトの名無しさん:2006/04/30(日) 19:18:17
無理せずstringつかっとけ
679デフォルトの名無しさん:2006/04/30(日) 19:20:24
普通ならその前にポインタや配列とかを勉強させるべきじゃね?
ここで教えるわけがないけど、まあ、そのへん勉強しろと
680デフォルトの名無しさん:2006/04/30(日) 19:24:26
#include<iostream>
usingnamespacestd;
chara[255];
voidset(){
//a="abc";
if(strlen(a)>strlen("abc"))
strcpy(a,"abc");
}
void main()
{
set();
cout<<a;

getchar();
}
681デフォルトの名無しさん:2006/04/30(日) 19:28:42
>>680
ありがとう

ポインタを使う時はどうするの?
682デフォルトの名無しさん:2006/04/30(日) 19:30:00
>>681
聞く前に自分で書け馬鹿。
683デフォルトの名無しさん:2006/04/30(日) 19:41:30
>>682
馬鹿って言う奴が馬鹿なんだもんねー
684デフォルトの名無しさん:2006/04/30(日) 20:05:55
#include<iostream>
usingnamespacestd;
//chara[255];
staticchar*a="efg";
voidset(){
//a="abc";
if(strlen(a)>strlen("abc"))
strcpy(a,"abc");
}
void main()
{
set();
cout<<a;

getchar();
}

char*a;やchar*a="efg"だと、
strcpy(a,"abc");
とした瞬間に、元のaの値もアドレスもゴミとして放棄して、新しくアドレス確保してabc\0を入れてしまうんだよ。
で、ゴミがエラーとして出る。
こういう面からも安易に=は使えないよ、=はポインタ型変数で使うと参照を意味したりもする(もちろんアドレス変わる)('Д`)
685デフォルトの名無しさん:2006/04/30(日) 20:08:58
Cで使えるXMLパーザってないですかね。
調べてもC++用のしか見つからないんです。
コンパイラはBCCです。
686デフォルトの名無しさん:2006/04/30(日) 20:11:53
>>685
Parsifal XML Parser
687デフォルトの名無しさん:2006/04/30(日) 20:11:55
DOMはCでも使えるよ
688デフォルトの名無しさん:2006/04/30(日) 20:14:04
>>684
どうもご親切に
689デフォルトの名無しさん:2006/04/30(日) 20:24:03
>>684
> char*a;やchar*a="efg"だと、
> strcpy(a,"abc");
> とした瞬間に、元のaの値もアドレスもゴミとして放棄して、新しくアドレス確保してabc\0を入れてしまうんだよ。
新しくアドレスを確保?
んなことせんがな
自分でstrcpyと同じ動作をする関数を実装してみると理解が深まると思われ
690デフォルトの名無しさん:2006/04/30(日) 20:37:13
string使ったら全て解決したYO ヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノ
691デフォルトの名無しさん:2006/04/30(日) 20:37:49
>>686
>>687
おお、あった。
速攻レスありがとうございます。
692デフォルトの名無しさん:2006/04/30(日) 22:20:23
char*a;やchar*a="efg"だと、
"abc"を入れるアドレスを作り、"abc"を入れて、
strcpy(a,"abc");で、"abc"のアドレスをaが参照し(aと"abc"は同アドレス)、
aの元の値とアドレスはゴミとして残ってしまう。
でOKですか?
AccessViolationでるから、まんまでは確認できなかったですけれど。
693デフォルトの名無しさん:2006/04/30(日) 22:32:01
>>692
なんだか説明が下手でよく判らんが、理解できてなさそうだとは思う。
コードを提示して説明しなおして味噌。
694デフォルトの名無しさん:2006/04/30(日) 22:47:16
#include <iostream>
using namespace std;
char* b="efg";
void set(){
/*5:*/strcpy(b,"abc");
}

void main()
{
set();
cout<<b;
getchar();
}
ビルドは通りますが、実行時AccessViolationでます。
で、その訳ですが、5行目でabcのためのアドレス確保し、abc\0が入る
&aが"abc"と同アドレスを参照しようとするが、そのとき、efgとそのアドレスを切り離す(メモリ上に残骸が残る)>AccessViolation
695訂正:2006/04/30(日) 22:48:54
>&aが

>&bが
696デフォルトの名無しさん:2006/04/30(日) 22:54:15
>>694
違います。
697デフォルトの名無しさん:2006/04/30(日) 22:56:55
>>694
"abc"のための領域なんぞ確保できていない。
char* b = "efg"は文字列リテラルへのポインタをbに代入しているに過ぎない。
で、文字列リテラルはconst、つまり変更不可能。
それをstrcpyで勝手に書き換えようとした。ゆえにAccessViolation
そもそもViolationで辞書引いたのか?
698デフォルトの名無しさん:2006/04/30(日) 23:00:17
解決したのに議論は終わらず
699デフォルトの名無しさん:2006/04/30(日) 23:01:33
どうやら大部分の人々はポインタを理解するための脳の一部分を持たずして生まれてくる ようだ。
700693:2006/04/30(日) 23:12:04
うぁはは、本当に理解できていなかったとは。素晴らしい。
701デフォルトの名無しさん:2006/04/30(日) 23:41:29
>>697
ありがとうございます。
追うのはかなり厳しかったのですが、
strcpy内ステップインして、
abcをスタックにpushした後、

この間分からなかったですが、

mov dword ptr [edi],edx
(edx=00636261(\0cba))
で、abc\0をediレジスタに書き込むところでAccessViolation発生していました。
宣言が関数内外問わず同じでした
702デフォルトの名無しさん:2006/04/30(日) 23:43:08
ポインタは、そのポインタ値が何を指しているのか?
が重要であって、それさえイメージ出来れば、
何も難しい事なんて無いはずなのになぁ…。


みんな、想像力が欠けてるのか?
703デフォルトの名無しさん:2006/04/30(日) 23:45:20
「この処理は何をしているのか」
がわかってないといきなりデバッガで追っても意味わからんと思うけど・・
704デフォルトの名無しさん:2006/04/30(日) 23:45:39
>>701
そんなものを追う前に、Access Violation を英和辞書でひけ!
705デフォルトの名無しさん:2006/05/01(月) 00:02:24
「俺に聞けスレ」にも、ポインタが分かってないのに、デバッガの値がどうとか言って
ヒンシュクをかってたやつがいたな。
706デフォルトの名無しさん:2006/05/01(月) 00:12:57
>>705
あの、的はずれな値を見ていた香具師か?
707デフォルトの名無しさん:2006/05/01(月) 00:24:00
>>703
彼らはある日魔法の呪文が書かれた本を目にするとなぜかそれが全て読めて
南無南無唱えて敵を倒せるのだと思い込んでいるからなぁ。
708デフォルトの名無しさん:2006/05/01(月) 00:38:25
>701
そろそろ「釣れたw」とか言って欲しいな。

>mov dword ptr [edi],edx
>(edx=00636261(\0cba))
>で、abc\0をediレジスタに書き込むところで
そのコードはabc\0をediレジスタに書き込んでいるのでは無い。
ediレジスタが指す メ モ リ にedxの内容を書き込んでいる。
709デフォルトの名無しさん:2006/05/01(月) 00:49:33
この世には2種類の人間がいる。

ポインタを理解できる人間か、理解できない人間かだ。
710デフォルトの名無しさん:2006/05/01(月) 11:30:24
>>699
JoS?
711デフォルトの名無しさん:2006/05/01(月) 20:21:56
UNIX系のC言語について質問させてください。
errno==ENTER
ってどういうエラーを表しているのでしょうか?
手持ちの本には何も書いてなくて、検索してもあまりこれっというのがでてきませんでした。
よろしくお願いします。
712デフォルトの名無しさん:2006/05/01(月) 20:22:29
>>711
perror()
strerror()
713711:2006/05/01(月) 20:32:48
>>712
すみません、よくわかりません。
もう少しヒントをお願いできないでしょうか?
714デフォルトの名無しさん:2006/05/01(月) 20:38:53
>>713
errno = ENTER;
perror("");
とすると、エラーENTERの説明がstderrに出力されるはず。
715デフォルトの名無しさん:2006/05/01(月) 20:41:50
>713
man errno

しかし、ENTERなんてあったか?
写し間違えてない?
716711:2006/05/01(月) 20:47:48
>>714,715
ごめんなさい。EINTRの間違いでした。
おさがわせしました。
717デフォルトの名無しさん:2006/05/01(月) 23:07:01
質問です。 printf関数使って " っていう文字表示させるにはどうしたらよいですか?
printf(""");
とかやったらエラーになるのですが。って当たり前か
718デフォルトの名無しさん:2006/05/01(月) 23:07:49
\"
マニュアルを読むとか検索するとか汁
719デフォルトの名無しさん:2006/05/01(月) 23:41:15
>>718 ご親切にありがとうございます
720デフォルトの名無しさん:2006/05/01(月) 23:49:11
世の中には二種類の人間がいる。
ポインタを理解している人間と理解する気がない人間だ。
理解できないようなのは人間とは認め難い。

つーかネタもいいかげんにしてくれ。
基本的な文字列操作もできないCプログラマがどこにいる。
721デフォルトの名無しさん:2006/05/02(火) 00:19:54
ここに
722デフォルトの名無しさん:2006/05/02(火) 00:21:20
そしてまたここに
723デフォルトの名無しさん:2006/05/02(火) 00:26:52
stringでいいじゃん
724デフォルトの名無しさん:2006/05/02(火) 01:57:27
stringだと、けつに'\0'ないじゃん
725デフォルトの名無しさん:2006/05/02(火) 01:59:28
僕の尻にも'\0'を突っ込まれそうです
726デフォルトの名無しさん:2006/05/02(火) 02:27:42
尻に\0……ネギと卵?
727デフォルトの名無しさん:2006/05/02(火) 02:38:37
>>724
c_str()で
728デフォルトの名無しさん:2006/05/02(火) 10:47:56
DebugとReleaseの違いを教えてください。
729デフォルトの名無しさん:2006/05/02(火) 10:49:02
>>728 デバッグとリリースの違いはわかるか?
730デフォルトの名無しさん:2006/05/02(火) 10:49:42
>>728
VisualStudioの話なら、該当スレへさようなら。
そうでないなら何を知りたいのか具体的にどうぞ。
731デフォルトの名無しさん:2006/05/02(火) 21:59:59
猫でも分かるWindowsを読みながら、Windows上でBCCで作っておりますが、

void sinfunc(double* x)
{
double y;
y=sin(*x);
*x = y*300;
}
という関数を使い、
WM_TIMERとWM_PAINTあたりを弄って、
初期値x=300;などで
この関数に通した後で

hBrush=CreateSolidBrush(RGB
((abs(abs(x-765) - 255) + (-1 * abs(-x + 765)) +255)/2,
(abs(abs(x -255) - 255) + (-1 * abs(-x + 255)) +255)/2,
(abs(abs(x -510) - 255)+ (-1 * abs(-x + 510)) +255)/2));

という関数を用い、正方形が様々な色に変わるプログラムを作ろうと
無謀にも思いついて作っておりますが、早速困っております
732731:2006/05/02(火) 22:04:00
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp)
{
HDC hdc; PAINTSTRUCT ps; HPEN hPen,hOldPen; HBRUSH hBrush,hOldBrush;
double x=900;//←これ追加しました

switch(msg)
{
 case WM_CREATE:
 {
  SetTimer(hWnd,IDT_TIMER1,500,NULL);//←これ追加しました
  break;
 }
 case WM_TIMER:
 {
  switch(wp)
 {
  case IDT_TIMER1:
       {
        sinfunc(&x);//←これ追加しましたが、これ1つで良いんですか?
        InvalidateRect(hWnd,NULL,true);
        break;
       }

  }
 }
733731:2006/05/02(火) 22:08:45
case WM_PAINT:
{
hdc=BeginPaint(hWnd,&ps);

hPen=CreatePen(PS_SOLID,0,RGB(255,0,0));
hOldPen=(HPEN)SelectObject(hdc,hPen);

hBrush=CreateSolidBrush(RGB((abs(abs(x-765) - 255) + (-1 * abs(-x + 765)) +255)/2,
(abs(abs(x -255) - 255) + (-1 * abs(-x + 255)) +255)/2,
(abs(abs(x -510) - 255)+ (-1 * abs(-x + 510)) +255)/2));

hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
Rectangle(hdc,10,10,100,100);
DeleteObject(hBrush);

SelectObject(hdc,hOldPen);
SelectObject(hdc,hOldBrush);

EndPaint(hWnd,&ps);
break;
}

こんな感じで追加したのですが、1回sinfunc(&x);を呼び出しただけで止まってしまうのか
色が赤から緑に1回変わっただけで終わってしまいます。
#define IDT_TIMER1 100も行頭に追加しているのですが。

このように、他の関数で値を計算してからWM_TIMERに取り出して、その後
WM_PAINTに描画させる時に、>>732のように1回書くだけで良いのでしょうか?
ご指導お願いします
734デフォルトの名無しさん:2006/05/02(火) 22:25:36
もっかいタイマーかければ?
735デフォルトの名無しさん:2006/05/02(火) 22:26:44
WinAPIスレがなかったか?
736さげ:2006/05/02(火) 23:43:42
>初期値x=300;
コールバック来たら、
>double x=900;//
>sinfunc(&x);//
だから、2回目以降はx=900という動作だから、変わらず同じでしょう。
それと、タイマーオブジェクトはいくつも作れるから(タイマーが複数動く状態)、
WM_TIMER:を受けるタイミングがごちゃごちゃになってくるから動かすタイマーはひとつで充分。
737731:2006/05/03(水) 00:48:14
>>736さん

double x;
は、最初に宣言するようにして、

LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp)
{
HDC hdc; PAINTSTRUCT ps; HPEN hPen,hOldPen; HBRUSH hBrush,hOldBrush;
x=900;

で、
case IDT_TIMER1:
{
 double* px
 sinfunc(&x);//←これ追加しましたが、これ1つで良いんですか?
 InvalidateRect(hWnd,NULL,true);
 px =&x
 x= *ps
 break;
}

と書き直したら、それっぽく動くようにはなりましたが、
これで良いのでしょうか?
738731:2006/05/03(水) 00:49:41
>>735

>>1に>エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
とありますが、私の質問はこのスレとはやはりずれるのでしょうか?
739デフォルトの名無しさん:2006/05/03(水) 00:52:29
>>735じゃないが、他にもっと適したスレがあるんだからそっちで聞けということだろ
740731:2006/05/03(水) 01:14:13
すみません、
x=900;は

case WM_CREATE:
{
・・・・・
x=900;
break;
}
と入れました。>>737の所ではありません。

これで自分が予測していた感じで動くようになりました。
皆さん、有難うございました。
741デフォルトの名無しさん:2006/05/03(水) 01:16:32
>x= *ps
もしかして、ペイント構造体の値が色変わると動くから流用したのかな?
int blinkflag=0;

case WM_PAINT:
if(flickflag==0){
 x=900;
}
else{
 x=300;blickflag=1;
}
以下ペイント

と自分ならすると思う。
742デフォルトの名無しさん:2006/05/03(水) 01:20:12
int a[2][3];
int (*p)[3] = a;
とできることをはじめて知った。
テキストには1次元の説明しかないからわからなかったよ。
743訂正:2006/05/03(水) 01:20:30
if(blickflag==0){
 x=900;blickfrag++;
}
else{
 x=300;blickflag--;
}
744デフォルトの名無しさん:2006/05/03(水) 03:31:55
>>742 で、そのポインタ型を関数のプロトタイプ宣言で引数に取ると
void hoge(int(*)[3])云々と

どう見ても肛門です
745デフォルトの名無しさん:2006/05/03(水) 07:49:29
>>742
typedef int ArrayInt[3];とおけばその宣言はこう書き換えられる。
ArrayInt a[2];
ArrayInt *p = a;
746731:2006/05/03(水) 17:22:20
731→740を更にあれこれ改良、目的に合わせ変形して、
自分が長年作りたかったものが出来ました

皆様ありがとうございました。WinAPIの質問スレで無いところに
質問に押しかけてしまった事をお詫びします
747デフォルトの名無しさん:2006/05/03(水) 23:11:21
構造体をvectorで作れるのでつか?
748デフォルトの名無しさん:2006/05/03(水) 23:31:34
そりゃもう
749デフォルトの名無しさん:2006/05/03(水) 23:39:34
STL最強ですね
750デフォルトの名無しさん:2006/05/04(木) 08:33:59
標準入力からfgetsした場合の文字コードって何になるのでしょうか?
UNIX系の環境の場合はLANGに指定されているコードと考えていいでしょうか?
Windows環境の場合はShift-JISでしょうか?
751デフォルトの名無しさん:2006/05/04(木) 08:46:24
ダンプしてみると良いよ
752デフォルトの名無しさん:2006/05/04(木) 09:42:50
>>751
詳しく
753デフォルトの名無しさん:2006/05/04(木) 09:59:38
詳しくも何も、fgets()成功してたらそのバッファをダンプするだけだろ。
754デフォルトの名無しさん:2006/05/04(木) 10:01:48
ダンプメソッドが見つかりません。
dump?
dmp?
755デフォルトの名無しさん:2006/05/04(木) 10:04:02
charの配列の内容をそのままループで出してみるだけの事だろ・・・・
756デフォルトの名無しさん:2006/05/04(木) 10:44:37
FILE * fp = fopen('yourFile", "r");
char buf[LENGTH_AS_YOU_WISH];
fgets(buf, sizeof(buf), fp);
fclose(fp);
for (int ch; * ch; ++ch) {
printf("%#02x ", * ch);
}
757デフォルトの名無しさん:2006/05/04(木) 10:52:08
つっこみどころが多すぎ(w
758デフォルトの名無しさん:2006/05/04(木) 10:59:18
C99前提だとかファイル名とかシンボル名が狙いすぎだとか?
759デフォルトの名無しさん:2006/05/04(木) 11:03:32
>757
まあそういわずにコンパイルしてみろ。
ちゃんと動くから。
何で動くかは自分で考えろ。
760デフォルトの名無しさん:2006/05/04(木) 11:37:09
intを2バイトと決めつけている点が何ともはや。
761デフォルトの名無しさん:2006/05/04(木) 12:32:09
×ちゃんと動くから。
○コンパイルエラーが発生するから。

×何で動くかは自分で考えろ。
○何でエラーが発生するかは自分で考えろ。
762デフォルトの名無しさん:2006/05/04(木) 12:57:28
>>756
動かねーぞ
てことで、Cで動く場合で手直しさせてもらったよ
#include<stdio.h>
#defineyourFile"ドライブ:/PATH"
#defineLENGTH_AS_YOU_WISH100//適宜な数字
voidmain(void){
intcch=0;
int*ch=&cch;
FILE*fp=fopen(yourFile,"r");
charbuf[LENGTH_AS_YOU_WISH];
fgets(buf,sizeof(buf),fp);
fclose(fp);
for(*ch=1;*ch;++ch){
printf("%#02x ", *ch);
}
}
763デフォルトの名無しさん:2006/05/04(木) 13:28:59
>>762
動かないし、何がやりたいか意味不明
764デフォルトの名無しさん:2006/05/04(木) 13:39:14
こっちのほうが意味が分かりやすいかもしれないな
#include<stdio.h>
#defineyourFile"ドライブ:/PATH"
#defineLENGTH_AS_YOU_WISH100
voidmain(void){
intcch=1;
int*ch=&cch;
FILE*fp=fopen(yourFile,"r");
charbuf[LENGTH_AS_YOU_WISH];
fgets(buf,sizeof(buf),fp);
fclose(fp);
for(ch=&cch;*ch;++ch){
printf("%#02x ", *ch);
}
}
765デフォルトの名無しさん:2006/05/04(木) 13:42:04
>>763
ファイルが無きゃ動かない、これ当然
766デフォルトの名無しさん:2006/05/04(木) 13:50:28
C言語ではコンパイルできない。それすらわからん馬鹿しかいなのか?
767デフォルトの名無しさん:2006/05/04(木) 14:18:48
>762,764
本筋とは離れるが、トークン区切りにタブを使うのはどうかと思わないでもない。

>766
単純な推測すら出来ない馬鹿はいるみたいだけどね。
768デフォルトの名無しさん:2006/05/04(木) 14:23:05
メモリダンプも満足に書けない様なヤシしか居ないのかよ
769デフォルトの名無しさん:2006/05/04(木) 14:38:53
すまんが764がマジで何をやろうとしているか理解できないんだが、
誰か解説してくれ。
770デフォルトの名無しさん:2006/05/04(木) 14:48:47
>>769
++chを--chに直してやってみてよ(修正)。
一見、forループはbuffとは関係ないようだけど、
bufが&chのアドレスに対してどの位置に配置されるのかが分かれば、分かるよ。
あと、Cにはやっぱデバッガが必須かな。
771デフォルトの名無しさん:2006/05/04(木) 14:52:01
>>753のプログラムを書いてたのかと思ってたが
char cchとchar buf[]の位置関係を変なやり方で調べるプログラムだったのか
772デフォルトの名無しさん:2006/05/04(木) 14:53:51
>>770
--ならまだ理解できるが、上の奴らは自信満々なのはなんでだ?
あとbufの中身をダンプしたいだけなら、そんな書き方する奴は馬鹿としか思えないんだが。
773デフォルトの名無しさん:2006/05/04(木) 14:58:48
STL以外で有益な物って何?
774デフォルトの名無しさん:2006/05/04(木) 14:59:40
>>773
もっと具体的に範囲を絞ってほしいが、STLが例に挙がるんならBoostとか
775デフォルトの名無しさん:2006/05/04(木) 15:03:33
>>773
776デフォルトの名無しさん:2006/05/04(木) 15:58:21
あーもう、>756あたりが諸悪の根源か?
>756を最低限訂正するとこんな感じ。
- for (int ch; * ch; ++ch) {
- printf("%#02x ", * ch);
+ for (int ch = 0; buf[ch]; ++ch) {
+ printf("%#02x ", buf[ch]);

>>759
決め付けはいかんぞ。

>>760
その意見も見当違いだ。

>>762>>764>>770
変に凝ろうとしてど壷にはまっている。
777デフォルトの名無しさん:2006/05/04(木) 16:03:39
>>756>>762がウンコ過ぎた、でファイナルアンサー
778762=764=770:2006/05/04(木) 16:07:05
うんこです
ありがとうございました
779デフォルトの名無しさん:2006/05/04(木) 17:20:35
C++勉強中の超初心者です。
以下のプログラムがコンパイル出来ません。
どうすればよいでしょうか、教えてください。

-------------------------------------
#include <memory>
int main(void)
{
std::auto_ptr<int> p(new int);
*p = 10;
return 0;
}
-------------------------------------
780デフォルトの名無しさん:2006/05/04(木) 17:28:33
エラーメッセージ貼らない奴には答えない主義。
781デフォルトの名無しさん:2006/05/04(木) 17:29:49
相手にはするんだねw
782デフォルトの名無しさん:2006/05/04(木) 17:52:21
780>
すいません、エラーメッセージを貼ります。
p.cppという名前で保存し、
Linux(open suse 10.0)でコンパイルしたときのメッセージです。

--------------------------------------------------
$ gcc p.cpp
/tmp/ccEClR2N.o: In function `main':
p.cpp:(.text+0x23): undefined reference to `operator new(unsigned int)'
/tmp/ccEClR2N.o: In function `std::auto_ptr<int>::~auto_ptr()':
p.cpp:(.gnu.linkonce.t._ZNSt8auto_ptrIiED1Ev[std::auto_ptr<int>::~auto_ptr()]+0x10): undefined reference to `operator delete(void*)'
/tmp/ccEClR2N.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status
--------------------------------------------------
783デフォルトの名無しさん:2006/05/04(木) 17:57:05
>>782
c++用のライブラリがリンクされてないんじゃね?
784デフォルトの名無しさん:2006/05/04(木) 17:58:50
ってか、普通g++だろ・・・
785デフォルトの名無しさん:2006/05/04(木) 18:14:09
783>
784>
g++にしたら解決しました。
皆様ありがとうございました。
786VC坊:2006/05/04(木) 18:57:39
g++ってなんだ?

787デフォルトの名無しさん:2006/05/04(木) 19:11:20
│ ≡  ('('('('A` )
│≡ 〜( ( ( ( 〜)
↓ ≡  ノノノノ ノ
788デフォルトの名無しさん:2006/05/04(木) 21:39:27
786>
g++コマンドのマニュアルによると、

名称:
g++ - GNU プロジェクト C++ コンパイラ (v2.4)

解説:
Cコンパイラおよび C++ コンパイラは統合されました。
g++ は gcc に C++を解釈するようにするオプションを
つけてコールするスクリプトです。詳細は英語版のオン
ラインマニュアルおよび gcc(1) を参照して下さい。

と書いてありました。具体的にどういうオプションかは
g++の中身をざっとみてみましたが、わかりませんでした。
789デフォルトの名無しさん:2006/05/04(木) 23:43:16
バイナリダンプのソースどこかに転がってないでつか?
790デフォルトの名無しさん:2006/05/04(木) 23:55:09
>>789
main(i,c){for(;~(c=getchar());++i>16?puts(""),i=1:0)printf(" %02X",c);puts("");}
791デフォルトの名無しさん:2006/05/05(金) 00:58:52
こ、転がってるぅーーーーーーーー
792デフォルトの名無しさん:2006/05/05(金) 09:56:02


newでの失敗の返り値って NULL でおk?
vc2005です。
793デフォルトの名無しさん:2006/05/05(金) 10:19:29
いいえ。例外が飛びます。
794デフォルトの名無しさん:2006/05/05(金) 10:37:30
new(nothrow) なら NULL が返ってくる。
new なら bad_alloc 例外が投げられる。
795デフォルトの名無しさん:2006/05/05(金) 11:52:50
A10011
A11012
A12013
と続くファイルがあって、

FILE *p;
char a[1],b[2];
int c;
char e[1];

fscanf(p,"%1s%2s%3d",a,b,&c);
strcpy(e,a);
printf("%s\n",e);

fscanf(p,"%1s%2s%3d",a,b,&c);
printf("%s\n",e);

とやると、最初はAと表示されるけど、
二度目のprintfで出力されるのがAAになってしまうんだけど、どういう理由なんでしょうか。
796デフォルトの名無しさん:2006/05/05(金) 11:58:49
>>795
配列の範囲外アクセスで妙な事になっている。
終端の'\0'を保持できるように、
char a[2], b[3];
char e[2];
とすべし。
797デフォルトの名無しさん:2006/05/05(金) 12:15:19
#include <iostream.h>

void main (void)
{
struct hoge{
long a;
char* p;
};

struct hoge* abc;
long work[2];

abc = (hoge*)work;
abc->a = 10;
abc->p = "a";

cout << work[0] << '\n';
cout << (char*)work[1] << '\n';
}
このプログラムに、文法的に危険、又は致命的な部分はありますでしょうか?
work[1]にアドレス数値入れたりして危険な香りがぷんぷんするのですが、一応動いているので
問題なければ使用していこうと思っているのですが・・・
798デフォルトの名無しさん:2006/05/05(金) 12:23:44
>>797
何がしたいのかよー分からん。
環境によってはそれで動くだろうが、
どんな環境を想定してるか、
またはなぜ hoge が直接使えないのか、
そのあたりの説明が無いと何とも言えん。

それ以前にもいろいろ言いたい事もあるし・・・。
799デフォルトの名無しさん:2006/05/05(金) 12:34:31
>>796
ああそっか。またやっちゃったよこのミス……。
ありがとう。
800デフォルトの名無しさん:2006/05/05(金) 12:39:57
>>798
ええと、環境はwindowsxpを想定しています。
具体的に申しますと、グローバルな構造体のワークエリア(上記プログラムでlong work[2]にあたります)に
構造体(上記でabcにあたります)で数値又はポインタを出し入れしたいというのが目的です。

同型のグローバルな構造体がたくさんありまして、個別にワークエリアをlongから構造体に変えたりとかは
難しい状況なので、こう苦しい書き方をしているのですが・・・^^;
801デフォルトの名無しさん:2006/05/05(金) 12:45:11
>>800
意味がよく分からんが、
とりあえず cout のところで
abc を使ってアクセスしない理由が知りたい。
802デフォルトの名無しさん:2006/05/05(金) 12:58:54
申し訳ありません、実際に使用するプログラムと上記プログラムが違っていることをお許しください。
上記プログラムは実際に使用するプログラムを簡略した書き方にしています。

ですので、上記プログラムですとabcを使ってアクセスしても構わないと思うのですが、
実際のプログラムですとworkの方でアクセスしたい、、という感じです。お手数かけます
803デフォルトの名無しさん:2006/05/05(金) 13:25:51
そんな怪しげなコードをメンテナンスしていきたいなら別にいいんでない?
或いは捨てることが判っているコードだとか。

まぁ、今後もメンテナンスしていく必要があるならやめた方がいいとは思うけどね。
804デフォルトの名無しさん:2006/05/05(金) 14:05:53
>>802
「64bit環境対象外」&「CとC++のコーディングが混ざっててキモイ」等々
嫌な感じがしないではないが、今動けば良いと割り切ってしまえるのであればOK
805デフォルトの名無しさん:2006/05/05(金) 14:14:53
RPGツクールのPNG技術をおらに分けて欲しい。ちなみにプログラム初心者。
現在DXライブラリでゲーム作ってるんだけど、ちゃんと表示されないで困ってる・・・
もしかして256色しか対応してないのかな・・・



スレ違い?(´・ω・`)
806デフォルトの名無しさん:2006/05/05(金) 14:16:45
f2cのソースリスト教えて下さい。探しても分かりませんでした。
807デフォルトの名無しさん:2006/05/05(金) 14:19:29
>>806
ぐぐれ。

>>805
聞きたいポイントがわからん。DXライブラリとやらがDirectXのことなら専用スレがある。
808デフォルトの名無しさん:2006/05/05(金) 15:36:09
これからC言語を勉強する場合、まず図書館で本を借りてこようと思ったのですが
2002〜2004のC言語の参考書って今でも通用するのでしょうか?

やっぱり最新の2006年度版を買って勉強するべきでしょうか?
809デフォルトの名無しさん:2006/05/05(金) 15:42:21
>>808
言語について書かれてある本ならば問題ない
開発環境について書かれてあるならば
その内容は古くなってるかもわからんね
810デフォルトの名無しさん:2006/05/05(金) 15:55:19
そういえば、自分の経験からいくと、
「Visual C++入門」だとか、「C++ Builder入門」だとか、
ある特定の開発環境に限定した書籍で、良書を見たことがないのだが。

言語の解説はいまいち、開発環境の使い方の解説もいまいちといった、
中途半端な本ばかりだという印象がある。
811デフォルトの名無しさん:2006/05/05(金) 15:58:34
>>809,810
ありがとうございます。
まずは図書館で、言語についての本を借りてこようと思います。
812デフォルトの名無しさん:2006/05/05(金) 16:03:32
まぁ入門書はあくまでも入門書だからな
813デフォルトの名無しさん:2006/05/05(金) 16:26:37
>>802
cout の方でも abc に相当するポインタを作って
使うわけにはいかないの?
814デフォルトの名無しさん:2006/05/05(金) 18:04:23
815デフォルトの名無しさん:2006/05/05(金) 19:22:31
ファイルサイズを得るにはどうすればいいんでしょう?
816デフォルトの名無しさん:2006/05/05(金) 19:24:02
fseek,ftell
817デフォルトの名無しさん:2006/05/05(金) 19:26:10
なるほど
818デフォルトの名無しさん:2006/05/05(金) 19:45:34
>>815
環境依存しない完璧な手段はない。
例えばsize_tが4バイトの環境で2GB以下のファイルで、ファイルシステムがサイズに関して小細工しない場合に限り、>816でできるかもしれない。
819デフォルトの名無しさん:2006/05/05(金) 20:40:27
>>818
どうもご親切に。
820デフォルトの名無しさん:2006/05/05(金) 20:41:23
バイナリデータを格納する場合はcharの配列に入れた方がいいのかな?
821デフォルトの名無しさん:2006/05/05(金) 20:54:20
お好きなように
822デフォルトの名無しさん:2006/05/05(金) 21:11:00
fstreamのオブジェクトからバイナリデータをmemcpyする事ってできる?
823デフォルトの名無しさん:2006/05/05(金) 21:45:37
自作ソフトが作りたくてVC#expressを入れたんだけど、
これってどうやってexe作るの?
[ビルド]→[newPgの発行]でひたすらOK押していったら、setup.exeってのが出来たんだけど
インストールしたりレジストリ弄ったりしちゃうんだけど…
ふっつーのVectorで配布してるようなの作る方法教えてー
824823:2006/05/05(金) 21:46:44
てか今更だけどC#ってスレ違いだったり…?
825デフォルトの名無しさん:2006/05/05(金) 21:50:14
バイナリはヘキサにして%02Xにして保管しとくと後々読み出すとき楽だよ
文字列から数字へがatoi以外知らないから、自分の場合ファイルに保管するけど、
例えば
char* a="あいうえお";
FILE *p;
p=fopen("ドライブ:/path","a");
fprintf(p,"%02X",a);
fclose(p);
わざわざファイルに保管しなくとも、文字列をヘキサなど数字で保管できる関数ややり方があれば便利だなと思うんだけど。
826デフォルトの名無しさん:2006/05/05(金) 22:15:52
>>822
memcpyなんぞいらん。fstreamからrdbuf()->sgetn()使え。
827デフォルトの名無しさん:2006/05/05(金) 22:25:03
>>823
ビデオの再生ボタンみたいなのを押すと幸せになれるよ
828デフォルトの名無しさん:2006/05/05(金) 22:34:40
>>827
ちょっとだけ幸せは得ましたが、自分だけの幸せで終わりそうです。
みんなが幸せになるにはどうすれば…?
829825:2006/05/05(金) 23:37:38
ゴメン。825じゃだめだ。
char* a="あいうえお";
unsigned int i=0;
FILE *p;
printf("%d",strlen(a)-1);
p=fopen("ドライブ:/パス","a");
for(i=0;i<strlen(a);i++){
fprintf(p,"%04x",a);a++;}
fclose(p);
です、ヘキサ保存。
830デフォルトの名無しさん:2006/05/05(金) 23:43:01
よりによってO(n²)かよ
831825:2006/05/06(土) 00:00:35
もう一箇所
a++;ではなく、a=a+2;
832デフォルトの名無しさん:2006/05/06(土) 00:17:34
・DLL
・上記DLLをロードするプログラム
って、両方ともコンパイラは同種にしないとだめですか?
それとも両者(DLL、プログラム)がANSI-C準拠のコードであれば問題なし?
833デフォルトの名無しさん:2006/05/06(土) 00:38:56
>>826
ありがとうございます。
834デフォルトの名無しさん:2006/05/06(土) 00:43:49
>>832
そもそもDLL自体、ANSI Cの規格ではない。
あとはわかるな?
835832:2006/05/06(土) 01:42:15
>>834
「あとはわかるな?」と言われても、どうとでも解釈できるような。
都合の良いように解釈すると、「コードの内容に関係なく、
MS固有仕様をサポートしているコンパイラであれば、組み合わせは何でもあり」ってことですか?
836デフォルトの名無しさん:2006/05/06(土) 02:10:21
>>835
うんにゃ、俺は別に>>834ではないが、そもそもdllやexeを
作るのはコンパイラじゃないってことはわかってるのか?
837832/835:2006/05/06(土) 02:49:52
>>836
すみません、よくわかってないです。
コンパイラで機械語に落とし込んでリンカで実行ファイルにする、ということを指していますか?

ちなみにやろうとしていることは、
リンカ機能を持つコンパイラAでDLL(hoge.dll)を作成後、
リンカ機能を持つコンパイラBでhoge.dllをロードするhoge.exeを作成しようということです。
これでhoge.exeを実行したら正常動作するのか、機械語レベルで誤動作するのか気になっています。

(でもDLLを提供しているサイトでは環境ごとにDLLファイルを分けてなかったような気がしてきました)

838デフォルトの名無しさん:2006/05/06(土) 03:07:10
>>837
>これでhoge.exeを実行したら正常動作するのか、機械語レベルで誤動作するのか気になっています。
だから、そこが根本的に間違っているんだ。
いいかね?
hoge.dllやhoge.exeが正常に(コンパイルエラーもリンクエラーもなく)作成できたなら
どんな動作結果が出ようとも、それは機械語レベルで「正常」に動作しているのだ。
そこでお前の思ったように動作しないとしたら、それはお前の作り方が間違って
いたからだ。
839デフォルトの名無しさん:2006/05/06(土) 03:52:45
何か答えてる方が無理に訳分からなくしているような。

DLLが公開する関数の、
・返値の型
・引数の数と型
・呼び出し規約
を正しく一致させて呼べば、違う言語からでも呼び出せる。
840デフォルトの名無しさん:2006/05/06(土) 04:04:09
>>839
それがわかるようなら>>832>>835>>837のようなレスが
付くはずがないんだがなあ。
841デフォルトの名無しさん:2006/05/06(土) 04:16:05
正しく設計してあることも前提だけどね。
たとえばFILE*を渡してたりするとNG。
842デフォルトの名無しさん:2006/05/06(土) 05:12:40
>>841
そりゃいくらなんでも具体的過ぎでしょ?
おいらは日常的にMSVCRT.DLLとFILE*を
やりとりしとるよ?
843デフォルトの名無しさん:2006/05/06(土) 05:54:51
俺の作ったASCII,UTF16(UTF-8未対応)
のファイルダンプのCのソース出して良い?
http://sourcepost.sytes.net/sourcepost/sourceview.aspx?source_id=27657
844832/835/837:2006/05/06(土) 06:22:54
>838-842
無粋な質問をしてしまったようで、すみません。
そもそもDLL(実行ファイル)の概念をよく理解していなかったようで、
「CでつくったDLLはCで(かつ同じ環境で)つくったEXEからしか使えない」という認識を
持っていたのが間違いの原因でした。

>>841
>正しく設計してあることも前提だけどね。
>たとえばFILE*を渡してたりするとNG。
これがNGなのはなぜでしょうか。
「FILE*を渡すこと」が正しい設計でない、というのがよくわからないのですが、
引数や返却値はint,charなどの基本型でないとだめというわけではないですよね。
もしくは上記は「違う言語から呼び出す場合(呼び出し側がCでDLLがC以外の言語)」について
言及していますか?

845デフォルトの名無しさん:2006/05/06(土) 06:58:45
ポインタがどうか判断出来ない命名が有るから気をつけろということでは?
846デフォルトの名無しさん:2006/05/06(土) 08:18:06
hint: FILE構造体は実装依存。
847デフォルトの名無しさん:2006/05/06(土) 09:29:18
EXEでnewした物をDLLでdeleteとか、その逆もダメだな。
848デフォルトの名無しさん:2006/05/06(土) 09:54:02
>>846の通り
たとえ関数の引数の型があっていてもヘッダによってメモリレイアウトや実装が違うと
そこでNGになる

C言語はバイナリのレイアウトを規定していない
FILE構造体も当然そう

バイナリレベルでの互換性がないわけ
そのためにIDL等が存在するわけだ
849デフォルトの名無しさん:2006/05/06(土) 13:57:10
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void main(void){
char* a="abcde";
unsigned int i=0;
FILE *p;
p=fopen("ドライブ:/パス","a");
for(i=0;i<strlen(a);i++){
fprintf(p,"%04x",*a);a++;}
fclose(p);
}
だとうまくファイルにabcdeのHexコードが入るんだけど、
2Byte文字の"あいうえお"とか使うと例えば'あ'は82a0hなんだけど、
ffffff82ffffffa0とかおのおの4Byteに変更されてしまう。
何か82a0になるようなうまい方法ないかな。
850デフォルトの名無しさん:2006/05/06(土) 13:58:12
charをunsigned charにしなはれ。
851デフォルトの名無しさん:2006/05/06(土) 14:06:15
>>850
それだけだと 0082 00a0 になってダメなんじゃない?
852デフォルトの名無しさん:2006/05/06(土) 14:19:43
>>850
ありがとう、その通りでうまくいきました。
他部分も手直しして、これで1Byteでも2Byteでもうまくいきました。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void main(void){
unsigned char* a="abcde";//"あいうえお"でもOK
int i=0;
int b=strlen(a);
FILE *p;
p=fopen("c:/windows/デスクトップ/h.bin","a");
for(i=0;i<b;i++){
fprintf(p,"%02x",*a);a++;}
fclose(p);
}
ありがとう、聞いて良かったです。
853デフォルトの名無しさん:2006/05/06(土) 14:55:54
>>852
"abcde" は char の配列だし、 strlen() の引数も char* だから
a の型は char* のまま、 *a を (unsigned char)*a にするのが正解。
char const* にするとなお良し(C++なら必須)。

あとは、
main の戻り値は int にしとけ。
インデントする気が無いならソース貼るのに全角スペース混ぜるな。
854デフォルトの名無しさん:2006/05/06(土) 15:38:53
コンパイラオプションで、charをunsignedにするのが常套手段
855デフォルトの名無しさん:2006/05/06(土) 15:39:57
修正しました(C,C++双方でやってみました)
#include<stdio.h>
#include<string.h>
int main(void){
const char* a="abcde";//"あいうえお"でもOK
int i=0;
int b=strlen(a);
FILE *p;
p=fopen("c:/windows/デスクトップ/h.bin","a");
for(i=0;i<b;i++){
fprintf(p,"%02x",(unsignedchar)*a);a++;}
fclose(p);
return 0;
}
あと、ファイル読み込みのほうですが、参考になるが分かりませんが一応セットで・・
#include<stdio.h>
int main(void){
char b;
int i=0;
FILE *p;
p=fopen("c:/windows/デスクトップ/h.bin","r");
while(fscanf(p,"%02X",&b)!=-1){
printf("%c",b);}
fclose(p);
return 0;
}
FILE処理失敗した場合の場合分けが双方ないのですが、
何かのネタにでもしてもらえれば幸いです。
856デフォルトの名無しさん:2006/05/06(土) 18:50:19
>>855
そういうふうに1バイトずつデータを読み書きしたいのならgetc/putcがお勧め。
857デフォルトの名無しさん:2006/05/06(土) 19:17:33
バイナリデータの入れ替えは何を使うのですか?
858デフォルトの名無しさん:2006/05/06(土) 19:25:03
キャラクタだからといって特別扱いはしてないから、そのままバイナリもいける。
859デフォルトの名無しさん:2006/05/06(土) 22:29:22
>>857 : error: too few arguments to function `入れ替え'
860855:2006/05/07(日) 00:05:51
バイナリということで、簡単なサンプルですが作ってみました。
#include<stdio.h>
int main(void){
char b=0;
FILE *p;
FILE *pcopy;
p=fopen("c:/windows/デスクトップ/internet.lnk","r");
pcopy=fopen("c:/windows/デスクトップ/internet2.lnk","w");
while((b=getc(p))!=-1){
printf("%c",b);
fprintf(pcopy,"%c",b);
}
fclose(p);
return0;
}
使い方は簡単です。適宜なディレクトリにInternetショートカットを作り、名前を
この例の場合Internetとしています。
そして、fopenのある行2つを適宜なディレクトリにして、実行すれば、ソース経由でコピペされたバイナリで新たにInternetショートカットができてるはずです。
もっと使えるものに改良してもらえればありがたいです。
861デフォルトの名無しさん:2006/05/07(日) 00:20:47
PNGのCRCをC/C++で計算するソースって転がってないですか?
862デフォルトの名無しさん:2006/05/07(日) 00:30:31
>>860
インターネットショートカットは拡張子urlだけど。
ちなみに拡張子lnkのショートカットはバイナリファイルだからバイナリモード使え。
863デフォルトの名無しさん:2006/05/07(日) 00:31:52
>860
Cの基本としてbはintで定義しようね。
あと-1ではなくEOFとの比較に。
864デフォルトの名無しさん:2006/05/07(日) 00:44:48
>>860で一つ大事なのが抜けてました。
return 0;の手前にfclose(pcopy);です。
865デフォルトの名無しさん:2006/05/07(日) 00:45:26
864より863の方が大事だと思う。
866デフォルトの名無しさん:2006/05/07(日) 01:25:01
>>861
普通にPNGのソースじゃ駄目なの?
867デフォルトの名無しさん:2006/05/07(日) 01:27:22
>>860
バイナリモードにした方が…
868デフォルトの名無しさん:2006/05/07(日) 02:15:55
透過したいならマスク、圧縮したいならRLEで十分。
869デフォルトの名無しさん:2006/05/07(日) 17:12:19
マルチポストさせていただきます。

Dllに関する質問:
Dllの作成はdefファイルを使ってエクスポートしています。
defの抜粋fnSetColor@5
void HogeHoge::fnSetColor(void){
CColorDialog *col1Dlg= new CColorDialog;
col1Dlg->DoModaltheHogeHoge.();
theHogeHoge.m_Color= col1Dlg->GetColor();

if(col1Dlg != NULL)
delete col1Dlg;
}
呼び出し側:
typedefvoid(*fnSetColor)(void);
fnSetColor pfnSetColor= NULL;

pfnSetColor= (fnSetColor)GetProcAddress(hMod, "fnSetColor");

pfnSetColor();//ここでエラー:Run-Time Check Failure #0 〜

環境:WinXPHomeSP2+ VisualStudio2005です。よろしくお願いします。
870デフォルトの名無しさん:2006/05/07(日) 17:25:41
わかった!
871デフォルトの名無しさん:2006/05/07(日) 17:35:34
こういうのはマルチ煽りとかしてもいいんだろうか
872デフォルトの名無しさん:2006/05/07(日) 18:29:44
>>869
GetProcAddressがエラーで0を返し、それを呼び出そうとしたので、
ぬるぽと化しRun-Time Checkでガッされたという状態。
C++の関数名・変数名はコンパイラによって変形される。GetProcAddressが使うのもその変形された名前。
DEFファイルでどうにかすれば名前はどうにでもなるけど、
HogeHoge::fnSetColorが非メンバなら__thiscallだからアウト。

おとなしく、グローバル関数でラッピングしろ。

extern "C" void HogeHoge_fnSetColor(HogeHoge* p)
{
  p->fnSetColor();
}
873869:2006/05/07(日) 18:51:15
>>872
GetProcAddressからは関数へのポインタが返ってきています。
#0は The value of ESP was not properly saved across a function call.
This is usually a result of calling a function declared
with one calling convention with a function pointer declared
with a different calling convention.
となっておりますので、
呼ばれる関数名と呼ぶときの関数名が違うのではないかと思うんですが?
874デフォルトの名無しさん:2006/05/07(日) 18:56:52
クラスのメンバ関数は暗黙でthisを引数に取るのに呼び出し側で渡してない。
つーかメンバ関数の意味わかってなさそう。
875デフォルトの名無しさん:2006/05/07(日) 19:43:44
char型の配列を unsigned charの配列にするにはどうすれば?
876デフォルトの名無しさん:2006/05/07(日) 19:47:27
>>875
符号が変わる場合があるわけだが、その場合はどうするつもりかね?
877デフォルトの名無しさん:2006/05/07(日) 19:56:42
>>876
全て+なのでその点に関しては大丈夫です。
878デフォルトの名無しさん:2006/05/07(日) 20:01:19
>>877
じゃぁ assert(x >= 0) を入れながらコピーすればいい。

スピードが問題になる場合で、2つの配列の実体が同じでもいいのなら
キャストを使ってコピーを省くことも可能。
879デフォルトの名無しさん:2006/05/07(日) 20:07:16
キャストの方を教えていただけませんか?
(unsigned char)としただけではエラーになるのですが。
880デフォルトの名無しさん:2006/05/07(日) 20:11:15
残念ながら
char a[10];
unsigned char b[10];
b=(unsigned char)a;
みたいなことはできないので中身を一つづつコピーしましょう
881デフォルトの名無しさん:2006/05/07(日) 20:14:07
std::copy(a, a + sizeof(a), b);
でできるわけだが。
882デフォルトの名無しさん:2006/05/07(日) 20:15:10
char a[10];
unsigned char* b;
b=(unsigned char *)a;
883デフォルトの名無しさん:2006/05/07(日) 20:15:52
>>879
本当にキャストをしたいのか?コピーでいいならコピーしとけ。
基本的に、キャストは最後の手段と考えるようであってほしいな。

char a[10];
unsigned char* const b = (unsigned char*)a;

C++ なら
unsigned char* const b = reinterpret_cast<unsigned char*>(a);
884デフォルトの名無しさん:2006/05/07(日) 20:17:56
const unsigned char * b = (unsigned char *)a;
じゃないの?
885デフォルトの名無しさん:2006/05/07(日) 20:20:48
皆さんありがとう。
>>882のでできました。
886デフォルトの名無しさん:2006/05/07(日) 20:21:07
>>884
何故constで受ける? 変更したいかもしれないじゃないか。
887デフォルトの名無しさん:2006/05/07(日) 20:22:08
>>885
意味はきちんと理解してから使おうね。
お姉さんとの約束だぞ。
888デフォルトの名無しさん:2006/05/07(日) 20:22:49
なんでキャストをデフォルトにするかなぁ?
889デフォルトの名無しさん:2006/05/07(日) 20:25:31
>>884
正直、これだけの話じゃ、constにすべかどうかさえわからない
890デフォルトの名無しさん:2006/05/07(日) 20:44:09
>877で、signed charで正数だと言ってるから大丈夫だろう。
891デフォルトの名無しさん:2006/05/07(日) 21:19:03
fscanfでファイルを読み込んで検索するwhile文作ったが、EOFに行ったきりファイルを読み込んでくれない。
ファイルポジションをファイルの先頭に持ってくるにはどうしたら。
892デフォルトの名無しさん:2006/05/07(日) 21:22:18
fseek
893デフォルトの名無しさん:2006/05/07(日) 21:24:17
freopenとかは?
894デフォルトの名無しさん:2006/05/07(日) 21:38:48
>>891
rewind
895デフォルトの名無しさん:2006/05/07(日) 21:42:01
>>891
exit
896デフォルトの名無しさん:2006/05/08(月) 00:29:36
1バイトのint型変数を作るにはどうしたらいいんですか?
897デフォルトの名無しさん:2006/05/08(月) 00:35:20
>>896
int のサイズが何バイトかは選べないよ。
898デフォルトの名無しさん:2006/05/08(月) 00:40:31
1バイトの変数の型(0〜255までの数字を扱える)を新しく作りたいのです。
899デフォルトの名無しさん:2006/05/08(月) 00:44:08
あまり見かけられませんが、構造体にはビットフィールドと呼ばれる技術があります
これは、ひとつのメモリ領域(バイト単位)に名前をつけてビット単位に振り分けるものです

ビットフィールドの作成は、構造体の生成とほぼ同じです
ビットフィールドで使われる方は、通常intまたはunsignedです(signedの場合は上位ビットが符合に使われます)

型 名前: サイズ;

型は説明したとおりです
名前にはメンバ名同様に、このビット領域の名前を指定します
サイズにはビット領域を指定します。3と指定すれば、この名前の領域に3ビット割り当てられます

このような特徴から、ビットフィールドは特定のビット数で確実に表現できる情報に用いられたりします
たとえば、boolean型の変数の作成などにはビットフィールドが有効です
1ビットの変数を生成しておけば、確実に0か1しか入りません
900デフォルトの名無しさん:2006/05/08(月) 00:50:07
wisdomさんありがとう。
901デフォルトの名無しさん:2006/05/08(月) 00:52:56
>>899
> あまり見かけられませんが、構造体にはビットフィールドと呼ばれる技術があります
普通に見かけます。貴方が低能なだけです。

> ビットフィールドで使われる方は、通常intまたはunsignedです(signedの場合は上位ビットが符合に使われます)
方→型。unsignedという型はありません。

加えて言えば、何ビットが1バイトか定義されていないプログラミング言語で
1バイトの変数を決めうちで作るのは規格にそった方法では不可能です。
902デフォルトの名無しさん:2006/05/08(月) 00:54:34
>>901
C/C++ で1バイトのビット数って CHAR_BIT じゃないの?
903デフォルトの名無しさん:2006/05/08(月) 00:58:47
ちょびっツ
904デフォルトの名無しさん:2006/05/08(月) 01:10:36
ただし、ビットフィールド自体は1ビットでも
構造体変数はunsigned(通常は4バイト)の領域であるということに注意してください
先ほどのプログラムのビットフィールドは、そのうちの1ビットなのです



意味ねぇーーーーーーーーーメモリ節約したかたのに
905デフォルトの名無しさん:2006/05/08(月) 01:13:43
>>904
char 使えばいいじゃん。
906デフォルトの名無しさん:2006/05/08(月) 01:16:17
他に方法は無いのかね?
907デフォルトの名無しさん:2006/05/08(月) 01:18:46
>>906 何が不満だ?
908デフォルトの名無しさん:2006/05/08(月) 01:22:23
>>907
もっと色々できるのかなって。この辺がC/C++の限界という事ですか。
909デフォルトの名無しさん:2006/05/08(月) 01:25:56
>>908
違う。お前の望みが不合理なだけ。
910デフォルトの名無しさん:2006/05/08(月) 01:31:00
typedef char smallInt, *smallInt;
で、おk
911デフォルトの名無しさん:2006/05/08(月) 02:22:52
それじゃ初心者には難しいですよ。これで十分。
typedef char smallint_t;
912デフォルトの名無しさん:2006/05/08(月) 02:25:23
intの多次元配列を>>910でやったらかなりのメモリを節約できた。

調子に乗って構造体メンバのintを>>910にしたら
逆にメモリ消費が増えるという?な事になったんだけど何故?
913デフォルトの名無しさん:2006/05/08(月) 02:28:35
>>908
0〜255の正数値を格納したいだけなら、unsigned charを使ってください
一般的な環境なら1byte、8bitです
あなたが意図したとおりに使えるでしょう
914デフォルトの名無しさん:2006/05/08(月) 02:33:45
>>912
アラインメントとかパディングとか
915デフォルトの名無しさん:2006/05/08(月) 02:34:22
>>912
メモリ消費は何で測ってる?
手っ取り早くソース晒せ。
916デフォルトの名無しさん:2006/05/08(月) 02:34:49
Visual C++ 2005 はC99に準拠していますでしょうか?

また、完全に準拠していないとしても、大分部の機能をサポートしているでしょうか?
917デフォルトの名無しさん:2006/05/08(月) 02:41:49
>>912
タスクマネージャ。

ソースはintとstringがごっちゃ混ぜになってる構造体。
918917:2006/05/08(月) 02:42:35
>>912じゃなくて>>915
919デフォルトの名無しさん:2006/05/08(月) 02:46:52
>>914
#pragma pack(push,1)
とかいうのを見つけた。ありがとう。
920デフォルトの名無しさん:2006/05/08(月) 02:47:40
よく開発環境で非MFCとか書いてたりしますけど
非MFCの利点とかあるんですか?
921デフォルトの名無しさん:2006/05/08(月) 02:55:44
MFC の糞仕様に悩まされなくて済む。


・・・いや、MFC の DLL が不要。
922デフォルトの名無しさん:2006/05/08(月) 03:03:33
アラインメントを制御すると64bitOSでは動かない?
923デフォルトの名無しさん:2006/05/08(月) 03:11:09
>>921
なるほど、DLL不要だからってことか
924デフォルトの名無しさん:2006/05/08(月) 03:38:59
>>921
MFCスタティックリンクすればどのみちDLL不要だが。
ファイルサイズ? そんなの気にしない
925デフォルトの名無しさん:2006/05/08(月) 07:03:47
>>916
準拠していない。ただ極一部の機能だけは(独自拡張扱いで)対応している。
構造体の最後のメンバに要素数を指定しない配列を置くこと
enumの最後におくカンマ
負の整数の除算の結果
(u)intptr_t
//単一行コメント
restrictの代わりに__restrict
後は/TpコンパイラオプションでC++由来の機能を使える。
inlineやどこでも変数宣言ができることなど。
926デフォルトの名無しさん:2006/05/08(月) 07:10:02
今気づいたけど、>>916の「大分部の機能」にわろた
だいぶんぶってどういう入力のしかたしたんだwww
927デフォルトの名無しさん:2006/05/08(月) 18:38:35
>>925
long longが抜けている。
928デフォルトの名無しさん:2006/05/08(月) 18:38:51
C99に準拠してるコンパイラ自体どれくらいあるんだろう
少なそう
929デフォルトの名無しさん:2006/05/08(月) 19:18:39
>>926
「だいぶぶ」で「ん」が抜けただけだと思われ。
930デフォルトの名無しさん:2006/05/08(月) 19:55:33
おおいたぶ
931デフォルトの名無しさん:2006/05/08(月) 20:54:23
質問です

関数のプロトタイプ宣言とは、どういうことでしょうか?
引数と、返り値の意味の説明も出来ればお願いします。
932デフォルトの名無しさん:2006/05/08(月) 20:55:50
詳しくはK&Rを読め
933デフォルトの名無しさん:2006/05/08(月) 21:20:57
関数の引数だの返り値だのの型がこうなってるんだよー、
ということだけを予め知らせるためのもの。>プロトタイプ
934デフォルトの名無しさん:2006/05/08(月) 21:24:39
ICCとGCCぐらいしかしらんなぁ<C99
935デフォルトの名無しさん:2006/05/08(月) 21:41:55
文法は覚えたけど、次は何を覚えたらいいんだろう?
936デフォルトの名無しさん:2006/05/08(月) 21:46:30
社会常識
937デフォルトの名無しさん:2006/05/08(月) 22:01:48
C++ Builder 5 を使っているんだけど・・・
date() で取得した日付を8文字(yyyymmdd)の数値に変換する方法って何かないですかね。
ヘルプとにらめっこしてみたんだけどそれらしいのが見つからない・・・
どなたか宜しくお願いします。
938937:2006/05/08(月) 22:05:47
書き込んでから思い至ったんだけど、(yyyymmdd)の数値をTDateTime型に変換するのでもいいです。
どなたか知恵を・・・
939デフォルトの名無しさん:2006/05/08(月) 22:06:29
>>937
String.Format("yyyymmdd",date());
940デフォルトの名無しさん:2006/05/08(月) 22:08:00
プラットフォームを選ばないなら
1 yyyyの値を文字列にする
2 年の文字列の前に"0"を四つ付ける
3 文字列の最後の4文字を取り出す

でいいんじゃね?mmddも同様に
941デフォルトの名無しさん:2006/05/08(月) 22:09:36
strftime
942937:2006/05/08(月) 22:49:20
>>939-941
ありがとうございます。939氏のやり方でなんとかなりました!
お手数をおかけしました。
943デフォルトの名無しさん:2006/05/08(月) 22:55:18
Visual C++でscanf_sを使っていて、それをそのまま他のコンパイラでコンパイルすると
エラーが出るのですが、これって何とかならないのでしょうか?
944デフォルトの名無しさん:2006/05/08(月) 22:55:49
標準のscanfを使ってください
945デフォルトの名無しさん:2006/05/08(月) 23:23:29
数値*数値*数値=積となるようなプログラムが解りません。SCANF関数を使うのが条件です。
946デフォルトの名無しさん:2006/05/08(月) 23:26:55
??
947デフォルトの名無しさん:2006/05/08(月) 23:48:58
948デフォルトの名無しさん:2006/05/09(火) 00:08:50
>>945
日本語でおk
949デフォルトの名無しさん:2006/05/09(火) 00:18:54
SCANFはscanfとおなじ感じでええのかなっと?

int 積, 数値;
SCANF("%d", &数値);
積=数値 * 数値 * 数値;
950デフォルトの名無しさん:2006/05/09(火) 00:28:43
????????????????????????????????
951デフォルトの名無しさん:2006/05/09(火) 00:41:42
これでいいんじゃね?
main(){ puts("数値*数値*数値=積"); }
952デフォルトの名無しさん:2006/05/09(火) 00:47:37
>>9511
それだと、SCANF関数とやらを使っていない
953945:2006/05/09(火) 00:50:20
おまえらその程度かよ。がっかりだ
もう明日から会社来なくていいよ
954デフォルトの名無しさん:2006/05/09(火) 00:52:12
今時SCANFも使えないとはなさけない
955デフォルトの名無しさん:2006/05/09(火) 00:54:58
scanf なら使えますが。
956デフォルトの名無しさん:2006/05/09(火) 01:01:43
>>953 偽物は消え失せろ。正しくはscanfです。明日〆切りなんです。よろしくお願いします
957デフォルトの名無しさん:2006/05/09(火) 01:03:35
>>945,956
宿題はこっち↓

C/C++の宿題を片付けます 64代目
http://pc8.2ch.net/test/read.cgi/tech/1146323457/

まぁその質問内容じゃ無理だろうけど。
958デフォルトの名無しさん:2006/05/09(火) 01:03:53
>>945 の言ってる事の意味が分からん。
エスパーの登場キボンヌ。
959デフォルトの名無しさん:2006/05/09(火) 01:14:32
たぶんあれだ、ある数値の3乗を求めたいんじゃないのか?
960デフォルトの名無しさん:2006/05/09(火) 01:39:29
>>958
だからスレ違いの質問に構うなって。のうたりんか君は。
961デフォルトの名無しさん:2006/05/09(火) 03:16:17
下記の関数hoge()内で文字列変数stringの領域確保を行って文字列を格納後、
仮引数で返却するようにしたいのですが、下記プログラムだとstringにNULLが返却されます。
malloc()で確保した領域は上位引数に返る際に解放されてしまうのでしょうか。

#include<stdio.h>
#include<stdlib.h>
void hoge(char *string);

int main(void)
{
char *string = NULL;

hoge(string);
printf("%s\n",string); /* nullが表示される */
return 0;
}

void hoge(char *string)
{
string = (char*)malloc(4);
string[0] = 'a';
string[1] = 'b';
string[2] = 'c';
string[3] = '\0';
return;
}
962961:2006/05/09(火) 03:17:09
>>961の「上位引数」は「上位関数」の誤りです。
963デフォルトの名無しさん:2006/05/09(火) 03:18:51
>下記プログラムだとstringにNULLが返却されます。
何も返却されていない。
964デフォルトの名無しさん:2006/05/09(火) 03:21:13
965デフォルトの名無しさん:2006/05/09(火) 10:33:37
つ参照渡しと値渡し
966デフォルトの名無しさん:2006/05/09(火) 11:56:11
>>961
  char *string = NULL;
  hoge(string); /* ここで渡しているのは NULL */

  hoge(char *string)
  {
    string = (char*)malloc(4); /* ここで書き換えているのは hoge ローカルの string */
    string[0] = 'a';

main の string を書き換えるなら、そのポインタを渡すべき。

  char *string = NULL;
  hoge(&string); /* ここで渡しているのは string へのポインタ */

  hoge(char **string)
  {
    *string = (char*)malloc(4); /* ここで書き換えているのは main の string */
    (*string)[0] = 'a';
967デフォルトの名無しさん:2006/05/09(火) 12:51:18
確保して返すタイプの関数を作るならこんなかんじがお勧め

extern char *alloc_hoge();
extern char free_hoge(char *string);
int main(void)
{
char *string = alloc_hoge(); /* 確保 */
/*いろいろ処理*/
free_hoge(string); /* 後始末 */
}

char *alloc_hoge()
{
char *string = (char*)malloc(4);
/*いろいろ代入*/
return string;
}
char free_hoge(char *string)
{
free(string);
}
968デフォルトの名無しさん:2006/05/09(火) 17:37:35
日本語を含んだフォルダやファイル名を取得したいのですが、
_wsplitpath_s を使っても取得できません。

//////////////////////////////////////////////////////
WCHAR szPath[_MAX_PATH];
GetModuleFileName( NULL, szPath, sizeof(szPath));

// フルパスを分解
WCHAR szDir[_MAX_DIR];
WCHAR szDrive[_MAX_DRIVE];
WCHAR szFName[_MAX_FNAME];
WCHAR szExt[_MAX_EXT];

_wsplitpath_s(szPath,szDrive,szDir,szFName,szExt);

// フォルダ、ファイル名取得
WCHAR szFilePath[_MAX_PATH];
WCHAR szFileName[_MAX_PATH];

wcscpy_s(szFilePath,szDrive);
wcscat_s(szFilePath,szDir);

wcscpy_s(szFileName,szFName);
wcscat_s(szFileName,szExt);
////////////////////////////////////////////////

これを出力してみると、
フォルダの先頭の方の英語の部分までの階層は表示されますが、日本語の部分からは表示されません。
どうしたらよいか具体的に教えてください。
お願いします。
969デフォルトの名無しさん:2006/05/09(火) 17:41:45
GetModuleFileNameW
970968:2006/05/09(火) 17:42:56
ちなみにVS2005のコンソールアプリなんですけど。
出力は普通に
wprintf_s(szFilePath);
wprintf_s(szFileName);
としてるだけです。
デバッガでみるとちゃんと中身は入ってるみたいなんですけど、
出力されないです。。。
971968:2006/05/09(火) 17:46:30
>>969
早速ありがとうございます。
試してみましたが結果は変わりませんでした。。
972デフォルトの名無しさん:2006/05/09(火) 17:48:40
wprintf_s("%s", szFilePath);
wprintf_s("%s", szFileName);

でどう?
973968:2006/05/09(火) 17:55:58
>>972
ありがとうございます。
それだとコンパイルエラーが出たので
wprintf_s(L"%s", szFilePath);
wprintf_s(L"%s", szFileName);
としてみました。

結果は、とりあえず出力されたという点では進展しましたが、
なんだか日本語のところは???????になってしまいました。
974デフォルトの名無しさん:2006/05/09(火) 17:58:20
あぁ、そういやそうだな。
で、何で表示されないんだろう・・・。
デバッガでは szFileName 内はちゃんとしてるんだよね?
975968:2006/05/09(火) 18:01:20
>>974
はい。
最終的にwprintf_sのところでは期待した内容になっております。
文字コードとかって関係ないですよね?
976デフォルトの名無しさん:2006/05/09(火) 18:04:25
とりあえず、

wprintf_s(L"%s", L"表示");
wprintf_s(L"表示");

は表示されるのかな?
977デフォルトの名無しさん:2006/05/09(火) 18:18:34
setlocale("")
978デフォルトの名無しさん:2006/05/09(火) 18:29:45
ああ、違う、
setlocale(LC_CTYPE , "");
か。

いずれにせよwchar_t系のコンソール出力はコード変換されてから出力されるんで
デフォルトのCロケールから適切なロケールに変更されてないと日本語は出力できないってだけ。
979968:2006/05/09(火) 18:38:16
>>976
表示できませんでした・・・

のですが、
>>977の方に教えていただいた
setlocale( LC_ALL,L"japanese");
を試したらいけました!

皆さんありがとうございました。
980デフォルトの名無しさん:2006/05/09(火) 19:10:19
>>979
ついでに、Visual Studio 2005のデフォとかlocaleとか入ってないので萎える。

#include <tchar.h>
#include <clocale>
#include <cstdio>

#include <windows.h>

void _tmain(void){

_tsetlocale(LC_ALL, _T("jpn")); // これ忘れると、NT系とか日本語ダメだよね。

_tprintf(_T("ごるぁぁもまえら\n"));

}
981デフォルトの名無しさん:2006/05/09(火) 20:53:45
GCC(MinGW)でコンパイルして、time hoge.exe とするとExeの実行時間
がわかるといわれたんだが、

real
user
sys

と3つも出てる。
すまんが、各項目の意味を教えてください。

もしくは、説明しているサイトを教えてください。

よろしくお願い致します。
982デフォルトの名無しさん:2006/05/09(火) 21:09:50
983デフォルトの名無しさん:2006/05/09(火) 21:18:13
1度関数の中で宣言した値は関数の実行が終わったらどうなるんでしょうか?
たとえば、もう一回関数を呼び出して、値を読み出したらどうなるんでしょうか?
984デフォルトの名無しさん:2006/05/09(火) 21:21:39
試してみてはいかがでしょうか。
985デフォルトの名無しさん:2006/05/09(火) 21:23:57
staticじゃない限りはアレ
986デフォルトの名無しさん:2006/05/09(火) 21:32:19
今、試してみる環境が無いんじゃないか?
987デフォルトの名無しさん:2006/05/09(火) 21:43:52
スタックが壊れてなければ同じだから、
「試してみたら?」は危険かもな。
988デフォルトの名無しさん:2006/05/09(火) 22:46:27
初心者です。繰り返し文の中で

for(i=3;i <= n; i++)
{
strcpy(rr,ss[i]);
}

って書いたらstrcpyの()の中でひっかかったんですけど、
何が悪いのでしょうか?
よろしくお願いします。
989デフォルトの名無しさん:2006/05/09(火) 22:47:21
>>988
頭が悪いんじゃね?
「ひっかかった」ってなんだよ?
990デフォルトの名無しさん:2006/05/09(火) 22:48:02
>>988
「ひっかかった」とは?
それから、rrとssの定義がないと何も言えない。
991デフォルトの名無しさん:2006/05/09(火) 22:48:49
>>988 i と n もわからん。
992デフォルトの名無しさん:2006/05/09(火) 22:50:40
俺のESPが
バッファオーバランか
文字列リテラルの領域に書き込み
だと告げています
993デフォルトの名無しさん:2006/05/09(火) 22:53:14
とりあえず次スレを待て。
994988:2006/05/09(火) 22:55:53
スミマセン。これが全文です(´ヘ`;)

#include <stdio.h>
#include <string.h>

int main(void)
{
int i,n;
char ss[80] , rr[80];

strcpy(rr,"aa");

gets(ss);
n = strlen(ss);

for(i=3;i <= n; i++)
{
strcpy(rr,ss[i]);
}

printf("%s\n",rr);

return 0;

}
995988:2006/05/09(火) 22:56:33
ひっかかったというのは、ビルドするときにエラーが出たってことです。
説明不足でスミマセンでした・・・
996デフォルトの名無しさん:2006/05/09(火) 23:06:47
何がしたいのか分かりません><
997デフォルトの名無しさん:2006/05/09(火) 23:09:40
次スレ

【初心者歓迎】C/C++室 Ver.27【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1147183708/l50
998デフォルトの名無しさん:2006/05/09(火) 23:11:04
コンパイルエラーならエラーメッセージを貼れ

あとstrcpyのプロトタイプ宣言をよく読め
999デフォルトの名無しさん:2006/05/09(火) 23:14:48
>999
1000デフォルトの名無しさん:2006/05/09(火) 23:16:10
1000 なら究極言語誕生
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。