[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 06/02 12:18 / Filesize : 258 KB / Number-of Response : 992
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 00:25:51 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.63【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1231499251/

【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。


652 名前:589 [2009/03/29(日) 20:48:04 ]
あのですね、何度も申し訳ありませんが、kbhitじゃダメでした。
while(!kbhit())とかにしても、したまで実行してからじゃ無いと止まってくれません。
do〜whileとか色々試してみたけどやっぱりダメです。
何かいい方法をよろしくお願いします。>>589

653 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 20:52:33 ]
>>651
msdn.microsoft.com/en-us/library/ms646839.aspx

654 名前:589 [2009/03/29(日) 21:05:25 ]
いいなー、凄いなー

655 名前:589 [2009/03/29(日) 21:06:51 ]
>>654
 ↑
これ無しwwww
NHK見てて間違ったwww

因みに589はマジレスですのでよろしくお願いします。

656 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 21:12:35 ]
void foo()
{
while(1)
{
Sleep(100);
if( _kbhit() )
{
printf("Time:%d\n", clock() );
_getch();
}
}
}

int _tmain(void){
HANDLE handle;
int id;
handle = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)foo, NULL, 0, (LPDWORD)&id);
while(1)
{
Sleep(1000);
printf("var\n");
}
}

657 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 21:17:44 ]
// VC++6.0 SP6
#include <conio.h>
#include <stdio.h>
#include <time.h>
#include <windows.h>

void main()
{
time_t tm;
int i;

while (1) {
if (_kbhit()) {
i = getch();
if (i == 'e') {
break;
}
time(&tm);
printf("%d\n", tm);
}
Sleep(100);
}
}

658 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 21:20:53 ]
>>651です
Commdlg.hが足りていませんでした
事前調べ不足でした。>>653さんありがとうございます

659 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 22:58:15 ]
>>652
ちゃんとやろうとすると C/C++ の規格内では出来ない。
環境が Windows ならメッセージループを作るべきだろうけど…
あるいは既にレスがあるとおりスレッドを作るにしても、
メインスレッドとのやり取りには注意点は多いし。
初心者に説明するには結構こみいった話なんだわ。
ここで全てを説明するのはちょっと無理ってことをわかってくれ。
メッセージループやスレッドの基礎をわかってからまた来い。

660 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 07:24:29 ]
状態移管さえ把握すればCで出来ん訳ない。



661 名前:デフォルトの名無しさん [2009/03/30(月) 08:25:21 ]
VC++を使ってますが、NULLを使おうとすると
#include <iostream>
とかしないとコンパイラが受け付けてくれません。
でも自前のヘッダがあるのでできるならインクルードしたくありません。
このばあいどうすればよいでしょうか
インクルードするしかないですか

662 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 08:28:19 ]
>>661
C++であるなら
NULL は確実に 0 のdefineなので
0 つかっとけ

663 名前:デフォルトの名無しさん [2009/03/30(月) 08:44:19 ]
でもポインタの初期化であることをはっきりさせるためにNULLを使いたいんです。
自分で定義するのはだめですか


664 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 08:51:44 ]
>>661
VCバージョンいくつよ?
VC6なら窓から投げ捨てろ

665 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 08:54:40 ]
NULLが欲しいなら
#include <cstddef>
だろ

666 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 08:55:40 ]
>>663
#ifndef 使ってちゃんと囲っておけば
コンパイルや動作上の意味では問題は起こらないから
好きにすればいいんじゃないかな
重ねて言うがC++では 0 で定義されてるから

>>664
なんにもincludeしてないのにNULLが定義されてるほうがおかしいだろ

667 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 09:15:52 ]
>>662
実装依存だよ。 gcc なんかは特別な警告が出るように細工してあったはず。

668 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 09:22:26 ]
ほとんどのプログラムはstdio.hかwindows.hをインクルードするから
どっかでNULLは定義されるな
iostreamは知らん

669 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 09:49:25 ]
>>667
調べたらほんとに違うんだな

C++ じゃ ((void *)0) はありえないから 0 だぜっての鵜呑みにしてた
どうもありがとう


670 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 09:58:13 ]
>>668
NULLが定義されてるのは <cstddef> の中(Cなら <stddef.h>)。
それ以外を #include して定義されても処理系依存の動作。




671 名前:デフォルトの名無しさん [2009/03/30(月) 10:27:02 ]
boost::shared_ptr<Test> p = new Test();
boost::shared_ptr<Test> p(new Test());
この2つはどう違いますか?
上のやつだとコンパイルできません。


672 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 10:32:30 ]
shared_ptrはポインタを取るコンストラクタがexplicitなので、
暗黙の型変換はされない。明示的にコンストラクタを呼ぶ必要がある。

673 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 10:33:19 ]
>>670
NULL は cstddef のほかに cstring, ctime, cwchar, clocale, cstdio でも定義されることに
なっている。

C.2.2.4 Macro NULL より
> The macro NULL, defined in any of <clocale>, <cstddef>, <cstdio>, <cstdlib>, <cstring>, <ctime>, or
> <cwchar>, is an implementation-defined C++ null pointer constant in this International Standard.

674 名前:デフォルトの名無しさん [2009/03/30(月) 10:37:20 ]
>>672
ありがとうです。
でもよくわかりませんでした。
boost::shared_ptr<Test> p = new Test();
という書き方は明示的にコンストラクタを読んでないということですか?


675 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 10:47:49 ]
明示的に呼ぶとこうなる

boost::shared_ptr<Test> x = boost::shared_ptr<Test>(new Test);


676 名前:デフォルトの名無しさん [2009/03/30(月) 10:55:12 ]
>>675
それでできました!
Testクラス内にboost::shared_ptr<Test> mInstance;
というポインタを持たせてたのですが、初期化できずにこまってました。
(初期化をコンストラクタ以外の場所で行いたかったため、
mInstance(new Test())
とかってかけなかった。
ありがとうございました!


677 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 10:56:47 ]
>671の前者だと、Test *をboost::shared_ptr<Test>にキャストしようとして失敗するわけだね。

678 名前:デフォルトの名無しさん [2009/03/30(月) 11:16:02 ]
>>677
なるほど。
あと、676のような場合は、scoped_ptr<Test>は使えませんよね?
コンストラクタで初期化しないから。


679 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 11:21:53 ]
>>677,678
微妙に誤解してそうな気がするんだけどうまく説明できないので端的に言うと
>>675
の形でもshared_ptrのコンストラクタは一回しか呼ばれない


680 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 11:25:43 ]
>>676
reset(new Test()) 使えよ。



681 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 11:34:23 ]
>>678
コンストラクタで初期化しないことと scoped_ptr での置き換えの可能性は関係ないと思うよ。


682 名前:デフォルトの名無しさん [2009/03/30(月) 11:46:43 ]
>>680-681
たしかに、scoped_ptr()でreset(new Test())使うとできました。
ありがとうございました。

683 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 12:00:18 ]
すいません。boostをucLinuxに入れようとしてます。
boost_1.38なんですが、boost::conditionが解決できません。
それ以外はコンパイルは通ります。
普通にfedora core7に入れてもだめです。

yum install boost-develだとうまくいくのですが、
なにかやり方があるのでしょうか?初心者ですいません。

684 名前:デフォルトの名無しさん [2009/03/30(月) 12:57:04 ]
クラス内にスタティックなポインタを持たせたいのですが、そのポインタをスマートポインタにできるでしょうか?
class Test {
static boost::scoped_ptr<MyClass> m_MyClass;
};
これの実体を書くところで初期化までしようとしているのですがうまくかけません。



685 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 13:04:21 ]
>>684
とりあえず書いた奴とエラーメッセージと scoped_ptr のマニュアルをよく見るんだ。
それでもわからなければ、以上の全部を添えて相談するといい。

686 名前:デフォルトの名無しさん [2009/03/30(月) 13:24:56 ]
>>685
言われたとおりにもう一回見直してみたらできました。
初期化は
boost::scoped_ptr<MyClass> Test::m_MyClass;
と書きました。あとBoost::scope_ptrのメンバを持つクラスのデストラクタは
privateにしたら駄目なようで、publicにしないとコンパイルできませんでした。
ありがとうございました。


687 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 15:43:17 ]
>>683
自己解決しました。
バージョンによって、ソース変えないといけないんですね。
インクルードを適度に増やして解決しました。

さて、リンクまで行ったんですが、クロスコンパイルで、想定通りには
ライブラリがうまく出来ていません。

bjamの設定でコンパイラにオプションつけるにはどうしたら
いいんでしょうか?

クロス開発なんてしてる人はいないですかねw



688 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 20:18:14 ]
要はビルド時のコンパイラをクロスのものにしたいんだろ?
bjam -sTOOLS="gcc" -sGXX="/usr/local/cross-tools/sh-hitachi/bin/g++"...
でいいんじゃないのか

689 名前:デフォルトの名無しさん [2009/03/30(月) 23:56:13 ]
WindowsXP
VisualStudio2005のVC++

フォームビューに配置したエディットコントロールで
「Ctrl+A」「Ctrl+X」「Ctrl+C」「Ctrl+V」が全然きかないのですが
これはなんなんでしょうか?
他アプリからコピーした文字列をそのエディットコントロールにペースト
して処理したいのですが。

ググってもどうにも見つからなくて…。

690 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 23:59:03 ]
カスタムからショートカットキーが消えてるとか言うオチはないか?w



691 名前:デフォルトの名無しさん [2009/03/31(火) 00:12:30 ]
そのエディットコントロールにフォーカスした状態で
メニューバーの「編集」をドロップダウンすると
「切り取り」「コピー」「貼り付け」等,全部グレーで選択不能になってる…。
なんか悪いことしたっけ?

692 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 00:19:59 ]
>>689
ウィンドウプロシージャ内でブレーク張って、どこでメッセージが捨てられてるか見てみたら?

693 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 00:22:34 ]
>>689
とりあえず、VC++にではなく、メモ帳あたりにコピペできるか試してみたら?

694 名前:デフォルトの名無しさん [2009/03/31(火) 00:34:31 ]
あれ?
ID_EDIT_COPY等の
OnEditCopyとかを自分で記述しなきゃいけないん?
エディットコントロールって初めからコピー・カット・ペーストくらい
できるんじゃなかったっけ…。

695 名前:589 [2009/03/31(火) 00:42:17 ]
>>659
そうなんですか。どうもありがとうございます。
もっと勉強します。

696 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 00:42:46 ]
編集不可になってるとかってオチじゃないのか?

697 名前:デフォルトの名無しさん [2009/03/31(火) 01:04:16 ]
>>696
エディットコントロールのプロパティでReadOnlyはFALSEにしてあるんですが…。

今試したら,ダイアログベースのプログラムにエディットコントロールを配置して
ビルドすると普通にカット・コピー・ペーストできますね。
でもフォームビューだとできない…。
どちらにしても「Ctrl+A」はきかないし。

こんな超重要ポイントがなんで入門書で触れられていないんだろう。w

698 名前:デフォルトの名無しさん [2009/03/31(火) 01:16:47 ]
OnEditCut()
{
m_edit1.Cut();
}

等を追加してなんとか解決しました。
エディットコントロールが勝手にやってくれると思い込んでいたもので…。
初心者の質問に付き合って下さった方々ありがとうございました。

699 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 01:20:34 ]
>>698
それだと、フォームビュー上の別コントロールにフォーカスあるときも反応しちゃわないかな?
まぁEdit一つだけのデザインなら問題ないけど・・・複数あるなら困りそう。

700 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 01:33:40 ]
IsDialogMessage



701 名前:デフォルトの名無しさん [2009/03/31(火) 01:34:42 ]
>>699
複数あるんです。w
今作っているものはエディットコントロールが2個あって片方はReadOnlyなのですが。
あと「Ctrl+A」もぜひ装備したいし…。

702 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 02:03:50 ]
>>701
フォームビューだと勝手にやってくれなかったんだっけなぁ・・・?
と気になって試しにプロジェクト作ってみたら、やっぱできないわwww
というかむしろ、CDialogやCEditViewなら親切にやってくれてる、という話なんだろう。
ttp://www.vcppclub.com/bbs11/wforum.cgi?no=4256&reno=no&oya=4256&mode=msgview
ttp://support.microsoft.com/kb/145616/ja

703 名前:デフォルトの名無しさん [2009/03/31(火) 02:24:15 ]
>>702
参照先ありがとうございます。
今「どのコントロールにフォーカスがあってもm_edit1のエディットコントロールに
ペーストされる」みたいな珍妙な動作になっています。w
GetFocus()を試してみます。

704 名前:デフォルトの名無しさん [2009/03/31(火) 04:54:38 ]
シングルトンで多態のクラスを作ったのですが、Baseクラスのコンストラクタとデストラクタを
プライベートに置こうとすると、コンパイルエラーになります。そこで、コンストラクタはProtected
に置いて、デストラクタはPublicに置きました。これって、こうするしかないですか?
ちなみに、多態を使うためのポインタを、Boost::scoped_ptr<>に置いてます。


705 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 06:30:49 ]
生成と廃棄のコードをBaseの関数テンプレートにする。

706 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 06:32:13 ]
あ、廃棄はいいのか。寝起きだとボケてていかん。

707 名前:デフォルトの名無しさん [2009/03/31(火) 09:47:34 ]
最近スマポについて色々質問させてもらっているものです。
もうちょっとだけ質問させてください。
スマポに保存しているポインタを取り出して関数とかに渡すとき、関数はスマポの形の
引数でポインタを受けるべきですか?それとも生のポインタで受けるべきですか?
class Hoge {
public:
boost::scoped_ptr<MyClass> m_MyClass;
};
というクラスがあるとして、このm_MyClassが持っているポインタを別の関数に渡すとき、
void func(MyClass *pMyClass);
void func(boost::scoped_ptr<MyClass> pMyClass);
このどっちの形にするべきなのか、わかりません。
どうかお願いします。


708 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 09:50:50 ]
scoped_ptrはコピーできないだろ

709 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 10:24:57 ]
>>688
mipsなんで、オプションを指定しないと正しいエンディアンにコンパイルできない。
bjamもバージョンで指定の仕方が違うなぁ。
試行錯誤しますです。

710 名前:デフォルトの名無しさん [2009/03/31(火) 11:03:04 ]
>>706
ありがとうございます。
Baseをテンプレートクラスにして、関数テンプレートを受けとり
コンストラクタの代わりにつかう、ということですか?
すげえややこしそうな気が、、、



711 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 12:26:30 ]
>>688
gcc,g++等をシェルスクリプトで作ったらコンパイルできました!
引数もシェルスクリプトに入れたらスッキリインストール完了しました。

ところが、ucLibにはn_procs()というglibの関数がないんですね。
mips用のboostできたのに、ここからコンパイルできないや…
どこまでひっかかるんだか…


712 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 12:38:57 ]
大抵はシングルトンをペチペチ叩く棒が多態になってれば十分だよね?

713 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 13:08:32 ]
>>707
どっちでもない。参照を使え。

714 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 13:09:36 ]
>>704
よく意味がわかんないから、ソース晒してくれたほうがいいと思うよ。

715 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 14:34:12 ]
std::string buf;
std::ifstream ifs;
ifs.exceptions(std::ios_base::failbit);

//前半
ifs.open("a.txt");
std::getline(ifs, buf, '\0');
ifs.close();
buf.clear();

//後半
ifs.open("b.txt");
std::getline(ifs, buf, '\0');
ifs.close();

これを実行すると例外std::ios_base::failureが投げられるんですけど、どうすればファイルを2つ読み込めますか?
ちなみに、前半か後半のどちらかをコメントアウトすれば例外は発生しません。

716 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 14:41:47 ]
>>715
前半と後半の間に ifs.clear() を入れればいいんだろうけど、そもそも
同じストリームオブジェクトで別々のファイルを開くというのが混乱の元の
ような気がする。

できれば別々のストリームオブジェクトを使うとか、前半と後半とを関数に
分けるとかするのがおすすめ。

717 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 14:47:06 ]
>>716
ありがとうございます。

718 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 15:25:57 ]
>>688
結局自力で解決できました。
boost::threadに相当するソースのget_nprocs(CPUの数)
を1にして、再度staticリンク指定したことで、
mips/ucLinuxのboostを作成でき、動作しました。

719 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 17:35:41 ]
質問なんですが、Effective C++を読んで
func(boost::scoped_ptr<X>(new X), boost::scoped_ptr<X>(new X));
としたらメモリリークの危険があるのは引数の実行順が不定だからであり、それは分かります
(前者のnew Xが実行の後、後者のnew Xが実行中そのコンストラクタで例外が出たときとか)

その本では、スマートポインタへnewしたポインタを渡すのは独立したステートメントでやろう、となっているのですが
func(boost::scoped_ptr<X>(new X));
とした場合も危険はあるのでしょうか
new X → shared_ptr → 引数呼び出しの順番は変わらないような気がするので


720 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 18:39:42 ]
それなら問題ないよ。



721 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 04:19:11 ]
>>719
危険性があるかどうかって話なら >720 のとおり無いんだけど、
あとで func() に引数を足した場合に問題が発生する形に変更されてしまう
可能性が高いんだからそんなコードを書いていいってことには
ならないよ。

722 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 10:28:14 ]
// value.cpp
namespace { int value = 5; }
int getValue() { return ++value; }

// use.cpp
int useValue() {
  return 2 * getValue();
}

// test.cpp
namespace { int n = useValue(); }

というようなコードを書いた場合、test.cppでuseValueが呼び出されると、
getValueのコードも既に実在しているハズだからvalueも初期化済みということになりますか?

723 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 10:32:33 ]
初期化順をコントロールするならシングルトンにしとけと、ばっちゃが(ry

724 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 11:15:30 ]
>>722
value は静的な初期化で済むから、動的な初期化を必要とする n の初期化より先に
初期化されることは決まっている。

だからといって、そんな重箱の隅みたいな規則に依存するコードはおすすめできない。

725 名前:デフォルトの名無しさん [2009/04/01(水) 12:36:59 ]
ということは、関数の定義位置などとは関係なしに、変数の初期化順が決まるということですね。
そこら辺については未熟なので、勉強して理解できるようになるまでは、
何とか自分で扱えるような方法で考えてみます。ありがとうございました。

726 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 14:36:43 ]
>>166 を誰か考察して。

727 名前:デフォルトの名無しさん [2009/04/01(水) 15:30:21 ]
class File {
public:
const char* data() const;
private:
boost::shared_array<char> m_Data;
};
こういうクラスがあって、m_Dataがcharの配列で、そこにデータが入ってます。
データは画像(バイナリ)です。そのデータにアクセスする手段として、
const char* data() const;
というのを作ったんですが、これは参照にすべきなのでしょうか?それとも
boost::shared_ptr<const char> data() const;
とかのように、ここでもスマポを使うべきでしょうか?
よろしくお願いします。


728 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 18:47:12 ]
>>727
そもそも m_Data 全域へのアクセスを公開する必要があるのかどうか、だな。

getData(int index) でだめな理由はなんだろうか?
execute() で、内部にアルゴリズムを実装してはどうだろうか?
とか、考える方が先かも。


729 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 18:49:35 ]
>728には>727の書いていることが理解できないらしい。

・アクセス関数の戻り値の型をどうしたらいいか
というのが質問の趣旨ですぜ。

730 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 19:34:11 ]
ほうほうそれでそれで



731 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 19:37:54 ]
スマポへの参照がいいんじゃないかな。
生ポならそのままコピーしちゃうけど
スマポはクラスでおっきいから。

boost使ったことないからよくわからんけど

732 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 19:41:47 ]
>>727
template<typename T> const T data(const T&)const {return static_cast<const T>(m_data);}
変な受け皿用意されたらコンパイル時に蹴る。

733 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:36:19 ]
C言語の質問です。
以下のコードがbus errorで死ぬんですが、何が間違っているのですか?

#include <stdio.h>
#include <stdlib.h>

void f(char **p);
int main(void)
{
char *p;
f(&p);
free(*p);
return 0;
}
void f(char **p)
{
*p = (char *)malloc(2);
*p[1] = 0;
}

734 名前:733 mailto:sage [2009/04/01(水) 22:38:27 ]
あ、すみません。free(*p)はfree(p)の間違いです。
それと、どうやら*p[1] = 0;のところで死ぬようです。

735 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:42:41 ]
> それと、どうやら*p[1] = 0;のところで死ぬようです。
(*p)[1] = 0;


736 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:42:54 ]
mmalock( sizeof(char *) * 2 );

737 名前:736 mailto:sage [2009/04/01(水) 22:45:23 ]
あれ、俺の頭がおかしい

738 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:56:48 ]
ああ、疲れてんだな

739 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 23:18:38 ]
>>735
演算子の優先順位の問題でしたか。ありがとうございます。

740 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 02:44:47 ]
>>166,726
未初期化のオブジェクト i に対してドット演算子を適用することにより、未定義動作。



741 名前:デフォルトの名無しさん [2009/04/02(木) 05:14:00 ]
int *p = new int;
int *p = new int(1);
int *p = new int(100);
これってどう違うんですか?
全部コンパイル出来てしまいます。



742 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 05:22:10 ]
>>741
int *p = new int; ← 不定値
int *p = new int(1); ← 1で初期化
int *p = new int(100); ← 100で初期化


743 名前:デフォルトの名無しさん [2009/04/02(木) 08:48:19 ]
>>742
ありがとうございました。

744 名前:デフォルトの名無しさん [2009/04/02(木) 14:51:45 ]
メモリリークを検出しようと思い
#define _CRTDBG_MAP_ALLOC

#include <stdlib.h>

#include <crtdbg.h>

とやったのですが__CrtSetDbgFlagを呼ぶと
1>Frame.obj : error LNK2019: 未解決の外部シンボル __CrtSetDbgFlag が関数 _wWinMain@16 で参照されました。
と出ます アドバイスください;;

745 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 14:56:26 ]
>>744
リリースビルドでやってないよね?

746 名前:744 [2009/04/02(木) 14:57:41 ]
デバッグでやってます

747 名前:744 [2009/04/02(木) 14:59:04 ]
c/c++ コード生成 ランタイムライブラリ
がマルチスレッド(/MT)ですけど関係ありますかね

748 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 15:06:57 ]
/MTdじゃないのか?

749 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 15:07:44 ]
/MT は、リリースビルド用・・・

750 名前:744 [2009/04/02(木) 15:10:18 ]
すみません・・・・
勉強になりました
ありがとうございます



751 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 23:31:23 ]
>発注額929億円のうち地元業者が受注したのは13%の122億円だった。

スポンサー以外を悪に仕立てたいマスコミと真に受ける馬鹿な国民が居る限りどうしようもないだろ。

752 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 23:33:24 ]
談合必要論か






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<258KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef