为什么我的数组值与此处的全局变量不匹配?

Why does my array values not match with the global variables here?

本文关键字:全局变量 不匹配 我的 数组 为什么      更新时间:2023-10-16

我这里有一个问题:( 我在这里创建多个全局变量并将它们放入一个数组中。在功能extractLabel()中,我用每variable = binarycode的二进制代码值填充这些变量。我把它们打印出来,一切都很好。然后我从数组中打印出相同的变量。但是那里的变量具有值 0。但是这些变量在数组中也不应该具有相同的值吗?如果没有,我该如何解决这个问题?

谢谢你的帮助!

#include <iostream>
#include <vector>
#include <sstream>
#include <string>
#include <array>
#include <math.h>
#include <algorithm>
#include "Client.hpp"

static long long a_word = 4294967295;
static long long c_word;
static long long c_label1;
static long long c_label2;
static long long c_label3;
static long long c_label4;
static long long c_label5;
static long long c_label6;
static long long c_label7;
static long long c_label8;
static std::vector<bool> binCode;
static std::array<long long, 8> c_tokens = {c_label1, c_label2, c_label3, c_label4, c_label5, c_label6, c_label7, c_label8};

void executeClient() {
receiveValue();
calculateDecBin();
extractLabel();
}
void receiveValue() {
c_word = a_word;
}
void calculateDecBin() {
while (c_word) {
int rest = c_word % 2;
c_word = c_word / 2;
binCode.push_back(rest);
}
std::reverse(binCode.begin(), binCode.end());
}
void extractLabel() {
std::cout << "Label values:" << std::endl;
for(int i = 0; i < 8; i++) {
c_label1 = stoll(std::to_string(c_label1) + std::to_string(binCode[i]));
}
std::cout << c_label1 << std::endl;
for(int i = 8; i < 10; i++) {
c_label2 = stoll(std::to_string(c_label2) + std::to_string(binCode[i]));
}
std::cout << c_label2 << std::endl;
for(int i = 10; i < 26; i++) {
c_label3 = stoll(std::to_string(c_label3) + std::to_string(binCode[i]));
}
std::cout << c_label3 << std::endl;
for(int i = 26; i < 27; i++) {
c_label4 = stoll(std::to_string(c_label4) + std::to_string(binCode[i]));
}
std::cout << c_label4 << std::endl;
for(int i = 27; i < 28; i++) {
c_label5 = stoll(std::to_string(c_label5) + std::to_string(binCode[i]));
}
std::cout << c_label5 << std::endl;
for(int i = 28; i < 29; i++) {
c_label6 = stoll(std::to_string(c_label6) + std::to_string(binCode[i]));
}
std::cout << c_label6 << std::endl;
for(int i = 29; i < 31; i++) {
c_label7 = stoll(std::to_string(c_label7) + std::to_string(binCode[i]));
}
std::cout << c_label7 << std::endl;
for(int i = 31; i < 32; i++) {
c_label8 = stoll(std::to_string(c_label8) + std::to_string(binCode[i]));
}
std::cout << c_label8 << std::endl;

std::cout << "array values:" << std::endl;
for(int i = 0; i < c_tokens.size(); i++) {
std::cout << c_tokens[i] << std::endl;
}
}

C++具有复制语义。

当您执行以下操作时:

static std::array<long long, 8> c_tokens = {c_label1, c_label2, c_label3, c_label4, c_label5, c_label6, c_label7, c_label8};

(这会在早期执行(

变量的值将复制到新的c_tokens变量中。从这一点开始,更改c_tokensc_label...不会影响另一个。

您可以使用引用包装器将引用存储在数组中:

static std::array<std::reference_wrapper<long long>, 8> c_tokens = {c_label1, c_label2, c_label3, c_label4, c_label5, c_label6, c_label7, c_label8}; // actually works, but heavy 

在这种情况下,数组将包含对指定变量的引用(一种链接(。通过数组或单个变量进行访问会立即影响另一个变量。

但是,如果不对你的项目进行更深入的观察,就不清楚这是否是正确的方法。有一个末尾带有数字的变量列表是一种代码异味。

你在值和引用之间混淆了。c_tokens数组使用c_labeli变量的当前值进行初始化。由于它们是静态的,因此它们被初始化为 0,这解释了您在数组中找到 0 个值。

但是当你以后更改c_labeli变量的值时,它们与数组完全不同,并且在c_tokens中没有任何变化。

变量不在数组中!您根据创建数组时变量的值创建了一个数组。您可能很幸运,这些值是 0 而不是其他值,因为当您使用变量填充数组时,变量是未初始化的。变量和数组位于两个不同的内存区域中,如果更改一个,另一个保持不变。

这是一种稍微不那么冗长的编写代码的方式,它完全回避了变量问题,并清楚地说明了什么去了哪里:(假设c_tokens是一个向量。如果你想要一个静态数组,只需分配给索引(

long long pack(std::vector<bool>::const_iterator it, int count) {
long long res = 0;
while (count-- > 0) {
res = res * 10 + *it;
}
return res;
}
void foo() {
c_tokens.emplace_back(pack(binCode.cbegin() + 0, 8));
c_tokens.emplace_back(pack(binCode.cbegin() + 8, 2));
c_tokens.emplace_back(pack(binCode.cbegin() + 10, 16));
c_tokens.emplace_back(pack(binCode.cbegin() + 26, 1));
c_tokens.emplace_back(pack(binCode.cbegin() + 27, 1));
c_tokens.emplace_back(pack(binCode.cbegin() + 28, 1));
c_tokens.emplace_back(pack(binCode.cbegin() + 29, 2));
c_tokens.emplace_back(pack(binCode.cbegin() + 31, 1));
}