es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Qué diferencia hay entre la declaración de un puntero en C?

Creo que #1

uint8_t* start_ptr, end_ptr;

y #2

uint8_t* start_ptr;
uint8_t* end_ptr;

generalmente son iguales. Pero me parece que no lo son.
¿Podría alguien especificar qué hace el primero aparte del segundo?

Lo que sucedió:

          if(strncmp(mseq,mseq_a,8) == 0){
              start_ptr = MY_UART_RingBuffer_getReadPointer();
              start_found = 1;
          }

          if(strncmp(mseq+3,mseq_z,5) == 0){
              end_ptr = MY_UART_RingBuffer_getReadPointer();

              if (start_found == 1){
              if(!MY_UART_RingBuffer_getOverlap()){
                end_ptr = end_ptr - 6;
              }
              else{
                  start_found = 0;
                  continue;
              }

              ptrdiff_t length = end_ptr - start_ptr;
              start_found = 0;
          }
      }

Al usar #1, el compilador me dará esto para el cálculo de la longitud:

../Core/Src/main.c:143:32: error: invalid operands to binary - (have 'int' and 'uint8_t * {aka unsigned char *}')
     ptrdiff_t length = end_ptr - start_ptr;

Al usar #2, todo funciona bien.

Estoy un poco confundido aquí. Veo la solución pero no entiendo realmente el problema.

Muchas gracias 😉

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La diferencia entre #1 y #2 está en la declaración de las variables. En #1, solo la primera variable de puntero (start_ptr) se declara como un puntero, mientras que la segunda variable (end_ptr) simplemente se declara como un tipo uint8_t. Esto significa que al intentar realizar una aritmética de puntero, como en el cálculo de la longitud, el compilador ve a end_ptr como un entero y no como un puntero, lo que lleva al error de operandos inválidos.

    En contraste, en #2 ambas variables se declaran como variables de puntero, lo que permite realizar correctamente la aritmética de puntero.

    Por lo tanto, es importante declarar correctamente las variables como punteros al referirse a las direcciones de memoria y realizar aritmética de puntero.

Comments are closed.