2013-05-01 4 views
0

Я пытаюсь закодировать робота, и у меня возникает запутанная ситуация. Мне нужно передать массив указателей на объекты в конструктор класса. Я не могу, однако, заполнить массив, прежде чем передать его в конструктор. Для этого я хочу передать указатель на указанный массив и получить доступ к его элементам из указателя. Проблема в том, что я новичок в C++, поэтому я не уверен в синтаксисе. Могли бы вы, ребята, помочь мне?Как передать указатель на массив указателей в качестве аргумента функции?

Код для основного файла

class RobotDemo : public SimpleRobot 
{ 
    Joystick stick; 
    JoystickOne joyOne; 
    Victor *victors [8]; 
public: 
    RobotDemo(void): 
     stick(1), 
     joyOne(&stick)// these must be initialized in the same order 
       // as they are declared above. 
        /*It doesnt seem like I can do anything but initialize things here*/ 
    { 
     /*Populate array with pointers to victors. Will need to update channels*/ 
     for (int x = 1; x <= 7; x++) { 
      victors[x] = new Victor(x); 
     } 
        /*And I don't think I can initialize anything here*/ 
     myRobot.SetExpiration(0.1); 
    } 

    /** 
    * Drive left & right motors for 2 seconds then stop 
    */ 
    void Autonomous(void) 
    { 
    } 

    /** 
    * Runs the motors with arcade steering. 
    */ 
    void OperatorControl(void) 
    { 
     myRobot.SetSafetyEnabled(true); 
     while (IsOperatorControl()) 
     { 
      joyOne.testForActions(); /*Check joystick one for actions*/ 
      Wait(0.005);    // wait for a motor update time 
     } 
    } 
    /** 
    * Runs during test mode 
    */ 
    void Test() { 

    } 
}; 

START_ROBOT_CLASS(RobotDemo); 

Вот код класса JoystickInput, что класс JoystickOne расширяет

//the .h 
#ifndef JOYSTICKINPUT_H 
#define JOYSTICKINPUT_H 

#include "WPILib.h" 

class JoystickInput { 
    public: 
     JoystickInput(Joystick*); 
     JoystickInput(Joystick*, Victor* [8]); 
     Joystick * joystick; 
     bool buttons [10]; 
     Victor** victors [8]; 
     bool buttonClicked(int id); 
     virtual void testForActions(); 
}; 
#endif 

//and the .cpp 
#include "JoystickInput.h" 

JoystickInput::JoystickInput(Joystick * joy) { 
    joystick = joy; 
    for (int x = 0; x < 10; x++) { 
     buttons[x] = false; 
    } 
} 
JoystickInput::JoystickInput(Joystick * joy, Victor* vicArray [8]) { 
    joystick = joy; 
    for (int x = 0; x < 10; x++) { 
     buttons[x] = false; 
    } 
    for (int n = 0; n <=7; n++) { 
     *victors[n] = vicArray[n]; 
    } 
} 

bool JoystickInput::buttonClicked(int id) { 
    if (buttons[id] == false and joystick->GetRawButton(id) == true) { 
     buttons[id] = true; 
     return true; 
    } else if (buttons[id] == true and joystick->GetRawButton(id) == false) { 
     buttons[id] = false; 
     return false; 
    } else { 
     return false; 
    } 
} 

void JoystickInput::testForActions() { 
} 

, что я прошу вас, ребята, чтобы помочь мне сделать это переделки конструктор JoystickInput(), так что он также принимает указатель на массив указателей (на Victors) и выполняет методы на элементах массива. Googling это не оказалось ничего полезного. Я изучил его больше, но это было несколько дней, и я все еще вешал это.

Спасибо за помощь (а если нет, то, по крайней мере, прочитав мой пост)!

+1

'typedef Victor * (* array_of_pointers) [8]; array_of_pointers victors; ' –

+0

вы могли бы разработать? – pipsqueaker117

+0

'Victor ** victors [8];' трудно оборачивать голову, это массив из восьми указателей на 'Victor *'? Это 3D-массив? Почему так много указателей? –

ответ

2

Вы должны быть в состоянии использовать:

JoystickInput(Joystick*, Victor**, int); 

и просто передать vicArray в конструктор. Если победители могут быть чем-то иным, чем массив длиной 8, то вы также должны передать длину в качестве аргумента, потому что C++ не может найти длину массива из указателя.

+0

Просто чтобы уточнить, почему вы не ставите [размер] после Виктора **? Я думал, что указатели на массивы указателей должны были быть переданы с размером [size] добавлено – pipsqueaker117

+0

. Какова была бы разница (и правильный путь) для доступа к элементу массива: * victors [i] -> Метод или просто победители [i] -> метод? – pipsqueaker117

+0

@ pipsqueaker117: размер действительно нужен только для 2-х массивов, которых, похоже, нет. Доступ будет «victors [i] ->' –

2

Всякий раз, когда типы получить сложные (функции или массивы), используйте ЬурейеЕ:

typedef char char_buffer_type[8]; //char_buffer_type is an array 
typedef char (*char_buffer_ptr)[8]; //char_buffer_ptr is a pointer to an array 
typedef char (&char_buffer_ref)[8]; //char_buffer_ref is a reference to an array 

typedef int main_type(int, char**); //main_type is a "int(int, char**)" function 

typedef Victor*(array_of_ptr)[8]; //array_of_ptr is an array of 8 Victor* 

Кроме того, вы должны назвать значения 8 и 10.

class JoystickInput { 
    public: 
     static const int victor_count = 8; 
     static const int button_count = 10; 
     typedef Victor*(array_of_victor_ptr)[victor_count]; 

     JoystickInput(Joystick*){} 
     JoystickInput(Joystick*, array_of_victor_ptr& vicArray); 
     bool buttonClicked(int id){return true;} 
     virtual void testForActions(){} 

     Joystick * joystick; 
     bool buttons [button_count]; 
     array_of_victor_ptr victors; //that's simpler 
}; 

//then pass this one by reference 
JoystickInput::JoystickInput(Joystick * joy, array_of_victor_ptr& vicArray) { 
    joystick = joy; 
    for (int x = 0; x < button_count; x++) { 
     buttons[x] = false; 
    } 
    for (int n = 0; n < victor_count; n++) { 
     victors[n] = vicArray[n]; //don't have to dereference here anymore 
    } 
} 

Proof of compilation. Typedefs замечательные. Используй их.

+0

Эй, спасибо за помощь. Одна вещь, как мне передать победителей (переменную) из основного файла? Я даю это как просто победителям, как победителям или победителям? Я чувствую, что я бы прошел & победителей, но я хотел, чтобы ваш совет/правильный ответ. Я все равно буду экспериментировать, просто спрашиваю – pipsqueaker117

+0

Это зависит от типа «победителей» в основном файле.Если это массив, то, поскольку 'array_of_victor_ptr & vicArray' является ссылкой на массив, вы просто передаете' победителям'. Если 'victors' является указателем на массив, то вы передадите' * победителям'. '& victors' даст вам указатель на что-то, чего не ожидает функция. –

+0

победители - это массив указателей на объекты Виктора – pipsqueaker117

Смежные вопросы