Gérer une case vide

Discutez d'informatique ici !
Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

Gérer une case vide

par Rockleader » 03 Fév 2014, 19:32

Bonsoir; je me pose une question d'ordre pratique.

Admettons que l'on veuille un tableau d'entier pouvant donc être négatif comme positif; l'ensemble des int au final.

Comment peut on déterminer qu'une case de ce tableau est vide ? Parce que au final il y aura toujours une valeur même si cette valeur c'est n'importe quoi.

Si on initialise le tableau en mettant par exemple toute les valeurs de ce tableau à 0. On pourrait dire ben quand on a un 0, alors la case est vide.

Mais si l'utilisateur veut rentrer la valeur 0 on a un problème car on considérera 0 comme vide.

Je ne crois pas que l'on est un moyen de savoir si une case est vide autrement qu'en passant par une valeur par défaut; mais je suis loin de tout savoir, vous avez des suggestions ?
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !



Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 03 Fév 2014, 20:10

hello,

non effectivement tu peux pas savoir.
Par case, je pense que tu entends case initialisée par l'utilisateur.
Un tableau a normalement ses cases initialisés avec le constructeur par défaut de l'élément (je suis plus trop sûr mais il me semble). Donc un tableau de int devrait contenir que des 0 en C++. de même des chaines vides si c'est un tableau de string. (j'essaie de retrouver une spec)

Si tu veux pouvoir setter une valeur plus tard qu'à l'initialisation et savoir si une valeur a été settée, alors tu peux pas utiliser des types primitifs. (tester MAX_INT, où 0 où -1, etc)
Tu peux par contre stocker tes propres types (cqui utilise pas mal plus de mémoire)
Code: Tout sélectionner
struct myInt{
 int a;
 bool setted;
 myInt(){setted=false}
 void setValue(int val){a=val;setted=true}
 bool isSet(){return setted}
}
int main(){
 myInt arr[3];
 arr[2].setValue(4);
 arr[0].isSet();//false
 arr[1].isSet();//false
 arr[2].isSet();//true and value==4
 return 0;
}

à la syntaxe près...

edit: pour C style array, j'ai une fois de plus tord
http://www.cplusplus.com/doc/tutorial/arrays/
By default, regular arrays of local scope (for example, those declared within a function) are left uninitialized. This means that none of its elements are set to any particular value; their contents are undetermined at the point the array is declared.


edit, quant à C++, c'est aussi faux.
http://stackoverflow.com/questions/2376989/why-dont-stdvectors-elements-need-a-default-constructor
Les el sont initialisés par copy ctor, sauf le premier qui appel le défaut ctor si vector ctor appelé avec un ordinal
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 03 Fév 2014, 20:20

Je suis pas sûr d'avoir saisi la totalité du code mais je pense que ça doit aller plus loin.

Parce que Tu peux avoir un tableau initialisé à une valeur

Genre

T[2]= {0}; // T[0]=0 et T[1]=0

T[0]=5; //T[0]=5 et T[1]=0

Si je suis ton raisonnement ici avec la structure T[0] est placé et donc non vide.
Mais si ta prochaine instruction est censé supprimé la valeur de la case pour la laisser vide. Tu procéderais comment ?


Je suis ok pour dire Vide n'existe pas; mais il faut bien être capable de le traduire.

Pour répondre à ta remarque; ça ne gêne pas de placer l'initialisation au début, sachant que les valeurs bougent de toute façon après.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 03 Fév 2014, 20:25

ben si tu veux gérer des cases vides au lieu d'avoir un booléen setted, tu l'appèles empty.
Et tu rajoutes une méthode empty
Code: Tout sélectionner
class MyInt{
 int a;
 bool empty;
 MyInt(){empty=true;}
 void isEmpty(){retur, empty;}
 void empty(){empty=true;}
 void setValue(int val){empty=false; a=val;}
}


bref, tu vois l'idée
Après, tu as peut être intérêt à te poser la question si il est judicieux d'utiliser un C array plutot que ton propre array...
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 03 Fév 2014, 20:28

Vaguement; va falloir que je fasse des tests ;)

EDIT: mon array sera fixe; mais sera utilisé en structure pour construire un second dynamique. Mais c'est pas ça le plus compliqué.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Benjamin
Membre Complexe
Messages: 2337
Enregistré le: 14 Avr 2008, 11:00

par Benjamin » 03 Fév 2014, 21:42

Rockleader a écrit:Vaguement; va falloir que je fasse des tests ;)

EDIT: mon array sera fixe; mais sera utilisé en structure pour construire un second dynamique. Mais c'est pas ça le plus compliqué.

Salut,

Quand j'avais besoin de ce genre de choses, j'utilisais un 2ème tableau de taille identique où je mettais que des 0, et quand on set le premier tableau, je passe à 1 la case correspondante dans le 2ème tableau.

Pour savoir si c'est vide, je fais le test de 0 ou 1 sur le deuxième tableau. Sinon, je prends la donnée dans le premier.

PS : c'est l'une des techniques utilisées pour éliminer les doublons d'une liste de chiffres.

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 03 Fév 2014, 21:56

En fait, en simplifiant l'idée de fatal error, j'ai trouvé comment faire

Il suffit de créer un tableau de 'case'

Et on déclare notre structure de case comme prenant une valeur et un booleen

Comme ça quand on a la valeur 0; on pourra toujours savoir si c'est le 0 pour vode ou la valeur avec le booleen.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 04 Fév 2014, 11:10

Par contre; je n'arrive pas à créer ma structure comme je le voudrais.

On nous as dit en cours que pour protéger ses données de structures, il fallait mettre la structure dans le .c

Dans mon .c du main j'ai donc un

Code: Tout sélectionner
typedef struct uneCase {
int val; //valeur d'une case
int vide; //valeur booleone de la case vide ou pleine
}




Je veux maintenant pouvoir créer un tableau de case; si dans mon main je fais

Code: Tout sélectionner
struct uneCase tableau[5]; // OK ça marche


Mais moi ce que je voudrais faire c'est envoyer la définition d'un tel tableau dans mon .h afin de l'utiliser dans des fonctions; hors si je déclare la même ligne de code dans mon .h le compilo ne la prend pas

Code: Tout sélectionner
In file included from tabDynamique.c:3:0:
tabDynamique.h:8:16: error: array type has incomplete element type
 struct uneCase tableau[5];


Il manquerait donc quelque chose au type du tableau struct uneCase; mais je vois pas bien quoi :(



EDIT: Solution trouvé en passant par les pointeurs ;)
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 7 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite