Speicherproblem?

Dieses Thema im Forum "C/C++" wurde erstellt von TeaAge, 12.09.2008.

  1. TeaAge

    TeaAge Routinier

    Dabei seit:
    16.05.2007
    Beiträge:
    465
    Zustimmungen:
    0
    Ort:
    Dresden
    Hallo zusammen,

    ich hab vor kurzem mit C angefangen, ist quasi meine erste Programmiersprache, da ich C für ein Projekt brauche.
    Dass heißt bisher bin ich so vorgegangen (aus Zeitmangel) mir minimale Grundlagen an zueignen und mir dann aus einem C Buch immer die nötigen Befehle raus zusuchen (bin eigentlich Maschinenbauer).
    Das Programm ließt im Prinzip erstmal 2 Netze (die sozusagen übereinander liegen), die aus Punkten bestehen, aus und soll zu jedem Punkt von Netz 1 den nächst gelegenen Punk von Netz 2 finden.
    Zu jedem Netz gibt es also eine Datei. In jeder Zeile wird ein Punkt definiert, also Punktnummer, x-Wert, y-Wert, z-Wert.
    Ein Netz besteht aus etwa 170.000 Punkten (könnten aber noch mehr werden).

    Danach wird noch ein bisschen mit den Punkten hantiert, dass ist aber nicht so wichtig, den im Groben und Ganzen steht das Konzept, allerdings bekomme ich beim Ausführen immer einen "Speicherzugriffsfehler" bzw. "Segmentation fault".
    Ich nehme mal an, dass die Arrays die ich definieren zu viel Speicher brauchen?
    Jetzt belese ich mich gerade zu malloc(), bin mir aber nicht sicher ob es dass ist was ich brauche.

    Hier mal der Anfang meines wundervollen Programms:
    Code:
    /* fineloadmapper.c */
    #define ZEILENLAENGE 100
    #define max 100
    #define kmax 170000
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h>
    
    
    int main(void) {
    FILE *netz, *nodeold, *cloadold, *cloadnew;
    char zeile_n1[ZEILENLAENGE], zeile_n2[ZEILENLAENGE], faces[ZEILENLAENGE]="*ELEMENT,TYPE=STRI65,ELSET=faces_impact", node[ZEILENLAENGE]="*NODE", zeile3[ZEILENLAENGE], zeile2[ZEILENLAENGE], zeile1[ZEILENLAENGE], zeile[ZEILENLAENGE];
    int e, ke[5], kf[kmax], kn, k_old, k_new, kez[kmax][5], l, i, kc, kfz, k[kmax], n;
    double x, y, z, dx, dy, dz, betrag, betrag_neu, basisx, basisy, basisz, C[kmax][3];
    
    netz=fopen("Impact_complete_unclean.inp","r");
    fgets(zeile_n1,ZEILENLAENGE,netz);
    
    for(i=0;i<kmax;i++);
    	{
    	kez[i][1]=0;
    	}
    
    while(strncmp( node, zeile_n1, 5) != 0)
    	{
    	fgets(zeile_n1,ZEILENLAENGE,netz);
    	}
    
    fgets(zeile_n1,ZEILENLAENGE,netz);
    
    // Alle Knoten mit ihren Koordinaten in Arrays (k[kn]=Knoten, C[kn][1]=X-Koordinate des Knoten k, ...) schreiben
    while(strncmp( node, zeile_n1, 1) != 0)
    	{
    	sscanf(zeile_n1,"%i, %lf , %lf , %lf ", &kn, &x, &y, &z);
    	k[kn]=kn;
    	C[kn][1]=x;
    	C[kn][2]=y;
    	C[kn][3]=z;
    	fgets(zeile_n1,ZEILENLAENGE,netz);
    	}
    ...
    
    Das soll erstmal reichen, denn laut dem Debuuger von KDevelop bricht er mir bei der Zeile ab, in der dir char definiert werden (Zeile 14), das ist mir schon nicht klar.
    Wenn ich ZEILENLAENGE auf 50 reduziere, kommt er über die Zeile weg und bleibt dann bei netz=fopen() hängen (die Datei existiert natürlich).

    Wenn ich kmax auf 150.000 reduziere, läuft es soweit alles durch.
    Es würde mir schon helfen, wenn ihr mir das Problem erklären könntet und mir sagt, welche Thematik ich mir mal genauer durch lesen sollte.

    Gruß
    TeaAge
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. foexle

    foexle Kaiser

    Dabei seit:
    02.05.2007
    Beiträge:
    1.104
    Zustimmungen:
    0
    Ort:
    Saarbrücken
    Code:
    char zeile_n1[ZEILENLAENGE], zeile_n2[ZEILENLAENGE], faces[ZEILENLAENGE]="*ELEMENT,TYPE=STRI65,ELSET=faces_impact", node[ZEILENLAENGE]="*NODE", zeile3[ZEILENLAENGE], zeile2[ZEILENLAENGE], zeile1[ZEILENLAENGE], zeile[ZEILENLAENGE];
    
    so nimmt der das ? ... also ich bin jetzt kein c oder c++ spezi aber das sollen strings werden und für strings brauchst du keinen char sondern einen char -pointer

    also char *
    bitte um korrektur wenn ich mich irre :>
     
  4. #3 icephilipp, 12.09.2008
    Zuletzt bearbeitet: 12.09.2008
    icephilipp

    icephilipp Foren As

    Dabei seit:
    01.03.2008
    Beiträge:
    91
    Zustimmungen:
    0
    nein das sollte funktionieren für strings brauchst du ein char array
    aber soweit ich weis kann ein integer nur zahelen bis 32000 irgendwas aufnehmen versuche mal die i als long zu deklarieren
     
  5. foexle

    foexle Kaiser

    Dabei seit:
    02.05.2007
    Beiträge:
    1.104
    Zustimmungen:
    0
    Ort:
    Saarbrücken
    ja stimmt :> sry hab nie mit arrays gearbeitet in c sondern ausschließlich mit pointer syntax :> was fast das gleiche ist ... aber auch nur fast :>
     
  6. larry

    larry Tripel-As

    Dabei seit:
    27.11.2007
    Beiträge:
    159
    Zustimmungen:
    0
    Ich denk auch, dass die Arrays zuviel Platz brauchen. Die größe des Stacks für eine Funktion hast du da wohl überschritten. Hol dir den Speicher am besten vom Heap, dann sollte es klappen
     
  7. TeaAge

    TeaAge Routinier

    Dabei seit:
    16.05.2007
    Beiträge:
    465
    Zustimmungen:
    0
    Ort:
    Dresden
    Danke erstmal für deine Antwort. Mach ich das denn mit malloc()?
    Das habe ich zumindest in der Zwischenzeit probiert. Das Integer Array lief auch ganz gut aber als ich mich an die double Arrays gewagt habe, musste ich 'kmax' weiter runter setzten, damit das Programm durch lief. Hatte also den gegenteiligen Effekt.

    Definiert habe ich das double Array so:
    Code:
    double ** kez;
    
    kez = (double **)malloc(kmax * sizeof(double *));
    
     for(i = 0; i < 5; i++) 
          {
           kez[i] = (double *)malloc(kmax * sizeof(double));
          }
    
    Gruß
     
  8. #7 JBR, 12.09.2008
    Zuletzt bearbeitet: 13.09.2008
    JBR

    JBR Fichtenschonung

    Dabei seit:
    18.03.2007
    Beiträge:
    561
    Zustimmungen:
    0
    Ort:
    Nolop
    Benutze calloc. Mehr zu calloc findest du z.b in der Manpage.
    Hier noch ein kleines Beispielprogramm aus meiner Sammlung:
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    	int* pa[10];
    	int* e;
    	e=calloc(3,sizeof(int));
     	e[0]=1;
    	e[1]=12;
    	e[2]=123;
    	pa[1]=e;
    	printf("%d %d %d\n",e[0],e[1],e[2]);
    	printf("%d %d %d\n",pa[1][0],pa[1][1],pa[1][2]);
    	realloc(e,4);
    	e[3]=1234;
    	printf("%d %d %d %d\n",pa[1][0],pa[1][1],pa[1][2],pa[1][3]);
    }
    
    Wozu braucht man so ein Programm eigentlich ?

    PS: Warum deklarierst du die Variablen nicht statisch
    Der Heap ist auf meinem System etwa um den Faktor 3 langsamer im Vergleich mit statischen Variablen
     
  9. larry

    larry Tripel-As

    Dabei seit:
    27.11.2007
    Beiträge:
    159
    Zustimmungen:
    0
    Was ist jetzt dein Problem?
    Achtung: Oben erstellst du ein 2dimensionales Array der Größe kmax x5. Hier schreibst du aber beide Male kmax.
     
  10. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  11. TeaAge

    TeaAge Routinier

    Dabei seit:
    16.05.2007
    Beiträge:
    465
    Zustimmungen:
    0
    Ort:
    Dresden
    Wie gesagt, studiere Maschinenbau bzw. genauer Luft- und Raumfarttechnik.
    Meine Informatikerfahrungen beschränken sich auf mein erstes und zweites Semester wo wir ein bisschen Delphi gelernt haben ;). Jetzt probiere ich mich seit einem guten Monat an C und einfachen scripten in der bash.
    Bei meinem Projekt habe ich ein FEM-Modell einer Verdichterschaufel aus einem Triebwerk. So ein Modell besteht ja im wesentlichen aus Knoten (bzw. Punkten) und Kräft, die an den Knoten angreifen.

    Das Netz besteht aus über 165000 Knoten/Punkten, einen Teil davon soll feiner vernetzt werden, dabei werden die Knoten in dem Bereich gelöscht (und auch die Kräfte) und wesentlich mehr neue Knoten kommen in den Bereich. Jetzt muss ich die Kräfte von den "alten" Knoten auf die "neuen" Knoten verteilen. So mal im Groben und Ganzen ...

    Das ich den Kram nicht auf den Heap packe liegt im wesentlich daran, dass ich gerade mal weiß, dass es die beiden gibt .... mehr aber auch nicht.

    Ich werd mir wohl mal das Kapitel hier
    http://www.galileocomputing.de/openbook/c_von_a_bis_z/c_016_000.htm#Xxx999328
    zur dynamischen Speicherverwaltung durch lesen.

    @ larry, danke, den Fehler hatte ich irgendwie übersehen.
    Mein Problem war/ist, dass ich obwohl ich alle arrays mit malloc() definiert hatte, mein Speicherproblem sogar größer geworden ist (konnte noch weniger Punkte einlesen. Das lag aber vielleicht daran, dass ich das 2D Array falsch definiert hatte. Schau'n wir mal ;)

    Gruß
    TeaAge
     
  12. TeaAge

    TeaAge Routinier

    Dabei seit:
    16.05.2007
    Beiträge:
    465
    Zustimmungen:
    0
    Ort:
    Dresden
    Huhu,

    also Problem scheint gelöst. Es lag wohl an dem Fehler auf den mich larry hingewiesen hat. Hab kmax auf 200000 hoch gestellt und es läuft problemlos durch.

    Danke nochmal!

    Gruß
    TeaAge
     
Thema:

Speicherproblem?

Die Seite wird geladen...

Speicherproblem? - Ähnliche Themen

  1. Speicherproblem ? Linux speichert nicht ab

    Speicherproblem ? Linux speichert nicht ab: Folgendes Problem : Einstellungen Dateinänderungen .. werden nach dem Neustart (!) zurückgesetzt. z.B. habe ich die motd geändert. Nahc dem...
  2. Speicherprobleme in OpenOffice 1.1

    Speicherprobleme in OpenOffice 1.1: Hallo Leute Ich habe gestern 5 Textdokumente mit dem OpenOffice geschrieben und gespeichert. Als ich die Dateien später öffnen und bearbeiten...