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
È stato utile?

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 "

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top