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

このエントリーをはてなブックマークに追加
464デフォルトの名無しさん
#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
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
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スレでも行ってろ
524522:2010/09/23(木) 16:36:19
わかりましたvsスレ行ってきます
すみませんでした
525デフォルトの名無しさん:2010/09/23(木) 17:25:59
test
int a=0;
526522: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使えば良いと思うよ
538528:2010/09/23(木) 21:00:47
strcpy_s(sz, sizeof(sz), s);と書いたらエラーも警告もなく正常に終了できました
_CRT_SECURE_NO_WARNINGSを書くと警告が出ない事も勉強になりました
ありがとうございました
539528:2010/09/23(木) 21:02:17
>>538
あなた誰?

ありがとうございました
540528: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じゃわからない。
545528: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;
}

これを実行してみるといいよ
563554: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
「括弧つけるな」だと思われる。
584560: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式で記述できるようなプリプロセッサ作れば需要あるかも
イヤないな
6281/2:2010/09/24(金) 04:10:58
教えてください。
今、関数の練習をしているのですが、コンパイル時に下記のエラーが出ます。

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

テキストの例通りに入力してもこのエラーが出るので、困ってます。
6292/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);

}
630628-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
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からソースコード書いた方が早いと思うんだが
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。