Forum: Compiler & IDEs C-Code übersichtlich?


von tronic (Gast)


Lesenswert?

Hallo

der übersichtlichkeitshalber möchte ich folgenden Code so schreiben:
char
alarm1[255]="\x1B[2JAlarm1:OFF\x1B[15CAlarm11:OFF\x1B[15CAlarm21:OFF\n

\x1B[2JAlarm2:OFF\x1B[15CAlarm12:OFF\x1B[15CAlarm22:OFF\n
";

sobald ich aber nicht alles auf der gleichen zeile schreibe, meldet der
compiler logischerweise fehler..... wie kann ich dem compiler sagen das
die 2. und 3. zeile alles zusammengehört?

gruss
tronic

von tronic (Gast)


Lesenswert?

der befehl \x1B[2J von der 2. zeile wegdenken... ist orginal nicht so..
aber tut ja nichts zur frage..

von Thomas (Gast)


Lesenswert?

Anführungszeichen ans Ende und an den Anfang jeder Zeile. Das Semikolon
nur am Ende der letzten Zeile.

von tronic (Gast)


Lesenswert?

danke, superschnelle antworten hier - krasses forum :)

von tronic (Gast)


Lesenswert?

ach noch was, gibts 16bit charvariablen?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> gibts 16bit charvariablen?

wchar_t, ist in der avr-libc nicht implementiert.

Willst du Chinesisch oder Japanisch schreiben?

von tronic (Gast)


Lesenswert?

ne brauch kein 16bit... also ok. ENDE

von tronic (Gast)


Lesenswert?

wie sinnvoll ist eigentlich mein Code, bzw. wie kann ich an
Speicherplatz sparen (momentan ohne Interrupt - aber das ändre ich
schon noch)?

#include <avr/io.h>
#include <util/delay.h>


void ini()
{
DDRD = 0xFE; //RX als Eingang wählen
DDRC = 0xFF;
DDRB = 0xFF;

PORTD=0x00; //Pullup aktivieren, bzw. auf Null setzen

UCSRB |= ( 1 << RXEN );  // RX einschalten
UCSRB |= ( 1 << TXEN );  // TX einschalten
UCSRC |= ( 1 << URSEL )|( 3<<UCSZ0 ); // Asynchron 8N1
UBRRH  = 0;
UBRRL  = 51; //Baudrate 19200 für 16MHz

}

int main (void)
{
ini();

uint8_t c; //8bit Variable definiert


char
alarm1[255]="\x1B[2JAlarm01:OFF\x1B[15CAlarm11:OFF\x1B[15CAlarm21:OFF\r\ 
n"
            "Alarm02:OFF\x1B[15CAlarm12:OFF\x1B[15CAlarm22:OFF\r\n"
            "Alarm03:OFF\x1B[15CAlarm13:OFF\x1B[15CAlarm23:OFF\r\n"
            "Alarm04:OFF\x1B[15CAlarm14:OFF\x1B[15CAlarm24:OFF\r\n"
            "Alarm05:OFF\x1B[15CAlarm15:OFF\x1B[15CAlarm25:OFF\r\n";


char
alarm2[255]=    "Alarm06:OFF\x1B[15CAlarm16:OFF\x1B[15CAlarm26:OFF\r\n"
            "Alarm07:OFF\x1B[15CAlarm17:OFF\x1B[15CAlarm27:OFF\r\n"
            "Alarm08:OFF\x1B[15CAlarm18:OFF\x1B[15CAlarm28:OFF\r\n"
            "Alarm09:OFF\x1B[15CAlarm19:OFF\x1B[15CAlarm29:OFF\r\n"
            "Alarm10:OFF\x1B[15CAlarm20:OFF\x1B[15CAlarm30:OFF\r\n";


  while(1)
  {
  while (!(UCSRA & (1<<RXC))); //warten auf RXC = 1

    c=UDR;

    for(c=0;c<255;c++)
    {while (!(UCSRA & (1<<UDRE))); UDR=alarm1[c];}

    for(c=0;c<255;c++)
    {while (!(UCSRA & (1<<UDRE))); UDR=alarm2[c];}

  }

return 0;
}

von Karl H. (kbuchegg)


Lesenswert?

> wie kann ich an Speicherplatz sparen

Deine Texte sind alle gleich:
an einer bestimmten Bildschirmposition steht der Text "Alarm"
gefolgt von einer laufenden Nummer, gefolgt von einem ":"
und wahlweise dem Text "OFF" bzw, "ON".

Du wirst mir doch nicht erzählen wollen, dass du die Texte
nicht zur Laufzeit erzeugen kannst, während du in einer
Schleife durch die Alarmbits durchgehst:

Die Zeilennummer der Alarmmeldung mit der Nummer x ist
offensichtlich x % 10, während die Spaltenposition
 x / 10 * irgendeine_Konstante beträgt.

#define ESC  "\x1B"

void Transmit( char* String )
{
  while( *String ) {
    while( !(UCSRA & (1<<UDRE)) )
      ;
    UDR = *String++;
  }
}

int main()
{
  char Buffer[20];
  int  i;

  ...
  Transmit( ESC "1B[2J" );

  for( i = 0; i < 30; ++i ) {
    sprintf( Buffer, ESC "%d;%dH", ( i + 1 ) % 10,
                                   ( i + 1 ) / 10 * 20 );
    Transmit( Buffer );

    sprintf( Buffer, "Alarm%02d:", i + 1 );
    Transmit( Buffer );

    if( Alarm[i] )
      Transmit( "ON" );
    else
      Transmit( "OFF" );
  }

  ...
}

Falls dir sprintf im Programm zu viel aufträgt, kann man
auch itoa bei etwas eingeschränkter Funktionalität
stattdessen verwenden. sprintf ist ziemlich teuer, das
relativiert sich allerdings wenn man die ganzen
Formatiermöglichkeiten gebrauchen und einsetzen kann.

Auf jeden Fall: Was bringt dir dein vorgefertigter
Totalstring? Der kostet nur Platz, und das Problem dass je
nach festgestelltem Zustand das OFF durch ON ersetzt werden
muss hast du auch nicht gelöst.

von tronic (Gast)


Lesenswert?

hmm, danke vielmal, hab mir schon ma überlegt das ja "alarm:" immer
wieder vorkommt und ma das daher so vereinfachen könnte, doch so über
sprintf hab ich noch nie was versucht, na mal probiern...

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.