www.mikrocontroller.net

Forum: PC-Programmierung [C] dynamisches array


Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht 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:
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?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht 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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.