Array char Troppo grande

di Anonimizzato18070 il
15 risposte
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

  • Se il Device non ha la memoria sufficiente c'è poco da fare... Cerca di ottimizzare il codice... Non usare tutte quelle variabili.
  • 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.
  • 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
  • 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 ).
  • 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.
  • Da errore "stream must be a costant in a valid range".
    Ma stdin è una costante da dichiarare?
  • Ma cosa hai scritto? Di che compilatore parliamo?
  • 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;
    }
    }
    }
  • Ma perché li memorizzi i dati? Accetta singoli caratteri dalla seriale e scartali contandoli fino a quelli che servono.
  • 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.
  • 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);
    
  • Ti ringrazio domani lo provo e ti faccio sapere.
  • 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.
  • 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