C - 2D阵列;所有值都指定为给定的最后一个值

时间:2018-04-17 12:33:48

标签: c arrays

我正在尝试使用给定参数的FrequencyTable。

完整代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {

    double newTable[argc*1][0];
    int newTableCounter = 0;
    int counter = 0;
    double min = 999999999.9;
    double max = -9999999999999999.9;
    int tableLength = argc;
    double temp = 0.0;
    int counter2 = 0;
    int isListed = 0;

    counter = 1;
    /* Min & Max */
    while (counter != tableLength) {
        temp = atof(argv[counter]);
        if (temp > max) {
            max = temp;
        }
        if (temp < min) {
            min = temp;
        }
        counter++;
    }
    printf("Pienin arvo: %f\n", min);
    printf("Suurin arvo: %f\n", max);

  /* FrequencyTabeling */
    for (int i = 0; i < argc; i++) {
    temp = atof(argv[i]);
    isListed = 0;
        if (newTableCounter == 0) {
            newTable[newTableCounter][0] = temp;
            newTableCounter++;
            isListed = 1;
        }
        else {
          for (int i2 = 0; i2 <= newTableCounter; i2++) {        
        if (temp == newTable[i2][0]) {
          newTable[i2][1]++;
          isListed = 1;
          break;
        }       
          }
        }
        if (isListed == 0) {
      printf(" In newTable addition\n");
      printf(" newTableCounter: %d\n", newTableCounter);
          newTable[newTableCounter][0] = temp;
          newTableCounter++;
        } 
    printf("isListed = %d \n", isListed);
    printf("Temp = %f", temp);
  }
  /* FrequencyTable Print */
  for (int i = 0; i < newTableCounter; i++) {
    printf("%d, %f\n", i, newTable[i][0]);
  }
    return 0;
}

但是,表的第一个维度默认为给定的最后一个值; 当以“a 1 2 3”运行时,每个值都为3。

我是C的新手,之前刚刚完成了几年的Java + Python,所以请原谅我这里可能非常初学的问题。

1 个答案:

答案 0 :(得分:1)

使用

double newTable[argc*1][0];

您创建了一个包含argc元素的数组(与1的乘法无关),每个元素依次为 double类型的元素。

拥有一个零元素数组是没有意义的,并且C标准确实不允许这样做。如果您的编译器允许它作为扩展,那么所有索引到这样的数组将是超出范围并将导致undefined behavior

请记住,用于声明数组的值是 size (元素数),而不是top-index。因此,要创建一个元素的数组(没有意义),请使用值1,如

double newTable[argc][1];

在这种情况下,第二个&#34;尺寸&#34;可以跳过,你会有

double newTable[argc];