Frage

EDIT: Ich habe auch eine Antwort Sektor ein Vektor von Vektoren zu machen:

vector<vector<char>>sector;

und wird der Rest meiner Fehler beseitigen.

EDIT: Ich habe gemacht Sektor ein Array von Zeigern als jemand vorschlug, und immer noch drei Fehler:

EDIT: Ich habe das Programm bearbeitet, aber es hat nicht alle Fehler behoben:

Ich habe diesen Abschnitt eines Programms:

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

Und ich bekomme diese Fehler:

Zeile 5> Fehler C2540: nicht konstanter Ausdruck als Array gebunden

Zeile 5> Fehler C2440: 'initialisieren': kann nicht von 'char (*) [1]' auf 'char **'

Zeile 14> Fehler C3861: 'seekg': Bezeichner nicht gefunden

pro seekg: ja, ich weiß, ich habe fstream aufzunehmen, ich eingeschlossen, dass in main.cpp, das eine separate .h-Datei ist auch in main.cpp enthalten

.

Wie behebe ich die Fehlermeldung? Genauer gesagt, wie ich beheben die Fehler während alle globalen meine Variablen zu halten?

Auch wenn es hilft, ist dies map_data.txt:

10
10
00O
99!

1
55X
19
What is a question?
18
This is an answer
1
1
2
1
War es hilfreich?

Lösung

Nun,

Funktion load_data (int, int) gibt ein Zeichen. Sie passieren, dass die Zeichen auf die atoi Funktion, die eine char * nimmt. Zusätzlich zu diesem, sind Sie wahrscheinlich nicht einschließlich stdlib.h Header-Datei !!

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

Wenn Sie wan't nicht enthalten stdlib.h, dann könnten Sie atoi als extern deklarieren, aber beachten Sie, wenn Sie dieses Modul kompiliert werden.

extern int atoi(const char*)

Beachten Sie, dass das Argument der Funktion atoi ein nullterminierten String sein muss.

Damit Ihr Code arbeiten, sollten Sie Funktion Lastdaten geben einen char *, kein Zeichen.

machen
char* load_data(int,int);

So, jetzt könnten Sie tun,

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

Wenn Sie in C ++, könnte load_data Funktion zurückgeben eine std :: string.

std::string load_data(int,int)

und dann c_str () Methode verwendet werden, die eine C-String aus einer C ++ String zurückgibt.

   const char* std::string:c_str()


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

Zusätzlich zu, dass, sollten Sie nicht

(in Bezug auf

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

Sie sollten

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

und vergessen Sie nicht, diesen Speicher frei

delete[](sector);

Andere Tipps

Sie können einen Zeiger auf einen Stapel Variable zurück. Und Arrays müssen als Zeigertypen zurückgegeben werden.

Versuchen:

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;

Ich bin mir nicht ganz sicher, was das Ziel Ihrer Übung. Aber wenn Sie ‚Zeug‘ aus Datei lesen wollen und bekommen es in Format, das Sie (wie int, strings ...) erwarten Sie können einfach verwenden Operator >> und getline wie folgt aus:

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

Und Sie erhalten eine Ausgabe wie folgt aus:

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

Ist das, was Sie nach waren? HINWEIS: Ich verwende c ++, weil ich bemerkt, dass Sie „main.cpp“ genannt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top