C言語なら俺に聞け(入門篇) Part 12at TECH
C言語なら俺に聞け(入門篇) Part 12 - 暇つぶし2ch945:デフォルトの名無しさん
07/05/15 13:48:36
>>940
マルチ乙。
加減算も自分でやったんじゃないんだろ?w

Hackmem とかhacker's delight で調べてみ。
日本語訳も出版されている。


946:デフォルトの名無しさん
07/05/15 13:51:21
掛け算だけにマルチ


いやスミマセン

947:デフォルトの名無しさん
07/05/15 13:53:30
掛け算を足し算のループに変えてオーバーフローを検出くらいしか思い浮かばん…
負数は先読み計算で。

948:デフォルトの名無しさん
07/05/15 13:59:21
MSBのbit位置テーブル作っといてlookupすりゃええんちゃうの?


949:デフォルトの名無しさん
07/05/15 14:02:51
レスありがとうございます。確かにlongが使えるといいのですが、使っちゃ駄目みたいです。ちなみに先ほどのコードを使用して動かしてみました。全ては試していないのですが、
-2147483648 * -1 = -2147483648や
 2147483647 * -1 = オーバーフローと
なってしまいます。上はオーバーフローに下は
-2147483647になるようにしたいのですが、中々上手くいきません。
どうすればよいでしょうか?よろしくお願いします。



950:デフォルトの名無しさん
07/05/15 14:21:43
2進数のまま手計算してみれば?
途中経過のビットも出力して確認しながらやれよ。

951:デフォルトの名無しさん
07/05/15 14:28:25
これでダメな場合って lop==0 の時以外にあるかな?
result=lop*rop;
if(result/lop!=rop) オーバーフロー

952:デフォルトの名無しさん
07/05/15 14:54:12
>>951
っ lop=-1 rop=INT_MIN

953:デフォルトの名無しさん
07/05/15 14:56:41
>>940
加減算のオーバーフローチェックはどうやったの?

954:デフォルトの名無しさん
07/05/15 15:04:30
>>952
これやったら落ちてビビった (MacOSX 10.4.9 Intel Core 2 Duo)

955:デフォルトの名無しさん
07/05/15 15:11:19
>>954
>>952 で同じく落ちた (Win98SE C7 600MHz)

なんと言うか恐ろしい計算だw

956:デフォルトの名無しさん
07/05/15 15:29:19
>>952
これ反則だよなあ。普通の計算でも起こり得りそうで困る。

957:デフォルトの名無しさん
07/05/15 15:40:55
gccで落ちたコードの核になる部分だけ抽出。
--
movl $-2147483648, %eax
movl $-1, %ecx
idivl %ecx
--
うーん、-1で割っているだけなのに。

958:デフォルトの名無しさん
07/05/15 15:49:53
これは勉強になった。

959:デフォルトの名無しさん
07/05/15 15:53:22
>>952
C#でも落ちるかなと思ったけどOverflowExceptionが出るだけだった。

960:デフォルトの名無しさん
07/05/15 15:57:11
>>959
Exception をキャッチしてないからCだと落ちる っつーことっしょ

961:デフォルトの名無しさん
07/05/15 16:04:16
Instruction Set Reference の idiv の項を見てみた。

例外 #DE (divide error)

1. 除数が 0 の場合
2. 商が大きすぎる/小さすぎる場合

の、2. に引っかかってるみたいね。
アセンブラレベルで QWORD で使うなら十分起こりうる状況だけど、
int でやってる限りは -2147483648 / -1 でしか起こらないよね、これ。
こりゃ盲点だわ。

962:デフォルトの名無しさん
07/05/15 16:07:44
実数でも同じことできる?

963:デフォルトの名無しさん
07/05/15 16:14:23
どうでもいいけど、Linuxだと"Floating point exception"って出るんだよな。
どこがFloatingPointなんだか。

964:デフォルトの名無しさん
07/05/15 16:15:41
gcc@MacOSX でもそう出る。
イミフ。

965:デフォルトの名無しさん
07/05/15 16:15:56
>>962
起きなかった

966:デフォルトの名無しさん
07/05/15 16:18:14
実数は普通の演算で例外起きたっけ?

967:デフォルトの名無しさん
07/05/15 16:19:32
もう面毒せーから1/0=πという数学体系を新たに定義しようぜ

968:デフォルトの名無しさん
07/05/15 16:22:10
移項すると 1 = π × 0 になるんだけど

969:デフォルトの名無しさん
07/05/15 16:23:16
その定義上ではその移項自体がまた特殊な扱いになるのか。

970:デフォルトの名無しさん
07/05/15 16:47:17
>>963
English WikiからSIGFPEの項より
>Although SIGFPE does not necessarily involve floating-point arithmetic, there is no way to change its name without breaking backward compatibility.

971:デフォルトの名無しさん
07/05/15 17:50:56
可換環じゃなかったら最早普通の計算に使えないなw

972:デフォルトの名無しさん
07/05/15 18:17:22
次のような関数を作っていて、test3の直前でセグメントエラーが
出てしまい困っています。
R[]はintのポインタの配列で、疑似二次元配列です。
R[i]とy[]のなかで共通する数をR[i+1]に代入して、
最後に0を入れる関数です。
どうしてエラーが出るのか、誰か教えてください。

void katu(int *R[], const int i, const int y[]){
  int a=0, b=0, k=0;

  for(a=0; a<N; a++){
    for(b=0; b<N; b++){
      if(R[i][a] == y[b]){
        print("test1\n");
        realloc(R[i+1], sizeof(int)*(k+2));
        printf("test2\n");
        R[i+1][k] = y[b];
        printf("test3\n");
        k++;
      }
      if(y[b] <= 0)
        break;
    }
    if(R[i][a] <= 0)
      break;
  }
  R[i+1][k] = 0;

  return;
}


973:デフォルトの名無しさん
07/05/15 18:20:50
>>972
reallocの戻り値捨ててどうするんだよ。
reallocが成功したら元の領域はアクセスできなくなる。

974:デフォルトの名無しさん
07/05/15 18:22:18
>>972
realloc()の使い方を勉強しろ。

それはさておき、一文字変数は判り難いだけだから止めた方がいいぞ。
#特に引き数iなんて、誤解してくれと言わんばかりだ。

975:デフォルトの名無しさん
07/05/15 18:24:42
i は for ループのカウンタ以外では使わないほうがいいかもw

976:デフォルトの名無しさん
07/05/15 18:32:47
一文字変数はカウンタくらいしか使わないな

977:デフォルトの名無しさん
07/05/15 18:32:48
aとかbをループ変数にするのはなんかいやだな。

978:デフォルトの名無しさん
07/05/15 18:34:57
(滅多に使わない)数式の実装ではまんま1文字変数使うこと多い
# コメントで参考書名+page 書いとくが

979:デフォルトの名無しさん
07/05/15 18:37:50
数式をコメントに入れておくなあ、そういう場合。

980:デフォルトの名無しさん
07/05/15 18:40:42
>>979
数行オーダーの数式なら、そうするほうが多いけどね。
RGB⇔HSV変換とかの 条件付な式だとコメント書きにくいねぇ (で、リファレンス書いて終了w)

981:デフォルトの名無しさん
07/05/15 18:48:04
こういうアルゴリズムでーす後はググれって感じでコメント書く。

982:972
07/05/15 19:18:53
>>973-974
ありがとうございます。
realloc(R[i+1], sizeof(int)*(k+2));
を、
R[i+1] = realloc(R[i+1], sizeof(int)*(k+2));
にしたら無事に動くようになりました。
結果が正しいかはこれから検討する所でありますが。

今回初めてreallocを使ってみたので、本当に間抜けなことをしていました。
重ね重ね、ありがとうございます。

変数についてですが、どうにもうまい名前の付け方が思い付きませんorz。
他の方のソースを読んで勉強していくしかないのでしょうか?

983:デフォルトの名無しさん
07/05/15 19:24:18
>>982
変数名を思いつけないと言うことは、書いているものが理解できていないか説明できないかのどちらかだろう。
前者は問題外だが、後者も社会人として必要な能力だ。「相手に伝える」ことを念頭に入れて、
変数の説明をする積もりで名前をつけてみるといい。

984:デフォルトの名無しさん
07/05/15 19:35:27
例えばこんな感じですね

int i
int love, you

985:デフォルトの名無しさん
07/05/15 19:39:59
>>984
あーそれは、愛のあるいい変数名だね。
って、違うでしょ。

986:972
07/05/15 19:42:35
>>983
「相手に伝える」ですか。心がけてみます。
どうもありがとうございます。

987:デフォルトの名無しさん
07/05/15 19:52:03
変数名なんて、それが何を入れとくための奴なのか分かるんならなんでもいいよ

988:デフォルトの名無しさん
07/05/15 19:58:41
VisualC++.NETならばC言語で.NETを使えますか?

989:デフォルトの名無しさん
07/05/15 20:11:54
いいえ。
VS2003ならMC++, VS2005ならC++/CLIでのみ.NETを使えます。

990:デフォルトの名無しさん
07/05/15 20:12:27
いいえ、専用に構文が拡張されたC++になります。

991:デフォルトの名無しさん
07/05/15 20:17:00
自前でホスティングすれば使えなくもないだろう。

992:デフォルトの名無しさん
07/05/15 20:28:25
// 次スレテンプレ

C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 12
スレリンク(tech板)

過去スレ
Part 1 スレリンク(tech板) Part 2 スレリンク(tech板)
Part 3 スレリンク(tech板) Part 4 スレリンク(tech板)
Part 5 スレリンク(tech板) Part 6 スレリンク(tech板)
Part 7 スレリンク(tech板) Part 8 スレリンク(tech板)
Part 9 スレリンク(tech板) Part 10 スレリンク(tech板)
Part 11 スレリンク(tech板)

993:デフォルトの名無しさん
07/05/15 20:29:05
関連スレ
C/C++の宿題を片付けます 86代目
スレリンク(tech板)
くだすれC言語(初心者用) Part.2
スレリンク(tech板)
スレを勃てるまでもないC/C++の質問はここで 2
スレリンク(tech板)
はきだめC/C++下級者の質問箱 2
スレリンク(tech板)

関連リンク
C 関数検索 man on WWW
URLリンク(www.linux.or.jp)
初心者のためのポイント学習C言語
URLリンク(www9.plala.or.jp)

// ここまでテンプレ

994:気まぐれアナスイ
07/05/15 20:32:34
984 differ:char 5,6,7,8,9 line 4
!(Φ_Φ+){level}

995:デフォルトの名無しさん
07/05/15 20:33:11
Cスレ乱立しすぎ
こっちへ吸収されていいと思う

【初心者歓迎】C/C++室 Ver.37【環境依存OK】
スレリンク(tech板)l50
くだすれC言語(初心者用) Part.2
スレリンク(tech板)l50

996:気まぐれアナスイ
07/05/15 21:57:37
吸収も良いですが?
スレを、そちらに変更?

997:デフォルトの名無しさん
07/05/15 22:13:54
実行の様子をテキストファイルとして作成する方法を知りたいのですが、windowsの場合どうすればいいのでしょうか?
Linuxなら./program > text.txtとするらしいのですが、windowsの場合がわかりません

998:デフォルトの名無しさん
07/05/15 22:15:03
>>997
同じ事やってみた?

999:デフォルトの名無しさん
07/05/15 22:17:13
なぜ試さない?

1000:デフォルトの名無しさん
07/05/15 22:17:54
1000ゲット

1001:1001
Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch