Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Con la prima rete 5G Standalone attiva in Italia, WINDTRE compie un passo decisivo verso un modello di connettività intelligente che abilita scenari avanzati per imprese e pubbliche amministrazioni, trasformando la rete da infrastruttura a piattaforma per servizi a valore aggiunto
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro punta a diventare uno dei riferimenti assoluti nel segmento dei camera phone di fascia alta. Con un teleobiettivo Hasselblad da 200 MP, una batteria al silicio-carbonio da 7500 mAh e un display da 6,78 pollici con cornici ultra ridotte, il nuovo flagship non teme confronti con la concorrenza, e non solo nel comparto fotografico mobile. La dotazione tecnica include il processore MediaTek Dimensity 9500, certificazione IP69 e un sistema di ricarica rapida a 80W
DJI Romo, il robot aspirapolvere tutto trasparente
DJI Romo, il robot aspirapolvere tutto trasparente
Anche DJI entra nel panorama delle aziende che propongono una soluzione per la pulizia di casa, facendo leva sulla propria esperienza legata alla mappatura degli ambienti e all'evitamento di ostacoli maturata nel mondo dei droni. Romo è un robot preciso ed efficace, dal design decisamente originale e unico ma che richiede per questo un costo d'acquisto molto elevato
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 28-04-2005, 18:46   #1
D4rkAng3l
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;
}
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 28-04-2005, 19:14   #2
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da D4rkAng3l
for(i=0; i<=100; i++){
*(puntatore + i) = i; // Inizializza l'array con il valore di i
}
Quella la puoi sostituire con:
Codice:
for (i = 0; i < 100; i++)
{
  puntatore[i] = i;   // Inizializza l'array con il valore di i
}
E fai attenzione: tu hai scritto "<= 100", non "< 100", ma in quel modo provi ad inizializzare 101 elementi dell'array, non 100 (da e compreso lo zero, fino a 100 incluso).
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 28-04-2005, 19:22   #3
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
Quote:
Originariamente inviato da DanieleC88
Quella la puoi sostituire con:
Codice:
for (i = 0; i < 100; i++)
{
  puntatore[i] = i;   // Inizializza l'array con il valore di i
}
E fai attenzione: tu hai scritto "<= 100", non "< 100", ma in quel modo provi ad inizializzare 101 elementi dell'array, non 100 (da e compreso lo zero, fino a 100 incluso).
ah ok grazie, però volevo fare un po' di prove proprio sull'aritmetica dei puntatori...mi ricordo che al corso di asm dato un vettore lo incrementavamo a mano con i puntatori...come posso fare questa cosa in C?

per il <= mi impappino sempre perchè non mi ricordo mai se l'ho fatto partire da 0 o da 1 mentre scrivo
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 28-04-2005, 19:33   #4
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
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
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 28-04-2005, 19:40   #5
D4rkAng3l
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?
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 28-04-2005, 19:41   #6
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da AnonimoVeneziano
Prova a dichiarare la variabile "i" come "volatile" e vedi che succede.
Sicuro che possa aiutare?

@D4rkAng3l: non ho ben capito cosa mi hai chiesto.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 28-04-2005, 19:42   #7
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Quote:
Originariamente inviato da D4rkAng3l
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?
Si , il tuo codice a me funziona perfettamente (tralasciando il <= )

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
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 28-04-2005, 19:44   #8
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Quote:
Originariamente inviato da DanieleC88
Sicuro che possa aiutare?

@D4rkAng3l: non ho ben capito cosa mi hai chiesto.

Beh, se è un bug riguardante l' ottimizzazione della lettura dalla memoria del compilatore potrebbe aiutare

Ciao
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 28-04-2005, 19:45   #9
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
il compilatore è il dev c++ sotto win...
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 28-04-2005, 19:52   #10
D4rkAng3l
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
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 28-04-2005, 20:39   #11
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
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.
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 28-04-2005, 20:41   #12
D4rkAng3l
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
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 28-04-2005, 22:02   #13
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
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.
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 28-04-2005, 22:38   #14
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
Quote:
Originariamente inviato da VegetaSSJ5
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.
mmm si proverò, però errore logico a parte (quello del <=) col djgcc funziona perfettamente e poi a rigor di logica lui dovrebbe cmq eseguire il ciclo e scrivere il valore corrente di i in ogni zona dell'array allocato dinamicamente e poi dovrebbe sbroccare dopo quando và a scrivere in una zona di memoria non allocata e invece il dev c++ se non imposto la variabile come volatile mette uno 0 in ogni locazione dell'array...poi cmq proverò, magari il compilatore è fatto in modo tale da impostare tutte le locazioni a 0 se c'è qualcosa che non và...anche se mi sembra strano, non ci capisco molto ma da quello che sò i compilatori dovrebbero soloe seguire controlli sintattici e non logici....
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 28-04-2005, 22:49   #15
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
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...
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 28-04-2005, 23:28   #16
Ubi-Wan
Bannato
 
L'Avatar di Ubi-Wan
 
Iscritto dal: Jul 2004
Città: Tatooine
Messaggi: 506
Quote:
Originariamente inviato da DanieleC88
Quella la puoi sostituire con:
Codice:
for (i = 0; i < 100; i++)
{
  puntatore[i] = i;   // Inizializza l'array con il valore di i
}
E fai attenzione: tu hai scritto "<= 100", non "< 100", ma in quel modo provi ad inizializzare 101 elementi dell'array, non 100 (da e compreso lo zero, fino a 100 incluso).

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
Ubi-Wan è offline   Rispondi citando il messaggio o parte di esso
Old 29-04-2005, 15:28   #17
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
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
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 29-04-2005, 15:30   #18
D4rkAng3l
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
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 29-04-2005, 16:39   #19
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Si, è una versione vecchia, scarica l'ultima

Ciao
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 30-04-2005, 00:35   #20
71104
Bannato
 
L'Avatar di 71104
 
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!!!
71104 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi Wind Tre 'accende' il 5G Standalone in Italia: s...
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh OPPO Find X9 Pro: il camera phone con teleobiett...
DJI Romo, il robot aspirapolvere tutto trasparente DJI Romo, il robot aspirapolvere tutto trasparen...
DJI Osmo Nano: la piccola fotocamera alla prova sul campo DJI Osmo Nano: la piccola fotocamera alla prova ...
FUJIFILM X-T30 III, la nuova mirrorless compatta FUJIFILM X-T30 III, la nuova mirrorless compatta
Google Maps avrà una modalit&agra...
HONOR sta lavorando a uno smartphone con...
Thermaltake MAGFloe 360 Ultra ARGB Sync:...
Xiaomi 15T ora in super offerta su Amazo...
Si stringe il cerchio attorno a TP-Link ...
Amazon cambia i prezzi ancora una volta:...
Imperdibili i Google Pixel 10 a questi p...
Dyson OnTrac in super offerta su Amazon:...
Amazon: la nuova ondata di licenziamenti...
Questo portatile è un mostro: MSI...
Apple Watch Series 11 GPS + Cellular cro...
JBL Clip 5 in forte sconto su Amazon: lo...
Il nuovo top di gamma compatto di OnePlu...
Cresce il divario tra dispositivi elettr...
La missione con equipaggio Shenzhou-21 h...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 00:10.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v