Speicherproblem?

T

TeaAge

Routinier
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
 
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 :>
 
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 :>

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
 
Zuletzt bearbeitet:
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 :>
 
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
 
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

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ß
 
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
 
Zuletzt bearbeitet:
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));
      }
Was ist jetzt dein Problem?
Achtung: Oben erstellst du ein 2dimensionales Array der Größe kmax x5. Hier schreibst du aber beide Male kmax.
 
Wozu braucht man so ein Programm eigentlich ?

PS: Warum packst du den Kram nicht auf den Heap ?
Der ist auf meinem System etwa um den Faktor 3 schneller als der Stack.

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

Ähnliche Themen

[Gelöst] Suchen und ersetzen mit Hilfe mehrerer Parameter

Queue für copy Script

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

CTDB Samba Cluster als Shared Storage für MS SQl Server

Zurück
Oben