C言語なら俺に聞け(入門編)Part 69
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2010/09/15(水) 00:21:37★前スレ
C言語なら俺に聞け(入門編)Part 68
http://hibari.2ch.net/test/read.cgi/tech/1282536520/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★初心者、初級者の方は他の質問スレのほうが良いかもしれません。
例えば
【初心者歓迎】C/C++室 Ver.73【環境依存OK】
http://hibari.2ch.net/test/read.cgi/tech/1274395127/
とか
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 137代目
http://pc12.2ch.net/test/read.cgi/tech/1276810079/
★C++言語については避けてください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
# 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
# サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
0002デフォルトの名無しさん
2010/09/15(水) 00:34:01{
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);
と呼び出すのと同じ動作をさせたいです。
0003デフォルトの名無しさん
2010/09/15(水) 00:38:010004デフォルトの名無しさん
2010/09/15(水) 00:39:450005デフォルトの名無しさん
2010/09/15(水) 00:40:07型を引数にしたいって話なら無理
スタックに型をどうやって積むねん!
0006デフォルトの名無しさん
2010/09/15(水) 00:40:54無理。
サイズ渡すかcalloc使うかマクロ使うかしてがんばれ。
0007デフォルトの名無しさん
2010/09/15(水) 00:49:36ありがとうございます。
>>6
関数呼び出し時に型の指定をしたいので
マクロは合わないんですよね。
サイズ渡すのが良さそうです。
やってみます。ありがとうございました。
0008デフォルトの名無しさん
2010/09/15(水) 00:55:120009デフォルトの名無しさん
2010/09/15(水) 01:00:43いいえ全然。多分 const だの enum だのを使ったほうがいいと思います。今はみんな c++ でしょうし。
0010デフォルトの名無しさん
2010/09/15(水) 01:02:230011デフォルトの名無しさん
2010/09/15(水) 01:14:29前880じゃないけど。
てか前870なんだが、もうちょっとちゃんと書いとく。
> 場所によって意味が変わる、という事は無い。
少なくとも規格上関数内外のstaticな変数の宣言において、
関数内の宣言では無結合、関数外では内部結合、
とその宣言される変数の持つ結合が異なる。
無結合と内部結合ではコンパイラの解釈が異なる。
だから「ついでに・・・」「まとめると・・・」の部分は大嘘。
0012デフォルトの名無しさん
2010/09/15(水) 01:37:130013デフォルトの名無しさん
2010/09/15(水) 01:50:41前スレ 986 だけど、書いた通り VC の実装に基づく事実なので。
コンパイル時のアセンブリリスティングやオブジェクトファイルを見てみれば、
関数 testfunc() 内の static 変数 testvar も、_?testvar@?1??testfunc@@9@9
のような名前でリンケージを持つ事が判る。
VC が規格外の動作をしてるって言いたいの?
0014デフォルトの名無しさん
2010/09/15(水) 02:44:20それを中でユニキャストに変換してもう1つのインターフェースから出すことって可能かな。。。
0015デフォルトの名無しさん
2010/09/15(水) 03:17:31a = (char*)malloc(1);
キャストしては駄目というのは
どういった理由からですか?
0016デフォルトの名無しさん
2010/09/15(水) 04:52:02別に const 付けたからと言って動作が変わるわけではないのよ
const 付けた変数の内容を変更するコードに対してそれはダメよってコンパイラさんが怒るだけの話
だから内容を変更しない定数に付けておけば間違いが減るってだけの話なんよ
0017デフォルトの名無しさん
2010/09/15(水) 04:58:540018デフォルトの名無しさん
2010/09/15(水) 05:01:24別にダメな理由は無いよ
冗長かもしれないけど(ワーニング出なかったっけ?)、生成されるコードに変化が有る訳でもないから、
できるだけ明示的にキャストするのは悪い習慣ではないと思う
0019デフォルトの名無しさん
2010/09/15(水) 05:05:58それは処理系依存じゃね?
まぁ何処に配置されようが同じだけど
0020デフォルトの名無しさん
2010/09/15(水) 05:41:55C ではあくまで変数として処理される。
0021デフォルトの名無しさん
2010/09/15(水) 08:42:10コンパイラ依存では?
0022デフォルトの名無しさん
2010/09/15(水) 08:44:51ちげぇよwwww
配列宣言の添字に使えるかとかの問題の話できちんと規格で決まってる
いやC99だと動的に配列作れるからつくれちゃうんだけど
0023デフォルトの名無しさん
2010/09/15(水) 09:35:000024デフォルトの名無しさん
2010/09/15(水) 09:56:55C言語の結合には、外部結合、内部結合、無結合の3種類があるんだと。
どっかのサイトでは「結合が無いのではなく、
無結合という結合を持つ」なんて書いてあった。
>>13
それはもうC言語でいう結合は関係ない世界じゃないの?
基本的には、書いたCのソースをビルドして実行した時、
規格が求めるように動けば規格準拠で、
バイナリでの表現は関係ない。
アセンブリ上では、ブロックスコープの変数が
別の翻訳単位から見える形で定義されてても構わないし、
場合によっては定数に変換されたりして変数が削除されてても良い。
0025デフォルトの名無しさん
2010/09/15(水) 10:55:01難しく考えすぎなんだよ。
結合は「コンパイラ(≠リンカ)による依存性、一意性の解決」とでも思えばいい。
同じ名前のオブジェクトが出現したときに「最終的にどれを呼べばいいのか?」をコンパイラが判断すること。
この段階でコンパイラはそれぞれのオブジェクトに「依存解決済みの一意の名前付け」をする。
もちろん最終的に一意性が確保できなければエラーを吐く。
リンカがそれらを相対アドレスに置き換えるのはその後の話だ。
externが付いてない限り、またスコープ内で重複しない限り、ブロックスコープにあるオブジェクトは一意だろ?
だから結合という操作は不要なんだよ。
0026デフォルトの名無しさん
2010/09/15(水) 11:00:340027デフォルトの名無しさん
2010/09/15(水) 12:53:28malloc_array(100, "double");
とすればいいんじゃね
0028デフォルトの名無しさん
2010/09/15(水) 12:54:11処理系による
0029デフォルトの名無しさん
2010/09/15(水) 13:03:35よらねえよ。つーかよったらよっぽど変な実装だぞ。
0030デフォルトの名無しさん
2010/09/15(水) 14:51:19C++をサポートしてる処理系なら違う場所になるね。
だから今は同じ場所になる処理系の方が稀だわ。
君は昔のC++がなかった頃の処理系しかしらないんんだろう?
0031デフォルトの名無しさん
2010/09/15(水) 16:14:00>const 付けると、C++ だとちゃんと定数扱いになる
「static const 整数型」だけの特別扱いじゃなかったっけ
0032デフォルトの名無しさん
2010/09/15(水) 19:14:17その次はどんな言葉が出てくるんでしょうね?
0033デフォルトの名無しさん
2010/09/15(水) 19:19:410034デフォルトの名無しさん
2010/09/15(水) 20:07:41初心者にも分かる言葉で説明する事によって
理解を深めるのがいいんジャマイカ?
0035デフォルトの名無しさん
2010/09/15(水) 20:08:35んなことねえよ
0036デフォルトの名無しさん
2010/09/15(水) 21:09:377.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という言葉が出てこない
003731
2010/09/15(水) 22:18:34(整数とenumに限るのはなぜだろ?)
0038デフォルトの名無しさん
2010/09/15(水) 22:33:49http://hibari.2ch.net/test/read.cgi/tech/1280914463/
0039デフォルトの名無しさん
2010/09/15(水) 23:37:54元々前スレ 751 が 「staticの指定は「こいつの存在をリンカに知らせない」という意味」
とか言い出したから、その反証として VC の動作を挙げただけ。
C の規格と関係あるかどうかは関知しないし、そもそもリンカの動作自体が規格で明確に
定められていない。
>>25
事実をそのまま述べただけなのに 「考えすぎ」 とか言われても困る。
0040デフォルトの名無しさん
2010/09/15(水) 23:44:29書き忘れ。
一意になろうがなんだろうが、コンパイル時に static 変数のアドレスが特定できない
処理系の場合は、その変数の参照部分に対してリンク操作が必要になる。
(そのリンク操作の指示はリンカが行い、実際のリンク操作はローダーが行う)
0041デフォルトの名無しさん
2010/09/16(木) 00:00:17http://f4.aaa.livedoor.jp/~pointc/No.22520.html
0042デフォルトの名無しさん
2010/09/16(木) 03:21:370043デフォルトの名無しさん
2010/09/16(木) 03:33:500044デフォルトの名無しさん
2010/09/16(木) 04:00:150045デフォルトの名無しさん
2010/09/16(木) 05:25:58もうちょっと外部リンケージを持った内容にしてほしい。
0046デフォルトの名無しさん
2010/09/16(木) 07:35:15このスレのレベルはstataic程度が上限。
0047デフォルトの名無しさん
2010/09/16(木) 08:42:48そこについては否定してないよ。
0048デフォルトの名無しさん
2010/09/16(木) 10:17:000049デフォルトの名無しさん
2010/09/16(木) 15:30:160050デフォルトの名無しさん
2010/09/16(木) 18:18:290051デフォルトの名無しさん
2010/09/16(木) 22:19:16書き込むなら情報として他の人にも意味が分かるように書いてくれよ。
0052デフォルトの名無しさん
2010/09/16(木) 22:21:520053デフォルトの名無しさん
2010/09/16(木) 22:23:520054デフォルトの名無しさん
2010/09/16(木) 22:55:03入力の段階で弾くのがいいかな。
0055デフォルトの名無しさん
2010/09/16(木) 23:04:49式は暗黙でintもしくはdoubleになる
これを覚えておけば自ずと手段も決まってくる
0056デフォルトの名無しさん
2010/09/16(木) 23:07:59そうそう
符号付き整数の場合、オーバーフローは起こした時点で
未定義の世界に突入しちゃうので、ふつう望ましくない
0057デフォルトの名無しさん
2010/09/16(木) 23:16:45何を言ってんだよ?
0058デフォルトの名無しさん
2010/09/17(金) 00:41:030059デフォルトの名無しさん
2010/09/17(金) 00:51:22まあ、実装でバラバラってのも困るから、
ガイドライン程度は決めておいたらいいが。
言語機能そのものは削れるだけ削ってシンプルにしたほうがいい。
なのに C99 までどんどん複雑化の方向だもんな。ガッカリだよ。
0060デフォルトの名無しさん
2010/09/17(金) 01:19:160061デフォルトの名無しさん
2010/09/17(金) 01:28:150062デフォルトの名無しさん
2010/09/17(金) 02:41:3610億に達した段階で一旦出品が取り消された模様。
0063デフォルトの名無しさん
2010/09/17(金) 05:47:41たしかにコンパイラ作る側には面倒な部分ではあるけど。
規格化される前、1972年のBell研のCコンパイラの時点で
float/doubleはサポートされていたよ。
重きをおいていたのはハードウェアの持つ性能を生かすことだったんだろう。
C99は大部分バカげた退化だったけどね。
0064デフォルトの名無しさん
2010/09/17(金) 08:27:510065デフォルトの名無しさん
2010/09/17(金) 08:35:090066デフォルトの名無しさん
2010/09/17(金) 08:37:290067デフォルトの名無しさん
2010/09/17(金) 08:39:530068デフォルトの名無しさん
2010/09/17(金) 08:50:070069デフォルトの名無しさん
2010/09/17(金) 08:50:580070デフォルトの名無しさん
2010/09/17(金) 09:03:360071デフォルトの名無しさん
2010/09/17(金) 09:36:43#if 0じゃあかんの?
0072デフォルトの名無しさん
2010/09/17(金) 10:33:210073デフォルトの名無しさん
2010/09/17(金) 12:17:23エディタにもよるが /* */ の範囲で配色が変るのがある
#if 0 〜 #endif の範囲で配色が変るエディタがあれば、等価に使うだろうね
0074デフォルトの名無しさん
2010/09/17(金) 12:23:47/* */が二重なるのも気にしなくていいよな
0075デフォルトの名無しさん
2010/09/17(金) 12:33:40配色だけで済まないじゃん
0076デフォルトの名無しさん
2010/09/17(金) 12:39:21配色の変わるエディタならだいたい対応してるだろ
0077デフォルトの名無しさん
2010/09/17(金) 12:49:120078デフォルトの名無しさん
2010/09/17(金) 13:01:320079デフォルトの名無しさん
2010/09/17(金) 13:05:36逆にそんなエディタがあるのか?
0080デフォルトの名無しさん
2010/09/17(金) 14:50:53int n = 0;
0081デフォルトの名無しさん
2010/09/17(金) 15:24:50int 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();
}
}
}
0082デフォルトの名無しさん
2010/09/17(金) 15:30:30最初の一回で運命が決まってしまうのだな
0083デフォルトの名無しさん
2010/09/17(金) 15:42:52typedef 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);
0084デフォルトの名無しさん
2010/09/17(金) 15:49:500085デフォルトの名無しさん
2010/09/17(金) 15:51:08ぱっと英文思い浮かばないときはどうしてる? やっぱりあきらめてローマ字?
0086デフォルトの名無しさん
2010/09/17(金) 15:52:210087デフォルトの名無しさん
2010/09/17(金) 15:54:02昔のコードとか見ると、調べてつけた英単語の意味忘れてることとかあるし
0088デフォルトの名無しさん
2010/09/17(金) 15:56:18> 漢字
0089デフォルトの名無しさん
2010/09/17(金) 15:59:59納期直前だと逃避のために和英辞書や翻訳サイトで調べたり、海外のソースコードを見たりする
0090デフォルトの名無しさん
2010/09/17(金) 16:04:01Javaでも出来る
たぶん誰もやらないだろうけど
・・・でもひょっとしたら面白いかもしれんな
仕事ではもちろん却下だが、個人の趣味でなら、一度やってみようかな
0091デフォルトの名無しさん
2010/09/17(金) 16:59:15int n = 0;
return n;
0092デフォルトの名無しさん
2010/09/17(金) 17:47:270093デフォルトの名無しさん
2010/09/17(金) 18:42:510094デフォルトの名無しさん
2010/09/17(金) 18:47:580095デフォルトの名無しさん
2010/09/17(金) 20:05:200096デフォルトの名無しさん
2010/09/17(金) 20:07:410097デフォルトの名無しさん
2010/09/17(金) 20:11:050098デフォルトの名無しさん
2010/09/17(金) 20:12:090099デフォルトの名無しさん
2010/09/17(金) 20:13:310100デフォルトの名無しさん
2010/09/17(金) 20:14:170101デフォルトの名無しさん
2010/09/17(金) 20:14:290102デフォルトの名無しさん
2010/09/17(金) 20:16:420103デフォルトの名無しさん
2010/09/17(金) 20:18:350104デフォルトの名無しさん
2010/09/17(金) 20:22:48http://www.youtube.com/watch?v=9ukhOAUseKY&feature=related
0105デフォルトの名無しさん
2010/09/17(金) 20:49:17こういうのって、結局はただ解像度が粗いだけの普通のドットマトリクスモニターじゃん。
何の意味があるのか全く解らんのだが。
エクセルでこういうのやってる動画も時々上がるけど、あれも同様に意味不明。
0106デフォルトの名無しさん
2010/09/17(金) 20:54:500107デフォルトの名無しさん
2010/09/17(金) 20:55:31涙ふけよw
0108デフォルトの名無しさん
2010/09/17(金) 20:55:540109デフォルトの名無しさん
2010/09/17(金) 20:58:53実用性無いよ。
0110デフォルトの名無しさん
2010/09/17(金) 21:12:16日本語 MS-DOS だってグラフィックモードで表示してるわけだから、
日本語を使ってる時点でPCGみたいなもんだろ。
ゲーム機のBGみたいなもんじゃん。
0111デフォルトの名無しさん
2010/09/17(金) 21:16:04IOCCC に幾つか有るよな。
でも、ものすごく読みづらくなるだけだから止めたほうがいい。
でも、anderson.c とか結構好きかも。
0112デフォルトの名無しさん
2010/09/17(金) 21:40:57キャラクター文字
キャラクター文字
キャラクター文字
キャラクター文字
0113デフォルトの名無しさん
2010/09/17(金) 21:46:10gtk+とか、OpenGLとか
0114デフォルトの名無しさん
2010/09/17(金) 22:51:530115デフォルトの名無しさん
2010/09/17(金) 23:07:17int aaaaa(int a){
return a;
}
0116デフォルトの名無しさん
2010/09/18(土) 00:10:33VBに限らず漢字が通る処理系は多い。
っていうか、ソースコードをUnicodeで書けるような処理系なら、
大抵は漢字の関数名も受け付けるだろ。
0117デフォルトの名無しさん
2010/09/18(土) 00:16:510118デフォルトの名無しさん
2010/09/18(土) 00:17:26うっ…
やってみたことないけど、もしかしてGCCでも通るのか?w
そんなソースやだー…
0119デフォルトの名無しさん
2010/09/18(土) 00:22:06ちょっと待て。
最後の aishiteru() の呼び出しの前、8000 を足してやらないとまずいんじゃないか?
0120118
2010/09/18(土) 00:26:14ほっ…w
0121デフォルトの名無しさん
2010/09/18(土) 11:12:18#pragma intrinsicっていうプリプロセッサ指令あるじゃないですか?
これって数学の関数の処理を最適化して高速化するもんですよね?
たとえば、sin,cos,atan2を高速化したければ、
#pragma intrinsic(sin,cos,atan2)ってかけばOKなんですか?
0122デフォルトの名無しさん
2010/09/18(土) 11:25:060123デフォルトの名無しさん
2010/09/18(土) 11:26:53ありがとうございます!最高です!
0124デフォルトの名無しさん
2010/09/18(土) 16:26:060125デフォルトの名無しさん
2010/09/18(土) 16:32:570126デフォルトの名無しさん
2010/09/18(土) 17:00:250127デフォルトの名無しさん
2010/09/18(土) 20:31:400128デフォルトの名無しさん
2010/09/18(土) 23:22:15最適化時のデフォで組み込み対象だが
http://msdn.microsoft.com/ja-jp/library/tzkfha43.aspx
0129デフォルトの名無しさん
2010/09/18(土) 23:30:10for(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の{}を取るのは良く見ますけど、これは見ないので…
こういうコード見た時、どう思います?
0130デフォルトの名無しさん
2010/09/18(土) 23:41:530131デフォルトの名無しさん
2010/09/18(土) 23:44:210132デフォルトの名無しさん
2010/09/18(土) 23:46:07ちゃんとインデントされてれば別に何とも。
強いて言えば、修正が要る時、括弧足すのメンドイ。
0133デフォルトの名無しさん
2010/09/18(土) 23:46:10俺は更にforを一行にする。
0134デフォルトの名無しさん
2010/09/18(土) 23:50:04そんなことより、_から始まる変数名の方が気になる。
0135デフォルトの名無しさん
2010/09/18(土) 23:52:240136デフォルトの名無しさん
2010/09/19(日) 00:09:22>>133
一行派もいたとは
0137デフォルトの名無しさん
2010/09/19(日) 00:11:330138デフォルトの名無しさん
2010/09/19(日) 00:13:300139デフォルトの名無しさん
2010/09/19(日) 00:14:35俺はチト違う意見。
{}つけないなら徹頭徹尾とことん付けるな。
ソースに一貫性を。
0140デフォルトの名無しさん
2010/09/19(日) 00:17:530141デフォルトの名無しさん
2010/09/19(日) 00:17:570142デフォルトの名無しさん
2010/09/19(日) 00:18:160143デフォルトの名無しさん
2010/09/19(日) 00:18:310144デフォルトの名無しさん
2010/09/19(日) 00:25:18一行のときはつけないで、複数行のときはつけるって規則でやってるけど。
0145デフォルトの名無しさん
2010/09/19(日) 00:29:04よう害虫
0146デフォルトの名無しさん
2010/09/19(日) 00:32:16それがミスを生む原因なのに
0147デフォルトの名無しさん
2010/09/19(日) 00:38:300148デフォルトの名無しさん
2010/09/19(日) 00:42:390149デフォルトの名無しさん
2010/09/19(日) 00:43:42仕事だとそれを引き継いだバカがミスることまで
考慮せにゃならんのがダルい。
0150デフォルトの名無しさん
2010/09/19(日) 00:49:58そんなこと気にする必要ないよ。
0151デフォルトの名無しさん
2010/09/19(日) 00:51:04厄介なバグはいつもこっちに回ってくるんだ…
0152デフォルトの名無しさん
2010/09/19(日) 00:52:34結局、やらなきゃならないのは「できる人」だからね…w
0153デフォルトの名無しさん
2010/09/19(日) 00:53:15「いや、俺は大丈夫だけどね。これはバカを考慮した書き方。
おれはわかってるよ」
みたいな言い方するやつって、自信ないのかね。
0154デフォルトの名無しさん
2010/09/19(日) 00:55:010155デフォルトの名無しさん
2010/09/19(日) 00:55:580156デフォルトの名無しさん
2010/09/19(日) 00:56:28付けるのを習慣化しておいた方がお得
0157デフォルトの名無しさん
2010/09/19(日) 00:58:19{}はずして一行なのに改行してインデントすると、
ループ内容に追加が必要なときに{}付け忘れるアホがいるから
0158デフォルトの名無しさん
2010/09/19(日) 00:59:510159デフォルトの名無しさん
2010/09/19(日) 01:02:33K&Rは式一行の時に{}なしで改行する書き方多用してたしなあ
0160デフォルトの名無しさん
2010/09/19(日) 01:05:49実際にバカにブチ当たって痛い目を見た。
チームでやる時は一番レベル低い奴に合わせざるを得ない。
ついでに愚痴。
C言語メインで使う職場なのに大半が規格見たこと無いとか何なの。
それで移植性がどーのとかマジ笑わせてくれる。
0161デフォルトの名無しさん
2010/09/19(日) 01:07:19書籍だからな。行の節約だよ。
if (exp){
}
このスタイルも同様。
別に紙に書いてるわけでもないのにこの書式をありがたがってる奴はアホ。
0162デフォルトの名無しさん
2010/09/19(日) 01:08:52#define end ;}
これを最初に書いとけば全て解決だろ。
0163デフォルトの名無しさん
2010/09/19(日) 01:11:05CHAR_BIT を無視してる、どころか知りもしないというオチ。
0164デフォルトの名無しさん
2010/09/19(日) 01:17:30K&Rは一行じゃなくても省略してるだろ。
0165デフォルトの名無しさん
2010/09/19(日) 01:20:05インデントもおぼつかない現場ってのもあるしな。
でも、インデントもできてない所だとそもそも{}をつけるか
付けないかなんてどうでもいいくらい細かいことだな。
つけてもぜんぜん安全にならない。
0166デフォルトの名無しさん
2010/09/19(日) 01:21:58for(i=0;i<10;++i){}
printf("%d\n",i);
0167デフォルトの名無しさん
2010/09/19(日) 01:24:53それやると、ちょっとネストが深くなるだけでコードが縦横に無駄に伸びる
0168デフォルトの名無しさん
2010/09/19(日) 01:29:29お前みたいのが一番痛い
0169デフォルトの名無しさん
2010/09/19(日) 13:28:27if(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;
}
のように。 これらはあくまで個人的な意見。
個人的には「どう書けば自分が読みやすいか?」だけを指標にしている。
あまり一般的に言われてる「こう書くのが通だ」みたいな記法には、あまり従い過ぎないようにしてる。個人的に。たとえば{}の省略など。
0170デフォルトの名無しさん
2010/09/19(日) 13:33:25どっちがいいかなんて一目瞭然。
0171デフォルトの名無しさん
2010/09/19(日) 13:34:09いえます
0172デフォルトの名無しさん
2010/09/19(日) 13:39:27コードが間延びして読みにくくなるじゃん。
0173デフォルトの名無しさん
2010/09/19(日) 13:39:360174デフォルトの名無しさん
2010/09/19(日) 13:40:59お前の価値観ってしょぼいなw
語る、意見する資格ないよ。その内、墓穴を掘るから黙ってな。
0175デフォルトの名無しさん
2010/09/19(日) 13:41:00変な工夫しないでとりあえず普通に書けといいたい。
0177デフォルトの名無しさん
2010/09/19(日) 13:42:30インデントをしてればミスなんてしないだろ。
コーディングスタイルの話になると、安全側に倒すのが正義みたいに
過剰なスタイルを勧めるやつが多いな。
0178デフォルトの名無しさん
2010/09/19(日) 13:42:56たんなる飾りじゃない。意味を持つので付ける
付けないの趣味レベルの問題じゃなく、一定のルールに
基づいたものでなければならない。
0179デフォルトの名無しさん
2010/09/19(日) 13:45:26実践的にコードを書いてる人のスタイルを参考にしたほうがいい。
ろくなコードも書いたことがないやつが机上の空論でこうしたら
安全とか読みやすいとか考えてるから
> if(i>0){putchar(i);}
みたいな、変な書き方思いつくんだろ。
コードで個性なんか主張しなくていいよ。
0180デフォルトの名無しさん
2010/09/19(日) 13:45:47変な根性を現代の水準で語る時代遅れのバカってw
可搬性や効率化を考えたら、例え1行だろうと
あれこれ変更しないで、一貫して自分が思うなら
そのスタイルを押し通せば良いだけ。他人に意見をするというのは
自分の都合や主観が通用しないことばかり。
あんた、他人とコードのやり取りをしたことある?
その際、流れに問題がないのに本題からズレた、ここが見づらいだの
逐一そんなことでケチをつけるのかね?w
大人気ない、精神レベルが低いまま年を取った爺の典型的な悪い体質だなw
お前、大物には成れずにこの世を去るよ?どうせ誰もがいつかは死ぬ。
お前がこんな場所でネット弁慶をやっていたことを知る人は、どれだけ
いるんでしょうね・・・匿名で、2ちゃんで多数書き込んでいても有名にはなれませんよ?
お前という存在はちっぽけで歴史に名の残らない雑魚だから、せいぜいここで
自分未満の人間を見つけては偉そうにしてなさいw
0181デフォルトの名無しさん
2010/09/19(日) 13:46:02puts("fuck!");
↓
for(int i=0; i<10; i++)
for(int j=0; j<10; j++)
puts("fuck!");
こういうことするじゃんおまいら
0182デフォルトの名無しさん
2010/09/19(日) 13:46:02この話題に関してはインデントしてあっても防げないんじゃね?というかインデント関係なくね?
0183デフォルトの名無しさん
2010/09/19(日) 13:46:40a[i]^=(d[i]+c[i])%16;
このプログラムをSSE2で書きたいのですがわかりません。
教えてください。よろしくお願いします。
C言語からインラインアセンブラで呼び出したいと思うのですが、
うまくいきません。
moveq d,%xmm0
moveq c,%xmm1
paddb %xmm1,%xmm0
moveq a,%xmm1
pxor %xmm1,%xmm0
配列のデータをレジスタにセットするところもわかりません。
0184デフォルトの名無しさん
2010/09/19(日) 13:46:43putchar(i);
この書き方だとputchar(i);の下にインデントして追加したものも
ifの分岐で実行すると勘違いするヤツがいる、っていうかいた。
0185デフォルトの名無しさん
2010/09/19(日) 13:48:06おれは一行のときだけ{}を省略で、複数行のときは
省略しないってルールでやってる。
0186デフォルトの名無しさん
2010/09/19(日) 13:48:220187デフォルトの名無しさん
2010/09/19(日) 13:50:11そのやり方だと行を追加したときにミスが発生しやすいって話だろが
if(true)
putchar(10);
putchar(11);
0188デフォルトの名無しさん
2010/09/19(日) 13:51:00問題が分かりやすいからド素人がキャーギャー騒いでいるだけ。
0189デフォルトの名無しさん
2010/09/19(日) 13:51:34いや、{}の付け忘れなんてインデントしてればしないんじゃね?
インデントもおぼつかない現場があるのが知ってるけど、そういう
ところは{}をどうこう以前に、ほかにやることあるだろって感じだよね。
0190デフォルトの名無しさん
2010/09/19(日) 13:52:33長年自分が決め込んだスタイルが絶対正しいと思い込む
時代遅れの爺が必死だぜw
お前らもう二度と人間社会で活躍する時代は来ないなw
後は余生を静かに2ちゃんでネット弁慶して過ごせよ
人類の歴史に名の残らない雑魚ちゃんたちw
0191デフォルトの名無しさん
2010/09/19(日) 13:53:58いや、コード書いてるやつならわかるだろうけど、
そんなミスしないだろ。
こういう話になると、プロは10年に一度のミスにも備えて
コーディングするとか、安全側に倒すのが正義みたいな話に
なるんだろうけど。
0192デフォルトの名無しさん
2010/09/19(日) 13:55:03そうだな。
もしミスっても、こんなんでハマったりもしないしな。
0193デフォルトの名無しさん
2010/09/19(日) 13:55:47コーディングルールに従う側は、(腹でどう思おうが)従うだけだが、説得力が欲しいぜ
プライベートでコード書く時はお好きにどうぞ
これだけのことでしょ
0194デフォルトの名無しさん
2010/09/19(日) 13:56:51どうも>>173への解釈が俺とお前で違ったらしい
{}無しif文で{}付けずに文を追加して、動作がおかしくなって聞きに来た人のことかと思った
0195デフォルトの名無しさん
2010/09/19(日) 14:00:50>過剰なスタイルを勧めるやつが多いな。
>コーディングするとか、安全側に倒すのが正義みたいな話に
>なるんだろうけど。
やだ・・・何言ってるかわからない・・・
0196デフォルトの名無しさん
2010/09/19(日) 14:00:570197デフォルトの名無しさん
2010/09/19(日) 14:02:20酷い危険に晒されるという例は歴史上枚挙に暇が無いってこ
と知ってる?
0198デフォルトの名無しさん
2010/09/19(日) 14:03:07改行コードを入れなくても自動的に、エディタの横幅に応じて
改行表示してくれるものを使えば良い。
使える手段を知らない、選ばない時代遅れの連中の意見は
実に現代では通用しないことかw
もう少し、世の中を幅広く見ましょうね?お前が知っている
あるいは視野の狭い考えでは通用しないどころか
変な手間や負担を被りますよ?
0199デフォルトの名無しさん
2010/09/19(日) 14:03:17も
if (expr)
{
func();
}
も両方使うけどな。
要は処理の流れの問題じゃないか?
ちょっとした例外処理を1行で済むのに4行もかけて、
メイン処理始まるまでにダラダラと長くなるのは嫌いだ。
0200デフォルトの名無しさん
2010/09/19(日) 14:03:38具体例を聞こうか
0201デフォルトの名無しさん
2010/09/19(日) 14:04:40あるか?????
しかも、多々だと???
if(i > 0)
putchar(i);
↑これが↓こうなる時、
if(true)
putchar(10);
putchar(11);
↓これを、目をつぶってでもぶち込んでるのか?
putchar(11);
前後の文脈一切気にしないのか?
そんな一か八かの書き方してるようじゃ、
今後どうにもならないぞ。基礎の基礎。
0202デフォルトの名無しさん
2010/09/19(日) 14:05:27なんか言ってる事がおかしくね?どういうこと?
0203デフォルトの名無しさん
2010/09/19(日) 14:05:3320年くらいまえにpascalのbegin endをどの位置に置くかってのを
議論した文章を読んだら、インデントで制御構造が認識できるから
いっそ、begin endなくせばよくね?
って意見があって、だいぶたってpythonを見たとき、ほんとうに
やりやがったって思った。
0204デフォルトの名無しさん
2010/09/19(日) 14:05:47歴史は知らないが、商品開発では
選択肢があったら安全側に倒すのが超基本。
0205デフォルトの名無しさん
2010/09/19(日) 14:05:58まてお前上で書いてんのか?それにびっくりだ
0206デフォルトの名無しさん
2010/09/19(日) 14:08:57だってそういうミスする人いるんだからしょうがないじゃん。
0207デフォルトの名無しさん
2010/09/19(日) 14:09:14ネームスペースのインデントがあって、クラスのインデントがあって
メソッドのインデントがあってって、いきなりインデント深くなってるしな。
0208デフォルトの名無しさん
2010/09/19(日) 14:10:39書いてない。>>184 >>187のやりとりに横槍。
なんだかしらんがいくらなんでもそりゃねえべ、という話。
0209デフォルトの名無しさん
2010/09/19(日) 14:11:53100桁ぐらいはないと読みにくくなりすぎる。
0210デフォルトの名無しさん
2010/09/19(日) 14:14:12if (i .> 0) ;
{
putcjar(i);
}
0211デフォルトの名無しさん
2010/09/19(日) 14:14:14比較的単純な装置/機械では、安全側に収束するような設定に
統一するのが基本だが、ある程度大規模/複雑になった場合必ずしも
そうとは言いきれない。この分岐点の見極めは超難しい。
システムアナリストクラスの役職者の判断事項。
むやみに大規模化/複雑化しないことを心掛けることのほうが
ずっと効果的
0212デフォルトの名無しさん
2010/09/19(日) 14:17:31この程度のコードを
if (expr)
{
func();
func2();
・・・
}
と変更したくなるってのは、そもそもifの中身を別関数に分けなきゃいけない兆候
0213デフォルトの名無しさん
2010/09/19(日) 14:21:370214デフォルトの名無しさん
2010/09/19(日) 14:21:45決まりがあるなら従えばいいだけじゃん
ただ使いやすいフォーマッタとかは用意してほしいと思うな
0215デフォルトの名無しさん
2010/09/19(日) 14:22:22それはモジュール設計の話で、構文や書式とは別問題。
0216デフォルトの名無しさん
2010/09/19(日) 14:23:580217デフォルトの名無しさん
2010/09/19(日) 14:26:32やはりPythonはすばらしいな
0218デフォルトの名無しさん
2010/09/19(日) 14:27:42メイン処理は1行でも{}に分けて書く
主要でない処理は1行なら省略構文を使う
要は{}によって処理の流れを分かりにくくしてないか、という問題
0219デフォルトの名無しさん
2010/09/19(日) 14:30:450220デフォルトの名無しさん
2010/09/19(日) 14:33:370221デフォルトの名無しさん
2010/09/19(日) 14:36:180222デフォルトの名無しさん
2010/09/19(日) 14:38:09起こらない問題(たまたまおこっても一瞬で解決する問題)についてあーだこーだ言ってもしょうがない
0223デフォルトの名無しさん
2010/09/19(日) 14:39:51Cより前のFORTRANとかの時代の話
Cではそれは激減した。代わりに、識別子乱造に
よる取り違い事故が激増した
FORTRAN時代は一つの変数を複数の用途に
使い分けるのが常識な時代(メモリが兎に角少なく高価だった)
それが原因でスパゲッティプログラミングが避けられなかった
0224デフォルトの名無しさん
2010/09/19(日) 14:40:16すぐ解決できるから対策無しでいいですよね^^
0225デフォルトの名無しさん
2010/09/19(日) 14:40:22ソース一貫性厨が一番の害悪。
↑一貫性の無い自分が一番の害虫だと気づかないアホ
0226デフォルトの名無しさん
2010/09/19(日) 14:41:10省略構文禁止が何かの対策になってると思ってるのがすごく残念
0227デフォルトの名無しさん
2010/09/19(日) 14:42:130228デフォルトの名無しさん
2010/09/19(日) 14:44:27同意。今から家建てます。さあ大変です。
「休憩時間に食べるポテチの袋を開けるとき、
ハサミを使ったほうが安全だよ!
手で開けたら開けにくいときあるし!」
棟梁「…そっすね('A`)」
0229デフォルトの名無しさん
2010/09/19(日) 14:45:30お前らのところはそういうの無いの?
0230デフォルトの名無しさん
2010/09/19(日) 14:46:36特殊なマクロ使ってる時ぐらいしか問題にならないなあ。
0231デフォルトの名無しさん
2010/09/19(日) 14:51:34コードの見た目をある程度統一するための規約や
本当にややこしいことになる問題についての制限(グローバル変数とか体重継承やヘッダでのusingとか)はある。
過度な命名規則とか、省略構文がどうのこうのとかは、古臭い
0232デフォルトの名無しさん
2010/09/19(日) 14:51:40であれば、どう考えても付けたほうが合理的。
省略派は、たった2文字のために他人の眼力に頼るというただの甘ちゃんである。
そしていざ問題が起きたとき、「見抜けなかったお前が悪い(オレは悪くない)」と言い張る。
もっとも迷惑なタイプ。
0233デフォルトの名無しさん
2010/09/19(日) 14:52:55この業界もう十年おりますし、コードも二十万行くらい書きますたが、
一度たりともその問題とやらに出会ったことはありません。
一度たりともです。
0234デフォルトの名無しさん
2010/09/19(日) 14:53:370235デフォルトの名無しさん
2010/09/19(日) 14:55:13{}で防げるようなものってお目にかからない。
0236デフォルトの名無しさん
2010/09/19(日) 14:55:40そんなに悔しかったのかw
0237デフォルトの名無しさん
2010/09/19(日) 14:58:20ま。勝利と栄光に満ちたC黎明期の頃からの伝統が{}という
ことで...
0238デフォルトの名無しさん
2010/09/19(日) 15:00:107年仕事でC書いてるけど、2回ほどあった。
世の中いろんな人が居るんだよ・・・
0239デフォルトの名無しさん
2010/09/19(日) 15:01:33規約でガチガチに固めても良いと思うけどな。
数人だったら、教育係つけてコードレビューでもした方が良い。
0240デフォルトの名無しさん
2010/09/19(日) 15:01:330241デフォルトの名無しさん
2010/09/19(日) 15:03:140242デフォルトの名無しさん
2010/09/19(日) 15:04:23まだ3年ほどしか仕事してないけど既に2度ほど見た
0243デフォルトの名無しさん
2010/09/19(日) 15:04:230244デフォルトの名無しさん
2010/09/19(日) 15:04:30最低限そこをクリアしてないと話しにならない。
0246デフォルトの名無しさん
2010/09/19(日) 15:07:370247デフォルトの名無しさん
2010/09/19(日) 15:08:020248デフォルトの名無しさん
2010/09/19(日) 15:09:04定数を左におくのも、じっさいコードを書いてれば分かるけど
=と==の間違いなんてしないのに、万が一したらどうするんだって
言い張るよな。
そんなめったにしないミスのために変なコード書くことはないよ。
0249デフォルトの名無しさん
2010/09/19(日) 15:10:160250デフォルトの名無しさん
2010/09/19(日) 15:10:56自分は使いこなせる→他人も使いこなせて当然
まあプログラマには多いんだわこのタイプw
0251デフォルトの名無しさん
2010/09/19(日) 15:12:51根本的に問題を抱えている。
注意力が足りなさ過ぎるか、
構文の理解が欠けているかだ。
ネジがボロボロあまった自動車で走り出すようなもの。
0252デフォルトの名無しさん
2010/09/19(日) 15:14:01それは違う。こっちの方が遥かに多い。
自分は間違えない→他人は間違えるから対策してやろう ⇒実際は自分も間違える
自分は使いこなせる→他人は使いこなせないから対策してやろう ⇒実際は自分も使いこなせない
0253デフォルトの名無しさん
2010/09/19(日) 15:14:360254デフォルトの名無しさん
2010/09/19(日) 15:15:31最近のコンパイラはまず警告出すから特にメリットない
0255デフォルトの名無しさん
2010/09/19(日) 15:15:550256デフォルトの名無しさん
2010/09/19(日) 15:16:57それは結局対策されてる訳で
特に問題が起きないから別にいいのでは。
0257デフォルトの名無しさん
2010/09/19(日) 15:18:53別に良し悪しを言ってるわけじゃないから。そういうタイプが多いというだけ。
0258デフォルトの名無しさん
2010/09/19(日) 15:19:040259デフォルトの名無しさん
2010/09/19(日) 15:19:40「運転手がシートベルトを閉める場合は、右ハンドル車で
は必ず右手で持っていって嵌め込むこと。体が自然に左に
ねじれてアクセルペダルよりもブレーキペダルのほうが
踏みやすくなるから。逆に左手で閉めると右にねじれて
アクセルのほうが踏みやすくなる」
0260デフォルトの名無しさん
2010/09/19(日) 15:22:44だからどうしたんだよ。
そんなレベルの奴が現場にいるなんていくらでもあるわ。
0261デフォルトの名無しさん
2010/09/19(日) 15:26:12教育や規約で想定レベルを保たないと
0262デフォルトの名無しさん
2010/09/19(日) 15:26:42為につけられたもの
そのココロを忘れないことが大事で効果を妄信して
機械的公式的無造作に使っても効果が無いどころか
逆効果の場合もあったりして....
0263デフォルトの名無しさん
2010/09/19(日) 15:27:19if ( ... );
{
...;
}
ってコードで先生if文が動きません!、って最近言われた
0264デフォルトの名無しさん
2010/09/19(日) 15:32:090265デフォルトの名無しさん
2010/09/19(日) 15:33:350266デフォルトの名無しさん
2010/09/19(日) 15:34:20例えば?
0267デフォルトの名無しさん
2010/09/19(日) 15:36:51VisualStudio2005でGUIを作りたいと思っています。
0268デフォルトの名無しさん
2010/09/19(日) 15:38:21C++できた方がいい
0269デフォルトの名無しさん
2010/09/19(日) 15:41:010270デフォルトの名無しさん
2010/09/19(日) 15:42:08まあでもケアレスミスにしたって{}付け忘れとかないでしょ。
0271デフォルトの名無しさん
2010/09/19(日) 15:42:25C++でやろうと思っています
0272デフォルトの名無しさん
2010/09/19(日) 15:51:290273デフォルトの名無しさん
2010/09/19(日) 15:52:05実際見た事あるから困る
0274デフォルトの名無しさん
2010/09/19(日) 16:01:50ならないと追い出されて戻ってきました。
0275デフォルトの名無しさん
2010/09/19(日) 16:07:18だまされるな。
Cは知らなくてもOK。
0276デフォルトの名無しさん
2010/09/19(日) 16:08:19お話にならないヤツはお話しなければいいだけ。そんなヤツ捨て置け。
0277デフォルトの名無しさん
2010/09/19(日) 16:09:160278デフォルトの名無しさん
2010/09/19(日) 16:18:08演算子も共通して使えるし。
0279デフォルトの名無しさん
2010/09/19(日) 16:19:56C++ に限っては C との相違を知らないと意味わかんねーの沢山あるからな
もっと言えば歴代 C++ の相違まで知っていたほうがいい
0280デフォルトの名無しさん
2010/09/19(日) 16:20:35まったく知らないというのではダメだろうが
現在なら教育環境や高性能IDEも充実してきているので
Cを知り尽くさないとダメということも
ないしCはそれなりに奥が深く、知り尽くそうなんて
考えると一生GUIは無理(Cでは残念ながらGUI構築は
アクロバティックなことを避けられない)
0281デフォルトの名無しさん
2010/09/19(日) 16:28:33> アクロバティックなことを避けられない
C++ でも vtbl を自作したり reinterpret_cast みたいな極悪プレーが出てくるけど
そのへん C では素直だねー
0282デフォルトの名無しさん
2010/09/19(日) 16:30:26そんなこと全く聞く必要ない。
C++はC++だけ、C#はC#だけで、言語としては完全に独立して学べる。
他言語との対比で理解が深まることもあるだろうが、それがCである必要はない。
0283デフォルトの名無しさん
2010/09/19(日) 16:44:19そういう時違いが分かってると楽だというのはある
0284デフォルトの名無しさん
2010/09/19(日) 16:44:41出て来るからちょっと事情が違うかも。
0285デフォルトの名無しさん
2010/09/19(日) 16:47:270286デフォルトの名無しさん
2010/09/19(日) 16:49:58そういう時違いが分かってると楽だというのはある
APLを「やらされる」ことはあるかもしれないから
そういう時違いが分かってると楽だというのはある
COBOLを「やらされる」ことはあるかもしれないから
そういう時違いが分かってると楽だというのはある
Goを「やらされる」ことはあるかもしれないから
そういう時違いが分かってると楽だというのはある
0287デフォルトの名無しさん
2010/09/19(日) 16:50:33_人人人人人人人人人人人人人人人_
> わりとどうでもいい <
 ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^^Y^ ̄
ヘ(^o^)ヘ
|∧
/
0288デフォルトの名無しさん
2010/09/19(日) 17:12:36>Cでは残念ながらGUI構築は
>アクロバティックなことを避けられない
それはおまえが無能なだけだろ。
自分に設計能力が無いのを言語のせいにするな。
0289デフォルトの名無しさん
2010/09/19(日) 17:17:06C:インターフェース、仕様変更は設計時のみ可能。
いったん開発に入ったら仕様変更は不能に近い、
運用中の仕様変更は論外(版を重ねるごとに悪くなって崩壊)
C++,C#:設計時、開発作業中のインターフェース、仕様変更もある程度可能
運用投入後はマイナーチェンジリビルド以外はタブー
Webアプリ:運用中に常時変更可能
こういった程度の違いはあるだろう
0290169
2010/09/19(日) 17:20:38zzzzzzzzzz = 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);
などの場合は、どうやって改行しますか? ()の位置、インデントの仕方、演算子の位置、もろもろ、正しい(もしくは一般的な)方法はどんなですか?
後学のために、プロフェッショナルなみなさんの方法を、ぜひ聞きたいです。
0291デフォルトの名無しさん
2010/09/19(日) 17:26:270292デフォルトの名無しさん
2010/09/19(日) 17:28:16使いまわしはしない。
0293デフォルトの名無しさん
2010/09/19(日) 17:30:16>改行をして書き換えると思います。
そんなデータ構造は100%設計がおかしい
したがってそんなケースはありえない
0294デフォルトの名無しさん
2010/09/19(日) 17:30:550295デフォルトの名無しさん
2010/09/19(日) 18:19:080296デフォルトの名無しさん
2010/09/19(日) 18:19:510297デフォルトの名無しさん
2010/09/19(日) 18:44:15折り返しというものは、各環境でビューワーが行なうべきものであって、折り返しを改行でコントロールしようなどと考えるのは完全に誤りである。
折り返しと改行はまったく別のものである。それを区別することもできない厨は小学校からやり直してくるべきである。
0298デフォルトの名無しさん
2010/09/19(日) 18:46:210299デフォルトの名無しさん
2010/09/19(日) 18:50:37言語仕様外でプログラマーが気を使わなければいけないのなら、それは欠陥言語だ。
0300デフォルトの名無しさん
2010/09/19(日) 18:55:17ントの先頭には大抵
書いてあるよな。
このテキストをメモ
帳で見る場合には、
メニューから折り返
し設定を……、
云々って。
中途半端に桁数を決
められてると、それ
を僅かに下回った環
境で読むときの乱れ
が半端ないもんな。
0301デフォルトの名無しさん
2010/09/19(日) 19:03:020302デフォルトの名無しさん
2010/09/19(日) 19:09:040303デフォルトの名無しさん
2010/09/19(日) 19:09:40改行は「意味の終わり」に付けるものであって、レイアウトが目的ではない。
0304デフォルトの名無しさん
2010/09/19(日) 19:12:360305デフォルトの名無しさん
2010/09/19(日) 19:13:100306デフォルトの名無しさん
2010/09/19(日) 19:22:03# で始まる行以外は全部一行にしてしまえ
0307デフォルトの名無しさん
2010/09/19(日) 19:24:240308デフォルトの名無しさん
2010/09/19(日) 19:24:28つ//コメント
0310デフォルトの名無しさん
2010/09/19(日) 21:28:39a%16=a&0xf
にしたいのですがどうすればいいですか?
同じ演算結果を得るためにバイトデータの下位4ビットを抽出したいです。
よろしくお願いします。
0311デフォルトの名無しさん
2010/09/19(日) 21:30:520312デフォルトの名無しさん
2010/09/19(日) 21:33:17for(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]);
}
0313デフォルトの名無しさん
2010/09/19(日) 21:37:530314デフォルトの名無しさん
2010/09/19(日) 21:38:430315デフォルトの名無しさん
2010/09/19(日) 21:39:48printf("%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]);
}
これを見てみたいな。
0316デフォルトの名無しさん
2010/09/19(日) 21:42:070317デフォルトの名無しさん
2010/09/19(日) 21:52:28d=aをしたら一致しました。
軽く質問されたのであわてて動作確認をしたら違っていたので
今までのビットマスクの知識が間違っていたのかと思いました。
0318デフォルトの名無しさん
2010/09/19(日) 22:01:030319デフォルトの名無しさん
2010/09/19(日) 23:39:28http://codepad.org/UHWwncjm
当方linuxなのでgcc4.5のコードなので、たぶんインラインアセンブラの順序がうぃんどうずとは逆だとおもいますが、
よくわからないですけど、%16 ってのは 16で割った余りってことなのでしょうけど、sseには整数除算の余りの命令が無いっぽい??ので固定小数で代用しちゃったけど
これ、ちゃんと動いてるか不安です(笑)。はてさて?
まちがってたらごめんんなさい。 あと、インデントはすごく個人的な方言で書いてしまいました。よみずらくてすみません。(ぺこり)
0320319 コメントです(まちがってたらごめんなさい)
2010/09/19(日) 23:47:16配列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);
0321デフォルトの名無しさん
2010/09/19(日) 23:58:47-O3 -ftree-vectorize -ftree-vectorizer-verbose=5 -mmmx -msse2
ありがとうございます。やってみます。
因みに自動生成されたアセンブラは-O3だけのときより大きくて10倍
位遅いです。やはり手動で書くしかないのでしょうか。
0322デフォルトの名無しさん
2010/09/20(月) 00:18:540323デフォルトの名無しさん
2010/09/20(月) 00:21:550324デフォルトの名無しさん
2010/09/20(月) 00:24:110325デフォルトの名無しさん
2010/09/20(月) 00:28:220326デフォルトの名無しさん
2010/09/20(月) 00:48:30Cで書くかアセンブラで書くかスレの誤爆か?
0327デフォルトの名無しさん
2010/09/20(月) 01:22:20いや、ループ展開するとかやめてくれって感じ。
せっかく冗長のない綺麗なソースコード書いても、実際の生成されたコードで汚くされたらたまらんよ。
0328デフォルトの名無しさん
2010/09/20(月) 01:33:240329デフォルトの名無しさん
2010/09/20(月) 01:33:310330デフォルトの名無しさん
2010/09/20(月) 01:35:42http://art4.photozou.jp/pub/483/184483/photo/17562551.jpg
0331デフォルトの名無しさん
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
}
0332デフォルトの名無しさん
2010/09/20(月) 01:56:360333デフォルトの名無しさん
2010/09/20(月) 02:19:39fgb=FG[b[j]];
とかで、
一度、変数に入れればいいんではないかいな?
0334デフォルトの名無しさん
2010/09/20(月) 02:31:18アドレス操作が複雑すぎるんでしょうか。
配列を参照してますし・・・
0335デフォルトの名無しさん
2010/09/20(月) 02:39:390336デフォルトの名無しさん
2010/09/20(月) 02:42:48GPGに勝ちたい!
0337デフォルトの名無しさん
2010/09/20(月) 02:53:03ここで訊いているようなレベルじゃ無理無理
0338デフォルトの名無しさん
2010/09/20(月) 02:53:4216回のループをのべたんで書いてみるとか
コンパイラ君の最適化に期待できるようなコードじゃないような気がする
0339デフォルトの名無しさん
2010/09/20(月) 02:59:22内側のループだけでもベクトル化したいです。
内側をアンロールして、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;
}
です。
0340デフォルトの名無しさん
2010/09/20(月) 03:05:10GCCに最適化させるオプションを教えてください。
0341デフォルトの名無しさん
2010/09/20(月) 03:10:290342デフォルトの名無しさん
2010/09/20(月) 03:16:12汗のソース吐かせて、地道に処理が早くなるように手動で最適化する方が早道のような気がするけど
0343デフォルトの名無しさん
2010/09/20(月) 05:18:42h2[i][j];
の2次元配列のiとjを入れ替えてみるのも手かも
0344デフォルトの名無しさん
2010/09/20(月) 09:02:22h1[i][j];
h1[j][i];
i[j][h1];
i[h1][j];
j[h1][i];
全部一緒
0345デフォルトの名無しさん
2010/09/20(月) 09:16:05隣接するとこ舐めてくほうがキャッシュに乗りやすい
いやうpられたソースは見てないから、今回の件で言えるのかはわからないが
0346デフォルトの名無しさん
2010/09/20(月) 09:22:080347デフォルトの名無しさん
2010/09/20(月) 09:28:58http://codepad.org/1G8KolcO について一言
0348デフォルトの名無しさん
2010/09/20(月) 09:47:17キャッシュメモリはキャッシュラインサイズ単位で管理されている。
キャッシュラインサイズはCPUによって違うけど、だいたい16byteぐらい。
同時に使用するメモリは同じキャッシュラインに載っていた方が、
メモリアクセスが少量で済む。
つまり・・・
struct{
int d1;
int d2;
int h1;
int h2;
....
}data[...];
・・・とかして、同時に使用する変数が隣接するメモリアドレスに
配置されるようにしたほうが、キャッシュの使用効率は良くなる。
後は適当に_mm_prefetchを使う。
0349デフォルトの名無しさん
2010/09/20(月) 09:51:180350デフォルトの名無しさん
2010/09/20(月) 10:09:5416バイトしかないなんて・・・
プリフェッチして遅延を減らすという話は聞いたことがあります。
0351デフォルトの名無しさん
2010/09/20(月) 10:32:32キャッシュラインサイズはCPUによって違うって言ったろ。
でかいやつだと256byteとかもある。
0352デフォルトの名無しさん
2010/09/20(月) 10:34:39キャッシュサイズとラインサイズは違う
0353デフォルトの名無しさん
2010/09/20(月) 10:35:070354デフォルトの名無しさん
2010/09/20(月) 10:40:530355デフォルトの名無しさん
2010/09/20(月) 11:26:47Aという関数を持つファイルA.cと
Bという関数を持つファイルB.cがあって
両方に共通するZという関数を追加したい場合
どうしたらいいんでしょう。
0356デフォルトの名無しさん
2010/09/20(月) 11:31:19A.cとB.cにZ.hをインクルードする
0357デフォルトの名無しさん
2010/09/20(月) 11:36:40Bに従属する関数ならB.cとB.hに追加すれば良いし
独立した機能を持つ関数ならZ.cとZ.hを作れば良い
0358デフォルトの名無しさん
2010/09/20(月) 11:36:52Z.c で作った関数を A.c や B.c でいきなり使う
警告出るが無視すると動く
奇麗事を始める前に、まずこの事実から
0359デフォルトの名無しさん
2010/09/20(月) 11:39:11なるほど。
ありがとうございました。(^-^)
0360デフォルトの名無しさん
2010/09/20(月) 11:51:21O3 -ftree-vectorize -ftree-vectorizer-verbose=5 -mmmx -msse2
0361デフォルトの名無しさん
2010/09/20(月) 17:53:25int b=0;
0362デフォルトの名無しさん
2010/09/20(月) 19:24:550363デフォルトの名無しさん
2010/09/20(月) 19:32:410364デフォルトの名無しさん
2010/09/20(月) 19:34:44printfもC99から%lf対応したもんね。
どうもありがとう。
0365デフォルトの名無しさん
2010/09/20(月) 20:24:36typedef 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={'あっふん','あかんて'};
0366デフォルトの名無しさん
2010/09/20(月) 20:26:000367デフォルトの名無しさん
2010/09/20(月) 20:27:110368デフォルトの名無しさん
2010/09/20(月) 20:27:29共用体の初期化は最初のメンバで行う
long long に文字列を代入する事は出来ないよ
0369デフォルトの名無しさん
2010/09/20(月) 20:30:460370デフォルトの名無しさん
2010/09/20(月) 20:31:23定義の時に値を与えるのが初期化
それ以外で値を与えるのが代入
この問題では特に区別しなくても構わない。
0371デフォルトの名無しさん
2010/09/20(月) 20:31:44何を聞かれているのかすらわかっていないようだ
>>368
多文字リテラルだからおk
0372デフォルトの名無しさん
2010/09/20(月) 20:32:29これならいいですか?
0373デフォルトの名無しさん
2010/09/20(月) 20:36:08出来んのは初期化の時だけ
union uni c1 = {'あっふん','あかんて'}, c2, u;
0374デフォルトの名無しさん
2010/09/20(月) 20:38:200375デフォルトの名無しさん
2010/09/20(月) 20:42:35unsigned long long int dd[2] = 128bit?
0376デフォルトの名無しさん
2010/09/20(月) 20:53:150377デフォルトの名無しさん
2010/09/20(月) 21:01:030378デフォルトの名無しさん
2010/09/20(月) 21:25:000379デフォルトの名無しさん
2010/09/20(月) 21:39:580380デフォルトの名無しさん
2010/09/20(月) 21:49:29UNIVAC の BCD みたいなこと?
0381デフォルトの名無しさん
2010/09/20(月) 21:52:100382デフォルトの名無しさん
2010/09/20(月) 22:00:03みたいなことじゃね?
0383デフォルトの名無しさん
2010/09/20(月) 22:05:38素直に言語変えたほうが・・・・
perlとかrubyとか。
0384デフォルトの名無しさん
2010/09/20(月) 22:11:290385デフォルトの名無しさん
2010/09/20(月) 22:35:010386デフォルトの名無しさん
2010/09/20(月) 22:44:390387デフォルトの名無しさん
2010/09/20(月) 22:47:320388デフォルトの名無しさん
2010/09/20(月) 22:49:21ptrdiff_tでいいよ。
0389デフォルトの名無しさん
2010/09/20(月) 22:50:220390デフォルトの名無しさん
2010/09/20(月) 22:54:240391デフォルトの名無しさん
2010/09/21(火) 01:03:150392デフォルトの名無しさん
2010/09/21(火) 01:05:530393デフォルトの名無しさん
2010/09/21(火) 01:05:550394デフォルトの名無しさん
2010/09/21(火) 01:06:410395デフォルトの名無しさん
2010/09/21(火) 01:21:500396デフォルトの名無しさん
2010/09/21(火) 01:23:490397デフォルトの名無しさん
2010/09/21(火) 01:25:02oh
miss spell
print fuck
0398デフォルトの名無しさん
2010/09/21(火) 06:14:04http://codepad.org/uC4bOJAI
0399デフォルトの名無しさん
2010/09/21(火) 06:22:40次に進んでくれ。
0400デフォルトの名無しさん
2010/09/21(火) 06:28:490401デフォルトの名無しさん
2010/09/21(火) 06:38:41#include<stdio.h>
#include<stdlib.h>
int main(void){
int *x;
x=calloc(1,sizeof(int));
if(x==NULL)
puts("記憶域の確保に失敗しました");
else{
*x=57;
printf("*x=%d\n",*x);
free(x);
}
return 0;
}
ってあったんだが、voidからint *に変換出来ません、とかって変なエラー弾き出すから
(int *)calloc(1,sizeof(int));って風にキャストしてみたら通ったんだが
どっかの本でキャストは危なっかしいから出来れば避けろ、って聞いたからこのまま行っていいのか分からない
そもそも教本だとキャストしなくても出来るっぽいし、何故エラーが出たのか分からない、一体どういう事なんだ・・・
0402デフォルトの名無しさん
2010/09/21(火) 06:45:38正しい方法を教えてください。
よろしくお願いします。
unsigned long long int a;
a=0xffffffffffffffff;
0403デフォルトの名無しさん
2010/09/21(火) 06:58:40コンパイラによるのかな
キャストは危なっかしいのかもしれないけど、void*はキャストすべきと書かれてるところもあるね
http://www9.plala.or.jp/sgwr-t/lib/malloc.html#sankou
0404デフォルトの名無しさん
2010/09/21(火) 07:04:59void * から暗黙の変換はC++だとできないんだよ、Cではできる
おそらく>>401はVC++を使ってると思われる
0405デフォルトの名無しさん
2010/09/21(火) 07:08:51エラーが出るのは恐らくC++としてコンパイルしているから。
Cならキャストする必要がないし、C++ならmalloc()系は使わない方がいい。
>>402
警告が出るならその内容を書きなさい。
0406デフォルトの名無しさん
2010/09/21(火) 07:12:23>>401はC++をベターCとして使ってるってことなのかな
0407デフォルトの名無しさん
2010/09/21(火) 07:17:29こういう警告が出ます。
0408デフォルトの名無しさん
2010/09/21(火) 07:22:300409デフォルトの名無しさん
2010/09/21(火) 07:31:370410デフォルトの名無しさん
2010/09/21(火) 07:33:58unsigned long long定数にはlluが必要。
>>406
*.ccソースをc++としてコンパイルしているなら寧ろ g++ foo.c かもしれないが、
VC++で殻のプロジェクトを作ってなんとなく*.cppにしてしまっているのかもしれない。
0411デフォルトの名無しさん
2010/09/21(火) 07:36:31おまいらは誰に言っているんだ。
0412デフォルトの名無しさん
2010/09/21(火) 07:47:370413デフォルトの名無しさん
2010/09/21(火) 07:48:47具体的にどう書くんですか?
0414デフォルトの名無しさん
2010/09/21(火) 07:51:500415デフォルトの名無しさん
2010/09/21(火) 07:53:26その人じゃないけどたぶんこんなん
unsigned long long int a;
a = 0xffffffffffffffffLLU;
printf("%llu\n", a);
0416デフォルトの名無しさん
2010/09/21(火) 07:57:13int a = (int )L'あ';
0417デフォルトの名無しさん
2010/09/21(火) 07:57:56ありがとうございました。
0418デフォルトの名無しさん
2010/09/21(火) 08:09:24エラーが出ます。
converting to excution charactor set: Invarid or incomplete multibyte or wide charactor
0419デフォルトの名無しさん
2010/09/21(火) 08:39:050420デフォルトの名無しさん
2010/09/21(火) 08:52:08親切にもエラーメッセージが出てるのだから、それでググれば解決するのに。
$ gcc -finput-charset=shift_jis hoge.c
0421デフォルトの名無しさん
2010/09/21(火) 08:54:010422デフォルトの名無しさん
2010/09/21(火) 09:27:020423デフォルトの名無しさん
2010/09/21(火) 10:33:09ちゃんとコメント読んでるか?
Cとして作るならキャストは不要だ。C++として作るならそもそもmalloc系を使うな。
ベターCなどという中途半端なことをするから今回のようないらん問題にぶつかる。
C++の中のC互換は、元のCとは完全に別物だ。
これからも「あれ?Cではこうするって書いてあるのにエラーになる。なんで?」というのが出てくるぞ?
0424デフォルトの名無しさん
2010/09/21(火) 12:12:27それともランダムジャンプみたいなことしてO(1)になるんでしょうか?
0425デフォルトの名無しさん
2010/09/21(火) 12:21:50O(n)はアホすぎるだろう
0426デフォルトの名無しさん
2010/09/21(火) 12:24:290427デフォルトの名無しさん
2010/09/21(火) 12:25:39条件で変わるだろうから一概には言えないと思う。
多段ifみたいに一条件ずつチェックするならO(n)かもしれないけれど、
nがある程度大きければcase値とジャンプ先のテーブルになるだろうからnの探索時間でO(log2(n))かな。
さらにnが取り得る値の数に充分近いならジャンプテーブルだけになるからO(1)になると思う。
0428デフォルトの名無しさん
2010/09/21(火) 13:52:40短くなるけどパイプラインバブルが発生して結局遅くなるんだけどな
それでも条件分岐が外れる事によるパイプラインバブルの発生確率を考えると
賢い選択かもしれない
どうせ分岐予測なんて当たらないだろうし
0429デフォルトの名無しさん
2010/09/21(火) 15:16:590430デフォルトの名無しさん
2010/09/21(火) 15:58:06逆に言えばそんなケースは多くないだろうからやってない可能性が高いなぁ。
普通はO(n)でも充分実用だと思うし。
0431デフォルトの名無しさん
2010/09/21(火) 16:01:02してる。けど、最近のVC(VS)だけだと思う。
gccとかはやってないんじゃないかな。
0432デフォルトの名無しさん
2010/09/21(火) 16:04:590433デフォルトの名無しさん
2010/09/21(火) 16:10:30ごめん、知らなかった。
ちなみにgcc4以降とかですか?
gcc(3.x系)が二分探索吐いたの見たことないんですが。
あるいは特別不可解なオプション?
0434デフォルトの名無しさん
2010/09/21(火) 16:19:14なんもオプション付けてないです gcc -S a.c だけ
試したのは gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
コードは http://codepad.org/lohGRGWw
出力は http://codepad.org/1ZKAvhyw
0435デフォルトの名無しさん
2010/09/21(火) 16:30:58なってますね。手元でも確認しました。
ある程度case値が分散してないとならないようですね。まぁ当たり前か。
0436430
2010/09/21(火) 16:33:000437デフォルトの名無しさん
2010/09/21(火) 16:36:280438デフォルトの名無しさん
2010/09/21(火) 18:25:000439デフォルトの名無しさん
2010/09/21(火) 18:26:310440デフォルトの名無しさん
2010/09/21(火) 18:46:330441デフォルトの名無しさん
2010/09/21(火) 20:55:250442デフォルトの名無しさん
2010/09/21(火) 22:43:58ライブラリ + GUIで作られていているのですが
デバッグする時は1つのソフトとしてじゃなくて、2つそれぞれをデバッグしないとダメなのでしょうか?
0443デフォルトの名無しさん
2010/09/21(火) 22:57:060444デフォルトの名無しさん
2010/09/21(火) 23:23:05のが出来ていない段階ですので、そういった話はご遠慮く
ださい。
今の50代〜60代のこの分野での発展の
中心的役割を果たした世代(はっきしいって40代以下
は皆実力的に大して変わりません。)が定年退職して
そういった話を語りだして集成されて、定式化され始める
のがあと数年先で、ある程度話がまとまってくるのは更に
それから10年はかかるでしょう。
0445デフォルトの名無しさん
2010/09/21(火) 23:30:25「ライブラリ」が他人から与えられたもの、「GUI」が自分で作ったもの
という意味であれば、「GUI」だけデバッグすればいい。
0446デフォルトの名無しさん
2010/09/22(水) 00:00:42バブルソートをコーディングしようとしたら、こんなかんじになったんですが
これもバブルソートといえるのでしょうか?
#include<stdio.h>
int main(void)
{
int a[1000], i, num, t,b;
char ch;
printf("数字を何個入力しますか?\n");
scanf("%d",&num);
printf("\n数字を入力してください。\n");
for(i=0;i<num;i++){
scanf("%d",&a[i]);
}
for(i=0;i<num;++i){
for(b=i;b<num;b++){
if(a[b+1]<a[i]){
t=a[i];
a[i]=a[b+1];
a[b+1]=t;
}
}
}
for(i=0;i<num;i++)
printf("\n%d ",a[i]);
}
0447デフォルトの名無しさん
2010/09/22(水) 00:02:14バブルソートというからには隣り合う要素を比較するべき
0448デフォルトの名無しさん
2010/09/22(水) 00:08:56b + 1 とあるところは b のままでいいと思います。このままだとデータが 0〜num - 1 の num 個なのに、a[num] をチェックしてしまいます。
それはそうと、これは選択ソートでしょうね。
0449デフォルトの名無しさん
2010/09/22(水) 00:10:550450ビッターマン
2010/09/22(水) 00:16:28いまいちどうすればいいのか分かりません。
だれかヒントをおねがいすます。
たとえばbit1からbit13までが、1010110111001だと
16進は0x15b9となるわけですが、これをコードにしたいわけです。
0451デフォルトの名無しさん
2010/09/22(水) 00:17:22>>448
>>449
たしかにバブルソートじゃなくて選択ソートでした...
理系だしプログラミングぐらいできなかんと思い勉強し始めましたが、先が思いやられます...
0452デフォルトの名無しさん
2010/09/22(水) 00:18:410453デフォルトの名無しさん
2010/09/22(水) 00:21:08まああせらずに地道に。
0454デフォルトの名無しさん
2010/09/22(水) 00:21:45お前が要らないとかの情報も要らないです。
0455デフォルトの名無しさん
2010/09/22(水) 00:39:47いまいち何がしたいのかわからないが、
"1010110111001"という文字列を2進数とみて整数型変数に格納したいなら、strtol()。
整数型変数の値を16進文字列にしたいなら、printf()。
0456デフォルトの名無しさん
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;
}
0457デフォルトの名無しさん
2010/09/22(水) 02:12:110458デフォルトの名無しさん
2010/09/22(水) 06:25:430459デフォルトの名無しさん
2010/09/22(水) 07:34:13これって、2重ループ内でいちいち交換しているので選択ソートではないでしょ。
かと言って、>>447のとおりバブルソートでもない。
なんて言うんだろ。
0460デフォルトの名無しさん
2010/09/22(水) 07:39:520461デフォルトの名無しさん
2010/09/22(水) 07:42:12>なんて言うんだろ。
バグ。
ちゃんと動かねぇじゃん。
つーか、for (; b < num; )のループ内でa[b + 1]にアクセスしている時点でバン。
0462デフォルトの名無しさん
2010/09/22(水) 07:54:080463デフォルトの名無しさん
2010/09/22(水) 07:58:32結果として外側のループ(ループ変数 i) を一回まわるごとに、a[i] に最高のものが来る点が選択ソートっぽいのですけれども。
wikipedia の実装例をみるかぎり、これでも選択ソートらしい。
0464デフォルトの名無しさん
2010/09/22(水) 09:13:48#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で最適化したいのですが方法が判りません。
アセンブラで書くしかないのでしょうか?
0465デフォルトの名無しさん
2010/09/22(水) 10:36:440466デフォルトの名無しさん
2010/09/22(水) 11:03:25strtoull()を実装し直すということなら、入門の範疇を大きく超えているね。
つーか、そんなプログラム、最適化しても何のメリットもないと思うけど。
0467デフォルトの名無しさん
2010/09/22(水) 11:32:160468デフォルトの名無しさん
2010/09/22(水) 11:38:410469デフォルトの名無しさん
2010/09/22(水) 11:43:37どちらにせよこのスレの範囲外
SSEスレに行くと良い
0470デフォルトの名無しさん
2010/09/22(水) 12:01:550471デフォルトの名無しさん
2010/09/22(水) 12:50:54MSVC使用してそれなりのオプションを指定する
0472デフォルトの名無しさん
2010/09/22(水) 13:26:090473デフォルトの名無しさん
2010/09/22(水) 14:02:03asm_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;
}
インラインアセンブラでエラーが出ます。なぜ?
0474デフォルトの名無しさん
2010/09/22(水) 14:35:11インラインアセンブラはC言語の範疇ではないので該当コンパイラスレかアセンブラスレへどうぞ。
つーか、エラーが出たならそのエラーメッセージくらい張れよ間抜け。
0475デフォルトの名無しさん
2010/09/22(水) 17:39:05int a=a+1;
↑は ;1+a=a という順番で「後ろから前」に処理すると豪語する輩がいます。
Cに限らず全てのコンピュータからの入力は「後ろから前」だそうです。
それは違うと2スレ消費して間違いを指摘しても納得してくれません。
どうやって教えたらいいでしょうか?
0476デフォルトの名無しさん
2010/09/22(水) 17:45:080477デフォルトの名無しさん
2010/09/22(水) 17:52:290478デフォルトの名無しさん
2010/09/22(水) 17:53:410479デフォルトの名無しさん
2010/09/22(水) 18:00:120480デフォルトの名無しさん
2010/09/22(水) 18:07:26前者は分からないからか?w
0481デフォルトの名無しさん
2010/09/22(水) 19:00:23int a=0;
0482デフォルトの名無しさん
2010/09/22(水) 19:00:30エラーメッセージも載せないのには付き合ってられん。
0483デフォルトの名無しさん
2010/09/22(水) 19:05:170484デフォルトの名無しさん
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のアドレスを格納するポインタ変数を構造体の外に作って
それをさらに格納する無名のポインタ変数を構造体の中に作る・・・みたいな事なのか?
0485デフォルトの名無しさん
2010/09/22(水) 19:10:56int a=0;
0486デフォルトの名無しさん
2010/09/22(水) 19:41:45文法通りになおしたらエラーは出なくなる。
結果: 0,-1000,-2000,-3000
0487デフォルトの名無しさん
2010/09/22(水) 19:54:44本に書いてある通りにしてるんですが、どこが悪いのかわかりません。
0488デフォルトの名無しさん
2010/09/22(水) 20:07:13並べ替えを考えた時
child がいきなり実体の配列になっているよりは
child がポインタ配列で交換はたかだかポインタを入れ替えで済むほうが都合が良い場合もある
プログラム固有のデータ部がとても大きかったり
要素数+ポインタ になってて、入れ替えの際、実体の複写を取るのに面倒だなー ってケースね
ま、後者はデータ固有部分にあるポインタを移すだけなんだけど…
移譲と複写を注意深く区別しないと、思わぬ落とし穴に捕まるので、難儀な所かも?
0489デフォルトの名無しさん
2010/09/22(水) 20:18:27こんな感じ
ズレてたらすまん
Node
+-----------+
| a |
+-----------+
| child_count |
+-----------+
| child | --> +-------+
+-----------+ | child[0] | --> Node
+-------+
| child[1] | --> Node
+-------+
| child[2] | --> Node
+-------+
0490デフォルトの名無しさん
2010/09/22(水) 20:34:210491デフォルトの名無しさん
2010/09/22(水) 20:41:19"\tmovq (%1),%%mm0\n"
"\tmovq (%2),%%mm1\n"
"\tpsubsw %%mm1,%%mm0\n"
"\tmovq %%mm0,%0\n"
"\temms\n"
: "=g" (c) : "r" (&a), "r" (&b));
0492デフォルトの名無しさん
2010/09/22(水) 21:02:35そんなクソ本捨てましょう。
0493デフォルトの名無しさん
2010/09/23(木) 00:24:310494デフォルトの名無しさん
2010/09/23(木) 00:29:530495デフォルトの名無しさん
2010/09/23(木) 01:33:180496デフォルトの名無しさん
2010/09/23(木) 02:35:260497デフォルトの名無しさん
2010/09/23(木) 02:41:590498デフォルトの名無しさん
2010/09/23(木) 02:46:550499デフォルトの名無しさん
2010/09/23(木) 03:00:41俺はその上体も洗ってない
0500デフォルトの名無しさん
2010/09/23(木) 03:02:460501デフォルトの名無しさん
2010/09/23(木) 03:03:540502デフォルトの名無しさん
2010/09/23(木) 03:04:47* ウソです +
n ∧_∧ n
+ (ヨ(* ´∀`)E)
Y Y *
0503デフォルトの名無しさん
2010/09/23(木) 06:56:11printfは出力をリダイレクトしてます。
0504デフォルトの名無しさん
2010/09/23(木) 07:24:02でもお前のプログラム次第だから実測するのが一番
0505デフォルトの名無しさん
2010/09/23(木) 07:39:03ファイルから16バイト読み込んで暗号化してから書き込みます。
プログラムの例で使い方を知りたいのでよろしくお願いします。
0506デフォルトの名無しさん
2010/09/23(木) 07:40:40ぐぐって出てくるページじゃ不足なのか?
それともそういうのじゃ理解出来ないぐらい頭が残念なのか?
0507デフォルトの名無しさん
2010/09/23(木) 08:07:170508デフォルトの名無しさん
2010/09/23(木) 09:24:50目的が違うので、単純に比較できない。
write()と同じ条件で較べられるのはfwtite()だ。
仮に整形の必要があるならprintf()でいいが、それならsprintf()+write()で較べるべき。
>>505
ファイルからの入出力なら、無理にread()/write()を使わずfread()/fwrite()を使った方が無難。
0509デフォルトの名無しさん
2010/09/23(木) 10:45:49fread(),fwrite()で処理したら高速化出来ました。
今暗号作ってるんですがBLOWFISHより速くなりました。
ありがとうございました。
0510デフォルトの名無しさん
2010/09/23(木) 11:31:26"warning: FT_OpenType_Validate is disabled. Replace FreeType2 with otvalid-enabled version."
と出て、リリースの方でも試してみたら今度はバッファオーバーフローを引き起こしました。
↑のエラー文をググってもいまいちわからないので誰か詳しい方教えて下さい・・・
0511デフォルトの名無しさん
2010/09/23(木) 11:41:050512デフォルトの名無しさん
2010/09/23(木) 11:54:02どうやら単にバッファサイズが足りないだけでした。ご迷惑をお掛けしました・・
0513デフォルトの名無しさん
2010/09/23(木) 12:21:47「なぜそうした方がいいのか」はともかく
「なぜそうなるのか(内部でメモリがどう確保されてるのか)」がわかんないんだ
**childはポインタ変数のアドレスを参照するポインタ変数が作られるのは分かった(多分)が
child[0]からchild[2]までのポインタ変数の配列については、どこでメモリが確保されてるのか、とか・・・
俺、ポインタについて根本的にどっか勘違いしてるのかな?
0514デフォルトの名無しさん
2010/09/23(木) 12:26:230515デフォルトの名無しさん
2010/09/23(木) 12:26:53int a; // プログラム固有のデータ
int child_count; // 子の数
struct Node_tag *child[]; // このポインタの先にmalloc()で可変長配列をつなぐ
}Node;
0516デフォルトの名無しさん
2010/09/23(木) 12:34:25>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));
0517デフォルトの名無しさん
2010/09/23(木) 13:17:28**pointer と *pointer[] はまた違うものだって聞いた
(関数の引数として使う時は同じように使えるけど)
>>516
あー、そうなのか
例に出した関数が書かれていた本にはその辺は書いてなかったから、配列の分もどっかで一緒に確保されるんじゃないかって早とちりしてた
ともかく、ありがとう。次はmllloc()の勉強だ・・・
0518デフォルトの名無しさん
2010/09/23(木) 15:32:12http://codepad.org/v5paokfg
1行ごとに""で囲むと文法エラーになりにくくてかんたんかも〜(^_^じこりゅう
0519デフォルトの名無しさん
2010/09/23(木) 16:04:16一番最後に「*/」を付けると
・・・main関数が無いって怒られるか
0520デフォルトの名無しさん
2010/09/23(木) 16:11:37gccだとemms命令無しでもエラー出ないのか
0521デフォルトの名無しさん
2010/09/23(木) 16:21:16あと、unsigned long long int って使ってもMMX命令に変換されないのでしょうか。
32ビットで最適化したほうが早いですか?
0522デフォルトの名無しさん
2010/09/23(木) 16:25:57このページを参考にHello Worldを返すDLLを作りたいのですがVC++2010でやる場合
何ていうファイルを作ればいいのでしょうか?
0523デフォルトの名無しさん
2010/09/23(木) 16:30:17ほぼIDEの操作の話になるからスレチだな
vsスレでも行ってろ
0524522
2010/09/23(木) 16:36:19すみませんでした
0525デフォルトの名無しさん
2010/09/23(木) 17:25:59int a=0;
0526522
2010/09/23(木) 17:55:51コードを載せましたのでどなたかご指摘等お願い致します
ttp://ideone.com/Hz13E
0527デフォルトの名無しさん
2010/09/23(木) 17:58:290528デフォルトの名無しさん
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 スキップ ==========
0529デフォルトの名無しさん
2010/09/23(木) 20:42:03英語メッセージを見ると思考停止する>>528の脳味噌を入れ替える。
0530デフォルトの名無しさん
2010/09/23(木) 20:46:24エラーは出てないよ。strcpyは安全じゃないよ、と警告してるだけ。
strncpyを使うといい。
0531デフォルトの名無しさん
2010/09/23(木) 20:47:46strcpy()のところ。
エラーメッセージは、strcpy_s()という関数を使うべきだ、と言ってるよ。
0532デフォルトの名無しさん
2010/09/23(木) 20:48:03とかなんか。
0533デフォルトの名無しさん
2010/09/23(木) 20:49:460534デフォルトの名無しさん
2010/09/23(木) 20:51:29正直、同意w
0535デフォルトの名無しさん
2010/09/23(木) 20:52:130536デフォルトの名無しさん
2010/09/23(木) 20:52:21俺もそう思った。
今は無視している。
0537デフォルトの名無しさん
2010/09/23(木) 20:58:050538528
2010/09/23(木) 21:00:47_CRT_SECURE_NO_WARNINGSを書くと警告が出ない事も勉強になりました
ありがとうございました
0541デフォルトの名無しさん
2010/09/23(木) 21:16:28sizeofで配列szのサイズを知ることができるのなら、
なぜstrcpy_sは、引数を3個に増やしてしまったのだろうか?
たとえば strcpy_s(char* dst. char*src){strncpy(dst,sizeof(dst),src);}と、定義すると問題があるのだろうか?
0542デフォルトの名無しさん
2010/09/23(木) 21:18:43mallocされてたら、sizeofじゃわからないよ?
0543デフォルトの名無しさん
2010/09/23(木) 21:20:56C言語ではRTTIをサポートしていないから。
それからchar *a;をsizeofでとっても、4バイトにしかならないから。
0544デフォルトの名無しさん
2010/09/23(木) 21:21:07mallocじゃなくても、>>541じゃわからない。
0545528
2010/09/23(木) 21:22:44strncpyじゃコピー元の大きさに関わらず
sizeof(dest)バイトコピーしちゃいます
コピー元がそんなに読めるとは限りませんよね?
0546デフォルトの名無しさん
2010/09/23(木) 21:24:19char func(char x)
{
int len = sizeof(x);
char s[len];
}
0547デフォルトの名無しさん
2010/09/23(木) 21:26:02とにかく、sizeof()の結果っていうのはコンパイル時に決定できなくちゃならないのですわ。
0548デフォルトの名無しさん
2010/09/23(木) 21:26:47C89/C++では禁止されてる
0549デフォルトの名無しさん
2010/09/23(木) 21:27:51strncpy()の仕様を誤解してる。
0550デフォルトの名無しさん
2010/09/23(木) 21:29:23プリプロセスなので実行前にわかってないと置換できない。
0551デフォルトの名無しさん
2010/09/23(木) 21:31:100552デフォルトの名無しさん
2010/09/23(木) 21:31:560553デフォルトの名無しさん
2010/09/23(木) 21:33:26実は俺、C99はあんまりよく知らないけどさw
さすがにそれはない、と思うんだけど。
違ったら、かなりえらいことになると思うんだが。
0554デフォルトの名無しさん
2010/09/23(木) 21:35:04char func(char x)
{
char s[5];
}
xの値が文字列「12345」でchar[6]だとエラーは出ないですけどxの値が「1234567890」のように長くするとエラーが出ます
例外処理っていうので対策できるのかと思ったのですが検索したのですがCには例外処理がないんですかね?
このような場合はどのように対策するのでしょうか?
0555デフォルトの名無しさん
2010/09/23(木) 21:35:26問題になってるのは単にそれだけの事
0556デフォルトの名無しさん
2010/09/23(木) 21:35:41では、どうすれば知れますか?
0557デフォルトの名無しさん
2010/09/23(木) 21:36:070558デフォルトの名無しさん
2010/09/23(木) 21:36:14意味が分からない
0559デフォルトの名無しさん
2010/09/23(木) 21:37:38szが配列ならそれでいい
要素数じゃなくてバイト数だがな
最近のVCは_countofマクロってのがあって要素数を取得できるが
標準ではない
0560デフォルトの名無しさん
2010/09/23(木) 21:38:35いや、それが配列として定義されたものであれば、知れるよ。
char szarg[10];
assert( sizeof( szarg ) == 10 );
これは動く。
でも、
char* pszarg = malloc( 10 );
assert( sizeof( pszarg ) == 10 );
は通らない。
なぜなら、sizeof(pszarg)の値はポインタの(アドレスの)バイト数が返ってくるから。
0561デフォルトの名無しさん
2010/09/23(木) 21:42:04D言語においでおいで
0562デフォルトの名無しさん
2010/09/23(木) 21:43:12void 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;
}
これを実行してみるといいよ
0563554
2010/09/23(木) 21:44:06char func(char x)
{
static char sz[5];
strcpy(sz, s);
return sz;
}
↑のコードでszのサイズを越える文字列を引数で渡すとエラーが出るのですが
このような文字列が渡された場合はどのように対策処理するのでしょうか?
0564デフォルトの名無しさん
2010/09/23(木) 21:44:23szが配列ならsizeof(sz)で配列の長さがバイト単位でわかるんですか?
もしそれが本当なら、
strcpy_sに渡せる配列を、非mallocな変数に限定することで、
引数を3個にしなくても安全な関数にできる気がしました。
0565デフォルトの名無しさん
2010/09/23(木) 21:45:320566デフォルトの名無しさん
2010/09/23(木) 21:46:32配列を配列型のまま渡せないから無理
0567デフォルトの名無しさん
2010/09/23(木) 21:47:13だから>>562実行しろっつってんだろ
hoge内でどう表示されるか見てみろ
0568デフォルトの名無しさん
2010/09/23(木) 21:47:18char func(char sz)
{
static char sz[5];
strcpy(sz, s);
return sz;
}
0569デフォルトの名無しさん
2010/09/23(木) 21:47:51動くコードをくれ
0570デフォルトの名無しさん
2010/09/23(木) 21:48:34ちゃんとコンパイル通ったコードを貼れ
0571デフォルトの名無しさん
2010/09/23(木) 21:49:50自分でチェックしてエラーを返すなど、呼び出し元にもからくりを準備して対応するしかないのでは?
0572デフォルトの名無しさん
2010/09/23(木) 21:50:14{
if(strlen(src_str) > 5){
puts("fuck!");
exit(1);
}
static char dst_str[5];
strcpy(dst_str, src_str);
return dst_str;
}
0573デフォルトの名無しさん
2010/09/23(木) 21:51:41#include <windows.h>
#include <string.h>
char* stringTest(char* s)
{
static char sz[5];
strcpy_s(sz, sizeof(sz), s);
return s;
}
0574デフォルトの名無しさん
2010/09/23(木) 21:55:28>strDestination または strSource が null ポインタの場合、
>またはコピー先文字列が小さすぎる場合は、
>「パラメータの検証」に説明されているように、無効なパラメータ ハンドラが呼び出されます。
>実行の継続が許可された場合、これらの関数は EINVAL を返し、errno を EINVAL に設定します。
>パラメータの検証
>http://msdn.microsoft.com/ja-jp/library/ksazx244%28v=VS.80%29.aspx
面倒くさいと思うなら自分でサイズチェックしる
0575デフォルトの名無しさん
2010/09/23(木) 21:57:22では、配列を配列型のまま渡す方法は無いのですか?
0576デフォルトの名無しさん
2010/09/23(木) 21:59:06ないよ。
0577デフォルトの名無しさん
2010/09/23(木) 22:09:35カッコ付けるなボケ
0578デフォルトの名無しさん
2010/09/23(木) 22:12:48あ、はい。
0579デフォルトの名無しさん
2010/09/23(木) 22:13:08>>560 のどこがおかしいのでしょうか?
0580デフォルトの名無しさん
2010/09/23(木) 22:13:22違います。出直しなさい。
0581デフォルトの名無しさん
2010/09/23(木) 22:14:04データ構造を自分の好きなように設計すればいい。
C はそんな部分までルールを強要されてないんだよ。
0582デフォルトの名無しさん
2010/09/23(木) 22:16:15おかしいっつか、return(0);みたいなもんだろ。
普通は付けない。
0583デフォルトの名無しさん
2010/09/23(木) 22:16:16「括弧つけるな」だと思われる。
0584560
2010/09/23(木) 22:16:23577じゃないんだが、
多分sizeof(x)ではなくて、sizeof xのように書け、といってるんだろう。
で、俺はsizeofはカッコ付けたいなあ。
0585デフォルトの名無しさん
2010/09/23(木) 22:16:34無くはないが、特定の要素数の配列しか渡せなくなる
結局意味が無い
C++だとテンプレートを使って回避できるし、
strcpy_sもそれ利用して実装されてるが
0586デフォルトの名無しさん
2010/09/23(木) 22:18:48四則演算より強ければ、つけないという選択でも良いのだが。
0587デフォルトの名無しさん
2010/09/23(木) 22:19:10あるんで、いちいち考えるのめんどうだから、常につけてる。
0588デフォルトの名無しさん
2010/09/23(木) 22:21:47(動的にコピー先の領域を確保)
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);
}
0589デフォルトの名無しさん
2010/09/23(木) 22:21:56もちろんsizeof(a+b)のカッコを外したらだめだが
sizeof(a)+bとsizeof a+bとに何ら違いは無い
0590デフォルトの名無しさん
2010/09/23(木) 22:22:17なにをいってるのか
0591デフォルトの名無しさん
2010/09/23(木) 22:23:400592デフォルトの名無しさん
2010/09/23(木) 22:24:510593デフォルトの名無しさん
2010/09/23(木) 22:26:030594デフォルトの名無しさん
2010/09/23(木) 22:26:31四則演算より上だが、お前は何を言っているんだ
0595デフォルトの名無しさん
2010/09/23(木) 22:28:33型のサイズを求める以外に sizeof を使ったことがない。
配列? vector<> とか deque<> とかしか使わなくなってしまった‥‥‥。
0596デフォルトの名無しさん
2010/09/23(木) 22:29:18その「間違った優先順位」とやらを直しても外せない括弧がある
つまり直せという主張に疑問符がつくぜ
0597デフォルトの名無しさん
2010/09/23(木) 22:29:210598デフォルトの名無しさん
2010/09/23(木) 22:29:52スレタイ嫁な
0599デフォルトの名無しさん
2010/09/23(木) 22:30:020600デフォルトの名無しさん
2010/09/23(木) 22:31:120601デフォルトの名無しさん
2010/09/23(木) 22:32:54そもそも間違った優先順位なんてないがな
0602デフォルトの名無しさん
2010/09/23(木) 22:33:53え、できゅう、じゃないのですか。あはは‥‥。
>>599
STL って C じゃなかったのね。あはは‥‥。
吊ってくる
0603デフォルトの名無しさん
2010/09/23(木) 22:37:200604デフォルトの名無しさん
2010/09/23(木) 22:38:21そうデキュ
0605デフォルトの名無しさん
2010/09/23(木) 22:39:21if (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;
0606デフォルトの名無しさん
2010/09/23(木) 22:40:54お前の処理系がC99合致でないから
C99より前は変数の宣言はブロック先頭のみ
0607デフォルトの名無しさん
2010/09/23(木) 22:44:58それは悪かった
で、何を「間違った設計」だと言いたかったんだ?
少なくともここは変だぜ
> 括弧をつけるのが正解。
つけなくても正解があるので意味をなしていない
0608デフォルトの名無しさん
2010/09/23(木) 22:45:37あと、比較するなら5<=strlen(s)では
0609デフォルトの名無しさん
2010/09/23(木) 22:46:20横レスに何言ってんの
0610デフォルトの名無しさん
2010/09/23(木) 22:49:500611デフォルトの名無しさん
2010/09/23(木) 22:51:01危なっかしい
0612デフォルトの名無しさん
2010/09/23(木) 22:52:17そうか、横レスだったのか
では見逃してやろうw
0613デフォルトの名無しさん
2010/09/23(木) 22:53:11何を見逃すんだ?
訳分からん
0614デフォルトの名無しさん
2010/09/23(木) 22:54:240615デフォルトの名無しさん
2010/09/23(木) 22:58:180616デフォルトの名無しさん
2010/09/23(木) 22:59:07ま、標準じゃないけどね。
0617デフォルトの名無しさん
2010/09/23(木) 23:00:010618デフォルトの名無しさん
2010/09/23(木) 23:02:300619デフォルトの名無しさん
2010/09/23(木) 23:02:460620デフォルトの名無しさん
2010/09/23(木) 23:06:34typename に似たような事情がありそうだね
0621デフォルトの名無しさん
2010/09/23(木) 23:20:08違う。
貴方が言っているのはオーバーフロー。
貴方が言いたいのはオーバーラン。
0622デフォルトの名無しさん
2010/09/23(木) 23:24:52どっちでも可でどちらなのかは意味解析に任せる、じゃ困るケースがあんだろうね
0623デフォルトの名無しさん
2010/09/23(木) 23:41:03って言われたとき a や b は何に見えるだろう
コンパイラはどこまで何を保証すべきだろう
sizeof 1E+1
sizeof 1L+1
の違いはパーサの責任範囲?
0624デフォルトの名無しさん
2010/09/24(金) 00:03:15キャストだって括弧付けるだろ。
0625デフォルトの名無しさん
2010/09/24(金) 00:07:34(void(*)(void))a
こうでもよかったはずだよな
void(*(a))(void)
0626デフォルトの名無しさん
2010/09/24(金) 00:07:48バッファオーバーフローもバッファオーバーランも
変わらないと思うが、もしや>>615のオーバーフローが
桁あふれを意味していると言う解釈か?
流石に曲解だろ。
0627デフォルトの名無しさん
2010/09/24(金) 00:08:02イヤないな
06281/2
2010/09/24(金) 04:10:58今、関数の練習をしているのですが、コンパイル時に下記のエラーが出ます。
test.c: In function 'main';
test.c:4: warning: return type of 'main' is not 'int'
テキストの例通りに入力してもこのエラーが出るので、困ってます。
06292/2
2010/09/24(金) 04:13:11#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);
}
0630628-629
2010/09/24(金) 04:14:05コピったのを貼りつけたら改行がおかしくなりました。
0631デフォルトの名無しさん
2010/09/24(金) 04:17:550632デフォルトの名無しさん
2010/09/24(金) 04:24:00うまくいきました。
ありがとうございます。
原因は何が考えられるのでしょうか。
0633デフォルトの名無しさん
2010/09/24(金) 04:26:56何のコンパイラを使っているかしらんが、
そのコンパイラではmain関数はintを返すと規定されているのでしょう。
ISO Cとして厳格なコンパイラってことだろう。
ちなみに、mainのreturn値はUnixでいうところのプログラムの終了コード
に反映される。
0634デフォルトの名無しさん
2010/09/24(金) 04:30:25成程。
とりあえずmain関数でintを返すようにしておけば問題なさそうですね。
ありがとうございました。
助かりました。
0635デフォルトの名無しさん
2010/09/24(金) 05:12:08いいですか。教えてください。よろしくおねがいします
./a.exe infile outfile
0636デフォルトの名無しさん
2010/09/24(金) 05:33:58char infile[256] ;
char outfile[256] ;
if ( argc>=3){
strcpy ( infile, argv[1] ) ;
strcpy ( outfile, argv[2] ) ;
}
0637デフォルトの名無しさん
2010/09/24(金) 05:49:320638デフォルトの名無しさん
2010/09/24(金) 06:02:05FILE *in, *out;
in = fopen(argv[1], "r");
out = fopen(argv[2], "w");
みたいにしたいのかと思ったが
0639デフォルトの名無しさん
2010/09/24(金) 06:05:260640デフォルトの名無しさん
2010/09/24(金) 06:10:060641デフォルトの名無しさん
2010/09/24(金) 06:16:230642デフォルトの名無しさん
2010/09/24(金) 06:17:48sprintf ( outfile, "%s%s", argv[2], ".hoge" ) ;
0643デフォルトの名無しさん
2010/09/24(金) 06:30:54infileだけが必要になりませんか?
因みにファイル処理はサブルーチンの中でやってます。
0644デフォルトの名無しさん
2010/09/24(金) 06:34:150645デフォルトの名無しさん
2010/09/24(金) 07:12:360646デフォルトの名無しさん
2010/09/24(金) 07:20:15char infile[256] ;
char outfile[256] ;
if ( argc>=3){
strcpy ( infile, argv[1] ) ;
strcpy ( outfile, argv[2] ) ;
}
これはうまくいくんですが、入力ファイルだけを指定して出力ファイル
に固定の拡張子を付けるのに
sprintf ( outfile, "%s%s", argv[2], ".hoge" ) ;
これをやってもうまくいきません。コアダンプします。
そもそもこれは何をする関数なんですか?
0647デフォルトの名無しさん
2010/09/24(金) 07:22:43ls 3*
3 3.txt
みたいな
0648デフォルトの名無しさん
2010/09/24(金) 07:30:03int 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;
}
0649デフォルトの名無しさん
2010/09/24(金) 07:32:53それで分岐しろ
0650デフォルトの名無しさん
2010/09/24(金) 07:47:090651デフォルトの名無しさん
2010/09/24(金) 07:50:110652デフォルトの名無しさん
2010/09/24(金) 07:56:32そんでそれでどうしても分からなかったら聞きに来い
0653デフォルトの名無しさん
2010/09/24(金) 08:01:37ttp://www.cppll.jp/cppreference/
0654デフォルトの名無しさん
2010/09/24(金) 08:03:13#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" ) ;
}
0655デフォルトの名無しさん
2010/09/24(金) 08:31:390656デフォルトの名無しさん
2010/09/24(金) 08:34:25その警告は「returnで返してる値の型が間違ってる」だ
voidは何も返さない関数だから、returnを使わない
void main(){
printf("test");
}
intなら整数を返す
int main(){
printf("test");
return 0;
}
0657デフォルトの名無しさん
2010/09/24(金) 08:34:310658デフォルトの名無しさん
2010/09/24(金) 08:52:22ファイルポインタ指定しないでファイルを作ろうとしてました。
sprintfを初めて使いました。
0659デフォルトの名無しさん
2010/09/24(金) 11:41:050660デフォルトの名無しさん
2010/09/24(金) 12:05:54Win32APIに↓こんなのあったけど、どう?
PathRelativePathTo
0661デフォルトの名無しさん
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");
}
0662デフォルトの名無しさん
2010/09/24(金) 12:49:30fp=fopen(fout,"wb");
fq=fopen(fin,"rb");
とするのはいいのですが、復号のときに暗号化されたファイルを
読み込んで処理しても復号できない。
何のデータにばけているのかわかりません。
0663デフォルトの名無しさん
2010/09/24(金) 13:03:12プログラムで暗号化してできた暗号文を、手作業で暗号化したものと比較してみる
暗号文が間違ってるなら、そんなもの復号できるわけないからな
0664デフォルトの名無しさん
2010/09/24(金) 13:08:34復号すれば成功します。プログラムで自動化しようとして失敗してます。
0665デフォルトの名無しさん
2010/09/24(金) 13:12:400666デフォルトの名無しさん
2010/09/24(金) 13:15:15fp=fopen("2.perm","wb");
fp=fopen("2.txt","wb");
fp=fopen(fout,"wb");
の3通りあるのか? どういう使い分けで?
0667デフォルトの名無しさん
2010/09/24(金) 13:16:370668デフォルトの名無しさん
2010/09/24(金) 13:20:08if(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");
これは標準入力からファイル名を指定したときの残骸です。
0669デフォルトの名無しさん
2010/09/24(金) 13:25:39./a.exe file.perm file.txt 復号化
これでうまくいくはずなのに、そうなりません。
0670デフォルトの名無しさん
2010/09/24(金) 13:26:490671デフォルトの名無しさん
2010/09/24(金) 13:39:01あなたと同じ所で詰まっている人が他にもいるので、二人で協力すれば解決できると思いますよ。
http://hibari.2ch.net/test/read.cgi/tech/1274998754/454
0672デフォルトの名無しさん
2010/09/24(金) 13:45:40マルチの女乙
0673デフォルトの名無しさん
2010/09/24(金) 14:33:32まあ、Cスレで面倒見るべきなのかね。
ファイルを書き込む時と読み込むときにはどんな風にしてるの?
0674デフォルトの名無しさん
2010/09/24(金) 14:42:11そこが間違ってなければ暗号アルゴリズムが
間違っているか正しくコードできてないだけ
あるいはコーディング特有の雑多で膨大な種類の
些細なミスの幾つかに引っかかって正しく動作さ
せられていない
と推測
0675デフォルトの名無しさん
2010/09/24(金) 14:46:150676デフォルトの名無しさん
2010/09/24(金) 14:47:26うまく説明できないのですが、ストリーム暗号なので2回暗号化すれば
元に戻るはずなのです。手動でファイルを指定してコンパイルすると
元に戻るのですが、自動化しようとするとバイナリになってしまいます。
プログラムを見せたほうがいいのでしょうか?
0677デフォルトの名無しさん
2010/09/24(金) 14:51:46for(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);
}
0678デフォルトの名無しさん
2010/09/24(金) 14:57:560679デフォルトの名無しさん
2010/09/24(金) 15:00:410680デフォルトの名無しさん
2010/09/24(金) 15:01:50>手動でファイルを指定してコンパイルすると元に戻るのですが
ファイル名をソースに直書きした場合は正常に復号される
>自動化しようとするとバイナリになってしまいます。
ファイル名をコマンドライン引数で指定するとうまくいかない
ってことでおk?
とりあえずファイルIOは考えずに,適当なデータで暗号化・復号化が正常に動くのかどうかを検証しろ
0681デフォルトの名無しさん
2010/09/24(金) 15:13:07fp=fopen(argv[2],"wb");
fq=fopen(argv[1],"rb");
でいいんじゃないの?
もちろんfopenの戻り値はNULLチェックしてるよな?
0682デフォルトの名無しさん
2010/09/24(金) 15:27:05のコードを書いたのが>>676かどうかはシランが
read_sizeが常に4096を返すとは限らない
ので(特に末尾はファイルサイズが4096の倍数
でも無い限り絶対にそう)、>>677のコードでは
正しく復号できることは望み薄い
0683デフォルトの名無しさん
2010/09/24(金) 15:27:24ありがとうございます。
いんぷ
0684デフォルトの名無しさん
2010/09/24(金) 15:28:320685デフォルトの名無しさん
2010/09/24(金) 15:46:30d=0;にしてはダメ。手で入力する必要があります。
scanf("%d",&d);
if(d==0){
fp=fopen(argv[2],"wb");
fq=fopen(argv[1],"rb");
}
4096にならない時はパディングします。
0686デフォルトの名無しさん
2010/09/24(金) 15:50:49if(d==0){ 暗号化用
fp=fopen("2.perm","wb");
fq=fopen("2","rb");
}else{ 復号化用
fp=fopen("2.txt","wb");
fq=fopen("2.perm","rb");
}
0687デフォルトの名無しさん
2010/09/24(金) 16:18:031つずつキッチリと覚えていけばいいんだよ。
命題を明確にしろ。
1度にやろうとするな。
0688デフォルトの名無しさん
2010/09/24(金) 16:28:53もしくは現状のソース全部うpしろ
0689デフォルトの名無しさん
2010/09/24(金) 16:29:28開発効率もわりー言語を使ってんのは何か?プライドってやつか?wwwwwwwwww
今の時代は言語はなんだっていいんだよwwwwwwwwwwwwwww
C#様最強伝説なんだよわかったかおまえらwwwwwwwwwwwwwwwwwwwwww
0690デフォルトの名無しさん
2010/09/24(金) 16:36:37よし、バイナリ読み込んで構造体の配列にするコードをC#で書いていいぞ
0691デフォルトの名無しさん
2010/09/24(金) 16:39:44晒すのが手っ取り早いんじゃね?
0692デフォルトの名無しさん
2010/09/24(金) 16:46:18そんなこと言われたってなぁ・・・
言語選べる立場じゃないし・・・
>>690
unsafeコード使えば楽勝じゃね
0693デフォルトの名無しさん
2010/09/24(金) 16:54:050694デフォルトの名無しさん
2010/09/24(金) 16:54:26何作ってるの?
0695デフォルトの名無しさん
2010/09/24(金) 16:58:530696デフォルトの名無しさん
2010/09/24(金) 17:17:41バグだらけじゃねーか、さっさと修正ry
0697デフォルトの名無しさん
2010/09/24(金) 17:23:400698デフォルトの名無しさん
2010/09/24(金) 17:42:450699デフォルトの名無しさん
2010/09/24(金) 17:43:44他の言語を使えばいい
0700デフォルトの名無しさん
2010/09/24(金) 17:50:300701デフォルトの名無しさん
2010/09/24(金) 17:54:050702デフォルトの名無しさん
2010/09/24(金) 17:54:540703デフォルトの名無しさん
2010/09/24(金) 17:57:09代わりに ??/ を使ってるんだから問題ないだろ。
0704デフォルトの名無しさん
2010/09/24(金) 18:14:54どっちもどっちの気がするから今のままでいいんじゃね
0705デフォルトの名無しさん
2010/09/24(金) 18:36:39#define @ &
0706デフォルトの名無しさん
2010/09/24(金) 18:54:23今週からC#を勉強しています。関係ないけど。
0707デフォルトの名無しさん
2010/09/24(金) 18:57:12どうして♀とわかったんですか?
0708デフォルトの名無しさん
2010/09/24(金) 19:13:530709デフォルトの名無しさん
2010/09/24(金) 20:49:110710デフォルトの名無しさん
2010/09/24(金) 22:55:370711デフォルトの名無しさん
2010/09/24(金) 23:53:030712デフォルトの名無しさん
2010/09/25(土) 00:04:320713デフォルトの名無しさん
2010/09/25(土) 00:12:030714デフォルトの名無しさん
2010/09/25(土) 00:13:440715デフォルトの名無しさん
2010/09/25(土) 00:16:470716デフォルトの名無しさん
2010/09/25(土) 00:18:21return -1;はバグる。
0717デフォルトの名無しさん
2010/09/25(土) 00:19:260718デフォルトの名無しさん
2010/09/25(土) 00:19:40ある意味すごいぞ
0719デフォルトの名無しさん
2010/09/25(土) 01:03:470720デフォルトの名無しさん
2010/09/25(土) 01:42:45コンパイラはborland c++、osはwindows 7
#include <stdio.h>
int main(void){
return -1;
}
0721デフォルトの名無しさん
2010/09/25(土) 01:50:590722デフォルトの名無しさん
2010/09/25(土) 01:53:50ただし、プログラムの終了コードとして-1にはならない。
(少なくともUNIXでは)
Windowsはどうだったっけ?
0723デフォルトの名無しさん
2010/09/25(土) 02:07:110724デフォルトの名無しさん
2010/09/25(土) 02:08:18何で確認してるの?w
0725デフォルトの名無しさん
2010/09/25(土) 02:31:52シェルで実行してプロセスの終了コードを取得してチェック
0726デフォルトの名無しさん
2010/09/25(土) 02:38:42どうして stdio.h なんか include してるの?
0727デフォルトの名無しさん
2010/09/25(土) 02:39:05パワーシェルとかいうなよw
Windowsだと、そんな値返ってくるのか。
0728デフォルトの名無しさん
2010/09/25(土) 02:42:440729デフォルトの名無しさん
2010/09/25(土) 02:43:550730デフォルトの名無しさん
2010/09/25(土) 05:06:310731デフォルトの名無しさん
2010/09/25(土) 06:17:5432bit と限らないのでは?
0732デフォルトの名無しさん
2010/09/25(土) 09:54:44UNIXなら終了コードは8ビットだから、0xffffffffにはなりえない。
0733デフォルトの名無しさん
2010/09/25(土) 10:30:450734デフォルトの名無しさん
2010/09/25(土) 12:22:59よくいるタイプリストに追加だな。
0735デフォルトの名無しさん
2010/09/25(土) 12:33:040736デフォルトの名無しさん
2010/09/25(土) 13:20:280737デフォルトの名無しさん
2010/09/25(土) 14:15:14return(-1)もreturn(255)も同じ動作になった
だが、これは単に受け取る側のOSの問題であって
プログラムの終了コードが-1ではないという根拠にはならんぞ?
0738デフォルトの名無しさん
2010/09/25(土) 15:02:38int 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です
0739デフォルトの名無しさん
2010/09/25(土) 15:08:10printfとscanfの位置は本当にそこでいいのか?
0740デフォルトの名無しさん
2010/09/25(土) 15:09:51EOFを入力って何をいってんだ?なんか勘違いしてんな
素直に0を入力したら終了、name[i][0] != '0'で判定
とかにしとけ
0741デフォルトの名無しさん
2010/09/25(土) 15:17:26>>738だとEOFは-1として評価されてる
文字列で評価したいなら文字列比較で判断しないと
0742デフォルトの名無しさん
2010/09/25(土) 15:22:50おかしい所があるのでしょうか…もう少し考えてみます
>>740
そのままfor文に入れてname入力の箇所で0を入力したのですがループから抜けませんでした
>>741
いえ、Ctrl+Dを打ち込んでるんですがループから抜け出せないです
0743デフォルトの名無しさん
2010/09/25(土) 15:34:560744デフォルトの名無しさん
2010/09/25(土) 15:44:320745デフォルトの名無しさん
2010/09/25(土) 15:53:04勉強不足だからかよくわかりません…申し訳ない
>>744
ありがとうございます、ループからは抜けられませんでしたが…
0746デフォルトの名無しさん
2010/09/25(土) 15:54:310747デフォルトの名無しさん
2010/09/25(土) 16:15:190748デフォルトの名無しさん
2010/09/25(土) 16:24:02名前の1文字目で
Alt を押しながらテンキーで 255
と入力すればいいよ。
0749デフォルトの名無しさん
2010/09/25(土) 16:34:04if (scanf("%s", name[i]) != 1) {
break;
}
とかしなされ。
0750デフォルトの名無しさん
2010/09/25(土) 16:52:27あとVC++を利用したほうがいいですか?
0751デフォルトの名無しさん
2010/09/25(土) 16:54:400752デフォルトの名無しさん
2010/09/25(土) 17:04:380753デフォルトの名無しさん
2010/09/25(土) 17:06:27当たり前のようにGUIで入門講義やる教授がいて殴りたくなった
0754デフォルトの名無しさん
2010/09/25(土) 17:08:390755デフォルトの名無しさん
2010/09/25(土) 17:20:53年単位かと。
0756デフォルトの名無しさん
2010/09/25(土) 17:22:08一秒で100メガ処理するためにはどうすればいいですか?
バッファを増やしても変化がありませんでした。
0757デフォルトの名無しさん
2010/09/25(土) 17:23:26EOF は文字ではありません。
ファイルが終了したり、コンソールで特定のキーが押されたときなど、すなわちストリームが終了したときに、getchar() などの関数の返り値が EOF = -1 になるというだけです。
そして、scanf() でストリームの終了を検知するには、scanf() の返り値をみればいいでしょう。
if (scanf("%s", name[i]) == EOF) { ... } で判断すればいいと思います。
0758デフォルトの名無しさん
2010/09/25(土) 17:27:07手頃なTextEditのようなライブラリとかを使わないで、1年以内に
書くことができたら、君はおそらく天才だよ。
0759デフォルトの名無しさん
2010/09/25(土) 17:44:50"EDIT"クラスを使わないで、という意味ね。
それでもASCII文字限定で読み込み・編集・保存だけなら
がんがれば1年くらいあればでできるかもしれん。
TeraPadレベルはエスパーでも時間かかるし大変だと思う。
0760デフォルトの名無しさん
2010/09/25(土) 17:51:02scanf の戻りは値格納した非引数の個数
だから EOF を戻すことは無いかと
0761デフォルトの名無しさん
2010/09/25(土) 17:58:40http://www.linux.or.jp/JM/html/LDP_man-pages/man3/scanf.3.html
入力の最後に達したらEOFが返るって書いてあるけど。
0762デフォルトの名無しさん
2010/09/25(土) 18:02:48ごっめーん EOF返せるね。
%s で受けるなら getchar() 関連併用でのアレも発症しないから検出できるのか
0763デフォルトの名無しさん
2010/09/25(土) 18:46:280764デフォルトの名無しさん
2010/09/25(土) 18:54:35どうしらいいのでしょうか?
0765デフォルトの名無しさん
2010/09/25(土) 18:56:010766デフォルトの名無しさん
2010/09/25(土) 19:01:43srand
0767デフォルトの名無しさん
2010/09/25(土) 19:04:110768デフォルトの名無しさん
2010/09/25(土) 19:13:480769デフォルトの名無しさん
2010/09/25(土) 19:15:150770デフォルトの名無しさん
2010/09/25(土) 19:22:41モンテカルロ法とかのこと?
0771デフォルトの名無しさん
2010/09/25(土) 19:28:46解決しました。ありがとうございます
0772デフォルトの名無しさん
2010/09/25(土) 20:03:38time 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のみかたもよくわかりません。
0773デフォルトの名無しさん
2010/09/25(土) 20:14:18そのバリデーションを行うスレッドと実計算を行うスレッドが
分離されていることも少なくない。システム協調性を高めれば
概してそういう設計にされることが多い。
なんで単純に速度差をアルゴリズムの差と決めつけることも
出来ない。
0774デフォルトの名無しさん
2010/09/25(土) 20:22:32では計測時間のどこまでが反映されているのでしょうか。
アルゴリズム以外でファイルIOの違いで差がつくのでしょうか?
0775デフォルトの名無しさん
2010/09/25(土) 20:22:48すごいですね
0776デフォルトの名無しさん
2010/09/25(土) 20:26:56sysはIOとかシステムコールで、userがアルゴリズムっていうか、
実際のコードの部分。
0777デフォルトの名無しさん
2010/09/25(土) 20:29:10アルゴリズムは単純なのでストリーム暗号として使えると思って
いたのですが、300Mのテキストファイルの暗号化を時間計測
したらこんな結果になりました。opensslのソースを見るしかない
のでしょうか。誰か高速化につながるアイデアを教えてください。
0778デフォルトの名無しさん
2010/09/25(土) 20:33:190779デフォルトの名無しさん
2010/09/25(土) 20:34:300780デフォルトの名無しさん
2010/09/25(土) 20:34:50realが実際に掛かった所要時間。elapsed timeとも。
userがユーザプロセスの消費時間。コアを複数使った場合は実時間より長いことも。
sysがシステムプロセスの消費時間。カーネルの処理時間やI/Oの時間など。
sysを比較すると、grsが若干速い位で大差ない。ディスクキャッシュなどの影響も受けるので、誤差の範囲内か。
userを比較すると、逆にgrsが目立って遅い。
ついでに言えば、user + sys がrealに比してどれもかなり遅い。
恐らく1コア環境で実験しているのじゃないかと愚考するが、
今時そんなレアケースで比較されてもなんとも言えないなぁとミサカはレスしておきます。
0781デフォルトの名無しさん
2010/09/25(土) 20:37:000782デフォルトの名無しさん
2010/09/25(土) 20:38:01要領を得ない質問の仕方をするとは思えないけど。
0783デフォルトの名無しさん
2010/09/25(土) 20:46:41思ったのですがさらに上が。
プロファイルをとるという意味が判らないので教えてください。
どうしてgrsのuserだけがこんなに遅いのか、処理が複雑だからでしょうか。
気になります。ソースを見せてもいいので改善方法を教えてください。
ちょうど乱数の話も出てきたことですし。ちなみに使用環境はVista
セレロンT1600デュアルコアですが並列化はしてません。基本的に
行列演算なのでSSE2を一部使っています。メモリアクセスの遅延も
考えられるのではと思います。何かアドバイスしてください。
0784デフォルトの名無しさん
2010/09/25(土) 20:47:190785デフォルトの名無しさん
2010/09/25(土) 20:48:48GPGは仕組み的にみて全然遅いに決まってる。
というか、GPGより遅かったらストリーム暗号として存在意義が疑わしくなっちゃう
0786デフォルトの名無しさん
2010/09/25(土) 20:53:490787デフォルトの名無しさん
2010/09/25(土) 20:56:17コンパイルオプションです。
0788デフォルトの名無しさん
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
0789デフォルトの名無しさん
2010/09/25(土) 21:03:18>プロファイルをとるという意味が判らないので教えてください。
プロファイルは必ずしも正しい結果でないことを予めご承知置きしてね。
使ってるのは恐らくgccだと思うので、
-pg オプションつけてコンパイル。
それでバイナリを実行するとgmon.outという計測結果も出力される。
gprof [実行ファイル名] で計測結果を出力。
gccだと確か最適化ONでもプロファイルできた気がする。
詳細はググってほしい。
ところでまず暗号化せずにファイルを読み込むだけの時間を計測してみては?
0790デフォルトの名無しさん
2010/09/25(土) 21:13:22real 0m10.935s
user 0m0.327s
sys 0m0.857s
読み書きだけでこれだけかかってます。
0791デフォルトの名無しさん
2010/09/25(土) 21:16:160792デフォルトの名無しさん
2010/09/25(土) 21:18:470793デフォルトの名無しさん
2010/09/25(土) 21:19:31読書きだけでOpenSSLと互角じゃないですかw
>>773の指摘の線も調べてみてください。
ディスクからの読み書きブロッキング中に別スレッドで
暗号化している可能性があると思います。
私だったら途中でデバッガをアタッチしてブレークしてみるとか、
ProcessExplorerで見るとか、します。
それからもしかしてcygwinですか?
0794デフォルトの名無しさん
2010/09/25(土) 21:20:39そうだなあ…
Cだよね?
longjmp使って、例外のようなエラーハンドラ作れるようになる。
自分でクラス構造体を作ってオブジェクト指向プログラミングを実装できる。
くらいできれば、1人前でいいんじゃないかなw
0795デフォルトの名無しさん
2010/09/25(土) 21:20:44本やサイトなどに載っているサンプルを写しただけのとは異なる、自分で考えた新しいプログラム(内容は何でもいい)を作れたら
0796デフォルトの名無しさん
2010/09/25(土) 21:24:530797デフォルトの名無しさん
2010/09/25(土) 21:25:13773の意味がわかりません。Cygwin32で実行してます。
どうしてOpenSSLはこんなに早いんでしょう。
0798デフォルトの名無しさん
2010/09/25(土) 21:27:08それはもう上級者と言っていいレベルじゃないかな
0799デフォルトの名無しさん
2010/09/25(土) 21:28:210800デフォルトの名無しさん
2010/09/25(土) 21:28:51// 暗号化処理
fwrite(buff,1,read_size,fp);
}
こんな感じで。
0801デフォルトの名無しさん
2010/09/25(土) 21:31:040802デフォルトの名無しさん
2010/09/25(土) 21:32:05MVCパターン風には書けると思う
0803デフォルトの名無しさん
2010/09/25(土) 21:33:440804デフォルトの名無しさん
2010/09/25(土) 21:38:00つまり、暗号化よりもディスクの読書きが遅いということです。
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
みたいな感じでやってると思います。
0805デフォルトの名無しさん
2010/09/25(土) 21:42:24簡単にできることなんですか?マルチコアでなくても効果があるのですか?
0806デフォルトの名無しさん
2010/09/25(土) 21:45:01ディスクアクセスが無視できるレベルになるから
0807デフォルトの名無しさん
2010/09/25(土) 21:48:34スレッド2:アイドル→読み込み2→暗号化2→書き込み2
スレッド3:アイドル→アイドル→読み込み3→暗号化3→書き込み3
0808デフォルトの名無しさん
2010/09/25(土) 21:50:15いまRAMが余ってないので実験できませんが、他に高速化できそうな
方法はないのですか?fread/fwrite以外の方法で。
0809デフォルトの名無しさん
2010/09/25(土) 21:52:020810デフォルトの名無しさん
2010/09/25(土) 21:53:03なんでやばいの?
Notepadで書く奴がいるくらいだw
秀丸使ったって全然問題ないだろう。
0811デフォルトの名無しさん
2010/09/25(土) 21:54:240812デフォルトの名無しさん
2010/09/25(土) 21:55:140813デフォルトの名無しさん
2010/09/25(土) 22:00:540814デフォルトの名無しさん
2010/09/25(土) 22:01:160815デフォルトの名無しさん
2010/09/25(土) 22:04:41せめてex
0816デフォルトの名無しさん
2010/09/25(土) 22:10:130817デフォルトの名無しさん
2010/09/25(土) 22:16:030818デフォルトの名無しさん
2010/09/25(土) 22:16:49後は実装方法だけ。
0819デフォルトの名無しさん
2010/09/25(土) 22:20:52秀丸使うこと自体がアレな感じだけど。
0820デフォルトの名無しさん
2010/09/25(土) 22:24:220821デフォルトの名無しさん
2010/09/25(土) 22:30:31ttp://www.vector.co.jp/soft/winnt/writing/se028211.html
のソースを少し変更して再コンパイルしたものを使ってる
0822デフォルトの名無しさん
2010/09/25(土) 22:31:39処理は遅いことのほうが多いんじゃね?
ただしこの分離モデルはストリーミング(コマンドライン上から
パイプラインで処理できることに対応)とか、IPCとかSocketとか
で複数のプロセスと通信したりするようなケースでは良く取られる
0823デフォルトの名無しさん
2010/09/25(土) 22:38:500824デフォルトの名無しさん
2010/09/25(土) 22:42:48読み込みサイズの1024を
4096とか64*1024とかに変えてみて
時間を測ってみたら
0825デフォルトの名無しさん
2010/09/25(土) 22:45:360826デフォルトの名無しさん
2010/09/25(土) 22:48:050827デフォルトの名無しさん
2010/09/25(土) 22:49:43全然変わらない。
0828デフォルトの名無しさん
2010/09/25(土) 22:52:15使ってる連中、すごいダメそう。
0829デフォルトの名無しさん
2010/09/25(土) 23:04:12そうなんです。あこがれの RMS のつくった‥‥‥、xyzzy って日本人でしたっけ。
0830デフォルトの名無しさん
2010/09/25(土) 23:05:410831デフォルトの名無しさん
2010/09/25(土) 23:05:59オプションで調節できないところでイライラって結構あるからね
俺は昔の VC とか好きだったけど、あの会社の常で勝手にいらんことするようになって心が離れた
vi はさすがに見劣りはするけど今でも一目置いてるご長寿さんだ
0832デフォルトの名無しさん
2010/09/25(土) 23:07:330833デフォルトの名無しさん
2010/09/25(土) 23:08:590834デフォルトの名無しさん
2010/09/25(土) 23:13:070835デフォルトの名無しさん
2010/09/25(土) 23:14:48おれはIDE派だから使わないけど、VSやらEclipseにviのキーアサインが
あったらそれ使う。
0836デフォルトの名無しさん
2010/09/25(土) 23:21:49その方法だと3つのスレッドが同時に読み込みに行ったりしないか?
>>818
ディスク読書きだけで10秒、暗号化含めると18秒なら、
暗号化で8秒近くかかってるって考えていいんじゃないですかね。
0837デフォルトの名無しさん
2010/09/25(土) 23:23:430838デフォルトの名無しさん
2010/09/25(土) 23:25:02emacsは習得には時間がかかるが、習得すればこれ以上のエディタはないぞw
まさにプロユースw
0839デフォルトの名無しさん
2010/09/25(土) 23:26:46探しても見つからないんだが。
0840デフォルトの名無しさん
2010/09/25(土) 23:27:25300Mのファイルですが。
0841デフォルトの名無しさん
2010/09/25(土) 23:29:06300Mだと読んで書くだけでそのくらいかかるんじゃない?
0842デフォルトの名無しさん
2010/09/25(土) 23:30:520843デフォルトの名無しさん
2010/09/25(土) 23:30:56ああ、Finalでしょw
FINAL,RED,MIFESはPC-98時代の3大エディタw
0844デフォルトの名無しさん
2010/09/25(土) 23:31:04この高速化の秘密は何?!
0845デフォルトの名無しさん
2010/09/25(土) 23:31:10ファイルを分割してマルチスレットで暗号化して結合は?
0846デフォルトの名無しさん
2010/09/25(土) 23:33:090847デフォルトの名無しさん
2010/09/25(土) 23:34:120848デフォルトの名無しさん
2010/09/25(土) 23:35:10最後に結合してるのかもしれないけど。
0849デフォルトの名無しさん
2010/09/25(土) 23:36:000850デフォルトの名無しさん
2010/09/25(土) 23:37:250851デフォルトの名無しさん
2010/09/25(土) 23:42:33emacsはエディタじゃないから。
0852デフォルトの名無しさん
2010/09/25(土) 23:47:11int 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);
}
}
0853デフォルトの名無しさん
2010/09/25(土) 23:49:05Vz ははいらないのかそうなのか
0854デフォルトの名無しさん
2010/09/25(土) 23:49:48emacsはエディタでもある。
0855デフォルトの名無しさん
2010/09/25(土) 23:56:13処理の途中で状態を保存してreturnして、制御がきたら前回の続きから
はじめるとか考えなくていいから、そう書くよりロジック書くのは楽だな。
0856デフォルトの名無しさん
2010/09/25(土) 23:56:55VZはちょっと後発なのよね。
最終的にはVZが席捲するんだが、その時にはPCの主役も
PC-98からDOS/Vと言われたIBM互換機になっていた…w
0857デフォルトの名無しさん
2010/09/25(土) 23:57:51そんな考え方してたらマルチスレッドプログラミングで間違いなく死ぬ
0858デフォルトの名無しさん
2010/09/26(日) 00:01:15考え方も何もそれってノンプリエンプティブマルチタスクのディスパッチャだろ
0859デフォルトの名無しさん
2010/09/26(日) 00:10:420860デフォルトの名無しさん
2010/09/26(日) 00:25:07知らないうちは何か高度なことだと重いがちだけど。
0861デフォルトの名無しさん
2010/09/26(日) 00:26:380862デフォルトの名無しさん
2010/09/26(日) 01:01:23http://www.amazon.co.jp/新版暗号技術入門-秘密の国のアリス-結城-浩/dp/4797350997/
0863デフォルトの名無しさん
2010/09/26(日) 01:03:22その方法だとECBにしか対応できない。
0864デフォルトの名無しさん
2010/09/26(日) 01:04:01後発と言うか、Vzとして公開されてから見知った人にとってはそうかもしれないが、
それ以前にEzとして既に我々の間では広く普及していた。
0865デフォルトの名無しさん
2010/09/26(日) 01:06:38かんたんにクラックできる暗号作ってなにやってんの?
0866デフォルトの名無しさん
2010/09/26(日) 01:17:15だからストリーム暗号だって言ってるだろ。
0867デフォルトの名無しさん
2010/09/26(日) 01:17:57悪いこと言わないから、Cのコーディングや実行速度に気をとられてないで
>>862見たいな本でまず有効な暗号とはどんなものなのかについて学べ。
そして、今ある有効な暗号化のアルゴリズムを使って実装するべき。
0868デフォルトの名無しさん
2010/09/26(日) 01:21:420869デフォルトの名無しさん
2010/09/26(日) 01:23:01使う暗号アルゴリズムは指定されてるんじゃないの。
0870デフォルトの名無しさん
2010/09/26(日) 01:23:060871デフォルトの名無しさん
2010/09/26(日) 01:24:03頑張れ
0872デフォルトの名無しさん
2010/09/26(日) 01:25:250873デフォルトの名無しさん
2010/09/26(日) 01:30:09それを上記の文章から読み取れないお前がプログラムを弄れるとは思えない
0874デフォルトの名無しさん
2010/09/26(日) 01:32:130875デフォルトの名無しさん
2010/09/26(日) 01:33:570876デフォルトの名無しさん
2010/09/26(日) 01:35:51作り方教えろ
0877デフォルトの名無しさん
2010/09/26(日) 01:38:250878デフォルトの名無しさん
2010/09/26(日) 01:39:400879デフォルトの名無しさん
2010/09/26(日) 02:03:04>>874は4流ということでいいからおまえが作れ3流
0880デフォルトの名無しさん
2010/09/26(日) 02:06:090881デフォルトの名無しさん
2010/09/26(日) 02:22:33まず、-O2のみで時間測って、どんくらい違うか調べたら
0882デフォルトの名無しさん
2010/09/26(日) 02:23:02俺(メインスレッド)は今の仕事(メイン関数)を続けるから
誰か(サブスレッド)あの仕事(他の関数)を処理しといて
0883デフォルトの名無しさん
2010/09/26(日) 02:30:56・・・
この資料借りていいっすか?
え、だめ?
じゃあちょっと横で待ってますね
・・・
あ、終わりました?じゃあ借りてきますね
え?やっぱ返せ?いや、でもこっちも仕事しないと
・・・
ふ〜終わった、あー、資料返しますね
・・・
ひまだなー、仕事ないかなー(ちらっ
こんな感じかな
0884デフォルトの名無しさん
2010/09/26(日) 02:47:48コア増やしただけのCPUを正当化するための詭弁だよ。
0885デフォルトの名無しさん
2010/09/26(日) 02:54:55ttp://www10.atwiki.jp/gavotterd/
これでやってみて、OS使用領域からも横取り出来るはずだから
0886デフォルトの名無しさん
2010/09/26(日) 04:31:090887デフォルトの名無しさん
2010/09/26(日) 04:34:320888デフォルトの名無しさん
2010/09/26(日) 04:37:04だめですw
まず、そもそも、メモリは有限です。仮想メモリがあろうがなかろうが、
無限のメモリなんてありません。書きつづければどこかで切れますw
アドレス演算は符号なしですが、結局のところ、最大値を越えれば0に
戻ります。よって、この理屈だけでも最終的にはすべてのメモリを破壊
してしまうことがわかります。
で、実際には、nameがどこを指しているかにもよりますが、スタックか
ヒープを破壊して、Segmentation Faultになりますw
0889デフォルトの名無しさん
2010/09/26(日) 04:44:52>>888
ありがとう。
ちょっとポインタと配列の関係が上手く理解できてないみたいです。
配列の先頭アドレスにchar型のポインタを代入しようとしたりw
0890デフォルトの名無しさん
2010/09/26(日) 06:52:47すればいいのかわかりません。
0891デフォルトの名無しさん
2010/09/26(日) 06:57:380892デフォルトの名無しさん
2010/09/26(日) 07:45:20でも最適化オプション付けてもgccの2倍以上実行時間がかかります。
何が悪いのでしょう。
0893デフォルトの名無しさん
2010/09/26(日) 08:29:59あんたの頭。
0894デフォルトの名無しさん
2010/09/26(日) 09:04:51WINで動くアプリ作ろうとすると何が何だか。
同じプログラムなのに動作速度が違うなんて。
0895デフォルトの名無しさん
2010/09/26(日) 09:22:330896デフォルトの名無しさん
2010/09/26(日) 09:27:590897デフォルトの名無しさん
2010/09/26(日) 09:33:210898デフォルトの名無しさん
2010/09/26(日) 09:38:15それでWINとCygwinで実行結果が合わなくておかしなことになってます。
ハッシュ関数の値が実行する環境によって変化します。バグです。
0899デフォルトの名無しさん
2010/09/26(日) 09:44:070900デフォルトの名無しさん
2010/09/26(日) 09:48:070901デフォルトの名無しさん
2010/09/26(日) 09:49:32ハッシュ関数を自作すればいいのでは?
0902デフォルトの名無しさん
2010/09/26(日) 09:51:030903デフォルトの名無しさん
2010/09/26(日) 09:58:470904デフォルトの名無しさん
2010/09/26(日) 10:03:24メニュー→デバッグ→ソリューションのビルド
0905デフォルトの名無しさん
2010/09/26(日) 10:05:38出力ファイルが勝手にプロテクトされてるし。
VCはわけわからん。
0906デフォルトの名無しさん
2010/09/26(日) 10:08:41>実行時間が遅すぎる。35秒もかかる。
たぶんそれがこの差。
0907デフォルトの名無しさん
2010/09/26(日) 10:09:580908デフォルトの名無しさん
2010/09/26(日) 10:11:370909デフォルトの名無しさん
2010/09/26(日) 10:20:38vz自身も、dos/vが流行るだいぶ前から大ヒットしてたような記憶があるけど。
0910デフォルトの名無しさん
2010/09/26(日) 10:21:310911デフォルトの名無しさん
2010/09/26(日) 10:23:080912デフォルトの名無しさん
2010/09/26(日) 10:25:490913デフォルトの名無しさん
2010/09/26(日) 12:15:400914デフォルトの名無しさん
2010/09/26(日) 12:39:140915デフォルトの名無しさん
2010/09/26(日) 12:39:58最悪の場合人が死にます
0916デフォルトの名無しさん
2010/09/26(日) 12:41:07intel parallel composer2011
0917デフォルトの名無しさん
2010/09/26(日) 12:43:250918デフォルトの名無しさん
2010/09/26(日) 13:22:33Cygwinで同じバイナリを実行した結果が違うのはなぜですか。
0919デフォルトの名無しさん
2010/09/26(日) 13:26:45コードを見せて。
0920デフォルトの名無しさん
2010/09/26(日) 13:35:07int 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);
}
0921デフォルトの名無しさん
2010/09/26(日) 13:39:04おいこらいい加減うるせーぞ。そもそも結果が安定しているかどうか聞いただろうボケ。
0922デフォルトの名無しさん
2010/09/26(日) 13:41:39質問とは関係ないけど、&fとか&ffってところは0xf、0xffの間違い?
0923デフォルトの名無しさん
2010/09/26(日) 13:42:55WIN上で動くようにしようとして混乱してます。
どうもすみません。
コンパイラによってなぜ結果が変わるのか理解できません。
0924デフォルトの名無しさん
2010/09/26(日) 13:44:200925デフォルトの名無しさん
2010/09/26(日) 13:44:38c1.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;
}
0926デフォルトの名無しさん
2010/09/26(日) 13:50:18こないだ説明しただろ、安定しないのはディスクキャッシュが原因だ。
全部読み込んでからメモリ上でやってその部分だけ測るか(もちろん出力もメモリ)RAMディスクでも使え。
0927デフォルトの名無しさん
2010/09/26(日) 13:50:21ハッシュ関数なんていうのは一致がとれないといけないので困っていました。
0928デフォルトの名無しさん
2010/09/26(日) 13:55:42出力結果が違うのは異常。
0929デフォルトの名無しさん
2010/09/26(日) 13:56:460930デフォルトの名無しさん
2010/09/26(日) 14:03:020931デフォルトの名無しさん
2010/09/26(日) 14:03:41コンパイラに依存した書き方をしてるんでしょ。
0932デフォルトの名無しさん
2010/09/26(日) 14:03:510933デフォルトの名無しさん
2010/09/26(日) 14:04:130934デフォルトの名無しさん
2010/09/26(日) 14:10:530935デフォルトの名無しさん
2010/09/26(日) 14:18:130936デフォルトの名無しさん
2010/09/26(日) 14:22:570937デフォルトの名無しさん
2010/09/26(日) 14:29:32もう920でソースを公開しました。
0938デフォルトの名無しさん
2010/09/26(日) 14:31:190939デフォルトの名無しさん
2010/09/26(日) 14:41:40値が変わるという現象が起きます。
最適化しないとおこりません。GCCでは最適化してもしなくても値は
変わりません。ただしVCでコンパイルした実行結果とGCCの実行結果
は同じソースなのに違う値が出ます。なぜ?!
0940デフォルトの名無しさん
2010/09/26(日) 14:44:100941デフォルトの名無しさん
2010/09/26(日) 14:50:19なんで情報小出しにするんですか?
0942デフォルトの名無しさん
2010/09/26(日) 14:54:080943デフォルトの名無しさん
2010/09/26(日) 14:54:57だとしたら、どこかのアップローダーに上げてリンク貼ればいいよ
0944デフォルトの名無しさん
2010/09/26(日) 14:56:08RAMディスクの作り方、使い方がわかりません。
もうVC諦めてGCC一本にしようかな。
0945デフォルトの名無しさん
2010/09/26(日) 15:00:16うpしました。よろしくお願いします。
0946デフォルトの名無しさん
2010/09/26(日) 15:04:01ttp://codepad.org/
RAMディスク俺はImDisk使ってる。他のは知らん。
ttp://www.ltr-data.se/opencode.html
0947デフォルトの名無しさん
2010/09/26(日) 15:10:28s5のb, codeのuが初期化されていない。
初心者は-Wallをつけて、警告を全部とる事。
0948デフォルトの名無しさん
2010/09/26(日) 15:15:310949デフォルトの名無しさん
2010/09/26(日) 15:17:040950デフォルトの名無しさん
2010/09/26(日) 15:19:120951デフォルトの名無しさん
2010/09/26(日) 15:19:350952デフォルトの名無しさん
2010/09/26(日) 15:20:050953デフォルトの名無しさん
2010/09/26(日) 15:21:47for(j=0;j<2;j++)
g[i][j]=0;
// printf("debug1\n");
}
この部分で配列オーバーしてね?
0954デフォルトの名無しさん
2010/09/26(日) 15:23:520955デフォルトの名無しさん
2010/09/26(日) 15:31:260956デフォルトの名無しさん
2010/09/26(日) 15:33:15ファイル読み込むならそれもアップしろよ
0957デフォルトの名無しさん
2010/09/26(日) 15:33:530958デフォルトの名無しさん
2010/09/26(日) 15:36:12>>947が未初期化変数があるとか言ってなかったっけ?
cygwinもVCもないから中見てないけど直したの?
0959デフォルトの名無しさん
2010/09/26(日) 15:36:18データファイルは大きすぎてうpできません。
何か適当なファイルでテストしてやってください。
0960デフォルトの名無しさん
2010/09/26(日) 15:37:170961デフォルトの名無しさん
2010/09/26(日) 15:37:270962デフォルトの名無しさん
2010/09/26(日) 15:39:190963デフォルトの名無しさん
2010/09/26(日) 15:40:490964デフォルトの名無しさん
2010/09/26(日) 15:41:51GCCって変数宣言すると自動的に初期化するってことですかね。
さすがはプロ!皆様ありがとうございました!
0965デフォルトの名無しさん
2010/09/26(日) 15:44:400966デフォルトの名無しさん
2010/09/26(日) 15:48:590967デフォルトの名無しさん
2010/09/26(日) 15:49:310968デフォルトの名無しさん
2010/09/26(日) 15:49:50>さすがはプロ!
いや、ほとんど学生、趣味プログラマなんだが...
0969デフォルトの名無しさん
2010/09/26(日) 15:53:040970デフォルトの名無しさん
2010/09/26(日) 15:54:120971デフォルトの名無しさん
2010/09/26(日) 15:57:390972デフォルトの名無しさん
2010/09/26(日) 15:58:02このハッシュ関数の基本原理を知りたくないですか?
0973デフォルトの名無しさん
2010/09/26(日) 15:59:240974デフォルトの名無しさん
2010/09/26(日) 16:00:130975デフォルトの名無しさん
2010/09/26(日) 16:01:440976デフォルトの名無しさん
2010/09/26(日) 16:01:560977デフォルトの名無しさん
2010/09/26(日) 16:02:040978デフォルトの名無しさん
2010/09/26(日) 16:09:28md5とかshaなら実装したことあるけどopensslなんてアセンブラだたよ
研究でアセンブラは要らないと思うけど分かりやすく無駄のないコードにはしないとね
0979デフォルトの名無しさん
2010/09/26(日) 16:09:38位で安定しました。データファイルは300Mです。
0980デフォルトの名無しさん
2010/09/26(日) 16:22:15cygwinだと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
0981デフォルトの名無しさん
2010/09/26(日) 16:32:06> GCCって変数宣言すると自動的に初期化するってことですかね。
そのプログラムで偶々0だっただけ。つまりまぐれで動いていた。
0982デフォルトの名無しさん
2010/09/26(日) 16:41:150983デフォルトの名無しさん
2010/09/26(日) 16:44:19gcc 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とも比べてみました。
別段早くないですね。
0984デフォルトの名無しさん
2010/09/26(日) 16:46:240985デフォルトの名無しさん
2010/09/26(日) 16:48:400986デフォルトの名無しさん
2010/09/26(日) 16:49:530987デフォルトの名無しさん
2010/09/26(日) 16:50:550988デフォルトの名無しさん
2010/09/26(日) 16:52:450989デフォルトの名無しさん
2010/09/26(日) 16:53:58sse使えと言ったのはアセンブリで書けと言う意味だ。
0990デフォルトの名無しさん
2010/09/26(日) 17:00:44ポインタ渡しでやると結果が変わったんだけど
0991デフォルトの名無しさん
2010/09/26(日) 17:02:15を高速化できます。基本的に行列演算なのでその部分も利用してます。
ていうか少しは速くなってるはず。
0992デフォルトの名無しさん
2010/09/26(日) 17:04:32普通に共用体で渡せるんじゃないかな。
0993デフォルトの名無しさん
2010/09/26(日) 17:07:06SSE2命令は整数演算もサポートしているけれど、gccはそれを使って整数演算を最適化しない。
"-msse2"って書いただろ。良く読め。
0994デフォルトの名無しさん
2010/09/26(日) 17:11:35なんとも使い物にならない似非暗号化プログラムが出来上がったわけだが。
0995デフォルトの名無しさん
2010/09/26(日) 17:11:36s5の中の出る直前のccのダンプと
s5出たあとのccのダンプ比較してみたら
0996デフォルトの名無しさん
2010/09/26(日) 17:14:42gcc -O2 -S 945.c; mv 945.s 945-nosse.s ;gcc -O2 -msse2 -S 945.c; cmp 945-nosse.s 945.s
アセンブラ吐かせても一行も異なっていないが、どういう原理で「少しは速くなる」んだよ。
0997デフォルトの名無しさん
2010/09/26(日) 17:14:520998デフォルトの名無しさん
2010/09/26(日) 17:16:26誰か暗号化プログラム専用スレ立てれ。
0999デフォルトの名無しさん
2010/09/26(日) 17:17:55宣言
void s5(on *cc);
呼び出し方
s5(&c1);
s5(&c2);
1000デフォルトの名無しさん
2010/09/26(日) 17:18:0010011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。