PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programmieren


nazgul666-rr
11.05.2008, 15:27
Anscheinend haben wir noch nichts über Programmieren hier also beginne ich dazu mal einen allgemeinen Thread

so ich hab gestern bis ca. 3 Uhr Programmiert und hab einfach Probleme was in 2 Einträge von einer GUI zu schreiben

ich benutze:
* Visual Studio 2008 Professional (MSDNAA - unsere Schule ist Akademischer Partner - also legal)
* C#
* .Net 3.5
* Lizenz: GNU/GPL v3

so ich habe eine StatusBar mit einem Label und eine MultiLine Text Box

das Projekt ist ein eine Umsetzung von dem Unix Programm Ding: Dictonary Lookup für Windows mit .Net - also ein Offline Wörterbuch. Das Konsole-Projekt läuft auch ohne ärger (bis auf die Formatierung der Ausgabe)

ich würde das gern hier verlinken, aber gepackt sind das fast 11MB
ich kopiere einfach was aus dem wichtigsten Quellcode


public List<string> de_en = new List<string>();

public Form1()
{
//const String TRENNER = "::";
StreamReader sr = new StreamReader("de-en.txt");
//Einlesen der Datensätze in die Liste
for (int i = 0; !sr.EndOfStream; i++)
{
string Teilstring = sr.ReadLine();
if (Teilstring[0] != '#') //nur wenn 1. Zeichen == # nicht speichern
{
this.de_en.Add(Teilstring);
}
}
sr.Close();//StreamReader schliessen
//de_en.Sort();
//Alle Datensätze in die Ausgabe schreiben
for (int i = 0; i < de_en.Count; i++)
{
Ausgabe.AppendText(de_en[i]); // Absturz HIER kommt die Fehlermeldung zum Absturz
}
//this.Ausgabe.AppendText(this.de_en[0]);// Absturz
//Anzahl der Datensätze in die Statusbar schreiben
Datensaetze.Text = de_en.Count.ToString();// Absturz
//Datensaetze.Text = "10000"; //Absturz
InitializeComponent();
}


Vll weis jemand was ich hier Falsch mache?

Fehlermeldung:

System.NullReferenceException was unhandled
Message="Object reference not set to an instance of an object."
Source="Ding"
StackTrace:
at DingGUI.Net.Form1..ctor() in f:\Visual Studio 2008\Projects\DingDOS.Net\DingGUI.Net\Form1.cs:lin e 42
at DingGUI.Net.Program.Main() in f:\Visual Studio 2008\Projects\DingDOS.Net\DingGUI.Net\Program.cs:l ine 25
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.Run UsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context( Object state)
at System.Threading.ExecutionContext.Run(ExecutionCon text executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:


Der Datenbestand des Wörterbuchs:
ftp://ftp.tu-chemnitz.de/pub/Local/urz/ding/de-en/de-en.txt
meiner hat gut 140000 Datensätze

Faern
11.05.2008, 20:26
Da es ein NullPointer ist, gibts ja eigentlich nur 2 Möglichkeiten:
Entweder Ausgabe existiert nicht/ist nicht initialisiert oder de_en[i] gibt es nicht.
Ich hab zwar keine Ahnung von C# aber meine Java-Kenntnisse sagen mir, dass es eher de_en.get(i) heißen müsste, um ein Element aus der Liste zu extrahieren. Und bist du sicher, dass du die ganze Datei einlesen willst? Ist ziemliche Speicherverschwendung die ganze Datei im RAM zu halten.

Ich frag mich allerdings warum du das hier postest und nicht in einem C#-Forum. Hier wirst du wohl nicht allzu viele mit entsprechenden Kenntnissen finden. ;)

nazgul666-rr
11.05.2008, 20:36
danke schonmal für den Tipp

de_en gibt es - deklarier und initialisier ich in der ersten Zeile und beim Debuggen sagt er mir, dass ich gut 140000 Elemente eingelesen habe

Ausgabe gibt es auch - ist nur in des Design Datei - bietet er mir aber direkt über das Kontextmenü an mit den Möglichen Methoden, Variablen, Namespaces, Klassen, etc

das mit dem .get (i) kann ich nochmal testen - allerdings haben wir letztes Schuljahr im Konsolenprogramm so auf Listenelemente drauf zugegriffen

//Edit: .get(i) kennt der bei der Liste anscheind nicht - und ich bin die Liste durchgegangen - auch nichts was annähernd passen könnte - in dem Konsolen Programm funktioniert es auch so mit Console.WriteLine(de_en[i]);

---
nun zu dem Forum - ich weiß das es hier ein paar Programmierer gibt und ich bin in keinem C# Coder Forum
außerdem soll dieser Thread auch allgemein dann übers Programmieren sein - hab ich mir jedenfalls so vorgestellt

Faern
11.05.2008, 20:50
Ok, dann ist die C#-Syntax da wohl leicht anders.

Vielleicht hat dein Problem auch was mit der Lokalität zu tun, denn in der ersten for-Schleife greifst du ja per this auf die Liste zu.

nazgul666-rr
11.05.2008, 21:35
das mit der lokalität war nur ein Test mit dem this. es geht auch ohne

er mag ja auch nicht das Ausgabe.AppendText("1000");
und mit Ausgabe.Text("Ergebnis");
selber Fehler und kein Zugriff auf die Liste

VS splittet die Klasse zwischen Design und Funktionen innerhalb der benutzten Objekte


das Ausgabe nicht Existiert war ein genialer Tipp - hab durch Zufall mir den anderen Teil der Class Datei angeguckt und in InitalizeComponents() wird alles Deklariert und Initialisiert - da ich erst darein schreiben wollte und dann erst InitializeComponents() aufgerufen habe....

danke^^
====
Allgemein Programmieren ab hier *g*

Teylen
11.05.2008, 21:39
Ok... mit C# habe ich mich noch nicht beschäftigt, weil einfach nicht der Bedarf dafür da war.

... aber irgendwie sieht's für mich auf dem ersten Blick so aus als sei Ausgabe nicht initialisiert. Was ist denn das? Ein String-Objekt wie in Java?

Fehlt vielleicht irgendwo sowas wie
Ausgabe = new String();
?

Schreib doch mal in der Zeile davor sowas ähnliches wie
if (Ausgabe == null) log.debug("bullshit!");
(bzw. irgendeine andere derartige Debug-Ausgabe).



(edit)

Ok... scheinst du wohl schon gelöst zu haben?

nazgul666-rr
11.05.2008, 21:50
das mit Ausgabe = new String(); steht so ähnlich in der "Design" Datei unter InitializeConponents();


//wird von VS selber angelegt
this.Ausgabe = new System.Windows.Forms.TextBox();

und ich hab mein Code nur davor angelegt anstatt danach.... - vll Schusseligkeit :D


jetzt muss ich noch gucken mit Performance - oder die TextBox erstmal leer lassen und nur das Suchergebnis da rein schreiben