Zweidimensionale Arrays?

… oder Matritzen, wie man es auch nennen will.

Gestern den Tag damit kaputt gemacht;

double * m1;
m1 = new double[xsize,ysize];

Ich weiss (jetzt), dass es richtig heissen
muss „double[xsize][ysize]“, und dass
ysize eine Konstante sein muss, aber
*warum* zum &%§$%!!! bringt dieses
Sch…! Visual C++ bei […,…] keine
Fehlermeldung?

Durch Rumprobieren hab ich den Eindruck,
dass hier die erste Komponente einfach
ignoriert wird. Ist dem so?
Wenn ja, warum?

Welcher Schlaumeier ist auf die Idee gekommen,
nur die erste Komponente Variabel definieren
zu duerfen?
Was ist hier der Grund?
Wie kann man diese Beschränkung umgehen?

(Selber Addresse so nach dem Motto [x+xsize*y]
berechnen ist einfach eines Programmierers mit
Selbstachtung unwürdig, und ausserdem kann
eine Sprache doch nicht so bloed sein, dass
sie nicht das Komma [x,y] durch [x+xsize*y] ersetzen
kann, oder? )

Gruss, Marco

P.S. hab grad Frust mit Microschrott VC++

Unwürdig?

(Selber Addresse so nach dem Motto [x+xsize*y]
berechnen ist einfach eines Programmierers mit
Selbstachtung unwürdig, und ausserdem kann
eine Sprache doch nicht so bloed sein, dass
sie nicht das Komma [x,y] durch [x+xsize*y] ersetzen
kann, oder? )

Hab in C nicht soviel mit Arrays gemacht, deshalb dazu keine genaue Antwort, aber:

Zum Thema unwürdig:

Ein richtiger Programmierer nutzt „Datenabstraktion“. Dies bedeutet, dass du eine Procedure zur Lesen und zum Schreiben plus evtl. weitere das Array betreffende Proceduren hast:

void ScheibArray(int posX,int posY)
{ /\* Hier drin Wert im Array setzen, dieses entweder kapseln (ADO/Objekt) oder Zeiger mit übergeben\*/}

double LeseArray(int posX,int posY) {
 return(/\* Hier Wert zurückgeben\*/);
}

(Pseudocode)

Damit erreichst du, dass du oder jeder andere das Array nutzen kann, egal wie du es implementiert hast. Du kannst es eindimensional implementieren, nachher ändern usw, der Rest bleibt davon ungestört…

Ralph :smile:
(Leider erst in 5-6 Monaten Dipl.) Informatiker

Hallo,

das mit den Konstanten hat was mit Speicherverwaltung und Zeigerarithmetik zu tun, unter anderem auch, weil jedes mehrdimensionales Array im Speicher serialisiert werden muss.

Allgemein gilt:

zeiger = new datentyp [z1][z2_const]…[zn_const];

Des weiteren ist Deine Initialisierung falsch. Als Beispiel gilt:

double (*p)[5] = new double [x][5];

Das heisst hier: Ein 2-dim Array bestehend aus x Elementen (seriell) von denen jedes Unter-Array aus 5 double Werten besteht. Belegt der double beispielhaft 4 Bytes, so gilt bei folgender Pointer-Arithmetik:

p+2 Verschiebe den Pointer vom Anfang des Array’s um 2 Einheiten, sprich 2*5*4 Bytes = 40 Bytes im Speicher weiter. Analog gilt dies für ein n-dim Array. Pointer-Arithmetik sind die Stärke von C/C++ aber auch gefährlich, wenn man den Überblick verliert.

Übrigens gilt bezogen auch Beispiel oben:

double (*p)[5] ist nicht gleich double *p[5] !!!

Denn zweites ist ein 5-elementiges Array, dessen Elemente vom Typ Pointer auf double sind!

Ciao

Hi,
wenn Du ein zweidimensionales Array im Heap erstellen willst, dann must Du einen Zeiger auf einen Zeiger deklarieren, und ihm dann von ‚Hand‘ weiteren Speicherplatz zuweisen.

als Bsp:

 double \*\*z = new double\*[x];
 for (int i=0;i

damit hast Du dann ein zweidimensionales Array aus Zeigern, Die aud doubles zeigen und kannst sie mit z[1][6] benutzen.

grüße

Danke!

double **z = new double*[x];
for (int i=0;i

Das ist genau das, was ich gesucht habe!

Ein richtiger Programmierer nutzt „Datenabstraktion“.
Dies bedeutet, dass du eine Procedure zur Lesen und zum
Schreiben plus evtl. weitere das Array betreffende Proceduren
hast:

void ScheibArray(int posX,int posY)
{ /* Hier drin Wert im Array setzen, dieses entweder kapseln
(ADO/Objekt) oder Zeiger mit übergeben*/}

double LeseArray(int posX,int posY) {
return(/* Hier Wert zurückgeben*/);
}

(Pseudocode)

Naja, gekapselt ja, aber ich will ja
nicht, dass der Computer 90% seiner Zeit mit
Kapselöffnen verbringt, will heißen: Die
Anzahl der Maschinenbefehle, um LeseArray(…)
zu realisieren sind bei weitem höher als
die für array[x]

Aber es sieht natürlich schöner aus :smile:

Gruss,
Marco

Hallo,

Dein Array ist nach wie vor 1-dimensional!

bei dem Vergleich, dass die Schreibeweise

double (*p)[5] ungleich double *p[5]

ist, hat man es in beiden Faellen um ein 2-dim Array zu tun. Die Ausssage war nicht, wie man den zweiten Fall oben speichermaessig allokiert, sondern die Aussage war nur, dass man es im 1. Fall um eine 2-dim Array Deklaration zu tun hat, dessen Basis Elemente vom Typ double sind und im zweiten Fall Elemente vom Typ Pointer auf double.

In euren beiden Fällen hat es nach wie vor mit einem 1-dim Array zu tun. Die Frage war aber nach 2-dim. Des weiteren ist ein Pointer auf Pointer rechentechnisch was anderes als ein Pointer der auf „5 Pointer“ zeigt. Bei Pointer-Arithmetik sind die Verschiebungsgrössen im Speicher völlig verschieden.

Ciao

So ein Scheiss!

Naja, gekapselt ja, aber ich will ja
nicht, dass der Computer 90% seiner Zeit mit
Kapselöffnen verbringt, will heißen: Die
Anzahl der Maschinenbefehle, um LeseArray(…)
zu realisieren sind bei weitem höher als
die für array[x]

Tut mir leid, dass ich nochmal dazwischen hauen muss, aber das ist nun wirklich absoluter Schwachsinn! Bei den heutigen PCs kommt es natürlich aus die 2 Rechenoperationen an und nachher wundern sich alle, warum das Ding nicht mehr wartbar ist! Du benutzt wahrscheinlich auch keine Konstanten (Warum eine Konstante nehmen, wenn die sowieso 1 ist, dann kann ich auch 1 schreiben…), benutzt wahrscheinlich die C-Kryptosprache (++a*^b–…) weils ja schneller zu tippen ist, tippst keine Kommentare, weil du ja weisst, was du gerade machst, speicherst deine Daten lieber in einem eigenem Format als in XML, weil da die Dateien so groß sind und das umständlich ist, usw…

Wartung, Portabilität, Adaptabilität, … nie gehört…

Wenn du noch nie was von Softwareentwicklung gehört hast, solltest du nicht darüber schreiben, was einem Programmierer unwürdig ist, sondern überlegen, ob nicht dir der Titel Programmierer unwürdig ist.

Ralph :wink:

P.S.: Ach du scheisse, in C gibt es ja den Befehl/Precompileroption INLINE (o.ä., oder irre ich mich da), dann ersetzt der Compiler den Ausruf durch das Programmstück, dann werden es bei der Ausführung ja gar nicht mehr mehrere Befehle, und weg ist das Argument…

Bitte ein anderer Ton!

Tut mir leid, dass ich nochmal dazwischen hauen muss, aber das
ist nun wirklich absoluter Schwachsinn! Bei den heutigen PCs
kommt es natürlich aus die 2 Rechenoperationen an und nachher
wundern sich alle, warum das Ding nicht mehr wartbar ist! Du
benutzt wahrscheinlich auch keine Konstanten (Warum eine
Konstante nehmen, wenn die sowieso 1 ist, dann kann ich auch 1
schreiben…), benutzt wahrscheinlich die C-Kryptosprache
(++a*^b–…) weils ja schneller zu tippen ist, tippst keine
Kommentare, weil du ja weisst, was du gerade machst,
speicherst deine Daten lieber in einem eigenem Format als in
XML, weil da die Dateien so groß sind und das umständlich ist,
usw…

Wartung, Portabilität, Adaptabilität, … nie gehört…

Wenn du noch nie was von Softwareentwicklung gehört hast,
solltest du nicht darüber schreiben, was einem Programmierer
unwürdig ist, sondern überlegen, ob nicht dir der Titel
Programmierer unwürdig ist.

Ralph :wink:

Unbedacht Inkompetenz zu unterstellen
verletzt den Gesprächspartner
oft heftig. Dein Ton ist zu aggressiv.

Inhaltlich lass Dir gesagt sein, dass ein toll
strukturiertes Programm, dass aber gerade deshalb
10% langsamer läuft als sein Konkurrenzprodukt,
nicht gekauft wird. Sowas hat in der Wirtschaft
ganz erhebliche Nachteile.

Marco

Verzeihung im Ton

Unbedacht Inkompetenz zu unterstellen
verletzt den Gesprächspartner
oft heftig. Dein Ton ist zu aggressiv.

Inhaltlich lass Dir gesagt sein, dass ein toll
strukturiertes Programm, dass aber gerade deshalb
10% langsamer läuft als sein Konkurrenzprodukt,
nicht gekauft wird. Sowas hat in der Wirtschaft
ganz erhebliche Nachteile.

Marco

Aber inhaltlich meine ich es immer noch so. Mich regt es nur auf, da ich genau wusste, was du antwortest und was du auch jetzt antwortest. Es ist empirisch belegt, dass schlecht strukturierte Programme in der Entwicklung und besonders in der Wartung sehr viel mehr and Zeit und Kosten verursachen. Mal abgesehen davon, dass die Programme durch diese Sicherungen zwar etwas „langsamer“ aber dafür sehr viel stabiler und fehlerfreier werden. Zum Thema langsamer lass dir gesagt sein, dass das Programm dadurch nicht langsamer wird! Das Langsame sind Zugriffe auf Betriebsmittel o.ä., ein Nutzer merkt nicht, ob er 1 Sekunde wartet oder 1,1 Sekunden (Wenn ich mal deine Annahme nehme). Und selbst wenn: Dann muss das Programm irgendwann geändert werden und dann ist der Aufwand für das unstrukturierte Programm 10 mal so hoch. Da werden sich die Nutzer dann vielleicht doch für das andere entscheiden.

Mal abgesehen davon: Aus der betriebswirtschaftlichen Sicht ist das alles Tinnef, die Leute kaufen nämlich Windows, obwohls nicht schnell oder fehlerfrei ist, sondern die Bedürfnisse, die sie haben befriedigt!

Es ist immer wieder das gleiche. Ich würde nie auf die Idee kommen, dass ich besser Platinen löten als ein E-Techniker, besser mathematische Gleichungen lösen als ein Mathematiker oder besser physikalische Gegebenheiten modellieren kann als ein Physiker. Aber irgendwie meiner andersrum immer alle, sie hätten Ahnung von der Softwareentwicklung und nehmen keine Ratschläge an. Software ist eben nicht nur ein hingemaltes Spaghettiprogramm was eben 2 % schneller läuft, als ein anderes.

Mein Vorschlag: Entwickel mal irgendwann ein Programm, was von mindestens 3 Leuten über einen Zeitraum von mehreren Monaten erstellt wird und dann über mehrere Versionen läuft, dann wirst du es irgendwann auch feststellen…

Ralph

P.S. Ich bin immer etwas forsch, dann fühlen sich die Leute herausgefordert und denken über Argumente nach und schreiben nicht einfach „Ja ist gut“ oder „Nö, keinen Bock“.

Programmiertechnik

Unbedacht Inkompetenz zu unterstellen
verletzt den Gesprächspartner
oft heftig. Dein Ton ist zu aggressiv.

Inhaltlich lass Dir gesagt sein, dass ein toll
strukturiertes Programm, dass aber gerade deshalb
10% langsamer läuft als sein Konkurrenzprodukt,
nicht gekauft wird. Sowas hat in der Wirtschaft
ganz erhebliche Nachteile.

Marco

Aber inhaltlich meine ich es immer noch so. Mich regt es nur
auf, da ich genau wusste, was du antwortest und was du auch
jetzt antwortest. Es ist empirisch belegt, dass schlecht
strukturierte Programme in der Entwicklung und besonders in
der Wartung sehr viel mehr and Zeit und Kosten verursachen.
Mal abgesehen davon, dass die Programme durch diese
Sicherungen zwar etwas „langsamer“ aber dafür sehr viel
stabiler und fehlerfreier werden. Zum Thema langsamer lass dir
gesagt sein, dass das Programm dadurch nicht langsamer wird!
Das Langsame sind Zugriffe auf Betriebsmittel o.ä., ein Nutzer
merkt nicht, ob er 1 Sekunde wartet oder 1,1 Sekunden (Wenn
ich mal deine Annahme nehme). Und selbst wenn: Dann muss das
Programm irgendwann geändert werden und dann ist der Aufwand
für das unstrukturierte Programm 10 mal so hoch. Da werden
sich die Nutzer dann vielleicht doch für das andere
entscheiden.

Mal abgesehen davon: Aus der betriebswirtschaftlichen Sicht
ist das alles Tinnef, die Leute kaufen nämlich Windows,
obwohls nicht schnell oder fehlerfrei ist, sondern die
Bedürfnisse, die sie haben befriedigt!

Es ist immer wieder das gleiche. Ich würde nie auf die Idee
kommen, dass ich besser Platinen löten als ein E-Techniker,
besser mathematische Gleichungen lösen als ein Mathematiker
oder besser physikalische Gegebenheiten modellieren kann als
ein Physiker. Aber irgendwie meiner andersrum immer alle, sie
hätten Ahnung von der Softwareentwicklung und nehmen keine
Ratschläge an. Software ist eben nicht nur ein hingemaltes
Spaghettiprogramm was eben 2 % schneller läuft, als ein
anderes.

Mein Vorschlag: Entwickel mal irgendwann ein Programm, was von
mindestens 3 Leuten über einen Zeitraum von mehreren Monaten
erstellt wird und dann über mehrere Versionen läuft, dann
wirst du es irgendwann auch feststellen…

Ralph

Sowas habe ich schon gemacht, damit verdiene ich
sogar teilweise meine Brötchen, und ich stimme Dir
deshalb vollkommen zu. Es ist viel zusammengenommen
weniger Aufwand und billiger, es gleich richtig zu
machen.

Aber! Wenn ich es gleich richtig mache, hat die
Konkurrenz mit einem Pfusch in 20% der Zeit eine
Software erstellt, die vielleicht zweimal pro Woche
abstürzt, und in 0.01% aller Fälle falsch funktioniert.

Und nun kommt das alte Getrennte-Kassen-Problem.
Die Leute, die für den Einkauf zuständig sind,
sind nicht für die Instandhaltung zuständig.

So ist die Welt, traurig, aber der Entwickler
passt sich an, oder steht auf der Strasse :smile:

Am Anfang habe ich geglaubt, die Fehler werden
sich immer mehr ansammeln und irgendwann, wenn
ein kritischer Wert erreicht ist, wird alles
zusammenbrechen. In der Zwischenzeit glaube ich
das nicht mehr.

Gruss,
Marco

So, und jetzt
vertragen wir uns wieder :smile:

Wir sind also grundsätzlich einer Meinung.

Leider hast du in deiner Firma eine Erfahrung gemacht, die ich in verschiedenen Firmen und Projekten nie so bzw. andersherum gemacht habe, daraus resultiert eine unterschiedliche Sicht der Praxis.

Ich denke, in deiner Firma könnten Kommunikationsprobleme bestehen. Einerseits stimmt die Kommunikation zwischen Marketing und Kunden nicht, da diese nicht die Vorteile eines qualitativ hochwertigeren Produkts stätzen zu scheinen. Andererseits scheint es Kommunikationsprobleme zwischen Entwicklungs- und Wartungsbereich zu geben, da erstere auf diesen keine Rücksicht zu nehmen scheinen. Aber das gehört hier nicht her und wenn dann ins BWL-Brett. :wink:

Over and out

Ralph

Hallo Ihr zwei,

ihr habt natürlich beide recht. Ich kann jedoch Marcos Argumente sehr wohl nachvollziehen. Ich habe auch mal versucht, sauber zu programmieren, aber als ich dann mal eine 500x500 Matrix invertieren mußte, mußte ich zu meinem Entsetzen feststellen, daß meine „saubere“ Routine etwa 30 mal langsamer war als ein entsprechendes Vergleichsprogramm.

Erst nachdem ich diese richtig optimiert hatte, habe ich die Refernzlaufzeit unterboten. Den Programmcode kann natürlich keiner mehr lesen.

Gruß,

Daniel.

Hi,

sorry Der artikel war nicht als Antwort auf Deinen gemeint, ich bin da wohl ein wenig verrutscht.

grüße

Hi,

schon okay, kein Problem!

Gruss