Übergabe von mehrdimensioanlen Arrays
-
Warum kriegt die Funktion weg soviele Zeiger? Willst Du all die ints, deren Adressen Du der Funktion übergibst, ändern können? Wenn nicht, ist das mit den Zeigern nicht notwendig.
Wie auch immer: C-Arrays -- also die Dinger von Array-Typen -- sind so gut wie nicht zu gebrauchen. Das ist etwas plakativ formuliert aber die Botschaft soll ja bei Dir auch ankommen. Wenn Du Dich bzgl der Größe nicht festlegen willst und die Funktion
weg"Felder" beliebiger Größe verarbeiten können soll, musst Du Dir Alternativen suchen.Das nette an den Typen, die Janjan genannt hat, ist, dass sie wie "normale" Variablen handhabbar sind, was das Kopieren, zuweisen etc angeht. Bei std::vector und boost::multi_array ist die Größe der Felder auch nicht Bestandteil des Datentyps. Das heißt, Du kannst eine Funktion schreiben, die zB einen vector entgegen nimmt und später mit .size() prüft, wie groß das Ding überhaupt ist.
Ein schneller 08/15 Ersatz für boost::multi_array für 2D int Felder könnte so aussehen. Benutzen könnte man das dann so:
void weg (int dings, int bums, matrix const& input, matrix arbeitskopie) { ... }
-
Hallo nochmal,
danke schon mal für die Antworten.
Die Funktion kriegt so viele Zeiger, weil ich die Werte benutzen möchte, sie aber nicht verändern will...
Wie gesagt, es hat erstmal so mit den Zeigern funktioniert. Da war ich erstmal glücklich, dass es überhaupt lief

Ich werde es mal mit den Vorschlägen probieren

-
Lenja schrieb:
Hallo nochmal,
danke schon mal für die Antworten.
Die Funktion kriegt so viele Zeiger, weil ich die Werte benutzen möchte, sie aber nicht verändern will...
Da hast du etwas grundlegend falsch verstanden. Übergabe per zeiger dient (zumindest in C, in C++ würde man Referenzen nehmen) dazu, dass man die übergebenen Werte verändern kann. Wenn du die Werte nicht verändern möchtest, dann übergib eine Kopie (einfach gar nichts dazuschreiben) oder per const Referenz.
-
Funktioniert das auch bei Übergabe in Header-Dateien?
Ich hab das bis jetzt immer nur bei Übergabe in der .cpp-Datei intern gesehen...
-
Mit welchem Buch lernst du?
-
C/C++ Professionell programmieren
von Dirk LouisIst aber ziemlich dick und ich weiß immer nicht genau nach welchen Stichwörtern ich suchen soll. Somit geb ich das immer recht schnell auf

-
In eine Headerdatei kommt einfach eine Sammlung an forward declarations. Da darf in der Parameterliste nichts anderes als bei der Definition in der .cpp-Datei stehen.
Auch wenn die Funktionsdefinition im Header steht (wenn es eine Templatefunktion ist oder sie inline sein soll), macht das nicht den geringsten Unterschied. Der Compiler unterscheidet nicht zwischen Headerdateien und anderen Arten. Datei ist Datei.
-
kleine Anmerkung noch:
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h>sind allesamt C-Header, die in C++ seit 12 Jahren veraltet sind. In C++ heißen die <cstdio>, <cstdlib>, <cmath>, <ctime>
Wenn das so in dem Buch drinsteht solltest du dir ein aktuelleres besorgen.
-
Hallihallo,
ich hab das mit der Übergabe jetzt soweit hingekriegt. Danke für die Hilfe.
Außerdem muss in mein Programm noch eine csv-Datei eingelesen werden. Das funktioniert soweit auch ganz gut.
Das Problem ist jetzt nur, wenn ich größere Dateien einlese, z.B. bei meinem Beispiel "anfsmall.csv" 11250 Zeilen dieser Art:1;1;2;5 2;5;6;8 2;6;7;4Dann bekomme ich von Windows diese Meldung:
Array Test.exe hat ein Problem festgestellt und muss beendet werden.
Bei kleinen csv-Dateien mit z.B. nur 40 Zeilen geht es fehlerlos.
Ich bin ratlos.Hier mein Programm:
#include <cstdio> #include <cstdlib> #include <iostream> using namespace std; void printarray(int** rpf,int anzprod, int anzfeat) { for (int n=0; n<anzprod; n++) { for (int m=0; m<anzfeat; m++) { cout <<rpf[n][m] <<" "; } cout <<"\n"; } } int main(int argc, char *argv[]) { FILE *anford; int inst; int pnr; int fnr; int val; int anzprod; int anzfeat; int instnr; int i = 0; int j = 0; int k = 0; cin>>instnr; anford = fopen("anfsmall.csv","r"); while(!feof(anford)) { fscanf(anford, "%d;%d;%d;%d", &inst, &pnr, &fnr, &val); if(inst == instnr) { i++; if(pnr == 1) { j++; } } } anzfeat = j; anzprod = i/j; fclose(anford); // Brauch ich das? cout<<"anzfeat: "<<anzfeat<<endl; cout<<"anzprod: "<<anzprod<<endl; int** rpf; rpf=new int*[anzprod]; for(int i = 0; i < anzprod; i++) { rpf[i] = new int[anzprod]; } anford = fopen("anfsmall.csv","r"); while(!feof(anford)) { fscanf(anford, "%d;%d;%d;%d", &inst, &pnr, &fnr, &val); if(inst == instnr) { if(j <= anzfeat-1) { rpf[k][j] = val; j++; } else { k++; j = 0; rpf[k][j] = val; j++; } } i++; } printarray(rpf,anzprod,anzfeat); getchar(); system("PAUSE"); return 0; }Vielleicht hat jemand von euch ja eine Idee voran es liegen könnte!?
-
Aua! Das tut schon beim Hingucken weh.
Falls du deinen Fehler wirklich suchen und finden willst, benutze einen Debugger.
Falls du ein funktionierendes Programm schreiben willst:
- Verbrenn das Buch mit dem du C++ gelernt hast
- Verstreu die Asche im Wind
- Hau dir feste auf den Kopf bis du alles vergessen hast, was du über C++ weißt
- Fang noch einmal ganz von vorne mit C++ an. Benutze andere Lehrbücher als beim ersten Mal.
-
na toll... das hilft mir aber auch grad nicht weiter.
Ich weiß, dass ich nicht viel Ahnung hab, aber wenn du mir nur mit solchen Kommentaren hilfst, dann ist das auch nicht grad aufbauend...
-
Lenja schrieb:
na toll... das hilft mir aber auch grad nicht weiter.
Ich weiß, dass ich nicht viel Ahnung hab, aber wenn du mir nur mit solchen Kommentaren hilfst, dann ist das auch nicht grad aufbauend...
Manchmal tut die Wahrheit eben weh. Du hast (höchstwahrscheinlich nicht deine Schuld sondern die Schuld des Buches) völlig unbrauchbaren Mist gelernt. Du kannst jetzt weitermachen und dich den Rest deiner Tage damit rumquälen. Denn mit diesem Stil ist es sehr schwer funktionierende Programme zu schreiben.
Oder du kannst einen Bruch machen und nochmal neu anfangen. Das wird ein paar Monate dauern, aber dann schreibst du ein Programm wie dieses hier in 10-30 Minuten und das funktioniert dann auch Anhieb.
-
nur leider hab ich keine Monate Zeit, sondern nur eine Woche...
Ich wollte ja auch nur nen Tipp haben, was ich falsch gemacht habe. Ich weiß selber, dass es nicht schön und perfekt ist, aber es funktioniert soweit und das reicht mir.
Aber wenn man hier keine Hilfe kriegt, versuch ichs mal in nem anderen Forum.
Ciao
-
Lenja schrieb:
nur leider hab ich keine Monate Zeit, sondern nur eine Woche...
Ich wollte ja auch nur nen Tipp haben, was ich falsch gemacht habe. Ich weiß selber, dass es nicht schön und perfekt ist, aber es funktioniert soweit und das reicht mir.
Aber wenn man hier keine Hilfe kriegt, versuch ichs mal in nem anderen Forum.
CiaoDie Hilfe, wenn du unbedingt dieses Programm reparieren musst, ist der Debugger. Damit bekommst du nämlich heraus, wo und warum der Fehler auftritt. Wenn du dies weißt, sollte sich auch die Ursache im Code finden lassen oder falls du sie nicht findest, kannst du mit diesen Angaben hier noch einmal fragen.
Ok, einen konkreten Hinweis habe ich noch: Dein Array rpf ist vermutlich zu klein. da mir die ganze Berechnung der Größe von rpf spanisch vorkommt, würde ich mal annehmen, dass diese falsch ist.
Außerdem viele weitere potentielle Fehler, unter Anderem: Bist du sicher, dass die Sachen die du mit dem i und dem j machst richtig sind? Sieht total falsch aus.