Array erweitern in C?
Hallo.
Als Teil einer Methode in C zur Bestimmung, ob eine Zahl n eine perfekte Zahl ist (Summe aller echten Teiler von n ergibt n) will ich ein Array mit allen Teilern erstellen, welches dynamisch erweitert werden soll, bis alle Teiler enthalten sind. Danach soll man bestimmen können, dass die Zahl perfekt ist, wenn die Summe der Elemente n ergibt, und wenn nicht, dann nicht.
Wie kann ich das Array erweitern? Laut meinen Notizen kann man ein bestimmtes Element hinzufügen durch folgende Form (Beispiel): int array[] = { [7] = 42 } – dem achten Element wird der Wert 42 zugewiesen.
Hier mein bisheriges Programm. Der Wert von divisor soll als Element dem Array divisors[] hinzugefügt werden, wenn es sich um einen echten Teiler handelt, und zwar bis einschließlich der 1:
#include <stdio.h>
int main()
{
int n,m,divisor,divisors[m];
m = 0;
printf("Geben Sie eine ganze Zahl ein.\n");
scanf("%d",&n);
for (divisor = n; divisor > 0;) {
if (n % divisor == 0) {
m++;
divisors[m] = {[m] = divisor};
}
divisor--;
}
return 0;
}
Da meckert der aber rum:
main.c:11:27: error: expected expression before '{' token
Wie muss ich das schreiben, damit es funktioniert?
4 Antworten
Du machst 3 ganz elementare Fehler in deinem Code:
- Die vergisst die Decrementierung von n, siehe Antwort von ETechnikerfx
- Eine Syntax a la "int array[] = { [7] = 42 }" funktioniert meines Wissens nach nur bei der Initialisierung von Arrays, nicht bei einem späteren Zugriff. In dem Fall greift man (sowohl lesend als auch schreibend) einfach mit divisors[m] auf das entsprechende Element zu
- Und das ist mit Abstand der wichtigste Fehler: Du hast ein statisches Element der Größe m erzeugt. m ist aber uninitialisiert, d.h. die Größe ist eigentlich unbekannt. Es gibt also mit an Sicherheit grenzender Wahrscheinlichkeit Speicherlecks in dem Code. Du hast 2 Optionen um das Problem zu lösen: Entweder ist dir von vornherein bekannt, wie groß das Array maximal wird => Diese Größe als statisches Array allokieren. Falls das nicht der Fall ist, dann musst die ein dynamisches Array nutzen und es ggf erweitern (Speicherallokation funktioniert mittels malloc/calloc und free)
Du hast die Incrementbedingung im For-Rumpf vergessen. Was soll dort incremetiert werden? Vermutlich der Devisor korrekt? dann sollte das auch so dort stehen:
for (divisor = n; divisor > 0; divisor --) {
Der Devisor muss ja decrementiert werden, da du diesen mit n initialisierst.
divisors[m] = divisors;
Im übrigen schreibst du deinen ersten Teiler in divisors[0], nicht in divisors[1].
Dies nur zur Info
Im übrigen schreibst du deinen ersten Teiler in divisors[1], nicht in divisors[0], sollte es natürlich heißen!
Du meinst
"Im übrigen schreibst du deinen ersten Teiler in divisor[1], nicht in divisor[0]" oder?