|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
[C] Problema puntatori
Ciao, ho fatto un semplice programma che alloca dinamicamente un array di 100 interi, poi vorrei riempire questo array con un ciclo for ma qualcosa non funziona bene ed è come se mi inizializzasse a 0 solo il rpimo elemento (e quindi tutto l'array risulta essere inizializzato a 0)...mi sà che c'è qualcosa che non và nell'aritmetica dei puntatori ma non capisco cosa...
#include <stdlib.h> #include <stdio.h> /* Non riceve alcun parametro ed emette un puntatore a float */ int * get_mem(void); int main(void){ int i; int *puntatore; // Puntatore al primo valore float dell'array allocato /* Alloca la memoria dinamicamente e metti il valore del puntatore uscente dalla funzione get_mem nellaa variabile puntatore */ puntatore = get_mem(); printf("%p\n", puntatore); for(i=0; i<=100; i++){ *(puntatore + i) = i; // Inizializza l'array con il valore di i } printf("\n%d\n", puntatore[0]); printf("\n%d\n", puntatore[1]); printf("\n%d\n", puntatore[2]); system("PAUSE"); return 0; } /* La funzione get_mem non riceve alcun parametro in ingresso e restituisce un puntatore al primo valore di tipo float dell'array di 100 elementi allocato dinamicamente */ int *get_mem(void){ int *p; // Puntatore al primo elemento di tipo float dell'array /* Alloca memoria per un array di 100 elementi di tipo float */ p = calloc(100, sizeof(int)); if(!p){ // Se calloc restituisce un puntatore NULL printf("Errore di allocazione della memoria\n"); exit(1); } return p; } |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Codice:
for (i = 0; i < 100; i++)
{
puntatore[i] = i; // Inizializza l'array con il valore di i
}
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#3 | |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
Quote:
per il <= mi impappino sempre perchè non mi ricordo mai se l'ho fatto partire da 0 o da 1 mentre scrivo |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Strano , dovrebbe funzionare ....(a me funziona)
Che sia un bug del compilatore? Prova a dichiarare la variabile "i" come "volatile" e vedi che succede. Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
#5 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
cioè a te funziona il mio codice?compilare me lo compila però mi inizializza tutto il vettore a 0....
che vuol dire dichiarala come volatile? |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
@D4rkAng3l: non ho ben capito cosa mi hai chiesto.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Che compilatore usi? Dichiarare la variabile come "volatile" intendo che invece di dichiarare "i" come : int i; di dichararla come : volatile int i; Dovrebbe bypassare eventuali ottimizzazioni buggate eseguite dal tuo compilatore (se il problema è effettivamente il compilatore) . Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Beh, se è un bug riguardante l' ottimizzazione della lettura dalla memoria del compilatore potrebbe aiutare Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
|
#9 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
il compilatore è il dev c++ sotto win...
|
|
|
|
|
|
#10 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
cazzarola dichiarandola volatile funziona !!! e provando col codice originale con un altro compilatore funziona...ma il dev c++ non dovrebbe essere uno dei migliori?
in che modo hai capito che era proprio la variabile i a dare problemi e a dover essere dichairata come volatile? cmq grazie mille...che rosicata però...tempo sprecato per uno stupido compilatore |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Si , allora è proprio un bug del compilatore .
I compilatori tendono a ottimizzare l'accesso alla memoria evitando di leggere una variabile + volte dalla memoria se questa non è stata modificata . "volatile" impone al compilatore di generare codice che rilegga la variabile ogni volta dalla memoria evitando tali ottimizzazioni . Se nel compilatore c'è un bug relativo a tali ottimizzazioni (e quindi il compilatore non si accorge che la variabile in questione verrà modificata alla fine di ogni ciclo FOR e che sarà perciò necessario rileggerla anzichè riutilizzare il valore salvato nei registri che nel tuo caso era "0") con "volatile" lo si può bypassare, comunque se la versione di Dev C++ che stai usando non è una versione beta o development ma quella considerata stabile io farei un bug report ai programmatori. Ciao
__________________
GPU Compiler Engineer Ultima modifica di AnonimoVeneziano : 28-04-2005 alle 20:41. |
|
|
|
|
|
#12 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
si infatti ci avevo pensato anche io di farglielo sapere, che figata il mio primo bug trovato
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
devc++ usa gcc come compilatore. chissà se questo presunto bug sia presente per le versioni su tutte le piattaforme. io ricordo di aver fatto degli esempi del genere con devc++ ma non mi sembra di aver incontrato degli errori.
cmq x darkangel: come ha detto danielec88 nel ciclo for inizializza i=1 oppure fai il controllo i<100 e non i<=100 perchè la 101esima volta vai a scrivere su una zona di memoria non allocata. fai questa correzione e poi rimanda in esecuzione il programma e vedi cosa succede. |
|
|
|
|
|
#14 | |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
Quote:
|
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
per fare un po' di debug prova a mettere la printf proprio nel ciclo for...
|
|
|
|
|
|
#16 | |
|
Bannato
Iscritto dal: Jul 2004
Città: Tatooine
Messaggi: 506
|
Quote:
Io preferisco invece l'aumento del puntatore *(p + i) = i (a parte l'errore del <=). Mi ricordo che faccio cosi' da quando a proposito di cio' il mio professore di Informatica I disse che se sulle tastiere non ci fossero le parentesi quadre tutti scriverebbero codice migliore |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Comunque su WinXP ho provato a installare Dev-C++ ultima versione ( 4.9.9.2 ) e il problema non c'è.
Te quale usi? Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
#18 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
dice solo Dev C++ 4
mi sà che non è aggiornatissima...ora scaricherò anche io l'ultima versione |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Si, è una versione vecchia, scarica l'ultima
Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
#20 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
guardate che scaricando l'ultima versione non risolvete nulla: gli sviluppatori del dev-c++ si occupano solo dell'ide (che tra l'altro è una porcheria immonda), il problema (se davvero c'è) è del porting per windows del gcc!!!
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:10.



















