我读的地方,发生违约浮点值一样1.2都double没有float.
那么什么是默认的整数值,比如6,是short , int 还是 long?
我经常在制作VCL程序时遇到这样的情况:
现在我想要的是,每当用户在TEdit :: Text中输入内容时,OnChange事件必须处理用户输入.但是当我的程序将TEdit :: Text设置为默认值时,这不是必需的,因为我知道该值是正确的.
不幸的是,编写代码myedit->Text = "Default";会触发OnChange事件.
我倾向于用我认为相当丑陋的方法解决这个问题:通过创建一个bool变量is_user_input来TEdit::OnChange检查.如果是,则TEdit :: Text将被验证,否则将被忽略.但是,当然,这并不妨碍程序TEdit::OnChange在不必要时启动.
是否有更好或更清洁的方法来实现这一目标?
有没有办法让OnChange检查谁叫它?或者我想,一种暂时禁用OnChange事件的方法会更好.TEdit::Enabled似乎不会影响是否OnChange被触发.
我正在学习K&R书.我目前在第4章.我正在阅读第71页的atof()函数.函数atof(s)将字符串转换为其双精度浮点等效值.
atof()的代码如下:
// atof:将string s转换为double
double atof2(char s[])
{
double val, power;
int i, sign;
for (i = 0; isspace(s[i]); ++i) //skip white space
;
sign = (s[i] == '-') ? -1: 1;
if (s[i] == '-' || s[i] == '-')
++i;
for (val = 0.0; isdigit(s[i]); i++)
val = 10.0 * val + (s[i] - '0');
if (s[i] == '.')
++i;
for (power = 1.0; isdigit(s[i]); i++) {
val = 10.0 * val + (s[i] - '0');
power *= …Run Code Online (Sandbox Code Playgroud) 在编码时我遇到了一个问题:
当我必须使用大量for循环时,所有迭代都在不同的范围内.如果我只将一个变量声明为索引(示例I)或者它根本不重要(示例II),那么性能(即运行时)会更好吗?
例I:
int ind;
for(ind=0; ind < a; ind++) { /*do something*/ }
for(ind=0; ind < b; ind++) { /*to something*/ }
...
for(ind=0; ind < z; ind++) { /*to something*/ }
Run Code Online (Sandbox Code Playgroud)
例二:
for(int ind=0; ind < a; ind++) { /*do something*/ }
...
for(int ind=0; ind < z; ind++) { /*do something*/ }
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助
据我所知,以下代码在C11中表现出未定义的行为:
#include <string.h>
struct aaaa { char bbbb; int cccc; };
int main(void) {
unsigned char buffer[sizeof(struct aaaa)] = { 0 };
struct aaaa *pointer = &buffer[0];
return (*pointer).cccc;
}
Run Code Online (Sandbox Code Playgroud)
根据N1570第6.5.3.2节第4条,
如果为指针分配了无效值,
*则未定义一元运算符的行为.
附有一个澄清的脚注
在由一元运算
*符解除引用指针的无效值中,有一个空指针,一个与指向的对象类型不适当对齐的地址,以及一个对象在其生命周期结束后的地址.
它不太可能struct aaaa *并且unsigned char *具有相同的对齐,因此我们为其分配了无效值pointer,*pointer因此使用UB.
但是,我可以复制结构吗?
#include <string.h>
struct aaaa { char bbbb; int cccc; };
int main(void) {
unsigned char buffer[sizeof(struct aaaa)] = { 0 };
struct aaaa target;
memcpy(&target, buffer, …Run Code Online (Sandbox Code Playgroud) 如果我定义一个带有参数的宏,如下所示。
#define define_int(a) int a;
Run Code Online (Sandbox Code Playgroud)
并提供一个参数,中间有空格,如下所示
define_int(* a)
Run Code Online (Sandbox Code Playgroud)
并得到输出?
int * a;
Run Code Online (Sandbox Code Playgroud)
有可能的使用
#define ASSIGN(A,B) B=A;
Run Code Online (Sandbox Code Playgroud)
我想直接使用这个宏从函数返回
ASSIGN(A, return B)
Run Code Online (Sandbox Code Playgroud)
这样它就会输出,
return B = A;
Run Code Online (Sandbox Code Playgroud) 以下代码的输出为4000;如果具有互斥锁的线程不释放它,为什么是4000。我虽然会陷入僵局,但主要是我等待所有功能完成。
int M = 1000;
HANDLE mutex;
DWORD WINAPI thread_function(LPVOID param) // The thread function
{
long aux;
WaitForSingleObject(mutex, INFINITE);
for (int i = 0; i < M; i++)
{
aux = count; //count is global
aux++;
Sleep(0.5);
count = aux;
}
/*ReleaseMutex(mutex);*/
return (DWORD)0;
}
int main()
{
int N = 4;
InitializeCriticalSection(&gSection);
HANDLE* iThread = (HANDLE*)malloc(N * sizeof(HANDLE));
mutex = CreateMutex(NULL, FALSE, NULL);
for (int i = 0; i < N; i++) // N = 4, i create …Run Code Online (Sandbox Code Playgroud) 类似函数的宏是
#define ARRAYSIZE(_Array) ((sizeof(_Array)) / (sizeof(_Array[0])))
Run Code Online (Sandbox Code Playgroud)
显示的错误是:
错误[Pm154]:在类函数宏的定义中,参数的每个实例都应括在括号中(MISRA C 2004 规则 19.10)
根据this answer,以下是标准中描述的序列点:
在函数调用和实际调用中的函数指示符和实际参数的评估之间;
在运算符 &&、|| 和 , 的第一个和第二个操作数的计算之间;
在条件 ?: 运算符的第一个操作数的评估与第二个和第三个操作数中的任何一个评估之间;
完整声明符的结束;
在完整表达式的求值和要求值的下一个完整表达式之间。以下是完整的表达:
在库函数返回之前;
在与每个格式化输入/输出函数转换说明符相关联的动作之后;
在每次调用比较函数之前和之后,以及在对比较函数的任何调用和作为参数传递给该调用的对象的任何移动之间。
该标准从未明确提到分号是一个序列点,但是已经说明的各种序列点暗示分号确实是一个序列点。
那么,分号是在break;还是continue;序列点中?
我一直在玩 C 语言的 Game Boy Advance 编码。为了使中断正常工作,必须将中断处理程序例程的地址手动复制到 RAM 位置 0x03007FFC。我知道如何在 ARM Assembly 中执行此操作,但不知道如何在 C 中执行此操作。我正在尝试这样的操作:
#define REG_INTERRUPT *(vu32*)0x03007FFC
void irqhandler()
{
while(1){}
}
int main()
{
REG_INTERRUPT = &irqhandler();
while(1){}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用。根据我对 C 函数的理解,C 似乎认为我正在尝试获取返回值的地址irqhandler(因为它是空的,所以没有返回值),这就是错误的来源。我如何告诉 C 我想要函数本身的内存位置?