Τα πάντα για την C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την C

Δημοσίευσηαπό stamatiou » 15 Ιουν 2012, 19:38

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
Καταλαβαίνει κανείς τίποτα από αυτά;
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 16 Ιουν 2012, 15:03

stamatiou έγραψε:
...
Επίσης τώρα προσπαθώ να φτιάξω ένα πρόγραμμα όπου κάποιος θα μπορεί να έχει κάτι σαν τράπεζα και να φτιάχνει λογιαριασμούς κλπ. Αλλά για κάποιο λόγο μου βγάζει seg fault.
...
το σφάλμα είναι στη γραμμή 42 στη lowercase_str αν και την έχω ελέγξει και στο άλλο project :/

Το πρόβλημα είναι πως με την lowercase() προσπαθείς να αλλάξεις τους χαρακτήρες ενός string-literal (συγκεκριμένα του "Surname"). Τρως seg-fault επειδή τα string-literals είναι read-only memory.

Αν χρησιμοποιήσεις κανονικά strings για το όνομα και το επώνυμο θα δουλέψει...

Μορφοποιημένος Κώδικας: Επιλογή όλων
...
char name[] = "Name";
char surname[] = "Surname";

initialize();

add_person(name, surname);
if ( search_person(surname) )
printf("Success!\n");
...


Άσχετα με το seg-fault, η υλοποίηση που κάνεις στην lowercase() υπολογίζει την strlen(str) σε κάθε επανάληψη του loop, με αποτέλεσμα ο κώδικάς σου να τρέχει πάρα πολύ αργά.

ΥΓ. Προσωπικά έχω σταματήσει να κοιτάω τους κώδικες που ποστάρεις Γιώργο γιατί δεν φροντίζεις να τους έχεις ευανάγνωστους (με σχόλια, με κενές γραμμές μεταξύ λογικών ενοτήτων, με γραμμές διαχωρισμού μεταξύ των συναρτήσεων, κλπ). Για μένα αυτό παίζει το 1ο ρόλο για το αν θα κοιτάξω έναν κώδικα ή όχι.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό stamatiou » 16 Ιουν 2012, 15:14

@migf1:
Ευχαριστώ πολυ! Τώρα αμέσως, ξεκινάω update το repository με το Comic Organiser για να γίνει πιο ευανάγνωστο! :D
EDIT: Δλδ, όταν γράφω ένα string literal οπουδήποτε δεσμέυεται χώρος για αυτό;
Τελευταία επεξεργασία από stamatiou και 16 Ιουν 2012, 15:42, έχει επεξεργασθεί 1 φορά/ες συνολικά
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 16 Ιουν 2012, 15:27

Παρακαλώ :)

Spoiler: show
Για να καταλάβεις, για να διαβάσω τον κώδικά σου κάθισα πρώτα και τον έκανα ευανάγνωστο, κάτι που προφανώς από ένα σημείο και μετά γίνεται πολύ κουραστικό...

Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

// #include "trapeza.h"
#define MAXNAME (120 + 1)
#define COMPARE_STR(STR1, STR2) strcmp( lowercase_str(STR1), lowercase_str(STR2) )

int initialize( void );
int add_person( char *name, char *surname );
int print_person( char *query );
int give_money( int money );
int sub_money( int money );
char *lowercase_str( char *str );

typedef struct person {
char name[MAXNAME];
char surname[MAXNAME];
int money;
}Person;


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 )
{
char name[] = "Name";
char surname[] = "Surname";

initialize();

add_person(name, surname);
if ( search_person(surname) )
printf("Success!\n");

exit(0);
}
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 16 Ιουν 2012, 17:11

stamatiou έγραψε:@migf1:
...
EDIT: Δλδ, όταν γράφω ένα string literal οπουδήποτε δεσμέυεται χώρος για αυτό;

Ναι, ο compiler δημιουργεί έναν εσωτερικό πίνακα από χαρακτήρες, το όνομα του οποίου όμως δεν το "αποκαλύπτει".
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό stamatiou » 16 Ιουν 2012, 18:13

Οκ, έγιναν οι αλλαγές στο repository!
https://github.com/giwrg98/Comic-Organiser
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 16 Ιουν 2012, 19:01

Ωραίος :)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό stamatiou » 18 Ιουν 2012, 13:54

Τελικά μπορεί κάποιος να με βοηθήσει με αυτή τη συνάρτηση:
Κώδικας: Επιλογή όλων
unsigned setbits(unsigned x, int p, int n, unsigned y)
{
return (x & ((~0 << (p + 1)) | (~(~0 << (p + 1 - n))))) | ((y & ~(~0 << n)) << (p + 1 - n));
}

Χριστό δε καταλαβαίνω :P
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό g1wrg0s » 18 Ιουν 2012, 17:15

Ειναι bitwice operators. Αν δεν καταλαβαινεις τι ειναι τα συμβολα τοτε δες http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B
Spoiler: show
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Πρώτα βήματα ┃ Αγγλικών: Πρώτα βήματα
2 Ubuntu 12.10 quantal 3.10.20-031020-generic 32bit (el_GR.UTF-8, Unity ubuntu), Windows 8
3 Intel Core i5-3230M CPU @ 2.60GHz ‖ RAM 7923 MiB ‖ Acer VA50_HC_CR - Acer Aspire V3-571G
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915} ⋮ nVidia Device [10de:0fe1] {}
5 eth0: Broadcom NetLink BCM57785 Gigabit Ethernet PCIe [14e4:16b5] (rev 10) ⋮ wlan0: Atheros Inc. AR9462 Wireless Network Adapter [168c:0034] (rev 01)
g1wrg0s
punkTUX
punkTUX
 
Δημοσιεύσεις: 196
Εγγραφή: 26 Μάιος 2012, 10:29
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό stamatiou » 18 Ιουν 2012, 17:18

Τα σύμβολα τα έχω καταλάβει αλλά δεν μπορώ να καταλάβω τι εξυπηρετεί το κάθε expression.
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι