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


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

スレを勃てるまでもないC/C++の質問はここで 8



1 名前:デフォルトの名無しさん [2009/03/02(月) 00:36:19 ]
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ
スレを勃てるまでもないC/C++の質問はここで
pc11.2ch.net/test/read.cgi/tech/1167476845/
スレを勃てるまでもないC/C++の質問はここで 2
pc11.2ch.net/test/read.cgi/tech/1178503366/
スレを勃てるまでもないC/C++の質問はここで 3
pc11.2ch.net/test/read.cgi/tech/1187521676/
スレを勃てるまでもないC/C++の質問はここで 4
pc11.2ch.net/test/read.cgi/tech/1221633708/
スレを勃てるまでもないC/C++の質問はここで 5
pc11.2ch.net/test/read.cgi/tech/1230516307/
スレを勃てるまでもないC/C++の質問はここで 6
pc11.2ch.net/test/read.cgi/tech/1231564903/
スレを勃てるまでもないC/C++の質問はここで 7
pc11.2ch.net/test/read.cgi/tech/1232983248/

2 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 00:39:37 ]
janeの隠し機能

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


3 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 00:40:06 ]
36年間悩んでます。お力をお貸しください。

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

◆試してダメだったこと

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

◆教わったこと

 ・アークザラッドUは独自の画像形式を使っているから抽出できない。
 ・PS上で表示されてるということは絶対に摘出はできるはず。
 ・ttp://www.gradius2.com/index.php?UID=1174775153

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

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

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

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

5 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 00:44:32 ]
>>1
乙。

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


8 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 00:49:39 ]
>>1







9 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 00:55:15 ]
>>5 に対して複雑怪奇な提案したいけど思いつかない。。。

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



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

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

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

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

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

14 名前:12 mailto:sage [2009/03/02(月) 01:26:31 ]
前スレでそもそもの質問者が出したやつのことな

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

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

16 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 02:14:44 ]
両方の最大最少値から if 条件を最適化する位しか思いつかんね

17 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 02:17:01 ]
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

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

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

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

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

19 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 07:05:32 ]
>>15
氏んでEYo!

20 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 08:16:00 ]
>>19
死ね



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

22 名前:デフォルトの名無しさん [2009/03/02(月) 08:26:06 ]
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

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

24 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 09:17:58 ]
>>18
piyoてなにおまえ? ふざけてんの? ヒヨコなの?

25 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 09:24:52 ]
うん

26 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 10:33:34 ]
ここはいつからこんなクソスレになった?

27 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 12:08:47 ]
>>18
テンプレート構造体つかえ。

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

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

30 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 20:09:35 ]
訂正。
A<int, 10> a(B); // error:b is not a type

32 名前:デフォルトの名無しさん [2009/03/02(月) 20:22:50 ]
>>30
通った。 VC9, gcc4.3.2

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

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

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

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

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

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

38 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 02:14:02 ]
答えることができない奴ほど自明なんて言うよな

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

40 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 04:05:36 ]
>>36
case by case



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

42 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 12:26:07 ]
>>39-41
ありがとうございました

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

44 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 12:38:13 ]
>>38=>>36 ?

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

46 名前:デフォルトの名無しさん [2009/03/03(火) 21:44:23 ]
カレント要素って何?

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

48 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 22:07:53 ]
エスパーすると

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

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

49 名前:33 [2009/03/03(火) 22:37:54 ]
>>48
その通り。君はプロだ。やっぱプロは違うなぁ

で見解は?

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

50 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 22:40:10 ]
そのlistが最早更新されないのならiteratorで医院で内科医?



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

52 名前:デフォルトの名無しさん [2009/03/04(水) 00:41:47 ]
可変引数リスト

va_start、va_end、va_arg
www.geocities.co.jp/SiliconValley/6071/technic/17.html

53 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 07:11:26 ]
lstrcpyをstrcpyにしてみては?

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

56 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 07:23:32 ]
>>55
ttp://www.geocities.jp/ky_webid/c/057.html
なるたけ単純な具体例のあるページ


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


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

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

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



61 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 11:02:42 ]
opendir readdir

62 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 11:32:24 ]
>>60
環境依存

63 名前:デフォルトの名無しさん [2009/03/04(水) 12:02:15 ]
>>62


64 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 12:25:13 ]
struct buff{buff, ite};
テンプレート関数(&buff, T) {memcpy(buf, ite, sizeof(T))〜; buf.ite+sizeof(t); return &buf}

66 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:44:38 ]
構造体のコンストラクタでは駄目なの?

69 名前:64 mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 20:27:21 ]
正規表現でどうとでもなるんじゃね?

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

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

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

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

74 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 21:04:05 ]
そもそもC標準にbooleanなんて型はない

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

76 名前:64 mailto:sage [2009/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 mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/03/05(木) 00:58:00 ]
>>76
ターゲットのMCUによってエンディアンが異なるなら、
memcpyだけではなく、structでも、自作sprintfでも、要素ごとにエンディアンの変換は必要ではないですか?

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

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

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

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

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




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

82 名前:デフォルトの名無しさん [2009/03/05(木) 08:35:55 ]
ドメストがおすすめ

83 名前:64 mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 11:24:30 ]
>>84
C++用の
<complex>
ならあるみたい


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

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

88 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 16:01:21 ]
#define FNC void fnc()

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

90 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 16:04:49 ]
>>89
ハイパーサンクス



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

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

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

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

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

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

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

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

97 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 19:47:00 ]
>>96
していい。
ttp://msdn.microsoft.com/ja-jp/library/cc429233.aspx

98 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 19:48:43 ]
ごめん。間違えた。
いらなかった。

99 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 19:49:18 ]
ごめん。間違えた。
いらなかった。

100 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 20:00:59 ]
ごめん。間違えた。
助かった。



101 名前:デフォルトの名無しさん [2009/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を足すしかないでしょうか?






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

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

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