2017-05-29 121 views
-2

我試圖解決一個網上法官的問題(https://www.codechef.com/LOCMAY17/problems/LOC172)。以下是該問題的代碼。當我提交判斷給出運行時錯誤()。 所有的變量已被用於acc約束。請幫助我找出哪裏出了問題? 下面的代碼給出:這段代碼中運行時錯誤的原因是什麼?

#include<iostream> 
#include<stdlib.h> 
using namespace std; 
main() 
{ 
long long int h,w; 
while(1) 
{ 
    cin>>h>>w; 
    if(h==-1 && w==-1) 
     exit(1); 
    int n,i,j; 
    cin>>n; 
    long long int arr[n][4]; 
    for(i=1;i<=n;i++) 
    { 
     cin>>arr[i][1]>>arr[i][2]>>arr[i][3]; 
     arr[i][4]=0; 
    } 

    for(i=1;i<=n;i++) 
    { 
     for(j=1;j<=n;j++) 
     { 
      if((llabs(arr[j][2]-arr[i][2]))<=arr[j][3]) 
       arr[i][4]++; 
     } 
    } 
    long long int max=arr[1][4]; 
    for(i=2;i<=n;i++) 
    { 
     if(arr[i][4]>max) 
      max=arr[i][4]; 
    } 
    cout<<max<<endl; 
} 
} 

我事先是一個初學者在這個網站,謝謝。

+0

CodeChef是否接受動態數組? – CinCout

+3

從技術上講,您的程序不是有效的C++程序,因爲C++沒有[可變長度數組](https://en.wikipedia.org/wiki/Variable-length_array)。改爲使用['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)。 –

+0

'long long int arr [n] [4];'不應該編譯。 'n'不是一個常數。 – nakiya

回答

1

很難找到在未編譯的代碼運行時錯誤...

這是無效的

long long int arr[n][4]; 

,因爲你這樣做:

int n,i.... 

n實際上必須是編譯時間 c onstant,這僅僅是因爲C++不允許變長數組

具有說,陣列是0基地索引數據容器所以這這裏是造成UB:

for (i = 1; i <= n; i++) 

因爲你離開索引0處的元素完好無損,並寫入數組邊界之外的地方。

+1

不僅是恆定的,而且是*編譯時*常量。這不是運行時錯誤的原因,但這會導致數組索引超出範圍。 –

+0

我通過int arr [10] [4]將內存分配更改爲static,但它仍顯示運行時錯誤。 – nikita0112

相關問題