Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505

    C - convertire stringa in una struct

    salve, ho questa struct contentente una stringa :

    codice:
    struct msg {
    	char mex[11];
    };
    contenente (non domandatemi il perchè) solo numeri.

    avrei la necessità di convertire tale stringa in un numero.

    quindi ora faccio il modulo della mia stringa apparentemente convertita in int tramite atoi:
    codice:
    struct msg mess;
    valuediv=atoi(mess.mex)%2;
    ma non funziona o_O

    dove sbaglio?
    scusate ma è anni che non prendo in mano il C non mi ricordo più alcune cosette...

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Fino alla atoi ci sono ... ma perchè fai il modulo ?

    E quando dici "non funziona", puoi farci un esempio per capire?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3

    Re: C - convertire stringa in una struct

    Originariamente inviato da markzzz

    codice:
    struct msg mess;
    valuediv=atoi(mess.mex)%2;
    ma non funziona o_O
    Ma è davvero quello l'ordine degli statement oppure hai saltato qualche pezzo? Perchè lì utilizzi la struttura senza aver dato nessun valore a mex

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505
    bhè, dentro a mess.mex c'è una sequenza di 10 numeri che arrivano da un thread.

    il thread 1 crea delle stringhe e le invia al thread 2 utilizzando semafori privati.
    il codice completo è questo :
    codice:
    #include <string.h>
    #include <time.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <pthread.h>
    #include <semaphore.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    #define N 5
    
    // dichiarazione var accesso al device (static)
    static int devr;
    
    struct msg {
    	char mex[11];
    };
    
    struct buffer {
    	struct msg messages[N];
    	
    	sem_t m;
    	sem_t priv_read;
    	sem_t priv_write;	
    	
    	int count;
    	int head;
    	int tail;
    	int readers;
    	int writers;
    	int blocked_writers;
    	int blocked_readers;	
    };
    
    struct buffer *buffer_init(void) {
    	struct buffer *b;
    
    	b = malloc(sizeof(struct buffer));
    	if (b == NULL) {
    		return b;
    	}
    	
    	b->head=0;
    	b->tail=0;
    	b->count=0;
    	b->readers = 0;
    	b->writers = 0;
    	b->blocked_readers = 0;
    	b->blocked_writers = 0;	
    
    	sem_init(&b->priv_write, 0, 0);
    	sem_init(&b->priv_read, 0, 0);
    	sem_init(&b->m, 0, 1);	
    	
    	return b;
    }
    
    void buffer_get_read(struct buffer *b, struct msg *str) {
    	// mutua esclusione
    	printf("read1\n");
    	sem_wait(&b->m);
    
    	// se non c'è nulla da leggere mi blocco sul semaforo privato
    	while (b->count==0) {
    		printf("read2\n");
    		b->blocked_readers++;
    		// libero il mutex (per eventuali altri processi che vogliono leggere/scrivere)
    		sem_post(&b->m);
    		printf("read3\n");
    		// blocco sul semaforo privato
    		sem_wait(&b->priv_read);
    		printf("read4\n");
    		b->blocked_readers--;
    	}
    	printf("read5\n");
    	
    	// aumento numero lettori
    	b->readers++;
    	
    	// leggo il messaggio nell'area condivisa
    	memcpy(str, &b->messages[b->head], sizeof(struct msg));
    	
    	// decremento testa e count
    	b->head = (b->head + 1) % N;
    	b->count = b->count - 1;
    
    	// dormo per un pò (per far notare la ricezione)
    	usleep(500000);
    	
    	sem_post(&b->m);
    }
    
    void buffer_put_read(struct buffer *b) {
    	// mutua esclusione
    	printf("R1\n");
    	sem_wait(&b->m);
    
    	// decremento numero di lettori (stò abbandonando la lettura)
    	b->readers--;
    	
    	// se ci sono scrittori bloccati e non ci sono lettori risveglio gli scrittori bloccati
    	if (b->blocked_writers && ! b->readers) {
    		printf("R2\n");
    		sem_post(&b->priv_write);
    	} else {
    		printf("R3\n");
    		sem_post(&b->m);
    	}
    }
    
    void buffer_get_write(struct buffer *b, struct msg *str) {
    	// mutua esclusione
    	printf("write1\n");
    	sem_wait(&b->m);
    
    	// se la coda è piena devo bloccarmi
    	while (b->count==N) {
    		printf("write2\n");
    		b->blocked_writers++;
    		// libero il mutex (per eventuali altri processi che vogliono leggere/scrivere)
    		sem_post(&b->m);
    		printf("write3\n");
    		// mi blocco sul semaforo privato
    		sem_wait(&b->priv_write);
    		printf("write4\n");
    		b->blocked_writers--;
    	}
    	printf("write5\n");
    	
    	// aumento numero scrittori
    	b->writers++;
    	
    	// scrivo il messaggio nell'area condivisa
    	memcpy(&b->messages[b->tail], str, sizeof(struct msg));
    	
    	// incremento la coda e il count
    	b->tail = (b->tail + 1) % N;
    	b->count = b->count + 1;
    	
    	// dormo per un pò (per far notare l'invio)
    	usleep(500000);	
    	
    	sem_post(&b->m);
    }
    
    void buffer_put_write(struct buffer *b) {
    	// mutua esclusione
    	printf("W1\n");
    	sem_wait(&b->m);
    
    	// decremento numero di scrittori (stò abbandonando la scrittura)
    	b->writers--;
    	
    	// se ci sono lettori bloccati li sblocco
    	if (b->blocked_readers) {
    		printf("W2\n");
    		sem_post(&b->priv_read);
    	// se ci sono scrittori bloccati li sblocco
    	} else if (b->blocked_writers) {
    		printf("W3\n");
    		sem_post(&b->priv_write);
    	} else {
    		printf("W4\n");
    		sem_post(&b->m);
    	}
    }
    
    // dichiarazione di alcune var
    struct buffer *b, *q;
    int passo=1;
    
    // thread 1 : aspetta i dati dal device 1 e li manda al thread 2
    void *th1_get(void *v) {
    	struct msg mess;
    	int j;
    	
    	char message[40];
    	int i=1,cs=0;
    	
    	for (i=0; i<10; i++) {
    		for (j=0; j<10; j++) {
    			if(j==90) {
    				mess.mex[j]='a';
    			} else {
    				sprintf(&mess.mex[j], "%c", 48+i);
    			}			
    		}
    		
    		buffer_get_write(b, &mess);
    		cs++;
    		printf("%d - T1 - Stringa n.%d inviata : %s\n", passo++, cs, mess.mex);
    		buffer_put_write(b);		
    
    	}	
    	
    	sprintf(mess.mex, "%s", "end_of_tr1");
    	buffer_get_write(b, &mess);
    	buffer_put_write(b);	
    
    	return NULL;
    }
    
    // thread 2 : riceve i dati dal thread 1, li elabora e li manda al thread 3
    void *th2_order(void *v)  {
    	struct msg mess;
    	int str_conv;
    	
    	int i, valuediv, cs=0;
    	i=1;	
    	
    	while(i==1) {
    		buffer_get_read(b, &mess);
    		buffer_put_read(b);
    		if(strncmp(mess.mex, "end_of_tr1", 10)==0) {
    			i=2;
    		} else {
    			//str_conv=atoi(mess.mex);
    			
    			valuediv=atoi(mess.mex)%2;
    			printf("valuediv : %d - %d\n", valuediv, atoi(mess.mex));			
    			buffer_get_write(q, &mess);
    			cs++;
    			printf("%d - T2 - Stringa n.%d ricevuta e inviata : %s\n", passo++, cs, mess.mex);			
    			buffer_put_write(q);
    		}
    	}
    	
    	//sprintf(mess.mex, "%s", "end_of_tr2");
    	//buffer_get_write(q, &mess);
    	//buffer_put_write(q);		
    	
    	return NULL;
    }
    però ho i miei dubbi che abbiate voglia di leggerlo tutto heheh!
    mess.mex contiene, per esempio, 0000000000 il primo giro, 1111111111 il secondo... ecc ecc

    voglio fare il modulo perchè dovrò gestire se quel determinato numero è pari o dispari.

    quando dico che non funziona intendo che al primo passo atoi(mess) è effettivamente 0000000000, poi è sempre 2147483647.

  5. #5
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    se nn sbaglio atoi si ferma allo 0 (nn 48) e al primo carattere che nn sia numero o molto simile.
    Per gli Spartani e Sparta usa spartan Il mio github

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505
    eh ma ci son solo numeri dentro le mie stringhe...

  7. #7
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Dal punto di vista della programmazione sn tutti numeri dipende da che numeri hai.
    Per gli Spartani e Sparta usa spartan Il mio github

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Prova a visualizzarle queste stringhe (come stringhe) e vediamo cosa c'e' dentro ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505
    allora, facendo :
    codice:
    printf("Stringa : %s - Conversione : %d\n", mess.mex, atoi(mess.mex));
    l'output è questo :
    Stringa : 0000000000 - Conversione : 0
    Stringa : 1111111111 - Conversione : 1111111111
    Stringa : 2222222222 - Conversione : 2147483647
    Stringa : 3333333333 - Conversione : 2147483647
    Stringa : 4444444444 - Conversione : 2147483647

  10. #10
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Se nn sbaglio superi il limite del integer. Non dovresti avre problemi su 64bits linux, usi quello?
    Per gli Spartani e Sparta usa spartan Il mio github

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.