Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Segmentation fault

Postades av 2006-05-17 18:26:58 - Tom Granqvist, i forum c++, Tråden har 2 Kommentarer och lästs av 799 personer

Hej!
Hjälper en kompis med en skoluppgift. Koden är:

/* Dijkstras algorithm to compute the shortest path through a graph. */
#include <stdio.h>
#define MAX_NODES 6		/* maximum number of nodes */
#define INFINITY 1000	/* a number larger than every maximum path */

long n = MAX_NODES;

long dist[MAX_NODES][MAX_NODES] = {
	{0,2,3,1,0,0},
	{2,0,3,2,0,0},
	{5,3,0,3,1,5},
	{1,2,3,0,1,0},
	{0,0,1,1,0,2},
	{0,0,3,0,2,0}};
	
void shortest_path(int s, int t, int path[]) {
	/* the path being worked on */
	struct state {
		int predecessor;                  /* previous node */
		int length;                       /* length from source to this node */
		enum {permanent, tentative} label;/* label state */
	} state[MAX_NODES];
	
	int i, k, min;
	struct state *p;
	
	for (p = &state[0]; p < &state[n]; p++) {
		    /* initialize state */
	        p->predecessor = -1;
	        p->length = INFINITY;
	        p->label = tentative;
	}
	state[t].length = 0; 
	state[t].label = permanent;
	k = t;                                /* k is the initial working node */
	do {                                  /* Is there a better path from k? */
		for (i = 0; i < n; i++)       /* this graph has n nodes */
		if (dist[k][i] != 0 && state[i].label == tentative) {
			if (state[k].length + dist[k][i] < state[i].length) {
				state[i].predecessor = k;
				state[i].length = state[k].length + dist[k][i];
			}
		}
		
		/* Find the tentatively labeled node with the smallest label. */
		k = 0; min = INFINITY;
		for (i = 0; i < n; i++)
			if (state[i].label == tentative && state[i].length < min) {
				min = state[i].length;
				k = i;
			}
		state[k].label = permanent;
	} while (k != s);

   /* Copy the path into the output array. */
   i = 0; k = s;
   do {path[i++] = k; k = state[k].predecessor; } while (k >= 0);
}

int main() {
	int total,a,b,x=0,y=2,c[MAX_NODES]; 
	do	{
		printf("Source node number:");
		fflush(stdin);
		scanf("%d",&x);
		if(x >= MAX_NODES)
			printf("the source number can not.....");
	} while (x >= MAX_NODES);

	for (y = 0; y < MAX_NODES; y++) {
		if (x == y) y++;
		if (y == MAX_NODES) break;
				
		for (a = 0; a < MAX_NODES; a++) {
			c[a] = INFINITY;
		}
		
		shortest_path(x,y,c);
		total = 0;

		printf("nodes in path ");
		for ( a = 0; c[a] != INFINITY; a++) {
			printf("%d ",c[a]);
			total += dist[c[a]][c[a+1]]; // problem här
		}

		total -= dist[c[a-1]][c[a]]; // och här
		printf("\n minimum path from node %d to node %d has cost %d \n",x,y,total);
	}
	return;
}


Det är en implementation av dijkstras algoritm.. På de markerade ställen får jag segmentation fault. Det har väl att göra med arrayn som overflowar? Det som tarmest i pannan är att jag löste uppgiften i fjol på samma kurs men inte kan komma på hur jag gjorde. Kompilerar med GCC.


Svara

Sv: Segmentation fault

Postades av 2006-05-17 19:42:29 - Niklas Jansson

Jag upplever koden som ganska rörig, åtminstone vid första anblick.

Segmentation faults är i stort sett alltid pekarproblem (det är därför man inte använder gammaldags språk som C, utan C++ istället =) ).

Om vi tittar på ena av raderna kan vi ju se att det finns tre möjligheter för den att krascha:
total += dist[c[a]][c[a+1]];

-c[a] (=addr1)
-c[a+1] (=addr2)
-dist[addr1][addr2]

Så antingen så är elementen i c större än MAX_NODES, eller så är a+1 större än MAX_NODES.
Jag skulle börja med att se till att skriva ut elementen för att kunna debugga det, alternativt använda en riktig debugger. Min spontana gissning är att en lösning på första felet är något i stil med:

for ( a = 0; (c[a] != INFINITY) && (a+1 < MAX_NODES); a++) {
printf("%d ",c[a]);
total += dist[c[a]][c[a+1]];
}


Svara

Sv:Segmentation fault

Postades av 2006-06-02 07:11:46 - Tom Granqvist

Du har rätt, koden är väldigt rörig. Det som stör mest är att jag fick den att fungera i fjol, men inte nu! Tack för hjälpen, stänger inlägget.


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 619
27 953
271 709
481
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies