Newsgroup: it.comp.lang.c
Titolo: Re: confusione ^^

A parte che usi un compilatore un po' vecchiotto...
Comunque quando allochi memoria devi prestare attenzione a due cose:
1 - Il risultato restituito dalla funzione di allocazione, che indica se 
effettivamente la memoria è stata allocata (quindi prima di qualsiasi 
operazione effettuata su quella memoria accertati che sia tua!);
2 - Accertati di non andare oltre i limiti della memoria che hai richiesto.
Nel tuo esempio allochi 64000 bytes e poi con un ciclo scrivi '2' su 
65000 elementi, andando palesemente oltre la tua zona di memoria e 
imputtanando (passami il termine) chissà cosa... :\
-- 
Quando noi ignoranti eravamo di più, tutto era più bello (A. Celentano).
  ___   _   ___ _  _______   _______ ___
|   \ /_\ | _ \ |/ / _ ) \ / /_   _| __|
| |) / _ \|   / ' <| _ \\ V /  | | | _|
|___/_/ \_\_|_\_|\_\___/ |_|   |_| |___|

 imputtanando (passami il termine) chissà cosa... :\
senza contare che prima aveva parlato di 64K.
Potrebbe anche voler dire 64*1024 = 65536 elementi
(tanto per aggiungere un altro numero)
ciao,
e.

Scusate ma ho fatto un pò di confusione...ieri era un pò tardi quando
ho postato :)
lo spazio di memoria da allocare è di 64kb il cui indirizzo della
cella iniziale deve risiedere nel puntatore "schermoVirtuale"! 
Vado così ad utilizzare la funzione farmalloc:
 unsigned char far *schermoVirtuale;
 schermoVirtuale=(unsigned char far*)farmalloc(64000);
sembra andare tutto bene, ma in realtà ho dei problemi! 
Non riesco ad inizializzare tutte le celle di memoria allocate!
Infatti se faccio un for:
 for(unsigned int x;x<65000;x++) {
    schermoVirtuale[x]=2;
 }
queste mi vengono inizializzate correttamente al valore 2, ma poi mi
si blocca la schermata, non potendo più fare nulla!
Se invece nel for la x la faccio scorrere fino ad arrivare ad un
numero molto piccolo tipo 20 (for(x=0;x<20x++)) succede che mi vengono
inizializzate correttamente le prime 20 celle al valore 2 e poi il
programma termina correttamente!!!
Forse però ho capito il problema!
Inserendo un controllo dopo aver assegnato la memoria:
 unsigned char far *schermoVirtuale;
 schermoVirtuale=(unsigned char far*)farmalloc(64000);
 if (schermoVirtuale==NULL)
    printf("Impossibile allocare questa quantità di memoria!);
Succede che ogni qualvolta lancio il programma mi esce sta "bella"
scritta!
Il problema dovrebbe quindi essere l'impossibilità di poter assegnare
questa quantità di memoria!
Come risolvo allora?
grazie CIAOOO

 ha 
scritto nel messaggio news:41c01a7a$1...@x-privat.org...


 schermoVirtuale(unsigned char far*)malloc(64000*sizeof(unsigned char far*));
Uhm... ora che sei passato ad un compilatore nuovo, te lo posso dire: 
"far" non si usa.
Si usa direttamente "tipo *":
unsigned char* schermoVirtuale=0;
schermoVirtuale = malloc(...);
Il cast puoi evitarlo perchè malloc ti restituisce un void* che in C può 
essere assegnato a QUALSIASI tipo di puntatore. Quindi niente cose tipo:
schermoVirtuale = (unsigned char*) malloc (...).
E comunque l'argomento di sizeof non dovrebbe essere un puntatore nel 
tuo caso, ma il TIPO a cui punta il puntatore (cioè semplicemente char):
schermoVirtuale = malloc(64000 * sizeof(unsigned char));
Altrimenti calcoli lo spazio necessario per 64000 "puntatori a char" che 
è molto di più di quanto ti serva.
Fammi sapere :)


 Grazie ancora! CIAOOOOOOO
Programmare per Dos significa stare dietro a TUTTE le limitazioni
di questo sistema. Allocare 64k puo' essere un problema per il fatto
che il dos riesce ad indirizzare linearmente SOLO 64k pertanto se il
compilatore tenta di infilare i 64K che richiedi NELLO STESSO segmento
del programma, puoi avere il fallimento della malloc() per mancanza di
spazio. I vecchi compilatori MS per gestire questi problemi con una
certa facilita' metteva a disposizione del programmatore 4 modelli (o
forse erano 5, non ricordo) di memoria: a secondo di quello che si
sceglieva si avevano certe limitazioni o certe complicazioni.
Per prima cosa prova ad allocare un blocco di memoria piu' piccolo
di 64k (tipo 1 o 2k), se ci riesci vuol dire che ci sono altissime
probabilita' che tu sia incappato nella limitazione citata e devi
agire sui parametri del compilatore.
Per seconda cosa (come GIA' suggerito) rivolgiti ad un NG specifico
per la programmazione per DOS, li saranno sicuramente piu' scafati
con i casini del DOS.
HTH
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 agire sui parametri del compilatore.
Eh? o_O
Cioč se lui riesce ad allocare 1k o 2k allora ci sono limitazioni? o_O
-- 
Quando noi ignoranti eravamo di piů, tutto era piů bello (A. Celentano).


 Cioè se lui riesce ad allocare 1k o 2k allora ci sono limitazioni? o_O
Se riesce ad allocare un paio di k (o anche meno, dipende da quanto e'
grande il codice) significa che il compilatore mette codice e dati nello
stesso segmento (ovvero nei 64k che il dos e' in grado di indirizzare
linearmente).
Per quanto sia piccolo il codice, di sicuro sara' piu' grande di zero;
pertanto 64k (senza accorgimenti) non sara' mai in grado di allocarli.
Spero di essere stato piu' chiaro.


 Spero di essere stato piu' chiaro.
Uhm... :\
C'č qualcosa che mi sfugge...?


 codice piuttosto che da altra parte della ram?
Perche' il dos funziona cosi': senza particolari direttive al
compilatore il codice generato sta' tutto nello stesso segmento
perche' il S.O. non e' in grado di indirizzare direttamente la
memoria fuori dal segmento. Se puo' confortarti, la stessa cosa
succede con tutti i processori della famiglia x86. Solo che dal
386 in su i segmenti di memoria possono essere grandi 4GB e non
ci si accorge della cosa.


 ci si accorge della cosa.
Ma scusa allora non vale la pena nemmeno provare ad allocare 2k: in ogni 
caso si deve pensare "allora il codice sta insieme ai dati".
C'è un caso in cui l'uso di malloc fa capire da dove viene presa la 
quantità di memoria?
-- 
Quando noi ignoranti eravamo di più, tutto era più bello (A. Celentano).


 quantità di memoria?
Che sappia io no.


Quindi ti riferivi al suo caso particolare e al fatto che con 
malloc(64000) gli venisse restituito NULL...
Ecco cosa mi sfuggiva :D


 sceglieva si avevano certe limitazioni o certe complicazioni.
[cut]
Se non ricordo male:
1) TINY: codice e dati nello stesso segmento, quindi dimensione limitata a
64Kb, genera file .COM (chi si ricorda del CP/M?)
2) SMALL: un segmeno di codice, un segmento per i dati
3) COMPACT: un segmendo di codice, più segmenti per i dati
4) MEDIUM: più segmenti di codice, un segmento per i dati
5) LARGE: possibilità di usare più segmenti sia per codice che per dati, un
singolo array non può superare i 64Kb
6) HUGE: come large, ma il compilatore aggiunge il codice necessario a
gestire array più grandi di 64Kb
aaaaahh... i vecchi tempi....
-- 
Fermiamo Scientology prima che sia troppo tardi!!!
http://xenu.com-it.net
  ---  
http://www.xenu.net
(per rispondere personalmente leva IlDitoDalCulo)

 Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG
raga mi sà che sono andato a finire in una di queste restrizioni!
In pratica ho 3 puntatori, uno alla scheda video e 2 come contenitori:
unsigned char far *schermoFisico;
schermoFisico=(unsigned char far *)MK_FP(0xA000;0x0000);
unsigned char far *schermoVirtuale;
schermoVirtuale=(unsigned char far *)malloc(64000*sizeof(unsigned char far 
*));
unsigned char far *sprite;
sprite=(unsigned char far *)malloc(100*sizeof(unsigned char far *));
li vado ad inizializzare con valori differenti, tipo per schermoFisico metto 
tutte le celle puntate a 1, schermoVirtuale metto tutte le celle pari a 2, 
per sprite metto tutte le celle paria a 4.
Succede che quando vado a stampare a video schermoVirtuale (verso il 
contenuto delle celle puntate da schermoVirtuale nelle celle puntate da 
schermoFisico) mi visualizza un area video colorata di verde (2 = verde in 
320*200*256colori), un area colorata di rosso (4=rosso) e poi dei puntini 
sparsi tutti colorati! E' come se la memoria riservata allo sprite abbia 
sovrascritto la memoria riservata allo schermoVirtuale e a sua volta 
quest'ultima memoria sia stata ancora sovrascritta da altro a me 
sconosciuto!
Che è successo? Come risolvo?