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

    Vettore di puntatori

    Devo fare un vettore di puntatori a strutture senza però sapere quante strutture ho.
    Come si fa?
    La struttura si chiama contatto e il vettore stack.
    Ho provato facendo:

    struct contatto *punt, *stack;

    ma quando faccio:

    stack[sp]=*punt;
    /*** CODICE CODICE ***/
    punt=&stack[sp];

    non riesco a visualizzare i campi della struttura puntata da "punt"...forse che non punta a niente?
    grazie
    .r.
    AZYMUT official band site


    i'm not dead yet...
    ..but i'm working on it

  2. #2
    Devi far puntare punt a qualcosa!
    con
    punt = (tipoElem *)malloc(sizeof(tipoElem));
    allochi memoria nuova;
    con
    punt = &variabileGiàEsistente;
    lo fai puntare ad una variabile.

  3. #3
    credo che cerchi una struttura autopuntante.
    credo che puoi risolvere così:
    typedef struct nodolista{
    ind id;
    struct nodolista *next;
    } NODOLISTA;
    e dichiari la variabile con
    NODOLISTA nodo;

  4. #4

    ancora....

    Non ho capito come funziona la stuttura autopuntante...il fatto è che io ho delle strutture di tipo "contatto" e voglio creare un array di puntatori a tali strutture. Se faccio

    struct contatto *stack;

    Mi dà errore perchè non ho dichiarato la dimensione del vettore...il fatto è che io a priori non so quante saranno le strutture da allocare! Magari devo usare una malloc...ho provato a fare una cosa simile facendo

    malloc (sizeof(root)*numcontatti)

    dove "root" è una struttura di tipo "contatto" e "numcontatti" è la variabile che indica il numero di strutture allocate.
    Come posso fare? Dovrei usare meglio la malloc o devo proprio cambiare impostazione?
    grazie
    .r.
    AZYMUT official band site


    i'm not dead yet...
    ..but i'm working on it

  5. #5

    ancora....

    Non ho capito come funziona la stuttura autopuntante...il fatto è che io ho delle strutture di tipo "contatto" e voglio creare un array di puntatori a tali strutture. Se faccio

    struct contatto *stack;

    Mi dà errore perchè non ho dichiarato la dimensione del vettore...il fatto è che io a priori non so quante saranno le strutture da allocare! Magari devo usare una malloc...ho provato a fare una cosa simile facendo

    malloc (sizeof(root)*numcontatti)

    dove "root" è una struttura di tipo "contatto" e "numcontatti" è la variabile che indica il numero di strutture allocate.
    Come posso fare? Dovrei usare meglio la malloc o devo proprio cambiare impostazione?
    grazie
    .r.
    AZYMUT official band site


    i'm not dead yet...
    ..but i'm working on it

  6. #6

    SCUSATE....

    Scusate, ho sbagliato tasto e ho aperto una nuova discussione invece di rispondere a una già esistente....

    http://forum.html.it/forum/showthrea...hreadid=347073


    moderatori cancellateeeee!!!!
    AZYMUT official band site


    i'm not dead yet...
    ..but i'm working on it

  7. #7
    Ragazzo mio ti sei imbarcato nella cosa più difficile di tutta la programmazione e cioè puntatori a puntatori in c++ buona fortuna
    Il dubbio non è piacevole, ma la certezza è ridicola. Solo gli imbecilli son sicuri di ciò che dicono.

  8. #8

    OLEEEEEE

    CE L'HO FATTAAAAA!!! :mavieni: in culo ai puntatori!! :tongue:

    E' stato un po' un casino ma alla fine ha funzionato.....il giorno dopo, cioè oggi, ho scoperto che potevo sostituire tutta la funzione con sole tre righe di codice: due chiamate ricorsive e una printf....solo che non avendo studiato la parte di teoria non lo sapevo :gren:

    Non mi è chiara una cosa dell'esempio di bDaniele. Cosa ci faccio con quel "NODOLISTA" scritto alla fine della definizione della struct, prima del punto e virgola?
    E' come dichiarare una nuova struct di nome NODOLISTA?
    AZYMUT official band site


    i'm not dead yet...
    ..but i'm working on it

  9. #9
    Genius7115: il tuo intervento ha un non so che di inutilmente tragico per una cosa semplicissima.. :quipy:

    Figurehead, se i puntatori devono puntare a strutture gia` esistenti, c`e` prima di tutto un errore di fondo in cio` che hai scritto:

    malloc (sizeof(root)*numcontatti)

    dove "root" è una struttura di tipo "contatto" e "numcontatti" è la variabile che indica il numero di strutture allocate.
    Questo deve essere:

    codice:
    malloc( sizeof( root* ) * numcontatti );
    Ricorda che e` un array di puntatori, non di strutture..

    bDaniele accennava ad una lista, ma Figurehead mi e` parso chiedesse un array, anche se, a dire il vero, per una cosa del genere una lista sarebbe molto migliore, forse.

    Cmq ho scritto un codicino che riproduce quello che tu devi fare (per quanto ho capito):

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    #define ELEMENTI	3
    
    typedef struct
    {
    	int campoA;
    	char campoB;
    
    } struttura;
    
    int main( int argc, char* argv[] )
    {
    	struttura strutture[ ELEMENTI ] = { { 1, 'a' }, { 2, 'b' }, { 3, 'c' } };
    
    	unsigned i;
    
    	struttura** array = ( struttura** ) malloc( sizeof( struttura* ) * ELEMENTI );
    
    	for( i = 0; i < ELEMENTI; i++ )
    	{
    		array[ i ] = &strutture[ i ];
    
    		printf( "struttura[ %u ]: %d %c\n", i, strutture[ i ].campoA, strutture[ i ].campoB );
    		printf( "array[ %u ]    : %d %c\n", i, array[ i ]->campoA, array[ i ]->campoB );
    	}
    
    	free( array );
    
    	return 0;
    }
    Come vedi ho allocato delle 'strutture' (statiche) e poi le ho fatte puntare da un 'array' di puntatori a strutture, allocato con malloc().

    Se ti risulta intricato ri-posta qui.

    Figurehead, non "evitare" i puntatori. Ti potranno tornare utili in innumerevoli casi. E poi se non ti piacciono .. tanto vale che usi Java. :tongue:

    Ciao.

  10. #10
    Visto che il titolo del post tira in ballo il C++, per la serie, vediamo le differenze tra C e C++, propongo anch'io una possibile soluzione, in C++

    codice:
    #include <stack>
    #include <iostream>
    using namespace std;
    
    typedef struct{
    	int A, B;
    } struttura;
    
    typedef stack<struttura*> struct_stack;
    
    int main()
    {	
    	int a, b;
    	struttura * s;
    	struct_stack myStack;
    
    	cout << "inserire dei numeri (2 per linea)" << endl ;
    	cout << "input 0 0 per terminare" << endl;
    
    	do
    	{
    		cin >> a >> b;
    		if(a==0  && b == 0)s=NULL;
    		else
    		{
    			s = new struttura;
    			s->A = a;
    			s->B = b;
    			myStack.push(s);
    		}
    	}while (s != NULL);
    	cout << endl << "memorizzati in stack" << endl<< endl;
    	while(!myStack.empty ())
    	{
    		s = myStack.top(); myStack.pop(); 
    		cout << s->A << " " << s->B << endl;
    		delete s;
    	}
    	return 0;
    }
    Lo stack e' implementato nella libreria standard del C++, per cui e' inutile reinventare l'acqua calda (per i programmatori C++).

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.