Sida 1 av 1

C-kod, printf fråga

Postat: 12 april 2006, 21:23:24
av dangraf
Hallå alla glada!
jag tänkte skriva min printf funktion till en dsPIC, och använder kompilatorn C30.

Deklarationen av printf ser ut ung såhär:

void print(char *ptr,...);

Jag är inte familjär med hur "..." används i C. Är det någon form av standard variabel i form av pekare eller??

För jag skulle gärna viljat kunna skrivat.ex

int i = 10;
float fl = 3.2;
printf("talet %i motsvarar %x i hex, nur är det %f grader varmt ute" ,i ,i,fl );

Men jag vet inte riktigt hur man når variablerna i och fl i min funktion.

Någon som vet??

Postat: 12 april 2006, 21:40:12
av sodjan
"..." betyder väl bara att "här kommer det mera" !?

Sen, vart hamnar resultatet av fprint ?

Hela iden med fprint verkar lite konstig på en microcontroller,
tycker jag i alla fall... :-)

Slutligen, behöver du verkligen det dynamiska området som
en float omfattar bara för att representera en temperatur med
en decimal ? Verkar overkill. Fixed point borde duga bra.

Postat: 12 april 2006, 21:50:27
av henkebenke
Kernighan & Ritchie sidan 156, där står hur man gör en minimal printf.
Kopierat valda delar:

Kod: Markera allt

void minprintf(char *fmt, ...)
{
  va_list ap; //pekare till argument
  double dval;
  int ival;

  ...
  va_start(ap, fmt); // ap ska nu peka på första argumentet
  ...
  ival = va_arg(ap, int); //va_arg() returnerar ett argument och flyttar ap så den pekar på nästa. 
                          //Typnamnet avgör vilken typ som returneras och hur mycket ap ökas.
  dval = va_arg(ap, double);
  va_end(ap); //Slutligen lite cleanup
}  

Postat: 12 april 2006, 21:56:49
av bearing

Postat: 12 april 2006, 21:56:57
av henkebenke
Sodjan: Många kompilatorer kör ut printf på lämplig UART, ganska kraftfullt som debug eller för loggning tex.

Och som sagt, flyttal bör man akta sig för, skrymmande och långsamt och att implementera utskrift av float i printf är lite mer komplicerat än att skriva ut en int.

Postat: 12 april 2006, 21:58:47
av dangraf
Tackar för ett snabbt svar!!

Jag har tyvär inte den boken. Hittade dock ytterligare ett exempel precis innan jag fick ditt svar.

Står på s221 i "dsPIC language tools libaries" som går att ladda ner från microchips hemsida. Headersn som skall inkluderas heter <stdarg.h>