n° 197
Maggio/Giugno 2015
Maggio 25, 2015, 09:23:21 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  



* Messaggi recenti
Messaggi recenti
Pagine: [1] 2 3 ... 10
 1 
 inserita:: Oggi alle 07:01:33  
Aperta da ps3love - Ultimo messaggio da ps3love
Hai verificato se l'app supporta la versione 5 di Android?

Potrebbe essere un bug così come potrebbe (uso il condizionale) essere necessario un aggiornamento per far girare l'app su Android 5.x.

Prova a contattare l'autore alla mail a pagina 37.



Come faccio a verificare se l'app supporta la versione 5 di Android?

 2 
 inserita:: Oggi alle 02:39:56  
Aperta da ps3love - Ultimo messaggio da michele.p
Hai verificato se l'app supporta la versione 5 di Android?

Potrebbe essere un bug così come potrebbe (uso il condizionale) essere necessario un aggiornamento per far girare l'app su Android 5.x.

Prova a contattare l'autore alla mail a pagina 37.


 3 
 inserita:: Oggi alle 11:00:59  
Aperta da ps3love - Ultimo messaggio da ps3love
Buon giorno, ho aggiornato il mio samsung s4 alla versione 5.0.1 Lollipop e ho notato che il programma pizzeria 3.0 nel modulo che si invia un email per la prenotazione cliccando sulla data facendo doppio click esce un menu per selezionare in modo veloce la data dopo questa operazione il programma va in crash,cosa che non accadeva con android 4.4.2 come mai ?
Cordiali Saluti

 4 
 inserita:: Maggio 24, 2015, 11:55:40  
Aperta da capcla - Ultimo messaggio da capcla
Ho appena verificato una cosa:
Se decommento riga 19
Codice:
Confronti conf;

posso modificare le righe 34 e 41 e renderle rispettivamente
Codice:
       
conf.selectionSort(a, arraySize, conf.ascending);
e
Codice:
conf.selectionSort(a, arraySize, conf.descending);

e il programma va tranquillamente. A questo punto chiedo: quando è il caso che dichiari una funzione statica?

 5 
 inserita:: Maggio 24, 2015, 10:43:11  
Aperta da capcla - Ultimo messaggio da Roberto Allegra
Per la stessa ragione per cui non usi una bottiglia come portachiavi: tecnicamente funziona, ma è una complessità/ingombro inutile. A differenza di Java/C#, in C++ non è necessario che tutto sia in una classe. Pensa agli algoritmi STL, ad esempio: semplici funzioni (template).

E soprattutto: visto che ancora non sei molto esperto in C++ e fai fatica a referenziare le funzioni membro e a dichiararle statiche, direi che è sempre valido il monito di John Carmack (il papà di Doom e Quake):

“Sometimes, the elegant implementation is just a function. Not a method. Not a class. Not a framework. Just a function.” – John Carmack

 6 
 inserita:: Maggio 23, 2015, 01:29:30  
Aperta da M.A.W. 1968 - Ultimo messaggio da M.A.W. 1968
Dedicato alla simpatica studentessa che da qualche giorno sta ingolfando la mia email con farraginose carrettate di codice e richieste di aiuto urgente, e prolegomeni per ogni suo/a futuro/a emulo/a.

1) In questa bottega non si svolgono compiti per conto terzi né si erogano interi corsi di formazione.

2) E' fatto divieto di usare PM ed email per richieste "private" di natura tecnica.

3) Nessuna istanza vera o presunta di "urgenza" può essere presa in considerazione. Utenti e moderatori partecipano al forum unicamente quando ne hanno il tempo e la possibilità.

Detto questo, ed escludendo a priori il caso da manuale che la giovane studentessa si sia invaghita del canuto practitioner e formatore (per ovvi motivi anagrafici, c'è una elevatissima probabilità che all'epoca io sia uscito con tua madre o tua zia, se non con tua nonna, ragazza mia: e qui non siamo sul set di un improbabile remake di "Vizi di famiglia"...  Ghigno), aggiungerei che inviare in privato a più riprese 1300 LOC in C mal commentate e formattate peggio è un ottimo metodo per non fare prendere in considerazione la propria richiesta neppure dai più motivati.
Anche perché gestire un albero binario è un compito banale, e farlo tramite un array è decisamente puerile, come nell'esempio didattico che segue.

Codice:
/***********************************************************
  *
  *   Program:    Prefixcode.c
  *   Created:    23/05/2015
  *   Author:     M.A.W. 1968
  *   Comments:   Esempio di gestione btree tramite array.
  *               L'applicazione fittizia scelta per illustrare
  *               tale utilizzo consiste nella generazione
  *               di un semplice codice prefix-free o "istantaneo",
  *               ovviamente non ottimale (vedi Huffman).
  *               Si tratta, con ogni evidenza, di un semplice
  *               pretesto didattico.
  *
  ************************************************************/

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

/* L'esempio lavora con un array di char => DEPTH non deve superare il valore 9 */
#define DEPTH 6

const size_t DeBruijnBitPos[32] = { 0,  1, 28,  2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17,  4, 8,
                                                    31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18,  6, 11,  5, 10, 9};


void PrintBin(const size_t n, const size_t val)
{
    size_t mask;

    for (mask = 1 << (n -1); mask > 0; mask >>= 1)
    {
       printf("%c", (val & mask ? '1' : '0'));
    }
}

char LeftmostBit(size_t n)
{
    /*
    ** Si apprezzi la raffinatezza della soluzione, parzialmente
    ** contemplata in "Hackers' Delight": si riduce il valore unsigned
    ** alla potenza del due immediatamente inferiore,
    ** per poter poi usare la decodifica moltiplicativa di De Bruijn
    ** ottenendo quindi l'esponente di tale potenza, ossia in
    ** definitiva la posizione del bit più significativo.
    ** Le CPU mainstream Intel e AMD possiedono istruzioni
    ** specifiche, a partire da 80386, per la ricerca del bit piu'
    ** significativo o equivalentemente per il conteggio dei trailing
    ** zeros, ma il valore didattico di questo esempio rimane enorme.
    */

    n |= (n >>  1);
    n |= (n >>  2);
    n |= (n >>  4);
    n |= (n >>  8);
    n |= (n >> 16);
    n ^= (n >> 1);

    return DeBruijnBitPos[(size_t)(n * 0x077CB531U) >> 27];
}

/* L'uso delle seguenti tre funzioni ha valore unicamente didattico. */
size_t GetParent(size_t id)
{
    return ((--id) >> 1);
}

size_t GetLeft(size_t id)
{
    return ((id << 1) +1);
}

size_t GetRight(size_t id)
{
    return ((++id) << 1);
}

int main()
{
    char *Tree;
    size_t i, j;
    size_t k = 1;

    Tree = (char *)malloc(1 << DEPTH);
    if (NULL == Tree)
    {
        fprintf(stderr, "Errore di allocazione!\n");
        return EXIT_FAILURE;
    }

    /*
    ** Il nodo radice nell'albero binario dei prefissi risulta
    ** di fatto inutilizzato.
    */
    Tree[0] = 0xFF;

    /* Popolazione dell'albero. Se ne noti l'eleganza estrema. */
    for (i = 1; i < DEPTH; ++i)
    {
        for (j = 0; j < (size_t)(1 << i); ++j)
        {
            Tree[k + j] = (char)j;
        }
        k += j;
    }

    /*
    ** Il banalissimo algoritmo (usato unicamente a scopi dimostrativi)
    ** parte dalla foglia piu' a sinistra e risale lungo l'albero
    ** fino al livello 1, selezionando il codice ivi presente.
    ** Quindi procede con una visita iterativa al sottoalbero di destra,
    ** fino a giungere ad un'altra foglia. Seleziona quindi la foglia adiacente
    ** a destra, itera l'operazione fermandosi al livello 2, e cosi' via.
    */
    k = (1 << (DEPTH -1)) -1;
    for (i = 1; i < DEPTH; ++i)
    {
        size_t level = DEPTH -1;

        /* Una semplice euristica per il passo finale di selezione. */
        if (i == level)
        {
            k = GetParent(k);
        }

#ifdef DEBUG
        printf(">> i = %d, Level = %d, idx = %d\n", i, level, k);
#endif
        /* Si risale dalla foglia al nodo di livello i-esimo */
        while (level > i)
        {
            k = GetParent(k);
            --level;
#ifdef DEBUG
            printf(">> i = %d, Level = %d, idx = %d\n", i, level, k);
#endif
        }

        /* Si seleziona il codice. Qui ci si limita ad inviarlo in output. */
        printf("Code[%d] = [", i-1);
        /*
        ** La lunghezza del codice risulta direttamente proporzionale al livello
        ** del nodo considerato. Sarebbe sufficiente scrivere:
        ** PrintBin(level, Tree[k]);
        ** A scopi puramente didattici, qui si fa uso della funzione LeftmostBit()
        ** per ottenere il logaritmo discreto in base due. Tale funzione puo'
        ** essere specificamente ottimizzata su talune piattaforme, usando
        ** particolari builtins del compilatore.
        */
        PrintBin(LeftmostBit(k+1), Tree[k]);
        puts("]");

        /*
        ** Si escludono tutti gli altri codici a valle di quello selezionato,
        ** in modo da garantire per costruzione la creazione di un codice istantaneo.
        */
        while (level < (DEPTH -1))
        {
            k = GetRight(k);
            ++level;
#ifdef DEBUG
            printf(">> i = %d, Level = %d, idx = %d\n", i, level, k);
#endif
        }

#ifdef DEBUG
        puts("******************************");
#endif

        /* Si seleziona la foglia adiacente a destra. Facilissimo con un array! */
        ++k;
    }

    free(Tree);
    return EXIT_SUCCESS;
}
/* EOF: prefixcode.c */


Per chi ha bisogno dei sottotitoli, l'applicazione è del tutto fittizia e pretestuosa: un simile schema di generazione del codice si risolve deterministicamente aggiungendo iterativamente simboli '1' a sinistra del primo codice '0' di lunghezza unitaria, a meno della variazione velleitariamente introdotta con una euristica ad hoc per forzare la scelta dell'ultimo codice, limitandone la lunghezza. Tra l'altro si tratta di un "algoritmo" normalmente usato nelle dimostrazioni, come ad esempio in quelle più elementari del teorema di Kraft-McMillan citato appunto nel titolo, previa ovvia dimostrazione che ad ogni passo esiste almeno una foglia disponibile nell'albero.  Ghigno

 7 
 inserita:: Maggio 22, 2015, 03:20:18  
Aperta da capcla - Ultimo messaggio da capcla
Ok, ora va bene. Ti ringrazio.
Ma ora ti chiedo: perché dovrei agire così? Cosa non va nella mia soluzione? è solo un problema di visilità?

 8 
 inserita:: Maggio 22, 2015, 03:13:23  
Aperta da capcla - Ultimo messaggio da Roberto Allegra
Confronti è una classe, pertanto non puoi invocarne i metodi senza istanziare un oggetto.
Il compilatore ti suggerisce indirettamente di trasformare tutti i membri della classe Confronti in statici, così:

Codice:
class Confronti {
public:
    static void selectionSort(int [], const int, bool (*)(int, int));
    static void swap(int * const, int * const);
    static bool ascending(int, int); // implements ascending order
    static bool descending(int, int); // implements descending order
private:
   
};

Questo dovrebbe risolvere tutti i tuoi problemi (se ti ricordi di sostituire anche ascending con Confronti::ascending, e descending con Confronti::descending).

Ma resta il fatto che la classe Confronti è inutile. Il C++ è un linguaggio multiparadigma: a differenza di Java, C# e compagnia, non ti obbliga necessariamente a creare classi.

Questo è un tipico caso in cui le funzioni possono stare tranquillamente a livello globale, magari dentro un namespace.

 9 
 inserita:: Maggio 22, 2015, 02:59:26  
Aperta da capcla - Ultimo messaggio da capcla
Ho provato a fare una doppia cosa. Visto che l'errore era lo stesso in riga 34, e in riga 41, ho provato ad adottare due soluzioni diverse:

Riga 34
Codice:
Confronti::selectionSort(a, arraySize, Confronti::ascending);

Riga 41
Codice:
Confronti::selectionSort(a, arraySize, descending);

Il risultato è il seguente
Codice:
main.cpp:34: error: invalid use of non-static member function 'bool Confronti::ascending(int, int)'
main.cpp:41: error: 'descending' was not declared in this scope

 10 
 inserita:: Maggio 22, 2015, 02:23:44  
Aperta da capcla - Ultimo messaggio da michele.p
Devi comunque accedere ai membri della classe perché stai adottando la tipica modalità di separare l'interfaccia dall'implementazione.

Pagine: [1] 2 3 ... 10
2: include(/mnt/host/www/ioprogrammo/footer.htm) [<a href='function.include'>function.include</a>]: failed to open stream: No such file or directory
File: D:\StorageVM\malphas\www\ioprogrammo\Themes\ioprogrammo\Recent.template.php (main_below sub template - eval?)
Riga: 800