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
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
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
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.
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...
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
inttmpVar=0;
10
if(i==0)
11
tmpVar=DATA1;
12
elseif(i==1)
13
tmpVar=DATA2;
14
elseif(i==2)
15
tmpVar=DATA3;
16
elseif(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...
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...
[ ] 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.
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
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).
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
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.
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...
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
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
Matthias wrote:
> sagst du halt (ich zitiere peter(Gast))>>
1
>if(i==0)
2
>tmpVar=DATA1;
3
>elseif(i==1)
4
>tmpVar=DATA2;
5
>elseif(i==2)
6
>tmpVar=DATA3;
7
>elseif(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.
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 ;)
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)
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
> 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.
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
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.
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.
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.