Pagina 1 di 1

Algoritmi concatenazione stringhe

MessaggioInviato: 19 gen 2011, 09:17
di `knives`
Quali algoritmi conoscete per concatenare 2 stringhe?

il prototipo della funzione che devo scrivere è del tipo

Codice: Seleziona tutto
BYTE * StrConCat(BYTE *s1,BYTE *s2)
{
      byte * puntatoreFineS1;
     puntatoreFineS1=s1;
    MENTRE(puntatorefineS1 != 0)
   allora : puntatoreFineS1 = puntatoreFineS1+1;
   *puntatoreFineS1=*s2;
   RITORNA s1;
}


oltre a BYTE * e la sintassi base, non posso usare nessuna funzione piu ad alto livello, sto lavorando su arm con linguaccio C ridotto.

potete aiutarmi?
Grazie ;)

Re: Algoritmi concatenazione stringhe

MessaggioInviato: 19 gen 2011, 16:32
di thrantir
mamma mia lo pseudo codice in italiano ha un che di agghiacciante...

se puoi usare solo i costrutti piu' semplici non credo che ci siano molte possiblita'... di quello che hai scritto non mi torna la guardia, che dovrebbe essere testare quando finisce s2, non s1, e manca l'incremento del puntatore alla posizione corrente di s2

Re: Algoritmi concatenazione stringhe

MessaggioInviato: 20 gen 2011, 08:06
di `knives`
si in effetti non è il massimo come l ho scritto :mrgreen:

eheh ela fretta.. cmq poi ieri ho scritto questo :
Codice: Seleziona tutto
BYTE * strcat(BYTE *PtrCmd, BYTE *PtrParam)
   BYTE *PtrRslt;      //indirizzo della stringa completa
    BYTE *PtrEndCmd;    //indirizzo della fine stringa comando
   
       PtrEndCmd=PtrCmd;       
       while(*PtrEndCmd++ != '\0') continue;       
       while((*PtrEndCmd++ = *PtrParam++) != '\0')              //(*PtrParam++!='\0')
       {
            //PtrEndCmd=PtrParam;
            CMON_WrString (GSM_UART_PORT, 0,PtrEndCmd);
           // PtrEndCmd++;
       }

      *PtrEndCmd=0x00;
       PtrRslt = PtrCmd;
       CMON_WrString (GSM_UART_PORT, 0,PtrRslt);
       return PtrRslt; 


ma devo ricontrollare la fine della stringa perchè il secondo while non si ferma al posto giusto.

PtrCmd punta ad un array di byte di 200
PtrParam invece il puntatore ad un paramentro che essenzialmente è una stringa che puo essere inserita direttamente nello stack oppure pescata da una sd o dalla e^2.
alla fine concateno tutte e due le stringhe nell'array da 200byte.

Re: Algoritmi concatenazione stringhe

MessaggioInviato: 20 gen 2011, 11:08
di thrantir
intanto io farei
Codice: Seleziona tutto
BYTE * strcat(BYTE *PtrCmd, BYTE *PtrParam) {
    BYTE *PtrRslt = PtrCmd;      //indirizzo della stringa completa
   
    while(*PtrCmd++ != '\0') continue;       
    while((*PtrCmd++ = *PtrParam++) != '\0')              //(*PtrParam++!='\0')
    {
         CMON_WrString (GSM_UART_PORT, 0,PtrCmd);
    }

    CMON_WrString (GSM_UART_PORT, 0,PtrRslt);
    return PtrRslt;
}


cioe' assegnare subito al risultato il suo valore (tanto lo fai comunque dopo il loop) e usare direttamente il parametro per iterare
la guardia del primo while non mi torna, credo che il puntatore si posizioni troppo avanti, perche' con l'incremento postfisso viene restituito il valore puntato prima dell'incremento, quindi quando la condizione e' vera l'elemento pari a '\0' e' quello precedente, mentre quella del secondo dovrebbe tornare

Re: Algoritmi concatenazione stringhe

MessaggioInviato: 20 gen 2011, 11:32
di `knives`
dimenticavo di aggiungere che questa:
CMON_WrString (GSM_UART_PORT, 0,PtrCmd);
non fa niente di che, cioè serve solo a me per reindirizzare qualcosa sulla porta com, siccome la scheda su cui sto lavorando non ha ne un display ne altro per sapere che fa la uso per monitorare il bus tramite hyperterminal.

ma il fine stringa uguale a 0 lo mette sempre il compilatore? perchè io infatti per sicurezza lo forzavo come avrai notato.
in effetti la tua osservazione sulla prima guardia potrebbe essere giusta.
il problema di questa applicazione è che una volta buttata sulla scheda non ho modo di eseguire un debug e quindi non riesco mai ad essere sicuro di quello che si sta eseguendo.

Re: Algoritmi concatenazione stringhe

MessaggioInviato: 20 gen 2011, 12:06
di thrantir
lo standard non dice niente sul terminatore di stringa, e non e' che lo metta il compilatore, che non puo' sapere quando finisce una stringa. Quello che fanno molti compilatori e' "imbiancare" le aree di memoria mettendo 0 in tutti i bytes, spesso lo fanno solo se si copmila con opzioni di debug, pero' siccome non puoi esserne sicuro dovresti fare allocare con calloc oppure pulire tutto con la memset, cosi' sei sicuro che tutto cio' che non hai scritto tu esplicitamente sia un '/0', in particolare quando la stringa finisce ci sara' il terminatore