С учетом предупреждений / ошибок при компиляции кода: (до выпуска вопроса)
в Fibonacci.c
else if(strlen(str) == 0 && str[0] == "")
str[0]
- это char , str[0] == ""
никогда не соответствует действительности, просто сделайте
else if (str[0] == 0)
In
HugeInteger *hugeDestroyer(HugeInteger *p)
{
int length;
// printf("Hiiting destroyer");
if(p == NULL)
{
return;
}
length = p->length;
free(p->digits); // But this works???????
free(p->length);
free(p);
}
, вы никогда не вернетезначение (указатель на HugeInteger ), видимо оно должно иметь подпись void hugeDestroyer(HugeInteger *p)
(также в заголовке)
В
free(p->length);
Вы освобождаете int ?
, удаляете эту строку, а также другие бесполезные строки длиной
так что наконец
void hugeDestroyer(HugeInteger *p)
{
// printf("Hiiting destroyer");
if (p != NULL)
{
free(p->digits); // But this works???????
free(p);
}
}
В
unsigned long long int check = malloc(sizeof(unsigned long long int));
malloc вернуть адрес (указатель), и фактически вы не используете check (check = nextPow + real
isтакже бесполезно)
сложно представить, что вы хотели сделать, убрать все о проверить
в
if(p->digits[k+1] == NULL)
...
if(p->digits[i+1] == NULL)
p->digits[k+1]
- это int , вы сравниваете с указателем, замените NULL на 0
В
hugePrint(fibInt);
неизвестно, отсутствует его объявление
Когда вы компилируете запрос высокого предупреждения / ошибки уровень обнаружения иисправьте ваш код в соответствии
Относительно утечек памяти:
В огромный * Добавить
HugeInteger *test = malloc(sizeof(HugeInteger));
test->length= 1;
test->digits = malloc(sizeof(int));
test->digits[0] = 5;
test никогда не используется после этого, вы просто создаете утечку meomry
resultArray = calloc(((p->length)+ overhead), sizeof(int));
вы устанавливаете его содержимое, но никогда не освобождаете его, этодругая утечка памяти
В fib
HugeInteger *grandfatherFib = malloc(sizeof(HugeInteger));
вы никогда не освободитесь grandfatherFib это другая утечка памяти
Относительно результата:
- fib (0) = 0: ok
- fib (1) = 1: ok
- fib (2) = 2: нормально
- ...
- fib (6) = 8: нормально
- fib (7) = 13: нормально
- fib (8) = 11: k
Ваша проблема в том, что вы плохо добавляете числа по крайней мере из 2 цифр, например, если я изменяюнемного конец огромное добавление для замены
printf("Result array at 0 is %d\n", resultArray[0]); // This is were the
printf("Result array at 1 is %d\n", resultArray[1]); // added numbers are stored.
printf("Result array at 2 is %d\n", resultArray[2]);
printf("=====================\n");
более практичным
printf("=====================\n");
hugePrint(p);
puts("+");
hugePrint(q);
puts("=");
hugePrint(hugerInt);
printf("=====================\n");
и я делаю fib(8)
, что показывает:
...
=====================
08
+
5
=
13
=====================
13
tens value in father fib 0
I is in larger then 9 check 0i is 0
Assigning 1 to 0 in resultarray
length of resultArray is 3
results:1
=================
=====================
13
+
08
=
11
=====================
вы пропустили добавить перенос: 8 + 3 = 11 так 1 и перенос 1 добавить к 1 , чтобы 21 вместо 11
, чтобы
if(results > 9 )
{
printf("I is in larger then 9 check %d", i);
if(p->digits[i+1] == 0)
{
hugerInt->digits[i+1] = 1;
}
недостаточно, потому чтозначение carry должно быть добавлено , не равно 1, если значение 0 (больше нет, только 0 становится 1).Конечно, вам, возможно, придется учесть несколько изменений, добавив перенос от 1 до 999, вы получите 1000
.