gpt4 book ai didi

c++ - 声明数组后,所有元素都以某种方式成为最后一个元素

转载 作者:行者123 更新时间:2023-11-30 05:42:48 26 4
gpt4 key购买 nike

基本上,我正在构建一些代码,其中一组对象(我自己制作了对象)需要在类范围内访问,但在其他一些步骤后初始化。这是我所做的:


基础对象

unsigned char stepPin;
unsigned char dirPin;
unsigned char sensorPin;
const char* ident;

//Object
StepperMotor :: StepperMotor(const unsigned char _stepPin,
const unsigned char _dirPin,
const unsigned char _sensorPin,
const char* _ident)
{
stepPin = _stepPin;
dirPin = _dirPin;
sensorPin = _sensorPin;
ident = _ident;
std::cout << "Motor " << ident << ": Step Pin - " << (int)stepPin << " | Direction Pin - " << (int)dirPin << std::endl;
}

对象管理器

#include "stepperMotor.h"
#include <iostream>
#include <wiringPi.h>
#include <thread>
#include <cstdlib>
#include <vector>
#include "stepperManager.h"

StepperMotor motors[] = {
{7, 15, 16, "HS"},
{0, 1, 2, "HL"},
{3, 4, 5, "HP"},
{12, 13, 6, "CS"},
{14, 10, 11, "VP"},
{21, 22, 26, "TC"},
{23, 24, 27, "TR"},
{25, 28, 29, "IN"}
};

StepperManager::StepperManager()
{
for (int i = 0; i < 8; i++){
motors[i].dumpData();
}
}

现在到实际问题...

初始声明后,数组中的所有元素都成为最后一个元素。您可以通过查看运行时的输出来了解这一点:

输出:

Motor HS: Step Pin - 7 | Direction Pin - 15
Motor HL: Step Pin - 0 | Direction Pin - 1
Motor HP: Step Pin - 3 | Direction Pin - 4
Motor CS: Step Pin - 12 | Direction Pin - 13
Motor VP: Step Pin - 14 | Direction Pin - 10
Motor TC: Step Pin - 21 | Direction Pin - 22
Motor TR: Step Pin - 23 | Direction Pin - 24
Motor IN: Step Pin - 25 | Direction Pin - 28
Declare the motor man
Motor IN: Step Pin - 25 | Direction Pin - 28
Motor IN: Step Pin - 25 | Direction Pin - 28
Motor IN: Step Pin - 25 | Direction Pin - 28
Motor IN: Step Pin - 25 | Direction Pin - 28
Motor IN: Step Pin - 25 | Direction Pin - 28
Motor IN: Step Pin - 25 | Direction Pin - 28
Motor IN: Step Pin - 25 | Direction Pin - 28
Motor IN: Step Pin - 25 | Direction Pin - 28

所以,我不完全理解为什么会这样,我试过将数组设为静态,然后改用 vector ,但都无济于事。恐怕我对语言的了解不够,无法自己找到问题。


编辑

有人指出我错过了实际运行的代码。对不起那些家伙。

这是实现对象的“主”文件。

#include <iostream>               // For cout and cerr
#include <cstdlib> // For atoi()
#include <cstring>
#include "stepperManager.h"

int main(int argc, char **argv)
{
std::cout << "Declare the motor man" << std::endl;
StepperManager motorMan;

return 0;
}

最佳答案

在这里,您想进一步了解类及其工作原理。在 StepperMotor 的 源文件中,您正在定义具有外部链接的文件范围全局变量。每次构造 StepperMotor 时,您都会覆盖这些相同的变量,因此所有 StepperMotors 都有效地访问相同的值(以及您所看到的行为)。

由于您具有 C# 背景,因此您在这里使用 StepperMotors 的静态成员变量。您需要非静态成员变量。简单示例:

Foo.h:

// Foo.h
#ifndef FOO_H
#define FOO_H

class Foo
{
public:
explicit Foo(int value);
void print_value() const;

private:
int member_variable;
}

#endif

Foo.cpp:

// Foo.cpp
#include "Foo.h"
#include <iostream>

using namespace std;

Foo::Foo(int value): member_variable(value)
{
}

void Foo::print_value() const
{
cout << member_variable << endl;
}

主要.cpp:

// main.cpp
#include "Foo.h"

int main()
{
Foo f1(123);
Foo f2(456);
Foo f3(789);
f1.print_value();
f2.print_value();
f3.print_value();
}

输出:

123
456
789

我还在您的示例中看到了一些线程使用情况。我建议,在这一点上,这就像杂耍 Razor Blade 。您希望首先坚持基础知识,掌握语言和调试器,然后您可以逐步实现并行执行、使用手头的分析器进行微调等。

关于c++ - 声明数组后,所有元素都以某种方式成为最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30509537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com