PDA

Visualizza la versione completa : [C] Utilizzare la funzione farmalloc()


frarugi87
13-04-2007, 10:23
Uso il TurboC della Borland.

Dato che devo salvare una pagina grafica di 640 x 350, pensavo di usare la malloc ma... SORPRESA! La malloc non alloca più di 64 kB... e ne servono + o - 224...

Allora trovo la farmalloc ma... non riesco a farla funzionare!

per provare ho scritto questo codice:


void huge *punt;

main()
{
if ((punt = (void huge *)farmalloc(70*70))==NULL)
printf ("err");
else
{
farfree (punt);
printf ("ok");
}
}


E sapete qual è l'output? Questo:
errerrerrerrerrerrerrerrerrerrerrerrerrerrerrerrer rerrerrerrerr

ecc ecc ecc...

Qualche ideuzza?

oregon
13-04-2007, 10:38
Utilizza un puntatore a char

char huge *punt;

frarugi87
13-04-2007, 10:53
il codice diventa quindi

char huge *punt;

main()
{
if ((punt = (char huge *)farmalloc(70*70))==NULL)
printf ("err");
else
{
farfree (punt);
printf ("ok");
}
}

se si non funziona ancora...

oregon
13-04-2007, 10:57
Spiega un po' il contesto del tuo programma ... stai lavorando in DOS?

E perche' allochi solamente 4900 byte (70*70)? E' solamente per prova?

frarugi87
13-04-2007, 11:06
si, in dos.

devo fare un programma con un'animazione a schermo intero (VGAMED, quindi 640 x 350).
le bmp che compongono le immagini sono salvate in un file.
il programma legge un'immagine dal file e la mette sullo schermo in modalità grafica.
Con la putpixel ci mette una vita. allora ho usato la putimage. Però questa ha bisogno di un pò di memoria allocata.
Con la malloc si possono allocare al max 64kB.

Comunque questo è un altro programma. In questo codice voglio solo vedere come funziona la farmalloc.
Si, 70 x 70 è per fare una prova (dato che la malloc li alloca...)

oregon
13-04-2007, 11:15
Non posso fare delle prove perche' non dispongo del compilatore in questione.

Dalla documentazione letta su internet, il puntatore deve essere di tipo far, quindi

char far *punt;

Ma non mi sembra questo il problema ... non so quale modello di compilazione hai usato ma ovviamente il "tiny model" non va bene ... controlla quale modello utilizzi ...

frarugi87
13-04-2007, 11:28
Ho provato con small, large e huge model.
i puntatori li ho usati di tipo char far * e char *far *.

Niente di niente...

oregon
13-04-2007, 11:36
Questo codice (large model e con gli include corretti)



char far *punt;

main()
{
punt = (char far *)farmalloc(1000);

printf ("%d", punt);
}


cosa scrive a video?

P.S. So che la farmalloc ha problemi se utilizzata nell'IDE ma funziona nell'exe ... tu stai provando dall'IDE o compili ed esegui il .exe?

frarugi87
13-04-2007, 12:03
gli include dovrebbero essere corretti.....................

Aspetta.....

include <alloc.h>
E tutto funziona...........

Ma scusa, se non gli includo il file degli header non mi dovrebbe dire qualcosa tipo "Non trovo la funzione"?

Comunque ora va... Grazie

oregon
13-04-2007, 12:15
Davo per scontato che tu avessi incluso la alloc.h ... :madai!?:

Molto probabilmente, in assenza dell'include, la farmalloc viene rimappata sulla malloc ...

Loading