Newsgroup: it.comp.lang.c
Titolo: Puntatori

Ciao  a tutti!
Il mio dubbio dovrebbe essere di facile risoluzione ...
ho dei puntatori ad un array di strutture del tipo:
#    nodo *arraypunt[20];
#    nodo array[20];
#
#     for (i=0;i<20;i++)
#       arraypunt[i]=&array[i];
 
Io devo fare delle operazioni su questi  puntatori  del tipo:
#    arraypunt[i] = arraypunt[i/2];
#    arraypunt[i/2]= arraypunt[1];
#     ...
La mia domanda č questa.
Nell ultimo pezzo di codice che ho scritto, arraypunt[i] alla fine dove punta?
Cioč punta dove poi va a puntare arraypunt[i/2]??
Grazie grazie.G

 Cioč punta dove poi va a puntare arraypunt[i/2]??
No!
Tommy

 No!
ma nel tuo caso non facevi prima a provare che a scrivere sul NG?!?
Tommy

Cioč punta dove poi va a puntare arraypunt[i/2]??
Se  i  due  stralci  di  codice  sono  consecutivi  c'e'  un  errore:
arraypunt[i]  non  e'  stato  allocato,  infatti  i varrebbe 20, stai
sporcando la memoria.
comunque sia punterebbe alla  locazione  che  e'  stata  caricata  in
arraypunt[i/2] durante il ciclo for e non a arraypunt[1].
Bye
GIGI
-- 
   THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
visit my home page:
http://web.tiscali.it/KilometroZero

 sporcando la memoria.
No, perche` arraypunt e` un array di puntatori, nel for vengono fatti
puntare gli elementi a oggetti allocati staticamente dal secondo array,
quindi e` tutto corretto.
Ciao,
Cecco

 Cioč punta dove poi va a puntare arraypunt[i/2]??
No. Pensa ad un puntatore come una variabile qualunque, solo che contiene
"indirizzi".
Ciao,
Cecco

> >#    arraypunt[i] = arraypunt[i/2];
Significa che vai a scrivere nel ventunesimo elemento di un  elemento
che hai dichiarato lungo 20.
quindi  si  sborda  oltre  la  sua dimensione e quindi si commette un
errore.


 ha scritto nel messaggio
news:3e9d17f8...@10.1.6.20...

E` vero, hai ragione, ho frainteso il tuo commento (in effetti il mio non
c'entrava molto come risposta al tuo ;-).
Ciao,
Cecco

Allora posto di seguito il codice di un programmino
il problema è questo dal main richiamo una funzione ricorsiva che deve fare un calloc di un array di char e popolarlo
con i dati letti da un file...
La funzione RevertSubString funziona correttamente
ReadPrintConvertRemoteBlock al suo interno fa tutto quello che deve fare
al ritorno del main a (puntatore a char) non punta dove dovrebbe...
N.B.
	per convenzioni al dimensione del file deve essere un multiplo di BlockSize ed avere gli ultimi byte a 0 se qualcuno vuole postare già un file predisposto..
Grazie per qualsiasi aiuto sto veramente impazzendo
#include <stdio.h>
#include <string.h>
#define BlockSize	256
#define FALSE		0
int	SC=sizeof(char);
void RevertSubString(int xStart,int xEnd, char *a){
	int n,i;
	char sw;
	n=xEnd/2;
	for (i=0;i<n;i++){
		sw=a[xStart+i];
		a[xStart+i]=a[xEnd-i];
		a[xEnd-i]=sw;
	}
}
int ReadPrintConvertRemoteBlock(char **a,char **c,int i,FILE *f){
	char	b[BlockSize];
	int 	k=1;
	fread(b,SC,BlockSize,f);
	//fwrite(b,SC,BlockSize,stdout);
	printf("\n-|-%p---\n",**a);
	/*getc(stdin);*/
	if (i>100){
		perror("ci deve essere un grosso problema!!!");
		exit(-4398);
	}
	if (b[BlockSize-1]!=0) {
		i=ReadPrintConvertRemoteBlock(*a,c,i+1,f);
		RevertSubString(0,BlockSize-1,b);
		//fwrite(b,SC,BlockSize,stdout);
		memcpy(*a,b,BlockSize);
		printf("\n*******Pointer1 |%c|***%p****\n",**a,*a);
		(*a)+=BlockSize;
	} else {
		int n=strlen(b);
		RevertSubString(0,n-1,b);
		(*a)=calloc(i*SC*BlockSize);
		*c=*a;
		memcpy(a,b,n);
		printf("\n*********Pointer |%c|***%p****\n",**a,*a);
		(*a)+=SC*n;
	}
	return(i);
}/* Non e' dei piu' lineari comunque il risultato che inverto i blocchi come stringa*/
int main() {
	char    *a,*c;
	int     i;
	int	k,n;
	FILE    *f;
 
	if ((f=fopen("topicprova.txt","r"))==FALSE){
		perror("'zarola non si apre il file!");
		exit(2);
	}
	n=ftell(f);
	rewind(f);
	printf("Eccomi qui io sono pronto....\n");
	getc(stdin);
	/*getc(stdin);*/
	/* Leggo
	 * Stampo a video
	 * Inverto i caratteri
	 * Torno un puntatore ad array */
	printf("\n---%p---\n",a);
	i=ReadPrintConvertRemoteBlock(&c,&a,0,f);
	printf("%d blocchi...\n",i);
	getc(stdin);
	printf("\n\n\n\n\n\n\n\n------------%p--------------\n\n\n\n\n\n\n\n\n",a);
	fwrite(a,SC,i*BlockSize,stdout);
	getc(stdin);
	printf("Ok, finish. Ho scritto sul disco remoto...\n");
	getc(stdin);
	free(a);
	free(c);
	fclose(f);
}	
-- 
Strhad
per stupire mezz'ora basta un libro di storia,
io cercai di imparare la Treccani a memoria... [F.d.A.]

no niente.... lasciate stare risolto....
facevo c=a 
ivece che *c=*a
......
(nell'esempio c'erano anche qualche altro piccolo errore... facendo le prove)
se qualcuno è interessato posso postare il codice corretto ^_^
