XDamienX007

[Résolu] strcat crash!

11 messages dans ce sujet

Bonjour !

 

Je suis face à un problème sur mon script, la fonction strcat me fait crash mon jeu (pas le serveur, juste mon jeu).

En effet quand j'exécute ma commande, mon jeu plante.

 

Voici le contenu de cette commande:

	if (strcmp("/launch", cmdtext, true, 10) == 0)
	{
	    if(pInfo[playerid][adminlvl] <= 0)
	    {
			SendClientMessage(playerid, MSG_ERROR, "Vous n'avez pas accès à cette commande !");
			return 1;
		}
		new list[256];
		for(new i=0; i < 5; i++)
		{
		    new txt[35];
		    switch(rbInfo[i][status])
		    {
		        case RB_NP:
		        {
		            format(txt, sizeof(txt), "{FF0000}(NR) Choix N°%s\n", i);
		            strcat(list, txt, sizeof(list));
		        }
		        case RB_W:
		        {
		            format(txt, sizeof(txt), "{FFFF00}(W) Choix N°%s\n", i);
		            strcat(list, txt, sizeof(list));
		        }
		        case RB_L:
		        {
		            format(txt, sizeof(txt), "{00FF00}(L) Choix N°%s\n", i);
		            strcat(list, txt, sizeof(list));
		        }
		        case RB_F:
		        {
		        	format(txt, sizeof(txt), "{FFFFFF}(F) Choix N°%s\n", i);
		            strcat(list, txt, sizeof(list));
		        }
		    }
		}

		ShowPlayerDialog(playerid, RB_TOLAUNCH, DIALOG_STYLE_LIST, "Choix",
		    list, "Sélectionner", "Annuler");
	}

J'avais essayé avec ceci à la place:

case RB_NP:
{
	format(list, sizeof(list), "%s{FF0000}(NR) Choix N°%s\n", list, i);
}

Mais j'avais un résultat du genre:

Citation

Choix N°

Choix N°Choix N°

Choix N°Choix N°

 

Donc j'ai préféré utiliser strcat. Mais, ça plante !

 

Je précise que j'ai essayé en mettant des break; à la fin de chaque case, mais ça ne m'affichait que le premier choix (bah oui ça coupait le for, pas le switch !)

 

Merci d'avance :)

Modifié par XDamienX007

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a une heure, XDamienX007 a dit :

Bonjour !

 

Je suis face à un problème sur mon script, la fonction strcat me fait crash mon jeu (pas le serveur, juste mon jeu).

En effet quand j'exécute ma commande, mon jeu plante.

 

Le problème est le suivant : "i" est une variable de type entier et tu utilises le spécificateur %s, qui lui est utilisé pour les chaînes de caractères.

Edit : break ne s'utilise que pour les boucles, contrairement aux autres langages.

Partager ce message


Lien à poster
Partager sur d’autres sites

Roh je suis le pire xD

J'avais bien vu sur les forum que ça causait des crashs, mais je pensais pas avoir fait une erreur si bête dans mon code ^^

Je test ça demain, merci !

Partager ce message


Lien à poster
Partager sur d’autres sites

Alors, j'ai changé en %d, ça a marché.

J'ai déplacé le code dans une fonction, et bah ça marche plus ! x)

Une idée de pourquoi ça pourrait encore crash ?

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 7 heures, XDamienX007 a dit :

Alors, j'ai changé en %d, ça a marché.

J'ai déplacé le code dans une fonction, et bah ça marche plus ! x)

Une idée de pourquoi ça pourrait encore crash ?

 

Tu peux me montrer le code ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Il n'y a pas eu grandes modifications:

Évidemment j'ai changé tout ce qui concerne mon projet top secret :ph34r:, j'ai juste mis "Choix" et "Choice" à la place :P

 

Révélation
public ShowAdminListOfChoice(playerid)
{
	new list[256];
	for(new i=0; i < 5; i++)
	{
		new txt[35];
		switch(rbInfo[i][status])
		{
		    case RB_NP:
		    {
		        format(txt, sizeof(txt), "{FF0000}(NR) Choix N°%d (0/%d)\n", i, MAX_RB_PLAYERS);
		        strcat(list, txt, sizeof(list));
		    }
		    case RB_W:
		    {
		        format(txt, sizeof(txt), "{FFFF00}(W) Choix N°%d (0/%d)\n", i, MAX_RB_PLAYERS);
		        strcat(list, txt, sizeof(list));
		    }
		    case RB_L:
		    {
		        format(txt, sizeof(txt), "{00FF00}(L) Choix N°%d (0/%d)\n", i, MAX_RB_PLAYERS);
		        strcat(list, txt, sizeof(list));
		    }
		    case RB_F:
		    {
		    	format(txt, sizeof(txt), "{FFFFFF}(F) Choix N°%d (0/%d)\n", i, MAX_RB_PLAYERS);
		        strcat(list, txt, sizeof(list));
		    }
		}
	}
	ShowPlayerDialog(playerid, RB_TOEDIT, DIALOG_STYLE_LIST, "Choix",
	    list, "Sélectionner", "Annuler");

}

 

Merci de ta réponse rapide !

Partager ce message


Lien à poster
Partager sur d’autres sites

J’suis sur mon iPhone donc j’ai peut-être pas vu où est le problème.

 

Pourquoi c’est une fonction publique ?

Peux-tu me montrer le code où tu appelles cette fonction ?

As-tu tenté de mettre des print/printf pour debug ?

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Car elle n'est pas privée :D

En vrai je sais pas, je n'ai pas vraiment réfléchi à la question du public/private.

 

	if (strcmp("/gerer", cmdtext, true, 10) == 0)
	{
	    if(pInfo[playerid][adminlvl] <= 0)
	    {
			SendClientMessage(playerid, MSG_ERROR, "Vous n'avez pas accès à cette commande !");
			return 1;
		}
		ShowAdminListOfChoice(playerid);
		return 1;
	}

Et là:

		case RB_EDIT:
		{
		    if(!response)
		    {
		        ShowAdminListOfChoice(playerid);
		        return 0;
			}
.......

J'essaye ce soir avec des printf :)

Partager ce message


Lien à poster
Partager sur d’autres sites

@XDamienX007

Je t'ai modifié le nom de ta fonction que tu avais oubliée de renommer dans ton message, j'suis gentil j'en parlerai à personne. :P

Ouais ben dans ton cas j'vois toujours d'où ça pourrait venir ou alors je suis aveugle, tente avec des print et redis-moi ça ;) 

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci bien <3

 

Alors, j'ai mis des printfs, et ce qui est étonnant c'est que tout vas bien !

Fonction avec les printf:

Révélation
public ShowAdminListOfChoice(playerid)
{
	new list[256];
	for(new i=0; i < 5; i++)
	{
		new txt[35];
		printf("_start of ShowAdminListOfChoice: status[%i]=%d", i, rbInfo[i][status]);
		switch(rbInfo[i][status])
		{
// cases ...
		}
		printf("_end of ShowAdminListOfChoice: status[%i]=%d", i, rbInfo[i][status]);
	}
	ShowPlayerDialog(playerid, RB_TOEDIT, DIALOG_STYLE_LIST, "Choix",
	    list, "Sélectionner", "Annuler");

}

 

Sortie:

Citation

[20:52:35] _start of ShowAdminListOfChoice: status[0]=1
[20:52:35] _end of ShowAdminListOfChoice: status[0]=1
[20:52:35] _start of ShowAdminListOfChoice: status[1]=1
[20:52:35] _end of ShowAdminListOfChoice: status[1]=1
[20:52:35] _start of ShowAdminListOfChoice: status[2]=1
[20:52:35] _end of ShowAdminListOfChoice: status[2]=1
[20:52:35] _start of ShowAdminListOfChoice: status[3]=1
[20:52:35] _end of ShowAdminListOfChoice: status[3]=1
[20:52:35] _start of ShowAdminListOfChoice: status[4]=1
[20:52:35] _end of ShowAdminListOfChoice: status[4]=1
[20:52:50] [part] Mick_Miller has left the server (0:0)


J'ai bien une boucle qui s'effectue 5 fois. Toutes mes valeurs de status sont bien égales à 1.

Je vais tester avec des printf en sortie de la fonction. :)

 

La dernière ligne de la sortie c'est moi qui crash, donc le crash est détecté 15s après coup, si ça intéresse quelqu'un :)



EDIT: Problème trouvé !
Le tableau recueillant chaque ligne (txt[35]) n'était pas assez grand !

Du coup il manquait quelques caractères, dont le \n de la fin.

Ce qui fait que quand j'appelais ShowPlayerDialog, je lui demandais d'afficher une seule ligne de 170 caractères... :l

 

Voilà voilà ... :P

 

Pour trouver le problème j'ai print le résultat de txt dans la boucle, et le résultat de list avant de faire ShowPlayerDialog.

Merci à @C_far pour son aide :)

Modifié par XDamienX007
problème résolu

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 35 minutes, XDamienX007 a dit :

EDIT: Problème trouvé !
Le tableau recueillant chaque ligne (txt[35]) n'était pas assez grand !

Du coup il manquait quelques caractères, dont le \n de la fin.

Ce qui fait que quand j'appelais ShowPlayerDialog, je lui demandais d'afficher une seule ligne de 170 caractères... :l

 

Effectivement je ne pouvais pas deviner sans connaître le contenu exact des données à formater, du coup printf t'a surement été utile pour trouver le problème.

 

Je lock et déplace ! ;)

Partager ce message


Lien à poster
Partager sur d’autres sites
Guest
Ce sujet ne peut plus recevoir de nouvelles réponses.