1 :
デフォルトの名無しさん :
03/07/24 19:09
このスレいらないYO!!
2gets
4 :
デフォルトの名無しさん :03/07/24 19:21
C言語でMIDIシーケンサーをつくりたいんだけど、どうすればいいの? 環境はWindows2000 VisualC++6.0だよ。
このスレの存在意義は何?
>>5 C言語なら俺に聞け、C/C++の宿題やらせて等で、
文字色を変える、○の移動、星が上から落ちてくる、テトリスの作り方
等、質問する人が多かったので。
9 :
デフォルトの名無しさん :03/07/28 03:02
テンプレートについて相談に乗って下さい。 template< typename T > class AAAA { AAAA() { 処理 } 略 }; というコードはコンパイルできるのですが、 ヘッダと.cppファイルに分けて template< typename T > class AAAA { AAAA(); 略 }; 別ファイルで #include "ヘッダ名" // コンストラクタ AAAA:AAAA() { }
10 :
デフォルトの名無しさん :03/07/28 03:02
とすると「<が必要です」といったエラーになります。 ネットや本を読んでみましたが、ヘッダに実装を書く、 つまり前者の書き方ばかりで解決できませんでした。 どうすれば正しく書けるのかご指導お願いします。 コンストラクタを template< typename T >AAAA<T>::AAAA() { } とするとコンパイルは通りますが、リンクエラーになり、 プロジェクトを見てみると、ソースファイルのコード量が0、 つまり何も書いていないかのようです。
#include "AAAA.h" #include "AAAA.cpp" int main() { AAAA<int> aaaa; return 0; }
>>670 #include <stdio.h>
#include <stdlib.h>
#define Y_SIZE 11
#define X_SIZE 19
int main(void){
int a,b,c,d,e,f,y,x,g0,g1;char str[BUFSIZ];int gurafu[2][X_SIZE*2+1]={0};
printf("ax+by+c>0とdx+ey+f>0の2つの式のa,b,c,d,e,fを入力してください\n");
if(fgets(str,sizeof(str),stdin)==NULL) exit(1);
if(sscanf(str,"%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f)!=6) exit(1);
for(x=-X_SIZE;x<=X_SIZE;x++)
{
gurafu[0][x+X_SIZE]=(-a*x-c)/b;//(((-a*x-c)/b*2)+1)/2;
gurafu[1][x+X_SIZE]=(-d*x-f)/e;//(((-d*x-f)/e*2)+1)/2;
}
for(y=Y_SIZE;y>=-Y_SIZE;y--,puts(""))
for(x=-X_SIZE;x<=X_SIZE;x++)
{
g0=gurafu[0][x+X_SIZE];
g1=gurafu[1][x+X_SIZE];
if(y==g0||y==g1) printf("*");
else if(y==0&&x==0) printf("╋");
else if(y==0) printf("━");
else if(x==0) printf("┃");
else if(g0>0&&g1>0) printf("%c%c",0x14,0x14);
else printf(" ");
}
return 0;}
(^^)
15 :
独習Cの表記なんですが。 :03/08/02 16:44
gets()を使ってプログラムを組んで、 コンパイルすると warning: this program uses gets(), which is unsafe. と出たんです。 なぜ不安定なのですか? そしてよりよい、つまりは安定したgets()にかわるものって あるのでしょうか?
16 :
デフォルトの名無しさん :03/08/02 16:45
17 :
デフォルトの名無しさん :03/08/02 16:46
fgets使え。
>>15 fgets()を使え, gets()はサイズ指定ができない.
>>15 ついでに言うとCのライブラリは危険な関数が一杯ある.
簡素化されている関数は勉強につかうのはいいが, 実践では使わないほうがいい.
gets()然り, strcat()もサイズが指定できない.
ここで教えられなくてもWebで探ればこういうのは書いてある.
バッファオーバーフローをおこさずに 入力するための汎用的な方法が無いのがCの欠点。
21 :
デフォルトの名無しさん :03/08/02 19:50
はげどう!
ありがとうございました。 次からはしらべてみることにします…。
意外に環境依存してないね
24 :
デフォルトの名無しさん :03/08/06 17:53
あれれ~?
25 :
イベントシンク :03/08/06 23:21
IUnknownをIConnectionPointでAdviseした後、 EventSinkでInvokeしたいのに、できないYo! おしえれ~
>>25 環境依存してもいいからせめて何の環境か書いてくれ。
27 :
イベントシンク :03/08/07 09:31
>>26 環境はVC++6.0 IE_5.5ライブラリを使ってます。
おねがいしますっ!
へなちょこな質問ですが、 参考書のサンプルで以下のようなコードをよく見かけるんですが、 これってメモリリークにはならないのでしょうか? newしてないので、delete する必要ないのでしょうか? int main() { int *p; /* delete p しなくても良い? */ /* スコープ抜けたら自動解放?*/ return 0; }
なりません。 そうです。
>>28 ポインタ、メモリ あたりを勉強しなはれ。
31 :
デフォルトの名無しさん :03/08/07 18:52
printfで%を表示させるにはどうすればいいのでしょう?
%%
変数なんですね・・・ 逝ってきます || ∧||∧ ( ⌒ ヽ ∪ ノ ∪∪
C++でプログラムが動作してるプラットフォームの情報を取得したいのですがどうすればよいのでしょうか。
(⌒V⌒) │ ^ ^ │<これからも僕を応援して下さいね(^^)。 ⊂| |つ (_)(_) 山崎パン
こういうコード書いて計算すると… #include <stdio.h> void main(){ float m1 = 29999 * 0.025; float m2 = 29999 * 0.25; printf("m1=%f\n",m1); printf("m2=%f\n",m2); }; m1=749.974976 m2=7499.750000 になってしまうんですけど、なんででつか? VC++6です。
floatを使うなとあれほど言っただろ。 floatの精度を調べれば分かるが、10進換算で高々7桁程度しかない。 なので、m1はfloatでは誤差のある数値になってしまう。
あれれ~?
40 :
デフォルトの名無しさん :03/08/20 16:39
OS:Win98、コンパイラは全てフリーのものを使うという環境で、 C言語によってDLLを作成しようと色々試してみたのですが、 あまり上手くいきませんでした。 良い方法知っている方いましたら教えていただければと思います。
Windows.h眺めていたのですが、なんで定数をenum使って宣言していないのでしょうか? enumを使ってはいけないような暗黙の了承でもあるのでつか?
42 :
デフォルトの名無しさん :03/08/20 23:32
あひゃproc
>>41 超古いCコンパイラだとenumが通らないからじゃねーのか?
>>41 処理系に負担をかけないようにというのはどうだ?
#define はプリプロセッサで処理されるが、
enum は パーサの処理が終わるまで情報が必要だろ。
だいたい、enumerationでないものにenumを使うのは
本末転倒な話なんだけどな。
俺は、こんな使い方は大嫌いだ。
enum JUNK {
FOO, BAR, BAZ, NUM_JUNKS
};
enum JUNK junk;
に代入できるのは FOO, BAR, BAZ と NUM_JUNKS の4つって変じゃないか?
>>44 分からんでもないが、
どうせ junk にはキャストすれば何でも入れれるし、
バッファオーバーランとか何らかのバグで変な値が入りうるんだから、
限定的になら無効な値を含めてもいいんじゃないの?
あと、そういうことから、
値の範囲を確認する癖は付けておいた方がいいと思う。
特にセキュリティの要求されるプログラムなんかは。
46 :
デフォルトの名無しさん :03/08/27 03:33
別スレから追い出されたのでここでききます。 cの入門書にprintf("hello")だけのプログラムがでてきますが、 これをprintfを使わずに、 #include <stdio.h>なしで、その他のヘッダのincludeもなしで、 書くとどんな感じになるんでしょうか?
>>46 printf()を使わずに何がしたい?
標準出力するだけのプログラムから、標準出力することを取り除いたら残りは何もないと思うが。
>>47 printf()の中身がstdio.hに書いてあるのではないのでしょうか?
それならその中身を直接書けばprintf()なしで書けると思ったのです。
というか、printf()が何をしているのかが知りたいのです。
stdio.hを見てみたのですが中身らしきものが見つけられません。
ちなみにWinXPでフリーのBC++です。
>>48 stdio.hの中に書かれているのはprintf関数の中身ではありません
書かれているのは printf関数のプロトタイプ宣言です
プロトタイプ宣言ってのは関数の戻り値と引数の型をコンパイラに教えるためのものです
詳しく知りたければ検索してみてください
実際の中身はたぶんコンパイル済みの状態で開発環境の中に入っていると思います
これがリンクのときに結合されて最終的なEXEファイルとなります
# ソースのほうはどうなんでしょ・・・VC++は付属してましたが・・・
FreeBSD + gcc 2.95.3 ならば、/usr/src/lib/libc/stdio/vfprintf.cが printfの該当ソースプログラム(printf.cはstdoutに対してvfprintfを呼ぶだけ) 書き込みは、さらにvfprintfから__sprintを経由して__sfvwriteへと渡る
なお、stdioの機能だけで、gccでは12267行もある。printf関係は2000行くらいか。 他のコンパイラ(BCCはソース付属のハズ)でも、似たようなものだろう。 その半分がコメントだとはいえ、生半可な知識では読むことすらままならない。
C 言語質問スレにてこちらを教えていただきましたので質問させてください。 double → int への型変換を行なう際には ライブラリって必要なんでしょうか? void main(void) { double d = 1.5; int i = 0; i = (int)d; } これだけのプログラムなんですが,DOS から cl を叩くと /out:b.exe b.obj b.obj : error LNK2019: 未解決の外部シンボル __ftol2 が関数 _main で参照されました。 b.exe : fatal error LNK1120: 外部参照 1 が未解決です。 上記のようにリンクエラーになってしまいます。 int → double は問題ないのですが。。 書籍やサイトを見る限りではライブラリが必要とかは 何も書かれていなかったもので。。どなたか教えていただけますか? 環境は WinXP Home edition Visual C++ 6.0 です。
VC6.0で無事リンクできるけどな。 ただ、dumpbinで調べると__ftol2じゃなくて__ftolをリンクしてるみたいだが。 環境変数LIBとかちゃんと設定してある?
何がしたいのかというと、単なる四捨五入なんです。。(double → int で小数点切捨て) ただ、明示的に型変換するときにライブラリって必要なのかなぁってことが知りたいんです。 宜しくお願いします。
うは 同時カキコすいません(;´д`) やっぱりライブラリが必要なんですね。 当方メモ帳書き+ cl コマンドでしこしこ作っているもので。。 とりあえず必要なライブラリを探して再チャレンジしてみます。 ありがとうございました。
ライブラリといっても、明示的な関数の格好をしているもの以外にも 言語を成立させるために必要ないろんな関数が含まれている。 #型変換然り、スタートアップモジュール然り。 なので、そういったライブラリは通常明示しないでもリンクできるようになっているはず。 環境を巧く設定できていないんじゃないかな?
>>57-58 つまり環境変数がきちんと設定されていれば基本的なライブラリは
自動的にリンクしてくれる,ということでしょうか?
環境変数 LIB は通っているみたいです。
LIB=C:\Program Files\Microsoft Visual Studio\VC98\mfc\lib;C:\Program Files\Micro
soft Visual Studio\VC98\lib;C:\Program Files\Microsoft Visual Studio .NET\Vc7\li
b\;C:\Program Files\Microsoft.NET\FrameworkSDK\Lib\
もう少し色々調べてみます。
>>59 VC.NETのclがVC6.0のライブラリをリンクしようとしてるってことはないか?
>>60 レス遅くなってすいません ノ(;´д`)
なるほど どのパスのライブラリを使うかでモメてるってことですね
パス削ったりして試してみます。
解決しました。皆様のご指摘どおり LIB の設定ミスでした。 使っていた CL.exe は VC7 のものでした(いつ .NET を入れたのか全く覚えてない...) ライブラリは VC6.0 のほうを見に行っていたため問題が起きたものと思われます。 環境変数 LIB を LIB=C:\Program Files\Microsoft Visual Studio .NET\Vc7\lib;C:\Program Files\Micro soft.NET\FrameworkSDK\Lib;C:\Program Files\Microsoft Visual Studio\VC98\mfc\lib; C:\Program Files\Microsoft Visual Studio\VC98\lib; のように,VC7 側のライブラリを先に見に行くよう修正した結果, コンパイル・リンクも無事通りました。ちゃんと小数点以下も切り捨てられています。 これでまた一つ先に進めます。ありがとうございました。
63 :
デフォルトの名無しさん :03/08/29 18:39
2,3週間前に始めたばかりの初心者です。どうか、教えてください。 プログラムが1周まわるとDOSが強制終了してしまいます。 例えば下のプログラムはほとんど点滅のように実行した瞬間に終了してしまいます。 #include <stdio.h> main() { printf("This is a test!"); } 今まではこんな事はなかったのですが、どうすれば改善されるでしょうか。 どうぞ、ご教授お願い致します。 環境はwindowsXP Home Visual C++6.0です。
考えるな、感じろ
>>63 1.
#include <conio.h>
して、mainの最後でwhile(!kbhit());
2.
PrintScreen キーで、一瞬の隙をついてキャプチャする
>>63 これでもよし
#include <stdio.h>
void main() {
int i;
printf("This is a test!");
for (i=0; i < 100000; i++);
}
これでも点滅のように見えるなら100000の桁数を多くしてみる。
猫でもわかるプログラミングに載ってた方法ですが。 コンソール止めるときだけgetch()を使ってます。 #include <stdio.h> #include <conio.h> main() { printf("This is a test!"); _getch(); }
教えて頂いた方法で正常に実行できました。 本当にありがとうございます。
70 :
デフォルトの名無しさん :03/08/31 19:26
DTM板では聞きづらいのでコチラでお聞きしたいのですが、
ftp://ftp.roland.co.jp/pub/roland/japan/patch/inst8850.txt シーケンサと言うソフトが有りまして、現在の定義ファイルに↑の
新しく追加された音色を追加して、新しい定義ファイルを作成する
プログラムを作成したのですが、上手く行かないのです。
while( (fgets(str,128,filepoint)) != NULL ){
if( str[0] >= '0' && str[0] <= '9'){
// 音色名をゲッツ
search = strrchr(str,'\t');
strcpy(buf,search+1);
search = strrchr(buf,'\n');
if( search != NULL ){
p = search - buf;
buf[p] = ' ';
printf("%s\n",buf);
}
上記のURLの一番最後、128 127 Jungle Tune が来る物として
考えて下さい。音色名の後に改行が来ると困るのでコレを消そう
としているのですが・・
1.%d として int p を出力すると 13 と出ます。
2.buf[0] を出力すると、当然 J が出力されます。
3.ですが、このプログラムだと ungle Tune と先頭が欠けてしまいます。
何故なのでしょうか・・ 使用しているのは gcc developer station2000です。
意図した動作かどうかは知らんけど 最後の改行を消すなら、 search = strchr(buf, '\n'); if (search) *search = '\0'; で充分。 先頭のJが消える理由はわからん。 pの値やbuf[0]が正しいところを見ると プログラムの他の部分でbufの先頭を壊してるんじゃないか? bufの直前に宣言している変数(配列)を見直してみそ。
>>70 文字列が "\r\n" で終わってないか?
"Jungle Tune\r\n"
の '\n' を ' ' で置き換えると
"Jungle Tune\r "
となる。
これを画面に表示すると、'\r'でカーソルが左端にいって、次の空白が表示されるので
結果的に
ungle Tune
と表示される。
>>71 thx 全体的に挙動が変だったので色々見直して居た所、inst8850.txt の
2651行目からbank#(CC00)とprog#(PC) の位置が逆になっていまして、
"^^^^^"
の次の行のbank#を読むとして居た為に、2651行目以降ループが
止まらなくて配列を破壊して居たようです。
読み込むリストの最初と最後しか見て無かった俺がアホだった と言う事で・・TT
>>72 書いてるうちにレスが。挙動不審は治った物の やはり先頭が欠けて居たので
p = search - buf;
buf[p-1] = '\0';
とすると正しく出力されました! これで新しいシンセに対応した定義ファイルが出来ました!
これでやっと新しい音色が使えます
>>63 ショートカットを作って終了後もウィンドウを閉じないように設定するのが真っ当なやり方。
コマンドラインから起動するのが真っ当なやり方だと思ってたよ。
質問です。 簡単な掛け算などの計算結果を1文字ずつ分割して表示する(扱う)には どうしたらいいのでしょうか? コンパイラはCCです。
掛け算の結果を分割するとはまた面妖な。 何がしたいのかもっとわかりやすく説明できない?
>>78 要するに数値の桁ごとの値を一つの数字として扱いたいわけか。
配列に入れて何とかしたらどうだ。初心者の俺がサンプル貼っちゃうぞ。
/* 開始 */ #include <stdio.h> int main(){ char c[30]; int a=0; printf("数字を入力して下さい\n"); gets(c); while(c[a] != '\0'){ printf("先頭から%d番目:%3d\n",(a + 1), (c[a] - 48)); a++; } printf("抽出したい桁数を入力してください。\n\"-1\"で終了します\n?"); scanf("%d", &a); while(a != -1){ printf("先頭から%d番目の数字は%d\n", a, (c[a - 1] - 48)); printf("抽出したい桁数を入力してください。\n?"); scanf("%d", &a); } printf("実行終了"); return 0; } /* 終了 */ 初心者なりにがんばって考えたんだけどどうだ
見当違いのことやってても許してね 初心者だから
48って何?
'0' == 48 但しASCIIの場合のみ
ASCII文字セットだと0の前に文字が47個あるから 数字として文字を扱うのに48を引くような
先に書かれてたショック 寝よ
0の前に文字はなし 0の後に文字はできる
ずいぶん初心者に優しいな
スレタイがスレタイだけに
90 :
デフォルトの名無しさん :03/09/06 01:52
良スレage
91 :
デフォルトの名無しさん :03/09/06 03:20
VC++初心者です。 グローバルでクラスのインスタンスを定義していたのですが 同じクラスを使って実行時にnewしてグローバル変数 (またはそれに代わるもの)を作りたいんです・・・ これってどうやったらいいのでしょうか? 宜しくお願いします。
>>91 クラスのポインタをグローバルで持つとか。
>>91 グローバルはやめなさい。
替わりにstaticで保持して、ポインタで渡しなさい。
>>91 class Foo {
public:
static Foo* GetInstance() { static Foo obj; return &obj; }
};
// 必要に応じて
// #define g_foo (*Foo::GetInstance())
実はエラー処理でグローバルのクラスを使い回したいと思っています。
>>92 さん
以下のを作ってみたのですがどうもsub()に入ったところでpErrのポインタがNULLになってしまってうまくいきません。
これは一体どうすれば・・・
#include <stdio.h> class cErr { public: intErrNo; void pr(){ printf("ErrNo:%d\n",ErrNo);} cErr(){ErrNo = 0;} }; cErr*pErr; void sub() { pErr->ErrNo=100; pErr->pr(); throw pErr; } int main() { try { cErr *pErr = new cErr; sub(); delete pErr; return 0; } catch(cErr *e) { printf("catch pErr: %d",e->ErrNo); return -1; } }
>>93 さん
これは各関数に引数で渡すという意味?
>>94 さん
これは一体何を意味するのでしょう・・・?
馬鹿なことばっかりいってすいません。
throw cErr(100); の形で処理するのじゃだめなのか?
99 :
デフォルトの名無しさん :03/09/06 13:53
VC++.NET 2003 で、ソースファイル側でMessageBox::Show("hello")が できん。 なんで?
100 :
デフォルトの名無しさん :03/09/06 15:23
Debian のgcc にてコンパイル、実行できていた,cのプログラムが、 windows 上、cygwin の gcc では、コンパイルは出来たように 見えるものの、実行すると、 segmentation fault (core damped) になってしまいます。 (配列とかを、かなりたくさん使ってます。) "hello world" とかのプログラムなら、ちゃんとコンパイル、実行とも 出来ます。 ここで質問すべき問題では無いのかも知れないんですが、 どこで質問して良いのかもよくわからないので、 書いてしまいました。何かご意見いただけると嬉しいです。
#ifdef __CYGWIN32__ とかで囲まれている部分ないの加奈?
>>100 両方ともまったく同じソースを利用しているなら
おそらくDebianのほうは”たまたま”うまく動いていただけだと思う
配列のオーバーフローが原因だとおもうから
もう一度よく確認したほうがよいかと
103 :
こまったさん :03/09/06 17:06
VC++でWAVファイルをテキストデータに変換したいのですが (例えばtest.wavを変換) 始めに引数の数を確認するようで、 よく if(argc!=3) というような 条件式が例題に書かれています。 この条件式の前のargcを出力すると1が入っています。 したがって以下の出力で終了してしまいます。 Usage is ... trans.exe <input file> <output file> いまいちwavファイルをどこで読んでいるのかもわかりません。 コマンドラインで普通は入力するのでしょうか? といっても手順がわかりません。 助けてくださいお願いします。 とりあえず先頭部分 #include<stdio.h> #include<string.h> #include<math.h> int main(int argc, char *argv[]) { char c; int i,j,count; FILE *fp,*fp2; if(argc!=3){ printf("Usage is ...\n"); printf("trans.exe <input file> <output file>\n"); return(-1); }
テキストって? dumpをとりたいのかどうかすらわからない質問。
自己レスです。 main関数の以下の部分が間違ってるのが原因でした・・ お騒がせしました。 int main() { try { *pErr = new cErr; //ここが間違ってた sub(); delete pErr; return 0; } catch(cErr *e) { printf("catch pErr: %d",e->ErrNo); return -1; }
>>98 さん
レスありがとうございます。
実際に組んでいるプログラムは他の情報もとっておきたいので
その形式だとまずいんです・・・
107 :
デフォルトの名無しさん :03/09/06 17:31
>> 103 argc にはコマンドライン引数+1の数が入っています。 なので、transを引数なしで実行すると、argcには1が入ります。 このソースでは、引数に <input file> と <output file>の2つの引数が 必要なので、引数が2つ無かったら usage を表示するようになっています。 それが、if (argc != 3) { ...の部分です。 …ところで、どなたかVC++.NET2003 でMessageBox::Show()関数を使う方法を 教えてください。。。
108 :
こまったさん :03/09/06 17:36
ありがとうございます。 早速やってみます。
このスレ結構愉快でよろしいね
110 :
こまったさん :03/09/06 18:13
すみません。ちょっと調べてみたのですがわかりません。 引数ってmain()の()内じゃないですよね? <input file> と <output file>の引数は具体的に言うと どこに組み込めばよろしいのでしょうか?
111 :
デフォルトの名無しさん :03/09/06 18:25
>> 110 コマンドプロンプトで実行してみてください。 引数は、コマンドの引数です。
112 :
こまったさん :03/09/06 18:35
自分はWindows98を使っているのですが、 MS-DOSプロンプトの事ですか?
すげぇ…マジで困りそうだ。
115 :
デフォルトの名無しさん :03/09/06 20:08
来るべき恐怖。 コマンドプロンプトを知らない世代。
116 :
こまったさん :03/09/06 20:26
すみません。コマンドプロンプトってVC++のアプリケーション上で コンパイルとビルドをして実行したとき出てくる黒い画面ですよね? それとも コマンドプロンプトを直接起動してgccとかa.outとかやるんですか?
117 :
デフォルトの名無しさん :03/09/06 20:51
>>116 コマンドプロンプト = MS-DOSプロンプト でふ。
出力された「Using(使いかた):」の通りに、以下の一行を
trans.exe "input file" "output file"
打ってEnterキーを押すのでふでふ。ダブルクォート(これ->「"」)は
付けておいたほうが無難でふ。
あ、一つ言い忘れてたでふ。前もってcdコマンドでディレクトリを
移動するのを忘れちゃだめでふよ。cdコマンドの意味は、
cd /help
と打つと出てくるでふ。dirコマンドでは、は現在のディレクトリの
ファイルを一覧できるでふ。これだけ知ってればで初心者も安心でふ。
118 :
こまったさん :03/09/06 21:48
ありがとうございました。 コマンドプロンプト = MS-DOSプロンプト の 使い方から地道にやっていこうと思います。 では
119 :
デフォルトの名無しさん :03/09/06 22:15
C言語を始めたいと思いCPadと言う開発環境とLSIC-86試食板をダウンロードしたんですがテキスト見ても始めの設定がさっぱりでC言語が出来ません!だれか教えてください。
121 :
デフォルトの名無しさん :03/09/06 22:53
VC++ 6.0で書いてるんですが、 struct a{ long a1; short a2; }; struct b{ struct a b1; short b2 } struct c{ char c1; struct b c2; struct b c3; char c4[47] } sizeof(struct a)がlongとshortで6で、 sizeof(struct b)がaとshortで8で、 sizeof(struct c)がcharとb*2とchar*47で64になって欲しいんですが、 sizeof(struct c)が66になってしまいます。 とりあえず先頭を見たところc1とc2の間に無駄な1byteが入っているようです。 c1:c2:c3:c4の順番で64byteちょうどに並べるにはどうすればいいのでしょうか?
122 :
デフォルトの名無しさん :03/09/06 23:07
>>122 やはり環境依存なんでしょうか?
とりあえず
struct c{
char c1:8;
struct b c2;
struct b c3;
char c4[47];
};
とかも試してみたんですが、これは逆にサイズがでかくなりました(確か68)。
>>123 #pragmaで特別な命令を与えればよかったと思うけど、忘れた。
#pragma pack(1)
再度質問。 #pragma pack(1) つけたら変な動作しはじめました。 classの中で構造体とポインタを、 struct a{ int a1; short a2; bool a3; unsigned int a4; }; class b{ struct a b1; c *b2; }; というような構造で持たせた後、 b1.a4に数値を代入するとb2のポインタが書き変わってしまうという現象が見られました。 pragma外すしかないですかね…。ショボーン
根本的な解決にはなりませんが、一応対処したので とりあえず書いておきます。 #pragma pack(push,1) (詰める必要がある構造体) #pragma pack(pop) ってな感じにしてみました。 しかしなんでただ単純な代入だけでなんで構造体の外まで書き変わるんだろう…
130 :
デフォルトの名無しさん :03/09/07 00:06
メニューのプロジェクト→設定で C/C++のタブを選んで カテゴリでコード生成を選択して 構造体のアラインメントで1バイトを選んでも、 ポインタ書き換わりますか?
>>130 今試してみましたがだめですた。
ちなみに変える前は1byteでした。
#pragma pack(1)を全てのソースに書かないとだめ、とかあります?
訂正。 >>ちなみに変える前は1byteでした。 ちなみに変える前は8byteでした。
133 :
デフォルトの名無しさん :03/09/07 00:23
>>131 > #pragma pack(1)を全てのソースに書かないとだめ、とかあります?
その構造体を複数のファイルで使うなら当然。
というか普通は構造体定義とともにヘッダーファイルに書かない?
>>133 どうやら目的の構造体のファイルに#pragma pack(1)を書いたところ、
そのファイル内で参照している別の構造体に影響を及ぼしていたみたいです。
すっきりしました。ありがとうございました。
アライメント詰め詰めにしてなんかいいことでもあんの?
>>135 バイナリファイルの読み書きが楽になる(場合がある)。
137 :
d206.GsizuokaFL2.vectant.ne.jp :03/09/07 00:37
↑何がしたいのか良く分からない人
↑宣伝かどうかも分からない人
初心者過ぎて申し訳ないんですが、重ねて質問です。 debian のgcc でコンパイル、実行できたプログラムが、cygwin の gcc では 出来なかったという話だったんですが、 >> 101, 102 どうもありがとうございました、だけどよくわかってません。 一般に宣言した配列の数が多すぎて、コンパイルは出来るけど 実行できないと言うことはありますか? どのくらい多いかというと、float 型で100万個(?) とか(単位がよくわかってないですが)です。 オーバーフローというのは、宣言した配列にそれ以上のものを 書き込もうとすることだと思うんですが、実行時にそういう書き込みを するところに到達する以前にプログラムは停まります。 segmentation fault となります。 根本的にコードの書き方が悪いのかも知れません、重ねてご意見頂けると 嬉しいです。
>>140 一時変数は、スタック上に暗黙的に生成される。
このため、スタックとして用意されているよりも大きい変数を確保しようとすれば
スタックオーバーフローが発生してセグメンテーションフォルトを始めとした各種の異常を来たす。
なので一般的に、一時変数として要素数の大きい配列を宣言してはいけない。
>>141 ありがとうございます。
教えて君過ぎで申し訳ないんですが、考えられる可能そうな
解決法も示して貰えれば嬉しいです。
大量の数値データを扱う方々は、皆さんどうしてるんでしょうか??
(僕がやろうとしてるのは、画像処理的なもので、1万ピクセルの
画面を100枚、ある程度同時に処理したいんです
(平均値とかが重要なので))
>>142 malloc関数でヒープ領域にメモリを取ればいい
144 :
デフォルトの名無しさん :03/09/07 13:40
スタックに作るのはどれくらいまでありなの?
>> 143-145 どうもありがとうございます。その辺からもうちょっと調べてみて 何とか頑張ってみます。
今C++で数値計算をやってるんですけどExcelから使えたら便利だなってことで VCでDLL作ってExcelで呼び出すためには、どんなことを勉強すればいいんですか?
そんな大げさにせんでも、呼び出し規約をWINAPIにしておくだけで良いのでは?
>>148 ありがとう。
かさねがさね聞いて悪いけど、参考になる本とかありますか?
ちょっとググッテみたら「"COM" は一般すぎる言葉のため、 検索には使用されていません」
って言われちゃうんで。
>>150 "COM プログラミング"
ちなみに、余計なお世話だが、*.com ファイルとは全然別物
>>151 どうもありがとう。
さっそく買ってみます。
>>151 すまん、タイトルでなく 検索キーワードのつもりで書いた
ま、こんなシンプルなタイトルの本なら
初心者向けに決まってるだろうけど
>>153 本のタイトルじゃないんですね。
とにかくサンクスコ
>>150 Googleのヘルプ一回読んどき。
+COM
156 :
デフォルトの名無しさん :03/09/09 01:03
Cをそれなりにやって、そろそろC++にも手を出したいと思ってます とりあえず手始めにトランプっぽいカードゲームを作ってみたいと思います クラスの分け方がいまいちつかめないので、いい例を教えてもらえないでしょうか 流れはこんな感じで↓ 1.2~3人の各プレイヤーに、同じ枚数のカードを配る 2.全員手札からカードを選んで、1枚ずつ出す 3.ルールに従って評価する 4.カードがなくなるまで2.に戻る 5.終了判定 どういう構成でクラスを作るのが自然なのでしょうか。教えてください
憂鬱本見たら?
158 :
デフォルトの名無しさん :03/09/09 02:16
C++Builder6.0Enterpriseで非ビジュアルコンポーネントから ActiveX(ocx)を作成したいのですが、非ビジュアルコンポーネントですと それをコンポーネントパレットに登録して、新規作成->ActiveXコントロールで 作成という手順が踏めません。 どのように作成したらよろしいのでしょうか?
>>156 プレーヤークラス
カードクラス
”山”クラス(残りカードの管理)
”場”クラス
ルールクラス
UI クラス
ゲームそのもののクラス
その他必要に応じてメッセージ表示、サウンド等々
場と UI をいっしょにすべきかきちんと別にすべきかはゲームの内容によるが
できることなら別にすべきだろうな
人の書いたC++のソースを大量にみたいのですが、 どこにいけばいいでしょうか? できればVisualC++、g++で。 低レベルでもOKです。
MFCのソースとか
>>161 ベクターかなんかに行って、ソース公開してるツールとか探せば・・・
でも C++ だけピンポイントに探すのは大変かなぁ。
ちなみに Palm は基本的に C++ (C でもいいけど) だから、探しやすいだろう。
ためにはならないかも知れないが。
もじら(w
>162 >163 >164 即レスthxです。 日本語でないとだめでした… 162,164さんのは残念ながら無理っぽ ベクターいってきます…
日本語で書いてあるC++はそうそうないと思われ。
>>160 なるほど~
早速参考にさせてもらいますね。一度その構成で作ってみます
全体に共通していそうだから、カードクラスは継承させるのかな。やっぱり
試行錯誤でやってみます。ありがとうございました
168 :
デフォルトの名無しさん :03/09/10 23:54
169 :
デフォルトの名無しさん :03/09/11 00:24
おい、ぽまえら! 教えろ! フリーの環境でネーティブにWin32をポー里するのはどこで拾えるんだよ? ボーランドとM$以外のをおしえてくれ。 ネーティブでないミンガとかいうのは却下。
170 :
デフォルトの名無しさん :03/09/11 00:52
ポー里?
サポートのことじゃねーの? open watcomは?
172 :
デフォルトの名無しさん :03/09/11 03:07
WATCOMって昔、鳴り物入りで出てきて、その時点ではM$コンパイラを凌駕してたと思うけど、その後どうなんたん?
174 :
デフォルトの名無しさん :03/09/11 04:50
Win2k VC++6.0 使ってます。 足し算引き算の簡単なプログラムを書こうと思ったんですが 途中atoi関数を使うと 「定義されていない識別子です。」とエラーがでます。 どうしてなのでしょうか?
>>174 それは関数プロトタイプが宣言されてないのです。
atoiを使うならヘッダファイルstdlib.hをインクルードするのです。
今後同様なエラーに遭遇したらヘルプを見て必要なヘッダファイルを調べるのです。
176 :
デフォルトの名無しさん :03/09/11 05:18
>>175 あ、なるほど。。。
ヘルプにも載ってました。
助かります、ありがとうございました。
177 :
デフォルトの名無しさん :03/09/11 07:39
>>168 あまり良くわかってないのだけど
typedef char AA[100];
void f(AA);
って宣言しても
結局
void f(char*);
として扱われちゃうよね?
char[]からchar*への変換過程に罠がありそうな気がするけど
そんなのは全然問題なさそうな気もする。
初心者とはしては気になるところなので原因がわかったら教えてください。
178 :
デフォルトの名無しさん :03/09/12 00:20
すいません、詰まりました。教えてください。 どうやればベースクラスのメンバ関数ポインタを取る関数に、 派生クラスのメンバ関数ポインタを放り込めるのでしょうか? ///////例///////// 足すしか出来ない電卓のベースクラスがあり、メンバ関数がこんな感じだとします。 class base{ ... typedef double(base::*function_pointer)(double,double); double plus(double arg1,double arg2); double execute(function_pointer fp,double arg1,double arg2); } これに、派生させて引く機能を付けてみました。 class derived : public base { … double minus(double arg1,double arg2); } base::execute()にminusの関数ポインタを放り込みたいのですが、 変換できないとか言ってコンパイラが通してくれません。 /////例ここまで/////// beseにvirtualでminusを書いてやればbase::minusとして放り込めるのですが、 いろんな種類の電卓を派生させていくとbaseクラスの定義が凄いことに なりそうなのでやりたくありません。 環境はVC.Net2003です。よろしくお願いします。
文法的にはできない。 引数として渡されたメンバ関数へのポインタを派生クラスのオブジェクトに対して 適用するとは限らない。
180 :
デフォルトの名無しさん :03/09/12 02:04
ポインタのポインタの値を得るにはどうしたらいいですか?
181 :
デフォルトの名無しさん :03/09/12 02:06
>>180 int *p;
int **pp=&p;
出力結果が 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 となるプログラムを while文のみを使い配列に値を格納したいんですが 自分ではあっってるつもりなんですがどこがおかしいのか 分かりません。 配列に直接数値を入れずにしたいのです。 右斜めにあがっていって、上に振り切れればその列の一番下に行き 右に振りきれたらその行の左から上がっていく 数字にぶつかったら下の行くと行った感じの法則です
#include <stdio.h>void main(void){ int a[5][5];int i;int j;int cnt;int g;i=0;j=2;cnt=0;g=1; while((i!=4)&&(j!=2)) { while((i>=0)&&(j<5)) { cnt++; a[i][j]=cnt; while(a[i][j]==(5*g)) { cnt++; i++; a[i][j]=cnt; g++; } i--; j++; } while(i<0) { i+=5; } while(j>=5) { j=0; } } cnt++; a[i][j]=cnt; i=0; while(i<5) { j=0; while(j<5) { printf("%d ",a[i][j]); j++; } printf("\n") i++; } }
184 :
デフォルトの名無しさん :03/09/12 02:45
Cプリプロセッサはフリーフォーマットじゃないよ
スレ違いな気がしてきました。ここはもうこたえなくていいです
かなりアフォな質問かもしれんが、 VC6で #pragma messageを使って__LINE__を出力するにはどうすればいいんでつか?
187 :
デフォルトの名無しさん :03/09/12 20:03
>>178 class Base {
public:
typedef double (Base::*FP)(double, double);
double plus(double arg1, double arg2) { return arg1 + arg2; }
double execute(FP fp, double arg1, double arg2)
{
return (this->*fp)(arg1, arg2);
}
virtual double f(double arg1, double arg2)
{
return execute(plus, arg1, arg2);
}
};
class Derived : public Base {
public:
double minus(double arg1, double arg2) { return arg1 - arg2; }
double f(double arg1, double arg2)
{
return execute(static_cast<FP>(minus), arg1, arg2);
}
};
いまいちわからないのだけど、
>base::execute()にminusの関数ポインタを放り込みたい
って↑みたいな感じ?
そんなもんねえよ。>188
190 :
デフォルトの名無しさん :03/09/12 22:49
191 :
デフォルトの名無しさん :03/09/12 23:21
Windowsプログラミングに関する質問です。 外部アプリケーションの標準出力の内容を横取りするのは CreateProcess() の LPSTARTUPINFO にパイプのハンドルを渡すことで実現できますが、 自プロセスの標準出力を取得することはできるのでしょうか? なぜわざわざ自プロセスのを取得? とお思いでしょうが、 例えばDLLで提供されたあるライブラリがコンソール上にしか エラー情報を吐き出してくれない、というケースも考えられ、 その場合は CreateProcess() のように標準出力先を設定することができないためです。 もしご存知の方がいらっしゃいましたらご教授頂けませんでしょうか なお、当方の環境は Win2k Pro / VC++.Net です。
>>188 内容が0ターミネートされてない文字列になってるとか
193 :
デフォルトの名無しさん :03/09/12 23:50
>>192 どうも128にマジックがあるような感じですので違うと思います。
ほんとにそうなら(char [128])の罠って書き方にならないでしょ。
194 :
デフォルトの名無しさん :03/09/12 23:59
横柄な態度キタ━━━━(゚∀゚)━━━━!!!!!!
だから、そんなもんないから、粘着やめれ>193
196 :
デフォルトの名無しさん :03/09/13 00:01
c++で関数に必要なヘッダファイルがすぐ検索できるソフト があったような気がするんですが、誰か知っていたら教えてください。
197 :
デフォルトの名無しさん :03/09/13 00:08
>>191 GetStdHandle()、SetStdHandle()では?
>>198 ぬおおっ、まさしくそれです!!
なんでこんな、マンマな名前なのにMSDNから見つけれなかったんだろう・・・
Web検索してもどこもかしこも CreateProcess() の外部アプリの例ばかりだったからなぁ
感激です! ありがとうございます!!
>>197 マニュアルという事でしょか?MSDNとは別ですか??
MSDNだとなんか思ったものが出てないのです。
Visual Studioを使ってるんですが、なんかよくわかりません。。
ブヒー・・・ 質問してから思いました。。 Visual Studio 6.0 Wnidows XP です。
ぶひーだって
>>199 が、しかし、試してみたができなかった・・・
HANDLE hRead, hWrite;
SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES)};
sa.bInheritHandle = TRUE;
BOOL b;
b = CreatePipe(&hRead, &hWrite, &sa, 0); // 成功
b = SetStdHandle(STD_OUTPUT_HANDLE, hWrite); // 成功
b = SetStdHandle(STD_INPUT_HANDLE, hRead); // 成功
cout << "test" << endl; // コンソールアプリならばDOS窓に表示される
char sz[1000];
ZeroMemory(sz, sizeof(sz));
DWORD dw;
b = PeekNamedPipe(hRead, sz, sizeof(sz), &dw, NULL, NULL); // 成功だけど dw は 0
// b = ReadFile(hRead, sz, sizeof(sz), &dw, NULL); // これやると固ってもうだめぽ
CloseHandle(hRead);
CloseHandle(hWrite);
結局 sz には何も入らず。
hWrite と hRead を入れ替えたり、sa.bInheritHandle を FALSE にしてみてもダメダター
SetStdHandle をキーワードにWeb検索しても、この試みに成功してる記事はなかった。
うーん、SetStdHandle() って一体何に使うんだろう・・・?
>>204 HANDLE hRead, hWrite;
CreatePipe(&hRead, &hWrite, 0, 0);
_dup2(_open_osfhandle((long)hWrite, _O_TEXT), 1);
cout << "test" << endl;
char sz[1000];
DWORD dw;
ReadFile(hRead, sz, sizeof sz, &dw, 0);
cerr << "Read: " << sz;
ただし、これで
>>191 が実現できるわけではないが。
APIレベルとランタイムライブラリレベルの違い、および
ランタイムの初期化のタイミングについて理解すること。
で、できてる・・・!
完璧なサンプルまで載せていただき恐縮です。
確かにちゃんとフックできてました。
_open_osfhandle() これが重要なんですね・・・
これで検索してみたら、今までつまづいてた点を理解するのに
有用な記事が何件か見受けられました。
> ただし、これで
>>191 が実現できるわけではないが。
ちょっとこれが気になりますが・・・
cerr が取れないことかな? とも思ったのですが、
あてずっぽうで 2 を dup してみたら取れてたし、
副作用があるということなのでしょうか。
いずれにせよ、本当にありがとうございました。
優秀な人達も結構見てるんだな、この板・・・(ボソ
>>206 ファイルハンドルはプロセス固有だが、ファイルディスクリプタは
ランタイムライブラリ固有である。したがって、目的のDLLが
MSVCRTを使用していない限り、EXE側の_open_osfhandle()はDLL側
とは無関係である。DLLの標準出力に任意のハンドルを指定するに
は、DLLの_ioinit()が走る前にSetStdHandle()を行っておく必要が
あるが、暗黙にリンクしたDLLのスタートアップはEXEのスタートア
ップより前に実行されるので、それは不可能である(明示的リンク
または遅延ロードならば可能)。
DLLがMSVCRTを使用しているのであれば関係ない話だが。
>>187 隊長!できました!キャストすればいいだけだったんですね!
#つうかstatic_cast一発でも暗黙の型変換が入らない場合ってあるんですね。
助かりました。ありがとうございます。
209 :
デフォルトの名無しさん :03/09/13 07:26
>>207 詳しい解説ありがとうございます。
なるほど、BCBで作られたDLLとかだと有効じゃなかったりするんですね。
その場合は、BCBランタイムが提供している(あるかわからないけど)
_open_osfhandle() に相当する API を使って、OS が認識できる形の
ハンドルに変換してあげないといけない、と。
標準入出力を OS レベルでサポートしてる OS 上だったら
こんなにめんどくさいことないのになぁ。
いや、そもそも SetStdHandle() に設定したハンドルを
ランタイムが動的に参照してくれてれば・・・
213 :
デフォルトの名無しさん :03/09/13 13:51
cで質問です。環境はWinXP gcc3.x あるテキストファイル hoge.txtを読み込んで (中身は半角英数記号空白改行のみ、2バイト文字はなし、複数行ある。 すでに存在しているものと仮定してエラー処理は省略してください) 英大文字は小文字に、英小文字は大文字に変換しdata.txtに 出力したいのです。 ただしhoge.txt内に'x'および'X'が出た場合はdata.txtを出力せずに ダメですた と画面に出力(printfで可)してください。 要求事項は以下の4点 (1)tmpfile()を使うこと。これがわからなくて規定外の出力ファイルを 消すことができず、wモードで開く>すぐ閉じるで0バイトのファイルに することしかできなかった。 (2)system()は使わないこと。開発環境はWindowsですが実行環境がSolaris, linuxな場所があるのでお願いします。 (3)(2)と被ってますが機種依存な箇所がないこと。 (4)ライブラリはできればstdio.h,stdlib.hのみで。 コード書いてて上記の処理がうまくいかないのでお願いします。
>>213 要求事項1は余計なファイルを使わなければtmpfile()を使わなくていいのかな?
それなら、2パスにすれば充分。
要求事項2は外部プロセスを使っちゃいけないということかな?
そうでないとpopen()はいいのかって突っ込まれそう。
要求事項4はansiライブラリに制限を緩めていいのかな?
でないとstring系もctypesも使えなくて面倒かと。
実際はBASE64エンコードに似た処理なのですが
ほとんどstdio.hでやってたので(atoiのみstdlib.h)
>でないとstring系もctypesも使えなくて面倒かと。
そんな面倒な部分に関して自前で関数作っててstrtokって何ソレ?
というところです。
(これと関係ないけど標準入力からの有理数文字列を配列に格納するのを
(4)の2つのみでまる1日かけて作った時は泣けた)
そこまで面倒なのは要求できないので
(4)にstring.hとctype.hを追加しても構いません。
ttp://cham.ne.jp/piro/p_stdfunc.html ttp://www.bohyoh.com/CandCPP/C/Library/ ここしか見てなかったのでわからなかったのですがpopen()は使わないでください。
(2)はWindows,Solaris,linux上でgccオプション-Wall -ansi -pedantic
が通り実行して問題ないのなら外部プロセス、2パスというのは構いません。
何かと制約が多いですがすみません。
216 :
デフォルトの名無しさん :03/09/13 17:16
malloc をつかった 配列の作り方がわからなくて困ってます。 たとえば、 text[] = "aaaaaa\nbbb\nccccccc\nddddd\n"; という文字列があったとしたら、 char str[0] = "aaaaaa"; str[1] = "bbb"; str[2] = "ccccccc"; str[3] = "ddddd"; というふうに、calloc ではなく malloc をつかって、str というそれぞれのサイズがきっちりあった配列を作る方法を指南していただきたいのですが・・・
>>216 calloc が使えるなら malloc だって使えるだろう?
>>216 char **str;
str = malloc(sizeof(char *) * 3);
str[0] = malloc(2);
strcpy(str[0], "a");
str[1] = malloc(3);
strcpy(str[1], "bb");
str[2] = malloc(4);
strcpy(str[2], "ccc");
初期化済み 文字列の配列作りたいんですが、 char hoge1[][]={"ABC","DEF","HIJ",NULL}; てやったらうまく初期化できないんですが、なんで?
char *hoge1[]くらいにしときなさい。特にNULLを入れるならネ
221 :
デフォルトの名無しさん :03/09/13 19:40
>>219 配列の数は1個しか省略できない仕様だからでは
222 :
デフォルトの名無しさん :03/09/13 21:06
C++のiostreamとかの入出力クラスでソケットプログラミングをしたいのですが、 可能でしょうか? 可能であれば、やり方を教えてください。 使っているOSはLinuxで、コンパイラはgcc 2.95.2です。
218 さん、どうもありがとうございました。 動作確認しました。 これを応用します。
basic_streambufを継承するのが簡単か。
tcpstream作ったときあるなぁ 結構作るのめんどくさかった・・・
>>224 ありがとうございます。調べてみます。
でも、自分で継承しなきゃいけないってことは、
もしかしてあまりこういうやり方は一般的ではないということですか?
自分としては、そんなにズレたことをやろうとしているわけではないと
思ってるのですが。。。
みなさんC++でソケットを扱う時はどうしてらっしゃるんでしょうか?
実装依存になるけど、fstreamが内部でFILE使ってるようなら、 fdopenしたのを無理矢理食わせる手もあるな。 というか、iostream自体、サンプルに使うレベルを超えていない感じだが。
a
229 :
デフォルトの名無しさん :03/09/13 23:31
PCのHDDを容量アップしようという事で、HDDを載せ換えてOSをインストールしました。 そのうえでVS6.0EntをインストールしてSP5を当てたのですが、VC++6.0だけSP5があたってるかどうか確認できません。 VB6.0は起動時にSP5と表示されますし、バージョン情報でもバージョンの後ろに(SP5)と表示されて確認できます。 VSSもバージョン情報から同様に確認できます。 VC++6.0だけ上記の方法で確認できません。 「あれー?そうだったっけ?」と思い他のマシンを見ると、上記の内容は同様でした。 「うーん。ずっとそうだったっけ?変だなー?」と思い、どうしても納得がいかなくて2chの皆様に質問です。 教えてください。 1.VC++6.0にSPを当てた場合に、バージョン情報などではSPがあたっているかどうか確認できない状態は正常でしょうか。 2.VC++6.0でSPがあたっているかどうかを、確認する方法はありますか。
基本的に確認する方法はなかったはず。ただ、 >clのバージョンは12.00.8168だったのが、SP5を当てたら12.00.8804に という情報があるので、clを直折叩いてverを見るべし。
231 :
デフォルトの名無しさん :03/09/14 01:03
どなたか、リッチエディット2.0以上の各種処理を 1.0の古きよき時代のように文字列単位ではなく バイト単位で処理させる方法を知ってたら神と呼ばせて下さい
>231 質問に質問で申し訳ないけど、 RichEditって内部UNICODEで動作してるんじゃないの?
>>232 まじっすか!
2.0から内部格納形式が変わったことに起因するものだったら
絶望的だ。。。
1.0のときはすっごく使いやすかったのに
>230 情報ありがとうございます! 最初「clのバージョン?」と思いましたが、見てびっくり! わー!ほんとだ! 12.0.8804.0 になっています。 うーん、、、。 「こんなのでいいのか」と少し戸惑いましたが、SPのインストールは一括で行われているのでOKな訳ですよね。 勉強になりました。 ありがとうございました。
>>234 心配ならcl.exeのタイムスタンプを見てみれば?
>>229 私はいつもレジストリで確認しています。
HKEY_LOCAL_MACHINE\Microsoft\VisualStudio\6.0\ServicePacks
ちなみにVC6単体にあてた場合の確認方法は知りませぬ。
その場合もレジストリのどっかに書いてそうだけどね
>235 タイムスタンプは「作成日時」「更新日時」「アクセス日時」の3つありました。 「作成日時」と「更新日時」は2000年3月14日で、「アクセス日時」は現在の時刻が表示されてしまいました。 2000年3月14日は、ミレニアムバレンタインのちょうど一ヵ月後ですね。 >236 レジストリ見ました。 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\6.0\ServicePacks にSPのバージョンが書き込まれていました。(\SOFT\が>236より追加されています。) こちらは、最後にあたったSPが「5」というわかりやすい数字で見て取れるのでべんりです。 ありがとうございました。
238 :
デフォルトの名無しさん :03/09/14 10:09
すいません。 超初心者で「猫をわかる‥」という自分に丁度いいステキサイトを見つけんですが、 自分が買ったのはc++builder6JなのでVC主体のあのサイトは 初っ端からまったくわかりませんでしたぁ! c++builderを一からやさしく手ほどきしてくれるサイトはないもんでしょうか よろしくおねがいします
239 :
デフォルトの名無しさん :03/09/14 10:10
○猫でもわかる ×猫をわかる
>「猫をわかる‥」
プログラムより猫の方がむずかすぃ~
奴ら気まぐれすぎる
>>238 へロー、ワールドならBCBもVCもないと思うが
やるとこ間違えてないか?
>>240 いや、なんというかjavascriptとかperl使った簡単なCGI程度なら書けるんで
プログラム自体は全くの初心者ってわけでもないんですよね。
でもなんというかc++builder開いてビビったのは、
パネルの多さとか、保存するとわけのわからんファイルがいくつも出来たりとか、
なんか最初から変なコードが何行かすでに書かれてたりとか、
こんぱいるとかいうやつをしても何かよくわからなかったりとか‥。
今までのプログラミング(もどき)経験では想像を絶する光景にうろたえてしまいましたぁ。
なので猫でもわかるc++builderみたいなサイトがあればと‥。
すまん、書き込みが重なった。 ちなみに猫でもわかるの「C言語編」は一から始める人にはちょっと取っつきにくいかも。 他サイトで若干かじってからここで勉強した方が良いと個人的に思う。
>>242 ああ!ここはC++ Builder 主体ですねー。
ありがとうございます!ゆっくりと精進していこうと思います。
猫のページは冗談がゆかいだったので後で見ようかと。
つーか、プログラミング経験があって自信もあるなら gccなりのコマンドライン環境を勉強するのがいいと思うのだが。
246 :
デフォルトの名無しさん :03/09/14 11:13
VC++ .Net 2003でMSXMLでXMLを扱おうとしています。 CComPtrを使うと便利と聞いて以下のような感じで書きました。 CComPtr<IXMLDOMNodeList> children; CComPtr<IXMLDOMNode> child; children->nextNode(&child); // 1個目 children->nextNode(&child); // 2個目 ここで疑問に思ったのですが、CComPtrはスコープから外れる以外でも うまいことRelease()してくれるのでしょうか。 それとも以下のように明示的に呼ぶ必要がありますか。 children->nextNode(&child); // 1個目 child->Release(); children->nextNode(&child); // 2個目 また、代入のときはどうでしょう? CComPtr<A> a = InfA; a->Release(); // 必要? a = InfB;
>>246 &演算子は中身がNULLでないとassertエラーで止まる
代入の場合は中身が入ってるともともと持っているモノはちゃんとReleaseが呼ばれる
つまり以下のようにすればよい
children->nextNode(&child);
child=0;
children->nextNode(&child);
>>246 普通はこう書くわけだが。
IXMLDOMNodeListPtr children;
IXMLDOMNodePtr child;
child = children->nextNode();
child = children->nextNode();
249 :
デフォルトの名無しさん :03/09/14 16:15
すいません。ちょっと変な質問します。 borlandのコンパイラをダウンロードしたのですが、 コンパイルオプションをみていたら、 「-W Windowsアプリケーションとしてコンパイルする」 というのがありました。 borlandのコンパイラとメモ帳があれば、Windowsアプリケーションが作れるんですか? てっきりvisual stadioとかがないと作れないものだと思っていたんですが。
>>249 可能です。
詳しくはヘルプを参照するべし
>>250 ㌧クス。
ヘルプはいろいろ見た上でわからなかったんで質問したんです。
とりあえず、ネットでサンプルのソースでも探してやってみます。
252 :
デフォルトの名無しさん :03/09/15 13:02
すいません。
download板の47氏を見てプログラマに憧れてC++builderで勉強始めたものの、
ちまたに落ちてるサンプルはゲームとか計算機とかでイマイチやる気が出ません。
まだ条件分岐とかforでループ回したりくらいまでしかわかりませんが、
やっぱ通信系のおもしろそうなプログラムに挑戦して当たって砕けながら
基本的なことも一緒に学んでいきたいんですよね。
で、WWWCとかffftpとかのソースコード見てみたんですがさすがに複雑でいきなり山が高すぎて。
http://www.yukibow.com/bcb/index.html ↑このページのメール関連とか通信関連とかは少し参考になると思うんですが、
他にも簡単な通信系のコード書くのに参考になるサイトとかはありますでしょうか?
もう簡単であれば簡単であるほど嬉しいのですが。
あと、この手のことで参考になる書籍なんかも良ければ教えて頂きたいのですが。
できましたら実践向きのやつを…。
わがままばっかりですが、どうかよろしくお願いします。
>>253 はや!
大変参考になるサイトどうもありがとうございます。
今は情報をいろいろ集めている段階なので少し難しいですがとても嬉しいです!
256 :
デフォルトの名無しさん :03/09/15 14:52
すいやせん。 ベクトルの構造体の関数について、よかったら教えてください。 typedef _Vector { double x, y; } Vectour を使って、このベクトル構造体に対して次の関数を作成します。 1.ベクトルの長さを返す関数 2.ベクトルの符号を反転させる関数 3.2つのベクトルを加算する関数 4.2つのベクトルを減算する関数 5.ベクトルを n 倍する関数 6.ベクトルとベクトルのなす角度を返す関数 (atan2関数を使用する) 7.ベクトルの視点を中心として、 angle(rad) 回転させる関数 回転公式 (x, y) を angle(rad) 回転 → (x', y') x' = cos(angle)*x + sin(angle)*y y' = -sin(angle)*x + cos(angle)*y 関数名や引数は自由。 どれかひとつでも結構ですので、覚えある方はお願いします。
>>256 complex.hをよく眺めて見ると良いよ
>>256 簡単すぎて書く気にならん。
1~7、全て自分じゃできないのか?
C++でのクラス設計のいい見本のような例だな。 敢えて細かいが指摘しておく。 そのtypedefは文法的な間違いと、typoを含んでる。 もっと注意するように。
Cではstruct タグの名前空間とtypedefの名前空間は分かれているので struct タグにアンダスコアで始まる名前をつける必要はない。 typedef struct Vector { ...... } Vector; でだいじょうぶ。 こうすると、だめな処理系ってある?
>>261 無名にするとデバッガ上で使えなくならない?
263 :
デフォルトの名無しさん :03/09/15 16:02
>>256 ベクトルの構造体の関数っていうかベクトル計算がわかってるかどうかの問題じゃないか
検索などで調べてどうしてもわからないようでしたら数学板へどうぞ
264 :
デフォルトの名無しさん :03/09/15 17:15
int型変数を16進数に変換する際、 奇数桁ならあたまに0を偶数桁の場合はそのまま char型配列に格納したいのですがいい方法ありませんか?
>>264 sprintfしてstrlenで条件分岐して0つけるとかじゃだめ?
解決しました。
>>247 >>248 ありがとうございます。
ドキュメントを見てもよく分からなかったので助かりました。
基本から本などで勉強する必要もあるようです。
268 :
treuiy :03/09/16 04:20
d
264のは if (sprintf(buffer, "%x", number) & 1) sprintf(buffer, "0%x", number); これが一番簡単?もっといいコードある?
軽いコードは書けるけど、見た目簡単なのはそれじゃない?
誰か264につっこめよ。16進数に変換って・・・
272 :
デフォルトの名無しさん :03/09/17 19:29
最近VC++勉強で使い始めたんですが、 VC++を使うことはは要するにMFCを使うってことなんですか
273 :
デフォルトの名無しさん :03/09/17 19:35
>>272 MFCを使わなくてもできる。
でもVC使うってことはMFC使うからって言い方もできる。
やりたいようにやればいい
274 :
デフォルトの名無しさん :03/09/18 00:02
VC++6.0 on win2kSP4です。 何日もかかるようなsimulationを実行しているとき、 まだ計算が終了していないのに 途中でCPUパワーが突然0程度まで落ちることがあります。 結果出力画面(黒いやつ)上でenterキーを押せば 復帰して計算を続けてくれるようです。 なぜこうした現象が起きるのでしょうか?
>>274 キー入力待ちが適宜挟まっているんじゃないのか?
276 :
デフォルトの名無しさん :03/09/18 00:52
MFCが使われているかどうかって、普通どうやって判定するの。 #ifdef xxx class A : public CDocument // MFCあり #else class A #endif のようなことがしたい
いや、そんなことはないです
>>274 何かの拍子でメッセージが発行されなくなったとか
>>278 えーと、その「なんかの拍子」ってのが何かを知りたいんです。
コンソールに出力するのやめてみるとか。
>>280 しかし、何日もかかるようなsimulationは途中結果を
出力してくれないと不安じゃないですか?
for文を何回やったとか。
>>281 頻度をさげてみるとか。
理論的なモノはないけど、経験則でそう思っただけだが。
ありがとうございます。頻度ですか。 それほど高くないと思いますが、 これから気をつけてみます。
>>279 分岐の中でメッセージ発行し忘れて・・・要するにケアレスミスじゃないかと思ったわけです
OnIdleとか使う人がたまにやっちゃってる奴ですね
285 :
デフォルトの名無しさん :03/09/18 01:38
質問です。 仮想関数を持たないクラスのデータサイズは、 sizeof() で得るられる値と必ず同じになることは、 保障されているのでしょうか? もしそれができるのであれば、 char* p_work = new char[ 1000 ]; のようにメモリを 確保しておいて Hoge* p_hoge = (Hoge*)p_work; キャストしても使用しても問題は、ないでしょうか?
286 :
デフォルトの名無しさん :03/09/18 02:09
>286 >inet.libとかつーのもプロジェクトに追加したし… 追加の仕方が違うかと。inet.libは直接置かない。 >「プロジェクト」-「プロジェクトに追加」で Inet.lib を追加します この通りに、追加しましょう。
>>285 仮想関数うんぬんに関わらずsizeofはいつも正しいはず。
>char* p_work = new char[ 1000 ];
>のようにメモリを 確保しておいて
>Hoge* p_hoge = (Hoge*)p_work;
メモリープールを調べて。
>>287 あ、ありがとうございます。ソース見ていただいたんですね。
でも実はinet.libおっしゃる通り「プロジェクト」-「プロジェクトに追加」で追加したんですよ。
でも上手くいかなかったのでもう一回やり直して、一応フォルダの直下にも置き直してから、
再度「プロジェクト」-「プロジェクトに追加」で追加したんです。
だから、「プロジェクト」-「プロジェクトから削除」を選ぶとちゃんとパネル上にinet.libが追加されている
のが確認できると思います。
うーん、なんでなんだろう…。
290 :
デフォルトの名無しさん :03/09/18 04:32
質問です。 可変文字列を使いたい場合は、 どのようにして宣言しているのでしょうか?
>>290 C++ならstd::string hoge_str;で事足りる。
Cならchar* moge_str;で頑張る。
>>289 inet.libじゃなくて、Wininet.dllじゃないのか?
DLLリンクしてどーすんねん
てか、Wininet.libじゃないのか? の間違いか??
ざわ・・ざわ・・・
>>294 ありがとうございました。大正解でwininet.libにリンクすると直りましたです。
なーんだ。BCBの特別使用かと思ってた。 >286知ったかぶりしてすまん。
C言語で出力するフォントのタイプ(MSゴシックとか明朝など)を指定する関数があったら どなたか教えて頂けませんか? 講師に聞いたら「コンソールでやるの?ワカンネーヤ」って言われちゃったよ_| ̄| ...○ XP、VisualC++6.0です
コンソールでやるの? ワカンネーヤ
うちのWin2000の場合、コマンドプロンプトのプロパティから選べるフォントは二種類しかないんだけど、明朝とかも使えるのか?
301 :
デフォルトの名無しさん :03/09/18 12:05
C言語はじめたいのですが、良い書物や参考書とコンパイラーものもの一式ってなんですか? とりあえず、CYGWINでCを動かしてます
>>301 シグウィン使うぐらいならそのうち欲が出るから
おとなしくVC++.net買え。
キーボードから打ち込んだ文字をASCII基準の8進法や16進法表記に変えるプログラム(以下に貼付)に 数字が打ち込まれたときに8ビットのバイナリ表示が出来るようにしたいのですが、 文字として入力された数字を上手く認識してくれません。 いい方法は無いでしょうか。 ご教授願います。 #include <stdio.h> main(){ charascii; inti; for( i = 1; i<=5; i++ ){ printf("press any key you want: "); scanf(" %c", &ascii); printf(" character (integer, octal , hexidecimal)\n"); printf(" ------------------------------------------\n"); printf(" %c ( %d , %o , %x )\n\n", ascii, ascii, ascii, ascii); } }
#include <stdio.h> main(){ 見難くなったので再投稿します。 asciiに文字として取り込まれる数字を、int で扱えるようにしたいのです。 バイナリにする関数はすでに作ってあります。引数はintです。 よろしくお願いします。 char ascii; int i; for( i = 1; i<=5; i++ ){ printf("press any key you want: "); scanf(" %c", &ascii); printf(" character (integer, octal , hexidecimal)\n"); printf(" ------------------------------------------\n"); printf(" %c ( %d , %o , %x )\n\n", ascii, ascii, ascii, ascii); } }
>>274 スクリーンセーバーが動作してるとかじゃないよね?
激しく勘違い
>>304 なんか欲しいと思っているのとと違う感じだが一応うp。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
int main(void)
{
char str[BUFSIZ];
int num=0,i,l,ok;
fgets(str,sizeof(str),stdin);
for(i=0,l=strlen(str)-1,ok=1;i<l;i++)
if(isdigit(str[i]))
num+=(str[i]-'0')*(int)pow((int)10,(int)(l-i-1));
else
ok=0;
if(l==0) ok=0;
if(ok)
printf("%d\n",num);
else
printf("入力エラー\n");
return 0;
}
>>307 真ん中辺りのタブが高くなってしまった。
VC2003 を使っています。 yoko_test.dll の関数を使いたくて、LIBファイルと、 以下のようなヘッダーとソースを用意しました。 そして、 cl hoge.c /link yoko_test.lib でコンパイルに成功し、希望通りの動作を確認しました。 hoge.c を hoge.cpp に変えて同じ方法でコンパイルしようとすると hoge.obj : error LNK2019: 未解決の外部シンボル "char * __cdecl yoko_test(char *)(?yoko_test@@YAPADPAD@Z) が関数 _main で参照されました。 というメッセージがでてコンパイルができません。 C++ で C のソースはコンパイルできると思っていたのですが、違うのでしょうか… なにか見落としていると思うのですが… よろしくお願いします。 ****** hoge.h: __declspec( dllexport ) char* yoko_test(char* str); hoge.c: #include <stdio.h> #include "hoge.h" int main( int argc, char** argv ) { printf( "%s", yoko_test(argv[1])); }
extern "C"
環境を書き忘れました。ごめんなさい。 WindowsXPを使っています。 よろしくお願いします。
ありがとうございます! extern "C" __declspec( dllexport ) char* yoko_test(char* str); で解決しました。 お礼です-> チュパ♪(フェラの音)
_beginthreadでいぱーい作った複数のスレッドから ほとんど同時に他の関数(グローバルな?)呼んだらどうなるんですか。 処理中に、他スレッドから呼ばれたら処理中断されると思うんですが・・・ 間違ってます? で、中断されるならCreateMutexはどこに書けば良いんですか。 呼ばれる関数の中で良いんですか? よろしくです・・・ vc++6 winxp. mfcツカイマセン
>>313 別に同じ関数を同時に呼んだところで何も問題はない。
その関数が静的な変数や共通のメモリ領域を参照していたりすれば別だが。
>>314 なるほど、ありがとうございます
えーと、共通のメモリ領域ってのは、
グローバル変数、メンバ変数を使うのはNG?
>>307 レス、ありがとうございます。
早速試してみます。
よろしければ、解説をしてくださるとありがたいのですが。
>>313 Mutex置いても確認してから次の行に行くまでに死ねる。
クラス毎にCCriticalSectionを置いたりして危ないことをやるのは一つにする。
ちなみに、数十個もスレッド作って一気に一箇所に殺到させたら無茶苦茶遅くなる。
ネットワークが絡むと秒単位になったり。泣けるのでやたらとスレッド増やすのはやめたほうがいい。
318 :
デフォルトの名無しさん :03/09/18 22:16
enum の名前のつけ方どんなのにしてますか? "m_" とかつけちゃいますか? m_Play とか。 むしろ "e" ですか?ePlay とか。 もっと定数っぽくしますか? enum { STATE_PLAY, STATE_PAUSE, STATE_STOP, } とか。
g++は信頼して使って問題ないですか?
>319 おれは、Borland C++ よりはg++の方を信用している。
>320 回答ありがとう。 Borland C++がどの程度かはちょっと未経験(^^; >319の質問はg++のバージョン違うとまともに作ったプログラムでも core吐いて落ちたりすので最近疑ってるからです・・
>>317 なんか分かってきたかもしれない。
スレッドはミューテクスじゃなくてクリティカルセクションですね・・・。
どうもですー。
>>318 namespace STATE{
enum{
PLAY,PAUSE,STOP,
};
}
今の流行
つーか、リンクしてるライブラリをコンパイルしたgccとバージョン違ったりしてねぇか。 バージョン違うとABI変更されてたりするぞ。
>>316 0,numは数値用、iはカウンタ、lは文字列の長さ、strは文字列用の配列、
okは1の時に文字を表示する。
1,fgetsで配列に文字列を入力。
2,for文で繰り返す。strlenは文字列の長さを調べるもの。fgetsだとなぜか
1大きくなるので-1する。
3,isdigitで数字か調べる。
4,3が真ならnumにiがさしている数字に桁の分をかけて加算する。
powは累乗を計算するもので、10の桁の位置条をしてそれを求める。
3が偽ならokを0にして表示をしないようにする。
5,3,4を繰り返す。
6,文字列の長さが0の時はokを0にする。
7,okが1の時は数値を表示して、0ならエラーメッセージを表示。
後、めんどくさい時はatoi関数を使ってもできる。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int num=atoi("12345");
printf("%d\n",num);
return 0;
}
>>326 へ追加
めんどくさい時2
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int num;
sscanf("12345","%d",&num);
printf("%d\n",num);
return 0;
}
>>303 風の場合
#include <stdio.h>
#include <ctype.h>
#include <math.h>
int main(void)
{
char ascii;
int i,num=0;
for(i=0;i<5;i++)
{
printf("press any key you want: ");
scanf(" %c", &ascii);
if(isdigit(ascii)==0) break;
num+=(ascii-'0')*(int)pow((int)10,(int)(4-i));
printf(" character (integer, octal , hexidecimal)\n");
printf(" ------------------------------------------\n");
printf(" %c ( %d , %o , %x )\n\n", ascii, num, num, num);
}
return 0;
}
連続すんまそん。
>>303 私は勘違いしていたかも。数列ではなくて1桁の数字で見るなら、
書いたのと質問ので趣旨が違ってしまう。書いたのを直すなら、
%d,%o,%xの引数のasciiの所をascii-'0'とすれば良い。
数字の'0'と数値の0は違うから。
>>326 実行してみたんですが、エラーが出てしまいます。
環境の問題なんでしょうか?
ANCI C基準です。
Undefined first referenced
symbol in file
pow /var/tmp/ccfD1nJe.o
ld: fatal: Symbol referencing errors. No output written to a.out
collect2: ld returned 1 exit status
すみません。いろいろご指導してくださってたんですね。 新着レスを確認せずに投稿してしまいました。 念のため、バイナリにするプログラムも載せておきます。 303のmainから文字として取り込んだ数字をバイナリに変換し、 数字以外ならば、バイナリ変換をスルーし、、 ASCII基準に従った8進法や16進法の数字が表示されるようにするのが最終目的です。 お手数をおかけしてますが、お力をお貸しください。 #include<stdio.h> #include"mydef.h" int to_binary(int integer){ int remainder[8]; int quotient; int i; for( i = 0; i <= 7; i++ ){ remainder[i] = integer % 2; quotient = integer / 2; integer = quotient; } for( i = 0; i <= 7; i++ ){ printf("%i", remainder[7-i]); } printf("\n"); return TRUE; }
>>331 意味が分からん。
一度作った2進数数列を使ってそれから8,16進数に変換すると言う事?
>>332 >
>>331 > 意味が分からん。
> 一度作った2進数数列を使ってそれから8,16進数に変換すると言う事?
すみません、日本語が変でした。
自分でも混乱してきたので、友達に課題を確認して、問題点を整理して再投稿します。
本当にすみません。
Win2k + bcc32 な環境なんですが カレント・フォルダーからファイル名を取得するにはどうすればイイんでしょう? 解からないので、現在は FILE *list; char name[256]; system("dir *.bin /b|sort > list.txt"); if((list=fopen("list.txt","r"))==NULL){ printf("list.txtを開けませんでした。\n"); return 1; } while((fgets(name,256,list))!=NULL){ ってな感じで、DIRコマンドにlistを吐き出させて、それを読み込んでるんですが これをdosコマンドに頼らず、cの関数のみで処理する事可能ですか?
WindowsAPIを使わないとどうにもならない様な気もするが…
俺が知ってるのは FindFirstFileとFindNextFileでのるーぶでぐりぐりだけど explorerってどうなってんだろ?
普通popen()
bcc32ならopendir()、readdir()、closedir()が使えるぞー。 まあその中身はFindFirstFileやFindNextFileを呼んでるんだろうが。
339 :
デフォルトの名無しさん :03/09/23 15:07
enum ALIGN{LEFT, CENTER, RIGHT}; enum DIR{UP, DOWN, LEFT, RIGHT}; このように、2つの列挙型に同じ名前の列挙子を宣言したいのですが、 当然ながら「宣言が複数見つかった」というエラーがでてしまいます 何か良い方法はないですか?
>>340 namespaceで区切るってのはダメ?
namespaceを使うと代入するときに、 ALIGN a = ALIGN::LEFT; とかなりますよね? できれば、ALIGN::の部分を省略したいです。 ALIGNのLEFTの値とDIRのLEFTの値は同じでいいので、 const LEFT = 0; const RIGHT = 1; enum ALIGN{LEFT, RIGHT, CENTER}; enum DIR{LEFT, RIGHT, UP, DOWN}; このような事ができると嬉しいのですが、 こんな都合のいいことは無理ですかね?
無理
すみません 342の2行目、列挙型の名前とnamespaceの名前がごっちゃになってて、おかしいですね。 namespace A{ enum ALIGN{LEFT, CENTER, RIGHT}; } A::ALIGN n = A::LEFT; まだおかしいところがあるかもしれませんが、訂正します
>>343 無理ですか・・・
どうもありがとうございました
347 :
デフォルトの名無しさん :03/09/25 22:10
#include <stdio.h> #include <string.h> char *reverse(char a[]){ char buf[80]; int i,n; n = strlen(a); for (i=0;i<n;i++) buf[i] = a[n-1-i]; buf[n] = '\0'; return(buf); } void main(void){ char str[80]; printf("name ?"); scanf("%s",str); printf("%s \n",reverse(str)); } 入力した字を逆から表示するプログラムなんだけど、このままだったら表示されない。 Char buf[80]; のところを Static Char buf[80]; にしないとダメなんだけど、どうしてだか分かりますか? ANSI C だったらstatic付けなくてもいいはずなんだけど・・・。 それともVC++6.0はANSIに対応してないのか?
>>347 reverse() 関数から戻った段階で、buf[80] の寿命が尽きてる。
>ANSI C だったらstatic付けなくてもいいはずなんだけど・・・。 どこからそんなすばらしい最新情報を?
>>347 VC6.0はちゃんと買ったやつじゃないとANSI準拠にならないんですよ。
352 :
デフォルトの名無しさん :03/09/26 18:06
>>9-10 のようなテンプレートクラスの時には、
なぜ、
>>11 のようにメンバ関数もヘッダとして
読み込まなければエラーになってしまうんですか?
簡単に言えば、テンプレートから実際のコードを生み出すのは コンパイラにしかできないから(一般にリンカには無理)
>>352 exportをサポートした処理系が皆無だから。
うむぅ。
じゃあ、
>>11 のようにするか、
テンプレートクラスのメンバ関数はクラス宣言と一緒に書いてしまうかのどちらかですね。
ありがとうございました。
356 :
デフォルトの名無しさん :03/09/26 19:34
C++で作成されたDLLの関数をC言語側からコールするコードを書くと リンクの際にLNK2001エラーが発生し、リンクできません。 呼ぶ側で__declspec( dllimport )使ったり、いろいろ試したんですが解決しませんでした。 そもそもC++で書かれたDLLで、C言語から呼ばれることを考慮してない(VB用のDLL)らしい のですが、これはもうDLL側に手を加えないとだめですか? 一応DLL側のソースは手に入れたのですが…。
357 :
デフォルトの名無しさん :03/09/26 21:00
>>348 >reverse() 関数から戻った段階で、buf[80] の寿命が尽きてる。
言われてみれば納得・・・しそうなんだけど、終わる前にちゃんと
return (buf)
ってしてるだろう?
これじゃダメなの?
>そもそも設計が間違い
どういう風にやったらいいのか分かる?
>>357 なんでオマエはそんなエラソーやねん
>ANSI C だったらstatic付けなくてもいいはずなんだけど・・・。
>それともVC++6.0はANSIに対応してないのか?
それと、このステキな知識はドコで得たんだ?
return buf;で戻るのは、&buf[0]と等価なポインタ。配列を返しているわけではない。 そして戻ってきたポインタの指しているbufの寿命は尽きている。よってダメ。 対処としては、 ・outbufを引数でもらう。 strcpyとか、snpritnfとかみたいに。 ・mallocしたアドレスを返す。 strdupみたいに。 ・struct {char buf[80]; } を返す。 ・bufはstaticにしとく。 ・Cは止めてC++のstd::stringを使う などが挙げられる。
360 :
デフォルトの名無しさん :03/09/26 21:27
char を参照渡しにして値を入れてもらった。 char* じゃなくて char ね。 あー、そんした。
>360=347 ? おいおい! その考えもおかしい。
362 :
デフォルトの名無しさん :03/09/26 23:00
>>358 お前にお前って言われたくねーっつーの。
配列の初期化を宣言時にしようと思ったら、ANSIじゃないとstaticが要るって書いてあったぞ。
>>359 なるほろ。さんきゅ。
引数にしないと値渡し出来ない訳ね。
Cは値渡しがデフォルトなんだからそこも値渡しにしろっつーの。
360は俺じゃないよ。
>>362 > 配列の初期化を宣言時にしようと思ったら、ANSIじゃないとstaticが要るって書いてあったぞ。
おまえのコードは、そういう問題じゃないだろう……。ANSI C 規格に従った処理系だと
>>347 の実行結果は未定義だ。
鼻から悪魔が出てきてもおかしくない。
初心者は歓迎だけど厨房は勘弁だね。
よろしければ配列とポインタについて勉強し直して頂けませんでしょうか?
>>362 様
367 :
デフォルトの名無しさん :03/09/26 23:27
学生かなぁ(それにしても成績は良くないだろw)。 これで本職といわれたら笑うしかないが。
369 :
デフォルトの名無しさん :03/09/27 00:02
クラスを独学で勉強しているんですが それ系の本とかを買って一応クラスの概要的なことは理解できたんですが どう利用するのかという実践的なことまで理解できているのかということについては まだ自信がありません。こういう自分に何かクラスなどに関するお勧めの参考書 などはありませんか?なにか課題とそれに対する答えなどがたくさん載せてある形式の 本だったりすると勉強しやすいのですがそんなのってありますか?
>>369 だったら本ばっかり読んでないで実際になんか作ってみ。
試験勉強じゃないんだから参考書の問題ばっか解いてみたってしゃあないぞ。
>>370 そんなこといわれてもなにを作ろうとしてもプログラムがぐちゃぐちゃになっちゃって
ものすごくお粗末なものしかつくれないんですけど・・・
これじゃあ暮らすなんて使ってる意味がないじゃんっておもっちゃいます。
文系の学校なんでプログラムに詳しい先生なんかいないし
自分の友達にもプログラムに詳しい人なんていないし
やっぱり本に頼るしかないんですよ。大変なんですよ。
どうにかしてください。
>>371 やめろよ、プログラムなんて。
別に無理してマスターしなくてもいいだろ。
こんなことで逆切れされてもねぇ・・・(w
千羽鶴を燃やしたり衝動的に人を殺したりするような奴にならないでくれよ。
>>371 お粗末だっていいだろ。自分の頭で作ったほうが理解の助けにはなる。
というかまずなんでプログラムやるわけ?
理解するために理解したってしょうがないのに。
>>371 だからさ、参考書読んで練習問題解いてるだけだと、そこから一歩も先に進めないよ。
だいたい初心者が最初から洗練されたプログラムなんて書けるわけがない。
ぐちゃぐちゃのスパゲッティプログラムでいいから、とりあえず曲がりなりにも
「動くプログラム」を書いてごらん。
その試行錯誤が理解を深める足がかりになるんだから。
あと君は「クラスなど」と言っているが、これはC++という言語のことを
言っているのか、オブジェクト指向という開発手法について言っているのか、
VC++やBCBといった開発環境について言っているのかよく分からない。
ひょっとしたら自分自身でもこの辺の理解が未分化なのじゃないか?
その辺が余計に混乱する原因かもしれん。
>>372 逆切れした覚えはないのですが
そういう風にかんじたらごめんなさい
>>373 確かにそうですね
自分なりにいろいろ作っていって
慣れるしかないですね
何か参考書を読みながらのほうが成長早いかと思ったんですが
プログラマーの道に近道はないってことですね
>>374 自分はVC++を使ってるんですが
クラスであればVC++もBCBも一緒かと思っていたんですが
やっぱり違うもんなんですか。勉強不足でしたすいません。
376 :
デフォルトの名無しさん :03/09/28 03:20
C++のstd::stringから数値を取り出すにはどうしたらいいですか?string str("1 320\r\n");てな感じで文字列があって(実際にはPOP3サーバの応答でつ)、1と320をそれぞれ順番に数値として取り出したいんです。
377 :
デフォルトの名無しさん :03/09/28 03:27
WinXP,C++です。 aは1000未満の自然数、bは10未満の自然数とする。 a.b=b/aを満たすa,bの組み合わせを見つけるプログラムを組め。 という問題なのですが、上手く作れません。添削おねがいします。 #include<stdio.h> main(){ int a; int b; b=1; for(a=1; a<1000; a++){ if(a+(b/10) == b/a){ printf("a=%d b=%d\n",a,b); for(b=1; b<11; b++){ if(a+(b/10) == b/a){ printf("a=%d b=%d\n",a,b); } } } } exit(0); }
あ、ミスです。 for(b=1; b<11; b++){ ↓ for(b=1; b<10; b++){ ちなみに、上のものをコンパイル、実行すると a=1 b=1 a=1 b=1 と表示されまつ・゚・(ノД`)・゚・
とりあえず比較する時の型をdoubleにして、== もなんとかしろ。
>>376 std::stringstream
boost::lexical_cast<>
std::ssanf()
自分で関数を作る。
お好きなように。
>377 問題は其れでいいのか? a.b = b/a。 a<1000, b<10 右辺は、Max 9/1。すると左辺も9を超えられないから a<10になってしまい、結局81通り調べればFA?
>>380 ありがとうございます!
string str("1 320\r\n");
std::sscanf(str.c_str(), "%d %d", &id, &bytes);
でやりたいことができました。
>>377 >>379 はdoubleを使えといっていますがdoubleを使ってはだめです。
両辺に10をかけることで小数を出さずに計算できます。
>383 1/3を0.3として扱うことになるわけで、 無限小数を途中で打ち切るのは良くない気がする。
>>381 数学的に考えるとプログラムなんぞ組まんと答えが出てしまうので、
ここは商と余りを使えってのが問題の趣旨かも?
bは1桁の自然数なので問題の条件は
a=b/a かつ 10b%a=ab
あ、実際のコードはdiv使ってね。
ん、doubleは丸め誤差が面倒じゃ?
↑ 10(b%a)=ab ですた(´・ω・`) あと名前は気にしないでくらさい。 つか酔っぱらってんで見当外れなこと書いてたらゴメン。
387 :
デフォルトの名無しさん :03/09/28 06:08
VC6.0を使ってA,Bというファイルを結合(パック)して新たに Cというファイルを作成したいのですが、どのようにパック部分を 作成したらいいですかねぇ?(´Д`;)
>>387 それ、何がしたいのかわからないから。
質問したいなら具体的に説明しないとね。
>>387 ①AとBファイル内容をバッファに保存。
②AバッファをCファイルに保存
③BバッファをCファイルに追加で保存。
以上
>>387 ①AとBファイル内容を連続したバッファに読み込み。
②Cファイルにバッファを書き込み。
以上
templateを初めて使ってみたのですが、壁にぶち当たってしまったので 一つご教授願います。 << main.cpp >> #include <stdio.h> #include "func.h" void main(){ int i = 0; Func( i ); } << func.h >> #include <stdio.h> template <class T> void Func( T ); << func.cpp >> #include "func.h" template <class T> void Func( T t ){ } こんな感じのテストプログラムを組んでみたのですが、 main.obj : error LNK2001: 外部シンボル ""void __cdecl Func(int)" (?Func@@YAXH@Z)" は未解決です とVC6に怒られます。通常の関数なら問題ないのに、templateを使うとダメな理由が分かりません。 どうすれば良いのでしょうか?
template <class T> void Func( T t ){ } をヘッダに書けばOK
>>391 templateはコンパイル時に全て解決されるから
実装もコンパイラに見えなきゃいけない。(リンカは関与しない)
よって全部func.hに書くか、main.cppで#include "func.cpp"をする。
なるほど、そう言うわけでしたか。 勉強になりました、ありがとうございます。
395 :
デフォルトの名無しさん :03/09/28 23:42
すいません、C++ってプログラマの間では普通なんて呼ばれてるんですか? しーぷらすぷらす?
俺のまわりでの会話においては、「しーぷらぷら」をよくきく。
「あれ」
質問とはややズレるが、某のBCBXのデモ(英語)では かなりスピーディーに"C plus plus"って言ってたね。 真似しようとしたけど舌がうまく回らなかった。
しーぷりゅぷりゅー
すぃーぷらっぷらっ
しーぷにぷにっ
最終回のしーぽん、かわーいいー。
VC6ですけが deleteとdelete[]との差がよくわかりませぬ。 配列でnewしたポインタでもそうじゃなくても deleteで正常に動いているようですが、 中ではやっぱり違うんでしょうか?
実装依存です
405 :
デフォルトの名無しさん :03/09/29 23:02
C言語を始めて丁度一月経つ者です。 今ポインタの勉強をしていまして、壁に当たってしまったのでご教授願います。 標準入力からテキストファイルを読み込み、 行を辞書順に並べ直して標準出力に出力する、というプログラムを組みたいのですが、 テキストを読みこんで表示させるところまでは何とか自分なりにかけたと思うのですが、 その後の行を辞書順に並べなおして標準出力~ がどうしても書けません。 どうかよろしくお願いします。
>>403 違う。
VC++ではdeleteでも確保したメモリだけは開放されるが、
デストラクタは最初の1つしか呼ばれない。
int等の組み込み型では目に見えた問題はないがクラスだと悲惨な目にあう。
>>405 表示できると言うことは、標準出力に出力するのもOKだよね。
ってことは後はソートか。
qsort()のサンプルを探すのが一番手っ取り早いかな。
環境が判らんので何ともいえんが、qsort()のサンプルぐらいヘルプにないか? あればそれを真似して書いてみたらよい。途中で分からないところが出たらまた質問したらいい。 それとも、ライブラリを使わずソートアルゴリズムを書いてみたいというのか? 自分だったら、即std::vector<string>に突っ込んでsort()だけど(w
>>408 つーかstd::set<std::string>で一発。
いやC++じゃなくてあくまでCだろ、
>>405 がやってるのは。
>>407 >>408 >>409 >>410 早速のお返事どうもありがとうございました。
とりあえず、ヘルプを見ながらなんとか作ったのが、
void main(void)
{
FILE *fp;
int c;
if ((fp = fopen( "abc.txt", "r")) == NULL) {
fprintf(stderr, "ファイルを開けません\n");
exit(2);
}
while ((c = fgetc(fp)) != EOF){
fputc(c, stdout);
}sort
fclose(fp);
}
とりあえず、ここまでで何とかファイルから読みこんで表示するところまではできました。
後はソートだと思うのですが、
>>407 さんのおっしゃる通りqsort()をヘルプで見てみたのですが、
正直勉強不足で理解できませんでした。
もしよろしかったら、こう書いたら上手くいく、みたいなものを簡単でよいので、
示して頂けませんでしょうか?どうぞよろしくお願いします。
あと、書き忘れました。開発はVC++6.0で作っています。それでは失礼します。
>>405 あー、ソートに取り掛かる前に1行ずつ取り扱う仕掛けを作る必要があるね。
ってことで、今後の課題はこんな感じで。
・1行単位で読み込む
・メモリを確保して、そこに読み込むようにする
・行単位でなんらかの加工をして出力する(行番号付加でもいい)
・ソートの仕掛けを作る
414 :
デフォルトの名無しさん :03/10/01 03:11
すいません、憶えはじめでとりあえず色々なtips試してみようと思って
これを貼っつけてみたんですが
http://www.yukibow.com/bcb/B0036.html [C++ エラー] E2451 未定義のシンボル OpenDialog1
になってしまいます。(BCB6)
なんかincludeしなきゃ駄目なんでしょうか?よくわかりません…
よろしくお願いします。
>>414 フォーム上にTOpeDialogを一個ポトリペタリすればデフォルトの名前がOpenDialog1だ。
これに限らず、当然必要なコンポーネントはソース見て見当つけるんだよ。
ここのtipsは判りやすくて重宝するけど、さすがにそんなところまで書いてくれてないから。
416 :
デフォルトの名無しさん :03/10/01 07:06
構造体とかはnew演算子でメモリーの領域を確保したあとdeleteで開放したりするけど 変数をつくったりしたときってわざわざメモリーを解放したりしないのは何でなの? 変数と構造体ってなにが違うの?
>>416 newで確保したものはdeleteする必要がある。これは構造体だろうが組込み型の変数だろうが関係ない。
逆に構造体であってもnewを使わず変数として宣言したときはdeleteなんかしない。
おおざっぱに言うと、変数にはスコープがあってそこを抜けたときに自動的にメモリは開放されるが、
new(Cならmalloc)で確保した領域は明示的に開放しない限り、いつまでも残りつづけるから。
418 :
デフォルトの名無しさん :03/10/01 07:38
>>417 スコープっていうのがよくわからないけど
つまり自動的に変数などに使われたメモリ内の領域を開放してくれるシステムがコンパイラの中に
備わってるってこと?だとしたら自動的にnewで宣言した変数や構造体も開放してくれないのは
なぜ?
>>418 newは自動的に開放されたくないときに使用するものである。
420 :
デフォルトの名無しさん :03/10/01 07:58
anyFunction() { // varの宣言と初期化 type var(); // ptrの宣言とnew によるスペースの確保と初期化 type * ptr = new type(); // *ptr と varは同じように使える // newで確保した領域はdeleteしないといけない delete ptr; } // (ptrと)varはここでスコープから抜けるので自動的に解放される
>>420 staticを使うかどうかとは別の問題。
>>418 スコープについては参考書を読んで自分で勉強してくれ。
newは「明示的に破棄するまでは存在し続けるオブジェクト」を作るための手段と考えよ。
なお、
Hoge* hoge = new Hoge();
ここでHogeがクラスだろうが構造体だろうが組込型だろうが、newが確保した領域はdeleteするまで
存在する。しかし、変数hogeにはスコープがある。deleteする前にスコープ抜けちゃうともやはdelete
できなくなるんで要注意。
newはポインタを返すのであって、hogeはnewが作成したオブジェクトそのものではない。
あー、こんなこと言うと余計混乱するか(w
↑おもいっきりかぶりやした。
なんとなくよくわかったけど これってメモリー容量を意識してる人にとっては重要な要素かもしれないけど 初心者の自分にとってはプログラムをつくるときメモリー容量なんて 意識しないからどんな時でも終了するときにまとめて 全部のメモリー空間を開放すればいいっておもっちゃうから わずらわしいんだよね
>>413 お返事どうもありがとうございます。
qsort()については本で調べたところなんとなくではありますが、理解できました。
int mycompare( const void *s1 , const void *s2 )
{
const char a1 = *((char*)s1);
const char a2 = *((char*)s2);
if( a1 < a2 ){
return -1;
} else if( a1 == a2 ){
return 0;
} else {
return 1;
}
}
int main()
{
char Alpha[] = "abjkjsasjhk";
qsort( Alpha , sizeof(Alpha)-1 , sizeof( Alpha[0] ) , mycompare );
return(0);
}
一応これでソートはできましたが、標準入力からテキストファイルを読み込み、
行を辞書順に並べ直して標準出力に出力するには正直どうすればよいのかちょっと
手詰まりになってしまいました、、。改行の判定は'\n'かなあ等、いろいろ試しては見たのですが
上手く行きません、。よろしくお願いします。
それは文字列のソートじゃなく、文字のソートじゃん。 文字列ソートはこう! char *string_array[]={ "ddddd", "ccc", "bbbbb", "aaaa" }; qsort(string_array, sizeof(string_array), *string_array, strcmp); 改行が'\n'決め打ちでいいなら、ファイル全部読み込んで、'\n'を'\0'に置換すりゃいい。 *ptr='\0'; next_line=ptr+1; 最後の扱いには気をつけろよ。
429 :
デフォルトの名無しさん :03/10/01 12:13
#include <iostream.h> void main() { char name[41]; cout<<"こんにちは。私はコンピュータです。"<<endl; cout<<"あなたの名前を入力してください。"<<endl; cin>>name; cout<<name<<"さん。よろしく。"<<endl; }
429ですが上のプログラムで入力した値をサーバーにHTTPを使って送信するには どうしたらいいですか?
>>430 環境依存。
socket使うなら大概の環境で通るだろうが、初心者にとってはかなり面倒臭い。
431さんありがとう参考になるページとかあったら教えてください
433 :
デフォルトの名無しさん :03/10/01 12:49
HTTPを使って送信・・・? リクエストのどこに429を含めるの?
そうか、POSTとして送るのか。 なら空行の後だな
>>415 ありがとうございます。
右の方にスクロールしていったら、dialogタブを発見しました。
すみません、めちゃアホな質問かもしれませんが、、、 ポインタ変数の宣言で、 int *p; と int* p; って、何か本質的な違いがあるんでしょうか?
気合の入り具合が違う
>>436 失礼な、私の愛用する
int * p;
が抜けているじゃないか。
要はどう書いても同じってこと。
>>441 ファイルを全部読み込んで、改行コードをナルに換えて、行頭をポインタ配列に入れて、
それをソートすればいいんでない?
strcmpをint(*)(const void *,const void *)にキャストしないと警告が出るな。
444 :
デフォルトの名無しさん :03/10/02 14:08
質問です。 あるテンプレートクラスにたいして、その子クラスを作るとしたら、 子クラスも親に合わせたテンプレートクラスでなければならないのでしょうか。 たとえば、配列のテンプレートクラスに対して、 子クラスとして文字型データのみを扱うスタッククラスを作るみたいな。 可能だとしたら、子クラスのクラス宣言はどのような構文になるのでしょうか。
文章がかなり変なので書き直します。 配列のテンプレートクラスに対して、その子クラスとして、文字型データを扱うテンプレートではないスタッククラスを作りたいんですけど、可能でしょうか。 可能だとしたら、子クラスのクラス宣言はどのような構文になるのでしょうか。
>>443 ちゃんとCでコンパイルしてるならキャスト不要のはずだが?
CとC++の違いで、作るものによってCで十分場合と C++のがいい場合があるのは分ったのですが、 その例としてゲームを作るとするなら NetHackのようにコンソールで動かすならCでことたりるけど もっとグラフィカルにするならC++やjavaなど。 って感じで合ってますでしょうか?
全然合ってません。
>>445 STLにはスタックも用意されているが、それは使わない約束か?
配列をプライベートで継承して、スタックとしての操作を公開したらいい。
class my_stack : private std::vector<std::string> {
public:
std::string Pop();
void Push(std::string);
};
みたいな感じ。
そうですか。 それならCがどういったソフトウェア開発に向いている/いない と、同じくC++の場合の向き不向きも教えていただけないでしょうか?
C++が使えるのならC使うよりはC++をベターCとして使ったほうがいい。
Cしか使えない環境(移植性等も含む)以外ではC++を使った方がいいです。 C++はC言語のようにも使えるし、Cよりも安全なコンテナや文字列クラスが用意されてるので。
C++もCも別に使えるわけではないんですが、 最近Linuxをいじり初めてgccというコンパイラがあったので CかC++の向き不向きで自分に合った方を 選択して覚えてみようと思ったのですが 何かとCよりC++のがおすすめって感じですね。 ありがとうございました。
>>449 なるほど、最後に<型>をつけるんですか。
理解です。ありがとう。
>STL
今はまだ、全部一から作るのがおもしろい初心者なんです。
455 :
デフォルトの名無しさん :03/10/03 22:33
すいません、ここのファイル入出力のTips見て貼り付けて
http://www.yukibow.com/bcb/B0079.html とりあえずファイルを読み込んでMemo1の中に表示させようとしたんですが上手くいきません。
perlなら確かファイルを配列に読み込んで
print @array;したら簡単に出来ると思うのですが、エライ難しいですね…。
えと、ソース見て自分的には配列 str の中に
読み込んだテキストファイルの中身が入ってるんだろうと考えたので(たぶん間違い)
Memo1->Text=str[3];
とかでテキストファイルのたとえば4行目を出力しようとしたんですが、なんも入ってません…。
あと、配列の中に入った中身を一気にすべて出力するにはどう書いたらいいんでしょうか。
おねがいします。
>>455 Memo1->Lines->Add( str[3] );
このtipsは「AnsiString型1次配列」なんてものを使っている段階で少しピント外れ。
VCLにはTStringListってAnsiStringのコンテナがあるのでこれを使う方が普通。
これならファイルの読み込みも書き込みもメソッドが用意されているし、
TMemoに一遍に読み込ませることもできる。
>>455 そのサンプル
(1行目の文字数)(1行目の内容)(2行目の文字数)(2行目の内容)(3行目の…).....
というアホな専用フォーマットのファイルしか扱えない。
普通のテキスト読み込ませたら,あぼーん。
>>458 BCBのヘルプにはチュートリアルが載っているから実際にそのとおり試してごらん。
一通りのことは覚えられるから。
tipsなんてのはその後に覚えたらいい。
>>459 レファレンスは語句が少し難解というか正確を期してるので苦手なんですよね。
語句検索でも元々の知識が貧困だとなかなか思った情報にたどり着けなかったり。
でもおっしゃる通り「~の使い方」って感じの実例も載ってますんで、
がんばって慣れてみようと思います。
ありがとうございます
ヘルプにチュートリアルが無かったので、プロフェッショナル版にはないのかと 思ってたら、ありました。キーワード検索で出てきた。 チュートリアル: データベースアプリケーション チュートリアル: テキストエディタアプリケーション の二つですね。 ありがとうございます
463 :
デフォルトの名無しさん :03/10/05 22:26
全くの初心者なんですが、コンパイルの方法が分かりません。 bccでコンパイルをしようとしています。 パスはpath= c:\borland\bcc55\Binと設定しています。 コンパイルしようとしているソースのフォルダの選択もしています。 ソースはkeisan.cとして保存しました。 そして、bcc keisan.cでエンターキーを押しています。 しかし、'bcc’は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません。 何がなんだか手順が分かりません。 何がなんだか分からないので、どなたか手順を教えて下さい。
464 :
デフォルトの名無しさん :03/10/05 22:36
すごくくやしいんだ LSI-C試食版とBCC(フリーコンパイラ)で検証してみたけど。 printf("%f", (double)5/3); たったこれだけのことなのに、試食版では1.000000と表示され、 BCCでは正常に表示される。 これはどうゆうことでしょう?
win2000でc++です 銀行に10年、100万円を利子0.7%で貯金した場合 int型、float型でそれぞれ計算してその差額を比べてみろという宿題です ほとんどできたのですがint型の計算で一年目が\1007000のはずが \1006999と表示され計算がずれてしまいます どこを直せばいいのでしょうか #include<stdio.h> #include<math.h> int main(void) { int base,term,i; float rate,total; int total2; base=1000000; rate=0.7; total=base; total2=base; term=10; for(i=1;i<=term;i++){ total=total*(1+rate/100); total2=total2*(1+rate/100); printf("float %2d %f\n",i,total); printf("int %2d %d\n",i,total2); printf("sagaku %2d %f\n",i,total-total2); } }
>>464 マニュアル(≒添付書類)はよく読もうよ。
LSI-C試食版は標準では整数系のライブラリをリンクしに行くから、
printf()で実数値を表示することができないんじゃなかったかな。
実数系のライブラリを先にリンクするようにすれば表示できたはずだよ。
>>466 rateが実数なので、total2の算出に当たって実数演算が行なわれている。
しかも、floatなんて無意味なもの使うから精度が落ちている。
>>466 >int型、float型でそれぞれ計算してその差額を比べてみろという宿題です
へぇ~
>int型の計算で一年目が\1007000のはずが
>\1006999と表示され計算がずれてしまいます
>どこを直せばいいのでしょうか
なぜ直すの?
>>466 浮動小数では、0.7という値を正確に表現することができず、
0.69999... になっているのが原因。
結果を四捨五入するか、利率を整数で扱えばよい。
double型の変数hogeの値をintにキャストする時 (int)hoge ではなく (int)(float)hoge とした方が良いと聞いたのですが、(float)に意味はあるのですか?
つーか、floatなんて使うなよ。
>>473 環境によるだろ。x87 なら float でも double でも性能に大した差は出ないが、
SSE のような SIMD 演算を使う場合には float x 4 にしないと性能でないし、
いまだに double の演算機持ってない CPU とかも大量に出回ってるし。
>win2000でc++です Win2000でfloat C++でfloat
エスケープシーケンスがXP含むNT系OSでうまく働かないって奴、 某所に書いてあった通りsystem32フォルダ内のconfig.ntに device=%SystemRoot%\system32\ansi.sys dosonly を追加したけどこれだけじゃ無理だたよ・・・(つД`)どうすれば~
477 :
デフォルトの名無しさん :03/10/07 06:46
C++のすべての機能は禿のバイブルを読めばいいのですか? 自分は、Cの入門本しかよんでいないので、Cのすべての機能がわかりません。 Cの場合もいわゆるK&Rを読めばCのすべての機能が学べるのですか? どなたか、Cの機能がすべて記載されている書籍を教えてください。C99は 考えていません。
visualc++ で2つのソースファイルをビルドすると サブのソースファイルの終わりの行に fatal error C1010: プリコンパイル済みヘッダーの検索中に 予期しない EOF を検出しました。 というエラーが出て実行できません。初心者ですがエラーの原因と 解決方法を教えていただけると幸いです。
sfdafx.hを作成するか、プリコンパイル済みヘッダーを使用しないように 設定する、だったと思う。
>>476 エスケプでは無いが、windows.hに似たような事をできる関数がある。
SetConsoleCursorPosition カーソルの移動
SetConsoleTextAttribute 色変え
SetConsoleCursorInfo カーソルの表示/非表示
481 :
◆1haVRB54HY :03/10/07 15:12
char foo[3]; ... case (foo){ switch 'bar': ... break; switch 'boo': ... break; default: ... } みたいなことをするにはどうすればいいんでしょうか?charじゃなくてenumを使えばいいとかも聞いたんですが。。。
482 :
◆1haVRB54HY :03/10/07 15:51
1 #include <stdio.h> 2 int main (void) 3 { 4 char instr_user[256]; 5 char instr_prog[256]; 6 printf ("instr_user:"); 7 scanf ("%s", instr_user); /*なぜか可能 */ 8 //instr_prog = "HELLO_WORLD"; /*エラー*/ 9 strcpy (instr_prog, "HELLO_WORLD2"); /*可能 */ 10 printf ("instr_user=%s,instr_prog=%s\n", instr_user, instr_prog); 11 } また質問です。8行目がエラーになるのは、なんとか分かったと思うのですが、 7行目のscanf()について分からないことがあります。これだと、 instr_user = "入力した文字"; をやっているように見えるんですが、ちがうんですか?
>>481 Pikeじゃないんだからそんなことは不可能。
484 :
デフォルトの名無しさん :03/10/07 16:55
現在プリンタに送られている、 印刷バッファを知るためにはどうすればいいでしょうか? また、その印刷バッファを削除するためには、 どのような方法で削除すればいいのでしょうか?
>>484 画面の右下にプリンタのアイコンが出てないか?
そこで削除できるぞ。
487 :
デフォルトの名無しさん :03/10/07 17:14
コンパイルしたexeファイルを実行して プログラムが終わったらすぐにウィンドウが閉じてしまいます。 何で? 当方xp
489 :
デフォルトの名無しさん :03/10/07 17:20
>>488 結果を確認したいんだけど…。
ソースコードに何か入れればできる?
491 :
デフォルトの名無しさん :03/10/07 17:26
>481 #define MAKEHASH(a,b,c) ( (a << 16) | (b << 8) | c) switch ( MAKEHASH( foo[0], foo[1], foo[2] ) ) { case MAKEHASH('b', 'a', 'r') : break; } というのはどうか。
その前に誰かchar foo[3]につっこんでやれよ…
>>493 その前にcase (foo)とswitch 'bar'に突っ込む香具師はいないのか?
>>494 そもそも "bar" ではなく 'bar' っつーのも。
>>495 いや、それは普通にコンパイル通るから。
>>496 それなら switch 文の方も int にしないと。
俺はbooに突っ込みたい foo,bar,bazだろう。
>>482 レスないから答えよう。
scanf()の2番目の引数は普通「&hoge」とかとるだろ。
つまりhogeのアドレスな。
で、「&hoge[0]」とhoge[SIZE]の配列名「hoge」は等価な。
だからscanf ("%s", instr_user); は「&instr_user[0]」から順に格納するからOK。
500 :
デフォルトの名無しさん :03/10/08 01:20
void test(int a,int b,intc) { int x[a][b][c]; このようなxを使いたいときcalloc関数やmalloc関数を使いますよね。 3次の配列のときはどのようにやればいいんですか?よろしくお願いします。
>>500 2次の配列のときはどのようにすればいいか知っていますか?
502 :
デフォルトの名無しさん :03/10/08 01:26
>>501 一応、自分で作ったのではないのですが、プログラムはあります。
でも、それだと3次のやつができないんです。
>>502 の言動から DQN であると確信しました。
504 :
デフォルトの名無しさん :03/10/08 01:28
505 :
デフォルトの名無しさん :03/10/08 01:28
山下同
506 :
デフォルトの名無しさん :03/10/08 01:30
他で聞いた方がいいですか?
他で聞きます。
ポインタでやればいいじゃない。
>>508 「配列が駄目ならポインタでやればいいじゃない」
マリーアントワネット様でございますか?
510 :
デフォルトの名無しさん :03/10/08 04:42
しつも~ん、 何で大半の本はデフォルトで後置インクリメントを採用してるの? 普通に考えたら前置の方がデフォルトっぽくない?
>>510 C++も後置だろ?デフォルトは後置としてみんな認識してるんだよ
レス遅れました。
>>485 さん
それをプログラムで実現するためにはどうしたらいいでしょうか?
>>486 さん
UNIXのコマンドですか?
僕の使っているOSはWindowsなのですが…。
もしかしてWindowsにも同様のコマンドがあるのでしょうか?
513 :
デフォルトの名無しさん :03/10/08 10:53
>>512 コマンドプロンプトで実行してみ
アクセサリの中にあるだろ
どんな本も前置がデフォルトであるべきだと俺は思うなー。 型によっては、効率に割と違いあるしさ。
516 :
デフォルトの名無しさん :03/10/08 12:26
WindowsXPとVC++の環境です コンソールで開発でロケートのエスケープシーケンスは存在するのでしょうか?
Cなら後置でもいいかもしれんが
for (i = 0; i < max; ++i) キモチワリィ
521 :
デフォルトの名無しさん :03/10/08 14:52
じゃこのすれたいも C/++C室 にかえれ
C++ は、C を評価してからインクリメントする。 インクリメントしてから評価するのではない。
自分で++や--のオーバーロードを書くようになったら、 意味も無く後置を使うことができなくなった。
そーだろうね
だれか++Cを作って ・this を参照にして欲しい ・static_cast のオーバーロードか特殊化を認めて欲しい ・演算子オーバーロードは以下のような記述にして欲しい インクリメント result_type operator this++(); result_type operator ++this(); 関数呼び出し、インデクサ result_type operator this( arguments ); result_type operator this[ arguments ]; 二項演算子 result_type operator this+(operand); result_type operator (operand)+this; と思うのです。 C++設計者のセンスを疑います・・・
| ̄``''- 、 | `゙''ー- 、 ________ | ,. -‐ ''´ ̄ ̄`ヽ、_ / |, - '´ ̄ `ヽ、 / / `ヽ、ヽ / _/ ヽヽ/ / / / / / / ヽハ く / /! | 〃 _/__ l| | | | | | | ||ヽ \l// / | /|'´ ∧ || | |ー、|| | | l | ヽ /ハ/ | | ヽ/ ヽ | ヽ | || /|ヽ/! |/ | ヽ / | ||ヽ { ,r===、 \| _!V |// // .! | | || |l |ヽ!'´ ̄`゙ , ==ミ、 /イ川 |─┘ | ハ|| || | """ ┌---┐ ` / // | V !ヽ ト! ヽ、 | ! / //| / ヽ! \ハ` 、 ヽ、__ノ ,.イ/ // | / ┌/)/)/)/)/)/)/)/)/)/)lー/ ` ー‐┬ '´ レ//l/ |/ |(/(/(/(/(/(/(/(/(/(/│|| | \ 〃 r'´ ̄ヽ | |.ト / \ /  ̄`ア | | | ⌒/ 入 〉  ̄二) 四の五の | | | / // ヽ 〈! ,. -' | | ヽ∠-----', '´ ', | \| | 言う間に | |<二Z二 ̄ / ', | | | _r'---| [ ``ヽ、 ', | | | 自分で作れ >-、__ [ ヽ ! \.| l. ヽ、 [ ヽ | ヽ| \ r' ヽ、 |
激萌え
ちよちゃんだっけ?
澪だろ
いろいろ教えてもらってアリガトサン! 勉強始末。
最近C++を始めたんですけど 構造体をネストするようにクラスをネストしても問題ないんでしょうか?
534 :
デフォルトの名無しさん :03/10/08 22:13
教えてください。DLLを作るためのコンパイルをすると、 以下のような警告が出てしまいます。インクルードした ライブラリは次の通りなのですが、 user32.lib ole32.lib dsound.lib strmiids.lib dxguid.lib gsloader.lib ole32.dllへの参照がディスカードされましたと出てしまいます。 C言語の少しかじっただけで、コンパイルについてはよく分かって いないため、どうしたらよいかが分かりません。何か手がかりでも お教えいただけたら幸いです。よろしくお願いします。 D:\CWork\gsound>nmake Microsoft (R) Program Maintenance Utility Version 6.00.8168.0 Copyright (C) Microsoft Corp 1988-1998. All rights reserved. link /dll /out:.\gsound.gau gsound.obj gsound.res user32.lib ole32.lib dsound.lib strmiids.lib dxguid.lib gsloader.lib Microsoft (R) Incremental Linker Version 6.00.8168 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. Creating library .\gsound.lib and object .\gsound.exp LINK : warning LNK4089: all references to "ole32.dll" discarded by /OPT:REF D:\CWork\gsound>
その警告については、無視してもかまわない。 「ole32.libにより、ole32.dllをリンクするように指定されたけど、 そいつは、プログラム中のどこからも呼ばれないので省略します」って事
上に書いたものですが、 LINK : warning LNK4089: all references to "ole32.dll" discarded by /OPT:REF この行の "/OPT:REF" の意味だけでもお教え願えれば幸いです。
>>535 ありがとうございます。
そうして出来たDLLを使おうとしても使えないので、
この警告の内容が原因かと思っておりました。もしかしたら
プログラム自体に問題があるのかもしれませんので、再確認
してみます。
ただ、だとするとOLE32.LIBをインクルードしなくても良い気が
しますが、OLE32.LIBをインクルードしないでコンパイルすると、
unresolved externalがいくつか出てしまいます。
>>537 ライブラリはインクルードするものではなく、リンクするものだ。あとエラーメッセージは
コピペした方が良いぞ。
すごいアフォな質問で申し訳ないです。 #include <stdio.h> main() { int i=0; while(i<i+1){ printf("%d", i); i++;} } をコンパイルして実行すると DOS窓いっぱいに数字がダーっと流れるんですが 一カ所に表示を止まらせるにはどうしたらいいでしょうか?
エスケープシーケンスが使えるなら、カーソル位置を戻せるんではなかろうか
別に\rでいいと思うが。
getch()とか。
(σ・∀・)σゲッチ
>>542 \rでできました。
こんな初歩的な事聞いてすまんです。
546 :
デフォルトの名無しさん :03/10/10 02:00
すいません、CopyFileとやらを使って連番で30個ほどファイルを複製しようと思ったんですが、 「CopyFlieはAnsiString型ではなくchar型を使え」とかいったアラートが出て無理でした。 で、自分なりに調べて、char型に変換するようにしてして書いてみたんですが、 もっと単純明快に書けないものかと。 AnsiString OldFN = Edit1->Text; //ダイアログで選択しといたコピー元のファイルパス char O_FN[MAX_PATH]; strcpy( O_FN , OldFN.c_str() ); int i; for(i=0;i<30;i++){ AnsiString str_i = IntToStr( i ); AnsiString NewFN = "テスト"+str_i+".txt"; char N_FN[MAX_PATH]; strcpy( N_FN , NewFN.c_str() ); CopyFile( O_FN , N_FN , false ); //テスト1.txtからテスト30.txtまでファイルを複製 } よろしくお願いします
>>546 変数名として N_FN とか O_FN っつーのはどうかと思うが (マクロかと思うぞ)、
それはともかく。
O_FN のコピーを作る必要はなくて、ループ中も
char N_FN[MAX_PATH];
snprintf(N_FN, MAX_PATH, "テスト%d.txt", i);
CopyFile(OldFN.c_str(), N_FN);
で良いんじゃないの?
548 :
デフォルトの名無しさん :03/10/10 02:50
日付と時間を取得して、yy/mm/dd hh:mm:ssの形式にするには どうすればいいんでしょうか。
>>546 CopyFile( Edit1->Text.c_str(), NewFN.c_str(), false );
c_str()ってのはもともとこういうふうに使うためのメソッドね。
>>548 time()してlocaltime()してstrftime()
strftimeって知らない人多いよね。sprintf使っちゃうの。
>>547 >>549 ありがとうございます
教えて頂いた通りにやると実に短いコードになって大変勉強になったです…
>>550 >>551 ありがとうございます
教えて頂いた通りにやると実に短いコードになって大変勉強になったです…
554 :
デフォルトの名無しさん :03/10/10 10:15
教えてキボウンぬ C言語で 繰り返し表示する文字とその繰り返し回数をキーボードから入力するプログラムを作成する プログラム書いてくれませんか? 文字をキーボードから入力し(もじてきとー)それを逆から表示するプログラム をしえてくださいな おねがいします=
ttp://www.din.or.jp/~ohzaki/perl.htm#Mail >「詳説 正規表現 ( Mastering Regular Expressions )」には
>メールアドレスはネストしたコメントを持つことができるので
>正規表現で表わすのは不可能であると書いてあります
なお、ここで解決方法としてあげられている、Perl 5.60の(??{ code })
という拡張はrubyには無いはず
あ、、誤爆スマソ
557 :
デフォルトの名無しさん :03/10/10 11:35
>>554 #include <stdio.h>
int main(void)
{
char str[256];
char *p = str;
scanf("%s", str);
while(*p != '\0')p++;
while(--p >= &str[0])
putchar(*p);
putchar('\n');
return(0);
}
C++のプログラマーさんに聞きます。 Solaris(Sparc)、Linux(x86)でC++デバックするとき どんなデバックツール使ってますか? Insure++なんでどうなんですかね(ボソ
gdb
560 :
デフォルトの名無しさん :03/10/11 12:39
「拡張子」って英語で何て言うんですか? web辞書とかで調べても載ってません…
すいません、誤爆です
誤爆に答えるのも何だがextensionだろ
全関数の先頭に、あるデバッグ用コードを埋め込むにはどうしたらいいでつか?
564 :
デフォルトの名無しさん :03/10/11 21:03
Windows98のMS-DOSプロンプトで、任意の二点間を直線で結ぶ関数があったら教えてください。 コンパイラはVisual C++6.0を使っています。
565 :
デフォルトの名無しさん :03/10/11 21:50
100等の複数バイトの数値を 1バイトづつの数値(100の場合1,0,0)に 分解して配列に保存したいのですが、 その場合、scanfとかで取り込んだ後一バイトづつに 分割するんだと思うんですが、そんな関数ってありますか? それとも、最初から一バイトづつ読み込むのでしょうか?
566 :
デフォルトの名無しさん :03/10/11 21:51
100等の複数バイトの数値を 1バイトづつの数値(100の場合1,0,0)に 分解して配列に保存したいのですが、 その場合、scanfとかで取り込んだ後一バイトづつに 分割するんだと思うんですが、そんな関数ってありますか? それとも、最初から一バイトづつ読み込むのでしょうか?
二重かきこすいません。。
10で割り算しろよ。
>>588 目から鱗でした。
上の2通りしか方法思いつきませんでした。。
ありがとうございました。
>>569 sprintfでいいだろ。
sprintf((char*)buf, "%d", 123);
571 :
デフォルトの名無しさん :03/10/11 22:33
100を1バイトずつ分割すると1,0,0になるのか・・・
572 :
名無し@沢村 :03/10/11 22:41
おまいらよ、TSXBINって知ってるか?
これは土屋秀雄というガキがつくったバイナリエディタだが、ただのバイナリエディタではなく、いろいろなファイルをそのファイルのフォーマット解説つきでバイナリ表示&編集できるというなかなかのすぐれものバイナリエディタよ。
で、ファイルを開いたときに、フォーマット解説を表示するためには、そのフォーマットを記述したマクロファイルを定義しなければならないわけだが、最初からおまけでついているものは、BMP、GIF、JPG、ICO、LZHなどだよ。
つまり実際はBMP、GIF、JPG、ICO、LZHファイルに限ってフォーマット解説が見れるわけだな。
おまいらよ、おれはこのTSXBIN用のマクロとして、MIDとMLD用のやつをつくったからちょっと見てみろ?
つまりこのマクロがあると、パソコン用のMIDIファイルと携帯DoCoMo用のMfiファイルがフォーマット解説つきでバイナリ表示できるぞ。
ここ↓からダウンロードしてみろ?
http://hp.vector.co.jp/authors/VA015412/ おまいらよ、これはMIDIシーケンサーを学ぶおまいらにとてもためになるものだから、ちょっと見てみろ!?
573 :
デフォルトの名無しさん :03/10/11 22:56
>>572 何だかもう泣けてきた…。
もういいよ、無理しなくて。
>>572 マルチ。Vectorに通報しちゃろか。
575 :
hello :03/10/11 23:01
プログラミングって VisualC++とかの市販ソフトを使用しなければいけないんですか? また、SDKって何?
576 :
デフォルトの名無しさん :03/10/11 23:08
SDK= Sean Connery Daisuki Kurabu です。。。
身長185cmは伊達じゃない
578 :
hello :03/10/11 23:25
ヴァカ
579 :
デフォルトの名無しさん :03/10/11 23:40
インクルードするには、拡張子はどうすれば良いのでしょうか? 分からないので、お教えください。
580 :
デフォルトの名無しさん :03/10/11 23:42
ヘッダをインクルードしたいのですが コンパイラはボーランドCコンパイラーです
581 :
デフォルトの名無しさん :03/10/11 23:43
ホームページ作るなら下記を当たれ!part3(月額1000円以下)
----------------------------------------------------------------
■以下の条件でレンタルサーバーを検索(レンタルサーバーナビ)
http://www.server-navi.com/ ○月額費用1000円以下
○ディスク容量100MB
○独自ドメイン利用可
該当するプランは下記4件
----------------------------------------------------------------
◆◆◆ 価格&サーバースペック総合評価 ◆◆◆
----------------------------------------------------------------
★1位 :ウエブスピード(
http://www.webspeed.ne.jp )
価格【777円】・スペック『CPU: Pentium4 2.4Ghz、1GBメモリ』
----------------------------------------------------------------
★2位 :フューチャリズム(
http://www.futurism.ws/server )
価格【600円】・スペック『CPU: Pentium3 800MHz 128MBメモリ』
----------------------------------------------------------------
★3位 :キーパーク(
http://www.keypark.net )
価格【800円】・スペック『CPU: Intel Celeron 1.3GHz 512MBメモリ』
----------------------------------------------------------------
★4位 :イーシーテクノロジー(
http://www.ectec.jp )
価格【980円】・スペック『CPU: Pentium4 2.0Ghz、1GBメモリ』
-------------------------------------------------------------------
582 :
名無し@沢村 :03/10/11 23:55
>>575 SDKは知らなくていいよ。
MFCという便利なものがあるから、それを覚えろ。
583 :
I'm proud, but I have a big mother :03/10/12 00:03
とりあえず、 プログラミングするときはVisualC++がないといいものができないんですか?
>>583 言語を勉強するだけならいらないのでは?
結構高いし・・・
>>583 VC++なんぞ無くても何とでもなる
必要なのは人並みの知能だ。
君あるの?
586 :
デフォルトの名無しさん :03/10/12 00:59
あったらはじめから聞いてねぇよ
>>575 マジレスしとくと、
プログラミング言語の勉強は最低限教科書と紙と鉛筆があれば出来る。
教科書の代わりに初心者向けサイトの解説でもいいし、紙と鉛筆の代わりにエディタ
を使ったらなお良い。
書いたコードを実際に動かすためにはコンパイラが必要だが、これはタダで入手できる。
VCみたいな開発環境は本格的にWindowsアプリケーションを開発するにはあった方が
断然有利だが、初心者がすぐに使えるような代物じゃない。
まずはC++なりJavaなりを一通り身につけてから購入を考えた方が利口。
例えて言えば、英語をろくろく勉強してない厨房が英語版Wordを入手したとしても、
それで英語の文章が書ける訳はあるまい。
まぁ、本気で勉強する気があるのなら、何はさて置き始めてみることだ。
レスアンカーも含めれば三行目か。
最低限頭があれば何でもできる。
592 :
デフォルトの名無しさん :03/10/12 13:25
文字列で「 " 」を含めるにはどうすれば良いのでしょう。
こういうどんなへたれ参考書にも必ず書いてあるようなことを聞くのは独学でやってるの?
\"
596 :
デフォルトの名無しさん :03/10/12 20:57
クラスA、クラスBがあり、 クラスBがクラスAのオブジェクトを持っていて、 クラスBでクラスAのメンバ関数へのポインタを持たせることは、 ANSI C++の標準の仕様で、実現できるのでしょうか? 宜しくお願いします。
class A{ int func(); }; class B{ A a; int (*fp)(); B(){fp=A::func} };
>>597 早速のレスありがとうございます。
私もそのような方法でやってみたのですが、エラーが出てしまいます。
ちゃんとprotected/publicつけたか?
int (A::*fp)();
じゃないの? あとは
>>599 が言ってることもチェック。
C++かじった程度の人間が答えるべきじゃなかったな(;´ー`)
602 :
デフォルトの名無しさん :03/10/12 22:05
プログラミング言語cの演習なんですけど, "長い入力行を,入力のn文字目にある最後の非ブランク文字の後で, 折りたたむプログラムを書け.プログラムは,行が非常に長くても,また指定桁 までにブランクもタブも無い場合についても,ちゃんと動作するようにせよ." これの意味がわかりません.簡単に説明してください.
>>602 心配するな、俺にもわからん。
日本語おかしいし。
>>602 訳に問題のあるあの本ね・・・
折りたたむってのがよく分からないが、そこで入力をうち切れという意味かな?
vectorにある正誤表は見た?
605 :
デフォルトの名無しさん :03/10/12 22:10
system("プログラム名 &");として バックグラウンドプロセスで実行した場合 エラーが起きた場合の調べ方はどうやるんですか?
mou chotto mashina yakushikata ha dekinainoka こう入力された場合、23文字目ならブランクをのぞいた23文字目のiのあとのkで切れということかしら。
これを訳したやつは自分で自分の訳読めたのかね?
折りたたむ==改行する?
>>599 protected/publicをつけて試してみましたが、やはりだめです。
>>600 int (A::*fp)();とやってみてもだめでした。
仕様上無理なのでしょうか?
ありがとうございます.
611 :
デフォルトの名無しさん :03/10/12 22:20
>>609 そりゃ597には他にもミスがあるからな。
お前がエラーを示さない限り、あるいはそのエラーと向き合って自分で直そうとしない限り直らないんじゃないの?
>>611 >>612 すみません、以下ビルド結果です
error C2440: '=' : 'bool (__thiscall A::*)(void)' から
'bool (__cdecl *)(void)' に変換することはできません。
このようなエラーです。
宜しくお願いします。
なんで関数ポインタを使いたいんだろう。
>>613 > int (A::*fp)();とやってみてもだめでした。
本当に?
少し調べてみたところ、 関数へのポインタの実体はアドレスだが、 メンバ関数へのポインタはアドレスではなくオフセット値のようなもの と書いてありました。 ということは仕様上無理なのでしょうか?
VC++6.0のよかーん
どうしても仕様のせいにしたい訳だ?
>>614 >なんで関数ポインタを使いたいんだろう。
テーブルにメンバ関数のポインタを持たせて、
テーブルを参照してメンバ関数を呼び出すというようなルーチンを作りたかったからです。
メンバ関数のポインタを使わず上記のルーチンを実現する方法はありますでしょうか?
>>616 仕様上可能だし、VC6でもできるし、オフセット値ではない。
もっとも、最後のは実装に依存するが、内部でどのように
表現されていようが関係ない。
#include <iostream> using namespace std; class A { public: int func() { cout << "func" << endl; return 0; } }; class B { A a; int(A::*fp)(); public: B() { fp = A::func; } void exec() { (a.*fp)(); } }; int main() { B b; b.exec(); return 0; } BCB6ならこれは通る。
(モレの脳内で)「半熟C++コンパイラ」と呼ばれ続けている VC++5.0でだって、int (A::*fp)() でイける。 いわんや、VC++6.0をや。
そろそろオチを知りたいんだが・・・
仕様上無理だということがわかりました。 こんなところで聞くより教科書見たほうが早かったですねw。
めでたしめでたし。 次いってみよう。
>>621 たしかにコンパイル通りますね。。
だとしたら、自分が書いたコードに間違いがありそうですね。
親切に答えてくれた方、お騒がせしてすみませんでした。
もうちょっとコードを眺めてみます。
後、
>>624 は偽者なので気にしないでください。
627 :
デフォルトの名無しさん :03/10/13 00:51
C++で、 同一クラスのコンストラクタ内で別のコンストラクタを呼び出すって できますか?
出来ません
>>628 replacement new 使えばできるんでねーの?
>>630 基本クラスやフィールドを二度コンストラクトしてもいいなら。
>>632 newの前に明示的にデストラクタを呼べばいい。
>>633 それは当然だが余計な処理が入ることに何の変わりも無いぞ。
あるコンストラクタの内容を 別の関数にまとめてやればいいだけだ。
636 :
デフォルトの名無しさん :03/10/13 03:44
637 :
デフォルトの名無しさん :03/10/13 04:35
オブジェクトを戻り値に持つ関数の場合、 それを受け止めるにはどうしたらいいのですか? class hoge{ int i,j,k・・・; ・・ static hoge func(){・・};//←オブジェクトが戻り値 }; void main(){ hoge x=hoge::func(); } みたいにするとmain内のxの中身が変になりそうです。
心配ならコピーコンストラクタでも作れば?
あ~、初めてその言葉知りました。どうも。
640 :
デフォルトの名無しさん :03/10/13 12:59
private属性の変数の値は変えられませんが、 特に新しい関数を作らずに その中身の値だけでも知ることが出来る方法って無いですか?
それが出来たらprivateじゃないじゃん
その通りですね。 でも見るだけでいいんだけどなぁ。チラッと。 それだけのために関数を作るのが悲しかった。
>>642 そんなに公開したいなら、publicにすればいいじゃん。
publicだと値も変えられて危険かなぁと・・
じゃfriendじゃだめ?
constにしよう
素直に関数作れば。
WinAPIをラップするのは賢い選択なんでしょうか? 小規模なツールを作ろうと思っています。
>WinAPIをオブジェクト的にラップするのは賢い選択なんでしょうか?
勉強用にならいいかもしれないけど 薄めの皮をかぶせたATLや 厚めの皮をかぶせたVCLとかあるし
651 :
デフォルトの名無しさん :03/10/13 19:21
staticにできるならstaticにした方がいいですか?
>>650 ありがとうございます。
ATLもしくはVCLを使って作ってみようと思います。
それは、変数に与えるstaticか、 関数に与えるstaticか、 メソッドに与えるstaticか。
654 :
デフォルトの名無しさん :03/10/13 19:26
関数に与えるstaticってことでおながいします
>>654 Cで、ソースファイル外から呼ばれないものはつけた方が良い。
が、別につけなくてもどうってことはない。
C++なら、無名名前空間を使うべきだ。
えー、その置換は別に必要ねーって
練習用に作ってる以下のプログラムで、リターンキーを押してないのに、押したと思われてます。(gcc-3.2.2,RHL9)どうすればいいですか? #include <stdio.h> float kakezan(float a,float b){ float c; c = a*b; return c; } void print_hello(void){ printf("Hello, World.\n"); } #define HELLO print_hello int main(void){ printf("かけ算\n"); printf("値1: "); float kakezan_1,kakezan_2; scanf("%f",&kakezan_1); printf("値2: "); scanf("%f",&kakezan_2); float res=kakezan(kakezan_1,kakezan_2); printf("結果:%f\n",res); int check_return=0; while ( check_return != '\n'){ printf("リターンキーを押してください\n"); check_return= getchar(); } つづく
scanfの食べ残しが原因。
HELLO(); return 0; }
>>659 と、言いますと?すみません、無知で。。
すみませんぐぐってわかりました。 scanfしたあとに無意味なgetchar()をいれますた。
だからあれほどscanf()は使うなと……
アクセス指定子protectedが存在する意義や3種類の派生の使い分け等が 分かりません。 こういう使い方のときはpublic派生を使うとか、ユーザーがこういう 使い方をすることを想定して、あらかじめこのメンバ変数をprotected にしておくなど、使う側、設計する側の両方から教えてください。
>protected 意義が分からなければつかわない。 >派生 使いわけが分からなかったらとりあえずpublicにする。 あとは、教科書に書いてあることさえ理解していれば、 必要な状況に直面したときにどうすればいいか自然に判るはず。 教科書をろくに理解してないならその限りでないが。
>> 665 教えてください
公開したいときにpublicにして、 保護したいときにprotectedにして、 個人的な秘密はprivateにしる。
668 :
デフォルトの名無しさん :03/10/14 17:52
クラスの宣言に関して悩んでいます。 ある二つのクラスを作っていて、それぞれのクラスのメンバ に、お互いの型が存在するという状況にしたいのですが、やり方は あるのでしょうか? <↓こんな感じにしようとしています> Class ClaA { ClaB *m_B; } Class ClaB { ClaA *m_A; } この場合、ClaAより前にClaBは宣言されていないために コンパイルエラーになります。 初歩的な話かもしれませんが、お時間のある方、お教え 願えれば幸いです。
何語だそりゃ
>>668 class ClaB;
class ClaA
{
ClaB *m_B;
};
class ClaB
{
ClaA *m_A;
};
>>670 文法の誤りまで訂正して頂いて下さりありがとうございました。
しかし、そのようにしてVC++7でコンパイルしたところ、
エラーになってしまいました。
「*m_B」に関して、
「指定された識別子は、未定義のクラス、構造体、または共用体です。」
という趣旨のエラーでした。
新しく書き直したこともあり、一応ソース全体を示します。
#include <iostream>
using namespace std;
class B;
class A
{
public:
B b;
};
class B
{
public:
A a;
};
<エラー内容>
「'A::b' が未定義の class'B'で使用しています。」
>>671 さりげなく * が無くなってるようだがこれはどういうことか説明したまえ。
673 :
デフォルトの名無しさん :03/10/14 19:39
#include <iostream> using namespace std; string res; cout << "必死だな(藁"; while(1){ if(res==DQN){ last; } cout << "←こいつが一番必死だな(藁"; } cout << "結局俺が一番必死だな(藁\n"; return 0; }
>>671 出来るだけシンプルな例にしようとして消しました。
>>673 言い方は雑だけど、そのコード問題の解決法を示している
のかも知れないと思って、必死に解読しようとしてしまいました。
アホです。私は。
>>674 > 出来るだけシンプルな例にしようとして消しました。
意味が全く違うわけだが……。
>>675 !! おろかでした!
コンパイルが通りました。
ポインタならOKなんですね。
実際のコードではポインタを使おうとしていたので、
これで解決できそうです。
ありがとうございました。
みなさん namespace って使ってます? 俺はほとんど使わないけど。
>>677 それなりに。規模が大きくなってくると、ネームスペース切らないと
識別子がやたら長くなる
略語が多くなって、さっぱり分からん
どっちかになるから。
あと規模によらず anonymous namespace は多用してる。
>>678 > あと規模によらず anonymous namespace は多用してる。
static 関数じゃだめ?
>>679 static じゃクラス名を隠蔽できない。
インターフェースと実装を分離する場合、ヘッダに
struct Interface { virtual void foo() = 0; };
と書いて、実装側に
namespace {
class InterfaceImpl : public Interface { virtual void foo() {} };
}
とか書いておく。
--A.h-- class X { public: virtual void foo() = 0; static A *getInstance(); }; --A.cpp-- X::getInstance() { class X_Impl: public X { void foo() { ... }; return new X_impl(); } ほら、namespace使わなくてもクラス名を隠蔽出来る。 全部inlineのjavaチックなコードになっちゃうけど。
682 :
デフォルトの名無しさん :03/10/15 01:00
TreeViewでディレクトリを表示したいと思って必死こいて下のサンプルを見つけてきたんですが、
うまく動きません。
http://member.nifty.ne.jp/vjroom/cbuilder.htm#ドライブの全ディレクトリを検索する 。
[C++ エラー] hoge.cpp(93): E2316 'TForm1::dirtree_call(AnsiString,TTreeNode *)' は 'TForm1' のメンバーではない
[C++ エラー] hoge.cpp(99): E2206 不正な文字 '\' (0x5c)
[C++ エラー] hoge.cpp(99): E2206 不正な文字 '\' (0x5c)
[C++ エラー] hoge.cpp(108): E2442 2 つの連続したピリオド
[C++ エラー] hoge.cpp(117): E2316 '_fastcall TForm1::Button4Click(TObject *)' は 'TForm1' のメンバーではない
[C++ エラー] hoge.cpp(118): E2206 不正な文字 '\' (0x5c)
[C++ エラー] hoge.cpp(118): E2206 不正な文字 '\' (0x5c)
なんかもっと簡単なサンプルとかあればありがたいんですが、webに転がってるサンプルは
delphiとかばっかりで…。
というかTreeViewってそもそも簡単にほいこらと使えるコンポーネントじゃないぽですか。
TreeViewが使いやすいとかそういう以前の問題。 フォームのヘッダにdirtree_callを宣言しろ。 Button4を置いてOnClickのハンドラを作れ。 入力ミスは自分で直せ。 目で見てわからなけりゃコピペしろ。 C++知らないんだったらC++Builderなんか使うな。 C++Builderを使いたいんなら、まずC++を勉強しろ。 (C++が嫌ならDelphiやVBにしとけ)
>>683 絶対怒られると思ってましたw
厳しい物言い(当たり前ですが)ながら大変親切にありがとうございます。
おっしゃる通り単純にヘッダファイルに2つの関数宣言してなかっただけでしたぁ
しかしこのサンプル、ディレクトリが表示されるまで15秒以上かかってしまいますね…。
再起動後も2秒くらいかかるし。
改良のための考え方としては前回開いたところを記憶させておくってことでしょうか。
今はちょっと動いただけでも楽しいのでがんばって何とかやってみます
がんばれ
686 :
デフォルトの名無しさん :03/10/15 07:53
Borland C++ でwin プログラムを作りたいのですが いい解説サイトとかあるでしょうか? またいい本とかあるでしょうか? おねがします winプログラムは一個もつくったことがありません 又これがないとできないというのがあれば教えてください
>>686 猫でも分かる~
プログラミングWindows(上下)
人並みの知能
テンプレートは自信ないッス
質問です! GetWindowRectで、ウィンドウの描画範囲を取得したのですけど、 どうも、範囲が実際の描画範囲より広い気がします。 GetWindowRectで描画範囲は取れないのでしょうか?
>>640 BCB限定なら
class A
{
private:
int _value;
public:
__property int value = { read=_value };
};
>>690 GetClientRect を使え。
Win32 の API は沢山あってどこで何をどうすればってのを探すのも
大変だろうから、最初のうちはサンプルとか人のコードとかを読んで
型みたいなものを学ぶのもよいと思う。
すいません、GetClientRectで解決できました。 お騒がせしましたー。
VS.NET2003 C++で atama.h namespace { int a; } てなヘッダをインクルードした場合 インクルードした側からは a は見えないと思ったのですが、 普通に使うことができいてしまいます。 staticを使っても同様でした。 私は、どの辺を勘違いしているのでしょうか?
>>695 じゃあ、どうやってaにアクセスするのだよ、おい。
インクルードしたら見える(使える)に決まってるだろ。
無名namespaceってどういう意味があるの?
>>698 Cでいうところのstaticグローバル変数だ。
そのファイルでしか見えない変数ね。
C++では、従来のstaticではなく、無名のnamespaceが推奨されてる。
>>697 >>699 ・・・てことで、a は atama.h 中の関数でだけで使える
(クラスの private メンバみたいに)ってことかと思っていたんだけど
もしや、それ自体が勘違い?
・・・あ ヘッダに関数の中身書くのは良くないんだっけ?
>>700 #includeの説明読んでくれ。頼むから(;´Д`)
>>701 え~と、とりあえず漏れは #include について勘違いしてるわけね。サンクス
・・・ッテ、ダイジョブカ、オレ・・・
703 :
デフォルトの名無しさん :03/10/15 15:36
class A; の意味教えて class A{ ....... ....... ....... }; じゃなくてm(_ _)m
>>703 クラスの先行宣言。Aがクラス名だとコンパイラに教える。
705 :
PATHに :03/10/15 16:13
初歩の初歩でつまづきました。stdio.h が呼び出せないのです。 どなたか教えて下さいmm。下記に何か間違いがあるのでしょうか? ソース #include<stdio.h> main() { printf("Hello!\n"); } path設定 path %PATH%;c:\borland\bcc55\bin;c:\borland\bcc55\lib コンパイル結果 c:\borland\bcc55\bin>bcc32 hello.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland hello.c: エラー E2209 hello.c 1: インクルードファイル 'stdio.h' をオープンできない 警告 W8065 hello.c 4: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main ) 警告 W8070 hello.c 5: 関数は値を返すべき(関数 main ) *** 1 errors in Compile ***
マニュアル読め。
709 :
PATHに :03/10/15 16:51
>706,707,708 ども^^ありがとうございます。 DOSプロンプト起動して、path設定するバッチを実行ではダメなのかな? Windowsの環境変数でpath追加すれば良いってことでしょうか・・・やってみます。
解決しました・・・BCC32.CFG の作成が必要だったのですね。 ありがとうございました。
礼を言う前にちゃんとリンク先を嫁 List 4 BCC32の設定(BCC32.CFG) -IC:\Borland\Bcc55\Include -LC:\Borland\Bcc55\Lib
VisualC++とBCCを比べると、何か同じc++なのに違う。 VisualC++には、どうもたくさんの便利なクラスが最初からあるらしい。 メッセージをいちいち取らなくても、例えばマウスのボタンを押したとかを判定できるものとか。 この仮説は合っています?
比較するならBCBと比べてやれ
>>712 BCCはコンパイラ
VC++は開発環境
そして、C++ってのはプログラミング言語
おまえ、全部一緒にしてるだろ?
CはDOS程度分かっていてC++はあんまり分かっていません 猫でもわかる~のWIn変の(SDK?)のんを bcc32 -w でtp://www.kumei.ne.jp/c_lang/sdk/sdk_00.htm sample01.cpp をコンパイルするとエラーが出るんですが これでいいんでしょうか? 返信おすくてすみません
エラー出るんだから、良いわけないだろ
>>715 myProg.hbrBackground =GetStockObject(WHITE_BRUSH);
のところでキャストしる。
ちなみにVC++でもエラー出る
Socketで受信データをchar配列データに入れて、 vectorのような可変配列で格納したいのですけれど、可能でしょうか? また、配列のサイズを受信したデータサイズに縮小しながら格納したいのですが 何か助言をお願いします。
>>699 じゃあ無名namespaceの中に関数やクラス書いたら
static関数とかと同じ様になるの?
>>718 C++とSTLに関して一応の知識があるつもりならEffective STL読め。
それが一番はやい。
cといったら いいのが猫~しかないのでしょうか
>>721 お金があるなら
>>787 の本か「Windows2000プログラミング標準口座」あたりを読む。
正直、サイトの解説を探し回るよりきちんとした本を通読する方が効率的だと思う。
>>718 vector<char> vec;
vec.reserve();
vec.resize();
○&vec[0];
×vec.begin();
この辺がキーワードかな。
>>719 Yes
全く同じではなく若干の罠も存在するが、ほぼ同様。
726 :
デフォルトの名無しさん :03/10/15 20:52
C++勉強中です。 引数のあるコンストラクタをもつクラスBをメンバ変数にもっているクラスAのコンストラクタは A::A(): B(10) { } 例えばこんな感じだと思うのですが、もしメンバ変数Bを配列で定義していて、初期化のとき B[0], B[1], B[2], ...それぞれに違う引数を入れたい場合どう書けばいいんでしょうか?? 説明分かりにくくてスマソ。
727 :
デフォルトの名無しさん :03/10/15 20:57
あるクラスのstaticな関数を使うときに、 わざわざその「クラスの名前::」って打つのが面倒なんですけど 何か便利な方法ないですか?
クラスの名前:: と打たずにどうやって「あるクラス」を判断するんだよ。 名前が長くてイヤならtypedef使え
>>728 namespace みたく using できたらな、っつー話じゃない? 俺も typedef しろに一票。
staticメンバ関数を多用するような設計は間違っているので反省する。
まぁ、クラス名タイプするのが面倒なだけならfriendな関数にしてしまうのもアリだが。
C++で複素数(虚数)を扱うようにする方法って無いですか? 構造体に実部と虚部をパッケージするくらいしか思い浮かびません。
普通クラスだろ
つーか、std::complex。
>>735 そんなのあるんですか?
あるなら自分で作らないで、そっち使いたいです。
>>726 1)構造体を引数にする
2)コピーコンストラクタを使う
3)とりあえず引数なしで初期化してコンストラクタ内で代入する
お好きにどうぞ
738 :
デフォルトの名無しさん :03/10/15 23:12
あるクラスの関数で classname XX=this; みたいな真似をしようとしたら怒られました。助けてください。
Class hoge { }; hoge a = *this; hoge *a this; hoge a(*this);
>>738 classname *XX=this;
あ、そっか。thisはポインタでした。ぬお~
rand()で生成される乱数ショボイです。 どうにかなりませんか?
>>743 何を今さら。
検索しる! そこらに転がってるぞ。
boost randomで検索したら出てきました。 どうもありがとうございます
あれ、なんかインクルードできない。 もう駄目だ、死ぬ。
それ以前にお前はboostインストールしてるのかと。
多分してません
使えるなら rand48 は? ダメなら Mersenne Twister で検索を。
すげ、こんなのあったの?鬼のようだ
753 :
デフォルトの名無しさん :03/10/16 17:38
しつも~ん、 幾つかの関数で変数や配列扱いたいときって、 ポインタで引数に渡して・・・って普通はやってるんだろうけど、 単純にグローバル変数で宣言しちゃうってことはないの?
754 :
デフォルトの名無しさん :03/10/16 17:42
特定の関数のみで書き換えをおこない、他では参照のみと決めたものはグローバル変数にしている。 同じグローバル変数でも他のファイルで使用しないならstaticをつける。
755 :
デフォルトの名無しさん :03/10/16 22:54
例えば double d[10][20] という配列があって、 d[11][20]が欲しいなぁと思ったときは、 newとかで新しい配列を作ってコピーするしかないんですか? それとも簡単に付け足せるような方法ってありますか?
double d[12][21]; と宣言を変える。
std::vectorに丸投げ。
>>755 std::vector<std::vector<double> > d(10, std::vector<char>(20));
これを拡張すれば?
char->double
どうもありがとうございます。 でも、どうにか原始的な関数だけ使って付け足せる方法って無いんですかね。 あ、贅沢ですね。でもあるなら知りたいなぁと。
malloc使って動的に確保してあればreallocで拡張できるが。
>>761 あっなんかそれっぽいです。
C++風だとどんな風な関数になるのですか?
malloc - realloc
new - ??
みたいな感じで対応付けるとしたらです。
というかそれがstd::vectorだったり?
>>762 そんなものはない、が答え。
つか、明示的にstd::vectorが使えない理由がなければstd::vector使っとけ。
開放の手間とか段違いすぎる。
VC++.net2003を使っているんですが。 関数からAYという関数を呼び出そうとすると error C2365: 'AY' : 再定義; 以前の定義は '以前は不明な識別子' でした。 error C3861: 'AY': 識別子は、引数依存の照合を使用しても見つかりません。 となってしまいます。 どうすればこのエラーをなくせますか? お願いします。
はい分かりました。C++には無いんですね。 質問に答えてくれてありがとうございました。 std::vector使ってみます。 …いや、なんかこういう基本的っぽいコマンドに::が入ってるのが ちょっと納得いかなかったんです。
コマンドじゃないでしょ。
>>755 using宣言すれば::はとっても大丈夫
malloc()はよくてstd::vectorがいけない理由がわからないなぁ。 CObArrayなんか使われるよりはmalloc()の方がましな気がするけど。
>>766 原始的な関数を組み合わせて実装してもいいけど、結果は std::vector 以下にしか
ならないと思うから、みんな std::vector 使えって言ってるんだと思う。
std::vector 使わないで C++ にやるなら、vector 相当のクラスを766が書く、ということになるよ。
何らかの理由で vector が使えないなら、それが最適解だと思う。
こんにちは。はじめまして。 すみません。教えていただ行きたいことが。 その前に私の環境から。 UNIX(FreeBSD)をSSHで接続。コンパイラはGCCあり。Makeあり。 で、何を聴きたいかとといいますと、 ある関数をプラグインとして供給したい。 ある関数とは不特定内容、不特定数です。 Main関数で組んで外部コマンドとして呼び出す手も考えましたが、 呼び出し回数が多く(この方法だと1秒に最大600回)、なんとか、オンメモリーで 処理したいと考えます。 またこのプラグイン自体のバージョンアップを考え、アプリケーション本体に このプラグインの再読み込みを行うルーチン(コマンド)を設けたいと考えております。 プラグインの動作の内容は不特定で、もちろん、本体へ戻り値を返したり、変数の値を返したり する事もありますし、まったく関係ない動作をする場合も考えられます。 説明が不十分かと思われますが、こういったルーチンの記述方法がわかりやすく、 サンプル付きで紹介されてるサイトまたは書籍をご存知でしたら是非ご紹介ください。 良レスを期待してまっております。 (長文失礼しました)
>>771 自分じゃ無理そうなので、usingして使うことに決めました。
でも原始的な関数の組み合わせでも似たようなのは作れるんですよね。
どこまで使う関数を減らして同じ機能にできるだろうか・・・
とかたまに考えて疲れたりすることないですか。意味なさそうですけど
あー、でもなんかやっぱりstd::vectorの中身気になります。 要素数を増やしてもメモリの番号は連続してるってことは、 要素数を増やす前のデータに新しい領域を足した分を どこか新しい場所にコピーしてるってことですよね? 眠れません
>>775 つーかvectorのソース読めば分かるよ。
なるべくメモリの再割り当てが起こらないように、
再割り当てするハメになったら、領域の大きさを倍にしていく実装が多いと思うけど。
再割り当てするしかない場合はあんたの言ってる通りにコピーしてる。
あらかじめ倍くらい余分に取っておくんですね。なるほど。 どうもありがとうございます。これで眠れます。おやすみなさい。
笑われそうな質問ですが、C++に関し皆様のお知恵を拝借したいと存じます。 任意数の空白文字で区切られたデータを処理したいと思っています。 つまり空白区切りのカラムの処理で、以下の様な入力ファイルです。 10__100__72__3.98 11___70__86__0.224 12__380___5__22.1 ..... '_' はスペースのつもりです。 これの実装で、以下の様なことを考えました。 1) ifstream::infile >> data[i]; などとして、適宜改行を評価 2) ifstream::infile.getline(string s, 100); として、後でstrtok などでカラムを分解 しかし、いずれもいまいちパっとしない気がします。awkやrubyでは あれだけ簡単に扱えるデータ形式ですので、C++でも何か適切な方法が 用意されてるのではないかと思いました。 皆様方は、この状況でどの様な実装をされるのでしょうか? 御教示頂けたら幸いです
779 :
君にできるかな?A :03/10/17 19:08
以下の配列をバブルソートでソートするプログラムをかきなさい。 #include <stdio.h> void main (void) { int a[10] = {4,6,3,8,3,4,5,7,9,8}; 注意:バブルソートです。他の方法のソートで行わないで下さい。
君にできるかな? アフォですか
>>778 データ形式が不明確だが778の形式ならば以下の構造体を定義しておく
struct hoge {
int a;
int b;
int c;
double d;
};
istream& operator>>(istream& i, hoge& h) {
i >> h.a;
i >> h.b;
i >> h.c;
i >> h.d;
return i;
};
で、よみこみ
std::vector<hoge> hoges;
ifstream file("hoge.txt");
hoge h;
while(1) {
file >> h;
if (file)
hoges.push_back(h);
else
break;
}
んな、感じかな。
もちろん実際は読込時の例外処理とか考えないとあかんけど。
>>778 どうでもいい状況ならstd::getlineの結果をstd::stringstreamで更に抽出するだろうし、
速度が必要なら一旦メモリマップトファイルに貼りつけたデータをswitchあたりで
自力で解析。
784 :
デフォルトの名無しさん :03/10/17 22:26
ゲーム作ってみたいのですが、画像を表示させることができません。 C言語でピットマップなどの画像ってどうやって表示させるのでしょうか? もしよければC言語でゲームつくるなら、ここをみろ!っていうHPとか教えてください。
すごいね、なんか
だれでも最初は初心者だ。
>>784 環境によって必要な知識がだいぶ違う
ぴっとまっぷじゃなくてびっとまっぷ
_LCC # LSI C-86 compiler's configuration file -DLSI_C -XC:\LSIC86\BIN -LC:\LSIC86\LIB -IC:\LSIC86\INCLUDE -T -O -acdos.obj $LSICOPTS &#Command line argument will be inserted here -lknjlib -ldoslib -v エラーメッセージ hello.c 1: can't open: stdio.h: No such file or directory WinMe、LSIC-86試食です。長くなってすみません。
おまいが作ったディレクトリの名前と _LCCに設定してあるディレクトリの名前をよーく比べてみ
795 :
デフォルトの名無しさん :03/10/18 01:42
784の者なんですけど、Cでゲームって作れますよ ね? Win上で動くやつを作りたいんですけど。
ゲーム会社入りたいと思って求人とか調べてたら、C言語が必須のような印象をうけました。
そうして、「そうか!C言語でゲームを作っているのかぁ」って思って、
自分もCでゲームを作れるようになってみようと考えたのですが、
C言語でゲームを作っているっていうところって、間違えていますか?
本にもC言語関係のHPにもビットマップとかの画像の表示について
まったく書いてないような気がするんです。絵を表示させることもできないのです。
配列とか構造体などC言語入門とかの本に書いてあることは、なんとなく理解できました。
文字とか数字とかをあやつることはなんとなくできました。
でも、絵を表示させる方法がわからないんです。
PCゲームつくるとしたら、本当にC言語をやっていったらいいのでしょうか?
まずは、簡単そうなトランプとかのゲームでも作ってみたいです。
>>786 さん
返事ありがとうございます。
環境って何のことですか?コンパイラのことですか?VC++6.0ってのを
使っています。ヒントになることなら何でもいいです。教えてください。
自分だけじゃ限界感じました。お願いします。
>>787 さん
返事ありがとうございます。
StudyCについてちょっと調べてきたのですが、
動画などはStudyC独自の関数(たぶん graph.h って関数のことかと)
を使うってことになってるみたいなんです。
ってことは、これでゲームを作ったら、StudyCというのに依存した
プログラムしか書けなくなってしまうような気がします。
元からある関数だけでは、画像表示とかできないのでしょうか?
お願いします。この本みてみろ!とかここで調べろとか、C言語より こっちの言語勉強しろとかなんでもいいです。何かヒントくださいTT
>>796 > C言語の勉強が目的なら、まずWindowsのAPIの使い方を覚えるところから始めないとね。
Win32 でまっとーなウィンドウアプリケーションを作るとなると、窓を開いて終了するだけでも
必要な知識が多い。ゲームみたいに Win32 標準のコントロールなどほとんど使わない
プログラムなら、まじめに Win32 API 勉強するより SDL でも使った方が良いと思うぞ。
「NormalWindow」「DialogBox」というクラスがあって、この人達は 「Window」という抽象クラスを基底としています。 Windowで純粋仮想関数となっているのはCreate()というもの なんですが、NormalWindowとDialogBoxのCreate()はそれぞれ 全然異なったパラメータを要求するので、WindowでのCreate()の宣言が 定まらず困ってます。どうすればよかとですか。
>>799 >Windowで純粋仮想関数となっているのはCreate()というもの
>なんですが、NormalWindowとDialogBoxのCreate()はそれぞれ
>全然異なったパラメータを要求するので、
この時点で設計を見直したほうがいいように思う。
もともと純粋仮想関数ってインターフェースを統一するための仕組みじゃ?
799 どういう設計にすればいいですか? 800 設計見直した方がいいですよ
STD(sexually transmitted disease)を使うと楽だけど、 あまり早くないと友達が言っていたのですが本当ですか。
一つの方法としては、 Window *CreateDialogBox(DialogArg *da) { DialogBox *d = new DialogBox(); d->CreateDialog(da); return d;} Window *CreateNormalWindow(WindowArg *wa) {...} みたくする手がある。
>>799 Window#Create(const CreateStruct&);
class CreateStruct;
class WindowCreateStruct : public CreateStruct;
class DialogBoxCreateStruct : public CreateStruct;
805 :
デフォルトの名無しさん :03/10/19 04:50
基本クラスで純粋仮想関数って定義する意味あるんですか?
あー、分かった。ありがと
解脱するの早いぞ
810 :
デフォルトの名無しさん :03/10/19 20:51
Edit1->Text = "阪神"; Edit1->Text +="優勝"; これでEdit1が阪神優勝にならないんですけど、 追加するには「+=」じゃなくて何にしたらいいんでしょ?
Edit1->Text = Edit1->Text + "優勝";
>>810 環境書いてね
VCL(だよね?)のプロパティは実質関数の呼出しだから、
>>811 にしないとダメ。
ヘルプ見てごらん。
あー、阪神ダメぼ。(つДT)
>>811 >>812 さんきゅ、いつも>811のやり方でやってたけど、
長くなるからイヤだったんですが、仕方ないですね。
ありがとうございます
814 :
デフォルトの名無しさん :03/10/19 21:38
関数の途中で残りの処理をスキップしたくなった時ってどうすればいいんですか? ifとかで条件分岐せずに残りをすっとばしたいんですが。 continueとかbreakとかなのかな、と思ったんですが違うようだし。 よろしくお願いします。
>>814 何を言いたいのかよく判らんが
多分、return
817 :
デフォルトの名無しさん :03/10/19 22:41
>>815 >>816 ありがとうございます、returnで備後でした。
あ、ついでにもう一個教えてもらいたいんですが、
hogeという 'char *' 型を演算子で比較したいんですが、こういう場合はどうすれば…。
if(hoge==false)
とやると 'bool' 型は 'char *' 型に変換できないとか言って怒られてしまうんですが。
なんかの方法でキャストでしょうか、よくわかりません…。
>>817 比較ってのは何かと何かを比べることだが、
その場合はhogeを「何と」比較したいんだ?
>>817 よ。ここは初心者スレだからどんな初歩的な質問もヲケだが、
日本語の初心者、一般常識の初心者は歓迎されないぞ。
質問するときは、他人が読んで判るような文章を書こうや。
returnを知らなかったとはすごい勉強の仕方ですね。がんばれ。
>>818 >>819 すいません、えーと比較というか、今は 'char *'型のhogeに何も入っていないことを
確認したかったのでfalseの場合を調べてみたんですが、前述のように上手くいかなかったので
'char *'型には何か別の比較演算子セットがあるのかと思ったんですよね。
でもよく考えると(=、<=)とかの比較演算子自体は別に間違ってるはずもないですね…。
質問の仕方をより限定的にわかりやすく変えてみます。
左項に書いた'char *'型に何もデータがないことを示すのは
右辺にfalseじゃなくて何を入れたらいいんでしょうか?
よろしくお願いします。
>821 とりあえず君は std::string を使ったほうがいいかと。 それじゃぁ、勉強にならないか…
>>821 if ( !hoge )
>>822 うん、なんかC++の文字列クラスとchar*を同じに考えてるような気がする。
全然別のもんだぞ。char*使うならポインタの勉強をちゃんとしないとな。
>>821
>>823 > if ( !hoge )
あ!それやったんですよ、自分。
で、コンパイルエラーは出なくなったんですが、
値がないはずなのに、ifの中身が実行されなくて。
char *hoge;
if(!hoge) Edit1->Text="ありません";
なんででしょうか。
むしろ if (!*hoge)
つまり 「文字列が空」とはどのような状態なのかよく考えろ ってこと
あ、ちなみになぜ初心者でよくわからないくせにポインタなんか使ってるかというと、 単純に関数の引数がchar*型なんでそれをそのまま使ってるってだけです…。
825さんのでいけましたー。 その場合の「*」は単純に、「こいつはポインタだよ」って意味なん、ですよね? 826さんの説明でちょっと混乱しちゃったんですが。 それとも「オールマイティな文字列」を表す「*」でしょうか…。 うー(;´Д`)
ポインタの基礎からやり直せ
うー、うー(;´Д`)
832 :
デフォルトの名無しさん :03/10/20 01:36
googleで一応調べてみたのですが、お手上げです。 お教え願います。 プログラム自体は #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> のヘッダをインストールしていますが、コンパイルすると 未定義のシンボル 最初に参照しているファイル socket /var/tmp/ccXXXXXX.o(Xの部分はランダムな文字列 inet_addr /var/tmp/ccXXXXXX.o コンパイルのたびに変わる) connect /var/tmp/ccXXXXXX.o ld:重大なエラー: シンボル参照エラー。a.out に書き込まれる出力はありません。 collect2: ld returned 1 exit status ・・・と出てしまいます。ほぼサンプルプログラムのままです。何がいけないのでしょうか。
>>832 そんなクソ厨な質問するわりには、おそれおおいヘッダファイルだな。
答え:おまえの心がけがいけない。
まずはHello worldからはじめなさい。
リンカがエラーだしてんだろ?おそらくgccで。 で、なんかlibが足りねえんだろうな。 環境依存だから知らないけどさ。
#include <stdio.h> int main(void){ int i; int data[20]; printf("20個の整数を入力してください。\n"); for(i = 0; i < 20; i++){ scanf("%d" , &data[i]); } for(i = 0; i < 20; i++) if(data[i] == 3 && == 8){ printf("%d" , 1); } else if(data[i] == 3 || == 8){ printf("%d" , 2); } else{ printf("%d" , 3); } return(0); } このプログラムをコンパイルしようとすると kadai6-4.c:13: parse error befor '==' token って出てしまいます。どのようにすれば良いのでしょうか? 環境はGCC使用でWinXPです。
>>837 まず、/var/tmp の下に作業ファイル残りまくってたらとりあえず、どっかにやっちゃう。
>>833 のいうとおり簡単なプログラムにいろいろ追加していってどこでエラーが出るのか切り分ける。
その結果が知りたい。
ん? SubOS5.8 ?
>>836 13行目のif()の中身の書き方がおかしい
とコンパイラはのたまってるわけだが…そのとおりだと思う
>>835 ではとりあえず中調べるなりしてみます。
あとはそれっぽいライブラリを足してみます。
>>841 なんか socket() inet_addr() connect() は libc みたいだしなぁ。
-lc かぁ。
>>840 では、もしdata[i] が3かつ8を満たすとするならば、とするにはどのようにすれば良いのでしょう?
>>843 3 または 8 であることを満たす式はこうだけど
data[i] == 3 || data[i] == 8
入門書へgo!ですよ
>>844 ありがとうございます!解けました!
頑張って入門書を読んで行きたいと思います。
>>843 3 かつ 8 って...あり得ねぇ。
常に偽じゃねぇか。
たくさんのレスありがとうございます。
>>838 がんばってそれもやってみます。
>>842 gcc XXXX.c -lc これでだめでした。
一応 gcc testSMTP.c -lsocket -lnsl これでa.out が生成されるようになりましたが、正しいのでしょうか・・・
>>849 あってるよ。Solarisはlibsoketとlibnslが必要。
>>850 へぇ~。というか、フツーに man 引けば出てくるネタってことですよね?
>>851 確認しました。
すんません、お騒がせしました。
853 :
デフォルトの名無しさん :03/10/20 03:43
http://www.openspc2.org/format/PGM/ すいません。PGM形式の画像をファイルから読み込んで配列aに入れる
プログラム分かりますか?PGM形式は上のURLを参考にしてください。
バイナリ形式でお願いします。
unsigned char a[512][512];
fp=fopen("test.pgm","rb");
この続きをお願いします。
>>854 自作のものと他人のとを比較したいんでしょう。解答不要。
856 :
デフォルトの名無しさん :03/10/20 07:53
ちょっと質問なんですが、 特定のメンバだけ継承させるって事できますか? 例えば public: int publicVar; void PublicMethod(); とあったときに、このクラスをprotected継承した時に PublicMethodだけpublicで扱う、ということは可能なんでしょうか?
>>856 public:
using Base::PublicMethod;
public:
void PublicMethod(){ return Base::PublicMethod(); }
時と場合に応じて使い分けれ
858 :
デフォルトの名無しさん :03/10/20 13:06
スレ違いならスルーして下さい。プログラムをちょっと学んでいる者 です。 先日、友人に論理的と物理的の違いについて説明しろ、と言われ、「たとえば物理的な破損は ディスクに傷がついてしまった場合で、論理的な破損は、必要なデータが失われた場合だ」 と言ったら、「ミクロな視点で見たら、論理的な破損も、ディスクが書き換えられる(電子、陽子とか?) という物理的な話じゃないか」と言い返されました。 そもそも僕の認識が間違っていたら済むことなんですし、友人の言い分も屁理屈に聞こえる のですが、言い返せなかったことが悔しいです。なんと答えるべきだったのでしょう?
859 :
デフォルトの名無しさん :03/10/20 13:10
>>857 using初めて知りました!
解決できました。ありがとうございました!
>>858 ディスクが書きかえられたのは、ミクロの視点だろうがなんだろうが、破損ではありません。
もまえも気づけよ。
>>858 簡単じゃん。
ろんり-てき 【論理的】
論理にかなっているさま。論理を追って考えるさま。
ろんり 【論理】
(1)思考の形式・法則。議論や思考を進める道筋・論法。
(2)認識対象の間に存在する脈絡・構造。
ぶつり-てき 【物理的】
物理学によって認識したり、されたりするさま。
論理的に明らかにスルーすべきだろ。
863 :
デフォルトの名無しさん :03/10/20 13:33
>>860 破損は例えです。ディスクが書き換えられたという点で結構です。
>>861 ありがとうございます。論理と物理の違いは、わかりました。
ただ、やはり論理的に変更を加えられるという事は、物理的にもディスクに
書き込まれている状態が変わっている。と言えてしまうのでしょうか。
その点をどう考えるべきかが知りたいのです。
>>863 ディスクという物理媒体から切り離して思考しる。
数がある。1+1=2という法則がなりたつ。これが論理。
数は電子だ陽子だ物理学に縛られることはない。
ディスクがどうのというとそういう屁理屈が出てくる。
865 :
デフォルトの名無しさん :03/10/20 14:04
思考も脳細胞同士のネットワークが云々とか言い出す悪寒
>>866 それ使える。完全に版違いなのでここまでにしますが、友人の理論を
進めていくと論理そのものの否定につながりますな。END
ってゆーかなぜC/C++スレを選んだw
環境依存OKだから・・・かな?
>>868 お答えします。”間違えましたすいません”
いちね
874 :
デフォルトの名無しさん :03/10/21 14:50
・・気を取り直して、初心者の私の質問を聞いてください。 環境は、VC++7を使っています。 よろしくお願いします。 普通、関数を呼ぶときにフラグを立てたいときは、intを使って 引数に渡すと思います。 ↓こんな感じ int APPLE = 0; TakeFruit(APPLE); しかし、私は最近こういう引数が一つの場合は、 CStringを使ってそのまま"Apple"とかを 渡して処理しています。 単純な話、使うメモリが莫大に増えるわけでもないし、いいかな~ とか思ったのです。 しかし、最近処理速度が気になりだしました。(そのせいかどうかは、 わかりませんが。) 呼び出された関数では、 if(csFruitKind == "Apple") {・・・} というような記述を多様しています。ひょっとしたら こういうとき、intで比較する時より、ずっと時間がかかったりするのでしょうか? あるいは、他にも止めた方がいい理由とかあったら教えてください。
>>874 CStringはクラスでoperator == がオーバーライドされていて文字列比較できるの?
それとも単純に文字列ポインタの比較?(そんなわけないよね)
つーかそもそもクラスのポインタが渡されるだけだから時間は比較の部分だけじゃない?
intよりは時間かかるだろうけどそれほどでもないような・・・
>>874 enum使えよ。それも面倒ならせめてconst CString&で渡せよ。
引数をconst CString&にしたとしても、 foo("Apple");なんてしてたら一時オブジェクトが作られて無駄、 整数の比較で済む所を文字列比較するのも当然無駄。
もともこも? 時間がかかるのか、止めた方がいい理由があるのか、という質問だろ。 CStringを使用するのが前提なんて書いてないぞ。
問1 文字列を入力として受け付けて、その文字列を逆順にしたものを出力せよ。 問2 言葉当てゲームを作る。入力として文字列を受け付けて、あらかじめ定めておいた文字列と等しければBingoと出力して終わる。 異なっていてかつ文字の長さが等しければsame length、 入力された文字列の方が長ければlonger、 入力された文字列の方が短ければshorterと出力する。 Bingo以外の場合は繰り返し入力を受け付ける。 問3 文字列を入力として受け付けて、その文字列の中に含まれる数字の合計を出力せよ。 分かる人いますか?
>>879 >普通、関数を呼ぶときにフラグを立てたいときは、intを使って
>引数に渡すと思います。
こう書いてあるじゃん。そのくらいわかってるだろ。
>>881 > こういうとき、intで比較する時より、ずっと時間がかかったりするのでしょうか?
> あるいは、他にも止めた方がいい理由とかあったら教えてください。
CStringをどう使うかを聞いているように読めるのか?
>>883 いませんがなにか?
CString使ってもずっと時間がかかるわけじゃないし、わかってやってるんだろうから
CString使わなきゃいけない事情があるかもしれないだろ。
>>877 const CString&にしないと一時オブジェクトが作られて
更にそれをコピーしなければならないので2倍無駄。
>>874 CPUの立場で考えりゃ,intの場合比較命令一発。
文字列比較やCStringの比較演算子じゃ,わざわざ関数呼びださにゃらなんのだぞ?
速度比較なら100倍ぐらい違ったって,全然おかしくねぇ。
>>875 ~888
色々な示唆を頂きました。ありがとうございました。
やはり比較部分で大きく差が出てしまうんですね。
これから変な癖をつけずに、intを使っていこう
と思います。
未熟者の質問でしたが、お付き合い頂きありがとう
ございました。
>>886 > const CString&にしないと一時オブジェクトが作られて
> 更にそれをコピーしなければならないので2倍無駄。
さらにコピー?2倍?
引数の型をCStringにした場合は、
文字列定数を引き数に渡すとCStringが作られ、CStringを引数に渡すとコピーが作られる。
引数の型をconst CString&にした場合は、
文字列定数を引き数に渡すとCStringが作られ、CStringを引数に渡すとそれへの参照が渡される。
「2倍」って何に対して言ってるの?
891 :
デフォルトの名無しさん :03/10/21 19:27
文字列を入力として受け付けて、その文字列中に含まれる数字の合 値を求めよ。 例: a1b23g4 と入力された場合、1+2+3+4 で10 を出力する。
893 :
デフォルトの名無しさん :03/10/21 19:49
おまえできないの?さむいね。
これが出来ないような人は宿題スレへGO
CString のコピーは参照カウント使うので速度にはほとんど影響しない。 明らかにオブジェクト生成と比較にかかる時間が問題だろ。
軽く見ても100倍以上CString版が整数版に比べて遅いのは確実かな
>>896 漏れの環境だと17倍ぐらい。
#include <afx.h>
#include <iostream>
enum {Apple = 1};
__declspec (noinline) void TakeFruit_int(int f)
{if (f == Apple) rand();}
__declspec (noinline) void TakeFruit_CString(CString f)
{if (f == "Apple") rand();}
__declspec (noinline) void TakeFruit_CStringRef(const CString &f)
{if (f == "Apple") rand();}
inline unsigned __int64 rdtsc() {__asm rdtsc}
#define run(f, arg) \
{ Sleep(0); \
unsigned __int64 start = rdtsc(); \
for (int i = 0; i < 1000000; i++) f(arg); \
unsigned __int64 end = rdtsc(); \
std::cout << #f ": " << end - start << std::endl;}
int main() {
run(TakeFruit_int, Apple);
run(TakeFruit_CString, "Apple");
run(TakeFruit_CStringRef, "Apple");
return 0;
}
今、自分のコードからCString引数を抹消しているところです・・。 そこでもう一つ疑問に思ったことがあります。 私のコードではSTLのmapやmultimapを使っていて、そのkeyとして やはりCStringを設定してます。 イテレータのfindの引数としてこれらを指定する場合、速度は どうなるのでしょうか?mapのkeyとなると、ただの関数の引数とは 話が別なのでしょうか?
>>898 データの型は、速度面からではなく、用途で決めるのが普通だ。
文字列が必要なのであればCStringを、整数で十分ならintを使え。
std::map使うなら、std::stringの方が相性よくない? で、std::mapは内部を追っかけてないからなんとも言えないけど、 速度重視ならそもそもstd::map以外の選択肢を考えた方がいいのでは?
>>900 内部追っかけなくてもCompareファンクタ渡せる時点で分かるだろ
>>899 ~900
グラフィクス系のプログラムを書いているので、
最近、いろいろと処理速度というものが気になりだしました。
今日、プロファイリングというものを知ったので、色々自分で試し
てみようと思います。御助言ありがとうございました。
キーに文字列使うんならmapよりもhash_mapのほうがいいけどな、STLにはないが。
環境依存OKだからSTLになかろうが全然OK
CStringのマップの速度が気になるグラフィックス系ってのも良くわからんな・・・ まぁstd::map< std::string >かCMapStringToXXX(or CAtlMap)のどっちかにそろえて欲しいところだ。
ホントに初心者な質問で申し訳ないのですが ファイル出力を4bit(8bit未満)で出力するには どうしたらよいのでしょうか。 (fwriteはバイトごとですよねぇ…。) 今、8bitの画像データを代表サンプル16個(4bit)で 置き換えてデータ圧縮しようとしているのですが ファイルに出力する段階でいきづまりまして…。 どなたかご教授お願いします。m(_ _)m
えーっとすいません、ビットシフトするってことですよねぇ ちょっとよくわからんのですが例えば 0000 1101、0000 1111、0000 1001... ってのがあるとすると ↓ 1101 0000、1111 0000、1001 0000... にするってことですか? でも、これだと結局下の4bitが残って ファイルに出力する時には8bit必要そうなんですけど、、、。 あ!すいません申し送れましたが 言語はC使ってます。
>>909 ファイル(の中身)は一般にビット列ではなく、バイト列です。
そうして、ファイルフォーマットというのは自明ではないので、その「4bit データの列」を
どのようにバイト列に変換するかは、あなたの自由です。一例として
>>908 のやり方は、
1バイト目の上位4bitに最初のデータ、同下位4bit に次のデータ、2バイト目の上位4bitに
また次のデータ、... というようにする方法ですが、もしそうしたければ上位と下位を逆に
使ってもいいですし、バイト内部のビット順を変えても構いません。
あー、なるほど、噛み砕いて説明していただいた おかげでなんとなくわかりました。(^^;) ありがとうございました。
912 :
デフォルトの名無しさん :03/10/23 22:07
プログラミング経験が全くない香具師が「なんでバグなんて起きるの? 処理する順番にちゃんとプログラム書けば間違いようがないと思うんだけど」 と言ってた。説明してやろうと思ったが、具体的な例を挙げても意味や単語が 通じないみたいで困った。 どういう説明したらバグのないソフトを作る大変さを分かってくれるのだろう。
人間は間違えるんだよ。
自分の予想の範囲内でプログラムが動くなら、バグを見過ごす可能性は少ない。 しかしプログラム・プロジェクトが大きくなればなるほど、設計者・開発者の想定外、 盲点となる状況は増えてくる。
915 :
デフォルトの名無しさん :03/10/23 22:23
最低限の品質を保証するだけの時間を確保しないから。 つまり、バグの多いシステムというのはだれかがコスト面で 安く済まそうとしてるから工数が取れない。 そんな心当たりは無いですよね? と質問で返す
>>912 ケアレスミスの例だと、こんな感じの問題が100問あったとき、
おまいは一問も間違わずに解けるのかと。
9332621544394415268169923885626670049071596826438162146859296389521
* 7599993229915608941463976156518286253697920827223758251185210916864
>>916 プログラミングはそんなに難しくないだろ
>>917 そうか? 12*34 と同じようなもんだろ。
いくら桁数があろうが、順番にちゃんと掛けて足していけば
間違いようがないと思うんだけど。
そういう状況が、言ってみれば数百重なるような物だけどな。 十分な時間を貰えれば良いけど。 いや、十分な時間というのは∞なんだけどね、言い訳くらいさせろよと…
皆さん、書く時どんなエディタ使ってるんですか?
>920 メモ帳
ごーまるぅ~さぁん♪ edlin ♪
924 :
デフォルトの名無しさん :03/10/23 23:01
xyzzy
vi
hidemaru
928 :
デフォルトの名無しさん :03/10/24 11:22
#include <stdio.h> #include <stdlib.h> #include <math.h> int test(long *b[]); int main(void) { long b[10]; test(&b); } int test(long *b[]) { *b[0]=10; } ↑のコードで関数test内でエラーが出るんですが、多分根本的に 勘違いをしているんだと思います。なぜエラーになるんでしょうか。 XP SP1 VC++.net2003
929 :
デフォルトの名無しさん :03/10/24 11:24
>>928 &bの型はlong **じゃなくてlong (*)[10]
>>929 resありがとうございます。
なるほど、指摘ポイントはわかったのですが、
どう直すといいのかがよくわからないです。
直すべきとこはどこなんでしょうか。
>>928 それか、引数をlong b[]かlong*bにして、関数での計算をb[0]=10にする。
>>931 なるほど、よくわかりました。ポインタ周りが
まだはっきりしないんでいろいろ比べてみます。
ありがとうございました。
933 :
デフォルトの名無しさん :03/10/24 12:35
1.0 2.0 3.0 -1.1 -2.5 -3.3 上記のように記述してあるテキスト形式のファイル から上記の数字を読み取ってdouble型の少数として 使うにはどうすればよいでしょうか?
934 :
デフォルトの名無しさん :03/10/24 12:47
>>933 丸投げいくない。
ファイルを開いて何かを読み込むということぐらいは出来るんだろうな?
できませーん(ワラ
>>934 俺は とりあえずメモリーに読み込んでから strtod 派だ。
for(int i=0; i<10; i++) { std::string hoge; hoge = "ループ回数: " + i; std::cout << hoge << std::endl; } のようにやりたいのですが、std::stringの+演算子にint型の定義がないようでこの方法だとコンパイルエラーになります。 固定長文字列にsprintfしてstringに入れる方法と自前でstring継承してクラス作成する以外に なにか方法はないでしょうか?
>>938 そのソースに限っていうなら
for(int i=0; i<10; i++)
{
std::cout << "ループ回数: " << i << std::endl;
}
でいいんだが、そーゆー話じゃないのであればstringstreamを使うといい。
>>939 ありがとうございます
_| ̄|○ VCL(AnsiString)ばかり使ってるとstringって意外に不便だ‥・
>>940 >hoge = "ループ回数: " + i;
AnsiStringだってエラーだよ。試してごらん。
んで、
>>939 のいうstringstream版
std::stringstream str;
str << "ループ回数: " << i;
std::cout << str.str() << std::endl;
stringstreamがあるからstringにはAnsiStringみたいなてんこ盛りの
コンストラクタ・演算子は必要ないわけ。
>>935 すいません。完全に他人任せな聞き方でした
自分の持ってるCの本はちょっち詳しくないんですが
テキストファイルの場合とりあえずファイルをオープンして
fgetsで文字列を読み込むことができるってあったんですが
文字列で読み込んでも意味が無いんで悩んでたんですが
934の人の言うとおりfscanfってのを使えばできそうですね
また勉強しなおしてきます(w
>>937 漏れは取り敢えずメモリに読み込んでからsscanf()派だ。
945 :
デフォルトの名無しさん :03/10/25 14:42
日本語版C言語開発環境のフリーのやつで お薦めのやつってありませんか?
日本語版じゃなきゃいけない理由がさっぱり分かりません
947 :
デフォルトの名無しさん :03/10/25 14:50
英語がわからないからです
>>947 パターン決まってるからすぐわかるようになるよ、
わからなければGoogle様にお伺いをたてるか、辞書引け
949 :
デフォルトの名無しさん :03/10/25 15:24
すいません、ListViewとアイコン絡みで行き詰まってしまいました。 最終的な質問はListView1のハンドルを得るには?という単純なものですが、 次のような過程を経ておりますです。 1)ListView1にシステムで使ってるアイコンをそのまま全部表示させたい 2)拡張子に関連付けられているアイコンを表示させる方法を発見、 でも拡張子のないファイルのアイコンは表示されなかった。(当たり前) しかも検索中に毎回実行するためか表示も遅いし、 ImageList1->AddIcon( Ico );でどんどん同じアイコンが加算されていって アプリが落ちる。ImageList1->Clear();とかdeleteとかを工夫して使おうとしたけど 上手くアイコンが表示されない。このやり方はやんぺ。( ゚д゚)、ペッ 3)「システムイメージリスト」というものがあることを発見。 HIMAGELIST hImageList; SHFILEINFO sfi; hImageList = (HIMAGELIST)SHGetFileInfo("", 0, &sfi, sizeof(SHFILEINFO),SHGFI_SYSICONINDEX | SHGFI_SMALLICON ); ↑これでどうやらシステムイメージリストとやらは捕まえたらしい。(`・ω・´) でもListView1でこれを使う方法がどうしてもわからない。 4)ListView_SetImageList()というのを遂に発見。 しかし今度はそれに代入するListView1のハンドルがわからない…。 試しに↓こんな感じでそのままListView1って突っ込んでみたけど駄目だった(;´Д`) ListView_SetImageList(ListView1 , hImageList , LVSIL_SMALL); ここで力尽きてしまいました。 どうかお力添え願えませんでしょうか。 またそれをやるのならこっちの方が早い/速いとかアドバイスなどございましたら よろしくお願いします。
あ、windowsXPのBCB6です。
ListView1->Handle
>>951 あぁぁぁぁ!ありがとうございます!
これで1週間以上も足止め食ってたのが哀しすぎる…。
もうやろうとしてたことが最終局面なんですけど、最後
検索で見つかった各ファイルに先ほどセットしたシステムイメージリスト内の
アイコンを割り振っていくはどうしたら良いのでしょうか?
見つかったファイルと肝心のImageIndexの値とをどうやって結びつけるのかが
わかりません。
ListView1->Items->Item[0]->ImageIndex = ???;
やや丸投げっぽくて申し訳ありませんがよろしくお願いします
あ、できました。 // ListViewにファイル、フォルダを表示するコールバック関数 WIN32_FIND_DATA fd; // 列挙情報取得用 HANDLE hFind; // 検索用のハンドル SHFILEINFO fileinfo; AnsiString Pattern = DirName + "\\*.*"; // ワイルドカードで全ファイル検索 hFind = FindFirstFile( Pattern.c_str() , &fd );// 最初のファイルを検索 if( hFind != INVALID_HANDLE_VALUE ){ do{ // ファイルが無くなるまで続ける // . と .. は無視する if( strcmp( fd.cFileName , "." ) != 0 && strcmp( fd.cFileName , ".." ) != 0 ){ if( fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ){// フォルダ属性か調べる // 現在のフォルダに見つかったフォルダを追加 AnsiString SubFolder = DirName + "\\" + fd.cFileName; if(CheckBox3->Checked)EnumFolders( SubFolder , Items );// サブフォルダを検索する if(CheckBox2->Checked){ //フォルダもリストに加える場合の処理 Items = ListView1->Items->Add(); Items->Caption = fd.cFileName; AnsiString Folder =ExtractFileDir( fd.cFileName ); ::SHGetFileInfo( fd.cFileName, NULL, &fileinfo, sizeof(fileinfo),SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SMALLICON ); Items->ImageIndex = fileinfo.iIcon; } }
else{ // アイテムを追加 if(CheckBox1->Checked){ Items = ListView1->Items->Add(); Items->Caption = fd.cFileName; AnsiString Ext =ExtractFileExt( fd.cFileName ); SHFILEINFO fileinfo; ::SHGetFileInfo( Ext.c_str(), NULL, &fileinfo, sizeof(fileinfo),SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SMALLICON ); Items->ImageIndex = fileinfo.iIcon; } } } } while( FindNextFile( hFind , &fd ) == true ); // ハンドルを閉じる FindClose( hFind ); } 大分早くなりましたが、ただ、ファイル数が500個を超えると まだ他の処理を行わせることを考えればちょっと遅く感じます。 もっとスマートにListViewに表示させるのにはどのへんを変えればいいんでしょうか。 あと見つかったファイルがフォルダの場合もちゃんとIconIndex数に3という数字が返ってくるんですが、 調べてみるとシステムイメージリストのフォルダアイコンのインデックス数は ウチのXPでは4になってるみたいなんですが、これは Items->ImageIndex = fileinfo.iIcon+1; という風に1を足してやらないといけないんでしょうか?
ソースを読もうと思ったけど、途中で嫌になった・・・。 とりあえず、2点だけ。 「.」「..」をスキップする処理はループから出せ。ループするたびにチェックするのは全くの無駄。 取得した拡張子ごとのアイコンのindexを記録しておけ。ファイルごとにSHGetFileInfoするのは無駄。
>>956 ああ、すいません、そんな馬鹿ソースだったとは…。
チェックボックスによる条件分岐とか、関係ないものを削除するの忘れてましたぁ。
とりあえずおっしゃった二点を修正してみようと思います。
割り込みになってしまって失礼します。 今、抽象クラスと多重継承で頭を悩まされています。 アドバイスしてもらえると助かります。 以下のように class AbstractA { virtual void func() = 0 }; class ConcreteA { void func() { ....; return; } }; class SubA : public AbstractA, pubic ConcreteB { }; main(){ SubA a; a.func(); //ConcreteB::func()が呼ばれる? return 0; } (一旦切ります)
(
>>958 の続き)
AbstractAをメンバ関数名の継承のみに使い、
ConcreteAを継承することで初めてSubAが
課せられたメンバ関数の実体を持つようにしたいのですが、
上記の状態ままでは、ConcreteAとAbstractAのどちらのfunc()を
呼んで良いか決定できずコンパイルエラーになりました(VC++6で)。
とりあえず、SubAとConcreteAでAbstructAを仮想継承してみることで、
望むとおりConcreteA::func()を呼び出すようになったのですが、
「2つ以上のメンバが同じ名前を持っています。'ConcreteB'から継承します」云々
のような警告を出されてからです。
他に方法はないが危険な方法なので警告されているだけならよいのですが、
もっと正当な実現方法があるのなら教えてもらえないでしょうか?
よろしくお願いします。
あ、、、少し単純化して書きすぎたかも、 ConcreteAクラスの方には、メンバ変数が定義されていて funcはそれを利用しています(ほとんどメンバのGetterとSetterなんですが)。 なので多重継承を考慮するとインターフェイスと実体を分離して扱いたいのです。 補足失礼。
>>957 コードそのものは悪くないよ。
ただ、第三者には判りようがないオブジェクトが入っているのと
インデントがないのと
どうやら中カッコが正しく照応していないらしいのが問題。
この辺は人にコードを見せるときは気ぃつけてね。
>>958 をい、ConcreteBってなんや?
それを示さんと他人にはチンプンカンプンだぞ。
おわ。ひどい間違いを…… ConcreteB -> ConcreteAです 実際に試しているのは、 AbstactSize{ public: virtual const Size& GetSize() const = 0; virtual void SetSize(const Size&) = 0; }; ConcreteSize{ protected: Size size; public: ConcreteSize() : size() { } virtual const Size& GetSize() const { return size; } virtual void SetSize(const Size& size) { this->size = size; } }; Sizeはint[2]のラッパークラスです。 またもや申し訳ない。
>>963 ConcreteSize は AbstactSize を継承してるわけではないのか?
普通、具象クラスは抽象クラスのサブクラスとして作ると思うんだが。
多重継承で指定したスーパークラス呼びたいなら
クラススコープで指定して呼べば?
>ConcreteB -> ConcreteAです 意味不明。 アローの意味ぐらい知ってるよな? ConcreteAはConcreteBのメンバなのか? 自分言葉で書くな。 だれでも判るきちんとした日本語、きちんとした表現で書け。 何を言いたいかさっぱり分からないから以下はあてずっぽう。 class SubA : public ConcreteA { にする。 AbstractAを継承する必要はない。
>959 > 上記の状態ままでは、ConcreteAとAbstractAのどちらのfunc()を > 呼んで良いか決定できずコンパイルエラーになりました(VC++6で)。 俺のところ試してみたら、 「AbstractAから継承した仮想関数の実体がない」 と言われたんだが。 > とりあえず、SubAとConcreteAでAbstructAを仮想継承してみることで、 この状況でどうやって仮想継承ができるの? >965 >ConcreteB -> ConcreteA これぐらい読みとってやってもいいんでないの? class名にアローが使える訳ないんだし。んで、これならOK? => or →
>>966 >>ConcreteB -> ConcreteA
>これぐらい読みとってやってもいいんでないの?
>class名にアローが使える訳ないんだし。んで、これならOK? => or →
それなら
>>965 で答えが出てるんだが?
細かく書こうとしたらまた長くなってしまった……。お許しを。
>>964 最初はそのやり方でやっていたんですが、それだと下のようなクラス階層を作るとき
<通常の継承>
クラスB-クラスAB\
クラスA< クラスD (クラスAが二重に継承される)
クラスC-クラスAC/
クラスABとクラスACの両方がクラスAを継承しているために
ABとACを継承したクラスDでクラスAが二重に継承されてしまいますよね。
そこで先のように メンバ関数だけを純粋仮想関数として記述したクラス AbstactA, AbstractB,AbstractCと、 (以下AbstractをAbsと略します) AbstractA、AbstractB、AbstractCをそれぞれ仮想継承し、その実体を記述したクラス ConcreteA,ConcreteB,ConcreteCを別々に作り、 (同様にConcreteをConと略します) AbsAとAbsBを仮想継承したAbsAB、AbsAとAbsCを仮想継承したAbsACを作って、 クラスDでは、AbsABとAbsACを仮想継承し、ConcAとConcBとConcCを通常の継承で継承する、 という形を採ってやる。 <AbsA,AbsB,AbsCからDまでは全て仮想継承> クラスAbsB-クラスAbsAB-\ クラスAbsA< \ クラスAbsC-クラスAbsAC---\ クラスD (二重に継承されるのは仮想関数名だけ) /| クラスAbsB-クラスConB--//| クラスAbsA-クラスConA--// クラスAbsC-クラスConC--/ <AbsA,AbsB,AbsCからそれぞれのConcまでは仮想継承。ConcからDまでは通常の継承> こうして二重継承の問題をとりあえず回避できたんですが、 警告も出るしどう見てもスマートな方法ではないかと思ってこちらに書き込んだのです。
>969 何をしたいのか解らないが、 とりあえず、多重継承を使わない設計を考える方が有意義だと思うぞ。
>>968-969 D では AB と AC のどちらの func を呼びたいんだ?
ちゃんと D::func を定義して、
その中でどちらの func を呼ぶか、
または両方呼ぶのかを自分で実装しないとあかんで。
>>968 基底クラスを複数継承してたら、なにか設計が腐ってると思っておけ。
自然にモデリングするとそうなる事もあるんだが、C++ 的には菱形継承は
避けた方が良い。たいていよく考えると代替案が見つかるものだ。
>>970 インターフェースなら複数継承しても、大した害はない。958 は説明が下手すぎて
何をやりたいか推測するしかないんだが、たぶん
1. 抽象基底クラスでインターフェースをいくつか定義 (I1, I2, I3, ...)
2. そのインターフェースに対応する実装を用意 (I1Impl, I2Impl, I3mpl, ...)
3. I1, I2 を継承したコンクリートクラス C12 を作成する際に I1Impl, I2Impl を Mixin 的に
使いたい。
っつー話なんじゃない? それだと I1Impl, I2Impl をクラステンプレートにするか、
C12 から I1Impl, I2Impl の対応するメソッドにメッセージを転送する関数を
自前で書くのが一般的だが。
みなさん色々とつきあってくださってありがとうございました。
説明不足のためにだいぶ煩わせてしまったようですみません。
確かにプログラム板で矢印をアロー演算子で書くのは気にしなさすぎでした、申し訳ない。
多重継承を使ったらどういう動きをするかを試しているので
>>970 のように言われると元も子もないのですが。
とりあえず自分でもう少し色々やってみようかと思います。
でも基本的に使わずに代替案を探した方がよいというのは肝に銘じて置きます。
>>966 で言われた結果は少々気になるので
今動かしているプログラムを挙げられるようにシェイプアップしていたのですが、
これ以上レスを潰すのもアレなので違ったアプローチも含めて色々やってみようかと思います。
>>956 どうも「.」「..」をスキップする処理をループから出すと動かないので
フォルダ属性がtrueかどうかの判定後に回してみました。早くなったようなならないような…。
void __fastcall TForm1::EnumFolders( const AnsiString DirName , TListItem *Items )
{// ListViewにファイル、フォルダを表示するコールバック関数
WIN32_FIND_DATA fd; // 列挙情報取得用
HANDLE hFind; // 検索用のハンドル
SHFILEINFO fileinfo; //SHGetFileInfo用
AnsiString Pattern = DirName + "\\*.*"; // ワイルドカードで全ファイル検索
hFind = FindFirstFile( Pattern.c_str() , &fd );
if( hFind != INVALID_HANDLE_VALUE ){
do{ // ファイルが無くなるまで続ける
if( fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){// フォルダ属性か調べる
if( strcmp( fd.cFileName , "." ) != 0 && strcmp( fd.cFileName , ".." ) != 0 ){ // . と .. は無視する
AnsiString SubFolder = DirName + "\\" + fd.cFileName; //現在のフォルダに見つかったフォルダを追加
EnumFolders( SubFolder , Items );// 同じこの関数でサブフォルダを検索する
(***フォルダとそのアイコンをリストビューに追加する処理***)
}
}else{
(***ファイルとそのアイコンをリストビューに追加する処理***)
}
}while( FindNextFile( hFind , &fd ) == true );
FindClose( hFind );
}
}
あとリストビューに追加時にSHGetFileInfoを毎回せずにindex値を記録しとけってことですが、 次のような処理しか思い浮かばなかったんですが、これってスタンダードな方法にも近いものなんでしょうか? if(構造体の中に拡張子の名前と一緒の変数名があるか){ その変数が持ってるindex値をファイルに割り当ててリストビューに追加。 }else{ 拡張子と関連づけられたアイコンのインデクス値を::SHGetFileInfoで 探してファイルに割り当ててリストビューに追加。 その拡張子名で構造体に登録しとく、値はインデクス値。 }
>969 class D :public ConsA, publib ConsB, public ConsC{..};ですまさないのは、 たぶん、AbsABとかAbsACとかを受けたい別のクラス/メソッドが存在する からだろうが、俺としてはAbsABを受けるより、素直にAbsA, AbsBの2つを 受けるとか、QueryInterface/dynamic_castを使う方法をおすすめしたい。
>968 class CA {public: virtual void funcA(){cout << "A";} }; class CB {public: virtual void funcB(){cout << "B";} }; class CC {public: virtual void funcC(){cout << "C";} }; class CAB : virtual public CA , public CB{}; class CAC : virtual public CA , public CC{}; class CD : public CAB , public CAC { public: virtual void funcA(){cout << "D";} }; void main(void) { CD d; d.funcA(); d.funcB(); d.funcC(); d.CA::funcA(); d.CAB::funcA(); d.CAC::funcA(); }
>>974 今気がついたが、FindFirstFileに失敗するとhFindが空になるからCloseFileがエラーだぞ。
>「.」「..」の処置
動かんということはないはずだが・・・。ま、今のでいいと思うけど。
でも、どうせ最初に返ってくると判っているので、少し横着をしようと思えば、
if ( FindFirstFile(Pattern.c_str() , &fd)==INVALID_HANDLE_VALUE ) return;
while ( strcmp(fd.cFileName , ".")== 0 || strcmp(fd.cFileName , "..")== 0 ) {
if ( !FindNextFile(hFind , &fd) ) {
FindClose(fd);
return;
}
}
do {
・・・
}
てなこともできる。
>indexの記録
思いついた方法でヲケ。
たとえば、
class IndexMap {
std::map<AnsiString, int> index_map;
public:
int operator()( const AnsiString& ext ) {
if ( index_map.find(ext) == index_map.end() ) {
//indexの取得
index_map[ext] = index;
}
return index_map[ext];
};
これのインスタンスをFormのメンバにして使う。
まぁ、こうしてもどれだけ速くなるかは判らんけど。
>978 完全にCから離れてWin32APスレの内容だけど、 FindFirstFile(),FindNextFile()のワイルドカード使用時に取り出すファイル名の順番に、 明文化された規則なんてあるの? 確かに文字順に来るみたいだけど…… たいした無駄じゃないし、精神衛生上、判定は共通ループ内のほうがよくね?
>>978 ありがとうございます。
やはりSHGetFileInfoがスピードのネックになってるのは確かなようなので、
アイコンインデクス値の記録方法は大変参考になります。
自分で全て考えるのに不安はあったので例を書いて頂いて助かりました。
ちなみに何と比べて早いの遅いの言ってたかと申しますと
Flexible Renamer と比べてたのであります。
http://hp.vector.co.jp/authors/VA014830/FlexRena/ ためしに自分のコードのアイコンインデクス値をSHGetFileInfo使わないで、
適当な数字入れて全部同じアイコンにしてもFlexible Renamerの方が早かったです_| ̄|○
しかもこちらのカラムはアイテム名の一個しかないというのに、、、
こちらの方は検索が完了するまでリストビューが描画されないのに、
アチラは描画しながら検索を続けてるというのもありますが(;´Д`)
HACCELってなに?
>>982 わかりました。
キーボードアクセラレーターのハンドルの型みたいです。
HACCEL hAc;
hAc=LoadAccleleerators(hInstance,ID);
みたいな感じで使うみたいです。
(プログラマ養成入門講座VisualC++1から)
というか、微妙にスレ違いでした。
オブジェクトとインスタンスって同じようなものですか?
やっぱり微妙にニュアンスが違うだけで 大体同じように使っていいっぽいですね。 「どう違うの」って聞かれたときやっぱり困りそうですが。
クラスオブジェクト
>>295 要求自体にもレベルがあるだろ
1.どんな言語使っても実現が困難なレベル
2.時間と努力を惜しまなければなんとか実現可能なレベル
3.普通にやれば手間がかかるが工夫次第で効率良く書けるレベル
4.工夫しようがないように見えて裏技的な方法でもっと効率良く書けるレベル
普通3だと思うが
誤爆
C++とC++Builder6を初めてまだ1週間程度ですがよろしくお願いします。 エクスプローラからドロップしたテキストファイルを扱うツールを作ろうと思って、 まずドロップされた物がフォルダなのか、テキストファイルなのか、あるいはその他のファイルなのか判定する、 以下のようなコードを書いてみました。(といっても大部分サンプルコードから切り貼りしたものですが) 実際に動作させて見るとテキストファイルをドロップしたときは正しく動作するのですが、 その他のファイルをドロップすると、 プロジェクト Test1.exe が EAccessViolation クラスの例外を生成しました。 'モジュール 'CC3260MT.DLL' のアドレス 32657E39 でアドレス 00000000 に対する読み込み違反がおきました。 というエラーが発生してしまいます。 どのように改善すれば期待通りの動作をしてくれるようになるのでしょうか。 また、とりあえず読み込んでみてエラーが発生するかどうかで、ファイルとフォルダを判定するのは 何かおかしい気がするので、いい方法があれば教えてください。 (コードは次のレス)
//フォームへのドラッグを有効にする void __fastcall TForm1::FormCreate(TObject *Sender){ DragAcceptFiles(Handle,true); } //テキストファイルかそれ以外のファイルかフォルダか判定する void CheckFileFolder(char FilePath[]){ try{ TFileStream *Stream = new TFileStream(FilePath,fmOpenRead); delete Stream; } //フォルダをファイルとして開くことはできないから読み込みでエラーが発生したらフォルダだと仮定する catch(EFOpenError &e){ Application->MessageBox("フォルダっぽい","例外"); return; } //".txt"がファイル名の末尾に存在するか if(strcmp(strstr(FilePath,".txt"),".txt") == 0 ){ Application->MessageBox("テキストファイル","strstr"); } else{ Application->MessageBox("テキストファイルで無い","strstr"); } } もう一つ続きます。
//Win32APIからのイベント void __fastcall TForm1::WMDropFiles(TWMDropFiles & Msg){ int cnt = ::DragQueryFile((HDROP)Msg.Drop, 0xFFFFFFFF,NULL,0); for(int i=0;i<cnt;i++){ char DragName[MAX_PATH]; ::DragQueryFile((HDROP)Msg.Drop, i,DragName,sizeof(DragName)); CheckFileFolder(DragName); //ここでエラーが発生する } ::DragFinish((HDROP)Msg.Drop); } ここまでが関係するコードです。 自作のCheckFileFolder関数を呼び出すところでエラーが発生します。
もろにWin32APIスレの方が適してると思うけど、まあいいか。 ファイル・フォルダの判断に例外なんて使わずに GetFileAttributes()あたりを使え。
オーバーライドのイメージって 同じペン軸を使って、細い線とか太い線用のペン先につけ変えながら描く感じですか? オーバーライドしないってのは ペン軸とペン先がセットになったのを何本も持ってるみたいな。
995
996
997
998
(rァ゚Д゚)rァ 1000ゲッツ!
999
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。