Piszę funkcję na 32-bitowym mikrokontrolerze cortex m4. Funkcja musi być w stanie rozmnażać macierze o różnych rozmiarach, których nie mogę przewidzieć. Więc muszę użyć malloc ...mikrokontroler kończy się niepowodzeniem w malloc
Ale nie rozumiem, dlaczego mój mc zawsze idzie w domyślnej procedury obsługi przerwania, gdy wykonuje następującą linię:
double *output2=NULL;
output2 = malloc(3 *1* sizeof(double *));
Czy to nie mc w stanie obsłużyć tego rodzaj operacji? Chociaż działa to doskonale na moim laptopie!
** EDIT *
tu trochę więcej kodu (który musi jeszcze zostać zmodyfikowany ...): Dobrze wszystkie malocs nigdzie nie powiedzie. Nie mogę przypisać żadnej wartości do tablicy "malloced".
int main (void)
{
/*some stuff*/
float transFRotMatrix[3][3]={0}; //array gets modified by other functions
float sunMeasurements[3][1] = {{1},{2},{3}}; //test values
multiplyMatrices(&transFRotMatrix[0][0],3, 3, &sunMeasurements[0][0], 3, 1, *orbitalSunVector);
/*some stuff*/
}
void multiplyMatrices(float *transposedMatrix, int height1, int width1, float *iSunVector,int height2, int width2, float *orbitalSunVector)
{
int y=0;
int x = 0;
int row=0;
int column =0;
int k=0;
int k2 = 0;
float result = 0;
int i=0;
int j=0;
int t=0;
float rotationMatrix[3][3]={0};
i=0;
k=0;
k2 = 0;
if(width1 != height2)
{
printf("unmatching matrices, error.\n\n");
return;
}
float *output2;
output2 = malloc(3 *1* sizeof(float *)); //<-----ERROR
while(k<width1) //aantal rijen 1ste matrix
{
for(j=0;j<height2;j++) //aantal rijen 2de matrix
{
result += (*((transposedMatrix+k*width1)+j)) * (*((iSunVector+j*width2)+k2)); //1ste var:aantal kolommen 2de matrix --2de variabele na de plus = aantal kolommen 2de matrix
//printf("%f * %f\t + ", (*((transposedMatrix+k*width1)+j)), (*((iSunVector+j*width2)+k2)));
}
output2[k*3 +k2] = result; //<-----FAILS HERE
k2++;
x++;
column++;
if(x==width2)
{
k2=0;
x=0;
column=0;
row++;
y++;
k++;
}
result = 0;
}
for(i=0;i<height1;i++)
{
for(j=0;j<width2;j++)
{
orbitalSunVector[j * height1 + i] = output2[i*3 +j];
}
}
free(output2);
}
Może on nie obsługuje zmiennoprzecinkowej? – Zelldon
Najlepiej odizolować problem zmiennoprzecinkowych, jak sugeruje @Zelldon. Co się stanie, jeśli zdarzy ci się malloc (20) w int *? –
Czy jesteś w 100% pewien, że wywołanie funkcji malloc nie działa, a nie jakiś kod po tym?Afaik powinieneś przydzielać '3 * sizeof (double)' (przynajmniej jeśli rozumiem to poprawnie - twój kod jest bardzo trudny do odczytania ze względu na sposób używania spacji) - to prawdopodobnie dwa razy więcej bajtów niż '3 * sizeof (double *) ', więc możesz uzyskać dostęp do danych poza granicami gdzieś – stijn