Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta
Google ha appena rinnovato la sua celebre serie A con il Pixel 10a, lo smartphone della serie più conveniente se consideriamo il rapporto tra costo e prestazioni. Con il chip Tensor G4, un design raffinato soprattutto sul retro e l'integrazione profonda di Gemini, il colosso di Mountain View promette un'esperienza premium a un prezzo accessibile. E il retro non ha nessuno scalino
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026
Al MWC Qualcomm annuncia una coalizione industriale per lanciare il 6G entro il 2029 e introduce agenti IA per la gestione autonoma della RAN. Ericsson, presente sul palco, conferma la direzione: le reti del futuro saranno IA-native fin dalla progettazione
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso
CHUWI CoreBook Air è un ultraleggero da 1 kg con Ryzen 5 6600H, display 14" 16:10 e 16 GB LPDDR5. Offre buona portabilità, autonomia discreta e costruzione in alluminio, ma storage PCIe 3.0 e RAM saldata limitano l'espandibilità. A 549 euro sfida brand più noti nella stessa fascia di mercato.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-02-2015, 10:51   #1
Peppyno89
Junior Member
 
Iscritto dal: Jan 2015
Messaggi: 7
[C] Spiegazione porzione di codice

Salve a tutti, avrei bisogno di una lucidazione su questa porzione di codice:

Codice:
 do
    {
        chiave = strstr(&testo[i], sottostringa1);
        if(chiave != 0)
        {
            occorrenze[j] = (int)(chiave - &testo[0]);
            j++;
            i = (int)(chiave - &testo[0] + NS1);
        }
    } while (i < Ntesto && chiave != 0);
La funzione cerca una sottostringa all'interno di una stringa. Con la funzione strstr() so che si cerca la prima occorrenza di una pattern all'interno di un testo ma non ho capito bene cosa ritorna!
Ho letto che ritorna la porzione di testo, inizializzandola dalla posizione dell'occorrenza trovata... Se pure avessi capito bene, cmq restano dubbi su quello che poi avviene dopo

GRAZIE!!!

ps. NS1è la dimensione della sottostringa
Peppyno89 è offline   Rispondi citando il messaggio o parte di esso
Old 09-02-2015, 11:47   #2
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
strstr() ritorna il puntatore alla sottostringa trovata, se appunto viene trovata; altrimenti ritorna NULL (i.e. 0 nel tuo codice).

Si suppone che la variabile i sia inizializzata, anche se qui l'inizializzazione non c'e'. La variabile i va inizializzata all'indice di partenza della ricerca: se vuoi ricercare lungo tutta la stringa, deve essere messo a zero.
Ovviamente chiave e' di tipo char *.
occorrenze e' un vettore di interi, dove vengono memorizzati gli indici delle sottostringhe trovate. Immagino quindi che anche j sia inizializzato a 0 e che "occorrenze" sia grande a sufficienza, perche' questo codice non controlla assolutamente se c'e' abbastanza spazio per memorizzare.

Codice:
 do
    {
        // Cerca la prossima occorrenza di sottostringa1 a partire dall'indice i
        chiave = strstr(&testo[i], sottostringa1);
        if(chiave != 0)   // Se ho trovato qualcosa
        {
             // Siccome chiave e' il puntatore all'inizio delle stringa trovata
             // all'interno del testo e testo e' il puntatore al primo elemento,
             // la loro differenza da' ovviamente l'indice di partenza dell'elemento
             // trovato.
            occorrenze[j] = (int)(chiave - &testo[0]);
            // NOTA - questa e' ovviamente equivalente a:
            occorrenze[j] = (int)(chiave - testo);
            // ma scritta cosi' e' troppo semplice, quindi si corre il rischio che sia
            // comprensibile. Meglio complicare le cose. ;)

            j++;  // Passa al prossimo elemento di occorrenze, dove mettere
                    // il prossimo valore

            i = (int)(chiave - &testo[0] + NS1);  // Siccome ho gia' trovato questo elemento, il punto di partenza viene spostato avanti per la ricerca successiva.
           // Anche in questo caso avrebbe potuto scrivere:
           i = (int)(chiave - testo + NS1);
           // oppure
           i = occorrenze[j-1]  + NS1; // magari se la si sposta prima di j++ si evita il -1
           
        }
    } while (i < Ntesto && chiave != 0); // Ripete fino a quando non arriviamo a fine testo o quando non e' piu' trovato nulla
NOTA - nel testo e' scritto &testo[0] per avere l'indirizzo del primo elemento della stringa. Siccome la stringa in C e' definita come puntatore al primo elemento dell'area di memoria, questa e' equivalente a testo.

Vista la proprieta' commutativa dell'addizione (siamo in un gruppo abeliano, quindi a + b = b + a) e sapendo che l'indicizzazione viene risolta con un'addizione, e' chiaro che

testo[0] == testo + 0
per la proprieta' commutativa:
testo + 0 = 0 + testo, quindi ritraducendolo:
0[testo] = testo[0].
Ovviamente 0 e' uno scalare, ma posso sempre farne il cast:

((char *)0)[testo], quindi prenderne l'indirizzo e metterlo nel codice:

Codice:
            occorrenze[j] = (int)(chiave - &((char *)0)[testo]);
Ad un'occhiata veloce, un possibile manutentore del codice sara' perplesso, quindi puo' andar bene

Scherzavo. Tutto questo per dire che si, il codice va bene ma certi giochi con i puntatori e' sempre meglio evitarli, se non sono strettamente necessari
__________________
In God we trust; all others bring data

Ultima modifica di sottovento : 09-02-2015 alle 11:57.
sottovento è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta Recensione Google Pixel 10a, si migliora poco ma...
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026 6G, da rete che trasporta dati a rete intelligen...
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso CHUWI CoreBook Air alla prova: design premium, b...
Roborock Saros 20: il robot preciso e molto sottile Roborock Saros 20: il robot preciso e molto sott...
ASUS ROG Kithara: quando HIFIMAN incontra il gaming con driver planari da 100mm ASUS ROG Kithara: quando HIFIMAN incontra il gam...
Rocket Lab ha posticipato il lancio del ...
Dalla missione Artemis IV il razzo spazi...
Una delle sonde europee di ESA Proba-3 h...
Un modder fa girare Linux su PS5: GTA V ...
MacBook Neo: nessuna sorpresa nei primi ...
La serie POCO X8 Pro è pronta al ...
Smartphone: 2026 difficile per il mercat...
Star Wars: Knights of the Old Republic R...
Huang, NVIDIA: OpenClaw ha realizzato in...
Annunciano il recupero di 4,8 milioni di...
Oggi degli ottimi auricolari Sony con ca...
Muffa in casa? Questo deumidificatore da...
Sonos Era 100: il punto d'ingresso per u...
"Non stiamo sostituendo nessuno con...
Tutti i robot in offerta ora: prezzi bas...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 23:22.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v