我试图在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) 我正在尝试使用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) 我大致有以下情况.我有一个从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
我继承了一个最初用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指针,但我找不到一个自动化(或至少)帮助我摆脱所有转换的技巧 - 指针.
有关如何以这些转换的任何可能方式查找,替换或互动的任何提示?
为什么我不能通过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*也不起作用
另外,有任何变通方法吗?
假设在我的代码中,我必须存储一个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
有人可以解释为什么我没有得到变量的值,而是它的内存而不是?
我需要使用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) 我有可变数量的 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() …
我正在摆弄C中的指针,我仍然不确定一些非常基本的东西.我想出了以下示例代码:
#include <stdio.h>
int main(void)
{
int num = 42; // we want to access this integer
void *vptrB = # // 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
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)
每当我尝试将 …
void-pointers ×10
c++ ×5
c ×4
reference ×2
avfoundation ×1
casting ×1
core-audio ×1
dynamic-cast ×1
fortran ×1
function ×1
ios ×1
list ×1
numpy ×1
pcm ×1
pointers ×1
python ×1