スレを勃てるまでもないC/C++の質問はここで 8 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
09/03/02 00:36:19
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ
スレを勃てるまでもないC/C++の質問はここで
スレリンク(tech板)
スレを勃てるまでもないC/C++の質問はここで 2
スレリンク(tech板)
スレを勃てるまでもないC/C++の質問はここで 3
スレリンク(tech板)
スレを勃てるまでもないC/C++の質問はここで 4
スレリンク(tech板)
スレを勃てるまでもないC/C++の質問はここで 5
スレリンク(tech板)
スレを勃てるまでもないC/C++の質問はここで 6
スレリンク(tech板)
スレを勃てるまでもないC/C++の質問はここで 7
スレリンク(tech板)

2:デフォルトの名無しさん
09/03/02 00:39:37
janeの隠し機能

1.書き込みウィンドウを出し半角入力に切り替える
2.Wキーを押しっぱなしにする
3.Wキを押しっぱなしにしながらsageのチェックするところをおもむろにクリック


3:デフォルトの名無しさん
09/03/02 00:40:06
36年間悩んでます。お力をお貸しください。

PSのアークザラッドUというタイトルのゲームの、ゲーム画像(歩行画像など)を抽出したいのですが、
かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。

◆試してダメだったこと

 ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
 (ちなみに他のゲームはほとんど抽出可能)

◆教わったこと

 ・アークザラッドUは独自の画像形式を使っているから抽出できない。
 ・PS上で表示されてるということは絶対に摘出はできるはず。
 ・URLリンク(www.gradius2.com)

◆抽出は不可能ではないということを知ったとき

 2ちゃんねるで質問したところ、
 ある方が実際にキャラクターの歩行画像を抽出して
 私が立てたスレにアップしてくださいました。

スクリーンショットじゃダメなんです。どうか皆さん、お力をお貸しください。お礼は絶対にします。

4:デフォルトの名無しさん
09/03/02 00:40:12
>前スレ997
お前はあんなことのために2^32バイトだか2^64バイトだかの配列を確保するのか?
バカだろ?

5:デフォルトの名無しさん
09/03/02 00:41:28
テンプレートの使い方で分からないんだけど、
template <typename T>
class Myclass
{
public:
T mem;
//他、Tを使ったメンバ関数・メンバ変数が多数
int foo(int x){std::cout << x << std::endl;return x;}
double foo(double x){std::cout << x << std::endl;return x;};
unsigned long foo(unsigned long x){std::cout << x << std::endl;return x;};
};
のようなクラスがあって、呼び出すときは
Myclass<char> hoge;
hoge.foo((int)-1);
hoge.foo((double)3.14);
hoge.foo((unsigned long)42);
のように使っている状況。
で、この3つのfooをテンプレートにしてまとめたいんだけど、どうすりゃいいかね??
template <typename T,typename U>
class Myclass
{//〜〜};
とは意味合いが違うじゃん。。。

6:デフォルトの名無しさん
09/03/02 00:44:32
>>1
乙。

7:デフォルトの名無しさん
09/03/02 00:46:14
>>1
乙彼。
あと>>5はかわいそうな人による釣りだから皆様 無視してくださってかまいません。


8:デフォルトの名無しさん
09/03/02 00:49:39
>>1







9:デフォルトの名無しさん
09/03/02 00:55:15
>>5 に対して複雑怪奇な提案したいけど思いつかない。。。

10:デフォルトの名無しさん
09/03/02 01:03:32
>>4
状況にもよるが全然ありだろ
大規模なNUMAマシンとかならおそらく最速だ
マルチスレッドにもしやすいしな

11:デフォルトの名無しさん
09/03/02 01:05:16
>>4
草ついてないとこを見ると……もしかして天然?
だとしたら痛いぞ。

12:デフォルトの名無しさん
09/03/02 01:08:59
メモリのことより比較する配列がある程度長くないと、素直にやるより遅くならない?

13:デフォルトの名無しさん
09/03/02 01:21:17
いや、まずその「素直」を提案せな。……というだけだとさみしいんで提案。

a1[0]を仮の共通要素とおく。
aM(Mは1-5)について仮値以上になるまで添え字インクリメント。
->越えたらその値を仮値としてM=1からやりなおし。
->同値なら次のMへ。M>5なら仮値を共通値として保持。保持した共通値を超えるまでa1の添え字をインクリメントし、その要素を仮値とする。
いずれかの添え字が範囲外になったら終了。

これよりはint分配列確保の方が、計算量は少ないな(終了条件が早期に成立した場合は別)。
a1-a4はインクリメントのみ。a5は比較のみ(インクリメントは不要)で済む。

14:12
09/03/02 01:26:31
前スレでそもそもの質問者が出したやつのことな

>>13
変に凝ってばかみたいだね

15:デフォルトの名無しさん
09/03/02 01:41:12
最終的にサイズUNIT_MAXの配列をひと舐めするワケだしな

16:デフォルトの名無しさん
09/03/02 02:14:44
両方の最大最少値から if 条件を最適化する位しか思いつかんね

17:デフォルトの名無しさん
09/03/02 02:17:01
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

18:デフォルトの名無しさん
09/03/02 02:22:38
可変長引数のコンストラクタを持つクラスの継承を行いたいのですが、引数の受け渡しがうまくいきません。

class hoge{
  hoge(int i,...);
}

class piyo:public hoge{
  piyo(int i,...):hoge(ここが分からない){
    〜
  }
}

上記のような感じです、
hogeのコンストラクタを丸々コピーする以外に何か方法があればご教授お願いします。

19:デフォルトの名無しさん
09/03/02 07:05:32
>>15
氏んでEYo!

20:デフォルトの名無しさん
09/03/02 08:16:00
>>19
死ね

21:デフォルトの名無しさん
09/03/02 08:21:52
>>12
素直なやり方を書いて実際に比較してみたら?
っていうか、あんたの言う素直なやり方ってどんなのか、ソースあげてみてよ。

22:デフォルトの名無しさん
09/03/02 08:26:06
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

23:デフォルトの名無しさん
09/03/02 08:42:05
>>18
そんな事してねーで孝三隊のポインタに氏たら?

24:デフォルトの名無しさん
09/03/02 09:17:58
>>18
piyoてなにおまえ? ふざけてんの? ヒヨコなの?

25:デフォルトの名無しさん
09/03/02 09:24:52
うん

26:デフォルトの名無しさん
09/03/02 10:33:34
ここはいつからこんなクソスレになった?

27:デフォルトの名無しさん
09/03/02 12:08:47
>>18
テンプレート構造体つかえ。

28:デフォルトの名無しさん
09/03/02 12:42:39
>>18
可変長の引数は止めたほうがいい。
オブジェクトを作って渡す様にしたほうがいい。

29:デフォルトの名無しさん
09/03/02 19:10:19
可変長の引数はやめたほうがいい…誰かがそんなこといってたな。

30:デフォルトの名無しさん
09/03/02 20:07:51
template<typename T, int len>class A{
T (&X)[len];
public:
A(T(&x)[len]): X(x){};
};

int B[10];
A<int, 10> B(b); // error:b is not a type

オレ何勘違いしてるか教えてくれ。

31:デフォルトの名無しさん
09/03/02 20:09:35
訂正。
A<int, 10> a(B); // error:b is not a type

32:デフォルトの名無しさん
09/03/02 20:22:50
>>30
通った。 VC9, gcc4.3.2

33:デフォルトの名無しさん
09/03/02 20:33:06
あのぅ、
あるクラスがlistとそのlistのカレント要素をメンバでもつ場合、
カレント要素をiteratorにするのは好ましいでしょうか?
好ましくない場合どのようにカレント要素を
持つのが一般的でしょうか?

34:デフォルトの名無しさん
09/03/02 20:35:53
ちなみにそのlistは途中でaddやdeleteされる場合があります

35:30
09/03/02 20:51:55
class C{
int B[10];
A<int, 10> a(B); // error:B is not a type
};

・・・ 当然ですな 疲れてるようだから寝ます。

36:デフォルトの名無しさん
09/03/03 01:22:51
キーボードから文字を入力する際、scanfはなるべく使わないほうが良いのですか?
参考書ごとに違いが有って、scanfを使用するものもありましたが中には
int c
c = getchar()
で一文字ずつ入力させるプログラムがありましたがどちらの方が良いのでしょうか

37:デフォルトの名無しさん
09/03/03 01:26:04
そんなことも理解できないヤツがプログラムなんてやるな。自明だろ

38:デフォルトの名無しさん
09/03/03 02:14:02
答えることができない奴ほど自明なんて言うよな

39:デフォルトの名無しさん
09/03/03 02:23:35
>>36
scanfをあまり使わないほうがいいとは思うが、理由を知らないと意味が無い類のものなので
調べてください

40:デフォルトの名無しさん
09/03/03 04:05:36
>>36
case by case

41:デフォルトの名無しさん
09/03/03 06:13:07
>>36
参考書による違いは、参考書を読まないと判らない。
何故なら、getchar()でやる方法を練習のために示す本もあるから。
scanf()は万能ではないし問題点もあるから使わないに越したことはないが、
だからと言って取り敢えず使うためのプログラムにgetchar()で作るのは愚。
まぁ、余程のことがない限り、fgets()(+sscanf()かatoi()かstrtol()か)で事が足りる。
# そして、余程のときはやはりgetchar()では事が足りないので環境依存の方法が必要。

42:デフォルトの名無しさん
09/03/03 12:26:07
>>39-41
ありがとうございました

43:デフォルトの名無しさん
09/03/03 12:30:08
>>36
scanfにはちゃんとバッファオーバーフローさせない方法もあるから
その点を理解して正しく使う分には問題ないよ。
実際scanfは便利。

44:デフォルトの名無しさん
09/03/03 12:38:13
>>38=>>36 ?

45:デフォルトの名無しさん
09/03/03 21:21:53
おまいらscanfなんてどうでもいいから早く>>33を誰か答えろ
ここにはscanfしか語れない初心者しかいねぇのかYO

46:デフォルトの名無しさん
09/03/03 21:44:23
カレント要素って何?

47:デフォルトの名無しさん
09/03/03 21:46:48
33はC++よりも日本語をまず勉強すべきだと思う

48:デフォルトの名無しさん
09/03/03 22:07:53
エスパーすると

リストの内部イテレータが外部インターフェースに対してスタティックに成るけど
オレ様の用途に十分かどうか教えてくれ。

と 33 は問いかけてると読む。

49:33
09/03/03 22:37:54
>>48
その通り。君はプロだ。やっぱプロは違うなぁ

で見解は?

>>46>>47
チミたち、C++ならいたての学生には用はないのだよ
気安くレスしないでくれ

50:デフォルトの名無しさん
09/03/03 22:40:10
そのlistが最早更新されないのならiteratorで医院で内科医?

51:デフォルトの名無しさん
09/03/04 00:40:04
とある関数のソースで、
void test(char yui,...) とある場合、...の意味するものはなんでしょうか?

52:デフォルトの名無しさん
09/03/04 00:41:47
可変引数リスト

va_start、va_end、va_arg
URLリンク(www.geocities.co.jp)

53:デフォルトの名無しさん
09/03/04 05:28:00
char str[MAX_PATH];
memset(str, `\0`, MAX_PATH);
lstrcpy(str, ゙53゙);

if(str[0]==`5`)
{
MessageBox(hWnd,゙ウンコ―(・∀・)゙,゙今夜のメニュー゙,MB_OK|MB_ICONHAND);
}
else
{
MessageBox(hWnd,゙チンコ―(・∀・)゙,゙今夜のメニュー゙,MB_OK|MB_ICONHAND);
}

今夜のメニューがウンコ―になるためには、
if(str[0]==0x52)のようにしなきゃ駄目ですか

54:デフォルトの名無しさん
09/03/04 07:11:26
lstrcpyをstrcpyにしてみては?

55:51
09/03/04 07:14:51
>>52
そのリンク先で、myfunc( "test" , 100 );とよびだされた場合、
"test"というのはどう扱われるのでしょうか?

56:デフォルトの名無しさん
09/03/04 07:23:32
>>55
URLリンク(www.geocities.jp)
なるたけ単純な具体例のあるページ


57:デフォルトの名無しさん
09/03/04 07:43:01
>>55
そこは引数の数があってないので参考にするな
ちなみに"test"は引数の開始位置を得るだけにしか使われていない


58:デフォルトの名無しさん
09/03/04 08:16:17
>>55
...の直前の引数(va_startの第2引数)に入る。

59:デフォルトの名無しさん
09/03/04 08:49:08
>>37
そんなことに、まともに答えられないお前もどうかと

60:デフォルトの名無しさん
09/03/04 11:01:27
指定したディレクトリ以下のファイル、ディレクトリをすべて
取得するような関数ないでしょうか?

61:デフォルトの名無しさん
09/03/04 11:02:42
opendir readdir

62:デフォルトの名無しさん
09/03/04 11:32:24
>>60
環境依存

63:デフォルトの名無しさん
09/03/04 12:02:15
>>62


64:デフォルトの名無しさん
09/03/04 12:10:11
多数の変数を単なるバイト列にその場でパックする方法で質問です。
通常なら

 uint8_t buff[1024]; memcpy(buff, var1, sizeof(var1); ...
 callfunc(buff);

などするか、

 struct { var1_t a; var2_t b; ... } buff = { var1, var2, ... };
 callfunc(&buff);

とすると思いますが、両者ともサイズ計算とか型情報をその場に
書く必要があり、長いこともあり簡潔にできないかなと考えています。

実はgcc拡張ですらない、環境依存な挙動レベルでは

 uint8_t *buff = (uint8_t *)&(struct {}){ var1, var2, ... };

というのが動いたりして、ソース記述としては一番気に入っているのですが、
当然使えません。そこで質問ですが、これくらい簡潔(冗長な情報を
書かずに済ませられる)に書け、さらにせめて実装別の拡張程度で済ませられる
バイト列へのパッキング方法ってないでしょうか?

65:デフォルトの名無しさん
09/03/04 12:25:13
struct buff{buff, ite};
テンプレート関数(&buff, T) {memcpy(buf, ite, sizeof(T))〜; buf.ite+sizeof(t); return &buf}

66:デフォルトの名無しさん
09/03/04 12:45:58
C++が使えるならテンプレート引数の類推かね
でもなんとなくCに見える

class Pack
{
char buff_[1024];
int size_;
public:
Pack() : size_(0) {}
operator char const *(){ return buff_; }
int size(){ return size_; }
template<class T> friend Pack &operator <<(Pack &pack, T t)
{
memcpy(pack.buff_ + pack.size_, &t, sizeof(T));
pack.size_ += sizeof(T);
}
};
// Pack p; p << val1 << val2 << val3;

67:デフォルトの名無しさん
09/03/04 12:57:41
struct<T, l> BI{ T &buff[l]; ite};
BI& <T>push(BI&, T&){ memcpy(if(BI.ite + sizeof(T) < sizeof(Bi.buff))BI.buff[ite], T, sizeof(T)); BI.ite += sizeof(T); return BI}

int buff[99];
BI<int, 99> b = { buff, 0};
b = push(b, Z) = push(b, Y) = push(b, X);

68:デフォルトの名無しさん
09/03/04 13:44:38
構造体のコンストラクタでは駄目なの?

69:64
09/03/04 20:18:52
すみません、言語はCなのでなかなかうまいのがないですね・・・

とりあえず

memcpy方式
-> オフセット計算が煩雑だし、エンディアン変換でさらに冗長になるので却下

struct方式
-> 型情報と構造定義と代入側の順序をメンテするのが面倒だが、
  型チェックもしてくれるだろうしこれが妥当か・・・

sprintf方式(mprintf(buf, "NVc", v1, v2, v3) みたいなのを自分で作る)
-> 一番見通しがいいけど、型チェックが不可になる

という感じに考えが行きつつあります。具体的なコードだと

 #define T(n) typeof(n) _ ## n /* require gcc */
 void myfunc(uint8_t a, uint32_t b) {
   typedef struct __attribute__((packed)) { T(a); T(b) } in_t;
   nextcall((uint8_t *)&(in_t){ a, htonl(b) });

みたいな感じです。が、やってみると型チェックしてくれないので、まだ悩み中。


70:デフォルトの名無しさん
09/03/04 20:23:15
C言語のソースをJavaなどへの移植性が向上するようにコードを修正してくれるツールは無いでしょうか?

たとえば以下のようなコードがあった場合
int a;
if(a){

int a;
if(a != 0){ //
と変更したり、
boolean c()
{
int r = 0;

return r;
}

boolean c()
{
int r = 0;

return (r != 0);
}

する。

71:デフォルトの名無しさん
09/03/04 20:27:21
正規表現でどうとでもなるんじゃね?

72:デフォルトの名無しさん
09/03/04 20:42:14
>>69
扱う型の種類、パックする環境、アンパックする環境、を可能な限り詳しく教えて下さい。

特になぜエンディアンが問題になるのか解るように。

73:70
09/03/04 20:58:04
変数の型を調べる必要があるので正規表現では無理なような気がします。
boolean a;
if(a)
{
とか
boolean c()
{
boolean r = 0;

 return r;
}
の場合は修正の必要は無いです。

74:デフォルトの名無しさん
09/03/04 21:04:05
そもそもC標準にbooleanなんて型はない

75:デフォルトの名無しさん
09/03/04 21:13:52
>>72
char 配列 可変長要素 エンディアン とくれば UTF-8 系の処理だろうな

76:64
09/03/05 00:32:45
>>72
いまCodeWarriorっていうIDEのOSSなプラグインを改造して、WIN(VC++)+UNIX(gcc)で
使えるツールに仕立てようとしています。機能は組み込み開発用デバッグアダプタの
USB越しのコマンド制御で、レジスタ読んだりMCUステップ実行させたりします。

扱う型自体はu?int(8|16|32)_t(かそれをtypedefした/enumで結果的にいずれかに
落ちた)型だけです。パック・アンパックはホスト側でだけですが、ターゲットのエンディアンは
MCUで異なるのと、ホストもx86以外もあるのでhtonlなどの他、htoll(host-to-littelong)
なども用意して使っています。

memcpyだとエンディアン変換で面倒云々は

 myfunc(uint32_t hoge) {
    hoge = htoll(hoge);
    memcpy(buff, &hoge, 4)

などアドレス取るために行数が倍になるという話です。ここは一行にまとめて書けるstructや
パッキング関数に渡す方法のほうがすっきりします。

既に一度ざっと移植したのですが、元ソースが

 *(unsigned int *)(data + 2) = hogehoge;
 data[6] = hoge;
 *(unsigned char *)(data + 7) = fugafuga & 0xFF;

とかややぐちゃっとしてるので、もっとすっきりとUSBで流し込むバイト列の生成が
できないかなぁと質問してみました。まあせいぜいコマンド1つあたり5変数程度
パックするだけなんで、大問題というより途中から面白くなってきたのでやってるのですが。

77:64
09/03/05 00:42:26
>>69 で型チェックしてくれないというのは間違いで、gccではオプションが漏れてました。

 gcc -pedantic --std=(gnu|c)99 -Wall -Wextra -Werror -Wconversion

でいけた(-Wconversionがチェック用)ので、今のところstruct方式がエレガントかなぁと。

いまはVC++で使える方法を探してます。こっちはC++なんで、元のキャスト代入方式より
簡潔にはしたいですが、もっと色々とできそう。typeof/decltypeを見つけて小躍りしましたが、
これはVC++では使えないのですね・・・

78:デフォルトの名無しさん
09/03/05 00:58:00
>>76
ターゲットのMCUによってエンディアンが異なるなら、
memcpyだけではなく、structでも、自作sprintfでも、要素ごとにエンディアンの変換は必要ではないですか?

なぜmemcpyでだけエンディアン変換が問題になるのでしょうか。

79:デフォルトの名無しさん
09/03/05 01:01:42
memcpy(buff, &hoge, 4);は*(uint32_t*)buff = hogeに機械的に書き換えられると思う。

80:64
09/03/05 01:22:25
>>78
もちろんそうですが、memcpyベースだと2つの文になります。
引数やstructの中なら横に{ htons(v1), htonl(v2), v3, ...} と}羅列できるので、
やや行数的にお得かなと気持ちが傾いてます。

>>79
はい、元コードがキャスト方式です。ただ、キャストとmemcpyは書き込み先バッファの
オフセット位置を明示的に調節する必要があるので、「とりあえず変数を並べると
よろしくパッキングされる」みたいにできないかなぁと。

まあベタに書いてく元コードでいいじゃん?てな気もする程度の問題ですが、
色々方法がありそうで面白いので深追いしてみようかなと。


81:デフォルトの名無しさん
09/03/05 07:36:42
>>80
重要なのはソースの行数だけですか?
(1)ソースの行数、(2)ソースの文字数、(3)ソースの可読性、(4)オブジェクトのサイズに優先順位を付けるとどうなりますか?

82:デフォルトの名無しさん
09/03/05 08:35:55
ドメストがおすすめ

83:64
09/03/05 09:18:13
>>81
各項目での自分的評価だと、こんな感じです(1が最も短い・速い・わかりやすい・etc):

cast: 3321
標準的な記法で、外部知識を要しない。オブジェクトサイズも最小。ただ、キャストの嵐が目に
やさしくない(マクロで対処は可能)のとオフセット計算が間違えやすい。パックされた構造の把握は
縦に読む必要がある。縦の行数はパック対象変数分程度。バッファコピーが必要になるとmemcpyが必要。

 例: *(uint32_t *)(dst + 4) = (uint32_t)htonl(src); <- これがN行続く

memcpy: 4211
標準関数なので、外部知識を要さず、サイズも呼び出しのみで小さい。キャストも不要。
オフセット計算は必要で、転送データ構造のイメージは縦に読んで把握する必要がある。
縦の行数は最大で対象変数の数+エンディアン変換数程度で最大。

 例: src = htonl(src); memcpy(dst + 4, &src, sizeof(src));  <- これがN行続く

struct: 2222
外部知識は要しないが、一般性で劣る。サイズはキャスト方式と同等か、スタック消費分劣る。
オフセット計算が不要で、構造イメージは横に並んだ順そのままで把握はしやすい。しかし、
構造定義が長くなりがちで、変数の使用位置から離れるとズレやすいかも。バッファコピーが必要に
なるとmemcpyが必要。

 例: struct { uint32_t _a; uint8_t _b, ... } buf = { htonl(src1), htonl(src2), ... }; <- スタック利用
  or typedef struct { uint32_t _a; uint8_t _b, ... } in_t;
    *(int_t *)(buf + 4) = { htonl(src1), htonl(src2), ... }; <- 既存バッファへの書き込み

mprintf: 1113
フォーマット表記の知識を得る必要があるが、処理部分のコードはかなり簡潔にデータ構造を
表現・理解できる。ただし、mprintfの実装分、メモリと処理速度で劣る。処理の中身はmemcpy。

 例: mprintf(buf + 4, "NN...", src1, src2, ...);

84:デフォルトの名無しさん
09/03/05 10:58:37
Cを勉強しているのですが
虚数を含んだ計算式を作る必要があるのですが
色々調べたところ、<complex.h>をインクルードすると
虚数iを大文字Iとしてプログラムを書くことで虚数を扱える、とあったのですが
下のようなビルドエラーが出てしまいます(complex.hが無い、という意味か?)。

fatal error C1083: include ファイルを開けません。'complex.h': No such file or directory

ちなみに、VC++2008を使って勉強していますが
ソース自体はCの文法で書いています。
webでも色々調べたんですが、解決方法は見つからず・・・どなたか助言下さい。

85:デフォルトの名無しさん
09/03/05 11:24:30
>>84
C++用の
<complex>
ならあるみたい


86:デフォルトの名無しさん
09/03/05 11:51:19
複素数は C99 からなので、手元のコンパイラが対応していなくても泣いちゃだめ。

87:デフォルトの名無しさん
09/03/05 14:58:34
printf("ロベール先生の第27章から忌み不明になってきた");

88:デフォルトの名無しさん
09/03/05 15:58:16
#include <iostream>
using namespace std;
#include <math.h>

#define FNC void fnc();

FNC;
int main()
{
fnc();
return 0;
}

FNC
{
cout<<"FOFOOFOF"<<endl;
}


どこが間違っているんでしょうか?

89:デフォルトの名無しさん
09/03/05 16:01:21
#define FNC void fnc()

セミコロン入れたらダメじゃね? 知らんけど。

90:デフォルトの名無しさん
09/03/05 16:04:49
>>89
ハイパーサンクス

91:デフォルトの名無しさん
09/03/05 18:27:57
>>84
そんな事に手間取るくらいなら自前で作った方が早いだろ。

加減算、乗算は一瞬でしょ。
割り算は意味わからなくても公式で一発だし。

92:デフォルトの名無しさん
09/03/05 18:31:38
>>83
fputcの要領で、16ビットや32ビットなど必要なものを
(中身はエンディアン変換とfwriteを使い)自分で関数を作っていくのはどう?
と思ったが、VC++だとfmemopenがないから駄目だよな。

93:デフォルトの名無しさん
09/03/05 18:45:46
>>84
適当に探せば外部のライブラリがありそうじゃない?
それでしのいでいるうちに猛勉強してC++も使えるようになれればおk。…無茶か?

94:デフォルトの名無しさん
09/03/05 19:15:15
try catchをnew以外に使えてない素人なんだけど、try catchってほかにどんなときに使うの?

95:デフォルトの名無しさん
09/03/05 19:31:37
例外をキャッチするときに使う。キャッチしたい例外がないなら別に使わなくても良い。

「自分で書くコードが、どんなときに例外をスローすべきなのか」
となると別の話になるけど。そういうことが聞きたいの?

96:デフォルトの名無しさん
09/03/05 19:40:34
h = FindFirstFile( path, &data );
で FindFirstFile( )関数の失敗した値
INVALID_HANDLE_VALUE
が返ってきた時
if( INVALID_HANDLE_VALUE == h )
{
FindClose(h);
}
ってやるんだけど 失敗したときのハンドル値で FindClose() していいの?
失敗してるこの場合 FindClose() はいらないの?

97:デフォルトの名無しさん
09/03/05 19:47:00
>>96
していい。
URLリンク(msdn.microsoft.com)

98:デフォルトの名無しさん
09/03/05 19:48:43
ごめん。間違えた。
いらなかった。

99:デフォルトの名無しさん
09/03/05 19:49:18
ごめん。間違えた。
いらなかった。

100:デフォルトの名無しさん
09/03/05 20:00:59
ごめん。間違えた。
助かった。

101:デフォルトの名無しさん
09/03/05 22:29:35
構造体の中に、別の構造体のポインタがあるとして、そのポインタが
指し示すアドレスから、そのデータ型の構造体が連続して配置されている場合、
n番目のデータにアクセスしたい場合、どうしたら良いでしょうか。(下記サンプル参照)

typedef struct {
unsigned char test1;
unsigned char test2;
} Test_set1;

typedef struct {
unsigned short test3;
unsigned short test4;
} Test_set2;

typedef struct {
Test_set1* test5;
Test_set2* test6;
} Test_all;

volatile const Test_all Test_struct = {
(Test_set1*)0x3FFFFFA0,
(Test_set2*)0x3FFFFFB0 ←メモリ上では、Test_set2型がn個連なっている。
};

void Test_func(unsigned char index){
unsigned short tmp1, tmp2;
tmp1 = Test_struct.test6->test3;
tmp2 = Test_struct.test6[index]->test3; ←コレはダメぽい・・・
}

やっぱポインタを任意回数インクリメントか、indexを足すしかないでしょうか?

102:デフォルトの名無しさん
09/03/05 22:34:24
tmp2 = Test_struct.test6[index].test3;

103:101
09/03/05 22:54:33
>>102

おぉ・・・・・素早いレスありがとうございます。
確かにコンパイル出来るようですっ! 明日アセンブラで狙ったところに
アクセスしているか確認してみます。

この場合、test6 はポインタですが、Test_struct.test6[index] と書くと、Test_set2型の
RAM扱いになるんでしょうか?(ショボイ質問ですいません)

104:デフォルトの名無しさん
09/03/05 22:59:24
p[n]は*(p + (n))と同じ

105:デフォルトの名無しさん
09/03/05 22:59:54
RAMってw

106:デフォルトの名無しさん
09/03/05 23:23:12
Random Access Machomen

107:デフォルトの名無しさん
09/03/05 23:44:50
こんなのがわかってないうちからアセンブリやってるの?
順番ちがくね?

108:デフォルトの名無しさん
09/03/06 00:04:27
ハード屋なんじゃない?

109:デフォルトの名無しさん
09/03/06 00:08:36
int nFibo[16] = { 1, 1 };
これの = { 1, 1 };
って・・・・なんでしょうか・・?
こんなの見たことありません・・!
これはどういう意味なんですか・・?

110:デフォルトの名無しさん
09/03/06 00:23:18
nFibo[0] と nFibo[1] を1で初期化して残りは0で初期化。


111:デフォルトの名無しさん
09/03/06 00:28:44
わかりやすい説明サンクス!

112:デフォルトの名無しさん
09/03/06 00:54:22
ロベールのC++教室はC++と銘打っているが、ほとんどCの勉強という感じだ。
Effective C++などには配列はやめてvectorとstringを使おうと書かれているが、
ロベールでは徹底的に配列を使う(というより全編にわたってほぼ余すところなく登場する)。
配列はポインタと表裏一体なので、初心者は最初からCの一番の鬼門と真正面から向き合うことになる。
メモリ操作に関する知識は絶対に必要なのでこのスタンスもわからなくはないが初心者にはやや厳しくはないか?
他にも、ビット列の再解釈がしばしば登場したり、ハンガリアン記法が採用されていたり。
まぁ、いずれも必要な知識だけどさ。

113:デフォルトの名無しさん
09/03/06 01:11:00
C++の解説には、色々な入口から入る方法がある。
どの解説も同じでは面白くない、違う方が良い。
Cから順番に説明があったり、
いきなりクラスから説明したり、
それを読者が選ぶ事が出来る。良い時代です。
それぞれが、それぞれに良い




114:デフォルトの名無しさん
09/03/06 01:23:41
む。なるほどそういう考え方もあるか。確かに。
自分はCを学ぶにあたってポインタの習得にだいぶ苦労したので
Accelerated C++でCを勉強したときは目からうろこだった。

115:デフォルトの名無しさん
09/03/06 01:41:15
>>113
その考え方ステキだな。
俺は途中でロベールを読んだが、たま〜に知らない事が出てきて面白かった程度の記憶しか残っていない。
(逆に言えば特につっかからなかったとも言える。慣れてたからだろうけど。)
最初に読んでいたらきっと感慨も違っただろうなぁ。


116:デフォルトの名無しさん
09/03/06 01:58:46
私の考え方は他人と違う。。同じかもしれない。
機械語を逆アセンブルするときは、逆順、後ろから読む。
そして、終わったら前から順次読む。
本を読む時も同じ。逆から読む。
変かもしれない
人それぞれです、その人に合ったものを選ぶ事が出来れば幸せになります。
自分自身を知って、マッチする方法を選ぶ能力を養う
これが幸せへの法則かもしれません。





117:デフォルトの名無しさん
09/03/06 15:52:32
数値入力で1〜9999の範囲内で入力してくださいという
プログラムで範囲外だとエラー文を表示するのですが、
long型のオーバーフローする値(4294967296)を打ち込むと
入力エラーにならず読み込んでしまいます。
どういった対策をすればよいのでしょうか?
ちなみにint型で定義してあります。

118:デフォルトの名無しさん
09/03/06 15:53:13
コードは?

119:デフォルトの名無しさん
09/03/06 15:53:40
>>117
doubleで読み込めば

120:デフォルトの名無しさん
09/03/06 16:41:16
>117
入力部分と、保持する数値とを分離するとか。

>119
現実的にはともかく、理論的には変わんなくね? そうでもない?

121:デフォルトの名無しさん
09/03/06 16:45:22
string に読み込んで桁数判定した後数値変換するとか。

122:デフォルトの名無しさん
09/03/06 16:53:07
>>117
そういう時のscanf

123:デフォルトの名無しさん
09/03/06 18:15:57
scanfを恥ずかしげもなく使う男の人って。。。

124:デフォルトの名無しさん
09/03/06 18:17:48
男女以前にプログラマとしてどうか

125:デフォルトの名無しさん
09/03/06 18:18:29
別に普通

126:デフォルトの名無しさん
09/03/06 18:45:28
int64整数の補数をint32|int16へ最大値切り詰めにしても余剰bit切り捨てにしても
1〜9999条件なら 4294967296 (0x1 0000 0000)は弾いてくれると思うが
如何か

127:デフォルトの名無しさん
09/03/06 19:27:15
strtol を使えば大きすぎるのを入れたときはLONG_MAXになるから弾けるよ

128:デフォルトの名無しさん
09/03/06 19:35:05
>>126
弾けるのは4294967296とか、一部じゃないかw

129:デフォルトの名無しさん
09/03/06 21:33:28
キャストの弊害や精度不足の問題なら対処のしようがあるが
もしも 117 の不具合症状を含むライブラリや CPU が有るようなら大問題
概念的指摘ならば問題はないが数字を出して上手くいかないと主張するなら
実行環境を示して頂きたい。

130:デフォルトの名無しさん
09/03/06 21:53:18
バカは黙ってろw

131:デフォルトの名無しさん
09/03/06 21:54:39
>>117
>ちなみにint型で定義してあります。
といっているが、そもそもオーバフローする値が入力できるんだから元は
文字列とかint以外の値でしかありえない
それをintに変換した後ではじくのは不可能

面倒くさくても地道にやるしかない

1) 文字列のまま取得
2) 前後の空白とかとる
3) 数値以外のものがあったらエラー
4) 先頭の0を削除
5) 5桁以上ならエラー
6) 空文字列なら0
7) 整数変換
とか、まあがんばれ

132:デフォルトの名無しさん
09/03/06 22:31:45
まぁ、strtol()を使えば変換終了点が得られるからそこをチェックすれば事が足りるな。

133:デフォルトの名無しさん
09/03/07 01:18:09
ポインタは俺の理解を超えてやがる・・・・!!!

134:デフォルトの名無しさん
09/03/07 07:38:06
>>133
どうしたw突然何があった。
…まあ状況次第ではある意味大半の人の理解を超えているよ。

135:デフォルトの名無しさん
09/03/07 07:48:07
自分で組むだけなら、Cは良い言語だと心から言えるが、
他人のソースを読むと微妙な気分になる。
C++はまあまあ良い言語だが、他人のソースは
くそったれと思う。

って事かな?

136:デフォルトの名無しさん
09/03/07 08:22:39
俺は自分のソース見てくそったれと思う
もっときれいに書けないのかよ昔の俺

137:デフォルトの名無しさん
09/03/07 08:26:16
それはあなたの進化の証。

138:デフォルトの名無しさん
09/03/07 12:04:25
ソースなんて動けばいいよ。動くことが見た目に判ればそれでいい。

139:デフォルトの名無しさん
09/03/07 13:45:17
ポインタを解りやすく解説してくれるC++のサイト教えてください・・・
ロベール先生すいません
あなたの説明は僕の理解を超えている

140:デフォルトの名無しさん
09/03/07 13:47:43
>>139
適当な本を買った方がいいよ。
サイトは限界があると思う。
…そしてアドレスとポインタが分からないならロベール先生のせいじゃなくてまだC++に入るほどの腕じゃないと言うことだからC言語の本が良いと思うよ。

141:デフォルトの名無しさん
09/03/07 14:02:08
アセンブラやればポインタはわかる。
なのでPCプログラミングより8bitマイコンでも触るのお勧め。

ポインタが判らないという事はメモリマップとかスタックイメージも
脳内に浮かんでいないのは確実な訳で、それは計算機の知識が決定的に
欠けてる訳で、ってことはC/HWに限らずJVMやCLRも理解できない訳だから
一番見通しのいい低レベルハードウェアを触って身に付けるといいと思う。

142:デフォルトの名無しさん
09/03/07 14:39:23
>>141
あっそ。

143:デフォルトの名無しさん
09/03/07 14:53:10
#include <iostream.h>/*ロベール教室より*/

void ChangeToShohwa(int x)
{
if(1926 < x && x < 1989)
x -= 1925;
else
x = 0;
}

void Shohwa()
{
int nYear;

cout << "西暦を入力して下さい > ";
cin >> nYear;

ChangeToShohwa(nYear);
if(nYear)
cout << "その年は昭和 " << nYear
<< " 年です。" << endl;
else
cout << "その年は昭和ではありません。" << endl;
}

int main()
{
Shohwa();
Shohwa();
return 0;
}
なぜこれで失敗するのかが理解できない・・あほでごめんなさい

144:デフォルトの名無しさん
09/03/07 15:07:32
>>143
URLリンク(www7b.biglobe.ne.jp)
>

普通に理由が書かれてるじゃん。

145:デフォルトの名無しさん
09/03/07 15:08:00
>>144
手滑った

URLリンク(www7b.biglobe.ne.jp)
>引数は、新たに変数が作られ、それに値が代入されるという仕組みになっているからです。

146:デフォルトの名無しさん
09/03/07 15:17:51
>>142 何か気に障るようなこと言ったか?

147:デフォルトの名無しさん
09/03/07 15:20:35
ポインターは簡単、ポインターの解説が難しい。 上手に説明できたら天才。

148:デフォルトの名無しさん
09/03/07 15:33:45
つまり、なんだかんだでnYearの値が変更できないってこと・?

149:デフォルトの名無しさん
09/03/07 15:46:37
なんだかんだというかそのやり方だとnYearがこぴってわたされて
そのこぴったのを変更しているだけ

150:142
09/03/07 16:14:00
>>146
…俺の深読み誤解か。
スマン。

151:デフォルトの名無しさん
09/03/07 17:55:04
>>147
ポインターのような人間には解りづらく、そして機械に都合のいいように作られたものの使用を強制する言語はダメポ言語
普通は人間に合わせて言語が作られるべきだろ

152:デフォルトの名無しさん
09/03/07 18:16:59
ポインターは日本語に似合う。皆は知らぬうちに日本語会話の中でポインターを使っている。

153:デフォルトの名無しさん
09/03/07 18:33:00
>>151の考える素晴らしい言語のソースも、
ポインターを駆使して記述されています。

154:デフォルトの名無しさん
09/03/07 18:47:53
ボイン太さいこー!

155:デフォルトの名無しさん
09/03/07 19:01:39
>>152
This is it.

156:デフォルトの名無しさん
09/03/07 19:11:01
int **(*i[10])[4]
int (*i())[6]
int *(*(*i)())[4]
数秒以内にポインタiが何を指しているのか理解できないと
Cの初歩にすら達してないと言われた
お前らなら、一目瞭然で数秒どころか一瞬だろ

157:デフォルトの名無しさん
09/03/07 19:19:29
>>156
実際そんな使い方はまったくしない。
一目でわかりやすい宣言をするのが上級者。

158:デフォルトの名無しさん
09/03/07 19:25:03
実際は使わないが、錬度を試す訓練だよ

159:デフォルトの名無しさん
09/03/07 19:30:04
数秒でわかったらすごいわ
俺の場合、特に最後は()の解析で時間かかるぞ

160:デフォルトの名無しさん
09/03/07 19:33:59
そこに至るまでのコード次第
いきなり 156 が現れたら 書いた奴の精神状態を疑う。

161:デフォルトの名無しさん
09/03/07 19:59:17
>>159
俺、今でも数秒では無理だが、宣言をすらすらと解析できないとなると程度しれるよな
まだまだ初級のおれがちょっと前に新人にこのp何さしてるのって聞かれたのがこれ
int (CC::*(p[3]))(void);
これぐらいなら頻繁に使うだろうし、ム板連中なら一瞬だろ
ちなみに>>156は会社の新人PGのC言語コースの理解度試験

162:デフォルトの名無しさん
09/03/07 20:12:25
頻繁に使うか?
俺だったらまずtypedefするが…

163:デフォルトの名無しさん
09/03/07 20:24:13
爆釣

164:デフォルトの名無しさん
09/03/07 20:24:22
>>162
どういう風にtypedefするんだ?

165:デフォルトの名無しさん
09/03/07 20:28:02
URLリンク(mist000.h18.ru)
メンバーイニシャライザを使用したコンストラクタをクラス定義の外に分離したいんだが、
g++でコンパイルするとこのようなエラーが出る。
--------------------------------------------------------
uha@seven:~/dev/uhaww$ g++ -Wall -o debug debug.cpp
debug.cpp: In constructor ‘TestException::TestException(std::string&)’:
debug.cpp:8: error: ‘sCause’ was not declared in this scope
debug.cpp:8: error: expected `{' at end of input
debug.cpp: At global scope:
debug.cpp:10: error: redefinition of ‘TestException::TestException(std::string&)’
debug.cpp:8: error: ‘TestException::TestException(std::string&)’ previously defined here
--------------------------------------------------------
分離すること自体考えてはいけないのだろうか...
メンバーイニシャライザ使わなければ分離できるのに。。

間違いがあればよろしくお願いします。


166:デフォルトの名無しさん
09/03/07 20:28:56
>>162
まさか typedef int (CC::*(p[3]))(void)
なんて言わないよな
int (CC::*(p[3]))(void)が何をあらわすのか、解りやすくするtypedef頼むよ

167:デフォルトの名無しさん
09/03/07 20:29:28
実はほとんど俺の自作自演

>>164
typedef int (CC::*ccpoint)(void);
ccpoint p[3];
こんな感じにするんじゃね?

168:デフォルトの名無しさん
09/03/07 20:34:07
2ちゃんねる株式会社ではよく使います。

実際はベテランほど保守性を考慮して単純に書く。
Cの設計者でさえシンプルに書けと言ってるのに、
何を勘違いしてるんだろね。

169:デフォルトの名無しさん
09/03/07 20:38:15
むずかしっすぎる!

170:デフォルトの名無しさん
09/03/07 20:46:27
int (CC::*(p[3]))(void);
が頻繁に出てくるようでは駄目だと思うわ

171:デフォルトの名無しさん
09/03/07 20:57:19
Visual C++ 2008 Express Editionの使い方がよくわかりません。

講座サイトの解説で使ってるVisual C++はちょっと違って
現在編集中のプログラムを実行する方法がわかりません。

ご教授よろしくお願いします。

172:165
09/03/07 21:01:49
お騒がせしました、自己解決しました。

173:デフォルトの名無しさん
09/03/07 21:13:57
>>171
F1を押してヘルプを読め

174:デフォルトの名無しさん
09/03/07 21:18:57
>>171
スレ違いだろ

175:デフォルトの名無しさん
09/03/07 21:19:31
int (CC::*(p[3]))(void)のpって何を指す
日本語で書いてくれ

176:デフォルトの名無しさん
09/03/07 21:21:16
pは、配列です。何の配列かと言うと・・・次の人、どうぞ

177:デフォルトの名無しさん
09/03/07 21:22:20
パス!

178:175
09/03/07 21:26:55
あと、>>156
int **(*i[10])[4]
int (*i())[6]
int *(*(*i)())[4]
のiも頼む

179:デフォルトの名無しさん
09/03/07 21:34:36
もしかして、voidさん入店されてはります?

180:デフォルトの名無しさん
09/03/07 21:40:12
全然わからんw
1番目は多次元配列っぽくて、
2番目と3番目は関数ポインタの配列っぽいれすか?
あと>>161はメンバ関数へのポインタっぽい?

答えをたのむぅ。

181:デフォルトの名無しさん
09/03/07 21:48:22
実際のコードで、こんなの使っちゃダメだが、
Cの文法の知識として、本当におまえら、読めないのか?

javaばっかやってるから、バカになる

182:175
09/03/07 21:52:00
>>180
俺と似たような,orzレベルだな

色々レスしてる人たちって解ってるんでしょ、なら教えてくださいなーーーー

183:デフォルトの名無しさん
09/03/07 22:02:29
>>181
本当に読めないので、ぜひ、答えを

184:デフォルトの名無しさん
09/03/07 22:51:56
int **(*i[10])[4];
( ((int[10])へのポインタ)[4] )へのポインタ ×2

int (*i())[6];
(int f()のような関数へのポインタ)[4]

int *(*(*i)())[4]
( (int *f()のような関数へのポインタ)[4] )へのポインタ

ということでいいのか?

185:デフォルトの名無しさん
09/03/08 00:00:32
C言語パズルです、みたいなノリで出されるなら喜んでやるかも。

186:180
09/03/08 00:09:44
1番目は「二次元配列へのポインタ」のポインタのポインタとなる要素数10の変数i。
2番目は二次元配列を戻り値とする関数i。
3番目は「関数ポインタを格納する二次元配列へのポインタ」へのポインタ。

わからーんw

187:180
09/03/08 00:50:52
んー。一番目はいきなり間違いだな。
1番目は「二次元配列へのポインタ」のポインタのポインタとなる要素数10の変数iだとすると
int *(**i[10])[4]; と書く必要があるようだ。わからん・・・。答えはまだか。

188:デフォルトの名無しさん
09/03/08 01:11:50
int **(*i[10])[4]
intへのポインタのポインタの配列へのポインタの配列

int (*i())[6]
intへの配列へのポインタを返す関数

int *(*(*i)())[4]
intへのポインタの配列へのポインタを返す関数へのポインタ

189:180
09/03/08 01:21:47
なるほど、int **(*i[10])[4]の最初のint **は納されている型になるのか。
んでもって、(*変数名)[4]が多次元配列へのポインタで、
変数名の後の[10]がその変数の要素数になる、と。

だんだんわかってきた。おもしろい。w

190:デフォルトの名無しさん
09/03/08 01:39:49
外側から一つずつ剥がしていく。最初と最後の両側から剥がせるときは、最初を先に剥がす。
剥がしたものが、それぞれ
 int(などの普通の型名)であれば…… 「int」
 * であれば…… 「へのポインタ」
 [N] であれば…… 「の配列」
 (int,int) (など、カッコ内に型名)であれば…… 「が戻り値の型、(int,int)が引数の型である関数」
 MyClass:: であれば…… 「で、MyClassのメンバであるもの」
をつけていく。これで読めるはずだ。英語圏の人は逆向きにやるらしいけど。

191:デフォルトの名無しさん
09/03/08 01:45:13
あと、これとは直接関係ない話だが、intへのポインタへのポインタは、intの2次元配列とは別物だからね。
「ポインタ⇔配列」の互換ができるのは、末尾の「〜へのポインタ」「〜の配列」の部分のみ。

だから、ポインタの配列はポインタへのポインタで受けることができるし、2次元配列は配列へのポインタで受けることができるが、
2次元配列をポインタへのポインタで受けるのは不正。

192:デフォルトの名無しさん
09/03/08 01:51:13
>>190
読めないよ。

int &a
int func<int>()

193:180
09/03/08 01:52:14
大変よくわかりました。

194:デフォルトの名無しさん
09/03/08 01:56:42
167は正しいの?

195:デフォルトの名無しさん
09/03/08 02:07:28
正しいよ。

196:デフォルトの名無しさん
09/03/08 02:07:55
>>194 うん

197:デフォルトの名無しさん
09/03/08 02:26:30
C言語の宣言の文法は、もうちょっとマシな文法にならんかったの?
標準化するとき、誰からも反対が出なかったのが不思議なくらいだ。
頭がいい人がいっぱい集まってやってるハズなのに。

198:デフォルトの名無しさん
09/03/08 03:13:06
これでいいんじゃない?
っていうか、Quizみたいなみょうちくりんな宣言が必要になるプログラムは
そもそもの設計が間違っている気も。

199:デフォルトの名無しさん
09/03/08 03:21:05
Cだと、ポインタ型を別に作って欲しかった
後は関数ポインタの宣言を何とかして欲しかったくらいか

>>156をすらすら読み、161みたいなのを頻繁に使うプログラマにはなりたくない
161はtypedefしないらしいし…

200:デフォルトの名無しさん
09/03/08 04:01:48
>>199
もし>>156をtypedefを使って分りやすくしてくれと言われたらどのように
typedefする?有る意味typedefの練習になるんじゃないか



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

5379日前に更新/124 KB
担当:undef