Errore in Ricerca Binaria

Ciao a tutti,

sto compilando questo codice di ricerca binaria e mi viene restituito questo errore:

2:27: error: 'LEN' was not declared in this scope
2:31: error: expected ')' before ',' token
2:33: error: expected unqualified-id before 'int'
 exit status 1

Vi riporto il codice:

const unsigned int LEN = 100;
int data[LEN];
int high = LEN - 1;
int low = 0, mid;
int target = 10, found = 0;
int i = 0, n = 0;
int result;
void setup() {
  Serial.begin (9600);
  for (i = 0; i < LEN; i++) {
    data[n++] = i;
  }

  int result = binarySearch(data[LEN], target, low, high);
  if (data[mid] > target) {
    int x = binarySearch(data[LEN], target, low, mid - 1);

    // Search the right half
    int y = binarySearch(data[LEN], target, mid + 1, high);

  }

  if (result == -1) {
    printf("Not found");
  }
  else {
    printf("Element is found at index %d", result);
  }
}
int binarySearch(int data[LEN], int target, int low, int high) {
  if (high >= low) {
    int mid = low + (high - low) / 2;
  }
  // If found at mid, then return it
  if (data[mid] == target) {
    return mid;
  }
  // Search the left half

  return -1;
}



void loop() {

}

Ho difficoltà a capire quale sia il problema, sono alle prime armi quindi probabilmente sarà semplice la soluzione. Per essere precisi sto compilando questo codice sulla piattaforma Tinkercad che riproduce un dispositivo Arduino virtuale non avendolo a disposizione fisicamente (necessito del monitor seriale). Su Arduino IDE non vi viene restituito nessun errore, su Tinkercad invece ho la situazione che vi ho riportato sopra.
Grazie.

Buonasera e benvenuto,

essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del regolamento di detta sezione (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO

... poi, in conformità al suddetto regolamento, punto 7, cortesemente edita il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post), seleziona la parte di codice e premi l'icona </> nella barra degli strumenti per contrassegnarla come codice. Così com'è non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac, sempre all'interno del IDE). Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread e sistemato il codice come da regolamento, nel rispetto del citato regolamento nessuno ti risponderà (eventuali risposte verrebbero cancellate), quindi ti consiglio di fare il tutto al più presto. :wink:

Dovrei aver risolto tutti i punti da lei elencati, mi dica se c'è altro. La ringrazio.

Tutto a posto, grazie ... :slight_smile:
... prova a rinominare quel LEN in LNGT e vedi se cambia qualche cosa perché non vorrei che quel LEN sia usato in qualche definizione del 'core' ... :roll_eyes:

Guglielmo

Ho provato a compilare, ottengo alcuni warning ma nessun errore. Utilizzo l'IDE Arduino 2.0

... non uso prodotti in beta, mi spiace ed oltretutto, lo trovo ancora estramente carente in tutta la parte di "gestione".

Ti consiglio di usare prodotti stabili, 1.8.16

Guglielmo

Grazie per la risposta, ho provato ma mi restituisce lo stesso errore:

2:27: error: 'LNGT' was not declared in this scope
2:32: error: expected ')' before ',' token
2:34: error: expected unqualified-id before 'int'
 exit status 1

Sono da cell e non riesco a provare il codice che hai messo...
Ma la sparo lo stesso in base a un vecchio ricordo di un errore simile...
Cambia qualcosa se lasci le quadre vuote nel parametro data nella definizione della funzione?
Tipo
int binarySearch(int data[], int target, int low, int high)

Per che piastra stai compilando?

Mi restituisce un errore per ogni stringa in cui richiamo la funzione

 In function 'void setup()':
14:37: error: invalid conversion from 'int' to 'int*' [-fpermissive]
2:5: note:   initializing argument 1 of 'int binarySearch(int*, int, int, int)'

16:36: error: invalid conversion from 'int' to 'int*' [-fpermissive]
2:5: note:   initializing argument 1 of 'int binarySearch(int*, int, int, int)'

19:36: error: invalid conversion from 'int' to 'int*' [-fpermissive]
2:5: note:   initializing argument 1 of 'int binarySearch(int*, int, int, int)'
exit status 1

IL primo parametro della funzione binarySearch deve essere un puntatore all'array

Grazie, ora mi rivedo bene i puntatori che non ricordo benissimo. Quindi cambio il primo parametro quando definisco la funzione e lo metto come puntatore, lo devo cambiare anche quando richiamo altrove la funzione giusto?
Devo mettere questa dicitura dopo aver dichiarato il puntatore?

int data[LNGT], *pd;
pd = &data[0];

Io direi, quando dichiari la funzione:

int binarySearch(int* data_, int target_, int low_, int high_) 

e quando la richiami:

int result = binarySearch(data, target, low, high);

visto che il nome di un array e' anche il suo puntatore, cioe', avendo dichiarato l'array data[LEN], data e' equivalente a &data[0].

Inoltre cambia i nomi delle variabili all'interno della funzione per non fare confusione con le variabili globali

Ok grazie ora non mi segnala più errori ma non sembra fare nulla. Ricontrollerò che a livello di codice sia tutto giusto aldilà degli errori. Per ora senza errori segnalati è così:

const int LNGT = 100;
int data[LNGT], *pd;
int high = LNGT - 1;
int low = 0, mid;
int target = 20, found = 0;
int i = 0, n = 0;
int result;
void setup() {
  pd = &data[0];
  Serial.begin (9600);
  for (i = 0; i < LNGT; i++) {
    data[n++] = i;
  }

  int result = binarySearch(data, target, low, high);
  if (data[mid] > target) {
    int x = binarySearch(data, target, low, mid - 1);

    // Search the right half
    int y = binarySearch(data, target, mid + 1, high);

  }

  if (result == -1) {
    printf("Not found");
  }
  else {
    printf("Element is found at index %d", result);
  }
}
int binarySearch(int *data, int target, int low, int high) {
  if (high >= low) {
    int mid = low + (high - low) / 2;
  }
  // If found at mid, then return it
  if (data[mid] == target) {
    return mid;
  }
  // Search the left half

  return -1;
}



void loop() {

}

Forse potrebbe essere anche un problema di Tinkercad, non potendolo provare con IDE e Arduino collegato.

... mi sa che devi riguardarti un po' il 'C' ... purtoppo NON è così che si passano gli array ad una funzione.

Sia in fase di definizione, che in fase di chiamata, il primo tuo parametro: int data[LEN] NON è ammissibile, devi passare il puntatore all'array, quindi un "int *" e la sua lunghezza, quindi un "int" (questo ti serve per evitare, nella funzine, di andare oltre le dimensioni dell'array e conoscerne le sue esatte dimensioni).

Guglielmo

La forma più semplice è probabilmente dichiarare così la funzione:

int binarySearch(int data[], int LEN, int target, int low, int high) {
   ...
}

e richiamarla così:

result = binarySearch(data, LEN, target, low, high);

Ricorda che il 'C' non fa nessun controllo sul numero degli elementi e quindi devi essere tu a non superare mai, con l'indice dell'array, il numero massimo di elementi.

Guglielmo

P.S.: la dichiarazione può essere ugualmente scritta così:   int binarySearch(int *data, int LEN, int target, int low, int high) {   e, dato che LEN è dichiarato globale, nel caso specifico puoi anche evitare di includerlo trai parametri visto che comunque è accessibile ovunque. Ove così non fosse, è sempre bene passarlo per avere le dimensioni dell'array.

Grazie Guglielmo, ho aggiustato seguendo i vostri consigli riguardo i puntatori, effettivamente dovevo ancora rivederla questa parte. Dovrei aver aggiustato tutto, ora mi rimane da rivedere l'algoritmo per capire cosa non vada.

Se ti piace l'agomento e ti appassionano le techiche di "ordinamento" e "ricerca" (come appassionarono me nei lontani anni '70-'80) ti consiglio l'acquisto e la lettura/studio di QUESTO volume del Knuth, volume interamente dedicato al "Sorting & Searching" :grin:

Guglielmo

Grazie per il consiglio!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.