Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;函数调用后,地址处的值与预期值不同_C++_Pointers_Arduino - Fatal编程技术网

C++ c++;函数调用后,地址处的值与预期值不同

C++ c++;函数调用后,地址处的值与预期值不同,c++,pointers,arduino,C++,Pointers,Arduino,最近,我试图解决一个问题,这个问题困扰了我一段时间 问题是,当我调用一个方法并传递一个以数组指针作为成员的结构时,在该方法返回后,前两个字节为空。即使它们被初始化为(在本例中)0xFF。它们并不总是为空。有时候,它们确实有一些价值,但我找不到任何模式 我最近解决了这个问题。我必须为位图结构传递一个指针。但我不明白为什么,当我只需要更改数组的值时,正如您在下面看到的,我正在写入相同的地址,但当它从方法返回时,前2个字节为零 有人能解释一下我遗漏了什么吗?谢谢 我有这个密码: void Printe

最近,我试图解决一个问题,这个问题困扰了我一段时间

问题是,当我调用一个方法并传递一个以数组指针作为成员的结构时,在该方法返回后,前两个字节为空。即使它们被初始化为(在本例中)0xFF。它们并不总是为空。有时候,它们确实有一些价值,但我找不到任何模式

我最近解决了这个问题。我必须为位图结构传递一个指针。但我不明白为什么,当我只需要更改数组的值时,正如您在下面看到的,我正在写入相同的地址,但当它从方法返回时,前2个字节为零

有人能解释一下我遗漏了什么吗?谢谢

我有这个密码:

void Printer::offsetBitmapVertically(Bitmap bitmap, uint8_t offset)
{
    byte length = bitmap.arrayLength();

    byte previousValue = 0;

    for (byte i = 0; i < bitmap.width; i++)
    {
        byte previousValue = 0;
        for (byte j = 0; j <= bitmap.height / 8; j++)
        {
            byte index = i + bitmap.width * j;

            byte tmp = bitmap.value[index] >> 8 - offset;
            bitmap.value[index] = (bitmap.value[index] << offset) | previousValue;
            Serial.print("address: "); Serial.println((uint16_t)&bitmap.value[index]);
            Serial.print("value: "); Serial.println(bitmap.value[index], HEX);
            previousValue = tmp;
        }
    }

    Serial.println("");
    Serial.println("");
    Serial.println("");
}

void TextPrinter::print(const char *str, Point p, Font* p_font)
{
    while (*str)
    {
        Bitmap bitmap = p_font->getBitmapFromCharacter(*str);
        offsetBitmapVertically(bitmap, 0);
        for (int i = 0; i < bitmap.arrayLength(); i++)
        {
            Serial.print("address: "); Serial.println((uint16_t)&bitmap.value[i]);
            Serial.print("value: "); Serial.println(bitmap.value[i], HEX);
        }

        p_lcd->writeBitmap(bitmap.value, p.x, p.y, bitmap.width, bitmap.height);
        p.x += bitmap.width + 2;

        str++;
    }  
}

/*
address: 1240
value: FF
...
address: 1241
value: FF
...



address: 1240
value: 0
address: 1241
value: 0
...
*/
void打印机::offsetBitMapVertical(位图位图,uint8\u t offset)
{
字节长度=位图.arrayLength();
字节previousValue=0;
用于(字节i=0;i8-偏移量;
bitmap.value[index]=(bitmap.value[index]getBitmapFromCharacter(*str);
偏移位图垂直(位图,0);
对于(int i=0;iwriteBitmap(bitmap.value、p.x、p.y、bitmap.width、bitmap.height);
p、 x+=位图宽度+2;
str++;
}  
}
/*
地址:1240
价值:FF
...
地址:1241
价值:FF
...
地址:1240
数值:0
地址:1241
数值:0
...
*/
位图结构的定义如下

struct Bitmap
{
    public:
        Bitmap(const byte* bitmapArray);
        ~Bitmap() { delete [] value; }

        uint8_t arrayLength() { return arrayLength(width, height); } 
        static uint8_t arrayLength(uint8_t width, uint8_t height) { return width * ((height / 8) + 1); } // TODO potencional bug when height % 8 == 0

        byte* value;
        uint8_t width;
        uint8_t height;
};

Bitmap::Bitmap(const byte* bitmapArray)
{
    width = pgm_read_word(bitmapArray);
    height = pgm_read_word(bitmapArray + 1);

    byte length = arrayLength(width, height);
    value = new byte[length];
    for (byte i = 0; i < length; i++)
        value[i] = pgm_read_word(bitmapArray + i + 2); // first two bytes were width and height
}
struct位图
{
公众:
位图(常量字节*位图数组);
~Bitmap(){delete[]value;}
uint8_t arrayLength(){返回arrayLength(宽度、高度);}
静态uint8_t数组长度(uint8_t width,uint8_t height){return width*((height/8)+1);}//当height%8==0时TODO潜在错误
字节*值;
uint8_t宽度;
uint8_t高度;
};
位图::位图(常量字节*位图数组)
{
宽度=pgm_读取_字(位图数组);
高度=pgm_读取_字(位图数组+1);
字节长度=阵列长度(宽度、高度);
值=新字节[长度];
用于(字节i=0;i
您通过值传递
位图
变量。这意味着
offsetBitMapVertical
函数从
print
函数接收变量的副本

更改副本当然不会更改原件

您可能应该通过引用传递参数:


还要注意,除非更改为通过引用传递,否则代码将导致未定义的行为。这是因为默认的复制构造函数(将用于创建副本)只需复制指针,就可以使两个不同的对象具有指向相同内存的相同指针。一旦
offsetBitMapVertical
函数中的
bitmap
变量超出范围并被破坏,它将
delete[]
该内存,这意味着原始指针不再指向分配的内存


阅读“关于”以了解如何解决此问题。

通过值传递
位图
变量。这意味着
offsetBitMapVertical
函数从
print
函数接收变量的副本

更改副本当然不会更改原件

您可能应该通过引用传递参数:


还要注意,除非更改为通过引用传递,否则代码将导致未定义的行为。这是因为默认的复制构造函数(将用于创建副本)只需复制指针,就可以使两个不同的对象具有指向相同内存的相同指针。一旦
offsetBitMapVertical
函数中的
bitmap
变量超出范围并被破坏,它将
delete[]
该内存,这意味着原始指针不再指向分配的内存


阅读了解如何解决此问题。

是的,谢谢,但这实际上并不能回答我的问题。我写信的地址是正确的(12401241,…),但在方法返回后,只有前两个字节为空。每个字节都有期望值。@redsnake所以问题不是为什么在
offsetBitMapVertical
函数中对变量
bitmap
所做的修改会保留到
print
函数中?@redsnake另外,您确定地址只有16位吗s?它们不是32位?@redsnake您的位图类存在冲突。默认的copy-ctor成员复制位图中的所有内容(含义、指针、大小等),在函数退出时,
bitmap::~bitmap
被激发,这会破坏该数组,在原始对象(副本的源)中留下一个悬空指针。按此答案所示的引用传递可以避免这种情况。由于该类不安全,因此在类中放置
Bitmap(const-Bitmap&)=delete;
应该标记所有受此影响的位置。@redsnake
Bitmap.value[index]=…
对我来说确实是一个修改。然而,正如我更新了我的答案和WhozCraig所指出的,问题可能是另外一个问题。尽管(临时)解决方案是相同的。是的,谢谢,但这实际上并没有回答我的问题。我写信的地址是正确的(12401241,…),但在方法返回后,只有前两个字节为空。每个字节都有期望值。@redsnake所以问题不是为什么对
OffsetBitMapVertical
函数中的变量
bitmap
所做的修改会保留到
打印
函数?@r
void Printer::offsetBitmapVertically(Bitmap& bitmap, uint8_t offset) { ... }
//                                         ^
//                       Note ampersand here