【问题标题】:Trouble sending a float array using void pointers使用 void 指针发送浮点数组时出现问题
【发布时间】:2020-05-26 13:41:54
【问题描述】:

**大家好,我在将我的 void 指针数组转换为指向我的浮点数组时遇到了问题, 我希望我的 void 指针指向浮点数组 所以 void[0]=float[0] 我知道 void ptr 和 float 的大小不同,所以我不能以这种方式分配它 无效[0]=浮动[0] 我该如何解决这个问题? 谢谢!

void *ptr[5];
float arr[5];
for(i=0;i<5;i++)
ptr[i]=arr[i];

我该如何解决这个问题?我想使用 void 指针数组发送任何数组 我已经添加了代码:

#define _CRT_SECURE_NO_WARNINGS
#define N 5
#include <stdio.h>
#include <stdlib.h>
typedef enum {FALSE,TRUE} BOOL;
BOOL Int_Sum(void* a, void* b, void* c)
{
    if (*(int*)a + *(int*)b == *(int*)c)
        return TRUE;
    return FALSE;

};
BOOL Float_sum(void*a, void* b, void* c)
{
    if (*(float*)a + *(float*)b == *(float*)c)
        return TRUE;
    return FALSE;

};
BOOL Sum(BOOL(*F)(void*, void*, void*), void** p_num, void* number)
{
    int i = 0,j=0;
    for (i = 0; i <N; i++)
    {
        for (j = 0 ; j <N; j++)
        {
            if (j != i)
            {
                if (F(&p_num[i], &p_num[j], number))
                    return TRUE;
            }


        }
    }
    return FALSE;

}
int main()
{
    int num[] = { 3,5,23,5,6 }, i=0, value;
    float fnum[] = { 3.5,5.0,2.3,5.8,6.2 }, fvalue;
    void* p_num[N];
    float* f_pnt[N];
    BOOL* fpnt;
    fpnt=Int_Sum;
    for (i = 0; i < N; i++)
        p_num[i] = num[i];
    printf("\nPlease enter an integer number:");
    scanf("%d", &value);
    if (Sum(fpnt, p_num,&value )== TRUE)
        printf("There is such sum\n");
    else
        printf("There is no such sum\n");
    printf("\nPlease enter an integer number:");
    scanf("%f", &fvalue);
    fpnt = Float_sum;
    for (i = 0; i < N; i++)
    {
        (float*)p_num[i] =fnum+i;
    }
    if (Sum(fpnt, p_num, &fvalue))
        printf("There is such sum\n");
    else printf("There is no such sum\n");



    return 0;

}

当我想使用浮点数组时遇到问题

**

【问题讨论】:

  • 是什么让你说 void 指针和 float 指针大小不一样?
  • 当然void*float 的大小可能不同,将一个分配给另一个是没有意义的。但这就是你在这里所做的。你打算ptr[i] = &amp;arr[i]吗?
  • “发送任何数组”是什么意思?你到底想在这里完成什么?
  • 这能回答你的问题吗? void* is literally float, how to cast?
  • 好吧,我可以更好地解释自己,我有一个函数,它接收一个 void 指针数组并检查数组中是否有相同的东西。我的主数组中有 2 个数组,其中一个是 int ,另一个是 float 。我需要分配 VOID 指针以指向浮动元素,因此 Void ptr[0]=float arr[0]。我该如何做到这一点?

标签: c


【解决方案1】:

我该如何解决这个问题?

节省时间。启用所有编译器警告。这就是我在这里发现大多数代码问题的方式。


至少有这些问题:

函数指针的类型声明错误

object 指针 BOOL *fpnt 不足以肯定存储 function 指针。使用函数指针。

//BOOL *fpnt;
BOOL (*fpnt)(void*, void*, void*);

F()中的参数类型错误

    // if (F(&p_num[i], &p_num[j], number))
    if (F(p_num[i], p_num[j], number))

投射提示有问题

强制转换导致代码无法编译。不需要投射。

// (float*)p_num[i] =fnum+i;
p_num[i] = fnum+i;

int 分配给指针

改为分配int的地址。

for (i = 0; i < N; i++)
  // p_num[i] = num[i];
  p_num[i] = &num[i];

我知道void ptr 和float 的大小不同,所以我不能以这种方式分配它void[0]=float[0]

float 分配给指针意义不大。

float * 分配给void *float *void * 也确实可能在大小和编码方面有所不同,但这不是这里的关键问题。


请注意,像2.3,5.8,6.2 这样的值完全编码为float。而是使用附近的值。代码的行为可能不如预期。

在下面添加以了解原因。

BOOL Float_sum(void *a, void *b, void *c) {
  printf("%.20f %.20f %.20f  %.20f\n", 
      *(float*) a, *(float*) b, *(float*) c, *(float*) a + *(float*) b);
  ...

【讨论】:

  • 所有作品!你能解释一下为什么 int assign 是 p_num[i]=&arr 但是对于 float 它的 p_num[i]=arr+i 非常感谢!
  • @Soske 没有 p_num[i]=&amp;arrp_num[i]=&amp;of_some_array_object 。问题不清楚或不准确。
  • 为什么我用 & 将 void *arr 分配给 int arr,但是当我用 arr+i 将 void * 分配给 float arr 时;
  • @Soske 请将此处的代码行复制为文本并将问题应用于该行。
  • 将 Void *arr[5] 分配给 int arr[5] 我使用以下代码:for (i = 0; i
猜你喜欢
  • 1970-01-01
  • 2011-07-04
  • 2020-04-01
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多