struct in una cella di array bidimensionale

marcococ

Nuovo Utente
29
1
salve, ho dichiarato una struct , struct Figura Cerchio......la devo mettere in modo casuale in una cella di una matrice allocata dinamicamente ....la matrice in questione punta ad una struttura di celle... (ling.C)
qualche suggerimento?
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,210
1,845
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Qual è il problema che incontri esattamente?
Dovrai generare l'indice della riga e della colonna, e inserire l'elemento (che dovrà ovviamente essere allocato).
 

marcococ

Nuovo Utente
29
1
semplicemente lo scrivo ,ma lo scrivo in maniera sbagliata .....tipo questo...

matrice[rand()%lato+rand()%lato]= struct Cerchio ;
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,210
1,845
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
La matrice è rappresentata come array, o hai effettivamente N righe e M colonne?
Se il caso è il secondo stai sbagliando molte cose: prima di tutto così accedi alle righe, e inoltre sbagli ad assegnare.
In aggiunta, se la matrice non è quadrata, devi generare il numero utilizzando il valore corretto di righe e colonne.
 

marcococ

Nuovo Utente
29
1
la matrice è quadrata e l'ho creata allocandola dinamicamente cosi ....
matrice=malloc(righe*colonne*sizeof(struct Cella));
 

Andretti60

Utente Èlite
6,440
5,091
Non puoi assegnare una struttura a un’altra struttura, devo o cambiare la struttura originale o copiarne il contenuto.
 

Andretti60

Utente Èlite
6,440
5,091
Difficile risponderti se non sappiamo come sia dichiarata la variabile 'matrice' e cosa sia la "struttura di celle".
Sembra che tu stia facendo un poco di confusione (che e' normale, il linguaggio C e' ostico per questo tipo di cose)
E attento: se hai dichiarato la matrice come se fosse un puntatore di strutture di tipo Cella, non puoi poi usare una struttura diversa (come Cerchio)
Post unito automaticamente:

semplicemente lo scrivo ,ma lo scrivo in maniera sbagliata .....tipo questo...

matrice[rand()%lato+rand()%lato]= struct Cerchio ;

a parte che non puoi assegnare una struttura a un puntatore, l'indirizzamento che fai del vettore e' sbagliato.
 
  • Mi piace
Reazioni: DispatchCode

marcococ

Nuovo Utente
29
1
globalmente è dichiarata così:
static struct Cella *matrice= NULL ;

.......poi in una funzione la alloco diniamicamente..matrice=malloc(righe*colonne*sizeof(struct Cella)); ........
struct cella contiene invece due enum...
 

Andretti60

Utente Èlite
6,440
5,091
La allocazione e' esatta, ma il linguaggio C alloca solo memoria senza preoccuparsi di quello che ci metti. Se la variabile e' un puntatore a variabili di tipo Cella, NON puoi associare a loro una struttura di tipo diverso, punto. Ovvero, lo puoi fare, il linguaggio C non te lo impedisce, ma il programma non funzionera' mai. Questo e' uno dei grandi problemi del C, che e' anche il suo forte quando si scrivono programmi ottimizzati per l'accesso alla memoria (non per nulla e' ancora usato per applicazioni tipo database, device drivers e embedded)

Ad ogni modo: hai una memoria allocata, per elementi di tipo Cella.
Per accedere al puntatore del primo elemento, basta un: struct Cella *c = matrice;
Per accedere all'elemento [i,j] devi usare struct Cella *c = &matrice[i * colonne + j];
Una volta che hai il puntatore di un elemento, lo puoi cambiare come vuoi.
 

marcococ

Nuovo Utente
29
1
quindi se facessi
struct Cella *Ciccio= &scacchiera[2*lato+4];
in un ipotetica cella della scacchiare avrei una struct Cella , ed una struct Giocatore....ad esempio?

qui è dove ho dichiarato le struct , enum ecc...
Codice:
#ifndef GAMELIB_H
#define GAMELIB_H

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <unistd.h>
#include <math.h>


void gioca();
void crea_mappa();
void termina_gioco();




enum Tipo_pericolo{
  nessun_pericolo,
  trappola,
  alieno
};

enum Stato_giocatore{
  vulnerabile,
  scudo_vita,
  solo_vita,
  solo_scudo
};

enum Tipo_oggetto{
  nessun_oggetto,
  medikit,
  pozione,
  materiale,
  colpi_lanciarazzi
};

struct Giocatore {
    enum Stato_giocatore stato;
  int x;
  int y;
    unsigned short int zaino[3];
    unsigned int short uccisioni_alieni;
};

struct Cella{
  enum Tipo_pericolo pericolo;
  enum Tipo_oggetto oggetto ;
};


#endif


Qui Ciccio è una struct Giocatore, però se dichiaro una cosa del genere//struct Cella *Ciccio= &scacchiera[2*lato+4]// quando accedo agli elementi della struct come ad esempio ..... Ciccio->zaino[nessun_oggetto]=0; mi dà errore perchè "struct Cella’ has no member named ‘zaino’"
come posso fare per accedere in questo modo agli elementi e poterli quindi gestire ?
 

Andretti60

Utente Èlite
6,440
5,091
Quello che stai dicendo non ha assolutamente alcun senso.
Se la tua scacchiera è dichiarata come una matrice di tipo Cella, puoi accederla solo come elementi di tipo Cella, e basta.
Se dichiari un vettore di interi, puoi forse accedere ai suoi elementi come se fossero double, o string? Per piacere.
 

marcococ

Nuovo Utente
29
1
ok faccio confusione scusami, quindi è impossibile associare la struct giocatore ad una cella della matrice...........
 

Andretti60

Utente Èlite
6,440
5,091
Poiche' non ho idea di quello che il tuo programma debba fare, non ti posso rispondere.
Ma in genere NIENTE e' impossibile. Bisogna semplicemente organizzare bene i nostri dati, quella e' la prima cosa da fare quando si progetta un programma. Se si parte con il piede sbaglaito e' come costruire un grattacielo avendo le fondamenta di una capanna di paglia. Nel mio lavoro, organizzare come i dati vengano rappresentati occupa la maggior parte del tempo, il resto (programmare) e' facile.
 

Zeus Giove

Nuovo Utente
21
11
Tutto dipende da perché lo vuoi fare, quale vantaggio avresti nell'avere un array di un tipo dati che contenga informazioni di un altro tipo? Poi fattibile é fattibile, ma perdi l'uso della matrice in quei punti
 
Ultima modifica:

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili