Sida 1 av 1

Ännu en fråga om lätt-/svårläst C-kod

Postat: 06 sep 2012, 17:39
av Johnny Rosenberg
Håller på och leker lite med libsndfile, ett bibliotek för läsning och skrivning av ljudfiler. De funktioner som finns för att läsa ljudfiler lägger ljuddatat i minnet på följande sätt (kallar variabeln i detta exempel för just ”Ljuddata” och exemplet förutsätter vanligt stereoljud):

Kod: Markera allt

ljuddata[0]=Sampel 1, kanal 1
Ljuddata[1]=Sampel 1, kanal 2
Ljuddata[2]=Sampel 2, kanal 1
Ljuddata[3]=Sampel 2, kanal 2
och så vidare. 
Själv hade jag nog helst velat ha en tvådimensionell matris:
ljuddata[Kanal][Sampel]
Eller någon struct, kanske.

Men nu är det en dimension som gäller.
Så för att fippla med sina ljuddata kan man exempelvis ha en for-loop inuti en annan:

Kod: Markera allt

for(i=0;i<LastValue;i+=Channels){ // Variabeln Channels innehåller antalet kanaler
	for(Ch=0;Ch<Channels;Ch++){
		Ljuddata[i+Ch]=Something;
	}
}
Tyckte inte detta såg så begripligt ut som man kunde önska, så jag tänkte att man borde kunna skriva så här istället:

Kod: Markera allt

for(i=0;i<LastValue;){
	for(Ch=0;Ch<Channels;Ch++,i++){
		Ljuddata[i]=Something;
	}
}
Bara funderar på vilka nackdelar man skulle kunna råka på med detta skrivsätt. Tycker i alla fall att jag har fler invändningar mot första skrivsättet än mot andra. Förmodligen kan det ena vara mer rätt än det andra i vissa situationer och tvärt om i andra. Vill bara höra lite åsikter.

Re: Ännu en fråga om lätt-/svårläst C-kod

Postat: 06 sep 2012, 19:45
av ubot

Kod: Markera allt

for(i=0;i<LastValue;){
   for(Ch=0;Ch<Channels;Ch++,i++){
      Ljuddata[i]=Something;
   }
}
Fungerar detta ö.h.t.? Jag trodde en for-sats behövde ha typ for(start-värde, villkor, ändring). Går det att ha for(i=0;i<LastValue;) och for(Ch=0;Ch<Channels;Ch++,i++) ? Blir det inte syntax-error? Eller i++ kan säkert utelämnas i for(i=0;i<LastValue;) men kan det verkligen läggas till sist i for(Ch=0;Ch<Channels;Ch++,i++) ?

Re: Ännu en fråga om lätt-/svårläst C-kod

Postat: 06 sep 2012, 21:06
av Johnny Rosenberg
ubot skrev:

Kod: Markera allt

for(i=0;i<LastValue;){
   for(Ch=0;Ch<Channels;Ch++,i++){
      Ljuddata[i]=Something;
   }
}
Fungerar detta ö.h.t.? Jag trodde en for-sats behövde ha typ for(start-värde, villkor, ändring). Går det att ha for(i=0;i<LastValue;) och for(Ch=0;Ch<Channels;Ch++,i++) ? Blir det inte syntax-error? Eller i++ kan säkert utelämnas i for(i=0;i<LastValue;) men kan det verkligen läggas till sist i for(Ch=0;Ch<Channels;Ch++,i++) ?
Ska erkänna att jag inte testat, för jag tog det för givet. Har sett liknande exempel tidigare, men kanske inte exakt så här…

Ska experimentera lite med det innan jag återkommer…

Re: Ännu en fråga om lätt-/svårläst C-kod

Postat: 06 sep 2012, 21:19
av Johnny Rosenberg
Har testat lite nu.

Kod: Markera allt

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
//	int i,j,count;
//	
//	count=4;
//	for(i=0; i<5*count; i+=count){
//		for(j=0; j<count; j++){
//			printf("i+j=%d\n", i+j);
//		}
//	}
//	return 0;
	int i,j,count;
	
	count=4;
	for(i=0; i<5*count;){
		for(j=0; j<count; j++, i++){
			printf("i+j=%d\n", i);
		}
	}
	return 0;
}
Vare sig man kommenterar övre eller nedre halvan av koden kommer resultatet att bli detsamma, så det verkar fungera som jag har tänkt. I just detta fallet är det dock kanske inte så pedagogiskt med printf("i+j=%d\n", i);, i och för sig.

Re: Ännu en fråga om lätt-/svårläst C-kod

Postat: 06 sep 2012, 22:28
av ubot
Okej. Det är bra att veta. Man lär sig något nytt varje dag.

Re: Ännu en fråga om lätt-/svårläst C-kod

Postat: 10 sep 2012, 07:26
av Konservburk
ubot skrev:

Kod: Markera allt

for(i=0;i<LastValue;){
   for(Ch=0;Ch<Channels;Ch++,i++){
      Ljuddata[i]=Something;
   }
}
Fungerar detta ö.h.t.? Jag trodde en for-sats behövde ha typ for(start-värde, villkor, ändring). Går det att ha for(i=0;i<LastValue;) och for(Ch=0;Ch<Channels;Ch++,i++) ? Blir det inte syntax-error? Eller i++ kan säkert utelämnas i for(i=0;i<LastValue;) men kan det verkligen läggas till sist i for(Ch=0;Ch<Channels;Ch++,i++) ?
Det är inte nödvändigtvis for(startvärde; villkor; ändring), även om det är så for-loopen oftast brukar användas. Egentligen är det for(gör något en gång innan loopen; gör något i början av varje varv och returvärdet avgör om loopen ska avslutas; gör något i slutet av varje varv). Om du inte vill göra något så går det bra att lämna tomt. Det går faktiskt att lämna alla tomma, vilket kan användas för att få en oändlig loop: for(;;). Om du vill göra flera saker på varje ställe så kan du använda komma-operatorn.

Här har du två for-loopar som gör samma sak:

/* Alternativ A */
for(a,b;c,d;e,f){
g;
}


/* Alternativ B */
{
a;
b;
for(;;){
c;
if(!d) break;
g;
e;
f;
}
}

Re: Ännu en fråga om lätt-/svårläst C-kod

Postat: 10 sep 2012, 18:58
av Konservburk
Johnny Rosenberg skrev:Men nu är det en dimension som gäller.
Så för att fippla med sina ljuddata kan man exempelvis ha en for-loop inuti en annan:

Kod: Markera allt

for(i=0;i<LastValue;i+=Channels){ // Variabeln Channels innehåller antalet kanaler
	for(Ch=0;Ch<Channels;Ch++){
		Ljuddata[i+Ch]=Something;
	}
}
Tyckte inte detta såg så begripligt ut som man kunde önska, så jag tänkte att man borde kunna skriva så här istället:

Kod: Markera allt

for(i=0;i<LastValue;){
	for(Ch=0;Ch<Channels;Ch++,i++){
		Ljuddata[i]=Something;
	}
}
Bara funderar på vilka nackdelar man skulle kunna råka på med detta skrivsätt. Tycker i alla fall att jag har fler invändningar mot första skrivsättet än mot andra. Förmodligen kan det ena vara mer rätt än det andra i vissa situationer och tvärt om i andra. Vill bara höra lite åsikter.
Glömde ju svara på den egentliga frågan.

Först har vi alternativ A som du tyckte var otydligt:

Kod: Markera allt

for (i=0;i<samples*channels;i+=channels){
   for (j=0;j<channels;j++){
      printf("sample:%d\n",i/channels);
      printf("channel:%d\n",j);
      printf("index:%d\n",i+j);
   }
}
Sen har vi alternativ B som du föreslog:

Kod: Markera allt

for (i=0;i<samples*channels;){
   for(j=0;j<channels;j++,i++){
      printf("sample:%d\n",i/channels);
      printf("channel:%d\n",j);
      printf("index:%d\n",i);
   }
}
Och så alternativ C som jag tycker blir tydligare:

Kod: Markera allt

for(i=0;i<samples;i++){
   for(j=0;j<channels;j++){
      printf("sample:%d\n",i);
      printf("channel:%d\n",j);
      printf("index:%d\n",i*channels+j);
   }
}
Och slutligen alternativ D som jag tycker blir ännu tydligare i det här fallet:

Kod: Markera allt

for(i=0;i<samples*channels;i++){
   printf("sample:%d\n",i/channels);
   printf("channel:%d\n",i%channels);
   printf("index:%d\n",i);
}
Nackdelen med alternativ B är att loop-variabeln i den yttre loopen inte är samma hela varvet, vilket kan göra det hela mer svårunderhållet när loopen växer sig större.

Re: Ännu en fråga om lätt-/svårläst C-kod

Postat: 12 sep 2012, 06:34
av Johnny Rosenberg
Okej, det är ju inte helt lätt detta. Antar att alla inte är överens om vad som är bra och dåligt heller, så det gäller väl själv att försöka väga för- och nackdelar så gott man kan. Funderar man för länge dock, så riskerar man kanske att inte få något gjort…

Tack för alla svar!