C 浮点打印为NaN,但随后立即打印正确的值
根据我在代码中打印浮点数的位置,浮点数被打印为NaN时,我遇到了一些奇怪的问题。在上下文中,代码使用BST对地震数据列表进行排序,然后循环排序后的数据以查找两个连续地震之间的最大间隔。这两次地震在这里打印出来:C 浮点打印为NaN,但随后立即打印正确的值,c,printing,nan,C,Printing,Nan,根据我在代码中打印浮点数的位置,浮点数被打印为NaN时,我遇到了一些奇怪的问题。在上下文中,代码使用BST对地震数据列表进行排序,然后循环排序后的数据以查找两个连续地震之间的最大间隔。这两次地震在这里打印出来: FILE* output_file = safe_open_file("task_1_bst.csv", "w"); fprintf(output_file, "timestamp,latitude,longitude,magnitude\n"); eq_print(output_fil
FILE* output_file = safe_open_file("task_1_bst.csv", "w");
fprintf(output_file, "timestamp,latitude,longitude,magnitude\n");
eq_print(output_file, sorted_arr[longest_index-1]);
fprintf(output_file, "\n");
eq_print(output_file, sorted_arr[longest_index-1]);
fprintf(output_file, "\n");
eq_print(output_file, sorted_arr[longest_index]);
fclose(output_file);
如你所见,我将其中一个地震打印了两次,结果如下:
timestamp,latitude,longitude,magnitude
2009-06-13T06:02:52.500Z,nan,-115.392,3.4
2009-06-13T06:02:52.500Z,31.315,-115.392,3.4
2009-06-13T16:04:06.650Z,3.930,126.648,4.4
由于某些原因,第一个EQ的纬度在第一次打印时为nan,但第二次打印时正确
有相当多的代码,所以我不能在这里全部包含。排序数组中充满了指向eq类型的指针
typedef struct {
timestamp_t* timestamp;
float latitude;
float longitude;
float magnitude;
float x;
float y;
} eq_t;
timestamp_t只是一个整数结构(年、月、日、小时等),eq_print只是fprintf的包装,它打印eq_t和timestamp_t的每个字段
void eq_print(FILE* fp, eq_t* q)
{
fprintf(fp, "%d-%02d-%02dT%02d:%02d:%02d.%03dZ,%.3f,%.3f,%.1f",
q->timestamp->year,
q->timestamp->month,
q->timestamp->day,
q->timestamp->hour,
q->timestamp->min,
q->timestamp->sec,
q->timestamp->msec,
q->latitude,
q->longitude,
q->magnitude);
}
eq_print根本不修改eq_t,因此,当两个fprintf之间没有代码时,为什么打印值不同
是什么原因导致浮点具有NaN值,然后在具有正确值后立即出现
编辑:使用GDB单步遍历这些行,并在每行打印纬度,以打印正确的值
Breakpoint 1, task_1_find_longest_break_after_2k_bst (
eq_csv_file=0x28cc87 "eq_data.csv") at tasks.c:128
128 FILE* output_file = safe_open_file("task_1_bst.csv", "w");
(gdb) warning: cYgFFFFFFFF 611B75D0 0
warning: cYgstd 0x28cbdf d 3
print sorted_arr[longest_index-1]->latitude
$1 = 31.3150005
(gdb) next
129 fprintf(output_file, "timestamp,latitude,longitude,magnitude\n");
(gdb) print sorted_arr[longest_index-1]->latitude
$2 = 31.3150005
(gdb) next
130 eq_print(output_file, sorted_arr[longest_index-1]);
(gdb) print sorted_arr[longest_index-1]->latitude
$3 = 31.3150005
(gdb) next
131 fprintf(output_file, "\n");
(gdb) print sorted_arr[longest_index-1]->latitude
$4 = 31.3150005
(gdb) next
132 eq_print(output_file, sorted_arr[longest_index-1]);
(gdb) print sorted_arr[longest_index-1]->latitude
$5 = 31.3150005
有一个警告,我不知道如何解释
eq_t q分配有此功能
eq_t* read_quake(FILE* fp)
{
char buf[1024];
float latitude, longitude, magnitude;
if (fscanf(fp, "%[^,],%f,%f,%f\n", buf, &latitude, &longitude, &magnitude) == 4) {
eq_t* eq = (eq_t*)safe_malloc(sizeof(eq_t));
eq->timestamp = parse_time(buf);
eq->latitude = latitude;
eq->longitude = longitude;
eq->magnitude = magnitude;
map_coordinates(eq);
return eq;
}
return NULL;
}
这里没有任何问题。这似乎是一个打印问题。这里是作为MCVE()复制的代码 当事情发生意外变化时,通常意味着内存管理有问题,并且通常意味着在某个地方返回了一个局部变量。不过,在第二次打印操作中,错误“自行修复”,这有点出乎意料
你需要建立一个类似于我展示的MCVE,它实际上执行读取、内存分配等操作,但仍然会遇到问题。你应该考虑运行下面的代码,看看它是否能发现内存滥用。< / P>无法根据你提供的信息来判断。寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。请参阅:。基本上,如何填充
q->
成员很重要。在写入文件之前,是否可以使用调试器检查数组中的值?通过这种方式,至少您能够确定问题是在文件写入还是在数据方面。程序是否也是多线程的?@taskino或调试器在单步执行fprintf行时打印正确的值,但仍然打印不正确的数据。将gdb输出添加到post。
#include <math.h> /* NAN */
#include <stdio.h>
/*
timestamp,latitude,longitude,magnitude
2009-06-13T06:02:52.500Z,nan,-115.392,3.4
2009-06-13T06:02:52.500Z,31.315,-115.392,3.4
2009-06-13T16:04:06.650Z,3.930,126.648,4.4
*/
typedef struct timestamp_t
{
int year;
int month;
int day;
int hour;
int min;
int sec;
int msec;
} timestamp_t;
typedef struct
{
timestamp_t* timestamp;
float latitude;
float longitude;
float magnitude; // x, y unused so removed
} eq_t;
static timestamp_t times[] =
{
{ 2009, 6, 13, 6, 2, 52, 500 },
{ 2009, 6, 13, 16, 4, 6, 650 },
};
static eq_t quakes[] =
{
{ ×[0], NAN, -115.392F, 3.4F },
{ ×[1], +3.930F, +126.648F, 4.4F },
};
static eq_t *sorted_arr[] = { &quakes[0], &quakes[1] };
static void eq_print(FILE* fp, eq_t* q)
{
fprintf(fp, "%d-%02d-%02dT%02d:%02d:%02d.%03dZ,%.3f,%.3f,%.1f",
q->timestamp->year,
q->timestamp->month,
q->timestamp->day,
q->timestamp->hour,
q->timestamp->min,
q->timestamp->sec,
q->timestamp->msec,
q->latitude,
q->longitude,
q->magnitude);
}
int main(void)
{
int longest_index = 1;
FILE *output_file = stdout;
fprintf(output_file, "timestamp,latitude,longitude,magnitude\n");
eq_print(output_file, sorted_arr[longest_index-1]);
fprintf(output_file, "\n");
eq_print(output_file, sorted_arr[longest_index-1]);
fprintf(output_file, "\n");
eq_print(output_file, sorted_arr[longest_index]);
fprintf(output_file, "\n");
fclose(output_file);
return 0;
}
$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes \
-Wold-style-definition nan11.c -o nan11
$ ./nan11
timestamp,latitude,longitude,magnitude
2009-06-13T06:02:52.500Z,nan,-115.392,3.4
2009-06-13T06:02:52.500Z,nan,-115.392,3.4
2009-06-13T16:04:06.650Z,3.930,126.648,4.4
$