 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3358 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Sre Sep 21, 2011 10:51 pm Naslov sporočila: GNU C pomoč začetniku |
|
|
Pozdrav,
Napisal sem funkcijo, ki sem jo poimenoval NMEAXOR. Funkcija dela.
V programu definiram funkcijo najprej nekje na začetku:
Koda: |
int NMEAXOR(char *NMEAtelegram); |
Potem sledi glavni program, kjer funkcijo kličem in uporabljam, na koncu pa je sama funckija.
Tak način je v redu, dokler funkcijo razvijam in testiram. Ko pa je izdelana, bi jo rad dal kot datoteko na disk tako, da bi programer glavnega programa samo z nekim stavkom in samo na enem mestu (morda include ali podobno) poklical to kodo, in jo potem v glavnem programu uporabil.
Kako?
Za orientacijo prilagam program, kjer sem funkcijo testiral.
Koda: |
// Startam compile z gcc source -o output
// program za testiranje funkcije NMEAXOR
#include <stdio.h>
#include <string.h>
int NMEAXOR(char *NMEAtelegram);
int main()
{
char tekst[60];
int napaka;
// Testiraj tako, da daš različne informacije v strcpy ukaz, ki sledi:
// v spremenljivko dam informacijo:
strcpy(tekst,"$GPGSV,3,3,10,32,41,224,45,37,,,43,,,,,,,,*4A");
//strcpy(tekst,"$Test,1,722,899,,Konec*3A");
printf ("%s\n" , tekst) ; // in jo prikažem
// kličem funkcijo NMEAXORCHECK
napaka = NMEAXOR(tekst);
// vsebina spremenljivke po klicu funkcije:
printf ("Po povratku iz funkcije je polje tekst\n");
printf ("%s\n" , tekst) ;
printf ("In koda povratka je %d\n", napaka);
return 0; // kone progrma
}
// Funkcija NMEAXOR
int NMEAXOR(char *NMEAtelegram)
/*
Funkcija služi za generiranje ali preverjanje zadnjih dveh znakov
NMEA telegrama, ki vsebujeta xor vsebino telegrama v znakovni obliki
Če je v argumentu vsebina z kontrolnima znakoma, funkcija ta dva znaka preveri
kar je uporabno pri sprejetih informacijah
Če pa v argumentu vsebina še nima teh dveh kontrolnih znakov, jih funkcija doda
kar je uporabno predno oddamo telegram na linijo
Če sta znaka prisotna in pravilna, ali če ju ni in jih funkcija generira
bo koda provratka 0
NMEA telegram se začne z $ in konča z * in izza znaka * pridega dva znaka
ki predstavljata xor vsebino vseh znakov med $ in *.
Sicer so kode povratka še
2 - kar pomeni prvi znak ni $
3 - kar pomeni ni znaka * do 57.tega znaka, saj je maksimalna dolžina 60
*/
{
// lokalne spremenljivke
int i;
int j;
char kk;
char kj;
// ali je prvi znak $?
if (NMEAtelegram[0] != '$') return 2 ;
// iščem znak * in posredno dolžino telegrama
for (i = 1; ( (i != 57) && (NMEAtelegram[i] != '*')) ; i++);
if (i == 57 )
{ // nismo nasli * ali stavek predolg
return 3;
}
else
{
// izračunamo xor informacijo
kk = 0;
for (j = 1; j < i ; j++) kk = kk ^ NMEAtelegram[j];
// informacijo prenesemo v dva bajta, v vsakem bomo
// obdelali polovico bajta rezultata
kj = kk;
kj &= 0xf0; // na kj brišem desno polovico bajta
kk &= 0x0f; // na kk brišem levo polovico bajta
kj = kj >> 4 ; // levo polovico šibam 4 bite desno
// iz tabele poberem prave ascii znake
char tabela[] = "0123456789ABCD";
kj = tabela[kj];
kk = tabela[kk];
// imamo kontrolna znaka v kj in kk
// znak izza * bo določil, ali preverjamo ali dodajamo
// kontrolna znaka
if (NMEAtelegram[i+1] == 0)
{ // ne gre za preverjanje, dodajamo znaka:
NMEAtelegram[i+1] = kj;
NMEAtelegram[i+2] = kk;
NMEAtelegram[i+3] = 0;
return 0;
}
else
{ // preverjamo ali sta v telegramu prava znaka
if ( NMEAtelegram[i+1] == kj &&
NMEAtelegram[i+2] == kk &&
NMEAtelegram[i+3] == 0)
return 0 ; // koda pravilna
else return 1 ; // koda napačna
}
}
}
|
|
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.66 Kraj: Zagorje ob Savi
|
Objavljeno: Sre Sep 21, 2011 11:08 pm Naslov sporočila: |
|
|
Najbolje, da ustvariš dve datoteki, npr. nmeaxor.h in nmeaxor.c. Prva je t.i. header datoteka, ki vsebuje samo deklaracije funkcij (in spremenljivk, ...), druga pa vsebuje dejansko definicijo oz. telo funkcije.
Nato prestavi to:
Koda: |
int NMEAXOR(char *NMEAtelegram); |
v header datoteko (nmeaxor.h), definicijo funkcije pa v pripadajočo .c datoteko.
V To .c datoteko na vrhu dodaj še tole vrstico:
Koda: |
#include "nmeaxor.h" |
S to vrstico vključiš header datoteko v .c datoteko. Isto vrstico dodaš še v .c datoteko, kjer imaš main() funkcijo.
Prevajanje je potem čisto preprosto:
Koda: |
gcc main.c nmeaxor.c -o program.exe |
LP! |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3358 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Sre Sep 21, 2011 11:50 pm Naslov sporočila: |
|
|
Hmmm, Hvala za hiter odgovor.
če prav razumem, naredim dve dateki z imenom funkcije, ena .h datoteka, ki vsebuje samo deklaracijo in ena .c datoteka ki vsebuje samo telo funkcije, a ki ima na začetku include za .h datoteko.
Nadalje moram v main.c datoteki vključiti include ukaz za .h datoteko, a to ni dovolj, moram še v gcc ukazu podati informacijo, da je treba vključiti tudi funkcija.c datoteko, se pravi, da mora uporabnik na dveh mestih se sklicevati na ime funkcije, v main programu z include in v gcc ukazu z imenom datoteke.
Samo na enem mestu ne bi šlo..
Bom probal in javil, kako mi je uspelo.
Hvala |
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.66 Kraj: Zagorje ob Savi
|
Objavljeno: Čet Sep 22, 2011 7:42 am Naslov sporočila: |
|
|
Lahko tudi daš funkcijo v eno c datoteko in kar to datoteko vključiš v main.c datoteki (#include "nmeaxor.c") nekje nad main funkcijo. Prevajaš isto kot prej.
Samo to res ni primeren način, v c-ju se to ne dela ...
LP! |
|
Nazaj na vrh |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 18.42
|
Objavljeno: Čet Sep 22, 2011 7:56 am Naslov sporočila: |
|
|
Delaš v kakem IDE ali "peš" prevajaš? _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3358 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Čet Sep 22, 2011 8:53 am Naslov sporočila: |
|
|
Dobro jutro.
Sinoči sem končal, danes bom naprej kopal ...
Prevajam na enem Linuxu, do katerega pridem z Putty.exe
Ne vem, ali se temu reče 'peš'.
 |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3358 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Čet Sep 22, 2011 10:08 am Naslov sporočila: |
|
|
Sem naredil brez .h datoteke, mislim, da je bolj pregledno, če se deklaracija funkcije 'vidi' v glavnem programu. Sem pa telo funnckije dal v c. datoteko in jo kompiler v gcc ukazu lepo obravnava in vključi v program.
Dela.
Hvala.
Se priporočam v naprej. Še bom imel vprašanja. |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 492 dni
Powered by phpBB © 2001, 2005 phpBB Group
|