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で最適化したいのですが方法が判りません。 アセンブラで書くしかないのでしょうか?
なぜいまさらMMX?
>>464 strtoull()を実装し直すということなら、入門の範疇を大きく超えているね。
つーか、そんなプログラム、最適化しても何のメリットもないと思うけど。
467 :
デフォルトの名無しさん :2010/09/22(水) 11:32:16
64ビットデータを1クロックで処理できるから。
だれか エスパー たのむ
SSE使えば128ビット処理できないか? どちらにせよこのスレの範囲外 SSEスレに行くと良い
マルチだから放置推奨。
>>464 MSVC使用してそれなりのオプションを指定する
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; } インラインアセンブラでエラーが出ます。なぜ?
>>473 インラインアセンブラはC言語の範疇ではないので該当コンパイラスレかアセンブラスレへどうぞ。
つーか、エラーが出たならそのエラーメッセージくらい張れよ間抜け。
教え方の質問です。 int a=a+1; ↑は ;1+a=a という順番で「後ろから前」に処理すると豪語する輩がいます。 Cに限らず全てのコンピュータからの入力は「後ろから前」だそうです。 それは違うと2スレ消費して間違いを指摘しても納得してくれません。 どうやって教えたらいいでしょうか?
教える価値がないので切り捨てる
規格書の定義のレベルで説明するしかないでしょ
やっぱりそうなりますか・・・
納得させても何も得るものがない。
なんでインラインアセンブラのスレチは排除してこっちには付き合うんだよ 前者は分からないからか?w
test int a=0;
インラインアセンブラ厨はいろんなスレに出没してて嫌気さしてるんだろう。 エラーメッセージも載せないのには付き合ってられん。
わりとどうでもいい
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のアドレスを格納するポインタ変数を構造体の外に作って それをさらに格納する無名のポインタ変数を構造体の中に作る・・・みたいな事なのか?
test int a=0;
>>473 文法通りになおしたらエラーは出なくなる。
結果: 0,-1000,-2000,-3000
487 :
デフォルトの名無しさん :2010/09/22(水) 19:54:44
>>486 本に書いてある通りにしてるんですが、どこが悪いのかわかりません。
>>484 並べ替えを考えた時
child がいきなり実体の配列になっているよりは
child がポインタ配列で交換はたかだかポインタを入れ替えで済むほうが都合が良い場合もある
プログラム固有のデータ部がとても大きかったり
要素数+ポインタ になってて、入れ替えの際、実体の複写を取るのに面倒だなー ってケースね
ま、後者はデータ固有部分にあるポインタを移すだけなんだけど…
移譲と複写を注意深く区別しないと、思わぬ落とし穴に捕まるので、難儀な所かも?
>>484 こんな感じ
ズレてたらすまん
Node
+-----------+
| a |
+-----------+
| child_count |
+-----------+
| child | --> +-------+
+-----------+ | child[0] | --> Node
+-------+
| child[1] | --> Node
+-------+
| child[2] | --> Node
+-------+
( ^ω^)カレー食わせろお
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));
インラインアセンブラってC言語標準なんですか?
494 :
デフォルトの名無しさん :2010/09/23(木) 00:29:53
いいえ
オンラインアセンブラってどうやって使うんですか?
まず服を脱ぎます
それから外へ出ます
そういえば最近、服着てねえな。ここ一週間くらい。
服着てないぐらいならまだまし 俺はその上体も洗ってない
そもそも体がない
本当か?
* * * ウソです + n ∧_∧ n + (ヨ(* ´∀`)E) Y Y *
503 :
デフォルトの名無しさん :2010/09/23(木) 06:56:11
writeとprintfってどっちが早いですか? printfは出力をリダイレクトしてます。
普通は write(2) でもお前のプログラム次第だから実測するのが一番
505 :
デフォルトの名無しさん :2010/09/23(木) 07:39:03
readとwriteの使い方を教えてください。 ファイルから16バイト読み込んで暗号化してから書き込みます。 プログラムの例で使い方を知りたいのでよろしくお願いします。
>>184 ぐぐって出てくるページじゃ不足なのか?
それともそういうのじゃ理解出来ないぐらい頭が残念なのか?
バックパス禁止
>>503 目的が違うので、単純に比較できない。
write()と同じ条件で較べられるのはfwtite()だ。
仮に整形の必要があるならprintf()でいいが、それならsprintf()+write()で較べるべき。
>>505 ファイルからの入出力なら、無理にread()/write()を使わずfread()/fwrite()を使った方が無難。
509 :
デフォルトの名無しさん :2010/09/23(木) 10:45:49
>>508 fread(),fwrite()で処理したら高速化出来ました。
今暗号作ってるんですがBLOWFISHより速くなりました。
ありがとうございました。
今VC++2008で作ってたプログラムをデバッグしたら実行最中に "warning: FT_OpenType_Validate is disabled. Replace FreeType2 with otvalid-enabled version." と出て、リリースの方でも試してみたら今度はバッファオーバーフローを引き起こしました。 ↑のエラー文をググってもいまいちわからないので誰か詳しい方教えて下さい・・・
ありがとうございます。 どうやら単にバッファサイズが足りないだけでした。ご迷惑をお掛けしました・・
513 :
デフォルトの名無しさん :2010/09/23(木) 12:21:47
>>488 ,
>>489 「なぜそうした方がいいのか」はともかく
「なぜそうなるのか(内部でメモリがどう確保されてるのか)」がわかんないんだ
**childはポインタ変数のアドレスを参照するポインタ変数が作られるのは分かった(多分)が
child[0]からchild[2]までのポインタ変数の配列については、どこでメモリが確保されてるのか、とか・・・
俺、ポインタについて根本的にどっか勘違いしてるのかな?
typedef struct Node_tag{ int a; // プログラム固有のデータ int child_count; // 子の数 struct Node_tag *child[]; // このポインタの先にmalloc()で可変長配列をつなぐ }Node;
>>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()の勉強だ・・・
一番最初に「/*」をつけて 一番最後に「*/」を付けると ・・・main関数が無いって怒られるか
>>518 gccだとemms命令無しでもエラー出ないのか
521 :
デフォルトの名無しさん :2010/09/23(木) 16:21:16
一応動きました。 あと、unsigned long long int って使ってもMMX命令に変換されないのでしょうか。 32ビットで最適化したほうが早いですか?
522 :
デフォルトの名無しさん :2010/09/23(木) 16:25:57
>>522 ほぼIDEの操作の話になるからスレチだな
vsスレでも行ってろ
524 :
522 :2010/09/23(木) 16:36:19
わかりましたvsスレ行ってきます すみませんでした
test int a=0;
526 :
522 :2010/09/23(木) 17:55:51
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 スキップ ==========
> どこをどう直すしたらいいでしょうか?
英語メッセージを見ると思考停止する
>>528 の脳味噌を入れ替える。
>>528 エラーは出てないよ。strcpyは安全じゃないよ、と警告してるだけ。
strncpyを使うといい。
>>528 strcpy()のところ。
エラーメッセージは、strcpy_s()という関数を使うべきだ、と言ってるよ。
#pragma warning(disable:4996) とかなんか。
strcpyぐらい使わせてやれよ(>_</ばんばんばん!
マイクロソフト製品なんか使うからそういうことになる
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
540 :
528 :2010/09/23(木) 21:10:18
>>539 あなたも誰?
ということで皆のあたたかいご支援を土産に
人生を終了することができました
ありがとうございました
素朴な疑問 sizeofで配列szのサイズを知ることができるのなら、 なぜstrcpy_sは、引数を3個に増やしてしまったのだろうか? たとえば strcpy_s(char* dst. char*src){strncpy(dst,sizeof(dst),src);}と、定義すると問題があるのだろうか?
>>541 mallocされてたら、sizeofじゃわからないよ?
>>541 C言語ではRTTIをサポートしていないから。
それからchar *a;をsizeofでとっても、4バイトにしかならないから。
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]; }
ま、なんつーか、他にも突っ込むところはあるんだけども、 とにかく、sizeof()の結果っていうのはコンパイル時に決定できなくちゃならないのですわ。
C99なら許可されてるかも C89/C++では禁止されてる
>>545 strncpy()の仕様を誤解してる。
sizeofってマクロなんだよ。つまり単純な「文字列置換」。 プリプロセスなので実行前にわかってないと置換できない。
sizeofは演算子だよw
sizeofはプリプロセスじゃ使えねーよ
>>548 実は俺、C99はあんまりよく知らないけどさw
さすがにそれはない、と思うんだけど。
違ったら、かなりえらいことになると思うんだが。
コンパイルする前にサイズを指定しないとだめなんですね char func(char x) { char s[5]; } xの値が文字列「12345」でchar[6]だとエラーは出ないですけどxの値が「1234567890」のように長くするとエラーが出ます 例外処理っていうので対策できるのかと思ったのですが検索したのですがCには例外処理がないんですかね? このような場合はどのように対策するのでしょうか?
ポインタにsizoefしてもポインタのサイズしか得られない 問題になってるのは単にそれだけの事
配列のサイズを汁にはsizeof(sz)ではダメなのですか? では、どうすれば知れますか?
sizeof x==1
>>556 szが配列ならそれでいい
要素数じゃなくてバイト数だがな
最近のVCは_countofマクロってのがあって要素数を取得できるが
標準ではない
>>556 いや、それが配列として定義されたものであれば、知れるよ。
char szarg[10];
assert( sizeof( szarg ) == 10 );
これは動く。
でも、
char* pszarg = malloc( 10 );
assert( sizeof( pszarg ) == 10 );
は通らない。
なぜなら、sizeof(pszarg)の値はポインタの(アドレスの)バイト数が返ってくるから。
#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のサイズを越える文字列を引数で渡すとエラーが出るのですが
このような文字列が渡された場合はどのように対策処理するのでしょうか?
>>559 szが配列ならsizeof(sz)で配列の長さがバイト単位でわかるんですか?
もしそれが本当なら、
strcpy_sに渡せる配列を、非mallocな変数に限定することで、
引数を3個にしなくても安全な関数にできる気がしました。
引数はchar x で合ってるのか
すいませんこうでした char func(char sz) { static char sz[5]; strcpy(sz, s); return sz; }
>>563 自分でチェックしてエラーを返すなど、呼び出し元にもからくりを準備して対応するしかないのでは?
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; }
すいませんでした。今度はコンパイルと降ります #include <windows.h> #include <string.h> char* stringTest(char* s) { static char sz[5]; strcpy_s(sz, sizeof(sz), s); return s; }
>>566 ,567
では、配列を配列型のまま渡す方法は無いのですか?
渡した側でそのまま使いたければ文字列みたいにセンチネルを設定しろよ。 データ構造を自分の好きなように設計すればいい。 C はそんな部分までルールを強要されてないんだよ。
>>579 おかしいっつか、return(0);みたいなもんだろ。
普通は付けない。
584 :
560 :2010/09/23(木) 22:16:23
>>579 577じゃないんだが、
多分sizeof(x)ではなくて、sizeof xのように書け、といってるんだろう。
で、俺はsizeofはカッコ付けたいなあ。
>>575 無くはないが、特定の要素数の配列しか渡せなくなる
結局意味が無い
C++だとテンプレートを使って回避できるし、
strcpy_sもそれ利用して実装されてるが
sizeofは優先順位が間違った設計になっているので、括弧をつけるのが正解。 四則演算より強ければ、つけないという選択でも良いのだが。
sizeofはカッコをつけないとコンパイルが通らないことが あるんで、いちいち考えるのめんどうだから、常につけてる。
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);
}
>>586 もちろんsizeof(a+b)のカッコを外したらだめだが
sizeof(a)+bとsizeof a+bとに何ら違いは無い
sizeofに()が必要なのは、sizeof(int)みたいに型のサイズを求めるとき
かっこつけるなら(sizeof a)だな
なんという低レベル度の高いスレだ……。
>>586 四則演算より上だが、お前は何を言っているんだ
>sizeof(int)みたいに型のサイズを求めるとき 型のサイズを求める以外に sizeof を使ったことがない。 配列? vector<> とか deque<> とかしか使わなくなってしまった‥‥‥。
596 :
デフォルトの名無しさん :2010/09/23(木) 22:29:18
>>586 その「間違った優先順位」とやらを直しても外せない括弧がある
つまり直せという主張に疑問符がつくぜ
お前らどうせdeque<>をデキューとか呼んでるんだろwwww
つか、ここはC++じゃなくて、Cのスレなんだからさ…w
デクェ
>>596 そもそも間違った優先順位なんてないがな
>>597 え、できゅう、じゃないのですか。あはは‥‥。
>>599 STL って C じゃなかったのね。あはは‥‥。
吊ってくる
あはは
>>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;
>>605 お前の処理系がC99合致でないから
C99より前は変数の宣言はブロック先頭のみ
607 :
デフォルトの名無しさん :2010/09/23(木) 22:44:58
>>601 それは悪かった
で、何を「間違った設計」だと言いたかったんだ?
少なくともここは変だぜ
> 括弧をつけるのが正解。
つけなくても正解があるので意味をなしていない
なぜ急に1000に増えたの あと、比較するなら5<=strlen(s)では
関数内でそんな処理するより、関数呼ぶ前にすませとけよって話
外部リンケージなら内部で処理しろよ 危なっかしい
612 :
デフォルトの名無しさん :2010/09/23(木) 22:52:17
>>609 そうか、横レスだったのか
では見逃してやろうw
同じ相手をバカにしてるはずの相手を、そのバカだと誤解したあげくに捨て台詞とかw
mellocで動的にサイズ変更したらオーバーフロー対策になると思うんだけど違うの?
strdup()ってことか? ま、標準じゃないけどね。
そうか、型名は()で括ると言うルールか。ところで何で()で括らないといけないんだ?
そういう文法だから
でっく
620 :
デフォルトの名無しさん :2010/09/23(木) 23:06:34
>>617 typename に似たような事情がありそうだね
>>615 違う。
貴方が言っているのはオーバーフロー。
貴方が言いたいのはオーバーラン。
typenameは変数/関数か型かを文法上区別するためのもの どっちでも可でどちらなのかは意味解析に任せる、じゃ困るケースがあんだろうね
623 :
デフォルトの名無しさん :2010/09/23(木) 23:41:03
sizeof a * b って言われたとき a や b は何に見えるだろう コンパイラはどこまで何を保証すべきだろう sizeof 1E+1 sizeof 1L+1 の違いはパーサの責任範囲?
625 :
デフォルトの名無しさん :2010/09/24(金) 00:07:34
キャストの括弧というと… (void(*)(void))a こうでもよかったはずだよな void(*(a))(void)
>>621 バッファオーバーフローもバッファオーバーランも
変わらないと思うが、もしや
>>615 のオーバーフローが
桁あふれを意味していると言う解釈か?
流石に曲解だろ。
関数コール以外は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); }
申し訳ありません。 コピったのを貼りつけたら改行がおかしくなりました。
とりあえずint main(void)って書いとけ
>>631 うまくいきました。
ありがとうございます。
原因は何が考えられるのでしょうか。
>>632 何のコンパイラを使っているかしらんが、
そのコンパイラではmain関数はintを返すと規定されているのでしょう。
ISO Cとして厳格なコンパイラってことだろう。
ちなみに、mainのreturn値はUnixでいうところのプログラムの終了コード
に反映される。
>>633 成程。
とりあえずmain関数でintを返すようにしておけば問題なさそうですね。
ありがとうございました。
助かりました。
635 :
デフォルトの名無しさん :2010/09/24(金) 05:12:08
コマンドラインから処理したいファイル名を指定するにはどうす。れば いいですか。教えてください。よろしくおねがいします ./a.exe infile outfile
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
ありがとうございました。
それでいいのか FILE *in, *out; in = fopen(argv[1], "r"); out = fopen(argv[2], "w"); みたいにしたいのかと思ったが
それくらいの応用は自分で思いつくだろ
640 :
デフォルトの名無しさん :2010/09/24(金) 06:10:06
出力ファイルに固定の拡張子をつけるにはどうすればいいですか。
sprintf
char outfile[256] ; sprintf ( outfile, "%s%s", argv[2], ".hoge" ) ;
643 :
デフォルトの名無しさん :2010/09/24(金) 06:30:54
プログラムのどこに書いたらいいですか? infileだけが必要になりませんか? 因みにファイル処理はサブルーチンの中でやってます。
日本語でおk
頭が付いてないのか
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 みたいな
説明が下手だな。コマンドラインからは一つだけファイル名を指定したいんだろ。 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; }
argcはコマンドライン引数の数+1だから それで分岐しろ
650 :
デフォルトの名無しさん :2010/09/24(金) 07:47:09
どうやってもうまくいきません!
651 :
デフォルトの名無しさん :2010/09/24(金) 07:50:11
sprintfってファイル名を付ける関数なんですか?
ここで聞く以前にさ、本とかwebで勉強しろよ。お前の質問はそんなレベル そんでそれでどうしても分からなかったら聞きに来い
#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" ) ; }
マイクロソフトのコンパイラ専用のコードになってね?
>>628 その警告は「returnで返してる値の型が間違ってる」だ
voidは何も返さない関数だから、returnを使わない
void main(){
printf("test");
}
intなら整数を返す
int main(){
printf("test");
return 0;
}
なにをいまさら
658 :
デフォルトの名無しさん :2010/09/24(金) 08:52:22
ファイルが作成できました。 ファイルポインタ指定しないでファイルを作ろうとしてました。 sprintfを初めて使いました。
659 :
デフォルトの名無しさん :2010/09/24(金) 11:41:05
vc++2010expressにatlstr.hというのが入ってないんですけど絶対パスから相対パスに求めることがしたいのですが代替方法ってありませんんか?
>>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"); とするのはいいのですが、復号のときに暗号化されたファイルを 読み込んで処理しても復号できない。 何のデータにばけているのかわかりません。
まず暗号化が正しく行われているかどうかを確認するべき プログラムで暗号化してできた暗号文を、手作業で暗号化したものと比較してみる 暗号文が間違ってるなら、そんなもの復号できるわけないからな
664 :
デフォルトの名無しさん :2010/09/24(金) 13:08:34
暗号文は正しいです。手動でプログラムのファイル名を書き換えて 復号すれば成功します。プログラムで自動化しようとして失敗してます。
まとめて自動化したとき書き込み後fcloseせずに読み込んだとかか?
fpは fp=fopen("2.perm","wb"); fp=fopen("2.txt","wb"); fp=fopen(fout,"wb"); の3通りあるのか? どういう使い分けで?
どこの段階でおかしくなってるかデータを出力して確認すれば。デバッグ能力を養うチャンスだ。答えだけポンと与えられてもまたすぐ行き詰るぞ
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 復号化 これでうまくいくはずなのに、そうなりません。
じゃあコンピューターが壊れているんだろう。買い直せばいいんじゃないかな
>>661 まあ、Cスレで面倒見るべきなのかね。
ファイルを書き込む時と読み込むときにはどんな風にしてるの?
fread,fwriteしている箇所の行を見せろ そこが間違ってなければ暗号アルゴリズムが 間違っているか正しくコードできてないだけ あるいはコーディング特有の雑多で膨大な種類の 些細なミスの幾つかに引っかかって正しく動作さ せられていない と推測
根本的な問題は解決する気が本人にないこと構ってチャンなこと
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);
}
情報小出しも構ってチャンの特徴だよな。うんざりだ。
今週からCの勉強した人っていますか?
>>676 >手動でファイルを指定してコンパイルすると元に戻るのですが
ファイル名をソースに直書きした場合は正常に復号される
>自動化しようとするとバイナリになってしまいます。
ファイル名をコマンドライン引数で指定するとうまくいかない
ってことでおk?
とりあえずファイルIOは考えずに,適当なデータで暗号化・復号化が正常に動くのかどうかを検証しろ
よくわからないが fp=fopen(argv[2],"wb"); fq=fopen(argv[1],"rb"); でいいんじゃないの? もちろんfopenの戻り値はNULLチェックしてるよな?
>>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にならない時はパディングします。
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"); }
というか、まだそういうレベルに達してないんだよ。 1つずつキッチリと覚えていけばいいんだよ。 命題を明確にしろ。 1度にやろうとするな。
もう宿題スレに行って全部書いてもらえよ もしくは現状のソース全部うpしろ
今時Cとかねえわwwwwwwwwwwwwwwwwww 開発効率もわりー言語を使ってんのは何か?プライドってやつか?wwwwwwwwww 今の時代は言語はなんだっていいんだよwwwwwwwwwwwwwww C#様最強伝説なんだよわかったかおまえらwwwwwwwwwwwwwwwwwwwwww
>>689 よし、バイナリ読み込んで構造体の配列にするコードをC#で書いていいぞ
つーか、ここまで質問したんだったら全部のソース 晒すのが手っ取り早いんじゃね?
>>689 そんなこと言われたってなぁ・・・
言語選べる立場じゃないし・・・
>>690 unsafeコード使えば楽勝じゃね
Fortran以外は糞言語
おまえらが生きてる世界がそれだよ
>>695 バグだらけじゃねーか、さっさと修正ry
取り敢えずフラグの調整ミスなんt
変数に$testみたいに書きたい。無理やりでもいいのでできますか?
つーかいい加減仕様変更してアドレス演算は&じゃなくて@にしろよ分かりやすいから
@がatなのはすべての国じゃないんだろ?
しろよって何?
日本だってバックスラッシュが出なくて 代わりに ??/ を使ってるんだから問題ないだろ。
単価記号でわかりやすくなるかなぁ どっちもどっちの気がするから今のままでいいんじゃね
>>679 今週からC#を勉強しています。関係ないけど。
女の勘よ
くだらない
はい次
return -1;でmainから抜けるとどうなりますかー?
exit(-1)が呼ばれる
呼ばれたら?
どうなるか試してみたらー?
ばぐった
結論 return -1;はバグる。
なぜバグる?
何でもバグらせるんだな ある意味すごいぞ
719 :
デフォルトの名無しさん :2010/09/25(土) 01:03:47
自作自演(aa ry
コンパイルでも実行でも何の問題も無かったぞ? コンパイラはborland c++、osはwindows 7 #include <stdio.h> int main(void){ return -1; }
えっ、マジで言ってるの?
いや、まあ、バグじゃない。 ただし、プログラムの終了コードとして-1にはならない。 (少なくともUNIXでは) Windowsはどうだったっけ?
普通に0xffffffffが返ってくるけど
デバッカと シェルで実行してプロセスの終了コードを取得してチェック
>>720 どうして stdio.h なんか include してるの?
なんのシェルだ?w パワーシェルとかいうなよw Windowsだと、そんな値返ってくるのか。
てか0xffffffffは-1だしょ
UNIXユーザーでシェルが分からないとかどこのモグリだよ
実行環境によって負数を取るか取らないかが違うから16進で書いたんでしょ
>>729 UNIXなら終了コードは8ビットだから、0xffffffffにはなりえない。
というかCで自分のところの実行結果を根拠にするのもどうかしてる
オレの所ではこう動いたんだから他所でもこうなるはずだ! よくいるタイプリストに追加だな。
735 :
デフォルトの名無しさん :2010/09/25(土) 12:33:04
Cを覚えるのにおすすめのサイトを教えてください
正直モニタでコードおっかけながら勉強するより本買って勉強した方が良い
昔の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です
>>738 printfとscanfの位置は本当にそこでいいのか?
>>738 EOFを入力って何をいってんだ?なんか勘違いしてんな
素直に0を入力したら終了、name[i][0] != '0'で判定
とかにしとけ
まさか、文字列で"EOF"と打ち込んで終わらないっていってるんじゃ?
>>738 だとEOFは-1として評価されてる
文字列で評価したいなら文字列比較で判断しないと
742 :
デフォルトの名無しさん :2010/09/25(土) 15:22:50
>>739 おかしい所があるのでしょうか…もう少し考えてみます
>>740 そのままfor文に入れてname入力の箇所で0を入力したのですがループから抜けませんでした
>>741 いえ、Ctrl+Dを打ち込んでるんですがループから抜け出せないです
EOFを見るのはscanf()のリターン値だろ。
Windows なら EOF は Ctrl-Z だな。
745 :
デフォルトの名無しさん :2010/09/25(土) 15:53:04
>>743 勉強不足だからかよくわかりません…申し訳ない
>>744 ありがとうございます、ループからは抜けられませんでしたが…
勉強不足ってレベルじゃねーぞ
勉強不足の人が実務やってるという事実が
どうしても終了したければ 名前の1文字目で Alt を押しながらテンキーで 255 と入力すればいいよ。
scanfの戻り値は変換に成功した個数を返すから if (scanf("%s", name[i]) != 1) { break; } とかしなされ。
750 :
デフォルトの名無しさん :2010/09/25(土) 16:52:27
C言語の勉強をする場合はじめはコンソールプログラムからやったほうがいいですか? あとVC++を利用したほうがいいですか?
できるものからやればいい。
Linuxでコンソールでgccでやれ
よっぽど簡単なGUIライブラリがなければコンソールからやったほうがいいよ 当たり前のようにGUIで入門講義やる教授がいて殴りたくなった
CでTerapad並みのエディタを作れるようになるまで結構勉強しないとだめですか?
756 :
デフォルトの名無しさん :2010/09/25(土) 17:22:08
GPGに勝ったと思ったらOpenSSLに負けた。 一秒で100メガ処理するためにはどうすればいいですか? バッファを増やしても変化がありませんでした。
>>738 EOF は文字ではありません。
ファイルが終了したり、コンソールで特定のキーが押されたときなど、すなわちストリームが終了したときに、getchar() などの関数の返り値が EOF = -1 になるというだけです。
そして、scanf() でストリームの終了を検知するには、scanf() の返り値をみればいいでしょう。
if (scanf("%s", name[i]) == EOF) { ... } で判断すればいいと思います。
>>754 手頃なTextEditのようなライブラリとかを使わないで、1年以内に
書くことができたら、君はおそらく天才だよ。
ゼロから書くとnotepad.exe(メモ帳)でも結構大変だよ。 "EDIT"クラスを使わないで、という意味ね。 それでもASCII文字限定で読み込み・編集・保存だけなら がんがれば1年くらいあればでできるかもしれん。 TeraPadレベルはエスパーでも時間かかるし大変だと思う。
>>757 scanf の戻りは値格納した非引数の個数
だから EOF を戻すことは無いかと
>>761 ごっめーん EOF返せるね。
%s で受けるなら getchar() 関連併用でのアレも発症しないから検出できるのか
特別にゆるす
乱数を用いたプログラムで何度実行しても同じ結果が出力されてしまうのですが どうしらいいのでしょうか?
コードを晒せよ
ループ内でsrandしてるって可能性もあるな
精度の良いランダムアルゴリズムってありますか?
mt
ランダムアルゴリズム? モンテカルロ法とかのこと?
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のみかたもよくわかりません。
アプリレベルになるとパラメータゲットやコンディション解析や そのバリデーションを行うスレッドと実計算を行うスレッドが 分離されていることも少なくない。システム協調性を高めれば 概してそういう設計にされることが多い。 なんで単純に速度差をアルゴリズムの差と決めつけることも 出来ない。
774 :
デフォルトの名無しさん :2010/09/25(土) 20:22:32
time *** では計測時間のどこまでが反映されているのでしょうか。 アルゴリズム以外でファイルIOの違いで差がつくのでしょうか?
>>774 sysはIOとかシステムコールで、userがアルゴリズムっていうか、
実際のコードの部分。
777 :
デフォルトの名無しさん :2010/09/25(土) 20:29:10
opensslと比較してるんですけど敵いません。 アルゴリズムは単純なのでストリーム暗号として使えると思って いたのですが、300Mのテキストファイルの暗号化を時間計測 したらこんな結果になりました。opensslのソースを見るしかない のでしょうか。誰か高速化につながるアイデアを教えてください。
アイデアも何も、今どういうコードなのか分からんと言いようもないような。
っていうか、まずはプロファイルとれって話じゃないのか?
>>772 realが実際に掛かった所要時間。elapsed timeとも。
userがユーザプロセスの消費時間。コアを複数使った場合は実時間より長いことも。
sysがシステムプロセスの消費時間。カーネルの処理時間やI/Oの時間など。
sysを比較すると、grsが若干速い位で大差ない。ディスクキャッシュなどの影響も受けるので、誤差の範囲内か。
userを比較すると、逆にgrsが目立って遅い。
ついでに言えば、user + sys がrealに比してどれもかなり遅い。
恐らく1コア環境で実験しているのじゃないかと愚考するが、
今時そんなレアケースで比較されてもなんとも言えないなぁとミサカはレスしておきます。
まず最適化オプションは指定しているのか心配なレベル
sslを自力で実装してopensslと比較してるような人が
>>777 みたいな
要領を得ない質問の仕方をするとは思えないけど。
783 :
デフォルトの名無しさん :2010/09/25(土) 20:46:41
OpenSSLって強敵ですね。GPGには速度的に勝っているのでいけると 思ったのですがさらに上が。 プロファイルをとるという意味が判らないので教えてください。 どうしてgrsのuserだけがこんなに遅いのか、処理が複雑だからでしょうか。 気になります。ソースを見せてもいいので改善方法を教えてください。 ちょうど乱数の話も出てきたことですし。ちなみに使用環境はVista セレロンT1600デュアルコアですが並列化はしてません。基本的に 行列演算なのでSSE2を一部使っています。メモリアクセスの遅延も 考えられるのではと思います。何かアドバイスしてください。
OpenSSLはAESはアセンブリで書いてる。SSEは使って無いから勝ち目は有るぞ。
>>783 GPGは仕組み的にみて全然遅いに決まってる。
というか、GPGより遅かったらストリーム暗号として存在意義が疑わしくなっちゃう
最近の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
>>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
何が出来るようになったら初心者卒業になりますか?
そういう質問しなくてもいいかな?と思えるようになったら
>>790 読書きだけでOpenSSLと互角じゃないですかw
>>773 の指摘の線も調べてみてください。
ディスクからの読み書きブロッキング中に別スレッドで
暗号化している可能性があると思います。
私だったら途中でデバッガをアタッチしてブレークしてみるとか、
ProcessExplorerで見るとか、します。
それからもしかしてcygwinですか?
>>791 そうだなあ…
Cだよね?
longjmp使って、例外のようなエラーハンドラ作れるようになる。
自分でクラス構造体を作ってオブジェクト指向プログラミングを実装できる。
くらいできれば、1人前でいいんじゃないかなw
>>791 本やサイトなどに載っているサンプルを写しただけのとは異なる、自分で考えた新しいプログラム(内容は何でもいい)を作れたら
知らない技術をすぐ使えるようになったら
797 :
デフォルトの名無しさん :2010/09/25(土) 21:25:13
>>793 773の意味がわかりません。Cygwin32で実行してます。
どうしてOpenSSLはこんなに早いんでしょう。
>>796 それはもう上級者と言っていいレベルじゃないかな
OpenSSLはオープンソースなんだから自分で頑張れよ
800 :
デフォルトの名無しさん :2010/09/25(土) 21:28:51
while((read_size=fread(buff,1,1024,fq))){ // 暗号化処理 fwrite(buff,1,read_size,fp); } こんな感じで。
CってPHPみたいにMVCパターンでかけませんか?
オブジェクト指向風に書けるんだから MVCパターン風には書けると思う
あーかったるい
>>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
読み込み、暗号化、書き込みをスレッドにする方法がわかりません。 簡単にできることなんですか?マルチコアでなくても効果があるのですか?
>>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を秀丸で書くのはやばいですか?
>>809 なんでやばいの?
Notepadで書く奴がいるくらいだw
秀丸使ったって全然問題ないだろう。
811 :
デフォルトの名無しさん :2010/09/25(土) 21:54:24
全くやばくない。
やばいからnotepad++使おうぜ
813 :
デフォルトの名無しさん :2010/09/25(土) 22:00:54
自動的にスレッドに割り当ててくれる方法はないのですか?
edlin 使えよ Win なら。
うー…さすがにedlinはつれーw せめてex
自動的にスレッド・・・OpenMP?
817 :
デフォルトの名無しさん :2010/09/25(土) 22:16:03
スレッドがよくわかりません。まだそういうレベルです。
818 :
デフォルトの名無しさん :2010/09/25(土) 22:16:49
アルゴリズム的に遅くないってことでいいですよね。 後は実装方法だけ。
秀丸とか日本人しか使ってないマイナーエディタじゃん
むしろ、I/Oスレッドと計算スレッドが分離しているほうが 処理は遅いことのほうが多いんじゃね? ただしこの分離モデルはストリーミング(コマンドライン上から パイプラインで処理できることに対応)とか、IPCとかSocketとか で複数のプロセスと通信したりするようなケースでは良く取られる
cygwin上でvim使えば良いじゃん
while((read_size=fread(buff,1,1024,fq))){ 読み込みサイズの1024を 4096とか64*1024とかに変えてみて 時間を測ってみたら
xyzzyのc-mode
826 :
デフォルトの名無しさん :2010/09/25(土) 22:48:05
今時viとかemacsとか言ってる奴らって、「憧れのMJと同じシューズを履きたいピュアな少年」のような発想だよなw
827 :
デフォルトの名無しさん :2010/09/25(土) 22:49:43
まあ、秀丸はねーわな。 使ってる連中、すごいダメそう。
>>826 そうなんです。あこがれの RMS のつくった‥‥‥、xyzzy って日本人でしたっけ。
830 :
デフォルトの名無しさん :2010/09/25(土) 23:05:41
32バイトで読んでた時はすごく遅かった。
831 :
デフォルトの名無しさん :2010/09/25(土) 23:05:59
エディタは作者の好みと自分の感覚のズレがあるとずっと不快だから色々使ってみたほうがいい オプションで調節できないところでイライラって結構あるからね 俺は昔の VC とか好きだったけど、あの会社の常で勝手にいらんことするようになって心が離れた vi はさすがに見劣りはするけど今でも一目置いてるご長寿さんだ
暗号化処理が遅いということじゃ?
ターミナル経由じゃないと使えない環境もあるんだよ・・・
834 :
デフォルトの名無しさん :2010/09/25(土) 23:13:07
300Mのファイルの読み書きだけで10秒かかるんです。
viはあんまり積極的な評価ないな。 おれはIDE派だから使わないけど、VSやらEclipseにviのキーアサインが あったらそれ使う。
>>807 その方法だと3つのスレッドが同時に読み込みに行ったりしないか?
>>818 ディスク読書きだけで10秒、暗号化含めると18秒なら、
暗号化で8秒近くかかってるって考えていいんじゃないですかね。
禿丸
なぜemacsがない!w emacsは習得には時間がかかるが、習得すればこれ以上のエディタはないぞw まさにプロユースw
PC-98 に FE(?) ってエディタって無かった? 探しても見つからないんだが。
840 :
デフォルトの名無しさん :2010/09/25(土) 23:27:25
暗号化に8秒って遅いですかね。ストリーム暗号。 300Mのファイルですが。
>>840 300Mだと読んで書くだけでそのくらいかかるんじゃない?
メモリマップで
>>839 ああ、Finalでしょw
FINAL,RED,MIFESはPC-98時代の3大エディタw
844 :
デフォルトの名無しさん :2010/09/25(土) 23:31:04
OpenSSLだと読み書き暗号化全部で11秒位で終わるんです。 この高速化の秘密は何?!
>>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
プログラム初心者なのでスレッドとかわかりません。
初心者を口実に向上心を捨てる奴は死ね
スレッドって要は内部でこうやってるだけなんでしょ 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); } }
854 :
デフォルトの名無しさん :2010/09/25(土) 23:49:48
>>852 処理の途中で状態を保存してreturnして、制御がきたら前回の続きから
はじめるとか考えなくていいから、そう書くよりロジック書くのは楽だな。
>>853 VZはちょっと後発なのよね。
最終的にはVZが席捲するんだが、その時にはPCの主役も
PC-98からDOS/Vと言われたIBM互換機になっていた…w
>>852 そんな考え方してたらマルチスレッドプログラミングで間違いなく死ぬ
858 :
デフォルトの名無しさん :2010/09/26(日) 00:01:15
>>857 考え方も何もそれってノンプリエンプティブマルチタスクのディスパッチャだろ
コマンドプロンプトのバッチ処理だろW
マルチスレッドの本質ってものすごくシンプルだよね。 知らないうちは何か高度なことだと重いがちだけど。
ガッチガチのホモっホモだな。
>>845 その方法だとECBにしか対応できない。
>>856 後発と言うか、Vzとして公開されてから見知った人にとってはそうかもしれないが、
それ以前にEzとして既に我々の間では広く普及していた。
>>840 かんたんにクラックできる暗号作ってなにやってんの?
866 :
デフォルトの名無しさん :2010/09/26(日) 01:17:15
>>863 だからストリーム暗号だって言ってるだろ。
>>840 悪いこと言わないから、Cのコーディングや実行速度に気をとられてないで
>>862 見たいな本でまず有効な暗号とはどんなものなのかについて学べ。
そして、今ある有効な暗号化のアルゴリズムを使って実装するべき。
予測不可能性の高い乱数を発生させるだけでもひとつの技術だわな
869 :
デフォルトの名無しさん :2010/09/26(日) 01:23:01
>>867 使う暗号アルゴリズムは指定されてるんじゃないの。
870 :
デフォルトの名無しさん :2010/09/26(日) 01:23:06
C言語でぷよぷよが作りたい
それはゲームを作るのか、それともあの物体を作るのか
>>872 それを上記の文章から読み取れないお前がプログラムを弄れるとは思えない
曖昧な仕様から曖昧な実装を行うのは3流のする仕事
明確な仕様が無いからと言って即座に逃げの一手を打つのは4流のする仕事
876 :
デフォルトの名無しさん :2010/09/26(日) 01:35:51
まずパンツを脱ぎます
パンツを履きます
>>870 が本当に欲しかったものはぷよぷよ通なのだろうか
$ gcc -O3 -ftree-vectorize -ftree-vectorizer-verbose=5 -mmmx -msse2 -o gsr gsr.c まず、-O2のみで時間測って、どんくらい違うか調べたら
マルチスレッドって簡単にいえばこうだよな 俺(メインスレッド)は今の仕事(メイン関数)を続けるから 誰か(サブスレッド)あの仕事(他の関数)を処理しといて
この仕事やっとけって?あ、いいっすよ ・・・ この資料借りていいっすか? え、だめ? じゃあちょっと横で待ってますね ・・・ あ、終わりました?じゃあ借りてきますね え?やっぱ返せ?いや、でもこっちも仕事しないと ・・・ ふ〜終わった、あー、資料返しますね ・・・ ひまだなー、仕事ないかなー(ちらっ こんな感じかな
まあ一種の幻想だよな。 コア増やしただけのCPUを正当化するための詭弁だよ。
char name[32]って配列だとそれ以上の文字列が入力されたら他のメモリも破壊してしまうけど char *nameだったらどんなに入力しても*(name + i)に保存?されて大丈夫な気がするんですがどうなんでしょうか?エスパーの方お願いします。
どこに入力するんだよ。
>>886 だめですw
まず、そもそも、メモリは有限です。仮想メモリがあろうがなかろうが、
無限のメモリなんてありません。書きつづければどこかで切れますw
アドレス演算は符号なしですが、結局のところ、最大値を越えれば0に
戻ります。よって、この理屈だけでも最終的にはすべてのメモリを破壊
してしまうことがわかります。
で、実際には、nameがどこを指しているかにもよりますが、スタックか
ヒープを破壊して、Segmentation Faultになりますw
>>887 >>888 ありがとう。
ちょっとポインタと配列の関係が上手く理解できてないみたいです。
配列の先頭アドレスにchar型のポインタを代入しようとしたりw
890 :
デフォルトの名無しさん :2010/09/26(日) 06:52:47
Visual Studio 2010 C++を使おうとしてるのですが、どこでコンパイル すればいいのかわかりません。
ググれ
892 :
デフォルトの名無しさん :2010/09/26(日) 07:45:20
コマンドラインからコンパイルするみたいです。 でも最適化オプション付けてもgccの2倍以上実行時間がかかります。 何が悪いのでしょう。
894 :
デフォルトの名無しさん :2010/09/26(日) 09:04:51
開発環境ってなれないと難しい。Linuxだったらある程度わかるけど WINで動くアプリ作ろうとすると何が何だか。 同じプログラムなのに動作速度が違うなんて。
895 :
デフォルトの名無しさん :2010/09/26(日) 09:22:33
同じプログラムなのに実行結果も違う。Cygwin32とVisual Studio
それは専門用語で「バグ」といいます。
で、暗号作ってた彼はあきらめたのか?
898 :
デフォルトの名無しさん :2010/09/26(日) 09:38:15
まだ暗号作ってます。速度面だけでなくWINアプリとの互換性を試しています。 それでWINとCygwinで実行結果が合わなくておかしなことになってます。 ハッシュ関数の値が実行する環境によって変化します。バグです。
Winとcygwinじゃなくて、VCとgccの違いでは?
整数のデーター長とか符号が原因と見た
ライブラリで同じハッシュ値が返るっていう仮定をしてるなら、 ハッシュ関数を自作すればいいのでは?
どう考えても変数初期化してないとかだろ。デバッグとかしてないんじゃないの。
VCは値を勝手に丸めるから。
>>890 メニュー→デバッグ→ソリューションのビルド
905 :
デフォルトの名無しさん :2010/09/26(日) 10:05:38
実行時間が遅すぎる。35秒もかかる。 出力ファイルが勝手にプロテクトされてるし。 VCはわけわからん。
逆に言えばgccとかは桁あふれとかの保護機能を自分で実装してやらないと何も保護がかかっていない状態だってこと。安全と速度は反比例する。 >実行時間が遅すぎる。35秒もかかる。 たぶんそれがこの差。
そもそも実行時間は安定してるのかい?
VCはバカコードを書いてもメモリを破壊しない安全なアプリケーションを生成するようにできている。
>>856 >>864 vz自身も、dos/vが流行るだいぶ前から大ヒットしてたような記憶があるけど。
910 :
デフォルトの名無しさん :2010/09/26(日) 10:21:31
みなさんコンパイラ何使ってますか?
インテル入ってる
912 :
デフォルトの名無しさん :2010/09/26(日) 10:25:49
みんなそういうこと知ってるんだからすごいよなあ・・・
フレッツ入ってる
914 :
デフォルトの名無しさん :2010/09/26(日) 12:39:14
実行環境とかコンパイルオプション変えただけで計算結果って変わるんですか?
変わりまくります 最悪の場合人が死にます
>>910 intel parallel composer2011
あー、もうじき四十路か〜。なんだかなぁ。
918 :
デフォルトの名無しさん :2010/09/26(日) 13:22:33
VCでコンパイルしたものをコマンドプロンプトで実行した結果と、 Cygwinで同じバイナリを実行した結果が違うのはなぜですか。
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);
}
>>918 おいこらいい加減うるせーぞ。そもそも結果が安定しているかどうか聞いただろうボケ。
>>920 質問とは関係ないけど、&fとか&ffってところは0xf、0xffの間違い?
923 :
デフォルトの名無しさん :2010/09/26(日) 13:42:55
早くなったり遅くなったり安定しません。 WIN上で動くようにしようとして混乱してます。 どうもすみません。 コンパイラによってなぜ結果が変わるのか理解できません。
コンパイラによって結果が違わなかったら誰も有料のコンパイラ使わないでしょ
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; }
>>923 こないだ説明しただろ、安定しないのはディスクキャッシュが原因だ。
全部読み込んでからメモリ上でやってその部分だけ測るか(もちろん出力もメモリ)RAMディスクでも使え。
927 :
デフォルトの名無しさん :2010/09/26(日) 13:50:21
実行環境によって結果が違うのは正常なんですね。 ハッシュ関数なんていうのは一致がとれないといけないので困っていました。
環境じゃなくて自分のコードを疑えよ
930 :
デフォルトの名無しさん :2010/09/26(日) 14:03:02
ソースコードは同じでコンパイラだけ変えてるんですけど・・・
>>930 コンパイラに依存した書き方をしてるんでしょ。
これファイルから読んできた時のUTFとSJISの文字コードの違いによるデータ長の違いとかジャナイの?
久々の大物か?
935 :
デフォルトの名無しさん :2010/09/26(日) 14:18:13
fとffには関数init()で初期化された値が入っています。
もう全コード晒しちゃえば?暇な奴がバグ見つけてくれるかもよ。
937 :
デフォルトの名無しさん :2010/09/26(日) 14:29:32
まるで全コードじゃないじゃん。
939 :
デフォルトの名無しさん :2010/09/26(日) 14:41:40
VCの最適化オプション/O2を付けるとハッシュ関数が実行される度に 値が変わるという現象が起きます。 最適化しないとおこりません。GCCでは最適化してもしなくても値は 変わりません。ただしVCでコンパイルした実行結果とGCCの実行結果 は同じソースなのに違う値が出ます。なぜ?!
だから全部晒せって
構ってチャンだから
行数制限で全部晒せないんかな? だとしたら、どこかのアップローダーに上げてリンク貼ればいいよ
944 :
デフォルトの名無しさん :2010/09/26(日) 14:56:08
一遍に出そうとすると改行が多いとエラーがでます。 RAMディスクの作り方、使い方がわかりません。 もうVC諦めてGCC一本にしようかな。
945 :
デフォルトの名無しさん :2010/09/26(日) 15:00:16
>>945 s5のb, codeのuが初期化されていない。
初心者は-Wallをつけて、警告を全部とる事。
他人に調べてほしいのにコメントすら無しとか、ゆとりにも限度があるよ
え?いらないよ?
コメントは甘え
951 :
デフォルトの名無しさん :2010/09/26(日) 15:19:35
VC++2010でC99でコンパイルする方法を教えてください
この程度のものでコメント無いと読めないような奴が助言なんてしなくていいよ。
for(i=0;i<n;i++){ for(j=0;j<2;j++) g[i][j]=0; // printf("debug1\n"); } この部分で配列オーバーしてね?
してなかった
955 :
デフォルトの名無しさん :2010/09/26(日) 15:31:26
どうしてVCとGCCで結果が違うのでしょうね?
変数名とかもうちょっと考えろよひどすぎだろこれ ファイル読み込むならそれもアップしろよ
時間がかかるとか文句言う前にやることあるでしょ、って感じ
>>955 >>947 が未初期化変数があるとか言ってなかったっけ?
cygwinもVCもないから中見てないけど直したの?
959 :
デフォルトの名無しさん :2010/09/26(日) 15:36:18
コンパイルしてみましたか? データファイルは大きすぎてうpできません。 何か適当なファイルでテストしてやってください。
速度がデータ依存するようなコードに見えないからいいんじゃないの?
961 :
デフォルトの名無しさん :2010/09/26(日) 15:37:27
直しました>初期化
0でシフトすると結果ってどうなるんだっけ?
どうもならない
964 :
デフォルトの名無しさん :2010/09/26(日) 15:41:51
直った!結果が一致した!初期化でこんなに結果が違うんですね。 GCCって変数宣言すると自動的に初期化するってことですかね。 さすがはプロ!皆様ありがとうございました!
965 :
デフォルトの名無しさん :2010/09/26(日) 15:44:40
ところで誰かこのハッシュ関数使ってみたいと思う人いますか?
怖くて使えません
帰れ
>>964 >さすがはプロ!
いや、ほとんど学生、趣味プログラマなんだが...
疑うべきはコンパイラではなく自分という典型的な例でした
s5関数のやり方って、大丈夫なのかな?
cygwinでmd5sumの方が3倍速いな
972 :
デフォルトの名無しさん :2010/09/26(日) 15:58:02
私は大学院で暗号学を専攻してました。 このハッシュ関数の基本原理を知りたくないですか?
いらないから!押し売りかお前は!
974 :
デフォルトの名無しさん :2010/09/26(日) 16:00:13
こっちのCygwinだと微妙に
975 :
デフォルトの名無しさん :2010/09/26(日) 16:01:44
折角の成果を分け合おうというのに。
所詮、学生レベルの実装か
timeコマンドでsysが影響しなくなるまで繰り返してみ
もうちょっといじれるようになっといた方がいいような気がする md5とかshaなら実装したことあるけどopensslなんてアセンブラだたよ 研究でアセンブラは要らないと思うけど分かりやすく無駄のないコードにはしないとね
979 :
デフォルトの名無しさん :2010/09/26(日) 16:09:38
real 6.1s 位で安定しました。データファイルは300Mです。
うちの結果(繰り返してキャッシュに入ってそうな状態から) 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
>>964 > GCCって変数宣言すると自動的に初期化するってことですかね。
そのプログラムで偶々0だっただけ。つまりまぐれで動いていた。
すんません、結果ってあってますか?
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
32bitのsse2やO3はちょっと抵抗あるな。調べないと正確には分からないけど普通はO2だろう。
s5関数の使い方、間違ってるみたいだけど
987 :
デフォルトの名無しさん :2010/09/26(日) 16:50:55
オゾンと酸素の違い
988 :
デフォルトの名無しさん :2010/09/26(日) 16:52:45
どう間違ってるんですか>s5
-msse2はFPUでなくSSEを使うという意味なので、浮動小数点演算しか速くならない。 sse使えと言ったのはアセンブリで書けと言う意味だ。
構造体直渡しって、出来たっけ ポインタ渡しでやると結果が変わったんだけど
991 :
デフォルトの名無しさん :2010/09/26(日) 17:02:15
SSE2命令はSIMDで整数演算もサポートしてます。だから128ビットデータ を高速化できます。基本的に行列演算なのでその部分も利用してます。 ていうか少しは速くなってるはず。
992 :
デフォルトの名無しさん :2010/09/26(日) 17:04:32
ポインタはデバッグしにくいから嫌い。 普通に共用体で渡せるんじゃないかな。
>>991 SSE2命令は整数演算もサポートしているけれど、gccはそれを使って整数演算を最適化しない。
"-msse2"って書いただろ。良く読め。
で、休日一日を費やして皆で悪戦苦闘の結果、 なんとも使い物にならない似非暗号化プログラムが出来上がったわけだが。
嫌いとか言ってる時点で... s5の中の出る直前のccのダンプと s5出たあとのccのダンプ比較してみたら
>>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
スレの残りも少なくなってまいりました。 誰か暗号化プログラム専用スレ立てれ。
院出じゃなかったのか? 宣言 void s5(on *cc); 呼び出し方 s5(&c1); s5(&c2);
問題だけ提示して0からソースコード書いた方が早いと思うんだが
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。