Pregunta

EDITAR: También obtuve una respuesta para hacer que el sector sea un vector de vectores:

vector<vector<char>>sector;

y eso elimina el resto de mis errores.

EDITAR: he hecho sector una serie de punteros como alguien sugirió, y todavía tengo tres errores:

EDITAR: He editado el programa, pero no ha corregido todos los errores:

Tengo esta sección de un 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;
}

Y me sale estos errores:

línea 5 > error C2540: expresión no constante como matriz enlazada

línea 5 > error C2440: 'inicializando': no ??se puede convertir de 'char (*) [1]' a 'char **'

línea 14 > error C3861: 'seekg': identificador no encontrado

por búsqueda: sí, sé que tengo que incluir fstream, lo incluí en main.cpp, este es un archivo .h separado también incluido en main.cpp.

¿Cómo soluciono los errores? Específicamente, ¿cómo puedo corregir los errores manteniendo todas mis variables globales?

Además, si ayuda, esto es map_data.txt:

10
10
00O
99!

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

Solución

Bueno,

function load_data (int, int) devuelve un char. Estás pasando ese char a la función atoi, que toma un char *. Además de eso, ¡probablemente no esté incluyendo el archivo de encabezado stdlib.h!

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

Si no desea incluir stdlib.h, puede declarar atoi como externo, pero tenga en cuenta cuando compile este módulo.

extern int atoi(const char*)

Tenga en cuenta que el argumento de la función atoi debe ser una cadena terminada en nulo.

Para que su código funcione, debe hacer que los datos de carga de la función devuelvan un char *, no un char.

char* load_data(int,int);

Entonces, ahora podrías hacer

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

Si estás en C ++, la función load_data podría devolver un std :: string.

std::string load_data(int,int)

y luego use el método c_str (), que devuelve una C-String de una cadena de C ++.

   const char* std::string:c_str()


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

Además de eso, no deberías

(con respecto a

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

Deberías

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

y no olvides liberar esta memoria

delete[](sector);

Otros consejos

No puede devolver un puntero a una variable de pila. Y las matrices deben devolverse como tipos de punteros.

Prueba:

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;

No estoy muy seguro de cuál es el objetivo de tu ejercicio. Pero si desea leer 'cosas' del archivo y obtener el formato que espera (como int, strings ...) puede usar el operador > > y getline como este:

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

Y obtienes una salida como esta:

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

¿Es eso lo que estabas buscando? NOTA: Estoy usando c ++ porque noté que mencionaste '' main.cpp ''

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top