【初心者歓迎】C/C++室 Ver.26【環境依存OK】
1 :
デフォルトの名無しさん :
2006/03/29(水) 11:59:26
2 :
デフォルトの名無しさん :2006/03/29(水) 12:54:28
新スレおめでとうございます
3 :
デフォルトの名無しさん :2006/03/29(水) 13:36:07
>1 おつ
ポインコが4ゲツ
>1 乙 >前1000 GJ
otu
VisualC++6.0でGUI作るのって…めんどくさすぎない? 当方VC6.0しか環境が無く。どうにか、これでRAD的に簡単にGUI組んでいく方法ない?
VC++Expressを入れてみるとか
IEコンポーネントはっつけてGUIデザインはHTMLで。
>>8 ごめん。せっかくだけどSP2入れれないから、俺無理だった。。。
>>9 そんなことが出来るのか。
思ったんだけど、EcllipseにGUIエディタ入れて、C++のも入れて編集したりとかできないかな
つか、VCでのGUIの組み方を親切丁寧に教えてくれてるサイトって無いものか
>>7 ツールバーとかつけるだけでも大変だけど、
それを簡単に作れるようにマイルーチンを鍛えていくのが楽しい。
>>7 ダイアログエディタはそんなに使いづらかった?
WideStudioってどうだっけ?
>>12 メニュー付きで編集できるなら良かったのだけど(ダイアログ
画像(BMP〜PSDくらいまで)を単純にファイル選択ウィンドウから開いて
加工して、プレビューで見せて任意形式で保存するようなアプリにしたいのだけど
14だけど、結局窓を開かないで
初めからダイアログボックスにメニューをつけて画像開くようにしようとおもう
ところでピクチャボックスにファイル開いて画像の表示って出来るかな
>>14 やりたいことがあるから既存のソフトウェアは。。。
17 :
デフォルトの名無しさん :2006/03/32(土) 01:56:01
基本クラスオブジェクトへのポインタを通じて派生クラスへアクセスする事があるから、 デストラクタはvirtual宣言しておくべきだと言えるのですか?
日本語でおk
19 :
16 :2006/03/32(土) 02:20:53
ブロークン日本語ですかね?
20 :
17 :2006/03/32(土) 02:21:42
16じゃなかた。(*´J`)
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を保持する方法などはありますか?
>>21 集約の関係にする。
お前はOOPのなんたるかを勉強し直せ
24 :
17 :2006/03/32(土) 03:51:45
何故デストラクタを出来る限りvirtualにした方が良いかというと、 それは、基本クラスオブジェクトへのポインタを通じて派生クラスオブジェクトへアクセスする事例を考慮しての事ですか?
日本語でおk
意味がよくわからんが、アップキャストされてるポインタをdeleteしたときに サブクラスのデストラクタを呼ぶため
27 :
17 :2006/03/32(土) 04:17:28
日本語に自信が無くなりました。。。
28 :
17 :2006/03/32(土) 04:19:40
基本クラスオブジェクトへのポインタを通じて派生クラスオブジェクトへアクセスする事を アップキャストと言うのですね。 勉強になりました^^
29 :
17 :2006/03/32(土) 04:20:52
基本クラスオブジェクトへのポインタを通じて派生クラスオブジェクトへアクセスする事を アップキャストと言うのですね。 勉強になりました^^ 独習C++では教えてくれませんでした><
>>29 アップキャストは「アクセスすること」じゃなくて、
アクセスするためにポインタや参照を変換することを言う。
31 :
デフォルトの名無しさん :2006/03/32(土) 05:54:40
なんで派生クラスのポインタを基本クラスのポインタにキャストしたのに、 そこから仮想関数呼んだらまだ派生クラスの関数の方を呼ぶんですか?
そういうことをするために仮想関数が存在する この動作が気に食わないならvirtualせずにオーバーライドしとけ
33 :
デフォルトの名無しさん :2006/03/32(土) 06:03:27
実行時にどちらを指してるか判断して、それようの方を呼ぶ機構がvirtualによるオーバーライドなのではないのですか? 今は基本クラスのオブジェクトを指してる筈だから、基本クラスのvirtualついた方を呼ぶべきだと思います><
35 :
デフォルトの名無しさん :2006/03/32(土) 06:12:49
ムキー!#><#
36 :
デフォルトの名無しさん :2006/03/32(土) 06:14:16
ポリモーフィッククラスがマスターできません><
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無しオーバーライドにすると。
>>33 >呼ぶべきだと思います><
派生クラスの関数を呼ぶためにvirtual にしてるんだから何もおかしくないだろ
42 :
デフォルトの名無しさん :2006/03/32(土) 07:26:55
そうか!virtualだからこそ、できるだけ呼び出しはリアルの方にするという事か!
43 :
デフォルトの名無しさん :2006/03/32(土) 07:32:25
ダウンキャストしても継承クラスのデータが残ってるのが気持悪いです。 キャストの仕組みが理解できてないのだと思います。
とりあえず、修飾子virtualをつけてない場合のオーバーライドの動作を理解しろ
45 :
デフォルトの名無しさん :2006/03/32(土) 08:05:47
理解しました。 vitualつけてないと、ダイナミックキャストで継承クラスのポインタを得たりしない限り アップキャストしても基本クラスの関数呼び出しです。 継承クラスのオブジェクトのポインタからダイナミックにダウンキャストした場合でも 基本クラスの関数を呼び出します。 vitualをつけると、キャストがアップダウン関わらずvirtualがついてない方を呼び出すよう努力します。
Visual C++ .NET 逆引き大全 500の極意を読んで C++の学習をしています、クラスライブラリを作って見たいのですが どういうライブラリを製作していいか思いつきません 皆さんがC++を学んだ当初どのようなライブラリを作られましたか? 題材のヒントをもらえないでしょうか
47 :
デフォルトの名無しさん :2006/03/32(土) 09:37:07
何桁でも計算できるライブラリ
内部で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の違いが分かりません><
static_cast=性的なキャスト=(;´Д`)ハァハァ
52 :
デフォルトの名無しさん :2006/03/32(土) 18:34:28
C++で、 A(char *x){.....} B(){char x[]=(..);....A(x)...} としたら、'char *' 型は 'char[]' 型に変換できない エラーになりました どうしたらいいですか
せめてC++で書けよ・・何でそんなに頭悪いんだよ・・・・・・
54 :
初心者 :2006/03/32(土) 18:41:17
>>52 char x[]
を
char* x[]
にしたら良いんじゃないの?
>>50 とりあえずstatic_cast。
それで駄目ならreinterpret_castかconst_cast。
C形式のキャストは出番無し。
(´・ω・`)ショボーン
57 :
初心者 :2006/03/32(土) 19:07:38
違うな
>>52 A(char **x){.................}
だとどうかな?
char x[]=(.........)のxはポインタポインタのレベル?だから
入れる方も**にしてポインタポインタにしないといけないんじゃないかな?
58 :
50 :2006/03/32(土) 19:08:13
>>55 intをただunsignedにするだけでもわざわざstatic_castするんですか?
>54,57 帰れ
61 :
50 :2006/03/32(土) 19:53:22
62 :
52 :2006/03/32(土) 20:02:44
あの、エイプリルフールでしたっけ?
63 :
デフォルトの名無しさん :2006/03/32(土) 20:24:41
コンテナはコンテナを格納できないのですか? 代わりにコンテナへのポインタを格納するようにするのですか?
>>63 vector<vector<int> > vv;
とかそういう事?
65 :
63 :2006/03/32(土) 20:27:30
はい
>>65 で、
>>64 のような書き方ではコンパイルエラーが出るの?
ポインタを入れたいのはなぜ?
vector<vector<int>> vv; と書いてるに一票。
>>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 の通りで普通に出来たけど
何か駄目なのか?
71 :
63 :2006/03/32(土) 20:47:59
>>66 なんだかエラーが出たような気がしないでもないから苦肉策としてです。
僕も自然な表記で済むならそうしたいです。
72 :
63 :2006/03/32(土) 20:51:18
そりゃ仕様です。 気になるなら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が文字にして表示してれる 俺、全然駄目だな・・・
式中のchar, shortは自動的にintに格上げされますが、 floatは必ずしもdoubleにされるわけじゃないですよね? K&R1版にはdoubleに格上げされるとあるようですが、 古い仕様ですよね?
79 :
77 :2006/03/32(土) 22:07:09
どうもです
80 :
初心者 :2006/03/32(土) 22:32:20
すまん、s[14] みたいなのは文字とか文字列の事か
配列のことや。
82 :
初心者 :2006/03/32(土) 23:12:27
char* s1[3]={"東京","大阪","名古屋"}; としたとき 東京の”京”の字だけ出すにはどう配列を書いたら良いの?
83 :
初心者 :2006/03/32(土) 23:25:07
ああ、この場合はs[0] ポインタの配列か
>>82 #include <stdio.h>
#include <wchar.h>
wchar_t const* s1[3] = {L"東京",L"大阪",L"名古屋"};
fputwc(s1[0][1], stdout);
"京"の文字だけ出すっていう出すの意味がわからんというか 何をしたいのかわからんが、"京"は2バイト文字なので、 s1[0][2]とs1[0][3]のchar型2つ分の内容で"京"1文字を表す。
86 :
デフォルトの名無しさん :2006/03/32(土) 23:48:03
87 :
初心者 :2006/03/32(土) 23:49:34
>>84 ありがとう
やっぱ
他の関数使わないと無理なのな
88 :
85 :2006/03/32(土) 23:53:58
89 :
デフォルトの名無しさん :2006/03/32(土) 23:55:56
文字コードによって全角文字のバイト数は異なる違う 例えばEUCだと3バイト文字がある
そういう文字コードは、wchar_tが2バイトの処理系では 扱えないっちゅうことか?
wchar_tってそういう文字コードを突っ込む型じゃないだろ!
92 :
初心者 :2006/04/02(日) 00:20:06
char* s1[3]={"tokyo","oosaka","nagoya"}; の時 s1[0]+1 s1[0][1] は同じ事なのかな?
>>92 *(s1[0]+1)
と
s1[0][1]
が同じ。
>>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 ;
95 :
63 :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 で示されとるだろうが
結局なにがわからなくて質問しにきたんだろう・・・
>>91 wchar_tのエンコーディングは何も規定されてないよ、規格上は。
Unicodeを使うのが最近では一般的だけど
そうでない実装も普通にある/あった。
99 :
デフォルトの名無しさん :2006/04/02(日) 02:16:51
cout << でコンソールに出力したら超遅くない? Cでprintfなら一瞬なのに、C++のやり方だと一文字ずつズラーっと並ぶ感じ。
100 :
デフォルトの名無しさん :2006/04/02(日) 02:28:22
ちょっと流れ切るようで申し訳ないのですが
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]の方は使わない部分は空白で埋まるわけ?
>>103 配列が静的なものか、定義するときに初期化子をつけていれば、初期値の無い部分は 0 で埋まる。
あと、文字列リテラルには書き込みできないから気をつけろ。
C言語でスクリーンセーバーを作れますか? コンパイラはBCCです。
>>106 ありがとうございます。
どこかでBCCでは作れないと聞いたので安心しました。
>>102 最適化をかければ10倍ってことはないような気がするけど。
まあ確かに C++ のストリームではフォーマッティングがやりにくいとは思う
printf流のフォーマッティングも型安全でないところとかが気に入らないけど
使いやすさでいえば確かに使いやすいしな
>>71 それってエラーじゃなくて、
デバッグ文字列が255文字を・・・とかいう警告じゃない?
#pragma で消せるはず。
>>107 >どこかでBCCでは作れないと聞いたので安心しました。
お前が心配だ。
111 :
デフォルトの名無しさん :2006/04/02(日) 04:46:22
汎用関数の型制限なんてできますか? intとfloatとdoubleのみ可能みたいな。
>>111 汎用関数って何だ?Templeteか?
せいぜいその3種類のみに特化させて、他は何も無しぐらいしかないんじゃね?
間違ってるかも知れんからあくまで参考程度にとどめてくれ
テンプレート書いて、intとfloatとdoubleだけ特殊化して その他の場合はコンパイル時にエラー起こすようにしたらいい エラー起こす手段は適当にstatic assertでぐぐってくれ
114 :
デフォルトの名無しさん :2006/04/02(日) 07:21:10
115 :
52 :2006/04/02(日) 07:54:23
>>115 VC++Expressのcl.exeだと/EHscオプションつければ警告も無くコンパイル成功
>>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()
{
//途中で書き込んでしまったorz //main.cpp #include "binary.h" int main() { hoge(0) ; //hoge<int> hoge(0.1) ;//double hoge("hoge") ;//エラー }
119 :
117 :2006/04/02(日) 10:25:18
なんかへんなヘッダが混じったけど無視してOrz C++ Template Metaprogramming読んで適当に試している最中だったんだ。
120 :
デフォルトの名無しさん :2006/04/02(日) 13:35:03
>>110 いや、お前が心配だ。
BCCはscrnsave.lidが無いから無理。
>>120 scrnsave.libはスクリーンセーバを書くときのお約束をまとめただけのもので必須ではない。
もし使いたいならmingwプロジェクトのscrnsave.cを使えばいいし。
>>120 それ猫(ryに書いてあった!
*Borland C++ Compilerにはscrnsave.lidが付属していないため、
本章(スクリーンセーバーを作る章)のサンプルコードをコンパイルすることはできません。
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 はどのように理解したらよろしか オナガイシマス
1. IUnknownクラスを継承したIEnumPStoreItemsクラスの宣言 2. HRESULTというのはtypedefされた型名 (unsigned long celt, LPWSTR * rgelt, unsigned long * pceltFetched) を引数として渡して HRESULTを返すNextという名前の関数 引数として一緒に返すってなんやねん 3. 戻り値の型がHRESULT型の仮想関数の宣言 この場合は =0; があるので純粋仮想関数
>>124 >IUnknownクラスを継承したIEnumPStoreItemsクラスの宣言
先頭に class なり struct なりクラスキーが付いてないんだから「クラス宣言」といってしまうのはちょっと
JIS 的には、クラスキーを除いた「クラス先頭部」ってところだが……
# 定義=宣言ではあっても、メンバ定義が付いているやつを「クラス宣言」と呼びたくはないなあ
ちょっと質問よろしいでしょうか。 クラスAにクラスB・C・Dをそれぞれ保持させています。 そのクラスB・C・Dでそれぞれクラスxの機能を使用したいのですが それぞれにクラスxを保持させる以外にいい方法はないでしょうか。 アドバイスをお願いします。
128 :
127 :2006/04/02(日) 21:06:30
sage禁止らしいですね。すいませんでした
>>127 それで問題ないならそれがいいだろう。何が不満なんだ?
>>127 AがXを保持し、B/C/Dはそこへの参照を保持するようにしたらどう?
131 :
127 :2006/04/02(日) 22:01:33
>>129 クラスBCD以外にも今後xを使うクラスが増える予定であるのと
クラスAも一つじゃなくて複数なのであまり効率的でないのかなとおもったので・・・・
>>130 参照を保持する・・・具体的にどう記述してよいものか判らないので簡単な例を挙げていただけないでしょうか。
すいません。 学校でプログラムを習っている学生なのですが、 上手くならなくて悩んでいます。 授業では、プログラムソースを1回づつ写すことを繰り返していて、 それを動作させるのは出来ていたのですが、 その後、急に「こういう物を作れ」「ソートを作れ」とだけ問題が出され、 全く分かりませんでした。 普通の人は、その1回で自分の物に出来てしまうのでしょうか? 写す練習を続けていても、どうせ写せても分かるようにならないんだ! という気分になり、身が入りません・・・
>>132 プログラムソースを本当に「写す」ことだけを繰り返してたんなら、
あんたプログラム向いてないよ。辞めときな。
普通は写してる途中で考える。
「ここはどういう意味か?」
「ここをちょっと変えたらどうなるのか?」
学校でプログラムを写させる時には、たぶんそういうのを期待している。
そういう考えができないなら本当にプログラムは辞めたほうがいい。
134 :
132 :2006/04/02(日) 22:38:36
>>133 なるほど・・・納得です。
確かに、ifとかを記号的に扱えれば上手くなるのかな・・・と、思うのですが、
いざ白紙の画面を見ると、何もできないんです・・・。
難しいですね。レスありがとうございます。
135 :
デフォルトの名無しさん :2006/04/02(日) 22:43:16
136 :
デフォルトの名無しさん :2006/04/02(日) 22:46:08
137 :
132 :2006/04/02(日) 22:52:22
>>135 >>136 お勧めありがとうございます。書店で見てみます。
もう少し頑張ってみます。
ありがとうございました!
138 :
デフォルトの名無しさん :2006/04/02(日) 23:01:17
VBからC++への移行しようとしているのですがまったくわかりません。 MONAOSのプログラミングに貢献したいと思っているので教えていただきたいです。
配列の定義の際に、要素を全部0にするやり方として int array[40] = {}; は邪道ですか?普通?
>>139 それ、 C だとコンパイルできないから、 = {0} にするのが一般。
142 :
139 :2006/04/02(日) 23:26:28
143 :
132 :2006/04/02(日) 23:48:17
配列って、何も入れないと0になるんですね・・・ 参考になります・・・
145 :
132 :2006/04/02(日) 23:51:28
>>145 初期化子の不足分には 0 が埋められる。初期化しないときは不定。
静的記憶域の変数なら初期化しないときも 0 になる。
>>141 の話が出ると、勘違いする初心者が多くて困る
148 :
132 :2006/04/03(月) 01:52:46
なるほど・・・どうもです
2次元だろうが3次元だろうが配列の初期化は{0}でOK
150 :
デフォルトの名無しさん :2006/04/03(月) 03:20:52
C言語に3次元配列ってあるのか?
hairetsu[z][y][x];
int a[10][10] = {{0}}; int b[10][10][10] = {{{0}}};
>>152 ぶっちゃけどちらも{0}でいいんじゃ・・・
154 :
49(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
157 :
デフォルトの名無しさん :2006/04/03(月) 14:03:38
今時の初級者用の参考書はポインタも解説してらっしゃらないんですか?
158 :
デフォルトの名無しさん :2006/04/03(月) 14:04:15
>>156 ありがとうございます。早速しらべてみます。
>>155 なんという書籍なのか非常に気になる。
ポインタを解説しないCの書籍なんてあるのだろうか。
160 :
デフォルトの名無しさん :2006/04/03(月) 14:26:11
どうせうすっぺらな知識しかない作者が書いたいまどきの書籍なのでしょう。
161 :
質問 :2006/04/03(月) 15:23:44
質問なんですが、 C言語の質問ではないのですが適切なスレがどこなのかわからないのでここに書いてみました。 Q1.Visual Studio 2003でC++でダイアログプログラムを記述しているのですが メインダイアログを表示するのにリソースビューからたどって何度かクリックしないといけないのですが、簡単に表示させることはできますか? Q2.ダイアログでプログラム作成時に常にグリッド表示にしたいのですが、「グリッド」に設定して保存しても、サイドプロジェクトを開くと「ガイドの設定」が「ルーラーとガイド」に戻って しまいます。ガイドの設定をグリッドに固定することは可能でしょうか? よろしくお願いします。
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
実話じゃん
>>165 >ニートだけならまだしもPCやってる全ての人間を馬鹿にしてるんですよ
その内容からそういう判断をするお前が人を馬鹿にしているんだよ。
若しくは、お前自身が馬鹿。
169 :
164 :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
174 :
デフォルトの名無しさん :2006/04/04(火) 08:47:00
>>173 いや、だからなぜ二個目のZが単なるリテラル
として連接されずに、展開対象になっているのかと。
gcc の 2.9.x から 3.x で挙動が変わった?
175 :
デフォルトの名無しさん :2006/04/04(火) 08:49:18
ごまん、激しくかんちがいしてた。 鬱だしのう
これはひどい
インターネッコ
180 :
デフォルトの名無しさん :2006/04/04(火) 12:01:29
複雑なファイルはCでは どう読みこめば? あかさたなはまやら というファイルから かさた、まや だけ読み込んでcharに 置き換えるにはどうすればいいのでしょう?
>>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 どういう条件で
かさた、まや
だけが抜き出されるのか?
をコンピュータに説明すればいい。
そういやマルチバイト文字1文字を表すときどうやんの? char ch ='あ';だとコンパイルエラーだし
マルチバイトって時点で一文字とかそういうの超越してる。
そういえばおれもロケールの扱い方はイマイチだ・・・orz 5冊C++の本あるのにstd::localeのこととか、どれにもほとんど載ってねー 買う本間違ったかな・・・、それとも足りないかな・・・ まあ、ぐぐればそれなりに出てくるみたいだけど 以上チラシの裏
186 :
デフォルトの名無しさん :2006/04/04(火) 13:52:00
>>182 それが難しくて出来ないんです
単にfscanfを利用してもできませんし…
>>186 ワイド文字を含むテキストファイルから、例えば任意のn番目にある文字を知りたい
みたいな感じ?
188 :
デフォルトの名無しさん :2006/04/04(火) 15:04:47
勉強し始めのド低脳な質問かもしれないけど お願いします。 金額を入力して、割引した額を表示させるプログラム を作ったのですが printf("一割引の場合\n%d円\n",(int)(a*0.9)); この行の(int)(a*0.9))の(int)がなぜ必要なのでしょう? 実際無くしてやってみたら全部計算結果が0になってしまった のですが。
int型の整数(この場合a)に小数点ありの実数(0.9)を掛けると int型は自動的にdouble型やfloat型などの浮動小数点型に”格上げ”されてしまうため、 (int)でint型にキャストして表示してる
190 :
デフォルトの名無しさん :2006/04/04(火) 15:12:15
>>189 ということは、5とか6とか掛けるなら
このintはいらない、ってことですね。
アリガトウございました。
>>183 、--‐冖'⌒ ̄ ̄`ー-、
/⌒` 三ミヽー-ヘ,_
__,{ ;;,, ミミ i ´Z,
ゝ ''〃//,,, ,,..`ミミ、_ノリ}j; f彡
_) 〃///, ,;彡'rffッ、ィ彡'ノ从iノ彡
>';;,, ノ丿川j !川|; :.`7ラ公 '>了 なにジョジョ? マルチバイト文字一文字が表せない?
_く彡川f゙ノ'ノノ ノ_ノノノイシノ| }.: '〈八ミ、、;.)
ヽ.:.:.:.:.:.;=、彡/‐-ニ''_ー<、{_,ノ -一ヾ`~;.;.;) ジョジョ それは「一文字」と考えるからだよ
く .:.:.:.:.:!ハ.Yイ ぇ'无テ,`ヽ}}}ィt于 `|ィ"~
):.:.:.:.:|.Y }: :! `二´/' ; |丶ニ ノノ 逆に考えるんだ
) :.: ト、リ: :!ヾ:、 丶 ; | ゙ イ:}
{ .:.: l {: : } ` ,.__(__,} /ノ 「2バイトだから文字列だ」と
ヽ ! `'゙! ,.,,.`三'゙、,_ /´
,/´{ ミ l /゙,:-…-〜、 ) | 考えるんだ
,r{ \ ミ \ `' '≡≡' " ノ
__ノ ヽ \ ヽ\ 彡 ,イ_
\ \ ヽ 丶. ノ!|ヽ`ヽ、
\ \ヽ `¨¨¨¨´/ |l ト、 `'ー-、__
\ `'ー-、 // /:.:.} `'ー、_
L なしで UTF-32 はねーよ。UTF-8 なら分かるが。 SJIS にしろ EUC にしろ UTF-8 にしろ、 どちらにしろ文字列だな。
194 :
デフォルトの名無しさん :2006/04/04(火) 21:07:08
>>183 Shift-JIS環境などでは通る。
>>186 > それが難しくて出来ないんです
まず、条件をまとめろ。
話はそれからだ。
そもそも、人に説明できない事を、
コンピュータに命令出来ると思ってるのか?
抜き出したい各文字がどういう条件で抜き出されるのか、
もう一度よく整理するこったな。
wchar.hっていつできたの? 最近のC言語の本でも載ってないのけっこうある。 標準だよね?
それってwchar_t型の話では? stddef.hの・・・
wchar_tはC89からあるだろ。
>>199 int* ptr();
こう書いたらわかるか。
>>199 int *ptr(); /* 宣言 */
int *ptr() { return NULL; } /* 定義 */
int * ptr() { static int forex = 10; return & forex;//int へのポインタ }
>>199 ついでに言えば、
int * ptr() = NULL;
はエラー。
int (* ptr) () = NULL;
は合法。
分かりました。 どうもありがてれう。
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++){ } と展開してくれないかな?
for(A;B;C) { 〜 } ≒ A while(B){ 〜 C }
>>205 それ、山田オルタの宇宙語デコーダだろ?
208 :
デフォルトの名無しさん :2006/04/05(水) 04:03:51
CInternetSessionでとってきたソースがEUCで書かれているのですが、 これをCStringに読めるようにする方法、ありますか? VC++.NET MFC SDIです。宜しくお願いします。
ありますよ
ConvertINetMultiByteToUnicode
211 :
デフォルトの名無しさん :2006/04/05(水) 08:50:25
質問です while(1){ printf("hello\n"); } というプログラムを実行すると hello hello .....と続くじゃないですか、 一回一回のループでコマンドプロンプトに出力された結果を消去したいんですが・・ つまり hello が一回だけ出力されるようにしたいんですが・・ while使うなって思うかもしれませんがどうしてもwhileはまわしたいんです。 誰か、教えてくださいお願いします
#ifdef WIN32_ system("cls"); #else system("clear"); #endif
213 :
デフォルトの名無しさん :2006/04/05(水) 08:59:00
>>212 さん
助かりました。ありがとうございます
>>211 1行だけしか出力しないなら\rって手もある
printf("hello\r")にすればカーソル位置がhに戻るから上書きされる
進捗度表示するのとかに使えるな
ま、長くなって改行すると破綻するけどね。
>183 デフォルトの名無しさん 2006/04/04(火) 12:51:18
> そういやマルチバイト文字1文字を表すときどうやんの?
> char ch ='あ';だとコンパイルエラーだし
>194 デフォルトの名無しさん 2006/04/04(火) 21:07:08
>
>>183 > Shift-JIS環境などでは通る。
文字列の配列(char**)を動的に確保したいんだけど、 どうしても下の箇所でエラーが出る よくよく考えればサイズの分からないものを確保しようとして失敗してるってわかるんだけど、どうにかならないかな ファイルから文字列を読み込み、rand()%numで文字列配列内の要素にランダムにアクセスしてそれを出力するプログラムです ReadFile(char**& urllist, int& num) { /*・・・・・・・・・・・・・・・・・・*/ strlist = new char*[num]; /*・・・・・・・・・・・・・・・・・・*/ }
>>217 ・std::vectorを使う。
・関数I/Fを見直す。
・newを使うという発想の愚かさに気づく。
222 :
デフォルトの名無しさん :2006/04/05(水) 12:02:04
まったくの初心者なのですが、つい最近からC言語を勉強しようと思って コンパイルをDLしたのですが、MS-DOS窓というのがどこにあるのかまったくわかりません。 C言語の初心者サイトなどを一応見てみたのですが書いていなくて、くだらない質問だとは思いますが教えてください。
スタート->ファイル名を指定して実行に「cmd」って入れて出る窓のことをDos窓と言う コマンドプロンプト。
C言語でさっき、char型の変数に0x80をしまい printf("%d");で中身を確認した所-128と言う値が出力されました 0x70で1120 0x01で10が出力されたのですが、なんでですか? 単純に変数の型と%dの形式があってないからそのような出力がされただけで 実際に変数の中身は代入された値がしまわれているのでしょうか?
あなたの環境ではcharは2の補数の符号付整数だから。
>>225 御回答ありがとうございます。
じゃあunsigned charにすれば問題ないですね
227 :
デフォルトの名無しさん :2006/04/05(水) 12:32:14
>>223 教えていただいてありがとうございます。
cmdでいいならなんでDOS窓なんて言うんでしょうね・・・。ずっと探してましたよ・・・。
228 :
デフォルトの名無しさん :2006/04/05(水) 12:34:56
>>227 プログラムの前に、コンピュータの一般的な基礎知識から勉強しろよ。
230 :
デフォルトの名無しさん :2006/04/05(水) 13:41:54
>>227 ここはPG初心者歓迎であってPC初心者は受け付けてないのだぜ
とっとと帰るんだぜ
command.com と cmd.exe は違うと、 嫁が言ってました。
int func(){ for(int i=0;i<20;i++){ hoge(i); } return; } iの寿命がfunc関数内ではなく、for内だけにする設定って、VC++6.0ではどうやるんですか?
forの中で宣言したものはforの中でしか使えない
VC6だとその設定はできなかったような。
>>232 #define for if(0); else for
>>237 VC6が、というか、標準化の中で
そういう風に明確に規定されるようになったんじゃないかな。
VC6が出たのは98年のC++標準が出た直後だったと思うが ドラフト無視して作っただけじゃないかな
いや、一応VC++6.0にもifのスコープを標準準拠にするってオプションあるはずだが。 大量にコンパイルエラーになるコードがあるから標準ではOFFってだけじゃなかったか。
だから VC++ 6.0 にそんなオプションないってば
C++標準前に作ってたんだから、VC6にそんなオプションあるわけないじゃん。 だから、VC7でオプション作って、互換性のためにデフォルトでオフにしたんとちゃうん?
つーか初期化子はforループの外に書けwそれで解決www
246 :
232 :2006/04/05(水) 16:59:25
235でやってみます。
いいぞ、やれ、もっとやれ。
>243 /Za ただし、Windows.hでエラーが出るようになるが(w
VC++6.0だとMS拡張を全部切らないと無理だよな。
250 :
デフォルトの名無しさん :2006/04/05(水) 22:31:35
USBに接続するタイプのゲームコントローラで操作できるプログラムを作っているんですが、 肝心のコントローラからの入力をどうやって処理したらいいかわかりません。 ウインドウメッセージで WM_DEVICECHANGE というのがあったので検知できるかと思ったのですが コントローラのボタンを押しても wParam に何も入りません。 USBとかからの情報を扱えるウインドウメッセージは他にありませんか?
仮想関数をオーバライドする際、基底クラスのpublicな仮想関数を 派生クラスではprivate関数としてオーバライドできるって、 何かおかしくないですか?オーバライドする際、アクセス指定は 一致させる必要ないですよね? そうすると基底クラスのポインタ経由で派生クラスのprivateな関数 呼び出せちまいますよね。継承自体がprivate継承なら基底のポインタに 派生のポインタ代入するとコンパイルエラーになるようですが。。。 (それともこれって標準規格では違うの?俺のコンパイラだけ?)
>>252 その動作で規格どおり。そんな規格になってる理由は知らない。
>>252 おかしい。
おかしいので仮想関数はpublicにすべきではない
ということになっている
NVIがgotwに載ったのがなんと5年前だ
5年間一冊も本を読んでいない
>>256 のような
上司あるいは同僚は本当にいるのだ
>>252 継承自体いい加減な機能なんだからほどほどにしとけw
>>252 逆に考えてみろ。
基本クラスでpublic公開されてるものをオーバーライドする訳だから
派生でprivateする事の方がおかしい。
261 :
252 :2006/04/06(木) 09:24:15
レスどうもです。 そうですか・・・わかりました、ほどほどにしておきます。
>>260 おかしいことをしてるのにコンパイルエラーも警告も出ないのはどうなんだってことでしょ
文法的には問題ないからな。
あ? ある人間が今までホームページでタダで公開していたエロ画像があったとしよう。 しかしそのホームページの管理者の考えが変わりエロ画像が有料化してプライベートになることはよくあることだ。 なにもおかしなことではない。
>>266 その例えなら
アクセス方法によっては依然ただで見放題ってのが問題なわけで
そこを塞いでないのは何か意図した使い道があるのか?ってことではないかと
>>267 ユーザーの良心を信じるってことじゃね?
できるのとやるのはちがうのではなかろーかと。
普通、virtualな関数のアクセスを変更したりしないと思われ。
>>268 >普通、virtualな関数のアクセスを変更したりしないと思われ。
そういうプログラマのミスにエラー出すなり警告出すなりするのがコンパイラの仕事なのでは?
なんかこれを利用したテクニックがあったりするのかな?
>>269 文法誤りや規格書でダメと規定されてる事にエラーや警告を出すのは
コンパイラの仕事だが、そうでないことにまで警告を出す義務はない
そこはLintの仕事
goto 254;
>>254 >そんな規格になってる理由は知らない。
ようするにこれが知りたいのさ
D&Eのどっかに書いてあるんじゃね? 探すの面倒だけど。
昔はvirtualがなかった 派生後のクラスでオーバーライドした関数にアクセスさせたくなかった ダウンキャスト後のことまではしらね 以上
>>272 Stroustrupに聞いてみたらいいんじゃね?幸いまだご存命中なんだし
質問 こんな↓感じでクラスの中に構造体を入れてみたんだが 問題ないですよね? また、この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 } ; }; };
>>276 >「このクラスの関数内でしか、定義できない構造体である」
の意味がわからんが、publicだからHOGE外でも
HOGE::D3DSPRITEVERTEX aaa;
と使うことが出来る。
>>277 なるほど。
じゃあ、privateなら、完全に隠蔽できること?
いえすきりすと
281 :
52 :2006/04/06(木) 23:59:59
BCCに詳しいかた
>>115 をどうしたらコンパイルできますか
>>281 ソース修正したらコンパイルできたよー。
これって+の中に数字が入るの?
何のプログラム?
すっごく基本的なんですが… char *a = new char(0xff); char *a = new char [100]; これをドッキングさせたいんですが、どうやればいいですか? 引数付きコンストラクタしかないクラスを 大きさが変わる配列にしたいのにどうやってもエラーが… orz...
>>283 無理。std::vectorやplacement newやstd::uninitialized_fillを使うべし。
>>283 > 引数付きコンストラクタしかないクラスを大きさが変わる配列に
std::vector<boost::shared_ptr<Hoge> >
boost::ptr_vector<Hoge>
など
つまり、配列のポインタを作って一つづつnewするって事ですか aa[i].bb(); って感じで書いちゃってるから置換せずやりたかったんですが… ピリオドをオーバーライドした方が簡単?
>ピリオドをオーバーライド >ピリオドをオーバーライド >ピリオドをオーバーライド >ピリオドをオーバーライド >ピリオドをオーバーライド
自己レス… ごめんなさい、忘れてください…orz... コンパイルせずに一気に書くなんてアフォな真似はやめよう…
managed C++なんですけれども、クラス配列の作り方がわかりません。 __gc class Data{ String* name; }; main(){ Data* dat __gc[] = new Data* __gc[10] dat[0]->name = "test"; } だと「オブジェクト参照がインスタンスに設定されてない」と出ます。 どうすればできるのでしょうか?
どうしても Managed C++ じゃないとだめ? C++/CLI じゃだめ?
>>290 当方、VC++ .NET 2003を使っておりますので・・・
managed では無理でしょうか?
>>289 datはDataへのポインタの配列だから
各要素もnewでオブジェクトを作ってやらないといけないと思う。
たぶんこんな感じ。
Data* dat __gc[] = new Data* __gc[10]
dat[0] = new Data;
dat[0]->name = "test";
C言語で長さ制限無しで一行入力するイディオムってありますか?
C言語で、長さの制限無しに 標準入力から一行入力するイディオムはありますか?
先生!イディオムってなんですか!
慣用句
scanf("%s", str); 制限はない。オーバーしても知ったこっちゃないが。
スペースランナウエィ
299 :
289 :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 ); とすれば正常には動作したのですが、もっと素直な書きかたがありそうです。 よろしくお願いします。
>>300 boost/shared_ptr.hppより
shared_ptr::shared_ptr(): px(0), pn() {}
すみません、インラインアセンブラを書く場合 コンパイラによって描き方が違うらしいのですが ボーランドのBCC5.5の場合どのようにすればいいのですか? あと、コンパイラごとにインラインアセンブラを描きたいのですが なにを #if defined すればいいのでしょうか?
>>302 asmで括れ。
BCC -> __BORLANDC__
VC ->_MSC_VER
GCC ->__GNUC__
インラインアセンブラってことは組み込み系ですかね? だとしたら #if defined(_SH) #pragma inline_asm(関数名) #endif とかあるでよ。
305 :
300 :2006/04/08(土) 14:54:16
>>301 ありがとうございます、解決です。ってそりゃそうだわなorz
>>297 オーバーしないように
数万バイト確保したchar配列に読む
…くらいは思い付きましたが
それって無駄な領域食い過ぎの気がして。
多分mallocやrealloc使うんだろうなぁ
…くらいは判るんですが
どうにも良いやり方が分からなくて相談しました。
うーん、とりあえず適当にやってみるか…
>306 数万バイト確保しても 数万バイトより大きい入力をつっこまれたら溢れる まあ素直に #include <stdio.h> char buf[BUFSIZ]; /* BUFSIZで足りないようなら適宜変えるか設計を見直す */ fgets(buf, sizeof(buf), stdin); で
>>294 mallocで適当な大きさのバッファを確保して、
足りなくなるたびにk倍(普通は二倍)の大きさにreallocする、という手がある。
あるいは、固定長の文字列を要素とするリンクリストを作りながら読みこみ、
読み終わったところで全体を別の場所にコピーする、という方法もある。
C言語とC++で、文字定数(例えば'a')のサイズをsizeofではかると、 C言語ではint型サイズに、C++ではchar型サイズになるようですが、 サイズ自体が変わったのでしょうか? それともC言語の場合は、sizeofが適用される前に、int型へ格上げ されてるというような(あるかないかわかりませんが)、仕様の違いでしょうか?
>>309 文字定数の型が変わった。
Cではint
C++ではchar
そもそもなんでchar が文字定数の方じゃなかったんだろうなぁ。
Cにsigned/unsigne char, signed/unsigned shortの右辺値は存在しないから文字定数の型はintになった。 C++では多重定義するとき、文字定数がcharでないと不便だから、上記の型の右辺値も存在することになった。 D&Eには、文字定数がintではcout << 'a';というコードが 画面にaの文字コードを出力することになってしまうので文字定数をchar型にした、という話が載っている。
ではC++では、charからintへの格上げってされないの?
>>313 されるよ。格上げ以前の値を使うこともできるだけ。
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 など)、色々と複雑っぽいです。 どのようにするのが一般的でしょう? よろしくお願いします。
318 :
316 :2006/04/09(日) 12:12:26
>>317 あれ・・・検索ワードが悪かったようです。ありがとうございました。
template <???? T> の????は、classとtypenameと、どっちが主流なんですか? タイピングの楽さはclassだけど、意味的にはtypenameのような 感じですが・・・。
禿も好きにしろ、どっちでもいいってんだから好きなほう使え。
だから禿てないって
えっ? 禿げてるよ?
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); 以下略
324 :
323 :2006/04/10(月) 01:53:13
一応環境はWin32ですけど、 コンソールアプリケーションで同じ事やっても同じエラーが出ます。
>>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になるんだな。
>>323 後そのコード、何のためにLPTSTRを使っているのか、さっぱりわからない。
MessageBoxの第三引数に、確実にマルチバイトを渡してしまっているから。
ごめん。 /Zc::wchar_tを指定してなかったOrz
>>325 なるほど…
確かに、WINAPI修飾子だと__stdcallの設定なのに、
TFUNCが__cedclになってます。
…
typedef LPTSTR (*TFUNC)(int, LPTSTR);
をどのように変更すれば、_stdcallにできるのですか?
LPTSTRを使っているのは特に何も考えていないです…
最初は普通にchar *使っていたんですが、
読んでいた本と助言でLPTSTRを使えといわれて、こちらを使っているだけです。
一応Unicodeになったときのことも考えておけとのことで(あんまりよくわかってないんですけれども)。
329 :
328 :2006/04/10(月) 03:03:35
typedef LPTSTR (WINAPI *TFUNC)(int, LPTSTR); こんな感じで大丈夫ですか?
330 :
325 :2006/04/10(月) 03:14:10
>>328 もしその本が、マルチバイト文字とワイド文字を考慮しろといいながら、
文字列を_TEXT()とか_T()マクロなど包んでいないなら、読む価値はない。
関数ポインタのtypedefはそれでいい。
あと、関数ポインタの宣言がややこしかったら、こんな方法もあるにはある。
typedef LPTSTR WINAPI FuncType(int, LPTSTR) ;
typedef FuncType *FuncPtr ;
>>330 元の文字がそれぞれの文字コードに対応させてなければ意味がないんですね…
全然そんなこと考えてませんでしたil|i
typedefがどうなっているのか分かっていなかったので、助かりました。
ご教授して頂き、どうもありがとうございました。
//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は使えないの?
恐ろしいことに気づいた。 using namespace std;してない。
main() { char *str ="abc"; printf("%s\n",str); } これってどこか問題有りですか?
>>334 あまり誉められた書き方とは言えないが、
それをコンパイルして作られたプログラムは問題なく実行できる。
>>335 >>336 ありがとう。
main()
{
char *str;
str = "abc":
printf("%s\n",str);
}
これだと危険になるんですか?
は?
341 :
338 :2006/04/10(月) 23:47:49
ごめん。ほんと。俺が悪かった。ごめん。
>>337 危険じゃないが、
main()
{
char str[4];
str = "abc":
printf("%s\n",str);
}
とか
main()
{
char str[] = "abc":
printf("%s\n",str);
}
の方がいいんじゃないかなぁ。
>>342 main()
{
char str[4];
str = "abc":
printf("%s\n",str);
}
つーかconst使えよ
int main() { const char *str = "abc"; printf("%s\n",str); return 0; }
つーかstatic使えよ
int main() { puts("abc"); return 0; }
>>333 ヘッダで using namespace するやつは腹を切って死ぬべきである。
351 :
337 :2006/04/11(火) 07:14:03
参考になりました。 ありがとうございました。
char str[] = "abc"; char str[4]; strcpy(str, "abc"); どっちでも、同じといっちゃ同じだが前者のほうがはるかに良い
>>352 うん。
まああの例だと、わざわざコピーする意味もないけど。
ヘッダで using namespaceしないやつは時代遅れ
なんだ、基地外か
>>355 本物の基地外は決して自分を基地外とは思わないって知ってるか?
まぁ using namespace もいいとおもうけど、 ピンポイントで using mynamespace::myclass; みたに爆撃するのもいいと思うよ。
namespace kitigai
{
>>355 }
using namespace kitigai;
namespace
{
namespace kitigai
{
>>355 ;
}
}
ヘッダで using namespace なんてするなよw
漢ならC++標準のヘッダを書き換えろ
なんか sin とかってグローバルな名前空間で 宣言されている気がするのは俺だけ?
math.hのsin関数か?
Visual C++なんかの<c〜>は規格での規定とは逆に、 <〜.h>をインクルードして、std名前空間の中で、using ::hoge;のようなことをしている。
#include <cmath> ってしてるのに
グローバルな sin() 関数が見えるのは規格違反?
>>366 みたいに using ::hoge; なんてやると、
グローバルにも hoge は見えてるんだよね・・・
368 :
デフォルトの名無しさん :2006/04/11(火) 23:19:29
C、Winのユーザー関数の引数の順番を 決めるいい方法は無いですかね。 もちろん、どんな順番でも可変個引数以外なら 問題ないんですけど、関数名と同じく迷ってしまいます。 何か、法則みたいなのがあるといいんですが。
>>368 Winって言うから、__fastcall使うとして。
そうすると、レジスタ渡ししたいモノを先頭(だったかな)にまとめるといいかもな。
371 :
368 :2006/04/11(火) 23:30:19
そんな難しい意味じゃないです。 ただ、環境がWindowsって意味です。
>>368 俺はとりあえず次の2つを守っている。
入力の引数同士、出力の引数同士は混ぜない。
ハンドルなどのように、クラスだったら(呼んだ関数の先で)thisに相当するような引数は第1引数に持ってくる。
俺は自分で作った関数でも間違えて引数を渡してしまったりする。 たとえば学生番号と年齢を与えるようなときに、 どちらも整数だから void func(const int age, const int number); なんてプロトタイプ宣言していると間違えても気づかないことが多い。 なので、 BOOST_STRONG_TYPEDEF (とそれを自分で改造したマクロ)で 紛らわしいものは型付けしてミスを防ぐようにしてる。
>>367 Cのヘッダを非推奨にしたのはやりすぎだったと標準化委員会も反省しているようだ。
375 :
368 :2006/04/11(火) 23:53:38
ありがとうございます。 ある程度、ライブラリ関数に似た用途のがあると それに似せる事が出来て楽なんですけど。 例えば、ビットマップを透過して表示するユーザー関数なら、 BitBltをベースにして、その先画像、元画像の後に マスク画像を同じような感じに続けています。 その教えていただいた方法も、ライブラリ関数の形に 何となく合致している部分がありますね。 一つ目にHDCとかが来ることが多いですし、 入力、出力ではないけど、先画像、元画像とまとまっていますし、 それによって、引数の型の並びの所々違う型が入る事で、 引数の識別するアクセントになりますし。
>>368 buf1にbuf2をxサイズ分コピー memcpy(buf1, buf2, size)
処理の内容を言葉に置き換えればいい
377 :
368 :2006/04/12(水) 00:09:24
>>376 ありがとうございます。
引数が少ない場合はシンプルでいいと思うんですけど。
ただ、多い場合でも、迷った場合は、そのシンプルベースで
始めに決めてしまったやり方で行くのも手かもしれません。
378 :
355 :2006/04/12(水) 02:14:19
>>356 -
>>362 釣れた釣れた
やってみるもんだな
ヘッダで using namespaceするわけないじゃん
ば〜〜〜〜〜〜〜か
>>379 namespace が何のために使われるのか知っていればほとんど自明。
まぁヘッダの中で、あるネームスペースの中で 別のネームスペースを using するんなら有りだろうけどなぁ。 namespace NS1 { using namespace OtherNS; } みたいにさ。
ヘッダでusing namespaceするのは良くないと思うが、 やったからといって名前空間の利点がなくなる訳じゃないだろ。
namespace は閉じていない。あとでいくらでも宣言を追加できる。 そのため、将来の変更やヘッダの組み合わせによっては曖昧な名前を生み出す可能性が有る。 それでも、 using namespace が原因だとわかったら削除すればいいんだが、 ヘッダでやられると問題が発生したときにユーザー側で回避する手段が無い。 しかも using namespace が本当に必要に迫られることは決して無い。 フルで修辞すればいいんだから。 確実な回避策があるのに、深刻な問題を起こす可能性をヘッダに埋める道理は無い。
384 :
315 :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);
冗長すぎ。これで十分 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);
C99でint32_tなどのサイズ固定の整数が定義されましたが、 floatについてはこのようなものはないのでしょうか?
クラスBはクラスAを継承していて、Aの仮想関数func()をオーバーライドします。 このとき、Bのfunc()の中でAのfunc()(オーバーライドされてないもの)を 呼び出したいのですが、どう書けばいいですか?
A::func()
390 :
384 :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>(); };
>>391 テンプレートの定義はほとんどヘッダでやる必要がある。超 FAQ だから適当に探せ。
foo.cpp のテンプレートの定義は、単なる定義で、 テンプレートインスタンス=コードが生成されていないから。 main.cpp は int で特殊化された foo のインスタンスがリンクされることを期待している。
export使えるコンパイラってある?
>>391 まあ、翻訳単位が違っても、コンパイルできるようにするキーワードは、規格にはあるんだが。
実際、サポートしているコンパイラは少ない。
特にVC6でテンプレートなんてお察し
明示的にインスタンス化するという方法はある。
//=============foo.cpp==============
template class foo<int> ;
template class foo<short> ;
//以下、インスタンス化するすべての型について、明示的にインスタンス化していく。
実際、コピペの必要ない、文法上安全なマクロという気しかしないが。
インスタンス化できる型を制限したいときとかもいいのかな。
>まあ、翻訳単位が違っても、コンパイルできるようにする >キーワードは、規格にはあるんだが。 あれ、そんなのあったんですか。
export
ああ、
>>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] */ ); のような関数をつくりたいということになります。 よろしくおながいします
1.SystemTimeToFileTimeでFILETIMEに変換 2.FILETIMEに対して演算 3.FileTimeToSystemTimeでSYSTEMTIMEに戻す
エラー処理を無視するとこんな感じ? 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); }
404 :
391 :2006/04/13(木) 12:57:24
>>401 標準だとmktime()とlocaltime()じゃないかな。
値の範囲が正しくない場合 mktime() は正規化するって
規格で読んだ気がする。
406 :
デフォルトの名無しさん :2006/04/13(木) 15:45:43
>>402-403 どうもありがとうございました。
これの動作確認ができました。
閏年の2/28や2/29に関しても、日をまたぐようにしてテストをして
みましたが問題ありませんでした。
どうもありがとうございました。
>403 __int64 ft=0; SystemTimeToFileTime( (FILETIME*)&ft); ft += dwLateTime * __int64(10*1000*1000); (略) でいいきもする。
> __int64(10*1000*1000) 10ll * 1000 * 1000でいいと思う。 10llがだめなら10i64で。
ポータビリティを考えると、__int64はint64_tとかでtypedefできるけど、 サフィックスのllとかi64はtypedefで解決できないからだめ。
ならキャストを使えばよい。
403->407->408->410の流れ
エディタの検索機能に正規表現の機能を付けようと考えています。 後ろから(下から上)検索させる所で躓きました。良い方法があれば教えてください。 現在、考えている方法としては・・・ 1) .NET frameworkのRegexクラスにRightToLeftのオプションを付けて使用(ラッパーとなるDLLを作成?) 2) Boost.Regexや、IRegExp(VBScript)を用いて・・・ i) ヒットするまで後ろから前へ開始位置をずらしていく ii) 文字列,パターンを反転させる 3) 諦めて前から後ろのみの検索とする 1の方法が最有力候補なのですが、.NET frameworkを使うことで 動作環境が狭まるなどの問題点がありまして・・・。
まず全文に対してマッチを行い、ヒットしたものを列挙。 その結果に対し、現在地点の直前に当たるものを結果とする。
415 :
デフォルトの名無しさん :2006/04/14(金) 03:13:45
OPENFILEダイアログを使うと何故か仮想画面からの コピーが機能しなくなるんだが原因がわかる人いる?
仮想画面ってなんのだ? というか、もっと環境とか詳しく書かないと返答もらえにくいんじゃね?
いじめないで! ぼく わるいC++じゃないよ!
スーファミのDQは65816のアセンブラで書かれていたって本当か? PS/PS2版はさすがにgccらしいけど。
どこの誤爆だ?
>>414 回答ありがとうございます。
検討してみます。
>>414 全文はまずいのでは?
現在位置までのデータで列挙しないと。
>>411 *(__int64 *)&ft += (__int64)dwLateTime * 10 * 1000 * 1000;
こうですか?わかりません><
>>420 え? 414でいいのか?
414みたいなやり方じゃ遅くなるから413の質問になるんじゃないのか?
質問です。 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になってしまうのでしょうか?
>>424 s_hWndは何かのクラスメンバなの?
>>425 MakeMessageWindowを宣言しているヘッダ(C.h)のクラスのprivateメンバです
MakeMessageWindowはそのクラスのメンバ関数なの?
つーか、何がどのクラスのメンバなのかさっぱりわからん。
>>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が入ってしまいます
ソース
醤油
マヨネーズ
>>429 s_hWnd, MakeMessageWindow(), SetHWnd()
は同じクラスに属しているの?
>>433 同じクラスです
s_hWndはprivate、二つの関数の方はpublicで宣言しています
WinMain.cppとB.hでは同じインスタンスに対して操作してるのか?
>>435 s_hWndは値渡しですので変わらないと思います
その他の3つはそれぞれ、メッセージボックスに表示する文章、ウィンドウに表示される文章
作るメッセージボックスの形式(それぞれ、OKのみ、はい/いいえ)が変化しています
いやそういう意味じゃなくて。 class A { public: void Set(int i) { value = i; } private: int value; }; A a1, a2; a1.Set(10); a2.Set(30); とした場合、a1.value は10のままなのは理解できてる?
>>437 すいません、今知りました
この場合私の言っていたs_hWndはWinMain.cppに対してだけの物で、B.hで使用するにはB.h、
もしくはB.cppの中でSetHWndをする必要があるという事でよろしいでしょうか?
さぁ、ケースバイケースじゃね? WinMain.cppとB.hで同じインスタンスに対して操作したいなら グローバル変数にするとか。
s_が付いてたからstaticだと思ってた俺。
>>439 グローバル変数だと大丈夫でしたか
皆様ありがとう御座いました。やってみます
>>423 そうなんですよね。それで前述の通り、今、検討している内容の中で
.NET frameworkを用いるのが、動作としては一番好ましいのですが。
現在設定してある動作環境(Win98〜 or Win95 + IE4〜)に当てはまる
人の中で動作しない人が出るのは・・・という状況です。
>>441 その前にC/C++の基礎からやり直した方がいいと思うぞ。
C++の標準例外クラスにout_of_rangeとrange_errorがありますが、 これの違いがいまいちわからんのですが、runtime_errorとlogic_errorの 違いってだけなんでしょうか。
446 :
デフォルトの名無しさん :2006/04/15(土) 16:06:29
ファイル出力する名前に変数iの数字を入れたいのですがどうすればいいのでしょうか? for( int i; i < 10; i++){ ofstream fout("sample" (ここに変数iの数字を入れたい) ".txt"); fout << "hoge\n"; fout.close(); }
stringstreamとかsprintfを使ってファイル名を成形
>>446 boost::lexical_cast <string> (i)
449 :
446 :2006/04/15(土) 16:59:25
("sample" + i + ".txt")
451 :
444 :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マガジンが出してる奴か? あれ結構まともな感じしたんだが。
>>452 こんな奴が実装したプログラムなんて使いたくないな
456 :
デフォルトの名無しさん :2006/04/15(土) 21:11:21
Cを勉強しようと思ってる人には何て本が分かりやすくてお薦め?
458 :
デフォルトの名無しさん :2006/04/15(土) 21:45:54
MSペイントに塗りつぶし機能がありますが、 あれはどういうアルゴリズムで実装しているのでしょうか。 自分のやり方は、データの全マスを何回か調べて、 広げられる位置をチェックしていくやり方ですが、すごく遅いです。 環境は、C言語、BCC、9x系です。
459 :
デフォルトの名無しさん :2006/04/15(土) 21:52:29
>>455 わからないならグダグダいわないで、わかりません、だろ?
>>458 画像処理 その6
http://pc8.2ch.net/test/read.cgi/tech/1140510670/ こういうスレもあるが、その程度ならここでもいいか
ペイントがどうやってるかしらないけど、とりあえず全体を調べる必要はないね
画像処理だかはさっぱり知らないけど、俺が考えたやり方だと
クリックしたマスと、その上下左右のマスが同じ色かどうかを調べる
同じ色だったら、そのマスに対して上下左右のマスが同じかどうかを調べる
ってのを再帰的に繰り返して同じ色のマスだけ塗りつぶす
もちろん、一度調べたマスにはなんらかのフラグを立ててもう一度調べることが無いようにする
string型にlong型の数字を入れられるのでしょうか?
>>461 そりゃ、文字列化したら入れられる。たとえば
int i=199;
std::ostringstream os;
os << i;
std::string s = os.str();
464 :
458 :2006/04/15(土) 22:36:58
>>460 ありがとうございます。
その方法を試してみます。
466 :
デフォルトの名無しさん :2006/04/15(土) 23:07:22
全くの初心者です。 少し前(一年くらい?)に買ったC++入門書を引っ張りだしてきました。 この本だと #include <iostream.h> と書かれているんですが、ネットの初心者向けサイトを見ると #include <iostream> using namespace std; となってます。 これは本が古いからでしょうか? それとも色んなやり方があってどっちでも良いんでしょうか?
本が古いから。
468 :
466 :2006/04/15(土) 23:29:22
そうでしたか。 そんじゃ明日本屋に行ってみます。どうもです。
>>458 「閉領域 フィル アルゴリズム」あたりでググってみろ。
470 :
458 :2006/04/16(日) 02:12:37
自分のやり方は、まだチェックしていないマスの回りのマスを調べて、
ひとつでもチェックしたマスがあるならそのマスをチェックするやり方でした。
調べる位置の順番は、クリックした位置を中心ではなく、
普通にxとyの2次元フォーで調べていきます。
始めは左上から右下、次は右下から左上に進めていきます。
図形が複雑な場合は、左上から、右下からを何回か行います。
その回りの位置を調べる関数へのオーバーヘッドが遅いのか、
左上から、右下からが1回ずつの場合でもかなり遅いです。
>>465 なるほど。APIを探してみます。
>>469 そのキーワードで良さそうな所を見つけられました。
「C言語 for アルゴリズム 塗りつぶし」
とかで見ていたんですけど、書籍ばっか出てきてダメでした。
471 :
458 :2006/04/16(日) 02:26:44
新たに編み出した方法も書きます。 同じように全マスを順番にチェックするタイプです。 今度はカウンタが進む方向が4パターンあり、 左上から、左上から(x, yを逆にカウンタを進める)、 右下から、右下から(x, yを逆にカウンタを進める)です。 チェックした位置が見つかると(始めの位置は当然クリックした位置)、 別の色が現れるまで、カウンタを進める方向にチェックし続けます。 円とか長方形とかシンプルな図形を塗る場合、 カウンタを進める方向の1回目では、下方向に直線が引かれた形、 2回目では左下方向が塗られた形、3回目では、右下方向も塗られた形、 4回目で全部塗られた形になります。 この方法だと結構早いです。メモリが128Mで、画像のデータサイズ (2次元ポインタ)は400×400なんですけど大丈夫です。 弱点は画像が複雑な場合です。 特に細長く斜め方向に伸びた図形だと、 チェック回数をかなり多くしないといけません。
普通は画像データが水平方向に連続しているので、ペイントアルゴリズムでは 一般的に水平線を埋める形で実装されている。
externについての質問です。 とある書籍で、次のようなコードが使われていました。 extern void func() { // 関数の実装 } 私の理解では、externを関数に修飾した場合、ただ単に「外部のどこかで宣言されている」ことを明示しているだけに過ぎず、 本来は関数宣言にのみ使うべきものだと考えておりましたので、例のような関数定義への修飾は意図が分からず戸惑ってしまいます。 このように関数定義そのものにexternを修飾することに、どのような意味があるのでしょうか?
475 :
474 :2006/04/16(日) 12:41:11
外部のどこかで宣言 ではなく 外部のどこかで定義 でした orz
>>474 関数宣言(定義も含む)に付けられたexternは無意味。
あえて言うと、staticでないことを明示している。
>>474 関数宣言・定義に修飾がなされていないときは
規格に従ってextern修飾がなされていると判断される
明示することでわかりやすくなるから全く意味がないとは言えない
478 :
474 :2006/04/16(日) 13:37:16
>>476-477 素早い返答ありがとうございます。
非staticであることを明示する、というのは考えが及びませんでした。
モヤモヤが晴れ、スッキリ読み続けられそうです。
ありがとうございました。
アプリケーションを終了するときのタイミングが、WM_DESTROYを捕まえた時にPostQuitMessage()を送る、と言う動作だけコーディングした場合に、 さらにWM_CREATEを捕まえた時に、-1を返す、としたら、ウインドウは生成されないけど、WM_DESTRORYが発生する事は無いから、 アプリは結局の所、PCの電源を切るとか低水準な事をしない限り終了しないって事?
ofstreamでファイル出力するときに tempフォルダや自分自身のexeがあるフォルダに出力するには どんなパスを入れればいいのでしょうか?
>>481 きっとtempフォルダや自分自身のexeがあるフォルダだよ。
>>480 別の方法でWM_DESTRORYを送れば終了する。
>>484 それは「低水準な事」に含まれないのか?
>>481 環境異存。
WindowsならGetModuleFileNameを使って自分自身のファイル名を取得可能。
tempフォルダはgetenvで環境変数から取得できる。
tmpfile関数を使った方が良い場合もある。
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++について 古い環境に合わせたいのですが。よろしくお願いします。
489 :
481 :2006/04/16(日) 16:46:12
490 :
デフォルトの名無しさん :2006/04/16(日) 21:35:06
板違いなら誘導お願いします。 マトリクスのプログラムを作っています。 [A] * [x] = -[B] で[x]を求めるのですが [B]の前にある-は、どう処理すればよいですか?
[B]に-1をかけるだけじゃないのか?
492 :
デフォルトの名無しさん :2006/04/16(日) 22:10:22
>>491 レスありがとう。
[B]の全要素の符合を入れ替えれば
良いのでしょうか?
[0]、[-1]がイメージ出来ません。
せめて高校くらいでるか、もしくは行列のあまりに 基本的なことくらいは本読んで勉強するかのどちらかにしろよ
線形代数の基礎・・・・
496 :
デフォルトの名無しさん :2006/04/16(日) 22:25:34
ありがとうございます。 勉強します。
>>497 そもそも文系がプログラミングしようというのが間違ってるじゃないだろうか?
>>490 和を取るときも本当は値が落ちてしまわないように
順番も考慮した方がいいんだけどな。
ちがうな彼はもっと高度なモノを作ってる 世界を構築してるんだ
おお! 理想郷を作ろうとしているのか! 凄いぞ!がむばれ!
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 と出てしまいます。 テンプレートに関して授業でほとんど習っていないのに、いきなり課題で出されて困っています。 どなたか教えてください。
>>502 templateを使うには当然後者のようにlinesを指定しないといけない。
でないと、どのテンプレートなのかコンパイラには分からない。
但し、後者のエラーメッセージを読めば分かる通りテンプレート引き数であるSTR1が間違っている。
>>480 DefWindowProc呼んでるなら終了しね?
>>503 解決しました。ありがとうございました(´∀`)
506 :
502 :2006/04/18(火) 00:29:22
>>502 です。
どうやって各クラスのクラスポインタを宣言すればよいのでしょうか?
また、各クラスのインスタンスをnewを使って生成したいのですが、それもやり方がわかりませんorz
どなたか教えて下さい。
なんかこう、>503が虚しく見えるな。
そうか?
なんつーか、テンプレートどころの騒ぎじゃないじゃん。
ふっ、俺の手にかかればそんな問題しゅんさつだぜ
宿題は宿題スレでやって欲しいなあ 教えたことができるようになってんのはあたりまえだろ 教えてない部分はまともな本で読んで補え って意味の課題なのわかんないのかね
ヒント:ゆとり世代
規格では、組み込み型の整数のサイズは、何も決められていないのでしょうか。 char <= short <= int <= long であれば、いいのでしょうか? すると、これも規格上いいのでしょうか? char <= short <= int <= long = 1
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.
じゃなかったごめん。これは型変換だ。吊ってくる
>514 手元のK&R C第2版には >ハードウェアに合わせて、適当なサイズを自由に選んでよいが、守るべき唯一の条件は、 >shortとintは少なくとも16ビット、longは少なくとも32ビット、shortはintより長くてはならず、 >intはlongより長くてはいけないということである。 「唯一」のくせにいくつか書かれているが、こういうことらしい。 C99でどうなってるかは知らん。 あと、charは1バイト(バイトが何ビットであるかも正確には機種依存ではあるが)。
>>517 C99の規格票を眺めていると、引用すべき箇所が多くて貼らない方が
いいだろうが、long long int と unsigned long long intが増えただけで、
後は limits.h内の***_MIN〜***_MAXを少なくとも保持できる大きさ
でなければならない、と書いてある。基本的にはANSI-C89と同じようだ。
>>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,...) こんなソースを見たのですが、 この三連ピリオドはなんですか? 初めてみたんですが、意味を教えてください。
可変長引数
523 :
デフォルトの名無しさん :2006/04/20(木) 19:27:50
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++は付属していますか? よろしくお願いします。
>>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"
>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
531 :
526 :2006/04/21(金) 17:34:04
>>528 早レスありがとうございます。
規模の小さいクラスだったので、ヘッダで完結させていたのですが、
CPP側に処理を書いたほうがスッキリしそうなので試してみます。
>>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;
}
つーか、enumをビット演算しようという時点で間違いだ罠。
pascalの列挙型がこんな感じで使えるとか 昔他スレで教えてもらった
>>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;
}
537 :
525 :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自身にも演算子再定義できるとは知りませんでした。
>>537 intでなくてenumを使ってるのはなぜですか?
539 :
525 :2006/04/22(土) 01:43:43
>>538 > 普段はADSというarmの純正開発環境を使っていてarmのデバッガだと
> 識別子情報を拾って表示してくれて見やすいので多用してました。
という理由です。
>539 const int ONE = 1; という風に代替するんじゃダメなん?
541 :
540 :2006/04/22(土) 01:55:44
あ、すまん537見落としてたんでスルーしてくれ。
542 :
デフォルトの名無しさん :2006/04/22(土) 03:00:38
VC++2005の本が異様すくないのはなぜですか?
製品版が発売されてからまだ間もないからです 続々と新刊が発売されている最中です
544 :
デフォルトの名無しさん :2006/04/22(土) 03:09:39
もう結構たってません2005年から?
C99についての本も異様に少ないはずです 1999年から結構経っていますがそんなもんです
>>545 それ以前にC99に完全準拠したまともな処理系は数えるしかなく、
メジャーなベンダーメーカーはC99を捨てているのが現状です。
規格だけが先走り、現物が出てこない悲運のC99。
>>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> には括弧が必須。
548 :
525 :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)
550 :
デフォルトの名無しさん :2006/04/22(土) 09:11:42
ボーランドのコンパイラがインストールされているのですが、 Z:\MyDocuments>bcc32 teat01.c 'bcc32' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 と出てコンパイルできません。どうしたらよいでしょうか?
>>550 インストールした香具師に聞け。
それがあんた自身なら、ダウンロードした香具師に聞け。
それがあんた自身なら、ダウンロードしたサイト周辺を探せ。
bcc path で ググって「pathを通す」という概念を理解しよう
553 :
550 :2006/04/22(土) 09:32:26
>>551-552 環境変数を自分で設定しないといけないんですね。
愛媛大学のメディアセンターのパソコンは今日開いていないので、
月曜日にやってみます。
何故愛媛を強調
2000ByteのI:\file.binの0x1500-0x1510までのアドレスに00 01 02 03 04 05 06 07 08 09を出力したいのですが どの様に実装すればいいのでしょうか
>>555 つ[fopen(), fseek(), fwrite(), fclose()]
0x1500って5376バイト目なわけだが
別に問題なくね?
すみません、constと#defineとenumについてお聞きします。 普遍の値として10という数字を使う際に constと#defineとenumのメリットデメリットや使い方例などありますか?
#define FUHEN (10) const int fuhen = 10; enum {Fuhen = 10}; それが個数などを表す数値であるなら意味的には整数型を使うべき。 序列、番号付けの目的ならenumがいいだろう。 どちらの手段も使えないなら仕方なくマクロにしようか。
自分はenumを進める 言語で標準サポートされてるし
>>561 いや、マクロやconstもサポートされていますが何か。
defineはプリプロセッサ constはわざわざ使う必要は無いと思った
>>563 浮動小数点型の定数が欲しい時どうするんだ?
整数型の定数だけenumにして、その他はdefineかconstなんていう不統一なスタイルにするのか?
きっと浮動小数点数を暗算で16進数に変換できる人なんだよ。
つーかむしろenumは特定の数値を表すものとしては使うべきではないと思うが。
>>566 使うべきかどうかは別として、最初に導入された理由が
「マクロよりもマシな記号定数が必要だったから」だしな。
使い方として完全に間違っているわけではないかと。
568 :
デフォルトの名無しさん :2006/04/22(土) 16:10:51
cout << printf 後者の方が10倍くらい出力速い気がする
速度が気になるほどprintfしまくったらえらいことになるし
俺の心にprintfしてください
572 :
デフォルトの名無しさん :2006/04/22(土) 16:34:20
C++2005にwebフォームは作れないって書いてあったけど。 webフォームとwebアプリケーションは違いますよね? webフォームとは具体的になんですか?
talk_something > /dev/null 独り言
GCCでプログラミングをしていて、壁に当たりました。 なんとか、getch()を使える環境にしたのですが、うまくいきません。 コンパイルは普通に通り、実行ファイルも吐き出されます。 しかし、実行時にセグメンテーション違反が出ます。 どうすればいいでしょうか。 ご教授いただければうれしいです。
>>575 はい、そうするのが無難なのですが。
例えば、タイピングのゲームを作りたいと考えた時に、getcharでは実現できないと思うのです。
577 :
デフォルトの名無しさん :2006/04/22(土) 19:25:32
ご教授いた〜って言う奴に何故かいらいらくる 普通に教えて下さい程度で十分だと思う ここは教授するような高尚な知識を授ける程のレベルのスレでもない
>576 curses使えばリアルタイムに取れる
>>579 レスありがとうございます。
よければそれについて、詳しく教えてください。
有用な情報が載っているWebページなどでも結構です。
>>577 元々「教授する」なんて言葉自体が誤用なんだから目鯨立てなさんな。
initscr してないとか
585 :
577 :2006/04/22(土) 20:13:33
ところで、正しい日本語は 「教示」 です。
三省堂提供「大辞林 第二版」より きょうじゅ【教授】 (名)スル 児童・生徒に知識・技能を与え、そこからさらに知識への興味を呼び起こすこと。 専門的な学問・技芸を教えること。 「国文学を―する」「書道―」
三省堂提供「大辞林 第二版」より きょうじ 【教示】 (名)スル 〔「きょうし」とも〕おしえしめすこと。示教。 「御―を賜りたく」 実験・調査で、研究者の意図する行動を被験者にとらせるための指示
どっちかってーと、間違ってないか > 教示
この場合は教授で正解だな。
591 :
デフォルトの名無しさん :2006/04/22(土) 23:09:11
はい! わかりましたそこの教授!
592 :
デフォルトの名無しさん :2006/04/22(土) 23:52:19
このよく見るgetch()って関数は何? putch()ってのもあるの? GCC特有の関数?
conio.hに定義されている標準入力から一文字読み込む関数 ヘッダファイルの名のとおりコンソール専用
594 :
デフォルトの名無しさん :2006/04/23(日) 02:21:49
超初心者の質問でスマ。 borland C++を導入して BinにPATHを通しても includeとlibを読み込んで くれません。 こんなことで悩んでいるぽっくんは バカ? なんせプログラム組むのは 10年ぶりでWindowsは初めてなもので。 教えて偉い人。
INCLUDEとLIBにも通せばいいんじゃないか?
setbccでぐぐると幸せになれるかも。なれないかも。
下手な釣りだな。
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だと環境変数自動で設定してくれる。
それだと駄目か?
bcc.exeを削除したら、立ち上がらなくなりました。なぜでしょうか? どうしてもわかりません?????
605 :
デフォルトの名無しさん :2006/04/23(日) 04:19:31
ども
>>594 です
どうやらTeraPadの保存で
余計な拡張子がついていたようです
無事コンパイル出来ました。
お騒がせしました。
606 :
デフォルトの名無しさん :2006/04/23(日) 05:48:18
すみません
>>594 です。
こんどはリンカで
Illegal option -Gn
とかでてEXEファイルを生成
出来ない様です。
こまりました。
>>606 翻訳サイトにその文章をかけてみな。たぶん正しくないオプション-Gnみたいな文章になると思うから。
ilink32.cfgに-Gnって書いてあったら消すといいと思うよ。
エラーメッセージくらい嫁よ
609 :
デフォルトの名無しさん :2006/04/23(日) 09:56:15
>>603 何ていうヘッダで定義されてますか?
BCCに通るコードでも未定義エラーで弾かれちまいます。
>>609 自分の環境だとmingwのctype.hとwctype.hにしかないな。
isleadbyte って ISO で定義されてる? 手持ちの資料では見当たらないんだが。
613 :
デフォルトの名無しさん :2006/04/23(日) 12:31:32
>>607 ilink32.cfgで、-Gの指定がありません。
なぜ-Gのエラーが出るのか判りません。。
614 :
デフォルトの名無しさん :2006/04/23(日) 12:36:52
>>613 です。
とりあえずEXEファイルは生成出来ました。
しかし実行すると、有効なwin32アプリケーション
ではありません。と出てエラーになってしまいます。
ただhello worldと出すだけのプログラムなんですけど。
>>614 いい加減に汁。
コンパイラ/リンカの使い方位ググって調べろ。
ここは、ソフトの使い方を聞くスレじゃねぇ!
616 :
デフォルトの名無しさん :2006/04/23(日) 13:13:55
どうもすみません。
setbccはどう?
618 :
デフォルトの名無しさん :2006/04/23(日) 14:40:57
>>610 >>612 ctype.hをインクルードしてますが、「isleadbyteへの参照が未定義」とエラーされました。意味がさっぱりっす。環境はcygwin。
引値はintらしいけど、BCCだとcharが通りました。これも訳わからんです。
ヘッダファイル と リンクするライブラリ があっているか?
>>618 cygwin でエラーメッセージに日本語でるの?
621 :
デフォルトの名無しさん :2006/04/23(日) 15:14:04
>>620 いや、英語でした。
リンカも1 exit statusなるものを返してきてるらしいですが…。
>>619 <ctype.h>じゃ駄目ですか?
>>621 やったこととエラーメッセージを「正確に」伝えろバカ。
>>621 終了ステータスが0以外=何かエラーが発生した
つーかこんなのC言語以前のレベルだろうが、氏ね
624 :
デフォルトの名無しさん :2006/04/23(日) 16:49:41
じゃいいや BCCでします。
Blind Carbon Copy
Coconut Boys
>>621 わざわざmingwだと言ってるのに。頭悪杉。
代入演算子は継承されないってことらしいですが、 試しに基底クラスで代入演算子をオーバーロードして、 その基底クラスから派生させたクラスを1つつくって 派生クラス同士で代入を行ったら、基底クラスでオーバーロードした 代入演算子が呼び出されているようなんですが・・・ これって継承されてるのと違うんですか?それとも意味が違う?
>>628 >13.5.3 代入
>代入演算子は,1個の仮引数をもつ非静的メンバ関数として実装しなければならない。代入演算子が
>利用者によって宣言されていない(12.8参照)場合,コピー代入演算子operator=が,クラスごとに暗黙に宣言さ
>れるので,基底クラスの代入演算子は,常に派生クラスのコピー代入演算子によって隠ぺいされる。
630 :
628 :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 と表示されるのですが・・・おかしいですよね?
>>630 「継承されません」というのは、派生クラスで自前で代入演算子を定義
した時、基底クラスの代入演算子が無視されてしまう事を言う。
今のケースではBのデフォルトの代入演算子が使われるので、継承とか
は関係無しに基底クラスの代入演算子も呼ばれる。
試しにBに代入演算子を定義してみな。自分でA::operator=()を呼び
出さないと呼び出されない。隠蔽されてしまうからだ。
規格のどの辺かな?§12.8、§13.5.3あたりだと思うんだが。
>>629 その定義だと、全てのメンバ関数にあてはまってしまわない?
>>630 暗黙に定義される B::operator=() は A::operator=() を呼び出す。
そうじゃないと困るだろ?べつにおかしくない。
>>632 代入演算子は暗黙の宣言があるので必ず隠される。
他のメンバ関数はそうはならない。
つまりこういう事か。 暗黙に定義されるB::operator=()は、Bに固有のメンバのみビットコピーした 後にA::operator=()を呼び出す、と。 確かにそういうバイナリ吐いてるな。
>>635 違う。
B のメンバはそれぞれに対して代入を行う( operator=() を呼び出す)。
また、順番は A::operator=() が最初でメンバは宣言順になる。
難しひ・・・・
そうか?単純にメンバに再帰してるだけで、自然だと思うけど。
shallow copy と deep copy で言うと、shallow copyの方がデフォルトの 代入演算子の動作だったような・・・・
Cの構造体のコピーと事情は一緒だと思うが。 ・メンバを先頭から順番に代入する。 ・継承している場合は継承元が先。 たったこれだけだろ。
Bの内容が class B : public A { int* i; }; のような状態で、iがnewされた領域を指していた場合、デフォルトの B::operator=()じゃダメだろ。
>>643 大抵ダメだろうねぇ。そのような場合、適切な代入オペレータを用意するのはクラス設計者の責任だろうけど。
646 :
645 :2006/04/28(金) 12:51:35
age忘れ。 失礼しました。
647 :
645 :2006/04/28(金) 12:54:21
環境忘れ。失礼しました。 環境 : VC.NET2003, WinXP SP2, 標準STL
wcharをfputsで出力すると、勝手に改行が付いてきます。 wcharをfputsで出力するのはダメなんでしょうか? 環境はWinCE5.0です。
>>650 あああ!ありがとうございます。そんなものがあるなんて思ってませんでした。
652 :
デフォルトの名無しさん :2006/04/28(金) 22:52:53
エクセルのファイルフォーマットは公表されてないでしょ。 マイクロソフトの気分しだいで簡単に変更されちゃうのでは?
変更されたら自作ライブラリも更新すればよかろう。
openofficeの資料みれば poifsとか 次はxmlベースらしいから解析は楽そうだけど
655 :
ふーん :2006/04/28(金) 23:05:45
656 :
645 :2006/04/29(土) 03:49:52
odbc以外は難しそうですね。 ありがとうございました。
エクセルファイルを読みたいだけならExcelのオートメーションでもできた気がする。
オートメーションもアウトプロセスCOMだから遅いお。
クラスのメンバ関数をinlineにする場合で、関数定義をクラスボディの外で する場合、宣言と定義にinline指定、宣言のみにinline指定、定義のみに inline指定、いずれもinlineになると思っていいの?
>>659 いいけど、定義だけにつけたときは
使う側が定義を取り込むように注意して配置しろよ。
逆にいえば、余計なことを考えずに宣言につけとけって話だな。
他の翻訳単位にあっても、コードがinlineに展開される事ってあるの?
ない
コンパイラとリンカによる。 たとえばVC++にはプログラム全体の最適化というリンク時に行う最適化がある。 それどころかDLL内の関数すらインライン展開する機能もある
665 :
デフォルトの名無しさん :2006/04/29(土) 23:12:01
構造体の配列は宣言した段階で領域が確保されるの?
いいえ
667 :
デフォルトの名無しさん :2006/04/29(土) 23:37:42
動画編集に手を出したいんだが お勧めのライブラリってある? 検索の仕方が悪いのかいまいちヒットしない。
やってみたけど、構造体自体もできてない。 構造体の中身の配列に関しては、値を入れた配列要素から 1つづつ形成されていた。 配列オンリーなら宣言時というよりも、すでにstatic領域(静的領域)でできてるけど。
670 :
デフォルトの名無しさん :2006/04/30(日) 12:23:37
>>668 >構造体の中身の配列に関しては、値を入れた配列要素から
>1つづつ形成されていた。
どういう意味?構造体の配列にvectorでも使っているの?
>>669-670 >>668 誤り
構造体自体もアドレス確保されてるし、構造体の中に配列作ったとしても、
その配列も他変数同様確保されてるし、
static領域ではないし、
ただ、Cでやったんだけど、
Cの場合、C++と違って、「宣言は最初に持ってこないといけない(関数内の中間じゃ×)」
であって、例えば、
int a=1;
int b=2;
とやるも、先にaとbがまとめて確保されて、次にa=1となり次にb=2となる。
ここを誤った。
結局、宣言時に全部確保されてた。
>>671 新しい規格ではブロックの先頭じゃなくてもいいんじゃなかったっけ?
「宣言」「定義」「確保」の意味が曖昧で話がわからん。
正確に言うなら int a=1; は定義である これが関数内に記述されているなら関数が実行されるときに スタック上に領域が確保される かもしれない
宣言と定義ぐらいは規格上の意味に則ってほしいなぁ。
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
無理せずstringつかっとけ
普通ならその前にポインタや配列とかを勉強させるべきじゃね? ここで教えるわけがないけど、まあ、そのへん勉強しろと
#include<iostream> usingnamespacestd; chara[255]; voidset(){ //a="abc"; if(strlen(a)>strlen("abc")) strcpy(a,"abc"); } void main() { set(); cout<<a; getchar(); }
>>680 ありがとう
ポインタを使う時はどうするの?
683 :
デフォルトの名無しさん :2006/04/30(日) 19:41:30
#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です。
>>685 Parsifal XML Parser
687 :
デフォルトの名無しさん :2006/04/30(日) 20:11:55
DOMはCでも使えるよ
>>684 > char*a;やchar*a="efg"だと、
> strcpy(a,"abc");
> とした瞬間に、元のaの値もアドレスもゴミとして放棄して、新しくアドレス確保してabc\0を入れてしまうんだよ。
新しくアドレスを確保?
んなことせんがな
自分でstrcpyと同じ動作をする関数を実装してみると理解が深まると思われ
string使ったら全て解決したYO ヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノ
691 :
デフォルトの名無しさん :2006/04/30(日) 20:37:49
char*a;やchar*a="efg"だと、 "abc"を入れるアドレスを作り、"abc"を入れて、 strcpy(a,"abc");で、"abc"のアドレスをaが参照し(aと"abc"は同アドレス)、 aの元の値とアドレスはゴミとして残ってしまう。 でOKですか? AccessViolationでるから、まんまでは確認できなかったですけれど。
>>692 なんだか説明が下手でよく判らんが、理解できてなさそうだとは思う。
コードを提示して説明しなおして味噌。
#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が
>>694 "abc"のための領域なんぞ確保できていない。
char* b = "efg"は文字列リテラルへのポインタをbに代入しているに過ぎない。
で、文字列リテラルはconst、つまり変更不可能。
それをstrcpyで勝手に書き換えようとした。ゆえにAccessViolation
そもそもViolationで辞書引いたのか?
解決したのに議論は終わらず
どうやら大部分の人々はポインタを理解するための脳の一部分を持たずして生まれてくる ようだ。
700 :
693 :2006/04/30(日) 23:12:04
うぁはは、本当に理解できていなかったとは。素晴らしい。
>>697 ありがとうございます。
追うのはかなり厳しかったのですが、
strcpy内ステップインして、
abcをスタックにpushした後、
〜
この間分からなかったですが、
〜
mov dword ptr [edi],edx
(edx=00636261(\0cba))
で、abc\0をediレジスタに書き込むところでAccessViolation発生していました。
宣言が関数内外問わず同じでした
ポインタは、そのポインタ値が何を指しているのか? が重要であって、それさえイメージ出来れば、 何も難しい事なんて無いはずなのになぁ…。 みんな、想像力が欠けてるのか?
「この処理は何をしているのか」 がわかってないといきなりデバッガで追っても意味わからんと思うけど・・
>>701 そんなものを追う前に、Access Violation を英和辞書でひけ!
「俺に聞けスレ」にも、ポインタが分かってないのに、デバッガの値がどうとか言って ヒンシュクをかってたやつがいたな。
>>705 あの、的はずれな値を見ていた香具師か?
>>703 彼らはある日魔法の呪文が書かれた本を目にするとなぜかそれが全て読めて
南無南無唱えて敵を倒せるのだと思い込んでいるからなぁ。
>701 そろそろ「釣れたw」とか言って欲しいな。 >mov dword ptr [edi],edx >(edx=00636261(\0cba)) >で、abc\0をediレジスタに書き込むところで そのコードはabc\0をediレジスタに書き込んでいるのでは無い。 ediレジスタが指す メ モ リ にedxの内容を書き込んでいる。
この世には2種類の人間がいる。 ポインタを理解できる人間か、理解できない人間かだ。
711 :
デフォルトの名無しさん :2006/05/01(月) 20:21:56
UNIX系のC言語について質問させてください。 errno==ENTER ってどういうエラーを表しているのでしょうか? 手持ちの本には何も書いてなくて、検索してもあまりこれっというのがでてきませんでした。 よろしくお願いします。
>>711 perror()
strerror()
713 :
711 :2006/05/01(月) 20:32:48
>>712 すみません、よくわかりません。
もう少しヒントをお願いできないでしょうか?
>>713 errno = ENTER;
perror("");
とすると、エラーENTERの説明がstderrに出力されるはず。
>713 man errno しかし、ENTERなんてあったか? 写し間違えてない?
716 :
711 :2006/05/01(月) 20:47:48
>>714 ,715
ごめんなさい。EINTRの間違いでした。
おさがわせしました。
717 :
デフォルトの名無しさん :2006/05/01(月) 23:07:01
質問です。 printf関数使って " っていう文字表示させるにはどうしたらよいですか? printf("""); とかやったらエラーになるのですが。って当たり前か
\" マニュアルを読むとか検索するとか汁
719 :
デフォルトの名無しさん :2006/05/01(月) 23:41:15
世の中には二種類の人間がいる。 ポインタを理解している人間と理解する気がない人間だ。 理解できないようなのは人間とは認め難い。 つーかネタもいいかげんにしてくれ。 基本的な文字列操作もできないCプログラマがどこにいる。
ここに
そしてまたここに
stringでいいじゃん
724 :
デフォルトの名無しさん :2006/05/02(火) 01:57:27
stringだと、けつに'\0'ないじゃん
僕の尻にも'\0'を突っ込まれそうです
尻に\0……ネギと卵?
DebugとReleaseの違いを教えてください。
>>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)); という関数を用い、正方形が様々な色に変わるプログラムを作ろうと 無謀にも思いついて作っておりますが、早速困っております
732 :
731 :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; } } }
733 :
731 :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回書くだけで良いのでしょうか?
ご指導お願いします
もっかいタイマーかければ?
WinAPIスレがなかったか?
736 :
さげ :2006/05/02(火) 23:43:42
>初期値x=300; コールバック来たら、 >double x=900;// >sinfunc(&x);// だから、2回目以降はx=900という動作だから、変わらず同じでしょう。 それと、タイマーオブジェクトはいくつも作れるから(タイマーが複数動く状態)、 WM_TIMER:を受けるタイミングがごちゃごちゃになってくるから動かすタイマーはひとつで充分。
737 :
731 :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;
}
と書き直したら、それっぽく動くようにはなりましたが、
これで良いのでしょうか?
738 :
731 :2006/05/03(水) 00:49:41
>>735 氏
>>1 に>エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
とありますが、私の質問はこのスレとはやはりずれるのでしょうか?
>>735 じゃないが、他にもっと適したスレがあるんだからそっちで聞けということだろ
740 :
731 :2006/05/03(水) 01:14:13
すみません、
x=900;は
case WM_CREATE:
{
・・・・・
x=900;
break;
}
と入れました。
>>737 の所ではありません。
これで自分が予測していた感じで動くようになりました。
皆さん、有難うございました。
>x= *ps もしかして、ペイント構造体の値が色変わると動くから流用したのかな? int blinkflag=0; 〜 case WM_PAINT: if(flickflag==0){ x=900; } else{ x=300;blickflag=1; } 以下ペイント と自分ならすると思う。
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--; }
>>742 で、そのポインタ型を関数のプロトタイプ宣言で引数に取ると
void hoge(int(*)[3])云々と
どう見ても肛門です
>>742 typedef int ArrayInt[3];とおけばその宣言はこう書き換えられる。
ArrayInt a[2];
ArrayInt *p = a;
746 :
731 :2006/05/03(水) 17:22:20
731→740を更にあれこれ改良、目的に合わせ変形して、 自分が長年作りたかったものが出来ました 皆様ありがとうございました。WinAPIの質問スレで無いところに 質問に押しかけてしまった事をお詫びします
747 :
デフォルトの名無しさん :2006/05/03(水) 23:11:21
構造体をvectorで作れるのでつか?
そりゃもう
STL最強ですね
750 :
デフォルトの名無しさん :2006/05/04(木) 08:33:59
標準入力からfgetsした場合の文字コードって何になるのでしょうか? UNIX系の環境の場合はLANGに指定されているコードと考えていいでしょうか? Windows環境の場合はShift-JISでしょうか?
ダンプしてみると良いよ
752 :
デフォルトの名無しさん :2006/05/04(木) 09:42:50
詳しくも何も、fgets()成功してたらそのバッファをダンプするだけだろ。
754 :
デフォルトの名無しさん :2006/05/04(木) 10:01:48
ダンプメソッドが見つかりません。 dump? dmp?
charの配列の内容をそのままループで出してみるだけの事だろ・・・・
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); }
つっこみどころが多すぎ(w
C99前提だとかファイル名とかシンボル名が狙いすぎだとか?
>757 まあそういわずにコンパイルしてみろ。 ちゃんと動くから。 何で動くかは自分で考えろ。
intを2バイトと決めつけている点が何ともはや。
×ちゃんと動くから。 ○コンパイルエラーが発生するから。 ×何で動くかは自分で考えろ。 ○何でエラーが発生するかは自分で考えろ。
>>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
こっちのほうが意味が分かりやすいかもしれないな #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); } }
766 :
デフォルトの名無しさん :2006/05/04(木) 13:50:28
C言語ではコンパイルできない。それすらわからん馬鹿しかいなのか?
>762,764 本筋とは離れるが、トークン区切りにタブを使うのはどうかと思わないでもない。 >766 単純な推測すら出来ない馬鹿はいるみたいだけどね。
メモリダンプも満足に書けない様なヤシしか居ないのかよ
769 :
デフォルトの名無しさん :2006/05/04(木) 14:38:53
すまんが764がマジで何をやろうとしているか理解できないんだが、 誰か解説してくれ。
>>769 ++chを--chに直してやってみてよ(修正)。
一見、forループはbuffとは関係ないようだけど、
bufが&chのアドレスに対してどの位置に配置されるのかが分かれば、分かるよ。
あと、Cにはやっぱデバッガが必須かな。
>>753 のプログラムを書いてたのかと思ってたが
char cchとchar buf[]の位置関係を変なやり方で調べるプログラムだったのか
772 :
デフォルトの名無しさん :2006/05/04(木) 14:53:51
>>770 --ならまだ理解できるが、上の奴らは自信満々なのはなんでだ?
あとbufの中身をダンプしたいだけなら、そんな書き方する奴は馬鹿としか思えないんだが。
STL以外で有益な物って何?
>>773 もっと具体的に範囲を絞ってほしいが、STLが例に挙がるんならBoostとか
あーもう、>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 変に凝ろうとしてど壷にはまっている。
うんこです ありがとうございました
779 :
デフォルトの名無しさん :2006/05/04(木) 17:20:35
C++勉強中の超初心者です。 以下のプログラムがコンパイル出来ません。 どうすればよいでしょうか、教えてください。 ------------------------------------- #include <memory> int main(void) { std::auto_ptr<int> p(new int); *p = 10; return 0; } -------------------------------------
エラーメッセージ貼らない奴には答えない主義。
相手にはするんだね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 --------------------------------------------------
>>782 c++用のライブラリがリンクされてないんじゃね?
ってか、普通g++だろ・・・
785 :
デフォルトの名無しさん :2006/05/04(木) 18:14:09
783> 784> g++にしたら解決しました。 皆様ありがとうございました。
786 :
VC坊 :2006/05/04(木) 18:57:39
g++ってなんだ?
│ ≡ ('('('('A` ) │≡ 〜( ( ( ( 〜) ↓ ≡ ノノノノ ノ
788 :
デフォルトの名無しさん :2006/05/04(木) 21:39:27
786> g++コマンドのマニュアルによると、 名称: g++ - GNU プロジェクト C++ コンパイラ (v2.4) 解説: Cコンパイラおよび C++ コンパイラは統合されました。 g++ は gcc に C++を解釈するようにするオプションを つけてコールするスクリプトです。詳細は英語版のオン ラインマニュアルおよび gcc(1) を参照して下さい。 と書いてありました。具体的にどういうオプションかは g++の中身をざっとみてみましたが、わかりませんでした。
バイナリダンプのソースどこかに転がってないでつか?
>>789 main(i,c){for(;~(c=getchar());++i>16?puts(""),i=1:0)printf(" %02X",c);puts("");}
こ、転がってるぅーーーーーーーー
792 :
デフォルトの名無しさん :2006/05/05(金) 09:56:02
newでの失敗の返り値って NULL でおk? vc2005です。
いいえ。例外が飛びます。
new(nothrow) なら NULL が返ってくる。 new なら bad_alloc 例外が投げられる。
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になってしまうんだけど、どういう理由なんでしょうか。
>>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]にアドレス数値入れたりして危険な香りがぷんぷんするのですが、一応動いているので 問題なければ使用していこうと思っているのですが・・・
>>797 何がしたいのかよー分からん。
環境によってはそれで動くだろうが、
どんな環境を想定してるか、
またはなぜ hoge が直接使えないのか、
そのあたりの説明が無いと何とも言えん。
それ以前にもいろいろ言いたい事もあるし・・・。
>>796 ああそっか。またやっちゃったよこのミス……。
ありがとう。
800 :
デフォルトの名無しさん :2006/05/05(金) 12:39:57
>>798 ええと、環境はwindowsxpを想定しています。
具体的に申しますと、グローバルな構造体のワークエリア(上記プログラムでlong work[2]にあたります)に
構造体(上記でabcにあたります)で数値又はポインタを出し入れしたいというのが目的です。
同型のグローバルな構造体がたくさんありまして、個別にワークエリアをlongから構造体に変えたりとかは
難しい状況なので、こう苦しい書き方をしているのですが・・・^^;
>>800 意味がよく分からんが、
とりあえず cout のところで
abc を使ってアクセスしない理由が知りたい。
802 :
デフォルトの名無しさん :2006/05/05(金) 12:58:54
申し訳ありません、実際に使用するプログラムと上記プログラムが違っていることをお許しください。 上記プログラムは実際に使用するプログラムを簡略した書き方にしています。 ですので、上記プログラムですとabcを使ってアクセスしても構わないと思うのですが、 実際のプログラムですとworkの方でアクセスしたい、、という感じです。お手数かけます
そんな怪しげなコードをメンテナンスしていきたいなら別にいいんでない? 或いは捨てることが判っているコードだとか。 まぁ、今後もメンテナンスしていく必要があるならやめた方がいいとは思うけどね。
>>802 「64bit環境対象外」&「CとC++のコーディングが混ざっててキモイ」等々
嫌な感じがしないではないが、今動けば良いと割り切ってしまえるのであればOK
805 :
デフォルトの名無しさん :2006/05/05(金) 14:14:53
RPGツクールのPNG技術をおらに分けて欲しい。ちなみにプログラム初心者。 現在DXライブラリでゲーム作ってるんだけど、ちゃんと表示されないで困ってる・・・ もしかして256色しか対応してないのかな・・・ スレ違い?(´・ω・`)
806 :
デフォルトの名無しさん :2006/05/05(金) 14:16:45
f2cのソースリスト教えて下さい。探しても分かりませんでした。
>>806 ぐぐれ。
>>805 聞きたいポイントがわからん。DXライブラリとやらがDirectXのことなら専用スレがある。
808 :
デフォルトの名無しさん :2006/05/05(金) 15:36:09
これからC言語を勉強する場合、まず図書館で本を借りてこようと思ったのですが 2002〜2004のC言語の参考書って今でも通用するのでしょうか? やっぱり最新の2006年度版を買って勉強するべきでしょうか?
>>808 言語について書かれてある本ならば問題ない
開発環境について書かれてあるならば
その内容は古くなってるかもわからんね
そういえば、自分の経験からいくと、 「Visual C++入門」だとか、「C++ Builder入門」だとか、 ある特定の開発環境に限定した書籍で、良書を見たことがないのだが。 言語の解説はいまいち、開発環境の使い方の解説もいまいちといった、 中途半端な本ばかりだという印象がある。
>>809 ,810
ありがとうございます。
まずは図書館で、言語についての本を借りてこようと思います。
まぁ入門書はあくまでも入門書だからな
>>802 cout の方でも abc に相当するポインタを作って
使うわけにはいかないの?
815 :
デフォルトの名無しさん :2006/05/05(金) 19:22:31
ファイルサイズを得るにはどうすればいいんでしょう?
fseek,ftell
なるほど
>>815 環境依存しない完璧な手段はない。
例えばsize_tが4バイトの環境で2GB以下のファイルで、ファイルシステムがサイズに関して小細工しない場合に限り、>816でできるかもしれない。
820 :
デフォルトの名無しさん :2006/05/05(金) 20:41:23
バイナリデータを格納する場合はcharの配列に入れた方がいいのかな?
お好きなように
822 :
デフォルトの名無しさん :2006/05/05(金) 21:11:00
fstreamのオブジェクトからバイナリデータをmemcpyする事ってできる?
823 :
デフォルトの名無しさん :2006/05/05(金) 21:45:37
自作ソフトが作りたくてVC#expressを入れたんだけど、 これってどうやってexe作るの? [ビルド]→[newPgの発行]でひたすらOK押していったら、setup.exeってのが出来たんだけど インストールしたりレジストリ弄ったりしちゃうんだけど… ふっつーのVectorで配布してるようなの作る方法教えてー
824 :
823 :2006/05/05(金) 21:46:44
てか今更だけどC#ってスレ違いだったり…?
バイナリはヘキサにして%02Xにして保管しとくと後々読み出すとき楽だよ 文字列から数字へがatoi以外知らないから、自分の場合ファイルに保管するけど、 例えば char* a="あいうえお"; FILE *p; p=fopen("ドライブ:/path","a"); fprintf(p,"%02X",a); fclose(p); わざわざファイルに保管しなくとも、文字列をヘキサなど数字で保管できる関数ややり方があれば便利だなと思うんだけど。
>>822 memcpyなんぞいらん。fstreamからrdbuf()->sgetn()使え。
>>823 ビデオの再生ボタンみたいなのを押すと幸せになれるよ
828 :
デフォルトの名無しさん :2006/05/05(金) 22:34:40
>>827 ちょっとだけ幸せは得ましたが、自分だけの幸せで終わりそうです。
みんなが幸せになるにはどうすれば…?
829 :
825 :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); です、ヘキサ保存。
よりによってO(n²)かよ
831 :
825 :2006/05/06(土) 00:00:35
もう一箇所 a++;ではなく、a=a+2;
・DLL ・上記DLLをロードするプログラム って、両方ともコンパイラは同種にしないとだめですか? それとも両者(DLL、プログラム)がANSI-C準拠のコードであれば問題なし?
>>832 そもそもDLL自体、ANSI Cの規格ではない。
あとはわかるな?
835 :
832 :2006/05/06(土) 01:42:15
>>834 「あとはわかるな?」と言われても、どうとでも解釈できるような。
都合の良いように解釈すると、「コードの内容に関係なく、
MS固有仕様をサポートしているコンパイラであれば、組み合わせは何でもあり」ってことですか?
>>835 うんにゃ、俺は別に
>>834 ではないが、そもそもdllやexeを
作るのはコンパイラじゃないってことはわかってるのか?
>>836 すみません、よくわかってないです。
コンパイラで機械語に落とし込んでリンカで実行ファイルにする、ということを指していますか?
ちなみにやろうとしていることは、
リンカ機能を持つコンパイラAでDLL(hoge.dll)を作成後、
リンカ機能を持つコンパイラBでhoge.dllをロードするhoge.exeを作成しようということです。
これでhoge.exeを実行したら正常動作するのか、機械語レベルで誤動作するのか気になっています。
(でもDLLを提供しているサイトでは環境ごとにDLLファイルを分けてなかったような気がしてきました)
>>837 >これでhoge.exeを実行したら正常動作するのか、機械語レベルで誤動作するのか気になっています。
だから、そこが根本的に間違っているんだ。
いいかね?
hoge.dllやhoge.exeが正常に(コンパイルエラーもリンクエラーもなく)作成できたなら
どんな動作結果が出ようとも、それは機械語レベルで「正常」に動作しているのだ。
そこでお前の思ったように動作しないとしたら、それはお前の作り方が間違って
いたからだ。
何か答えてる方が無理に訳分からなくしているような。 DLLが公開する関数の、 ・返値の型 ・引数の数と型 ・呼び出し規約 を正しく一致させて呼べば、違う言語からでも呼び出せる。
正しく設計してあることも前提だけどね。 たとえばFILE*を渡してたりするとNG。
>>841 そりゃいくらなんでも具体的過ぎでしょ?
おいらは日常的にMSVCRT.DLLとFILE*を
やりとりしとるよ?
>838-842
無粋な質問をしてしまったようで、すみません。
そもそもDLL(実行ファイル)の概念をよく理解していなかったようで、
「CでつくったDLLはCで(かつ同じ環境で)つくったEXEからしか使えない」という認識を
持っていたのが間違いの原因でした。
>>841 >正しく設計してあることも前提だけどね。
>たとえばFILE*を渡してたりするとNG。
これがNGなのはなぜでしょうか。
「FILE*を渡すこと」が正しい設計でない、というのがよくわからないのですが、
引数や返却値はint,charなどの基本型でないとだめというわけではないですよね。
もしくは上記は「違う言語から呼び出す場合(呼び出し側がCでDLLがC以外の言語)」について
言及していますか?
ポインタがどうか判断出来ない命名が有るから気をつけろということでは?
hint: FILE構造体は実装依存。
EXEでnewした物をDLLでdeleteとか、その逆もダメだな。
>>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になるようなうまい方法ないかな。
charをunsigned charにしなはれ。
>>850 それだけだと 0082 00a0 になってダメなんじゃない?
>>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);
}
ありがとう、聞いて良かったです。
>>852 "abcde" は char の配列だし、 strlen() の引数も char* だから
a の型は char* のまま、 *a を (unsigned char)*a にするのが正解。
char const* にするとなお良し(C++なら必須)。
あとは、
main の戻り値は int にしとけ。
インデントする気が無いならソース貼るのに全角スペース混ぜるな。
コンパイラオプションで、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処理失敗した場合の場合分けが双方ないのですが、 何かのネタにでもしてもらえれば幸いです。
>>855 そういうふうに1バイトずつデータを読み書きしたいのならgetc/putcがお勧め。
857 :
デフォルトの名無しさん :2006/05/06(土) 19:17:33
バイナリデータの入れ替えは何を使うのですか?
キャラクタだからといって特別扱いはしてないから、そのままバイナリもいける。
>>857 : error: too few arguments to function `入れ替え'
860 :
855 :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ショートカットができてるはずです。 もっと使えるものに改良してもらえればありがたいです。
PNGのCRCをC/C++で計算するソースって転がってないですか?
>>860 インターネットショートカットは拡張子urlだけど。
ちなみに拡張子lnkのショートカットはバイナリファイルだからバイナリモード使え。
>860 Cの基本としてbはintで定義しようね。 あと-1ではなくEOFとの比較に。
>>860 で一つ大事なのが抜けてました。
return 0;の手前にfclose(pcopy);です。
864より863の方が大事だと思う。
透過したいならマスク、圧縮したいならRLEで十分。
マルチポストさせていただきます。 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です。よろしくお願いします。
わかった!
こういうのはマルチ煽りとかしてもいいんだろうか
>>869 GetProcAddressがエラーで0を返し、それを呼び出そうとしたので、
ぬるぽと化しRun-Time Checkでガッされたという状態。
C++の関数名・変数名はコンパイラによって変形される。GetProcAddressが使うのもその変形された名前。
DEFファイルでどうにかすれば名前はどうにでもなるけど、
HogeHoge::fnSetColorが非メンバなら__thiscallだからアウト。
おとなしく、グローバル関数でラッピングしろ。
extern "C" void HogeHoge_fnSetColor(HogeHoge* p)
{
p->fnSetColor();
}
873 :
869 :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.
となっておりますので、
呼ばれる関数名と呼ぶときの関数名が違うのではないかと思うんですが?
クラスのメンバ関数は暗黙でthisを引数に取るのに呼び出し側で渡してない。 つーかメンバ関数の意味わかってなさそう。
875 :
デフォルトの名無しさん :2006/05/07(日) 19:43:44
char型の配列を unsigned charの配列にするにはどうすれば?
>>875 符号が変わる場合があるわけだが、その場合はどうするつもりかね?
>>876 全て+なのでその点に関しては大丈夫です。
>>877 じゃぁ assert(x >= 0) を入れながらコピーすればいい。
スピードが問題になる場合で、2つの配列の実体が同じでもいいのなら
キャストを使ってコピーを省くことも可能。
キャストの方を教えていただけませんか? (unsigned char)としただけではエラーになるのですが。
残念ながら char a[10]; unsigned char b[10]; b=(unsigned char)a; みたいなことはできないので中身を一つづつコピーしましょう
std::copy(a, a + sizeof(a), b); でできるわけだが。
char a[10]; unsigned char* b; b=(unsigned char *)a;
>>879 本当にキャストをしたいのか?コピーでいいならコピーしとけ。
基本的に、キャストは最後の手段と考えるようであってほしいな。
char a[10];
unsigned char* const b = (unsigned char*)a;
C++ なら
unsigned char* const b = reinterpret_cast<unsigned char*>(a);
const unsigned char * b = (unsigned char *)a; じゃないの?
>>884 何故constで受ける? 変更したいかもしれないじゃないか。
>>885 意味はきちんと理解してから使おうね。
お姉さんとの約束だぞ。
なんでキャストをデフォルトにするかなぁ?
>>884 正直、これだけの話じゃ、constにすべかどうかさえわからない
>877で、signed charで正数だと言ってるから大丈夫だろう。
fscanfでファイルを読み込んで検索するwhile文作ったが、EOFに行ったきりファイルを読み込んでくれない。 ファイルポジションをファイルの先頭に持ってくるにはどうしたら。
fseek
freopenとかは?
1バイトのint型変数を作るにはどうしたらいいんですか?
>>896 int のサイズが何バイトかは選べないよ。
1バイトの変数の型(0〜255までの数字を扱える)を新しく作りたいのです。
あまり見かけられませんが、構造体にはビットフィールドと呼ばれる技術があります これは、ひとつのメモリ領域(バイト単位)に名前をつけてビット単位に振り分けるものです ビットフィールドの作成は、構造体の生成とほぼ同じです ビットフィールドで使われる方は、通常intまたはunsignedです(signedの場合は上位ビットが符合に使われます) 型 名前: サイズ; 型は説明したとおりです 名前にはメンバ名同様に、このビット領域の名前を指定します サイズにはビット領域を指定します。3と指定すれば、この名前の領域に3ビット割り当てられます このような特徴から、ビットフィールドは特定のビット数で確実に表現できる情報に用いられたりします たとえば、boolean型の変数の作成などにはビットフィールドが有効です 1ビットの変数を生成しておけば、確実に0か1しか入りません
wisdomさんありがとう。
>>899 > あまり見かけられませんが、構造体にはビットフィールドと呼ばれる技術があります
普通に見かけます。貴方が低能なだけです。
> ビットフィールドで使われる方は、通常intまたはunsignedです(signedの場合は上位ビットが符合に使われます)
方→型。unsignedという型はありません。
加えて言えば、何ビットが1バイトか定義されていないプログラミング言語で
1バイトの変数を決めうちで作るのは規格にそった方法では不可能です。
>>901 C/C++ で1バイトのビット数って CHAR_BIT じゃないの?
ちょびっツ
ただし、ビットフィールド自体は1ビットでも 構造体変数はunsigned(通常は4バイト)の領域であるということに注意してください 先ほどのプログラムのビットフィールドは、そのうちの1ビットなのです 意味ねぇーーーーーーーーーメモリ節約したかたのに
他に方法は無いのかね?
>>907 もっと色々できるのかなって。この辺がC/C++の限界という事ですか。
typedef char smallInt, *smallInt; で、おk
それじゃ初心者には難しいですよ。これで十分。 typedef char smallint_t;
intの多次元配列を
>>910 でやったらかなりのメモリを節約できた。
調子に乗って構造体メンバのintを
>>910 にしたら
逆にメモリ消費が増えるという?な事になったんだけど何故?
>>908 0〜255の正数値を格納したいだけなら、unsigned charを使ってください
一般的な環境なら1byte、8bitです
あなたが意図したとおりに使えるでしょう
>>912 メモリ消費は何で測ってる?
手っ取り早くソース晒せ。
Visual C++ 2005 はC99に準拠していますでしょうか? また、完全に準拠していないとしても、大分部の機能をサポートしているでしょうか?
>>912 タスクマネージャ。
ソースはintとstringがごっちゃ混ぜになってる構造体。
918 :
917 :2006/05/08(月) 02:42:35
>>914 #pragma pack(push,1)
とかいうのを見つけた。ありがとう。
よく開発環境で非MFCとか書いてたりしますけど 非MFCの利点とかあるんですか?
MFC の糞仕様に悩まされなくて済む。 ・・・いや、MFC の DLL が不要。
アラインメントを制御すると64bitOSでは動かない?
>>921 MFCスタティックリンクすればどのみちDLL不要だが。
ファイルサイズ? そんなの気にしない
>>916 準拠していない。ただ極一部の機能だけは(独自拡張扱いで)対応している。
構造体の最後のメンバに要素数を指定しない配列を置くこと
enumの最後におくカンマ
負の整数の除算の結果
(u)intptr_t
//単一行コメント
restrictの代わりに__restrict
後は/TpコンパイラオプションでC++由来の機能を使える。
inlineやどこでも変数宣言ができることなど。
今気づいたけど、
>>916 の「大分部の機能」にわろた
だいぶんぶってどういう入力のしかたしたんだwww
C99に準拠してるコンパイラ自体どれくらいあるんだろう 少なそう
>>926 「だいぶぶ」で「ん」が抜けただけだと思われ。
おおいたぶ
質問です 関数のプロトタイプ宣言とは、どういうことでしょうか? 引数と、返り値の意味の説明も出来ればお願いします。
詳しくはK&Rを読め
関数の引数だの返り値だのの型がこうなってるんだよー、 ということだけを予め知らせるためのもの。>プロトタイプ
ICCとGCCぐらいしかしらんなぁ<C99
文法は覚えたけど、次は何を覚えたらいいんだろう?
社会常識
C++ Builder 5 を使っているんだけど・・・ date() で取得した日付を8文字(yyyymmdd)の数値に変換する方法って何かないですかね。 ヘルプとにらめっこしてみたんだけどそれらしいのが見つからない・・・ どなたか宜しくお願いします。
938 :
937 :2006/05/08(月) 22:05:47
書き込んでから思い至ったんだけど、(yyyymmdd)の数値をTDateTime型に変換するのでもいいです。 どなたか知恵を・・・
>>937 String.Format("yyyymmdd",date());
プラットフォームを選ばないなら 1 yyyyの値を文字列にする 2 年の文字列の前に"0"を四つ付ける 3 文字列の最後の4文字を取り出す でいいんじゃね?mmddも同様に
strftime
942 :
937 :2006/05/08(月) 22:49:20
>>939-941 ありがとうございます。939氏のやり方でなんとかなりました!
お手数をおかけしました。
943 :
デフォルトの名無しさん :2006/05/08(月) 22:55:18
Visual C++でscanf_sを使っていて、それをそのまま他のコンパイラでコンパイルすると エラーが出るのですが、これって何とかならないのでしょうか?
標準のscanfを使ってください
945 :
デフォルトの名無しさん :2006/05/08(月) 23:23:29
数値*数値*数値=積となるようなプログラムが解りません。SCANF関数を使うのが条件です。
??
SCANFはscanfとおなじ感じでええのかなっと? int 積, 数値; SCANF("%d", &数値); 積=数値 * 数値 * 数値;
????????????????????????????????
これでいいんじゃね? main(){ puts("数値*数値*数値=積"); }
953 :
945 :2006/05/09(火) 00:50:20
おまえらその程度かよ。がっかりだ もう明日から会社来なくていいよ
今時SCANFも使えないとはなさけない
scanf なら使えますが。
956 :
デフォルトの名無しさん :2006/05/09(火) 01:01:43
>>953 偽物は消え失せろ。正しくはscanfです。明日〆切りなんです。よろしくお願いします
>>945 の言ってる事の意味が分からん。
エスパーの登場キボンヌ。
たぶんあれだ、ある数値の3乗を求めたいんじゃないのか?
>>958 だからスレ違いの質問に構うなって。のうたりんか君は。
下記の関数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; }
962 :
961 :2006/05/09(火) 03:17:09
>>961 の「上位引数」は「上位関数」の誤りです。
>下記プログラムだとstringにNULLが返却されます。 何も返却されていない。
つ参照渡しと値渡し
>>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';
確保して返すタイプの関数を作るならこんなかんじがお勧め 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); //////////////////////////////////////////////// これを出力してみると、 フォルダの先頭の方の英語の部分までの階層は表示されますが、日本語の部分からは表示されません。 どうしたらよいか具体的に教えてください。 お願いします。
GetModuleFileNameW
970 :
968 :2006/05/09(火) 17:42:56
ちなみにVS2005のコンソールアプリなんですけど。 出力は普通に wprintf_s(szFilePath); wprintf_s(szFileName); としてるだけです。 デバッガでみるとちゃんと中身は入ってるみたいなんですけど、 出力されないです。。。
971 :
968 :2006/05/09(火) 17:46:30
>>969 早速ありがとうございます。
試してみましたが結果は変わりませんでした。。
wprintf_s("%s", szFilePath); wprintf_s("%s", szFileName); でどう?
973 :
968 :2006/05/09(火) 17:55:58
>>972 ありがとうございます。
それだとコンパイルエラーが出たので
wprintf_s(L"%s", szFilePath);
wprintf_s(L"%s", szFileName);
としてみました。
結果は、とりあえず出力されたという点では進展しましたが、
なんだか日本語のところは???????になってしまいました。
あぁ、そういやそうだな。 で、何で表示されないんだろう・・・。 デバッガでは szFileName 内はちゃんとしてるんだよね?
975 :
968 :2006/05/09(火) 18:01:20
>>974 はい。
最終的にwprintf_sのところでは期待した内容になっております。
文字コードとかって関係ないですよね?
とりあえず、 wprintf_s(L"%s", L"表示"); wprintf_s(L"表示"); は表示されるのかな?
setlocale("")
ああ、違う、 setlocale(LC_CTYPE , ""); か。 いずれにせよwchar_t系のコンソール出力はコード変換されてから出力されるんで デフォルトのCロケールから適切なロケールに変更されてないと日本語は出力できないってだけ。
979 :
968 :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"));
}
GCC(MinGW)でコンパイルして、time hoge.exe とするとExeの実行時間 がわかるといわれたんだが、 real user sys と3つも出てる。 すまんが、各項目の意味を教えてください。 もしくは、説明しているサイトを教えてください。 よろしくお願い致します。
1度関数の中で宣言した値は関数の実行が終わったらどうなるんでしょうか? たとえば、もう一回関数を呼び出して、値を読み出したらどうなるんでしょうか?
試してみてはいかがでしょうか。
staticじゃない限りはアレ
今、試してみる環境が無いんじゃないか?
スタックが壊れてなければ同じだから、 「試してみたら?」は危険かもな。
初心者です。繰り返し文の中で for(i=3;i <= n; i++) { strcpy(rr,ss[i]); } って書いたらstrcpyの()の中でひっかかったんですけど、 何が悪いのでしょうか? よろしくお願いします。
>>988 頭が悪いんじゃね?
「ひっかかった」ってなんだよ?
>>988 「ひっかかった」とは?
それから、rrとssの定義がないと何も言えない。
俺のESPが バッファオーバランか 文字列リテラルの領域に書き込み だと告げています
とりあえず次スレを待て。
994 :
988 :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; }
995 :
988 :2006/05/09(火) 22:56:33
ひっかかったというのは、ビルドするときにエラーが出たってことです。 説明不足でスミマセンでした・・・
何がしたいのか分かりません><
コンパイルエラーならエラーメッセージを貼れ あとstrcpyのプロトタイプ宣言をよく読め
>999
1000 なら究極言語誕生
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。