Forum: Mikrocontroller und Digitale Elektronik Zeichen mit Zahl verbinden


von Lokus P. (derschatten)


Lesenswert?

Wie stelle ich es an wenn ich ein Zeichen mit einer Variable verbinde 
die als "uint8_t laufwerkid;" definiert ist?

Also:
idstart = "_" + laufwerkid;

Das ganze sollte dann so aussehen:

_8

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

1
char idstart [3];
2
idstart[0] = '_';
3
idstart[1] = laufwerkid - '0';
4
idstart[2] = 0;

von Karl H. (kbuchegg)


Lesenswert?

http://www.mikrocontroller.net/articles/FAQ#Wie_funktioniert_String-Verarbeitung_in_C.3F

Ist aber nur die Kurzform. Die Details finden sich in jedem noch so 
grindigem C-Buch.

von blurp (Gast)


Lesenswert?

Niklas Gürtler schrieb:
> char idstart [3];
> idstart[0] = '_';
> idstart[1] = laufwerkid - '0';
> idstart[2] = 0;

So funktioniert das nicht.

Aber so:
char idstart [3];
idstart[0] = '_';
idstart[1] = laufwerkid + '0';
idstart[2] = 0;

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

tatsächlich. mist. Da hab ich die Konvertierungsrichtungen 
durcheinandergeworfen.

von Lokus P. (derschatten)


Lesenswert?

blurp schrieb:
> Aber so:
>
> char idstart [3];
>
> idstart[0] = '_';
>
> idstart[1] = laufwerkid + '0';
>
> idstart[2] = 0;

Leider auch nicht.
Zumindest meldet AVRStudio diverse fehler:

../main.c:78: warning: data definition has no type or storage class
../main.c:78: warning: type defaults to 'int' in declaration of 
'idstart'
../main.c:78: error: conflicting types for 'idstart'
../main.c:77: error: previous declaration of 'idstart' was here
.... usw.

von Thomas E. (thomase)


Lesenswert?

Manfred W. schrieb:
>> idstart[0] = '_';
>> idstart[1] = laufwerkid + '0';
>> idstart[2] = 0;

Wo machst du das denn?

Das geht nur in einer Funktion.

mfg.

von Lokus P. (derschatten)


Lesenswert?

aso, ok.
Geht das wirklich nur so aufwändig?

Also wenn ich mich an das Beispiel halte, müßte es so aussehen:
1
char* ausgabe()
2
{
3
  char idstart[3];
4
  idstart[0] = '_';
5
  idstart[1] = laufwerkid + '0';
6
  idstart[2] = 0;
7
  return idstart;
8
}

Gibt jedoch den Fehler:
../main.c:173: warning: function returns address of local variable

aus.

von Karl H. (kbuchegg)


Lesenswert?

Manfred W. schrieb:
> aso, ok.
> Geht das wirklich nur so aufwändig?

Das was du aufwändig nennst, ist das A und O jeglicher vernünftiger 
Softwareentwicklung: Das Aufteilen und Arbeiten mit Funktionen (ist mir 
auch bei deinen restlichen Fragen aufgefallen, dass du mit Funktionen 
auf Kriegsfuss stehst)

>
> Also wenn ich mich an das Beispiel halte, müßte es so aussehen:

Nein, das geht so nicht.
Du kannst kein Array aus einer Funktion heraus zurückgeben.

Aber du kannst ein Array (per Pointer) in die FUnktion heineingeben und 
die Funktion füllt den Inhalt ein.
http://www.mikrocontroller.net/articles/FAQ#wie_schreibt_man_eine_Funktion.2C_die_einen_String_liefert.3F

Kauf dir doch bitte ein C-Buch und arbeite es durch (kaufen bzw. 
schmökern ist zu wenig). Es hat keinen Sinn, sein Viertelwissen in einem 
Forum durch Fragen auf Drittelwissen aufzubessern. Und schon gar nicht 
geht das bei einer Sprache wie C, die voll von kleinen Fallen ist, die 
man systematisch lernen muss. Arbeiten mit Strings bzw. mit Arrays sind 
die ersten großen Hürden in der C-Programmierung und ziehen sich in 
jedem C-Buch über eine erklekliche Anzahl an Seiten hin. Eben weil es 
dabei viele Dinge zu sagen und zu erklären gibt.

von Lokus P. (derschatten)


Lesenswert?

Bevor ich jetzt aber in diese Richtung weitertüfftel, vielleicht wisst 
ihr ja eine bessere Lösung für mein problem.

Beim start soll eine Zahl aus dem EEPROM ausgelesen werden, diese 
entweder 8 oder 9 sein kann.
1
laufwerkid = eeprom_read_byte(&eeprom_floppyid);

Jetzt möchte ich diesen Wert einem bestimmten Bitmuster zuordnen:
1
#define _8        (1 << PB0) | (1 << PB1) | (1 << PB2) | (1 << PB3) | (1 << PB4) | (1 << PB5) | (1 << PB6)

Dieser soll dann ausgegeben werden:
1
PORTB = _8

Wie würdet ihr das machen?

von Klaus W. (mfgkw)


Lesenswert?

Wenn du sicher bist, daß es nur 8 oder 9 sein kann:
1
// liefert zu einer Laufwerk-Id (8 oder 9) das Bitmuster für PB
2
uint8_t laufwerkid2bitmuster( uint8_t laufwerkid )
3
{
4
  static uint8_t   bitmuster[] =
5
    {
6
      ( (1 << PB0) | (1 << PB1) | (1 << PB2) | (1 << PB3) | (1 << PB4) | (1 << PB5) | (1 << PB6) ),
7
      ( (1 << PB0) | (1 << PB1) | (1 << PB2) | (1 << PB3) | (1 << PB4) | (1 << PB5) | (1 << PB7) ),
8
    };
9
10
  return bitmuster[laufwerkid-8];
11
}
12
13
void tuwas()
14
{
15
  uint8_t laufwerkid = ...; // woher auch immer, nur 8 oder 9 möglich
16
  PORTB = laufwerkid2bitmuster( laufwerkid );
17
}

Die Funktion laufwerkid2bitmuster() könnte man zudem noch
inline machen und ggf. static, dann kann der Compiler sich beim
Optimieren besser austoben.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Beim start soll eine Zahl aus dem EEPROM ausgelesen werden, diese
> entweder 8 oder 9 sein kann.
>
>
> Jetzt möchte ich diesen Wert einem bestimmten Bitmuster zuordnen:

Und warum speicherst Du nicht gleich das Bitmuster im EEPROM?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

OT:
Klaus Wachtler schrieb:
1
 ( (1 << PB0) | (1 << PB1) | (1 << PB2) | (1 << PB3) | (1 << PB4) | (1 << PB5) | (1 << PB6) ),
2
 ( (1 << PB0) | (1 << PB1) | (1 << PB2) | (1 << PB3) | (1 << PB4) | (1 << PB5) | (1 << PB7) ),
Das ist jetzt wieder ein Grund, warum ich diese Einsershifterei machmal 
so extrem unhandlich finde: ich musste hier garantiert 10 Sekunden 
hinschauen um zu sehen, ob und wo der Unterschied der beiden Zeilen ist. 
Bei
1
  0x7F, 0xBF
oder wenigstens
1
  0b01111111, 0b10111111
hätte man gleich gesehen: da ist ein Unterschied...

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.