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

时间:2015-05-28 14:30:41

标签: c++ arrays

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

基础对象

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

所以,我不完全理解为什么会发生这种情况,我已经尝试使数组保持静态,转而使用向量,但没有一个有帮助。我担心自己对语言知之甚少,无法自己找到问题。

修改

有人指出我错过了实际的运行代码。抱歉,那些家伙。

这是&#34;主要&#34;实现对象的文件。

#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;
}

3 个答案:

答案 0 :(得分:1)

在这里,您希望了解有关课程及其工作原理的更多信息。在StepperMotor's源文件中,您将使用外部链接定义文件范围全局变量。每次构造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;
}

main.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

此外,我在您的示例中看到了一些线程用法。在这一点上,我建议这就像玩杂耍刀片一样。您希望首先坚持基础知识,掌握语言,调试器,然后您可以通过自己的方式实现并行执行,使用分析器进行微调等等。

答案 1 :(得分:0)

您已声明了四个全局变量,每次创建StepperMotor时都会更改这些变量。相反,您希望这些成为类成员,以便每个对象都有自己的副本,与其他对象无关:

class StepperMotor {
    unsigned char stepPin;
    unsigned char dirPin;
    unsigned char sensorPin;
    const char* ident;

    // and constructors, member functions, etc.
};

答案 2 :(得分:0)

我认为你的steppermotor.h中应该有这样的东西

class StepperMotor{

//some more stuff

public:
  unsigned char stepPin;
  unsigned char dirPin;
  unsigned char sensorPin;
  const char* ident;
  unsigned int stepVal;
}

这是在c ++中声明成员变量的方式。 我认为阅读一些c ++教程,学习基础知识可能会很有用。