mikrocontroller.net

Forum: Compiler & IDEs Eigenen Typen definieren?


Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallihallo,

ich habe keine Ahnung ob der Titel überhaupt stimmt. Sorry im voraus 
aber ich möchte gerne folgenes machen. Gibt es eine Möglichkeit sich in 
C selber eine Art Typ zu definieren den man dann per ++ und -- 
durchrollen kann?

Ich versuche es mal zu erklären was ich möchte.

myalphas A,B,C,K,L,M,O,P

myalphas actAlpha;

Bei Inhalt C und anschließendem ++ soll es K sein.
Bei Inhalt P und anschließendem ++ soll es A sein.

Ich möchte gerne bei einer Eingabe einen Zeichenbereich definieren 
können und den mit ++ und -- durchgehen und nur die definierten Zeichen 
sollen angezeigt werden.

Also zB alle Buchstaben und das Leerzeichen:
ASCII 0x65 - 0x90  A - Z
ASCII 0x20         SPACE

Im Moment mache ich es mit einem ><= Vergleich, ist aber nicht so schön 
weil ich die gültigen Zeichen am liebsten zur Laufzeit unterschiedlich 
bestimmen möchte.

Für jeden Tip dankbar, MfG AVRli...

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in C nicht, in C++ ja

struct Alpha {
   Alpha() : x(&alphas[0]) {}
   static const char alphas[10];
   const char * x;
   // in postfix form
   char operator ++(int) { char tmp; .... return tmp; }
   char operator --(int) { char tmp; ....  return tmp; }
   operator char() { return *x; }
};
const char Alpha::alphas="0123456789";

Alpha a;

char c = a; // konvertierungsoperator
char next = a++; // postfix operator

letzendlich ist es syntax sugar ;)
klar geht es in C, nur anders

enum direction {UP, DOWN};
char alpha(enum direction dir) {
    char static alphas = "";
    char static * last = &alphas[0];
    if(dir == UP) {
        ...
        return ...
    } else {
        ...
        return ...
    }
    return '?'; // default char
}

grüsse, daniel

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch wenn du am Ende in C++ sowas wie actAlpha++ oder actAlpha-- 
schreiben kannst, irgendwo in der Klasse actAlpha musst du in guter 
alter Handarbeit ausprogrammieren, was dann geschehen soll.

Schreib dir in c einen Satz Funktionen, char getArrayChar(), char 
getArrayCharAndInc() und char getArrayCharAndDec(), die auf einem 
(statisch globalen) char-Array arbeiten, und dir daraus deine 
gewünschten Buchstaben liefern. Dazu eine Funktion, mit der du 
Buchstaben in das Array eintragen kannst, und wenn nötig, auch eine zum 
löschen. Etwas Verwaltungskram gehört dazu, (wieviel Zeichen sind im 
Array, aktuelle Zeichenposition, etc.), und fertig. Vom 
Programmieraufwand ist das identisch zu C++.

Anstelle von c = actAlpha++; heisst das dann zwar c= 
getArrayCharAndInc(); aber damit kann man doch leben.

Oliver

Autor: Uboot- Stocki (uboot-stocki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

hä? Kannst Du nicht einfach ein Array definieren in dem Deine 
Zeichenfolge "A,B,C,K,L,M,O,P" als einzelde Elemente drin stehen?

> Ich möchte gerne bei einer Eingabe einen Zeichenbereich definieren
> können und den mit ++ und -- durchgehen und nur die definierten Zeichen
> sollen angezeigt werden.
>
> Also zB alle Buchstaben und das Leerzeichen:
> ASCII 0x65 - 0x90  A - Z
> ASCII 0x20         SPACE
>
> Im Moment mache ich es mit einem ><= Vergleich, ist aber nicht so schön
> weil ich die gültigen Zeichen am liebsten zur Laufzeit unterschiedlich
> bestimmen möchte.

Du kannst dann mit foo[0] auf das A und mit foo[1] auf das B usw. 
zugreifen. Dein ++ und -- geht damit auch und Du kannst die Werte im 
Array zur Laufzeit ändern ...

Gruß

Andreas

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Musst nur aufpassen, weils am Ende nicht rundrollt. Beim letzten Element 
landet dann "a++" in der Wildnis.

Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

sorry für die späte Antwort aber ich hatte vorher keine Zeit. :-(
Also die ganzen Lösungen habe ich soweit verstanden doch da denke ich ja 
fast das meine Lösung dann die "einfachere" und "Platz sparendere" ist.
char get_next_char(char value) {
//     32 SPACE
//     44 , (Komma) noch nicht bei
// 48..57 0 - 9
// 65..90 A - Z
  if (value == 0) return 32;
  else
  if (value == 32) return 48;
  else
  if (value == 57) return 65;
  else
  if (value == 90) return 32;
  else
  if ((value >= 48) && (value < 57)) return value+1;
  else
  if ((value >= 65) && (value < 90)) return value+1;
  return 0;
}

für Next Char mache ich es so, dann gibt es noch eine Funktion für Prev 
Char.

Nun habe ich bemerkt das ich gelegendlich das Komma noch brauchen werde.

Vielleicht geht's noch eleganter?

Bei der Array Variante muß man sich ja immer jedes Zeichen in den RAM 
packen, ist das nicht verschwendung?

Gruß AVRli...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.