Matrisberäkningar med för STM32?
Re: Matrisberäkningar med för STM32?
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?
Japp! Eclipse skriker till direkt vid minsta lilla fel.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.
Re: Matrisberäkningar med för STM32?
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.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).

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

Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
-
- Inlägg: 1407
- Blev medlem: 29 januari 2011, 21:06:30
- Ort: Lapplandet
Re: Matrisberäkningar med för STM32?
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.
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.
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);
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.
Senast redigerad av Mr Andersson 22 januari 2019, 13:06:14, redigerad totalt 1 gång.
Re: Matrisberäkningar med för STM32?
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...
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?
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".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.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.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);
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.
Kod: Markera allt
memset(out->data, 0.0, column * row * sizeof(float));
Kod: Markera allt
memset(minor->data, 0.0 , column * row * sizeof(float));

memset(b->data, a->data , column * row * sizeof(float));
-
- Inlägg: 1407
- Blev medlem: 29 januari 2011, 21:06:30
- Ort: Lapplandet
Re: Matrisberäkningar med för STM32?
memset sätter hela området till samma värde. Målet var ju att nolla matrisen.
memcpy kopierar.
memcpy kopierar.
Re: Matrisberäkningar med för STM32?
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.
Så jag programmerade bara rakt av, och där efter ska jag optimera koden.
Re: Matrisberäkningar med för STM32?
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.
Borde vara lite snabbare kan jag tänka mig - och kräva samma input parameter.
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--;
}
}
Re: Matrisberäkningar med för STM32?
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).
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).
-
- Inlägg: 1407
- Blev medlem: 29 januari 2011, 21:06:30
- Ort: Lapplandet
Re: Matrisberäkningar med för STM32?
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.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.
Re: Matrisberäkningar med för STM32?
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.
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.
-
- Inlägg: 1407
- Blev medlem: 29 januari 2011, 21:06:30
- Ort: Lapplandet
Re: Matrisberäkningar med för STM32?
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.
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?
Al, har du ditt testprojekt tillgängligt för nedladdning så jag kan testa det i Eclipse?