brugen af while i gcc ????

Alle tekniske spørgsmål som ikke hører ind under de andre fora.
oz6oh
Indlæg: 16
Tilmeldt: 15. jan 2011, 21:42

brugen af while i gcc ????

Indlæg af oz6oh »

Jeg er kommet så langt at jeg nu har fået et lille portprogram til at virke i min Ubuntu. Jeg bruger en GOTO , men får at vide det ikke er god programmering. (Det ved jeg godt) Hvilke forudsætninger skal jeg give while så det virker på samme måde som GOTO ?

Kode: Vælg alt

#include <stdio.h>//In use

#include <stdlib.h>// In use
#include <sys/io.h>//In use
#define base 0x378  /*Here is Port defined*/

main(int argc, char **argv)
{
 float x;
 int value;
 int int_round(double n) // Round  n   
{
        return (n > 0.0) ? (n + 0.5) : (n -0.5);
}
        if (ioperm(base, 3, 1)) {perror("ioperm"); exit(1);// Use sudo !
}
start:
      printf("\nInput frequenz as  144.000 in Step 25KHz ");
      scanf("%f",&x);
      value = int_round((x - 140.8) * 40.0); /* Calculation */   
      if ((x<144.000) || (x>146.000 ))
      printf("\nfreq Outside 2 Meter band\n ");
      printf("\nPortout= %d", value);  /* Show Output on Led's */
      outb(value, base);
goto start;
}

der skal stå 140.8 ved den smiley der hos nogle hedder Sej Aner ikke hvor den kommer fra

Ikke ideelt da goto anvendes, hvilket ikke er god programmering. Men det virker da. Forsøger at finde ud af, hvordan man bruger WHILE
Her ses programmet i funktion.
ole@ubuntu:~$ cd Skrivebord
ole@ubuntu:~/Skrivebord$ sudo ./yyyy
[sudo] password for ole:

Input frequenz as 144.000 in Step 25KHz 143.975

freq Outside 2 Meter band

Portout= 127
Input frequenz as 144.000 in Step 25KHz 144.000

Portout= 128
Input frequenz as 144.000 in Step 25KHz 145.025

Portout= 169
Input frequenz as 144.000 in Step 25KHz 146

Portout= 208
Input frequenz as 144.000 in Step 25KHz 146.075

freq Outside 2 Meter band

Portout= 211
Input frequenz as 144.000 in Step 25KHz

Venlig hilsen en ivrig 75 årig nybegynder OZ6OH alias OZ7T Ole
AJenbo
Admin
Indlæg: 20878
Tilmeldt: 15. nov 2009, 15:04
IRC nickname: AJenbo
Geografisk sted: Vanløse, København

Re: brugen af while i gcc ????

Indlæg af AJenbo »

Kode: Vælg alt

#include <stdio.h>//In use

#include <stdlib.h>// In use
#include <sys/io.h>//In use
#define base 0x378  /*Here is Port defined*/

main(int argc, char **argv)
{
   float x;
   int value;
   int int_round(double n) // Round  n   
   {
      return (n > 0.0) ? (n + 0.5) : (n -0.5);
   }
   if (ioperm(base, 3, 1))
   {
      perror("ioperm"); exit(1);// Use sudo !
   }

   while(true)
   {
      printf("\nInput frequenz as  144.000 in Step 25KHz ");
      scanf("%f",&x);
      value = int_round((x - 140.8) * 40.0); /* Calculation */   
      if ((x<144.000) || (x>146.000 ))
         printf("\nfreq Outside 2 Meter band\n ");
      printf("\nPortout= %d", value);  /* Show Output on Led's */
      outb(value, base);
   }
}


True er altid lig true så der for forsætter den evigt. Skal du på et tidspunkt ud af løkken bruger du break;

Det er en rigtig god ide at pakke koden ind i code tags så kan vi bedere se indentering m.m.
AJenbo
Admin
Indlæg: 20878
Tilmeldt: 15. nov 2009, 15:04
IRC nickname: AJenbo
Geografisk sted: Vanløse, København

Re: brugen af while i gcc ????

Indlæg af AJenbo »

Ser ud til at det skal være while(1) når vi taller C
oz6oh
Indlæg: 16
Tilmeldt: 15. jan 2011, 21:42

Re: brugen af while i gcc ????

Indlæg af oz6oh »

// Efter at goto start og start: er fjernet kører den med while

Kode: Vælg alt

#include <stdio.h>//In use
#include <stdlib.h>// In use
#include <sys/io.h>//In use
#define base 0x378  /*Here is Port defined*/

main(int argc, char **argv)
{
       float x;
       int value;
       int int_round(double n) // Round  n
       
       {
          return (n > 0.0) ? (n + 0.5) : (n -0.5);
       }
       if (ioperm(base, 3, 1))
       {
          perror("ioperm"); exit(1);// Use sudo !
       }

     while(1)   // Nu kører den med while
       {
          printf("\nInput frequenz as  144.000 in Step 25KHz ");
          scanf("%f",&x);
          value = int_round((x - 140.8) * 40.0); /* Calculation */
          if ((x<144.000) || (x>146.000 ))
          printf("\nfreq Outside 2 Meter band\n ");
          printf("\nPortout= %d", value);  /* Show Output on Led's */
          outb(value, base);
       }
}

Dette kører så jeg takker for hjælp Ole OZ6OH
lath
Indlæg: 5095
Tilmeldt: 27. apr 2008, 02:16
IRC nickname: lars_t_h
Geografisk sted: Fyn

Re: brugen af while i gcc ????

Indlæg af lath »

I gammeldags C er 0 (nul) falsk, og alt andet er sandt.
I en nyere udgave af C (fra C99 standarden) er boolean blevet indført som type, og så skal man bruge while(true).
Jeg er ikke klar over om C99 bare bruger en typedef, og 2 defines for boolean, eller om boolean er implementeret som en rigtigt type, så C compileren kan kende forskel på boolean og så andre typer.

I C er der tradition for at en uendelig løkke laves med en while(1) sætning:

Kode: Vælg alt

#define TRUE 1

while(TRUE)
{
    /* kode som skal køre i løkke placeres her */
}


Man kan godt hoppe ud med en break, men ikke hvis man har en f.eks. for-løkke inde i while løkken, for så vil break kun hoppe ud af for løkken.

Det her virker ikke:

Kode: Vælg alt

#define TRUE 1
int i;

while(TRUE)
{
    /* kode som skal køre i while løkken placeres her */
    for(i = 0; i<en_begrænsning; i++)
    {
        /* kode som skal køre i for løkken placeres her */
        if (test) break;
       /* mere kode som skal køre i for løkken placeres her */
    }
}


Der er det god stil at bruge goto, for ikke at få noget klyt kode med ekstra en ekstra boolsk variabel (ofte en unsigned char i C), samt en if-sætning for hver indlejret løkke:
Det her virker:

Kode: Vælg alt

#define TRUE 1
int i;

while(TRUE)
{
    /* kode som skal køre i while løkken placeres her */
    for(i = 0; i<en_begrænsning; i++)
    {
        /* kode som skal køre i for løkken placeres her */
        if (test) goto exit_loops;
       /* mere kode som skal køre i for løkken placeres her */
    }
}
exit_loops:


I tilfældet med break kan man altså godt bruge goto, forid det giver noget bedre kode, der som bonus også er nemmere at læse.
goto kan også med fordel bruges i fejlhåndtering.
Det laves sådan at goto hopper til nederst i programmet hvor der ryddes op, og derefter afsluttes programmet, med et et kald til exit:

Kode: Vælg alt

exit(exit_val);

hvor exit_val til start sættes til EXIT_SUCCESS, og ved fejl sættes den til EXIT_FAILIURE før der gotos til oprydningen og afslutningen.

For nogle er goto dog en rød klud.
Jeg undgår at bruge goto, men kan jeg se at det vil give klytkode, så tager jeg goto(s) og en label i brug.

@AJenbo
Vidste du at man kalder C for:
vores alle sammens universielle maskinsprog
?

/Lars
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
AJenbo
Admin
Indlæg: 20878
Tilmeldt: 15. nov 2009, 15:04
IRC nickname: AJenbo
Geografisk sted: Vanløse, København

Re: brugen af while i gcc ????

Indlæg af AJenbo »

Jeg koder sjælent C, mest PHP (ja ja, det er script eller VM). Der kan man lave break 2; for at hoppe ud af 2 løkker, er det ikke muligt i C?

Vidste godt at det var det C er :)

oz6oh marker din kode som Code ellers bliver den ulæselig!
oz6oh skrev:value = int_round((x - 140.8) * 40.0); /* Calculation */
lath
Indlæg: 5095
Tilmeldt: 27. apr 2008, 02:16
IRC nickname: lars_t_h
Geografisk sted: Fyn

Re: brugen af while i gcc ????

Indlæg af lath »

AJenbo skrev:Jeg koder sjælent C, mest PHP (ja ja, det er script eller VM). Der kan man lave break 2; for at hoppe ud af 2 løkker, er det ikke muligt i C?

Nej det kan man ikke.

C forstår heller ikke:

Kode: Vælg alt

int main()
{
     /* noget kode her */
    b();
    /* ... og mere kode her */
}

static void b(void)
{
      /* funktion b's går ind her */
}

Løsningen er at man før main skriver en prototype erklæring

Kode: Vælg alt

void b(void);

eller simpelthen placerer b funktionen før den tages i brug, dvs placerer b før main.

/Lars
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
AJenbo
Admin
Indlæg: 20878
Tilmeldt: 15. nov 2009, 15:04
IRC nickname: AJenbo
Geografisk sted: Vanløse, København

Re: brugen af while i gcc ????

Indlæg af AJenbo »

He, skulle man tro compilere kunne finde ud af at flytte rundt på.

I PHP kan man enda lave

Kode: Vælg alt

if(b_needed) {
  function b() {
    /* do stuff */
  }
}
lath
Indlæg: 5095
Tilmeldt: 27. apr 2008, 02:16
IRC nickname: lars_t_h
Geografisk sted: Fyn

Re: brugen af while i gcc ????

Indlæg af lath »

AJenbo skrev:He, skulle man tro compilere kunne finde ud af at flytte rundt på.

I PHP kan man enda lave

Kode: Vælg alt

if(b_needed) {
  function b() {
    /* do stuff */
  }
}


Sådan virker en C compiler ikke.

Den skal se symbolet b først før den skriver det ned i det man kalder en symbol tabel.
Erklæringen om b gør at C compileren skriver b ned i symbol tabellen.

I eksemplet jeg gav før så kan C compileren ikke finde noget b, og for GCCs vedkommende skriver den så noget i stil med:
Warning: implicitly defined function b
såfremt man bruger -Wall argumentet til GCC.
Clang compileren fra LLVM projektet giver meget bedre fejlmeddelelser, fordi den herfra ser ud til at være bedre designet end GCC.

Gammeldags C understøtter heller ikke funktioner inde i funktioner, som i dit eksempel.

Fordelen for C er nok at C kører minimum 4000% (40x) gange hurtigere end PHP, fordi maskinkode immervæk altid vil være det der kaldes "an order of magnitude" hurtigere end hvilken som helst fortolker.
Derudover bruges C og PHP til helst forskellige ting.
PHP til web programmering, og C til kerne programmering, system programmering, og indlejret system programmering.

Hvert sit værktøj (programmeringssprog) til hvert sit formål, og Oles program er netop til et program med user space device driver egenskaber.

Læg iøvrigt mærke til Oles program: Det bruges ikke over 1 page (4 KB i RAM) til det hele. (1 page er den mindste enhed RAM man kan allokere, så vil programmet have adgang til 4097 bytes RAM(=4KB +1 byte RAM) allokeres der 2 pages(=8 KB RAM) til programmet.

PHP fortolkeren selv er iøvrigt skrevet i C.

/Lars
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
AJenbo
Admin
Indlæg: 20878
Tilmeldt: 15. nov 2009, 15:04
IRC nickname: AJenbo
Geografisk sted: Vanløse, København

Re: brugen af while i gcc ????

Indlæg af AJenbo »

Yep yep, det ved jeg altsammen, var heller ikke ude på at forslå at skrive driveren i php ;)