Tôi đang viết một hàm trên vi điều khiển 32-bit vỏ m4. Chức năng này phải có khả năng nhân các ma trận với các kích cỡ khác nhau mà tôi không thể dự đoán được. Vì vậy, tôi đã sử dụng một malloc ...vi điều khiển không thành công tại malloc
Nhưng tôi không hiểu tại sao mc tôi luôn luôn đi vào xử lý ngắt mặc định khi nó thực hiện dòng sau:
double *output2=NULL;
output2 = malloc(3 *1* sizeof(double *));
Đây có phải là mc không thể xử lý này loại hoạt động? Trong khi điều này hoạt động hoàn toàn tốt trên máy tính xách tay của tôi!
** EDIT *
đây bởi một số mã khác (mà vẫn cần phải được sửa đổi ...): Vâng tất cả malocs bất cứ nơi nào thất bại. Tôi không thể chỉ định bất kỳ giá trị nào cho mảng "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);
}
có thể anh ta không hỗ trợ dấu chấm động? – Zelldon
Cách tốt nhất để tách biệt vấn đề dấu chấm động như @Zelldon gợi ý. Điều gì sẽ xảy ra nếu bạn malloc (20) vào một int *? –
Bạn có chắc chắn 100% đó là cuộc gọi malloc thất bại, và không phải một số mã sau nó?Afaik bạn nên phân bổ '3 * sizeof (double)' (ít nhất nếu tôi hiểu nó đúng - mã của bạn rất khó đọc do cách bạn sử dụng dấu cách) - đó có thể gấp đôi số byte là '3 * sizeof (double *) 'để bạn có thể truy cập dữ liệu giới hạn ở đâu đó – stijn