Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Parametri Funzione

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2002
    Messaggi
    143

    Parametri Funzione

    Ho in una funzione 8 blocchi di codice di circa 50 righe ciascuno, esattamente identici, tranne che per un parametro iniziale:

    if (sc->x!=sca->x+1 || sc->y!=sca->y) {
    ..blocco identico

    if (sc->x!=sca->x-1 || sc->y!=sca->y) {
    ..blocco identico

    if (sc->x!=sca->x || sc->y!=sca->y+1) {
    ..blocco identico

    .
    .
    .
    .
    e via dicendo,per 8 volte, fino a coprire tutto l' intorno del punto (x,y)

    Vorrei passare il valore di sca-> (che è quello che varia) come parametro di un' altra funzione, in modo da scrivere una volta il codice e richiamare 8 volte la funzione con parametro differente.

    La struttura a cui appartiene *sca è fatta così


    typedef struct NODE {

    int x;
    int y;
    struct QUEUE *succ;
    }NODO;


    Se volessi affidare il codice ripetitivo ad una funzione chiamata INTORNO, come dovrebbe esserne il prototipo, contando che al momento dell' utilizzo dovrebbe essere:

    INTORNO (x+1,y);
    INTORNO (x-1,y);
    INTORNO (x,y+1);
    INTORNO (x,y-1);
    INTORNO (x-1,y+1);
    INTORNO (x+1,y+1);
    INTORNO (x-1,y-1);
    INTORNO (x+1,y-1);

    e a seconda del parametro dovrebbe mettermi il valore giusto a destra di sca->



    Spero di essere stato chiaro

    Grazie

    Ciao
    Death to False Metal

  2. #2
    e qual'e' il problema?

    fai una funzione che riceve 2 valori interi coma parametri... se ti serve solo il numero, altrimenti usi le strutture.

    Non mi sembra molto difficile, ma se devo faccio il codice...

    ciauz
    #exclude <windows.h>
    Powered by Gentoo GNU/Linux
    Cos'e' l'impossibile se non una questione di tempo?
    Riesumare i post vecchi non e' sbagliato, e' una risposta o la continuazione di un thread. Meglio riesumare che creare di nuovi :]

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2002
    Messaggi
    143
    giusto il prototipo se hai tempo, grazie
    Death to False Metal

  4. #4
    bhe, allora si puo' fare in fretta, non che l'intera funzione occupasse molto + tempo

    presupponendo che sc e' locale alla funz chiamante:

    codice:
    void intorno (int scX, int scaX, int scY, int scaY)
    {
    	if (scX != scaX+1 || scY != scaY)
    	{
    		// codice da eseguire 
    	}
    }
    la richiami 8 volte cosi':
    codice:
    int x = sc->x, y = sc->y;
    
    intorno (x, sca->x-1, y, sca->y-1);
    intorno (x, sca->x,    y, sca->y-1);
    intorno (x, sca->x+1, y, sca->y-1);
    
    intorno (x, sca->x-1, y, sca->y);
    intorno (x, sca->x+1, y, sca->y);
    
    intorno (x, sca->x-1, y, sca->y+1);
    intorno (x, sca->x,    y, sca->y+1);
    intorno (x, sca->x+1, y, sca->y+1);
    spero sia cio' che volevi

    se non vuoi avere i parametri scX e scY, allora fai 2 variabili globali

    ciao
    #exclude <windows.h>
    Powered by Gentoo GNU/Linux
    Cos'e' l'impossibile se non una questione di tempo?
    Riesumare i post vecchi non e' sbagliato, e' una risposta o la continuazione di un thread. Meglio riesumare che creare di nuovi :]

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2002
    Messaggi
    143
    ok, ora funziona, graszie di tutto.

    Un ultima cosa....per cancellare ricorsivamente tutti gli elementi da una lista e metterli in un altra lista (l' ordine non importa), jo provato ad utilizzare questo codice

    codice:
    k=testacoda;  	
    
    if(scancoda->succ)
    	{
    		scancoda=testacoda->succ;
    		testacoda=scancoda;
    	
    		if (testacancella==NULL) {
    	    
    			ncancella=malloc (sizeof (struct FREELIST));
    			ncancella->x=k->x;
    			ncancella->y=k->y;
    			ncancella->succ=NULL;
    			testacancella=ncancella;
    			codacancella=ncancella; }
    
    
    		else {
    
                ncancella=malloc (sizeof (struct FREELIST));
        	    ncancella->x=k->x;
       	    ncancella->y=k->y;
                ncancella->succ=NULL;
    	    codacancella->succ=ncancella;
    	    codacancella=ncancella;
    	       
    		}
    	free(k);
    	}
    	    
    	else  {
    	  
    		testacoda=NULL; 
    }
    solo che in questo modo l' ultimo elemento non me lo leva dalla coda.

    Ho provato questo, modificando la prima parte:

    codice:
    k=testacoda;  	
    
    if(testacoda)
    	{
    	if (testacoda->succ) {
    	scancoda=testacoda->succ;
    	testacoda=scancoda;
    	}
    ....

    ma mi da errore, probabilmente perchè vado a leggere da puntatori che non esistono
    Death to False Metal

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.