[C++] Zeiger auf Array

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
thuering
Beiträge: 26
Registriert: 1. November 2011 01:48

[C++] Zeiger auf Array

Beitrag von thuering »

Hallo Qtler,
Eine einfache Aufgabe für einen C++-Profi:

ich habe eine Funktion, die einen Zeiger auf ein Array zurückgeben soll. In das Array werden aus einer SQL-Datenbank Werte für eine Landkarte für ein kleines Spiel geschrieben...

Code: Alles auswählen

int( *MainWindow::get_map() )[30][30]
{
    [...]
    int tiletype[30][30];
    while(qry.next())
    {
        tiletype[qry.value(0).toInt()][qry.value(1).toInt()] = qry.value(2).toInt();
    }
    [...]
    return &tiletype;
}
Wie kann ich nun in folgender Funktion das Array weiterverwenden?

Code: Alles auswählen

void MainWindow::on_pushButton_clicked()
{
    int &addy = *get_map() [30][30];
    qDebug() << &addy;
}
*&*&*&*???
Momentan steht ja in &addy die Speicheradresse des ersten Arrayelements. Wie geht es weiter? Ja, dass sind absolute Basics, aber ich komme immer wieder durcheinander. Zum Glück erhebe ich nicht den Anspruch, Programmierer zu sein oder (jemals) programmieren zu können...
thuering
Beiträge: 26
Registriert: 1. November 2011 01:48

Re: [C++] Zeiger auf Array

Beitrag von thuering »

Vielen Dank, dass ist ja schonmal ein wichtiger Hinweis. Ich richte tiletype als Membervariable von MainWindow ein.
Ansonsten: Ja, der Code funktioniert. Aber mit welcher Syntax kann ich nun in der 2. Funktion auf tiletype[30][30] zugreifen?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: [C++] Zeiger auf Array

Beitrag von franzf »

Wie kommst du bitte auf sowas?

Code: Alles auswählen

int( *MainWindow::get_map() )[30][30]
Und das Arraygepfriemel ist fehleranfällig. Schreib dir eine eigene Klasse, die das mehrdimensionale Array in ein eindimensionales packt und Zugriffe mapped:

Code: Alles auswählen

class TIlemap {
std::array<int, 30*30> tiles;
public:
    int& tileAt(size_t x, size_t y) {
        return tiles[x*30+y];
    }
    int const& tileAt(size_ x, size_t y) const {
        return tiles[x*30+y];
    }
};
(Code ungetestet)
Du kannst das noch schön in ein template packen, dann ist es noch doller:

Code: Alles auswählen

template <typename TileT, size_t x_dim, size_t y_dim>
class TileMap;
(Implementierung sei dir überlassen)

Vorteile:
* Zugriffe sind sicher! asserts bei out-of-bound-Zugriff, const-correctness
* Automatisch kopierbar!
* Kein Rumgefrickel mit Pointern/arrays/pointer auf pointer auf sonstwas...
* sprechende API (Klassenname + Memberfunktion vs. irgend ein int**)
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: [C++] Zeiger auf Array

Beitrag von RHBaum »

eine Qt Collection
was genau meinst du damit ?

std::container vs. Qt Container, ich würd die Verwendung vom context abhaengig machen, es gibt auch gute Gruende für std gegen die Qt. Oft isses aber auch einfach Geschmackssache ....

@thuering
Deine Frage ist gar ned so trivial zu beantworten, weil allein die Definitionen der Bedingungen zur Frage schon nen faul darstellen.
die einen Zeiger auf ein Array zurückgeben soll
Man soll sich beim Design seiner Funktionen / Methoden schon ueber einige Dinge Klarwaerden.
In deinem Fall:
Deine Funktion gibt nen zeiger nach aussen, wer allokiert den Speicher fuer ?
muss ich den Speicher vom zeiger wieder loeschen ?

Funktionen wo man das Verhalten in die Doku schreiben muss, und sich drauf verlassen, das der Anwender (Entwickler) die liest sind eher schlecht ^^

Also formulier deine Bedingung zuerst etwas generischer, abstrakter, ohne schon Lösungen festzuschreiben ...

Deine Funktionalitaet soll was machen ?
Sie greift auf ne DB zu, ok
Und liefert Dir als Ergebniss eine paare (immer 2 ???) von werten (ints ???)
Sind es immer 30 ?
Wer verwendet die daten weiter ? Nur du, oder gibt es schon Vereinbarungen fuer das Format der Daten an was du dich halten musst (c-Kompatiblitaet z.B.) ??? .

Das Array selbst halt ich nicht fuer gegeben .... es gibt andere Lösungen.
Array impliziert, das Du deine Daten am Stueck in ner bestimmten Form vorliegen haben musst (c-Kompatiblitaet, befeuern von c - schnittstellen, schnellstmöglicher Index zugriff)
Ist das bei dir der Fall ?

Ciao ...
thuering
Beiträge: 26
Registriert: 1. November 2011 01:48

Re: [C++] Zeiger auf Array

Beitrag von thuering »

Vielen Dank für die Antworten.

RHBaum, es geht um eine Karte für ein kltzekleines Spiel. Für diese Karte werden mindestens 3 Werte gebraucht: X, Y und Typ des Spielfeldes (sowas wie, Wald, Wasser...). Die Werte lasse ich per QSql aus einer DB auslesen und schreibe sie momentan in ein Array. Danach wird das Array ausgelesen und die Spielfelder werden in ein QGraphicViewer gezeichnet... Vielleicht steige ich auch später auf eine QPixmap um, aber dann wirds wohl komplizierter mit dem

Die von franzf angebotene Lösung erscheint mit als Anfänger... kompliziert. :oops:

Momentan bin ich mit der Implementierung des Arrays als Membervariable schon sehr viel weitergekommen.
Jedoch kann das Array in der Tat nicht der Weisheit letzter Schluss sein. Mache ich das Array bspw. int map[1000][1000] groß, so stürzt mein Programm sofort ab... solche Größen sind aber für die Zukunft geplant.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: [C++] Zeiger auf Array

Beitrag von franzf »

thuering hat geschrieben:Die von franzf angebotene Lösung erscheint mit als Anfänger... kompliziert. :oops:
Ist sie aber nicht. Ich deute "kompliziert" jetzt als "verstehe ich nicht" ;)
Wenn du sagst womit du Probleme hast -> frag einfach!
Antworten