C - Fragen

Gast #156663
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]);
Gast #156666
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.
Gast #156667
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren