Ik wil een ADC waarde omtoveren naar een waarde uitgedrukt in 2 cijfers achter de komma.

Ik probeer het met sprintf, maar ik krijg telkens een -0.00 getal eruit. Wat ik ook probeer. Zie ik wat over het hoofd?

sprintf( cStringBuffer, "%+7.2f", 5.898 );

Het getal 5.898 heb ik ook geprobeerd te vervangen voor een float variable met daarin dezelfde waarde en dat werkt ook niet.

Ik werk op een pic32 met microchip's compiler en IDE. Ik probeer cStringBuffer naar mijn LCD te schrijven.

Geen idee hoe compleet pic-ding C is. Het is niet ongebruikelijk om printf (en dus ook de varianten daarop) maar ten dele te implementeren als het om microcontrollers gaat; zal voor pic-dingen dus ook wel op kunnen gaan.

SDCC kun je vertellen hoe uitgebreid printf moet zijn. Wellicht kan dat bij jou compiler ook.

In deze context ben ik er overigens meer voorstander van om die float *100 te doen en er zelf even een punt tussen te frutten. printf is schreeuwend duur. Floats zijn ondingen (maar ja, je ontkomt er niet altijd aan) en dat zal op een pic-ding niet beter zijn.

Mocht iemand nog weten waarom het niet werkt, dan zou ik dat graag willen weten.

Voor nu is het opgelost met een cast, demo vb:


unsigned char getPowerVoltage(char data)
{
	if(data) // get the .xx data
	{
		return (unsigned char) ((channel8 - ((unsigned char) channel8)) * 100);
	}
	else // get the xx. data (comma)
	{	
		return (unsigned char)channel8;
	}
}	

Willy, Marco heeft het al uitgelegd. Een goede (complete) printf kost zo'n 64k aan code. Hoeveel had je PIC ook al weer?

Vroeger kon je onder Linux door zelf geen libraries te gebruiken een binary van onder de 8k maken. Ik zie dat dat niet meer kan. Hij wordt 570kb. Zucht.

Ik ben ervan bewust dat een complete printf veel geheugen kost. Maar ik verwacht wanneer een functie niet geimplementeerd wordt, je een compiler foutmelding krijgt.

En dit is niet het geval. Bij gebruik sprintf("%f") krijg ik een neg. getal eruit. Wat zou staan voor een mislukte conversie (staat in de sprintf uitleg.)

Anyway, het is goed zo. Krijg nu prima me data :) dank!

Die compiler moet redelijk 'sophisticated' zijn om dat te kunnen. Een printf is een variable parameter function waarbij ook het type nog eens niet vastgelegd is. De compiler heeft dus niet de beschikking over de normale mechanismen om zoiets te controleren. Niet leuk, maar het gevolg van de manier waarop printf geïmplementeerd is (en ik heb geen suggestie voor een betere implentatie).
De linker klust de printf uit de runtime library aan de calls. Jij bepaalt welke printf dat is. Compilatie is al lang en breed gedaan op dat punt (en de compiler kan daar dus ook niet meer over zeuren). Aangezien het niet tot de taken van de linker behoort om dit soort checks te doen, gaat ook dat dus niet gebeuren.

Enige oplossing zou zijn dat de compiler kennis heeft van je runtime lib (waarbij je je heel ernstig af moet vragen of je dat zou moeten willen) en de linker settings moet interpreteren om te bepalen wat er mee gelinkt wordt. Dan zou je er op kunnen checken. Het is echter redelijk 'houtje-touwtje'.

Overigens is printf wel degelijk geïmplementeerd (anders had je die foutmelding ook wel gekregen). De gewenste functionaliteit wordt bepaald door de parameters, de aanwezige functionaliteit door de versie van printf die je mee linkt.