Hallo Semjon,
ja so etwas in der Art habe ich seit gestern schon umgesetzt.
Werde aber trotzdem deines noch mal genauer anschauen und testen.
Danke abermals ![:smile: :smile:](https://www.wer-weiss-was.de/images/emoji/twitter/smile.png?v=9)
Naja… ich paiste es auch noch mal rein… warum auch nicht:
#include
#include
typedef struct { char key; char *value; } AssocTabl;
void hauptmenue( );
AssocTabl* get_dbmenue_row( int , char );
void print_line(char, int);
void print_dbmenue(){
AssocTabl* KeyVal; // AssocTabl* dbmenue( int offset, char key )
print_line(’_’,80);
get_dbmenue_row(-1,0); // Index auf erstes Element setzen
while( KeyVal = get_dbmenue_row(1,0) ) printf("%c = %s\n", KeyVal->key , KeyVal->value );
print_line(’_’,80);
}
void print_line(char c, int len ){ for(; len>0; len–){ printf("%c",c);}printf("\n" ); }
AssocTabl* get_dbmenue_row( int offset, char key ){
// offset ist (normalerweise) 1 oder 0, -1 bedeutet key_last_used zurücksetzen.
// get_val_flag ist entweder 0 oder eine zahl (besser nur 1)
int i =0 ; // temp. Zählvariable
static int key_last_used = -1; // Wird dann beim ersten Offset (meist) auf 0 schreiten.
// Static damit der Inhalt nicht jedesmal neu definiert wird. Nur aus performance gründen.
static AssocTabl dbmenue[] = {
{ ‚x‘, „Exit. D.h. Programmende“ },
{ ‚v‘, „Datenbank oeffnen/anlegen“ },
{ ‚o‘, „bestehende Datenbank bearbeiten (Name vorhanden)“ },
{ ‚a‘, „Datensaetze anzeigen (sequentiell, nacheinander)“ },
{ ‚h‘, „Datensaetze hinzufuegen (von Tastatur) / importieren (aus externer Datei)“ },
{ ‚s‘, „Datensaetze suchen“ },
{ 0 , 0 }
}, *pt = dbmenue;
//printf("%i", key_last_used );
if( offset == -1 ){ key_last_used = -1; }
if( !offset && !key ){
printf( „Meldung aus Funktion, Zeile 49\n“
„AssocTabl* dbmenue( int offset, int get_val_flag, char key )\n“
„(!offset, … , !key ) macht keinen Sinn.\n“);
getchar(); return 0;
}
if( offset > 0 ){ // negativer Werte sind besondere Steuerzeichen.
// Wir setzen den Index hoch und geben den Eintrag zurück.
key_last_used += offset ;
if( dbmenue[key_last_used].key ) return &dbmenue[key_last_used];
key_last_used = -1; // Zurücksetzen, damits beim nächsten durchlauf wieder vorne beginnt.
return 0;
}
// Groß und Kleinschreibung soll keine Rolle spielen. c " ); // Bash zeichnen.
key = getche(); clrscr(); // Taste erfassen und Bildschirm löschen.
if( !(KeyVal = get_dbmenue_row(0, key )) ){
printf( "Fuer Ihre Eingabe >%c%ckey );
switch( key ) {
case ‚v‘: break; // „Datenbank oeffnen/anlegen“ },
case ‚o‘: break; // „bestehende Datenbank bearbeiten (Name vorhanden)“ },
case ‚a‘: break; // „Datensaetze anzeigen (sequentiell, nacheinander)“ },
case ‚h‘: break; // „Datensaetze hinzufuegen (von Tastatur) / importieren (aus externer Datei)“ },
case ‚s‘: break; // „Datensaetze suchen“ },
case ‚x‘: break; // „Exit. D.h. Programmende“
default: print_line(’=’,80);
printf( „Programmierfehler. Unkonsistenz: Der Fall %c ist ohne Funktionalitaet.\n“, key );
print_line(’=’,80);
}
} while( key != ‚x‘ );
}