Int Array als Parameter funktioniert nicht so recht Java 

Status
Für weitere Antworten geschlossen.

N0N+uLtR4

Registered +
Registriert
Apr. 2007
Beiträge
237
Hallo Leute.

Hab da ein Problem, wo ich nicht ganz auf dessen Ursprung hinkomme.

Das Programm kompiliert, beide sind im selben Package.
Nur nach der Übergabe, habe ich im IntArray nur '0' drin und weiß einfach nicht warum.
Kann mir da wer helfen?

Folgende ProgrammSegmente:

PHP:
public static void main(String[] args) {
int []i=new int [20000];

for(int j : i)
{
i[j]=new Random().nextInt(100);
}
Thread t1 = new Thread(new Addieren(i,0,10000));
t1.start();


}

PHP:
public class Addieren extends Thread {
private int sum=0;
private int []i=null;
private int start=0;
private int ende=0;
int temp=0;

public void setSum(int sum)
{
this.sum=sum;
}
public int getSum()
{
return this.sum;
}

public void setI(int []i)
{
this.i=i;
}
public int[] getI()
{
return this.i;
}

public void setStart(int start)
{
this.start=start;
}
public int getStart()
{
return this.start;
}

public void setEnde(int ende)
{
this.ende=ende;
}
public int getEnde()
{
return this.ende;
}

@Override
public void run()
{
for(int j=start;j {
temp+=getI()[j];
}
this.sum+=this.temp;
System.out.println(this.sum);
}

public Addieren(int []i, int start, int ende)
{
setI(i);
setStart(start);
setEnde(ende);
}

}
 
Also ich hab das alles in einer Datei und natuerlich java.util.Random importiert und es kommt nicht 0 raus.

Ich denke zwar nicht, dass es daran liegt, aber es reicht, wenn du nur ein Random erstellst:

PHP:
Random rand = new Random();

for(int j : i)
{
i[j]=rand.nextInt(100);
}

Du hast gesagt, es sind nur Segmente. Kannst du mal alles zeigen? (vollstaendige Dateien von Anfang bis Ende)

PS: Aso und nochwas: Du braucht in der Klasse nicht die Setter Methoden aufrufen, du kannst im Konstruktor auch gleich schreiben this.i = i; etc.

Edit: Ah halt, einen Augenblick. Es ist zwar tatsaechlich nicht alles 0, aber alles ausser die erste Zahl.^^
Ich editier den Post noch, wenn mir ein Loesungsvorschlag einfaellt.
 
Zuletzt bearbeitet von einem Moderator:
Im Prinzip war das das ganze Programm nur halt ohne den ganzen Schnickschnack drumherum.

Das mit dem new Random funktioniert, das Array ist im Hauptprogramm gefüllt.

Es ist eben das Problem, dass nach der Übergabe des "i" Arrays im Konstruktor das i Array leer ist. Das macht bei CallByValue und bei CallByReference (hier) keinen Sinn.

By the Way: Verwende NetBeans 6.7

Hier das komplette Programm mit den systemOuts zum testen.

PHP:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package javaapplication10;
import java.util.*;

/**
*
* @author Stefan
*/
public class Main {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
int []i=new int [20000];



for(int j : i)
{
i[j]=new Random().nextInt(100);
//System.out.println(i[j]);
}
Thread t1 = new Thread(new Addieren(i,0,10000));
t1.start();


}

}

PHP:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package javaapplication10;

/**
*
* @author Stefan
*/
public class Addieren extends Thread {
private int sum=0;
private int []i=null;
private int start=0;
private int ende=0;
int temp=0;

public void setSum(int sum)
{
this.sum=sum;
}
public int getSum()
{
return this.sum;
}

public void setI(int []i)
{
this.i=i;
}
public int[] getI()
{
return this.i;
}

public void setStart(int start)
{
this.start=start;
}
public int getStart()
{
return this.start;
}

public void setEnde(int ende)
{
this.ende=ende;
}
public int getEnde()
{
return this.ende;
}

@Override
public void run()
{
System.out.println(start);
System.out.println(ende);
for(int j=start;j {
temp+=getI()[j];
System.out.println(this.i[j]);
//System.out.println(temp);
}
System.out.println(temp);
System.out.println(this.sum);
}

public Addieren(int []i, int start, int ende)
{
setI(i);
setStart(start);
setEnde(ende);
for(int j=start;j {
temp+=getI()[j];
System.out.println(i[j]);
//System.out.println(temp);
}
}

}
 
PHP:
 for(int j : i)
{
i[j]=new Random().nextInt(100);
}

Der Aufruf ist so falsch. j nimmt ja nicht die Werte der Indezes an, sondern die Werte im Array (also immer 0, deswegen ist auch nur das erste Element gefuellt).
D.h. wenn schon, dann muesste es so lauten: j = new Random().nextInt(100);
Das funzt aber auch nicht, weil Java bei primitiven Datentypen nicht referenziert, sondern kopiert.

Ich empfehle eine konventionelle for-Schleife:

PHP:
for(int k = 0; k < i.length; k++)
{
i[k]=rand.nextInt(100);
}

PS: Und nimm doch trotzdem lieber nur ein Random Element, spart Speicher und der Garbage Collecter hat weniger zu tun.
PPS: Code kannste wieder rausnehmen, wenn du willst, war vorschnell von mir verlangt und gar nicht noetig.
 
Zuletzt bearbeitet von einem Moderator:
Der Aufruf ist so falsch. j nimmt ja nicht die Werte der Indezes an, sondern die Werte im Array.
D.h. wenn schon, dann muesste es so lauten: j = new Random().nextInt(100);
Das funzt aber auch nicht, weil Java bei primitiven Datentypen nicht referenziert, sondern kopiert.

Ich empfehle eine konventionelle for-Schleife:

PHP:
for(int k = 0; k < i.length; k++)
{
i[k]=rand.nextInt(100);
}

PS: Und nimm doch trotzdem lieber nur ein Random Element, spart speicher und der Garbage Collecter hat weniger zu tun.

Sehr richtig!
Vielen Dank für die Hilfe, so ein peinlicher Fehler, ich sollte wohl doch öfter die alte for Schleife nehmen.

Danke nochmal, dass du das für mich durchgeackert hast :D

Und wegen dem Random Element, bei solch großen Zahlen macht das wohl Sinn!
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben Unten