Come posso far funzionare questa dichiarazione?
-
05-07-2019 - |
Domanda
EDIT: ho anche avuto una risposta per rendere il settore un vettore di vettori:
vector<vector<char>>sector;
e questo elimina il resto dei miei errori.
EDIT: ho fatto del settore un array di puntatori come suggerito da qualcuno, e ancora ottengo tre errori:
EDIT: ho modificato il programma, ma non ha corretto tutti gli errori:
Ho questa sezione di un programma:
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 ottengo questi errori:
riga 5 > errore C2540: espressione non costante come limite di matrice
riga 5 > errore C2440: "inizializzazione": impossibile convertire da "char (*) [1]" a "char **"
riga 14 > errore C3861: "seekg": identificatore non trovato
per seekg: sì, lo so che devo includere fstream, ho incluso quello in main.cpp, questo è un file .h separato incluso anche in main.cpp.
Come posso correggere gli errori? In particolare, come posso correggere gli errori mantenendo tutte le mie variabili globali?
Inoltre, se aiuta, questo è map_data.txt:
10
10
00O
99!
1
55X
19
What is a question?
18
This is an answer
1
1
2
1
Soluzione
Bene,
funzione load_data (int, int) restituisce un carattere. Stai passando quel carattere alla funzione atoi, che richiede un carattere *. Inoltre, probabilmente non stai includendo il file di intestazione stdlib.h !!
#include <cstdlib>
int atoi(const char*);
Se non vuoi includere stdlib.h, puoi dichiarare atoi come extern, ma fai attenzione quando compili questo modulo.
extern int atoi(const char*)
Tieni presente che l'argomento della funzione atoi deve essere una stringa con terminazione null.
Affinché il codice funzioni, è necessario fare in modo che i dati di caricamento delle funzioni restituiscano un carattere *, non un carattere
char* load_data(int,int);
Quindi, ora potresti farlo
//notice these aren't const, they rely on non-compile time available data.
int maxx = atoi (load_data(....));
int maxy = atoi (load_data(....));
Se si è in C ++, la funzione load_data potrebbe restituire uno std :: string.
std::string load_data(int,int)
e quindi utilizzare il metodo c_str (), che restituisce una stringa C da una stringa C ++.
const char* std::string:c_str()
int maxx = atoi(load_data(....).c_str());
int maxy = atoi(load_data(....).c_str());
Inoltre, non dovresti
(per quanto riguarda
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];
Dovresti
char** sector = new char[maxx][maxy]();
e non dimenticare di liberare questa memoria
delete[](sector);
Altri suggerimenti
Non puoi restituire un puntatore a una variabile di stack. E le matrici devono essere restituite come tipi di puntatore.
Prova:
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;
Non sono sicuro di quale sia l'obiettivo del tuo esercizio. Ma se vuoi leggere 'stuff' da un file e ottenerlo nel formato che ti aspetti (come int, stringhe ...) puoi semplicemente usare l'operatore > > e getline in questo modo:
#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 ottieni un output come questo:
10 12
00O
99!
1 55X 19 What is a question?
È quello che stavi cercando? NOTA: sto usando c ++ perché ho notato che hai citato " main.cpp "