Torna indietro   Hardware Upgrade Forum > Software > Programmazione

I nuovi schermi QD-OLED di quinta generazione di MSI, per i gamers
I nuovi schermi QD-OLED di quinta generazione di MSI, per i gamers
MSI continua ad investire nel proporre schermi pensati per rispondere alle esigenze dei videogiocatori, utilizzando la quinta generazione di tecnologia QD-OLED sviluppata da Samsung. Il modello MGP 341CQR QD-OLED X36 è lpultima novità al debutto in concomitanza con il CES 2026, uno schermo curvo di ampia risoluzione pensato per i videogiocatori più esigenti
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-05-2008, 11:44   #1
noodles83
Senior Member
 
L'Avatar di noodles83
 
Iscritto dal: Oct 2005
Città: Pisa
Messaggi: 1047
[C] argomento funzioni e vettori bidimensionali

Ho un enorme dubbio su come passare un vettore bidimensionale come argomenti di una funzione.

il punto è questo. Ho bisogno di creare un thread al quale passare un vettore bidimensionale la cui dimensione è inizializzata a tempo di esecuzione da 2 valori indicati dall'utente al momento dell'avvio del programma.


int *work_func(worldElement_t* tab);

int main(int argc, char* argv[]){

int rows, cols; /*inizializzate dall'utente*/
....
worldElement_t World[rows][cols];/*vettore in questione*/
....
pthread_create(tid,NULL,(void*)work_func,&World);
...

}


int *work_func(worldElement_t* tab){
.....
tab[i][j].stato=WATER;
.....
}

in tutte le righe dove faccio uso di tab in questo modo all'interno della work_func il compilatore mi da il seguente errore: error: subscripted value is neither array nor pointer

COsa vuol dire? Dove sbaglio?
__________________
Vendite concluse ottimamente con: Bastian UMTS, Tiscaliniano.
---------------------------------------------------------
1) Macbook Pro Core 2 Duo 2,16Ghz - 2GB di RAM - HD 160GB - Glossy Widescreen - 2°Gen
2) iPhone 3G - 8GB Black
3) Ipod Shuffle Blu 1GB
4) iMac 27" QuadCore i7

Ultima modifica di noodles83 : 22-05-2008 alle 12:38.
noodles83 è offline   Rispondi citando il messaggio o parte di esso
Old 22-05-2008, 12:15   #2
noodles83
Senior Member
 
L'Avatar di noodles83
 
Iscritto dal: Oct 2005
Città: Pisa
Messaggi: 1047
nessuno che mi può dare una mano a risolvere?
__________________
Vendite concluse ottimamente con: Bastian UMTS, Tiscaliniano.
---------------------------------------------------------
1) Macbook Pro Core 2 Duo 2,16Ghz - 2GB di RAM - HD 160GB - Glossy Widescreen - 2°Gen
2) iPhone 3G - 8GB Black
3) Ipod Shuffle Blu 1GB
4) iMac 27" QuadCore i7

Ultima modifica di noodles83 : 22-05-2008 alle 12:34.
noodles83 è offline   Rispondi citando il messaggio o parte di esso
Old 22-05-2008, 17:01   #3
Maverick-f14
Member
 
Iscritto dal: May 2008
Città: Napoli
Messaggi: 42
pthread_create(tid,NULL,(void*)work_func,&World);


quando passiamo ad una funzione/procedura C un vettore in realtà non passiamo il vettore stesso, ma il puntatore ad il primo elemento del vettore, quindi quando passi Word questo è già un indirizzo.

mettendo "&" non passi l'indirizzo del primo elemento del vettore, ma l'indirizzo dell'area di memoria dove c'è l'indirizzo del primo elemento del vettore ed è un errore. in altre palrole TOGLI "&"

in secondo luogo in C gli array bbidimensionali sono memorizzati come se fossero array monodimensionali. per capirci gli elementi sono messi tutti di seguito. QUINDI C'è BISOGNO KE TU GLI DICA QUANDO FINISCE UNA RIGA, quindi gli serve la dimensione massima. quindi:


la chiamata sara: funzione(ARG,ARG,World);

la signature della procedura TYPE NOME(TIPE ARG, TIPE ARG, TIPE World[][200]) //200 è un numero messo a caso


spero di essere stato kiaro... Saluti
Maverick-f14 è offline   Rispondi citando il messaggio o parte di esso
Old 22-05-2008, 18:17   #4
noodles83
Senior Member
 
L'Avatar di noodles83
 
Iscritto dal: Oct 2005
Città: Pisa
Messaggi: 1047
Quote:
Originariamente inviato da Maverick-f14 Guarda i messaggi
in secondo luogo in C gli array bbidimensionali sono memorizzati come se fossero array monodimensionali. per capirci gli elementi sono messi tutti di seguito. QUINDI C'è BISOGNO KE TU GLI DICA QUANDO FINISCE UNA RIGA, quindi gli serve la dimensione massima. quindi:


la chiamata sara: funzione(ARG,ARG,World);

la signature della procedura TYPE NOME(TIPE ARG, TIPE ARG, TIPE World[][200]) //200 è un numero messo a caso


spero di essere stato kiaro... Saluti
della "&" me ne sono reso conto pure io dopo, mio errore.
Rigurado all'array il mio problema è proprio questo... nella signature non ho modo di sapere quanto sarà lunga una riga a prescindere, perchè questo sarà un dato che verrà determinato ad esecuzione.

Se la modifico cosi, va bene uguale?

la signature della procedura TYPE NOME(TIPE ARG, TIPE ARG, TIPE** ARG)
/*ovviamente con il tipo corretto relativo a World*/
__________________
Vendite concluse ottimamente con: Bastian UMTS, Tiscaliniano.
---------------------------------------------------------
1) Macbook Pro Core 2 Duo 2,16Ghz - 2GB di RAM - HD 160GB - Glossy Widescreen - 2°Gen
2) iPhone 3G - 8GB Black
3) Ipod Shuffle Blu 1GB
4) iMac 27" QuadCore i7
noodles83 è offline   Rispondi citando il messaggio o parte di esso
Old 22-05-2008, 19:13   #5
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da noodles83 Guarda i messaggi
Rigurado all'array il mio problema è proprio questo... nella signature non ho modo di sapere quanto sarà lunga una riga a prescindere, perchè questo sarà un dato che verrà determinato ad esecuzione.
Se non è una grandezza statica, che è costante e conosciuta già al momento della compilazione, devi usare per forza grandezze dinamiche, quindi usa i puntatori.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 22-05-2008, 20:41   #6
Maverick-f14
Member
 
Iscritto dal: May 2008
Città: Napoli
Messaggi: 42
se nn vuoi utilizzare strutture dinamiche. l'unica soluzione è mettere nella signature della procedura questo:

TYPE procedura(arg arg..... TYPE World[][200], int col, int righe)

ovvero in base a quello ke fa il tuo programma decidi un intero tale ke come numero di colonne non possa essere superato ( il 200) e passa alla procedura i dati letti da STDINPUT.
Maverick-f14 è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2008, 15:38   #7
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da Maverick-f14 Guarda i messaggi
se nn vuoi utilizzare strutture dinamiche. l'unica soluzione è mettere nella signature della procedura questo:

TYPE procedura(arg arg..... TYPE World[][200], int col, int righe)

ovvero in base a quello ke fa il tuo programma decidi un intero tale ke come numero di colonne non possa essere superato ( il 200) e passa alla procedura i dati letti da STDINPUT.
A parte che mi sembra il compilatore non accetti il passaggio di matrici con diversa dimensione, se poi viene usata una matrice 10x20 e lui accede a World[3][2] che succede?
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2008, 16:09   #8
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Altrimenti potresti "emulare" la bidimensionalità e usare un semplice malloc:
Codice:
...
worldElement_t* world = (worldElement_t*)malloc( sizeof( worldElement_t ) * sizex * sizey);
...

void procedura( worldElement_t* matrix, size_t sizex, size_t sizey)
Quindi puoi accedere l'elemento nella matrice usando

Codice:
worldElement_t* element = matrix[ index_x + index_y * sizey ];
Quantomeno funziona
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2008, 16:13   #9
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Spesso faccio così infatti.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2008, 17:24   #10
noodles83
Senior Member
 
L'Avatar di noodles83
 
Iscritto dal: Oct 2005
Città: Pisa
Messaggi: 1047
purtroppo non è una dimensione che possono conoscere al momento della compilazione. Però una volta avviato il programma e scelta la dimensione durante l'esecuzione, questa poi non cambia. Quindi è da escludere che possa mettere a priori nella signature della funzione la lunghezza delle righe e sinceramente anche l'idea di mettere una limitazione a priori non mi piace.

L'unico modo mi sembra a questo punto usare per forza i puntatori.
Se non volessi emulare la matrice con una malloc è corretto scrivere questo?

/*signature della funzione*/
int *work_func(worldElement_t** tab);


int main(int argc, char* argv[]){

int rows, cols; /*inizializzate dall'utente*/
....
worldElement_t World[rows][cols]; /*vettore in questione con row e cols determinati una volta per tutte ad esecuzione prima dell'inizializzazione del vettore.*/
....
pthread_create(tid,NULL,(void*)work_func,World);
...

}


int *work_func(worldElement_t** tab){
.....
tab[i][j].stato=WATER; /*accedere al vettore passato*/
.....
}

compilando non ci sono problemi, devo ancora verificare l'esecuzione. Secondo voi è corretto?
__________________
Vendite concluse ottimamente con: Bastian UMTS, Tiscaliniano.
---------------------------------------------------------
1) Macbook Pro Core 2 Duo 2,16Ghz - 2GB di RAM - HD 160GB - Glossy Widescreen - 2°Gen
2) iPhone 3G - 8GB Black
3) Ipod Shuffle Blu 1GB
4) iMac 27" QuadCore i7
noodles83 è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2008, 17:28   #11
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Se stai scrivendo codice ANSI C non è codice standard. Puoi fare una malloc(larghezza * altezza * sizeof(tipodato)) ed accedere ad ogni singolo elemento prendendo l'indice (colonna + riga * NumeroColonne), come suggerito da Tommo.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2008, 18:34   #12
noodles83
Senior Member
 
L'Avatar di noodles83
 
Iscritto dal: Oct 2005
Città: Pisa
Messaggi: 1047
mi sa che alla fine farò cosi...

grazie.
__________________
Vendite concluse ottimamente con: Bastian UMTS, Tiscaliniano.
---------------------------------------------------------
1) Macbook Pro Core 2 Duo 2,16Ghz - 2GB di RAM - HD 160GB - Glossy Widescreen - 2°Gen
2) iPhone 3G - 8GB Black
3) Ipod Shuffle Blu 1GB
4) iMac 27" QuadCore i7
noodles83 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


I nuovi schermi QD-OLED di quinta generazione di MSI, per i gamers I nuovi schermi QD-OLED di quinta generazione di...
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
La Russia prosegue lo sviluppo di reatto...
Roscosmos: da quest'anno ci potrà...
Amazon, tutte le offerte e qualche novit...
Sedie gaming in offerta su Amazon: desig...
Scope elettriche in offerta Amazon: mode...
Ricarica EV fino a 22 kW spendendo poco:...
Costa solo 139€ ma fa tutto: Lefant M330...
Amazon Haul spinge sul risparmio: sconti...
Oral-B iO in offerta su Amazon: maxi sco...
I cosmonauti avrebbero riparato tutte le...
Artemis II: la NASA conferma il lancio d...
Il CEO di Embrak Studios difende l'uso d...
Il Trump Phone è sempre più un mistero: ...
OPPO ha svelato la serie Reno 15 "global...
Poste ID diventa a pagamento: l'identità...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 03:10.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v