Forum » Programiranje » c++ in linux/windows
c++ in linux/windows
rapvirus ::
Imam problem s programom, ki sem ga napisala v windowsih, tam tud skompajlala in mi pravilno dela. Ko sem ga prenesla na linux in tam še enkrat skompajlala je naredil skoraj vse narobe. (program je heapsort s k potomci) Če imam za uredit več kot 10 števil jih uredi narobe, sicer pa prav. Zanima me če kdo ve kaj bi lahko bilo narobe? Koda je identična na linuxu in windowsih. Hvala.
OwcA ::
Precej bolj plodovite odgovore boš dobila, če nam pokažeš kodo.
Otroška radovednost - gonilo napredka.
rapvirus ::
Ja sej res, se nisem takoj spomnla. Pri znakih ' < ' sem mogla dal presledke(ker je napisalo, da je nedovoljena html koda).Tukej je koda:
(vključila sem knjižnico iostream.h)
(vključila sem knjižnico iostream.h)
void zamenjaj(int& a,int& b) { int zacasno=a; a=b; b=zacasno; } void Popravi_v_kopico(int a[],int k,int i,int j) { int s; int m=j+k-2; if(i< =(m/k)) { s=k*i-(k-2); int sinovi[k]; int indeksi[k]; sinovi[0]=a[s-1]; indeksi[0]=s; int zm=1; while(k> =zm) { if((s+zm)< =j) { sinovi[zm]=a[s+zm-1]; indeksi[zm]=s+zm; } else break; zm++; } if(zm>1) { for(int h=0;h< zm-1;h++) { for(int f=0;f< zm-1;f++) { if(f+1< =zm) { if(sinovi[f]< sinovi[f+1]) { zamenjaj(sinovi[f],sinovi[f+1]); zamenjaj(indeksi[f],indeksi[f+1]); } } } } } s=indeksi[0]; if(a[i-1]< a[s-1]) { zamenjaj(a[i-1],a[s-1]); Popravi_v_kopico(a,k,s,j); } } } void Sestavi_zacetno_kopico(int a[],int n,int k) { int m=(n+k-2); for(int i=m/k;i>0;i--) Popravi_v_kopico(a,k,i,n); for(int j=0;j< n;j++) cout< < a[j] < < " "; cout< < endl; } int main() { int k,n,vnos; cin>>k; cin>>n; int stevila[n]; for(int i=0;i< n;i++) { cin>>vnos; stevila[i]=vnos; } Sestavi_zacetno_kopico(stevila,n,k); for(int r=n;r>1;r--) { zamenjaj(stevila[0],stevila[r-1]); Popravi_v_kopico(stevila,k,1,r-1); for(int i=0;i< n;i++) { cout < < stevila[i] < < " "; } cout < < endl; } return 0; }
Zgodovina sprememb…
- spremenilo: OwcA ()
64202 ::
Verjetno tole:
iostream.h je out ze kar nekaj casa
#include <iostream> using namespace std;
iostream.h je out ze kar nekaj casa
I am NaN, I am a free man!
rapvirus ::
zdej sem pogruntala, da mi začne narobe razporejat, če je število podatkov za urejanje večje kot 11, za 11 in manj pa dela prav
WarpedGone ::
Hmmm, sicer c++ že precej let ni več moj primarni jezik ampak:
cin>>n;
int stevila[n];
Tole kompajler pravilno pohendla? Dinamično alocira potrebn plac?
cin>>n;
int stevila[n];
Tole kompajler pravilno pohendla? Dinamično alocira potrebn plac?
Zbogom in hvala za vse ribe
rapvirus ::
ja to normalno prevede in števila se lepo naložijo v polje, problem je potem, ko jih urejam - se mi zdi kot da določene korake preskakuje, enkrat spusti čez določeno funkcijo, za drug primer spet ne.
Gundolf ::
> cin>>n;
> int stevila[n];
No čeprav kompajler to prebavi, to še ni pravi način za take stvari. In kolikor jaz vem, to v c++ standardu ni dovoljeno. Zato je tudi možen vir napak in predvsem nekompatibilnosti pri prenašanjih iz kompajlerjev, ki to dovolijo na take, ki pač ne.
Mislim da če vse takole popraviš bi moralo biti tako po standardu in zato z manj problemi zaradi prenosljivosti. Lahko da sem še kje pozabil kak popravek ampak iz teh zgornjih lahko ugotoviš vzorec in sama popraviš.
Pa si 100% da koda res pravilno dela v windowsih, nepravilno pa na linuxu? Prva asociacija ob takih težavah je ta, da uporabljaš neinitializirane spremenljivke. Recimo tisti tvoji tabeli sinovi in indeksi sta na prvi pogled nevarni na tem področju.
Drugače so že minila leta ko bi moral, če me kdo sredi noči zbudi, znat zrecitirat kodo za kopico, pa še prelen sem da bi se poglabljal v tvojo kodo. Spet na prvi pogled bi pa rekel, da zelo veliko premetavaš sinove in indekse, zelo malo pa dejanske podatke.
Pa še za v prihodnje, če kodo napišeš med taga [st.koda c++] in [/st.koda c++] (pri tem da lahko c++ zamenjas se z nekaj drugimi jeziki) ne bo problemov z < in >
> int stevila[n];
No čeprav kompajler to prebavi, to še ni pravi način za take stvari. In kolikor jaz vem, to v c++ standardu ni dovoljeno. Zato je tudi možen vir napak in predvsem nekompatibilnosti pri prenašanjih iz kompajlerjev, ki to dovolijo na take, ki pač ne.
// na zacetku dodas #include <vector> ... void Popravi_v_kopico(std::vector<int>& a,int k,int i,int j) ... void Sestavi_zacetno_kopico(std::vector<int>& a,int n,int k) ... // in se tole cin >> n; std::vector<int> stevila(n); // ce imas na zacetku napisan //using namespace std; potem lahko std:: v tej vrstici izpustis
Mislim da če vse takole popraviš bi moralo biti tako po standardu in zato z manj problemi zaradi prenosljivosti. Lahko da sem še kje pozabil kak popravek ampak iz teh zgornjih lahko ugotoviš vzorec in sama popraviš.
Pa si 100% da koda res pravilno dela v windowsih, nepravilno pa na linuxu? Prva asociacija ob takih težavah je ta, da uporabljaš neinitializirane spremenljivke. Recimo tisti tvoji tabeli sinovi in indeksi sta na prvi pogled nevarni na tem področju.
Drugače so že minila leta ko bi moral, če me kdo sredi noči zbudi, znat zrecitirat kodo za kopico, pa še prelen sem da bi se poglabljal v tvojo kodo. Spet na prvi pogled bi pa rekel, da zelo veliko premetavaš sinove in indekse, zelo malo pa dejanske podatke.
Pa še za v prihodnje, če kodo napišeš med taga [st.koda c++] in [/st.koda c++] (pri tem da lahko c++ zamenjas se z nekaj drugimi jeziki) ne bo problemov z < in >
rapvirus ::
Hvala, hvala:) Mi je ratalo, pa tud za tiste tabele (sinovi in indeksi) si mel prav. Lepo da si si vzel čas, pa želim ti lep preostanek večera.
Zgodovina sprememb…
- spremenil: rapvirus ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [C++] Kako vrniti NULL če je polje praznoOddelek: Programiranje | 1741 (1258) | Matic1911 |
» | C# (strani: 1 2 )Oddelek: Programiranje | 11908 (8743) | Ericssony |
» | vprasanje c++Oddelek: Programiranje | 2441 (2440) | Volk| |
» | [C++] LinuxOddelek: Programiranje | 1939 (1359) | CCfly |
» | C++ & XPOddelek: Programiranje | 1655 (1262) | Exilian |