Page 1 sur 1

StringField indice 0

Publié : mer. 26/mars/2014 11:24
par Marc56
Hello,

StringField est une fonction très intéressante, cependant, il est dommage que l'affectation des indices commence à 1 alors que le même type de fonction dans d'autres langages commence souvent à 0 ce qui est parfois utile.

Dans ma petite pendulette, je met le jour en lettres en utilisant la très classique fonction DayOfWeek.
StringField permet de faire l'affectation rapide, sauf que dimanche = 0 :? et StringField commence à 1

J'ai donc fait une bidouille (moche) :roll: , c'est à dire mettre Dimanche en dernière position et mettre un if pour réaffecter 0 au 7 ieme élément (je m'explique sans doute mal)

Code : Tout sélectionner

  JourSem = DayOfWeek(Date()) : If JourSem = 0 : JourSem = 7 : EndIf
  DateJour$ = StringField("Lundi , Mardi , Mercredi , Jeudi , Vendredi , Samedi, Dimanche", JourSem, ",") +
              Day(Date()) + 
              StringField(" Janvier , Février , Mars , Avril , Mai , Juin , Juillet , Août , Septembre , Octobre , Novembre , Décembre ", Month(Date()), ",") +
              Year(Date())
Debug "Date du jour: " + DateJour$
Ça marche, mais esthétiquement c'est laid 8O

J'avais aussi fait avant, ceci:

Code : Tout sélectionner

Global Dim JourTXT$( 7)  
Global Dim MoisTXT$(12)

DataSection
   JourSemaine:  : Data.s "Dimanche ", "Lundi ", "Mardi ", "Mercredi ", "Jeudi ", "Vendredi ", "Samedi"
   Mois:         : Data.s " Janvier ", " Février ", " Mars ", " Avril ", " Mai ", " Juin ", " Juillet ", " Août ", " Septembre ", " Octobre " , " Novembre ", " Décembre " 
 EndDataSection
 
 Restore JourSemaine   : For i = 0 To  6 : Read.s JourTXT$(i)  : Next i   
 Restore Mois          : For i = 1 To 12 : Read.s MoisTXT$(i)  : Next i
Techniquement satisfaisant, mais ça prend pas mal de place pour juste affecter 7 et 12 valeurs :wink:

Il y a aussi la façon old school

Code : Tout sélectionner

JourTXT(0) = "Dimanche"
JourTXT(1) = "Lundi"
etc
Facile à lire, mais moche :|

Dans certains langages, comme Perl, on peut faire ceci

Code : Tout sélectionner

my @Jour = ( "Dimanche", "Lundi", "Mardi", ... )
et hop, c'est plié: le premier est à l'indice 0, etc (et si on veut commencer à 1 il suffit de laisser une valeur nulle au début)

Code : Tout sélectionner

my @Jour = ( "", "Lundi", "Mardi", ... )
Ce type de remplissage de tableau serait bien, car ça va vite.

Code : Tout sélectionner

JourTxt$() = ("Dimanche", "Lundi", ...)

Avoir une syntaxe de ce type serait super, mais c'est peut-être beaucoup à programmer ?

D'où ma suggestion: ajouter un paramètre optionnel à StringField pour lui indiquer de commencer à 0 et non pas 1
Resultat$ = StringField(Chaine$, Index, Delimiteur$)
Donnerait quelque-chose comme ça:
Resultat$ = StringField(Chaine$, Index, Delimiteur$ [, 0])

En mettant le dernier paramètre comme optionnel, on assure la compatibilité ascendante.

Cela dit, je ne sais pas si c'est facile à réaliser ou très complexe pour éventuellement peu de demandes. (j'ai vu pas mal de sources où il faut bidouiller pour utiliser l'indice 0)

:wink:

Re: StringField indice 0

Publié : mer. 26/mars/2014 11:36
par Backup
je dirai, qu'une fonction OptionBase(0) ou OptionBase(1)

pour toutes les fonctions de la librairie String .... serai un plus (il me semble avoir fait une demande de ce genre.... il y a....

il suffirai alors d'utiliser OptionBase(1) , juste avant la fonction Stringfield() ...
et a la demande OptionBase(0) pour repasser en mode depart a l'indice 0 :)

bien sur l'option OptionBase marcherai aussi pour les Tableaux .... ;)

Re: StringField indice 0

Publié : mer. 26/mars/2014 11:49
par Lord Nelson
C'est vraie qu'ont est très vite perdus avec les diverses indices qui commence soit à 0 soit à 1.
Soit tout commence à 0, soit tous commence à 1 et point finale :wink:

Car si tel commande commence à 0 puis une autre a 1 , etc, on est vite perdus :?

Re: StringField indice 0

Publié : mer. 26/mars/2014 15:23
par Ar-S
Oui ça a fait l'objet de remarque. Ce genre d'initialisation à 0 1 ou -1 est susceptible de générer des erreurs cons de sortie de tableau.
Après tu peux te créer une procedure MyStringfield(depart) que tu formates comme tu l'entends.

Re: StringField indice 0

Publié : mer. 26/mars/2014 15:58
par graph100
la totalité des fonctions de chaine commencent à 1 pour le premier caractère.
Cela fait du sens car lorsque tu fais du parcours de chaine il te faut la position du caractère et non un autre indice.

Si tu veux que stringfield commence à 0, (qui, soit dit en passant indique qu'il n'y a pas de champ), ben utilise

Code : Tout sélectionner

StringField(chaine$), sep$, index + 1
problème réglé !

Code : Tout sélectionner

	JourSem = DayOfWeek(Date())
	DateJour$ = StringField("Dimanche, Lundi , Mardi , Mercredi , Jeudi , Vendredi , Samedi", JourSem+1, ",") + 
	Day(Date()) +  
	StringField(" Janvier , Février , Mars , Avril , Mai , Juin , Juillet , Août , Septembre , Octobre , Novembre , Décembre ", Month(Date()), ",") + 
	Year(Date()) 
	Debug "Date du jour: " + DateJour$
Ton soucis c'est pas plutot avec la fonction DayOfWeek() qui rend la semaine anglaise ?

Re: StringField indice 0

Publié : mer. 26/mars/2014 17:40
par Marc56
Ta solution fonctionne très bien, et est simple. Effectivement il suffit de faire un offset de 1 :)

Ce qui m'a troublé dans cette fonction c'est qu'elle ressemble à la fonction split (de Perl, AWK et autres) pour laquelle le 'saucissonnage' de chaine de caractère affecte le premier champs à l'indice 0 (tout comme pour les listes chainées de PB)

En tout cas, merci.
:D

Re: StringField indice 0

Publié : mer. 26/mars/2014 18:49
par graph100
l'aide purebasic, entièrement traduite en Français, est ta meilleure amie :lol:

Re: StringField indice 0

Publié : mer. 26/mars/2014 19:03
par Lord Nelson
Ou pas :mrgreen:

Re: StringField indice 0

Publié : mer. 26/mars/2014 22:35
par graph100
Ca c'est utile Mr Nelson ! Quand un soucis, l'aide est mon premier recours. Et Ensuite !! seulement ensuite je viens sur le forum pour poser une question réfléchie, en ayant cherché partout avant !

Re: StringField indice 0

Publié : jeu. 27/mars/2014 10:17
par Lord Nelson
Moi aussi j'aime bien l'aide de PureBasic qui à un grand mérite je trouve, peut de langage en apporte une aussi propre et clair a ma connaissance
et en français qui plus est, mais elle est parfois un peut flou et c'est pas facile d'appréhender certain aspect voilà d’où ma réponse :lol:

Re: StringField indice 0

Publié : jeu. 27/mars/2014 10:21
par Backup
mais d'ou viens ce flou ?

est-ce due au brouillard , ou bien a ma myopie ?

Re: StringField indice 0

Publié : jeu. 27/mars/2014 11:15
par Marc56
( On a complètement dérivé de l'idée initiale :roll: )

Pourquoi ne peut-on pas en PB initialiser les valeurs d'un tableau immédiatement lors de sa déclaration ?
La plupart des langages de programmation permettent quelque chose comme ceci:

Code : Tout sélectionner

Global Dim JourSem$(7) = {"Dimanche", "Lundi", "Mardi", (etc) }
C'est quand même plus rapide et lisible de tout faire en une seul ligne ? (quand on a peu de valeurs à initialiser)
(à moins qu'il y ait une raison technique ou que j'ai mal lu la doc?)

:wink:

Re: StringField indice 0

Publié : jeu. 27/mars/2014 15:10
par Backup
Marc56 a écrit :( On a complètement dérivé de l'idée initiale :roll: )

Pourquoi ne peut-on pas en PB initialiser les valeurs d'un tableau immédiatement lors de sa déclaration ?
parceque Purebasic est un basic ! :roll:

et qu'en basic un tableau s'initialise comme ceci :

Code : Tout sélectionner

Dim tableau(19)
for i=0 to 19
	tableau(i)=random(100)
Next i
; on verifie
debug tableau(8)
; Epb

cependant , l'utilisation de Stringfield() , peut etre vu comme un tableau a une dimension ! :

Code : Tout sélectionner

tableau.s="Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi,Dimanche" 

; on va afficher le contenu de notre Pseudo Tableau

For i=1 to 7
	debug StringField(tableau.s,i,",") ;
Next i
; Epb


sinon , tu peux aussi utiliser les Lists Chainée ... les maps ...etc .. voir Doc