Packed Decimals

4 отговора 146 прегледа
#1

Packed Decimals

Imam problem s packetiranite zeli chisla BCD. Programata mi raboti vurhu malki file-ove. Vurho golemi zapochva da dava greshka. Shte dam chast ot koda:


public void PackedVar(int acum)
{ long temp1;
long temp2;

long bit= acum;

temp1 =15 & acum;
bit>>>=4;
bit= bit&15;
temp2 = 15&bit;

update.append(temp2).append(temp1);
}


public void Convert(String tablename,String filename)
{ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch (ClassNotFoundException e){ System.out.println("Drivera ne e zareden"); }

String url = "jdbc:odbc:Plsss";

try{
Connection dataBase = DriverManager.getConnection(url,"","");
Statement state = dataBase.createStatement();
update = new StringBuffer("insert into "+tablename+" values('");

FileInputStream file = new FileInputStream(filename);
BufferedInputStream input = new BufferedInputStream(file);

int acum=0;
int len = update.length();

while (acum!=-1)
{
update.delete(len,update.length());
for (int i=0;i<poles;++i)
{ if (fieldformat=='P')
{
for (int j=0;j<offset/2+1;++j)
{ acum=input.read();

if (acum!=-1) PackedVar(acum);
else break;
}
update.append("','");
}

else{
for (int j=0;j<offset;++j)
{
acum=input.read();
if(acum!=-1) textvar(acum);
else break;
}
update.append("','");
}}

update.replace(update.length()-3,update.length(),"')");
// System.out.println(update.toString());
state.executeUpdate(update.toString());

}

input.close();
state.close();
}catch (SQLException e){ System.out.println(e.toString());System.out.println(update.toString()); }
catch (IOException p) {System.out.println(p.toString()); }
}

Programata raboti za malki filove, kakto i izpolzvaneto na shift za men e tochno no po niakakva prichina otvreme na vreme. okolo 0.001% ot podadenite bytove izliza nepravilno kato druga zifra na append i suotvetno v bazata danni.
V posledstvie razdelih informaziata koiato interpretira greshno v nov file, koito podadoh za konvertirane. Informaziata koiato predi konvertira greshno beshe konvertirana pravilno!!!!! PROSTVO VECHE NE ZNAM KAKVO DA PRAVIA POMAGAITE!!!!!!!!!!

Отговор
в отговор на Narzis #2

Re: Packed Decimals

Problem 1:
Ne stava mnogo iasno kakva e stojnostta na offset, no pri dostatychno goliama stojnost i failove po-golemi ot 3MB tazi programa shte crash-ne s OutOfMemoryError
Problem 2:
Struva mi se che se opitvash da port-nesh algoiritym ot C kym Java. Ako e taka "long" pod Windows ne e syshtoto kato "long" pod Java (dori pod Windows)
Problem 3:
Tova e greshno
try {
InputStream input = ...
... // neshto koeto throw-va
input.close()
} catch (IOException e) {
}

Pravilnoto e:
InputStream input = null;
try {
input = ... // open file
... // neshto koeto throw-va
} catch (IOException e) {
} finally {
if (input != null) { try { input.close(); } catch (IOException e1) {} }
}

Vtoroto niama da ostavi file-a otvoren v sluchaj che neshto throw-ne

Отговор
в отговор на antijb #3

Re: Packed Decimals

Dobre dobre ostavi taia rabota s potozite, da se susredotochim vuho problema.
Offseta ne nadminava po stoinosti 15!!!! nai mnogo da e 20! tui che problema s razmera na zifrata otpada. Vizdash li neshto drugo koeto moze da se bugva. Znam che ima prostotii v programata ma te sa shtoto udavnika za slamka se hvashta, nali znaesh.
Niakoi vizda li prichina???

Отговор
в отговор на Narzis #4

Re: Packed Decimals

Problemi da iskash...:)
Tova koeto pravish sys StringBuffer ne e mnogo razumno. Tozi class ima bug v niakoj JDK-i kogato se opitash da go izpolzvash otnovo sled kato si vikal toString(). Mislia che problema mu e memory leak. [линк]
Po-dobre e da syzdavash stringa s query-to vseki pyt vmesto da se opitvash da go delete-vash. Taka ili inache nishto ne pechelish.
Syshto ne e dobre tozi update buffer da e member variable. Po-dobre e da si e local variable, za da imash pylen kontrol koga i kak go dosrypvash
Shto znaesh kyde e greshno generiranata informatzia zashto ne spresh s debugger-a kogato se generira i da vidish zashto stava taka?

Отговор
в отговор на antijb #5

Re: Packed Decimals

Tia problemi sushto gi izchistih. Taia programa e v beta beta beta versia. Uspiah da izchistia problema po niakuv super idiotski nachin deto hich ne mi e iasen shto taka stava. Slozih Connection-a v ramkite na zikala while i zapochnah da go open i close-vam na vsiako vurtene. Poluchih 50%zaguba na performance no puk programata raboti.
ABE KVA E TAIA PROSTOTIIA BE? Niakakvi idei zashto taka stava?

Отговор