Hola Mario:
Hola.
Casi lo he conseguido
Pues sí. Pero por pura casualidad

Cuando se intercambian datos entre dos aplicaciones o procesos que tengan distintos gestores de memoria (caso de una aplicación hecha en C/C++ y otra hecha en Object Pascal, como en este caso), la asignación y liberación de memoria ha de estar bien controlada.
En líneas generales (o, si lo prefieres, en el caso más sencillo), se trata de que el proceso que llama reserve tanta memoria como se necesite para la operación a realizar; a continuación, pasaría esa memoria (por ejemplo, tu array de
char) al otro proceso, que la manipularía; finalmente, el proceso llamador liberaría la memoria.
La parte que has hecho en Object Pascal, sin ser muy óptima...
For Bucle := 0 to 100 do begin
Caracter := CadenaFinal[Bucle];
if Caracter = #0 then break; // Si es final de cadena, salimos
Datos[Bucle] := Caracter;
end;
... (¿por qué copiar byte a byte cuando se puede realizar una copia de un tramo de memoria, bien con las funciones de cadena del tipo
StrPcopy() o bien con funciones de manipulación directa de la memoria, como
memcpy o similar?), está bien.
El código en C/C++ tiene el problema que comentaba antes y que tú mismo descubres...
Si inicializo la variable con algun valor, antes de llamar la funcion por ejemplo si hago :
Cadena = " " y luego llamo a mi funcion CambiaValor(Cadena) , funciona perfectamente
pero si llamo a mi funcion sin inicializar la variable,, entondes peta...
A poco que conozcas el funcionamiento de los punteros (y los arrays de
char los puedes identificar con punteros) verás que es correcto ese comportamiento: al iniciar el puntero con algún valor estás "obteniendo memoria" (reservando un espacio de memoria para el puntero); cuando no lo inicias, el tamaño de la memoria reservada para el puntero es cero. Por ello, cualquier intento de asignación provocará una violación de acceso a memoria.
La pregunta es ,, ¿Como puedo inicializar esta variable desde mi funcion delphi, con algun valor...

La forma más sencilla es que, en la función que llama, inicies el array y que pases ese array a Object Pascal. Por ejemplo:
/* En C/C++ */
char Cadena[256]; // Se reservan 256 bytes de memoria
CambiaValor(Cadena); // Llamada a la función de Object Pascal
// ...
Otra manera sería utilizar las funciones de memoria del API de Windows ('GlobalAlloc()' y familia). Esto requería de mayor control por tu parte y es muy poco seguro (o, lo que es lo mismo, muy poco recomendable). Por ejemplo:
/* En C/C++ */
char *Cadena = 0; // Se declara un puntero nulo
// ... ¿Adquirir memoria?
CambiaValor(Cadena); // Llamada a la función de Object Pascal
// ...
// Importante: liberar memoria
GlobalFree(Cadena);
La adquisición de memoria se podría hacer antes de
CambiaValor() o en la función llamada. En este último caso, la cosa sería más o menos así...
(* En Object Pascal *)
Function CambiaValor(Datos: Pchar): integer; stdcall
begin
// Reserva de 256 bytes de memoria
Cadena := PChar(GlobalAlloc(GMEM_FIXED, 256));
// ... como lo tienes
end;
Repito: este último método no lo recomiendo. En ocasiones, no hay otra forma de hacerlo o esa otra forma es más difícil aún. Así que sólo en esas contadas excepciones debería adquirirse memoria en un lado y liberarse en otro.
Saludos
Mario