2008-08-24 16 views

Odpowiedz

125

Chciałbym zadeklarować i poza pętlą!

Powodzenia w rozwiązywaniu 3n + 1 :-)

Oto przykład:

#include <stdio.h> 

int main() { 

    int i; 

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

    return 0; 
} 

Czytaj więcej na pętli w C here.

+0

dlaczego nie użyjesz zamiast tego pętli while? –

102

Istnieje przełącznik kompilatora, który umożliwia C99 mode, który między innymi umożliwia deklarację zmiennej wewnątrz pętli for. Aby go włączyć użyj przełącznika kompilatora -std=c99

Lub, jak mówi @OysterD, zadeklaruj zmienną poza pętlą.

+7

faktycznie -std = gnu99 jest prawdopodobnie bardziej pożądane, ponieważ w ten sposób nadal otrzymujesz rozszerzenia gcc (domyślnie gcc to -std = gnu89, jednak w pewnym momencie w następnych kilku wersjach zmieni się to na gnu99) – Spudd86

+3

@ Spudd86: Niezależnie od tego * chcę *, aby włączyć rozszerzenia gcc, zależy od tego, co robisz. Wyłączenie ich jest pomocne, jeśli Twoim celem jest napisanie kodu, który jest przenośny dla kompilatorów innych niż gcc. –

14

Dostałem również ten błąd.

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

nie jest ważny w standardzie C89/C90. Jak mówi OysterD, trzeba zrobić:

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

Twój oryginalny kod jest dozwolone w C99 i nowszych standardów języka C.

+3

Dla gcc, wyślij go "-std = c99". Aby uzyskać dodatkowe funkcje, patrz odpowiedź Imrana. –

+0

Tak, jest poprawny C; to po prostu nie jest prawidłowe C89/C90. –

+0

@KeithThompson: wyjaśnione. – Blorgbeard

13

@Blorgbeard:

Nowe funkcje w C99

  • funkcje inline
  • deklaracja zmiennej nie jest już ograniczony do pliku zakresu lub początek instrukcji złożonej
  • kilka nowych typów danych, w tym długie długie int, opcjonalne rozszerzone typy całkowite, jawny boolowski typ danych i typ złożony do reprezentowania liczb zespolonych
  • tablice o zmiennej długości
  • wsparcie dla jednej liniami komentarzy zaczynające się od // jak w BCPL lub C++
  • nowych funkcji bibliotecznych, takich jak snprintf
  • nowe pliki nagłówka, takie jak stdbool.h i inttypes .h
  • typowe funkcje matematyczne (tgmath.h)
  • ulepszone podparcie dla IEEE zmiennoprzecinkowej
  • wyznaczone inicjalizatory
  • literale związek
  • wsparcie dla zmiennej liczbie argumentów makra (makr zmienną liczbę operandów)
  • ograniczyć kwalifikacje, aby umożliwić bardziej agresywnych optymalizacji kodu

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

A Tour of C99

-2

Po prostu skompiluj w trybie C++. Nie musisz używać klas do używania C++. Zasadniczo używam C++ jako "ładniejszego C" :)

Prawie nigdy nie używam klas i nigdy nie używam overover metod.

+5

no c99 jest "ładniejszym C", jeśli masz zamiar napisać C naprawdę (C99 zawiera prawie wszystko, co dobre, nie-OOP/przeciążenie powiązane funkcje C++ i więcej, i ma mniej "gotchas" niż przy użyciu C++). – Spudd86

+0

Ale nie można zrobić "try/catch's" w C, co jest jednym z plusów w C++, które nigdy nie przyjęto C tak istnieje rozszerzenie o nazwie E4C (Exceptions4c) https://code.google.com/p/exceptions4c/ Wydaje się, że należy ukończyć pakiet. Nie można napisać kodu, który nie zawiedzie się gdzieś, jeśli jest to ogromna metoda, dlatego "try/catch's" są ważne, ale prędzej czy później, gdy kod przestanie się kolidować, możesz usunąć 'try/catch's'. – user3435580

+0

Problem polega na tym, że C++ nie jest nadzbiorem C, dlatego jest całkiem prawdopodobne, że doskonale poprawny program C nie skompiluje się jako C++. – skyking

4

jeśli skompilować w zmianie C

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

do

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

Można również przygotować z zestawem przełączników C99. Umieścić -std = C99 w linii kompilacji:

gcc -std=c99 foo.c -o foo 

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

0

Dla QT-twórcy: wystarczy dodać następujące linie do pliku * .pro ...

QMAKE_CFLAGS_DEBUG = \ 
    -std=gnu99 

QMAKE_CFLAGS_RELEASE = \ 
    -std=gnu99 
0

miałem ten sam problem i to działa po prostu trzeba zadeklarować i zewnątrz pętli:

int i; 

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

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

} 
14

Aby przełączyć się C99 trybie w CodeBlocks, należy wykonać następujące kroki:

Kliknij projektu/build opcje, następnie w zakładce Ustawienia kompilatora wyboru podkartÄ Inne opcje i umieść -std=c99 w w obszarze tekstowym i kliknij Ok.

Włącza tryb C99 dla kompilatora.

Mam nadzieję, że to pomoże komuś!

+0

Pomogło to w blokach kodu 16.1 pod _Other Compiler options_! Chociaż użyłem '-std = gnu99', jak przedstawiono w niektórych odpowiedziach powyżej! –

+0

Ale to pomogło tymczasowo! Muszę to zrobić za każdym razem, gdy kompiluję kod! ... :( –

+0

Nie, nie musisz! To musi być wykonane dla każdego nowego projektu tylko raz. – akelec

Powiązane problemy