C++ c++;函数调用后,地址处的值与预期值不同
最近,我试图解决一个问题,这个问题困扰了我一段时间 问题是,当我调用一个方法并传递一个以数组指针作为成员的结构时,在该方法返回后,前两个字节为空。即使它们被初始化为(在本例中)0xFF。它们并不总是为空。有时候,它们确实有一些价值,但我找不到任何模式 我最近解决了这个问题。我必须为位图结构传递一个指针。但我不明白为什么,当我只需要更改数组的值时,正如您在下面看到的,我正在写入相同的地址,但当它从方法返回时,前2个字节为零 有人能解释一下我遗漏了什么吗?谢谢 我有这个密码:C++ c++;函数调用后,地址处的值与预期值不同,c++,pointers,arduino,C++,Pointers,Arduino,最近,我试图解决一个问题,这个问题困扰了我一段时间 问题是,当我调用一个方法并传递一个以数组指针作为成员的结构时,在该方法返回后,前两个字节为空。即使它们被初始化为(在本例中)0xFF。它们并不总是为空。有时候,它们确实有一些价值,但我找不到任何模式 我最近解决了这个问题。我必须为位图结构传递一个指针。但我不明白为什么,当我只需要更改数组的值时,正如您在下面看到的,我正在写入相同的地址,但当它从方法返回时,前2个字节为零 有人能解释一下我遗漏了什么吗?谢谢 我有这个密码: void Printe
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;
应该标记所有受此影响的位置。@redsnakeBitmap.value[index]=…
对我来说确实是一个修改。然而,正如我更新了我的答案和WhozCraig所指出的,问题可能是另外一个问题。尽管(临时)解决方案是相同的。是的,谢谢,但这实际上并没有回答我的问题。我写信的地址是正确的(12401241,…),但在方法返回后,只有前两个字节为空。每个字节都有期望值。@redsnake所以问题不是为什么对OffsetBitMapVertical
函数中的变量bitmap
所做的修改会保留到打印
函数?@r
void Printer::offsetBitmapVertically(Bitmap& bitmap, uint8_t offset) { ... }
// ^
// Note ampersand here