Richard87 Skrevet 17. august 2005 Del Skrevet 17. august 2005 (endret) 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 17. august 2005 av Richard87 Lenke til kommentar
☀ ❄ Skrevet 17. august 2005 Del Skrevet 17. august 2005 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
Richard87 Skrevet 17. august 2005 Forfatter Del Skrevet 17. august 2005 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
kattemat Skrevet 17. august 2005 Del Skrevet 17. august 2005 if(!memcmp(ary1, ary2, size) holder lenge. memcmp sammenligner size bytes data fra "arrayenes start"(dvs fra to minnelokasjoner). Om dataen er lik returneres 0. Altsp if(!memcmp(code1, pincode1, 4)) { //vi har en match } Lenke til kommentar
Richard87 Skrevet 17. august 2005 Forfatter Del Skrevet 17. august 2005 ingen som vett hvorfor dene linjen mangler en parantes? ' ) ' : if (code1!=pincode1) bTest = 0; er det noen forskjell pa C++ og C her? Lenke til kommentar
Richard87 Skrevet 17. august 2005 Forfatter Del Skrevet 17. august 2005 (endret) 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 17. august 2005 av Richard87 Lenke til kommentar
kattemat Skrevet 17. august 2005 Del Skrevet 17. august 2005 (endret) "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 17. august 2005 av kattemat Lenke til kommentar
☀ ❄ Skrevet 17. august 2005 Del Skrevet 17. august 2005 Jeg tror det er best om vi får se koden din i sin helhet. Du har sannsynligvis gjort noe galt et sted. Lenke til kommentar
Mr.Garibaldi Skrevet 17. august 2005 Del Skrevet 17. august 2005 Noen grunn til at du ikke bruker for-løkke forslaget over? Det skulle vel strengt tatt fungere på det meste.... Lenke til kommentar
Richard87 Skrevet 17. august 2005 Forfatter Del Skrevet 17. august 2005 (endret) 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... Endret 17. august 2005 av Richard87 Lenke til kommentar
kattemat Skrevet 17. august 2005 Del Skrevet 17. august 2005 (endret) 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 17. august 2005 av kattemat Lenke til kommentar
Kjeksen Skrevet 18. august 2005 Del Skrevet 18. august 2005 Hm, er det mikrokontroller du programmerer? Mener og huske at det var en mC som heter 90S2313. Lenke til kommentar
Richard87 Skrevet 19. august 2005 Forfatter Del Skrevet 19. august 2005 (endret) 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 19. august 2005 av Richard87 Lenke til kommentar
kjetil7 Skrevet 20. august 2005 Del Skrevet 20. august 2005 (endret) 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 20. august 2005 av kjetil7 Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå