Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
La facilità di installazione e la completa automazione di tutte le fasi di utilizzo, rendono questo prodotto l'ideale per molti clienti. Ecco com'è andata la nostra prova in anteprima
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: 2688
[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: 2688
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: 2688
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: 2688
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: 2688
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: 2688
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: 2688
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: 2688
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


Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
Blue Origin potrebbe realizzare il lande...
Artemis II: il prossimo Wet Dress Rehear...
Il nuovo HONOR 600 sta arrivando e avr&a...
La crisi delle memorie non coinvolger&ag...
Windows domina su Steam, ma molti utenti...
Per non incorrere in nuovi aumenti delle...
Cubi Z AI 8M visto da vicino, un mini-PC...
Datacenter nello Spazio, affascinante ma...
Social e minori, Butti apre al dibattito...
Tutte le offerte Amazon del weekend, sol...
Amazon spinge sull'usato garantito: 10% ...
TikTok rischia una maxi-multa in Europa:...
Bose su Amazon: QuietComfort SC over ear...
Scope elettriche super accessoriate in o...
Umidità e muffa addio: questo deu...
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: 17:50.


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