【初心者歓迎】C/C++室 Ver.7【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGただしその場合、質問者は必ず、環境を書きましょう。
【初心者歓迎】C/C++室【環境依存OK】
http://pc5.2ch.net/tech/kako/1059/10590/1059041347.html
【初心者歓迎】C/C++室 Ver.2【環境依存OK】
http://pc5.2ch.net/tech/kako/1067/10671/1067189450.html
【初心者歓迎】C/C++室 Ver.3【環境依存OK】
http://pc2.2ch.net/test/read.cgi/tech/1069719929/ (消滅?)
【初心者歓迎】C/C++室 Ver.4【環境依存OK】
http://pc2.2ch.net/test/read.cgi/tech/1073473867/ (消滅?)
【初心者歓迎】C/C++室 Ver.5【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1077102238/ (html化待ち)
【初心者歓迎】C/C++室 Ver.6【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1082182233/l50
【ラウンジ】質問が長い時はココを使うと便利
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html
0232デフォルトの名無しさん
NGNG今のところシンボリックリンクから呼び出されることはない予定です。
0234デフォルトの名無しさん
NGNGWindowsで229とおんなじことしたい場合も同様にできるんですか?
それともAPIがあるんでしょうか?
0235デフォルトの名無しさん
NGNG0236227
NGNG他のところも一応調べてみたのですが
どうも間違ってるようには感じられませんでした。
あいまいな聞き方かもしれませんが
vfptrがNULLになってしまう、考えられる要因を
教えていただけませんでしょうか。
後、遅れましたが環境はVC++6.0です。
0237デフォルトの名無しさん
NGNGそれで起こらなかったら確実に元ソースが悪い。デバッグで追っていくか差異を調べる。
もし起こったらおそらくどっちのソースも悪い。そのソースをここに貼って指摘を待つ。
0238デフォルトの名無しさん
NGNG0239227
NGNGクラスの初期化の方法に問題があったようです。
0240デフォルトの名無しさん
NGNG0241デフォルトの名無しさん
NGNGおそらくあなたが望んでいるのは c_str()でしょう。
もちろん入門書の類は持ってますよね。
あとは索引からc_strのページを見つけて、読んでください。
0242デフォルトの名無しさん
NGNGディレクトリの存在を確認する方法ってありますか?
OSはXPです。system関数などでDOSのコマンド使っても
いいのですが。batファイルなんかだとif exist ....
ってのがありますが、これはsystem関数からは使えない
ようです。C言語の標準にも確認する関数はないですよねぇ?
できるんでしょうか。
0243デフォルトの名無しさん
NGNG0244242
NGNG方法もあると思いますが、その場合、存在しないと
エラーでシステムからメッセージが表示されちゃうん
ですよね・・・。エラーださないで、チェックだけを
する方法ってないもんですかねぇ。
0245デフォルトの名無しさん
NGNGオプティマイザの付いているVC++Professionalだとちゃんと抑制されるんでしょうか?
その他、あまりにバカなコード生成に泣きたい思いです。
0246デフォルトの名無しさん
NGNGタダで使えるVisual C++ $2
http://pc5.2ch.net/test/read.cgi/tech/1086287039/l50
最適化付Pro版が手に入る
0247デフォルトの名無しさん
NGNG漏れなら、標準にこだわらず素直にWin32 API使う。そもそもchdirも
nkdirも標準じゃないんだし。
>>245
VS2003だと、debugだと呼ばれて、releaseはきれいになくなったよ。
0248デフォルトの名無しさん
NGNGGetFileAttributesはどう?
ファイル名を指定して失敗したら-1を返す。ただし符号なしのDWORD型w
#include <windows.h>
#include <stdio.h>
int main(int argc, char **argv)
{
if (GetFileAttributes(argv[1]) == (DWORD)-1)
printf("ファイルはない");
else
printf("ファイルはある");
return 0;
}
0249242
NGNGやはりファイルシステムは処理系依存だから標準では
どうにもならんですか。素直にAPIとか使うしかないですね。
ちなみに
system("mkdir");
system("cls");
で、もしディレクトリ既存のエラーがでても一瞬出てすぐ消せますね(w。
余談ですが、C++のBoostにfilesystemってのがあるようですが、あれだと
チェックができてなおかつ移植性があったりするんですかね・・・。
0250デフォルトの名無しさん
NGNG見たことないな
0251デフォルトの名無しさん
NGNGバッチコマンド使いたかったらcmd.exe経由で動かせばsystem()からでも使えなくはないけど…
APIで事足りるならそのほうがいいと思います。
つーか、system()使うとそれだけでDOS窓開くしねぇ。
0252デフォルトの名無しさん
NGNGエラー出力のリダイレクト
http://homepage2.nifty.com/winfaq/c/hints.html#548
system("mkdir 〜 2> NUL")
でも俺のWin98では無理だった……
他には一時的に文字の色を背景色と同じ色に変更してmkdirを使うとかw
0253デフォルトの名無しさん
NGNG* _rmdir 関数を使用して、ディレクトリを削除します。*/
#include <direct.h>
#include <stdlib.h>
#include <stdio.h>
void main( void )
{
if( _mkdir( "\\testtmp" ) == 0 )
{
printf( "ディレクトリ '\\testtmp' が正常に作成されました。\n" );
system( "dir \\testtmp" );
if( _rmdir( "\\testtmp" ) == 0 )
printf( "ディレクトリ '\\testtmp' が正常に削除されました。\n" );
else
printf( "ディレクトリ '\\testtmp' が削除できません。\n" );
}
else
printf( "ディレクトリ '\\testtmp' が作成できません。\n" );
}
0254デフォルトの名無しさん
NGNGwindowsのWaitForSingleObject
みたいに休止できるできるやつってありますか?
pthread_cond_waitとかはなんか違うっぽいし・・・
0255デフォルトの名無しさん
NGNG0256151
NGNG>>218
確かにそうですが、まぁ例と言うことで。
>>219
>4. class Watch の中で set をオーバーロード
は 「class Dispの中で」での間違いでしょうか?
Watchの中でオーバーライドするとDAT.set()が呼べないと思うのですが・・・
>要は Disp で set() を呼び出せないようにしたいと解釈したんだけど
その通りです。
0257229
NGNGhttp://x68000.startshop.co.jp/~68user/unix/pickup?realpath
という所が見つかって無事に目的を達成できました。
皆さんどうもありがとうございました。
0258デフォルトの名無しさん
NGNGhttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/realpath.3.html
↑ここには、「この関数は決して使わないこと。」なんて書かれてるな。
0259デフォルトの名無しさん
NGNGWindowsなら、GetModuleFileName(NULL,... でいける。
0260234
NGNGありがとうございます!
実は密かにけっこう前から謎だったんで助かりました!!
0261219
NGNG>Watchの中でオーバーライドするとDAT.set()が呼べないと思うのですが・・・
えーと、いちおう Dat DAT; ていう変数自体使わない方向性で継承の手順書いて見たんだなぁ。
ちょっと言葉がたりなかったかな?(反省)
set 呼ぶときは Watch::exec() のなかで
>DAT.set(key);
の部分をただ単に
set(key);
って書く感じ。(オーバーライドしてあれば書けるでしょ?)
そうすると、set は Watch の中で「敢えて」オーバーライドしない限り使えない。
→つまり Disp の中では使えない。
っていうのが実現されるかなぁと。
もし Watch クラスの方は逆に Dat の key を読めないようにしたいなら、継承するとき private にするなり、Dat::is() を virtual にして Disp でオーバーライドするなり微調整してみては?
だいたい継承使わなくても>160+>162の方法じゃ納得いかないの?
結局アクセス制御の点では似たようなことになると思うんだけど。
0262218
NGNG> 確かにそうですが、まぁ例と言うことで。
突っ込まれて「例と言うことで」で済むようなソース晒しても意味無いだろうが。
何で「ソース晒せ」と言われたかわかってんの?
0263160 and 162
NGNG//----- dat.h -----
class Dat {
public:
char is() const { return key; }
void set(char c) { if (c) key = c; }
private:
char key;
};
//----- main.cc -----
#include "dat.h"
class Watch {
public:
void exec()
{
char key = キーボードからの入力をみる();
dat_.set(key);
}
private:
Dat dat_;
};
ちなみに>>215-217だと>>151でいう「ある物の状態」の「ある物」と
Dat::set()の引数が同じだけど本物でもそうなの?
0264263
NGNG//----- main.cc -----
#include "dat.h"
class Watch {
public:
void exec(Dat& dat)
{
char key = キーボードからの入力をみる();
dat.set(key);
}
};
class Disp {
public:
void exec(const Dat& dat) const { if (dat.is()) std::cout << dat.is() << std::endl; }
};
int main() {
Watch w;
Disp d;
Dat dat;
while(1) {
w.exec(dat);
d.exec(dat);
}
return 0;
}
0265デフォルトの名無しさん
NGNGswitch文のラベルにマクロを使うと、
「error C2143: 構文エラー : ':' が ';' の前にありません。」
となりコンパイルが通りません。
例)
#define UM_TEST (WM_USER+1);
(中略)
switch(message)
{
case WM_COMMAND:
break;
case WM_CLOSE:
case UM_TEST: ←この行でエラー
default:
return ....
}
なお、ラベルのUM_TESTをWM_USER+1と記述すると正しく動きます。
0266デフォルトの名無しさん
NGNGネタ?
> #define UM_TEST (WM_USER+1);
↑の末尾のセミコロンを取り除け。
0267デフォルトの名無しさん
NGNGほ、ほんとだ・・・
寝ぼけてました。
すみません。
出直してきます。
かなり恥ずかしいですね・・・
0268デフォルトの名無しさん
NGNG0269151
NGNGclass Watch : public Dat
class Disp : public Dat
と継承するという事ですよね?
>そうすると、set は Watch の中で「敢えて」オーバーライドしない限り使えない。
>→つまり Disp の中では使えない。
ここが意味が分からないのですが・・・
継承してるならオーバーライド「しない」状態でDat::set()が使えると思うのですが。
>Dat::is() を virtual にして Disp でオーバーライドする
同様に↑もよくわかりません。
私が何か勘違いしてるんでしょうか。
>>262
実際はDATにシングルトンパターンを使っているので
それ程大きな問題にはならないと思っています。
(#define DAT Dat::instance()とかしてる)
>>264
コンパイルできる環境がないので試せないのですが
constを付けるとDisp::exec()でdat.set()は呼べなくなるという事ですか?
0270デフォルトの名無しさん
NGNG>class Watch : public Dat
>class Disp : public Dat
>と継承するという事ですよね?
そうそう。
>継承してるならオーバーライド「しない」状態でDat::set()が使えると思うのですが。
また説明足らなかった・・・。混乱さしてスマソ。
virtual にして =0 つけないと意味無かったね。
純粋仮想関数っていうんだっけ?オーバーライドしないと使えない奴。
まあ継承ってのはちょっとした思い付きで言っただけだから、
>すっきり
は組めないかもね。
>>>264
>コンパイルできる環境がないので試せないのですが
>constを付けるとDisp::exec()でdat.set()は呼べなくなるという事ですか?
そうだよ。まー>264はキレイな回答だとおもうしこれで
>すっきり
したらいいんじゃない?ダメなら継承も考えてみるけど。
0271270
NGNGそうすると Disp::set() も書かなきゃいけないから、定義のしかたで書き換えできないようには出来るけどかなり微妙だな・・・。
こりゃすっきりしないかもね。すっきりするにはコーディングの変更が多そうだ。やっぱ264にしといたら?
0272デフォルトの名無しさん
NGNG>あ、今思ったけど純粋仮想関数ってオーバーライドしなきゃいけないんだったっけ。
をい、んなこと当たり前じゃない毛。おまえレベル低すぎ。
0273151
NGNG>そうだよ。まー>264はキレイな回答だとおもうしこれで
これが本当ならかなりビックリです。
コンパイラがメンバ関数の中身まで見てるとは思えないのですが・・・
明日試してみます。
>あ、今思ったけど純粋仮想関数ってオーバーライドしなきゃいけないんだったっけ。
了解です。そもそもDatをWatchに継承するのはfriendを使うより抵抗があります・・・
0274デフォルトの名無しさん
NGNGコンパイラはメンバ関数の宣言を見ている。
char is() const ←これ
void set(char c) ←こっちは const がない
そうすると Disp::exec の引数 const Dat& のインスタンスは is を呼べても set を呼べない。
0275デフォルトの名無しさん
NGNG> 実際はDATにシングルトンパターンを使っているので
アクセス許可の観点からは、externと同レベルだと思うんだけど。
0276264
NGNG>>そうだよ。まー>264はキレイな回答だとおもうしこれで
>これが本当ならかなりビックリです。
もしかしてネタで書いたコードだと思われてたのか?
そうか、だからスルーされ続けてたのか。
0277151
NGNGそれはその通りですね。
>>274
なるほど!謎が解けました。
実際やってみましたが、set()を呼ぶとエラーになりました。
>>276
無視してたわけじゃなくて、正直理解できなかったんです。申し訳ない。
ただ実際にはexec()の引数にはできないので
もうちょっと工夫してみます。
ありがとうございました。
0278デフォルトの名無しさん
NGNG-20%7の出力結果を1にしたいのですが
どうやったらいいのでしょうか?
#include <stdio.h>
int main(void)
{
int t;
unsigned int s;
t = -20%7;
s = -20%7;
printf(" signed unsigned\n");
printf("-20%%7=%d -20%%7=%d\n",t ,s);
t = 20%7;
s = 20%7;
printf(" 20%%7=%d 20%%7=%d\n",t ,s);
return 0;
}
0279デフォルトの名無しさん
NGNG0280デフォルトの名無しさん
NGNG???
なんのこっちゃ?
0281デフォルトの名無しさん
NGNG20 ÷ 7 = 2 あまり 6
0282デフォルトの名無しさん
NGNG-20/7=-2 あまり 1だけど?
マイナス20なんですけど・・・
0283デフォルトの名無しさん
NGNG0284デフォルトの名無しさん
NGNGだから困ってんです。
Cでもあまりは正で出力されるとばかり思ってたから・・・
0285デフォルトの名無しさん
NGNG-20 = 7*(-3) + 1
だから -3 余り 1 じゃね?
余りは常に正と言うんなら(t+7)%7で求まると思うが。
0286デフォルトの名無しさん
NGNG-20=7*-3 + 1だ
-2じゃ、なかたよ
いちいちif文書くのめんどくさっておもったんだ
cの規格に何とかする方法があればそっち使いたいなーって
0287デフォルトの名無しさん
NGNGttp://seclan.dll.jp/c99d/c99d05.htm#dt19990607
俺の環境では、非C99の場合 -20 % 7 == 6
0288デフォルトの名無しさん
NGNGお前らちゃんとCの勉強してから文句言え
0289デフォルトの名無しさん
NGNG0290デフォルトの名無しさん
NGNG<
∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨
|:\ |:\
|::: \ |:::: \
|:::: ヽ |::::::: │
|::::::: 丶――⌒゙゙^ ̄ ̄ │
/::::::: _,,,,__,_, U , , ,,,丶
/:::::::::::: z-/^ 丶 // ̄ ̄\|
/:::::::::::::::::: ..彡│ ● |l ‖ ● |
/:::::::::::::::::::: 人i‖ 》 | |
{:::::::::::\\J .\_,,,,,u= ⌒ \_,,,,,__/\
|::::::::::::::::::) ( ⌒ |
|::::::::::::::::/ /∩ // ̄ ̄\,,,,,____,,,\. |
{::::::::::::::: | |\/┘┘┘┘┘┘|/| .│ .|
|::::::::::::::: |lllllllllllllllllllllllllllllllllllllllllllll| | |
|::::::::::::::: | ⌒\⌒\llllllllllllllllllll| | |
{::::::::::::::: |. \ |lllllllllll| | |
|::::::::::::::: | | ヽ |lllllllll| | |
\::::::::::::::: │ | │ |lllllll| | |
\:::::::::::::: \ |∧ │ |lllllll| | |
/::::::::::::::: \ \\ \∧. |
/:::::::::::::: :::\ \\┐┐┐┐┐ \ \
/::::::::::::::: ::::::::::::\ ゙゙^^¨゙゙^^¨^゙゙¨¨゙゙¨^゙) \
0291デフォルトの名無しさん
NGNG0292デフォルトの名無しさん
NGNGウィンドウ全体にかかるフォームAと
その一部がその他のフォームでも使用されるフォームB.
両方ともWinMainでCreateDialogすると、CreateDialogの順番によって動作が変わり、
Aが表示されてBが見えずAB両方にアクセスできる場合と、
ABともに表示されてBにアクセスできない場合とに分かれます。
(BはAやその他で使うカラーテーブルのフォームで、Bの操作でAの動作が変わるように考えてます)
自分としては、AにBがそのまま乗るような動作を期待してるんですが、どうもうまくいきません。
この場合、どうしたらいいんでしょうか。
0293デフォルトの名無しさん
NGNGスレ違い。
WinAPIスレあたりで聞いてみたら。
0294デフォルトの名無しさん
NGNGシグナルハンドラの中から例外を出してもうまくいきませんでした。。。
0295デフォルトの名無しさん
NGNGcc test.c
gcc test.c
とするのではなにが違うのでしょうか?
0297デフォルトの名無しさん
NGNG0298デフォルトの名無しさん
NGNGprotected/private継承の使い分けを教えてください
0299デフォルトの名無しさん
NGNG既存のクラスを実装に利用したい時に使える。
class deck : private deque<card> {...}; // デッキ(トランプの)を実装するのにdequeを利用する。
これとほぼ同じ事が、privateメンバ変数としてそのクラスの
員ん洲箪笥をを持つ事によって実現できるから、あまり使われない。
protected継承は基本的にprivate継承と同じ使い方をするが、この場合deckからさらにクラスを派生させたくて、
そこからもdequeを利用できるようにしたい時に使える。
これはdeckのprotectedメンバ変数としてdequeを持つのに似ている。
0300デフォルトの名無しさん
NGNG0301デフォルトの名無しさん
NGNGCMan //沢山のインスタンスを作れるクラス、かつ全員が同じCGodにアクセスできる
CMan a;
とやるだけでどこかにCGodが1人作られる
その後はCManが何人作られようがCGodは一人
CGodはCManを介さないとアクセスできない
CManが一人も居なくなるとCGodは勝手に消滅する
グローバルオブジェクトを使わずに、こんなことをクラスで構築可能ですか?
0302デフォルトの名無しさん
NGNGpublic:
CMan() {
if(!_godref) {
_pgod = new CGod();
}
_godref++;
}
~CMan() {
_godref--;
if(!_godref) {
delete _pgod;
}
}
private:
CGod* _pgod;
static int _godref;
};
int CMan::_godref = 0;
0303デフォルトの名無しさん
NGNG_pgod は static じゃなくていいの?
だってさー、
int main() {
CMan * saishonohito = new CMan;
CMan * tsuginohito = new CMan;
delete saishonohito;
delete tsuginohito;
return 0;
}
のとき tsuginohito のデストラクタは何を delete するんだ?
っていうか>>301の言う CGod はどうやって定義するつもり?
>1つしかインスタンスを作れないクラス
っての無茶じゃね?
0304デフォルトの名無しさん
NGNG0305デフォルトの名無しさん
NGNGomaemona-
0306デフォルトの名無しさん
NGNG手っ取り早くCManの中にstaticでCGod詰め込んどけ。
0307デフォルトの名無しさん
NGNG0308デフォルトの名無しさん
NGNG0309デフォルトの名無しさん
NGNG>CManが一人も居なくなるとCGodは勝手に消滅する
0310デフォルトの名無しさん
NGNG0311デフォルトの名無しさん
NGNG0312デフォルトの名無しさん
NGNGでも言えてるな・・・。
0313デフォルトの名無しさん
NGNGでたらめな値が出てくるんだけれど、なぜだろう?
0314デフォルトの名無しさん
NGNG0315デフォルトの名無しさん
NGNG%x,%X,%o、それにlやhをつけたものは符号無し整数を相手にする。要するに%uの16,8進数版。
0316294
NGNG0317デフォルトの名無しさん
NGNG負の値として出力することはできない?
0318デフォルトの名無しさん
NGNG「2の補数」で検索するといいかもしれない。
0319デフォルトの名無しさん
NGNGとりあえず、文字列の先頭から1文字ずつ","か"\n"をチェックして文字数分だけループさせるソースを書いたのですが、
もっと簡単な方法は無いでしょうか。
環境はVC++で、MFCは使っていません。
0320デフォルトの名無しさん
NGNGstrtok()
0321デフォルトの名無しさん
NGNGboost::tokenizer使えばあっちゅーまだよ?
インストールがめんどくさいだけだが
0322デフォルトの名無しさん
NGNGLinux+Intel compilerとWinXP+VC6でコンパイルしたオブジェクトファイルを組み合わせてリンクすることは可能でしょうか?
0323デフォルトの名無しさん
NGNGそんなのが存在するか知らんが。
0324デフォルトの名無しさん
NGNGコンストラクタで、文字列を解析するつもりです。
lpszBuffには、文字列のアドレスを受け渡してるつもりです。
class DbCardBase{
public:
DbCardBase(LPSTR lpszBuff);
};
DbCardBase::DbCardBase(LPSTR lpszBuff){
char *szBuff;
szBuff = lpszBuff;
};
0325デフォルトの名無しさん
NGNG0326デフォルトの名無しさん
NGNGポインタはなんとなく理解出来始めたのですが
文字列の扱いに未だ疑問があります。
文字列("abcde")はchar*の変数と同じような働きをしている?というような解説をどこかで見たので、
自分でも色々と試してみました。
cout << *("abcde") << endl;
この実行結果は a になりました(理解しました。)
cout << "abcde"[3] << endl;
この実行結果は d になりました(理解しました。)
cout << &("abcde") << endl;
私の理解ではこれで文字列"abcde"を指すポインタのアドレスが出ると思ったのですが
文字列がそのまま出てしまいます。
私の理解の仕方がおかしいのでしょうか?
0327デフォルトの名無しさん
NGNG出ないんですか _| ̄|○
となるとエラー箇所が他なのですね。研究します。
0328デフォルトの名無しさん
NGNG0329324
NGNG関数の引数として受け渡しするとき、受け側の型は何にすればよいのでしょうか?
0330デフォルトの名無しさん
NGNG0331デフォルトの名無しさん
NGNGポインタが理解できているなら文字列も理解できるはず。
逆をいうと・・・(ry
■ このスレッドは過去ログ倉庫に格納されています