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

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

Δημοσ.

Δεν πρεπει να συμπεριλάβεις το αρχειο επικεφαλιδας(που ειναι δηλωμενη με το extern) στο .c οπου οριζεις την global για να μπορει να τσεκαρει ετσι ο μεταγλωτιστης αν υπάρχει συνεπεια μεταξυ ορισμου και δηλωσης ? Οπως το εκανε και πιο πανω απο το δικο σου ποστ ο ημιθεος με τα αρχεια που εδωσε

Ναι, αλλά εγώ είπα πως δεν πρέπει να βάλεις στο .h τον ορισμό της global (εσύ μιλάς για την δήλωσή της).

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

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

Δημοσ.

Καλησπέρα,

 

είναι εφικτό να κάνω ένα πρόγραμμα να περιμένει τον χρήστη περιορισμένο χρονικό διάστημα(πχ 2 λεπτά)

να πληκτρολογήσει μια επιλογή και άν ο χρήστης τελικά δεν πληκτρολογήσει τίποτα σε αυτο το διάστημα το πρόγραμμα να τερματιστεί;

Δημοσ.

Καλησπέρα,

 

είναι εφικτό να κάνω ένα πρόγραμμα να περιμένει τον χρήστη περιορισμένο χρονικό διάστημα(πχ 2 λεπτά)

να πληκτρολογήσει μια επιλογή και άν ο χρήστης τελικά δεν πληκτρολογήσει τίποτα σε αυτο το διάστημα το πρόγραμμα να τερματιστεί;

Με αφορμή την χρήσιμη και εξαιρετικά πνευματώδη συνεισφορά της πάπιας, παραθέτω μερικά ενδιαφέροντα κατά τη γνώμη μου links.

How to use timer in C?

timers in c

 

Γενικά βάζοντας σε μια μηχανή αναζήτησης το "timer in c" πιστεύω ότι θα καλυφθείς.

  • Like 2
Δημοσ.

Απορια εστω οτι εχω ενα πινακα

char tmp[] = "ABCDEFGΗ"

 

και θέλω σε καθε θεση του ι να εχω δυο χαρακτηρες. Πως το κανω?

Δημοσ.

Καταρχάς δεν γίνεται να έχεις παραπάνω από ένα χαρακτήρα σε μία θέση πίνακα. Εσύ θες πίνακα από strings αν κατάλαβα καλά; Μια λύση είναι να δημιουργήσεις ένα πίνακα χαρακτήρων δύο διαστάσεων.

Δημοσ.

...

Δεν παιζει ομως! Που κανω λαθος στην σκεψη

 

Στο ότι αυτό που ζητάς δεν είναι string αλλά πίνακας από strings, με το κάθε string να έχει θέση για μέχρι 2 ωφέλιμους χαρακτήρες...

 

 

    char tmp[][3] = { {"ab"}, {"58"}, {"r5"}, {"ji"}, {"\0"} };

    int i = 0;
    while ( *tmp[i] )
        puts( tmp[i++] );
Δημοσ.

Xμμ με παιδευει η C γι'αυτο που θελω αλλα δεν το βαζω κατω :-D

Σωστος ο τροπος σου migf1 αλλα επειδη ο πινακας που ηδη εχω ειναι ορισμενος μονοδιαστατος δεν με πειραζει να το περναω σε 2D αλλα ψαχνω κατι αλλο.

Αυτο σημαινει πως αν θελω ν-χαρακτηρων string χρειαζομαι ν-διαστατο πινακα... :X

Δημοσ.
Αυτο σημαινει πως αν θελω ν-χαρακτηρων string χρειαζομαι ν-διαστατο πινακα... :X

Πάλι δύο διαστάσεων θα είναι ο πίνακας που χρειάζεσαι!

Δημοσ.

Xμμ με παιδευει η C γι'αυτο που θελω αλλα δεν το βαζω κατω :-D

Χεχε...

 

Σωστος ο τροπος σου migf1 αλλα επειδη ο πινακας που ηδη εχω ειναι ορισμενος μονοδιαστατος δεν με πειραζει να το περναω σε 2D αλλα ψαχνω κατι αλλο.

Δεν κατάλαβα τι εννοείς. Για γίνε πιο αναλυτικός.

 

Αυτο σημαινει πως αν θελω ν-χαρακτηρων string χρειαζομαι ν-διαστατο πινακα... :X

Αν εννοείς να έχεις string ν-χαρακτήρων σε κάθε θέση, 2Δ θα είναι πάλι... βάλε ν+1 αντί για 3 στον παραπάνω ορισμό. Αν πάλι εννοείς πως το ν θα είναι άγνωστο και μεταβλητό για κάθε string, τότε θες έναν πίνακα από δείκτες χαρακτήρων...

 

char *tmp2[] = { "---", "3243432", "dsa", "4324ff", NULL };

i = 0;
while ( tmp2[i] )
	puts( tmp2[i++] );

Δημοσ.

Δεν κατάλαβα τι εννοείς. Για γίνε πιο αναλυτικός.

 

Κανω διαφορα και καταληγω σε ενα τετοιο πινακα

char tmp[] = "ABCDEFGΗ"

Σκεψου οτι δεν ειναι ορισμενος ετσι απλα εχω καταληξει σε ενα τετοιο πινακα με n χαρακτηρες σε καθε θεση του. Θελω τωρα απο αυτον τον πινακα να παιρνω ανα 2 τους χαρακτηρες με καποιο τροπο ωστε να συνεχισω αυτο που κανω.

Δημοσ.

Κανω διαφορα και καταληγω σε ενα τετοιο πινακα

char tmp[] = "ABCDEFGΗ"

Σκεψου οτι δεν ειναι ορισμενος ετσι απλα εχω καταληξει σε ενα τετοιο πινακα με n χαρακτηρες σε καθε θεση του. Θελω τωρα απο αυτον τον πινακα να παιρνω ανα 2 τους χαρακτηρες με καποιο τροπο ωστε να συνεχισω αυτο που κανω.

Δεν το πιάνω ρε συ τι εννοείς όταν λες πως ο παραπάνω tmp[] πίνακας έχει ν χαρακτήρες σε κάθε θέση του. Εγώ τον βλέπω να έχει 8+1 θέσεις, όλες πιασμένες (με την ένατη θέση πιασμένη από το '\0').

Δημοσ.

Δεν το πιάνω ρε συ τι εννοείς όταν λες πως ο παραπάνω tmp[] πίνακας έχει ν χαρακτήρες σε κάθε θέση του. Εγώ τον βλέπω να έχει 8+1 θέσεις, όλες πιασμένες (με την ένατη θέση πιασμένη από το '\0').

 

E αυτος εχει 8 εστω οτι μετα απο πραξεις και παμπολλες πραξεις εχουμε καταληξει σε ενα μονοδιαστατο πινακα ν χαρακτηρων. απο εκει και επειτα πως συνεχιζω?

Δημοσ.

Κάτι τέτοιο ίσως;

 

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define QUIT_ON_1ST_NULL	1		/* true */

/**************************************************//**
 * 
 ******************************************************
 */
char **new_stepped(
	const char	*s,			/* string to be walked */
	int		step,			/* walking step */
	size_t		maxelems		/* max elements in the newly created stepped */
	)
{
	char **ret	= NULL;			/* newly created stepped to be returned */
	char *t		= NULL;			/* for walking s */
	size_t slen	= 0;			/* for length of s */
	int i = 0, j = 0;

	/* sanity checks */
	if ( step < 1 || maxelems < 1 )
		goto fail;

	/* alloc cleared mem for maxelems char pointers */
	ret = calloc( maxelems, sizeof(char *) );
	if ( NULL == ret )
		goto fail;

	t = (char *)s;				/* initially t points to s */
	slen = strlen(s);			/* get length of s */

	/* foreach char pointer ret[i] and until t points inside s... */
	for (i=0; t < s+slen && i < maxelems; i++)
	{
		ret[i] = calloc( step+1, sizeof(char) );/* alloc cleared mem for step+1 chars */
		if ( NULL == *ret )
			goto cleanup_and_fail;

		strncpy( ret[i], t, step );		/* copy up to step chars of t into *ret */
		t += step;				/* move t step places forward */
	}

	return ret;

cleanup_and_fail:
	for (j=i-1; j > -1; j--)
		free( ret[j] );
	free( ret );
fail:
	fprintf( stderr, "*** %s(): failed to create the string table!\n", __func__ );
	return NULL;

}

/**************************************************//**
 *
 ******************************************************
 */
int stepped_free(
	char	***stepped,	/* passed by ref (defined as **stepped in the caller) */
	size_t	maxelems	/* maximum elements to be freed (programmer's resposnibility) */
	)
{
	size_t i = 0;

	/* sanity checks */
	if ( maxelems < 1 ) {
		fprintf( stderr, "*** %s(): failed to free the string table (invalid maxelems)", __func__);
		return 0;	/* false */
	}

	/* nothing to free (no memory leaks possible, so we return true) */
	if ( !stepped || !(*stepped) )
		return 1;	/* true */

	/* free each element, then set the main pointer to NULL */
	for (i=0; i < maxelems; i++)
		if ( (*stepped)[i] )
			free( (*stepped)[i] );

	*stepped = NULL;

	return 1;		/* true */
}

/**************************************************//**
 *
 ******************************************************
 */
void stepped_print(
	char 	**stepped,		/* stepped to be printed */
	size_t	maxelems,		/* max elems to print (programmer's resposnibility) */
	int 	quitOn1stNull		/* pass as 0 for printing NULL elements too */
	)
{
	int i = 0;

	/* sanity checks */
	if ( maxelems < 1 ) {
		fprintf( stderr, "*** %s(): invalid maxelems\n", __func__);
		return;
	}

	if ( NULL == stepped ) {
		fprintf( stderr, "*** %s(): NULL pointer as argument\n", __func__);
		return;
	}

	/* print elements, one per line */
	for (i=0; i < maxelems; i++)
	{
		/* print nonNULL element */
		if ( stepped[i] ) {
			puts( stepped[i] );
			continue;
		}

		/* stop on 1st NULL element? */
		/* yes */
		if ( quitOn1stNull )
			break;
		/* no */
		puts( "<NULL>" );
	}

	return;
}

/**************************************************//**
 *
 ******************************************************
 */
int main( void )
{
	const int MaxElems	= 10;
	const int Step		= 2;

	char *s = "1234567890";
	char **stepped = new_stepped( s, Step, MaxElems );

	stepped_print( stepped, MaxElems, !QUIT_ON_1ST_NULL );
	stepped_free( &stepped, MaxElems );

	system("pause");	/* windows only */
	exit(0);
}

 

Έξοδος:

12
34
56
78
90
<NULL>
<NULL>
<NULL>
<NULL>
<NULL>
Press any key to continue . . .
Αν θες να σταματάει το τύπωμα πριν 1ο NULL στοιχείο, βγάλε το θαυμαστικό μπροστά από τo όρισμα QUIT_ON_1ST_NULL στην κλήση της stepped_print().

 

ΥΓ. Μπορεί να έχει bugs ο κώδικας, δεν τον έχω δοκιμάσει εξαντλητικά.

Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.

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