Nu har jag ju skrivit rätt mycket C-kod som ger användaren friheten att radera en matris när användaren inte använder matrisen längre. När användaren skapar en matris så skapas nytt minne. Men man kan ju skita i och radera matrisen. Den går ju att återanvända.hawkan skrev:Du gör free() på pekaren till minnet. Kräver att minnet är allokerat med malloc().
Annars blir det fel. Att hålla på med malloc/free är inte speciellt effektivt.
Bättre du lägger de på stacken.
Matrisberäkningar med för STM32?
Re: Matrisberäkningar med för STM32?
Re: Matrisberäkningar med för STM32?
Någon som brukar använda sig av matrisberäkningar här? Tänkte bara fråga er vilka matrisfunktioner som ni tycker är viktiga?
För mig så är det viktigt med grundläggande matrishantering + QR, chol, LU, SVD, det, inv, hankel. Men det har med att jag ska ju göra ett bibliotek som är anpassat för regression. Eigenvärden kan jag totalt glömma. Krävs alldeles för mycket för att beräkna Francis QR Shift Step algoritm.
För mig så är det viktigt med grundläggande matrishantering + QR, chol, LU, SVD, det, inv, hankel. Men det har med att jag ska ju göra ett bibliotek som är anpassat för regression. Eigenvärden kan jag totalt glömma. Krävs alldeles för mycket för att beräkna Francis QR Shift Step algoritm.
Re: Matrisberäkningar med för STM32?
Du gör väl inte detta i en uC?? Det är ju i så fall fullständigt vansinnigt.Nu har jag ju skrivit rätt mycket C-kod som ger användaren friheten att radera en matris när användaren inte använder matrisen längre. När användaren skapar en matris så skapas nytt minne. Men man kan ju skita i och radera matrisen. Den går ju att återanvända.
Re: Matrisberäkningar med för STM32?
I ett inbyggt system med realtidskrav ska du inte använda dynamisk minnesallokering.Al_Bundy skrev:Jasså? Så malloc, mmset och free bör ej användas alls?TomasL skrev:Jamen, när du raderat den, så har du ju ingen matris kvar.
Dessutom, dynamisk minnesallokering i inbäddade system är ingen bra grej. Bör undvikas som pesten.
Tycker Mr Andersson beskriver bra hur der fungerar. Vad är det för funktionalitet är det som du saknar i C? Är det bara sockret som nya språk har du saknar?
Re: Matrisberäkningar med för STM32?
Men nu verkar det ju inte vara ett realtidssystem, utan nån form av handhållen matrisräknare, där en användare valfritt skall kunna skapa matriser, eller vad i helsike handlar det om?
Re: Matrisberäkningar med för STM32?
Tyckte Al tidigare i tråden pratade om ett reglersystem så någon form av tid kan nog vara inblandad. Men i den här tråden kan vi inte vara säkra.
Re: Matrisberäkningar med för STM32?
Varför är det vansinnigt att allokera minne?TomasL skrev:Du gör väl inte detta i en uC?? Det är ju i så fall fullständigt vansinnigt.Nu har jag ju skrivit rätt mycket C-kod som ger användaren friheten att radera en matris när användaren inte använder matrisen längre. När användaren skapar en matris så skapas nytt minne. Men man kan ju skita i och radera matrisen. Den går ju att återanvända.
Re: Matrisberäkningar med för STM32?
Är rätt dumt. Eller menar du programmeraren?C-kod som ger användaren friheten att radera en matris när användaren inte använder matrisen längre
Re: Matrisberäkningar med för STM32?
Jag tycker att man borde kunna retunera flera värden samtidigt, utan att använda pekare. Detta skulle vara bra. Och lägg till objektorientering i C!hummel skrev:I ett inbyggt system med realtidskrav ska du inte använda dynamisk minnesallokering.Al_Bundy skrev:Jasså? Så malloc, mmset och free bör ej användas alls?TomasL skrev:Jamen, när du raderat den, så har du ju ingen matris kvar.
Dessutom, dynamisk minnesallokering i inbäddade system är ingen bra grej. Bör undvikas som pesten.
Tycker Mr Andersson beskriver bra hur der fungerar. Vad är det för funktionalitet är det som du saknar i C? Är det bara sockret som nya språk har du saknar?
Sockret?
Re: Matrisberäkningar med för STM32?
Ja, men varför är det dumt? Programmeraren kan skita i att ta bort matriserna och använda dem igen. Jag har bara gjort en funktion som kan radera en matris, om användaren vill det.TomasL skrev:Är rätt dumt. Eller menar du programmeraren?C-kod som ger användaren friheten att radera en matris när användaren inte använder matrisen längre
Om det är dumt att ha dynamisk minne på en uC så litar jag på dig. Jag är nybörjare med C.
Re: Matrisberäkningar med för STM32?
Helt rätt. Det ska vara ett reglersystem som utför matrisberäkningar. Högsta matrisen är 36x36.hummel skrev:Tyckte Al tidigare i tråden pratade om ett reglersystem så någon form av tid kan nog vara inblandad. Men i den här tråden kan vi inte vara säkra.
Re: Matrisberäkningar med för STM32?
Är det programmeraren eller användaren som skall skapa nya matriser?Al_Bundy skrev:Ja, men varför är det dumt? Programmeraren kan skita i att ta bort matriserna och använda dem igen. Jag har bara gjort en funktion som kan radera en matris, om användaren vill det.TomasL skrev:Är rätt dumt. Eller menar du programmeraren?C-kod som ger användaren friheten att radera en matris när användaren inte använder matrisen längre
Om det är dumt att ha dynamisk minne på en uC så litar jag på dig. Jag är nybörjare med C.
Och ja, man använder aldrig någonsin dynamisk allokerat minne i en inbäddad enhet/microkontroller.
Re: Matrisberäkningar med för STM32?
Det är självklart programmeraren som skapar nya matriser. Men vissa funktioner har faktiskt automatiskt borttagning av matriser när man har anropat klart funktionen. Kanske är onödigt?
Jag har alltid för mig att man ska allokera minne i C för att spara på minne. Detta gäller för inbyggda system.
Så här gör jag när jag allokerar minne för en matris.
Och strukturen är
Här är en funktion som skapar en nollmatris.
Hur skulle du göra detta om du använde dig av en 2D array?
Jag har alltid för mig att man ska allokera minne i C för att spara på minne. Detta gäller för inbyggda system.
Så här gör jag när jag allokerar minne för en matris.
Kod: Markera allt
matrix* initMatrix(int row, int column) {
matrix* out = (matrix*) malloc(sizeof(matrix));
out->column = column;
out->row = row;
out->data = (float*) malloc(sizeof(float) * column * row);
memset(out->data, 0.0, column * row * sizeof(float));
return out;
}
Kod: Markera allt
typedef struct _matrix {
int row;
int column;
float* data;
} matrix;
Kod: Markera allt
matrix* zeros(int n, int m) {
matrix* out = initMatrix(n, m);
float* ptr = out->data;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
*(ptr++) = 0.0;
}
}
return out;
}
Re: Matrisberäkningar med för STM32?
Skapa matriserna statiskt, du vet väl alltid hur stora de skall vara.
I ett inbäddat system är dynamisk allokering absolut förbjudet. (Enligt MISRA), vilket är en bra standard att jobba efter.
Jag skulle dessutom aldrig använda float, om inte processorn i fråga har en fullständig FPU (och kompilatorstöd för det).
I ett inbäddat system är dynamisk allokering absolut förbjudet. (Enligt MISRA), vilket är en bra standard att jobba efter.
Jag skulle dessutom aldrig använda float, om inte processorn i fråga har en fullständig FPU (och kompilatorstöd för det).
Re: Matrisberäkningar med för STM32?
Okej! Då får jag helt enkelt skriva om till statiska arrayer. Orsaken varför jag gjorde så här har med att jag kunde inte hitta storleken på matrisen när jag skickade dem över funktionen.
Min uC har stöd för float. Jag vet inte annars vad jag ska använda. Double är ju 64 bit.
Jag testade med detta, men det gick inte.
Min uC har stöd för float. Jag vet inte annars vad jag ska använda. Double är ju 64 bit.
Jag testade med detta, men det gick inte.
Kod: Markera allt
void testFunction(float** arr){
int m = sizeof(arr)/sizeof(arr[0][0]);
printf("Kolumnen är m = %d", m);
}
int main(){
float values[5][5] = { { 2, 3, 1, 0.5, 4 },
{ 4, 5, 7, 0.1, 1 },
{ 5, 3, 6, 19.2, 9 },
{ 1, 4, 1, 4, 7 },
{ 3, 1, 6, 2, 6 } };
testFunction(values);
}