foutmelding githubsoftware

Ik heb van GITHUB het DS1844-Master programma gedownload. Helaas werkt het niet als je het in de arduino IDE download.

Ik krijg de volgende foutmelding:

Multiple definition of 'DS1844::write(int,int)

Nu is de foutmelding wel duidelijk. De compiler merkt dat er iets meerdere keren wordt gedefinieerd en klaagt daar over.

Alleen kan ik die meerdere definities niet vinden in de drie programma's. die met github downloads zijn meegekomen. Het gaat in dit geval om een om een header (.h )bestand. Het driver programma ( een .cpp bestand. ) een een example.

Zie ook:

https://github.com/prphntm63/DS1844

Ik begrijp eigenlijk niet goed waardoor ik die foutmelding krijg. Een dubbele definitie zie ik niet.

Tevens begrijp ik niet helemaal wat de volgende definitie inhoud.
Wat betekend de volgende regel nu eigenlijk heel precies?

DS1844::DS1844(int address)

De integer address wordt hier meegegeven aan de functie DS1844. Maar wat willen ze nu met die dubbele punten. Dat bgrijp ik eigenlijk niet.

Met al dat moeilijke gedoe willen ze gewoon een byte met de hulp van de functie in wire.h naar de potmeter sturen. Ik wil een keer met een library werken vandaar dat ik dit eens probeer. Anders kan ik makkelijker gewoon meteen een byte in de wire functie stoppen. Zo moeilijk is dat nu ook weer niet.
Ik zie niet zo gauw iets in het Nederlands, maar hier staat e.e.a. in het Engels:
https://www.quora.com/What-is-the-meaning-of-in-C++
[Ik ben zelf nooit verder gekomen dan kaal C.]
Het voorbeeld dat je erbij krijgt vanaf github DS1844_example.ino compiled hier prima zonder foutmeldingen.

De DS1844::DS1844 geeft aan dat DS1844 is een functie van de klasse DS1844. Net zoals DS1844::write(int,int) write is een functie van de klasse DS1844.
Maar dat heb je helemaal niet nodig in Arduino, kijk naar het voorbeeld en het moet zo draaien.
Bedankt 2N3055.

Ik heb het compileer probleem nu gedeeltelijk opgelost door alles op een andere computer te doen. In dit geval een linux machine met de arduino ide. Als je het voorbeeld en de driver in de voorbeelden installeert, je moet dan wel even het streepje uit de naam halen anders slikt de ide het niet, dan werkt het gewoon en het downloaden lukt ook en de software draait ook nog.

Op de windhoos machine heeft de ide geen problemen met het streepje in de naam. Maar ik krijg wel de al genoemde foutmelding tijdens het compileren.

Op de linux machine draai ik versie 2:1.0.5+dfsg2-4.1
Op de windhoos machine draai ik versie 1.8.8

De windowsversie zou de nieuwste moeten zijn. Ik kan absoluut niet ontdekken waarom dit gebeurt. Ik heb dit namelijk ook met een ander gedownload programma maar dan net andersom. Werkt wel op het windows platform en niet op het linux platform.

Helemaal zelf een programma maken is geen probleem dat werkt dan op beide platformen. Alleen die gedownloade dingen doen moeilijk. En waarom joost mag het weten.
Als je exact het example gebruikt zie ik ook niet zo waarom die warning komt. Het klink mij een beetje alsof je eerst een keer de functie aanroept voordat de declaratie gedaan wordt. De compiler neemt dan eerst een soort default aan ("het zal wel een int zijn want dat doen ze meestal..") en als je daarna de functie declareert met wat het echt is krijg je zo'n melding. Nou zie ik dat hier niet direct gebeuren...

Heb je toevallig een andere library staan waar dezelfde class in zit?
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Ik heb pas nog wat met arduino zitten doen. Mijn Linux machine had op dat moment inderdaad 1.0.5 , maar ik moest een nieuwere versie (niet zo nieuw als 1.8.8) hebben om het te laten draaien.

De gcc compiler die onderwater gebruikt wordt, geeft bij een multiple definition (tegenwoordig) prima aan waar de eerdere definitie zit. Het zou kunnen dat de arduino IDE compiler opties meegeeft om dat te onderdrukken. Dan is dat dom.

Van die "multiple definition" zou ik denken: tegenwoordig zit die functie er al vanzelf in, dus heb je een overbodige library of zo meegenomen.

De nieuwere versie doet bij mijn weten moeilijker over bestandsnamen. Die probeert te forceren dat bestandsnamen zowel op Linux als op Windows geen problemen KUNNEN geven. Extra voorzichtig dus. Het duurt effe voordat iedereen door de nieuwe foutmeldingen z'n library heeft aangepast, tot die tijd kan het zijn dat je zo nu en dan zelf dingen moet hernoemen.
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Ik ben nog even aan het puzzelen geweest en ze gebruiken altijd al onderwater de GCC, en avrdude met bijbehorende linkers, makefiles. Het is ook altijd lastig om uit te vinden waar je librarys moet plaatsen. Bij linux staan ze onder usr/share/arduino en bij windows staan ze onder de x86 windows directory.

Plaats je ze verkeerd dan vind hij ze niet en gaat het linken weer fout.

Ik heb nu de indruk dat de linker de header en driver bestanden twee keer vind en ook twee keer aan elkaar plakt. Als dan in de laatste stap de compiler er overheen gaat ziet die dus alles twee keer en dan krijg je de foutmeldingen van die dubbele declaraties.

Op de Windows machine zie ik in de ide ook twee tabbladen erbij komen. Ik heb totaal drie tabbladen De eerste bevat het programma example de tweede is het header bestand en de de is de eigenlijke library. Het is heel handig dat het zo staat je kunt gewoon in een tablad kijken de header in elkaar steekt. Wat de keywords zijn enz. En nu denk ik ook dat daar het probleem schuilt.

Ik denk dat de linker de bestanden uit de tabbladen meeneemt en de bestanden die in de librarymap staan. Dan staat alles er dus twee keer in.

Vervolgens komt de linker er achter dat er dan opeens dingen dubbel gedeclareerd zijn. Met de genoemde foutmelding als gevolg.

Het is wat dat betreft wel jammer dat er geen uitgebreide raportage bestanden meer gegenereerd worden en dat ik ook geen makefiles kan vinden. Waarschijnlijk wordt alles met opties onderdrukt. Daar staan dit soort fouten dan netjes in beschreven.

Maar ik ga nog even verder zoeken naar waar dit probleem zou kunnen zitten.

Edit: Even een correctie naar de opmerking van rew.

De linker is de laatste stap in het proces. De foutmelding komt uit de compiler en niet uit de linker. In de linker worden de adressen en sprongen uitgerekend en de door de compiler gegenereerde hex code op de juiste adressen gezet. Aldus verkrijgt men een hex bestand dat de controler kan worden ingeschoten.

[Bericht gewijzigd door Ex-fietser op 16 maart 2019 13:18:39 (10%)]

Op 16 maart 2019 12:36:32 schreef Ex-fietser:

Ik heb nu de indruk dat de linker de header en driver bestanden twee keer vind en ook twee keer aan elkaar plakt.
Je krijgt een foutmelding van de compiler, niet van de linker. De linker komt NA de compiler. Als de compiler een foutmelding geeft komt de linker niet aan bod.
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Je hebt helemaal gelijk rew. Ik heb het niet helemaal juist verwoord. Maar mijn vermoeden dat de boel twee keer wordt meegenomen zou nog steeds kunnen.
Die libraries staan bij mij gewoon naast het project, op dezelfde hoogte dus. Niet in de arduino installatie. Althans, daar zet ik ze zelf neer natuurlijk :-) Zou ik dat zelf ooit zo ingesteld hebben, hmm...
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Arduino 'speelt vals'. :9

Die gebruikt wel een standaard C++ compiler, maar de .ino files gaan eerst door een Arduino pre-processor die automatisch een -onzichtbare- header aanmaakt, zodat het voor de gebruiker lijkt alsof funkties niet gedeclareerd hoeven te worden.

Dat kan soms wel eens problemen geven.
Moderne Arduino software heeft een paar plekken waar de libs kunnen staan. Dit om het makkelijker te maken om een "uitbreidings library" toe te voegen ook als je geen rechten hebt om die in de systeem directory er bij te plaatsen.

De meeste libraries/headers beginnen met
c code:
 
#ifndef DS1844_H
#define DS1844_H
...
..de header...
#endif
 
zo wordt de header maar 1x gebruikt ook al include je hem perongeluk twee keer.

code:
grep -r DS1844::write / 

en je weet waar ie allemaal gedefinieerd wordt. (ik denk eerder dat er twee verschillende bestanden zijn waar ie in gedefinieerd wordt, die subtiel verschillende spelling hebben voor de DEFINE om te voorkomen dat ie dubbel ge-include wordt.....
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Bedankt REW,

Ik heb het probleem inmiddels verholpen door in mijn windows machine alles wat de bij de github 1844 software hoort te verwijderen en weer opnieuw in zowel de examples als de library directory te zetten. Als ik nu het voorbeeld in de example directory open gaat het wel goed. Ik krijg ook geen tabs te zien in de ide. Als ik het niet in de lib directory zet gaat het fout.Dan begint ide te zeuren over het niet vinden van header file enzo.

Maar het werkt nu. Alleen blijft de arduino directory structuur voor mij een duistere zaak.