我正在尝试一个问题,这个问题要求我创建一个名为randSwap的函数,它接受两个空指针数组,并且有50%的机会,它将在两个数组之间交换同一索引的两个值。下面是我的代码,但是每当我去编译时,它都会给我一些错误讨论:
警告:初始化将从整数生成指针,而不使用强制转换。

void *array1[4] = {3,4,2,5};

以及其他一些与array1和2有关的。
当我运行程序时,array1的值会在产生一个大的单整数时损坏,而array 2会同时打印它的原始值。
我对使用void类型非常陌生,因为我认为这就是问题所在。
#include <stdio.h>

int randSwap(void *array1[], void *array2[], int length)
{
    static int numofswaps = 0;
    int value;
    int toswap;
    void *temp;


    value = rand() % 2;
    if(value == 2)
    {
        toswap = rand() % length;
        temp = array1[toswap];
        array1[toswap] = array2[toswap];
        array2[toswap] = temp;

        numofswaps++;
    }

    return numofswaps;
}

int main(void)
{
    int i;
    void *array1[4] = {3,4,2,5};
    void *array2[4] = {6,3,7,4};
    int length = 4;
    int numofswaps;
    srand(time(NULL));

    printf("Array1\n");
    for(i=0; i<length; i++);
    {

        printf("%d\t", (int*)array1[i]);
    }

    printf("\nArray2\n");
    for(i=0; i<length; i++)
    {
        printf("%d\t", (int*)array2[i]);
    }

    numofswaps = randSwap(array1, array2, length);
    numofswaps = randSwap(array1, array2, length);

    printf("\nArray1\n");
    for(i=0; i<length; i++);
    {

        printf("%d\t", (int*)array1[i]);
    }

    printf("\nArray2\n");
    for(i=0; i<length; i++)
    {
        printf("%d\t", (int*)array2[i]);
    }
    printf("\n");
    return 0;
 }

最佳答案

你的代码中有很多小问题。从我的注释继续,您正在尝试初始化一个指针数组[4],其值为4-int。不要试图将array1array2声明为无效,只需将它们声明为int[]并将它们作为void*传递给randSwap,例如。

    int i,
        array1[] = {3, 4, 2, 5},
        array2[] = {6, 3, 7, 4},
        length = sizeof array1 / sizeof *array1,
        numofswaps = 0;

接下来,在numSwaps中,您对modulo%)的使用被一个关闭:
    value = rand() % 2;     /* produces value 0 - 1 */
    if (value == 2)         /* will never equal 2 */

你只需要一个01的测试,例如。
    value = rand() % 2;     /* produces value 0 - 1 */
    if (value)              /* either 0 or 1 */
    {
        ...

不要在numofswaps中声明,staticrandSwap而在int中声明为简单的main()并将其作为参数传递给randSwap
要处理作为numSwap传递的void *中的数组,需要在尝试访问其值之前将其强制转换为int*,以避免试图取消对void指针的引用(不允许)。您可以执行类似的操作:
int randSwap (void *array1, void *array2, int length, int ns)
{
    int value,
        toswap,
        temp,
        *a1 = (int*)array1, /* note: the explicit casts are optional, the */
        *a2 = (int*)array2; /* declaration of a1 & a2 as int* is sufficient */

    value = rand() % 2;     /* produces value 0 - 1 */
    // if (value == 2)         /* will never equal 2 */
    if (value)              /* either 0 or 1 */
    {
        toswap = rand() % length;
        temp = a1[toswap];
        a1[toswap] = a2[toswap];
        a2[toswap] = temp;

        ns++;
    }

    return ns;
}

ns表示numofswaps--我不喜欢键入…)
将所有部分放在一起,您可以将代码重新编写为类似于以下内容的内容:
#include <stdio.h>
#include <stdlib.h> /* for rand() and srand() */
#include <time.h>   /* for time() */

int randSwap (void *array1, void *array2, int length, int ns)
{
    int value,
        toswap,
        temp,
        *a1 = array1,
        *a2 = array2;

    value = rand() % 2;     /* produces value 0 - 1 */
    // if (value == 2)         /* will never equal 2 */
    if (value)              /* either 0 or 1 */
    {
        toswap = rand() % length;
        temp = a1[toswap];
        a1[toswap] = a2[toswap];
        a2[toswap] = temp;

        ns++;
    }

    return ns;
}

int main (void)
{
    int i,
        array1[] = {3, 4, 2, 5},
        array2[] = {6, 3, 7, 4},
        length = sizeof array1 / sizeof *array1,
        numofswaps = 0;

    srand(time(NULL));

    printf ("Array1\n");
    for (i = 0; i < length; i++)
        printf (" %d", array1[i]);

    printf("\nArray2\n");
    for (i = 0; i < length; i++)
        printf (" %d", array2[i]);

    numofswaps = randSwap (array1, array2, length, numofswaps);
    numofswaps = randSwap (array1, array2, length, numofswaps);

    printf ("\nArray1\n");
    for (i = 0; i < length; i++)
        printf (" %d", array1[i]);

    printf ("\nArray2\n");
    for (i = 0; i < length; i++)
        printf(" %d", array2[i]);

    // putchar ('\n');     /* don't printf a single-character */
    printf ("\n\nnumber of swaps: %d\n", numofswaps);

    return 0;
}

(注意:您没有在numofswaps中输出main(),我在最后为您添加了这个)
示例使用/输出
 $ ./bin/ptrswap
Array1
 3 4 2 5
Array2
 6 3 7 4
Array1
 6 4 2 5
Array2
 3 3 7 4

number of swaps: 1

作为对randSwap的进一步改进,无需将numofswaps声明为static,也无需将其作为参数传递。您需要做的就是返回randSwap0以指示是否进行了交换,并将交换加总为1,例如。
int randSwap (void *array1, void *array2, int length)
{
    int toswap, temp,
        *a1 = array1,
        *a2 = array2;

    if (rand() % 2) {   /* either 0 or 1 */
        toswap = rand() % length;
        temp = a1[toswap];
        a1[toswap] = a2[toswap];
        a2[toswap] = temp;

        return 1;
    }

    return 0;
}

然后在main()中,
    if (randSwap (array1, array2, length))
        numofswaps++;
    if (randSwap (array1, array2, length))
        numofswaps++;

(注意:这是处理它的更干净的方法——相同的输出)
再看一遍,如果你还有问题,请告诉我。

10-08 05:26