Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta
DLSS 4.5 introduce Dynamic Multi Frame Generation e MFG 6X, permettendo fino a cinque frame generati per ogni frame renderizzato. I test su Cyberpunk 2077 e 007 First Light mostrano forti incrementi di FPS e riduzione della latenza su RTX 5090 Laptop. Migliorano fluidità, stabilità e qualità visiva.
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere)
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere)
Quattro modi di indossarlo, stessa app del Plaud Note Pro e integrazione con il desktop. Il registratore IA da indossare di Plaud eccelle in mobilità, ma resta vincolato all'abbonamento ed è facile da perdere
Redmi Watch 6 in prova: lo smartwatch con ampio display da 2000 nit a meno di 100 euro
Redmi Watch 6 in prova: lo smartwatch con ampio display da 2000 nit a meno di 100 euro
Xiaomi ha portato Redmi Watch 6 anche sul mercato italiano, puntando su un display AMOLED da 2,07 pollici con picco di luminosità a 2000 nit, frame in alluminio da 9,9mm e un'autonomia dichiarata di 12 giorni. Lo smartwatch gira su HyperOS 3 e integra GPS, Bluetooth 5.4 e oltre 150 sport mode. Il tutto a meno di 100 euro
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 01-01-2005, 16:11   #1
Passy
Senior Member
 
L'Avatar di Passy
 
Iscritto dal: Jul 2000
Città: Vignola (MO)
Messaggi: 316
[C] Errore su array di puntatori

Sto imarando a usare i C ma come tutti in novellini ho dei problemi con gli array di puntatori...
Come prima cosa copio l'indirizzo dell'indice di un array in un altro poi provo a far ciclare il nuovo array per stampare il valore appena copiato ma l'ultimo valore mi va in Segmentation fault... anche diminuendo il numero di cicli ma va in errore

Codice:
#include <stdio.h>
#include <stdlib.h>

void copy_array();

void copy_struct();

int main(int argc, char **argv) {
	
	copy_array();
	
	printf("-------------------\n");
	
	copy_struct();
	
	return 0;
}

void copy_array()
{
	char** array1;
	char** array2;
	int i;
	
	
	array1 = (char**)malloc( sizeof(char) * 20);
	array2 = (char**)malloc( sizeof(char) * 20);
	
	for (i = 0; i < 20; i++) {
		array1[i] = "prova";
		//array1[i] = strcpy(array1[i],array2[i]);
		array2[i] = (array1[i]);
		printf("%d %s\n",i);
	}
	
	for (i = 0; i < 20; i++) {
		printf("%d %s\n",i ,array2[i]);
	}
	
	free(array1);
	free(array2);

}

void copy_struct()
{
	typedef struct {
		int i;
		char* array[];
	} stru;
	
	stru* array1;
	stru* array2;
	int i;
	
	
	array1 = (stru*)malloc( sizeof(stru) + (sizeof(char)* 20));
	array2 = (stru*)malloc( sizeof(stru) + (sizeof(char)* 20));
	
	for (i = 0; i < 20; i++) {
		array1->array[i] = "prova1";
		//array1[i] = strcpy(array1[i],array2[i]);
		array2->array[i] = (array1->array[i]);
	}
	
	for (i = 0; i < 20; i++) {
		printf("%d %s\n",i ,array2->array[i]);
	}
	
	free(array1);
	free(array2);

}
Grazie per l'aiuto

Buon anno
__________________
<Asus A8N-E Deluxe> <Amd64 3000+> <Ram 2.5 Gb> <Geffo3> <2 Maxtor 160 Gb RAID 1> <Adsl ZyXEL 645r> <ESS Maestro>
<GNU/Linux Debian Etch>
Wii 1037 4238 6261 1967
Passy è offline   Rispondi citando il messaggio o parte di esso
Old 01-01-2005, 17:13   #2
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
innanzitutto buon anno!!!

per quanto riguarda il tuo problema direi che in copy_array() hai sbagliato a fare la malloc. se tu dichiari char **a; quello è un puntatore di puntatore che serve per realizzare un array di stringhe. facendo come hai scritto tu

a1= (char **) malloc (sizeof(char)*20);

è sbagliato perchè allochi spazio per 20 caratteri e non 20 puntatori a caratteri e poi casti a puntatore di puntatore. direi che si dovrebbe correggere in questo modo:

a1= (char **) malloc (sizeof(char *)*20);

in questo modo allochi spazio per 20 stringhe, ora però devi allocare spazio per ogni stringa, così

for (i=0; i<20; ++i) a1[i]= (char *) malloc (sizeof(char)*15);

in questo modo a1 è un array di stringhe composte da 15 caratteri.
per quanto riguarda la copy_struct() ora non ti posso aiutare sono ancora troppo intontito...
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 01-01-2005, 20:09   #3
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
ecco la versione funzionante del tuo programma. cmq ho anch'io una domanda da fare. la struttura stru contine un array di puntatori a caratteri di dimensione non fissata. ma proprio perchè la dimensione non è fissata, non si dovrebbe fare anche un

array1->array= (char **) malloc (sizeof(char)*n)??
Codice:
#include <stdio.h>
#include <stdlib.h>

void copy_array();

void copy_struct();

int main(int argc, char **argv) {
	
	copy_array();
	
	printf("-------------------\n");
	
	copy_struct();
	system("pause");	
	return 0;
}

void copy_array()
{
	char** array1;
	char** array2;
	int i;
	
	
	array1 = (char**) malloc (sizeof(char *) * 20);
	array2 = (char**) malloc (sizeof(char *) * 20);
	
	
	for (i = 0; i < 20; i++) {
        array1[i]= (char *) malloc (sizeof(char)*20);
        array2[i]= (char *) malloc (sizeof(char)*20);
		array1[i] = "prova";
		//array1[i] = strcpy(array1[i],array2[i]);
		array2[i] = (array1[i]);
		printf("%d %s\n",i, array1[i]);
	}
	
	for (i = 0; i < 20; i++) {
		printf("%d %s\n",i ,array2[i]);
	}
	
	free(array1);
	free(array2);

}

void copy_struct()
{
	typedef struct {
		int i;
		char* array[];
	} stru;
	
	stru* array1;
	stru* array2;
	int i;
	
	
	array1 = (stru*) malloc (sizeof(stru));
	array2 = (stru*) malloc (sizeof(stru));
	//array1->array= (char **) malloc (sizeof(char)*20);
	//array2->array= (char **) malloc (sizeof(char)*20);
	
	
	for (i = 0; i < 20; i++) {
        array1->array[i]= (char *) malloc (sizeof(char)*20);
        array2->array[i]= (char *) malloc (sizeof(char)*20);
		array1->array[i] = "prova1";
		//array1[i] = strcpy(array1[i],array2[i]);
		array2->array[i] = array1->array[i];
	}
	
	for (i = 0; i < 20; i++) {
		printf("%d %s\n",i ,array2->array[i]);
	}
	
	free(array1);
	free(array2);

}
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 02-01-2005, 22:42   #4
Passy
Senior Member
 
L'Avatar di Passy
 
Iscritto dal: Jul 2000
Città: Vignola (MO)
Messaggi: 316
Esatto grazie funziona!!!!
Per quanto riguarda la tua domanda... Pensavo che:
Codice:
char* pippo= "pippo";
char** pippo1;

pippo1 = pippo;
pippo1 prende l'indirizzo di pippo e può essere utilizzato... (almeno spero)
Stavo provando a fare una mappa (stile Hashtable di Java) e ho utilizzato un principio simile al programmino che ti ho fatto vedere, per adesso funziona () anche se non ho ancora provato a inserire molti record. Magari fra un pò mi accorco di un comportamente strano.

Se vuoi ti invio il codice

Grazie per la tua cortesia

Ciao a presto
__________________
<Asus A8N-E Deluxe> <Amd64 3000+> <Ram 2.5 Gb> <Geffo3> <2 Maxtor 160 Gb RAID 1> <Adsl ZyXEL 645r> <ESS Maestro>
<GNU/Linux Debian Etch>
Wii 1037 4238 6261 1967
Passy è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 07:53   #5
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
char* pippo= "pippo";
char** pippo1;

pippo1 = pippo;

Le istruzioni sono sbagliate...

Le stringhe non si dichiarano in quel modo ma così:

char pippo[]= "pippo";

pippo1 = pippo;

E' un assegnamento sbagliato...

Un assegnamento valido è:

pippo1 = &pippo;

Ma bisogna anche vedere il senso che vuoi dargli...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 10:23   #6
Passy
Senior Member
 
L'Avatar di Passy
 
Iscritto dal: Jul 2000
Città: Vignola (MO)
Messaggi: 316
Hai ragione ma il mio compilatore (gcc 3.3.4) mi da un warming quando scrivo

Codice:
	char* str1;
	char str[]="prova";
	
	str1 = &str;
	
	printf("%s \n", str1);
e non quando faccio:

Codice:
	char* str1;
	char str[]="prova";
	
	str1 = str; 
	
	printf("%s \n", str1);
e l'output è sempre lo stesso

Grazie ciao
__________________
<Asus A8N-E Deluxe> <Amd64 3000+> <Ram 2.5 Gb> <Geffo3> <2 Maxtor 160 Gb RAID 1> <Adsl ZyXEL 645r> <ESS Maestro>
<GNU/Linux Debian Etch>
Wii 1037 4238 6261 1967
Passy è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 11:32   #7
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Appunto...nel codice sopra avevi dichiarato
char ** str1;

L'assegnazione senza dereference va bene nell'ultimo codice che hai postato...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 11:53   #8
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Quote:
Originariamente inviato da cionci
Le stringhe non si dichiarano in quel modo ma così:

char pippo[]= "pippo";

perche non si puo diacharare una stringa cosi:

char* pippo= "pippo";


?
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 11:58   #9
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
Quote:
Originariamente inviato da cionci
pippo1 = pippo;

E' un assegnamento sbagliato...

Un assegnamento valido è:

pippo1 = &pippo;
scusa cionci ma pippo è stato dichiarato com un array, quindi in mmoria la variabil pippo conterrà un indirizzo. prchè quindi è sbagliato far qusto pippo1= pippo;?
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 12:01   #10
Passy
Senior Member
 
L'Avatar di Passy
 
Iscritto dal: Jul 2000
Città: Vignola (MO)
Messaggi: 316
Avrei un'altra domanda.
Che differenze ci sono nelle seguenti dichiarazioni?

Codice:
typedef struct {
        int i;
        char* array[];
} my_str;


typedef struct {
        int i;
        char* array[0];
} my_str;


typedef struct {
        int i;
        char** array;
} my_str;
Grazie
__________________
<Asus A8N-E Deluxe> <Amd64 3000+> <Ram 2.5 Gb> <Geffo3> <2 Maxtor 160 Gb RAID 1> <Adsl ZyXEL 645r> <ESS Maestro>
<GNU/Linux Debian Etch>
Wii 1037 4238 6261 1967
Passy è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 12:07   #11
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Quote:
Originariamente inviato da VegetaSSJ5
scusa cionci ma pippo è stato dichiarato com un array, quindi in mmoria la variabil pippo conterrà un indirizzo. prchè quindi è sbagliato far qusto pippo1= pippo;?
perche l'array è un puntatore a char, mentre pippo1 è stato dichairato come un puntatore a puntatore a char, quindi &pippo puo essere assegnato a pippo1, ma non pippo che e solo un puntatore e non un puntatore a puntatore
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 12:11   #12
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
Quote:
Originariamente inviato da anx721
perche l'array è un puntatore a char, mentre pippo1 è stato dichairato come un puntatore a puntatore a char, quindi &pippo puo essere assegnato a pippo1, ma non pippo che e solo un puntatore e non un puntatore a puntatore
ops! che sbadato non ci avevo fatto caso! ro convinto che pippo1 fosse stato dichiarato com puntator a char! pardon! ragazzi comunque ho una domanda a cui non è ancora stata data una risposta:
Quote:
cmq ho anch'io una domanda da fare. la struttura stru contine un array di puntatori a caratteri di dimensione non fissata. ma proprio perchè la dimensione non è fissata, non si dovrebbe fare anche un

array1->array= (char **) malloc (sizeof(char)*n)??
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 12:25   #13
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Quote:
cmq ho anch'io una domanda da fare. la struttura stru contine un array di puntatori a caratteri di dimensione non fissata. ma proprio perchè la dimensione non è fissata, non si dovrebbe fare anche un

array1->array= (char **) malloc (sizeof(char)*n)??[
Non so quale sia le''effetto di dichiarare un array senza specificarne la dimensione, che è cosa diversa dal passare un array come parametro formale nella definizione di una funzione. Se dichiari un array senza specificarne il numero di elementi, probabilmente il compilatore assume che si tratti d un array di una sola posizione o di zero..non lo so, di certo un array è uno spazio di memori aallocato staticamente, quindi non bisogna allocare la sua memoria con malloc, difatti l'indirizzo a cui punta un array è immodificabile e il compilatore non compilerebbe neppure
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 12:31   #14
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Quote:
typedef struct {
int i;
char* array[];
} my_str;


typedef struct {
int i;
char* array[0];
} my_str;


typedef struct {
int i;
char** array;
} my_str;
La differenza sta nel fato che la prima struttura dichiara il campo array come un array di dimensione non specificata (e non so cosa questo comporti) di puntatori a char; una volta creata la struttura bisogna allocare memoria per ciasuno delgli elementi puntati dall'array; la seconda dichiarazione definisce array come un array di zero elementi di puntatori a char...mentre la terza definisce array come un puntatore a puntatore a char: una volta istanziata la struttura bisogna far puntare array a un altra variabile char** o bisogna istanziare esplicitamente la memroia con malloc per creare l'array dinamicamente, e poi utulizzare sempre la malloc per allocare memria per ogni elemento dell'array.
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 12:32   #15
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
Quote:
Originariamente inviato da anx721
Non so quale sia le''effetto di dichiarare un array senza specificarne la dimensione, che è cosa diversa dal passare un array come parametro formale nella definizione di una funzione. Se dichiari un array senza specificarne il numero di elementi, probabilmente il compilatore assume che si tratti d un array di una sola posizione o di zero..non lo so, di certo un array è uno spazio di memori aallocato staticamente, quindi non bisogna allocare la sua memoria con malloc, difatti l'indirizzo a cui punta un array è immodificabile e il compilatore non compilerebbe neppure
e infatti se viene fatta la malloc su un array il compilator non compila. cmq guarda la struttura stru: essa al suo interno contine questa dichiarazion:

char* array[];

quanti lmenti può contner quell'array? di sicuro non uno visto che s compili il programma in qull'array vengono contnute 20 stringhe.
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 15:47   #16
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da anx721
perche non si puo diacharare una stringa cosi:

char* pippo= "pippo";


?
Si può fare anche così, ma è più sicuro fare la dichiarazione e l'inizializzazione come ho fatto io...almeno io ho sempre preferito usare questo metodo...

Nel modo sopra la zona di memoria puntata da pippo può essere modificata con un semplice assegnamento...e quindi poterbbe creare notevoli problemi...spesso molto difficili da scovare...

char pippo[] = "pippo";

Inizializzando così si ha un errore in caso si cerchi di assegnare un altro indirizzo al puntatore...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2005, 11:51   #17
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Qualcuno è riuscito a capire cosa fa il compilatore se si dichiara un campo array di lunghezza non specificata in una struttura ? Per le variabili il compilatore (mingw) dà errore, ma nelle struct lo accetta; ma forse non appartiene neppure a nessuno standard...
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2005, 11:58   #18
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
secondo me va a scrivere in una zona casuale dello spazio di memoria del programma. questa è una mia ipotesi ma sicuramente avrò detto una cacchiata...
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta DLSS 4.5: con Dynamic Frame Generation e MFG 6X ...
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere) Plaud NotePin S, il registratore IA si fa indoss...
Redmi Watch 6 in prova: lo smartwatch con ampio display da 2000 nit a meno di 100 euro Redmi Watch 6 in prova: lo smartwatch con ampio ...
Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ...
Radeon RX 9070 GRE, AMD la porta in tutto il mondo | Recensione Gigabyte Gaming OC Radeon RX 9070 GRE, AMD la porta in tutto il mon...
Quobly raccoglie 115 milioni di euro per...
BYD batte sul tempo Tesla Roadster: avvi...
Le auto volanti (elettriche) in Cina son...
Senua è il sequel di Hellblade II...
La Commissione europea taglia le bollett...
Halo: Campaign Evolved, annunciata la da...
Sega rilancia Crazy Taxi con World Tour:...
Pagare per avere meno: Brave Origin vuol...
L'italiana Bending Spoons sbarca a Wall ...
Have I Been Pwned tocca quota 1000 data ...
Microsoft conferma la nuova uscita di Fa...
WWDC 2026 è oggi: come seguire il keynot...
L'IA cambia Internet: i bot superano il ...
DeepSeek V4 Pro supera GPT 5.5 Pro: nei ...
Destiny 2 sta per morire, la community s...
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: 16:28.


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