Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Opera Neon: il browser AI agentico di nuova generazione
Opera Neon: il browser AI agentico di nuova generazione
Abbiamo provato il nuovo web browser con intelligenza artificiale della serie Opera accessibile tramite abbonamento. Ecco le nostre prime impressioni sulle funzionalità di Opera Neon basate su AI e come funzionano
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Con la prima rete 5G Standalone attiva in Italia, WINDTRE compie un passo decisivo verso un modello di connettività intelligente che abilita scenari avanzati per imprese e pubbliche amministrazioni, trasformando la rete da infrastruttura a piattaforma per servizi a valore aggiunto
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro punta a diventare uno dei riferimenti assoluti nel segmento dei camera phone di fascia alta. Con un teleobiettivo Hasselblad da 200 MP, una batteria al silicio-carbonio da 7500 mAh e un display da 6,78 pollici con cornici ultra ridotte, il nuovo flagship non teme confronti con la concorrenza, e non solo nel comparto fotografico mobile. La dotazione tecnica include il processore MediaTek Dimensity 9500, certificazione IP69 e un sistema di ricarica rapida a 80W
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 30-08-2008, 16:09   #1
Composition86
Senior Member
 
L'Avatar di Composition86
 
Iscritto dal: Jul 2005
Messaggi: 406
[C]Alcuni dubbi sulle strutture

Sto tentando di far funzionare il seguente programma:
Codice:
#include <stdio.h>

struct part { 
   int partNumber;
   char *partName[25];
};

typedef struct part Part; 

main()
{
   struct part a;
   char pause;
      
   printf ("Inserire un numero ed una stringa:\n");
   scanf ("%d%s", &a.partNumber, &a.partName);
   printf ("%d e %s", a.partNumber, *a.partName);
   
   printf ("\nPremere una lettere per terminare il programma.\n");
   scanf ("%c", &pause);
   return 0;
}
Purtroppo non riesco ad immagazzinare un numero ed una stringa, come richiesto dal gruppo di istruzioni centrale, nonostante penso che la sintassi di scanf e printf sia corretta. Qualche idea?


Inoltre mi sapete dire per quale motivo nella riga
Codice:
  printf ("%d e %s", a.partNumber, *a.partName);
non è necessario l'asterisco per il numero mentre è necessario per poter visualizzare la stringa?
Il mio libro per le stringhe utilizza 3 diverse notazioni (le ultime due utilizzano un puntatore alla struttura), tutte PRIVE di asterisco iniziale:
Codice:
   printf ("%s", a.partName);
   printf ("%s", ptr->partName);
   printf ("%s", (*ptr).partName);
Composition86 è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2008, 17:56   #2
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da Composition86 Guarda i messaggi
Codice:
struct part { 
   int partNumber;
   char *partName[25];
};
Attenzione... qui cosa stai dichiarando? Un'array statica di 25 caratteri? Un puntatore ad una zona di memoria allocata per 25 caratteri? 25 puntatori a memoria allocata per un puntatore a caratteri? A te riconoscere cos'è.

Morale della favola: mi sa che hai usato un asterisco in più.
__________________

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 30-08-2008, 18:03   #3
Composition86
Senior Member
 
L'Avatar di Composition86
 
Iscritto dal: Jul 2005
Messaggi: 406
La mia idea era di utilizzarlo come un vettore che potesse contenere una stringa ed in effetti, così come l'ho definito, ne dovrebbe poter contenere 25, cosa inutile.
L'ho corretto in:
char partName
eliminando anche l'asterisco dalla scanf, ma il programma continua a bloccarsi.
Composition86 è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2008, 18:37   #4
sirus
Senior Member
 
Iscritto dal: Mar 2004
Messaggi: 16053
Codice:
#include <stdio.h>
#include <stdlib.h>

struct part {
	int partNumber;
	char partName[25];
};

int main(int argc, char **argv) {
	struct part p;

	scanf("%d", &p.partNumber);
	scanf("%s", p.partName);
	printf("\nPart Number:\t%d", p.partNumber);
	printf("\nPart Name:\t%s", p.partName);
	printf("\n");

	return 0;
}
Una variabile dichiarata come:
Codice:
char *partName[25];
è un array di 25 puntatori a carattere, potenzialmente può contenere fino a 25 stringhe ma devi allocare dinamicamente lo spazio necessario per contenerle. Invece una variabile dichiarata come:
Codice:
char partName[25];
è una stringa da 24 caratteri (il 25° è il terminatore).

PS: utilizzare typedef e poi usare struct <nomestruttura> non ha molto senso.
sirus è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2008, 19:54   #5
Composition86
Senior Member
 
L'Avatar di Composition86
 
Iscritto dal: Jul 2005
Messaggi: 406
Purtroppo queste strutture mi stanno dando parecchi grattacapi, è l'ultimo argomento che devo affrontare per l'esame, ma che fatica.

Si, ho corretto tutto ed ho capito le varie differenze, ma purtroppo il programma da te postato mi da' ancora il classico errore di XP!
Ed inoltre mi spieghi perchè ad una scanf hai utilizzato l'ampersand ed all'altra no?

Ultima modifica di Composition86 : 30-08-2008 alle 19:58.
Composition86 è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2008, 20:24   #6
marko.fatto
Senior Member
 
L'Avatar di marko.fatto
 
Iscritto dal: Jul 2007
Messaggi: 499
perchè partName è già un puntatore a carattere (al primo di 25)
__________________
marko.fatto è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2008, 23:47   #7
Composition86
Senior Member
 
L'Avatar di Composition86
 
Iscritto dal: Jul 2005
Messaggi: 406
Quote:
Originariamente inviato da marko.fatto Guarda i messaggi
perchè partName è già un puntatore a carattere (al primo di 25)
Ok, grazie.


Vorrei aggiungere un po' di domande, ammetto che sto trovando l'argomento strutture un po' complicato.
Sto cercando di realizzare un programma (ancora incompleto) che mi archivi i dati di 5 persone, cioè nome cognome ed età:
Codice:
//Gestione di un archivio di persone
#include <stdio.h>

struct persona {
   char *nome[5]; 
   char *cognome[5];
   int *eta[5];
};

typedef struct persona Persona;

struct persona dati[5];

void chiediDati (Persona *);

main()
{
   char pause;
   int i;
   
   printf ("Verranno ora richiesti i dati anagrafici relativi a 5 persone\n\n");
   
   for (i = 0 ; i <= (5 - 1) ; i++) {
      printf ("Inserire nome\n");
      scanf ("%s", (*dati).nome);
      printf ("Inserire cognome\n");
      scanf ("%s", (*dati).cognome);
      printf ("Inserire eta'\n");
      scanf ("%d", &(*dati).eta);
   }
   
   for (i = 0 ; i <= (5 - 1) ; i++) {
      printf ("Dipendente %d", i);
      printf ("Nome: %s",(*dati).nome );
      printf ("Cognome: %s",(*dati).cognome);
      printf ("Eta': %d", (*dati).eta);
   }
   
   
   printf ("Inserire una lettera per terminare");
   scanf ("%c", &pause);
   return 0;
Ma qui ho veramente tanti dubbi;
1) La struttura: al suo interno compaiono due vettore di 5 puntatori a carattere che mi servono per nome e cognome ed un vettore di 5 puntatori a numero per l'età: è corretto?
2) Il primo ciclo for: funziona correttamente, ma per puro caso, in quanto ho dovuto introdurre quegli asterischi nelle scanf, andando contro ciò che mi sembrava di aver capito dalla teoria: mi potreste spiegare a cosa servono e se si può avere un'altra forma che non ne faccia uso?
3) Il secondo ciclo for: non funziona e non ho idea sul come farlo funzionare. Se uso la forma del tipo
Codice:
printf ("Nome: %s", dati.nome );
printf ("Cognome: %s",dati.cognome);
printf ("Eta': %d", dati.eta);
senza parentesi ed asterischi ho un errore di questo tipo:
request for member `nome' in `dati', which is of non-aggregate type `persona[5]'

Ditemi voi, la confusione è abbastanza.
Composition86 è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2008, 00:08   #8
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Aspetta, mi sa che stai facendo casino con i tipi. Una struttura non fa altro che definire un'area di memoria che è "strutturata" in diversi campi. Definisci la strutturazione dei campi e i tipi che questi contengono, e poi definisci la struttura intera come fosse una variabile comune. Solo, i singoli campi li leggi accedendo al loro nome con la forma "variabile.campo". Se hai un puntatore alla struttura, o la dereferenzi esplicitamente ("(*variabile).campo") o usi l'operatore freccia ("variabile->campo").
Codice:
struct esempio
{
    int numero;
    char stringacorta[10];
};

int main()
{
    struct esempio *var1;
    struct esempio var2;

    var2.numero = 123;
    var2.stringacorta = "Ciao!";
    var1 = &var2;

    printf("%s\n", var2.stringacorta);
    printf("%d\n", var1->numero);
    return 0;
}
Poi, le stringhe in C sono semplicemente zone contigue di memoria contenenti caratteri: quando ne conosci a priori la dimensione massima, puoi usare un'array statica (char stringa[dimensione]), altrimenti devi ricorrere ai puntatori (char *stringa = malloc(dimensione * sizeof(char))). Ciò che facevi prima (e che hai ripetuto nel tuo ultimo pezzo di codice) è stato definire un'array di puntatori a caratteri come campo della struttura, il che non ha molto senso nell'esempio che hai postato.
__________________

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 31-08-2008, 10:16   #9
sirus
Senior Member
 
Iscritto dal: Mar 2004
Messaggi: 16053
Quote:
Originariamente inviato da Composition86 Guarda i messaggi
Si, ho corretto tutto ed ho capito le varie differenze, ma purtroppo il programma da te postato mi da' ancora il classico errore di XP!
Su Windows non ho provato ma su Linux non mi ha dato problemi e sinceramente fatico a trovare un possibile problema in quel programma (a meno di un inserimento errato dei dati visto che la scanf non è proprio la funzione più sicura).

Quote:
Originariamente inviato da Composition86 Guarda i messaggi
Ed inoltre mi spieghi perchè ad una scanf hai utilizzato l'ampersand ed all'altra no?
Il concetto è semplice.
Alla scanf tu devi passare un parametro (o più di uno) in scrittura. Per realizzare questo tipo di passaggio di parametro in C è necessario ricorrere al passaggio per indirizzo. Il simbolo & davanti ad una variabile semplice significa “prendi l’indirizzo di memoria di questa variabile”, se con una variabile di tipo int ha senso, con una variabile di tipo array di char (ma in generale con qualsiasi tipo di array) non ha senso dato che il nome con cui ti riferisci all’array (nel nostro caso partName) indica già un indirizzo di memoria.
Se invece di aver acquisito una stringa con la scanf avessi voluto acquisire un singolo caratteri avrei scritto:
Codice:
scanf(“%c”, &partName[0]);
in questo caso il simbolo & è necessario perché con partName[0] mi riferisco ad una precisa cella di memoria mentre con partName ad un indirizzo.

Quote:
Originariamente inviato da Composition86 Guarda i messaggi
Ma qui ho veramente tanti dubbi;
1) La struttura: al suo interno compaiono due vettore di 5 puntatori a carattere che mi servono per nome e cognome ed un vettore di 5 puntatori a numero per l'età: è corretto?
2) Il primo ciclo for: funziona correttamente, ma per puro caso, in quanto ho dovuto introdurre quegli asterischi nelle scanf, andando contro ciò che mi sembrava di aver capito dalla teoria: mi potreste spiegare a cosa servono e se si può avere un'altra forma che non ne faccia uso?
3) Il secondo ciclo for: non funziona e non ho idea sul come farlo funzionare. Se uso la forma del tipo
Codice:
printf ("Nome: %s", dati.nome );
printf ("Cognome: %s",dati.cognome);
printf ("Eta': %d", dati.eta);
senza parentesi ed asterischi ho un errore di questo tipo:
request for member `nome' in `dati', which is of non-aggregate type `persona[5]'

Ditemi voi, la confusione è abbastanza.
Intanto rivedrei un po’ il codice...
Codice:
#include <stdio.h>

struct persona {
   char nome[25]; 
   char cognome[25];
   int eta;
};

struct persona dati[5];

main() {
   char pause;
   int i;
   
   printf ("Verranno ora richiesti i dati anagrafici relativi a 5 persone\n\n");
   
   for (i = 0; i < 5; i++) {
      printf ("Inserire nome\n");
      scanf ("%s", dati[i].nome);
      printf ("Inserire cognome\n");
      scanf ("%s", dati[i].cognome);
      printf ("Inserire eta\n");
      scanf ("%d", &dati[i].eta);
   }
   
   for (i = 0; i < 5; i++) {
      printf("Dipendente %d\n", i);
      printf("Nome: %s\n", dati[i].nome );
      printf("Cognome: %s\n", dati[i].cognome);
      printf("Eta': %d\n", dati[i].eta);
   }
   
   
   printf ("Inserire una lettera per terminare");
   scanf ("%c", &pause);
   return 0;
}
dichiarare una struttura dati come quella che avevi scritto per un caso del genere non aveva senso, come prima, utilizzare typedef e poi struct <nomestruttura> non ha senso, tranto vale evitare il typedef, (1) non capisco perché ti accanisci nell’utilizzare i puntatori anche quando non è necessario (a meno che non è l’esercizio che te lo chiede, in tal caso dovresti ricorrere all’allocazione dinamica). Alle altre domande ti ha già risposto DanieleC88.
sirus è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2008, 12:03   #10
Composition86
Senior Member
 
L'Avatar di Composition86
 
Iscritto dal: Jul 2005
Messaggi: 406
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Aspetta, mi sa che stai facendo casino con i tipi. Una struttura non fa altro che definire un'area di memoria che è "strutturata" in diversi campi. Definisci la strutturazione dei campi e i tipi che questi contengono, e poi definisci la struttura intera come fosse una variabile comune. Solo, i singoli campi li leggi accedendo al loro nome con la forma "variabile.campo". Se hai un puntatore alla struttura, o la dereferenzi esplicitamente ("(*variabile).campo") o usi l'operatore freccia ("variabile->campo").

Poi, le stringhe in C sono semplicemente zone contigue di memoria contenenti caratteri: quando ne conosci a priori la dimensione massima, puoi usare un'array statica (char stringa[dimensione]), altrimenti devi ricorrere ai puntatori (char *stringa = malloc(dimensione * sizeof(char))). Ciò che facevi prima (e che hai ripetuto nel tuo ultimo pezzo di codice) è stato definire un'array di puntatori a caratteri come campo della struttura, il che non ha molto senso nell'esempio che hai postato.
Ok, stiamo già risolvendo qualche dubbio.

Quote:
Originariamente inviato da sirus Guarda i messaggi
Su Windows non ho provato ma su Linux non mi ha dato problemi e sinceramente fatico a trovare un possibile problema in quel programma (a meno di un inserimento errato dei dati visto che la scanf non è proprio la funzione più sicura).
Ieri era il dev che faceva casini (mi capita che esegue la versione precedente dello stesso programma, anche se non "dovrebbe" più essercene traccia in memoria): tutti e due i programmi funzionano a dovere, adesso ho qualcosa con cui confrontare.
Quote:
Il concetto è semplice.
Alla scanf tu devi passare un parametro (o più di uno) in scrittura. Per realizzare questo tipo di passaggio di parametro in C è necessario ricorrere al passaggio per indirizzo. Il simbolo & davanti ad una variabile semplice significa “prendi l’indirizzo di memoria di questa variabile”, se con una variabile di tipo int ha senso, con una variabile di tipo array di char (ma in generale con qualsiasi tipo di array) non ha senso dato che il nome con cui ti riferisci all’array (nel nostro caso partName) indica già un indirizzo di memoria.
Se invece di aver acquisito una stringa con la scanf avessi voluto acquisire un singolo caratteri avrei scritto:
Codice:
scanf(“%c”, &partName[0]);
in questo caso il simbolo & è necessario perché con partName[0] mi riferisco ad una precisa cella di memoria mentre con partName ad un indirizzo.
Ok, questa parte adesso è chiara.

Quote:
dichiarare una struttura dati come quella che avevi scritto per un caso del genere non aveva senso, come prima, utilizzare typedef e poi struct <nomestruttura> non ha senso, tranto vale evitare il typedef, (1) non capisco perché ti accanisci nell’utilizzare i puntatori anche quando non è necessario (a meno che non è l’esercizio che te lo chiede, in tal caso dovresti ricorrere all’allocazione dinamica). Alle altre domande ti ha già risposto DanieleC88.
Si, sto cercando di fare degli esercizi in cui utilizzo un po' di tutto. Qui l'obiettivo iniziale era usare le funzioni e la chiamata per riferimento, quindi i puntatori. Ammetto che stavo anche facendo casino.


Adesso vedo se riesco a sfruttare i vostri consigli.
Vi ringrazio per l'enorme aiuto!
Composition86 è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2008, 15:00   #11
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da Composition86 Guarda i messaggi
Si, sto cercando di fare degli esercizi in cui utilizzo un po' di tutto.
Fai benissimo a sperimentare: è lo spirito giusto.
Però devi stare attento a non fare un minestrone; quando provi nuove cose cerca sempre di chiederti se sono coerenti con la loro definizione e se ti sembrano corrette, per prima cosa. Se credi che tutto possa funzionare ed è logicamente corretto, butta giù del codice e fai la prova empirica.

ciao
__________________

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
 Rispondi


Opera Neon: il browser AI agentico di nuova generazione Opera Neon: il browser AI agentico di nuova gene...
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi Wind Tre 'accende' il 5G Standalone in Italia: s...
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh OPPO Find X9 Pro: il camera phone con teleobiett...
DJI Romo, il robot aspirapolvere tutto trasparente DJI Romo, il robot aspirapolvere tutto trasparen...
DJI Osmo Nano: la piccola fotocamera alla prova sul campo DJI Osmo Nano: la piccola fotocamera alla prova ...
Attacco a OpenAI dal Giappone: Sora avre...
OpenAI annuncia un accordo strategico co...
Black Friday per e-bike Engwe: fino a 40...
Una PS5 grande come un tostapane: dove n...
Intel aveva pronta una scheda video di f...
Filippo Luna, CEO di Aira Italia: "...
Task Manager non si chiude e si moltipli...
Il CEO di OpenAI si lamenta della sua Te...
Shadow AI: il lato invisibile dell’innov...
Windows 7 ridotto a soli 69 MB: l'esperi...
Ancora problemi per i dischi SMR di West...
IA, zero trust, cifratura post quantum: ...
Accise diesel, la Legge di Bilancio 2026...
Chi possiede un'auto con motore PureTech...
Trump blocca le GPU NVIDIA Blackwell in ...
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: 22:32.


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