Array mit variabler Größe anlegen.
-
Sehr geehrte Community,
habe mal eine Frage: wie legt man ein Array an, dessen Größe variieren soll?
Bräuchte da mal so was für folgendes Programm:
/*
8 * 6.c
*
* Created on: 15.01.2015
* Author:
*//*Heraussortieren der größten Zahl eines Arrays*/
#include<stdio.h>
#include<math.h>int i,x,n;
double a[],maximum;int main (void)
{
do
{
printf("Bitte Anzahl der Werte eingeben!\n");
fflush(stdout);
scanf("%i",&n);
}
while(2<=n&&n<=100);for(i=0;i<n;i=i+1)
{
printf("a[%i]=?\n",i+1);
fflush(stdout);
scanf("%lf",&a[i]);
}
for(x=n-1;x>=1;x--)
{
if(a[x]>a[x-1])
{
a[x-1]=a[x];
}
}
maximum=a[0];printf("maximum=%lf",maximum);
fflush(stdout);
return 0;
}
-
Gar nicht. Die Größe eines Arrays ist immer fest.
Möglichkeiten:
Wenn du die Größe zwar nicht zur Compilezeit kennst, aber im Programmverlauf an irgendeiner Stelle vor der ersten Nutzung fest steht, wie viele Einträge du brauchst und das nicht sehr viele Einträge (in dieser Hinsicht musst du absolut sicher sein!) sind, dann kannst du (ab dem C99-Standard, der aber nicht von allen Compilern unterstützt wird) ein variable length array nutzen:int num_elements = 5; int array[num_elements]; array[3] = 123;
Wohl besser, und auch zur Laufzeit vergrößerbar, ist aber die klassische Methode, sich mittels malloc & Co. Speicher zu besorgen. Den kann man dann ansprechen, als ob's ein Array wäre. Mittels realloc kann man diesen Bereich auch vergrößern, wobei auch automatisch alle Daten kopiert werden, falls der neue, vergrößerte Bereich woanders liegt.
Alle Feinheiten von malloc & Co. darzustellen, sprengt wohl die Möglichkeiten eines Forenbeitrags. Das grobe Nutzungsschema:int num_elements = 5; int *ptr = malloc(num_elements * sizeof(*ptr)); ptr[3] = 123; free(ptr); // Du musst sicher stellen, dass am Ende free auf den Pointer aufgerufen wird!
Gerade der letzte Punkt mit dem free ist nicht ganz trivial, wie man im Programmverlauf (der ja durchaus manchmal nicht ganz leicht zu durchschauen ist) absolut sicher stellen kann, dass jeder gemalloc'te Speicherbereich einmal (und zwar genau einmal!) gefree't wird. Je nach gewünschtem Grad der Absicherung gegen Überraschungen gibt es da unterschiedliche Techniken, wie man das halbwegs sicher stellen kann. Man könnte sogar sagen, dass eine der wichtigsten Motivationen bei der Entwicklung der Sprache C++ war, dass man dort einen Automatismus für diese Problemstellung (die nicht nur bei malloc und free, sondern bei allen Arten von belegbaren Ressourcen vorkommt) hat.
Zu deinem Programm (und nächstes Mal bitte Codetags nutzen, dann guckt sich das vielleicht auch jemand genauer an):
printf("maximum=%lf",maximum);
Der Formatspezifizierer für double (und float, beides!) bei printf ist
%f
.
Das Maximum eines Feldes lässt sich auch zerstörungsfrei bestimmen, benutz einfach deine maximum-Variable zur Speicherung der aktuellen Maximalwerts.
Allgemein ist es oft besser von klein nach groß zu zählen, nicht umgekehrt. Hier sollte es zwar weitgehend egal sein, aber trotzdem besser gleich angewöhnen.Mit obiger Bemerkung über die Maximumssuche ergibt sich auch, dass du hier gar kein Array variable Länge brauchst, denn schließlich kannst du sofort während der Eingabe das Maximum suchen, ohne alle Werte speichern zu müssen. Falls das eine Hausaufgabe war und ihr malloc noch nicht hattet, dann ist dies vermutlich die vorgesehene Lösung.
-
Indem du auf globale Variablen verzichtest.
Du benutzt (mindestens) C99 und es sind nicht viele Element in dem Array:
Dann gehen VLA.
Nach dem while(2<=n&&n<=100); fügst du dann die Definition von deinem Array ein.double a[n];
Sonst musst du dir den Speicher dynamisch holen.
double *a; // Definition .... a = malloc(n,sizeof(*a)); ... // Arbeiten mit dem Speicher free(a); // nicht vergessen.
Aber, da du die maximale Größe auf 100 Elemente begrenzt hast, kannst du auch gleich ein Array anlegen das groß genug ist.
Zum finden des Maximums brauchst du das Array nicht verändern.
Sortiern tust du auch nicht, du überschreibst nur Elemente.Benutzt du Eclipse (oder warum machst du fflush(stdout))?
-
Merci Community,
war leider schon im Halbschlaf, die Arraygröße war ja schon "vordefiniert". Hatte es wie so oft nicht gemerkt. Die Methode mit dem malloc werde ich mal bei Gelegenheit ausprobieren.
Die näächste Frage kommt bestimmt...
Merci.
-
In beiden deinen Threads brauchst du überhaupt keine Arrays (und erst recht kein malloc). Wurde zwar schon mehrmals gesagt, aber du scheinst das irgendwie mit Gewalt zu überlesen.