Warning: Illegal string offset 'name' in [path]/includes/functions.php on line 6439
Atmelis un C
+
1 2 3 ...

thread: Atmelis un C

  1. #1
    Senior Member
    Nov 2009
    Jēkabpils
    2,046

    Atmelis un C

    Šovakar jau vēls, bet tomēr uzrakstīšu tēmējot uz rītdienu.
    Tātad rakstam kodu iekš C. Ir VirtualWire bibliotēka priekš Arduino, bet gribu bez Arduino (nu gribu un viss). Viss jau darbojas - 328P ar raidītāju galā un uztvērējs ar otru 328P galā. Kods ir vienā c failā bez dažām konstantēm, kuras ir h failā. Šī jebstiņa laikā radās jautājums.
    1. Ir fails "bibiliotēka.h", kurā ir bez visādām konstantēm ir definētas funkcijas, kuru rumpji ir failā "bibliotēka.c".
    2. Failā "bibliotēka.c" ir rinda "#include <bibiliotēka.h>"
    3. Ja es savā projektā ielieku rindu "#include <bibiliotēka.h>", tad viss notiekās.
    Bet, ja es:
    1. Uztaisu failu "fēcas.h", kur definēju funkcijas, kuru rumpji ir citā uztaisītā failā "fēcas.c"
    2. Failā "fēcas.c" ir rinda "#include <fēcas.h>"
    3. Ielieku savā projektā "#include <fēcas.h>" un izmantoju tur definētās funkcijas un dabūju "undefined reference to ...manas funkcijas".
    Nu it kā jau veselais saprāts saka, ka, kā lai nabaga kompilators zina, ka viņam jāmeklē to funkciju rumpji failā "fēcas.c", jo iekš h nav nekādas norādes. Protams, ja ielieku "<include <fēcas.c>" arī, tad viss aiziet. Bet, velns parāvis, iekš "bibliotēka.h" arī nav norādes, bet Arduino visu atrod! Kur tas dzivnieks ir aprakts?

  2. #2
    Senior Member
    Mar 2003
    Rīga
    840

    *.C failus paarsti neincludo. Tas nav labais stils. Ātrumā izskatās, ka kompilators nevar atrast ceļu pie taviem include failiem. Liec to "fēcas.h" (intersants faila nosaukums pēdiņās nevis trīsstūriekavās.
    P.S. Un lieto #ifndef #define #endif savos header failos

  3. #3
    Senior Member
    Nov 2009
    Jēkabpils
    2,046

    Ja ielieku trīsstūriekavās visu ceļu, tad h failu atrod. Ja to h ielieku blakus citām bibliotēkām, tad viss ir cmuki. Un, ja funkciju rumpji ir failā h, tad viss ir ok. Bet, ja funkciju rumpji ir failā c (kurš atrodas tajā pašā vietā, kur h), tad neatrod. Bet standarta virtualwire.h virtualwire.c gadījumā atrod.
    Paldies par norādi uz to #ifndef #define #endif vakarā izmēģināšu. Jāpalasa kāda grāmata par c.

  4. #4
    Senior Member
    Mar 2003
    Rīga
    840

    Nu tad papēti vēl. Parasti šādas problēmas ir paša programmētāja neuzmanības dēļ. Include ceļā drīkst norādīt arī mapi, netikai pašu failu. Kaut kā tā "mape\heder.h". Tāpat arī IDE compilator uzstādījumos vajag pārbaudīt un uzlikt, kādos folderos šie include faili tiek meklēti.

  5. #5
    Senior Member
    Jul 2007
    Rīga, Lēdmane
    124

    Include norādes uz lokāliem header failiem parasti liek pēdiņās. Trīsstūriekavās liek norādes uz iebūvētajām bibliotēkām, piem., <stdio.h>

    Parasti visos IDE *.c faili jāsaliek "Project explorer" (kā nu kur to sauc) mapēs, lai kompilators zin ko kompilēt. *.c faili netiek meklēti pa mapēm, kā *.h faili.

    Protams, projekta opcijās jābūt norādēm uz visām mapēm, kur ir *.h faili.

  6. #6
    Senior Member
    Nov 2009
    Jēkabpils
    2,046

    Bet tad man savā *.h failā jāliek arī visu funkciju rumpji? Pēc analoģijas ar to virtualwire bibliotēku - tās *.h failā neatrodu nekādu norādi, ka funkciju rumpji jāmeklē blakus esošajā *.cpp failā, bet kompilators funkcijas atrod. Savukārt, ja es definēju funkcijas *.h failā, bet pašas funkcijas uzrakstu blakus esošajā *.c failā, tad manas funkcijas kompilators neatrod.

    p.s. muldu laikam bišķi nesakarīgi, tik daudz jaunas informācijas ienācās, kopš ar to c sāku ņemties.

  7. #7
    Senior Member
    Sep 2006
    Riga
    3,053

    .h ir headeris - instrukcija izsaukšanai.
    .c/.cpp - izsaukšanas realizācija
    IDE kompilējot jāuztaisa no. cpp "obj.kods", ko beigās salinko veselā vienumā

    .h nekas nav jāzin par .cpp. tikpat labi var būt pliks gatavs .DLL (ielādēts no hakeru saita) un tīrs .h, ko izmantot jau savā projektā (slēgtā realizācija/draiveris/plugins un etc)

  8. #8
    Senior Member
    Nov 2009
    Jēkabpils
    2,046

    Sorry par neattapību, bet, ja virtualwire.h ir definētas funkcijas, kuras ir uzrakstītas virtualwire.cpp, tad tur viss notiekās, bet, ja es no sava strādājošā projekta .c faila aiznesu funkciju definīcijas uz mansvirtualwire.h un pašas funkcijas uz mansvirtualwire.c un mana projekta .c failā (un pēc tam citiem raidītājiem/uztvērējiem domātajiem kodiem) inklūdoju to mansvirtualwire.h, tad dabūju kļūdu. Ja daru nesmuki un inklūdoju arī mansvirtualwire.c, tad viss strādā.
    Gan jau problēma ir tik stulba un vienkārša, ka tas, kurš ar c uz TU, nesaprot, kur problēma .

    edit: tfu, ieciklējos uz sīkumiem. Viss atrisinājies.

  9. #9
    Moderator
    Jan 2009
    Rīga
    4,413

    edit: tfu, ieciklējos uz sīkumiem. Viss atrisinājies.
    Kā? Man, kā C dundukam, liekas interesanti. Varbūt vari parādīt "nepareizos" un "pareizos" .h un .c failus. Kā arī fīča kur arškirība.

  10. #10
    Senior Member
    Nov 2009
    Jēkabpils
    2,046

    Problēma nebija pareizajos un nepareizajos .c un .h failos, bet tur, ka iekš IDEs (šajā gadījumā Atmel Studio) vajadzēja salikt projektā ceļus, kur meklēt tos failus. Līdzko tas tika izdarīts, viss notikās. Galīgi neesmu speciālists, bet pieņemu, ka, ja ir zināms ceļš, tad, ja .c un .h ir ar vienādiem nosaukumiem, kompilators pats sajēdz, ka iekš .h definēto funkciju "rumpji" jāmeklē blakus esošajā .c /.cpp failā. Galvenajā failā pietiek ar to, ka inklūdo .h.

    Vakar "uzmetās" nākamā c nespeciālista problēma. Galīgi sa...su prātu ar pointeriem. Problēma, ka vajag nodefinēt portu, kuru iebarot funkcijai kā mainīgo. Kamēr viss bija vienā failā izlīdzējos ar #define izteiksmi, bet, kad funkcijas aiznesu prom uz inklūdojamo failu, tā vairs nesanāk (jeb nemāku pareizi izdarīt). Iebarot funkcijai portu iemanījos, bet pirms tam dabūt, lai cita funkcija to iebarojamo portu atgriež kā vērtību... ai, karoče, jāņem pārtraukums ...

    edit:
    velns, ar to c var triperi dabūt...... Kāpēc jātaisa šāda konstrukcija?

    #define __COMB(a,b,c) (a##b##c)
    #define _COMB(a,b,c) __COMB(a,b,c)

    Ar ko tās divas apakšsvītras atšķiras no vienas apakšstrīpas?

+