[C][AVR] eerder werkende char array init werkt niet in andere code

hallo

Om een lcd te vullen stel ik van tevoren 2 regels vast in een 16 deels char array. echter krijg ik errors bij de initialisatie terwijl ik dezelfde code eerder wel succesvol gebruikt heb (in een ander programma).

ik maak zoiets aan:
char naam[16];
int variabele;

...

naam[0] = 'T';
naam[1] = 'e';
naam[2] = 'x';
naam[3] = 't';
naam[4] = variabele;

Errors, wat voor errors? De eerste error is meestal degene die het duidelijkst aangeeft wat er mis is.

Een array van char's en je probeert daar een int in te duwen.

Waarom steek je een int in een char?

edit: te laat :)

[Bericht gewijzigd door plantrekker op (22%)]

die int is een getal van 1 decimaal na berekening.

ik probeer namelijk een waarde te meten (ADC) en die moet op ene lcd komen. na wat rekenen krijg ik een waarde van bijvoorbeeld 20 graden. die deel ik door 10. en dat stop ik in een variabele 'tiental'. daarna neem ik die 20 graden weer een daar trek ik het tiental*10 van af.

een beetje een lompe manier, maar ik kreeg allerlei 'handige functies van internet' niet aan de praat jammer genoeg.

naam[0] = 46; (ascii waarde invoeren) werkt ook niet overigens.

ik krijg steeds een aantal warnings en errors per regel, maar die vond ik heel vaag:

warning: data definition has no type or storage class
warning: type defaults to 'int' in declaration of 'tempregel'
error: conflicting types for 'tempregel'
error: previous definition of 'tempregel' was here
error: invalid initialiser.

hij initialiseerd niet, omdat hij afwijkende types tegekomt. en die previous definition verwijst steeds naar de regel ervoor

wat jij beschrijft is best gebruikelijk, bij FFT ofzo...

je moet "variabele" nog type casten naar een char.

Als je gaat delen om je tiental te maken, kun je beter direct al in een unsigned char zetten.

dat is dat.

Maar misschien nog een opmerking, voor als dit werkt. Kijk eens naar een typedef struct. Dat kan je code een stuk overzichtelijker maken...

Als je een int als 569 wil afdrukken met de '9' na de komma, kan je dat zo doen:


    x = 569;
    printf("%d,%d", x / 10, x % 10);

"x / 10" levert een (integer) deling door 10.
"x % 10" toont wat er rest na die deling.

Geef eens wat meer code, we kunnen niet aangeven wat er fout is in je code als je het niet laat zien.

Ten eerste, een int is meestal 32 en soms 16 bit, eigenlijk nooit 8 bit, terwijl een char nagenoeg altijd 8 bit is. Als je dus een int wilt "converteren" naar twee chars moet je dat met expliciete casts doen

int x = 123;
char lijn[8];

lijn[0]= 'x';
lijn[1]= '=';
lijn[2]= (char)((x/100)%10)+'0';
lijn[3]= (char)((x/ 10)%10)+'0';
lijn[4]= (char)( x     %10)+'0';
lijn[5]='\0';

blijkbaar is tempregel op de verkeerde plek gedeclareerd, zorg dat hij op iedere plek waar hij gebruikt wordt 'bestaat' (scope goed, dus als je hem in één functie gebruikt mag hij in die functie staan, bij meerdere functies moet hij bovenaan in je programma staan (kort door de bocht))

Misschien een rare opmerking, maar werken een aantal stdio functies niet?


#include <stdio.h>

char lijn[9]; //8 karakters en een null terminatie
int x = 123;

sprintf(lijn,"T = %d", x);

Nu heb je dit in die array gezet en kan je het willekeurig wegschrijven naar iets anders.

Als je de printf output naar je LCD hebt kun je ook gewoon printf(...) gebruiken.

[Bericht gewijzigd door elmowww op (30%)]

(s)printf wil je over het algemeen niet gebruiken, nogal veel overhead, en dus 'zinloos' flash gebruik.

Avr-libc heeft ook gewoon de niet-standaard functie itoa.. http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga4…

avr-gcc gebruikt een afgeslankte printf(), zonder ondersteuning voor floats.
Maar itoa, of het stukje code dat roadrunner84 toont, zal ongetwijfeld zuiniger zijn wat geheugengebruik betreft.

even geprobeerd, roadrunner84 zijn idee werkte inderdaad. geen errors meer. alleen wou ik nu gaan simuleren. het programma crashte en werkt niet meer. zowel op mijn laptop (Waar hij eerst crashte) als op mijn desktop (toevallig op dezelfde tijd, maar zonder crash).

steeds een popup met "please browse to the present location for files originally found at c://ardev <en nog meer> "

opnieuw installeren helpt niet. volgens internet is het een fout in avr studio. fijn weer...

De "makkelijkste" oplossing is om een nieuw project te maken en alle bestanden van je oude project aan dit nieuwe project toe te voegen, helaas weet ik geen andere/beter oplossing.

dat hielp ook niet.

grappig dat hij de error alleen gaf zodra ik 'build active config' koos. gewoon compilen bleek geen probleem