public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
* c++/4929: Internal compiler error in c++
@ 2001-11-18 20:10 vesterstrom
0 siblings, 0 replies; 2+ messages in thread
From: vesterstrom @ 2001-11-18 20:10 UTC (permalink / raw)
To: gcc-gnats
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 32434 bytes --]
>Number: 4929
>Category: c++
>Synopsis: Internal compiler error in c++
>Confidential: no
>Severity: critical
>Priority: medium
>Responsible: unassigned
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Thu Nov 22 09:36:01 PST 2001
>Closed-Date:
>Last-Modified:
>Originator: ?
>Release: unknown-1.0
>Organization:
>Environment:
cygwin
>Description:
$ c++ -O3 soli.cpp
soli.cpp: In function `struct enddata * MakeEndGameData(enddata *, int)':
soli.cpp:472: Internal compiler error.
soli.cpp:472: Please submit a full bug report.
soli.cpp:472: See <URL:http://www.gnu.org/software/gcc/bugs.html> for instructions.
>How-To-Repeat:
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted:
----gnatsweb-attachment----
Content-Type: text/plain; name="soli.cpp"
Content-Disposition: inline; filename="soli.cpp"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//#define S_DEBUG
#define MAX(x,y) ((x) > (y) ? (x) : (y))
#define MIN(x,y) ((x) < (y) ? (x) : (y))
#define LONG_MAX 1000000000
struct u {
int val; // val = -1 <=> udefineret; val = 0 <=> tom; val = 1 <=> pind
//int mark;
} U;
struct pt {
int x,y,z,w,n;
} PT;
struct peg {
int x,y;
} PEG;
struct game {
int max;
struct peg *p;
} GAME;
struct gamelist {
int max;
struct game *g;
} GAMELIST;
struct enddata {
int max;
struct gamelist *l;
} ENDDATA;
struct pt mvList[33];
struct pt moves[33];
int moveTop = 0, listMax = -1, treeBest = -1;
long leaves = 0,skips = 0, solutions = 0, level = -1, pSize = 1, tmpEstTreeSize;
double progress;
char p = '%';
void init_malloc(struct u **b);
void init_values(struct u **b);
void print(struct u **b);
int randintval(int low, int high);
double randval(double low, double high);
int nMoves(struct u **b);
int move(struct u **b, int x, int y, int r);
int isMove(struct u **b, int x, int y, int r);
struct pt *MoveList(struct u **b, int *size);
struct pt searchAll(struct u **b, int removed);
int loadboard(struct u **b, char *filename, int *removed);
int saveboard(struct u **b, char *filename);
int isSolvable(struct u **b,int removed);
struct enddata *MakeEndGameData(struct enddata *db, int calclevel);
void PrintEndGameData(struct enddata *db, char *filename);
struct pt trf(int id, int x, int y);
int compareINT(const int *arg1, const int *arg2);
int comparePEG(const struct peg *arg1, const struct peg *arg2);
int compareGAME(const struct game *arg1, const struct game *arg2);
struct enddata *loadDbFromFile(struct enddata *db, char *filename);
struct enddata *EndGameDataAddLevel(struct enddata *db);
struct enddata *db;
int dblevel = 0;
int main(int argc, char *argv[]) {
struct u **b;
struct pt res;
int i,x=-1,y=-1,r=-1, removed=0, points=0,tmp,bDone=0,movesLeft,j,inited=0;
char c[80];
char filename[256];
char gameover [] = "\
============================================================\n\
================ GAME OVER !! ==============\n\
============================================================\n";
char line [] = "============================================================\n";
printf("%s",line);
srand((unsigned)time(NULL));
// malloc
b = (struct u **)malloc(7 * sizeof(U));
for(i=0;i<7;i++)
b[i] = (struct u *)malloc(7 * sizeof(U));
if (argc > 1) {
sscanf(argv[1], "%s", filename);
inited = loadboard(b,filename,&removed);
}
if (!inited)
init_values(b);
db = NULL;
while (removed < 31 && (movesLeft = nMoves(b)) > 0) {
//printf("Press a key\n");
//fgets(c,80,stdin);
print(b);
printf("Moves left: %d Removed: %d\n",movesLeft,removed);
fgets(c,80,stdin);
sscanf(c,"%d.%d.%d\n",&x,&y,&r);
if (c[0] == 's') {
printf("Save g)ame or d)atabase ? \n");
fgets(c,80,stdin);
if (c[0] == 'g') {
printf("Filename: " );
gets(filename);
if (saveboard(b,filename))
printf("The board was saved\n");
} else if (c[0] == 'd') {
printf("Enter a filename to save the database in (doesn't save if no filename): ");
gets(filename);
PrintEndGameData(db,filename);
}
} else if (c[0] == 'a') {
db = EndGameDataAddLevel(db);
} else if (c[0] == 'm') {
int i;
for(i=0,printf("Moves: ");i<moveTop;i++)
printf("(%d.%d.%d) ",moves[i].x,moves[i].y,moves[i].z);
printf("\n");
} else if (c[0] == 10) {
printf("No input\n");
} else if (c[0] == 'r') {
x = moves[moveTop].x;
y = moves[moveTop].y;
r = moves[moveTop].z;
} else if (c[0] == 'd') {
int calclevel = 0;
printf("How many pegs should the precalculated boards at most contain?\n");
fgets(c,80,stdin);
sscanf(c,"%d\n",&calclevel);
if (calclevel > 0) {
db = MakeEndGameData(db,calclevel-1);
//system("pause");
} else
printf("No precomputation done this time.\n");
dblevel = calclevel;
} else if (c[0] == 'u') {
if (moveTop > 0) {
int lx,ly,lz;
moveTop--;
lx = moves[moveTop].x;
ly = moves[moveTop].y;
lz = moves[moveTop].z;
b[lx][ly].val = 1;
if (lz == 1) {b[lx-1][ly].val = 1; b[lx-2][ly].val = 0;}
else if (lz == 2) {b[lx+1][ly].val = 1; b[lx+2][ly].val = 0;}
else if (lz == 3) {b[lx][ly-1].val = 1; b[lx][ly-2].val = 0;}
else if (lz == 4) {b[lx][ly+1].val = 1; b[lx][ly+2].val = 0;}
removed--;
}
} else if (c[0] == 't') {
printf("%s\n",(isSolvable(b,removed)) ? "Kan loeses" : "Kan ikke loeses");
} else if (c[0] == 'l') {
printf("Load g)ame or d)atabase ? \n");
fgets(c,80,stdin);
if (c[0] == 'g') {
printf("load!\n");
printf("Filename: " );
gets(filename);
if (loadboard(b,filename,&removed))
printf("The board was loaded\n");
} else if (c[0] == 'd') {
printf("Trying to load database from file: ");
gets(filename);
if ((db = loadDbFromFile(db, filename)) != NULL) {
printf("done!\n");
dblevel = db->max;
//PrintEndGameData(db);
} else {
printf("ERROR\n");
dblevel = 0;
}
}
} else if (c[0] == 'q') {
printf("quit!\n");
exit(0);
}
if (x == 99) {
int tStart = clock();
leaves=0; skips = 0; solutions = 0;
treeBest = listMax = -1;
tmpEstTreeSize = 1;
progress = 0;
for(j=0;j<33;j++)
mvList[j].x = mvList[j].y = mvList[j].z = mvList[j].w = mvList[j].n = -1;
res = searchAll(b,removed);
printf("\nMax: %d Removed: %d Best: %d (%d nodes searched; %d branches were cut; %d sol's.(%.1lfs - %d node/s))\nList:",res.x,res.z,res.y,leaves,skips,solutions,(float) (clock()-tStart)/CLOCKS_PER_SEC, (int)((float)leaves / (float)((clock()-tStart)/CLOCKS_PER_SEC)));
for(j=0;j<listMax;j++)
printf("(%d,%d,%d,n%d(%d)) ",mvList[j].x,mvList[j].y,mvList[j].z,mvList[j].n,mvList[j].w);
printf("\n");
}
if (isMove(b,x,y,r)) {
moves[moveTop].x = x;
moves[moveTop].y = y;
moves[moveTop].z = r;
moveTop++;
}
tmp = move(b,x,y,r);
removed += tmp;
if (removed == 31 && b[3][3].val == 1)
removed = 32;
x=y=r=-1;
}
print(b);
printf("\n%s%sTotal %d removed\n%s",line,(removed == 32 ? "Congratulations, you cleared the board.\n" : "You didn't clear the board and missed the bonus.\n"),removed,gameover);
printf("Save the game. Enter a filename: " );
gets(filename);
if (saveboard(b,filename))
printf("The board was saved\n");
return 0;
}
int compareINT(const int *arg1, const int *arg2) {
if ((*arg1)<(*arg2)) return -1;
if ((*arg1)>(*arg2)) return 1;
return 0;
}
int comparePEG(const struct peg *arg1, const struct peg *arg2) {
if (arg1->x < arg2->x) return -1;
if (arg1->x > arg2->x) return 1;
// HERE: arg1->x == arg2->x
if (arg1->y < arg2->y) return -1;
if (arg1->y > arg2->y) return 1;
#ifdef S_DEBUG
printf("comparePEG: Argument 1 and 2 are equal: (%d,%d)\n",arg1->x,arg1->y);
fflush(stdout);
#endif
return 0;
}
int compareGAME(const struct game *arg1, const struct game *arg2) {
// input: 2 sorterede games
int i, compare;
for(i=0;i<arg1->max;i++)
if ((compare = comparePEG(&arg1->p[i],&arg2->p[i])) != 0) return compare;
#ifdef S_DEBUG
printf("compareGAME: Argument 1 and 2 are equal\n");
fflush(stdout);
#endif
return 0;
}
void setPeg(struct enddata *db, int level, int game, int peg, int x, int y) {
db->l[level].g[game].p[peg].x = x;
db->l[level].g[game].p[peg].y = y;
}
void setPeg2(struct game *g, int k, int x, int y) {
g->p[k].x = x;
g->p[k].y = y;
}
int isPegSet(struct game *g, int x, int y) {
int i;
for(i=0;i<g->max;i++) {
if ((g->p[i].x == x) && (g->p[i].y == y)) return 1;
}
return 0;
}
int equalUnderTrans(struct game *g1, int t, struct game *g2) {
int i;
if (g1->max != g2->max) return 0; // the two boardpositions must be of same size to be equal
for(i=0;i<g1->max;i++) {
struct pt aPt = trf(t,g1->p[i].x,g1->p[i].y);
if (!isPegSet(g2,aPt.x,aPt.y))
return 0;
}
return 1;
}
int isPrevBoard(struct game *g, int k, int r) {
int x = g->p[k].x ,y = g->p[k].y;
switch (r) {
case 1:
if (x < 2 || x > 6 || y < 0 || y > 6) return 0;
if ((y >= 5 || y < 2) && x < 4) return 0;
if (isPegSet(g,x-2,y) || isPegSet(g,x-1,y)) return 0;
return 1;
break;
case 2:
if (x > 4 || x < 0 || y < 0 || y > 6) return 0;
if ((y >= 5 || y < 2) && x > 2) return 0;
if (isPegSet(g,x+2,y) || isPegSet(g,x+1,y)) return 0;
return 1;
break;
case 3:
if (y < 2 || y > 6 || x < 0 || x > 6) return 0;
if ((x >= 5 || x < 2) && y < 4) return 0;
if (isPegSet(g,x,y-2) || isPegSet(g,x,y-1)) return 0;
return 1;
break;
case 4:
if (y > 4 || y < 0 || x < 0 || x > 6) return 0;
if ((x >= 5 || x < 2) && y > 2) return 0;
if (isPegSet(g,x,y+2) || isPegSet(g,x,y+1)) return 0;
return 1;
break;
default:
return 0;
break;
}
}
void setGame(struct game *g,struct game *newgame, int i) {
g[i] = *newgame;
}
struct enddata *EndGameDataAddLevel(struct enddata *db) {
int j,k,m,r,l,s=0,t=0,top = 0, procent = 0;
if (db == NULL || db->max < 1) {
printf("Can't add when there is no existing levels to add on.\n");
return db;
}
db->max++;
m = db->max;
db->l = (struct gamelist *)realloc(db->l, m * sizeof(GAMELIST));
db->l[m-1].max = db->l[m-2].max * (m-1) * 4;
db->l[m-1].g = (struct game *)malloc(db->l[m-1].max * sizeof(GAME));
printf("|");
for(j=1;j<49;j++)
printf("-");
printf("|\n");
for(j=0;j<db->l[m-2].max;j++) { // for all games on level m-2
int progress = 100 * j / db->l[m-2].max;
while (procent < progress) {
if ((procent % 2) == 0) {printf("."); fflush(stdout);}
procent++;
}
;// find all boards, b, that lead to db[m-2][j]
for(k=0;k<db->l[m-2].g[j].max;k++) { // for all pegs in a game
for(r=1;r<5;r++) { // for all directions of move
struct game *newgame = (struct game *)malloc(sizeof(GAME)); // make a potential new game
if (isPrevBoard(&db->l[m-2].g[j],k,r)) { // checks if the board db->l[m-2].g[j] could come from
int add = 1; // a board where 2 pegs were removed from the direction r to become the single peg, k
int n1x, n1y, n2x, n2y, lx = db->l[m-2].g[j].p[k].x, ly = db->l[m-2].g[j].p[k].y;
switch (r) {
case 1:
n1x = lx-1; n2x = lx-2; n1y = n2y = ly; break;
case 2:
n1x = lx+1; n2x = lx+2; n1y = n2y = ly; break;
case 3:
n1y = ly-1; n2y = ly-2; n1x = n2x = lx; break;
case 4:
n1y = ly+1; n2y = ly+2; n1x = n2x = lx; break;
}
newgame->p = (struct peg *)malloc(((db->l[m-2].g[j].max)+1) * sizeof(PEG));
for(l=0;l<db->l[m-2].g[j].max;l++) {
setPeg2(newgame, l, db->l[m-2].g[j].p[l].x, db->l[m-2].g[j].p[l].y);
}
setPeg2(newgame, k, n1x, n1y);
setPeg2(newgame, db->l[m-2].g[j].max, n2x, n2y);
newgame->max = (db->l[m-2].g[j].max) + 1;
;// if (for all transformations: b is not on any place in db[m-2+1])
;// add b to db[m-2+1]
/*
for(s=0;s<db->l[m-2+1].max && (add == 1);s++) {
for(t=0;t<8 && (add == 1);t++) {
if (equalUnderTrans(newgame,t,&db->l[m-2+1].g[s])) add = 0;
}
}
*/
if (add == 1) {
qsort((void *)newgame->p,(size_t)newgame->max,sizeof(PEG),(int (__cdecl *)(const void *,const void *))comparePEG);
setGame(db->l[m-2+1].g,newgame,top++);
//db->l[m-2+1].max = (db->l[m-2+1].max) + 1;
} else
free(newgame);
}
}
}
}
printf("\nSize of new level %d: %d\n",m-1,top);
db->l[m-1].max = top;
qsort((void *)db->l[m-1].g,(size_t)db->l[m-1].max,sizeof(GAME),(int (__cdecl *)(const void *,const void *))compareGAME);
// mark duplicates
l = 0;
for(j=1;j<db->l[m-1].max;j++) {
if ((j%1000) == 0) printf(".");
if (compareGAME(&db->l[m-1].g[l],&db->l[m-1].g[j]) == 0) {db->l[m-1].g[j].p[0].x = 9; top--;}
else l = j;
}
printf("Marking done!\n");
// sort again, so duplicates are put in the end
qsort((void *)db->l[m-1].g,(size_t)db->l[m-1].max,sizeof(GAME),(int (__cdecl *)(const void *,const void *))compareGAME);
db->l[m-1].max = top;
printf("\nSize of new level %d: %d\n",m-1,top);
/*
for(j=0;j<db->l[m-1].max;j++) {
for(k=j+1;k<db->l[m-1].max;k++) {
for(t=0;t<8;t++)
if (equalUnderTrans(&db->l[m-1].g[j],t,&db->l[m-1].g[k])) printf("coll (%d,%d) ",j,k);
}
}
*/
return db;
}
struct enddata *MakeEndGameData(struct enddata *db, int calclevel) {
int i,j,k,l,r,t,s,nlevels; //9
int levelsize[] = {1,1,2,8,39,171,719,2757,9751,31312};
nlevels = calclevel;
// space allocation
db = (struct enddata *)malloc(sizeof(ENDDATA));
db->max = nlevels + 1;
db->l = (struct gamelist *)malloc(db->max * sizeof(GAMELIST));
// malloc and set set initial board
for(i=0;i<db->max;i++)
db->l[i].g = (struct game *)malloc(levelsize[i] * sizeof(GAME));
db->l[0].max = 1;
// only allocation for level 0
// other levels will be allocated later
for(i=1;i<db->max;i++)
db->l[i].max = 0;
db->l[0].g[0].p = (struct peg *)malloc(1 * sizeof(PEG));
db->l[0].g[0].max = 1;
setPeg(db,0,0,0,3,3); // set level 0, game 0, peg 0 to 3,3
printf("Max-level: %d\n",db->max-1);
for(i=0;i<db->max-1;i++) { // for all levels
int procent = 0;
printf("Level %d ",i+1);
for(j=0;j<db->l[i].max;j++) { // for all games on a level
int progress = 100 * j / db->l[i].max;
while (procent < progress) {
if ((procent % 2) == 0) {printf("."); fflush(stdout);}
procent++;
}
;// find all boards, b, that lead to db[i][j]
for(k=0;k<db->l[i].g[j].max;k++) { // for all pegs in a game
for(r=1;r<5;r++) { // for all directions of move
struct game *newgame = (struct game *)malloc(sizeof(GAME)); // make a potential new game
if (isPrevBoard(&db->l[i].g[j],k,r)) { // checks if the board db->l[i].g[j] could come from
int add = 1; // a board where 2 pegs were removed from the direction r to become the single peg, k
int n1x, n1y, n2x, n2y, lx = db->l[i].g[j].p[k].x, ly = db->l[i].g[j].p[k].y;
switch (r) {
case 1:
n1x = lx-1; n2x = lx-2; n1y = n2y = ly; break;
case 2:
n1x = lx+1; n2x = lx+2; n1y = n2y = ly; break;
case 3:
n1y = ly-1; n2y = ly-2; n1x = n2x = lx; break;
case 4:
n1y = ly+1; n2y = ly+2; n1x = n2x = lx; break;
}
newgame->p = (struct peg *)malloc(((db->l[i].g[j].max)+1) * sizeof(PEG));
for(l=0;l<db->l[i].g[j].max;l++) {
setPeg2(newgame, l, db->l[i].g[j].p[l].x, db->l[i].g[j].p[l].y);
}
setPeg2(newgame, k, n1x, n1y);
setPeg2(newgame, db->l[i].g[j].max, n2x, n2y);
newgame->max = (db->l[i].g[j].max) + 1;
;// if (for all transformations: b is not on any place in db[i+1])
;// add b to db[i+1]
for(s=0;s<db->l[i+1].max && (add == 1);s++) {
for(t=0;t<8 && (add == 1);t++) {
if (equalUnderTrans(newgame,t,&db->l[i+1].g[s])) add = 0;
}
}
if (add == 1) {
qsort((void *)newgame->p,(size_t)newgame->max,sizeof(PEG),(int (__cdecl *)(const void *,const void *))comparePEG);
setGame(db->l[i+1].g,newgame,db->l[i+1].max);
db->l[i+1].max = (db->l[i+1].max) + 1;
} else
free(newgame);
}
}
}
}
qsort((void *)db->l[i+1].g,(size_t)db->l[i+1].max,sizeof(GAME),(int (__cdecl *)(const void *,const void *))compareGAME);
printf("\n");
fflush(stdout);
}
return db;
}
struct enddata *loadDbFromFile(struct enddata *db, char *filename) {
int *levelsize;
int t_levels = 0,i,j,tmp1,tmp2;
FILE *dbfile = fopen(filename,"r");
if (dbfile == NULL) {
printf("Error in loadDbFromFile - cannot open file %s\n",filename);
fflush(stdout);
return NULL;
}
if (fscanf(dbfile,"Total %d levels: ", &t_levels) == EOF) printf("error\n");
if (t_levels <= 0) return NULL;
levelsize = (int *)malloc(t_levels * sizeof(int));
for(i=0;i<t_levels;i++) {
fscanf(dbfile,"%d ",&levelsize[i]);
printf("Levelsize %d: %d\n",i+1,levelsize[i]);
}
fscanf(dbfile,"\n");
// space allocation
db = (struct enddata *)malloc(sizeof(ENDDATA));
db->max = t_levels;
db->l = (struct gamelist *)malloc(db->max * sizeof(GAMELIST));
// malloc and set set initial board
for(i=0;i<db->max;i++) {
db->l[i].g = (struct game *)malloc(levelsize[i] * sizeof(GAME));
db->l[i].max = levelsize[i];
}
printf("Max-level: %d\n",db->max-1);
for(i=0;i<db->max;i++) { // for all levels
int procent = 0;
printf("Level %d ",i+1);
fscanf(dbfile,"List of %d possible boards with %d pegs\n",&tmp1,&tmp2);
for(j=0;j<db->l[i].max;j++) { // for all games on a level
int l,progress = 100 * j / db->l[i].max;
struct game *newgame = (struct game *)malloc(sizeof(GAME)); // make a potential new game
fscanf(dbfile,"%d\t",&tmp1);
while (procent < progress) {
if ((procent % 2) == 0) {printf("."); fflush(stdout);}
procent++;
}
newgame->p = (struct peg *)malloc((i+1) * sizeof(PEG));
for(l=0;l<i+1;l++)
fscanf(dbfile,"(%d,%d) ",&newgame->p[l].x,&newgame->p[l].y);
fscanf(dbfile,"\n");
newgame->max = i + 1;
setGame(db->l[i].g,newgame,j);
}
printf("\n");
}
printf("\n");
fflush(stdout);
fclose(dbfile);
return db;
}
void printgame(struct game *g) {
int i;
for(i=0;i<g->max;i++)
printf("(%d,%d) ",g->p[i].x,g->p[i].y);
}
void PrintEndGameData(struct enddata *db, char *filename) {
int i,j,k;
FILE *dbfile;
dbfile = fopen(filename,"w");
if (dbfile == NULL) {
printf("Error in PrintEndGameData - cannot open file %s\n",filename);
fflush(stdout);
return;
}
fprintf(dbfile,"Total %d levels: ",db->max);
for(i=0;i<db->max;i++)
fprintf(dbfile,"%d ",db->l[i].max);
fprintf(dbfile,"\n");
for(i=0;i<db->max;i++) {
printf("Level %d - %d boards\t",i+1,db->l[i].max);
printf("Adding level %d to file: %s...\n",i,filename);
fprintf(dbfile,"List of %d possible boards with %d pegs\n",db->l[i].max,i+1);
for(j=0;j<db->l[i].max;j++) {
fprintf(dbfile,"%d\t",j+1);
for(k=0;k<db->l[i].g[j].max;k++)
fprintf(dbfile,"(%d,%d) ",db->l[i].g[j].p[k].x,db->l[i].g[j].p[k].y);
fprintf(dbfile,"\n");
}
}
printf("Done!\n");
fclose(dbfile);
}
int loadboard(struct u **b, char *filename, int *removed) {
int i,j,val;
FILE *boardfile;
int tmpremoved = -1;
if ((boardfile = fopen(filename,"r")) == NULL) {
printf("The file %s couldn't be opened\n",filename);
return 0;
} else
printf("The file %s was opened\n",filename);
fflush(stdout);
for(j=6;j>=0;j--) {
for(i=0;i<7;i++) {
val = -2;
fscanf(boardfile,"%d",&val);
if (val < -1 || val > 1)
return 0;
b[i][j].val = val;
if (b[i][j].val == 0) tmpremoved++;
}
fscanf(boardfile,"\n");
}
*removed = tmpremoved;
fscanf(boardfile,"\nMoves (%d):\n",&moveTop);
for(i=0;i<moveTop;i++)
fscanf(boardfile,"(%d.%d.%d)\n",&moves[i].x,&moves[i].y,&moves[i].z);
fclose(boardfile);
return 1;
}
int saveboard(struct u **b, char *filename) {
int i,j;
FILE *boardfile;
if ((boardfile = fopen(filename,"w")) == NULL) {
printf("The file %s couldn't be opened\n",filename);
return 0;
} else
printf("The file %s was opened\n",filename);
fflush(stdout);
for(j=6;j>=0;j--) {
for(i=0;i<7;i++) {
if (b[i][j].val >= 0) fprintf(boardfile," ");
fprintf(boardfile,"%d ",b[i][j].val);
}
fprintf(boardfile,"\n");
}
fprintf(boardfile,"\nMoves (%d):\n",moveTop);
for(i=0;i<moveTop;i++)
fprintf(boardfile,"(%d.%d.%d)\n",moves[i].x,moves[i].y,moves[i].z);
fclose(boardfile);
return 1;
}
int move(struct u **b, int x, int y, int r) {
if (isMove(b,x,y,r)) {
switch (r) {
case 1:
b[x][y].val = 0; b[x-1][y].val = 0; b[x-2][y].val = 1;
break;
case 2:
b[x][y].val = 0; b[x+1][y].val = 0; b[x+2][y].val = 1;
break;
case 3:
b[x][y].val = 0; b[x][y-1].val = 0; b[x][y-2].val = 1;
break;
case 4:
b[x][y].val = 0; b[x][y+1].val = 0; b[x][y+2].val = 1;
break;
}
return 1;
} else
return 0;
}
int isMove(struct u **b, int x, int y, int r) {
if (x < 0 || y < 0 || x > 6 || y > 6)
return 0;
if (b[x][y].val == 1) {
switch (r) {
case 1:
if (x > 1 && b[x-1][y].val == 1 && b[x-2][y].val == 0)
return 1;
break;
case 2:
if (x < 5 && b[x+1][y].val == 1 && b[x+2][y].val == 0)
return 1;
break;
case 3:
if (y > 1 && b[x][y-1].val == 1 && b[x][y-2].val == 0)
return 1;
break;
case 4:
if (y < 5 && b[x][y+1].val == 1 && b[x][y+2].val == 0)
return 1;
break;
}
}
return 0;
}
int isPeg(struct u **b, struct pt point) {
return (b[point.x][point.y].val == 1);
}
void r90c(int *x, int *y) {
int tmp = *x;
*x = *y;
*y = 6 - tmp;
}
struct pt trf(int id, int x, int y) {
int i;
struct pt ret;
if (id >= 0 && id < 8) {
if (id >= 4) // spejling i vandret linje
y = 6 - y;
for(i=0;i<(id%4);i++)
r90c(&x,&y);
} else {
printf("Errorneous use of tfr => No rotation done, id is illegal: %d\n",id);
fflush(stdout);
}
ret.x = x;
ret.y = y;
return ret;
}
void trfGAME(int t, struct game *g) {
int i;
for(i=0;i<g->max;i++) {
struct pt aPt;
aPt = trf(t,g->p[i].x,g->p[i].y);
g->p[i].x = aPt.x;
g->p[i].y = aPt.y;
}
}
int findBoardInDB(struct game *g, struct gamelist *l) {
int i_min = 0, i_max = l->max;
int f, compare;
while (i_max - i_min > 0) {
f = (i_max + i_min) / 2;
compare = compareGAME(&l->g[f],g);
if (compare == 0) return f;
else if (compare == -1) i_min = f+1;
else if (compare == 1) i_max = f;
}
return -1;
}
int isSolvable(struct u **b,int removed) {
int i,j;
removed = MIN(removed,31);
if (dblevel > 0 && 32 - removed <= dblevel) {
struct game *g = (struct game *)malloc(sizeof(GAME));
g->max = 0;
g->p = (struct peg *)malloc((32 - removed) * sizeof(PEG));
for(i=0;i<7;i++) {
for(j=0;j<7;j++)
if (b[i][j].val == 1) {
g->p[g->max].x = i;
g->p[g->max].y = j;
g->max++;
}
}
if (g->max != 32 - removed) {
printf("Strange!(%d,%d)",g->max,32 - removed);
fflush(stdout);
}
for(i=0;i<8;i++) {
if (findBoardInDB(g,&db->l[32 - removed - 1]) != -1) {
free(g->p);
free(g);
return 1;
}
trfGAME(1,g);
if (i==3) trfGAME(4,g);
qsort((void *)g->p,(size_t)g->max,sizeof(PEG),(int (__cdecl *)(const void *,const void *))comparePEG);
}
free(g->p);
free(g);
return 0;
}
else
{
switch (removed) {
/*
case 32:
return 1;
break;
*/
case 31:
if (isPeg(b,trf(0,3,3))) return 1;
return 0;
break;
case 30:
for (i=0;i<4;i++)
if (isPeg(b,trf(i,1,3)) && isPeg(b,trf(i,2,3))) return 1;
return 0;
break;
case 29:
for (i=0;i<8;i++) {
if (isPeg(b,trf(i,1,3)) && isPeg(b,trf(i,2,2)) && isPeg(b,trf(i,2,1))) return 1;
if (isPeg(b,trf(i,1,3)) && isPeg(b,trf(i,3,3)) && isPeg(b,trf(i,4,3))) return 1;
}
return 0;
break;
case 28:
for (i=0;i<8;i++) {
if (isPeg(b,trf(i,1,3)) && isPeg(b,trf(i,2,1)) && isPeg(b,trf(i,3,2)) && isPeg(b,trf(i,4,2))) return 1;
if (isPeg(b,trf(i,1,3)) && isPeg(b,trf(i,2,1)) && isPeg(b,trf(i,2,3)) && isPeg(b,trf(i,2,4))) return 1;
if (isPeg(b,trf(i,1,3)) && isPeg(b,trf(i,2,1)) && isPeg(b,trf(i,1,2)) && isPeg(b,trf(i,0,2))) return 1;
if (isPeg(b,trf(i,1,3)) && isPeg(b,trf(i,2,2)) && isPeg(b,trf(i,3,1)) && isPeg(b,trf(i,4,1))) return 1;
if (isPeg(b,trf(i,2,1)) && isPeg(b,trf(i,2,2)) && isPeg(b,trf(i,2,3)) && isPeg(b,trf(i,3,3))) return 1;
if (isPeg(b,trf(i,1,3)) && isPeg(b,trf(i,4,3)) && isPeg(b,trf(i,3,4)) && isPeg(b,trf(i,3,5))) return 1;
if (isPeg(b,trf(i,1,3)) && isPeg(b,trf(i,3,3)) && isPeg(b,trf(i,4,4)) && isPeg(b,trf(i,4,5))) return 1;
if (isPeg(b,trf(i,1,3)) && isPeg(b,trf(i,3,3)) && isPeg(b,trf(i,5,3)) && isPeg(b,trf(i,6,3))) return 1;
}
return 0;
break;
default:
return -1; // return error-value when called with illegal remove-value
break;
}
}
}
struct pt searchAll(struct u **b, int removed) {
// find alle "traekmuligheder"
// for alle muligheder: searchAll(mulighed_i)
// find den bedste og returner
int i,i2,j,n,tmp;
int solved=0, bestMove, bestRemoved;
struct u **bCopy;
struct pt *list;
double tSize = tmpEstTreeSize;
struct pt ret;
struct pt tmppt;
tmppt.x = 0;
#ifdef S_DEBUG
printf("(l-e%d ",level);
fflush(stdout);
#endif
level++;
bestMove = -1;
bestRemoved = removed;
// lav en kopi af b
bCopy = (struct u **)malloc(7 * sizeof(U));
for(i=0;i<7;i++)
bCopy[i] = (struct u *)malloc(7 * sizeof(U));
for(i=0;i<7;i++) {
for(j=0;j<7;j++) {
bCopy[i][j].val = b[i][j].val;
}
}
list = MoveList(bCopy,&n); // find clusters og laeg dem paa liste
#ifdef S_DEBUG
printf(" n%d ",n);
fflush(stdout);
#endif
if (n > 0)
tmpEstTreeSize *= n;
for(i=0;i<n;i++) { // FOR ALL TRAEK
int intRemoved,k=0;
double tmpProgress = progress;
if (level < 3) {
printf("\n");
while (k++ < level)
printf(" ");
printf("(%d/%d,%.2lf%c)",i,n,progress,p);
fflush(stdout);
}
tmp = move(bCopy,list[i].x,list[i].y,list[i].z);
intRemoved = removed + tmp;
if (intRemoved == 31 && bCopy[3][3].val == 1)
intRemoved = 32;
if (/*intRemoved >= 28 || */(32 - intRemoved <= dblevel)) {
if (isSolvable(bCopy,intRemoved) == 0) {
skips++;
#ifdef S_DEBUG
print(bCopy);
printf("Kan ikke løses");
system("pause");
#endif
} else if (isSolvable(bCopy,intRemoved) == 1) {
solutions++;
intRemoved = 32;
#ifdef S_DEBUG
print(bCopy);
printf("Kan løses");
system("pause");
#endif
} else {
printf("Error!! isSolvable returned error-value\n");
exit(0);
}
} else {
tmppt = searchAll(bCopy,intRemoved);
intRemoved = tmppt.z;
}
progress = tmpProgress + 100 / tSize / (double)n;
#ifdef S_DEBUG
printf(" ret ");
fflush(stdout);
#endif
if (intRemoved > bestRemoved) {
bestMove = i;
bestRemoved = intRemoved;
if (intRemoved > mvList[level].w) {
mvList[level].w = intRemoved;
mvList[level].x = list[i].x;
mvList[level].y = list[i].y;
mvList[level].z = list[i].z;
mvList[level].n = i;
}
if (intRemoved > treeBest) {
treeBest = intRemoved;
listMax = level+1;
}
}
if (intRemoved == 32 || tmppt.x == 1) {
if (tmppt.x == 0) {
printf("Game solved, returning from level %d ...\n",level);
fflush(stdout);
}
ret.x = 1; ret.y = bestMove; ret.z = bestRemoved;
level--;
return ret;
}
for(i2=0;i2<7;i2++) { // restore board from recursive call alterations
for(j=0;j<7;j++) {
bCopy[i2][j].val = b[i2][j].val;
//bCopy[i2][j].mark = b[i2][j].mark;
}
}
}
tmpEstTreeSize = (long)tSize;
#ifdef S_DEBUG
printf(" loop)");
fflush(stdout);
#endif
if (i==0) {
leaves++;
if ((leaves % 100000) == 0) {
printf(".");
fflush(NULL);
}
}
for(i=0;i<7;i++)
free(bCopy[i]);
free(bCopy); free(list);
ret.x = 0; ret.y = bestMove; ret.z = bestRemoved;
level--;
return ret;
}
int nMoves(struct u **b) {
int n = 0;
int x,y,z;
for (x=0;x<7;x++) {
for(y=0;y<7;y++) {
for(z=1;z<5;z++) {
if (isMove(b,x,y,z))
n++;
}
}
}
return n;
}
struct pt *MoveList(struct u **b, int *size) {
int n = 0;
int x,y,z;
struct pt *list;
list = (struct pt *)malloc(75 * sizeof(PT));
for (x=0;x<7;x++) {
for(y=0;y<7;y++) {
for (z=1;z<5;z++) {
if (isMove(b,x,y,z)) {
list[n].x = x;
list[n].y = y;
list[n].z = z;
n++;
}
}
}
}
*size = n;
list = (struct pt *)realloc(list, n * sizeof(PT));
return list;
}
int randintval(int low, int high)
{
return (int) randval(low,high+1);
}
double randval(double low, double high)
{
double val;
val = ((double)(rand()%1000)/1000.0)*(high - low) + low;
return(val);
}
void init_malloc(struct u **b) {
int i;
b = (struct u **)malloc(7 * sizeof(int));
for(i=0;i<7;i++)
b[i] = (struct u *)malloc(7 * sizeof(int));
}
void init_values(struct u **b) {
int x,y;
for (x=0;x<7;x++) {
for(y=0;y<7;y++)
b[x][y].val = 1;
}
b[0][0].val = b[0][1].val = b[1][0].val = b[1][1].val = -1;
b[0][5].val = b[0][6].val = b[1][5].val = b[1][6].val = -1;
b[5][0].val = b[5][1].val = b[6][0].val = b[6][1].val = -1;
b[5][5].val = b[5][6].val = b[6][5].val = b[6][6].val = -1;
b[3][3].val = 0;
}
void print(struct u **b) {
int x,y;
for(y=6;y>=0;y--) {
printf("%d ",y);
for (x=0;x<7;x++) {
if (b[x][y].val == 1)
printf(" X");
else if (b[x][y].val == 0)
printf(" .");
else
printf(" ");
printf(" ");
}
printf("\n| ");
if (y > 0)
for (x=0;x<7;x++) {
printf(" ");
}
printf("\n");
}
printf("|\n -----");
for(x=0;x<7;x++)
printf("%d---",x);
printf("%d\n\n",x);
}
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: c++/4929: Internal compiler error in c++
@ 2002-04-19 13:23 pme
0 siblings, 0 replies; 2+ messages in thread
From: pme @ 2002-04-19 13:23 UTC (permalink / raw)
To: gcc-bugs, gcc-prs, nobody, vesterstrom
Synopsis: Internal compiler error in c++
State-Changed-From-To: open->closed
State-Changed-By: pme
State-Changed-When: Fri Apr 19 13:23:02 2002
State-Changed-Why:
Using 3.1 prerelease, I get
198% g++ -O3 4929_soli.cpp
4929_soli.cpp: In function `enddata* EndGameDataAddLevel(enddata*)':
4929_soli.cpp:369: `__cdecl' undeclared (first use this function)
4929_soli.cpp:369: (Each undeclared identifier is reported only once for each
function it appears in.)
4929_soli.cpp:369: parse error before `)' token
4929_soli.cpp:369: parse error before `void'
4929_soli.cpp:380: parse error before `)' token
4929_soli.cpp:380: parse error before `void'
4929_soli.cpp:391: parse error before `)' token
4929_soli.cpp:391: parse error before `void'
4929_soli.cpp: In function `enddata* MakeEndGameData(enddata*, int)':
4929_soli.cpp:472: parse error before `)' token
4929_soli.cpp:472: parse error before `void'
4929_soli.cpp:481: parse error before `)' token
4929_soli.cpp:481: parse error before `void'
4929_soli.cpp: In function `int isSolvable(u**, int)':
4929_soli.cpp:767: parse error before `)' token
4929_soli.cpp:767: parse error before `void'
199%
No crash, so this appears fixed.
http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=4929
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2002-04-19 20:23 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-11-18 20:10 c++/4929: Internal compiler error in c++ vesterstrom
2002-04-19 13:23 pme
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).