Sida 21 av 70
Re: Matrisberäkningar med för STM32?
Postat: 22 januari 2019, 12:27:05
av ahlsten
Ursäkta om jag var otydlig, med de menade jag inte Al_Bundy utan de som undrade om han även kompilerat med -Wall.
Re: Matrisberäkningar med för STM32?
Postat: 22 januari 2019, 12:30:11
av snigelen
Ok. (Det var snarare jag som läste slarvigt).
Re: Matrisberäkningar med för STM32?
Postat: 22 januari 2019, 12:33:07
av Al_Bundy
ahlsten skrev:Jag skulle gissa att de inte testat att kompilera projektet. De försöker bara visa hur du kan slå på ficklampan för att se hur det egentligen ligger till med koden, C är ett väldigt flexibelt språk så C-kompilatorer har en tradition av att släppa igenom allt som är grammatiskt korrekt utan ett knyst om man inte slår på olika nivåer av syftningsfelsvarningar. Det går utmärkt att använda en tilldelning istället för ett likheltstest i en if-sats eftersom det ibland är efterfrågansvärt men -Wall i gcc varnar för sånt. Sen är det såklart inte alls säkert att det finns ett enda sådant eller liknande fel i ditt projekt men det är förhoppningsvis av välvilja som de envisas med dig.
Tillägg: Nu använder du Eclipse, och lite beroende på vilket paket du använder för att koda C så varnar det ju redan när man redigerar koden för många sådana tankevurpor.
Japp! Eclipse skriker till direkt vid minsta lilla fel.
Re: Matrisberäkningar med för STM32?
Postat: 22 januari 2019, 12:35:47
av Al_Bundy
snigelen skrev:> Jag skulle gissa att de inte testat att kompilera projektet.
Varför gissa det? Han säger ju att han kompilerar utan fel. Brukar du skriva 2000+ rader kod utan att kompilera?
Jag kan bekräfta att Al's kod går utmärkt att kompilera, utan varningar (med -Wall). (Bara man fixar det triviala skrivfelet i freeMatrix. (byt m = NULL till a = NULL).
Orsaken varför det blev så har med att freeMatrix.c hade argumentet matrix* m, medan alla andra .c filer har argumentet matrix* a. Därför gjorde jag en liten manuell redigering, men missade att m ska vara a.
Jag lägger upp den korrigerade versionen
Det skulle vara ganska kul om något testade biblioteket för att kolla efter om buggar finns. Skulle vara uppskattat

Re: Matrisberäkningar med för STM32?
Postat: 22 januari 2019, 13:03:11
av Mr Andersson
Jag blir alltid lika förvirrad när jag läser den här tråden. Först ber du om synpunkter, sen när du får det viftar du bort dem som avundsjuka.
Koden fungerar. Bra organisering och kommentering. Bra jobbat.

Du överanvänder malloc/free och kopieringar. Man skulle kunna ta bort minst 50% av dem. T.ex.
Kod: Markera allt
// Reset the minor matrix and jump back to cell position 0
t = zeros(n-1, n-1);
copyval(t, minor);
freeMatrix(t);
Du allokerar en ny matris, sätter varje element till 0, kopierar matrisen, och tar bort temporären. Istället för att bara använda memset direkt på
minor.
Det finns många fler ställen där du använder heap-minne för temporärer där stack-minne skulle passa bättre.
Du verkar inte ha koll på att malloc kan misslyckas. Du kollar aldrig returvärdet.
Re: Matrisberäkningar med för STM32?
Postat: 22 januari 2019, 13:04:12
av sodjan
Märklig diskussion...
Al fick ett förslag om att även kompilera med flaggan "-Wall". Inget dumt förslag som sådant (eller?).
Al svarade med att han inte vet hur han gör det, även fast han redan har lagt till flaggan "-lm".
Om Al hade svarat med att han inte tyckte att "-Wall" behövdes så hade det varit en annan sak...
> Jag kan bekräfta att Al's kod går utmärkt att kompilera, utan varningar (med -Wall).
Nej, det gjorde det ju inte, vilket du även själv skrev inom parentes...
Re: Matrisberäkningar med för STM32?
Postat: 22 januari 2019, 13:12:29
av Al_Bundy
Mr Andersson skrev:Jag blir alltid lika förvirrad när jag läser den här tråden. Först ber du om synpunkter, sen när du får det viftar du bort dem som avundsjuka.
Koden fungerar. Bra organisering och kommentering. Bra jobbat.

Du överanvänder malloc/free och kopieringar. Man skulle kunna ta bort minst 50% av dem. T.ex.
Kod: Markera allt
// Reset the minor matrix and jump back to cell position 0
t = zeros(n-1, n-1);
copyval(t, minor);
freeMatrix(t);
Du allokerar en ny matris, sätter varje element till 0, kopierar matrisen, och tar bort temporären. Istället för att bara använda memset direkt på
minor.
Det finns många fler ställen där du använder heap-minne för temporärer där stack-minne skulle passa bättre.
Du verkar inte ha koll på att malloc kan misslyckas. Du kollar aldrig returvärdet.
Hur skulle jag kunna använda memset för att kopiera värderna? Jag gör det i själva initMatrix.c filen. Men då kompierar jag just själva "0.0".
Kod: Markera allt
memset(out->data, 0.0, column * row * sizeof(float));
Detta betyder att jag sätter in 0.0 i alla celler som begynnelsevärde. Du menar att om jag vill kopiera så borde jag göra detta.
Kod: Markera allt
memset(minor->data, 0.0 , column * row * sizeof(float));
Tack! Jag ska finslipa på biblioteket!

Men undra hur det blir om jag använder memset för att kopiera olika värden då?
memset(b->data, a->data , column * row * sizeof(float));
Re: Matrisberäkningar med för STM32?
Postat: 22 januari 2019, 13:50:20
av Mr Andersson
memset sätter hela området till samma värde. Målet var ju att nolla matrisen.
memcpy kopierar.
Re: Matrisberäkningar med för STM32?
Postat: 22 januari 2019, 13:55:49
av Al_Bundy
Jag testade med memcpy, men jag måste ha strulat till det, för jag kopierade även adressen, vilket jag inte ville göra. Endast värdet.
Så jag programmerade bara rakt av, och där efter ska jag optimera koden.
Re: Matrisberäkningar med för STM32?
Postat: 22 januari 2019, 13:57:46
av Icecap
Nja... memset(Lokation, värde, antal_bytes) lägger inte in 0.0 (som i flyttal), den lägger in 0 i varje byte som anges. Att det då råkar passa med att slutvärdet blir 0.0 i float är väl rent tur.
Och det är nog ett litet långsam sätt sätt att göra det på kan jag tro.
Du använder en 32-bitars µC och att anropa en funktion som ställer en buffer BYTE-FÖR-BYTE till noll är långsammare än att göra det samma med 32 bitars värden.
Kod: Markera allt
void Clear_Buffer(void* Target, int Value, size_t Length)
{
int* Ptr;
Length /= sizeof(int);
while(Length)
{
*Target = 0;
Length--;
}
}
Borde vara lite snabbare kan jag tänka mig - och kräva samma input parameter.
Re: Matrisberäkningar med för STM32?
Postat: 22 januari 2019, 14:16:56
av Al_Bundy
Skriv gärna upp era förslag på vad ni tycks kunna göras bättre. Att införa en clearMatrix(matrix* a) vore inte helt dumt. En sådan funktion med en rad kod av memset. Då kan man i praktiken återanvända matriser, istället för att radera och skapa nytt. Sparar många for-loopar här.
Sedan skulle man kicka lite mer på att ersätta copyval(matrix*a, matrix* b) med memcpy(b->data, a->data, storlek på någon av a eller b)
Zeros(int n, int m) kan ju ersättas med initMatrix(int n, int m).
Re: Matrisberäkningar med för STM32?
Postat: 22 januari 2019, 14:24:20
av Mr Andersson
Icecap skrev:Och det är nog ett litet långsam sätt sätt att göra det på kan jag tro.
Du använder en 32-bitars µC och att anropa en funktion som ställer en buffer BYTE-FÖR-BYTE till noll är långsammare än att göra det samma med 32 bitars värden.
Nej memset arbetar inte bytevis. Den och memcpy och några fler är bland de hårdast optimerade funktionerna i standardbiblioteken just pga att de används så ofta.
Re: Matrisberäkningar med för STM32?
Postat: 22 januari 2019, 15:08:36
av Icecap
Hmmmm, definitionen i C är just void *memset(void *str, int c, size_t n) och ja, det måste ju då passa att den stegar i steg om int.
Jag har alltid lärt den som att n är antalet bytes som ska sättas men det är i verkligheten antal int. Den får jag ta med mig inser jag.
Fast i beskrivningen ser jag:
Parameters
str − This is a pointer to the block of memory to fill.
c − This is the value to be set. The value is passed as an int, but the function fills the block of memory using the unsigned char conversion of this value.
n − This is the number of bytes to be set to the value.
Re: Matrisberäkningar med för STM32?
Postat: 22 januari 2019, 15:16:30
av Mr Andersson
Jo det stämmer att det är antal bytes. Värdeargumentet är int men det är bara den lägsta byten som används. memset(..., 0xffffff00, ...) sätter hela området till 0.
Det betyder dock inte att memset jobbar med bytes internt. Se t.ex.
https://android.googlesource.com/platfo ... c/memset.S
Den väljer olika algoritmer beroende på längd och alignment på minnet då olika metoder skalar olika. Men den kommer använda 32-bitars skrivningar så ofta som det går.
Det går att göra speciallösningar som är effektivare om man t.ex. kan garantera att längden alltid är samma, men att göra en generisk funktion som är snabbare är väldigt svårt.
Re: Matrisberäkningar med för STM32?
Postat: 22 januari 2019, 16:19:53
av hummel
Al, har du ditt testprojekt tillgängligt för nedladdning så jag kan testa det i Eclipse?