PDA

Ver la Versión Completa : Explicación declaración


Guillermo80
24-02-2008, 13:47:07
Os dejo una duda facilita, se trata de una declaración que no me queda muy clara que vi en un código, a ver si me podéis interpretar qué significa:

static Integer pcm[1024];
static Integer *pcm_[2] = { pcm, pcm+1024 };Mi interpretación y mi pregunta es: si pcm es un array de enteros, *pcm_[2] un array de punteros a enteros, ¿cómo diablos hace esa asignación directa:

*pcm_[2] = { pcm, pcm+1024 } ?

No sé por qué mete en una posición del array de punteros el valor pcm, si es a su vez un array de enteros, cuando sólo podría asignarle enteros. :confused:

escafandra
24-02-2008, 14:09:48
Si. pcm_ es un array de punteros a int de dimensión 2.
Hace la asignación directa. Primer valor pcm. que es un array de 1024 enteros.
Como quiere tener dos arrays consecutivos de 1024 int la asignación la hace asi. Primer elemento pcm_[0] = pcm. Segundo pcm[_1] = pcm+1024.

Este tipo de asignaciones directas en C++

static Integer *pcm_[2] = { pcm, pcm+1024 };
se pueden hacer perfectamente.

static Integer *pcm_[2] = { pcm, pcm+1024 }; no se refiere al elemneto[2] sino es la "declaración - asignación directa".
Por otro lado [2] no puede existir (solo se declara tamaño 2).

Saludos.

Guillermo80
24-02-2008, 18:00:34
Muchas gracias Escafandra, m eha sido muy útil la aclaración, yo no estaba seguro. Aún así me encuentro con un problema, y es que, si bien está aclarado que podría asignar el primer elemento así:

pcm_[0] = pcm.

Al intentar hacer esto mismo con el segundo elemento:

pcm[_1] = pcm+1024.

No puedo hacerlo en Delphi, y tiene que ser algo en realidad extraño, porque se le está sumando a un array de punteros a entero el valor 1024 para todas las posiciones del array (hace eso, ¿no?). La única manera que se me ocurre de resolverlo es crearme un bucle que vaya incrementando ese valor para toda la tabla y almacenarlo en pcm_[1]. ¿Se te ocurre alguna solución mejor o si se puede esquivar este problema?

escafandra
24-02-2008, 19:02:10
pcm[_1] = pcm+1024


Me imagino que pcm[_1] está equivocado y que pones pcm_[1].

En C, puedes hacer la asignación como propones, después del tiempo de declaración. Da lo mismo.

En Delphi probablemente el problema lo tienes en la aritmética de punteros. En C los punteros los sumas o restas tranquilamente. puedes sumar a un puntero un int significando que ahora apunta a p+int posición.

No se mucho de pascal, pero creo que la aritmética de punteros no es tan directa como en C. o necesitarás una sintaxis especial. Investiga el tema.

EDITO:

La artimetica de punteros en C es sensible al tipo. No es lo mismo:

char *C;
int *I;

(char*)(C+2) != (char*)(I+2);


La suma de un entero a un puntero equivale a sumar posiciones al puntero, no a su valor. Asi:

int *I;
int *N = I+2;
*N == I[2]; //El valor de N equivale al tercer elemento del array I;


Saludos.