2011-08-17 5 views
1

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; 
} 
+2

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

+0

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. –

+0

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

Répondre

3

Si vous changez tous les éléments du tableau une fois avec l'élément au « inversé » index, vous vous retrouverez avec l'état de démarrage à nouveau. .-À-dire, pour une taille de matrice de 8, ces échanges sont effectués:

  • élément d'échange à l'index 0 à élément à l'index 0
  • objet d'échange à l'index 1 avec élément à l'index 4 (a)
  • échange élément à l'index 2 avec élément à l'index 2
  • objet d'échange à l'index 3 avec élément à l'index 6 (b)
  • élément d'échange à l'index 4 avec un objet à l'index 1 (a)
  • élément d'échange à l'index 5 avec un objet à l'index 5
  • objet d'échange à l'indice 6 de l'article à l'indice 4 (b)
  • élément d'échange à l'indice 7 avec élément à l'index 7

Indication que les swaps marqués avec la même lettre ((a) ou (b)) s'annulent mutuellement, et les autres sont no-ops.

+0

Cela a du sens. Quelle est la bonne façon d'obtenir l'échange de valeur souhaité, alors? –

+0

@nick_name: quel est l'échange de valeur souhaité? –