Como posso fazer este trabalho declaração?
-
05-07-2019 - |
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
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"