Laden...

Fehler bei Zugriff auf Array

Erstellt von funky_mo vor 19 Jahren Letzter Beitrag vor 19 Jahren 2.776 Views
F
funky_mo Themenstarter:in
12 Beiträge seit 2004
vor 19 Jahren
Fehler bei Zugriff auf Array

Hallo zusammen,

folgendes Problem treibt mich grad fast zum Wahnsinn:

Ich habe folgendes Modul geschrieben in welchem ich auf Elemente im übergenenen Array (roles) zugreife:


public int CheckPermission(string function, string module, string[] roles, int rcount)
    {
      NameValueCollection app = ConfigurationSettings.AppSettings;
      bool grant = false;
      string SQLtemp = "";

      for(int a=0; a<=rcount; a++)
      {
	if(roles[rcount].Substring(0, module.Length) == module)
	{
	  SQLtemp += roles[rcount] + ",";
	}
      }
.
.
.
 

Bei der if-Abfrage bekomme ich jedoch den Fehler
System.NullReferenceException: Object reference not set to an instance of an object.

Die Variable rcount ist ganz sicher gefüllt. Sobald ich

if(roles[0].Substring(0, module.Length) == module) 

schreibe funktioniert es, ich möchte jedoch über die Variable rcount auf den Array zugreifen. Hat jemand eine Idee woran es liegen könnte?

502 Beiträge seit 2004
vor 19 Jahren

Rein aus dem Bauch raus würd ich sagen, es liegt dran dass irgendein roles[x] null ist...

Bart Simpson

Praxis ist wenn alles funktioniert und keiner weiss warum.
Theorie ist wenn man alles weiss, aber nichts funktioniert.

Bei uns wird Theorie und Praxis vereint: Nichts funktioniert und keiner weiss warum...

X
2.051 Beiträge seit 2004
vor 19 Jahren
  1. was ist den rcount??

  2. und warum machst du
    if(roles[rcount].Substring(0, module.Length) == module)
    und nicht
    if(roles[a].Substring(0, module.Length) == module)
    ??

  3. und warum **a≤rcount **??
    in c# ist alles 0-basiert und es ist dann normalleweise so
    a < rcount
    aber da sind wir schon wieder bei frage 1

4.506 Beiträge seit 2004
vor 19 Jahren

Hallo!

Hier setzt ein großes Problem an, welches auch schon in dem Thema Programmieridee (auch in diesem Forum, auch allg. Fragen) so breit diskutiert wird.

Ein Array kann nicht so ohne weiteres per Parameter übergeben werden (zumindest in C#).

Es gibt drei Möglichkeiten:

  1. Das Array übergeordnet Deklarieren und instanziieren. (z.B. in dieser Klasse als private static neben den ganzen Methoden, die alle gleichermassen darauf zugreifen können)

  2. Übergabe bei reference (schau in das Thema Programmieridee um dir davon ein Bild zu machen, hier gibt es zweigeteilte Meinungen). Damit übergibst du ein Objekt "mit seinem Zeiger" (mundartlich ausgedrückt).

  3. Bei Array´s in einer Parameterübergabe gibt es das Schlüsselwort params
    z.B:


public int Sum(string name, params int[] numbers)
{
...
}

Bei 3.) muss man beachten, dass params nur als letzter Parameter übergeben werden darf, und nur einmal, also keine 2 Arrays!

Hoffe das hilft dir weiter...

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

X
2.051 Beiträge seit 2004
vor 19 Jahren

Was erzählst du schon wieder??? 8o


using System;

namespace ConsoleApplication1
{
	/// <summary>
	/// Zusammenfassung für Class1.
	/// </summary>
	class Class1
	{
		/// <summary>
		/// Der Haupteinstiegspunkt für die Anwendung.
		/// </summary>
		[STAThread]
		static void Main(string[] args)
		{
			int []iar = new int[]{1, 2, 3, 4, 5};
			c.printarr(iar);

			Console.ReadLine();
		}

		public void printarr(int[] ar)
		{
			foreach(int i in ar)
			{
				Console.WriteLine(i.ToString());
			}
		}
	}
}

G
36 Beiträge seit 2004
vor 19 Jahren

params benutzt man, wenn man nicht festlegen will, wieviele Parameter übergeben werden sollen. Auch den Rest von noman_timo würde ich mit Vorsicht geniessen.

Gruß
Jürgen

4.506 Beiträge seit 2004
vor 19 Jahren

Also ich glaub ich bin jetzt beleidigt!

@GhoBu:
Was ist das denn: unbestimmte Anzahl von integer als Übergabeparameter?

Das ist doch ein Array, oder? Übrigens spricht man das auch so an:
numbers[x] (siehe mein Bsp. oben).

@Xqgene:
Und wie funktioniert das mit dem Array, wenn es kein Int ist? Wenn das Ganze nämlich Objekte sind? Die Fehlermeldung:

System.NullReferenceException: Object reference not set to an instance of an object.

Sagt hier deutlich, dass das Objekt was man ansprechen will (hier Array[x]) nicht instanziiert ist! Deine Int werden hier ByValue übergeben, und werden automatisch instanziiert! Andere allg. Objekte werden nicht instanziiert.

Also funky_mo, laß dich nicht von unserem kleinen Privatkrieg verwirren, hier sollte man mal überlegen, ob und wann man sachlich bleiben soll, und konstruktiv Dir weiterzuhelfen.

Hoffe dass ich dir helfen kann / konnte.

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

F
funky_mo Themenstarter:in
12 Beiträge seit 2004
vor 19 Jahren

Esrtmal danke an alle, ich freu mich über den regen Zuspruch ....

Ertmal hatte ich nen Schreibfehler drin, und andererseits macht es keinen Unterschied ob ich den Array übergeb oder ihn woanders als öffentlich deklariere und direkt auf ihn zugreifen kann,


// roles ist public
// rcount ist public


public int CheckPermission(string function, string module)
    {
      NameValueCollection app = ConfigurationSettings.AppSettings;

      for(int a=0; a<rcount; a++)
      {
	if(roles[a].Substring(0, module.Length) == module)
	{
	  SQLtemp += roles[a] + ",";
	}
      }
.....
.....
.....

In roles sind in dem Fall 6 Elemente, rcount hat den Wert 6.

Jedoch gibt es immer wieder den selben Fehler ...

X
2.051 Beiträge seit 2004
vor 19 Jahren

Original von norman_timo
@Xqgene:
Und wie funktioniert das mit dem Array, wenn es kein Int ist? Wenn das Ganze nämlich Objekte sind?

na genau so


using System;

namespace ConsoleApplication1
{
	/// <summary>
	/// Zusammenfassung für Class1.
	/// </summary>
	class Class1
	{
		/// <summary>
		/// Der Haupteinstiegspunkt für die Anwendung.
		/// </summary>
		[STAThread]
		static void Main(string[] args)
		{
			test []cl = {new test("Text1"), new test("Text2")};
			c.printarr2(cl);

			Console.ReadLine();
		}

		public void printarr2(test[] ar)
		{
			foreach(test t_ in ar)
			{
				Console.WriteLine(t_.text);
			}
		}
	}

	class test
	{
		public string text;
		public test(string t)
		{
			text = t;
		}
	}
}

@funky_mo
bist du sicher, dass es nicht an module-string liegt? ist er vielleicht null?

oder mach noch eine abfrage zum Testen vor deiner if

if(roles[a] == null)
  MessageBox.Show("Element: " + a.ToString() + " ist null");

[EDIT]
ach noch was: du muss die anzahl der Elemente im array nicht extra merken in rcount.

das kannst du einfach auch mit roles.Length ermitteln. ist vor allem auch wegen Indexüberlauf sicherer.
[/EDIT]

F
funky_mo Themenstarter:in
12 Beiträge seit 2004
vor 19 Jahren

Danke für die Antwort, ich sehe gerade dass ich ein Problem mit der Variable rcount habe, der Wert ist höher als Elemente im Array sind, vielleicht liegt es daran.

Eine andere Frage: Wie kann ich denn Arrays dynamisch deklarieren? Also z.Bsp. mit 0 Werten initialisiert und immer wenn ein Wert hizugefügt werden soll erhöht sich der Wert?

Momentan mache ich das relativ "unelegant" 8):

string[] myArray = new string[50]

Deswegen kann ich momentan die Methode Length() nicht verwenden da dann immer 50 rauskommt ...

X
2.051 Beiträge seit 2004
vor 19 Jahren

nimm mal ArrayList-Klasse

G
36 Beiträge seit 2004
vor 19 Jahren

Original von norman_timo
Also ich glaub ich bin jetzt beleidigt!

@GhoBu:
Was ist das denn: unbestimmte Anzahl von integer als Übergabeparameter?

Das ist doch ein Array, oder? Übrigens spricht man das auch so an:
numbers[x] (siehe mein Bsp. oben).

Es gibt keinen Grund beleidigt zu sein! Ich führe auch keinen Privatkrieg...

Es war nur in dem Zusammenhang völlig falsch! Wenn Du ein int[] übergeben willst, dann geht das so:


public void DoSomething(int[] intarray){
	...
}
public void CallOtherMethod(){
	int[] ar = { 1 ,2 ,3 ,4 ,5 };
	DoSomething(ar);
}

Wenn Du eine Methode deklarierst, die eine unbestimmte Anzahl von ints bekommt, geht das so:


public void DoSomething(params int[] intarray){
	...
}
public void CallOtherMethod(){
	DoSomething(1,2,3,4,5);
	DoSomething(1,2);
	...
}

Vielleicht verstehst Du jetzt, was ich meine: eine variable Parameterliste!

Gruß
Jürgen

F
funky_mo Themenstarter:in
12 Beiträge seit 2004
vor 19 Jahren

😁 @Xqgene: Vielen Dank für den Tipp mit der ArrayList, wußte gar nicht dass es so etwas gibt ...

Hab jetzt alles umgebaut und nun funktioniert es tadellos!!

Vielen Dank nochmal an euch alle, you made my day 🙂!