Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

Messages recommandés

Posté(e)

bonjour,

 

j'ai un petit probleme pour un exercice de programmation en Java. je dois creer un pile, y faire des push , pop, la vider, l'afficher, afficher sa hauteur et la redimensionner.

je parviens a faire tout sauf ... la redimensionner. voila ce que j'ai ecrit :

 

 

static void Redim()

{

//Declaration et reservation de l'espace memoire pour le second tableau plus grand

// dans lequel seront transferes les elements

int N;

System.out.println();

System.out.print("Entrez un taille pour la pile : ");

N = Lire.i();

int[] tab2 = new int [N];

int i = 0;

 

while (i < tab.length) //on place les elements de tab dans tab2

{

tab2 = tab;

i++ ;

}//end for

 

tab = new int[N];//on reinitialise tab a la nouvelle valeur

while (i < tab.length)//on met les elements de tab2 dans tab

{

tab = tab2;

i++ ;

}//end for

 

 

}//end Redim

 

le tableau "tab" est defini comme variable globale et est initialise a une taille constante.

 

j'ai essaye de le faire de plusieurs manieres differentes mais rien n'a fonctionne.

 

 

j'espere que quelqu'un saura m'expliquer la marche a suivre, merci d'avance.

Posté(e)

Il faut remettre ton compteur i à 0 entre les 2 boucles while, sinon tu écris carrément pas au bon endroit :P

 

Autre chose, on pourrait très bien vouloir redimensionner le tableau à une taille plus petite, or, si on entre une taille plus petite que la précédente, ton code va écrire dans une zone mémoire qui n'est pas "à toi", hors des limites du nouveau tableau !

Posté(e)

Tu utilises un tableau pour faire une pile ? OUTCH !

D'un coup je comprends mieux le concept de "redimensionnement"...

... et je rejoins l'avis de leneuf

Au passage, je m'étonne du fait qu'on puisse lire/calculer une valeur puis déclarer un nouveau tableau ayant comme taille cette valeur... ce genre de manip est totalement impossible avec un langage compilé "classique" mais bon, j'ai du trop regarder de C++... Ca fonctionne, ça, en Java ??

(en fait je demande ça parce que je vais bientôt devoir m'y remettre... ce qui n'est pas pour me déplaire !!)

Posté(e)

C'est une allocation programmée, si tu utilises new, tu peux spécifier une taille qui est inconnue à la compilation, comme en C++ !

(en C++ c'est new aussi je crois)

 

et même en C : calloc(N, sizeof(bidule))

 

Par contre notre ami C.J. ne libère pas la mémoire... mais je crois qu'en Java il y a un garbage collector, qu'on le veuille ou non !

Il suffit de faire monobjet = NULL et le garbage collector "sait" qu'il faut libérer la mémoire...

Paraît qu'il n'y a aucun moyen de libérer la mémoire soi-même.

 

C'est un bon langage de fainéants :P

Posté(e)

Arf, oui, tout est dans le new en fait...

J'avais embrayé sur un truc genre " n = 12 ; int toto[n] ; " et ça, typiquement, ça marche pas... J'avais pas tilté qu'il y avait un new, et donc l'équivalent C c'était un malloc (et new aussi en C++) :-/

Et tu as parfaitement raison pour le garbage collector de la JVM, il y est et tu ne peux pas le virer (mais il me semble que tu peux quand même le piloter)...

J'aime pas les langages de fainéants. Je préfère quand ça plante à la moindre petite broutille comme ça on ne se pose pas de question quand on reprend le code... enfin... on s'en pose moins !

Posté(e) (modifié)
Je préfère quand ça plante à la moindre petite broutille comme ça on ne se pose pas de question quand on reprend le code... enfin... on s'en pose moins !

Arf, pareil, c'est pour ça que j'ai mis le JDK à la poubelle (ou au garbage collector, comme tu veux, lol :P )

Modifié par leneuf22
Posté(e) (modifié)
Il suffit de faire monobjet = NULL et le garbage collector "sait" qu'il faut libérer la mémoire...

C'est curieux quand même :-(

 

En Java il n'y a pas l'équivalent de free en C ou delete en C++... mettre NULL reviendrait à utiliser ces 2 mots-clés ?

 

J'aurais l'impression qu'en mettant NULL, je ne fais que supprimer la liaison entre le nom du tableau et l'adresse de son premier élément dans le heap.

 

Pourrais-tu m'éclairer là dessus stp car je compte bientôt commencer à faire un peu de Java et c'est assez important cette notion :P

 

D'avance merci

 

Nico

Modifié par nico_be
Posté(e)

En supprimant la liaison comme tu dis, c'est comme si tu disais "hé, GC !! viens me libérer mon tableau !"

Car il est clair pour le GC que la mémoire n'est plus utilisée, et donc il se charge lui-même de la libérer.

Posté(e)

hmmmm.....aussi ...monsieur kewlcat....lol.....

 

merci pour l'indication du " null "....mais j'ai encore un petit probeme. j'ai donc rectifie mon code et ca ne fonctionne toujours pas. ce que je dois faire en fait , c'est qu'une fois que j'ai modifie la taille de ma pile, je dois continuer a entrer des valeurs a leur suite. lorsque je fais un push, pop, ou meme lorsque je demende l'affichage de ma pile ( apres avoir fait la modification de taille )....mon programme plante ! je ne suis vraiment plus !!!!...lol

 

alors voila encore une fois mon code :

 

//*** Methode Redim ***/

static void Redim()

{

//Declaration et reservation de l'espace memoire pour le second tableau plus grand

// dans lequel seront transferes les elements

int N;

System.out.println();

System.out.print("Entrez une taille pour la pile : ");

N = Lire.i();

 

int[] tab2 = new int [tab.length];

int i = 0;

int j = 0;

 

while (i < tab.length) //on place les elements de tab dans tab2

{

tab2 = tab;

i++ ;

}//end for

 

tab = null; //efface tab

 

for (int o = 0; o < tab2.length; o++) //verifie si le tab2 a bien recu les elements

{

System.out.print(tab2[o] + " ");

}//end for

 

int[]tab = new int[N]; //on redefini tab avec une nouvelle taille lue au clavier

 

while (j < tab2.length) //on met les elements de tab2 dans tab

{

tab[j] = tab2[j];

j++ ;

}//end for

 

tab2 = null; //efface tab2

 

//Message de confirmation

System.out.println(" *** TAILLE DE LA PILE MODIFIEE *** ");

System.out.println();

}//end Redim

 

et voila ,....j'ai bien le message de confirmation mais apres ca ne va plus !

encore merci pour votre aide.

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...