C - Fragen

Gast #156663
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
danke,
beim überfliegen sah es jedoch nicht so aus als würe es alle meine
fragen beantworten. Ich verwende übrigens den cc5xfree - Compiler.
Gast
>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
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

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.