作者kenlo1980 (那里没有汤匙)
看板Programming
标题Re: TC++ 变数视野求教
时间Mon Feb 25 17:13:40 2008
※ 引述《"marujoung" <[email protected]>, 看板: Programming》之铭言:
: MSGID: 0:0/0 385882AE
: -KEY: 6A6A1CFE
: "<> void main(void)
: "<> {
: "<> if(func1())
: "<> func2();
: "<> }
: "<>
: "<> int func1(void)
: "<> {
: "<> int i;
: "<> :
: "<> :
: "<> return i;
: "<> }
: "<>
: "<> int i;
: "<>
: "<> void func2(void)
: "<> {
: "<> :
: "<> }
: "<>
: "<> 以上是我将程式简化後的结构.
: "<> 会将 int i 放在 func1 及 func2 间是因 int i 本来在 func2 内(auto)
: "<> 而 func2 太大不符合大拇指原则, 所以我将 func2 切割成数个函式;
: "<> 但 i 是共用的, 所以我将之放在 func2 前宣告.
: "<> 怪的是这样跑程式会出错,
: "<> 若我将 func1 内的 int i 拿掉, 将 int i 移到 func1 前就正确了.
: "<> 不解的是 func1 内的 i 不是 auto 变数吗?
: "<> 理应不会左右後面的外在变数 i 才对,
: "<> 且到了 func2 时 i 的值会重设, 而 func1 的 i 没有进出.
: "<> 但事实显示似乎两个 i 会互相干扰.....
: "<>
: "<> 以前学 C 时急冲冲地想写程式, 对变数视野这部份没下过功夫,
: "<> 现在嚐到恶果了(无法解释这现象)
: "<> 拜托各位大大帮我解惑,
: "<> 程式不能这样写吗?
: 我知道本板的高手很多,
: 为什麽都保持沉默呢? 我已等了近两个月了...
不是高手保持沉默,而是他们没办法回答你的问题。
因为你的问题比较像是 dependency on compiler / os。
已经是高手等级的人,当菜鸟练功时用的 TC 版本大多为 2.01 左右,也就是十余年前。
而且现在多半已经不用 TC 了,因此无法复制你的 bug,自然无法回答你的问题。
: 期间我把施大师的着作拿出来 k 了,
: 疑惑仍在:
: func1 内的 int i 是在执行时以堆叠配置,
: 而夹在 func1 和 func2 间的 int i 早在编译时就配置好了,
我大概有十年以上没碰 TC,当然我并不是高手,
但在我印象中 borland 的 compiler 对变数会分已初始化跟未初始化的资料,
分别置放在 BSS 与 DATA 节区,而你的 i 都是属於未初始化的资料。
如果我没记错,在 Boralnd C Compiler 的 memory model 中,
small 的 bss, data 跟 stack 好像是在一起的。
我猜你大概是用 tiny 或 small 的 memory model。
你有没有试过改用 large 来 compiler?
或者观察 compiler 出来之後各变数的置放方式?
: 两者在 RAM 中的位置并不相同, 应该不会干扰才对啊?
我只能说你太武断了,为什麽不把整个 memory map 弄出来看呢?
: PS. 前文忘了讲,
: 进 func1 及 func2 时 i 都会重设个启始值,
: so 就算干扰了值都会重设.
: --- 本站可传档、聊天、写信喔 !
: * Origin: 翡翠王国资讯站(BBS) [站址: 203.204.191.217] (0:0/0)
:
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.137.86.26