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


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

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



1 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 15:29:45 ]
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.36【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1175436073/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm


2 名前:1 mailto:sage [2007/05/06(日) 15:30:35 ]
埋めるなら次スレ建てろよなまったく

3 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 15:59:20 ]
埋めるならじゃなくて、こういう板では埋めは荒らしってスタンスじゃないと(ry

4 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 17:25:42 ]
埋めたの1000だけじゃん

5 名前:デフォルトの名無しさん [2007/05/06(日) 22:22:07 ]
初めまして、C++の内部クラスについて質問があります。
例えば、OUTというクラスの中にINNERというクラスがありまして、
そのINNERクラスのメンバ関数から、OUTクラスのメンバ変数にアクセスしたいのですが、
どうすればいいのか分かりません。クラスの宣言の仕方がポイントのような気がするのですが、
メンバ関数の実装は宣言の外で個別に行いたいと思います。
どうか、ご指導、助言等よろしくお願いします。

6 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 22:29:41 ]
Javaとは違うのだよJavaとは

7 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 22:33:07 ]
>>5
#include <iostream>
using namespace std;

class Outer {
  friend class Inner;
  class Inner {
    Outer& outer;
  public:
    Inner(Outer* theOuter) : outer(*theOuter) { }
    void hoge() { cout << outer.foo << endl; }
  };

private:
  int foo;

public:
  Outer() : foo(3) { }
  void hoge() { Inner inner(this); inner.hoge(); }
};

int main() {
  Outer outer;
  outer.hoge();
}

8 名前:デフォルトの名無しさん [2007/05/06(日) 23:14:14 ]
>>6
レスありがとうございます。
確かに検索してもJAVAの情報ばかりでした。
C++ではあまりしないのでしょうか。

>>7
プログラムまで書いて頂きありがとうございます!
まだ全ては理解できていないですが、
Outerクラスのインスタンスを作った時点では、
まだInnerクラスのインスタンスは出来てないんですね。
だから、thisポインタを渡して、インスタンスを作っていると、
そこまでは分かりました。
この方法で私のしたいことが出来そうです。
本当にありがとうございました。




9 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 23:25:16 ]
いやだから
Javaでは親子関係がある(から外側のメンバにアクセスできる)けど
C++ではただのnamespaceみたいなもんだから。
内部クラス単独のインスタンスも作れる。

10 名前:デフォルトの名無しさん [2007/05/06(日) 23:40:27 ]
質問です

int hoge(char inputStr)
{
return inputStr == '\t' || inputStr == ' ';
}

入力された引数inputStr
を数値で返すというのは分かるんですが、
returnの行の動作は
if(inputStr == '\t'){
return 1;
}
else if(inputStr == ' '){
return 0;
}
と同じ意味ですか?



11 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 23:48:02 ]
いや、キミの書き方にあわせるとこうなる

if(inputStr == '\t'){
 return 1;
}
else if(inputStr == ' '){
 return 1;
}
else {
 return 0;
}

12 名前:デフォルトの名無しさん [2007/05/06(日) 23:56:29 ]
>>11
ありがとうございます
解決しました


13 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 14:58:22 ]
>>10
int hoge(char inputStr)
{
if (inputStr == '\t') {
return 1;
}
if (inputStr == ' ') {
return 1;
}
return 0;
}

14 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 23:49:32 ]
振り子の振動をオイラー法を使って解析して
理論上の振動と比較するプログラムをC言語でつくっているのですが、

ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3951.c
このプログラムだと周期が異常に多く、何十秒にもなっていたりします。
位相が小さかったら、この場合だと大体6秒ちょっとだとおもうのですが・・・

どこをどう直せばいいのでしょうか?

15 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 09:34:21 ]
まだ見てないけど、プロファイラとってみては

16 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 09:37:35 ]
って実行時間じゃないのか

17 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 14:31:51 ]
>>14
> /* 理論上の微分方程式の一般解 */
> double differentiation_function(double t){return ( theta_i*cos(sqrt(g/r)*t*RADIAN) );}
DEG → RAD 化係数の場所が違うんでない?

return (theta_i *RADIAN) * cos(sqrt(g/r)*t);

18 名前:14 [2007/05/09(水) 00:31:24 ]
そもそも三角関数の使い方って、こんな感じでよかったものか・・・

19 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 09:31:16 ]
size_t と uintptr_t って、違いが出る環境あるのか?

20 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 09:48:56 ]
例えばDOSのlargeモデルは
ポインタ32bitでsize_tは16bit。

まあ当時uintptr_tなんて名前は無かったが。



21 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 09:53:20 ]
>>19
違う環境は見たことないけど、
Intel 8086 あたりは違うかもしれない。


22 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 09:54:47 ]
なるほど。

23 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 10:01:17 ]
ファイルサイズってなぜかsize_tではないんだよな。


24 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 10:18:41 ]
long > size_t の環境もまさに16ビット環境だな。

25 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 10:19:34 ]
size_tを64bitの型にしなきゃいけないからね。

26 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 10:32:42 ]
fgetpos/fsetpos の方か。

27 名前:デフォルトの名無しさん [2007/05/09(水) 19:10:40 ]
Linux or OS X + GCCです。

foo.cとfoo.hがあって、
foo.hの中でvoid foo()を宣言、
foo.cの中でvoid foo()を定義してるとします。

で、bar.hとbar.cxxがあって、
class barのメンバ関数の内部でfoo()を呼んでいます。

で、これを1つにまとめてライブラリlibfoobar.aにしたいんですが、
1) ccでfoo.cをコンパイル
2) g++でbar.cxxをコンパイル
3) arでlibfoobar.aに合体
という手順を踏みました。

ところが、libfoobar.aを利用したプログラムを書くと、
libfoobar.aとリンクさせたときに
undefined reference to foo()
などと怒られてしまいます。

CとC++を混在させてライブラリ作る時って、
何か違う手順を踏まないといけないんでしょうか?

28 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 19:12:03 ]
extern "C" はしてるの?
あとは、cc って gcc ?

29 名前:27 mailto:sage [2007/05/09(水) 19:21:50 ]
extern "C"が必要なのか。
foo.cのほうは他所から持ってきたパッケージだったので、
中をいじっておりませんでした。
extern "C"をしてきます。
さんくす。

30 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 19:22:09 ]
foo.c の方じゃなくて、foo.h の方に必要。



31 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 19:24:42 ]
コンパイラが違えば、
オブジェクトファイル内で識別子名に _ が付くか付かないか、
付くならどこに付くか、
とかいうややこしい問題があるんだけど、
それは大丈夫なのかね?

32 名前:27 mailto:sage [2007/05/09(水) 19:33:48 ]
ccはGCCです。
foo.hはいじりたくないので、

extern "C" {
#include "foo.h"
}

とbar.hの頭に書いたんですが、
これで問題ないでしょうか。
コンパイルは通るようになったのですが、
普通はfoo.hの中でexternすると思うので、
後になにか弊害を起こすとかありますか?

33 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 19:39:13 ]
>>32
なら、

// foo.hpp
#ifndef FOO_HPP_
#define FOO_HPP_

#ifdef __cplusplus
extern "C" {
#endif

#include "foo.h"

#ifdef __cplusplus
}
#endif

#endif // #ifndef FOO_HPP_

ってのを作って、C++ からは foo.hpp をインクルードするといいよ。
別に弊害はないかと。

34 名前:デフォルトの名無しさん [2007/05/09(水) 19:53:46 ]
s-io.net/up/3/_/jump/1178543434819723.8FBNkd


35 名前:27 mailto:sage [2007/05/09(水) 20:03:18 ]
>>33
ありがとうございます。

CとC++の部分は解決したのですが、
その他所から持ってきたfoo.c/foo.hがですね、
hoge.fも使ってるんです。
hoge.fの中にSUBROUTINE hoge()があって、
今度はリンクするときにhogeがundefinedだと怒られました。
hoge.fはg77でコンパイルしています。

何か、.fも混在させる時の方法があるんでしょうか。
ググっても、1回ライブラリにしてから、というのが見つからない。
何度もすみません。

36 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 20:23:17 ]
F77 もあるのかw
すげーチャンポンだな。

それはまさに >>31 の問題があるはず。
nm コマンドを使うとオブジェクトファイル内のシンボル名一覧が表示されるけど、
gcc の出すシンボル名と g77 の出すシンボル名に違いがあるんじゃないかと思う。
gcc はシンボル名の先頭にアンダースコアを付けるけど、
g77 はまた別の形になってるんじゃないかと。
それが両方で同じになるようにアンダースコアを付けて調整すればうまくいくと思う。

あとは、そのライブラリを使う際に、
F77, C, C++ の標準ライブラリが全てリンクされる状態にしないといけない点にも注意。

37 名前:27 mailto:sage [2007/05/09(水) 21:01:49 ]
>>36
なるほど。
確かにnmすると、アンダースコアがついてました。
そこを直して動きました。
ありがとうございます。

38 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 23:30:46 ]
STLのmapのeraseなんだけど

size_type erase(const key_type& x)

ってことは、xはキーを指定するんだよね?

39 名前:デフォルトの名無しさん [2007/05/09(水) 23:39:49 ]
class Base{
virtual void Complete();
protected:
int m_nStatus;
};
class A : public Base{
void Complete(){ /* A固有の処理(m_nStatusを更新) */ };
};
class B : public Base{
void Complete(){ /* B固有の処理(m_nStatusを更新) */ };
};

↑こんなクラス構成があって、↓に格納されています。
std::vector<Base*> BaseList;

仕様変更で、新規クラスが追加されました。
これが曲者でして、Updateを呼び出すと、自分自身をベクタから削除すると
いう変な仕様でして…。

class C : public Base{
void Complete(){ /* C固有の処理(自分を削除) */ };
};

これを実装するとしたら、どんな方法があるでしょうか?
ヒントでもいいので、教えていただけないでしょうか?

40 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 00:10:05 ]
Updateってやつの記述がないけど、Completeでいいのかな。
問題は自分を管理しているvectorをどうやって知るか、
どのタイミングで知るべきかってことだよね。
CのインスタンスよりもBaseListの寿命が長いことが確実なら、
std::vector<Base *> *m_pBaseList;
をCに追加してコンストラクタで渡すのが手っ取り早いと思うけど。



41 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 00:11:58 ]
>>38
それくらい、ヘルプや規格書読んだりググったりして自分で確認しようよ

42 名前:デフォルトの名無しさん [2007/05/10(木) 01:00:19 ]
環境:Linux gcc

X上CUIで、マッピングが施される前のキーコード(物理的キーコード)をキーが押下された際に取得したいです。
スキャンコードまで低レベルでなくてよく、xmodmap -pk や xev で調べられる KeyCode に相当するものが丁度いいのですが、
showkey のソースを参考にした方法では /dev/console を Xサーバが握ってしまっていて不可能、
xev のソースの方法ではXウィンドウを生成せねばならず、CUI上で実装する方法が見つかりません…。
ncurses の keybound なども試してみましたがこちらはマッピング後のキー情報しか得られませんでした。

最悪 xmodmap した結果をパースして利用するなりでなんとかなるとは思うのですが、
何か都合の良い方法があるのではないかと諦めきれず質問させて頂きました。
識者の方がいらっしゃいましたらご教授くださいませ。

43 名前:39 [2007/05/10(木) 01:43:10 ]
>>40
レスありがとうございます。
参考にさせていただきます。

44 名前:デフォルトの名無しさん [2007/05/10(木) 11:03:54 ]
std::stringのリテラルを埋め込むにはどうすりゃいいのですか

45 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 11:13:12 ]
リテラルの意味が分かってるんだろうか

46 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 11:22:21 ]
>>42
その種の質問はUnixプログラミング質問スレかUnix/Linux板のほうが
回答を得られやすいと思われ

47 名前:デフォルトの名無しさん [2007/05/10(木) 22:01:06 ]
環境:タブ幅4, XP, bcc5.5.1, Cpad

猫でもわかるプログラミング / C言語編 第1部 /
 第69章 ttp://www.kumei.ne.jp/c_lang/intro/no_69.htm
 第70章 ttp://www.kumei.ne.jp/c_lang/intro/no_70.htm

第70章について、#include <stdlib.h>,<ctype.h>,<string.h>
が抜けているのはすぐに解かるのですが、
第69章から第70章になり、変数宣言などが書き換えられてから
実行結果で"A1"が入力できずに以下のように判定されてしまいます。
    if (check_location(row, col) != 0) {
      Locate(hOut, 0, MASU + 3);
      printf("そこには置けません!");
      goto INP;
      }
また、後手を選択すると"A2"も入力できず同様に判定されます、このときコンピュータは"A2"に置けます。

48 名前:デフォルトの名無しさん [2007/05/10(木) 22:01:48 ]
入力した"A1","A2"に何が入っているか調べるため
    printf("そこには置けません!  %d,%d", row, col);
とすると、(0,0)、(0,1) となり問題は無いはずなのですが
何処を直したら良いのかわかりません。第70章、第71章をコピペしても同様な状態です。
ソースどす
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3962.c

以下のsけいしさんのサイトではチェックされていませんでした。
 sけいし発のホームページたち / DevC++でC++入門
 ttp://skeishi.web.fc2.com/dev-cpp/neko/neko.html

コメントまみれで汚いですが突っ込みお願いします。

49 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 00:09:56 ]
惜しい、猫の話じゃなければ相談に乗るんだが。

50 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 00:10:27 ]
>>42
つ[XLibスレ]



51 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 14:58:41 ]
>>48
printf("そこには置けません! %d,%d, %d", row, col, ban[row][col] );
こうすると、A1の時にはban[0][0]になんか値が入ってるぞ。
値が入ってたら、check_locationが!0を返すのは仕方ない事だな。

で、main()の宣言直後に初期化してみたが、
// init
for ( row=0; row<MASU; ++row )
for ( col=0; col<MASU; ++col )
ban[row][col] = 0;
それでも現象が変わらんね。
調べるのが面倒になったから、check_locationを改変してお茶を濁す。
int check_location(int row, int col) {
if (ban[row][col]!=1 && ban[row][col]!=2)
return 0;
else
return -1;
}
これでA1に置けるようになったぞ。

でもなんか石を取るロジックとかバグ多くないか?w

52 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 20:30:51 ]
class A
{
public:
virtual A& a()
{
return *this;
}
};

class B : public A {};

int main()
{
B b = A().a();
}

とするとAをBに変換できないって怒られるけど、いちいちBでもa()をオーバーライドしないとダメ?
理屈は分かるんだけど、継承してるんだから勝手に変換してくれりゃいいのに・・・
↑みたいなことやるのに何か良い方法ないですか?


53 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 20:42:31 ]
>>52
> B b = A().a();
では B(const A&) というコンストラクタが呼ばれる事になる。
だから、それを作る必要がある。

54 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 20:55:35 ]
>>53
サンクス。派生するたびにいちいち面倒な・・・
Bから呼ばれたa()のthisはBのポインタなんだからBに代入できても良いと思うんだけどなぁ。
なんで勝手に virtual B& a() を定義してくれないんだろう。


55 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 20:58:34 ]
情報が足りないんだから当たり前じゃ。

56 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 21:03:58 ]
>>54
Bから呼ばれたってどういうこと? >>52 では A() に対して a() を呼び出してるんだろ。
B& なんて返せるわけ無い。

57 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 21:10:59 ]
virtual B& a() が勝手に定義されるなど、なんて恐ろしい((((;゚Д゚)))ガクガクブルブル

58 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 22:00:41 ]
sizeof(A) != sizeof(B)
だったらどうなると思う?

59 名前:42 [2007/05/11(金) 23:25:57 ]
アドバイス・誘導をして頂いた方、ありがとうございます。
微妙なスレ違いで申し訳ありませんでした。

60 名前:デフォルトの名無しさん [2007/05/12(土) 00:10:17 ]
printf("%s/n","Hello World");

上のprintf文の%sでどのように"Hello World"を処理しているのか分かりません。
どなたかご教授して下さい。



61 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 00:23:25 ]
XのCUIってどういうこと?xterm上で起動してたりしたら、
それを検出してX->xtermの入力を掻っ払うってはなし?
ktermとかmltermとかだったり、間にscreenがはさまってたり、
したらどうするわけ?

62 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 00:29:52 ]
爪楊枝でとる

63 名前:デフォルトの名無しさん [2007/05/12(土) 00:34:05 ]
すいません,c++勉強始めたばかりの超初心者です.
とあるc++のソースをc#に書き換えるという作業をしているのですが,下記記述の意味がわかりませんでした.
MyClass* mc;
mc = (Myclass*) aList -> at(n);

aListは List* aListで宣言してあります.
なぜリスト型のポインタの前で,再度クラスのポインタを()の中に記述するのでしょうか?

どうぞよろしくお願いいたします.

64 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 00:36:25 ]
優先順位。

mc = (Myclass*) ( aList -> at(n) );

65 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 00:47:46 ]
>>63
それはキャスト演算。

aListは、T型のオブジェクトを要素としてやりとりするようになっているのだと思う。
(Tが何なのか俺にはわからないので、これは仮称)
そしてaList->atの戻り値の型はT*。
MyClassはTから派生しており、MyClassへのポインタへダウンキャストしているのだろう。

C#はわかるというなら、aListの型がSystem.Collections.ArrayList、
T*はobject、atをインデクサだと思えば事情は大体同じ。

66 名前:63 mailto:sage [2007/05/12(土) 01:02:07 ]
>>64
>>65

ありがとうございました.
キャストだったんですね...ポインタにキャストできるって初めて知りました.
また考えてみます.

67 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 01:18:27 ]
>>60
const char* str = "Hello World";
printf("%s/n", str);

こう書けばわかるか?

68 名前:デフォルトの名無しさん [2007/05/12(土) 01:53:38 ]
>>67
strのポインタが指す'H'のアドレスから'\0'までの文字を%sが文字列として表示してくれる
ということですか?

69 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 01:57:00 ]
>>51
ban[row][col]、気がつきませんでした、値が入ってしまってますね。
初期化と改変の流れまで教えていただきありがとうございました。

ロジックは猫に習ってということで、
あとあとリバーシのアルゴリズムを勉強するときにちゃんとしたものをゴリゴリします。

70 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 10:32:53 ]
>>68
「printf 書式指定」でググるか、開発環境に付いてるマニュアル読め



71 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 14:52:41 ]
sprintf使ってみ

72 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 20:23:20 ]
std::stringを継承して、メンバ関数を増やしたクラスを作りたいんですが、
(具体的には、中身UTF-8nに特化した文字列クラスを作りたい)

class my_string : public std::string
{
public:
  my_string() : std::string() {}
  my_string(const char* src) : std::string(src) {}
  my_string(const my_string& src) : std::string(src) {}
  …
}

こんな感じでコンストラクタをずらずら書いていって、
あとは自分の好きなだけメンバ関数増やしていくだけで大丈夫ですか?

73 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 20:43:44 ]
>>72
std::string はデストラクタがバーチャルじゃ無いので、
オブジェクトの削除時には注意が必要。
具体的には、
std::string *str = new my_string("('A')");
...
delete str;
とやるとstd::stringのデストラクタが呼ばれてしまう。
ほとんどの場合は大丈夫だと思うのだけど、
ふとした拍子にはまることになるかもしれない。

74 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 09:14:28 ]
wstringでも使っとけ

75 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 14:59:30 ]
関数の前にコロンを二つ付けるのは
何の意味があるんでしょうか?

76 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 15:21:14 ]
aが1かそれ以外になるタイミングはプログラマが完全に把握でき、
処理nanntokaが頻繁に起こる場合において、

//hinnpann
if(a==1){
 //nanntoka
}

とするか

//junnbi
void voidfunc(){}//何もしない関数
void nanntokafunc(){ /* nanntoka */ }
void(*pfunc)();//a==1ならnanntokafuncが、それ以外ならvoidfunc

//hinnpann
pfunc();

とするかでは、後者の方が条件判断をしない分早いんですか?
それとも無駄に何もしない関数にジャンプする分だけ遅いんですか?
あと歯を磨くのが面倒くさいので、
手軽に口内の歯垢を生成する菌そのものを除去するオススメの方法って知りませんか?

77 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 15:26:54 ]
>>76
速度は実測が基本。

菌の除去には強酸を使うのはどうだろう?
塩酸とか硫酸とかでよーくうがいすれば、きっと菌なんて生きてられないはず。

78 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 15:27:45 ]
>>75 スコープ解決演算子

79 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 15:32:41 ]
やっぱりCPUによって違いますよね・・・。
「頻繁」とか、曖昧な表現をしてすみませんでした。

塩酸や硫酸は、練り歯磨き粉に入ってる分だけでも痛いのに
リステインなどは泣きそうになるほど厳しいです。
ミュータンス菌も生きるために必死だから、そうそううまい話なんてありませんよね。

80 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 18:11:27 ]
水酸化ナトリウムや水酸化カリウムなんかの強塩基でも菌を破壊できます。



81 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 19:35:17 ]
>>75
グローバルスコープだね。
ローカルと明示的に分ける場合に必要


82 名前:デフォルトの名無しさん mailto:age [2007/05/13(日) 20:29:41 ]
// Foo.h
class Foo {
private:
int a;

public:
static int GetA() const
};

// Foo.cxx
#include "Foo.h"
int Foo::GetA const
{
return a;
}

っていうのは、なんか間違ってますか?
GCCで
./include/Foo.h:6: error: static member function 'static int GetA()' cannot have cv-qualifier
src/Foo.cxx:2: error: static member function 'intt Foo::GetA() const' declared with type qualifiers
と怒られます。

staticメンバ関数ってconstに出来ないんでしょうか。


83 名前:82 mailto:sage [2007/05/13(日) 20:31:18 ]
簡略化して書くときに書き間違えました。
実際には、int aはstaticになっていて、
Foo.cxxの中で定義されてます。

84 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 20:34:34 ]
staticはthisがないという指定なのに、
thisをconstにする指定を併用しても仕方ない

85 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 20:34:35 ]
>src/Foo.cxx:2: error: static member function 'intt Foo::GetA() const' declared with type qualifiers

intt?

セミコロンもないし、単純ミスじゃね?

86 名前:82 mailto:sage [2007/05/13(日) 20:40:11 ]
>>84
あー、なるほど。そういうことですか。

>>85
実際のコードはもっと長いので、
抜き出して書いてます。
inttとか、GetAに()がついてないのとかは、
簡略化したときの打ち間違い。

ってーことは、例えばGetAの中でa++とかやったりとかして、
const関数にしておけばコンパイラが注意してくれるのに、
っていうのは期待できないということですか。

87 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 20:44:51 ]
簡略化するときに何カ所も間違えるようなうっかりさんは、
実際のコードでもミスしてそうだな

88 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 20:48:20 ]
エラーメッセージはコピペだろうから、
intt ってのはリアルで間違ってんじゃね?って思って指摘したんだけどな

89 名前:82 mailto:sage [2007/05/13(日) 21:00:52 ]
本当に申し訳ございませんでした。
皆さん、ありがとうございます。

90 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 21:56:10 ]
すみません。ポインタの素朴な疑問です。
いれこの構造体enemyを固定領域に確保したいときは
struct enemy {
short mainface;
short b;
struct POS Pos[32];
};
struct POS {
short X;
short Y;
};
struct enemy *enemy_struct;
enemy_struct = (enemy*)malloc(sizeof(struct enemy));
でいいんですか?
あとsizeof(struct enemy*)=4ってなるんですけど
struct enemy *enemy_struct;で消費されるenemy型へのポインタの
メモリ領域は4Byteってことですか?

よろしくお願いします。



91 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 22:04:45 ]
>struct enemy *enemy_struct;
>enemy_struct = (enemy*)malloc(sizeof(struct enemy));
>でいいんですか?
だめです。型違いです。

>あとsizeof(struct enemy*)=4ってなるんですけど
struct enemy *enemy_struct;で消費される4byteでおけ



92 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 22:11:23 ]
んんん?問題なくね?

93 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 22:17:37 ]
... = (enemy*)malloc( ...


94 名前:90 mailto:sage [2007/05/13(日) 23:18:34 ]
すんません。型違いということは
..=(struct enemy *)malloc(..
と訂正すればいいんですか?

95 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 01:01:39 ]
>>94
そうだね。それでおk。
実際コンパイルしてみて確認すればいいと思うよ。
入れ子であっても特に使い方に変わりはないよ。
自己参照構造体と呼ばれる特殊な入れ子は慣れるまで厄介(慣れれば便利)
なんだけど、今回はそれじゃないし。
にしても、short変数とか微妙なの使うなあ。

ところでstructが省略できないって事はCを使用しているんだね。
C++では省略が許されたはず。「//」によるコメントみたいに
C++で先に作られてから後になって、ANSIがCの文法として認めたものも
あるから将来は>>90のような書き方も許されるかも。

まあtypedefすれば良いだけなんだけどね。

96 名前:デフォルトの名無しさん [2007/05/14(月) 01:08:45 ]
printf("1¥n");
printf("2¥n");
printf("3¥n");

としたあとに1、2、3を4、5、6と上書きしたいんですが、
CRで先頭に戻るのは分かるのですが(最終行は上書き可能)、
1行前に戻るってのはできるんでしょうか?

97 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 01:18:53 ]
それは処理系依存な方法を使わないとダメ
エスケープシーケンスとか、ConsoleAPIとか

98 名前:96 mailto:sage [2007/05/14(月) 01:26:38 ]
>>97
すいません。環境書き忘れてました。(VT100相当)
エスケープシーケンスでググって、
printf("¥x1b[3A");
で解決しました。
ありがとうございます。


99 名前:デフォルトの名無しさん [2007/05/14(月) 01:52:37 ]
>>90のやり方でもコンパイルは通るんだな。

100 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 12:50:17 ]
asdf<int (int)> a;

みたいな事がしたいんですが、asdfの定義はどういう風にすれば良いかはなんてググれば詳しく出てくるんでしょうか



101 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 12:53:32 ]
boost::function

102 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 12:54:17 ]
なるほど

103 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 13:00:06 ]
asdf<int (*)(int)> a;

のことか?

104 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 13:03:15 ]
なんだと

105 名前:デフォルトの名無しさん [2007/05/14(月) 14:32:49 ]
C言語のあるプログラムで、
Cファイルではなく、hヘッダに
関数を実装している人がいるんですけど
普通なんですか?
やっぱりヘッダに実装する方がベターなんでしょうか?

106 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 14:42:46 ]
はっきり言ってどっちでも良い。
技術的でない話題はマ板へ

107 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 15:00:45 ]
どっちでも良くないよw

ヘッダに実装できるのは内部リンケージの関数だけだけど、
そんなことやっちゃったら同じ関数が複数のソースに定義されて
無駄にも程がある状況になる。

ヘッダに実装する必要があるのはインライン関数だけ。
他は普通はヘッダに実装してはいけない。

108 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 15:11:06 ]
インクルードガードやってたから気づかなかった

109 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 15:16:39 ]
インクルードガードとは関係ない話。
a.h を a.c と b.c でインクルードすれば
a.c と b.c の両方に関数定義が展開される。

110 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 15:17:55 ]
インクルードガードしてりゃそんなけったいなことにはならんだろ。



111 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 15:18:54 ]
と、思ったがなるな。スマン

112 名前:105 [2007/05/14(月) 15:23:06 ]
そうですね。勉強になりました。
ありがとうございました。

113 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 15:48:21 ]
C++ だとテンプレートの実装もヘッダに書く必要がある。
export なんてあってないような仕様だし。

クラスの宣言内に直接関数定義することもあるけど、
これはインライン関数になるから >>107 の範囲内。

114 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 16:55:40 ]
>>a.h を a.c と b.c でインクルードすれば
>>a.c と b.c の両方に関数定義が展開される。
それはへたくそなインクルードガード。
関数の重複インクにならんやり方はちょっと考えれみれ。直ぐわかるやろ。
a.h
 #ifndef …
a.c
 #incliude "a.h"
 …
b.c
 #incliude "a.h"
 …
ただし、それがエエ方法やとは言うてへんど。

115 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:06:20 ]
>>114
重複インクルードが問題なのではなく、同じ関数が複数リンクされることが問題。
理解できていないなら、無理にレスしなくていいからね。

116 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:38:43 ]
>>重複インクルードが問題なのではなく、同じ関数が複数リンクされることが問題。
>>理解できていないなら、無理にレスしなくていいからね。
だから、「同じ関数が複数リンク]されない方法があるって言うとんじゃ、阿呆かいな。
それとも、ホンマの初心者か?

117 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:46:42 ]
そういう方法があるんかしらんが、>>114では何の解決にもなってない。

118 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:48:08 ]
>>116
>「同じ関数が複数リンク]されない方法がある
だったらそれを書き給え。

尤も、それならそれで>114の「関数の重複インクにならんやり方」は
一体全体なんなのかという疑問は残るが。

119 名前:≠114 mailto:sage [2007/05/14(月) 17:51:13 ]
>>118
これでOK。
--a.h
#ifdef NEED_FUNC
void func() {}
--a.c
#define NEED_FUNC
#include "a.h"
--b.c
#include "b.h"
--
ただし、これをインクルードガードとは言わないと思う。

120 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:53:03 ]
それだとa.cでfuncが使いたいときに困るだろ。



121 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:54:27 ]
114のインクファイル中の記述で、ちょっと工夫したら(ヒントは関数の定義じゃ)できると言うとんじゃ。
これだけ言うたら、普通のC言語1年坊主でも気が付くど。気が付かんようなら、C諦めた方がええで。
それより、こんなレベルで初心者を教えるな! 初心者も迷惑じゃ。

>>だったらそれを書き給え。
誰に向かって言うとんじゃ、ボケ。

122 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:55:50 ]
すみません、喧嘩しないで頂けますか?

123 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:56:24 ]
>>121
分からなくても別に誤魔化さなくていいよ。
俺だって分かんないんだもん。

124 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:58:28 ]
まだわからんか?
そもそも”関数名”て何や?

125 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:58:51 ]
まさかstaticを付けるというオチでは・・・

126 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:59:44 ]
void foo ( ナンたらこたら…
↑で "foo" は何をしとるんや?

127 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:00:37 ]
#define foo
↑で foo は何をされとんねん?


128 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:00:44 ]
>>121
もちろんその方法では、
* a.h に関数の実装を記述する。
* a.c, b.c でインクルードすればどちらからでも使える。
* 関数は重複してリンクされない。
が満たされるんだよな。

129 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:01:33 ]
>>127
焦らさないでくれよ

130 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:01:36 ]
当たり前だのクラッカ




131 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:02:38 ]
もったいぶっちゃって、どうせそんな方法ないんだろ・・・

132 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:05:42 ]
void foo ( なんたらこたら


void bar (ああでもこうでも

#ifndef foo
printf ( "宣言済み" )
#else
printf ( "未宣言" )
#endif


これでもわからんか?


133 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:07:29 ]
void foo ( なんたらこたら

#undef foo
int foo ( ああでもないこでもない

これではどや?


134 名前:≠114 mailto:sage [2007/05/14(月) 18:08:42 ]
staticつけても同じ(内容の)関数が複数リンクされることには違いないしなぁ。
双方のソースから同じ名前で参照される別物の関数と言う条件だと、
どうにもならない気がしてきた。

>>132
まさかとは思うけど、関数を定義したかどうかをディレクティブで
判定できるなんて思っちゃいないよね?
そろそろ正解をどんと出してみてよ。

135 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:08:47 ]
訂正
誤:int foo ( ああでもないこでもない
正:int foo ( ああでもないこうでもない


136 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:09:19 ]
>>133
俺頭悪いからわかんないんだって・・・
意地悪しないで教えてくれよ

137 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:12:58 ]
わかった。リンカディレクティブだッ(w

138 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:15:32 ]
静的メンバ関数として実装するとか?
struct HOGE_unique{
static int hoge() { ... }
};
#define hoge Hoge_unique::hoge

139 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:17:24 ]
もはやCじゃないがな

140 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:19:45 ]
// aaa.h
#ifndef test
int test(int i){return i + 10;}
#endif

// bbb.c
#include "aaa.h"
int test ( int i );
int foo(int i){return test(i)+10;}

// main.c
#include <stdio.h>
#include "aaa.h"
void foo(int i);
int main(void){printf("%d",test(i)+foo(i);}




141 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:23:16 ]
只今>>133は>134を読んで真っ青になっている最中です。
次の御託を思い付くまでもう暫くお待ちください。

142 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:23:51 ]
↑アホ

143 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:30:33 ]
>>137
ttp://sund1.sakura.ne.jp/uploader/source/up5445.mp3

144 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:32:28 ]
>>140
こんなふうにプリプロセスされました。

// main.c
#include <stdio.h>
int test(int i){return i + 10;}
int foo(int i);
int main(void){printf("%d",test(1)+foo(1));}

// bbb.c
int test(int i){return i + 10;}
int test ( int i );
int foo(int i){return test(i)+10;}

145 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:34:23 ]
>>140
testなんかどこで#defineしてるの?

146 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:35:01 ]
test は何回定義されとるん?アセブルリスト見てみ?


147 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:36:30 ]
>>145
宣言されとらんから次のtest()がインクルードされるねんやんかいな。

148 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:39:30 ]
トリッキやよって別々ライブではとおらんけどな。
わしが言いたいのんは「決めつけんな」ちゅうこと。

149 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:40:53 ]
$ gcc -c main.c bbb.c

$ nm main.o
00000000 b .bss
00000000 d .data
00000000 r .rdata
00000000 t .text
U ___main
U __alloca
U _foo
0000000b T _main
U _printf
00000000 T _test

$nm bbb.o
00000000 b .bss
00000000 d .data
00000000 t .text
0000000b T _foo
00000000 T _test

どう見ても両方にtestが含まれてるんだが

150 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:41:22 ]
つまり、関西弁のような発言に見えるからと言って、関西人だと決めつけるな、ということですね?




151 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:42:26 ]
↑そうそう。
それと、gcc はバカやよって別別オブジェ作るねん。

152 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:43:00 ]
なんだ、もう少し笑わせてくれるのかと思ったら意外に伸びなかったな。がっかりだぜ。

153 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:43:09 ]
ようするにはったりだったわけだろ

154 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:44:08 ]
違うやろ、call _test のアドレス見れ

155 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:49:46 ]
char line[] = "abcde¥012345¥0ABCDE";
みたいなことやりたいんですが、
'¥0'があるために、
lineの中身は"abcde¥0"となってしまいます。

当たり前と言えば当たり前なんですが、
回避方法はあるでしょうか。
'¥0'を含む長いchar配列を、
classのstatic constメンバ変数として持たせたいんです。

156 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:50:49 ]
>>155
> lineの中身は"abcde¥0"となってしまいます。
どうやって確認したんだよ。
ちゃんと最後まで入っているはずだ。

157 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:51:27 ]
初心者アドバイザは、今、それどころやありません。

158 名前:154 mailto:sage [2007/05/14(月) 18:52:42 ]
「長いchar配列」というのは、数万文字あります。
なので、配列長を確保してから1つずつ代入というのは厳しい。
そんなもん別のテキストファイルにして必要なときに読めよ、
という以外のでお願いします。

159 名前:155 mailto:sage [2007/05/14(月) 19:02:58 ]
#include <iostream>

using namespace std;

int main()
{
char line[] = "abcde¥012345¥0ABCDE";
for(int i=0; i<18; i++){
cout << "(" << line[i] << "," << (int)line[i] << ")";
} // i

return 0;
}

$ ./a.out
(a,97)(b,98)(c,99)(d,100)(e,101)(
,10)(3,51)(4,52)(5,53)(,0)(A,65)(B,66)(C,67)(D,68)(E,69)(,0)(,0)(,0)

となります。

160 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 19:05:13 ]
>>159
コンソールで確認するなよ・・・



161 名前:155 mailto:sage [2007/05/14(月) 19:07:45 ]
> lineの中身は"abcde¥0"となってしまいます。
は不正確でした。すみません。
"12345"の"12"が改行コードLF=10になっています。


162 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 19:08:43 ]
>>159
char line[] = "abcde\0" "12345\0" "ABCDE";
こうしとけ。

163 名前:155 mailto:sage [2007/05/14(月) 19:10:14 ]
>>160
あれ?なんかまずかったですか?
見やすいかと思って。
i=15, 16, 17のときに(,0)となってるので、
ここに何も入ってないんですよね。
なんで"¥012"が"¥0¥n"に化けてしまうのか。

164 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 19:12:28 ]
"\012" が {'\0', '1', '2'} ではなく {'\012'} とみなされてるんだから、
配列の全長が2文字分みじかくなってる。

つまり最後の二つの0は不正なアクセス。

165 名前:155 mailto:sage [2007/05/14(月) 19:12:35 ]
>>162
その方法で、
(a,97)(b,98)(c,99)(d,100)(e,101)(,0)(1,49)(2,50)(3,51)(4,52)(5,53)(,0)(A,65)(B,66)(C,67)(D,68)(E,69)(,0)
になりました。
ありがとうございます。

166 名前:155 mailto:sage [2007/05/14(月) 19:13:53 ]
>>164
ああ、octで解釈されてるわけですか。
なるほど。



167 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 19:24:34 ]
>>159
みたいに
for(int i=0; i<10; i++){
} // i
とか
if(hoge){
} // if
っていう書き方を推奨してる本って、
なんかありませんでしたっけ?
この書き方をどっかで読んだ記憶があるんです。

168 名前:54 mailto:sage [2007/05/14(月) 21:52:47 ]
>>55-58
class A
{
int a;
public:
A(int i) : a(i) {}
A& geta() { return *this; }
virtual void prt() const { printf("a:%d\n", a); }
};
class B : public A
{
int b;
public:
B(int i) : A(0), b(i) {}
virtual void prt() const { printf("b:%d\n", b); }
};
int main()
{
B b(100);
b.geta().prt();
}

これを動かすと「b:100」と表示されて、geta()はA&を戻す筈なのに実際は
B&を戻している訳ですよ。B&を返すメソッドを勝手に定義してくれたほうが
よっぽど自然だと思うんですが、私が愚かしいこと言ってるんですかね?


169 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 22:21:23 ]
うん、けっこう愚かしいと思うよ…。

170 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 22:25:34 ]
>>168が理解できない
どこでB&を戻してるの?



171 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 22:28:25 ]
>>168
class C : public B
{
public:
  A& geta()
  {
    static A a(0);
    return a;
  }
  //コンストラクタほか省略
};
このとき、こうされたらどうする?
C c;
B& b = c;
b.geta().ptr();
B型の式に対してgeta()を呼ぶとB&が返ってくることにしたら、
このb.geta()ではA型のインスタンスへの参照を返しているので型システムを侵すことになる。

だから暗黙的にやらないで、B内ではB&を返すgetaを明示的にオーバーライドしてやったほうがいい。
次のコードはC::getaでコンパイルエラーになる
struct A {virtual A& geta();};
struct B : A {virtual B& geta();};
struct C : B {virtual A& geta();};

172 名前:171 mailto:sage [2007/05/14(月) 22:30:14 ]
すまん
168のgetaも仮想関数だと思い込んでいたorz

173 名前:デフォルトの名無しさん [2007/05/14(月) 22:41:55 ]
とあるソースを読んでいる初心者です.
クラスClass1のヘッダファイル先頭に,下記のように他のクラスClass2,Class3の記述がありました.

#ifndef *******
#include ************
class Class2; class Class3; ←これ

class Class1
public 以下略

これはいったいどういう意味を持つのでしょうか?

174 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 22:57:07 ]
Class2, Class3は別のところでちゃんと定義されてますよ
ってコンパイラに教えるためのおまじない

175 名前:54 mailto:sage [2007/05/14(月) 22:58:24 ]
>>171
なるほど。そのとおりでした。
サンクス。

176 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 23:01:02 ]
>>173
試しにその行を削除するなりコメントアウトするなりしてコンパイルしてみろ
たぶんエラー吐くから

177 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 02:58:46 ]
>>168
そのルールでいくと、自分の型のポインタか参照を返すようなメソッドは
すべて下位クラスで再定義する必要がある。
('return *this' だけのメソッドは特別なんていうルールを採用する?)
ちなみに、以下のようなプログラムではどんな結果になるべき?

void prt3(A* obj) { printf("prt3(A)\n"); }
void prt3(B* obj) { printf("prt3(B)\n"); }

class A {
public:
 A() {}
 virtual void prt() const { printf("A::prt\n"); }
 void prt2() const { printf("A::prt2\n"); }
 // thisの型はA?,B? return時だけB?
 A& geta() { prt(); prt2(); prt3(*this); return *this; }
};

class B : public A {
public:
 B() {}
 virtual void prt() const { printf("B::prt\n"); }
 void prt2() const { printf("B::prt2\n"); }
};

int main() {B b; b.geta(); }

結果
B::prt
?::prt2
prt3(?)

178 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 03:35:58 ]
*thisをthisにしてVC2003でコンパイル

結果:
B::prt
A::prt2
prt3(A)

179 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 18:49:47 ]
VS2005,XPです。

HWND hwnd;
RECT rc;
GetWindowRect(hwnd,&rc);
if ((rc.bottom-rc.top) == GetSystemMetrics(SM_CYCAPTION))

うまくいかないのですが、こういう比較の仕方は使えないのでしょうか?
使えない場合、どのように直せばいいですか?



180 名前:デフォルトの名無しさん [2007/05/15(火) 19:33:30 ]
クラスなどを使って、通常存在しないサイズの変数にアクセスできませんか?
int型の変数を24と8ビットに分けて使うような

x.aは24bit
x.bは8bit
として使いたいんですが



181 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 19:33:42 ]
>>17
D&Eには、できるようにしたところでメリットがない(オーバーライドできる仮想関数がない)し、
Cの型変換のルールが混沌としていて内蔵型をクラスとして扱おうとしてもうまくいかないと、
そうできるようにしなかった理由が書かれている。


182 名前:180 [2007/05/15(火) 19:34:31 ]
代入、参照が普通の変数のように出来る方法を教えてください

183 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 19:35:55 ]
>>180
どうしてもやりたいなら、ビットフィールドがその目的に使える。
但し、移植性を大きく損なうことになりかねないので注意。

184 名前:デフォルトの名無しさん [2007/05/15(火) 19:40:06 ]
>>183
サンクス!!!

185 名前:デフォルトの名無しさん [2007/05/15(火) 19:59:46 ]
>>183
すみません boolとcharだとどっちを使った方がいいとかありますか???

struct A{
char n : 1; char m : 7;
};

struct A{
bool n : 1; bool m : 7;
};

186 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:02:53 ]
>>179
何をしたいのか分からんが、使える。

187 名前:185 [2007/05/15(火) 20:07:05 ]
自己解決しました
移植性を考慮して、unsigned char n : 1; にしておきますね

188 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:10:51 ]
移植性が欲しいならunsigned intにしておけ

189 名前:デフォルトの名無しさん [2007/05/15(火) 20:12:37 ]
>>188
サイズは出来るだけ削りたいんです
上の例では32bit使っていますけど
8bit以内ならcharのほうが削れます

190 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:13:25 ]
ビットフィールドに使えるのはsignedかunsignedのintだけ。



191 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:15:54 ]
ビットフィールドの移植性って実のところどうなの?
一応、標準だよね?

192 名前:デフォルトの名無しさん [2007/05/15(火) 20:16:15 ]
bcc(c++)だと使えますけど

193 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:21:35 ]
>>192
処理系依存で他の型が使えても構わないことにはなっている。

194 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:22:42 ]
C++ならほとんどの整数型が使えるだろ。

195 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:31:15 ]
>>189
unsigned charがビットフィールドに使える処理系で、
同じ8ビットのビットフィールドでもunsigned intにするかunsigned charにするかで
違いが生じるなんて話聞いたことがない。

196 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:42:39 ]
>>195
#include <iostream>
template<typename T> struct S { T a: 1; T b: 7; };
int main() {
std::cout << "sizeof(S<unsigned int>) = " << sizeof(S<unsigned int>) << std::endl;
std::cout << "sizeof(S<unsigned char>) = " << sizeof(S<unsigned char>) << std::endl;
}

g++だと違う結果になったが。

197 名前:デフォルトの名無しさん [2007/05/15(火) 20:42:42 ]
>>195
違いますけど・・・

#include <stdio.h>
int main(void){
struct A{
unsigned int m : 1;
unsigned int n : 7;};

struct B{
unsigned char m : 1;
unsigned char n : 7;};

printf( "%u\n", sizeof(struct A) );
printf( "%u\n", sizeof(struct B) );
return 0;}

198 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:51:15 ]
VC8で確認。こちらも違った。

199 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 21:54:53 ]
VC7.1でも違った。

200 名前:デフォルトの名無しさん [2007/05/15(火) 21:58:58 ]
ふつう違うよな
int とchar
一バイトと四バイトだんもんな



201 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 22:01:29 ]
その理屈はおかしい。

202 名前:デフォルトの名無しさん [2007/05/15(火) 22:29:47 ]
BCC55で次のソースをコンパイルするとリンカがエラーを出すのですが、
私は何を誤っているのでしょうか?
どう直せばよいか教えていただけないでしょうか。

●ソース
#include<iostream>
class Singleton {
public:
 static Singleton getInstance() {
  if(&singleton == '\0') {
   singleton = *(new Singleton());
   std::cout << "Created!" << std::endl;
  } else {
   std::cout << "Not Created!" << std::endl;
  }
  return singleton;
 }
 ~Singleton() {}
private:
 static Singleton singleton;
 Singleton() {}
};

int main() {
 Singleton s1 = Singleton::getInstance();
 Singleton s2 = Singleton::getInstance();
}


203 名前:202 [2007/05/15(火) 22:31:15 ]
エラーの内容は次の通りです。

●コマンドラインとエラー
X:\>bcc32 -nX:\data\bin -5 -f X:\data\src\Singleton.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
X:\data\src\Singleton.cpp:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル 'Singleton::singleton' が未解決(X:\DATA\BIN\SINGLETON.OBJ が参照)

204 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 22:33:49 ]
一時オブジェクトとして使うならコンストラクタ呼び出さないと駄目ぽ
Singleton()::getInstance();

205 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 22:39:53 ]
static変数の実体がないって怒ってるわけなんだが…

そんなことよりも、何もかもが誤りだから
ポインタと参照とシングルトンの勉強をしたほうがいいと思うよ。

206 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 22:41:02 ]
>>202
クラスの静的メンバ変数は、外部で定義しなければならない。
Cのグローバル変数がヘッダで宣言して、どこか1ヶ所で定義するのと同じ理屈。

それはともかくマルチスレッドを考慮しないのなら、単にこうでいい。
class Singleton {
public:
 static Singleton getInstance() {
  return singleton;
 }
 ~Singleton() {}
private:
 static Singleton singleton;
 Singleton() {}
};

static Singleton Singleton::singleton;
マルチスレッドを考慮するなら、Singletonはポインタ、
当然std::auto_ptrやboost::scoped_ptrあたりにすべき。

207 名前:202 mailto:sage [2007/05/15(火) 23:07:21 ]
>>204-206
有難うございます。
マルチスレッドやboostのライブラリは当分手を出しません。
コマンドラインアプリをある程度満足に作れるようになってから先に行きます。
まだポインタの使い方も習得できてないわけですし。

ずっとJavaをやってきたんですが、アレは全部参照扱いだから
ポインタと実体を意識するシーンは限定されてたんですが、
C++はそうでないから難しいです。
C++プログラマにJavaを教える本はあるのに、その逆はないんですよね。
仕事ではないので、手探りでなんとかやっていこうと思います。

208 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 23:12:41 ]
Accelerated C++マジオヌヌメ

209 名前:206 mailto:sage [2007/05/16(水) 00:07:44 ]
>>206
getInstanceがSingletonへの参照を返すようにするのを忘れていたorz
正しくはこう
class Singleton {
public:
  static Singleton& getInstance() {
    return singleton;
  }
private:
  static Singleton singleton;
  Singleton() {}
  Singleton(const Singleton&);
  ~Singleton() {}
  Singleton& operator =(const Singleton&);
};


210 名前:202 mailto:sage [2007/05/16(水) 01:31:34 ]
>>208
Amazonのレビューによると、
既に他言語の知識がある人間にとって丁度良い本のようですね。
店頭で探してみます。

>>209
ありがとうございます。
operatorを使うんですね・・・。
まだ「パッと見」で、なぜこれがシングルトンを実現するのかが
分からないレベルなので、ソースを研究してみます。



211 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 01:44:03 ]
Singleton(const Singleton&);
Singleton& operator =(const Singleton&);
はインスタンスのコピーを禁止するためのちょっとした工夫だよ。
privateにする&処理の内容を記述しないことで、
コピーしようとしたらコンパイルエラーになるようにしてる。
あと、コンストラクタをprivateにしてるのも、
getInstance()以外で勝手にインスタンスを作られないようにするため。

212 名前:202 mailto:sage [2007/05/16(水) 01:58:23 ]
>>211
ありがとうございます。
なるほど、インスタンスのコピー禁止も意識しないといけないんですね。
privateなコンストラクタについては、Javaも同じ手法なのでわかりました。

213 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 06:57:01 ]
C++で読むデザインパターン
ttp://www.01-tec.com/document/cpp_design_pattern.html

214 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 09:59:08 ]
XPです。
タスクトレイのアイコンを指定しても違うアイコン(赤い×マーク)が出るんですけど何故でしょうか?
アイコンは32x32,256色と16x16,256色が入ってます。

215 名前:214 mailto:sage [2007/05/16(水) 10:36:34 ]
ソース
nid.hIcon = (HICON)LoadImage(hInstance,MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, 0);
リソース
IDI_ICON1 ICON "1.ico"
こんな感じで読み込んでます。

それとあともう一つお願いします。
タスクトレイのアイコンを右クリックしたらTrackPopupMenuという便利な位置指定できる関数がありますが、
右クリックメニューからダイアログなどのウィンドウを開いた場合のウィンドウ位置の指定はどうやるのがスマートでしょうか?
タスクバーを移動してる場合にも、アイコン位置の角に表示させたいです。
それぞれの位置の場合の処理を書く必要があるんでしょうか?

216 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 10:51:57 ]
そのアイコンを試しにクライアントエリアに描いてみては
位置指定は、、、思ったとおりにやってみなよ

217 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 13:59:23 ]
struct base{};

template<typename T>struct drived:base{
template<typename TT>bool typecmp(){ return typeid(T)==typeid(TT); }
};

base *p1=new drived<int> , *p2=new drived<char>;

//で、base*からdrived::typecmpにアクセスしたい訳だが

218 名前:デフォルトの名無しさん [2007/05/16(水) 14:01:53 ]
vipの方が人がいそうなので。

pc11.2ch.net/test/read.cgi/tech/1178432985/217
217 名前:デフォルトの名無しさん[sage] 投稿日:2007/05/16(水) 13:59:23
 struct base{};
 
 template<typename T>struct drived:base{
 template<typename TT>bool typecmp(){ return typeid(T)==typeid(TT); }
 };
 
 base *p1=new drived<int> , *p2=new drived<char>;
 
 //で、base*からdrived::typecmpにアクセスしたい訳だが

これをやりたいんだけど、やっぱり原理的に無理だよね?

219 名前:218 mailto:sage [2007/05/16(水) 14:02:42 ]
すみません、218は誤爆です

220 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 16:30:30 ]
>>215
IDI_ICON1の値が問題な希ガス
ヘッダでの#defineも晒したほうがいいとおも



221 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 16:48:29 ]
>>217
お勧めはしないがdynamic_cast<derived<int>*>(p1)->typecmp<int>()

222 名前:デフォルトの名無しさん [2007/05/16(水) 21:35:09 ]
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3988.txt
誰か応えてください。

223 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 21:57:45 ]
>>222
よく読んでないけど、delete p;は実行されないと思うぞ
配列はmain関数側で作って渡した方がいいと思うぞ

224 名前:デフォルトの名無しさん [2007/05/16(水) 22:00:19 ]
あ、やっぱりそうですか。

・・・あ、なるほど、思いついた
ありがとさんでした

225 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 23:27:10 ]
>>221
仮想関数無いと dynamic_cast って効かないんじゃない?

>>217
new drived した直後なら static_cast でいいだろう。
やっぱりお勧めはできないんだけども。

226 名前:202 mailto:sage [2007/05/16(水) 23:39:03 ]
>>213
ありがとうございます。
こういうサイトは良いですね。
今は鯖落ちしてるようで、キャッシュを見ていますが・・・。

227 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 23:51:44 ]
なんで実行時に決まる子の型を、コンパイル時判定で
親が使いたい、なんて言う発想になるんだろう

228 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 23:54:10 ]
vectorについてどなたか教えて下さい。

例えば、メイン関数で空のvectorを定義して
別の関数でその中に数値を代入したい場合には
何を渡して、何を仮引数にとってやればいいのでしょうか?
あくまで別関数のreturnは0か1で返したく、別関数で代入するだけで
メイン関数vectorの値を操作したいのです。

sub(?????)
{
こちらで値を入れたい
}

int main()
{
vector<int>   Vint;
   sub(?????);
}

何も入っていないためかiteratorを渡しても駄目でした。
またmain{sub(&Vint)}で、sub(vecter<int> *Vint){}でも
値の代入は出来ませんでした。困っていますよろしくお願いします。

229 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 00:01:12 ]
>>228
一番最後のポインタを使った奴なら大丈夫なはず。
できなかったってのは、何をしたらどうなったんだ?

ポインタのかわりに参照を使うのが C++ 的に適切。

230 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 00:02:35 ]
>またmain{sub(&Vint)}で、sub(vecter<int> *Vint){}でも
>値の代入は出来ませんでした。

できるよ

…気になったんだが、main の中で値を入れることはできるの?
resize もせずに Vint[0] = 1; とかやってないよな?



231 名前:214 mailto:sage [2007/05/17(木) 00:38:52 ]
ありがとうございます。
>>216
クライアントエリアにも赤い×マークが描かれました。
>>220
#define IDI_ICON1 103
です。

232 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 00:54:09 ]
>>231
じゃあそういうデータなんだよ
複数の形式でアイコンが入ってるなら全部チェックしてみては

233 名前:214 mailto:sage [2007/05/17(木) 01:00:02 ]
自分で作ったアイコンなので赤い×マークなんて入ってないんですが・・・。
実行ファイルのアイコンとタイトルバー左上のアイコンも同じアイコンを使っていてそちらはちゃんと出ます。

234 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 01:54:58 ]
んじゃOEMアイコンを読んでるんだな。
hInstanceがNULLだったりしないか?

235 名前:214 mailto:sage [2007/05/17(木) 02:08:59 ]
ビンゴでした。
すいません、どうもありがとうございました。

236 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 04:06:34 ]
VC++で

ULONGLONG x = 0;
x += 10000000 * 60 * 60 * 3;

ULONGLONG y = 0;
y += (ULONGLONG)10000000 * 60 * 60 * 3;

if (x != y)
cout << "Different" << endl;

とするとxの方はオーバーフローになってxとyが違う数字になってしまうんだけど
64ビットコンパイラではこれは起こらないんだよね? この辺の仕様について
書いてあるページとか無いだろうか?

237 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 04:17:24 ]
>>236
intが64bitなら起きないけど、VC++の64bitターゲットはintが32bitな
ので、起きる。

ページは知らね。探してないけど、Cの規格書にあるはず。


238 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 04:35:12 ]
整数定数は(特に記述が無ければ)int。
int同士の演算はintで行われ、結果もint。
これはどんなコンパイラでも一緒。

つまり、>>237の通り。俺もページは知らないが。

239 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 05:33:31 ]
VIPPERが意外と侮れない
昨日VIPでレスついてた

130 名前:以下、名無しにかわりましてVIPがお送りします。[] 投稿日:2007/05/16(水) 14:52:36.04 ID:G4TJRFdQ0
struct base
{
private:
virtual bool typecmp( const type_info &typeinfo ){ return false; };
public:
template<typename TT> bool typecmp(){ return typecmp( typeid(TT) ); };
};

template<typename T> struct drived : public base
{
public:
virtual bool typecmp( const type_info &typeinfo ){ return typeid(T) == typeinfo; }
};

こんなんでどうだい?

240 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 07:35:47 ]
>>229-230
一番下ので可能とのことで、もう一度やってみます。
resizeというものに関しては知らなかったです。
どうもありがとうございました。



241 名前:デフォルトの名無しさん [2007/05/17(木) 11:28:44 ]
char *strという変数に文字列を格納するのを関数で行う場合
どういう渡し方すれば良いんでしょうか?


242 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 11:29:48 ]
hoge(char *dst, int dst_size)

243 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 11:49:19 ]
>>241
その変数に、文字列は格納できない。

244 名前:241 mailto:sage [2007/05/17(木) 11:56:44 ]
あれ?文字列を格納するのって
char str[50]="hoge";
char *str="hoge";
の二種類でやるのではないのですか?
C言語は今日から勉強し始めたので激しく狂ったこと言ってたらすいません。

245 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 11:58:10 ]
おとなしく、配列とポインタの関係あたりを勉強してからにしろ。

246 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 14:23:09 ]
if(a==b)とif(b==a)って同じですか?

247 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 14:24:50 ]
>>246
それがC++で特殊な演算子オーバロードされていると言うことがないなら、同じ。

248 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 14:29:06 ]
a, b の型が異なっても同じだったけ?
int と long とか double と int とか

249 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 14:40:08 ]
>>248
promotion rule に従うってだけで同じじゃね?

250 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 17:31:45 ]
mallocはnew、freeはdeleteに置き換え可能だと思いますが、
reallocはどうしたらいいでしょうか。(STLのコンテナ使え、は無しで



251 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 17:42:35 ]
>>250
STLのコンテナを使わない理由を調べ、その理由如何では敢えてnew/deleteに置き換えずにそのままrealloc()を使うべし。

252 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 17:43:48 ]
C++の機能に置き換えるというなら、インラインアセンブリでシコシコ

253 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 18:06:40 ]
つplacement new

254 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 18:56:04 ]
>>236
(ULONGLONG)10000000よりも10000000ullのほうがすっきり

255 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 19:13:51 ]
意味が違うだろ。

256 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 20:26:09 ]
scanfでdouble型変数に数値を入力し、その数値を1/2,1/4,1/5の値を出力するプログラムを作成
したいのですが、どのようにして作ればいいのでしょうか?

257 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 20:32:49 ]
inline指定した関数がインライン展開されなかったとき、なんで警告が出ないの?
個人的には「この関数は現在の設定(orコンパイラ)ではインライン展開されません」という警告が低いレベルで出て欲しい。

258 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 20:37:56 ]
それでデバッグビルド/サイズ優先ビルドで警告が出まくりか?

259 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 20:41:57 ]
>>256
どこで躓いてるのか分からん。
scanfでint型変数に数値を入力し、その値を2, 4, 5倍して
出力するプログラムは作れるかい?

260 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 21:31:09 ]
foo = !!bar;

という文を見たんですか、これは bar をboolにしてるだけで、

foo = (bool)bar;

と同じですか?



261 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 21:36:14 ]
C++で変態的な演算子定義をしていないなら。
(operator !だけ定義してあるとか)

262 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 21:42:02 ]
>>259
いやつくれません

263 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 21:58:16 ]
>>257
コンパイラ作成者に言え。

264 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 22:07:36 ]
>>262
本買って勉強しよう

265 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 22:31:35 ]
>>257
警告を出すようにできるものもあるぞ。例えばVisual C++。
/W4でも出てこず、/wで個別指定もしくは/Wallで出てくる。
msdn2.microsoft.com/ja-jp/library/yd3056cz(vs.80).aspx
msdn2.microsoft.com/ja-jp/library/a98sb923(vs.80).aspx

Borland C++Compilerでも警告が出た覚えがある。


266 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 22:33:39 ]
VC++は-W4異常以上は標準ヘッダですら警告出たりして煩かったから
使ったことないなぁ
今はどうだか知らないが

267 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 22:39:57 ]
なるほど。
独習C++で「展開されるか否かはコンパイラによる」って書いてあった気がしたから
低血圧な俺は心配しすぎで心拍数上がってぶっ倒れそうだったけど安心した。

268 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 22:52:02 ]
>>266
標準ライブラリは滅多に出てこないが、
Boostなんかの外部のライブラリのヘッダではよく出てくるから、
#pragma warningが手放せない。

269 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 23:25:06 ]
自作の型に対し、プリミティブな型と同じような四則演算を行う場合って、
+ - * / % += -= /= %= ++ -- の12個全部定義しないとダメ?

270 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 23:38:45 ]
boost::operatorsを使えば手間が省けるかと思う。



271 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 23:52:35 ]
>270
boostに頼るのが現実的っぽいですね。ありがとうございました。
しかし、これを使わないとすると一体何パターン定義すればいいのやら……比較やら何やら。



272 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 00:02:31 ]
何の型かは知らんが、例えば同じ * でも
MyType * MyType、MyType * int、int * MyType は別定義かもしれんしな
後 const ありなしとか

273 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 00:16:17 ]
非メンバな演算子でもboost::operatorで定義出来るんですかいね?

274 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 08:22:41 ]
>>273
クラス定義内で friend 関数を定義することで実現するみたい。

275 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 11:34:58 ]
VC++2003にSP1あてたら強制コンパイル(Ctrl+F7)できなくなった
のですが、どなたか対処法知りませんか?

276 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 11:57:41 ]
C/C++の話ではないような・・・
オプションのキーボードで、ビルドのコンパイルがどれに割り当てられているか見てみては

277 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 13:03:36 ]
>>275です。

>>276さんレスありがとうございました。
ここはスレ違いっぽいとは思いながら該当するスレがみつからず
書いてしまいました。すみません。

書き方が悪かったです。
キーの割り当てがどうという問題ではなく、
1度コンパイルしたソースファイルを
もう1度強制的にコンパイルすることがSP1になってから
できなくなってしまったのです。

適切なスレ探して聞いてみます。

278 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 13:42:29 ]
Ctrl-F7は普通のビルドだから強制でもなんでもないだろ
リビルドしたいのか?

279 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 14:05:34 ]
>>277
コマンドラインからdevenv /rebuildしたらどうなる?


280 名前:275 mailto:sage [2007/05/18(金) 14:26:11 ]
>>278さんレスありがとうございました。

こっちのスレで同様な質問かいてしまいました・・・。
Visual Studio IDE環境
pc11.2ch.net/test/read.cgi/tech/1115707321/

要はOBJファイルが存在する状態でも
リビルドではなく普通にもう1度コンパイルかけたいだけなんです。
理由は、ソリューションが巨大なため単にリビルドでなくて一部のみコンパイル
かけたいときがあるので・・・。

>>279さん
OBJ消したり、リビルドすれば大丈夫なのは分かっているのですが、
業務上他のVer.(2005など)のVisualStudioも使うので同様の操作
で何故できないのかと。
ちなみにSP1あてる前は普通にできてたことですし、
VS6.0SP6,2005,2005SP1でも同様に問題なくできていました。



281 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 14:33:06 ]
コンパイルできなくなったってだけじゃ何もわからんよ。
具体的にどうなってんのか(ビルドログとか)晒せ。

282 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 14:37:38 ]
普通build っつーのは src target の依存関係を追って時刻更新がかかったもだけを
更新する作業だと思うのだが…
make -u はリビルドと同じだし、なんのことかわかんね<強制ビルド

まさか単に時刻が崩れているおち?

283 名前:275 mailto:sage [2007/05/18(金) 14:51:25 ]
ログ晒します。
1回目のコンパイル。当然通常通りです。
------ ビルド開始 : プロジェクト : AAAAA, 構成 : Debug Win32 ------

コンパイルしています...
BBBBB.cpp
WINVER not defined. Defaulting to 0x0501 (Windows XP and Windows .NET Server)
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afx.h(281) : warning C4005: 'ASSERT' : マクロが再定義されました。
コマンド ラインの引数 : 'ASSERT' の前の定義を確認してください。

ビルドログは "file://d:\AAAAA\Debug\BuildLog.htm" に保存されました。
AAAAA - エラー 0、警告 1


---------------------- 終了 ----------------------

ビルド : 1 正常終了、0 失敗、0 スキップ

2回目のコンパイル。スキップされてしまいます。
------ ビルド開始 : プロジェクト : AAAAA, 構成 : Debug Win32 ------




---------------------- 終了 ----------------------

ビルド : 1 正常終了、0 失敗、0 スキップ

ソリューション壊れてるのかな・・・?
ちなみに2005で同等のソリューションでは1回目も2回目も同じログはきます。

284 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 14:58:05 ]
むしろ2回目も同じログ吐くほうがおかしくないか・・・
PCの時刻とファイルのタイムスタンプのチェック、
あと新規でソリューション作って試してみて

285 名前:275 mailto:sage [2007/05/18(金) 15:06:39 ]
>>284さん
>むしろ2回目も同じログ吐くほうがおかしくないか・・・
ですが、今までSP1あてる前とか、VC6.0のときもこんな動作
してなかったのですが。
PCの時刻やタイムスタンプが壊れていることはないです。
ソリューション大きすぎるとおかしいんですかね?
VC6やVC2005で新規ソリューションで同様の操作してみます。

286 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 15:07:45 ]
ログじゃなくてゲロ吐きそう・・・・

287 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 15:09:19 ]
OBJ とかの中間生成物が違うフォルダを指してるとか read-only とかそういうことないか?

288 名前:275 mailto:sage [2007/05/18(金) 15:26:53 ]
VC6.0MFCアプリで新規プロジェクト作ったら、
2回目スキップされました。あれ?2003SP1と同じでした。
・・・
VC2005のMFCアプリの新規ソリューションも
2回目スキップされました・・・。

ごめんなさい。これがデフォルト動作なんですね・・・。

でもそうすると今あるこの巨大ソリューションの2005版で
こうならないのは何故??
いや、そもそも2003SP1当てる前はスキップされなかった
ですし。
プロジェクトファイルを起こすところからやりなおした方が
よさそうですね。

皆様お騒がせしました。ありがとうございました。


289 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 15:47:30 ]
>>288
巨大ソリューションの日付が未来。

290 名前:288 mailto:sage [2007/05/18(金) 15:48:15 ]
SP1前後で違うんだったな。無視してくれ。



291 名前:290 mailto:sage [2007/05/18(金) 15:50:33 ]
289 だった…orz

292 名前:デフォルトの名無しさん [2007/05/18(金) 18:43:13 ]
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3998.zip
画像の情報を圧縮するプログラムをつくろうと思い
今、その前段階で
圧縮せずにそのままの情報量で画像を出力するプログラムをつくっているのですが
元の画像がほぼ復元されるはずなのに全くかけ離れた結果が出てしまいます

どこを修正すればよいのでしょうか?

環境は OS:Linux GCC:4.1.2 言語:C++ です

293 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 20:22:19 ]
>>292
デバッグ依頼なら他スレ逝ってくれ

294 名前:デフォルトの名無しさん [2007/05/18(金) 21:33:10 ]
戻り値として配列を戻したいんだが、そういう時ってのはどうやればいいんでしょうかね?
戻り値の型はどうすればいいのか、return の後に書くのは関数内の配列名でいいのか、関数を呼び出した場所の=の左オペランドはどういう型にすればいいのか
教えてください。

295 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 21:39:07 ]
引数に配列のポインタ受け取ってそれを操作すればいいような気もする

296 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 21:41:17 ]
C++でnew演算子には三種類あるらしいですが
普通のnew、placement new、あともう一つは何ですか?

297 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 21:41:49 ]
>>294
具体的なテストケース書いてみ

298 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 21:42:54 ]
というよりCではそれが一番使われている。
ほかには、構造体を返したりC++ならstd::vectorを使ったりする方法がある。
関数内でメモリ確保して、呼出元で解放してもらうという手もある。

299 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 21:43:44 ]
>>296
new[]のような気がするが、そうするとplacement new[]も考えられるんだよな

300 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 21:45:19 ]
new(nothrow) のことか?



301 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 21:48:47 ]
>>300
第三のnewはそれでしたか…名前からするにbad_alloc例外を投げないnewってところかな?
ともあれ回答ありがとうございました

302 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 21:49:41 ]
>>294
配列を含む構造体を使う。
C++ なら std::vector も使える。

303 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 21:50:49 ]
new(nothrow) は placement new の一種だろう。
三種類あると言ってる人の認識がどうなってるか知らないけど。

304 名前:294 [2007/05/18(金) 22:06:48 ]
//ん〜、こんなんでしょうか?(実際作りたいプログラムはこんなじゃないですけど
#include<iostream>
using namespace std;

int factor(int a[]){
for(int i =0; i<5 ; i++){
a[i]=i+1;
}
return a;
}

int main(){
int a[5];
a = factor(a);
for(int i =0; i<5 ; i++){
cout <<a[i];
}

return 0;
}

て、コンパイルが出来ませんでした。コンパイラはVC。メッセージは次の通りです。
test.cpp(9) : error C2440: 'return' : 'int []' から 'int' に変換できません。
この変換が可能なコンテキストはありません。
test.cpp(14) : error C2440: '=' : 'int' から 'int [5]' に変換できません。
配列型への変換はありませんが、参照またはポインタから配列への変換があります。

やっぱり引数と戻り値の型らへんの知識があいまいなので、どうやって渡してどうやって戻せばいいのか分かりません。
このコード直してくれたりすると、ありがたいんですけど・・・wさすがに無理な頼みでしょうか

305 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 22:23:24 ]
STL使った方が遥かに楽だと思う
#include <vector>
#include <iostream>

int factor(std::vector<int>& in) {
enum { NUM=5 };
typedef std::vector<int>::size_type vec_sz;
in.reserve(NUM);
for (vec_sz i = 0; i < NUM; ++i)
in.push_back(static_cast<int>(i));
return 0;
}

int out(const std::vector<int>& in) {
for (std::vector<int>::const_iterator i = in.begin(); i != in.end(); ++i)
std::cout << *i << " ";
return 0;
}

int main() {
std::vector<int> v;
factor(v);
out(v);
return 0;
}

306 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 22:28:29 ]
>>304
JavaかC#でもやっていたのかもしれないけど、
まずCには「配列を渡す」という概念自体がない。
ポインタの型で配列のサイズを指定するというやり方が
ないわけでもないけど、やはり普通は配列の先頭の要素の
アドレス(ポインタ)を渡して処理をすることになる。
その辺が面倒だと言うのならSTLか配列かクラス使う。

307 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 22:32:47 ]
こんにちは。Cでプログラムをしているのですが、
_beginthread()で作成したスレッドをCloseHandleで終了させる時に、
デバッグなしで実行すると何もエラーは起こらないのですが、
デバッグありで実行すると、例外が発生してしまいます。
おそらくCloseHandleで出ているエラーなのですが、正常な終了方法ではないのでしょうか?

なんか、_freeptd(ptd);の所に矢印があります・・・。

スレッドの作成の部分と終了の部分は下のようになってます。
hThread = (HANDLE)_beginthread(connect, 0, NULL);
CloseHandle(hThread_connect);

308 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 22:36:27 ]
>>307
_beginthread のマニュアルに
_beginthread に対応する関数書いてない?

malloc と fclose は対応してない様に
違う関数呼ぶと問題が多いよ

309 名前:デフォルトの名無しさん [2007/05/18(金) 22:37:48 ]
_beginthreadで開始したスレッドはCloseHandleしちゃ駄目。

310 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 22:38:24 ]
>>303
new(nothrow) は確保に失敗したら NULL を返す new 。
placement new は既に確保してあるメモリを利用する new 。
全然違う。



311 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 23:11:19 ]
>>308
_endthreadというのがあって、そのスレッドの最後に
_endthread();すればスレッドが終わるようなのですが、
スレッドの外から強制的にスレッドを終わらしたいのです。
しかも_endthreadは引数を持たないので複数スレッドを走らせている場合は
どのようにスレッドの外から強制的に終わらせればいいのか・・・

>>309
そうなんですか・・・。それはエラーが出るわけですね;;
ん〜・・・

312 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 23:20:19 ]
>>310
new に与える追加の引数のことを総じて new-placement と言う。 (5.3.4)
元々は new (place) T として配置に使う構文として追加されたから
こんな名前になってるんだろうけどね。

313 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 23:24:43 ]
単純な方法としては
生成時にスレッドを生成して、消滅時にスレッドを終了させる
っていうスレッドそのものを表すクラスは作ってそいつに自殺するように命令するとか
となるとそいつらを生成、管理するクラスが必要になるわけで…

314 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 23:26:00 ]
ExitThreadでスレッドを終了させた場合、その終了させたスレッドが
プロセスの最後のスレッドであれば、そのプロセスも終了するっぽいので、
これはこれで非常に使いにくいです。一体どうすれば・・・

315 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 23:28:24 ]
>>311
短い答え:
 スレッドを強制的に終了させる必要などないような設計に汁
少し長い答え:
 _beginthreadex(), TerminateThread()を使え

316 名前:315 mailto:sage [2007/05/18(金) 23:29:08 ]
おっと後者のほうが短かったぜ

317 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 23:44:55 ]
>>315
ありがとうございます。Exではありませんが、
_beginthread()とTerminateThread()でエラーが出ないようになりました。
色々調べたところ、あるサンプルプログラムにおいて
TerminateThread()の後にCloseHandle()で更にハンドル開放を行ってますが
これは必要なのでしょうか?

318 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 00:05:57 ]
>>317
イベントを受け取ったら自分で_endthreadして死ぬようにした方がいいと思う。
スレッドを無理やり止めるってことはどこで止まるか分からないんだぞ。気色悪い。

319 名前:315 mailto:sage [2007/05/19(土) 00:12:44 ]
>>317
長い答え:
ヘルプに書いてある筈だが、_beginthread()で開始したスレッドは
自分が終了する時に自分でCloseHandle()を呼び出してスレッドハンドルを
破棄する。言い換えると、_beginthread()で開始したスレッドのハンドルが
いつ無効になるか外からは全く分からないので、スレッドのハンドルを
外から何らかの形で使いたいのなら、必ず_beginthreadex()を使え。

_beginthreadex()で開始したスレッドは自分でCloseHandle()を
呼び出さないので、リークを避けたければ誰かが責任を持って代わりに
呼び出してやる必要がある。つまりWaitForMultipleObjects()などを使って
終了を待ち、その後CloseHandle()を呼ぶ必要があるってことだ。
TerminateThread()した場合も同様だな。

320 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 00:22:37 ]
>>318
とりあえずスレッドではrecv()をSOCKET_ERRORが出るまで永遠にループさせています。
サーバーが終了した時などは、自動でループを抜けて終了するのですが、
それ以外にこちらから接続を終了する切断ボタンを用意しています。
そのボタンを押したときに強制的にスレッドを終了させているのですが、
ボタンを押されたイベントをスレッド内で取得してすぐにスレッドを終了させる
事なんて出来るのでしょうか・・・?

>>319
丁寧にありがとうございます。とても分かりやすいですw



321 名前:デフォルトの名無しさん [2007/05/19(土) 00:41:34 ]
Linux,gccです。

./aaa 3 2 | ./bbb
というように、最初に実行したaaaの結果をパイプでつないで、後ろのbbbというプログラムで操作したいのですが、
うまくbbbに渡すことができません。
aaaは、
1 -2
-1
2

のように出力するので、bbbで
int main(int argc,char **argv) として読み取ろうとしているのですが、
argcの値を出力してみると1とでるので、./bbbそのものしか読み取れていません。
自分としてはここで ./bbb 1 -2 -1 2 でargcの値が5になるようしたいのですが、
このようなパイプの使い方は間違いでしょうか?


322 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 00:45:11 ]
>>321
大間違い。パイプの使い方の勉強してらっしゃい。
要は、標準出力と標準入力を繋ぐだけだから。

>>320
おいおい、recv()しているスレッドをいきなり殺しちゃ拙いだろ。

323 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 00:51:05 ]
>>322
ではサーバーとの接続をぷちって切りたい時は
どうすればいいのでしょうか?

324 名前:315 mailto:sage [2007/05/19(土) 01:01:18 ]
>>320
長い答え:
ブロッキングモードでひたすらrecv()ループをしているんだな。
確かに簡単だが、それでは綺麗にスレッドを終了させられない。

1)ブロッキングモードでrecv()を使う代わりに、
 例えばasynchronousモードでWSARecv()+WSAGetOverlappedResult()を使う
2)スレッド間通信用にEventを作る。そのスレッドを止めたい場合は
 外からSetEvent()でやんわりと「お願い」する。
3)受信スレッドでは、WSARecv()でトリガした受信の完了と上記のイベントの2つを、
 WSAWaitForMultipleEvents()などを用いて、同時に待つようにする。
4)SetEvent()によって待機から抜けた場合は、スレッドが自分で終了する。

こんな感じにすればできるぞ。まあ、基本的なテクニックだが。

325 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 01:40:49 ]
>>324
初めて聞く関数がいっぱい出てきたので
ちょっくら勉強してきます!

326 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 02:26:01 ]
まあ要するに、recv()という「外(他スレッド)からブレーク出来ないもの」を使う代わりに
他のもので待機してrecv()ではブロックしないようにする、ということだな。

ネットワークでは誰もが必要とすることなので、対処法もほぼ確立してる。
一般的には「select系」と呼ばれるけど、Windowsにもそれに向けた方法が用意されている。

327 名前:デフォルトの名無しさん [2007/05/19(土) 02:54:08 ]
OS依存しない現時点でC++の仕様を網羅した入門的教科
書ってなにかよいのないでしょうか。
クラスとかSTLのさわりのところまで知っているのですが
数年やっていなかったので今どういう機能が投入されている
のかわかりません。図書館でパラパラみていたら
「詳説C++第2版」というのが値段も含めて
よいかなと思ったのですが。


328 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 02:58:23 ]
CALLBACK関数内で変数の宣言をすると処理が重くなりますか?

329 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 03:04:22 ]
>>328
↓のどっちと比べて重くなるって言ってるの?
1.CALLBACKじゃない関数で変数の宣言をする
2.CALLBACK関数内で変数の宣言をしない

330 名前:328 mailto:sage [2007/05/19(土) 03:05:34 ]
すみません。
1.CALLBACKじゃない関数で変数の宣言をする
です。



331 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 03:10:37 ]
>>327
興味を持ってるところに水を差して悪いが…

>クラスとかSTLのさわりのところまで
このレベルで「最新の仕様」を知る事に意味があるのか?
それならまだ知らないC++の基本を押さえるのが先じゃないか?

332 名前:デフォルトの名無しさん [2007/05/19(土) 03:19:00 ]
C系のを中断してLispとかHaskellあと言語そのものを作ったりとか
とかしばらくやっていたので
今度は今のC++らしいところが全体的に知りたいっていう
かんじなんです。
そのあたりの気分を理解していただけますでしょうか。


333 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 03:34:23 ]
それなら安心して Effective C++

334 名前:デフォルトの名無しさん [2007/05/19(土) 03:50:56 ]
質問ですが、ワードパッドの[ファイル]メニューの[送信]コマンドのように
既存の標準電子メールソフトから送信用ウィンドウを呼び出す機能を実現するには
どうすれば良いのでしょうか?

335 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 03:53:49 ]
gcc -pg でコンパイルしたらそれまで出てなかった
Detaching after fork from child process XXX
と言うメッセージ出るようになったんですけど、これは何ですか?なにか問題あるでしょうか?

336 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 05:25:39 ]
>>334
「ファイル名を指定して実行」で
mailto::
やってみれ

337 名前:334 mailto:sage [2007/05/19(土) 06:52:25 ]
>>336
忝い

338 名前:304 [2007/05/19(土) 07:10:12 ]
>>305
答えてくれてありがとうございました。
が、関数とか全くと言っていいほど知らないので、書いてくださったコードは理解できませんでした・・・。
どうにか自分のコードをちょちょいと直してコンパイルエラー無くなるようにならないでしょうか?
もし良ければお答え下さい。

>>306
>JavaかC#でもやっていたのかもしれないけど
すみません、全くのプログラミング初めて2ヶ月の初心者です
配列の先頭要素のアドレスを渡すには配列名を書けばいい、と本に載っていましたが、それでいいんですよね?

関数内でいじった配列を、元のところに戻してやるとき、returnの後と、関数の戻り値の型はどう書けばいいのか教えてください;;

339 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 07:29:12 ]
>>338
上手くいかないというのは、知識が足りていない事の証明。
解らないと思うなら、他人に聞く前に死ぬ気で調べなさい。
その方が自分のためだよ。

配列とポインタの関係について、ぐぐりつつ、テストコードを書きつつで、
ちゃんと基本を押さえれば、難しいことはないよ。

340 名前:304 [2007/05/19(土) 07:44:56 ]
そうですね。甘えてました。
出直してきます。
ありがとうございました!



341 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 07:47:02 ]
>>338
配列を関数で変更したいだけなら、例えばこれだけでいい。
void incrementArray(int * foo, unsigned nFoo)
{
for (int ic = 0; ic < nFoo; ++ic) {
++foo[ic];
}
}
別の配列にコピーする場合も、関数で配列を新規に確保するのは判り難いからやめた方がいい。
void copyArray(int * bar, int const * foo, unsigned nFoo)
{
for (int ic = 0; ic < nFoo; ++ic) {
bar[ic] = foo[ic];
}
}

342 名前:デフォルトの名無しさん [2007/05/19(土) 07:50:14 ]
コピーのほうの仮引数名は
fooだのbarだの書かずにsrc,destにしようぜ。

343 名前:デフォルトの名無しさん [2007/05/19(土) 07:51:54 ]
Linuxでの初心者の質問です。
C++のstd::sort(v.begin(), v.end())のsort()の実装を見てみたいのですが、
どこをみればよいのでしょうか。
関数ポインタ2つだけを引数にしなくても、v自体を引数にする仕様の方が
自然な感じがするのですが。。。
どなたかよろしくお願いします。


344 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 07:55:20 ]
>>343
それでは「配列」か「コンテナ」か、どれか一つの全体しかソートできない。
例えば、vectorの二番目からソートしたいかも知れない。

345 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 07:58:43 ]
>>343
ディストリビューションによるけど、たとえば
/usr/include/c++/*/bits/stl_algo.h

渡しているのは関数ポインタじゃなくて、イテレータオブジェクトだよ。
範囲を指定できるようにしておけば、コンテナの全体をソートするのも
一部をソートするのも同じ使い方にできるから、いい設計。


346 名前:332 mailto:sage [2007/05/19(土) 08:48:50 ]
>それなら安心して Effective C++

どうもありがとうございました。読んでみます。


347 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 09:15:15 ]
>>327
入門的教科書の条件は満たさないが、規格書でも買っとけば?

348 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 09:18:23 ]
>>330
変数の型が糞重たいコンストラクタ/デストラクタを持ってるクラスだったら重くなるだろうね。
まぁ環境による

349 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 09:20:24 ]
mixiで暴れてる猫皇って何者?激しく不快なんだけど

C言語コミュ
mixi.jp/view_community.pl?id=1190894
初心者の為のC言語
mixi.jp/view_community.pl?id=485919


350 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 09:36:21 ]
>>327
今書いてるから待ってて。



351 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 10:14:01 ]
執筆中かよw
いつ出版されるんだ?w

352 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 10:34:30 ]
>>350に期待

353 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 10:37:36 ]
>>327
その本俺持ってるけど、初心者には詳しく書きすぎてあって読んでいる
うちに眠くなるよ。

独習C++などの問題集を一通りやってみてはいかがかな。あれなら
一冊やり終えた所である程度の力が付く。

354 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 15:19:22 ]
>349
諦めとけ。
Kusakabe氏と猫王(猫皇)氏の参加コミュニティには近付かないが吉。

自分も「なるほど、考え方の違いですね」などと発言したら
「バカにするのもいい加減にしてください」とか返されてビックリですよ。詳細曖昧でごめん。

355 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 15:27:12 ]
ミクシィ(笑)

356 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 15:30:09 ]
2ch(笑)

357 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 15:32:14 ]
独習C++、exceptional C++以外にC++の問題集ってありますか?

358 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 15:57:35 ]
C with Classes 問題集

359 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 16:04:49 ]
そのK氏、マイミクのマイミクなんだよなあ……
なんであんなキチガイと付き合いあるんだろうあの人。

360 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 16:43:19 ]
A man is judged by the company he keeps.
類は友を呼ぶ。
キチガイの知り合いはキチガイ。



361 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 17:05:02 ]
つまり359は無自覚のキチガイ

362 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 17:24:16 ]
話題に対して関係ない人についての言及は思わぬ蛇を出させる

363 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 17:25:43 ]
キューを配列で作りたいのですが
enqueue時にデータが一杯の時の処理が上手く出来ません
↓は自分で考えてみたものです
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4006.txt
どこが悪いのか教えていただけないでしょうか
(headは先頭要素の一つ手前の要素数、tailは最後尾の要素の要素数)

364 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 22:20:21 ]
>>363
デバッグくらい自分でしろよ。
デバッグの過程で学ぶ事は、プログラムを書く事以上にあるんだぞ。

365 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 23:20:06 ]
わからないので書き込んだのですが…

366 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 23:21:09 ]
わかってて書き込んでたらそれはさすがにまずいだろ

367 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 23:56:39 ]
>>363
とりあえず、データが一杯の時に
「どういう動きにしたいのか」
「実際はどういう動きをするのか」
を、まとめてみるのはどうだろうか

368 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 04:20:25 ]
友愛数を探すプログラム

「博士が愛した数式」で出てきた友愛数
友愛数の定義
ja.wikipedia.org/wiki/%E5%8F%8B%E6%84%9B%E6%95%B0
Aの約数の和=B、Bの約数の和=Aのとき、A、Bは友愛数である
(ただし約数には自分自身を含めない)
例:220と284
220の約数の和=1+2+4+5+10+11+20+22+44+55+110=284
284の約数の和=1+2+4+71+142=220

とりあえず1,000,000まで探してみた。39組あった。
オイラーは60余り見つけたらしい。

が、いかんせん遅すぎる。(Athlon64 3500+で33分)
誰か高速化してくださいな。
ソース:kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4009.txt

高速化のポイント
・約数をもっとスマートに見つける方法はないか?(これがかなり遅い)
・10の約数の和が100になるわけないので本探索のjのループに無駄が多い
  かといって、どこまではしょっていいかわからない j = i / 2 〜 とか?
・あ、jをループにするから遅いんだ。yakuwaをソートして二分木探索すればいいんだ

369 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 06:55:55 ]
100まで求めるやつらしい
ttp://www.saoyagi.net/integer/konyaku.html

370 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 08:28:32 ]
Aという起動中のプログラム(既存)のウィンドウを、Bというプログラム(自作)から開きたいです。
できるだけ簡単に開く場合はどんな方法がありますか?(SendMessage?)
Aのウィンドウはメニューから開くタイプでアクセラレータキーは付いていません。



371 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 08:39:58 ]
std::vectorについて質問です。

#include <vector>

template <class T>
class test{
public:
test(T a){ data.resize(1); data[0] = a; }
const T& getData() const{ return data[0]; }
private:
std::vector <T> data;
};

int main()
{
test <bool> a(true);
a.getData();

test <int> b(0);
b.getData();

return 0;
}

boolで初期化された方にはVC8、GCC3.4共に、テンポラリのリファレンスを返すと怒られてしまいます。
boolとintでどのような違いがあるのでしょうか?
識者の方、ご教授お願いします。


372 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 09:06:18 ]
>>371
Effective C++第18項

vector<bool>の返す型はbool*ではなくvector<bool>::reference型だから
参照は返せない。だから値で返すしかない。

const T& → const T

内部でプロキシオブジェクトを使っているのでアドレスが取れないため。

373 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 09:06:47 ]
×Effective C++
○Effective STL

374 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 10:47:19 ]
なるほど、vector< bool >にそんな事情があったとは。
const T& → const T にすると、vectorの中身によっては、
コピーが馬鹿にならない場合もあるので、この制約は嫌らしいですね。


375 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 11:02:00 ]
>>374
一応補足しておくと、
const T となるのは vector<bool> ’のみ’ね

376 名前:デフォルトの名無しさん [2007/05/20(日) 11:15:08 ]
コピーが気になるなら、boost::call_traitsみたいな感じで
適切な戻り値の型を選ぶようにすればいいんじゃないかな。

377 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 12:06:05 ]
>>370
C/C++、関係ナクネ?

プログラムAがどういう実装で新しいWindowを生成してるか
分からないとBからじゃ無理だと思うけど。

378 名前:370 mailto:sage [2007/05/20(日) 12:31:22 ]
分かりにくくてすみません。

プログラムAはWindowsアプリケーションで、
TrackPopupMenu(ショートカットメニュー)からCreateWindowExでウィンドウを開いているようです。
プログラムBはC++(またはC)で作ります。

379 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 12:36:19 ]
もうちょい詳しく。
てか、APIスレ行こうぜ

380 名前:デフォルトの名無しさん [2007/05/20(日) 12:49:15 ]
WM_COMMANDとメニューIDを
SendMessageで送りつければいいんじゃないの?



381 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 15:14:38 ]
VC++のリストボックスについて、行き詰ってしまいまして、質問させて下さい。

環境はeMbedded Visual C++ 4.0 / windows CE です。
リストボックスにあるスクロールバーを使用せずに、別スクロールを付加させて、
リストボックスの動きを制御させています。
垂直スクロールに関しては、リスト数を取得して、スクロールバーで制御が出来るのですが、
水平スクロールがうまくいきません。。
リストボックス内では、文字列が途中までしか表示されておらず、
水平方向専用のスクロールバーを付加したのですが、
リスト内における表示位置(文字列の表示位置について)が取得&設定出来れば、
擬似スクロールが可能かな、と思ったのですが、取得することが出来ませんでした。
例えば、リストに水平スクロールをつけてしまい、そのスクロール部分を隠してしまい、
別スクロールから操作しているように見せかける、ということも考えたのですが、
その場合のリストについている水平スクロールの表示位置も取得できず。。。

もしかしたら、リストのスクロール位置が取得出来る方法があるのかもしれませんが、
申し訳ないのですが、調べたのですが、いまいち、探すことが出来ませんでした。
何かいい関数や処理がないかなぁ、、と行き詰っている状態です。
どなたか、いい方法をご存知の方がいらっしゃいましたら、教えていただけますでしょうか。
よろしくお願い致します。

追伸:もし、VC自体にそのような関数や処理方法がないのであれば、
別リスト(コピーリスト)を用意して、表示の仕方で擬似スクロールするように
見せかけるしかないのかなぁ。。。と悩み中です。。

382 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 15:56:47 ]
switch文のcase句の条件を(ほぼ)同時に満たしたら下記の場合どうなるんでしょうか?

int nCount;
switch (a)
{
case1:
 nCount=0
 break;
case2:
 nCount=1
 break;
}


383 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 16:01:29 ]
>>382
switchを通った時点の数値で評価される

384 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 16:01:57 ]
一回で評価される式は1つ
つまりほぼ同時に満たすと言うのは
a == 0x01 && a == 0x02の時
これを満たすようなaは果たして存在するか?

385 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 16:17:17 ]
switchとifは実行速度の面では一緒ですか?

386 名前:382 mailto:sage [2007/05/20(日) 16:18:06 ]
>>384
case1とcase2をそれぞれ満たす違う値のaがほぼ同時に入ってくるということです。


>>383
でしたら下の場合nCountは3になるんでしょうか?
int nCount=3;
switch (a)
{
case1:
 nCount=0
 break;
case2:
 nCount=1
 break;
}

387 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 16:23:01 ]
switch通過後にnCountの値が3になるのはaが1でも2でもない場合

388 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 16:23:04 ]
>>386
>case1とcase2をそれぞれ満たす違う値のaがほぼ同時に入ってくるということです。

      ___    ━┓
    / ―\   ┏┛
  /ノ  (●)\  ・
. | (●)   ⌒)\
. |   (__ノ ̄  |
  \        /
    \     _ノ
    /´     `\
     |       |
     |       |

           ___   ━┓
         / ―  \  ┏┛
        /  (●)  \ヽ ・
       /   (⌒  (●) /
       /      ̄ヽ__) /
.    /´     ___/
    |        \
    |        |


389 名前:デフォルトの名無しさん [2007/05/20(日) 16:23:06 ]
>>368
素数を定数配列で持っとけ。1,000,000までの解を求めるんなら
1,000( == √1,000,000 )以下の素数データがあれば十分。
素数を定数配列使うのが邪道だと思う場合でもせめて素数だと
わかった値はどっかにプールしといて再利用しれ。

390 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 16:25:09 ]
スコープの問題か
ブロックローカルのa、関数ローカルのa、クラスメンバのa、グローバルのa
と色々あっても優先順位がちゃんと決まってるから入る評価されるaは唯一つだよ



391 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 16:27:09 ]
volatile変数なんだろ。

392 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 16:28:09 ]
おーい誰かエスパー呼んで来い

393 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 16:30:33 ]
まさかとは思って念のため >>382 のコードをコンパイルしてみたが
エラーもワーニングもでなくてワラタ。

>>382
case 1: と case1: じゃ全然意味が違うから気をつけてね♪

394 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 16:38:05 ]
>>393
case 1のコロンがなくてもGCCでコンパイルできるよ

395 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 16:41:23 ]
それはない。

396 名前:382 mailto:sage [2007/05/20(日) 16:43:20 ]
混乱させてしまって申し訳ないです。
グローバルフックのコールバック関数で以下のようにしてて、
AとBのウィンドウがあって、Bのウィンドウがアクティブな時にAのウィンドウをアクティブにすれば
BのWA_INACTIVEとAのWA_CLICKACTIVEがほぼ同時に飛んでくるんではないでしょうか?
この場合nCountの値はどうなるんでしょう?

int nCount=0;
case WM_ACTIVATE:
 switch (lp->wParam)
 {
 case WA_ACTIVE:
 case WA_CLICKACTIVE:
  nCount--;
  break;
 case WA_INACTIVE:
  nCount++;
  break;
 }

>>382は文法めちゃくちゃでした。

397 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 16:47:19 ]
queueがあるから同時じゃないよ

398 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 16:48:05 ]
>>396
switch文の外にあるcase WM_ACTIVATE: は本当にエラーにならないか?

399 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 16:50:23 ]
まずWA_INACTIVEが呼ばれて次にWA_CLICKACTIVEが呼ばれる。
つまり
nCount=0;
nCount++;
が実行されてから
nCount=0;
nCount--;
が実行される

400 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 16:55:31 ]
breakしてるからfall-throughはしないんだろ?



401 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 16:56:30 ]
>>400
お前さんも質問者の言ってることが解ってないようだが、
質問者はそんなレベルじゃない勘違いをしている。

402 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 17:00:15 ]
まああれだ、変数(または関数)と値というものの区別がついてないんだな、たぶん

403 名前:382 mailto:sage [2007/05/20(日) 17:05:01 ]
まだいくつか省略してますがどこがおかしいのでしょうか?

>>399
ありがとうございます。見直して成功したら報告させて頂きます。

404 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 17:40:32 ]
>>385
コンパイラによってはテーブルジャンプにしてくれる場合もあるとか
まぁ環境によるので実測しなさい

405 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 17:46:27 ]
>>404
それを言うならジャンプテーブルだろ、馬鹿w

それからコンパイラによってはっていうよりそもそも
ジャンプテーブルに変換する為のモンだぞ、switch は。
確かに状況により必ずしもジャンプテーブルになるわけじゃないが。

406 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 17:58:14 ]
万単位の分岐をelse ifのはしごで書くと
結構はっきり違いが分かるらしい

407 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 18:02:51 ]
そこまで作るのがここに何人(ry ごめんなさい妬みですorz

408 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 18:24:51 ]
int型の整数の中に、任意の整数が含まれているか調べる方法ってありますか?
たとえば

int a = 1234;

があって、この中に3という数値が含まれてるかどうか、みたいな感じです。
文字列として扱ってしまえばできそうなのですが、intからcharにキャストすると
どうもおかしくなってしまって・・・

よろしくお願いします

409 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 18:26:00 ]
sscanf

410 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 18:26:03 ]
10で割って一桁ずつ見ていけばいいでしょ



411 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 18:26:56 ]
sprintfしてstrchrで探すとか。

412 名前:410 mailto:sage [2007/05/20(日) 18:27:24 ]
1の位を見るにはa%10

413 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 18:54:29 ]
>intからcharにキャスト

toString()ではいかんのか?
(Cなら >411 だが)

414 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 18:55:38 ]
itoa系列の関数を使うといい

415 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 19:02:24 ]
itoa()は標準関数じゃないよ。

416 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 19:08:56 ]
ごめんちゃい><

417 名前:408 mailto:sage [2007/05/20(日) 19:15:16 ]
いろいろとどうもです
sprintfの存在を初めて知りました
それで挑戦してダメだったら1桁ずつ見ていきたいと思います

418 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 19:27:37 ]
速度求めるなら一桁ずつ見る方法の方がいいよなO(N)未満だし

419 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 00:47:05 ]
>>381 です。

なんとか、少しづつ進んでみたのですが・・・。
現状のリストについている水平スクロールの値は取得&設定できました。
でも、設定をすると、リストの水平スクロールは稼動するのですが、
リストは一緒に動いてくれません。
どうしたら、リストも一緒に動いてくれますか?

GetDlgItem(IDC_リストコントロール)->GetScrollRange(SB_HORZ ,&iMin,&iMax);
iTest = GetDlgItem(IDC_リストコントロール)->GetScrollPos(SB_HORZ);
GetDlgItem(IDC_リストコントロール)->SetScrollPos(SB_HORZ,iTest+5,true);

420 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 01:22:53 ]
>>368
>>389
直観的方法だけど、
・必要な素数列を最初に求める。
・1は定義より含まれないことが自明なので2から始める(2も自明のような気がするけど)。
・任意の数の友愛数は二つ以上ないと仮定して(証明されてるのか知らん)、既に友愛数になった数はスルー。
・求めた素数列を使って素因数分解してから組み合わせを網羅して約数列を作る。
・約数列の合計を求めて元の数より小さければその数は既に調べているのでスルー(等しいということはないだろうけど一応含めてスルー)。
・そうでない場合はその数の約数列を作り合計を求めて元の数と比較し、一致していれば友愛数。
ttp://www.geocities.jp/krtcw777/amicable_numbers.txt
この方法だと>>368の環境で1000000まで30分どころか30秒もかからない(と思う。当方Pen4 2.53GHzで28秒)。



421 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 02:10:01 ]
はじめて質問します。よろしくお願いします。
switch文で、int型の特定の値を入力するまで処理を繰り返すものを作っているのですが、
(1、2、のメニュー番号を入力するまで繰り返す、など)
int型(1)ではなく、1.0やaなど指定されたもの以外入力すると
無限ループになってしまい、処理を抜けることができません。
画面に表示された番号以外打ち込むなと言いたいところなのですが…。
これを避けるためにはどのようにcaseを設定したらよいのでしょうか?

よろしくお願いします。

422 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 02:45:59 ]
default:

423 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 02:58:07 ]
www.google.co.jp/search?q=scanf+%E5%95%8F%E9%A1%8C%E7%82%B9

424 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 03:52:32 ]
>>421
switchの前でscanf()を使って入力しているのなら、fgets()+sscanf()に変更してみることお勧め。

425 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 04:17:38 ]
>>368
これで早くなってるはず
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4014.c

C7 600MHz で 30秒

426 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 04:40:48 ]
O(N^2)台のアルゴリズムはまだかね

427 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 05:13:28 ]
>>368
メモリ大量消費版
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4015.c

C7 600MHz で 10秒

428 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 10:11:00 ]
>>368
>>427 のオーバーフロー耐性を強化
yakuwa[i]=yakuwa[i_copy]*(i/i_copy*j-1)/(j-1);

yakuwa[i]=yakuwa[i/j]+yakuwa[i_copy]*(i/i_copy);

429 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 13:18:08 ]
定数の割り算は、かけ算に自動的に直されてしまうのですか?

430 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 13:23:44 ]
>>429
そんな事はないけど大抵はコンパイラの最適化によってそうなる
理由は割り算よりかけ算の方が大抵のCPUで速いから



431 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 18:08:50 ]
ツリービューコントロール等で項目が選択された場合に、何番目の項目が選択されたか調べたいのです。

WM_NOTIFYメッセージを捕まえて、何番目の項目が選択されているか調べているのですが、どうやら
この方法だとツリービューコントロールが選択される直前に選択されていた項目の値が返ってしま
います。

恐らくWM_NOTIFY以外のウィンドウメッセージを捕まえるべきなのでしょうが、どのメッセージを
捕まえればよいのでしょうか?

432 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 18:14:57 ]
TVN_SELCHANGED

433 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 18:59:00 ]
>>432
ありがとうございます。
しかしTVN_SELCHANGED メッセージはそのままでは取得できないんですね…。
色々と面倒そうですがやってみます。ありがとうございました。

434 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 19:02:47 ]
WM_NOTIFY を捕まえてるのに、そのままでは取得できないってのは無いだろう。

435 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 19:21:13 ]
>>434
すみません、リストビューの扱いを間違っていました。
ちゃんとTVN_SELCHANGEDでそのままメッセージを取得できました。
重ね重ねアドバイス感謝します!

436 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 19:39:11 ]
リストビュー?
ツリービューじゃないのか?

437 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 19:42:05 ]
あ、ツリービューでした。

438 名前:デフォルトの名無しさん [2007/05/21(月) 20:13:33 ]
class Foo {
public:
 Foo(bar b);
 func();
private
 struct Impl;
 smart_ptr<Impl> pimpl;
};
があった時、インスタンス化されたFoo型のオブジェクトfのfunc()を
関数オブジェクトにしてSTLのアルゴリズムに渡したいんですが
(理由:func()はFooのコンストラクタによって初期化されたメンバpimplを利用する)、
どうすればいいんでしょう?
出来れば関数ポインタではなく関数オブジェクトとして扱いたいです

439 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 20:26:53 ]
boost::function<int ()> f = std::bind1st(std::mem_fun(&Foo::func), that);
だって、boostのチュートリアルに書いてあった

440 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 20:33:21 ]
boost::bind(std::mem_fun(&Foo::func), &f)



441 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 20:37:03 ]
回答ありがとうございます、上手く行きました。
しかしこんな奇怪なコードが通ることについてとても不思議に思います。

442 名前:デフォルトの名無しさん [2007/05/21(月) 21:45:31 ]
質問です。

プログラム初心者の質問なんですが、
プログラム上で指定したフォルダに、ファイルがいくつ格納されているのか?
また、どんな名前のファイルなのか調べる方法はないものでしょうか?

443 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 21:47:53 ]
あります。

444 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 21:47:53 ]
あげてしまいました。ごめんなさい。
あと環境はC++です

445 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 21:48:02 ]
>>442
Windows環境なら、FindFirstFile でぐぐるとよろし

446 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 21:50:24 ]
>>442
Win32ならFindFirstFile/FindNextFile

447 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 21:51:59 ]
>>442
Win32APIを使うならFindFirstFile、FindNextFile、FindClose。

448 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 21:52:44 ]
>>445-446
式は来月あたりですか?

449 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 21:53:19 ]
<boost/filesystem/operations.hpp>あたり

450 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 21:53:51 ]
421です。
いただいたヒントとatoiで修正することができました。
どうもありがとうございました。




451 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 21:57:59 ]
442です

ありがとうございます。
環境はWindowsなので、FindFirstFileでいいようです。
例になるコードもぐぐれたので、なんとかがんばってみます!

452 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 22:01:04 ]
>>439-441
boost::bind なら↓でおk

boost::bind(&Foo::func, _1)

453 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 23:47:50 ]
>448
全然一致してないじゃん

454 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 23:57:08 ]
tr1::bindでもいいよ

455 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 02:41:30 ]
二次関数(y = a x^2+ bx +c)でxがx1 <= x <= x2のときの最大値と最小値(そのときのxの値も含めて)を求めるプログラムを作成せよ。
ここでa,b,cは整数、x1,x2は浮動小数とする。

数学の発展課題として出されたのですがさっぱり分かりません。
どなたか手を差し伸べてください・・・orz

456 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 02:43:42 ]
>>455 丸投げは宿題スレ逝け。

457 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 03:05:43 ]
C++の質問なのですが、
配列:123224があるとして、2の要素数だけを取り払い、前詰めをして
配列:134にするには、どのような方法がありますか?
お願いします。

458 名前:457 mailto:sage [2007/05/22(火) 03:13:32 ]
Deleteを使わない方法がありましたら、それをお願いします

459 名前:デフォルトの名無しさん [2007/05/22(火) 03:21:13 ]
Deleteというのが何なのか知らんが、
std::vectorと共通アルゴリズム使えば一発じゃないか?

460 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 03:21:35 ]
>>457-458
配列って std::vector のことか?
結果の要素数が変わってるんで、組み込み配列じゃないんだろう。
だったら remove + erase でいい。

"Delete" って delete 演算子のことか?
new を使ってないなら使うもクソもねーよ。



461 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 03:31:02 ]
>457

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;

int main(){
int array[] = {1,2,3,2,2,4};
vector<int> vi(array, array+6);

vi.erase(remove(vi.begin(), vi.end(), 2), vi.end());

for(int i=0; i<vi.size(); i++)
cout << vi[i] << ' ';
cout << endl;

return 0;
}

462 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 05:55:58 ]
>>368です

>>389 >>420 >>425 >>427 さん、レスありがとうございます。
素因数分解を使うと手っ取り早く約数が計算できるのですね。
後でwikipediaを見て知りました(汗
あと、本探索部分もいらないループしてましたし。
プログラムを書いていただいたお二方もありがとうございました。
>>427さんのプログラムだと2秒で終わりました!
素因数分解の方法とか、ためになります。(まだ、ちゃんと読めてないですけど)
ありがとうございました。

463 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 06:22:51 ]
うーむ・・こんなにも差が出るもんなんやね・・
アルゴリズムの大切さをあらためて実感した。

464 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 07:48:37 ]
>>462
中学で習うよ・・・

465 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 08:07:40 ]
>>462
約数の和

60 の場合
60= 2^2 * 3^1 * 5^1
(60の約数の和)=(2^0 + 2^1 + 2^2)*(3^0 + 3^1)*(5^0 + 5^1)
=(1+2+4)*(1+3)*(1+5)=168

>>427 のアルゴリズム
60=2^2*15
(60の約数の和)=(15の約数の和)*(2^0 + 2^1 + 2^2)
=(15の約数の和)*(2^3-1)/(2-1)

>>428 のアルゴリズム
60=2^2*15
(60の約数の和)=(15の約数の和)*(2^0 + 2^1 + 2^2)
=(15の約数の和)*(2^0 + 2^1) + (15の約数の和)*2^2
=(30の約数の和) + (15の約数の和)*2^2

466 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 12:56:16 ]
C++で値クラスを作る際に、Cスタイルの構造体を選択した場合、
コンストラクタのオーバーロード
(引数なしでメンバは全てゼロ、または指定引数で初期化といった動作をさせるため)
すること、さらに考えを進めて振る舞い、つまりメンバ関数を持たせることって良くないんでしょうか?

467 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 13:02:16 ]
凸包を調べるためにQhullを使ってるんだけど、頂点配列points[i]から
凸包の外周要素に使われた点の添字を抜き出す方法って無い?

色々やってみたけど、外周要素の点の座標しかもってこれないです。

468 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 13:03:45 ]
構造体にメンバ関数を持たせることに対する文法的な質問?
それとも比較的どうでもいいコーディングスタイル的な質問?

前者なら、文法上可能。
classとstructはデフォルトのアクセス修飾が異なるだけでなんら問題なし。

後者なら、好きにすれば?としか言いようがない。

469 名前:デフォルトの名無しさん [2007/05/22(火) 13:15:52 ]
|は演算子ですか?こういう使い方みるんですが

a(x|y,z)

470 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 13:16:26 ]
入門書に書いてあるような事を聞かない。



471 名前:デフォルトの名無しさん [2007/05/22(火) 13:18:57 ]
じゃあスレタイに初心者歓迎なんてつけないでください

472 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 13:26:26 ]
読んでも分からない事ならいいが、
読めば誰でも必ず分かる事を聞かれても困る。

473 名前:デフォルトの名無しさん [2007/05/22(火) 13:28:11 ]
1か0かって書いてたんで変数1か0しか無意味ということですか?

474 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 13:28:27 ]
演算子ですよ

475 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 13:29:34 ]
x|y ビットOR
x||y 論理演算OR

476 名前:デフォルトの名無しさん [2007/05/22(火) 13:30:59 ]
ビットOR の使いかたがわかりません

477 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 13:33:47 ]
各ビットでORが必要になったら使う
必要でなかったら使わない

478 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 13:34:01 ]
y==11001010
x==00110101

z=x|y

z==11111111

479 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 13:34:09 ]
たとえば
a = 99|137;//aには235が代入される
01100011 (99)
10001001 (137)
---------ビットOR
11101011 (235)


480 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 13:41:08 ]
こんなのにわざわざ…
おまいら親切だな

>>471
モノには順序(ry



481 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 13:59:50 ]
うん、俺今ちょっと気分いいんだ。

482 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 14:06:12 ]
惚れました(*´ェ`*)

483 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 14:15:46 ]
誰かcygwinでwhileを使った九九のプログラムの作り方を教えてくれませんか(´д`)

484 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 14:17:27 ]
宿題は自分で。

485 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 16:34:09 ]
www.uploda.org/uporg818968.txt.html

リスト云々覚えようかとこんなの書いてみたんですが、下から10行目辺りのreallocの所で、強制終了してしまいます。
どこが悪いんでしょうか・・・・誰か教えて下さい

486 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 16:41:48 ]
ポインタを初期化もして無いくせにrealloc使うな。
どうしても使いたきゃNULLで初期化してから使え。

487 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 16:44:04 ]
つーか、
struct late data[20];//とりあえず、20個分
struct late *memp=data;//↑のデータの最初のアドレスをmempに
配列のアドレスで初期化しとる。

初期化しなければ、グローバル変数だからNULLが入るんでうまくうごいたのにね。

488 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 16:47:11 ]
reallocの動作を勘違いしてる

489 名前:485 mailto:sage [2007/05/22(火) 16:52:22 ]
む・・・良く分かんない・・・・・・orz
reallocの一つ目の引数には、中身が入ったポインタを指定してはいけないって事ですか?

490 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 16:54:10 ]
>>489
一つ目の引数は必ずmallocやreallocで取得したポインタ(か、NULL)
同じ位置で指定したサイズが取得できないと、別の場所でallocしなおして
最初のやつはfreeされる。



491 名前:485 mailto:sage [2007/05/22(火) 16:57:11 ]
>>490
あ、分かりました。
struct late data[20];//とりあえず、30個分
struct late *memp=data;//↑のデータの最初のアドレスをmempに
↑の部分を

struct late *memp;
memp = (struct late*)malloc((sizeof(struct late)) * 20);
こうすればいいんですよね?

492 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 16:59:54 ]
>>491
まあそういうこと。
そして、reallocするということは、それが常に同じアドレスとは限らない。

493 名前:485 mailto:sage [2007/05/22(火) 17:01:35 ]
>>492
ありがとうございました。物凄く勘違いしてたっぽいですねorz
勉強になりました。

494 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 17:09:37 ]
>>466
C++/CLIでのことだったらそっちのスレで聞いたほうが的確な助言がくると思うぞ。

495 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 21:28:41 ]
www.heat-devil.com/up/src/No0300.zip
非常に初心者な質問なのですが、
ファイル分割の勉強中で↑な感じで3つに分けて
borland C/C++コンパイラでbcc32 a.cpp hoge.cpp hoge.hとやったら
『 hoge.h 1: 宣言の構文エラー』と出るのですが、
hoge.hのどこが間違っているのか分からないのでどなたか教えてくださいorz

496 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 21:50:28 ]
>>495
なんで hoge.h がエラー扱いされてしまうのかは俺も少々不可解だけど、

  bcc32 a.cpp hoge.cpp

でおk。hoge.h は a.cpp と hoge.cpp から include される対象に
過ぎないからコンパイルする必要は無し。

497 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 21:57:29 ]
.hをコンパイルすると、C++じゃなくて、Cとして
コンパイルされるんじゃないの。

498 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 21:59:58 ]
ああ、なるほど。

499 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 22:16:23 ]
>>496-497
うわぁああ出来ました!!
そうか、iostreamとかもコンパイルの時書かないですしね><
分割するの初めてだったからファイルの書き方間違っているのかと
今日一日中ネットや本で調べたけど分からなかったのでホントに嬉しいです・・・(;△;)
まさかそっちのやり方が間違っていたとは。
ありがとう、本当にありがとうございます><


500 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 22:18:59 ]
(;△;)



501 名前:デフォルトの名無しさん [2007/05/22(火) 22:49:01 ]
オーム社「C言語によるプログラミング[応用編]」(第一版)
サンプルプログラム sample2 myform.c

をそのまま写して、コンパイルしたところエラーがでました。
環境は、
gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21) です。

エラー出力は、
myform.c:57: error: two or more data types in declaration specifiers
myform.c:104: error: conflicting types for 。GetArg「
myform.c:57: error: previous declaration of 。GetArg「 was here
myform.c:256: error: conflicting types for 。LineAdd「
myform.c:58: error: previous declaration of 。LineAdd「 was here

int GetArg( int, char *[], int *, int *, int *, int *, char [] );
int GetArg(
int argc,
char *argv[],
int *column, /* カラム数 */
int *line, /* 行数 */
int *upper, /* 上余白行数 */
int *left, /* 左余白行数 */
char file[] /* 入力ファイル */
)

int *LineAdd( char *, char *, int );
char *LineAdd( char *to_buff, char *from_buff, int num )


502 名前:501 [2007/05/22(火) 22:51:35 ]
このエラーの原因を知りたいのですが、
ヒントやポインタをおねがいします。

一番下のこの部分は無視してください。
int *LineAdd( char *, char *, int );
char *LineAdd( char *to_buff, char *from_buff, int num )
_

503 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 22:52:40 ]
どこが57行目?

504 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 22:56:31 ]
>>501
セミコロン

505 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 23:02:57 ]
int GetArg( int, char *[], int *, int *, int *, int *, char [] );
int GetArg(
int argc,
char *argv[],
int *column, /* カラム数 */
int *line, /* 行数 */
int *upper, /* 上余白行数 */
int *left, /* 左余白行数 */
char file[] /* 入力ファイル */
){
return 0;
}
とりあえず、gcc 3.4.6にかけてみたけど、エラーなんて
でなかったぜよ。

506 名前:501 [2007/05/22(火) 23:03:33 ]
57行目
int GetArg( int, char *[], int *, int *, int *, int *, char [] );

104行目
int GetArg(
int argc,
char *argv[],
int *column, /* カラム数 */
int *line, /* 行数 */
int *upper, /* 上余白行数 */
int *left, /* 左余白行数 */
char file[] /* 入力ファイル */
)

です。
myform.c:256: error: conflicting types for 。LineAdd「
myform.c:58: error: previous declaration of 。LineAdd「 was here
は無視してください。

507 名前:501 [2007/05/22(火) 23:06:50 ]
>>504
int GetArg( int, char *[], int *, int *, int *, int *, char [] );
^^^

このセミコロンのことでしょうか?

>>505
わざわざコンパイルしてくださって、ありがとうございます。
お手数かけてすいません。
これから、自分の環境でその部分だけコンパイルしてみます。

508 名前:501 [2007/05/22(火) 23:11:45 ]
>>505をコンパイルしたところ、自分の環境でもエラーはでませんでした。

ほかに GetArg関数に関係があるところは、メイン関数でよびだしたこの場所だと思います。
なにかまちがえたことをしているでしょうか。

int main ( int argc , char *argv[] )
{
int column, line, upper, left;
char file[SMALL_BUFF_SIZE];
int result;

/* main引数取得 */
result = GetArg( argc, argv, &column, &line, &upper, &left, file );


509 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 23:46:33 ]
「基本クラスにあるprotectedなメンバ関数を、
 派生クラスで名前も処理も変えず、publicに昇格する」 というのは、

class base {
protected:
  int hoge() { ... }
};

class derived : public base {
public:
  int hoge() { return this->base::hoge(); }
};

こんな感じになりますか?
それとも、もっと簡単にできますか?

510 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 00:04:48 ]
名前も処理も変えないんだったらオーバーライドする意味無いやん
さらに言えばprotectedにする意味無いやんhoge()はpublicにすりゃいいやん
って思ったんですがどうでしょう?



511 名前:501 [2007/05/23(水) 00:09:27 ]
エラーの原因がわかりました。
57行目の int GetArg( int, char *[], int *, int *, int *, int *, char [] );
の前にある、

enum
{
NORMAL_END, /* 0 */
USAGE_ERROR, /* 1 */
FILE_ERROR /* 2 */
};
^^^^
このセミコロンが欠けていました。
>>504さんのいうとおりでした。

おさわがせいたしまして、どうもすいませんでした。
レスくださった方たち、ありがとうございました。


512 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 00:10:16 ]
>>510
尤もだ。

513 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 00:11:15 ]
using base::hoge;
でよくね?

514 名前:デフォルトの名無しさん [2007/05/23(水) 12:47:58 ]
C++初心者で申し訳ないのですが、質問させてください。
↓のページのSFMTを、C++プログラムから利用したいのですがうまくいきません。
ttp://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/

ttp://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/howto-compile.html
Linux上でg++(ver4.20)でコンパイルしてみると、sample2-1や2-2が詰まります。
ヘッダでinline宣言してある関数が"xxx is used but never defined"と警告され、
リンク時にエラーになります。
sample2-3のようにcファイルをincludeする、またはgccならばコンパイルできますが
c++のソースから呼び出さねばならない場合、どうすればよいのでしょうか?
c++用ライブラリ等も紹介されてますが、呼び出し側プログラムの書き換えを最小限に
したいので、inline関連のオプション追加で解決してくれるなら、と思っています。
よろしくお願いします。

515 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 13:03:31 ]
>>514
よく見てないけどこんなのは?
extern "C" {
#include "SFMT.h"
}


516 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 13:33:50 ]
#include<iostream>
#inlucde<iostream.h>

C++でのこの2つって何か違いがあるんですか?

517 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 13:41:38 ]
はい。

518 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 13:41:54 ]
後者は過去の遺産。

519 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 13:49:38 ]
積極的に.h無しが推奨される理由があるなら教えて頂きたいです><
Cの勉強始めた時から.h有りで書いていて慣れていたので。

520 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 13:53:59 ]
規格に書いてあるから。



521 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 13:55:57 ]
違いがあるから

522 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 13:56:20 ]
iostream.h の方は std 名前空間に入ってないから。

523 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 14:21:06 ]
>>516
iostream.hの方が入出力が速い処理系があります(VC6とかVC6とかVC6とか)。
でも既に古いC++です。

524 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 14:36:13 ]
>>522
し、正直よく分からないけどあなた様のレスのコピペを保存して
賢くなったら読み返して理解してみます><
>>523
ありがとうございます。
新しい処理系だと.h無しの方が処理が速いんですね。
参考になりました><

525 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 15:04:09 ]
>>524
>518とか>520も無視すんなや。ちゃんとメモしとき。
それからついでに。
>新しい処理系だと.h無しの方が処理が速いんですね。
誰もそんなこと書いていない。

526 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 15:18:03 ]
>>525
いや、2chでよくあるYES/NOレスみたいな感じで
スルーか微妙だったから具体的に教えてくれた人にレスしたんだ。
もし気を悪くしたらごめんです。
それと昔は.h有りの方が速かったけど今は>>522さんが言った理由な感じで
.h無しの方が良いから処理速度は.h無しでも変わらなくなったってことかな?
なんだか分かったような分かってないようなだけど突っ込んでくれてありがとう><

527 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 15:40:43 ]
処理速度なんて関係ない。
要は.h有りは古い規格で、今は.h無しが標準ということ。
実際VC++では2003あたりから標準に則ってiostream.hは提供されなくなった。

528 名前:デフォルトの名無しさん [2007/05/23(水) 15:49:52 ]
礼儀のなってない自称初心者ほど嫌われるものはない。

529 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 16:10:08 ]
>>527
つまりその名前空間云々で.h無しの方が良くて、
その規格に合わせて処理系も変わってきたから.h無しが推奨されると。
という把握をしてみました。
とりあえず名前空間云々を可及的速やかに勉強してみます><

>>528
うん、なんだかごめんです。
「規格だから」「過去の遺産」「違いがあるから」的なのじゃなくて
「どうしてそういう規格でどう違いがあって」的な理由を聞きたくて
「うん」とか表面的な答えの人は2chではあまりちゃんと答えてくれない
経験則から他の人にだけレスしてしまった。
気を悪くしていたら反省している。


530 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 16:19:34 ]
他の板には余りないこの板の特徴かも知れんが、
「答えだけ書くから後は自分で調べろ」的なパターンかもね。

兎にも角にも>529は「書いてあるものを読み」、「書かれてないことを読まない」ようにしないとな。



531 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 16:33:20 ]
自分で答えを決め付けてから読むから
回答者の意図なんて全然読み取れてない

532 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 16:45:07 ]
>>531
こんだけ反省してるって言ってるんだから、
流石にいい加減しつこいというか。
質問者だけにやたら厳しいが仮にも初心者歓迎謳ってるんだから
回答者にもある程度誘導的な姿勢は必要だとも思うし。

533 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 16:46:04 ]
いつまで苛めてんだ。カルシウム摂れ。

534 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 16:47:36 ]
いつまでもいいんだ。カルシウムくれ。

535 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 16:49:06 ]
煮干が美味いんだ。昆布でダシは邪道

536 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 17:07:43 ]
質問です

最近C++(つかプログラミング)を始めた者です
入門書「やさしいC++」を読んで、一通り簡単な文法とかは理解したんですけど、
この板に出てくるソースによくある、関数の種類とかについては全く分かりません。
そろそろコンソールアプリケーションじゃなくて、ウインドウのソフトも作ってみたいと思うんですが、
どうやら、関数をいっぱい知ってなきゃ作れないらしいですね。

これから自分はどんな本,どんなサイトを見て勉強していくべきなのでしょうか?

537 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 17:46:03 ]
やれやれ。そろそろネタばらしでもしてやるか。

昔はインクルードするものと言ったらヘッダーファイルで当然だったのだが
果たしてヘッダーファイルが実在する必要があるのか、
それを規格で要求するべきなのかと言う議論があった。
そのためにいかにもファイルの拡張子っぽい.hをなくし、
コンパイラは標準ライブラリのヘッダーをインクルードしている部分を
通常のインクルード処理ではなく、対応する標準関数その他を有効にする
単なるスイッチとして使うことを許すようにした。

538 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 17:55:49 ]
>>536
MSDN

539 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 18:01:54 ]
質問です。
typedef float Vector3[3];
なんてtypedefをしたんだけど。
vector<Vector3> vec;
vec.resize(10);
が通らない。
vector<float> vec;
vec.resize(10);
なら通るんだけど。
どうして?

540 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 18:03:51 ]
>>539
配列にはそのまま代入ができないので、無理。



541 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 19:27:17 ]
vectorが内部で何やってるか考えてみようぜ

542 名前:デフォルトの名無しさん [2007/05/23(水) 20:54:27 ]
ここで聞いて良いのか分からないのですが、間違っていたらすみませんが誘導お願いします
VC++の初心者質問なんですがCOMインターフェイス使って#import する場合
例えば、エクセルなんかの場合
##import "C:\Program Files\Microsoft Office\Office\excel9.olb"
rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") rename("DocumentProperties", "DocumentPropertiesXL") no_dual_interfaces


とかやるんですが、これはビルドしたときにexeに組み込まれちゃうんでしょうか?
もしくはexeが実行したときにオブジェクトライブラリが読み込まれるのでしょうか?


543 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 21:08:11 ]
>>542
excel9.olbの内容はコンパイル時にのみ参照される。
実行時にexcel9.olbは不要。

544 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 21:25:18 ]
>>539
vector<vector<float> > vec; でいいじゃん
resize()は要素分行う必要があるので面倒だけど

545 名前:デフォルトの名無しさん [2007/05/23(水) 21:29:35 ]
>>543
ありがとうございます


546 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 21:39:56 ]
>>544
struct Vector3 { float vec[3]; };
vector<Vector3> vec;
の方がいいんじゃないか

547 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 21:54:57 ]
>>539

struct Vector3 {
  float a;
  float b;
  float c;
};

vector<Vector3> vec;

548 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 22:01:34 ]
abcよりもxyzのほうが的確だと思う

549 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 22:03:38 ]
そんなことはどうでもいいと思う

550 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 22:18:21 ]
M$のABC構造体とかふざけた名前のやつを思い出した



551 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 22:21:55 ]
フォントの幅だっけ?

552 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 09:39:23 ]
ABCD包囲網だな。CとDがうぜえ

553 名前:デフォルトの名無しさん [2007/05/24(木) 19:01:31 ]
VC++2003でexeのプロジェクトを別のexeで参照設定する事はできますか??

554 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 19:30:29 ]
---------------------------
Microsoft Development Environment
---------------------------
'○×△□.exe' への参照を追加できませんでした。 これは有効なアセンブリまたは
COM コンポーネントではありません。拡張子 'dll' を持つアセンブリまたは COM
コンポーネントのみを参照することができます。ファイルがアクセス可能で、有効な
アセンブリまたは COM コンポーネントであることを確認してください。
---------------------------
OK   
---------------------------


555 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 19:52:25 ]
COMコンポーネントじゃないので、できませんという事ですね。
ありがとうございます><

556 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 19:55:02 ]
( ゚д゚)ポカーン

557 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 19:58:21 ]
>>556
>>555とは別人だけど、違うの?
COMコンポーネントかDLLしか参照できないってことじゃないの……?

558 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 20:46:00 ]
VC++2003で exeのプロジェクト を 別のexeで 参照設定する事
謎が多いな。 make の依存関係だけなのか、
別のexe が、元 exe をリンケージするのか

559 名前:557 mailto:sage [2007/05/24(木) 21:02:04 ]
>>558
それは自分も思った。
ShellExecuteとかそのたぐいでいいじゃんてね。

でも、exeの参照の可否と、その有用性はとりあえず関係なくね?

560 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 21:19:31 ]
>>557
exeでも参照できるよ







.NET Frameworkならね



561 名前:560 mailto:sage [2007/05/24(木) 21:22:02 ]
ていうかVC初心者スレ池

562 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 23:26:48 ]
「構造体とクラスは無関係」という人をよく見かけるけど、
構造体からヒントを得て、クラスという概念を作ったわけではないの?
構造体使ってて、あー、こういう風にしてーなー、と思ったところを、
クラスという形で実現したのであれば、
無関係ってちと言い過ぎじゃないかなー、とか思うんだけど。

563 名前:デフォルトの名無しさん [2007/05/24(木) 23:29:18 ]
switch(event)
{
case1:
foo;
case2:
bar;
default: ←100行目
}

if( !p1)
{
・・・
GOTO Test;

Test: ←100行目
}
gcc version 4.1.2 で、
上のように、default: や Test: の後が空行のまま } がくると、次のようなエラーがでます。

handle.c:100: error: label at end of compound statement

これは仕様なのでしょうか?
default: は消し、 Test: は {}の外にうつして回避したのですが、それで正しいでしょうか。
アドバイス、よろしくお願いします。

564 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 23:31:09 ]
>>563
ラベルの後には文が必要です。
;(セミコロン)だけでも付けましょう。

565 名前:563 mailto:sage [2007/05/24(木) 23:39:39 ]
>>564
セミコロンをつけたところ、コンパイルがとおりました。
どうもありがとうございました。

566 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 00:35:43 ]
www.uploda.org/uporg822044.c
この選択ソートのプログラムをswap関数を用いて作り変えたいと思い、
下記のようにしてみたんですが、うまくいきません。
www.uploda.org/uporg822047.c

何が悪いのか教えてください。お願いします。

567 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 00:37:39 ]
swapに渡されるのは引数のコピーだ

swap(int* a,int* b);

568 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 00:56:53 ]
色々やってみましたが、分かりませんでした。
よろしければ正解例を示していただけないでしょうか。
お願いします。

569 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 01:02:35 ]
よくみたら内部で配列を交換してんのか

つうかコレコンパイルできなくね?

面倒だからとりあえず
int i,j,k,work,num,a[100];
をmainの外に出せば動くんじゃね

570 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 01:06:42 ]
>>569
はい、566の下のソースはコンパイルできていません。
mainの外に出してもできないようです。



571 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 01:19:43 ]
mainの外に出したら動いたわけだが、、、

572 名前:デフォルトの名無しさん [2007/05/25(金) 01:45:14 ]
>>570www.uploda.org/uporg822246.c

573 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 05:35:49 ]
mciSendStringでnotify(+MCI_NOTIFY_SUCCESSFUL)で
ループ再生を行っている時、
まれにループに入るタイミングでループされず、
永遠とnotifyが投げられビジー状態になってしまいます。

100回に1回も起こらないので、原因は良く分かりませんが、
もしかしたら、曲を変えようと前の曲をstop、closeし、
新しい曲をopen、playするのと同じぐらいのタイミングで
notifyが来た時に起きているのかもしれません。

対策方法などがありましたら、教えてください。

574 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 06:26:54 ]
再生するファイルの種類は何かね?あとOS

575 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 08:12:19 ]
×永遠と
○延々と

576 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 09:01:26 ]
>>562
C++のクラスはSimulaからのインスパイヤ

577 名前:573 mailto:sage [2007/05/25(金) 09:22:55 ]
>>574
ファイルはmidi、OSは9xです。

>>575
素でやってしまいました・・

578 名前:573 mailto:sage [2007/05/25(金) 09:34:53 ]
後、もちろんmciSendStringの戻り値は0(成功)です。
音楽を変えるためstop、closeした後、
前の曲のnotifyが来てしまいおかしくなるのかもしれません。

notifyが連続で来る事は普通は無いので、
その時は、playをsendしないようにする方法とかもあると思うんですけど。

579 名前:デフォルトの名無しさん [2007/05/25(金) 10:20:06 ]
stringはあまりよくないと聞いたことがあるのですが
charの配列を使うよりstringを使ったほうがいいですよね?

580 名前:566 mailto:sage [2007/05/25(金) 10:50:50 ]
>>572
ありがとうございました。
保存したので、もう消していただいてもかまいません。



581 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 11:06:24 ]
>>579
好きにすればいいと思うよ。
配列とnew/delete演算子と
テンプレートクラスの勉強が済んでいる前提で。

582 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 11:54:11 ]
>>579
よくない理由を問い詰めておけ。

583 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 12:21:45 ]
1方向Listを作っています。参考書等で調べたのですが
削除関数の部分をどう記述すれば良いのか分からないので教えてください。
uproda11.2ch-library.com/src/116479.c

584 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 12:30:56 ]
>>583
まずは自分で書けよ。今のソースじゃどういう動作にしたいのかもわからん。

585 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 14:03:27 ]
もうソース見えん。

削除ってのはさ、
A→B→C のBを消すときにAの指してる先をCにしてBを消せばいいわけだ。
でも片方向でBの前を探すのは面倒だから、Bが指してるCの内容を
そっくりBにコピーしてCを消す、というトリックが使える場合があるぞ。

586 名前:デフォルトの名無しさん [2007/05/25(金) 15:20:22 ]
mfcについて教えてください。

通信受信プログラムで受信データをエディットコントロール(複数行表示)に表示しているのですが、
以下のコードでは、エディットコントロールに文字列を追加する際に必ずスクロールされてしまいます。
スクロールされない方法を教えてください。

int iLen = edit->GetWindowTextLength();
edit->SetSel(iLen, iLen);
edit->ReplaceSel("Hello\n");

WinXP & Visual Studio 2003 & mfc7です。

587 名前:気まぐれアナスイ mailto:お腹いっぱい@気まぐれアナスイ [2007/05/25(金) 15:31:32 ]
!(Φ_Φ+){???}
"hello"


  #####
  #
  #
  #
  #

588 名前:気まぐれアナスイ mailto:お腹いっぱい@気まぐれアナスイ [2007/05/25(金) 15:37:31 ]
!(Φ_Φ+){???}
"hello"


  #####
  #
  #
  #
  #

589 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 15:38:59 ]
>>586
MFCスレへどうぞ。
つーか、LineScrollで元のとこに戻せばいいんでないの?

590 名前:デフォルトの名無しさん [2007/05/25(金) 16:24:49 ]
>>589
レスありがとうございます。

LineScrollで戻すと、1行書くごとに「下へスクロール→上へスクロール」となり、上下にスクロールが発生してしまい
とても見づらくなってしまうのです。

「スクロールなし」でエディットコントロールに文字列を追加できないものでしょうか?



591 名前:気まぐれアナスイ mailto:お腹いっぱい@気まぐれアナスイ [2007/05/25(金) 16:57:37 ]
!(ΦyΦ+){???}

『のだめカンタービレ』

592 名前:気まぐれアナスイ mailto:お腹いっぱい@気まぐれアナスイ [2007/05/25(金) 16:58:53 ]
!(ΦyΦ+){???}

『のだめカンタービレ』

593 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 17:12:41 ]
初めまして、VC++のC++/CLIのフォームアプリケーションについて質問があります。

今、LimeChat 2 の様なアプリを作っていています。
そのアプリのテキストボックスには、カーソルが表示されていません。
どのようにすれば、カーソルを表示させないようにできるのでしょうか?

また、TreeViewの再描画を一時停止させたいのですが、どうすればよいのでしょうか?

594 名前:つ[SetRedraw()] mailto:sage [2007/05/25(金) 17:13:25 ]
>>590
誘導されているんだから更に質問するなよ。

595 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 17:14:57 ]
>>593
C++/CLIは最早C++でさえないので該当スレへ。つーか、プロパティだか属性だか知らんが編集可否とかカーサ表示有無とかないの?

596 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 17:21:17 ]
>>595
それが無くて困ってますorz

該当スレ = C++/CLI について語ろうぜ Part2
で質問してもいつもスルーされてしまうんですorz

597 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 17:23:06 ]
そりゃ、明らかにC++/CLIの話題じゃなくて、.NET FrameworkなりCLRなりの話題だもん。

598 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 17:28:00 ]
自分でスレ立てるしかないですかね?

599 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 17:36:19 ]
>>598
やめれ。

600 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 17:37:26 ]
>>598
やめれ。



601 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 17:40:29 ]
>>598
やめれ。

602 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 17:40:44 ]
やめときますorz
どこに書き込んでも
>こんな奴がC++出来るんだぜとかいってると思うとため息出るな・・・
とか
>(゚Д゚)
みたいに馬鹿にされますorz

これってそこまで初歩的な質問ですかね?

603 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 17:59:05 ]
>>602
ヘルプぐらい見ろよ。
MSDNで「TreeViewメンバ」一覧とか見れば、
BeginUpdate ツリー ビューの再描画を無効にします。
とか思いっきり書いてあるだろ。
日本語読めないの?

604 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 18:00:21 ]
>>602
> そのアプリのテキストボックスには、カーソルが表示されていません。
> どのようにすれば、カーソルを表示させないようにできるのでしょうか?
>
とりあえず、この文面だとカーソルを消したいのか表示させたいのか分からん。
あとこの場合は、マウスの移動とともに表示される矢印のマウスカーソルと、
テキストの間に表示される縦棒の二つの意味にとれるので、
そこも説明する必要あり。

605 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 18:15:45 ]
>>603
あったんですか(゚Д゚)

>>604
テキストの間に表示される縦棒を消したいです。

606 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 18:30:52 ]
>>602
スレ違いって指摘されているの判る?
それでも居座るような状態だから馬鹿にされるんだよ。

607 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 18:54:14 ]
俺はこのスレでC++/CLIを出してきても構わないと思うけどな
まあ答える奴は少ないだろうとも思うけど

602が答えを得られないのは602自身の問題

608 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 18:58:10 ]
片っ端からマルチかよ。
そりゃ答えてもらえないわけだ。

609 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 20:36:14 ]
構造体の末尾にパディングを入れてサイズを固定にしたいのですが、

struct hoge {
  int a;
  int *b;
  hoge *c;
  char padding[???];
};

例えば sizeof(hoge) == 16 になるようにしたい場合、??? にはどう書けばいいでしょうか?
16 - offsetof(hoge, padding) とか書ければいいのですが。

610 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 20:50:08 ]
paddingまでが詰まってる前提なら
16-sizeof(a)+sizeof(b)+sizeof(c) でいいんじゃね

試してないけど



611 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 20:58:19 ]
16バイトの配列との共用体にするとか

union hoge{
  char size[16];
  
  struct {
    int a;
    int *b;
  };
};


612 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 21:06:47 ]
テキストに入力できる状態なら
縦棒消すの無理じゃない?

613 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 23:01:17 ]
なぜなのかよく分かりませんが、LimeChat 2というIRCでチャットをするためのソフトでは、点滅しているカーソルが表示されていないんです

614 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 23:13:11 ]
キャレット表示されてないと入力編集がものすごく難しくないか?

615 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 23:14:43 ]
チャットソフトだからログ表示部品と発言入力部品が別なんだろ。
でログ表示部品にキャレット(カーソル)が出てしまうのがウザイと。

616 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 23:21:29 ]
おまえらどこか一箇所でやれよw

617 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 23:27:44 ]
ぐぐったらこんなのが引っかかった
BOOL HideCaret(HWND);
つーわけで消したいEditBoxのhwndを放り込んで使ってみよう

618 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 04:34:05 ]
HideCaret(static_cast<HWND>(this->textBox1->Handle.ToPointer()));
でなんとかキャレットを非表示にできそうです。

しかし、外部シンボル ""extern "C" int __stdcall HideCaret(struct HWND__ *)" (?HideCaret@@$$J14YGHPAUHWND__@@@Z)" は未解決です。
というリンクエラーが出てしまいましたorz

619 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 06:05:17 ]
>>593=>>602=>>605
.NETの話はVCスレ行けよ
キャレット(カーソル)うんぬんとかWin32APIスレ行けよ

620 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 08:26:09 ]
>>618
user32.libをリンクしろ

>>619
環境依存ネタOkなスレだからありだろ



621 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 08:50:12 ]
環境以前にスレ違いなわけだが

622 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 10:32:12 ]
シフト演算(<< >>)ではなく、ローテートを行いたい場合、どのようにすればよいのでしょうか?

623 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 10:41:59 ]
左右シフト演算をORで結合、かな。
コンパイラに拠っては、rotに展開されるであろう
組み込み関数とかがあるかもしれないけど。

624 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 10:49:45 ]
組み込み関数あるね
unsigned long _lrotl(unsigned long value, int shift) 符号なし long 型整数の各ビットを左にローテートします。
unsigned long _lrotr(unsigned long value, int shift) 符号なし long 型整数の各ビットを右にローテートします。
unsigned int _rotl(unsigned int value, int shift) 符号なし整数の各ビットを左にローテートします。
unsigned int _rotr(unsigned int value, int shift) 符号なし整数の各ビットを右にローテートします。


625 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 11:44:25 ]
>>620さんのおかげで解決しました。ありがとうございました。

>>621
スレ違いなら消えますorz

626 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 11:55:41 ]
何度もスレ違いって言われてるだろ。
さっさと消えろやこの世からもな!

627 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 12:15:39 ]
    _、,、
  θ《▼》θ                                  ; ,;从 , ガッ
  ノリ#゚−゚リ)((ニ(ニ(l     チュドーン   ..,  ''"´"''': ; .     、゙,',::、⌒::;.,'."));": ←>>626
  ( ノ つ|_||三三二弌ll============lニlll),,'   . : ;  _,; "   `.、:.(`:'⌒::"`.;`⌒゙":ドカーン
  《ソ|__/|ニ〃l,=l┘               "'' -''''"´    ;;.゛;((:;;`';::,");;";;;))`.;
    し'ノ                              ゛;((:;;`::"`.;`⌒゙);;";;;))`.;
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
おまえが死ねよ
価値がないのはおまえだろw

628 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 12:24:24 ]
そもそもCLIってなんですか?なにに使うんですか?

629 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 12:27:21 ]
>>628
ja.wikipedia.org/wiki/%E5%85%B1%E9%80%9A%E8%A8%80%E8%AA%9E%E5%9F%BA%E7%9B%A4

630 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 12:31:16 ]
.NETプログラミングのことですか?



631 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 13:03:03 ]
managed C++ とどう違うの?

632 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 13:29:01 ]
>>630
大体あっている
.NET Frameworkを標準規格化した際の名称がCLIとでも思えばいい

>>631
構文がましになった

633 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 19:39:54 ]
VS2005EEです。
Wktk(void(*func)(void)) というような関数に
クラスメソッド void cKwsk::Osieru()
のポインタを渡したいのですがC2440エラーでうまくいきません。
どのようにキャストすれば良いのですか?

634 名前:デフォルトの名無しさん [2007/05/26(土) 19:44:45 ]
Visual Studio 2005にて、以下のようなコードを書いたのですが

const TCHAR OutBuff[] = _T("D:\\TEST\\アイウエオ.txt\n");
const TCHAR OutFile[] = _T("abc.txt");

_tfopen_s(&fp, OutFile, _T("w+, ccs=UNICODE"));
_fputts(OutBuff, fp);
fclose(fp);

これで出来上がったabc.txtの中身を見ると
D:\TEST\[EOF]

要するにカタカナの「ア」以降出力されません。
これはどうすればうまくいくでしょうか?

環境はVS2005 SP1 WindowsXP SP2
ワイド文字を使用するでコンパイルしています。


635 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 19:49:39 ]
>>633
そのメンバ関数を静的メンバ関数にすればいい。

636 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 19:51:15 ]
>>633
キャストできない。
クラスメソッドでない普通の関数を噛ませるか、Wktkの方を変えるしかない。

637 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 19:52:25 ]
>>634
ロケール

638 名前:634 mailto:sage [2007/05/26(土) 20:13:49 ]
>>637
うまくいきました。ありがとう。

639 名前:633 mailto:sage [2007/05/26(土) 20:56:47 ]
静的メンバ関数にすることで対応しました。
レスありがとうございました。

640 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 21:13:31 ]
誰だよ
>環境以前にスレ違いなわけだが
みたいな糞逝ったのは



641 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 01:49:39 ]
atlのT2Wを使うにしても、mbstowcs系を使うにしても
マルチバイトで"あいう"っていうのをワイド文字列strに変換したばあい、
str[0] = "あ", str[1] = "い", str[2] = "う"と言うふうにはならないんです
変換前と変換後で文字列が対応するように変換するにはどうしたらいいでしょう?


642 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 01:55:05 ]
え?なるだろ?
ならないっていうなら、現状どうなってるんだ?

643 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 01:55:30 ]
すいません、マルチバイトに変換してましたorz
ちゃんとT2W使った上手く変換できました

644 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 03:37:25 ]
初心者ですが質問にお答えいただけるとうれしいです。
配列に直接機械語を埋めて関数ポインタで実行させたいのですが
よくわかりません。
環境はPentium4、WindowsXP、BorlandC++Compiler。
//ソース
#include <stdio.h>

int main(void)
{
   int (*func)(void);
   const char ch[] = {
      0xb8, 0x45, 0x23, 0x01, 0x00, 0xc3
   };
   func = (int(*)(void))ch;

   printf("%X", (*func)());

   return 0;
}
何かが決定的に間違っているのにちゃんと12345と表示されます。
アセンブリで
mov ax, 123h
ret
と書いてnasmでアセンブルすると
B8 23 01 C3と機械語が吐き出されます。
これをそのままch[]に埋め込んでもエラーで正しく実行されません。
axレジスタって16Bitですよね?なぜか32Bitで補正してやると正しく実行されるんですよね。
きっと、正しくできていると思い込んでいて実際には偶然こうなっただけなのでしょうけど
なぜ、これが出来て、普通にアセンブルして出来た機械語が実行できないのでしょうか?
もしかして、こういう行為自体が土台不可能な話で、今回出来たのはまったくの偶然ということでしょうか?
教えていただけないでしょうか、よろしくお願いします。

645 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 03:58:41 ]
なんで初心者なのにhackのマネ事してるんだ

646 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 04:28:36 ]
>>644
C++言語の範疇を逸脱した内容なのでスレ違い。
アセンブラ関連のスレへどうぞ。

647 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 04:36:01 ]
masm系ならuse32

648 名前:644 mailto:sage [2007/05/27(日) 04:37:26 ]
>>645
hackといわれてもよくわかりませんが
ただ、興味があったとしか申し上げられません。

>>646
こちらC言語です。どうぞ。
失礼。そうですね。ただCでこういうことが可能かどうかを知りたかっただけでして。
出来るか出来ないかだけでも教えて頂きたいと思っているのです。
あとはアセンブリでも機械語でも自分で調べて何とかしますので。

649 名前:デフォルトの名無しさん [2007/05/27(日) 06:09:24 ]
すいませんPGMファイルの読み込みの関数を作っているのですが、
im[j][i]=tempのところで落ちます。どうすればいいですか?おしえてください。
/*-------------------------------------------------------
PGMファイルの読み込みの関数
--------------------------------------------------------*/
int** read_PGM( FILE *fp, int *pw, int *ph){


int **im;

int i, j;
int temp, bright;


printf ("PGMの読み込み開始\n");

/*----------------------
P2形式のファイルか判別
-----------------------*/

if ( fgetc(fp) != 'P' || fgetc(fp) != '2' ){

printf("このデータはP2形式PGMファイルではありません。\n");
return (NULL);

}




650 名前:デフォルトの名無しさん [2007/05/27(日) 06:10:50 ]
/*----------------------
幅のデータの読み込み
----------------------*/

if ( fscanf( fp, "%d", pw) != 1 ){

printf ("幅の読み込みに失敗しました。\n");
return (NULL);

}

printf("幅のサイズは%dです。\n", *pw );


/*----------------------
高さのデータの読み込み
----------------------*/

if ( fscanf( fp, "%d", ph) != 1 ){

printf("高さの読み込みに失敗しました。\n");
return(NULL);

}

printf("高さのサイズは%dです。\n", *ph );







651 名前:デフォルトの名無しさん [2007/05/27(日) 06:12:24 ]
/*-----------------------
輝度のデータの読み込み
-----------------------*/

if ( fscanf(fp, "%d", &bright ) != 1 ){

printf("最大輝度値の読み込みに失敗しました。\n");
return(NULL);

}

if ( bright != MAXVALUE ){

printf("最大輝度値が%dではありません。\n", MAXVALUE );
return(NULL);

}

printf("最大輝度値は%dです。\n", bright );


/*------------------------
ヘッダーの取得完了
------------------------*/

printf("ヘッダーの取得完了\n");





652 名前:デフォルトの名無しさん [2007/05/27(日) 06:14:21 ]
/*----------------------------
メモリの確保
----------------------------*/
if ( (im = (int**)malloc(sizeof(int*) * (*ph))) == NULL ) {

printf("メモリが確保できません。\n");
return (NULL);

for ( j=0; j< *ph; j++){

if( (im[j] = (int*)malloc( sizeof(int) * (*pw) )) ==NULL ){

printf("メモリを確保できません。\n");
return(NULL);

}

}

}


printf("メモリ領域が確保できました。\n");




653 名前:デフォルトの名無しさん [2007/05/27(日) 06:15:21 ]
/*-----------------------------
画像データの読み込み
-----------------------------*/

for ( j=0; j< *ph; j++ ){
for ( i=0; i< *pw; i++ ){

if ( fscanf(fp,"%d", &temp) != 1 ){

printf("画像データの取得に失敗しました。\n");
return(NULL);

}

im[j][i] = temp;

}
}

return (im);

}


654 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 08:28:39 ]
>>649
・長いソースはアップローダを使ってくれ。
・その画像ファイルにはコメントは含まれていないか?
試しにエディタで開いてみて、コメントがあるようなら削って味噌。
・そもそもなんでlibpgmでも使わないんだ?

>>648
>647でも指摘されているが、CPU側の事情で巧く動かないだけ。
(x86)アセンブラの勉強をすれば容易に解決する問題。

655 名前:644 mailto:sage [2007/05/27(日) 11:15:59 ]
>>654
了解です。
「はじめての」シリーズがアマゾンで評価高かったので見てみようかと思います。
あとは、インラインアセンブラで関数作ってその部分だけバイナリで吐き出させて
再び埋め込んでみるのもいいかもしれないです。
シェルコードの解説サイトにソースがあったので使えそうです。
スレ違いな感じですがいろいろ有難うございます。

656 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 12:40:27 ]
>>649
おそらくポインタ関係でミスってる、てことは分かるでしょ?
>>652 で im != NULL のときどうなるか考えてみ。


657 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 17:46:45 ]
>>644
EAX の上位ビットをクリアすればいけるかも

658 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 18:09:00 ]
>>644のは ret のC3がeaxレジスタにmovするときの数値で食われてるから
返ってこないんだよ。

659 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 18:24:25 ]
>>644
IMMが32bitの場合と16bitの場合を区別するために、
mov ax, 0x123
では、0x66, 0xb8, 0x23, 0x01
とプリフィックスを入れる必要があるみたい。

660 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 18:29:14 ]
まぁ厳密には関数ポインタは他のポインタと互換性があるとは限らないんだけど



661 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 18:34:14 ]
確かに…
リニアアドレスであればいいかもしれないが、
データセグメントとコードセグメントなんかに分かれてると
普通に呼び出すのは無理そう

OSのセキュリティレベルが上がってくると
またDOSのようにセグメント毎に分かれるかもしれんし

662 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 18:45:59 ]
>>660
>>661
こういうことをやる場合は16bit/32bit/64bitで分けるのは当然。
逆にそれを分けてしまえば、ポインタのサイズも
セグメントの問題もどうにでもなると思うけど…

663 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 18:47:20 ]
16bit/32bit/64bitで分けるっていうのは、
CPUの種類の話ね^^

664 名前:649 [2007/05/28(月) 09:22:00 ]
みなさん、ありがとうございます。
無事に動かすことができました。


665 名前:デフォルトの名無しさん mailto:sage [2007/05/28(月) 10:42:28 ]
クラスのコピーコンストラクタとoperator=って、
実装する処理がまったく同じになることが多いんですけど、
メンバのコピー自体はoperator=だけに書いて、

AAAA::AAAA(const AAAA& rSrc)
{
*this = rSrc;
}

とか書いて処理を合体してしまうことって
やっぱり好ましくないことですか?

666 名前:デフォルトの名無しさん mailto:sage [2007/05/28(月) 10:55:56 ]
>>665
代入と初期化は異なる演算です。
コピーコンストラクタでは初期化リストで各メンバのコピーコンストラクタを使いましょう。

667 名前:デフォルトの名無しさん mailto:age [2007/05/28(月) 11:33:02 ]
結果:Strike!

char *pszMsg = "Lucky Strike!";
char *pszHit;
[ 問 ];
printf("%s\n,pszHit");

668 名前:デフォルトの名無しさん mailto:sage [2007/05/28(月) 11:37:50 ]
最後の"はそこでいいのか

669 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 01:31:34 ]
VisualStudio2005でC++をコンパイルした実行ファイルをリバースエンジニアリングできますか?

670 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 01:37:08 ]
はい、できます。



671 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 01:47:07 ]
>>669
君には、できません><

672 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 03:10:42 ]
CLRヘッダが無いと怒られてしまいました。
どうすれば、リバースエンジニアリングできますか?

673 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 03:16:27 ]
リバースエンジニアになればリバースエンジニアリングできます!

674 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 03:20:04 ]
馬鹿にはできない不思議なリバースエンジニアリング

675 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 19:35:08 ]
逆アセンブラはできるけど、逆コンパイルはできない。

676 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 19:49:18 ]
× 逆アセンブラ
○ 逆アセンブル

× できない
○ それ的な事はできるけど、元のソースを再現できるわけではない

677 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 20:07:41 ]
ブーメラン ブーメラン

678 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 20:13:09 ]
64ビットになったらアセンブラでプログラムなんて無理だよね

679 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 20:13:48 ]
>>678
なんでやねん?

680 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 20:14:36 ]
めんどくさくない?



681 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 20:15:00 ]
>>678
ドラスティックな変化があると思っているなら、不勉強にも程がある。

682 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 20:26:26 ]
eax とかが rax とかになるだけだろ。

683 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 20:30:51 ]
歳も歳だし、新しく勉強なんてもう俺には無理だよorz
16ビットが恋しい

684 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 21:14:53 ]
逆アセでollydbg使ってる奴はいないのか?

685 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 21:49:24 ]
なんだよ

686 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 22:59:51 ]
16ビットなら人間の手足で数えられるんだな

687 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 23:39:43 ]
つーか16ビットの方がめんどうだっだろ

688 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 23:42:06 ]
だっだろ

689 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 08:45:31 ]
だっだろだっだろ

690 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 10:24:56 ]
リスクは面倒だっだ



691 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 12:59:59 ]
フリスクはよかった

692 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 13:12:08 ]
ロリスクってなんですか?ハァハァ

693 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 13:24:56 ]
ローリスクっぽい言葉の響きなのに凄くハイリスクな感じがするな。

694 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 13:27:09 ]
>>693
っ ■■■(座布団)

695 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 15:02:25 ]
なんら意味のないプログラム

void add(int)
int main(void){
add(2);
return 0;
}

void add(int x){
x=x+1;
}

これ、main関数の中のadd(2)が実行された時点で、
内部だとx==2なので2=2+1になってエラーが起こると思うんだけどおこらない。

main関数の中に
2=2+1;
ってやったらエラーが出て実行できない。

これはなぜ?教えてください

696 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 15:06:43 ]
>>695
関数へはコピー渡しだからaddを呼んだ時点で2が変数xにコピーされている。
void add(int& x) だとコンパイルエラーにならないか?

697 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 15:06:58 ]
意味がないなら、どうでもいいじゃないか。( ´∀`)

>内部だとx==2なので2=2+1になってエラーが起こると思うんだけどおこらない。
C/C++ では、引数は値渡しなので
add() 内部で x という変数が 2 になっているだけ。
add() を抜けると、+1 したはずの x は消滅。

698 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 15:08:10 ]
おいおいw

699 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 15:09:56 ]
↑誤爆スマソ

700 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 15:11:53 ]
↓自爆スマソ



701 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 15:12:26 ]
>>695
そのx=x+1;での=は、数学の授業でやるような等しいという状態を表しているものではなく、
「代入しろ」という動作の命令なのよ。

代入しろという命令だから=の左には代入できるものを書かないとエラー。
だからx=x+1;はokで2=2+1;はエラーになる。

702 名前:デフォルトの名無しさん mailto:age [2007/05/30(水) 22:14:02 ]
CかC++で、整数型のユニークなIDを作るような機能を持ったライブラリってありませんか?

703 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 22:27:11 ]
>>702
uuid

704 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 22:32:30 ]
用途が分からんと何とも言えない気がする。

705 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 23:14:46 ]
unsigned long GenerateUniqueID()
{
static unsigned long id=0;
id++;
return id;
}

706 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 23:47:21 ]
スレッドセーフじゃないな。

707 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 23:51:39 ]
unsigned long GenerateUniqueID()
{
static unsigned long id=0;
static int locked=0;

while(locked) msleep(1);
locked=1;
id++;
locked=0;
return id;
}

ミューテックス使わなきゃ駄目?

708 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 00:06:39 ]
当然なんらかの同期化機構を利用しないとダメ。
スレッドAがwhile(locked)で
"lockedの値をレジスタに取った直後に" スレッドが切り替わり
スレッドBが同様にwhile(locked)を実行したらどうなる?

あと、そのコードはstatic変数の初期化も下手すると二回以上行われるね。

709 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 00:08:51 ]
いや、、、初期化は実行時じゃ無いぞ・・・
クリティカルセクションでいいな

710 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 00:17:29 ]
ごめん。C++のつもりで書いてたわ…。



711 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 00:42:27 ]
最適化でゴッソリ消える予感

712 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 00:50:34 ]
synchronized

713 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 02:12:57 ]
C++ にあればねえ

714 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 02:16:48 ]
>>711
その点については volatile つけとけばおk

715 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 06:43:11 ]
そういう問題じゃないけどまぁいいか。

716 名前:デフォルトの名無しさん [2007/05/31(木) 08:42:34 ]
すいません、この関数って何か間違ってますか?
hairetsu2は、メモリ領域が確保してあり、srand()も関数の外で処理しています。
hairetsu2[j][i] = rand()%2のところで止まります。お願いします。
void rand_point( int **hairetsu2, int row, int line ){

int i, j;

/*** 2次配列の0or1をランダムに格納する ***/
for (j=0; j<row; j++){
for (i=0; i<(1+line); i++){

hairetsu2[j][i] = (rand()%2);

}
}

printf("2次配列にランダムに0or1を格納できました。\n");

}

717 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 09:06:05 ]
>hairetsu2は、メモリ領域が確保してあり、
どうせちゃんと確保してないに決まってる

718 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 09:06:36 ]
「止まります」?そもそもコンパイル通らんだろ。

719 名前:デフォルトの名無しさん [2007/05/31(木) 09:25:24 ]
コンパイルは通るんですよ↓メモリ確保は、次の関数で確保してます。
void securement2( int **hairetsu2 , int row , int line ){

int i, j;
/*** 2次配列の行を確保する ***/
if (( hairetsu2 = (int **)malloc( sizeof( int* ) * row )) == NULL ){
printf("2次配列のメモリ領域が確保できません。\n");
exit (1);
}
/*** 各行に得点の列を確保する ***/
for ( j=0; j<(row); j++){
if (( hairetsu2[j] = (int*)malloc( sizeof(int) * (1+line) )) == NULL ){
printf("2次配列のメモリ領域が確保できません。\n");
exit (1);
}

/*** 2次配列を0で初期化 ***/
for (j=0; j<row; j++){
for (i=0; i<(1+line); i++){
hairetsu2[j][i] = 0;
}
}
printf("2次配列のメモリ領域が確保できました。\n");
}


720 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 09:30:00 ]
>>718
根拠は?

>>717
同意。

>>716
その構造だと、メモリはとint配列[line + 1]をrow回とポインタ配列[row]だけ確保する必要があるわけだが。
その部分のコードを晒して味噌。



721 名前:デフォルトの名無しさん [2007/05/31(木) 09:30:21 ]
hairetsu2[0][0]だけが格納されて止まるみたいです。hairetsu2[1][1]も格納できないみたいです。


722 名前:720 mailto:sage [2007/05/31(木) 09:32:01 ]
>>719
あーすまん、やってたのね。
で、止まるってのは具体的にどうなると?

723 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 09:32:23 ]
>>719
確かにメモリ確保はできてるようだけど、
hairetsu2 をそのまま使うことは出来ない。
変数 hairetsu2 は関数 securement2 を終えた時点で使用不能

724 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 09:33:06 ]
void securement2( int **hairetsu2 , int row , int line ){

void securement2( int ***hairetsu2 , int row , int line ){

または

void securement2( int **hairetsu2 , int row , int line ){

int **securement2( int row , int line ){
int **hairetsu2;

printf("2次配列のメモリ領域が確保できました。\n");

printf("2次配列のメモリ領域が確保できました。\n");
return hairetsu2;

725 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 09:44:15 ]
2次元配列も連続した領域である必要があるんだよ。
その配列のアクセスの仕方をやめるか、メモリ確保を一回でやるかどっちかにせい

726 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 09:45:30 ]
>>725
ちょ…おまw

727 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 10:29:04 ]
素朴な疑問だが、>>719みたいな奴って「2次元配列」言うの?
確かに同じ形で操作出来た気はするが。

>>725
何に対するレスか非常に疑問。

728 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 10:36:01 ]
可変長二次元ぬるぽ( ´∀`)

729 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 11:31:48 ]
>>727
配列のポインタの配列。

730 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 11:47:39 ]
ttp://www.kouno.jp/home/c_faq/c6.html



731 名前:デフォルトの名無しさん [2007/05/31(木) 12:37:24 ]
windows98で
SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS);
は実行できますか?
実行するとどうなりますか?

732 名前:649 [2007/05/31(木) 13:10:14 ]
716です。ありがとうございます。ちょっと試してみます。


733 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 13:37:36 ]
>>731
MSDN読め

734 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 15:43:09 ]
>>716はダブルポインタ理解してるか?
引数にint **hairetsu2って書いてあるが、ここでダブルポインタにする必要はなにもない。
引数をダブルポインタにするには、関数内でメモリを確保して返すような場合だけだ。
ダブルポインタ=二次元配列じゃないぞ。配列は何次元になってもメモリ内の表現は連続だ。

あとrowとlineは普通どっちも行を意味する。
rowを行とするなら、列の変数名はcolumnの方がいい。

735 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 17:38:07 ]
>>707
Windows APIのInterlockedIncrementのような関数が使えれば、それを使うのが楽

736 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 17:52:17 ]
ダブルポインタってなに?

737 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 17:58:01 ]
1点決めると2点分になる人

738 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 17:58:22 ]
配列の連続性だけど、
a[3][3] で a[0][2] と a[1][0] の連続性って規格で保証されてたっけ?

739 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 18:00:11 ]
int**がダブルポインタならこれは何ポインタ?
int*************** nullpo;

740 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 18:07:56 ]
pentadecuple



741 名前:デフォルトの名無しさん [2007/05/31(木) 18:47:40 ]
>>733
読みました。2000以降と書いてありますが、98でどうなるかは書いていません。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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