GCC fura és érdekes probléma

 ( bazsig | 2010. december 22., szerda - 21:42 )

Ü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ás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

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.

De inkább 42.

Lehet, bár az jobb kérdés, hogy ehető-e?!

A válasz erre is 42!

Az ki van zárva, mert nem tudom!

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

Téged zavar, ha másnak több az érzelmi intelligenciája, mint egy kávéskanálnak?

Ezt az intelli izét emlegetni ebben a topicban...az ön készülékében valami hiba van. Alapvető hiba. :)

Intelligencia != Érzelmi intelligencia

Nemrég linkeltél nekem egy nagyon hasznos oldalt, szerintem ott Te is találsz információkat a kettő közötti különbségről :)

Mit linkeltem én? Szerintem összekeversz valakivel...vagy nem emlékszem.

nincs különösebb kimenet. :S Lefordul és semmit nem ad vissza. Segítségetek előre is nagyon köszönöm.

Nem lehet, hogy az a probléma, hogy nem flush-ölöd a képernyőre írást?
Próbáld ezzel a printf-fel: printf("%d\n",i);

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.

uhh, igazatok van! Röktönzött kis példaprogramom nem jó! Kijavítottam, úgy sem megy. De mondjuk egy végtelen while ciklus sem megy. Rengeteg ilyen apró kis próba programmal probálkoztam, de semmi. :(

#include után stdio.h

és a printf-ben / > \

Szerintem tudja ezt ő is, csak mivel nem tette a kódot [ code ] -tagek közé, a forúmmotor kiszedte ezeket.

Igen, köszönöm. :)

Akkor viszont le kell fordulnia és futnia is kell. (Nálam legalábbis ezt tette.)

Egyetértek. Ez egy teljesen egyszerű példa, ha ez nem fordul, akkor ott valami komoly probléma van.
bazsig: Hanyas verziójú gcc-vel próbálod fordítani?

Lefordul, csak nem megy jól.

gcc (Debian 4.3.2-1.1) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Óóóó, köszi, hogy ennyire segítőkészek vagytok! Nálam is lefordul hiba nélkül, a program le is fut, csak épp hogy azt nem csinálja ami a ciklus blokban van benne. Sima egyedülálló kifejezéseket végre hajt.

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. :)

Bocsi. :$ :)

OK, semmi gond!

#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! :)

Valami baj lehet a fordítóval, mert szerintem 9-et is ki kéne írnia..

Software is like sex, it's better with a penguin. :D (r)(tm)(c) آكوش

The famous "number sequence without 9" bug aka "gappy paste" bug. ;)

;) kösz, hogy megmagyaráztad... :D

Software is like sex, it's better with a penguin. :D (r)(tm)(c) آكوش

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.

+1 gdb, és a valgrind. Mind a két program nagyon jól használható. Valgrindet én memóriaszivárgás vadászatára használtam.

------
3 fajta matematikus létezik. Aki tud számolni, és aki nem.

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.

A -O3 az biztos? -O2 tudtommal stabilabb. -O3 képes vicces dolgokat művelni.

Sőt, ha valami nagyon paranormális dolgot csinál a bináris, akkor érdemes -O0-lal fordítani.

... hat, szerintem meg inkabb keressuk meg es javitsuk ki a hibat ;)

+1, de ez ma már nem divat. Sajnos.

-O3 képes vicces dolgokat művelni.
igen, ha a program hibas ;) magyaran, az -O3 jobban elohozza a rejtettebb/alattomosabb hibakat (biz. feltetel-rendszer eseten nem inicializalt valtozok, to"mb ala/tulcimzesek, tobbszoros indirekciok eseten fellepo hulyesegek, stb.).

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

kell a -O2 is, csak akkor panaszkodik.

Aha, megvan. Mondjuk nekem szimpatikusabb az a megoldás, hogy minden változónak adok értéket deklaráció után, mint else ágak berakása.

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

vagy egy sokkal egyszerubb es talan hetkoznapibb pelda:

int funct(int a)
{
 int    c;
 switch ( a&3 )
  {     case 0: c=10;break;
        case 1: c=20;break;
        case 2: c=30;break;
        case 3: c=40;break;
  }
 return(c);
}

Just FYI: -Werror
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal

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.

Erdekelne mit miert ajanlasz...
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal

-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-Wno_002dformat_003d2-257

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

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

-Wpointer-arith

ez szerintem akkor szól be, ha a void *-ot char *-ként próbálja a delikvens kezelni (azaz hozzáadni, kivonni, indexelni, sizeofolni próbál), ami abszolút jogos.

Szükséges a -Wshadow -t külön használni?
Én általában -Wall -t használom, de így is mindig kiabál ha ilyesmi van.

úgy emlékszem, régen nem volt része a -Wall -nak, azért van külön is.

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

na, megfelel?

--
"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

köszi, nekem tetszik.

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 :))

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