realloc en c++
Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

realloc en c++



  1. #1
    CMOSHC

    realloc en c++


    ------

    bjr tout le monde
    je voulais faire un programme qui va agrandire la taille d'un d'un tableau ton que je ne saisi pas par exemple 0 , voice le code :

    #include <stdlib.h>
    // pour modifier la taille d'un tableau , possiblité d'utiliser resize de vector ,ici on utilise realloc qui doit étre utilisé avec malloc
    //ici m est un pointeur , si m=null , realloc joue le role de malloc , et si b*sizeof = 0 elle joue le role de free
    using namespace std;

    int main()
    {
    int b=0,x;
    int *T,*m=NULL;
    T=(int*) malloc (b*sizeof(int));// allocation dynamique
    cin>>x;// lire avant le test
    while (x!=0)
    {
    T[b]=x;
    b++;
    m=(int *)realloc((int *)T,(b)*sizeof(int));// reallocation
    T=m;
    m=NULL;//rendre m null pour refaire realloc
    cin>>x;
    }

    return 0;
    }

    le prob est que lors de l'execution ,d'ailleur ya pa d'err de compilation , apres que je saisi par exemple 6 nombres l'execution s'arrete me desisant ca a cessé de fonctionner .
    Est ce que vous avec un idée d'ou vient le prob ?

    thnk u brothers

    -----

  2. #2
    grosmatou75001

    Re : realloc en c++

    Le code entre balises [code ] [/ code] (sans espaces), sinon c'est illisible...

  3. #3
    Paraboloide_Hyperbolique

    Re : realloc en c++

    Bonsoir,

    Dans votre code (peu lisible mais heureusement assez cours), je ne vois pas pourquoi vous posez
    Code:
    m=NULL;//rendre m null pour refaire realloc
    .
    Cela a d'ailleurs pour effet que le pointeur T soit aussi NULL. Dès lors le retour en début de boucle
    Code:
    T[b]=x;
    il y a donc initialisation d'un espace mémoire qui n'existe pas... (et une fuite mémoire par ailleurs je pense.)

    Pour rappel, realloc réalloue (si nécessaire) de la mémoire à partir d'un bloc (éventuellement) non vide et renvoie un pointeur sur la mémoire réallouée.
    Si nécessaire, regardez la doc de realloc. J'en connais bien une, mais j'hésite à vous en donner le lien puisqu'on y résout précisément votre exercice; et que se serait dès lors un mauvais service à vous rendre.

  4. #4
    grosmatou75001

    Re : realloc en c++

    Bon, pour cette fois... Je précise que je fais du C, mais à ma connaissance à part quelque casts en plus ça ne change rien.

    Code:
    int main()
    {
    	
    	int b=0,x;
    	int *T,*m=NULL;
    	T=(int*) malloc (b*sizeof(int));// allocation dynamique
    	cin>>x;// lire avant le test
    	while (x!=0)
    	{
    		T[b]=x;
    		b++;
    		m=(int *)realloc((int *)T,(b)*sizeof(int));// reallocation
    		T=m;
    		m=NULL;//rendre m null pour refaire realloc
    		cin>>x;
    	}
    
    	return 0;
    }
    Déjà les noms de variables ne sont pas très parlants... Ton b tu devrais l'initialiser à 1 puisque tu écrits dans le tableau avant de faire un b++ et un realloc pour réserver plus de mémoire. Après faut faire gaffe aux indexes, si tu as b éléments l'indexe du dernier élément est b-1! Et puis malloc et realloc retournent des valeurs qu'il convient de vérifier (échec/succès de l'opération?). Écrire NULL dans m est parfaitement inutile.
    Dernière modification par grosmatou75001 ; 14/10/2013 à 18h58.

  5. A voir en vidéo sur Futura
  6. #5
    JPL
    Responsable des forums

    Re : realloc en c++

    Citation Envoyé par grosmatou75001 Voir le message
    Le code entre balises [code ] [/ code] (sans espaces), sinon c'est illisible...
    Non, c'est pire que ça : le code n'est pas indenté à l'origine ! Quand il l'est il y a toujours une bonne poire de modérateur pour rajouter les balises.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  7. #6
    grosmatou75001

    Re : realloc en c++

    Citation Envoyé par Paraboloide_Hyperbolique Voir le message
    je ne vois pas pourquoi vous posez
    Code:
    m=NULL;//rendre m null pour refaire realloc
    .
    Cela a d'ailleurs pour effet que le pointeur T soit aussi NULL.
    Euh... Où tu vois ça toi?

  8. #7
    CMOSHC

    Re : realloc en c++

    merci beaucoup j'ai pris compte de vos remarque et ca a marché

  9. #8
    lou_ibmix_xi

    Re : realloc en c++

    Attention, "realloc" est une fonction "C", et tu fais du "C++", et mélanger les deux types de gestion de mémoire est une mauvaise idée, et mélanger les appels sur un même pointeur est fortement déconseillé. Donc en c++ on utilise "new" ou "new[]" à la place de "malloc", et "delete" ou "delete[]" à la place de "free".
    Malheureusement pour toi il n'y a pas de traduction directe de "realloc" en C++, donc tu as le choix entre les possibilités suivantes:
    - créé ton opérateur / méthode "realloc" en combinant un "delete" puis un "new" (ce que la plupart des implémentations de "realloc" font), ou de manière plus hardcore en allant tripatouiller le "tas" (heap)
    - utiliser une classe / template redimensionnable comme "std::vector" par exemple
    - utiliser "malloc/realloc/free" pour cette classe seulement... mais attention la maintenance risque de devenir compliquée.

  10. #9
    Paraboloide_Hyperbolique

    Re : realloc en c++

    Citation Envoyé par grosmatou75001 Voir le message
    Euh... Où tu vois ça toi?
    Mince, j'ai mal lu le code (et je devais être fatigué). Mon message précédent (#3) est incorrect.

  11. #10
    grosmatou75001

    Re : realloc en c++

    L'erreur est humaine...

Discussions similaires

  1. [C] Realloc
    Par Nightly41 dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 01/04/2013, 21h52