Forum: NEW meningslös?

Forum huvudsida -> Programmering -> NEW meningslös?

Sidor: 1

Till botten

Jeff 10:00 - 14:e April 2005 | Post #1
Medlem
Inlägg: 38


Skicka PM
Rajt, jag har tvistat lite med min programmeringslärare angående en kodsnutt som en av mina klasskamrater skrivit. Koden är kompilerad i Dev-cpp 4.9.9.2 (GCC 3.4.2) och fungerar finfint, men, minprogrammeringslärare hävdar att koden inte alls fungerar i Visual C++ .NET och att den gör hela meningen med NEW helt meningslös. Jag är inte riktigt såpass insatt i varken kompilatorn GCC eller NEW\'s användningsområden, men jag kan inte se hur den här koden skulle göra NEW meningslös, och jag tror på GCC.
Kan någon hjälpa mig lösa den här tvisten?
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. using namespace std ;
  5. int falt()
  6. {
  7. int antF=0 ;
  8. cout << \"Hur m\\x86nga f\\x84lt: \" ;
  9. cin >> antF ;
  10. return antF ;
  11. }
  12. int listan(int faltant1)
  13. {
  14. int tal ;
  15. {
  16. tal=rand()%100 ;
  17. }
  18. return tal ;
  19. }
  20. int sort(int faltant , int list[])
  21. {
  22. int spar=0 , flytt=0 ;
  23. bool test=true ;
  24. cout << endl << \"\\nDessa tal sorterade \\x84r:\" << endl;
  25. while(test)
  26. {
  27. test=false ;
  28.  
  29. for(int i=1 ; i<faltant ; i++)
  30. {
  31. if(list[i]<list[i-1])
  32. {
  33. spar=list[i] ;
  34. flytt=list[i-1] ;
  35. list[i]=flytt ;
  36. list[i-1]=spar ;
  37. test=true ;
  38. }
  39. }
  40. }
  41. for(int i=0 ; i<faltant ; i++)
  42. {
  43. cout << list[i] << \" \" ;
  44. }
  45. return list[faltant] ;
  46. }
  47. int main()
  48. {
  49. system(\"COLOR 2A\") ;
  50. srand(time(NULL)) ;
  51. int antalfalt=0 ;
  52. antalfalt=falt() ;
  53. int katalog[antalfalt] ;
  54. listan(antalfalt) ;
  55. cout << \"\\nTalen \\x84r:\\n\" ;
  56. for(int i=0 ; i<antalfalt ; i++)
  57. {
  58. katalog[i]=listan(antalfalt) ;
  59. cout << katalog[i] << \" \" ;
  60. }
  61. sort(antalfalt , katalog) ;
  62. system(\"pause>nul\") ;
  63. }

Tydligen är det denna kodsnutt som skapar problem:
  1. int antalfalt=0 ;
  2. antalfalt=falt() ;
  3. int katalog[antalfalt] ;

Det skall tydligen inte gå att deklarera katalog med antalfalt.

Tack på förhand!
\\\\Jeff


-------------------------
Ingen signatur!

Senast redigerad 13:33 - 17:e April 2005


sdac 14:47 - 14:e April 2005 | Post #2
Medlem
Inlägg: 235


Skicka PM
BEDR-VLIGT utseende på koden! HORROR!

Iallafall, simpel lösning;

int* katalog;
...
//i main()
katalog = new int[falt()];



Ehmm, kunde inte din programmeringslärare fixa detta? Smiley



Senast redigerad 16:47 - 14:e April 2005


Jeff 15:13 - 14:e April 2005 | Post #3
Medlem
Inlägg: 38


Skicka PM
Som svar på kodens utseende, jag har inte skrivit den. ;-)
Och ja, min lärare sa åt Robban, min kamrat som stod för koden att göra precis såsom du förklarat. Problemet var att det uppstod en tvist angående
  1. int antalfalt=0 ;
  2. antalfalt=falt() ;
  3. int katalog[antalfalt] ;

Detta fungerade att kompilera i GCC 3.4.2 och absolut inte i Visual C++ .NET. Och min lärare har en tendens till att inte tro på något som dels, han själv inte känner till, dels inte fungerar att kompilera med Visual C++. Vi diskuterade hurvida det här faktiskt var möjligt. Vad skulle NEW då användas till om det gick att allokera minne såhär? Efter lite söknade har jag funnit att det faktiskt går att göra såhär. Allokera minne dynamiskt. Det är ingen fin algoritm, men den gör vad den ska, och det blir inte så stor skillnad i prestanda heller. Lite sämre, men det är en ganska ny företelse.
Så att frågan om hurvida
  1. int antalfalt=0 ;
  2. antalfalt=falt() ;
  3. int katalog[antalfalt] ;
faktiskt är möjlig är besvarad. Det är implementerat i all GCC-baserade kompilatorer och .NET. Så nu vet ni det.

-------------------------
Ingen signatur!

Senast redigerad 13:32 - 17:e April 2005


Celeron 15:13 - 14:e April 2005 | Post #4
Medlem
Inlägg: 418


Skicka PM
Jo, men han skriver ju att läraren säger att om det gick att göra så (vilket går i vissa kompilatorer) så gör det new meningslöst. Enligt mig har läraren rätt.

-------------------------
Det viktigaste är att ha roligt! Har ny hemsida: http://www.freewebs.com/cpperik/



sdac 15:28 - 14:e April 2005 | Post #5
Medlem
Inlägg: 235


Skicka PM
Jag använder alltid new... det är enkelt och mycket användbart.

Låt mig förklara varför new INTE är meningslöst;

Låt oss säga att jag ska skapa en terräng, ett objekt utav klassen TerrainModel. Den måste vara global för programmet, alltså måste objektet definieras globalt. MEN, eftersom jag måste skicka en pointer till Direct3D-devicen till min terrängklass samtidigt som den skapas så måste jag på något sätt initialisera mitt objekt i programmet och samtidigt få det att förbli ett globalt objekt. Därför skapar jag,
TerrainModel* TinyTerrain;

sen skapar jag min D3D-device med ett D3D-objekt och därefter kan jag skapa terrängen i det globala objektet med new;

TinyTerrain = new TerrainModel( &D3DDevice );

Get it? New är absolut användbart.


Senast redigerad 15:34 - 14:e April 2005


Celeron 16:34 - 14:e April 2005 | Post #6
Medlem
Inlägg: 418


Skicka PM
Oj då. Jeff kom före mig.

-------------------------
Det viktigaste är att ha roligt! Har ny hemsida: http://www.freewebs.com/cpperik/



sdac 17:09 - 15:e April 2005 | Post #7
Medlem
Inlägg: 235


Skicka PM
Inget tack för förklaringen fick man heller. xO


Senast redigerad 17:16 - 15:e April 2005


Jeff 19:29 - 16:e April 2005 | Post #8
Medlem
Inlägg: 38


Skicka PM
Hehe. Tack för förklaringen. Om man inte loggar in sjutton gånger per dag kan man missa att läsa inlägg direkt ;-)

-------------------------
Ingen signatur!



sdac 19:41 - 16:e April 2005 | Post #9
Medlem
Inlägg: 235


Skicka PM
    Citat av Jeff:
Hehe. Tack för förklaringen. Om man inte loggar in sjutton gånger per dag kan man missa att läsa inlägg direkt ;-)


Tycker din lärare fortfarande att new är meningslöst då? ;p




Jeff 00:30 - 17:e April 2005 | Post #10
Medlem
Inlägg: 38


Skicka PM
Han påstod snarare att NEW blev meningslös om det faktum vi upptäckte stämde. Han vägrade tro på det, han är nämligen en sådan där uråldtig gammal drake som inte riktigt tycker att något skall ändra på sig. Så hans kritik emot oss var att NEW blev meningslös om man kunde allokera dynamiskt minne. Min lärare tycker om NEW.

-------------------------
Ingen signatur!



void 10:57 - 17:e April 2005 | Post #11
Medlem
Inlägg: 63


Skicka PM
Personligen tycker jag inte att koden borde kompilera i en standardföljande kompilator...

Allt minne en funktion behöver borde allokeras vid själva funktionsanropet. DVS före du vet hur många element som ska finnas i arrayen. Vad jag minns så ska det minnet allokeras på programmets stack, medans saker som allokeras med new hamnar på heapen.

Frågan är var kompilatorn placerar din variabel?
jag antar att det mpste bli på heapen, men det känns fel.



-------------------------
Ingen signatur!



Jeff 13:29 - 17:e April 2005 | Post #12
Medlem
Inlägg: 38


Skicka PM
Det hammnar på stacken. Såhär skriver ElMaco om saken:
Dynamisk stack ar tydligen verklighet idag, i alla fall pa vissa typer av system. Efter ett antal timmars sjalvstudier pa omradet sa har jag fatt reda pa att en dynamisk stack kan stota pa problem pa system med sidindelat minne samt om det implementeras i tradade applikationer. Eftersom varje trad kraver en egen stack finns en risk att stackblock kolliderar med sig sjalva eller med heapen utan att minnet ar exhausted. Dynamisk stack ar idag implementerat i alla GCC-baserade kompilatorer samt .NET, stod for det kan aven finnas i fler kompilatorer men namnda ar de jag lyckats verifiera.

Nagra snillen har till och med kommit halvvags pa den eleganta losningen jag letat efter och uppfunnit en algoritm som fragmenterar stacken, den ar dock langt fran perfekt an da detta utokar varje stackframe med 8kb samt kraver ett gang extra instruktioner och eventuellt omallokering av den befintliga stacken(!) vid varje lasning/skrivning till den fragmenterade stacken. Pga detta tappar stacken overtaget i hastighet den haft mot heapen och ater dessutom upp en del extra minne. Dessutom kvarstar det faktum att eftersom du overlamnar all minneshantering till externa procedurer sa har du ingen chans att skriva egen felhantering till eventuella misslyckade allokeringar utan ditt program kommer istallet att krascha "no mercy"-style.


-------------------------
Ingen signatur!

Senast redigerad 13:34 - 17:e April 2005


void 15:00 - 17:e April 2005 | Post #13
Medlem
Inlägg: 63


Skicka PM
Ahhh.

Rent intiutivt känns det bara fel =), och frågan är då vad c++-standarden säger bör hända (om det bör gå att deklarera en array med variabelt antal fält).

Du slipper använda new, men tappar kompabilitet med många kompilatorer.

Dock kommer du nog inte ifrån new, som behövs om du ska skicka iväg dina objet från den funktion du anropar. t.ex objekt i olika strukturer (träd, listor). Jag menar att du tappar din array då din funktion inte anropas längre, vilket inte är så bra om du returnerat en pekare till den =)

-------------------------
Ingen signatur!

Senast redigerad 15:05 - 17:e April 2005


sdac 17:31 - 18:e April 2005 | Post #14
Medlem
Inlägg: 235


Skicka PM
    Citat av Jeff:
Han påstod snarare att NEW blev meningslös om det faktum vi upptäckte stämde. Han vägrade tro på det, han är nämligen en sådan där uråldtig gammal drake som inte riktigt tycker att något skall ändra på sig. Så hans kritik emot oss var att NEW blev meningslös om man kunde allokera dynamiskt minne. Min lärare tycker om NEW.


Jag skulle mer än gärna vilja se din lärare göra det jag beskrev utan att använda new...




Sidor: 1

Forum huvudsida -> Programmering -> NEW meningslös?
Atom feed

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