Concatenate c-Strings compiles but gives error

I'm getting two errors that the compiler has accepted but I can't see what is wrong.

I realize a warning is not an error and the program can be used, however I really would like to know where I'm going astray. Especially if I've accidently created a "regular" string.

  1. At line 67 (see listing, "line 67" is in a comment) the compiler complains of what appears to be a conversion of a pointer to a variable to a variable. However I can't see where a pointer enters into this situation.

  2. I'm trying to concatenate two C-Strings. ( I think a C-String is an array of characters).
    see line 130 (also noted in comments)
    The First char should be the code for an ASCII !
    Next should be an array of bytes representing some number Like dec 203.
    The last should be a CR aka 0x0D
    The resulting array will be sent via UART to a Zigbee device.

I thought this was easy but I've not been able to eliminate this warning.

Thanks
John

#include "ArduinoSort.h"  // downloaded library for sorting arrays.  Currently in program folder
#include <avr/wdt.h>

#define trigPin       9
#define echoPin       8
#define NumReadings   9     // index - to 6,  Number must be odd for sort to work properly
#define MedianReading 4
#define MeasReqPin    7     // connected to CC2530 P1.0 output

// --- Define variables ------------------------

uint8_t k = 0;      // loop counter for LED blink time
uint16_t inputRdgs[NumReadings + 2];
unsigned long presenceTime =  43200000;  //1000 * 3600 * 12;     // every 12 hours
unsigned long checkinZero;

// --- Function Prototypes ---------------------

uint16_t measureDistance(void);
uint16_t getEchoDistance (void);
void     sendDistance(uint16_t);

//bool readSerial(void);
void writeSerial(void);
//void serialFlush(void); 

void watchdogSetup(void);

// --- Setup -----------------------------------
void setup() {

  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode( LED_BUILTIN, OUTPUT);
  pinMode(MeasReqPin, INPUT);

  Serial.begin(9600);
  checkinZero = millis();
  delay(500);
  watchdogSetup();
}

// --- Loop -----------------------------------
void loop() {

  if (MeasReqPin == 1){
    // initiate measurement and send to Hub
    uint16_t xxx = measureDistance;         // ------------------------------- line 67
    sendDistance(xxx);
  }

  if ((millis()-checkinZero) > presenceTime) {
          Serial.write("!p"); // 0x0D) ; // ?????
          checkinZero = millis();
  }  
  
  delay(10);  // slow down the LED
  if (k > 200){
    asm ("sbi %0, %1 \n": : "I" (_SFR_IO_ADDR(PINB)), "I" (PINB5));    // Toggle LED
    k = 0;
  }
  ++k;

  wdt_reset();
} // --- loop ----


//// --------------------------------------------------------------------------------////
/// --- Functions -------------------------------------------------------------------///
// ----------------------------------------------------------------------------------//

uint16_t measureDistance(){

  for (int j = 0; j < (NumReadings + 1); j++) {
    inputRdgs[j] = getEchoDistance();
    delay(100);
  }
  sortArray(inputRdgs, NumReadings);
  // after sorting we will ignore the highest 3 and lowest 3 readings.
  return inputRdgs[MedianReading];  // this reading is the middle of NumReadings readings.
}

// ---------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------

uint16_t getEchoDistance (void){
  unsigned long duration;
  digitalWrite(trigPin, LOW);
  delay(5);

  // trigger the sensor
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(8);
  digitalWrite(trigPin, LOW);

  // Read the echoPin, pulseIn() returns the duration (length of the pulse) in microseconds:
  duration = pulseIn(echoPin, HIGH);
  return (duration * 0.034 / 2);
}

// ----------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------

void sendDistance(uint16_t vDistance) {
// send "!"+"Distance"+ CR  to hub
char diststr[16];
  ultoa(vDistance, diststr, 10);
  char buf[20];
  strcpy(buf,"!");
  strcat(buf, diststr);
  strcat(buf,'\r');               //  ----------------------------------- line 130
  Serial.write (buf);   // send off to Zigbee board
} // --- sendDistance ---

void serialFlush(){
  while(Serial.available() > 0) {
    char t = Serial.read();
  }
}

 // ---------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------


void watchdogSetup(void) {
  cli();   // disable all interrupts
  wdt_reset();
  // reset the WDT timer
  /*
  WDTCSR configuration:
  WDIE = 1: Interrupt Enable
  WDE = 1 :Reset Enable
  WDP3 = 0 :For 2000ms Time-out
  WDP2 = 1 :For 2000ms Time-out
  WDP1 = 1 :For 2000ms Time-out
  WDP0 = 1 :For 2000ms Time-out
  */

  // Enter Watchdog Configuration mode:
  WDTCSR |= B00011000;
  // Set Watchdog settings:
  WDTCSR = B01000111;
  sei();
  //Serial.println(WDTCSR);
}

error listing..

FQBN: arduino:avr:pro:cpu=8MHzatmega328
Using board 'pro' from platform in folder: C:\Users\john\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6
Using core 'arduino' from platform in folder: C:\Users\john\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6

Detecting libraries used...
C:\Users\john\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7/bin/avr-g++ -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=8000000L -DARDUINO=10607 -DARDUINO_AVR_PRO -DARDUINO_ARCH_AVR -IC:\Users\john\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino -IC:\Users\john\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\variants\eightanaloginputs C:\Users\john\AppData\Local\Temp\arduino\sketches\59EA4D757BF38D089FC8F1F40149DD30\sketch\AVRUltrasonicArduinoGPIO.ino.cpp -o nul
Generating function prototypes...
C:\Users\john\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7/bin/avr-g++ -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=8000000L -DARDUINO=10607 -DARDUINO_AVR_PRO -DARDUINO_ARCH_AVR -IC:\Users\john\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino -IC:\Users\john\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\variants\eightanaloginputs C:\Users\john\AppData\Local\Temp\arduino\sketches\59EA4D757BF38D089FC8F1F40149DD30\sketch\AVRUltrasonicArduinoGPIO.ino.cpp -o C:\Users\john\AppData\Local\Temp\3275914274\sketch_merged.cpp
C:\Users\john\AppData\Local\Arduino15\packages\builtin\tools\ctags\5.8-arduino11/ctags -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives C:\Users\john\AppData\Local\Temp\3275914274\sketch_merged.cpp
Compiling sketch...
"C:\\Users\\john\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=8000000L -DARDUINO=10607 -DARDUINO_AVR_PRO -DARDUINO_ARCH_AVR "-IC:\\Users\\john\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\cores\\arduino" "-IC:\\Users\\john\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\variants\\eightanaloginputs" "C:\\Users\\john\\AppData\\Local\\Temp\\arduino\\sketches\\59EA4D757BF38D089FC8F1F40149DD30\\sketch\\AVRUltrasonicArduinoGPIO.ino.cpp" -o "C:\\Users\\john\\AppData\\Local\\Temp\\arduino\\sketches\\59EA4D757BF38D089FC8F1F40149DD30\\sketch\\AVRUltrasonicArduinoGPIO.ino.cpp.o"
C:\Users\john\Documents\Arduino\AVRUltrasonicArduinoGPIO\AVRUltrasonicArduinoGPIO.ino: In function 'void loop()':
C:\Users\john\Documents\Arduino\AVRUltrasonicArduinoGPIO\AVRUltrasonicArduinoGPIO.ino:67:20: warning: invalid conversion from 'uint16_t (*)() {aka unsigned int (*)()}' to 'uint16_t {aka unsigned int}' [-fpermissive]
     uint16_t xxx = measureDistance;         // ------------------------------- line 67
                    ^~~~~~~~~~~~~~~
C:\Users\john\Documents\Arduino\AVRUltrasonicArduinoGPIO\AVRUltrasonicArduinoGPIO.ino: In function 'void sendDistance(uint16_t)':
C:\Users\john\Documents\Arduino\AVRUltrasonicArduinoGPIO\AVRUltrasonicArduinoGPIO.ino:130:18: warning: invalid conversion from 'char' to 'const char*' [-fpermissive]
   strcat(buf,'\r');               //  ----------------------------------- line 130
                  ^
In file included from C:\Users\john\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Arduino.h:25:0,
                 from C:\Users\john\AppData\Local\Temp\arduino\sketches\59EA4D757BF38D089FC8F1F40149DD30\sketch\AVRUltrasonicArduinoGPIO.ino.cpp:1:
c:\users\john\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\string.h:248:14: note:   initializing argument 2 of 'char* strcat(char*, const char*)'
 extern char *strcat(char *, const char *);
              ^~~~~~
Compiling libraries...
Compiling core...
Using precompiled core: C:\Users\john\AppData\Local\Temp\arduino\cores\arduino_avr_pro_cpu_8MHzatmega328_f18a839ae973b6755e4478067cfee7b2\core.a
Linking everything together...
"C:\\Users\\john\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-gcc" -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections -mmcu=atmega328p -o "C:\\Users\\john\\AppData\\Local\\Temp\\arduino\\sketches\\59EA4D757BF38D089FC8F1F40149DD30/AVRUltrasonicArduinoGPIO.ino.elf" "C:\\Users\\john\\AppData\\Local\\Temp\\arduino\\sketches\\59EA4D757BF38D089FC8F1F40149DD30\\sketch\\AVRUltrasonicArduinoGPIO.ino.cpp.o" "C:\\Users\\john\\AppData\\Local\\Temp\\arduino\\sketches\\59EA4D757BF38D089FC8F1F40149DD30/..\\..\\cores\\arduino_avr_pro_cpu_8MHzatmega328_f18a839ae973b6755e4478067cfee7b2\\core.a" "-LC:\\Users\\john\\AppData\\Local\\Temp\\arduino\\sketches\\59EA4D757BF38D089FC8F1F40149DD30" -lm
"C:\\Users\\john\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-objcopy" -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 "C:\\Users\\john\\AppData\\Local\\Temp\\arduino\\sketches\\59EA4D757BF38D089FC8F1F40149DD30/AVRUltrasonicArduinoGPIO.ino.elf" "C:\\Users\\john\\AppData\\Local\\Temp\\arduino\\sketches\\59EA4D757BF38D089FC8F1F40149DD30/AVRUltrasonicArduinoGPIO.ino.eep"
"C:\\Users\\john\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-objcopy" -O ihex -R .eeprom "C:\\Users\\john\\AppData\\Local\\Temp\\arduino\\sketches\\59EA4D757BF38D089FC8F1F40149DD30/AVRUltrasonicArduinoGPIO.ino.elf" "C:\\Users\\john\\AppData\\Local\\Temp\\arduino\\sketches\\59EA4D757BF38D089FC8F1F40149DD30/AVRUltrasonicArduinoGPIO.ino.hex"

"C:\\Users\\john\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-size" -A "C:\\Users\\john\\AppData\\Local\\Temp\\arduino\\sketches\\59EA4D757BF38D089FC8F1F40149DD30/AVRUltrasonicArduinoGPIO.ino.elf"
Sketch uses 2030 bytes (6%) of program storage space. Maximum is 30720 bytes.
Global variables use 193 bytes (9%) of dynamic memory, leaving 1855 bytes for local variables. Maximum is 2048 bytes.

Should that not be:

uint16_t xxx = measureDistance();

'\r' is a single character, but strcat expects a string. You could try:

strcat(buf, "\r");
1 Like

and that is where the pointer enters into the situation. The variable is a pointer to this array.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.