Größe eines Arrays in C nach bearbeiten
Matthias
- vb-script
Hi Checker,
mal eine Frage.
Wenn ich in C eine Array deklariere, z.B. double array[10]; dann habe ich logischerweise die Stellenanzahl vorgegeben, muss ich ja auch.
Ich will aber jetzt, das man eine beliebige Zahl eingibt, die mit scanf() in einer Variablen (z.B. int eingabe) gespeichert wird. Diese Zahl soll gleichzeitig die Anzahl der Stellen des Array -1 angeben.
Leider funktioniert array[eingabe-1] nicht.
Kann mir jemand helfen ?
Grüsse
Matthias
你好 Matthias,
Leider funktioniert array[eingabe-1] nicht.
Was heisst “funktioniert nicht”? Es ist syntaktisch und logisch richtig,
es ist nur etwas unsicher (es fehlt die Absicherung, dass eingabe > 0 und
< 10 ist).
再见,
CK
Mein Compiler mag keine Variablenoperationen innerhalb der Klammern [] des arrays.
Die Operation array[anzahl-1] liefert verblüffend komische Ergebniss:
Jetzt müsste man vor der Ersten Schleife das daMessDaten[10] auf die gewünschte eingegebene Anzahl bringen, sozusagen daMessDaten[iMwAnz]
Hier mal der Code:
_______________________________________
#include <stdio.h>
double dCalcMittel(int,double[]);
int main()
{
int iMwAnz,i;
double daMessDaten[10],messwert;
printf("Anzahl der Messwerte: ");
scanf("%d",&iMwAnz);
for(i=0;i<iMwAnz;i++)
{
printf("Gib Messwert %d:",i+1);
scanf("%lf",&messwert);
daMessDaten[i] = messwert;
printf("Wert i: %d", i);
}
for(i=0;i<iMwAnz;i++)
{
printf("Gib Messwert aus: %2.1lf\n",daMessDaten[i]);
}
printf("\nMittelwert: %12.4g\n",dCalcMittel(iMwAnz,daMessDaten));
return 0;
}
double dCalcMittel(int anzahl,double arr[])
{
int i;
double summe=0,mittelwert;
for(i=0; i<anzahl; i++)
{
summe += arr[i];
}
mittelwert = summe / anzahl;
return mittelwert;
}
你好 Matthias,
Mein Compiler mag keine Variablenoperationen innerhalb der Klammern []
des arrays.
Was ist denn das fuer ein komische Compiler?
Die Operation array[anzahl-1] liefert verblüffend komische Ergebniss:
Das waere?
Jetzt müsste man vor der Ersten Schleife das daMessDaten[10] [...]
Das gibts nicht, es gibt nur 0-9.
再见,
CK
z.B. double array[0]; geht z.B. auch nicht !
da kommt "Reservierung eines Feldes der konstanten Groesse 0 nicht moeglich"
Der Compiler ist von Microsoft Visual C++ 6.0
你好 Matthias,
z.B. double array[0]; geht z.B. auch nicht !
da kommt "Reservierung eines Feldes der konstanten Groesse 0 nicht
moeglich"
Natuerlich geht das nicht. Damit legst du ein Array an, das 0
Speicherplaetze haben soll. Irgendwie unlogisch, oder? :) Wenn du auf das
0te Element eines Arrays zugreifen willst, dann geht das einfach ueber
printf("%f\n",array[0]);
Der Compiler ist von Microsoft Visual C++ 6.0
Dem ist es aber egal, ob innerhalb von [] Rechenoperationen gemacht werden
oder nicht. Also,
printf("%f\n",array[10-1])
ist vollkommen richtig.
再见,
CK
Hi,
Mein Compiler mag keine Variablenoperationen innerhalb der Klammern [] des arrays.
Läßt sich bei den VisualCrap auch abstellen, schau mal in die Betriebsanleitung, habe das nicht im Kopf.
Aber das ist auch gar nicht Dein Problem, oder wie man im hier an dieser Stelle meist zu sagen pflegt: nein, das möchtest Du gar nicht.
Ich erlaube mir mal einen ausführlichen Kommentar des Codes, bevor ich zum eigentlichem Problem und möglichen Lösungswegen komme:
#include <stdio.h>
double dCalcMittel(int,double[]);
int main()
{
"Indian Style" (Berühmte Art der Formatierung des Quellcodes, siehe Google) hat bei der Blockklammersetzung auf die nächste Zeile den Nachteil, das ein evt Semikolon am Ende der vorigen Zeile unbabsichtigt dazwischen rutschen kann. Ist aber hauptsächlich Geschmacksache, zugegeben.
int iMwAnz,i;
Ein int ist nur bei sehr kleinen Zahlen zulässig, da man nicht weiß, wie groß das int denn nun wirklich ist. Besser sind die direkten Angaben aus stdint.h.
Hier geht's, klar, aber sollte man sich nicht angewöhnen. Exakte Angaben sind immer besser, wenn sie möglich sind.
double daMessDaten[10],messwert;
Hier legst Du Dich auf maximal 10 Speicherplätze für daMessDaten fest und bekommst am Ende die Probleme, ja?
printf("Anzahl der Messwerte: ");
scanf("%d",&iMwAnz);
scanf() gibt etwas zurück, das man auch tunlichst prüfen sollte, denn da kommt raus, ob ein Fehler aufgetaucht ist. Z.B. bei einem Buchstaben anstatt einer Zahl würde scanf() 0 zurückgeben.
for(i=0;i<iMwAnz;i++)
{
printf("Gib Messwert %d:",i+1);
scanf("%lf",&messwert);
s.o.
daMessDaten[i] = messwert;
printf("Wert i: %d", i);
Hier fehlt wohl ein Zeilenendezeichen?
printf("\nMittelwert: %12.4g\n",dCalcMittel(iMwAnz,daMessDaten));
Sowas sollte man auch nicht tun, da dCalcMittel() evt einen Fehler produziert. Du testest ja nicht, ob überhaupt genügend Meßwerte vorhanden sind.
return 0;
Vorzuziehen sind in main()s return die Macros EXIT_SUCCESS und EXIT_FAILURE (in stdlib.h), da es nicht sicher ist, ob 0 im Betriebsystem tatsächlich "Fehlerfreie Ausführung" bedeutet.
double dCalcMittel(int anzahl,double arr[])
[...]
mittelwert = summe / anzahl;
Hier ist vorher zu prüfen, ob alle Beteiligten an dieser Division überhaupt zulässige Werte haben, also ungleich 0 sind. Problem dabei: Floating Point Vergleiche sind etwas aufwendiger, ein "if(summe == 0.0)return 0.0;" funktioniert so nicht.
Aber nun zu Deinem eigentlichem Problem:
Du möchtest eine variable Anzahl an Meßwerten verarbeiten können, sehe ich das richtig? Dazu ist eine dynamische Speicherverwaltung geschaffen worden (es gibt natürlich auch andere Wege, aber die sind hierfür zu komplex. "Keep it simple, Dude!" ;-). Siehe malloc() und Konsorten.
Du mußt hierfür die Größe von double kennen (sizeof()) und das dann mit der Anzahl der Meßwerte multiplizieren und malloc() übergeben. Mit realloc() kannst Du den Speicherbereich vergrößern. Du brauchst also mit dieser Methode die Anzahl der Meßwerte gar nicht mehr im Voraus zu wissen.
Viel Spaß beim Knobeln ;-)
Ah, kleiner Tip noch: Pointer erleichtern das Geschäft wesentlich und ich meine nicht die Hunderasse!
so short
Christoph Zurnieden