Как я могу заставить эту декларацию работать? - PullRequest
0 голосов
/ 05 мая 2009

РЕДАКТИРОВАТЬ: я также получил ответ, чтобы сделать сектор векторов векторов:

vector<vector<char>>sector;

, и это избавляет от всех моих ошибок.

РЕДАКТИРОВАТЬ: я сделал сектор массив указателей, как кто-то предложил, и все еще получаю три ошибки:

РЕДАКТИРОВАТЬ: я отредактировал программу, но она не исправила все ошибки:

У меня есть этот раздел программы:

char* load_data(int begin_point,int num_characters);
ifstream mapdata("map_data.txt");
const int maxx=atoi(load_data(0,2));
const int maxy=atoi(load_data(2,2));
char** sector=new char[maxx][maxy];

char* load_data(int begin_point,int num_characters)
{
    seekg(begin_point);
    char* return_val=new char[num_characters+1];
    mapdata.getline(return_val,num_characters);
    return return_val;
}

И я получаю эти ошибки:

строка 5> ошибка C2540: непостоянное выражение в виде границы массива

строка 5> ошибка C2440: «инициализация»: невозможно преобразовать из «char (*) [1]» в «char **»

строка 14> ошибка C3861: «seekg»: идентификатор не найден

за поиск: да, я знаю, что должен включить fstream, я включил это в main.cpp, это отдельный файл .h, также включенный в main.cpp.

Как исправить ошибки? В частности, как я могу исправить ошибки, сохраняя все мои переменные глобальными?

Также, если это поможет, это map_data.txt:

10
10
00O
99!

1
55X
19
What is a question?
18
This is an answer
1
1
2
1

Ответы [ 3 ]

0 голосов
/ 05 мая 2009

Ну,

функция load_data (int, int) возвращает символ. Вы передаете этот символ функции atoi, которая принимает символ *. Кроме того, вы, вероятно, не включаете заголовочный файл stdlib.h !!

#include <cstdlib>
int atoi(const char*);

Если вы не хотите включать stdlib.h, вы можете объявить atoi как extern, но помните, что при компиляции этого модуля.

extern int atoi(const char*)

Учтите, что аргумент функции atoi должен быть строкой с нулевым символом в конце.

Чтобы ваш код работал, вы должны заставить данные загрузки функции возвращать символ *, а не символ.

char* load_data(int,int);

Итак, теперь вы можете сделать

//notice these aren't const, they rely on non-compile time available data.
int maxx = atoi (load_data(....));
int maxy = atoi (load_data(....));

Если вы находитесь в C ++, функция load_data может вернуть std :: string.

std::string load_data(int,int)

, а затем используйте метод c_str (), который возвращает C-строку из строки C ++.

   const char* std::string:c_str()


    int maxx = atoi(load_data(....).c_str());
    int maxy = atoi(load_data(....).c_str());

В дополнение к этому, вы не должны

line 5>error C2540: non-constant expression as array bound

line 5>error C2440: 'initializing' : cannot convert from 'char (*)[1]' to 'char **'

)

char sector[maxx][maxy]; 

Вы должны

 char** sector = new char[maxx][maxy]();

и не забудьте освободить эту память

delete[](sector);
0 голосов
/ 05 мая 2009

Я не совсем уверен, какова цель вашего упражнения. Но если вы хотите прочитать «материал» из файла и получить его в ожидаемом формате (например, int, strings ...), вы можете просто использовать operator >> и getline следующим образом:

#include <fstream>
#include <string>

using namespace std;

int main()
{
    ifstream ifs("data.txt");
    if (!ifs.is_open()) return 0;

    int maxx;
    int maxy;

    ifs >> maxx >> maxy;
    cout << maxx << " " << maxy << endl;

    // ----

    char OO_0[4];       // can use char[] or string, see next
    ifs >> OO_0;
    OO_0[sizeof(OO_0)] = 0;

    cout << OO_0 << endl;

    // ----
    string _99;
    ifs >> _99;

    cout << _99 << endl;

    int one;
    string _55_X;
    int _19;
    string what_is;

    ifs >> one >> _55_X >> _19 >> ws;
    // ws gets rid of white space at the end of the line ...
    // this is because getline would only read that ws up to eol

    getline(ifs,what_is);

    cout << one << " " << _55_X << " " << _19 << " " << what_is << endl;

    ifs.close();
}

И вы получите такой вывод:

10 12
00O
99!
1 55X 19 What is a question?

Это то, что вы были после? ПРИМЕЧАНИЕ: я использую c ++, потому что заметил, что вы упомянули "main.cpp"

0 голосов
/ 05 мая 2009

Вы не можете вернуть указатель на переменную стека. И массивы должны быть возвращены как типы указателей.

Попытка:

char* load_data(int begin_point,int num_characters)
{
    seekg(begin_point);
    char* return_val = new char[num_characters+1];
    mapdata.getline(return_val, num_characters);
    return return_val;
}

char* foo = load_data(...);
...
delete [] foo;
...