StringField indice 0

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

StringField indice 0

Message 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:
Dernière modification par Marc56 le mer. 26/mars/2014 11:50, modifié 2 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: StringField indice 0

Message 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 .... ;)
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: StringField indice 0

Message 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 :?
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: StringField indice 0

Message 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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: StringField indice 0

Message 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 ?
Dernière modification par graph100 le mer. 26/mars/2014 18:48, modifié 1 fois.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: StringField indice 0

Message 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
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: StringField indice 0

Message par graph100 »

l'aide purebasic, entièrement traduite en Français, est ta meilleure amie :lol:
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: StringField indice 0

Message par Lord Nelson »

Ou pas :mrgreen:
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: StringField indice 0

Message 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 !
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: StringField indice 0

Message 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:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: StringField indice 0

Message par Backup »

mais d'ou viens ce flou ?

est-ce due au brouillard , ou bien a ma myopie ?
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: StringField indice 0

Message 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:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: StringField indice 0

Message 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
Répondre