Visualizzazione dei risultati da 1 a 10 su 10

Discussione: [C] Dubbio su array

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    55

    [C] Dubbio su array

    Ciao a tutti,
    oggi a lezione un ragazzo ha posto un quesito al quale il prof ha risposto semplicemente dicendo che bisognava evitare che ciò che sto per spiegare accadesse, ma non ha detto cosa succede se ciò che bisogna evitare, accadesse....
    mi sono spiegato male ma capirete:

    supponiamo di avere l'algoritmo di ricerca di una variabile x in un array di n elementi (che però non la contiene):

    es: vogliamo cercare il valore 4 in un array di 5 elementi composto dai numeri 1,2,3,5,6

    ...
    ...
    int a[5] = {1,2,3,5,6}, i=0;
    ...
    ...
    do
    {
    i++;
    }
    while( x= A[i] || i>5);
    ...
    ...

    il ciclo funziona, è corretto e se eseguito non da alcun problema ma il mio dubbio nasce quando i=5 e il valore non è stato ovviamente ancora trovato.
    se ci trovassimo in questa situazione, il while dopo aver eseguito le istruzioni tra parentesi graffe (in questo caso solo i++) controlla se è stato trovato un elemento uguale all'elemento che noi stiamo cercando (falso) oppure se i (che vale 5) è >5 (falso).
    In questo caso il ciclo viene ripetuto un'ultima volta con i=6.
    Quando il programma (ormai in esecuzione) va a controllare se x=A[6], perchè non da un errore? in pratica si cerca di confrontare una variabile (x) col contenuto di una locazione di memoria (A[6]) che non è stata affatto dedicata all'array!
    Che succede in questo caso? Perchè non vengono segnalati errori anche se A[6] NON esiste?

    (lasciamo stare il fatto che quando si va a controllare se i>5 si esce dal ciclo....non è quello il problema xD)

    Vi assicuro che è difficile spiegare questo problema scrivendolo in un semplice messaggio

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Di che linguaggio stai parlando? Perché per C/C++ quel codice non funziona.
    Comunque non è prevedibile. Potrebbe leggere il valore che accidentalmente si trova in quella locazione, potrebbe varcare limiti invarcabili e causare un segfault o errore di altro genere. Potrebbe far lanciare una testata nucleare sulla tua testa. Dipende tutto dal sistema, dalle periferiche installate e dalla tua dose di fortuna
    In 2 parole undefined behaviour
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    55
    si scusami....
    l'esempio era in p-like e io l'ho riportato in c dimenticandomi della differenza degli array

    ..
    ..
    allora dipende dal sistema? a runtime otterrò messaggi in caso di errore?

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Quote Originariamente inviata da Lodin Visualizza il messaggio
    si scusami....
    l'esempio era in p-like e io l'ho riportato in c dimenticandomi della differenza degli array

    ..
    ..
    allora dipende dal sistema? a runtime otterrò messaggi in caso di errore?
    No, sbagliato. Non otterrai messaggi di errore, puoi ottenere messaggi di errore. Ma quel codice può fare qualsiasi cosa.


    I due casi più probabili sono:

    -legge da una locazione di memoria allocata ad un altro oggetto (o preallocata al processo) e ritorna un valore ACCIDENTALE, ovvero che si trova lì per caso, e in base a questo valore avrai il risultato dell'operazione.

    -provoca un segfault perché tenta di leggere da una zona di memoria non allocata al processo.


    Ma con la giusta combinazione di fortuna, sistema operativo, periferiche hardware e programmi in esecuzione puoi benissimo lanciare una testata nucleare.


    P.s. Non sarebbe l'unico errore in C.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    55
    [edit]sto avendo problemi con vs..... il tempo che risolvo e controllo

    p.s per l'errore a che ti riferisci? sappi che ho mancato alcune cose semplicemente perchè era un esempio....
    Ultima modifica di Lodin; 04-11-2014 a 22:05

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    x=A[i]||i>5 assegna ad x il valore contenuto nella posizione i o il booleano ottenuto da i>5 nel caso A[i] sia 0 e ritorna il valore di x, forme non è quello che volevi.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    55
    uuu è vero....non ci avevo pensato xD

    spesso mi dimentico del == :/

  8. #8
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Ciao,
    poi mettere la ricerca in un do-while in quel modo non è corretto: il primo incremento della variabile 'i' viene fatto comunque e se il valore che cerchi è al posto 0 allora lo manchi completamente. Se vuoi tenere il do-while allora dovresti far partire 'i' dal valore -1.


  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    590
    apparte il fatto che come ha detto minomic, non è opportuno utilizzare il do-while in questo caso, il dubbio di lodin è più che leggittimo.
    Sono molto arrugginito in C, ma mi ricordate quand'è che ho segmentation fault su array statico, se anche questo non dà errori?
    codice:
    int main(){int a[5] = {1,2,3,5,6}, i=0;
    printf("a[600]=%d", a[600]);
    printf("a[-600]=%d", a[-600]);
    return 0;
    }
    Ormai sono abituato a linguaggi ad alto livello che ti prendono a schiaffi molto forte se fai cose del genere, quasi mi manca C e la sua mancanza di controlli

  10. #10
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Non deve dare per forza segfault. Quello è solo un danno collaterale: un segnale del sistema operativo che il processo è andato a toccare memoria che non era a lui allocata.
    Il punto è che non è detto che tu vada a scrivere in un a area di memoria non allocata al processo e anche nel caso tu lo faccia potresti avere un OS che te lo lascia fare (molto improbabile nei nostri desktop) o che reagisce in un'altra maniera.
    Come già detto: potresti lanciare una testata nucleare.
    Il punto degli undefined behavior è appunto che sono indefiniti e possono fare qualsiasi cosa e quello che fanno lo fanno in base a mille variabili accidentali: Il loro effetto può variare ad ogni esecuzione, anche sullo stesso pc.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.