C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: 再帰によるスタックオーバフローエラー [1]


(過去ログ 47 を表示中)

[トピック内 30 記事 (21 - 30 表示)]  << 0 | 1 >>

■25741 / inTopicNo.21)  Re[11]: 再帰によるスタックオーバフローエラー
  
□投稿者/ 渋木宏明(ひどり) (896回)-(2008/09/25(Thu) 13:11:33)
渋木宏明(ひどり) さんの Web サイト
> editbin.exeで良いならここに資料があります。

PE のヘッダ情報をいじるだけですよね>editbin

マネージコードってホストプロセスのスタックそのまま使うんでしたっけ?

とか、他にもいろいろ疑問があるけど、不毛な方向にしか発展しない気がするので深く掘り下げていません>じぶん

# app.config か machine.config で設定できたような気がしてたんだけど、出来ないみたいね>マネージスタックサイズ

引用返信 編集キー/
■25748 / inTopicNo.22)  Re[12]: 再帰によるスタックオーバフローエラー
□投稿者/ たくボン (36回)-(2008/09/25(Thu) 14:21:45)
No25741 (渋木宏明(ひどり) さん) に返信
> PE のヘッダ情報をいじるだけですよね>editbin
そうみたいですね。

> マネージコードってホストプロセスのスタックそのまま使うんでしたっけ?
スレッド単位だからメインスレッドのスタックを消費するんじゃないかな?この辺りは調査してないから断言できないけど、MSDNに

http://msdn.microsoft.com/ja-jp/magazine/cc163491.aspx

と書いてありますね。この資料はLilyさんにとっても参考になると思うので、読んでみてください。

> とか、他にもいろいろ疑問があるけど、不毛な方向にしか発展しない気がするので深く掘り下げていません>じぶん

スタック関係とかメモリ絡みは不毛な方向にしか発展しないかもしれないですが、プログラマとしては押さえておきたい部分ですね。
GCとか絡むようになって楽になった部分は大きいけど、意識しないプログラマが増えたのも事実。
去年は携帯を開発していて、ずっとCでしたがメモリの管理が自由にできるのはある意味気持ちいいですよ:-)
引用返信 編集キー/
■25754 / inTopicNo.23)  Re[3]: 再帰によるスタックオーバフローエラー
□投稿者/ 倉田 有大 (295回)-(2008/09/25(Thu) 14:47:10)
> int Hoge
> {
> get { return this.Hoge; }
> }
>
> みたいなウッカリ系の場合じゃなくて?

わはは^^
よかった!俺だけじゃないんだ!!!!
フィールド変数を小文字にしていると、時々やっちゃうんですよね。
引用返信 編集キー/
■25759 / inTopicNo.24)  Re[13]: 再帰によるスタックオーバフローエラー
□投稿者/ かつのり (7回)-(2008/09/25(Thu) 15:06:33)
>実は、テスト等が終っている状態で大きなプログラムの修正が認められないということです。

単にテストケースが間違っているとしか思えないんですが、
政治的な部分で仕方がないのでしょうね。

余談ですが、昔ウェブでJSON文字列をリクエストで受けて、
JSON文字列のパースする処理を書いたことが有りますが、
楽なので最初は再帰で書いていました。

でも、[[[[[[[[[[[[[[[[[[[[[[[[[というような文字列がリクエストされると、
スタックオーバーフローで死にましたね。
ステートマシンを使ってパースするようにしました。

引用返信 編集キー/
■25762 / inTopicNo.25)  Re[13]: 再帰によるスタックオーバフローエラー
□投稿者/ NyaRuRu (63回)-(2008/09/25(Thu) 15:44:47)
No25748 (たくボン さん) に返信
> スタック関係とかメモリ絡みは不毛な方向にしか発展しないかもしれないですが、プログラマとしては押さえておきたい部分ですね。

Microsoft CLR は正直なところそういうことを学ぶための素材としては複雑すぎるように思います.
渋木さんの言いたいのもそういうことじゃないですかね.

CLR はマネージスレッドという形で実行単位を抽象化していて,(実際にはあり得ないのですが) Win32 Firber である可能性すらあるものとして設計されています.
ここを掘り下げるというのは,例えば IHostTaskManager を実装してネイティブスレッドを CLR とどう組み合わせるとかそういう世界です.
http://msdn.microsoft.com/ja-jp/library/ms164562.aspx
CPU の知識,Windows OS の知識,COM の知識,.NET の知識が総動員されますので,気軽に調べてみて下さいと言える問題でもないでしょう.

他にも Windows XP 以降の PELoader は .NET のアセンブリを直接認識する一方で,ngen を実行されたアセンブリはまた扱いが変わります.
editbin でうまく行くかは結構ばくち的なところがありますし,うまくいったところで今後ずっと利用可能かは正直分からないです.
引用返信 編集キー/
■25765 / inTopicNo.26)  Re[14]: 再帰によるスタックオーバフローエラー
□投稿者/ 渋木宏明(ひどり) (897回)-(2008/09/25(Thu) 16:08:22)
渋木宏明(ひどり) さんの Web サイト
> Microsoft CLR は正直なところそういうことを学ぶための素材としては複雑すぎるように思います.

それでも、技術的な興味で掘り下げたい、とうことなら止めはしないんですけどね。

> ngen を実行されたアセンブリはまた扱いが変わります.

ngen と似たような路線で、64bit だとどうなるんだろ?
.exe に埋められるスタブは 32bit なんだろうし…

引用返信 編集キー/
■25780 / inTopicNo.27)  Re[14]: 再帰によるスタックオーバフローエラー
□投稿者/ たくボン (38回)-(2008/09/25(Thu) 19:45:21)
No25762 (NyaRuRu さん) に返信
> ■No25748 (たくボン さん) に返信
> Microsoft CLR は正直なところそういうことを学ぶための素材としては複雑すぎるように思います.
> 渋木さんの言いたいのもそういうことじゃないですかね.
ですね:-)
実際、Win32 FiberやCPUの実効制御がどうなっているとかの話題にまで遡れば不毛な話題になると思いますし、その知識が必要になる人は限定されてしまいますね。

> CPU の知識,Windows OS の知識,COM の知識,.NET の知識が総動員されますので,気軽に調べてみて下さいと言える問題でもないでしょう.
確かに、上記の話題全てを調べてくださいとはとても言えません。ただ、今回のケースは再帰処理とスタックの話題ですし、GCやスタックの理解の糸口になればステップアップできると思いますね。

引用返信 編集キー/
■25784 / inTopicNo.28)  Re[8]: 再帰によるスタックオーバフローエラー
□投稿者/ Jitta (515回)-(2008/09/25(Thu) 21:44:11)
Jitta さんの Web サイト
No25715 (Lily さん) に返信
Private Sub ClaimReflexive(ByVal rowCnt As Integer)
    ' ************************************************************************
    '   機能:  再帰処理
    ' ************************************************************************
    ' >>>>>結局、単純なループで解決できる
    While (rowCnt >= 0)
        Dim ClaimArray() As String = Split(PubTreeTbl.Rows(rowCnt).Item("List"), ",")
        ' >>>>>何度も計算させない
        Dim pos As Integer = PubAryPos(rowCnt)
        ' >>>>>同じ else を2回書かない
        ' >>>>>PubArrayPos(rowCnt) が 0 の可能性は?
        If ClaimArray.Length >=  pos AndAlso ClaimArray(pos - 1) <> "" Then
            ' クレームNo取得
            PubSubClaimNo = Integer.Parse(ClaimArray(pos - 1))
            PubClaimBody += "-" & PubSubClaimNo.ToString.PadLeft(MaxFigure)
        Else
            ' ツリーの値が取れなかった場合
            If ClaimBeforeReflexive(rowCnt) = False Then
                Exit Sub
            End If
        End If
        rowCnt = PubSubClaimNo - 1
    End While
End Sub

引用返信 編集キー/
■25787 / inTopicNo.29)  Re[14]: 再帰によるスタックオーバフローエラー
□投稿者/ Lily (8回)-(2008/09/25(Thu) 23:51:47)
No25759 (かつのり さん) に返信
> 単にテストケースが間違っているとしか思えないんですが、
そのとおりです。
最初の仕様と大幅に変更があって・・・・・言い訳ですね。。
レベル不足です。

とりあえず、今日はあまり時間が取れなかったため、あまり試せていないのですが、editbinを使用して
スタックサイズを変更すれば一応はエラーは出ないことはわかりました。(もちろん、限界はありますが。)

ただ、最初に書いたとおりWordに対するアドオンのため、
WinWord.exeに対してスタックサイズの変更をしないといけないため、現実的でないこともわかりました。
引用返信 編集キー/
■25788 / inTopicNo.30)  Re[9]: 再帰によるスタックオーバフローエラー
□投稿者/ Lily (9回)-(2008/09/25(Thu) 23:56:26)
No25784 (Jitta さん) に返信

回答ありがとうございます。
皆さんの今まで回答から、
スタックサイズの変更よりもモジュールの修正が必要なのはよーくわかりました。

いま、なんとか修正の許可が下りるよう食い下がってはいるのですが・・・

自分のレベル不足が最大の原因なので、なんとか修正をしてリリースできればと考えております。

モジュールの修正点については、明日検討します。

引用返信 編集キー/

<前の20件
トピック内ページ移動 / << 0 | 1 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -