Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[SOLVED] program w c++ - działa w windows a na linuksie nie
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Polskie forum (Polish) Polish OTW
View previous topic :: View next topic  
Author Message
kneczaj
Apprentice
Apprentice


Joined: 13 Oct 2006
Posts: 169
Location: Zamosc

PostPosted: Wed Apr 23, 2008 5:39 pm    Post subject: [SOLVED] program w c++ - działa w windows a na linuksie nie Reply with quote

Napisałem prosty program w c++, który powinien być wieloplatformowy, a mimo to nie działa na linuksie. Jest to bardzo krótki program, a w zasadzie część większego projektu. Wczytuje on ciąg cyfr z pliku (potrzebny w tym większym projekcie :]), a następnie kontrolnie wypisuje na konsoli.

Oto przykładowy plik z danymi do wczytania:
http://kneczaj.republika.pl/z25

Program należy uruchamiać w ten sposób:
./program z25

Program się kompiluje, ale podczas uruchamiania wywala błąd:

Code:
*** glibc detected *** ./program: double free or corruption (!prev): 0x0804b070 ***
======= Backtrace: =========
/lib/libc.so.6[0xb7d8ac64]
/lib/libc.so.6(cfree+0x9c)[0xb7d8cb4c]
/lib/libc.so.6(fclose+0x145)[0xb7d7ae65]
/usr/lib/libstdc++.so.6(_ZNSt12__basic_fileIcE5closeEv+0x6a)[0xb7f4b75a]
/usr/lib/libstdc++.so.6(_ZNSt13basic_filebufIcSt11char_traitsIcEE5closeEv+0xa4)[0xb7ef45b4]
/usr/lib/libstdc++.so.6(_ZNSt14basic_ifstreamIcSt11char_traitsIcEE5closeEv+0x25)[0xb7ef5ac5]
./eternity(__gxx_personality_v0+0x2d9)[0x8048b59]
./eternity(__gxx_personality_v0+0x3cd)[0x8048c4d]
/lib/libc.so.6(__libc_start_main+0xe6)[0xb7d36396]
./eternity(__gxx_personality_v0+0x41)[0x80488c1]
======= Memory map: ========
08048000-0804a000 r-xp 00000000 08:07 10701      /home/kamil/programowanie/e2/program
0804a000-0804b000 rw-p 00001000 08:07 10701      /home/kamil/programowanie/e2/program
0804b000-0806c000 rw-p 0804b000 00:00 0          [heap]
b7c00000-b7c21000 rw-p b7c00000 00:00 0
b7c21000-b7d00000 ---p b7c21000 00:00 0
b7d1f000-b7d20000 rw-p b7d1f000 00:00 0
b7d20000-b7e5a000 r-xp 00000000 08:06 5799       /lib/libc-2.7.so
b7e5a000-b7e5b000 r--p 0013a000 08:06 5799       /lib/libc-2.7.so
b7e5b000-b7e5d000 rw-p 0013b000 08:06 5799       /lib/libc-2.7.so
b7e5d000-b7e60000 rw-p b7e5d000 00:00 0
b7e60000-b7e6c000 r-xp 00000000 08:06 101079     /usr/lib/libgcc_s.so.1
b7e6c000-b7e6d000 rw-p 0000b000 08:06 101079     /usr/lib/libgcc_s.so.1
b7e6d000-b7e91000 r-xp 00000000 08:06 87221      /lib/libm-2.7.so
b7e91000-b7e93000 rw-p 00023000 08:06 87221      /lib/libm-2.7.so
b7e93000-b7f78000 r-xp 00000000 08:06 95795      /usr/lib/libstdc++.so.6.0.10
b7f78000-b7f7b000 r--p 000e5000 08:06 95795      /usr/lib/libstdc++.so.6.0.10
b7f7b000-b7f7d000 rw-p 000e8000 08:06 95795      /usr/lib/libstdc++.so.6.0.10
b7f7d000-b7f84000 rw-p b7f7d000 00:00 0
b7fad000-b7fae000 rw-p b7fad000 00:00 0
b7fae000-b7faf000 r-xp b7fae000 00:00 0          [vdso]
b7faf000-b7fca000 r-xp 00000000 08:06 89852      /lib/ld-2.7.so
b7fca000-b7fcc000 rw-p 0001a000 08:06 89852      /lib/ld-2.7.so
bf93b000-bf950000 rw-p bffeb000 00:00 0          [stack]
Przerwane


Na windowsie na Dev C++ 5.0 kompiluje się i uruchamia bezbłędnie.

Oto kod programu:
Code:
#include <iostream>
#include <string>
#include <fstream>

// ilosc kolorow
const short int IloscKolorow=4;
 
//rozmiar tabeli
const short int MaxX=5;
const short int MaxY=MaxX;
const short int IPol=MaxX*MaxY; // Ilość pól w tabeli

using namespace std;


class Cbufor{
   public:
      char t[IPol][4];
      Cbufor(char *plik);

};

Cbufor::Cbufor(char *plik)
{
   short int k;
   //wczytanie pliku i umieszczenie każdej cyfry w osobnej komórce tablicy
   std::ifstream dane;
   cout<<"dane utworzone\n";
   dane.open(plik);
   for (k=0; k<IPol; ++k)
      dane.getline(t[k], 5);
   {
      short int i, l;
   // wypisanie danych wejściowych z bufora
      cout << "Dane wejściowe: \n";
      for (l=0; l<IPol; l++)
         for (i=0; i<4; i++)
            cout << "[" << l << "," << i << "]" << ": " << t[l][i] << "\n";
   }
   cout<<"1\n";
   dane.close(); // [b]<------ tu pojawia się błąd[/b]
   cout<<"2\n";
}


int main(int argc, char *argv[])
{
   //bufor
   Cbufor* bufor;
   
   if (argv[1] == NULL)
   {
      cout << "Podaj nazwę pliku źródłowego!!!\n";
      return 0;
   }
   cout<<"\n";
   cout<<"Wczytuję plik...\n";
   /* Tworzenie niezbędnych do pracy programu obiektów */
   bufor = new Cbufor(argv[1]);
   cout<<"wczytano\n";
   return 0;
}


Błąd pojawia się podczas przetwarzania 41 linijki: dane.close();
Proszę każdego, kto zna się na programowaniu o przetestowanie go u siebie i przeanalizowanie błędu, bo ja nie mam pojęcia co jest nie tak zwłaszcza, że na windowsie działa.


Last edited by kneczaj on Thu Apr 24, 2008 10:22 am; edited 3 times in total
Back to top
View user's profile Send private message
mbar
Veteran
Veteran


Joined: 19 Jan 2005
Posts: 1990
Location: Poland

PostPosted: Wed Apr 23, 2008 5:53 pm    Post subject: Reply with quote

zacznijmy od emerge --info
Back to top
View user's profile Send private message
13Homer
Guru
Guru


Joined: 12 Jul 2005
Posts: 461

PostPosted: Wed Apr 23, 2008 6:17 pm    Post subject: Reply with quote

To jest błąd w glibc.
_________________
Lenovo ThinkPad R61 / C2D@2.6.24 / nVidia Quatro NVS 140M / 2 GB RAM
Back to top
View user's profile Send private message
polygon7
n00b
n00b


Joined: 17 Dec 2005
Posts: 38

PostPosted: Wed Apr 23, 2008 6:42 pm    Post subject: Reply with quote

Cześć,
pierwsza sprawa:

Code:

int main(int argc, char *argv[])
{
    Cbufor* bufor;

    if (argv[1] == NULL)
    {
        cout << "Podaj nazwę pliku źródłowego!!!\n";
        return 0;
    }

    cout<<"\n";
    cout<<"Wczytuję plik...\n";

    /* Tworzenie niezbędnych do pracy programu obiektów */
    bufor = new Cbufor(argv[1]);
    cout<<"wczytano\n";

TU BRAKUJE:  delete bufor;  INACZEJ MÓWIĄC MASZ MEMLEAK'a

    return 0;
}


Druga sprawa:
Code:

Cbufor::Cbufor(char *plik)
{
    short int k;
   
    //wczytanie pliku i umieszczenie każdej cyfry w osobnej komórce tablicy
    std::ifstream dane;

    cout<<"dane utworzone\n";
    dane.open(plik);

TEN FRAGMENT JEST DZIWNY:
----------------------------------------
    for (k=0; k<IPol; ++k)
    dane.getline(t[k], 5);
    {
----------------------------------------

JESTEŚ PEWIEN, ŻE CHCESZ COŚ TAKIEGO ZROBIĆ?
(jeśli tak, to niepotrzebnie zaciemniasz kod nawiasami klamrowymi)

        short int i, l;
        // wypisanie danych wejściowych z bufora
       
        cout << "Dane wejściowe: \n";
       
        for (l=0; l<IPol; l++)
            for (i=0; i<4; i++)
                cout << "[" << l << "," << i << "]" << ": " << t[l][i] << "\n";
    }

    cout<<"1\n";
    dane.close(); // <------ tu pojawia się błąd
    cout<<"2\n";
}


Trzecia sprawa, w konstruktorach raczej się takich rzeczy nie robi.

Ogólnie napisał bym to w ten sposób (UWAGA - pisane z głowy i nie sprawdzone)

Code:

#include <iostream>
#include <string>
#include <fstream>


//------------------------------------------------------------------------------
// ilosc kolorow
static const size_t IloscKolorow=4;

//rozmiar tabeli
static const size_t MaxX=5;
static const size_t MaxY=MaxX;
static const size_t IPol=MaxX*MaxY; // Ilość pól w tabeli


//------------------------------------------------------------------------------
class Cbufor
{
   public:
      Cbufor(const char *plik);
      ~Cbufor();

      void read();
      void writeToScreen();

   private:
      char tablica[IPol][4+1]; // ilość znaków + znak 0x0

      std::ifstream dane;
};

//------------------------------------------------------------------------------
Cbufor::Cbufor(const char *plik)
{
   //wczytanie pliku i umieszczenie każdej cyfry w osobnej komórce tablicy
   dane.open(plik);
   std::cout << "Otwarcie pliku..." << (dane.is_open() ? "OK" : "Blad!");
   std::cout << std::endl;
}

//------------------------------------------------------------------------------
Cbufor::~Cbufor()
{
   dane.close();
}

//------------------------------------------------------------------------------
void Cbufor::read()
{
   size_t k=0;
   while(dane.good() && k<IPol)
   {
      dane.getline(tablica[k], 5);
      ++k;
   }

   std::cout << "wczytano" << std::endl;
}

//------------------------------------------------------------------------------
void Cbufor::writeToScreen()
{
   // wypisanie danych wejściowych z bufora
   std::cout << "Dane wejściowe:" << std::endl;

   for (size_t l=0; l<IPol; l++)
      for (size_t i=0; i<4; i++)
            std::cout << "[" << l << "," << i << "]" << ": " << tablica[l][i] << std::endl;
}

int main(int argc, char *argv[])
{
   if (argv[1] == NULL)
   {
      std::cout << "Podaj nazwę pliku źródłowego!!!" << std::endl;
      return 0;
   }

   std::cout << std::endl << "Wczytuję plik..." << std::endl;

   // Tworzenie niezbędnych do pracy programu obiektów

   //bufor
   Cbufor* bufor = new Cbufor(argv[1]);

   bufor->read();
   bufor->writeToScreen();


   delete bufor;

   return 0;
}


P.S. republika.pl zwraca "Przykro nam, strona o podanym adresie nie istnieje."
_________________
regards,
p7

Favorite software:
Open source IDE Code::Blocks, Free open source UML modelling tool ArgoUML
Back to top
View user's profile Send private message
joi_
Apprentice
Apprentice


Joined: 28 Mar 2005
Posts: 171

PostPosted: Wed Apr 23, 2008 6:44 pm    Post subject: Reply with quote

wczytujesz 5 znaków do 4 elementowej tablicy...
Back to top
View user's profile Send private message
13Homer
Guru
Guru


Joined: 12 Jul 2005
Posts: 461

PostPosted: Wed Apr 23, 2008 9:10 pm    Post subject: Reply with quote

polygon7 wrote:
P.S. republika.pl zwraca "Przykro nam, strona o podanym adresie nie istnieje."

Trzeba skasować slash na końcu.
_________________
Lenovo ThinkPad R61 / C2D@2.6.24 / nVidia Quatro NVS 140M / 2 GB RAM
Back to top
View user's profile Send private message
kneczaj
Apprentice
Apprentice


Joined: 13 Oct 2006
Posts: 169
Location: Zamosc

PostPosted: Thu Apr 24, 2008 9:53 am    Post subject: Reply with quote

Dzięki polygon7, twój program działa idealnie. Po małym dochodzeniu w sprawie mojego błędu i porównaniu twojego kodu z moim doszedłem do wniosku, że był on spowodowany przez linijkę:
Code:
char t[IPol][4];

Po zamianie 4 na 5 wszystko już jest w porządku.

Morał z tego taki, że windows pozwala na uruchamianie nawet źle napisanych programów :P
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Polskie forum (Polish) Polish OTW All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum