Question

EDIT: J'ai aussi reçu une réponse pour faire du secteur un vecteur de vecteurs:

vector<vector<char>>sector;

et cela supprime le reste de mes erreurs.

EDIT: J'ai créé un tableau de pointeurs sur le secteur, comme le suggère quelqu'un, et j'ai toujours trois erreurs:

EDIT: J'ai modifié le programme, mais toutes les erreurs ne sont pas corrigées:

J'ai cette section d'un programme:

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

Et j'obtiens ces erreurs:

ligne 5 > erreur C2540: expression non constante définie comme un tableau lié

ligne 5 > erreur C2440: 'initialisation': impossible de convertir de 'char (*) [1]' en 'char **'

ligne 14 > erreur C3861: 'seekg': identificateur introuvable

per seekg: oui, je sais que je dois inclure fstream. J'ai inclus cela dans main.cpp. Il s'agit d'un fichier .h séparé également inclus dans main.cpp.

Comment puis-je corriger les erreurs? Plus précisément, comment corriger les erreurs en conservant toutes mes variables globales?

En outre, si cela vous aide, il s'agit de map_data.txt:

10
10
00O
99!

1
55X
19
What is a question?
18
This is an answer
1
1
2
1
Était-ce utile?

La solution

Eh bien,

function load_data (int, int) renvoie un caractère. Vous passez ce caractère à la fonction atoi, qui prend un caractère *. En plus de cela, vous n'incluez probablement pas le fichier d'en-tête stdlib.h !!

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

Si vous ne souhaitez pas inclure stdlib.h, vous pouvez déclarer atoi en tant qu'extern, mais sachez que vous compilez ce module.

extern int atoi(const char*)

Tenez compte du fait que l'argument de la fonction atoi doit être une chaîne terminée par un zéro.

Pour que votre code fonctionne, vous devez faire en sorte que les données de chargement de fonction renvoient un caractère *, pas un caractère.

char* load_data(int,int);

Alors, maintenant vous pourriez faire

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

Si vous êtes en C ++, la fonction load_data peut renvoyer un std :: string.

std::string load_data(int,int)

puis utilisez la méthode c_str (), qui retourne une chaîne C depuis une chaîne C ++.

   const char* std::string:c_str()


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

En plus de cela, vous ne devriez pas

(concernant

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

Vous devriez

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

et n'oubliez pas de libérer cette mémoire

delete[](sector);

Autres conseils

Vous ne pouvez pas renvoyer un pointeur sur une variable de pile. Et les tableaux doivent être retournés en tant que types de pointeur.

Essayez:

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;

Je ne suis pas tout à fait sûr du but de votre exercice. Mais si vous voulez lire les "éléments" d'un fichier et les obtenir dans le format que vous attendez (comme int, strings ...), vous pouvez simplement utiliser l'opérateur > > et getline comme ceci:

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

Et vous obtenez une sortie comme ceci:

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

Est-ce ce que vous recherchiez? REMARQUE: j'utilise c ++ car j'ai remarqué que vous avez mentionné "main.cpp"

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top