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

Här diskuteras programmering och utveckling
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

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

Inlägg 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.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

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

Inlägg 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++) ?
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

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

Inlägg 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…
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

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

Inlägg 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.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

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

Inlägg av ubot »

Okej. Det är bra att veta. Man lär sig något nytt varje dag.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

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

Inlägg 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;
}
}
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

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

Inlägg 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.
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

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

Inlägg 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!
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Skriv svar

Återgå till "Programmering och webbdesign"