Forum: Mikrocontroller und Digitale Elektronik Einfache Frage zu C: Zweimal gleiche Variable bei Funktionsuafruf


von Gero (Gast)


Lesenswert?

Hallo!

Das kann mir bestimmt jemand direkt beantworten:

Kann ich schreiben
1
uint8_t i;
2
3
for (i=0; i<10; i++)
4
{
5
  uint8_t i;
6
7
  for (i=0; i<10; i++)
8
  {
9
    ...
10
  }
11
}
ohne dass die "i"s sich beeinflussen?

von Achim M. (minifloat)


Lesenswert?

nenn das innere i halt j?
mfg mf

von Gero (Gast)


Lesenswert?

Ist ja nur ne Frage zum Verständnis...dass ich die anders benennen kann 
ist klar!

von flof (Gast)


Lesenswert?

nein, das haut dir dein compiler schon wegen der
Redefinition von i um die Ohren - und wenn Du diese weglaesst,
laeuft deine innere schleife genau einmal. Danach ist i naemlich = 10,
und die aeussere Schleife wird verlassen.


Warum nimmst Du nicht einfach eine zweite Variable?

von Gero (Gast)


Lesenswert?

OK, danke! Wie gesagt, war nur ne generelle Frage.

von Achim M. (minifloat)


Lesenswert?

Einen Block bilden oder die innere Zählung in einer anderen Funktion 
auslagern?
mfg mf

von Tom M. (tomm) Benutzerseite


Lesenswert?

Funktionsaufruf, wo?

C99: ja, das müsste gehen, ev. sogar in K&R C. Variablen sind lokal im 
Block, in dem sie stehen.  Aber: Schlechter Stil.

von Gero (Gast)


Lesenswert?

Wie ist das denn beim Aufruf einer anderen Funktion?
1
uint8_t funktion1 (void)
2
{
3
  uint8_t return_wert;
4
5
  return_wert = funktion2();
6
7
  return return_wert;
8
}
9
10
uint8_t funktion2 (void)
11
{
12
  uint8_t return_wert
13
14
  ...
15
  return return_wert;
16
}

Kriegen die sich da auch in die Wolle?

von Floh (Gast)


Lesenswert?

Also erlaubt ist das schon. Zugriff Erfolg dabei immer zuerst auf die 
lokalere Variable, falls 2 gleichnamige/typige existieren. Allerdings 
ist es extrem mießer Stil. :-)

von Gero (Gast)


Lesenswert?

Tom M. schrieb:
> Funktionsaufruf, wo?

Ja...ist mir auch aufgefallen, daher jetzt nachträglich der Aufruf.

von g457 (Gast)


Lesenswert?

> nein, das haut dir dein compiler schon wegen der
> Redefinition von i um die Ohren -

Das i ist nicht redefiniert, weils in einem anderen scope steht. Ein gcc 
übersetzt das auch vollkommen richtig (s?uint8_t?int?g;):
1
$ cat main.c 
2
#include <stdio.h>
3
4
int main()
5
{
6
        int i;
7
8
        for (i = 0; i < 10; i++)
9
        {
10
                int i;
11
                for (i = 0; i < 10; i++)
12
                {
13
                        printf(".");
14
                }
15
        }
16
17
        printf("\n");
18
        return 0;
19
}
20
$ gcc -Wall -std=c99 -o main main.c
21
$ ./main
22
....................................................................................................

Man nennt das übrigens auch Verschattung. Schön isses trotzdem nicht.

von Tom M. (tomm) Benutzerseite


Lesenswert?

Gero schrieb:
> Kriegen die sich da auch in die Wolle?

Wieso "auch"? Es gibt "auch" hier keinen Konflikt. Jetzt kram endlich 
(d)ein C Lehrbuch raus und lies mal über Variablen und Geltungsbereiche 
(Scope). :)

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.