Forum: Mikrocontroller und Digitale Elektronik funktion_1( &variable++); Wie geht das?


von Frank (Gast)


Lesenswert?

Hallo!

Ich habe eine Funktion, an die ich die Adresse einer Variablen übergebe 
um sie in dieser zu bearbeiten.

Kann ich in einem Schritt irgendwie den Wert der Variablen beim 
Übergeben verändern?
1
void funktion_1( *variable )
2
{
3
  *variable -= 1;
4
}
5
6
7
// Aufruf:
8
9
funktion_1( &variable++ );

Auch mit Klammern geht es nicht. Geht es überhaupt, wenn ja, wie?

von Frank (Gast)


Lesenswert?

Also es heisst natürlich:
1
void funktion_1( uint8_t *variable )

von AVerr (Gast)


Lesenswert?

Wie soll es denn funktionieren ?

Soll variable erst erhöht werden und dann der funktion übergeben werden 
?
Oder soll nach der Abarbeitung von der Funktion die Variable erhöht 
werden ?

Ich glaube im Moment, dass dieses Konstrukt der falsche Ansatz sein 
könnte ...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

x++ ist der post-increment-Operator.

Wenn Du die Variable verändern möchtest, und das Resultat der Änderung 
dem Funktionsaufruf übergeben willst, musst Du den 
pre-increment-Operator ++x verwenden.

Bedenke obendrein, daß &variable++ nicht unbedingt das tut, was Du 
erwartest, hier solltest Du mit Klammern sicherstellen, daß das 
geschieht, was Du willst.

Konkret: Möchtest Du die Adresse von variable übergeben und variable 
inkrementieren, oder möchtest Du die Adresse inkrementieren?

In ersterem Falle:

funktion_1(&(++variable));

in letzterem Falle:

funktion_1(++(&variable));

von Frank (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> In ersterem Falle:
>
> funktion_1(&(++variable));

Sorry, natürlich ++ vorher. Aber so wie du es geschrieben hast, geht es 
auch nicht.
1
buttons_change_repeat( &(++repeat_counter) );
Error[Pe158]: expression must be an lvalue or a function designator

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Frank schrieb:
> Sorry, natürlich ++ vorher. Aber so wie du es geschrieben hast, geht es
> auch nicht.
> buttons_change_repeat( &(++repeat_counter) );
> Error[Pe158]: expression must be an lvalue or a function designator

Dann zeige exakt, wie "repeat_counter" deklariert ist.

von Frank (Gast)


Lesenswert?

1
static uint8_t repeat_counter;

von Frank (Gast)


Lesenswert?

Ich kann die Variable ja auch ohne Probleme übergeben, nur nicht mit 
gleichzeitigem Inkrement.

von AVerr (Gast)


Lesenswert?

Wie wäre es mit einer Hilfsfunktion:
1
uint8_t *increment(uint8_t *var)
2
{
3
  *var++;
4
  return var;
5
}
6
7
...
8
9
buttons_change_repeat( increment(repeat_counter) );

?

von AVerr (Gast)


Lesenswert?

Aufruf natürlich mit:

buttons_change_repeat( increment(&repeat_counter) );

(oben fehlte das &)

von Klaus W. (mfgkw)


Lesenswert?

1
   funktion_1( (++variable, &variable) );

von Klaus W. (mfgkw)


Lesenswert?

AVerr schrieb:
> *var++;

das erhöht den Zeiger; der dann anschließend zurückgegeben wird :-)
*++var sollte besser gehen, oder *(++var)

von AVerr (Gast)


Lesenswert?

Dann halt (*zahl)++
:P

Hatte auch direkt nach dem posten noch gedacht ... "erhöht das nun den 
Zeiger oder die Zahl ?", danke für die Aufklärung

von Klaus W. (mfgkw)


Lesenswert?

Klaus Wachtler schrieb:
> oder *(++var)

ist natürlich auch Quark, sorry

von AVerr (Gast)


Lesenswert?

Hier nochmal eine funktionierende Version. ( mit increment_by kannst du 
sogar um einen bestimmten Wert erhöhen ).
1
uint8_t *increment(uint8_t *var)
2
{
3
    (*var)++;
4
    return var;
5
}
6
7
uint8_t *increment_by(uint8_t *var, uint8_t by)
8
{
9
    (*var) += by;
10
    return var;
11
}

Aufruf über
1
buttons_change_repeat( increment(&repeat_counter) );

von Frank (Gast)


Lesenswert?

OK, besten Dank euch!

von Frank (Gast)


Lesenswert?

Hat denn trotzdem einer eine Erklärung, warum das nicht geht mit
1
funktion( &(++variable) );

von Bitte füllen sie dieses Feld aus. (Gast)


Lesenswert?

Frank schrieb:
> Hat denn trotzdem einer eine Erklärung, warum das nicht geht mit
>
1
> funktion( &(++variable) );
2
>

Welcher Compiler/... ?

von Frank (Gast)


Lesenswert?

IAR Embedded Workbench

von Klaus W. (mfgkw)


Lesenswert?

Frank schrieb:
> Hat denn trotzdem einer eine Erklärung, warum das nicht geht mit
>
1
> funktion( &(++variable) );
2
>

Mit & kannst du nur die Adresse eines Objekts im Speicher (Variable) 
beglücken.

++variable ist aber nicht die Variable, sondern ein Ausdruck. Der 
liefert zwar einen Wert als Ergebnis, ist aber selbst keine Variable.

Ebensowenig könnte man von (i+j) die Adresse bilden.

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.