Δημοσιεύτηκε: 15 Ιουν 2012, 19:38
από stamatiou
g1wrg0s έγραψε:Για το πρωτο project : Καλο θα ηταν να εξαφανισεις τα magic constants.
Επισης στη main γινεται να μου εξηγησεις τις πρωτες γραμμες ; Εχει τα παρακατω τα οποια δεν τα καταλαβαινω...
PRINT_MAIN_MENU;
CLEAR_STDIN;

Για το δευτερο... Προφανως αν οντως το σφαλμα βρισκεται εκει που λες τοτε εχω την εντυπωση οτι ο ελεγχος που κανεις στο for loop δεν δουλευει οπως θες . Θα προτεινα αυτο το str[i] να το αλλαζες με κατι αλλο και να τσεκαρεις αν τρως τα ιδια σφαλματα.

Βασικα τωρα που το σκεφτομαι αν ο πινακας δεν εχει κανενα μηδενικο τοτε ποτε θα τερματιστει το loop; Η απαντηση εχω την εντυπωση οτι ειναι οταν θα πεταξει segmetation, δηλαδη οταν θα πας να διαβασεις απο μνημη που δεν εχεις το δικαιωμα προσβασης.
βαλε σαν ελεγχο size[i] && i!=size_of_array

To PRINT_MAIN_MENU περιέχει μία printf που λέει τις επιλογές, δλδ για να προσθέσετε comic πατήστε 1 κλπ.
Το CLEAR_STDIN καθαρίζει την stdin από χαρακτήρες newline για να διαβαστεί η επόμενη επιλογή. Όσο για το αν το str έχει μηδενικό, πώς αλλιώς θα σηματοδοτείται το τελος ενος string;
Επίσης το trapeza.c το έκανα έτσι αλλά κια πάλι βγάζει seg fault:
Spoiler: show
Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#include "trapeza.h"

Person *array;
FILE *fp;
unsigned int person_count;

int add_person(char *name, char *surname) {
Person new_person;
fp = fopen("in.dat", "a+b");
strcpy(new_person.name, name);
strcpy(new_person.surname, surname);
new_person.money = 0;
fwrite(&new_person, sizeof(new_person), 1, fp);
rewind(fp);
fread(&person_count, sizeof(unsigned int), 1, fp);
person_count++;
rewind(fp);
fwrite(&person_count, sizeof(unsigned int), 1, fp);
array = (Person *) realloc(array, sizeof(array) + sizeof(new_person));
array[person_count - 1] = new_person;
fclose(fp);
return 0;
}

int initialize(void) {
fp = fopen("in.dat", "wb+");
person_count = 0;
fwrite(&person_count, sizeof(unsigned int), 1, fp);
fclose(fp);
return 0;
}

char *lowercase_str(char *str) {
int i;
for(i = 0; str[i] && i <= strlen(str); i++) {
str[i] = tolower(str[i]);
}
return str;
}



int search_person(char *query) {
int i;
for(i = 0; i < person_count; i++) {
if((COMPARE_STR(array[i].name, query) == 0) || (COMPARE_STR(array[i].surname, query) == 0))
return 1;
}
return 0;
}


int main(void) {
initialize();
add_person("Name", "surname");
if(search_person("Surname")) {
printf("Success!\n");
}
getchar();
return 0;
}

EDIT: Τώρα έχω βρει και αυτήν την άσκηση με Bitwise operators στο K&R: http://clc-wiki.net/wiki/K%26R2_solutio ... Exercise_6
Καταλαβαίνει κανείς τίποτα από αυτά;