GCC fura és érdekes probléma

Fórumok

Üdvözletem!

Előre bocsájtom, hogy nagyjából kezdő programozó vagyok. Régebben tanultam C-t és C++-t Linux alatt.

Úgy tűnik, hogy a fordítom nem "csinál" semmit a ciklusokkal (for, while, do-while, stb). Ezt egy idő után úgy sikerült kiderítenem, hogy egyszerű pársoros progikat írtam, és egy idő után kitünt, hogy ezek nem mennek. :S

Nem rendelkezem túl nagy programozói tapasztalattal, de ilyesfélét még nem tapasztaltam. Ismétlem: kezdő vagyok. :)

Mi lehet a baj?

Előre is köszönöm, és kellemes ünnepeket mindenkinek. :)

Pótolnám a hiányosságaim, példa program:
#include

int main(void)
{
int i;
for(i=1;i<=10;i++)
{
printf("%d/n",i);
}
return(0);
}

Mondanom sem kell, hiba nélkül lefordul. Utána futásnál semmi. Ha mondjuk a for elé írok printf-et, vagy if-et, bármi más kiffejezés, ami nem ciklus, az megy. Maguk a ciklusok nem mennek. Minden más igen.

Hozzászólások

Az például baj, hogy nem tetted be a működésképtelen kódot. Enélkül a válasz: Talán 5, de lehet hogy 217.

Légyszives másolj be egy rövid kódot, amit kipróbáltál, valamint a
g++ -Wall program.cpp (C++ esetén) vagy a gcc -Wall program.c (C esetén) kimenetét.

És ha azt kérdezi, hogy: "Jártam iskolába is és olvasni is megtanultam, de nem tudok ottohn olvasni. Ezt úgy teszteltem, hogy sem a blikk, sem lottószelvényemből nem láttam semmit." Akkor te leírod neki, hogy: "Légyszives menj a villanykapcsolóhoz, állítsad át másik állásba és tegyél be egy képet a csillárról!" ? :D

Na jó, lefekszem, mert szénné röhögtem magamat...:D

i<=10 kellene szerintem a for-ba feltételnek i==10 helyett.

nem lep be a ciklusba, mert a ciklusfeltetel nem igaz (i==10) keztedben (i=1). szerintem te i!=10 -et akarsz

for(i=1;i==10;i++)
A logikai feltételed sose teljesül, a helyes i<=10. vagy kezdetben i=10.

Most mi a gond? Az a kód, amit bemásoltál (stdio.h-val megspékelve), például nálam (gcc version 4.4.5 (Debian 4.4.5-8)) lefordul és fut is, kiírja a számokat 1-től 10-ig. Hogyan tudnánk még segíteni? Ennyi információból ennyit lehet kihozni. Nem hiszem, hogy gcc 4.3.2 ilyen egyszerű kódnál radikálisan másként működne ...

Jaaaj, ne értsetek félre, tényleg örülök, hogy segítettek. :D Így vissza olvasva az előző válaszomat, kétség kívül más tonalitásban is lehetne értelmezni, de nem úgy szántam. Bocsi. :$ :)

Amúgy én még annyira sem értem, h mi lehet a gond. :S Most megpróbálok debugolni, vagy mi. :)


#include <stdio.h>
 
int main(void)
{
    int i;
    for(i=1;i<=10;i++)
    {
        printf("%d\n",i);
    }
    return(0);
}

a fájl neve: hup.c

gcc hup.c -o hup
chmod +x hup
./hup

parancsokkal fordítva, futási jogot adva, futtatva ezt írja ki:
1
2
3
4
5
6
7
8
10

gcc version 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2) -val fordítottam,
kiegészítve az #include sor a <stdio.h> -val, valamint a printf sorban a /n helyett \n a vezérlő karakter.

gy

Nagyon köszönöm a segítségetek! :) Végül is egy gcc újra telepítés megoldotta a problémámat. Bár elötte is próbáltam ezt, akkor nem ment. Nem tudom mi hozhatta rendbe. :S Lényeg, most úgy tűnik, hogy működik. Tényleg köszönöm! :D

Mindenkinek Boldog Karácsonyt és Új évet kívánok.
Üdv BazsiG! :)

Hello,
legközelebb ha ilyen gondod akad...

gcc-nek add meg a -ggdb kapcsolót, aztán gdb-vel nézd meg mi történik.

kb így, de a google és man a barátod....

gdb a.out
aztán érdekes dolgokat lehet jól megnézni ugye... de most talán nem másolom be az egész man page-t... A fontos a jelen problémádnál a disassemble lett volna...

Üdv, P.

ugy altalaban, pa'r praktikus jotanacs c fejleszte'shez, kezdoknek is:
- forditas: `gcc -Wall -pedantic -ansi -O3 -D_GNU_SOURCE -fPIC`, sima `gcc` helyett.
- forditas soran egyetlen warning se legyen. azaz 0 darab. olyat nem jatszunk hogy kiir a fordito valami warningot, oszt utana megyunk erdeklodni (forumokra, barhova) hogy "vajh miert nem megy?". ha van warning, akkor rtfm, mi is az, kijavit, stb. persze a fenti kapcsolokkal. kesobb ezen me'g lehet hangolni, persze, ez egy mas kerdes. illetve a 0 warning az meg mindig nem azt jelenti hogy a program azt csinalja amit hiszu"nk, de igy all hozza' altalaban a legkozelebb.

mondjuk pont a kerdezo" kollega eseten ezek nem hoztak volna elo" semmit, murphy torvenyei szerint ;) (mmint ami az eredeti valtozatot illeti, ott sem), de ettol fuggetlenul sok esetben hasznosak.

Azért érdemes néha azt a "-O3"-at "-O0 -g"-re cserélni.

Jut eszembe, gcc tud olyat, hogy alapból feltölti a változókat valamilyen értékkel, ami nagy valószínűséggel rögtön nyilvánvalóvá teszi, hogy nem lett inicializálva? (0xBAADF00D) (Mint a Visual C++ fordítója debug módban.)

Vagy a valgrind kiabál ilyenkor? (Sajnos winre nincs, úgyhogy még nem volt alkalmam használni ezt a csodát...)

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o

Vagy a valgrind kiabál ilyenkor? (Sajnos winre nincs, úgyhogy még nem volt alkalmam használni ezt a csodát...)
ez jo kerdes, automatikus valtozo olyan teruleten van, hogy annak inicializalatlan eseteben kivetel vagy barmi ilyesmi elegge nehezen ke'rheto".

viszont ezekre a fordito altalaban szokott szolni, merthogy az inicializalatlansag ma'r forditasi idoben is ellen (-Wuninitialized, a -Wall is bekapcsolja ezt). ujabb gcc-knel ma'r tenyleg elegge nyakatekert elrendezes kell legyen, de azt is alt "false positive"-kent ertekeli ki. ilyenkor atnezed kezzel, megnyugodsz, es adsz valami kezdeti erteket, vagy beleteszel egy "else" a'gat, pl., amirol tudod hogy sosem fog lefutni (olyanok az input parameterek), es ott beleteszel egy =0 ertekadast, vagy barmi (a forditot megnyugtatja, kb, ennyi).

statikus es kulso valtozokra meg nyilvan ertelmetlen a kerdes, by szabvany.

a

> ...beleteszel egy "else" a'gat, pl., amirol tudod hogy sosem fog lefutni (olyanok az input parameterek), es ott beleteszel egy =0 ertekadast, vagy barmi (a forditot megnyugtatja, kb, ennyi).

És kíváncsian várod, milyen reakciókat vált ki az alábbi megjegyzés:

/* This block will never be reached, it is included only to suppress some warnings. */

:))

--
Debian - The "What?!" starts not!
http://nyizsa.uni.cc

hulye pelda:


#include <stdio.h>

int funct(int a)
{
 int    c;
 if ( 0<a )
        c=1;
 else if ( a<0 )
        c=2;
 return(c);
}
int main(int argc,char *argv[])
{
 int    x;
 x=3;
 printf("%d\n",funct(x));
 return(0);
}

ha a funct ele' beleteszel egy static-ot, akkor nem ad figyelmeztetest. viszont ha x=3 helyett mondjuk x=argc+1-et adsz meg, amirol tudod hogy sosem lehet nempozitiv, akkor is ad figyelmeztetest a funct().

Kipróbáltam, kivettem az else ágat, -Wall kapcsolóval semmi. Az alábbi példát is, kivettem a case:3-at, szintén semmi. -Wuninitialized kapcsolóval sem. Most már kezd érdekelni, mire gondolsz. Amúgy az előző hozzászólás csak poén akart lenni.

--
Debian - The "What?!" starts not!
http://nyizsa.uni.cc

ja, jo lehet az is, de 1/ fejleszte's mellett ugyis csak 1-2 modult forditasz egyszerre, akkor meg egyszeruen latod mit ir ki 2/ ha masnak odaadod a kodot, hogy hasznalgassa, es ez bennemarad, akkor elohozhat olyan warn-okat ami igazabol nem is azok (pl egy arnyalatnyival mas verziojo gcc f+ ertek egy -Wunitilalized esetet, lasd feljebb; de akar sima std-kkel kapcsolatos figyelmeztetesek is lennek: neha ugy erzem hogy +1 minor verzio es megvaltozik a c89-es std is ;]). na es akkor az emberke rinyal hogy ``szar a program, meg le sem fordul'' ;]

esetleg még "-W -Wall -Wextra -Wconversion -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wformat=2 -Wformat-security -fshort-enums [ezt ésszel] -fno-common -ggdb"

--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.

-Wall -Wextra
eleg sok dologra szolnak, ami szerintem common typo jelleggel rontanak el

-Wshadow
sok kezdo beszopja az "ugynaolyan nevu lokalis elnyomja a globalist" dolgot. Tudom, ne globalisozzanak...

-Wpointer-arith
beszol a gyanus pointer-aritmetikara (pl. delikvens ugy akar int*-bol unsigned int*-ot csinalni, hogy void*-ra at, majd onnan tovabb)

-Wcast-qual
pl. "const" eltuntetese tipuskenyszeritessel, majd siras, hogy "demérnemengedipedig" ellen

-Wcast-align
ugyancsak gyanus aritmetikara figyel

-Wwrite-strings
stringkonstansok baszkuralasa ellen meg forditasidoben

-Waggregate-return
ez igazabol csak figyelmeztetes, de sokan elbuknak azon, hogy pl. ha int* a visszateresi ertek akkor azt hiszik az egy int, kozben az egy 1D int tomb is lehet...

-Waggregate-return
pl. regi tipusu argumentumlista ellen.

-Wformat=2
http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Warning-Options.html#index-…

-fno-common
http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Code-Gen-Options.html#index…

--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.

Igen, erdekes dolgokat irsz, par kapcsolot biztos hasznalni fogok kodolas soran. Nincs turelmem a GCC haboru es beke hosszusagu kezikonyvet elolvasni. Koszonom a rovid osszefoglalot.

Bocsi a kesei valaszert, de nem mindig nezem at az osszes feliratkozott topicot.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

Hahó!

A többi hozzászólóval ellentétben én egy másik utat javaslok, nem a gcc kapcsolóit.

Próbáld meg telepíteni az splint programcsomagot -- a klasszikus UNIX terminológiában ez a ,,lint'' program -- amely arra szolgál, hogy a C forrásprogramokban a rejtett hibákat megjelenítse. Nem fordít, csak elemez.

G.
============================================
"Share what you know. Learn what you don't."

könyvjelző
--
unix -- több, mint kód. filozófia.
Life is feudal

Lehet hogy hülyeség, de megpróbálhatnád üres .bashrc és .bash_profile fájlok mellett futtatni a progit.

(Persze ne töröld, csak tedd félre :))