C言語なら俺に聞け(入門編)Part 61 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
10/03/05 23:27:18
C言語の*入門者*向け解説スレッドです。
★前スレ
C言語なら俺に聞け(入門編)Part 60
スレリンク(tech板)
★過去スレ
URLリンク(makimo.to:8000)
★初心者、初級者の方は他の質問スレのほうが良いかもしれません。
例えば
【初心者歓迎】C/C++室 Ver.72【環境依存OK】
スレリンク(tech板)
とか
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 134代目
スレリンク(tech板)
★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

2:デフォルトの名無しさん
10/03/05 23:30:36
           ,.――‐ 、
          /      ,.―`.ヽ
        /   |   /:/: :ィ: : : : :\
        / .f⌒h/`:/l:/^\:/l:/: :|`     ゲ  な
        〈 _! l /ムl: :/ _   '^jノ|     ソ .ん
        _| 人_|: l ,, ̄   =l: |,_    ?. で
        {:::_~,.:::}」: |.  「 7 '''}!::::|__
        / /.,.=、|:!:.ト . l_/ ,.ィ_└┐:|__
      (   └勹ノl:| |\、 // '|!V〉\;/

3:デフォルトの名無しさん
10/03/05 23:42:31
すみません前スレのスタックフレームの者ですが、
局所変数は関数呼び出し時に、スタック領域に確保されるということでおkですよね。

局所変数の大きさはソース見ればわかる、という回答者の方もいますが
実行時にソースを読んでいるわけではないですよね。
そうするとコンパイル時に大きさを求めて、そんで実行時、スタック領域に
局所変数に必要な大きさのフレームを確保する必要があると思うのですが
その大きさは、、、やはりどこから求めているのかわかりません。

4:デフォルトの名無しさん
10/03/05 23:43:51
>>3
コンパイル時に変数の個数はわかってるだろ。


5:デフォルトの名無しさん
10/03/05 23:46:19
>>3
局所変数は関数内で有限個だから、コンパイル時に種類と個数を(どうにかして)数え上げれば、スタック上に準備すべきサイズもわかります。
実行時に求めるわけではありません。コンパイル時に判明することです。

6:デフォルトの名無しさん
10/03/05 23:51:41
どうにかして数え上げればっていうか、どの型の変数が何個使われてるとか
ばっちりわかってないと、コンパイルできないだろ。

C99は実行時に配列の長さを指定できるけど、べつにそういうの気にしてるわけじゃないよな。
質問者は。

7:デフォルトの名無しさん
10/03/05 23:52:20
>>5
> スタック上に準備すべきサイズもわかります。

それはコンパイル時に判明したサイズですよね。
実行時もそのサイズを知る必要があると思うのですが、どこにあるのですか。
実行バイナリファイルにあるのでしょうか。
プロセスの仮想空間にロードされた後もわかるのでしょうか。

8:デフォルトの名無しさん
10/03/05 23:56:32
>>3
スタックの大きさは決めうち
コンパイルオプションで変えられる

実行時に呼ばれた関数が必要としている分だけ
スタック領域を準備しようとするけど実行時に不足していればスタックオーバーフローで止まる

再帰関数で油断してたり、巨大な配列を自動変数で確保しようとしたりするとよく起こること

9:5
10/03/05 23:56:51
>>6
んー、確かにC99可変長配列の扱いはありましたね。

10:デフォルトの名無しさん
10/03/06 00:00:56
>>7
コンパイル時に自動変数に必要なサイズが判明しておれば、それにしたがってスタックポインタを変化させるコードをコンパイル時に生成すればいいのでは。
実行時にあらためて自動変数のサイズを求める必要はないはずです。仮想メモリの話は関係ないと思います。

11:デフォルトの名無しさん
10/03/06 00:06:08
>>7
URLリンク(homepage1.nifty.com)

このページのPROC 〜 ENDPのところにスタックフレームを作ってるアセンブラのコードが
あるでしょ。

add sp, 0FFFCh ;ローカル変数領域の作成

のところで、たとえば、intの変数が三つあったら、add sp, 12 ってコードが生成される。
それだけの話。

12:デフォルトの名無しさん
10/03/06 00:06:37
>>10
つまり、局所変数のサイズが300バイトだとしたら

スタックポインタ = (現在の)スタックポインタ + 300バイト + その他情報の大きさ

みたいな命令を、関数呼び出し毎にしているってことなのでしょうか。
質問ばかりですみません。

13:デフォルトの名無しさん
10/03/06 00:07:42
>>11
まちがえた。add sp, -12 だな。

14:デフォルトの名無しさん
10/03/06 00:08:26
>>11
なるほど。少し納得しました。
これで寝られそうです。みなさん、ありがとう。

15:デフォルトの名無しさん
10/03/06 00:34:25
これは酷い
URLリンク(fx.104ban.com)

16:デフォルトの名無しさん
10/03/06 00:38:03
>>15
みゃくらくもなくグロ

17:デフォルトの名無しさん
10/03/06 00:39:17
こんな板でも貼る奴いるんだな

18:デフォルトの名無しさん
10/03/06 00:44:48
寝る前に見てしまった...orz

19:デフォルトの名無しさん
10/03/06 01:25:51
>>15
とにかくグロ注意
みゃくらくは不明だが...
(誰か削除依頼したほうが良さげ)

20:デフォルトの名無しさん
10/03/06 01:34:21
そんなもんどうでもいい

21:デフォルトの名無しさん
10/03/06 01:36:47
誤爆だったw
すまんwwww
これで許してwwwURLリンク(img.f.hatena.ne.jp)

22:デフォルトの名無しさん
10/03/06 01:38:49
コラなんか要らんわぼけ


23:デフォルトの名無しさん
10/03/06 09:14:42
アセンブラを勉強すれば関数呼び出し時のスタック操作とか自分でやるから理解が深まるけどな。
しかし、なんでここまで気にするんだろ?

24:デフォルトの名無しさん
10/03/06 12:13:05
たぶん自分独自のコンパイラ開発しようとしてるんだろ。ううんきっとそう

25:デフォルトの名無しさん
10/03/06 12:45:36
エラー時にスタックトレースを出力したいとか

26:デフォルトの名無しさん
10/03/06 15:05:44
>>23
ここまで気にする人だから、Cを学ぼうとしているんだろう。
低レベルに興味ない奴はVBとかJavaに行くだろ。

27:デフォルトの名無しさん
10/03/06 15:09:15
知らなくても察しが付くことだけどな

28:デフォルトの名無しさん
10/03/06 15:14:13
そうか?それって天才じゃね?

29:デフォルトの名無しさん
10/03/06 15:29:55
問題:
配列a[10]に対して、以下のコードと同等の結果になるコードを、gcc c言語のインラインアセンブラによるSSE3を駆使したコードで書け
なお、long long型のサイズは8バイト。


4 long long a[10] = { 0x1234L, 0x5678L, 0x9012L, 0x3456L, 0x7890L, 0x1234L, 0 x5678L, 0x9012L, 0x3456L, 0x7890L };
5
6 int i=5;
7 do{
8 *(a+i+0) *= 0x3L; *(a+i+1) *= 0x3L;
9 i--;
10 }while( i > 0 );


という問題があったとして、答え合わせの解答集を無くしてしまったとして、答え合わせにこまってます。

ここの住人の方々は、みんな超スーパーハカーぞろいだという噂を聞きました。
どうか皆様がたのウルトラハイパー知識をくしして、この超難問の答えを導き出していただけませんでしょうか…! よろしくおねがいします。


30:デフォルトの名無しさん
10/03/06 15:44:53
4 long long a[10] = { 0x1234L, 0x5678L, 0x9012L, 0x3456L, 0x7890L, 0x1234L, 0 x5678L, 0x9012L, 0x3456L, 0x7890L };
5
6 int i=10;
7 do{
8   *(a+i-0) *= 0x3L;  *(a+i-1) *= 0x3L;
9   i--;         i--;
10 }while( i > 0 );

すみません、こうでしたw

31:デフォルトの名無しさん
10/03/06 15:47:43
>>30
まだ間違ってるんじゃね?

32:デフォルトの名無しさん
10/03/06 17:00:02
>>29
なんでお前に命令されなきゃいけないわけ?

33:デフォルトの名無しさん
10/03/06 17:23:15
その前にいくらよいしょしてもここにそんなに知識のある奴はいないと思うが。

34:デフォルトの名無しさん
10/03/06 17:36:02
おれ>>32 だけど、ちょっと頭がおかしくなってた。
ごめんな。


35:デフォルトの名無しさん
10/03/06 17:46:26
> 問題があったとして、 解答集を無くしてしまったとして

そもそも仮定からしておかしい

36:デフォルトの名無しさん
10/03/06 19:00:29
つーか
>インラインアセンブラによるSSE3を駆使したコード
どういう頭の構造だと、これが C の質問だと思えるのかと。

37:デフォルトの名無しさん
10/03/06 19:38:27
/* sayHello() 関数へのポインタ */
void (*func)(void) = sayHello;

このとき、'func()' と '(*func)()' の違いって何ですか?
結果は同じなのですが...

38:デフォルトの名無しさん
10/03/06 19:47:52
281 名前:デフォルトの名無しさん[sage] 投稿日:2007/11/08(木) 00:27:05
関数ポインタって代入時の&と実行時の*ってなくても動作変わらないよね?
もともとはどっちが正しいの?

282 名前:デフォルトの名無しさん[sage] 投稿日:2007/11/08(木) 01:06:42
元々必要だったらしいが、gccがなんか理論武装して独自拡張として省略しても良くしたら、
世間に受け入れられたなんて話を聞いたことがある。

39:デフォルトの名無しさん
10/03/06 19:49:50

ありがとう.

40:デフォルトの名無しさん
10/03/06 21:54:41
#include <stdio.h>

int main ()
{
   unsigned long long a[10]={ 0x1234111111111111L, 0x5678000000000000L, 0x9012000000000000L, 0x3456000000000000L, 0x7890000000000000L, 0x1234000000000000L, 0x5678000000000000L, 0x9012000000000000L, 0x3456000000000000L, 0x7890000000000000L };
   unsigned long long b[2]={3,3};
   printf("3a={%llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx}\n", a[0]*3,a[1]*3,a[2]*3,a[3]*3,a[4]*3,a[5]*3,a[6]*3,a[7]*3,a[8]*3,a[9]*3 );


   unsigned long long* ap = a;
   unsigned long long* bp = b;

   int i=5;
   while(i-->0){
      asm volatile ("\
      movdqa (%0),%%xmm0;\
      movdqa (%0),%%xmm1;\
      paddq %%xmm1, %%xmm0;\
      paddq %%xmm1, %%xmm0;\
      movdqa %%xmm0,(%0);\
      " : "+r" (ap) : "r" (bp));

      ap++; ap++;
   }
   printf ("3a={%llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx}\n", a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);


   return(0);
}


41:40
10/03/06 21:57:23
を実行したら
3a={369c333333333333,368000000000000,b036000000000000,9d02000000000000,69b0000000000000,369c000000000000,368000000000000,b036000000000000,9d02000000000000,69b0000000000000}
3a={369c333333333333,368000000000000,b036000000000000,9d02000000000000,69b0000000000000,369c000000000000,368000000000000,b036000000000000,9d02000000000000,69b0000000000000}
ってなりました… 意味が分かりません… 動くはずないのに… なんで動いてるんですか…(orz

42:デフォルトの名無しさん
10/03/06 22:57:36
WindowsNT系のコマンドをC言語で呼び出す方法を教えてください。
dirなどのコマンドを呼び出す方法を教えて欲しいです。
仮に代替できるWin32APIやC言語の関数があったとしても、dirを直接呼び出す方法を教えてください。
よろしくお願いします。(dir以外の他のコマンドも将来的に呼び出したいため)

環境はWindowsNTだけサポートしてれば大丈夫です。

43:デフォルトの名無しさん
10/03/06 23:08:33
systemとか
winexeとか

dirだけでいいならopendirとか

44:デフォルトの名無しさん
10/03/06 23:41:00
_poepn

45:デフォルトの名無しさん
10/03/07 00:28:51
CreateProcessだろ

DOS画面出さず出力をメモリに入れられる

46:デフォルトの名無しさん
10/03/07 01:03:39
>>45
つスレタイ

47:デフォルトの名無しさん
10/03/07 07:59:22
const と define の違いが今ひとつわからない
どっちも定数を定義するんだよね?

48:デフォルトの名無しさん
10/03/07 08:47:35
ココでも読め。
URLリンク(detail.chiebukuro.yahoo.co.jp)
URLリンク(rararahp.cool.ne.jp)

49:デフォルトの名無しさん
10/03/07 10:20:16
C言語でrailsのActiverecord
作ってくださいお願いします

50:デフォルトの名無しさん
10/03/07 10:23:47
自分でやれよ

51:デフォルトの名無しさん
10/03/07 10:37:04
>>47
define ・・・最も古くから使われている
enum ・・・ヒゲさん曰く見えない圧力に押されて追加、いまいちらしい
const ・・・禿と共同開発

定数を返す関数という手もあり
これが実は最も融通が利く

52:デフォルトの名無しさん
10/03/07 10:55:25
defineはコンパイル時に置き換えてくれるだけ
だからマクロとして使えるし、関数丸ごとdefineしてみるとか変なこともできる
__LINE___や__TIME___みたいなコンパイル時に決まるやつもある

事項時はもうすでに置き換わっているのでaaaaとかって名前でdfineしてデバッカでaaaa探してもない

constはメモリ上に固定でそいつがずっといるだけ
つまりデバッカで値も見れる

53:デフォルトの名無しさん
10/03/07 10:55:26
>>47
これ↓も似たような質問かな?

C言語のdefineとグローバル関数について - Yahoo!知恵袋
URLリンク(detail.chiebukuro.yahoo.co.jp)

54:デフォルトの名無しさん
10/03/07 10:57:16
おれ52だけど なんでアンダーバーが3っつなんだろ??

55:デフォルトの名無しさん
10/03/07 10:59:46
コンパイル時というかプリプロセス時

56:デフォルトの名無しさん
10/03/07 11:00:50
キーリピート間隔を短く設定していたんじゃないのか

57:デフォルトの名無しさん
10/03/07 11:12:23
8bitのデータで、
6ビット目が1になったら他のビットが1でも0でも関係なく特定の処理をする動作はどのようにすればよいでしょうか。

58:デフォルトの名無しさん
10/03/07 11:17:02
& (1 << 5)

59:デフォルトの名無しさん
10/03/07 11:17:36
if(data&0x20){
 特定の処理
}

60:デフォルトの名無しさん
10/03/07 11:36:45
ループを使わずに配列の順序を逆にせよ。

という問題は、ループ制御構造(whileやfor)を使わずに、という意味でいいのかな?
関数の再帰呼び出しでもできそうだけど、goto文使ったらだめ?

61:デフォルトの名無しさん
10/03/07 11:38:53
>>60
それはCの問題ではなく日本語の問題じゃね?
どういう意図で書いたのかを書いた人に聞けよ

62:デフォルトの名無しさん
10/03/07 11:43:04
>>61
このホワイトボードプログラミングのところ:
http://japan.zdnet.com/sp/feature/07tenthings/story/0,3800082984,20409456-2,00.htm

一応、こんな感じで(^^
int *
reverse(int ary[])
{
 int i = 0;
 int j = SIZE - 1;
 int tmp;

loop:
 if (i >= j) goto end;

 tmp = ary[i];
 ary[i++] = ary[j];
 ary[j--] = tmp;
 goto loop;

end:
 return ary;
}

63:デフォルトの名無しさん
10/03/07 11:47:31
gotoつかってもループだろ

64:デフォルトの名無しさん
10/03/07 11:49:50
goto文はループ制御構造ではないんですよね。
だったら「ループを使わずに」じゃなくて「再帰を使って」、と書けばいいのに。。

65:デフォルトの名無しさん
10/03/07 11:51:03
たぶん出題意図としては、再帰を使ってほしいんじゃないかね
Cというよりは関数型言語でやらせるような問題

66:デフォルトの名無しさん
10/03/07 11:52:09
>>62
答え出てるぞ

* ループを使わずに配列の順序を逆にする。
答え:順次、配列を画面に表示して行ってオペレーターにメモさせておき、
メモした値を逆順に入力するよう促すダイアログを出す。

67:デフォルトの名無しさん
10/03/07 13:21:02
画像の範囲内をマウスのクリックで判定させるにはどのような考え方をすればよいのでしょうか?

参考サイトがあれば紹介して頂きたいです。

68:デフォルトの名無しさん
10/03/07 13:30:16
UNIX環境でVCの代わりになるような物ってないですかねぇ

69:デフォルトの名無しさん
10/03/07 13:34:37
VC のどんな特徴の「代わり」ができればいいんだ?
VC そのものなら Xen という手もある

70:デフォルトの名無しさん
10/03/07 13:35:53
>67
その画像が矩形なのか矩形以外の多角形なのかで変わる

>68
Anjuta, Emacs, Geany

71:デフォルトの名無しさん
10/03/07 13:38:38
>>70
矩形を想定しています。

72:デフォルトの名無しさん
10/03/07 13:44:12
>>71
ドラッグして範囲選択みたいな感じ?
考え方っていうか、サンプルコード見たほうが早いんじゃない?

マウスダウンのイベントでマウスカーソルをキャプチャして、マウスの
ボタンが離されたれらそこまでが選択範囲だけど。

73:デフォルトの名無しさん
10/03/07 13:49:13
単にヒットした座標か画素が欲しいだけだろ

74:デフォルトの名無しさん
10/03/07 13:53:45
範囲選択ではなく、画像のスイッチのような感じです。
一定の矩形の範囲内をクリックすることで、処理が行われるようにしたいと
思っています。

75:デフォルトの名無しさん
10/03/07 13:58:16
ゲームでも作りたいんじゃないの
確かやねうさんはビット演算でやっていたな

自分で紙に矩形とポイントを描いて条件を考えてみれば自ずと答えが見えてくるよ

76:デフォルトの名無しさん
10/03/07 14:20:51
マウスの位置と矩形の位置を取得しておいて
矩形の上境界線と下境界線の間にマウスの縦座標があって
左境界線と右境界線の間にマウスの横座標があればいいだけじゃないの?

77:デフォルトの名無しさん
10/03/07 14:30:09
left <= x && x <= rignt && bottom <= y && y <= top

78:デフォルトの名無しさん
10/03/07 14:30:29
>>67

むかしBMPファイル(って予備領域とか拡張可能になってるから)に勝手にホットスポットっていうか
クリック可能位置を付け足してクリックすると話が進む紙芝居、見たいなの作った

言語も環境も書いてないからあれだけど
クリッカブルマップ、とかでググってみるとなんとかくやり方わかると思うよ
あとは環境しだいで同じ様な事を違うやり方でやれば

79:デフォルトの名無しさん
10/03/07 14:44:28
様々なご回答ありがとうございます。
全て参考にさせて頂きます。

80:デフォルトの名無しさん
10/03/07 15:18:45
>>68 : kdevelop (書こうとしてる字を予測して、自動補完してくれるからラクちんです)
>>71 : 三角形がいっぱいあるとおもってやるほうほうもあるみたいですよ。
double OuterProduct(
double ax, double ay, double az,
double bx, double by, double bz,
double cx, double cy, double cz
) {
double Ax=bx-ax; double Ay=by-ay; double Az=bz-az;

double Bx=cx-bx; double By=cy-by; double Bz=cz-bz;

double opx = (Ay*Bz-Az*By); double opy = (Az*Bx-Ax*Bz); double opz = (Ax*By-Ay*Bx);

return opz;
}

  B
A △ C
 3角形ABC の中に、点P が「中かな?外かな?」ってのを知りたいときは、
 「AB と P」、「BC と P」、「CA と P」 の3つについて、この関数で調べてみて、戻り値が3つとも全部プラス、または3つとも全部マイナスなら
 点Pは 3角形ABCの内側ってことらしいです。 なんでか理由はよくわかりませんがw

符号1 = OutarProduct( Aのx座標、Aのy座標, 0、  Bのx座標、Bのy座標、0、  Pのx座標、Pのy座標、0 );
符号2 = OutarProduct( Bのx座標、Bのy座標, 0、  Cのx座標、Cのy座標、0、  Pのx座標、Pのy座標、0 );
符号3 = OutarProduct( Cのx座標、Cのy座標, 0、  Aのx座標、Aのy座標、0、  Pのx座標、Pのy座標、0 );

if( 符号1と符号2と符号3が、3つともプラス。 または3つともマイナスなら){ 点Pは、さんかっけいABCのうちがわ♪ }
ってなるみたいです。 なんでか理由はよくわかりませんがw こんど算数の先生に聞いてみまーす。

81:デフォルトの名無しさん
10/03/07 15:22:25
外積で左右判定してるんでしょ

82:デフォルトの名無しさん
10/03/07 16:35:50
>>67 三角形の内部の点かどうか判定するプログラム
#include<stdio.h>
#include<math.h>

int is_inner(double ax, double ay, double bx, double by, double cx, double cy, double px, double py)
{
double Ax, Ay, Bx, By, Px, Py, alpha, beta, divisor;

Ax=ax-cx;
Ay=ay-cy;
Bx=bx-cx;
By=by-cy;
Px=px-cx;
Py=py-cy;

divisor=Ax*By-Bx*Ay;
if(fabs(divisor)<1.0e-6) return 0;

alpha=(By*Px-Bx*Py)/divisor;
beta=(-Ay*Px+Ax*Py)/divisor;

if(0.0<alpha && alpha<1.0 && 0.0<beta && beta<(1.0-alpha)) return 1;
return 0;
}

int main(void)
{
printf("%d\n", is_inner(1.0, 2.0, 2.0, 1.0, 1.0, 1.0, 0.5, 0.499));

return 0;
}

83:デフォルトの名無しさん
10/03/07 21:51:15
再帰的アルゴリズムの利便性がわかりません。
下手をすればスタック領域が蓄積されていってメモリ不足に陥りますよね。
再帰を使わなくても他に解決できる手段があればみなさんはどちらを選択しますか

84:デフォルトの名無しさん
10/03/07 21:54:10
>>83
間違いが少ないほう

85:デフォルトの名無しさん
10/03/07 21:56:59
ほらループなしで処理が書けたよ!と頭よさげにアピールできる
問題領域そのものが再帰的なら可読性と保守性があがる

C言語ではあまり利点がないので他の手段で頑張る
関数型言語とかだとまた別の話しになる

86:デフォルトの名無しさん
10/03/07 22:10:59
>>83
利便性っていうか、再帰的な処理は再帰で書いた方がわかりやすいな。

87:デフォルトの名無しさん
10/03/07 22:11:17
関数に状態を持たせるのがどうじゃこうじゃ
逆に再帰で書いているのを繰り返し制御などで書き直す方が頭良さげ

最近再帰使ったのはビット単位でファイルに書き込む関数の下請け関数だわ

88:デフォルトの名無しさん
10/03/07 22:28:25
本物のプログラマは自己書き換えプログラミング・コードを記述する。
そのことにより再帰アルゴリズムを使うのに比べて20ナノ秒も実行時間が改善される


どうしても再帰なんつう場面は数年に一度
それ以外は、再帰アルゴリズムがぱっとわからないと馬鹿にされるという理由だけで使用する
プログラマってそんなもん

89:デフォルトの名無しさん
10/03/07 22:52:19
再帰は、数学の階乗を求めるプログラムをかじった程度です。
可読・保守性があがるという利点は納得です。
逆にプログラマが再帰プログラムを創り出すほうが大変そう。
階乗求める以外に再帰を使ったほうがいいケースは思いつきにくいですね

90:デフォルトの名無しさん
10/03/07 22:53:10
>>89
3D オブジェクトを扱うときは必須だよ

91:デフォルトの名無しさん
10/03/07 22:54:05
階乗こそ単純ループで十分で再帰にする必要なんてないんだが。

92:デフォルトの名無しさん
10/03/07 23:00:41
無向グラフの経路探索とか再帰使わないと面倒でやってられんけど

93:デフォルトの名無しさん
10/03/07 23:01:26
>>89
ディレクトリをおりていく処理とか、ループで書くとめんどくさいだろ。

94:デフォルトの名無しさん
10/03/07 23:12:27
>>91
教材的な意味だろ

95:デフォルトの名無しさん
10/03/07 23:46:11
教材としてあげるにしても、せめてユークリッドの互除法とか、フェボナチ数列(など漸化式)とかが出てこないものか

96:デフォルトの名無しさん
10/03/07 23:47:17
再帰関数の教材ならハノイの塔の問題を解く奴が好き

97:デフォルトの名無しさん
10/03/07 23:56:03
他人のコードで見つけるとループに書き換えられないかと難癖付けてみたくなる要素
自コードと同じスタックでライブラリ的利用させてもらう場合特に

98:デフォルトの名無しさん
10/03/08 00:55:01
組み込み系だと、変数を取れるキャパが決まってたりして
「お、スタックが空いてる再帰でなんとかしろ」とかあるよ

99:デフォルトの名無しさん
10/03/08 01:18:44
>>89
再帰だとシンプルに書けるものはたくさんある。
もちろんスタックオーバーフローには注意が必要だけど、
プログラマの差ってのはこういうところから来るんだと思う。

例えば、テキストファイルの行を逆順に出力する(いわゆるtacコマンド)
を作ろうとすると、再帰だとこんなにシンプル

#include <stdio.h>
void rev()
{
   char buf[1000];
   if(fgets(buf, 1000, stdin) != 0) {
       rev();
       fputs(buf,stdout);
   }
}
main() {
   rev();
}

100:デフォルトの名無しさん
10/03/08 01:21:16
>>99
再帰関数で大きな自動変数の配列を使うのはナシだろ

101:デフォルトの名無しさん
10/03/08 01:25:22
なにこの制限だらけのtac

102:デフォルトの名無しさん
10/03/08 01:50:03
>99
これは再帰の悪い例としていつか使わせてもらう

103:デフォルトの名無しさん
10/03/08 02:14:39
>>再帰
文字列の中から、正規表現によって単語検索をする場合、正規表現の文字列の並びを、配列から、一旦、順序木の構造に変換してしまって、
木のノードを順番に辿りながら、文字列を検索していくと、一連の検索を、共通の操作であつかえて簡単だとおもいます。

たとえば括弧で囲まれて1まとめになった複数条件も、あるノードの子としてまとめて、”あるノードの子というひとまとまりの単位”であつかえるので、
たとえば単純な ”A" という条件も、複雑な ”[AかBかC]”みたいな括弧で囲まれた条件も、どちらも同一の「”このノード”を使って検索する」という操作で扱えます。
これが再帰を使って得られる簡単さという恩恵だと思います。 簡単に素直にするために再帰を使うんだと思います。

たとえば括弧に囲まれた複数文字も、囲まれてない単一文字も、どちらも同じように考えて検索できるのだから、
木がどんなに複雑な形をしてても、逆にどんなに単純な形だとしても、
どちらも同じ要領で「”このノード”を使って検索する」という共通の操作だけで最後まで処理できます。

この順序木を巡っていくという操作を、単一のループだけでやろうとすると、
「さまざまな形の木を想定」して、それぞれに専用の動作を書いたりするケースが出てきやすいと思います。
(たとえば "A"の場合と "[AかBかCか]"の場合とでの動作の違いを、「わざわざ専用に用意」しないといけいない。などのメンドクササ。
これがループだけでやる場合のメンドクササだと思います。)


だけど、純粋に繰り返しの処理速度だけでみれば、やっぱり for ループみたいなモノの方が優れてるような気がします。よく知りませんが。
普通はループで十分事足りるので、たとえば「シンプルな int[1000] の配列全部に0を代入する」だけのことに、わざわざ再帰を使う必要は無いと思うし、
無理やり再帰なんか使ったら、逆に、わかりづらくなるだけだろうし、わかり辛いとミスも増えますし。

あたりまえですけど、「より簡単に、より素直に書ける方」を選んで使えばいいだけのことかとおもいます。どっちも便利だとおもいます。

104:デフォルトの名無しさん
10/03/08 04:41:46
Cの場合、非再帰で記述(スタックを自前で構築ってのは
この場合反則になるんで)できる位の力量が無いのに
再帰(間接再帰を含む)を使いまくったコードを書くと
後で地獄を見る可能性も視野に...

105:デフォルトの名無しさん
10/03/08 05:08:48
>>104
よく分からん縛りだけど
人に強要するのは勘弁してね

106:デフォルトの名無しさん
10/03/08 05:11:09
ライブラリ、長く使うものに再帰はないな。
どこがスタック積まれるか判らないし、スタックオーバーフローもいつ起こるか特定できない。

107:デフォルトの名無しさん
10/03/08 07:41:46
>>99
逆順にならない。

108:107
10/03/08 18:48:09
失礼、行を単位に逆になるという意味だったんですね。ちゃんとうごきました。

109:デフォルトの名無しさん
10/03/08 18:51:24
1行毎に1000バイトずつスタックに積むとか使えない。
手元にあるテキストは、1行当たり数キロバイトとか逆に数十万行とか普通にあるんだが。
まぁ発想方法としては、悪くないんだけどね。

110:デフォルトの名無しさん
10/03/08 18:58:51
一行読んで、それを連結リストで繋いでおく方がいいな。
それでもファイルサイズが大きすぎると面倒だけど。
tacコマンドは、ファイルの末尾にseekしてから表示しているな。
seekできないストリームに対しては、テンポラリファイルにコピーしてから。
まあちゃんと読んだわけではないから詳しくは知らないけど。

111:デフォルトの名無しさん
10/03/08 20:21:44
Cと直接関係してる質問じゃないけど
ソースを見れる形でファイルを上げれるcodepadのようなアップローダって他にある?
なんか似たような感じで見やすいところがもう一つあった気がするんだけど

112:デフォルトの名無しさん
10/03/08 20:27:44
URLリンク(kansai2channeler.hp.infoseek.co.jp)
ここ?

113:デフォルトの名無しさん
10/03/08 20:32:06
いや、もっと企業がやってるようなオシャレな感じで掲示板では無かったんだけど。
codepadみたいにソースが表示されてdownloadボタンが付いてる感じで

114:デフォルトの名無しさん
10/03/08 20:35:20
URLリンク(gist.github.com)
ここ?

115:デフォルトの名無しさん
10/03/08 20:44:11
おおそれだ、探しても見つかんなかったんだありがとう。

116:デフォルトの名無しさん
10/03/08 20:44:29
言われてから探して見つけてきたけど

117:デフォルトの名無しさん
10/03/08 20:52:01
アップローダとか無駄なキーワード入れてたのが駄目っだのかな・・

118:デフォルトの名無しさん
10/03/08 20:54:14
codepadの類似サービスだから一緒くたに紹介されてると思って、はてブでcodepadと検索したら出てきた

119:デフォルトの名無しさん
10/03/08 21:41:02
#include <stdio.h>
void rev(void)
{
  char *buf;
  if ((buf = malloc(sizeof(char) * 1000)) == NULL) {
    fputs("memory allocate error.", stderr);
    exit(1);
  }
  if (fgets(buf, 1000, stdin) != 0) {
    rev();
    fputs(buf,stdout);
  }
  free(buf);
}

int main(void) {
  rev();
  return 0;
}

これでいいですか?

120:デフォルトの名無しさん
10/03/08 21:55:53
malloc()で動的に確保しても、領域計算量が大きければ意味なし。

121:デフォルトの名無しさん
10/03/08 22:27:03
最近も再起なんて使う?みたいなレスを見たなぁと思ったら図書スレでか
まぁこの手の話題は定期的にあがるもんだけど

122:デフォルトの名無しさん
10/03/08 22:28:31
C言語って難しいんですか??


123:デフォルトの名無しさん
10/03/08 22:30:22
難しいの定義による。

124:デフォルトの名無しさん
10/03/08 22:30:22
>>122
わかれば簡単だと思うよ

125:デフォルトの名無しさん
10/03/08 22:30:56
>>122
文法自体はかなり簡単な部類
ポインタで躓かなかったらな

126:デフォルトの名無しさん
10/03/08 22:32:03
英語とかって、出来てたほうがいいですかね??

127:デフォルトの名無しさん
10/03/08 22:33:37
>>122
難しいともいえるしやさしいともいえる。

低機能の言語なので、文法自体はシンプルで覚えることは少ない。(やさしい?)
低機能の言語なので、なんかやろうとするとめちゃくちゃ手間がかかる。(難しい?)

128:デフォルトの名無しさん
10/03/08 22:39:03
>>126
出来た方がいいに決まってるが、
そんな質問するアホには必要ない。

129:デフォルトの名無しさん
10/03/08 22:39:54
>>126
読みやすいプログラムはそれ自体英文として読めるプログラムだから(俺流の解釈)
読みやすいプログラムを書くためには英語は必要。

英語のできない人が書いたプログラムは大変。

CにしてもJavaにしても英語圏の産物なんだな。

130:デフォルトの名無しさん
10/03/08 22:54:34
プログラミング言語は、アルファベット使うけど英語じゃなくて数学に近いな

131:デフォルトの名無しさん
10/03/08 23:24:31
>読みやすいプログラムはそれ自体英文として読めるプログラムだから

こんなこというやつの変数や関数は長くてむかつく

ReadDataFromUserFileToImageBuffer()

みたいなやつ
あるいはアンダーバーでつなげてみたりして
今時補完機能があるからへいきだろう、とか言い出してさ

>読みやすいプログラムを書くためには英語は必要。英語のできない人が書いたプログラムは大変。

こういうこと言うやつは俺がnamaeみたいな変数とかyomikomi()みたいな関数作ると怒り出すよな
いいじゃん、日本人なんだから日本語にしただけで読みずらくなったりしないよ

と見ず知らずの129にすげえむかつく

132:デフォルトの名無しさん
10/03/08 23:26:24
英語できないやつのプログラムは、
childs とか serch とか、ありえないスペルミスがあって、読みにくくてかなわん。

133:デフォルトの名無しさん
10/03/08 23:26:40
いや読みにくいから

134:デフォルトの名無しさん
10/03/08 23:26:53
>>131
日本語があやふやなお前が言っても説得力は無い


135:デフォルトの名無しさん
10/03/08 23:42:49
俺が普段書くスクリプトなんて一文字変数、スペースけちって詰め詰めばっかりだよ

136:デフォルトの名無しさん
10/03/08 23:44:49
SQL?

137:デフォルトの名無しさん
10/03/09 02:41:32
>>131
ReadDataとToImageBufferが意味的にかぶってない?
UserFileというのもちょっと。
ReadImageFromFileじゃだめかい?

英文として読めるように、というのはよくある指針だね。

138:デフォルトの名無しさん
10/03/09 03:58:43
RiyousyaFileKaraGazouBufferHeYomikomi()
とか書かれたらキレそう

139:デフォルトの名無しさん
10/03/09 05:21:39
プログラムが正しく動作して、開発スタート時に決めた関数の命名規約
(※腐ったルールだとしても)を遵守しているなら、あまり気にしないレベル

140:デフォルトの名無しさん
10/03/09 07:16:23
>>137

そうそう、こういう人
上記のやうは例じゃん、適当に作ったさ
それにたいしてまで、こんな事言ってくる
そういう点がむかつくんだって事

ReadImageFromFileじゃだめじゃん
長々と英文を関数名にしてるやつが居るよねって例としては短すぎる
ここは多少英語としておかしくても長くして置かないと駄目

141:デフォルトの名無しさん
10/03/09 07:17:31
JISYO のように複数のローマ字方式をミックスしたり、
JYOHO のような適当ローマ字で書かれているのを見るとためいきが出る。

142:デフォルトの名無しさん
10/03/09 07:32:31
readdata
readdata2
readdata3
readdataEX
readdataEX2

みたいにされるのもむかつく、混在してたりするとさらに

143:デフォルトの名無しさん
10/03/09 08:15:36
とりあえず読みにくいのはお断り

関数名は英語とローマ字のどちらかに統一されていれば気にしない
混在してるとイラッとくるが

144:デフォルトの名無しさん
10/03/09 08:17:50
>>140
シンプルだが単語のせいで長くなる場合は仕方ない
i18nのようにごまかすのもいいけど、やりすぎはよくない
複数の意味を含めた名前になるのならそれは関数化が足りない

145:デフォルトの名無しさん
10/03/09 10:05:36
つかもともとCは単語を略す文化だよね

intもcharもbufだってそう
memcmpとかやっちゃうし

昔の本とかのソース見るとインデントもあって目を細めると螺旋模様のように見える
今のソースはBASICのようにブロック並べたみたい

146:デフォルトの名無しさん
10/03/09 10:09:31
スパゲティコードより読みにくいという説もあるいわゆるうねりコードですね

147:デフォルトの名無しさん
10/03/09 10:35:16
文化じゃなくて制限。creatとか今思えばひどいもんだよね
端末に表示できる文字数の問題もあったし、環境に合わせてその辺は変化していってもいいと思うんだ

148:デフォルトの名無しさん
10/03/09 11:45:10
Visual C++ 2008 Expressで1から勉強を始めたいのですが
ソリュージョンのディレクトリの作成はオンにするのとオフにするのはどちらがよろしいのでしょうか?

参考に2つのサイトを見て勉強したいと思います
苦C URLリンク(9cguide.appspot.com)
猫  URLリンク(homepage2.nifty.com)

苦Cでは特にオフにしろとは書かれてなく、猫のほうはオフにしろと書かれてましてオンとオフどちらにしたらいいのか分かりません

149:デフォルトの名無しさん
10/03/09 11:58:44
すべてローマ字で書くことに決めたとしても、簡単なカタカナ語をどうするか悩む
どうしてもrisutoと書かなきゃいけないのか、listにしちゃいけないのか
そして無意識のうちにlistと書いちゃってコンパイルエラー

150:デフォルトの名無しさん
10/03/09 12:00:28
>>148
両方やってみて違和感が少なかったほうにすればいいよ

151:デフォルトの名無しさん
10/03/09 12:01:36
あ、気に入らなかったらフォルダごと捨てれば大丈夫だから、神経質にならずにためせばいいよって意味も含んでるよ
最初は確かにいろいろそわそわしたなぁと思い出したので追記

152:デフォルトの名無しさん
10/03/09 12:25:15
ありがとうございます
オフにしてやってみます

153:デフォルトの名無しさん
10/03/09 12:26:20
> 読みやすいプログラムはそれ自体英文として読めるプログラムだから

COBOL 屋かてめーわ

154:デフォルトの名無しさん
10/03/09 13:52:42
他人のコードを改造しているんですが
コードの量が大きいので一つの変数の型を変更するとそれに関連するものを変更する作業が大変です。
例えばint型だったものを制度をよくしたいのでdouble型に変えたとします。
それに関連する関数の戻り値や引数、代入される変数等、膨大な数になってしまいます。
なにか自動で型を変換する方法ってありませんか?

155:デフォルトの名無しさん
10/03/09 15:09:54
typedefしておけばいい

156:デフォルトの名無しさん
10/03/09 15:33:17
理解力がなくてすみませんがtypedefでどう解決するのでしょうか?

157:デフォルトの名無しさん
10/03/09 15:42:44
全部変えてしまうのは、まずいだろ
見ながら1こ1こかえるしかねーべ、そういうものとあきらめて

158:デフォルトの名無しさん
10/03/09 15:47:01
mozillaではパーザで構文木作ってそれを木の変換技法を使って自在に書き換えするっていうのを
javascriptで作って、それをコードメンテに使ってるみたい
dehydraとかいうやつだっけか

159:デフォルトの名無しさん
10/03/09 16:08:52
検討の例えで整数変数を実数に入れ替えにしてるのは

釣りかい?

160:デフォルトの名無しさん
10/03/09 16:14:02
んだなぁ
(x == y)みたいなのは、型を変えただけじゃだめだしなぁ
結局>>157しかないな

161:デフォルトの名無しさん
10/03/09 16:21:18
たとえばビット演算を使っていたりしたらアルゴリズムから検討する必要が出てくるので
自動でやるのはとても不可能だろうなあ。

162:デフォルトの名無しさん
10/03/09 16:22:10
   , -‐−-、  ヽ∧∧∧ //  |
.  /////_ハ ヽ< 釣れた!> ハ
  レ//j け ,fjlリ / ∨∨V ヽ  h. ゚l;
 ハイイト、"ヮノハ     //   |::: j  。
  /⌒ヽヾ'リ、     //     ヾ、≦ '
. {   j`ー' ハ      // ヽ∧∧∧∧∧∧∨/
  k〜'l   レヘ.   ,r'ス < 初めてなのに >
  | ヽ \ ト、 ヽ-kヾソ < 釣れちゃった!>
.  l  \ `ー‐ゝ-〈/´   / ∨∨∨∨∨∨ヽ
  l     `ー-、___ノ
  ハ   ´ ̄` 〈/‐-、

163:デフォルトの名無しさん
10/03/09 16:32:51
すいません、苦Cの事を一通り覚えた後は何をしたらいいでしょうか?

164:デフォルトの名無しさん
10/03/09 16:35:48
>>163
アルゴリズムとデータ構造が少ない希ガス

165:デフォルトの名無しさん
10/03/09 16:41:12
コマンドラインで動作する素数判定プログラムprimeを作っているのですがうまくいきません。
コマンドラインオプションでの整数取得・切り分けがうまくいかないです。
助言お願いします。

166:154
10/03/09 16:59:15
多くのレスありがとうございます。
全intをfloat(double)に変換するとか強引な方法をとってはダメでしょうか?

167:デフォルトの名無しさん
10/03/09 17:04:35
駄目かもしれないしOKかもしれない
なんでそんなことわかるの?

でもきっとコンパイルエラーがわんさか出るだろうな

sprintfとかの辺とかビット演算の辺とかまずそう
switch文とかもまずそう
サイズをsize_tじゃなくてintでやってるところとかあればまずそう
戻り値をintでエラーで分岐してたらまずそう

168:デフォルトの名無しさん
10/03/09 17:04:56
ダメだって書いてあんだろーが

169:デフォルトの名無しさん
10/03/09 18:19:45
#include <stdio.h>
void hack(void){
printf("実行可能\n");
exit(0);
}
void func(void){
int iArray[2];
iArray[4] = (int)hack;
}
void main(void){
func();
}

VC++のDebugで、
どうしてこれが実行できてしまうのでしょうか?

170:デフォルトの名無しさん
10/03/09 18:42:09
そういう風にできてるから

171:デフォルトの名無しさん
10/03/09 18:44:52
>>165
つ codepad
瞬殺でアドバイスが得られると思います。

172:デフォルトの名無しさん
10/03/09 19:15:01
運がいいから

173:165
10/03/09 19:53:43
素数判定ではなく素因数分解factorでした
URLリンク(codepad.org)

うまい具合に引数を整数にしたいです。
例えば、
factor 123451234512345
のときも動いてほしいです。

OSはwindows vistaでコンパイラはgcc、バージョンは
gcc version 3.4.5 (mingw-vista special r3) です。
その時のint型(4bytes)の上限は +2,147,483,647 (10桁)です


174:デフォルトの名無しさん
10/03/09 20:23:07
>>173
gmp みたいな多倍長整数ライブラリを使う

175:デフォルトの名無しさん
10/03/09 20:40:07
引数は整数になってると思うけど桁数を増やしたいって話?
20桁未満ならgccはlonglong使えるんじゃないか

176:165
10/03/09 21:15:02
>>174
試してみます。

>>175
桁数を増やすのと、

例えばint型を使っていて、
引数argv[1]がその上限を超えたときに
エラーにしてくれるようなチェック方法を知りたいです。


177:デフォルトの名無しさん
10/03/09 21:45:35
>>176
コマンドラインオプションの解析は getopt(3)でいいんじゃない?
自分で判定するのは面倒でしょ。

パラメタを整数にするのも、strtol とかstrtoll あたりでいいかと。
上限超えたらどうなるかは、man 見れば載ってると思う

178:デフォルトの名無しさん
10/03/09 23:12:10
ヘッダファイルで

#define RED 1
#define BLUE 2
.....

#define YELLOW 100

と数百個定義しているのですが(全部定義しているわけではない)
結構順番を入れ替えます.そこでインクリメンタル的なものをつかえないかと思っているのですが,
よい方法ございますでしょうか?

よろしくお願いします.


179:デフォルトの名無しさん
10/03/09 23:14:01
enum

180:デフォルトの名無しさん
10/03/10 16:36:16
ヒープメモリとスタックメモリって読み書き速度に差はあるの?

181:デフォルトの名無しさん
10/03/10 16:37:55
>>180
スタックは頻繁にアクセスされるためCPUキャッシュに乗った状態の可能性が高い

182:デフォルトの名無しさん
10/03/10 17:09:32
スタックもヒープも物理的に差はない。
C言語がやりくりする一定値のメモリがスタック。OSに問い合わせしないので解放取得が速い。
ヒープはOSに問い合わせる。
スタックもプログラム開始時にOSに問い合わせて取得する。
OSはこの二つの違いは認識しない。使われていなければ、スタックでもページアウトする。

183:デフォルトの名無しさん
10/03/10 17:12:31
100Mとか多めに確保したヒープにランダムアクセスしたら遅くなるが
確保できたとしてスタックでも同じ程度の速度。
はじめに一定値を確保してあるか無いかの違いだけ。

184:デフォルトの名無しさん
10/03/10 17:13:31
スタックはメモリプールという機能と同じってこと。

185:デフォルトの名無しさん
10/03/10 17:28:47
Windowsを初め、比較的新しいOSではスタックも追加確保
されるる時にOSに問い合わせます。

186:デフォルトの名無しさん
10/03/10 17:31:37
XPはスタックオーバーフローするが。
vistaからはそうなったか。

187:デフォルトの名無しさん
10/03/10 18:12:17
>>185
OSが許容するスタック上限値よりずっと低いスタック量で
プロセスを起動しても、行儀の良いプログラムだったら
問題がないんでそうしてるわけですね。
少し「仕事をする」(再帰とか使ってたり、ローカル変数に
配列とか大量に確保する)プログラムだったら当然それでは
足りないからスタックオーバーフローする。そのタイミングで
OSはスタックを追加してプロセスを停止させず続行するわけ
です。

188:デフォルトの名無しさん
10/03/10 18:30:49
OS的には、変数は極力グローバル変数に確保し、再帰を使わない
プログラムであることを望んでいるというわけですね

189:デフォルトの名無しさん
10/03/10 18:43:30
OSはスタック追加などしないぞ。OSから見たらカタックとヒープの違いはない。
MS-DOS Windwos3.1では区別はあったとおもうが。
Windwos3.1はスタックの固定領域を指定して使い切ったら駄目だった気がする。

190:デフォルトの名無しさん
10/03/10 19:00:26
MS-DOSにおいて、カーネルを含むプログラムの実行に確保できるメモリ空間(コンベンショナル・メモリ)は8086のアドレス空間の最大1MBである。
ほとんどのコンピュータでは、この空間にBIOS ROMやメモリマップドI/O、VRAMなどの空間も存在するため、
アクセス可能なメモリ空間は最大でも640KBから768KB程度であった。
ただし、バンクメモリやEMS、プロテクトメモリ(80286/386以降)等のコンベンショナルメモリ以外の領域・手段の利用が一般化していたため、
「貴重な」コンベンショナルメモリがこれらの領域によって圧迫されることはなかった。

日本語入力用のFEPなどの常駐型のデバイスドライバを使用すると一度に使用できるユーザーメモリはさらに減少するため、
ユーザーはEMSやXMS、HMAやUMBなどの拡張メモリの管理機能を利用して、
辞書や常駐部やMS-DOSシステムの一部をそれらへ配置し、コンベンショナルメモリの圧迫を少しでも避けることが重視されるようになった。

「とりあえず動く」という状態を作るだけであればエンドユーザーがこれらを直接操作する必要はほぼ無かったが、
「とりあえず」に飽き足らず無駄を省き最適な設定をするためには知見と試行錯誤が要求されるある種の職人芸的な資質が要求されたため、
これらの事情が「MS-DOSの環境設定は非人間的で困難なものであった」とする後世の評価を招く原因ともなった。
MS-DOS - Wikipedia

191:デフォルトの名無しさん
10/03/10 19:32:23
XPでもコンベンショナル・メモリのような設定あるんだがな。
デスクトップアプリケーションヒープ、非対話型サービスヒープの設定可能。
ここ変えないといくらメモリふやしても、メモリ不足改善しないことある。

192:デフォルトの名無しさん
10/03/10 20:22:20
Win3.1の場合、8086向けのコンパイラを若干改造した
もので生成出来るコードでGUIアプリが作れるという
のが基本設計
8086ではスタックの動的変更を行う一般的
方法のCPUアーキテクチャーレベルのサポートは
殆ど無いしコンパイラでもサポートしている例は
皆無。

193:デフォルトの名無しさん
10/03/10 20:26:14
おまえは勘違いしている。
スタックというのは、OSから見たら特別な領域でない。
スタックとヒープというのは、C言語(その他)から呼ばれているだけ。
どっちもOSに合わせたメモリ取得関数を呼び出して確保する。同じもの。

194:デフォルトの名無しさん
10/03/10 20:30:58
昔のOSは区別してあった領域があるかもしれないが
いまのメモリ確保はどれ使っても、OSレベルでは結局は一通りのメモリ確保しかないだろ。
レジスタとかGPUとかは別。

195:デフォルトの名無しさん
10/03/10 20:39:53
>>179
ありがとうございました.
うまくいきました.

196:デフォルトの名無しさん
10/03/10 21:20:04
暴れてる長文バカも
同じくらい環境依存なのに
startupコードやセクションの話になるとサクッと黙るんだよな

197:デフォルトの名無しさん
10/03/10 23:15:37
>>193
WindowsはCPUレジスタそのものを管理しないって?
んなことない。ないからこそ他のプロセッサ向けに移植
されていない。初期のWinNT(4.0まで)はプロセッサ
が今のように分化してないから対応できたんだろうが
さすがに無理になってしまって現在はIntel以外は非対応


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5399日前に更新/110 KB
担当:undef