Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di unit1
    Registrato dal
    Feb 2004
    Messaggi
    354

    [c] controllo dei cicli

    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!?!
    codice:
    #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?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    50
    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

  3. #3
    char *punt="ABC";
    Ti correggo io !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.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  4. #4
    Utente di HTML.it L'avatar di Fox82
    Registrato dal
    Feb 2002
    Messaggi
    459
    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

    codice:
    char* s = "Pippo";
    s[0] = 'B';
    si verifica un'errore di segmentation fault
    Linux user number 403381

    Stop TCPA!

  5. #5
    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
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  6. #6
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    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

    codice:
    char* s = "Pippo";
    s[0] = 'B';
    si verifica un'errore di segmentation fault
    E poi dicono che il C/c++ non è complicato :rollo:

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  7. #7
    Utente di HTML.it L'avatar di unit1
    Registrato dal
    Feb 2004
    Messaggi
    354
    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!!!

  8. #8
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Funziona anche in C..ma se è scritto bene...

    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,


    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  9. #9
    Utente di HTML.it L'avatar di unit1
    Registrato dal
    Feb 2004
    Messaggi
    354
    Quindi deve prima controllare b poi a

  10. #10
    Utente di HTML.it L'avatar di unit1
    Registrato dal
    Feb 2004
    Messaggi
    354
    Grazie per vostro aiuto, senza non avrei mai risolto!
    codice:
    #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!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.