Donc le code suivant est compilé sans avertissements, etc. avec gcc, mais pour une raison quelconque, le code d'échange ne modifie pas réellement le tableau en inversant les valeurs ... Que se passe-t-il ici? Une chose intéressante est que temp
contient toujours ce que je veux, il ne sert tout simplement pas.C - Echange d'éléments de tableau de structure
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//STRUCTURES
struct complex_
{
double re, im;
};
typedef struct complex_ complex;
//PROTOTYPES
int reverseBits(int x,int elements);
complex new_complex(double re, double im);
//MAIN
int main()
{
int n,m,elements = 8;
complex temp,**v;
//Allocate memory for the struct array...
v = malloc(sizeof(complex*));
*v = malloc(sizeof(complex)*elements);
//Initialize the struct array...
for (n = 0; n < elements; n++)
{
(*v)[n] = new_complex(n,0);
}
//View the initialized struct array contents...
for (n = 0; n < elements; n++){printf("%f+%fi\n", (*v)[n].re,(*v)[n].im);}
//Swap elements for the bit reversal...
for (n = 0; n < elements; n++)
{
m = reverseBits(n,elements);
temp = (*v)[n];
(*v)[n] = (*v)[m];
(*v)[m] = temp;
}
//View the new swapped struct array contents...
for (n = 0; n < elements; n++){printf("%f+%fi\n", (*v)[n].re,(*v)[n].im);}
return 0;
}
//FUNCTION DEFINITIONS
int reverseBits(int x,int elements)
{
//This function performs a binary bit reversal
//for example 3 = 011 => 110 = 6...
int num_bits = log2(elements);
int reverse_x = 0;
int i;
for (i = 0; i < num_bits; i++)
{
if((x & (1 << i)))
reverse_x |= 1 << ((num_bits - 1) - i);
}
return reverse_x;
}
complex new_complex(double re, double im)
{
//This function creates a new complex number.
complex r;
r.re = re;
r.im = im;
return r;
}
Vous n'effectuez pas la répartition correctement. Vous allouez d'abord un pointeur à 'complex *', puis allouez un tableau de 'complex', pointé par le premier pointeur. Il vaut mieux juste allouer un tableau de pointeurs 'complex *' - 'malloc (éléments sizeof (complex *) *)', et le remplir en utilisant 'new_complex'. De plus, vous devriez libérer toute la mémoire allouée - d'abord les complexes, puis le tableau. – eran
La raison pour laquelle j'ai créé un pointeur vers un tableau est parce que je vais modifier ce tableau dans d'autres fonctions. Est-ce toujours un problème? Aussi, je suis d'accord - je devrais libérer la mémoire. –
vous pouvez toujours passer le tableau de la façon dont je vous suggère de le créer. Si vous souhaitez qu'une autre fonction crée le tableau ou le remplace par un autre, vous pouvez lui passer '& v', et il y a' * v = some_other_complex_star_star'. Mais si vous souhaitez modifier le contenu du tableau, vous pouvez le transmettre tel quel - 'v'. – eran