Laden...
Avatar #avatar-2328.jpg
Cookiie myCSharp.de - Member
Student früher Leipzig, jetzt Out of Rosenheim Dabei seit 27.06.2007 363 Beiträge
Benutzerbeschreibung

Forenbeiträge von Cookiie Ingesamt 363 Beiträge

18.07.2007 - 09:09 Uhr

Hi,

also unser Gildenmeister hat die Gilden-HP jetzt auch erneuert und nutzt für die Charakterdarstellung die Daten die das Arsenal von Blizz bietet. Dazu speichert er die Daten lokal und aktuallisiert sie täglich. So sieht das beispielsweise im Arsenal aus, falls du dir das noch nicht angesehen hast.
Wenn du natürlich detailiertere Daten willst, musste dir das wohl wirklich selber schreiben. Ist jetzt halt so ne Sache, muss ich wirklich wissen wieviele Verbände der Char in seinen Taschen hat usw. Aber das ist ne Sache die du entscheiden musst.

Gruß Curatio

18.07.2007 - 08:36 Uhr

Hi,

also eine normale Verbindung wird mit Close() geschlossen. Man müsste sich jetzt mal ein bißchen mehr Quellcode ansehen bzw. müsstest du genauer beschreiben was "nicht so recht hinhaut".

Gruß Cookiie

17.07.2007 - 13:31 Uhr

Bei TextBox reichen die 2 Zeilen Code und er scrollt bei Aufruf immer runter. Sollte man das öfters haben empfiehlt es sich das TextChanged_Event zu abonnieren und dann die 2 Zeilen in ne Funktion zu schreiben.


this.tbDebug.SelectionStart = tbDebug.TextLength;
this.tbDebug.ScrollToCaret();

Gruß Cookiie

17.07.2007 - 13:12 Uhr

Was ich dir noch empfehlen kann. Such dir doch den von Telo das Addon Lootlink raus.
Im Quellcode müßte ja enthalten sein wie die Struktur der itemcache.wdb ist.
Ansonsten wäre es interessant wozu du das machst, da es ja eigentlich genug Schnittstellen zur WoWApi gibt und LUA da der einfachere Weg ist.

Gruß Cookiie

17.07.2007 - 08:11 Uhr

HI, falls du immer noch nicht weiterkommst, schau mal hier meine Lösung an. Stand vor kurzem vor dem gleichen Problem. Eigene Events

Gruß Cookiie

16.07.2007 - 10:09 Uhr

Hi,

ich habe folgendes Problem. Bei meiner Client-Server-Anwendung lasse ich jeden Client von einem eigenen Thread abhandeln. Im Moment empfange ich nur kurze Strings und schicke eine ebenso kurze Antwort zurück. Trotzdem steigt meine Systemlast mit zunehmender Anzahl aktiver Clients sehr schnell an. Bei 50 parallelen Clients habe ich schon 80% Last. Ich finde das doch recht viel zumal mein Server eigentlich nicht viel macht. Ich weiß aber im Moment nicht so recht wie ich das drücken kann. Ich vermute mal das meine Implementierung des Threadsaufruf der Hauptgrund ist, deswegen bitte ich um Hilfe.
Hier der Code


using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;
using System.Collections;
using System.Threading;

namespace ServerKlein
{
	public delegate void StatusHandler(StatusEventArgs e);
	/// <summary>
	/// Zusammenfassung für Serverkl.
	/// </summary>
	public class Serverkl
	{
		//event für status
		public event StatusHandler StatusEvent;
		//private Thread newConn;

		private int _iServerListenPort;	//Port an dem der Server lauscht
		private int _iSleepTime = 0; // Zeit die der Server wartet bis er eine neue Verbindung annimmt

		private TcpListener listener = null;	//aktiver "Server"
		private TcpClient cl = null;	//verbundener Client

		private Verbindung ver;
		
		public Serverkl()
		{
			_iServerListenPort = 4747;
		}

		public Serverkl(int p)
		{
			_iServerListenPort = p;
		}

		public void starteServer()
		{
			listener = new TcpListener(IPAddress.Any, _iServerListenPort);
			listener.Start();
			StatusEvent(new StatusEventArgs(1));
			while(true)
			{
				Thread.Sleep(_iSleepTime);
				cl = listener.AcceptTcpClient();
				StatusEvent(new StatusEventArgs(2));
				ver = new Verbindung(cl);
				ver.StatusEvent +=new StatusHandler(this.ver_StatusEvent);
				//ver.verbinde();
				new Thread(new ThreadStart(ver.verbinde)).Start();
								
			}//ende while
			//cl.Close();
			//WSACancelBlockingCall
		}

		public void stoppeServer()
		{
			//netStream.Close();
			cl.Close();
			listener.Stop();
			StatusEvent(new StatusEventArgs(0));
		}

		//leitet Event weiter
		private void ver_StatusEvent(StatusEventArgs e)
		{
			StatusEvent(e);
		}
	}
	
	/// <summary>
	/// Klasse verwaltet TcpClient-Kommunikation
	/// </summary>
	public class Verbindung
	{
		public event StatusHandler StatusEvent;

		private NetworkStream netStream = null;

		private string empfangenerTxt = null;
		private Byte[] empfang = null;
		private int empfangSize;
		private TcpClient c = null;

		public Verbindung(TcpClient c)
		{
			this.c = c;
		}

		public void verbinde()
		{
			this.netStream = c.GetStream();
			try
			{
				//Byte-Buffer für empfang
				this.empfang = new Byte[c.ReceiveBufferSize];
				if((this.empfangSize = netStream.Read(this.empfang, 0, (int) c.ReceiveBufferSize)) > 0)
				{
					this.empfangenerTxt = Encoding.UTF8.GetString(this.empfang, 0, this.empfangSize);
					StatusEvent(new StatusEventArgs(3));
				}
			}
			catch (IOException)
			{
				StatusEvent(new StatusEventArgs(4));
				this.empfangenerTxt = null;
			}
			//antwort senden und stream + client schließen
			sendeAntwort(holeDatensatz(this.empfangenerTxt), this.netStream); 
			this.netStream.Close();
			this.c.Close();
		}

		//funktion holt sich datensatz vom zentralen Server
		private string holeDatensatz(string txt)
		{
			string ok = "ok";
			if (txt == null)
				return null;
			else
				return ok;
		}

		//sendet die Antwort an den Client
		private void sendeAntwort(string antwort, NetworkStream net)
		{
			try
			{
				Byte[] antwortArr = Encoding.UTF8.GetBytes(antwort);
				net.Write(antwortArr, 0, antwortArr.Length);
				StatusEvent(new StatusEventArgs(5));	
			}
			catch (Exception)
			{
				StatusEvent(new StatusEventArgs(6));
			}
		}
	}

	public class StatusEventArgs:EventArgs
	{
		private int status;

		public StatusEventArgs(int i)
		{
			status = i;
		}

		public int Status
		{
			get { return status; }
			set { status = value; }
		}
	}
}

Dazu sei noch gesagt, dass ich diese Klasse durch eine GUI aufrufe, ebenfalls als Thread. Das funktioniert aber ganz prima, die Events sind auch recht harmlos, wenn ich diese abschalte ergibt sich auch nur eine minimale Änderung.
Hoffe ihr könnt helfen.

Gruß Cookiie

16.07.2007 - 09:44 Uhr

naja, idee war das du das Key-PressEvent abfängst und dann alles einheitlich (intern) groß oder klein machst und dann an das autocomplete weiterleitest. Sorry wenn das etwas missverständlich war.

11.07.2007 - 08:56 Uhr

Ehrlich gesagt habe ich den Vorteil von TcpListener.pending noch nicht entdecken können. Momentan ist es es so das ich von meiner GUI aus einen neuen Thread starte, der dann AcceptTcpClient() aufruft.
Der Thread macht ja nichts anderes als zu warten und macht erst dann weiter, wenn ein Client sich verbindet. Wenn ich nun Pending aurufe, welches ich ja in einer Schleife immer wieder abfragen müsste, dann erzeuge ich doch unnötig CPU-Last.
Habe es jetzt sogar recht simple geschafft meinen Server multiclientfähig zu machen, nach AcceptClient rufe ich einfach eine neue Klasse auf (der ich dann das aktuelle TcpClient-Object übergebe), die sich dann um die eigentliche Kommunikation kümmert.
Deswegen ja meine eigentliche Frage oben. Klappt auch alles prima, bis auf den Event-aufruf aus der neuen Klasse heraus, da passt ihm was ned.

Gruß Cookiie

10.07.2007 - 14:43 Uhr

Der Fehler kommt ja zustande, weil dein Client denkt die Verbindung steht noch und versucht über diese erneut Daten zu lesen, was natürlich schiefgeht.
Also musst du entweder die Exception abfangen und dann die Verbindung erneut aufbauen und den Server abfragen oder du machst den Client so intelligent, das er selber merkt das die Verbindung weg ist und dann den Nutzer darüber informiert. Kannst das Ganze dann ja mit nem Abfrage-Dialog verbinden.

Und Exceptions sind in dem Sinne keine Fehler, sondern Ausnahmefälle die verarbeitet werden können, aber nicht immer müssen. .net sagt dir damit eigentlich nur das etwas nicht zu 100% geklappt hat. Je nach Exception und Programmcode ist entweder scheißegal oder essentiell für das weitere Vorgehen. Das liegt aber bei dir.

Gruß Cookiie

10.07.2007 - 14:31 Uhr

Wenn ich ein Objekt cl = TcpListener.AcceptClient(); habe und dieses an eine Klasse weiter gebe und dann cl = TcpListener.AcceptClient(); erneut aufrufe (ohne cl.close() vorher), habe ich doch 2 getrennte Objekte die ich auch separat verwalten kann oder nicht?

10.07.2007 - 09:30 Uhr

/uNNNN ist Unicode-Darstellung, kannst du also einfach umwandeln.
Ich glaube aber du benötigst dafür noch unter Windows das richtige Sprachpaket, also du mußt die Kyrillischen Buchstaben als Font ins System eintragen.

10.07.2007 - 09:25 Uhr

Am besten, testen. Sag ich da immer.
Aber um es mal vorweg zunehmen, wenn du nicht schon Objekte(Label) hast, mit denen du dein Array füllen willst, musst du sie selbstverständlich erst erzeugen und das kannst du natürlich gleich beim füllen machen.
Dein Code unten sollte einwandfrei funktionieren.
Und das nächste mal nicht so faul, ich glaub das testen deines Codes ist schneller als das schreiben dieses Posts.

Gruß Cookiie

10.07.2007 - 08:43 Uhr

Wenn es das ist was ich denke, dann willst du verhindern das bei Drücken von Enter ein Aktion ausgelöst wird. Also ein Button oder ähnliches reagiert. Dann mußt du eigentlich nur das entsprechende KeyEvent abfangen.

Gruß Cookiie

10.07.2007 - 08:40 Uhr

Einfach mal Mr.Google fragen, aber Frau Wikipedia weiß das sicher auch.
Stichwort Unicode.

Gruß Cookiie

09.07.2007 - 15:23 Uhr

hm, warum nicht einfach string[] ID ? char[] ID würde auch gehen, zahlen und buchstaben sind ja chars.
Readline liefert ja eh strings, sehe da nicht wirlich das problem und Ausgabe mit Console.Write(ID[0] + " " + ID[1]);

zu 2tens, ich weiß es jetzt nicht zu 100% aber ich meine das strg +v in der konsole nicht geht (zumindest nicht bei mir)

09.07.2007 - 15:02 Uhr

hm, da fällt mir spontan string.toUpper() bzw. string.toLower() ein, rest überlass ich dir

09.07.2007 - 14:33 Uhr

lol ok, nimm mir das jetzt ned übel, guggst du hier Noob-Bibel.
Damit sollte dir schon grundlegendes klarer werden.

Gruß Cookiie

09.07.2007 - 14:30 Uhr

ok mein Fehler.
getProcessesByName liefert eine Array zurück.

wenn du also Process[] formpro2 definierst und dann


formpro2 = Process.GetProcessesByName(@"D:\Lisener.exe");
formpro[formpro2.length-1].CloseMainWindow(); //damit schließt du immer nur eine Instanz

09.07.2007 - 14:27 Uhr

Wie? knapp 150mal mehr Postings und nicht schlauer als ich? Das lässt ja hoffen^^.

09.07.2007 - 14:21 Uhr

Also so richtig weiß ich nicht was du willst.
Aber wenn du Code wiederverwenden willst, dann schreib dir passende Methoden die du dann aufrufst, wenn du sie brauchst.

Gruß Cookiie

09.07.2007 - 14:19 Uhr

Original von Cookiie
Probier mal

formpro = Process.GetProcessesByName(@"D:\Lisener.exe");
formpro.CloseMainWindow();

Gruß Cookiie

Meine Antwort, 2 Posts drüber.

09.07.2007 - 11:08 Uhr

Probier mal

formpro = Process.GetProcessesByName(@"D:\Lisener.exe");
formpro.CloseMainWindow();

bzw. solltest du die Neuzuweisung im else-teil weglassen, formpro hat ja schon beim start den Prozess zugewiesen, wenn du jetzt neu zuweisst, ist das ein neuer Prozess der mit dem laufenden nichts zu tun hat, also ein einfaches formpro.Kill() oder formpro.CloseMainWindow() sollte sogar genügen.

Gruß Cookiie

09.07.2007 - 10:49 Uhr

Hm, wenn der Server neustartet ist der Stream doch eh pfutsch und er hat keinen Zugriff auf diese Daten, auf der anderen Seite solltest du den Client auch so proggen das er mit senden aufhört, wenn der Netstream off ist. bzw. macht der das eigentlich automatisch.
Ich hab das bei mir so


//sendet Antwort
private void sendeAntwort(string antwort)
{
	Byte[] antwortArr = Encoding.UTF8.GetBytes(antwort);
	try
	{
		netStream.Write(antwortArr, 0, antwortArr.Length);
		StatusEvent(listener, new StatusEventArgs("Antwort gesendet."));
		
	}
	catch (IOException)
	{
		StatusEvent(listener, new StatusEventArgs("Antwort konnte nicht gesendet werden."));
	}
}

Damit hört der Client auf mit senden wenn der Server off ist. Bei einem Neustart des Servers, wird ein neuer Listener gestartet und ein neuer Stream geöffnet. Das heißt der Server bekommt keine alten Daten.

Dispose brauchst eigentlich nur beim Objekte Aufräumen, wenn den Server eh neustartest, sind die sowieso alle weg.

Gruß Cookiie

09.07.2007 - 10:37 Uhr

Also nur zum Verständnis, du hast 2 Programme, beide von dir? und du willst das eine durch das andere beenden?
Befinden sich beide immer auf dem selben Rechner?
Kill finde ich da sowieso eine ziemlich harte Methode, besser ist da CloseMainWindow(), damit gibts du der anderen Anwendung genug Zeit sämtliche anderen Prozesse die zu ihr gehören sauber zu beenden.
Auf der anderen Seite, warum schreibst du dein Programm nicht so das es sich nach dem schließen der Netzverbindung selber beendet? Das wäre in meinen Augen der sauberste Weg.

Gruß Cookiie

09.07.2007 - 09:07 Uhr

So beim Ersten überfliegen. Ich seh da keine Schleife die den Code erneut durchläuft. Wenn du die Verbindung trennst, muss der Server AcceptTcpClient() erneut aufrufen, sonst klappt da nichts.
Und mit deiner Wartezeit ist auch sehr schlecht, lass die Antwort mal länger als 100ms dauern, was machst du dann?
Da du Netstream verwendest, frag doch in der ner While-schleife Netstream.DataAvailable() ab, das liefet true wenn neue Daten im Stream sind.

Gruß Cookiie

09.07.2007 - 08:53 Uhr

Wenn du dein Programm frisch startest hast du ja alles neue Objekte vorliegen. Das heißt da steht auch nichts drin.
Wenn du verhindern willst das jemand auf die Daten zugreift, musst du das während der Laufzeit machen. Wenn du beim Buffer dispose() aufrufst und dann den Stream, als auch den Socket sauber beendest, sollte alles gelöscht sein. Zumal die Objekte sowieso in nem sicheren Speicherbereich liegen.

Gruß Cookiie

09.07.2007 - 08:22 Uhr

hm, probier mal
while (5 < elapsedTime ≤ 10),

wobei ich das grundlegende Herangehen eventuell ändern würde, im Moment zeichnest du das Bild jede Sekunde neu. Muss das sein? Ansonsten würde ich das Ganze mit nem Timer bewerkstelligen und dann das neue Bild erst zeichnen.

Gruß Cookiie

06.07.2007 - 12:47 Uhr

Habs jetzt hinbekommen, auf jeden Fall läufts jetzt, keine Ahnung ob das nun sauber ist.

So sieht das jetzt bei mir aus
Schritt 1: Eigene Klasse definieren


public class StatusEventArgs:EventArgs
{
	public StatusEventArgs(string s)
	{
		message = s;
	}
	private string message;
	public string Message
	{
		get { return message; }
		set { message = value; }
	}
}

Schritt 2: Delegaten im Namespace definieren

public delegate void StatusHandler(object sender, StatusEventArgs e);

Schritt 3: event in der Klasse deklarieren


public class Serverkl
{
  public event StatusHandler StatusEvent;
}

Schritt 4: Auslösen des Events in der Klasse
z.B.:


cl = listener.AcceptTcpClient();
StatusEvent(listener, new StatusEventArgs("Neuer Client verbunden."));

Schritt 5: Event in der GUI abonieren


server = new Serverkl();
server.StatusEvent += new StatusHandler(this.statusChanged);

... und behandeln


private void statusChanged(object sender, StatusEventArgs e)
{
	schreibeStatus(e.Message);
}

public void schreibeStatus(string tmp)
{
	this.lbDebugInfo.Text += "\n" + tmp;
}

Es funktioniert, zu 100% weiß ich zwar auch nicht warum, aber das ist mir im Moment egal 🙂.
Wichtig ist nur das man durch das Event auch auf elegante Art und Weise das Ändern der Controls auch aus einem anderen Thread als dem GUI-Thread machen kann, weil das Ganze weiterdelegiert wird (ha, doch was gelernt). ^^

So viel Spaß beim probieren. Ich hoffe das hilft jetzt ein paar Leuten die genauso Probleme damit haben/hatten.

Gruß Cookiie

06.07.2007 - 09:56 Uhr

Moin,

also irgendwie komme ich mit den Beispielen aus der FAQ ned klar. Steh völlig auf dem Schlauch und sehe mich im Moment nicht in der Lage die Beispiele dort auf meine Bedürfnisse zu konvertieren.
Nochmal zusammenfassend was ich machen will.
Ich habe eine Form und eine Klasse, die ich aus der Form aufrufe(instanziere).
Diese Klasse nun soll ein Event abfeuern, welches die Form registriert und entsprechend reagiert.

In der GUI habe ich folgende Methoder


public void schreibeStatus(string tmp)
{
  this.lbDebugInfo.Text += "\n" + tmp;
}

in der Klasse habe ich jetzt mal

		public delegate void StatusEventHandler(object sender, string statusText);
		public event StatusEventHandler status;

definiert.
Ich will im Prinzip, wenn irgendwas in meiner Klasse passiert, ich mein event aufrufe, welches dann einen text (den ich jedesmal individuell festlege) an die Form schicke.

Brauche ich für meine eigenes Event ne separate Klasse, geht das als Methode? Muss ich von EventArgs erben?

Im Moment fehlt mir einfach der Überblick.

06.07.2007 - 09:34 Uhr

Hm, also wenn du das selber schreiben willst wird das schwer bis unmöglich.
Besser ist es da die Arbeit von Etheral machen zu lassen, das Ganze in eine log-datei zu schreiben und diese dann mit deinem Programm auszulesen.

06.07.2007 - 09:31 Uhr

Original von B A L U
Hi,

fast richtig. Genau der umgekehrte weg 🙂

Also, unsere Kunden sollen mit dem Programm Daten zu uns schicken können, welche wir dann weiter bearbeiten.

Nur, mein Chef ist halt der Meinung, das Programm sollte nicht an einer Firewall scheitern. Und dann bin ich spontan halt auf Port 80 gekommen.

Bin aber für weitere Ideen zu haben ggg

Wünsche euch noch einen schönen Abend.

B A L U

Ist im Prinzip egal, solange der Verbindungswunsch vom Kunden kommt. Wenn die Verbindung steht, können die Daten ja fließen wie sie wollen.
Also ist nur wichtig das die Kunden irgendwie nach draußen kommen und Port 80 ist da ne recht gute Wahl.

Gruß Cookiie

06.07.2007 - 09:21 Uhr

Stimmt, aber hey, warum einfach wenns auch umständlich geht^^.

06.07.2007 - 08:31 Uhr

Im Moment liefert deine Methode immer true zurück. Bei jedem neuen Aufruf, fängt der Zähler ja bei 0 an und demzufolge ist er immer kleiner als deine Array.length.
Was bei dir fehlt ist noch eine Prüfung auf den Inhalt des Arrays an dem entsprechenden Indexplatz.


if (cd[i] == null)
   return true;
else
   return false;

bzw.


int i = 0
while (cd[i] != null && i < cd.length)
{
  i++;
}
if (i == cd.length)
 return false;
else
  return true;

Ich denke mal so was das gemeint.
Gruß Cookiie

05.07.2007 - 14:41 Uhr

grmpf, wieso findet die suche den ned? ich vermute aber ein typisches Wald-Baum-problem meinerseits
aber danke, ich meld mich in kürze mit weiteren problemen ^^.

05.07.2007 - 14:37 Uhr

Sorry wenn ich da jetzt so blöd frage, aber ich hab keine Ahnung wie ich das machen soll.

server-klasse


meinEvent()
{
   was schreib ich hier rein?
}

und wie hänge ich das dann an die richtigen stellen? reicht dann ein einfacher aufruf wie bei ner methode?
und in der gui dann


private void meinEvent (object sender, System.EventArgs e)
{
   Label.text = "neuer Client da";
}

geht das so?

05.07.2007 - 13:43 Uhr

Ja, bei mir ist es so, dass ich über ne GUI nen Server starte. Die Server-Klasse mit listener, stream usw ist in ner extra-klasse, weil ich das gerne getrennt habe. Aber ich hätte auch gerne Statusmeldungen vom Server in der GUI angezeigt, deswegen wäre das nett gewesen. Weil mit den anderen gelinkten Tipps komme ich im Moment noch nicht klar.

05.07.2007 - 13:35 Uhr

Wenn sie über Port 80 surfen dürfen, dann ja.
Ich habe dich mal so verstanden das du einfach einen Fileserver anbietest und wenn die Kunden deinen Server ansprechen können sie die jeweilige Datei runterladen. Richtig?

05.07.2007 - 13:30 Uhr

Original von herbivore
Greife nie von anderen Forms und erst recht nicht von anderen (Business-)Klassen, auf die Controls eines Forms zu. Bessere Möglichkeiten stehen in der FAQ.

herbivore

Da ich nun auch vor dem gleichen Problem stehe und es unter Java problemlos geht. Warum darf /sollte ich das in c# nicht? Ist .Net zu doof damit umzugehen oder weshalb? Der logische Grund fehlt mir da irgendwie.

Gruß Cookiie

05.07.2007 - 11:38 Uhr

nach dem link wird doch ne leerstelle sein oder?
kannst das ende ja noch mit .??? oder .???? prüfen ob es jeweils ne richtige endung hat

05.07.2007 - 11:03 Uhr

seufz, also er fängt mit GetPrims an


void GetPrims() {
   // 2 Listen werden angelegt, sollte klar sein
   List<int> prims = new List<int>();
   List<int> noPrims = new List<int>();
   
   // schleife von 2 -999, wenn isPrim true liefert der prim-liste zuordnen, bei false entsprechender der anderen Liste
   for(int i=2;i<1000;++i)
       if(IsPrim(i))
         prims.Add(i);
       else
         noPrims.Add(i);
}

aufruf von isPrim mit übergabe der jeweiligen zahl


bool IsPrim(int x) {
  int max = (int)Math.sqrt(x);  // maximal bis wurzel der zahl probieren, weil 2*3 = 3*2 
  if(x%2==0 && x>2)
     return false;
  
  for(int i=3;i<=max;i+=2)
     if(x%i== 0)
       return false;


   return true;
}

x%i <-- modulo-operator, so mehr verrat ich jetzt nicht, sonst lernst nix

05.07.2007 - 10:54 Uhr

Kannst du freilich tun, solange auf dem Rechner kein anderes Programm den Port 80 nutzt. Eine Garantie das du durch die Firewall kommst hast du damit aber auch nicht unbedingt.

Gruß Cookiie

05.07.2007 - 10:02 Uhr

Andavos hat doch schon beide Möglichkeiten gepostet. Die Brut-Force-Variante ist wirklich sehr sehr übersichtlich und sollte wirklich leicht verständlich sein.
Das Sieb des Eratosthenes ist nunmal von Natur aus komplexer und damit auch der entsprechende Programmcode, da gibt es nicht wirklich einen Leichteren. Du wirst dich wohl oder übel damit auseinander setzen müssen oder einen anderen Algorithmus probieren müssen. Wobei das Sieb noch einer der leichteren ist.

Gruß Curatio

04.07.2007 - 16:55 Uhr

Also grundlegende vergleiche und abfragen mit if solltest du beherrschen, da du wirklich daran scheiterst, zumindest scheint es so.
Empfehle ich dir mal folgendes Buch Visual C# 2005.
In dem Buch ist alles wichtige und die Grundlagen der Objektorientierten Programmierung sehr gut anhand von Beispielen erklärt. Arbeite dich da erstmal ein wenig durch und dann schauen wir weiter. Vorher bringt das glaub ich nicht viel.

und jetzt schönen Feierabend an alle^^.
Cookiie

04.07.2007 - 16:35 Uhr

wenn du es auf hardcore machst

zähler der von 2 bis grenze hochzählt
primarraylist[0] = 2
if zähler/ primarray = teilbar
keine primzahl
else
primzahl, add to primarray

mehr ist es nicht, wird halt je nach grenze sehr umfangreich.

Gruß Cookiie

04.07.2007 - 16:14 Uhr

nummer 1. Punkt Nummer 6

nummer 2.
Was willst du jetzt wissen, wie das Sieb funktioniert oder warum dein Code funktioniert?

Gruß Cookiie

04.07.2007 - 16:04 Uhr

dann schau dir mal die regex-klasse genau an
es gibt methoden die dir den startindex bei einem treffer liefern
also wenn du nach "http://" suchst und er findet eines im string, mußt du einfach nur Substring(startindex, endindex) machen
wobei ich glaube das regex das auch kann, aber da gibts bessere profis im forum die da besser bescheid wissen

04.07.2007 - 15:59 Uhr

er hat es ja schon in einem String-array, da bringt die liste auch nichts neues.
ich würde Regex vorschlagen und erst alle indexe (igitt) nach /home durchsuchen und bei einem treffer, den betreffenden string nach den ordner nach / durchsuchen
also ich finde /home/golo, /home/gulu und /home/gala und er listet dann golo, gulu, und gala auf, müßte man dann so filtern, das die bla.txt nicht genommen wird sonder nur der ordnername
wenn sämtliche unterordner also auch in tieferen ebenen gefunden werden sollen, wird es entsprechend komplexer
aber das ist dann eigentlich nur ne schleifengeschichte

gruß cookiie

04.07.2007 - 15:20 Uhr

System.Text.RegularExpressions.Regex.Matches(deinstring, "http.//blablablub", RegexOptions.IgnoreCase);

rest sollte einfach machbar sein

04.07.2007 - 09:42 Uhr

Sieht soweit ok aus. Gibt jetzt ja nur 2 mögliche Fehlerquellen, entweder die daten aus dem textfeld enthalten den Zeilenumbruch schon bzw. beim auslesen wird einer hinzugefügt oder beim schreiben der einzelnen Elemente wird jener hinzugefügt.
Auf der anderen Seite, da der Umbruch beim Debuggen nicht da ist, wird er vielleicht erst durch den Editor sichtbar, weil dieser ihn nicht korrekt darstellt bzw. beim auslesen tritt erst der Fehler auf.
Ein xml-file sieht ja normal so aus

<xml-encoding utf8> o.s.ä.
<Header>
<bla>
text
</bla>
</Header>

also zeilenumbrüche sind ja vorhanden, sonst würde ja alles in einer zeile stehen.
Also viel Spaß beim suchen, mehr fällt mir jetzt auch nicht dazu ein, dafür sind meine xml-kenntnisse zu begrenzt.

Gruß Cookiie

03.07.2007 - 15:51 Uhr

Hm, wenn du sie erst in der fertigen Datei siehst machst du vielleicht was beim speichern verkehrt und die Daten die du eigentlich bekommst sind in Ordnung.
Nur ne Vermutung, aber ich würde das mal checken.

Gruß Cookiie