小编Cod*_*ash的帖子

浮动值在发布和调试版本中表现不同

我的应用程序在发布模式和调试模式下编译时生成不同的浮点值.我发现的唯一原因是我保存了一个二进制跟踪日志,并且发布版本中的一个从调试版本中略微偏离,看起来32位浮点值的底部两位不同于1/2这些案件.

你会认为这种"差异"是一个错误,还是会出现这种差异?这会是编译器错误还是内部库错误.

例如:

LEFTPOS and SPACING are defined floating point values.
float def_x;
int xpos;

def_x = LEFTPOS + (xpos * (SPACING / 2));
Run Code Online (Sandbox Code Playgroud)

问题在于X360编译器.

c c++ compiler-construction debugging floating-point

7
推荐指数
1
解决办法
2172
查看次数

C++中的默认传递引用语义

编辑:这个问题更多的是关于语言工程而不是C++本身.我以C++为例来展示我想要的东西,主要是因为我每天都在使用它.我并不想知道它是如何工作的C++,但打开它如何的讨论来完成.

这不是它现在的工作方式,这就是我希望它可以完成的方式,这肯定会打破C兼容性,但这就是我认为extern"C"的全部意义.

我的意思是,在您现在声明的每个函数或方法中,您必须显式写入该对象将通过引用在其上添加前缀作为参考运算符.我希望每个非POD类型都会通过引用自动发送,因为我使用了很多,实际上对于每个大小超过32位的对象,这几乎是我的每一类.

让我们举例说明它是如何做的,假设a,bc为类:

class example {
    public:
        int just_use_a(const a &object);
        int use_and_mess_with_b(b &object);
        void do_nothing_on_c(c object);
};

现在我想要的是:

class example {
    public:
        int just_use_a(const a object);
        int use_and_mess_with_b(b object);
        extern "C" void do_nothing_on_c(c object);
};

现在,do_nothing_on_c()的行为就像今天一样.

至少对我来说这会很有趣,感觉更清楚,而且如果你知道每个非POD参数都是通过引用而来的,我相信如果你必须明确地声明它,那么错误将是相同的.

对于这种变化的另一种观点,来自C的人,参考运算符在我看来是一种获取变量地址的方法,这就是我用来获取指针的方式.我的意思是,它是相同的运算符,但在不同的上下文中具有不同的语义,对你来说这不是觉得有点不对吗?

c++ syntax programming-languages semantics

7
推荐指数
2
解决办法
3286
查看次数

通过更改窗口大小获得不同的标头大小

我有一个C++程序将TCP标头表示为结构:

#include "stdafx.h"

/*  TCP HEADER

    0                   1                   2                   3   
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          Source Port          |       Destination Port        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Sequence Number                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Acknowledgment Number                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Data |           |U|A|P|R|S|F|                               |
   | Offset| Reserved  |R|C|S|S|Y|I|            Window             |
   |       |           |G|K|H|T|N|N|                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Checksum            | …
Run Code Online (Sandbox Code Playgroud)

c c++ struct packing

7
推荐指数
2
解决办法
2853
查看次数

Vista上的随机MoveFileEx失败

我注意到写入文件,关闭它并将其移动到目的地随机地在Vista上失败.具体来说,MoveFileEx()将返回ERROR_ACCESS_DENIED没有明显的原因.这至少发生在Vista SP1上(32位).在XP SP3上不会发生.

在互联网上找到关于完全相同问题的这个线程,没有真正的解决方案.到目前为止看起来错误是由Vista的搜索索引器引起的,见下文.

给出的代码示例足以重现问题.我也在这里粘贴它:

#include <windows.h>
#include <stdlib.h> 
#include <stdio.h> 

bool test() {
    unsigned char buf[] = {
        0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 
        0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 
    }; 
    HANDLE h; 
    DWORD nbytes; 
    LPCTSTR fn_tmp = "aaa"; 
    LPCTSTR fn = "bbb"; 
    h = CreateFile(fn_tmp, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_ALWAYS, 0, 0); 
    if (h == INVALID_HANDLE_VALUE) return 0; 
    if (!WriteFile(h, buf, sizeof buf, &nbytes, 0)) …
Run Code Online (Sandbox Code Playgroud)

c++ windows winapi windows-vista

7
推荐指数
1
解决办法
3197
查看次数

函数返回另一个函数的返回

如果我想调用Bar()而不是Foo(),是否会Bar()返回Foo()返回的副本(额外开销),或者返回Foo()放置在临时堆栈上的同一对象?

vector<int> Foo(){  
    vector<int> result;  
    result.push_back(1);  
    return result;  
}  
vector<int> Bar(){  
    return Foo();  
}
Run Code Online (Sandbox Code Playgroud)

c++ function vector return-value

7
推荐指数
1
解决办法
798
查看次数

为什么派生类函数参数取值基类函数参数?

我正在研究C++.以下是我的代码:

#include <iostream>
using namespace std;
class base
{
        public:
        virtual void display(int a = 4)
        {
                cout << "base ::  "<<  a*a << endl;
        }
};

class derived : public base
{
        public:
        void display(int b = 5)
        {
                cout << " Derived :: " << b*b*b <<  endl;
        }
};

int main()
{
        base *bobj;
        derived dobj;
        bobj = &dobj;
        bobj->display();
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

Derived :: 64
Run Code Online (Sandbox Code Playgroud)

调用Base类的函数,但使用派生函数的参数的默认值.为什么派生类方法display(),取基类方法参数值?

c++ oop inheritance base-class derived-class

7
推荐指数
1
解决办法
2555
查看次数

将对象传递给重载运算符

昨天有人给了我一个错误的节目.在MVS 2010中工作,我发现了问题,也是它的替代方案.问题是重载的插入操作符类.其原型如下......

void matrix :: operator << (matrix&) ;
Run Code Online (Sandbox Code Playgroud)

它是从这样的地方打来的......

matrix m ;
m.operator << (m) ;
Run Code Online (Sandbox Code Playgroud)

我发现编译器不允许发送与调用函数的引用参数相同的对象.但我不明白背后的原因以及它造成了什么问题.如果有人能够解释,我将不胜感激.谢谢.

编辑: 实际发生的是,在调试时,它进入函数内部,在执行时出现main,进入外部依赖文件dbgdel.cpp并在此行停止.

 _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
Run Code Online (Sandbox Code Playgroud)

c++ oop runtime-error operator-overloading insertion

7
推荐指数
1
解决办法
269
查看次数

(*it) - > method()vs(**it).method

迭代指针的向量(或其他容器)时,使用以下优势和/或优势是否有任何区别:

for (it = v.begin(); it != v.end(); ++it) {
    (*it)->method();
}
Run Code Online (Sandbox Code Playgroud)

要么

for (it = v.begin(); it != v.end(); ++it) {
    (**it).method();
}
Run Code Online (Sandbox Code Playgroud)

c++ iterator vector dot-operator

7
推荐指数
1
解决办法
274
查看次数

使用可选参数重载new和delete运算符

#include <new>
#include <cstdlib>
#include <iostream>
#include <stdexcept>

struct foo {};

inline void* operator new(size_t size, foo*) throw (std::bad_alloc)
{
    std::cout << "my new " << size << std::endl;
    return malloc(size);
}

inline void operator delete(void* p, foo*) throw()
{
    std::cout << "my delete" << std::endl;
    free(p);
}

int main()
{
    delete new((foo*)NULL) foo;
}
Run Code Online (Sandbox Code Playgroud)

输出(通过ideone):

my new 1
Run Code Online (Sandbox Code Playgroud)

我的想法是,C++会释放一个带有附加参数的对象,并且匹配删除相同的参数,但我显然是不正确的.

获取上述代码调用重载删除的正确方法是什么?

c++ operator-overloading new-operator delete-operator

7
推荐指数
1
解决办法
3064
查看次数

编译器可能不会跨序列点移动对volatile变量的访问; 这是什么意思?

将变量声明为"volatile"意味着直接从内存位置读取/写入,而不是从寄存器变量读取/写入.我对'序列点'有所了解.但我不明白标题中提到的陈述.

有人可以解释一下,并给出一些代码片段吗?

c compiler-construction volatile sequence-points

6
推荐指数
1
解决办法
749
查看次数