Variable begrenzen in C

Gast #1979041
Lesenswert?

Jürgen schrieb:
> Schreib einfach:
>
1
>    ink(a);  // Anstelle von a++;
2
> [c]
3
> 
4
> und verwende folgende Funktion:
5
> 
6
> [c]
7
> int ink(int a)
8
> {
9
>   return (++a > 10000) ? 10000 : a;
10
> }
11
>

Was wohl passiert wenn a = 2^31-1 ist?! ;) Ich denke man sollte a nicht 
verändern wenn 10000 ereicht wurde.
Gast #1979206
Lesenswert?

>> Kann man das irgendwie am Anfang deklarieren?
>nein.

>> die if anweisung ist perfekt für mich!
>Da ist aber nichts am Anfang deklariert.


Ja gerade, weil es nicht geht, muss ich wohl mit der if anweisung 
leben...
#1980313
Lesenswert?

Naja, vielleicht doch noch eine Variante (angelehnt an die
häufige Implementation von errno über ein Makro und eine Funktion,
die einen Zeiger auf die Variable liefert):
1
#include <stdio.h>
2

3
#define meineVariableA  (*aGetAddress())
4
int *aGetAddress()
5
{
6
  static int a = 0;
7
  if( a>10000 )
8
  {
9
    a = 10000;
10
  }
11
  return &a;
12
}
13

14

15
int main( int nargs, char **args )
16
{
17
  meineVariableA = 5;
18
  printf( "meineVariableA = %d\n", meineVariableA );
19

20
  meineVariableA = 9999;
21
  printf( "meineVariableA = %d\n", meineVariableA );
22

23
  meineVariableA++;
24
  printf( "meineVariableA = %d\n", meineVariableA );
25

26
  meineVariableA++;
27
  printf( "meineVariableA = %d\n", meineVariableA );
28

29
  meineVariableA++;
30
  printf( "meineVariableA = %d\n", meineVariableA );
31

32
  meineVariableA++;
33
  printf( "meineVariableA = %d\n", meineVariableA );
34

35
  printf( "meineVariableA = %d\n", meineVariableA++ );
36
  printf( "meineVariableA = %d\n", meineVariableA++ );
37
  printf( "meineVariableA = %d\n", meineVariableA++ );
38

39
  printf( "meineVariableA = %d\n", ++meineVariableA );
40
  printf( "meineVariableA = %d\n", ++meineVariableA );
41
  printf( "meineVariableA = %d\n", ++meineVariableA );
42

43
  return 0;
44
}

Das funktioniert weitgehend.
Zu beachten ist nur, daß ++meineVariableA einen Wert liefert,
der ggf. 1 über dem Maximum liegt:
1
meineVariableA = 5
2
meineVariableA = 9999
3
meineVariableA = 10000
4
meineVariableA = 10000
5
meineVariableA = 10000
6
meineVariableA = 10000
7
meineVariableA = 10000
8
meineVariableA = 10000
9
meineVariableA = 10000
10
meineVariableA = 10001
11
meineVariableA = 10001
12
meineVariableA = 10001
Gast #1980617
Lesenswert?

>nö, wenn schon dann
> a = (a<maximum ? ++a : maximum );

Irgendwie bin ich gerade blind. Was stoert Dich an meiner Version mit 
dem Postincrement?

a = (a<maximum ? a++ : maximum );

oder dann

if (a<maximum) a++;
#1980636
Lesenswert?

chris schrieb:
> Was stoert Dich an meiner Version mit
> dem Postincrement?
>
> a = (a<maximum ? a++ : maximum );

Daß es nicht funktionieren wird (bzw. nicht definiert ist), sonst
ist sie schön.

Das Problem ist die Reihenfolge der Auswertung:
Wenn a noch nicht maximum erreicht hat, geht es in das a++.
Das liefert den alten Wert von a und erhöht anschließend a.
I.d.R. wird dann der alte Wert zugewiesen, damit ist die
Erhöhung für die Katz.
M.W. ist diese Reihenfolge aber nicht sicher, es kann erst
der alte Wert zugewiesen werden und dann die Erhöhung
stattfinden.

chris schrieb:
> oder dann
>
> if (a<maximum) a++;

Das dagegen ist in Ordnung, wenn auch viel zu einfach :-)

Noch eine Variante, die wir noch nicht hatten:
  (a<maximum) ? a++ : (a=maximum);
#1980720
Lesenswert?

> Da hätte ich auch noch mal was ganz anderes:
> a<maximum && ++a;
Auch nett!

Wobei die beiden Fälle dann merkwürdigerweise etwas ganz
unterschiedliches liefern: entweder die 0 vom Vergleich oder
den neuen Wert von a.

Deshalb würde ich den Rückgabewert sicherheitshalber wegwerfen,
auch wenn es vielen dann vielleicht noch merkwürdiger erscheint:
(void)(a<maximum && ++a);

Der zweite ist ja noch besser :-)
Gast #1981007
Lesenswert?

>a<maximum && ++a;
Oh, das ist aber haarig, wenn auch ziemlich trickreich. Man verlässt 
sich ja voll auf die Reihenfolge der Ausführung. Ich frage mich, ob da 
nicht ein Optimierer im Compiler was verdrehen könnte.
#1981023
Lesenswert?

chris schrieb:
>>a<maximum && ++a;
> Oh, das ist aber haarig, wenn auch ziemlich trickreich. Man verlässt
> sich ja voll auf die Reihenfolge der Ausführung. Ich frage mich, ob da
> nicht ein Optimierer im Compiler was verdrehen könnte.

na und? Das ist vollkommen legal, weil die Reihenfolge beim && und
die short circuit evaluation in C verbindlich sind.
Der Optimierer wird das auch wissen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren