Forum: PC-Programmierung [C] dynamisches array


von Sam .. (sam1994)


Lesenswert?

Hi

Ich programmiere gerade ein Schachcomputer, der später auf dem Atmega644 
laufen soll. Erstmal aber auf dem PC, da ich da mehr Debug-Möglichkeiten 
habe. Nun bin ich aber auf ein Problem gestoßen: Mein Programm wird erst 
eine grobe Analyse der möglichen Züge machen und dann auf die (nach der 
Heuristik) wahrscheinlich besten Züge genauer eingehen. Da das ganze 
natürlich iterativ ist, brauche ich nZüge  nSuchtiefe  2Byte 
(Stellungsbewertung). Ich könnte natürlich sagen, mehr als 100 Züge kann 
man nicht machen: 100  20  2 -> Da hab ich schon den Speicher voll.
Also müsste ich die Array nur so groß machen wie ich sie brauche.
Ich weiß aber vorher nicht wieviele Züge es gibt. Dauernd neuen Speicher 
zu allokieren macht aber auch keinen Sinn:
Man müsste folglich so etwas machen:
1
int16_t* rating = malloc(100 * sizeof(int16_t));
Mit free gibt man das ja wieder frei. Wie kann ich aber 160 Byte 
freigeben, wenn es nur 20 Züge gibt?

von Klaus W. (mfgkw)


Lesenswert?

Prinzipiell kann man mit realloc() bereits allokierte Blöcke in
ihrer Größe veränden.

Die ganze Spielerei mit malloc(), realloc() und free() ist
aber für AVR eher kontraproduktiv, weil nicht viel Speicher
vorhanden ist und der dann auch noch fragmentiert wird.

Entweder sucht man sich einen Rechner mit satt Speicher für
sowas, oder einen Algorithmus, der auf einem Kleinrechner
sinnvoller läuft.

von Karl H. (kbuchegg)


Lesenswert?

Samuel K. schrieb:

> man nicht machen: 100  20  2 -> Da hab ich schon den Speicher voll.
> Also müsste ich die Array nur so groß machen wie ich sie brauche.
> Ich weiß aber vorher nicht wieviele Züge es gibt.


Gegenfrage:

Dein Speicherausbau sieht so aus

  [  loakle Variablen ]

  [  Speicher für dynamische Allokierungen ]

  [ Stack ]


Der SPeicher für lokale Variablen ist fix, die brauchst du.
Der Stack wächst nach Bedarf, hat aber auch eine Obergrenze größen-
mässig.
Und das Loch dazwischen, dort ist Platz für dynamische Allokierungen.

Dieses Loch ist aber sowieso begrenzt. Wenn du also nur 1 Ding hast, das 
du ständig dynamisch allokieren willst, dann kannst du dir das auch 
gleich sparen und den Speicher statisch als globale Variable anlegen und 
mit einer Maximalgröße allokieren. Denn: Wenn der Speicher nicht reicht, 
dann reicht er auch dann nicht, wenn du dynamisch allokierst.
Das einzige was du dir mit dynamischer Allokierung ins Boot holst, ist 
zusätzlicher Aufwand. Aber sonst gewinnst du nichts. Du hast ja nicht 
mehr Speicher zur Verfügung, nur weil du dynamisch allokierst. Eher 
sogar weniger, weil malloc ja auch für seine Verwaltungsinfo etwas 
Speicher braucht. Und wenn dann noch Speicherfragmentierung dazu kommt, 
dann ist es sowieso ganz schnell zappenduster.

von Sam .. (sam1994)


Lesenswert?

Das heißt ich sollte lieber ein Array nehmen das ich befüllen und eines, 
dass den Anfang der Datensätze angibt (da sie sowieso nur von oben 
bearbeitet werden).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.