2008-08-24 18 views
102

Tôi đang cố gắng để giải quyết the 3n+1 problem và tôi có một vòng lặp for trông như thế này:Làm cách nào để khắc phục "cho khai báo ban đầu vòng lặp được sử dụng ngoài chế độ C99" lỗi GCC?

for(int i = low; i <= high; ++i) 
     { 
       res = runalg(i); 
       if (res > highestres) 
       { 
         highestres = res; 
       } 

     } 

Đáng tiếc là tôi nhận được lỗi này khi tôi cố gắng biên dịch với GCC:

3np1.c:15: error: 'for' loop initial declaration used outside C99 mode

tôi không biết chế độ C99 là gì. Ý tưởng nào?

Trả lời

125

Tôi muốn cố gắng khai báo i bên ngoài vòng lặp!

Chúc may mắn vào giải quyết 3n + 1 :-)

Dưới đây là một ví dụ:

#include <stdio.h> 

int main() { 

    int i; 

    /* for loop execution */ 
    for (i = 10; i < 20; i++) { 
     printf("i: %d\n", i); 
    } 

    return 0; 
} 

đọc trên hơn cho vòng trong C here.

+0

thì tại sao bạn không sử dụng vòng lặp thay thế? –

102

Có một công tắc trình biên dịch cho phép C99 mode, trong số những thứ khác cho phép khai báo biến trong vòng lặp for. Để bật tính năng này, hãy sử dụng công tắc trình biên dịch -std=c99

Hoặc như @OysterD nói, khai báo biến ngoài vòng lặp.

+7

thực sự -std = gnu99 có lẽ là hấp dẫn hơn vì cách đó bạn vẫn nhận được phần mở rộng gcc (gcc mặc định thành -std = gnu89, tuy nhiên điều này sẽ thay đổi thành gnu99 tại một số điểm trong vài phiên bản tiếp theo) – Spudd86

+3

@ Spudd86: Cho dù bạn * muốn * để bật tiện ích gcc phụ thuộc vào những gì bạn đang làm. Vô hiệu hóa chúng là hữu ích nếu mục tiêu của bạn là viết mã di động cho các trình biên dịch khác với gcc. –

14

Tôi cũng đã nhận được lỗi này.

for (int i=0;i<10;i++) { .. 

không hợp lệ trong tiêu chuẩn C89/C90. Như OysterD nói, bạn cần phải làm:

int i; 
for (i=0;i<10;i++) { .. 

Mã ban đầu của bạn được cho phép bằng C99 và các tiêu chuẩn sau của ngôn ngữ C.

+3

Đối với gcc, hãy ném "-std = c99". Đối với các tính năng bổ sung, xem câu trả lời của Imran. –

+0

Có, nó là hợp lệ C; nó chỉ là không hợp lệ C89/C90. –

+0

@KeithThompson: làm rõ. – Blorgbeard

13

@Blorgbeard:

Tính năng mới trong C99

  • chức năng inline
  • khai báo biến không còn bị hạn chế để nộp phạm vi hoặc sự bắt đầu của một câu lệnh ghép
  • nhiều kiểu dữ liệu mới, bao gồm các loại số nguyên dài, tùy chọn mở rộng tùy chọn, kiểu dữ liệu boolean rõ ràng và loại phức hợp để biểu diễn các số phức
  • mảng chiều dài thay đổi
  • hỗ trợ cho một dòng bình luận bắt đầu với //, như trong BCPL hoặc C++
  • chức năng thư viện mới, chẳng hạn như snprintf
  • tập tin tiêu đề mới, chẳng hạn như stdbool.h và inttypes .h
  • chức năng toán học loại chung (tgmath.h)
  • cải thiện hỗ trợ cho IEEE dấu chấm động
  • initializers định
  • literals hợp chất
  • hỗ trợ cho các macro variadic (macro của arity biến)
  • hạn chế trình độ chuyên môn để cho phép tích cực hơn mã tối ưu hóa

http://en.wikipedia.org/wiki/C99

A Tour of C99

-2

Chỉ cần biên dịch ở chế độ C++. Bạn không cần phải sử dụng các lớp để sử dụng C++. Tôi về cơ bản sử dụng C++ như là một "đẹp hơn C" :)

Tôi gần như không bao giờ sử dụng các lớp học và không bao giờ sử dụng phương pháp overiding.

+5

không c99 là "đẹp hơn C", nếu bạn định viết C thực sự (C99 chứa khá nhiều tất cả các phần tử không phải là OOP/quá tải các tính năng C++ liên quan, và nhiều hơn nữa, và nó có ít "gotchas" hơn bằng cách sử dụng C++ không) – Spudd86

+0

Nhưng bạn không thể làm 'try/catch's' trong C mà là một cộng trong C++ mà C không bao giờ chấp nhận yeah có một phần mở rộng được gọi là E4C (Ngoại lệ4c) https://code.google.com/p/exceptions4c/ Dường như hoàn thành gói. Không thể viết mã mà sẽ không sụp đổ ở đâu đó nếu nó là phương pháp rất lớn vì vậy đó là lý do tại sao 'try/catch's' rất quan trọng nhưng sớm hay muộn khi mã dừng lại, bạn có thể xóa' try/catch's'. – user3435580

+0

Vấn đề là C + + không phải là một superset của C, do đó nó khá có khả năng là một chương trình C hoàn toàn hợp lệ sẽ không biên dịch như C++. – skyking

4

nếu bạn biên dịch trong sự thay đổi C

for (int i=0;i<10;i++) { .. 

để

int i; 
for (i=0;i<10;i++) { .. 

Bạn cũng có thể biên dịch với công tắc bộ C99. Đặt -std = c99 trong dòng biên soạn:

gcc -std=c99 foo.c -o foo 

REF: http://cplusplus.syntaxerrors.info/index.php?title= 'for'_loop_initial_declaration_used_outside_C99_mode

0

Đối với Qt-tác giả: chỉ cần thêm dòng bên cạnh * .pro tập tin ...

QMAKE_CFLAGS_DEBUG = \ 
    -std=gnu99 

QMAKE_CFLAGS_RELEASE = \ 
    -std=gnu99 
0

Tôi gặp vấn đề tương tự và nó hoạt động bạn chỉ cần khai báo i bên ngoài vòng lặp:

int i; 

for(i = low; i <= high; ++i) 

{ 
     res = runalg(i); 
     if (res > highestres) 
     { 
       highestres = res; 
     } 

} 
14

Để chuyển sang C99 chế độ trong CodeBlocks, hãy làm theo các bước sau:

Bấm dự án/Xây dựng lựa chọn, sau đó trong tab Compiler Cài đặt chọn tab phụ Các tùy chọn khác, và đặt -std=c99 trong vùng văn bản và nhấp vào Ok.

Điều này sẽ chuyển sang chế độ C99 bật cho Trình biên dịch của bạn.

Tôi hy vọng điều này sẽ giúp ai đó!

+0

Điều này đã giúp trong codeblocks 16.1 theo _Other Compiler options_! Mặc dù tôi đã sử dụng '-std = gnu99' như được mô tả trong một số câu trả lời ở trên! –

+0

Nhưng điều này đã giúp tạm thời! Tôi phải làm điều này mỗi khi tôi biên dịch mã! ... :( –

+0

Không, bạn đã không! Việc này phải được thực hiện cho mỗi dự án mới chỉ một lần. – akelec