Forum: Compiler & IDEs Eigenen Typen definieren?


von AVRli (Gast)


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...

von daniel (Gast)


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

von Oliver (Gast)


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

von Uboot- S. (uboot-stocki)


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

von Sven P. (Gast)


Lesenswert?

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

von AVRli (Gast)


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.
1
char get_next_char(char value) {
2
//     32 SPACE
3
//     44 , (Komma) noch nicht bei
4
// 48..57 0 - 9
5
// 65..90 A - Z
6
  if (value == 0) return 32;
7
  else
8
  if (value == 32) return 48;
9
  else
10
  if (value == 57) return 65;
11
  else
12
  if (value == 90) return 32;
13
  else
14
  if ((value >= 48) && (value < 57)) return value+1;
15
  else
16
  if ((value >= 65) && (value < 90)) return value+1;
17
  return 0;
18
}

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...

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.