ummairt Skrevet 18. oktober 2007 Del Skrevet 18. oktober 2007 Hei, Jeg driver å løser hjemmeeksamen i INF1060, og har klart å lage en forløkke som kommer til sin maksgrense i andre løp.. Jeg har ingen anelse om hvorfor dette skjer første gang så looper den riktig gjennom for løkka og setter message_ID = 0.. Men andre gangen så blir message_ID = 200 på et eller annet merkelig vis.. //sjekker om det er ledig plass for melding for ( avalibility = 0; avalibility<200; avalibility++){ // vacant er en en int variabel som sier om plassen er ledig 0 = true , 1 = false if(info->meta[avalibility].vacant==0){ printf("Avalibility:%d\n", avalibility); fprintf(stderr, "før breaken"); break; } fprintf(stderr, "nå har vi breaket\n"); } info->meta[avalibility].message_ID=avalibility; printf("message ID?%d\n", info->meta[avalibility].message_ID); info->meta[avalibility].creation_time = timeVal(); info->meta[avalibility].size = k; info->meta[avalibility].vacant=1; Lenke til kommentar
Mr.Garibaldi Skrevet 18. oktober 2007 Del Skrevet 18. oktober 2007 Hadde det ikke da vært en ide å legge til litt mer debug informasjon som forteller deg hva løkken løper igjennom? For det eneste jeg kan se i denne koden din er at vacant == 1 må være sant for de fleste meldingene siden du ikke får noen annen beskjed... Det er også vanlig å bruke 1 som true, og 0 som false, så det kan lønne seg å endre verdiene dine... Lenke til kommentar
kyrsjo Skrevet 18. oktober 2007 Del Skrevet 18. oktober 2007 Uten at jeg aner noe om sammenhengen, sikker på at du mener "break" og ikke "continue"? En break vil da gå helt ut av løkka, vil du ikke egentlig bare teste neste posisjon av arrayet ditt? Pluss, har du husket å initialisere vacant? Btw. bbcoden din gjør ting vanskelig å lese Lenke til kommentar
ummairt Skrevet 18. oktober 2007 Forfatter Del Skrevet 18. oktober 2007 (endret) Ja de ble den.. Endret 22. oktober 2007 av ummairt Lenke til kommentar
Mr.Garibaldi Skrevet 18. oktober 2007 Del Skrevet 18. oktober 2007 (endret) En enkel guide som ofte er nyttig i 1060 er denne som viser deg en bedre måte å håndetere pakker på. Så vidt jeg kunne (kjapt) se så fyller du vacant 2 ganger, først med 0 så med char '0'. Og '0' != 0... Ellers vil jeg anbefale litt klarere formatering av koden, og siden jeg likevel gjorde det for å forstå koden bedre, her er en reformatert versjon... Klikk for å se/fjerne innholdet nedenfor // Testing.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <stdio.h> #include <string.h> #include <stdlib.h> //#include "ifisms.h" void getOut(); void send(); void recieve(); void show(); void del(); void backup(); void restore(); void list(); void help(); #define msg_count 200 struct metadata{ unsigned int message_ID; char *creation_time; char modification_time; char phone_number; unsigned int size; char sent; // flags. int vacant; // }; struct info{ // denne strukten skal ha alle viktige informasjonsvariable. struct metadata *meta; char *bitmap; char *datablokker; }; struct info info; void new(struct info *info, char *message); int main(void){ printf("\n\nWelcome to IFISMS......\n"); printf("The Date of today is %s\n\n", getDate()); int datablokk_size = 64*3*200; int bitmapsize =600; // Velger foreløbig å bruke byteMap istedenfor bitmap..... int metasize= sizeof(struct metadata)*200; // Her allokeres det (tilstrekkelig ) nok plass for at hele 200 meldinger får plass. char *alt_minne = malloc(metasize + bitmapsize + datablokk_size); info.meta = (struct metadata*)alt_minne; info.bitmap = alt_minne + metasize; info.datablokker =info.bitmap+bitmapsize; int i; // Legger inn initialverdien til meldingene til å være 0(true ) for ( i = 0; i<msg_count; i++){ info.meta[i].vacant = 0; } // Gjør det samme for bitmapen, setter alt til 0(true) for (i= 0; i<bitmapsize; i++){ info.bitmap[i]= 0; } // Array for innhold av tegn. char buf[200]; char *command; while(1){ printf("%s %s:\t",userName(), timeVal()); command=fgets(buf, 200, stdin); // Brukt denne funksjonen for å splitte opp meldingen i flere deler. command = strtok(buf," \n"); if(strcmp(command,"new")==0){ char *melding = strtok(NULL, "\n"); new(&info, melding); } else if(strcmp(command,"recieve")==0){recieve();} else if(strcmp(command,"send")==0){send();} int i; for ( i = 0; i<msg_count; i++){ // info.meta[i].vacant = '0'; //hvorfor char '0' og ikke tallet 0? } for (i= 0; i<bitmapsize; i++){ info.bitmap[i]= '0'; } char buf[200]; char *command; while(1){ printf("%s %s:\t",userName(), timeVal()); command=fgets(buf, 200, stdin); command = strtok(buf," \n"); if(strcmp(command,"new")==0) { char *melding = strtok(NULL, "\n"); if(strlen(melding)>160) { printf("\nThe message cannot be larger than 160 characters\n\n"); break; } else { new(&info, melding); } } else if(strcmp(command,"recieve")==0){recieve(); }else if(strcmp(command,"send")==0){ char *phoneNr = strtok(NULL, " \n"); char *msgID = strtok(NULL, " \n"); send(&info, *phoneNr, *msgID); }else if(strcmp(command,"show")==0){del(); } else if(strcmp(command,"del")==0){show();} else if(strcmp(command,"backup")==0){backup();} else if(strcmp(command,"restore")==0){restore();} else if(strcmp(command,"help")==0){list(); } else if(strcmp(command,"list")==0){help();} else if(strcmp(command,"exit")==0){getOut();} else {printf("%s is a wrong command\n", command);} } } free(alt_minne); return 0; } void new(struct info *info, char *message){ printf("%s\n", message); int k = strlen(message); int avalibility; //sjekker om det er ledig plass for melding for ( avalibility = 1; avalibility<201;++avalibility){ if(info->meta[avalibility].vacant==0){ printf("Avalibility:%d\n", avalibility); break; continue; } } //Hvis det er fullt, så skal det genereres en feilmelding. if(info->meta[avalibility].vacant ==1){ printf(" The system does not have any space left for more messages\n"); return; } info->meta[avalibility].message_ID=avalibility; printf("message ID=%d\n\n", info->meta[avalibility].message_ID); info->meta[avalibility].creation_time = timeVal(); info->meta[avalibility].size = k; int i =0; int t =0; int msgSize = info->meta[avalibility].size; int toCopy = msgSize; char *temp; // maksgrense for blokkene. for (; i < 3; i++) { // helt til meldingsstørrelsen ikke blir 0 .. if (msgSize<0) break; for (; t < 600; t++) { // Finner ut om blokken her ledig if (info->bitmap[t] == 0) { //fprintf(stderr, "1nå er jeg her\n"); info->datablokker = info->bitmap +64*t; temp = info->datablokker; // temp = info->bitmap + 64*t; break; } } if(msgSize>63) { msgSize -= 63; toCopy = 63; }else{ toCopy= msgSize; } strncpy(temp, message,toCopy); // setter inn null-byte. temp[toCopy+1]=0; message +=64; printf("block: %i %s\n",i,temp); } } void send(struct info *info, int msg_id,char *phNr){ int phNo = atoi(phNr); if(info->meta[msg_id].vacant ==1){ fprintf(stderr, "klarer å komme inn hit"); info->meta[msg_id].vacant =2; info->meta[msg_id].modification_time = timeVal(); printf("dette fungerte ganske greit"); } else{ ("dette fungerte ikke");} } void recieve(){} void show(){} void del(){} void backup(){} void restore(){} void list(){} void help(){} void getOut(){ printf("** \n\n The system is performing backup\n **"); printf("\n \tThank you for using IFISMS.....\n\n"); exit(1); } Endret 18. oktober 2007 av Mr.Garibaldi Lenke til kommentar
Roptaty Skrevet 18. oktober 2007 Del Skrevet 18. oktober 2007 Jeg ville også flytta koden som ser etter en ledig minneplass inn i en egen funksjon, som returnerer f.eks index til plassen. Husk at arrays er null indeksert i C/C++, så denne for ( avalibility = 1; avalibility<201;++avalibility){ bør du kanskje se litt nærmere på. En kommentar ang. minneallokeringen. Selv om man kan allokere alt minne man bruker, og så regne ut hvor man skal benytte seg av minnechunken, er det mer lesbart og mer vedlikeholdsvennlig å allokere minne der det trengs. F.eks allokere minnet til meta, og så allokere minnet til bitmap. Og til slutt: En debugger redder mange liv, og forhindrer kanskje en stakkars mann å bli skallet. 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å