Lomar Δημοσ. 7 Ιανουαρίου 2009 Δημοσ. 7 Ιανουαρίου 2009 χαίρεται, παλεύω εδώ και αρκετές εβδομάδες μια εργασία με hash files, συγκεκριμένα πρόκειται για ενα πρόγραμμα σε C, το οποίο είναι η βάση δεδομένων μιας εταιρείας αυτοκινήτων. όταν κάνω compile τον κώδικα (μέσω gcc σε terminal) μου εμφανίζει τα παρακάτω λάθη-warnings: > c.c:79:13: προειδοποίηση: multi-character character constant c.c: Στη συνάρτηση ‘hash’: c.c:79: προειδοποίηση: comparison is always true due to limited range of data type c.c: Στη συνάρτηση ‘eisagwgi’: c.c:101: προειδοποίηση: passing argument 1 of ‘fopen’ makes pointer from integer without a cast c.c:103: προειδοποίηση: passing argument 1 of ‘fopen’ makes pointer from integer without a cast c.c:115: σφάλμα: incompatible types in assignment c.c:142: προειδοποίηση: passing argument 1 of ‘fclose’ makes pointer from integer without a cast c.c: Στη συνάρτηση ‘anazhthsh’: c.c:180: σφάλμα: incompatible types in assignment c.c: Στη συνάρτηση ‘provoli_kata_markas’: c.c:252: σφάλμα: incompatible types in assignment c.c: Στη συνάρτηση ‘provoli_etos’: c.c:292: σφάλμα: incompatible types in assignment c.c: Στη συνάρτηση ‘dior_diagr’: c.c:347: σφάλμα: incompatible types in assignment c.c:371: σφάλμα: incompatible types in assignment το γενικό πρόβλημά μου δηλαδή είναι η μετατροπή της string μεταβλητής-πρωτεύον κλέιδί (άσχετο, απλά το αναεφέρω για να μπείτε πιο εύκολα στο κλίμα), απο char σε long int και τούμπαλιν. το έχω υλοποιήσει, αλλά ο gcc λέει άλλα, όπως φαίνετε και πιο πάνω Η μετατροπή του string σε integer, γίνετε φυσικά μέσα απο μια συνάρτηση (ακα hash), με τον παρακάτω τρόπο: > int hash(char *s){ long int p=1; int i=0, m=0; while(s[m]!='/0') m++; for(i=0; i<m; i++) p *= s[i]; return p%N; } απο τη στιγμή που το string διαβάζεται χαρακτήρα-χαρακτήρα, και η c μπορεί να δει χωρίς typecasting οποιοδήποτε char σαν integer, τότε η παραπάνω συνάρτηση υλοποιεί σωστά τη δουλειά της, χωρίς να με απασχολεί το πρόβλημα της μετατροπής του string σε integer. όταν όμως πάω να μετατρέχω τον παραγόμενο ακέραιο σε string array, τότε αρχίζουν τα προβλήματα. την εργασία την κάνω με ενα άλλο παιδί μαζί, και αυτός μου πρότεινε να υλοποιήσουμε ο καθένας τις δικές του συναρτήσεις με βάση το concept του καθενός. εγώ δλδ με typecasting και αυτός με τη συνάρτυηση itoa. μετά απο αρκετους πειραματισμούς, διαπίστωσα οτι το typecasting δεν κάνει για μετατροπή σε string array, αλλά ακόμα πιστεύω οτι το itoa δεν υλοποιήθηκε σωστά στον κώδικά μας... η υλοποίηση έγινε με βάση αυτό. οποιαδήποτε παρατήρηση, απορία, σύσταση, hint κτλ ευπρόσδεκτη παρακάτω παραθέτω τον κώδικά μας: > #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #define N 97 void eisagwgi(); void provoli(); void anazhthsh(); void provoli_kata_markas(); void provoli_etos(); void dior_diagr(int, int, char*); int hash(char *); struct autokin{ char ar_p[10]; char marka[20]; char modelo[10]; float timi; int etos; int kyvismos; }; FILE *f, *temp; struct autokin car; int main() { int apan; do{ printf("\n\n================================================="); printf("\n= Menu Epilogwn"); printf("\n=================================================\n\n"); printf("1. Eisagwgh\n"); printf("2. Provoli Olwn\n"); printf("3. Anazhtisi\n"); printf("4. Provoli kata marka\n"); printf("5. Provoli kata etos\n"); printf("6. Diorthwsi\n"); printf("7. Diagrafi\n"); printf("\n================================================="); printf("\n= <Gia na termatisetai to programma plhktrologiste 0>"); printf("\n=================================================\n\n"); scanf("%d", &apan); switch(apan){ case 0: printf ("\n\nEksodos Programmatos...\n\n"); break; case 1: eisagwgi(); break; case 2: provoli(); break; case 3: anazhthsh(); break; case 4: provoli_kata_markas(); break; case 5: provoli_etos(); break; case 6: dior_diagr(-1, 0, "**********"); break; case 7: dior_diagr(-1, 1, "**********"); break; } } while(apan!=0); return 0; } int hash(char *s){ long int p=1; int i=0, m=0; while(s[m]!='/0') m++; for(i=0; i<m; i++) p *= s[i]; return p%N; } void eisagwgi(){ FILE *f; long int addr=0; char sstr[10]; printf ("\n\n Dwse ton monadiko arithmo plaisiou: "); scanf("%s",sstr); addr=hash(sstr); printf ("\n\n H diefthinsi tou arxeiou einai i: %d",addr); printf ("\n\n\n"); f=fopen((char)addr, "rb+"); if (!f){ f=fopen((char)addr,"wb"); printf("Dwse marka autokinitou:\n"); scanf("%s", &car.marka); printf("Dwse modelo autokinitou:\n"); scanf("%s", &car.modelo); printf("Dwse timi autokinitou:\n"); scanf("%f", &car.timi); printf("Dwse etos kataskeuis:\n"); scanf("%d", &car.etos); printf("Dwse kyvismo autokinitou:\n"); scanf("%d", &car.kyvismos); car.ar_p=sstr; fwrite(&car, sizeof(struct autokin), 1, f); } else { fseek(f,0,SEEK_END); printf("Dwse marka autokinitou:\n"); scanf("%s", &car.marka); printf("Dwse modelo autokinitou:\n"); scanf("%s", &car.modelo); printf("Dwse timi autokinitou:\n"); scanf("%f", &car.timi); printf("Dwse etos kataskeuis:\n"); scanf("%d", &car.etos); printf("Dwse kyvismo autokinitou:\n"); scanf("%d", &car.kyvismos); printf("Dwse arithmo plaisiou autokinitou:\n"); scanf("%s", &car.ar_p); fwrite(&car, sizeof(struct autokin), 1, f); } fclose((char)addr); } void provoli(){ } void anazhthsh(){ int flag=0; char buf[2], colFile[8]; long int thesi=0; char ar_plaisiou[10]; printf ("\n\n Arithmos plaisiou upo anazitisi: "); scanf("%s",ar_plaisiou); thesi=hash(ar_plaisiou); f = fopen("autokin.dat", "rb+"); fseek(f, thesi*sizeof(struct autokin), SEEK_SET); /* printf("\n\n marka autokinitou: %s", car.marka); printf ("\n\n modelo autokinitou: %s", car.modelo); printf ("\n\n timi autokinitou: %.2f", car.timi); printf ("\n\n etos kataskeuhs autokinitou: %d", car.etos); printf ("\n\n kyvismos autokinitou: %d", car.kyvismos); */ fread(&car, sizeof(struct autokin), 1, f); if(strcmp(car.ar_p, ar_plaisiou)!=0){ itoa(thesi, buf, 10); colFile = strcat(buf, ".dat"); temp = fopen(colFile, "rb+"); if(temp){ while(!feof(temp) && flag==0){ fread(&car, sizeof(struct autokin), 1, temp); if(car.ar_p==ar_plaisiou){ fseek(temp, -thesi*sizeof(struct autokin), SEEK_CUR); fread(&car, sizeof(struct autokin), 1, temp); printf("\n\n marka autokinitou: %s", car.marka); printf ("\n\n modelo autokinitou: %s", car.modelo); printf ("\n\n timi autokinitou: %.2f", car.timi); printf ("\n\n etos kataskeuhs autokinitou: %d", car.etos); printf ("\n\n kyvismos autokinitou: %d", car.kyvismos); flag=1; } } fclose(temp); } } else{ fseek(f, -thesi*sizeof(struct autokin), SEEK_CUR); fread(&car, sizeof(struct autokin), 1, f); printf("\n\n marka autokinitou: %s", car.marka); printf ("\n\n modelo autokinitou: %s", car.modelo); printf ("\n\n timi autokinitou: %.2f", car.timi); printf ("\n\n etos kataskeuhs autokinitou: %d", car.etos); printf ("\n\n kyvismos autokinitou: %d", car.kyvismos); flag=2; } fclose(f); if(flag==0){ printf("\n=================================================\n"); printf("H EGGRAFFI POU ZHTATE DEN VRETHIKE"); printf("\n=================================================\n"); system("pause"); exit(0); } else{ printf("\n=================================================\n"); printf("H DIADIKASIA OLOKLIROTHIKE"); printf("\n=================================================\n"); system("pause"); exit(1); } } void provoli_kata_markas(){ char brand[20], buf[2], colFile[8]; int fd; printf("Ti marka psaxneis?\n"); scanf("%s", &brand); f = fopen("autokin.dat", "rb"); if(!f){ printf("\nTo arxeio autokin.dat den vrethike!"); printf("\nTo programma termatizetai..."); } else{ printf("\n\nEmfaniseis tis %s einai:\n=================================================\n", brand); while(!feof(f)){ fread(&car, sizeof(struct autokin), 1, f); fd = hash(car.ar_p);//**********************************************************************************************************THELEI DIEUTHINSI? if(car.etos!=-1 && strcmp(car.marka, brand)==0){ printf("\n- %s : %.2f : %d : %d\n", car.modelo, car.timi, car.etos, car.kyvismos); system("pause"); } itoa(fd, buf, 10); colFile = strcat(buf, ".dat"); temp = fopen(colFile, "rb"); if(temp){ while(!feof(temp)){ fread(&car, sizeof(struct autokin), 1, temp); if(car.etos!=-1 && strcmp(car.marka, brand)==0){ printf("\n- %s : %.2f : %d : %d\n", car.modelo, car.timi, car.etos, car.kyvismos); system("pause"); } } fclose(temp); } } fclose(f); } } void provoli_etos(){ char buf[2], colFile[8]; int year, fd; printf("Ti marka psaxneis?\n"); scanf("%d", &year); f = fopen("autokin.dat", "rb"); if(!f){ printf("\nTo arxeio autokin.dat den vrethike!"); printf("\nTo programma termatizetai..."); } else{ printf("\n\nEtos %s:\n=================================================\n", year); while(!feof(f)){ fread(&car, sizeof(struct autokin), 1, f); fd = hash(car.ar_p);//**********************************************************************************************************THELEI DIEUTHINSI? if(car.etos==year){ printf("\n- %s : %s : %.2f : %d\n", car.marka, car.modelo, car.timi, car.kyvismos); system("pause"); } itoa(fd, buf, 10); colFile = strcat(buf, ".dat"); temp = fopen(colFile, "rb"); if(temp){ while(!feof(temp)){ fread(&car, sizeof(struct autokin), 1, temp); if(car.etos==year){ printf("\n- %s : %s : %.2f : %d\n", car.marka, car.modelo, car.timi, car.kyvismos); system("pause"); } } fclose(temp); } } fclose(f); } } void dior_diagr(int thesi, int epilogi, char* ar_plaisiou){ struct autokin tmp; int fd=0, flag=0; char ar_p2[10], buf[2], colFile[8]; if(thesi==-1){ if(epilogi==0){ printf ("\n\n Dwse ton arithmo plaisiou pros diorthwsi: "); scanf("%s",&ar_p2); fd = hash(ar_p2); dior_diagr(fd, 0, ar_p2); } else{ printf ("\n\n Dwse ton arithmo plaisiou pros diagrafi: "); scanf("%s",&ar_p2); fd = hash(ar_p2); dior_diagr(fd, 1, ar_p2); } } else{ f = fopen("autokin.dat", "rb+"); fseek(f, thesi*sizeof(struct autokin), SEEK_SET); if(epilogi==0){ printf("\nmarka autokinitou: "); scanf ("%s",&tmp.marka); printf ("\nmodelo autokinitou: "); scanf ("%s",&tmp.modelo); printf ("\ntimi autokinitou: "); scanf ("%f",&tmp.timi); printf ("\netos kataskeuhs autokinitou: "); scanf ("%d",&tmp.etos); printf ("\nkyvismos autokinitou: "); scanf ("%d",&tmp.kyvismos); fread(&car, sizeof(struct autokin), 1, f); if(strcmp(car.ar_p, ar_plaisiou)!=0){ itoa(fd, buf, 10); colFile = strcat(buf, ".dat"); temp = fopen(colFile, "rb+"); if(temp){ while(!feof(temp) && flag==0){ fread(&car, sizeof(struct autokin), 1, temp); if(car.ar_p==ar_plaisiou){ fseek(temp, -thesi*sizeof(struct autokin), SEEK_CUR); fwrite(&car, sizeof(struct autokin), 1, temp); flag=1; } } fclose(temp); } } else{ fseek(f, -thesi*sizeof(struct autokin), SEEK_CUR); fwrite(&car, sizeof(struct autokin), 1, f); flag=2; } } else{ fread(&car, sizeof(struct autokin), 1, f); if(strcmp(car.ar_p, ar_plaisiou)!=0){ itoa(fd, buf, 10); colFile = strcat(buf, ".dat"); temp = fopen(colFile, "rb+"); if(temp){ while(!feof(temp) && flag==0){ fread(&car, sizeof(struct autokin), 1, temp); if(car.ar_p==ar_plaisiou){ car.etos=-1; fseek(temp, -thesi*sizeof(struct autokin), SEEK_CUR); fwrite(&car, sizeof(struct autokin), 1, temp); flag=1; } } fclose(temp); } } else{ car.etos=-1; fseek(f, -thesi*sizeof(struct autokin), SEEK_CUR); fwrite(&car, sizeof(struct autokin), 1, f); flag=2; } } fclose(f); if(flag==0){ printf("\n=================================================\n"); printf("H EGGRAFFI POU ZHTATE DEN VRETHIKE"); printf("\n=================================================\n"); system("pause"); exit(0); } else{ printf("\n=================================================\n"); printf("H DIADIKASIA OLOKLIROTHIKE"); printf("\n=================================================\n"); system("pause"); exit(1); } } } ps: λείπει η συνάρτηση provoli, αλλά αυτό είναι το κερασάκι στη τούρτα και φυσικά κάτι που μπορούμε να κάνουμε πολύ πιο άνετα απο το debugging
GrandGamer Δημοσ. 7 Ιανουαρίου 2009 Δημοσ. 7 Ιανουαρίου 2009 Αν δεν κάνω λάθος το String, στη C, είναι *s[]. Το πρώτο error το κάνει στη σειρά 115: incompatible types in assignment >car.ar_p=sstr; Δεν δημιουργείς πουθενά το car σου, πας κατευθείαν να γεμίσεις τις μεταβλητές του. Μήπως θα έπρεπε να κάνεις ένα malloc κάπου; Θα κάνεις τον car pointer και θα κάνεις ένα malloc. Όπου έχεις παρακάτω στον κώδικα car.kati θα το κάνεις car->kati. Μην πας να το κάνεις compile πριν από αυτή την αλλαγή γιατί θα πάθεις έμφραγμα
Lomar Δημοσ. 7 Ιανουαρίου 2009 Μέλος Δημοσ. 7 Ιανουαρίου 2009 φίλε μου καταρχάς σε ευχαριστώ για το ενδιαφέρον, το χρόνο και τη συμβουλή σου όπου car.* έβαλα car->*, επίσης έκανα και τις απαραίτητες διορθώσεις στη struct: > [b]typedef[/b] struct{ char ar_p[10]; char marka[20]; char modelo[10]; float timi; int etos; int kyvismos; } [b]autokin[/b]; FILE *f, *temp; [b]autokin *car;[/b] ps: νόμιζα οτι τα '->' τα χρησιμοποιούσαμε μόνο σε c++ το πρόβλημα τώρα είναι με τη malloc... αν κατάλαβα καλά θα πρέπει να κάνω malloc σε κάθε τι car->* προτού του βάλω τιμή; αν είναι έτσι αυτό δεν είναι υπερβολικά χρονοβόρο και στην ουσία αλλάζει ολόκληρος ο κώδικας... αν θέλεις εξήγησε μου τη λογική πίσω απο απο τη χρήση δυναμικής διαχείρησης μνήμης (aka malloc ) σε μεταβλητή δομής, γτ ούτε σχηματικά, ούτε λογικά δεν μπορώ να την καταλάβω... ίσως κάτι σαν: car=malloc(sizeof(autokin)); δηλωμένο στον προεπεξεργαστή (εφόσον το autokin έχει οριστεί πιο πάνω σαν τύπος δεδομένων δεν είναι απαραίτητο να προηγείται το struct, σωστά; ) ?? EDIT: Αν δεν κάνω λάθος το String, στη C, είναι *s[]. φίλε μου μήπως αναφέρεσαι στη συνάρτηση hash; αν ναι, μήπως είναι αρκετό το παρακάτω (σε bold); > int hash(char [b]*s[][/b]){ long int p=1; int i=0, m=0; while(s[m]!='/0') m++; for(i=0; i<m; i++) p *= s[i]; return p%N; } παιδαριώδης διόρθωση, αλλά εύχομαι να είναι τόσο απλό... το υλοποίησα στον κώδικα, αλλά ανάμεσα στα 100k λαθη που μου εμφανίζει, δν παίζει να καταλάβω διαφορά, αν ξέρεις κανένα τρόπο να μετράω το πλήθος των λαθών, τότε σίγουρα θα μπορώ και μόνος μου να πω αν υπάρχει διαφορά
GrandGamer Δημοσ. 7 Ιανουαρίου 2009 Δημοσ. 7 Ιανουαρίου 2009 Κατ' αρχάς το struct διόρθωσέ το πάλι γιατί έβαλε το autokin στο τέλος. Tο malloc θα το κάνεις ως εξής: >car = (autokin*)malloc(sizeof(autokin)); Με αυτόν τον τρόπο δημιουργείς έναν pointer τύπου autokin που βλέπει σε μία θέση μνήμης μεγέθους όσο μία μεταβλητή τύπου autokin. Δεν χρειάζεται να βάλεις τίποτα στον preprocessor μην τα μπλέκεις. Επίσης νομίζω ότι πρέπει να βάλεις όπου θες String, *kati[].
Lomar Δημοσ. 7 Ιανουαρίου 2009 Μέλος Δημοσ. 7 Ιανουαρίου 2009 Κατ' αρχάς το struct διόρθωσέ το πάλι γιατί έβαλε το autokin στο τέλος.Tο malloc θα το κάνεις ως εξής: >car = (autokin*)malloc(sizeof(autokin)); Με αυτόν τον τρόπο δημιουργείς έναν pointer τύπου autokin που βλέπει σε μία θέση μνήμης μεγέθους όσο μία μεταβλητή τύπου autokin. Δεν χρειάζεται να βάλεις τίποτα στον preprocessor μην τα μπλέκεις. Επίσης νομίζω ότι πρέπει να βάλεις όπου θες String, *kati[]. φίλε μου τπτ, ακόμα περισσότερα error... το malloc το έβαλα σε κάθε συνάρτηση, αλλά τπτ. anyway, παρόμοια άσκηση την είχα υλοποιήσει χωρίς malloc, ή ->, χωρίς κανένα πρόβλημα, οπότε λέω να εμείνω απλά στην αναζήτηση τρόπου για αλλαγή τύπου σε μεταβλητή απο long int σε array, thnks anyway ps: και να μην καταφέρω να κάνω τον κώδικα να τρέξει το σημαντικό είναι να καταλάνω και να μάθω περισσότερα απο αυτά που ξέρω τώρα, οπότε οτιδήποτε άλλο θέλεις να προσθέσεις (και για τις malloc), είσαι ευπρόσδεκτος (όπως και οποιοσδήποτε άλλος)
Lomar Δημοσ. 12 Ιανουαρίου 2009 Μέλος Δημοσ. 12 Ιανουαρίου 2009 λύθηκε το πρόβλημα με το casting!!! (δεν κάναμε typecasting, αλλά με itoa παλεύαμε τη μετατροπη). παραθέτω κώδικα: > #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #define N 37 void eisagwgi(); void provoli(); void anazhthsh(); void provoli_kata_markas(); void provoli_etos(); void dior_diagr(int, int, char*); int hash(char *); struct autokin{ char ar_p[10]; char marka[20]; char modelo[10]; float timi; int etos; int kyvismos; }; FILE *f, *temp; struct autokin car; int main() { int apan; do{ printf("\n\n================================================="); printf("\n= Menu Epilogwn"); printf("\n=================================================\n\n"); printf("1. Eisagwgh\n"); printf("2. Provoli Olwn\n"); printf("3. Anazhtisi\n"); printf("4. Provoli kata marka\n"); printf("5. Provoli kata etos\n"); printf("6. Diorthwsi\n"); printf("7. Diagrafi\n"); printf("\n================================================="); printf("\n= <Gia na termatisetai to programma plhktrologiste 0>"); printf("\n=================================================\n\n"); scanf("%d", &apan); switch(apan){ case 0: printf ("\n\nEksodos Programmatos...\n\n"); break; case 1: eisagwgi(); break; case 2: provoli(); break; case 3: anazhthsh(); break; case 4: provoli_kata_markas(); break; case 5: provoli_etos(); break; case 6: dior_diagr(-1, 0, "**********"); break; case 7: dior_diagr(-1, 1, "**********"); break; } } while(apan!=0); return 0; } int hash(char *s){ long int p=1; int i=0, m=0; while(s[m]!='/0') m++; for(i=0; i<m; i++) p *= s[i]; return p%N; } void eisagwgi(){ int fd, i=0; char buf[10]; f = fopen("autokin.dat", "rb+"); if(!f){ f = fopen ("autokin.dat","wb"); strcpy(car.marka,"********************"); strcpy(car.modelo,"**********"); strcpy(car.ar_p,"**********"); car.timi=0.0; car.etos=0; car.kyvismos=0; for (i=0; i < N; i++) fwrite (&car, sizeof(struct autokin), 1, f); } printf("Dwse marka autokinitou:\n"); scanf("%s", &car.marka); printf("Dwse modelo autokinitou:\n"); scanf("%s", &car.modelo); printf("Dwse timi autokinitou:\n"); scanf("%f", &car.timi); printf("Dwse etos kataskeuis:\n"); scanf("%d", &car.etos); printf("Dwse kyvismo autokinitou:\n"); scanf("%d", &car.kyvismos); printf ("Dwse arithmo plaisiou: \n"); scanf("%s",&car.ar_p); fd = hash(car.ar_p); fseek(f, fd*sizeof(struct autokin), SEEK_SET); fread(&car,sizeof(struct autokin), 1, f); if(strcmp(car.ar_p,"**********")==0){ fseek(f, -sizeof(struct autokin), SEEK_CUR); fwrite(&car, sizeof(struct autokin), 1, f); } else{ itoa(fd, buf, 10); strcat(buf, ".dat"); temp = fopen(buf, "rb+"); if (!temp) temp = fopen(buf, "wb"); else fseek(temp, 0, SEEK_END); fwrite(&car, sizeof(struct autokin), 1, temp); fclose(temp); } fclose(f); } void provoli(){ char buf[8]; int fd; f = fopen("autokin.dat", "rb"); if(!f){ printf("\nTo arxeio autokin.dat den vrethike!"); printf("\nTo programma termatizetai..."); } else{ printf ("\n Emfanisi olwn twn eggrafwn: \n"); system ("pause"); while(!feof(f)){ fread(&car, sizeof(struct autokin), 1, f); fd = hash(car.ar_p); if(car.etos!=-1 && strcmp(car.ar_p,"**********")!=0){ printf("\n- %s : %.2f : %d : %d\n", car.modelo, car.timi, car.etos, car.kyvismos); system("pause"); } itoa(fd, buf, 10); strcat(buf, ".dat"); temp = fopen(buf, "rb"); if(temp){ while(!feof(temp)){ fread(&car, sizeof(struct autokin), 1, temp); if(car.etos!=-1 && strcmp(car.ar_p,"**********")!=0){ printf("\n- %s : %.2f : %d : %d\n", car.modelo, car.timi, car.etos, car.kyvismos); system("pause"); } } fclose(temp); } } fclose(f); } } void anazhthsh(){ int epilogi; do{ printf ("\n\n 0 -> Diorthwsi, 1 -> Diagrafi: "); scanf ("%d",&epilogi); }while(epilogi!=0 && epilogi!=1); dior_diagr(-1, epilogi,"**********"); } void provoli_kata_markas(){ char brand[20], buf[8]; int fd; printf("Ti marka psaxneis?\n"); scanf("%s", &brand); f = fopen("autokin.dat", "rb"); if(!f){ printf("\nTo arxeio autokin.dat den vrethike!"); printf("\nTo programma termatizetai..."); } else{ printf("\n\nEmfaniseis tis %s einai:\n=================================================\n", brand); while(!feof(f)){ fread(&car, sizeof(struct autokin), 1, f); fd = hash(car.ar_p);//**********************************************************************************************************THELEI DIEUTHINSI? if(car.etos!=-1 && strcmp(car.marka, brand)==0){ printf("\n- %s : %.2f : %d : %d\n", car.modelo, car.timi, car.etos, car.kyvismos); system("pause"); } itoa(fd, buf, 10); strcat(buf, ".dat"); temp = fopen(buf, "rb"); if(temp){ while(!feof(temp)){ fread(&car, sizeof(struct autokin), 1, temp); if(car.etos!=-1 && strcmp(car.marka, brand)==0){ printf("\n- %s : %.2f : %d : %d\n", car.modelo, car.timi, car.etos, car.kyvismos); system("pause"); } } fclose(temp); } } fclose(f); } } void provoli_etos(){ char buf[8]; int year, fd; printf("Ti marka psaxneis?\n"); scanf("%d", &year); f = fopen("autokin.dat", "rb"); if(!f){ printf("\nTo arxeio autokin.dat den vrethike!"); printf("\nTo programma termatizetai..."); } else{ printf("\n\nEtos %s:\n=================================================\n", year); while(!feof(f)){ fread(&car, sizeof(struct autokin), 1, f); fd = hash(car.ar_p);//**********************************************************************************************************THELEI DIEUTHINSI? if(car.etos==year){ printf("\n- %s : %s : %.2f : %d\n", car.marka, car.modelo, car.timi, car.kyvismos); system("pause"); } itoa(fd, buf, 10); strcat(buf, ".dat"); temp = fopen(buf, "rb"); if(temp){ while(!feof(temp)){ fread(&car, sizeof(struct autokin), 1, temp); if(car.etos==year){ printf("\n- %s : %s : %.2f : %d\n", car.marka, car.modelo, car.timi, car.kyvismos); system("pause"); } } fclose(temp); } } fclose(f); } } void dior_diagr(int thesi, int epilogi, char* ar_plaisiou){ struct autokin tmp; int fd=0, flag=0; char ar_p2[10], buf[8]; if(thesi==-1){ if(epilogi==0){ printf ("\n\n Dwse ton arithmo plaisiou pros diorthwsi: "); scanf("%s",&ar_p2); fd = hash(ar_p2); dior_diagr(fd, 0, ar_p2); } else{ printf ("\n\n Dwse ton arithmo plaisiou pros diagrafi: "); scanf("%s",&ar_p2); fd = hash(ar_p2); dior_diagr(fd, 1, ar_p2); } } else{ f = fopen("autokin.dat", "rb+"); fseek(f, thesi*sizeof(struct autokin), SEEK_SET); if(epilogi==0){ printf("\nmarka autokinitou: "); scanf ("%s",&tmp.marka); printf ("\nmodelo autokinitou: "); scanf ("%s",&tmp.modelo); printf ("\ntimi autokinitou: "); scanf ("%f",&tmp.timi); printf ("\netos kataskeuhs autokinitou: "); scanf ("%d",&tmp.etos); printf ("\nkyvismos autokinitou: "); scanf ("%d",&tmp.kyvismos); fread(&car, sizeof(struct autokin), 1, f); if(strcmp(car.ar_p, ar_plaisiou)!=0){ itoa(fd, buf, 10); strcat(buf, ".dat"); temp = fopen(buf, "rb+"); if(temp){ while(!feof(temp) && flag==0){ fread(&car, sizeof(struct autokin), 1, temp); if(car.ar_p==ar_plaisiou){ fseek(temp, -sizeof(struct autokin), SEEK_CUR); fwrite(&car, sizeof(struct autokin), 1, temp); flag=1; } } fclose(temp); } } else{ fseek(f, -sizeof(struct autokin), SEEK_CUR); fwrite(&car, sizeof(struct autokin), 1, f); flag=2; } } else{ fread(&car, sizeof(struct autokin), 1, f); if(strcmp(car.ar_p, ar_plaisiou)!=0){ itoa(fd, buf, 10); strcat(buf, ".dat"); temp = fopen(buf, "rb+"); if(temp){ while(!feof(temp) && flag==0){ fread(&car, sizeof(struct autokin), 1, temp); if(car.ar_p==ar_plaisiou){ car.etos=-1; fseek(temp, -sizeof(struct autokin), SEEK_CUR); fwrite(&car, sizeof(struct autokin), 1, temp); flag=1; } } fclose(temp); } } else{ car.etos=-1; fseek(f, -sizeof(struct autokin), SEEK_CUR); fwrite(&car, sizeof(struct autokin), 1, f); flag=2; } } fclose(f); if(flag==0){ printf("\n=================================================\n"); printf("H EGGRAFFI POU ZHTATE DEN VRETHIKE"); printf("\n=================================================\n"); system("pause"); exit(0); } else{ printf("\n=================================================\n"); printf("H DIADIKASIA OLOKLIROTHIKE"); printf("\n=================================================\n"); system("pause"); exit(1); } } } το πρόβλημα τώρα είναι πως έχω πρόβλημα με την κλήση της συνάρτησης hash, απο οποιαδήποτε άλλη συνάρτηση και μου κρασάρει η εφαρμογή, αφού δε γίνεται σωστά η εισαγωγή του string array απο τις άλλες συναρτήσεις στη hash. αυτό που ζητάω δεν είναι κώδικας, απλά μια κατεύθυνση για το πως να περνάω ενα string array σε μια συνάρτηση (είτε απο τη main είτε απο άλλη συνάρτηση). με malloc κτλ δοκίμασα διάφορα, αλλά τελικά διαπίστωσα οτι έχω χάσει τον μπούσουλα με τη δυναμικη διαχείρηση μνήμης. thnks in advance!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.