Solve Segmentation Fault: Destroy Planetary System "Solid

  • MHB
  • Thread starter mathmari
  • Start date
  • Tags
    Fault
In summary: Wondering)In summary, the conversation is about writing a function for the destruction of a planetary system and troubleshooting a segmentation fault in the code. The expert suggests using assert commands before the problematic code and adding fflush(NULL) after printf to check for any issues. The use of a debugger like gdb is also suggested to further analyze and debug the code.
  • #36
I like Serena said:
I do not understand yet what [m]ff[/m] should represent, but yes, your code looks correct now. (Smile)

[m]ff[/m] is a pointer of type asteroid_t to the first element of a doubly linked list. This list is the list of the free-floating planets of the collection of the free-foating planets with identifier fp. Each element of the list of the free-floating planets of a collection of free-floating planets is a struct of type asteroid_t.
 
Technology news on Phys.org
  • #37
mathmari said:
[m]ff[/m] is a pointer of type asteroid_t to the first element of a doubly linked list. This list is the list of the free-floating planets of the collection of the free-foating planets with identifier fp. Each element of the list of the free-floating planets of a collection of free-floating planets is a struct of type asteroid_t.

Ah okay. That explains it. (Smile)
 
  • #38
When I compile the program I get a segmentation fault...

Code:
int destruction(int solid, int gap){
	int ffplanpos=-1;
	int i, j;
	int sum=0;
	asteroid_t *planf = calloc(1, sizeof(asteroid_t));
	asteroid_t *K=NULL;
	asteroid_t *f=NULL;
	plansys_t *p=StarS[0].plasy;
	for(i=0; i<Sfreep; i++){
		p=StarS[i].plasy;
		while (p != NULL && p->solid != solid){
			p=p->next;
			j=i;
		}
	}
	if(p == NULL){
		printf("The planetary system with identifier %d couldn't be found\n", solid);
		return -1;
	}
	f=p->asteroids;
	while(sum<gap){
		sum=sum+f->gap;
		f=f->next;
		DELETE(f->prev, f->prev->as);
	}
	

	for(i=0; i<max; i++){
		if(StarS[j].ffplan[i].fp == INT_MAX){
			ffplanpos=i;
		}
	}
	
	if(ffplanpos == -1){
		return -1;
	}
	
	StarS[j].ffplan[ffplanpos].fp=solid;
	
	
	planf->as=f->as;
	planf->gap=0;
	planf->next=NULL;
	planf->prev=NULL;	f=f->next;
	while(f != NULL){
		if (StarS[j].ffplan[ffplanpos].ff == NULL) {
        	       StarS[j].ffplan[ffplanpos].ff = planf;
                } else {
        	       asteroid_t *last = StarS[j].ffplan[ffplanpos].ff;
        	       while (last->next != NULL) {
        		       last = last->next;
        	       }
        	       last->next = planf;
       	        }     
		f=f->next;
	}     
	
	
	printf("\n\nPlanet Systems = ");
	
	while(StarS[j].plasy != NULL){
		printf(" %d ", StarS[j].plasy->solid);
		StarS[j].plasy=StarS[j].plasy->next;
	}
	
	printf("\n\nFree-floatingM = ");
	
	for(i=0; i<ffplanpos; i++){
		printf(" %d ", StarS[j].ffplan[i].fp);
	}
	
	printf("\n\nFree-floating planets = ");

	
	printf("\n\n %d ", StarS[j].ffplan[0].ff->as);
	for(i=0; i<=ffplanpos; i++){
		while(StarS[j].ffplan[i].ff != NULL){
			printf(" %d ", StarS[j].ffplan[i].ff->as);
			StarS[j].ffplan[i].ff=StarS[j].ffplan[i].ff->next;
		}
	}

	return 0;
	
}

What could I have done wrong?? (Wondering)
 
  • #39
mathmari said:
When I compile the program I get a segmentation fault...

What could I have done wrong?? (Wondering)

Where do you get the segmentation fault? (Wondering)

One of the ways to find out, is to run:
[m]\$ gdb stars
(gdb) r
<crash>
(gdb) bt[/m]
This will show where the program was, and where it was coming from when the segmentation fault occurred. (Wasntme)
 
  • #40
I like Serena said:
Where do you get the segmentation fault? (Wondering)

One of the ways to find out, is to run:
[m]\$ gdb stars
(gdb) r
<crash>
(gdb) bt[/m]
This will show where the program was, and where it was coming from when the segmentation fault occurred. (Wasntme)

When I write [m]r[/m] I get :

[m] Starting program:
No executable specified, use 'target exec'.[/m]What does this mean?? (Wondering)

Also what am I supposed to write at the point [m]<crash>[/m] ?? (Wondering)
 
  • #41
mathmari said:
When I write [m]r[/m] I get :

[m] Starting program:
No executable specified, use 'target exec'.[/m]What does this mean?? (Wondering)

Also what am I supposed to write at the point [m]<crash>[/m] ?? (Wondering)

What is the name of your program? (Wondering)
That's what you should type after gdb in the first line.

<crash> means that you should wait for the crash to happen. (Wasntme)
 
  • #42
I like Serena said:
What is the name of your program? (Wondering)
That's what you should type after gdb in the first line.

Should I write [m](gdb) main[/m] or [m](gdb) stars[/m] or something else that contains both of them?? (Wondering)
 
  • #43
mathmari said:
Should I write [m](gdb) main[/m] or [m](gdb) stars[/m] or something else that contains both of them?? (Wondering)

Which command do you use to build your program? (Wondering)

Let's assume it is [m]gcc stars.c[/m].
This generates an executable named [m]a.out[/m].

Then you should use:
[m]gdb a.out[/m]
This will start gdb with your executable, and a [m](gdb)[/m] prompt will appear. (Thinking)

Enter [m]r[/m], and your program starts running until it presumably crashes with a segmentation fault.

At that time gdb will show where it crashed.
And if you enter [m]bt[/m], it will give more detailed information. (Mmm)
 
  • #44
I like Serena said:
Which command do you use to build your program? (Wondering)

Let's assume it is [m]gcc stars.c[/m].

I compile the program using the following:

[m]gcc main.c stars.c[/m]

(Wondering)
 
  • #45
mathmari said:
I compile the program using the following:

[m]gcc main.c stars.c[/m]

(Wondering)

Then you will also get [m]a.out[/m] as resulting executable.
So the way to use gdb is the same. (Mmm)
 
  • #46
I like Serena said:
Then you will also get [m]a.out[/m] as resulting executable.
So the way to use gdb is the same. (Mmm)

So, should I write the following commands??

[m]gcc main.c stars.c
gdb a.out
(gdb) r[/m]

(Wondering)
 
  • #47
mathmari said:
So, should I write the following commands??

[m]gcc main.c stars.c
gdb a.out
(gdb) r[/m]

(Wondering)

Hold on.
You need to compile with [m]gcc -g main.c stars.c[/m]

What do you get when you do? (Wondering)
 
  • #48
I like Serena said:
Hold on.
You need to compile with [m]gcc -g main.c stars.c[/m]

What do you get when you do? (Wondering)

Do you mean that after [m]gcc -g main.c stars.c[/m] I should write
[m]gdb a.out
(gdb) r[/m] ?? (Wondering)
 
  • #49
mathmari said:
Do you mean that after [m]gcc -g main.c stars.c[/m] I should write
[m]gdb a.out
(gdb) r[/m] ?? (Wondering)

Yes...
 
  • #50
I like Serena said:
Yes...

When I write the command [m]gdb a.out[/m] I get:

[m]a.out: No such file or directory.[/m]

(Wondering)
 
  • #51
mathmari said:
When I write the command [m]gdb a.out[/m] I get:

[m]a.out: No such file or directory.[/m]

(Wondering)

How do you normally run your executable? (Wondering)
 
  • #52
Try "gdb ./a.out". Note the period before "/".
 
  • #53
I wrote [m]gdb a.exe[/m].

Then I wrote the command [m](gdb) r[/m] and I get the following:

[m]Starting program: /cygdrive/c/cygwin/a.exe
[New thread 3764.0x50c]
Error: dll starting at 0x76c60000 not found.
Error: dll starting at 0x75c30000 not found.
Error: dll starting at 0x76c60000 not found.
Error: dll starting at 0x76b60000 not found.
[New thread 3764.0x4c4]
Usage: /a <input_file>

Program exited with code 01.[/m]

What does this mean?? (Wondering)
 
  • #54
mathmari said:
I wrote [m]gdb a.exe[/m].

Then I wrote the command [m](gdb) r[/m] and I get the following:

[m]Starting program: /cygdrive/c/cygwin/a.exe
[New thread 3764.0x50c]
Error: dll starting at 0x76c60000 not found.
Error: dll starting at 0x75c30000 not found.
Error: dll starting at 0x76c60000 not found.
Error: dll starting at 0x76b60000 not found.
[New thread 3764.0x4c4]
Usage: /a <input_file>

Program exited with code 01.[/m]

What does this mean?? (Wondering)

Did you compile with [m]-g[/m]? (Wondering)
 
  • #55
I like Serena said:
Did you compile with [m]-g[/m]? (Wondering)

Yes, I compiled it as followed:

[m]gcc -g main.c stars.c[/m]
 
  • #56
mathmari said:
Yes, I compiled it as followed:

[m]gcc -g main.c stars.c[/m]

What do you get if you type [m]gcc -v[/m]? (Wondering)
And what for [m] gdb -v[/m]?
 
  • #57
I like Serena said:
What do you get if you type [m]gcc -v[/m]? (Wondering)

Do you mean that I have to type [m]gcc -v[/m] without [m]main.c stars.c[/m] ?? (Wondering)
 
  • #58
mathmari said:
Do you mean that I have to type [m]gcc -v[/m] without [m]main.c stars.c[/m] ?? (Wondering)

Yes.

It will give the version and configuration of the gcc respectively the gdb version you are using.
It appears they are somehow not compatible. :confused:

Btw, didn't you have gdb running properly before? (Wondering)
 
  • #59
When I type [m]gcc -v[/m] I get the following:

[m]Reading specs from /usr/lib/gcc/i686-pc-cygwin/3.4.4/specs
Configured with: /managed/gcc-build/final-v3-bootstrap/gcc-3.4.4-999/configure --verbose --program-suffix=-3 --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --enable-languages=c,ada,c++,d,f77,pascal,java,objc --enable-nls --without-included-gettext --enable-version-specific-runtime-libs --without-x --enable-libgcj --disable-java-awt --with-system-zlib --enable-interpreter --disable-libgcj-debug --enable-threads=posix --enable-java-gc=boehm --disable-win32-registry --enable-sjlj-exceptions --enable-hash-synchronization --enable-libstdcxx-debug
Thread model: posix
gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)[/m]
When I type [m]gdb -v[/m] I get the following:

[m]GNU gdb 6.8.0.20080328-cvs <cygwin-special>
Copyright <C> 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <301 Moved Permanently>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details.
This GDB was configured as "i686-pc-cygwin".[/m]
 
  • #60
When I check the same thing, I get:
[m]\$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/lto-wrapper.exe
...
gcc version 4.8.3 (GCC)[/m]

[m]\$ gdb -v
GNU gdb (GDB) 7.8
...
This GDB was configured as "x86_64-pc-cygwin".
[/m]

What is drawing my attention is that you appear to have a "cygming special".
Do you perhaps have the so called MinGW version of the gcc compiler? (Wondering)
If so, perhaps that may be incompatible with the version of gdb that you have.
(Not to mention that your version is apparently pretty old.)

Ideally, you'd use the setup of Cygwin to install both gcc and gdb.
If you do it like that, both should work in conjunction with each other. (Thinking)

Otherwise, we'll have to use a more primitive way to figure out where your segmentation fault is coming from. (Sweating)
 
  • #61
GCC 3.4.4 was released in mid 2005, almost a decade ago. GDB 6.8 is from early 2008, and you have the cvs (snapshot?) version. They were most definitely not meant for each other. Please, mathmari, do yourself a favour and upgrade your toolchain. Trying to use broken tools is just not worth it.​
 
  • #62
I downloaded Cygwin again I chose the following packages that should be satisfied:

[m]ca-certificates (2.1-1)
CA root certificates
Required by: libopenssl100

cygwin-debuginfo (1.7.33-1)
Debug info for cygwin
Required by: cygwin64-gcc-debuginfo, gcc-debuginfo, gdb-debuginfo, cygwin-debuginfo

cygwin-devel (1.7.33-1)
Core development files
Required by: gcc-core

libargp (20110921-2)
Interface for parsing command line arguments
Required by: getent

libatomic1 (4.8.3-4)
GCC C11/C++11 locked atomics runtime library
Required by: gcc-core

libcharset1 (1.14-2)
GNU character set conversion library and utilities - runtime (2)
Required by: libiconv

libcloog-isl4 (0.18.0-2)
CLooG Chunky Loop Generator (runtime)
Required by: gcc-core, gcc-g++

libdb4.8 (4.8.30-1)
Oracle Berkeley DB (db4.8 - C and C++ libs)
Required by: perl, python

libffi6 (3.0.13-1)
Portable foreign function interface library
Required by: python, libp11-kit0

libgmp10 (6.0.0a-1)
Library for arbitrary precision arithmetic (C runtime)
Required by: coreutils, gawk, gcc-core, gcc-g++, libmpfr4, libcloog-isl4, libisl10, libmpc3, mingw-gcc-g++, mingw-gcc-core

libgomp1 (4.8.3-4)
GCC OpenMP runtime library
Required by: gcc-core

libiconv (1.14-2)
GNU character set conversion library and utilities
Required by: man-db, libintl-devel

libintl-devel (0.18.3.2-2)
GNU Internationalization runtime library
Required by: libuuid-devel

libisl10 (0.11.1-2)
Integer Set Library (runtime)
Required by: gcc-core, gcc-g++

libmpc3 (1.0.2-1)
C library for multiple-precision floating-point computations with exact rounding (runtime)
Required by: gcc-core, gcc-g++, mingw-gcc-g++, mingw-gcc-core

libmpfr4 (3.1.2-1)
A library for multiple-precision floating-point arithmetic with exact rounding (runtime)
Required by: gawk, gcc-core, gcc-g++, libmpc3, mingw-gcc-g++, mingw-gcc-core

libopenssl100 (1.0.1j-1)
A general purpose cryptography toolkit with TLS implementation (runtime)
Required by: python, lynx, perl_vendor

libp11-kit0 (0.20.7-1)
PKCS#11 module library
Required by: p11-kit

libpcre1 (8.35-1)
Perl Compatible Regular Expressions UTF-8 runtime
Required by: grep

libpipeline1 (1.3.0-3)
C library for manipulating pipelines of subprocesses - runtime.
Required by: man-db

libquadmath0 (4.8.3-4)
GCC Quad-Precision Math runtime library
Required by: gcc-core

libsmartcols1 (2.25.2-1)
Tabular data formatting library (runtime)
Required by: util-linux

libsqlite3_0 (3.8.7.2-1)
An embeddable SQL database engine (library)
Required by: python

libtasn1_6 (4.2-1)
Tiny ASN.1 library (runtime)
Required by: p11-kit, p11-kit-trust

libuuid-devel (2.25.2-1)
Universally Unique ID library (development)
Required by: python

libxml2 (2.9.2-1)
GNOME XML library (runtime)
Required by: perl_vendor

lynx (2.8.7-1)
Text-based Web browser
Required by: man-db

mingw-binutils (2.23.1-1)
Binutils for MinGW.org Win32 toolchain
Required by: mingw-gcc-core

mingw-gcc-core (4.7.3-1)
GNU Compiler Collection (C, OpenMP)
Required by: mingw-gcc-g++, mingw-gcc-g++

mingw-gcc-g++ (4.7.3-1)
GNU Compiler Collection (C++)
Required by: gcc-mingw-g++

mingw-pthreads (20110507-2)
Libpthread for MinGW.org Win32 toolchain
Required by: mingw-gcc-core

p11-kit (0.20.7-1)
PKCS#11 module tool
Required by: ca-certificates

p11-kit-trust (0.20.7-1)
PKCS#11 module library
Required by: ca-certificates

perl_vendor (5.14.2-3)
Additional vendor modules previously packaged in perl-5.10
Required by: texinfo

popt (1.16-1)
Library for parsing cmdline parameters
Required by: libpopt0

python (2.7.8-1)
Python language interpreter
Required by: gdb

tcl (8.5.11-1)
Tool Command Language
Required by: tcltk

vim-common (7.4.527-1)
Vi IMproved - enhanced vi editor (common runtime)
Required by: vim

w32api-headers (3.3.0-2)
MinGW-w64 Windows API headers for Cygwin
Required by: gcc-core, w32api

w32api-runtime (3.3.0-1)
MinGW-w64 Windows API import libraries for Cygwin
Required by: gcc-core, w32api

windows-default-manifest (6.4-1)
Default Windows application manifest
Required by: gcc-core

xxd (7.4.527-1)
Hexdump utility
Required by: vim-common

zlib-devel (1.2.8-3)
Gzip de/compression library (development)
Required by: binutils

_autorebase (000713-1)
Run rebaseall automatically
Required by: cygwin, file, gawk, gcc-core, libblkid1, libgcc1, libssp0, libstdc++6, libuuid1, man-db, mingw-runtime, perl, zlib0, libgmp10, libatomic1, libgomp1, libmpc3, libquadmath0, python, libpcre1, libpipeline1, perl_vendor, libsmartcols1, libopenssl100, libsqlite3_0, libxml2, p11-kit-trust, libp11-kit0, libtasn1_6
[/m]

Are these the correct one?? (Wondering)
 
  • #63
mathmari said:
Are these the correct one?? (Wondering)

I hope so! (Doh)

Does it work now? (Wondering)
 
  • #64
Yes, it works now! (Smile)

For [m]gcc -v[/m] I get:

[m]Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-pc-cygwin/4.8.3/lto-wrapper.exe
Target: i686-pc-cygwin
...
gcc version 4.8.3 (GCC)[/m]

and for [m]gdb -v[/m] I get:

[m]GNU gdb (GDB) 7.8
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-pc-cygwin".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".[/m]
 
Last edited by a moderator:
  • #65
When I write now [m]gcc -g main.c stars.c[/m] and then [m]gdb a.exe[/m] and [m](gdb) r[/m] I get the following:

[m]Starting program: /cygdrive/c/cygwin/a.exe
[New Thread 2460.0xa08]
[New Thread 2460.0x1098]
Usage: /a <input_file>
[Thread 2460.0x1098 exited with code 1]
[Inferior 1 (process 2460) exited with code 01][/m]

What does this mean?? (Wondering)
 
  • #66
Seems like your program a.exe wants an input file, and is printing out its usage information... what does your main function look like, and have you tried following the instructions it's giving you and trying:
Code:
gdb a.exe <input_file>
where <input_file> is to be replaced with a suitable input file, I have no idea what that would be, I haven't followed the thread which is a bit of a mess anyway, it would help a lot if you posted your entire program.
 
  • #67
Bacterius said:
Seems like your program a.exe wants an input file, and is printing out its usage information... what does your main function look like, and have you tried following the instructions it's giving you and trying:
Code:
gdb a.exe <input_file>
where <input_file> is to be replaced with a suitable input file

Indeed!

However, the command should be:
Code:
gdb --args a.exe input.txt
Otherwise the input file is interpreted as a core dump. (Wasntme)
 
  • #68
Ok! Now I get the following:

[m]Starting program: /cygdrive/c/cygwin/a.exe file.txt
[New Thread 2072.0x1674]
[New Thread 2072.0x93c]

...

Program received signal SIGSEGV, Segmentation fault.
0x004024e6 in destruction (solid=7620203, gap=5000) at stars.c:309
309 sum=sum+f->gap;
[/m]

Why do I get a segmentation fault at this point?? (Wondering) The function destruction() is the following:

Code:
int destruction(int solid, int gap){
	int ffplanpos=-1;
	int i, j;
	int sum=0;
	asteroid_t *planf = calloc(1, sizeof(asteroid_t));
	asteroid_t *K=NULL;
	asteroid_t *f=NULL;
	plansys_t *p=NULL;
	for(i=0; i<Sfreep; i++){
		p=StarS[i].plasy;
		while (p != NULL && p->solid != solid){
			p=p->next;
			j=i;
		}
	}
	if(p == NULL){
		printf("The planetary system with identifier %d couldn't be found\n", solid);
		return -1;
	}
	f=p->asteroids;
	while(sum<gap){
		sum=sum+f->gap;
		f=f->next;
		DELETE(f->prev, f->prev->as);
	}
	

	for(i=0; i<max; i++){
		if(StarS[j].ffplan[i].fp == INT_MAX){
			ffplanpos=i;
		}
	}
	
	if(ffplanpos == -1){
		return -1;
	}
	
	StarS[j].ffplan[ffplanpos].fp=solid;
	
	
	planf->as=f->as;
	planf->gap=0;
	planf->next=NULL;
	planf->prev=NULL;	f=f->next;
	while(f != NULL){
		if (StarS[j].ffplan[ffplanpos].ff == NULL) {
        	StarS[j].ffplan[ffplanpos].ff = planf;
        } else {
        	asteroid_t *last = StarS[j].ffplan[ffplanpos].ff;
        	while (last->next != NULL) {
        		last = last->next;
        	}
        	last->next = planf;
       	}     
	f=f->next;
	}     
	
	
	printf("\n\nPlanet Systems = ");
	
	while(StarS[j].plasy != NULL){
		printf(" %d ", StarS[j].plasy->solid);
		StarS[j].plasy=StarS[j].plasy->next;
	}
	
	printf("\n\nFree-floatingM = ");
	
	for(i=0; i<ffplanpos; i++){
		printf(" %d ", StarS[j].ffplan[i].fp);
	}
	
	printf("\n\nFree-floating planets = ");

	
	for(i=0; i<=ffplanpos; i++){
		while(StarS[j].ffplan[i].ff != NULL){
			printf(" %d ", StarS[j].ffplan[i].ff->as);
			StarS[j].ffplan[i].ff=StarS[j].ffplan[i].ff->next;
		}
	}

	return 0;
	
}
 
Last edited by a moderator:
  • #69
mathmari said:
[m]Program received signal SIGSEGV, Segmentation fault.
0x004024e6 in destruction (solid=7620203, gap=5000) at stars.c:309
309 sum=sum+f->gap;
[/m]

Why do I get a segmentation fault at this point?? (Wondering)

Because you are trying to dereference [m]f[/m] when it is not a valid pointer. (Doh)

Shouldn't there be a check whether [m]f[/m] is NULL or not? (Wondering)
 
  • #70
I like Serena said:
Because you are trying to dereference [m]f[/m] when it is not a valid pointer. (Doh)

Shouldn't there be a check whether [m]f[/m] is NULL or not? (Wondering)

I added the check

Code:
if(p->asteroids == NULL){
		printf("The planetary system doesn't contain any asteroids\n");
		return 0;
	}

Now I get the following:

[m]Starting program: /cygdrive/c/cygwin/a.exe file.txt
[New Thread 5184.0x13f4]
[New Thread 5184.0x798]

...

The planetary system doesn't contain any asteroids
D 7620203 5000 failed
[Thread 5184.0x798 exited with code 0]
[Inferior 1 (process 5184) exited normally][/m]

But why doesn't it contain any asteroids?? (Wondering)

Didn't we add the asteroids with the following function??

Code:
asteroid_t *asteroid_constitution(int as, int gap, int solid){
	int i, g=0;
	asteroid_t *ast = calloc(1, sizeof(asteroid_t));
	ast->as=as;
	ast->gap=gap;
	ast->prev=NULL;
	ast->next=NULL;
	plansys_t *p=NULL;
	for(i=0; i<Sfreep; i++){
		p=StarS[i].plasy;
		while (p != NULL && p->solid != solid){
			p=p->next;
		}
	}
	if (p->asteroids==NULL){
		p->asteroids=ast;
	}
	else{
                asteroid_t *last=p->asteroids;
                asteroid_t *q=NULL;
                asteroid_t *previous=NULL;
                if(ast->gap < last->gap){
                        ast->prev=NULL;
                        ast->next=last;
                        last->prev=ast;
                        last->gap=last->gap-ast->gap;
                        p->asteroids=ast;
                }
                else{
	                while(g < ast->gap && last->next != NULL){
	                	g=g+last->gap;
                                previous=last;
                                last=last->next;
                }
                if(last != NULL && last->next==NULL){
                        ast->prev=last;
                        ast->next=NULL;
                        last->next=ast;
                        ast->gap=ast->gap-g;
                }
                else{
                        ast->next=last->next;
                        last->next->prev=ast;
                        ast->prev=last;
                        last->next=ast;
                        ast->gap=ast->gap-g;
                        q=ast->next;
                        q->gap=q->gap-ast->gap;
            }
        }
    } 
    return 1;
}

(Wondering)
 

Similar threads

  • Programming and Computer Science
Replies
2
Views
1K
  • Programming and Computer Science
Replies
1
Views
1K
  • Programming and Computer Science
Replies
20
Views
4K
  • Engineering and Comp Sci Homework Help
Replies
0
Views
4K
Replies
1
Views
1K
  • MATLAB, Maple, Mathematica, LaTeX
Replies
5
Views
3K
Back
Top