Я хочу создать функцию, которая возвращает все возможные числа, по которым число можно разделить. Также я хочу использовать эти возвращенные результаты в другой функции, которая ищет все простые числа в этих результатах и, в свою очередь, возвращает их.«Динамические (указательные) массивы» по функциям
Короче говоря, я хочу иметь возможность возвращать «динамические массивы» и использовать их снова в другой функции.
То, что я до сих пор:
int *division (long a) {
int i;
int *divResult = malloc(a * sizeof(long)); //Ultimately I want to allocate space dynamically instead of reserving too much space
if (naturalNumber(a)) { //What it basically does is "fmod(a, 1)" (returns boolean)
divLength = 0; //A global int set to trace the length of division()
for (i = 0; i < a + 1; i++) {
if (divisor(i, a)) { //Checks wether the division of a by i returns a whole number (returns boolean)
//divResult = realloc(divResult, sizeof(long)); //This gives seg faults and errors durning runtime; To be clear I am not exactly using it like this. What I do is I adjust the "malloc(a*sizeof(long))" to "malloc(sizeof(long))"
divResult[i] = i; //If i is a divisor add it to the pointer
divLength += 1; //track how long the current division is
}
}
}
free(divResult); //I was hoping this to remove the divResult from the memory, sadly it is still there and doesnt give me an error of me trying to return a NULL value
//printf("Mem: %p\n", (void *)divResult);
return divResult; //Return a "dynamic array" so that another function can use it
}
Как вы можете видеть, я отдаю себе отчет в том, что я должен использовать указатели вместо реальных массивов, так как те, которые не могут быть возвращены. Я знаю, что это работает и вернуло истинные ценности.
Также я хочу эту функцию, чтобы использовать функцию деления(), чтобы увидеть делители числа и поместить их в массив:
int *primes (long a) { //I'm trying to reuse the same tactic as before:
int i;
int *primeResult = malloc(a * sizeof(long)); //Allocating it again...
if (naturalNumber(a)) { //See previous codeblock
for (i = 0; i < a + 1; i++) {
division(i); //Calling the function here to divide each number from 1 to "a" so I am able to see which one is of size 2 (in other words the division of number *1 to a* and check wether it is a prime number (it has in total only 2 divisors))
printf("len = %d\n", divLength); //prints the current length of division()
if (divLength == 2) { //If the division() "length" is 2
primeResult[i] = i; //add i to primes
}
}
}
free(primeResult); //Same as above
return primeResult;
}
Как вы можете догадаться, я не получаю ожидаемых результатов.
Использование:
int *div;
div = division(a) + 1;
for (i = 0; i < a; i++) {
if (*(div + i) != 0)
printf("*(div + %d) : %d\n", i, *(div + i));
}
int *prime;
prime = primes(a) + 1;
for (i = 0; i < a; i++) {
if (*(prime + i) != 0)
printf("*(prime + %d) : %d\n", i, *(prime + i));
}
я получаю:
len = 6
len = 1
len = 2
len = 2
len = 3
len = 2
len = 4
len = 2
len = 4
len = 3
len = 4
len = 2
len = 6
*(prime + 1) : 2
*(prime + 2) : 3
*(prime + 3) : 4
*(prime + 4) : 5
*(prime + 5) : 6
*(prime + 6) : 7
*(prime + 10) : 11
*(prime + 11) : 12
Я могу заверить вас, что если я закомментировать все следы, кроме тех, для разделения() и будем называть простыми числами() Я все еще получаю в результате:
*(div + 1) : 2
*(div + 2) : 3
*(div + 3) : 4
*(div + 5) : 6
*(div + 11) : 12
len = 0
len = 0
len = 0
len = 0
len = 0
len = 0
len = 0
len = 0
len = 0
len = 0
len = 0
len = 0
len = 0
*(prime + 1) : 2
*(prime + 2) : 3
*(prime + 3) : 4
*(prime + 5) : 6
*(prime + 11) : 12
Итак, я знаю, что мой код плох; Вот почему я прошу сейчас (я все еще учусь), я спрашиваю вас:
- Почему до сих пор возвращается значение деления(), даже если я «освободил» память divResult?
- Как я могу заставить realloc() работать?
- Есть ли более простой способ сделать все это в отдельно функции?
И последнее, но не менее важное: кто-нибудь действительно понял, что я прошу?
Больно читать длинные вопросы. :) – haccks
ИМХО это не спасает. Чтобы решить ваши проблемы, вы должны действительно изучить язык C. Объяснение того, что не так в этом коде, будет * много *. –
Освобождение памяти, а затем возврат указателя на нее, похоже на то, чтобы выбросить ваш полный контейнер для еды, прежде чем есть. –