www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

GNU C pomoč začetniku

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Linux, unix razprave
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3358
Aktiv.: 14.18
Kraj: Dragomer

PrispevekObjavljeno: Sre Sep 21, 2011 10:51 pm    Naslov sporočila:  GNU C pomoč začetniku Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.66
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Sre Sep 21, 2011 11:08 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3358
Aktiv.: 14.18
Kraj: Dragomer

PrispevekObjavljeno: Sre Sep 21, 2011 11:50 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.66
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Čet Sep 22, 2011 7:42 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 18.42

PrispevekObjavljeno: Čet Sep 22, 2011 7:56 am    Naslov sporočila:   Odgovori s citatom

Delaš v kakem IDE ali "peš" prevajaš?
_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3358
Aktiv.: 14.18
Kraj: Dragomer

PrispevekObjavljeno: Čet Sep 22, 2011 8:53 am    Naslov sporočila: icon_impressed  Odgovori s citatom

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š'.
Confused
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3358
Aktiv.: 14.18
Kraj: Dragomer

PrispevekObjavljeno: Čet Sep 22, 2011 10:08 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Linux, unix razprave Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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