IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Variable is being used without initialized ?


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 77
    Points : 39
    Points
    39
    Par défaut Variable is being used without initialized ?
    Salut!

    J'ai un petit problème avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <stdio.h>
    #include <conio.h>
    #include <windows.h>
     
    int main()
    {
    	char c;
    	int i=0;
    	char * tab;
    	printf("Tapez une chaine de caracteres : ");
    	while(c = getch() != 0x0D)
    	{
    		tab[i] = c;
    		i++;
    	}
    	printf("Retour chariot!\n\n");
    	system("PAUSE");
    	return 0;
    }
    J'ai une erreur lorsque je tape une touche au clavier alors que j'en ai aucune a la compilation :
    The variable 'tab' is being used without being initialized.

    J'aimerais bien savoir pourquoi ?

    Merci d'avance,
    ++

  2. #2
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    C'est parce que tab est déclaré comme pointeur et non pas comme un tableau.

    En C, il faut, de plus, explicitement fixer dans le source la taille du tableau, par exemple
    Formulaires XForms sur tous navigateurs sans extension à installer (architecture XRX) : http://www.agencexml.com/xsltforms/

  3. #3
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    J'ajouterais à la réponse de alain.coutures qu'il faut faire attention à la priorité des opérateurs
    Et donc il faut mettre des parenthèses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while((c = getch()) != 0x0D)
    Plus tu pédales moins fort, moins t'avances plus vite.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 77
    Points : 39
    Points
    39
    Par défaut
    Très juste pour la deuxième erreure mais pour la première je voulais en faite faire un tableau de caractère dynamique en faisant :

    char * tab;

    Une allocation de taille dynamique en mémoire selon la chaine de caractère qui est tapé.

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    J'ai une erreur lorsque je tape une touche au clavier alors que j'en ai aucune a la compilation :
    The variable 'tab' is being used without being initialized.
    Ton compilateur est mal réglé, augmente le niveau d'avertissement. Ce message aurait dû être délivré au moment de la compilation sous probablement la forme d'un avertissement. Ce type d'avertissement dénote toujours une erreur grave de programmation.

    Très juste pour la deuxième erreure mais pour la première je voulais en faite faire un tableau de caractère dynamique en faisant :
    Une allocation de taille dynamique en mémoire selon la chaine de caractère qui est tapé.
    Dans ce cas, il faut faire précéder l'utilisation par l'allocation dynamique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * tab = malloc(....);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 77
    Points : 39
    Points
    39
    Par défaut
    Oui mais c'est toujours pareil parceque même avec malloc il faut définir une taille obligatoire.

    N'y aurait il pas un moyen pour que le tableau s'adapte à la taille de la chaine de caractère saisie ?
    En C++ j'ai toujours utilisé char * tab; pour un tableau dynamique de caractères sa a toujours fonctionné la je ne vois vraiment pas pourquoi cela ne fonctionne pas...

  7. #7
    Membre actif Avatar de monwarez
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 144
    Points : 293
    Points
    293
    Par défaut
    Ce que tu peut faire, c' est agrandir ton tableau en fonction de i.
    en c++ tu pourrait créer une class Tab:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    #ifndef tab_hpp_
    #define tab_hpp_
    #include <iostream>
     
    #define T char
     
    class Tab
    {
          public:
                 Tab();
                 ~Tab();
                 void push_back(T value);
                 void pop_back();
                 void clear();
                 int size();
                 T getValue(int indices);
                 T* getTab();
          protected:
                    int _indices;
                    T *_tab,*_buf;
    };
     
    #endif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    #include "tab.hpp"
     
    Tab::Tab()
    {
              _indices = 0;
              _tab = new T[0];
              _buf = new T[0];
    }
    Tab::~Tab()
    {
               _indices = 0;
               delete[] &_tab;
               delete[] &_buf;
    }
    void Tab::push_back(T value)
    { 
         _buf = _tab;
         delete[] _tab;
         _indices++;
         _tab = new T[_indices];
         for (int i = 0;i<_indices-1;i++)
         _tab[i] = _buf[i];
         _tab[_indices] = value;
         delete[] _buf;
    }
    void Tab::pop_back()
    {
         _buf = _tab;
         delete[] _tab;
         _indices--;
         _tab = new T[_indices];
         for (int i = 0;i<_indices-1;i++)
         _tab[i] = _buf[i];
         delete[] _buf;
    }
    void Tab::clear()
    {
         while (_indices > 0)
         pop_back();
    }
    T Tab::getValue(int indices)
    {
                        return _tab[indices];
    }
    T* Tab::getTab()
    {
                    return _tab;
    }
    int Tab::size()
    {
        return _indices;
    }
    Se qui donnerait : ( code c++ ).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    #include <stdio.h>
    #include <conio.h>
    #include <windows.h>
     
    #include " tab.hpp"
    int main()
    {
    	char c;
    	//int i=0; //ne sert à rien 
    	Tab tab; // modif ici
    	printf("Tapez une chaine de caracteres : ");
    	while(c = getch() != 0x0D)
    	{
    		tab.push_back(c);
    		//i++; // ne sert à rien
    	}
    	printf("Retour chariot!\n\n");
    	system("PAUSE");
    	return 0;
    }
    Après si tu veux absolument le faire en c, il faut juste mettre toutes les variables membres de Tab dans une structure , et de remplacer les new et delete par malloc et free

  8. #8
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par barbuslex Voir le message
    N'y aurait il pas un moyen pour que le tableau s'adapte à la taille de la chaine de caractère saisie ?
    Pas en C usuel, en tout cas.
    Ce qui est couramment utilisé, c'est de lire dans un buffer de taille respectable, avec gestion d'un éventuel débordement, puis une fois la taille connue on alloue pile-poil ce qui est nécessaire.

    Après, tu peux aussi jouer à faire un realloc(+1) à chaque caractère lu, mais c'est un coup un peu risqué : risques de fragmentation mémoire sur certaines plate-formes, impact du temps de copie à chaque itération, etc.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/04/2013, 01h41
  2. Réponses: 5
    Dernier message: 03/07/2012, 16h45
  3. Réponses: 2
    Dernier message: 09/12/2011, 08h03
  4. [IDEA] Probleme de "variable is never used"
    Par nicdo77 dans le forum Environnement de Développement Intégré (EDI)
    Réponses: 2
    Dernier message: 09/08/2007, 00h53
  5. erreur:The local variable may not have been initialized
    Par wiss20000 dans le forum Langage
    Réponses: 7
    Dernier message: 22/03/2007, 15h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo