gpt4 book ai didi

c - printf %f 段错误

转载 作者:行者123 更新时间:2023-12-04 10:09:57 25 4
gpt4 key购买 nike

我在函数中有这段代码。我想打印 y 的值在这里。

if (x1 < 0 || y1 < 0) {

// Vertical lign outside of layer
if (dx == 0 && y1 < 0) {
return GKIT_NOERR;
}

float m = dy / dx;
float t = y1 - m * x1;
float x = -t / m;
float y = m * x + t;

printf("Hello %s. You are %f years old.\n", "Niklas", y);
}

但是我遇到了段错误。它与 no 值一起工作以打印为 float 。我可以将其更改为 %d或类似的,效果很好。

    int val = (int) y;
printf("Hello %s. You are %d years old.\n", "Niklas", val);

知道段错误从何而来吗?

编辑:完成函数。

// coding: ascii
// author: Niklas Rosenstein
// e-mail: rosensteinniklas@googlemail.com

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "gkit/defines.h"
#include "gkit/utils.h"
#include "gkit/graphicslayer.h"

#define SWAP_IF_NECCESSARY(x1, y1, x2, y2) \
if (x2 < x1 && y2 < y1) { \
int temp = x2; \
x2 = x1; \
x1 = temp; \
temp = y2; \
y2 = y1; \
y1 = temp; \
}

/* Based on Bresenhams line algorithm. */
int gk_GraphicsLayer_drawLine(gk_GraphicsLayer* layer, gk_Color* color,
int x1, int y1, int x2, int y2,
gk_ColorBlendProc blend, gk_float opacity) {
SWAP_IF_NECCESSARY(x1, y1, x2, y2);

float dx = x2 - x1;
float dy = y2 - y1;
float cx = x1;
float cy = y1;

// Figure out where to start in case x1 or y1 are outside of the layer.
if (x1 < 0 || y1 < 0) {

// Vertical lign outside of layer
if (dx == 0 && y1 < 0) {
return GKIT_NOERR;
}

// The function's slope (m)
// ------------------------
float m = dy / dx;


// Find the y-axis intersection (t)
// -------------------------------
// y = mx + t =>
// y - mx = t

float t = y1 - m * x1;

// Compute the root of the function (N)
// ------------------------------------
// 0 = mx + t =>
// mx = -t =>
// x = -t / m

float x = -t / m;
float y = m * x + t;

printf("Hello %s. You are %f years old.\n", "Niklas", y);
}


int incx = GKIT_SIGNUM(dx);
int incy = GKIT_SIGNUM(dy);
if (dx < 0) { dx = -dx; }
if (dy < 0) { dy = -dy; }

int pdx, pdy;
int ddx, ddy;
int es, el;

ddx = incx;
ddy = incy;

if (dx > dy) {
pdx = incx;
pdy = 0;
es = dy;
el = dx;
}
else {
pdx = 0;
pdy = incy;
es = dx;
el = dy;
}

float err = el / 2.0;

#define SET_PIXEL(x, y) \
do { \
gk_Color* c = GKIT_GRAPHICSLAYER_ACCESSPIXEL(layer, (int)x, (int)y); \
if (blend != Null) { \
gk_Color t = *c; \
blend(color, &t, c, opacity); \
} \
else { \
*c = *color; \
} } while (0)

SET_PIXEL(cx, cy);

int t;
for (t=0; t < el; t++) {
err -= es;
if (err < 0) {
err += el;
cx += ddx;
cy += ddy;
}
else {
cx += pdx;
cy += pdy;
}
SET_PIXEL(cx, cy);
}

#undef SET_PIXEL

return GKIT_NOERR;
}

编辑:完整堆栈跟踪:

#0 0xb7e68cb0   ___printf_fp(fp=0xb7fc3a20, info=0xbffff684, args=0xbffff6f8) (printf_fp.c:844)
#1 0xb7e63ab0 _IO_vfprintf_internal(s=0xb7fc3a20, format=<optimized out>, ap=0xbffff750 "\001") (vfprintf.c:1623)
#2 0xb7e6cc2f __printf(format=0x8049da0 "Hello %s. You are %f years old.\n") (printf.c:35)
#3 0x8049143 gk_GraphicsLayer_drawLine(layer=0x804d008, color=0xbffff810, x1=-20, y1=-10, x2=49, y2=200, blend=0, opacity=0) (/home/niklas/git/c-gkit/gkit/graphicslayer.c:180)
#4 0x8049ba4 test_drawLine() (/home/niklas/git/c-gkit/main.c:46)
#5 0x8049c80 main() (/home/niklas/git/c-gkit/main.c:68)

编辑:请注意printf()将它放在 if 子句之后或之前时,确实起作用。 IE。有点像

    printf("Foo: %f\n", 1.0);
// Figure out where to start in case x1 or y1 are outside of the layer.
if (x1 < 0 || y1 < 0) {

// Vertical lign outside of layer
if (dx == 0 && y1 < 0) {
return GKIT_NOERR;
}

有效,但移动 printf() if 子句中产生段错误。

更新:根据T.E.D.的回答,我进行了一些测试,结果如下:

问题似乎是比较操作的结果(<)。我能行

if (True) { printf("%f", 53.3); }

可是我做不到

if (x1 < 0 || y1 < 0) { printf("%f", 53.3); }
// nor
if (x1 < 0) { printf("%f", 53.3); }
// nor
int x_smaller = x1 < 0;
if (x_smaller) { printf("%f", 53.3); }

有趣的是,这有效:

int x_smaller = x1 < 0;
int y_smaller = y1 < 0;
x_smaller = y_smaller = 1;
if (x_smaller || y_smaller) { printf("%f", 53.3); }

结论:操作的结果 x1 < 0y1 < 0在 if 子句中测试 make printf()失败。问题是:

  1. 达福?为什么会这样?
  2. 我该如何解决?

如果您对整个 代码感兴趣,我不介意分享它。在 github 上.这是一个 Code::Blocks 项目。唯一的包含路径必须是 gkit 的父目录文件夹。

最佳答案

这正是我讨厌 printf() 的原因。它是关于在其他方面容易出错的语言中最容易出错的例程。

处理“奇怪”崩溃的第一件事是简化逻辑以尝试缩小范围。

在这种情况下,接下来我将尝试在 printf 之前将您的 float 设置为已知值(例如:1.0)。可能是你的 printf 有一个关于你碰巧在那里的奇怪值的错误。

如果可行(打印 1.0),那么我的下一步将尝试打印该变量中的位。对于 C,这可能会将格式更改为 %x 并将参数更改为类似 *((unsigned int *)(&y))

如果它不起作用(根据您的评论我猜不是),请继续简化。尝试删除 %s 及其参数(无论如何都是一种不必要的 ATM)。如果仍然失败,请尝试:

  • 将损坏的代码片段移动到独立的“主”中,然后(假设它有效)添加代码直到它损坏。
  • 从您现有的代码中注释掉代码,直到您找到使它工作的东西。

关于c - printf %f 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11210470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com