aze Posted January 5, 2003 Report Share Posted January 5, 2003 Hi! Everytime I compile a .c program using gcc and run a.out it return: "Segmentation fault" and stop the program. What's wrong? Thank you in advance! Quote Link to comment Share on other sites More sharing options...
Cannonfodder Posted January 5, 2003 Report Share Posted January 5, 2003 think its referencing memory that its not allowed to (e.g. memory address 0x00000000. Why don't you post your c program? If its a commercial program, make sure you have all your dependancies.. Quote Link to comment Share on other sites More sharing options...
aze Posted January 5, 2003 Author Report Share Posted January 5, 2003 not comercial. no dependencies. #include <stdio.h> #include <string.h> FILE *arq; char hst[59000][100]; int qt_hst = 0; struct classe { char name[50]; int start; int end; } tipo[500]; void open() { char cor; int a = 0, b = 0, c = 0, d = 0, e = 0; arq = fopen("test","r"); cor = getc(arq); while (cor!=EOF) { if (cor == 'n') qt_hst++; cor = getc(arq); } qt_hst++; printf("Total lines: %dnn", qt_hst); fseek(arq, 0, SEEK_SET); /* drop all valid entries to memmory*/ cor = '0'; a=0; /* count blank/comments lines */ for (b; b < qt_hst-a; b++) { fgets( hst[b], 99, arq ); if (!strstr(hst[b],"#") ) { cor = '0'; if ( strchr(hst[b], 't') ) strcpy(hst[b], strchr(hst[b], 't')+1); else { if ( strchr(hst[b], ' ') ) { c = d = 0; for (c; c < strlen(hst[b]); c++) if (hst[b][c] == ' ') d++; strcpy(hst[b], strchr(hst[b], ' ')+d); } else { b--; a++; } } } else { //printf("%c",7); if (cor != '1') { printf("%d - %s",e, hst[b]); if (tipo[e].start) { //printf("%s",tipo[e].start); tipo[e].end = b-1; e++; tipo[e].start = b; } else tipo[e].start = b; strcpy( tipo[e].name, hst[b] ); cor = '1'; } b--; a++; } } qt_hst = b; if (tipo[0].start) tipo[e].end = qt_hst-1; fclose(arq); } void repeat() { int a, b, c; unsigned char tam[59000]; a = b = c = 0; printf("ntScanning for duplicated entries...nn"); for (a; a<qt_hst;a++) tam[a]=strlen(hst[a]); for (a=0; a < qt_hst; a++) { for (b = a+1; b < qt_hst; b++) { if (tam[a] == tam[b]) { if ( memcmp(hst[a], hst[b], tam[a]) == 0) { printf("%d : %dn",a+1,b+1); printf("%s%sn",hst[a],hst[b]); c++; } } } } printf("nnt%d repeated entries found.n",c); } void main() { char i; st: system("clear"); open(); repeat(); } How do I ask for a keypress in ANSI default? i=getch(); /* works in windows but not in linux */ Thank you! Quote Link to comment Share on other sites More sharing options...
Glitz Posted January 5, 2003 Report Share Posted January 5, 2003 getch() Can be found in curses.h Otherwise, use standard io functions such as: i=getchar() or i=getc(stdin) Glitz Quote Link to comment Share on other sites More sharing options...
Glitz Posted January 5, 2003 Report Share Posted January 5, 2003 I tried running your program. If there is no "test" file for it to open you get a segmentation fault. I created a "test" file and the program ran fine. Glitz. Quote Link to comment Share on other sites More sharing options...
Glitz Posted January 5, 2003 Report Share Posted January 5, 2003 Okay, the problem is that when you do the fopen, it returns a NULL pointer since the file doesn't exist. Then the cor=getc(arq) command segfaults because it is being passed a NULL pointer. Glitz. Quote Link to comment Share on other sites More sharing options...
aze Posted January 5, 2003 Author Report Share Posted January 5, 2003 thank you! Quote Link to comment Share on other sites More sharing options...
Cannonfodder Posted January 5, 2003 Report Share Posted January 5, 2003 As a programmer, you need to anticipate oddball situations. Although this project may not need it due to expectation, in general, its good to do through error checking. Open a file? Check for a NULL. Do it everytime. Make another class or procedure that does that automatically for you so you don't have to repeat the work. Also, how would you go about locating the source of the crash? Let's say you are not using an IDE, what kind of debugger can you use? On a primitive level, you can try inserting asserts() or simple printf() statements. If it reaches the printf() and displays it and then crashes, you can move it forward until you reach a point where you no longer see the result of the printf(). For more advance debugging, you can check a log that describes where the program crashes. I don't know enough about c programming on a linux platform to tell you how to do that. Anybody? Quote Link to comment Share on other sites More sharing options...
aze Posted January 5, 2003 Author Report Share Posted January 5, 2003 I'm just a C beginner. I could make a verification for the file existence. But I'm just testing... I asked for because I have no trouble when using borland compiler on windows. By the way, you guys know a good debugger? I mean C debugger, not asm debugger. Quote Link to comment Share on other sites More sharing options...
Glitz Posted January 7, 2003 Report Share Posted January 7, 2003 I use something called DDD. It has all the basic features that Borland does such as setting watches, viewing local variables, single stepping, viewing assembly (if you want to). I think it is available under the GPL. I got mine with a MacMillan edition of C-Forge. Glitz. Quote Link to comment Share on other sites More sharing options...
Glitz Posted January 7, 2003 Report Share Posted January 7, 2003 Silly me, DDD is included with Mandrake as well. You just have to make sure that when you compile the source code you have the compiler include debugging information. I think all that is needed is to compile with the -g option. Glitz. Quote Link to comment Share on other sites More sharing options...
aze Posted January 7, 2003 Author Report Share Posted January 7, 2003 DDD is a commandline compiler? Or you mean gcc -g? Quote Link to comment Share on other sites More sharing options...
ramfree17 Posted January 7, 2003 Report Share Posted January 7, 2003 DDD is a commandline compiler? Or you mean gcc -g? ddd is a debugger. i am not sure but i remember it being a graphical front-end to gdb which is the commandline debugger. gcc -g just inserts debugging flags to the compiled code. think of this flags as 'hooks' that the debugger tries to hang on to when you want to stop a process on a specific line and browse its current status. ciao! Quote Link to comment Share on other sites More sharing options...
chalex20 Posted January 7, 2003 Report Share Posted January 7, 2003 As a programmer, you need to anticipate oddball situations. Although this project may not need it due to expectation, in general, its good to do through error checking. Open a file? Check for a NULL. Do it everytime. Make another class or procedure that does that automatically for you so you don't have to repeat the work. There is even better programming technique : some function defined as having a return code? Check this return code each time you call this function. Some function defined as returning a pointer ( fopen, malloc)? Check for NULL. The list continues... Quote Link to comment Share on other sites More sharing options...
aze Posted January 8, 2003 Author Report Share Posted January 8, 2003 Hi guys! I downloaded DDD and tried to install it. './configure' runs ok but when I do 'make' it generate an error: In file included from logplayer.C:46: /usr/include/c++/3.2/backward/fstream.h:38: using declaration `streampos' introduced ambiguous type `streampos' make[1]: *** [logplayer.o] Error 1 make[1]: Leaving directory `/home/leandro/ddd-3.3.1/ddd' make: *** [all-recursive] Error 1 How could I fix that? Thank you in advance! Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.