我正在尝试一个问题,要求我创建一个名为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};
答案 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] 。不要试图将array1
和array2
声明为无效,只需将其声明为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 */
您只需要对0
或1
进行测试,例如
value = rand() % 2; /* produces value 0 - 1 */
if (value) /* either 0 or 1 */
{
...
请勿在{{1}}中声明numofswaps
为static
,而是在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
返回randSwap
或0
以指示是否发生了互换,并在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()
(注意:这是处理它的更简洁的方法 - 相同的输出)
仔细看看,如果您有其他问题,请告诉我。