Archief - [PROG][C, C++] C en Qt 4.1 mengen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

forloRn_

Legacy Member
Goedenavond,

Een vriend van me heeft gevraagd om met behulp van Qt een deftige GUI rond zijn C-applicatie te bouwen. Het gaat hier om een programma dat in staat is om een Anadigm-chip te herconfigureren, maar dat is naast de kwestie.

De C-applicatie compileert en werkt zonder problemen. Het hoofdprogramma (alles zit in main()) heeft hij zelf geschreven, de rest van de bestanden (ApiCode.h, ApiCode.c, CAMCode.h, CAMCode.c) zijn gegenereerd door een tool van Anadigm zelf.

Ik ging ervan uit dat ik de Anadigm-bestanden mocht behouden, en enkel het hoofdprogramma moest herschrijven met behulp van Qt. Zo gezegd, zo gedaan. Compileren doe ik via de console met qmake -project, qmake en make. Hierbij geeft de compiler de volgende warnings:

Code:
ApiCode.c:207: warning: ‘an_FPAA1_InputCell1_IOCell’ initialized and declared ‘extern’
ApiCode.c:218: warning: ‘an_FPAA1_InputCell2_IOCell’ initialized and declared ‘extern’
ApiCode.c:229: warning: ‘an_FPAA1_InputCell3_IOCell’ initialized and declared ‘extern’
ApiCode.c:240: warning: ‘an_FPAA1_InputCell4_IOCell’ initialized and declared ‘extern’
ApiCode.c:251: warning: ‘an_FPAA1_OutputCell1_IOCell’ initialized and declared ‘extern’
ApiCode.c:262: warning: ‘an_FPAA1_OutputCell2_IOCell’ initialized and declared ‘extern’
ApiCode.c:273: warning: ‘an_FPAA1_filt0_0_Capacitor’ initialized and declared ‘extern’
ApiCode.c:286: warning: ‘an_FPAA1_filt1_0_Capacitor’ initialized and declared ‘extern’
ApiCode.c:299: warning: ‘an_FPAA1_filt2_1_Capacitor’ initialized and declared ‘extern’
ApiCode.c:312: warning: ‘an_FPAA1_filt3_1_Capacitor’ initialized and declared ‘extern’

Die variabelen zijn overal extern gedeclareerd: ik kan nergens een gewone declaratie vinden. Waarom vindt de C-compiler dat okee, en de C++-compiler niet?

Goed, het programma is met succes gecompileerd. Het draait perfect, tot ik op de knop "Genereer stream" druk; dan crasht het met een segmentation fault. Ervaring heeft me geleerd dat zoiets weleens voorkomt als je variabelen probeert aan te spreken waarvoor geen geheugen gereserveerd is. Is er enig verband met die warnings hierboven?

De schuldige lijnen in anadigmform.cpp zijn in ieder geval de volgende:
Code:
an_SetBQLowPassFilterI(6, 0.200, 1, 1.30651);
an_SetBQLowPassFilterI(7, 0.200, 1, 1.30651);

Kort gezegd: ik heb me er suf op gezocht, maar ik weet niet waarom het programma crasht. Heeft er iemand een idee? En mag ik C en Qt (C++) zomaar mixen?

De bestanden vind je hier.

forloRn_

Legacy Member
Goed, ik kan aannemen dat niet iedereen zin heeft om doorheen die Anadigm-code te ploegen, maar kan er mij dan iemand uitleggen waarom de compiler die warnings geeft? :unsure:

fretn

Legacy Member
fretn@leiah:~/c/anadigm$ make
g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_CORE_LIB -DQT_GUI_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/default -I. -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtCore -I/usr/include/qt4 -I. -I. -I. -o anadigm.o anadigm.cpp
In file included from anadigm.cpp:2:
anadigmform.h:5:28: error: ui_anadigmform.h: No such file or directory
anadigmform.h:17: error: ‘Ui’ has not been declared
anadigmform.h:17: error: field ‘ui’ has incomplete type
make: *** [anadigm.o] Error 1

kan je alle files eens online zetten ?

forloRn_

Legacy Member
Normaal gezien zou make anadigmform.ui zelf moeten omzetten naar ui_anadigmform.h. Ik heb ui_anadigmform.h ondertussen in het zip-bestand gestopt.

fretn

Legacy Member
heb makefile gemaakt met qmake-qt4 en die deed dat blijkbaar niet :)

efkes proberen !

edit: blub nieuwe errors

anadigm.o: In function `~AnadigmForm':
/home/fretn/c/anadigm/anadigmform.h:10: undefined reference to `vtable for AnadigmForm'
/home/fretn/c/anadigm/anadigmform.h:10: undefined reference to `vtable for AnadigmForm'
anadigmform.o: In function `AnadigmForm':
/home/fretn/c/anadigm/anadigmform.cpp:6: undefined reference to `vtable for AnadigmForm'
/home/fretn/c/anadigm/anadigmform.cpp:6: undefined reference to `vtable for AnadigmForm'
/home/fretn/c/anadigm/anadigmform.cpp:6: undefined reference to `vtable for AnadigmForm'
anadigmform.o:/home/fretn/c/anadigm/anadigmform.cpp:6: more undefined references to `vtable for AnadigmForm' follow
collect2: ld returned 1 exit status

forloRn_

Legacy Member
Heb het zip-bestand uitgepakt in Windows en daar gecompileerd: werkt perfect. Doe eens een make clean en dan weer qmake -project, qmake en make.

Werkt perfect as in: het compileert. Het crasht nog altijd als ik op de knop druk.

forloRn_

Legacy Member
Dit is een screenshot van de debugsessie in KDevelop:

debugged.png


Enig idee?

forloRn_

Legacy Member
En dit is een screenshot van de an_GrowReconfigData-methode die aangeroepen wordt vóór de lijn die zorgt voor de segmentation fault:

an_GrowReconfigData.png


Code:
pInfo->data = (an_Byte*) realloc(pInfo->data, pInfo->capacity);

Zou het kunnen dat pInfo->data 0x0 wordt na de aanroep van realloc?

wlibaers

Legacy Member
forloRn_ zei:
Zou het kunnen dat pInfo->data 0x0 wordt na de aanroep van realloc?

Breakpoint op zetten en testen.

killgore zei:
normaal nie, tenzij em geen groot genoeg blok vind d8 ik.

En dan krijg je ook een memory leak. Maar tenzij je echt grote stukken geheugen gebruikt is de kans klein.

forloRn_

Legacy Member
Ik was in het begin een methode vergeten aan te roepen die de data initialiseert. :$

fretn

Legacy Member
:D
de problemen die je meest kopzorgen bezorgen zijn meestal zo'n kleine dingen :D

forloRn_

Legacy Member
Maakt niet uit. Nu heb ik tenminste geleerd hoe je moet debuggen.

killgore

Legacy Member
forloRn_ zei:
Maakt niet uit. Nu heb ik tenminste geleerd hoe je moet debuggen.
De basis toch :)

Het debuggen van code-logica en niet zomaar compiler foutjes is een zo mogelijk nog rottiger deel.

NecroNeo

Legacy Member
killgore zei:
Het debuggen van code-logica en niet zomaar compiler foutjes is een zo mogelijk nog rottiger deel.

Volledig mee akkoord, net weer een kwartier gezocht achter een domme bug. Bleek een > ipv >= te zijn in een functie die op het eerste zicht niets met die bug te maken had :doh:

forloRn_

Legacy Member
killgore zei:
De basis toch :)

Het debuggen van code-logica en niet zomaar compiler foutjes is een zo mogelijk nog rottiger deel.

For the record: het ging hier niet om compilerfouten (die warnings waren onschadelijk). Bovendien kan je compilerfouten niet debuggen, om de eenvoudige reden dat er weinig te debuggen valt als het niet compileert. :p
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan