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


2:1
07/05/06 15:30:35
埋めるなら次スレ建てろよなまったく

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

4:デフォルトの名無しさん
07/05/06 17:25:42
埋めたの1000だけじゃん

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

6:デフォルトの名無しさん
07/05/06 22:29:41
Javaとは違うのだよJavaとは

7:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/05/06 23:14:14
>>6
レスありがとうございます。
確かに検索してもJAVAの情報ばかりでした。
C++ではあまりしないのでしょうか。

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




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

10:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/05/06 23:48:02
いや、キミの書き方にあわせるとこうなる

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

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


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

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

URLリンク(kansai2channeler.hp.infoseek.co.jp)
このプログラムだと周期が異常に多く、何十秒にもなっていたりします。
位相が小さかったら、この場合だと大体6秒ちょっとだとおもうのですが・・・

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

15:デフォルトの名無しさん
07/05/08 09:34:21
まだ見てないけど、プロファイラとってみては

16:デフォルトの名無しさん
07/05/08 09:37:35
って実行時間じゃないのか

17:デフォルトの名無しさん
07/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
07/05/09 00:31:24
そもそも三角関数の使い方って、こんな感じでよかったものか・・・

19:デフォルトの名無しさん
07/05/09 09:31:16
size_t と uintptr_t って、違いが出る環境あるのか?

20:デフォルトの名無しさん
07/05/09 09:48:56
例えばDOSのlargeモデルは
ポインタ32bitでsize_tは16bit。

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

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


22:デフォルトの名無しさん
07/05/09 09:54:47
なるほど。

23:デフォルトの名無しさん
07/05/09 10:01:17
ファイルサイズってなぜかsize_tではないんだよな。


24:デフォルトの名無しさん
07/05/09 10:18:41
long > size_t の環境もまさに16ビット環境だな。

25:デフォルトの名無しさん
07/05/09 10:19:34
size_tを64bitの型にしなきゃいけないからね。

26:デフォルトの名無しさん
07/05/09 10:32:42
fgetpos/fsetpos の方か。

27:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/05/09 19:12:03
extern "C" はしてるの?
あとは、cc って gcc ?

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

30:デフォルトの名無しさん
07/05/09 19:22:09
foo.c の方じゃなくて、foo.h の方に必要。

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

32:27
07/05/09 19:33:48
ccはGCCです。
foo.hはいじりたくないので、

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

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

33:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/05/09 19:53:46
URLリンク(s-io.net)


35:27
07/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:デフォルトの名無しさん
07/05/09 20:23:17
F77 もあるのかw
すげーチャンポンだな。

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

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

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

38:デフォルトの名無しさん
07/05/09 23:30:46
STLのmapのeraseなんだけど

size_type erase(const key_type& x)

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

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

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

42:デフォルトの名無しさん
07/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
07/05/10 01:43:10
>>40
レスありがとうございます。
参考にさせていただきます。

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

45:デフォルトの名無しさん
07/05/10 11:13:12
リテラルの意味が分かってるんだろうか

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

47:デフォルトの名無しさん
07/05/10 22:01:06
環境:タブ幅4, XP, bcc5.5.1, Cpad

猫でもわかるプログラミング / C言語編 第1部 /
 第69章 URLリンク(www.kumei.ne.jp)
 第70章 URLリンク(www.kumei.ne.jp)

第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:デフォルトの名無しさん
07/05/10 22:01:48
入力した"A1","A2"に何が入っているか調べるため
    printf("そこには置けません!  %d,%d", row, col);
とすると、(0,0)、(0,1) となり問題は無いはずなのですが
何処を直したら良いのかわかりません。第70章、第71章をコピペしても同様な状態です。
ソースどす
URLリンク(kansai2channeler.hp.infoseek.co.jp)

以下のsけいしさんのサイトではチェックされていませんでした。
 sけいし発のホームページたち / DevC++でC++入門
 URLリンク(skeishi.web.fc2.com)

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

49:デフォルトの名無しさん
07/05/11 00:09:56
惜しい、猫の話じゃなければ相談に乗るんだが。

50:デフォルトの名無しさん
07/05/11 00:10:27
>>42
つ[XLibスレ]

51:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/05/11 20:42:31
>>52
> B b = A().a();
では B(const A&) というコンストラクタが呼ばれる事になる。
だから、それを作る必要がある。

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


55:デフォルトの名無しさん
07/05/11 20:58:34
情報が足りないんだから当たり前じゃ。

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

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

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

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

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

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

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

62:デフォルトの名無しさん
07/05/12 00:29:52
爪楊枝でとる

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

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

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

64:デフォルトの名無しさん
07/05/12 00:36:25
優先順位。

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

65:デフォルトの名無しさん
07/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
07/05/12 01:02:07
>>64
>>65

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

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

こう書けばわかるか?

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

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

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

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

71:デフォルトの名無しさん
07/05/12 14:52:41
sprintf使ってみ

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

74:デフォルトの名無しさん
07/05/13 09:14:28
wstringでも使っとけ

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

76:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/05/13 15:26:54
>>76
速度は実測が基本。

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

78:デフォルトの名無しさん
07/05/13 15:27:45
>>75 スコープ解決演算子

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

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

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

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


82:デフォルトの名無しさん
07/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
07/05/13 20:31:18
簡略化して書くときに書き間違えました。
実際には、int aはstaticになっていて、
Foo.cxxの中で定義されてます。

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

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

intt?

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

86:82
07/05/13 20:40:11
>>84
あー、なるほど。そういうことですか。

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

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

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

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

89:82
07/05/13 21:00:52
本当に申し訳ございませんでした。
皆さん、ありがとうございます。

90:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/05/13 22:11:23
んんん?問題なくね?

93:デフォルトの名無しさん
07/05/13 22:17:37
... = (enemy*)malloc( ...


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

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

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

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

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

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

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

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


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

100:デフォルトの名無しさん
07/05/14 12:50:17
asdf<int (int)> a;

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

101:デフォルトの名無しさん
07/05/14 12:53:32
boost::function

102:デフォルトの名無しさん
07/05/14 12:54:17
なるほど

103:デフォルトの名無しさん
07/05/14 13:00:06
asdf<int (*)(int)> a;

のことか?

104:デフォルトの名無しさん
07/05/14 13:03:15
なんだと

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

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

107:デフォルトの名無しさん
07/05/14 15:00:45
どっちでも良くないよw

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

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

108:デフォルトの名無しさん
07/05/14 15:11:06
インクルードガードやってたから気づかなかった

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

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

111:デフォルトの名無しさん
07/05/14 15:18:54
と、思ったがなるな。スマン

112:105
07/05/14 15:23:06
そうですね。勉強になりました。
ありがとうございました。

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

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

114:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/05/14 17:06:20
>>114
重複インクルードが問題なのではなく、同じ関数が複数リンクされることが問題。
理解できていないなら、無理にレスしなくていいからね。

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

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

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

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

119:≠114
07/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:デフォルトの名無しさん
07/05/14 17:53:03
それだとa.cでfuncが使いたいときに困るだろ。

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

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

122:デフォルトの名無しさん
07/05/14 17:55:50
すみません、喧嘩しないで頂けますか?

123:デフォルトの名無しさん
07/05/14 17:56:24
>>121
分からなくても別に誤魔化さなくていいよ。
俺だって分かんないんだもん。

124:デフォルトの名無しさん
07/05/14 17:58:28
まだわからんか?
そもそも”関数名”て何や?

125:デフォルトの名無しさん
07/05/14 17:58:51
まさかstaticを付けるというオチでは・・・

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

127:デフォルトの名無しさん
07/05/14 18:00:37
#define foo
↑で foo は何をされとんねん?


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

129:デフォルトの名無しさん
07/05/14 18:01:33
>>127
焦らさないでくれよ

130:デフォルトの名無しさん
07/05/14 18:01:36
当たり前だのクラッカ


131:デフォルトの名無しさん
07/05/14 18:02:38
もったいぶっちゃって、どうせそんな方法ないんだろ・・・

132:デフォルトの名無しさん
07/05/14 18:05:42
void foo ( なんたらこたら


void bar (ああでもこうでも

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


これでもわからんか?


133:デフォルトの名無しさん
07/05/14 18:07:29
void foo ( なんたらこたら

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

これではどや?


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

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

135:デフォルトの名無しさん
07/05/14 18:08:47
訂正
誤:int foo ( ああでもないこでもない
正:int foo ( ああでもないこうでもない


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

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

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

139:デフォルトの名無しさん
07/05/14 18:17:24
もはやCじゃないがな

140:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/05/14 18:23:16
只今>>133は>134を読んで真っ青になっている最中です。
次の御託を思い付くまでもう暫くお待ちください。

142:デフォルトの名無しさん
07/05/14 18:23:51
↑アホ

143:デフォルトの名無しさん
07/05/14 18:30:33
>>137
URLリンク(sund1.sakura.ne.jp)

144:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/05/14 18:34:23
>>140
testなんかどこで#defineしてるの?

146:デフォルトの名無しさん
07/05/14 18:35:01
test は何回定義されとるん?アセブルリスト見てみ?


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

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

149:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/05/14 18:41:22
つまり、関西弁のような発言に見えるからと言って、関西人だと決めつけるな、ということですね?


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

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

153:デフォルトの名無しさん
07/05/14 18:43:09
ようするにはったりだったわけだろ

154:デフォルトの名無しさん
07/05/14 18:44:08
違うやろ、call _test のアドレス見れ

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

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

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

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

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

159:155
07/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:デフォルトの名無しさん
07/05/14 19:05:13
>>159
コンソールで確認するなよ・・・

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


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

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

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

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

165:155
07/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
07/05/14 19:13:53
>>164
ああ、octで解釈されてるわけですか。
なるほど。



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

168:54
07/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:デフォルトの名無しさん
07/05/14 22:21:23
うん、けっこう愚かしいと思うよ…。

170:デフォルトの名無しさん
07/05/14 22:25:34
>>168が理解できない
どこでB&を戻してるの?

171:デフォルトの名無しさん
07/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
07/05/14 22:30:14
すまん
168のgetaも仮想関数だと思い込んでいたorz

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

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

class Class1
public 以下略

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

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

175:54
07/05/14 22:58:24
>>171
なるほど。そのとおりでした。
サンクス。

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

177:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/05/15 03:35:58
*thisをthisにしてVC2003でコンパイル

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

179:デフォルトの名無しさん
07/05/15 18:49:47
VS2005,XPです。

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

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



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

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

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


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

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

184:デフォルトの名無しさん
07/05/15 19:40:06
>>183
サンクス!!!

185:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/05/15 20:02:53
>>179
何をしたいのか分からんが、使える。

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

188:デフォルトの名無しさん
07/05/15 20:10:51
移植性が欲しいならunsigned intにしておけ

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

190:デフォルトの名無しさん
07/05/15 20:13:25
ビットフィールドに使えるのはsignedかunsignedのintだけ。

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

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

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

194:デフォルトの名無しさん
07/05/15 20:22:42
C++ならほとんどの整数型が使えるだろ。

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

196:デフォルトの名無しさん
07/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++だと違う結果になったが。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4896日前に更新/189 KB
担当:undef