Java problem s polom v ife

Programovacie jazyky, rady, poradňa...
luckyx182
Amateur
Amateur
Príspevky: 17
Registrovaný: 17 okt 2013, 23:45

Java problem s polom v ife

Príspevok od používateľa luckyx182 »

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áš
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: Java problem s polom v ife

Príspevok od používateľa pcsiete »

  1. kódy dávaj do code
  2. Kód: Vybrať všetko

    int korene [] = new int [delitelep.size()*2];

    Kód: Vybrať všetko

    int[] korene = new int [delitelep.size()*2];
  3. chybová hláška ktorú si tu dal nevyzerá byť spôsobená týmto
luckyx182
Amateur
Amateur
Príspevky: 17
Registrovaný: 17 okt 2013, 23:45

Re: Java problem s polom v ife

Príspevok od používateľa luckyx182 »

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.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Java problem s polom v ife

Príspevok od používateľa BX »

Kód: Vybrať všetko

non-static variable cannot be referenced from a static content
Ak robíš len s funkciou main, ktorá je definovaná ako statická, tak všetko v tej triede musí byť statické. Pravdepodobne máš to pole ako členskú premennú a nie je static, alebo z main voláš nejakú metódu, ktorá nie je static (v ktorej je trebárs tento if a cyklus)

A 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ú.
luckyx182
Amateur
Amateur
Príspevky: 17
Registrovaný: 17 okt 2013, 23:45

Re: Java problem s polom v ife

Príspevok od používateľa luckyx182 »

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 :P

//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é.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Java problem s polom v ife

Príspevok od používateľa BX »

luckyx182 napísal:veď pole korene mám vytvorené a je statické.
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
Amateur
Amateur
Príspevky: 17
Registrovaný: 17 okt 2013, 23:45

Re: Java problem s polom v ife

Príspevok od používateľa luckyx182 »

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();}}
        
   }
}
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Java problem s polom v ife

Príspevok od používateľa BX »

Tipujem, že chyba je na riadku

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++) 
Vieš mi vysvetliť toto?

Kód: Vybrať všetko

if (q == 1) {int korene [] = new int [delitelep.size()*2];
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áš?
luckyx182
Amateur
Amateur
Príspevky: 17
Registrovaný: 17 okt 2013, 23:45

Re: Java problem s polom v ife

Príspevok od používateľa luckyx182 »

Á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 :P Á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
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Java problem s polom v ife

Príspevok od používateľa BX »

Dobre, logika je správna. No a teraz čo sa programovacieho jazyka týka.
Vysvetli, čo urobí toto

Kód: Vybrať všetko

private static int korene [];
(v hornej časti kódu)
a čo urobí toto

Kód: Vybrať všetko

if (q == 1)
{
     int korene [] = new int [delitelep.size()*2];
     korene[0] = 1;
}
(v tej nižšej časti)
luckyx182
Amateur
Amateur
Príspevky: 17
Registrovaný: 17 okt 2013, 23:45

Re: Java problem s polom v ife

Príspevok od používateľa luckyx182 »

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

Kód: Vybrať všetko

 korene[i] =(delitelep.get(j)); 
alebo

Kód: Vybrať všetko

 korene[i+1]=1; 
. 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.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Java problem s polom v ife

Príspevok od používateľa BX »

Nie, ja narážam na toto

Kód: Vybrať všetko

int korene [] = new int
Ty úplne ingoruješ tzv. scope (neviem, ako sa to prekladá)
Spusti 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!
		}
	}
}
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.
luckyx182
Amateur
Amateur
Príspevky: 17
Registrovaný: 17 okt 2013, 23:45

Re: Java problem s polom v ife

Príspevok od používateľa luckyx182 »

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 :D
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Java problem s polom v ife

Príspevok od používateľa BX »

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.
luckyx182
Amateur
Amateur
Príspevky: 17
Registrovaný: 17 okt 2013, 23:45

Re: Java problem s polom v ife

Príspevok od používateľa luckyx182 »

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ť.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Java problem s polom v ife

Príspevok od používateľa BX »

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 =
luckyx182
Amateur
Amateur
Príspevky: 17
Registrovaný: 17 okt 2013, 23:45

Re: Java problem s polom v ife

Príspevok od používateľa luckyx182 »

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. :smt023
Napísať odpoveď