#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. Это работает для данной конкретной ситуации, но жестко закодировано и, следовательно, менее гибко, чем другие предлагаемые ответы. Если кто-то хочет это сделать, ему, вероятно, следует определить константу для длины массива, чтобы она могла обновляться в одном месте и оставаться правильной как в объявлении массива, так и в его использовании.