Так что в настоящее время я пытаюсь напечатать массив с плавающей точкой (float *), содержащий некоторые неинициализированные значения с плавающей точкой. Каким-то образом в моей консоли отображаются такие значения (используя «% d:% f \ n» в качестве формата):
-0.000000
0.000000
68509253839697691852885035134612406272.000000
0.000000
-0.000000
0.000000
Это не имеет смысла для меня. Как плавание может быть таким длинным?
Кроме того, в очень похожей ситуации, когда я использую sprintf с форматом «% 5.1f» для «toString» матрицы, моя программа прерывается («строка 11: 1294 Прерывание прерывания: 6»):
void mat_print(char * buf, matptr_t mat) {
char numbuf[10] = {0};
strcpy(buf, "");
for(uint32_t y = 0, ystop = mat->h; y < ystop; y++) {
strcat(buf, y == 0? "[ " : "\n[ ");
for(uint32_t x = 0, xstop = mat->w; x < xstop; x++) {
// on x = 2, i get an abort
sprintf(numbuf, "% 5.1f ", mat_get(mat, y, x));
strcat(buf, numbuf);
}
strcat(buf, "]");
}
}
здесь я пытаюсь получить значение из объекта матрицы
struct matrix {
uint32_t h, w;
float * matrix;
};
typedef struct matrix * matptr_t;
с функцией mat_get
inline float mat_get(matptr_t mat, uint32_t y, uint32_t x) {
return mat->matrix [y * mat->w + x];
}
массив указателей с плавающей запятой матрицы указывает на выделенную область рядом с самой матрицей, все это выделяется за один раз:
matptr_t matrix(uint32_t h, uint32_t w) {
// nn_allocator is a function pointer to malloc
matptr_t mat = (matptr_t) nn_allocator(sizeof(struct matrix) + h * w * sizeof(float));
mat->h = h;
mat->w = w;
mat->matrix = (void *)mat + sizeof(struct matrix);
return mat;
}
большие поплавки напечатаны:
// matptr is a pointer to a matrix object
float * values = (matptr)->matrix;
for(uint32_t i = 0, stop = (matptr)->w * (matptr)->h; i < stop; i++, values++) {
printf("%d: %f\n", i, *values);
}
Итак, вопрос: Как можно исправить этот код, чтобы он больше не прерывал мою программу и почему этот float такой длинный?
Заранее спасибо за любую помощь.