C: Ta reda på antal element i en array som är > 0

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

C: Ta reda på antal element i en array som är > 0

Inlägg av Magnus_K »

Hej!

Jag har en array som ser ut så här -> unsigned short buffer_send[63];
där unsigned short är 1 byte stor.

Om jag kör sizeof() på arrayen så svarar den med antal element i arrayen men finns det något enkelt sätt att enbart räkna de element som är mer än 0 (>0) ?
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: C: Ta reda på antal element i en array som är > 0

Inlägg av johano »

Förutom det uppenbara att loopa igenom bufferten och kolla varje element för sig - nej.

Kod: Markera allt

int c=0;
for(int i=0;i<sizeof(buffer_send);i++)
  if(buffer_send[i]) c++;
/j
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: C: Ta reda på antal element i en array som är > 0

Inlägg av Magnus_K »

Hmm, ja det var ju synd.
Tycker det är lite klurigt när man håller på med "stora" arrayen, det blir ett himla loopande hela tiden. Det kanske är vanligt även för er?

Ps. Lite roligt när du skriver ett sånt inlägg johano. Den där kodsnutten tar mig lång tid att få ihop och du verkar skriva den från huvet :D Ds
Användarvisningsbild
Jan Almqvist
Inlägg: 1580
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: C: Ta reda på antal element i en array som är > 0

Inlägg av Jan Almqvist »

Alternativt kan du ju ha en egen variabel som anger hur många av tecknen i din buffert som ska sändas. En fördel med en sådan lösning är att den fungerar för alla värden på det som finns i bufferten. Rätt vad det är uppstår behovet av att kunna skicka NUL.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: C: Ta reda på antal element i en array som är > 0

Inlägg av johano »

Tja, har ju jobbat aktivt med programmering i +25 år så lite har väl satt sig :-)
Det finns liksom inga genvägar, antingen gör du loopen själv eller använder någon smart funktion som gör den åt dig :-)

/j
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: C: Ta reda på antal element i en array som är > 0

Inlägg av Magnus_K »

Ok, då förstår jag.
Hehe, 25 års erfarenhet med programmering. Jäklar i havet :)

@Jan Almqvist:
På en del andra ställen i koden så håller jag reda på "vart jag är" i arrayen men just den här frågan uppkom då jag vill skriva 0 till samtliga element som inte är det.
Tänkte spara lite tid om då tex endast dom 2 första elementen var > 0 så behövde jag inte loopa igenom hela. Men det är nog bäst att göra det ändå. Vill absolut inte ha några falska bitar inför en ny skrivning.

Tackar för svaren!
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: C: Ta reda på antal element i en array som är > 0

Inlägg av johano »

Om du bara vill "nolla" ut alla element i arrayen finns enklare sätt:

Kod: Markera allt

memset(buffer_send, 0, sizeof(buffer_send));
Fast, oss emellan, den använder också internt en loop :-)

/j
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: C: Ta reda på antal element i en array som är > 0

Inlägg av Magnus_K »

Ja men det ser väldigt snyggt ut jämfört med mina for-loopar. Det kör vi på. Tack!
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: C: Ta reda på antal element i en array som är > 0

Inlägg av Icecap »

Det tar längre tid att kolla om ett element är icke-noll och sedan nolla det än att bara nolla rubbet.
Användarvisningsbild
adent
Inlägg: 4094
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: C: Ta reda på antal element i en array som är > 0

Inlägg av adent »

Tänkte bara påpeka att en unsigned short inte är 1 byte. Den är minst två bytes beroende på processor, men inte mindre än 2.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: C: Ta reda på antal element i en array som är > 0

Inlägg av Magnus_K »

Så här säger MikroC Pro for PIC:s hjälp:

Kod: Markera allt

Type                      Size in bytes     Range 
unsigned short (int)      1                 0 .. 255  
Användarvisningsbild
adent
Inlägg: 4094
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: C: Ta reda på antal element i en array som är > 0

Inlägg av adent »

Minsann! Men din andra tråd verkar eventuellt motbevisa det :)

C-standarden säger iaf minst 16 bitar:

https://en.wikipedia.org/wiki/C_data_types
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43148
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: C: Ta reda på antal element i en array som är > 0

Inlägg av sodjan »

Som referens kan noteras att XC8 anger:

Kod: Markera allt

signed char     8 Signed integer
unsigned char   8 Unsigned integer
signed short   16 Signed integer
unsigned short 16 Unsigned integer
Om det finns en "unsigned char" i MikroC så kan den vara
bättre med tanke på eventuell portning senare till XC8.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: C: Ta reda på antal element i en array som är > 0

Inlägg av Magnus_K »

Det här blev tokigt. Nu handlar båda trådarna om samma sak.

Svarar i den andra tråden (Vad är det som äter RAM), då den här diskussionen inte riktigt har med det här ämnet att göra.
hummel
Inlägg: 2259
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

Re: C: Ta reda på antal element i en array som är > 0

Inlägg av hummel »

Varibellängden beror på vilken C-version du väljer.

I K&R (det är ålderstiget men används ibland) så är en short int <= int så där kan det vara 8 bitar eller 16 eller 32. :-)

Bäst är att göra sina portabla varibeltyper som INT8, INT16 osv så kan man enkelt porta koden mellan olika hårdvara och kompilatorer. Aldrig använda sig C-typer som int, char osv.
Skriv svar