В вашем коде несколько проблем.Не уверен, что я их всех заметил, но вот некоторые из них, с которых нужно начать.
Этот цикл:
for (int i = lengthof_x; i >= 0; i--) {
result[j] = x[i] * y;
j++;
}
выполняется "lengthof_x + 1" раз.Другими словами - слишком много!Вы хотите изменить его на:
for (int i = lengthof_x - 1; i >= 0; i--) { // notice the "- 1"
result[j] = x[i] * y;
j++;
}
Далее у вас есть:
result_end.pointer = result;
, но, похоже, вы вычислили результат в переменной final_result
, поэтому вы возвращаете неверный результатмассив.
Однако - в любом случае вам не разрешено вернуть указатель на локальный массив!Когда функция вернется, она выйдет из области видимости.Так что даже если вы сделаете:
result_end.pointer = final_result;
, это все равно неверный код.Вам понадобится malloc
массив (и это снизит производительность).
Тогда вы получите:
result_end.length = i + 1;
Таким образом, вы увеличиваете длину в all случаев.Это неверно.Вы должны увеличивать значение только тогда, когда у вас есть перенос.
Ниже я попытался исправить ваш код, то есть я попытался сохранить общую структуру вашего кода, чтобы вы могли видеть, где вы допустили ошибки.
#include <stdio.h>
#include <stdlib.h>
struct returnpointer { int * pointer; int length; };
void print_num(struct returnpointer * num)
{
printf("len=%d\nvalue=", num->length);
for(int i = 0; i <num->length; i++) {
printf("%d", num->pointer[i]);
}
}
struct returnpointer mul_arrays(int * x, int y, int lengthof_x) {
struct returnpointer result_end;
int result[lengthof_x + 1];
// Multiply all element and revert array
int j = 0;
for (int i = lengthof_x-1; i >= 0; i--) {
result[j] = x[i] * y;
j++;
}
// Handle carry
int carry = 0;
for (j = 0; j < lengthof_x; j++) {
result[j] = result[j] + carry;
carry = result[j] / 10;
result[j] = result[j] % 10;
}
// Did length increase
if (carry)
{
lengthof_x++;
result[j] = carry;
}
// malloc result and revert back to desired format
j = 0;
int* final_result = malloc(lengthof_x * sizeof *final_result);
for (int i = lengthof_x-1; i >= 0; i--) {
final_result[j] = result[i];
j++;
}
result_end.pointer = final_result;
result_end.length = lengthof_x;
return result_end;
}
int main(int argc, char *argv[])
{
int arr[] = { 5, 1, 2, 3, 8, 6};
struct returnpointer num = mul_arrays(arr, 2, 6); // 512386 * 2 -> 1024772
print_num(&num);
}
Вывод:
len=7
value=1024772
Обратите внимание, что это не оптимальное решение ...