|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Milano
Messaggi: 7013
|
Stampare l'indirizzo dei 4 byte allocati per un intero in C senza cast @ (char*)
Ciao
come da titolo, mi interessa sapere come fare per riuscire a stampare gli indirizzi dei 4 byte consecutivi allocati per un intero, senza utilizzare il cast @ (char*). Esempio con cast (solo estratto di un programma...giusto per dare un'idea): Codice:
int i, v[5];
for (i=0; i<5; i++)
{
v[i]=i;
printf ("%d %d %d %d", (char*)&v[i]+3, (char*)&v[i]+2, (char*)&v[i]+1, (char*)&v[i]);
}
Scrivendo soltanto v, si ottiene un puntatore costante al primo byte del vettore v. Ovviamente, se scrivo v+1, verrà esseguita una conversione di tipo e, se sto cercando di stampare il secondo byte dell'intero salvato in v[0], avrò stampato in realtà l'indirizzo di v[1] dato che salterà di 4 byte in 4 byte. Devo riuscire a stampare i 4 byte corretti per ogni intero, senza usare il cast. Help
__________________
Presidente comitato mondiale Anti-Troll La gloria la si deve acquistare, l'onore invece basta non perderlo. (Schopenhauer) |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Codice:
int address = &v[i]; // cast implicito
printf("%d %d %d %d", address + 3, address + 2, address + 1, address);
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Milano
Messaggi: 7013
|
Ciao Francesco
ho provato a riscrivere velocemente il programma (era il primo esonero di fondamenti 2 da correggere....in pratica mancavano diversi puntatori e ce n'erano altri messi a caso) Codice:
#include <stdio.h>
#include <malloc.h>
void alloc (int **, int);
void setta (int *, int);
void stampa_su_file (int*, int);
void main ()
{
int n;
int *v=NULL;
printf ("Inserire il numero di elementi: ");
scanf ("%d", &n);
alloc (&v, n);
setta (v, n);
stampa_su_file (v, n);
free (v);
}
void alloc (int **v, int n)
{
*v = (int*) malloc (n * sizeof (int));
}
void setta (int *v, int n)
{
int i;
for (i=0; i<n; i++)
v[i] = i;
}
void stampa_su_file (int *v, int n)
{
FILE *fp;
int i, address;
fp = fopen ("uscita.txt", "w");
for (i=0; i<n; i++)
{
address = &v[i];
fprintf (fp, "v[%d] che si trova ai byte numero %d %d %d %d vale = %d\n", i, address+3, address+2, address+1, address, i);
}
fclose (fp);
}
Ieri avevo provato a fare la stessa cosa ma mi dava un errore in compilazione... appena ho provato a fare ciò che mi hai indicato, mi ha dato il medesimo errore... in pratica lo compilavo in C++ Grazie ancora
__________________
Presidente comitato mondiale Anti-Troll La gloria la si deve acquistare, l'onore invece basta non perderlo. (Schopenhauer) |
|
|
|
|
|
#4 | ||
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Quote:
Ma perche' vi insegnano cose come queste all'Universita'? Fa il paio con i lucidi che usano i float come parametri per un template.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
||
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8897
|
Quote:
~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
|
#7 |
|
Bannato
Iscritto dal: Feb 2003
Messaggi: 947
|
A meno di errori grossolani:
Codice:
int i, v[5];
for (i=0; i<5; i++)
printf ("%d %d %d %d\n",++v[i]+(v[i]=i)-i,++v[i],++v[i],v[i]=&v[i]);
b) v[i]=i, e' implicitamente assegnato al termine dei "push" sulla printf. |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Non ricordo a memoria se lo Standard del C da' garanzia sull'ordine di valutazione (mi sembrerebbe molto strano se lo facesse).
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
|
#9 | |
|
Bannato
Iscritto dal: Feb 2003
Messaggi: 947
|
Quote:
I due metodi piu' utilizzati sono da destra a sinistra con stack a carico del chiamante, e da sinistra a destra con stack a carico del chiamato. Il secondo metodo si chiama "passaggio di paramentri con convenzione pascal", il primo "standard C". Ci sarebbe da verificare se il primo metodo chiamato "standard C" e' in effetti uno standard del C. Nonostante cio', esiste comunque la possibilita' di verificare all'interno del codice stesso la modalita' di passaggio dei paramentri sullo stack: Codice:
{
a=0;
a=func(a--,a++)
if(a>0)
printf("Da destra a sinistra\n");
else
printf("Da sinistra a destra\n");
}
func(int a,int b)
{
return(a+b);
}
Codice:
{
int i, v[5];
a=0;
a=func(a--,a++)
if(a>0)
printf ("%d %d %d %d\n",++v[i]+(v[i]=i)-i,++v[i],++v[i],v[i]=&v[i]);
else
printf ("%d %d %d %d\n",v[i]=&v[i],++v[i],++v[i],++v[i]+(v[i]=i)-i);
}
func(int a,int b)
{
return(a+b);
}
|
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Feb 2003
Città: Milano
Messaggi: 7013
|
Quote:
Uso Visual Studio 6.0 come compilatore. Perchè ci insegnano queste cose? Veramente non ce le hanno insegnate Per la fine del corso bisognava portare un programma intero in C++ su un argomento a scelta (tra 6 proposti). Io ho portato un software di gestione aziendale...erano circa 2000 righe di codice; diciamo che ho imparato un sacco di cose (soprattutto l'utilità delle STL in certe occasioni). Poi, però, all'orale venivano fatte altre domande...domande tipo quella che ho posto io qui. A me è stato chiesto di stampare gli indirizzi di un intero e l'ho fatto con il cast @ char*. Poi mi è stato chiesto di farlo senza cast e all'inizio ho detto una cavolata immane. Allora, mentre veniva interrogato un altro ragazzo, dovevo provare a trovare una soluzione. Ho commesso l'errore grossolano di creare un .cpp e quindi mi restituiva errore; di conseguenza, quando il professore mi ha chiesto a che punto fossi, ho risposto che non ero riuscito a combinare nulla.
__________________
Presidente comitato mondiale Anti-Troll La gloria la si deve acquistare, l'onore invece basta non perderlo. (Schopenhauer) |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Feb 2003
Città: Milano
Messaggi: 7013
|
Quote:
Codice:
*v = (int*) malloc (n * sizeof (int));
__________________
Presidente comitato mondiale Anti-Troll La gloria la si deve acquistare, l'onore invece basta non perderlo. (Schopenhauer) |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Qualunque codice il cui corretto funzionamento dipende da una particolare assunzione sull'ordine di valutazione e' "Undefined" e non e' C++. http://www.gotw.ca/gotw/012.htm Codice:
int f( int& x, int y = x ) { return x += y; }
int g( int& x ) { return x /= 2; }
int main( int, char*[] ) {
int i = 42;
cout << "f(" << i << ") = " << f(i) << ", "
<< "g(" << i << ") = " << g(i) << endl;
But isn't the result wrong? No, the compiler is right... and another compiler could print out something else and still be right, too, because the programmer is relying on something that is undefined in C++.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA Ultima modifica di fek : 23-07-2005 alle 19:41. |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Feb 2003
Città: Milano
Messaggi: 7013
|
Quote:
grazie per l'informazione, non conoscevo l'ordine di lettura della printf Riguardo la tua soluzione: secondo il tuo ragionamento, visto che la lettura avviene da destra verso sinistra assegni a v[i] il suo indirizzo. In tal modo ti basta incrementare di 1 l'indirizzo con la notazione prefissa del "++". Quando viene stampato l'ultimo byte (...il primo nella printf), però, perchè incrementi il valore dell'inidirzzo di 1 e aggiungi e sottrai i? P.S. adesso lo provo
__________________
Presidente comitato mondiale Anti-Troll La gloria la si deve acquistare, l'onore invece basta non perderlo. (Schopenhauer) |
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Feb 2003
Città: Milano
Messaggi: 7013
|
Quote:
ora provo a vedere cosa succede con il Visual Studio. Comunque volevo chiederti un'altra cosa: non è possibile trovare una soluzione senza appoggiarsi ad un intero (per fargli salvare l'indirizzo)? In pratica, mi chiedo se si potrebbe ottenere un risultato analogo usando nella fprintf solo l'operatore + per fargli eseguire un cast implicito? Te lo domando perchè il professore ha provato a darmi un imput dicendomi che in C viene eseguita una conversione di tipo automatica quando si usa l'operatore + in un certo modo. Sinceramente non riesco a trovare altre soluzioni a parte quella che mi hai indicato tu
__________________
Presidente comitato mondiale Anti-Troll La gloria la si deve acquistare, l'onore invece basta non perderlo. (Schopenhauer) |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Milano
Messaggi: 7013
|
In questo modo funziona:
Codice:
fprintf (fp, "v[%d] che si trova ai byte numero %d %d %d %d vale = %d\n", i, ++v[i], ++v[i], ++v[i], v[i]=&v[i], i);
__________________
Presidente comitato mondiale Anti-Troll La gloria la si deve acquistare, l'onore invece basta non perderlo. (Schopenhauer) |
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Feb 2003
Città: Milano
Messaggi: 7013
|
Quote:
Si vede che sbatterò la testa contro il muro finchè non troverò un'altra soluzione P.S. stamattina non avevo niente da fare e ho scaricato alcuni file .cpp. Ho visto delle librerie tipo dos.h, windows.h e winsock.h che mi ispirano parecchio Partendo dal presupposto che la programmazione non mi piace nemmeno un pò...sta diventando una sfida personale
__________________
Presidente comitato mondiale Anti-Troll La gloria la si deve acquistare, l'onore invece basta non perderlo. (Schopenhauer) |
|
|
|
|
|
|
#20 | |
|
Bannato
Iscritto dal: Feb 2003
Messaggi: 947
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:14.



















