2016-11-02 1 views
0

Je code suivant cppComment utiliser realloc dans cpp

#include <stdio.h>   /*utiliser printf*/ 
#include <fcntl.h> 
#include <math.h>   /*utiliser pour les formules de math*/ 
#include <malloc.h> 
#include <iostream.h> 
#include <assert.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h> 

    /* Le type nombre complexe */ 
typedef struct { 
    double Preel; 
    double Pimaginaire; 
} COMPLEXE; 

#define ALLOC_ERROR 1 

void indienne(double *MatE, int tE, int nE, double *SortieExp, double *Tempbis) 
{ 
    double *TempE=NULL, *SortieE=NULL; 
    int *dec=NULL; 
    int i, tampon, kE; 
    kE=(int)(log(nE)/log(2)); 
    if(nE==8) 
    kE=3; 

    /* ALLOCATION DES MATRICES*/ 

    if (!(TempE = (double *)calloc(tE * tE, sizeof(double)))) 
    exit(ALLOC_ERROR); 

    printf("check1 te=%d, nE=%d",tE,nE); 

    if (!(dec = (int *)realloc(kE , sizeof(int)))) 
    exit(ALLOC_ERROR); 

    if (!(SortieE = (double *)calloc(tE * tE, sizeof(double)))) 
    exit(ALLOC_ERROR); 

    printf("check2 te=%d",tE); 
    memcpy(TempE,MatE,tE * tE * sizeof(double)); 

    for (i=0; i<tE; i++) 
    *(Tempbis+(tE * i) + i) = 1.0; 

    if (nE==1) 
    { 
    memcpy(SortieExp, MatE, tE*tE*sizeof(double)); 
    } 
    else 
    { 
    printf("kE=%d, nE=%d\n", kE, nE); 
    if (nE%2==0) 
     decompose(kE, nE,dec); 
    else 
     decompose(kE, nE-1, dec); 

    for (i=0; i<kE; i++) 
    { 
     carre(TempE, tE, SortieE); 
     memcpy(TempE, SortieE, tE*tE*sizeof(double)); 
     tampon=*(dec+i); 

     if (tampon==1) 
     { 
     mult(Tempbis, tE, tE, SortieE, tE, tE, SortieExp); 
     memcpy(Tempbis, SortieExp, tE*tE*sizeof(double)); 
     } 
    } 
    if (nE%2 !=0) 
    { 
     memcpy(Tempbis, SortieExp, tE*tE*sizeof(double)); 
     mult(Tempbis, tE, tE, MatE, tE, tE, SortieExp); 
    } 
    } 
    free(TempE); 
    free(SortieE); 
    free(dec); 
} 

Lorsque je compile le code suivant occurres d'erreur

conversion non valide de 'int' à 'void *' [-fpermissive] |

qui est sur le point suivant ligne de code

if (!(dec = (int *)realloc(kE , sizeof(int)))) 

Comment puis-je supprimer cette erreur?

+2

La fonction 'realloc()' ne peut s'appliquer qu'à un tableau encore alloué avec la fonction 'malloc() 'ou' calloc() '. La variable 'kE' est un entier alloué sur la pile. –

Répondre

-1

Try sans le faire comme ceci:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    int *pa = malloc(10 * sizeof *pa); // allocate an array of 10 int 
    if(pa) { 
     printf("%zu bytes allocated. Storing ints: ", 10*sizeof(int)); 
     for(int n = 0; n < 10; ++n) 
      printf("%d ", pa[n] = n); 
    } 

    int *pb = realloc(pa, 1000000 * sizeof *pb); // reallocate array to a larger size 
    if(pb) { 
     printf("\n%zu bytes allocated, first 10 ints are: ", 1000000*sizeof(int)); 
     for(int n = 0; n < 10; ++n) 
      printf("%d ", pb[n]); // show the array 
     free(pb); 
    } else { // if realloc failed, the original pointer needs to be freed 
     free(pa); 
    } 
} 
+1

La conversion depuis 'malloc' et' realloc' est requise * en C++. Je pense que vous pensez peut-être 'C', où il est à la fois * pas * requis, [et fortement déconseillé] (https://stackoverflow.com/questions/605845/do-i-cast-the-result-of- malloc) – WhozCraig

+0

Ne fonctionne pas. Identique à l'erreur précédente – Amirhossein

1

Vous passez int kE comme premier paramètre ici:

realloc(kE , sizeof(int)) 

Cependant, realloc is declared like this:

void *realloc(void *ptr, size_t size); 

En d'autres termes, il attend un pointeur! Veuillez lire la page de manuel ci-dessus pour obtenir plus de détails. En bref, vous voulez probablement quelque chose comme ça pour la ligne d'erreur:

if (!(dec = (int *)realloc(dec , sizeof(int)))) 

Notez que c'est un peu mauvais, parce que si realloc échoue, vous perdez la valeur d'origine de dec, ce qui provoque une fuite de mémoire. Peu importe si vous allez quitter en cas d'erreur, mais sinon, vous devez conserver la valeur d'origine de dec, afin que vous puissiez gérer les erreurs plus facilement que de simplement quitter.

Une autre note, vous vraiment devez utiliser des classes de conteneur C++ comme vector au lieu de faire le tour avec les fonctions d'allocation de mémoire C.

Il y a probablement d'autres problèmes dans votre code, mais cette réponse n'essaie pas d'examiner le code, mais explique simplement pourquoi vous obtenez l'erreur que vous obtenez.