17. juli 2004 - 19:38Der er
18 kommentarer og 2 løsninger
Arrays, pointers og funktioner
Jeg har følgende funktion, som finder det laveste tal i et array, og ændrer det til et 0. Da jeg er forholdsvist uerfaren i C++, og dette oprindeligt var en javascript funktion, er jeg ikke helt sikker på det er den bedste måde at gøre det på, men anyway...
Mit problem er at den skal ændre det oprindelige array (det som jeg sendte til funktionen) og ikke funktionens lokale kopi, eller hvordan man nu skal sige det. Jeg går ud fra jeg skal bruge pointers til det formål, men ingen af de adskillige tutorials/bøger jeg har læst har formået at forklare pointers på en måde jeg forstår :(
Har søgt på google, og forsøgt mig frem på utallige måder, men kan ikke få det til at virke, så jeg håber nogen her kan forstå hvad jeg ævler om og forklare hvordan jeg gør :)
void RemoveLowest( int arr[], int length ) { int minidx, min = 1000 ;
for( int i = 0 ; length > i ; i++ ) { if( min > arr[i] ) { min = arr[i] ; minidx = i ; } }
Virker ikke nej, men jeg er ikke helt sikker på hvorfor, dette var mit første gæt :)
Havde godt nok læst at arrays teknisk set er pointers, men tænkte jeg måske havde misforstået noget.
Her er hele min kode, hvis det kan hjælpe... det er et lille program til at "kaste terninger", specielt beregnet til rollespil (D&D). Jeg bruger C++ builder 5. Problemet er at den ikke fjerner det laveste tal når jeg ber den om det, alt andet virker som det skal.
// get the number and kind of dice, converted to integers int num = numdice->Text.ToInt() ; int die = dietype->Text.ToInt() ;
int rn, r, i = 0 ;
int rolls[999] ; AnsiString tmp ;
for ( i = 0 ; i < num ; i++ ) { // Roll the dice rn = randrange( 1, die ) ;
rolls[i] = rn ;
// Add this roll to total r = r + rn ; }
if ( removelowest->Checked ) { int n = sizeof( rolls ) / sizeof( rolls[0] ) ;
RemoveLowest( rolls, n ) ; }
for ( i = 0 ; i < num ; i++ ) { if ( rolls[i] != 0 ) { // If this is the last roll, don't add the trailing '+' if ( i == num - 1 ) { tmp = tmp + rolls[i] ; } else { tmp = tmp + rolls[i] + " + " ; } } }
Skal lige siges jeg hentydede til min egen kode da jeg sagde grim :) ovenstående virker for mig. Det eneste jeg har ændret i din funktion er int minidx, min = 1000;
arne > Jo, jeg ville også meget gerne lave mit array dynamisk istedet for at sætte det til 999, men så vidt jeg har forstået er det ikke lige til i C++ :( Kender du en bedre løsning?
Hvis det er en terningefunktion du skal bruge, kan du evt. gøre som følger (den fjerner ikke det laveste tal, men du kan selv definere præcist hvilken tal række du vil bruge, så hvis du vil sortere 1'ere fra, så bruger du bare (2,6) ) :
int diceRoller(int min_value, int max_value) { int random; srand ( static_cast <unsigned> (time(0)) ); while(1) { random = rand(); if((random >= min_value)&&(random <= max_value)) break; } return random; }
Jeg bruger selv denne funktion i mit "prisvindende" ascii rpg :)
Den er måske ikke så avanceret, men den er lille, let at overskue og virker :)
Undskyld tiden, er lige flyttet og er derfor uden internet for tiden :(
Tak for alle kommentarerne, vil prøve at kigge på det når jeg kommer hjem og se hvad jeg kan finde ud af :)
PS. I D&D har man terninger med op til 20 sider, men man regner med terninger helt op til 100 sider, og det ville ikke undre mig at nogen kunne finde på at bruge endnu større terninger til diverse besynderlige formål :)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.