Go Down

Topic: ambiguous?? (Read 3673 times) previous topic - next topic

whiskey

May 30, 2013, 08:11 pm Last Edit: May 30, 2013, 10:32 pm by whiskey Reason: 1
hello,

I"m trying to upload project 23 from "Beginning Arduino" but I'm getting an error?

error: "call of overload 'write(int)' is ambiguous"
Project23.pde: In function 'void createGlyphDemo()':
Project23:124: error: call of overloaded 'write(int) is ambiguous
c:\arduino-1.0.4\libraries\LiquidCrystal\LiquidCrystal.h:82: note: candidates are : virtual size_t LiquidCrystal: :write(unit8_t)
c:\arduino-1.0.4\hardware\arduino\cores\arduino/Print.h:49: note:      size_t Print: :write(const char*)

Code: [Select]
// PROJECT 23
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // create an lcd object and assign the pins

void setup() {
  lcd.begin(16, 2); // Set the display to 16 columns and 2 rows
}

void loop() {
  // run the 7 demo routines
  basicPrintDemo();
  displayOnOffDemo();
  setCursorDemo();
  scrollLeftDemo();
  scrollRightDemo();
  cursorDemo();
  createGlyphDemo();
}

void basicPrintDemo() {
    lcd.clear(); // Clear the display
    lcd.print("Basic Print"); // print some text
    delay(2000);
}

void displayOnOffDemo() {
  lcd.clear(); // Clear the display  
  lcd.print("Display On/Off"); // print some text
  for(int x=0; x < 3; x++) { // loop 3 times
    lcd.noDisplay(); // turn display off
    delay(1000);
    lcd.display(); // turn it back on again
    delay(1000);
   }
}

void setCursorDemo() {
  lcd.clear(); // Clear the display
  lcd.print("SetCursor Demo"); // print some text
  delay(1000);
  lcd.clear(); // Clear the display
  lcd.setCursor(5,0); // cursor at column 5 row 0
  lcd.print("5,0");
  delay(2000);
  lcd.setCursor(10,1); // cursor at column 10 row 1
  lcd.print("10,1");
  delay(2000);
  lcd.setCursor(3,1); // cursor at column 3 row 1
  lcd.print("3,1");
  delay(2000);
}

void scrollLeftDemo() {
  lcd.clear(); // Clear the display
  lcd.print("Scroll Left Demo");
  delay(1000);
  lcd.clear(); // Clear the display
  lcd.setCursor(7,0);
  lcd.print("Beginning");  
  lcd.setCursor(9,1);
  lcd.print("Arduino");
  delay(1000);
  for(int x=0; x<16; x++) {
    lcd.scrollDisplayLeft(); // scroll display left 16 times
    delay(250);
  }
}

void scrollRightDemo() {
  lcd.clear(); // Clear the display
  lcd.print("Scroll Right");
  lcd.setCursor(0,1);
  lcd.print("Demo");
  delay(1000);
  lcd.clear(); // Clear the display
  lcd.print("Beginning");  
  lcd.setCursor(0,1);
  lcd.print("Arduino");
  delay(1000);
  for(int x=0; x<16; x++) {
    lcd.scrollDisplayRight(); // scroll display right 16 times
    delay(250);
  }
}

void cursorDemo() {
  lcd.clear(); // Clear the display
  lcd.cursor(); // Enable cursor visible
  lcd.print("Cursor On");
  delay(3000);
  lcd.clear(); // Clear the display
  lcd.noCursor(); // cursor invisible
  lcd.print("Cursor Off");
  delay(3000);
  lcd.clear(); // Clear the display
lcd.cursor(); // cursor visible
  lcd.blink(); // cursor blinking
  lcd.print("Cursor Blink On");
delay(3000);
  lcd.noCursor(); // cursor invisible
  lcd.noBlink(); // blink off
}


void createGlyphDemo() {
  lcd.clear();

  byte happy[8] = { // create byte array with happy face
  B00000,
  B00000,
  B10001,
  B00000,
  B10001,
  B01110,
  B00000,
  B00000};
 
  byte sad[8] = { // create byte array with sad face
  B00000,
  B00000,
  B10001,
  B00000,
  B01110,
  B10001,
  B00000,
  B00000};
  lcd.createChar(0, happy); // create custom character 0
  lcd.createChar(1, sad); // create custom character 1

for(int x=0; x<5; x++) { // loop animation 5 times
  lcd.setCursor(8,0);
    lcd.write(0); // write custom char 0
    delay(1000);
    lcd.setCursor(8,0);
    lcd.write(1); // write custom char 1
    delay(1000);
  }
}



any help would be appreciated, thanks!

Doddy

I'm not confident enough with my C++ to give you an accurate description, but from what I've see it looks as though the '0' in

Code: [Select]

lcd.write(0);


cannot be determined explicitly as a uint_8, or a pointer (char *)... I don't know if this is a condition of a null/zero value.

A quick experiment (untested, but compiled)...

Change the character code 0, to 2...

Code: [Select]


  byte sad[8] = { // create byte array with sad face
  B00000,
  B00000,
  B10001,
  B00000,
  B01110,
  B10001,
  B00000,
  B00000};
  lcd.createChar(2, happy); // create custom character 0
  lcd.createChar(1, sad); // create custom character 1

for(int x=0; x<5; x++) { // loop animation 5 times
    lcd.setCursor(8,0);
    lcd.write(2); // write custom char 0
    delay(1000);
    lcd.setCursor(8,0);
    lcd.write(1); // write custom char 1
    delay(1000);
  }
}


or cast the null value explicitly....

Code: [Select]

  byte sad[8] = { // create byte array with sad face
  B00000,
  B00000,
  B10001,
  B00000,
  B01110,
  B10001,
  B00000,
  B00000};
  lcd.createChar(0, happy); // create custom character 0
  lcd.createChar(1, sad); // create custom character 1

for(int x=0; x<5; x++) { // loop animation 5 times
    lcd.setCursor(8,0);
    lcd.write((uint8_t) 0); // write custom char 0
    delay(1000);
    lcd.setCursor(8,0);
    lcd.write(1); // write custom char 1    <-- Not necessary to cast non-zero?
    delay(1000);
  }

HazardsMind

I was able to confirm that it needs to be type casted as uint8_t. Why it sees 0 as an int, and everything else as uint8_t is beyond me.
My GitHub:
https://github.com/AndrewMascolo?tab=repositories

whiskey

thanks for the help!

I first tried hazards way but with no luck, I then tried Doddy's way and they both worked.  I played around with the numbers and it only errors when I put a zero in the mix.

In the the book it say's:
"Then you create the two custom characters using the createChar() command. This requires two parameters: the first is the number of the custom character(0-7 in the case of my test LCD, which can store a maximum of 8), and the second is the name of the array...."

I guess it must be the LCD.

Anyways thanks, and thanks for the unit8_t info I'm not sure what it is but I see it pop up a lot in the errors, guess I should spend some time trying understand it.

floresta

You should be able to display the custom character that you stored at 0 by using:
Code: [Select]
lcd.write(8);

Don

Go Up