Wiesław Kurko

Wiesław Kurko Student,
Politechnika
Rzeszowska im.
Ignacego
Łukasiewicza

Temat: Zapis i odczyt obiektów

Witam,

Tworze tablicę Object, w miej umieszczam tablicę float i zapisuje na pamięci USB. Gdy wczytuje ponownie to liczby zapisane są średnio o 0.02 różne od tych które zapisałem.
Jak naprawić ten błąd? Może jest inny, lepszy sposób na zapisywanie tablic na dysk?

konto usunięte

Temat: Zapis i odczyt obiektów

Mozesz podeslac kod? Nie uwierze jak nie zobacze...Wlodzimierz Mazur edytował(a) ten post dnia 08.05.09 o godzinie 21:51
Wiesław Kurko

Wiesław Kurko Student,
Politechnika
Rzeszowska im.
Ignacego
Łukasiewicza

Temat: Zapis i odczyt obiektów

Cały kod jest sporych rozmiarów, ale sposób tworzenia, zapisywania jest następujący:

Object[] objekt=new Object[5];
objektTemp=new Object[con1Wymiar][6];
for(int i=0;i<con1Wymiar;i++)
{
objektTemp[i][0]=con1[i].getWagi();
objektTemp[i][1]=con1[i].getDWag();
objektTemp[i][2]=con1[i].getOldDWag();
objektTemp[i][3]=con1[i].getBias();
objektTemp[i][4]=con1[i].getDBias();
objektTemp[i][5]=con1[i].getOldDBias();
}
objekt[0]=objektTemp;

objektTemp=new Object[con2Wymiar][6];
for(int i=0;i<con2Wymiar;i++)
{
objektTemp[i][0]=con2[i].getWagi();
objektTemp[i][1]=con2[i].getDWag();
objektTemp[i][2]=con2[i].getOldDWag();
objektTemp[i][3]=con2[i].getBias();
objektTemp[i][4]=con2[i].getDBias();
objektTemp[i][5]=con2[i].getOldDBias();
}
objekt[1]=objektTemp;

objektTemp=new Object[1][6];
objektTemp[0][0]=fc1.getWagi();
objektTemp[0][1]=fc1.getDWag();
objektTemp[0][2]=fc1.getOldDWag();
objektTemp[0][3]=fc1.getBias();
objektTemp[0][4]=fc1.getDBias();
objektTemp[0][5]=fc1.getOldDBias();
objekt[2]=objektTemp;

objektTemp=new Object[1][6];
objektTemp[0][0]=fc2.getWagi();
objektTemp[0][1]=fc2.getDWag();
objektTemp[0][2]=fc2.getOldDWag();
objektTemp[0][3]=fc2.getBias();
objektTemp[0][4]=fc2.getDBias();
objektTemp[0][5]=fc2.getOldDBias();
objekt[3]=objektTemp;

objektTemp=new Object[1][6];
objektTemp[0][0]=fc3.getWagi();
objektTemp[0][1]=fc3.getDWag();
objektTemp[0][2]=fc3.getOldDWag();
objektTemp[0][3]=fc3.getBias();
objektTemp[0][4]=fc3.getDBias();
objektTemp[0][5]=fc3.getOldDBias();
objekt[4]=objektTemp;

ZapiszObjekt.zapiszObiekt(objekt,
"SiecV3_3_1\\..\\WspolneWagi\\WB_"+nazwaUczonejSieci);

jak wynika z kodu wszystko powinno być ok. Może robię jakiś błąd. Lepiej może dopisać nowe klasy do przechowywania tablic i wykorzystać mechanizm serializacji?
Tak przy okazji. Zapisując tablicę o dużych wymiarach (kilka tyś.) do pliku txt to czas znacząco się wydłuża nawet do kilku minut. Jest to wykładniczy wzrost. Jak można zapisywać wydajnie takie tablice do pliku txt?Wiesław Kurko edytował(a) ten post dnia 09.05.09 o godzinie 10:56

konto usunięte

Temat: Zapis i odczyt obiektów

- glownie chodzilo mi o mechanizm zapisu do pliku

Dodaj prosze kod "zapiszObiekt" i pewnie "wczytajObiekt"
Michał Mally

Michał Mally Senior Software
Engineer, Software
Mind SA

Temat: Zapis i odczyt obiektów

Twój problem wynika najprawdopodobniej z precyzji typu danych float. Jeżeli chcesz mieć dokładniejsze wyniki używaj double. Natomiast jeżeli są to operacje dla których bezwzględna dokładność jest konieczna (np. operacje finansowe), to powinieneś używać BigDecimal.
Wiesław Kurko

Wiesław Kurko Student,
Politechnika
Rzeszowska im.
Ignacego
Łukasiewicza

Temat: Zapis i odczyt obiektów

Błąd już nie występuje. Nie mam pojęci co powodowało błąd, ale już się naprawiło. Może to system, ale nie będę zgadywał. Jakby komuś było potrzebne to podje metody zapisujące i odczytujące obiekty na/z dysku:
/**
* Odczyt
* @param sciezka do pliku
* @return pobrany objekt
*/
public static Object[] getObject(String sciezka) {
Object[] tf; // tablice Object
try {
ObjectInputStream ois =
new ObjectInputStream(
new FileInputStream(sciezka)
);
tf = (Object[]) ois.readObject();
ois.close();
} catch (Exception e) {
System.out.println("Blad odczytu.\"getObject\"");
return null;
}
System.out.println("Odczyt poprawny \"getObject\"");
return tf;
}
/**
* Zapis
* @param wektor
* @param sciezka
*/
public static void zapiszObiekt(Object[] wektor, String sciezka){
try {
ObjectOutputStream oos =
new ObjectOutputStream(
new BufferedOutputStream(
new FileOutputStream(sciezka)
)
);
oos.writeObject(wektor);
oos.flush();
oos.close();
} catch (Exception e) {
System.out.println("Blad zapisu do "+sciezka);
return;
}
}Wiesław Kurko edytował(a) ten post dnia 11.05.09 o godzinie 09:13
Jakub L.

Jakub L. Programista

Temat: Zapis i odczyt obiektów

Ścieżka.

konto usunięte

Temat: Zapis i odczyt obiektów

Wiesław Kurko:
liczby zapisane są średnio o 0.02 różne od tych które zapisałem.
Michał Mally:
Twój problem wynika najprawdopodobniej z precyzji typu danych float.

Tego nie da sie zrzucic na zaokraglanie. Nawet przy obliczeniach "na studia" trzeba mocno pomyslec jak skopac algorytm numeryczny, zeby osiagnac blad tej wielkosci.
Wiesław Kurko:
Błąd już nie występuje.

Prawdopodobnie jakis czeski blad :]
objekt[0]=objektTemp;

(Ała)Wlodzimierz Mazur edytował(a) ten post dnia 11.05.09 o godzinie 08:15
Wiesław Kurko

Wiesław Kurko Student,
Politechnika
Rzeszowska im.
Ignacego
Łukasiewicza

Temat: Zapis i odczyt obiektów

Za błędy przepraszam i za brak konsekwencji (raz nazwy pl, raz ang a raz moje :| ). Tak, czasami chyba mam za dużo tych błędów.



Wyślij zaproszenie do