2016-03-26 3 views
1

это, вероятно, вопрос для новичков (я не пошел в школу для этого), но это задерживает меня в течение двух дней.Доступ к массиву в Library.cpp

Я пишу эскиз в Arduino для перемещения робота. Я храню свои позиции в массиве, как

int joint1[180]; 

Я получил это прекрасно работает и работает, если все в robot.ino, но теперь я хочу, чтобы поместить этот массив в самодельную библиотеке stringer.h и stringer.cpp но доступ это из .ino, чтобы сделать его немного легче понять для кого-то другого.

вопрос переопределенный i считывание домашнего кода jcode из sd в виде строки, я помещаю значения в int whit toint comand, затем я сохраняю это значение в 7 массивах joint1 [180] joint2 [180] и т. Д. Теперь Я хочу использовать массив в моем главном скрипте robot.ino, как я могу получить доступ к массиву whitin stringer.ccp, или я помещаю массивы в свой файл .ino и заставляю stringer отправлять строку robot.ino и делить ее там. ... это делает его очень трудно для других функций в стринге?

тест ситуация globals.h

//#include "Arduino.h" 
//#include "StandardCplusplus.h" 
//#include <vector> 
#include "globals.h" 



extern int Joint1[180]; 
extern int Joint2[180]; 
extern int Joint3[180]; 
extern int Joint4[180]; 
extern int Joint5[180]; 
extern int Joint6[180]; 
extern int Slomo[180]; 

globals.cpp

//#include "Arduino.h" 
//#include "StandardCplusplus.h" 
//#include <vector> 
#include "globals.h" 


int Joint1[180]; 
int Joint2[180]; 
int Joint3[180]; 
int Joint4[180]; 
int Joint5[180]; 
int Joint6[180]; 
int Slomo[180]; 

tester.ino

//#include "StandardCplusplus.h" 
#include <globals.h> 

int check = 100; 
int temp = 0; 

void setup() { 
for (int p = 0;p < check; p++){ 
Joint1[p] = p + 33;} 
} 

void loop() { 
if (temp < check){Serial.println(Joint1[temp]);temp = temp + 1;} 
} 

другой способ

globals.h

#include "Arduino.h" 
#include "StandardCplusplus.h" 
#include <vector> 
#include "globals.h" 



extern std::vector<int> Joint1; 
extern std::vector<int> Joint2; 
extern std::vector<int> Joint3; 
extern std::vector<int> Joint4; 
extern std::vector<int> Joint5; 
extern std::vector<int> Joint6; 
extern std::vector<int> Slomo; 

globals.cpp

#include "Arduino.h" 
#include "StandardCplusplus.h" 
#include <vector> 
#include "globals.h" 


std::vector<int> Joint1(180); 
std::vector<int> Joint2(180); 
std::vector<int> Joint3(180); 
std::vector<int> Joint4(180); 
std::vector<int> Joint5(180); 
std::vector<int> Joint6(180); 
std::vector<int> Slomo(180); 

я Виль получаю ошибку: #include вложенными слишком глубоко

+0

Вы можете [изменить свой вопрос] (http://stackoverflow.com/posts/36235289/edit), чтобы добавить дополнительную информацию. –

+0

Я сделал это, но он все еще находится на удержании – Nicolini

ответ

0

Не использовать массивы. Они плохие, тем более, что вы новичок в программировании. Вместо этого используйте std::vector. Объявите вектор в файле заголовка, как globals.h:

#ifndef GLOBALS_H 
#define GLOBALS_H 
#include <vector> 

extern std::vector<int> joint1; 

#endif 

Обратите внимание на ключевое слово extern. Это означает, что это только декларация для joint1. Определим вектор в исходном файле, как globals.cpp:

#include "globals.h" 

std::vector<int> joint1(180); 

При компиляции, не забудьте также составить globals.cpp с остальной частью ваших источников.

В исходных файлах, где требуется доступ к joint1, убедитесь, что:

#include "globals.h" 

Вы можете получить доступ к элементам в векторе таким же образом, как вы делаете с массивами:

joint1[index] 

Хотя с вы сказали, что вы новичок в программировании, я бы рекомендовал вместо этого использовать функцию at():

something = joint1.at(index); 
joint1.at(index) = something; 
// etc. 

Я рекомендую его, потому что он проверяет, пытаетесь ли вы получить доступ к элементу вне вектора. Если, например, вы пытаетесь:

joint.at(200) 

программа с прерыванием исключения.

Теперь, имея в виду, что такие глобальные переменные, как это, становятся утомительными и трудными в работе. Лучше не использовать глобальные переменные и вместо этого определять свои функции для получения необходимых данных в аргументах функций.

Если у вас нет доступа к стандартной библиотеке C++, и поэтому std :: vector недоступен, вы можете продолжать использовать массивы. extern декларация в globals.h:

extern int joint1[180]; 

и определение в .cpp:

int joint1[180]; 

Нет больше .at() или что-нибудь еще, хотя. Просто обычный старый [index].

+0

Танки до сих пор я собираюсь установить тест с этим и попробую, что вы предложили, может быть, я вернусь к этому – Nicolini

+0

helo снова снова проверил установку, но мой arduino ide doesn ' t переименовать вектор не называет класс, я уверен, делаю неправильно, я также получил mesage, нет такого файла-вектора, который ive искал поддерживающие файлы в Интернете, кажется, что он ограничен C++, а не arduino (но я уверенно делаю что-то не так) – Nicolini

+0

@Nicolini Без стандартной библиотеки C++ будет сложно заниматься разработкой на чем угодно. Взгляните на этот [вопрос] (http://stackoverflow.com/questions/9986591/vectors-in-arduino). Ответ ссылается на библиотеку, которая, если вы в состоянии использовать, сделает вашу жизнь намного проще. Обратите внимание, что чем больше вещей вы вкладываете, тем больше памяти ему нужно, и у arduino точно не хватает памяти. –

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