Java problem s polom v ife
Java problem s polom v ife
Zdravím, už je mi to trochu trápne sa pýtať na každú hovadinu, ale neviem si poradiť s jedným polom v ife. If vyzerá takto
if (q == 1) {int korene [] = new int [delitelep.size()*2];
int j = 0;
for (int i = 0; i < korene.length; i = i+2) {korene =(delitelep.get(j));
korene[i+1]=1;
j++;}}
a potom s ním chcem pracovať v takomto cykle
if((p != 1) && (q != 1)){
for (int i = 0; i < (korene.length/2) - 1; i++) { for (int y = 1; y < (korene.length/2)-i; y++)
{if ((korene[2*i] / korene[2*i+1]) == (korene[2*(y+i)] / korene[2*(y+i)+1])) {korene[2*(y+i)] = 0; korene[2*(y+i)+1]=0;}}}}
ale vyhadzuje mi non-static variable cannot be referenced from a static content
Myslím, že java ho berie ako lokálne pole, keďže si v ife vytváram pole, ale neviem ako ho odtiaľ dostať. Nápady? Diki moc.
Lukáš
if (q == 1) {int korene [] = new int [delitelep.size()*2];
int j = 0;
for (int i = 0; i < korene.length; i = i+2) {korene =(delitelep.get(j));
korene[i+1]=1;
j++;}}
a potom s ním chcem pracovať v takomto cykle
if((p != 1) && (q != 1)){
for (int i = 0; i < (korene.length/2) - 1; i++) { for (int y = 1; y < (korene.length/2)-i; y++)
{if ((korene[2*i] / korene[2*i+1]) == (korene[2*(y+i)] / korene[2*(y+i)+1])) {korene[2*(y+i)] = 0; korene[2*(y+i)+1]=0;}}}}
ale vyhadzuje mi non-static variable cannot be referenced from a static content
Myslím, že java ho berie ako lokálne pole, keďže si v ife vytváram pole, ale neviem ako ho odtiaľ dostať. Nápady? Diki moc.
Lukáš
Re: Java problem s polom v ife
- kódy dávaj do code
-
Kód: Vybrať všetko
int korene [] = new int [delitelep.size()*2];Kód: Vybrať všetko
int[] korene = new int [delitelep.size()*2]; - chybová hláška ktorú si tu dal nevyzerá byť spôsobená týmto
Re: Java problem s polom v ife
To
Kód: Vybrať všetko
mi nechce zobrat kompilator... Kde to mam napisat? Tak ako si napisal ty? Nie, chyba je určite tam, je síce pravda, že tam mám ešte nejaké else if a else, ale to je uplne to iste akurat ine podmienky. Aj po vymazani elsov mi to stale vyhadzovalo chybu.Re: Java problem s polom v ife
Kód: Vybrať všetko
non-static variable cannot be referenced from a static contentA code je tu na fóre, tam hore nad textom, ktorý píšeš. Zdrojáky dávaj práve do tagov code, lepšie sa tak čítajú.
Re: Java problem s polom v ife
BX máš absolútnu pravdu, ako keby si mi čítal z programu. Už to funguje, veľká vďaka, zas som sa niečo nové naučil.
A s tým code sme sa trošku nerozumeli, ale už viem čo ste chceli, sorry 
//autoeditácia príspevku (02 Dec 2013, 16:35)
Narazil som na ďalší problém. Tentoraz mi vyhadzuje Exception in thread "main" java.lang.NullPointerException. Dočítal som sa, že toto sa stane ak nie je vytvorený nejaký objekt. Mne to vyhadzuje chybu do riadku, tam kde je pole korene, ale neviem prečo, veď pole korene mám vytvorené a je statické.
//autoeditácia príspevku (02 Dec 2013, 16:35)
Narazil som na ďalší problém. Tentoraz mi vyhadzuje Exception in thread "main" java.lang.NullPointerException. Dočítal som sa, že toto sa stane ak nie je vytvorený nejaký objekt. Mne to vyhadzuje chybu do riadku, tam kde je pole korene, ale neviem prečo, veď pole korene mám vytvorené a je statické.
Re: Java problem s polom v ife
No možno ani nie, ak ho vytváraš v podmienke tak, ako naznačuje tvoj prvý príspevok. Ukáž kód, pre všetkých to bude ľahšie (A zdroják do tagov CODE, prosím)luckyx182 napísal:veď pole korene mám vytvorené a je statické.
Re: Java problem s polom v ife
Kód: Vybrať všetko
package semestralka;
import java.util.Scanner;
import java.util.ArrayList;
public class KorenePolynomu {
private static ArrayList delitelep;
private static ArrayList deliteleq;
private static int korene [];
private int vstup [];
public static void KorenePolynomu () {
Scanner zadaj = new Scanner(System.in);
ArrayList <Integer> delitelep = new ArrayList ();
ArrayList <Integer> deliteleq = new ArrayList ();
int stupen;
//zapis polynomu od pouzivatela
do {
System.out.println("Zadaj stupen polynomu ");
stupen = zadaj.nextInt();
if (stupen > 20 ) {System.out.println("Zadaj stupen polynomu mensi ako 20");}
if (stupen < 2 ) {System.out.println("Zadaj stupen polynomu vacsi ako 1");}
} while ((stupen > 19) || (stupen < 2));
//nacitanie polynomu
int vstup [] = new int [stupen + 1];
vstup[vstup.length - 1] = 1;
for (int i = 0; i < vstup.length; i++) {do{
System.out.println("x^" + ((vstup.length - 1) - i));
vstup[i] = zadaj.nextInt();
if (vstup[0] ==0){System.out.println("Prvy clen nesmie byt nula");}
else if ((vstup[vstup.length-1] == 0) && (i == vstup.length-1))
{System.out.println("Posledny clen nesmie byt nula");}}
while ((vstup[0] ==0)|| (vstup[vstup.length - 1] == 0));}
System.out.println("==================");
// vypocet delitelov absolutneho clena
int p = Math.abs(vstup [vstup.length - 1]);
if (p != 1) {for (int i = 0; i < p ; i++) {if (p % (p - i) == 0){delitelep.add(p - i);}}}
// vypocet delitelov prveho clena
int q = Math.abs(vstup[0]);
if (q != 1) {for (int i = 0; i < q ; i++) {if (q % (q - i) == 0){deliteleq.add(q - i);}}}
//da do pola moznych korenov
if (q == 1) {int korene [] = new int [delitelep.size()*2];
int j = 0;
for (int i = 0; i < korene.length; i = i+2) {korene[i] =(delitelep.get(j));
korene[i+1]=1;
j++;}}
else if (p == 1) { int korene [] = new int [deliteleq.size()*2];
int j = 0;
for (int i = 0; i < korene.length ; i = i+2) {korene[i] = 1;
korene[i+1] = deliteleq.get(j);
j++;}}
else{
int j = 0;
int korene [] = new int [delitelep.size()*deliteleq.size()*2];
for (int i = 0; i < delitelep.size() ; i++) { for (int y = 0; y < deliteleq.size(); y++) {korene[j]=delitelep.get(i);
korene[j+1]=deliteleq.get(y);
j=j+2;}}}
//ak najde rovnake korene zmeni ich na nulu
if((p != 1) && (q != 1)){
for (int i = 0; i < (korene.length/2) - 1; i++) { for (int y = 1; y < (korene.length/2) - i; y++)
{if (((double)korene[2*i] / (double)korene[2*i+1]) == ((double)korene[2*(y+i)] / (double)korene[2*(y+i)+1])) {korene[2*(y+i)] = 0; korene[2*(y+i)+1]=0;}}}}
System.out.println("Mozne korene su: ");
for (int i = 0; i < korene.length/2; i=i+2){if((p == 1) && (q == 1)) {Zlomky zlomok = new Zlomky (1,1);zlomok.vypis();break;}
if ((korene[i] != 0) && (korene[i+1] != 0)) {Zlomky zlomok = new Zlomky (korene[i],korene[i+1]);zlomok.vypis();}}
}
}Re: Java problem s polom v ife
Tipujem, že chyba je na riadku
Vieš mi vysvetliť toto?
btw. tak hnusne neprehľadný kód som už dávno nevidel. To už je lepší aj kód, kde je všetko na samostatnom riadku, aj keď bez tabulátorov. Ty sa v ňom vyznáš?
Kód: Vybrať všetko
for (int i = 0; i < (korene.length/2) - 1; i++) { for (int y = 1; y < (korene.length/2) - i; y++) Kód: Vybrať všetko
if (q == 1) {int korene [] = new int [delitelep.size()*2];Re: Java problem s polom v ife
Áno, máš pravdu, chybu mi vyhadzuje v tom riadku. Ja viem, že je to neprehladné, ospravedlňujem sa, ale ja sa v tom vyznám
Áno, viem to vysvetliť, do pola korene si dávam akokeby zlomky, čiže napr. korene[1,1,2,1] reprezentujú 1/1 a 2/1, aby som potom s nimi mohol vstupovať do triedy zlomky. Takže ak q == 1 a p je napr. 3, možné korene sú p/q, teda do pola korene sa uloží [1,1,3,1], viď číslo 3 má dve delitele, takže toto pole bude mať dĺžku 4
Re: Java problem s polom v ife
Dobre, logika je správna. No a teraz čo sa programovacieho jazyka týka.
Vysvetli, čo urobí toto (v hornej časti kódu)
a čo urobí toto (v tej nižšej časti)
Vysvetli, čo urobí toto
Kód: Vybrať všetko
private static int korene [];a čo urobí toto
Kód: Vybrať všetko
if (q == 1)
{
int korene [] = new int [delitelep.size()*2];
korene[0] = 1;
}Re: Java problem s polom v ife
No v tom prvom som sa riadil tvojou radou, že ak je trieda statická, tak všetko v nej musí byť statické. A to druhé neviem na ktorý riadok smeruješ, či alebo . Ak na ten prvý, tak korene[0] = 1 a korene[1] = 1, čiže možným korenom bude 1/1, ak na ten druhý, tak korene[0] nikdy nebude nula, viď riadok kódu vyššie.
Kód: Vybrať všetko
korene[i] =(delitelep.get(j)); Kód: Vybrať všetko
korene[i+1]=1; Re: Java problem s polom v ife
Nie, ja narážam na toto
Ty úplne ingoruješ tzv. scope (neviem, ako sa to prekladá)
Spusti si pre srandu tento program
Z toho by si mal vidieť, že tú statickú premennú (členskú premennú triedy) vlastne nikde nenastavuješ. V podmienkach totiž pracuješ s úplne inou premennou korene.
Kód: Vybrať všetko
int korene [] = new intSpusti si pre srandu tento program
Kód: Vybrať všetko
import static java.lang.System.out;
public class j
{
private static int var;
public static void main(String [] args)
{
var = 42; // nastavím členskú premennú
out.println( "var = " + var );
if( true )
{
int var = 1;
out.println( "var = " + var ); // ej! Čo to!
out.println( "var = " + j.var ); // Tú je tá členská... :)
}
if( true )
{
out.println( "var = " + var ); // Fíha!
}
}
}Re: Java problem s polom v ife
Aha, takže v tých podmienkach si vlastne nastavujem lokálnu premennú a nie členskú, jasné. Čiže ak som tomu dobre pochopil, mám okrem začiatku vymazať tie inty či? btw dobré komentáre 
Re: Java problem s polom v ife
Presne tak 
Plus, môžeš presunúť tú členskú premennú do metódy (ako lokálna premenná metódy). Aj tak s tým pracuješ len v tej jednej.
Plus, môžeš presunúť tú členskú premennú do metódy (ako lokálna premenná metódy). Aj tak s tým pracuješ len v tej jednej.
Re: Java problem s polom v ife
Ako by to potom malo vyzerať? Respektíve ako nastavím členské pole, lebo keď vymažem inty, tak je jasné, že to nejde a neviem ako to správne syntakticky urobiť.
Re: Java problem s polom v ife
Normálne tú deklaráciu premennej korene hore necháš tak ako je a v celej metóde už budeš pracovať tak, akoby už bola vytvorená (lebo aj je)
Takže žiadne int korene [] =, ale korene =
Takže žiadne int korene [] =, ale korene =
Re: Java problem s polom v ife
Aha, super, frčí to, ani neviem ako ti poďakovať... Karmu už máš zvýšenú
Ešte raz diki moc, ak by som mal ešte nejaký problém, tak to tu hodím. 