无法理解void数组并在函数调用中使用它们

时间:2017-11-09 05:02:03

标签: c random void

我正在尝试一个问题,要求我创建一个名为randSwap的函数,该函数接收2个void指针数组,并且有50%的几率,它将在2个数组之间交换相同索引的2个值。下面是我的代码,但无论何时我去编译,它都会给我带来几个错误的讨论:

警告:初始化使得整数指针没有强制转换。

class Base: Object, Codable {
    dynamic var id: String = ""
    dynamic var timestamp: String = ""

    private enum CodingKeys: String, CodingKey {
        case id = "_id"
        case timestamp = "timestamp"
    }

    func decode(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.id = try container.decode(String.self, forKey: .id)
        self.timestamp = try container.decode(String.self, forKey: .timestamp)
    }
}

class User: Base {
    dynamic var name: String = ""

    private enum CodingKeys: String, CodingKey {
        case id = "_id"
        case timestamp
        case name = "name"
    }

    required convenience init(from decoder: Decoder) throws {
        self.init()

        try decode(from: decoder)

        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.name = try container.decode(String.self, forKey: .name)
    }
}

以及与array1和2相关的其他几个。

当我运行程序时,array1的值会被破坏,产生一个大的单个整数,并且数组2会两次打印其原始值。

我对使用void类型非常不熟悉,因为我认为这就是问题所在。

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

2 个答案:

答案 0 :(得分:0)

您要做的是初始化一个带有整数数组的void指针数组

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

基本上尝试为指针分配一个整数。因此警告 -

  

警告:初始化使得整数指针没有强制转换。

休息警告可能是因为这些变量的声明不正确。现在,您在评论中提到问题要求您使用此类型定义函数randSwap。这可能是因为他们想要一个通用的界面。

所以你可以做的是,使你的数组​​也包含指向整数的指针 -

void *array1[4] = {&(int){3}, &(int){4}, &(int){2}, &(int){5}};

这将创建int文字,您可以获取它们的地址。

您还必须将printf更改为 -

printf("%d\n", *(int*)array1[i]); // Add * to dereference the pointer. 

这将使您的代码正常工作。

最后我用你的代码看到了一些其他的错误 -

for(i=0; i<length; i++);

这会将i的值设置为4,并最终在下一行中进行超出限制的访问。

您可能需要

for(i=0; i<length; i++)

答案 1 :(得分:0)

您的代码中存在大量小问题。继续我的评论,您正在尝试使用4 - int值初始化指针数组[4] 。不要试图将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 */
    {
        ...

请勿在{{1​​}}中声明numofswapsstatic,而是在randSwap中将其声明为简单的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中汇总互换,例如

main()

然后在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()

注意:这是处理它的更简洁的方法 - 相同的输出)

仔细看看,如果您有其他问题,请告诉我。