Ну из вашего нового комментария я постараюсь ответить на вопрос. Я делаю большую часть этого, чтобы показать вам одну возможность, мой код будет иметь некоторый временный разбор строк и не так много проверок на ошибки, это просто, чтобы дать вам представление о том, как вы можете это сделать.
Если вы хотите, чтобы пользователь указал размер массива, который вы хотите создать, это выполнимо.
#include <iostream>
#include <cstdlib>
int main(int argc, char **argv)
{
if (argc < 2) // the program's name is the first argument
{
std::cerr << "Not enough arguments!\n";
return -1;
}
int arraySize = std::atoi(argv[1]);
char *cArray = new char[arraySize];
delete [] cArray;
return 0;
}
Если вы запустите вышеупомянутую программу и передадите ей аргумент 500
, она выделит блок памяти для хранения до 500 * sizeof(char)
.
Если вы хотите, чтобы пользователь фактически дал вам имя массива и его размер, это немного отличается - вы не можете создать имя переменной во время выполнения. Единственное, что вы можете сделать, это отобразить строки в массивы.
Вот программа, которая принимает список аргументов, состоящий из таких аргументов, как hello[100]
, и создает отображение hello
на указатель на блок пространства для 100 элементов.
#include <iostream>
#include <cstdlib>
#include <map>
#include <string>
#include <boost/shared_ptr.hpp>
int main(int argc, char **argv)
{
std::map<std::string, boost::shared_ptr<char> > arrayMap;
for(int i = 1; i < argc; ++i)
{
// arguments are like 'hello[500]', 'array[100]
std::string s = argv[i];
std::size_t posOpen = s.find("[");
std::size_t posClose = s.find("]");
std::string name = s.substr(0, posOpen);
std::string size = s.substr(posOpen, posClose);
// remove the '[' and ']' characters
size.erase(0, 1);
size.erase(size.length()-1, 1);
std::cout << name << " " << size << std::endl;
// allocate our new array and wrap a shared_ptr around it
boost::shared_ptr<char> cptr(new char[std::atoi(size.c_str())]);
arrayMap[name] = cptr;
}
// now you can access the arrays 'by name'
return 0;
}
Если вы запустили приведенный выше код и передали ему список аргументов, таких как hello[500] array[1000] somelist[100]
, это создаст 3 выделенных кучи блока и отобразит им имена: "hello"
отобразит указатель на блок 500 * sizeof(char)
, "array"
будет отображаться на указатель на блок 1000 * sizeof(char)
, а "somelist"
будет отображаться на указатель на блок 100 * sizeof(char)
байтов.
Однако существует проблема с этим кодом выше - он не отслеживает количество байтов, выделенных для каждого указательного блока указателя, что делает его довольно бесполезным для вас. Одной из альтернатив будет сопоставление имен с boost::array<Typename T, std::size_t n>
, который будет классом фиксированного размера boost array
, который отслеживает его размер и имеет функцию-член size()
.