• 05 Juillet 2025, 21:12:49


Auteur Sujet: Crash serveur  (Lu 1520 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Crash serveur
« le: 11 Septembre 2008, 00:27:25 »
salut à tous,

alors comme le titre du sujet l'indique, j'ai un problème : mon serveur crash,

et je sais très bien ce qui est appelé à ce moment là, ou presque,

il s'agit de OnPlayerDisconnect amis je n'ai rien trouvé de suspect dans aucune de ces callbacks

voici les codes:

public OnPlayerDisconnect(playerid, reason)
{
  spawned[playerid] = 0;
  haskilled[playerid][0] = 0;
  haskilled[playerid][1] = 0;
  saved[playerid][0] = 0;
  lang[playerid][isset] = 0;  lang[playerid][eng] = 0;  lang[playerid][fr] = 0;
  Dm[playerid] = 0;
  pcount[playerid] = -1;
  afb[playerid] = 0;
  soundplayed[playerid] = 0;
return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
altele[playerid] = 0;
new pname[MAX_PLAYER_NAME], string[256], str[256];
GetPlayerName(playerid, pname, sizeof(pname));
        SendDisconnectMsg(playerid,,pname,reason);
return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
DestroyPlayerObject(playerid,ma);
DestroyPlayerObject(playerid,tj);
DestroyPlayerObject(playerid,hj);
DestroyPlayerObject(playerid,mj);
DestroyPlayerObject(playerid,hmmm);
Object_OnPlayerDisconnect(playerid, reason);
return 1;
}


sinon y a que le vactions

alors comme la plupart ce sont des variables, et quelles sont supposées être ok.... je voit vraiment pas :(

merci de m'aider :D

EDIT:

alors je viens de penser à un truc, mais je ne crois pas vraiment que ce soit en cause mais j'ai ajouter à mon include de langues les fonctions suivantes, je me demande si elles pourraient être en cause...:

SendFormattedMsg(playerid,color,const msg1[],const msg2[],{Float,_}:...)
{
new string[256];
if(!GetLang(playerid)){
    format(string,sizeof(string),msg1, {Float,_}:...);
}else format(string,sizeof(string),msg2,{Float,_}:...);
  return SendClientMessage(playerid,color,string);
}


SendFormattedMsgToAll(color,const msg1[],const msg2[],{Float,_}:...)
{
new stringfr[256];,stringeng[256];
format(stringeng,sizeof(stringeng),msg1,{Float,_}:...);
format(stringfr,sizeof(stringfr),msg2,{Float,_}:...);
for(new i; i < maxp; i++){
    if(!IsPlayerConnected(i))return 1;
if(!GetLang(i))return SendClientMessage(i,color,stringeng);
else return SendClientMessage(i,color,stringfr);
}
}

Merci à tous de votre aide (encore  :P) :cheers

++Sim++
« Modifié: 11 Septembre 2008, 01:22:34 par Sim »





Hors ligne Pey_Hache

  • NSG Co-Leader
  • *
  • Messages: 2112
    • Voir le profil
    • Speed-Run.net
Re : Crash serveur
« Réponse #1 le: 11 Septembre 2008, 01:25:09 »
ca me fait pitier de voir que personne répond , alors ne sachant meme pas de quoi tu parles , je te fais preuve de mon soutient et de ma compassion

pourriez lui répondre qd meme ceux qui s'y connaissent ...  >:( >:(


Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Crash serveur
« Réponse #2 le: 11 Septembre 2008, 01:54:25 »
salut,

alors j'ai travaillé sur les fonction du include et remarqué que la dernière partie ne fonctionne pas.... mais pas du tout >:(

comme vous avez le code deux post plus hauts, je ne le reposerai pas, ne portés pas attention au ; de trop dans les déclarations des string,

alors le {Float,_}:... que je me suis donné bien du mal a tenté de trouver et de remplacer ...... ne fonctionne pas, alors j'aimerais avoir une idée de ce qu'il me faudrait mettre a cet endroit là, quel genre de variable peut bien faire l'affaire??

EDIT: je viens d'allumer et penser à aller voir le SendPlayerFormattedMessage du lvdm qui vient avec le serveur...ce que je suis bête... ::)

EDIT2: après une légère observation, je dirais que le SenfPlayerFormattedMessage n'a aucun rapport, je ne sais même pas a quoi peut bien servir la dernière variable.... j'ai regarder un peu le YSI, il le fait l'ennui c'est environ 200 lignes de code et à l'intérieur de ça, il utilise plein de fonctions qu'il avait déjà prédéfinies....

Merci

++Sim++
« Modifié: 11 Septembre 2008, 02:32:14 par Sim »





Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Crash serveur
« Réponse #3 le: 11 Septembre 2008, 21:48:54 »
Premièrement, il y a 2 virgules consécutives dans l'appel à SendDisconnectMsg dans ton deuxième OnPlayerDisconnect.
Ce n'est peut-être pas une erreur (arguments avec valeurs par défaut) mais ce n'est tout de même pas très bien.

Sinon, le {Float,_}:... sert à indiquer que ta fonction est à arguments variables.
La fonction SendFormattedMsg par exemple peut-être appelée avec un chaine de format.
Exemple :
GetPlayerName (playerid, Name, sizeof (Name)
SendFormattedMsg (playerid, 0xff00ff, "Bonjour %s", "Hello %s", Name);
SendFormattedMsg (playerid, 0xff00ff, "Comment vas-tu ?", "How are you ?");
SendFormattedMsg (playerid, 0xff00ff, "Il est %2.2d:%2.2d", "It's %2.2d:%2.2d", Heure, Minute);

Pour moi, ce n'est pas elle qui fait planter, sauf si tu l'appelles mal :
SendFormattedMsg (playerid, 0xff00ff, "Bonjour %s", "Hello %s"); // Il manque un parametre mais le compilo ne peut pas le voir
++
Syg
Courtesy of GtaManiac

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Crash serveur
« Réponse #4 le: 12 Septembre 2008, 00:25:25 »
salut,

désolé Syg, mais je n'arrive pas à comprendre exactement ce que tu veut dire par:

Citer
un chaine de format.

veut tu dire des format que l'on ferait avant la fonction puis on ne ferait que placer les variables dans le SendMsgToPlayer ???

sinon ce serait comme dans ton exemple (ce que je crois) mais je ne vois aucunement comment faire une telle fonction, enfin, très légèrement car le format de YSI le fait, sauf que comme je l'ai déjà dit, l'ennui c,est que le code est très long et compliqué... en plus que la moitié du script est plein de variables qui servent à je ne sais pas trop quoi et puis j'ai essayé mais sans résultat de l'adapter.... comme à la place d'un return value; qui serait très clair, il a simplement    output[p - (len ? 0 : 1)] = '\0';,
bref, c'est bien au-dessus de mon niveau en scripting... :boulet

vraiment, si quelqu'un y comprend quelque chose, merci de m'aider....

sinon, pour le serveur j'ai trouver le FS qui fait crasher, mais l'ennui c'est que je n'arrive pas à le corriger, alors je retourne à mes scripts

++Sim++

P.S. merci flag, mais surtout Syg, et bien entendu tous les autres qui vont répondre où qui m'ont déjà aidé!





Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Crash serveur
« Réponse #5 le: 12 Septembre 2008, 15:55:27 »
Une chaîne de format est une chaîne de caractères qui contient des %
Exemple :
"Bonjour %s"
Elle est systématiquement suivi par des paramètres dont les valeurs seront insérées dans la chaîne finale. Il doit y avoir autant de paramètres que de % dans la chaîne de format.
Exemple :
new Name[128] = "Syg";
printf ("Bonjour %s !", Name);


donnera comme affichage
Bonjour Syg !
Le format %s à été remplacé par la valeur de la variable Name dans la chaîne finalement affichée.

Sinon, je vois le genre de code dont tu parles :
output[p - (len ? 0 : 1)] = '\0';Ça c'est l'exemple typique du mec qui croit être un très bon codeur car en une ligne il fait plein de chose mais qui en fait est nul car sont code est illisible (ou plutôt difficilement lisible).
Il faudra 3 ou 4 lignes pour rendre ce bout de code plus lisible.

Ça pourrait donner quelque chose comme ça (je n'ai pas le contexte donc il y a peut-être plus simple) :
if (len == 0)
{
   output[p+1] = '\0';
}
else
{
   output[p] = '\0';
}

Le problème de ce genre de code est que même la personne qui l'a écrit va passer plusieurs secondes (voire minutes) à le déchiffrer. Et si on cumule toutes ces secondes (ou minutes) que l'on va passer pour chaque ligne de code, on arrive très vite à beaucoup de temps perdu.

Il fut un temps ou chaque octet comptais car avec 1 Ko de mémoire (1024 octets), on ne pouvait pas se permettre de perdre de précieux octets.
Maintenant, la moindre machine à 1 Go donc il ne faut plus se priver de faire du code clair, commenté et surtout réutilisable.

++
Syg
Courtesy of GtaManiac

Hors ligne Bayshore

  • *
  • Grand Banditisme
  • Messages: 923
    • Voir le profil
Re : Crash serveur
« Réponse #6 le: 13 Septembre 2008, 23:38:53 »
Tiens en parlant de ça, est-ce qu'un if( len == 0 ) prend moins de ressources qu'un len == 0 ? ?

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Crash serveur
« Réponse #7 le: 14 Septembre 2008, 23:15:14 »
L'opérateur ? : (comme dans len ? 0 : 1) est en fait un façon condensée pour écrire un test de comparaison à 1 ou 0 (cf mon post précédent).
Donc il prend autant de ressource qu'un if mais il est beaucoup moins lisible.

++
Syg
Courtesy of GtaManiac

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Crash serveur
« Réponse #8 le: 15 Septembre 2008, 00:09:11 »
salut,

donc, en gros ce qu'il faudrait que je fasse ce serait un truc du genre:

SendFormattedMsg(playerid,color,const msg1[],const msg2[],{Float,_}:...)
{
       new j = strlen(msg1);
       new nombre_variables[2], pos_variables[j];
for(new i; i < j; i++){
            if(msg1[i] == "%"){
                  nombre_variables[0]++;
                  pos_variables[nombre_variables[0]] = i;
            }
        }
        if(!nombre_variables[0]) // on fait normal.......
        for(new i; i < nombre_variables[0]){
                switch(msg1[pos_variables[i]+1]){
                        case: s:....
}

et là je suis complètement perdu,  ;D

alors si quelqu'un aurait la gentillesse de me faire comprendre une façon plus simple ou encore comment faire comme ça

..... je serais trop content..

et merci!

++Sim++





Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Crash serveur
« Réponse #9 le: 16 Septembre 2008, 23:19:36 »
J'ai chercher pendant un bon moment la façon d'utiliser les arguments variables d'une fonction globalement, comme on peut le faire en C (c'est ce que tu as essayer de faire dans la fonction SendFormattedMsg de ton premier post).
Il semblerait que ce n'est pas possible à faire en PAWN.
En fait, il faudrait pouvoir récupérer un pointeur sur le premier argument de la liste des arguments variables. Manque de chance, la notion de pointeur n'existe pas en PAWN.

Ce que tu veux faire risque de te faire écrire une fonction de quelques centaines de lignes .... (mais il me semble que c'est la seule solution en PAWN).
Car après un % dans un chaîne de format, on retrouve le s (string), le d (decimal), le c (character), le f (float) (et je pense que c'est tout en PAWN).
Mais on peut aussi retrouver des nombres qui indiquent la taille que prendra la variable dans la chaîne finale :
printf ("Altitude : %.2f", 1234.8426);Qui affiche 1234.84.
printf ("Altitude : %4.4d", 21);Qui affiche 0021.

Et pour chaque format (d, s ou f) les nombres après le % ont une signification différente.
De plus, la fonction getarg est un peu particulière à utiliser avec les paramètres de type chaînes de caractères, il faut récupérer les caractères un par un.

Un solution plus "simple" serait de passer par un plugin écrit en C.
Bon courage

++
Syg
Courtesy of GtaManiac