Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
11.11.2006, 13:53
JohnLeDon



Ich benutze für mein dialogsystem fopen("dialogues.txt");
wenn ich nun die mod starte, lädt es das file nicht. ich hab schon die verschiedensten pfade versucht.

weiss jemand wie ich auf die festgelegten pfade zugreifen kann?
(bekommt man mit "path" in der konsole.)

(so in etwa: fopen(GAME+"scripts/dialogues.txt");

natürlich geht es, wenn ich den korrekten gesamten pfad angebe, aber der kann ja immer anders sein..

--


Dieser Beitrag wurde am 11.11.2006 um 13:59 von JohnLeDon bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
11.11.2006, 17:47
sw_a_t



Es muss eigentlich mit
Quellcode:fopen("scripts/dialogues.txt"); funktionieren, da es bei
Quellcode:PrecacheModel( "models/weapons/bolts/crossbow_bolt.mdl" ); u.ä. auch funktioniert.

--

sw_a_t heißt jetzt CPoly !

Medieval Battles - Para Bella Crudelia

zum Seitenanfang zum Seitenende Profil || Suche
002
11.11.2006, 19:02
feigling



ich würde aber sicherheitshalber schauen, was genau PrecacheModel macht. Vielleicht packt PrecacheModel da von selber noch den richtigen Game-Pfad dran.

--

zum Seitenanfang zum Seitenende Profil || Suche
003
11.11.2006, 19:43
sw_a_t



Ich habe einfach mal das gesammte Projekt nach "gamepath" durchsucht (erschien mir ein guter Name für eine Variable) und habe mit etwas tiefgründiger Suche das hier gefunden :

Quellcode:// Get the current game directory (hl2, tf2, hl1, cstrike, etc.)
virtual void        GetGameDir( char *szGetGameDir, int maxlength ) = 0;
Quelle : src/public/eiface.h

--

sw_a_t heißt jetzt CPoly !

Medieval Battles - Para Bella Crudelia


Dieser Beitrag wurde am 11.11.2006 um 19:47 von sw_a_t bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
004
12.11.2006, 15:34
JohnLeDon



Zitat:
virtual void GetGameDir( char *szGetGameDir, int maxlength ) = 0;
geh ich da recht in der annahme, das so benutzen zu müssen:

char *gamedir[255]
GetGameDir(&gamedir,255);

??

btw. wieder mal typisch:
http://developer.valvesoftware.com/wiki/IFileSystem#My_Game_Directory

und dann:
engine->GetGameDirectory();
ergibt: GetGamedirectory() ist kein Element von IVEngineServer..

WAS HABEN DIE SäCKE DA BLOSS FüR EIN VECKACKTES UPDATE RAUSGEBRACHT??????

(siehe auch meine vgui anfrage.)

--


Dieser Beitrag wurde am 12.11.2006 um 15:44 von JohnLeDon bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
005
12.11.2006, 15:56
feigling



Such doch einfach mal im Source nach GameDir .. Irgendwo wirds die Funktion schon noch geben. Und wenn man halt mal da 20 mins am Suchen ist. Das ist nun mal so, wenn man einen solch komplexen Code vor sich liegen hat, der von jemand anderem geschrieben wurde. Klar ists Mist, wenn die Dokus nicht stimmen, aber anstatt rumzuheulen sollte man einfach selber ein bisschen suchen.

--

zum Seitenanfang zum Seitenende Profil || Suche
006
12.11.2006, 16:25
Bluthund



Zitat:
JohnLeDon postete
Zitat:
virtual void GetGameDir( char *szGetGameDir, int maxlength ) = 0;
geh ich da recht in der annahme, das so benutzen zu müssen:

char *gamedir[255]
GetGameDir(&gamedir,255);

??

Was du da versuchst ist die Adresse eines Arrays von char Pointern zu übergeben... Ich glaube nicht, dass du bzw die Funktion das will.
Ich empfehle dir dringend etwas Lektüre über Arrays/Pointer in C/C++.

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-

zum Seitenanfang zum Seitenende Profil || Suche
007
12.11.2006, 17:35
JohnLeDon



also leute ich entschuldige mich für mein geheule.

1. GetGameDirectory ist auf der Client side.
2. mit GetGameDir gings dann....
3. Ich weiss wie arrays / pointer funktionieren: also bei einer void funktion muss doch irgendwo die adresse des arrays sein, wo das zeug dann hingeschrieben wird...deshalb GetgameDir(&....)
4. es heisst nun char *dir = engine->GetGameDir();

5. Als ich so rumgeheult hab, war ich kurz davor, aus dem Fenster zu springen....ich hoffe ihr versteht das....

--


Dieser Beitrag wurde am 12.11.2006 um 17:38 von JohnLeDon bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
008
12.11.2006, 17:49
feigling



Wenn schon, dann wäre der Code

char gamedir[255] = {0};
GetGameDir(gamedir, 254);

--

zum Seitenanfang zum Seitenende Profil || Suche
009
12.11.2006, 18:14
Bluthund



Zitat:
JohnLeDon postete
(...)
3. Ich weiss wie arrays / pointer funktionieren: also bei einer void funktion muss doch irgendwo die adresse des arrays sein, wo das zeug dann hingeschrieben wird...deshalb GetgameDir(&....)
4. es heisst nun char *dir = engine->GetGameDir();

5. Als ich so rumgeheult hab, war ich kurz davor, aus dem Fenster zu springen....ich hoffe ihr versteht das....

3: Wenn du wüsstest wie Arrays und Pointer funktionieren wüsstest du auch das char *x == char x[] ist und würdest hier nicht so nen Unfug verzapfen. Du brauchst bei Arrays/Pointern keinen Adressoperator weil Arrays und Pointer Adressen sind. Deshalb kann die einzig sinnvolle Lösung auch nur die sein, die feigling jetzt gepostet hat. Auch wenn ich glaube er hätte das besser nicht tun sollen, da du das wahrscheinlich genau so übernehmen wirst ohne dir Gedanken darüber zu machen, warum es grad so ist.
(Außerdem nehm ich an, dass die Funktion bei nem Array mit 255 Gliedern auch 255 als maxlength annimmt. Aber ich denk mal feigling hat sich die Implementation der Funktion wie ich auch nicht angesehn und daher gilt ja eh "lieber zu kurz geschrieben als übers Ende hinaus" :) )

4: Du belegtst einen uninitialisierten Pointer mit einem Wert. Allererste Sahne. *doh* Mal davon abgesehen das die Funktion so deklariert ist:

Zitat:
virtual void GetGameDir( char *szGetGameDir, int maxlength ) = 0;
und sich daraus ergibt dass sie keinen Wert zurück gibt den man somit mit Hilfe des Zuweisungsoperators auf eine Variable legen könnte.
Auch hier gilt wieder die FEIGLINGsche Lösung :)

Fazit bis hier: Noch mal ganz genau ein Buch darüber lesen, was du hier versuchst zu tun: Programmieren in C/C++

5: Wenn du wegen sowas Ambitionen hegst dein Leben zu beenden solltest du dir ernsthafte Gedanken machen ob du nicht vielleicht lieber das Hobby wechselst oder mal eine längere Pause einlegst.

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-

zum Seitenanfang zum Seitenende Profil || Suche
010
12.11.2006, 20:00
JohnLeDon



da für Euer Korrektheit:

char *fnam=new char[2050];
engine->GetGameDir(fnam, 1024);
strcat(fnam,"\\");
strcat(fnam, STRING(ms_dialogfilename));
LoadMyFile(fnam);

das dann komplimert (ja feigling, ich weiss) und es funzt.

und bitte: schlagt mir ja nie vor, ein buch über cpp zu lesen. Niemals wieder. Echt. Das hat mich zutiefst beleidigt. Wenn ihr wüsstet, was ich schon alles zusammengecoded hab....also echt.

--


Dieser Beitrag wurde am 12.11.2006 um 20:01 von JohnLeDon bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
011
12.11.2006, 22:01
Bluthund



Ich wollte dich keineswegs beleidigen mit der Empfehlung ein Buch zu lesen. Aber wer uninitialisierte Pointer in C/C++ verwendet oder Konstrukte wie Adresse von Pointer-Array auf char an eine Funktion übergibt die Pointer auf char bzw char-Array verlangt sollte sich einfach nochmal damit beschäftigen, was er da tut. Und da kannst du noch so viele Programme geschrieben haben. Sowas sind elementare Sachen die man im Umgang mit C/C++ einfach wissen muss.
Klar kann man auch mit Trial-and-Error programmieren. Aber wirklich effektiv ist das dann nicht und vorallem kommt man früher oder später an den Punkt wo man dann nicht mehr weiter kommt...
Außerdem müsste man ja annehmen, dass jemand der schon so viele Programme geschrieben hat weiß wie das Übersetzen von Sourcecode in Maschinensprache heißt. Und jetzt kannst du auch gern sagen, dass hast du extra so gemacht, weil feigling in nem andren Thread jemand deswegen berichtigt hat (was ich eigentlich auch hoffe, dass du es deshalb so geschrieben hast).
ABER: Hier lesen auch einige Newbies mit und eben jene prägen sich dann solche Wörter wie komplimieren oder noch abenteuerlichere Konstrukte ein. Und ein Forum ist immer nur so gut wie seine Posts/Poster.
Das soll keineswegs ein Angriff auf deine Person sein. Ich war auch gerade auf deiner Seite und sehe da ja auch dass du schon einiges gemacht hast. Aber teilweise fällt es mir echt schwer deine Posts aufgrund ihres Inhalts auch wirklich ernst zu nehmen.

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-

zum Seitenanfang zum Seitenende Profil || Suche
012
12.11.2006, 23:37
feigling



Zitat:
JohnLeDon postete
da für Euer Korrektheit:

char *fnam=new char[2050];
engine->GetGameDir(fnam, 1024);
strcat(fnam,"\\");
strcat(fnam, STRING(ms_dialogfilename));
LoadMyFile(fnam);

das dann komplimert (ja feigling, ich weiss) und es funzt.

und bitte: schlagt mir ja nie vor, ein buch über cpp zu lesen. Niemals wieder. Echt. Das hat mich zutiefst beleidigt. Wenn ihr wüsstet, was ich schon alles zusammengecoded hab....also echt.

Dann solltest du wissen, dass strcat böse ist und man eher strncat nehmen sollte ;x

Zitat:
Bluthund postete
3: Wenn du wüsstest wie Arrays und Pointer funktionieren wüsstest du auch das char *x == char x[] ist und würdest hier nicht so nen Unfug verzapfen.
Nö, ist nicht das gleiche.

char *blah = "123";
blah[0] = '0';

crasht während

char blah[] = "123";
blah[0] = '0';

funktioniert, aber das ist ja hier eh wurscht =)

--

zum Seitenanfang zum Seitenende Profil || Suche
013
13.11.2006, 00:21
Bluthund



Arg sowas musste ja kommen... Ich meinte damit natürlich, dass die Benutzung von Pointern und Arrays äquivalent ist und nicht deren Deklaration (War ungünstig geschrieben). Das erste muss ja zwangsläufig crashen, weil der Pointer nicht initialisiert ist.

// Ab hier bitte überlesen
Mit
Quellcode:char *blah = new char[3] = "123"; funktionierts wunderbar (ja da ist kein Platz für \0 ^^)
// Ab hier wieder lesen

Aber das brauch ich dir ja eigentlich nicht zu erzählen, feigling :)

edit: habe grad nochmal dein erstes probiert und das geht kurioserweise mit MSVC++ 2005 Express Edition.

edit2: habe mal das ganze oben ein wenig verbessert. Der Code ist natürlich auch totaler Unfug. Ich hab mich von MS blenden lassen, dass sowas funktioniert. Naja gut mit MSVC++ 2005 Express Ed. funktionierts auch. Aber naja...

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-


Dieser Beitrag wurde am 13.11.2006 um 00:57 von Bluthund bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
014
13.11.2006, 00:26
feigling



"weil der Pointer nicht initialisiert ist."

Nö, weil das 1. ein String Literal ist und man diese nicht verändern kann. Das Zweite ist nen normales Char Array, aber lassen wir das jetzt. Bringt ja diesen Thread nicht weiter =)

--

zum Seitenanfang zum Seitenende Profil || Suche
015
13.11.2006, 00:49
Bluthund



Ich beuge mich... :) Daran hatte ich garnicht gedacht.

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-

zum Seitenanfang zum Seitenende Profil || Suche
016
13.11.2006, 01:07
oxff



Zitat:
JohnLeDon postete
da für Euer Korrektheit:

char *fnam=new char[2050];
engine->GetGameDir(fnam, 1024);
strcat(fnam,"\\");
strcat(fnam, STRING(ms_dialogfilename));
LoadMyFile(fnam);

das dann komplimert (ja feigling, ich weiss) und es funzt.

und bitte: schlagt mir ja nie vor, ein buch über cpp zu lesen. Niemals wieder. Echt. Das hat mich zutiefst beleidigt. Wenn ihr wüsstet, was ich schon alles zusammengecoded hab....also echt.

Bamm, Buffer Overflow. Verlierer. Du gehoerst beleidigt, `komplimirer'. Ausserdem, mal eben 2 kB fuer einen Dateinamen allozieren auf dem Stack... Sahne!

--

mwcollect - mein Projekt | oxlog - mein blog | happyhardcore.com Stream - gute Musik

zum Seitenanfang zum Seitenende Profil || Suche
017
13.11.2006, 18:06
JohnLeDon



ja ich geb ja zu, das das mit strcat nicht gerade das beste ist.

ich habs erst mit sprintf versucht, aber da will die engine ihr q_snprintf dazu geben, und das wollte dann prompt mal nicht.

und 2kb sind schon recht viel, ich weiss....aber wer weiss schon, was die leute für pfade angeben in hammer. und der game-pfad selbst ist ja manchmal (meistens) schon ellenlang....

Zitat:
Und jetzt kannst du auch gern sagen, dass hast du extra so gemacht, weil feigling in nem andren Thread jemand deswegen berichtigt hat (was ich eigentlich auch hoffe, dass du es deshalb so geschrieben hast).
^^ genau so wars.
also newbies: es heisst kompilieren bzw. compilen.

--

zum Seitenanfang zum Seitenende Profil || Suche
018
13.11.2006, 18:38
feigling



sprintf ist genauso scheiße wie strcat. Wenn, dann snprintf. ;x

€dit Wobei man bei snprintf natürlich selber auf das '\0' am Ende achten muss.

€dit2: Err, quatsch ... bei strncpy wars.. nicht bei snprintf ...

--


Dieser Beitrag wurde am 13.11.2006 um 19:36 von feigling bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
019
13.11.2006, 21:04
JohnLeDon



naja snprintf wollte ja mal gaaaaar nicht....das hab ich ja auch versucht.

--

zum Seitenanfang zum Seitenende Profil || Suche
020
14.11.2006, 05:56
feigling



Wenn strcat geht, geht auch snprintf.

--

zum Seitenanfang zum Seitenende Profil || Suche
021
16.11.2006, 10:34
JohnLeDon



ne, die engine hat da einen "ersetze snprintf durch q_snprintf" parameter....
aber egal, es funzt ja jetzt.

--


Dieser Beitrag wurde am 16.11.2006 um 10:35 von JohnLeDon bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche