Autor
|
Tema: Consulta punteros (C) (Leído 3,982 veces)
|
HRSLASH
Desconectado
Mensajes: 33
|
Hola gente! he aquí la consulta: Tengo un sector de n unsigned char en la memoria reservado con malloc y para manejar los datos del sector uso otro puntero q apunte al inicio pero lo declaro como unsigned short pq quiero extraer los datos de a 2 bytes, he aqui la cuestion, cuando hago avanzar el puntero obviamente lo hace de a dos bytes, en ciertos casos quiero hacerlo avanzar de a un byte por lo que hago lo sig p = (unsigned char *)p + 1 , que funciona, pero el compilador me lanza la advertencia de que estoy asignando punteros de tipo incompatible lo cual es razonable. Hay alguna manera de hacerlo correctamente??
|
|
« Última modificación: 28 Agosto 2012, 06:39 am por HRSLASH »
|
En línea
|
La televisión es para mi el medio mas instructivo y cultural que conozco, cuando la prenden me voy a leer
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
Si con "correctamente" te refieres a un comportamiento que cumpla con el estándar de C no, no hay forma. Eso se debe a los requisitos de alineación: un puntero a "unsigned int" debe apuntar a una dirección que sea múltiplo de "sizeof(unsigned int)" (dos en tu caso).
Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
ecfisa
Desconectado
Mensajes: 114
|
Hola. No sé el motivo por el cuál deseas ese comportamiento del puntero, pero si tu objetivo es obtener o acceder a los medios octetos (nibbles) de cada elemento del arreglo, podes hacer: int main() { unsigned char v[5] = {0xF1,0xF2,0xF3,0xF4,0xF5}, *p, i, l, h; p = &v; for (i=0; i < 5; i++) { h = *p >> 4; l = *p & 0x0F; p++; } }
Por otro lado la asignación: p = (unsigned char *)p + 1 Es equvalente a hacer: o o Saludos.
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
Por otro lado la asignación: p = (unsigned char *)p + 1 Es equvalente a hacer: No. El detalle es la conversión explicita al tipo "unsigned char *". En la aritmética de punteros la expresión: p + i
Resulta en un incremento en la dirección igual a "i * sizeof *p". * En el caso del tipo "char *" la expresión "sizeof *p" siempre resulta en uno. * En el caso del tipo "unsigned int *" la expresión "sizeof *p" resulta (en el caso de HRSLASH) en dos. Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
ecfisa
Desconectado
Mensajes: 114
|
Hola rir3760.
Tenes razón.
En realidad debí aclarar: "para este este caso la asignacion... es equivalente a...". Ya que los tipos tipos char, unsigned char y signed char tienen un tamaño de 1 byte. Esto por supuesto no sería válido si fueran tipos de un tamaño mayor.
Saludos.
|
|
« Última modificación: 29 Agosto 2012, 02:19 am por ecfisa »
|
En línea
|
|
|
|
HRSLASH
Desconectado
Mensajes: 33
|
Gracias por las respuestas!!
|
|
|
En línea
|
La televisión es para mi el medio mas instructivo y cultural que conozco, cuando la prenden me voy a leer
|
|
|
do-while
Desconectado
Mensajes: 1.276
¿Habra que sacarla de paseo?
|
¡Buenas!
¿Has probado esto? ptro = (unsigned short*) (((char*) p) + 1);
¡Saludos!
|
|
|
En línea
|
- Doctor, confundo los números y los colores. - Vaya marrón. - ¿Marrón? ¡Por el culo te la hinco!
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
¿Has probado esto? ptro = (unsigned short*) (((char*) p) + 1); No funcionaria. Con esta parte no hay problema (había un par de paréntesis de mas): ((char *) p + 1)
La dirección almacenada en "p" se convierte al tipo "char *" y se le suma una unidad ("sizeof(char)" siempre es igual a uno). El problema surgiría con la segunda conversión: (unsigned short*) ((char *) p + 1)
Ya que el puntero a carácter no cumplirá con los requisitos de alineación del puntero a "unsigned int". Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
do-while
Desconectado
Mensajes: 1.276
¿Habra que sacarla de paseo?
|
¡Buenas! Si compilais y ejecutais esto, por lo menos utilizando gcc, no hay ningun problema: #include <stdio.h> int main(int argc, char *argv[]) { char s[] = "Uno, dos, tres, cuatro..."; unsigned short *p,i; for(i = 0 ; i < 5 ; i++) { p = (unsigned short*)(s + i); } return 0; }
Espero que te sirva. ¡Saludos!
|
|
|
En línea
|
- Doctor, confundo los números y los colores. - Vaya marrón. - ¿Marrón? ¡Por el culo te la hinco!
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Consulta sobre punteros y referencias.
Programación C/C++
|
anonimo12121
|
5
|
3,267
|
27 Febrero 2013, 05:10 am
por 85
|
|
|
[C] (Consulta) Mezclando punteros y arreglos.
Programación C/C++
|
class_OpenGL
|
5
|
4,603
|
16 Mayo 2016, 18:51 pm
por class_OpenGL
|
|
|
(Consulta) Punteros a punteros en C
Programación C/C++
|
class_OpenGL
|
1
|
2,015
|
19 Julio 2016, 14:29 pm
por class_OpenGL
|
|
|
Consulta - Punteros
Programación C/C++
|
Cero++
|
6
|
2,378
|
18 Diciembre 2018, 04:43 am
por CalgaryCorpus
|
|
|
Consulta sobre punteros y doble punteros
Programación C/C++
|
palacio29
|
4
|
3,365
|
17 Mayo 2019, 20:40 pm
por MAFUS
|
|