Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problem sa kompajliranjem

[es] :: C/C++ programiranje :: Problem sa kompajliranjem

[ Pregleda: 3509 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

BlackSnake
Zenica, BA

Član broj: 11245
Poruke: 219
*.telecom.ba.



Profil

icon Problem sa kompajliranjem22.12.2003. u 12:27 - pre 247 meseci
Pozdrav,
Ja sam početnik u C++ i imam problem sa prevođenjem koda za izračunavanje broja Pi na broj decimala prema želji.
Koristim Dev-C++ ver.4.9.8.0 Prvo otvaram novu source datoteku u nju umetnem tj. kopiram priloženi source, pa zatim sa F9 pokrenem compile and run. Nakon nekog vremena dobijem poruku da imam greške i pominju se linije 31, 5, 2, 23 i 40.
Primjetio sam da kod mene, u poddirektoriju sys, ne postoje datoteka times.h nego postoji time.h i još neke slične. Takođe, odmah mi se otvori idatoteka iostream.h i pokazuje na redak gdje se poziva datoteka backward_warning.h

PS: Molio bih da mi se Leka ne javlja

Evo source slijedi:

////////////////////////////////////////////////////////////////////////////////
// pi 2.26 Dec 14 1999
// author: elephant <elephant AT linux DOT net DOT cn>

#include <iostream.h>
#include <math.h>
#include <sys/times.h>

void outputvalue(long long *value,long number)
{
long a,i,j;
cout<<value[0]<<".\n";
cout.fill('0');
for (i=1;i<=number/12;i++)
{
cout.width(12);
cout<<value;
if (!(i%8)) cout<<"\n";
}
cout.width(1);
for (j=1;j<=number%12;j++)
{
long long last=value;
for (a=0;a<12-j;a++) last=last/10;
cout<<last%10;
}
cout<<"\n";
}

int main(int argc,char **argv)
{
long number;
cout<<"digits of pi you are expecting: ";
cin>>number;
if ((number>1000000)||(number<100))
{
cout<<"sorry, but I expect it between 100 and 1000000.\n";
return(-1);
}
clock_t runtime=times(0);

long a,i,j;
long array=number/12+3;
long long *base=new long long[array+1];
long long *calc=new long long[array+1];
long long *total=new long long[array+1];
for (long i=0;i<=array;i++) total=0;
for (long step=0;step<2;step++)
{
long long remain;
long head;
long devide=(!step)?5:239;
long devidedouble=devide*devide;
remain=1;
for (i=0;i<=array;i++)
{
base=remain/devide;
// remain=(remain%devide)*1000000000000LL;
/**/ remain=(remain-base*devide)*1000000000000LL;
}
long loop=long(number*log(10)/log(devide)+1);
double ratio=log(devide)/log(10)/12;
long start;
for (i=0;i<=array;i++) calc=0;
for (j=1;j<=loop;j++,j++)
{
start=long(j*ratio);
remain=0;
if (!(j&2))
for (i=start;i<=array;)
{
a=i;
// calc+=remain/j;
// remain=(remain%j)*1000000000000LL+base[++i];
/**/ long long q=remain/j;
/**/ calc+=q;
/**/ remain-=q*j;
/**/ remain=remain*1000000000000LL+base[++i];
while (calc[a]>=1000000000000LL)
{
calc[a]-=1000000000000LL;
calc[--a]++;
}
}
else
for (i=start;i<=array;)
{
a=i;
// calc-=remain/j;
// remain=(remain%j)*1000000000000LL+base[++i];
/**/ long long q=remain/j;
/**/ calc-=q;
/**/ remain-=q*j;
/**/ remain=remain*1000000000000LL+base[++i];
while (calc[a]<0)
{
calc[a]+=1000000000000LL;
calc[--a]--;
}
}
remain=0;
if (!step)
{
head=j/12+2;
for (i=start;(i<=array)&&(i<=head);)
{
base=remain/devidedouble;
// remain=(remain%devidedouble)*1000000000000LL+base[++i];
/**/ remain-=base*devidedouble;
/**/ remain=remain*1000000000000LL+base[++i];
}
}
else
for (i=start;i<=array;)
{
base=remain/devidedouble;
// remain=(remain%devidedouble)*1000000000000LL+base[++i];
/**/ remain-=base*devidedouble;
/**/ remain=remain*1000000000000LL+base[++i];
}
}
if (!step)
{
total[array]+=calc[array]*16;
for (i=array-1;i>=0;i--)
{
total+=total[i+1]/1000000000000LL+calc*16;
total[i+1]%=1000000000000LL;
}
}
else
{
long long tail;
total[array]-=calc[array]*4;
for (i=array-1;i>=0;i--)
{
tail=total[i+1]%1000000000000LL;
total+=total[i+1]/1000000000000LL-((tail<0)?1:0)-calc*4;
total[i+1]=tail+((tail<0)?1000000000000LL:0);
}
}
}

runtime=times(0)-runtime;
cout<<"I'm glad to tell you that pi is ";
outputvalue(total,number);
cout<<"after calculated for "<<(float)runtime/100<<" seconds.\n";
return(0);
}



When you think everithing happens to you is so bad ....
remember that always could be even worse.
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16687
*.dip.t-dialin.net



+7174 Profil

icon Re: Problem sa kompajliranjem22.12.2003. u 12:47 - pre 247 meseci
Ovaj kod je toliko pun gresaka da tesko da i najludji kompajler moze ovo da proguta:

Npr:

long long *base=new long long[array+1];

pa onda:

for petlja...
base=remain/devide;

Ajd da se ne smejemo imenima varijabli, ali base je pointer dodjavola :) A dodeljuje mu se vrednost racunanja... to nece raditi 101%

Ista prica se ponavlja na nekoliko mesta, pointerima se dodeljuje vrednost racunanja. "base" se cesto koristi na taj pogresan nacin.

Neki kompajleri zatim ne prepoznaju "long long"

Itd..

Ko god da je pisao ovo, ovakav kod nije kompajlirao :-)

Ispravljanje ovog bi trajalo podosta - bolje pronadji neki bolji source koji racuna PI.


Recimo ovaj:

http://www.pisymbol.com/apps/picalc/picalc.104.zip

Command line verzija:

http://www.cacr.caltech.edu/~roy/upi/pi.txt


Koliko vidim i sljaka i kompajlira se :)

Tvoj broj PI sa 1000 decimala:

3.
14159 26535 89793 23846 26433 83279 50288 41971 69399 37510
58209 74944 59230 78164 06286 20899 86280 34825 34211 70679
82148 08651 32823 06647 09384 46095 50582 23172 53594 08128
48111 74502 84102 70193 85211 05559 64462 29489 54930 38196
44288 10975 66593 34461 28475 64823 37867 83165 27120 19091
45648 56692 34603 48610 45432 66482 13393 60726 02491 41273
72458 70066 06315 58817 48815 20920 96282 92540 91715 36436
78925 90360 01133 05305 48820 46652 13841 46951 94151 16094
33057 27036 57595 91953 09218 61173 81932 61179 31051 18548
07446 23799 62749 56735 18857 52724 89122 79381 83011 94912
98336 73362 44065 66430 86021 39494 63952 24737 19070 21798
60943 70277 05392 17176 29317 67523 84674 81846 76694 05132
00056 81271 45263 56082 77857 71342 75778 96091 73637 17872
14684 40901 22495 34301 46549 58537 10507 92279 68925 89235
42019 95611 21290 21960 86403 44181 59813 62977 47713 09960
51870 72113 49999 99837 29780 49951 05973 17328 16096 31859
50244 59455 34690 83026 42522 30825 33446 85035 26193 11881
71010 00313 78387 52886 58753 32083 81420 61717 76691 47303
59825 34904 28755 46873 11595 62863 88235 37875 93751 95778
18577 80532 17122 68066 13001 92787 66111 95909 21642 01989

DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

BlackSnake
Zenica, BA

Član broj: 11245
Poruke: 219
*.telecom.ba.



Profil

icon Re: Problem sa kompajliranjem22.12.2003. u 13:10 - pre 247 meseci
Ivane hvala na odgovoru

Evo da bi uklonili dileme pokušaću ti poslati source pridruživanjem jer sam ga prvi put samo pastirao pa je možda moglo doći do greške. U svakom slučaju u jednoj diskusija na istu temu dobio sam odgovor o uspješnom kompajliranju pomenutog sourcea.
Hvala ti za navedene linkove.
When you think everithing happens to you is so bad ....
remember that always could be even worse.
Prikačeni fajlovi
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16687
*.dip.t-dialin.net



+7174 Profil

icon Re: Problem sa kompajliranjem22.12.2003. u 13:22 - pre 247 meseci
Ok, sad je bolje.

Ovde ces imati nekoliko problema:

- Ako koristis MSVC++ 6.0 (mozda i Borland C++) "long long" nece biti prepoznat, mozes da ga zamenis sa "__int64"

- "sys/times.h" je unix include fajl, najbolje je da izbacis sve sto ima sa tim veze (samo merenje vremena - koje ti i ne treba), ili da ga zamenis sa ekvivalentnim resenjem na tvojoj platformi

- cout << (long long) ne radi svuda, evo Intel C++ na mojoj masini to nece da proguta, castingom na (long) program konacno radi, ali daje skroz pogresan rezultat - tako da na ovom mora isto da se poradi

Dakle, zakljucak - ovaj kod se kompajlira samo na Unix platformi, verovatno sa GNU kompajlerom kako treba - Intel C++ i MSVC 6.0 ovo ne kompajiraju, a verovatno ni Borland.

Resenje je ili da ispravljas ove probleme (jedino ostaje long long problem) ili da jednostavno koristis nesto sto se da kompajlirati svuda - kao primer koji sam ti dao.

DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

BlackSnake
Zenica, BA

Član broj: 11245
Poruke: 219
*.telecom.ba.



Profil

icon Re: Problem sa kompajliranjem22.12.2003. u 13:51 - pre 247 meseci
Ok Ivane,
Jasno mi je za onaj moj source, jer si mi ti to zaista lijepo objasnio.
A sada da te pitam za onaj tvoj link sa extenzijom txt.
Već sam ti rekao da sam ja instalirao Dev-C++ i kada učitam ovaj source takođe dobijem prijavu o čak 196 grešaka.
Primjetio sam u zaglavlju da je riječ o C kodu i da ima uputa o kompajliranju iz komandne linije.
Možeš li mi reći gdje griješim ?
Hvala ti



When you think everithing happens to you is so bad ....
remember that always could be even worse.
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16687
*.dip.t-dialin.net



+7174 Profil

icon Re: Problem sa kompajliranjem22.12.2003. u 14:04 - pre 247 meseci
Prepravih kod malo, sad bi trebao da se kompajlira bez greske sa bilo kojim C/C++ kompajlerom - kod je inace C, mada je toliko prost da mozes i da ga konvertujes u "politicki korektan" C++ vrlo jednostavno:

Code:

/****************************************/
/* Compute pi to arbitrary precision    */
/* Author Roy Williams February 1994    */
/* Uses Machin's formula...             */
/* pi/4 = 4 arctan(1/5) - arctan(1/239) */
/****************************************/
/* compile with cc -O -o pi pi.c        */
/* run as "pi 1000"                     */
/****************************************/
/* The last few digits may be wrong.......... */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BASE    10000
int nblock;
int *tot;
int *t1;
int *t2;
int *t3;

void print(int *result);
void set(int *result, int rhs);
void div(int *result, int denom);
void mult(int *result, int factor);
void sub(int *result, int *decrem);
void add(int *result, int *increm);
int zero(int *result);
void copy(int *result, int *from);
void arctan(int *result, int *w1, int *w2, int denom, int onestep);


void main(int argc , char **argv)
{
    int ndigit = 60;
    if(argc == 2)
        ndigit = atoi(argv[1]);
    else {
        fprintf(stderr, "Usage: %s ndigit\n", argv[0]);
        fprintf(stderr, "(Assuming 60 digits)\n");
    }
    if(ndigit < 20) ndigit = 20;
    nblock = ndigit/4;
    tot = (int *)malloc(nblock*sizeof(int));
    t1 = (int *)malloc(nblock*sizeof(int));
    t2 = (int *)malloc(nblock*sizeof(int));
    t3 = (int *)malloc(nblock*sizeof(int));
    if(!tot || !t1 || !t2 || !t3){
        fprintf(stderr, "Not enough memory\n");
        exit(1);
    }

    arctan(tot, t1, t2, 5, 1);
    mult(tot, 4);
    arctan(t3, t1, t2, 239, 2);
    sub(tot, t3);
    mult(tot, 4);
    print(tot);
}

void arctan(int *result, int *w1, int *w2, int denom, int onestep)
{
    int denom2 = denom*denom;
    int k = 1;

    set(result, 1);
    div(result, denom);
    copy(w1, result);

    do{
        if(onestep)
            div(w1, denom2);
        else {
            div(w1, denom);
            div(w1, denom);
        }
        copy(w2, w1);
        div(w2, 2*k+1);
        if(k%2)
            sub(result, w2);
        else
            add(result, w2);
        k++;
    } while(!zero(w2));
}

void copy(int *result, int *from)
{
    int i;
    for(i=0; i<nblock; i++)
        result[i] = from[i];
}

int zero(int *result)
{
    int i;
    for(i=0; i<nblock; i++)
        if(result[i])
            return 0;
    return 1;
}

void add(int *result, int *increm)
{
    int i;
    for(i=nblock-1; i>=0; i--){
        result[i] += increm[i];
        if(result[i] >= BASE){
            result[i] -= BASE;
            result[i-1]++;
        }
    }
}

void sub(int *result, int *decrem)
{
    int i;
    for(i=nblock-1; i>=0; i--){
        result[i] -= decrem[i];
        if(result[i] < 0){
            result[i] += BASE;
            result[i-1]--;
        }
    }
}

void mult(int *result, int factor)
{
    int i, carry = 0;
    for(i=nblock-1; i>=0; i--){
        result[i] *= factor;
        result[i] += carry;
        carry = result[i]/BASE;
        result[i] %= BASE;
    }
}

void div(int *result, int denom)
{
    int i, carry = 0;

    for(i=0; i<nblock; i++){
        result[i] += carry*BASE;
        carry = result[i] % denom;
        result[i] /= denom;
    }
}

void set(int *result, int rhs)
{
    int i;
    for(i=0; i<nblock; i++)
        result[i] = 0;
    result[0] = rhs;
}

void print(int *result)
{
    int i, k;
    char s[10];
    printf("%1d.\n", result[0]);
    for(i=1; i<nblock; i++){
        sprintf(s, "%4d ", result[i]);
        for(k=0; k<5; k++)
            if(s[k] == ' ') s[k] = '0';
        printf("%c%c%c%c", s[0], s[1], s[2], s[3]);
        if(i%15 == 0) printf("\n");
    }
    printf("\n");
}


DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

BlackSnake
Zenica, BA

Član broj: 11245
Poruke: 219
*.telecom.ba.



Profil

icon Re: Problem sa kompajliranjem22.12.2003. u 14:35 - pre 247 meseci
Svaka ti čast jarane,
Evo konačno sam uspio kompajlirati.
Čak sam i sam unio jednu ispravku. Vjerovatno si u brzini umjesto
int main(int argc , char **argv)
postavio
void main(int argc , char **argv)
U svakom slučaju da si bliže častio bih te pićem, jer sam do sada nailazio uglavnom na slučajeve nerazumijevanja za početnike od strane naprednijih programera (a to moraš priznati ne djeluje na moral ljudi koji tek treba da se zainteresuju za programiranje), a ti si zaista pokazao veliku strpljivost.

Puno ti hvala



When you think everithing happens to you is so bad ....
remember that always could be even worse.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Problem sa kompajliranjem

[ Pregleda: 3509 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.