Forum: Mikrocontroller und Digitale Elektronik Grundlagen Frage


von Mark S. (mark522)


Lesenswert?

Hallo zusammen,

ich habe eine Frage und zwar was der Unterschied wenn ich in C #define 
Valiable  5 und int variable =5; schriebe ?

danke

von ich (Gast)


Lesenswert?

Mit #define ersetzt der Compiler den Wert den du definiert hast. z.B.:
[c]
#define x 42
printf(x);
[c]

Mit einer Variable bleibt der Wert in der Variable stehen und diese wird 
ausgeben.
[c]
int x = 42;
printf(x);
[c]

Eine Variable kannst du verändern eine Definition (#define) kann man 
nicht verändern.

von Stefan F. (Gast)


Lesenswert?

#define definiert Textersetzungen.

Eine int Variable belegt hingegen irgendwo zwei oder vier Bytes Speicher 
- je nach CPU.
1
#define pi 3.14159
2
3
float umfang=durchmesser*pi;
4
5
#define forever while(1)
6
7
forever
8
{
9
  dosomething();
10
}
11
12
#define LED_AN PORTB |= (1<<PD3)
13
14
void loop()
15
{
16
    LED_AN;
17
}

von A. S. (Gast)


Lesenswert?

Genau genommen kennt der Compiler keine defines. Er kennt nur int var=5 
und legt eine Variable var an.

Das define macht der präprozessor vorher eigenständig.

von Stefan F. (Gast)


Lesenswert?

Mit defines kann man total bescheuerte Sachen machen:
1
#include <stdio.h>
2
#define hauptprogramm int main()
3
#define anfang {
4
#define ende }
5
#define von for (int a=
6
#define bis ; a<
7
#define tue ; a++)
8
#define zeige(was) printf("%i\n",was);
9
10
hauptprogramm
11
anfang
12
von 1 bis 100 tue
13
    zeige(a)
14
ende

von Matthias L. (Gast)


Lesenswert?

Stefan F. schrieb:
> Mit defines kann man total bescheuerte Sachen machen:

Ja. oder sowas:
1
#define  1  0
2
#define  0  1
3
4
#define  TRUE  0
5
#define  FALSE 1

von Stefan F. (Gast)


Lesenswert?

Matthias L. schrieb:
> Ja. oder sowas

Oha, bloß nicht nachmachen!

von Rolf M. (rmagnus)


Lesenswert?

Matthias L. schrieb:
> Stefan F. schrieb:
>> Mit defines kann man total bescheuerte Sachen machen:
>
> Ja. oder sowas:
> #define  1  0
> #define  0  1

Na das nicht ganz. Es muss schon ein Identifier sein, den man definiert. 
Also
1
#define eins 0
2
#define null 1

Aber das ginge auch mit einer Variablen.

> #define  TRUE  0
> #define  FALSE 1

Das würde gehen, wäre aber ebenfalls mit einer Variablen genauso 
möglich.

von Einer K. (Gast)


Lesenswert?

#define  Stromausfall false


while(not Stromausfall)
{
  // tuwas();
}

von Rolf M. (rmagnus)


Lesenswert?

Arduino Fanboy D. schrieb:
> #define  Stromausfall false
>
> while(not Stromausfall)
> {
>   // tuwas();
> }

Da fehlt:
1
#include <iso646.h>
2
#include <stdbool.h>

von Mark S. (mark522)


Lesenswert?

Danke euch.

noch eine weiter Frage, gibt es einen Unterschied zwischen

void xx(void){

}

und void xx (){

}

von Karl M. (Gast)


Lesenswert?

Mark S. schrieb:
> Danke euch.
>
> noch eine weiter Frage, gibt es einen Unterschied zwischen
>
> void xx(void){
>
> }
>
> und void xx (){
>
> }

Ja, das steht in deinem C oder C++ Buch.

von Karl M. (Gast)


Lesenswert?

"und" ist ordinär kein Schlüsselwort und ich hoffe WS zählst Du nicht 
mit.

von Mark S. (mark522)


Lesenswert?

danke nochmal. Ich habe das gefunden

von Hugo H. (hugohurtig1)


Lesenswert?

Stefan F. schrieb:
> was

Wo ist das "was" definiert?

von Karl M. (Gast)


Lesenswert?

Hugo H. schrieb:
> Stefan F. schrieb:
>> was
>
> Wo ist das "was" definiert?

"was" ist hier nur ein Platzhalter für die Variable |a|, diese wird 
innerhalb der FOR-Schleife deklariert und hat auch nur dort seine 
Sichtbarkeit.

von Karl M. (Gast)


Lesenswert?

Die Frage bezog sich auf die Zeile 8 und die Variable |a| steht in Zeile 
5.
1
#include <stdio.h>
2
#define hauptprogramm int main()
3
#define anfang {
4
#define ende }
5
#define von for (int a=
6
#define bis ; a<
7
#define tue ; a++)
8
#define zeige(was) printf("%i\n",was);
9
10
hauptprogramm
11
anfang
12
von 1 bis 100 tue
13
    zeige(a)
14
ende

von Hugo H. (hugohurtig1)


Lesenswert?

Karl M. schrieb:
> "was" ist hier nur ein Platzhalter für die Variable |a|, diese wird
> innerhalb der FOR-Schleife deklariert und hat auch nur dort seine
> Sichtbarkeit.

Das ist mir klar - nur wo steht, das was = a sein soll?

Also
1
#define was a
vermisse ich.

von Stefan F. (Gast)


Lesenswert?

Hugo H. schrieb:
> wo steht, das was = a sein soll?
1
#define zeige(was) printf("%i\n",was);
2
zeige(a)

In diesem Fall passiert etwas mehr, als nur dumme Textersetzung. "was" 
ist Platzhalter für ein Argument.

https://gcc.gnu.org/onlinedocs/cpp/Macro-Arguments.html

von Rolf M. (rmagnus)


Lesenswert?

Hugo H. schrieb:
> Das ist mir klar - nur wo steht, das was = a sein soll?

Hier:

Karl M. schrieb:
> zeige(a)

von Hugo H. (hugohurtig1)


Lesenswert?

Na, dann wäre
1
#include <stdio.h>
2
#define hauptprogramm int main()
3
#define anfang {
4
#define ende }
5
#define von for (int a=
6
#define bis ; a<
7
#define tue ; a++)
8
#define zeige_zahl printf("%i\n",a);
9
10
hauptprogramm
11
anfang
12
von 1 bis 100 tue
13
    zeige_zahl
14
ende
für mich aber sinnvoller gewesen %-|

von Karl M. (Gast)


Lesenswert?

Hugo H. schrieb:
> hauptprogramm
> anfang
> von 1 bis 100 tue
>     zeige_zahl
> ende
> für mich aber sinnvoller gewesen %-|

Mag ja sein, und das wäre für sich alleine auch ok.

Nur hier ist der gesamte Code als Beispiel für Defines mit 
Makrofunktionalität zu sehen und somit abgeschlossen.

von Hugo H. (hugohurtig1)


Lesenswert?

Karl M. schrieb:
> Nur hier ist der gesamte Code als Beispiel für Defines mit
> Makrofunktionalität zu sehen und somit abgeschlossen.

Und aus meiner Sicht unlogisch - ich verstecke eine Variable doch nicht 
in 3 Defines und gebe sie dann als Argument völlig zusammenhanglos aus.

von Stefan F. (Gast)


Lesenswert?

Hugo H. schrieb:
> Na, dann wäre...für mich aber sinnvoller gewesen

Hugo H. schrieb:
> Und aus meiner Sicht unlogisch - ich verstecke eine Variable doch nicht
> in 3 Defines und gebe sie dann als Argument völlig zusammenhanglos aus.

Ja. Aber genau das habe ich irgendwo im Arduino Umfeld schon einmal 
gesehen.

Ich habe das Beispiel mit Absicht so geschrieben, weil es unter anderem 
diesen Sch**** offenbaren sollte.

von Einer K. (Gast)


Lesenswert?

Stefan F. schrieb:
> Aber genau das habe ich irgendwo im Arduino Umfeld schon einmal
> gesehen.

Da isser wieder...
Der Heckenschütze...

von Stefan F. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Da isser wieder...
> Der Heckenschütze...

Mein Fanboy, was würde ich bloß ohne dich machen?

(Meine Schwester ärgern wäre eine Option)

von Einer K. (Gast)


Lesenswert?

Stefan F. schrieb:
> was würde ich bloß ohne dich machen?

Weiter, völlig unreflektiert, mit Schaiße werfen.

Jetzt hast du die Gelegenheit dein Verhalten zu analysieren und danach 
absichtlich weiter mit Schaiße zu werfen.

von Stefan F. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> mit Schaiße zu werfen

Ja gib's mir. ooooh ich will mehr davon. Bitte auch Natursekt. Nach 
einer anstrengenden Woche braucht man das.

von Einer K. (Gast)


Lesenswert?

Auch wenn dir das etwas seltsam erscheint,...
Ich bin nicht für deine Woche verantwortlich, aber du für dein 
Verhalten.

Und gerne, wenn deine Selbstkontrolle wieder versagt, dann gibts von mir 
auch ein Sprüchlein dazu.

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.