Hallo,
ich habe folgenden Code programmiert:
Was er jetzt im Detail tut, ist eher nebensächlich.
Ich habe nur 2 eher grundsätzliche Probleme damit:
Anfangs hatte ich alle vorkommenden Variabeln und Methoden ohne "static" davor, nur die Main Methode hatte (wie erforderlich) static dabei.
Beim Compilieren kamen dann aber Fehlermeldung über Fehlermeldung.
Statische methode darf keine nichtstatische Aufrufen,
keine nicht statische Variable in statischem kontext, etc.
Darum sit nun überall static davor, das programm tut zwar was es soll aber das war nur ein vorübergehender Fix.
Wie kann ich das richtig machen mit dem static?
Weil wenn ich überall static wegmache ausser bei der main Methode, kommen garantiert wieder dutzende Fehlermeldungen :-/
Was mir auch (negativ) auffiel:
ich habe die Klasse so gebaut (oder zumindest war es so gedacht) dass die vorkommenden Variabeln auch ohne Konsolenparameter einen default Wert haben.
Und wird die Klasse mit passenden Parameter aufgerufen, dann werden eben erst die Variabeln mit den übergebenen Werten übershcrieben und dann das Eigentliche gemacht.
Jetzt hatte ich aus Gründen eine 2. klasse gebaut, die im Prinzip der Reihe nahc diese Klasse mit verschiedenen parametern aufrufen soll.
Hierzu hatte ich bspw.
als Code in der 2. klasse.
Beim Ausführen habe ich dann gemerkt dass, nachdem die klasse mit parameter 1 erstmals aufgerufen und auch fertig war, aber offenbar die vorhandenen Variabeln nicht gelöscht wurden oder so, jedenfalls kamen bei späteren Aufrufen immer unerwartertere Resultate raus.
Ich vermute mal dass es auch mit dem ganzen Static Kram zu tun hat aber ich weiß es nicht genau.
kann mir da bitte Jemand weiterhelfen bei dem Ganzen?
Ist es überhaupt richtig so, eine andere klasse über deren main methode aufzurufen? Oder macht man da normalerweise das anders?
ich habe folgenden Code programmiert:
Java:
import java.util.Arrays;
public class Test6
{
static int days=770; //Standard 770
static int range=11; //numbers 1-11 possible
static int var=7; //variables a-g, aka 7 times multiplying
//2 zeilen oberhalb anpassbar
static int power=24;
static int maxval=range+var-1; //11+7-1=18-1=17, 1 box less
static long goodtuples = 0L;
static long alltuples = 1L * (long) Math.pow (range, var);
static double prob = 0.0;
static int[] tuple1 = new int[range-1];
static int[] tuple2 = new int[range];
static int[] mintuple = new int[range-1];
//{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
static int[] maxtuple = new int [range-1];
//{ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
static double co=pow(1.1,power);
public static void main (String args[])
{
if(args.length>0){
days=Integer.parseInt(args[0]);
var= (int)(days/((double) 110));
power=(int)(days/((double) 30));
System.out.println ("var= "+var+" power= "+power);
maxval=range+var-1;
tuple1 = new int[range-1];
tuple2 = new int[range];
mintuple = new int[range-1];
maxtuple = new int [range-1];
co=pow(1.1,power);
goodtuples = 0L;
alltuples = 1L * (long) Math.pow (range, var);
prob = 0.0;
}
prework();
calc ();
}
public static void prework(){
for (int i=0;i<range-1;i++){
mintuple[i]=i;
}
for (int i=0;i<range-1;i++){
maxtuple[i]=(maxval-range+1)+i;
}
return;
}
//Calculate the odds
public static void calc (){ //f
for (int i = 0; i < tuple1.length; i++){
tuple1[i] = mintuple[i];
}
process (tuple1);
while (!Arrays.equals (tuple1, maxtuple)){
increase (tuple1);
process (tuple1);
}
//final result for probabilty
prob = prob + (double) goodtuples / (double) alltuples;
/*
System.out.println ("");
System.out.println ("");
System.out.println ("");
System.out.println ("goodtuples: " + goodtuples);
System.out.println ("alltuples: " + alltuples);
*/
System.out.println ("Final probability: " + prob);
}
//add +1 to tuple
public static boolean increase (int[]tuple1){ //f
int c = tuple1.length - 1;
while (!(tuple1[c] < maxtuple[c])){
c--;
if (c < 0){
return false;
}
}
tuple1[c]++;
int i = 1;
while (c + i < tuple1.length){
tuple1[c + i] = tuple1[c] + i;
i++;
}
return true;
}
//Calculate follow up tuple and check condition
public static boolean process (int[]tuple1){ //f
//calculate second tuple
tuple2[0] = tuple1[0] - (-1) - 1;//=tuple1[0]+0
for (int i = 1; i < tuple1.length; i++){
tuple2[i] = tuple1[i] - tuple1[i - 1] - 1;
}
tuple2[tuple2.length-1] = maxval - tuple1[tuple1.length-1] - 1;
//berechne funktionswert
double result = 1.0;
for (int i = 0; i < range; i++){
result = (double) result *pow(((45+(double)i)*1.5/50), tuple2[i]);
}
//check if function value above threshold
boolean result2 = (result >= co);
if (result2){
long m=1L;
m=m*(long)fac(var);
for(int i=0;i<tuple2.length;i++){
if(tuple2[i]>1){
m=m/((long)fac(tuple2[i]));
}
}
goodtuples = goodtuples+((long)m);
/*
System.out.print ("Tuple1=");
printer(tuple1);
System.out.print ("Tuple2=");
printer(tuple2);
System.out.println("m= "+m);
System.out.println ("result= "+result);
System.out.println();
*/
}
return result2;
}
//Array ausdrucken
public static void printer (int[]tuple){
for (int i = 0; i < tuple.length; i++){
System.out.print (" " + tuple[i]);
}
System.out.println ("");
}
//a^b
public static double pow(double a, int b){
double result=1.0;
for(int i=1;i<=b;i++){
result=result*a;
}
return result;
}
//a!
public static int fac(int a){
int result=1;
for(int i=1;i<=a;i++){
result=result*i;
}
return result;
}
}
Was er jetzt im Detail tut, ist eher nebensächlich.
Ich habe nur 2 eher grundsätzliche Probleme damit:
Anfangs hatte ich alle vorkommenden Variabeln und Methoden ohne "static" davor, nur die Main Methode hatte (wie erforderlich) static dabei.
Beim Compilieren kamen dann aber Fehlermeldung über Fehlermeldung.
Statische methode darf keine nichtstatische Aufrufen,
keine nicht statische Variable in statischem kontext, etc.
Darum sit nun überall static davor, das programm tut zwar was es soll aber das war nur ein vorübergehender Fix.
Wie kann ich das richtig machen mit dem static?
Weil wenn ich überall static wegmache ausser bei der main Methode, kommen garantiert wieder dutzende Fehlermeldungen :-/
Was mir auch (negativ) auffiel:
ich habe die Klasse so gebaut (oder zumindest war es so gedacht) dass die vorkommenden Variabeln auch ohne Konsolenparameter einen default Wert haben.
Und wird die Klasse mit passenden Parameter aufgerufen, dann werden eben erst die Variabeln mit den übergebenen Werten übershcrieben und dann das Eigentliche gemacht.
Jetzt hatte ich aus Gründen eine 2. klasse gebaut, die im Prinzip der Reihe nahc diese Klasse mit verschiedenen parametern aufrufen soll.
Hierzu hatte ich bspw.
Java:
Test6.main(1);
Test6.main(2);
Test6.main(3);
Beim Ausführen habe ich dann gemerkt dass, nachdem die klasse mit parameter 1 erstmals aufgerufen und auch fertig war, aber offenbar die vorhandenen Variabeln nicht gelöscht wurden oder so, jedenfalls kamen bei späteren Aufrufen immer unerwartertere Resultate raus.
Ich vermute mal dass es auch mit dem ganzen Static Kram zu tun hat aber ich weiß es nicht genau.
kann mir da bitte Jemand weiterhelfen bei dem Ganzen?
Ist es überhaupt richtig so, eine andere klasse über deren main methode aufzurufen? Oder macht man da normalerweise das anders?