Übergabe von mehrdimensioanlen Arrays



  • 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 Louis

    Ist 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;4
    

    Dann 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!?


  • Mod

    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...


  • Mod

    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


  • Mod

    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.
    Ciao

    Die 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.


Anmelden zum Antworten