PDA

Visualizza la versione completa : [C++] Il mio programma salta un istruzione


TheBlackWolf
27-07-2018, 20:47
Salve a tutti sto facendo un semplice programma devo creare un array di struct in cui devo inserire degli elementi e stamparlo cercando di creare funzioni e librerie quanto pi sintetiche possibile.

La struct composta da una stringa (descrizione) che deve essere allocata dinamicamente e un valore intero (chiave).

Il problema e che mi sono bloccato a questo punto non mi da nessun errore e non riesco a capire perch non mi faccia inserire la stringa.

Questa la mia libreria per la gestione degli elementi della Struct:


#include <iostream>
#include <cstring>
#include <cstdlib>


using namespace std;


#define N 100


struct Element{

char *info;
int key;

};


typedef char String [N];


void read_element(Element &);
void write_element(Element &);

Queste sono le mie funzioni per la gestione degli elementi:


#include "Struct_lib.h"

void read_element(Element &E){

E.info=0;
E.key=0;

}


void write_element(Element &ele){


String name;

cout<<"\n Iserisci la descrizione dell'elemento :";
cin.getline(name, N-1, '\n');
ele.info=new char (strlen(name+1));
strcpy(ele.info, name);
cout<<"\n Iserisci la chiave dell'elemento :";
cin>>ele.key;

}
Questa la mia libreria per la gestione degli elementi dell'array di struct:


#include "Struct_lib.h"

#define L_DIM 100


typedef Element E;
typedef E List[L_DIM];


void read_list(List &, int );




Questa sono le mie funzioni per la gestione degli elementi della struct:


#include "VettStruct_lib.h"

void read_list(List &L, int size){

cout<<" Inserisci il numero degli elementi della lista: ";
cin>>size;
for(int i=0; i<size; i++){

read_element(L[i]);
write_element(L[i]);

}
}

QUESTO E' IL MIO MAIN:


#include "VettStruct_lib.h"


int main(){

List Mylist;
Element MyElement;
int List_size;

read_list(Mylist, List_size);

}

Questo quello che mi stampa:

29582

oregon
27-07-2018, 22:51
In questa linea quel +1 non nel posto giusto

ele.info=new char (strlen(name+1));

Correggi.

Dopo ogni cin scrivi

cin.ignore();

per svuotare il buffer;

Nella funzione read_list l'ultimo parametro non ha senso perch non lo usi (non passi un valore dal main) ma lo chiedi all'interno, basta una variabile locale.

TheBlackWolf
28-07-2018, 09:48
In questa linea quel +1 non nel posto giusto

ele.info=new char (strlen(name+1));

Correggi.

Dopo ogni cin scrivi

cin.ignore();

per svuotare il buffer;

Nella funzione read_list l'ultimo parametro non ha senso perch non lo usi (non passi un valore dal main) ma lo chiedi all'interno, basta una variabile locale.

Hai ragione ho fatto un errore stupidissimo grazie mille l'ultimo parametro intendi write_list? Mi serve per inserire le stringhe e il numero. Oppure intendi altro?

TheBlackWolf
28-07-2018, 10:24
Ora mi salta tutte le istruzioni tranne la prima, ho anche fatto un delete dell'area hip che avevo inizializzato a 0 per ora mi fa inserire la prima stringa ma mi salta tutte le altre istruzioni, come mai? Altri consigli?

Questo l'unico cambiamento che ho fatto

Libreria di funzioni per la gestione degli elementi della struct:


#include "Struct_lib.h"

void read_element(Element &E){

E.info=0;
E.key=0;

}


void write_element(Element &ele){


String name;

cout<<"\n Iserisci la descrizione dell'elemento :";
cin.getline(name, N-1, '\n');
if(ele.info) delete[] ele.info;
ele.info=new char [strlen(name)+1];
strcpy(ele.info, name);
cin.ignore();
cout<<"\n Iserisci la chiave dell'elemento :";
cin>>ele.key;

}


Questo quello che mi stampa:

29583

TheBlackWolf
28-07-2018, 11:29
Ho capito qual' il problema se inserisco pi di un carattere all'interno della mia stringa allocata dinamicamente mi salta tutte le istruzioni? Cos' che sbaglio nell'allocazione della stringa?

29584

oregon
28-07-2018, 11:32
Non hai seguito il consiglio. Dopo

cin>>ele.key;

non mi pare che hai inserito la cin.ignore();

TheBlackWolf
28-07-2018, 12:17
Non hai seguito il consiglio. Dopo

cin>>ele.key;

non mi pare che hai inserito la cin.ignore();

Si si infatti perci ho fatto altre domande ero sicuro che stavo sbagliando qualcosa, hai ragione era quello il problema grazie mille

TheBlackWolf
28-07-2018, 16:46
Non hai seguito il consiglio. Dopo

cin>>ele.key;

non mi pare che hai inserito la cin.ignore();

Oregon sai per caso dirmi perch mi salta le istruzioni nel for per la stampa degli elementi dell'array di struct all'interno della funzione write_element?

main:

#include "VettStruct_lib.h"

int main(){

List Mylist;
Element MyElement;
int List_size;

read_list(Mylist, List_size);
write_list(Mylist, List_size);

}

funzioni gestione array di struct


#include "VettStruct_lib.h"


void read_list(List &L, int size){

cout<<" Inserisci il numero degli elementi della lista: ";
cin>>size;
for(int i=0; i<size; i++){
read_element(L[i]);
create_element(L[i]);
}


}


void write_list(List &L,const int size){

cout<<"Stampo gli elementi della lista : \n";
for(int i=0; i<size; i++){
cout<<(i+1)<<") ";
write_element(L[i]);

}

}

libreria per la gestione :


#include "Struct_lib.h"


#define L_DIM 100


typedef Element E;
typedef E List[L_DIM];


void read_list(List &, int );
void write_list(List &,const int );

Funzioni gestione elementi struct:


#include "Struct_lib.h"

void read_element(Element &E){

E.info=0;
E.key=0;

}


void create_element(Element &E){


String name;

cout<<"\n Iserisci la chiave dell'elemento :";
cin>>E.key;
cin.ignore();
cout<<"\n Iserisci la descrizione dell'elemento :";
cin.getline(name, N-1, '\n');
if(E.info) delete[] E.info;
E.info=new char [strlen(name)+1];
strcpy(E.info, name);
cin.ignore();

}


void write_element(Element &E){

cout<<E.info<<" "<<E.key<<endl;

}

Libreria gestioni elementi struct:


#include <iostream>#include <cstring>
#include <cstdlib>


using namespace std;


#define N 100


struct Element{

char *info;
int key;

};


typedef char String [N];


void read_element(Element &);
void create_element(Element &);
void write_element(Element &);



Questo quello che mi stampa:

29585

oregon
28-07-2018, 17:42
Manca la cin.ignore() dopo la cin>>size

Elimina la cin.ignore() dopo la cin.getline

La funzione read_list deve accettare il parametro size per riferimento

void read_list(List &L, int &size)

Nel main devi passare il valore size

int size;


read_list(Mylist, size);
write_list(Mylist, size);

TheBlackWolf
28-07-2018, 18:49
Manca la cin.ignore() dopo la cin>>size

Elimina la cin.ignore() dopo la cin.getline

La funzione read_list deve accettare il parametro size per riferimento

void read_list(List &L, int &size)

Nel main devi passare il valore size

int size;


read_list(Mylist, size);
write_list(Mylist, size);

Gli passavo int size come int List_size in size era l'alias che usavo all'interno delle funzioni, comunque grazio mi scordo sempre di svuotare il buffer, comunque non so con che cosa sbaglio ma mi da errori.

main:

#include "VettStruct_lib.h"

int main(){

List Mylist;
Element MyElement;
int size;

read_list(Mylist, size);
write_list(Mylist, size);

}

funzioni array struct:


#include "VettStruct_lib.h"

void read_list(List &L, int &size){

cout<<" Inserisci il numero degli elementi della lista: ";
cin>>size;
cin.ignore();
for(int i=0; i<size; i++){
read_element(L[i]);
create_element(L[i]);
}


}


void write_list(List &L,const int size){

cout<<"Stampo gli elementi della lista : \n";
for(int i=0; i<size; i++){
cout<<(i+1)<<") ";
write_element(L[i]);

}

}

Libreria array struct:


#include "Struct_lib.h"

#define L_DIM 100


typedef Element E;
typedef E List[L_DIM];


void read_list(List &, int &);
void write_list(List &,const int );

Funzioni elementi struct:


#include "Struct_lib.h"

void read_element(Element &E){

E.info=0;
E.key=0;

}


void create_element(Element &E){


String name;

cout<<"\n Iserisci la chiave dell'elemento :";
cin>>E.key;
cin.ignore();
cout<<"\n Iserisci la descrizione dell'elemento :";
cin.getline(name, N-1, '\n');
if(E.info) delete[] E.info;
E.info=new char [strlen(name)+1];
strcpy(E.info, name);

}


void write_element(Element &E){

cout<<E.info<<" "<<E.key<<endl;

}

Libreria elementi struct:


#include <iostream>#include <cstring>
#include <cstdlib>


using namespace std;


#define N 100


struct Element{

char *info;
int key;

};


typedef char String [N];


void read_element(Element &);
void create_element(Element &);
void write_element(Element &);

Questi sono gli errori:

29586

Loading