【初心者歓迎】C/C++室 Ver.10【環境依存OK】
次スレ立ってないみたいなので勝手にスレ立て。 一応関連スレも最新に更新したつもりだけど抜けがあったらスマソ。
スレ勃て乙
ウワァァァァァァン。・゚・(ノД`)・゚・。 オーバーロードとオーバーライドがワケワカラン! なんでこいつらこんな名前似てるの?
カタカナデカンガエルカラワケワカンナクナルンダヨ
>9 とりあえず俺はオーバーライドの「ライド」という部分の意味で識別してる。
そっか、オーバーロードは多重定義 オーバーライドは・・・漢字で何て書くんだろ ライドはrideだから乗る・・・上乗り。よし、覚えたぜ!!!
いや・・・普通に英語で。 overload - 荷を積み過ぎる override - 優先する だっけか?
overload 腎虚 override 騎乗位
VC6はひょっとして#include <iostream> using namespace std;に対応してない? clに-gxでやれゴルァといわれちゃうんですけど
17 :
デフォルトの名無しさん :04/10/11 05:48:54
/* sample16.c */ #include <stdio.h> int main(void) { int a, x; int *pa; /* ポインタ変数の宣言 */ a = 100; pa = &a; /* 変数aのアドレスを代入する */ printf("address=%x\n",pa); /* 変数aのアドレスを表示 */ x = *pa; /* 変数aのアドレスの内容をxに代入 */ printf("data:a=%d x=%d\n",a,x); } を実行すると一瞬だけウインドウが表示されてすぐに消えてしまって 結果が確認できません どうすれば結果が表示されたままになるのでしょうか?
デバッグ実行 by vc6
>>21 その前にCtl+F5ですよ。
24 :
デフォルトの名無しさん :04/10/11 06:36:09
#include <stdio.h> int main(void) { int a, x; int *pa; /* ポインタ変数の宣言 */ a = 100; pa = &a; /* 変数aのアドレスを代入する */ printf("address=%x\n",pa); /* 変数aのアドレスを表示 */ } ↑の時はpaでアドレスが表示されるのに #include <stdio.h> int main(void) { char *pa; pa = "abcd"; printf("%s\n",pa); } ↑の時はアドレスが表示されないで文字のabcdが表示されるのですか?
>>23 ありがとうございます
ちゃんと表示されたままになりました
>>26 >>27 >printf("%s\n",pa);
調べてみました
でフォーマット指定子が%sの時はpaのアドレスにはいっているabcdが表示されて
%dにするとなんか数字が表示されたんですけどabcdが入ってるアドレスが表示されたんですか?
paはアドレスしか示さないと思ってたのにびっくりです
%dと%xの違いは10進数か16進数かということ。 っていうか聞く前に自分で調べろや。
>>24 %p が使える環境ならそれを使うべき。
%x,%d で代用するならキャストが要る。
OpenFileMappingに失敗します。OpenFileMappingの戻り値はNULL、エラーコードは2(指定されたファイルが見つからない)です。 オブジェクト名は何度も確認したので間違いありません。CreateFileMappingには成功し、オブジェクトに書き込んだデータを OutputDebugStringで表示することができました。失敗の原因として、オブジェクト名以外に何が考えられますか? 使用しているコンパイラはBCCです。猫でもわかるの123章のプログラムを実行しました。
#include <stdio.h> struct teststruct { int x,y,z; }; void func(struct teststruct *test[]); int main() { struct teststruct test[8]; test[1].x=8; func(&test[1]); } void func(struct teststruct *test[]) { printf("%d" , test[1]->x); } 何度もすいませんけど メイン関数内のtest[1]の内容を関数func()の中で見たいんですけど どうしたらいいのでしょうか? 上の様にすると実行中に test1.exe の 0x00411af4 でハンドルされていない例外が発生しました : 0xC0000005: 場所 0xcccccccc を読み込み中にアクセス違反が発生しました。 。 と出てきます
× func(&test[1]); ○ func(test);
ん? × void func(struct teststruct *test[]) ○ void func(struct teststruct test[]) × printf("%d" , test[1]->x); ○ printf("%d" , test[1].x);
無意味な質問キタ━━━━━━(゚∀゚)━━━━━━!!
>>33 >>34 >>35 レスありがとうございます
ご指摘の通り修正したらエラーは出なくなったんですけど
8じゃない別のすごい大きな数字が表示されます
test[1].x=8;
で8を代入したはずなのになんでなんですか?
いろいろ調べて例とか見て改良を加えてみたのですが
正しく動くかどうかまでは判断できなかったので聞いてみました
>>37 少なくとも自分で正しく動くと思うものを持ってきてくれ。
>32 よくわからんので、オレ流に書き直してみた。 #include <stdio.h> typedef struct { int x; int y; int z; } teststruct; void func(teststruct* pTest); int main() { teststruct test[8]; test[1].x=8; func(&test[1]); } void func(teststruct* pTest) { printf("%d\n" , pTest->x); }
>>39 うまくいきました
おかげさまで解決しました
ありがとうございました
>>40 なぜ
>>39 でうまくいくのかよく考えてくれよ。
このスレは初心者歓迎って書いてあるから質問にはそれなりに回答するけど、
かわりにやってやるスレじゃないからな。
要するに配列とポインターをいまいち理解しきれてない模様
メモリマップ書きながらお勉強すると割りと簡単に理解できるよね
bufの表示か書き出しの仕方のほうがまずいかんじ
46 :
デフォルトの名無しさん :04/10/12 06:54:02
#include <stdio.h> #include <math.h> struct teststruct { int x,y,z; }; struct teststruct func(void); int main() { struct teststruct test[8]; test=func(); printf("%d" , test[0].x); printf("%d" , test[1].x); printf("%d" , test[2].x); } struct teststruct func(void) { struct teststruct test[8]; test[0].x=7; test[1].x=1; test[2].x=3; return test; } func内のtest[0]〜test[7]をそっくりそのままmainに渡したいのですけど 上のプログラムだと error C2440: '=' : 'teststruct' から 'teststruct [8]' に変換できません。 error C2440: 'return' : 'teststruct [8]' から 'teststruct' に変換できません。 とエラーがでますどうすればいいのでしょうか?
>>46 まず配列のコピーは代入したからといってコピーしてくれるわけではありません。
次に関数の返却値はコンパイルエラーそのままです。
だからC++では
const teststruct (&f())[8]{....} こんなことやって配列の同じ型なら返せますけど・・・だれもやらない。と、思う。
で、言いたい事は最初に言ったことを覚えればいいです。
最後に
ttp://www9.plala.or.jp/sgwr-t/ こんなところで勉強した方がいいかも。
内容は読んでないからよくわからないけど見出しではいろいろそろってる感じだし
なんか、本も出版してるみたい。
>46 漏れならこう書く #include <stdio.h> struct teststruct { int x,y,z; }; void func(struct teststruct* pTest); int main() { struct teststruct test[8]; func(test); printf("%d\n" , test[0].x); printf("%d\n" , test[1].x); printf("%d\n" , test[2].x); } void func(struct teststruct* pTest) { pTest[0].x=7; pTest[1].x=1; pTest[2].x=3; }
>>47 わかり易そうな解説のサイトですね
お気に入りに登録しました
>>48 なるほど、リターンで返さないでもこうすればできるんですね
おかげさまで解決しました
お返事ありがとうございました
>>49 >なるほど、リターンで返さないでもこうすればできるんですね
お前もう一度一から勉強し直せ・・・。
51 :
デフォルトの名無しさん :04/10/12 09:56:03
似たような質問ですいませんが
下のプログラムは不完全なんですけど
やりたいことはわかってもらえると思うんですけど
#include <stdio.h>
#include <math.h>
struct teststruct
{
int x,y,z;
};
struct teststruct func(void);
int main()
{
struct teststruct test[];
test=func();
printf("%d" , test[0].x);
printf("%d" , test[1].x);
printf("%d" , test[2].x);
}
struct teststruct func(void)
{
a=5;
std::vector<struct teststruct> test(a);
test[0].x=7;
test[1].x=1;
test[2].x=3;
return test;
}
配列の要素数aの値はfunc内で求めなければいけないので今度は
>>48 の方法が使えなくなりました
func内のtest[0]〜test[a]をそっくりそのままmainに渡したいのですけど
どうすればいいのでしょうか?
c言語使ってます
>>51 c言語でvectorは使えない。これはc++のライブラリ。
あと君はポインタの勉強がまだのようですね。
ポインタが分からないと配列は扱えないので
まずそちらをきちんと勉強しましょう。
53 :
デフォルトの名無しさん :04/10/12 11:57:00
.NETでC++で開発してます。 MFCアプリケーションでダイアログベースで作ってます。 ある程度コントロールを配置してイベントを書いたところで、 ダイアログのIDを変更したところ、 なぜかリソースビューのダイアログエディタでボタン等をダブルクリックしたら、 MFCクラスウイザードが立ち上がり、今までのソースファイルとは別のソースファイルのクラスの作成を促されます。 ダイアログのIDの変更を生かしつつ新しいクラスを作成せずに今まで作ったソースを利用するにはどうすればいいのでしょうか?
>>53 1行目と2行目の間にそこはかとなく矛盾があるがそれは置いておくとして、
ダイアログクラスのなかに enum{ IDD = HOGE }; の形でダイアログテンプレートのIDが記憶されてる。
それと実際のテンプレートのIDが合ってないとウィザードが新しいクラスを作ると言い出す。
ありがとうございます。 目的通り動きました。
mallocで確保されるメモリー領域は必ず連続した領域として 確保されているんですか? 幾つかに分割されていることもあるんでしょうか?
>>46 ポインタについてよく理解できていないようですね。私の分かる範囲で指摘しておきます。
まず、test=func();という記述は明らかにおかしいです。配列名は配列の基底アドレスを示す定数のポインタです。
従って、配列名を左辺に置くことはできません。
次に、return test;という記述がおかしいです。関数funcの戻り値はteststruct型の構造体ですが、
testはteststruct型の構造体へのポインタです。戻り値の型が一致していません。
このような場合一般的には、関数の引数として、teststruct型の構造体へのポインタを渡します。
そうすれば、main関数で宣言されたteststruct型の変数testの内容を、間接的に別の関数で書き換えることができます。
>>56 実体はシランがプルグラマからは連続した領域に見えるから(・ε・)キニシナイ!!
class A{ public: A(){}; B* bobj; void funcB(B*); }; //A.h class B{ public: B(){}; A* aobj; void funcA(A*); }; endif//B.h このような2つのヘッダファイルを コンパイルすると、エラーになってしまいます。 AとBの間で通信を行おうとしているのですが、具体的にはAとBはウィンドウで Aのボタンを押したら結果をBに反映させ、Bのボタンを押したら、結果を Aに反映させようとしております。何か良い方法が無いでしょうか? 宜しくお願いいたします。
ヘッダ分けずにclass A の定義の前でclass Bを宣言だけする。
>>60 >>61 ありがとうございます。A=プロパティシートB=子MDIチャイルドです。
>>60 多分先頭でclass B;と書くのですね?
今まで、こういうソースを見ても良くわからず、理解に苦しんでおりました。
>>61 共通の基底クラスを作ってそこからABを派生させるという事で宜しいでしょうか?
とりあえず、「AはA、BはB」と分けるのがスジと思っておりますので、「家系図」を
考えてみます。
ありがとうございました。
>>64 マルチですんませんがマジで困ってるんです
助けてください
>>65 むしろ荒らしだろ
マルチするにも程がある
67 :
デフォルトの名無しさん :04/10/12 16:09:40
実行速度が速すぎてキャラの移動が早すぎるので ウエイトかけたいんですけど簡潔で効率的なウエイトのかけ方を 教えてくださいC言語でおねがいします
自分でアーカイブしたファイル(無圧縮)を読み込んでいるのだけど、 BOOL LoadFile(short nNum){ //ファイルを読み込む関数 HANDLE handle=0; //ファイルハンドル CFileAercaiver cFa; //アーカイブファイルから読み込むための自作クラス。 if (!cFa.Open("アーカイブファイル名"nNum)) //成功したら、指定したアーカイブのnNum番目のファイルの情報とファイルハンドルを、cFaオブジェクトが保有します handle = cFa.GetHandle(); //アーカイブファイルのハンドルを取得 /*cFa.Open()内では、 ※m_hFileは、privateのメンバ変数 m_hFile = CreateFile("アーカイブファイル名", GENERIC_READ, FILE_SHARE_READ, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); //処理を省略)アーカイブファイルのヘッダーを読み、nNum番号のファイルへのファイルポインタ(dwFPont)を取得する。 SetFilePointer(m_hFile,dwFPont,NULL,FILE_BEGIN); //nNum番号のファイルの先頭にファイルポインタを移動 */ //指定ファイルのヘッダーを読む LoadHeder(handle); } ------------------ BOOL LoadHeader(HANDLE &hFile){ RIFFHEAD riffhead; //自作の構造体 ※20byte DWORD readed; ReadFile( hFile, &riffhead, sizeof(RIFFHEAD), &readed, NULL ); } このLoadHeader関数内のReadFileが問題で、ReadFileは1を返して、readedもちゃんと20になっているのだけど、 riffhead構造体のメンバがすべて0になってしまいます。なぜ読み込めないのか、ヒントだけでもお願いします。
読んだファイルの内容が全部0x0というオチ
>>71 スミマセン、マジでそんなオチがつくかもしれません OTL
読み込もうとしてるファイルは、wavファイルのアーカイブなんですが、
その元のwavファイルには、ちゃんとヘッダー情報が保存されているのに…。
同じアーカイバのルーチンでbmpも扱っているけど、これは正常に読めてたので、
アーカイバには問題無いと思ってましたが、もう一度見直してみます。
>>45 さん、ご解答ありがとうございました。
調べてみたら、bufはちゃんと改行文字を取得していて、
それを表示する際に間違えていました。
どうも、お手間をかけさせてすみませんでした。
typeid( anInstance ).name()で取り出せる型情報を示す文字列が minGWでコンパイルしたものとVCでコンパイルしたものとで違うんですがコンパイラ依存なんですか? 具体的にはminGWの方が St16runtime_error とかよくわからないプレフィックスが付いてるっす。
>>71 ホントにそういったオチでした… OTL ハズカシイ…
アーカイバをちょっと変更したとき、アーカイブファイルも更新してやるべきでした。
2日も悩んでたことが解決しました。ありがとうございました。
>>76 なるほど。ありがとう。
JAVAの教本か何かで例外には意味のある名前を付けようみたいな事が
書いてあってC++でも型名取得する方法あるかな・・・と思ったのですが、name()で
常に意味のある文字列を返すと思って使わない方がよさげですね。
クラスの中に静的なポインタと、そのポインタを初期化する静的な関数を作ったのですが、 "error LNK2001: 外部シンボル ""private: static int * a::ptr" (?ptr@a@@0PAHA)" は未解決です。" というエラーが出て、リンクの時点で失敗します。 ソースは以下です。 ポインタが、普通の変数なら上手くいくんですが、原因が分かりません。 分かる方いらっしゃいましたら、ご教授お願いします。 //---------------------------- #include <stdio.h> class a{ static int *ptr; static void func(void); }; int a::*ptr; void a::func(void) { ptr = NULL; } void main(void) { } //----------------------------
>>78 #include <cstdio>
class a{
static int *ptr;
static int *func(void);
};
int a::*ptr (a::func ());
int *a::func(void)
{
return NULL;
}
か
int a::*ptr (NULL);
int *a::ptr;
いけね -int a::*ptr (a::func ()); +int *a::ptr (a::func ()); -int a::*ptr (NULL); +int *a::ptr (NULL);
最近Cを勉強して見ようと思い、簡単なサンプルコードなどをコンパイルしていますが 拾ったものをコピペすればきちんと実行されるが、 自分で全く同じものを書いてもエラーがでてしまいます。 わけがわかりません。例えば、 #include <stadio.h> int main() { printf("Hello World\n"); return 0; } で、インクルードファイルをオープンできない プロトタイプ宣言のない関数printfのよびだし とでてコンパイルできません。初心者以下の質問のような気がしますが、 どうかどなたか何が悪いのか教えてください。 コンパイラはBCCです。
>82 #include <stadio.h> よく嫁
#include <stdio.h> #include <stdio.h> #include <stdio.h> (゜∀゜)
本当に申し訳ないorz みなさんどうもありがとうございました。
#include <studio.h>ならまだ気持ちは理解できたかも。
>>79 ,81
レスが遅くなりました。
int *a::ptr (a::func ())
はつまり、func の戻り値を入れているということですよね?
確かに、試してみたらうまくいきました。
が、なぜfunc関数内でptrに直接入れられないのでしょうか?
ともあれ、もう少しいろいろいじってみます。
教えてくださってありがとうございました。
>>88 class a { static int *ptr; };
int a::*ptr;
これら二つの変数が別物だということは理解できていますか?
>>89 えーと、いろいろ調べてみたのですが、
int a::*ptr;
は、つまりメンバポインタというやつでしょうか?
78のソースの
int a::*ptr;
を、
int *a::ptr;
に変えただけで上手くビルドできたので、
普通のポインタを宣言するところを、間違ってメンバポインタを宣言してしまっていた
という解釈でいいんでしょうか?
うーむ、なんかトンチンカンなことをいっている気がします。
まだまだ修行が足りませんね。
C++専用のヘッダファイルの拡張子は*.h(ほとんど), *.hpp(それなりに), *.hxx(みたことがない) とかがありますけど、「好きに選べ」以外の選択材料はありますか?
>90 概ねあってますが、この場合、宣言というよりも定義という方が正しいと思います。
>>90 int *a::ptr;はint*型でclass aのメンバptr。
int a::*ptr;はint型のclass aのメンバへのポインタptr。
【その他】
・こういう時はint* a::ptr;と書いた方が分かりやすい。
・宣言と定義はきちんと使い分けること。
・C++で関数の引数がないときに普通voidは書かない。(void func()で十分)
・void main()は規格にない。int main()にすること。
>>92 ,93
大変勉強になりました。
ありがとうございました。
>・C++で関数の引数がないときに普通voidは書かない。(void func()で十分) どこの普通よ
>>91 c ⇔h
cpp⇔hpp
cxx⇔hxx
コピーコンストラクタについて質問です。 class Hoge{ priavte: int hage; public: Hoge(){ hage = 0; } Hoge( const Hoge &src ){ this->hage = src.GetHage(); } ~Hoge(){} int GetHage(){ return hage; } }; 大抵のHPで書かれている方法が、上記のようなことなのですが error C2662: 'Hoge::GetHage' : 'const Hoge' から 'Hoge &' へ 'this' ポインタを変換できません。 とエラーが出てしまいます。const を外せばエラーは消えますが… 環境はVC7ですが、VC7の仕様で他のコンパイラでは正常なのでしょうか? また、仕様であれば、現在はどのような方法が主流なのでしょうか? ご教授お願いします。
って、書いた後猫でもわかるHPのconstオブジェクトにて解決しました^^; スレ汚しすみませんでした
>>88 >なぜfunc関数内でptrに直接入れられないのでしょうか?
入れれないことはないです
ちゃんとa::funcを呼び出せばOK
#include <cstdio>
class a{
public:
static int *ptr;
static void func(void);
};
int *a::ptr;
void a::func(void) {ptr = NULL;}
int main(void) {
a::func ();
return 0;
}
101 :
デフォルトの名無しさん :04/10/15 07:14:05
ちょいと疑問に思ったんで。愚痴(?)聞いてください。 ふつーWindowsならshift_jis, Unix系ならeuc-jpでソースを書く やないですか。 cout << "Hello, 世界"; 文字列リテラルにマルチバイト文字含みますわね。 FDIS召還したらば: string-literal とは s-char-sequence を "" または L"" で囲ったもの s-char-sequence とは s-char または s-char-sequense s-char (←つまり s-charの並び) s-char とは 任意の source character set (" \ 改行 を除く) または escape-sequence または universal-character-name (← \u... \U... のことらしい) となってます。source character set はいわゆる ASCII文字。 とすると、文字列リテラルの中に(いわゆる)'漢字'をじか書き してはイケナイってことなんでしょか? 漢字を文字列リテラル内に 埋め込みたいなら excape-sequence 使わにゃならんのでしょうかホントは
神様は仰っしゃいました。 自分が正しいと思うことをやりなさい。
ちょっとお聞きしたいのですが、 ファイルの中が 00 00 00 01 をfreadでintに読み込むと printfで"%#x"を表示させたとき0x1000000になるんですが こうなるのが普通なんでしょうか?0x1になると思ってたんですが… どういう理屈なんでしょう?fwriteで0x1を書き込んでも01 00 00 00になるし 環境はMinGW gcc3.2.3でやってます。
>>103 タマゴを割る時、太い方と細い方のどっちで割る?
おれっちは細い方から割るかな。
>>103 リトルエンディアン ビッグエンディアン
で検索汁
>>104 、105
即レスどうもです。
CPUによって違いがあるのですね。
勉強になりました。ありがとうございました。
あ、ぽこたんまで礼言われちゃったお
>>106 ネットワークに流すデータの場合はリトルエンディアンのCPUであっても
ビッグエンディアンに変換してから送出しないといけない場合があるよ
次から次へとバグが出てくる 疲れました さようなら…
化けて出るなよ、R.I.P.
113 :
デフォルトの名無しさん :04/10/16 10:22:24
exeファイルを逆アセンブルすれば どこらへんまでプログラムを解析できるんでしょうか? ソースくらいまでわかってしまうんでしょうか?
>>113 ソースはどうやっても無理。情報が残ってないから。
同じようなソースを復元するのなら、スキル・想像力・忍耐力・時間があれば可能だろうが…
>113 元の変数名はわからないから用途も不明。 定数なんかも即値で埋め込まれるからマジックナンバーだらけ。 条件文やループ文もJUMP命令の嵐。 そんな汚いソースでよければ解析してくれたまい。
構造体も消滅しちゃうしな。
exeを解析すると元のソースがC++だったとかJavaだったとかは分かるのかなぁ
>>115 俺が最初に就職した会社で最初に振られた仕事がモロにそれだった
objファイルとexeファイルだけ渡されて、ソースの復元を(構造体も含めて)しろって
ソース読む能力を付けさせるための仕事だったんだろうとは思うが、泣きそうになりながら
復元した記憶がある
C99に対応してるコンパイラってある?
部分対応とかばっかりじゃないかな
>>121 意外なことにVCの適合率がかなり高い
でもオススメはやっぱgcc
C++BuilderX にC99準拠コンパイラのプレビュー版とかあるみたい
友人にC勉強中はgccで-Wall -Werror -g付けておけと言われたのですが外しても良いですか?
dame
変数のスコープでどうしてもわからないところがあるのですが forやif分で宣言した変数はそのブロック内に限られると書籍には書いてあったのですがVC++6.0で試してもどうもそうはないってないと思うのです。 下のソースをコンパイルしたときにスコープ外での使用でエラーが出るはずだと思うのですがエラーにならないのはなぜなのでしょうか? #include <iostream> using namespace std; void loop() { for(int i=0; i<10; i++){cout << "ループ" << i+1 << "回目です。\n";} cout << i << endl;//forブロックの外でiを使用。ここでエラーが出るはずなのでは?? } int main() { loop(); return 0; }
VCがクソだから VC 2005でも未だに直ってない 嫌ならオプションで消せるが…
>>127 かつてARMと呼ばれる書籍でそのように決められていたから。
現在では規格で君が言ったように決められているから、コンパイラの
挙動が間違っている。コードの移植性が下がるから、自分で規格通りに
なるように気を付けよ。
>>127 マクロ無かったっけ?
#define for(arg) if (false); else for (arg)
こんな感じでforのスコープを規格通りにさせるやつ
>>131 VC使ってないので記憶が曖昧なんだけど
結構そのたくましさに感心したんだけどな
最悪な理由を解説よろしく
>>128 オプションで直せるんですか?
VC++6.0でも直せればぜひぜひ方法をば・・
>>133 ってかC++使いたいんならVC6なんか使うなよ
.NETに移行すれ
>>133 C/C++→カスタマイズ→Microsoft言語拡張機能を無効にする
にチェック。
でもMFCとか使えなくなるんじゃないかな。
な〜んだ直せるのか
>>135 MFCが使えなくなる・・・さりげなく厄介ですね。
コンソールで動くプログラム限定で使用が望ましい気配。。。
いや、正確な所は確認してね 最近はVC++使ってないからシラネ
なんかエラーが出なかったコードまでエラーが出るようになった。。 VC++6.0がすでに時代遅れなのか。。やっぱり.netを検討するべきか。。。
VC++Toolkit2003タダだし使えば?
MFCじゃなくてwindows.hまで使えなくなる。 あと、例のマクロは #define for if(0);else for だな
142 :
デフォルトの名無しさん :04/10/17 01:13:20
C++で、クラス定義をヘッダファイルに書いて、メソッドをcppファイルに 分けて書くのって何故ですか? 1つのファイルに書いた方が分かりやすいように思うんですが。
>>142 クラスを使うだけの人にクラスの内部処理の詳細を見せないため。
145 :
デフォルトの名無しさん :04/10/17 01:21:25
>>142 一度コンパイルすれば修正するまでコンパイルし直さなくて済む。
単に技術的問題。 当時はJavaみたいに一つのファイルから 定義だけを抜き出す方法を作れなかった。
>>145 分けても修正すればコンパイル必要じゃん。
printf()のような、可変長引数を取る関数にパラメータを渡したいのです。 下のような例の場合はどうすればよいのでしょうか? void foo (const char *format, ...) { /* xxx */ } /* void vfoo (const char *format, va_list ap) { } */ void bar(int numargs, char *argv[]) /*ここは自分で変えられない*/ { /*foo()かvfoo()を呼びたい*/ /*vfoo(args[0], args[1:]); のようなことがしたい。*/ /*つまりfoo(args[0], args[1]、args[2], args[3], ...args[numargs -1]); のようなことがしたい。*/ } numargsとargsからva_listを作ることはできますか?
>>148 va_listそのものを作ることは出来ない。
ただし処理系に依存しても良い(移植を考えない)のなら、
適当にスタックに積んでから関数を呼べば実現出来る。
プログラマーの人って一日何行くらいプログラム書いてるんですか?
if (a==0) { if(b==0) { ....... } } これを if (c==0) { if (a==0) { if(b==0) { ....... } } } という風に新たにc==0の条件文を外側につけた時に プログラムを見やすくするためにa==0とb==0の条件文を右に ずらさなければならないのですが この例だとたった数行分をずらすだけでいいのですが もっと入れ子になった条件分をかたっぱしから右にずらすのは 骨が折れます 一度に複数行を右に平行移動させることはできないのでしょうか?
エディタの使い方を勉強してくれ。
>>
>>151 ずらしたい行を選択してTAB。左にずらすときはShift+TAB。
if(〜){ }else{ } みたいに最初の { を if() の右側に書いてしまうのは エディタのことを考えると良くない書き方なんでしょうか?
>>156 if文はいつもそんな感じで書きますが。
class c { }; f() { } if (x) { } else { } try { } catch (a) { } catch (...) { } これ以外は認めない。
if( x ) { } else { } try { } catch( a ) { } catch(...) { } だな、俺は。
160 :
デフォルトの名無しさん :04/10/17 13:55:07
>>147 だから修正するまでと書いただろう。読めないのか?
161 :
デフォルトの名無しさん :04/10/17 15:29:11
ifstreamのある位置からある位置までのバイナリデータを ofstreamへコピーしたいのですが簡単に書く方法はありますでしょうか? // ifsの[offset, pos)をofsへコピーしたい size_t offset, pos; ifstream ifs; ofstream ofs; ..... ifs.seekg(offset); // ofs << ifs.rdbuf(); <-ifsを最後まで読むだけならこれで良いんですが・・・ 大きなデータなのでバッファをちゃんと扱わないとマズイです。よろしくお願いします。
自己解決しました。すいません。
istreambuf_iterator<char> iit(ifs); ostreambuf_iterator<char> oit(ofs); for(size_t i = 0; i < pos - offset; ++i, ++iit, ++oit){ *oit = *iit; } か,もしくは int meta; streambuf *isb = ifs.rdbuf(); streambuf *osb = ofs.rdbuf(); meta = isb->sgetc(); osb->sputc((char)meta); for(size_t i = 0; i < pos - offset - 1; ++i){ meta = isb->snextc(); osb->sputc((char)meta); } としました.問題があるとか,もっと良い方法があるとかあったら指摘お願いします.
>>164 俺もいろいろ考えたけど、たぶんその前者が最適解でしょうな
istreambuf_iterator end = iit; advance(iit, pos - offset); copy(iit, end, oit); かな
さあ。 動かないならcopy_n関数テンプレート作ればいいし
>>164 iit は終了チェックしなくていいの?
>>168 は動かない。
ISO/IEC 14882:1998
24.5.3 Template class istreambuf_iterator
-3
Note that in the input iterators, ++ operators are not equality preserving,
that is, i == j does not guarantee at all that ++i == ++j. Every time ++ is
evaluated a new value is used.
24.5.3.5 istreambuf_iterator::equal
-1
Returns: true if and only if both iterators are at endofstream, or neither is
at endofstream, regardless of what streambuf object they use.
バッファを使いまわして readとwriteで繰り返して操作した方が効率がいい。
アドバイスありがとうございます. >168 istreambuf_iteratorはInputIteratorで入力を一度しかトラバースできないので advanceは使えないかと思います. >170 実は作ってたんですが171さんの言うように終了判定を考えると copy_nの利用は危なそうだなと思ってやめました. >171 省略してました.実際やるとしたら for(size_t i = 0; i < pos - offset && iit != istreambuf_iterator<char>(); ++i, ++iit, ++oit){ ... な感じでしょうか? >173 試してみます.
175 :
デフォルトの名無しさん :04/10/17 20:27:52
プログラミングを初めて、いろいろな本を読んだのですが、どうしても分からないので聞きます。
完全な独学で勉強したのでかなりトンチンカンなことを言っているかも知れませんが、自分なりに努力をしたのでお願いします。
前にシューティングアルゴリズムマニアックスという本を買ったのですが、
http://www.amazon.co.jp/exec/obidos/ASIN/4797327316/249-0856311-3939535 この本についてくるプログラムソースは弾、自機、背景、などを違う.cppファイルに記述しています。
しかし、コンパイルすると一つのゲームとしてビルドされます。
ヘッダーファイルであればincludeの記述を行うことでインクルードされることは分かるのですが、cppファイル同士、それも種類ごとに分けて記述したcppファイルを一つにするにはどのようにすれば良いのでしょうか?
一つのファイルに記述されたプログラムを順番に分割するのであれば、分かるのですが、このようにプログラムを並べたのでは同時にプログラムが処理されてしまうのではないのでしょうか?
多分かなりとんちんかんのことを言っていると思います。
どうしても一つのプログラムをいくつものファイルに分割して記述する方法が分かりません。
>>175 まず、ソースファイルは必ずしも分割して書く必要はない。しかしながら、あまりにも
1つ1つのソースファイルが大きくなると、コンパイルに時間がかかるし、少し変更した
だけでも全体をコンパイルしなおさなければならなくなる。それに、大きなファイルの
内容を管理するにしても、人間の頭にも限界があるし、普通は1人ですべてのコードを
書くわけでもない。だから、ソースを分けるという考え方が出てくる。さて、当然複数の
ソースをコンパイルすると複数のオブジェクトファイルが出来るわけだが、これらは
そのまま実行されるのではなく、リンカという別のプログラムに通され、結合される。
すると、ここでやっと1つのプログラムファイルが出来上がる訳だが、複数のオブジェクト
ファイルに対して複数の同時実行が行われるわけではない。たとえば、a.objという
オブジェクトファイルにfoo()という関数があり、これをb.objの中から呼び出していると
する。複数のオブジェクトファイルがあるから当然直接呼び出せない。これを解決する
役割を担うのがリンカ。こういう複数のオブジェクトファイル間の関数等の呼び出しを
解決するのが仕事。すると、結果的にファイルは1つになる(ダイナミックリンクは除く)
でしょう?
というか、色々な本を読むのはいいが、
いきなりゲーム開発の本なぞ読まずに
まずC/C++の入門書をきっちり仕上げろよ。
それをやってれば
>>175 の質問は出てこない。
ルールもろくに覚えてないうちに定石集買って
読んでも、そら分からんだろう。
Ruby最強!
全く初歩的なことだけど… GUI環境って何のこと?ネタじゃないよ。。
ぐらふぃかるゆーざーいんたーふぇいすかんきょう
READ THE FUCKING ARTICLE, YOU LAZY MOTHER FUCKER.
>>183 無かったら、動き回れない…っていうこと?
185 :
175 :04/10/17 22:33:36
どこか、リンカについて分かりやすく解説してあるサイトはないですか? 家にある本ではさらりとしか解説されてなくよく分からないです。 MSDNも見ましたが余計にさっぱり分かりません。
スレ違いですけど聞きたいんでよろしくネ。(´◕ω◕`)
>>172 の
>Every time ++ is evaluated a new value is used.
この文ってTYPOですか?
おれっちの脳内じゃ
Every time ++ evaluated, a new value is used.
こちらの方が正しいような気がするんだけど。どう?
>>182 エロDVDが見れる。ヌケル。そして、彼女要らず。
188 :
デフォルトの名無しさん :04/10/17 22:47:58
javaのパスの設定が上手くいきません…… j2sdk-1_4_1-windowsi586をインストールし、パスの設定を行った後に、サンプルアプリを動かそうとしたのですが、ダメでした…… 「%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Program Files\ATI Technologies\ATI Control Panel;C:\Program Files\pcdNavi\bin;C:\Program Files\Fujitsu\sa\dll;;C:\Program Files\Sonic\MyDVD」 がパスの変数値の最初の設定でした。 この末尾に「C:\j2sdk1.4.0_01\bin」と付け足したのですが、サンプルは動かないんです……
189 :
188 :04/10/17 22:48:40
誤爆です……
>>191 あ゛。まちがった。
streambufの使用者。かな?
>>175 リンカについては知らんけど、
>>177 が言うように、C/C++の入門書で、基本をきっちりしたほうがいいよ。
俺も完全独学で、最初いきなりDirectXから入って、参考書のサンプルいじくって一応は動いてたど、
やっぱ不安なので猫さんのとこで基本勉強したら解るようになった。
いや、俺も昔分割コンパイルに疑問持ってたから、人事に思えなくてw
>>186 Every time ++ is evaluated, a new value is used.
のコンマが省略されたんだと思われ。
>>194 うん。その方が自然ですね。
分詞構文にもっていって副詞句として扱うのは無理がありましたね。
どうもありがとうございました。
196 :
デフォルトの名無しさん :04/10/18 00:23:00
void文を書いたのですが、「型の前に";"がありません」とエラーが出てしまいます、 //行列の表示 #include <stdio.h> void show(int s[][3],int row); void main(){ int a[][3]={10,20,30,40,50,60}; int i,j,row; show(a,2); void show(int s[][3],int row); for(i=0;i<row;i++){ printf("| "); for(j=0;j<3;j++){ printf("%d ",a[i][j]);} printf("|\n");}} 色々試したのですができませんでした、原因をお教えいただけませんか。
>>196 void文って何?
一見めちゃくちゃなコードに見えるけどvoid文が何なのかわからないのでうかつにつっ込めない・・・。
int文とかprintf文とか
voidは値をreturnで返さない関数の文? とかって聞いたのですが。 ・・・滅茶苦茶なのかorz
>>196 もうむちゃくちゃすぎ。
想像で補って書いてみたが、
こういうことをしたかったのか?
#include <stdio.h>
void show(int s[][3],int row)
{
for(int i=0; i<row; i++)
{
printf("| ");
for(int j=0; j<3; j++)
printf("%d ", s[i][j]);
printf("|\n");
}
}
int main(void)
{
int a[][3] = {10,20,30,40,50,60};
show(a, 2);
return 0;
}
動かすだけなら↓でいいが。 関数をラベルのように定義するその書き方は何かのコンパイラの拡張? #include <stdio.h> void show(int s[][3],int row); void main() { int a[][3]={10,20,30,40,50,60}; show(a,2); } void show(int s[][3],int row) { int i,j; for(i=0;i<row;i++) { printf("| "); for(j=0;j<3;j++) { printf("%d ",s[i][j]); } printf("|\n"); } } void文って、 void() のこと?
>>196 ヒント:以下はごく自然なCのコード。
$include <stdio.h>
void show_string (const char *str);
int main (int argc, char *argv[]) {
show_string("hello.");
return 0;
}
void show_string (const char *str) {
puts(str);
}
>>196 そういうエラーって{}がちゃんとなってなかったりしても出る
ガンガレ!
そういや,Metaware の High-C っていうコンパイラは 関数内関数を使えてたね。 # あと,よくわかんない反復子の仕組みもあったし。 # 今で言う「イテレータ」とはなんかちょっと違う概念だった気もするけど。
>>202 > $include <stdio.h>
(´ι_`)
あげあしでスマソ。
マジでこれで悩む初心者とかいたらいけないので念のため指摘。
>>205 関数内関数ってPASCALみたいな感じ?
>199 「文」という言葉の使い方が変。 式と文と関数はそれぞれ別の概念だ。 「戻り値 void の関数を書いたのですが」あたりじゃないかと思われ。 で、関数の定義の仕方が滅茶苦茶。 ・関数の中で関数の定義はできない(独自拡張で可能な処理系もあるが)。 ・2回目の void show(int s[][3],int row); ←のセミコロンは何よ?
>>206 自分でやっといてワラタ
っていうかもう寝ようw
>>207 うん。細かい仕様は忘れたけど,便利だった。
High-C は C コンパイラのくせに,C++ みたいに変数をどこででも
宣言できたりしてた。
voidの使い方自体が間違ってた?と言う事でしょうか。 ありがとうございます、もう一度一からやってみます。
voidの使い方は合ってるが・・・。 ほかのところが間違いまくってる。
>>210 引数なんかC99風の最新規格を使っときながら
なんでそんなに滅茶苦茶で異常なコードを書いてしまうのかわからん。
213 :
デフォルトの名無しさん :04/10/18 01:00:52
プログラムとか全然知らないんだけど EXEの設定を弄くることは出来ますか? 例えばあるEXEが起動するとき「開始します」とかの表示を「開始するぞゴルァ」 みたいなのは出来るんですか? またEXEを弄くるソフトは何ですか?
Windowsのマウスカーソルってどのプログラム(モジュール?)が制御してるんでしょうか?
とりあえず普通に丁寧に書いたら
>>200 みたいになる。
>>213 板違い。
そういうソフトを作りたいのならこの板でかまわんけど。
>>213 文字列がリソースとして定義されているならResource Hackerかな。
でなけりゃ資料を見ながらバイナリエディタで書き換えるかOllyDBGとかのデバッガつかうか。
しかし素人にはオススメできない。
218 :
デフォルトの名無しさん :04/10/18 01:10:05
Resource Hackerとバイナリエディタを検索してみて色々やってみたいと思います ありがとうございました
>200 実行してみたら、やりたい通りになってました、ありがとうございます >201 voidを使って行列を書いてみる、というのが課題でして・・・ voidの使い方とか、webで調べたんですが、何か勘違いしたヨウで・・・ >202 charというのはまだちょっと分らないので、あとで調べてみます >208 セミコロンは間違えて付けてしまったものです、すいません
new delete について質問です。 new で確保したメモリ領域は、delete で開放しろと、 いろいろな解説ページで見たのですが、 開放しないままプログラムが終了すると、どうなるのでしょうか? 簡単なプログラムを作って試してみたところ、 プログラムが終了した時点で、メモリは開放されているようなのですが、 プログラム終了時にわざわざ delete でメモリを開放する処理を入れる必要はあるのでしょうか?
>>220 開放しないと、メモリリークが起こる。
そうなるとフリーズしたり、いろいろ障害がでる、と聞いてる。
newだけがメモリを確保するのではなく、グローバル変数などもメモリを確保している。
プログラムが終了したときに開放されたのは、そういった変数だと思う。
って、俺もちょっと曖昧なので他の人、修正・補足お願い。
>220 「malloc()して(プログラム終了時に)free()しない」、なら、百歩譲って許せなくもないが、 deleteはメモリの開放だけでなく、デストラクタの実行も担っているから、 絶対に省略はあり得ない。
まあ (常識的な OS なら) メモリくらいはプログラム終了時に 自動で解放してくれるけどね。 でもいちいち 「このオブジェクトは delete しなきゃいけない。 このオブジェクトはただのメモリの塊だから delete しない。 こっちのは……どうだっけ?」 とか考えるの('A`)マンドクセ
おっと、誤解されそうな予感。 要するに、delete が必要か不要かを考えたり あまつさえ省略しようと企んだりするのは 激しく徒な遠回りだよって事。
あーもう。漏れ>233じゃねーし。 つーか盛れが抱えてる問題が解決しねーし。イラつく。もう寝ようっと。
>>220 デストラクタの実行を無視すれば、
小規模なプログラムなら終了時にまとめてメモリ解放
でもなんとかなると思うが、ある程度の規模になると
いらないデータがメモリを占有しつづけるのは非効率的
になってくる。
GCが信頼できる環境でないかぎりは解放するのが無難。
普通のプログラマなら「開けたら閉める」
ってのは普通の感性じゃないかなぁ。
>>219 >voidを使って行列を書いてみる、というのが課題
行列(を格納した配列)をvoidポインタで渡すようにして
ルーチンを汎用化するって意味ではないかと思った。
だとすると
>>196 はまったく的外れ。
行列の幅を固定しちゃってるし。
おそらく課題はC言語で書くことだと思うけど、
念のため補足しておくとCとC++では作法が結構違う。
C++ならそれの実現のためにvoidポインタを使うべきではない。
>>221 222 223 226
なるほど、やはりDeleteした方が、
無難…、というかDeleteするのが常識かもしれませんね。
ご返答ありがとうございました。
ったくど素人が何いってんだか... 終了時のdeleteなんか時間のムダ もし省略するとシステムにダメージを与えるような 処理をデストラクタ内で行なっているならば、それは設計ミス そういうたぐいの後始末は専用の関数かなんかにして シグナルハンドラで呼び出すのが正しい だから必要なdeleteなどなく、何も考えずに終われって事だ
フレーム論争やりたいならnewsにでも逝け
floatの定数を、バイナリーデータとしてそのままint型に代入したいのですが、どうしたらよいでしょうか。 float a = 1.23456f; int b; b = *((int*)&a); みたいなことを、変数aを使わずに b = ... のように行いたいのです。 int は float とデータサイズは同じと考えていただいて結構です。
*(float*)&b=1.23456f
>>231 union {
float f;
int n;
}fton;
やべっ。 186そのままだった。はずかしいーーー。
>>232-233 ありがとうございます。
すみませんが、もう一つ質問がありまして、
struct {
int type;
union {
int idata;
float fdata;
} data;
} tdata;
tdata sample_data[] = {
{ 1, 20 },
{ 2, 3.456f },
{ 1, 123 },
:
};
のように初期化したいのです。
メンバ"type"は、メンバ"data" の型を表し( 1ならint、2ならfloat など)、
メンバ"data"には int あるいは float の値が入ります。
union を使用すると、初期化時には最初の型(この場合、idataの型=int)で初期化せねばならないようで、
上のリストのように初期化することができず、また、
>>232 のような方法でも書くことができません。
どうしたらよいのでしょうか。
全部整数として書け 値は int i; *(float*)&i=,3.456f; printf("%d",i) ってやって調べろ
237 :
デフォルトの名無しさん :04/10/18 13:17:33
文字列の分割をしたいのですが、strtokの挙動が今ひとつよく分かりません。 #include <stdio.h> #include <string.h> int main(){ char str[]="信長<><>2004/10/18 12:42:45<><>はじめまして<><>カッコイイHPですね。\nこれからちょくちょく遊びに来ますんで。\nよろしく。"; char sp[]="<><>"; char *r=NULL; r=strtok(str,sp); while(r != NULL){ printf(">>%s\n",r); r=strtok(NULL,sp); } return 0; } char sp[]="<><>"の部分を char sp[]="<>"にしても、char sp[]="k<>"にしても、同じ結果になります。 どうしてでしょうか?
238 :
デフォルトの名無しさん :04/10/18 13:19:37
excel形式でファイルを出力したいんですがどうしたらよいでしょうか
>>236 やはりそうするしかないですかねー。そういうマクロでもあれば良いんですけど…。
あるいは、逆に全部 float で書いて、使うときに int にキャストとか。
(辻褄はあうけど、明らかに曲がったやり方だと思う)
printfするにはデータ量が膨大なので、とりあえず、前処理するツールを作って
それを通して吐き出させようかと思います。
(といっても、ホントに *.*f を 0x???????? に書き換えるだけなので、
そのために一段階増えるなんてもったいない気がしてなりませんが)
なにか他に方法があれば教えてください。
>>237 char sp[]="<><>\n";
こーゆーこと?
>>237 manなりhelpなりでstrtokをちゃんと調べれー
第二引数は「デリミタ文字群」だ
char str[]の文字列の中にkが無いから
244 :
デフォルトの名無しさん :04/10/18 14:03:08
プログラムの量が多くなってくるとデバッグが大変だね バグを単離して同定することすら難しくなってきた デバッグするときのこつを教えてください 再現性のあるバグなら予想はつくんだけど なかなか再現性が見いだせないバグはやっかいだね…
VC++5.0 WindowsNTWS4.0でWin32 dllのプログラムを 作成していますが、その内部で、 printf("%I64d\n", i64); が表示できず、そのままI64dと表示されます。 i64は「__int64」で定義しています。 これを64bit値で正しく表示するにはどうすればいいですか? あと、演算結果を__int64の型の変数に入れたにもかかわらず、 2の31乗を越えた値がマイナスになります。これはどうしてですか?
std::auto_ptr<int> p(new int); std::auto_ptr<int> p2(p); std::auto_ptr<int> p3(new int); std::auto_ptr<int> p4(p3.release()); VC6付属のSTLではp2, p4に所有権が移動するだけでポインタ値は残るのですが STLPortではp, p3のポインタ値が空になります。 どちらの振る舞いが正しいのでしょうか…
>>245 >あと、演算結果を__int64の型の変数に入れたにもかかわらず、
>2の31乗を越えた値がマイナスになります。これはどうしてですか?
intで計算してるんだろ。__int64に格上げしてやれ。
>>246 auto_ptrの仕様でもよみな。
ちなみVC6のC++の挙動を正しいと思わんことだ。
仕様に規定されてる?
>>247 明確に(__int64)でキャストは行っているのですが・・・。
おそらく__int64で定義されているにもかかわらず、32bit
という扱いにされていると思うのですが・・・。
環境疑う前にソース晒せ I64の所も含めて、小細工せずにコピペで
253 :
デフォルトの名無しさん :04/10/18 15:59:52
Visual C++ .Netで開発しています。 可変引数を持つ関数hoge(char * szBuf, ...)があります。 hoge内からさらに可変引数を持つサブルーチンhogehoge(int iCnt, ...)をコールします。 hogeに渡された可変引数すべてをそのままhogehogeに渡すにはどのように記述すれば よいのでしょうか? ちなみにhoge内では可変引数の個数や型などはわかりません。hogehoge内で判明します。 hoge内でva_list型としてva_arg()で値を取得すればいいかと思い以下のように記述 してみましたが、可変引数の個数が複数になると2個目以上が取得できませんでした。 hoge(char * szBuf, ...) { va_listargs, args2; va_start( args, szBuf ); args2 = (va_list)va_arg( args, va_list ); //中略 hogehoge( iCnt, args2 ); va_end(); }
>>253 hogehoge(int iCnt, va_list); を作る
しか思いつかないなぁ。
つかhogeで可変引数の詳細がわからないと
hogehogeにどれだけ引数を積めばいいかわからないと思うんだけど。
>>239 union初期化でintが必要でfloatは使えないと言うなら、
別にfloatの配列を置いてそこから引っぺがしたら?
こんな感じかな?
static const float sF[] = {3.456f, 3.2f};
struct {
int t;
union {
int i;
float f;
} u;
} sS[] = {
{1, 20},
{2, *(int *) & sF[0]},
{1, 123},
};
>>252 こんな感じになります。
CUR_SP = (__int64)hlen + rlen * (RecNo - 1);
#ifdef DBG
wsprintf(DBG_BUF, "(%I64d)\n", CUR_SP);
DbaDebugWrite(DBG_BUF);
#endif
CUR_SP自体が2の31乗を越えた場合には、
CUR_SPを31bit右シフトした結果を表示させたら
-1になりました。
>>256 rlenとRecNoがintというオチだと予想
wsprintfはI64対応してんのか?
259 :
237 :04/10/18 17:27:16
ありがとうございます。
>>240 えっと、すいません、よく分かりません。
>>241 tp://www.linux.or.jp/JM/html/LDP_man-pages/man3/strtok.3.html
tp://www.shibu.jp/cppreference/stdstring_details.html#strtok
を参考にしてみたのですが、"デリミタ"というのがよく分かりません。
>>243 kがないのになぜ分割されるのでしょうか?
>>259 辞書引け: delimiter
第二引数で指定した「文字列」で分割するのではなく、
第二引数で指定した「文字のいずれか」で分割する。
つまり char sp[]="k<>" なら 'k' か '<' か '>' で分割。
とりあえず char * section = new char[strlen(str)]; unsigned position; sscanf(str, "%[^<>]%n", section, & position); とでもしとけ。
>>237 ('A`)マンドクセ
boostのsplitでも使っとけよ。
条件分岐の入れ子が多すぎて流れが理解できないようになってきました こんな場合はどうすればわかりやすくなるんでしょうか?
Ruby!!!!!!!
>>264 そのコードを捨てる。
↓
2ch に問題をうpする。
↓
暇人が美しいコードに変換してくれる
↓
ウマー!
269 :
デフォルトの名無しさん :04/10/18 20:07:50
>>266 それはちょっとできないですw
>>267 いままでifとforしか使ったことなかったので
swich文も使ってみます
>>268 難し用語ですね
検索してみましたけどなかなかわかりやすく解説してくれてるところがないみたいです
アドバイスありがとうございました
>>269 条件を洗い出すと、単純な表に書ける場合がある。
その場合はその表を配列として実装すれば複雑な条件を緩和できるかもしれない。
bit を反転させる関数って標準でないですか?
ちぇきちゃとこへ10時の爆撃行ったーーーーーーーーーーー!!ksk
>>258 正解。wsprintfはI64非対応。245はsprintf(か_stprintf)にしろ。
>>271 はよそういえや。で、標準関数にはそんなもんない。
>>274 久々にカルノーマップかいてたら吐き気がしてきた。
スパッとできるトリッキーなコードとかありそうなんだけどなぁ
>>278 1バイトとは限らないぞ32ビットだったりした日には…
テンポラリを使わずswapするコードってどうやんだっけ? xor使ったと思ったんだけど。
>>282 swap( int *a, int *b )
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
要素数0の配列をnewしたときの振る舞いについて教えてください。 例えばこんな感じ int* p = new int[0]; VC6SP6ではNULL以外の値が返ってきましたが 本当に正しいのかどうか…
>>284 A zero-sized array is legal only when the array is the last field in a struct or union
>>284 5.3.4 - New
-7- When the value of the expression in a direct-new-declarator is zero,
the allocation function is called to allocate an array with no elements.
The pointer returned by the new-expression is non-null.
[Note: If the library allocation function is called, the pointer returned is distinct from the pointer to any other object. ]
287 :
237 :04/10/19 00:16:43
ありがとうございます。
>>260 それでやっとstrtokの結果が理解できました。
その中のどれかの文字と一致するということは、
Perlでの正規表現だと、
[k<>]
みたいな感じですよね。
Perlでいうsplitのような処理をするにはどうプログラムを組んだらいいのでしょうか?
splitのような処理をしようとして検索していたらstrtokにたどり着いたのですが。
>>261 strtokの処理の代わりにそれを入れてみましたが、何も表示されませんでした。
>>262 boostを検索してみたのですが何かダウンロードしなきゃいけないみたいですね。
boostのをダウンロードしてやるのが一般的なんでしょうか。
boost使いたくないんなら、strstr()とか使って自前でやったら?
>>285 それは
struct A
{
char hoge;
int hage[0];
};
とかそんな状況の事じゃないでしょうか?
>>286 「library allocation function」が何を指しているのかわかりませんが大丈夫そうですね。
ありがとうございました。
>>284 More Exceptional C++ Item 29に載ってるぞ。
More Exceptional C++ っていつになったら訳本が出るんだろうね
>>287 どちらかというとジョークっぽいニュアンスの発言ですた。
boostを使うのはちょっと大げさすぎる。
やっつけ仕事としてならsplitを使うのもアリだと思うけど、
普通は
>>288 の言うように strstr でループさせる。
>>290 それ持ってません…3500円もするんですね…
本代なんかケチんなよ 自分への投資を惜しむな
\3,500でビビってたら技術書、専門書は買えない
ネットで見つからなくて本でのみ見つかる情報で元が取れるとは思わない。
なら買うな、それで終了
C(cc) + OCI8を利用してストアドプロシージャを呼び出す上で OCIBindByNameを利用して OUT引数から文字列の結果を受け取ろうとしているのですが SP側でそのOUTの変数がNULLの状態になっていると OCIExecuteに失敗してしまいます。 (もちろん、何かしらの値を代入すれば正しい結果を取得できています) それと確認を取っていないのですが オールスペースの文字列がORACLEではNULL扱いになるとかならないとか (これはココじゃなくて ORACLEかDB関係のスレを探すべきかな) C言語からのOCI関係の参考書・参考ページを1週間程探してみたのですが ヴァージョンが低かったり、本家PDFのコピペだったりと目的の情報にあたりません。 上記、どなたかお力添え願います。
299 :
デフォルトの名無しさん :04/10/19 03:18:39
#defineの値をコンパイル時に与えることはできますか?
なんでそういう回答しかしないの?
それで
>>299 が分かる人だったら
こんな質問しないでしょ?
もうちょっと考えろよ
なんでそういう回答しかしないの?
それで
>>877 が分かる人だったら
こんな質問しないでしょ?
もうちょっと考えろよ
>>299 大抵のコンパイラはDオプションで指定できる。
なんでそういう質問しかしないの?
それで
>>300 が分かる人だったら
こんな回答しないでしょ?
もうちょっと考えろよ
つか、妙な回答だと思えば自分が答えればいいだけなんだが。
質問です。 クラス CSuper を親クラスに持つ2つのクラス CChildA, CChildB があったとして、 イメージとしては、以下 CSuper* array[2]; array[0] = new(CChildA); array[1] = new(CChildB); のように、同じ基本クラスを持つ複数の型の要素を持つ配列を作成したいのですが、 もちろんこれでは、CChildA のメソッド m を array[0]->m のように呼び出すことはできませんし、 環境によるとコンパイルエラーになるかもしれません。 このような構造を実現できる方法はないでしょうか?
それがAとBで共通のメソッドなら、CSuperでインターフェースを定義しとく。 AだけでBには持たせたくないのなら、諦めてdynamic_cast。 でなきゃboostにそんな構造があったような。
operator = で入れちゃえば?
>>307 ありがとうございます。
boost って言葉が初耳でしたので調べてみます。
もし無理なら諦めてキャスト……。
>>255 それだと、floatデータ一つにつきsizeof(int*)バイト分のデータが増えることになってしまいますよねー。
理想としては、一つの配列を、先頭からバイナリーで別ファイルにしたいので、
配列内にポインタが含まれたり、別の配列が必要になったりすることは避けたいのです。
結局
>>239 の方法でやってますが、やっぱり面倒…。
312 :
デフォルトの名無しさん :04/10/19 15:32:08
テキストファイルの任意の行を編集したいのですが サンプルってありませんでしょうか。
>>312 何がしたいのか具体的に書かないと誰もまともに応えられないよ。
編集処理のプログラムのサンプルなら、探せばあると思う。
fgets関数を使った後にstdinをクリアしなさいといわれ、 fflush関数を使ったのですが、fflus関数はダメと言われました。 他にstdinをクリアする方法を教えてください。
何も考えずに言われた通りにするな! 断れ!
いわゆる 空気読め! って奴ですね
_、_ ヽ( ,_ノ`)ノ 残念 おいなりさんだ へノ / ω ノ >
>>257-258 >>275 ありがとうございます。確かにsprintfに変更したら成功しました。
あと、64bit型の変数に入れる場合の演算は、変数ごとにキャストを
かけないとダメってことですかね?
通常のようにあとからまとめてキャストというのは失敗するようで。
>>319 >CUR_SP = (__int64)hlen + rlen * (RecNo - 1);
RecNo, rlen, hlenがintだとすると
演算の優先順位の関係で rlen * (RecNo - 1) はint同士の減算・乗算が行われ
hlen との加算で初めて__int64に格上げされる。
全部__int64で計算したければ
CUR_SP = hlen + rlen * ((__int64)RecNo - 1);
とする。
322 :
デフォルトの名無しさん :04/10/20 02:09:45
C++についてちょっと質問です。 class A //継承元 { (略) }; class B:A //継承先 { (略) }; という関係のクラスがあるとします。 また、これとは別に void Function(A *a); といったような、Aクラスを引数にする関数があります。 このとき、Aから派生したBクラスのオブジェクトを Function関数に渡す方法はありませんでしょうか? #チラっと見た限りでは、Javaではできるっぽい とりあえず、ちょっぴぃ脳みそで考えてみたところ、 ・Bクラスの中にAを含める(継承ではなく) ・Function関数をAクラスのメンバ関数にする くらいかなぁ?と。 諸先輩方、何かアドバイス等あればお願いします。
class B: public A { };
>このとき、Aから派生したBクラスのオブジェクトを >Function関数に渡す方法はありませんでしょうか? これが普通に出来なきゃ大惨事だろうが
325 :
デフォルトの名無しさん :04/10/20 10:14:46
質問なのですが d3dxof.lib というリンクライブラリは何処でダウンロードできますか? d3dxof.libを検索にかけて探してみたのですが 見つかりませんでした。
d3dって事はDirectXじゃないの? DirectX SDKではないか
327 :
325 :04/10/20 10:20:57
DirectX SDK ですね。 ありがとうございました。 さっそくダウンロードしてみます。
>>327 自分で何を作ってるのか把握できてるのか…?
329 :
デフォルトの名無しさん :04/10/20 11:45:36
沢山データクラスを作って 管理クラスでそれらをvectorで管理しようと思ってるんですが 管理の仕方ってポインタをvecterで管理するのと 実態で管理するのとどっちがカッコいいの? あと、メンバ変数でクラスを持ちたいときも ポインタで持ってるのと 実態で持っているのどっちがカッコいいの? C++な人おせーて
上段については、データクラス←→管理クラスが継承の関係なら、 ポインタでやるしかないんでは? 貴方の「カッコいい」の基準が分からないのでなんとも。 ポインタだとdeleteとかの手間があれこれあるから、 auto_ptr、スマートポインタ使うとか。
331 :
デフォルトの名無しさん :04/10/20 11:58:45
>>330 管理クラスって言い方が悪かった(´Д`;)
データクラスをvecterで持つ場合、ポインタがいいのか実態がいいのか?
って事です
どっちがカッコイイ?←C++で一般的にはどっち?
インスタンスの作成、コピーにかかるコストがでかいなら別だが、 vector内のポインタにnewして追加時もnewして要素取り除く時はdeleteして… って手間を考えればインスタンスを突っ込んどく。
>>332 作成時に new は仕方ないけど、
vector が消えたときに自動的に delete してくれるような方法ってないの?
auto_ptrは使えないぞ
適当なスマートポインタ使え
↓boost::shared_ptrは遅いという話
素直に実体持たせとけ。
>>323 簡潔かつ的確なアドバイスありがとうございます。
>>324 ごもっともです。
…今まで、継承するときに何で識別子つけるのか良く分かってなかったです。
340 :
デフォルトの名無しさん :04/10/20 14:48:34
メンバでクラスを持っておきたいときも実体のほうがいい? それともコンストラクタでnewしてポインタ持つほうがいいかね? どっちがカッコいい?C++な人おせーて
同じ事だ、目的・状況で使い分けろ。
342 :
デフォルトの名無しさん :04/10/20 14:52:40
>>341 使い分けはどのように?
ってかどのように使い分けてます?
普段は要らないが必要になった時にだけnewしたいとかか。 デメリット思い付かないなら全部実体で持ってろ。
漏れはJavaな人が使ったクラスを使うときと必要ないときに実体持ちたくないクラスを使うときくらいだな。
あと、ポインタなら前方宣言するだけで使えるからヘッダの依存性を軽減するのにも使える。
346 :
デフォルトの名無しさん :04/10/20 17:12:49
eVC++3.0での開発で質問があります。 テキストファイルを更新する関数を作りたいと思います。 この関数は、3行目という数値と、更新文字列を引数としてを与えると、 オープンしたテキストファイルの3行目を更新文字列で置換え=更新する という仕組みです。 この時、fopen(),fgets(),fputs()を使用して上記の処理を行うとして、 3行目を更新するという時には、"r+"モードでファイルをオープンし、 3行目までfgetsで読み込んでから、fputs()でおもむろに更新するという 手法でよろしいのでしょうか? 任意の行を更新するという手法がいまひとつ理解できません。 よろしければ教えていただきたいのです。すみません。
Turbo C++4でDOSプログラムを組んでいるんですが ビットマップのロードの仕方がわかりません 何か良い方法は無いでしょうか?
ポインタなら共有できる。実体だと複製になっちゃう。
>>346 置き換え後もサイズが変わらないのならそれでいいと思うけど。
>>347 どこにロードする方法がしりたいのですか?
>>351 ファイル開く→ファイルサイズ分のメモリ確保→ファイルサイズ分読み込む→ファイル閉じる
メモリといってもいろいろあるけど
BMPといってもいろんな種類があるよな
ロードといってもいろいろあるし
コーディングだっていろいろあるよね
>>357 >#include <iostream.h>
#include <iostream>に変更
ついか using namespace std; をmain関数の中に入れるかグローバル空間に記入しといて。
32Bitコンパイラで「int 10h」 のシステムコールを使うとバグるんですが 32bitコンパイラでDOSのビデオモードの 変更とかどうやってやるんですか? 教えてください、お願いします。
>>361 >346をよく読め。3行目までを読み込んでから3行目を書けるわけが無いだろう。
クラスのオブジェクトを配列で宣言したとき、 構造体のような初期設定リストによる初期化は出来ないと聞きました。 このような場合、どのように初期化するのがスマートでしょうか。 クラスとは別に代入用テーブルを作って、for文なり何なりで1個ずつ代入?
確かにできません。こんな方法はどうでしょう? 【std::vector<>を使って1つずつ追加していく。】 std::vector<foo> bar; for(int i = 0; i < N; ++i) bar.push_back(foo(hoge(i))); とか。
#define INT 10 main() { printf("INT"); } 結果は10でなくINTになってしまいます。 このように、""で囲まれたマクロを展開する方法を教えてください。
>>366 ""で囲まれた部分は文字列リテラルなのでマクロ展開の対象になりません。
実はC++の標準ライブラリってよくわかってなかったり(こそこそ) * * * 「猫でもわかる」を読んでいます。しばらくお待ちください * * * なるほど。 引数に対応した番号の、foo型のオブジェクトを返す(正確にはキャストですが) 関数hogeをどこかで用意しておいて、 それをvectorで順番に格納していくってことでしょうか。 どちらにせよ、別に用意しておいて代入するのが初心者には一番分かりやすそうです。 ありがとうございました。 #のちのちのことを考えると、ソースに直接書かないで #外部テキストファイルでも読み込もうかしら…?
>>366 sprintfとかで地道に展開してはいかがでしょうか。
最初から文字列って分かってるなら
#define HOGE "foo"
でも良さそうですが。
>>366 ""で囲まれたマクロを展開する方法は無いです。
ですが、マクロ展開の結果を""で囲むことはできます。
>>367 不可能ということですね。
わかりました。
ありがとうございました。
>>366 #define STR2(x) #x
#define STR(x) STR2(x)
#define INT 10
main()
{
printf(STR(INT));
}
一応、これで代用できるけどスマートじゃない気がする。
>>369 ,370,372
printfのフォーマット指定をするところに数字を使いたかったのですが、
どうも数字を直接書くよりはマクロで定義していつでも簡単に直せるようにしたほうがいい、
というのを見かけたもので、そうしたかっただけです。
わざわざありがとうございました。
>>368 意図したところはそれとは少し違ったんだけれども、その方がスマートかな。
そっちが書いた通りのコードは
foo hoge(int); // foo型のオブジェクトを返す関数hoge
…
std::vector<foo> bar;
for(int i = 0; i < N; ++i) bar.push_back(hoge(i));
ちなみにfoo(hoge(i))はキャストとは違う。同じように見えるかもしれないけれども、
これはiに対応してhogeが返した何かをコンストラクタ引数にして構築したfooの
一時オブジェクト。
>>367 こういうことがしたいんじゃないのか?
#define INT 10
略
printf("hogehogeINTfugafuga");
↓
printf("hogehoge"INT"fugafuga");
>>375 こういうことがしたいです。
int i = 100;
printf("%10d\n", i); → printf("%INTd\n", i);
377 :
デフォルトの名無しさん :04/10/21 00:28:05
VisualStudio.netでConsoleプロジェクトを立ち上げ、最初から付いてくるstdafxファイルを削除するとEOFのエラーが出てコンパイル出来なくなりますよね? これを消したい場合どこの設定を弄ればstdafxファイルなしでコンパイル出来るようになるのでしょうか?
>>376 printf("%*d\n", INT, i);
だったか?たしか。
>>377 プロジェクトのプロパティ→C/C++→プリコンパイル済みヘッダー
→プリコンパイル済みヘッダーの作成/使用 : プリコンパイル済みヘッダーを使用しない
>>378 できました。
ありがとうございました。
>>374 ああ、再度なるほどです。
なんとなくではありますが(多分)理解しました。
でもコンストラクタの引数の数が増えると、hoge関数も比例して……(汗)
>>381 何を心配してるのか知らないけど、この際hogeはまったく関係ない。
# 単に説明をややこしくしてるだけ
383 :
377 :04/10/21 00:48:43
有り難うございます。分かりました。 ところで、プログラムの最後でプリコンパイル済みヘッダーがあるとgetch()などをはさまない限り一瞬でプログラムが終了してしまいます。 プリコンパイル済みヘッダーがなれば、そんなことはないのですが。なぜなのでしょうか?
>>383 んなこたーない。プリコンパイル済みヘッダが無くても終わるときは終わる。
385 :
377 :04/10/21 01:19:50
>>385 大丈夫、プリコンパイル済みヘッダありでもなしでも普通は止まらない。
>>385 止まるかどうかは、デバッグ付き実行(F5)してるかデバッグ無し実行(Ctrl+F5)してるかの違い。
#defineマクロ中に改行コードを埋め込むことはできますか? 例えば、 #define HOGE(name) というマクロを、 #define name (__LINE__) int line_ ##name = (__LINE__)+1; という2行分に定義したいのです。
1行目とそれ以降の繋がりがよくわからん漏れはイッテヨシ?
漏れもサパーリ #define name (__LINE__)\ int line_ ##name = (__LINE__)+1; こういうこと???
すみません、たとえが悪かったです。 ようするに、#define によるシンボル定義と、それ以外の処理(なんでもいいです)を、 マクロ一つで済ませたいのです。 int now_line[] = { #define FOO1 __LINE__ FOO1, #define FOO2 __LINE__ FOO2, #define FOO3 __LINE__ FOO3, : }; というようなこととかを、マクロでやりたいなと。
つまり#defineの中に#defineを書けるか、ということか?
>>392 調べたところ #define の中で #define は無理みたいですね…。
別の方法を考えます。
宿題丸投げはそれ専用スレへ
c++ について質問です。 class ClassA { ClassB b; }; class ClassB { ClassA a; }; のように、2つのクラスが互いに相手クラスのインスタンスを持つとき、 この場合だと class A の定義の前に class B の存在を知らせる必要がありますが、 記述方法を忘れてしまいました。 調べようと思っても検索ワードが思いつかず……。ご指導お願いします。
class ClassB;
つーか無理
なんで? って、ポインタじゃなくインスタンスか またまた釣られちゃったぜー
>>397 ありがとうございます。
その定義を入れると、ClassB b; の行で
Error: field 'b' has incomplete type
と言われました。
あれ……
……無理?(;´Д`)
……当たり前だということに気づきました。ご迷惑をおかけしました……。
まずAの中にはBがあって そのBの中にはAがあって 更にAの中にはBがあって(無限再帰) C++は良く分からないけど、無理だと思う、流石に。 ただ、Aの中にBそのものを入れないで、Bを示すポインタを含めるとかだけなら 特に矛盾は起きないと思う。
質問テンプレ】 [1] 授業単元:C言語 [2] 問題文(含コード&リンク): [3] 環境 [3.1] OS:winXP [3.2] コンパイラ(バージョン): [3.3] 言語:C [4] 期限:今日中 [5] その他の制限:特に無し C言語初心者です。課題で迷っています。 strcmp関数(文字列の比較する関数)と同じ働きをする関数αを作りたいですがどのように作れば良いのか分かりません。教えて下さい。 ちなみに関数の作り方の構文は知っています。
>>404 こぴぺがはげしいな。
int scmp(const char* l, const char* r)
{
if(*l==*r){
return *l=='\0' ? 0 : scmp(++l, ++r);
}else{
return *l - *r ? 1 : -1;
}
}
宿題スレで回答されてるがな、嫌がらせ?
>>405 return (*l - *r)>0 ? 1 : -1;
こうか
408 :
デフォルトの名無しさん :04/10/21 16:39:18
if (条件文A) { } みたいな文で条件文Aがすごく長い時に2行にわたって条件文Aを書きたい時はどうすればいいのでしょうか?
409 :
デフォルトの名無しさん :04/10/21 16:41:03
>>408 改行すればいい
if(ab==cd&&
ef!=gh){
ijk;
}
410 :
デフォルトの名無しさん :04/10/21 16:44:02
>>408 何度も似たような条件文が出てくるなら
条件文を切り出して関数化しておくのも手だぞ。
(マクロでもいいけどその場合は副作用に注意。)
バッファ(*buff←ポインタ)に入っている文字列の最後に改行コードがあるのですが 改行コードだけを削除する方法がありましたらお教え願います。
終端ならNULL(0x0)に置き換えたら?
buff[strlen(buff) - 1] = '\0'
改行コードがCrLfやLfCrだったらどうすんだ
'\r' か '\n'
fgetsで読み込め。
418 :
デフォルトの名無しさん :04/10/21 23:17:32
int a a=1 で error C2501: 'a' : 識別名を宣言するのに、型が指定されていません。 というエラーがでるんですけどなんでですか?
;
420 :
418 :04/10/21 23:23:17
>>419 訂正
nt a;
a=1;
で
error C2501: 'a' : 識別名を宣言するのに、型が指定されていません。
というエラーがでるんですけどなんでですか?
と質問したかったんです、すいません
i
期待通りの展開にワロタ
int a; a=1; でしょ。他の部分で間違ってるんじゃ無い?
424 :
418 :04/10/21 23:31:07
上の行で”{”が抜けていたからでした 解決しました
425 :
418 :04/10/21 23:32:11
使えそうなクラスができたのでライブラリを作ってみたんですが ライブラリの使い方がわかりません。(win32 static library プロジェクト) ヘッダファイルにクラス定義、ソースファイルにメンバ関数を分けて書きました。 使うときに必要なのはどのファイルで、どこに置けばよいですか? コンソールアプリしか作りません。環境はMS-Visual C++6.0です。
427 :
デフォルトの名無しさん :04/10/22 00:49:59
教えてください DELETEDIRでフォルダの中にある全てのファイルを削除したいのですが その中のファイルが読み取り専用のファイルがあると削除できないようです これに対応するためにディレクトリの中にあるファイルの 全てのファイルを一度に属性をクリアさせてから実行したいのですが フォルダ内のファイルを取得(リスト化)してまわすやり方がいまいちよくわかりません、どうすればいいのでしょうか? すいませんが教えてください
CかC++です
430 :
デフォルトの名無しさん :04/10/22 01:00:01
じゃなきゃスレ違いだ罠 で、何を聞かれてるのかわからないか? と思ったら釣りか?
>>426 必要なのは、libファイルとヘッダーファイル。
libはプロジェクトと同じ位置が無難かな。
ヘッダーは普通にincludeすればいい。
後は#pragma commentでlib追加してやる。
こんなカンジかな。
434 :
デフォルトの名無しさん :04/10/22 01:26:38
vc++でプログラミングしています。 インタプリタっぽいのを作っていて その言語内で例えば str test[3]="asfd","fdsa","qwer";(strは文字列変数のことをさす) のような宣言をされたときに void* value=new char*[3]; のようにして (char**)value[0]=new char[4+1];strcpy((char**)value[0],"asdf"); (char**)value[1]=new char[4+1];strcpy((char**)value[0],"fdsa"); (char**)value[2]=new char[4+1];strcpy((char**)value[0],"qwer"); みたいなことをやっています。 ここまではうまく行くのですが ・このあとどれかを削除してそこに新しい文字列を追加する という作業を行うとアサーションとかいうダイアログがでてきてしまいます。 Debugモードでは駄目でReleaseモードだと難なく動くのです。 手順は 例えば真ん中の"fdsa"を削除して新しく"zxcv"という文字列を追加する場合は delete [] value[1]; (char**)value[1] = new char[4+1];strcpy((char**)value[0],"zxcv"); という具合に最初とまったく同じなのですが駄目みたいなんです。 このアサーションというのはどういうものなのでしょうか? 他の変数を壊している可能性があるのでしょうか?
>>434 書き間違いの可能性が高いけど、ダメダメじゃん。
どれもみんなvalue[0]にコピーしている。
それから、アサーションはDebugビルドのみ有効でReleaseビルドでは起きない。
つまり、Debugビルドでアサーションを起こさないように充分デバッグしてからリリースしろと言うこと。
で、value[1]をdeleteしているのが恐らくアサーションの原因。
void *じゃなくてはじめからchar **にしておいたら?
436 :
デフォルトの名無しさん :04/10/22 03:28:31
FitzHugh-Nagumo方程式の解軌跡を求めるプログラムを書き、興奮性を示すx,yの初期値を一組探しグラフで結果を示せ。ただし、a=0.7,b=0.8,c=20.0,z=1.0を初期値とし、これらの値を変更しても構わない。 dx/dt=c(x-x?/3+y+z) dy/dt=(a-x-by)/c よくわからないんです><
>>436 式の意味がよくわからんが t を少しずつ変化させながら、(x,y)を求めて
書いていけばいいんじゃまいか
興奮性ってのは良くわからんのでパス
質問です。 簡単のため、インスタンスは全て public とします。 また、クラス定義の順番がバラバラでコンパイルエラーが出るのは、ここでは気にしないとします。 class CParent { CChildA a; CChildB b; void func() { a.func(this); } }; CChildA { void func(CParent* p) { p->b.hoge=3 } }; CChildB { int hoge; }; のように記述すると、a が b のインスタンスにアクセスすることが出来ますが、 これはオブジェクト指向の概念からはずれてる気がします。 goto 文を避けるのが暗黙の了解になっているように、このような記述も避けるべきでしょうか? それとも、このような記述は普通に行なわれているのでしょうか?
ならpublicにするなよ 自分で公開して何言ってんだ
>>438 プロジェクト>設定>リンクタブを開く
カテゴリ「一般」>オブジェクト/ライブラリモジュール内に、使用するlibファイルを追加。
char型に数字が格納されているのですが char型同士で足したり引いたりできるでしょうか? また方法がありましたらお教えください。
>>443 普通にできる。
無論表現できる値の範囲は小さいけど。
446 :
デフォルトの名無しさん :04/10/22 15:13:37
a[1]=b[1]; で調べると a[1]の値が−83634454 b[1]の値が999 みたいな感じだったんですけど なんで右辺と左辺の値が違うんですか?
>>446 printf()か何かで表示させたのだろうが、その行も書いてみろ。
知らん
450 :
デフォルトの名無しさん :04/10/22 15:23:00
a[1]=b[1]; HDC hdc; TCHAR szBuf[32]; hdc = GetDC(hWnd); sprintf(szBuf, "%d", a[1]); TextOut(hdc, 10, 10, szBuf, lstrlen(szBuf)); ReleaseDC(hWnd , hdc); みたいな感じです
いや、全然わからん
for (i=0;i<9;i++) b[1]=999 a[i]=b[i]; HDC hdc; TCHAR szBuf[32]; hdc = GetDC(hWnd); sprintf(szBuf, "%d", a[1]); TextOut(hdc, 10, 10, szBuf, lstrlen(szBuf)); sprintf(szBuf, "%d", b[1]); TextOut(hdc, 20, 20, szBuf, lstrlen(szBuf)); ReleaseDC(hWnd , hdc); もっと詳しく書くとこんなかんじです
> for (i=0;i<9;i++) > b[1]=999 > a[i]=b[i]; 999の後にセミコロンがないんで、コピペミスってるとしても、 b[1]な時点でアホチン
>>453 a[], b[]の定義部分はどうなってる?
それからCHAR_BITとSCHAR_MAXとUCHAR_MAXの値は?
456 :
デフォルトの名無しさん :04/10/22 15:48:45
>>456 じゃなく、forループでひたすらb[ 1 ]に代入してどうするのと。
int b[20]; hoge(b); struct z hoge(int b[]) { int a[20]; for (i=0;i<9;i++) b[1]=999; a[i]=b[i]; } こんな感じです あと nt b[20]; hoge(b); struct z hoge(int b[]) { int a[20]; for (i=0;i<9;i++) b[1]=999; a[1]=b[1]; } にすると両方とも999になりました
for (i=0;i<9;i++) b[1]=999; a[i]=b[i]; } ↓ for (i=0;i<9;i++) b[i]=999; // b[1]→b[i]にしる a[i]=b[i]; } これで満足?
>>457 プログラムを簡略化して書くとこうなっちゃったんです
>>459 for (i=0;i<9;i++)
b[i]=999;
a[i]=b[i];
HDC hdc;
TCHAR szBuf[32];
hdc = GetDC(hWnd);
sprintf(szBuf, "%d", a[1]);
TextOut(hdc, 10, 10, szBuf, lstrlen(szBuf));
sprintf(szBuf, "%d", b[1]);
TextOut(hdc, 20, 20, szBuf, lstrlen(szBuf));
ReleaseDC(hWnd , hdc);
にしても
a[1]とb[1]の値が違います
463 :
デフォルトの名無しさん :04/10/22 16:05:54
>462 かっこつけろ
>>463 for (i=0;i<9;i++) {
b[i]=999;
a[i]=b[i];
}
これでやってみろ。
for (i=0;i<9;i++) { b[i]=999; a[i]=b[i]; } HDC hdc; TCHAR szBuf[32]; hdc = GetDC(hWnd); sprintf(szBuf, "%d", a[1]); TextOut(hdc, 10, 10, szBuf, lstrlen(szBuf)); sprintf(szBuf, "%d", b[1]); TextOut(hdc, 20, 20, szBuf, lstrlen(szBuf)); ReleaseDC(hWnd , hdc); こうですね なんか焦って書き間違いが多くてすいません
yuoiukiu
469 :
デフォルトの名無しさん :04/10/22 16:34:32
>>467 再現できるような例ができないのでいったん諦めます
みなさんレスありがとうございました
周りを振り回した挙句勝手にあきらめてさってくやつが一番迷惑。 他人を巻き込んだんだから最後まで責任持ってがんがれ。
お前も変な奴だな、forループから外れてたから、 b[1]とa[9]、b[9]以外は値が代入されていない。
あ、うそだ b[9]も代入されてない、当然a[9]も
これからC言語勉強しようと思ってるんですが どういうのを使えば勉強できますか? 今のところ、Borland C++ Compiler 5.5を使おうと思ってるんですがどうですか?
どうだろうね?
ダメ?
ダメではないけれど、Windowsでは有料の環境でないと、いろいろ不便ですよ。 もし、プログラミングを勉強するのであればVisualStudioなどを買うか、 Linuxでのフリーソフトウェアずくしの環境にするか、 どちらかでしょうね。 Linuxは慣れるとわりと便利な環境で、しかも無料で本格的な環境をそろえる 事ができますので、学生さんでしたら移行をお薦めします。 お金が有ればいろいろパッケージを買って環境をそろえるのも良いかもしれませんが。
これからC言語が学校の勉強で取り入れられるので 作業が遅い自分は家で先に予習した方がいいのかな?と思ったんです。 で、家でC言語を勉強するにはどうすればいいのかさっぱりだったんで質問してみました。 基本的にパソコンさっぱりの学生なんで、設定とか複雑なのは頭混乱するんですが 超ド級初心者が一番手を出しやすいのはVisualStudioなんですか? C++も後から手を出すと思うんですが、やっぱりC言語をやるなら C→C++の順に勉強したほうがいいのでしょうか?
Cは構文理解程度 さっさとC++へ移行した方が無難 まぁ授業があるのなら, 平行でC++(というよりオブジェクト指向)の概念を学ぶのがベストかな
パソコンさっぱりわからんつってるやつにVSなんか渡すなよ・・・
Win環境で,CまたはC++を使い 「NetMeetingのようなものを作る」 というのが最終課題なのですが 画像と音声を扱うなら,どういう勉強をすればいいでしょう? 資料などお勧めがありましたら教えてください. (ググってはみましたが,いまいち要領を得なくて) 現在,チャット程度のものができている状態です.
確かに プログラム組むなら最低限のPCの知識を得てからだ罠 ある程度自分でトラブルシュートできるようになってからじゃないと 先生にこうしろといわれたからこういうソース書いた とか言うPGが出てきそうだ
実は(それなりの知識があるなら)Cygwinが一番楽だと思うけどね。 Linuxと違ってシームレスに扱えるのが魅力。 #インストールも楽だし。
makeファイル万度草 とはいえ覚えておきたいのでどっか紹介ヨロ
>>486 Autoconf/Automakeで作ればいいやん
Makefileを直書きする人の方がまれだし。
>439 「デメテルの法則」かな。 ここで CChildA::func メソッドがアクセスしていいのは CParent のメンバだけ。 "b.hoge = 3;" の部分で、CParent を超えて CChildB のメンバにアクセスしている事になるが、 これがデメテルの法則を破っている。 って事でいいのかなあ? あの法則を最初に知った時、要するに「触れるものは 何でも触っていいぞ」としか読めなくて難儀した(;´Д`) つか今もよく分かってないし(;´Д`)
>>490 SDLってGTK+に比べたら特殊だと思うけれどね…
#include <stdio.h> int main(void) { int i; for(i=0; i<9; i++){ printf("error\n"); } printf("予想は i=9\n"); printf("i=%d\n", i); return 0; } 上記のプログラムをコンパイルすると jikken.c:11:16: warning: unknown escape sequence: '\221' と出て 予想はi=9 と出るべきところが 卵zはi=9 と出てしまいます。 予想 という漢字は使えないのでしょうか? コンパイル環境は gcc version 3.3.1 (cygming special) cygwinのバージョンは分かりませんでした。
>>493 文字コードがCygwinと君のエディタの出力が違うため。
>493 「予想」の文字コードの並びが 0x97 0x5c 0x91 0x7a だ。 コンパイラは 0x5c を見つけると、特別なモノに置き換えるか、無視をする。 この場合は無視されて、0x97 0x91 0x7a と解釈される。 0x97 0x91 は「卵」だ。0x7a は "z" だ。 解決するには、「予\想」とする。
char *str に16進数の文字列が入っていて、それを10進数のint型に 変換するにはどうすれば出来ますか?
>>497 例えば、char *strに003Aが入っているとすると、int iに58を
代入したいということです。
int i に 0x3A を代入では駄目なのか?
>>499 よく見ろ
>>498 は char * だから文字列 "003A" のことを言ってるに違いない!
strtolとか。 あとintに入るのは値であって、10進とか16進は関係ない。 *進数は値を文字で表現する手段の一つに過ぎない。
strtolですか。 ちょっとやってみます。
int Ret_hex(char *pBuff){ int retNum=0, last=strlen(pBuff)-1; for(i=last; i>=0; i++){ retNum += pBuff[i]*pow(10,last-i); } return retNum; }
ぐはぁ。まちがいた。 retNum += pBuff[i]*(16,last-i)
こんな感じでできました。ありがとうございます。 #include<stdio.h> #include<stdlib.h> main(){ int a[10],i,j;char *str,*tep; for(j=0;j<10;j++){ sprintf(str,"%p",&a[j]); printf("%s\n",str); i=strtol(str,&tep,16); printf("%d\n",i); } }
>>495 さん
ありがとうございます。
\ を足していきたいと思います。
int Ret_ChrHex(char theChr){ int chr=toupper(theChr); if('A' <= chr && chr <= 'F') return chr-'A'+10; else if('0' <= chr && chr <= '9') return chr-'0'; return 0; } int Ret_hex(char *pBuff){ int i,retNum=0, last=strlen(pBuff)-1; for(i=last; i>=0; i--){ retNum += Ret_ChrHex(pBuff[i])*pow(16,last-i); } return retNum; } コンパイルせずに書いたから間違えまくり。激しくゴメン。
今でも多いのかな、エスケープ文字と日本語がぶつかるコンパイラ。
配列初期化してないし。
初心者のぶしつけな質問でもうしわけないのがですが、 bccを使った場合ソースのコンパイルはどのように行えばよろしいのでしょうか?
あー後
>>2 からbcc専用の方へ行った方がいいかもな
>>514-515 時間的にもこんなに早くレスをもらえるとは思いませんでした。
参考させていただきます。ありがとうございます。
517 :
デフォルトの名無しさん :04/10/23 12:15:43
なるべくグローバル変数にしないほうがいいと聞いたので いちいち関数に引数として渡したり戻り値として返したりしながら 変数をたらい回しにしてるのですが 複数の関数間にまたがる変数はグローバル変数にしたほうがいいような 気がするんですが グローバル変数にする時のおおまかな基準とか教えてください
>>517 基本的になにもグローバル変数にはしません。
関数間をたらいまわしにするのが正しいです。
もしそれが不自然に感じるのなら、関数の設計やたらいまわしの仕方がおかしいです。
structやclassで関連性の強い変数をまとめるなどしてみるとすっきりするかもしれません。
519 :
デフォルトの名無しさん :04/10/23 12:22:30
>>518 structでまとめれそうなのがたくさんあるのでまとめてみます
グローバル変数化しないでがんばろうと思います
アドバイスありがとうございました
グローバル変数にしたほうがいいような
↑定年間近のPG,もしくは昨日今日プログラム覚えたど素人
>なるべくグローバル変数にしないほうがいいと聞いたので そうです。グローバル変数だと名前の衝突が起こりやすくなるので たくさんあると使いにくくなります。しかし、プログラムが どういうモードで動いているかとか、全体のエラーの個数などは グローバル変数の方が良いかもしれません。
>グローバル変数にする時のおおまかな基準とか教えてください 漢かどうか
グローバルにしたらどの変数がどこで使われてるか把握しにくくなるじゃない。 1000行程度の個人で作るプログラムならまだしも。
別のところで一度質問をしたのですが、 こちらのスレの方が私の質問のレベルにあってそうなので 改めて質問させていただきます。 文字列の変数a,b,cにSeven,Six,Fiveの文字列をscanf文を用いて読み込み、 Seven Six Five というように表示せよ。 とあるのですが、どのようにプログラムを組めばいいのかわかりません。 よろしければ教えてください。
文字列の変数a,b,cにSeven,Six,Fiveの文字列をscanf文を用いて読み込み、 Seven Six Five というように表示すればいい。
昨日からずっとやっていてわからなくて・・・ できればヒントだけでもと思ったのですが。
宿題なら教科書見ろ。
黙って移動するやつに教える義理はない
>文字列の変数a,b,cに 本当にこのまま問題が出てるとしたらCだと解けない気がする。
534 :
デフォルトの名無しさん :04/10/23 21:51:08
全体の流れを制御するためにの変数はグローバル変数でもいいんだよね
>>534 機能ごとに構造体にまとめて、
その構造体のグローバル インスタンスを作るほうがよい。
グローバル変数を一個作ると考えただけでじんましんが出そうな漏れは逝って良しですか?
>>536 そこまでひどくはないですけど、私もそんな感じです。
でもグローバル変数をなくすことはできませんよね。
(なくそうと思えばなくせますけど、逆にプログラムの複雑度が上がる)
538 :
デフォルトの名無しさん :04/10/23 22:08:46
>>537 グローバル変数なんか無くても困らんと思うけど?
実験プログラムだったら何ら問題無いと思うけど。グローバル変数
>>541 その本もってないから良く分かんないけど、おまいがちゃんと読んでないだけなんじゃないのか?
ってかその本訳にかなり問題があるみたいだな
K&Rかよorz・・・んな門窓から投げ捨てろ
Ctrl+Zを押して改行したら終了するよ。 K&Rの本って皆持ってるらしいけど、必要感じた事無い。。。
処理系依存だた。他の処理系は知らない。
548 :
デフォルトの名無しさん :04/10/24 12:34:15
>>539 >グローバル変数なんか無くても困らんと思うけど?
そうすか?
ある程度大きなプログラムになるとどうしても必要になると思いますが、
どうやって グローバル変数をなくしてます?
大きなプログラムほどグローバル使わないと思うが。 グローバルを使わざるを得ないとしたら、むしろ設計に問題がある。
設計厨ハケーン
static const T = x; もグローバル扱いですか?
>>548 Cだと関数毎にコンテキストを渡すのは面倒極まりないが、
C++だと上位オブジェクトが、自分で作る下位オブジェクトに自分を知らせれば自然に
葉から幹にさかのぼれるツリー構造が出来上がる。
もしどうしても面倒なら static 変数 + 取得・設定用関数を作ればいい。
グローバル変数を生で晒しとくよりは断然マシ。
グローバル変数を否定したがる香具師は gotoを否定したがる香具師と同じようなもんだ 気にしないで使いたまえ!
プログラム実行中にずーっと保持する必要のある変数はやっぱグローバル変数ですよね? グローバル変数化以外にずーっと保持できる方法ってあるんでしょうか?
554は以降放置
556 :
デフォルトの名無しさん :04/10/24 13:00:33
>>554 私はグローバル変数を使いたくないので寿命の長い値はファイルに格納していますよ。
所属を明確にする為にクラスのスタティックメンバにしてる。 でクラスのスタティックメンバがら取得する。
555は放置されてしまいました
559 :
デフォルトの名無しさん :04/10/24 13:24:38
>>552 >Cだと関数毎にコンテキストを渡すのは面倒極まりないが、
>C++だと上位オブジェクトが、自分で作る下位オブジェクトに自分を知らせれば自然に
>葉から幹にさかのぼれるツリー構造が出来上がる。
これだとクラス間の関連性が無用に増えてしまうのでは?
たとえば、Compiler クラスが Preprocessor クラスを所有している場合、
Preprocessor 単体で使えるにも関わらず Compiler との関係をもつということに
なりますよね?
> もしどうしても面倒なら static 変数 + 取得・設定用関数を作ればいい。
> グローバル変数を生で晒しとくよりは断然マシ。
これは分かります。
このような使い方も含めてグローバル変数といいたいわけですけど。。。
560 :
デフォルトの名無しさん :04/10/24 13:26:24
>>551 グローバル データはとりあえず議論から除外ということでお願いします。
>>559 Preprocessor が Compiler に依存しないなら、
Preprocessor が依存する情報だけを渡してやればいい。
もし Preprocessor が勝手に static 変数やグローバル変数を使ってしまうと
マルチスレッドで動かしたときなどに悲惨な結果になる。
それとグローバル変数と、static変数、さらに間に一枚関数を噛ますのでは弊害の次元が違う。
同列に扱う無かれ。
ある一連の操作をする関数群が一つのソースファイルにあるとして、その関数群に一度だけ渡せば いいような種類のデータを受け渡すことを考えてみる。 ・グローバル変数 実体を呼び出し側で持つか関数群側で持つかは兎も角、グローバル変数なら呼び出し側で書いておけばいい。 但し、値を設定し忘れて呼び出した場合のトラブルが予想されるし、仕様変更の影響を受けやすい。 ・関数群内グローバル変数(静的変数) 関数群にinit()のような初期化関数を用意し、そのパラメータで必要なデータを渡してもいい。 その場合、初期化関数で静的変数に書けばいいのだが、やはり初期化忘れの影響は出る。 ・パラメータ 毎回関数呼び出しごとにパラメータで渡しても共有できる。 しかし、毎回渡さなければならないので呼び出し側でそのデータを維持しておく必要が出てくる。 ・クラス化 その関数群を一つのクラスのメンバ関数とし、必要なデータもメンバ変数として実装する。 そうすればコンストラクタのパラメータでデータを渡せる。 まぁ、既存のライブラリの実装を見れば、グローバル変数に頼っているものが殆どないと思うが。 #それでも例えばVCのファイルモード(バイナリ/アスキー)はグローバル変数だったりするが。 ##突っ込まれ防止に補足すると、fopen()のパラメータでも渡せるからちょっと事情は違うね。
563 :
デフォルトの名無しさん :04/10/24 15:38:23
go to文使えばプログラムの量減らせるんだけどな… go to使わないでしようとすると同じようなプログラムを何回も使わないといけない 量増えても使わない方がいいのでしょうか?
>>563 理解が足りていないようだが、必要なら使えばいい。
565 :
デフォルトの名無しさん :04/10/24 16:46:33
ソフト開発の際にライバル会社の実行ファイルを逆コンパイルして解析してプログラム技術を盗むって 普通に行われてるんですか? 0から開発するより手っ取り早いから絶対やってるよね
>>565 0から作った方がらくちん。保守しやすい。
ディスコンパイルして得られたコードなんて、
設計意図が全く存在しないから、保守できないと思われ。
さあ、どうかな。解析してまで欲しい技術があるのかどうか。
ああああ〜〜(泣) 誰か教えてくだせえ、お願いしまんこ。 環境については、今回は割愛させてください。 フローチャートや概念的なものだけを教えていただければ十分でございます。 XMLデータファイルを「つりひも」で取得したいのですが、 どのような手順にすればよいのでしょうか? まず対象タグの属性値を、なんかの変数に取得して、 そこからプログラムでコントロールすれば包茎なのか?
下記のようなXMLデータが存在したとしますよね。 <root> <list> <li1>1</li> <li2>2</li> <li3>3</li> <param ref=1> <param ref=2> </root> ここで <param1 ref=1> ならば <list> の <li1> の値 1 が取得できる というようなプログラムです。 どんなカンジのフローチャートなのよ、 あたしわかないよ〜 誰か助けてぇ〜〜!!!
すいません、XMLが少し見た目が悪いですね、訂正します。 <root> <list> <li1>1</li> <li2>2</li> <li3>3</li> </list> <param ref=1> </param> <param ref=2> </param> </root>
ええっと、Iteratorで<root>を指して、それでなんとかしてparam ref=?の 値をゲットするようなコードを書く、おそらくX.compare("1") == 0なら <list>の<li1>の値を取得する…こんなカンジのコードでいいのかな? もうわけがわかんないよ・・・ううう、 当方、C++のドシロウトですよ、奥さん。
本物のXMLを処理したいならDOMとSAX勉強してから出直して来い サンプルだけでいいならyaccとlexでがんがれ ↑上のが意味わかんなかったら scanfとループでがんがれ
573 :
デフォルトの名無しさん :04/10/24 18:14:20
go toで飛んで変数も渡したいんですけどどうすればいいのでしょうか?
あたし、明日の朝までこのエラーと対峙しますわ、誰かよかったら お付き合いください、もし、協力をしていただけたのなら 協力者が幸せになれるように神社に行ってきてお祈りしてきますわ。 <上記の質問の続き> vectorに取得したデータを入れたいなぁ… そんで出力してと…はぁ・・・・デスマはつらいなぁ
575 :
デフォルトの名無しさん :04/10/24 18:56:49
定数をマクロで定義するのか、変数に値を代入しておくことで定義するのか どっちがいいのでしょうか?
変わらない数はマクロで。 ただし、利用頻度が少なく翻訳単位に跨がる定数であれば、 静的な変数として持つことを考えても良いのでは。
当然後者
文からしてガキだと思ってたが ただのセクハラおやじか…^^;
>>575 EffectiveC++によれば、
#define NUM 100
はコンパイラのエラーやデバッガで「NUM」と表示されず「100」という数字で表示されてしまうため、
その値が何を表しているか分からなくなってしまう可能性がある。そこで、
const int NUM=100;
としておけばデバッガでも「NUM」と確実に表示され、可読性が上がる。
という理由を挙げて変数での定義を推奨している。
>>579 const はグローバル変数が生成されてしまって
無駄ではありませんか?
マクロか enum にすべきでは?
>>580 enum ならいいが何でマクロなの?
理由は?
>>580 そんなもん心配すんな。
C++ならコンパイル時に消滅するし。
俺もconst使う派だが、まぁ、名前空間とかいろいろあるからだけど、 実際使うときは#defineしてもらったほうがうれしい。 const だと定義されてなかったときと合ったときで処理を分けることが出来ない。 結構困ることがある。 型定義もだけどさ。 言語ベースのifdefが欲しいよ。
>>582 C++ならっつ〜かコンパイラや最適化レベルによるけどな。
>>582 ほんとに消える〜?
VC6 とかでも?
>>584-585 C++では const int は定数扱い。消える。
最適化は関係ない。
気になるんだったらバイナリ見てみればいい 定数に置き換わってるから
--------------------------- main.cpp extern const int xxx; int main(void) { return xxx; } --------------------------- --------------------------- data.cpp extern const int xxx = 100; --------------------------- こうすると、次のようなコードが吐かれる。 VC6 の Release モードね。 .text:00401000 mov eax, ds:dword_4050A0 .text:00401005 retn
externかよ。 次は &xxx でアドレス取ったらとか言い出しそうだなw
591 :
デフォルトの名無しさん :04/10/24 23:36:30
プログラム書く時はコピペ多様して自分でタイピングすることが少ないんで なかなか覚えられないんですけどはじめはこんなもんでいいんでしょうか?
592 :
デフォルトの名無しさん :04/10/24 23:37:46
>591 はじめは ね。
クラスの包含を行うときの話で、包含されるクラスが単体でインスタンスを生成できないように するにはどのようにしたらよいのでしょうか? クラスを継承するときならば、継承される側のクラス(基底クラス)が単体でインスタンスを生成できないように したければ抽象クラスにすればよいと思っているのですが、包含の時はどうなのでしょう? 初心者な質問ですみませんが、もしお答えいただければ助かります m(_ _)m
>>594 コンストラクタをprotectedとかprivateにして
包含されるクラスに対するfriendでfactoryを作りそれを使って生成する
>>594 基底クラスを抽象クラスにした上で
その派生クラスを包含するクラス内で定義する。
class hoge { /*インターフェースを純粋仮想関数として定義*/ };
class owner {
class conclete_hoge : public hoge { /*実装*/ };
conclete_hoge my_hoge;
};
>>597-598 お答えありがとうございます。そうですね、こうすればできるようでした。本当にありがとうございます
もしよろしければ、どちらの書き方がより一般的に使われるのかも教えていただけないでしょうか?
それともこのような形で包含を使おうとすること自体あまり一般的ではなく、するべきではないのでしょうか?
たびたびすみませんがよろしくお願いします
vectorにString型の値を10個入れるのって、どう書くのかな? どうか教えてください
>>601 包含されることはできるが単体ではインスタンス化できないクラスとは、
すなわち包含しているクラスが一緒に持っているメンバが必須と言うことではないか?
そうなら、そいつらまとめて一つのクラスにすればよし。
そうでないなら、インスタンス化を禁止することでどんな利点があるのか教えてください。
>>602 std::vector<String> v(10);
#include <stdio.h>
int main(void)
{
〜〜〜〜〜〜〜
〜〜〜〜〜〜〜
〜〜〜〜〜〜〜
〜〜〜〜〜〜〜
printf("tesu=%d\n, a+b);
return 0;
]
>>592 これでやってみ
\nは\nと同じ意味だから。
>>603 全くそのとおりで、最初から一つのクラスにすれば問題はないのです。
ただ、そうやってまとめていくと一つのクラスが大きくなりすぎて見にくくなりそうだったので何か別の方法はないかと思って
質問させてもらったのですが、こんなやり方は間違っているようですね
皆様ありがとうございました
>>607 間違ってないと思うが。
クラスを極力小さくしたいと思うのは正しい。
解決策はすでに出てるし。
>>608 そういってもらえるとうれしいです。でもあまり一般的手法ではないのですよね?(w
とりあえず今回は上に出た方法で乗り切って、次回からはクラス構造をもう少し考えて作るようにします。
>>606 成功しました!ありがとうございます
明日大学のPCでやりくらべてみます
>>609 単にクラスを大きくしたくないというだけで
>>597-598 みたいな事をするのはどうかと思うが、
インターフェースは共通だが実装はそのインスタンスを
保有するクラスごとに異なる&隠蔽されているなんて
ケースは別に珍しくはない。
612 :
デフォルトの名無しさん :04/10/25 01:21:48
暗号化の参考にしたいのですが簡単な暗号化プログラムのサンプルが乗っているページってないでしょうか。 すぐに解読できてもいいのです・・・。
unsigned char code; fread(&code, 1, 1, fp_read); code ^= 0xff; fwrite(&code, 1, 1, fp_write); とか int len; unsigned int buf = 0; do { for (counter = 0; counter < 4; counter++){ len = fread(&code, 1, 1, fp_read); buf |= (code << (8 * counter)); } fwrite(&buf, 4, 1, fp_write); } while (len != 0); とか。
615 :
泣いてばかり子猫ちゃん :04/10/25 02:42:56
スレ違いのような気もしますがどなたかご教授くださいませ。 XMLで属性値の取得ってのは可能なのかな。 <Vallist> <val1>10</val> <val2>20</val> </Vallist> <data countid=1 ref=1> </data countid=1 ref=1> <data countid=2 ref=2> </data countid=2 ref=2> これで「つりひも」の操作を行うために <data countid=1 ref=1> の 「 ref=1 」 をDOMを介して取得したいのだが (なんとかNode…とかっていうコードを書けばいいんだよね?) それでref=1なら<Vallist>の<Val1>のタグの値10をゲットする… そんなプログラムを書いているんだけど、 タグの値ならともかく、タグの属性値の値なんて取得できるのかな〜 誰かご存知ですか、知っていたら教えてください。
>>615 前スレには移動する旨伝えてきたのか?
んで、まずそのめちゃくちゃなシンタックスエラーは無視するとして、XPathで一発でいける。
もっとも、val1/val2なんて気色の悪い書きかたしないで val id="1" とかにしろ。
>615 キミの書いてるそれはXMLじゃない
>>615 (・3・)アルェー 閉じタグはタグ名だけでいいYo
<Vallist> <val id=1>10</val> <val id=2>20</val> </Vallist> <data countid=1 ref=1/> <data countid=2 ref=2/>
Microsoft Visual C++ .NET MySQL 5.0.0 SQLデータベースから次のようにレコードを取得しようとすると CRecordset::Open(CRecordset::snapshot, command , CRecordset::none); 条件にあうレコードが0件だと Openを読んだ時点でエラーが起きるのですがこれを回避する方法はどんなものでしょうか?
SQLは知らんが、0件でOpenできないのなら先に件数を取得して分岐すればいいのでは?
622 :
デフォルトの名無しさん :04/10/25 09:41:16
class A{ const static int a = 5; }; は、できますが class A{ const static int a[2] = {0, 1}; }; は、エラーがでます 配列は初期化できないのですか
>>620 どんなエラーだよ、発行してるSQLはどんなだよ
>>622 メンバ変数である配列は初期化できない。
但し、ローカルな配列は初期化できるのでこういうことはできる。
class A {
// 厳密に言えばポインタを返す
const int * a() {
static const int b[] = {4, 5, 6,};
return b;
}
typedef int ta[3];
// こちらは配列への参照を返す
const ta & aa() {
static const int b[] = {4, 5, 6,};
return b;
}
};
利用例書くの忘れたよ。 class A { public: void print() {std::cout << a()[1] << ' ' << aa()[2] << std::endl;} }; 但し、最適化してもconst intと違って実体があることに注意。
テキスト形式の行を一行読み込んだバッファ分だけのメモリを確保したいのですが 方法ありますでしょうか
>>626 効率無視していいなら、最初に read() で読んで改行コードが出てきたら
行頭に seek() して 、一行分 read() でいいでしょう。
628 :
622 :04/10/25 11:53:58
ありがとうございます 利用例のおかけで理解できました static const int でもよいみたいですね
SQLコマンドは select column1-comlumn2,... from テーブル where .... というような複雑なやつです。 sqlクライアントのほうから直接実行してみるとちゃんと期待通りの結果が得られます。 Open時のエラーではありませんでした。 IsBOF()かIsEOF()を呼ぼうとすると Debug Assertion Failedがでます。 IsBOF()IsEOF()が実行できない条件なんてあるんでしょうか?
0.54e-10 (eは自然対数の底) のような式を読み込んで数式の計算をしたいのですが どうすればいいですか?
>>630 構文解析とか、lex とか yacc とか (flex, bison) そういう用語で調べるといいよ。
char型の配列い256文字以上の文字列を格納したいのですが できますでしょうか? char test[256]←256を1000にしたいのです。
>>633 コンパイラ依存だと思うが、
VC とか BCB とかならできると思うぞ。
やってみればいいじゃない
char test[1000]
>>630 c++ならistringstreamとかboost::lexical_castでできる
#include <iostream>
#include <boost/lexical_cast.hpp>
#include <sstream>
using namespace std;
int main () {
string s0 ("0.54e-10");
istringstream iss (s0);
double d0; iss >> d0;
double d1 (boost::lexical_cast <double> (s0));
cout << d0 << " " << d1 << endl;
return 0;
}
>>637 その解釈は0.54掛ける10の-10乗だが、>630を読む限り、0.54掛けるeの-10乗だ。
ねぇ、ものすごく初歩的なことを聞いても怒らない・・・?
>>639 怒らないが、必ずしも答えるとは限らない。
Openの戻り値は0x00407af0とかです
>>638 いや、0.54掛けるe引く10に読めるが。
>>641 答えなくてもいいから優しくしてね・・・。
C++でクラスをソースファイルとヘッダーファイルに分けるにはどうすればいいのでしょうか?
かれこれ一週間ほど悩んでいます。
馬鹿でごめんね、あはは・・・。
645 :
sage :04/10/25 15:25:23
>>644 「C++」じゃなくて環境書いた方がいいよ
>>644 ヘッダ CHoge.h:
#pragma once //VC用
class CHoge {
public:
CHoge();
~CHoge();
int foo(int f);
private:
...
};
ソース CHoge.cpp:
#include "CHoge.h"
CHoge::CHoge()
{
ほげ
}
CHoge::~CHoge()
{
禿
}
int CHoge::foo(int f)
{
( ´_ゝ`)
}
>>643 むぅ、そうかもしれん。
>>644 概ねこんな感じに、宣言と定義を分ければいいのでは?
<< foo.h >>
class foo {
int member;
public:
foo(); // ディフォルトコンストラクタ
int getMember() {return member;} // こんなのは中に書いてしまってもいいかと
void setMember(int bar); // こっちは敢えて外に書くので宣言のみ
};
<< foo.cpp >>
#include "foo.h"
foo::foo()
{
// ディフォルトコンストラクタは要らなきゃ省略で
}
// 宣言と定義を分けた例
void foo::setMember(int bar)
{
member = bar;
}
皆優しいね・・・。 ありがとう。 これで少し賢くなれそうです。
0.54e-10は 0.54かけるeひく10です
class str{ char str[256]; public: void set(char *s){ strcpy(str, s); } }; print(char *s){ cout << s; } int main(){ class str moziretu; moziretu.set("文字列"); print(moziretu); // * } みたいなのを作りたいんですけど print関数の第1引数にstrクラスを指定したときにstrクラス内のstrのポインタを渡す方法はないでしょうか? operatorでいけるかなと思い試してみたのですがわかりませんでした・・・やっぱりclass strを渡したとしか認識しないのでしょうか
>>650 class strに
const char* get() const { return str; }
を作って、print関数を
print(const char *s)
にする。
>>650 どうしても、言うに言われぬ理由でそのまま使いたいなら
print(const char *s) にした上で
strクラスに
operator const char*() const { return str; }
を追加する。おすすめはしない。
普通は
>>651 のようにやるべき
>>651-652 お返事ありがとうございます
652さんので自分のしたいことができました
explicit も付けろよな
C++でoperatorにexplicit使えたっけか
>>656 使えない。
なんで用意されていないのか不思議。
あると便利だよね。
禿がoperatorはimplicitであるべきだと考えたのかな。 キャストを明示するぐらいならアクセッサを書け、と。。
operator const char*() const { return str; } ~~~~~ このconstってどうゆう意味ですか?
mutableのような例外をのぞき、そのメンバ内でオブジェクトを変更しないという事。 cnost参照やらでも呼び出せる。
Visual C++でdoubleでも有効桁が足りないときや固定小数点を使いたいときはどうすればいいのでしょうか? .NETやJAVAだとdecimal型等があるようなのですが・・ 自分で作るしか無いのでしょうか?
ごめんなさい 661はlong doubleでもの間違いです
>>661 自作するかライブラリを探すのがよいかと。
C/C++ の言語や標準ライブラリでは用意されていないからね。
665 :
デフォルトの名無しさん :04/10/25 21:47:05
666 :
デフォルトの名無しさん :04/10/25 21:52:50
>>666 constメンバ関数からはメンバ変数の変更ができないが、例外として変更できるようにするキーワード。
mutable int num_;
void set(int n) const {
num_ = n; //変更できる
}
あとstaticな変数もconstメンバ関数から変更可能
669 :
デフォルトの名無しさん :04/10/25 22:13:05
プログラム実行中に hoge.exe の 0x0044d409 で初回の例外が発生しました : 0xC00000FD: Stack overflow hoge.exe の 0x0044d409 でハンドルされていない例外が発生しました : 0xC00000FD: Stack overflow。 というエラーが出て void func(void) → { ・・・・・・・・・ } func関数の”{”しかない行に黄色い矢印が現れます 何が原因なのでしょうか? VC.netです
>>669 スタックがオーバーフローしたからです。
>>669 原因はいくつか考えられるけど、ソース見るほうが早いから見せて。
でかい配列でもローカルに定義してるのかな。
673 :
デフォルトの名無しさん :04/10/25 22:22:01
>>670 オーバーフローの原因がわかりません…
>>671 ソースは多すぎて無理だと思います、すいません
いくつか考えられる原因を教えてください
>>673 その関数だけでいいよ。
それも巨大なら最初のほうだけでいい。
675 :
デフォルトの名無しさん :04/10/25 22:27:01
>>672 黄色い矢印が指している関数内にa[30]くらいの配列があります
676 :
デフォルトの名無しさん :04/10/25 22:29:08
再帰呼び出しが止まらないとか
データ型は?独自の構造体で確保しているならメンバを確かめてみてね。
void swap(int &a,int &b) { a = b - a; b -= a; a += b; } この関数、VC++6.0でコンパイル通るんですが、 gcc&bccだと parse error before '&' token. となり、何回も見直してもさっぱり原因がつかめません。 原因分かる方いませんか?
679 :
デフォルトの名無しさん :04/10/25 22:32:47
681 :
デフォルトの名無しさん :04/10/25 22:38:32
>>674 最初の方は100個くらいの変数宣言と値の代入が占めてます
見せるのは無理そうですすいません
>>676 bという関数からbを含むような関数を呼び出してるんですけど
再帰呼び出しってそれのことなんですか?
>>677 int型です
682 :
デフォルトの名無しさん :04/10/25 22:43:03
>>681 bという関数が自分自身(b関数)を呼び出しているならその通り。
bからbを呼び出している関数を呼びだした場合も問題は起こりうる。
>>681 100個もねー。そりゃやっぱその関数でスタックオーバーでしょうね。
コードの質がよくわからんから失礼なアドバイスかもしれないけど、
ローカルにしなくてよい変数はグローバルとか static とかにしてる?
速度が重要でないならローカル変数じゃなくてヒープ上にメモリを確保するといい。
その関数はちゃんんと再帰が終了するようになってる?
無限に再帰したりしてちゃだめだよ。
684 :
デフォルトの名無しさん :04/10/25 22:45:00
>>682 再帰呼び出しが起こらない条件で実行するとエラーが起きなくなったみたいです
もう一回再帰呼び出しを見直してみます
再帰呼び出しが有限回数で終わるようにすればいいんですよね?
再帰周辺が原因だなこりゃ。 再帰周辺の汗晒せ。そしたら大体分かる。
686 :
デフォルトの名無しさん :04/10/25 22:47:20
>>683 アドバイスもらえるだけでもありがたいです
無限に再帰してないか調べてみます
お返事くださった方々ありがとうございました
687 :
デフォルトの名無しさん :04/10/25 22:48:32
lcc-win32を使っていて、同じソースを打っても、 関数を途中で付け足したりするとエラーが出るのですが、最初から書きなおすと 大丈夫だったりします 途中でintの後に関数を付け足すとまずいんでしょうか? あと、.cのプログラムに日本語を挿入することは出来ますか?
>>690 言っていることがまったく理解不能だが
> 途中でintの後に関数を付け足すとまずいんでしょうか?
まぁ常識的に考えてまずいだろうなぁ。
692 :
デフォルトの名無しさん :04/10/25 23:53:51
>>691 すみません、初心者なので上手く説明できなくて・・・
{}の中に
int a,b;
と関数を入れて、そのあと10行ほど関数cを含んだソースを書いているうちに、
cを定義していないことに気づいて
int a,b,c;
と書きなおしたんですが、コンパイルするとよくわからないエラーが出ました
一から書きなおすと大丈夫でした
>>693 まずは
>>592 の誤りについて指摘します。
main関数の戻り値の型はintが処理系共通であり、その他の形式の
main関数は処理系に依存すると定義されています。可搬性がなくなる
ので、できるだけ使わないようにしましょう。
(ISO/IEC 9899:1999 5.1.2.2.1 Program startupより)
また、戻り値がint型のmain関数のreturnを省略した場合、return 0;が
末尾に書かれているのと同等であることが決められています。
(ISO/IEC 9899:1999 5.1.2.2.3 Program termination -1より)
よってこの場合、戻り値の型と(暗黙のうちに返された)戻り値0の型が
一致せず、エラーが起きているのです。
次に、「.cのプログラムに日本語を挿入することは出来るか」との疑問
ですが、これは処理系が対応しているかどうかによりますので、lcc-win32
ならばその解説を読むしかありません。残念ながらこちらにはありません
ので、確認できません。
>>694 すみません、戻り値の型というのはよくわかりませんが
void main(void)
よりも
int main(void)
のほうが汎用性があるということでしょうか
>>606 さんに教えてもらった通りに書くと成功しましたが、教本はvoid main(void)で最初統一してあったので・・・
>>695 はい、たしかにlcc-winで入力すると文字化けが出ます
日本語入力は当面避けておきます
回答くださった方、ありがとうございました
>>695 間違った用語を使わないように。エスケープ文字はエスケープシーケンスとは言わない。
>>696 本当にプログラミングを始めたばかりの人のようですが
たぶん、その教本ではまだ引数や戻り値について説明してないため void main(void) にしてあったのでしょう
もう少しその教本を読みすすめましょう
どんなに初心者向けの本でも最初の方10分の1も読めば書いてある内容です
>>696 main()の戻り値の型は、intが正しいのであって汎用性云々は関係ない。
今ではその教本が間違いと言うことになる。
>>696 その教本の中でvoid main(void)になっているのは、著者がきちんと規格を確認して
いないからでしょう。C言語にはANSI(もしくはISO)の規格というものがあって、その
中でC言語に関するすべてのことが決められているのです。「(ISO/IEC 9899:1999
5.1.2.2.1 Program startupより)」などと書いてあるのは、その規格のどこに定められて
いるかの根拠を示したものです。申し訳ありませんが、その著者はこれを調べることを
「サボって」いるわけですから、あまりいい本とは言い難いですね。
今の時点では「汎用性があるから」という理由で納得していただいてかまいませんが、
後々関数について詳しく勉強するときに「戻り値」の意義を確認し直してみてください。
これからはint main(void)を使うようにしてくださいね。
>>696-697 申し訳ありません。間違いました。「エスケープ文字」を意図しておりました。
>>700 >今の時点では「汎用性があるから」という理由で納得していただいてかまいませんが
全くよくない。
汎用性が問題なのではなく、正しいか正しくないかが問題。
つーか、この場合の汎用性とは何?
初心者用の方便にそんなにつっこまなくても。 初心者本のミッッションはいかにすばやく習得させるかであってさ、 正確さなんてのは二の次でいいじゃぁありませんか。
704 :
デフォルトの名無しさん :04/10/26 00:58:56
>>699-700 それ以前に696は戻り値という言葉の意味、返し方、宣言の仕方を知らないのだと思われ
>>703 まあそれを完璧に鵜呑みにされて
「動くからいいじゃないですか!」
と意地を張られた日にゃたまらないわけだが。
>>702 上に書いた通り、main関数の戻り値はintでなければ可搬性がなく、ほかは処理系依存であり、
規格上間違いとはいえない(5.1.2.2.1 Program startup -1の末尾にin some other
implementation-defined mannerという記述があることから)までも、可搬性の面からよいとは
言えず、避けるべきであると認識しております。なぜ戻り値が必要かという意味で、「プロセスの
終了状態をプロセス作成元に渡す」という意義を以て、「voidにするよりも」汎用性があると書いた
つもりでした。紛らわしくて申し訳ありません。
>>661 gmpライブラリを使ってなんかプログラムを組んで公開する場合には
ソースを全部さらす必要があるけど、
個人的に使う場合には全く問題にならんよ。
詳しくは GPL でぐぐってみるのがよろし。
と、visualスレでマルチするのやめれ
向こうになんか断りしてこい。
>>698 大学の授業と平行してやっていますが、
本の最後のほうまで、 void main(void)がちょくちょく使われています
>>700 void main(void)が「ANSI Cに準拠した書き方」として紹介されているんですが、
これは間違いということでしょうか
関数の型や引数についてはまだ習っていないので、とりあえずintに直しておきます
>>709 確かANSI-Cではmainの返却値はintでなければならない と明記されていた気がするが
>>709 ANSI Cは、普通C89と言って1989年に定められた規格を指します。実際には
もっと新しいC99と呼ばれる規格があるのですが、完全にこの規格にある機能を
実装したコンパイラが少ないので、未だC89が用いられることが多いのが現状です。
ところが何故か私の手元にはC99(ISO/IEC 9899:1999)しかないので、それから説明
します。5.1.2.2.1 Program startup -1には、main関数の形式は、int main(void)、
int main(int argc, char *argv[])またはこれと同等のもの、または処理系定義の
形式のいずれかとされています。処理系定義とは、「処理系(≒開発環境)が勝手に
決めた形式」のことで、この場合void main(void)はこれに該当すると考えられます。
だから、規格上間違いと言い切ることはできません。
しかし、処理系が勝手に決めていると言うことは、他の環境では動かない可能性が
高いと言うことです。それでは役に立ちませんし、規格の意味もありませんので、
普通はint main(void)とint main(int argc, char *argv[])またはこれと同等のもの以外は
使わないのが(事実上)正しいとするわけです。
【原文】ISO/IEC 9899:1999 5.1.2.2.1 Program startup -1
The function called at program startup is named main. The implementation declares
no prototype for this function. It shall be defined with a return type of int and with
no parameters: int main(void) { /* ... */ } or with two parameters (referred to here as
argc and argv, though any names may be used, as they are local to the function
in which they are declared): int main(int argc, char *argv[]) { /* ... */ } or equivalent;
or in some other implementation-defined manner.
ちと出遅れたレスだけど。 普通に頭のいい著者なら入門書では 戻値の解説の前は戻値を省略して、 ただ main()と書いてるものだが。
>>713 それって C99 でも許されるんだっけ?
.net2003を使っています。
http://wisdom.sakura.ne.jp/system/winapi/win32/index.html を一通り読んだぐらいのレベルです。
Bitmap表示をするときに、
WM_PAINT内に全て記述せず
関数で表示しようとするときは
HDC hdc;
HBITMAP hBitmap1, hBitmap2, hBitmap3;
switch (message)
{
case WM_CREATE:
hBitmap1 = LoadBitmap(hInst, (LPCTSTR)IDB_BITMAP1);
hBitmap2 = LoadBitmap(hInst, (LPCTSTR)IDB_BITMAP2);
hBitmap3 = LoadBitmap(hInst, (LPCTSTR)IDB_BITMAP3);
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
Hoge.Show(hInst, hdc, hBitmap1, hBitmap2, hBitmap3); ← ここ
EndPaint(hWnd, &ps);
break;
}
のように、引数にインスタンス、デバイスコンテキストハンドル、ビットマップと
ずらずら渡していくしかないのでしょうか。
>>715 Hogeが何らかのクラスのインスタンスなら、
そのクラスにBITMAPを読み込むLoadを定義しておくと良いんじゃないでしょうか…?
case WM_CREATE:
Hoge.Load((LPCTSTR)IDB_BITMAP1);
Hoge.Load((LPCTSTR)IDB_BITMAP2);
Hoge.Load((LPCTSTR)IDB_BITMAP3);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
Hoge.Show(hdc);
EndPaint(hWnd, &ps);
break;
質問の主旨にそぐわなかったらスマソ
717 :
デフォルトの名無しさん :04/10/26 11:51:59
ウィンドウズプログラミングがしたいのですが言語はどれがいいでしようか 大学ではCをやってるのですが、++も入門書は一読しました。 VBが手っ取り早いと聞きますが。Cでプログラムするのとそんなに差があるんでしょうか。 作ってみたいツールがありまして…
class A:public B{ … }; staticな変数を持つ基底クラスBを継承し、 }コンストラクタで、 ZeroMemory(this,sizeof(this)); すると、Bのもつstatic変数も0クリアしてしまいます。 イメージ的に、 ZeroMemory(this,sizeof(this) - sizeof(B) ); みたいなことをしたいのですが、何か方法はありますか? やっぱりAのメンバを一つ一つ初期化するしかないのでしょうか…。
> ZeroMemory(this,sizeof(this)); (((( ;゚д゚)))アワワワワ 面倒ならデータメンバをクラスなり構造体にまとめてゼロクリアしたら?
まだ原因もわからない... 何かヒントというか考えられる可能性なんかはご存知ないでしょか
>>719 即レスありがとうございます。
ただ、すでに大量にコード書いて、コード修正する方がが時間かかりそうなので、
今回はメンバ一つ一つ初期化することにします。
お手数かけました。即レス、指摘ともども感謝です!
722 :
デフォルトの名無しさん :04/10/26 12:55:12
C++です。 int* fu(void){ int intarray[30][30]; int *p; (中略) p = &intarray[0][0]; return p; } int main(void){ int *pp; pp = fu(); (ここでppを用いてfu()のintarrayの値を使いたい) } ↑のような感じで。 関数の中で配列を宣言して、その配列の値を呼び出し元で使いたいのですよ。 もしかして宣言した関数が終わっちゃったら、配列の頭を覚えたポインタは何の役にも立たなくなっちゃいます?
そんなの基本ですよ
自動変数へのポインタは関数抜けると無効 やるならmalloc等でヒープに確保するか、static変数にするか
>722 関数内の自動変数はスタックに積まれますので、 その関数から出ると値は保障されません。 そういうことがやりたいのであれば、以下のようにします。 1.呼び出し元の関数で変数定義し、アドレスを引数で渡す 2.変数そのものを外部変数にする 3.呼び出し先の関数でstatic宣言する
>723-725 ありがとうございます。 class変数一つ増やして対処しますわ。
お前等、レスする前にリロードしろよw
729 :
717 :04/10/26 13:06:47
スレ違いすんませんでした
まあ全てオレなんだけどな。
カンマ区切りのデータを区切るのに strtok()を使っています 1,2,4,5,6 のようなカンマ間にデータが入っていれば問題ないのですが 1,,,5,6 のようなデータだと、1、NULL、NULL、5、6と区切ってほしいのですが 実際に取得する値は1,5,6となってしまいます。 カンマが連続した場合、カンマ間の値をNULLとして取得してくれるいいアイデアはないでしょうか。
自前で作れ 空文字列じゃなくNULLポインターが欲しいのか
sscanf()で…と思ったがあれも空フィールド読めないな。 sscanf()で1フィールドずつ剥がしたらどうだろう。 #"%[^,]%n"かなんかで。
boost::regexで出来なかったっけか
>>692 私は試してないんだけど
ググったらVCで動かしてるひとはいるみたい
だから書いてみた
>>735 レスありがとうございます
こちらでも調べてみたのですが、問題が多そうでした。
>>707 マルチしてました。すみません
gmpに詳しいようなのでお聞きしたいのですが、ライセンス関係の話ではなく、VC++でビルトできるのかという意味で、
かなり問題が多そうなのですが、そちらの環境では使えているのでしょうか?
737 :
デフォルトの名無しさん :04/10/26 18:29:01
すみません。C++のソースをコンパイルすると hoge.cpp:186: no matching function for call to 'class::hoge () const' とでてコンパイルできません。 たしかに、このclass::hoge()メソッドは存在するんですが。 このエラーはどういうエラーなんでしょうか
hoge()にはちゃんとconst付いてっか?
739 :
デフォルトの名無しさん :04/10/26 18:54:04
#include<stdio.h> int main(void) { int a = -1; unsigned int b = 100; int c = a > b; printf("変数cの値は%dです。\n", c); return 0; } 実行すると、 変数cの値は1です。 と表示されます。 a > b はこの場合真になるのですか?
741 :
739 :04/10/26 19:08:50
>>740 異なる型の変数を関係演算子で
結んだ式はいつでも真ですか?
742 :
737 :04/10/26 19:12:44
>>738 string class::hoge() const { ... }
とやってます。これでだいじょうぶですよね。
>>741 - int c = a > b;
+ int c = b > a;
するとどうなる?
そうではなくて、異なる型どうしは演算できないから、 int と unsigned int を演算しようとすると int が unsigned int に変換される。 intでの-1はunsigned intでは4294967295になるから、 a > bが真になる。 試しにint a=10とunsigned int b=100で比較してみれ
>>742 そのメンバ関数を持っているクラスの名前はなんですか?
>>742 何をやりたいのか分からないほどにめちゃくちゃ
743取り消す 失敬
748 :
739 :04/10/26 19:23:09
classって名前のclassは作れません。
750 :
739 :04/10/26 20:02:02
>>744 異なる型の値が関係演算子で結ばれるとき、
どちらかの型にそろえるかと思いますが、
型の選択に規則はありますか?
>>750 int < unsigned int < long int < unsigned long int < float < double < long double
の優先度で、サイズが大きい方に変換される。
int以下は全てintに変換される。
同じサイズのsigned vs unsignedがunsignedになるのはCの最大の汚点。
753 :
739 :04/10/26 20:26:59
質問させてください。 とあるヘッダで #include <vector> class CA { int m_hoge; }; typedef std::vector<CA> VA; class CB { private: VA m_hoge2(10); }; としようとすると、 VA m_hoge2(10); の行で syntax error : 'constant'となります。 VA m_hoge2; は通るのですが、動的配列の大きさを予め決めたいのです。 どのようにすれば通るか教えて下さい。VC++.Net2003が環境です。
>>754 無理です。CB : m_hoge2(10){}とでもするしかありません。
コロン演算子は何をしているのでしょうか、 CB : m_hoge2(10){} とはどういう意味でしょうか。 なお、実際にはVA m_hoge2(10);の他にもメンバ変数・関数があります。 また、申し訳ありませんが、>754ができない理由をお教え頂ければ幸いです。 よくこういう形で大きさを決めているソースを読むのですが……。 宜しくお願いします。
分かりました!
クラスのメンバの初期化ですか。引っかかっちゃったなぁ…… orz
なお、
>>755 はコンストラクタでやってね、という発言ですよね。
ありがとうございました。STL(・∀・)ガンガル!
何を血迷ってるんだ……。
>>755 で合っていますね。
デスマ]λ... ワカッテルンダツカレテイルノハ...
761 :
デフォルトの名無しさん :04/10/26 21:37:28
スイマセン質問なのですがVC++を使って開発を始めたいと思っているのですが、 自分はCでAPIは何とか理解できてるのですがC++はサッパリです。 なのでC++から勉強を始めようと思うのですが良い本はありませんでしょうか? なんだかCの本とは違ってどれも小難しそうで…
762のサイトはやめておけ
766 :
デフォルトの名無しさん :04/10/26 22:38:24
○一○理での会話シミュレーターです。 #include <stdio.h> int main(int argc, char** argv) { char buf[1000]; while (1) { printf("You>"); fgets(buf, sizeof(buf), stdin); printf("Genri>すごいね。\n"); } return 0; }
>>765 例えばこんなことが書いてある。
--
ただし、綺麗で保守的なプログラムを書きたいのであれば
適当な位置で変数を宣言するのではなく、ブロックの先頭でまとめて宣言するべきです
--
こんなアナクロニズムな…
保守しやすいんじゃなくて、まさに「保守的」なんだろうな。 C++やC99の記法は認めないと。
>>767 まぁ、それは好みの相違という気がしますし、
読者がそのとおりに習慣づけても悪いことないと思うけどな。
1つのサイトや本ではなく、色々な知識を得よ と、後輩には口をすっぱく。
>>769 ブロックの先頭でまとめるくらいなら
適当な位置でブロックないし関数に分けたほうがまし。
>>771 まぁそれはそれでいいとして、
>>762 のページの問題点ってそんな些細なことなの?
その程度なら初心者に勧めてもいいのではないかな。
>>772 > C++とはオブジェクト指向型プログラミングのために生まれたC言語です
一行目からヤヴァイと思う
>>769 例えばブロックの中間で決定される値を利用してオブジェクトを生成する場合、
先頭で定義する手法は使えない。
つまり、 先頭で定義したり中間で定義したりと統一性が失われることになる。
それよりもなによりも、必要なものは必要なときに準備する方が判り易いと思うが。
776 :
デフォルトの名無しさん :04/10/26 23:33:56
普通のChar型の文字列をバイナリに変換する(およびその逆も)には どうしたらよいのでしょうか。 変換する便利な関数などはないのでしょうか?
778 :
デフォルトの名無しさん :04/10/26 23:35:05
Char型なんて知りません
>>776 char型配列はそのままバイナリだよ。
バイナリを文字列とみなせば文字列だってだけ。
>>776 二進のコンピュータ上で動いてる限りどんなデータもはじめからバイナリだと思います。
orz… お騒がせしました… 自力で探します…
>>782 =761
そもそもすれ違いかもねw
EffectiveC++でも読んだら?
宣言と定義と初期化を混同するなかれ 好みとポリシーを混同するなかれ
バッファ(cha buff[])に取得した日付などをファイル名にしたいのですが バッファの中身をファイル名として落とす方法ってりますでしょうか。
787 :
デフォルトの名無しさん :04/10/27 16:24:17
while(fgets(buff,500,fl_rd) != NULL) { bunkatustr = strtok(buff, ","); id=bunkatustr; if(id == id_temp) { fputs(buff, fl_wr); break; } }//while_end あるカンマ区切りのデータについて読み込んでIDが一致したら その行だけを書き込もうと思うのですが fputs(buff, fl_wr)で一行ファイルに書き込む際、 一行全てではなくidの値しか書き込まれません。 対策でなにかいい方法がございましたらお教え願います。
>>787 strtok()は領域を破壊する。
切り出す手段として、sscanf()を"%[^,]s"で使うか別の領域にコピーしてからstrtok()を使う。
789 :
デフォルトの名無しさん :04/10/27 17:11:22
以下のコードはなぜコンパイルエラーなのでしょうか・・・。 struct Test{ short x; short y; }; vector<Test> structData; 1時間くらい嵌ってる・・・。
792 :
789 :04/10/27 17:14:27
すみません。 vector-test.cpp: In function `int main ()': vector-test.cpp:10: template-argument `main ()::Test' uses local type `main ()::Test' vector-test.cpp:10: template argument 1 is invalid vector-test.cpp:10: template argument 2 is invalid vector-test.cpp:10: ISO C++ forbids declaration of `structData' with no type こういうエラーメッセージです。
その前後のコード書けー 「uses local type `main ()::Test' 」って、 main関数内でTestを宣言しようとしてる?
>>792 mainの中でローカルクラスを定義してない?
MS-Visual C++6.0で単なる変数宣言なのに ブレークポイントが設定できないということはありますか? どうやらその行は実行すらされていないようなのですが コンパイル、ビルドは通るんです。 もう何がなにやら・・・。わかる方お願いします。
796 :
789 :04/10/27 17:33:39
情報が足りなくてすみません。 #include<vector> int main(){ struct Test{ short x; short y; }; std::vector<Test> structData; return 0; } という、ただ単に構造体のvectorを宣言しているだけです。 なぜローカルクラスを定義していけないのか、がわかりません。
ローカルクラスを定義してはいけないのではなく、 templateの引数に使えないだけだろー
>>796 std::vector<Test>のメンバ関数の中でインライン展開できない物が出たときにTestがローカルだと困るから、
C++ではテンプレートにはローカルの構造体・クラスを指定できない仕様になっている。
なのでmain()の外でtestを宣言しろ。
799 :
789 :04/10/27 17:42:19
はぁ〜、なるほど、しっかり理由を説明していただけると わかりやすいですね。 main()外でstructを定義したら、ちゃんとコンパイルできました。 以後、気をつけます。 ありがとうございました。
すまん、原因がわかりました。
自作クラスを単独で宣言しても問題ないのに 配列で宣言してaccess violationなのは やっぱりクラスの中身が悪いんでしょうか?
面倒くさいからコード晒せ
うっさい黙れキチガイ
いや、ソースないと判断しようが無いと思うが
805 :
デフォルトの名無しさん :04/10/27 18:37:43
コンパイルの際に以下のエラーがでるのですが、これは インクルードファイルが破損しているのでしょうか? それともDirectX9.0 SDKのdsound.hがもとからおかしいのでしょうか? どうしてこのようなエラーがでるのか分かりません。 教えてください。おねがいします C:\Program Files\Microsoft DirectX 9.0 SDK (October 2004)\Include\dsound.h(305) : error C2146: 構文エラー : ';' が、識別子 'dwReserved1' の前に必要です。 C:\Program Files\Microsoft DirectX 9.0 SDK (October 2004)\Include\dsound.h(305) : error C2501: 'DWORD_PTR' : 識別名を宣言するのに、型が指定されていません。 C:\Program Files\Microsoft DirectX 9.0 SDK (October 2004)\Include\dsound.h(305) : error C2501: 'dwReserved1' : 識別名を宣言するのに、型が指定されていません。 C:\Program Files\Microsoft DirectX 9.0 SDK (October 2004)\Include\dsound.h(306) : error C2146: 構文エラー : ';' が、識別子 'dwReserved2' の前に必要です。 C:\Program Files\Microsoft DirectX 9.0 SDK (October 2004)\Include\dsound.h(306) : error C2501: 'DWORD_PTR' : 識別名を宣言するのに、型が指定されていません。 C:\Program Files\Microsoft DirectX 9.0 SDK (October 2004)\Include\dsound.h(306) : error C2501: 'dwReserved2' : 識別名を宣言するのに、型が指定されていません。
>>805 破損してるんなら自分で読めばわかるだろ?
このエラーメッセージみても理解出来ないお前の頭が破損してる
>>805 必要なファイルを先にincludeしてないんじゃないか?
305行目とその周辺を確認するのが手っ取り早いと思うが
811 :
805 :04/10/27 19:01:01
typedef struct _DSEFFECTDESC { DWORD dwSize; DWORD dwFlags; GUID guidDSFXClass; DWORD_PTR dwReserved1; ←305行目 DWORD_PTR dwReserved2; } DSEFFECTDESC, *LPDSEFFECTDESC; これをみても私には何処が間違っているのか分かりません。
DWORD_PTRが定義されてないのかな
813 :
デフォルトの名無しさん :04/10/27 19:02:55
DWORD_PTR という型はどのインクルードファイルを読み込めばよいのでしょうか? そうすればOKですか?
ここまで分かってて何でそれすら自分で出来ないんだ?
困った初心者さんの条件 ・調べない ・試さない ・情報を小出しにする
定義がないなら別のエラーになりそうだが
>>813 それぐらいgrepなりなんなりで検索しろよ…
basetsd.h
文句を言いつつも親切に回答するこのスレの中の人のやさしさに感動した。
820 :
デフォルトの名無しさん :04/10/27 21:09:17
バグのために2〜3日まったく進まないことなんてあります? もう疲れました
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | バグで2〜3日まったく進んでません。もう疲れました。 \  ̄ ̄ ̄|/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ・∀・) ∧ ∧ < おめーのバグだろ、ゴルァ!! ( ⊃ ) (゚Д゚;) \____________  ̄ ̄ ̄ ̄ ̄ (つ_つ__  ̄ ̄ ̄日∇ ̄\| BIBLO |\  ̄ ======= \
ただ悩んでいないで発想の転換も必要だ。 バグ回避とは逃げではなくて、賢い回り道だ。
バグから逃げないで立ち向かえ
自分自身のバグのために2〜3日まったく進まないことなんてあります? もう疲れました
826 :
デフォルトの名無しさん :04/10/28 02:02:06
820 825 そんなにその質問の答えが聞きたいのか?
827 :
デフォルトの名無しさん :04/10/28 02:04:10
typedef struct _STest { std::string strTest; int nTest; } STest; とういような構造体を定義しておいて、 STest sTest; ::memset(&sTest, 0, sizeof(STest)); sTest.strTest = "test"; のように、memsetで初期化した後に、strTestに入力を 行ってもいいんでしょうか? 個人的には、非常に気持ち悪いのですが、VC6では、 きちんと動作しているように見えます。 初期化だけが目的ならコンストラクタでやれと言われそうですが、 宜しくお願い致します。
memsetすること自体がヤバい。std::stringが自分のコンストラクタで初期化しているのを 壊している恐れがある。
正気の沙汰じゃないな
>>628 お返事ありがとうございます。
そう言われて見るとそうですね。やっぱり危険ですよね。
sTest.strTestがNULLなのに、入力できているので不思議です。
どうして、動いてるんでしょう?
STLに詳しくないため、std::stringが中でどういうことを
やってるのか分かりませんが、危険な感じはしますね。
831 :
デフォルトの名無しさん :04/10/28 03:28:17
Independent JPEG Group
http://www.ijg.org/ JPEGライブラリをインクルードして使いたいのですがライブラリの構築がうまくいきません。
configureってどうすればよいのですか?
./configure
memset や realloc や 可変引数は事故の元 C++ では使わない
834 :
デフォルトの名無しさん :04/10/28 04:19:11
Windowsのコマンドプロンプトで実行しようとすると 'configure' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 './configure' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 ってなってしまうんですm(_ _)m
835 :
831=834 :04/10/28 04:29:58
間違いました、./configureとすると '.' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 でしたm(_ _)m
>ってなってしまうんですm(_ _)m >でしたm(_ _)m だから何? 無能にも程がある
837 :
831=834 :04/10/28 04:41:17
失礼しました。意味の無い書き込みでした。頭整理します。 スレ違いになってしまいそうですが、Windowsのコマンドプロンプトで exe拡張子の無いこのconfigureを実行するにはどうしたらよいのでしょうか。
gcc 今後質問するときは環境とか小出しにしないように というか、テンプレをよく読むように
自分の頭は自分で整理してくれ
>>837 Windowsでやりたいならどちらか選べ
(1) cygwin環境を入れてconfigure
(2) MSVC入れてmakefile.vc をnmake
スマソ素で間違えた
漏れが言いたかったのは
>>840 (1)の方ね
cygwin環境作るならjpgeも(ソース、バイナリとも)一緒にインストールできる罠。
843 :
デフォルトの名無しさん :04/10/28 10:22:34
0x000A0015って文字列をDWORDの値に直す簡単な方法ありますか?
DWORD a=(DWORD)0x000A0015
>>844 オイオイ。
>>843 は文字列って言ってるだろが。
DWORD a;
sfscanf("0x000A0015", "%i", a);
まちごた。 sscanfだた。
>>843 ちなみにWindowsでiniファイルとして扱える書式ならGetPrivateProfileIntでも読める
848 :
デフォルトの名無しさん :04/10/28 14:34:24
/,,;,,,,, ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ,,,,,,,;:::丶 / :::::::::;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;:::::::::::::::ヽ i゙:::;:::::||::::::ii:::::::::::||::::::::::::::::::;:::::::::::::::::::::::::::゙i i゙::::|;;;;| |;;;;| |::::::::::| |:::::::::::::::::||:::::::::::::::::::::::::::::| . i゙::::::i ''''''''''' '───' |;;;;;;;;;;::::::::::::::::::::| .|:::::::|,-====-´ ゙ヽ,,,,,,,,,,,,、 |:::::::::::::::::::| |;::::::::|,-----、 ~ニニ,,_` |:::::::::::::::::::| 二次元配列は `ヽ、i (、i´ノ ´い,, ノ ' |;;;::::::::::::::/ なんで、ポインタのポインタで渡せられへんの? . i ^~~~ー==-- ー'-+、 / ゙-、;;;;/ { ヽゝ '-'~ノ λ ''゙゙゙'''-''---、 /-'^ ヽ, ^~^ ( / `丶 、 , - /^l | /( ノ `''''''´~ __, - ' ゙i、
L -‐ '´  ̄ `ヽ- 、 〉 / ヽ\ / // / / ヽヽ ヽ〈 ヽ、レ! { ム-t ハ li 、 i i }ト、 ハN | lヽ八l ヽjハVヽ、i j/ l ! /ハ. l ヽk== , r= 、ノルl lL」 ヽN、ハ l ┌‐┐ ゙l ノl l ヽトjヽ、 ヽ_ノ ノ//レ′ r777777777tノ` ー r ´フ/′ j´ニゝ l|ヽ _/`\ 〈 ‐ 知っているがlト、 / 〃ゝ、 〈、ネ.. .lF V=="/ イl. ト |お前の態度がとニヽ二/ l ヽ.|l. 〈ー- ! `ヽ. |l気に食わない lトニ、_ノ ヾ、 |l__________l| \ ソ
850 :
デフォルトの名無しさん :04/10/28 14:40:17
再帰って流れを読むのが難しいね bugの修正が困難だよ どうしよう なんかいい方法ないですか?
切実な感じを出そう表そうとした結果、 ふざけた感じになってしまいました。 すいませんでした。 できたら教えていただけませんでしょうか 渡せるのですか?
渡せる
ライブラリを作るときって、デバッグどうやってます? 完全に別のプロジェクト立ち上げて、ためしに組んでから 別のライブラリ専用のプロジェクト立ち上げて作ってます? どうも使う段階になってエラーが発覚したときの ライブラリデバッグのスマートな方法がわかりません。
試してみてもやっぱりうまくいかないのですが・・・ なにか特別なことする必要があるんですか? アフォなので詳しく教えてください!
>>850 再帰が深くならなくてすむような
再現データを食わせてみる。
都合のよい小さな再現環境がすぐに
作れなければ
再帰が深くなるたびにデータは狭まるか
答えに近づくかするはずだろうから
おかしくなるデータの範囲を
デバッガやログで絞り込む。
>>855 本読んで一から勉強したほうが早いっぽ。
>>854 好きなデータを突っ込める
テスト用のメインプログラムを作る。
絶対作れ。
特に
間違った呼び出し方をしたときに
ちゃんとエラーコードや例外を返せるかとかのテストは
本物の呼び出し元プログラムじゃ
すげー面倒っつーかほとんど不可能。
最近はJUnit VBUnit CppUnittとか便利なのがある。
質問です。 Rubyで言う、attr_accessor、つまりprivateのメンバ変数に対して publicのset、get関数を作ってくれるようなシステムが 何かしらのテンプレートを介して使えたりするのでしょうか。 (標準ヘッダを使うではなく、プロジェクトの共通ヘッダとして手書き実装でも可です) アクセッサを作るのが非常にマンドいんで、何とかしたいと思い 色々検索してみたのですが見つからず……。 宜しくお願いいたします。
>>859 BCCでいうところのこんなやつか?
class hoge {
public:
__property int moge = { read=_moge, write=set_moge };
private:
int _moge;
void set_moge(int v){ _moge = v; }
};
使ってるエディタでマクロ組むのが良いんではないかね?
>>859 多少違うがこんな感じか?
template <typename T>
class value_with_accessor
{
T value;
public:
T operator()() const {return value;}
void operator()(const T &t){value = t;}
};
class Test
{
public:
value_with_accessor<int> m;
};
Test t;
t.m(4);
std::cout << t.m();
>>860 私の手元はC++BuilderでなくVC++なので……。
なお、VC++では__propertyを使うと変数をいじっているようで
実は関数を介しているっていう奴が実装できるらしいですね、
使った事ないんですが……。
諦めて地道に作れやって事なのかな…… orz
friendの意味って何? publicだけじゃダメなの? 不用意に参照されないようにするため?
>>862 ありがとうございます。
さらに修正を加え(readonlyとか)、自分のものに使わせて頂きました。
激しく便利!
(・Д・)こ、これがテンプレートの力なのかっ……!
……と思ったんですが、上記の例でクラスないし構造体のような
ものに適用しようと思ったとき、そのメンバへのアクセスを指定したい時は
どのようにしたら良いでしょうか。
>>862 ソースで言うところの
value_with_accessor<int> m;
のintがクラスや構造体の時、mのメンバへのアクセスということです。
そういう時専用のテンプレートを作る事は
止むを得ないとは思うんですが、さらのそのメンバのメンバとかになると
気が遠くなってきます。ダメなのかなぁ……。
>>867 >>862 を改造してもread-onlyにはできない。
きめ細かなアクセス制限を施したいならアクセス関数を書けばいい。
setter/getterを用意するなら、メンバへのアクセスを制限する理由はないんじゃないか?
つーか、setter/getter作るのが億劫なら公開しちゃえばいいのに。 #私ゃエディタのマクロで作ってるけど。
そうですね、書き込み用の関数をなくすと、誰も書き込めなくなりますしね。 やはりエディタですか。WZにがんばってもらおう……。 デスマ]λ... ドウセオレハマケグミダ... でもテンプレートたのすぃ事は判明しましたw
871 :
デフォルトの名無しさん :04/10/28 22:30:44
872 :
デフォルトの名無しさん :04/10/28 23:10:33
プログラムが進むにつれて 流れがつかみにくくなりバグフィックスも難しくなる もう疲れました たかだか1000行程度なのにバグばっか この先もっとバグが増えていくとなると気が遠くなります プログラマーのみなさんの大変さがわかりました
C++ではなくてCに関する質問なのですが、 関数の引数についてどうしてもよく分からない点があります。 下の関数の引数の渡し方は、どう違うのでしょうか? void funcTest( char* chrArg ) { ... }; void funcTest( char[] chrArg ) { ... };
>>872 細かい機能ごとなりの関数に分けるといいよ
>>873 配列とポインタの違い?それ以外何?
関数の中で chrArg を変更出来るか出来ないか
>>873 下の書き方はCでもC++でも許可されていません。
>>872 そら全体の設計が悪いんだよ。
C++を使ってるならオブジェクト指向や
デザパタの入門書を読んでごらん。
一度頭を打ってから読むと有難味が
よく判るよw
>>873 char[] chrArg なんて形は無いのでは?char chrArg[] ならあると思うけれど。
確か、関数の仮引数の最後のものだけはchrArg[]としてもポインタとして働くはず
だったので、引数が一つならどちらもポインタになると思うけれど、ポインタの方で
書くのが一般的だと思う。
>>875 本当ですか?
ごめんなさい、878間違っていたので自己レスです >> 関数の仮引数の最後のものだけはchrArg[]としてもポインタとして働くはずだったので、 引数が一つならどちらもポインタになると思うけれど 上は全部間違いです 関数の仮引数としてのchrarg[]の最後の[]だけはポインタとして働くはずだったので、 []が一つならどちらもポインタになると思うけれど が正しいです 自分で読み返して何書いてるんだかって感じでした
Java出身ですか?
ソートについて質問です 名前、国語の点数、。数学の点数、英語の点数が書いてあるテキストを読み込んで 点数を合計して トップ10を表示するプログラムを作りたいのですが 点数を読む方法が解りません お手数かけますがよろしくお願いします [テキスト] ななしさん 30 40 50 ななしさん2 20 50 60 ::: 200人まで続きます
>>884 何が分からないのですか?
ファイルの読み込み?
>>884 宿題スレ行ったほうがいいぞ。
宿題ならscanfで充分だと思うけど、
ここだと小難しく考える連中が多いからな。
>>886 scanf()ですか……
小難しいも何も、阿呆につける薬はないな。
buffのreturnについてアドレスではなく、データを先頭だけでなくすべてのデータを戻り値として 戻すことはできないのでしょうか。 というのもperlでsystem関数でCのモジュールを呼んでいるのですが その戻り値にバッファのデータを返したいのです。 現状では、アドレスが返ってしまっているようです。
標準出力やファイルに書き出して、それを読んだら?
>>858 ありがと。CppUnit挑戦してみます。
891 :
デフォルトの名無しさん :04/10/29 15:08:43
VC++7.0で開発しています。 ごくまれにTRACE()を使用すると、 atltracemodulemanager.hののCAtlTraceProcessクラスのModuleCount()という関数で例外が発生してしまいます。 再現方法もまだわかっていないのですが、とにかくTRACE()をやめることで回避できるようです。 しかしこれが原因でTRACE()で落ちる、という理由がわかりません。 どなたかご存じでしょうか?
perlにもパイプあったっしょ? #awkにもあるんだからないとは思わないけど。 Cで標準出力に出させてそれをパイプで取得するか、>889の言うようにファイル経由か。
>>888 >データを先頭だけでなくすべてのデータを戻り値として
perlはよく知らないが、構造体を使えば出来なくはない。
でもperlのモジュールがそんなアホな仕様になってるわけがない。
もう一度よく仕様読んだほうがいいぞ。
system関数は外部プロセスを起動するもの perlモジュールをCで書くXSじゃないよ
895 :
デフォルトの名無しさん :04/10/29 21:46:32
>>892 VC7はよくわからんが、TRACE()の文字上限こえたんじゃない?
C++で質問なんですが、 friend class ってのは、 class A{ friend classB; public: ・・・・・ private: ・・・・・ } class B{ ・・・・・ ・・・・・ } としたら、BからAのpublic, privateを問わずあらゆるメンバを使用可能になるのではないのですか? GCCを使っているのですが、BのメンバからAの変数やら関数を使おうとしたのですが、 undefine 〜 とエラーが出ます。 なにかヒントになるようなサイトとか助言ありませんか?
>>896 BでAを触ってるとき
ちゃんとAのクラス定義はincludeしてる?
classとB;の間にスペースが空いていないぞ。
y-x>=0で点(0,0)と(1,1)を含まないという条件式は (y-x>=0)&&((x!=0)&&(y!=0))&&((x!=1)&&(y!=1)) でいいんでしょうか?
>>899 反例 (1,2)
(y-x>=0) && !((x==0&&y==0)||(x==1&&y==1))
じゃね?
>>900 ありがとうがざいます
うまくいきました
904 :
デフォルトの名無しさん :
04/10/30 01:40:14 2ch専用ブラウザ厨にそういうミスをする人が多いね。