2012-11-11 34 views
26

Vì vậy, tôi có lỗi này:Lỗi cú pháp: thiếu ';' trước khi 'loại'

Error 3 error C2143: syntax error : missing ';' before 'type' g:\lel\tommy\tommy\tommy.c 34 tommy

từ khối mã này:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <malloc.h> 
#include <conio.h> 

struct matrep { 
     unsigned rows,cols; 
     double *matrix; 
}; 

int matrix_read(struct matrep *mat, const char *filename) 
{ 
    FILE *fptr; 
    unsigned m, n; 

    if ((fptr = fopen(filename, "r")) == NULL) 
    { 
     fprintf(stderr, "Cannot Open File %s\n", "matrixA.txt"); 
     return -1; 
    } 
    if (fscanf(fptr, "\n\nnrows %u, columns %u\n\n", &m, &n) != 2) 
    { 
     fprintf(stderr, "Failed to read dimensions\n"); 
     return -1; 
    } 

    mat->matrix = (double *)malloc(sizeof(double) * m * n); 
    if (mat->matrix == 0) 
    { 
     fprintf(stderr, "Failed to allocate %d*%d matrix\n", m, n); 
     return -1; 
    } 
    double *ptr = mat->matrix;//this is where it says that the error occured. 

    for (int i = 0; i < m; i++) 
    { 
     for (int j = 0; j < n; j++) 
     { 
      double x; 
      if (fscanf(fptr, " %5.2lf", &x) != 1) 
      { 
       fprintf(stderr, "Failed to read element matrix[%d,%d]\n", i, j); 
       free(mat->matrix); 
       mat->matrix = 0; 
       mat->columns = 0; 
       mat->rows = 0; 
       return -1; 
      } 
      *ptr++ = x; 
     } 
    } 
    fclose(fptr); 
    mat->columns = m; 
    mat->rows = n; 

    return 0; // Success 
} 

int main(int argc, _TCHAR* argv[]) 
{ 
    return 0; 
} 

Tôi không có ý tưởng gì đó có nghĩa là, hoặc nơi tôi đang làm sai lầm. Hãy giúp tôi.

UPDATE:

Trong khi câu hỏi ban đầu đã được giải quyết, tôi đã nhận được báo lỗi chính xác như nhau, nhưng trong một khối mã, và tôi đang viết theo khuyến cáo của các câu trả lời lựa chọn:

int matrix_multiplication(struct matrep *mat_left,struct matrep *mat_right,struct matrep *result) 
{ 
    if(mat_left->cols != mat_right->rows) 
    { 
     fprintf(stderr, "The number of columns from the left matrix are different from the number of colums from the right matrix"); 
     return -1; 
    } 
    double *p = NULL;//this is where the same error occurs the first time 
    double *pa = NULL; 
    int i,j; 
    result->rows = mat_left->rows; 
    result->cols = mat_right->cols; 

    p = result->matrix; 
    for (pa = mat_left->matrix, i = 0; i < mat_left->rows; i++, pa += mat_left->cols) 
     for (j = 0; j < b->w; j++) 
      *p++ = dot(pa, mat_right->matrix + j, mat_left->cols, mat_right->cols); 
    return 0; 
} 

Tôi thực sự bị mất ở đây, tôi đang đọc mã này và không biết tại sao nó lại cho tôi lỗi tương tự.

+0

Chỉ cần ghi chú nhanh để thêm vào các câu trả lời khác, bạn đã khai báo "cols" trong cấu trúc, nhưng bạn sử dụng "cột" trong vòng lặp lồng nhau – John

Trả lời

38

Khi biên dịch chương trình C, MSVC không cho phép khai báo theo một khối (nó sử dụng quy tắc C90 cũ - hỗ trợ cho khai báo kết hợp với câu lệnh được thêm vào C trong tiêu chuẩn 1999).

Di chuyển tuyên bố double *ptr lên đỉnh matrix_read():

int matrix_read(struct matrep *mat, const char *filename) 
{ 
    FILE *fptr; 
    unsigned m, n; 
    double *ptr = NULL; 

    // ... 

    ptr = mat->matrix; //this is where the error used to occur 

    // ... 
} 

Tôi thực sự muốn MS sẽ thực hiện điều này 'mở rộng' để biên dịch C của họ.

+2

Microsoft đã triển khai thực hiện điều này trong nền tảng toolset v120. – slypete

+0

Có - trong một ngạc nhiên thú vị, MS đã thêm các tính năng C99 vào trình biên dịch C. Platform Toolset v120 tương ứng với VS 2013 (cl.exe v18.00) nếu tôi không nhầm. –

2

Bạn có đang biên dịch bằng c99 hoặc c89 không?

Lỗi có vẻ là do bạn đang xác định một biến trong phần nội dung của hàm (được cho phép trong c99 không phải là c89). Di chuyển double *ptr đến đầu hàm và sau đó chỉ cần gán ptr = mat->matrix; nơi lỗi hiện tại là.

Các vấn đề liên quan