C - Замена элемента массива структур - PullRequest
1 голос
/ 17 августа 2011

Таким образом, следующий код компилируется без предупреждений и т. Д. С помощью gcc, но по какой-то причине код подкачки фактически не изменяет массив путем замены значений ... Что здесь может происходить? Одна интересная вещь состоит в том, что temp всегда содержит то, что я хочу, просто не привыкает.

#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;
}

1 Ответ

3 голосов
/ 17 августа 2011

Если вы поменяете все элементы массива один раз на элемент с «обращенным» индексом, то вы снова получите состояние начала.т. е. для размера массива 8 эти свопы выполняются:

  • элемент обмена по индексу 0 с элементом по индексу 0
  • элемент обмена по индексу 1 с элементом по индексу 4 (a)
  • поменять элемент с индексом 2 на элемент с индексом 2
  • поменять элемент с индексом 3 на элемент с индексом 6 (b)
  • поменять элемент по индексу 4 с элементом по индексу 1 (a)
  • поменять элемент по индексу 5 с элементом по индексу 5
  • поменять элемент по адресуиндекс 6 с элементом по индексу 4 (b)
  • поменять элемент по индексу 7 с элементом по индексу 7

Обратите внимание, что свопы помечены одной и той же буквой( (a) или (b) ) взаимно уничтожают друг друга, а остальные не могут.

...