Hallo,
ich möchte im AVR-Studio ein eindimensionales Array mit 100 Werten zu
8bit benutzen.
Habe dazu ein paar kurze Fragen.
Ich würde das Array mit
1
uint8_t(variablenname[99][1]);
anlegen.
Nehme dabei an, dass der erste Wert den Index [0] erhält, deshalb [99]
für 100 Werte.
Ist das korrekt?
Wenn ich später auf eine Wert aus dem Array zugreifen will, kann ich
dann einfach so vorgehen:
1
uint8_tf;
2
f=(variablenname[49][1]);
um den 50. Wert auf die Variable f zu übertragen?
Die letzte Frage wäre (und ich nehme an, dass es geht), ob man die
Zahlen in den eckigen Klammern auch durch ganzzahlige, vorzeichenlose
Variablen ersetzen kann?!
(z.B. für Schleifendurchläufe)
Florian schrieb:> uint8_t (variablenname[99][1]);
Wofür die [1]? Die ist sinnlos. Die Klammern können auch weg.
Florian schrieb:> Nehme dabei an, dass der erste Wert den Index [0] erhält, deshalb [99]> für 100 Werte.
Nein. Bei der Deklaration gibst du an, wie viele Elemente das Array
haben soll, also 100. Die werden dann von 0 bis 99 durchnummeriert.
Florian schrieb:> f = (variablenname[49][1]);
Ja, aber auch hier können die Klammern wieder weg.
Florian schrieb:> Die letzte Frage wäre (und ich nehme an, dass es geht), ob man die> Zahlen in den eckigen Klammern auch durch ganzzahlige, vorzeichenlose> Variablen ersetzen kann?!
Für den Zugriff ja, für die Deklaration nicht. Das heißt, du kannst mit
Variablen auf Elemente zugreifen, du kannst aber kein Array mit einer
variablen Größe anlegen.
Hi Florian,
int8_t Variablenname[100];
ist m.E. richtig.
Die Zuweisung ist prinzipiell auch ok; es braucht aber auch hier keine
zwei Klammerausdrücke:
uint8_t f;
f = (variablenname[49]);
Und: Man kann auch Variablen in die eckige Klammer schreiben:
f = (variablenname[Varname2]);
Gruß,
Roman
Danke für die Antworten!
Dussel schrieb:> Florian schrieb:>> uint8_t (variablenname[99][1]);> Wofür die [1]? Die ist sinnlos. Die Klammern können auch weg.
Also runde Klammern weg und beim eindimensionalen Array auch die [1]
weg!?!
Dussel schrieb:> Nein. Bei der Deklaration gibst du an, wie viele Elemente das Array> haben soll, also 100. Die werden dann von 0 bis 99 durchnummeriert.
Danke!
Roman S. schrieb:> Und: Man kann auch Variablen in die eckige Klammer schreiben:>> f = (variablenname[Varname2]);
Danke für den Hinweis! Dann kann man z.B. bequem eine Schleife
durchlaufen lassen, um das Array zu füllen.
Wenn man beispielsweise den dritten Wert des Arrays mit dem Inhalt der
Variable f füllen will, schreibt man
1
variablenname[2]=f;
nehme ich an.
(oder eben statt der [2] eine Variable mit dem Inhalt 2)
Viele Grüße, Florian
Florian schrieb:> Also runde Klammern weg und beim eindimensionalen Array auch die [1]> weg!?!
Ja
Florian schrieb:> Wenn man beispielsweise den dritten Wert des Arrays mit dem Inhalt der> Variable f füllen will, schreibt manvariablenname[2] = f;> nehme ich an.
Ja
Florian schrieb:> Dussel schrieb:>> Florian schrieb:>>> uint8_t (variablenname[99][1]);>> Wofür die [1]? Die ist sinnlos. Die Klammern können auch weg.>> Also runde Klammern weg und beim eindimensionalen Array auch die [1]> weg!?!
Ja, das meinte ich. Ich hoffe, dass ich jetzt nichts Falsches sage. Die
[1] kann auf jeden Fall weg, aber die Klammern könnten in C nötig sein.
In C++ sind sie es nicht. Probier es mal aus.
Florian schrieb:> Dann kann man z.B. bequem eine Schleife> durchlaufen lassen, um das Array zu füllen.>> Wenn man beispielsweise den dritten Wert des Arrays mit dem Inhalt der> Variable f füllen will, schreibt man> variablenname[2] = f;> nehme ich an.
Ja. Das ist der Sinn eines Arrays. Sonst könnte man auch
variable1,variable2,variable3… benutzen.
1
for(unsignedshorti=0;i<100;i++)
2
{
3
variablenname[i]=0;
4
}
setzt alle Werte auf 0. Ein oft gemachter Fehler ist dabei, in der
Bedingung <=100 zu schreiben. Dann würde die Schleife aber den Wert
i=100 auch durchlaufen und auf variablenname[100] zugreifen, was nicht
existiert.
Genauso geht
Dussel schrieb:> Ja, das meinte ich. Ich hoffe, dass ich jetzt nichts Falsches sage. Die> [1] kann auf jeden Fall weg, aber die Klammern könnten in C nötig sein.> In C++ sind sie es nicht. Probier es mal aus.
Werde es später testen, Danke für den Hinweis!
Und vielen Dank auch für die kommentierten Beispiele!!!
Dussel schrieb:> Genauso geht> unsigned short Summe=0;> for(unsigned short i=0;i<100;i++)> {> Summe=Summe+variablenname[i];> }> float Durchschnitt=Summe/100;um den Durchschnitt zu berechnen.
...und sich dann über das Ergebnis wunderen was dabei herauskommt wenn
die Summe von einhundert 8Bit Werte nicht in einen 8Bit Wert passt und
mittendrin Überläufe passieren:-)
Wenn dann eher so:
Quartaner schrieb:> Oder noch einfacher...eine Zweierpotenz als Anzahl nehmen!> Dann kann das Dividieren durch Schieben ersetzt werden ;-)
Das halte ich bei einem erwünschten float-Ergebnis für ein Gerücht.
Irgenwer schrieb:> ...und sich dann über das Ergebnis wunderen was dabei herauskommt wenn> die Summe von einhundert 8Bit Werte nicht in einen 8Bit Wert passt und> mittendrin Überläufe passieren:-)
Und jetzt überlegen wir mal: Nehmen wir an, dass jeder Eintrag des
Arrays den Maximalwert von 255 (wegen uint_8t) hat. Dann ist die Summe
100*255=25500. Der Wertebereich von unsigned short ist mindestens
[0,65535]. Das heißt, dass alle möglichen Summen in Summe passen. Da
gibt es nichts mit Überlauf.
Eine eigene Frage?
Dieser Thread ist über 12 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.