Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C] array di strutture e funzioni

    Salve,

    Poniamo che io abbia una struttura definita in questo modo:

    Codice PHP:
    struct{
       
    int x;
       
    int y;
    }
    punto
    e nel main io abbia un array di punti:

    struct punto punti[100];

    ora io vorrei, in una mia rutine usare questo array... posso scrivere così?

    Codice PHP:
    void boh(struct punto punti[]){ 
    e soprattutto... in questa funzione, mi è lecito usare l'iesimo punto in questo modo?

    Codice PHP:
    punti[i].x=4
    punti[i].y=9
    grazie!!
    Programmazione .NET
    http://www.samueletosatto.tk

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    usa un puntatore nella funzione, un vettore è un puntatore al primo elemento

    cmq si, devi controllare però che esista l'i-esimo elemento

  3. #3
    dunque in sostanza va bene così?


    Codice PHP:
    void boh(struct punto punti[]){ 
    dovrebbe essere la stessa cosa di:

    Codice PHP:
    void boh(struct punto punti*){ 
    insomma per parlare del mio esempio, nel main io dovrei passare a boh

    Codice PHP:
    struct punto punti[100];
    boh(punti); 
    se è giusto così faccio i salti mortali... perchè ho scritto un codice lungo un casino, ma essendo che non sono pratico del c, solo dopo mi è saltato per il cervello sto dubbio, e dovrei cambiare tutto....
    Programmazione .NET
    http://www.samueletosatto.tk

  4. #4
    accidenti, ho quasi finito il codice... ho compilato, e la dichiarazione delle funzioni è giusta, però all'interno delle funzioni mi da errato scrivere

    struttura[i].membro

    e recita: invalid use of undefined type (che non ho idea di cosa voglia dire... la struttura l'ho dichiarata fuori dal main e prima di ogni altra cosa )
    Programmazione .NET
    http://www.samueletosatto.tk

  5. #5
    forse dovrei usare un array di puntatori a strutture... ma dovrei riscrivere tutto
    Programmazione .NET
    http://www.samueletosatto.tk

  6. #6
    No è DevC++ che fa schifo!!! non mi da errori da nessuna parte tranne che in questa funzione:

    Codice PHP:
    int prelevaIndice(int indicestruct palla urna[] ){//restituisce 1 se è possibile 0 se non lo è
        
    if((urna[indice].flag)){
            
    urna[indice].flag=1;
            return 
    1;
        }else{
            return 
    0;
        }
            

    dove ne da 10000 nella prima riga e nell'intestazione... tutte le altre funzioni, che ho scritto nella stessa identica maniera invece sembrano essere corrette -.-
    C'è qualcosa che non va e che io nn ho notato forse?
    Programmazione .NET
    http://www.samueletosatto.tk

  7. #7
    no mi fa così in tutte le funzioni, solo che lui le debugga in ordine e trova solo errori nella prima che vede... comunque... così nn funziona, che devo fare? dove ho sbagliato?
    Programmazione .NET
    http://www.samueletosatto.tk

  8. #8
    Posto tutto il codice...

    Codice PHP:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define N  4

    struct{
           
    int numero;
           
    int flag;
    }
    palla;
    struct{
           
    int numero;
           
    struct nodonext;//dopo
           
    struct nodoafter;//prima
    }nodo;
    int index(int iint j){
        return 
    j+i*N;   
    }
    int getC(int index){
        return 
    index%N;
    }
    int getR(int index){
        return 
    index/N;    
    }
    void freeNum(int quadrato[],struct palla urna[],int i,int j){//libera il numero voluto
         
    if(quadrato[index(i,j)]==-1)return;
         
    urna[quadrato[index(i,j)]].flag=0;
         
    quadrato[index(i,j)]=-1;
    }
    int prelevaIndice(int indicestruct palla urna[] ){//restituisce 1 se è possibile 0 se non lo è
        
    if((urna[indice].flag)){
            
    urna[indice].flag=1;
            return 
    1;
        }else{
            return 
    0;
        }
            
    }
    int prelevaNumero(int numero,struct palla urna[], int indiceUrna[] ){//restituisce 1 se è possibile 0 se non lo è
        
    prelevaIndice(indiceUrna[numero],urna);
    }

    int nextIndice(int indicestruct palla urna[]){//restituisce il primo indice libero, oppure alcun indice se non esiste.
        
    if (indice>N*N) return -1;
        if(!
    prelevaIndice(indiceurna)) return nextIndice(indice+1,urna);
        return 
    indice;
    }

    void freeSum(int quadrato[],struct palla urna[],int i,int j){//libera le somme di colonna di riga e di diagonale quando si cambia un numero
         
    freeNum(quadrato,urna,i,N);
         
    freeNum(quadrato,urna,N,j);
    }

    int sommaRiga(int istruct palla urna[], int indiceUrna[]){
        
    int x;
        
    int sum=0;
        
    int prova;
        for(
    x=0;x<N-1;x++){
           
    sum+=urna[quadrato[index(i,x)]].numero;
        }
        
    prova = (N*N*N+N)/2-sum;
        if( 
    prelevaNumero(numero,urna,indiceUrna)){
            
    quadrato[index(i,x)]=indiceUrna[prova];
            return 
    1;
            }
            else
            return 
    0;
          
    }
    int sommaColonna(int jstruct palla urna[], int indiceUrna[]){
        
    int x;
        
    int sum=0;
        
    int prova;
        for(
    x=0;x<N-1;x++){
           
    sum+=urna[quadrato[index(x,j)]].numero;
        }
        
    prova = (N*N*N+N)/2-sum;
        if( 
    prelevaNumero(numero,urna,indiceUrna)){
            
    quadrato[index(x,j)]=indiceUrna[prova];
            return 
    1;
            }
            else
            return 
    0;
    }
    int change(quadrato,urna,i,j){//cambia la cella voluta, ma se ha già provato tutte le condizioni ritorna 0
         
    quadrato[index(i,j)]++;
         
    int n =urna[quadrato[index(i,j)]];
        if(
    n>N*N) return 0;
        if(
    prelevaIndice(n,urna))
            return 
    1;
        else
        
    change(quadrato,urna,i,j);
    }
    int Rchange(quadrato,urnai,j){//prova combinazione per combinazione, ritorna 1 se quella testata era l'ultima combinazione possibile
       
    freeSum(quadrato,urna,i,j);
       if(
    change(quadrato,urna,i,j))
            return 
    0;
       else
         
    freeNum(quadrato,urna,i,j);
         
    i++;
         if(
    i==(N-1)){
           
    i=0;
           
    j++;
           if(
    j==N) return 1;//ho finito tutte le combinazioni possibili
        
    }
        return 
    Rchange(quadrato,urna,j,j);
             
    }
    void deleteNodo(nodolista){
        (
    lista->after)->next=lista->next;//nodoprima.next=nododopo;
        
    (lista->next)->after=lista->after;//nododopo.after=nodoprima;
        
    free(lista);
    }

    main(){
           
    struct palla urna[N*N];//contiene i numeri da 1 a N^2 da prelevare
           
    int n_urna=N*N;
           
    int i,j;
           
    int indiceUrna[N*N];//alla posizione i-esima troviamo dov'è il numero i nell'urna
           
    struct quadrato[N*N];//contiene il riferimento a un numero dell'urna...
           
    int num=0;
           
    int somma=0;
           
    int numero=0;
           
    //RIEMPIRE URNA IN MODO CASUALE
           
    for(i=0;i<N*N;i++){
             
    urna[i].numero=i;
             
    urna[i].flag=0;  
             
    quadrato[i]=-1;
           } 
           
           
    //RIEMPIRE QUADRATO CON -1
           
    for(i=0;i<N-1;i++){
                for(
    j=0;j<N-1;j++){
                                   
                                   
    //INSERIRE ANCHE IL CONTROLLO DI COLONNA
                     
    num=nextIndice(num,urna);
                     
    somma+=urna[num];
                     if(
    somma>(N*N*N+N)/N);//ESCI DAL CICLO E CAMBIA COMBINAZIONE CAZZO
                     
    if(num=-1);//DOVREBBE USCIRE DAL CICLO E CAMBIARE COMBINAZIONE
                     
    quadrato[index(i,j)]=num;
                          
                }
                
                if(
    prelevaNumero((N*N*N+N)/N-somma,urna,indiceUrna));//ESCI
                
    quadrato[i,j]=indiceUrna[(N*N*N+N)/N-somma];
           }
           while(!
    change(quadrato,i,j)){                      
           }
           
    //VISUALIZZARE
           
    system("pause");
           

    Programmazione .NET
    http://www.samueletosatto.tk

  9. #9
    Ho risolto usando una parola magica che non so neppure bene a cosa serva (credo di averlo intuito)... TYPEDEF ora è tutto a posto (e ho corretto un'altra miriade di errori )
    Programmazione .NET
    http://www.samueletosatto.tk

  10. #10
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    No è DevC++ che fa schifo!!
    Concordo.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.