Xref: news-dnh.mv.net comp.os.msdos.djgpp:3731 Path: news-dnh.mv.net!mv!news.sprintlink.net!cheatum.frontiernet.net!Empire.Net!news.net99.net!news.alt.net!news1.alt.net!news.u.washington.edu!aue From: aue AT u DOT washington DOT edu (A. Aue) Newsgroups: comp.os.msdos.djgpp Subject: wierd "bug" in my program? Date: 9 Dec 1995 04:18:51 GMT Organization: University of Washington, Seattle Lines: 137 Nntp-Posting-Host: homer31.u.washington.edu Nntp-Posting-User: aue To: djgpp AT sun DOT soe DOT clarkson DOT edu Dj-Gateway: from newsgroup comp.os.msdos.djgpp Help! I'm having a really strange problem with the bridge program I'm writing under djgpp. There are three functions, main(), deal() and initialize(). I declare a structure outside of the program containing all the information I'll need for the hands so that all of the functions can use it. Initialize, which words properly, simply zeroes all the variables in the structure. deal() reads random numbers from 1-52 into the arrays Hand[x].cards. This also seems to work properly. The problem crops up when I print the contents of these arrays onto the screen. Oh yeah - here's my sys. info: I am running it on a 386dx40, 4meg ram, under dos (_not_ the windows dos box.) Anyway, the problem is as follows: At first, I didn't even have the element hand.name included in the Hand structure, because I don't need it. Every time I ran the program, though, I got a "segmentation violation in pointer blah blah blah" - which is wierd, 'cause I'm not even using pointers in the program, though I guess the compiler must be creating some. Anyway, I don't know why I put the element in, but I did, and when I run it now, it works - _as long as_ the strings I give allhands[o].name are three or less characters long. (i.e. "sou" is valid, but "south" is not.) Whenever I put in a longer string, it gives me the segmentation violantion errors again. When I symify, it won't tell me the line number in the program where the error occured (the program runs, but gives me the error message at the end of the for loop in the main() function. What is going on here? Why won't it run properly without the name[] element, and why does it mess up when allhands.name[o] is more than three characters long? I'm confused. If anyone has any light to shed on this problem, I'd really appreciate it. To avoid wasting BW, feel free to email me at . Thanks in advance for any help. (program follows) #include #include #include typedef struct hand { char name[30]; int cards[13]; int clubs[13]; int diamonds[13]; int hearts[13]; int spades[13]; int numclubs; int numdiamonds; int numhearts; int numspades; int hcp; int dp; int tp; int turn; int bid; } Hand; main() { Hand hands[4]; int n; void initialize (Hand[]); void deal (Hand[]); printf("begin main"); initialize (hands); deal (hands); printf("hello."); for (n=1; n<=13; ++n) printf("South %d west %d north %d east %d\n", hands[1].cards[n], hands[2].cards[n], hands[3].cards[n], hands[4].cards[n]); printf("end main."); } void deal (Hand allhands[]) { int r; int n; int deck[53]; int shuffle[53]; printf("beginning deal"); srand((unsigned)time(NULL)); /* seeds random number counter */ for (n=1; n<=52; ++n) /* reads cards into deck */ deck[n]=n; n=1; while (n <= 52) /* shuffles the deck */ { r=rand()%52; if (deck[r+1]!=0) { shuffle[n]=deck[r+1]; deck[r+1]=0; ++n; } } for (n=1; n<=13; ++n) /* reads the cards into hands */ { allhands[1].cards[n]=shuffle[n]; allhands[2].cards[n]=shuffle[n+13]; allhands[3].cards[n]=shuffle[n+26]; allhands[4].cards[n]=shuffle[n+39]; } printf("end deal."); } void initialize (Hand allhands[]) { int n; int o; printf("begin initialize"); for (o=1; o<=4; ++o) { scanf("%s", allhands[o].name); for (n=0; n<=13; ++n) { allhands[o].cards[n]=allhands[o].clubs[n]=allhands[o].diamonds[n]= allhands[o].hearts[n]=allhands[o].spades[n]=0; } allhands[o].numclubs=allhands[o].numdiamonds=allhands[o].numhearts= allhands[o].numspades=allhands[o].hcp=allhands[o].dp=allhands[o].tp= allhands[o].turn=allhands[o].bid=0; } printf("end initialize."); }