Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

μου φαινεται overkill αυτο :P

 

Όχι μόνο δεν είναι overkill, αλλά ούτε αυτό σου εξασφαλίζει καλή λειτουγία του προγράμματός σου σε bad input (π.χ. αν σου δώσει πάνω από 2 χαρακτήρες στην είσοδο, τότε κι ο κώδικας του albnik σκάει: buffer overrun).

 

Μπορείς να δοκιμασεις όμως έτσι:

	char input[2+1];

	scanf( "%2s", input );
	printf( "%s\n", input );

το οποίο θα δουλέψει. Έχεις όμως 2 θέματα:

1. πρέπει να κάνεις συνέχεια hardcode το... magic numer 2 μέσα στα scanf()

2. έχει πάλι πρόβλημα με το line-buffering αν σου δώσει παραπάνω από 2 χαρακτήρες

	char input[2+1];

	scanf( "%2s", input );
	printf( "%s\n", input );

	scanf( "%2s", input );
	printf( "%s\n", input );

Οπότε μπορείς να δοκιμάσεις αυτό:
#define MAXSIZ_INPUT	(2+1)
int main( void )
{
	char input[MAXSIZ_INPUT];

	fgets(input, MAXSIZ_INPUT, stdin);
	sscanf( "%s", input );
	printf( "%s\n", input );

	fgets(input, MAXSIZ_INPUT, stdin);
	sscanf( "%s", input );
	printf( "%s\n", input );

	return 0;
}
που σου λύνει το 1, αλλά εξακολουθεί να υποφέρει από το 2.

 

Οπότε μπορείς να δοκιμάσεις αυτό:

#include <stdio.h>
#define MAXSIZ_INPUT	(2+1)

/* ----------------------------------------------------
 * Read a c-string from stdin, flushing any extra characters.
 */
char *s_getsflushed( char *s, size_t ssize )
{
	register int c;
	register size_t i;

	/* sanity checks */
	if ( !s ) {
		return NULL;
	}
	if ( ssize < 1 ) {
		return s;
	}

	/* read chars from stdin */
	for (i=0; i < ssize-1 && '\n' != (c=getchar()) && EOF != c; i++)
		s[i] = c;

	if ( s[i] != '\n' ) {			/* ssize reached without '\n' ? */
		while ( getchar() != '\n' )	/* flush any remaining chars */
			/* void */ ;
	}
	s[i] = '\0';				/* nul-terminate s */

	return s;
}

/* -------------------------------------- */
int main( void )
{
	char input[MAXSIZ_INPUT];

	s_getsflushed(input, MAXSIZ_INPUT);
	printf( "%s\n", input );

	s_getsflushed(input, MAXSIZ_INPUT);
	printf( "%s\n", input );

	return 0;
}

που σου λύνει και το 1 και το 2.

 

 

 

Η s_getsflushed() είναι μέρος της LIBS preAlpha, που είχα φτιάξει παλιότερα και επεκτείνω αυτές τις μέρες στην έκδοση 0.2Α, με διάφορες προσθήκες, bug-fixes και μεταφορά της τεκμηρίωσης σε doxygen. Εδώ είναι η νέα τεκμηρίωση η οποία θα είναι πλέον μόνο στα Αγγλικά και προς το παρόν είναι και ελλιπής και δεν συνοδεύεται από downladable κώδικα (αν και είναι διαθέσιμος online μέσω της τεκμηρίωσης, κάτω από κάθε συνάρτηση)... είναι καλό preview όμως για τις αλλαγές & προσθήκες που περιέχει ήδη η νέα έκδοση της βιβλιοθήκης σχετικά με την αρχική.

 

 

Κατά τα άλλα, από τον κώδικα που έχεις δώσει, φαίνεται πως χρειάζεται να αφιερώσεις χρόνο να διαβάσεις και να μάθεις τα βασικά περί δεικτών.

  • Απαντ. 1,6k
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

 

 

Όχι μόνο δεν είναι overkill, αλλά ούτε αυτό σου εξασφαλίζει καλή λειτουγία του προγράμματός σου σε bad input (π.χ. αν σου δώσει πάνω από 2 χαρακτήρες στην είσοδο, τότε κι ο κώδικας του albnik σκάει: buffer overrun).

 

Μπορείς να δοκιμασεις όμως έτσι:

	char input[2+1];

	scanf( "%2s", input );
	printf( "%s\n", input );

το οποίο θα δουλέψει. Έχεις όμως 2 θέματα:

1. πρέπει να κάνεις συνέχεια hardcode το... magic numer 2 μέσα στα scanf()

2. έχει πάλι πρόβλημα με το line-buffering αν σου δώσει παραπάνω από 2 χαρακτήρες

	char input[2+1];

	scanf( "%2s", input );
	printf( "%s\n", input );

	scanf( "%2s", input );
	printf( "%s\n", input );

Οπότε μπορείς να δοκιμάσεις αυτό:
#define MAXSIZ_INPUT	(2+1)
int main( void )
{
	char input[MAXSIZ_INPUT];

	fgets(input, MAXSIZ_INPUT, stdin);
	sscanf( "%s", input );
	printf( "%s\n", input );

	fgets(input, MAXSIZ_INPUT, stdin);
	sscanf( "%s", input );
	printf( "%s\n", input );

	return 0;
}
που σου λύνει το 1, αλλά εξακολουθεί να υποφέρει από το 2.

 

Οπότε μπορείς να δοκιμάσεις αυτό:

#include <stdio.h>
#define MAXSIZ_INPUT	(2+1)

/* ----------------------------------------------------
 * Read a c-string from stdin, flushing any extra characters.
 */
char *s_getsflushed( char *s, size_t ssize )
{
	register int c;
	register size_t i;

	/* sanity checks */
	if ( !s ) {
		return NULL;
	}
	if ( ssize < 1 ) {
		return s;
	}

	/* read chars from stdin */
	for (i=0; i < ssize-1 && '\n' != (c=getchar()) && EOF != c; i++)
		s[i] = c;

	if ( s[i] != '\n' ) {			/* ssize reached without '\n' ? */
		while ( getchar() != '\n' )	/* flush any remaining chars */
			/* void */ ;
	}
	s[i] = '\0';				/* nul-terminate s */

	return s;
}

/* -------------------------------------- */
int main( void )
{
	char input[MAXSIZ_INPUT];

	s_getsflushed(input, MAXSIZ_INPUT);
	printf( "%s\n", input );

	s_getsflushed(input, MAXSIZ_INPUT);
	printf( "%s\n", input );

	return 0;
}

που σου λύνει και το 1 και το 2.

 

 

 

Η s_getsflushed() είναι μέρος της LIBS preAlpha, που είχα φτιάξει παλιότερα και επεκτείνω αυτές τις μέρες στην έκδοση 0.2Α, με διάφορες προσθήκες, bug-fixes και μεταφορά της τεκμηρίωσης σε doxygen. Εδώ είναι η νέα τεκμηρίωση η οποία θα είναι πλέον μόνο στα Αγγλικά και προς το παρόν είναι και ελλιπής και δεν συνοδεύεται από downladable κώδικα (αν και είναι διαθέσιμος online μέσω της τεκμηρίωσης, κάτω από κάθε συνάρτηση)... είναι καλό preview όμως για τις αλλαγές & προσθήκες που περιέχει ήδη η νέα έκδοση της βιβλιοθήκης σχετικά με την αρχική.

 

 

Κατά τα άλλα, από τον κώδικα που έχεις δώσει, φαίνεται πως χρειάζεται να αφιερώσεις χρόνο να διαβάσεις και να μάθεις τα βασικά περί δεικτών.

σιγουρα χρειαζομαι ακομα αρκετο διαβασμα για τους δεικτες.

 

ευχαριστω για τις υποδειξεις επισης και τον κωδικα σου :)

Δημοσ.

Xρονια πολλα migfara μου :P

 

χρονια πολλα σε οοοοοοολους ...

 

μολις το θρεντ φτασει στις 100 σελιδες προτεινω να βρεθουμε για καφεδακι οσοι θελετε !!!!

Δημοσ.

Χρόνια πολλά και σε σένα Κώστα, και σε όλους.

 

 

 

Για καφέ, προσωπικά δεν μπορώ να το υποσχεθώ, αλλά αν κι όταν έρθει εκείνη ώρα βλέπουμε :)

 

 

Δημοσ.

καλησπερα και χρονια πολλα!

 

που λετε εχω μια απορια οσον αφορα το πως μπορω να γραψω σε ενα αρχειο.

πχ εχω 2 counters,τον c1 και τον c2. μεσα στο προγραμμα μου αυτοι αυξανονται.

και θελω οταν ειναι να κλεισει το προγραμμα,να τους βαλω μεσα σε ενα αρχειο test.txt.

 

εχω δοκιμασει αυτο

>void file_write_test(){
        fopen("test.txt", "w");
        fprintf("test.txt", "o counter1 einai isos me %d kai o deuteros me %d", c1, c2);
        fclose("test.txt");
}

αλλα δεν μπορω να πω οτι εχω βρει προκοπη..θεωρητικα ειναι σωστο αυτο,ετσι? απο το wikipedia και αλλα sites Που εχω ψαξει,λογικα ειναι σωστο,ομως δεν λειτουργει..δημιουργει το αρχειο test.txt μεν,αλλα το αφηνει κενο.

καπου διαβασα οτι θα πρεπει να γινεται και fclose(); για να σταματαει ο Buffer και να γραφονται τα δεδομενα στο αρχειο. και ομως,το κανω αυτο αλλα και παλι μενει κενο το αρχειο..

Δημοσ.

 

Μην περνάς το "test.txt" στις fprintf και fclose

FILE * pFile;
pFile = fopen("test.txt","w");
fprintf(pFile, "o counter1 einai isos me %d kai o deuteros me %d", c1, c2);
fclose(pFile);

οταν το κανω ετσι δεν γινεται  build και εμφανιζει τα εξης λαθη:

>functions.c:62:1: error: ‘FILE’ undeclared (first use in this function)
functions.c:62:1: note: each undeclared identifier is reported only once for each function it appears in
functions.c:62:8: error: ‘pFile’ undeclared (first use in this function)

Δημοσ.
void fun (int * array , int i  ){
  int i; 
  for( i=1;i<=10;i++){
      
   function( array ,  i );
  
 }
}

Θέλω να μετρατέψω την fun σε αναδρομική συνάρτηση αλλά δεν μπορώ...

Δηλαδή να κάνω προσπέλαση του πίνακα array και κάλεσμα την συνάρτησης function αναδρομικά, χωρίς να χρησιμοποιώ το for-loop..

Δεν μου γινετε όμως

Δημοσ. (επεξεργασμένο)

Καταρχήν μέσα στο fun καλείς μια function με όνομα function και όχι fun. Πέρα απο αυτό, το τρικ είναι να γράψεις την function για μία και μοναδική περίπτωση, και μετά να δεις πως θα το μετατρέψεις σε αναδρομή. 

Προφανώς θέλεις κάθε φορά να αυξάνεται το i άρα μέσα στην αναδρομή θα βάλεις ένα i++.

Επίσης στην αρχή κάθε function αρχικοποιείς το i, αυτό θα σου δημιουργήσει πρόβλημα οπότε το βγάζεις..

Τέλος πρέπει να φροντίσεις για τη συνθήκη τερματισμού οπότε λογικά με ένα if (i > 10) return; είσαι εντάξει.

Επεξ/σία από ZAKKWYLDE
Δημοσ.

Καλησπερα απο μενα!!!

Θα ηθελα να κανω μια ερωτηση σχετικα με τα structures.

Ειναι δυνατον μια συναρτηση να επιστρεφει μια ολοκληρη δομη??

Θελω μια συναρτηση να επιστρεφει 4 συντεταγμενες και ειναι η μονη λυση που σκεφτηκα!

Ευχαριστω!

Δημοσ.

Καλησπέρα, ναι γίνεται... επέστρεψέ την κανονικά όπως κάθε άλλη μεταβλητή.

 

Εναλλακτικά μπορείς να περνάς την δομή σου by reference στην συνάρτηση, που θα αλλάζει απευθείας τα πεδία της δομής.

 

EDIT:

 

By reference:

...
typedef struct Coords4 {
    int w,x,y,z;
} Coords4;
...
/* ---------------------- */
bool foo( Coords4 *coords )
{
    if ( !coords )
        return false;

    coords->w = corrds->x = 100;
    coords->y = corrds->z = 200;
    return true;
}
/* ---------------------- */
int main( void )
{
    Coords4 mycoords = {10,10,20,20};

    foo( &mycoords );
    // εδώ έχει αλλάξει σε: {100,100,200,200}
    ...
    return 0;
}
Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...