problème avec une variable

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

problème avec une variable

Message par GallyHC »

Bonjour,

J'ai un problème avec une variable et la j'avoue que je ne comprend pas pourquoi, en gros quand je fait comme suit aucun problème :

Code : Tout sélectionner

Define.l Dim lengthRows       ((100 - 20) / 4)              ; <===== / 4                : OK
Par contre si je met une variable pour la division (mais c'est la même chose): il me dit que la variable est déjà déclaré avec un autre type, exemple de code :

Code : Tout sélectionner

Define sizeInterger = 4
;
Define.l Dim lengthRows       ((100 - 20) / sizeInterger)   ; <===== / sizeInterger (4) : Non OK ?
En gros je faisait cela pour toujours être sur de la taille de division car "sizeInterger = SizeOf(INTEGER)", même si en principe que ce soit en x32 et x64 la taille est la même, mais cela change pas ce comportement étrange.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: problème avec une variable

Message par GallyHC »

ReBonjour,

Je me répond à moi même, même si je penses que cela est un Bug dans PB. En faisant comme suit plus de problème :

Code : Tout sélectionner

Define.i sizeInterger = SizeOf(INTEGER)
;
Define.i Dim lengthRows       ((100 - 20) / sizeInterger)
Il faut que le type du tableau soit égale au type dans le calcul de la taille du tableau, qui pour moi n'est pas une vérité absolu. je pourrait avoir un type .b et avoir une grande taille de donner donc avoir un calcul en integer ?

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: problème avec une variable

Message par Zorro »

pour ma part je pense que "define" est un non sens en Basic . :lol:
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: problème avec une variable

Message par GallyHC »

Peut être mais (comme moi) tu travail toujours avec "EnableExplicit", tu es bien obliger de déclarer tes variables non?

GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: problème avec une variable

Message par microdevweb »

En c un tableau ne peut être alloué avec une variable on utilise

Code : Tout sélectionner

#define N_TAB 20
int tab[N_TAB];
Il en peut-être de même en PB

Code : Tout sélectionner

#N_TAB 30
Define.i Dim tab(#N_TAB)
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: problème avec une variable

Message par GallyHC »

En recherchant un peu, en C je trouve un code d'exemple ou l'on passe en variable la taille d'un tableau :

Code : Tout sélectionner

int main(int argc, char *argv[])
{
    int nombreDAmis = 0, i = 0;
    int* ageAmis = NULL; // Ce pointeur va servir de tableau après l'appel du malloc

    // On demande le nombre d'amis à l'utilisateur
    printf("Combien d'amis avez-vous ? ");
    scanf("%d", &nombreDAmis);

    if (nombreDAmis > 0) // Il faut qu'il ait au moins un ami (je le plains un peu sinon :p)
    {
        ageAmis = malloc(nombreDAmis * sizeof(int)); // On alloue de la mémoire pour le tableau
        if (ageAmis == NULL) // On vérifie si l'allocation a marché ou non
        {
            exit(0); // On arrête tout
        }

        // On demande l'âge des amis un à un
        for (i = 0 ; i < nombreDAmis ; i++)
        {
            printf("Quel age a l'ami numero %d ? ", i + 1);
            scanf("%d", &ageAmis[i]);
        }

        // On affiche les âges stockés un à un
        printf("\n\nVos amis ont les ages suivants :\n");
        for (i = 0 ; i < nombreDAmis ; i++)
        {
            printf("%d ans\n", ageAmis[i]);
        }

        // On libère la mémoire allouée avec malloc, on n'en a plus besoin
        free(ageAmis);
    }

    return 0;
}
Même si cela passe par les pointers, en finalité tu as bien "printf("%d ans\n", ageAmis);"
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: problème avec une variable

Message par Marc56 »

Pour Define, il faut préciser le type
Define.<type> [<variable> [= <expression>]

Et pour calculer, il faut que sizeInterger soit du même type, sinon il faut faire un transtypage.

Code : Tout sélectionner

Define sizeInterger.l = 4
;
Define.l Dim lengthRows       ((100 - 20) / sizeInterger)
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: problème avec une variable

Message par microdevweb »

Oui en allocation dynamique, d'ailleurs pour les gros tableau il vaut mieux utilisé l'allocation dynamique car l'os n'adresse pas les variables statiques et dynamique de la même manière et un gros tableau en statique provoque des bugs. (en c du moins)
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: problème avec une variable

Message par Zorro »

GallyHC a écrit :Peut être mais (comme moi) tu travail toujours avec "EnableExplicit", tu es bien obliger de déclarer tes variables non?

GallyHC
c'est pourquoi je pense que "EnableExplicit" est un non sens en Basic aussi :lol: !!

bon , plus serieusement

beaucoup de codeurs venant d'autres langage assimile le "Define" a une declaration !
ce n'est pas le cas !!
en Basic et bien sur en Purebasic , on a pas a déclarer une variable pour pouvoir s'en servir !

Define Permet d'assigner le même type de données à une série de variables.
il ne sert qu'a Attribuer (a Définir) un Type pour une variable

le seul avantage de ça c'est qu'on peut séparer par une virgule les attribution de Type ...

mais on peut aussi tout autant mettre en debut de code
variable.b =#False : toto.s="coucou"

cela sera tout autant valable !! :)


ne confondez pas DECLARATION de variable , avec ATTRIBUTION d'un type !
La déclaration d'une variable en PureBasic se fait en la nommant. Les variables n'ont pas besoin d'être explicitement déclarées et peuvent être utilisées "à la volée".
define ne sert qu'a Attribuer un TYPE ce n'est pas a proprement parler une declaration (il y a d'ailleurs une legere erreur dans la DOC a ce sujet )


EnableExplicit est une directive de compilation
qui oblige a utiliser Define, ou global qui semble rendre obligatoire la déclaration

mais en fait ça rend obligatoire la définition d'une variable !!
le but etant d'eviter d'utiliser plusieurs fois le meme nom avec des valeurs differente (ou type)

ça ne fait pas partie du langage a proprement parler, c'est une contrainte que propose le compilateur ..
on peut tre bien s'en passer , si on ne se melange pas les pinceaux avec les noms des variables !

je vois ça comme une bequille pour ceux qui code mal , parcequ'en principe si tu sais ce que tu codes
tu n'as pas de raison d'utiliser 2 fois le meme nom de variable pour ces choses differentes ..

sauf pour ceux qui comme moi , utilisent certains nom de variable a portée courte , que j'appel des variables "mouchoir"
comme le fameux "i" des boucles for-Next ..


bref.... en Basic les DECLARATIONs ne sont pas obligatoire (et n'existe pas en Basic et Purebasic)
et DEFINE ne sert pas a déclarer une variable , mais a DEFINIR un Type a la variable .... voila voila :)
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: problème avec une variable

Message par Marc56 »

Define est utile aussi pour sécuriser un code.

Code : Tout sélectionner

Define a.s

a = 1

; [COMPILER] Ligne 3: Impossible d'ecrire un nombre dans une chaine de caracteres.
Combien de fois on a des résutlats bizarres parce qu'on a par exemple oublié de préciser un décimal pour le résultat d'une division et qu'on se retrouve avec un entier.
Perso je le met maintenant systématiquement et je consomme moins d'aspirine. :)
Dernière modification par Marc56 le sam. 11/janv./2020 11:35, modifié 1 fois.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: problème avec une variable

Message par GallyHC »

sur le principe, je suis tout a fait d'accord, mais dans les langages basic "évolué", tu as bien toujours le principe de typer/Déclarer une variable (vb.net par exemple avec "Option Explicit"). Après quand tu es dans une société, on te dit aussi de le faire, pour éviter les erreurs, car ton prog c'est pas 100 lignes non plus (dans un exemple, dans ma boite on a un prob en vb.net, qui fait 45000 lignes a peu près).

Après dans une IDE évoluer, le fait de Déclarer les variable explicitement permet les recherches de celle-ci dans certain mode et dans toutes les classes. Mais bon la ce n'est pas le cas de l'IDE dans PB.

En PB on peu Typer et déclarer les variables, exemple :

Code : Tout sélectionner

Define titi.b, toto.i, truc.c
même si tu as raison de dire que d'utiliser Define pour une série de variable est mieux.

Et oui dans tout les cas, le problème vient bien de déclare.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: problème avec une variable

Message par Zorro »

@Marc56 c'est pourquoi perso je code toujours en Specifiant le type d'une variables

si j'ai une variable qui s'appelerio toto.s
partout ou je l'utilise , je l'appel "toto.s" deja le fait de voir le type permet de ne jamais se gourer

encore une fois, c'est surtout une maniere d'ecrire son code qui fait la difference :)
voir le topic "beauté du code" que j'avais ouvert (mais qui m'a peut etre aussi été piqué )
qui parle justement de toutes ces choses ...

les manies de codage sont pour beaucoup dans le resultat d'un code , et permet de le reprendre des années apres ... :)
pour ma part les enableExplicite et autre Define sont surtout des artifices qu'on peut se passer !

mais si certains ont besoin d'etre cadrés , je peux comprendre . toutefois , il ne s'agit pas de DECLARATION j'insiste
parceque le fait de ne pas avoir a déclarer est le FONDEMENT de base du BASIC ! et je suis un integriste du Basic quelque part :lol:

même si tu as raison de dire que d'utiliser Define pour une série de variable est mieux.
non je ne dis pas que c'est mieux, je dis que DEFINE n'est pas une declaration , c'est une DEFINITION DE TYPE !!

tu peux aussi ecrire : Global TOTO.S ça fera EXACTEMENT la meme chose :)

pour reprendre l'exemple de Marc56 si tu fais

Code : Tout sélectionner


Global a.s

a = 1
ou bien

Code : Tout sélectionner


a.s =""

a = 1

tu aura le meme résultat !! (une erreur ) ; ce qui prouve que Define n'est pas une declaration !
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: problème avec une variable

Message par Marc56 »

Pour les chaines, je déclare à nouveau « à l'ancienne » c'est à dire $ plutôt que .s ça rend le code encore plus simple à lire.
(Et puis j'aime pas voir des . partout dans les noms, ça me fait penser à de la POO, pouah :mrgreen: )
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: problème avec une variable

Message par Zorro »

:lol: heureusement que Fred a utilisé "\" au lieu de "." pour les Structures alors :)

ps , faire gaffe au "$" pour les variables chaine , a une epoque pour certaine API windows
ça n'aimait pas les "$" , ... maintenant je n'utilise plus que ".s" :)
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: problème avec une variable

Message par GallyHC »

Entre "Global a.s" et "a.s =""", tu n'as pas non plus la même porté de variable non plus.
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Répondre