C++ napaka pri kompajlanju

Zdravo!

Pred kratkim sem se začel učit c++. Uporabljam Eclipsu cdt.

Ko sem napisal ta programcek

#include <iostream>


using namespace std;

main()
{

char c = 'a';
char *ptr = &c;

cout <<(int) &c <<endl;
cout <<(int) *ptr <<endl;

}

mi je v linuxu javilo to napako

**** Build of configuration Debug for project vsota ****

make all
Building file: ../vsota.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF\"vsota.d\" -MT\"vsota.d\" -o\"vsota.o\" \"../vsota.cpp\"
../vsota.cpp:7: warning: ISO C++ forbids declaration of ‘main’ with no type
../vsota.cpp: In function ‘int main()’:
../vsota.cpp:13: error: cast from ‘char*’ to ‘int’ loses precision
make: *** [vsota.o] Error 1

medtem, ko je v windowsih vse delovalo pravilno.

Imam kubuntu 8.04 64bit in
gcc versio 4.2.4

Ce mi lahko kdo kaj pomaga bom zelo vesel.

Komentarji

  • Cube Član Ubuntu.si
    uredil/-a 4. november, 2008
    am poizkusi tako:

    #include

    using namespace std;

    int main(){
    char c='a';
    char *ptr=&c;

    cout <<(int)&c <<endl;
    cout <<(int)*ptr <<endl;

    return 0;
    }

    (rocno kompajlam) z g++

    ce ti tako nebo delovalo imas verjetno problem s compilerom...

    lp,cube
  • men tvojo kodo feris čist ok kompajla... jaz sem mel tudi neke probleme z eclipso pa anjuto če se ne motim probaj ročno kompajlat v terminalu
    g++ file.cpp -o file
  • ročno kompajlanje javi isto napako

    vsota.cpp: In function ‘int main()’:
    vsota.cpp:13: error: cast from ‘char*’ to ‘int’ loses precision
  • Cube Član Ubuntu.si
    uredil/-a 4. november, 2008
    si poskusu mojo verzijo?
    problem je ker funkcija main mora nekaj vracat
    ce napises int main() mora vracat int v tem primeru return 0
    ce napises voind main() ne vraca nic...

    lp,cube
  • sem poskusu i nedela
  • Cube Član Ubuntu.si
    kaj pa

    #include
    using namespace std;
    int main()
    {
    cout << "Hello World!" << endl;
    return 0
    }

    ti deluje?

    lp,cube
  • to deluje
  • Samurai Član
    uredil/-a 5. november, 2008
    compajl z g++ dela v redu,

    problem je sledec.

    kaj ti naredis?

    char c = 'a'; // c = a
    char *ptr = &c; // ptr dobi vrednost pomnilnika kjer je c

    cout <<(int) &c <<endl; // izpises vrednost pomn. lokacije
    cout <<(int) *ptr <<endl; // izpises vrednost pomn. lokacije c

    ce das recimo izpis cout <<(char) &c <<endl; dobis loosing precision from char* to char, kar je logicno, ker ima navaden char manj precisiona..

    ok da razlozim... Problem pri loosing precision je v tem, da ce castamo iz tipa ki ima vec precisiona, v tip ki ima manj precision, pomeni da izgubimo nekaj preciznosti.. recimo ce castamo iz double v float..
    obratno pa je ce castamo iz int v char, temu pravimo overflow..

    torej vidis pri tebi, dejansko gres iz char v int,se pravi ce je lokacija c -1421244125412521 in ti to castas v int, dobis error da bos uzgubil precision oz izpis samega pomnilnika bo netocen.. ( saj ima recimo int omejeno stevilo bitov )

    po kmecko ? mas 2 predala pa 4 hruske, v vsako gre ena, se pravi 2 bosta odpadli.. tako isto odpade par cifer pr castingu :)


    bash g++ v konzoli izpise cifro, ker je ocitno nastavljeno tako, ocitno pa tist eclipse javi taksne errorje, ker ma nastavljeno drugace..


    naredi takole, pa ne bo errora

    int c = 1;
    int *ptr ;
    ptr = &c;


    cout << &c <<endl;

    cout << *ptr <<endl;


    edit: vedno je bosle delat take poskuse z int, ker ima c++ grdo navado da iz int v char sam casta in sicer das 97 ter castas v char, dobis a, ter obratno, mas a, in izpises cast int na a, dobis 97.. kar zna delat probleme marsikje..

    za size..
    cout << "Size of short: " << sizeof(short) << endl;
    cout << "Size of int: " << sizeof(int) << endl;
    cout << "Size of long: " << sizeof(long) << endl;
    cout << "Size of float: " << sizeof(float) << endl;
    cout << "Size of double: " << sizeof(double) << endl;


    mal trdo sm napisu, ce ti kj ne bo jasno, kr vpras :)
  • napsy Član Ubuntu.si
    hm če na 32-bitni mašini castaš pointer v int nebi smel pridit do izgube.
  • pr men njegov primer dela, sam njemu ocitno ne, razlozu sm pomen njegovega errorja, ocitno ma eclipse probleme ? al pa ma masino iz praveka :0
  • napsy Član Ubuntu.si
    Raje takole napiš
    cout <<(unsigned int) &c <<endl;
    cout <<(unsigned int) *ptr <<endl;
  • Tvoja koda Samurai mi dela. Če te razumem v windowsih dela zato ker sam kompajler casta.

    Napsy tvoja koda mi pa javi napako.

    Se vedno si mislim, da je nekaj narobe. Saj mi ni kompajler nic tezil, ko sem imel 32bit linuxe. Imam pa se en primer, ki dela drugace v windowsih. Zato delam zdaj v windowsih prek Virtual Boxa.

    Hvala za pomoc
    lp Feris
  • Samurai Član
    uredil/-a 6. november, 2008
    feris je dejal/-a:
    Tvoja koda Samurai mi dela. Če te razumem v windowsih dela zato ker sam kompajler casta.

    Napsy tvoja koda mi pa javi napako.

    Se vedno si mislim, da je nekaj narobe. Saj mi ni kompajler nic tezil, ko sem imel 32bit linuxe. Imam pa se en primer, ki dela drugace v windowsih. Zato delam zdaj v windowsih prek Virtual Boxa.

    Hvala za pomoc
    lp Feris
    ni problema, da povem kaj ja napsy naredu..

    recimo char je velik 1byte, in ima range -127 do 127.. unsigned char pa spremeni to iz 0 - 255 , torej dejansko dobis 1 bit, ki je mislim da prej uporabljen za naslavljanje, ..

    ce das unsigned, ce recimo nimas negativnih vrednosti ( ansi C) , tako pridobis nekaj prostora, recimo lahko zapises stevilo 200, ki ga prej nisi mogel.. je tudi malenkost hitrejsi ( optimizacija)


    ... drugace pa mislim da je za zacete ucenja nepotrebno zaceti se uciti pri kazalcih (*)

    ce imas se kaj, v prihodnosti na dan z vprasanji, sam sem java programer, ampak malo ponoviti c in c++ je cool, tak al tak morm neki nardit v c :)


    edit: pri tebi ta unsigned tako ali tako ne bi smel delati problemov, ker je int velik 4 byte (x86 predvidevam da nimas lesa , ) in ima dosti velik range... unsigned bi se povecal ze tako veliko cifro.
Za komentiranje se prijavite ali pa se vpišite.