0
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/time.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <math.h>


void* findSin(void *arrayTwoD)
{
    float **myArray = ((float **)arrayTwoD);

    float total = 0.0;

    int x = 0;
    float *radAngle;


    for (int data = 0; data < 2; data++)
    {

        *radAngle = *(*(myArray + data) + 0); <---This is triggering the error


        for (int i = 1; i < 15; i += 2)
        {
            total += pow(*radAngle, i) / findFactorial(i);
        }

        printf("\nSin %f is %f \n", *myArray[data], total);
    }

    pthread_exit(0);
}



int main()
{
    pthread_t threadid1;
    float angleDegree;
    float angleRadian;


    float myArray[2][2];

    for (int i = 0; i < 2; i++)
    {
        printf("Please enter the angle in degree: ");
        scanf("%f", &angleDegree);

        angleRadian = (angleDegree / 180.0) * M_PI;
        myArray[i][0] = angleRadian;
    }

    pthread_create(&threadid1, NULL, findSin, (void *)myArray);

    pthread_join(threadid1, NULL);
}

**请帮助我,我一直在试图弄清楚如何正确访问元素。谢谢。

情况:二维数组的第一列包含用户输入的角度。函数 findSin 使用第一列来查找相关元素的 sin 值。我无法访问第一列的元素**

错误:分段错误(核心转储)

4

2 回答 2

0

你的地址算法有问题。这是一种更好的方法,可让您只使用 2D 数组。

void * findSin(void *arrayTwoD){ 
    float (* myArray)[2] = arrayTwoD;
    float total=0.0;
    int x=0;
    float radAngle;

    for(int data=0; data<2; data++)
        {
            radAngle = myArray[data][0]; 
            for(int i=1; i<15;i+=2){
                total+=pow(radAngle,i)/findFactorial(i);
            }
            printf("\nSin %f is %f \n",*myArray[data],total);
        }
    pthread_exit(0);
}
于 2021-02-06T18:56:03.507 回答
0

float **foo不是指向二维数组的指针它是一个指向浮点数的指针。

查看一维情况下的工作方式:

/* a one-dimensional array */
float a[2];

/* A pointer to the first element in a sequence of 2 floats */
float *ap = a;

要将其扩展到二维情况,我们没有 的序列float,而是长度为 2 的数组序列。如果我们使用 a typedef,我们可以使其类似于 1d 情况:

typedef float a2[2];

/* An array of an array, AKA 2d-array. */
a2 a[2];

/* A pointer to the first 1-d array in a sequence of 1-d arrays */
a2 *ap = a;

为了摆脱typedef我们可以写

/* An array of an array, AKA 2d-array. */
float a[2][2];

/* A pointer to the first 1-d array in a sequence of 1-d arrays */
float (*ap)[2] = a;

请注意(..)上述定义中的内容。您可以将定义想象为表达式(*ap)[n]应该给出一个浮点数。一个 since[]具有比*我们必须使用的更高的优先级()

当然,您可以使用void-pointer 作为中间体来执行此操作:

float a[2][2];

void *vp = a;

float (*ap)[2] = vp;

哦,您可以像在一维情况下一样访问a元素apa[i][j] == ap[i][j]

于 2021-02-06T18:58:38.890 回答