Forum: Mikrocontroller und Digitale Elektronik #define in main


von sven (Gast)


Lesenswert?

hallo zusammen,

ich hätte mal eine frage zu #define in C!

ist es möglich eine außerhalb von main mit #define definierte variable 
in main mehrfach umzudefinieren über #define??

bsp.

#define DATA abcd


main()
{
while(1)
{
for(i=0,i<5,i++)
    {
    if(i==0) #define DATA bacd
    if(i==1) #define DATA cdab
    if(i==2) #define DATA ...
    if(i==3) #define DATA ...

    diverese Funktionsaufrufe welche DATA verwenden
    }
}
}

das wäre für mich praktisch denn dann müsste ich wenig code verändern

ich hoffe es kann mir jemand damit weiterhelfen und ich hoffe mein 
anliegen wurde klar =)

grüße

von Simon (Gast)


Lesenswert?

Nein, das ist nicht möglich. #defines werden durch den Präprozessor des 
Compilers zur Compile-Time ausgewertet und sind zur Laufzeit des 
Programms nicht mehr existent.

Viele Grüße,
        Simon

von tuppes (Gast)


Lesenswert?

Missverständnis.

Mit #define definiert man keine Variable, sondern ein Symbol. Das wird 
vom Compiler während der Übersetzung durch seinen Text ersetzt, ist also 
zur Laufzeit nicht mehr vorhanden.

Tipp: C-Buch lesen.

Gruß,
tuppes

von SoLaLa (Gast)


Lesenswert?

laß doch das #define ganz weg...
wenn Du DATA als Variable benötigst, dann benutz die doch auch so

von Matthias (Gast)


Lesenswert?

Die C bibel sagt:

"A second #define for the same identifier is erroneous unless the second 
token sequence is identical to the first one."

Sprich, du koenntest sowas hier machen:
1
#define TEST 1
2
#define TEST 1
macht aber keinen Sinn, weil doppelt. Selbst wenn das, was du da 
vorhast, moeglich waere, wuerde es jeglichem Sinn des #defines 
zuwiderlaufen, weil hinterher ja doch wieder keiner mehr wuesste, 
welcher Wert da nun steht. Es heisst eben nicht umsonst PREprozessor 
Anweisung.

Was du da vorhast solltest du mit einer globalen Variable machen.

von sven (Gast)


Lesenswert?

ja sorry DATA ist keine variable sondern ein symbol/platzhalter =)

mit Data greife ich auf das Port-data-reg. eines pins zu und da ich mein 
programm erweitern wollte von einem gerät auf 4-5 wäre es schön gewesen 
wenn man dieses DATA eben "umdefinieren" könnte um so zwischen den 
geräten zu wechseln...

von peter (Gast)


Lesenswert?

Ne, denn defines werden schon vor dem kompilieren vom Präprozessor 
ausgewertet, ich würde folgendes machen.
1
//ausgelagert nach myFickingDefines.h oder so...
2
#define DATA1 abcd
3
#define DATA2 bacd
4
#define DATA3 cdab
5
#define DATA4 ...
6
#define DATA5 ...
1
#include "myFickingDefines.h"
2
3
main()
4
{
5
   while(1)
6
   {
7
   for(i=0,i<5,i++)
8
       {
9
       int tmpVar=0;
10
       if(i==0) 
11
         tmpVar = DATA1;
12
       else if(i==1)  
13
         tmpVar = DATA2;
14
       else if(i==2)  
15
         tmpVar = DATA3;
16
       else if(i==3) 
17
         tmpVar = DATA4;
18
19
       //diverese Funktionsaufrufe welche tmpVar verwenden
20
       }
21
   }
Hängt aber auch davon ab, was du für Werte in den DATA-defines 
reinpackst, wenn es nur eine fortlaufende Zahlenfolge ist, kannst du 
auch die Zählvariable i direkt nutzen...

von sven (Gast)


Lesenswert?

joa das würde gehen.. nur mein problem ist ganz einfach dass ich mit 
DATA die dataleitung "betakte" und die kommunikation besteht aus 
dieversen einzelfunktionen welche ALLE dieses besagte DATA benutzen...

könnte ich nun in main dieses DATA umdefinieren müsste ich nicht die 
ganzen funktionen ändern sondern könnte ohne Probleme durch umdefinieren 
von DATA nach und nach mehrere Geräte mit der gleichen kommunikation 
ansteuern bzw abfragen...

von Adrian M. (thiefmaster)


Lesenswert?

Nimm doch einfach eine globale Variable, die du DATA nennst...

von Matthias (Gast)


Lesenswert?

[ ] Du hast den Sinn einer Preprozessoranweisung verstanden
[X] Du solltest ein C-Buch lesen

Ich kenn den Rest deines Programms ja nicht, aber du wuerdest dich nach 
deiner Idee ja selber immer von jeweils vier der vorhandenen 5 Geraete 
(was meinst du eigentlich mit "Geraete"???) aussperren und muesstest 
immer erst deine angestrebte umdefinierung machen.
Bau doch fuer jedes "Geraet" einen eigenen, modularen Treiber, oder wenn 
es einfacher/schneller geht, setz einfach n Switch davor und uebergib 
beim Zugriff einen Auswahlwert fuer die "Geraete".

Das #define jedenfalls ist fuer sowas nicht gedacht. Es ist zB fuer 
Maskierungen bei Pinsettings gedacht. Wenn sich aufgrund von was auch 
immer eine Pinbelegung in einem Redesign aendert, kann ich einfach die 
Maskierung im #define aendern und muss den Code an sich nicht anruehren.

von Matthias (Gast)


Lesenswert?

Bisschen langsam, Matthias :) Dennoch wahr

von sven (Gast)


Lesenswert?

ja danke ich hab jetzt leider keine zeit extra ein c-buch zu lesen ;)

es sollen an den MC 4 digitale sensoren angeschlossen werden... die 
möchte ich einfach nach und nach abfragen.. alles nicht zeitkritisch

das ganze programm welches für einen sensor erstellt wurde mit allen 
unterfunktionen benutzt zur kommunikation mit dem sensor DATA um auf 
dessen Dataleitung zugreifen zu können.

so jetzt wollte ich eben 4 sensoren anschließen und hatte den einfall 
dass man ja nur dieses DATA umdefinieren müsste und dann jeweiles das 
auswertverfahren aufrufen müsste so könnte man nach und nach 
verschiedene sensoren auswerten

von Matthias (Gast)


Lesenswert?

Und wo ist jetzt das Problem mit der globalen Variable? Macht doch genau 
das, was du willst:

Generell musst du doch nur den Zugriff auf den Pin Sensorabhaengig 
umleiten. peter (Gast) schrieb doch schon, wie es geht. Der Rest der 
Software bleibt davon doch voellig unberuehrt (wie du schon richtig 
festgestellt hast).

von sven (Gast)


Lesenswert?

bei peters Ansatz wird aber doch nur tmpVar mit dem jeweiligen Wert von 
DATA1 bis DATAn befüllt.

oder versteh ich das falsch... ich kann ja dann nicht mit tmpVar auf den 
Pin zugreifen...

bitte um aufklärung

von Karl H. (kbuchegg)


Lesenswert?

sven wrote:
> bei peters Ansatz wird aber doch nur tmpVar mit dem jeweiligen Wert von
> DATA1 bis DATAn befüllt.
>
> oder versteh ich das falsch... ich kann ja dann nicht mit tmpVar auf den
> Pin zugreifen...

Warum nicht?

Sicher kannst du (wenn du die richtige Syntax benutzt und alles richtig 
umgeformt hast)

Du musst jetzt erst mal anfangen deine Funktion unabhängig von 
irgendwelchen äußeren #define oder globalen Variablen zu bekommen. Alles 
was deine Funktionen benutzen, muss als Argument an die Funktionen 
übergeben werden.

Designfehler oder Abkürzungen im Designprozess werden nun mal mit 
Mehrarbeit bestraft. Ganz besonders gilt das dann, wenn ursprünglichge 
Annahmen ("es wird immer nur 1 Sensor geben, daher kann ich das alles 
auf die billige Tour machen") in späterer Folge über den Haufen geworfen 
werden.

von peter (Gast)


Lesenswert?

Du hast kein klares Bild von dem gezeigt, was du vorhast, sondern nur 
Pseudo-Code. Somit ist nur ein Ansatz, tmpVar muss ja auch nicht 
zwingend ein Intger (int) sein.
Ich weiß ja auch gar nicht, was die diversen Funktionsaufrufe für 
(einen) Parameter erwarten...

von Matthias (Gast)


Lesenswert?

Kann es sein, dass du den Code nur uebernommen hast und eigentlich 
keinen Funken Ahnung hast von dem, was du hier schreibst? Es ist doch 
wahrlich nicht das Problem, statt dem per #define kreierten symobl die 
vorgeschlagene Variable tmpVar zu gebrauchen. Statt
1
irgendEinWert = DATA;

sagst du halt (ich zitiere peter(Gast))
1
if(i==0) 
2
    tmpVar = DATA1;
3
else if(i==1)  
4
    tmpVar = DATA2;
5
else if(i==2)  
6
    tmpVar = DATA3;
7
else if(i==3) 
8
    tmpVar = DATA4;
9
10
irgendEinWert = tmpVar;
So schwer war das jetzt nicht...

von sven (Gast)


Lesenswert?

void s_transstart(void)
//---------------------------------------------------------------------- 
------------
// generates a transmission start
//       ____         _______
// DATA:      |_______|
//           __     __
// SCK : ___|   |___|   |______
{
   direct=1;
   wait(1);
   DATA=1; SCK=0;
   wait(2);
   SCK=1;
   wait(1);
   DATA=0;
   wait(1);
   SCK=0;
   wait(2);
   SCK=1;
   wait(1);
   DATA=1;
   wait(1);
   SCK=0;
   wait(1);
}

//---------------------------------------------------------------------- 
------------
void s_connectionreset(void)
//---------------------------------------------------------------------- 
------------
// communication reset: DATA-line=1 and at least 9 SCK cycles followed 
by transstart
//       ___________________________________________________ 
______
// DATA:                                                      |_______|
//              _    _    _    _    _    _    _    _        ___     __
// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______|   |___| 
|______
{
  unsigned char i;
  direct=1;
  DATA=1; SCK=0;
  for(i=0;i<12;i++)
  {   SCK=1;
      wait(1);
      SCK=0;
       wait(1);
  }
}




so mal einen ausschnitt zum pseudocode

jetzt wird vlt klarer was ich mit dem DATA und CLK anstelle

ich muss einfach nach einer kompletten auswertung mit DATA auf nen 
anderen Pin zugreifen und wieder auswerten.. das ganze permanent im 
wechsel um beliebige anzahl sensoren auszulesen

von Karl H. (kbuchegg)


Lesenswert?

Matthias wrote:

> sagst du halt (ich zitiere peter(Gast))
>
>
1
> if(i==0)
2
>     tmpVar = DATA1;
3
> else if(i==1)
4
>     tmpVar = DATA2;
5
> else if(i==2)
6
>     tmpVar = DATA3;
7
> else if(i==3)
8
>     tmpVar = DATA4;
9
> 
10
> irgendEinWert = tmpVar;
11
>
> So schwer war das jetzt nicht...

Das dürfte ja auch nicht das Problem sein.
Das Problem wird die Verwendung von tmpVar sein :-)

> Kann es sein, dass du den Code nur uebernommen hast und eigentlich
> keinen Funken Ahnung hast von dem, was du hier schreibst?

Ich zitiere:
> ich hab jetzt leider keine zeit extra ein c-buch zu lesen ;)

Hier liegt das eigentliche Problem. Halbwissen.

von sven (Gast)


Lesenswert?

man leute... warum muss man sich in foren immer so nen mist anhören... 
ich bin hauptberuflich personal coach wenn ich mich so bei meinen kunden 
aufführen würde wie so manch einer sich hier im forum aufführt...

mein lieber mann...!!!!!!

unter kompetent versteh ich was anderes...

wenn ich en crack im programmieren wäre würd ich hier nicht schreiben 
oder?

und ich hab eben keine zeit jetzt ein c-buch zu lesen... und wenn für 
mich ein

#define VAR data-Register

was andres ist wie VAR = Dataregister

dann frag ich eben nach und erwarte von den öttergleichen im forum nur 
ne antwort für leute die wie ich keine ahnung haben ;)

von Karl H. (kbuchegg)


Lesenswert?

Ui.

Ich war jetzt schon drauf und dran, mir die Syntax rauszugoogeln, wie in 
CodeVision Ports in einer Argumentliste übergeben werden.
Aber jetzt lass ich es.

> ich bin hauptberuflich personal coach

Gut. Wenn ich einen brauche, wende ich mich an dich oder einen deiner 
Kollegen. Und so solltest du es auch halten. Entweder du lernst das Zeug 
das du machen willst oder du suchst dir jemanden (und bezahlst ihn), auf 
das er dir mit seinem Wissen aushilft.

> wenn ich mich so bei meinen kunden
> aufführen würde

Du bist aber nicht unser Kunde. Und Hand aufs Herz: Wie oft hast du dir 
bei deinem Kunden schon gedacht: "So ein Vollkoffer, keine Ahnung von 
nichts aber eine große Klappe.". Nur das du das nicht sagen durftest, 
weil es ja ein Kunde von dir ist und du auf seine Knete scharf bist.

Viel Spass noch.

(Trotzdem der Hinweis: Der Weg führt über die Übergabe von Ports in der 
Argumentliste einer Funktion)

von sven (Gast)


Lesenswert?

naja da fühlt sich dann wieder der einzige mit diplomatischem geschick 
angesprochen =)

aber gut jeder wie er es möchte.. ich beziehe mich eher auf:

> Kann es sein, dass du den Code nur uebernommen hast und eigentlich
> keinen Funken Ahnung hast von dem, was du hier schreibst?

natürlich versteh ich davon was nicht sonst frag ich nicht... aber ich 
finde solche bemerkungen fehl am platz ;)

> [X] Du solltest ein C-Buch lesen

wie gesagt daz reicht die zeit leider nicht... das problem muss sich 
zeitnah lösen lassen...

Aber danke dann werd ich mich eben an jmd anders wenden

@ ADMIN: -to be closed

von peter (Gast)


Lesenswert?

> jetzt wird vlt klarer was ich mit dem DATA und CLK anstelle
Äh gar nichts, in den Funktionen selbst wird DATA und SCK gesetzt.

> ich muss einfach nach einer kompletten auswertung mit DATA auf nen
> anderen Pin zugreifen und wieder auswerten.. das ganze permanent im
> wechsel um beliebige anzahl sensoren auszulesen
Ich sehe keinen einzigen Pin-Zugriff.

> Hier liegt das eigentliche Problem. Halbwissen.
Wenn es nur soviel wäre... :-(

Ach, wo wir uns gerade alle anschnauzen, nimm bitte die 
Formatierungscodes, dann kann man das alles auch mal lesen.

Mein Vorschlag, wenn das eine Dipmlom-/Bachelor-/Abschlussarbeit ist, 
wechsel das Thema...
EDIT: Hat sich erledigt, du bist ja wohl Personal Coach... was auch das 
ist. ;-)

Zu dem Rest deines vorletzten Kommentars hat Karl heinz Buchegger schon 
alles gesagt. Gib uns richtig viel Geld und wir sind sowas von 
scheiße-nett zu dir... ;-)

>> Kann es sein, dass du den Code nur uebernommen hast und eigentlich
>> keinen Funken Ahnung hast von dem, was du hier schreibst?
> natürlich versteh ich davon was nicht sonst frag ich nicht...
Richtige Aufgabe für die falsche Person?

> aber ich finde solche bemerkungen fehl am platz ;)
Wir finden solche Fragen mit den (fehlenden) Vorkenntnissen fehl am 
platz. :-)

>> [X] Du solltest ein C-Buch lesen
> wie gesagt daz reicht die zeit leider nicht... das problem muss sich
> zeitnah lösen lassen...
Man muss schon wissen was geht, wir machen das hier freiwillig und aus 
Spaß an der Freud, aber es braucht auch das passende Vorwissen auf der 
Seite des Fragesteller.

von Karl H. (kbuchegg)


Lesenswert?

Mal ne Frage in die Runde:

Weiß jemand wie man in CodeVision einen Port als Argument an eine 
Funktion übergibt? Konnte mit Google bis jetzt nichts dazu finden.

In AVR-Gcc ist es ja simpel
1
void SetBit( volatile unsigned char* pPort, unsigned char Bit )
2
{
3
  *pPort |= ( 1 << Bit );
4
}
5
6
void SetBitMask( volatile unsigned char* pPort, unsigned char Mask )
7
{
8
  *pPort |= Mask;
9
}
10
11
int main()
12
{
13
  SetBit( &PORTA, PA0 );
14
  SetBit( &PORTC, PC1 );
15
  SetBitMask( &PORTC, ( 1 << PC3 ) );
16
}

Geht das so auch mit CodeVision?

von MWS (Gast)


Lesenswert?

Hättest Du nur ein ganz klein wenig beherzigt was ein Personal Coach so 
können muss, insbesonders den psychologischen Part, hättest Du längst 
Deine Antwort. Solltest Du also beruflich genauso vorgehen wie hier, 
würde ich vom weiteren Coaching absehen.

von Matthias (Gast)


Lesenswert?

Oiweh...

>> Kann es sein, dass du den Code nur uebernommen hast und eigentlich
>> keinen Funken Ahnung hast von dem, was du hier schreibst?

>natürlich versteh ich davon was nicht sonst frag ich nicht... aber ich
>finde solche bemerkungen fehl am platz ;)

Also mal zusammenfassen: Du stellst eine Frage, die dir jedes C-Buch 
bereits in der Einleitung beantwortet, ohne uns mitzuteilen, um was es 
geht. Wir antworten, geben sogar noch weiterfuehrende hilfestellung. Ich 
unterstelle frech, dass du keine Ahnung hast, willst aber nicht, dass 
wir dich so behandeln. Ich kann mit dir leider nicht so reden wie mit 
meinen Kollegen, weil du dann nichts verstehen wuerdest. Und generell 
ist dieses Forum nicht dafuer da, anderen Leuten die Loesungen fuer 
Problemstellungen hinzukleistern. Und leider (da kannst du nicht 
unbedingt was dafuer) haben die Leute hier eine Abneigung gegen Leute 
entwickelt, die irgendwo zusammengeklaubten Code haeppchenweise posten 
und erwarten, dass man ihnen hier eine Musterloesung zusammenschraubt. 
Und deine ersten Postings liessen nunmal auf derartiges schliessen.

>> [X] Du solltest ein C-Buch lesen

>wie gesagt daz reicht die zeit leider nicht... das problem muss sich
>zeitnah lösen lassen...

Das mit dem #define haettest du nachschlagen koennen, sogar bei google.

>Aber danke dann werd ich mich eben an jmd anders wenden

Ja, vielleicht jemanden, den du dafuer bezahlst, so einen Job zu machen.

von Karl H. (kbuchegg)


Lesenswert?

Wenn ich mal die AVR-gcc Syntax zugrunde lege
1
void s_transstart( volatile unsigned char* DataPort, unsigned char DataPin,
2
                   volatile unsigned char* ClockPort, unsigned char ClockPin )
3
//----------------------------------------------------------------------------------
4
// generates a transmission start
5
//       ____         _______
6
// DATA:      |_______|
7
//           __     __
8
// SCK : ___|   |___|   |______
9
{
10
   direct=1;
11
   wait(1);
12
13
  // DATA=1; SCK=0;
14
   *DataPort |= ( 1 << DataPin );
15
   *ClockPort &= ~( 1 << ClockPin );
16
17
   wait(2);
18
19
  // SCK=1;
20
   *ClockPort |= ( 1 << ClockPin );
21
22
   wait(1);
23
24
  // DATA=0;
25
   *DataPort &= ~( 1 << DataPin );
26
27
   wait(1);
28
29
  // SCK=0;
30
   *ClockPort &= ~( 1 << ClockPin );
31
32
   wait(2);
33
34
  // SCK=1;
35
   *ClockPort |= ( 1 << ClockPin );
36
37
   wait(1);
38
39
  // DATA=1;
40
   *DataPort |= ( 1 << DataPin );
41
42
   wait(1);
43
44
  // SCK=0;
45
   *ClockPort &= ~( 1 << ClockPin );
46
47
   wait(1);
48
}

Aufruf dann zb. mittels
1
  ....
2
3
  transstart( PORTA, PA0, PORTA, PA1 );
4
5
  ....

oder aber, ums ein bischen lesbarer und wartbarer zu gestalten, noch ein 
bischen 'syntactic sugar' drübergestreut

1
#define SENSOR1_DATA    PORTA
2
#define SENSOR1_DPIN    PA0
3
#define SENSOR1_CLOCK   PORTA
4
#define SENSOR1_CPIN    PA1
5
6
#define SENSOR2_DATA    PORTB
7
#define SENSOR2_DPIN    PB3
8
#define SENSOR2_CLOCK   PORTB
9
#define SENSOR2_CPIN    PB7
10
11
  ....
12
13
  transstart( SENSOR1_DATA, SENSOR1_DPIN, SENSOR1_CLOCK, SENSOR1_CPIN );
14
15
  ....

Aber wie gesagt: So würde man das mit dem AVR-gcc machen. Ob's beim 
CodeVision auch so geht, kann ich nicht sagen. Das Problem ist, dass er 
den Portzugriff über die Pointerdereferenzierung korrekt umsetzen muss.

von P. S. (Gast)


Lesenswert?

Karl-Heinz, wieso foerderst du so ein Verhalten eigentlich immer mit 
deiner Gutmuetigkeit :-(

von Matthias N. (vbchaos)


Lesenswert?

Allein der "Syntactic sugar" wars doch Wert :) Den kannte ich nicht, 
aber ich mag ihn

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.