- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在函数中有这段代码。我想打印 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 < 0
和 y1 < 0
在 if 子句中测试 make printf()
失败。问题是:
如果您对整个 代码感兴趣,我不介意分享它。在 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/
我想知道以下语句在 C 中会打印什么? printf("hello\n") || (printf("goodbye\n") || printf("world\n")); 我通常习惯于使用“cout”在
这是我目前正在学习的系统编程类(class)的幻灯片: catch_child 是 SIGCHLD 处理程序。输出与代码如何对应?为什么没有打印一些“Child #x started”消息? 最佳答案
这有点像拼图……我刚刚又回到了C,打算这次掌握它。所以我一直在阅读 The C Programming Language ,我得到了这个声明: Among others, printf also re
如何使用 printf 在字符串末尾附加空格? 我找不到任何在右侧附加空格的示例。 A similar question我发现使用 printf改为在字符串的左侧添加空格。 最佳答案 使用负数左对齐(
我想通过 usart 从 stm32f405 注销。 在我的 syscall.c 文件中,我实现了通过 usart 打印的功能: int _write(int file, char *ptr, int
我想定义一个记录器函数,比如 myPutStrLn = putStrLn . (++) "log: " main = do myPutStrLn "hello" 这很好。现在我想用 printf 格式
Printf module API详细介绍了类型转换标志,其中: %B: convert a boolean argument to the string true or false %b: conv
@H2CO3 这是我的主要代码: #pragma OPENCL EXTENSION cl_ amd_ printf : enable #define PROGRAM_FILE "matvec.cl"
Printf module API详细介绍了类型转换标志,其中: %B: convert a boolean argument to the string true or false %b: conv
您可以使用 printf 字段宽度说明符截断字符串: printf("%.5s", "abcdefgh"); > abcde 不幸的是,它不适用于数字(将 d 替换为 x 是相同的): printf(
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 4 年前。 Improve th
我遇到了我见过的最奇怪的错误之一。 我有一个简单的程序,可以打印多个整数数组。 对数组进行排序,然后打印...... place_in_buf(n100, 100); insertion(10
我的程序是每隔一段时间获取文件大小并显示它以记录任何更改。由于某种原因,执行下面的代码挂起,只为我提供了一个光标。没有打印或显示任何内容。 代码: #include #include #inclu
printf("It is currently %s's turn.\n", current->name); 我想知道为什么在 %s 之后打印出额外的换行符。我知道C 中的字符串总是以\0 结尾。没有
这个问题已经有答案了: printf anomaly after "fork()" (3 个回答) fork() in c using printf [duplicate] (2 个回答) 已关闭 9
我对编程很陌生。 我正在尝试编写一个程序,从数组中调用水果的价格。但我希望代码在写价格之前也写水果的名称。如果我键入 2,如何使输出为“Orange price : 10”而不仅仅是 price :
这个问题在这里已经有了答案: How do I print a non-null-terminated string using printf? (2 个答案) 关闭 7 年前。 例如,我有一个字符
我有一个 atmel UC3-L0 和罗盘传感器。现在我安装 AtmelStudio 并将一些演示代码下载到电路板中。但是我不知道演示代码中的函数 printf 会在哪里出现数据。我应该如何获取数据?
我有一个 atmel UC3-L0 和罗盘传感器。现在我安装 AtmelStudio 并将一些演示代码下载到电路板中。但是我不知道演示代码中的函数 printf 会在哪里出现数据。我应该如何获取数据?
嗨,我是 C 世界的新手,我的代码确实有些奇怪。目标是创建一个函数,可以在开头和结尾处用空格和/或制表符修剪字符串。我无法使用字符串库。 问题是我的代码中有一个 printf 只是用于测试,它的工作非
我是一名优秀的程序员,十分优秀!