में असाइनमेंट पर स्वचालित सरणी आवंटन हमने हाल ही में खोज की है कि हम फोरट्रान में एक आवंटित सरणी के लिए असाइनमेंट कर रहे थे। जीएनयू gfortran कंपाइलर त्रुटि पकड़ नहीं था, और कोड ओएसएक्स और लिनक्स दोनों के तहत चलाता है। हालांकि, एक आईबीएम पावर पीसी पर एक ही कोड सेगमेंटेशन दोष।फोरट्रान
मेरा प्रश्न है, क्या निम्न कोड सही है? ऐसा लगता है कि array
को आवंटित सरणी स्वचालित रूप से कुछ आर्किटेक्चर पर स्मृति आवंटित कर रही है, लेकिन दूसरों पर नहीं। क्या यहां काम पर कार्यान्वयन विशिष्ट विवरण हैं?
#include <stdlib.h>
void assign_array_(double x[], int* n);
void print_array_();
int main()
{
int n,i;
double *x;
n = 5;
x = (double*) malloc(sizeof(double)*n);
for (i = 0; i < n; i++)
x[i] = (double) i;
assign_array_(x,&n);
print_array_();
return 0;
}
और फोरट्रान कोड:
MODULE test_mod
DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: array
integer :: nsize
END MODULE test_mod
SUBROUTINE assign_array(x,n)
USE test_mod
IMPLICIT NONE
INTEGER :: n
DOUBLE PRECISION :: x(n)
CALL test_allocated()
array = x
CALL test_allocated()
nsize = n
END SUBROUTINE assign_array
SUBROUTINE print_array()
USE test_mod, ONLY: nsize, array
IMPLICIT NONE
INTEGER :: i
DO i = 1,nsize
WRITE(6,'(F24.16)') array(i)
END DO
END SUBROUTINE print_array
SUBROUTINE test_allocated()
USE test_mod
IMPLICIT NONE
IF (ALLOCATED(array)) THEN
WRITE(6,*) 'Array is allocated'
WRITE(6,*) 'size is ', SIZE(array)
ELSE
WRITE(6,*) 'Array is NOT allocated'
END IF
END SUBROUTINE test_allocated
निर्गम (जब यह चलता है) है:
Array is NOT allocated
Array is allocated
size is 5
0.0000000000000000
1.0000000000000000
2.0000000000000000
3.0000000000000000
4.0000000000000000
और
कोड एक मिश्रित सी/फोरट्रान कोड है यहां पावर पीसी पर आउटपुट है:
Array is NOT allocated
Segmentation fault (core dumped)
संक्षेप में: यह जीएनयू (जीएनयू फोरट्रान (मैकपॉर्ट्स जीसीसी 5 5.4.0_0) 5.4.0) के तहत संकलित करते समय चलाता है ओएसएक्स (आर्क: x86_64h) और लिनक्स (ओएसएक्स, जीएनयू फोरट्रान (उबंटू) पर होस्ट की गई वर्चुअल मशीन में 4.9.4-2ubuntu1 ~ 14.04.1) 4.9.4), लेकिन जीएनयू फोरट्रान (जीसीसी) 4.4.7 20120313 (Red Hat 4.4.7-17) का उपयोग करके संकलित पावर पीसी (आर्क: पीपीसी 64) पर संकलित होने पर चलाने में विफल रहता है। । हमारे मूल कोड में, पावर पीसी कार्यान्वयन केवल बाद में कोड में segfaulted, जहां सरणी प्रविष्टियों सरणी संदर्भित किया गया था, हमारी 'बग' (अगर यह वास्तव में एक बग है) बनाने के लिए वास्तव में मुश्किल है।
उपरोक्त कोड के लिए सही व्यवहार क्या है?
आप यह जांच नहीं रहे हैं कि मॉलोक सफल होता है या नहीं। – stark
मैंने अभी एक चेक जोड़ा और सभी मामलों में मॉलोक सफल हुआ। – Donna
यदि सरणी आवंटित नहीं की जाती है तो 'array = x' अवैध है। – stark