Gå til innhold

C programmering, hvordan sammenligne 2 array?


Anbefalte innlegg

Hvordan kan jeg sammenligne 2 arrays(pincode[] og code[])?

 

her er det jeg hra til na: (Men jeg har ingen anelse om hva jeg gjor:( )

#define pincode[] = {1,2,3,4};
#define KNAPP[] = {PINB.0, PINB.1, PINB.2, PINB.3, PINB.4, PINB.5, PINB.6, PINB.7, PIND.0}; 
#define TRANSISTOR = PORTD.5; //eg gar ut ifra at dette e pinnen transistoren e pa   
unsigned int code[] = {0,0,0,0}; // her komme pin koden tu trykke inn te og ver lagra...

//if ((code[0]==pincode[0]) &&  (code[1]==pincode[1]) && (code[2]==pincode[2]) && (code[3]==pincode[3])) { // koden du har trykkt e rett...
unsigned int CORRECT(void) {
  return 0;
  if (code[]==pincode[]) return 1;
}; // og hvorfor far jeg feilmelding pa denne("Declaration Syntax Error")

 

her e en ny kode eg hra komt fram til, men eg far "Invalid Expression pa den forste den tester, og "Declaration Error Syntax" pa ALLE linjene som folger, inkl. '}'

unsigned int CORRECT(void) {   
  int bTest = 1;
  //return 0;
  //if (code==pincode) return 1;   
  if (code[0]!=pincode[0]) bTest = 0; // <-- Denne...
  if (code[1]!=pincode[1]) bTest = 0;
  if (code[2]!=pincode[2]) bTest = 0;
  if (code[3]!=pincode[3]) bTest = 0;
  
  if (bTest == 1) return 1;
  if (bTest == 0) return 0;   
}; // <-- denne er feil???

 

forresten, eg far 3 feilmeldinger pa den merka linja.. :

"Invalid Expression" ???

"Unrefferenced local variable bTest" ???

( og selvfolgelif: )

"Function must have a return value"

 

Noen som kan hjelpe meg med disse feilene?

Endret av Richard87
Lenke til kommentar
Videoannonse
Annonse

if ((code[0] == pincode[0]) && (code[1]==pincode[1]) && (code[2]==pincode[2]) && (code[3]==pincode[3]))

Dette er riktig og gjør det du forventer (sammenlikner hvert element med tilsvarende element i det andre arrayet). En litt mer elegant løsning er:

int i, equal = 1;
for (i = 0; i < 4; ++i) {
    if (code[i] != pincode[i]) {
        equal = 0;
        break;
    }
}

 

 

unsigned int CORRECT(void) {
  return 0;
  if (code[] == pincode[]) return 1;
}; // og hvorfor far jeg feilmelding pa denne("Declaration Syntax Error")

 

For det første kan du ikke definere en funksjon inne i en annen funksjon. For det andre skal ikke funksjonsdefinisjoner avsluttes med semikolon. For det tredje har du to semantiske problemer -- ettersom du har return 0 helt i begynnelsen av funksjonen vil funksjonen bare returnere null med én gang, uten å sjekke noe annet. I if (code[] == pincode[]) sjekker du om adressene er like, noe de ikke vil være. Det er dessuten syntaksfeil -- riktig skrivemåte er if (code == pincode), men det gjør altså fortsatt ikke som du vil.

Lenke til kommentar

hehe, eg e en utolmodig skjel, sa eg ga opp med arrays, og provde pa denne(litt mer tungvinte maten):

int bTest = 1;
unsigned int CORRECT(void) {   
  //return 0;
  //if (code==pincode) return 1;   
  if (code1!=pincode1) bTest = 0;
  if (code2!=pincode2) bTest = 0;
  if (code3!=pincode3) bTest = 0; 
  if (code4!=pincode4) bTest = 0;
  
  if (bTest==1) return 1;
  if (bTest==0) return 0;   
}

men eg far 2 errorer pa ver av de 4 forste if setningene:

"Missing ')' "

"Invalid Expression"

 

kan du hjelpe meg med disse?

Lenke til kommentar

kossen funke memcmp "Low-Level", grunnen er at jeg ikke kommer til og kjore koden pa en "PC-Plattform", den er ment for en uKontroller, Atmel 2313(eller noe lignende)..

 

[EDIT] Sry for "bumping" vis det er det det hetter, ingen av forslagene over virker, Compileren CodeVision AVR gir en Syntax feil pa For Next settningen, og MemCmp finnes ikke i C :(

Endret av Richard87
Lenke til kommentar

"Finnes ikke i C"? memcmp(3) er prototypet i string.h. Den er en del av C99.

 

[EDIT] Her er et kjapt eksempel på bruken:

 

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
 char pin1[4] = { '1', '2', '5', '7' };
 char pin2[4] = { '1', '2', '5', '7' };
 char pin3[4] = { '1', '5', '7', '4' };
 char pin4[4] = { '1', '3', '3', '7' };

 if(!memcmp(pin1, pin2, 4))
   {
     printf("pin1 == pin2\n");
   }
 else
   {
     printf("pin1 != pin2\n");
   }

 if(!memcmp(pin3, pin4, 4))
   {
     printf("pin3 == pin4\n");
   }
 else
   {
     printf("pin3 != pin4\n");
   }

 return EXIT_SUCCESS;
}

Endret av kattemat
Lenke til kommentar

Eg har ikkje peiling, eg far rare feil meldinger heila tia...

 

Fordi:

if setningen returnerer 2 feilmeldinger: "Invalid Expressiong"

break; gir "Out of context"

ende } pa if settningen feiler med "Function must have a return value"

ende } pa for lokken returnerer "Declaration Syntax error"

ende } pa functionen returnerer "Declaration Syntax error"

 

dessuten vil eg merka at dette e den forste function i main.c: her e functionen:

unsigned int CORRECT(void) {  
/*
int bTest = 1;  
int X;
  if (code1!=pincode1) bTest = 0;
  if (code2!=pincode2) bTest = 0;
  if (code3!=pincode3) bTest = 0; 
  if (code4!=pincode4) bTest = 0; 
*/                
  //signed char memcmp(void *buf1,void *buf2, unsigned char n)    
int i, equal = 1;
for (i = 0; i < 4; ++i) {
   if (codetest[i] != pincodetest[i]) { //"Invalid Expression"
       equal = 0;
       break; // "Out of context"
   } // "Function must have a return value"
}//"Declaration Syntax error"
if (equal==1) return 1;
}//"Declaration Syntax error"

 

og her e heila programmet(for sikkerhets skyld):

#include <90s2313.h>;              
#include <delay.h>; 
#include <string.h>;                

// keypad code is 1337
#define pincode1 = 1;
#define pincode2 = 3;
#define pincode3 = 3;
#define pincode4 = 7;   
#define pincodetest[4] = {1,2,3,4};

int code1 = 0;                      
int code2 = 0;
int code3 = 0;
int code4 = 0; 
int codetest[4] = {1,3,3,7}; 


unsigned int CORRECT(void) {  
/*
int bTest = 1;  
int X;
  if (code1!=pincode1) bTest = 0;
  if (code2!=pincode2) bTest = 0;
  if (code3!=pincode3) bTest = 0; 
  if (code4!=pincode4) bTest = 0; 
*/                
  //signed char memcmp(void *buf1,void *buf2, unsigned char n)    
int i, equal = 1;
for (i = 0; i < 4; ++i) {
   if (codetest[i] != pincodetest[i]) {
       equal = 0;
       break;
   }
}
if (equal==1) return 1;
}

void TurnOn(void) {
  PORTD.5 = 1;// 1 gjor at transistoren opner seg..  eventuelt legg in lys her..
  delay_ms(500); //hold knappen inne i ett halvt sekund..
  PORTD.5 = 0; //skru av knappen igjenn, skru av lyset igjenn  
}      

int FinnKnapp(void){
int X; 
  if (PINB.0) X = 1;  
  if (PINB.1) X = 2;
  if (PINB.2) X = 3;
  if (PINB.3) X = 4;
  if (PINB.4) X = 5;
  if (PINB.5) X = 6;
  if (PINB.6) X = 7;
  if (PINB.7) X = 8;
  if (PIND.1) X = 9;
return X;
}

void main(void)
{
PORTB=0x00;
DDRB=0x00;

PORTD=0x00;
DDRD=0x7E;
ACSR=0x80;

  while (1) {
     // fyst, finn ut ka knapp som er blitt trykket..
     int X;
     X = FinnKnapp();  
     
     // skift koden ett hakk til venstre
     code1 = code2;
     code2 = code3;  
     code3 = code4;
     code4 = X + 1;  // knappen du trykket pa...
            
     if (CORRECT==1) TurnOn();
  }
}

 

[EDIT] btw, eg fant ut at eg mate includera string.h, men da fekk eg feilmeldinger pa if setningen... :nei:

Endret av Richard87
Lenke til kommentar

Du har nok missforstått litt syntaks her. Her er mitt forslag til noen(svært lite gjennomarbeidede) forbedringer ;)

 

#include <90s2313.h>;              
#include <delay.h>;
#include <string.h>;                

// keypad code is 1337
static int pincodetest[4] = {1,2,3,4};

int 
CORRECT(int *entered_pincode) {

 if(!memcmp(entered_pincode, pincodetest, sizeof(pincodetest))
   return 0;

 return 1;
}

void 
TurnOn(void) {
 PORTD.5 = 1;// 1 gjor at transistoren opner seg..  eventuelt legg in lys her..
 delay_ms(500); //hold knappen inne i ett halvt sekund..
 PORTD.5 = 0; //skru av knappen igjenn, skru av lyset igjenn  
}      

int 
FinnKnapp(void){
 if (PINB.0) return 1;  
 if (PINB.1) return 2;
 if (PINB.2) return 3;
 if (PINB.3) return 4;
 if (PINB.4) return 5;
 if (PINB.5) return 6;
 if (PINB.6) return 7;
 if (PINB.7) return 8;
 if (PIND.1) return 9;

 return 0;
}

int
main(int argc, char *argv[])
{
 PORTB=0x00;
 DDRB=0x00;

 PORTD=0x00;
 DDRD=0x7E;
 ACSR=0x80;

 for(;;) {
   int code[4];
   int i;

   // fyst, finn ut ka knapp som er blitt trykket..
   for(i = 0; i < 4; i++)
     code[i] = FinnKnapp();  
   
   if (corect(entered_code)) 
     TurnOn();
 }
}

 

[EDIT] noen obligatoriske trykkfeil og la til bruk av memcmp

Endret av kattemat
Lenke til kommentar

Ja, et enkelt programm som fungerer som en code las(uten '0'), som skal sende en puls hver gang brukeren taster in rett passord.

 

[EDIT] har sett over koden na, men "CORRECT" coden din returnerer like mange feilmeldinger som min... :(

 

if(!memcmp(entered_pincode, pincodetest, sizeof(pincodetest)) return 0;

"Invalid Expression" ???

"Function must have a return value"

return 1;

"Missing '(' "

}

"Declaration syntaxt error"

 

nagen idee?

 

#include <90s2313.h>;              
#include <delay.h>; 
#include <string.h>;                

#define pincodetest[4] = {1,2,3,4};
int codetest[4] = {1,3,3,7}; 

int
CORRECT(int *entered_pincode) {
if(!memcmp(entered_pincode, pincodetest, sizeof(pincodetest)) return 0;
return 1;
}

void 
TurnOn(void) {
  PORTD.5 = 1;// 1 gjor at transistoren opner seg..  eventuelt legg in lys her..
  delay_ms(500); //hold knappen inne i ett halvt sekund..
  PORTD.5 = 0; //skru av knappen igjenn, skru av lyset igjenn  
}      

int
FinnKnapp(void){
if (PINB.0) return 1;  
if (PINB.1) return 2;
if (PINB.2) return 3;
if (PINB.3) return 4;
if (PINB.4) return 5;
if (PINB.5) return 6;
if (PINB.6) return 7;
if (PINB.7) return 8;
if (PIND.1) return 9;

return 0;
}

void main(void)
{
PORTB=0x00;
DDRB=0x00;

PORTD=0x00;
DDRD=0x7E;
ACSR=0x80;

  while (1) {
     // fyst, finn ut ka knapp som er blitt trykket..
     int X, I;
     X = FinnKnapp();  
     if (!X){
        // skift koden ett hakk til venstre
        for (I=0;I==3; I++) codetest[I] = codetest[I+1];

        codetest[3] =X;
            
        if (CORRECT==1) TurnOn();  
     }
  }
}

Endret av Richard87
Lenke til kommentar

Jeg har ikke sjekket noe av logikken din, men har i hvertfall luket ut litt av syntaksfeilene dine:

 

#include <string.h>

const int PINCODETEST[] = {1, 2, 3, 4};


/* Returns non-zero if pincode is correct */
int compare_pincode(int* pincode, size_t count)
{
   if(count != sizeof(PINCODETEST))
   {
       return 0;
   }
   
   return !memcmp(pincode, PINCODETEST, count);
}


int main()
{
   int code[] = {1, 3, 3, 7};
   
   if(compare_pincode(code, sizeof(code)))
   {
       /* TurnOn()*/
   }
}

 

... og koden jeg har utelatt kan du sikkert legge til selv igjen :)

 

Edit: rettet opp en liten logisk feil i compare_pincode ...

Endret av kjetil7
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...