Pergunta

EDIT: Eu também tenho uma resposta para o setor faça um vetor de vetores:

vector<vector<char>>sector;

e que se livrar do resto dos meus erros.

EDIT: Eu fiz setor uma matriz de ponteiros como alguém sugeriu, e ainda obter três erros:

EDIT: Eu editei o programa, mas não fixou todos os erros:

Eu tenho essa seção de um programa:

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;
}

E eu recebo esses erros:

linha 5> erro C2540: expressão não constante como matriz ligada

linha 5> Erro C2440: 'inicializar': não é possível converter de 'char (*) [1]' para 'char **'

linha 14> Erro C3861: 'seekg': identificador não encontrado

per seekg: sim, eu sei que tenho que incluem fstream, eu incluído, que em main.cpp, este é um arquivo .h separado também incluídas no main.cpp

.

Como faço para corrigir os erros? Especificamente, como eu corrigir os erros, mantendo todas as minhas variáveis ??global?

Além disso, se isso ajuda, este é map_data.txt:

10
10
00O
99!

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

Solução

Bem,

função load_data (int, int) retorna um char. Você está de passagem, que char para a função atoi, que leva um char *. Além disso, você provavelmente não está incluindo stdlib.h arquivo de cabeçalho !!

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

Se você não wan't para incluir stdlib.h, então você poderia declarar atoi como externo, mas esteja ciente de quando você compilar este módulo.

extern int atoi(const char*)

Leve em conta que o argumento da função atoi deve ser uma string terminada em null.

Para que o seu código para trabalho, você deve tornar os dados de carga função retornar um char *, não um char.

char* load_data(int,int);

Então, agora você pode fazer

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

Se você estiver em C ++, a função load_data poderia retornar um std :: string.

std::string load_data(int,int)
Método

e, em seguida, o uso c_str (), que retorna um String C a partir de uma cadeia de C ++.

   const char* std::string:c_str()


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

Além disso, você não deve

(relação

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]; 

Você deve

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

E não se esqueça de libertar esta memória

delete[](sector);

Outras dicas

Você não pode retornar um ponteiro para uma variável de pilha. E matrizes precisam ser devolvidos como tipos de ponteiro.

Tente:

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;

Eu não estou completamente certo o que é o objetivo do seu exercício. Mas se você quiser ler 'coisas' a partir do arquivo e obtê-lo no formato que você espera (como int, cordas ...) você pode simplesmente usar o operador >> e getline assim:

#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();
}

E você começa uma saída como esta:

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

É isso que você estava atrás? NOTA: Eu estou usando c ++ porque eu percebi que você mencionou "main.cpp"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top