c programmerings fråga, skicka en vektor till en funktion..

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sven
Inlägg: 113
Blev medlem: 16 september 2003, 17:47:19

c programmerings fråga, skicka en vektor till en funktion..

Inlägg av sven »

har en fråga; om jag har en vektor som denna
struct char chars[] = {"B"};

och vill skicka tillbaka värdet chars[0] till funktionen writechar(uint16_t b)
hur gör jag då? uppenbarligen så kan jag inte bara skicka det med writechar(chars[0]);?????
Användarvisningsbild
Xyzzy
Inlägg: 1247
Blev medlem: 30 januari 2004, 22:31:07
Ort: Uppsala, Sweden

Inlägg av Xyzzy »

låter som att writechar() vill ha en 16 bitars variabel (om 'uint16' är definerad som det förståss) medan 'chars' är en byte(enligt initieringen) i de flesta fall, dvs 8 bitar.
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

struct har inget där att göra. Och byt ut citattecknena mot enkla sådana ('), eftersom B ska vara en char och ingen sträng. writechar() ska väl ta en uint8_t som argument? En char är ju 8 bitar.

Ex.

char chars[] = {'B', 'r', 'a'}; // En array av chars
writechar(chars[0]); // Anropa writechar() med den första char:en i chars som argument.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Men måste man prångla in en 8bit i en 16bit så gör en cast:
writechars((uint16_t)(chars[0]));

Mvh
speakman
sven
Inlägg: 113
Blev medlem: 16 september 2003, 17:47:19

Inlägg av sven »

efter lite pillande lyckades ja få de att funka... var till ett lokup table till min grafiska lcd föressten..
men nu har ja ett nytt problema, hur deklarerar jag en hel string med bokstäver, char går väll bara att använda till en åt gången??
eller?
Användarvisningsbild
AndLi
Inlägg: 18183
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Inlägg av AndLi »

en sträng deklareras som en array.. För det är ju det en sträng är, en array av tecken..

Alså funkar

Kod: Markera allt

char alongstring[20] = {'A','B','C','D' osv till du har 20 st .'T'};
ger dig en sträng , försöker du skriva ut den med tex printf(" Sträng %s",alongstring); så kommer den dock skriva ut till den stöter på en NULL i minnet.. vilket inte är helt lyckat...
Ska du göra det så sätt alongstring[19]=0;
Ska du bara ha den som en lookup table så behöver du inte fundera på det.. eftersom du vet hur lång den är!
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg av karlstedt »

Man kan lägga '\0' som sista tecken så termineras strängen.
Rymdninja
Inlägg: 330
Blev medlem: 15 december 2003, 13:41:25
Ort: Göteborg

Inlägg av Rymdninja »

ännu lite enklare kan man skriva
char strang[] = "strang\0";

så slipper man ange exakt längd och sånt...eh..jobbigt ;)
Användarvisningsbild
Melker
Inlägg: 410
Blev medlem: 26 maj 2003, 22:17:34
Ort: Umeå

Inlägg av Melker »

en sträng deklarerad "så här" får väl ändå en nolla som sista tecken, utan att behöva skriva \0 !?
henkebenke
Inlägg: 515
Blev medlem: 31 maj 2003, 10:42:37
Ort: Helsingborg

Inlägg av henkebenke »

En sträng ("sträng") är alltid null-terminerad. En char-array ({'s', 't', 'r', 'ä', 'n', 'g'}) får man hålla koll på själv. Den enda skillnaden är just att en sträng alltid deklareras "" och därmed automatiskt nulltermineras.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Om man inte har för behov att ändra i strängen (vilket du inte kan göra med ovan kod heller), så brukar iaf jag använda mig av #defines istället.

Kod: Markera allt

#define OUTTEXT "Tjohejsan"

write(OUTTEXT);
Även här får du automatisk NULL-terminering.

Mvh
speakman
henkebenke
Inlägg: 515
Blev medlem: 31 maj 2003, 10:42:37
Ort: Helsingborg

Inlägg av henkebenke »

Tycker att det är snyggare att const-deklarera i så fall. Åtminstone om man jobbar med mindre system. Annars kan det "försvinna" en massa programminne utan att man deklarerat några variabler.
sven
Inlägg: 113
Blev medlem: 16 september 2003, 17:47:19

Inlägg av sven »

hmm.. får omformulera mig lite, på detta viset är det tänkt att det ska fungera

anropa funktionen writestring("text")
ta ut hur många bokstäver "text" innehåller,
antallet bokstäver sätts in i en for loop som i lopar funtionen writechar så många gånger som det finns bokstäver,

för varje gång loopen körs så skickas nästa bokstav i textstringen iväg till funktionen writechar,

i writechar gämförs boksavens ascii nummer mot en teckentabell gjord för lcdn.

har kommit så långt så jag kan använda funtionen writechar('B')
och få ut "B" på lcdn..
men jag vill som sagt kunna skriva writestring("HELLO") och få ut det på lcdn
Användarvisningsbild
AndLi
Inlägg: 18183
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Inlägg av AndLi »

Kod: Markera allt

void writestring(uint8* indata)
{
  while(*indata)
  {
    writechar(*indata);
    indata++;
  }
}
Edit: Ingen som visa den gamla koden för min chef va?? Nu ska stjärnorna sitta rätt :)
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

henkebenke skrev:Tycker att det är snyggare att const-deklarera i så fall. Åtminstone om man jobbar med mindre system. Annars kan det "försvinna" en massa programminne utan att man deklarerat några variabler.
Vilken kompilator använder du egentligen?! :P

Mvh
speakman
Skriv svar