Zeichen mit Zahl verbinden

#2185318
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.
#2185357
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.
#2185358
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.
#2185390
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?
#2185401
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.
Moderator (Firma: Titel) Persönliche Seite #2185435
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren