Fhlersuche in C Programm
-
Guten Tag alle,
ich habe leider ein Problem und finde nicht heraus wie ich es beheben kann.
Also ich habe ein Programm das eine Imagedatei ausliest und als Matrix speichert.
Zumindest solles das tun. Aber wenn ich im Debug Modus das Programm laufen lasse kommt folgender Fehler:main (argc, argv)
int argc;
char *argv[];
{
char fname1[999], fname2[999], line[500], word[100], trsh[100];
int N, rn, cn, m, asc=0;
complex a, b;
floating *Y, v, minv=9e9, maxv=-9e9;
float *RMat, contrast=1.0, bias=0.0, value;
int i, j, k, arg, COLOR=0;
struct rs_image_rec imel;
struct file_kind *outfile=0;arg = 1; k = 0;
while (argc>arg)
{ /*arg*/und dazu kommen dann folgende fehler:
syntax error before 'int'
syntax error before '{'
syntax error before '='
syntax error before '='
syntax error before 'while'ich hoffe einer von euch kann mir da weiterhelfen?
Vielen Dank schon einmal
MfG
cobol
-
Hm, ist das noch K&R C? Oh oh oh... schau mal in der Compilerdokumentation, ob es einen Schalter gibt, damit der Code nach K&R C behandelt wird.
Im Übrigen ist der Code weder vollständig noch hast du ihn mit den cpp Tags gepostet. Mach das bitte in Zukunft.
-
Erstens: sfds
Zweitens: Wo hast du denn das Programm her? Die Deklaration der main() stammt ja noch aus Prä-ANSI Zeiten.
nach ANSI-C sähe das Ganze so aus:
int main(int argc,char* argv[]) { char fname1[999],... ...
-
Hallo erstmal CStoll,
ich werde dann jetz den Code das nächste mal colorieren.
Zum Code, den habe ich bei sourceforge gefunden, ist ein Open Source Programm. Das Programm soll eigentlich ein Image auslesen und als Matrix in einer Textfile speichern. Ich wollte das Programm verwenden, weil ich genau so etwas benötige, wollte es halt nur noch etwas anpassen, z.B. das die Werte der Matrix dann für jeden Vektor in {...} abgespeicehrt werden. Ich hatte aber nicht damit gerechnet, dass das Programm einfach von Anfang an nicht funktionsfähig ist. Zum Alter des Prgramms und zum Code kann ich daher leider nichts sagen, aber ich fand es auch etwas merkwürdig geschrieben.
So und nun folgt dann mal der vollständige Code:#include "commonlibs.c" #include <math.h> /*......................................................*/ /* Data structures to hold images. */ /*......................................................*/ struct rs_image_rec { int r, g, b; }; struct rs_image { int cols, rows, maxval; struct rs_image_rec *image; } *Image; struct rs_image *Read_ppm_image( char *fname ) { FILE *infile; char ch, ft; int row, col, ncols, nrows, r, g, b; struct rs_image *image; int maxval; infile = fopen(fname,"r"); if (infile==0) { printf("ERROR image2matrix: Cannot open image file %s\n",fname); exit(0);} if (getc(infile)!='P') {printf("ERROR image2matrix: Input file '%s' is not in PPM format.\n",fname); exit(0);} ft = getc(infile); if ((ft=='2') || (ft=='3') || (ft=='5') || (ft=='6')) { while( (ch = getc(infile)) && isspace(ch) ); /* chew whitespace */ while( ch == '#' ) { while( getc(infile) != '\n' ); /* eat comment line. */ ch = getc(infile); } ungetc( ch, infile ); fscanf( infile, "%d", &ncols ); /* number of cols */ while( (ch = getc(infile)) && isspace(ch) ); /* chew whitespace */ while( ch == '#' ) { while( getc(infile) != '\n' ); /* eat comment line. */ ch = getc(infile); } ungetc( ch, infile ); fscanf( infile, "%d", &nrows ); /* number of rows */ while( (ch = getc(infile)) && isspace(ch) ); /* chew whitespace */ while( ch == '#' ) { while( getc(infile) != '\n' ); /* eat comment line. */ ch = getc(infile); } ungetc( ch, infile ); fscanf( infile, "%d", &maxval ); /* maximum value of a value */ while (getc(infile)!='\n'); #if (0) while( (ch = getc(infile)) && isspace(ch) ); /* chew whitespace */ while( ch == '#' ) { while( getc(infile) != '\n' ); /* eat comment line. */ ch = getc(infile); } ungetc( ch, infile ); #endif /* get data */ image = (struct rs_image *)malloc( sizeof(struct rs_image) ); image->image = (struct rs_image_rec *)malloc( (nrows * ncols) * sizeof(struct rs_image_rec) ); image->cols = ncols; image->rows = nrows; image->maxval = maxval; /* image->rendered_image = 0; image->rendered_cols = 0; image->rendered_rows = 0; */ if ( ft == '2' ) { /* ascii b&w */ for (row=0; row!=nrows; row++) for (col=0; col!=ncols; col++) { fscanf(infile,"%d",&r); image->image[row*ncols+col].r = r; image->image[row*ncols+col].b = r; image->image[row*ncols+col].g = r; } } else if( ft == '3' ) { /* ascii color */ for (row=0; row!=nrows; row++) for (col=0; col!=ncols; col++) { fscanf(infile,"%d",&r); fscanf(infile,"%d",&g); fscanf(infile,"%d",&b); image->image[row*ncols+col].r = r; image->image[row*ncols+col].b = b; image->image[row*ncols+col].g = g; } } else if( ft == '5' ) { /* binary */ for (row=0; row!=nrows; row++) for (col=0; col!=ncols; col++) { unsigned char rc, gc, bc; fread( &rc, 1, 1, infile ); r = rc; image->image[row*ncols+col].r = r; image->image[row*ncols+col].b = r; image->image[row*ncols+col].g = r; } } else if( ft == '6' ) { /* binary */ for (row=0; row!=nrows; row++) for (col=0; col!=ncols; col++) { unsigned char rc, gc, bc; fread( &rc, 1, 1, infile ); r = rc; fread( &gc, 1, 1, infile ); g = gc; fread( &bc, 1, 1, infile ); b = bc; image->image[row*ncols+col].r = r; image->image[row*ncols+col].b = b; image->image[row*ncols+col].g = g; } } return image; } else {printf("ERROR image2matrix: Not prepared to handle file type %c.\n",ft); exit(0);} } main (argc, argv) int argc; char *argv[]; { char fname1[999], fname2[999], line[500], word[100], trsh[100]; int N, rn, cn, m, asc=0; complex a, b; floating *Y, v, minv=9e9, maxv=-9e9; float *RMat, contrast=1.0, bias=0.0, value; int i, j, k, arg, COLOR=0; struct rs_image_rec imel; struct file_kind *outfile=0; arg = 1; k = 0; while (argc>arg) { /*arg*/ if (argv[arg][0]=='-') { /*option*/ if (strncmp(argv[arg],"-red",2)==0) COLOR = 1; else if (strncmp(argv[arg],"-blue",2)==0) COLOR = 2; else if (strncmp(argv[arg],"-green",2)==0) COLOR = 3; else {printf("ERROR image2matrix: Unknown command-line option %s\n", argv[arg]); exit(1);} } /*option*/ else { /*file_name*/ if (k==0) { strcpy(fname1,argv[arg]); Image = Read_ppm_image( fname1 ); k = k + 1; } else if (k==1) { strcpy(fname2,argv[arg]); k = k + 1; } else {printf("ERROR image2matrix: Too many file-names on command line.\n"); exit(1);} } /*file_name*/ arg = arg + 1; } /*arg*/ if (k==0) { printf("ERROR image2matrix: No input file on command line.\n"); exit(1); } RMat = (float *)malloc( Image->rows * Image->cols * sizeof(float) ); if (k<2) /* No output file specified, so make default name by appending suffix. */ { strcpy(fname2,fname1); i = strlen(fname2)-1; while ((i>=0) && (fname2[i]!='.')) i = i-1; if (i<0) i = strlen(fname2); fname2[i] = '\0'; strcat(fname2,".dat"); if (strcmp(fname1,fname2)==0) {printf("ERROR image2matrix: Can't over-write source.\n"); exit(1);} } printf(" (Writing output to %s)\n", fname2 ); outfile = file_open_write( fname2, 'R', Image->rows, Image->cols ); if (outfile->fpt==0) {printf("ERROR image2matrix: Can't open output file '%s'.\n",fname2); exit(1);} /* Write image-matirx to file. */ for (i=0; i<Image->rows; i++) for (j=0; j<Image->cols; j++) { imel = Image->image[ i * Image->cols + j ]; switch (COLOR) { case 0: value = (float)(imel.r + imel.g + imel.b) / (3.0 * (float)(Image->maxval)); break; case 1: value = (float)imel.r / (float)(Image->maxval); break; case 2: value = (float)imel.b / (float)(Image->maxval); break; case 3: value = (float)imel.g / (float)(Image->maxval); break; } fprintf(outfile->fpt,"%d %d %g\n", i, j, value ); fprintf(outfile->fpt,"}"); } fclose(outfile->fpt); }
So also wenn du n besseres Programm schon kennst, was du mir empfehlen könntest und was meinen Anforderungen entpsricht , wäre das auch gut. Ansonsten werde ich den Code den ich habe irgendwie verwenden.
Vielen Dank für deine Hilfe
MfG
cobol
-
Vermutlich dürfte es schon reichen, wenn du dein Programm etwas an die ANSI-Syntax anpasst. Die Deklaration der main() stammt noch aus K&R-Zeiten (d.h. vor der Standardisierung), wie es richtig aussehen muß, habe ich oben geschrieben.
(und womöglich sind noch einige weitere Sachen drin, die seit K&R umformuliert wurden)
-
Danke,
ich werde deinen Ratschla befolgen und das ganze dann mal ANSI Konform schreiben.MfG
cobol
-
Nur mal aus Interesse: Welcher C-Compiler läuft da auf Syntaxfehler?
Wir haben hier noch einige Programme aus dieser grauen Vorzeit, und unser inzwischen eingesetzter GCC 4.1.0 lässt sich selbst mit -Wall gerade mal ein müdes "warning: return type defaults to int" entlocken.
Okay, sowas wird wann immer man sowieso dran arbeitet aktualisiert, aber üblicherweise stellt man nicht alle zehn Jahre extra jemanden ein, um zigtausend Zeilen Code auf den neuesten Stand(ard) zu bringen
-
Hallo Lordjaxom,
also bei mir ist gcc4.1.2 am laufen mit dem Programm und hab das auch mit kdevelop mir dann angeschaut.MfG
Cobol