invalid conversion from 'void*' to 'unsigned char*'

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben een Arduino mega 2560 aan het programmeren. Hierbij heb ik een tft LCD gekocht en daarvoor heb ik een SD kaart nodig zodat ik mijn fotos erop kan zetten

Ik heb deze bibliotheek gedownload maar het geeft me deze error:

C:\Arduino\libraries\pff\pff.cpp: In function 'FRESULT pf_read(void*, short unsigned int, short unsigned int*)': C:\Arduino\libraries\pff\pff.cpp:585: error: invalid conversion from 'void*' to 'unsigned char*'

Het probleem zit hier volgens mij:

pff.cpp:

C: Arduino
4
5
6
7
8
9
  FRESULT pf_read (
    void* buff,     /* Pointer to the read buffer (NULL:Forward data to the stream)*/
    WORD btr,       /* Number of bytes to read */
    WORD* br        /* Pointer to number of bytes read */
)
 


pff.h:

C: Arduino
1
FRESULT pf_read (void*, WORD, WORD*);           /* Read data from the open file */


Wanneer ik er een .c bestand van maak, krijg ik nog meer errors, zoals dezen:

tft_menu.cpp.o: In function open_root_dir()': C:\AppData\Local\Temp\build7310099894910129341.tmp/tft_menu.cpp:594: undefined reference topf_opendir(DIR*, char const*)' tft_menu.cpp.o: In function mount_sd()': C:\AppData\Local\Temp\build7310099894910129341.tmp/tft_menu.cpp:583: undefined reference todisk_initialize()' C:\AppData\Local\Temp\build7310099894910129341.tmp/tft_menu.cpp:585: undefined reference to pf_mount(_FATFS_*)' tft_menu.cpp.o: In functionbitmap_show(char*)': C:\AppData\Local\Temp\build7310099894910129341.tmp/tft_menu.cpp:472: undefined reference to pf_open(char const*)' C:\AppData\Local\Temp\build7310099894910129341.tmp/tft_menu.cpp:476: undefined reference topf_read(void*, unsigned short, unsigned short*)' C:\AppData\Local\Temp\build7310099894910129341.tmp/tft_menu.cpp:518: undefined reference to pf_read(void*, unsigned short, unsigned short*)' tft_menu.cpp.o: In functionshow_bitmap()': C:\AppData\Local\Temp\build7310099894910129341.tmp/tft_menu.cpp:603: undefined reference to `pf_readdir(DIR*, FILINFO*)'

Daarom denk ik dat et als een .cpp moet worden gecompileerd

Acties:
  • 0 Henk 'm!

  • Stukfruit
  • Registratie: Oktober 2007
  • Niet online
Helaas zal je topic zometeen waarschijnlijk worden afgesloten met een heel mooi glanzend slotje, want de eerste hit op Google met als zoekterm die (eerste) mooie error geeft je het exacte antwoord met de informatie die benodigd is om dit probleem mee op te lossen.

De andere hits waren trouwens links naar je topics op oa. Stackoverflow en Circuits Online.

Als je deze sites allemaal wel kan vinden, waarom dan niet Google?

Dat zit wel Schnorr.


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11-09 12:01
In C++ moet je conversion van en naar void* expliciet doen, in C hoeft dat niet. Er zijn dus eigenlijk 2 mogelijke manieren om deze bug te fixen:

- A Zorgen dat de library als C gecompileerd wordt. ( Wat normaal gesproken inhoud dat je het bestand (ook) een .c extensie geeft en niet .cpp ). Hiernaast zul je dus je C++ compiler/linker moeten instrueren dat deze module C symbolen bevat ipv C++ symbolen.
- B Zorgen dat de library gefixed wordt en op de plaatsen waar het fout gaat expliciet casten van/naar het gewenste type.

Ik zou voor optie B gaan omdat de rest van het Arduinio spul ook C++ is, als ik het me goed kan herinneren. Tevens zou je de maker kunnen mailen dattie zijn code fixed :)

[ Voor 8% gewijzigd door farlane op 02-01-2012 13:27 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@stukfruit, ik ben hier echt lang mee bezig geweest en het is mij nog niet gelukt om het op te lossen met de oplossingen die ik heb gevonden. Vandaar dat ik het maar heb gepost.

@farlane, ik zal even kijken of dat zal werken..

En verder, ik heb het bestand als cpp gedownload van: link

en dan arduino library en dan tft examples en dan tft_menu, dan zie je wel drie bestanden staan: bitmap [PDE bestand], calibrate[.cpp], f15x22[H bestand] en tft_menu[.cpp].

Vervolgens heb ik in mijn arduino project drie tabbladen:
1) tft_menu
2) bitmap
3) calibrate

Bovenaan in de bitmap file staat wel:
C: Arduino
3
4
5
extern "C"{
#include <pff.h>
#include <diskio.h>}


Maar wanneer ik dit run met pff.c: krijg ik dit soort errors:
tft_menu.cpp.o: In function `mount_sd()':
C:\AppData\Local\Temp\build6087887561127459103.tmp/tft_menu.cpp:580: undefined reference to `disk_initialize'
pff\pff.c.o: In function `get_fat':
C:\libraries\pff/pff.c:84: undefined reference to `disk_readp'
C:\libraries\pff/pff.c:85: undefined reference to `disk_readp'
C:\Arduino\libraries\pff/pff.c1: undefined reference to `disk_readp'
pff\pff.c.o: In function `dir_read':
C:\Arduino\libraries\pff/pff.c:251: undefined reference to `disk_readp'
pff\pff.c.o: In function `dir_find':

en wanneer ik het dus als .cpp bestand opsla krijg ik de fout waarmee ik deze topic ben begonnen.

En wanneer ik het in mijn tft_menu zet krijg ik ook een mooi waslijst aan errors met extern "c" rondom de include:
tft_menu:-1: error: 'POINT' was not declared in this scope
tft_menu:-1: error: 'tp' was not declared in this scope
tft_menu:-1: error: 'POINT' was not declared in this scope
tft_menu:-1: error: 'tp' was not declared in this scope
tft_menu:-1: error: 'POINT' was not declared in this scope
tft_menu:-1: error: 'displayPtr' was not declared in this scope
tft_menu:-1: error: 'POINT' was not declared in this scope
tft_menu:-1: error: 'screenPtr' was not declared in this scope
tft_menu:0: error: 'MATRIX' was not declared in this scope
tft_menu:0: error: 'matrixPtr' was not declared in this scope
tft_menu:0: error: initializer expression list treated as compound expression
tft_menu.cpp: In function 'uint8_t get_stable_tp(POINT*)':
tft_menu:135: error: 'uint8_t get_stable_tp(POINT*)' redeclared as different kind of symbol
tft_menu:-1: error: previous declaration of 'uint8_t get_stable_tp'
tft_menu.cpp: In function 'char tp_inside_menu(POINT*)':
tft_menu:161: error: 'char tp_inside_menu(POINT*)' redeclared as different kind of symbol
tft_menu:-1: error: previous declaration of 'char tp_inside_menu'


Ik ben hier al zo LANG mee bezig, ik zou een opl ECHT WAARDEREN!

PS: ik gebruik arduino 1.0 om te compileren etc.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Doe me even een plezier en edit ( Afbeeldingslocatie: http://tweakimg.net/g/forum/images/icons/edit.gif ) je posts even zodat je code tags gebruikt waar je code post; dat maakt 't geheel een stuk leesbaarder ;)
Stukfruit schreef op maandag 02 januari 2012 @ 06:44:
Helaas zal je topic zometeen waarschijnlijk worden afgesloten met een heel mooi glanzend slotje
Doe dan gewoon even een Topic Report (Afbeeldingslocatie: http://tweakimg.net/g/forum/images/icons/icon_hand.gif)
Neemt niet weg dat de topicstart eigenlijk veel te karig is (zie onze Quickstart over wat we hier verwachten van een topicstart) maar vanwege de behulpzame repliesy tot nu laat ik 't topic nog even open in de hoop dat 't vanaf nu de juiste richting in gaat ;)
Verwijderd schreef op maandag 02 januari 2012 @ 14:11:
Ik ben hier al zo LANG mee bezig, ik zou een opl ECHT WAARDEREN!
Allemaal aardig, maar in PRG is het credo:
Give a man a fish and feed him for a day. Teach a man how to fish and feed him for a lifetime.
We willen je best in de juiste richting wijzen maar oplossingen op een zilveren presenteerblaadje aanreiken is iets wat we hier niet doen ;)

[ Voor 79% gewijzigd door RobIII op 02-01-2012 14:25 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oke, push me maar in de juiste richting dan ;p

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

C en C++ hebben andere linkage; dus of je compiled alles als C, als dat kan, of alles als C++. Als je ergens de header include als extern "c", dan neemt de compiler aan dat die functies die daar gedeclareerd zijn C-linkage hebben. De corresponderende source file moet dan dus ook als C gecompiled worden. Dat is hier denk ik niet het geval, vandaar dat je die undefined references krijgt.

Maar ik zou gewoon C:\Arduino\libraries\pff\pff.cpp openen, naar regel 585 gaan, en ergens (unsigned char*) voor zetten. (google "error: invalid conversion from 'void*' to 'unsigned char*'")

[ Voor 29% gewijzigd door Zoijar op 02-01-2012 15:18 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja ik heb dat geprobeerd, ik had in eerste instantie dit:

C:
4
5
6
7
8
FRESULT pf_read (
 void* buff,  /* Pointer to the read buffer (NULL:Forward data to the stream)*/
 WORD btr,  /* Number of bytes to read */
 WORD* br  /* Pointer to number of bytes read */
)


in dit veranderd:
C:
4
5
6
7
8
FRESULT pf_read (
 unsigned char* buff,  /* Pointer to the read buffer (NULL:Forward data to the stream)*/
 WORD btr,  /* Number of bytes to read */
 WORD* br  /* Pointer to number of bytes read */
)


Maar beide opl werken niet[die van jou en van mij].

Ik heb nu dt bestand als cpp opgeslagen en in regel 585 heb ik
C:
1
2
 
BYTE *rbuff = (unsigned char*) buff;


en of ik nou boven in mijn code zonder extern c doe of wel maakt niet uit.
Maar volgens mij moet het zonder extern c. Maar ik krijg nu een hele boel errors.
Weer met die undefined resources

tft_menu.cpp.o: In function `open_root_dir()':
C:\Temp\build6087887561127459103.tmp/tft_menu.cpp:624: undefined reference to `pf_opendir'
tft_menu.cpp.o: In function `mount_sd()':
C:\Temp\build6087887561127459103.tmp/tft_menu.cpp:613: undefined reference to `disk_initialize'
C:\Users\Melkon\AppData\Local\Temp\build6087887561127459103.tmp/tft_menu.cpp:615: undefined reference to `pf_mount'
tft_menu.cpp.o: In function `bitmap_show(char*)':
C:\Temp\build6087887561127459103.tmp/tft_menu.cpp:502: undefined reference to `pf_open'
C:\Temp\build6087887561127459103.tmp/tft_menu.cpp:506: undefined reference to `pf_read'
C:\Temp\build6087887561127459103.tmp/tft_menu.cpp:548: undefined reference to `pf_read'
tft_menu.cpp.o: In function `show_bitmap()':
C:\Temp\build6087887561127459103.tmp/tft_menu.cpp:633: undefined reference to `pf_readdir'

Acties:
  • 0 Henk 'm!

  • Stukfruit
  • Registratie: Oktober 2007
  • Niet online
Dan moet je die functies opzoeken en bekijken of de betreffende bestanden worden meegecompileerd en gelinkt. Heb je al eens wat beginnerstutorials gedaan? Ik krijg het idee dat je er in probeert te springen zonder de documentatie (over programmeertalen) eerst door te lezen. Dat zou het echt veel makkelijker voor je maken :Y
RobIII schreef op maandag 02 januari 2012 @ 14:22:
Doe dan gewoon even een Topic Report ([afbeelding])
Maar dan had hij misschien niet geweten dat het antwoord te vinden is op Google ;(

Dat zit wel Schnorr.


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11-09 12:01
Verwijderd schreef op maandag 02 januari 2012 @ 15:28:
Ja ik heb dat geprobeerd, ik had in eerste instantie dit:
...
Je moet uitgaan van je situatie aan het begin van dit topic (Overal waar je extern "C" hebt toegevoegd dus weghalen), en vervolgens de regel waar je de fout op krijgt fixen door de cast expliciet te doen zoals je aangeeft.

Ook moet je de bestanden waarin deze functies worden gedefinieerd toevoegen aan je project ( o.a dus pff.c waarin o.a. pf_open is gedefinieerd )

[edit]
Wacht ff, pff.cpp bestaat helemaal niet in de originele library, deze heet dus pff.c. Maw deze zal waarschijnlijk als C gecompileerd worden.

Als je de header van dit bestand( pff.h) include vanuit een C++ module, moet je dat doen met een extern "C" er om heen omdat die functie C linkage hebben. Dit geldt voor alle .c modules die je bij in je project hebt zitten.

[ Voor 25% gewijzigd door farlane op 02-01-2012 16:13 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Lol, ik startte dus vanaf begin zoals OP, en zocht dus naar die functies, bleek dat die in mmc.c zitten en dat ze er niet bij geinclude zijn. Dus ik heb ze geinclude nu. En nu geeft ie mij deze error vanaf init_spi():

C:
1
2
3
4
5
6
7
DSTATUS disk_initialize (void)
{
    BYTE n, cmd, ty, ocr[4];
    WORD tmr;


    init_spi();


C:\libraries\mmc/mmc.h: In function 'void init_spi()':
C:\libraries\mmc/mmc.h:21: error: 'PORTL' was not declared in this scope
C:\libraries\mmc/mmc.h:21: error: 'PORTL0' was not declared in this scope
C:\libraries\mmc/mmc.h:22: error: 'PORTB' was not declared in this scope
C:\libraries\mmc/mmc.h:22: error: 'PORTB2' was not declared in this scope
C:\libraries\mmc/mmc.h:22: error: 'PORTB1' was not declared in this scope
C:\libraries\mmc/mmc.h:23: error: 'DDRB' was not declared in this scope
C:\libraries\mmc/mmc.h:23: error: 'PORTB0' was not declared in this scope
C:\libraries\mmc/mmc.h:25: error: 'DDRL' was not declared in this scope
C:\libraries\mmc/mmc.h:27: error: 'SPCR' was not declared in this scope
C:\libraries\mmc/mmc.h:27: error: 'SPE' was not declared in this scope
C:\libraries\mmc/mmc.h:27: error: 'MSTR' was not declared in this scope
C:\libraries\mmc/mmc.h:28: error: 'SPSR' was not declared in this scope
C:\libraries\mmc/mmc.h:28: error: 'SPI2X' was not declared in this scope

En ik ben aan het uitzoeken hoe ik deze definities eraan toevoeg

#include TFT_ARDUINO_MEGA.h [had ik al in mijn sketch staan, maar nu heb ik het in de mmc.h gezet]

Geen verschill... Maar ik ben toch wel op de goede weg nu??

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11-09 12:01
Dit
C++:
1
2
3
4
5
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#include <TFT_Arduino_Mega.h>
#else
#include <TFT_Arduino.h>
#endif

staat bovenin mmc.h waaruit ik kan opmaken dat __AVR_ATmega2560__ gedefineerd zou moeten zijn. Waarschijnlijk moet je in je project settings nog het goede platform/target kiezen?

[edit]
Hmm die shortcuts worden juist in TFT_Arduino_Mega.h gedefinieerd. Je mist echter wel nog een include naar je "systeem processor include" waarin die registers echt gedefinieerd worden. Dwz voordat de compiler die inline functie tegenkomt moet hij de echte definitie van "PORTL" etc kennen.

Die systeemheader heet waarschijnlijk "atmega2560.h" oid.

[ Voor 34% gewijzigd door farlane op 02-01-2012 16:56 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja ik heb

code:
1
2
3
4
5
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#include <TFT_Arduino_Mega.h>
#else
#include <TFT_Arduino.h>
#endif


veranderd naar

code:
1
#include <TFT_Arduino_Mega.h>


in mcc.h, geen vooruitgang met dit :o

Het rare is dat het deze kerel wel gelukt is, dus wat doe ik verkeerd?? Ik heb ook de 2.4 inch library gedownload en geprobeerd en ik krijg dezelfde error...

http://arduino.cc/forum/index.php/topic,85061.0.html

[ Voor 29% gewijzigd door Verwijderd op 02-01-2012 18:50 ]


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11-09 12:01
Verwijderd schreef op maandag 02 januari 2012 @ 17:13:
Ja ik heb

code:
1
2
3
4
5
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#include <TFT_Arduino_Mega.h>
#else
#include <TFT_Arduino.h>
#endif


veranderd naar

code:
1
#include <TFT_Arduino_Mega.h>


in mcc.h, geen vooruitgang met dit :o
Dat komt zoals ik in de edit al aangaf dat hier niet het probleem zit. Als je nl gaat kijken wat er in TFT_Arduino_Mega.h staat dan kun je zien dat deze processor specifieke registers gebruikt, maar niet definieert. Maw als je TFT_Arduino_Mega.h include ( direct of indirect ) moet je ook de processor specifieke header includen.
Ik ken het Arduino build platform verder niet maar normaal zou je een header met als naam oa het het typenummer van de specifieke processor verwachten ( iets met "2560" erin dus ofzo ), of een systeemheader die afhankelijk van je gekozen target ( mbv de __AVR_ATmega2560__ macro ) de correcte systeemheader include.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik snap wat je bedoelt, maar volgens mij doe ik dat al wanneer ik bij arduino naar tools > board > arduino mega 2560 kies.

Maar klopt het wel dan dat ik de bestanden die in de tft_menu stonden; tft_menu [.pde], calibration[.cpp] en bitmap[.cpp] , als drie verschillende tabbladen heb ingevoerd? Misschien zit daar in de fout??

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11-09 12:01
Verwijderd schreef op maandag 02 januari 2012 @ 20:04:
Ik snap wat je bedoelt, maar volgens mij doe ik dat al wanneer ik bij arduino naar tools > board > arduino mega 2560 kies.
Waarschijnlijk wordt daardoor de __AVR_ATmega2560__ macro gedefinieerd, maar daarmee zorg je er nog niet voor dat een of andere c header die je extern ergens vandaan haalt de processor specifieke headers include.
Maar klopt het wel dan ..
Ik ken die IDE niet.

Vergeet Atmel en PIC, Cortex-M devices zijn sneller, goekoper, hebben meer peripherals en hebben minder last van vendor-lockin

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dit probleem is gefixt.

Het probleem was dat ik niet goed had gelezen en dacht dat ik de libraries moest kopieren naar een mapje die aruino zelf had gemaakt in mijn documenten 'Arduino' en dan daar een map libraries aan moest maken en daar voor elk .cpp en .h een map moest maken met de desbetreffende naam van de header en dan de .cpp/.c/.h erin zetten.

Ik kon ze wel daarna bij import library boven kiezen, dus ik dacht dat dat wel goed was, maar niet dus.

Oplossing: Wanneer je Arduino download en unzipt, staat er een folder bij, Libraries. Die open je en vervolgens exctract je de map met alle libraries en examples die erin zitten naar je map 'Libraries'.

En nu werkt het :)
Pagina: 1