Почему я получаю исключение с плавающей запятой?

#arrays #c #debugging

Вопрос:

Эта программа работала нормально, когда я вручную перебирал 5 отдельных переменных, но когда я заменил их этими массивами и циклом, я начал получать исключения с плавающей запятой. Я пробовал отладку, но не могу найти, из-за чего возникла ошибка.

 #include <stdio.h>

int main(void) {

  long int secIns;
  int multiplicadors[4] = {60, 60, 24, 7};
  int variables[5];

  int i;

  printf("insereix un aquantitat entera de segons: n");
  scanf("%ld", amp;secIns);

  variables[0] = secIns;

  for (i = 1; i < sizeof variables; i  ) {
    variables[i] = variables[i - 1]/multiplicadors[i - 1];
    variables[i - 1] -= variables[i]*multiplicadors[i - 1];
  }

  printf("n%ld segons són %d setmanes %d dies %d hores %d minuts %d segonsn", secIns, variables[4], variables[3], variables[2], variables[1], variables[0]);

  return 0;
}
 

Комментарии:

1. Вам не кажется, что включение ошибки было бы полезно? 😅

2. Почему это secIns а long int ? Я считаю, что на x64 это обычно 8 байт, в то время int как s-4 байта. Если вы введете достаточно большое число, оно будет каким-то образом усечено, чтобы сэкономить variables[0] . Также рекомендуем проверить возвращаемое значение scanf

Ответ №1:

Проблема в том, что вы перебираете концы своих массивов. Причина в том, что ваше sizeof выражение лица-это не то, что вы хотите. sizeof возвращает размер в байтах, а не количество элементов.

Чтобы исправить это, измените петлю на:

   for (i = 1; i < sizeof(variables)/sizeof(*variables); i  ) {
 

На несвязанной заметке вы можете рассмотреть возможность перехода secIns с long int на int , так как он присваивается элементу int массива , поэтому добавленная точность на самом деле не помогает.

Ответ №2:

Рассмотрим эту строку кода:

 for (i = 1; i < sizeof variables; i  ) {
 

sizeof не делает того, что ты думаешь, что он делает. Вы объявили массив из 5 элементов. В этом случае int являются 32-разрядными, что означает, что каждый из них использует 4 байта памяти. Если вы напечатаете вывод sizeof variables , вы получите 20 , потому что 4 * 5 = 20.

Вам нужно будет разделить sizeof variables его на размер его первого элемента.

Ответ №3:

Как упоминалось ранее, sizeOf возвращает размер байтов, содержащихся в массиве. В отличие от java .длина, возвращающая фактическую длину массива. Требуется немного больше знаний о байтах, когда дело доходит до C.

https://www.geeksforgeeks.org/data-types-in-c/

Эта ссылка расскажет вам немного больше о типах данных и занимаемой ими памяти(байтах).

Вы тоже могли бы это сделать sizeOf yourArrayName/sizeOf (int) . sizeOf(тип данных) возвращает размер байтов, занимаемых типом данных.

Ответ №4:

sizeof даст размер (в байтах) variables и даст разные результаты в зависимости от типа данных. Попробуй:

 for (i = 1; i < 5; i  ) {
 ...
}
 

Комментарии:

1. Это работает для данной конкретной ситуации, но жестко закодировано и, следовательно, менее гибко, чем другие предлагаемые ответы. Если кто-то хочет это сделать, ему, вероятно, следует определить константу для длины массива, чтобы она могла обновляться в одном месте и оставаться правильной как в объявлении массива, так и в его использовании.