Forum: Mikrocontroller und Digitale Elektronik Array C Frage


von C_NOOBI (Gast)


Lesenswert?

Kurze für Spezialisten vermutlich einefache Frage zu C-Arrays:

ich habe verschiedene Arrays mit verschiedener Anzahl von Feldelementen:
1
double Array_1[] = {1,2,3,4,5};
2
double Array_2[] = {6,7,8};
3
double Array_to_choose[];

Jetzt möchte ich einen Menucounter abfragen und diesen auswerten und je 
nach dem das Array_to_choose mit einem der beiden Arrays gleichsetzen.
1
unsigned char menucounter;
2
Switch(menucounter)
3
{
4
case 0:
5
Array_to_choose[] = Array_1[]; // So funktioniert es nicht
6
break;
7
case 1:
8
Array_to_choose[] = Array_2[]; // So funktioniert es nicht
9
break;
10
}

So funktioniert es natürlich nicht. Muss ich von Anfang an einge Größe 
für das Array_to_choose angeben?
Wie löst man so etwas sauber?

von Mark B. (markbrandis)


Lesenswert?

C_NOOBI schrieb:
> Wie löst man so etwas sauber?

Im Prinzip sehe ich zwei Möglichkeiten:

1.) Wenn Du wirklich ein drittes Array brauchst und haben willst, dann 
lege ein drittes, leeres Array an. In dieses kopierst Du dann die 
Elemente von entweder Array_1[] oder Array_2[] einzeln nacheinander 
rein, z.B. mit einer for-Schleife.

2.) Vielleicht reicht es aber auch schon, einen Zeiger zu verwenden. 
Dieser wird auf dasjenige Array gesetzt, welches eben ausgewählt wurde. 
Der Zeiger würde dann auf das erste Element des gewählten Arrays zeigen, 
und über ihn könnte man die Werte auslesen. Wobei man dazu noch die Info 
benötigt, wie viele Elemente das Array hat.

von Udo S. (urschmitt)


Lesenswert?

So wird das nichts.
Woher weisst du dann wie groß das entsprechende Array ist?
Du brauchst dann entweder eine Hilfsvariable mit der Größe
Oder du hast mindestens ein null Element am Ende des Arrays anhand 
dessen du erkennst dass du am Ende des Arrays angekommen bist.

So definierst du ein Array:
C_NOOBI schrieb:
> double Array_to_choose[];

Aber so wird es nicht benutzt:
C_NOOBI schrieb:
> Array_to_choose[] = Array_1[];

Sondern so:
Array_to_choose = Array_1;

So hat das keinen Sinn, das sind die absoluten Grundlagen über die 
Verwendung von Arrayvariablen. Wenn du die nicht kennst, dann stehst du 
mit deinen Programmierbemühungen in 10 Minuten wieder hier auf der 
Matte.

Du brauchst ein C Buch und musst die ersten paar Kapitel auch 
durcharbeiten bevor du versuchst eigene Programme zu schreiben.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Udo Schmitt schrieb:
> Sondern so:
> Array_to_choose = Array_1;

Nein, auch nicht.

Arrays können einander nicht zugewiesen werden.

von Markus M. (adrock)


Lesenswert?

Genau,

in Deinem Fall wird wahrscheinlich die Lösung mit den Zeigern am besten 
sein.

Das geht dann so:
1
double Array_1[] = {1,2,3,4,5};
2
double Array_2[] = {6,7,8};
3
double *Array_to_choose;
4
5
...
6
7
unsigned char menucounter;
8
Switch(menucounter)
9
{
10
case 0:
11
Array_to_choose = Array_1;
12
break;
13
case 1:
14
Array_to_choose = Array_2;
15
break;
16
}

Array_to_choose wird als Zeiger auf double definiert (so wie Du es 
hattest ist es auch richtig, also als leeres Array). In dem case wird 
dann der Zeiger auf die Startadresse entweder von Array_1 oder Array_2 
gesetzt.

Die Alternative mit einem KOPIEREN der Elemente sähe so aus:
1
double Array_1[] = {1,2,3,4,5};
2
double Array_2[] = {6,7,8};
3
double Array_to_choose[10]; /* muss genug Platz haben! */
4
5
...
6
7
unsigned char menucounter;
8
Switch(menucounter)
9
{
10
case 0:
11
memcpy(Array_to_choose, Array_1, sizeof(Array_1));
12
break;
13
case 1:
14
memcpy(Array_to_choose, Array_2, sizeof(Array_2));
15
break;
16
}

Allerdings weist Du in beiden Fällen garnicht, wieviele gültige Werte Du 
in Array_to_choose hast, kann ja je nach Auswahl unterschiedlich sein. 
Entweder müsstest Du noch eine Variable für die Anzahl der Werte 
einführem oder das Array mit z.B. einer "0" als Endkennung abschließen.

EDIT: Ich schließe mich meinen Vorschreibern an, ein C-Buch/Kurs ist 
angeraten.

von Karl H. (kbuchegg)


Lesenswert?

> Jetzt möchte ich einen Menucounter abfragen und diesen auswerten und
> je nach dem das Array_to_choose mit einem der beiden Arrays gleichsetzen.

Du musst hier deine Gedanken anders ordnen.

Du willst nicht ein Array mit einem anderen Array gleich setzen, sondern 
du willst dir einen Verweis bauen, der je nachdem entweder auf das eine 
Array zeigt, oder auf das andere.
1
double Array_1[] = {1,2,3,4,5};
2
double Array_2[] = {6,7,8};
3
double* Array_to_choose;
4
5
unsigned char menucounter;
6
switch(menucounter)
7
{
8
  case 0:
9
    Array_to_choose = Array_1;
10
    break;
11
  case 1:
12
    Array_to_choose = Array_2;
13
    break;
14
}


und ja. Es hilft nichts. Du wirst dich auch mit Pointer beschäftigen 
müssen.
Genau deswegen ist es auch so wichtig, seine Programmiersprache zu 
kennen. Von der Pieke auf zu kennen. Für ein reales Programm benötigt 
man eben eine Menge Konzepte in der einen oder anderen Form. Kennst du 
nur 5% der Möglichkeiten deiner Programmiersprache, stehst du bei realen 
Programmen sofort im Regen. Ganz im Gegenteil ist es sogar ausgesprochen 
schwierig, Übungsbeispiele für Anfänger zu erfinden, die nur minimales 
Wissen erfordern, so wie es sich bei einem Lerndenden eben nach und nach 
ansammelt.

von Karl H. (kbuchegg)


Lesenswert?

Markus M. schrieb:

> so wie Du es
> hattest ist es auch richtig, also als leeres Array

Nope. Nicht an dieser Stelle.

von DirkB (Gast)


Lesenswert?

Bei Arrays in C sind nach der Definition weder die Größe noch die 
Speicheradresse änderbar.

Leeren Klammern bei der Definition funktionieren nur, wenn du das Array 
auch gleichzeitig initialisierst. Sonst weiß der Compiler nicht wie groß 
das Array werden soll.

Du musst stattdessen Zeiger benutzen.

von Udo S. (urschmitt)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Udo Schmitt schrieb:
>> Sondern so:
>> Array_to_choose = Array_1;
>
> Nein, auch nicht.
>
> Arrays können einander nicht zugewiesen werden.

Mist, man merkt dass ich langsam in C einroste.
Ich muss mich entschuldigen, da ich Funktionsparameter im Kopf hatte.

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.