对象通过指针的一个数据成员未通过

时间:2013-05-27 22:53:45

标签: c++ arrays class pointers datamember

可能很难帮助解决这个问题,因为我有很多代码而且不知道是什么弄乱了我的输出。
背景信息是我正在编写一个程序,它从文件中读取文本行,将行解析为标记,然后将标记转换为命令以生成不同类型的“传感器”(数字和模拟)。

我有两个主要问题。制作新传感器时,会创建对象并将指向该对象的指针放入数组中。当打印所有传感器的信息时,调用阵列中指向的每个对象的打印功能。这一切都很好,但由于某种原因,我的传感器名称总是空白。解析正确的令牌,并将其分配给对象的正确部分,但不知何故出现了问题,并且所有传感器名称都列为空白。

另一个问题是类似的。还有另一个sensorNode对象的指针数组。当我创建两个sensorNode对象并通过它们的数组调用它们的打印功能时,它们打印得很好。当我向数组添加另外两个sensorNode对象,并再次调用它时,后两个的信息打印正常,前两个的信息都是垃圾。在那里发生了什么会失去前两个?

这是我的代码,我知道我做了很多,但我认为更好,而不是更少。

我的主要:(对象是在“新传感器”和“新节点”案例的末尾的switch语句中创建的,并在“STATUS”案例中打印)

#include <iostream>
#include <fstream>
using namespace std;

#include "definitions.h"
#include "system_utilities.h"
#include "sensor.h"
#include "sensor_node.h"


int main()
{
    int val;
    ifstream inFile;
    char line[MAX_CMD_LINE_LENGTH];
    char* token[MAX_TOKENS_ON_A_LINE];
    int numtokens;

    SensorNode* NodeList[MAX_NODES];
    sensor* SensorList[MAX_SENSORS];
    int numNodes = 0;
    int numSensors = 0;

    fillSystemCommandList();

    inFile.open("p6input.txt", ios::in);
    if(inFile.fail()) {
        cout << "Could not open input file.  Program terminating.\n\n";
        return 0;
    }
    do {
    inFile.getline(line, MAX_CMD_LINE_LENGTH);
    line[strlen(line)+1] = '\0';
    numtokens = parseCommandLine(line, token);
        int t;
        cout << "Number of tokens: " << numtokens << "\n";

                val = getCommandNumber(token[0]);

            switch(val) {
             case HALT:
                    for (t=1; t <= numtokens; t++) {
                        cout << "Token "<< t << ": " << token[t-1] << "\n"; 
                    }
             cout << "Recognized command \"Halt\"";
             break;
             case STATUS:
                    for (t=1; t <= numtokens; t++) {
                        cout << "Token "<< t << ": " << token[t-1] << "\n";
                    }
                    if (strcmp(token[1], "nodes") == 0) {

                        for (int i = 0; i < numNodes; i++) {
                            NodeList[i]->print();
                        }
                    }
                    if (strcmp(token[1], "sensors") == 0) {

                        for (int j = 0; j < numSensors; j++) {
                            SensorList[j]->print();
                        }
                    }

             cout << "Recognized command \"Status\"";
             break;
             case TIME_CLICK:
                    for (t=1; t <= numtokens; t++) {
                        cout << "Token "<< t << ": " << token[t-1] << "\n";
                    }
             cout << "Recognized command \"time click\"";
             break;
             case NEW_SENSOR:
                    for (t=1; t <= numtokens; t++) {
                        cout << "Token "<< t << ": " << token[t-1] << "\n";
                    }

                    if (strcmp(token[1], "digital") == 0) {

                        SensorList[numSensors] = new digitalSensor(token[2],convertFloatToValue(token[3]));
                    }
                    if (strcmp(token[1], "analog") == 0) {

                        SensorList[numSensors] = new analogSensor(token[2],convertFloatToValue(token[3]),convertIntToValue(token[4]),convertIntToValue(token[5]));
                    }

                    numSensors++;

             cout << "Recognized command \"New Sensor\"";
             break;
             case NEW_SENSOR_NODE:
                    for (t=1; t <= numtokens; t++) {
                        cout << "Token "<< t << ": " << token[t-1] << "\n";
                    }

                NodeList[numNodes] = new SensorNode(token[1], convertFloatToValue(token[3]), convertFloatToValue(token[4]), convertFloatToValue(token[5]), convertIntToValue(token[2]), convertFloatToValue(token[6]));

                    numNodes++;
             cout << "Recognized command \"New Sensor Node\"";
             break;
             case NEW_NETWORK:
                    for (t=1; t <= numtokens; t++) {
                        cout << "Token "<< t << ": " << token[t-1] << "\n";
                    }
             cout << "Recognized command \"New Network\"";
             break;
             case ADD_SENSOR_TO_NODE:
                    for (t=1; t <= numtokens; t++) {
                        cout << "Token "<< t << ": " << token[t-1] << "\n";
                    }
             cout << "Recognized command \"Add sensor to node\"";
             break;
             case ADD_NODE_TO_NETWORK:
                    for (t=1; t <= numtokens; t++) {
                        cout << "Token "<< t << ": " << token[t-1] << "\n";
                    }
             cout << "Recognized command \"Add node to network\"";
             break;
             case SENSOR_COMMAND:
                    for (t=1; t <= numtokens; t++) {
                        cout << "Token "<< t << ": " << token[t-1] << "\n";
                    }
             cout << "Recognized command \"Sensor Command\"";
             break;
             case UNDEFINED_COMMAND:
                    for (t=1; t <= numtokens; t++) {
                        cout << "Token "<< t << ": " << token[t-1] << "\n";
                    }
              break;
             default:
             cout << "Undefined Command";
             }
        for (t=1; t <= numtokens; t++) {
            free((void *)token[t-1]);
        }
            cout << "\n";

        cout << "\n";
    }
    while (val != HALT);
    return 0;
}

这是我的sensor.h

#ifndef __Program_6__sensor__
#define __Program_6__sensor__

#include <iostream>

class sensor {
protected:
    char* SensorName;
    float energyDraw;
    int functioning;
    int onoff;

public:
    sensor(char*n, float pc);
    virtual void print();

    void setOK(int K);
    int getOK();
    void setOnOff(int n);
    int getOnOff();
};
//---------
class digitalSensor : public sensor {
    int reading;

public:
    digitalSensor(char*n, float pc);
    virtual void print();
    void setCurrentReading(int r);
    int getCurrentReading();
};

class analogSensor : public sensor {
    int Reading;
    int minRead;
    int maxRead;

public:
    analogSensor(char *n, float pc, int mn, int mx);
    virtual void print();
    void setCurrentReading(int r);
    int getCurrentReading();
};


#endif /* defined(__Program_6__sensor__) */

我的sensor.cpp的一部分:

#include "sensor.h"
#include "definitions.h"
using namespace std;

//--------SENSOR CLASS------------//
sensor::sensor(char *n, float pc) {

    SensorName = (char*)malloc(strlen(n)+1);
    energyDraw = pc;
    functioning = WORKING;
    onoff = OFF;
}
void sensor::print() {
    cout << "     Sensor: " << SensorName;
    cout << "   Power Consumption: " << energyDraw;
    if (functioning == WORKING) {
        cout << "\n     Sensor is functioning correctly\n";

        if (onoff == ON) {
        cout << "     Sensor is On\n";
    }
        if (onoff == OFF) {
        cout << "     Sensor is Off\n";
    }

    }
    if (functioning == NOTWORKING) {
        cout << "     Sensor is not functioning correctly";
    }
    }
//*********DIGITAL SENSOR**********//

digitalSensor::digitalSensor(char *n, float pc) : sensor(n, pc){
    reading = 0;
}

void digitalSensor::print() {
    sensor::print();
    if (functioning == WORKING && onoff == ON) {
        cout << "     Current sensor reading is: " << reading << "\n\n";
    }
    if (onoff == OFF) {
        cout << "     Current reading not available\n\n";
    }
}


//^^^^^^^^^^^^^ANALOG SENSOR^^^^^^^^^//

analogSensor::analogSensor(char *n, float pc, int mn, int mx) : sensor(n, pc) {
    Reading = mn;
    minRead = mn;
    maxRead = mx;
}

void analogSensor::print() {
    sensor::print();
    cout << "     Minimum Value: " << minRead << ".     Maximum Value: " << maxRead;
    if (functioning == WORKING && onoff == ON) {
        cout << "\n     Current sensor reading is: " << Reading << "\n\n";
    }
    if (functioning == WORKING && onoff == OFF) {
        cout << "\n     Current reading not available\n\n";
    }

}

您可能不需要它,但这是(我的)sensor_node.cpp

的一部分
//Functions in SensorNode
SensorNode::SensorNode(char* n, float x, float y, float z, int i, float ah)
{
    NodeName = (char*)malloc(strlen(n)+1);
    strcpy(NodeName, n);
    Node1.setx(x);
    Node1.sety(y);
    Node1.setz(z);
    NodeID = i;
    batt = ah;
    func = 1;

}

void SensorNode::print()
{

    cout << "\nSensor node " << NodeName << "\t ID: " << NodeID << "\n Location:  ";
    Node1.print();
    cout << "\n Remaining battery life: " << batt << " amp hours";
    if (func == 0) {
        cout<< "\n Node is not functioning\n";
    }
    if (func == 1) {
        cout <<"\n Node is functioning\n";

    }
}

我的sensor_node.h

class SensorNode {
    char* NodeName;
    int NodeID;
    LOCATION Node1;
    float batt;
    int func;


public:
    SensorNode(char *n, float x, float y, float z, int i, float ah);
    void print();
    void setOK(int o);
    int getOK();
    void setLOC(float longi, float lat, float h);
};

最后,这是我的输出!问题出现在最后,没有传感器显示名称,垃圾取代了前两个节点。

输入文件:

status sensors
status nodes
new_sensor_node  "Kitchen Monitor"   41   1.5  2.5  3.5  10.0
new_sensor_node  Basement   42   3.0   4.0   5.0   5.3
new_sensor  digital  "Window open"   .2
new_sensor  digital  "Oven on"   .5
new_sensor  analog   Temperature  .03  0  255
new_sensor  analog   Humidity  3.1415926  10  20
new_sensor  digital  Alarm   2.0
status nodes
status sensors
new_sensor_node    Garage    51   87.2  93.1   0.0   20.5
new_sensor_node    Attic     52   1.1   2.2   15.3   100.75
new_sensor    digital   G1   1.5
new_sensor    digital   G2   1.5
new_sensor    digital   G3   1.5
new_sensor    digital   G4   1.5
new_sensor    digital   G5   1.5
new_sensor    digital   OOPS1   1.5
new_sensor    analog    OOPS2   1.5   0   31
status sensors
status nodes
new_sensor_node    "Last ok node"    51   87.2  93.1   0.0   20.5
new_sensor_node    "This one should not be added"     52   1.1   2.2   15.3   100.75
halt

输出:

Number of tokens: 2
Token 1: status
Token 2: sensors
Recognized command "Status"

Number of tokens: 2
Token 1: status
Token 2: nodes
Recognized command "Status"

Number of tokens: 7
Token 1: new_sensor_node
Token 2: Kitchen Monitor
Token 3: 41
Token 4: 1.5
Token 5: 2.5
Token 6: 3.5
Token 7: 10.0
Recognized command "New Sensor Node"

Number of tokens: 7
Token 1: new_sensor_node
Token 2: Basement
Token 3: 42
Token 4: 3.0
Token 5: 4.0
Token 6: 5.0
Token 7: 5.3
Recognized command "New Sensor Node"

Number of tokens: 4
Token 1: new_sensor
Token 2: digital
Token 3: Window open
Token 4: .2
Recognized command "New Sensor"

Number of tokens: 4
Token 1: new_sensor
Token 2: digital
Token 3: Oven on
Token 4: .5
Recognized command "New Sensor"

Number of tokens: 6
Token 1: new_sensor
Token 2: analog
Token 3: Temperature
Token 4: .03
Token 5: 0
Token 6: 255
Recognized command "New Sensor"

Number of tokens: 6
Token 1: new_sensor
Token 2: analog
Token 3: Humidity
Token 4: 3.1415926
Token 5: 10
Token 6: 20
Recognized command "New Sensor"

Number of tokens: 4
Token 1: new_sensor
Token 2: digital
Token 3: Alarm
Token 4: 2.0
Recognized command "New Sensor"

Number of tokens: 2
Token 1: status
Token 2: nodes

Sensor node Kitchen Monitor  ID: 41
 Location:  (LONGITUDE: 1.5 ,LATITUDE: 2.5 ,HEIGHT: 3.5 )
 Remaining battery life: 10 amp hours
 Node is functioning

Sensor node Basement     ID: 42
 Location:  (LONGITUDE: 3 ,LATITUDE: 4 ,HEIGHT: 5 )
 Remaining battery life: 5.3 amp hours
 Node is functioning
Recognized command "Status"

Number of tokens: 2
Token 1: status
Token 2: sensors
     Sensor:    Power Consumption: 0.2
     Sensor is functioning correctly
     Sensor is Off
     Current reading not available

     Sensor:    Power Consumption: 0.5
     Sensor is functioning correctly
     Sensor is Off
     Current reading not available

     Sensor:    Power Consumption: 0.03
     Sensor is functioning correctly
     Sensor is Off
     Minimum Value: 0.     Maximum Value: 255
     Current reading not available

     Sensor:    Power Consumption: 3.14159
     Sensor is functioning correctly
     Sensor is Off
     Minimum Value: 10.     Maximum Value: 20
     Current reading not available

     Sensor:    Power Consumption: 2
     Sensor is functioning correctly
     Sensor is Off
     Current reading not available

Recognized command "Status"

Number of tokens: 7
Token 1: new_sensor_node
Token 2: Garage
Token 3: 51
Token 4: 87.2
Token 5: 93.1
Token 6: 0.0
Token 7: 20.5
Recognized command "New Sensor Node"

Number of tokens: 7
Token 1: new_sensor_node
Token 2: Attic
Token 3: 52
Token 4: 1.1
Token 5: 2.2
Token 6: 15.3
Token 7: 100.75
Recognized command "New Sensor Node"

Number of tokens: 4
Token 1: new_sensor
Token 2: digital
Token 3: G1
Token 4: 1.5
Recognized command "New Sensor"

Number of tokens: 4
Token 1: new_sensor
Token 2: digital
Token 3: G2
Token 4: 1.5
Recognized command "New Sensor"

Number of tokens: 4
Token 1: new_sensor
Token 2: digital
Token 3: G3
Token 4: 1.5
Recognized command "New Sensor"

Number of tokens: 4
Token 1: new_sensor
Token 2: digital
Token 3: G4
Token 4: 1.5
Recognized command "New Sensor"

Number of tokens: 4
Token 1: new_sensor
Token 2: digital
Token 3: G5
Token 4: 1.5
Recognized command "New Sensor"

Number of tokens: 4
Token 1: new_sensor
Token 2: digital
Token 3: OOPS1
Token 4: 1.5
Recognized command "New Sensor"

Number of tokens: 6
Token 1: new_sensor
Token 2: analog
Token 3: OOPS2
Token 4: 1.5
Token 5: 0
Token 6: 31
Recognized command "New Sensor"

Number of tokens: 2
Token 1: status
Token 2: sensors
     Sensor:    Power Consumption: 0.2
     Sensor is functioning correctly
     Sensor is Off
     Current reading not available

     Sensor:    Power Consumption: 0.5
     Sensor is functioning correctly
     Sensor is Off
     Current reading not available

     Sensor:    Power Consumption: 0.03
     Sensor is functioning correctly
     Sensor is Off
     Minimum Value: 0.     Maximum Value: 255
     Current reading not available

     Sensor:    Power Consumption: 3.14159
     Sensor is functioning correctly
     Sensor is Off
     Minimum Value: 10.     Maximum Value: 20
     Current reading not available

     Sensor:    Power Consumption: 2
     Sensor is functioning correctly
     Sensor is Off
     Current reading not available

     Sensor:    Power Consumption: 1.5
     Sensor is functioning correctly
     Sensor is Off
     Current reading not available

     Sensor:    Power Consumption: 1.5
     Sensor is functioning correctly
     Sensor is Off
     Current reading not available

     Sensor:    Power Consumption: 1.5
     Sensor is functioning correctly
     Sensor is Off
     Current reading not available

     Sensor:    Power Consumption: 1.5
     Sensor is functioning correctly
     Sensor is Off
     Current reading not available

     Sensor:    Power Consumption: 1.5
     Sensor is functioning correctly
     Sensor is Off
     Current reading not available

     Sensor:    Power Consumption: 1.5
     Sensor is functioning correctly
     Sensor is Off
     Current reading not available

     Sensor:    Power Consumption: 1.5
     Sensor is functioning correctly
     Sensor is Off
     Minimum Value: 0.     Maximum Value: 31
     Current reading not available

Recognized command "Status"

Number of tokens: 2
Token 1: status
Token 2: nodes

Sensor node \200o    ID: 1064672
 Location:  (LONGITUDE: 1.4013e-45 ,LATITUDE: 1.5 ,HEIGHT: 7.00649e-45 )
 Remaining battery life: 3.50325e-44 amp hours
 Node is not functioning

Sensor node \300q    ID: 1064768
 Location:  (LONGITUDE: 1.4013e-45 ,LATITUDE: 1.5 ,HEIGHT: 7.00649e-45 )
 Remaining battery life: 3.50325e-44 amp hours
 Node is not functioning

Sensor node Garage   ID: 51
 Location:  (LONGITUDE: 87.2 ,LATITUDE: 93.1 ,HEIGHT: 0 )
 Remaining battery life: 20.5 amp hours
 Node is functioning

Sensor node Attic    ID: 52
 Location:  (LONGITUDE: 1.1 ,LATITUDE: 2.2 ,HEIGHT: 15.3 )
 Remaining battery life: 100.75 amp hours
 Node is functioning
Recognized command "Status"

Number of tokens: 7
Token 1: new_sensor_node
Token 2: Last ok node
Token 3: 51
Token 4: 87.2
Token 5: 93.1
Token 6: 0.0
Token 7: 20.5
Recognized command "New Sensor Node"

Number of tokens: 7
Token 1: new_sensor_node
Token 2: This one should not be added
Token 3: 52
Token 4: 1.1
Token 5: 2.2
Token 6: 15.3
Token 7: 100.75
Recognized command "New Sensor Node"

Number of tokens: 1
Token 1: halt
Recognized command "Halt"

一如既往,感谢您提供的任何帮助!对于大量的代码感到抱歉。

1 个答案:

答案 0 :(得分:0)

我解决了一个问题!我添加了strcpy行(SensorName,n);在我的传感器初始化后我的malloc之后。我正在分配空间,但实际上没有为其分配参数