Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [c] variabile non inizializzata?

    ragazzi se dichiaro una semplice variabile:
    int myvar;

    e non la setto a nessun valore quella variabile cosa sarà? 0? il valore NULL?

    durante l'esecuzione del codice come faccio a sapere se è stata valorizzata?


    ho provato a fare if (myvar!=NULL) ma dice

    'The variable 'newI' is being used without being initialized.'
    suppongo che esista una funzione nativa del c per sapere se è una variabile "esista" oppure no?

    thx
    (eventualemtne se mi dite il posto per cercare tutte le funzioni native del c apro meno thread ^^)

  2. #2
    intanto per sopperire ho dichiarato un valore di default all'inizio

    int myvar = -1;


    {altro codice}

    e vedo se è stata modificata facendo

    if(myvar>0)

    ma mi sembra una soluzione da ebeti

  3. #3
    Non è affatto una soluzione da ebeti, è l'unica possibilità.
    Quando, infatti, crei una variabile, le viene riservato un banco di memoria che poi conterrà il valore della variabile. Se non specifichi nessun varore di default la variabile esiste lo stesso, ma il valore contenuto nella sua cella di memoria è imprevedibile, in quanto è l'ultimo valore che ha occupato quella cella, potrebbe esservi stato lasciato da qualsiasi programma eseguito in percedenza. Prova a visualizzare il valore della variabile e ti renderai conto che non è nè NULL nè 0.


  4. #4

    Re: [c] variabile non inizializzata?

    Originariamente inviato da xnavigator
    ragazzi se dichiaro una semplice variabile:
    int myvar;

    e non la setto a nessun valore quella variabile cosa sarà? 0? il valore NULL?
    Sarà inizializzata ad un valore sconosciuto; questo consente di risparmiare qualche istruzione in codice macchina se non è necessario inizializzare subito la variabile.
    durante l'esecuzione del codice come faccio a sapere se è stata valorizzata?
    Non lo sai; al limite la imposti ad un valore noto normalmente non ammesso e poi controlli se è impostata a tale valore.
    ho provato a fare if (myvar!=NULL)
    NULL c'entra solo con i puntatori, lascialo stare se stai lavorando con variabili non-puntatore.
    ma dice
    'The variable 'newI' is being used without being initialized.'
    Normale, il compilatore ti segnala che stai cercando di leggere una variabile non inizializzata (e quindi tendenzialmente stai leggendo valori senza senso).
    suppongo che esista una funzione nativa del c per sapere se è una variabile "esista" oppure no?
    No, il controllo in questione è effettuato a compile-time. Una funzione del genere non ha senso, perché non è possibile aggiungere variabili durante l'esecuzione del programma.
    (eventualemtne se mi dite il posto per cercare tutte le funzioni native del c apro meno thread ^^)
    http://www.acm.uiuc.edu/webmonkeys/book/c_guide/
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    thx...
    la mia soluzione da ebete era quella giusta....

    che linguaggio oooold

    grazie ancora... a presto per la prossima domanda



    :edit:


    ora per curiosità se non si può prevedere quale valore potrebbe assumere durante l'esecuzione e quindi settarlo come default nella dichiarazione come si fa a sapere se è stato valorizzato o no dopo un certo codice?

  6. #6
    Originariamente inviato da xnavigator
    thx...

    la mia soluzione da ebete era quella giusta....

    che linguaggio oooold
    Il concetto di fondo è questo: il C è un linguaggio che non di dà nulla di default per consentire un'implementazione semplice del compilatore sulle piattaforme più disparate e per ottenere performance vicine a quelle di codice assembly scritto a mano. Per questo motivo è quasi una scelta obbligata per scrivere sistemi operativi, device driver, DBMS, motori grafici, applicazioni per manipolare video, librerie matematiche, applicazioni per dispositivi portabili ed in qualunque altro ambito in cui le performance siano fondamentali. Questo non significa che tu non possa ottenere feature avanzate, ad esempio strutture dati analoghe agli array PHP, ma te li devi implementare da zero o impiegare una libreria di terze parti; in ogni caso il C, non supportando classi, template e altre funzionalità OOP, rende più complessa l'implementazione e l'utilizzo di strutture dati di questo genere (almeno in termini di eleganza e comodità d'uso del codice). Per questo io preferisco di gran lunga il C++, che mantiene l'impostazione del C (non ti viene dato niente di complesso a meno che tu non lo richieda esplicitamente), la sua sintassi di base e la sua libreria, ma le cui caratteristiche avanzate consentono l'utilizzo di tecniche di programmazioni più moderne, come l'OOP, la programmazione generica e, con qualche trucco, molti altri paradigmi di programmazione.
    Il punto quindi è che volendo in C++ puoi ottenere funzionalità analoghe al PHP (come gli array associativi), ma non ti vengono imposte, consentendoti così di scegliere autonomamente il contenitore dati più adeguato per la situazione: se mi serve un semplice array di dimensioni fisse perché scomodare un container associativo, con tutte le penalità in termini di prestazioni che mi impone? Se tutti i programmi che usi fossero scritti con linguaggi meno "old", per cui ogni array è in realtà una map, stai sicuro che il tuo computer sarebbe molto più lento...
    Infine, devi sempre tenere conto di una cosa fondamentale quando confronti C/C++ e altri linguaggi compilati con linguaggi interpretati come il PHP: i linguaggi interpretati hanno, per la loro stessa natura, una "coscienza" di sé a runtime, visto che il codice sorgente è disponibile nel momento in cui il programma viene eseguito. Tutto questo non è vero nel caso dei linguaggi compilati, che, nel momento in cui vengono compilati diventano semplice codice eseguibile per la CPU, e ipso facto perdono coscienza di cosa di loro sia codice, cosa sia una variabile, di che tipo siano le variabili, eccetera, visto che, per eseguire il programma, questo non è necessario. In alcuni ambiti una maggiore "coscienza" di sé da parte del programma è desiderabile, ed è il motivo per cui il C++ introduce RTTI, ma, ribadisco, è un di più, e in tutti i compilatori che conosco è disattivabile per diminuire le dimensioni dell'eseguibile finale (visto che questa maggiore "coscienza" si paga con una quantità non indifferente di metadati da portarsi dietro).
    ora per curiosità se non si può prevedere quale valore potrebbe assumere durante l'esecuzione e quindi settarlo come default nella dichiarazione come si fa a sapere se è stato valorizzato o no dopo un certo codice?
    Non si può prevedere il valore di una variabile prima che sia inizializzata. Dopo essere stata inizializzata il suo valore resta quello.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    bhè esauriente..

    probabilmente ho cosi poche righe di codice in c che non lo riesco ad apprezzare a pieno al momento soprattutto essendo abituato alla flessibilità del mio <3 php

    thx (appuntamento alla prossima domanda )

  8. #8
    Originariamente inviato da xnavigator
    che linguaggio oooold
    Se ci pensi, quella che per te è un mancanza, è in realtà una feature, insomma un vantaggio rispetto ad altri linguaggi. Uno strumento in piu' a disposizione del programmatore, che si assume sappia quello che fa ;-)

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da MacApp
    che si assume sappia quello che fa ;-)
    Purtroppo i programmatori 'new' molte volte non lo sanno e devono usare programmi che li 'assistono' ... :-)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.