Benvenuto! Per postare e godere delle funzionalità del forum registrati, occorrono pochi secondi ed è gratis!

[Guida] Il C++ [CH.04: i defines]

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
Rieccoci qui,
questa è una guida super-veloce, niente di impegnativo, parliamo del "DEFINE"

Poca toria e tanta pratica quindi vediamolo in azione.

Programma SENZA il define:



Codice:
#include <stdio.h>

void main()
{
int minuti = secondi * 60;
int ore = minuti * 60;
...
int cippa = lippa * 60;
}




Programma CON il #define:



Codice:
#include <stdio.h>
#define KAPPA 60

void main()
{
int minuti = secondi * KAPPA;
int ore = minuti * KAPPA;
...
int cippa = lippa * KAPPA;
}




Come funziona?
funziona che invece di mettere lo stesso valore in giro per il programma, 60, lo mettiamo una volta sola in cima al codice nel #define e il compilatore si preoccuperà di sostituire tutte le occorrenze della parola "KAPPA" con 60.

Non vi sembra utile? invece lo è!
perché il programmino sopra è piccolo (e stupido) ma immaginate un programma di migliaia di righe, dove la costante 60 compare centinaia di volte.
Cosa succede se un giorno da 60 doveste cambiarla in 70?
Eheh, un casino, dovreste passarvi tutto il codice alla ricerca di 60 e cambiarlo in 70 col rischio di dimenticarne qualcuno o di sbagliare.
Voi direte "faccio sostituisci 60 con 70"... e bravi, e se nel programma ci sono altri 60 ma che significano altro e non devono essere rimpiazzati con 70? fate un bel casino.

Con il define è facile, basta cambiare la riga in alto una sola volta e siete a posto!

Vediamo ad esempio come funziona nelle hacks:



Codice:
#define Serverpointer 0xB39BE0
#define off_5thslot 0xD11EC

void Slot5()
{
DWORD dwServerPtr = *(DWORD*)Serverpointer;
*(long*)(dwServerPtr+off_5thslot) = 1;
}





visto? invece di scrivere 0xB39BE0 nella funzione Slot5 l'ho messo in un define.
perché? perché quel valore non compare solo in Slot5 ma anche in tante altre hacks che hanno a che fare
con il serverpointer, quindi avrei dovuto scrivere lo stesso valore in tutte.
E quando poi aggiornavano warrock?
Mi sarei dovuto passarei il codice per sistemare l'indirizzo vecchio e metterci quello nuovo in tutte le funzioni.
Con il define lo cambio solo 1 volta all'inizio del codice nel define.

Inoltre vedete un altro lato utile del define...

Leggendo questa riga :
DWORD dwServerPtr = *(DWORD*)0xB39BE0;

uno si potrebbe chiedere, ma che cavolo è quel 0xB39BE0 ? ce lo possiamo immaginare ma non lo sappiamo.

Mentre quando leggiamo:
DWORD dwServerPtr = *(DWORD*)Serverpointer;

si spiega da solo, stiamo prendendo il serverpointer e ci facciamo delle elaborazioni.

Il define ha anche un altro utilizzo, quello delle macro, ma non ve ne parlo oggi, forse un'altra volta, o forse mai

ciao
alla prossima


digger
13/03/2011, 0:47
#1
Cerca




Utenti che stanno guardando questa discussione: 1 Ospite(i)