5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

C言語なら俺に聞け(入門編)Part 69

1 :デフォルトの名無しさん:2010/09/15(水) 00:21:37
C言語の*入門者*向け解説スレッドです。
★前スレ
C言語なら俺に聞け(入門編)Part 68
http://hibari.2ch.net/test/read.cgi/tech/1282536520/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★初心者、初級者の方は他の質問スレのほうが良いかもしれません。
例えば
【初心者歓迎】C/C++室 Ver.73【環境依存OK】
http://hibari.2ch.net/test/read.cgi/tech/1274395127/

とか
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 137代目
http://pc12.2ch.net/test/read.cgi/tech/1276810079/
★C++言語については避けてください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

2 :デフォルトの名無しさん:2010/09/15(水) 00:34:01
double *malloc_array(int n)
{
double *array; int i;
if ((array = (double *)malloc(n * sizeof(double))) == NULL) {
fprintf(stderr, "malloc error.\n");
exit(EXIT_FAILURE);
}
return array;
}

の型を一般化するために、
型名を引数にとることはできますでしょうか。

void *malloc_array(int n, char *cast)
{
cast *array; int i;
if ((array = (cast *)malloc(n * sizeof(cast))) == NULL) {
fprintf(stderr, "malloc error.\n");
exit(EXIT_FAILURE);
}
return (cast *)array;
}

malloc_array(100, double);

とかくと、一番上に書いた関数で

malloc_array(100);

と呼び出すのと同じ動作をさせたいです。

3 :デフォルトの名無しさん:2010/09/15(水) 00:38:01
void * からの型変換は暗黙。キャストなんて要らんだろ。

4 :デフォルトの名無しさん:2010/09/15(水) 00:39:45
つーかキャストなんかするな。


5 :デフォルトの名無しさん:2010/09/15(水) 00:40:07
>>2
型を引数にしたいって話なら無理
スタックに型をどうやって積むねん!

6 :デフォルトの名無しさん:2010/09/15(水) 00:40:54
>>2
無理。
サイズ渡すかcalloc使うかマクロ使うかしてがんばれ。

7 :デフォルトの名無しさん:2010/09/15(水) 00:49:36
>>3-6
ありがとうございます。

>>6
関数呼び出し時に型の指定をしたいので
マクロは合わないんですよね。

サイズ渡すのが良さそうです。
やってみます。ありがとうございました。

8 :デフォルトの名無しさん:2010/09/15(水) 00:55:12
C++だと定数はconst使えってなってるけどCだとconstでやるのは何かまずいの?

9 :デフォルトの名無しさん:2010/09/15(水) 01:00:43
>>8
いいえ全然。多分 const だの enum だのを使ったほうがいいと思います。今はみんな c++ でしょうし。

10 :デフォルトの名無しさん:2010/09/15(水) 01:02:23
++厨は帰れよ。

11 :デフォルトの名無しさん:2010/09/15(水) 01:14:29
前スレ986
前880じゃないけど。
てか前870なんだが、もうちょっとちゃんと書いとく。

> 場所によって意味が変わる、という事は無い。

少なくとも規格上関数内外のstaticな変数の宣言において、
関数内の宣言では無結合、関数外では内部結合、
とその宣言される変数の持つ結合が異なる。

無結合と内部結合ではコンパイラの解釈が異なる。

だから「ついでに・・・」「まとめると・・・」の部分は大嘘。

12 :デフォルトの名無しさん:2010/09/15(水) 01:37:13
staticなときに、無結合って、いってるのがようわからんのだけど


13 :デフォルトの名無しさん:2010/09/15(水) 01:50:41
>>11
前スレ 986 だけど、書いた通り VC の実装に基づく事実なので。

コンパイル時のアセンブリリスティングやオブジェクトファイルを見てみれば、
関数 testfunc() 内の static 変数 testvar も、_?testvar@?1??testfunc@@9@9
のような名前でリンケージを持つ事が判る。

VC が規格外の動作をしてるって言いたいの?

14 :デフォルトの名無しさん:2010/09/15(水) 02:44:20
マルチキャストを1つのインターフェースで受信して
それを中でユニキャストに変換してもう1つのインターフェースから出すことって可能かな。。。

15 :デフォルトの名無しさん:2010/09/15(水) 03:17:31
char* a;
a = (char*)malloc(1);

キャストしては駄目というのは
どういった理由からですか?


16 :デフォルトの名無しさん:2010/09/15(水) 04:52:02
>>8
別に const 付けたからと言って動作が変わるわけではないのよ
const 付けた変数の内容を変更するコードに対してそれはダメよってコンパイラさんが怒るだけの話
だから内容を変更しない定数に付けておけば間違いが減るってだけの話なんよ

17 :デフォルトの名無しさん:2010/09/15(水) 04:58:54
C++の場合はconst付けると書き替え不可な領域に配置するんだよな。

18 :デフォルトの名無しさん:2010/09/15(水) 05:01:24
>>15
別にダメな理由は無いよ
冗長かもしれないけど(ワーニング出なかったっけ?)、生成されるコードに変化が有る訳でもないから、
できるだけ明示的にキャストするのは悪い習慣ではないと思う

19 :デフォルトの名無しさん:2010/09/15(水) 05:05:58
>>17
それは処理系依存じゃね?
まぁ何処に配置されようが同じだけど

20 :デフォルトの名無しさん:2010/09/15(水) 05:41:55
const 付けると、C++ だとちゃんと定数扱いになるが、
C ではあくまで変数として処理される。


21 :デフォルトの名無しさん:2010/09/15(水) 08:42:10
>>20
コンパイラ依存では?

22 :デフォルトの名無しさん:2010/09/15(水) 08:44:51
>>21
ちげぇよwwww
配列宣言の添字に使えるかとかの問題の話できちんと規格で決まってる

いやC99だと動的に配列作れるからつくれちゃうんだけど



23 :デフォルトの名無しさん:2010/09/15(水) 09:35:00
case 文に使えるかどうかって差はあるな。


24 :デフォルトの名無しさん:2010/09/15(水) 09:56:55
>>12
C言語の結合には、外部結合、内部結合、無結合の3種類があるんだと。
どっかのサイトでは「結合が無いのではなく、
無結合という結合を持つ」なんて書いてあった。

>>13
それはもうC言語でいう結合は関係ない世界じゃないの?

基本的には、書いたCのソースをビルドして実行した時、
規格が求めるように動けば規格準拠で、
バイナリでの表現は関係ない。

アセンブリ上では、ブロックスコープの変数が
別の翻訳単位から見える形で定義されてても構わないし、
場合によっては定数に変換されたりして変数が削除されてても良い。

25 :デフォルトの名無しさん:2010/09/15(水) 10:55:01
>>13
難しく考えすぎなんだよ。

結合は「コンパイラ(≠リンカ)による依存性、一意性の解決」とでも思えばいい。
同じ名前のオブジェクトが出現したときに「最終的にどれを呼べばいいのか?」をコンパイラが判断すること。
この段階でコンパイラはそれぞれのオブジェクトに「依存解決済みの一意の名前付け」をする。
もちろん最終的に一意性が確保できなければエラーを吐く。
リンカがそれらを相対アドレスに置き換えるのはその後の話だ。

externが付いてない限り、またスコープ内で重複しない限り、ブロックスコープにあるオブジェクトは一意だろ?
だから結合という操作は不要なんだよ。

26 :デフォルトの名無しさん:2010/09/15(水) 11:00:34
関数の外でも中でもリンカーによって最終的に配置されるのは同じような位置だろ。


27 :デフォルトの名無しさん:2010/09/15(水) 12:53:28
>>2
malloc_array(100, "double");

とすればいいんじゃね

28 :デフォルトの名無しさん:2010/09/15(水) 12:54:11
>>26
処理系による

29 :デフォルトの名無しさん:2010/09/15(水) 13:03:35
>>28
よらねえよ。つーかよったらよっぽど変な実装だぞ。


30 :デフォルトの名無しさん:2010/09/15(水) 14:51:19
>>29
C++をサポートしてる処理系なら違う場所になるね。
だから今は同じ場所になる処理系の方が稀だわ。

君は昔のC++がなかった頃の処理系しかしらないんんだろう?

31 :デフォルトの名無しさん:2010/09/15(水) 16:14:00
>>20
>const 付けると、C++ だとちゃんと定数扱いになる
「static const 整数型」だけの特別扱いじゃなかったっけ

32 :デフォルトの名無しさん:2010/09/15(水) 19:14:17
リンケージの次は、結合ですか?
その次はどんな言葉が出てくるんでしょうね?

33 :デフォルトの名無しさん:2010/09/15(水) 19:19:41
わからん人はスルーしてな

34 :デフォルトの名無しさん:2010/09/15(水) 20:07:41
いやむしろここはスレタイよろしく、
初心者にも分かる言葉で説明する事によって
理解を深めるのがいいんジャマイカ?

35 :デフォルトの名無しさん:2010/09/15(水) 20:08:35
>>31
んなことねえよ

36 :デフォルトの名無しさん:2010/09/15(水) 21:09:37
>>31
7.1.5.1 The cv-qualifiers
2 An object declared in namespace scope with a const-qualified type has internal linkage unless it is explic-
itly declared extern or unless it was previously declared to have external linkage. A variable of non-
volatile const-qualified integral or enumeration type initialized by an integral constant expression can be
used in integral constant expressions (5.19). [Note: as described in 8.5, the definition of an object or subob-
ject of const-qualified type must specify an initializer or be subject to default-initialization. ]

そもそもstaticという言葉が出てこない

37 :31:2010/09/15(水) 22:18:34
ありがとう。static無関係は了解。
(整数とenumに限るのはなぜだろ?)

38 :デフォルトの名無しさん:2010/09/15(水) 22:33:49
こちらへどうぞ
http://hibari.2ch.net/test/read.cgi/tech/1280914463/

39 :デフォルトの名無しさん:2010/09/15(水) 23:37:54
>>24
元々前スレ 751 が 「staticの指定は「こいつの存在をリンカに知らせない」という意味」
とか言い出したから、その反証として VC の動作を挙げただけ。
C の規格と関係あるかどうかは関知しないし、そもそもリンカの動作自体が規格で明確に
定められていない。

>>25
事実をそのまま述べただけなのに 「考えすぎ」 とか言われても困る。

40 :デフォルトの名無しさん:2010/09/15(水) 23:44:29
>>25
書き忘れ。
一意になろうがなんだろうが、コンパイル時に static 変数のアドレスが特定できない
処理系の場合は、その変数の参照部分に対してリンク操作が必要になる。
(そのリンク操作の指示はリンカが行い、実際のリンク操作はローダーが行う)

41 :デフォルトの名無しさん:2010/09/16(木) 00:00:17
これのこと?
http://f4.aaa.livedoor.jp/~pointc/No.22520.html

42 :デフォルトの名無しさん:2010/09/16(木) 03:21:37
てst

43 :デフォルトの名無しさん:2010/09/16(木) 03:33:50
そういうのはコンパイラーによって結果が変わりそうで不安だな。


44 :デフォルトの名無しさん:2010/09/16(木) 04:00:15
あげ


45 :デフォルトの名無しさん:2010/09/16(木) 05:25:58
C言語以前に日本語ができてない気がする。
もうちょっと外部リンケージを持った内容にしてほしい。

46 :デフォルトの名無しさん:2010/09/16(木) 07:35:15
レベルが高すぎると誰もついてこないし、レベルが低すぎると誰も食いつかない。

このスレのレベルはstataic程度が上限。

47 :デフォルトの名無しさん:2010/09/16(木) 08:42:48
>>39
そこについては否定してないよ。

48 :デフォルトの名無しさん:2010/09/16(木) 10:17:00
ん〜、constantが良いと思いますねぇ〜、はい。

49 :デフォルトの名無しさん:2010/09/16(木) 15:30:16
int a=1111111111111111111111111;

50 :デフォルトの名無しさん:2010/09/16(木) 18:18:29
amazon の本、普通の値段になってたw

51 :デフォルトの名無しさん:2010/09/16(木) 22:19:16
何の本だよ。
書き込むなら情報として他の人にも意味が分かるように書いてくれよ。


52 :デフォルトの名無しさん:2010/09/16(木) 22:21:52
何千マンにもなってたVBの本のことだろ。

53 :デフォルトの名無しさん:2010/09/16(木) 22:23:52
オーバーフロー狙いが20京ドルでもアウトと聞いて意気消沈

54 :デフォルトの名無しさん:2010/09/16(木) 22:55:03
オーバーフローはどうやって防止してる?
入力の段階で弾くのがいいかな。

55 :デフォルトの名無しさん:2010/09/16(木) 23:04:49
>>54
式は暗黙でintもしくはdoubleになる
これを覚えておけば自ずと手段も決まってくる

56 :デフォルトの名無しさん:2010/09/16(木) 23:07:59
>>54
そうそう
符号付き整数の場合、オーバーフローは起こした時点で
未定義の世界に突入しちゃうので、ふつう望ましくない

57 :デフォルトの名無しさん:2010/09/16(木) 23:16:45
>>55
何を言ってんだよ?


58 :デフォルトの名無しさん:2010/09/17(金) 00:41:03
int n = 0;

59 :デフォルトの名無しさん:2010/09/17(金) 00:51:22
浮動小数は標準仕様に含めるべきじゃなかったよな。
まあ、実装でバラバラってのも困るから、
ガイドライン程度は決めておいたらいいが。
言語機能そのものは削れるだけ削ってシンプルにしたほうがいい。
なのに C99 までどんどん複雑化の方向だもんな。ガッカリだよ。


60 :デフォルトの名無しさん:2010/09/17(金) 01:19:16
コンパイラ屋さんですか?

61 :デフォルトの名無しさん:2010/09/17(金) 01:28:15
なら、もっと吹っ切れた感じの人が多いね

62 :デフォルトの名無しさん:2010/09/17(金) 02:41:36
>>52
10億に達した段階で一旦出品が取り消された模様。

63 :デフォルトの名無しさん:2010/09/17(金) 05:47:41
いや、浮動少数周りの規格はあの程度で現実的と思うが。
たしかにコンパイラ作る側には面倒な部分ではあるけど。
規格化される前、1972年のBell研のCコンパイラの時点で
float/doubleはサポートされていたよ。
重きをおいていたのはハードウェアの持つ性能を生かすことだったんだろう。

C99は大部分バカげた退化だったけどね。

64 :デフォルトの名無しさん:2010/09/17(金) 08:27:51
どうぞC89をお使いください。

65 :デフォルトの名無しさん:2010/09/17(金) 08:35:09
C99と言ってても完全対応してなかったり、コメントで//とか使ってもC89とか言ってたりするし、境界があいまいだわ

66 :デフォルトの名無しさん:2010/09/17(金) 08:37:29
どうぞC1000タケダでも飲んで下さい

67 :デフォルトの名無しさん:2010/09/17(金) 08:39:53
「c99なんて使うな」というクライアントが、//コメントは「常識だ」とのたまう現実。

68 :デフォルトの名無しさん:2010/09/17(金) 08:50:07
C99以前に大抵のコンパイラで//コメント使えるようになってたしなあ

69 :デフォルトの名無しさん:2010/09/17(金) 08:50:58
//のメリットは、連続した行を/**/でコメントアウトしたい場合に邪魔にならないってことかな


70 :デフォルトの名無しさん:2010/09/17(金) 09:03:36
C++使ってベターCで書けってことかもよ

71 :デフォルトの名無しさん:2010/09/17(金) 09:36:43
>>69
#if 0じゃあかんの?

72 :デフォルトの名無しさん:2010/09/17(金) 10:33:21
/++/とかどうでしょう

73 :デフォルトの名無しさん:2010/09/17(金) 12:17:23
>>71
エディタにもよるが /* */ の範囲で配色が変るのがある
#if 0 〜 #endif の範囲で配色が変るエディタがあれば、等価に使うだろうね

74 :デフォルトの名無しさん:2010/09/17(金) 12:23:47
エディタ依存を話をするなら
/* */が二重なるのも気にしなくていいよな



75 :デフォルトの名無しさん:2010/09/17(金) 12:33:40
いやネストのせいで挙動変わっちゃうじゃん、
配色だけで済まないじゃん

76 :デフォルトの名無しさん:2010/09/17(金) 12:39:21
>>73
配色の変わるエディタならだいたい対応してるだろ

77 :デフォルトの名無しさん:2010/09/17(金) 12:49:12
ネストするときは\いれてくれるエディタってあんまりないのか?

78 :デフォルトの名無しさん:2010/09/17(金) 13:01:32
お金いれてくれる?

79 :デフォルトの名無しさん:2010/09/17(金) 13:05:36
>>77
逆にそんなエディタがあるのか?

80 :デフォルトの名無しさん:2010/09/17(金) 14:50:53
test
int n = 0;

81 :デフォルトの名無しさん:2010/09/17(金) 15:24:50
test
int miracle_power = (rand() % 100) < 30;
while (1) {
  if (miracle_power) {
    lesson_boycott();
    enjoy_amusement_park();

    if (get_homework()) {
      dis_homework();
    }
  } else {
    lesson();
    if (get_homework()) {
      run_homework();
    }
  }
}

82 :デフォルトの名無しさん:2010/09/17(金) 15:30:30
miracle_power更新されないのか
最初の一回で運命が決まってしまうのだな

83 :デフォルトの名無しさん:2010/09/17(金) 15:42:52
test
typedef struct man kimi;
typedef struct woman me;
long year = get_year();
year -= 10000 + 2000;
aishiteru(&kimi, &me, year);
year += 8000;
aishiteru(&kimi, &me, year);
year += 100000000 + 2000;
aishiteru(&kimi, &me, year);


84 :デフォルトの名無しさん:2010/09/17(金) 15:49:50
つまらないからそろそろ消えてね

85 :デフォルトの名無しさん:2010/09/17(金) 15:51:08
ローマ字関数名って すごく残念な気分になれるけど
ぱっと英文思い浮かばないときはどうしてる? やっぱりあきらめてローマ字?

86 :デフォルトの名無しさん:2010/09/17(金) 15:52:21
漢字で

87 :デフォルトの名無しさん:2010/09/17(金) 15:54:02
下手に間違った英単語にするよりはローマ字のほうがマシな気もするが
昔のコードとか見ると、調べてつけた英単語の意味忘れてることとかあるし

88 :デフォルトの名無しさん:2010/09/17(金) 15:56:18
VBだと出来るんだっけか
> 漢字

89 :デフォルトの名無しさん:2010/09/17(金) 15:59:59
時間的に余裕があるときは和英辞書や翻訳サイトで調べたり、海外のソースコードを見たりする
納期直前だと逃避のために和英辞書や翻訳サイトで調べたり、海外のソースコードを見たりする

90 :デフォルトの名無しさん:2010/09/17(金) 16:04:01
>>88
Javaでも出来る
たぶん誰もやらないだろうけど
・・・でもひょっとしたら面白いかもしれんな
仕事ではもちろん却下だが、個人の趣味でなら、一度やってみようかな

91 :デフォルトの名無しさん:2010/09/17(金) 16:59:15
test
int n = 0;
return n;

92 :デフォルトの名無しさん:2010/09/17(金) 17:47:27
もう書かないぞ

93 :デフォルトの名無しさん:2010/09/17(金) 18:42:51
ウニコードが識別子に使えると一行AAで遊べるから楽しいね

94 :デフォルトの名無しさん:2010/09/17(金) 18:47:58
日本語でコード書いて最後に重複しないようにスクリプトで置換すると気持ちいい

95 :デフォルトの名無しさん:2010/09/17(金) 20:05:20
C言語でグラフィックを描くことは可能ですか?

96 :デフォルトの名無しさん:2010/09/17(金) 20:07:41
無理です

97 :デフォルトの名無しさん:2010/09/17(金) 20:11:05
不可能です

98 :デフォルトの名無しさん:2010/09/17(金) 20:12:09
無理

99 :デフォルトの名無しさん:2010/09/17(金) 20:13:31
でもひょっとしたら…

100 :デフォルトの名無しさん:2010/09/17(金) 20:14:17
C言語はキャラクター文字しかサポートしてないので無理

101 :デフォルトの名無しさん:2010/09/17(金) 20:14:29
アスキーアート

102 :デフォルトの名無しさん:2010/09/17(金) 20:16:42
pgm なら比較的簡単

103 :デフォルトの名無しさん:2010/09/17(金) 20:18:35
K&Rに載ってないので無理

104 :デフォルトの名無しさん:2010/09/17(金) 20:22:48
BB ASCII Demo standard size running in Linux (With sound)
http://www.youtube.com/watch?v=9ukhOAUseKY&feature=related

105 :デフォルトの名無しさん:2010/09/17(金) 20:49:17
>>104
こういうのって、結局はただ解像度が粗いだけの普通のドットマトリクスモニターじゃん。
何の意味があるのか全く解らんのだが。
エクセルでこういうのやってる動画も時々上がるけど、あれも同様に意味不明。


106 :デフォルトの名無しさん:2010/09/17(金) 20:54:50
文字を小さくすればどんどん鮮明になります!すごいでしょう!?

107 :デフォルトの名無しさん:2010/09/17(金) 20:55:31
>>105
涙ふけよw

108 :デフォルトの名無しさん:2010/09/17(金) 20:55:54
1文字を1ピクセルで表したら鮮明画像だな。

109 :デフォルトの名無しさん:2010/09/17(金) 20:58:53
画質が低くて見れたもんじゃないな。
実用性無いよ。

110 :デフォルトの名無しさん:2010/09/17(金) 21:12:16
でも AT 互換機にカナ漢字を表示する機能は無く、
日本語 MS-DOS だってグラフィックモードで表示してるわけだから、
日本語を使ってる時点でPCGみたいなもんだろ。
ゲーム機のBGみたいなもんじゃん。


111 :デフォルトの名無しさん:2010/09/17(金) 21:16:04
>>95
IOCCC に幾つか有るよな。
でも、ものすごく読みづらくなるだけだから止めたほうがいい。
でも、anderson.c とか結構好きかも。


112 :デフォルトの名無しさん:2010/09/17(金) 21:40:57
キャラクター文字
キャラクター文字
キャラクター文字
キャラクター文字
キャラクター文字

113 :デフォルトの名無しさん:2010/09/17(金) 21:46:10
>>95
gtk+とか、OpenGLとか

114 :デフォルトの名無しさん:2010/09/17(金) 22:51:53
angbandがあるではないか。

115 :デフォルトの名無しさん:2010/09/17(金) 23:07:17
test
int aaaaa(int a){
return a;
}


116 :デフォルトの名無しさん:2010/09/18(土) 00:10:33
>>88
VBに限らず漢字が通る処理系は多い。
っていうか、ソースコードをUnicodeで書けるような処理系なら、
大抵は漢字の関数名も受け付けるだろ。

117 :デフォルトの名無しさん:2010/09/18(土) 00:16:51
vc++も通るね

118 :デフォルトの名無しさん:2010/09/18(土) 00:17:26
>>116
うっ…
やってみたことないけど、もしかしてGCCでも通るのか?w

そんなソースやだー…

119 :デフォルトの名無しさん:2010/09/18(土) 00:22:06
>>83
ちょっと待て。
最後の aishiteru() の呼び出しの前、8000 を足してやらないとまずいんじゃないか?

120 :118:2010/09/18(土) 00:26:14
いや、gccでは通らなかったw
ほっ…w

121 :デフォルトの名無しさん:2010/09/18(土) 11:12:18
vc++限定の話です。
#pragma intrinsicっていうプリプロセッサ指令あるじゃないですか?

これって数学の関数の処理を最適化して高速化するもんですよね?
たとえば、sin,cos,atan2を高速化したければ、

#pragma intrinsic(sin,cos,atan2)ってかけばOKなんですか?

122 :デフォルトの名無しさん:2010/09/18(土) 11:25:06
おk

123 :デフォルトの名無しさん:2010/09/18(土) 11:26:53
>>122
ありがとうございます!最高です!

124 :デフォルトの名無しさん:2010/09/18(土) 16:26:06
デフォでは最適化されてないってことか?


125 :デフォルトの名無しさん:2010/09/18(土) 16:32:57
いや多分FPUを使うかSSE2を使って展開するかの違いとかじゃね?

126 :デフォルトの名無しさん:2010/09/18(土) 17:00:25
アセンブリ出力をみれば分かるじゃん。

127 :デフォルトの名無しさん:2010/09/18(土) 20:31:40
return -1;

128 :デフォルトの名無しさん:2010/09/18(土) 23:22:15
>>124
最適化時のデフォで組み込み対象だが
http://msdn.microsoft.com/ja-jp/library/tzkfha43.aspx

129 :デフォルトの名無しさん:2010/09/18(土) 23:30:10
a = (int ***)malloc(sizeof(int **) * X);
for(i=0; i<X; i++){
____record[i] = (int **)malloc(sizeof(int *) * Y);
}
for(i=0; i<X; i++)
for(j=0; j<Y; j++){
____record[i][j] = (int *)malloc(sizeof(int) * Z);
}

上の動的な3次元配列を取るコードにあるforの二重ループで、
外側の{}を省略して書くのはアリですか
ifの{}を取るのは良く見ますけど、これは見ないので…
こういうコード見た時、どう思います?

130 :デフォルトの名無しさん:2010/09/18(土) 23:41:53
アリ

131 :デフォルトの名無しさん:2010/09/18(土) 23:44:21
たった2文字のために可読性を捨てる意味がわからん

132 :デフォルトの名無しさん:2010/09/18(土) 23:46:07
>>129
ちゃんとインデントされてれば別に何とも。
強いて言えば、修正が要る時、括弧足すのメンドイ。

133 :デフォルトの名無しさん:2010/09/18(土) 23:46:10
アリ。
俺は更にforを一行にする。

134 :デフォルトの名無しさん:2010/09/18(土) 23:50:04
C99世代の俺から言わせて貰うと、
そんなことより、_から始まる変数名の方が気になる。

135 :デフォルトの名無しさん:2010/09/18(土) 23:52:24
インデントのためだろ。

136 :デフォルトの名無しさん:2010/09/19(日) 00:09:22
みなさん、どうもです
>>133
一行派もいたとは

137 :デフォルトの名無しさん:2010/09/19(日) 00:11:33
{}は取るな。必ずつけろ。

138 :デフォルトの名無しさん:2010/09/19(日) 00:13:30
なに気にすることはない

139 :デフォルトの名無しさん:2010/09/19(日) 00:14:35
>>137
俺はチト違う意見。
{}つけないなら徹頭徹尾とことん付けるな。
ソースに一貫性を。

140 :デフォルトの名無しさん:2010/09/19(日) 00:17:53
その前にコード規約守れお前ら

141 :デフォルトの名無しさん:2010/09/19(日) 00:17:57
1行80列制限ももういいだろ。最近はみんなワイドモニターだし。

142 :デフォルトの名無しさん:2010/09/19(日) 00:18:16
規約に書いてなかったらどうすれバインダー

143 :デフォルトの名無しさん:2010/09/19(日) 00:18:31
ソース一貫性厨が一番の害悪。

144 :デフォルトの名無しさん:2010/09/19(日) 00:25:18
>>139
一行のときはつけないで、複数行のときはつけるって規則でやってるけど。

145 :デフォルトの名無しさん:2010/09/19(日) 00:29:04
>>143
よう害虫

146 :デフォルトの名無しさん:2010/09/19(日) 00:32:16
>>144
それがミスを生む原因なのに

147 :デフォルトの名無しさん:2010/09/19(日) 00:38:30
その程度でミスした事無い


148 :デフォルトの名無しさん:2010/09/19(日) 00:42:39
if()if()for(){ なぞ下手にインデント付けたり論理演算で繋ぐより分かり易いと思うがね

149 :デフォルトの名無しさん:2010/09/19(日) 00:43:42
>>147
仕事だとそれを引き継いだバカがミスることまで
考慮せにゃならんのがダルい。

150 :デフォルトの名無しさん:2010/09/19(日) 00:49:58
>>149
そんなこと気にする必要ないよ。

151 :デフォルトの名無しさん:2010/09/19(日) 00:51:04
バカがしたミスのトラブルシュートをさせられるのがダルい
厄介なバグはいつもこっちに回ってくるんだ…

152 :デフォルトの名無しさん:2010/09/19(日) 00:52:34
>>151
結局、やらなきゃならないのは「できる人」だからね…w

153 :デフォルトの名無しさん:2010/09/19(日) 00:53:15
コーディングスタイルの話で
「いや、俺は大丈夫だけどね。これはバカを考慮した書き方。
おれはわかってるよ」
みたいな言い方するやつって、自信ないのかね。

154 :デフォルトの名無しさん:2010/09/19(日) 00:55:01
カッコ付け忘れるレベルのやつにちょっと工夫しても大差ないだろ。

155 :デフォルトの名無しさん:2010/09/19(日) 00:55:58
{}を省略すると何がよくなるのかわからない

156 :デフォルトの名無しさん:2010/09/19(日) 00:56:28
{}を付けて怒られる事は無いが、付けないと規約違反で怒られる事が有る
付けるのを習慣化しておいた方がお得

157 :デフォルトの名無しさん:2010/09/19(日) 00:58:19
{}はずすなら一行に書いたほうがマシ
{}はずして一行なのに改行してインデントすると、
ループ内容に追加が必要なときに{}付け忘れるアホがいるから

158 :デフォルトの名無しさん:2010/09/19(日) 00:59:51
こんな不毛な議論しなくていいように、Pythonを見習ってインデントに意味を持たせたほうがいいな。

159 :デフォルトの名無しさん:2010/09/19(日) 01:02:33
>>157
K&Rは式一行の時に{}なしで改行する書き方多用してたしなあ

160 :デフォルトの名無しさん:2010/09/19(日) 01:05:49
>>153
実際にバカにブチ当たって痛い目を見た。
チームでやる時は一番レベル低い奴に合わせざるを得ない。

ついでに愚痴。
C言語メインで使う職場なのに大半が規格見たこと無いとか何なの。
それで移植性がどーのとかマジ笑わせてくれる。

161 :デフォルトの名無しさん:2010/09/19(日) 01:07:19
>>159
書籍だからな。行の節約だよ。

if (exp){
}

このスタイルも同様。
別に紙に書いてるわけでもないのにこの書式をありがたがってる奴はアホ。


162 :デフォルトの名無しさん:2010/09/19(日) 01:08:52
#define begin {
#define end ;}

これを最初に書いとけば全て解決だろ。


163 :デフォルトの名無しさん:2010/09/19(日) 01:11:05
移植性がどうとか言ってる奴に限って
CHAR_BIT を無視してる、どころか知りもしないというオチ。


164 :デフォルトの名無しさん:2010/09/19(日) 01:17:30
>>159
K&Rは一行じゃなくても省略してるだろ。

165 :デフォルトの名無しさん:2010/09/19(日) 01:20:05
インデントをふつーにしてれば{}を付け忘れるってないけど、
インデントもおぼつかない現場ってのもあるしな。

でも、インデントもできてない所だとそもそも{}をつけるか
付けないかなんてどうでもいいくらい細かいことだな。
つけてもぜんぜん安全にならない。

166 :デフォルトの名無しさん:2010/09/19(日) 01:21:58
int i;
for(i=0;i<10;++i){}
  printf("%d\n",i);

167 :デフォルトの名無しさん:2010/09/19(日) 01:24:53
>>162
それやると、ちょっとネストが深くなるだけでコードが縦横に無駄に伸びる

168 :デフォルトの名無しさん:2010/09/19(日) 01:29:29
>>160
お前みたいのが一番痛い

169 :デフォルトの名無しさん:2010/09/19(日) 13:28:27
ぼくはよく while(i-->0){putchar(i);} ってときでも {} は必ずつけるようにしてる。{}が付いてないと、気持ち悪いと感じるので。個人的に。
if(i>0){} や for(i=0;i<10;i++){} や while(i-->0){} の {} は、ifやforやwhileとセットで、必ずつくものだと考えてる。個人的に。

だから、
if(i>0)
  putchar(i);
のような「リーナスやカーニハン推奨の書き方」を見ると、(これが一般的なのでしょうけど)個人的には気持ち悪いものを感じる。

if(i>0) {
  putchar(i);
}
と、{}を追加して整形したくなってしまうw

あと、個人的には
if(i>0){putchar(i);}
と、一行で書いてしまう方が、読みやすいと思う。(短い場合は)

switchなどは改行せずに、タブで位置をあわせて、行列みたいな形にした方が、読みやすいケースもあると思う。
switch(i) {
case AAA: putchar(aaa);  i++;  break;
case BBB: putchar(bbb);  i++;  break;
case CCC: putchar(ccc);      break;
default:               break;
}
のように。 これらはあくまで個人的な意見。
個人的には「どう書けば自分が読みやすいか?」だけを指標にしている。 
あまり一般的に言われてる「こう書くのが通だ」みたいな記法には、あまり従い過ぎないようにしてる。個人的に。たとえば{}の省略など。

170 :デフォルトの名無しさん:2010/09/19(日) 13:33:25
{}を付けてミスすることは無いが{}を省略してミスすることは多々ある
どっちがいいかなんて一目瞭然。

171 :デフォルトの名無しさん:2010/09/19(日) 13:34:09
心理的にはそれは権力欲、出世欲、自己顕示欲の過剰さの現れだと
いえます

172 :デフォルトの名無しさん:2010/09/19(日) 13:39:27
>>170
コードが間延びして読みにくくなるじゃん。

173 :デフォルトの名無しさん:2010/09/19(日) 13:39:36
引き継いだ奴がミスって聞きにくるかもしれんだろ?面倒は予め潰しておくべきだ

174 :デフォルトの名無しさん:2010/09/19(日) 13:40:59
>>172
お前の価値観ってしょぼいなw
語る、意見する資格ないよ。その内、墓穴を掘るから黙ってな。

175 :デフォルトの名無しさん:2010/09/19(日) 13:41:00
> if(i>0){putchar(i);}

変な工夫しないでとりあえず普通に書けといいたい。

176 :デフォルトの名無しさん:2010/09/19(日) 13:41:45
>>175 = >>172 だからお前みたいな素人の主観なんて
浅はかな意見で下らないんだよw

177 :デフォルトの名無しさん:2010/09/19(日) 13:42:30
>>173
インデントをしてればミスなんてしないだろ。

コーディングスタイルの話になると、安全側に倒すのが正義みたいに
過剰なスタイルを勧めるやつが多いな。

178 :デフォルトの名無しさん:2010/09/19(日) 13:42:56
Cは兎も角C++では一つの識別子スコープを作るのだから
たんなる飾りじゃない。意味を持つので付ける
付けないの趣味レベルの問題じゃなく、一定のルールに
基づいたものでなければならない。

179 :デフォルトの名無しさん:2010/09/19(日) 13:45:26
>>176
実践的にコードを書いてる人のスタイルを参考にしたほうがいい。

ろくなコードも書いたことがないやつが机上の空論でこうしたら
安全とか読みやすいとか考えてるから
> if(i>0){putchar(i);}
みたいな、変な書き方思いつくんだろ。
コードで個性なんか主張しなくていいよ。

180 :デフォルトの名無しさん:2010/09/19(日) 13:45:47
いるよな、昔の名残で1文字1バイトも無駄にしないという
変な根性を現代の水準で語る時代遅れのバカってw
可搬性や効率化を考えたら、例え1行だろうと
あれこれ変更しないで、一貫して自分が思うなら
そのスタイルを押し通せば良いだけ。他人に意見をするというのは
自分の都合や主観が通用しないことばかり。
あんた、他人とコードのやり取りをしたことある?
その際、流れに問題がないのに本題からズレた、ここが見づらいだの
逐一そんなことでケチをつけるのかね?w
大人気ない、精神レベルが低いまま年を取った爺の典型的な悪い体質だなw
お前、大物には成れずにこの世を去るよ?どうせ誰もがいつかは死ぬ。
お前がこんな場所でネット弁慶をやっていたことを知る人は、どれだけ
いるんでしょうね・・・匿名で、2ちゃんで多数書き込んでいても有名にはなれませんよ?
お前という存在はちっぽけで歴史に名の残らない雑魚だから、せいぜいここで
自分未満の人間を見つけては偉そうにしてなさいw

181 :デフォルトの名無しさん:2010/09/19(日) 13:46:02
for(int i=0; i<10; i++)
  puts("fuck!");

      ↓

for(int i=0; i<10; i++)
  for(int j=0; j<10; j++)
    puts("fuck!");

こういうことするじゃんおまいら

182 :デフォルトの名無しさん:2010/09/19(日) 13:46:02
>>177
この話題に関してはインデントしてあっても防げないんじゃね?というかインデント関係なくね?

183 :デフォルトの名無しさん:2010/09/19(日) 13:46:40
for(i=0;i<16;i++)
a[i]^=(d[i]+c[i])%16;
このプログラムをSSE2で書きたいのですがわかりません。
教えてください。よろしくお願いします。
C言語からインラインアセンブラで呼び出したいと思うのですが、
うまくいきません。
moveq d,%xmm0
moveq c,%xmm1
paddb %xmm1,%xmm0
moveq a,%xmm1
pxor %xmm1,%xmm0
配列のデータをレジスタにセットするところもわかりません。

184 :デフォルトの名無しさん:2010/09/19(日) 13:46:43
if(i > 0)
    putchar(i);

この書き方だとputchar(i);の下にインデントして追加したものも
ifの分岐で実行すると勘違いするヤツがいる、っていうかいた。

185 :デフォルトの名無しさん:2010/09/19(日) 13:48:06
>>181
おれは一行のときだけ{}を省略で、複数行のときは
省略しないってルールでやってる。

186 :デフォルトの名無しさん:2010/09/19(日) 13:48:22
インデントで構文を判断する馬鹿がいるかー!

187 :デフォルトの名無しさん:2010/09/19(日) 13:50:11
>>185
そのやり方だと行を追加したときにミスが発生しやすいって話だろが

if(true)
  putchar(10);
  putchar(11);


188 :デフォルトの名無しさん:2010/09/19(日) 13:51:00
実際、{ }に起因するバグなんて大した問題じゃない。

問題が分かりやすいからド素人がキャーギャー騒いでいるだけ。

189 :デフォルトの名無しさん:2010/09/19(日) 13:51:34
>>182
いや、{}の付け忘れなんてインデントしてればしないんじゃね?

インデントもおぼつかない現場があるのが知ってるけど、そういう
ところは{}をどうこう以前に、ほかにやることあるだろって感じだよね。

190 :デフォルトの名無しさん:2010/09/19(日) 13:52:33
ぎゃはははは ぶははははは
長年自分が決め込んだスタイルが絶対正しいと思い込む
時代遅れの爺が必死だぜw
お前らもう二度と人間社会で活躍する時代は来ないなw
後は余生を静かに2ちゃんでネット弁慶して過ごせよ
人類の歴史に名の残らない雑魚ちゃんたちw

191 :デフォルトの名無しさん:2010/09/19(日) 13:53:58
>>187
いや、コード書いてるやつならわかるだろうけど、
そんなミスしないだろ。

こういう話になると、プロは10年に一度のミスにも備えて
コーディングするとか、安全側に倒すのが正義みたいな話に
なるんだろうけど。

192 :デフォルトの名無しさん:2010/09/19(日) 13:55:03
>>188
そうだな。
もしミスっても、こんなんでハマったりもしないしな。

193 :デフォルトの名無しさん:2010/09/19(日) 13:55:47
コーディングルールを作る側なら、それなりの理由を用意してくれ
コーディングルールに従う側は、(腹でどう思おうが)従うだけだが、説得力が欲しいぜ
プライベートでコード書く時はお好きにどうぞ

これだけのことでしょ

194 :デフォルトの名無しさん:2010/09/19(日) 13:56:51
>>189
どうも>>173への解釈が俺とお前で違ったらしい
{}無しif文で{}付けずに文を追加して、動作がおかしくなって聞きに来た人のことかと思った

195 :デフォルトの名無しさん:2010/09/19(日) 14:00:50
>安全側に倒すのが正義みたいに
>過剰なスタイルを勧めるやつが多いな。

>コーディングするとか、安全側に倒すのが正義みたいな話に
>なるんだろうけど。

やだ・・・何言ってるかわからない・・・

196 :デフォルトの名無しさん:2010/09/19(日) 14:00:57
ようするにPythonの文法は素晴らしいってことだな

197 :デフォルトの名無しさん:2010/09/19(日) 14:02:20
投機的な局所安全対策も度が過ぎたら全体的な観点からは
酷い危険に晒されるという例は歴史上枚挙に暇が無いってこ
と知ってる?

198 :デフォルトの名無しさん:2010/09/19(日) 14:03:07
>>141 みたいな意見もどうかと思うぞ。
改行コードを入れなくても自動的に、エディタの横幅に応じて
改行表示してくれるものを使えば良い。
使える手段を知らない、選ばない時代遅れの連中の意見は
実に現代では通用しないことかw
もう少し、世の中を幅広く見ましょうね?お前が知っている
あるいは視野の狭い考えでは通用しないどころか
変な手間や負担を被りますよ?

199 :デフォルトの名無しさん:2010/09/19(日) 14:03:17
if (expr) func();

if (expr)
{
 func();
}
も両方使うけどな。

要は処理の流れの問題じゃないか?
ちょっとした例外処理を1行で済むのに4行もかけて、
メイン処理始まるまでにダラダラと長くなるのは嫌いだ。


200 :デフォルトの名無しさん:2010/09/19(日) 14:03:38
>>197
具体例を聞こうか

201 :デフォルトの名無しさん:2010/09/19(日) 14:04:40
> {}を省略してミスすることは多々ある

あるか?????

しかも、多々だと???

if(i > 0)
putchar(i);

↑これが↓こうなる時、

if(true)
  putchar(10);
  putchar(11);

↓これを、目をつぶってでもぶち込んでるのか?

  putchar(11);

前後の文脈一切気にしないのか?
そんな一か八かの書き方してるようじゃ、
今後どうにもならないぞ。基礎の基礎。


202 :デフォルトの名無しさん:2010/09/19(日) 14:05:27
>>198
なんか言ってる事がおかしくね?どういうこと?

203 :デフォルトの名無しさん:2010/09/19(日) 14:05:33
>>196
20年くらいまえにpascalのbegin endをどの位置に置くかってのを
議論した文章を読んだら、インデントで制御構造が認識できるから
いっそ、begin endなくせばよくね?
って意見があって、だいぶたってpythonを見たとき、ほんとうに
やりやがったって思った。

204 :デフォルトの名無しさん:2010/09/19(日) 14:05:47
>>197
歴史は知らないが、商品開発では
選択肢があったら安全側に倒すのが超基本。

205 :デフォルトの名無しさん:2010/09/19(日) 14:05:58
>>201
まてお前上で書いてんのか?それにびっくりだ

206 :デフォルトの名無しさん:2010/09/19(日) 14:08:57
>>201
だってそういうミスする人いるんだからしょうがないじゃん。

207 :デフォルトの名無しさん:2010/09/19(日) 14:09:14
80桁の制限はCだといいけど、javaとかC#だときつい。
ネームスペースのインデントがあって、クラスのインデントがあって
メソッドのインデントがあってって、いきなりインデント深くなってるしな。

208 :デフォルトの名無しさん:2010/09/19(日) 14:10:39
>>205
書いてない。>>184 >>187のやりとりに横槍。
なんだかしらんがいくらなんでもそりゃねえべ、という話。

209 :デフォルトの名無しさん:2010/09/19(日) 14:11:53
80桁制限はだいぶ古臭いな。
100桁ぐらいはないと読みにくくなりすぎる。

210 :デフォルトの名無しさん:2010/09/19(日) 14:14:12
あらゆるミスを想定してたらきりがない

 if (i .> 0) ;
 {
  putcjar(i);
 }

211 :デフォルトの名無しさん:2010/09/19(日) 14:14:14
>>204
比較的単純な装置/機械では、安全側に収束するような設定に
統一するのが基本だが、ある程度大規模/複雑になった場合必ずしも
そうとは言いきれない。この分岐点の見極めは超難しい。
システムアナリストクラスの役職者の判断事項。
むやみに大規模化/複雑化しないことを心掛けることのほうが
ずっと効果的

212 :デフォルトの名無しさん:2010/09/19(日) 14:17:31
if (expr) func();

この程度のコードを

if (expr)
{
 func();
 func2();
 ・・・
}

と変更したくなるってのは、そもそもifの中身を別関数に分けなきゃいけない兆候

213 :デフォルトの名無しさん:2010/09/19(日) 14:21:37
極論でたあああああ

214 :デフォルトの名無しさん:2010/09/19(日) 14:21:45
別にフォーマットなんて何でもよくね?
決まりがあるなら従えばいいだけじゃん
ただ使いやすいフォーマッタとかは用意してほしいと思うな

215 :デフォルトの名無しさん:2010/09/19(日) 14:22:22
>>212
それはモジュール設計の話で、構文や書式とは別問題。

216 :デフォルトの名無しさん:2010/09/19(日) 14:23:58
{}をつけることのどこか過剰なのか意味不明。つけりゃいいじゃん。

217 :デフォルトの名無しさん:2010/09/19(日) 14:26:32
>>210
やはりPythonはすばらしいな


218 :デフォルトの名無しさん:2010/09/19(日) 14:27:42
>>215
メイン処理は1行でも{}に分けて書く
主要でない処理は1行なら省略構文を使う

要は{}によって処理の流れを分かりにくくしてないか、という問題

219 :デフォルトの名無しさん:2010/09/19(日) 14:30:45
{}で処理の流れがわかりにくくなる?

220 :デフォルトの名無しさん:2010/09/19(日) 14:33:37
省略構文をつかったらミスが増えるとか、そんなのは些細な問題だと言っている

221 :デフォルトの名無しさん:2010/09/19(日) 14:36:18
ミスが増えるのが些細な問題なわけないしね。

222 :デフォルトの名無しさん:2010/09/19(日) 14:38:09
実際にミスが増えたことあるの?
起こらない問題(たまたまおこっても一瞬で解決する問題)についてあーだこーだ言ってもしょうがない

223 :デフォルトの名無しさん:2010/09/19(日) 14:39:51
制御文の影響範囲を取り違える事故が頻発したのは
Cより前のFORTRANとかの時代の話
Cではそれは激減した。代わりに、識別子乱造に
よる取り違い事故が激増した
FORTRAN時代は一つの変数を複数の用途に
使い分けるのが常識な時代(メモリが兎に角少なく高価だった)
それが原因でスパゲッティプログラミングが避けられなかった

224 :デフォルトの名無しさん:2010/09/19(日) 14:40:16
>たまたまおこっても一瞬で解決する問題

すぐ解決できるから対策無しでいいですよね^^


225 :デフォルトの名無しさん:2010/09/19(日) 14:40:22
143 名前:デフォルトの名無しさん 投稿日:2010/09/19(日) 00:18:31
ソース一貫性厨が一番の害悪。
↑一貫性の無い自分が一番の害虫だと気づかないアホ

226 :デフォルトの名無しさん:2010/09/19(日) 14:41:10
>>224
省略構文禁止が何かの対策になってると思ってるのがすごく残念

227 :デフォルトの名無しさん:2010/09/19(日) 14:42:13
>>216>>220のどっちに重きを置くなんて趣味の問題でどっちでもいいんだよ

228 :デフォルトの名無しさん:2010/09/19(日) 14:44:27
>>226
同意。今から家建てます。さあ大変です。

「休憩時間に食べるポテチの袋を開けるとき、
ハサミを使ったほうが安全だよ!
手で開けたら開けにくいときあるし!」

棟梁「…そっすね('A`)」

229 :デフォルトの名無しさん:2010/09/19(日) 14:45:30
構文制限によるミス防止規約なんてどこにでもあると思うけど
お前らのところはそういうの無いの?

230 :デフォルトの名無しさん:2010/09/19(日) 14:46:36
セミコロンがあるとか無いとか、括弧がどうのこうのとか
特殊なマクロ使ってる時ぐらいしか問題にならないなあ。

231 :デフォルトの名無しさん:2010/09/19(日) 14:51:34
>>229
コードの見た目をある程度統一するための規約や
本当にややこしいことになる問題についての制限(グローバル変数とか体重継承やヘッダでのusingとか)はある。

過度な命名規則とか、省略構文がどうのこうのとかは、古臭い

232 :デフォルトの名無しさん:2010/09/19(日) 14:51:40
少なくとも{}を付けていれば些細なミスでさえ起こり得ない。
であれば、どう考えても付けたほうが合理的。
省略派は、たった2文字のために他人の眼力に頼るというただの甘ちゃんである。
そしていざ問題が起きたとき、「見抜けなかったお前が悪い(オレは悪くない)」と言い張る。
もっとも迷惑なタイプ。

233 :デフォルトの名無しさん:2010/09/19(日) 14:52:55
> そしていざ問題が起きたとき

この業界もう十年おりますし、コードも二十万行くらい書きますたが、
一度たりともその問題とやらに出会ったことはありません。
一度たりともです。

234 :デフォルトの名無しさん:2010/09/19(日) 14:53:37
うちは結構あるわ

235 :デフォルトの名無しさん:2010/09/19(日) 14:55:13
コードの問題ってほとんど、設計や性能の問題であって性質が悪い。
{}で防げるようなものってお目にかからない。

236 :デフォルトの名無しさん:2010/09/19(日) 14:55:40
>>225
そんなに悔しかったのかw

237 :デフォルトの名無しさん:2010/09/19(日) 14:58:20
>>223
ま。勝利と栄光に満ちたC黎明期の頃からの伝統が{}という
ことで...

238 :デフォルトの名無しさん:2010/09/19(日) 15:00:10
>>233
7年仕事でC書いてるけど、2回ほどあった。
世の中いろんな人が居るんだよ・・・

239 :デフォルトの名無しさん:2010/09/19(日) 15:01:33
まあ、C言語初めて1ヶ月ですみたいな奴がいっぱいいたら
規約でガチガチに固めても良いと思うけどな。

数人だったら、教育係つけてコードレビューでもした方が良い。

240 :デフォルトの名無しさん:2010/09/19(日) 15:01:33
K&Rを神聖視する古臭い人間ほど省略したがるよね

241 :デフォルトの名無しさん:2010/09/19(日) 15:03:14
で、規約を覚えるのに6ヶ月かかるわけだ。

242 :デフォルトの名無しさん:2010/09/19(日) 15:04:23
>>238
まだ3年ほどしか仕事してないけど既に2度ほど見た

243 :デフォルトの名無しさん:2010/09/19(日) 15:04:23
google先生ですら結構書式細かく決めてるからな〜

244 :デフォルトの名無しさん:2010/09/19(日) 15:04:30
中括弧省略でうんぬんしちゃう奴を、現場投入しちゃダメだ。
最低限そこをクリアしてないと話しにならない。

245 :232:2010/09/19(日) 15:07:10
>>244ほらなw

246 :デフォルトの名無しさん:2010/09/19(日) 15:07:37
だったら人材の選定の規約作れよ

247 :デフォルトの名無しさん:2010/09/19(日) 15:08:02
趣味で10年その後仕事で10数年使って相当コード書いてきたけどどっちでもいいと思うぞ

248 :デフォルトの名無しさん:2010/09/19(日) 15:09:04
if (100 == n) とか
定数を左におくのも、じっさいコードを書いてれば分かるけど
=と==の間違いなんてしないのに、万が一したらどうするんだって
言い張るよな。

そんなめったにしないミスのために変なコード書くことはないよ。

249 :デフォルトの名無しさん:2010/09/19(日) 15:10:16
それ自分の周りでたまたま起こらなかっただけじゃね?

250 :デフォルトの名無しさん:2010/09/19(日) 15:10:56
自分は間違えない→他人も間違えるハズがない
自分は使いこなせる→他人も使いこなせて当然

まあプログラマには多いんだわこのタイプw

251 :デフォルトの名無しさん:2010/09/19(日) 15:12:51
中括弧省略でうんぬんしちゃう奴は、
根本的に問題を抱えている。
注意力が足りなさ過ぎるか、
構文の理解が欠けているかだ。

ネジがボロボロあまった自動車で走り出すようなもの。

252 :デフォルトの名無しさん:2010/09/19(日) 15:14:01
>>250
それは違う。こっちの方が遥かに多い。

自分は間違えない→他人は間違えるから対策してやろう ⇒実際は自分も間違える
自分は使いこなせる→他人は使いこなせないから対策してやろう ⇒実際は自分も使いこなせない

253 :デフォルトの名無しさん:2010/09/19(日) 15:14:36
=と==はたまーーにあるかなあ

254 :デフォルトの名無しさん:2010/09/19(日) 15:15:31
別言語と同時に扱ってるケースだとたまにやっちゃう事もあるが
最近のコンパイラはまず警告出すから特にメリットない

255 :デフォルトの名無しさん:2010/09/19(日) 15:15:55
= と == くらい lintが検出するから、それでソースを汚す必要は全くない。

256 :デフォルトの名無しさん:2010/09/19(日) 15:16:57
>>252
それは結局対策されてる訳で
特に問題が起きないから別にいいのでは。

257 :デフォルトの名無しさん:2010/09/19(日) 15:18:53
>>256
別に良し悪しを言ってるわけじゃないから。そういうタイプが多いというだけ。

258 :デフォルトの名無しさん:2010/09/19(日) 15:19:04
実際現場のプログラマーのレベルはピンキリな事が多いから、静的解析は必要だね

259 :デフォルトの名無しさん:2010/09/19(日) 15:19:40
そーゆーのって自動車教習所で習うレベルのこと
「運転手がシートベルトを閉める場合は、右ハンドル車で
は必ず右手で持っていって嵌め込むこと。体が自然に左に
ねじれてアクセルペダルよりもブレーキペダルのほうが
踏みやすくなるから。逆に左手で閉めると右にねじれて
アクセルのほうが踏みやすくなる」

260 :デフォルトの名無しさん:2010/09/19(日) 15:22:44
>>259
だからどうしたんだよ。
そんなレベルの奴が現場にいるなんていくらでもあるわ。

261 :デフォルトの名無しさん:2010/09/19(日) 15:26:12
資格がないとやっちゃいけない という類のものじゃないからな
教育や規約で想定レベルを保たないと

262 :デフォルトの名無しさん:2010/09/19(日) 15:26:42
{}は制御影響範囲や名前有効範囲の取り違え事故防止の
為につけられたもの
そのココロを忘れないことが大事で効果を妄信して
機械的公式的無造作に使っても効果が無いどころか
逆効果の場合もあったりして....

263 :デフォルトの名無しさん:2010/09/19(日) 15:27:19
俺は
if ( ... );
{
  ...;
}
ってコードで先生if文が動きません!、って最近言われた

264 :デフォルトの名無しさん:2010/09/19(日) 15:32:09
そんなに{}を付けたいなら、全部、S式+前置記法で書けばいいだろ。

265 :デフォルトの名無しさん:2010/09/19(日) 15:33:35
そして極論に逃げると

266 :デフォルトの名無しさん:2010/09/19(日) 15:34:20
>>262
例えば?

267 :デフォルトの名無しさん:2010/09/19(日) 15:36:51
参考サイト、聞くべきスレを教えてください。
VisualStudio2005でGUIを作りたいと思っています。


268 :デフォルトの名無しさん:2010/09/19(日) 15:38:21
CだけでGUI作るのは辛いと思うけど
C++できた方がいい

269 :デフォルトの名無しさん:2010/09/19(日) 15:41:01
C#でいいよ。

270 :デフォルトの名無しさん:2010/09/19(日) 15:42:08
>>250
まあでもケアレスミスにしたって{}付け忘れとかないでしょ。


271 :デフォルトの名無しさん:2010/09/19(日) 15:42:25
そうでした、ここはCのスレでしたね。
C++でやろうと思っています


272 :デフォルトの名無しさん:2010/09/19(日) 15:51:29
ならC++スレへ

273 :デフォルトの名無しさん:2010/09/19(日) 15:52:05
>>270
実際見た事あるから困る

274 :デフォルトの名無しさん:2010/09/19(日) 16:01:50
C#やC++のスレにいきましたが、C知らなきゃお話に
ならないと追い出されて戻ってきました。

275 :デフォルトの名無しさん:2010/09/19(日) 16:07:18
>>274
だまされるな。
Cは知らなくてもOK。

276 :デフォルトの名無しさん:2010/09/19(日) 16:08:19
>>274
お話にならないヤツはお話しなければいいだけ。そんなヤツ捨て置け。

277 :デフォルトの名無しさん:2010/09/19(日) 16:09:16
他の言語を知っとくに越したことはないというレベルで、Cも知ってた方がいいって感じだと思う

278 :デフォルトの名無しさん:2010/09/19(日) 16:18:08
どの道、基本はデジタルデータの処理になるからね。
演算子も共通して使えるし。

279 :デフォルトの名無しさん:2010/09/19(日) 16:19:56
他言語を「なまじ」知っていると変てこな信仰心が邪魔になるだけだが
C++ に限っては C との相違を知らないと意味わかんねーの沢山あるからな
もっと言えば歴代 C++ の相違まで知っていたほうがいい

280 :デフォルトの名無しさん:2010/09/19(日) 16:20:35
>>274
まったく知らないというのではダメだろうが
現在なら教育環境や高性能IDEも充実してきているので
Cを知り尽くさないとダメということも
ないしCはそれなりに奥が深く、知り尽くそうなんて
考えると一生GUIは無理(Cでは残念ながらGUI構築は
アクロバティックなことを避けられない)

281 :デフォルトの名無しさん:2010/09/19(日) 16:28:33
> Cでは残念ながらGUI構築は
> アクロバティックなことを避けられない

C++ でも vtbl を自作したり reinterpret_cast みたいな極悪プレーが出てくるけど
そのへん C では素直だねー

282 :デフォルトの名無しさん:2010/09/19(日) 16:30:26
C知らないとどうのこうのとアホなことを言っているのは、老人が自分の出自を重ねたがってるだけだ。
そんなこと全く聞く必要ない。

C++はC++だけ、C#はC#だけで、言語としては完全に独立して学べる。

他言語との対比で理解が深まることもあるだろうが、それがCである必要はない。

283 :デフォルトの名無しさん:2010/09/19(日) 16:44:19
Cを「やらされる」ことはあるかもしれないから
そういう時違いが分かってると楽だというのはある

284 :デフォルトの名無しさん:2010/09/19(日) 16:44:41
WinのC#でGUIだと今んとこ最終的にはWin32APIの壁が
出て来るからちょっと事情が違うかも。

285 :デフォルトの名無しさん:2010/09/19(日) 16:47:27
で、結局省略構文の是非はどうなったの

286 :デフォルトの名無しさん:2010/09/19(日) 16:49:58
Pythonを「やらされる」ことはあるかもしれないから
そういう時違いが分かってると楽だというのはある

APLを「やらされる」ことはあるかもしれないから
そういう時違いが分かってると楽だというのはある

COBOLを「やらされる」ことはあるかもしれないから
そういう時違いが分かってると楽だというのはある

Goを「やらされる」ことはあるかもしれないから
そういう時違いが分かってると楽だというのはある

287 :デフォルトの名無しさん:2010/09/19(日) 16:50:33
>>285
     _人人人人人人人人人人人人人人人_
     >     わりとどうでもいい      <
      ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^^Y^ ̄

               ヘ(^o^)ヘ 
                  |∧   
                 /

288 :デフォルトの名無しさん:2010/09/19(日) 17:12:36
>>280
>Cでは残念ながらGUI構築は
>アクロバティックなことを避けられない

それはおまえが無能なだけだろ。
自分に設計能力が無いのを言語のせいにするな。


289 :デフォルトの名無しさん:2010/09/19(日) 17:17:06
>>281
C:インターフェース、仕様変更は設計時のみ可能。
いったん開発に入ったら仕様変更は不能に近い、
運用中の仕様変更は論外(版を重ねるごとに悪くなって崩壊)

C++,C#:設計時、開発作業中のインターフェース、仕様変更もある程度可能
運用投入後はマイナーチェンジリビルド以外はタブー

Webアプリ:運用中に常時変更可能

こういった程度の違いはあるだろう

290 :169:2010/09/19(日) 17:20:38
配列の参照や、ポインタのアドレスそうさなどで

zzzzzzzzzz = aaaaaaaaaa[bbbbbbbbbb + cccccccccc + dddddddddd + eeeeeeeeee + ffffffffff + gggggggggg + hhhhhhhhhh + iiiiiiiiii];

たとえば、添字の中の文字数が多くて、80行(もしくは、使ってるエディタの横幅)を大きく越えてしまう場合。
改行をして書き換えると思います。

この場合の作法にも、ひとそれぞれ、いろいろありそうな気がします。
たとえばボクなら
zzzzzzzzzz = aaaaaaaaaa[
    bbbbbbbbbb +
    cccccccccc +
    dddddddddd +
    eeeeeeeeee +
    ffffffffff +
    gggggggggg +
    hhhhhhhhhh +
    iiiiiiiiii
];
こうすると思います。 もしくは
zzzzzzzzzz = aaaaaaaaaa[
    bbbbbbbbbb + cccccccccc + dddddddddd + eeeeeeeeee + ffffffffff + gggggggggg + hhhhhhhhhh + iiiiiiiiii
];

こういう場合の正しい書き方をご存知の方はいますか? ほんとうはどうやるのが正解ですか?
また同様に関数の場合、 aaaaaaaaaa(bbbbbbbbbb, cccccccccc + dddddddddd, eeeeeeeeee + ffffffffff + gggggggggg);
などの場合は、どうやって改行しますか? ()の位置、インデントの仕方、演算子の位置、もろもろ、正しい(もしくは一般的な)方法はどんなですか?
後学のために、プロフェッショナルなみなさんの方法を、ぜひ聞きたいです。

291 :デフォルトの名無しさん:2010/09/19(日) 17:26:27
変数の長さを短くする

292 :デフォルトの名無しさん:2010/09/19(日) 17:28:16
専用のテンポラリ変数を作る。
使いまわしはしない。

293 :デフォルトの名無しさん:2010/09/19(日) 17:30:16
>たとえば、添字の中の文字数が多くて、80行(もしくは、使ってるエディタの横幅)を大きく越えてしまう場合。
>改行をして書き換えると思います。

そんなデータ構造は100%設計がおかしい
したがってそんなケースはありえない

294 :デフォルトの名無しさん:2010/09/19(日) 17:30:55
横1行でいいよ。

295 :デフォルトの名無しさん:2010/09/19(日) 18:19:08
インデックスを変数に入れた方がデバッグしやすいよ

296 :デフォルトの名無しさん:2010/09/19(日) 18:19:51
-O3 -ftree-vectorize -ftree-vectorizer-verbose=5 -mmmx -msse3

297 :デフォルトの名無しさん:2010/09/19(日) 18:44:15
自分の環境で1行に納まり切らないからと、勝手に改行してしまう奴はクズである。
折り返しというものは、各環境でビューワーが行なうべきものであって、折り返しを改行でコントロールしようなどと考えるのは完全に誤りである。
折り返しと改行はまったく別のものである。それを区別することもできない厨は小学校からやり直してくるべきである。


298 :デフォルトの名無しさん:2010/09/19(日) 18:46:21
ブログに帰れw

299 :デフォルトの名無しさん:2010/09/19(日) 18:50:37
コーディングスタイルを強要するなら、Pythonのようにインデントや改行に意味を持たせたほうがいい。

言語仕様外でプログラマーが気を使わなければいけないのなら、それは欠陥言語だ。

300 :デフォルトの名無しさん:2010/09/19(日) 18:55:17
Windows のドキュメ
ントの先頭には大抵
書いてあるよな。
このテキストをメモ
帳で見る場合には、
メニューから折り返
し設定を……、
云々って。
中途半端に桁数を決
められてると、それ
を僅かに下回った環
境で読むときの乱れ
が半端ないもんな。


301 :デフォルトの名無しさん:2010/09/19(日) 19:03:02
携帯電話か

302 :デフォルトの名無しさん:2010/09/19(日) 19:09:04
return 0;

303 :デフォルトの名無しさん:2010/09/19(日) 19:09:40
>>297は正しい。同じ問題はwebの記事やレイアウトにも存在する。
改行は「意味の終わり」に付けるものであって、レイアウトが目的ではない。

304 :デフォルトの名無しさん:2010/09/19(日) 19:12:36
>>297は正しい。」で意味終わってないの?

305 :デフォルトの名無しさん:2010/09/19(日) 19:13:10
それなら>>299の言うように、改行に意味を持たせればいいじゃん

306 :デフォルトの名無しさん:2010/09/19(日) 19:22:03
インデントも折り返しもC言語としては何の意味も持たない
# で始まる行以外は全部一行にしてしまえ

307 :デフォルトの名無しさん:2010/09/19(日) 19:24:24
C99 なら // もあるだろ。

308 :デフォルトの名無しさん:2010/09/19(日) 19:24:28
>>306
つ//コメント

309 :570:2010/09/19(日) 19:26:19
>>307
return -1;


310 :デフォルトの名無しさん:2010/09/19(日) 21:28:39
ビットマスクについての質問です。
a%16=a&0xf
にしたいのですがどうすればいいですか?
同じ演算結果を得るためにバイトデータの下位4ビットを抽出したいです。
よろしくお願いします。

311 :デフォルトの名無しさん:2010/09/19(日) 21:30:52
aを4ビット以上の符号なし整数にすればいいんじゃないの?

312 :デフォルトの名無しさん:2010/09/19(日) 21:33:17
結果が一致しません。

for(i=0;i<16;i++){
a[i]^=((b[i]+c[i])&15);
d[i]^=(b[i]+c[i])%16;
printf("%d %d\n",a[i],d[i]);
}

313 :デフォルトの名無しさん:2010/09/19(日) 21:37:53
元が違うんだろ。

314 :デフォルトの名無しさん:2010/09/19(日) 21:38:43
負の数にでもなってんだろ

315 :デフォルトの名無しさん:2010/09/19(日) 21:39:48
for(i=0;i<16;i++){
printf("%d %d\n",a[i],d[i]); //☆☆☆
a[i]^=((b[i]+c[i])&15);
d[i]^=(b[i]+c[i])%16;
printf("%d %d\n",a[i],d[i]);
}

これを見てみたいな。

316 :デフォルトの名無しさん:2010/09/19(日) 21:42:07
a[i]とd[i]が0で初期化してないオチだと興ざめだな

317 :デフォルトの名無しさん:2010/09/19(日) 21:52:28
同じになりました。dの値が0で初期化されてました。
d=aをしたら一致しました。
軽く質問されたのであわてて動作確認をしたら違っていたので
今までのビットマスクの知識が間違っていたのかと思いました。

318 :デフォルトの名無しさん:2010/09/19(日) 22:01:03
興ざめだ。

319 :デフォルトの名無しさん:2010/09/19(日) 23:39:28
>>183
http://codepad.org/UHWwncjm

当方linuxなのでgcc4.5のコードなので、たぶんインラインアセンブラの順序がうぃんどうずとは逆だとおもいますが、
よくわからないですけど、%16 ってのは 16で割った余りってことなのでしょうけど、sseには整数除算の余りの命令が無いっぽい??ので固定小数で代用しちゃったけど
これ、ちゃんと動いてるか不安です(笑)。はてさて?
まちがってたらごめんんなさい。 あと、インデントはすごく個人的な方言で書いてしまいました。よみずらくてすみません。(ぺこり)

320 :319 コメントです(まちがってたらごめんなさい):2010/09/19(日) 23:47:16
配列bの先頭から16バイト分までの範囲を、xmm0レジスタにコピー
配列cの先頭から16バイト分までの範囲を、xmm1レジスタにコピー
movdqa (%1), %%xmm0;
movdqa (%2), %%xmm1;

xmm1レジスターと、xmm0レジスターを、char型の16個の配列としてあつかい、
各インデックスのchar同士(たとえば b[0]+c[0] や b[3]+c[3]など)を、
16個を一回の命令で一気に足し算する。
足し算の結果はxmm0レジスターに入る。
paddb %%xmm1, %%xmm0;

8bit中の下位4bitのマスク(00001111)の配列を、
先頭から16バイト分までの範囲をxmm1レジスターにコピー。
movdqa (%3), %%xmm1;

配列b + 配列c の演算結果 xmm0 の各バイトを、
マスクによって、各バイトの下位バイト以外を0にする。(00001111)
これを mod 16 計算の代用とする。 (sseにはバイト整数型の除算命令が無いので)
演算結果はxmm0レジスターに入る。
pand %%xmm1, %%xmm0;

配列aの先頭から16バイト分までの範囲を、xmm1レジスタにコピー
movdqa (%0), %%xmm1;

配列xmm1レジスターと、xmm0レジスターを、char型の16個の配列としてあつかい、
各インデックスのchar同士を、16個を一回の命令で一気にXORする。
XORの結果はxmm0レジスターに入る。
pxor %%xmm1, %%xmm0;

演算結果を、配列aの先頭から16バイト分までの範囲に、一気にコピーする。
movdqa %%xmm0, (%0);

321 :デフォルトの名無しさん:2010/09/19(日) 23:58:47
unsigned charにすると自動ベクトル生成に失敗します。
-O3 -ftree-vectorize -ftree-vectorizer-verbose=5 -mmmx -msse2
ありがとうございます。やってみます。
因みに自動生成されたアセンブラは-O3だけのときより大きくて10倍
位遅いです。やはり手動で書くしかないのでしょうか。

322 :デフォルトの名無しさん:2010/09/20(月) 00:18:54
最適化オプションは -O1 しか使わないな。


323 :デフォルトの名無しさん:2010/09/20(月) 00:21:55
(´・ω・`)もうっ!

324 :デフォルトの名無しさん:2010/09/20(月) 00:24:11
2ぐらいまでは信じてあげてもいいんじゃないか

325 :デフォルトの名無しさん:2010/09/20(月) 00:28:22
(´・ω・`)もうっ!

326 :デフォルトの名無しさん:2010/09/20(月) 00:48:30
なんだなんだ
Cで書くかアセンブラで書くかスレの誤爆か?

327 :デフォルトの名無しさん:2010/09/20(月) 01:22:20
>>324
いや、ループ展開するとかやめてくれって感じ。
せっかく冗長のない綺麗なソースコード書いても、実際の生成されたコードで汚くされたらたまらんよ。


328 :デフォルトの名無しさん:2010/09/20(月) 01:33:24
お前馬鹿だろ

329 :デフォルトの名無しさん:2010/09/20(月) 01:33:31
ループのアンロールも知らない素人か

330 :デフォルトの名無しさん:2010/09/20(月) 01:35:42
美味しそう
http://art4.photozou.jp/pub/483/184483/photo/17562551.jpg

331 :デフォルトの名無しさん:2010/09/20(月) 01:55:02
因みにこれが本体です。
一億バイト生成するのに9秒かかります。これを何とかしたいです。

for(k=0;k<500000;k++){
for(j=0;j<16;j++){
for(i=0;i<16;i++){
d1[i]^=GF[((FG[a[j]]-1)+(FG[h1[i][FG[b[j]]]]-1)&0xff)+1];
d2[i]^=GF[mlt(FG[a[j]],FG[h2[i][FG[b[j]]]])];
}
}
for(i=0;i<16;i++)
a[i]^=(d1[i]+c[i])&0xff;

for(i=0;i<16;i++)
b[i]^=(d2[i]+c[i])&0xff;
/*
for(i=0;i<16;i++)
printf("%d %d",d1[i],d2[i]);
printf("\n");*/
//#p @d
}


332 :デフォルトの名無しさん:2010/09/20(月) 01:56:36
こいつぁすげえや

333 :デフォルトの名無しさん:2010/09/20(月) 02:19:39
fga=FG[a[j]];
fgb=FG[b[j]];
とかで、
一度、変数に入れればいいんではないかいな?

334 :デフォルトの名無しさん:2010/09/20(月) 02:31:18
ベクトル変換の対象になってないみたいです。
アドレス操作が複雑すぎるんでしょうか。
配列を参照してますし・・・

335 :デフォルトの名無しさん:2010/09/20(月) 02:39:39
一億バイト(100MByte)で9秒なら、そんなに遅くないのでは

336 :デフォルトの名無しさん:2010/09/20(月) 02:42:48
GPGのAESモードで圧縮なしだと1.6秒位で暗号化出来るんです。
GPGに勝ちたい!

337 :デフォルトの名無しさん:2010/09/20(月) 02:53:03
>>336
ここで訊いているようなレベルじゃ無理無理

338 :デフォルトの名無しさん:2010/09/20(月) 02:53:42
mltとかが時間かかってるとか
16回のループをのべたんで書いてみるとか
コンパイラ君の最適化に期待できるようなコードじゃないような気がする

339 :デフォルトの名無しさん:2010/09/20(月) 02:59:22
内側のループでは外側で計算した定数を16回mltしているだけなので
内側のループだけでもベクトル化したいです。
内側をアンロールして、o=FG[a[i]],p=FG[b[i]]とすれば出来るでしょうか?
因みに
int mlt(x, y){

if(x==0||y==0)
return 0;

return ((x+y-2)&0xff)+1;
}
です。

340 :デフォルトの名無しさん:2010/09/20(月) 03:05:10
アンロールしてみました。
GCCに最適化させるオプションを教えてください。

341 :デフォルトの名無しさん:2010/09/20(月) 03:10:29
山崎のスイスロールってクリーム無いほうがいいよな。


342 :デフォルトの名無しさん:2010/09/20(月) 03:16:12
-O2でいいんでないかい
汗のソース吐かせて、地道に処理が早くなるように手動で最適化する方が早道のような気がするけど

343 :デフォルトの名無しさん:2010/09/20(月) 05:18:42
h1[i][j];
h2[i][j];
の2次元配列のiとjを入れ替えてみるのも手かも

344 :デフォルトの名無しさん:2010/09/20(月) 09:02:22
a[b] == *(a+b) なんだからどう入れ替えても一緒だろ。

h1[i][j];
h1[j][i];
i[j][h1];
i[h1][j];
j[h1][i];

全部一緒

345 :デフォルトの名無しさん:2010/09/20(月) 09:16:05
いやその合計値の増え方が違うだろwwwww
隣接するとこ舐めてくほうがキャッシュに乗りやすい

いやうpられたソースは見てないから、今回の件で言えるのかはわからないが

346 :デフォルトの名無しさん:2010/09/20(月) 09:22:08
キャッシュの乗せ方をもう少し詳しく教えてください。

347 :デフォルトの名無しさん:2010/09/20(月) 09:28:58
>>344
http://codepad.org/1G8KolcO について一言

348 :デフォルトの名無しさん:2010/09/20(月) 09:47:17
>>346
キャッシュメモリはキャッシュラインサイズ単位で管理されている。
キャッシュラインサイズはCPUによって違うけど、だいたい16byteぐらい。
同時に使用するメモリは同じキャッシュラインに載っていた方が、
メモリアクセスが少量で済む。
つまり・・・
struct{
  int d1;
  int d2;
  int h1;
  int h2;
  ....
}data[...];
・・・とかして、同時に使用する変数が隣接するメモリアドレスに
配置されるようにしたほうが、キャッシュの使用効率は良くなる。

後は適当に_mm_prefetchを使う。

349 :デフォルトの名無しさん:2010/09/20(月) 09:51:18
どう見ても入門編じゃない罠

350 :デフォルトの名無しさん:2010/09/20(月) 10:09:54
CPUに搭載されている一次キャッシュじゃないんですか?
16バイトしかないなんて・・・
プリフェッチして遅延を減らすという話は聞いたことがあります。

351 :デフォルトの名無しさん:2010/09/20(月) 10:32:32
>>350
キャッシュラインサイズはCPUによって違うって言ったろ。
でかいやつだと256byteとかもある。

352 :デフォルトの名無しさん:2010/09/20(月) 10:34:39
>>350
キャッシュサイズとラインサイズは違う

353 :デフォルトの名無しさん:2010/09/20(月) 10:35:07
そろそろスレ違い

354 :デフォルトの名無しさん:2010/09/20(月) 10:40:53
今使ってるやつはセレロンデュアルコアで16kbyte位あると思います。

355 :デフォルトの名無しさん:2010/09/20(月) 11:26:47
非常に基本的な質問ですみません。

Aという関数を持つファイルA.cと
Bという関数を持つファイルB.cがあって
両方に共通するZという関数を追加したい場合
どうしたらいいんでしょう。


356 :デフォルトの名無しさん:2010/09/20(月) 11:31:19
Z.cとZ.hを作って
A.cとB.cにZ.hをインクルードする

357 :デフォルトの名無しさん:2010/09/20(月) 11:36:40
Aに従属する関数ならA.cとA.hに追加すれば良いし
Bに従属する関数ならB.cとB.hに追加すれば良いし
独立した機能を持つ関数ならZ.cとZ.hを作れば良い

358 :デフォルトの名無しさん:2010/09/20(月) 11:36:52
>>355
Z.c で作った関数を A.c や B.c でいきなり使う
警告出るが無視すると動く

奇麗事を始める前に、まずこの事実から

359 :デフォルトの名無しさん:2010/09/20(月) 11:39:11
>>356-358

なるほど。
ありがとうございました。(^-^)

360 :デフォルトの名無しさん:2010/09/20(月) 11:51:21
gccの自動並列化に詳しい人がいたら教えてください。
O3 -ftree-vectorize -ftree-vectorizer-verbose=5 -mmmx -msse2


361 :デフォルトの名無しさん:2010/09/20(月) 17:53:25
test
int b=0;

362 :デフォルトの名無しさん:2010/09/20(月) 19:24:55
素朴な疑問なんですがdouble型はprintfだと%fなのにscanfだと%lfって一貫性がないと思うんですが。

363 :デフォルトの名無しさん:2010/09/20(月) 19:32:41
お前みたいな奴のために規格が追いついたから安心しろよ

364 :デフォルトの名無しさん:2010/09/20(月) 19:34:44
>>363
printfもC99から%lf対応したもんね。
どうもありがとう。

365 :デフォルトの名無しさん:2010/09/20(月) 20:24:36
共用体の初期化の仕方が判りません。教えてください。
typedef union uni {
unsigned long long int dd[2];
unsigned int cc[4];
unsigned short ss[8];
unsigned char m[16];
} on;
union uni c1,c2,u;

c1.dd={'あっふん','あかんて'};

366 :デフォルトの名無しさん:2010/09/20(月) 20:26:00
初期化と代入の違いは理解してるか?

367 :デフォルトの名無しさん:2010/09/20(月) 20:27:11
わかりません。同じデータを違う型で参照できるということくらい。

368 :デフォルトの名無しさん:2010/09/20(月) 20:27:29
>>365
共用体の初期化は最初のメンバで行う
long long に文字列を代入する事は出来ないよ

369 :デフォルトの名無しさん:2010/09/20(月) 20:30:46
メンバが配列でも一つの値で代入するんですか?

370 :デフォルトの名無しさん:2010/09/20(月) 20:31:23
>>367
定義の時に値を与えるのが初期化
それ以外で値を与えるのが代入

この問題では特に区別しなくても構わない。

371 :デフォルトの名無しさん:2010/09/20(月) 20:31:44
>>367
何を聞かれているのかすらわかっていないようだ

>>368
多文字リテラルだからおk

372 :デフォルトの名無しさん:2010/09/20(月) 20:32:29
c1.dd={0xffffffffffffffff,0xffffffffffffffff};
これならいいですか?

373 :デフォルトの名無しさん:2010/09/20(月) 20:36:08
= {...}
出来んのは初期化の時だけ
union uni c1 = {'あっふん','あかんて'}, c2, u;

374 :デフォルトの名無しさん:2010/09/20(月) 20:38:20
ドスケベヴォイスを代入することは規約で禁止されている

375 :デフォルトの名無しさん:2010/09/20(月) 20:42:35
指定されたタイプより代入値が大きいと警告が出ました。
unsigned long long int dd[2] = 128bit?

376 :デフォルトの名無しさん:2010/09/20(月) 20:53:15
シングルクォートで複数の文字を囲むのって有りだっけ?

377 :デフォルトの名無しさん:2010/09/20(月) 21:01:03
多文字リテラルって言葉が出てるんだからググれよ

378 :デフォルトの名無しさん:2010/09/20(月) 21:25:00
もっとこうダイレクトに文字列を数値表現できないの?

379 :デフォルトの名無しさん:2010/09/20(月) 21:39:58
イミフ

380 :デフォルトの名無しさん:2010/09/20(月) 21:49:29
>>378
UNIVAC の BCD みたいなこと?

381 :デフォルトの名無しさん:2010/09/20(月) 21:52:10
つまり2バイトコードを数値で出力するみたいな。

382 :デフォルトの名無しさん:2010/09/20(月) 22:00:03
Integer i = Textbox1.Text

みたいなことじゃね?

383 :デフォルトの名無しさん:2010/09/20(月) 22:05:38
C++なら、>>382 程度のことなら = のオーバーロードで出来るけど。
素直に言語変えたほうが・・・・
perlとかrubyとか。

384 :デフォルトの名無しさん:2010/09/20(月) 22:11:29
代入できないからって言語変えるわけ無いだろw

385 :デフォルトの名無しさん:2010/09/20(月) 22:35:01
プラスマイナス問わずすべてのアドレスのオフセットを格納できるサイズが保証されてる整数ってありますか?ptrdiff_tってのがそうなんでしょうか?

386 :デフォルトの名無しさん:2010/09/20(月) 22:44:39
long?

387 :デフォルトの名無しさん:2010/09/20(月) 22:47:32
LLP64だとlongはだめぽ

388 :デフォルトの名無しさん:2010/09/20(月) 22:49:21
>>385
ptrdiff_tでいいよ。

389 :デフォルトの名無しさん:2010/09/20(月) 22:50:22
LLP64なローカルな環境は知らないな

390 :デフォルトの名無しさん:2010/09/20(月) 22:54:24
無知をひけらかすなよ

391 :デフォルトの名無しさん:2010/09/21(火) 01:03:15
printfってなに?

392 :デフォルトの名無しさん:2010/09/21(火) 01:05:53
おまじない

393 :デフォルトの名無しさん:2010/09/21(火) 01:05:55
print functionの略

394 :デフォルトの名無しさん:2010/09/21(火) 01:06:41
fはformatだろ。

395 :デフォルトの名無しさん:2010/09/21(火) 01:21:50
print fack

396 :デフォルトの名無しさん:2010/09/21(火) 01:23:49
print f fujio

397 :デフォルトの名無しさん:2010/09/21(火) 01:25:02
>>395
oh
miss spell
print fuck

398 :デフォルトの名無しさん:2010/09/21(火) 06:14:04
K&Rの演習問題でで改行文字やタブ文字を\nや\tに変換しながらsからtにコピーするプログラムを書いてみたんですけど、なんか突っ込んでください
http://codepad.org/uC4bOJAI

399 :デフォルトの名無しさん:2010/09/21(火) 06:22:40
良いんじゃね。別に問題ない。
次に進んでくれ。


400 :デフォルトの名無しさん:2010/09/21(火) 06:28:49
(∩´∀`)∩ワーイ

401 :デフォルトの名無しさん:2010/09/21(火) 06:38:41
教本の記憶域の動的確保ってトコで、例文には

#include<stdio.h>
#include<stdlib.h>

int main(void){
int *x;
x=calloc(1,sizeof(int));

if(x==NULL)
puts("記憶域の確保に失敗しました");
else{
*x=57;
printf("*x=%d\n",*x);
free(x);
}
return 0;
}

ってあったんだが、voidからint *に変換出来ません、とかって変なエラー弾き出すから
(int *)calloc(1,sizeof(int));って風にキャストしてみたら通ったんだが
どっかの本でキャストは危なっかしいから出来れば避けろ、って聞いたからこのまま行っていいのか分からない
そもそも教本だとキャストしなくても出来るっぽいし、何故エラーが出たのか分からない、一体どういう事なんだ・・・

402 :デフォルトの名無しさん:2010/09/21(火) 06:45:38
unsigned long long intを初期化しようとすると警告がでます。
正しい方法を教えてください。
よろしくお願いします。

unsigned long long int a;

a=0xffffffffffffffff;

403 :デフォルトの名無しさん:2010/09/21(火) 06:58:40
>>401
コンパイラによるのかな
キャストは危なっかしいのかもしれないけど、void*はキャストすべきと書かれてるところもあるね
http://www9.plala.or.jp/sgwr-t/lib/malloc.html#sankou

404 :デフォルトの名無しさん:2010/09/21(火) 07:04:59
>>403
void * から暗黙の変換はC++だとできないんだよ、Cではできる
おそらく>>401はVC++を使ってると思われる

405 :デフォルトの名無しさん:2010/09/21(火) 07:08:51
>>401
エラーが出るのは恐らくC++としてコンパイルしているから。
Cならキャストする必要がないし、C++ならmalloc()系は使わない方がいい。

>>402
警告が出るならその内容を書きなさい。

406 :デフォルトの名無しさん:2010/09/21(火) 07:12:23
VC++もCファイルはCとしてコンパイルするんじゃないの?使ってないから知らんけど
>>401はC++をベターCとして使ってるってことなのかな

407 :デフォルトの名無しさん:2010/09/21(火) 07:17:29
warnig integer constant is too large for 'long' type
こういう警告が出ます。

408 :デフォルトの名無しさん:2010/09/21(火) 07:22:30
たぶんC99だと出来る

409 :デフォルトの名無しさん:2010/09/21(火) 07:31:37
ごめんテキトーに言った。ググったら答え出た

410 :デフォルトの名無しさん:2010/09/21(火) 07:33:58
>>407
unsigned long long定数にはlluが必要。

>>406
*.ccソースをc++としてコンパイルしているなら寧ろ g++ foo.c かもしれないが、
VC++で殻のプロジェクトを作ってなんとなく*.cppにしてしまっているのかもしれない。

411 :デフォルトの名無しさん:2010/09/21(火) 07:36:31
>>408>>409
おまいらは誰に言っているんだ。

412 :デフォルトの名無しさん:2010/09/21(火) 07:47:37
ありがとう、CとC++の仕様が違ったのか、このままキャスト変換を書いて行く事にします。

413 :デフォルトの名無しさん:2010/09/21(火) 07:48:47
>410
具体的にどう書くんですか?


414 :デフォルトの名無しさん:2010/09/21(火) 07:51:50
文字の”あ”を数値に変換したいのですが、どうすればいいですか?

415 :デフォルトの名無しさん:2010/09/21(火) 07:53:26
>>413
その人じゃないけどたぶんこんなん
unsigned long long int a;
a = 0xffffffffffffffffLLU;
printf("%llu\n", a);

416 :デフォルトの名無しさん:2010/09/21(火) 07:57:13
>>414
int a = (int )L'あ';

417 :デフォルトの名無しさん:2010/09/21(火) 07:57:56
>>415
ありがとうございました。

418 :デフォルトの名無しさん:2010/09/21(火) 08:09:24
>>416
エラーが出ます。
converting to excution charactor set: Invarid or incomplete multibyte or wide charactor

419 :デフォルトの名無しさん:2010/09/21(火) 08:39:05
ひらがなを文字コードに変換する方法を教えてください。

420 :デフォルトの名無しさん:2010/09/21(火) 08:52:08
そんくらい自分で調べろよww
親切にもエラーメッセージが出てるのだから、それでググれば解決するのに。

$ gcc -finput-charset=shift_jis hoge.c

421 :デフォルトの名無しさん:2010/09/21(火) 08:54:01
調べても出てきません。

422 :デフォルトの名無しさん:2010/09/21(火) 09:27:02
調べたら出てきました。

423 :デフォルトの名無しさん:2010/09/21(火) 10:33:09
>>412
ちゃんとコメント読んでるか?

Cとして作るならキャストは不要だ。C++として作るならそもそもmalloc系を使うな。
ベターCなどという中途半端なことをするから今回のようないらん問題にぶつかる。

C++の中のC互換は、元のCとは完全に別物だ。
これからも「あれ?Cではこうするって書いてあるのにエラーになる。なんで?」というのが出てくるぞ?

424 :デフォルトの名無しさん:2010/09/21(火) 12:12:27
switchのコストってcaseの数をnとしたらO(n)ですか?
それともランダムジャンプみたいなことしてO(1)になるんでしょうか?

425 :デフォルトの名無しさん:2010/09/21(火) 12:21:50
O(log n)だったりO(1)だったりコンパイラの気分次第
O(n)はアホすぎるだろう

426 :デフォルトの名無しさん:2010/09/21(火) 12:24:29
最適化でジャンプテーブル O(1) か二分探索 O(log n) になるんじゃないかな

427 :デフォルトの名無しさん:2010/09/21(火) 12:25:39
>>424
条件で変わるだろうから一概には言えないと思う。
多段ifみたいに一条件ずつチェックするならO(n)かもしれないけれど、
nがある程度大きければcase値とジャンプ先のテーブルになるだろうからnの探索時間でO(log2(n))かな。
さらにnが取り得る値の数に充分近いならジャンプテーブルだけになるからO(1)になると思う。


428 :デフォルトの名無しさん:2010/09/21(火) 13:52:40
でも今時のCPUはパイプラインが深いからジャンプテーブルを使うとコードは
短くなるけどパイプラインバブルが発生して結局遅くなるんだけどな

それでも条件分岐が外れる事によるパイプラインバブルの発生確率を考えると
賢い選択かもしれない

どうせ分岐予測なんて当たらないだろうし

429 :デフォルトの名無しさん:2010/09/21(火) 15:16:59
二分探索に最適化って本当にしてんの?

430 :デフォルトの名無しさん:2010/09/21(火) 15:58:06
そんな大量のswtich-caseを見たことがないからなんとも言えないけど、
逆に言えばそんなケースは多くないだろうからやってない可能性が高いなぁ。
普通はO(n)でも充分実用だと思うし。

431 :デフォルトの名無しさん:2010/09/21(火) 16:01:02
>>429
してる。けど、最近のVC(VS)だけだと思う。
gccとかはやってないんじゃないかな。

432 :デフォルトの名無しさん:2010/09/21(火) 16:04:59
gccだってそれくらいはやるよ

433 :デフォルトの名無しさん:2010/09/21(火) 16:10:30
>>432
ごめん、知らなかった。

ちなみにgcc4以降とかですか?
gcc(3.x系)が二分探索吐いたの見たことないんですが。
あるいは特別不可解なオプション?

434 :デフォルトの名無しさん:2010/09/21(火) 16:19:14
>>433
なんもオプション付けてないです gcc -S a.c だけ
試したのは gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
コードは http://codepad.org/lohGRGWw
出力は http://codepad.org/1ZKAvhyw

435 :デフォルトの名無しさん:2010/09/21(火) 16:30:58
>>434
なってますね。手元でも確認しました。
ある程度case値が分散してないとならないようですね。まぁ当たり前か。

436 :430:2010/09/21(火) 16:33:00
んじゃ、私も前言撤回。やるもんだ。

437 :デフォルトの名無しさん:2010/09/21(火) 16:36:28
gcc様すいませんでした。

438 :デフォルトの名無しさん:2010/09/21(火) 18:25:00
gcc様すいませんでした。

439 :デフォルトの名無しさん:2010/09/21(火) 18:26:31
gcc様すいませんでした。

440 :デフォルトの名無しさん:2010/09/21(火) 18:46:33
なんだかんだ言ってもswitchに実行効率を期待するのはジジイ系のバッドノウハウ

441 :デフォルトの名無しさん:2010/09/21(火) 20:55:25
大昔のMS Cは、等差数列で分岐が7以上だったらテーブルになってた > switch

442 :デフォルトの名無しさん:2010/09/21(火) 22:43:58
OSSのソフトがどの様に作られているか、勉強しているのですが
ライブラリ + GUIで作られていているのですが
デバッグする時は1つのソフトとしてじゃなくて、2つそれぞれをデバッグしないとダメなのでしょうか?

443 :デフォルトの名無しさん:2010/09/21(火) 22:57:06
ですがですがと鬱陶しいのですが、日本語の勉強くらいまともにできたかったのでしょうか?

444 :デフォルトの名無しさん:2010/09/21(火) 23:23:05
話せばすんごく長くなる話で、まだお話も完全に安定した
のが出来ていない段階ですので、そういった話はご遠慮く
ださい。
今の50代〜60代のこの分野での発展の
中心的役割を果たした世代(はっきしいって40代以下
は皆実力的に大して変わりません。)が定年退職して
そういった話を語りだして集成されて、定式化され始める
のがあと数年先で、ある程度話がまとまってくるのは更に
それから10年はかかるでしょう。

445 :デフォルトの名無しさん:2010/09/21(火) 23:30:25
>>442
「ライブラリ」が他人から与えられたもの、「GUI」が自分で作ったもの
という意味であれば、「GUI」だけデバッグすればいい。

446 :デフォルトの名無しさん:2010/09/22(水) 00:00:42
プログラミング初心者の大学生です。
バブルソートをコーディングしようとしたら、こんなかんじになったんですが
これもバブルソートといえるのでしょうか?

#include<stdio.h>
int main(void)
{
int a[1000], i, num, t,b;
char ch;
printf("数字を何個入力しますか?\n");
scanf("%d",&num);
printf("\n数字を入力してください。\n");
for(i=0;i<num;i++){
scanf("%d",&a[i]);
}
for(i=0;i<num;++i){
for(b=i;b<num;b++){
if(a[b+1]<a[i]){
t=a[i];
a[i]=a[b+1];
a[b+1]=t;
}
}
}
for(i=0;i<num;i++)
printf("\n%d ",a[i]);
}

447 :デフォルトの名無しさん:2010/09/22(水) 00:02:14
>>446
バブルソートというからには隣り合う要素を比較するべき

448 :デフォルトの名無しさん:2010/09/22(水) 00:08:56
>>446
b + 1 とあるところは b のままでいいと思います。このままだとデータが 0〜num - 1 の num 個なのに、a[num] をチェックしてしまいます。
それはそうと、これは選択ソートでしょうね。

449 :デフォルトの名無しさん:2010/09/22(水) 00:10:55
選択ソートだな

450 :ビッターマン:2010/09/22(水) 00:16:28
特定のビットの数(?)で表される数値を16進で取得したいのですが
いまいちどうすればいいのか分かりません。
だれかヒントをおねがいすます。

たとえばbit1からbit13までが、1010110111001だと
16進は0x15b9となるわけですが、これをコードにしたいわけです。

451 :デフォルトの名無しさん:2010/09/22(水) 00:17:22
>>447
>>448
>>449
たしかにバブルソートじゃなくて選択ソートでした...

理系だしプログラミングぐらいできなかんと思い勉強し始めましたが、先が思いやられます...

452 :デフォルトの名無しさん:2010/09/22(水) 00:18:41
理系とか大学生とかの情報は特にいらないです

453 :デフォルトの名無しさん:2010/09/22(水) 00:21:08
>>451
まああせらずに地道に。

454 :デフォルトの名無しさん:2010/09/22(水) 00:21:45
>>452
お前が要らないとかの情報も要らないです。

455 :デフォルトの名無しさん:2010/09/22(水) 00:39:47
>>450
いまいち何がしたいのかわからないが、
"1010110111001"という文字列を2進数とみて整数型変数に格納したいなら、strtol()。
整数型変数の値を16進文字列にしたいなら、printf()。

456 :デフォルトの名無しさん:2010/09/22(水) 01:45:34
隣り合う要素ってこういう事?要素が多くなると時間かかりそう・・・
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){
 int n,raum,weiter=1;
 int zahren[10];

 srand((unsigned)time(NULL));
 for(n=0;n<10;n++) zahren[n]=rand()%100;

 for(n=0;n<10;n++) printf("%d,",zahren[n]);
 printf("\n\n");

 while(weiter!=0){
  weiter=0;
  for(n=0;n+1<10;n++){
   if(zahren[n] > zahren[n+1]){
    raum=zahren[n];
    zahren[n]=zahren[n+1];
    zahren[n+1]=raum;
    weiter=1;
   }
  }
 }

 for(n=0;n<10;n++) printf("%d,",zahren[n]);
 printf("\n\n");

 return 0;
}

457 :デフォルトの名無しさん:2010/09/22(水) 02:12:11
前スレ>>10辺りにあったswap使えばもう少し見やすくなりそうだな

458 :デフォルトの名無しさん:2010/09/22(水) 06:25:43
#define swap(type , x , y ) do{ type t=x; x=y; y=t; }while(0);

459 :デフォルトの名無しさん:2010/09/22(水) 07:34:13
>>446
これって、2重ループ内でいちいち交換しているので選択ソートではないでしょ。
かと言って、>>447のとおりバブルソートでもない。
なんて言うんだろ。

460 :デフォルトの名無しさん:2010/09/22(水) 07:39:52
バブ択ソート

461 :デフォルトの名無しさん:2010/09/22(水) 07:42:12
>>459
>なんて言うんだろ。
バグ。
ちゃんと動かねぇじゃん。
つーか、for (; b < num; )のループ内でa[b + 1]にアクセスしている時点でバン。

462 :デフォルトの名無しさん:2010/09/22(水) 07:54:08
あー、>448で指摘済みか。じゃ、バグの件はいいとして、挿入ソートと選択ソートの劣化版のようだ。

463 :デフォルトの名無しさん:2010/09/22(水) 07:58:32
>>459
結果として外側のループ(ループ変数 i) を一回まわるごとに、a[i] に最高のものが来る点が選択ソートっぽいのですけれども。
wikipedia の実装例をみるかぎり、これでも選択ソートらしい。

464 :デフォルトの名無しさん:2010/09/22(水) 09:13:48
#include <stdio.h>
#include <stdlib.h>

int main(void){
unsigned long long int a,b;

a=strtoull("0x1111111111111111",(char **)NULL,16);
b=strtoull("0x2222222222222222",(char **)NULL,16);
a=a^b;
printf("%llu\n",a);

return 0;
}
このプログラムをMMXで最適化したいのですが方法が判りません。
アセンブラで書くしかないのでしょうか?

465 :デフォルトの名無しさん:2010/09/22(水) 10:36:44
なぜいまさらMMX?

466 :デフォルトの名無しさん:2010/09/22(水) 11:03:25
>>464
strtoull()を実装し直すということなら、入門の範疇を大きく超えているね。
つーか、そんなプログラム、最適化しても何のメリットもないと思うけど。

467 :デフォルトの名無しさん:2010/09/22(水) 11:32:16
64ビットデータを1クロックで処理できるから。

468 :デフォルトの名無しさん:2010/09/22(水) 11:38:41
だれか エスパー たのむ

469 :デフォルトの名無しさん:2010/09/22(水) 11:43:37
SSE使えば128ビット処理できないか?
どちらにせよこのスレの範囲外
SSEスレに行くと良い

470 :デフォルトの名無しさん:2010/09/22(水) 12:01:55
マルチだから放置推奨。

471 :デフォルトの名無しさん:2010/09/22(水) 12:50:54
>>464
MSVC使用してそれなりのオプションを指定する

472 :デフォルトの名無しさん:2010/09/22(水) 13:26:09
VC++にコンパイルオプションだけでMMX使うものはねーよ

473 :デフォルトの名無しさん:2010/09/22(水) 14:02:03
/*
asm_mmx_psubsw_test.c
*/
#include <stdio.h>
int main ()
{
short int a[4] = {1111,1112,1113,1114};
short int b[4] = {1111,2112,3113,4114};
short int c[4];

/*Word 4要素のベクトル同士の符号付き引き算 a - b*/

/*
入力値には配列 a,b のアドレス &a,&b を使い、そのアドレスにある
メモリ内容を movq で %mm0,%mm1に移動する。
引き算の結果は出力用の配列 c に割り当てたレジスタ %0 に movq で
移動する。
*/
asm volatile ("
movq (%1),%%mm0
movq (%2),%%mm1
psubsw %%mm1,%%mm0
movq %%mm0,%0
emms
" : "=g" (c) : "r" (&a), "r" (&b));

printf ("%d,%d,%d,%d\n", c[0], c[1], c[2], c[3]);
return 0;
}

インラインアセンブラでエラーが出ます。なぜ?

474 :デフォルトの名無しさん:2010/09/22(水) 14:35:11
>>473
インラインアセンブラはC言語の範疇ではないので該当コンパイラスレかアセンブラスレへどうぞ。
つーか、エラーが出たならそのエラーメッセージくらい張れよ間抜け。

475 :デフォルトの名無しさん:2010/09/22(水) 17:39:05
教え方の質問です。

int a=a+1;
↑は ;1+a=a という順番で「後ろから前」に処理すると豪語する輩がいます。
Cに限らず全てのコンピュータからの入力は「後ろから前」だそうです。
それは違うと2スレ消費して間違いを指摘しても納得してくれません。

どうやって教えたらいいでしょうか?

476 :デフォルトの名無しさん:2010/09/22(水) 17:45:08
教える価値がないので切り捨てる

477 :デフォルトの名無しさん:2010/09/22(水) 17:52:29
規格書の定義のレベルで説明するしかないでしょ

478 :デフォルトの名無しさん:2010/09/22(水) 17:53:41
やっぱりそうなりますか・・・

479 :デフォルトの名無しさん:2010/09/22(水) 18:00:12
納得させても何も得るものがない。

480 :デフォルトの名無しさん:2010/09/22(水) 18:07:26
なんでインラインアセンブラのスレチは排除してこっちには付き合うんだよ
前者は分からないからか?w

481 :デフォルトの名無しさん:2010/09/22(水) 19:00:23
test
int a=0;


482 :デフォルトの名無しさん:2010/09/22(水) 19:00:30
インラインアセンブラ厨はいろんなスレに出没してて嫌気さしてるんだろう。
エラーメッセージも載せないのには付き合ってられん。

483 :デフォルトの名無しさん:2010/09/22(水) 19:05:17
わりとどうでもいい

484 :デフォルトの名無しさん:2010/09/22(水) 19:10:25
あるプログラミングの本(技術評論社のセンス・オブ・プログラミング!)に
ポインタを使った木構造の例としてこんなコードがあったんだ

typedef struct Node_tag{
   int a;            // プログラム固有のデータ
   int child_count;       // 子の数
   struct Node_tag **child;   // このポインタの先にmalloc()で可変長配列をつなぐ
}Node;

この四行目の「**child」っつーのがよくわかんない

「struct Node_tag *child」で
構造体のNode_tagのアドレスを格納するポインタ変数childを作るんだとして
「struct Node_tag **child」だと
構造体のNodetagのアドレスを格納するポインタ変数を構造体の外に作って
それをさらに格納する無名のポインタ変数を構造体の中に作る・・・みたいな事なのか?

485 :デフォルトの名無しさん:2010/09/22(水) 19:10:56
test
int a=0;

486 :デフォルトの名無しさん:2010/09/22(水) 19:41:45
>>473
文法通りになおしたらエラーは出なくなる。
結果: 0,-1000,-2000,-3000

487 :デフォルトの名無しさん:2010/09/22(水) 19:54:44
>>486
本に書いてある通りにしてるんですが、どこが悪いのかわかりません。

488 :デフォルトの名無しさん:2010/09/22(水) 20:07:13
>>484
並べ替えを考えた時
child がいきなり実体の配列になっているよりは
child がポインタ配列で交換はたかだかポインタを入れ替えで済むほうが都合が良い場合もある

プログラム固有のデータ部がとても大きかったり
要素数+ポインタ になってて、入れ替えの際、実体の複写を取るのに面倒だなー ってケースね

ま、後者はデータ固有部分にあるポインタを移すだけなんだけど…
移譲と複写を注意深く区別しないと、思わぬ落とし穴に捕まるので、難儀な所かも?

489 :デフォルトの名無しさん:2010/09/22(水) 20:18:27
>>484
こんな感じ
ズレてたらすまん

Node
+-----------+
| a        |
+-----------+
| child_count  |
+-----------+
| child      | --> +-------+
+-----------+    | child[0] | --> Node
             +-------+
              | child[1] | --> Node
             +-------+
              | child[2] | --> Node
             +-------+

490 :デフォルトの名無しさん:2010/09/22(水) 20:34:21
( ^ω^)カレー食わせろお

491 :デフォルトの名無しさん:2010/09/22(水) 20:41:19
asm volatile ("\n"
"\tmovq (%1),%%mm0\n"
"\tmovq (%2),%%mm1\n"
"\tpsubsw %%mm1,%%mm0\n"
"\tmovq %%mm0,%0\n"
"\temms\n"
: "=g" (c) : "r" (&a), "r" (&b));

492 :デフォルトの名無しさん:2010/09/22(水) 21:02:35
>>487
そんなクソ本捨てましょう。

493 :デフォルトの名無しさん:2010/09/23(木) 00:24:31
インラインアセンブラってC言語標準なんですか?

494 :デフォルトの名無しさん:2010/09/23(木) 00:29:53
いいえ

495 :デフォルトの名無しさん:2010/09/23(木) 01:33:18
オンラインアセンブラってどうやって使うんですか?

496 :デフォルトの名無しさん:2010/09/23(木) 02:35:26
まず服を脱ぎます

497 :デフォルトの名無しさん:2010/09/23(木) 02:41:59
それから外へ出ます

498 :デフォルトの名無しさん:2010/09/23(木) 02:46:55
そういえば最近、服着てねえな。ここ一週間くらい。


499 :デフォルトの名無しさん:2010/09/23(木) 03:00:41
服着てないぐらいならまだまし
俺はその上体も洗ってない

500 :デフォルトの名無しさん:2010/09/23(木) 03:02:46
そもそも体がない

501 :デフォルトの名無しさん:2010/09/23(木) 03:03:54
本当か?

502 :デフォルトの名無しさん:2010/09/23(木) 03:04:47
     *      *
  *  ウソです  +
     n ∧_∧ n
 + (ヨ(* ´∀`)E)
      Y     Y    *

503 :デフォルトの名無しさん:2010/09/23(木) 06:56:11
writeとprintfってどっちが早いですか?
printfは出力をリダイレクトしてます。

504 :デフォルトの名無しさん:2010/09/23(木) 07:24:02
普通は write(2)
でもお前のプログラム次第だから実測するのが一番

505 :デフォルトの名無しさん:2010/09/23(木) 07:39:03
readとwriteの使い方を教えてください。
ファイルから16バイト読み込んで暗号化してから書き込みます。
プログラムの例で使い方を知りたいのでよろしくお願いします。

506 :デフォルトの名無しさん:2010/09/23(木) 07:40:40
>>184
ぐぐって出てくるページじゃ不足なのか?
それともそういうのじゃ理解出来ないぐらい頭が残念なのか?

507 :デフォルトの名無しさん:2010/09/23(木) 08:07:17
バックパス禁止

508 :デフォルトの名無しさん:2010/09/23(木) 09:24:50
>>503
目的が違うので、単純に比較できない。
write()と同じ条件で較べられるのはfwtite()だ。
仮に整形の必要があるならprintf()でいいが、それならsprintf()+write()で較べるべき。

>>505
ファイルからの入出力なら、無理にread()/write()を使わずfread()/fwrite()を使った方が無難。

509 :デフォルトの名無しさん:2010/09/23(木) 10:45:49
>>508
fread(),fwrite()で処理したら高速化出来ました。
今暗号作ってるんですがBLOWFISHより速くなりました。
ありがとうございました。

510 :デフォルトの名無しさん:2010/09/23(木) 11:31:26
今VC++2008で作ってたプログラムをデバッグしたら実行最中に
"warning: FT_OpenType_Validate is disabled. Replace FreeType2 with otvalid-enabled version."

と出て、リリースの方でも試してみたら今度はバッファオーバーフローを引き起こしました。
↑のエラー文をググってもいまいちわからないので誰か詳しい方教えて下さい・・・

511 :デフォルトの名無しさん:2010/09/23(木) 11:41:05
?ttp://www.green.miki.hyogo.jp/~hiro/blog/mt21/2007/12/opensuse_103_ptex.html

512 :デフォルトの名無しさん:2010/09/23(木) 11:54:02
ありがとうございます。
どうやら単にバッファサイズが足りないだけでした。ご迷惑をお掛けしました・・

513 :デフォルトの名無しさん:2010/09/23(木) 12:21:47
>>488, >>489
「なぜそうした方がいいのか」はともかく
「なぜそうなるのか(内部でメモリがどう確保されてるのか)」がわかんないんだ
**childはポインタ変数のアドレスを参照するポインタ変数が作られるのは分かった(多分)が
child[0]からchild[2]までのポインタ変数の配列については、どこでメモリが確保されてるのか、とか・・・

俺、ポインタについて根本的にどっか勘違いしてるのかな?

514 :デフォルトの名無しさん:2010/09/23(木) 12:26:23
http://profiles.yahoo.co.jp/-/profile/?sp=oGT3BCg1eqGiCHsyTN79KJdc

515 :デフォルトの名無しさん:2010/09/23(木) 12:26:53
typedef struct Node_tag{
   int a;            // プログラム固有のデータ
   int child_count;       // 子の数
   struct Node_tag *child[];   // このポインタの先にmalloc()で可変長配列をつなぐ
}Node;

516 :デフォルトの名無しさん:2010/09/23(木) 12:34:25
>>513
>child[0]からchild[2]までのポインタ変数の配列については、どこでメモリが確保されてるのか、とか・・・
malloc なりで自分で確保しないといけない

child = malloc(sizeof(Node_tag *) * 3);
child[0] = malloc(sizeof(Node_tag));
child[1] = malloc(sizeof(Node_tag));
child[2] = malloc(sizeof(Node_tag));


517 :デフォルトの名無しさん:2010/09/23(木) 13:17:28
>>515
**pointer と *pointer[] はまた違うものだって聞いた
(関数の引数として使う時は同じように使えるけど)
>>516
あー、そうなのか
例に出した関数が書かれていた本にはその辺は書いてなかったから、配列の分もどっかで一緒に確保されるんじゃないかって早とちりしてた
ともかく、ありがとう。次はmllloc()の勉強だ・・・

518 :デフォルトの名無しさん:2010/09/23(木) 15:32:12
>>473
http://codepad.org/v5paokfg
1行ごとに""で囲むと文法エラーになりにくくてかんたんかも〜(^_^じこりゅう

519 :デフォルトの名無しさん:2010/09/23(木) 16:04:16
一番最初に「/*」をつけて
一番最後に「*/」を付けると
・・・main関数が無いって怒られるか

520 :デフォルトの名無しさん:2010/09/23(木) 16:11:37
>>518
gccだとemms命令無しでもエラー出ないのか

521 :デフォルトの名無しさん:2010/09/23(木) 16:21:16
一応動きました。
あと、unsigned long long int って使ってもMMX命令に変換されないのでしょうか。
32ビットで最適化したほうが早いですか?

522 :デフォルトの名無しさん:2010/09/23(木) 16:25:57
ttp://homepage2.nifty.com/jr-kun/hidemaru_qa/make_dll.html
このページを参考にHello Worldを返すDLLを作りたいのですがVC++2010でやる場合
何ていうファイルを作ればいいのでしょうか?


523 :デフォルトの名無しさん:2010/09/23(木) 16:30:17
>>522
ほぼIDEの操作の話になるからスレチだな
vsスレでも行ってろ

524 :522:2010/09/23(木) 16:36:19
わかりましたvsスレ行ってきます
すみませんでした

525 :デフォルトの名無しさん:2010/09/23(木) 17:25:59
test
int a=0;

526 :522:2010/09/23(木) 17:55:51
vsスレの方に助けてもらえてVC++ 2010Express上でCでDLLを作れました
コードを載せましたのでどなたかご指摘等お願い致します

ttp://ideone.com/Hz13E

527 :デフォルトの名無しさん:2010/09/23(木) 17:58:29
良いのではないでしょうか。

528 :デフォルトの名無しさん:2010/09/23(木) 20:39:03
以下のコードで以下のエラーが出たのですが、どこをどう直すしたらいいでしょうか?

#include <windows.h>
char* stringTest(char* s)
{
static char sz[100];
strcpy(sz, s);
return sz;

}
C:\code\projects\test\test\test.c(6): warning C4996:
'strcpy': This function or variable may be unsafe.
Consider using strcpy_s instead. To disable deprecation,
use _CRT_SECURE_NO_WARNINGS. See online help for details.

c:\program files\microsoft visual studio 10.0\vc\include\string.h(105) : 'strcpy' の宣言を確認してください。
test.vcxproj -> C:\code\Projects\test\Debug\test.dll
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========


529 :デフォルトの名無しさん:2010/09/23(木) 20:42:03
> どこをどう直すしたらいいでしょうか?
英語メッセージを見ると思考停止する>>528の脳味噌を入れ替える。

530 :デフォルトの名無しさん:2010/09/23(木) 20:46:24
>>528
エラーは出てないよ。strcpyは安全じゃないよ、と警告してるだけ。
strncpyを使うといい。

531 :デフォルトの名無しさん:2010/09/23(木) 20:47:46
>>528
strcpy()のところ。

エラーメッセージは、strcpy_s()という関数を使うべきだ、と言ってるよ。

532 :デフォルトの名無しさん:2010/09/23(木) 20:48:03
#pragma warning(disable:4996)
とかなんか。

533 :デフォルトの名無しさん:2010/09/23(木) 20:49:46
strcpyぐらい使わせてやれよ(>_</ばんばんばん!

534 :デフォルトの名無しさん:2010/09/23(木) 20:51:29
>>533
正直、同意w

535 :デフォルトの名無しさん:2010/09/23(木) 20:52:13
マイクロソフト製品なんか使うからそういうことになる

536 :デフォルトの名無しさん:2010/09/23(木) 20:52:21
>>533
俺もそう思った。
今は無視している。

537 :デフォルトの名無しさん:2010/09/23(木) 20:58:05
VS6使えば良いと思うよ

538 :528:2010/09/23(木) 21:00:47
strcpy_s(sz, sizeof(sz), s);と書いたらエラーも警告もなく正常に終了できました
_CRT_SECURE_NO_WARNINGSを書くと警告が出ない事も勉強になりました
ありがとうございました

539 :528:2010/09/23(木) 21:02:17
>>538
あなた誰?

ありがとうございました

540 :528:2010/09/23(木) 21:10:18
>>539 あなたも誰?
ということで皆のあたたかいご支援を土産に
人生を終了することができました
ありがとうございました

541 :デフォルトの名無しさん:2010/09/23(木) 21:16:28
素朴な疑問
sizeofで配列szのサイズを知ることができるのなら、
なぜstrcpy_sは、引数を3個に増やしてしまったのだろうか? 
たとえば strcpy_s(char* dst. char*src){strncpy(dst,sizeof(dst),src);}と、定義すると問題があるのだろうか?


542 :デフォルトの名無しさん:2010/09/23(木) 21:18:43
>>541
mallocされてたら、sizeofじゃわからないよ?

543 :デフォルトの名無しさん:2010/09/23(木) 21:20:56
>>541
C言語ではRTTIをサポートしていないから。
それからchar *a;をsizeofでとっても、4バイトにしかならないから。

544 :デフォルトの名無しさん:2010/09/23(木) 21:21:07
>>542
mallocじゃなくても、>>541じゃわからない。

545 :528:2010/09/23(木) 21:22:44
意味がまったく違うんじゃないですか?
strncpyじゃコピー元の大きさに関わらず
sizeof(dest)バイトコピーしちゃいます
コピー元がそんなに読めるとは限りませんよね?

546 :デフォルトの名無しさん:2010/09/23(木) 21:24:19
↓みたいに引数の文字列のサイズを自動的に付加できないんですか?

char func(char x)
{
int len = sizeof(x);
char s[len];

}

547 :デフォルトの名無しさん:2010/09/23(木) 21:26:02
ま、なんつーか、他にも突っ込むところはあるんだけども、

とにかく、sizeof()の結果っていうのはコンパイル時に決定できなくちゃならないのですわ。

548 :デフォルトの名無しさん:2010/09/23(木) 21:26:47
C99なら許可されてるかも
C89/C++では禁止されてる

549 :デフォルトの名無しさん:2010/09/23(木) 21:27:51
>>545
strncpy()の仕様を誤解してる。

550 :デフォルトの名無しさん:2010/09/23(木) 21:29:23
sizeofってマクロなんだよ。つまり単純な「文字列置換」。
プリプロセスなので実行前にわかってないと置換できない。

551 :デフォルトの名無しさん:2010/09/23(木) 21:31:10
sizeofは演算子だよw

552 :デフォルトの名無しさん:2010/09/23(木) 21:31:56
sizeofはプリプロセスじゃ使えねーよ

553 :デフォルトの名無しさん:2010/09/23(木) 21:33:26
>>548
実は俺、C99はあんまりよく知らないけどさw
さすがにそれはない、と思うんだけど。
違ったら、かなりえらいことになると思うんだが。

554 :デフォルトの名無しさん:2010/09/23(木) 21:35:04
コンパイルする前にサイズを指定しないとだめなんですね
char func(char x)
{
char s[5];

}
xの値が文字列「12345」でchar[6]だとエラーは出ないですけどxの値が「1234567890」のように長くするとエラーが出ます
例外処理っていうので対策できるのかと思ったのですが検索したのですがCには例外処理がないんですかね?
このような場合はどのように対策するのでしょうか?

555 :デフォルトの名無しさん:2010/09/23(木) 21:35:26
ポインタにsizoefしてもポインタのサイズしか得られない
問題になってるのは単にそれだけの事

556 :デフォルトの名無しさん:2010/09/23(木) 21:35:41
配列のサイズを汁にはsizeof(sz)ではダメなのですか?
では、どうすれば知れますか?

557 :デフォルトの名無しさん:2010/09/23(木) 21:36:07
sizeof x==1

558 :デフォルトの名無しさん:2010/09/23(木) 21:36:14
>>554
意味が分からない

559 :デフォルトの名無しさん:2010/09/23(木) 21:37:38
>>556
szが配列ならそれでいい
要素数じゃなくてバイト数だがな
最近のVCは_countofマクロってのがあって要素数を取得できるが
標準ではない

560 :デフォルトの名無しさん:2010/09/23(木) 21:38:35
>>556
いや、それが配列として定義されたものであれば、知れるよ。

char szarg[10];
assert( sizeof( szarg ) == 10 );

これは動く。

でも、

char* pszarg = malloc( 10 );
assert( sizeof( pszarg ) == 10 );
は通らない。
なぜなら、sizeof(pszarg)の値はポインタの(アドレスの)バイト数が返ってくるから。

561 :デフォルトの名無しさん:2010/09/23(木) 21:42:04
>>556
D言語においでおいで

562 :デフォルトの名無しさん:2010/09/23(木) 21:43:12
#include <stdio.h>

void hoge(char sz[]) {
printf("hoge sz: %d\n", (int)sizeof sz);
}

int main() {
char sz[10];
char *p;

printf("main sz: %d\n", (int)sizeof sz);
p = sz;
printf("main p : %d\n", (int)sizeof p);
hoge(sz);

return 0;
}

これを実行してみるといいよ

563 :554:2010/09/23(木) 21:44:06
>>558さんすみませんでした

char func(char x)
{
static char sz[5];
strcpy(sz, s);
return sz;
}

↑のコードでszのサイズを越える文字列を引数で渡すとエラーが出るのですが
このような文字列が渡された場合はどのように対策処理するのでしょうか?

564 :デフォルトの名無しさん:2010/09/23(木) 21:44:23
>>559
szが配列ならsizeof(sz)で配列の長さがバイト単位でわかるんですか?

もしそれが本当なら、
strcpy_sに渡せる配列を、非mallocな変数に限定することで、
引数を3個にしなくても安全な関数にできる気がしました。



565 :デフォルトの名無しさん:2010/09/23(木) 21:45:32
引数はchar x で合ってるのか

566 :デフォルトの名無しさん:2010/09/23(木) 21:46:32
>>564
配列を配列型のまま渡せないから無理

567 :デフォルトの名無しさん:2010/09/23(木) 21:47:13
>>564
だから>>562実行しろっつってんだろ
hoge内でどう表示されるか見てみろ

568 :デフォルトの名無しさん:2010/09/23(木) 21:47:18
すいませんこうでした

char func(char sz)
{
static char sz[5];
strcpy(sz, s);
return sz;
}

569 :デフォルトの名無しさん:2010/09/23(木) 21:47:51
>>563
動くコードをくれ

570 :デフォルトの名無しさん:2010/09/23(木) 21:48:34
>>568
ちゃんとコンパイル通ったコードを貼れ

571 :デフォルトの名無しさん:2010/09/23(木) 21:49:50
>>563
自分でチェックしてエラーを返すなど、呼び出し元にもからくりを準備して対応するしかないのでは?

572 :デフォルトの名無しさん:2010/09/23(木) 21:50:14
char* func(char* src_str)
{
  if(strlen(src_str) > 5){
    puts("fuck!");
    exit(1);
  }

  static char dst_str[5];
  strcpy(dst_str, src_str);
  return dst_str;
}

573 :デフォルトの名無しさん:2010/09/23(木) 21:51:41
すいませんでした。今度はコンパイルと降ります
#include <windows.h>
#include <string.h>


char* stringTest(char* s)
{

static char sz[5];
strcpy_s(sz, sizeof(sz), s);
return s;
}


574 :デフォルトの名無しさん:2010/09/23(木) 21:55:28
>>573
>strDestination または strSource が null ポインタの場合、
>またはコピー先文字列が小さすぎる場合は、
>「パラメータの検証」に説明されているように、無効なパラメータ ハンドラが呼び出されます。
>実行の継続が許可された場合、これらの関数は EINVAL を返し、errno を EINVAL に設定します。

>パラメータの検証
http://msdn.microsoft.com/ja-jp/library/ksazx244%28v=VS.80%29.aspx

面倒くさいと思うなら自分でサイズチェックしる

575 :デフォルトの名無しさん:2010/09/23(木) 21:57:22
>>566,567
では、配列を配列型のまま渡す方法は無いのですか?

576 :デフォルトの名無しさん:2010/09/23(木) 21:59:06
>>575
ないよ。

577 :デフォルトの名無しさん:2010/09/23(木) 22:09:35
>>560
カッコ付けるなボケ

578 :デフォルトの名無しさん:2010/09/23(木) 22:12:48
>>576
あ、はい。

579 :デフォルトの名無しさん:2010/09/23(木) 22:13:08
>>577
>>560 のどこがおかしいのでしょうか?

580 :デフォルトの名無しさん:2010/09/23(木) 22:13:22
>>545
違います。出直しなさい。

581 :デフォルトの名無しさん:2010/09/23(木) 22:14:04
渡した側でそのまま使いたければ文字列みたいにセンチネルを設定しろよ。
データ構造を自分の好きなように設計すればいい。
C はそんな部分までルールを強要されてないんだよ。


582 :デフォルトの名無しさん:2010/09/23(木) 22:16:15
>>579
おかしいっつか、return(0);みたいなもんだろ。
普通は付けない。

583 :デフォルトの名無しさん:2010/09/23(木) 22:16:16
>>579
「括弧つけるな」だと思われる。

584 :560:2010/09/23(木) 22:16:23
>>579
577じゃないんだが、
多分sizeof(x)ではなくて、sizeof xのように書け、といってるんだろう。

で、俺はsizeofはカッコ付けたいなあ。

585 :デフォルトの名無しさん:2010/09/23(木) 22:16:34
>>575
無くはないが、特定の要素数の配列しか渡せなくなる
結局意味が無い
C++だとテンプレートを使って回避できるし、
strcpy_sもそれ利用して実装されてるが

586 :デフォルトの名無しさん:2010/09/23(木) 22:18:48
sizeofは優先順位が間違った設計になっているので、括弧をつけるのが正解。
四則演算より強ければ、つけないという選択でも良いのだが。

587 :デフォルトの名無しさん:2010/09/23(木) 22:19:10
sizeofはカッコをつけないとコンパイルが通らないことが
あるんで、いちいち考えるのめんどうだから、常につけてる。

588 :デフォルトの名無しさん:2010/09/23(木) 22:21:47
http://codezine.jp/article/detail/4831?p=2
(動的にコピー先の領域を確保)
void func(const int *src, size_t num_elem) {
int *dest;
if (num_elem > SIZE_MAX/sizeof(int)) {
/* 整数オーバーフロー時の処理 */
}
dest = (int *)malloc(sizeof(int) * num_elem);
if (dest == NULL) {
/* 動的領域確保に失敗した場合の処理 */
}
memcpy(dest, src, sizeof(int) * num_elem);
/* ... */
free(dest);
}

589 :デフォルトの名無しさん:2010/09/23(木) 22:21:56
>>586
もちろんsizeof(a+b)のカッコを外したらだめだが
sizeof(a)+bとsizeof a+bとに何ら違いは無い

590 :デフォルトの名無しさん:2010/09/23(木) 22:22:17
>>586
なにをいってるのか

591 :デフォルトの名無しさん:2010/09/23(木) 22:23:40
sizeofに()が必要なのは、sizeof(int)みたいに型のサイズを求めるとき

592 :デフォルトの名無しさん:2010/09/23(木) 22:24:51
かっこつけるなら(sizeof a)だな

593 :デフォルトの名無しさん:2010/09/23(木) 22:26:03
なんという低レベル度の高いスレだ……。


594 :デフォルトの名無しさん:2010/09/23(木) 22:26:31
>>586
四則演算より上だが、お前は何を言っているんだ

595 :デフォルトの名無しさん:2010/09/23(木) 22:28:33
>sizeof(int)みたいに型のサイズを求めるとき
型のサイズを求める以外に sizeof を使ったことがない。
配列? vector<> とか deque<> とかしか使わなくなってしまった‥‥‥。

596 :デフォルトの名無しさん:2010/09/23(木) 22:29:18
>>586
その「間違った優先順位」とやらを直しても外せない括弧がある
つまり直せという主張に疑問符がつくぜ

597 :デフォルトの名無しさん:2010/09/23(木) 22:29:21
お前らどうせdeque<>をデキューとか呼んでるんだろwwww

598 :デフォルトの名無しさん:2010/09/23(木) 22:29:52
>>595
スレタイ嫁な

599 :デフォルトの名無しさん:2010/09/23(木) 22:30:02
つか、ここはC++じゃなくて、Cのスレなんだからさ…w

600 :デフォルトの名無しさん:2010/09/23(木) 22:31:12
デクェ

601 :デフォルトの名無しさん:2010/09/23(木) 22:32:54
>>596
そもそも間違った優先順位なんてないがな

602 :デフォルトの名無しさん:2010/09/23(木) 22:33:53
>>597
え、できゅう、じゃないのですか。あはは‥‥。
>>599
STL って C じゃなかったのね。あはは‥‥。

吊ってくる

603 :デフォルトの名無しさん:2010/09/23(木) 22:37:20
あはは

604 :デフォルトの名無しさん:2010/09/23(木) 22:38:21
>>597
そうデキュ

605 :デフォルトの名無しさん:2010/09/23(木) 22:39:21
>>572さんやり方が分かりやすかったので↓のように書いて解決しました
if (5 < strlen(s))
{
return "game over";
}
else
{
static char sz[1000];
strcpy_s(sz, sizeof(sz), s);
return s;
}

ただ、当方の環境では↓のように書くとエラーがでまくるのですが、C言語はこういうものなんでしょうか?
if (5 < strlen(s))
{
return "game over";
}
static char sz[1000];
strcpy_s(sz, sizeof(sz), s);
return s;



606 :デフォルトの名無しさん:2010/09/23(木) 22:40:54
>>605
お前の処理系がC99合致でないから
C99より前は変数の宣言はブロック先頭のみ

607 :デフォルトの名無しさん:2010/09/23(木) 22:44:58
>>601
それは悪かった
で、何を「間違った設計」だと言いたかったんだ?

少なくともここは変だぜ
> 括弧をつけるのが正解。
つけなくても正解があるので意味をなしていない

608 :デフォルトの名無しさん:2010/09/23(木) 22:45:37
なぜ急に1000に増えたの
あと、比較するなら5<=strlen(s)では

609 :デフォルトの名無しさん:2010/09/23(木) 22:46:20
>>607
横レスに何言ってんの

610 :デフォルトの名無しさん:2010/09/23(木) 22:49:50
関数内でそんな処理するより、関数呼ぶ前にすませとけよって話

611 :デフォルトの名無しさん:2010/09/23(木) 22:51:01
外部リンケージなら内部で処理しろよ
危なっかしい

612 :デフォルトの名無しさん:2010/09/23(木) 22:52:17
>>609
そうか、横レスだったのか
では見逃してやろうw

613 :デフォルトの名無しさん:2010/09/23(木) 22:53:11
>>612
何を見逃すんだ?
訳分からん

614 :デフォルトの名無しさん:2010/09/23(木) 22:54:24
同じ相手をバカにしてるはずの相手を、そのバカだと誤解したあげくに捨て台詞とかw

615 :デフォルトの名無しさん:2010/09/23(木) 22:58:18
mellocで動的にサイズ変更したらオーバーフロー対策になると思うんだけど違うの?

616 :デフォルトの名無しさん:2010/09/23(木) 22:59:07
strdup()ってことか?
ま、標準じゃないけどね。

617 :デフォルトの名無しさん:2010/09/23(木) 23:00:01
そうか、型名は()で括ると言うルールか。ところで何で()で括らないといけないんだ?

618 :デフォルトの名無しさん:2010/09/23(木) 23:02:30
そういう文法だから

619 :デフォルトの名無しさん:2010/09/23(木) 23:02:46
でっく

620 :デフォルトの名無しさん:2010/09/23(木) 23:06:34
>>617
typename に似たような事情がありそうだね

621 :デフォルトの名無しさん:2010/09/23(木) 23:20:08
>>615
違う。
貴方が言っているのはオーバーフロー。
貴方が言いたいのはオーバーラン。

622 :デフォルトの名無しさん:2010/09/23(木) 23:24:52
typenameは変数/関数か型かを文法上区別するためのもの
どっちでも可でどちらなのかは意味解析に任せる、じゃ困るケースがあんだろうね

623 :デフォルトの名無しさん:2010/09/23(木) 23:41:03
sizeof a * b
って言われたとき a や b は何に見えるだろう
コンパイラはどこまで何を保証すべきだろう

sizeof 1E+1
sizeof 1L+1
の違いはパーサの責任範囲?

624 :デフォルトの名無しさん:2010/09/24(金) 00:03:15
>>617
キャストだって括弧付けるだろ。


625 :デフォルトの名無しさん:2010/09/24(金) 00:07:34
キャストの括弧というと…
(void(*)(void))a

こうでもよかったはずだよな
void(*(a))(void)

626 :デフォルトの名無しさん:2010/09/24(金) 00:07:48
>>621
バッファオーバーフローもバッファオーバーランも
変わらないと思うが、もしや>>615のオーバーフローが
桁あふれを意味していると言う解釈か?
流石に曲解だろ。

627 :デフォルトの名無しさん:2010/09/24(金) 00:08:02
関数コール以外はS式で記述できるようなプリプロセッサ作れば需要あるかも
イヤないな

628 :1/2:2010/09/24(金) 04:10:58
教えてください。
今、関数の練習をしているのですが、コンパイル時に下記のエラーが出ます。

test.c: In function 'main';
test.c:4: warning: return type of 'main' is not 'int'

テキストの例通りに入力してもこのエラーが出るので、困ってます。

629 :2/2:2010/09/24(金) 04:13:11
ちなみに例は下記の通りです。cygwinを使用してます。
#include<stdio.h>


void main()

{

int num, ret;

printf("2乗する数字を入れてね==>");

scanf("%d", &num);


ret = square(num);

printf("%d の2乗は %d です \n", num, ret);
}


int square(int x)

{

int y;


y = x*x;
return(y);

}

630 :628-629:2010/09/24(金) 04:14:05
申し訳ありません。
コピったのを貼りつけたら改行がおかしくなりました。

631 :デフォルトの名無しさん:2010/09/24(金) 04:17:55
とりあえずint main(void)って書いとけ

632 :デフォルトの名無しさん:2010/09/24(金) 04:24:00
>>631
うまくいきました。
ありがとうございます。

原因は何が考えられるのでしょうか。

633 :デフォルトの名無しさん:2010/09/24(金) 04:26:56
>>632
何のコンパイラを使っているかしらんが、
そのコンパイラではmain関数はintを返すと規定されているのでしょう。

ISO Cとして厳格なコンパイラってことだろう。

ちなみに、mainのreturn値はUnixでいうところのプログラムの終了コード
に反映される。

634 :デフォルトの名無しさん:2010/09/24(金) 04:30:25
>>633
成程。
とりあえずmain関数でintを返すようにしておけば問題なさそうですね。

ありがとうございました。
助かりました。

635 :デフォルトの名無しさん:2010/09/24(金) 05:12:08
コマンドラインから処理したいファイル名を指定するにはどうす。れば
いいですか。教えてください。よろしくおねがいします

./a.exe infile outfile

636 :デフォルトの名無しさん:2010/09/24(金) 05:33:58
int main( int argc, char *argv[] ) {

char infile[256] ;
char outfile[256] ;

if ( argc>=3){
strcpy ( infile, argv[1] ) ;
strcpy ( outfile, argv[2] ) ;
}

637 :デフォルトの名無しさん:2010/09/24(金) 05:49:32
ありがとうございました。

638 :デフォルトの名無しさん:2010/09/24(金) 06:02:05
それでいいのか

FILE *in, *out;

in = fopen(argv[1], "r");
out = fopen(argv[2], "w");

みたいにしたいのかと思ったが

639 :デフォルトの名無しさん:2010/09/24(金) 06:05:26
それくらいの応用は自分で思いつくだろ

640 :デフォルトの名無しさん:2010/09/24(金) 06:10:06
出力ファイルに固定の拡張子をつけるにはどうすればいいですか。

641 :デフォルトの名無しさん:2010/09/24(金) 06:16:23
sprintf

642 :デフォルトの名無しさん:2010/09/24(金) 06:17:48
char outfile[256] ;
sprintf ( outfile, "%s%s", argv[2], ".hoge" ) ;

643 :デフォルトの名無しさん:2010/09/24(金) 06:30:54
プログラムのどこに書いたらいいですか?
infileだけが必要になりませんか?
因みにファイル処理はサブルーチンの中でやってます。

644 :デフォルトの名無しさん:2010/09/24(金) 06:34:15
日本語でおk

645 :デフォルトの名無しさん:2010/09/24(金) 07:12:36
頭が付いてないのか

646 :デフォルトの名無しさん:2010/09/24(金) 07:20:15
int main( int argc, char *argv[] ) {

char infile[256] ;
char outfile[256] ;

if ( argc>=3){
strcpy ( infile, argv[1] ) ;
strcpy ( outfile, argv[2] ) ;
}
これはうまくいくんですが、入力ファイルだけを指定して出力ファイル
に固定の拡張子を付けるのに
sprintf ( outfile, "%s%s", argv[2], ".hoge" ) ;
これをやってもうまくいきません。コアダンプします。
そもそもこれは何をする関数なんですか?

647 :デフォルトの名無しさん:2010/09/24(金) 07:22:43
./a.exe 3
ls 3*
3 3.txt
みたいな

648 :デフォルトの名無しさん:2010/09/24(金) 07:30:03
説明が下手だな。コマンドラインからは一つだけファイル名を指定したいんだろ。
int main(int argc, char ** argv)
{
char infile[256];
char outfile[256];
if (argc < 2) return 1;
sprintf(infile, "%.255s", argv[1]);
sprintf(outfile, "%.250s.hoge", argv[1]);
...;
return 0;
}

649 :デフォルトの名無しさん:2010/09/24(金) 07:32:53
argcはコマンドライン引数の数+1だから
それで分岐しろ

650 :デフォルトの名無しさん:2010/09/24(金) 07:47:09
どうやってもうまくいきません!

651 :デフォルトの名無しさん:2010/09/24(金) 07:50:11
sprintfってファイル名を付ける関数なんですか?

652 :デフォルトの名無しさん:2010/09/24(金) 07:56:32
ここで聞く以前にさ、本とかwebで勉強しろよ。お前の質問はそんなレベル
そんでそれでどうしても分からなかったら聞きに来い

653 :デフォルトの名無しさん:2010/09/24(金) 08:01:37
とりあえずここブクマしれ
ttp://www.cppll.jp/cppreference/

654 :デフォルトの名無しさん:2010/09/24(金) 08:03:13
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#ifndef MAX_PATH
#define MAX_PATH 256
#endif

int main(int argc, char* argv[])
{

char infile[MAX_PATH] ;
char outfile[MAX_PATH] ;

strcpy_s ( infile, MAX_PATH, argv[1] ) ;
_splitpath_s ( infile, NULL, 0, NULL, 0, outfile, MAX_PATH, NULL, 0 ) ;
sprintf_s ( outfile, MAX_PATH, "%s%s", outfile, ".hoge" ) ;

}

655 :デフォルトの名無しさん:2010/09/24(金) 08:31:39
マイクロソフトのコンパイラ専用のコードになってね?

656 :デフォルトの名無しさん:2010/09/24(金) 08:34:25
>>628
その警告は「returnで返してる値の型が間違ってる」だ
voidは何も返さない関数だから、returnを使わない
void main(){
printf("test");
}

intなら整数を返す
int main(){
printf("test");
return 0;
}

657 :デフォルトの名無しさん:2010/09/24(金) 08:34:31
なにをいまさら

658 :デフォルトの名無しさん:2010/09/24(金) 08:52:22
ファイルが作成できました。
ファイルポインタ指定しないでファイルを作ろうとしてました。
sprintfを初めて使いました。

659 :デフォルトの名無しさん:2010/09/24(金) 11:41:05
vc++2010expressにatlstr.hというのが入ってないんですけど絶対パスから相対パスに求めることがしたいのですが代替方法ってありませんんか?

660 :デフォルトの名無しさん:2010/09/24(金) 12:05:54
>>659
Win32APIに↓こんなのあったけど、どう?
PathRelativePathTo

661 :デフォルトの名無しさん:2010/09/24(金) 12:41:37
ストリーム暗号を作っているのですが、手動でやると復号できるのに
プログラムでやろうとするとうまくいきません。2回同じ暗号化を
すれば元に戻るはずなのにそうなりません。
出来ればコマンドラインで暗号化復号化の選択ができるようにしたいです。
初心者でよくわからないことが多いのですがよろしくお願いします。

if (argc < 2) { printf("error\n"); return 1;}
sprintf(fin, "%.255s", argv[1]);
sprintf(fout, "%.250s.perm", argv[1]);

if(d==0){
fp=fopen("2.perm","wb");
fq=fopen("2","rb");
}else{
fp=fopen("2.txt","wb");
fq=fopen("2.perm","rb");
}

662 :デフォルトの名無しさん:2010/09/24(金) 12:49:30
暗号化するときに
fp=fopen(fout,"wb");
fq=fopen(fin,"rb");
とするのはいいのですが、復号のときに暗号化されたファイルを
読み込んで処理しても復号できない。
何のデータにばけているのかわかりません。

663 :デフォルトの名無しさん:2010/09/24(金) 13:03:12
まず暗号化が正しく行われているかどうかを確認するべき
プログラムで暗号化してできた暗号文を、手作業で暗号化したものと比較してみる
暗号文が間違ってるなら、そんなもの復号できるわけないからな

664 :デフォルトの名無しさん:2010/09/24(金) 13:08:34
暗号文は正しいです。手動でプログラムのファイル名を書き換えて
復号すれば成功します。プログラムで自動化しようとして失敗してます。

665 :デフォルトの名無しさん:2010/09/24(金) 13:12:40
まとめて自動化したとき書き込み後fcloseせずに読み込んだとかか?

666 :デフォルトの名無しさん:2010/09/24(金) 13:15:15
fpは
fp=fopen("2.perm","wb");
fp=fopen("2.txt","wb");
fp=fopen(fout,"wb");
の3通りあるのか? どういう使い分けで?

667 :デフォルトの名無しさん:2010/09/24(金) 13:16:37
どこの段階でおかしくなってるかデータを出力して確認すれば。デバッグ能力を養うチャンスだ。答えだけポンと与えられてもまたすぐ行き詰るぞ

668 :デフォルトの名無しさん:2010/09/24(金) 13:20:08
今はうまく動かないのでif文で条件分岐してます。
if(d==0){ 暗号化用
fp=fopen("2.perm","wb");
fq=fopen("2","rb");
}else{ 復号化用
fp=fopen("2.txt","wb");
fq=fopen("2.perm","rb");
}

fp=fopen(fout,"wb");
fq=fopen(fin,"rb");
これは標準入力からファイル名を指定したときの残骸です。

669 :デフォルトの名無しさん:2010/09/24(金) 13:25:39
./a.exe file file.perm  暗号化
./a.exe file.perm file.txt 復号化

これでうまくいくはずなのに、そうなりません。

670 :デフォルトの名無しさん:2010/09/24(金) 13:26:49
じゃあコンピューターが壊れているんだろう。買い直せばいいんじゃないかな

671 :デフォルトの名無しさん:2010/09/24(金) 13:39:01
>>661
あなたと同じ所で詰まっている人が他にもいるので、二人で協力すれば解決できると思いますよ。
http://hibari.2ch.net/test/read.cgi/tech/1274998754/454

672 :デフォルトの名無しさん:2010/09/24(金) 13:45:40
>>661
マルチの女乙

673 :デフォルトの名無しさん:2010/09/24(金) 14:33:32
>>661
まあ、Cスレで面倒見るべきなのかね。

ファイルを書き込む時と読み込むときにはどんな風にしてるの?

674 :デフォルトの名無しさん:2010/09/24(金) 14:42:11
fread,fwriteしている箇所の行を見せろ
そこが間違ってなければ暗号アルゴリズムが
間違っているか正しくコードできてないだけ
あるいはコーディング特有の雑多で膨大な種類の
些細なミスの幾つかに引っかかって正しく動作さ
せられていない
と推測

675 :デフォルトの名無しさん:2010/09/24(金) 14:46:15
根本的な問題は解決する気が本人にないこと構ってチャンなこと

676 :デフォルトの名無しさん:2010/09/24(金) 14:47:26
fread/fwriteを使っています。
うまく説明できないのですが、ストリーム暗号なので2回暗号化すれば
元に戻るはずなのです。手動でファイルを指定してコンパイルすると
元に戻るのですが、自動化しようとするとバイナリになってしまいます。
プログラムを見せたほうがいいのでしょうか?

677 :デフォルトの名無しさん:2010/09/24(金) 14:51:46
while((read_size=fread(buff,1,4096,fq))){
for(k=0;k<256;k++){
for(i=0;i<16;i++)
buf[i]=buff[k*16+i];

for(i=0;i<16;i++){
p=a.m[i];
W1^=G[i][p][0];
W2^=G[i][p][1];
}
z=(c1.dd[1]&0xff)^(c1.dd[0]>>4);

c1.dd[0]^=W1;
c1.dd[1]^=W2;
c1=s5(c1);
c1.dd[0]^=z;
c1.dd[1]^=~z;

for(i=0;i<16;i++){
buf[i]^=c1.m[i];
buf[i+16]^=c2.m[i];
}

for(i=0;i<16;i++)
buff[i+k*16]=buf[i];
}
fwrite(buff,1,4096,fp);

}

678 :デフォルトの名無しさん:2010/09/24(金) 14:57:56
情報小出しも構ってチャンの特徴だよな。うんざりだ。

679 :デフォルトの名無しさん:2010/09/24(金) 15:00:41
今週からCの勉強した人っていますか?

680 :デフォルトの名無しさん:2010/09/24(金) 15:01:50
>>676
>手動でファイルを指定してコンパイルすると元に戻るのですが
ファイル名をソースに直書きした場合は正常に復号される

>自動化しようとするとバイナリになってしまいます。
ファイル名をコマンドライン引数で指定するとうまくいかない

ってことでおk?
とりあえずファイルIOは考えずに,適当なデータで暗号化・復号化が正常に動くのかどうかを検証しろ


681 :デフォルトの名無しさん:2010/09/24(金) 15:13:07
よくわからないが
fp=fopen(argv[2],"wb");
fq=fopen(argv[1],"rb");
でいいんじゃないの?
もちろんfopenの戻り値はNULLチェックしてるよな?

682 :デフォルトの名無しさん:2010/09/24(金) 15:27:05
>>677
のコードを書いたのが>>676かどうかはシランが
read_sizeが常に4096を返すとは限らない
ので(特に末尾はファイルサイズが4096の倍数
でも無い限り絶対にそう)、>>677のコードでは
正しく復号できることは望み薄い

683 :デフォルトの名無しさん:2010/09/24(金) 15:27:24
なぜだかわかりませんが出来ました!
ありがとうございます。
いんぷ

684 :デフォルトの名無しさん:2010/09/24(金) 15:28:32
入出力のファイルが入れ替わっていたようです。

685 :デフォルトの名無しさん:2010/09/24(金) 15:46:30
何故かこの処理を入れないと復号できませんでした。
d=0;にしてはダメ。手で入力する必要があります。

scanf("%d",&d);
if(d==0){
fp=fopen(argv[2],"wb");
fq=fopen(argv[1],"rb");
}

4096にならない時はパディングします。

686 :デフォルトの名無しさん:2010/09/24(金) 15:50:49
C言語随分離れててうろ覚えだけど、"2"と"2.txt"というファイルが別物だからでは?
if(d==0){ 暗号化用
fp=fopen("2.perm","wb");
fq=fopen("2","rb");
}else{ 復号化用
fp=fopen("2.txt","wb");
fq=fopen("2.perm","rb");
}


687 :デフォルトの名無しさん:2010/09/24(金) 16:18:03
というか、まだそういうレベルに達してないんだよ。
1つずつキッチリと覚えていけばいいんだよ。
命題を明確にしろ。
1度にやろうとするな。


688 :デフォルトの名無しさん:2010/09/24(金) 16:28:53
もう宿題スレに行って全部書いてもらえよ
もしくは現状のソース全部うpしろ

689 :デフォルトの名無しさん:2010/09/24(金) 16:29:28
今時Cとかねえわwwwwwwwwwwwwwwwwww
開発効率もわりー言語を使ってんのは何か?プライドってやつか?wwwwwwwwww
今の時代は言語はなんだっていいんだよwwwwwwwwwwwwwww
C#様最強伝説なんだよわかったかおまえらwwwwwwwwwwwwwwwwwwwwww

690 :デフォルトの名無しさん:2010/09/24(金) 16:36:37
>>689
よし、バイナリ読み込んで構造体の配列にするコードをC#で書いていいぞ

691 :デフォルトの名無しさん:2010/09/24(金) 16:39:44
つーか、ここまで質問したんだったら全部のソース
晒すのが手っ取り早いんじゃね?

692 :デフォルトの名無しさん:2010/09/24(金) 16:46:18
>>689
そんなこと言われたってなぁ・・・
言語選べる立場じゃないし・・・
>>690
unsafeコード使えば楽勝じゃね

693 :デフォルトの名無しさん:2010/09/24(金) 16:54:05
Fortran以外は糞言語

694 :デフォルトの名無しさん:2010/09/24(金) 16:54:26
>>689
何作ってるの?

695 :デフォルトの名無しさん:2010/09/24(金) 16:58:53
おまえらが生きてる世界がそれだよ


696 :デフォルトの名無しさん:2010/09/24(金) 17:17:41
>>695
バグだらけじゃねーか、さっさと修正ry

697 :デフォルトの名無しさん:2010/09/24(金) 17:23:40
取り敢えずフラグの調整ミスなんt

698 :デフォルトの名無しさん:2010/09/24(金) 17:42:45
変数に$testみたいに書きたい。無理やりでもいいのでできますか?

699 :デフォルトの名無しさん:2010/09/24(金) 17:43:44
>>698
他の言語を使えばいい

700 :デフォルトの名無しさん:2010/09/24(金) 17:50:30
つーかいい加減仕様変更してアドレス演算は&じゃなくて@にしろよ分かりやすいから

701 :デフォルトの名無しさん:2010/09/24(金) 17:54:05
@がatなのはすべての国じゃないんだろ?

702 :デフォルトの名無しさん:2010/09/24(金) 17:54:54
しろよって何?

703 :デフォルトの名無しさん:2010/09/24(金) 17:57:09
日本だってバックスラッシュが出なくて
代わりに ??/ を使ってるんだから問題ないだろ。


704 :デフォルトの名無しさん:2010/09/24(金) 18:14:54
単価記号でわかりやすくなるかなぁ
どっちもどっちの気がするから今のままでいいんじゃね

705 :デフォルトの名無しさん:2010/09/24(金) 18:36:39
>>700
#define @ &

706 :デフォルトの名無しさん:2010/09/24(金) 18:54:23
>>679
今週からC#を勉強しています。関係ないけど。

707 :デフォルトの名無しさん:2010/09/24(金) 18:57:12
>>672
どうして♀とわかったんですか?

708 :デフォルトの名無しさん:2010/09/24(金) 19:13:53
女の勘よ

709 :デフォルトの名無しさん:2010/09/24(金) 20:49:11
くだらない

710 :デフォルトの名無しさん:2010/09/24(金) 22:55:37
はい次

711 :デフォルトの名無しさん:2010/09/24(金) 23:53:03
return -1;でmainから抜けるとどうなりますかー?

712 :デフォルトの名無しさん:2010/09/25(土) 00:04:32
exit(-1)が呼ばれる

713 :デフォルトの名無しさん:2010/09/25(土) 00:12:03
呼ばれたら?

714 :デフォルトの名無しさん:2010/09/25(土) 00:13:44
どうなるか試してみたらー?

715 :デフォルトの名無しさん:2010/09/25(土) 00:16:47
ばぐった

716 :デフォルトの名無しさん:2010/09/25(土) 00:18:21
結論
return -1;はバグる。

717 :デフォルトの名無しさん:2010/09/25(土) 00:19:26
なぜバグる?

718 :デフォルトの名無しさん:2010/09/25(土) 00:19:40
何でもバグらせるんだな
ある意味すごいぞ

719 :デフォルトの名無しさん:2010/09/25(土) 01:03:47
自作自演(aa ry

720 :デフォルトの名無しさん:2010/09/25(土) 01:42:45
コンパイルでも実行でも何の問題も無かったぞ?
コンパイラはborland c++、osはwindows 7


#include <stdio.h>

int main(void){
return -1;
}



721 :デフォルトの名無しさん:2010/09/25(土) 01:50:59
えっ、マジで言ってるの?

722 :デフォルトの名無しさん:2010/09/25(土) 01:53:50
いや、まあ、バグじゃない。
ただし、プログラムの終了コードとして-1にはならない。
(少なくともUNIXでは)
Windowsはどうだったっけ?

723 :デフォルトの名無しさん:2010/09/25(土) 02:07:11
普通に0xffffffffが返ってくるけど

724 :デフォルトの名無しさん:2010/09/25(土) 02:08:18
>>723
何で確認してるの?w

725 :デフォルトの名無しさん:2010/09/25(土) 02:31:52
デバッカと
シェルで実行してプロセスの終了コードを取得してチェック

726 :デフォルトの名無しさん:2010/09/25(土) 02:38:42
>>720
どうして stdio.h なんか include してるの?


727 :デフォルトの名無しさん:2010/09/25(土) 02:39:05
なんのシェルだ?w
パワーシェルとかいうなよw

Windowsだと、そんな値返ってくるのか。

728 :デフォルトの名無しさん:2010/09/25(土) 02:42:44
てか0xffffffffは-1だしょ

729 :デフォルトの名無しさん:2010/09/25(土) 02:43:55
UNIXユーザーでシェルが分からないとかどこのモグリだよ

730 :デフォルトの名無しさん:2010/09/25(土) 05:06:31
実行環境によって負数を取るか取らないかが違うから16進で書いたんでしょ

731 :デフォルトの名無しさん:2010/09/25(土) 06:17:54
>>728
32bit と限らないのでは?

732 :デフォルトの名無しさん:2010/09/25(土) 09:54:44
>>729
UNIXなら終了コードは8ビットだから、0xffffffffにはなりえない。

733 :デフォルトの名無しさん:2010/09/25(土) 10:30:45
というかCで自分のところの実行結果を根拠にするのもどうかしてる

734 :デフォルトの名無しさん:2010/09/25(土) 12:22:59
オレの所ではこう動いたんだから他所でもこうなるはずだ!

よくいるタイプリストに追加だな。

735 :デフォルトの名無しさん:2010/09/25(土) 12:33:04
Cを覚えるのにおすすめのサイトを教えてください

736 :デフォルトの名無しさん:2010/09/25(土) 13:20:28
正直モニタでコードおっかけながら勉強するより本買って勉強した方が良い

737 :デフォルトの名無しさん:2010/09/25(土) 14:15:14
昔のDOSとかもそうだけど
return(-1)もreturn(255)も同じ動作になった
だが、これは単に受け取る側のOSの問題であって
プログラムの終了コードが-1ではないという根拠にはならんぞ?

738 :デフォルトの名無しさん:2010/09/25(土) 15:02:38
void input_data(char name[N][M], int data[N][S], int *n){
int i=0, j;
printf("名前を入力してください\n");
scanf("%s", name[i]);
for(i=0; name[i][0] != EOF; i++){
for(j=0; j<S; j++){
printf("科目%dの点数を入力してください\n",j+1);
scanf("%d", &data[i][j]);
}
i++;
printf("名前を入力してください\n");
scanf("%s", name[i]);
}
*n=i;
}
nameを入力する際にEOFを入力してもfor文から抜け出せないのですがどうすればいいでしょうか
ちなみにvisual studioでOSはwindows7です

739 :デフォルトの名無しさん:2010/09/25(土) 15:08:10
>>738
printfとscanfの位置は本当にそこでいいのか?

740 :デフォルトの名無しさん:2010/09/25(土) 15:09:51
>>738
EOFを入力って何をいってんだ?なんか勘違いしてんな
素直に0を入力したら終了、name[i][0] != '0'で判定
とかにしとけ

741 :デフォルトの名無しさん:2010/09/25(土) 15:17:26
まさか、文字列で"EOF"と打ち込んで終わらないっていってるんじゃ?
>>738だとEOFは-1として評価されてる
文字列で評価したいなら文字列比較で判断しないと

742 :デフォルトの名無しさん:2010/09/25(土) 15:22:50
>>739
おかしい所があるのでしょうか…もう少し考えてみます

>>740
そのままfor文に入れてname入力の箇所で0を入力したのですがループから抜けませんでした

>>741
いえ、Ctrl+Dを打ち込んでるんですがループから抜け出せないです

743 :デフォルトの名無しさん:2010/09/25(土) 15:34:56
EOFを見るのはscanf()のリターン値だろ。

744 :デフォルトの名無しさん:2010/09/25(土) 15:44:32
Windows なら EOF は Ctrl-Z だな。


745 :デフォルトの名無しさん:2010/09/25(土) 15:53:04
>>743
勉強不足だからかよくわかりません…申し訳ない

>>744
ありがとうございます、ループからは抜けられませんでしたが…

746 :デフォルトの名無しさん:2010/09/25(土) 15:54:31
勉強不足ってレベルじゃねーぞ

747 :デフォルトの名無しさん:2010/09/25(土) 16:15:19
勉強不足の人が実務やってるという事実が

748 :デフォルトの名無しさん:2010/09/25(土) 16:24:02
どうしても終了したければ
名前の1文字目で
Alt を押しながらテンキーで 255
と入力すればいいよ。


749 :デフォルトの名無しさん:2010/09/25(土) 16:34:04
scanfの戻り値は変換に成功した個数を返すから
if (scanf("%s", name[i]) != 1) {
break;
}
とかしなされ。

750 :デフォルトの名無しさん:2010/09/25(土) 16:52:27
C言語の勉強をする場合はじめはコンソールプログラムからやったほうがいいですか?
あとVC++を利用したほうがいいですか?

751 :デフォルトの名無しさん:2010/09/25(土) 16:54:40
できるものからやればいい。


752 :デフォルトの名無しさん:2010/09/25(土) 17:04:38
Linuxでコンソールでgccでやれ

753 :デフォルトの名無しさん:2010/09/25(土) 17:06:27
よっぽど簡単なGUIライブラリがなければコンソールからやったほうがいいよ
当たり前のようにGUIで入門講義やる教授がいて殴りたくなった

754 :デフォルトの名無しさん:2010/09/25(土) 17:08:39
CでTerapad並みのエディタを作れるようになるまで結構勉強しないとだめですか?

755 :デフォルトの名無しさん:2010/09/25(土) 17:20:53
>>754
年単位かと。

756 :デフォルトの名無しさん:2010/09/25(土) 17:22:08
GPGに勝ったと思ったらOpenSSLに負けた。
一秒で100メガ処理するためにはどうすればいいですか?
バッファを増やしても変化がありませんでした。

757 :デフォルトの名無しさん:2010/09/25(土) 17:23:26
>>738
EOF は文字ではありません。
ファイルが終了したり、コンソールで特定のキーが押されたときなど、すなわちストリームが終了したときに、getchar() などの関数の返り値が EOF = -1 になるというだけです。
そして、scanf() でストリームの終了を検知するには、scanf() の返り値をみればいいでしょう。
if (scanf("%s", name[i]) == EOF) { ... } で判断すればいいと思います。

758 :デフォルトの名無しさん:2010/09/25(土) 17:27:07
>>754
手頃なTextEditのようなライブラリとかを使わないで、1年以内に
書くことができたら、君はおそらく天才だよ。

759 :デフォルトの名無しさん:2010/09/25(土) 17:44:50
ゼロから書くとnotepad.exe(メモ帳)でも結構大変だよ。
"EDIT"クラスを使わないで、という意味ね。

それでもASCII文字限定で読み込み・編集・保存だけなら
がんがれば1年くらいあればでできるかもしれん。

TeraPadレベルはエスパーでも時間かかるし大変だと思う。

760 :デフォルトの名無しさん:2010/09/25(土) 17:51:02
>>757
scanf の戻りは値格納した非引数の個数
だから EOF を戻すことは無いかと

761 :デフォルトの名無しさん:2010/09/25(土) 17:58:40
>>760
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/scanf.3.html

入力の最後に達したらEOFが返るって書いてあるけど。

762 :デフォルトの名無しさん:2010/09/25(土) 18:02:48
>>761
ごっめーん EOF返せるね。
%s で受けるなら getchar() 関連併用でのアレも発症しないから検出できるのか

763 :デフォルトの名無しさん:2010/09/25(土) 18:46:28
特別にゆるす

764 :デフォルトの名無しさん:2010/09/25(土) 18:54:35
乱数を用いたプログラムで何度実行しても同じ結果が出力されてしまうのですが
どうしらいいのでしょうか?

765 :デフォルトの名無しさん:2010/09/25(土) 18:56:01
コードを晒せよ

766 :デフォルトの名無しさん:2010/09/25(土) 19:01:43
>>764
srand

767 :デフォルトの名無しさん:2010/09/25(土) 19:04:11
ループ内でsrandしてるって可能性もあるな

768 :デフォルトの名無しさん:2010/09/25(土) 19:13:48
精度の良いランダムアルゴリズムってありますか?

769 :デフォルトの名無しさん:2010/09/25(土) 19:15:15
mt

770 :デフォルトの名無しさん:2010/09/25(土) 19:22:41
ランダムアルゴリズム?
モンテカルロ法とかのこと?

771 :デフォルトの名無しさん:2010/09/25(土) 19:28:46
>>767
解決しました。ありがとうございます

772 :デフォルトの名無しさん:2010/09/25(土) 20:03:38
暗号の速度比較

time openssl enc -e -aes-128-ofb -in 3 -out 3.ofb -k aaaaa

real 0m10.779s
user 0m5.132s
sys 0m0.998s

$ time ./grs 3 3.grs

real 0m19.220s
user 0m11.418s
sys 0m0.841s

$ time ./perm 3 3.perm

real 0m13.136s
user 0m6.208s
sys 0m1.029s

opensslに比べてgrsのuserの時間が長いのはなぜですか。
timeのみかたもよくわかりません。

773 :デフォルトの名無しさん:2010/09/25(土) 20:14:18
アプリレベルになるとパラメータゲットやコンディション解析や
そのバリデーションを行うスレッドと実計算を行うスレッドが
分離されていることも少なくない。システム協調性を高めれば
概してそういう設計にされることが多い。
なんで単純に速度差をアルゴリズムの差と決めつけることも
出来ない。

774 :デフォルトの名無しさん:2010/09/25(土) 20:22:32
time ***
では計測時間のどこまでが反映されているのでしょうか。
アルゴリズム以外でファイルIOの違いで差がつくのでしょうか?

775 :デフォルトの名無しさん:2010/09/25(土) 20:22:48
>>772
すごいですね

776 :デフォルトの名無しさん:2010/09/25(土) 20:26:56
>>774
sysはIOとかシステムコールで、userがアルゴリズムっていうか、
実際のコードの部分。

777 :デフォルトの名無しさん:2010/09/25(土) 20:29:10
opensslと比較してるんですけど敵いません。
アルゴリズムは単純なのでストリーム暗号として使えると思って
いたのですが、300Mのテキストファイルの暗号化を時間計測
したらこんな結果になりました。opensslのソースを見るしかない
のでしょうか。誰か高速化につながるアイデアを教えてください。

778 :デフォルトの名無しさん:2010/09/25(土) 20:33:19
アイデアも何も、今どういうコードなのか分からんと言いようもないような。

779 :デフォルトの名無しさん:2010/09/25(土) 20:34:30
っていうか、まずはプロファイルとれって話じゃないのか?

780 :デフォルトの名無しさん:2010/09/25(土) 20:34:50
>>772
realが実際に掛かった所要時間。elapsed timeとも。
userがユーザプロセスの消費時間。コアを複数使った場合は実時間より長いことも。
sysがシステムプロセスの消費時間。カーネルの処理時間やI/Oの時間など。
sysを比較すると、grsが若干速い位で大差ない。ディスクキャッシュなどの影響も受けるので、誤差の範囲内か。
userを比較すると、逆にgrsが目立って遅い。
ついでに言えば、user + sys がrealに比してどれもかなり遅い。
恐らく1コア環境で実験しているのじゃないかと愚考するが、
今時そんなレアケースで比較されてもなんとも言えないなぁとミサカはレスしておきます。

781 :デフォルトの名無しさん:2010/09/25(土) 20:37:00
まず最適化オプションは指定しているのか心配なレベル

782 :デフォルトの名無しさん:2010/09/25(土) 20:38:01
sslを自力で実装してopensslと比較してるような人が>>777みたいな
要領を得ない質問の仕方をするとは思えないけど。

783 :デフォルトの名無しさん:2010/09/25(土) 20:46:41
OpenSSLって強敵ですね。GPGには速度的に勝っているのでいけると
思ったのですがさらに上が。
プロファイルをとるという意味が判らないので教えてください。
どうしてgrsのuserだけがこんなに遅いのか、処理が複雑だからでしょうか。
気になります。ソースを見せてもいいので改善方法を教えてください。
ちょうど乱数の話も出てきたことですし。ちなみに使用環境はVista
セレロンT1600デュアルコアですが並列化はしてません。基本的に
行列演算なのでSSE2を一部使っています。メモリアクセスの遅延も
考えられるのではと思います。何かアドバイスしてください。

784 :デフォルトの名無しさん:2010/09/25(土) 20:47:19
OpenSSLはAESはアセンブリで書いてる。SSEは使って無いから勝ち目は有るぞ。

785 :デフォルトの名無しさん:2010/09/25(土) 20:48:48
>>783
GPGは仕組み的にみて全然遅いに決まってる。
というか、GPGより遅かったらストリーム暗号として存在意義が疑わしくなっちゃう

786 :デフォルトの名無しさん:2010/09/25(土) 20:53:49
最近のCPUにはAES-NIとかいうAES暗号処理を高速化する命令があるらしいな…

787 :デフォルトの名無しさん:2010/09/25(土) 20:56:17
$ gcc -O3 -ftree-vectorize -ftree-vectorizer-verbose=5 -mmmx -msse2 -o gsr gsr.c
コンパイルオプションです。

788 :デフォルトの名無しさん:2010/09/25(土) 21:00:37
ハッシュ関数も作ってます。

$ time ./hash 3
d86fe81f c84d06f6 af9513c dfa0bf1 554c2e0b 92bf0d0c f0f321e8 f2f1f2f5 *3
real 0m6.240s
user 0m2.355s
sys 0m0.217s

$ time sha256sum 3
8e2ce45cdb5d17875610ca66073e826323acdc2fa7778eb010018feb10dbeb8a *3

real 0m6.321s
user 0m4.820s
sys 0m0.404s

789 :デフォルトの名無しさん:2010/09/25(土) 21:03:18
>>783
>プロファイルをとるという意味が判らないので教えてください。

プロファイルは必ずしも正しい結果でないことを予めご承知置きしてね。
使ってるのは恐らくgccだと思うので、
-pg オプションつけてコンパイル。
それでバイナリを実行するとgmon.outという計測結果も出力される。
gprof [実行ファイル名] で計測結果を出力。
gccだと確か最適化ONでもプロファイルできた気がする。
詳細はググってほしい。

ところでまず暗号化せずにファイルを読み込むだけの時間を計測してみては?


790 :デフォルトの名無しさん:2010/09/25(土) 21:13:22
$ time ./grs 3 3.grs

real 0m10.935s
user 0m0.327s
sys 0m0.857s

読み書きだけでこれだけかかってます。

791 :デフォルトの名無しさん:2010/09/25(土) 21:16:16
何が出来るようになったら初心者卒業になりますか?

792 :デフォルトの名無しさん:2010/09/25(土) 21:18:47
そういう質問しなくてもいいかな?と思えるようになったら

793 :デフォルトの名無しさん:2010/09/25(土) 21:19:31
>>790
読書きだけでOpenSSLと互角じゃないですかw

>>773の指摘の線も調べてみてください。
ディスクからの読み書きブロッキング中に別スレッドで
暗号化している可能性があると思います。
私だったら途中でデバッガをアタッチしてブレークしてみるとか、
ProcessExplorerで見るとか、します。

それからもしかしてcygwinですか?

794 :デフォルトの名無しさん:2010/09/25(土) 21:20:39
>>791
そうだなあ…
Cだよね?

longjmp使って、例外のようなエラーハンドラ作れるようになる。
自分でクラス構造体を作ってオブジェクト指向プログラミングを実装できる。

くらいできれば、1人前でいいんじゃないかなw

795 :デフォルトの名無しさん:2010/09/25(土) 21:20:44
>>791
本やサイトなどに載っているサンプルを写しただけのとは異なる、自分で考えた新しいプログラム(内容は何でもいい)を作れたら

796 :デフォルトの名無しさん:2010/09/25(土) 21:24:53
知らない技術をすぐ使えるようになったら

797 :デフォルトの名無しさん:2010/09/25(土) 21:25:13
>>793
773の意味がわかりません。Cygwin32で実行してます。
どうしてOpenSSLはこんなに早いんでしょう。

798 :デフォルトの名無しさん:2010/09/25(土) 21:27:08
>>796
それはもう上級者と言っていいレベルじゃないかな

799 :デフォルトの名無しさん:2010/09/25(土) 21:28:21
OpenSSLはオープンソースなんだから自分で頑張れよ

800 :デフォルトの名無しさん:2010/09/25(土) 21:28:51
while((read_size=fread(buff,1,1024,fq))){

// 暗号化処理

fwrite(buff,1,read_size,fp);
}
こんな感じで。

801 :デフォルトの名無しさん:2010/09/25(土) 21:31:04
CってPHPみたいにMVCパターンでかけませんか?

802 :デフォルトの名無しさん:2010/09/25(土) 21:32:05
オブジェクト指向風に書けるんだから
MVCパターン風には書けると思う

803 :デフォルトの名無しさん:2010/09/25(土) 21:33:44
あーかったるい

804 :デフォルトの名無しさん:2010/09/25(土) 21:38:00
>>797
つまり、暗号化よりもディスクの読書きが遅いということです。
fread(buf, 1, 1024*64);
とかやると、結果がディスクから読み込まれてbufがいっぱいになるまで返ってきません。
その間CPUが何してるかというとほとんどbufがいっぱいになるまでアイドルしてます。
この待ってる最中にOpenSSLは別スレッドで暗号化処理をしているのでしょう。
あなたはシリアルに
読み込み1→暗号化1→書き込み1→読み込み2→暗号化2→書き込み2→...
とやっていますね?
おそらくOpenSSLみたいのは
スレッド1:読み込み1→読み込み2→読み込み3
スレッド2:アイドル →暗号化1 → 暗号化2 → 暗号化3
スレッド3:アイドル →アイドル →書き込み1→書き込み2 →書き込み3
みたいな感じでやってると思います。

805 :デフォルトの名無しさん:2010/09/25(土) 21:42:24
読み込み、暗号化、書き込みをスレッドにする方法がわかりません。
簡単にできることなんですか?マルチコアでなくても効果があるのですか?

806 :デフォルトの名無しさん:2010/09/25(土) 21:45:01
>>804をとりあえず手っ取り早く検証したいなら、RAMディスク導入してみたら良いよ、
ディスクアクセスが無視できるレベルになるから

807 :デフォルトの名無しさん:2010/09/25(土) 21:48:34
スレッド1:読み込み1→暗号化1→書き込み1
スレッド2:アイドル→読み込み2→暗号化2→書き込み2
スレッド3:アイドル→アイドル→読み込み3→暗号化3→書き込み3

808 :デフォルトの名無しさん:2010/09/25(土) 21:50:15
ディスクアクセスが問題なんですね。
いまRAMが余ってないので実験できませんが、他に高速化できそうな
方法はないのですか?fread/fwrite以外の方法で。

809 :デフォルトの名無しさん:2010/09/25(土) 21:52:02
Cを秀丸で書くのはやばいですか?

810 :デフォルトの名無しさん:2010/09/25(土) 21:53:03
>>809
なんでやばいの?
Notepadで書く奴がいるくらいだw
秀丸使ったって全然問題ないだろう。

811 :デフォルトの名無しさん:2010/09/25(土) 21:54:24
全くやばくない。

812 :デフォルトの名無しさん:2010/09/25(土) 21:55:14
やばいからnotepad++使おうぜ

813 :デフォルトの名無しさん:2010/09/25(土) 22:00:54
自動的にスレッドに割り当ててくれる方法はないのですか?

814 :デフォルトの名無しさん:2010/09/25(土) 22:01:16
edlin 使えよ Win なら。

815 :デフォルトの名無しさん:2010/09/25(土) 22:04:41
うー…さすがにedlinはつれーw
せめてex

816 :デフォルトの名無しさん:2010/09/25(土) 22:10:13
自動的にスレッド・・・OpenMP?

817 :デフォルトの名無しさん:2010/09/25(土) 22:16:03
スレッドがよくわかりません。まだそういうレベルです。

818 :デフォルトの名無しさん:2010/09/25(土) 22:16:49
アルゴリズム的に遅くないってことでいいですよね。
後は実装方法だけ。

819 :デフォルトの名無しさん:2010/09/25(土) 22:20:52
>>809
秀丸使うこと自体がアレな感じだけど。

820 :デフォルトの名無しさん:2010/09/25(土) 22:24:22
秀丸とか日本人しか使ってないマイナーエディタじゃん

821 :デフォルトの名無しさん:2010/09/25(土) 22:30:31
UNICODE版vi for Win32
ttp://www.vector.co.jp/soft/winnt/writing/se028211.html

のソースを少し変更して再コンパイルしたものを使ってる

822 :デフォルトの名無しさん:2010/09/25(土) 22:31:39
むしろ、I/Oスレッドと計算スレッドが分離しているほうが
処理は遅いことのほうが多いんじゃね?
ただしこの分離モデルはストリーミング(コマンドライン上から
パイプラインで処理できることに対応)とか、IPCとかSocketとか
で複数のプロセスと通信したりするようなケースでは良く取られる

823 :デフォルトの名無しさん:2010/09/25(土) 22:38:50
cygwin上でvim使えば良いじゃん

824 :デフォルトの名無しさん:2010/09/25(土) 22:42:48
while((read_size=fread(buff,1,1024,fq))){
読み込みサイズの1024を
4096とか64*1024とかに変えてみて
時間を測ってみたら

825 :デフォルトの名無しさん:2010/09/25(土) 22:45:36
xyzzyのc-mode

826 :デフォルトの名無しさん:2010/09/25(土) 22:48:05
今時viとかemacsとか言ってる奴らって、「憧れのMJと同じシューズを履きたいピュアな少年」のような発想だよなw

827 :デフォルトの名無しさん:2010/09/25(土) 22:49:43
>>824
全然変わらない。

828 :デフォルトの名無しさん:2010/09/25(土) 22:52:15
まあ、秀丸はねーわな。
使ってる連中、すごいダメそう。

829 :デフォルトの名無しさん:2010/09/25(土) 23:04:12
>>826
そうなんです。あこがれの RMS のつくった‥‥‥、xyzzy って日本人でしたっけ。

830 :デフォルトの名無しさん:2010/09/25(土) 23:05:41
32バイトで読んでた時はすごく遅かった。

831 :デフォルトの名無しさん:2010/09/25(土) 23:05:59
エディタは作者の好みと自分の感覚のズレがあるとずっと不快だから色々使ってみたほうがいい
オプションで調節できないところでイライラって結構あるからね

俺は昔の VC とか好きだったけど、あの会社の常で勝手にいらんことするようになって心が離れた
vi はさすがに見劣りはするけど今でも一目置いてるご長寿さんだ

832 :デフォルトの名無しさん:2010/09/25(土) 23:07:33
暗号化処理が遅いということじゃ?

833 :デフォルトの名無しさん:2010/09/25(土) 23:08:59
ターミナル経由じゃないと使えない環境もあるんだよ・・・

834 :デフォルトの名無しさん:2010/09/25(土) 23:13:07
300Mのファイルの読み書きだけで10秒かかるんです。

835 :デフォルトの名無しさん:2010/09/25(土) 23:14:48
viはあんまり積極的な評価ないな。
おれはIDE派だから使わないけど、VSやらEclipseにviのキーアサインが
あったらそれ使う。

836 :デフォルトの名無しさん:2010/09/25(土) 23:21:49
>>807
その方法だと3つのスレッドが同時に読み込みに行ったりしないか?

>>818
ディスク読書きだけで10秒、暗号化含めると18秒なら、
暗号化で8秒近くかかってるって考えていいんじゃないですかね。

837 :デフォルトの名無しさん:2010/09/25(土) 23:23:43
禿丸

838 :デフォルトの名無しさん:2010/09/25(土) 23:25:02
なぜemacsがない!w

emacsは習得には時間がかかるが、習得すればこれ以上のエディタはないぞw
まさにプロユースw

839 :デフォルトの名無しさん:2010/09/25(土) 23:26:46
PC-98 に FE(?) ってエディタって無かった?
探しても見つからないんだが。


840 :デフォルトの名無しさん:2010/09/25(土) 23:27:25
暗号化に8秒って遅いですかね。ストリーム暗号。
300Mのファイルですが。

841 :デフォルトの名無しさん:2010/09/25(土) 23:29:06
>>840
300Mだと読んで書くだけでそのくらいかかるんじゃない?

842 :デフォルトの名無しさん:2010/09/25(土) 23:30:52
メモリマップで

843 :デフォルトの名無しさん:2010/09/25(土) 23:30:56
>>839
ああ、Finalでしょw

FINAL,RED,MIFESはPC-98時代の3大エディタw

844 :デフォルトの名無しさん:2010/09/25(土) 23:31:04
OpenSSLだと読み書き暗号化全部で11秒位で終わるんです。
この高速化の秘密は何?!

845 :デフォルトの名無しさん:2010/09/25(土) 23:31:10
>>840
ファイルを分割してマルチスレットで暗号化して結合は?

846 :デフォルトの名無しさん:2010/09/25(土) 23:33:09
さすがに3DESだと30秒くらいかかりますね。

847 :デフォルトの名無しさん:2010/09/25(土) 23:34:12
MIFES/2 使ってた

848 :デフォルトの名無しさん:2010/09/25(土) 23:35:10
OpenSSLではそんなことしてないみたいですよ、ファイル分割。
最後に結合してるのかもしれないけど。

849 :デフォルトの名無しさん:2010/09/25(土) 23:36:00
プログラム初心者なのでスレッドとかわかりません。

850 :デフォルトの名無しさん:2010/09/25(土) 23:37:25
初心者を口実に向上心を捨てる奴は死ね

851 :デフォルトの名無しさん:2010/09/25(土) 23:42:33
>>838
emacsはエディタじゃないから。

852 :デフォルトの名無しさん:2010/09/25(土) 23:47:11
スレッドって要は内部でこうやってるだけなんでしょ

int g_thread_id = 0;

int main(void)
{
  while(1){
    if(g_thread_id == 0){ func_thread_0(); }
    else if(g_thread_id == 1){ func_thread_1(); }
    else if(g_thread_id == 2){ func_thread_2(); }

    g_thread_id++;
    if(3 <= g_thread_id){ g_thread_id = 0; }
    sleep(1);
  }
}

853 :デフォルトの名無しさん:2010/09/25(土) 23:49:05
>>843
Vz ははいらないのかそうなのか

854 :デフォルトの名無しさん:2010/09/25(土) 23:49:48
>>851
emacsはエディタでもある。

855 :デフォルトの名無しさん:2010/09/25(土) 23:56:13
>>852
処理の途中で状態を保存してreturnして、制御がきたら前回の続きから
はじめるとか考えなくていいから、そう書くよりロジック書くのは楽だな。

856 :デフォルトの名無しさん:2010/09/25(土) 23:56:55
>>853
VZはちょっと後発なのよね。
最終的にはVZが席捲するんだが、その時にはPCの主役も
PC-98からDOS/Vと言われたIBM互換機になっていた…w

857 :デフォルトの名無しさん:2010/09/25(土) 23:57:51
>>852
そんな考え方してたらマルチスレッドプログラミングで間違いなく死ぬ

858 :デフォルトの名無しさん:2010/09/26(日) 00:01:15
>>857
考え方も何もそれってノンプリエンプティブマルチタスクのディスパッチャだろ

859 :デフォルトの名無しさん:2010/09/26(日) 00:10:42
コマンドプロンプトのバッチ処理だろW

860 :デフォルトの名無しさん:2010/09/26(日) 00:25:07
マルチスレッドの本質ってものすごくシンプルだよね。
知らないうちは何か高度なことだと重いがちだけど。

861 :デフォルトの名無しさん:2010/09/26(日) 00:26:38
ガッチガチのホモっホモだな。

862 :デフォルトの名無しさん:2010/09/26(日) 01:01:23
まず暗号の何たるかを学べよ

http://www.amazon.co.jp/新版暗号技術入門-秘密の国のアリス-結城-浩/dp/4797350997/

863 :デフォルトの名無しさん:2010/09/26(日) 01:03:22
>>845
その方法だとECBにしか対応できない。


864 :デフォルトの名無しさん:2010/09/26(日) 01:04:01
>>856
後発と言うか、Vzとして公開されてから見知った人にとってはそうかもしれないが、
それ以前にEzとして既に我々の間では広く普及していた。

865 :デフォルトの名無しさん:2010/09/26(日) 01:06:38
>>840
かんたんにクラックできる暗号作ってなにやってんの?

866 :デフォルトの名無しさん:2010/09/26(日) 01:17:15
>>863
だからストリーム暗号だって言ってるだろ。

867 :デフォルトの名無しさん:2010/09/26(日) 01:17:57
>>840

悪いこと言わないから、Cのコーディングや実行速度に気をとられてないで
>>862見たいな本でまず有効な暗号とはどんなものなのかについて学べ。
そして、今ある有効な暗号化のアルゴリズムを使って実装するべき。

868 :デフォルトの名無しさん:2010/09/26(日) 01:21:42
予測不可能性の高い乱数を発生させるだけでもひとつの技術だわな

869 :デフォルトの名無しさん:2010/09/26(日) 01:23:01
>>867
使う暗号アルゴリズムは指定されてるんじゃないの。

870 :デフォルトの名無しさん:2010/09/26(日) 01:23:06
C言語でぷよぷよが作りたい

871 :デフォルトの名無しさん:2010/09/26(日) 01:24:03
>>870
頑張れ

872 :デフォルトの名無しさん:2010/09/26(日) 01:25:25
それはゲームを作るのか、それともあの物体を作るのか

873 :デフォルトの名無しさん:2010/09/26(日) 01:30:09
>>872
それを上記の文章から読み取れないお前がプログラムを弄れるとは思えない

874 :デフォルトの名無しさん:2010/09/26(日) 01:32:13
曖昧な仕様から曖昧な実装を行うのは3流のする仕事

875 :デフォルトの名無しさん:2010/09/26(日) 01:33:57
明確な仕様が無いからと言って即座に逃げの一手を打つのは4流のする仕事

876 :デフォルトの名無しさん:2010/09/26(日) 01:35:51
>>871
作り方教えろ

877 :デフォルトの名無しさん:2010/09/26(日) 01:38:25
まずパンツを脱ぎます

878 :デフォルトの名無しさん:2010/09/26(日) 01:39:40
パンツを履きます

879 :デフォルトの名無しさん:2010/09/26(日) 02:03:04
>>875
>>874は4流ということでいいからおまえが作れ3流

880 :デフォルトの名無しさん:2010/09/26(日) 02:06:09
>>870が本当に欲しかったものはぷよぷよ通なのだろうか

881 :デフォルトの名無しさん:2010/09/26(日) 02:22:33
$ gcc -O3 -ftree-vectorize -ftree-vectorizer-verbose=5 -mmmx -msse2 -o gsr gsr.c
まず、-O2のみで時間測って、どんくらい違うか調べたら

882 :デフォルトの名無しさん:2010/09/26(日) 02:23:02
マルチスレッドって簡単にいえばこうだよな

俺(メインスレッド)は今の仕事(メイン関数)を続けるから
誰か(サブスレッド)あの仕事(他の関数)を処理しといて

883 :デフォルトの名無しさん:2010/09/26(日) 02:30:56
この仕事やっとけって?あ、いいっすよ
・・・
この資料借りていいっすか?
え、だめ?
じゃあちょっと横で待ってますね
・・・
あ、終わりました?じゃあ借りてきますね
え?やっぱ返せ?いや、でもこっちも仕事しないと
・・・
ふ〜終わった、あー、資料返しますね
・・・
ひまだなー、仕事ないかなー(ちらっ

こんな感じかな

884 :デフォルトの名無しさん:2010/09/26(日) 02:47:48
まあ一種の幻想だよな。
コア増やしただけのCPUを正当化するための詭弁だよ。


885 :デフォルトの名無しさん:2010/09/26(日) 02:54:55
>>808
ttp://www10.atwiki.jp/gavotterd/
これでやってみて、OS使用領域からも横取り出来るはずだから

886 :デフォルトの名無しさん:2010/09/26(日) 04:31:09
char name[32]って配列だとそれ以上の文字列が入力されたら他のメモリも破壊してしまうけど char *nameだったらどんなに入力しても*(name + i)に保存?されて大丈夫な気がするんですがどうなんでしょうか?エスパーの方お願いします。

887 :デフォルトの名無しさん:2010/09/26(日) 04:34:32
どこに入力するんだよ。

888 :デフォルトの名無しさん:2010/09/26(日) 04:37:04
>>886
だめですw

まず、そもそも、メモリは有限です。仮想メモリがあろうがなかろうが、
無限のメモリなんてありません。書きつづければどこかで切れますw

アドレス演算は符号なしですが、結局のところ、最大値を越えれば0に
戻ります。よって、この理屈だけでも最終的にはすべてのメモリを破壊
してしまうことがわかります。

で、実際には、nameがどこを指しているかにもよりますが、スタックか
ヒープを破壊して、Segmentation Faultになりますw

889 :デフォルトの名無しさん:2010/09/26(日) 04:44:52
>>887
>>888
ありがとう。
ちょっとポインタと配列の関係が上手く理解できてないみたいです。
配列の先頭アドレスにchar型のポインタを代入しようとしたりw


890 :デフォルトの名無しさん:2010/09/26(日) 06:52:47
Visual Studio 2010 C++を使おうとしてるのですが、どこでコンパイル
すればいいのかわかりません。

891 :デフォルトの名無しさん:2010/09/26(日) 06:57:38
ググれ

892 :デフォルトの名無しさん:2010/09/26(日) 07:45:20
コマンドラインからコンパイルするみたいです。
でも最適化オプション付けてもgccの2倍以上実行時間がかかります。
何が悪いのでしょう。

893 :デフォルトの名無しさん:2010/09/26(日) 08:29:59
>>892
あんたの頭。

894 :デフォルトの名無しさん:2010/09/26(日) 09:04:51
開発環境ってなれないと難しい。Linuxだったらある程度わかるけど
WINで動くアプリ作ろうとすると何が何だか。
同じプログラムなのに動作速度が違うなんて。

895 :デフォルトの名無しさん:2010/09/26(日) 09:22:33
同じプログラムなのに実行結果も違う。Cygwin32とVisual Studio

896 :デフォルトの名無しさん:2010/09/26(日) 09:27:59
それは専門用語で「バグ」といいます。

897 :デフォルトの名無しさん:2010/09/26(日) 09:33:21
で、暗号作ってた彼はあきらめたのか?

898 :デフォルトの名無しさん:2010/09/26(日) 09:38:15
まだ暗号作ってます。速度面だけでなくWINアプリとの互換性を試しています。
それでWINとCygwinで実行結果が合わなくておかしなことになってます。
ハッシュ関数の値が実行する環境によって変化します。バグです。

899 :デフォルトの名無しさん:2010/09/26(日) 09:44:07
Winとcygwinじゃなくて、VCとgccの違いでは?

900 :デフォルトの名無しさん:2010/09/26(日) 09:48:07
整数のデーター長とか符号が原因と見た

901 :デフォルトの名無しさん:2010/09/26(日) 09:49:32
ライブラリで同じハッシュ値が返るっていう仮定をしてるなら、
ハッシュ関数を自作すればいいのでは?

902 :デフォルトの名無しさん:2010/09/26(日) 09:51:03
どう考えても変数初期化してないとかだろ。デバッグとかしてないんじゃないの。

903 :デフォルトの名無しさん:2010/09/26(日) 09:58:47
VCは値を勝手に丸めるから。

904 :デフォルトの名無しさん:2010/09/26(日) 10:03:24
>>890
メニュー→デバッグ→ソリューションのビルド

905 :デフォルトの名無しさん:2010/09/26(日) 10:05:38
実行時間が遅すぎる。35秒もかかる。
出力ファイルが勝手にプロテクトされてるし。
VCはわけわからん。

906 :デフォルトの名無しさん:2010/09/26(日) 10:08:41
逆に言えばgccとかは桁あふれとかの保護機能を自分で実装してやらないと何も保護がかかっていない状態だってこと。安全と速度は反比例する。

>実行時間が遅すぎる。35秒もかかる。

たぶんそれがこの差。

907 :デフォルトの名無しさん:2010/09/26(日) 10:09:58
そもそも実行時間は安定してるのかい?

908 :デフォルトの名無しさん:2010/09/26(日) 10:11:37
VCはバカコードを書いてもメモリを破壊しない安全なアプリケーションを生成するようにできている。

909 :デフォルトの名無しさん:2010/09/26(日) 10:20:38
>>856 >>864
vz自身も、dos/vが流行るだいぶ前から大ヒットしてたような記憶があるけど。


910 :デフォルトの名無しさん:2010/09/26(日) 10:21:31
みなさんコンパイラ何使ってますか?

911 :デフォルトの名無しさん:2010/09/26(日) 10:23:08
インテル入ってる

912 :デフォルトの名無しさん:2010/09/26(日) 10:25:49
みんなそういうこと知ってるんだからすごいよなあ・・・

913 :デフォルトの名無しさん:2010/09/26(日) 12:15:40
フレッツ入ってる

914 :デフォルトの名無しさん:2010/09/26(日) 12:39:14
実行環境とかコンパイルオプション変えただけで計算結果って変わるんですか?

915 :デフォルトの名無しさん:2010/09/26(日) 12:39:58
変わりまくります
最悪の場合人が死にます

916 :デフォルトの名無しさん:2010/09/26(日) 12:41:07
>>910

intel parallel composer2011

917 :デフォルトの名無しさん:2010/09/26(日) 12:43:25
あー、もうじき四十路か〜。なんだかなぁ。

918 :デフォルトの名無しさん:2010/09/26(日) 13:22:33
VCでコンパイルしたものをコマンドプロンプトで実行した結果と、
Cygwinで同じバイナリを実行した結果が違うのはなぜですか。

919 :デフォルトの名無しさん:2010/09/26(日) 13:26:45
>>918
コードを見せて。

920 :デフォルトの名無しさん:2010/09/26(日) 13:35:07
void main(int argc,char *argv[]){
int i,j;
FILE *fq,*fp;
int line=0,k=0,n=0,read_size;
unsigned long long int z,zz;

init(); g64(64);
fq=fopen(argv[1],"rb");
while((read_size=fread(buff,1,4096,fq))){
for(k=0;k<256;k++){ for(i=0;i<16;i++)
u.m[i]=buff[i+k*16]; for(i=0;i<4;i++){
c1.cc[i]=((c1.cc[i]+u.cc[i])&f2)^c1.cc[(i+1)&0x3];
c2.cc[i]=((c2.cc[i]+u.cc[i])&f2)^c2.cc[(i+1)&0x3];
}
z=(c1.dd[0]&&ff)^((c1.dd[1]&ff)>>4); c1.dd[0]=c1.dd[0]&f; c1.dd[1]=c1.dd[1]&f;
i=c1.cc[0]%64; c1.dd[0]^=g[i][0]; c1.dd[1]^=g[i][1];
c1.dd[0]^= z; c1.dd[1]^= ~z; i=c2.dd[0]%64;
zz=(c2.dd[0]&&ff)^((c2.dd[1]&ff)>>4);
c2.dd[0]=c2.dd[0]&f; c2.dd[1]=c2.dd[1]&f;
c2.dd[0]^=g[i][0]; c2.dd[1]^=g[i][1];
c1=s5(c1); c2=s5(c2); c2.dd[0]^=zz; c2.dd[1]^=~zz;
}
}
printf("%02x %02x %02x %02x %02x %02x %02x %02x *%s",c1.cc[0],c1.cc[1],c1.cc[2],c1.cc[3],c2.cc[0],c2.cc[1],c2.cc[2],c2.cc[3],argv[1]);
fclose(fq);
}


921 :デフォルトの名無しさん:2010/09/26(日) 13:39:04
>>918
おいこらいい加減うるせーぞ。そもそも結果が安定しているかどうか聞いただろうボケ。

922 :デフォルトの名無しさん:2010/09/26(日) 13:41:39
>>920
質問とは関係ないけど、&fとか&ffってところは0xf、0xffの間違い?

923 :デフォルトの名無しさん:2010/09/26(日) 13:42:55
早くなったり遅くなったり安定しません。
WIN上で動くようにしようとして混乱してます。
どうもすみません。
コンパイラによってなぜ結果が変わるのか理解できません。

924 :デフォルトの名無しさん:2010/09/26(日) 13:44:20
コンパイラによって結果が違わなかったら誰も有料のコンパイラ使わないでしょ

925 :デフォルトの名無しさん:2010/09/26(日) 13:44:38
void init(void){


c1.cc[0]=2183266401;
c1.cc[1]=2186346530;
c1.cc[2]=2183266313;
c1.cc[3]=2188574773;
c2.cc[0]=2212298975;
c2.cc[1]=2211905752;
c2.cc[2]=2198339796;
c2.cc[3]=2210398243;
u.cc[0]=0x111111222222eeeeULL;
u.cc[1]=0x333333444444ccccULL;
ff=0xf0f0f0f0f0f0f0f0ULL;
f=0x0f0f0f0f0f0f0f0fULL;
}

926 :デフォルトの名無しさん:2010/09/26(日) 13:50:18
>>923
こないだ説明しただろ、安定しないのはディスクキャッシュが原因だ。
全部読み込んでからメモリ上でやってその部分だけ測るか(もちろん出力もメモリ)RAMディスクでも使え。

927 :デフォルトの名無しさん:2010/09/26(日) 13:50:21
実行環境によって結果が違うのは正常なんですね。
ハッシュ関数なんていうのは一致がとれないといけないので困っていました。

928 :デフォルトの名無しさん:2010/09/26(日) 13:55:42
>>927
出力結果が違うのは異常。

929 :デフォルトの名無しさん:2010/09/26(日) 13:56:46
環境じゃなくて自分のコードを疑えよ

930 :デフォルトの名無しさん:2010/09/26(日) 14:03:02
ソースコードは同じでコンパイラだけ変えてるんですけど・・・

931 :デフォルトの名無しさん:2010/09/26(日) 14:03:41
>>930
コンパイラに依存した書き方をしてるんでしょ。


932 :デフォルトの名無しさん:2010/09/26(日) 14:03:51
これファイルから読んできた時のUTFとSJISの文字コードの違いによるデータ長の違いとかジャナイの?

933 :デフォルトの名無しさん:2010/09/26(日) 14:04:13
久々の大物か?

934 :デフォルトの名無しさん:2010/09/26(日) 14:10:53
ってか>>922無視?

935 :デフォルトの名無しさん:2010/09/26(日) 14:18:13
fとffには関数init()で初期化された値が入っています。

936 :デフォルトの名無しさん:2010/09/26(日) 14:22:57
もう全コード晒しちゃえば?暇な奴がバグ見つけてくれるかもよ。

937 :デフォルトの名無しさん:2010/09/26(日) 14:29:32
>>936
もう920でソースを公開しました。

938 :デフォルトの名無しさん:2010/09/26(日) 14:31:19
まるで全コードじゃないじゃん。

939 :デフォルトの名無しさん:2010/09/26(日) 14:41:40
VCの最適化オプション/O2を付けるとハッシュ関数が実行される度に
値が変わるという現象が起きます。
最適化しないとおこりません。GCCでは最適化してもしなくても値は
変わりません。ただしVCでコンパイルした実行結果とGCCの実行結果
は同じソースなのに違う値が出ます。なぜ?!

940 :デフォルトの名無しさん:2010/09/26(日) 14:44:10
だから全部晒せって

941 :デフォルトの名無しさん:2010/09/26(日) 14:50:19
>>939
なんで情報小出しにするんですか?


942 :デフォルトの名無しさん:2010/09/26(日) 14:54:08
構ってチャンだから

943 :デフォルトの名無しさん:2010/09/26(日) 14:54:57
行数制限で全部晒せないんかな?
だとしたら、どこかのアップローダーに上げてリンク貼ればいいよ

944 :デフォルトの名無しさん:2010/09/26(日) 14:56:08
一遍に出そうとすると改行が多いとエラーがでます。
RAMディスクの作り方、使い方がわかりません。
もうVC諦めてGCC一本にしようかな。

945 :デフォルトの名無しさん:2010/09/26(日) 15:00:16
ttp://sky.geocities.jp/tcshacina/hash.c

うpしました。よろしくお願いします。

946 :デフォルトの名無しさん:2010/09/26(日) 15:04:01
ちょっと遅かったがコード貼るならここ簡単
ttp://codepad.org/
RAMディスク俺はImDisk使ってる。他のは知らん。
ttp://www.ltr-data.se/opencode.html

947 :デフォルトの名無しさん:2010/09/26(日) 15:10:28
>>945
s5のb, codeのuが初期化されていない。

初心者は-Wallをつけて、警告を全部とる事。

948 :デフォルトの名無しさん:2010/09/26(日) 15:15:31
他人に調べてほしいのにコメントすら無しとか、ゆとりにも限度があるよ

949 :デフォルトの名無しさん:2010/09/26(日) 15:17:04
え?いらないよ?

950 :デフォルトの名無しさん:2010/09/26(日) 15:19:12
コメントは甘え

951 :デフォルトの名無しさん:2010/09/26(日) 15:19:35
VC++2010でC99でコンパイルする方法を教えてください

952 :デフォルトの名無しさん:2010/09/26(日) 15:20:05
この程度のものでコメント無いと読めないような奴が助言なんてしなくていいよ。

953 :デフォルトの名無しさん:2010/09/26(日) 15:21:47
for(i=0;i<n;i++){
for(j=0;j<2;j++)
g[i][j]=0;
// printf("debug1\n");
}
この部分で配列オーバーしてね?

954 :デフォルトの名無しさん:2010/09/26(日) 15:23:52
してなかった

955 :デフォルトの名無しさん:2010/09/26(日) 15:31:26
どうしてVCとGCCで結果が違うのでしょうね?

956 :デフォルトの名無しさん:2010/09/26(日) 15:33:15
変数名とかもうちょっと考えろよひどすぎだろこれ
ファイル読み込むならそれもアップしろよ

957 :デフォルトの名無しさん:2010/09/26(日) 15:33:53
時間がかかるとか文句言う前にやることあるでしょ、って感じ

958 :デフォルトの名無しさん:2010/09/26(日) 15:36:12
>>955
>>947が未初期化変数があるとか言ってなかったっけ?
cygwinもVCもないから中見てないけど直したの?

959 :デフォルトの名無しさん:2010/09/26(日) 15:36:18
コンパイルしてみましたか?
データファイルは大きすぎてうpできません。
何か適当なファイルでテストしてやってください。

960 :デフォルトの名無しさん:2010/09/26(日) 15:37:17
速度がデータ依存するようなコードに見えないからいいんじゃないの?

961 :デフォルトの名無しさん:2010/09/26(日) 15:37:27
直しました>初期化

962 :デフォルトの名無しさん:2010/09/26(日) 15:39:19
0でシフトすると結果ってどうなるんだっけ?

963 :デフォルトの名無しさん:2010/09/26(日) 15:40:49
どうもならない

964 :デフォルトの名無しさん:2010/09/26(日) 15:41:51
直った!結果が一致した!初期化でこんなに結果が違うんですね。
GCCって変数宣言すると自動的に初期化するってことですかね。
さすがはプロ!皆様ありがとうございました!

965 :デフォルトの名無しさん:2010/09/26(日) 15:44:40
ところで誰かこのハッシュ関数使ってみたいと思う人いますか?

966 :デフォルトの名無しさん:2010/09/26(日) 15:48:59
怖くて使えません

967 :デフォルトの名無しさん:2010/09/26(日) 15:49:31
帰れ

968 :デフォルトの名無しさん:2010/09/26(日) 15:49:50
>>964
>さすがはプロ!
いや、ほとんど学生、趣味プログラマなんだが...


969 :デフォルトの名無しさん:2010/09/26(日) 15:53:04
疑うべきはコンパイラではなく自分という典型的な例でした

970 :デフォルトの名無しさん:2010/09/26(日) 15:54:12
s5関数のやり方って、大丈夫なのかな?

971 :デフォルトの名無しさん:2010/09/26(日) 15:57:39
cygwinでmd5sumの方が3倍速いな

972 :デフォルトの名無しさん:2010/09/26(日) 15:58:02
私は大学院で暗号学を専攻してました。
このハッシュ関数の基本原理を知りたくないですか?

973 :デフォルトの名無しさん:2010/09/26(日) 15:59:24
いらないから!押し売りかお前は!

974 :デフォルトの名無しさん:2010/09/26(日) 16:00:13
こっちのCygwinだと微妙に

975 :デフォルトの名無しさん:2010/09/26(日) 16:01:44
折角の成果を分け合おうというのに。

976 :デフォルトの名無しさん:2010/09/26(日) 16:01:56
所詮、学生レベルの実装か

977 :デフォルトの名無しさん:2010/09/26(日) 16:02:04
timeコマンドでsysが影響しなくなるまで繰り返してみ

978 :デフォルトの名無しさん:2010/09/26(日) 16:09:28
もうちょっといじれるようになっといた方がいいような気がする
md5とかshaなら実装したことあるけどopensslなんてアセンブラだたよ
研究でアセンブラは要らないと思うけど分かりやすく無駄のないコードにはしないとね

979 :デフォルトの名無しさん:2010/09/26(日) 16:09:38
real 6.1s
位で安定しました。データファイルは300Mです。

980 :デフォルトの名無しさん:2010/09/26(日) 16:22:15
うちの結果(繰り返してキャッシュに入ってそうな状態から)
cygwinだと32bitだろうし64bitだとまた違いそうだけどね

C2D 3.3GHz RAM2GB data size 約118MiB
hash.exe(gcc3.4.4 -O2でコンパイル)
real 0m1.227s
user 0m1.187s
sys 0m0.078s

md5sum
real 0m0.364s
user 0m0.311s
sys 0m0.077s

openssl(md5)
real 0m0.340s
user 0m0.296s
sys 0m0.077s

981 :デフォルトの名無しさん:2010/09/26(日) 16:32:06
>>964
> GCCって変数宣言すると自動的に初期化するってことですかね。
そのプログラムで偶々0だっただけ。つまりまぐれで動いていた。

982 :デフォルトの名無しさん:2010/09/26(日) 16:41:15
すんません、結果ってあってますか?

983 :デフォルトの名無しさん:2010/09/26(日) 16:44:19
gcc -O3 -ftree-vectorize -mmmx -mmmx
gcc version 4.3.4
この環境で実行してます。これだとmd5sumより微妙に早いです。
セレロンT1600デュアルコア1.66MHzです。

$ time ./hash 3
real 0m6.068s
user 0m4.522s
sys 0m0.327s

$ time md5sum 3

real 0m6.100s
user 0m1.497s
sys 0m0.327s

$ time sha256sum 3

real 0m6.069s
user 0m4.726s
sys 0m0.373s

因みに256ビットなのでsha256sumとも比べてみました。
別段早くないですね。

984 :デフォルトの名無しさん:2010/09/26(日) 16:46:24
gcc -O3 -ftree-vectorize -mmmx -msse2

985 :デフォルトの名無しさん:2010/09/26(日) 16:48:40
32bitのsse2やO3はちょっと抵抗あるな。調べないと正確には分からないけど普通はO2だろう。

986 :デフォルトの名無しさん:2010/09/26(日) 16:49:53
s5関数の使い方、間違ってるみたいだけど

987 :デフォルトの名無しさん:2010/09/26(日) 16:50:55
オゾンと酸素の違い

988 :デフォルトの名無しさん:2010/09/26(日) 16:52:45
どう間違ってるんですか>s5

989 :デフォルトの名無しさん:2010/09/26(日) 16:53:58
-msse2はFPUでなくSSEを使うという意味なので、浮動小数点演算しか速くならない。
sse使えと言ったのはアセンブリで書けと言う意味だ。

990 :デフォルトの名無しさん:2010/09/26(日) 17:00:44
構造体直渡しって、出来たっけ
ポインタ渡しでやると結果が変わったんだけど

991 :デフォルトの名無しさん:2010/09/26(日) 17:02:15
SSE2命令はSIMDで整数演算もサポートしてます。だから128ビットデータ
を高速化できます。基本的に行列演算なのでその部分も利用してます。
ていうか少しは速くなってるはず。

992 :デフォルトの名無しさん:2010/09/26(日) 17:04:32
ポインタはデバッグしにくいから嫌い。
普通に共用体で渡せるんじゃないかな。

993 :デフォルトの名無しさん:2010/09/26(日) 17:07:06
>>991
SSE2命令は整数演算もサポートしているけれど、gccはそれを使って整数演算を最適化しない。
"-msse2"って書いただろ。良く読め。

994 :デフォルトの名無しさん:2010/09/26(日) 17:11:35
で、休日一日を費やして皆で悪戦苦闘の結果、
なんとも使い物にならない似非暗号化プログラムが出来上がったわけだが。

995 :デフォルトの名無しさん:2010/09/26(日) 17:11:36
嫌いとか言ってる時点で...
s5の中の出る直前のccのダンプと
s5出たあとのccのダンプ比較してみたら

996 :デフォルトの名無しさん:2010/09/26(日) 17:14:42
>>991
gcc -O2 -S 945.c; mv 945.s 945-nosse.s ;gcc -O2 -msse2 -S 945.c; cmp 945-nosse.s 945.s
アセンブラ吐かせても一行も異なっていないが、どういう原理で「少しは速くなる」んだよ。

997 :デフォルトの名無しさん:2010/09/26(日) 17:14:52
どう渡すのが正しいの>s5

998 :デフォルトの名無しさん:2010/09/26(日) 17:16:26
スレの残りも少なくなってまいりました。
誰か暗号化プログラム専用スレ立てれ。

999 :デフォルトの名無しさん:2010/09/26(日) 17:17:55
院出じゃなかったのか?

宣言
void s5(on *cc);

呼び出し方
s5(&c1);
s5(&c2);



1000 :デフォルトの名無しさん:2010/09/26(日) 17:18:00
問題だけ提示して0からソースコード書いた方が早いと思うんだが

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

200 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)