Dyn. Arrays?

Hi,
ich bin vor kurzem von PHP auf C++ umgestiegen und stehe vor einem kleinen Problem:
Ich möchte eine Datei mit verschiedenen Koordinaten (die zu Blocks zusammengefasst sind) einlesen, verarbeiten und wieder in eine Datei speichern.
Soweit so gut.
In PHP hätte ich nun die Datei in ein mehrdimensionales dynamisches Array eingelesen und verarbeitet. Aber in C++ hab ich keine Ahnung wie man dynamische mehrdimensionale Arrays erstellt, deshalb hab ich sie bis jetzt erstmal statisch vordefiniert, was natürlich recht viel Speicher frisst und etwas umständlich im Umgang ist (neu compilieren, wenn sich die Datei ändert)
Ist es in C++ möglich dynamisch mehrdimensionale Arrays zu erstellen?
Oder macht man das objektorientiert?
Wenn ja, wie?

Danke schonmal für Hilfe
cu R.T.

Hallo R.T.,

habe gerade den korrekten Beitrag von Wortfuchs gelesen,
das ist aber möglicherweise etwas zu wenig erklärt. Daher
mein Senf zusätzlich …

Ich möchte eine Datei mit verschiedenen Koordinaten (die zu
Blocks zusammengefasst sind) einlesen, verarbeiten und wieder
in eine Datei speichern. Soweit so gut.
In PHP hätte ich nun die Datei in ein mehrdimensionales
dynamisches Array eingelesen und verarbeitet. Aber in C++ hab
ich keine Ahnung wie man dynamische mehrdimensionale Arrays
erstellt, deshalb hab ich sie bis jetzt erstmal statisch
vordefiniert, was natürlich recht viel Speicher frisst und
etwas umständlich im Umgang ist (neu compilieren, wenn sich
die Datei ändert)

Ein 2D-Array hat 2 Dimensionen, Du sprichst aber von
„Koordinaten“, also nehme ich an, dass die 2.Dimension
konstant ist (wieviele „Spalten“ hat ein Datensatz).

Du willst also einen 1-dimensionalen Vektor von
Daten des Typs [x,y,z,a] (oder sowas) haben.

Dann ist das „straightforward“.

  1. Den Typ einer Koordinate definieren:

    class COORD {
    public:
    double x, y, z;
    };

oder einen K-block direkt definieren:

typedef double COORD[3]; // ist jetzt double[3]
  1. einen Vektor davon bauen, z.B. mit der
    Standardbibliothek.

    #include ;
    using namespace std;

    vector koordinaten;

  2. der (schnelle) Zugriff auf die Vektorelemente, die schon
    da sind (nach dem Einlesen) ist dann

    resultat = koordinaten[p].x + koordinaten[q].x;

oder

 resultat = koordinaten[j][i] + koordinaten[i][j];
  1. beim Einlesen gehst Du z.B. wie folgt vor:

    COORD tmpval;
    tmpval.x = …, tmpval.y = …, tmpval.z = …
    koordinaten[i]. push_back (tmpval);

oder

COORD tmpval;
tmpval[0] = ..., tmpval[1] = ..., tmpval[2] = ...
koordinaten[i]. **push\_back** (tmpval);

die Funktion std::vector.push_back(…) macht
also das, was Du willst. Am Ende siehst Du
über

n = koordinaten.size()

wieviele
Koordinaten Du schon hast.

Grüße

CMБ

Hi,
ich bin vor kurzem von PHP auf C++ umgestiegen und stehe vor
einem kleinen Problem:
Ich möchte eine Datei mit verschiedenen Koordinaten (die zu
Blocks zusammengefasst sind) einlesen, verarbeiten und wieder
in eine Datei speichern.
Soweit so gut.

[…]

Im Header befindet sich ein dynamisches Array in Form eines Templates:

struct coord {
int x,y,z;
};

#include

std::vector dyn_array;

// element am Endy anfügen
coord gelesenes_element;
//…
dyn_array.push_back( gelesenes_element );

Und so kannst du abschliessend auf alle Elems zugreifen:

for( std::vector::iterator it=dyn\_array.begin(); it!=dyn\_array.end();++it)
{
 coord& elem = \*it;
 // ...
}

Gruß Markus

Danke erstmal für die schnelle Antwort!
Aber so sonderlich viel verstanden hab ich nicht :frowning:
Also 1. ist klar, sähe bei mir dann so aus:
class COORD{
public:
int x,y;
};
aber dann komm ich nicht mehr mit…

Ich glaub aber, ich hab mich etwas zweideutig ausgedrückt, deshalb nochmal das Ganze etwas anders :wink:

In der Datei befinden sich Koordinatenpaare, die jeweils zu Gruppen zusammengefasst sind.
In jeder dieser Gruppen wird aus den Koordinaten ein „Strich gezogen“ (also wie malen nach Zahlen :wink:), deshalb ergeben sich 2 verschiedene Arten von Gruppen: offene (wo Anfangspunkt und Endpunkt unterschiedlich sind) und geschlossene (wo Anfang und Ende gleich sind). (Die Unterteilung brauch ich für die späteren Berechnungen)
Bis jetzt hatte ich hierfür 4 2-dimensionale Arrays, also für jede Art von Gruppen folgendes:
x-werte[nummer_der_gruppe][nummer_des_punktes]
und
y-werte[nummer_der_gruppe][nummer_des_punktes]
So ist gesichert, dass die Punkte nicht durcheinander kommen
Nun ist es aber so, dass die Anzahl der Punkte pro Gruppe stark variiert und auch die Anzahl der Gruppen sowie der Verteilung dieser auf offene und geschlossene stark unterschiedlich ist, weshalb ich immer sehr reichlich mit den Array-Grenzen arbeiten musste (und dadurch enorm viel Ram ungenutzt verschwende)

Ich hoffe, das ist verständlicher :wink:
Ist das, was ihr da geschrieben habt dafür verwendbar?

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi,

In jeder dieser Gruppen wird aus den Koordinaten ein „Strich
gezogen“ (also wie malen nach Zahlen :wink:), deshalb ergeben
sich 2 verschiedene Arten von Gruppen: offene (wo Anfangspunkt
und Endpunkt unterschiedlich sind) und geschlossene (wo Anfang
und Ende gleich sind). (Die Unterteilung brauch ich für die
späteren Berechnungen)
Bis jetzt hatte ich hierfür 4 2-dimensionale Arrays, also für
jede Art von Gruppen folgendes:
x-werte[nummer_der_gruppe][nummer_des_punktes]
und
y-werte[nummer_der_gruppe][nummer_des_punktes]
So ist gesichert, dass die Punkte nicht durcheinander kommen
Nun ist es aber so, dass die Anzahl der Punkte pro Gruppe
stark variiert und auch die Anzahl der Gruppen sowie der
Verteilung dieser auf offene und geschlossene stark
unterschiedlich ist, weshalb ich immer sehr reichlich mit den
Array-Grenzen arbeiten musste (und dadurch enorm viel Ram
ungenutzt verschwende)

Aha, da brauchst Du zu

class COORD {
public: int x, y;
};

und

vector koordinaten;

noch zusätzlich einen

vector linked_with;

Vektor

Du liest die Koordinaten nacheinander ein wie gehabt
und schreibst aber , wenn koordinate[0] mit
koordinate[1] verbunden ist, ein linked_with[0] = 1;
Wenn [2] mit [3] verbunden ist, schreibst Du
linked_with[2] = 3; usw.

Also eine „display list“ :wink: Alles klar?

Grüße

CMБ

Ich glaub, nu hab ich’s :wink:

Fast jedenfalls:
bei koordinaten[anz].push_back(tmp); bringt mein Compiler folgenden Fehler: ‚push_back‘ is not a member of ‚COORD‘ in function main()

Was mach ich falsch?

Aaa soory, da habe ich vorhin einen Schreibfehler gemacht.
Du fügst ja ans Feld !koordinaten! an, also:

koordinaten.push_back(tmp);

ohne [anz]; push_back vergrößert wenn nötig das Feld und
erhöht size() um eins.

CMБ

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Jetzt funktionierts, DANKE!!!

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]