Forum: Mikrocontroller und Digitale Elektronik Ausgabe Sendername statt Frequenz


von Ingo (Gast)


Lesenswert?

Hallo,

ich habe eine Variable die eine Senderfrequenz beinhaltet, die da heißt 
"Frequenz". Diese gebe ich auf einem Display aus. Jetzt möchte ich, dass 
statt der Senderfrequenz der Sendername angezeigt wird den ich der 
Frequenz zuordne. Natürlich kann man das durch lange switch case 
Anweisungen lösen, ich möchte jedoch ne kurze Lösung.

Am Besten wäre eine tabelle durchsuchen, ob die gewünschte Frequenz als 
Name im Speicher hinterlegt ist, wenn ja, dann den Namen, wenn nicht die 
Frequenz anzeigen.


Es geht mir hauptsächlich um die Suchfunktion.

Bin für jeden Vorschlag dankbar...

Ingo

von xfr (Gast)


Lesenswert?

Ingo schrieb:
> Am Besten wäre eine tabelle durchsuchen, ob die gewünschte Frequenz als
> Name im Speicher hinterlegt ist, wenn ja, dann den Namen, wenn nicht die
> Frequenz anzeigen.

Dann mach es doch so? Die Tabelle als Array mit Frequenz und Sendername. 
Mit einer Schleife gehst Du alle Einträge durch und schaust, ob die 
Frequenz dabei ist. Wenn es sehr viele Einträge sind, kannst Du es auch 
als binäre Suche implementieren, brauchst Du aber vermutlich nicht. Wenn 
kein passender Eintrag gefunden wurde, gibst Du die Frequenz aus.

von Ingo (Gast)


Lesenswert?

Ich weiss nicht wie die Tabelle aussehen soll...

von Karl H. (kbuchegg)


Lesenswert?

zb so
1
struct tabelle
2
{
3
  uint16_t Frequenz;
4
  char     Sendername[20];
5
};
6
7
struct tabelle Tabelle[4] =
8
{
9
  { 888, "OE3" },
10
  { 944, "BR3" },
11
  { 967, "Antenne Bayern" },
12
  { 922, "Radio Arabella" },
13
};

Also ein Array von Strukturen, wobei jedes Strukturelement einen 
Zusammenhang Frequenz->Sendername darstellt.

Dein C-Buch weiß mehr darüber. Du hast doch eines?
Wenn nicht: Warum hast du keines?

(natürlich nur, wenn du auch in C programmierst, was ich mal 
voraussetze)

von xfr (Gast)


Lesenswert?

Zum Beispiel so?
1
typedef struct {
2
  uint16_t frequenz;
3
  char* name;
4
} sender_t;
5
6
sender_t senderliste[] = {
7
  { 995, "Bayern 3"},
8
  {1077, "Antenne Bayern"},
9
}

von troll (Gast)


Lesenswert?

hingehauen ohne gewähr
1
typedef struct
2
{
3
   int frequenz;
4
   char *name;
5
} sender_t
6
7
sender_t sender[42]={{100, "Radio1"}, {105, "Radio2"},...};
8
9
void ausgabe(void)
10
{
11
  uint i;
12
  for(i=0;i<sizeof(sender)/sizeof(sender_t);i++)
13
  {
14
     if(frequenz==sender[i].frequenz)
15
         break;
16
  }
17
  if(frequenz==sender[i].frequenz)
18
    gebe_name_aus();
19
  else
20
    gebe_freq_aus();

von troll (Gast)


Lesenswert?

OK, deutlich zu langsam...

von Karl H. (kbuchegg)


Lesenswert?

troll schrieb:

> typedef struct
> {
>    int frequenz;
>    char *name;
> } sender_t

Vorsicht:
Wenn er dem Benutzer die Möglichkeit geben will, den Stationsnamen 
selbst einzustellen, dann geht das so in die Hose. Solange die 
Stationsnamen fix sind, ist es hingegen ok.

von troll (Gast)


Lesenswert?

Ähhh... was meinst du?

von Ingo (Gast)


Lesenswert?

Super Idee, die Stationsnamen sind fix. Wills eben schnell unmsetzen...

von Karl H. (kbuchegg)


Lesenswert?

troll schrieb:
> Ähhh... was meinst du?


Hier
typedef struct
{
   int frequenz;
   char *name;
} sender_t

sender_t sender[42]={{100, "Radio1"}, {105, "Radio2"},...};

Ohne zusätzlichen Aufwand kriegt er hier keine benutzerdefinierbare 
Stationsnamen unter. Die Pointer zeigen auf String-Literale. Und die 
sind per Defintion unberühbar.

von xfr (Gast)


Lesenswert?

troll schrieb:
> Ähhh... was meinst du?

Bei der Version von Karl Heinz sind die Strings immer 20 Zeichen lang 
und liegen direkt im Array. Bei Deiner und meiner Version liegen im 
Array dagegen Zeiger auf die Stringliterale. Die darf man zur Laufzeit 
natürlich nicht mehr ändern.

von troll (Gast)


Lesenswert?

Ah so, ja du hast Recht. Braucht dafür etwas weniger Speicher als deine 
Version. ;-)

von xfr (Gast)


Lesenswert?

Oh man, hier muss man echt schnell sein. :D

von troll (Gast)


Lesenswert?

xfr schrieb:
> Oh man, hier muss man echt schnell sein. :D
Das ist wohl wahr...

von Paul Baumann (Gast)


Lesenswert?

>> Oh man, hier muss man echt schnell sein. :D
>Das ist wohl wahr...

Nein. Schnell und gut ist nie beisammen.

MfG Paul

von Ingo (Gast)


Lesenswert?

Mein C&R liegt leider im Büro :(


Folgendes:
1
struct Sender_t Sender [] ={
2
  {RTL, "89.0 RTL"}  ,
3
  {JUMP, "JUMP"}    ,
4
  {NDR2, "NDR2"}    ,
5
  {SAW, "SAW" }    ,
6
  {FFN, "FFN"}    ,
7
  {ANTENNE, "ANTENNE"}
8
};

geht nicht wenn ich
1
for (unsigned char i=0; i<sizeof(Sender);i++){
2
    if(Sender.Sendefrequenz[i] ==  UKW.Sender.soll){
3
      Index = i;
4
    }else{
5
      Index = 255;
6
    }
7
  }
8
  if (Index < 255){
9
    lcd_string(Sender.Name[Index]);
10
  }else{
11
    lcd_formatierte_zahl(UKW.Sender.soll/10,3,1);
12
  }
das so mache, es kommt:
Error  1  subscripted value is neither array nor pointer nor


Was mach ich den falsch?

von xfr (Gast)


Lesenswert?

1. Die Schleife läuft zu oft. sizeof(Sender) gibt Dir den 
Speicherverbrauch des Arrays in Byte, nicht die Anzahl der Einträge. Wie 
es richtig geht, hat troll schon geschrieben.

2. In der Schleife wird Index immer auf 255 gesetzt, außer bei ANTENNE.

3. Zu der Fehlermeldung gibt es bestimmt eine Zeilennummer. In der geht 
etwas schief. Ohne den vollständigen Code (z.B. wie Index, struct 
Sender_t oder UKW definiert ist), ist das Rätselraten.

von Ingo (Gast)


Lesenswert?

Wie greift man auf solch ein Array denn zu, wenn ich den String haben 
will?

von xfr (Gast)


Lesenswert?

4. Es muss Sender[i].Sendefrequenz heißen statt Sender.Sendefrequenz[i]. 
Das gleiche beim Sendername.

von Ingo (Gast)


Lesenswert?

1
for (unsigned char i=0; i<6;i++){
2
    if(Sender[i].Sendefrequenz ==  UKW.Sender.soll){
3
      Index = i;
4
    }else{
5
      Index = 255;
6
    }
7
  }

leider bekomme ich immer noch in der if Zeile die Fehlermeldung:
Error  1  subscripted value is neither array nor pointer nor vector

von Ingo (Gast)


Lesenswert?

Hier is der Prototyp:
1
struct Sender_t{
2
  unsigned int Sendefrequenz;
3
  unsigned char* Name;
4
}

und hier die Definition:
1
struct Sender_t Sender [] ={
2
  {RTL, "89.0 RTL"}  ,
3
  {JUMP, "JUMP"}    ,
4
  {NDR2, "NDR2"}    ,
5
  {SAW, "SAW" }    ,
6
  {FFN, "FFN"}    ,
7
  {ANTENNE, "ANTENNE"}
8
};

von Ingo (Gast)


Lesenswert?

Ich verstehe die Fehlermeldung nicht, natürlich ist das ein Array?!

von Ingo (Gast)


Lesenswert?

Habs...



Ingo

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.