я не могу использовать double в массиве? - PullRequest
0 голосов
/ 29 января 2019

в чем тут проблема?это показывает ошибку, помогите мне, я новичок.можно использовать double в массиве?

    #include <stdio.h>
    int main()
    {
    double a;
    scanf("%lf",&a);
    double s[a];
    double b,c=0, d;
    for(b=0;b<a;b++){
    scanf("%lf",&s[b]);
    }
    for(b=0;b<a;b++){
    c = c + s[b];
    d=b+1;
    printf("%lf\n",c/d);
    }
    return 0;
    }

Ответы [ 4 ]

0 голосов
/ 29 января 2019

Нельзя использовать типы с плавающей запятой (float или double) для указания размера массива или индекса массива:

6.7.6.2 Деклараторы массива

Ограничения

1 В дополнение к необязательным квалификаторам типов и ключевому слову static, [ и ] могут разделятьвыражение или *. Если они разграничивают выражение (которое определяет размер массива), выражение должно иметь целочисленный тип .Если выражение является константным выражением, оно должно иметь значение больше нуля.Тип элемента не должен быть неполным или функциональным.Необязательные квалификаторы типов и ключевое слово <strong>static</strong> должны появляться только в объявлении параметра функции с типом массива, а затем только при выводе самого внешнего типа массива.

C 2011 Онлайн-черновик

6.5.2.1 Подписка на массив

Ограничения

1 Одно из выражений должно иметь указатель типа '' для завершения объекта тип '', другое выражение должно иметь целочисленный тип, а результат имеет тип '' тип ''.

Там же.

Так что a и b должны быть целого типа - я обычно использую size_t для размера массива ииндексные переменные:

size_t a;

printf( "Gimme the array size: " );
scanf( "%zu", &a );

double s[a];

for ( size_t b = 0; b < a; b++ )
  scanf( "%lf", &s[b] );
0 голосов
/ 29 января 2019

Используйте это:

int a;
scanf("%d",&a);

Остальная часть вашего кода в порядке.

0 голосов
/ 29 января 2019

Если неясно, ваш массив не может быть двойной длины.Это неопределенное поведение.

Это потому, что double - это не целое число, а рациональное число, которое может быть целым числом.Простой способ понять эту проблему состоит в том, чтобы взять некоторое значение с плавающей запятой, скажем, 3.5.

Что такое массив длины 3.5. Это три с половиной слота некоторого размера в непрерывной памяти?Достаточно ли слотов для 3?4?Слоты 3.5, скорее всего, будут бесполезными и непреднамеренными, и если это не дробный слот, он может быть нечетким и, вероятно, непреднамеренным, а следовательно, неопределенным поведением.

Хотя другие люди предложили решения, создающие интегральный тип, вы не можете создатьмассив двойной длины.Вы можете создать массив значений типа double, т.е.

double arr[5];

Но вы не можете создать массив двойной длины, например

int arr[3.3];
0 голосов
/ 29 января 2019

Хотя массивы переменной длины поддерживаются в современном C, размер массива должен быть положительным и целочисленным.

Вместо этого вы можете округлить до ближайшего size_t:

size_t ASIZE = ceil(fabs(a));
double s[ASIZE];

Включите <math.h> для доступа ceil и fabs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...