Forum: Mikrocontroller und Digitale Elektronik Variablenname "hochzählen"


von PIC-Neuling85 (Gast)


Lesenswert?

Hallo Zusammen,

irgendwie stehe ich gerade aufm Schlauch bzw. komme nicht weiter.
Und zwar würde ich gerne einen Variablennamen hochzählen.

Hier mal zu Verdeutlichung der Code
1
 for(i=0; i<20; i++) 
2
        {
3
            Sensor_VALUE[i] = get_sensor_value(Sensor_X)
4
        }

Jetzt ist es so das Sensor_X eigentlich Sensor_0 .... Sensor_19 ist, und 
diesen namen würde ich gerne parallel zum Array Sensor_VALUE[] 
hochzählen.

Schon mal vielen Dank für eure Tips.......

von Adam P. (adamap)


Lesenswert?

Und warum schreibst du dann nicht einfach:
1
Sensor_VALUE[i] = get_sensor_value(i);

von Wolfgang R. (Firma: www.wolfgangrobel.de) (mikemcbike)


Lesenswert?

1
for(i=0; i<20; i++) 
2
        {
3
            Sensor_VALUE[i] = get_sensor_value(i)
4
        }

Die Funktion get_sensor_value() erwartet doch eh einen Parameter, das 
muss die Funktion selber halt richtig hinbiegen, auf welchen Sensorwert 
sie dann zugreift...

von Maxi (Gast)


Lesenswert?

Wenn du die get_sensor_value modifizieren kannst (oder eine neue 
Funktion schreiben kannst), dann ist es vermutlich am saubersten einfach 
die Laufvariable als Funktionsparameter zu übergeben, und die Sensoren 
so zu adressieren. Vorteil du kannst auch auf evtl. fehlerhafte Werte 
reagieren.

Ansonsten ein Array in dem die Werte von Sensor_1 bis Sensor_19 drin 
stehen, bzw. die Pointer auf diese Werte (je nachdem wie komplex die 
entsprechenden Datentypen sind, und ob sie an mehreren Stellen benutzt 
werden.

von Sebastian R. (lange_leitung)


Lesenswert?

Da würde ich mir für den Übergabewert Sensor_X einen String 
zusammensetzen:
Sensor_ & i
Und dann diesen String als Übergabeparameter verwenden.
Evtl. kannst Du das Zusammensetzen auch direkt im Funktionsaufruf 
machen.

Gruß
Sebastian

von Thomas M. (langhaarrocker)


Lesenswert?

Pack Deine Sensor_X Dinger in ein Array. Dann kannst Du auch indiziert 
auf die zugreifen.

von PIC-Neuling85 (Gast)


Lesenswert?

Danke, genau das war der benötigte Denkanstoß.........

Hier nur nochmal zur info die Definitionen aus der Sensor.h
1
enum sensor_names
2
    {
3
        Sensor_0 = 0,
4
        Sensor_1 = 1,
5
        Sensor_2 = 2,
6
        Sensor_3 = 3,
7
        Sensor_4 = 4,
8
        Sensor_5 = 5,
9
        Sensor_6 = 6,
10
        Sensor_7 = 7,
11
        Sensor_8 = 8,
12
        Sensor_9 = 9,
13
        Sensor_10 = 10,
14
        Sensor_11 = 11,
15
        Sensor_12 = 12,
16
        Sensor_13 = 13,
17
        Sensor_14 = 14,
18
        Sensor_15 = 15,
19
        Sensor_16 = 16,
20
        Sensor_17 = 17,
21
        Sensor_18 = 18,
22
        Sensor_19 = 19
23
    };

von Wolfgang R. (Firma: www.wolfgangrobel.de) (mikemcbike)


Lesenswert?

Sebastian R. schrieb:
> Da würde ich mir für den Übergabewert Sensor_X einen String
> zusammensetzen:

Der Funktion wird doch kein String übergeben, sondern eine Zahl... 
irgendwo steht sicher ein equate für "Sensor_X"... Macht es doch nicht 
komplizierter als unbedingt nötig...

Edit: wieder zu langsam... ;-)

von MaWin (Gast)


Lesenswert?

PIC-Neuling85 schrieb im Beitrag #5698211:
> Schon mal vielen Dank für eure Tips..

Grundlagen im Programmieren lernen.

Nan kann Variablennamen nicht hochzählen, dafür gibt es Arrays
die du ja auch auf der linken Seite verwendet hast.

Du musst dir also eine andere Art der Zuordnung der Sensorwerte auf die 
Arrayzellen ausdenken.

Entweder einen nach dem anderen, ohne Schleife
1
Sensor_VALUE[0] = get_sensor_value(Sensor_0);
2
Sensor_VALUE[1] = get_sensor_value(Sensor_1);
3
Sensor_VALUE[2] = get_sensor_value(Sensor_2);
4
Sensor_VALUE[3] = get_sensor_value(Sensor_3);
5
:
oder mal hinterfragen was get_sensor_value überhaupt tut, den Sensorwert 
wie im Namen behauptet holt es jedenfalls nicht, denn der wird als 
Parameter schon reingesteckt, und hinterfragen, was Sensor_X überhaupt 
ist, vielleicht wäre dort ein Array auch möglich/passender.

Jedenfalls fehlt dir einiges am Grundverständnis übers Programmieren, 
der Unterschied compile-time zu Laufzeit.

von Markus F. (mfro)


Lesenswert?

PIC-Neuling85 schrieb im Beitrag #5698211:
> Jetzt ist es so das Sensor_X eigentlich Sensor_0 .... Sensor_19 ist, und
> diesen namen würde ich gerne parallel zum Array Sensor_VALUE[]
> hochzählen.

Keine Ahnung, ob ich verstehe, was Du brauchst, aber wenn Du Variablen 
namens
Sensor_0 bis Sensor_19 hast (und die - aus welchen Gründen auch immer - 
nicht in ein Array "Sensor[20]" umbauen kannst), bau' dir eine 
Lookup-Tabelle (vielleicht sogar mit einer Lookup-Funktion):
1
sensor_t Sensor_0, Sensor_1, Sensor_...
2
3
sensor_t *sensor_lookup_table[] =
4
{ &Sensor_0, &Sensor_1, ... };
5
6
sensor_t *sensor_lookup(int index)
7
{
8
    // TODO: Prüfung auf validen index
9
    return sensor_lookup_table[index];
10
}

dein Code würde dann so aussehen:
1
for(i=0; i<20; i++) 
2
        {
3
            Sensor_VALUE[i] = get_sensor_value(*sensor_lookup(i));
4
        }

Ob das jetzt "von hinten durch die Brust ins Auge" oder irgendwie 
sinnvoll ist, mußt Du selber rausfinden (es wird ja wohl hoffentlich 
einen Grund geben, warum Du das so gemacht hast, wie Du's gemacht 
hast..)

von MaWin (Gast)


Lesenswert?

PIC-Neuling85 schrieb im Beitrag #5698239:
> Hier nur nochmal zur info die Definitionen aus der Sensor.h

Es sind also gar keine Variablennamen.
Sondern enum-Bezeichner.

Soviel zu Grundkenntnissen im Programmieren.

adamap lag also richtig.

von Adam P. (adamap)


Lesenswert?

MaWin schrieb:
> Es sind also gar keine Variablennamen.
> Sondern enum-Bezeichner.
>
> Soviel zu Grundkenntnissen im Programmieren.
>
> adamap lag also richtig.

Na an der Stelle macht ein enum eher wenig Sinn - wenn er sie trotzdem 
nutzen will, wird er um eine LookUp nicht herum kommen...

Aber ich würde hier eher KISS bevorzugen.

von Markus F. (mfro)


Lesenswert?

MaWin schrieb:
> Soviel zu Grundkenntnissen im Programmieren.

Ein Auffrischen der Grundkenntnisse im Fragen stellen wär' wohl zuerst 
angesagt ;)

von HyperMario (Gast)


Lesenswert?

MaWin schrieb:
> Es sind also gar keine Variablennamen.
> Sondern enum-Bezeichner.

Dann Wert bekommt man über einen pointer. Als Neuling würde ich das 
weglassen.

PIC-Neuling85 schrieb im Beitrag #5698239:
> Hier nur nochmal zur info die Definitionen aus der Sensor.h
Ein wenig sinnlos wenn da dann doch wieder die gleichen Zahlen stehen.

Würde ich drauf verzichten und den Sensor "abstrahieren" und die 
SensorNr nennen.

von Axel S. (a-za-z0-9)


Lesenswert?

PIC-Neuling85 schrieb im Beitrag #5698239:
> Hier nur nochmal zur info die Definitionen aus der Sensor.h
>
>
1
> enum sensor_names
2
>     {
3
>         Sensor_0 = 0,
4
>         Sensor_1 = 1,
5
...
6
>         Sensor_19 = 19
7
>     };
8
>

Aha. Also eine komplett nutzlose enum Deklaration. Wenn es um 
Lesbarkeit gehen sollte (kann ich ehrlich gesagt nicht erkennen, aber 
sei es drum) dann wäre das hier besser:
1
#define Sensor(x) (x)
2
3
//und dann statt
4
get_sensor_value(i);
5
6
// das besser(?) lesbare
7
get_sensor_value(Sensor(i));


Außerdem: du schreibst davon, daß du einen Variablennamen hochzählen 
willst. Das ist Unsinn. Die benamten Konstanten in einer enum 
Deklaration sind keine Variablen sondern heißen Enumerator(en).

von Adam P. (adamap)


Lesenswert?

Axel S. schrieb:
> get_sensor_value(Sensor(i));

Na das ist aber irgendwie auch doppelt gemoppelt,
der Funktionsname sagt ja schon das man einen Wert von einem Sensor 
abrufen möchte.

Ich glaub man sollte sich da nicht zu sehr verbiegen um was zu erzwingen 
was nicht sein müsste.

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.