RISOLTO [C] Far acquisire all'utente un vettore

Stato
Discussione chiusa ad ulteriori risposte.

Drew_

Nuovo Utente
50
3
CPU
intel i5-6600
Dissipatore
stock
Scheda Madre
ASrock h170 pro4/hyper
HDD
WD wd10ezex 1TB 7200rpm + ssd samsung 850 evo 256 GB
RAM
corsair vengeance 2x4 GB 2133mhz CL13
GPU
Sapphire Amd rx 480 nitro 8GB
Monitor
Asus vg245h
PSU
seasonic s12ll 520w
Case
NZXT S340
OS
Windows 10
Ciao ragazzi non capisco come far acquisire all utente un vettore (nemmeno per le stringhe ) una sequenza che viene terminata dall inserimento di un particolare valore , ad esempio lo 0
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Intanto posta quello che sei riuscito a fare o quello che sai fare. Poi ti aiutiamo
 

Drew_

Nuovo Utente
50
3
CPU
intel i5-6600
Dissipatore
stock
Scheda Madre
ASrock h170 pro4/hyper
HDD
WD wd10ezex 1TB 7200rpm + ssd samsung 850 evo 256 GB
RAM
corsair vengeance 2x4 GB 2133mhz CL13
GPU
Sapphire Amd rx 480 nitro 8GB
Monitor
Asus vg245h
PSU
seasonic s12ll 520w
Case
NZXT S340
OS
Windows 10
C:
#define STOP '0'
#include<stdio.h>
#include<stdlib.h>

int main(int argc,char*argv[])
{
  int n,i;
  int *v;
  n=0;
  for(i=0;v!=STOP;i++){
    scanf("%d",&v[I]);
    n++;}
  for(i=0;i<n;i++)
      printf("%d",v[I]);
    return 0;
  }[/I][/I]

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

int main(int argc,char*argv[])
{
  int *v;
  int dim,i,num;
  for(dim=0,i=0;num!=0;dim++,i++){
    v=(int*)malloc((dim+1)*sizeof(int));
    scanf("%d",&num);
    v[I]=num;
    }
  printf("%d",dim-1);
    return 0;
  }

Adesso mi è uscito questo che mi stampa la dimensione dell array con la sequenza che si ferma con lo 0(non contato), è una cosa giusta?
 
Ultima modifica da un moderatore:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
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
Stai sbagliando. Se devi allocare un array devi allocare memoria prima del for. Ma non ha molto senso il codice in generale...
Per altro anche in caso di riallocazioni dovresti utilizzare realloc.

Dovresti creare una sorta di "array dinamico" per gestire le riallocazioni quando viene raggiunta la dimensione massima, per fare una cosa fatta bene.

In pausa pranzo ti rispondo meglio se dovesse servire.
 

Drew_

Nuovo Utente
50
3
CPU
intel i5-6600
Dissipatore
stock
Scheda Madre
ASrock h170 pro4/hyper
HDD
WD wd10ezex 1TB 7200rpm + ssd samsung 850 evo 256 GB
RAM
corsair vengeance 2x4 GB 2133mhz CL13
GPU
Sapphire Amd rx 480 nitro 8GB
Monitor
Asus vg245h
PSU
seasonic s12ll 520w
Case
NZXT S340
OS
Windows 10
Se mi scriveresti un esempio di come si crea un array dinamico che si ferma quando inserisco lo zero mi faresti un favore enorme (la realloc non ce la fanno usare)
Quando hai tempo e se ti va
Comunque grazie

"Scrivete un programma che legga una sequenza di interi e la stampi al contrario, allocando la memoria necessaria in modo dinamico attraverso l’uso della funzione malloc.
L’input è dato da una sequenza di numeri terminata da 0; non potendo prevedere quanti numeri verranno inseriti, il vettore andrà ridimensionato man mano."

Questo è l'esercizio che dovrei fare
 
Ultima modifica da un moderatore:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
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
Se mi scriveresti un esempio di come si crea un array dinamico che si ferma quando inserisco lo zero mi faresti un favore enorme (la realloc non ce la fanno usare)

Inizio con lo scriverti i passi in maniera descrittiva in quanto se ti scrivo il codice non capiresti come funzionano le cose (e l'esercizio è per te/voi).

Dovresti creare una funzione - spero le possiate utilizzare considerando che state utilizzando puntatori - che allochi la memoria e copi gli elementi del vecchio array nel nuovo qualora la dimensione venga raggiunta.
Nello specifico prima di inserire un nuovo elemento dovrai verificare se la capienza massima è stata raggiunta; se la capienza massima è stata raggiunta chiama una funzione che, ricevuti l'array e la dimensione come parametro, alloca il doppio della memoria (se prima erano 10 elementi, farai 10*2).
Fatto ciò, dovrai copiare tramite memcpy i valori dal vecchio array al nuovo (se non puoi usare memcpy, fai un for), poi fai un free sull'array ricevuto come parametro, e restituisci il nuovo array.

Puoi astrarre come preferisci: puoi anche avere una funzione che ricevuti due parametri (array e valore) verifichi il numero degli elementi presenti e richiami la funzione che alloca il doppio della memoria allocata prima.

In una sorta di pseudocodice:
C:
// capacity = 10
int *array = malloc(capacity * sizeof(int));
int n, size = 0;

while(true) {
  // leggi in input il valore, memorizzalo in n    
  if(n == 0)
      break;
  
  if(capacity == size)
  {
    // chiami la funzione che copia l'array; se non puoi usare funzioni, fai un ciclo qui;
    // ricordati che ora capacity però deve essere: capacity = capacity * 2
  }
  
  array[size++] = n;
}

// stampi l'array al contrario

Sono un pò di fretta, ma non dovrei aver commesso errori nell'esposizione.
 

Drew_

Nuovo Utente
50
3
CPU
intel i5-6600
Dissipatore
stock
Scheda Madre
ASrock h170 pro4/hyper
HDD
WD wd10ezex 1TB 7200rpm + ssd samsung 850 evo 256 GB
RAM
corsair vengeance 2x4 GB 2133mhz CL13
GPU
Sapphire Amd rx 480 nitro 8GB
Monitor
Asus vg245h
PSU
seasonic s12ll 520w
Case
NZXT S340
OS
Windows 10
Va bene grazie mille sei stato molto chiaro e molto gentile


Inviato dal mio iPhone utilizzando Toms Hardware Italia Forum
 
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili