PDA

Visualizza la versione completa : [c] controllo dei cicli


unit1
02-09-2004, 09:42
non sono un programmatore esperto ma, avendo visto come fare un ciclo di una striunga su un manuale volevo provare a duplicarlo in modo che ogni combinazione si possa verificare.

Non capisco perche ma non funziona!?!



#include<stdio.h>

char *punt="ABC";

void uno(){
int a=0;
do{
printf("%c\n",*(punt+a));
++a;
}while(*(punt+a));
}

void due(){
int a=0;
int b=0;
do{
do{
printf("%c%c\n",*(punt+a),*(punt+b));
++b;
}while(*(punt+a));
++a;
}while(*(punt+b));
}


void main(){

uno();
due();
}


qualcuno pu spiegarmi perche do o whilw non fanno il lavoro che mi aspettavo?

teoplc
02-09-2004, 10:42
Non puoi assegnare una stringa ad un puntatore (char *punt="ABC";)

ma (char str[DIM_MAX]="ABC";)

poi dichiari il puntatore (char *punt;)

e in fine fai una assegnazione tra puntatori (punt=str;)

in questo modo punt e un puntatore che punta alla prima componente della stringa str....

Correggetemi se sbaglio

unomichisiada
02-09-2004, 10:50
char *punt="ABC";
Ti correggo io :zizi: !L'assegnazione sopra perfettamente valida ed del tutto simil alla lista di inizializzazione di un'array (quella fatta con le graffe),il compilatore capisce che defve allocare il numero di caratteri corretto pre punt,provare per credere.

Fox82
02-09-2004, 11:25
L'unica differenza che dichiarando un vettore allochi normalmente memoria e quindi puoi modificare la stringa dichiarata.

Nel caso di un puntatore la memoria allocata read-only, quindi la stringa "costante".

Per esempio nella situazione seguente



char* s = "Pippo";
s[0] = 'B';


si verifica un'errore di segmentation fault

unomichisiada
02-09-2004, 13:18
L'unica differenza che dichiarando un vettore allochi normalmente memoria e quindi puoi modificare la stringa dichiarata.
Umilmente ammetto che questo non lo sapevo neppure io,o almeno non me ne ricordavo,non si finisce mai di imparare.
Ciao

anx721
02-09-2004, 13:21
Originariamente inviato da Fox82
L'unica differenza che dichiarando un vettore allochi normalmente memoria e quindi puoi modificare la stringa dichiarata.

Nel caso di un puntatore la memoria allocata read-only, quindi la stringa "costante".

Per esempio nella situazione seguente



char* s = "Pippo";
s[0] = 'B';


si verifica un'errore di segmentation fault

E poi dicono che il C/c++ non complicato :rollo:

unit1
03-09-2004, 09:19
ma perch while(*(punt+b)); non fa il suo lavoro?

cio ripetere il ciclo punt+a fino a che non incontra \0

in perl funziona! con un semplice for!!! :dh: :cry:

anx721
03-09-2004, 12:59
Funziona anche in C..ma se scritto bene... :nonlodire

Tu hai scritto:

do{
printf("%c%c\n",*(punt+a),*(punt+b));
++b;
}while(*(punt+a));

il che significa che continui a stampare *(punt+b) ad ogni iterazione finche *(punt+a) non nullo...ma ad ogni iterazione incrementi b e non a, cosi b scorre la stringa mentre a punta sempre all'inizio e non mai null, quindi con b vai fuori dalla stringa producendo l'errore,

:ciauz:

unit1
14-09-2004, 12:43
Quindi deve prima controllare b poi a

unit1
15-09-2004, 12:40
Grazie per vostro aiuto, senza non avrei mai risolto!


#include<stdio.h>

char *punt="ABC";

void uno(){
int a=0;
do{
printf("%c\n",*(punt+a));
++a;
}while(*(punt+a));
}

void due(){
int a=0;
int b=0;
do{
do{
printf("%c%c\n",*(punt+a),*(punt+b));
++b;
}while(*(punt+b));b=0; //dopo aver invertito a e b ho fatto in modo che
++a; //ad ogni ciclo di a, b si azzerasse.
}while(*(punt+a)); //Ci sono stato mesi par capire perch!
}

main(){//il mio new compilatore non vuole void

uno();
due();
}



Grazie 1000, anx721!

Loading