View previous topic :: View next topic |
Author |
Message |
kneczaj Apprentice
Joined: 13 Oct 2006 Posts: 169 Location: Zamosc
|
Posted: Wed Apr 23, 2008 5:39 pm Post subject: [SOLVED] program w c++ - działa w windows a na linuksie nie |
|
|
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 |
|
|
mbar Veteran
Joined: 19 Jan 2005 Posts: 1990 Location: Poland
|
Posted: Wed Apr 23, 2008 5:53 pm Post subject: |
|
|
zacznijmy od emerge --info |
|
Back to top |
|
|
13Homer Guru
Joined: 12 Jul 2005 Posts: 461
|
Posted: Wed Apr 23, 2008 6:17 pm Post subject: |
|
|
To jest błąd w glibc. _________________ Lenovo ThinkPad R61 / C2D@2.6.24 / nVidia Quatro NVS 140M / 2 GB RAM |
|
Back to top |
|
|
polygon7 n00b
Joined: 17 Dec 2005 Posts: 38
|
Posted: Wed Apr 23, 2008 6:42 pm Post subject: |
|
|
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 |
|
|
joi_ Apprentice
Joined: 28 Mar 2005 Posts: 171
|
Posted: Wed Apr 23, 2008 6:44 pm Post subject: |
|
|
wczytujesz 5 znaków do 4 elementowej tablicy... |
|
Back to top |
|
|
13Homer Guru
Joined: 12 Jul 2005 Posts: 461
|
Posted: Wed Apr 23, 2008 9:10 pm Post subject: |
|
|
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 |
|
|
kneczaj Apprentice
Joined: 13 Oct 2006 Posts: 169 Location: Zamosc
|
Posted: Thu Apr 24, 2008 9:53 am Post subject: |
|
|
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ę:
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 |
|
Back to top |
|
|
|