Forum: Mikrocontroller und Digitale Elektronik C - Fragen


von Stefan Helmert (Gast)


Lesenswert?

Hallo,

ein paar Fragen zur C-Programmiersprache:
Wie definiere ich Funktionen variabler Argumentenanzahl?
z.B.: sende(1,2);
      sende(8,4,5,6);
      sende(0,2,0,'H',"allo",x,str[0]) // Variablen, Konstanten,
Arrays bilden eine Argumentenkette
Kann ich in einer Variable auch ganze Terme speichern?
x = Term_zuweisen("a+b");
a = 3;
b = 4;

x -> 7

Wie definiere ich einen neuen Datentyp?
z.B.:
var_on_ser_eeprom x;
var_on_ser_eeprom y;
fifo f;
var_on_HDD h[10];

x = 10;  // Ausgeführt wird aber save(0,10);
y = x + 1;  // Ausgeführt wird aber save(1,load(0)+1);

Wie kann ich Variblen halb-gobal-local definieren?
z.B.:
char x for print, send;

void print(void)
{
PORTA = x // Variable x
}

void send(void)
{
PORTB = x // gleiche Variable x
}

void pause(void)
{
char x; // andere Variable x
for(x=0;x<=10;x++)
{}
}

Wie kann ich mit einem Pointer auf Konstanten und Variablen
gleichermaßen Lesezugriffe starten?
z.B.:
print("Hallo");
Print(str[0]);

von Matthias (Gast)


Lesenswert?


von Stefan Helmert (Gast)


Lesenswert?

danke,
beim überfliegen sah es jedoch nicht so aus als würe es alle meine
fragen beantworten. Ich verwende übrigens den cc5xfree - Compiler.

von mthomas (Gast)


Lesenswert?

>Wie definiere ich Funktionen variabler Argumentenanzahl?
>...
>Arrays bilden eine Argumentenkette
Vgl. beliebiges besseres C-Buch, nach va_start suchen. Alternativ: die
Sendefunktion soll wohl ein paar Bytes rausschrieben, also uebergibt
man ein Bytearray (und dessen Laenge). Das Array selbst wird vorher
zusammengestellt -> sende(uint8_t sendefolge[], uint16_t anzahlbytes)
>Kann ich in einer Variable auch ganze Terme speichern?
>x = Term_zuweisen("a+b");
>a = 3;
>b = 4;
>x -> 7
So etwas funktioniert nicht "mit Bordmitteln" und so transparent wie
gewuenscht auch nicht in "normalem" C (schon in C++, aber auch nicht
"einfach so"). Auf jeden Fall braucht man "extra Code". Wie auch
immer - unter "function parser" findet man gut "vorgekautes" im
Netz (meist aber Code fuer etwas mehr RAM als bei kleinen µCs
verfuegbar).
>Wie definiere ich einen neuen Datentyp?
>z.B.:
>var_on_ser_eeprom x;
>var_on_ser_eeprom y;
>fifo f;
>var_on_HDD h[10];
>
>x = 10;  // Ausgeführt wird aber save(0,10);
>y = x + 1;  // Ausgeführt wird aber save(1,load(0)+1);
Betr "var_on_hdd" und "fifo": C-Buch lesen. Betr. Eeprom ist die
Vorgehensweise aehnlich wie bei anderen "externen" Speichermedien
(auch HDD). Man liest die Variablen mit speziellen Funktionen (abh. von
Controller/Eeprom/Compiler/Library) und schreibt auch "indirekt".
Syntax wie gewuenscht ist erst in C++ moeglich (oder firmenspezifisch
erweiterten C-Compilern), aber vielleicht erstmal Hintergrund
nachvollziehen und dann nochmal konkreter Fragen.
>Wie kann ich Variablen halb-gobal-local definieren?
>z.B.: char x for print, send;
>...
Sowas steht wirklich in einem C-Buch/Tutorial. Globale und lokale
Variablen mit gleichem Namen machen nur Code schlecht lesbar. Wenn
schon Globale dann mit aussagekraeftigem Namen und vielleicht je nach
"Geschmack" oder Firmenrichtlinien noch ein "g" davor. (z.B.
gUartSendBufferStat).
>Wie kann ich mit einem Pointer auf Konstanten und Variablen
>gleichermaßen Lesezugriffe starten?
>z.B.:
>print("Hallo");
>Print(str[0]);
wird so eher nichts. (print(char a[]) bzw. P(p)rint(char a) sind nicht
identisch (a) C-Buch (b) evtl. nochmal konkrekter nachfragen.

von Stefan Helmert (Gast)


Lesenswert?

danke,
(Frage 1:) dass man eine Array verwenden kann wusste ich. Es geht aber
darum die Argumente gleich in der Funktion anzugeben, damit das nicht
so unübersichtlich wird. etwa so
Adresse: 10 (Gerät Nr. 10 - Monitor)
Kommando: 12 (print)
Daten: "Wert:", x, "km"
->
sende(10,12,"Wert:",x,"km");

Wie wird das denn bei der printf - Funktion gelöst, da kann man doch
z.B. schreiben:
printf("Wert: %d km",x); // 2 Argumente oder aber
printf("Werte: %d V, %d A, %d Ohm",x,y,z); // 4 Argumente

Wie wurde diese Funktion definiert?

Ich hab zwar mal die printf.h angesehen -> ist aber total
unübersichtlich, d.h. ich hab da nicht wirklich eine Antwort auf meine
Frage gefunden.

von Tobi (Gast)


Lesenswert?

ich zitier mal:
"Vgl. beliebiges besseres C-Buch, nach va_start suchen."

da solltest du weitersuchen

von Stefan Helmert (Gast)


Lesenswert?

http://www.pronix.de/pronix-813.html
da steht es ist in stdarg.h definiert. Die hab ich (glaube ich) gar
nicht. Was nun? Selbst schreiben?! Wie?

von Tobi (Gast)


Lesenswert?

probier doch einfach aus, ob du es hast. hab bisher keinen c compiler
ohne gesehen

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.