标签: void-pointers

确定核心音频AudioBuffer中的帧数

我试图在iPhone/iPad上访问音频文件的原始数据.我有以下代码,这是我需要的路径的基本开始.但是,一旦我有了一个AudioBuffer,我就会感到难过.

AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:urlAsset error:nil];
AVAssetReaderTrackOutput *assetReaderOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:[[urlAsset tracks] objectAtIndex:0] outputSettings:nil];
[assetReader addOutput:assetReaderOutput];
[assetReader startReading];

CMSampleBufferRef ref;
NSArray *outputs = assetReader.outputs;
AVAssetReaderOutput *output = [outputs objectAtIndex:0];
int y = 0;
while (ref = [output copyNextSampleBuffer]) {
    AudioBufferList audioBufferList;
    CMBlockBufferRef blockBuffer;
    CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(ref, NULL, &audioBufferList, sizeof(audioBufferList), NULL, NULL, 0, &blockBuffer);
    for (y=0; y<audioBufferList.mNumberBuffers; y++) {
        AudioBuffer audioBuffer = audioBufferList.mBuffers[y];
        SInt16 *frames = audioBuffer.mData;
        for(int i = 0; i < 24000; i++) { // This sometimes crashes
            Float32 currentFrame …
Run Code Online (Sandbox Code Playgroud)

core-audio pcm void-pointers avfoundation ios

7
推荐指数
1
解决办法
6353
查看次数

从(void*)类型中取消引用结构

我正在尝试使用void指针传递数据,然后将其转换为(pData*)类型.我究竟做错了什么?gcc给了我

gcc test.c错误:请求成员'filename',而不是结构或联合

typedef struct data {
        char *filename;
        int a;
} pData;

void mod_struct(void *data) {
        printf("%s\n",(pData *)data->filename); //error on this line
}

void main() {
        pData *data;
        data = (pData *) malloc(sizeof(pData));
        data->filename = (char *)malloc(100);
        strcpy(data->filename,"testing testing");
        data->a=1;
        mod_struct((void *)&data);
}
Run Code Online (Sandbox Code Playgroud)

c void-pointers

7
推荐指数
1
解决办法
6396
查看次数

Fortran-C++互操作性:通过void指针传递数组

我大致有以下情况.我有一个从Fortran代码调用的C++函数,并将函数指针和void指针作为这样的参数

int STDCALL FORTRAN_NAME(CPPFunction, CPPFUNCTION)(
    int (*userFunction)(const int *object,
                        const void *userFunctionUserData),
    const void *userData)
{
  // ...
    int index;
    int result;
  // ...
    result = userFunction(&index, userData);
  // ...
}
Run Code Online (Sandbox Code Playgroud)

这是从Fortran这样调用的

! ...
DOUBLE PRECISION, ALLOCATABLE :: data(:,:)
INTEGER :: n, result

! ...

ALLOCATE(data(3,n)); data = 0.0

! ... fill data with something

result = CPPFUNCTION(FORTRANFUNCTION, data)
! ...
Run Code Online (Sandbox Code Playgroud)

我希望通过函数指针传递的Fortran函数看起来像

INTEGER FUNCTION FORTRANFUNCTION(idx, data)
IMPLICIT NONE

INTEGER, INTENT(IN) :: idx
DOUBLE PRECISION, INTENT(IN) :: data(*)
INTEGER :: i, …
Run Code Online (Sandbox Code Playgroud)

c++ fortran function-pointers language-interoperability void-pointers

7
推荐指数
0
解决办法
816
查看次数

如何摆脱虚空指针

我继承了一个最初用C编写的大应用程序(但同时也添加了很多C++).由于历史原因,该应用程序包含许多void指针.在你开始窒息之前,让我解释为什么这样做.

该应用程序包含许多不同的数据结构,但它们存储在"通用"容器中.现在我会使用模板化STL容器,或者我会给所有数据结构一个公共基类,这样容器可以存储指向基类的指针,但是在[好?]旧C天,唯一的解决方案是将struct-pointer强制转换为void-pointer.

另外,有很多代码可以在这些void指针上运行,并使用非常奇怪的C结构来模拟C中的多态性.

我正在重新编写应用程序,并试图摆脱虚空指针.为所有数据结构添加一个公共基类并不困难(几天的工作),但问题是代码充满了如下所示的结构.

这是数据存储方式的示例:

void storeData (int datatype, void *data);    // function prototype
...
Customer *myCustomer = ...;
storeData (TYPE_CUSTOMER, myCustomer);
Run Code Online (Sandbox Code Playgroud)

这是再次获取数据的示例:

Customer *myCustomer = (Customer *) fetchData (TYPE_CUSTOMER, key);
Run Code Online (Sandbox Code Playgroud)

我实际上想用一些智能指针(引用计数)替换所有的void指针,但我找不到一个自动化(或至少)帮助我摆脱所有转换的技巧 - 指针.

有关如何以这些转换的任何可能方式查找,替换或互动的任何提示?

c c++ casting void-pointers

6
推荐指数
2
解决办法
1246
查看次数

通过引用传递空白*

为什么我不能通过void*参考传递?编译器允许我使用以下签名声明一个函数:

static inline void FreeAndNull(void*& item)
Run Code Online (Sandbox Code Playgroud)

但是当我尝试调用它时,我收到以下错误:

Error   1   error C2664: 'FreeAndNull' : cannot convert parameter 1 from 'uint8_t *' to 'void *&'
Run Code Online (Sandbox Code Playgroud)

将它投射到void*也不起作用

另外,有任何变通方法吗?

c++ pointers reference function void-pointers

6
推荐指数
2
解决办法
8017
查看次数

为什么抛出指向原始类的指针的奇怪行为?

假设在我的代码中,我必须存储一个void*as数据成员,并class在需要时将其强制转换回原始指针.为了测试它的可靠性,我写了一个测试程序(linux ubuntu 4.4.1 g ++ -04-Wall),我很震惊地看到了这个行为.

struct A
{
  int i;
  static int c;
  A () : i(c++) { cout<<"A() : i("<<i<<")\n"; }
};
int A::c;

int main ()
{
  void *p = new A[3];  // good behavior for A* p = new A[3];
  cout<<"p->i = "<<((A*)p)->i<<endl;
  ((A*&)p)++;
  cout<<"p->i = "<<((A*)p)->i<<endl;
  ((A*&)p)++;
  cout<<"p->i = "<<((A*)p)->i<<endl;
}
Run Code Online (Sandbox Code Playgroud)

这只是一个测试程序; 实际上,对于我的情况,必须将任何指针存储为void*,然后将其转换回实际指针(借助于template).所以我们不要担心这一部分.上面代码输出是,

p->i = 0
p->i = 0 // ?? …
Run Code Online (Sandbox Code Playgroud)

c++ reference strict-aliasing void-pointers reinterpret-cast

6
推荐指数
2
解决办法
852
查看次数

如何在C中正确使用void指针?

有人可以解释为什么我没有得到变量的值,而是它的内存而不是?

我需要使用void*来指向"unsigned short"值.

正如我理解的无​​效指针,它们的大小是未知的,它们的类型是未知的.
然而,一旦初始化它们,它们是已知的,对吧?

为什么我的printf语句打印错误的值?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void func(int a,  void *res){
    res = &a;
    printf("res = %d\n", *(int*)res);
    int b;
    b = * (int *) res;
    printf("b =%d\n", b);
}


int main (int argc, char* argv[])
{
    //trial 1
    int a = 30;
    void *res = (int *)a;
    func(a, res);
    printf("result = %d\n", (int)res);
    //trial 2
    unsigned short i = 90;
    res = &i;
    func(i, res);
    printf("result = %d\n", (unsigned short)res);
    return 0;
} …
Run Code Online (Sandbox Code Playgroud)

c void-pointers

6
推荐指数
3
解决办法
3万
查看次数

从 Python 调用 C:传递 numpy 指针列表

我有可变数量的 numpy 数组,我想将其传递给 C 函数。我设法传递了每个单独的数组(使用<ndarray>.ctypes.data_as(c_void_p)),但数组的数量可能会有很大差异。

我以为我可以在列表中传递所有这些“指针”并PyList_GetItem()在 C 代码中使用该函数。它就像一个魅力,除了所有元素的值不是我通常在作为函数参数传递时得到的指针。

不过,如果我有:

from numpy import array
from ctypes import py_object

a1 = array([1., 2., 3.8])
a2 = array([222.3, 33.5])

values = [a1, a2]

my_cfunc(py_object(values), c_long(len(values)))
Run Code Online (Sandbox Code Playgroud)

我的 C 代码看起来像:

void my_cfunc(PyObject *values)
{
    int i, n;

    n = PyObject_Length(values)
    for(i = 0; i < n; i++)
    {
        unsigned long long *pointer;
        pointer = (unsigned long long *)(PyList_GetItem(values, i);
        printf("value 0 : %f\n", *pointer);
    }
}
Run Code Online (Sandbox Code Playgroud)

打印值都是0.0000

我尝试了很多不同的解决方案,使用ctypes.byref()ctypes.pointer() …

python numpy list void-pointers multidimensional-array

6
推荐指数
1
解决办法
1754
查看次数

C:通过类型转换和解除引用指向(void*)指向(int)的(void*)访问(int)

我正在摆弄C中的指针,我仍然不确定一些非常基本的东西.我想出了以下示例代码:

#include <stdio.h>

int main(void)
{
    int num = 42;              // we want to access this integer
    void *vptrB = &num;        // pointer B points to the integer
    void *vptrA = &vptrB;      // pointer A points to pointer B
    printf("%d\n", * (int *) * (void **) vptrA);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

内存应该如下所示:

方案

有没有替代方法可以访问整数?这个例子有什么不好/不安全的吗?是通过和* (int *) * (void **) vptrA访问的唯一方法吗?numvptrAvptrB

c void-pointers

6
推荐指数
1
解决办法
333
查看次数

一般如何从 void * 指针动态转换?

class BASE {
public:
    virtual ~BASE() {}
    void lamp() {
        cout << "\nBASE CLASS";
    }
};

class DERIVED : public BASE {
public:
    void fun();
};

void DERIVED::fun() {
    cout << "\nDERIVED CLASS!";
}

int main() {

    BASE * pbase = new DERIVED; //BASE CLASS POINTER
    void * vbase = pbase;       //VOID POINTER TAKING BASE POINTER 
    DERIVED * pder;             //DERIVED CLASS POINTER

    //pder = static_cast<DERIVED *>(vbase);  //THIS WORKS
    pder = dynamic_cast<DERIVED *>(vbase);   //THIS DOESN'T
    pder->lamp();
    pder->fun();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

每当我尝试将 …

c++ dynamic-cast void-pointers

6
推荐指数
1
解决办法
5313
查看次数