» »

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

OwcA ::

Katere knjižnice uporabljaš?
Otroška radovednost - gonilo napredka.

rapvirus ::

samo iostream.h

64202 ::

Verjetno tole:
#include <iostream>
using namespace std;

iostream.h je out ze kar nekaj casa
I am NaN, I am a free man!

rapvirus ::

ne to ne pomaga...

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?
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.

rapvirus ::

naj prosm še kdo pogleda....:(

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.
// 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. :D :D :D

Zgodovina sprememb…

  • spremenil: rapvirus ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C++] Kako vrniti NULL če je polje prazno

Oddelek: Programiranje
271731 (1248) Matic1911
»

C# (strani: 1 2 )

Oddelek: Programiranje
9711869 (8704) Ericssony
»

vprasanje c++

Oddelek: Programiranje
422434 (2433) Volk|
»

[C++] Linux

Oddelek: Programiranje
171933 (1353) CCfly
»

C++ & XP

Oddelek: Programiranje
241649 (1256) Exilian

Več podobnih tem