Ein neues Thema erstellen  Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Stringcount leicht abändern
BeitragVerfasst: 30.04.2002, 11:30 

Registriert: 14.12.2001, 01:00
Beiträge: 146
Wohnort: Erzgebirge/Sachsen
Hallo Scripter
ich will die folgende Funktion so abändern, dass nicht nur nach einem einzelnen Charakter gesucht wird, sondern nach einem beliebig langem String
der Ausgangscode aus der adminlib.inc
Code:
stock strcount(str[], searchchar) {
	new i = 0;
	new maxlen = strlen(str);
	new Count = 0;
	
	for(i = 0; i <= maxlen; i++) {
		if (str[i] == searchchar)
			Count++;
	}
	return Count;
}
ich hab schon eine Idee,wie ich das für einen Suchstring der Läge 2 mache,aber ich will eine allgemeine Lösung haben

_________________
bye Weaselweb


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 30.04.2002, 11:42 
AM.de Team
Benutzeravatar

Registriert: 22.10.2001, 01:00
Beiträge: 839
Was machst Du denn bei sowas?

Suche nach bb

String: abbababbbbbbababbbabb?

Was soll da fuer eine Anzahl rauskommen? 6? 9?

_________________
There are no stupid questions, only stupid people.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 30.04.2002, 11:56 

Registriert: 14.12.2001, 01:00
Beiträge: 146
Wohnort: Erzgebirge/Sachsen
naja,will nach ";;" suchen, falls jemand ";" im Nick hat(solche wirds bestimmt geben)
oder ihr gebt mir einen besseren Trennstring
ich weiß nur keinen mehr,da die Leute ja auf immer verrücktere Nicks kommen

_________________
bye Weaselweb


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 30.04.2002, 12:35 
AM.de Team
Benutzeravatar

Registriert: 23.11.2001, 00:00
Beiträge: 3842
Wohnort: Vor König Arthus
Code:
stock strcount(str[], searchchar) {
  new i = 0;
  new maxlen = strlen(str);
  new maxlen2 = strlen(searchchar);
  new Count = 0;
  new merk[maxlen2+1];
  
  for(i = 0; i <= maxlen-maxlen2+1; i++) {
    merk="";
    for(j = 0; j <= maxlen2; i++){
      strcat(str[i], merk, maxlen2+1);
    }
    if (merk == searchchar)
      Count++;
  }
  return Count;
}
Ich hoffe, dass meine beschränkten Small-Kenntnisse ausreichen. Aber so ungefähr müsste es aussehen. Ist natürlich nicht getestet.
Ich sehe es schon kommen. Ich werde von da Rope in der Luft zerrissen.

_________________
Der schwarze Ritter triumphiert immer...
WING-Clan


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 30.04.2002, 14:46 

Registriert: 14.12.2001, 01:00
Beiträge: 146
Wohnort: Erzgebirge/Sachsen
erstmal Danke, so ähnlich habe ich mir das auch gedacht
bis auf ein paar kleine Fehler
wunder mich eins
Zitat:
Code:
strcat(str[i], merk, maxlen2+1);
ich weiß nicht, ob da dann merk auch den mehrere Zeichen hat,da bin ich mir nciht sicher, aber ansonsten müsste es funktionieren

PS: bei daRope's Beispiel würde 9 herauskommen

_________________
bye Weaselweb


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 30.04.2002, 14:55 
AM.de Team
Benutzeravatar

Registriert: 23.11.2001, 00:00
Beiträge: 3842
Wohnort: Vor König Arthus
Stimmt die Anzahl wäre 9. Anders würde es auch keinen Sinn machen.
Du kannst Dir auch gerne eine Variante für die 6 basteln. Nur dann muss das über eine while-Schleife gemacht werden, da bei erfolgreichen Finden der Index der i-Schleife um die Zeichenanzahl des Strings erhöht werden muss und nicht um 1. Die j Schleife kann so bleiben wie sie ist.
BTW, hab gerade einen Fehler genau dort entdeckt. Es muss heißen:
Code:
strcat(str[i+j], merk, maxlen2+1);
Außerdem habe ich j nicht definiert:
Code:
new j;

_________________
Der schwarze Ritter triumphiert immer...
WING-Clan


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 01.05.2002, 00:31 
AM.de Team
Benutzeravatar

Registriert: 22.10.2001, 01:00
Beiträge: 839
Du solltest Code, den Du hier postest, mal kompilieren und pruefen. Jedenfalls dann, wenn Du Zweifel hast, ob er richtig sein koennte. (Wenn ich das da oben lese, wuerde ich Dir vorschlagen, das generell zu tun). Sonst kommen Leute mit noch weniger Ahnung, kopieren das in ihren Code und kommen dann wieder angewatschelt, weil es nicht tut und sie nicht wissen warum. Bei Deinem Code sollte Dich der Compiler laut anschreien und Dir die Festplatte um die Ohren hauen.

_________________
There are no stupid questions, only stupid people.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 01.05.2002, 04:06 
AM.de Team
Benutzeravatar

Registriert: 27.11.2001, 01:00
Beiträge: 3564
Wohnort: In der Nähe von Bonn
Wenn der Compiler das tun würde, müsste ich mir jeden Tag eine neue Festplatte kaufen :-)

_________________
Fehleranalyse: Poste den Inhalt Deiner liblist.gam, (listen)server.cfg, adminmod.cfg, users.ini, vault.ini, plugin.ini von adminmod und plugins.ini von metamod. Benutze auch die Such-Funktion


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 01.05.2002, 09:34 

Registriert: 30.03.2002, 15:03
Beiträge: 140
Wohnort: Käse und Schoggi Land (Schweiz)
oder neue Ohren :lol: :lol:


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 01.05.2002, 20:27 
AM.de Team
Benutzeravatar

Registriert: 23.11.2001, 00:00
Beiträge: 3842
Wohnort: Vor König Arthus
Ich hab's geschrieben, weil ich bei der Arbeit war und ihm nur einen Lösungsweg aufzeigen wollte. Bevor ich ihm über 2 Seiten meinen Lösungsweg erkläre, dachte ich, dass der Skriptweg der einfachste wäre. Hätte vielleicht schreiben sollen, dass es nur ein Denkansatz war.

OK, ok , also ich hab es kompiliert und doch einen fetten Denkfehler gefunden. Arrays kann man direkt nicht vergleichen. Schade eigentlich... Und dann waren da noch ein paar Kleinigkeiten. Also neuer Vorschlag. Ich hoffe keinen Denkfehler gemacht zu haben:
Code:
stock strcount(str[], searchchar[]) {
 new i = 0;
 new j = 0;
 new maxlen = strlen(str);
 new maxlen2 = strlen(searchchar);
 new Count = 0;
 new merk[MAX_TEXT_LENGTH];
 new test = 1;
 
 for(i = 0; i <= maxlen-maxlen2+1; i++) {
  merk="";
  for(j = 0; j <= maxlen2; i++){
   strcat(str[i+j], merk, maxlen2+1);
  }
  test=strncmp(searchchar, merk, maxlen2);
  if (test == 0)
   Count++;
 }
 return Count;
}
Wie gesagt ist nur als Denkanstoß gedacht. Nicht als fertiger Code. Der Compiler läuft zwar jetzt ohne Fehler durch, aber die Funktion habe ich nicht getestet.

BTW, warum kann ich in Small die Arraylänge nicht in der Funktion vorgeben. Ich wollte sie gerne variabel von der Stringlänge wählen, kann aber nur mit bereits festgelegten Konstanten arbeiten. Mich würde interessieren, was hinter diesem Konzept steht.

_________________
Der schwarze Ritter triumphiert immer...
WING-Clan


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 01.05.2002, 23:09 
AM.de Team
Benutzeravatar

Registriert: 22.10.2001, 01:00
Beiträge: 839
Zitat:
Ich hab's geschrieben, weil ich bei der Arbeit war und ihm nur einen Lösungsweg aufzeigen wollte. Bevor ich ihm über 2 Seiten meinen Lösungsweg erkläre, dachte ich, dass der Skriptweg der einfachste wäre. Hätte vielleicht schreiben sollen, dass es nur ein Denkansatz war.
Eigentlich wuerde ich an dieser Stelle sagen "dann schreib Pseudocode".
Zitat:
OK, ok , also ich hab es kompiliert und doch einen fetten Denkfehler gefunden. Arrays kann man direkt nicht vergleichen. Schade eigentlich... Und dann waren da noch ein paar Kleinigkeiten.
:) Nur nicht aufregen, Knighty, ich hab' ja nix gegen Dich. Ich bin oft so. =) Du wuerdest es schon merken, wenn es Dir an den Kragen geht. :)

Hier ein Vorschlag zu Guete. Meine erste Idee eines kleinen Dreizeilers geht in Small mangels Zeigern auch nicht. Daher hier mal der (korrekte) klassische Stringsearch zum drueber schlafen. Nicht so kompliziert denken, beim naechsten mal. ;)
Code:
stock strstrcount(str[], search[]) {
	new i = 0;
	new j = 0;
	new maxlen = strlen(str);
	new maxlen2 = strlen(search);
	new Count = 0;
	for(i = 0; i <= maxlen-maxlen2; i++) {
		for(j = 0; j <= maxlen2; j++){
			if ( j == maxlen2 ) {
				Count++;
				break;
			}  // if
			
			if ( str[i+j] != search[j] ) break;
		}  // for
	}  // for

	return Count;
}
Zitat:
BTW, warum kann ich in Small die Arraylänge nicht in der Funktion vorgeben. Ich wollte sie gerne variabel von der Stringlänge wählen, kann aber nur mit bereits festgelegten
Konstanten arbeiten. Mich würde interessieren, was hinter diesem Konzept steht.
Oje *stoehn* einfache Antwort: weil es nicht so implementiert ist.
Andeutung der Problematik: Weil der Heap in der AMX eigentlich nur ein erweiterter Stack ist. Schon mal von gehoert, Heap und Stack? Es lassen sich viele Gruende finden. Small ist nun mall Small C. Da ist das ebenso. Und von VLAs in C99 will ich nun wirklich nicht anfangen, das fuehrt zu weit. Unterm Strich: ist halt so.

Oder Du fragst den Author. :)

_________________
There are no stupid questions, only stupid people.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 02.05.2002, 09:13 
AM.de Team
Benutzeravatar

Registriert: 23.11.2001, 00:00
Beiträge: 3842
Wohnort: Vor König Arthus
Äußerst pfiffige Idee die Zeichen einzeln zu vergleichen. Dadurch kann man sich in der Regel einige Durchläufe ersparen. Der Code dürfte wohl 5 mal schneller sein als meiner. Ja, ich weiß, man hat mich schonmal betitelt mit der Zeile: Warum einfach, wenn es auch einfach geht. :D
Sorry, von Programmiertheorie habe ich keine Ahnung. Habe nicht wie Du etwas informatiktechnisches studiert und in Verfahrenstechnik gehört es auch nicht zum Lehrumfang. Der Hinweis, dass es nicht implementiert ist und Du es auch nicht genau weißt, hätte gelangt. Ich hatte nur an Speicherersparnis gedacht. Macht ja nichts, mit Deinem Code ist das Thema eh vom Tisch. :wink:

_________________
Der schwarze Ritter triumphiert immer...
WING-Clan


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 12 Beiträge ] 


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de
Original Design von "[ Half-Life Admin Mod © Alfred Reynolds 2000-2003 ] - [ site design by Jägermeister ]"