Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    46

    [C++]passaggio per riferimento non andato a buon fine

    Salve..ho il seguente problema..

    due funzioni di cui la prima restituisce un puntatore a NODO che è una struct fatta in questo modo :

    typedef nodo NODO;

    struct nodo {
    NODO* next;
    NODO* prev;
    float key;
    };



    //------------------------------------
    NODO* init(float key){
    NODO* n = new NODO;
    n->key=key;
    n->next=n;
    n->prev=n;
    return n;
    }

    void list_insert(NODO* &lista,NODO* &x){

    lista=x;
    }



    //-------------------- Nel main ho una chiamata alla funzione list_insert fatta così :


    list_insert(A[0],init(ele1)); // con NODO* A[10] e float ele1;


    //al momento della chiamata mi appare questo errore :

    26 \main.cpp invalid initialization of non-const reference of type 'NODO*&' from a temporary of type 'NODO*'
    20 \list.h in passing argument 2 of `void list_insert(NODO*&, NODO*&)'


    errore che non mi viene dato se passo il secondo parametro per valore anzichè riferimento. Visto che comunque il secondo parametro è di ingresso/uscita (la seconda funzione non è quella che ho trascritta, la sto solo provando) necessito di passarla per riferimento.

    inoltre..se non faccio una chiamata annidata ovvero se faccio prima:

    NODO* provaele1=init(ele1);

    list_insert(A[0],provaele1);

    funziona tutto correttamente anche passando per riferimento il secondo parametro. Da cosa può dipendere?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Da quello che sono riuscito a capire (usa i tag code la prossima volta per postare il codice) se chiami la funzione in questione così

    codice:
    list_insert(A[0], init(ele1));
    non va e il compilatore ti dice

    codice:
    26 \main.cpp invalid initialization of non-const reference of type 'NODO*&' from a temporary of type 'NODO*'
    20 \list.h in passing argument 2 of `void list_insert(NODO*&, NODO*&';)'
    mentre invece così

    codice:
    NODO* provaele1= init(ele1);
    list_insert(A[0], provaele1);
    non hai problemi, giusto?

    Se è così, mi sembra anche abbastanza normale. Se la funzione list_insert() la definisci così

    codice:
    void list_insert(NODO* &lista,NODO* &x)
    quando la vai a richiamare, come secondo parametro devi passare necessariamente una variabile, non un valore costante, perché questo dovrà risultare modificabile all'interno della funzione (essendo un parametro di input/output). Per questo, se richiami la funzione così:

    codice:
    list_insert(A[0], init(ele1));
    verrà prima eseguita init(ele1) che restituirà un puntatore a NODO (es: 0x1234), e questo verrà passato come valore costante (letterale) alla funzione, risultando quindi non modificabile. Quindi o elimini il riferimento nel prototipo della funzione oppure ricorri alla soluzione che hai individuato tu stesso con una variabile da passare per riferimento.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    46
    ok..ma no ho capito perchè gli viene passato come valore costante alla funzione..qualcosa di banale mi sfugge

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Perché scrivere

    codice:
    list_insert(A[0], init(ele1));
    equivale a scrivere (se la funzione restituisce quel 0x1234 che dicevo come esempio)

    codice:
    list_insert(A[0], 0x1234);
    Avviene la chiamata a init() con ele1 come parametro e questa restituisce quel valore, il quale viene passato quindi come costante a list_insert(), laddove invece ci vorrebbe una variabile (in quanto il parametro viene passato per riferimento). Per questo motivo, nel momento in cui elimini il riferimento o ricorri ad una variabile l'errore non lo hai più, come hai notato tu stesso.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    46
    lo dicevo che era una fesseria che mi sfuggiva...
    grazie mille :-D

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    46
    altro problema forse banale...

    sempre con la stessa struttura NODO che è sopra

    se faccio


    NODO * p = new NODO [input];

    creo un array di tipo nodo? e p è un puntatore a tale array?

    quindi perchè non posso fare p[1]->key=5; ?

    mi dice

    main.cpp base operand of `->' has non-pointer type `nodo'

  7. #7
    Originariamente inviato da lastrom


    quindi perchè non posso fare p[1]->key=5; ?

    mi dice

    main.cpp base operand of `->' has non-pointer type `nodo'
    La notazione:
    codice:
    p [i]
    equivale a:
    codice:
    *(p + i)
    quindi, nel tuo caso, devi scrivere:
    codice:
    p [1].key = 5;
    ;-)

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    46
    scusami..ma potresti spiegarmi il motivo?
    non sto accedendo ad un record? e l'accesso non avviene con l'operatore "->"?

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    p è un puntatore ma p[1] è una struttura di tipo nodo

    Altrimenti devi scrivere

    (p+1)->fkey = 5.0;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Originariamente inviato da lastrom
    scusami..ma potresti spiegarmi il motivo?
    non sto accedendo ad un record? e l'accesso non avviene con l'operatore "->"?
    No, o perlomeno, non come erroneamente stai cercando di fare tu.

    Per accedere agli elementi di un tipo di dato strutturato su usa il "."
    "->" è una scorciatoia sintattica per accedere agli elementi di un dato strutturato avendone il suo indirizzo.

    Le seguenti quattro istruzioni sono equivalenti:
    codice:
    p [i].key = 5;
    (p + i)->key = 5;
    (*(p + i)).key = 5;
    (&p [1])->key = 5;
    Forse non ti è chiaro che con:
    codice:
    NODE * p = new NODO [input];
    non stai creando un array dinamico di puntatori a strutture, ma un array dinamico di strutture:
    ogni singolo elemento di p, non e' un puntatore, ma una struttura.

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.