Forum: Compiler & IDEs Eleganterer Pointer weg


von Simon (Gast)


Lesenswert?

Kann man das nicht irgendwie eleganter lösen ohne hier ein zweiten BYTE 
*y zu benötigen?
1
void debug_putword(WORD *w)
2
{
3
    BYTE b[10];
4
    BYTE *y;
5
6
    y = &b[0];
7
    
8
    ultoa((DWORD) *w, y);
9
10
    while( *y )      // loop until *s == '\0' the  end of the string
11
    debug_putchr( *y++);  // send the character and point to the next one
12
    debug_putchr( '\r');       // terminate with a cr / line feed
13
}

von Dirk B. (dirkb2)


Lesenswert?

Simon schrieb:
> Kann man das nicht irgendwie eleganter lösen ohne hier ein zweiten BYTE
> *y zu benötigen?

Mit einem Index  i geht das auch.

Ein BYTE ist aber nicht der richtige Typ für Zeichen. Das wäre char.

von Peter II (Gast)


Lesenswert?

1
void debug_putword(WORD *w)
2
{
3
   char b* = alloca(10);
4
   ultoa(*w, b);
5
6
   while( *b )      // loop until *s == '\0' the  end of the string
7
      debug_putchr( *b++);  // send the character and point to the next one
8
    debug_putchr( '\r');       // terminate with a cr / line feed
9
}

von MaWin (Gast)


Lesenswert?

printf("%ul\r",w) ?

Ein \r ist übrigens kein a cr / line feed

von B. S. (bestucki)


Lesenswert?

Programmierst du auf einem uC oder PC? Ich schreib hier einfach mal, wie 
ich das auf einem uC lösen würde (ungetestet):
1
void debug_putstr(const char * restrict Str){
2
  while(*s){
3
    debug_putchr(*s++);
4
  }
5
}
6
7
void debug_putword(WORD a){
8
  char Buffer[10];
9
  ultoa(a, Buffer, 10);
10
  
11
  debug_putstr(Buffer);
12
  debug_putchr('\r');
13
}

Für die Grösse von Buffer würde ich noch etwas Präprozessormagie 
anwenden, damit die Funktion auch auf anderen Plattformen funktioniert.

MaWin schrieb:
> printf("%ul\r",w) ?
Da es sich um Debug-Ausgaben handelt, würde ich eher folgendes 
verwenden:
1
fprintf(stderr, "%lu\r", w);

von Simon (Gast)


Lesenswert?

Habe hier einen PIC24 :-)

Ich probier mal die Beispiele aus, vielen Dank schonmal!

von Rolf M. (rmagnus)


Lesenswert?

Peter II schrieb:
> char b* = alloca(10);

Alloca ist eigentlich dafür da, wenn die Größe erst zur Laufzeit bekannt 
ist. Was sollte es bringen, das mit einer Konstanten aufzurufen?

von Peter II (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Alloca ist eigentlich dafür da, wenn die Größe erst zur Laufzeit bekannt
> ist. Was sollte es bringen, das mit einer Konstanten aufzurufen?

das was die Aufgabenstellung war.

> Eleganterer Pointer weg

von Karl H. (kbuchegg)


Lesenswert?

Peter II schrieb:
> Rolf Magnus schrieb:
>> Alloca ist eigentlich dafür da, wenn die Größe erst zur Laufzeit bekannt
>> ist. Was sollte es bringen, das mit einer Konstanten aufzurufen?
>
> das was die Aufgabenstellung war.
>
>> Eleganterer Pointer weg

Wobei man auch sagen muss, dass der urspüngliche Code (jetzt mal 
abgesehen davon, dass man die Funktionalität auf 2 Funktionen aufteilen 
sollte, wie gezeigt), so schlecht nicht war. Der TO muss lernen, dass 
Hilfsvariablen nichts schlechtes sind. Im konkreten Beispiel und einen 
halbwegs intelligenten Compiler vorausgesetzt, bleibt von dieser 
Pointervariable sowieso im erzeugten Code nichts über, ausser einer 
Registerbelegung, die er aber so und so hätte.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Vor allem, diese Hilfsvariable liegt auf dem Stack, frisst also kein 
(dauerhaftes) Brot.

Wenn zwei oder vier Bytes mehr auf dem Stack ein Problem darstellen, 
dann liegt ein ganz anderes Problem vor.

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.