2015-06-06 47 views
0

我知道这个错误消息的其他问题,但它们都不能解决我的错误消息 这里的代码找到第一个三角形数字有N个输入N的因子(这个问题通常在项目Euler中找到)我使用sieve of Eratosthenes来生成质数列表,并使用它由Divisor function 使用,并且我缓存了三角形数字的值= 500-> 1000 节省时间。并在编译的GCC,我发现这个错误消息长整型数组导致错误:下标值既不是数组也不是指针也不是向量

error: subscripted value is neither array nor pointer nor vector 
if(n>=500) printf("%li\n",tri[n-500]); 
          ^

这里是完整的代码

#include <stdio.h> 
#include <stdlib.h> 
#define MAX 1000000 
#define NofPrime 78498 
int main(){ 
    long tri[] = {76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,76576500,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,103672800,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,236215980,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320,842161320}; 
    unsigned char *table = malloc(sizeof(char)*MAX); 
    int i,j,c=0; 
    unsigned int *prime = malloc(sizeof(unsigned int)*NofPrime); 
    for(i=0;i<MAX;i++)table[i] = 0; 
    for(i=2;i<MAX;i++){ 
    if(table[i]==0){ 
    prime[c] = i; 
    c++; 
    for(j=2;i*j<MAX;j++) table[i*j] = 1; 
    }} 
    free(table); 
    int t; 
    scanf("%i",&t); 
    while(t>0){ 
    unsigned long max=1,counter,tri,n,tricpy; 
    scanf("%li",&n); 
    if(n>=500) printf("%li\n",tri[n-500]); 
    else while(max++){ 
     tri = (1+max)*max/2; 
     tricpy = tri; 
     counter=1; 
     int i,j; 
     for(i=0;prime[i] <= tricpy;i++){ 
     j =1; 
     while(tricpy%prime[i]==0){ 
      j++; 
      tricpy/=prime[i]; 
     } 
     counter*=j; 
     } 
     if(counter>n){ 
     printf("%lu,",tri); 
     break; 
     } 
    } 
    t--; 
    } 
    free(prime); 
} 
+3

你已经在while循环中重新声明了'tri':'unsigned long max = 1,counter,tri,n,tricpy;' –

+0

哦我根本没有注意到 我继续寻找数组溢出和那种事情! 谢谢 –

+0

更加慷慨地缩进你的代码,4个空格被认为更具可读性。将长行换成79个字符,'long tri [] = {...};'的定义是真正的痛苦。 – chqrlie

回答

0

unsigned long max=1,counter,tri,n,tricpy; 

三的定义将在

使用的一个
if(n>=500) printf("%li\n",tri[n-500]); 

等等inde ed tri不是数组或指针。

相关问题