Array char Troppo grande

di il
15 risposte

Array char Troppo grande

Salve a tutti e come al solito vi ringrazio per tutte le informazioni che riusciro' a reperire.

Ho un problema con un array di caratteri char data[100];
Fondamentalmente il problema e che quando compilo esce errore not enough RAM for all Variables.
Ho letto in giro che va dichiarato fuori dal main per ovviare al problema, l ho fatto ma con scarsi risultati.

C'e' qualche modo per ovviare a questo problema?

Posto il codice per aiutarvi a Capire.

Grazie per la disponibilita'.

#include <main.h>
#include <string.h>
void main()
{
while(TRUE)
{
delay_ms(DELAY);
printf("INVIAMI IL TUO SERIALE\n\r");
char data[100];
char seriale [20];
CHAR OK [20];
gets(data);//riceve i caratteri fino al carattere invio
OK="HN01767436M";
//ESTRAPOLO seriale
seriale [0]=data[18];
seriale [1]=data[19];
seriale [2]=data[20];
seriale [3]=data[21];
seriale [4]=data[22];
seriale [5]=data[23];
seriale [6]=data[24];
seriale [7]=data[25];
seriale [8]=data[26];
seriale[9]=data[27];
seriale [10]=data[28];
seriale[11]='\0';
INT RET;
RET= strcmp(OK, SERIALE);
if(RET== 0)
{
output_high(PIN_A2);
}
else
{
output_low(PIN_A2);
break;
}
}
}

15 Risposte

  • Re: Array char Troppo grande

    Se il Device non ha la memoria sufficiente c'è poco da fare... Cerca di ottimizzare il codice... Non usare tutte quelle variabili.
  • Re: Array char Troppo grande

    Grazie Oregon per la risposta, mi hai dato conferma di quello che immaginavo.. una valida alternativa sarebbe leggere dal gets fino a 70 caratteri(che sono quelli che mi interessano) ma come faccio??
    Mi spiego meglio :

    gets(data);//riceve i caratteri fino al carattere invio
    non riceverli tutti ma solo i primi 70, sarebbe possibile?
    Tenendo in considerazione che il carattere di invio e il 98 carattere.

    Ti ringrazio per tutte le info.
  • Re: Array char Troppo grande

    Ma i dati arrivano da tastiera? Perché il Return non può arrivare prima?

    Ti consiglio di usare la fgets al posto della gets e una for per copiare i dati al posto di tutte quelle fighe
  • Re: Array char Troppo grande

    Certo è possibile, ma se ti servono solo 70 caratteri a questo punto puoi semplicemente dare dimensione 70 anizché 100 a data.
    se vuoi tenere la stessa dimensione, ti basta usare la funzione fgets ( data, 70, stdin ).
  • Re: Array char Troppo grande

    Grazie ad entrambi per le informazioni.
    I caratteri arrivano tramite rs232 da una periferica che invia 98 caratteri compreso l invio

    quindi:

    printf("INVIAMI IL TUO SERIALE\n\r");
    char data[70];
    char seriale [20];
    CHAR OK [20];
    fgets ( data, 70, stdin ) //riceve i caratteri fino al carattere invio ma ne mmorizza 70?
    OK="HN01767436M";
    //ESTRAPOLO seriale
    seriale [0]=data[18];
    seriale [1]=data[19];
    seriale [2]=data[20];
    seriale [3]=data[21];
    seriale [4]=data[22];
    seriale [5]=data[23];
    seriale [6]=data[24];
    seriale [7]=data[25];
    seriale [8]=data[26];
    seriale[9]=data[27];
    seriale [10]=data[28];
    seriale[11]='\0';

    Ora provo.
  • Re: Array char Troppo grande

    Da errore "stream must be a costant in a valid range".
    Ma stdin è una costante da dichiarare?
  • Re: Array char Troppo grande

    Ma cosa hai scritto? Di che compilatore parliamo?
  • Re: Array char Troppo grande

    Il compilatore e il ccs

    #include <main.h>
    #include <string.h>
    void main()
    {
    while(TRUE)
    {
    delay_ms(DELAY);
    printf("mandami il seriale\n\r");
    char data[70];
    char seriale [20];
    CHAR OK [20];
    fgets ( data, 70, stdin ); //riceve i caratteri fino al carattere invio ma ne mmorizza 70?
    OK="HN01767436M";
    //ESTRAPOLO seriale
    seriale [0]=data[18];
    seriale [1]=data[19];
    seriale [2]=data[20];
    seriale [3]=data[21];
    seriale [4]=data[22];
    seriale [5]=data[23];
    seriale [6]=data[24];
    seriale [7]=data[25];
    seriale [8]=data[26];
    seriale[9]=data[27];
    seriale [10]=data[28];
    seriale[11]='\0';
    INT RET;
    RET= strcmp(OK, SERIALE);
    if(RET== 0)
    {
    output_high(PIN_A2);
    }
    else

    {
    output_low(PIN_A2);
    break;
    }
    }
    }
  • Re: Array char Troppo grande

    Ma perché li memorizzi i dati? Accetta singoli caratteri dalla seriale e scartali contandoli fino a quelli che servono.
  • Re: Array char Troppo grande

    Allora memorizzo la stringa perche devo estrapolare le varie sottostringhe al suo interno.
    Cosa intendi per contarli e scartarli?
    Potresti farmi un esempio?

    Ti ringrazio.
  • Re: Array char Troppo grande

    A te servono i caratteri dal 18 al 28.

    Usa la getc() (o simili) per prelevare un singolo carattere, fallo per tante volte quanto ti serve senza memorizzarli. Nel ciclo, quando arrivi a quelli che ti servono li memorizzi o, addirittura, li confronti carattere per carattere senza strcmp.

    In poche parole, qualcosa di simile (anche se il codice non l'ho provato e va testato)
    
    	char ix, pix, ch, eq;
    	char *OK = "HN01767436M";
    
    	eq=0;
    	ix=0;
    	pix=0;
    	while(ix<18)
    	{
    		getc();
    		ix++; 
    	}
    
    	while(ix<29)
    	{
    		ch=getc();
    
    		if(ch != OK[pix])
    		{
    			eq=1;
    			break;
    		}
    
    		ix++; 
    		pix++;
    	}
    
           return(eq);
    
  • Re: Array char Troppo grande

    Ti ringrazio domani lo provo e ti faccio sapere.
  • Re: Array char Troppo grande

    mario2159 ha scritto:


    Da errore "stream must be a costant in a valid range".
    Ma stdin è una costante da dichiarare?
    no, stdin significa standard input, ovvero prende la stringa da tastiera, non credevo utilizzassi un input diverso, errore mio. comunque quel 70 nella fgets sì, legge i caratteri digitati fino al 69° (il 70° è riservato sempre per lo \0); quindi se scrivi 180 caratteri solo 69 verranno memorizzati.
    se devi risparmiare memoria a questo punto fai come dice oregon.
  • Re: Array char Troppo grande

    Ciao Oregon perdona il ritardo ma solo ora ho potuto testare, allora ho provato il codice con ccs ma non mi accetta il return all interno del void quando vado a compilare.

    Ho messo solo il tuo per fare la prova :
    #include <main.h>
    #include <string.h>
    
    void main()
    {
       while(TRUE)
       {
       delay_ms(DELAY); 
       printf("dammi il seriale");
       char ix, pix, ch, eq;
       char *OK = "HN01767436M";
       eq=0;
       ix=0;
       pix=0;
       while(ix<18)
       {
          getc();
          ix++;
       }
       while(ix<29)
       {
          ch=getc();
    
          if(ch != OK[pix])
          {
             eq=1;
             break;
          }
          ix++;
          pix++;
       }
           return(eq);
      }
    }
    
    Quale e la causa del problema?

    Ti ringrazio per la tua disponibilita'.
Devi accedere o registrarti per scrivere nel forum
15 risposte