1 :
デフォルトの名無しさん :
2010/09/15(水) 00:21:37
double *malloc_array(int n) { double *array; int i; if ((array = (double *)malloc(n * sizeof(double))) == NULL) { fprintf(stderr, "malloc error.\n"); exit(EXIT_FAILURE); } return array; } の型を一般化するために、 型名を引数にとることはできますでしょうか。 void *malloc_array(int n, char *cast) { cast *array; int i; if ((array = (cast *)malloc(n * sizeof(cast))) == NULL) { fprintf(stderr, "malloc error.\n"); exit(EXIT_FAILURE); } return (cast *)array; } malloc_array(100, double); とかくと、一番上に書いた関数で malloc_array(100); と呼び出すのと同じ動作をさせたいです。
void * からの型変換は暗黙。キャストなんて要らんだろ。
つーかキャストなんかするな。
5 :
デフォルトの名無しさん :2010/09/15(水) 00:40:07
>>2 型を引数にしたいって話なら無理
スタックに型をどうやって積むねん!
6 :
デフォルトの名無しさん :2010/09/15(水) 00:40:54
>>2 無理。
サイズ渡すかcalloc使うかマクロ使うかしてがんばれ。
>>3-6 ありがとうございます。
>>6 関数呼び出し時に型の指定をしたいので
マクロは合わないんですよね。
サイズ渡すのが良さそうです。
やってみます。ありがとうございました。
C++だと定数はconst使えってなってるけどCだとconstでやるのは何かまずいの?
>>8 いいえ全然。多分 const だの enum だのを使ったほうがいいと思います。今はみんな c++ でしょうし。
++厨は帰れよ。
前スレ986 前880じゃないけど。 てか前870なんだが、もうちょっとちゃんと書いとく。 > 場所によって意味が変わる、という事は無い。 少なくとも規格上関数内外のstaticな変数の宣言において、 関数内の宣言では無結合、関数外では内部結合、 とその宣言される変数の持つ結合が異なる。 無結合と内部結合ではコンパイラの解釈が異なる。 だから「ついでに・・・」「まとめると・・・」の部分は大嘘。
staticなときに、無結合って、いってるのがようわからんのだけど
>>11 前スレ 986 だけど、書いた通り VC の実装に基づく事実なので。
コンパイル時のアセンブリリスティングやオブジェクトファイルを見てみれば、
関数 testfunc() 内の static 変数 testvar も、_?testvar@?1??testfunc@@9@9
のような名前でリンケージを持つ事が判る。
VC が規格外の動作をしてるって言いたいの?
マルチキャストを1つのインターフェースで受信して それを中でユニキャストに変換してもう1つのインターフェースから出すことって可能かな。。。
char* a; a = (char*)malloc(1); キャストしては駄目というのは どういった理由からですか?
16 :
デフォルトの名無しさん :2010/09/15(水) 04:52:02
>>8 別に const 付けたからと言って動作が変わるわけではないのよ
const 付けた変数の内容を変更するコードに対してそれはダメよってコンパイラさんが怒るだけの話
だから内容を変更しない定数に付けておけば間違いが減るってだけの話なんよ
C++の場合はconst付けると書き替え不可な領域に配置するんだよな。
18 :
デフォルトの名無しさん :2010/09/15(水) 05:01:24
>>15 別にダメな理由は無いよ
冗長かもしれないけど(ワーニング出なかったっけ?)、生成されるコードに変化が有る訳でもないから、
できるだけ明示的にキャストするのは悪い習慣ではないと思う
19 :
デフォルトの名無しさん :2010/09/15(水) 05:05:58
>>17 それは処理系依存じゃね?
まぁ何処に配置されようが同じだけど
const 付けると、C++ だとちゃんと定数扱いになるが、 C ではあくまで変数として処理される。
>>21 ちげぇよwwww
配列宣言の添字に使えるかとかの問題の話できちんと規格で決まってる
いやC99だと動的に配列作れるからつくれちゃうんだけど
case 文に使えるかどうかって差はあるな。
>>12 C言語の結合には、外部結合、内部結合、無結合の3種類があるんだと。
どっかのサイトでは「結合が無いのではなく、
無結合という結合を持つ」なんて書いてあった。
>>13 それはもうC言語でいう結合は関係ない世界じゃないの?
基本的には、書いたCのソースをビルドして実行した時、
規格が求めるように動けば規格準拠で、
バイナリでの表現は関係ない。
アセンブリ上では、ブロックスコープの変数が
別の翻訳単位から見える形で定義されてても構わないし、
場合によっては定数に変換されたりして変数が削除されてても良い。
>>13 難しく考えすぎなんだよ。
結合は「コンパイラ(≠リンカ)による依存性、一意性の解決」とでも思えばいい。
同じ名前のオブジェクトが出現したときに「最終的にどれを呼べばいいのか?」をコンパイラが判断すること。
この段階でコンパイラはそれぞれのオブジェクトに「依存解決済みの一意の名前付け」をする。
もちろん最終的に一意性が確保できなければエラーを吐く。
リンカがそれらを相対アドレスに置き換えるのはその後の話だ。
externが付いてない限り、またスコープ内で重複しない限り、ブロックスコープにあるオブジェクトは一意だろ?
だから結合という操作は不要なんだよ。
関数の外でも中でもリンカーによって最終的に配置されるのは同じような位置だろ。
>>2 malloc_array(100, "double");
とすればいいんじゃね
>>28 よらねえよ。つーかよったらよっぽど変な実装だぞ。
>>29 C++をサポートしてる処理系なら違う場所になるね。
だから今は同じ場所になる処理系の方が稀だわ。
君は昔のC++がなかった頃の処理系しかしらないんんだろう?
>>20 >const 付けると、C++ だとちゃんと定数扱いになる
「static const 整数型」だけの特別扱いじゃなかったっけ
リンケージの次は、結合ですか? その次はどんな言葉が出てくるんでしょうね?
わからん人はスルーしてな
いやむしろここはスレタイよろしく、 初心者にも分かる言葉で説明する事によって 理解を深めるのがいいんジャマイカ?
>>31 7.1.5.1 The cv-qualifiers
2 An object declared in namespace scope with a const-qualified type has internal linkage unless it is explic-
itly declared extern or unless it was previously declared to have external linkage. A variable of non-
volatile const-qualified integral or enumeration type initialized by an integral constant expression can be
used in integral constant expressions (5.19). [Note: as described in 8.5, the definition of an object or subob-
ject of const-qualified type must specify an initializer or be subject to default-initialization. ]
そもそもstaticという言葉が出てこない
37 :
31 :2010/09/15(水) 22:18:34
ありがとう。static無関係は了解。 (整数とenumに限るのはなぜだろ?)
38 :
デフォルトの名無しさん :2010/09/15(水) 22:33:49
>>24 元々前スレ 751 が 「staticの指定は「こいつの存在をリンカに知らせない」という意味」
とか言い出したから、その反証として VC の動作を挙げただけ。
C の規格と関係あるかどうかは関知しないし、そもそもリンカの動作自体が規格で明確に
定められていない。
>>25 事実をそのまま述べただけなのに 「考えすぎ」 とか言われても困る。
>>25 書き忘れ。
一意になろうがなんだろうが、コンパイル時に static 変数のアドレスが特定できない
処理系の場合は、その変数の参照部分に対してリンク操作が必要になる。
(そのリンク操作の指示はリンカが行い、実際のリンク操作はローダーが行う)
てst
そういうのはコンパイラーによって結果が変わりそうで不安だな。
44 :
デフォルトの名無しさん :2010/09/16(木) 04:00:15
あげ
C言語以前に日本語ができてない気がする。 もうちょっと外部リンケージを持った内容にしてほしい。
46 :
デフォルトの名無しさん :2010/09/16(木) 07:35:15
レベルが高すぎると誰もついてこないし、レベルが低すぎると誰も食いつかない。 このスレのレベルはstataic程度が上限。
48 :
デフォルトの名無しさん :2010/09/16(木) 10:17:00
ん〜、constantが良いと思いますねぇ〜、はい。
int a=1111111111111111111111111;
amazon の本、普通の値段になってたw
何の本だよ。 書き込むなら情報として他の人にも意味が分かるように書いてくれよ。
何千マンにもなってたVBの本のことだろ。
53 :
デフォルトの名無しさん :2010/09/16(木) 22:23:52
オーバーフロー狙いが20京ドルでもアウトと聞いて意気消沈
オーバーフローはどうやって防止してる? 入力の段階で弾くのがいいかな。
>>54 式は暗黙でintもしくはdoubleになる
これを覚えておけば自ずと手段も決まってくる
>>54 そうそう
符号付き整数の場合、オーバーフローは起こした時点で
未定義の世界に突入しちゃうので、ふつう望ましくない
int n = 0;
浮動小数は標準仕様に含めるべきじゃなかったよな。 まあ、実装でバラバラってのも困るから、 ガイドライン程度は決めておいたらいいが。 言語機能そのものは削れるだけ削ってシンプルにしたほうがいい。 なのに C99 までどんどん複雑化の方向だもんな。ガッカリだよ。
60 :
デフォルトの名無しさん :2010/09/17(金) 01:19:16
コンパイラ屋さんですか?
61 :
デフォルトの名無しさん :2010/09/17(金) 01:28:15
なら、もっと吹っ切れた感じの人が多いね
>>52 10億に達した段階で一旦出品が取り消された模様。
いや、浮動少数周りの規格はあの程度で現実的と思うが。 たしかにコンパイラ作る側には面倒な部分ではあるけど。 規格化される前、1972年のBell研のCコンパイラの時点で float/doubleはサポートされていたよ。 重きをおいていたのはハードウェアの持つ性能を生かすことだったんだろう。 C99は大部分バカげた退化だったけどね。
どうぞC89をお使いください。
C99と言ってても完全対応してなかったり、コメントで//とか使ってもC89とか言ってたりするし、境界があいまいだわ
どうぞC1000タケダでも飲んで下さい
「c99なんて使うな」というクライアントが、//コメントは「常識だ」とのたまう現実。
C99以前に大抵のコンパイラで//コメント使えるようになってたしなあ
//のメリットは、連続した行を/**/でコメントアウトしたい場合に邪魔にならないってことかな
C++使ってベターCで書けってことかもよ
/++/とかどうでしょう
>>71 エディタにもよるが /* */ の範囲で配色が変るのがある
#if 0 〜 #endif の範囲で配色が変るエディタがあれば、等価に使うだろうね
エディタ依存を話をするなら /* */が二重なるのも気にしなくていいよな
いやネストのせいで挙動変わっちゃうじゃん、 配色だけで済まないじゃん
>>73 配色の変わるエディタならだいたい対応してるだろ
ネストするときは\いれてくれるエディタってあんまりないのか?
お金いれてくれる?
test int n = 0;
test int miracle_power = (rand() % 100) < 30; while (1) { if (miracle_power) { lesson_boycott(); enjoy_amusement_park(); if (get_homework()) { dis_homework(); } } else { lesson(); if (get_homework()) { run_homework(); } } }
miracle_power更新されないのか 最初の一回で運命が決まってしまうのだな
test typedef struct man kimi; typedef struct woman me; long year = get_year(); year -= 10000 + 2000; aishiteru(&kimi, &me, year); year += 8000; aishiteru(&kimi, &me, year); year += 100000000 + 2000; aishiteru(&kimi, &me, year);
つまらないからそろそろ消えてね
ローマ字関数名って すごく残念な気分になれるけど ぱっと英文思い浮かばないときはどうしてる? やっぱりあきらめてローマ字?
漢字で
下手に間違った英単語にするよりはローマ字のほうがマシな気もするが 昔のコードとか見ると、調べてつけた英単語の意味忘れてることとかあるし
VBだと出来るんだっけか > 漢字
時間的に余裕があるときは和英辞書や翻訳サイトで調べたり、海外のソースコードを見たりする 納期直前だと逃避のために和英辞書や翻訳サイトで調べたり、海外のソースコードを見たりする
>>88 Javaでも出来る
たぶん誰もやらないだろうけど
・・・でもひょっとしたら面白いかもしれんな
仕事ではもちろん却下だが、個人の趣味でなら、一度やってみようかな
test int n = 0; return n;
もう書かないぞ
ウニコードが識別子に使えると一行AAで遊べるから楽しいね
日本語でコード書いて最後に重複しないようにスクリプトで置換すると気持ちいい
C言語でグラフィックを描くことは可能ですか?
無理です
不可能です
無理
でもひょっとしたら…
C言語はキャラクター文字しかサポートしてないので無理
アスキーアート
pgm なら比較的簡単
K&Rに載ってないので無理
>>104 こういうのって、結局はただ解像度が粗いだけの普通のドットマトリクスモニターじゃん。
何の意味があるのか全く解らんのだが。
エクセルでこういうのやってる動画も時々上がるけど、あれも同様に意味不明。
文字を小さくすればどんどん鮮明になります!すごいでしょう!?
1文字を1ピクセルで表したら鮮明画像だな。
画質が低くて見れたもんじゃないな。 実用性無いよ。
でも AT 互換機にカナ漢字を表示する機能は無く、 日本語 MS-DOS だってグラフィックモードで表示してるわけだから、 日本語を使ってる時点でPCGみたいなもんだろ。 ゲーム機のBGみたいなもんじゃん。
>>95 IOCCC に幾つか有るよな。
でも、ものすごく読みづらくなるだけだから止めたほうがいい。
でも、anderson.c とか結構好きかも。
キャラクター文字 キャラクター文字 キャラクター文字 キャラクター文字 キャラクター文字
113 :
デフォルトの名無しさん :2010/09/17(金) 21:46:10
angbandがあるではないか。
test int aaaaa(int a){ return a; }
>>88 VBに限らず漢字が通る処理系は多い。
っていうか、ソースコードをUnicodeで書けるような処理系なら、
大抵は漢字の関数名も受け付けるだろ。
vc++も通るね
>>116 うっ…
やってみたことないけど、もしかしてGCCでも通るのか?w
そんなソースやだー…
>>83 ちょっと待て。
最後の aishiteru() の呼び出しの前、8000 を足してやらないとまずいんじゃないか?
120 :
118 :2010/09/18(土) 00:26:14
いや、gccでは通らなかったw ほっ…w
vc++限定の話です。 #pragma intrinsicっていうプリプロセッサ指令あるじゃないですか? これって数学の関数の処理を最適化して高速化するもんですよね? たとえば、sin,cos,atan2を高速化したければ、 #pragma intrinsic(sin,cos,atan2)ってかけばOKなんですか?
122 :
デフォルトの名無しさん :2010/09/18(土) 11:25:06
おk
デフォでは最適化されてないってことか?
いや多分FPUを使うかSSE2を使って展開するかの違いとかじゃね?
アセンブリ出力をみれば分かるじゃん。
return -1;
a = (int ***)malloc(sizeof(int **) * X); for(i=0; i<X; i++){ ____record[i] = (int **)malloc(sizeof(int *) * Y); } for(i=0; i<X; i++) for(j=0; j<Y; j++){ ____record[i][j] = (int *)malloc(sizeof(int) * Z); } 上の動的な3次元配列を取るコードにあるforの二重ループで、 外側の{}を省略して書くのはアリですか ifの{}を取るのは良く見ますけど、これは見ないので… こういうコード見た時、どう思います?
アリ
たった2文字のために可読性を捨てる意味がわからん
>>129 ちゃんとインデントされてれば別に何とも。
強いて言えば、修正が要る時、括弧足すのメンドイ。
アリ。 俺は更にforを一行にする。
C99世代の俺から言わせて貰うと、 そんなことより、_から始まる変数名の方が気になる。
135 :
デフォルトの名無しさん :2010/09/18(土) 23:52:24
インデントのためだろ。
みなさん、どうもです
>>133 一行派もいたとは
{}は取るな。必ずつけろ。
なに気にすることはない
>>137 俺はチト違う意見。
{}つけないなら徹頭徹尾とことん付けるな。
ソースに一貫性を。
その前にコード規約守れお前ら
1行80列制限ももういいだろ。最近はみんなワイドモニターだし。
規約に書いてなかったらどうすれバインダー
143 :
デフォルトの名無しさん :2010/09/19(日) 00:18:31
ソース一貫性厨が一番の害悪。
>>139 一行のときはつけないで、複数行のときはつけるって規則でやってるけど。
その程度でミスした事無い
if()if()for(){ なぞ下手にインデント付けたり論理演算で繋ぐより分かり易いと思うがね
>>147 仕事だとそれを引き継いだバカがミスることまで
考慮せにゃならんのがダルい。
バカがしたミスのトラブルシュートをさせられるのがダルい 厄介なバグはいつもこっちに回ってくるんだ…
>>151 結局、やらなきゃならないのは「できる人」だからね…w
コーディングスタイルの話で 「いや、俺は大丈夫だけどね。これはバカを考慮した書き方。 おれはわかってるよ」 みたいな言い方するやつって、自信ないのかね。
カッコ付け忘れるレベルのやつにちょっと工夫しても大差ないだろ。
{}を省略すると何がよくなるのかわからない
156 :
デフォルトの名無しさん :2010/09/19(日) 00:56:28
{}を付けて怒られる事は無いが、付けないと規約違反で怒られる事が有る 付けるのを習慣化しておいた方がお得
{}はずすなら一行に書いたほうがマシ {}はずして一行なのに改行してインデントすると、 ループ内容に追加が必要なときに{}付け忘れるアホがいるから
158 :
デフォルトの名無しさん :2010/09/19(日) 00:59:51
こんな不毛な議論しなくていいように、Pythonを見習ってインデントに意味を持たせたほうがいいな。
>>157 K&Rは式一行の時に{}なしで改行する書き方多用してたしなあ
>>153 実際にバカにブチ当たって痛い目を見た。
チームでやる時は一番レベル低い奴に合わせざるを得ない。
ついでに愚痴。
C言語メインで使う職場なのに大半が規格見たこと無いとか何なの。
それで移植性がどーのとかマジ笑わせてくれる。
>>159 書籍だからな。行の節約だよ。
if (exp){
}
このスタイルも同様。
別に紙に書いてるわけでもないのにこの書式をありがたがってる奴はアホ。
#define begin { #define end ;} これを最初に書いとけば全て解決だろ。
移植性がどうとか言ってる奴に限って CHAR_BIT を無視してる、どころか知りもしないというオチ。
>>159 K&Rは一行じゃなくても省略してるだろ。
インデントをふつーにしてれば{}を付け忘れるってないけど、 インデントもおぼつかない現場ってのもあるしな。 でも、インデントもできてない所だとそもそも{}をつけるか 付けないかなんてどうでもいいくらい細かいことだな。 つけてもぜんぜん安全にならない。
int i; for(i=0;i<10;++i){} printf("%d\n",i);
>>162 それやると、ちょっとネストが深くなるだけでコードが縦横に無駄に伸びる
ぼくはよく while(i-->0){putchar(i);} ってときでも {} は必ずつけるようにしてる。{}が付いてないと、気持ち悪いと感じるので。個人的に。 if(i>0){} や for(i=0;i<10;i++){} や while(i-->0){} の {} は、ifやforやwhileとセットで、必ずつくものだと考えてる。個人的に。 だから、 if(i>0) putchar(i); のような「リーナスやカーニハン推奨の書き方」を見ると、(これが一般的なのでしょうけど)個人的には気持ち悪いものを感じる。 if(i>0) { putchar(i); } と、{}を追加して整形したくなってしまうw あと、個人的には if(i>0){putchar(i);} と、一行で書いてしまう方が、読みやすいと思う。(短い場合は) switchなどは改行せずに、タブで位置をあわせて、行列みたいな形にした方が、読みやすいケースもあると思う。 switch(i) { case AAA: putchar(aaa); i++; break; case BBB: putchar(bbb); i++; break; case CCC: putchar(ccc); break; default: break; } のように。 これらはあくまで個人的な意見。 個人的には「どう書けば自分が読みやすいか?」だけを指標にしている。 あまり一般的に言われてる「こう書くのが通だ」みたいな記法には、あまり従い過ぎないようにしてる。個人的に。たとえば{}の省略など。
{}を付けてミスすることは無いが{}を省略してミスすることは多々ある どっちがいいかなんて一目瞭然。
心理的にはそれは権力欲、出世欲、自己顕示欲の過剰さの現れだと いえます
>>170 コードが間延びして読みにくくなるじゃん。
引き継いだ奴がミスって聞きにくるかもしれんだろ?面倒は予め潰しておくべきだ
174 :
デフォルトの名無しさん :2010/09/19(日) 13:40:59
>>172 お前の価値観ってしょぼいなw
語る、意見する資格ないよ。その内、墓穴を掘るから黙ってな。
> if(i>0){putchar(i);} 変な工夫しないでとりあえず普通に書けといいたい。
176 :
デフォルトの名無しさん :2010/09/19(日) 13:41:45
>>173 インデントをしてればミスなんてしないだろ。
コーディングスタイルの話になると、安全側に倒すのが正義みたいに
過剰なスタイルを勧めるやつが多いな。
Cは兎も角C++では一つの識別子スコープを作るのだから たんなる飾りじゃない。意味を持つので付ける 付けないの趣味レベルの問題じゃなく、一定のルールに 基づいたものでなければならない。
>>176 実践的にコードを書いてる人のスタイルを参考にしたほうがいい。
ろくなコードも書いたことがないやつが机上の空論でこうしたら
安全とか読みやすいとか考えてるから
> if(i>0){putchar(i);}
みたいな、変な書き方思いつくんだろ。
コードで個性なんか主張しなくていいよ。
いるよな、昔の名残で1文字1バイトも無駄にしないという 変な根性を現代の水準で語る時代遅れのバカってw 可搬性や効率化を考えたら、例え1行だろうと あれこれ変更しないで、一貫して自分が思うなら そのスタイルを押し通せば良いだけ。他人に意見をするというのは 自分の都合や主観が通用しないことばかり。 あんた、他人とコードのやり取りをしたことある? その際、流れに問題がないのに本題からズレた、ここが見づらいだの 逐一そんなことでケチをつけるのかね?w 大人気ない、精神レベルが低いまま年を取った爺の典型的な悪い体質だなw お前、大物には成れずにこの世を去るよ?どうせ誰もがいつかは死ぬ。 お前がこんな場所でネット弁慶をやっていたことを知る人は、どれだけ いるんでしょうね・・・匿名で、2ちゃんで多数書き込んでいても有名にはなれませんよ? お前という存在はちっぽけで歴史に名の残らない雑魚だから、せいぜいここで 自分未満の人間を見つけては偉そうにしてなさいw
for(int i=0; i<10; i++) puts("fuck!"); ↓ for(int i=0; i<10; i++) for(int j=0; j<10; j++) puts("fuck!"); こういうことするじゃんおまいら
>>177 この話題に関してはインデントしてあっても防げないんじゃね?というかインデント関係なくね?
183 :
デフォルトの名無しさん :2010/09/19(日) 13:46:40
for(i=0;i<16;i++) a[i]^=(d[i]+c[i])%16; このプログラムをSSE2で書きたいのですがわかりません。 教えてください。よろしくお願いします。 C言語からインラインアセンブラで呼び出したいと思うのですが、 うまくいきません。 moveq d,%xmm0 moveq c,%xmm1 paddb %xmm1,%xmm0 moveq a,%xmm1 pxor %xmm1,%xmm0 配列のデータをレジスタにセットするところもわかりません。
if(i > 0) putchar(i); この書き方だとputchar(i);の下にインデントして追加したものも ifの分岐で実行すると勘違いするヤツがいる、っていうかいた。
>>181 おれは一行のときだけ{}を省略で、複数行のときは
省略しないってルールでやってる。
インデントで構文を判断する馬鹿がいるかー!
>>185 そのやり方だと行を追加したときにミスが発生しやすいって話だろが
if(true)
putchar(10);
putchar(11);
188 :
デフォルトの名無しさん :2010/09/19(日) 13:51:00
実際、{ }に起因するバグなんて大した問題じゃない。 問題が分かりやすいからド素人がキャーギャー騒いでいるだけ。
>>182 いや、{}の付け忘れなんてインデントしてればしないんじゃね?
インデントもおぼつかない現場があるのが知ってるけど、そういう
ところは{}をどうこう以前に、ほかにやることあるだろって感じだよね。
190 :
デフォルトの名無しさん :2010/09/19(日) 13:52:33
ぎゃはははは ぶははははは 長年自分が決め込んだスタイルが絶対正しいと思い込む 時代遅れの爺が必死だぜw お前らもう二度と人間社会で活躍する時代は来ないなw 後は余生を静かに2ちゃんでネット弁慶して過ごせよ 人類の歴史に名の残らない雑魚ちゃんたちw
>>187 いや、コード書いてるやつならわかるだろうけど、
そんなミスしないだろ。
こういう話になると、プロは10年に一度のミスにも備えて
コーディングするとか、安全側に倒すのが正義みたいな話に
なるんだろうけど。
>>188 そうだな。
もしミスっても、こんなんでハマったりもしないしな。
コーディングルールを作る側なら、それなりの理由を用意してくれ コーディングルールに従う側は、(腹でどう思おうが)従うだけだが、説得力が欲しいぜ プライベートでコード書く時はお好きにどうぞ これだけのことでしょ
>>189 どうも
>>173 への解釈が俺とお前で違ったらしい
{}無しif文で{}付けずに文を追加して、動作がおかしくなって聞きに来た人のことかと思った
>安全側に倒すのが正義みたいに >過剰なスタイルを勧めるやつが多いな。 >コーディングするとか、安全側に倒すのが正義みたいな話に >なるんだろうけど。 やだ・・・何言ってるかわからない・・・
ようするにPythonの文法は素晴らしいってことだな
投機的な局所安全対策も度が過ぎたら全体的な観点からは 酷い危険に晒されるという例は歴史上枚挙に暇が無いってこ と知ってる?
>>141 みたいな意見もどうかと思うぞ。
改行コードを入れなくても自動的に、エディタの横幅に応じて
改行表示してくれるものを使えば良い。
使える手段を知らない、選ばない時代遅れの連中の意見は
実に現代では通用しないことかw
もう少し、世の中を幅広く見ましょうね?お前が知っている
あるいは視野の狭い考えでは通用しないどころか
変な手間や負担を被りますよ?
if (expr) func(); も if (expr) { func(); } も両方使うけどな。 要は処理の流れの問題じゃないか? ちょっとした例外処理を1行で済むのに4行もかけて、 メイン処理始まるまでにダラダラと長くなるのは嫌いだ。
> {}を省略してミスすることは多々ある あるか????? しかも、多々だと??? if(i > 0) putchar(i); ↑これが↓こうなる時、 if(true) putchar(10); putchar(11); ↓これを、目をつぶってでもぶち込んでるのか? putchar(11); 前後の文脈一切気にしないのか? そんな一か八かの書き方してるようじゃ、 今後どうにもならないぞ。基礎の基礎。
>>198 なんか言ってる事がおかしくね?どういうこと?
>>196 20年くらいまえにpascalのbegin endをどの位置に置くかってのを
議論した文章を読んだら、インデントで制御構造が認識できるから
いっそ、begin endなくせばよくね?
って意見があって、だいぶたってpythonを見たとき、ほんとうに
やりやがったって思った。
>>197 歴史は知らないが、商品開発では
選択肢があったら安全側に倒すのが超基本。
>>201 まてお前上で書いてんのか?それにびっくりだ
>>201 だってそういうミスする人いるんだからしょうがないじゃん。
80桁の制限はCだといいけど、javaとかC#だときつい。 ネームスペースのインデントがあって、クラスのインデントがあって メソッドのインデントがあってって、いきなりインデント深くなってるしな。
80桁制限はだいぶ古臭いな。 100桁ぐらいはないと読みにくくなりすぎる。
あらゆるミスを想定してたらきりがない if (i .> 0) ; { putcjar(i); }
>>204 比較的単純な装置/機械では、安全側に収束するような設定に
統一するのが基本だが、ある程度大規模/複雑になった場合必ずしも
そうとは言いきれない。この分岐点の見極めは超難しい。
システムアナリストクラスの役職者の判断事項。
むやみに大規模化/複雑化しないことを心掛けることのほうが
ずっと効果的
if (expr) func(); この程度のコードを if (expr) { func(); func2(); ・・・ } と変更したくなるってのは、そもそもifの中身を別関数に分けなきゃいけない兆候
極論でたあああああ
別にフォーマットなんて何でもよくね? 決まりがあるなら従えばいいだけじゃん ただ使いやすいフォーマッタとかは用意してほしいと思うな
>>212 それはモジュール設計の話で、構文や書式とは別問題。
{}をつけることのどこか過剰なのか意味不明。つけりゃいいじゃん。
>>215 メイン処理は1行でも{}に分けて書く
主要でない処理は1行なら省略構文を使う
要は{}によって処理の流れを分かりにくくしてないか、という問題
{}で処理の流れがわかりにくくなる?
省略構文をつかったらミスが増えるとか、そんなのは些細な問題だと言っている
ミスが増えるのが些細な問題なわけないしね。
実際にミスが増えたことあるの? 起こらない問題(たまたまおこっても一瞬で解決する問題)についてあーだこーだ言ってもしょうがない
制御文の影響範囲を取り違える事故が頻発したのは Cより前のFORTRANとかの時代の話 Cではそれは激減した。代わりに、識別子乱造に よる取り違い事故が激増した FORTRAN時代は一つの変数を複数の用途に 使い分けるのが常識な時代(メモリが兎に角少なく高価だった) それが原因でスパゲッティプログラミングが避けられなかった
>たまたまおこっても一瞬で解決する問題 すぐ解決できるから対策無しでいいですよね^^
225 :
デフォルトの名無しさん :2010/09/19(日) 14:40:22
143 名前:デフォルトの名無しさん 投稿日:2010/09/19(日) 00:18:31 ソース一貫性厨が一番の害悪。 ↑一貫性の無い自分が一番の害虫だと気づかないアホ
>>224 省略構文禁止が何かの対策になってると思ってるのがすごく残念
>>226 同意。今から家建てます。さあ大変です。
「休憩時間に食べるポテチの袋を開けるとき、
ハサミを使ったほうが安全だよ!
手で開けたら開けにくいときあるし!」
棟梁「…そっすね('A`)」
構文制限によるミス防止規約なんてどこにでもあると思うけど お前らのところはそういうの無いの?
セミコロンがあるとか無いとか、括弧がどうのこうのとか 特殊なマクロ使ってる時ぐらいしか問題にならないなあ。
>>229 コードの見た目をある程度統一するための規約や
本当にややこしいことになる問題についての制限(グローバル変数とか体重継承やヘッダでのusingとか)はある。
過度な命名規則とか、省略構文がどうのこうのとかは、古臭い
少なくとも{}を付けていれば些細なミスでさえ起こり得ない。 であれば、どう考えても付けたほうが合理的。 省略派は、たった2文字のために他人の眼力に頼るというただの甘ちゃんである。 そしていざ問題が起きたとき、「見抜けなかったお前が悪い(オレは悪くない)」と言い張る。 もっとも迷惑なタイプ。
> そしていざ問題が起きたとき この業界もう十年おりますし、コードも二十万行くらい書きますたが、 一度たりともその問題とやらに出会ったことはありません。 一度たりともです。
うちは結構あるわ
コードの問題ってほとんど、設計や性能の問題であって性質が悪い。 {}で防げるようなものってお目にかからない。
236 :
デフォルトの名無しさん :2010/09/19(日) 14:55:40
>>223 ま。勝利と栄光に満ちたC黎明期の頃からの伝統が{}という
ことで...
>>233 7年仕事でC書いてるけど、2回ほどあった。
世の中いろんな人が居るんだよ・・・
まあ、C言語初めて1ヶ月ですみたいな奴がいっぱいいたら 規約でガチガチに固めても良いと思うけどな。 数人だったら、教育係つけてコードレビューでもした方が良い。
K&Rを神聖視する古臭い人間ほど省略したがるよね
241 :
デフォルトの名無しさん :2010/09/19(日) 15:03:14
で、規約を覚えるのに6ヶ月かかるわけだ。
>>238 まだ3年ほどしか仕事してないけど既に2度ほど見た
google先生ですら結構書式細かく決めてるからな〜
中括弧省略でうんぬんしちゃう奴を、現場投入しちゃダメだ。 最低限そこをクリアしてないと話しにならない。
245 :
232 :2010/09/19(日) 15:07:10
だったら人材の選定の規約作れよ
趣味で10年その後仕事で10数年使って相当コード書いてきたけどどっちでもいいと思うぞ
if (100 == n) とか 定数を左におくのも、じっさいコードを書いてれば分かるけど =と==の間違いなんてしないのに、万が一したらどうするんだって 言い張るよな。 そんなめったにしないミスのために変なコード書くことはないよ。
それ自分の周りでたまたま起こらなかっただけじゃね?
自分は間違えない→他人も間違えるハズがない 自分は使いこなせる→他人も使いこなせて当然 まあプログラマには多いんだわこのタイプw
中括弧省略でうんぬんしちゃう奴は、 根本的に問題を抱えている。 注意力が足りなさ過ぎるか、 構文の理解が欠けているかだ。 ネジがボロボロあまった自動車で走り出すようなもの。
252 :
デフォルトの名無しさん :2010/09/19(日) 15:14:01
>>250 それは違う。こっちの方が遥かに多い。
自分は間違えない→他人は間違えるから対策してやろう ⇒実際は自分も間違える
自分は使いこなせる→他人は使いこなせないから対策してやろう ⇒実際は自分も使いこなせない
=と==はたまーーにあるかなあ
別言語と同時に扱ってるケースだとたまにやっちゃう事もあるが 最近のコンパイラはまず警告出すから特にメリットない
255 :
デフォルトの名無しさん :2010/09/19(日) 15:15:55
= と == くらい lintが検出するから、それでソースを汚す必要は全くない。
>>252 それは結局対策されてる訳で
特に問題が起きないから別にいいのでは。
257 :
デフォルトの名無しさん :2010/09/19(日) 15:18:53
>>256 別に良し悪しを言ってるわけじゃないから。そういうタイプが多いというだけ。
実際現場のプログラマーのレベルはピンキリな事が多いから、静的解析は必要だね
そーゆーのって自動車教習所で習うレベルのこと 「運転手がシートベルトを閉める場合は、右ハンドル車で は必ず右手で持っていって嵌め込むこと。体が自然に左に ねじれてアクセルペダルよりもブレーキペダルのほうが 踏みやすくなるから。逆に左手で閉めると右にねじれて アクセルのほうが踏みやすくなる」
>>259 だからどうしたんだよ。
そんなレベルの奴が現場にいるなんていくらでもあるわ。
資格がないとやっちゃいけない という類のものじゃないからな 教育や規約で想定レベルを保たないと
{}は制御影響範囲や名前有効範囲の取り違え事故防止の 為につけられたもの そのココロを忘れないことが大事で効果を妄信して 機械的公式的無造作に使っても効果が無いどころか 逆効果の場合もあったりして....
俺は if ( ... ); { ...; } ってコードで先生if文が動きません!、って最近言われた
264 :
デフォルトの名無しさん :2010/09/19(日) 15:32:09
そんなに{}を付けたいなら、全部、S式+前置記法で書けばいいだろ。
そして極論に逃げると
参考サイト、聞くべきスレを教えてください。 VisualStudio2005でGUIを作りたいと思っています。
CだけでGUI作るのは辛いと思うけど C++できた方がいい
269 :
デフォルトの名無しさん :2010/09/19(日) 15:41:01
C#でいいよ。
>>250 まあでもケアレスミスにしたって{}付け忘れとかないでしょ。
そうでした、ここはCのスレでしたね。 C++でやろうと思っています
ならC++スレへ
C#やC++のスレにいきましたが、C知らなきゃお話に ならないと追い出されて戻ってきました。
>>274 だまされるな。
Cは知らなくてもOK。
276 :
デフォルトの名無しさん :2010/09/19(日) 16:08:19
>>274 お話にならないヤツはお話しなければいいだけ。そんなヤツ捨て置け。
他の言語を知っとくに越したことはないというレベルで、Cも知ってた方がいいって感じだと思う
どの道、基本はデジタルデータの処理になるからね。 演算子も共通して使えるし。
279 :
デフォルトの名無しさん :2010/09/19(日) 16:19:56
他言語を「なまじ」知っていると変てこな信仰心が邪魔になるだけだが C++ に限っては C との相違を知らないと意味わかんねーの沢山あるからな もっと言えば歴代 C++ の相違まで知っていたほうがいい
>>274 まったく知らないというのではダメだろうが
現在なら教育環境や高性能IDEも充実してきているので
Cを知り尽くさないとダメということも
ないしCはそれなりに奥が深く、知り尽くそうなんて
考えると一生GUIは無理(Cでは残念ながらGUI構築は
アクロバティックなことを避けられない)
281 :
デフォルトの名無しさん :2010/09/19(日) 16:28:33
> Cでは残念ながらGUI構築は > アクロバティックなことを避けられない C++ でも vtbl を自作したり reinterpret_cast みたいな極悪プレーが出てくるけど そのへん C では素直だねー
282 :
デフォルトの名無しさん :2010/09/19(日) 16:30:26
C知らないとどうのこうのとアホなことを言っているのは、老人が自分の出自を重ねたがってるだけだ。 そんなこと全く聞く必要ない。 C++はC++だけ、C#はC#だけで、言語としては完全に独立して学べる。 他言語との対比で理解が深まることもあるだろうが、それがCである必要はない。
Cを「やらされる」ことはあるかもしれないから そういう時違いが分かってると楽だというのはある
WinのC#でGUIだと今んとこ最終的にはWin32APIの壁が 出て来るからちょっと事情が違うかも。
で、結局省略構文の是非はどうなったの
Pythonを「やらされる」ことはあるかもしれないから そういう時違いが分かってると楽だというのはある APLを「やらされる」ことはあるかもしれないから そういう時違いが分かってると楽だというのはある COBOLを「やらされる」ことはあるかもしれないから そういう時違いが分かってると楽だというのはある Goを「やらされる」ことはあるかもしれないから そういう時違いが分かってると楽だというのはある
>>285 _人人人人人人人人人人人人人人人_
> わりとどうでもいい <
 ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^^Y^ ̄
ヘ(^o^)ヘ
|∧
/
>>280 >Cでは残念ながらGUI構築は
>アクロバティックなことを避けられない
それはおまえが無能なだけだろ。
自分に設計能力が無いのを言語のせいにするな。
>>281 C:インターフェース、仕様変更は設計時のみ可能。
いったん開発に入ったら仕様変更は不能に近い、
運用中の仕様変更は論外(版を重ねるごとに悪くなって崩壊)
C++,C#:設計時、開発作業中のインターフェース、仕様変更もある程度可能
運用投入後はマイナーチェンジリビルド以外はタブー
Webアプリ:運用中に常時変更可能
こういった程度の違いはあるだろう
290 :
169 :2010/09/19(日) 17:20:38
配列の参照や、ポインタのアドレスそうさなどで zzzzzzzzzz = aaaaaaaaaa[bbbbbbbbbb + cccccccccc + dddddddddd + eeeeeeeeee + ffffffffff + gggggggggg + hhhhhhhhhh + iiiiiiiiii]; たとえば、添字の中の文字数が多くて、80行(もしくは、使ってるエディタの横幅)を大きく越えてしまう場合。 改行をして書き換えると思います。 この場合の作法にも、ひとそれぞれ、いろいろありそうな気がします。 たとえばボクなら zzzzzzzzzz = aaaaaaaaaa[ bbbbbbbbbb + cccccccccc + dddddddddd + eeeeeeeeee + ffffffffff + gggggggggg + hhhhhhhhhh + iiiiiiiiii ]; こうすると思います。 もしくは zzzzzzzzzz = aaaaaaaaaa[ bbbbbbbbbb + cccccccccc + dddddddddd + eeeeeeeeee + ffffffffff + gggggggggg + hhhhhhhhhh + iiiiiiiiii ]; こういう場合の正しい書き方をご存知の方はいますか? ほんとうはどうやるのが正解ですか? また同様に関数の場合、 aaaaaaaaaa(bbbbbbbbbb, cccccccccc + dddddddddd, eeeeeeeeee + ffffffffff + gggggggggg); などの場合は、どうやって改行しますか? ()の位置、インデントの仕方、演算子の位置、もろもろ、正しい(もしくは一般的な)方法はどんなですか? 後学のために、プロフェッショナルなみなさんの方法を、ぜひ聞きたいです。
変数の長さを短くする
専用のテンポラリ変数を作る。 使いまわしはしない。
>たとえば、添字の中の文字数が多くて、80行(もしくは、使ってるエディタの横幅)を大きく越えてしまう場合。 >改行をして書き換えると思います。 そんなデータ構造は100%設計がおかしい したがってそんなケースはありえない
294 :
デフォルトの名無しさん :2010/09/19(日) 17:30:55
横1行でいいよ。
インデックスを変数に入れた方がデバッグしやすいよ
296 :
デフォルトの名無しさん :2010/09/19(日) 18:19:51
-O3 -ftree-vectorize -ftree-vectorizer-verbose=5 -mmmx -msse3
自分の環境で1行に納まり切らないからと、勝手に改行してしまう奴はクズである。 折り返しというものは、各環境でビューワーが行なうべきものであって、折り返しを改行でコントロールしようなどと考えるのは完全に誤りである。 折り返しと改行はまったく別のものである。それを区別することもできない厨は小学校からやり直してくるべきである。
298 :
デフォルトの名無しさん :2010/09/19(日) 18:46:21
ブログに帰れw
299 :
デフォルトの名無しさん :2010/09/19(日) 18:50:37
コーディングスタイルを強要するなら、Pythonのようにインデントや改行に意味を持たせたほうがいい。 言語仕様外でプログラマーが気を使わなければいけないのなら、それは欠陥言語だ。
Windows のドキュメ ントの先頭には大抵 書いてあるよな。 このテキストをメモ 帳で見る場合には、 メニューから折り返 し設定を……、 云々って。 中途半端に桁数を決 められてると、それ を僅かに下回った環 境で読むときの乱れ が半端ないもんな。
携帯電話か
return 0;
>>297 は正しい。同じ問題はwebの記事やレイアウトにも存在する。
改行は「意味の終わり」に付けるものであって、レイアウトが目的ではない。
304 :
デフォルトの名無しさん :2010/09/19(日) 19:12:36
それなら
>>299 の言うように、改行に意味を持たせればいいじゃん
インデントも折り返しもC言語としては何の意味も持たない # で始まる行以外は全部一行にしてしまえ
C99 なら // もあるだろ。
308 :
デフォルトの名無しさん :2010/09/19(日) 19:24:28
309 :
570 :2010/09/19(日) 19:26:19
310 :
デフォルトの名無しさん :2010/09/19(日) 21:28:39
ビットマスクについての質問です。 a%16=a&0xf にしたいのですがどうすればいいですか? 同じ演算結果を得るためにバイトデータの下位4ビットを抽出したいです。 よろしくお願いします。
311 :
デフォルトの名無しさん :2010/09/19(日) 21:30:52
aを4ビット以上の符号なし整数にすればいいんじゃないの?
312 :
デフォルトの名無しさん :2010/09/19(日) 21:33:17
結果が一致しません。 for(i=0;i<16;i++){ a[i]^=((b[i]+c[i])&15); d[i]^=(b[i]+c[i])%16; printf("%d %d\n",a[i],d[i]); }
元が違うんだろ。
負の数にでもなってんだろ
315 :
デフォルトの名無しさん :2010/09/19(日) 21:39:48
for(i=0;i<16;i++){ printf("%d %d\n",a[i],d[i]); //☆☆☆ a[i]^=((b[i]+c[i])&15); d[i]^=(b[i]+c[i])%16; printf("%d %d\n",a[i],d[i]); } これを見てみたいな。
a[i]とd[i]が0で初期化してないオチだと興ざめだな
317 :
デフォルトの名無しさん :2010/09/19(日) 21:52:28
同じになりました。dの値が0で初期化されてました。 d=aをしたら一致しました。 軽く質問されたのであわてて動作確認をしたら違っていたので 今までのビットマスクの知識が間違っていたのかと思いました。
318 :
デフォルトの名無しさん :2010/09/19(日) 22:01:03
興ざめだ。
>>183 http://codepad.org/UHWwncjm 当方linuxなのでgcc4.5のコードなので、たぶんインラインアセンブラの順序がうぃんどうずとは逆だとおもいますが、
よくわからないですけど、%16 ってのは 16で割った余りってことなのでしょうけど、sseには整数除算の余りの命令が無いっぽい??ので固定小数で代用しちゃったけど
これ、ちゃんと動いてるか不安です(笑)。はてさて?
まちがってたらごめんんなさい。 あと、インデントはすごく個人的な方言で書いてしまいました。よみずらくてすみません。(ぺこり)
配列bの先頭から16バイト分までの範囲を、xmm0レジスタにコピー 配列cの先頭から16バイト分までの範囲を、xmm1レジスタにコピー movdqa (%1), %%xmm0; movdqa (%2), %%xmm1; xmm1レジスターと、xmm0レジスターを、char型の16個の配列としてあつかい、 各インデックスのchar同士(たとえば b[0]+c[0] や b[3]+c[3]など)を、 16個を一回の命令で一気に足し算する。 足し算の結果はxmm0レジスターに入る。 paddb %%xmm1, %%xmm0; 8bit中の下位4bitのマスク(00001111)の配列を、 先頭から16バイト分までの範囲をxmm1レジスターにコピー。 movdqa (%3), %%xmm1; 配列b + 配列c の演算結果 xmm0 の各バイトを、 マスクによって、各バイトの下位バイト以外を0にする。(00001111) これを mod 16 計算の代用とする。 (sseにはバイト整数型の除算命令が無いので) 演算結果はxmm0レジスターに入る。 pand %%xmm1, %%xmm0; 配列aの先頭から16バイト分までの範囲を、xmm1レジスタにコピー movdqa (%0), %%xmm1; 配列xmm1レジスターと、xmm0レジスターを、char型の16個の配列としてあつかい、 各インデックスのchar同士を、16個を一回の命令で一気にXORする。 XORの結果はxmm0レジスターに入る。 pxor %%xmm1, %%xmm0; 演算結果を、配列aの先頭から16バイト分までの範囲に、一気にコピーする。 movdqa %%xmm0, (%0);
321 :
デフォルトの名無しさん :2010/09/19(日) 23:58:47
unsigned charにすると自動ベクトル生成に失敗します。 -O3 -ftree-vectorize -ftree-vectorizer-verbose=5 -mmmx -msse2 ありがとうございます。やってみます。 因みに自動生成されたアセンブラは-O3だけのときより大きくて10倍 位遅いです。やはり手動で書くしかないのでしょうか。
最適化オプションは -O1 しか使わないな。
(´・ω・`)もうっ!
2ぐらいまでは信じてあげてもいいんじゃないか
(´・ω・`)もうっ!
なんだなんだ Cで書くかアセンブラで書くかスレの誤爆か?
>>324 いや、ループ展開するとかやめてくれって感じ。
せっかく冗長のない綺麗なソースコード書いても、実際の生成されたコードで汚くされたらたまらんよ。
お前馬鹿だろ
ループのアンロールも知らない素人か
330 :
デフォルトの名無しさん :2010/09/20(月) 01:35:42
331 :
デフォルトの名無しさん :2010/09/20(月) 01:55:02
因みにこれが本体です。 一億バイト生成するのに9秒かかります。これを何とかしたいです。 for(k=0;k<500000;k++){ for(j=0;j<16;j++){ for(i=0;i<16;i++){ d1[i]^=GF[((FG[a[j]]-1)+(FG[h1[i][FG[b[j]]]]-1)&0xff)+1]; d2[i]^=GF[mlt(FG[a[j]],FG[h2[i][FG[b[j]]]])]; } } for(i=0;i<16;i++) a[i]^=(d1[i]+c[i])&0xff; for(i=0;i<16;i++) b[i]^=(d2[i]+c[i])&0xff; /* for(i=0;i<16;i++) printf("%d %d",d1[i],d2[i]); printf("\n");*/ //#p @d }
こいつぁすげえや
fga=FG[a[j]]; fgb=FG[b[j]]; とかで、 一度、変数に入れればいいんではないかいな?
334 :
デフォルトの名無しさん :2010/09/20(月) 02:31:18
ベクトル変換の対象になってないみたいです。 アドレス操作が複雑すぎるんでしょうか。 配列を参照してますし・・・
一億バイト(100MByte)で9秒なら、そんなに遅くないのでは
336 :
デフォルトの名無しさん :2010/09/20(月) 02:42:48
GPGのAESモードで圧縮なしだと1.6秒位で暗号化出来るんです。 GPGに勝ちたい!
>>336 ここで訊いているようなレベルじゃ無理無理
mltとかが時間かかってるとか 16回のループをのべたんで書いてみるとか コンパイラ君の最適化に期待できるようなコードじゃないような気がする
339 :
デフォルトの名無しさん :2010/09/20(月) 02:59:22
内側のループでは外側で計算した定数を16回mltしているだけなので 内側のループだけでもベクトル化したいです。 内側をアンロールして、o=FG[a[i]],p=FG[b[i]]とすれば出来るでしょうか? 因みに int mlt(x, y){ if(x==0||y==0) return 0; return ((x+y-2)&0xff)+1; } です。
340 :
デフォルトの名無しさん :2010/09/20(月) 03:05:10
アンロールしてみました。 GCCに最適化させるオプションを教えてください。
山崎のスイスロールってクリーム無いほうがいいよな。
-O2でいいんでないかい 汗のソース吐かせて、地道に処理が早くなるように手動で最適化する方が早道のような気がするけど
h1[i][j]; h2[i][j]; の2次元配列のiとjを入れ替えてみるのも手かも
a[b] == *(a+b) なんだからどう入れ替えても一緒だろ。 h1[i][j]; h1[j][i]; i[j][h1]; i[h1][j]; j[h1][i]; 全部一緒
いやその合計値の増え方が違うだろwwwww 隣接するとこ舐めてくほうがキャッシュに乗りやすい いやうpられたソースは見てないから、今回の件で言えるのかはわからないが
346 :
デフォルトの名無しさん :2010/09/20(月) 09:22:08
キャッシュの乗せ方をもう少し詳しく教えてください。
>>346 キャッシュメモリはキャッシュラインサイズ単位で管理されている。
キャッシュラインサイズはCPUによって違うけど、だいたい16byteぐらい。
同時に使用するメモリは同じキャッシュラインに載っていた方が、
メモリアクセスが少量で済む。
つまり・・・
struct{
int d1;
int d2;
int h1;
int h2;
....
}data[...];
・・・とかして、同時に使用する変数が隣接するメモリアドレスに
配置されるようにしたほうが、キャッシュの使用効率は良くなる。
後は適当に_mm_prefetchを使う。
どう見ても入門編じゃない罠
350 :
デフォルトの名無しさん :2010/09/20(月) 10:09:54
CPUに搭載されている一次キャッシュじゃないんですか? 16バイトしかないなんて・・・ プリフェッチして遅延を減らすという話は聞いたことがあります。
>>350 キャッシュラインサイズはCPUによって違うって言ったろ。
でかいやつだと256byteとかもある。
そろそろスレ違い
354 :
デフォルトの名無しさん :2010/09/20(月) 10:40:53
今使ってるやつはセレロンデュアルコアで16kbyte位あると思います。
非常に基本的な質問ですみません。 Aという関数を持つファイルA.cと Bという関数を持つファイルB.cがあって 両方に共通するZという関数を追加したい場合 どうしたらいいんでしょう。
Z.cとZ.hを作って A.cとB.cにZ.hをインクルードする
Aに従属する関数ならA.cとA.hに追加すれば良いし Bに従属する関数ならB.cとB.hに追加すれば良いし 独立した機能を持つ関数ならZ.cとZ.hを作れば良い
358 :
デフォルトの名無しさん :2010/09/20(月) 11:36:52
>>355 Z.c で作った関数を A.c や B.c でいきなり使う
警告出るが無視すると動く
奇麗事を始める前に、まずこの事実から
360 :
デフォルトの名無しさん :2010/09/20(月) 11:51:21
gccの自動並列化に詳しい人がいたら教えてください。 O3 -ftree-vectorize -ftree-vectorizer-verbose=5 -mmmx -msse2
test int b=0;
素朴な疑問なんですがdouble型はprintfだと%fなのにscanfだと%lfって一貫性がないと思うんですが。
お前みたいな奴のために規格が追いついたから安心しろよ
>>363 printfもC99から%lf対応したもんね。
どうもありがとう。
365 :
デフォルトの名無しさん :2010/09/20(月) 20:24:36
共用体の初期化の仕方が判りません。教えてください。 typedef union uni { unsigned long long int dd[2]; unsigned int cc[4]; unsigned short ss[8]; unsigned char m[16]; } on; union uni c1,c2,u; c1.dd={'あっふん','あかんて'};
初期化と代入の違いは理解してるか?
367 :
デフォルトの名無しさん :2010/09/20(月) 20:27:11
わかりません。同じデータを違う型で参照できるということくらい。
>>365 共用体の初期化は最初のメンバで行う
long long に文字列を代入する事は出来ないよ
369 :
デフォルトの名無しさん :2010/09/20(月) 20:30:46
メンバが配列でも一つの値で代入するんですか?
370 :
デフォルトの名無しさん :2010/09/20(月) 20:31:23
>>367 定義の時に値を与えるのが初期化
それ以外で値を与えるのが代入
この問題では特に区別しなくても構わない。
372 :
デフォルトの名無しさん :2010/09/20(月) 20:32:29
c1.dd={0xffffffffffffffff,0xffffffffffffffff}; これならいいですか?
= {...} 出来んのは初期化の時だけ union uni c1 = {'あっふん','あかんて'}, c2, u;
ドスケベヴォイスを代入することは規約で禁止されている
375 :
デフォルトの名無しさん :2010/09/20(月) 20:42:35
指定されたタイプより代入値が大きいと警告が出ました。 unsigned long long int dd[2] = 128bit?
376 :
デフォルトの名無しさん :2010/09/20(月) 20:53:15
シングルクォートで複数の文字を囲むのって有りだっけ?
多文字リテラルって言葉が出てるんだからググれよ
378 :
デフォルトの名無しさん :2010/09/20(月) 21:25:00
もっとこうダイレクトに文字列を数値表現できないの?
イミフ
380 :
デフォルトの名無しさん :2010/09/20(月) 21:49:29
>>378 UNIVAC の BCD みたいなこと?
381 :
デフォルトの名無しさん :2010/09/20(月) 21:52:10
つまり2バイトコードを数値で出力するみたいな。
Integer i = Textbox1.Text みたいなことじゃね?
C++なら、
>>382 程度のことなら = のオーバーロードで出来るけど。
素直に言語変えたほうが・・・・
perlとかrubyとか。
代入できないからって言語変えるわけ無いだろw
プラスマイナス問わずすべてのアドレスのオフセットを格納できるサイズが保証されてる整数ってありますか?ptrdiff_tってのがそうなんでしょうか?
long?
LLP64だとlongはだめぽ
388 :
デフォルトの名無しさん :2010/09/20(月) 22:49:21
LLP64なローカルな環境は知らないな
無知をひけらかすなよ
printfってなに?
おまじない
print functionの略
fはformatだろ。
print fack
print f fujio
>>395 oh
miss spell
print fuck
良いんじゃね。別に問題ない。 次に進んでくれ。
(∩´∀`)∩ワーイ
教本の記憶域の動的確保ってトコで、例文には #include<stdio.h> #include<stdlib.h> int main(void){ int *x; x=calloc(1,sizeof(int)); if(x==NULL) puts("記憶域の確保に失敗しました"); else{ *x=57; printf("*x=%d\n",*x); free(x); } return 0; } ってあったんだが、voidからint *に変換出来ません、とかって変なエラー弾き出すから (int *)calloc(1,sizeof(int));って風にキャストしてみたら通ったんだが どっかの本でキャストは危なっかしいから出来れば避けろ、って聞いたからこのまま行っていいのか分からない そもそも教本だとキャストしなくても出来るっぽいし、何故エラーが出たのか分からない、一体どういう事なんだ・・・
402 :
デフォルトの名無しさん :2010/09/21(火) 06:45:38
unsigned long long intを初期化しようとすると警告がでます。 正しい方法を教えてください。 よろしくお願いします。 unsigned long long int a; a=0xffffffffffffffff;
>>403 void * から暗黙の変換はC++だとできないんだよ、Cではできる
おそらく
>>401 はVC++を使ってると思われる
>>401 エラーが出るのは恐らくC++としてコンパイルしているから。
Cならキャストする必要がないし、C++ならmalloc()系は使わない方がいい。
>>402 警告が出るならその内容を書きなさい。
VC++もCファイルはCとしてコンパイルするんじゃないの?使ってないから知らんけど
>>401 はC++をベターCとして使ってるってことなのかな
407 :
デフォルトの名無しさん :2010/09/21(火) 07:17:29
warnig integer constant is too large for 'long' type こういう警告が出ます。
たぶんC99だと出来る
ごめんテキトーに言った。ググったら答え出た
>>407 unsigned long long定数にはlluが必要。
>>406 *.ccソースをc++としてコンパイルしているなら寧ろ g++ foo.c かもしれないが、
VC++で殻のプロジェクトを作ってなんとなく*.cppにしてしまっているのかもしれない。
ありがとう、CとC++の仕様が違ったのか、このままキャスト変換を書いて行く事にします。
413 :
デフォルトの名無しさん :2010/09/21(火) 07:48:47
>410 具体的にどう書くんですか?
414 :
デフォルトの名無しさん :2010/09/21(火) 07:51:50
文字の”あ”を数値に変換したいのですが、どうすればいいですか?
>>413 その人じゃないけどたぶんこんなん
unsigned long long int a;
a = 0xffffffffffffffffLLU;
printf("%llu\n", a);
>>414 int a = (int )L'あ';
417 :
デフォルトの名無しさん :2010/09/21(火) 07:57:56
418 :
デフォルトの名無しさん :2010/09/21(火) 08:09:24
>>416 エラーが出ます。
converting to excution charactor set: Invarid or incomplete multibyte or wide charactor
419 :
デフォルトの名無しさん :2010/09/21(火) 08:39:05
ひらがなを文字コードに変換する方法を教えてください。
そんくらい自分で調べろよww 親切にもエラーメッセージが出てるのだから、それでググれば解決するのに。 $ gcc -finput-charset=shift_jis hoge.c
421 :
デフォルトの名無しさん :2010/09/21(火) 08:54:01
調べても出てきません。
調べたら出てきました。
>>412 ちゃんとコメント読んでるか?
Cとして作るならキャストは不要だ。C++として作るならそもそもmalloc系を使うな。
ベターCなどという中途半端なことをするから今回のようないらん問題にぶつかる。
C++の中のC互換は、元のCとは完全に別物だ。
これからも「あれ?Cではこうするって書いてあるのにエラーになる。なんで?」というのが出てくるぞ?
switchのコストってcaseの数をnとしたらO(n)ですか? それともランダムジャンプみたいなことしてO(1)になるんでしょうか?
O(log n)だったりO(1)だったりコンパイラの気分次第 O(n)はアホすぎるだろう
最適化でジャンプテーブル O(1) か二分探索 O(log n) になるんじゃないかな
>>424 条件で変わるだろうから一概には言えないと思う。
多段ifみたいに一条件ずつチェックするならO(n)かもしれないけれど、
nがある程度大きければcase値とジャンプ先のテーブルになるだろうからnの探索時間でO(log2(n))かな。
さらにnが取り得る値の数に充分近いならジャンプテーブルだけになるからO(1)になると思う。
でも今時のCPUはパイプラインが深いからジャンプテーブルを使うとコードは 短くなるけどパイプラインバブルが発生して結局遅くなるんだけどな それでも条件分岐が外れる事によるパイプラインバブルの発生確率を考えると 賢い選択かもしれない どうせ分岐予測なんて当たらないだろうし
二分探索に最適化って本当にしてんの?
そんな大量のswtich-caseを見たことがないからなんとも言えないけど、 逆に言えばそんなケースは多くないだろうからやってない可能性が高いなぁ。 普通はO(n)でも充分実用だと思うし。
>>429 してる。けど、最近のVC(VS)だけだと思う。
gccとかはやってないんじゃないかな。
gccだってそれくらいはやるよ
>>432 ごめん、知らなかった。
ちなみにgcc4以降とかですか?
gcc(3.x系)が二分探索吐いたの見たことないんですが。
あるいは特別不可解なオプション?
>>434 なってますね。手元でも確認しました。
ある程度case値が分散してないとならないようですね。まぁ当たり前か。
436 :
430 :2010/09/21(火) 16:33:00
んじゃ、私も前言撤回。やるもんだ。
gcc様すいませんでした。
gcc様すいませんでした。
gcc様すいませんでした。
なんだかんだ言ってもswitchに実行効率を期待するのはジジイ系のバッドノウハウ
大昔のMS Cは、等差数列で分岐が7以上だったらテーブルになってた > switch
OSSのソフトがどの様に作られているか、勉強しているのですが ライブラリ + GUIで作られていているのですが デバッグする時は1つのソフトとしてじゃなくて、2つそれぞれをデバッグしないとダメなのでしょうか?
ですがですがと鬱陶しいのですが、日本語の勉強くらいまともにできたかったのでしょうか?
話せばすんごく長くなる話で、まだお話も完全に安定した のが出来ていない段階ですので、そういった話はご遠慮く ださい。 今の50代〜60代のこの分野での発展の 中心的役割を果たした世代(はっきしいって40代以下 は皆実力的に大して変わりません。)が定年退職して そういった話を語りだして集成されて、定式化され始める のがあと数年先で、ある程度話がまとまってくるのは更に それから10年はかかるでしょう。
445 :
デフォルトの名無しさん :2010/09/21(火) 23:30:25
>>442 「ライブラリ」が他人から与えられたもの、「GUI」が自分で作ったもの
という意味であれば、「GUI」だけデバッグすればいい。
プログラミング初心者の大学生です。 バブルソートをコーディングしようとしたら、こんなかんじになったんですが これもバブルソートといえるのでしょうか? #include<stdio.h> int main(void) { int a[1000], i, num, t,b; char ch; printf("数字を何個入力しますか?\n"); scanf("%d",&num); printf("\n数字を入力してください。\n"); for(i=0;i<num;i++){ scanf("%d",&a[i]); } for(i=0;i<num;++i){ for(b=i;b<num;b++){ if(a[b+1]<a[i]){ t=a[i]; a[i]=a[b+1]; a[b+1]=t; } } } for(i=0;i<num;i++) printf("\n%d ",a[i]); }
>>446 バブルソートというからには隣り合う要素を比較するべき
>>446 b + 1 とあるところは b のままでいいと思います。このままだとデータが 0〜num - 1 の num 個なのに、a[num] をチェックしてしまいます。
それはそうと、これは選択ソートでしょうね。
選択ソートだな
特定のビットの数(?)で表される数値を16進で取得したいのですが いまいちどうすればいいのか分かりません。 だれかヒントをおねがいすます。 たとえばbit1からbit13までが、1010110111001だと 16進は0x15b9となるわけですが、これをコードにしたいわけです。
>>447 >>448 >>449 たしかにバブルソートじゃなくて選択ソートでした...
理系だしプログラミングぐらいできなかんと思い勉強し始めましたが、先が思いやられます...
理系とか大学生とかの情報は特にいらないです
454 :
デフォルトの名無しさん :2010/09/22(水) 00:21:45
>>452 お前が要らないとかの情報も要らないです。
>>450 いまいち何がしたいのかわからないが、
"1010110111001"という文字列を2進数とみて整数型変数に格納したいなら、strtol()。
整数型変数の値を16進文字列にしたいなら、printf()。
456 :
デフォルトの名無しさん :2010/09/22(水) 01:45:34
隣り合う要素ってこういう事?要素が多くなると時間かかりそう・・・ #include <stdio.h> #include <stdlib.h> #include <time.h> int main(){ int n,raum,weiter=1; int zahren[10]; srand((unsigned)time(NULL)); for(n=0;n<10;n++) zahren[n]=rand()%100; for(n=0;n<10;n++) printf("%d,",zahren[n]); printf("\n\n"); while(weiter!=0){ weiter=0; for(n=0;n+1<10;n++){ if(zahren[n] > zahren[n+1]){ raum=zahren[n]; zahren[n]=zahren[n+1]; zahren[n+1]=raum; weiter=1; } } } for(n=0;n<10;n++) printf("%d,",zahren[n]); printf("\n\n"); return 0; }
前スレ
>>10 辺りにあったswap使えばもう少し見やすくなりそうだな
#define swap(type , x , y ) do{ type t=x; x=y; y=t; }while(0);
>>446 これって、2重ループ内でいちいち交換しているので選択ソートではないでしょ。
かと言って、
>>447 のとおりバブルソートでもない。
なんて言うんだろ。
バブ択ソート
>>459 >なんて言うんだろ。
バグ。
ちゃんと動かねぇじゃん。
つーか、for (; b < num; )のループ内でa[b + 1]にアクセスしている時点でバン。
あー、>448で指摘済みか。じゃ、バグの件はいいとして、挿入ソートと選択ソートの劣化版のようだ。
>>459 結果として外側のループ(ループ変数 i) を一回まわるごとに、a[i] に最高のものが来る点が選択ソートっぽいのですけれども。
wikipedia の実装例をみるかぎり、これでも選択ソートらしい。
464 :
デフォルトの名無しさん :2010/09/22(水) 09:13:48
#include <stdio.h> #include <stdlib.h> int main(void){ unsigned long long int a,b; a=strtoull("0x1111111111111111",(char **)NULL,16); b=strtoull("0x2222222222222222",(char **)NULL,16); a=a^b; printf("%llu\n",a); return 0; } このプログラムをMMXで最適化したいのですが方法が判りません。 アセンブラで書くしかないのでしょうか?
なぜいまさら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を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。