Forum: Compiler & IDEs AVR Studio: Array benutzen


von Florian (Gast)


Lesenswert?

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_t f;
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)

von Dussel (Gast)


Lesenswert?

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.

von Roman S. (kadege)


Lesenswert?

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

von Florian (Gast)


Lesenswert?

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

von Kaj (Gast)


Lesenswert?

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

von Florian (Gast)


Lesenswert?

Super, Danke an Euch!!!

von Dussel (Gast)


Lesenswert?

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(unsigned short i=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
1
unsigned short Summe=0;
2
for(unsigned short i=0;i<100;i++)
3
{
4
    Summe=Summe+variablenname[i];
5
}
6
float Durchschnitt=Summe/100;
um den Durchschnitt zu berechnen.

von FlorianM (Gast)


Lesenswert?

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!!!

von Irgenwer (Gast)


Lesenswert?

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:
1
uint8_t variablenname[100];
2
...
3
uint16_t Summe=0;
4
for(uint8_t i=0; i<100; i++)
5
{
6
  Summe+=(uint16_t)variablenname[i];
7
}
8
float Durchschnitt=(float)Summe/100.0;

von Quartaner (Gast)


Lesenswert?

Oder noch einfacher...eine Zweierpotenz als Anzahl nehmen!
Dann kann das Dividieren durch Schieben ersetzt werden ;-)

von Karl H. (kbuchegg)


Lesenswert?

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.

von Dussel (Gast)


Lesenswert?

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.

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.