提问者:小点点

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


这里我有一个问题:(我在这里创建了多个全局变量并将它们放入一个数组中。在函数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;
    }
}

共3个答案

匿名用户

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<long long&, 8> c_tokens = {c_label1, c_label2, c_label3, c_label4, c_label5, c_label6, c_label7, c_label8}; // original suggestion

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,而不是其他值,因为当您使用这些变量填充数组时,它们是未初始化的。 变量和数组位于两个不同的内存区域,如果您更改了一个,另一个保持不变。