Forum: Dynamisk vektor av strukturer

Forum huvudsida -> Programmering -> Dynamisk vektor av strukturer

Sidor: 1

Till botten

hejsansvejsan 17:51 - 4:e Januari 2011 | Post #1
Medlem
Inlägg: 4


Skicka PM

Hej

Jag håller på att läsa programmering på fritiden och har fastnat på en grej.

Jag läser C++-programmering femte upplagan av Stephen Prata och har fastnat på uppgift 6 kap 7.

Jag har gjort en dynamisk vektor av strukturer där varje vektor ska läsa in för- och efternamn på en person samt hur stor donation han/hon har gett.

Jag får dock inte inmatningen av namnet att fungera, den läser inte in något alls utan hoppar bara över till donationsinmatningen.

Här är koden:

  1. #include <iostream>
  2. #include <Windows.h>
  3. const int Size = 30;
  4.  
  5. using namespace std;
  6.  
  7. struct info
  8. {
  9. char name[Size];
  10. double gift;
  11. };
  12.  
  13.  
  14. int main()
  15. {
  16. SetConsoleOutputCP(1252);
  17.  
  18. cout << "Skriv in antal donatorer: ";
  19. int antal;
  20. cin >> antal;
  21.  
  22. info * pi = new info[antal];
  23.  
  24. for (int i = 0; i < antal; i++)
  25. {
  26. cout << "Skriv in namnet på donator nr " << i + 1 << ": n";
  27. cin.getline(pi[i].name, Size);
  28. cout << "Skriv in gåvosumman: ";
  29. cin >> pi[i].gift;
  30. }
  31.  
  32. for (int i = 0; i < antal; i++)
  33. {
  34. cout << pi[i].name << endl;
  35. cout << pi[i].gift << endl;
  36. }
  37.  
  38.  
  39. delete [] pi;
  40. cin.get();
  41. cin.get();
  42. return 0;
  43. }

Jag får det att fungera om endast förnamn ska skrivas in, men inte både för båda.

Jag har inte en blekaste om vad felet kan vara så hjälp uppskattas!






kode 21:25 - 4:e Januari 2011 | Post #2
Medlem
Inlägg: 45


Skicka PM

flushar du inputströmmen mellan inmatningarna? jag skulle gissa på att problemet är att du inte gör det.






hejsansvejsan 21:38 - 4:e Januari 2011 | Post #3
Medlem
Inlägg: 4


Skicka PM

flusha?

Jag har försökt att skriva cin.clear(); innan inmatningen, men det hjälper inte.






Vitdom 16:50 - 6:e Januari 2011 | Post #4
Medlem
Inlägg: 71


Skicka PM

Felet är att när du anropar cin.getline
cin.getline(pi[i].name, Size);
så finns redan ett nyradstecken först i inmatningsbufferten, som kommer ifrån cin >> antal;.

Detta kan fixas genom att anropa cin.get() en gång innan du anropar cin.getline. Eller så kan du också anropa cin.sync().

cin.get() tar bort och returnerar ETT tecken ifrån inmatningsbufferten.
cin.sync() ignorerar alla olästa tecken i inmatningsbufferten, vilket gör den tom.



-------------------------





hejsansvejsan 03:38 - 8:e Januari 2011 | Post #5
Medlem
Inlägg: 4


Skicka PM

tack så mycket, nu lärde jag mig lite mer Smiley






Ragnarök 15:23 - 6:e Mars 2012 | Post #6
Medlem
Inlägg: 5


Skicka PM

static const int unsigned Size = 32;

blir snabbare!



-------------------------





kode 19:08 - 6:e Mars 2012 | Post #7
Medlem
Inlägg: 45


Skicka PM

    Citat av Ragnarök:


static const int unsigned Size = 32;

blir snabbare!

Möjligen, men det är knappast mätbart.






Ragnarök 20:35 - 6:e Mars 2012 | Post #8
Medlem
Inlägg: 5


Skicka PM

1 : han alignar arrayen i minnet.
2 : det är snabbare för datorn att räkna positiva tal.

Men som du säger, inget som kanske är mätbart i små mängder!
Men skulle man bara tänka så i alla fall tappar man endel.

Det är en bra vana att få in liksom!



-------------------------





Peter 13:22 - 7:e Mars 2012 | Post #9
Medlem
Inlägg: 17


Skicka PM

    Citat av Ragnarök:

2 : det är snabbare för datorn att räkna positiva tal.

Varför skulle "positiva tal" vara snabbare? I vilka situationer är det så?


    Citat av Vitdom:

cin.get() tar bort och returnerar ETT tecken ifrån inmatningsbufferten.
cin.sync() ignorerar alla olästa tecken i inmatningsbufferten, vilket gör den tom.

Tror inte att det är riktigt det som sync() gör så det fungerar inte. get() fungerar så länge som användaren inte har matat in en massa annat före nyradstecknet. Själv föredrar jag att anropa ignore för att ignorera alla tecken fram till och med det första nyradstecknet. cin.ignore(numeric_limits<streamsize>::max(), '\n');



-------------------------



Senast redigerad 13:23 - 7:e Mars 2012


Ragnarök 16:57 - 7:e Mars 2012 | Post #10
Medlem
Inlägg: 5


Skicka PM

sista biten är 1 eller 0 som blir en check om det är ett negativt tal. två unsigned som bli compared kollas bara igenom att se vilken som är den högsta eller lägsta biten satt.



-------------------------





Vitdom 14:37 - 15:e April 2012 | Post #11
Medlem
Inlägg: 71


Skicka PM

    Citat av Peter:


Tror inte att det är riktigt det som sync() gör så det fungerar inte.

Jo.
Citat av cplusplus.com:

int sync ( );

Synchronize input buffer with source of characters
Synchronizes the buffer associated with the stream to its controlled input sequence. This effectively means that the unread characters in the buffer are discarded.


    Citat av Ragnarök:


sista biten är 1 eller 0 som blir en check om det är ett negativt tal. två unsigned som bli compared kollas bara igenom att se vilken som är den högsta eller lägsta biten satt.

Datavärden jämförs för det mesta med CMP-instruktionen som subtraherar den ena operanden från den andra och sätter processorns resultatflaggor efter resultatet. Dessa flaggor jämförs på olika sätt om man vill jämföra ett positivt eller negativt tal. Däremot tar dessa beräkningar lika lång tid i dagens processorer.



-------------------------





Peter 23:14 - 15:e April 2012 | Post #12
Medlem
Inlägg: 17


Skicka PM

    Citat av Vitdom:


    Citat av Peter:
    Tror inte att det är riktigt det som sync() gör så det fungerar inte.

Jo.
    Citat av cplusplus.com:
    int sync ( );
    Synchronize input buffer with source of characters
    Synchronizes the buffer associated with the stream to its
    controlled input sequence. This effectively means that the unread
    characters in the buffer are discarded.


Har faktiskt undersökt detta lite mer sedan sist. Det skiljer sig lite mellan olika kompilatorer. Med GCC händer det inget alls om man anropar cin.sync(). Hittade en "bug report" som kan vara intressant att läsa: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46624



-------------------------



Senast redigerad 23:16 - 15:e April 2012


Sidor: 1

Forum huvudsida -> Programmering -> Dynamisk vektor av strukturer
Atom feed

Du får inte posta i den här tråden | Till toppen