[表示 : 全て 最新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でのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。


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 ]
談合必要論か



753 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 23:36:38 ]
誤爆乙

754 名前:デフォルトの名無しさん [2009/04/02(木) 23:56:14 ]
shared_ptrのスマポをNULLで初期化できますか?


755 名前:デフォルトの名無しさん [2009/04/02(木) 23:57:21 ]
boost::shared_ptr<MyClass> m_MyClass =
boost::shared_ptr<MyClass>(reinterpret_cast<MyClass*>(0));
とやってできました。


756 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 00:03:38 ]
>>754-755
単にboost::shared_ptr<MyClass> m_MyClass;ではだめなの?

757 名前:デフォルトの名無しさん [2009/04/03(金) 00:19:11 ]
>>756
そうやって作成したスマポが、中身が入ってるかゼロなのか、NULLと比較しても
いいのですか?


758 名前:デフォルトの名無しさん [2009/04/03(金) 01:23:15 ]
すいません、初心者じゃない(つもり)なんですが、初心の質問させてください。
char data[100];
というデータがあるとき、
unsigned int func1(int i)
{
unsigned char* p = reinterpret_cast<unsigned char*>(data);
unsigned int r = p[i];
r |= p[i + 1] << 8;
r |= p[i + 2] << 16;
r |= p[i + 3] << 24;
return r;
}

unsigned int func2(int i)
{
unsigned int ret = data[i];
ret += data[i+1] << 8;
ret += data[i+2] << 16;
ret += data[i+3] << 24;
return ret;
}
この2つの関数の出力が違う場合があるのですが、(たとえばこうやって初期化した場合)
for (int i = 0; i < 100; ++i)
{
data[i] = 129;
}
どうしてでしょうか?


759 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 01:30:10 ]
>>757
デフォルトコンストラクタはこうなってる
shared_ptr(): px(0), pn() // never throws in 1.30+
{
}
px は内部に持つ生のポインタ

760 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 01:35:56 ]
>>758
129 が CHAR_MAX より大きい可能性が高いな。

761 名前:デフォルトの名無しさん [2009/04/03(金) 05:59:03 ]
ありがとうです。CHAR_MAXは127でした。
色々と理由を考えてたのですが、
(1) unsigned char a = 0xff;
(2) char a = 0xff;
cout << static_cast<int>(a<<8) << endl;
(1)のように書くと0xff00と出力され、
(2)のように書くと0xffffff00と出力されます。
unsigned charとcharではシフトの方法が違うんでしょうか?


762 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 06:23:45 ]
>>761
その場合は符号拡張の話だな
int にキャストした段階で違いが起こってる





763 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 07:45:19 ]
(1) unsigned char a = 0xff;
a = 0xff (255) を int 型にすると 0x000000ff (255)
※符号拡張の際、unsigned int 型を経由

(2) char a = 0xff;
a = 0xff (-1) を int 型にすると 0xffffffff (-1)

まあ大抵の場合、char 型で文字を扱うとき unsigned char にしといた方が
いちいちキャストしたりとか面倒なことをせずに済む

764 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 08:12:15 ]
>>761
そもそも CHAR_MAX が 127 なら char a = 0xff でも char a = 129 でも値は実装依存になる。
コンパイラやそのバージョンやコンパイルオプションの違いで変わってくるかもしれない。

一般的には、符号付 char の表現は 2 の補数で、収まらないビットは切り捨てられるだけ
だから、以下 >763

765 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 09:13:17 ]
char を unsigned int に型変換するときは
int に符号拡張してから unsigned int に変換される

char a に -1 (0xff) が入ってる場合は一旦 int 型 -1 (0xffffffff) に符号拡張され
unsigned int 4,294,967,295 (0xffffffff) に変換される

766 名前:デフォルトの名無しさん [2009/04/03(金) 10:56:18 ]
while(!(ret_cd = fetch_data())){
:
(フェッチしたレコードに関する処理部)
:
}
--------------------------
関数
int fetch_data(void)
{
:
(レコードデータ取得部)
:
return(0)
}
-------------------------
上記のようなプログラムで
while文の条件文の意味がよくわかりません。

全体の流れが「レコードが存在する間、処理を繰り返す」ような
処理ということはわかるのですが、
!(ret_cd=fetch_data())ときいている意味が
はっきりわからないのでどなたかお願いします。

767 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 11:03:57 ]
>>766
> !(ret_cd=fetch_data())ときいている意味
「レコードが存在」しているかどうか,という意味なんじゃない?

768 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 11:44:08 ]
fetch_data() は、レコードが存在すると 0、レコードが存在しないと 0 以外(たとえば -1)
を返すのだろう

レコードが存在する !(0) → 真となり、処理継続
レコードが存在しない !(-1) → 偽となり、処理終了

ぱっと見に分かりづらいから
while(!(ret_cd = fetch_data())){
  ↓
while((ret_cd = fetch_data()) == 0){
と書き換えてもいいかもしらん

769 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 12:02:29 ]
技術的な面以外で..
「〜をする意味」は有効な回答が付きづらい
概して「考えれば分かる」とか言われるのが落ち

質問の仕方が分からなくて,適当に取って着けたように「〜とはどういう意味でしょうか?」と聞いてしまうよりは,
必要な用語とか,質問に至るまでの状況とかをしっかり書いておくほうが無難

770 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 12:06:14 ]
単に、代入と検査を一緒にやってるだけだろ

771 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 12:29:49 ]
まあ>>768の通りだが、
おそらく、 ! が見た目通りに否定の意味に感じるので
直感的に理解しづらいということだろう。

!strcmp() などもそうだが、
==0 の意図で ! を使う人は結構居る。俺は極力 ==0 を使うが。
慣れればどうということは無いのだろうが、読むときに一瞬考えるので。

772 名前:デフォルトの名無しさん [2009/04/03(金) 14:14:14 ]
766です。
質問の仕方も曖昧ですみません。
レスいただきありがとうございます。
しかしまだ消化不足…といいますか、流れについて
いけてないです。現在修正中のプログラムが下記のような流れです。

@カーソルセット
EXEC SQL DECLARE cur_TEST CURSOR FOR
SELECT・・・
FROM・・・
WHERE・・・

EXEC SQL OPEN cur_TEST;



773 名前:デフォルトの名無しさん [2009/04/03(金) 14:15:05 ]
Aフェッチしながら項目セット
while(!(ret_cd=fetch_data())){

 /* 中間ファイル構造体の各項目に値セット */
 sprintf(・・・)
 sprintf(・・・)

 /* 中間ファイルに出力 */
 if(temp_write(Ofp, &out)){
 fclose ( Ofp );
 strcat( Errmsg, "temp_write:write_error" );
 AB_sjmsg( Errmsg );
 putenv( Errmsg );
 return(-1);
 }
}

中間ファイルクローズ
fclose(Ofp)

return(ret_cd);

774 名前:デフォルトの名無しさん [2009/04/03(金) 14:15:48 ]
(出力関数)
int temp_write( FILE *Ofp, struct TEST *dat )
{
int ret;

ret = fprintf(Ofp, "%-1.1s" , dat->AAA ) > -1;
ret = ret && fprintf(Ofp, "%-5.5s" , dat->BBB ) > -1;
ret = ret && fprintf(Ofp, "%-8.8s" , dat->CCC ) > -1;

return(ret ? 0 : -1);
}


775 名前:デフォルトの名無しさん [2009/04/03(金) 14:16:34 ]
実は今回このwhile(!(ret_cd=fetch_data()))の中で
もうひとつテーブルを読み、そこで抽出したレコード(複数件)が
なくなるまで繰り返す・・・という入れ子の処理を追加しないといけなくなりました。

単純にやり方を真似てfetch_data2という関数をつくり、
while(!(ret_cd=fetch_data()))の中で
while(!(ret_cd=fetch_data2()))と記述して、やろうとしてるのですが
エラーが出るため、今まで曖昧だったwhile(!(ret_cd=fetch_data()))部の
意味をはっきりさせようと思った次第です。

776 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 14:16:45 ]
で?

777 名前:デフォルトの名無しさん [2009/04/03(金) 15:04:11 ]
>>776
死ね

778 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 15:30:31 ]
で、どこまで理解できて、どこが理解できなくて、
どんなエラーが出るの?

779 名前:デフォルトの名無しさん [2009/04/03(金) 15:40:55 ]
途中で止まっており失礼しました。
わからない点は、!(ret_cd=fetch_data())の部分で、
ret_cdになんの値がセットされているかです。
int型で定義されてはいますが、これに値がセットされるところを
探しても見つけきれないので。
fetch_data関数は、「if(sqlca.splcode==1403)(抽出データが終了したら)
return(1)」という処理が入っているので、セットされる値の変わり目が
はっきりとわかります。
なんだかどうしようもない質問をしてしまったみたいで申し訳ないです。
もう少し詮索してみます。

780 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 15:42:44 ]
>>779
何の値、って、fetch_data() 関数の戻り値でしょ。

デバッガで一行ずつ追ってみれば? もしくは、printf とかで。

781 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 15:59:14 ]
>>779
ret_cd=fetch_data()
のところでret_cdには0か1がセットされる

782 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 17:23:37 ]
もうクビになっちゃえば



783 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 18:00:59 ]
>>766から>>779までの5時間を
本なりサイトなりを使った「基礎からのCの勉強」に充てていれば、
今頃は普通に理解できるようになってたと思うw

784 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 19:46:00 ]
C++言語でファイルのサイズや更新日時を取得する機能を持つクラスを、
#include <stdio.h>
FILE *fopen(const char *, const char *);
int fileno(FILE *);
int fclose(FILE *);
#include <sys\stat.h>
int fstat(int handle, struct stat *statbuf);
の関数や構造体を使って作ったものの、あまり良くないようだ。
大量のファイルを調べると、遅くてハードディスクへのアクセスが、かなりのものだ。
VBでFileLen()やFileDateTime()関数使ったプログラムのほうが速いし、ハードディスクに
ほとんどアクセスしなくて済んでる。
ファイルを開かなくて取得できんのかな。いい方法ないもんか。






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

前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