Avatar billede baltazar_ Nybegynder
10. maj 2003 - 15:19 Der er 21 kommentarer

icon point

Jeg kan ikke få dette til at virke...måske forkert fremgangsmåde ?

Jeg prøver at hente et icons Cpoint ind i variabel for derefter at finde ud af om den er inden for et af mine rect[x][y].
..........
fremgangsmåden er således at jeg har et stort rect (som er kaldet rectlayer) som derefter bliver indelt i rect[x][y] således.

rect[x][y].SetRect(x*(nWidth/nRects)+rectlayer.left, y*(nHeight/nRects)+rectlayer.top, (x+1)*(nWidth/nRects)+rectlayer.left-1, (y+1)*(nHeight/nRects)+rectlayer.top-1);

nu har jeg behov for at finde ud af om mit icon ( m_hIconposition ) er inde for i et af områderne (rect[x][y]).
og hvis det er så skal den komme med en afxmessagebox der fortæller hvilket af rect[][] den er i.

er der nogle forslag til hvorledes dette kan gøre så det virker
Avatar billede baltazar_ Nybegynder
10. maj 2003 - 15:25 #1
glemte lidt mere kode

her er resten:


                m_st1.GetWindowRect(&rectlayer);
                ScreenToClient(rectlayer);

const int nRects = 404/60; // gives 5 * 5 = 25 rects
const int nsmallRects = 60/2;
 
    CRect rect[nRects][nRects];
    CRect smallrect[nsmallRects][nsmallRects];
   
    rect[nRects][nRects].NormalizeRect();
    smallrect[nRects][nRects].NormalizeRect();

    m_st1.GetWindowRect(&rect[nRects][nRects]);
    m_st1.GetWindowRect(&smallrect[nsmallRects][nsmallRects]);

    ScreenToClient(rect[nRects][nRects]);
    ScreenToClient(smallrect[nsmallRects][nsmallRects]);


            int idx=0;
            int idy =0;
            int nWidth = rectlayer.Width();  // Width to be divided amongst rects
            int nHeight = rectlayer.Height(); // Height to be divided amongst rects




for(int y=0; y<nRects; ++y)
{
   


    idy = idy+1;


    for(int x=0; x<nRects; ++x)
    { idx = idx+1;
       
   
        rect[x][y].SetRect(x*(nWidth/nRects)+rectlayer.left, y*(nHeight/nRects)+rectlayer.top, (x+1)*(nWidth/nRects)+rectlayer.left-1, (y+1)*(nHeight/nRects)+rectlayer.top-1);
   

int rectidx;
int devidensmallWidth = 30    ;  // angiver antal felter på x axis
int devidensmallHeight = 30    ;  // angiver antal felter på y axis


::GetWindowRect((HWND )m_hIconposition, &rectlayer);
CRect cr = rect[x][y];

CPoint ptl = rect[x][y].TopLeft();
CPoint pbr = rect[x][y].BottomRight();





    if(rect[2][2].PtInRect(ptl) && rect[2][2].PtInRect(pbr))
    { // iconet er inden for rect[x][y]
        FillRect(dc,&rect[x][y],(HBRUSH)GetStockObject(WHITE_BRUSH));
        AfxMessageBox("bingo");
    }
Avatar billede baltazar_ Nybegynder
10. maj 2003 - 15:26 #2
glem første kode jeg pastede ind, den er med i kode snippet 2
Avatar billede bertelbrander Novice
11. maj 2003 - 01:04 #3
Jeg kan umiddelbart finde følgende småfejl:
1. Ifølge min lommeregner giver 404/60 6 og ikke 5*5 = 25
2. Det giver ingen mening at kalde NormalizeRect for rect[nRects][nRects], dette object findes ikke. Jeg har på fornemmelsen at du ønsker at kalde NormalizeRect for alle rect'er i rect, i så fald må du gøre det i en løkke.
3: Det samme gælder for smallrect, men her kader du NormalizeRect for
smallrect[nRects][nRects], hvor du vist mente smallrect[nsmallRects][nsmallRects] (hvilket, af samme grunde som nævnt ovenfor, heller ikke er rigtigt)
4: Herefter har du følgende:
m_st1.GetWindowRect(&rect[nRects][nRects]);
m_st1.GetWindowRect(&smallrect[nsmallRects][nsmallRects]);
Hvilket ikke går da det sidst element i hhv rect & smallrect er rect[nRects - 1][nRects - 1] & smallrect[nsmallRects - 1][nsmallRects - 1]
5: Samme fejl gør sig gældende for kaldene til ScreenToClient.
6: I loopen genbruger du rectlayer i kaldet til GetWindowRect, hvilket medfører at rectlayer i dit kald til rect[x][y].SetRect er resultatet fra m_st1.GetWindowRect(&rectlayer); & ScreenToClient(rectlayer); første gang og resultatet fra ::GetWindowRect((HWND )m_hIconposition, &rectlayer); for resten.
7: rectidx, devidensmallHeight & devidensmallWidth bruges ikke.
8: Linien:
if(rect[2][2].PtInRect(ptl) && rect[2][2].PtInRect(pbr))
burde vist være:
if(rect[x][y].PtInRect(ptl) && rect[x][y].PtInRect(pbr))
Avatar billede baltazar_ Nybegynder
11. maj 2003 - 12:53 #4
øj det var mange fejl  tak for inputtet jeg løber det lige igennem en gang til.
Med hensyn til
if(rect[2][2].PtInRect(ptl) && rect[2][2].PtInRect(pbr))
Så lavede jeg den for at teste på det ene specifikke felt, men desværre fungerede det ikke, men ok  nu retter jeg lige de fejl du nævner og så må vi se på det derfra.
Avatar billede baltazar_ Nybegynder
11. maj 2003 - 20:51 #5
disee fejl du her nævner, kan det være årsagen til at jeg ikke for det ønskede ud af min
if(rect[x][y].PtInRect(ptl) && rect[x][y].PtInRect(pbr))
funktionen skulle være at se om iconet er inden for rect[x][y], men der er ingen reaktion synlig.
Avatar billede baltazar_ Nybegynder
11. maj 2003 - 21:55 #6
hvad siger du til det her.

var det noget i den stil det skulle rettes til ?.
Avatar billede baltazar_ Nybegynder
11. maj 2003 - 21:55 #7
m_st1.GetWindowRect(&rectlayer);
    ScreenToClient(rectlayer);

const int nRects = 404/60;
const int nsmallRects = 60/2;
 
    CRect rect[nRects][nRects];
    CRect smallrect[nsmallRects][nsmallRects];
   


    ::GetWindowRect((HWND )m_hIconposition, &rectlayer);

           
int nWidth = rectlayer.Width();  // Width to be divided amongst rects
int nHeight = rectlayer.Height(); // Height to be divided amongst rects




for(int y=0; y<nRects; ++y)
{
   


    idy = idy+1;


    for(int x=0; x<nRects; ++x)
    {
       
        idx = idx+1;
        rect[x][y].SetRect(x*(nWidth/nRects)+rectlayer.left, y*(nHeight/nRects)+rectlayer.top, (x+1)*(nWidth/nRects)+rectlayer.left-1, (y+1)*(nHeight/nRects)+rectlayer.top-1);
   



        CRect r = rect[x][y];

        CPoint ptl = r.TopLeft();
        CPoint pbr = r.BottomRight();


                if(rect[x][y].PtInRect(ptl) && rect[x][y].PtInRect(pbr))
                {
                        // finder ud af om iconet er inden for rect[x][y].
                        FillRect(dc,&rect[x][y],(HBRUSH)GetStockObject(WHITE_BRUSH));
                        AfxMessageBox("bingo");
                }
Avatar billede bertelbrander Novice
11. maj 2003 - 23:56 #8
1: Du starter med at finde rect af m_st1 (hvad er det?) med GetWindowRect(), så justerer du dette rect med ScreenToClient(). Du bruger aldrig resultatet før du kalder ::GetWindowRect((HWND )m_hIconposition, &rectlayer), og dermed overskriver m_st1's rect.
2: Du udregner nRects som 404/60, hvor får du disse tal fra?
3: Dernæst udregner du bredden & højden af dit icon, (du har lige kaldt ::GetWindowRect), jeg tror at du ønsker at udregne bredden & højden af m_st1's vindue.
4: I loopen sætter du rect[x][y], hvad er grunden til at du lægger rectlayer.top/rectlayer.left til værdierne? Skulle rectlayer være icon'ets eller m_st1's rect? Jeg tror at du skulle lade være med at lægge rectlayer.xxx til.
5: Dernæst finder du TopLeft & BottonRight punkterne for det rect du lige har beregnet, og bruger disse til at checke om icon'et ligger inden for rect'et. Jeg tror det burde være icon'ets rect. DVS du checker om rect[x][y] ligger inden for rect[x][y], det gør det ikke pga. definitionen af PtInRect:
"Determines whether the specified point lies within CRect. A point is within CRect if it lies on the left or top side or is within all four sides. A point on the right or bottom side is outside CRect."

Det går fremad, der er kun 5 punkter denne gang ;-)
Avatar billede baltazar_ Nybegynder
12. maj 2003 - 18:22 #9
1)
m_st1 er et billede. Det er dette billede jeg loader ind i en frame vindue i et rect som jeg så kalder rectStaticClient.
2)
const int nRects = billedestørrelse/minutter;
dvs. reactlayer bliver delt op i yderliger 36 felter ( rect[x][y] ).
jeg kunne lige så godt have skrevet
const int nRects = 36;
men da jeg nogle gange bruger større eller mindre billeder har jeg valgt at gøre således indtil vidrer.
3)
dette er jeg ikke helt klar over hvorledes skal gøres endnu, menningen er at jeg skal finde iconts midtpunkt, da det er det jeg ønsker at finde ud af om er inden for et af rect[x][y] felterne. Jeg regner med at jeg skal regne mig frem til dette punkt. Da jeg ikke nogle steder har kunne finde information om hvorvidt der er en struct der henter denne information. Eller måske bare skal finde ud af om icont`s rect`s centrum ( r) er inden for rect[x][y].
4) rectlayer er m_st1`s rect. iconets rect er som omtalt i 3 CRect r;
omhvorvidt jeg skal lægge rectlayer.xxx  til så kan jeg ikke få det til at virke korrekt uden. hvis jeg ikke lægger rectlayer til så kommer rect[x][y] det forkerte sted på skærmen.
5)
AHA !  jamen så forstå jeg bedre der intet sker når jeg gør således

  if(rect[x][y].PtInRect(ptl) && rect[x][y].PtInRect(pbr))
                {
                        // finder ud af om iconet er inden for rect[x][y].
                        FillRect(dc,&rect[x][y],(HBRUSH)GetStockObject(WHITE_BRUSH));
                        AfxMessageBox("bingo");
                }

jamen så er jeg helt blank på icon området igen,  øv. Nå men så skal der knokles virdre på det også.....jeg vender tilbage når jeg har læst noget mere på lektien.
Avatar billede bertelbrander Novice
13. maj 2003 - 00:07 #10
1: m_st1 kan ikke være et billede, man kan ikke kalde GetWindowRect() for et billede, det kan man kun gøre for et vindue. Jeg kan ikke se nogen rectStaticClient i koden. Du henter rect'et for m_st1 (hvad er det?), og læser det ind i rectlayer.
2: Nej, nRects er ikke 36, det er 6 (6*6 = 36). Hvad har 60 minutter at gøre med billed størelsen?
3:Ikonets midtpunkt kan findes som:
CRect IconRect;
::GetWindowRect((HWND )m_hIconposition, &IconRect);
POINT IconMidtPunkt;
IconMidtPunkt.x = (IconRect.left + IconRect.Right)/2;
IconMidtPunkt.y = (IconRect.top + IconRect.bottom)/2;

::ScreenToClient(m_hWnd, &IconMidtPunkt);
Dette punkt kan så bruges i din test (if(rect[x][y].PtInRect(IconMidtPunkt))
Hvordan er Icon'et iøvrigt konstrueret?
4: Nej når du er i loopen er CRect r ikke icon'ets rect, rectlayer er ikke m_st1's rect, det er icon'ets rect.

Det ville være en hjælp hvis du kunne oplyse icon'ets rect, m_st1's rect hvad rect[x][y] bliver i loopen (nogle få værdier) samt hvad du udregner icon'ets midtpunkt til at være.
Avatar billede baltazar_ Nybegynder
13. maj 2003 - 01:00 #11
1)
sorry  m_st1 er den variabel billedet holdes i når det er loaded ind( et frame )
den behandles således af "HBitmap"

    CString    file;
    file.Empty();
    m_com.ShowOpen();
    file=m_com.GetFileName();
    file.TrimRight();

    if(m_hBmpNew != NULL )
        DeleteObject(m_hBmpNew);
    sourcex=sourcey=0;//
    if(file.IsEmpty())
AfxMessageBox("Vælg billede...");
        else{
            if(file.Right(3)!="bmp")
                AfxMessageBox("Vælg et Bitmap billede...");
            else
            {
    m_hBmpNew =    (HBITMAP) LoadImage(
    AfxGetInstanceHandle(),  // handle to instance
    file,  // name or identifier of the image (root is where project is)
    IMAGE_BITMAP,        // image types
    0,    // desired width
    0,    // desired height
    LR_LOADFROMFILE);
    if( m_hBmpNew == NULL ){
    AfxMessageBox("Load of waypoints Failed");}
   
  // put the HBITMAP info into the CBitmap (but not the bitmap itself)
  else{
    m_st1.GetClientRect( &rectStaticClient );
    rectStaticClient.NormalizeRect();
    m_size.cx=rectStaticClient.Size().cx;
    m_size.cy=rectStaticClient.Size().cy;
    m_size.cx = rectStaticClient.Width();    // zero based
    m_size.cy = rectStaticClient.Height();    // zero based

   
    m_st1.ClientToScreen( &rectStaticClient );
    ScreenToClient( &rectStaticClient);
       
    m_pt.x = rectStaticClient.left;
    m_pt.y = rectStaticClient.top;
  GetObject( m_hBmpNew , sizeof(BITMAP), &m_bmInfo );
VERIFY(m_hBmpOld = (HBITMAP)SelectObject(m_dcMem, m_hBmpNew )  );

  offsetx= m_pt.x;
  offsety=m_pt.y;
 
m_vbar.MoveWindow(offsetx+m_size.cx,offsety,18,m_size.cy);
m_hbar.MoveWindow(offsetx,offsety+m_size.cy,m_size.cx,18);
horz.cbSize = sizeof(SCROLLINFO);
horz.fMask = SIF_ALL;
horz.nMin = 0;
horz.nMax = m_bmInfo.bmWidth-m_size.cx;
horz.nPage =0;
horz.nPos = 0;
horz.nTrackPos=0;
if(m_bmInfo.bmWidth<=m_size.cx)
{
    if((m_size.cx-m_bmInfo.bmWidth)==0)
        offsetx= m_pt.x;
    else
        offsetx= m_pt.x+((m_size.cx-m_bmInfo.bmWidth)/2);
    m_vbar.MoveWindow(offsetx+m_bmInfo.bmWidth,offsety,18,m_size.cy);
    m_hbar.ShowWindow(false);
}
else
m_hbar.ShowWindow(true);
m_hbar.SetScrollInfo(&horz);
vert.cbSize = sizeof(SCROLLINFO);
vert.fMask = SIF_ALL;
vert.nMin = 0;
vert.nMax = m_bmInfo.bmHeight-(m_size.cy);
vert.nPage = 0;
vert.nTrackPos=0;
if(m_bmInfo.bmHeight<=m_size.cy)
{
    if((m_size.cy-m_bmInfo.bmHeight)==0)
        offsety= m_pt.y;
    else
        offsety= m_pt.y+((m_size.cy-m_bmInfo.bmHeight)/2);
    m_hbar.MoveWindow(offsetx,offsety+m_bmInfo.bmHeight,m_size.cx,18);
    m_vbar.ShowWindow(false);
}
else
m_vbar.ShowWindow(true);
m_vbar.SetScrollInfo(&vert);

  InvalidateRect(&rectStaticClient);
        }
            }
        }


2) jeg har godt nok ikke regnet det efter før nu, og jeg kan da godt se at 404/60 ikke er 36, men det er det antal rects Rect[][] laver i alt (som er en fejl ) og det er jo selvfølgelig fordi den runder op ( 404/60 er 6.7 ) så den laver så 6*6 felter ( derfor sagde jeg 36 da det var hvad jeg umiddelbart havde takt nig frem til og ikke tænkte nærmære over )
, men det var meningen den skulle dele HELE billedet op i disse rect[x][y] og ikke kun clint området ( m_st1 ) ( jeg har en Hscrool/Vscroll på billedet ) så det er ikke alt der er synligt.
60 minutter er hvad hvert enkelt rect[][] står for, programmet skal visualisere hændelser ( forestil dig billedet er papiret i en plotter på en måde og nålen bevæger sig op og ned i et bestemt interval,  svært at forklare på skrift uden at skrive en hel stil :O)  )
Avatar billede baltazar_ Nybegynder
13. maj 2003 - 01:01 #12
en hurtig indskydelse  :  tror det det her nogle betydning at jeg igen deller rect[][] ind i endnu mindre rects senere ned i OnMOuseMove funktionen  ?
Avatar billede baltazar_ Nybegynder
13. maj 2003 - 01:11 #13
her er hele min OnMouseMove: 

void CScrollBitmapDlg::OnMouseMove(UINT nFlags, CPoint point)
  {



   
//** MUS I VINDUE POSITION **



if (m_state=0)
{


// intet dokument hemtet


}

if (m_state=1)
{
CClientDC dc(this);
       
int rectidx;
int devidensmallWidth = 30    ;  // angiver antal felter på x axis
int devidensmallHeight = 30    ;  // angiver antal felter på y axis
CString strPosition;
int idx=0;
int idy =0;







const int nRects = 404/60;
const int nsmallRects = 60/2;

    m_st1.GetWindowRect(&rectStaticClient);



    CRect rect[nRects][nRects];
    CRect smallrect[nsmallRects][nsmallRects];

    ScreenToClient(rectStaticClient);


 
    CRect IconRect;
::GetWindowRect((HWND )m_hIconposition, &IconRect);
POINT IconMidtPunkt;
IconMidtPunkt.x = (IconRect.left + IconRect.right)/2;
IconMidtPunkt.y = (IconRect.top + IconRect.bottom)/2;
CPoint memx =IconMidtPunkt.x;
CPoint memy = IconMidtPunkt.y;

::ScreenToClient(m_hWnd, &IconMidtPunkt);

   
   

   

           
int nWidth = rectlayer.Width();  // Width to be divided amongst rects
int nHeight = rectlayer.Height(); // Height to be divided amongst rects




for(int y=0; y<nRects; ++y)
{
   


    idy = idy+1;


    for(int x=0; x<nRects; ++x)
    {
       
        idx = idx+1;
        rect[x][y].SetRect(x*(nWidth/nRects)+rectlayer.left, y*(nHeight/nRects)+rectlayer.top, (x+1)*(nWidth/nRects)+rectlayer.left-1, (y+1)*(nHeight/nRects)+rectlayer.top-1);
       
// find nu ud af om icon er inden for rect[][]

    if(rect[x][y].PtInRect(IconMidtPunkt))
                {
                        // finder ud af om iconet er inden for rect[x][y].
                        FillRect(dc,&rect[x][y],(HBRUSH)GetStockObject(BLACK_BRUSH));
                        AfxMessageBox("Icon fundet");
                }

 
                if(rect[x][y].PtInRect(point))

                {
                //    FillRect(dc,&rect[2][2],(HBRUSH)GetStockObject(WHITE_BRUSH));
               
                // hvis pointer inde i rect[x][y]
           
       
                for(int sy=0; sy<devidensmallHeight; ++sy)
                {
                int sy2=(devidensmallHeight-sy-1)*2;

                for(int sx=0; sx<devidensmallWidth; ++sx)
                { 


                smallrect[sx][sy].SetRect(sx*(rect[x][y].Width()/nsmallRects)+rect[x][y].left, sy*(rect[x][y].Height()/nsmallRects)+rect[x][y].top, (sx+1)*(rect[x][y].Width()/nsmallRects)+rect[x][y].left-1, (sy+1)*(rect[x][y].Height()/nsmallRects)+rect[x][y].top-1);
                FrameRect(dc,&smallrect[sx][sy],(HBRUSH)GetStockObject(BLACK_BRUSH));

       
                if(smallrect[sx][sy].PtInRect(point))
                { 
       
   

           
                }
                //sx
                }
                //sy
       
                }
                //HERFRA
                rectidx = idx;
   
                SetDlgItemInt(IDC_area,rectidx);
                SetDlgItemInt(IDC_RECTX,x);
                SetDlgItemInt(IDC_RECTY,y);
                //    validateRect(&rectStaticClient);
                //    invalidate(&rectStaticClient);
                //hertil
       
                //herfra
               
                // hertil


                }


                //AfxMessageBox( "shit" );
                }

   
                }


                if(rectlayer.PtInRect(point))

                {
                strPosition.Format("x=%d, y=%d", point.x, point.y);
                //    m_iTemp_timer_X = rectlayer.left-point.x; // shows mouse x cordinate in text box
   
                //    m_iTemp_timer_Y = rectlayer.top-point.y; // Shows mouse y cordinate in text box
   
                SetDlgItemInt(IDC_STATIC_sourcex_value,sourcex);
                SetDlgItemInt(IDC_STATIC_sourcey_value,sourcey);
           

 
                }   
                else
                strPosition = "";
                SetDlgItemText(IDC_STATIC_strposition,strPosition);


 
      ///////////////////////
      // MY CODE STARTS HERE
    ///////////////////////

// Check to see if the left mouse button is down
    if ((nFlags & MK_LBUTTON) == MK_LBUTTON)
    {
              // Set the current point as the starting point
 
SetDlgItemText(IDC_STATIC_strposition,strPosition);

      // Get the Device Context
       
 
  if(rectlayer.PtInRect(point))
  { 
      CRect rect;

  rect.NormalizeRect();
  ScreenToClient(rect);
 
        if (m_iPrevX == m_iPrevX)
        {  CClientDC dc(this);
 
   
   
        };
  // Draw a line from the previous point to the current point
       
  //      dc.LineTo(point.x, point.y);
       
        // Save the current point as the previous point
        m_iPrevX = point.x;
        m_iPrevY = point.y;
       
    }

    }

m_pointx = 465;
m_pointy = 355;
m_diff = 15;
      if ((point.x >= (m_pointx-m_diff))&&(point.x <= (m_pointx+m_diff))&&(point.y >= (m_pointy-m_diff))&&(point.y <= (m_pointy+m_diff)))
{

// todo
          SetDlgItemText(IDC_waypoint_info,"Charlotteager");
}

else
{
    SetDlgItemText(IDC_waypoint_info,"*********");
};
    ///////////////////////
    // MY CODE ENDS HERE
    ///////////////////////
//** SLUT MUS I VINDUES
//slut m_state
}
//slut m_state   

CDialog::OnMouseMove(nFlags, point);
}
Avatar billede baltazar_ Nybegynder
13. maj 2003 - 01:16 #14
icon er lavet således
dc.DrawIcon(offsetx-16+tempdatax-sourcex, offsety-16+tempdatay-sourcey, m_hIconposition);    // tegner icon
det er et 32*32
Avatar billede baltazar_ Nybegynder
13. maj 2003 - 01:17 #15
og det hentes således
    m_hIconposition = AfxGetApp()->LoadIcon(IDI_ICON24);  i OnPaint
Avatar billede bertelbrander Novice
13. maj 2003 - 20:09 #16
Jeg er ked at at sige det, men jeg synes at jeg har været tålmodig: Jeg tror ikke det her fører nogen steder hen. Lad mig foreslå dig at:
1. Læse en grundbog i C
2. Læse et par grundbøger i C++
3. Tage et grundkursus i C/C++
4. Læse et par grundbøger om windows programmering
5. Tage et kursus i windows programmering.
6. Lære at bruge en debugger, dvs. lære at sætte breakpoints, single steppe, indspicere variable osv.

Så ville du måske lære at:
1: Der er forskel på at skrive:
if (m_state=0)
og
if (m_state==0)
2: m_hIconposition er ikke et vindue, det giver ingen mening at forsøge at kalde GetWindowRect() på noget der ikke er et vindue.
Avatar billede baltazar_ Nybegynder
13. maj 2003 - 20:25 #17
helt i orden bertel..
Jeg er glad for den hjælp du har givet mig indtil nu, det har været inspirerende og givet stuff til eftertanke.

1)
jeg er klar over forskellen på ==  og  =, og det er ganske rigtigt også en fejl jeg har skrevet =. Det er nok sket iforbindelse med en replace action. Jeg har bare ikke kigget næremere på det da jeg jo havde lavet den del korrekt en gang og nok fokuseret mere på den nye udfordring med rect`s

2)
m_hIconposition  er ganske rigtigt ikke et vindue, men det menet jeg heller ikke jeg har sagt.


anyway,  alt i alt synes jeg det går ganske godt fremad, jeg startede på c++ for cirka 4 mdr. siden i mine sparsomme aften timer.

jeg vil selvfølge følge dine råd og fortsætte med at lære, men kurser bliver det ikke til da det som sagt kun er en hobby.


tak for støtten, jeg håber ikke du er blevet gråhåret på grund af mig  hehe  ;)
Avatar billede segmose Nybegynder
14. maj 2003 - 08:43 #18
Som tilføjelse til Bertel's så stol på din compiler, læs dens advarsler, fx. kan den advare imod både imod potentielle fejl og uhensigtsmæssigheder:
brug af identifier før initialisering (unitialiserede variable).
udtrykket kunne misforstås (fx. enkelt = i if).
struct overført som værdi (passed by value).
variable ikke brugt.

ps.
God vane ved 'if' er at sætte konstant værdien forrest så du omgående får tæsk for at lave if (noget = 1) lav istedet altid if (1 = noget) så får du altid at vide at det går ikke.
Og lad være med at brug tal til at beskrive tilstande istedet for "if (m_state==0)" brug "if (mNoDocument == m_state)" hvor mNoDocument så kan være en enum, const eller define hvad der du er mest passende, jeg bruger for det meste enum da den hjælper med at gøre tilstandene unikke.
Avatar billede segmose Nybegynder
14. maj 2003 - 08:49 #19
glemte lige en pps.
Hvis du bruger define så sæt "altid" parantes rundt om værdien, fx.

#define NOGET (-1)
#define ADD (3-NOGET)

så undgår du nogle aha oplevelse med dobbelt minus og operator orden.
Avatar billede bertelbrander Novice
14. maj 2003 - 23:49 #20
>seqmose. Jeg vil naturligvis tilslutte mig din anbefaling af at studere alle warnings fra compileren (og enable så mange som muligt).
Jeg synes personligt at det er svært at læse "if (7 == x)" og endnu mere varianten "if (7 > x)". Og da moderne kompilere giver dig en warning hvis du kommer til at skrive "if (x = 9)", foretrækker jeg at skrive "if (x == 9)".
I koden ovenfor ville jeg have skrevet "if (!state)" og "if (state)" da state (så vidt jeg kan se) kun kan have to værdierne 0 og 1.
Avatar billede segmose Nybegynder
15. maj 2003 - 08:37 #21
Hvis man skrev

if (7 == x)

skulle man istedet skrive

if (HalvVejs == x)

ville det nok være mere læseligt, specielt hvis constanten siger hvad det er vi tester på.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester