2015-12-10 85 views
1

等效聲明所以我有一個家庭作業的問題:與三個陣列

假設我們有三個陣列尺寸,A(1000),B(700),和C(200)。進一步假設A與B或C同時從未使用 ,但B和C可能同時在使用。寫一個FORTRAN EQUIVALENCE 聲明以儘可能多地分享存儲空間。

現在我對編寫一個FORTRAN EQUIVALENCE語句一無所知,但我在谷歌上查了一下並仔細研究了一下。我得到了這個答案:

EQUIVALENCE(B, C) or EQUIVALENCE((A), (B(1),C(1))) 

任何人都可以幫我解決這個問題嗎?我將如何去解決這個問題?

+0

你認爲'等價(b,c)'是什麼意思? (也就是說,我們需要解決多少個方面?) – francescalus

+0

@francescalus我認爲這意味着'b'的所有地址都與'c'共享。 – 3kings

+0

所以如果'b'和'c'有共同的內存,這意味着我們可以' t獨立地分配給那些變量中的一個。我認爲這個問題是相反的:我們希望能夠爲'a'或者'b'和'c'使用一塊內存(但是這些內存沒有重疊)。你是如何解決這個問題的? – francescalus

回答

2

在進一步討論之前,我會說我認爲理解/欣賞equivalence是很好的,但很少這會成爲解決現代計算問題的正確工具。

我在這裏的答案是不告訴你正確的語句使用。這部分是因爲它是功課,但主要是因爲沒有足夠的信息來給出完整的答案。稍後更多。

我的解釋與你的做法不同。

假設A是從來沒有在使用的同時爲B或C

返回時equivalence是做存儲正確的事情是昂貴或有限。如果我們知道需要兩個非常大的數組,但從不需要同時使用,我們將使用相同的內存部分來存儲這兩個變量:在代碼中的某些點,我們將使用它作爲,例如,x,並且在某些點上它的一部分將是idx。這是equivalence和這個問題的一個用法。

話說A是從來沒有在同一時間BC使用,但BC可以在同一時間使用意味着我們可以在一些點在代碼中使用相同的內存腫塊爲A稍後有BC部分,但不同的部分爲每個A之前使用的存儲器。

equivalence (b,c) 

然後,說的是錯誤的東西。這說明B的開始位置與C的開始處在相同的存儲位置。所以如果我們改變b(1),我們也改變了c(1)的值。

你應該看着像

equivalence (a(1), b(1)) (a(n), c(1)) 

其中a(n)是指存儲單元b的存儲結束後。

現在,這個n應該是什麼,甚至如果有的話,將取決於變量的各種元素的大小。這我們不知道。

也許我們可以使用隱式打字(畢竟有equivalence)來說它們都是默認實數,每個元素的長度都是相同的,在這種情況下,您可以給出答案。

+2

但更重要的是:**不要再使用等效**。 (或許,*也許*,如果你真的知道你在做什麼) – chw21

+1

[或者:(你被一個不懂'associate'或'target'的編譯器/老闆/教授卡住了。] – francescalus